[
  {
    "path": ".gitignore",
    "content": "# ignore all files generated by configure and make\nautom4te.cache\nconfig.cache\nconfig.h\nconfig.log\nconfig.status\nMakefile\n*.la\n*.lo\n*.o\n*.so.*\n*.a\n.libs/\nsrc/defaults.h\nsrc/getdate.c\nsrc/defaults.h\nsrc/getdate.c\nsrc/hypermail\nsrc/lang\nsrc/mail\n\n# PCRE (if using the bundled lib)\nsrc/pcre/.deps\nsrc/pcre/.deps/\nsrc/pcre/autom4te.cache/\nsrc/pcre/libpcre.pc\nsrc/pcre/libpcre16.pc\nsrc/pcre/libpcre32.pc\nsrc/pcre/libpcrecpp.pc\nsrc/pcre/libpcreposix.pc\nsrc/pcre/pcre_chartables.c\nsrc/pcre/pcre_scanner_unittest\nsrc/pcre/pcre_stringpiece.h\nsrc/pcre/pcre_stringpiece_unittest\nsrc/pcre/pcrecpp_unittest\nsrc/pcre/pcrecpparg.h\nsrc/pcre/stamp-h1\nsrc/pcre/pcre.h\nsrc/pcre/pcre-config\nsrc/pcre/dftables\nsrc/pcre/libtool\nsrc/pcre/pcregrep\nsrc/pcre/pcretest\n\n# other files created when compiling\narchive/msg2archive\narchive/rdmsg\ntests/testhm\ntests/testdir\ntests/testmail\n\n# vi or emacs edited ones\n.*~\n\\#.*\n\n# swap files\n.swp\n\n"
  },
  {
    "path": "COPYING",
    "content": "\n\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                          675 Mass Ave, Cambridge, MA 02139, USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\tAppendix: How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) 19yy  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) 19yy name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n"
  },
  {
    "path": "Changelog",
    "content": "Version Changes for Hypermail\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n============================\nHYPERMAIL VERSION 2.4.1:\n============================\n\n2022-11-04 Jose Kahan\n\t* src/Makefile.in\n\tSome C linkers require libraries to be declared after functions in that\n\tlibrary are called, and not before. This was notably with -lm and\n\t-ltrio, where -lm had to be declared after -ltrio.\n        (closes # 84)\n\n2021-11-17 David Hughes\n\t* docs/hmrc.html src/parse.c\n\tAdded support for strftime (3) formatting in the append_filename configuration\n\toption to allow for archived messages to be split over multiple directories\n\t(monthly or yearly for example)\n\n2021-06-04 Baptiste Daroussin\n\t* src/uudecode.c src/parse.c\n\tFixes for memory issues detected by libasan\n\n2020-06-19 Jose Kahan\n\t* src/domains.c\n\tvalid_root_domains() was validating a domain name against the\n\thistorical DNS domains such as .org, .com. DNS has evolved and allows a\n\tbigger variety of domains than those this function verified. That part\n\tof the function has been invalidated and will be either eventually\n\tremoved or evolve to a user-configurable option.\n\n2020-06-12 Jose Kahan\n\t* configure.ac\n\tconfigure didn't signal an error if yacc was not installed\n\n\t* src/string.c\n\tparseurl(): URLs were not detected and converted when they were\n\tpreceeded by a : that was not attached to a valid URL like\n\tfoo: https://example.com or : https://example.com\n\n2020-02-23 @cacsar\n\t* Makefile.in\n\tmake install wasn't working\n\n============================\nHYPERMAIL VERSION 2.4.0:\n============================\n\n2019-12-20 Jose Kahan\n\t* src/getdate.y\n\tA message's sent or received date with a specified TZ but without any\n\tseconds value was using the local date seconds value instead of 00.\n\n2019-12-19 Jose Kahan\n\t* src/parse.c\n\tparsemail(): a Content-Transfer-Encoding header with a missing value\n\twould result in an unitialized variable being used to output an unknown\n\tencoding warning message. Hypermail now skips this header if it's empty.\n\n2019-11-22 Jose Kahan\n\t* src/print.c\n\tprintsubject() / printdates(): the \"by suject\" and \"by dates\" views\n\twere not escaping markup present in mail's Suject and From headers.\n\n2019-11-19 Jose Kahan\n\t* src/pcre\n\tUpgraded to upstream version 8.43. This fixes some autoconf issues we\n\thad on newer debian releases. This is only relevant for people that\n\tare not linking against a system libpcre.\n\n\t* tests/diff_hypermail_archives.pl\n\tRewrote diff_hypermail.pl to make it more flexible and powerful for\n\tfinding the differences in two hypermail archives.\n\n2018-12-07 Jose Kahan\n\t* If the antispamdomain config option was used, hypermail was replacing\n\teverything following a \"@\" character by the antispam domain.  This fix\n\tmakes antispamdomain only apply for the domain part of valid email\n\taddresses.\n\n2018-11-29 Bill Shannon\n\t* string.c\n\tspamify_replacedomain(): fix another greedy \"@\" replacement in the\n\tmiddle of a string of iso-2022-jp encoded Japanese characters.\n\n2018-11-04 Bill Shannon\n\t* string.c\n\ti18n_convstring(): When converting a utf-8 string to iso-2022-jp,\n\thypermail always adds the \"return to ASCII\" escape sequence, even if\n\tthe string ends with ASCII.\n\n\tparseemail(): hypermail attempts to transform anything that looks like\n\tan email address by replacing the at sign (and optionally the domain\n\tname) with a string (default \"at\") to confuse screen-scraping\n\tprograms. But if there's an \"@\" character in the middle of a string of\n\tiso-2022-jp encoded Japanese characters, hypermail still converts it,\n\tbreaking the Japanese character.\n\n2018-10-12 Jose Kahan\n\t* setup.c PreConfig(): removed a 64-bit warning\n\n\t* hypermail.c\n\tmain(): if the en_US locale is not available, try en_US.UTF-8\n\n2018-10-11 Jose Kahan\n\n\t* string.c\n\tparseemail(): for some reason if a ',' char was concatenaned to an\n\temail address, it was being parsed as part of the email username.\n\n2018-10-10 Jose Kahan\n\n\t* string.c\n\tparseurl(): remove deprecated URLs. Improve support for URLs that don't\n\thave slashes following the 'protocol:' schema. Improve support for tel:\n\tURLs.\n\n2018-10-09 Bill Shannon\n\n\t* string.c\n\tparseurl(): non-URL text can be misinterpreted as a URL, causing segfault\n\tFixes issue #39\n\n2018-10-08 Jose Kahan\n\n\t* print.c, string.c, proto.h\n\tThe inreplyto_command could generate invalid links if the parser interpolated the\n\tin-reply-to from the subject. If a message's in-reply-to is interpolated,\n\thypermail won't honor it anymore for that message.\n\n2018-10-07 Jose Kahan\n\n\t* print.c printauthors(), printthreads(), printsubjects, printdates()\n\tEven if set_i18n was enabled, Indexes were written with mixed charsets\n\tinstead of using utf-8 throughout.\n\n\t* configure.ac, Makefile.in, src/Makefile.in\n\tIf the system has a recent libpcre, compile against it instead of using\n\tthe bundled one. This check is done by default when launching configure.\n\n\tNew configure options to allow to link against an external pcre library\n\t(--with-external-pcre) or to force the build and link against the\n\tbundled one (--enable-bundled-pcre).\n\n\tNew configure option to allow to compile against a system libtrio\n\t(--enable-system-libtrio). Contrary to libpcre, it's not possible to find the\n\tversion of libtrio so we cannot compile automatically against it.\n\n2018-10-04 Jose Kahan\n\n\t* src/pcre\n\tUpgraded to upstream version 8.42\n\n\t* src/trio\n\tUpgraded to upstream version 1.16\n\n\t* parse.c\n\tOnly use the headers charset for text/plain if its absent. If no charset\n\tis available in the other parts, do not add it.\n\n2018-10-04 Jose Kahan\n\n\t* Updated Changelog format for entries newer than version 2.3.0\n\n\t* hypermail.h, parse.c, struct.c, struct.h\n\tCharset handling for multipart messages was being handled wrong, giving\n\tpriority to the headers charset (if found) over that of the displayed body.\n\tSometimes the last found charset was the one being used throughout in the\n\tgenerated body.\n\n\tThe metafile for attachments was sometimes inheriting the charset of the whole\n\tbody, even when not necessary or wrong. Now the meta doesn't include a charset\n\tif the attachment doesn't explicitly give one.\n\n\t* parse.c\n\tReferences header was processed multiple times as it was not being marked as parsed\n\tafter being processed.\n\tThe epilogue of MIME parts was not being ignored.\n\n2018-06-19 Jose Kahan\n\n\t* Changed mispelled configuration option warn_surpressions to the\n\tcorrect spelling warn_suppressions.\n\n2018-06-14 Jose Kahan\n\n\t* Hypermail would segfault or have an incorrect thread view if it was\n\thandling an archive with a message (msg1) that was a reply to a message\n\tnot in the archive, if msg1 had a reply to it in the archive (msg2),\n\tmsg2 was archived before msg1 and both msg1 and msg2 shared the same\n\tsubject (regardless of Re: prefixes).\n\n2018-06-07 Bill Shannon\n\n\t* Add charset alias for Thai and Chinese\n\n\t* The markup for access key \"j\" to jump to the start of a message was\n\tonly being added when the showhtml configuration option was disabled\n\n\t* Setting the describe_folder configuration option has no effect on the\n\tdisplay of the folder index page\n\n\t* In some cases hypermail failed to null terminate the charset name\n\twhen copying it, resulting in bogus charset names\n\n\t* Hypermail would segfault if given the bogus From line \"From:\n\t<a@b.com\"\n\n\t* In some cases, when no new message was added to the archive, would\n\tsegfault because of a null pointer\n\n2015-04-03 Ivan Kuraj\n\n\t* Correct includes for new glibc\n\n2013-06-10 Jose Kahan\n\n\t* Even if a message was annotated as spam/deleted, its Attachments were\n\tstill being created\n\n2013-04-18 Jose Kahan\n\n\t* Removed commented out code in printfile.c.\n\n\t* Added missing ';' in generated css rules in the same file\n\n2013-04-11 Jose Kahan\n\n\t* Extended the configure options so that a user can decide if hypermail\n\tshould be compiled and statically linked against the bundled pcre lib\n\tor if it should be dynamically linked with an external (or system) pcre\n\tlibrary (if available).\n\n\t* The new configure option is --with-external-pcre[=dir].\n\n\t* The default value for dir is /usr and the include and libraries\n\tdirectories will be searched from that starting path. This option is\n\tdisabled by default.\n\n\t* The make clean in libfnv wasn't removing the libfnv.a file\n\n2013-03-29 Jose Kahan\n\n\t* Updated configure to latest autoconf syntax conventions.\n\n\t* Renamed configure.in to configure.ac and cleaned it up partially.\n\n2013-03-20 Jose Kahan\n\n\t* Updated pcre to pcre-8.32 from pcre-4.3. This may have broken the\n\tWindows lcc compilation but I don't have the means to verify it.\n\n2013-03-15 Jose Kahan\n\n\t* Updated trio code to trio version 1.14. Moved all the trio code to\n\tsrc/trio. Now compiling trio as a static library and linking against\n\tit, which makes binary a bit smaller. See src/trio/README.hypermail for\n\tdetails.\n\n2013-03-12 Jose Kahan\n\n\t* New experimental support for RFC 3676 format=flowed. There are two\n\tnew related configuration options: format_flowed to enable it and\n\tformat_flowed_disable_quotes to disable it in specific cases.  See the\n\tdocumentation and the RFC for further info.\n\n2013-03-08 Jose Kahan\n\n\t* Error: string.c:parseurl() assumes that all URL motifs it can match\n\tend with a :// string. However, the URL match table it uses included\n\tsome URL motifs that didn't have that string. These have been commented\n\tas they may cause parseulr to SIGSEVs in some cases.\n\n2013-02-26 Jose Kahan\n\n\t* New configuration option, noindex_onindexes, for associating a\n\t\"noindex\" robot metadata value with hypermail generated indexes.\n\n2013-02-26 Jose Kahan\n\n\t* New configuration option, userobotmeta, for Associatating robot\n\tannotations with attachments, using the experimental X-Robots-Tag HTTP\n\theader\n\n\t* If a message is marked as \"deleted\" and we're not keeping the\n\tcontent, substitute the value of the From: and Subject: headers with\n\t\"deleted\".\n\n\t* Make sure the delete stubs are added only when the delete_level\n\toption says we're not to preserve the original message body.\n\n2013-01-30 Jose Kahan\n\n\t* Migrated source code repository from cvs.hypermail.org to\n\thttp://sourceforge.net/projects/hypermail/\n\n\t* Added a mirror of the repository to github:\n\thttp://github.com/hypermail-project/hypermail\n\n\t* Cleared up the markup errors in docs/hmrc.html by using tidy.\n\n\t* New configuration directive \"annotated\" which allows a mailing list\n\tarchive editor to annotate a given message before converting it into\n\tHTML. Associated additional new directives are\n\t\"htmlmessage_deleted_spam\", \"htmlmessage_deleted_other\",\n\t\"htmlmessage_edited\". Consult docs/hmrc.html for more info.\n\n\t* \"htmlmessage_deleted\" is deprecated in favor of\n\t\"htmlmessage_deleted_spam\"\n\n\t* \"deleted\" is superseded by \"annotated\", although it will be supported\n\tto take into account legacy archives.\n\n\t* Regenerated the dependencies for the src/Makefile.in file.\n\n============================\nHYPERMAIL VERSION 2.3.0:\n============================\n\n Jose Kahan (Oct 27, 2009)\n  Added two new accesskeys in messages: 't' ->  next message\n   in thread, 'd' -> next message\n\n Jose Kahan (Oct 26, 2009)\n  Updated hmrc.4 and hmrc.html to describe the new features.\n\n Jose Kahan (Oct 23, 2009)\n  Various fixes / enhancements developed at W3C by Fumihiro Kato,\n   Daigo Matsubara and myself:\n  - Markup changes for deleted messages that are kept.\n  - New directive: htmlmessage_deleted for setting a custom HTML\n    message for the body of deleted messages.\n  - New directive: delete_incremental to disable deleting of existing\n    messages in the archive when doing an incremental add of a new\n    message. In some setups, if this feature is enabled, replies to\n    deleted messages will cause uncontrolled markup escape and\n    expansion. Feature is enabled by default.\n  - Updated list of known protocol uris that hypermail will convert\n    into links.\n  - Bug fix: setup.c:MakeConfig() CFG_SWITCH was using long instead of\n    int.\n  - New directive: fragment_prefix for customizing the prefix that is\n    put before each URI fragment in a message. Default value is \"msg\",\n    the previous hard-coded value.\n  - New directive: email_address_obfuscation foro enablingemail\n    address obfuscation using numeric character reference.\n  - New directive: inline_addlink to add in-line links to content that\n    is stored in the attachments subdirectory. 'inline_types\" must\n    also be enabled.\n  - New directive: inreplyto_command, gives a URI template to a script\n    that hypermail will link to if it's unable to find a corresponding\n    Message-Id in the archive's messages.\n\n Peter McCluskey (May 13, 2008)\n  Change from Fumihiro Kato to fix bug that sometimes caused a charset\n   problem when Content-Type is us-ascii but message headers\n   include other encoded text like utf-8.\n\n Peter McCluskey (Nov 14, 2007)\n  Applied xhtml patch from Zvi Har'El.\n\n Peter McCluskey (Oct 1, 2007)\n  Changes from Fumihiro Kato to fix bugs on 64 bit systems and some\n   possible buffer overflow problems.\n  Change in rules about whether to escape urls; it now seems to escape them\n   when found in the middle of the line the same way it has been doing when\n   they are at the start of a line.\n\n Peter McCluskey (Feb 16, 2007)\n  Changes from Rick van der Zwet:\n   cosmetic = tweaking the interface a small bit (right align, the message \n   numbers, years in the date listing\n   spamify-domain = obfuscate the body of the message as well (will also \n   obfuscate 'ssh rick@foo.bar' this of course), moved the domain obfuscate \n   yes/no to the general to make the function more portable\n Changes from Mike Fabian changing int to size_t.\n\n Peter McCluskey (Mar 27, 2006)\n  Add rel=\"nofollow\" to text message URLs (option txtsuffix = 1).\n\n Peter McCluskey (Mar 14, 2006)\n  Fixed a core dump with linkquotes = 1 caused by Daigo's changes.\n\n Peter McCluskey (Sep 30, 2005)\n  Fixed missing links at top when show_index_links is 1 or 3.\n\n Peter McCluskey (Aug 4, 2005)\n  Fixed double counting of messages deleted with the delete_msgnum option,\n  which sometimes caused top level index page to show wrong number of\n  messages and not link to a folder.\n\n Peter McCluskey (Jul 29, 2005)\n  Changed to sort on sender date rather than from date when displaying\n  sender date as a result of use_sender_date = 1.\n\n Peter McCluskey (Jun 23, 2005)\n  Some small changes from Vincent McIntyre to make date-range in index of\n  folders link to default index page, to use CSS instead of <th> to\n  distinguish that column, and some whitespace changes.\n  Added explanation of how to handle strcasestr prototype error to INSTALL.\n\n Peter McCluskey (Mar 19, 2005)\n  Fixes to files_by_thread option submitted by Oliver Meili.\n\n Peter McCluskey (Dec 2, 2004)\n  Patch from Ulf Hrnhammar to fix two format string bugs in Hypermail.\n  They could have caused crashes if using incremental mode on edited\n  pre-existing archives with data like \"%n%n%n%n%n%n%n%n\" in certain lines.\n\n Peter McCluskey (Nov 28, 2004)\n  Add filename_base option.\n\n Peter McCluskey (Sep 29, 2004)\n  Add support for JAVT timezone.\n  Add mailbox_date_trimmer to contrib, faq.\n\n Peter McCluskey (Jun 2, 2004)\n  Add language code substitution cookie patch from Shane Wegner.\n\n============================\nHYPERMAIL VERSION 2.2.0:\n============================\n Peter McCluskey (May 25, 2004)\n  Changed some of the addresses to hypermail-project.org.\n  Made the \"We delete ... \" message print only if progress != 0.\n\n Peter McCluskey (Mar 23, 2004)\n   Changes to speed up incremental update when there are deleted files if\n  using usegdbm (it's still slow if usegdbm = 0).\n\n============================\nHYPERMAIL VERSION 2.1.9:\n============================\n Peter McCluskey (Feb 23, 2004)\n  Released version 2.1.9 tar file.\n\n Peter McCluskey (Feb 17, 2004)\n  Add use_sender_date option.\n  Fix instructions for doing \"make install\" so that the documentation will\n  be installed.\n\n Peter McCluskey (Feb 5, 2004)\n  Update much of the documentation.\n\n Peter McCluskey (Feb 4, 2004)\n  Change default in setup.c for spamprotect and spamprotect_id to On.\n\n Peter McCluskey (Feb 2, 2004)\n  Add set_report_new_file and set_report_new_folder options.\n\n Peter McCluskey (Jan 23, 2004)\n  Add in missing <a name=\"end\"> for index files.\n  Removed a misleading, nonportable timezone string from link titles in\n toplevel index pages.\n\n Peter McCluskey (Jan 9, 2004)\n  Change to make mbox_shortened option work a little better with\n discard_dup_msgids = 0.\n  Change folder_by_date option to use \"From \" date rather than \"Date: \"\n to decide which subdirectory to use. This makes it consistent with\n top level index page.\n\n Peter McCluskey (Dec 26, 2003)\n  Add increment = -1 mode to enable automatic determination of whether\n to update or append in most cases.\n\n Peter McCluskey (Dec 3, 2003)\n  Added a mbox_shortened option to handle mboxes that have had messages\n deleted from the start of the mbox.\n\n Peter McCluskey (Dec 1, 2003)\n  Fix mismatch in <ul>, </ul> in date.html with indextable = 0.\n\n Peter McCluskey (Nov 17, 2003)\n  Add a check for the problem with the starting message number that was\n partly fixed on Oct 1. Now old archives with a startmsgnum = 0 .hmrc but\n a first message of 0001.html in this case will be treated as if startmsgnum\n was 0.\n\n Peter McCluskey (Nov 15, 2003)\n  Add Portugese support from Hugo Cisneiros.\n\n Peter McCluskey (Oct 1, 2003)\n  Fix some problems with starting message number that caused bugs when\n  increment = 1, linkquotes = 1 and using folder_by_date.\n\n Peter McCluskey (Sep 11, 2003)\n  Fixes to make pcre work.\n\n Peter McCluskey (Sep 3, 2003)\n  Applied patches from Mike McDonald to use nowrap option in the author and\n date columns in the index tables and get rid of all of the 'width=100%'\n options to the tables.\n\n Peter McCluskey (Sep 3, 2003)\n  French language improvements from Olivier Kaloudoff.\n\n Peter McCluskey (Sep 1, 2003)\n  Applied patches from Mike McDonald to make spamify_replacedomain use\n set_antispam_at, change printdates to include the dates in the table\n version of the bydate index, and make the table use the whole screen\n width instead of 80%. \n\n Jose Kahan (Aug  18, 2003)\n  - Changed to lowercase the suffixes added to the message indexes. That is,\n    from \"archive name By Date\" to \"archive name by date\" because the\n    upper case seemed out of style as we don't have any control on what\n    is the string used for the archive's name. Did this change only for\n    the English messages as I don't know if this convention works well for\n    other languages.\n\n Jose Kahan (Aug  18, 2003)\n  - Made the links to the different indexes show the index of the current entry.\n    This change originated from the feedback we got on the WAI enhanced archievs.\n    People find that this small changes increases the usability of the archive.\n\n Jose Kahan (Aug  18, 2003)\n  - The links to the first message (aka #first) were not working in the\n    by attachment, by author, and by subject indexes.\n\n Peter McCluskey (Aug 16, 2003)\n  - applied fix from Jean-Charles Meyrignac to handle 0x1A in mbox.\n\n Jose Kahan (Aug  14, 2003)\n  - After receiving more feedback, reverted the changes done for converting the\n    displayed value of the Date: header. The reason is that users like to know\n    when they send a message. This information was getting lost because we\n    were converting the date to the local time.\n  - Made the Received on date be  shown in converted local time.\n  - Added a new configuration option, indexdateformat, so that people can\n    specify a different format for indexes than the one used elsewhere. If this\n    variable is not defined., it'll use the dateformat by default.\n  - Made the index by date compare dates independently of the value of dateformat.\n\n Jose Kahan (Aug  13, 2003)\n  - Made the Received on footnote line use the same date format as that used for the\n    Date: header on top of the messages.\n\n Jose Kahan (Aug  18, 2003)\n  - Small WAI change to the list of indexes to show the entry corresponding to \n    the current index, but outside of a link. This comes from feedback, where \n    people said it was less distracting to see the same index to links all \n    the time.\n\n Jose Kahan (Aug  18, 2003)\n  - Add the <title> WAI enhancement that I had forgotten to do for messages.\n    The new format is: [subject] from [author] on [date] ([mailing list label]).\n    I also removed the 64 characters maximum limit check we had on the title.\n    The reason is that this is not part of the HTML specification, but rather\n    a writing style. Dominique says we shouldn't be so strict in this case. In\n    addition, just adding a \\0 after 64 characters could break entity names and\n    generate invalid HTML.\n\n Jose Kahan (Aug  13, 2003)\n  - The mailcommand option didn't work when applied to a paragraph that had\n    a previously converted href string that includes the '@' char. I added\n    a quick hack to ConvURlsString to avoid doing the mailto: convertion if an href\n    already exists in that line. The best solution would be to do something \n    similar to ConvURLsWithHrefs.\n    Also fixed a memory leak.\n\n Peter McCluskey (Aug 8, 2003)\n  - Applied haof fixes from Bernhard Reiter.\n\n Jose Kahan (Aug  4, 2003)\n  - As a side effect of PNK's use of an SGML entity for the @ char, the \n    mailcommand option stopped working on all the headers except for\n    the To: one.\n\n Jose Kahan (Aug  1, 2003)\n  - In order to guarantee the validity of XHTML documents, changed the\n    behavior of hypermail when including customized footers. Previously,\n    when using this option, the custom markup had to include the </body>\n    and </html> end tags. As we also need to include a </div> in some\n    cases for XHTML and it's much harder to guess when to add it, I\n    made hypermail always add those three end tags as needed, regardless\n    of whether the custom footer option is being used. \n\n Jose Kahan (Jul 30, 2003)\n  - After talking with Dom Hazel-Massieux, I added some extra WAI enhancements\n    to the list of indexes generated by hypermai. Specifically, the date\n    is shown in a verbose name in the title attribute of each entry and in \n    an abbreviated version in the markup that's being displayed.\n\n Jose Kahan (Jul 30, 2003)\n  - When rebuilding an archive, the attachment files were not being overwritten\n    correctly. . Fixed this by adding an O_TRUNC flag.\n\n Jose Kahan (Jul 29, 2003)\n  - Removed a memory leak in file.c as reported by insure.\n  - The ietf-mbox option didn't work on \"quoted printable\" encoded attachments.    \n\n Peter McCluskey (July 22, 2003)\n   Fix show_msg_links = 3 option (Jose's changes assumed it didn't exist).\n   Updates to German from Tobias Weber.\n\n Kent Landfield (Jul 14, 2003)\n   - When show_headers was used in print.c, the newline was not recognized\n     early enough in printheaders. A check was added to assure the newline \n     was recognized properly.\n\n Kent Landfield (Jul 10, 2003)\n  - Small typo in print.c corrected.\n       fprintf(fp, \"%s ^lt;<em>%s</em>&gt;\"...\n\n========================\nHYPERMAIL VERSION 2.1.8:\n========================\n\n Kent Landfield (Jun 28, 2003)\n  - Updated pcre library with pcre-4.3 sources. We were distributing a \n    much older version. We were distributing version was 3.3 from \n    August 1, 2000. \n  - Updated FILES with the lcc files and the pcre changes.\n  - Removed the deprecated \"show_hr\" from the tests/test.rc file.\n\n Jose Kahan (Jul 2, 2003)\n  - parseurl didn't work well when an URL was quoted and enclosed inside \n    tags. Such as:\n    <dd>some url</dd> </dd was put as part of the url.  \n\n Jose Kahan (Jul 1, 2003)\n  - Added WAI enhancements to the list of indexes generated by hypermail.\n    To make things perfect, we would need a new configuration option to give\n    the format of the date in the list of indexes format. I hard coded it\n    for the moment as I ran out of time to do it right now. As it has to\n    use an abbreviated date format to avoid having a too big list of indexes,\n    we can' t reuse the standard set_dateformat value.\n  - Removed warnings detected thru gcc Wall.\n\n Peter McCluskey (June 30, 2003)\n  - Increased max_tokens used to allocate space for linkquotes data struct.\n\n Jose Kahan (Jun 28, 2003)\n  - Code cleaning. Removed the deprecated code for set_showhr and\n    set_usetable options.\n\n Kent Landfield (Jun 28, 2003)\n  - Arkadiusz Miskiewicz <arekm@sse.pl> reported progerr() was being \n    called with NULL instead of the previously constructed error message. \n    His supplied patches were applied. \n\n Peter McCluskey (June 27, 2003)\n  - Made dates in subdirectory index files reflect subdirectory date range,\n    rather than the date range for the whole archive.\n\n Peter McCluskey (June 24, 2003)\n  - Fix print_index_header_links to print MSG_ENDING date correctly (had\n    been using 2 getdatestr() calls in one argument list).\n\n Peter McCluskey (June 20, 2003)\n  - Fix a core dump with empty Date:.\n\n Jose Kahan (Jun 10, 2003)\n  - Some extra WAI enhancements requested during the period of public comments:\n    Order the date index by dates, like in subjects, add <dfn> to the start and\n    end period in the indexes, change the title of \"jump to first message\" to\n    \"jump to list of messages\".\n  - The top respond link didn't take into account the msgid or subject. It was \n    just a plain mailto. Made it work as the bottom one.\n\n Jose Kahan (Jun 10, 2003)\n  - Adding new messages using the -u option to an existing file sometimes \n    resulted in warnings saying \"Message-ID is missing, ignoring message \n    with subject...\" Patch idea submitted by Peter.\n\n Jose Kahan (Jun 10, 2003)\n  - The incremental option (-u) always started new archives with 0001, rather\n    than 0000. It will now start with 0000 as before\n    For those people who had this problem and don't want to break any links to \n    their archives when rebuilding them, there's a new configuration option \n    allowing you to tell from which number you want to start your archive: \n    startmsgnum. You should only set it up once and not modify it for an \n    existing archive or your links may break.\n    A warning message appeared systematically because the showhr, which is \n    now deprecated, was turned on by default.\n\n Peter McCluskey (May 22, 2003)\n  - add Italian support from Gabriele Bartolini and Marco Nenciarini.\n\n Peter McCluskey (May 16, 2003)\n  - Fixed initialization of prior_subdir when dirs created out of\n    order. That fixes a case where a subdir wasn't in index files with\n    reverse_folders = 1.\n\n Jose Kahan (May 13, 2003)\n  - Add the WAI enhancements proposed in \n    http://www.w3.org/2002/03/archives-improvements/. \n    As a consequence of this change, the sethr and usetable configuration\n    options are deprecated. The new markup takes into account the changes\n    that those options proposed and offers them in a WAI friendly way.\n    Some code cleaning needs yet to be done to remove all the cases\n    where those rules were used. Previous code version is tagged as\n    \"before-wai\".\n    Fixed some invalid XHTML markup too.\n\n Peter McCluskey (May 12, 2003)\n  - fix txtsuffix to not crash on null pointer.\n  - fix discard_dup_msgids to work when showprogress = 0.\n\n Peter McCluskey (April 24, 2003)\n  - spam encoding from Peter Karlsson. Currently enabled via the\n    spamprotect option.\n\n Jose Kahan (Apr 23, 2003)\n  - As a consequence of the XHTML convertion, unconvchars() wasn't\n    storing information into the buffer when there were no entities.\n\n Jose Kahan (Apr 10, 2003)\n  - Converted hypermail to XHTML. The only remaining issue concerns\n    charsets. Some mail clients don't specify a correct charset or\n    specify a charset and include characters belonging to other\n    charset spaces. The solution to detect and convert the\n    foreign charset into a Unicode entity or, for the adventurous\n    hacker, convert hypermail's output to UTF-8. For the moment, only\n    the former is implemented partially;  there is only one a winlatin1\n    (Windows CP 1252) to Unicode convertion/detection being done.\n    See string.c:convchars, unconvwinlatin1, and uconvert.h for more \n    details.\n    The best solution will be to move to UTF-8, but this has to be planned.\n    If you have a charset issue, your XHTML document will be invalid.\n    As XHTML is backwards compatible with HTML, you can avoid this problem\n    by continuing to use the text/html MIME type.\n\n Peter McCluskey (April 3, 2003)\n  - Fixed so attachment.html doesn't list .meta directory.\n\n Kent Landfield (Mar 20, 2003)\n  - Added Splint (www.splint.org) support to src/Makefile.in\n  - Corrected Initializer block for ltable[12]. Had 2 fields, but struct\n    language_entry has 3 fields.\n  - Removed unused gp variable in update_deletions().\n  - modified print_main_header() to assure title meets HTML recommendations \n    of no longer than 64 characters. \n  - Updated docs/hypermail.rc\n\n Peter McCluskey (Mar 18, 2003)\n  - Fixed overwrite = 0 to avoid rewrite of many files involved in replies\n    with folder_by_date option.\n\n Peter McCluskey (Mar 14, 2003)\n  - Fixed two bugs with deleting messages with the incremental mode. One bug\n    meant that the message body was only rewritten or removed with the\n    delete_msgnum option, not delete_older / delete_newer. The other bug\n    involved only updating the is_deleted flag in the gdbm file if the\n    message body was redone to update a MSG_IN_REPLY_TO line.\n\n Kent Landfield (Mar 9, 2003)\n  - updated domains.h to accurately reflect the current set of root domains.\n\n Peter McCluskey (Mar 7, 2003)\n  - Fixed problem with reverse_folders option that caused the index file\n    to leave out folders when there were some unusual mismatches between the\n    2 dates in one message.\n\n Kent Landfield (Feb 28, 2003)\n  - changed wait.h sys/wait.h for portability in msg2archive\n  - removed unused variable in finelink.c\n\n Kent Landfield (Feb 20, 2003)\n  - corrected docs/Makefile.in to create the images dir if it does not exist.\n\n Kent Landfield (Feb 20, 2003)\n  - added wait.h to msg2archive that was needed for s_popen()\n  - removed unused variable in finelink.c\n\n========================\nHYPERMAIL VERSION 2.1.7:\n========================\n\n Peter McCluskey (Feb 20, 2003)\n  - Made version 2.1.7 tar file.\n\n Jose Kahan (jose@w3.org) (Feb 20, 2003)\n  - makemailcommand wasn't escaping non-ascii characters in the URLS\n    that it generated.\n\n Peter McCluskey (Feb 19, 2003)\n  - Fix to append option to handle some lines getting discarded in mdecodeQP.\n\n Kent Landfield (Feb 19, 2003)\n  - Updated TODO with configure issues and other corrections we want\n    to make to the code in the near future.\n\n Jose Kahan (jose@w3.org) (Feb 19, 2003)\n  - Upgraded extract_rfc2047_content() as the previous extracting\n    algorithm was broken.\n\n Kent Landfield (Feb 18, 2003)\n  - Added missing contrib utilities, contrib/msg2hypermailarchive.py\n    and contrib/runtest to FILES\n  - Added checking in struct.c to limit the length of Subject: line to \n    avoid theoretical Denial-of-Service\n  - Removed code that was ifdef'ed NOTUSED\n\n Peter McCluskey (Feb 17, 2003)\n  - Fix to attachment Content-Type parsing to strip all whitespace off\n    end of type rather than just newline.\n\n Kent Landfield (Feb 17, 2003)\n  - Added safe_tmpfile() usage instead of internal usage.\n\n Peter McCluskey (Feb 14, 2003)\n  - Disabled conversion of file:// into href - it seemed to allow anyone\n    who could access the web server via local host could read any file\n    that the web server had permission to read rather than just files\n    in the archive directory.\n\n Peter McCluskey (Feb 13, 2003)\n  - Add -DTRIO_MINIMAL. Solves a trio compile problem in SunOS and makes\n    binary a little smaller.\n  - Strip mail.c down to minimal warning message so we don't have to worry\n    about analyzing it's security problems.\n  - Changes to get strerror, memmove from pcre when missing (e.g. on SunOS).\n    How was this working on SunOS before?\n  - Fix faulty sizeof in snprintf for MSG_ENCODING_IS_NOT_SUPPORTED.\n\n Kent Landfield (kent@hypermail.org) (February 12, 2003)\n  - Converted msg2archive.c to use Thomas Biege's <thomas@suse.de>\n    s_popen() instead of popen().\n\n Kent Landfield (kent@hypermail.org) (February 11, 2003)\n  - Modified configure.in to test for snprintf. This is needed\n    since Solaris 2.5.1 does not have snprintf.  This only affects\n    the msg2archive and mbox2hypermail in the archive directory.\n\n Kent Landfield (kent@hypermail.org) (February 10, 2003)\n  - Modified configure to assure on Solaris that the ctype functions \n    were used instead of the macroes. New NO_MACRO define in config.h.\n  - Added most of the patches submitted by Thomas Biege <thomas@suse.de>\n  - Cleaned up compilation commenting out unused variables with NOT_USED.\n    Need to remove them and other unnecessary code soon.\n  - Various other minor compilation issues.\n  - Corrected prototype issue in print.c\n  - Added parameter checking to archive/*.c source\n\n Peter McCluskey (Feb 10, 2003)\n  - Fixed the append option to handle lines between end of headers through\n    mime boundary correctly.\n\n Jose Kahan (jose@w3.org) (February 06, 2003)\n  - Added a protection against the use of the nonsequential messaging option\n    when hypermail wasn't compiled with the libfnv.\n\n Kent Landfield (kent@hypermail.org) (February 06, 2003)\n  - Hypermail 2.1.6 runs on a DEC Alpha running TRU64 when compiled\n    with GCC 2.95. It does however require the -mieee flag be set for the\n    trionan.c sources.  \n  - Modified configure.in script to support setting the the -mieee flag\n    for an Alpha TRU64 build.\n  - Modified various Makefile.in files to assure clean/clobber/distclean \n    worked universally.  \n\n Peter McCluskey (Feb 1, 2003)\n  - Changes to make stack overflow less common.\n\n Peter McCluskey (January 29, 2003)\n  - Fixed faulty freeing of memory that caused core dump with files_by_thread\n    option.\n  - Fixed missing function call argument with files_by_thread option. I suspect\n    this was causing some random behavior, but I only found it due to valgrind.\n  - Fix for placement of link to next msg with incremental update, usetable = 0.\n\n Peter McCluskey (January 28, 2003)\n  - Fix from Zvi Har'El to leading zeroes in anchors in index pages with\n    indextable=0.\n  - Changes to Swedish from Peter Karlsson.\n\n Peter McCluskey (January 26, 2003)\n  - Fix for placement of link to next msg with incremental update.\n\n========================\nHYPERMAIL VERSION 2.1.6:\n========================\n\n Peter McCluskey (January 24, 2003)\n  - Released version 2.1.6 tar file.\n  - Fix buffer overflow when progress = 2 (triggered by long attachment\n    names). Was a security risk.\n  - Fix buffer overflow in mail (cgi) program that probably created security\n    risk if gethostbyaddr returned h_name of about 80 chars for an ip address.\n  - Disabled the functionality of the mail program and replaced it by default\n    with warning about abuse by spammers. Added warnings about use of program.\n  - Change size of boundbuffer (in parse.c) to 256, limit sscanf that fills it\n    to 255 bytes. This prevents a buffer overflow with long mime boundaries. The\n    buffer overflow didn't seemed to produce only minor problems, but it's hard\n    to rule out security risks.\n  - Add check for inline attachment name overflowing attachname buffer (like\n    the check that Jose added today for non-inlined attachments).\n  - Add check for append_filename and alts_text exceeding buffer size.\n  - Delete attachment directory of messages that are discarded due to a missing\n    or duplicate message-id.\n\n Jose Kahan (jose@w3.org) (January 24, 2003)\n  - Fixed a buffer overflow reported by Ulf Harnhammar from VSU security.\n\n Peter McCluskey (January 22, 2003)\n  - If mime message has an end boundary but no start boundary (as a buggy\n    version of Microsoft Outlook seems to create), the body is now treated\n    as a plain text message rather than discarded.\n  - Update trio code to trio version 1.9.\n\n Peter McCluskey (January 20, 2003)\n  - Several fixes to avoid uninitialized memory reads reported by valgrind.\n\n Peter McCluskey (January 18, 2003)\n  - Fix random behavior in parseurl which sometimes caused core dumps on lines\n    ending in http://, ftp://, etc.\n\n Peter McCluskey (December 19, 2002)\n  - Apply patch from Wolfgang Spraul fixing link from subdir attachment.html to\n    index.html when defaultindex = date\n\n Peter McCluskey (November 26, 2002)\n  - Changed attachment naming back to what it was before Jose added\n    set_nonsequential.\n  - Changed attachment naming so that files are stored using the names\n    provided without any %d- prepended whenever that doesn't cause conflicts.\n\n Kent Landfield (kent@hypermail.org) (November 24, 2002)\n  - Made some updates to the docs.  Still need to update the\n    docs to include writehaof, nonsequential, msgsperfolder and\n    assure other config file directives are listed and current.\n\n Kent Landfield (kent@hypermail.org) (November 24, 2002)\n  - Added Russian language support.\n    Submitted by Igor Solovyoff\" <siv@intear.com.ua>\n\n Kent Landfield (kent@hypermail.org) (November 24, 2002)\n  - Made the  \"_at_\" antispam bit configurable by config file, using\n      antispam_at = __somestring__  (does not have to have __ in it)\n    Anything hardcoded by default, can be figured out and used by \n    spammers.  Particularly something like \"_at_\".\n    Submitted by Philip Brown <phil@bolthole.com>\n\n Jose Kahan (jose@w3.org) (October 17, 2002)\n  - URL generation was broken when a URL had a '@' char and hypermail\n    was using the mailcommand option. parseemail() didn't take this\n    case into account yet (there's just an empty statement). I added a\n    quick patch to convert the '@' into an HTML entity when doing the\n    convertion inside a URL. The change is in translateurl().\n\n Jose Kahan (jose@w3.org) (October 2, 2002)\n  - In order to avoid hashed filename collisions, the filename\n    is now built with a hash of the msgid concatenated to the\n    Epoch seconds of the From date. This gives a total of\n    16 characters (all data is represented in hex). Only messages\n    that have the same msgid and that arrive in the same second\n    will have a collision.\n    I also compiled with the Warning flags and removed some\n    warnings.\n\n Jose Kahan (jose@w3.org) (October 2, 2002)\n  - The access righs of the msgindex file (for the hashed filenames)\n    were not being set at all.\n\n Jose Kahan (jose@w3.org) (October 1, 2002)\n  - The non-sequential msgid mode didn't work when updating the\n    archives by one message. Fixed a confusion in the generation of\n    the msgindex file.\n\n Jose Kahan (jose@w3.org) (September 26, 2002)\n  - Cleaned the autoconf files for passing the libnvf compile parameters\n    (what a difference does reading the manual make).\n\n Peter McCluskey (September 25, 2002)\n  - Fix threading bug with incremental update and spamprotect_id = 1,\n    usegdbm = 0.\n\n Jose Kahan (jose@w3.org) (September 25, 2002)\n  - Commited the ~/hypermail/ltmain.sh file and also put it in the\n    FILES section. Somehow, without this file, it was impossible to\n    compile the file generated thru a make tgz. The same kind of\n    file already existed in the pcre and fnv directories.\n    Added a rule to pass the FNV optional CFLAGS from the \n    ~/hypermail/Makefile file, so that you can do a make from the top-level\n    (previously, you had to do it in the src directory... oops!).\n\n Jose Kahan (jose@w3.org) (September 25, 2002)\n  - Updated the FILES tgz file (added libfnv, removed two non-existent\n    tests).\n  - Fixed the make tgz rule (how long was it since it was last used?)\n\n Jose Kahan (jose@w3.org) (September 25, 2002)\n  - Added a new option to compute the archived filenames using an fnv hash\n    of the msgid + received From date. The resulting filename is 8 bytes long\n    (a space of 2^32 bits) + the extension. You can eventually change it to\n    16 bytes if this is too short. Just look at the code. \n    The advantage of this is that you can add and remove items from the\n    archive and not worry anymore about broken links if the sequence\n    changes (e.g., if you are rebuilding an archive). To activate this\n    option, you need to do a ./ configure --enable-libfnv, then \n    recompile hypermail. The name of the new  option is nonsequential\n    (lack of imagination!). \n\n Peter McCluskey (September 17, 2002)\n  - Added reverse_folders option.\n\n Peter McCluskey (August 30, 2002)\n  - Fix segfaults in mdecodeRFC2047 (with headers encoded as quoted printable),\n    and in ConvURLsString.\n  - Add files_by_thread option.\n\n Peter McCluskey (August 20, 2002)\n  - Change preferedcontent to fall back on type \"text/\" or on encoding if\n    it can't find any prefered types.\n  - Fix mdecodeRFC2047 to decode headers of any length (removing 128 byte limit).\n  - Add classes to default stylesheet to set colors of headers, standard links,\n    and of quoted text according to quote nesting depth.\n\n Peter McCluskey (August 16, 2002)\n  - Fix bug internal error in crossindexthread2 resulting from message with\n    unterminated mime.\n\n Peter McCluskey (August 11, 2002)\n  - Add Norwegian language support from Bosse Klykken.\n\n Peter McCluskey (August 7, 2002)\n  - Add contrib/msg2hypermailarchive.py from Bernhard Reiter.\n  - Add antispamdomain option from Vincent McIntyre.\n  - Add delete_newer option.\n\n Peter McCluskey (August 3, 2002)\n   - Fix expires option to work in incremental mode.\n   - Add delete_older option.\n\n========================\nHYPERMAIL VERSION 2.1.5:\n========================\n\n Peter McCluskey (July 31, 2002)\n   - Release version 2.1.5 tar file.\n \n Peter McCluskey (July 22, 2002)\n   - Apply gdbm patch from Bernhard Reiter, mainly altering messages.\n   - Apply German language patch from Bernhard Reiter.\n   - Apply haof patch from Bernhard Reiter.\n\n Peter McCluskey (July 15, 2002)\n   - Fix some missing links to multipart attachments with save_alts option.\n\n Peter McCluskey (July 11, 2002)\n   - Add base_url option, and warning about it being needed when the\n    latest_folder option is used and the folder_by_date option contains a '/'.\n\n Peter McCluskey (July 8, 2002)\n   - Fix endless loop that save_alts option often produced.\n\n Peter McCluskey (June 18, 2002)\n   - Applied changes from Carlos Martn Ugalde to Spanish text.\n\n Peter McCluskey (June 13, 2002)\n   - Fix call to compute_quoted_percent so that it doesn't crash on deleted msg\n     with incremental update.\n\n Peter McCluskey (May 14, 2002)\n   - Add spamprotect_id option.\n\n Peter McCluskey (Apr 26, 2002)\n   - Changed to convert ampersands in urls to &amp;.\n\n Peter McCluskey (Apr 22, 2002)\n   - Add Greek language support from Akis Karnouskos.\n   - Surpress <p> within <pre>.\n\n Peter McCluskey (Mar 22, 2002)\n   - Fixed to rewrite old messages that have new replies (some links to\n     replies/next in thread had been missing for overwrite=0, increment=0,\n     and also for linkquotes = 1).\n   - Updated configure to reflect Daniel's changes to fix --without-gdbm \n     in configure.in.\n\n Peter McCluskey (Mar 19, 2002)\n   - Increase MAXSTACK from 20 to 200.\n\n Peter McCluskey (Feb 4, 2002)\n   - Fix to avoid converting strings like ftp://user@host.com to mailto's.\n\n Peter McCluskey (Feb 4, 2002)\n   - Patch from William R. Knox to add meta date tag.\n\n Jose Kahan (jose@w3.org) (Jan 25, 2002)\n   - When a message had a charset of type US-ASCII or ISO-8959-1, it wasn't \n     being stored in the HTML version of the message. This could result in \n     a correct decoding of the message, as browsers assume a user-given \n     default charset in those cases.\n\nPeter McCluskey (Jan 11 2002)\n - Patch from William R. Knox to fix possible race condition in creating dirs.\n\nPeter McCluskey (Jan 10 2002)\n - Add %t substitution cookies to provide path to top folder.\n\nPeter McCluskey (Jan  5 2002)\n - Fix segfault in incremental mode with linkquotes.\n\n========================\nHYPERMAIL VERSION 2.1.4:\n========================\n\nPeter McCluskey (Dec 19 2001)\n - Create version 2.1.4 tarball.\n\nPeter McCluskey (Dec 14 2001)\n - Applied patch from William King adding </li>'s.\n\nPeter McCluskey (Dec 10 2001)\n - Fix bug in chronological ordering of folders.\n\nPeter McCluskey (Dec 6 2001)\n - Applied patch from William King to fix footer links on attachment index.\n\nPeter McCluskey (Dec 4 2001)\n - Change to detect start of new message when mime boundary missing,\n   treat unbounded text as plain text body.\n\nPeter McCluskey (Dec 2 2001)\n - Applied patches from William King:\n    -  DTD changed to strict.\n    -  </p> now emitted.\n    - Some tags were not contained properly. Now wrapped in <p></p>.\n\nPeter McCluskey (Dec 1 2001)\n - Applied patches from William King to string function defines and gdbm\n   configuration.\n\nPeter McCluskey (Nov 30 2001)\n - Add Polish language support from Piotr Waskiewicz. Change some hardcoded\n   From's to new macro MSG_FROM, change a Date to MSG_CDATE.\n - update config.sub, config.guess from ftp.gnu.org/gnu/config/.\n\nPeter McCluskey (Nov 26 2001)\n - Applied patches from William King to update man pages for body, lang\n   options changes, and add new domain codes.\n\nPeter McCluskey (Nov 24 2001)\n - Applied patch from William King to add lang= to <html> tag, get rid of\n   duplicate <em>.\n\nPeter McCluskey (Nov 23 2001)\n - Added support for locales of form en_US. Changed language code \"se\" to\n   \"sv\", provide warning for old code.\n\nPeter McCluskey (Nov 22 2001)\n - Applied patch from William King to create meta tag with hypermail version\n   number.\n - better French support from Emmanuel Blot.\n\nDaniel Stenberg (Nov 21 2001)\n - Updates to congfiure and trio.\n\nPeter McCluskey (Nov 21 2001)\n - Applied patches from William King to conform better to HTML 4.01:\n   * remove body option, replace default <body> bgcolor=, text= with inline\n    style sheet (unless user-defined style sheet present).\n   * change <div align=...> to <div class=...>, same for <h1 align=...>\n - add $BINARY, $NONPLAIN types to ignore_types option.\n - add warn_surpressions option\n - add unsafe_chars option\n - Remove tmpname from parse.c (to get rid of warning about mktemp).\n\nPeter McCluskey (Nov 19 2001)\n - Applied patches from William King to conform better to HTML 4.01:\n   * remove noshade from <hr>\n   * change the default DTD\n   * escape &'s, add image/png in test.rc, hmrc.example\n - Changed the fix*header() routines so that they handle incremental updates\n   sensibly when given a mailbox with multiple messages. In the process, I\n   fixed 2 problems with single-message incremental updates, one which left\n   out the \"Next message\" link, and one which created a \"Reply\" link that should\n   have been a \"Maybe reply\".\n - Add warning for mbox that starts with different msg than gdbm file if\n   not using -u (overwrite) option.\n - Change default for overwrite option to off.\n - Fixed segfault that happened when %m parsed in header but mailto was NULL.\n\nPeter McCluskey (Nov 18 2001)\n - Folder list now sorted chronologically.\n\nPeter McCluskey (Nov 16 2001)\n - Added save_alts and alts_text options.\n\nPeter McCluskey (Nov 15 2001)\n  Updated some old documentation, added some security warnings.\n\nPeter McCluskey (Nov 14 2001)\n - Changes relevant to security:\n   1. attachment filenames ending in .shtml get changed to .html.\n   2. attachment descriptions are passed through convchars to prevent html tags\n      from being used there.\n\nPeter McCluskey (Nov 13 2001)\n - Fixed malloc bug that caused segfault with linkquotes=1.\n\nPeter McCluskey (Nov 12 2001)\n - Update to trio-1.4 (from 1.2) to fix Alpha compile problem.\n\nPeter McCluskey (Nov 7 2001)\n - Changes to hypetombox.pl:\n    1. add some support for handling attachments.\n    2. fixed some problems arising from some tags being changed to lowercase.\n    3. add -S option to specify htmlsuffix.\n    4. changed to convert <p> to blank line (instead of to nothing).\n    5. additions to improve handling of archives produced linkquotes=1 option.\n\nPeter McCluskey (Nov 5 2001)\n - change parse.c to treat lines containing only a carriage return as\n   blank lines for purpose of deciding whether they indicate the end of\n   headers or a continued header line.\n\n========================\nHYPERMAIL VERSION 2.1.3:\n========================\n\nPeter McCluskey (Aug 22 2001)\n - fix Makefile to clean pcre directory.\n\nPeter McCluskey (Aug 7 2001)\n - removed In-Reply-To from mailcommand default.\n\nPeter McCluskey (Jul 25 2001)\n - fix to abort before unlinking gdbm file if need it and cannot open it.\n - fix latest_folder option (didn't work in incremental mode).\n\nPeter McCluskey (Jul 17 2001)\n - patch from Brian Kirkby to fix links between folders with usetable.\n\nPeter McCluskey (Jun 26 2001)\n - fixed parsing of integer/octal/switch environment variable values.\n - fixed bugs in latest_folder option (includes fix from David Bau\n     <davidbau@hotmail.com>).\n\nPeter McCluskey (Jun 23 2001)\n - fixed FILES so that hypermail.html gets into tarballs.\n\nPeter McCluskey (May 31 2001)\n - patches from Moritz Willers to surpress empty \"messages sorted by:\" line,\n  add | after \"Previous Folder, Thread view\", etc.\n\nPeter McCluskey (May 30 2001)\n - changes to Swedish from peter karlsson.\n\n========================\nHYPERMAIL VERSION 2.1.2:\n========================\n\nPeter McCluskey (May 22 2001)\n - change default value for avoid_top_indices to none.\n  - fixed make to handle pcre properly.\n\nPeter McCluskey (May 16 2001)\n  - fix pathnames in inline attachments with msgsperfolder/folder_by_date\n\nPeter McCluskey (May 11 2001)\n  - add filter options (using pcre regular expressions):\n     filter_out\n     filter_require\n     filter_out_full_body\n     filter_require_full_body\n\nPeter McCluskey (May 9 2001)\n  - fix links to attachments in subdir index files.\n\nPeter McCluskey (May 8 2001)\n  - fixed bug with incremental update that caused the index files to\n   ignore messages beyond set_searchbackmsgnum.\n\nDaniel Stenberg (May 8 2001)\n  - Removed the last traces of mprintf.[ch] and made the trio stuff work\n    completely as a replacement.\n\nPeter McCluskey (May 7 2001)\n  - fixes to trio configuration.\n\nPeter McCluskey (May 4 2001)\n - another fix to avoid_top_indices = folders.\n - enhance show_msg_links to support links only at top or only at bottom.\n - add show_index_links option to control links from message page to indices.\n - add txtsuffix option\n - On/Yes now converted to 1 for CFG_INTEGER options (for compatibility\n  with options that used to be CFG_SWITCH's)\n - fix append option so that it handles uuencoded attachments and\n   mdecodeQP() calls correctly.\n\nKent Landfield (May 4 2001)\n - corrected compilation issue for Sun CC in string.c\n - corrected check for set_custom_archives in hypermail.c\n\nPeter McCluskey (May 1 2001)\n - convert mprintf calls to trio calls\n\nPeter McCluskey (Apr 27 2001)\n  - allow incremental update with folder_by_date on empty archive, improve\n  error messages for missing gdbm file with folder_by_date, incremental update.\n\nPeter McCluskey (Apr 26 2001)\n  - fixed so that avoid_top_indices = folders works.\n\nPeter McCluskey (Apr 24 2001)\n  - fix urls at end of index page with folder_by_date.\n\nPeter McCluskey (Apr 20 2001)\n  - patch from Hisashi Gotoh <gotoh@horae.dti.ne.jp> to fix message/rfc822\n   handling with showhtml = 0.\n\n========================\nHYPERMAIL VERSION 2.1.1:\n========================\n\nPeter McCluskey (Apr 18 2001)\n  - changed configure script to check several directories for gdbm.h,\n    provide --with-gdbm=DIR option.\n\nPeter McCluskey (Apr 16 2001)\n  - added patch from David Eisner <cradle@glue.umd.edu> to prevent subject\n   matching on subject lines which have no Re:.\n  - made hashreplylookup use the same code as hashreplynumlookup (fixes\n   missing \"Maybe in reply to\" links in some messages.\n  - made find_quote_prefix more cautious about recognizing nonstandard\n   prefixes as quote prefixes (affects linkquotes and showhtml=2 options).\n\nPeter McCluskey (Apr 14 2001)\n  - add missing <ul> when set_show_msg_links == 0, pointed out by\n   Emre Bastuz <info@emre.de>\n\nPeter McCluskey (Apr 13 2001)\n  - fixed portability problem in strcasestr.\n  - fixed custom_archives to handle NONE properly.\n  - removed a poorly thought out maybereply check in crossindexthread2\n    that was apparently dropping some messages from the thread list.\n\nPeter McCluskey (Apr 12 2001)\n  - convert html tags for monthly_index, yearly_index to lowercase.\n  - fixed indexing error in getname reported by David Eisner <cradle@glue.umd.edu>\n  - fixed set_usegdbm compile error reported by Daniel.\n  - fixed parentheses in printattachments\n\nPeter McCluskey (Apr 10 2001)\n  - Add check for *html deleted, gdbm index still present.\n  - fix count of messages.\n  - sped up linkquotes 2.5x by better mallocs\n  - replaced strcasestr with faster one from glibc via Scott Rose\n  - PushNString, PushString speedups\n  - fixed bug in parseemail (faulty sscanf return value check) that\n    added bogus strings in odd mailto's.\n\nPeter McCluskey (Apr 9 2001)\n  - add new options: deleted, expires, delete_msgnum, delete_level\n  - togdbm args: fix misuse of secs_to_iso which made\n      email->date == email->fromdate\n  - fix subdir bug with thread_file_depth\n  - fix threading bugs with linkquotes\n  - fixreplyheader with linkquotes bugs fixed\n\nPeter McCluskey (Apr 6 2001)\n  - patch from Hisashi Gotoh <gotoh@horae.dti.ne.jp> adding iso2022jp option\n    and fixing bug when config file not found.\n\nPeter McCluskey (Apr 5 2001)\n  - fixed faulty urls in thread index files in subdirs with folder_by_date,\n    msgsperfolder\n\nPeter McCluskey (Apr 3 2001)\n  - changed htmlfilename, articlehtmlfilename to allocate mem dynamically.\n  - redid config section of hypermail.html to describe some of the most\n    important options and refer to hmrc.html for a full description.\n    Changed style of hmrc.html, added folder_by_date mention to\n    hypermail-faq.html.\n  - fixed typo in FILES.\n\n========================\nHYPERMAIL VERSION 2.1.0:\n========================\n\nPeter McCluskey (Mar 31 2001)\n  - fixed core dump with showhtml=2 created by yesterday's checkin.\n  - added isodate, gmtime options.\n  - bug fixes to mime decoding and to libcgi/form_ent.c from\n    Greg Shenaut <greg@bogslab.ucdavis.edu>\n  - add fixhtime.pl (changes timestamps to match From:)\n\nPeter McCluskey (Mar 30 2001)\n  - Reorganized hmrc.html.\n  - Add options to split archive into subdirectories:\n    folder_by_date\n    msgsperfolder\n    latest_folder\n    describe_folder\n    avoid_top_indices\n\nPeter McCluskey (Mar 22 2001)\n  - Enabled attachments index file, added sublists of attachment\n   names and file sizes.\n\nPeter McCluskey (Mar 22 2001)\n  - Fixed problem with GDBM defines.\n  - Improved speed by replacing O(N^2) code in these functions with\n   code that is at least typically close to O(N):\n      addreply, crossindexthread1, crossindexthread2, nextinthread,\n      writearticles (if set_showreplies)\n   Accidentally improved threading under linkquotes option in the process.\n   Overall performance probably scales up linearly with the number of\n   messages under normal conditions (but not with linkquotes, which has other\n   performance problems as well). Code is ifdef'd under FASTREPLYCODE for now.\n\nPeter McCluskey (Mar 19 2001)\n  - Added new usegdbm and append options from Scott Rose.\n\nPeter McCluskey (Mar 14 2001)\n  - Added avoid_indices option.\n\nPeter McCluskey (Mar 13 2001)\n  - Sped up by balancing the datelist tree a bit (it had been virtually\n    a linked list) and by removing redundant call to nextinthread.\n\nPeter McCluskey (Mar 12 2001)\n  - Added contrib/cron_hypermail\n  - Added some files in contrib and tests/mboxes to FILES.\n\n Peter McCluskey (Mar 2 2001)\n  Added features originally implemented in critmail. New source files:\n     finelink.c\n     finelink.h\n     quotes.c\n     search.c\n     search.h\n     txt2html.c\n     txt2html.h\n  New options:\n    - showhtml: new option value 2 gives richer conversion to html borrowed\n       from txt2html.pl.\n    - monthly_index: create additional index files broken up by month.\n    - yearly_index: create additional index files broken up by year.\n    - thread_file_depth: break the threads index file into multiple files,\n       roughly one per thread.\n    - linkquotes:  creates fine-grained links from quoted text to the text\n       where the quote originated. It also improves the threads index file\n       by more accurately matching messages with replies.\n    - searchbackmsgnum: with linkquotes and -u, speeds up processing, with\n       some risk that linkquotes won't find all links it should.\n    - link_to_replies: generate links from original quoted text to the\n       location(s) in replies which quote them.\n    - quote_hide_threshold: If the linkquotes option is on, replaces quoted\n       text with links in messages which quote too much.\n    - quote_link_string: with quote_hide_threshold, use this text in place\n       of first line of quoted text.\n\n Peter McCluskey (Feb 20 2001)\n  - replaced the bodymailcommand with the following, to be more compatible:\n   * mailcommand - works as before unless replymsg_command specified\n   * replymsg_command - used for sending a reply to the list; if not specified,\n     is set to the value in mailcommand for compatibility with old .hmrc's\n   * newmsg_command - used for sending a new message to the list\n\n========================\nHYPERMAIL VERSION 2.0.0:\n========================\n\n Peter McCluskey (Feb 19 2001) applied patches from \"W. Tasin\" <tasin@fhm.edu>\n - some changes in the german translation\n - if a Content-Base is found set content=CONTENT_IGNORE because it is on\n  another server and it would never be parsed well inside the mail...\n  (this is more a workaround than a good patch... a better way would be to\n  include this to every link inside the content... to show up also this\n  external site... but I think it is an easy way to handle this problem)\n - add NONE as value for set_mailcommand, so \"New Message\" will not be shown\n - improve handling of inline attachments after signature.\n - prevent \"(no email)\" in emailaddr from becoming mailto.\n - add option set_bodymailcommand to configure mailto's other than one\n  used in MSG_NEW_MESSAGE or MSG_REPLY.\n - changes to makemailcommand to prevent (nil) from showing when no Subject:.\n\n Daniel Stenberg (Jan 3, 2001)\n - Added checks for more functions in the configure script\n\n Ashley M. Kirchner (May 31, 2000)\n - I converted all uppercase HTML tags to lowercase in the main hypermail\n   base source.  Stuff that got contributed (under the contrib directory)\n   were not touched.  I'm going to leave those for their respective\n   contributors to change.\n\n Daniel Stenberg (daniel@haxx.nu) (May 25, 2000)\n - Added 'spamprotect' as a new flag. It replaces @-letters with \"_at_\" to\n   confuse spam-email-robots a bit.\n\n - Found a terrible bug when an URL contains a @-letter, since it'll first\n   become <href>-tagged and then <mailto>-converted... :-/\n\n - Added https:// as a recognized URL type (deja-vu, didn't I do this before?)\n\n - Corrected the alternative parser not being reset at the end of all mails\n\n Daniel Stenberg (daniel@haxx.nu) (May 23, 2000)\n - Corrected the output on %> appearences in the template files\n\n - Applied the beauty fix supplied by Darryl Lee <lee@darryl.com>\n\n Daniel Stenberg (Apr 10, 2000)\n - I made %<unknown letter> in printfile display exactly as used the other\n   day. Today I changed my email address all over!\n\n - Added https:// to the recognized URL types to <a>-ify\n\n Jose Kahan (jose@w3.org) (Jan 17, 2000)\n\n - The quoted printable decoding didn't take into account the \n   ietf-mbox option.\n \n Jose Kahan (jose@w3.org) (Dec 24, 1999)\n\n - Removed an invalid </A> tag when using tables.\n\n - When using the showhtml option, invalid HTML was generated in the\n   headers: <P><P> before the </PRE>.\n \n- Stopped the generation of a Mailto on msgid's.\n \n - Rearranged the format of the index and messages when not using\n   tables. My aim was to make the format more symetrical.\n\n - Added a new item, \"Mail actions\",  in the control menu. This item\n   is only active when using the mailcommand and hmail options, and\n   when the tables are turned off. This option duplicates the one found in \n   the table.\n\n - Added two new options for linking external stylesheets to the index \n   and the messages, respectively: icss_url, mcss_url. The link is added\n   as a META element in the header.\n\n - The default value of the mailcommand mailto: had some typos: non\n   escaped chars, use of reply-to instead of in-reply-to.\n \n - Two protections were missing to avoid having empty HREFs when the\n   about and archives options were defined in the .hmrc file, but wihout\n   any given value.\n\nJose Kahan (jose@w3.org) (Dec 15, 1999)\n\n - The inline changes from 29/Nov had the side effect that other\n   inline attachments, like text/html were being linked like inline\n   images.\n\n Kent Landfield <kent@landfield.com> (Dec 8, 1999)\n\n - Bjarni R. Einarsson <bre@netverjar.is> pointed out that the\n   \"Reply:\" and \"Maybe Reply:\" output was not correct.  pcm@rahul.net \n   (Peter C. McCluskey) submitted a patch that fixes them as well\n   as the current threading allows. \n\n Kent Landfield <kent@landfield.com> (Dec 7, 1999)\n\n - Added hoaf-28 python index generator written and contributed\n   by Bernhard Reiter <bernhard@climate2.geog.uwm.edu> to the basline.\n\n - Added ls2mail script written by David Kilzer <ddkilzer@ti.com>\n   to the basline.\n\n - Converted libcgi.doc to libcgi.html.\n\n Kent Landfield <kent@landfield.com> (Dec 1, 1999)\n\n - hypermail-2b28 rolled.\n\n Kent Landfield <kent@landfield.com> (Nov 29, 1999)\n\n - Corrected a parsing error in parsemail when dealing with\n   attachments.  If the filename was \"quoted\" things worked\n   properly. If the filename was not quoted then the name \n   of the attachment was dropping the first letter of the\n   filename and adding '_' to the end. \n\n - Corrected a conditional statement that was limiting storage\n   of 'inline' types to only recording inline types that were\n   of type image/.\n\n - Changed strstr usage when searching MIME headers to\n   use strcasestr instead as the case sensitivity was\n   getting in the way. \n\n Kent Landfield <kent@landfield.com> (Nov 28, 1999)\n \n - Inconsistencies in write* routines called in hypermail.c\n   pointed out by Bernhard Reiter <bernhard@uwm.edu>.  set_* \n   variables were used but still passing values in with the \n   function call.  Removed unneeded parameters.\n\n Kent Landfield <kent@landfield.com> (Nov 22, 1999)\n\n - The .hmrc resources didn't seem to override the default values, but \n   rather got added to them.  This was corrected for list usage. If\n   a list value is set in the .hmrc file, it should completely replace\n   the default values.  This need only occur on the first occurance\n   after the builtin initialization.\n\n - Jeff Katcher pointed out 'At the bottom of index.html and date.html, \n   \"Last message date:\" is output twice.  It's only present once on the \n   author and subject pages.'  This has been corrected so it is only\n   printed once.\n\n Jose Kahan <jose@w3.org> (Nov 23, 1999)\n\n - A typo in setup.c:PreConfig gave problems (memory overwrite) when \n   dealing with CFG_LIST configuration options.\n\n - uudecode wasn't working with the ietf-mbox option. \n\n Kent Landfield <kent@landfield.com> (Nov 22, 1999)\n\n - Error in setting of defaultindex in configure.in caused no index.html\n   file to be created. configure.in was corrected to set the default \n   index to \"thread\" instead of thread.html.\n\n - Added .indent.pro files to FILES file.\n\n - Added \"-p\" option to mkdir so all parent directories will be made if\n   needed.\n\n - Added requests to TODO file.\n\n Kent Landfield <kent@landfield.com> (Nov 17, 1999)\n\n - hypermail-2b27 rolled.\n\n Kent Landfield <kent@landfield.com> (Nov 17, 1999)\n\n - Changed the install dependencies for the Makefile.in files\n   so that install-sh is used through out.\n\n - Assured all includes are checked for in configure.\n\n - Updated FILES\n\n - Corrected dependencies on defaults.h\n\n Kent Landfield <kent@landfield.com> (Nov 14, 1999)\n\n - Corrected CFG_LIST storage of defaults other than NULL in\n   the function ConfigAddItem().\n \n - Assured struct hmlist variables set_text_types,\n   set_inline_types, set_prefered_types, set_ignore_types,\n   and set_show_headers set to NULL initially. Othewise\n   add_list was checking garbage when called from ConfigAddItem().\n \n - Reworked some of the defaults in setup.c\n \n - Added a dump_configI() routine to print out all internal variables\n   for debugging. Use #ifdef DEBUG to get it included.\n \n - Removed unused defines in setup.h\n \n - Added defaults.h.in so sites could setup reasonable global defaults.   \n \n - Added additional configure support for setting defaults for \n   language, htmlsuffix, defaultindex and domainaddr in defaults.h. \n \n - Added cleanup of defaults.h and mail-archive test directory to Makefile\n \n - Removed old method from Makefile.in and lists.h in the archive directory.\n \n - Regenerated configure from configure.in. \n \n - Regenerated the dependencies in src/Makefile.in \n \n - Removed some #if 0 code in date.c  \n \n - Changed strdup calls to strsav calls in getname.c and mail.c\n \n - Cleaned up html page output if usetable was selected. \n \n - Removed unnecessary variable passing into the writedates(), \n   writethreads(), writesubjects(), writeauthors() routines. \n \n - Freed up memory alocated for configfile variable. \n \n - Removed unneeded variables in hypermail.h (previously #if 0'ed) \n \n - Updated README a bit.\n\n - Updated Changelog\n\n Kent Landfield <kent@landfield.com> (Nov 11, 1999)\n\n - Removed strdup declarations that were causing gcc to fail \n   on certain systems.\n\n - Added French language support contributed by Nicolas NOBLE \n   <pixels@chez.com>\n\n - Updated documents about \"is\" and \"fr\" language support.\n\n Kent Landfield <kent@landfield.com> (Nov 9, 1999)\n\n - Added checking the return value of getpwuid() in readconfigs. If\n   the value is NULL then see if the $HOME is set in the environment.\n   This avoids a crash for Win32 users who don't bother to set up\n   /etc/passwd in cygwin environment.\n\n - Added support for proper naming of executables (hypermail on \n   Unix hypemail.exe on Dos/Windows/NT).\n\n - Corrected getlocaltime so it would not print the timezone twice\n   if the timezone was also specified in the dateformat directive.\n\n - Corrected print.c so From: is printed when the email address\n   is the same as email name.\n\n - Removed tests/testhm from the baseline. Replaced it with testhm.in\n   so configure can generate the proper path to the test hypermail \n   executable.\n\n - Modified configure.in so that it can determine if it is running\n   in cygwin environment. Added tests/testhm.in support.\n\n - Removed acconfig.h from the baseline as it is no longer needed\n   with the current configure changes.\n\n - Assured destination directories exist for all installed files.\n\n - Added uninstall option in makefiles.\n\n - Cleaned up the docs/Install-win32.txt to reflect the changes made.\n\n Bjarni R. Einarsson <bre@netverjar.is> (Nov 5, 1999)\n\n - \"is\" message table translation.\n\n - Added a stripsubject feature to hypermail, which\n   makes it remove all occurances of a given word from the subject line,\n   which is really useful for un-cluttering the subjects of some mailing\n   lists (my lists all have their subjects prefixed with [listname]: -\n   which is quite redundant in an archive).\n\n Jose Kahan <jose@w3.org> (Nov 4, 1999)\n\n - Cleaned a bit the HTML format as well as the arranging of the indexes,\n   to make them look a bit more coherent.\n\n - Commented the code that assumed we have an HTML text when finding a\n   line with <HTML>. The best way is to send HTML text using a correct\n   content type.\n\n - New configuration option, custom_archives, that allows to define\n   a proprietary HTML text to be shown in the Other mailing archives\n   item.\n \n - New configuration option, ietf_mbox, for parsing IETF-formatted mboxes\n   (see the doc).\n\n Jose Kahan <jose@w3.org> (Nov 2, 1999)\n\n - When using the showhtml option, </PRE> tags were being added to each\n   line of the signatures.\n\n Martin Schulze <joey@infodrom.north.de> (October 27, 1999)\n\n - Some where the showheaders functionality was lost. It has been\n   partially added in.  The 'hm_show_headers = list_of_RFC_Headers_to_display'\n   functionality did not work and has been corrected.\n\n - If the show_headers directive contains the special character ``*'',\n   hypermail will display all header lines.\n\n - Hypermail 2.x can now read hypermail 1.02 config files. Needed\n   to assure minimal impact of existing sites that use the older\n   version of hypermail. \n\n - hmrc.4 and hypermail.1 have been updated.\n\n Kent Landfield <kent@landfield.com> (October 27, 1999)\n\n - Edited documentation to the text more readable by using two spaces \n   after a fullstop.  \n\n - Cleaned up prototypes so they are consistent through out the include files.\n\n - Found many locations where a local variable was shadowing a global\n   variable.  Renamed certain variables to assure no compiler confusion. \n\n - Extended the warning switches in WARNINGS in the Makefile.in.\n\n Kent Landfield <kent@landfield.com> (October 23, 1999)\n\n - Added additional checks in configure for the operating system. Set -Ae for\n   HP-UX and added checks for functions in libsocket and libnsl. Added sanity\n   checks to assure you are on the same machine if you are using the existing\n   config.cache and added acconfig.h config.guess config.sub support files.\n   Additional cleanup to configure.in and a regenerated configure script. \n\n Scott Rose <srose@direct.ca> (October 20, 1999)\n\n - When a URL has trailing punctuation, it is almost certainly not part of\n   the URL. This version of parseurl() therefore excludes trailing\n   punctuation from URLs it finds.\n\n - If the content-description of a message was empty, and at the end of a \n   line, the link to the associated attachment was anchored on null text. \n   Fixed to assure the text is anchored on the filename in the generated HTML.\n\n Scott Rose <srose@direct.ca> (October 19, 1999)\n\n - Added contrib/canonicalize.pl \n\n   Comparing two archives is complicated by the fact that each message is\n   marked by the time at which it's archived. Attached is a script that\n   standardizes that date, if weakly, useful for such comparisons.\n   \n - Added contrib/hyperfeed.pl\n\n   Feed messages from an mbox into hypermail one at a time so as \n   to test the incremental mode of hypermail.\n\n - The idea here is that we are zipping along through an mbox, gathering\n   information about a message, when we encounter a \"From \" line that signals \n   the start of the next message. A side effect is populating dp with the \n   date from that \"From \" line. In the existing code, that value is copied \n   into fromdate[] just before the old message is hashed, which causes it \n   to be associated with the previous message.  This caused different output\n   depending on incremental or mbox updating. This patch corrects that\n   by moving the date copy until after the addhash function is called.\n\n Kent (October 18, 1999)\n\n - Updated parseurl fuction as done by Scott Rose <srose@direct.ca>\n   provided 25% faster processing than the existing version while\n   maintaining the same functionality.\n \n Kent (October 8, 1999)\n\n - Changed msg2archive.c to be able to use the command line\n\n - Made changes to runtest to assure msg2archive could be tested.\n \n - Added the indent file .indent.pro in archive, src and lib.\n\n - Ran indent on all sources in archive, src, and lib.\n\n - Made changes to configure.in to better support libsocket.a\n\n - Corrected configure.in check from gethostbyname to gethostbyaddr.\n\n - Added configure check for inet_addr\n\n - Added addition header checks and function checks in configure.in\n\n - Regenerated config.h.in with autoheader\n\n - Regenerated configure with autoconf\n\n - Updated the source files to use the HAVE_* definitions in config.h\n \n - Minor editing on the README\n\n - Minor updates to the TODO file and Changelog file.\n\n - Updated KNOWN_BUGS with the content of tests/Problems\n\n - Removed tests/Problems from the baseline as it was duplicating\n   KNOWN_BUGS\n\n - Removed src/Formatting from the baselien as it was a junk working\n   file of mine that should never have been baselined originally.\n\n - Added tests/mboxes/embedded.msg as a test file and updated\n   tests/testhm to exersize it.\n\n - Removed the listing for tests/Problems and src/Formatting, while\n   adding tests/mboxes/embedded.msg to the FILES file.\n\n - Added the corrected version of hypetombox.pl done by\n   Peter McCluskey (pcm@rahul.net) to the baseline.\n\n Jose (October 7, 1999)\n \n - Changed the HTML DTD string of the generated strings to HTML 4.0\n   Transitional.\n \n - Updated the doc to correspond to the suppression of the\n   options's hm_ prefix. Made the doc's HTML documents valid HTML 4.0 docs.\n\n Kent (September 20, 1999)\n\n - Cleanup of prototypes.\n\n - Removed the generated getdate.c from the baseline. (Generated\n   from getdate.y.\n\n - Purified and removed array bounds read problems.\n\n Daniel (September 17, 1999)\n - Applied language patches from Jyrki Kuoppala <jkp@kaapeli.fi>\n\n - Applied Kent Landfields lots of changes. getname() is reverted to an older\n   version since the newer did out-of-bounds reads.\n\n - Paul Haldane's fix is applied.\n\n - Peter C. McCluskey <pcm@rahul.net> suggested fixreplyheader() correction\n   has beed applied.\n\n Daniel (September 13, 1999)\n\n - Kent Landfield found a bunch of weirdnesses that were corrected, in:\n   * threadprint.c/print_all_threads()\n   * print.c, makemailcommand() usage\n   \n Jose (September 8, 1999)\n - (This is a big commit as I'm merging my independent developments into\n   the public hypermail tree, which I'll use from now on)\n   If there's a Content-Description header, we now use it to describe\n   MIME attachments (unless they are inlined).\n   Two new options (see the hmrc.4 or hmrc.html file for more info): \n      + hm_uselock to turn off hypermail's internal locking mechanism\n      + hm_usemeta to store the content type of a MIME attachment in a\n        metadata file (also available thru commandline option -M)\n   If the usemeta option is turned on, the Content-Type header of an\n   attachment is stored in a .meta directory (see hmrc.4 or hmrc.html for\n   more info). \n   Files where MIME attachments are now prefixed with a two-digit counter,\n   a la dd-name. This is to avoid having having to create temporary files,\n   and to preserver links.  The counter is incremented for each attachment,\n   regardless of it's being inline or not. I disabled the call to emptydir\n   as it's not useful (will add it as an option later on).\n   External MIME attachments that don't have a filename, are given the name\n   dd-part.\n   Improved handling of MIME rfc822 attachments. \n   Improved handling of Content-Disposition\n  \n Ashley (September 7, 1999)\n - Added configure options for --httpddir, --cgidir and --htmldir with\n   Apache's layout as the default (/usr/local/apache)\n\n Daniel (August 23, 1999)\n - Removed the 40-letter limit for subjects in the thread-index when\n   the table option was enabled.\n\n jose.kahan@w3.org\n - When the boundary is declared without quotes, parse.c failed to get it\n   properly.\n\n - print.c: There was a missing <PRE> and this resulted in a not-readable text\n\n Daniel (August 10, 1999)\n - I hade a terrible bug that made the attachment directories to get created\n   relative the wrong directory! They were also not getting the proper\n   permissions set.\n\n Tim Witham <twitham@pcocd2.intel.com> (August 10, 1999)\n - Had to fix a realloc() with NULL pointer which sunos doesn't handle.\n\n2a24\n====\n  Daniel (August 9, 1999)\n  - I'm consider renaming the series of archives that I'm releasing, back to\n    the beta label. It would be more correct. Kent is with us again and I\n    don't think anyone is gonna continue on the now forever sleeping\n    beta-series. This seems to be the one and only hypermail development\n    branch and I believe we now have it stable enough.\n\n  - 'attachmentlink' is a new config file item that controls how attachments'\n    links are made. By using this you can make a wrapper cgi script on your\n    server that issues a warning to the user that it may be dangerous to run\n    attachments or whatever you think is appropriate. Default it behavs as it\n    used to do before this feature was added.\n\n  Daniel (August 8, 1999)\n  - Applied Jose Kahan <Jose.Kahan@inrialpes.fr>'s patches:\n \n    The alternate content parsing was broken in that you couldn't give a list\n    of preferences. Also, if you first parse an alternate with a low priority,\n    then another one with a higher priority, the memory and, eventually, files\n    created to store the former alternate content weren't erased.\n\n    I found a minor bug. When decoding messages with multiple MIME\n    attachments, the decode variable (where the content encoding format is\n    stored), isn't updated.\n\n  Daniel (August 6, 1999)\n   - Fixed the subject overflow\n\n   - Made attachments get saved in their own subdirectories.\n\n2a23\n====\n  Daniel\n  - I'm making a release out of this now since I'm off for a longish\n    vacation next week...\n\n  Paul\n\n  - Applied Tom van Alten's patch to correct improper formatting \n    of messages when hm_showhtml = 0 and showheaders = 1.\n\n  - New code to (optionally) accept messages wth no msgid.  Default\n    is to require msgids in all messages - use hm_require_msgids = 0 \n    to avoid this check.\n\n  - Made handling of duplicate msgids optional.  By default duplicates\n    are discarded.  To accept them (replacing the msgid with a generated\n    msgid) use hm_discard_dup_msgids = 0.\n\n  - Check return value from addhash when reading old messages.  Messages\n    already archived should be valid but safer to check.\n\n2a22\n====\n  Daniel\n  - Applied a boundary parsing bug correcting patch supplied by\n    Andreas Fuchs <asf@ycom.at>\n\n  Paul Haldane\n  o (May 16th 1999)\n    1) changes to the way we construct threadlist (so that all the messages\n    that should be in the thread are included even if they don't have valid\n    in-reply-to headers)\n\n    2) changes to threadprint.c - simplification of print_all_threads.  Now\n    uses the information in threadlist to find the relationship between\n    messages.  This speeds things up a bit when adding single messages to\n    large archives (I saw a reduction from 28s to 18s for adding a message to\n    a 1,100 message archive).  Slight speed-up when converting large archives\n    - not as noticeable as a large part of time now seems to be in fopen().\n\n    I've updated/added some comments.\n\n    I've added msgnum to the reply struct - this is just a copy of msgnum in\n    ->data->msgnum - this was intended as an optimisation but I suspect it\n    doesn't make much difference.\n\n    Threading is now much better (well, I would say that wouldn't I :->).  it\n    still gets things wrong occasionally - often not really its fault.  Known\n    problems include\n\n    1) duplicate message-ids - results in messages being attached to the wrong\n    thread - actually found an instance of this in my test mailbox.  The\n    obvious heuristic to avoid this would be to compare the subject as well,\n    though this breaks threads where the sender has deliberately changed the\n    subject but intends to continue the thread.\n\n    2) occasionally gets messages in the wrong order because they get attached\n    to different sub-threads - wouldn't happen if MUAs used in-reply-to.\n\n    I've done a quick tweak to duplicate msgid handling in addhash.  Now\n    replaces duplicate msgids with a locally constructed one.  This keeps\n    things happier.\n\n\n2a21\n====\n  Daniel\n  o (May 12th)\n    - Added the tests/stdintest.pl script. It is a small perl hack that passes\n      a series of generated mails into hypermail on stdin. One by one. I've\n      got reports about bugs in that area, but I can't seem to repeat any\n      with this tool. I thought I'd better include this here anyway to better\n      enable others to run more torture tests on hypermail.\n\n  Paul Haldane\n\n  o (May 6th)\n    - Here's a patch that allows the user to decide on the format used to\n      present dates on the generated pages.  If dateformat is set then it uses\n      that (that's the new functionality) otherwise it uses the standard\n      format or euro format depending on the config file.\n\n      I've not given the option to use the date string as originally given in\n      the mail message.  This could be done without too much hassle.\n\n  Daniel\n  \n  o (May 5th)\n    - Corrected a crash in parse.c\n\n    - Added a missing \"From:\" in print.c\n\n    - Made the bin-names get prefixed with \"att-\" too.\n\n    - Adjusted getname() to skip all starting white spaces and quotes, and\n      to skip trailing quotes as well as white spaces.\n\n  o (May 4th)\n    - Attachment names could miss the first letter.\n\n2a20\n====\n  Daniel\n\n  o (May 3 1999)\n   - Implementing my new From:-parser into the new source file: getname.c.\n     This should hopefully not only be much better at parsing from lines,\n     but also to it in a more stable manner.\n\n   - Found some additional problems with From-lines I've tried to correct.\n     Like a single-mail archive or mails with no From:-lines at all.\n    \n  Ron Brogden <rb@islandnet.com>\n\n  o A small correction to hypermail.c lets it compile properly on sunos 4.\n\n2a19\n====\n\n  Daniel\n\n  o Now I prefix filenames with \"att-\" when I save attachments.\n\n  o Several errors correct, most of them by Paul Haldane.\n\n2a18\n====\n\n  Daniel\n\n  o (Apr 7 1999)\n    - Added 'locktime' as a configurable item. It defines the maximum number\n      of seconds to wait for an existing lock to dissapear before it is\n      overridden. If this is 0 or less, the lockfile will lose its power\n      completely. locktime is 3600 by default.\n\n    - I made the 'indextable' option work as Glen Steward wanted it to (that\n      March 30 patch apply wasn't such a big hit). You can either set\n      \"indextable = on\" in the config file or use the -T command line option\n      to get the indexes in \"table\" version.\n\n  Paul Haldane\n\n  o (Apr 7 1999)\n    - Major date-parsing re-arrangement. getdate.c added, lots of functions\n      patched. Speed improvements.\n\n2a17\n====\n\n  Daniel\n\n  o (Mar 30, 1999)\n    - First atttempt at applying Glen Steward's table patches. It wasn't\n      a complete success but it can be adjusted from here.\n\n  o (Mar 29, 1999)\n    - Ashley M. Kirchner found a silly bug that occured if the last mail\n      in the box was a double message-id (or similar that makes that\n      particular function return NULL).\n\n  o (Mar 25, 1999)\n    - Threaded index seems to work yet again!\n    - Paul Haldane <Paul.Haldane@newcastle.ac.uk> brought me lots of\n      various patches that made hypermail do better! \n\n  o (Mar 25, 1999)\n    - Corrected the problem with \"re: subject\" and \"subject\" being sorted\n      differently. The explanation was that the \"re:\" subject had a space\n      left in the beginning of the string!\n\n  o (Mar 25, 1999)\n    My giant work of redoing things now finally seems to work a little at\n    least. What's been done the last week:\n    - All emails now get only ONE single struct allocated for it.\n    - Remade the hash stuff. Hashed entries in the table only stores a struct,\n      links it in the list and POINTS to the email struct.\n    - Added a hash on the 'inreplyto' string to better enable finding mails\n      a mail replies to.\n    - Rewrote the whole darned threaded index functions. threadprint.c is a\n      new source file for threaded index functions.\n    - All indexes will now have full access to the complete email struct and\n      will thus enable dates all over etc. This will enable me to introduce\n      a template feature for how to write an entry in an index. I.e what to\n      include for each entry, subject, author, date, charset, bla bla bla...\n    - Changed the way single mail's \"next in thread\" links are found.\n    - As a \"side-effect\" I added a filter to prevent the same message ID\n      twice. The reason for this is that it is more likely for it to be able\n      to screw up the threading if I allow them to co-exist.\n\n  o Ashley M. Kirchner <ashley@pcraft.com> works on the bug report web.\n\n  o (Mar 15, 1999)\n    Roman Shterenzon <roman@xpert.com> pointed out a bug in the HTML-reader\n    that made hypermail crash if the variables were set to \"\". I mailed back\n    a patch to him I think will correct this problem.\n\n2a16\n====\n  Daniel\n\n  o (Mar 14, 1999)\n    \"text_types\" is now a recognized config file item, where you can specify\n    MIME types that should be treated by hypermail _exactly_ as if they were\n    text/plain.\n\n  o Corrected the list-check routine, so that the items in the list are the\n    ones using wildcards. This means that suddenly, all those mime-list items\n    support wildcards!\n\n  o (Mar 13, 1999)\n    Craig A Summerhill <craig@cni.org> found a bug. It turned out to be the\n    fact that parse.c wronly assumed content-type text/plain to use\n    ENCODE_NORMAL. It was really silly, since the Content-Transfer-Encoding\n    header could've already appeared and stated another encoding!\n\n  o Adjusted configure.in to do a slightly better -libnsl check.\n\n  o (Mar 11, 1999)\n    CVS server is up again. Added the UPGRADE file to the tree. Thanks to\n    Glen Stewart.\n\n  o (Mar 10, 1999)\n    Pretty extensive re-write of parse.c to deal with the\n    \"Content-Disposition\" headers better. That line can give a hint whether\n    the file should be stored as a file or showed inlined. It can also\n    have the filename (RFC1806 for details).\n\n  o (Mar 10, 1999)\n    The CVS server is down due to admin work there.\n\n  o (Mar 10, 1999)\n    Fixed parseurl(). It now deals with <www.foobar.com> and similar\n    constructions better. Craig A Summerhill <craig@cni.org> reported.\n\n  o (Mar 8, 1999)\n    Corrected src/Makefile.in to not use options.h anymore!\n    Roman Shterenzon <roman@xpert.com> made me aware of this.\n\n2a15\n====\n  Daniel\n\n  o (Mar 5, 1999) Made \"text\" equal text/plain in content-type: header\n    lines.\n\n  o Removed options.h completely to reduce the number of mistakes from\n    people trying to edit it!\n\n  o (Mar 4, 1999) Applied Glen Stewart's patch to remove a few <li> tags.\n\n  o Bailey, Raymond <bailey9@MARSHALL.EDU> pointed out a problem in the\n    getname() function. When you got a mail with a From: line where there\n    is a name within quotes that were \"attached\" to the email part without\n    spaces in between as in \"name\"<email@email.com> the parser failed to\n    get a name part of this and caused hypermail to dump core.\n\n  o Alisdair Davey <ard@mithra.physics.montana.edu> Helped me point out\n    a bug in mprintf.c. It made the *printf() routines fail on %.*s\n    constructions. I am considering an upgrade of the mprintf stuff to\n    my newer \"trio\" stuff...\n\n  o Made %f insert the file name of the generated HTML file in headers\n    and footers.\n\n2a14 Pl 2\n=========\n  Daniel\n\n  o Removed a bug that occured when converting a mail into html that had\n    a \"in-relpy-to\" header but the replied-to mail was not present in the\n    mailbox.\n\n2a14 Pl 1\n=========\n  Daniel (now CVS'ed at cvs.hypermail.yeehaw.net:/cvs/hypermail)\n\n  o Made it de-mime headers even without the mime-version: header present\n  \n\n2alpha14\n========\n  Daniel\n\n  o It should now accept white space in the beginning of config file\n    lines.\n\n  o SetupCleanup() bugs somehow, I'm no longer using it == dirty fix.\n\n  o Updated the \"name/email\" scanner.\n\n  o Total mail counter was wrong when updating.\n\n  o Renamed to alpha to avoid confusion.\n\n2b13\n====\n  Daniel\n\n  o Two corrections in the mprintf.c. One of them being serious\n\n  o (parse.c) now the QP decoder accepts question marks in the encoded-words\n\n  o Corrected the mprintf() replacement define in mprintf.h\n\n  o Added some more missing free()s in print.c\n\n2b12\n====\n\n  Daniel\n\n  o Now strips trailing white spaces from values in the config file if\n    written without quotes. Paradise Cowgirl <minerva@phix.com> reported.\n\n  o List types in the config were insanely written and caused memory\n    disaster at times. Byron C. Darrah <bdarr@sse.FU.HAC.COM> and\n    Jenni Baier <jenni@renewed.net> both probably experienced this.\n\n  o Decreased the amount of memory allocations used when building hash\n    tables for index sorting. (see addhash() in struct.c)\n\n2b11\n====\n \n  Daniel\n \n  o Tom von Alten <alien@hpdmlad.boi.hp.com> pointed out a really nasty bug\n    in fixreplyheader() I had introduced! :-(\n\n2.0b10\n======\n\n  Daniel\n\n  o %c is recognized and replaced with a charset tag in mail headers. It\n    should be set as early as possible within the HEAD tag.\n\n  o Saves <!-- charset=blablabla --> in articles.\n\n  o dprintf() was not a successful name, Linux uses it for some odd purpose\n    even in stdio.h! :-/ Renamed my line of functions to m*.\n\n  o Adjusted getname() to be slightly smarter.\n\n  o Started working at adding charset to each single mail. It should be stored\n    per-mail basis now, even though it is never used anywhere...  It should\n    now make a proper META HTTP-EQUIV tag!\n\n2.0b9\n=====\n\n  Daniel\n\n  o Added a new -o option that can set any config options on the command line.\n    E.g set label with -o \"label=my new label\".\n\n  o Major rewrites of struct.c. There were just too many functions that\n    passed data between them by strcpy()ing them to char buffers. They now\n    pass char pointers in a lot higher degree. In fact, there aren't that\n    many strcpy()s left in the source now. Not that I notice any faster\n    operations, I just know it is neater code.\n\n  o I really don't like the way proto.h has *ALL* prototypes and therefore\n    everything is dependent on that file. I've stared to slowly extract the\n    protos for each .c file into its own .h file. This will allow me to\n    change prototype for a single function without having to recompile the\n    whole lot.\n\n  o Added general \"Re:\" - awareness functions. isre() returns TRUE if the\n    input string starts with a re-thing and findre() returns the position\n    of the first instance of re in the input string, or NULL if there is\n    none.\n\n    It knows and recognizes \"Re:\", \"Fw:\" and \"Re[<number>]:\" strings. If we\n    ever intend to support local variations of this, I've now made that\n    easier...\n\n  o The new getname() had problems with parens in the real name part when\n    quoted. As in \n    From: \"Windle, Alan M. (PA62)\" <test@site.com>\n    It shouldn't be a problem now. It should also work with from-lines like:\n    From: (\"Windle, Alan M. (PA62)\") test@site.com\n\n    There might be an idea to simply ignore everything within that level of\n    parentheses. I mean, not add that text to the name.\n\n  o The sorted datelist was broken because I must've destroyed unre() when I\n    turned it dynamic. I improved printsubjects() to deal with pointers and\n    it now strcpy()s a lot less data.\n    \n    Did the same change to the printauthors() too.\n\n  o increment and readone are now separate options. Read stdin or use mailbox\n    are mutually exclusive but don't modify increment or readone. The\n    previous system was very confusing and didn't allow e.g updating an\n    archive with two mails passed on stdin!\n\n    I've now tried to update an existing archive with 3 mails passed on stdin\n    and it seemed to work. Works if read from a mailbox too. Even works with\n    the new -1 flag (to indicate there's one mail only). It has an\n    accompanying config file keyword named 'readone'. I think the new -v flag\n    is really great for this, cause it shows all built-in variables and kind\n    of automatically documents them!\n\n  o Ok, I wasn't aware the config file did assume quotes around the strings.\n    I've added support for that (too) now. Distributed this small change\n    to Kent, Tom and John as a patch for 2b8.\n\n2.0b8\n=====\n\n  Daniel\n\n  (Nov 24, 1998)\n  o So, just before I was gonna announce the b7 to the guys I got another\n    report from John Petrakis that pointed out two bugs. One bad free() which\n    he identified and one From:-line that b7 couldn't get name and email from\n    properly. I got really tired and rewrote the whole getname() function to\n    work with all the combinations mentioned in the source, and more. I think\n    this function also has another benefit: it is easier to read than the old\n    one.\n\n  o I found some other bugs with my new setup system which caused the\n    hm_htmlbody = NONE to not work. I am actually against that a line that\n    says NONE sets it to the default. NONE should be NONE, if the keyword\n    isn't used at all it should use the default. Well well, one thing at a\n    time I guess.\n    \n\n2.0b7\n=====\n\n  Daniel (getting deeper and deeper into this now ;-)\n\n  o Entirely new config file parser. Does make adding new config items a\n    lot easier and smoother. Run hypermail -v to make it output a fully\n    working config file (after reading the given input parameters).\n\n    There is no need for the \"hm_\" prefix on keywords in the config file. You\n    can still use it if you want, but you don't have to.\n\n    Internally, all configurable variables are now named 'set_XXXXX' to better\n    make it visible in the code.\n\n  o readoldheaders() is a lot more robust now. The order of the variables are\n    not set and empty files no longer cause it to dump core.\n\n  o Hypermail from now on only stores the variables inside HTML files that\n    are actually set. name=\"\" is not needed to store.\n\n2.0b6\n=====\n\n  Daniel continues:\n\n  o parseemail() and ConvURLs() needed to deal with NULLs better.\n\n  o loadoldheaders() are no longer dependent on the order of the variables\n    in previously written HTML files.\n\n  o Mails with no subject confused the parser.c\n\n  o Tom von Alten <Tom_vonAlten@boi.hp.com> sent me two files he appearantly\n    got from Kent after the b4 he sent me. (date.c and msg2archive.c)\n\n  o All kinds of lists like hm_show_headers, hm_inline_types and\n    hm_ignore_types now offer the below mentioned wildcards.\n\n  o Added dmatch.c for dos-style * and ? wildcard matching.\n\n  o Cleaning up more memory leaks.\n\n2.0b5 as sent to John Petrakis 19 Nov 1998\n==========================================\n\n  Daniel:\n\n  o Added 'maketgz' to the archive. It is for creating release archives,\n    without having to remove a lot of files first.\n    * first asks for the version number of choice\n    * uses the file FILES to know what files to include.\n    * updates the patchlevel.h file to the entered version number\n    * creates the archive with a directory based on the entered version number \n    * names the archive based on the entered version number\n\n  o Added a whole bunch of more free() calls.\n\n  o Inlined HTML that was base64 or uuencoded were not previously dealt with\n    properly.\n\n  o Mails with no Message-Id: caused a crash in the hash function.\n\n  o HM_INLINEHTML can now be set to 0 to prevent hypermail from inlining\n    mail parts in HTML.\n\n2.0b4 as sent to Tom von Alten Nov 19, 1998.\n============================================\n\n  Daniel:\n\n  o Dynamic strings all over. I added a generic dynamic-string system which\n    I think works pretty good. Using functions and macros it should also be\n    pretty easy to extend, modify and optimize without any other source\n    modifications. \n\n    I had to modify stuff all over the place and pretty much too. I hope I've\n    removed at least the worst uses of static buffers and my initial tests\n    prove me right. No lenght limits of any fields of a mail is my goal, and\n    I think it is a fair goal.\n\n    Beware of leaking memory now though. We need to setup some debug-system\n    to track them easily.\n\n    The dynamic string routines could very well be optimized too.\n\n  o My dsprintf system was added. This system offers snprintf() - sprintf with\n    a buffer length parameter and aprintf() - returns an allocated string with\n    the text. I did this to better deal with fully dynamic buffers.\n\n  o Corrected the swedish texts. All 8bit letters were gone!\n\n  o (Nov 16) I recevied the 981013-b4 version. Started work.\n\n2.0b4\n====================\n\n  Kent:\n \n  o Date routine corrections.  \n\n       - Y2K capable. Hypermail used a two digit representation\n         for the year through out. It now uses a 4 digit representation.\n\n       - In hypermail.h, October was listed in monthdays as only having\n         30 days.\n\n       - hypermail did not deal with all the major date string formats. \n         Date: formats starting with a digit (09 Sep 1998 01:27:30 +0300)\n         would cause parsing and threading problems. It now supports\n         that format.\n\n       - Added code to deal correctly with two digit years.\n         The idea as to how to approach this and the basis for\n         the solution is thanks to Byron Darrah.\n\n       - Corrected an off by one day error in getyearsecs(). It was \n         adding the current day && adding the hours, minutes, and seconds \n         for that day as well. It only needed to count all the days UP TO\n         the current day and then add the hours, minutes, and seconds for\n         the current day.\n\n       - Incorrect data type passed to fprint_summary(), needed to be\n         long instead of int.\n\n       - Corrected an off by one day in getdatestr(). Days in a month\n         start at 1, not 0.\n\n \n  o Add the ability to save hypermail generated html files with any \n    configurable html suffix such as \".htm\", \".html\" or \".shtml\", etc.\n    This works for the index files as well as the message files. (New \n    .hmrc variable, hm_htmlsuffix, new environment variable HM_HTMLSUFFIX, \n    and HTMLSUFFIX define in options.h.)\n\n  o Removed a conditional \"if (use_mbox) increment = 0;\" that was \n    preventing the ability to read one message from a file and update \n    an existing archive and its indexes.\n\n  o Corrected parseurl to allow for a ',' (comma) character to be embedded\n    in the URL.\n\n  o Corrected parseurl to allow for a '&' (ampersand) character to be embedded\n    in the URL.\n\n  o Using -p with -iu on a new archive directory caused a core dump\n    begause 'bignum' was zero.  Corrected to assure bignum > 0.\n\n  o Added language abilities to hypermail. \n         English  - en\n         Spanish  - es\n         German   - de\n         Swedish  - se\n    initially supported. (lang.c and lang.h added.)\n\n    Thanks to Francisco Iacobelli <fiacobelli@ibersis.cl> for the\n    \"es\" message table translation.\n\n    Thanks to Martin Schulze <joey@kuolema.Infodrom.North.DE> for the\n    \"de\" message table translation.\n\n    Thanks to Daniel Stenberg <Daniel.Stenberg@sth.frontec.se> for the\n    \"se\" message table translation.\n\n  o Changed how error messages are displayed so options message\n    only displayed where appropriate instead of for every message.\n\n  o Corrected getname() to parse yet another funky name format.\n\n  o Corrected printing error when a invalid domain was encountered in\n    an email address.\n\n  o Converted some static internal buffers to dynamically allocated ones\n    at startup saving 6+K. Also resulted in setstrval() not being needed\n    so it was removed.\n\n  o Corrected MIME parsing problem with previously parsed headers.\n\n  o Corrected default labeling problem with stdin generated archives\n    when no label is supplied.\n\n  o Fixed hypermail so it would not crash if started with no arguments\n    and an article on stdin.\n\n  o Added locking to the archive so that there is less chance of corruption\n    of the archive due to multiple copies of hypermail trying to update\n    the same archive at the same time with multiple messages.  This could\n    be improved so as to check for pid of process that owns it...\n\n  o Extended the configure support.\n\n  o Extended the use of hm_progress so that more information about\n    attachment files can be displayed.\n\n  o Updated documentation to reflect changes\n\n  o Corrected getname to deal with names that are all spaces.\n\n  o Corrected configuration variable setting. Moved checks to the\n    right place in the code.\n\n  o Hypermail now supports listproc mailboxes as well as general Unix\n    formated mailboxes. It does not require that a blank line exists \n    between mail messsages in a mailbox. Thanks to Craig A Summerhill \n    <craig@cni.org> for the push and the test data.\n\n2.0b3  - 8/15/98 \n=================\n\n  o Added validation of domains so that the generation of mailto: is\n    much more accurate than the previous method.\n\n  o Added support for Content-Disposition MIME Header so as to get the\n    filename from the header.\n\n  o Added verification of filenames to assure they are safe to use and\n    will not cause filesystem problems\n\n  o Fixed a problem with parsing the ending MIME boundary (it expended headers\n    following that)\n\n  o Found and removed a one-byte buffer overflow in the line continuation code.\n\n  o Corrected docs/hypermail.1 and TODO to reflect the proper RFC 822\n    parsing was actually included in version 2.0b1\n\n  o Corrected a typo in string.c that prevented the proper generation \n    of mailto: links for email names with numbers [0-9] in them. \n\n  o Corrected the base64 decoder error which caused files to get an \n    extra zero-byte appended at times. (When storing attachments to disk.)\n\n  o Added additional ported systems to the README\n\n  o Removed the \"#ifndef\" from the defines in options.h. We do not want to\n    inherit any define values from other places. If there are confilcts\n    then I need to correct them. Inheriting defines can lead to unforeseen\n    results.\n\n  o attachments:\n       - comments are now generated in the output mail for each attachment \n         that is written in a separate file. The comment looks like:\n            '<!-- attachment=\"filename\" -->' in the standard comment style. \n\n  o buffers and overflows\n    - mdecodeRFC2047() now has an output buffer size argument\n    - had to remove the use of rmcr() at two places, since that function uses\n      a very strict static buffer limiting the maximum line length pretty bad.\n    - parseurl() now features an output buffer size argument\n    - parseemail() now features an output buffer size argument\n  \n  o multipart/alternative \n    - added awareness and parser \"intelligence\" to pick the last prefered\n      content-type within a series of alternatives (as MIME tells us to\n      do). This has not yet been very thoroughly tested.\n    - added the preferedcontent() function that returns wether a content-type\n      is prefered or not (as set with hm_prefered_types). Default prefered \n      type is 'text/plain' (if hm_prefered_types is unused).\n  \n  o output\n    - added the experiment function printhtml(). It strips off unwanted html\n      tags from the output, even if they are used in attached HTML files. I.e\n      <HTML> and </HTML>.\n    - made 'showheaders' not use <BR> or newlines since the BRs are ignored\n      anyway, and the newlines are already present in each header line.\n    - added 'hm_show_headers' which is a list of what headers to include when \n      the 'showheaders' option is used. For now, it also controls which \n      headers to show when attached mails are shown. Although I can imagine \n      that you'd like separate lists (since for attached mails, you'd like i.e\n      subject which you may not need for the main mail itself). If \n      'hm_show_headers' isn't used, all headers will be shown.\n    - made the <PRE> system in the printbody() function a little smarter, and\n      now it prevents multiple </PRE> and <P> tags better. It did however\n      introduce another side effect (although a less serious one imho) and \n      that is an extra pair of <PRE></PRE> after the last attachment when \n      using 'showhtml'.\n  \n  o parsing\n    - made the multi-line merger function to make all lines get a regular \n      white space between them when they're put together. Previously, this \n      character was left as-is, which could be a space or a tab (or any other \n      isspace()) letter.\n    - check changed to check for \"<!-- received\" as the start of parsing\n      previous html files in the event that the archive maintainer whishes\n      to add comments in the header template HTML files.\n    - in_list() now checks for list items case insensitive\n    - corrected so Message-ID:, References and Supersedes: lines are not\n      converted into mailto: URLs.\n    - corrected off-by-one in isquote that was causing array boundary read \n      errors.\n    - corrected off-by-one in printbody line output that was causing array\n      boundary read errors.\n\nReal thanks are in order for Daniel Stenberg and David D. Kilzer. They helped\ngreatly with making this release possible by sending in enhancements, comments\nand bug fixes.  Thanks Guys!\n  \n2.0b2  - 6/07/98 \n=================\n\n  o Corrected command line processing for individual messages received \n    on standard input.\n\n  o Corrected formating of Next message links when incremental updating \n    is done.\n\n  o Corrected the template filenames in docs/hmrc.html. Added \"file\" \n    to them.\n\n  o Added additional systems to the list of ported systems.\n\n  o Reset certain options back to the proper defaults.\n\n  o Corrected problem in printbody in regards to printing HTML embedded\n    in a message. Still work to do here.\n\n  o Changed address options to assure I didn't get landfield.com \n    information inadvertantly set in hundreds of archives because\n    the admins just took the defaults. ;)\n\n2.0b1  6/05/98 - Kent Landfield\n===============================\n\nWARNING: There have been too many changes to this version to list them\n         all here.  What appears below are some of the highlights.\n\n  o Command line settings override what is in the config file. In the\n    past the command line variables were read and set before the config\n    file was read. (Needed to get the name of the config file from the\n    command line.) This made it hard to have a default list configuration\n    file and make single runs with only one variable changed. Now processing\n    sets the hypermail internal options by:\n  \n  \tUsing Compiled in defaults specified in options.h,\n            then reads Hypermail Environment variables if set,\n            then looks for and reads any Configuration file specified\n        and finally uses the Command line settings specified by the user.\n\n    NOTE: THIS IS DIFFERENT THAN PAST HYPERMAIL USAGE.\n  \n  o Configurable Setting (.hmrc file) or Compile Time Variable to \n    Domain-ize Addresses -- addresses appearing in the RFC822 field \n    which lack hostname can't be made into proper HREFs when Hypermail\n    does it's thing.  They are coded with:  mailto:(no%20email)\n  \n    Because the MTA resides on the same host as the list, it is \n    often not require to domain-ize these addresses for delivery.\n    In such cases, I think it would nice if Hypermail could be \n    programmed to output:  mailto:kent@landfield.com  instead.\n    This would probably work well as a *required* definition \n    during compilation; however, it should not simply rely on \n    the output from `hostname` in case you want to override with \n    an MX entry or alternate domain (if you run virtual domains)\n  \n  o Added capability to have customizable index html headers, message\n    html headers and html footers.  Able to use substitution cookies in \n    the header and footer template files.\n  \n       Substitution cookies supported:\n  \n           %% - '%' character\n           %~ - storage directory\n           %e - email addr of message author - Not valid on index pages\n           %h - HMURL\n           %i - Message-id - Not valid on index pages\n           %l - archive label\n           %m - Mailto address\n           %p - PROGNAME\n           %s - Subject of message or Index Title\n           %v - VERSION\n           %u - Expanded version link (HMURL,PROGNAME,VERSION)\n           \\n - newline character\n           \\t - tab character\n  \n       Additional cookies generate the complete META lines:\n  \n           %A - Author META HTML - Not valid on index pages\n                  <META NAME=\"Author\" CONTENT=\"name (email)\">\n           %B - <BODY> html statement\n           %S - Subject META TAG - Not valid on index pages\n                  <META NAME=\"Subject\" CONTENT=\"subject\">\n  \n  o Generates META tags in articles Author and Subject.\n  \n  o Now uses \"configure\" to generate the makefiles. This is rather\n    weak at present and needs to be added to/tested on other systems\n    but at least it's a start.\n  \n  o The config.h was renamed to options.h to support configure usage.\n  \n  o patchlevel.h added to facilitate better patches in the future. Still\n    need to fully integrate it's useage in version displays.\n  \n  o Added example .rc files to show how to customize list's and their\n    looks. \n  \n  o Removed the _print.c files that had existed in the 103b2 release and \n    replaced them with template headers/footer files. \n  \n  o Extended archive path creation to make missing directories.\n  \n  o Added capabilities dir pathing to allow archive creation by date \n    variables.\n   \n        %d - two digit day of month (1-28/30/31)\n        %D - three letter day of the week\n        %m - two digit month of year (1-12)\n        %M - three letter month of year (Jan, Feb, ..., Dec)\n        %y - four digit year (1990,..2001)\n  \n    RC example:           hm_dir = /some/archive/listname/%y/%M\n    ENV example:          HM_DIR=/some/archive/listname/%y/%M\n    Command line example: -d /some/archive/listname/%y/%M\n  \n    Expands to:  /some/archive/listname/1998/May\n  \n    All files would be archived during that run in that directory.\n    Subsequent executions will put the messages in the directories \n    according to the date the messages were received on the archive \n    site.\n  \n  o All \"mailto:\" links can include the \"subject\" so that the Subject: \n    line of netscape mailer is automatically filled in.\n  \n  o Fixed \"Re:\" and redundant \"Re:\" variation && MS FW... \n  \n  o Greatly enhanced getname() to correctly deal with most all email \n    addresses.  X.400 addresses are not well supported yet. \n  \n  o Corrected getreply() to better support the In-Reply-To: formats. The \n    routine needs to revisited when a readline routine is inserted to\n    properly deal with continuation lines.\n  \n  o Added additional documentation describing the Hypermail configuration \n    file.\n\n  o Added additional documentation describing how to customize HTML \n    generated pages.\n  \n  o Corrected many petty problems such as:\n     - recursive '%' substitution.  A % in a subject line could cause \n       an ugly recursion problem in a mail command expansion.\n     - title length problem.  Length of a title needs to be limited to \n       less than 64 characters as indicated by HTML specs.\n     - Weblinted the generated output and corrected various things.\n     - Removed unused and unneeded variables\n\n  o Change various storage length defines in hypermail.h\n\nPatches Contributed From: \"Roy T. Fielding\" <fielding@kiwi.ics.uci.edu>\n------------------------------------------------------------------------\n\n  o Fixed the umask default,\n  \n  o Fixed default directory and file creation modes,\n  \n  o Fixed the many date problems, \n  \n  o Corrected one of the Message-ID bugs, \n  \n  o Removed annoying #start/#end fragments that mess up the browser history.\n\nPatches Contributed By: Byron Darrah <bdarr@sed.hac.com>\n----------------------------------------------------------\n\n  o Added a menu bar for a header and footer on all pages and removed \n    the bulleted list items that it replaces.  \n  \n  o Reworked the general appearance of header and footer parts of html pages.\n  \n  o Added the \"hm_hmail\" configuration parameter and -n command line\n    option for specifying an email address for input to a hypermail\n    archive.\n  \n  o Added \"New Message\" and \"Reply\" buttons to the menu bar for submitting\n    messages to a hypermail based list.\n  \nPatches Contributed From: Jared Reisinger <feety@hhhh.org>\n---------------------------------------------------------\n\n  o Fixed configfile substring problem.  \n  \n  o SHOWBR, IQUOTES, SHOWHR, EURODATE, SHOWREPLIES, and MAILCOMMAND \n    now run-time configurable.  \n  \n  o Fixed post leap-day error.  \n  \n  o More robust Message-ID parsing.  \n  \n  o Better SHOWHTML handling for indented lines.  \n  \n  o Allow IQUOTES when not using SHOWHTML.\n\nPatches Contributed From: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>\n--------------------------------------------------------------------------\n\n  o I had all calls to the decodeRFC2047() function moved to *after* the\n    merging of long lines.\n  \n  o decodeRFC2047() now correctly concatenates two succeeding \"encoded words\".\n    I now call the function mdecodeRfc2047() since it now allocates the new\n    string.\n  \n  o Now informs if the attachment wasn't properly decoded when stored to disk.\n    This happens if the Content-Transfer-Encoding specified isn't known to\n    the parser. When this happens, the attachment is stored as 8bit octet-\n    stream.\n  \n  o Now supports the encoding type 'x-uue' for uudecoding. I think there are\n    mailers that use different names for the same encoding type so we better\n    watch out for them in the future...\n  \n  o Added the 'demimed' field to the body struct to keep track of \n    header lines+ that have been RFC2047 converted already.\n  \n  o Kent Landfield sent me an interesting mail that showed me several weird\n    bugs in the MIME area.\n     A. The Quoted-Printable decoder bugged. A quick fix solved that.\n     B. The quoted printable decoder didn't support unlimited size of the line\n        the encoded text decodes into. I wrote a new function that seems to do\n        it properly.\n     C. Some important headers were not properly supported if they were split\n        up on several lines. I had to rewrite the header parsing system to make\n        this work. It now scans all headers and concatenate them into single\n        lines before any function is trying to parse or decode them.\n     D. It also showed a need for a uudecoder for the 'x-uue' encode type. This\n        is only noted for the future as I haven't written any decoder for this\n        format [yet].\n  \n  o decodeRFC2047 replaces the former RFC1522 function. I made it support\n    'encoded-words' anywhere in the line and several different ones on the\n    same line is now supported. The only flaw I'm still aware of now, is that\n    if there are two encoded-words next to each other, the result should not\n    show the spaces between them. My function unfortunately still does.\n  \n  o renamed decodeRFC1522 to decodeRFC2045.\n  \n  o decodeRFC1522 (quoted printable header decoding) didn't do well if the\n    ending ?= sequence was in the middle of the line. I think this function\n    will need more extensive testing.\n  \n  o Attached mails' headers (To:, From:, Date: and Subject:) are now shown\n    in the html.\n  \n  o Attached mails that contains attachments did force me to add a stack system\n    for the multipart boundary strings. Seems to work now. (Can't wait to see\n    an attached mail that contains an attached mail that contains ... )\n  \n  o strcpymax() introduced to prevent buffer overflows on extra-long headers\n  \n  o Lines starting with 'from ' messed up the parser pretty badly. It now\n    checks for 'From ' lines (case sensitive) with an empty preceding line\n    to split mails.\n  \n  o Now extracts attachments to separate binary files.\n  \n  o Supports multiple lined headers.\n  \n  o Supports quoted-printable and base64 encoded headers.\n  \n  o Supports base64 encoded text/plain\n  \n  o Rewrote the URL and email parsing to allow multiple URLs and email\n    addresses on each line.\n  \n  o Extended the original functionality to much better deal with MIMEd\n    mails and the standards from RFC 1521 and 1522. There are still flaws in\n    compliance with those but the majority of all mails using mimed texts\n    will be presented in a fairly decent fashion.\n\nPatches Contributed From: David D Kilzer <ddkilzer@ti.com>\n-----------------------------------------------------------\n\n  o Fixed problem with 'From: ' header lines in messages with the\n    following format: \"From: <email@address.com>\" wherein the \"name\"\n    from the previous email message would be used instead of reverting\n    to the address itself.\n\n  o URLs can now include ampersands (&) if they are preceded by question\n    marks (?) in the URL string.\n\n  o Email messages with no Subject line no longer grab the previous\n    email's subject.\n\n  o Reworked the order of output so that \"message\" links are always at\n    the top of the page in article pages and date/thread/subject/author\n    pages.\n\n  o Now escape '%' in mail URLs.\n\n  o Escape for '+' was wrong, changed to '%2B' (was '%22').\n\n  o Updated replace() function to recurse on 'afterstring' variable\n    rather than the whole 'newstring'.  More efficient and allows '%'\n    escaping.\n\n  o config.h: Added configuration option for SHOW_MESSAGE_LINKS which\n    turns all message headers and footers off (except for the links to\n    the date, subject, thread and author pages).  SHOW_MESSAGE_LINKS\n    overrides the setting of SHOWREPLIES.\n\n  o print.c (writearticles): Removed use of currentemail, currentid,\n    and currentsubject by forcing use of email2, msgid2, inreply2,\n    subject2, and name2 when calling struct.c (hashreplylookup).  This\n    was needed after I rearranged the order in which articles were\n    printed.\n\n  o string.c (convurls): Added code in two locations for the \n    Message-Id code segment to recurse on the remaining portion of the\n    line being processed.  Each Message-Id found forces a return from\n    convurls() after a recursive call.  This prevents infinite recursion\n    (a Bad Thing generally speaking).  Note: we assume that Message-Ids\n    and URLs/email addresses do NOT appear in the same line.\n\n  o string.c (convurls): Changed format string from \"%.3d\" to \"%.4d\".\n    Fixed major bug in outputting links for Message-Ids.\n\n  o string.c (convurls): Fixed assumption in code for identifying\n    Message-Ids that there was only one Message-Id per line.  We now\n    stop gobbling up text used for a link with a space (' ') or a tab\n    ('\\t').\n\n  o string.c (convurls): Added int got_question_mark in URL processing\n    code to permit an ampersand ('&') in a URL provided it comes after a\n    question mark in the same URL (a GET method with POST data).  Added\n    one line of code and changed another to accomplish this.\n\n  o string.c (convurls): Added code to check whether the next item to\n    URL-ize is an email address (containing an at sign, '@').  If it is,\n    we break out of the URL for loop and go process the email address.\n\n  o parse.c (loadoldheaders): Modified initial fgets() call to skip any\n    non-comment lines (i.e. \"<html>\" and \"<head>\").\n\n  o string.c (makemailcommand): Added code to escape percent signs \n    ('%') when escaping spaces (' ') and plus signs ('+').  Percent \n    signs must be escaped first since other escape sequences use the\n    percent sign followed by a two-digit hexadecimal number.  We're now\n    a little more MIME-compliant.\n\n  o string.c (replace): Changed the replace() function to recurse only\n    on the 'afterstring' portion of the URL instead of the whole rebuilt\n    URL.  This is both more efficient and prevents infinite recursion\n    problems when escaping percent signs ('%') with '%25'.  \n\n  o string.c (makemailcommand): Fixed escape sequence for plus signs\n    ('+') from '%22' to '%2B'.\n\nLOTS of other small patches from lots of other helpful people. I hope to \nbe able to more accurately list them in the final 2.0 version.\n\n1.03b2  3/10/98 - Kent Landfield\n=================================\n\n  o Header corrections made, \n\n  o all current memory leaks plugged, \n\n  o variable initialization corrected, \n\n  o expanded response message recognition, \n\n  o fixed many threading related bugs. \n\n  o Restructuring directory layout for ease of support and to \n    make adding utilities easier. \n\n  o Added additional archive utilities. \n\n1.03b1  4/6/97 - Kent Landfield\n================================\n\n  o Corrected memory leaks, \n\n  o cleaned up HTML produced, \n\n  o ran purify, lint and insight and cleaned up output.  \n\n  o Added the ability to customize header/footers via crude means\n    but hey, it works.\n\n1.02  8/1/94 - Kevin Hughes\n============================\n        Fixed configfile problem, different usage() output, days[] space\n        fix, NODATE, stripzone() fix, insig fix, SHOWBR, SHOWHR, IQUOTES,\n        THRDLEVELS.\n\n1.01  7/29/94 - Kevin Hughes\n============================\n        Printfooter declaration, getdate() and timezone names changed\n        to avoid library conflicts. Bad #define fixed (null) bug.\n\n1.0   7/29/94 - Kevin Hughes\n============================\n        Configuration file, logic fixes, better \"re:\" stripping,\n        name tags, default index.html (HM_DEFAULTINDEX), default\n        directory name can be mailbox name, mailto: fix, better dates,\n        better error messages, numbered files are padded to four digits,\n        headers are always in <pre>, next in thread, maybe in reply and\n        maybe reply, MAILCOMMAND, EURODATE, commented source, chmods only\n        new files, <html>, custom mail command variables.\n\n1.0b3 7/14/94 - Kevin Hughes\n============================\n        Environment variables added, ampersands are converted.\n\n1.0b2 7/13/94 - Kevin Hughes\n============================\n        Incremental updating added and various parsing bugs fixed.\n\n1.0b1 7/6/94 - Kevin Hughes\n============================\n        Hypermail rewritten in C. Because the source is so new and\n        relatively untested, it's still considered to be in beta\n        until feedback from users is received.\n"
  },
  {
    "path": "FILES",
    "content": "# \n# FILES: Automatically generated by mkFILES: \n#          - Wed Mar 20 19:50:32 CET 2013 \n# \n##################\n# Top-level files \n# \nChangelog\nCOPYING\nKNOWN_BUGS\nFILES\nINSTALL\nMakefile.in\nREADME\nTODO\nUPGRADE\nacconfig.h\naclocal.m4\nconfig.guess\nconfig.h.in\nconfig.sub\nconfigure\nconfigure.ac\ninstall-sh\nltmain.sh\nmaketgz\npatchlevel.h\n# \n#  - Archive directory files\n# \narchive/.indent.pro\narchive/1998\narchive/Makefile.in\narchive/README\narchive/lists.h\narchive/mbox2hypermail.c\narchive/msg2archive.c\narchive/runtest\narchive/test-msg\n# \n#  - Sample configs\n# \nconfigs/hmrc.example\nconfigs/hypermail-footer.hyp\nconfigs/hypermail-index.hyp\nconfigs/hypermail-msg.hyp\nconfigs/hypermail.rc\n# \n#  - Contributed utilities\n# \ncontrib/hoaf-28/haof-0.1.dtd\ncontrib/hoaf-28/README\ncontrib/hoaf-28/collect_snipplets.py\ncontrib/hoaf-28/create_archive_snipplet.py\ncontrib/hoaf-28/footer_html.hdr\ncontrib/hoaf-28/hypermail-2b28-2b28+.patch\ncontrib/hoaf-28/top_html.hdr\ncontrib/canonicalize.pl\ncontrib/cron_hypermail\ncontrib/fixhtime.pl\ncontrib/hyperfeed.pl\ncontrib/hypetombox.pl\ncontrib/ls2mail\ncontrib/mailbox_date_trimmer/README.html\ncontrib/mailbox_date_trimmer/README.mailbox_reader\ncontrib/mailbox_date_trimmer/mailbox_date_trimmer.py\ncontrib/mailbox_date_trimmer/mailbox_reader.py\ncontrib/msg2hypermailarchive.py\ncontrib/runtest\n# \n#  - Documentation\n# \ndocs/Makefile.in\ndocs/archive_search.html\ndocs/attachments.txt\ndocs/customizing.html\ndocs/hmrc.4\ndocs/hmrc.html\ndocs/hr.yellow.png\ndocs/hypermail-faq.html\ndocs/hypermail.1\ndocs/hypermail.html\ndocs/hypermail.png\ndocs/index_hypermail.txt\ndocs/stars.png\n# \n#  - LCC-Win32 Build Support\n# \nlcc/README.txt\nlcc/pcre_chartables.c\nlcc/config.h\nlcc/pcre_config.h\nlcc/defaults.h\nlcc/dirent.c\nlcc/dirent.h\nlcc/getdate.c\nlcc/hypermail_files.txt\nlcc/lcc_extras.c\nlcc/lcc_extras.h\nlcc/pcre.h\n# \n# libcgi - mail suport lib \n# \nlibcgi/.indent.pro\nlibcgi/Makefile.in\nlibcgi/cgi.h\nlibcgi/form_ent.c\nlibcgi/form_tags.c\nlibcgi/get_cgi_info.c\nlibcgi/html.c\nlibcgi/libcgi.html\nlibcgi/main.c\nlibcgi/mcode.c\nlibcgi/strops.c\nlibcgi/syn_mime.c\nlibcgi/syn_url.c\nlibcgi/template.c\n# \n#  - Hypermail source\n# \nsrc/.indent.pro\nsrc/.splintrc\nsrc/Makefile.in\nsrc/base64.c\nsrc/base64.h\nsrc/date.c\nsrc/defaults.h.in\nsrc/dmatch.c\nsrc/dmatch.h\nsrc/domains.c\nsrc/domains.h\nsrc/file.c\nsrc/finelink.c\nsrc/finelink.h\nsrc/getdate.h\nsrc/getdate.texi\nsrc/getdate.y\nsrc/getname.c\nsrc/getname.h\nsrc/hypermail.c\nsrc/hypermail.h\nsrc/lang.c\nsrc/lang.h\nsrc/lock.c\nsrc/mail.c\nsrc/mem.c\nsrc/parse.c\nsrc/parse.h\nsrc/print.c\nsrc/print.h\nsrc/printfile.c\nsrc/printfile.h\nsrc/proto.h\nsrc/quotes.c\nsrc/search.c\nsrc/search.h\nsrc/setup.c\nsrc/setup.h\nsrc/string.c\nsrc/struct.c\nsrc/struct.h\nsrc/threadprint.c\nsrc/threadprint.h\nsrc/txt2html.c\nsrc/txt2html.h\nsrc/uconvert.h\nsrc/uudecode.c\nsrc/uudecode.h\n# \n#  - Source to pcre supporting library\n# \nsrc/pcre\nsrc/pcre/pcre_dfa_exec.c\nsrc/pcre/PrepareRelease\nsrc/pcre/pcre32_jit_compile.c\nsrc/pcre/pcre_ord2utf8.c\nsrc/pcre/pcre_maketables.c\nsrc/pcre/makevp.bat\nsrc/pcre/config.h.in\nsrc/pcre/pcre32_byte_order.c\nsrc/pcre/pcre_newline.c\nsrc/pcre/compile\nsrc/pcre/pcre32_printint.c\nsrc/pcre/pcre.h.generic\nsrc/pcre/pcre32_ord2utf32.c\nsrc/pcre/pcre32_fullinfo.c\nsrc/pcre/pcre16_valid_utf16.c\nsrc/pcre/pcre_study.c\nsrc/pcre/sljit\nsrc/pcre/sljit/sljitNativeTILEGX-encoder.c\nsrc/pcre/sljit/sljitNativeMIPS_32.c\nsrc/pcre/sljit/sljitNativeARM_T2_32.c\nsrc/pcre/sljit/sljitUtils.c\nsrc/pcre/sljit/sljitNativeMIPS_common.c\nsrc/pcre/sljit/sljitNativePPC_64.c\nsrc/pcre/sljit/sljitLir.c\nsrc/pcre/sljit/sljitNativeX86_32.c\nsrc/pcre/sljit/sljitLir.h\nsrc/pcre/sljit/sljitNativeTILEGX_64.c\nsrc/pcre/sljit/sljitNativeX86_64.c\nsrc/pcre/sljit/sljitNativeSPARC_common.c\nsrc/pcre/sljit/sljitNativePPC_32.c\nsrc/pcre/sljit/sljitConfigInternal.h\nsrc/pcre/sljit/sljitExecAllocator.c\nsrc/pcre/sljit/sljitConfig.h\nsrc/pcre/sljit/sljitNativePPC_common.c\nsrc/pcre/sljit/sljitNativeARM_32.c\nsrc/pcre/sljit/sljitNativeSPARC_32.c\nsrc/pcre/sljit/sljitNativeX86_common.c\nsrc/pcre/sljit/sljitNativeMIPS_64.c\nsrc/pcre/sljit/sljitNativeARM_64.c\nsrc/pcre/pcre16_tables.c\nsrc/pcre/pcre_tables.c\nsrc/pcre/pcre32_string_utils.c\nsrc/pcre/pcre_stringpiece.h.in\nsrc/pcre/libpcre16.pc.in\nsrc/pcre/pcreposix.c\nsrc/pcre/pcre32_config.c\nsrc/pcre/pcre_printint.c\nsrc/pcre/pcre_jit_test.c\nsrc/pcre/pcre16_newline.c\nsrc/pcre/CMakeLists.txt\nsrc/pcre/CheckMan\nsrc/pcre/pcreposix.h\nsrc/pcre/pcre16_refcount.c\nsrc/pcre/Makefile.in\nsrc/pcre/config.sub\nsrc/pcre/pcre32_ucd.c\nsrc/pcre/pcre16_version.c\nsrc/pcre/makevp_l.txt\nsrc/pcre/pcre32_valid_utf32.c\nsrc/pcre/pcre16_study.c\nsrc/pcre/pcre16_exec.c\nsrc/pcre/COPYING\nsrc/pcre/pcre16_ord2utf16.c\nsrc/pcre/pcre_valid_utf8.c\nsrc/pcre/pcre32_version.c\nsrc/pcre/AUTHORS\nsrc/pcre/pcre16_jit_compile.c\nsrc/pcre/depcomp\nsrc/pcre/pcre_stringpiece.cc\nsrc/pcre/pcre16_dfa_exec.c\nsrc/pcre/HACKING\nsrc/pcre/pcre32_get.c\nsrc/pcre/pcre32_newline.c\nsrc/pcre/pcre16_config.c\nsrc/pcre/pcre16_string_utils.c\nsrc/pcre/pcre32_exec.c\nsrc/pcre/pcre_xclass.c\nsrc/pcre/pcre_exec.c\nsrc/pcre/makevp_c.txt\nsrc/pcre/m4\nsrc/pcre/m4/pcre_visibility.m4\nsrc/pcre/m4/ltversion.m4\nsrc/pcre/m4/ltsugar.m4\nsrc/pcre/m4/ax_pthread.m4\nsrc/pcre/m4/lt~obsolete.m4\nsrc/pcre/m4/ltoptions.m4\nsrc/pcre/m4/libtool.m4\nsrc/pcre/pcregexp.pas\nsrc/pcre/cmake\nsrc/pcre/cmake/COPYING-CMAKE-SCRIPTS\nsrc/pcre/cmake/FindPackageHandleStandardArgs.cmake\nsrc/pcre/cmake/FindEditline.cmake\nsrc/pcre/cmake/FindReadline.cmake\nsrc/pcre/pcre_ucd.c\nsrc/pcre/missing\nsrc/pcre/pcre32_dfa_exec.c\nsrc/pcre/pcre_scanner_unittest.cc\nsrc/pcre/LICENCE\nsrc/pcre/configure\nsrc/pcre/pcre_compile.c\nsrc/pcre/ucp.h\nsrc/pcre/pcretest.c\nsrc/pcre/INSTALL\nsrc/pcre/pcre32_globals.c\nsrc/pcre/pcre16_printint.c\nsrc/pcre/config.guess\nsrc/pcre/pcre16_globals.c\nsrc/pcre/libpcre32.pc.in\nsrc/pcre/CleanTxt\nsrc/pcre/testdata\nsrc/pcre/testdata/testinput5\nsrc/pcre/testdata/testoutput5\nsrc/pcre/testdata/saved8\nsrc/pcre/testdata/grepfilelist\nsrc/pcre/testdata/testoutput20\nsrc/pcre/testdata/testoutput3A\nsrc/pcre/testdata/testoutput26\nsrc/pcre/testdata/testoutput16\nsrc/pcre/testdata/testinput10\nsrc/pcre/testdata/saved16\nsrc/pcre/testdata/greplist\nsrc/pcre/testdata/testoutput4\nsrc/pcre/testdata/testinput21\nsrc/pcre/testdata/testinput25\nsrc/pcre/testdata/testoutput21-16\nsrc/pcre/testdata/testoutput12\nsrc/pcre/testdata/saved32BE-1\nsrc/pcre/testdata/grepoutput\nsrc/pcre/testdata/saved32\nsrc/pcre/testdata/testinput23\nsrc/pcre/testdata/testoutput15\nsrc/pcre/testdata/testinput24\nsrc/pcre/testdata/testoutput11-8\nsrc/pcre/testdata/grepinput\nsrc/pcre/testdata/saved16BE-1\nsrc/pcre/testdata/testinput3\nsrc/pcre/testdata/saved32BE-2\nsrc/pcre/testdata/testinput20\nsrc/pcre/testdata/testinput15\nsrc/pcre/testdata/testinputEBC\nsrc/pcre/testdata/testinput17\nsrc/pcre/testdata/testoutput22-16\nsrc/pcre/testdata/testoutput25\nsrc/pcre/testdata/wintestoutput3\nsrc/pcre/testdata/testinput7\nsrc/pcre/testdata/testoutput11-32\nsrc/pcre/testdata/grepinput8\nsrc/pcre/testdata/saved32LE-1\nsrc/pcre/testdata/testoutput23\nsrc/pcre/testdata/testoutput18-16\nsrc/pcre/testdata/wintestinput3\nsrc/pcre/testdata/testinput11\nsrc/pcre/testdata/testoutputEBC\nsrc/pcre/testdata/saved16LE-2\nsrc/pcre/testdata/testinput1\nsrc/pcre/testdata/saved16LE-1\nsrc/pcre/testdata/grepinputx\nsrc/pcre/testdata/grepoutput8\nsrc/pcre/testdata/testoutput24\nsrc/pcre/testdata/testoutput19\nsrc/pcre/testdata/testoutput6\nsrc/pcre/testdata/testinput9\nsrc/pcre/testdata/testoutput3B\nsrc/pcre/testdata/grepbinary\nsrc/pcre/testdata/grepinputv\nsrc/pcre/testdata/testoutput14\nsrc/pcre/testdata/testinput8\nsrc/pcre/testdata/testinput6\nsrc/pcre/testdata/testoutput21-32\nsrc/pcre/testdata/testinput13\nsrc/pcre/testdata/testoutput17\nsrc/pcre/testdata/testinput2\nsrc/pcre/testdata/testoutput18-32\nsrc/pcre/testdata/testinput16\nsrc/pcre/testdata/testoutput8\nsrc/pcre/testdata/valgrind-jit.supp\nsrc/pcre/testdata/grepoutputN\nsrc/pcre/testdata/testoutput7\nsrc/pcre/testdata/testoutput3\nsrc/pcre/testdata/testoutput1\nsrc/pcre/testdata/testoutput2\nsrc/pcre/testdata/testoutput22-32\nsrc/pcre/testdata/greppatN4\nsrc/pcre/testdata/testinput14\nsrc/pcre/testdata/testinput18\nsrc/pcre/testdata/testoutput10\nsrc/pcre/testdata/testoutput11-16\nsrc/pcre/testdata/saved16BE-2\nsrc/pcre/testdata/saved32LE-2\nsrc/pcre/testdata/testinput22\nsrc/pcre/testdata/testinput19\nsrc/pcre/testdata/grepinput3\nsrc/pcre/testdata/testinput4\nsrc/pcre/testdata/testoutput9\nsrc/pcre/testdata/testoutput13\nsrc/pcre/testdata/testinput12\nsrc/pcre/testdata/testinput26\nsrc/pcre/pcre32_study.c\nsrc/pcre/aclocal.m4\nsrc/pcre/pcre32_refcount.c\nsrc/pcre/pcre_stringpiece_unittest.cc\nsrc/pcre/pcre_jit_compile.c\nsrc/pcre/test-driver\nsrc/pcre/pcre32_compile.c\nsrc/pcre/ChangeLog\nsrc/pcre/pcre_globals.c\nsrc/pcre/Detrail\nsrc/pcre/pcre_string_utils.c\nsrc/pcre/pcre32_maketables.c\nsrc/pcre/pcre_chartables.c.dist\nsrc/pcre/libpcrecpp.pc.in\nsrc/pcre/pcre32_xclass.c\nsrc/pcre/dftables.c\nsrc/pcre/pcredemo.c\nsrc/pcre/config-cmake.h.in\nsrc/pcre/pcrecpparg.h.in\nsrc/pcre/config.h.generic\nsrc/pcre/RunGrepTest\nsrc/pcre/pcre32_utf32_utils.c\nsrc/pcre/pcre_internal.h\nsrc/pcre/ar-lib\nsrc/pcre/ltmain.sh\nsrc/pcre/pcre16_xclass.c\nsrc/pcre/pcre16_maketables.c\nsrc/pcre/pcre_fullinfo.c\nsrc/pcre/configure.ac\nsrc/pcre/132html\nsrc/pcre/pcre_get.c\nsrc/pcre/pcre16_fullinfo.c\nsrc/pcre/NEWS\nsrc/pcre/pcre16_ucd.c\nsrc/pcre/pcre_scanner.h\nsrc/pcre/pcregrep.c\nsrc/pcre/libpcreposix.pc.in\nsrc/pcre/pcre32_chartables.c\nsrc/pcre/pcre32_tables.c\nsrc/pcre/pcre_version.c\nsrc/pcre/pcre-config.in\nsrc/pcre/pcre16_chartables.c\nsrc/pcre/perltest.pl\nsrc/pcre/pcrecpp_internal.h\nsrc/pcre/libpcre.pc.in\nsrc/pcre/pcrecpp.h\nsrc/pcre/pcrecpp_unittest.cc\nsrc/pcre/pcre16_get.c\nsrc/pcre/pcre16_utf16_utils.c\nsrc/pcre/Makefile.am\nsrc/pcre/pcrecpp.cc\nsrc/pcre/pcre16_byte_order.c\nsrc/pcre/README\nsrc/pcre/pcre_scanner.cc\nsrc/pcre/NON-AUTOTOOLS-BUILD\nsrc/pcre/pcre_config.c\nsrc/pcre/pcre_byte_order.c\nsrc/pcre/RunTest.bat\nsrc/pcre/pcre.h.in\nsrc/pcre/NON-UNIX-USE\nsrc/pcre/doc\nsrc/pcre/doc/pcrebuild.3\nsrc/pcre/doc/pcre_get_substring_list.3\nsrc/pcre/doc/pcre_free_study.3\nsrc/pcre/doc/pcrelimits.3\nsrc/pcre/doc/pcre_get_stringnumber.3\nsrc/pcre/doc/pcre_jit_exec.3\nsrc/pcre/doc/pcre16.3\nsrc/pcre/doc/pcre-config.txt\nsrc/pcre/doc/perltest.txt\nsrc/pcre/doc/pcretest.1\nsrc/pcre/doc/pcrematching.3\nsrc/pcre/doc/pcre_jit_stack_alloc.3\nsrc/pcre/doc/pcreprecompile.3\nsrc/pcre/doc/pcre_dfa_exec.3\nsrc/pcre/doc/pcre_pattern_to_host_byte_order.3\nsrc/pcre/doc/pcre_compile.3\nsrc/pcre/doc/pcredemo.3\nsrc/pcre/doc/pcre_utf16_to_host_byte_order.3\nsrc/pcre/doc/pcre_study.3\nsrc/pcre/doc/pcrecallout.3\nsrc/pcre/doc/pcre_version.3\nsrc/pcre/doc/pcre_utf32_to_host_byte_order.3\nsrc/pcre/doc/pcre_jit_stack_free.3\nsrc/pcre/doc/pcrecpp.3\nsrc/pcre/doc/pcregrep.1\nsrc/pcre/doc/pcre_assign_jit_stack.3\nsrc/pcre/doc/pcre_exec.3\nsrc/pcre/doc/pcre-config.1\nsrc/pcre/doc/pcrepattern.3\nsrc/pcre/doc/pcre_get_stringtable_entries.3\nsrc/pcre/doc/pcre_free_substring.3\nsrc/pcre/doc/pcre_get_substring.3\nsrc/pcre/doc/pcrepartial.3\nsrc/pcre/doc/pcre.3\nsrc/pcre/doc/pcreunicode.3\nsrc/pcre/doc/pcretest.txt\nsrc/pcre/doc/pcre_copy_named_substring.3\nsrc/pcre/doc/pcre_maketables.3\nsrc/pcre/doc/pcreapi.3\nsrc/pcre/doc/pcre.txt\nsrc/pcre/doc/pcre_copy_substring.3\nsrc/pcre/doc/pcre_config.3\nsrc/pcre/doc/pcre32.3\nsrc/pcre/doc/pcrestack.3\nsrc/pcre/doc/pcre_compile2.3\nsrc/pcre/doc/pcrecompat.3\nsrc/pcre/doc/pcreposix.3\nsrc/pcre/doc/pcre_refcount.3\nsrc/pcre/doc/pcre_fullinfo.3\nsrc/pcre/doc/pcregrep.txt\nsrc/pcre/doc/pcresample.3\nsrc/pcre/doc/pcresyntax.3\nsrc/pcre/doc/pcre_get_named_substring.3\nsrc/pcre/doc/index.html.src\nsrc/pcre/doc/pcrejit.3\nsrc/pcre/doc/html\nsrc/pcre/doc/html/pcre_free_substring_list.html\nsrc/pcre/doc/html/pcre_assign_jit_stack.html\nsrc/pcre/doc/html/pcre_config.html\nsrc/pcre/doc/html/pcre16.html\nsrc/pcre/doc/html/pcrelimits.html\nsrc/pcre/doc/html/pcrejit.html\nsrc/pcre/doc/html/pcre-config.html\nsrc/pcre/doc/html/pcre_jit_exec.html\nsrc/pcre/doc/html/pcre_refcount.html\nsrc/pcre/doc/html/pcrepartial.html\nsrc/pcre/doc/html/pcreunicode.html\nsrc/pcre/doc/html/index.html\nsrc/pcre/doc/html/pcre_exec.html\nsrc/pcre/doc/html/pcre_fullinfo.html\nsrc/pcre/doc/html/pcrecompat.html\nsrc/pcre/doc/html/pcreapi.html\nsrc/pcre/doc/html/pcre_get_stringnumber.html\nsrc/pcre/doc/html/pcre_get_substring.html\nsrc/pcre/doc/html/pcrecpp.html\nsrc/pcre/doc/html/pcrecallout.html\nsrc/pcre/doc/html/pcre_free_study.html\nsrc/pcre/doc/html/pcre_pattern_to_host_byte_order.html\nsrc/pcre/doc/html/pcreprecompile.html\nsrc/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt\nsrc/pcre/doc/html/pcrematching.html\nsrc/pcre/doc/html/pcre_get_stringtable_entries.html\nsrc/pcre/doc/html/pcre_jit_stack_alloc.html\nsrc/pcre/doc/html/pcre_free_substring.html\nsrc/pcre/doc/html/pcre_version.html\nsrc/pcre/doc/html/pcresyntax.html\nsrc/pcre/doc/html/pcre_jit_stack_free.html\nsrc/pcre/doc/html/pcretest.html\nsrc/pcre/doc/html/pcre_utf16_to_host_byte_order.html\nsrc/pcre/doc/html/pcre_maketables.html\nsrc/pcre/doc/html/pcrestack.html\nsrc/pcre/doc/html/pcre_copy_substring.html\nsrc/pcre/doc/html/pcreposix.html\nsrc/pcre/doc/html/README.txt\nsrc/pcre/doc/html/pcrepattern.html\nsrc/pcre/doc/html/pcre_get_named_substring.html\nsrc/pcre/doc/html/pcrebuild.html\nsrc/pcre/doc/html/pcresample.html\nsrc/pcre/doc/html/pcre.html\nsrc/pcre/doc/html/pcre_study.html\nsrc/pcre/doc/html/pcre_copy_named_substring.html\nsrc/pcre/doc/html/pcre_compile.html\nsrc/pcre/doc/html/pcre_compile2.html\nsrc/pcre/doc/html/pcregrep.html\nsrc/pcre/doc/html/pcre32.html\nsrc/pcre/doc/html/pcre_utf32_to_host_byte_order.html\nsrc/pcre/doc/html/pcredemo.html\nsrc/pcre/doc/html/pcre_get_substring_list.html\nsrc/pcre/doc/html/pcre_dfa_exec.html\nsrc/pcre/doc/html/pcreperform.html\nsrc/pcre/doc/pcreperform.3\nsrc/pcre/doc/pcre_free_substring_list.3\nsrc/pcre/pcre_refcount.c\nsrc/pcre/pcre16_compile.c\nsrc/pcre/install-sh\nsrc/pcre/RunTest\n# \n#  - Source to ctrio supporting library\n# \nsrc/trio\nsrc/trio/hypermail-patches.diff\nsrc/trio/triodef.h\nsrc/trio/README\nsrc/trio/README.hypermail\nsrc/trio/install-sh\nsrc/trio/strio.h\nsrc/trio/compare.c\nsrc/trio/autogen.sh\nsrc/trio/Makefile.in\nsrc/trio/trio.h\nsrc/trio/trio.c\nsrc/trio/regression.c\nsrc/trio/triop.h\nsrc/trio/CHANGES\nsrc/trio/configure.in\nsrc/trio/trionan.c\nsrc/trio/configure\nsrc/trio/triostr.c\nsrc/trio/triostr.h\nsrc/trio/trionan.h\nsrc/trio/FILES\n# \n#  - Source to fnv supporting library\n# \nsrc/fnv/Makefile.in\nsrc/fnv/README\nsrc/fnv/aclocal.m4\nsrc/fnv/config.guess\nsrc/fnv/config.in\nsrc/fnv/config.sub\nsrc/fnv/configure\nsrc/fnv/configure.in\nsrc/fnv/configure.scan\nsrc/fnv/fnv.h\nsrc/fnv/fnv32.c\nsrc/fnv/fnv64.c\nsrc/fnv/hash_32.c\nsrc/fnv/hash_64.c\nsrc/fnv/have_ulong64.c\nsrc/fnv/ltconfig\nsrc/fnv/ltmain.sh\n# \n#  - Hypermail testing support\n# \ntests/stdintest.pl\ntests/README\ntests/diff_hypermail_archives.pl\ntests/test-footer.hyp\ntests/test-index.hyp\ntests/test-msg.hyp\ntests/test.rc\ntests/testhm.in\n# \n#  - Hypermail test mailboxes\n# \ntests/mboxes/1msg.mbox\ntests/mboxes/critmail.mbox\ntests/mboxes/embedded.msg\ntests/mboxes/t1\ntests/mboxes/t2\ntests/mboxes/t3\ntests/mboxes/t4\ntests/mboxes/t5\ntests/mboxes/t6\ntests/mboxes/t7\ntests/mboxes/t8\ntests/mboxes/y2k.mbox\n"
  },
  {
    "path": "INSTALL",
    "content": "Quick summary:\n./configure\nmake\nmake install\n\nSee the Upgrading section at the end for changes that might affect users\nof older versions.\n==========================\n\n   SECURITY WARNING: Do not put hypermail's output anyplace where a web\n   server might have server side includes (SSI) enabled, unless you are sure\n   you know what you are doing. If in doubt, check your web server\n   configuration. If you are using Apache, look for an Options line\n   that mentions Includes or IncludesNOEXEC. The author of an email\n   normally has substantial control over what files hypermail creates,\n   particularly via attachments. Hypermail is designed to insure that\n   filenames don't end in .shtml and don't contain characters like / or \\,\n   which prevent some security problems, but there are few restrictions\n   on what can go in a file (e.g. possibly malicious html tags - try the\n   \"text_types = *\" option or \"ignore_types = $NONPLAIN\" option if you want\n   to restrict this). You might also want to look at the attachmentlink\n   and unsafe_chars options to restrict attachment filenames.\n   Also, it is probably a bad idea to enable cgi execution on a directory\n   that hypermail puts files in.\n   Do not use the crappy cgi program called \"mail\".\n\nBefore Building Hypermail:\n==========================\n\n   Hypermail now uses \"configure\" to generate the Makefiles. In the\n   top level directory, type \"configure\" to create the Makefiles.\n   If it does not work on your system, please let me know. \n\nBuilding Hypermail:\n===================\n\n   Hypermail has been normally compiled and run on Unix-based systems\n   in the past. Today it can be configured and built using Cygwin \n   software.  I have either compiled and tested this code successfully \n   on the following platforms or others have told me of their success.\n\n        Solaris, SunOS 4.1.3, FreeBSD 2.2.5 and later,\n        BSDI/3.x, Linux kernel 2.0.18 and 2.0.30, Redhat 5.x and later,\n        NT using CygWin-b19 <http://www.cygnus.com/misc/gnu-win32>,\n        Irix6.2, HP-UX 10.20 and later, SCO OS 5.0.5, and TRU64/OSF1 \n        on a DEC Alpha\n\n        Hypermail compiles on MacOSX, tested with X.2.6. Beware that\n        you may need to configure it to use --disable-shared and manually\n        execute make in src/pcre before.\n\n   For more information on Cygwin and build hypermail on a Windows-based \n   system, see the file docs/Install-win32.txt.  \n\n   Generic Build:\n\n    1) Type \"./configure\". This creates the makefiles and the\n       config.h file needed to build the software.\n       If you want to install Hypermail somewhere other than in /usr/local,\n       run something like this instead: ./configure --prefix=$HOME\n\n    2) Type \"make\". This will build the software.\n       If it has trouble finding gdbm (e.g. if it fails with a message such as\n       \"cannot open -lgdbm\", you may need to disable gdbm with:\n\n        ./configure  --without-gdbm\n\n       and type \"make clean\" and then \"make\" again. (Note that without gdbm,\n       you can't do incremental updates using the folder_by_date option).\n\n   On some systems you may need to add \"-R/usr/local/lib -L/usr/local/lib\"\n   to the CFLAGS variable in the Makefiles, or alter your LD_LIBRARY_PATH\n   environment variable (Willi Kernen reports that on a 64-bit Solaris,\n   changing LD_LIBRARY_PATH to:\n\n      /usr/lib:/usr/local/lib:/usr/ccs/lib:/usr/ucb/lib:/usr/openwin/lib\n\n   fixed a problem).\n\n   If the make fails at this line: \n\n        ar cq libpcre.a maketables.o get.o study.o pcre.o\n\n   and the configure had said:\n\n       checking whether to build static libraries... no\n\n   then you probably should try:\n\n       ./configure --disable-shared\n\n   If the make fails with a message such as:\n\nproto.h:99: conflicting types for `strcasestr'\n/usr/include/string.h:86: previous declaration of `strcasestr'\n \n   then you should try removing the line in proto.h that refers to strcasestr.\n\nTesting Hypermail:\n==================\n\n    If you wish to test the new hypermail before installing it\n\n       \t- chdir to tests/\n\n\t- copy a mailbox you have to a local file named \"testmail\"\n\n\t- type \"sh ./testhm\"\n\n    This will generate an archive under a newly created \"testdir/\"\n    directory.  Check it out with your favorite browser.\n\n    When you are done testing, \n\n        - remove the testdir directory,\n\n        - remove the testmail file.\n\n    (See the README in tests/ for more information.)\n\nInstalling Hypermail:\n=====================\n\n    You may need to login as root for this step.\n    To install just the Hypermail programs:\n\n        - chdir to the src/ directory\n\n        - Type \"make install\". (Or, if you prefer, just copy \"hypermail\" to\n       wherever you want it).\n\n    If you want a full install of Hypermail and its documentation, do\n\n       make install\n\n    in the main Hypermail directory (the one where you did ./configure).\n    If it fails with something like:\n        mkdir: \"/usr/local/apache/htdocs/hypermail\": Permission denied\n    then you may need to rerun ./configure giving it the directory in\n    which you want to install html documentation files using this option:\n     --with-htmldir=/var/www/htdocs\n\nUpgrading:\n==============\n    The body option has been disabled as of version 2.1.4 for strict \n    HTML 4.01 compatibility. You should replace any body command you \n    have in your .hmrc with a style sheet (such as a file called \n    hypermail.css in the archive directory), and set icss_url and \n    mcss_url to the url of that style sheet. If you want the appearance \n    that was the default before 2.1.4, your style sheet should contain this:\n\nbody {color: black; background: #ffffff}\nh1.center {text-align: center}\ndiv.center {text-align: center}\n\n    Also, if you have been using the icss_url and/or mcss_url options and\n    are upgrading to 2.1.4 or higher, you might want to add those statements\n    to your style sheet, as their style is no longer being provided by \n    <body ...> tags, etc. (For users not specifying an icss_url and mcss_url, \n    default style sheets have been put in all files to maintain that style.)\n\n    The overwrite option defaulted to On for many versions. Starting with\n    version 2.1.4, it defaults to off again. You may want to turn it on\n    again occasionally to insure that all of your archive uses the same style\n    (assuming you have a copy of the archive in mbox format).\n\n::: SPECIAL NOTE:::\n    The cgi program called \"mail\" has been disabled. If you've been \n    using it, you should either stop using it or look carefully enough \n    at what it does to understand whether it is safe for you to enable \n    its functionality. This could be a security concern for your site. \n\n"
  },
  {
    "path": "KNOWN_BUGS",
    "content": "\nThis is a list of know problems with the current version of Hypermail\n\n=================================================\nProblem: Converting existing hypermail archives \n         to use a different HTML file suffix:\n\n     If you are going to change the filename suffix used from the default \n     \".html\" to something else, you must deal with the existing files first. \n     Otherwise, hypermail does not know they are there and starts numbering \n     files from the begining.\n \n     This means that you need to either start out fresh, regenerate the \n     archive from an existing mailbox or convert all existing files and \n     the links within the existing archive files to use the proper extension.\n\n=================================================\nProblem: File Locking On NFS Mounted Directories:\n\n     File locking doesn't work all that well over NFS. For that reason \n     you are encouraged to run Hypermail on the same system that the \n     disk is on. This is due to possible timing issues within NFS. \n     Hypermail based network locking is not expected to work at this time.\n\n=================================================\nProblem: Message Dates:\n\n     Dates on messages prior to 1970 are not processed correctly.\n\n=================================================\nProblem: Not parsing correctly.\n\n     The following line is not parsing correctly.\n\n     news:fr.comp.os.ms-windows.win95 post news:34EF975C.4097FF89@club-internet.fr\n\n=================================================\nProblem: Embedded HTML \n\n     If HTML file included in message it is just putting it there \n     without concern of BASE, TITLE, HEAD, BODY ...\n\n=================================================\nProblem: Blank name not interpreted correctly.\n\n     Puts out a <STRONG></STRONG> if name is blank.\n\n=================================================\nProblem: Memory leaks\n\n     Leaking < 30 bytes per message processed.\n\n=================================================\nProblem: Empty container elements\n\n     Putting out empty container elements <P>. Should be <P>&nbsp;</P>\n\n=================================================\nProblem: No verification of link syntax\n\n     Not verifying a valid HTML link syntax before converting somthing\n     with a http://.\n\n=================================================\nProblem: indextable format problem\n\nThe message list column widths for \"subject\" \"author\" and \"date\" are sized\nbased on the content.  Subjects and dates are fairly predictably riddled\nwith white space on which long lines can wrap.\n\nThe \"author\" string is not -- in particular, I have a person with a long\npseudonym (having a descriptive pseudo-middle name, used to distinguish\nbetween several people with the same first and last name), and a long\nmachine.domain identifier -- coming out to 52 (!) characters total.  His\nMUA does not give a \"real name\" string that hypermail could use.\n\nIn a typical browser display, this forces the 'author' column to about\n2/3rds of the display width, and the subject and date get crammed into the\nremaining 1/3rd.\n\nThe \"hm_usetable\" resource only affects headers and footers, and not the\nbulk of the index display itself.  Is there an existing configuration\nchoice that could help me?\n\n=================================================\nProblem: corrupt mailbox handing.\n\nIf the parser never finds the end-boundary in the alternative section it\nleaves the parser in an undefined state, it still treats \"^From_\"\n(underscore to display space) lines as the beginning of a new mail. The\nproblem I think is more related to that the \"alternative parser\" never really\nfinishes its work until it finds the end-boundary and when the following\n\"From \" line starts a new mail, something bad happens.  Hypermail should \nprocess corrupt messages a bit better.\n\n=================================================\nProblem: Building on DEC Alpha systems.\n\nMake sure and use the GCC compiler and not the native DEC compiler\nwhen building on a DEC Alpha using TRU64 (OSF1).\n\n\n"
  },
  {
    "path": "Makefile.in",
    "content": "#\n# Makefile for hypermail package.\n#\n\n@SET_MAKE@\n\nprefix=@prefix@\ndatarootdir = @datarootdir@\ndatadir = @datadir@\nexec_prefix=@exec_prefix@\n\n# This is where you want hypermail to be installed\nbindir=@bindir@\n\n# This is where the man page goes\nmandir=@mandir@\n\nsrcdir=@srcdir@\n\n# This is where the HTML documentation goes\nhtmldir=@htmldir@\n\n# This is where your CGI programs live\ncgidir=@cgidir@\n\nINSTALL_PROG=@INSTALL@\n\n#WNOERROR=-Werror\n#WARNINGS=$(WNOERROR) -ansi -pedantic -Wall -Wtraditional -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Dlint\n \n# Compiler to use\nCC=@CC@\nCFLAGS=@CFLAGS@ $(WARNINGS)\nCPPFLAGS=@CPPFLAGS@ @INCLUDES@\nLIBS=@LIBS@\nLDFLAGS=@LDFLAGS@\n\nall:   hypermail support \n\nhypermail:\n\t@cd src; $(MAKE) all CC=\"$(CC)\" \\\n\t\tCFLAGS=\"$(CFLAGS)\" \\\n\t\tCPPFLAGS=\"$(CPPFLAGS)\" \\\n\t\tcgidir=\"$(cgidir)\" bindir=\"$(bindir)\" LIBS=\"$(LIBS)\"\n\nsupport:   \n\t@cd archive; $(MAKE) all CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" CPPFLAGS=\"$(CPPFLAGS)\" \n\ninstall: \n\t@cd src; $(MAKE) install CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" \\\n\t\tCPPFLAGS=\"$(CPPFLAGS)\"  \\\n\t\tcgidir=\"$(cgidir)\" bindir=\"$(bindir)\" LIBS=\"$(LIBS)\"\n\t@cd docs; $(MAKE) install CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" \\\n\t\tCPPFLAGS=\"$(CPPFLAGS)\"  \\\n\t\t$(MAKEFLAGS) mandir=\"$(mandir)\" htmldir=\"$(htmldir)\"\n\t@cd archive; $(MAKE) install CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" \\\n\t\tCPPFLAGS=\"$(CPPFLAGS)\"  \\\n\t\tbindir=\"$(bindir)\"\n\nuninstall: \n\t@cd src; $(MAKE) uninstall cgidir=\"$(cgidir)\" bindir=\"$(bindir)\" \n\t@cd docs; $(MAKE) uninstall mandir=\"$(mandir)\" htmldir=\"$(htmldir)\"\n\t@cd archive; $(MAKE) uninstall bindir=\"$(bindir)\"\n\nlint:\t\n\t@cd src; $(MAKE) lint \n\t@cd archive; $(MAKE) lint \n\nclean:\n\t@cd src; $(MAKE) clean \n\t@cd docs; $(MAKE) clean \n\t@cd archive; $(MAKE) clean \n\trm -f lint.out\n\nclobber: clean\n\trm -f config.h\n\trm -f config.cache\n\trm -f config.log\n\trm -f config.status\n\trm -f archive/Makefile\n\trm -f docs/Makefile\n\trm -f libcgi/Makefile\n\trm -f src/Makefile\n\trm -f src/defaults.h\n\trm -f tests/testhm\n\trm -rf tests/testdir\n\trm -rf tests/mail-archive\n\trm -f Makefile\n\ndistclean: clobber\n\trm -f tests/testmail\n\ntgz:\n\t@(dir=`pwd`;name=`basename $$dir`;echo Creates $$name.tar.gz; cd .. ; \\\n\ttar -cf $$name.tar \\\n           `cat $$name/FILES | grep -v \"^#\" | sed \"s:^:$$name/:g\"` ; \\\n\tgzip $$name.tar ; chmod a+r $$name.tar.gz ; mv $$name.tar.gz $$name/)\n\n"
  },
  {
    "path": "README",
    "content": "\n                             Hypermail\n\n                          Version:  2.4.x\n\nThis is a release of the 2.4.x version of hypermail.\n\nHypermail is a program that takes a file of mail messages in UNIX mailbox\nformat and generates a set of cross-referenced HTML documents. \n\nSECURITY WARNING: \n   Do not put hypermail's output anyplace where a web server might have \n   server side includes (SSI) enabled unless you are sure you know what \n   you are doing. \n\nWARNING: \n   There once existed a program call \"mail\" that came with hypermail.\n   'mail' utility has not installed by default for the last two years.  \n   This program has been disabled because it was probably easy for spammers \n   to use as an open relay. It also had problems with enabling malicious \n   use of JavaScript and CRLF Injection.  The 'mail' utility is a historic \n   reclic and will not be supplied in future versions.  Its functionality \n   has been replaced with a warning that anyone using it should remove it \n   immediately.  \n\nSee the INSTALL file to get started. For a description of how to use it,\nsee the hypermail.html, hmrc.html, and hypermail-faq.html files that come\nin the docs/ directory.\nPlease refer to Changelog for the list of recent changes.\n\nHypermail is distributed under the GNU GPL license (see the file COPYING for\ndetails). Some programs that are distributed with it in the archive and\ncontrib directories have different licenses - check the individual files for\ndetails.\n\nHypermail Background:\n=====================\n\nHypermail was originally designed and developed by Tom Gruber for\nEnterprise Integration Technologies (EIT) using Common Lisp. \n\nIt was later rewritten in C by Kevin Hughes in 1994 while Kevin \nworked at EIT. \n\nLicense Evolution:\n------------------\n\nIn the spring of 1997, Kevin Hughes heavily pressed Hewlett-Packard\n(who was now the legal owner of Hypermail, since EIT was bought by\nVeriFone, which was bought by Hewlett-Packard) into placing a free\nsoftware license onto his old EIT software.  They officially put the\nGNU GPL license on *all* of Kevin's old EIT software, opening it up to\nmore open methods of development and distribution. So now Hypermail\nis under GPL.\n\nEIT's net.disappearance:\n------------------------\n\nA very old and established government contractor company called \nElectronic Instrumentation and Technology Inc. made legal moves to \nobtain the eit.com domain. Since VeriFone/HP had no interest in keeping \nEIT, dissolved it completely.  As this company had a trademark on EIT, \nthe domain name was given to them. Elizabeth Batson of EIT/VeriFone/HP \ninformed Kevin he could maintain all his old software himself wherever \nhe wished to put it.\n\nKevin and ongoing Hypermail Development:\n----------------------------------------\n\nKevin left Hewlett-Packard in 1997 and helped form a new company \ncalled Veo Systems (www.veosystems.com) with his old boss Marty \nTenenbaum, who founded EIT. Kevin did not have the time to maintain \nany of his old software, so he was looking for different parties to \nhelp maintain it and take over different pieces. For instance, Getstats \nhas been obsoleted by Analog (http://www.statslab.cam.ac.uk/~sret1/analog/). \nSWISH has been taken over by the SWISH-E project \n(http://sunsite.berkeley.edu/SWISH-E/) and many people have been doing \ngood things with it.  April 17, 1998 Kevin passed hypermail development \nto Kent Landfield (http://www.hypermail.org/). Kent had been \nsupporting an enhanced version of hypermail he had been using for the \nlast few years. It has gradually become a group effort, with Peter McCluskey\n<pcm@rahul.net> often acting as the leader during its heydays. \nSince a couple of years, it is stable and mostly unmaintained. W3C continues\nto contribute to this repository, although infrequently, sharing with the\ncommunity enhancements and bug fixes originating from its use of\nhypermail.\n\nGeneral:\n========\n\nThis version has been tested on the platforms listed below. If you would \nlike to send portability patches or confirmation that it works on a certain\nplatform, please do.  There should not be toooo many changes that need to be \nmade.\n\nThis version of hypermail has substantial support for attachments and for\nsplitting archives into subdirectories. It also allows an administrator to\ncustomize the header and footers to match their local needs.  This allows\nyou to have hypermail facilities better integrated into your web site. \n\nThis version is an integration of patches that Kevin had received through\nthe years, and new features through the individual efforts many people.  \nThis has been run through lint, Insight and Purify and has been cleaned up \naccordingly.\n\n   * archive - general archive utilites that are useful in managing\n               list archives. Much of the functionality here has been\n               rendered obsolete by the folder_by_date option.\n   * contrib - contributed hypermail relate utilities\n   * configs - sample hypermail configuration files,\n   * docs    - documentation and documentation support files,\n   * libcgi  - support library for the mail utility,\n   * src     - here's the beef,\n   * tests   - directory for supporting local testing,\n\nWarning:\n========\n\nTake the time to read the KNOWN_BUGS file so that you are aware of \nthings that might affect your use of hypermail.\n\nGIT Repository:\n===============\n\nHypermail's code base has migrated from CVS to git and after a\nresidence at sourceforge, now resides at github:\n\n  https://github.com/hypermail-project/hypermail/\n\nCVS Server:\n===========\n\nThe hypermail CVS repository has been retired. Hypermail's code base\nnow resides at github (see above).\n\nThanks to Ashley M. Kirchner <ashley@pcraft.com> for having\nhosted and keep alive the CVS repository during the years.\n\nGetting Help:\n=============\n\n    There is no active dedicated mailing list for hypermail support or\n    development.\n\n    Please use hypermail's github repository issue tracker for all bug\n    reports, feature requests, patches, and other program-related\n    things. This project is under low-maintenance priority.\n\n    You can browse the old hypermail development mailing list archives\n    from the historical hypermail project homepage:\n\n       http://hypermail-project.org/\n\nAdditionally:\n=============\n\n    You'll find the image \"hypermail.gif\" included with the source;\n    this icon is for your use in your Hypermail-related pages and links \n    to them. If you are talented with graphics and would like to donate\n    new icons and images to the hypermail effort, please feel free.\n\n\nRegular expression support is provided by the PCRE library package,\nwhich is open source software, written by Philip Hazel, and copyright\nby the University of Cambridge, England. See http://www.pcre.org/.\n"
  },
  {
    "path": "README.CVS",
    "content": "[ DEPRECATED We're now using github : https://github.com/hypermail-project/hypermail ]\n\n                        Hypermail CVS Server Access\n\n                                    ----\n   Hypermail  Development  has  a  CVS server, where we (try to) keep the\n   latest  changes (usually hot out of the oven) and anyone is welcome to\n   use  it.  Thanks  to  Elliot Lee <sopwith@redhat.com> for helping with\n   setting  it  up,  Daniel  Stenberg  <Daniel.Stenberg@haxx.nu> with his\n   contributions. And many thanks to Ashley M. Kirchner <ashley@pcraft.com> \n   for hosting and managing the hypermail CVS server.\n  \n------------------------------------\nSetting up the CVS software locally:\n \n     If you system does not have cvs installed on it already then you \n     need to do the following to install the client locally.\n  \n       - Obtain the cvs source at ftp://ftp.cvshome.org/pub/\n         For more information on CVS stop by http://www.cvshome.org/\n\n       - Compile  and  install  the client (you can disable the server with\n         the  --disable-server  during  the  'configure'  command. Read the\n         INSTALL file once you're uncompressed the archive)\n  \n------------------------------------\nGeneral information on accessing the Hypermail CVS repository:\n  \n     Hypermail CVS Archive Address:                        \n  \n          :pserver:cvs@cvs.hypermail.org:/CVS\n  \n     The  'cvs' user doesn't have a password, so just hit return when it\n     asks you for one.  The cvs user is setup for read access only.\n  \n------------------------------------\nStep by Step information on accessing the Hypermail CVS repository:\n  \n   Aftering installing the CVS software:\n     - Set your CVSROOT enviroment:\n       For sh, bash and ksh users, execute the following commands:\n  \n         CVSROOT=:pserver:cvs@cvs.hypermail.org:/CVS\n         export CVSROOT\n  \n       (or you can stick them in your .profile and/or .bash_profile file)\n       For C shell users (csh, tcsh), you can do the following:\n  \n         setenv CVSROOT :pserver:cvs@cvs.hypermail.org:/CVS \n  \n       (or stick it in your .cshrc and/or .login file)\n\n     - From here you can login to the server with:\n  \n         $ cvs login\n         (Logging in to cvs@cvs.hypermail.org)\n         CVS password: <-- hit RETURN (cvs user password is blank) \n\n     - Now you're ready to grab the source\n  \n         $ cvs checkout hypermail \n\n       This  will  create a mirror of the sources in your account/on your\n       machine  called  'hypermail'  that  you  can then compile and play\n       with.\n\n     - Once done, don't forget to log out:\n\n         $ cvs logout \n   \n   All  of  the  above  commands can be performed without having to set a\n   CVSROOT  enviroment if you want, it's just a lot more to type in since\n   you'll have to specify the directory every time with:\n   \n     -d :pserver:cvs@cvs.hypermail.org:/CVS\n\n   For  example, you would need to use the following to execute the login\n   command\n       \n     cvs -d :pserver:cvs@cvs.hypermail.org:/CVS login\n     cvs -d :pserver:cvs@cvs.hypermail.org:/CVS checkout hypermail\n     cvs -d :pserver:cvs@cvs.hypermail.org:/CVS logout   \n  \n------------------------------------\nBrowsing the Hypermail CVS Archive:\n\n    You can also browse the repository at: \n\n\thttp://cvsweb.hypermail.org/\n\n                                    ----\n"
  },
  {
    "path": "README.git",
    "content": "                        Hypermail GIT Server Access\n \n                                    ----\n   Hypermail  Development  has  a  GIT server, where we (try to) keep the\n   latest  changes (usually hot out of the oven) and anyone is welcome to\n   use  it.\n  \n------------------------------------\nGeneral information on accessing the Hypermail CVS repository:\n  \n   Hypermail git repository address:\n\n       http://sourceforge.net/scm/?type=git&group_id=18117&source=navbar\n       git://hypermail.git.sourceforge.net/gitroot/hypermail/hypermail (read-only)\n\n   A mirror is also availabe on github:\n\n      https://github.com/hypermail-project/hypermail\n\nSee the sourceforge documentation for more information about\ngit and how to checkout the hypermail repository:\n\n      http://sourceforge.net/scm/?type=git&group_id=18117&source=navbar\n     \n------------------------------------\nBrowsing the Hypermail git repository:\n\n    You can also browse the repository at: \n\n\thttp://hypermail.git.sourceforge.net/git/gitweb-index.cgi\n\n                                    ----\n"
  },
  {
    "path": "TODO",
    "content": "This is a file of things to do. If you have other ideas or needs send\nthem to hypermail-dev@hypermail.org.\n\n===============\nGeneral Things:\n===============\n\n- Need to use splint to clean up the code.\n\n- Need to clean up the code and remove old code that is commented/ifdefed out.\n\n- Update the doc files to assure all configuration file directives\n  are included appropriately in the documentation. Currently the\n  documentation does not completely list all options.\n\n- Update the pcre library to a much more recent version.\n\n- Modify configure to locate the appropriate htdocs directory locations\n  for installing the documentation and image files.\n\n- Add the msgid hash to the emailinfo structure to speed-up looking\n  of this value when we already know it.\n\n- Finish the libtool work on the fnv library so that we can link to\n  shared libraries _and_ install/uninstall them.\n\n- Need to lowercase HTML tags to support XHTML 1.0 in the future.\n\n- Need to add XHTML support - Configurable ?\n\n- Make the \"New List Message\" and \"Reply To List\" features available\n  when usetable == 0\n\n- system() should be replaced by fork()+execvp() (or maybe by s_popen())\n  in archive/ mbox2hypermail.c\n\n- HTML code should be escaped where appropriate.\n\n- Make it possible to insert the FONT to use in the tables.\n  <TH><FONT ...>string</FONT></TH>\n  Fonts are not be inherited correctly in many browsers.\n\n- Have configure look at the language selected and if it is not \"en\" \n  set the EURODATE to 1.\n\n- Add date/subject/author filters for articles that are read in\n\n- Need to create a library of hypermail functions so that other utilities\n  can be generated without making things real ugly. (i.e. removal, other\n  indexing.)\n\n- Combine mbox2hypermail.c and msg2archive.c into a single program instead\n  of having the two do the same general job...\n\n- There is an irreversible aspect to piping messages into hypermail;\n  what gets written into HTML does not readily convert back to RFC822\n  form such that it could be re-archived (put in another archive, etc.)\n\n- Convert the doc files to a SGML system like linuxdoc, which will allow\n  generating html, text, and man pages from the same source.\n\n - You currently look for text in messages of the form http://... and\n turn them into hyperlinks. You also look for text in the form\n foo@bar.com and turn that into a mailto: hyperlink.\n I suggest you also look for text in for form of\n mailto:foo@bar.com?subject=bat and turn the whole of it into a\n mailto: link, with the correct subject line.\n\n=============\nIndex Issues:\n=============\n\n- Make the formating of index pages use magic cookies for all parts of the\n  page.\n\n- It seems strange and undesireable to have the message date shown only in \n  the subject and author indexes.  It seems *really* strange to not have it \n  show up in the date index!  I wanted it \"on\" for our archives, and did \n  that in my latest beta, which required changing the \"reply\" structure to \n  include it (for the thread index).  I think ideally it would be configureable\n  on or off.  \n\n- Make it optional that a site generate index files with the listings\n  sorted by date in one file and reverse sorted in the other index. \n  This pertains to all index types as well. For example:\n     one thread-index with the newest mails topmost\n     one thread-index with the oldest mails topmost\n     one author-index in alphabetical order\n     one author-index in reversed alphabetical or\n     etc.\n\n============\nAttachments:\n============\n\no Make it configurable to get test/plain attachments to have a link \n  created for them, instead of having them printed out beneath the \n  original email.\n\no If a filename is not known and the MIME type is known, the proper \n  extension should be added to the randomly generated file name.\n\no For security reasons, *all* binary attachments should be \n  written to disk with file permissions of 444 or equivalent \n  read-only access and should *never* allowed to be executable.\n\no The user should be able to 1 indicate if attachments are stored to\n  be stored as separate files from the original message. \n  (Turn it on or off.)\n\no Specifying a list with 'preferred' content-types when \n  receiving/decoding mixed/alternative attachments. Support is there \n  in the config file but not in the code. Currently the \"text\" is always \n  preferred.\n\no It is doubtful that hypermail deals with all kinds of uuencoded \n  attachments as defined with 'x-uue' in the current hypermail. Other \n  MIME resources mention a whole set of different names for this kind \n  of encoding, but are they in use?\n\no Hypermail should be able to deal with Sun's (silly) mailtool \n  attachments in a manner similar to how it deals with mime attachments. \n  It would be really cool if the output would be identical and the \n  differences hidden from the user(s).\n\n=================\nConfigure issues\n=================\n\nDefines not used in config.h.in:\nHAVE_STRFTIME, HAVE_GETOPT, HAVE_GETPWUID, HAVE_LSTAT,\nHAVE_MKDIR, HAVE_STRCASECMP, HAVE_STRDUP, HAVE_STRSTR, HAVE_STRTOL,\nHAVE_ALLOCA_H, HAVE_ARPA_INET_H, HAVE_MALLOC_H, HAVE_NDIR_H ,\nHAVE_NETDB_H, HAVE_NETINET_IN_H, HAVE_STDARG_H, HAVE_STDIO_H,\nHAVE_SYS_DIR_H, HAVE_SYS_NDIR_H , HAVE_SYS_SOCKET_H, HAVE_TIME_H\n\nHAVE_BCOPY is only used in in pcre and not hypermail sources.\n\nConfigure needs to support SunOS4x.\n\nChange prototype definitions for certain systems (FREBSD 4.6 for example)\n\n============\nMisc. Needs:\n============\n\n- EURODATE\n  Given that these two formats are ambiguous, and many companies have\n  people of both sorts, need an alternate, unambigous date format. \n\n- Should recognize and parse indented HTML tags better\n\n- Don't ignore umask - HM_UMASK variable? \n\n- A better icon for hypermail!\n\n- Ability to check for duplicate message IDs using cksum\n  to assure that duplicate message are infact truely duplicated\n  and not just a different message with the same msg-id header.\n\n- Ability to refer to articles via message ID as well\n\n- The ability to cap the archive to X most recent messages\n\n- Allow for multiple mailbox formats to be recognized, like news articles,\n  listproc, elm mailboxes, etc.\n\n- In parsing header fields, check for extra spaces, tabs, etc.\n\n- Check for zero-length headers\n\n- Search for \"HTTP\" and \"http\" when making links\n\n- Parse archives with only one or zero messages\n\n- Make sure \"sort by...\" groups all messages in same thread\n\n- Add sort by \"in reply to\" as well\n\n=============================\nAdministrative Things to do:\n=============================\n\no Get a good set of test files.  For now you can use your own...\n\no Get to develop a complete regression test suite \n\n===========================\n        :Requests:\n===========================\n\n* Do you know if there is any way to cutomize the index sort of Hypermail? \n  I am using Solaris mailbox and the header field can be modified by user \n  (i.e. add more headers if required). However, the default index sort of \n  Hypermail only support Author, Thread and Subject. Is there any way to \n  customize the index sort of Hypermail so that we can map the UNIX mail \n  to HTML mail with cutomize headers.\n\n* Would like to see a reindex option. Would like to remove a message from\n  the mailbox and click on reindex to delete the message.\n\n* There should be an option I can set in the Hypermail command to cause it \n  to write html files as a specified user.  Right now Hypermail is writing \n  files as daemon and this is causing problems.  We'd prefer that it run as \n  something/someone else.\n\n* One more: I still think that hypermail should also save the\n  full mail body part additionally, when there is an OpenPGP(PGP/MIME\n  rfc2015) signed Mail. If we do it first, maybe somebody enhances a\n  webbrowser to take advantage of it. Would be cool, if it could check\n  the signature then.\n\n* It would be nice to be able to throttle hypermail. Could we add a\n  config option that would allow hypermail to renice itself ?\n"
  },
  {
    "path": "UPGRADE",
    "content": "Upgrade Notes\n==============\n\nFrom Hypermail 2.3.0 to Hypermail 2.4.0\n-----------------------------------------\n\nHypermail will now detect and link with a system libpcre if it's\navailable and current.  Otherwise, it will compile the bundled\nlibpcre. You can force the compile with the bundled one with the\n--enable-bundled-pcre configure option.\n\nThe configuration directive \"htmlmessage_deleted\" has been\nrenamed \"htmlmessage_deleted_spam\".\n\nThe \"deleted\" configuration directive has been deprecated\nin favor of \"annotated\". However, for backwards compatibility\nwith legacy archives, it will continue to be honored.\n\nFrom Hypermail 1.x to Hypermail 2.x \n-----------------------------------\n!!!!WARNING!!!!\n\nHypermail 2.x HTML output files, indexes, etc are not compatible with 1.x \nfiles.  When installing 2.x, all existing HTML files in the specified output \ndirectory must be removed first.  \n\nUse the original 1.x mailbox files to regenerate the new 2.x archive. \nIf the mailboxes are not available it should be possible to use the \nscript hypetombox.pl in the contrib/ directory.\n"
  },
  {
    "path": "acconfig.h",
    "content": "\n#undef HAVE_GDBM_H\n"
  },
  {
    "path": "aclocal.m4",
    "content": "dnl Some macros borrowed from Apache's httpd config file. Thanks!\n\ndnl\ndnl APR_SUBDIR_CONFIG(dir [, sub-package-cmdline-args, args-to-drop])\ndnl\ndnl dir: directory to find configure in\ndnl sub-package-cmdline-args: arguments to add to the invocation (optional)\ndnl args-to-drop: arguments to drop from the invocation (optional)\ndnl\ndnl Note: This macro relies on ac_configure_args being set properly.\ndnl\ndnl The args-to-drop argument is shoved into a case statement, so\ndnl multiple arguments can be separated with a |.\ndnl\ndnl Note: Older versions of autoconf do not single-quote args, while 2.54+\ndnl places quotes around every argument.  So, if you want to drop the\ndnl argument called --enable-layout, you must pass the third argument as:\ndnl [--enable-layout=*|\\'--enable-layout=*]\ndnl\ndnl Trying to optimize this is left as an exercise to the reader who wants\ndnl to put up with more autoconf craziness.  I give up.\ndnl\nAC_DEFUN([APR_SUBDIR_CONFIG], [\n  # save our work to this point; this allows the sub-package to use it\n  AC_CACHE_SAVE\n\n  echo \"configuring package in $1 now\"\n  ac_popdir=`pwd`\n  apr_config_subdirs=\"$1\"\n  test -d $1 || $mkdir_p $1\n  ac_abs_srcdir=`(cd $srcdir/$1 && pwd)`\n  cd $1\n\nchangequote(, )dnl\n      # A \"../\" for each directory in /$config_subdirs.\n      ac_dots=`echo $apr_config_subdirs|sed -e 's%^\\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`\nchangequote([, ])dnl\n\n  # Make the cache file pathname absolute for the subdirs\n  # required to correctly handle subdirs that might actually\n  # be symlinks\n  case \"$cache_file\" in\n  /*) # already absolute\n    ac_sub_cache_file=$cache_file ;;\n  *)  # Was relative path.\n    ac_sub_cache_file=\"$ac_popdir/$cache_file\" ;;\n  esac\n\n  ifelse($3, [], [apr_configure_args=$ac_configure_args],[\n  apr_configure_args=\n  apr_sep=\n  for apr_configure_arg in $ac_configure_args\n  do\n    case \"$apr_configure_arg\" in\n      $3)\n        continue ;;\n    esac\n    apr_configure_args=\"$apr_configure_args$apr_sep'$apr_configure_arg'\"\n    apr_sep=\" \"\n  done\n  ])\n\n  dnl autoconf doesn't add --silent to ac_configure_args; explicitly pass it\n  test \"x$silent\" = \"xyes\" && apr_configure_args=\"$apr_configure_args --silent\"\n\n  dnl AC_CONFIG_SUBDIRS silences option warnings, emulate this for 2.62\n  apr_configure_args=\"--disable-option-checking $apr_configure_args\" \n\n  dnl The eval makes quoting arguments work - specifically the second argument\n  dnl where the quoting mechanisms used is \"\" rather than [].\n  dnl\n  dnl We need to execute another shell because some autoconf/shell combinations\n  dnl will choke after doing repeated APR_SUBDIR_CONFIG()s.  (Namely Solaris\n  dnl and autoconf-2.54+)\n  if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir $2\n  then :\n    echo \"$1 configured properly\"\n  else\n    echo \"configure failed for $1\"\n    exit 1\n  fi\n\n  cd $ac_popdir\n\n  # grab any updates from the sub-package\n  AC_CACHE_LOAD\n])dnl\n\ndnl\ndnl APR_ADDTO(variable, value)\ndnl\ndnl  Add value to variable\ndnl\nAC_DEFUN([APR_ADDTO], [\n  if test \"x$$1\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n    $1=\"$2\"\n  else\n    apr_addto_bugger=\"$2\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $$1; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n        $1=\"$$1 $i\"\n      fi\n    done\n  fi\n])dnl\n\ndnl\ndnl APR_REMOVEFROM(variable, value)\ndnl\ndnl Remove a value from a variable\ndnl\nAC_DEFUN([APR_REMOVEFROM], [\n  if test \"x$$1\" = \"x$2\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  nulling $1\"\n    $1=\"\"\n  else\n    apr_new_bugger=\"\"\n    apr_removed=0\n    for i in $$1; do\n      if test \"x$i\" != \"x$2\"; then\n        apr_new_bugger=\"$apr_new_bugger $i\"\n      else\n        apr_removed=1\n      fi\n    done\n    if test $apr_removed = \"1\"; then\n      test \"x$silent\" != \"xyes\" && echo \"  removed \\\"$2\\\" from $1\"\n      $1=$apr_new_bugger\n    fi\n  fi\n]) dnl\n"
  },
  {
    "path": "archive/.indent.pro",
    "content": "-nbad -bap -nbbo -nbc -br -brs -c33 -cd33 -ncdb -nce -ci4 \n-cp33 -ncs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs\n-npsl -nsc -nsob -nss\n-Tform_entry\n-Tcgi_info\n-TFILE\n"
  },
  {
    "path": "archive/1998",
    "content": "#!/bin/sh\n#\n# set -x  # bug squisher\n#\n# The purpose of this script is to allow you to re-generate your\n# hypermail archives at will.   What you need to do is have a Unix\n# mailbox copy of the archive that you want to rebuild.  \n#\n# Please read throught the script to see what it does. Basically\n# it takes a set of mailbox files and converts them into a hypermail\n# archive of messages and will install an index.html file if you have \n# specified one.  Might want to edit this a bit. I maintain 20+\n# list archives with hypermail so I have 20+ copies of this script\n# around, each customized for the individual archives.  Easyier\n# to do that then have to remember complicated command line options\n# and archive structures. The scripts are self documenting.\n#\n# Paths to things on disk\n#\n# ARCHIVE_DIR = The base directory of the archive \n# MAILBOX_DIR = Mailbox version of the archive\n# RDMSG       = Location of mbox2hypermail utility\n#\nARCHIVE_DIR=/ftp/hypermail/mail-archive\nMAILBOX_DIR=${ARCHIVE_DIR}/mailbox\nRDMSG=hrdmsg\nLISTNAME=hypermail\n\n#\n# Ownership of the archives\n#\n# Beware: Hypermail needs to be able to potentially \n#         write these directories. Know who your mailer\n#         runs as.\n#\nOWNER=lists\nGROUP=daemon\n\n#\n# Create_archive YYYY MON path-to-mailbox \n#\n#      YYYY - 4 digit year\n#      MON  - 3 Letter month abreviation\n#      \ncreate_archive()\n{\n    year=$1\n    month=$2\n    mailbox=$3\n\n    if [ ! -d ${ARCHIVE_DIR}/$year ]; then\n        mkdir ${ARCHIVE_DIR}/$year\n    fi\n\n    if [ ! -d ${ARCHIVE_DIR}/$year/$month ]; then\n        mkdir ${ARCHIVE_DIR}/$year/$month\n    else\n        rm -r ${ARCHIVE_DIR}/$year/$month\n        mkdir ${ARCHIVE_DIR}/$year/$month\n    fi\n\n    ${RDMSG} -v -Y $year -M $month $mailbox\n    chown -R ${OWNER}.${GROUP} ${ARCHIVE_DIR}/$year/$month\n}\n\n#\n# Ye Olde Main\n#\n\ncreate_archive 1998 Jan ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9801\ncreate_archive 1998 Feb ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9802\ncreate_archive 1998 Mar ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9803\ncreate_archive 1998 Apr ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9804\ncreate_archive 1998 May ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9805\ncreate_archive 1998 Jun ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9806\ncreate_archive 1998 Jul ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9807\ncreate_archive 1998 Aug ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9808\ncreate_archive 1998 Sep ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9809\ncreate_archive 1998 Oct ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9810\ncreate_archive 1998 Nov ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9811\ncreate_archive 1998 Dec ${ARCHIVE_DIR}/mailbox/${LISTNAME}.9812\n\nif [ -f index.html ]; then\n\tcp index.html  ${ARCHIVE_DIR}/1998\nfi\n\n#\n# C'ya\n#\nexit 0\n"
  },
  {
    "path": "archive/Makefile.in",
    "content": "###################################################\n# Sample Makefile for mail archive maintenance.\n#\n#  Define variables and Macros\n#\n###################################################\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nbindir=@bindir@\nSUFFIX=@suffix@\n\n#WNOERROR=-Werror\n#WARNINGS=$(WNOERROR) -ansi -pedantic -Wall -Wtraditional -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Dlint\n\nCC=@CC@ $(WARNINGS)\nCFLAGS=@CFLAGS@\nINSTALL_PROG=@INSTALL@\n\n###################################################\n#\n#  Build the executable images\n#\n###################################################\n#\n# PLEASE read the README in this directory before continuing.\n\nPROGS = msg2archive$(SUFFIX) rdmsg$(SUFFIX)\n\nall: $(PROGS) \n\nmsg2archive$(SUFFIX): msg2archive.c lists.h\n\t$(CC) $(CFLAGS) -o $@ msg2archive.c\n\nrdmsg$(SUFFIX): mbox2hypermail.c lists.h\n\t$(CC) $(CFLAGS) -o $@ mbox2hypermail.c\n\n########################################\n#\n#       Commands\n#\n########################################\n\nlint:\n\tlint $(LINT_FLAGS) $(SOURCE) | tee Lint.out\n\nclean: \n\trm -f $(OBJS) Lint.out\n\trm -f $(PROGS)\n\nclobber:  clean\n\ndistclean:  clean\n\ninstall: $(bindir)/msg2archive$(SUFFIX) $(bindir)/rdmsg$(SUFFIX)\n\n$(bindir)/msg2archive$(SUFFIX):  msg2archive$(SUFFIX)\n\t@if [ ! -d $(bindir) ]; then mkdir -p $(bindir); fi\n\t$(INSTALL_PROG) -c msg2archive$(SUFFIX) $@\n\n$(bindir)/rdmsg$(SUFFIX):  rdmsg$(SUFFIX)\n\t@if [ ! -d $(bindir) ]; then mkdir -p $(bindir); fi\n\t$(INSTALL_PROG) -c rdmsg$(SUFFIX) $@\n\nuninstall:\n\trm -f $(bindir)/msg2archive$(SUFFIX)\n\trm -f $(bindir)/rdmsg$(SUFFIX)\n\n###################################################\n#\n#    Object file include dependencies.\n#    The object file include dependencies are required.\n#\n###################################################\n\ndepend:\n\tmakedepend -- $(CFLAGS) -- $(SOURCE)\n\n# DO NOT DELETE THIS LINE -- make depend depends on it.\n"
  },
  {
    "path": "archive/README",
    "content": "This directory contains the archive specific information for maintaining \nmailing list archives.  Much of the functionality here has been rendered\nobsolete by the folder_by_date option. See ../docs/hmrc.html for more\ninfo about that option.\n\nAlso see ../contrib/msg2hypermailarchive.py for another program with\nsimilar functionality. It's author says:\n   It can almost do everything that msg2archive could do.\n   Together with \"formail\" it also replaces mailbox2archive for me.\n   (e.g. like   cat hypermail-test.9907 | formail -s msg2hypermailarchive.py --month 7 --year 1999 -L hypermail-test -v )\n\n\n           README - This file.\n             1998 - script for recreation of the hypermail archives \n                    from the mailbox version\n      Makefile.in - configure Makefile input\n    msg2archive.c - Individual message archiver.\n mbox2hypermail.c - Read messages from a mailbox and calls hypermail.\n\nThe contents of this directory support automatic generation of hypermail\narchives from inbound messages *as well as* the generation of a hypermail\narchive from a Unix mailbox of stored messages.\n\nThis is how I do it so... Your mileage might vary...\n\n1. First you will need to decide where you want the archive stored at. \n\n2. Then you will need to edit the file lists.h with the appropriate info.\n   Simply add a section such as is shown below. I have a section for each \n   list.  If you are not familiar with 'C' might want to get someone else\n   to assist.  Notice that HYPERMAIL is different in the two entries. This\n   is because in the case of the wu-ftpd list, it is using a stock hypermail\n   executable to save the messages. The nfr-announce list is using a \n   customized version (very useful for testing too.)\n\n    #ifdef WU_FTPD\n \n    #define HYPERMAIL    \"/usr/local/bin/hypermail\" \n    #define ARCHIVE      \"/ftp/wu-ftpd/mail-archive\" \n    #define MAILBOXDIR   \"/ftp/wu-ftpd/mail-archive/mailbox\" \n    #define LABEL        \"WU-FTPD Development Mailing List\"\n    #define ABOUT_LINK   \"/wu-ftpd\" \n    #define LISTNAME     \"wu-ftpd\"\n    #define CONFIGFILE   \"NONE\"\n \n    #else\n    #ifdef NFR_ANNOUNCE\n \n    #define HYPERMAIL    \"/usr/local/bin/nfrhypermail\"\n    #define ARCHIVE      \"/ftp/nfr/mail-archive/nfr-announce\"\n    #define MAILBOXDIR   \"/ftp/nfr/mail-archive/nfr-announce/mailbox\"\n    #define LABEL        \"Network Flight Recorder Announcements\"\n    #define ABOUT_LINK   \"/nfr/mail-archive\"\n    #define LISTNAME     \"nfr-announce\"\n    #define CONFIGFILE   \"/usr/local/lib/hypermail/nfr-announce.rc\"\n\n    ...\n\n    If you specify a CONFIGFILE path, it will be used to set hypermail\n    options and is call as \n\n        \"HYPERMAIL -u -i -c CONFIGFILE\".\n\n    If you do not specify a CONFIGFILE path, hypermail is called using\n    the other information as \n    \n        \"HYPERMAIL -u -i -d ARCHIVE/year/month -l \\\"LABEL\\\" -b ABOUT_LINK\"\n\n3.  Next make sure that you have a properly compiled version of hypermail\n    installed on the system.\n\n4.  Edit the Makefile and add the appropriate entries. For example:\n\n    wuftpdmail: msg2archive.c\n        $(CC) -DWU_FTPD -o $@ msg2archive.c\n\n    wu-rdmsg: mbox2hypermail.c\n        $(CC) -DWU_FTPD -o $@ mbox2hypermail.c\n\n5.  Compile and install the new programs.\n\nNow everything software-wise is in place.  Time to setup your mailer\nto process the inbound messages.  \n\n6.  You need to add an entry to your /etc/aliases file such as\n\n      wuftpd: \"|/usr/local/bin/wuftpdmail\"\n\n7.  Assure that your mailer is aware of the new alias, i.e. might need\n    to type 'newaliases'.\n\nNow you are ready to start receiving messages.  Time to subscribe your\nnew alias to the list you want to archive.  If you are running the list \nthen this is easy.  In some cases you have to play games to get an alias \nsubscribed with other than you normal account. What ever the case get\nthe new alias subscribed.\n\n======================\nSo what happens now ?\n======================\n\nMessages sent to a list and are resent to the members of the list.  \nThe alias you subscribed is now a member of the list.  Messages are \nsent to the list archive alias.  The \"msg2archive\" process is started \nfor each message and the messages are stored into the location specified \nin the MAILBOXDIR define.  Messages are stored in the directory in a \n\"month' file or as specified in the configuration file.  These are Unix \nmailbox formatted files.  Once the message is archived in mailbox format, \nit is also then archived in hypermail format.  The appropriate hypermail \nis called with the inbound message sent to it to add to the hypermail \narchive.\n\nIn this manner each article is available to those who want to read \nthem online and to those who want to download an entire month's worth \nof traffic to read with their favorite mail Unix reader.\n\nIf there is ever a problem with the hypermail archives, be it a new\nlook and feel wanted or a bug fix that requires regeneration of the \narchive, the mailbox versions will be used as input to the process.  \nThe script `1998' and the `mbox2hypermail.c' program in this directory \nare being used for testing and archive re-creation.\n\nIf you want to change the look and feel of the individual hypermail \narchive pages, that can be done easily by creating the list specific \nheader and footer HTML template files as described in the hypermail.1 \nand hmrc.4 man pages.\n\n===========================\nIntegrating with Majordomo:\n===========================\n\nIf you are running a majordomo list and want to integrate this with \nmajordomo then make sure that the ftp mailbox directory is symlinked \nto ~majordomo/Archives/listname directory so that this scheme does \nnot break majordomo.  DO NOT HAVE MAJORDOMO DO ANY ARCHIVING. The \nsymlink'ed directory is so people will be able to request archives \nand index listing from majordomo as normal.  Now the list archives \nare reachable via the web, ftp or email.\n\n"
  },
  {
    "path": "archive/lists.h",
    "content": "/*\n**  FILE:          lists.h  - %W% %G% \n**  AUTHOR:        Kent Landfield\n**\n**  ABSTRACT:      Define the lists supported by hypermail\n**\n** This software is Copyright (c) 1996 by Kent Landfield.\n**\n** Permission is hereby granted to copy, distribute or otherwise \n** use any part of this package as long as you do not try to make \n** money from it or pretend that you wrote it.  This copyright \n** notice must be maintained in any copy made.\n**                                                               \n*/\n\n#ifdef HYPERDEV\n\n#define HYPERMAIL    \"/usr/local/bin/hypermail\"\n#define ARCHIVE      \"/ftp/hypermail/mail-archive\"\n#define MAILBOXDIR   \"/ftp/hypermail/mail-archive/mailbox\"\n#define LABEL        \"Hypermail Development List\"\n#define ABOUT_LINK   \"/hypermail/mail-archive\"\n#define LISTNAME     \"hypermail\"\n#define CONFIGFILE   \"/usr/local/lib/hypermail/hypermail.rc\"\n\n#else\n# ifdef HYPERTEST\n\n#define HYPERMAIL    \"../src/hypermail\"\n#define ARCHIVE      \"../tests/mail-archive\"\n#define MAILBOXDIR   \"../tests/mail-archive/mailbox\"\n#define LABEL        \"Hypermail Test Archive\"\n#define ABOUT_LINK   \"../\"\n#define LISTNAME     \"hypermail-test\"\n#define CONFIGFILE   \"../tests/test.rc\"\n\n# else\n#define HYPERMAIL    \"/usr/local/bin/hypermail\"\n#define ARCHIVE      \"NONE\"\n#define MAILBOXDIR   \"NONE\"\n#define LABEL        \"NONE\"\n#define ABOUT_LINK   \"NONE\"\n#define LISTNAME     \"NONE\"\n#define CONFIGFILE   \"NONE\"\n\n# endif /* HYPERTEST */\n#endif /* HYPERDEV */\n"
  },
  {
    "path": "archive/mbox2hypermail.c",
    "content": "/*\n**  FILE:          mbox2hypermail.c\n**  AUTHOR:        Kent Landfield\n**\n**  ABSTRACT:      read mailbox and print out messages individually and\n***                ship to hypermail to update a database.\n**\n** This software is Copyright (c) 1989 by Kent Landfield.\n**\n** Permission is hereby granted to copy, distribute or otherwise \n** use any part of this package as long as you do not try to make \n** money from it or pretend that you wrote it.  This copyright \n** notice must be maintained in any copy made.\n**                                                               \n*/\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <ctype.h>\n#include <string.h>\n#include <stdlib.h>\n#include \"lists.h\"\n\n#undef isspace\n\n#define USAGE  \"usage: %s -D YYYY [ -tvd ] [ mailbox ]\\n\"\n\n#define MAX_MONTH_LEN 20\n\nchar *progname;\t\t\t/* name of executable            */\nchar lastline[BUFSIZ];\t\t/* read-behind  buffer           */\nchar s[BUFSIZ];\t\t\t/* read buffer                   */\nchar *year;\nchar *month;\nchar *configfile;\n\nint debug;\nint verbose;\nint test;\n\nFILE *errfp;\t\t\t/* standard error file pointer   */\nFILE *logfp;\t\t\t/* standard output file pointer  */\nFILE *mailbox;\n\nextern char *optarg;\nextern int optind;\n\n#ifdef lint \nextern int getopt(int, char * const *, const char *);\nextern int strcasecmp(const char *, const char *); \nextern char *strdup(const char *);\n#endif \n\nstatic FILE *safe_tmpfile(void)\n{\n  int fd;\n  char *tfile;\n\n  tfile = strdup(\"hn-inXXXXXX\");\n\n  if ((fd = mkstemp(tfile)) < 0)\n    return(NULL);\n\n  unlink(tfile);\n\n  if (fchmod(fd, S_IRUSR | S_IWUSR) != 0)\n    return(NULL);\n\n  return(fdopen(fd, \"w+b\"));\n}\n\nstatic FILE *efopen(char *file, char *mode)\n{\n    FILE *fp;\n \n    if ((fp = fopen(file, mode)) == NULL) {\n        (void)fprintf(errfp, \"Can't open file %s\\n\", file);\n        exit(10);\n    }\n    return (fp);\n}\n\nstatic char *readline(int size, FILE *file)\n{\n    /*\n       ** If not first time through, save the previous line read into lastline.\n     */\n\n    if (s[0] != '\\0')\n\t(void)strcpy(lastline, s);\n\n    if (fgets(s, size, file) == NULL)\n\treturn (NULL);\n\n    return (s);\n}\n\nstatic int blankline(char *line)\n{\n    register char *cp;\n\n    for (cp = line; *cp; cp++) {\n\tif (!isspace(*cp))\n\t    return (0);\n    }\n    return (1);\n}\n\nstatic void process_messages(char *flname)\n{\n    char msgfile[BUFSIZ];\n    char cmdstr[BUFSIZ];\n    char from[BUFSIZ];\n\n    int cntr;\n    int first;\n\n    FILE *msgfp;\n\n    if (verbose)\n\tfprintf(stderr, \"Processing mailbox %s\\n\", flname);\n\n    /*\n    ** Standard input or a mailbox file ? \n     */\n    if (flname != NULL)\n\tmailbox = efopen(flname, \"r\");\n    else\n\tmailbox = stdin;\n\n    first = 1;\n    cntr = 0;\n    lastline[0] = '\\0';\n\n    /*\n    ** Create message file\n    */\n    if ((msgfp = safe_tmpfile()) == NULL) {\n         fprintf(stderr,\"%s: Can't open tempfile\\n\",progname);\n         exit(10);\n    }\n\n    if (month != NULL) {  /* AUDIT biege: external input -> cmd exec + bof */\n\tif (configfile != NULL) {\n#ifdef HAVE_SNPRINTF\n            snprintf(cmdstr, sizeof(cmdstr), \n#else\n\t    sprintf(cmdstr, \n#endif\n\t            \"/bin/cat %s | %s -u -i -c %s -d %s/%s/%s\",\n\t\t    msgfile, HYPERMAIL, configfile, ARCHIVE, year, month);\n        }\n\telse {\n#ifdef HAVE_SNPRINTF\n            snprintf(cmdstr, sizeof(cmdstr), \n#else\n\t    sprintf(cmdstr,\n#endif\n\t\t    \"/bin/cat %s | %s -u -i -d %s/%s/%s -l \\\"%s\\\" -b %s\",\n\t\t    msgfile, HYPERMAIL, ARCHIVE, year, month, LABEL,\n\t\t    ABOUT_LINK);\n        }\n    }\n    else {\n\tif (configfile != NULL) {\n#ifdef HAVE_SNPRINTF\n            snprintf(cmdstr, sizeof(cmdstr), \n#else\n\t    sprintf(cmdstr, \n#endif\n                    \"/bin/cat %s | %s -u -i -c %s -d %s/%s\",\n\t\t    msgfile, HYPERMAIL, configfile, ARCHIVE, year);\n        }\n\telse {\n#ifdef HAVE_SNPRINTF\n            snprintf(cmdstr, sizeof(cmdstr), \n#else\n\t    sprintf(cmdstr,\n#endif\n\t\t    \"/bin/cat %s | %s -u -i -d %s/%s -l \\\"%s\\\" -b %s\",\n\t\t    msgfile, HYPERMAIL, ARCHIVE, year, LABEL, ABOUT_LINK);\n        }\n    }\n\n    if (debug) {\n\tfprintf(stderr, \"cmdstr == [%s]\\n\", cmdstr);\n\texit(0);\n    }\n\n    while (readline(sizeof(s), mailbox) != NULL) {\n\tif (strncmp(s, \"From \", 5) == 0) {\n\t    strcpy(from, s);\n\t    if (first == 1) {\t/* First From in file ? */\n\t\tfirst = 0;\n\t    }\n\t    else if (blankline(lastline)) {\n\t\t/*\n\t\t   ** If From and last line is a blank line we have\n\t\t   ** found the message separator. Time to go to work.\n\t\t */\n\n\t\tfflush(msgfp);\n\t\tfclose(msgfp);\n\t\tif (verbose)\n\t\t    fputs(from, errfp);\n\n\t\tif (!test)\n\t\t    system(cmdstr);\n\n\t\t++cntr;\n\t\tmsgfp = efopen(msgfile, \"w\");\n\t    }\n\t}\n\t(void)fputs(s, msgfp);\n    }\n    fclose(mailbox);\n    fflush(msgfp);\n    fclose(msgfp);\n\n    if (verbose)\n\tfputs(from, errfp);\n\n    if (!test)\n\tsystem(cmdstr);\n\n    if (!first)\n\t++cntr;\n\n    if (verbose)\n\tfprintf(stderr, \"%d messages processed\\n\", cntr);\n}\n\n/*\n** Ye Olde Main\n*/\nint main(int argc, char **argv)\n{\n    int c;\n\n    progname = argv[0];\n    debug = verbose = 0;\n    logfp = stdout;\n    errfp = stderr;\n\n    configfile = CONFIGFILE;\n\n    if (argc > 1) {\n\twhile ((c = getopt(argc, argv, \"c:dtvY:M:\")) != EOF) {\n\t    switch (c) {\n\t    case 'c':\n\t\tconfigfile = strdup(optarg);\n\t\tbreak;\n\t    case 'M':\n\t\tmonth = optarg;\n                if (strlen(month) > MAX_MONTH_LEN) {\n\t\t    (void)fprintf(errfp, \"%s: Invalid month format, %d character month maximum.\\n\", progname, MAX_MONTH_LEN);\n\t\t    return (1);\n                }\n\t\tbreak;\n\t    case 'Y':\n\t\tyear = optarg;\n                /* check and make sure it is a year.*/\n                if (strlen(year) > 4) {\n\t\t    (void)fprintf(errfp, \"%s: Invalid year format, 4 digit year maximum.\\n\", progname);\n\t\t    return (1);\n                }\n    \n\t\tbreak;\n\t    case 'd':\n\t\tdebug++;\n\t\tbreak;\n\t    case 'v':\n\t\tverbose++;\n\t\tbreak;\n\t    case 't':\n\t\ttest++;\n\t\tverbose++;\n\t\tbreak;\n\t    default:\n\t\t(void)fprintf(errfp, USAGE, progname);\n\t\treturn (1);\n\t    }\n\t}\n    }\n\n    if (year == NULL) {\n\t(void)fprintf(errfp, \"%s: must specify the 4 digit year\\n\", progname);\n\t(void)fprintf(errfp, USAGE, progname);\n\treturn (1);\n    }\n\n    if (strcasecmp(configfile, \"NONE\") == 0)\n\tconfigfile = NULL;\n\n    /* if no month just put it in the year directory */\n\n    if ((optind >= argc) || (argc == 1)) {\t/* file from stdin */\n\tprocess_messages(NULL);\n    }\n    else {\n\tfor (; optind < argc; optind++)\t/* process files to print */\n\t    process_messages(argv[optind]);\n    }\n    return (0);\t\t\t/* terminate this process */\n}\n\n"
  },
  {
    "path": "archive/msg2archive.c",
    "content": "/*\n**  FILE:          msg2archive.c\n**  AUTHOR:        Kent Landfield\n**\n**  ABSTRACT:      update archived mailbox and \n***                ship to appropriate hypermail to update a database.\n**\n** This software is Copyright (c) 1996 by Kent Landfield.\n**\n** Permission is hereby granted to copy, distribute or otherwise \n** use any part of this package as long as you do not try to make \n** money from it or pretend that you wrote it.  This copyright \n** notice must be maintained in any copy made.\n**                                                               \n*/\n\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <time.h>\n#include <sys/wait.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include \"lists.h\"\n#include \"../config.h\"\n\nchar s[BUFSIZ];\t\t\t/* read buffer                      */\nchar cmdstr[BUFSIZ];\n\nchar *progname;\t\t\t/* name of executable               */\nchar *month;\t\t\t/* 3 letter mon abreviation         */\n\n/*\n** List information variables\n*/\n\nchar *configfile = CONFIGFILE;\t/* list's configuration file     */\nchar *listname = LISTNAME;\t/* name of the list              */\nchar *hypermail = HYPERMAIL;\t/* path to hypermail executable  */\nchar *archive = ARCHIVE;\t/* list archive base directory   */\nchar *mailboxdir = MAILBOXDIR;\t/* path to mailbox directory     */\nchar *label = LABEL;\t\t/* list's title/lable            */\nchar *about_link = ABOUT_LINK;\t/* list's about link             */\n\nint year;\t\t\t/* 4 digit year                     */\nint verbose;\nint test;\nint c;\n\ntime_t clk;\n\nstruct tm *now;\n\nFILE *msgfp;\nFILE *mailbox;\nFILE *hypfp;\n\nchar *months[] = { \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\",\n    \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\",\n    \"Nov\", \"Dec\"\n};\n\nextern int opterr;\nextern char *optarg;\n\nFILE *s_popen(char *cmd, const char *type);\n\nstatic int usage(void)\n{\n    (void)fprintf(stderr, \"usage: %s [options] (file on stdin only)\\n\", progname);\n    (void)fprintf(stderr, \"       -A archive-basedir\\n\");\n    (void)fprintf(stderr, \"       -b about_link\\n\");\n    (void)fprintf(stderr, \"       -c configfile\\n\");\n    (void)fprintf(stderr, \"       -H hypermail executable\\n\");\n    (void)fprintf(stderr, \"       -L listname\\n\");\n    (void)fprintf(stderr, \"       -l list lable\\n\");\n    (void)fprintf(stderr, \"       -M mailbox directory\\n\");\n    (void)fprintf(stderr, \"       -t testing (no execution, assumes -v)\\n\");\n    (void)fprintf(stderr, \"       -v verbose\\n\");\n    return (-1);\n}\n\nstatic FILE *safe_tmpfile(void)\n{\n  int fd;\n  char *tfile;\n\n  tfile = strdup(\"/tmp/hn-inXXXXXX\");\n\n  if ((fd = mkstemp(tfile)) < 0)\n    return(NULL);\n\nfprintf(stderr,\"%s: mkstemp(%s) succeeded\\n\", progname, tfile);\n\n/*\n  unlink(tfile); \n\n  if (fchmod(fd, S_IRUSR | S_IWUSR) != 0)\n    return(NULL);\n*/\n\n  return(fdopen(fd, \"w+b\"));\n}\n\nint main(int argc, char **argv)\n{\n    int inheader;\n\n    verbose = 0;\n    test = 0;\n    opterr = 0;\n\n    if ((progname = strrchr(argv[0], '/')) == NULL)\n\tprogname = argv[0];\n    else\n\tprogname++;\n\n    if (argc > 1) {\n\twhile ((c = getopt(argc, argv, \"A:b:c:H:L:l:M:tv\")) != EOF) {\n\t    switch (c) {\n\t    case 'A':\n\t\tarchive = optarg;\n\t\tbreak;\n\t    case 'b':\n\t\tabout_link = optarg;\n\t\tbreak;\n\t    case 'c':\n\t\tconfigfile = optarg;\n\t\tbreak;\n\t    case 'H':\n\t\thypermail = optarg;\n\t\tbreak;\n\t    case 'L':\n\t\tlistname = optarg;\n\t\tbreak;\n\t    case 'l':\n\t\tlabel = optarg;\n\t\tbreak;\n\t    case 'M':\n\t\tmailboxdir = optarg;\n\t\tbreak;\n\t    case 'v':\n\t\tverbose++;\n\t\tbreak;\n\t    case 't':\n\t\ttest++;\n\t\tverbose++;\n\t\tbreak;\n\t    default:\n\t\treturn (usage());\n\t    }\n\t}\n    }\n\n    if (strcasecmp(configfile, \"NONE\") == 0)\n\tconfigfile = NULL;\n\n    /* get the year and the month so that we can set up archive info */\n\n    clk = time((time_t *) 0);\n    now = localtime(&clk);\n\n    year = 1900 + now->tm_year;\n    month = months[now->tm_mon];\n\n    /*\n    ** Create temporary message file\n    ** and save the inbound message.\n    */\n\n    if ((msgfp = safe_tmpfile()) == NULL) {\n\t perror(\"tempfile open failed\");\n         fprintf(stderr,\"%s: Can't open tempfile\\n\",progname);\n         fprintf(stderr, \"uid = %ld - gid = %ld euid = %ld - egid = %ld\\n\",\n\t\t    (long)getuid(), (long)getgid(), (long)geteuid(),\n\t\t    (long)getegid());\n\t exit(10);\n    }\n\n    inheader = 1;\t\t/* guilty until proven innocent */\n\n    while (fgets(s, sizeof(s), stdin) != NULL) {\n\t/*\n\t   ** Need to escape lines in the body that\n\t   ** start with a \"^From \"\n\t */\n\tif (*s == '\\n')\n\t    inheader = 0;\n\n\tif (!inheader) {\n\t    if (!strncmp(s, \"From \", 5))\n\t\tfputs(\">\", msgfp);\n\t}\n\tfputs(s, msgfp);\n    }\n\n    fflush(msgfp);\n\n    /* \n    ** Append it to the current month's message file\n    */\n\n    /* AUDIT Thomas Biege: mailboxdir + listname are cmd line options */\n#ifdef HAVE_SNPRINTF\n    snprintf(cmdstr, sizeof(cmdstr), \n#else\n    sprintf(cmdstr, \n#endif\n             \"%s/%s.%.2d%.2d\", mailboxdir, listname, year, now->tm_mon + 1);\n\n    if (verbose)\n\tfprintf(stderr, \"Appending message to [%s]\\n\", cmdstr);\n\n    if (!test) {\n        /*  AUDIT Thomas Biege: \"../\" in mailboxdir or listname can be used\n        **               to write to files below the target direc.!\n        **               Take Care! I'll not fix it.\n        */\n\tif ((mailbox = fopen(cmdstr, \"a+\")) == NULL) {\n\t    fprintf(stderr,\"%s: Can't append message to %s\\n\",progname,cmdstr);\n\t    fprintf(stderr, \"uid = %ld - gid = %ld euid = %ld - egid = %ld\\n\",\n\t\t    (long)getuid(), (long)getgid(), (long)geteuid(),\n\t\t    (long)getegid());\n\n\t    exit(10);\n\t}\n\trewind(msgfp);\n\twhile (fgets(s, sizeof(s), msgfp) != NULL)\n\t    fputs(s, mailbox);\n\tfclose(mailbox);\n    }\n\n    /* \n    ** Send it to hypermail to archive it in the current month's archive\n    */\n\n    if (configfile == NULL)\n#ifdef HAVE_SNPRINTF\n        snprintf(cmdstr, sizeof(cmdstr), \n#else\n        sprintf(cmdstr, \n#endif\n                 \"%s -u -i -d %s/%d/%s -l \\\"%s\\\" -b %s\",\n                 hypermail, archive, year, month, label, about_link);\n    else\n#ifdef HAVE_SNPRINTF\n        snprintf(cmdstr,sizeof(cmdstr),\n#else\n        sprintf(cmdstr,\n#endif\n             \"%s -u -i -c %s\",hypermail,configfile);\n\n    if (verbose)\n\tfprintf(stderr, \"Piping message to [%s]\\n\", cmdstr);\n\n    if (!test) {\n       /* \n       ** Need to consider replacing with a safer popen.\n        if ((hypfp = popen(cmdstr, \"w\")) != NULL) {\n\t    pclose(hypfp);\n       */\n        if ((hypfp = s_popen(cmdstr, \"w\")) != NULL) {\n\t    rewind(msgfp);\n\t    while (fgets(s, sizeof(s), msgfp) != NULL)\n\t\tfputs(s, hypfp);\n\t    fflush(hypfp);\n\t    fclose(hypfp);\n\t}\n    }\n    fclose(msgfp); /* not needed for [s_]tmpfile() */\n    return (0);\t\t\t/* terminate this process */\n}\n\n\n#define __SEC_POPEN_TOKEN \" \"\n\nFILE *s_popen(char *cmd, const char *type)\n{\n  pid_t pid;\n  int pfd[2];\n  int rpipe = 0, wpipe = 0, i;\n  char **argv;\n  char *ptr;\n  char *cmdcpy;\n\n  if(cmd == NULL || cmd == \"\")\n    return(NULL);\n\n  if(type[0] != 'r' && type[0] != 'w')\n    return(NULL);\n\n  if ((cmdcpy = strdup(cmd)) == NULL)\n    return(NULL);\n\n  argv = NULL;\n\n  if( (ptr = strtok(cmdcpy, __SEC_POPEN_TOKEN)) == NULL) {\n    free(cmdcpy);\n    return(NULL);\n  }\n\n  for(i = 0;; i++) {\n    if( ( argv = (char **) realloc(argv, (i+1) * sizeof(char *)) ) == NULL) {\n      free(cmdcpy);\n      return(NULL);\n    }\n\n    if( (*(argv+i) = (char *) malloc((strlen(ptr)+1) * sizeof(char))) == NULL) {\n      free(cmdcpy);\n      return(NULL);\n    }\n\n    strcpy(argv[i], ptr);\n\n    if( (ptr = strtok(NULL, __SEC_POPEN_TOKEN)) == NULL) {\n      if( ( argv = (char **) realloc(argv, (i+2) * sizeof(char *))) == NULL) {\n        free(cmdcpy);\n        return(NULL);\n      }\n      argv[i+1] = NULL;\n      break;\n    }\n  }\n\n  if(type[0] == 'r')\n    rpipe = 1;\n  else\n    wpipe = 1;\n\n  if (pipe(pfd) < 0) {\n    free(cmdcpy);\n    return(NULL);\n  }\n\n  if((pid = fork()) < 0) {\n    close(pfd[0]);\n    close(pfd[1]);\n    free(cmdcpy);\n    return(NULL);\n  }\n\n  if(pid == 0) {   /* child */\n    if((pid = fork()) < 0) {\n      close(pfd[0]);\n      close(pfd[1]);\n      free(cmdcpy);\n      return(NULL);\n    }\n    if(pid > 0) {\n      exit(0);  /* child nr. 1 exits */\n    }\n\n    /* child nr. 2 */\n    if(rpipe) {\n      close(pfd[0]);  /* close reading end, we don't need it */\n      if (pfd[1] != STDOUT_FILENO)\n        dup2(pfd[1], STDOUT_FILENO);/* redirect stdout to writing end of pipe */\n        dup2(STDOUT_FILENO, STDERR_FILENO);\n    }\n    else {\n      close(pfd[1]);  /* close writing end, we don't need it */\n      if (pfd[0] != STDIN_FILENO)\n        dup2(pfd[0], STDIN_FILENO); /* redirect stdin to reading end of pipe */\n    }\n\n    if(strchr(argv[0], '/') == NULL)\n      execvp(argv[0], argv);  /* search in $PATH */\n    else\n      execv(argv[0], argv);\n\n    close(pfd[0]);\n    close(pfd[1]);\n    free(cmdcpy);\n    return(NULL);  /* exec failed.. ooops! */\n  }\n  else {         /* parent */\n    waitpid(pid, NULL, 0); /* wait for child nr. 1 */\n\n    if(rpipe) {\n      close(pfd[1]);\n      free(cmdcpy);\n      return(fdopen(pfd[0], \"r\"));\n    }\n    else {\n      close(pfd[0]);\n      free(cmdcpy);\n      return(fdopen(pfd[1], \"w\"));\n    }\n  }\n}\n\n\n"
  },
  {
    "path": "archive/runtest",
    "content": "#!/bin/sh\n#\n\nDIR=`pwd`\nMsg2archive=$DIR/msg2archive\nTestMsg=$DIR/test-msg\n\nif [ ! -d  ../tests/mail-archive ]; then\n     mkdir ../tests/mail-archive\nfi\n\nif [ ! -d  ../tests/mail-archive/mailbox ]; then\n     mkdir ../tests/mail-archive/mailbox\nfi\n\n#cat test-msg | htestmail -v\n\n# Tests for generic msg2archive executable\n#\n# usage: msg2archive [options] (file on stdin only)\n#        -A archive-basedir      (#define ARCHIVE)\n#        -b about_link           (#define ABOUT_LINK)\n#        -c configfile           (#define CONFIGFILE)\n#        -H hypermail executable (#define HYPERMAIL)\n#        -L listname             (#define LISTNAME)\n#        -l list lable           (#define LABEL)\n#        -M mailbox directory    (#define MAILBOXDIR)\n#        -t testing (no execution, assumes -v)\n#        -v verbose\n\n(cd ../tests; cat $TestMsg | $Msg2archive -v -A mail-archive -b ../ -c test.rc -H ../src/hypermail -L hypermail-test -l \"Hypermail Test Archive\" -M mail-archive/mailbox)\n\n"
  },
  {
    "path": "archive/test-msg",
    "content": "From bel@llnl.gov Fri Aug 28 11:15 PDT 1998\nReceived: from pierce.llnl.gov (pierce.llnl.gov [128.115.18.253])\n        by k2.llnl.gov (8.8.5/8.8.5/LLNL-Jun96) with ESMTP id LAA17195\n        for <perra@k2.llnl.gov>; Fri, 28 Aug 1998 11:15:55 -0700 (PDT)\nReceived: from popcorn.llnl.gov by pierce.llnl.gov (8.8.8/LLNL-1.18/llnl.gov-04.5)\n        id LAA02432; Fri, 28 Aug 1998 11:15:55 -0700 (PDT)\nReceived: from archive-xke.llnl.gov (archive-xke.llnl.gov [128.115.172.48])\n          by popcorn.llnl.gov (8.8.8/LLNL-3.0.2) with SMTP\n          id LAA28465; Fri, 28 Aug 1998 11:15:53 -0700 (PDT)\nMessage-Id: <4.0.5.32.19980828111501.00903100@popcorn.llnl.gov>\nX-Sender: e546171@popcorn.llnl.gov\nX-Mailer: QUALCOMM Windows Eudora Pro Version 3.0.5 (32)\nDate: Fri, 28 Aug 1998 11:15:01 -0700\nTo: Joanne Perra <perra1@llnl.gov>\nFrom: \"DeMarotta, Louis Joseph, Jr. (LZD) \" <lzd@ornl.gov> \n\t\" <bel@llnl.gov>)\nSubject: RE: When NWIG grows up...\nCc: kent@landfield.com\nMime-Version: 1.0\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 145\n\nhas any one seen it,yet???\n\nLou\n\n> -----Original Message-----\n...\ndeleted content\n...\n\nFrom the beginning\n\nFrom the start\nFrom now until tomorrow\n\nJoanne and Kent,\nHere's a message redirected from Eudora.\n\n----\nGordon H. Buchan \ngordon@pobox.com \nhttp://gordon.anadas.com \n\n----------------------------------------------------------------------------- \nTo unsubscribe from the CUSIDnet mailing list, send a message to \ncusid-request@anadas.com with the following command in the message \nunsubscribe your@nfr.net, dave@where or sam@hear.com\nFollow CUSIDnet on the web at http://cusidnet.anadas.com \n----------------------------------------------------------------------------- \n\n"
  },
  {
    "path": "autogen.sh",
    "content": "#!/bin/sh\nautoconf\nrm -rf autom4te.cache\n"
  },
  {
    "path": "config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-20'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Per Bothner <per@bothner.com>.\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# The plan is that this can be called by configure scripts if you\n# don't specify an explicit build system type.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\n\ndummy=dummy-$$\ntrap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script.\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\nset_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int dummy(){}\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;\n\t  if test $? = 0 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\trm -f $dummy.c $dummy.o $dummy.rel ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep __ELF__ >/dev/null\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t        os=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit 0 ;;\n    amiga:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    arc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    hp300:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mac68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    macppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme88k:OpenBSD:*:*)\n\techo m88k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvmeppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    pmax:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sgi:OpenBSD:*:*)\n\techo mipseb-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sun3:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    wgrisc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    *:OpenBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    alpha:OSF1:*:*)\n\tif test $UNAME_RELEASE = \"V4.0\"; then\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\tfi\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\tcat <<EOF >$dummy.s\n\t.data\n\\$Lformat:\n\t.byte 37,100,45,37,120,10,0\t# \"%d-%x\\n\"\n\n\t.text\n\t.globl main\n\t.align 4\n\t.ent main\nmain:\n\t.frame \\$30,16,\\$26,0\n\tldgp \\$29,0(\\$27)\n\t.prologue 1\n\t.long 0x47e03d80 # implver \\$0\n\tlda \\$2,-1\n\t.long 0x47e20c21 # amask \\$2,\\$1\n\tlda \\$16,\\$Lformat\n\tmov \\$0,\\$17\n\tnot \\$1,\\$18\n\tjsr \\$26,printf\n\tldgp \\$29,0(\\$26)\n\tmov 0,\\$16\n\tjsr \\$26,exit\n\t.end main\nEOF\n\teval $set_cc_for_build\n\t$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null\n\tif test \"$?\" = 0 ; then\n\t\tcase `./$dummy` in\n\t\t\t0-0)\n\t\t\t\tUNAME_MACHINE=\"alpha\"\n\t\t\t\t;;\n\t\t\t1-0)\n\t\t\t\tUNAME_MACHINE=\"alphaev5\"\n\t\t\t\t;;\n\t\t\t1-1)\n\t\t\t\tUNAME_MACHINE=\"alphaev56\"\n\t\t\t\t;;\n\t\t\t1-101)\n\t\t\t\tUNAME_MACHINE=\"alphapca56\"\n\t\t\t\t;;\n\t\t\t2-303)\n\t\t\t\tUNAME_MACHINE=\"alphaev6\"\n\t\t\t\t;;\n\t\t\t2-307)\n\t\t\t\tUNAME_MACHINE=\"alphaev67\"\n\t\t\t\t;;\n\t\t\t2-1307)\n\t\t\t\tUNAME_MACHINE=\"alphaev68\"\n\t\t\t\t;;\n\t\tesac\n\tfi\n\trm -f $dummy.s $dummy\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\texit 0 ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit 0 ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit 0 ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit 0;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit 0 ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit 0 ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit 0 ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit 0;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit 0;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit 0 ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit 0 ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    i86pc:SunOS:5.*:*)\n\techo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit 0 ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit 0 ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n        echo m68k-milan-mint${UNAME_RELEASE}\n        exit 0 ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n        echo m68k-hades-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n        echo m68k-unknown-mint${UNAME_RELEASE}\n        exit 0 ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit 0 ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit 0 ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit 0 ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy \\\n\t  && ./$dummy `echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` \\\n\t  && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit 0 ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit 0 ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit 0 ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit 0 ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit 0 ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    AViiON:dgux:*:*)\n        # DG/UX returns AViiON for all architectures\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n \texit 0 ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit 0 ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit 0 ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit 0 ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit 0 ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id\n\texit 0 ;;              # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit 0 ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\t\trm -f $dummy.c $dummy\n\t\techo rs6000-ibm-aix3.2.5\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit 0 ;;\n    *:AIX:*:[45])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit 0 ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit 0 ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit 0 ;;                           # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit 0 ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit 0 ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit 0 ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit 0 ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n                    case \"${sc_cpu_version}\" in\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n                      532)                      # CPU_PA_RISC2_0\n                        case \"${sc_kernel_bits}\" in\n                          32) HP_ARCH=\"hppa2.0n\" ;;\n                          64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n                        esac ;;\n                    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^              //' << EOF >$dummy.c\n\n              #define _HPUX_SOURCE\n              #include <stdlib.h>\n              #include <unistd.h>\n\n              int main ()\n              {\n              #if defined(_SC_KERNEL_BITS)\n                  long bits = sysconf(_SC_KERNEL_BITS);\n              #endif\n                  long cpu  = sysconf (_SC_CPU_VERSION);\n\n                  switch (cpu)\n              \t{\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n              \tcase CPU_PA_RISC2_0:\n              #if defined(_SC_KERNEL_BITS)\n              \t    switch (bits)\n              \t\t{\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\n              \t\tdefault: puts (\"hppa2.0\"); break;\n              \t\t} break;\n              #else  /* !defined(_SC_KERNEL_BITS) */\n              \t    puts (\"hppa2.0\"); break;\n              #endif\n              \tdefault: puts (\"hppa1.0\"); break;\n              \t}\n                  exit (0);\n              }\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`\n\t\t    if test -z \"$HP_ARCH\"; then HP_ARCH=hppa; fi\n\t\t    rm -f $dummy.c $dummy\n\t\tfi ;;\n\tesac\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo unknown-hitachi-hiuxwe2\n\texit 0 ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit 0 ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit 0 ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit 0 ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit 0 ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit 0 ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit 0 ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit 0 ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n        exit 0 ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n        exit 0 ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n        exit 0 ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n        exit 0 ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n        exit 0 ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3D:*:*:*)\n\techo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n        exit 0 ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:FreeBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit 0 ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit 0 ;;\n    i*:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit 0 ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit 0 ;;\n    x86:Interix*:3*)\n\techo i386-pc-interix3\n\texit 0 ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i386-pc-interix\n\texit 0 ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit 0 ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit 0 ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    *:GNU:*:*)\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit 0 ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit 0 ;;\n    arm*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    mips:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef mips\n\t#undef mipsel\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=mipsel\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=mips\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`\n\trm -f $dummy.c\n\ttest x\"${CPU}\" != x && echo \"${CPU}-pc-linux-gnu\" && exit 0\n\t;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit 0 ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit 0 ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n        esac\n\tobjdump --private-headers /bin/sh | grep ld.so.1 >/dev/null\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit 0 ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit 0 ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit 0 ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit 0 ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    x86_64:Linux:*:*)\n\techo x86_64-unknown-linux-gnu\n\texit 0 ;;\n    i*86:Linux:*:*)\n\t# The BFD linker knows what the default object file format is, so\n\t# first see if it will tell us. cd to the root directory to prevent\n\t# problems with other programs or directories called `ld' in the path.\n\t# Set LC_ALL=C to ensure ld outputs messages in English.\n\tld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \\\n\t\t\t | sed -ne '/supported targets:/!d\n\t\t\t\t    s/[ \t][ \t]*/ /g\n\t\t\t\t    s/.*supported targets: *//\n\t\t\t\t    s/ .*//\n\t\t\t\t    p'`\n        case \"$ld_supported_targets\" in\n\t  elf32-i386)\n\t\tTENTATIVE=\"${UNAME_MACHINE}-pc-linux-gnu\"\n\t\t;;\n\t  a.out-i386-linux)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuaout\"\n\t\texit 0 ;;\t\t\n\t  coff-i386)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnucoff\"\n\t\texit 0 ;;\n\t  \"\")\n\t\t# Either a pre-BFD a.out linker (linux-gnuoldld) or\n\t\t# one that does not give us useful --help.\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuoldld\"\n\t\texit 0 ;;\n\tesac\n\t# Determine whether the default compiler is a.out or elf\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <features.h>\n\t#ifdef __ELF__\n\t# ifdef __GLIBC__\n\t#  if __GLIBC__ >= 2\n\tLIBC=gnu\n\t#  else\n\tLIBC=gnulibc1\n\t#  endif\n\t# else\n\tLIBC=gnulibc1\n\t# endif\n\t#else\n\t#ifdef __INTEL_COMPILER\n\tLIBC=gnu\n\t#else\n\tLIBC=gnuaout\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`\n\trm -f $dummy.c\n\ttest x\"${LIBC}\" != x && echo \"${UNAME_MACHINE}-pc-linux-${LIBC}\" && exit 0\n\ttest x\"${TENTATIVE}\" != x && echo \"${TENTATIVE}\" && exit 0\n\t;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit 0 ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n        # Unixware is an offshoot of SVR4, but it has its own version\n        # number series starting with 2...\n        # I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n        # Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit 0 ;;\n    i*86:*:5:[78]*)\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit 0 ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit 0 ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\n        # the processor, so we play safe by assuming i386.\n\techo i386-pc-msdosdjgpp\n        exit 0 ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit 0 ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit 0 ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit 0 ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit 0 ;;\n    M68*:*:R3V[567]*:*)\n\ttest -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;\n    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && echo i486-ncr-sysv4.3${OS_REL} && exit 0\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n          && echo i486-ncr-sysv4 && exit 0 ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit 0 ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit 0 ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit 0 ;;\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\n        echo i586-unisys-sysv4\n        exit 0 ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit 0 ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit 0 ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit 0 ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit 0 ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit 0 ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t        echo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n        exit 0 ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit 0 ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit 0 ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit 0 ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Darwin:*:*)\n\techo `uname -p`-apple-darwin${UNAME_RELEASE}\n\texit 0 ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit 0 ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit 0 ;;\n    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit 0 ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit 0 ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit 0 ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit 0 ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit 0 ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit 0 ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit 0 ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit 0 ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit 0 ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit 0 ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit 0 ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit 0 ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit 0 ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit 0 ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n          \"4\"\n#else\n\t  \"\"\n#endif\n         ); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0\nrm -f $dummy.c $dummy\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit 0 ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit 0 ;;\n    c34*)\n\techo c34-convex-bsd\n\texit 0 ;;\n    c38*)\n\techo c38-convex-bsd\n\texit 0 ;;\n    c4*)\n\techo c4-convex-bsd\n\texit 0 ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n    ftp://ftp.gnu.org/pub/gnu/config/\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "config.h.in",
    "content": "/* config.h.in.  Generated automatically from configure.in by autoheader.  */\n\n/* Define if you have the strftime function.  */\n#undef HAVE_STRFTIME\n\n/* Define to `unsigned' if <sys/types.h> doesn't define.  */\n#undef size_t\n\n/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */\n#undef STAT_MACROS_BROKEN\n\n/* Define if you have the ANSI C header files.  */\n#undef STDC_HEADERS\n\n/* Define if you can safely include both <sys/time.h> and <time.h>.  */\n#undef TIME_WITH_SYS_TIME\n\n/* Define if your <sys/time.h> declares struct tm.  */\n#undef TM_IN_SYS_TIME\n\n#undef HAVE_GDBM_H\n\n#undef HAVE_ICONV\n#undef HAVE_ICONV_H\n\n/* Define if you're using the FNV hash library */\n#undef HAVE_LIBFNV\n\n/* Define if you have the getopt function.  */\n#undef HAVE_GETOPT\n\n/* Define if you have the getpwuid function.  */\n#undef HAVE_GETPWUID\n\n/* Define if you have the lstat function.  */\n#undef HAVE_LSTAT\n\n/* Define if you have the memcpy function.  */\n#undef HAVE_MEMCPY\n\n/* Define if you have the memset function.  */\n#undef HAVE_MEMSET\n\n/* Define if you have the mkdir function.  */\n#undef HAVE_MKDIR\n\n/* Define if you have the strcasecmp function.  */\n#undef HAVE_STRCASECMP\n\n/* Define if you have the strcasestr function.  */\n#undef HAVE_STRCASESTR\n\n/* Define if you have the strdup function.  */\n#undef HAVE_STRDUP\n\n/* Define if you have the strstr function.  */\n#undef HAVE_STRSTR\n\n/* Define if you have the strtol function.  */\n#undef HAVE_SNPRINTF\n\n/* Define if you have the strtol function.  */\n#undef HAVE_STRTOL\n\n/* Define if you have the <alloca.h> header file.  */\n#undef HAVE_ALLOCA_H\n\n/* Define if you have the <arpa/inet.h> header file.  */\n#undef HAVE_ARPA_INET_H\n\n/* Define if you have the <ctype.h> header file.  */\n#undef HAVE_CTYPE_H\n\n/* Define if you have the <dirent.h> header file.  */\n#undef HAVE_DIRENT_H\n\n/* Define if you have the <errno.h> header file.  */\n#undef HAVE_ERRNO_H\n\n/* Define if you have the <fcntl.h> header file.  */\n#undef HAVE_FCNTL_H\n\n/* Define if you have the <locale.h> header file.  */\n#undef HAVE_LOCALE_H\n\n/* Define if you have the <malloc.h> header file.  */\n#undef HAVE_MALLOC_H\n\n/* Define if you have the <ndir.h> header file.  */\n#undef HAVE_NDIR_H\n\n/* Define if you have the <netdb.h> header file.  */\n#undef HAVE_NETDB_H\n\n/* Define if you have the <netinet/in.h> header file.  */\n#undef HAVE_NETINET_IN_H\n\n/* Define if you have the <pwd.h> header file.  */\n#undef HAVE_PWD_H\n\n/* Define if you have the <stdarg.h> header file.  */\n#undef HAVE_STDARG_H\n\n/* Define if you have the <stdio.h> header file.  */\n#undef HAVE_STDIO_H\n\n/* Define if you have the <stdlib.h> header file.  */\n#undef HAVE_STDLIB_H\n\n/* Define if you have the <string.h> header file.  */\n#undef HAVE_STRING_H\n\n/* Define if you have the <sys/dir.h> header file.  */\n#undef HAVE_SYS_DIR_H\n\n/* Define if you have the <sys/ndir.h> header file.  */\n#undef HAVE_SYS_NDIR_H\n\n/* Define if you have the <sys/param.h> header file.  */\n#undef HAVE_SYS_PARAM_H\n\n/* Define if you have the <sys/socket.h> header file.  */\n#undef HAVE_SYS_SOCKET_H\n\n/* Define if you have the <sys/stat.h> header file.  */\n#undef HAVE_SYS_STAT_H\n\n/* Define if you have the <sys/time.h> header file.  */\n#undef HAVE_SYS_TIME_H\n\n/* Define if you have the <sys/types.h> header file.  */\n#undef HAVE_SYS_TYPES_H\n\n/* Define if you have the <time.h> header file.  */\n#undef HAVE_TIME_H\n\n/* Define if you have the <unistd.h> header file.  */\n#undef HAVE_UNISTD_H\n\n/* Whether you have GDBM */\n#undef GDBM\n\n/* Whether you want function version of ctype functions  */\n#undef NO_MACRO\n\n/* The following two definitions are mainly for the benefit of SunOS4, which\ndoesn't have the strerror() or memmove() functions that should be present in\nall Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should\nnormally be defined with the value 1 for other systems, but unfortunately we\ncan't make this the default because \"configure\" files generated by autoconf\nwill only change 0 to 1; they won't change 1 to 0 if the functions are not\nfound. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */\n\n#define HAVE_STRERROR 0\n#define HAVE_MEMMOVE  0\n#define HAVE_BCOPY    0\n"
  },
  {
    "path": "config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-07'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330,\n# Boston, MA 02111-1307, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit 0;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n \t-chorusrdb)\n \t\tos=-chorusrdb\n\t\tbasic_machine=$1\n \t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dsp16xx \\\n\t| fr30 \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| m32r | m68000 | m68k | m88k | mcore \\\n\t| mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \\\n\t| mips64vr4100 | mips64vr4100el | mips64vr4300 \\\n\t| mips64vr4300el | mips64vr5000 | mips64vr5000el \\\n\t| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \\\n\t| mipsisa32 | mipsisa64 \\\n\t| mn10200 | mn10300 \\\n\t| ns16k | ns32k \\\n\t| openrisc | or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \\\n\t| pyramid \\\n\t| sh | sh[34] | sh[34]eb | shbe | shle | sh64 \\\n\t| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \\\n\t| strongarm \\\n\t| tahoe | thumb | tic80 | tron \\\n\t| v850 | v850e \\\n\t| we32k \\\n\t| x86 | xscale | xstormy16 | xtensa \\\n\t| z8k)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12)\n\t\t# Motorola 68HC11/12.\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armv*-* \\\n\t| avr-* \\\n\t| bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c54x-* \\\n\t| clipper-* | cydra-* \\\n\t| d10v-* | d30v-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fr30-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| m32r-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | mcore-* \\\n\t| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \\\n\t| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \\\n\t| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \\\n\t| pyramid-* \\\n\t| romp-* | rs6000-* \\\n\t| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \\\n\t| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \\\n\t| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \\\n\t| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \\\n\t| v850-* | v850e-* | vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \\\n\t| xtensa-* \\\n\t| ymp-* \\\n\t| z8k-*)\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n# I'm not sure what \"Sysv32\" means.  Should this be sysv3.2?\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmmix*)\n\t\tbasic_machine=mmix-knuth\n\t\tos=-mmixware\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\tor32 | or32-*)\n\t\tbasic_machine=or32-unknown\n\t\tos=-coff\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n        pc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc)\tbasic_machine=powerpc-unknown\n\t        ;;\n\tppc-*)\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t        ;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t        ;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t        ;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n        sv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3d)\n\t\tbasic_machine=alpha-cray\n\t\tos=-unicos\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttic54x | c54x*)\n\t\tbasic_machine=tic54x-unknown\n\t\tos=-coff\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n               basic_machine=f301-fujitsu\n               ;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\twindows32)\n\t\tbasic_machine=i386-pc\n\t\tos=-windows32-msvcrt\n\t\t;;\n        xps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh3 | sh4 | sh3eb | sh4eb)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparc | sparcv9 | sparcv9b)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n        cydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\tc4x*)\n\t\tbasic_machine=c4x-none\n\t\tos=-coff\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n        # First match some system type aliases\n        # that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \\\n\t      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* \\\n\t      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto*)\n\t\tos=-nto-qnx\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t        os=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t        os=-mint\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n        pdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t# This also exists in the configure program, but was not the\n\t\t# default.\n\t\t# os=-sunos4\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n        *-gould)\n\t\tos=-sysv\n\t\t;;\n        *-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n        *-sgi)\n\t\tos=-irix\n\t\t;;\n        *-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "configs/hmrc.example",
    "content": "#\n# hmrc.example:\n#\n# This is a sample Hypermail configuration file. If you wish\n# to use it, copy it to a new filename and edit as appropriate\n# for you list needs.\n#\n\n# language = [ en | de | es | fi | fr | is | pl | pt | sv | no | el | gr | ru | it ]\n#\n# This is a two-letter string specifying the default language to use.\n# Set this the value of the language table you wish to use when running \n# and generating archives.\n\nlanguage = en\n\n# htmlsuffix = html\n#\n# Use this to specify the html file suffix to be used when Hypermail \n# generates the HTML files. This is dependent on local needs. \n#\n# NOTE: Do not put a '.' in the value. It would result in \\\"file..html\\\n\nhtmlsuffix = html\n\n# mbox = [ filename | NONE ]\n#\n# This is the default mailbox to read messages in from. Set this\n# with a value of NONE to read from standard input as the default.\n\nmbox = NONE\n\n# ietf_mbox = [ 0 | 1 ]\n#\n# Set this to On to read mboxes using the IETF convention.\n\nietf_mbox = 0\n\n# label = [ Title | NONE ]\n#\n# This is the default title you want to call your archives.\n# Set this to NONE to use the name of the input mailbox.\n\nlabel = Hypermail Development List\n\n# archives = [ URL | NONE ]\n#\n# This will create a link in the archived index pages labeled\n# 'Other mail archives' to the specified URL. Set this to NONE\n# to omit such a link\n\narchives = NONE\n\n# custom_archives = [ text | NONE ]\n#\n# If this variable is defined, a navigation entry will be\n# created below the sorted_by_x list entry, with the text\n# Other mail archives: followed by the value of this variable.\n# Set it to NONE to ommit such an entry.\n\n#custom_archives = \n\n\n# about = [ URL | NONE ]\n#\n# This creates a link in the archived index pages labeled\n# \"About this archive\". Set this to NONE to omit such a link.\n\nabout = NONE\n\n# dir = [ directory path | NONE ]\n#\n# This is the default directory that Hypermail uses when creating\n# and updating archives. If set to NONE, the directory will have the\n# same name as the input mailbox.\n\ndir = NONE\n\n# defaultindex = [ thread | date | subject | author | attachment ]\n#\n# This indicates the default type of main index hypermail will generate.\n# Users see this type of index when the archive is first accessed.\n# Valid types are date, thread, author, subject, and attachment. When\n# using the folder_by_date or msgsperfolder options, this option applies\n# to subdirectories.\n\ndefaultindex = thread\n\n# default_top_index = [ thread | date | subject | author | folders | attachment ]\n#\n# This specifies the default index that  users can view when\n# entering the top level of an archive that uses the folder_by_date\n# or msgsperfolder option. Valid types are date, thread, author,\n# subject, attachment, and folders.\n\ndefault_top_index = folders\n\n# avoid_indices = [ thread | date | subject | author | folders | attachment ]\n#\n# This is a list of index files to not generate. Valid types are\n# date, thread, author, and subject. When using the folder_by_date or\n# msgsperfolder options, this option applies to subdirectories.\n#avoid_indices = \n\n# avoid_top_indices = [ thread | date | subject | author | folders | attachment ]\n#\n# This is a list of index files to not generate for the top\n# directory of an archive using the folder_by_date or\n# msgsperfolder option. Valid types are date, thread, author, \n# subject, folders, and attachment.\n\navoid_top_indices = date thread author subject\n\n\n# inlinehtml [ 0 | 1 ]\n#\n# This is used to make text/html parts to get inlined within the \n# mail messages. If not set on, HTML-parts will be stored as separate \n# files.\n\ninlinehtml = 1\n\n# reverse = [ 0 | 1 ]\n#\n# Setting this variable to 1 will reverse-sort the article\n# entries in the date and thread index files by the date they\n# were received. That is, the most recent messages will appear\n# at the top of the index rather than the other way around.\n# Set to 0 if you want latest message on the bottom for date and\n# thread indexes.\n\nreverse = 0\n\n# usetable = [ 0 | 1 ]\n#\n# Setting this variable to 1 will tell Hypermail to generate an\n# index menu at the top and bottom of each page in a table format.\n# Set to 0 if you want the standard Hypermail page look and feel.\n\nusetable = 0\n\n# indextable [ 0 | 1 ]\n# \n# Setting this variable to 1 will tell Hypermail to generate\n# message index Subject/Author/Date listings using a nice table\n# format. Set to 0 if you want the original Hypermail index look.\n\nindextable = 0\n\n# progress = [ 0 | 1 | 2 ]\n#\n# Set this to 1 or 2 to always show a progress report as Hypermail\n# works. With a setting of 1, hypermail overwrites the progress \n# information relating to attachment creation. With a setting of 2, \n# attachment creation information is listed individually with the \n# number of the message the attachments relate to. Set to 0 for \n# silent operation. Output goes to standard output.\n\nprogress = 0\n\n# show_msg_links = [ 0 | 1 | 3 | 4 ]\n#\n# Set this to 1 if you want links to Next, Prev, Next thread, Reply to, \n# etc, displayed on the article pages. Setting this to 0 disables these \n# links from appearing on the generated pages.\n# Set it to 3 to show the links only at the top of the message\n# pages, or 4 to produce those links only at the bottom of the\n# message.\n\nshow_msg_links = 1\n\n# showheaders = [ 0 | 1 ]\n#\n# Set this to 1 to show the article header lines in the archived HTML\n# files.  These lines typically include the To:, From:, and Subject:\n# information found in most email messages.  Set to 0 if you want to \n# hide mail headers in articles.\n\nshowheaders = 0\n\n# showreplies = [ 0 | 1 ]\n#\n# Set to 1 to show all replies to a message as links in article files.\n# If this is set to 0 no reply links are generated.\n\nshowreplies = 1\n\n# showhtml = [ 0 | 1 | 2 ]\n#\n# Set this to 1 to show the articles in a proportionally-spaced\n# font rather than a fixed-width (monospace) font.\n# Set this to 2 for more complex conversion to html\n# similar to that in <a href=\"http://www.cs.wustl.edu/~seth/txt2html/\">txt2html.pl</a>.\n# Showhtml = 2 will normally produce nicer looking results than\n# showhtml = 1, and showhtml = 0 will look pretty dull, but\n# 1 and 2 run risks of altering the appearance in undesired ways.\n\nshowhtml = 1\n\n# showbr = [ 0 | 1 ]\n#\n# Set this to 1 if you want article lines to end with the <br> tag.\n# Else set to 0 to have non-quoted lines word-wrap. Only takes effect\n# if showhtml is set to 1.\n\nshowbr = 1\n\n# iquotes = [ 0 | 1 ]\n#\n# Set this to 1 if you want quoted lines to be shown in italics.  Only\n# take effect if showhtml is set to 1.\n\niquotes = 1\n\n# showhr = [ 0 | 1 ]\n#\n# Set to 1 if you want horizontal rules <HR> before and after\n# the articles. Set to 0 if you don't.\n\nshowhr = 1\n\n# overwrite = [ 0 | 1 ]\n#\n# Set to 1 to make Hypermail rewrite all messages.\n# Set to 0 to rewrite as few messages as possible.\n#  Rewriting all messages is slower, but if you change the options\n# that control the appearance of the messages you may want to rewrite\n# all the messages to make the appearance consistent throughout the archive.\n\noverwrite = 0\n\n# increment = [ -1 | 0 | 1 ]\n#\n#  Define as 1 to append all input messages to the end of existing archives.\n#  Define as 0 for it to read a mailbox that corresponds to the entire\n# archive. (See the mbox_shortened option for an exception to the requirement\n# that it be the entire archive).\n#  If there are any existing html messages, it will figure out which\n# ones at the end of the mailbox are new, and add only those that haven't been\n# converted yet.\n#  Define as -1 to have hypermail figure out whether the input\n# is entirely new messages to be appended or whether it contains\n# messages that are already in the archive. A value of -1 cannot be\n# used with the mbox_shortened option or with the -i command line\n# option or with mbox = NONE.\n\nincrement = 0\n\n# readone [ 0 | 1 ]\n#\n# Set this to On to specify there is only one message in the input.\n\nreadone = 0\n\n# thrdlevels = number\n#\n# This specifies the number of thread levels to outline in the thread\n# index. For instance, if thrdlevels is 2, replies to messages will\n# be indented once in the index, but replies to replies, etc., will only\n# be indented once as well. The normal value is 4.\n\nthrdlevels = 4\n\n# eurodate = [ 0 | 1 ]\n#\n# Set this to reflect how you want dates displayed in the index files.\n# Set as 1 to to use European date format \"DD MM YYYY\".\n# Define as 0 to to use American date format \"MM DD YYYY\".\n\neurodate = 0\n\n# isodate = [ 0 | 1 ]\n#\n# Set this to On to display article received dates in\n# YYYY-MM-DD HH:MM:SS format. If used with the gmtime option, a\n# Z will be inserted between the DD and HH.\n#isodate = 0\n\n# gmtime = [ 0 | 1 ]\n#\n# Set this to On to display article received dates using\n# Greenwich Mean Time (UTC) rather than local time.\n#gmtime = 0\n\n# dateformat = strftime() date format \n#\n# Format used in strftime(3) call for displaying dates.\n# See strftime(3)) for the valid conversion specifications.\n\ndateformat = %c\n\n# attachmentlink = attachment link format \n#\n# Format of the attachment links.\n#      %p for the full path to the attachment\n#      %f for the file name part only\n#      %d for the directory name only\n#      %n for the message number\n#      %c for the content type string\n\nattachmentlink = %p\n\n# discard_dup_msgids = [ 0 | 1 ]\n#\n# Set this to Off to accept messages with a Message-ID matching\n# that of a message already  in this archive.\n# By default such messages are discarded.\n\ndiscard_dup_msgids = 1\n\n# require_msgids = [ 0 | 1 ]\n#\n# Set this to 0 to accept messages without a Message-ID header.\n# Set this to 1 to discard messages without a Message-ID header.\n# By default such messages are discarded.\n\nrequire_msgids = 1\n\n# usemeta = [ 0 | 1 ]\n# \n# Set this to 1 to store the content type of a MIME attachment in \n# a metadata file. \n\nusemeta = 1\n\n# uselock = [ 0 | 1 ]\n#\n# Set this to 1 to use Hypermail's internal locking mechanism.\n#\n\nuselock = 1\n\n# locktime = number-of-seconds\n#\n# The number of seconds that a lock should be honored when processing\n# inbound messages.\n\nlocktime = 3600\n\n# dirmode = octal number\n#\n# This is an octal number representing the permissions (rwx modes) that new \n# directories are set to when they are created. If the archives will be made \n# publically available, it's a good idea to define this as 0755. This must \n# be an octal number.\n\ndirmode = 0755\n\n# filemode = octal number\n#\n# This is an octal number representing the permissions that new files\n# are set to when they are created. If the archives will be made publically\n# available, it's a good idea to define this as 0644. This must be an octal\n# number.\n\nfilemode = 0644\n\n# mailcommand = [ direct mailto | cgi-bin script path | NONE ]\n#\n# This is the mail command that email links go to, for instance\n# \"mailto:$TO\" or \"/cgi-bin/mail?to=$TO&amp;replyto=$ID&amp;subject=$SUBJECT\"\n#\n# In constructing this command, you can specify variables:\n#\n# $TO : the email address of the person you're sending mail to.\n# $ID : the ID of the message you're replying to.\n# $SUBJECT: the subject you're replying to.\n#\n# NONE disables mailcommand usage.\n\nmailcommand = mailto:$TO?subject=$SUBJECT&amp;replyto=$ID\n\n# mailto = [ email-address | NONE ]\n#\n# The address of the contact point that is put in the HTML header line\n# <link rev=\"made\" href=\"mailto:mailto\">\n#\n# The <link...> header can be disabled by default by setting\n# mailto to NONE.\n\nmailto = webmaster@hypermail.org\n\n# domainaddr = [ domainname | NONE ]\n#\n# Domain-ize Addresses -- addresses appearing in the RFC822 field\n# which lack hostname can't be made into proper HREFs. Because the\n# MTA resides on the same host as the list, it is often not required\n# to domain-ize these addresses for delivery. In such cases, hypermail\n# will add the DOMAINADDR to the email address.\n\ndomainaddr = hypermail.org\n\n# hmail = [ Mailing List Submission Address | NONE ]\n#\n# Set this to the list's submission address. When enabled, this can be\n# used to submit a new message to the list served by the hypermail archive.\n# \"NONE\" means don't use it.\n\nhmail = hypermail@hypermail.org\n\n# ihtmlheaderfile = [ path to index header template file | NONE ]\n#\n# Set this to the path to the Index header template file containing\n# valid HTML statements and substitution cookies for runtime expansion.  \n# This will be included at the top of every index page.\n\nihtmlheaderfile = /lists/hypermail-idxheader.hyp\n\n# ihtmlfooterfile = [ path to index footer template file | NONE ]\n#\n# Set this to the path to the Index footer template file containing\n# valid HTML statements and substitution cookies for runtime expansion.  \n# This will be included at the bottom of every index page.\n\nihtmlfooterfile = /lists/hypermail-idxfooter.hyp\n\n# mhtmlheaderfile = [ path to message header template file | NONE ]\n#\n# Set this to the path to the Message header template file containing\n# valid HTML statements and substitution cookies for runtime expansion.  \n# This will be included at the top of every message page.\n\nmhtmlheaderfile = /lists/hypermail-msgheader.hyp\n\n# mhtmlfooterfile = [ path to message footer template file | NONE ]\n#\n# Set this to the path to the Message footer template file containing\n# valid HTML statements and substitution cookies for runtime expansion.  \n# This will be included at the bottom of every message page.\n\nmhtmlfooterfile = /lists/hypermail-msgfooter.hyp\n\n######################\n# Multiline variables\n######################\n\n# show_headers = list of RFC 822 Headers to display if hm_showheaders\n#                   is set to 1 (TRUE)\n#\n# This is the list of headers to be displayed. They can be listed \n# comma or space separated all on a single line such as\n#      show_headers = From,Subject,Date,Message-ID\n# or they can be listed individually or any combination of.\n#      show_headers = From\n#      show_headers = Subject\n#      show_headers = Date\n#      show_headers = Message-ID\n\nshow_headers = From,Subject,Date,Message-ID\n\n# inline_types = indicate which types of data should be inlined\n#\n# This is the list of MIME types that you want inlined with <img> tags\n# as opposed to simply linked into the message with a <a href>. They \n# can be listed individually on multiple lines or comma or space \n# separated on a single line.\n#      inline_types = image/gif image/jpeg\n#      or\n#      inline_types = image/gif\n#      inline_types = image/jpeg\n\ninline_types = image/gif image/jpeg image/png\n\n# ignore_types = indicate which types of attachments to ignore and\n#                   not process.\n#\n# This is the list of MIME attachment types that you do not want to\n# do anything with. They are quietly ignored.  They can be listed \n# individually on multiple lines or comma or space separated on a \n# single line.\n#      ignore_types = text/x-vcard application/x-msdownload\n#      or\n#      ignore_types = text/x-vcard\n#      ignore_types = application/x-msdownload\n\nignore_types = text/x-vcard\nignore_types = application/x-msdownload\n\n# prefered_types = indicate which of the alternative types to use\n#\n# When mails using multipart/mixed types are scanned, this is the \n# list of alternative MIME types that you want used. This can be \n# listed individually on multiple lines or comma or space separated \n# on a single line.\n#      prefered_types = text/plain text/html \n#      or\n#      prefered_types = text/plain\n#      prefered_types = text/html \n# Order is important.\n#\n# NOTE: This option is not fully implemented at present.\n\nprefered_types = text/plain text/html \n\n# text_types = indicate the MIME types to be treated as text/plain.\n#\n# This is a list of MIME types that you want hypermail to treat\n# exactly as if they were text/plain.  This can be listed \n# individually on multiple lines or comma or space separated \n# on a single line.\n\ntext_types = text/x-vcard\n\n# usegdbm = [ 0 | 1 ]\n#\n# Set this to On to use gdbm to implement a header cache.\n#This will speed up hypermail, especially if your filesystem is slow.\n#It will not provide any speedup with the linkquotes option.\n#usegdbm = Off\n\n# append = [ 0 | 1 ]\n#\n# Set this to On to maintain a parallel mbox archive. The file\n#name defaults to mbox in the directory specified by -d or by the dir option.\n#append = 0\n\n# append_filename = [ string ]\n#\n# Specifies the filename to be used by the append option.\n#$DIR may be used to specify a name relative to the directory\n#specified in the -d or dir option.\n#append_filename = \n\n# newmsg_command = [ string ]\n#\n# This specifies the mail command to use when converting the\n# set_hmail address to links in replies. The variables $TO, $SUBJECT,\n# and $ID can be used in constructing the command string.\n#newmsg_command = mailto:$TO\n\n# replymsg_command = [ string ]\n#\n# This specifies the mail command to use when converting the\n# set_hmail address to links in replies. The variables $TO, $SUBJECT,\n# and $ID can be used in constructing the command string. The value\n# from mailcommand will be used if this option is not specified.\n#replymsg_command = mailto:$TO\n\n# icss_url = [ URL ]\n#\n# Specifies a URL to an external CSS stylesheet for the index pages.\nThe CSS will be associated to the indexes thru an HTML LINK element.\n#icss_url = \n\n# mcss_url = [ URL ]\n#\n# Specifies a URL to an external CSS stylesheet for the message pages.\nThe CSS will be associated to the indexes thru an HTML LINK element.\n#mcss_url = \n\n# spamprotect = [ 0 | 1 ]\n#\n# Set this to On to make hypermail not output real email addresses\n# in the output HTML but instead it will obfuscate them a little.\nspamprotect = 1\n\n# spamprotect_id = [ 0 | 1 ]\n#\n# Set this to On to make hypermail not output real email message\n# ids in HTML comments (sometimes used internally by hypermail) but\n# instead it will obfuscate them a little so they don't look like\n# email addresses to spammers.\nspamprotect_id = 1\n\n# attachmentsindex = [ 0 | 1 ]\n#\n# Set this to  Off to make hypermail not output an index of\n# messages with attachments.\n\nattachmentsindex = 1\n\n# linkquotes = [ 0 | 1 ]\n#\n# Set this to On to create fine-grained links from quoted\n# text to the text where the quote originated. It also improves\n# the threads index file by more accurately matching messages\n# with replies. Note that this may be rather cpu intensive (see\n# the searchbackmsgnum option to alter the performance).\n#linkquotes = 0\n\n# searchbackmsgnum = number\n#\n# If the linkquotes option is on and an incremental update is being# done (-u option), this controls the tradeoff between speed and\n# the reliability of finding the right source for quoted text.\n# Try to set it to the largest number of messages between a\n# message and the final direct reply to that message.\n\nsearchbackmsgnum = 500\n\n# link_to_replies = string\n#\n# If the linkquotes option is on, specifying a string here\n# causes it to generate links from original quoted text to the\n# location(s) in replies which quote them. The string\n# is used to display the link.\n#link_to_replies = \n\n# quote_hide_threshold = percentage-number\n#\n# If the linkquotes option is on, setting this to an\n# integer less than 100 will cause it to replace quoted\n# text with one-line links if the percent of lines in the\n# message body (exluding the signature) consisting of\n# quoted text exceeds the number indicated by this option.\n#quote_hide_threshold = 100\n\n# quote_link_string = string\n#\n# If the quote_hide_threshold option is being used, the\n# quote_link_string will be used if available to display the\n# link that replaces the quoted text. If no string is specified\n# here, the first line of each section of quoted text will used.\n#quote_link_string = \n\n# monthly_index = [ 0 | 1 ]\n#\n# Set this to On to create additional index files broken up\n# by month. A summary.html file will provide links to all the\n# monthly indices.\n#monthly_index = Off\n\n# yearly_index = [ 0 | 1 ]\n#\n# Set this to On to create additional index files broken up\n# by year. A summary.html file will provide links to all the\n# yearly indices.\n#yearly_index = Off\n\n# thread_file_depth = [ 0 | 1 ]\n#\n# If nonzero, break the threads index file into multiple files,\n# with the initial message of each thread in the main index file\n# along with links to files containing the replies. Setting this\n# to 1 creates one file for each thread that has replies, and is\n# recommended for archives with over a few hundred messages.\n# Setting this greater than 1 will produce multiple levels of files\n# for each thread whose replies are nested by more than 1 level,\n# but that is rarely useful. This option is currently disabled\n# if the indextable option is turned on, and probably needs to\n# be less than thrdlevels.\n#thread_file_depth = 0\n\n# folder_by_date = strftime() date format\n#\n# This string causes the messages to be put in subdirectories\n# by date. The string will be passed to strftime(3) to generate\n# subdirectory names based on message dates. Suggested values are\n# \"%y%m\" or \"%b%y\" for monthly subdirectories, \"%Y\" for\n# yearly, \"%G/%V\" for weekly. Do not alter this for an existing\n# archive without removing the old html files. If you use this\n# and update the archive incrementally (e.g. with -u), you must\n# use the usegdbm option.\n# folder_by_date = %b%y\n\n# msgsperfolder = number\n#\n# Put messages in subdirectories with this many messages per\n# directory. Do not use this and folder_by_date on the same archive.\n# Do not alter this for an existing archive without removing the old\n# html files. Deleted/expired messages ARE COUNTED for the purpose\n# of deciding how many messages to put in a subdirectory.\n#msgsperfolder = 0\n\n# describe_folder = format string\n#\n# Controls the labels used in folders.html to describe the\n# directories created by the folder_by_date or msgsperfolder\n# options. For folder_by_date labels, the describe_folder string\n# will be passed to strftime(3) the same as the folder_by_date string.\n# For msgsperfolder:\n# %d for the directory number (starts with 0)\n# %D for the directory number (starts with 1)\n# %m for the number of the first message in the directory\n# %M for the number of the last message that can be put in the\n# directory.\n#describe_folder = \n\n# latest_folder = string\n#\n# If folder_by_date or msgsperfolder are in use, create\n# a symbolic link by this name to the most recently created\n# subdirectory. Note that many web servers are configured to\n# not follow symbolic links for security reasons. The link will\n# be created in the directory specified by the \"dir\" or \"-d\" option.\n#latest_folder = current\n\n# iso2022jp = [ 0 | 1 ]\n#\n# Set this to On to support ISO-2022-JP messages.\n#iso2022jp = Off\n\n# deleted = list of headers\n#\n# This is the list of headers that indicate the message should\n# not be displayed if the value of this header is 'yes'.\n\ndeleted = X-Hypermail-Deleted X-No-Archive\n\n# expires = list of headers\n#\n# This is the list of headers that indicate the message should\n# not be displayed if the value of this header is a date in the past.\n\nexpires = Expires\n\n# delete_msgnum = list of message numbers\n#\n# This is the list of message numbers that should be deleted from the\n# html archive. The mbox is not changed.\n#delete_msgnum = \n\n# delete_level = [ 0 | 1 | 2 | 3 ]\n#\n# 0 - remove deleted and expired files. Note that with this choice\n      threading may be screwed up if there are replies to deleted or\n      expired options and the archive is updated incrementally\n# 1 - remove message body\n# 2 - remove message body for deleted messages, leave expired messages\n# 3 - leave all messages\n# Deleted and expired messages are removed from the index files\n# regardless of the delete_level selection.\n\ndelete_level = 1\n\n# txtsuffix = [ string ]\n#\n#  If you want the original mail messages archived in individual files,\n# set this to the extension that you want these messages to have\n# (recommended value: txt).\n#\n# txtsuffix = \n\n# show_index_links = [ 0 | 1 | 3 | 4 ]\n#\n#  Set this to 1 to show links to index pages from the top and\n# bottom of each message file. Set it to 0 to avoid those links.\n# Set it to 3 to show the links only at the top of the message\n# pages, or 4 to produce those links only at the bottom of the\n# message.\n\nshow_index_links = 1\n\n# filter_out\n#\n# Delete from the html archives any message having a header line\n# which matches any of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n\n#filter_out =\n\n# filter_require\n#\n# Delete from the html archives any message not having header lines\n# which match each of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n\n#filter_require =\n\n# filter_out_full_body = string\n#\n# Delete from the html archives any message having a line\n# which matches any of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n\n#filter_out_full_body =\n\n# filter_require_full_body = string\n#\n# Delete from the html archives any message not having lines\n# which match each of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n\n#filter_require_full_body = \n\n# save_alts = [ 0 | 1 | 2 ]\n#\n# This controls what happens to alternatives (other than the prefered\n# alternative) for multipart/alternative messages.\n#  0 - discard non-prefered alternatives\n#  1 - show all alternatives inline\n#  2 - put non-prefered alternatives in a separate file.\n#\n#save_alts = 0\n\n# alts_text = descriptive text\n#\n#  If save_alts is 1, this text is put between the alternatives.\n# If save_alts is 2, this text is used to describe the link to each\n# alternative file.\n\n# the default if save_alts = 2:\n#alts_text = \"alternate version of message\" \n\n# the default if save_alts = 1:\n#alts_text = <hr>\n\n# warn_suppressions = [ 0 | 1 ]\n#\n#  Set this to 1 to get warnings (on stdout) about messages that\n# are not converted because of they are missing a msgid (if\n# require_msgids is On) or because one of the following options\n# suppressed it: deleted expires delete_msgnum filter_out\n# filter_require filter_out_full_body filter_require_full_body.\n\n# warn_suppressions = 1\n\n# unsafe_chars = list of chars to prohibit\n#  Any characters listed in this string are removed from user-specified\n# attachment filenames. Those characters will be replaced by a \"_\"\n# (which means that specifying \"_\" here won't have any effect).\n# Note that many characters (including / and \\) are removed by the\n# safe_filename in parse.c regardless of what this option says. There\n# might be some security problems that can be prevented if you specify\n# \".\" here (e.g. if a web server is configured to enable server side\n# includes on filenames ending in something other than .shtml), but\n# that will prevent browsers from recognizing many file types.\n\n#unsafe_chars = \".\"\n\n# files_by_thread = [ 0 | 1 ]\n#\n#   Set this to 1 to generate (in addition to the usual files),\n# a file for each thread that contains all the messages in that\n# thread. The first line in each thread of the thread index page\n# links to this file instead of to a single message.\n\n#files_by_thread = 0\n\n# href_detection = [ 0 | 1 ]\n#\n#  Set this to On to assume that any string on the body of the message\n# that says <A HREF=\" ... </A> is a URL, together with its markup\n# and treat it as such.\n\n#href_detection = 0\n\n# mbox_shortened = [ 0 | 1 ]\n#\n#  Set this to 1 to enable use of mbox that has had some of its\n# initial messages deleted. Requires usegdbm = 1 and increment = 0.\n# The first message in the shortened mbox must have a Message-Id header.\n# If discard_dup_msgids is 0, the first message in the shortened mbox\n# may not have the same Message-Id as a message that was deleted.\n# The mbox may not be altered in any way other than deleting from\n# beginning of the mbox or appending new messages to the end (unless\n# you rebuild the archive from scratch using a complete mbox).\n\n#mbox_shortened = 0\n\n# report_new_folder = [ 0 | 1 ]\n#\n#  Set this to On to have it print (on stdout) the names of any\n# new directories created pursuant to the folder_by_date or\n# msgsperfolder option, or the initial creation of the archive.\n# It will print the full path if that is what you use to specify\n# the archive directory. Does not print anything when attachment\n# or metadata directories are created.\n\n#report_new_folder = 0\n\n# report_new_file = [ 0 | 1 ]\n#\n#  Set this to On to have it print (on stdout) the names of any\n# new files created for new messages. It will print the full path\n# if that is what you use to specify the archive directory.\n\n#report_new_file = 0\n\n# use_sender_date = [ 0 | 1 ]\n#\n# Set this to On to have it use the Date: header (created by the\n# the system that sent the message) rather than the date/time the\n# message was received, for purposes such as putting in folders\n# or sorting. Details of which purposes this affects may change\n# in the future.\n\n# use_sender_date = 0\n\n# filename_base = string\n#\n# This option overrides the normal rules for creating attachment\n# file names, and creates file names from the string that this\n# option is set to plus a file name extension if one can be found\n# in the name supplied by the message. This option is mainly for\n# languages that use different character sets from English.\n\n# filename_base = \n"
  },
  {
    "path": "configs/hypermail-footer.hyp",
    "content": "<p align=\"center\"><img src=\"http://www.hypermail.org/images/common/yellowline.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\r\n\r\n<small><small>\\n<em>This archive was generated by \r\n%u.\r\n</em></small></small>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "configs/hypermail-index.hyp",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<html>\n<head>\n<meta name=\"description\" content=\"Hypermail Development List Archives\">\n<meta name=\"keywords\" content=\"hypermail Archives, hypermail, email, mail2html, Email Archives\">\n<title>%l: %s</title>\n<link rev=\"made\" href=\"mailto:%m\">\n</head>\n<body background=\"http://www.hypermail.org/images/stars.gif\" bgcolor=\"#000000\" text=\"#FFFFFF\" link=\"#c7a317\" alink=\"#FFFFFF\" vlink=\"#998800\">\n\n<h1 align=\"center\">%l<br>%s</h1>\n<p align=\"center\"><img src=\"http://www.hypermail.org/images/common/yellowline.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\n\n"
  },
  {
    "path": "configs/hypermail-msg.hyp",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\r\n<html>\r\n<head>\r\n<meta name=\"description\" content=\"Hypermail Development List Archives\">\r\n<meta name=\"keywords\" content=\"hypermail Archives, hypermail, email, mail2html, Email Archives\">\r\n%A\r\n%S\r\n<title>%l: %s</title>\r\n<link rev=\"made\" href=\"mailto:%m\">\r\n</head>\r\n<body background=\"http://www.hypermail.org/images/stars.gif\" bgcolor=\"#000000\" text=\"#FFFFFF\" link=\"#c7a317\" alink=\"#FFFFFF\" vlink=\"#998800\">\r\n\r\n<h1 align=\"center\">%s</h1>\r\n<p align=\"center\"><img src=\"http://www.hypermail.org/images/common/yellowline.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\r\n\r\n"
  },
  {
    "path": "configs/hypermail.rc",
    "content": "#################################################################\n#\n# Sample config file used for hypermail@hypermail.org list.\n# For example purposes only.  If you are setting up a new \n# hypermail archive, run \n#\n#  $ hypermail -v > your-list.rc\n#\n# and then edit the file as appropriate for your list..\n#\n# Additionally, see the hmrc.example file and read hmrc.html\n#\n#  $ man hmrc\n#\n\n#hm_listname = hypermail\n#hm_mboxdir = /ftp/hypermail/mail-archive/mailbox\n\n# replace any @ sign with this string, if spam flags enabled\nantispam_at = _at_\n\n# A two-letter string specifying the language to use!\n# For example 'en' for English\nlanguage = en\n\n# Use this to specify the html file suffix to be used\n# when Hypermail generates the html files. This is depen-\n# dent on local needs. Do not put a '.' in the value. It\n# would result in \"file..html\", probably not what you want.\nhtmlsuffix = html\n\n# This is the mailbox to read messages in from. Set this with \n# a value of NONE to read from standard input.\nmbox = NONE\n\n# Set this to On to read mboxes using the IETF convention.\nietf_mbox = Off\n\n# This will create a link in the archived index pages\n# labeled 'Other mail archives' to the specified URL. Set\n# this to NONE to omit such a link.\n# archives = NONE\n\n# If this variable is defined, a navigation entry will be\n# created below the sorted_by_x list entry, with the text\n# Other mail archives: followed by the value of this variable.\n# Set it to NONE to ommit such an entry.\ncustom_archives = \n\n# This will create a link in the archived index pages\n# labeled 'About this archive' to the specified URL. Set\n# this to NONE to omit such a link.\nabout = /hypermail/mail-archive/\n\n# Define this as the label to put in archives.\nlabel = Hypermail Development List\n\n# This is the directory that Hypermail will look for when\n# creating  and updating archives. If defined as NONE the\n# directory will have the same name as the input mailbox.\n# Note that the date that Hypermail was run will be used, not\n# a date from the message (use the folder_by_date option to\n# have Hypermail use dates from messages).\ndir = /ftp/hypermail/mail-archive/%y/%M\n\n# This specifies the default index that  users can view when\n# entering the archive. Valid types are date, thread, author,\n# subject, and attachment. When using the folder_by_date or\n# msgsperfolder options, this option applies to subdirectories.\ndefaultindex = thread\n\n# This specifies the default index that  users can view when\n# entering the top level of an archive that uses the folder_by_date\n# or msgsperfolder option. Valid types are date, thread, author,\n# subject, attachment, and folders.\ndefault_top_index = folders\n\n# This is a list of index files to not generate. Valid types are\n# date, thread, author, and subject. When using the folder_by_date or\n# msgsperfolder options, this option applies to subdirectories.\n#avoid_indices = subject author\navoid_indices = \n\n# This is a list of index files to not generate for the top\n# directory of an archive using the folder_by_date or\n# msgsperfolder option. Valid types are date, thread, author, \n# subject, folders, and attachment.\n#avoid_top_indices = date thread\navoid_top_indices = \n\n# Set to On to make Hypermail rewrite all messages.\n# Set to Off to rewrite as few messages as possible.\n#  Rewriting all messages is slower, but if you change the options\n# that control the appearance of the messages you may want to rewrite\n# all the messages to make the appearance consistent throughout the archive.\noverwrite = Off\n\n# Define to On to make text/html parts to get inlined with the mails.\n# If set to Off, HTML-parts will be stored as separate files.\n# A \"Content-Disposition: attachment;\" line in the mail will\n# cause an HTML-part to be stored as a separate file even if this\n# option is On.\ninlinehtml = On\n\n#  Define as 1 to append all input messages to the end of existing archives.\n#  Define as 0 for it to read a mailbox that corresponds to the entire\n# archive. (See the mbox_shortened option for an exception to the requirement\n# that it be the entire archive).\n#  If there are any existing html messages, it will figure out which\n# ones at the end of the mailbox are new, and add only those that haven't been\n# converted yet.\n#  Define as -1 to have hypermail figure out whether the input\n# is entirely new messages to be appended or whether it contains\n# messages that are already in the archive. A value of -1 cannot be\n# used with the mbox_shortened option or with the -i command line\n# option or with mbox = NONE.\nincrement = 1\n\n# Set this to On to specify there is only one message in the input.\nreadone = Off\n\n# Setting this variable to On will reverse-sort the article\n# entries in the date and thread index files by the\n# date they were received. That is, the most recent messages\n# will appear at the top of the index rather than the other\n# way around.\nreverse = Off\n\n# Setting this variable to On will reverse-sort the list of\n# folders. That is, the most recent folders will appear at\n# the top of the index rather than the other way around.\nreverse_folders = Off\n\n# Set this to 1 or 2 to always show a progress report  as\n# Hypermail works. With a setting of 1, hypermail\n# overwrites the progress information relating to attachment\n# creation. With a setting of 2, attachment creation information\n# is listed individually with the number of the message the\n# attachments relate to. This is written to stdout.\nprogress = 0\n\n# Set this to On to show the article header lines in the archived HTML\n# files.  These lines typically include the To:, From:, and Subject:\n# information found in most email messages.\nshowheaders = Off\n\n# Set this to 1 to show the articles in a proportionally-spaced\n# font rather than a fixed-width (monospace) font.\n# Set this to 2 for more complex conversion to html\n# similar to that in <a href=\"http://www.cs.wustl.edu/~seth/txt2html/\">txt2html.pl</a>.\n# Showhtml = 2 will normally produce nicer looking results than\n# showhtml = 1, and showhtml = 0 will look pretty dull, but\n# 1 and 2 run risks of altering the appearance in undesired ways.\nshowhtml = 1\n\n# Set this to On to place <br> tags at the end of article lines.\n# Otherwise, all non-quoted article lines will word wrap. This\n# only takes effect if hm_showhtml is 1.\nshowbr = On\n\n# Set this to On to place horizontal rules before and after articles.\nshowhr = On\n\n# Set this to On to show all replies to a message as links\n# in article files.\nshowreplies = Off\n\n# Set this to 1 to put the individual message links at the top\n# of the individual message pages. Set this to 0 to produce pages\n# without the Next, Previous, Reply, In-Reply-To, etc. links. Set\n# it to 3 to produce those links only at the top of the message\n# pages, or 4 to produce those links only at the bottom of the\n# message.\nshow_msg_links = 1\n\n# Set this to 1 to show links to index pages from the top and\n# bottom of each message file. Set it to 0 to avoid those links.\n# Set it to 3 to show the links only at the top of the message\n# pages, or 4 to produce those links only at the bottom of the\n# message.\nshow_index_links = 1\n\n# Setting this variable to On will tell Hypermail to generate\n# an index menu at the top and bottom of each page in a table\n# format. Set to Off if you want the standard Hypermail page look\n# and feel\nusetable = On\n\n# Setting this variable to On will tell Hypermail to generate\n# message index Subject/Author/Date listings using a nice table\n# format. Set to Off if you want the original Hypermail index look.\nindextable = Off\n\n# Set this to On to italicize quoted lines.\niquotes = On\n\n# Set this to On to display article received dates with\n# days before months instead of months before days.\neurodate = Off\n\n# Set this to On to display article received dates in\n# YYYY-MM-DD HH:MM:SS format. If used with the gmtime option, a\n# Z will be inserted between the DD and HH.\nisodate = Off\n\n# Set this to On to display article received dates using\n# Greenwich Mean Time (UTC) rather than local time.\ngmtime = Off\n\n# Set this to Off to accept messages with a Message-ID matching\n# that of a message already  in this archive.\n# By default such messages are discarded.\ndiscard_dup_msgids = On\n\n# Set this to Off to accept messages without a Message-ID header.\n# By default such messages are discarded.\nrequire_msgids = On\n\n# Set this to On to store the content type of a MIME attachment in\n# a metadata file.\nusemeta = Off\n\n# Set this to On to use hypermail's internal locking mechanism.\nuselock = On\n\n# Set this to On to use gdbm to implement a header cache.\n# This will speed up hypermail, especially if your filesystem is slow.\n# It will not provide any speedup with the linkquotes option.\nusegdbm = Off\n\n# Set this to On to let hypermail write an XML archive overview file\n# in each directory. The filename is archive_overview.haof.\nwritehaof = Off\n\n# Set this to On to maintain a parallel mbox archive. The file\n# name defaults to mbox in the directory specified by -d or dir.\nappend = Off\n\n# Specifies the filename to be used by the append option.\n# $DIR may be used to specify a name relative to the directory\n# specified in the -d or dir option.\n# append_filename = $DIR/INBOX\nappend_filename = \n\n# Set this to On to generate filenames that are not sequential, but\n# rather a hash of the message properties.\n# (This particular binary has been build with LIBFNV disabled.\n# This option won't work)\nnonsequential = Off\n\n# This specifies the number of thread levels to outline\n# in the thread index.\nthrdlevels = 4\n\n# This is an octal number  representing  the  permissions\n# that new directories are set to when they are created.\ndirmode = 0755\n\n# This is an octal number representing the file permissions\n# that new files are set to when they are created.\nfilemode = 0644\n\n# This specifies the mail command to use when converting\n# email addresses to links. The variables $TO, $SUBJECT,\n# and $ID can be used in constructing the command string.\n#mailcommand = mailto:$TO?Subject=$SUBJECT\nmailcommand = mailto:$TO?subject=$SUBJECT&replyto=$ID\n\n# The address of the contact point that is put in the HTML header\n# line <link rev=made href=\"mailto:MAILTO\">. Setting this to NONE\n# disables <link...> header generation.\nmailto = webmaster@hypermail.org\n\n# Set this to the list's submission address.\nhmail = hypermail@hypermail.org\n\n# This specifies the mail command to use when converting the\n# set_hmail address to links in replies. The variables $TO, $SUBJECT,\n# and $ID can be used in constructing the command string.\nnewmsg_command = mailto:$TO\n\n# This specifies the mail command to use when converting the\n# set_hmail address to links in replies. The variables $TO, $SUBJECT,\n# and $ID can be used in constructing the command string. The value\n# from mailcommand will be used if this option is not specified.\nreplymsg_command = mailto:$TO?Subject=$SUBJECT\n\n# Set this to the domainname you want added to a mail address\n# appearing in the RFC822 field which lack a hostname.\n# domainaddr = NONE\ndomainaddr = hypermail.org\n\n# This obsolete entry kept around to help warn users with old config files.\nbody = \n\n# Specifies a URL to an external CSS stylesheet for the index pages.\n# The CSS will be associated to the indexes thru an HTML LINK element.\nicss_url = \n\n# Specifies a URL to an external CSS stylesheet for the message pages.\n# The CSS will be associated to the indexes thru an HTML LINK element.\nmcss_url = \n\n# This is a list of MIME types that you want hypermail to treat\n# exactly as if they were text/plain.\n#text_types = message/DELIVERY-STATUS\ntext_types = \n\n# This is the list of MIME types that you want <img> tags to as\n# opposed to simply <a href> to from the message.\ninline_types = image/gif image/jpeg image/png\n\n# When mails using multipart/mixed types are scanned, this list of\n# MIME types defines which part you want presented in the result.\n# See the save_alts option for how non prefered types are treated.\nprefered_types = text/plain text/html\n\n# This is the list of MIME attachment types that you do not want\n# to do anything with. Two special types may be used here:\n# $BINARY - ignore all types that would be stored as separate files.\n# $NONPLAIN - ignore all types not treated as text/plain, and all $BINARY types.\n# Note: the behavior of these may be affected by the inlinehtml option.\nignore_types = text/x-vcard\nignore_types = application/x-msdownload\n\n# This is the list of headers to be displayed if 'showheaders'\n# is set to On). They can be listed comma or space separated\n# all on a single line.\n# show_headers = \n# show_headers = *\nshow_headers = From,Subject,Date,Message-ID\n\n# Define path as the path to a template  file  containing\n# valid  HTML  formatting  statements  that  you  wish to\n# included at the top of every index page.\nihtmlheaderfile = /usr/local/lib/hypermail/hypermail-index.hyp\n\n# Define path as the path to a template  file  containing\n# valid  HTML  formatting  statements  that  you  wish to\n# included at the bottom of every index  page.\nihtmlfooterfile = /usr/local/lib/hypermail/hypermail-footer.hyp\n\n# Define path as the path to a template  file  containing\n# valid  HTML  formatting statements that you wish to use\n# at the top of every message page.\nmhtmlheaderfile = /usr/local/lib/hypermail/hypermail-msg.hyp\n\n# Define path as the path to a template  file  containing\n# valid HTML formatting statements you wish to use at the\n# bottom of every message page.\nmhtmlfooterfile = /usr/local/lib/hypermail/hypermail-footer.hyp\n\n# Specify number of seconds to wait for a lock before we\n# override it! .\nlocktime = 3600\n\n# Format (see strftime(3)) for displaying dates.\n# dateformat = %Y/%m/%d - %H:%M %Z\ndateformat = \n\n# A word to be stripped from all subject lines.  Helps unclutter\n# mailing lists which add tags to subject lines.\nstripsubject = \"[hypermail]\"\n\n# Format of the attachment links.\n# %p for the full path to the attachment\n# %f for the file name part only\n# %d for the directory name only\n# %n for the message number\n# %c for the content type string\nattachmentlink = \n\n# Set this to On to make hypermail not output real email addresses\n# in the output HTML but instead it will obfuscate them a little.\n# You can control the obfuscation with set_antispamdomain.\nspamprotect = Off\n\n# By default hypermail only does a small amount of massaging\n# of email addresses. Use this to completely replace the domain\n# from which a message originates (everything after the @)\n# with some string to confuse screen-scraping programs.\n# It is probably wise to make this an invalid mail domain.\n# antispamdomain =                       #correctly ignored\n# antispamdomain = \"\"                    #leaves quote marks in the url\n# antispamdomain = \" \"                   #works, leaves a space in the url\n# antispamdomain = \"email_protected\"     #works\n# antispamdomain = \"email.domain.hidden\" #works\nantispamdomain = \n\n# Set this to On to make hypermail not output real email message\n# ids in HTML comments (sometimes used internally by hypermail) but\n# instead it will obfuscate them a little so they don't look like\n# email addresses to spammers.\nspamprotect_id = Off\n\n# Set this to  Off to make hypermail not output an index of\n# messages with attachments.\nattachmentsindex = On\n\n# Set this to On to create fine-grained links from quoted\n# text to the text where the quote originated. It also improves\n# the threads index file by more accurately matching messages\n# with replies. Note that this may be rather cpu intensive (see\n# the searchbackmsgnum option to alter the performance).\nlinkquotes = Off\n\n# If the linkquotes option is on and an incremental update is being# done (-u option), this controls the tradeoff between speed and\n# the reliability of finding the right source for quoted text.\n# Try to set it to the largest number of messages between a\n# message and the final direct reply to that message.\nsearchbackmsgnum = 500\n\n# If the linkquotes option is on, specifying a string here\n# causes it to generate links from original quoted text to the\n# location(s) in replies which quote them. The string\n# is used to display the link.\n#link_to_replies = Reply\nlink_to_replies = \n\n# If the linkquotes option is on, setting this to an\n# integer less than 100 will cause it to replace quoted\n# text with one-line links if the percent of lines in the\n# message body (exluding the signature) consisting of\n# quoted text exceeds the number indicated by this option.\nquote_hide_threshold = 100\n\n# If the quote_hide_threshold option is being used, the\n# quote_link_string will be used if available to display the\n# link that replaces the quoted text. If no string is specified\n# here, the first line of each section of quoted text will used.\n# quote_link_string = Link\nquote_link_string = \n\n# Set this to On to create additional index files broken up\n# by month. A summary.html file will provide links to all the\n# monthly indices.\nmonthly_index = Off\n\n# Set this to On to create additional index files broken up\n# by year. A summary.html file will provide links to all the\n# yearly indices.\nyearly_index = Off\n\n# If nonzero, break the threads index file into multiple files,\n# with the initial message of each thread in the main index file\n# along with links to files containing the replies. Setting this\n# to 1 creates one file for each thread that has replies, and is\n# recommended for archives with over a few hundred messages.\n# Setting this greater than 1 will produce multiple levels of files\n# for each thread whose replies are nested by more than 1 level,\n# but that is rarely useful. This option is currently disabled\n# if the indextable option is turned on, and probably needs to\n# be less than thrdlevels.\nthread_file_depth = 0\n\n# This string causes the messages to be put in subdirectories\n# by date. The string will be passed to strftime(3) to generate\n# subdirectory names based on message dates. Suggested values are\n# \"%y%m\" or \"%b%y\" for monthly subdirectories, \"%Y\" for\n# yearly, \"%G/%V\" for weekly. Do not alter this for an existing\n# archive without removing the old html files. If you use this\n# and update the archive incrementally (e.g. with -u), you must\n# use the usegdbm option.\n#folder_by_date = %y%m\nfolder_by_date = \n\n# Put messages in subdirectories with this many messages per\n# directory. Do not use this and folder_by_date on the same archive.\n# Do not alter this for an existing archive without removing the old\n# html files. Deleted/expired messages ARE COUNTED for the purpose\n# of deciding how many messages to put in a subdirectory.\nmsgsperfolder = 0\n\n# Controls the labels used in folders.html to describe the\n# directories created by the folder_by_date or msgsperfolder\n# options. For folder_by_date labels, the describe_folder string\n# will be passed to strftime(3) the same as the folder_by_date string.\n# For msgsperfolder:\n# %d for the directory number (starts with 0)\n# %D for the directory number (starts with 1)\n# %m for the number of the first message in the directory\n# %M for the number of the last message that can be put in the\n# directory.\n# describe_folder = \"%b %Y\"\ndescribe_folder = \n\n# If folder_by_date or msgsperfolder are in use, create\n# a symbolic link by this name to the most recently created\n# subdirectory. Note that many web servers are configured to\n# not follow symbolic links for security reasons.\n# latest_folder = current\nlatest_folder = \n\n# The url of the archive's main directory. This is needed when\n# the latest_folder option is used and the folder_by_date makes\n# directories more than one level deep (e.g. with '%y/%m').\n#base_url = http://www.hypermail.org/mail-archive/\nbase_url = \n\n# Set this to On to support ISO-2022-JP messages.\niso2022jp = Off\n\n# This is the list of headers that indicate the message should\n# not be displayed if the value of this header is 'yes'.\ndeleted = X-Hypermail-Deleted X-No-Archive\n\n# This is the list of headers that indicate the message should\n# not be displayed if the value of this header is a date in the past.\nexpires = Expires\n\n# Any message older than this date should not be displayed.\n#delete_older = \"Wed, 14 Mar 2001 12:59:51 +0200\"\ndelete_older = \n\n# Any message newer than this date should not be displayed.\n#delete_newer = \"Wed, 28 Mar 2001 12:59:51 +0200\"\ndelete_newer = \n\n# This is the list of message numbers that should be deleted from the\n# html archive. The mbox is not changed.\n#delete_msgnum = 0 42 649\ndelete_msgnum = \n\n# 0 - remove deleted and expired files. Note that with this choice\n#     threading may be screwed up if there are replies to deleted or\n#     expired options and the archive is updated incrementally\n# 1 - remove message body\n# 2 - remove message body for deleted messages, leave expired messages\n# 3 - leave all messages\n# Deleted and expired messages are removed from the index files\n# regardless of the delete_level selection.\ndelete_level = 1\n\n# If you want the original mail messages archived in individual files,\n# set this to the extension that you want these messages to have\n# (recommended value: txt).\n# txtsuffix = txt\ntxtsuffix = \n\n# Delete from the html archives any message having a header line\n# which matches any of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n#filter_out=From:.+@spammers.com\nfilter_out = \n\n# Delete from the html archives any message not having header lines\n# which match each of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n#filter_require = hypermail\nfilter_require = \n\n# Delete from the html archives any message having a line\n# which matches any of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n#filter_out_full_body = BUY\nfilter_out_full_body = \n\n# Delete from the html archives any message not having lines\n# which match each of these expressions. Uses the same rules for\n# deletion as the expires option. The expressions use the same\n# syntax as Perl regular expressions.\n#filter_require_full_body = [Ff]ree\nfilter_require_full_body = \n\n# This controls what happens to alternatives (other than the prefered\n# alternative) for multipart/alternative messages.\n# 0 - discard non-prefered alternatives\n# 1 - show all alternatives inline\n# 2 - put non-prefered alternatives in a separate file.\nsave_alts = 0\n\n# If save_alts is 1, this text is put between the alternatives.\n# If save_alts is 2, this text is used to describe the link to each\n# alternative file.\nalts_text = \"alternate version of message\"\n\n# Set this to On to get warnings (on stdout) about messages that\n# are not converted because of they are missing a msgid (if\n# require_msgids is On) or because one of the following options\n# suppressed it: deleted expires delete_msgnum filter_out\n# filter_require filter_out_full_body filter_require_full_body.\nwarn_suppressions = On\n\n# Any characters listed in this string are removed from user-specified\n# attachment filenames. Those characters will be replaced by a \"_\"\n# (which means that specifying \"_\" here won't have any effect).\n# Note that many characters (including / and \\) are removed by the\n# safe_filename in parse.c regardless of what this option says. There\n# might be some security problems that can be prevented if you specify\n# \".\" here (e.g. if a web server is configured to enable server side\n# includes on filenames ending in something other than .shtml), but\n# that will prevent browsers from recognizing many file types.\nunsafe_chars = \".\"\n\n# Set this to On to generate (in addition to the usual files),\n# a file for each thread that contains all the messages in that\n# thread.\nfiles_by_thread = Off\n"
  },
  {
    "path": "configure",
    "content": "#! /bin/sh\n# From configure.ac Revision: 1.2 .\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\nas_awk_strverscmp='\n  # Use only awk features that work with 7th edition Unix awk (1978).\n  # My, what an old awk you have, Mr. Solaris!\n  END {\n    while (length(v1) && length(v2)) {\n      # Set d1 to be the next thing to compare from v1, and likewise for d2.\n      # Normally this is a single character, but if v1 and v2 contain digits,\n      # compare them as integers and fractions as strverscmp does.\n      if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {\n\t# Split v1 and v2 into their leading digit string components d1 and d2,\n\t# and advance v1 and v2 past the leading digit strings.\n\tfor (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue\n\tfor (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue\n\td1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)\n\td2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)\n\tif (d1 ~ /^0/) {\n\t  if (d2 ~ /^0/) {\n\t    # Compare two fractions.\n\t    while (d1 ~ /^0/ && d2 ~ /^0/) {\n\t      d1 = substr(d1, 2); len1--\n\t      d2 = substr(d2, 2); len2--\n\t    }\n\t    if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {\n\t      # The two components differ in length, and the common prefix\n\t      # contains only leading zeros.  Consider the longer to be less.\n\t      d1 = -len1\n\t      d2 = -len2\n\t    } else {\n\t      # Otherwise, compare as strings.\n\t      d1 = \"x\" d1\n\t      d2 = \"x\" d2\n\t    }\n\t  } else {\n\t    # A fraction is less than an integer.\n\t    exit 1\n\t  }\n\t} else {\n\t  if (d2 ~ /^0/) {\n\t    # An integer is greater than a fraction.\n\t    exit 2\n\t  } else {\n\t    # Compare two integers.\n\t    d1 += 0\n\t    d2 += 0\n\t  }\n\t}\n      } else {\n\t# The normal case, without worrying about digits.\n\td1 = substr(v1, 1, 1); v1 = substr(v1, 2)\n\td2 = substr(v2, 1, 1); v2 = substr(v2, 2)\n      }\n      if (d1 < d2) exit 1\n      if (d1 > d2) exit 2\n    }\n    # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10),\n    # which mishandles some comparisons of empty strings to integers.\n    if (length(v2)) exit 1\n    if (length(v1)) exit 2\n  }\n'\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME=\nPACKAGE_TARNAME=\nPACKAGE_VERSION=\nPACKAGE_STRING=\nPACKAGE_BUGREPORT=\nPACKAGE_URL=\n\nac_unique_file=\"src/hypermail.c\"\nac_default_prefix=/usr/local\nenable_option_checking=no\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='LTLIBOBJS\nLIBOBJS\nINCLUDES\nEXTRA_LIBS\nHAVE_STRERROR\nHAVE_MEMMOVE\nFNV_DEP\nPCRE_DEP\nPCRE_CONFIG\nTRIO_DEP\nEGREP\nGREP\ndomainaddr\ndefaultindex\nhtmlsuffix\nlanguage\ncgidir\nhttpddir\nsuffix\nINSTALL\nRANLIB\nAR\nSET_MAKE\nLN_S\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nYACC_CHECK\nYFLAGS\nYACC\nCPP\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\ntarget_os\ntarget_vendor\ntarget_cpu\ntarget\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nrunstatedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_warnings\nwith_httpddir\nwith_cgidir\nwith_htmldir\nwith_language\nwith_htmlsuffix\nenable_defaultindex\nwith_domainaddr\nwith_gdbm\nenable_i18n\nenable_system_libtrio\nenable_bundled_pcre\nwith_external_pcre\nenable_libfnv\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCPP\nYACC\nYFLAGS'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nrunstatedir='${localstatedir}/run'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -runstatedir | --runstatedir | --runstatedi | --runstated \\\n  | --runstate | --runstat | --runsta | --runst | --runs \\\n  | --run | --ru | --r)\n    ac_prev=runstatedir ;;\n  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \\\n  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \\\n  | --run=* | --ru=* | --r=*)\n    runstatedir=$ac_optarg ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir runstatedir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n  --target=TARGET   configure for building compilers for TARGET [HOST]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-warnings       Enable -Wall if using gcc.\n  --enable-defaultindex=type\tDefault index page type thread\n  --disable-i18n           Disable I18N support\n  --enable-system-libtrio Use the system libtrio instead of compiling the\n                          bundled one\n  --enable-bundled-pcre   Force the use of the bundled PCRE library instead of\n                          the system one\n\t      --enable-libfnv         use the fnv hash library for generating\n                          non-sequential filenames [no]\n\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-httpddir=DIR\t  webserver's root directory /usr/local/apache\n  --with-cgidir=DIR\t  where to install CGI scripts\n  --with-htmldir=DIR\t  where to install Hypermail HTML pages\n  --with-language=xx\t  two character language indicator en\n  --with-htmlsuffix=xx\t  two character language indicator html\n  --with-domainaddr=YOURDOMAIN\t  domain address of local domain\n  --with-gdbm=DIR         Include GDBM support\n  --with-external-pcre=PATH_TO_PCRE_DIR|PATH_TO_PCRE_CONFIG_SCRIPT\n                          Use an external PCRE library instead of the system\n                          or the bundled one\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CPP         C preprocessor\n  YACC        The `Yet Another Compiler Compiler' implementation to use.\n              Defaults to the first program found out of: `bison -y', `byacc',\n              `yacc'.\n  YFLAGS      The list of arguments that will be passed by default to $YACC.\n              This script will default YFLAGS to the empty string to avoid a\n              default value of `-d' given by some make applications.\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nconfigure\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_mongrel\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\n\n# ac_fn_c_check_type LINENO TYPE VAR INCLUDES\n# -------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_c_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_type\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\nac_config_headers=\"$ac_config_headers config.h\"\n\n\nLDFLAGS=\"\"\nLIBS=\"\"\nEXTRA_LIBS=\"\"\nINCLUDES=\"\"\nCPPFLAGS=\"\"\nGDBM_INCLUDE=\"\"\nGDBM_LIB=\"\"\nFNV_DEP=\"\"\nTRIO_DEP=\"\"\nPCRE_DEP=\"\"\nPCRE_MIN_VERSION=\"8.39\"\n\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking target system type\" >&5\n$as_echo_n \"checking target system type... \" >&6; }\nif ${ac_cv_target+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$target_alias\" = x; then\n  ac_cv_target=$ac_cv_host\nelse\n  ac_cv_target=`$SHELL \"$ac_aux_dir/config.sub\" $target_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $target_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_target\" >&5\n$as_echo \"$ac_cv_target\" >&6; }\ncase $ac_cv_target in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical target\" \"$LINENO\" 5;;\nesac\ntarget=$ac_cv_target\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_target\nshift\ntarget_cpu=$1\ntarget_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\ntarget_os=$*\nIFS=$ac_save_IFS\ncase $target_os in *\\ *) target_os=`echo \"$target_os\" | sed 's/ /-/g'`;; esac\n\n\n# The aliases save the names the user supplied, while $host etc.\n# will get canonicalized.\ntest -n \"$target_alias\" &&\n  test \"$program_prefix$program_suffix$program_transform_name\" = \\\n    NONENONEs,x,x, &&\n  program_prefix=${target_alias}-\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking cached information\" >&5\n$as_echo_n \"checking cached information... \" >&6; }\nhostcheck=\"$host\"\nif ${ac_cv_hostcheck+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n   ac_cv_hostcheck=\"$hostcheck\"\nfi\n\nif test \"$ac_cv_hostcheck\" != \"$hostcheck\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: changed\" >&5\n$as_echo \"changed\" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: config.cache exists!\" >&5\n$as_echo \"$as_me: WARNING: config.cache exists!\" >&2;}\n  as_fn_error $? \"you must do 'make clobber' first to compile for different host or different parameters.\" \"$LINENO\" 5\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfor ac_prog in 'bison -y' byacc\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_YACC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$YACC\"; then\n  ac_cv_prog_YACC=\"$YACC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_YACC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nYACC=$ac_cv_prog_YACC\nif test -n \"$YACC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $YACC\" >&5\n$as_echo \"$YACC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$YACC\" && break\ndone\ntest -n \"$YACC\" || YACC=\"yacc\"\n\n# Extract the first word of \"$YACC\", so it can be a program name with args.\nset dummy $YACC; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_YACC_CHECK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$YACC_CHECK\"; then\n  ac_cv_prog_YACC_CHECK=\"$YACC_CHECK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_YACC_CHECK=\"yes\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nYACC_CHECK=$ac_cv_prog_YACC_CHECK\nif test -n \"$YACC_CHECK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $YACC_CHECK\" >&5\n$as_echo \"$YACC_CHECK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test x\"$YACC_CHECK\" != x\"yes\"; then :\n  as_fn_error $? \"Please install either bison or yacc and run configure again\" \"$LINENO\" 5\nfi\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\n# Extract the first word of \"ar\", so it can be a program name with args.\nset dummy ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_prog_AR\" && ac_cv_prog_AR=\"echo\"\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test -z \"$no_ranlib\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\nelse\n  RANLIB=\":\"\nfi\n\n\nINSTALL=\"install-sh\"\n\ncase \"$host\" in\n  *-*-solaris*)\n    # Solaris flags\n    $as_echo \"#define NO_MACRO 1\" >>confdefs.h\n\n    ;;\n\n  *-*-hpux*)\n    # HPUX flags\n    if test -z \"$GCC\"; then\n      CFLAGS=\"$CFLAGS -Ae\"\n    fi\n    ;;\n  *-dec-osf*)\n    # DEC OSF flags\n    CFLAGS=\"$CFLAGS -mieee\"\n    INSTALL=\"install-sh\"\n    ;;\nesac\n\nexport CFLAGS CC\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking that the compiler works\" >&5\n$as_echo_n \"checking that the compiler works... \" >&6; }\n\nif test \"$cross_compiling\" = yes; then :\n  as_fn_error $? \"Could not compile and run even a trivial ANSI C program - check CC.\" \"$LINENO\" 5\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n main(int ac, char **av) { return 0; }\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    as_fn_error $? \"Could not compile and run even a trivial ANSI C program - check CC.\" \"$LINENO\" 5\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\n\n\ncase \"$build\" in\n  *-*-cygwin*)\n      suffix=.exe\n\n    ;;\nesac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to enable -Wall\" >&5\n$as_echo_n \"checking whether to enable -Wall... \" >&6; }\n# Check whether --enable-warnings was given.\nif test \"${enable_warnings+set}\" = set; then :\n  enableval=$enable_warnings;  if test -n \"$GCC\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: adding -Wall to CFLAGS.\" >&5\n$as_echo \"adding -Wall to CFLAGS.\" >&6; }\n    CFLAGS=\"$CFLAGS -Wall\"\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n# Check whether --with-httpddir was given.\nif test \"${with_httpddir+set}\" = set; then :\n  withval=$with_httpddir; httpddir=$with_httpddir\nelse\n  httpddir=/usr/local/apache\nfi\n\n\n\n\n# Check whether --with-cgidir was given.\nif test \"${with_cgidir+set}\" = set; then :\n  withval=$with_cgidir; cgidir=$with_cgidir\nelse\n  cgidir=$httpddir/cgi-bin\nfi\n\n\n\n\n# Check whether --with-htmldir was given.\nif test \"${with_htmldir+set}\" = set; then :\n  withval=$with_htmldir; htmldir=$with_htmldir\nelse\n  htmldir=$httpddir/htdocs/hypermail\nfi\n\n\n\n\n# Check whether --with-language was given.\nif test \"${with_language+set}\" = set; then :\n  withval=$with_language; language=$with_language\nelse\n  language=en\nfi\n\n\n\n\n# Check whether --with-htmlsuffix was given.\nif test \"${with_htmlsuffix+set}\" = set; then :\n  withval=$with_htmlsuffix; htmlsuffix=$with_htmlsuffix\nelse\n  htmlsuffix=html\nfi\n\n\n\n# Check whether --enable-defaultindex was given.\nif test \"${enable_defaultindex+set}\" = set; then :\n  enableval=$enable_defaultindex;  defaultindex=$enableval\nelse\n   defaultindex=\"thread\"\nfi\n\n\n\n\n# Check whether --with-domainaddr was given.\nif test \"${with_domainaddr+set}\" = set; then :\n  withval=$with_domainaddr; domainaddr=$with_domainaddr\nelse\n  domainaddr=NONE\nfi\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_header in alloca.h arpa/inet.h ctype.h dirent.h errno.h \\\n\tfcntl.h locale.h malloc.h netdb.h netinet/in.h pwd.h stdarg.h \\\n\tstdio.h stdlib.h string.h sys/dir.h sys/param.h sys/socket.h \\\n\tsys/stat.h sys/time.h sys/types.h time.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken\" >&5\n$as_echo_n \"checking whether stat file-mode macros are broken... \" >&6; }\nif ${ac_cv_header_stat_broken+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#if defined S_ISBLK && defined S_IFDIR\nextern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];\n#endif\n\n#if defined S_ISBLK && defined S_IFCHR\nextern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];\n#endif\n\n#if defined S_ISLNK && defined S_IFREG\nextern char c3[S_ISLNK (S_IFREG) ? -1 : 1];\n#endif\n\n#if defined S_ISSOCK && defined S_IFREG\nextern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];\n#endif\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stat_broken=no\nelse\n  ac_cv_header_stat_broken=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken\" >&5\n$as_echo \"$ac_cv_header_stat_broken\" >&6; }\nif test $ac_cv_header_stat_broken = yes; then\n\n$as_echo \"#define STAT_MACROS_BROKEN 1\" >>confdefs.h\n\nfi\n\nac_header_dirent=no\nfor ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do\n  as_ac_Header=`$as_echo \"ac_cv_header_dirent_$ac_hdr\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR\" >&5\n$as_echo_n \"checking for $ac_hdr that defines DIR... \" >&6; }\nif eval \\${$as_ac_Header+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <$ac_hdr>\n\nint\nmain ()\n{\nif ((DIR *) 0)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_ac_Header=yes\"\nelse\n  eval \"$as_ac_Header=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$as_ac_Header\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_hdr\" | $as_tr_cpp` 1\n_ACEOF\n\nac_header_dirent=$ac_hdr; break\nfi\n\ndone\n# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.\nif test $ac_header_dirent = dirent.h; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing opendir\" >&5\n$as_echo_n \"checking for library containing opendir... \" >&6; }\nif ${ac_cv_search_opendir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar opendir ();\nint\nmain ()\n{\nreturn opendir ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' dir; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_opendir=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_opendir+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_opendir+:} false; then :\n\nelse\n  ac_cv_search_opendir=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir\" >&5\n$as_echo \"$ac_cv_search_opendir\" >&6; }\nac_res=$ac_cv_search_opendir\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing opendir\" >&5\n$as_echo_n \"checking for library containing opendir... \" >&6; }\nif ${ac_cv_search_opendir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar opendir ();\nint\nmain ()\n{\nreturn opendir ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' x; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_opendir=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_opendir+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_opendir+:} false; then :\n\nelse\n  ac_cv_search_opendir=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir\" >&5\n$as_echo \"$ac_cv_search_opendir\" >&6; }\nac_res=$ac_cv_search_opendir\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nfi\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included\" >&5\n$as_echo_n \"checking whether time.h and sys/time.h may both be included... \" >&6; }\nif ${ac_cv_header_time+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/time.h>\n#include <time.h>\n\nint\nmain ()\n{\nif ((struct tm *) 0)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_time=yes\nelse\n  ac_cv_header_time=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time\" >&5\n$as_echo \"$ac_cv_header_time\" >&6; }\nif test $ac_cv_header_time = yes; then\n\n$as_echo \"#define TIME_WITH_SYS_TIME 1\" >>confdefs.h\n\nfi\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h\" >&5\n$as_echo_n \"checking whether struct tm is in sys/time.h or time.h... \" >&6; }\nif ${ac_cv_struct_tm+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <time.h>\n\nint\nmain ()\n{\nstruct tm tm;\n\t\t\t\t     int *p = &tm.tm_sec;\n\t\t\t\t     return !p;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_struct_tm=time.h\nelse\n  ac_cv_struct_tm=sys/time.h\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm\" >&5\n$as_echo \"$ac_cv_struct_tm\" >&6; }\nif test $ac_cv_struct_tm = sys/time.h; then\n\n$as_echo \"#define TM_IN_SYS_TIME 1\" >>confdefs.h\n\nfi\n\n\nfor ac_func in strftime\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"strftime\" \"ac_cv_func_strftime\"\nif test \"x$ac_cv_func_strftime\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_STRFTIME 1\n_ACEOF\n\nelse\n  # strftime is in -lintl on SCO UNIX.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl\" >&5\n$as_echo_n \"checking for strftime in -lintl... \" >&6; }\nif ${ac_cv_lib_intl_strftime+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lintl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar strftime ();\nint\nmain ()\n{\nreturn strftime ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_intl_strftime=yes\nelse\n  ac_cv_lib_intl_strftime=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime\" >&5\n$as_echo \"$ac_cv_lib_intl_strftime\" >&6; }\nif test \"x$ac_cv_lib_intl_strftime\" = xyes; then :\n  $as_echo \"#define HAVE_STRFTIME 1\" >>confdefs.h\n\nLIBS=\"-lintl $LIBS\"\nfi\n\nfi\ndone\n\nfor ac_func in mkdir strdup strstr strtol memcpy memset lstat strcasecmp \\\n               strcasestr getpwuid getopt snprintf memmove strerror\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nac_fn_c_check_type \"$LINENO\" \"size_t\" \"ac_cv_type_size_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_size_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define size_t unsigned int\n_ACEOF\n\nfi\n\n\nif test $ac_cv_func_snprintf != no; then\n    $as_echo \"#define HAVE_SNPRINTF 1\" >>confdefs.h\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gdbm was given.\nif test \"${with_gdbm+set}\" = set; then :\n  withval=$with_gdbm;  given_gdbm=$withval\nfi\n\n\nif test \"$given_gdbm\" != \"no\"; then\n    for i in /usr/local /usr $withval; do\n      if test -f \"$i/include/gdbm.h\"; then\n        GDBM_INCLUDE=\"$i/include\"\n        THIS_PREFIX=\"$i\"\n      fi\n    done\n\n    unset ac_cv_lib_gdbm_gdbm_open\n\n  old_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"-L$THIS_PREFIX/lib $LDFLAGS\"\n\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm\" >&5\n$as_echo_n \"checking for gdbm_open in -lgdbm... \" >&6; }\nif ${ac_cv_lib_gdbm_gdbm_open+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lgdbm  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gdbm_open ();\nint\nmain ()\n{\nreturn gdbm_open ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_gdbm_gdbm_open=yes\nelse\n  ac_cv_lib_gdbm_gdbm_open=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open\" >&5\n$as_echo \"$ac_cv_lib_gdbm_gdbm_open\" >&6; }\nif test \"x$ac_cv_lib_gdbm_gdbm_open\" = xyes; then :\n  GDBM_LIB=\"-lgdbm\"\nfi\n\n\n  LDFLAGS=\"$old_LDFLAGS\"\n\n\n    if test \"$THIS_PREFIX\" != \"\" && test \"$THIS_PREFIX\" != \"/usr\"; then\n      THIS_LFLAGS=\"$THIS_PREFIX/lib\"\n    fi\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GDBM support\" >&5\n$as_echo_n \"checking for GDBM support... \" >&6; }\n\nif test \"$GDBM_LIB\" = \"\" && test \"$given_gdbm\" != \"no\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm\" >&5\n$as_echo_n \"checking for gdbm_open in -lgdbm... \" >&6; }\nif ${ac_cv_lib_gdbm_gdbm_open+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lgdbm  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gdbm_open ();\nint\nmain ()\n{\nreturn gdbm_open ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_gdbm_gdbm_open=yes\nelse\n  ac_cv_lib_gdbm_gdbm_open=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open\" >&5\n$as_echo \"$ac_cv_lib_gdbm_gdbm_open\" >&6; }\nif test \"x$ac_cv_lib_gdbm_gdbm_open\" = xyes; then :\n\n$as_echo \"#define GDBM 1\" >>confdefs.h\n DBM_TYPE=gdbm; GDBM_LIB=-lgdbm\nelse\n  DBM_TYPE=\"\"\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking gdbm library\" >&5\n$as_echo_n \"checking gdbm library... \" >&6; }\n  if test \"a$DBM_TYPE\" = a; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none found\" >&5\n$as_echo \"none found\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: No gdbm library found - will limit a few features\" >&5\n$as_echo \"$as_me: WARNING: No gdbm library found - will limit a few features\" >&2;}\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DBM_TYPE found\" >&5\n$as_echo \"$DBM_TYPE found\" >&6; }\n  fi\nelse\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\nif test \"$GDBM_LIB\" = \"-lgdbm\" && test \"$GDBM_INCLUDE\" = \"\"; then\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"gdbm.h\" \"ac_cv_header_gdbm_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_gdbm_h\" = xyes; then :\n   GDBM_INCLUDE=\"\"\nelse\n\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: Try /usr/local/include/gdbm.h\" >&5\n$as_echo \"Try /usr/local/include/gdbm.h\" >&6; }\n      ac_fn_c_check_header_mongrel \"$LINENO\" \"/usr/local/include/gdbm.h\" \"ac_cv_header__usr_local_include_gdbm_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header__usr_local_include_gdbm_h\" = xyes; then :\n   GDBM_INCLUDE=\"-I/usr/local/include\"\nelse\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: Try /opt/local/include/gdbm.h\" >&5\n$as_echo \"Try /opt/local/include/gdbm.h\" >&6; }\n        ac_fn_c_check_header_mongrel \"$LINENO\" \"/opt/local/include/gdbm.h\" \"ac_cv_header__opt_local_include_gdbm_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header__opt_local_include_gdbm_h\" = xyes; then :\n   GDBM_INCLUDE=\"-I/opt/local/include\"\nelse\n\n                    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: Try /usr/pkg/include/gdbm.h\" >&5\n$as_echo \"Try /usr/pkg/include/gdbm.h\" >&6; }\n          ac_fn_c_check_header_mongrel \"$LINENO\" \"/usr/pkg/include/gdbm.h\" \"ac_cv_header__usr_pkg_include_gdbm_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header__usr_pkg_include_gdbm_h\" = xyes; then :\n   GDBM_INCLUDE=\"\"\nelse\n\n            { $as_echo \"$as_me:${as_lineno-$LINENO}: result: Giving up - You need to install gdbm.h somewhere\" >&5\n$as_echo \"Giving up - You need to install gdbm.h somewhere\" >&6; }\n            exit\n\nfi\n\n\n\nfi\n\n\n\nfi\n\n\n\nfi\n\n\nfi\n\nif test -n \"$GDBM_LIB\"; then\n\n  if test \"$GDBM_INCLUDE\" != \"/usr/include\"; then\n\n  if test -z \"$GDBM_INCLUDE\" || echo \"$GDBM_INCLUDE\" | grep '^/' >/dev/null ; then\n    ai_p=\"$GDBM_INCLUDE\"\n  else\n\n    ep_dir=\"`echo $GDBM_INCLUDE|sed 's%/*[^/][^/]*/*$%%'`\"\n\n    ep_realdir=\"`(cd \\\"$ep_dir\\\" && pwd)`\"\n    ai_p=\"$ep_realdir/`basename \\\"$GDBM_INCLUDE\\\"`\"\n  fi\n\n\n\n  unique=`echo $ai_p|sed 's/[^a-zA-Z0-9]/_/g'`\n\n  cmd=\"echo $ac_n \\\"\\$INCLUDEPATH$unique$ac_c\\\"\"\n  if test -n \"$unique\" && test \"`eval $cmd`\" = \"\" ; then\n    eval \"INCLUDEPATH$unique=set\"\n\n      INCLUDES=\"$INCLUDES -I$ai_p\"\n\n  fi\n\n  fi\n\n    $as_echo \"#define HAVE_GDBM_H 1\" >>confdefs.h\n\n    EXTRA_LIBS=\"$EXTRA_LIBS $GDBM_LIB\"\nfi\n\n\n\n# Check whether --enable-i18n was given.\nif test \"${enable_i18n+set}\" = set; then :\n  enableval=$enable_i18n; given_iconv=$enableval\nfi\n\nif test \"$given_iconv\" = \"no\"; then\n  echo \"disabled I18N support.\"\nelse\n  for ac_func in iconv\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"iconv\" \"ac_cv_func_iconv\"\nif test \"x$ac_cv_func_iconv\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_ICONV 1\n_ACEOF\n\nfi\ndone\n\n  for ac_header in iconv.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"iconv.h\" \"ac_cv_header_iconv_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_iconv_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_ICONV_H 1\n_ACEOF\n\nfi\n\ndone\n\nfi\n\n\n# Check whether --enable-system_libtrio was given.\nif test \"${enable_system_libtrio+set}\" = set; then :\n  enableval=$enable_system_libtrio;\nfi\n\n\nif test \"${enable_system_libtrio}\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for system libtrio\" >&5\n$as_echo \"$as_me: checking for system libtrio\" >&6;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing trio_printf\" >&5\n$as_echo_n \"checking for library containing trio_printf... \" >&6; }\nif ${ac_cv_search_trio_printf+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar trio_printf ();\nint\nmain ()\n{\nreturn trio_printf ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' trio; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_trio_printf=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_trio_printf+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_trio_printf+:} false; then :\n\nelse\n  ac_cv_search_trio_printf=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_trio_printf\" >&5\n$as_echo \"$ac_cv_search_trio_printf\" >&6; }\nac_res=$ac_cv_search_trio_printf\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nelse\n  as_fn_error $? \"unable to find trio_copy() function\" \"$LINENO\" 5\n\nfi\n\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"trio.h\" \"ac_cv_header_trio_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_trio_h\" = xyes; then :\n\nelse\n  as_fn_error $? \"unable to find trio.h header file (dev version not installed?)\" \"$LINENO\" 5\n\nfi\n\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: using bundled libtrio\" >&5\n$as_echo \"$as_me: using bundled libtrio\" >&6;}\n\n  if test \"x$INCLUDES\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting INCLUDES to \\\"\"-Itrio\"\\\"\"\n    INCLUDES=\"\"-Itrio\"\"\n  else\n    apr_addto_bugger=\"\"-Itrio\"\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $INCLUDES; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to INCLUDES\"\n        INCLUDES=\"$INCLUDES $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$LDFLAGS\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting LDFLAGS to \\\"\"-Ltrio\"\\\"\"\n    LDFLAGS=\"\"-Ltrio\"\"\n  else\n    apr_addto_bugger=\"\"-Ltrio\"\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $LDFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$CPPFLAGS\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting CPPFLAGS to \\\"\"-DTRIO_MINIMAL\"\\\"\"\n    CPPFLAGS=\"\"-DTRIO_MINIMAL\"\"\n  else\n    apr_addto_bugger=\"\"-DTRIO_MINIMAL\"\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $CPPFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to CPPFLAGS\"\n        CPPFLAGS=\"$CPPFLAGS $i\"\n      fi\n    done\n  fi\n\n  TRIO_DEP=\"trio/libtrio.a\"\n\n  # save our work to this point; this allows the sub-package to use it\n  cat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\n  echo \"configuring package in src/trio now\"\n  ac_popdir=`pwd`\n  apr_config_subdirs=\"src/trio\"\n  test -d src/trio || $mkdir_p src/trio\n  ac_abs_srcdir=`(cd $srcdir/src/trio && pwd)`\n  cd src/trio\n\n      # A \"../\" for each directory in /$config_subdirs.\n      ac_dots=`echo $apr_config_subdirs|sed -e 's%^\\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`\n\n  # Make the cache file pathname absolute for the subdirs\n  # required to correctly handle subdirs that might actually\n  # be symlinks\n  case \"$cache_file\" in\n  /*) # already absolute\n    ac_sub_cache_file=$cache_file ;;\n  *)  # Was relative path.\n    ac_sub_cache_file=\"$ac_popdir/$cache_file\" ;;\n  esac\n\n\n  apr_configure_args=\n  apr_sep=\n  for apr_configure_arg in $ac_configure_args\n  do\n    case \"$apr_configure_arg\" in\n      --with-pcre=*|\\'--with-pcre=*)\n        continue ;;\n    esac\n    apr_configure_args=\"$apr_configure_args$apr_sep'$apr_configure_arg'\"\n    apr_sep=\" \"\n  done\n\n\n    test \"x$silent\" = \"xyes\" && apr_configure_args=\"$apr_configure_args --silent\"\n\n    apr_configure_args=\"--disable-option-checking $apr_configure_args\"\n\n              if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir CFLAGS=-DTRIO_MINIMAL\n  then :\n    echo \"src/trio configured properly\"\n  else\n    echo \"configure failed for src/trio\"\n    exit 1\n  fi\n\n  cd $ac_popdir\n\n  # grab any updates from the sub-package\n  if test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n\n\nfi\n\n\n# Check whether --enable-bundled_pcre was given.\nif test \"${enable_bundled_pcre+set}\" = set; then :\n  enableval=$enable_bundled_pcre;\nfi\n\n\n\n# Check whether --with-external_pcre was given.\nif test \"${with_external_pcre+set}\" = set; then :\n  withval=$with_external_pcre;\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for PCRE regular expressions library\" >&5\n$as_echo \"$as_me: checking for PCRE regular expressions library\" >&6;}\n\nif test ! -z ${enable_bundled_pcre}; then\n   with_external_pcre=\"\"\nfi\n\ncase $with_external_pcre in\n /*) { $as_echo \"$as_me:${as_lineno-$LINENO}: --with-external-pcre => checking for an external libpcre\" >&5\n$as_echo \"$as_me: --with-external-pcre => checking for an external libpcre\" >&6;}\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pcre-config\" >&5\n$as_echo_n \"checking for pcre-config... \" >&6; }\n     if test -d \"$with_external_pcre\" && test -x \"$with_external_pcre/pcre-config\"; then\n       PCRE_CONFIG=$with_external_pcre/pcre-config\n     elif test -x \"$with_external_pcre\"; then\n       PCRE_CONFIG=$with_external_pcre\n     else\n       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n       as_fn_error $? \"${PCRE_CONFIG} does not point to a directory or pcre-config\" \"$LINENO\" 5\n     fi\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${PCRE_CONFIG}\" >&5\n$as_echo \"${PCRE_CONFIG}\" >&6; }\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pcre version equal or greater than ${PCRE_MIN_VERSION}\" >&5\n$as_echo_n \"checking for pcre version equal or greater than ${PCRE_MIN_VERSION}... \" >&6; }\n     if test -f \"${PCRE_CONFIG}\" && test -x \"${PCRE_CONFIG}\"; then\n        PCRE_VERSION=$(${PCRE_CONFIG} --version)\n        as_arg_v1=\"${PCRE_VERSION}\"\nas_arg_v2=\"${PCRE_MIN_VERSION}\"\nawk \"$as_awk_strverscmp\" v1=\"$as_arg_v1\" v2=\"$as_arg_v2\" /dev/null\ncase $? in #(\n  1) :\n    PCRE_CONFIG=false ;; #(\n  0) :\n     ;; #(\n  2) :\n     ;; #(\n  *) :\n     ;;\nesac\n        if test \"${PCRE_CONFIG}\" != false; then\n           { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n        else\n           { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n           as_fn_error $? \"the PCRE library version must be equal or greater than ${PCRE_MIN_VERSION}\" \"$LINENO\" 5\n        fi\n     else\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n        as_fn_error $? \"${PCRE_CONFIG} does not point to a script\" \"$LINENO\" 5\n     fi\n     ;;\n\n  *) PCRE_CONFIG=false\n     ;;\nesac\n\nif test -z \"${enable_bundled_pcre}\" && test -z \"${PCRE_CONFIG}\" -o \"${PCRE_CONFIG}\" = \"false\"; then\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a system libpcre\" >&5\n$as_echo \"$as_me: checking for a system libpcre\" >&6;}\n   # Extract the first word of \"pcre-config\", so it can be a program name with args.\nset dummy pcre-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_PCRE_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $PCRE_CONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_PCRE_CONFIG=\"$PCRE_CONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_PCRE_CONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nPCRE_CONFIG=$ac_cv_path_PCRE_CONFIG\nif test -n \"$PCRE_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG\" >&5\n$as_echo \"$PCRE_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n   if test ! -z \"${PCRE_CONFIG}\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking checking pcre version equal or greater than ${PCRE_MIN_VERSION}\" >&5\n$as_echo_n \"checking checking pcre version equal or greater than ${PCRE_MIN_VERSION}... \" >&6; }\n      PCRE_VERSION=$(${PCRE_CONFIG} --version)\n      as_arg_v1=\"${PCRE_VERSION}\"\nas_arg_v2=\"${PCRE_MIN_VERSION}\"\nawk \"$as_awk_strverscmp\" v1=\"$as_arg_v1\" v2=\"$as_arg_v2\" /dev/null\ncase $? in #(\n  1) :\n    PCRE_CONFIG=false ;; #(\n  0) :\n     ;; #(\n  2) :\n     ;; #(\n  *) :\n     ;;\nesac\n      if test \"${PCRE_CONFIG}\" != false; then\n         { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      else\n         { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n      fi\n   else\n      PCRE_CONFIG=false\n   fi\nfi\n\nif test \"${PCRE_CONFIG}\" != false; then\n  PCRE_PATH=$(${PCRE_CONFIG} --prefix)\n  as_ac_Header=`$as_echo \"ac_cv_header_\"$PCRE_PATH/include/pcre.h\"\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"\"$PCRE_PATH/include/pcre.h\"\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n\nelse\n  PCRE_CONFIG=false\nfi\n\n\nfi\n\nif test \"$PCRE_CONFIG\" != \"false\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: using system PCRE regular expressions library\" >&5\n$as_echo \"$as_me: using system PCRE regular expressions library\" >&6;}\n\n  if test \"x$CFLAGS\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting CFLAGS to \\\"`$PCRE_CONFIG --cflags`\\\"\"\n    CFLAGS=\"`$PCRE_CONFIG --cflags`\"\n  else\n    apr_addto_bugger=\"`$PCRE_CONFIG --cflags`\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $CFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to CFLAGS\"\n        CFLAGS=\"$CFLAGS $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$LIBS\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting LIBS to \\\"`$PCRE_CONFIG --libs`\\\"\"\n    LIBS=\"`$PCRE_CONFIG --libs`\"\n  else\n    apr_addto_bugger=\"`$PCRE_CONFIG --libs`\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $LIBS; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to LIBS\"\n        LIBS=\"$LIBS $i\"\n      fi\n    done\n  fi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: using bundled PCRE regular expressions library\" >&5\n$as_echo \"$as_me: using bundled PCRE regular expressions library\" >&6;}\n\n  if test \"x$INCLUDES\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting INCLUDES to \\\"-Ipcre\\\"\"\n    INCLUDES=\"-Ipcre\"\n  else\n    apr_addto_bugger=\"-Ipcre\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $INCLUDES; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to INCLUDES\"\n        INCLUDES=\"$INCLUDES $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$LDFLAGS\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting LDFLAGS to \\\"\"-Lpcre/.libs\"\\\"\"\n    LDFLAGS=\"\"-Lpcre/.libs\"\"\n  else\n    apr_addto_bugger=\"\"-Lpcre/.libs\"\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $LDFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS $i\"\n      fi\n    done\n  fi\n\n  PCRE_DEP=\"pcre/.libs/libpcre.a\"\n\n  # save our work to this point; this allows the sub-package to use it\n  cat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\n  echo \"configuring package in src/pcre now\"\n  ac_popdir=`pwd`\n  apr_config_subdirs=\"src/pcre\"\n  test -d src/pcre || $mkdir_p src/pcre\n  ac_abs_srcdir=`(cd $srcdir/src/pcre && pwd)`\n  cd src/pcre\n\n      # A \"../\" for each directory in /$config_subdirs.\n      ac_dots=`echo $apr_config_subdirs|sed -e 's%^\\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`\n\n  # Make the cache file pathname absolute for the subdirs\n  # required to correctly handle subdirs that might actually\n  # be symlinks\n  case \"$cache_file\" in\n  /*) # already absolute\n    ac_sub_cache_file=$cache_file ;;\n  *)  # Was relative path.\n    ac_sub_cache_file=\"$ac_popdir/$cache_file\" ;;\n  esac\n\n\n  apr_configure_args=\n  apr_sep=\n  for apr_configure_arg in $ac_configure_args\n  do\n    case \"$apr_configure_arg\" in\n      --with-pcre=*|\\'--with-pcre=*)\n        continue ;;\n    esac\n    apr_configure_args=\"$apr_configure_args$apr_sep'$apr_configure_arg'\"\n    apr_sep=\" \"\n  done\n\n\n    test \"x$silent\" = \"xyes\" && apr_configure_args=\"$apr_configure_args --silent\"\n\n    apr_configure_args=\"--disable-option-checking $apr_configure_args\"\n\n              if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir\n  then :\n    echo \"src/pcre configured properly\"\n  else\n    echo \"configure failed for src/pcre\"\n    exit 1\n  fi\n\n  cd $ac_popdir\n\n  # grab any updates from the sub-package\n  if test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n\n\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to use fnv hash library for non-sequential filenames\" >&5\n$as_echo_n \"checking whether to use fnv hash library for non-sequential filenames... \" >&6; }\n# Check whether --enable-libfnv was given.\nif test \"${enable_libfnv+set}\" = set; then :\n  enableval=$enable_libfnv;  given_libfnv=$enableval\nfi\n\n\nif test \"$given_libfnv\" != \"yes\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  $as_echo \"#define HAVE_LIBFNV 1\" >>confdefs.h\n\n\n  if test \"x$INCLUDES\" = \"x\"; then\n    test \"x$silent\" != \"xyes\" && echo \"  setting INCLUDES to \\\"-Ifnv\\\"\"\n    INCLUDES=\"-Ifnv\"\n  else\n    apr_addto_bugger=\"-Ifnv\"\n    for i in $apr_addto_bugger; do\n      apr_addto_duplicate=\"0\"\n      for j in $INCLUDES; do\n        if test \"x$i\" = \"x$j\"; then\n          apr_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $apr_addto_duplicate = \"0\"; then\n        test \"x$silent\" != \"xyes\" && echo \"  adding \\\"$i\\\" to INCLUDES\"\n        INCLUDES=\"$INCLUDES $i\"\n      fi\n    done\n  fi\n\n\n\n  if test -n \"src/fnv\"; then\n\n  if test \"src/fnv\" != \"/usr/lib\"; then\n\n  if test -z \"src/fnv\" || echo \"src/fnv\" | grep '^/' >/dev/null ; then\n    ai_p=\"src/fnv\"\n  else\n\n    ep_dir=\"`echo src/fnv|sed 's%/*[^/][^/]*/*$%%'`\"\n\n    ep_realdir=\"`(cd \\\"$ep_dir\\\" && pwd)`\"\n    ai_p=\"$ep_realdir/`basename \\\"src/fnv\\\"`\"\n  fi\n\n\n\n  unique=`echo $ai_p|sed 's/[^a-zA-Z0-9]/_/g'`\n\n  cmd=\"echo $ac_n \\\"\\$LIBPATH$unique$ac_c\\\"\"\n  if test -n \"$unique\" && test \"`eval $cmd`\" = \"\" ; then\n    eval \"LIBPATH$unique=set\"\n\n      LDFLAGS=\"$LDFLAGS -L$ai_p\"\n\n  fi\n\n  fi\n\n  fi\n  EXTRA_LIBS=\"$EXTRA_LIBS -lfnv\"\n\n  FNV_DEP=\"fnv/libfnv.a\"\n\n  # save our work to this point; this allows the sub-package to use it\n  cat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\n  echo \"configuring package in src/fnv now\"\n  ac_popdir=`pwd`\n  apr_config_subdirs=\"src/fnv\"\n  test -d src/fnv || $mkdir_p src/fnv\n  ac_abs_srcdir=`(cd $srcdir/src/fnv && pwd)`\n  cd src/fnv\n\n      # A \"../\" for each directory in /$config_subdirs.\n      ac_dots=`echo $apr_config_subdirs|sed -e 's%^\\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`\n\n  # Make the cache file pathname absolute for the subdirs\n  # required to correctly handle subdirs that might actually\n  # be symlinks\n  case \"$cache_file\" in\n  /*) # already absolute\n    ac_sub_cache_file=$cache_file ;;\n  *)  # Was relative path.\n    ac_sub_cache_file=\"$ac_popdir/$cache_file\" ;;\n  esac\n\n  apr_configure_args=$ac_configure_args\n\n    test \"x$silent\" = \"xyes\" && apr_configure_args=\"$apr_configure_args --silent\"\n\n    apr_configure_args=\"--disable-option-checking $apr_configure_args\"\n\n              if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir\n  then :\n    echo \"src/fnv configured properly\"\n  else\n    echo \"configure failed for src/fnv\"\n    exit 1\n  fi\n\n  cd $ac_popdir\n\n  # grab any updates from the sub-package\n  if test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n\nfi\n\n\n\n\nUSENSL=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gethostbyaddr in -lsocket\" >&5\n$as_echo_n \"checking for gethostbyaddr in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_gethostbyaddr+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gethostbyaddr ();\nint\nmain ()\n{\nreturn gethostbyaddr ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_gethostbyaddr=yes\nelse\n  ac_cv_lib_socket_gethostbyaddr=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostbyaddr\" >&5\n$as_echo \"$ac_cv_lib_socket_gethostbyaddr\" >&6; }\nif test \"x$ac_cv_lib_socket_gethostbyaddr\" = xyes; then :\n  result=yes\nelse\n  result=no\nfi\n\nif test $result = yes; then\n        LIBS=\"$LIBS -lsocket\"\nelse\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gethostbyaddr in -lsocket\" >&5\n$as_echo_n \"checking for gethostbyaddr in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_gethostbyaddr+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket -lnsl $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gethostbyaddr ();\nint\nmain ()\n{\nreturn gethostbyaddr ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_gethostbyaddr=yes\nelse\n  ac_cv_lib_socket_gethostbyaddr=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostbyaddr\" >&5\n$as_echo \"$ac_cv_lib_socket_gethostbyaddr\" >&6; }\nif test \"x$ac_cv_lib_socket_gethostbyaddr\" = xyes; then :\n  result=yes\nelse\n  result=no\nfi\n\n        if test $result = yes; then\n                LIBS = \"$LIBS -lsocket -lnsl\"\n                USENSL=yes\n        else\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for inet_addr in -lsocket\" >&5\n$as_echo_n \"checking for inet_addr in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_inet_addr+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar inet_addr ();\nint\nmain ()\n{\nreturn inet_addr ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_inet_addr=yes\nelse\n  ac_cv_lib_socket_inet_addr=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_inet_addr\" >&5\n$as_echo \"$ac_cv_lib_socket_inet_addr\" >&6; }\nif test \"x$ac_cv_lib_socket_inet_addr\" = xyes; then :\n  result=yes\nelse\n  result=no\nfi\n\n                if test $result = yes; then\n                        LIBS=\"$LIBS -lsocket\"\n                else\n                        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for inet_addr in -lsocket\" >&5\n$as_echo_n \"checking for inet_addr in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_inet_addr+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket -lnsl $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar inet_addr ();\nint\nmain ()\n{\nreturn inet_addr ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_inet_addr=yes\nelse\n  ac_cv_lib_socket_inet_addr=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_inet_addr\" >&5\n$as_echo \"$ac_cv_lib_socket_inet_addr\" >&6; }\nif test \"x$ac_cv_lib_socket_inet_addr\" = xyes; then :\n  result=yes\nelse\n  result=no\nfi\n\n                        if test $result = yes; then\n                                LIBS=\"$LIBS -lsocket -lnsl\"\n                                USENSL=yes\n                        fi\n                fi\n        fi\nfi\nif test $USENSL != yes; then\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for inet_addr in -lnsl\" >&5\n$as_echo_n \"checking for inet_addr in -lnsl... \" >&6; }\nif ${ac_cv_lib_nsl_inet_addr+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lnsl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar inet_addr ();\nint\nmain ()\n{\nreturn inet_addr ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_nsl_inet_addr=yes\nelse\n  ac_cv_lib_nsl_inet_addr=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_inet_addr\" >&5\n$as_echo \"$ac_cv_lib_nsl_inet_addr\" >&6; }\nif test \"x$ac_cv_lib_nsl_inet_addr\" = xyes; then :\n  result=yes\nelse\n  result=no\nfi\n\n        if test $result = yes; then\n                LIBS=\"$LIBS -lnsl\"\n        fi\nfi\n\n\n\n\n\n\n\n\n\nac_config_files=\"$ac_config_files Makefile archive/Makefile docs/Makefile libcgi/Makefile src/Makefile tests/testhm src/defaults.h\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"archive/Makefile\") CONFIG_FILES=\"$CONFIG_FILES archive/Makefile\" ;;\n    \"docs/Makefile\") CONFIG_FILES=\"$CONFIG_FILES docs/Makefile\" ;;\n    \"libcgi/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libcgi/Makefile\" ;;\n    \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n    \"tests/testhm\") CONFIG_FILES=\"$CONFIG_FILES tests/testhm\" ;;\n    \"src/defaults.h\") CONFIG_FILES=\"$CONFIG_FILES src/defaults.h\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    \"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n ;;\n\n\n  esac\n\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n\n"
  },
  {
    "path": "configure.ac",
    "content": "dnl Process this file with autoconf to produce a configure script.\n\nAC_PREREQ([2.69])\nAC_REVISION($Revision: 1.2 $)dnl\nAC_INIT\nAC_CONFIG_SRCDIR([src/hypermail.c])\nAC_CONFIG_HEADER(config.h)\nAC_PREFIX_DEFAULT(/usr/local)\nLDFLAGS=\"\"\nLIBS=\"\"\nEXTRA_LIBS=\"\"\nINCLUDES=\"\"\nCPPFLAGS=\"\"\nGDBM_INCLUDE=\"\"\nGDBM_LIB=\"\"\nFNV_DEP=\"\"\nTRIO_DEP=\"\"\nPCRE_DEP=\"\"\nPCRE_MIN_VERSION=\"8.39\"\n\ndnl ===========================================================================\ndnl Get host, target and build variables filled with appropriate info.\ndnl ===========================================================================\n\nAC_CANONICAL_TARGET\n\ndnl ===========================================================================\ndnl Check to assure the cached information is valid.\ndnl ===========================================================================\n\nAC_MSG_CHECKING(cached information)\nhostcheck=\"$host\"\nAC_CACHE_VAL(ac_cv_hostcheck, [ ac_cv_hostcheck=\"$hostcheck\" ])\nif test \"$ac_cv_hostcheck\" != \"$hostcheck\"; then\n  AC_MSG_RESULT(changed)\n  AC_MSG_WARN(config.cache exists!)\n  AC_MSG_ERROR(you must do 'make clobber' first to compile for different host or different parameters.)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\ndnl ===========================================================================\ndnl Checks for programs.\ndnl ===========================================================================\n\nAC_PROG_CC\nAC_PROG_CPP\nAC_PROG_YACC\nAC_CHECK_PROG(YACC_CHECK,$YACC,yes)\nAS_IF([test x\"$YACC_CHECK\" != x\"yes\"], [AC_MSG_ERROR([Please install either bison or yacc and run configure again])])\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_MAKE_SET\nAC_CHECK_PROG(AR, ar, ar, echo)\nif test -z \"$no_ranlib\"; then\n  AC_PROG_RANLIB\nelse\n  RANLIB=\":\"\nfi\n\ndnl ===========================================================================\ndnl Determine the host type and set compliation flags as needed\ndnl ===========================================================================\n\nINSTALL=\"install-sh\"\n\ncase \"$host\" in\n  *-*-solaris*)\n    # Solaris flags \n    AC_DEFINE(NO_MACRO)\n    ;;\n\n  *-*-hpux*)\n    # HPUX flags \n    if test -z \"$GCC\"; then\n      CFLAGS=\"$CFLAGS -Ae\"\n    fi\n    ;;\n  *-dec-osf*)\n    # DEC OSF flags \n    CFLAGS=\"$CFLAGS -mieee\"\n    INSTALL=\"install-sh\"\n    ;;\nesac\n\nexport CFLAGS CC\n\nAC_SUBST(INSTALL)\n\nAC_MSG_CHECKING([that the compiler works])\nAC_RUN_IFELSE([AC_LANG_SOURCE([[ main(int ac, char **av) { return 0; } ]])],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)\n    AC_MSG_ERROR(Could not compile and run even a trivial ANSI C program - check CC.)],[AC_MSG_ERROR(Could not compile and run even a trivial ANSI C program - check CC.)])\n\ndnl ===========================================================================\ndnl Determine if building on a Cygwin system so that \ndnl etc/passwd checks are to be disabled.\ndnl ===========================================================================\n\ncase \"$build\" in\n  *-*-cygwin*)\n      suffix=.exe\n      AC_SUBST(suffix)\n    ;;\nesac\n\ndnl ===========================================================================\ndnl Accepted arguments to ./configure...\ndnl ===========================================================================\n\nAC_MSG_CHECKING([whether to enable -Wall])\nAC_ARG_ENABLE(warnings,\n[  --enable-warnings       Enable -Wall if using gcc.],\n[ if test -n \"$GCC\"; then \n    AC_MSG_RESULT(adding -Wall to CFLAGS.)\n    CFLAGS=\"$CFLAGS -Wall\"\n  fi],AC_MSG_RESULT(no))\n\nAC_ARG_WITH(httpddir, \n    [  --with-httpddir=DIR\t  webserver's root directory [/usr/local/apache]],\n    httpddir=$with_httpddir,\t  httpddir=/usr/local/apache)\nAC_SUBST(httpddir)\n\nAC_ARG_WITH(cgidir, \n    [  --with-cgidir=DIR\t  where to install CGI scripts ],\n    cgidir=$with_cgidir,\t  cgidir=$httpddir/cgi-bin)\nAC_SUBST(cgidir)\n\nAC_ARG_WITH(htmldir, \n    [  --with-htmldir=DIR\t  where to install Hypermail HTML pages ],\n    htmldir=$with_htmldir,\t  htmldir=$httpddir/htdocs/hypermail)\nAC_SUBST(htmldir)\n\nAC_ARG_WITH(language, \n    [  --with-language=xx\t  two character language indicator [en] ],\n    language=$with_language,\t  language=en)\nAC_SUBST(language)\n\nAC_ARG_WITH(htmlsuffix, \n    [  --with-htmlsuffix=xx\t  two character language indicator [html] ],\n    htmlsuffix=$with_htmlsuffix,  htmlsuffix=html)\nAC_SUBST(htmlsuffix)\n\nAC_ARG_ENABLE(defaultindex,\n    [  --enable-defaultindex=type\tDefault index page type [thread] ],\n    [ defaultindex=$enableval ], [ defaultindex=\"thread\" ])\nAC_SUBST(defaultindex)\n\nAC_ARG_WITH(domainaddr, \n    [  --with-domainaddr=YOURDOMAIN\t  domain address of local domain ],\n    domainaddr=$with_domainaddr,  domainaddr=NONE)\nAC_SUBST(domainaddr)\n\ndnl ===========================================================================\ndnl Configure the subdirectories\ndnl\ndnl These are the subdirs that are compiled systematically\ndnl For subdirs that can be disabled thru configure options,\ndnl we configure them in a dedicated section near the test\ndnl ===========================================================================\nAC_DISABLE_OPTION_CHECKING\n\ndnl ===========================================================================\ndnl Checks headers\ndnl ===========================================================================\n\nAC_HEADER_STDC\n\nAC_CHECK_HEADERS(alloca.h arpa/inet.h ctype.h dirent.h errno.h \\\n\tfcntl.h locale.h malloc.h netdb.h netinet/in.h pwd.h stdarg.h \\\n\tstdio.h stdlib.h string.h sys/dir.h sys/param.h sys/socket.h \\\n\tsys/stat.h sys/time.h sys/types.h time.h unistd.h)\n\nAC_HEADER_STAT\nAC_HEADER_DIRENT\nAC_HEADER_TIME\n\ndnl ===========================================================================\ndnl Checks for library functions.\ndnl Check for typedefs, structures, and compiler characteristics.\ndnl ===========================================================================\n\nAC_STRUCT_TM\n\nAC_FUNC_STRFTIME\nAC_CHECK_FUNCS(mkdir strdup strstr strtol memcpy memset lstat strcasecmp \\\n               strcasestr getpwuid getopt snprintf memmove strerror)\n\nAC_TYPE_SIZE_T\n\nif test $ac_cv_func_snprintf != no; then\n    AC_DEFINE(HAVE_SNPRINTF)\nfi\n\n\ndnl gdbm checks\n\nAC_DEFUN([AC_TEMP_LDFLAGS],[\n  old_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$1 $LDFLAGS\"\n  $2\n  LDFLAGS=\"$old_LDFLAGS\"\n])\n\ndnl\ndnl AC_HMAIL_ONCE(namespace, variable, code)\ndnl\ndnl execute code, if variable is not set in namespace\ndnl\nAC_DEFUN([AC_HMAIL_ONCE],[\n  changequote({,})\n  unique=`echo $2|sed 's/[^a-zA-Z0-9]/_/g'`\n  changequote([,])\n  cmd=\"echo $ac_n \\\"\\$$1$unique$ac_c\\\"\"\n  if test -n \"$unique\" && test \"`eval $cmd`\" = \"\" ; then\n    eval \"$1$unique=set\"\n    $3\n  fi\n])\n\ndnl\ndnl AC_EXPAND_PATH(path, variable)\ndnl\ndnl expands path to an absolute path and assigns it to variable\ndnl\nAC_DEFUN([AC_EXPAND_PATH],[\n  if test -z \"$1\" || echo \"$1\" | grep '^/' >/dev/null ; then\n    $2=\"$1\"\n  else\n    changequote({,})\n    ep_dir=\"`echo $1|sed 's%/*[^/][^/]*/*$%%'`\"\n    changequote([,])\n    ep_realdir=\"`(cd \\\"$ep_dir\\\" && pwd)`\"\n    $2=\"$ep_realdir/`basename \\\"$1\\\"`\"\n  fi\n])\n\nAC_DEFUN([AC_ADD_INCLUDE],[\n  if test \"$1\" != \"/usr/include\"; then\n    AC_EXPAND_PATH($1, ai_p)\n    AC_HMAIL_ONCE(INCLUDEPATH, $ai_p, [\n      INCLUDES=\"$INCLUDES -I$ai_p\"\n    ])\n  fi\n])\n\ndnl\ndnl AC_ADD_LIBPATH(path[, shared-libadd])\ndnl\ndnl add a library to linkpath\ndnl\nAC_DEFUN([AC_ADD_LIBPATH],[\n  if test \"$1\" != \"/usr/lib\"; then\n    AC_EXPAND_PATH($1, ai_p)\n    AC_HMAIL_ONCE(LIBPATH, $ai_p, [\n      LDFLAGS=\"$LDFLAGS -L$ai_p\"\n    ])\n  fi\n])\n\ndnl\ndnl AC_ADD_LIBRARY_WITH_PATH(library, path[, shared-libadd])\ndnl\ndnl add a library to the link line and path to linkpath/runpath.\ndnl if shared-libadd is not empty and $ext_shared is yes,\ndnl shared-libadd will be assigned the library information\ndnl\nAC_DEFUN([AC_ADD_LIBRARY_WITH_PATH],[\nifelse($3,,[\n  if test -n \"$2\"; then\n    AC_ADD_LIBPATH($2)\n  fi\n  EXTRA_LIBS=\"$EXTRA_LIBS $1\" ],[\n    AC_ADD_LIBRARY_WITH_PATH($1,$2)\n  ])\n])\n\nAC_ARG_WITH(gdbm,\n   AS_HELP_STRING([--with-gdbm=[DIR]],\n                  [Include GDBM support]),\n   [ given_gdbm=$withval])\n\nif test \"$given_gdbm\" != \"no\"; then\n    for i in /usr/local /usr $withval; do\n      if test -f \"$i/include/gdbm.h\"; then\n        GDBM_INCLUDE=\"$i/include\"\n        THIS_PREFIX=\"$i\"\n      fi\n    done\n\n    unset ac_cv_lib_gdbm_gdbm_open\n    AC_TEMP_LDFLAGS(-L$THIS_PREFIX/lib,[\n       AC_CHECK_LIB(gdbm, gdbm_open, [GDBM_LIB=\"-lgdbm\"])\n    ])\n\n    if test \"$THIS_PREFIX\" != \"\" && test \"$THIS_PREFIX\" != \"/usr\"; then\n      THIS_LFLAGS=\"$THIS_PREFIX/lib\"\n    fi\nfi\n\nAC_MSG_CHECKING(for GDBM support)\n\nif test \"$GDBM_LIB\" = \"\" && test \"$given_gdbm\" != \"no\"; then\n  AC_CHECK_LIB(gdbm, gdbm_open,[AC_DEFINE(GDBM,1, [Whether you have GDBM]) DBM_TYPE=gdbm; GDBM_LIB=-lgdbm],\n     [DBM_TYPE=\"\"])\n  AC_MSG_CHECKING([gdbm library])\n  if test \"a$DBM_TYPE\" = a; then\n    AC_MSG_RESULT(none found)\n    AC_MSG_WARN(No gdbm library found - will limit a few features)\n  else\n    AC_MSG_RESULT($DBM_TYPE found)\n  fi\nelse\n    AC_MSG_RESULT(no)\nfi\n\nif test \"$GDBM_LIB\" = \"-lgdbm\" && test \"$GDBM_INCLUDE\" = \"\"; then\n  AC_CHECK_HEADER(gdbm.h, [ GDBM_INCLUDE=\"\" ], [ \n      AC_MSG_RESULT(Try /usr/local/include/gdbm.h)\n      AC_CHECK_HEADER(/usr/local/include/gdbm.h, [ GDBM_INCLUDE=\"-I/usr/local/include\" ],[\n        AC_MSG_RESULT(Try /opt/local/include/gdbm.h)\n        AC_CHECK_HEADER(/opt/local/include/gdbm.h, [ GDBM_INCLUDE=\"-I/opt/local/include\" ],[\n          dnl if in /usr/pkg/include, do not add anything.  See above.\n          AC_MSG_RESULT(Try /usr/pkg/include/gdbm.h)\n          AC_CHECK_HEADER(/usr/pkg/include/gdbm.h, [ GDBM_INCLUDE=\"\" ],[\n            AC_MSG_RESULT([Giving up - You need to install gdbm.h somewhere])\n            exit\n          ])\n        ])\n      ])  \n    ])\nfi\n\nif test -n \"$GDBM_LIB\"; then\n    AC_ADD_INCLUDE($GDBM_INCLUDE)\n    AC_DEFINE(HAVE_GDBM_H)\n    EXTRA_LIBS=\"$EXTRA_LIBS $GDBM_LIB\"\nfi\n\n\ndnl\ndnl iconv check\ndnl\n\nAC_ARG_ENABLE(i18n, [  --disable-i18n           Disable I18N support], [given_iconv=$enableval])\nif test \"$given_iconv\" = \"no\"; then\n  echo \"disabled I18N support.\"\nelse\n  AC_CHECK_FUNCS(iconv)\n  AC_CHECK_HEADERS(iconv.h)\nfi\n\ndnl\ndnl libtrio: select whether to use the system or the bundled libtrio\ndnl\n\ndnl system libtrio\nAC_ARG_ENABLE([system_libtrio], \n\t      AS_HELP_STRING([--enable-system-libtrio],\n                             [Use the system libtrio instead of compiling the bundled one]))\n\nif test \"${enable_system_libtrio}\" = yes; then\n  AC_MSG_NOTICE(checking for system libtrio)\n  AC_SEARCH_LIBS([trio_printf], [trio], [],\n                 [AC_MSG_ERROR([unable to find trio_copy() function])\n                 ])\n  AC_CHECK_HEADER(trio.h, [],\n                  [AC_MSG_ERROR([unable to find trio.h header file (dev version not installed?)])\n\t\t  ])\nelse\n  AC_MSG_NOTICE([using bundled libtrio])\n  APR_ADDTO(INCLUDES, \"[-Itrio]\")\n  APR_ADDTO(LDFLAGS, \"[-Ltrio]\")\n  APR_ADDTO(CPPFLAGS, \"[-DTRIO_MINIMAL]\")\n  TRIO_DEP=\"trio/libtrio.a\"\n  APR_SUBDIR_CONFIG([src/trio],\n                      [CFLAGS=[-DTRIO_MINIMAL]],\n  \t\t      [--with-pcre=*|\\'--with-pcre=*])\n  AC_SUBST([TRIO_DEP])\nfi\n\ndnl\ndnl PCRE: select whether to use an external, the system, or the bundled PCRE lib\ndnl partially borrowed from Apache's configure.in\ndnl\n\ndnl bundled pcre lib\nAC_ARG_ENABLE(bundled_pcre, \n\t    AS_HELP_STRING([--enable-bundled-pcre],\n                           [Force the use of the bundled PCRE library instead of the system one]))\n\ndnl external PCRE lib\nAC_ARG_WITH(external_pcre, \n\t    AS_HELP_STRING([--with-external-pcre=PATH_TO_PCRE_DIR|PATH_TO_PCRE_CONFIG_SCRIPT],\n                           [Use an external PCRE library instead of the system or the bundled one]))\n\nAC_MSG_NOTICE(checking for PCRE regular expressions library)\n\ndnl if user selected the bundled one, give it priority over the bundled one\nif test ! -z ${enable_bundled_pcre}; then\n   with_external_pcre=\"\"\nfi   \n\ncase $with_external_pcre in\n /*) AC_MSG_NOTICE(--with-external-pcre => checking for an external libpcre)\n     AC_MSG_CHECKING(for pcre-config)\n     if test -d \"$with_external_pcre\" && test -x \"$with_external_pcre/pcre-config\"; then\n       PCRE_CONFIG=$with_external_pcre/pcre-config\n     elif test -x \"$with_external_pcre\"; then\n       PCRE_CONFIG=$with_external_pcre\n     else\n       AC_MSG_RESULT(no)\n       AC_MSG_ERROR(${PCRE_CONFIG} does not point to a directory or pcre-config)\n     fi\n     AC_MSG_RESULT(${PCRE_CONFIG})\n     \n     AC_MSG_CHECKING(for pcre version equal or greater than ${PCRE_MIN_VERSION})\n     if test -f \"${PCRE_CONFIG}\" && test -x \"${PCRE_CONFIG}\"; then\n        PCRE_VERSION=$(${PCRE_CONFIG} --version)\n        AS_VERSION_COMPARE(\"${PCRE_VERSION}\", \"${PCRE_MIN_VERSION}\",\n                           [PCRE_CONFIG=false], [], [])\n        if test \"${PCRE_CONFIG}\" != false; then\n           AC_MSG_RESULT(yes)\n        else\n           AC_MSG_RESULT(no)\n           AC_MSG_ERROR(the PCRE library version must be equal or greater than ${PCRE_MIN_VERSION})\n        fi\n     else\n        AC_MSG_RESULT(no)\n        AC_MSG_ERROR(${PCRE_CONFIG} does not point to a script)\n     fi\n     ;;\n     \n  *) PCRE_CONFIG=false\n     ;;\nesac\n\ndnl nope; do we have a system PCRE lib?\nif test -z \"${enable_bundled_pcre}\" && test -z \"${PCRE_CONFIG}\" -o \"${PCRE_CONFIG}\" = \"false\"; then\n   AC_MSG_NOTICE(checking for a system libpcre)\n   AC_PATH_PROG([PCRE_CONFIG], [pcre-config], [])\n   if test ! -z \"${PCRE_CONFIG}\"; then\n      AC_MSG_CHECKING(checking pcre version equal or greater than ${PCRE_MIN_VERSION})\n      PCRE_VERSION=$(${PCRE_CONFIG} --version)\n      AS_VERSION_COMPARE(\"${PCRE_VERSION}\", \"${PCRE_MIN_VERSION}\",\n                         [PCRE_CONFIG=false], [], [])\n      if test \"${PCRE_CONFIG}\" != false; then\n         AC_MSG_RESULT(yes)\n      else\n         AC_MSG_RESULT(no)\n      fi\n   else\n      PCRE_CONFIG=false\n   fi\nfi\n\ndnl found a library, do we have compilation headers?\nif test \"${PCRE_CONFIG}\" != false; then\n  PCRE_PATH=$(${PCRE_CONFIG} --prefix)\n  AC_CHECK_HEADER([\"$PCRE_PATH/include/pcre.h\"], [ ],[PCRE_CONFIG=false])\nfi\n\ndnl PCRE conclusion\nif test \"$PCRE_CONFIG\" != \"false\"; then\n  AC_MSG_NOTICE([using system PCRE regular expressions library])\n  APR_ADDTO(CFLAGS, [`$PCRE_CONFIG --cflags`])\n  APR_ADDTO(LIBS, [`$PCRE_CONFIG --libs`])\nelse\n  AC_MSG_NOTICE([using bundled PCRE regular expressions library])\n  APR_ADDTO(INCLUDES, [-Ipcre])\n  APR_ADDTO(LDFLAGS, \"[-Lpcre/.libs]\")\n  PCRE_DEP=\"pcre/.libs/libpcre.a\"\n  APR_SUBDIR_CONFIG([src/pcre], \n                    [],\n  \t\t    [--with-pcre=*|\\'--with-pcre=*])\n  AC_SUBST([PCRE_DEP])\nfi\n\ndnl\ndnl The FNV hash library used for the nonsequential filenames\ndnl\n\nAC_MSG_CHECKING([whether to use fnv hash library for non-sequential filenames])\nAC_ARG_ENABLE(libfnv, \n     [\t    AS_HELP_STRING([--enable-libfnv],\n                           [use the fnv hash library for generating non-sequential filenames [no]])\n     ],\n     [ given_libfnv=$enableval ])\n     \nif test \"$given_libfnv\" != \"yes\"; then\n  AC_MSG_RESULT([no])\nelse\n  AC_MSG_RESULT([yes])\n  AC_DEFINE([HAVE_LIBFNV])\n  APR_ADDTO(INCLUDES, [-Ifnv])\n  dnl APR_ADDTO(LDFLAGS, \"[-Lfnv]\")\n  AC_ADD_LIBRARY_WITH_PATH([-lfnv],[src/fnv])\n  FNV_DEP=\"fnv/libfnv.a\"\n  APR_SUBDIR_CONFIG([src/fnv])\nfi\nAC_SUBST(FNV_DEP)\n\n\ndnl ===========================================================================\ndnl Checks for libraries.\ndnl nsl socket lib?\ndnl ===========================================================================\n\nUSENSL=no\nAC_CHECK_LIB(socket,gethostbyaddr,result=yes,result=no)\nif test $result = yes; then\n        LIBS=\"$LIBS -lsocket\"\nelse\n        AC_CHECK_LIB(socket,gethostbyaddr,result=yes,result=no,-lnsl)\n        if test $result = yes; then\n                LIBS = \"$LIBS -lsocket -lnsl\"\n                USENSL=yes\n        else\n                AC_CHECK_LIB(socket,inet_addr,result=yes,result=no)\n                if test $result = yes; then\n                        LIBS=\"$LIBS -lsocket\"\n                else\n                        AC_CHECK_LIB(socket,inet_addr,result=yes,result=no,-lnsl)\n                        if test $result = yes; then\n                                LIBS=\"$LIBS -lsocket -lnsl\"\n                                USENSL=yes\n                        fi\n                fi\n        fi\nfi\nif test $USENSL != yes; then\n        AC_CHECK_LIB(nsl,inet_addr,result=yes,result=no)\n        if test $result = yes; then\n                LIBS=\"$LIBS -lnsl\"\n        fi\nfi\n\ndnl ===========================================================================\ndnl Makefile variable substitution \ndnl ===========================================================================\n\nAC_SUBST(HAVE_MEMMOVE)\nAC_SUBST(HAVE_STRERROR)\nAC_SUBST(LDFLAGS)\nAC_SUBST(LIBS)\nAC_SUBST(EXTRA_LIBS)\nAC_SUBST(INCLUDES)\n\nAC_CONFIG_FILES([Makefile archive/Makefile docs/Makefile libcgi/Makefile src/Makefile tests/testhm src/defaults.h])\nAC_OUTPUT\n\n"
  },
  {
    "path": "contrib/canonicalize.pl",
    "content": "#!/usr/bin/perl\n#\n# Author: Scott Rose <srose@direct.ca>\n#\n# $Id$\n#\n# Comparing two archives is complicated by the fact that each message is\n# marked by the time at which it's archived. Attached is a script that\n# standardizes that date, if weakly, useful for such comparisons.\n# \n# NOTE:\n#     - Must be in the html storage directory to use this.\n#     - If your files are stored with a different suffix than .html\n#       you will need to correct it below.\n#     - If the date is really important to you, fix this script and\n#       rebaseline it. \n#\n\nfor $file (glob '[0-9][0-9][0-9][0-9].html') {\n    open F, \"$file\" or die;\n    @lines = <F>;\n    close F;\n    open F, \">$file\" or die;\n    $did = 0;\n    for (@lines) {\n\tif(m#^: <EM>\\w{3} \\w{3}\\s+\\d{1,2} \\d{4} - \\d{2}:\\d{2}:\\d{2} \\w{3}</EM>$#) {\n\t    die 'oops' if($did);\n\t    print F \": <EM>Sat Oct 16 1999 - 06:00:00 PDT</EM>\\n\";\n\t    $did++;\n\t}\n\telse {\n\t    print F;\n\t}\n    }\n    die \"Oops\" unless($did);\n    close F;\n    print \"$file\\n\"\n}\n\n\n"
  },
  {
    "path": "contrib/cron_hypermail",
    "content": "#!/usr/bin/perl\n\n=h1\nThis perl script is used for calling hypermail via cron.\n\nThis script checks to see if an email has arrived in the mailbox. If so, hypermail is called on that mailbox. If not, that mailbox is not processed.\n\nIt sends errors and reports to an email address.\n\nIn my system, I have about 25 email broadcast lists, implemented with sendmail's aliases files. For every list, I created a user account named \"ax\" (for archive) prepended to the list name, e.g., axmylist. The account is in group \"mail\" so that sendmail can operate on it. In the file pointed to by the aliases file, there is an email address of axmylist@domain.com. In virtusertable, axmylist@domain.com is directed to axmylist, which ends up in /var/spool/mail/axmylist.\n\nhypermail is used with a configuration file.\n\nAnyone is welcome to use this script and modify it. It is not in a polished form, and it needs configuration and customizing. However, if it useful to anyone, they are welcome to use it. It is not copyrighted, and the original author is in no way responsible for whatever results you obtain from it. And the author remains anonymous.\n\nversion 1.0\nFeb 27, 2001\nusage: cron will be told to call this script every hour\nowner: domainmail in group mail\n=cut\n\nuse strict;\n\n# <>--------- CONFIGURE ---------<>\nmy $do_it = 1; # 0 will not actually call hypermail -- for testing. 1 will call hypermail.\n\nmy $webmaster = \"me\\@somewhere.net\";\nmy $production_site = 'cron_hypermail domain';\nmy $cf_mail_directive\t= '/usr/lib/sendmail -oi -t';\n\nmy %list_info = (\n'list1'=>{'label'=>'My List','bdcast_list_page'=>'index'},\n'list2'=>{'label'=>'My Second List','bdcast_list_page'=>'list2'},\n'list3'=>{'label'=>'My Third List','bdcast_list_page'=>'list3'},\n'list4'=>{'label'=>'My Fourth List','bdcast_list_page'=>'list4'},\n'list5'=>{'label'=>'My Fifth List','bdcast_list_page'=>'list5'},\n);\n\nmy $path_to_mailbox = '/var/spool/mail';\nmy $full_path_to_config_file = '/home/www/domain/members_only/email_archives/call_hypermail/hmrc.domain';\nmy $complete_text = '';\n\n# will add the specific directory below, i.e., the mailbox name\nmy $path_to_html_archive = '/home/www/domain/members_only/email_archives';\n\n# <>--------- END CONFIGURE ---------<>\nBEGIN {\n\t$SIG{__DIE__} = \\&Error_Message_die;\n\t$SIG{__WARN__} = \\&Error_Message_warn;\n}\n\nif ($do_it) {\n\t$complete_text .= \"EXECUTING THE HYPERMAIL COMMANDS, NOT IN TEST MODE\\n\";\n}\nelse {\n\t$complete_text .= \"TEST MODE, NOT EXECUTING THE HYPERMAIL COMMANDS\\n\";\n}\n\n# <>--------- GET MAILBOX NAME AND MODIFY VARIABLES ---------<>\nmy $count = 0;\nforeach my $mboxname (keys %list_info) {\n\t# Has the mailbox received a message that needs to be archived?\n\t# Is the mailbox younger than the archive index page?\n\t# If so, run hypermail on that mailbox and archive\n\t\n\t$count++;\n\t$complete_text .= \"______________________________\\n********** $count. $mboxname **********\\n\";\n\t\n\t$complete_text .= \"\\$path_to_mailbox/ax\\$mboxname = $path_to_mailbox/ax$mboxname\\n\";\n\t\n\t$complete_text .= \"\\$path_to_html_archive/\\$mboxname/index.html = $path_to_html_archive/$mboxname/index.html\\n\";\n\t\n\t$complete_text .= \"M of mbox = \";\n\t$complete_text .= (-M \"$path_to_mailbox/ax$mboxname\");\n\t$complete_text .= \"\\n\";\n\t\n\t$complete_text .= \"M of htmlindex = \";\n\t$complete_text .= (-M \"$path_to_html_archive/$mboxname/index.html\");\n\t$complete_text .= \"\\n\";\n\t\n\t# What if the mailbox does not exist?\n\tunless (-e \"$path_to_mailbox/ax$mboxname\") {\n\t\t$complete_text .= \"mailbox does not exist, process next mbox name: $path_to_mailbox/ax$mboxname\\n\";\n\t\tnext;\n\t}\n\t\n\t# the mailbox exists\n\t# is the mailbox younger than its html index page? or an index.html does not yet exist\n\tif ( \n\t\t( (-M \"$path_to_mailbox/ax$mboxname\") < (-M \"$path_to_html_archive/$mboxname/index.html\") )\n\t\tor\n\t\t(!(-e \"$path_to_html_archive/$mboxname/index.html\"))\n\t\t) {\n\t\t\n\t\tmy $list_address = \"$mboxname\\@domain.com\";\n\t\tmy $axmboxname = 'ax' . $mboxname;\n\t\t\n\t\t# check for debug mode\n\t\tif ($do_it) {\n\t\t\t# errors are normally sent to STDERR, and hence not captured by $x\n\t\t\t# so do the redirection, 2>&1\n\n\t\t\tmy $x = `/usr/local/bin/hypermail -m $path_to_mailbox/$axmboxname -c $full_path_to_config_file -d $path_to_html_archive/$mboxname -l \"$list_info{$mboxname}{label}\" -b \"../../email_lists/$list_info{$mboxname}{bdcast_list_page}\\.html\" -n $list_address 2>&1`;\n\t\t\t\n\t\t\t# will be blank for successful operation\n\t\t\t$complete_text .= \"\\$x = $x\\n\";\n\t\t}\n\t\telse {\n\t\t\tmy $y = <<EOP\n/usr/local/bin/hypermail -m $path_to_mailbox/$axmboxname -c $full_path_to_config_file -d $path_to_html_archive/$mboxname -l \"$list_info{$mboxname}{label}\" -b \"../../email_lists/$list_info{$mboxname}{bdcast_list_page}\\.html\" -n $list_address 2>&1\nEOP\n;\t\n\t\t\t$complete_text .= \"\\$y = $y\\n\";\n\t\t}\n\t} # end of if -M < -M\n\t\n} # end of foreach mailbox\n\n# while running under cron, comment this out\n#print $complete_text;\n\n# send a report every time it runs (until you are confident it runs well)\nopen(MAIL, \"| $cf_mail_directive\");\nprint MAIL \"Subject: domain cron_hypermail ran\\n\";\nprint MAIL \"From: domain cron_hypermail\\n\";\nprint MAIL \"To: $webmaster\\n\\n\";\nprint MAIL \"The script to call hypermail ran \\n\\n\";\nprint MAIL \"$complete_text\\n\";\nclose(MAIL);\n\nexit;\n\n#############################################################\n#                        Error_Message\n#############################################################\nsub Error_Message_die {\n\tmy $message = \"@_\";\n\topen(MAIL, \"| $cf_mail_directive\");\n    print MAIL \"Subject: RED ALERT! Runtime error at $production_site\\n\";\n    print MAIL \"From: $production_site\\n\";\n    print MAIL \"To: $webmaster\\n\\n\";\n    print MAIL \"Error at $production_site. This message was automatically produced by the program because the following error occured.\\n\\n$message\\n\\nComplete Debug Text:\\n$complete_text\";\n\tclose(MAIL);\n\t\n\texit;\n}\nsub Error_Message_warn {\n\tmy $message = \"@_\";\n\topen(MAIL, \"| $cf_mail_directive\");\n    print MAIL \"Subject: WARNING! Non-fatal error at $production_site\\n\";\n    print MAIL \"From: $production_site\\n\";\n    print MAIL \"To: $webmaster\\n\\n\";\n    print MAIL \"Error at $production_site. This message was automatically produced by the program because the following non-fatal error occured.\\n\\n$message\\n\\nComplete Debug Text:\\n$complete_text\";\n\tclose(MAIL);\n}\n\n"
  },
  {
    "path": "contrib/fixhtime.pl",
    "content": "#!/usr/bin/perl\n\nrequire 5.000;\nrequire Exporter;\nuse Carp;\n\n#\n# This program is intended to modify the dates on files in a Hypermail\n# archive to be the times when the messages were sent rather than when\n# Hypermail last did something to them.\n#\n# The recommended usage is to cd to the archive directory and run:\n# fixhtime.pl [0-9]???.html\n#\n# If it doesn't do anything, first check that you have write permission on\n# the files.\n#\n# I've tested it under Linux. It should work on virtually any Unix system.\n# It might work on other operating systems.\n#\n# Send bug fixes or enhancements to pcm@rahul.net.\n# The latest version will probably be in the contrib/ directory of the latest\n# Hypermail distribution (http://sourceforge.net/projects/hypermail/\n# or www.hypermail.org).\n#\n\n# This program is free software; you can redistribute it and/or modify it\n# under the same terms as Perl itself.\n#\n# Some code below is duplicated from Time::Local.pm. For some strange reason,\n# having it here rather than calling the Time::Local module avoids an infinite\n# loop on some systems (specifically, on a Linux box with Perl 5.005_03\n# and a 2.0.25 kernel).\n#\n\nBEGIN {\n    $SEC  = 1;\n    $MIN  = 60 * $SEC;\n    $HR   = 60 * $MIN;\n    $DAY  = 24 * $HR;\n    $epoch = (localtime(2*$DAY))[5];\t# Allow for bugs near localtime == 0.\n\n    $YearFix = ((gmtime(946684800))[5] == 100) ? 100 : 0;\n\n    my $t = time;\n    my @lt = localtime($t);\n    my @gt = gmtime($t);\n\n    $tzsec = ($gt[1] - $lt[1]) * $MIN + ($gt[2] - $lt[2]) * $HR;\n\n    my($lday,$gday) = ($lt[7],$gt[7]);\n    if($lt[5] > $gt[5]) {\n\t$tzsec -= $DAY;\n    }\n    elsif($gt[5] > $lt[5]) {\n\t$tzsec += $DAY;\n    }\n    else {\n\t$tzsec += ($gt[7] - $lt[7]) * $DAY;\n    }\n\n  $tzsec += $HR if($lt[8]);\n}\n\nsub timegm {\n    $ym = pack(C2, @_[5,4]);\n    $cheat = $cheat{$ym} || &cheat;\n    return -1 if $cheat<0 and $^O ne 'VMS';\n    $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAY;\n}\n\nsub timelocal {\n    $time = &timegm + $tzsec;\n    return -1 if $cheat<0 and $^O ne 'VMS';\n    @test = localtime($time);\n    $time -= $HR if $test[2] != $_[2];\n    $time;\n}\n\nsub cheat {\n    $year = $_[5];\n    $year -= 1900\n    \tif $year > 1900;\n    $month = $_[4];\n    croak \"Month '$month' out of range 0..11\"\tif $month > 11 || $month < 0;\n    croak \"Day '$_[3]' out of range 1..31\"\tif $_[3] > 31 || $_[3] < 1;\n    croak \"Hour '$_[2]' out of range 0..23\"\tif $_[2] > 23 || $_[2] < 0;\n    croak \"Minute '$_[1]' out of range 0..59\"\tif $_[1] > 59 || $_[1] < 0;\n    croak \"Second '$_[0]' out of range 0..59\"\tif $_[0] > 59 || $_[0] < 0;\n    $guess = $^T;\n    @g = gmtime($guess);\n    $year += $YearFix if $year < $epoch;\n    $lastguess = \"\";\n    while ($diff = $year - $g[5]) {\n\t$guess += $diff * (363 * $DAY);\n\t@g = gmtime($guess);\n\tif (($thisguess = \"@g\") eq $lastguess){\n\t    return -1; #date beyond this machine's integer limit\n\t}\n\t$lastguess = $thisguess;\n    }\n    while ($diff = $month - $g[4]) {\n\t$guess += $diff * (27 * $DAY);\n\t@g = gmtime($guess);\n\tif (($thisguess = \"@g\") eq $lastguess){\n\t    return -1; #date beyond this machine's integer limit\n\t}\n\t$lastguess = $thisguess;\n    }\n    @gfake = gmtime($guess-1); #still being sceptic\n    if (\"@gfake\" eq $lastguess){\n\treturn -1; #date beyond this machine's integer limit\n    }\n    $g[3]--;\n    $guess -= $g[0] * $SEC + $g[1] * $MIN + $g[2] * $HR + $g[3] * $DAY;\n    $cheat{$ym} = $guess;\n}\n\n\n$mon{\"Jan\"} = 0;\n$mon{\"Feb\"} = 1;\n$mon{\"Mar\"} = 2;\n$mon{\"Apr\"} = 3;\n$mon{\"May\"} = 4;\n$mon{\"Jun\"} = 5;\n$mon{\"Jul\"} = 6;\n$mon{\"Aug\"} = 7;\n$mon{\"Sep\"} = 8;\n$mon{\"Oct\"} = 9;\n$mon{\"Nov\"} = 10;\n$mon{\"Dec\"} = 11;\n\nforeach $file (@ARGV)\n{\n    open(FD,$file) || warn(\"can't open $file\");\n    while($line1 = <FD>)\n    {\n\tif($line1 =~ /^\\<\\!\\-\\- isosent\\=\\\"(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)/)\n\t{\n\t    $year = $1;\n\t    $month = $2 - 1;\n\t    $day = $3;\n\t    $hour = $4;\n\t    $min = $5;\n\t    $sec = $6;\n\t    $date = timegm($sec,$min,$hour,$day,$month,$year);\n\t    utime $date,$date,$file;\n\t    print $line1;\n\t    last;\n\t}\n\tif($line1 =~ /(\\d+)\\s+(\\S+)\\s+(\\d+)\\s+(\\d+):(\\d+):(\\d+)[\\s\\\"]+(\\S+)/)\n\t{\n\t    $day = $1;\n\t    $monthname = $2;\n\t    $year = $3;\n\t    $hour = $4;\n\t    $min = $5;\n\t    $sec = $6;\n\t    $tzone = $7;\n\t    $date = timegm($sec,$min,$hour,$day,$mon{$monthname},$year);\n\t    $tzone /= 100 if(abs($tzone) >= 100);\n\t    $date -= $tzone*60*60;\n\t    utime $date,$date,$file;\n\t    last;\n\t}\n    }\n}\n"
  },
  {
    "path": "contrib/hoaf-28/README",
    "content": "Date: Tue, 30 Nov 1999 02:18:32 -0600\nFrom: Bernhard Reiter <bernhard@uwm.edu>\nSubject: XML indexer, experimental, patch+python script\n\nHello hypermailers,\n\nI know I shouldn't have done this, \nbut I learned about python's XML handling in the process. \nThis is my first attempt in XML file mangeling, so bear with me.\n\n\nI was always talking and thinking about how to get montly archives done\nand not only done, but the index files created, too:\n\n\t\tThe problem:\n\t\t------------\n\nHypermail in combination with the archive scripts, creates\na bunch of directories for each year and each month when mails come in.\n\n\ta) How do you make a top page, \n\tlinking all the scattered index files?\n\n\tb) Subproblem: If one mail comes in, \n\tdo you really want to rebuild the complete index overviewfiles?\n\tOf course not.\n\n\tc) What if I want my top index page to have the number of mails \n\tgrouped by week or so. :) (Hi egroups.)\n\n\nSolution: A python script strangles the problem.\n\nPart 1: I patched hypermail so that it creates an archive overview file \n\tcomplying with the haof.dtd in each directory it operates in.\n\nOh, back to Part 0:\n\tWrote a dtd for the Hypermail Archive Overview Format (hoaf).\n\nPart 2a: Wrote a little python module, which creates a HTML snipplet from this\n\toverviewfile and leaves it in the directory above. But only,\n\tif the overviewfile exists and is newer as the the snipplet.\n\nPart 2b: Wrote another python script, which runs through a directory,\n\tand checks each year and month and runs the module from 2a a\n\tcouple of times.\n\nResults attached. \n\nLeft for the interested reader: Beautify the output.\n\nInteresting research topics: \n* Only the mail references are missing in the \n  hoaf, otherwise threading could be done on that level.\n* Well we could write this data into a little database. http://www.dbxml.org/ ?\n Or Postgres or MySql-GPL?\n\nEnjoy,\n\tBernhard\n\nps:This contribution to hypermail shall be free software under the GPL.\nI contribute it to hypermail as free software.  My hopes are that hypermail \nstays under GPL, but I think I don't want to complicate things of you choose \nanother free software license, so you have permission to publish it under \nthis, too.\n\n========================\nDate: Tue, 7 Dec 1999 00:53:32 -0600\nFrom: Bernhard Reiter <bernhard@climate2.geog.uwm.edu>\nTo: hypermail@hypermail.org\nSubject: python index overview generator and xml patch\nMessage-ID: <19991207005332.A1465@climate2.geog.uwm.edu>\n\nNew Version of my nasty python script to create new archive\noverview files.  Includes a hypermail to write a xml format file\nwith the overview information.\n\nI run it from procmail, like:\n\nCOLLECT_SNIPPLETS_SCRIPT=/usr/local/lib/site-python/collect_snipplets.py\n\n:0:.polis\n*X-Mailing-List: <polis@(genba\\.a2e\\.de|ffii\\.org)>\n| polis-mail ; $COLLECT_SNIPPLETS_SCRIPT /var/www/mail-archive/polis\n\npolis-mail is the hypermail wrapper from archive/.\n\n\tBernhard\n"
  },
  {
    "path": "contrib/hoaf-28/collect_snipplets.py",
    "content": "#!/usr/bin/env python\n\"\"\" Runs over the File system and builds a .html from snipplets.  v%(version)s\n\nUSAGE %(progname)s directory [ indexfilename ]\n\nThe argument has to be a directory. The html will be left in the\ndirectory under index.html unless a second argument is given.\nThe indexfilename is relative to the directory, \"-\" for stdout is recognised.\n\ndirectory has to contain top_html.hdr and footer_html.hdr.\n\"\"\"\n__version__=0.3\n\n#29.11.1999 initial Bernhard Reiter\n# 6.12.1999 Bernhard\n#   fix: table row not created, if no snipplet there\n#   added: second argument\n#25.12.1999 Bernhard\n#   cleanup: extracted code into new functions add_header(), add_footer()\n#20. 7.2002 Bernhard\n#   finished the cleanup\n\nimport sys\nimport os\nimport re\nimport create_archive_snipplet\n\ntopdirre= re.compile (r\"^[12]\\d{3,3}$\")\n\nmonths=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]\n\ndef add_header(outputfile,path):\n    \"\"\" Read and dump header file use standard html header.\"\"\"\n    fname=os.path.join(path,\"top_html.hdr\")\n    if os.path.isfile(fname):\n        f=open(fname,\"r\")\n        outputfile.writelines(f.readlines())\n        f.close()\n    else:\n        outputfile.write(\"<html>\\n<body>\\n\")\n        \n\ndef add_footer(outputfile,path):\n    \"\"\" Read and dumb footer file or write standard html footer. \"\"\"\n    fname=os.path.join(path,\"footer_html.hdr\")\n    if os.path.isfile(fname):\n        f=open(fname,\"r\")\n        outputfile.writelines(f.readlines())\n        f.close()\n    else:\n        outputfile.write(\"</body>\\n</html>\\n\")\n\n\ndef main(argv):\n\n    # check arguments\n    if (not (len(argv)>=2 and len(argv)<=3)) or not os.path.isdir(argv[1]):\n        sys.stderr.write(__doc__ % \\\n            {\"version\": __version__, \"progname\": argv[0]} )\n        sys.exit(1)\n\n    # set default outputfilename\n    path=os.path.normpath(argv[1])\n    if len(argv)==3:\n        outputfilename=argv[2]\n    else:\n        outputfilename=\"index.html\"\n\n\n    # use stdout for \"-\" \n    if outputfilename==\"-\":\n        outputfile=sys.stdout\n    else:\n        outputfilename=os.path.join(path,outputfilename)\n        outputfile=open(outputfilename,\"w\")\n\n    write=outputfile.write\n    writelines=outputfile.writelines\n\n    add_header(outputfile,path)\n\n    # get the real work done\n    dirlist=os.listdir(path)\n\n    def iswantedDirin(x,path=path):\n        \"\"\"Check if is directory and looks like an archive name.\"\"\"\n        return  os.path.isdir(os.path.join(path,x)) and topdirre.match(x)\n\n\n    directories=filter(iswantedDirin, dirlist)\n    if not len(directories):\n        sys.exit(\"Found no year directories to work on!\\n\")\n\n    directories.sort()\n    directories.reverse()\n\n    for dir in directories:\n\n        write(\"<h2>%s</h2>\\n\\n\" % dir)\n\n        write(\"<table border=1>\\n\")\n        write(\"<tr>\" + \\\n                    \"<th>Month</th> \" + \\\n                    \"<th colspan=4 align=center>Index Files</a></th>\"+\\\n                    \"<th align=right>Mails</th>\"+\\\n              \"</tr>\\n\")\n\n        subpath=os.path.join(path,dir)\n        dirlist=os.listdir(subpath)\n\n        months.reverse()\n        for month in months:\n            if month in dirlist and os.path.isdir(os.path.join(subpath,month)):\n\n                monthdir = os.path.join(subpath,month)\n                create_archive_snipplet.main((argv[0],monthdir,\"2\"))\n                snippletfilename=os.path.join(subpath,month+\"_html.blk\")\n\n                if os.path.isfile(snippletfilename):\n                    write(\"<tr>\\n\")\n                    f=open(snippletfilename,\"r\")\n                    writelines(f.readlines())\n                    write(\"</tr>\\n\")\n\n        write(\"</table>\\n\")\n        \n\n    add_footer(outputfile,path)\n\n\n    if outputfile != sys.stdout:\n        outputfile.close()\n\n\nif __name__ ==\"__main__\":\n    main(sys.argv)\n"
  },
  {
    "path": "contrib/hoaf-28/create_archive_snipplet.py",
    "content": "#!/usr/bin/env python\n\"\"\" Creates a html sniplet foor hypermail directories. v%(version)s\n\nTakes one directory name as argument, writes will create snipplet in\ncurrent directory, only if the overviewfile has changed after the snipplet.\n\nUSAGE %(progname)s directory_with_path number\n\n\"number\" speficies how many directory levels of the path should be left\nin the snipplet. 1 mean one and you can have more, if you want up to a limit.\n\nThe snipplet will be left in one directory over the given one.\n\n\nThis module requires the xml.sax module to be installed.\nPer default is also uses the validating parser of xmlproc, see code \nto disable that. Search for \"xmlproc\".\n\nIn version 0.1 some code insite of this module is disabled.\n\"\"\"\n__version__=0.2\n# 29.11.1999 initial Bernhard Reiter <bernhard@ffii.org>\n#  6.12.1999 Bernhard\n#   added replacement for os.path.getmtime(), because debian's python package\n#   is still 1.5.1\n\nfrom xml.sax import saxexts, saxlib, saxutils\nfrom xml.sax.drivers import drv_xmlproc_val # for the xmlproc parsers\nimport sys,urllib\nimport os\n\ntry:\n    getmtime=os.path.getmtime\nexcept AttributeError, x:\n    import stat\n    def getmtime(file):\n        statinfo=os.stat(file)\n        return statinfo[stat.ST_MTIME]\n        \n    \n    \n\noverviewfilename=\"archive_overview.haof\" \n\nclass Mail:\n    \"\"\" Saves info about one mail message. \"\"\"\n    def __init__(self):\n        subject=\"\"\n        fromname=\"\"\n        fromemail=\"\"\n        date=\"\" \n        messageid=\"\" \n        filename=\"\"\n\nclass SimpleDocHandler(saxlib.DocumentHandler):\n\n    def __init__(self):\n        self.indices={}\n        self.maillist=[]\n        self.mode=0\n        self.current_name=\"\"\n        self.current_mail=None\n        self.in_indices=0\n\n    def startElement(self, name, attrs):\n        if name==\"mail\":\n            self.current_mail=Mail()\n        elif name==\"indices\":\n            self.in_indices=1\n        self.current_name=name\n        \n#        sys.stdout.write( name + \"starts..\" )\n#        for attr in attrs:\n#            print \"A %s %s\" %(attr,attrs[attr])\n#            print \"(\"+name\n\n    def endElement(self, name):\n        #print name + \"ends.\"\n        if name==\"mail\":\n            self.maillist.append(self.current_mail)\n        if name==\"indices\":\n            self.in_indices=0\n\n\n    def characters(self, ch, start,length):\n        #print \" found \" + self.current_name + \": \" + ch[start:start+length]\n        if self.current_name==\"subject\":\n            self.current_mail.subject=ch[start:start+length]\n        elif self.current_name==\"date\":\n            self.current_mail.date=ch[start:start+length]\n##disable some of the next lines in v0.1 just for speed.\n#        elif self.current_name==\"fromname\":\n#            self.current_mail.fromname=ch[start:start+length]\n#        elif self.current_name==\"fromemail\":\n#            self.current_mail.fromemail=ch[start:start+length]\n#        elif self.current_name==\"message-id\":\n#            self.current_mail.messageid=ch[start:start+length]\n#        elif self.current_name==\"file\":\n#            self.current_mail.filename=ch[start:start+length]\n        elif self.in_indices:\n            self.indices[self.current_name]=ch[start:start+length]\n                                                                             \n\n    \n\ndef main(argv):\n\n    # test the arguments\n    path=os.path.normpath(argv[1])\n    if len(argv)!=3 or not os.path.isdir(path) \\\n            or int(argv[2]) not in range(1,10):\n        sys.stderr.write(__doc__ % \\\n            {\"version\": __version__, \"progname\": argv[0]} )\n        sys.exit(1)\n\n    filename=os.path.join(path,overviewfilename)\n\n    # which snipplet file are we talking about\n    dirname,enddirname=os.path.split(path)\n    snippletfilename=os.path.join(dirname,enddirname+\"_html.blk\") \n\n    # do we have to work? \n    if not os.path.isfile(filename) or (os.path.isfile(snippletfilename) \\\n        and getmtime(snippletfilename) > getmtime(filename)):\n        # nothing to be done\n#        sys.stderr.write(\"Nothing to be done.\")\n        return 0\n\n\n    # check what filename, we have to leave in the URL\n    predir=enddirname\n    for t in range(1,int(argv[2]),1):\n        dirname,head=os.path.split(dirname)\n        predir=os.path.join(head,predir)\n\n\n    # parse the overview file\n\n    #p=saxexts.make_parser()   # this is the normal parser coming with python\n    p=drv_xmlproc_val.create_parser() # validating xmlproc parser\n\n    dh=SimpleDocHandler()\n    p.setErrorHandler(saxutils.ErrorPrinter())\n    p.setDocumentHandler(dh)\n\n    p.parse(filename)\n\n#    sys.stderr.write(\"the indices: \" + repr(dh.indices) + \"\\n\")\n#    sys.stderr.write(\"found %d mails\\n\" % len(dh.maillist))\n\n    # write snipplet\n    f=open(snippletfilename,\"w\")\n    write=f.write\n\n        \n    def writetablefield(index,name,dh,write,predir):\n        if dh.indices.has_key(index+\"index\"):\n           write(\"    <td><a href=\\\"%s/%s\\\">%s</a></td>\\n\" \\\n                    %(predir,dh.indices[index+\"index\"],name))\n        else: write(\"<td></td>\\n\")\n\n    \n    write(\"  <td>%s</td>\\n\" % (enddirname))\n    writetablefield(\"thread\",\"Threads\",dh,write,predir)\n    writetablefield(\"date\",\"Dates\",dh,write,predir)\n    writetablefield(\"subject\",\"Subjects\",dh,write,predir)\n    writetablefield(\"author\",\"Authors\",dh,write,predir)\n    write(\"  <td>%d</td>\\n\" % len(dh.maillist))\n\n    f.close()\n                \n\nif __name__==\"__main__\":\n    main(sys.argv)       \n\n"
  },
  {
    "path": "contrib/hoaf-28/footer_html.hdr",
    "content": "\n</body>\n</html>\n"
  },
  {
    "path": "contrib/hoaf-28/haof-0.1.dtd",
    "content": "<!--\n\n    Experimental hypermail archive overview file DTD 0.2 \n    Might be available from http://ffii.org/~breiter/probe\n\n    Copyright 1999,2002 by Bernhard Reiter <breiter@ffii.org>.\n    This specification is released as Free Software under a permissive\n    license. Do with it what you want, give credit, note that\n    you use this at your own risk.\n \n\n    I want to build nicer overview link files from hypermail archives.\n    So hypermail can create a file with this format in each\n    archive directory and scripts can pick it up.\n\n    Changes:\n    29.11.1999 Bernhard Reiter <breiter@ffii.org>\n        initial v0.1\n    25.12.1999 Bernhard\n\tadded <archiver> \n\tadded optional <references>: This could be used for threading\n    21. 7.2002  Bernhard\n\tadded <attachement> index for use with newer hypermail versions\n        v0.2\n-->\n\n<!ELEMENT haof (archiver, indices, mails)>\n<!ATTLIST haof\n          version     CDATA #REQUIRED> \n\n<!ELEMENT archiver EMPTY>\n<!ATTLIST archiver\n\t  name\tCDATA #REQUIRED\n\t  version CDATA #REQUIRED>\n\n<!ELEMENT indices (dateindex, subjectindex,  \n\tthreadindex?, authorindex?, attachmentindex? )>\n<!ELEMENT dateindex (#PCDATA)>\n<!ELEMENT subjectindex (#PCDATA)>\n<!ELEMENT threadindex (#PCDATA)>\n<!ELEMENT authorindex (#PCDATA)>\n<!ELEMENT attachmentindex (#PCDATA)>\n\n<!ELEMENT mails (mail)+>\n<!ELEMENT mail (subject,  date , fromname , fromemail, message-id, file,\n\t\t(references)? )>\n<!ELEMENT subject (#PCDATA)>\n<!ELEMENT date (#PCDATA)>\n<!ELEMENT fromname (#PCDATA)>\n<!ELEMENT fromemail (#PCDATA)>\n<!ELEMENT message-id (#PCDATA)>\n<!ELEMENT file (#PCDATA)>\n\n<!ELEMENT references (ref)+>\n<!ELEMENT ref (#PCDATA)>\n"
  },
  {
    "path": "contrib/hoaf-28/hypermail-2b28-2b28+.patch",
    "content": "diff -ru hypermail-2b28/patchlevel.h hypermail/patchlevel.h\n--- hypermail-2b28/patchlevel.h\tMon Dec  6 17:22:27 1999\n+++ hypermail/patchlevel.h\tTue Nov 30 23:57:14 1999\n@@ -1,2 +1,2 @@\n-#define VERSION \"2b28\"\n+#define VERSION \"2b28+\"\n #define PATCHLEVEL \"0\"\ndiff -ru hypermail-2b28/src/hypermail.c hypermail/src/hypermail.c\n--- hypermail-2b28/src/hypermail.c\tMon Dec  6 17:22:28 1999\n+++ hypermail/src/hypermail.c\tTue Nov 30 23:57:14 1999\n@@ -390,6 +390,11 @@\n     authname = setindex(set_defaultindex, \"author\", set_htmlsuffix);\n \n     /*\n+     * Set name of the overviewfile. FIXME, this is hardcoded\n+     */\n+    overviewname = \"archive_overview.haof\" ;\n+\n+    /*\n      * General settings for mail command and rewriting.\n      */\n \n@@ -496,6 +501,7 @@\n \twritethreads(amount_new);\n \twritesubjects(amount_new);\n \twriteauthors(amount_new);\n+\twriteoverview(amount_new);\n     }\n     else {\n \tprintf(\"No mails to output!\\n\");\ndiff -ru hypermail-2b28/src/hypermail.h hypermail/src/hypermail.h\n--- hypermail-2b28/src/hypermail.h\tMon Dec  6 17:22:28 1999\n+++ hypermail/src/hypermail.h\tTue Nov 30 23:57:14 1999\n@@ -252,6 +252,7 @@\n VAR char *datename;\t\t/* By date index file               */\n VAR char *subjname;\t\t/* By subject index file            */\n VAR char *thrdname;\t\t/* By thread index file             */\n+VAR char *overviewname;\t\t/* Easily parsable overview file    */\n \n VAR int use_mailcommand;\n VAR int use_mailto;\ndiff -ru hypermail-2b28/src/print.c hypermail/src/print.c\n--- hypermail-2b28/src/print.c\tMon Dec  6 17:22:28 1999\n+++ hypermail/src/print.c\tTue Nov 30 23:57:14 1999\n@@ -366,6 +366,34 @@\n     }\n }\n \n+/*\n+** Pretty-prints the items for the overviewfile.\n+*/\n+\n+void printoverviewitems(FILE *fp, struct header *hp)\n+{\n+    char *subj;\n+    if (hp != NULL) {\n+\tstruct emailinfo *em = hp->data;\n+\tprintoverviewitems(fp, hp->left);\n+\tsubj = convchars(em->subject);\n+\tfprintf(fp,\n+\t    \"      <mail>\\n\"\n+\t    \"        <subject>%s</subject>\\n\"\n+\t    \"        <date>%s</date>\\n\"\n+\t    \"        <fromname>%s</fromname>\\n\"\n+\t    \"        <fromemail>%s</fromemail>\\n\" \n+\t    \"        <message-id>%s</message-id>\\n\"\n+\t    \"        <file>\\\"%.4d.%s\\\"</file>\\n\"\n+\t    \"      </mail>\\n\\n\"\n+\t    ,subj, getdatestr(em->date), em->name, em->emailaddr, em->msgid,\n+\t    em->msgnum, set_htmlsuffix);\n+\n+\tfree(subj);\n+\tprintoverviewitems(fp, hp->right);\n+    }\n+}\n+\n int showheader(char *header)\n {\n     return (inlist(set_show_headers, header) || inlist(set_show_headers, \"*\"));\n@@ -1482,6 +1510,67 @@\n \n     printfooter(fp, ihtmlfooterfile, set_label, set_dir,\n \t\tlang[MSG_BY_AUTHOR], authname);\n+\n+    fclose(fp);\n+\n+    if (newfile && chmod(filename, set_filemode) == -1) {\n+\tsprintf(errmsg, \"%s \\\"%s\\\": %o.\",\n+\t\tlang[MSG_CANNOT_CHMOD], filename, set_filemode);\n+\tprogerr(errmsg);\n+    }\n+\n+    if (set_showprogress)\n+\tputchar('\\n');\n+}\n+\n+/*\n+** Write the overviewfile. Might be XML based. Should be easily parseble.\n+*/\n+\n+void writeoverview(int amountmsgs)\n+{\n+    int newfile;\n+    char filename[MAXFILELEN];\n+    FILE *fp;\n+\n+    sprintf(filename, \"%s%s%s\", set_dir,\n+\t    (set_dir[strlen(set_dir) - 1] == '/') ? \"\" : \"/\", overviewname);\n+\n+    if (isfile(filename))\n+\tnewfile = 0;\n+    else\n+\tnewfile = 1;\n+\n+    if ((fp = fopen(filename, \"w\")) == NULL) {\n+\tsprintf(errmsg, \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n+\tprogerr(errmsg);\n+    }\n+\n+    if (set_showprogress)\n+\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_DATE_INDEX], filename);\n+\n+\n+    fprintf(fp,\"<?xml version=\\\"1.0\\\"?>\\n\\n\");\n+    fprintf(fp,\"  <!DOCTYPE haof PUBLIC \"\n+\t \"\\\"-//Bernhard Reiter//DTD HOAF 0.1//EN\\\"\\n\" \n+\t \"\\\"http://ffii.org/~breiter/probe/haof-0.1.dtd\\\">\\n\\n\"\n+\t   );\n+    fprintf(fp,\"  <haof version=\\\"0.1\\\">\\n\\n\");\n+\n+    fprintf(fp,\"    <indices>\\n\");\n+    fprintf(fp,\"       <dateindex>%s</dateindex>\\n\",datename);\n+    fprintf(fp,\"       <threadindex>%s</threadindex>\\n\",thrdname);\n+    fprintf(fp,\"       <subjectindex>%s</subjectindex>\\n\",subjname);\n+    fprintf(fp,\"       <authorindex>%s</authorindex>\\n\",authname);\n+    fprintf(fp,\"    </indices>\\n\\n\");\n+    \n+    fprintf(fp,\"    <mails>\\n\\n\");\n+    printoverviewitems(fp,datelist);\n+    fprintf(fp,\"    </mails>\\n\");\n+    \n+\n+    fprintf(fp,\"  </haof>\");\n+\n \n     fclose(fp);\n \n"
  },
  {
    "path": "contrib/hoaf-28/top_html.hdr",
    "content": "<html>\n<body>\n\n"
  },
  {
    "path": "contrib/hyperfeed.pl",
    "content": "#!/usr/bin/perl5 \n#\n# hyperfeed.pl\n#\n#   Feed messages from an mbox into hypermail one at a time so as to test the\n#   incremental mode of hypermail.\n#\n#   -a <args>  call hypermail with these arguments instead of the default\n#   -e <num>   stop feeding messages after the one with this index (1-based)\n#   -f <path>  use this as the mbox to draw messages from\n#   -h <path>  use this as hypermail instead of the default\n#   -s <num>   start feeding messages with the one with this index (1-based)\n#\n# Notes:\n#\n#   You can use this to extract a single contiguous range of messages from an\n#   mbox by using a command line such as\n#\n#     hyperfeed.pl -s 10 -e 20 -h /bin/cat -a '' -f mbox.all > mbox.some\n#\n#   That command line will open an mbox named mbox.all and run separate\n#   invocations of cat on messages 10 through 20-- eleven messages in all,\n#   skipping the first nine. By using /bin/cat instead of hypermail, the \n#   effect is to send the messages, still in mbox format, to the standard\n#   output. Why you might care to do that is left as an excercise for the\n#   reader.\n#\n# Author: Scott Rose, rose@cs.washington.edu. 19 Oct 1999.\n\n# She configures me...\n\n$default_args = '-uid .';\n$default_mbox = 'mbox';\n$default_prog = '/var/adm/sm.bin/hypermail';\n\n# She configures me not!\n\nuse Getopt::Std;\n\ngetopts('f:h:a:s:e:v');\n$| = 1;\n\nif(defined $opt_a) {\n    $args = $opt_a;\n} else {\n    $args = '-guid .';\n}\nif(defined $opt_f) {\n    $file = $opt_f;\n} else {\n    $file = $default_mbox;\n}\nif(defined $opt_h) {\n    $hypermail = $opt_h;\n} else {\n    $hypermail = $default_prog;\n}\n\nopen MBOX, $file or die \"can't read the mbox.\";\n\n$msg = 0;\n\n# Loop on lines in the mbox.\n\nwhile(<MBOX>) {\n    if(/^From / && defined @lines) {\n\t$msg++;\n\texit if(defined $opt_e && $msg > $opt_e);\n\n\t# encountered the start of a new message with the content of the\n\t# previous one in @lines; emit it\n\n\t&h unless(defined $opt_s && $msg < $opt_s);\n\tundef @lines;\n    }\n    push @lines, $_;\n}\n\n$msg++;\nexit if(defined $opt_e && $msg > $opt_e);\n\nif(defined @lines) {\n    &h unless((defined $opt_s && $msg < $opt_s) ||\n\t      (defined $opt_e && $msg > $opt_e));\n}\n\n    END {\n\tclose MBOX or die \"can't close mbox\";\n\tprint \"\\n\" if(defined $opt_v);\n    }\n\nsub h {\n    open HYPERMAIL, \"|$hypermail $args\" or\n\tdie \"can't pipe to hypermail.\";\n    print HYPERMAIL @lines;\n    close HYPERMAIL or die \"can't close hypermail\";\n    print '.' if(defined $opt_v);\n}\n"
  },
  {
    "path": "contrib/hypetombox.pl",
    "content": "#!/usr/bin/perl\n#\n# Concept:\n#\n#  Convert a hypermail archive to an mbox, weakly.\n#\n# Author:\n#\n#  Scott Rose, rose@cs.[wisc,washington].edu.\n#\n#     With modifications by Kent Landfield. \n#     Further modifications by Peter McCluskey (pcm@rahul.net).\n#     If it's broke, it's my fault.\n#     For the very latest version, check the hypermail cvs repository:\n#     http://cvs.hypermail.org/cgi-bin/cvsweb.cgi/hypermail/contrib/#hypetombox.pl\n#     Or get the version in a recent hypermail distribution at\n#     http://sourceforge.net/projects/hypermail/ or http://www.hypermail-project.org.\n#\n#     A few more mods by Fyodor (fyodor@insecure.org) [9/24/00]:\n#        * Added -H (additional header) option (useful for filtering messages)\n#        * Extended the date formats accepted in \"Received:\" headers\n#        * Added 'a' option to append to mailbox rather than clobbering it\n#        * Updated usage info\n#\n# Usage:\n#\n#   hypetombox.pl [-a] [-H <header(s) to add to each msg] [-d <directory>] [-m <output_filename>] [-n <to_address>] [-S <html suffix>]\n#   -a means append to mailbox instead of clobbering it\n#   -H adds the header(s) you specify.  If more than one, put the three\n#      characters %0A between them.\n#   -R removes carriage returns (\\r) from the end of lines; they sometimes get\n#      added for reasons I haven't been able to explain.\n#   -S defaults to 'html'.\n#\n#\n# $Header$\n\nrequire 5.000;\nuse Getopt::Std;\nuse MIME::Base64;\ngetopts('ad:H:m:n:RS:');\n\n# This is a list of the fields in the comment header of each message.\n\n@fields = ('received', 'sent', 'name', 'email', 'subject', 'id', 'inreplyto');\n\n# Get a list of the message files.\n\n$htmlsuffix = $opt_S || \"html\";\n\n$fpat= \"[0-9][0-9][0-9][0-9].$htmlsuffix\";\n$fpat = \"$opt_d/$fpat\" if(defined $opt_d);\n\n@msgs = sort glob($fpat);\n\n$to_address = $opt_n || 'bogus';\n\n# Open the output file for write.\n\n$mbox_name = $opt_m || 'mbox';\n\nif ($opt_H) {\n\t$opt_H =~ s/%0A/\\n/g;\n        chomp($opt_H);\n\t$opt_H .= \"\\n\";\n}\n\n$DIR_PREFIXER = \"att-\";\t\t# should be same as DIR_PREFIXER in parse.h\n$PATH_SEPARATOR = '/';\n\nif ($opt_a) {\n\t$openflag = \">>\";\n} else {\n\t$openflag = \">\";\n}\n(open MBOX, \"$openflag$mbox_name\") || die \"can't open $mbox_name\";\n\n# Loop on the input files.\n\n# count the messages in the file\n$cntr = 0;\n$boguscntr = 0;\n\nforeach $msg (@msgs) {\n\n    # Open the message file for read.\n\n    # reset the header count for each message.\n    # added by Erik Peterson 1/3/00.\n    $header_count=0;\n\n    $cntr += 1;\n\n    $msgnum = int(substr($msg, length($opt_d) + ($opt_d ne ''), 99999));\n    $boundary = \"=---------HYPETOMBOXCREATEDBOUNDARY$msgnum\";\n    $attdir = sprintf(\"%s%s$DIR_PREFIXER%04d\", $opt_d,\n\t\t      $opt_d ne '' ? $PATH_SEPARATOR : '', $msgnum);\n    @attfiles = glob(\"$attdir$PATH_SEPARATOR*\");\n    undef %att_type;\n    undef %att_desc;\n\n    (open M, $msg) || die \"can't open $msg\";\n\n    # Loop on lines in the file\n\n    $state = 'HeaderComments';\n    foreach $fld (@fields)\n    {\n\t$$fld = '';\n    }\n\n    my $line;\n    my $msg_text;\n\n    while($line = <M>) {\n\n\t# This is a header comment; save the value in a variable with the\n\t# same name.\n\t$line =~ s|\\r(\\n)$|\\n| if($opt_R);\n\n\tif($state eq 'HeaderComments'\n\t   && ($line =~ /^<!-- (\\w+)=\"(.+)\" -->(\\s*)$/)) {\n            $key = $1;\n            $value = $2;\n            $value =~ s/&amp;/&/g;\n            $value =~ s/&lt;/</g;\n            $value =~ s/&gt;/>/g;\n            $$key = $value;\n\t    ++$header_count;\n        }\n        elsif($header_count > 0) {\n            if($state eq 'HeaderComments') {\n                $state = 'LeadingGoo';\n                if($received =~ /^(\\w{3} \\w{3} {1,2}\\d{1,2} \\d{2}:\\d{2}:\\d{2} \\d{4})/) {\n                    $date = $1;\n                }\n\t\telsif($received =~ /^(\\d{1,2} \\w{3} {1,2}\\d{2,4} \\d{2}:\\d{2}:\\d{2} \\w{3})/)\n\t\t{\n\t\t    $date = $1;\n\t\t}\n\t\telsif($received =~ /^(\\w{3}), (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}:\\d{2}:\\d{2})/) {\n\t\t    $date = sprintf(\"%s %s %.2d %s %s\", $1, $3, $2, $5, $4);\n\t\t}\n                else {\n                    $date = 'Bogus date';\n                    $boguscntr += 1;\n\t\t    warn(\"received $received, $line\\n\") if($boguscntr < 3);\n                }\n\t\t$email = &unspamify($email);\n                print MBOX \"From $email  $date\\n\";\n                print MBOX \"Date: $sent\\n\";\n\t\t$id = &unspamify($id);\n\t\tprint MBOX \"Message-Id: <$id>\\n\";\n\t\tprint MBOX \"To: $to_address\\n\";\n\t\tprint MBOX \"From: $email ($name)\\n\";\n\t\tprint MBOX \"Subject: $subject\\n\";\n \t\tif ($opt_H) {\n                   print MBOX $opt_H;\n                 }\n                if ($inreplyto) {\n\t\t    $inreplyto = &unspamify($inreplyto);\n\t\t    print MBOX \"In-Reply-To: <$inreplyto>\\n\";\n\t\t}\n\t\tif (@attfiles)\n\t\t{\n\t\t    print MBOX \"Mime-Version: 1.0\\n\";\n\t\t    print MBOX \"Content-Type: multipart/mixed; boundary=\\\"$boundary\\\"\\n\";\n\t\t}\n\t\tprint MBOX \"\\n\";\n\t\tif (@attfiles)\n\t\t{\n\t\t    print MBOX \"This is a multi-part message in MIME format.\\n\";\n\t\t    print MBOX \"--$boundary\\n\";\n\t\t    print MBOX \"Content-Type: text/plain; charset=us-ascii\\n\";\n\t\t    print MBOX \"Content-Transfer-Encoding: 7bit\\n\";\n\t\t}\n            }\n\t    if($line =~ m|^<!-- attachment=\\\"(\\d+)\\-([^\\\"]+)\\\" -->|)\n\t    {\n\t\tmy $attfilename = $2;\n\t\tmy $part_no = $1;\n\t\tif($msg_text =~ s|<ul>\\n<li>(\\S+) attachment: ([^\\n]+)\\n</ul>(\\s*)$||s)\n\t\t{\n\t\t    $att_type{$attfilename} = $1;\n\t\t    $att_desc{$attfilename} = $2 if($2 ne 'stored');\n\t\t}\n\t\t$msg_text =~ s|<hr noshade>\\n$||s;\n\t\t$msg_text .= &get_att($attdir, $part_no, $attfilename);\n\t\tnext;\n\t    }\n            $state = 'Body' if($line =~ /^<!-- body=\"start\" -->/);\n            $state = 'TrailingGoo' if(($line =~ /^<!-- body=\"end\" -->/)\n\t\t\t\t     || ($line =~ /^<([pP])><!-- body=\"end\" -->/));\n            next if(($line =~ /^<!--/) || \n                    $state eq 'LeadingGoo' || $state eq 'TrailingGoo');\n\n            # This is a body line.\n\n\t    next if($line =~ /^<br>\\s*$/i);\n\t    next if($line =~ m|^</EM><BR>\\s*$|i);\n            $line =~ s/<br>$\\s*//; # lose the trailing <br>\n            $line =~ s/<BR>$\\s*//; # lose the trailing <br>\n            $line =~ s/<pre>$\\s*//; # lose the <pre>formatted tags\n            $line =~ s/<PRE>$\\s*//; # lose the <PRE>formatted tags\n            $line =~ s/<\\/pre>$\\s*//; # lose the </pre>formatted tags\n            $line =~ s/<\\/PRE>$\\s*//; # lose the </PRE>formatted tags\n            $line =~ s/<P>$\\s*/\\n/;  # lose the paragraph tags\n\t    $line =~ s/<p>$\\s*/\\n/;  # lose the paragraph tags\n            $line =~ s%<a href=[^>]+>([^<]+)</a>%\\1%g; # lose hyperlinks\n            $line =~ s%<A HREF=[^>]+>([^<]+)</A>%\\1%g; # lose hyperlinks\n\t    $line =~ s/&lt;/</g; # reverse map special characters\n            $line =~ s/&gt;/>/g;\n            $line =~ s/&amp;/&/g;\n\t    $line =~ s/&quot;/\\\"/g;\n\t    $line =~ s/&nbsp;/ /g;\n            $line =~ s%^<i>(.+)</i>$%\\1%;\n            $line =~ s%^<EM>(.+)</EM>$%\\1%;\n            $line =~ s%<EM>%%;\n            $line =~ s%^<em>(.+)</em>$%\\1%;\n            $line =~ s%<em>%%;\n\t    $line =~ s/\\<a name=\\\"(\\d+)qlink(\\d+)\\\"\\>//g;\n            $line =~ s/^From />From/; # Don't let bogus message start lines in!\n            while($line =~ /^\\s*<P>/)\n            {\n\t        $line =~ s/^\\s*<P>/\\n/;\n\t    }\n\t    $msg_text .= $line;\n        }\n    } # end loop on message file lines\n    $msg_text =~ s|<a href=\\\"(\\d+).$htmlsuffix\\#(\\d+)qlink(\\d+)\\\">([^<]*)\\</a\\>|$4|sg;\n    print MBOX $msg_text;\n    print MBOX \"\\n\";\n    print MBOX \"--$boundary--\\n\\n\" if(@attfiles);\n\n    (close M) || die \"can't close $msg\";\n\n\n# ... then, the body: (this doesn't seem to have any function - pcm 2000-10-03)\n\n    print MBOX @body;\n\n} # end loop on messages\n\n(close MBOX) || die \"can't close $mbox_name\";\n\n$good = $cntr-$boguscntr;\nprint \"$cntr messages processed ($good good messages : $boguscntr bogus date messages)\\n\";\n\nif ($boguscntr) {\n    print \"Bogus Date encountered, hand edit and search for \\\"Bogus Date\\\"\\n\";\n}\n\nexit(0);\n\nsub get_att\n{\n    my ($attdir, $part_no, $file1) = @_;\n    my $attfile = \"$attdir$PATH_SEPARATOR$part_no-$file1\";\n    my $text;\n    open(FD_A, $attfile) || die \"can't open $attfile\";\n    my $type = $att_type{$file1} || 'application/octet-stream';\n    my $desc;\n    $desc = \"Content-Description: $att_desc{$file1}\\n\" if($att_desc{$file1});\n\n    my $s = \"--$boundary\\nContent-Type: $type; name=\\\"$file1\\\"\\n\"\n\t. \"Content-Transfer-Encoding: base64\\n$desc\"\n\t    . \"Content-Disposition: attachment; filename=\\\"$file1\\\"\\n\\n\";\n\n    while($line = <FD_A>)\n    {\n\t$text .= $line;\n    }\n    return $s . encode_base64($text) . \"\\n\\n\";\n}\n\nsub unspamify\n{\n    my ($s) = @_;\n    if(index($s, '@') == -1)\n    {\n\t$s =~ s/_at_/\\@/;\n    }\n    return $s;\n}\n"
  },
  {
    "path": "contrib/ls2mail",
    "content": "#!/usr/local/bin/perl\n#\n# ls2mail -- converts listserv formated digests to UNIX \"mail\" format\n#\n# Usage:\n#   ./ls2mail < infile > outfile\n#   cat infile | ./ls2mail > outfile\n#\n# Written by David Kilzer <ddkilzer@ti.com>\n# Tue, Mar 24, 1998\n#\n# Below please find a Perl script I helped to write for archiving the\n# ADV-HTML mailing list with Hypermail.  I originally wrote the script for\n# Patrick Douglas Crispen <crispen@netsquirrel.com>, but he said it would\n# be okay to include the script with Hypermail (if so desired).\n# \n# This script appears to function similarly to the n2folder Perl script\n# that Peter Murray <pem@po.cwru.edu> recently sent, and they may even\n# operate on the same type of listserv archive.\n# \n# One thing unique feature that ls2mail may have is that it generates a\n# \"Message-ID\" for each message when converting the listserv archive to an\n# mbox archive.  While this won't help when linking message threads, it\n# did help Hypermail (possibly required by the old 1.x versions?) to\n# create its output.\n\nuse strict;\n\n\nmy $first_time = 1;\t# marks first time through script\nmy $line;\t\t# stores one input line\nmy $header;\t\t# stores mail message header lines\nmy $from_address;\t# stores \"From:\" address\nmy @date;\t\t# stores \"Date:\" information\nmy $message_id;\t\t# stores new message ID info\n\n\nwhile ($line = <>)\t# use '<>' operator so we act like a UNIX filter\n{\n  chomp ($line);\t# remove extra newlines\n\n  if ($line !~ m/^={73}$/)\t# Separator line?\n  {\n    print $line, \"\\n\";\t\t# Not separator, just print\n  }\n  else\t\t\t\t# Found separator line, process\n  {\n    $header = \"\";\t# clear variable\n    $from_address = \"\";\t# clear variable\n    @date = ();\t\t# clear variable\n    $message_id = \"\";\t# clear variable\n\n    # Read in email header lines\n\n    while ($line = <>)\n    {\n      last if ($line =~ m/^\\s*$/);  # message header ends with \"blank\" line\n      $header .= $line;\t\t# add $line to $header\n    }\n\n    $header =~ s/^Sender:\\s/To: /mi;\t# change \"Sender:\" to \"To:\"\n\n    $header =~ s/^([^\\s:]+:)\\s+/$1 /mg;\t# remove extra space from all lines\n\n    $header =~ s/\\n\\s+/\\n        /mg;\t# continued lines used 8 spaces\n\n    # Find \"From\" address to use\n    if ($header =~ m/^Reply-To:\\s.*<([^>]+)>/mi)\n    {\n      $from_address = $1;\n    }\n    elsif ($header =~ m/^Reply-To:\\s.*\\n\\s.*<([^>]+)>/mi)\n    {\n      $from_address = $1;\n    }\n\n    $header =~ m/^Date:\\s(.*)$/mi;\t# find \"Date\" header\n    @date = split (' ', $1);\t\t# split date into an array\n    $date[0] =~ tr/,//d;\t\t# remove commas from first date element\n    $date[1] = \" \" . $date[1] if (length($date[1]) == 1);\n    \t\t\t\t\t# add space to single days\n\n    $message_id = uc (join ('.', @date, $from_address)); # create message ID\n    $message_id =~ tr/[A-Z][0-9].@//cd;\t# remove bad characters\n\n    # Print new UNIX mail header\n    print \"\\n\" if (! $first_time);\n    $first_time &&= 0;\n    print \"From $from_address $date[0] $date[2] $date[1] $date[4]\n$date[3]\\n\";\n    print \"Message-Id: <$message_id>\\n\";\n    print $header, \"\\n\";\n  }\n}\n\n\nexit 0;\n\n"
  },
  {
    "path": "contrib/mailbox_date_trimmer/README.html",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<meta name=\"generator\" content=\"Docutils 0.3.0: http://docutils.sourceforge.net/\" />\n<title>mailbox_date_trimmer</title>\n<link rel=\"stylesheet\" href=\"default.css\" type=\"text/css\" />\n</head>\n<body>\n<div class=\"document\" id=\"mailbox-date-trimmer\">\n<h1 class=\"title\">mailbox_date_trimmer</h1>\n<div class=\"section\" id=\"scenario-description\">\n<h1><a name=\"scenario-description\">Scenario description</a></h1>\n<p>You are a mailing list administrator, or you are somebody who keeps\nmailing list archives for a user group, or you just have a fetish\nfor email archives. Now, don't you always wonder why after running\n<a class=\"reference\" href=\"http://www.hypermail.org/\">Hypermail</a> or <a class=\"reference\" href=\"http://www.mhonarc.org/\">MHonArc</a> on your archives you always have some emails\nwhich date back to 1980 or far away in the future like 2011, even\nthough you started collecting emails in the year 2000 and it's still\nthis very same year?  While there are many answers to this question,\nthere is a very easy way to fix many, if not all, of these messages,\nwhich results in a much more consistent email archive without broken\ndiscussion threads.</p>\n</div>\n<div class=\"section\" id=\"how-does-it-work\">\n<h1><a name=\"how-does-it-work\">How does it work?</a></h1>\n<p>Mailing lists with some activity register at least some messages\nevery month, and luckily most of these emails have correct\ndates. This program iterates through the email archive of your\nchoice (in Unix mailbox format) checking the date header of each\nemail and comparing it to the date of the previous email. If the\ndifference in time is greater than a month, the current email's\ndate is considered invalid.</p>\n<p>When an email is sent to a mailing list, it is very likely that it\n<em>hops</em> through some computers before it reaches its audience. The\ngood thing about this is that each <em>hop</em> adds to the email's\nheaders a timestamp. People running email servers connected day\nand night to the internet usually set them up correctly (or face\nthe consequences), so it is very unlikely that one of these added\ntimestamps is incorrect.  Also, email delivery tends to be pretty\nquick from one of these servers to another, with delays not bigger\nthan minutes or even seconds in most circunstances.</p>\n<p>So when the current email's date is considered invalid,\nmailbox_date_trimmer finds all the date timestamps in the headers,\nand reading them in reverse order (servers add their headers to\nthe beginning of the email) picks the first one whose difference\nto the previous email is smaller than one month (usually the first\nchoice 99% of the time).</p>\n<p>In the broken cases where an email doesn't have ANY header at all,\nmailbox_date_trimmer adds to this email the time of the previos\nemail plus one second. In the cases where the closest match doesn't\nfall in the expected one month timeframe, mailbox_date_trimmer gives\nup and doesn't add any header at all. The latter could happen with\nlegitimate emails which you moved incorrectly to a folder, or you\nunsubscribed for holidays and resubscribed much later, etc.</p>\n<p>If your mailbox contains messages which fall into this category,\ntough luck, you will have to weed them out manually.  For most of\nthe other people in the world, rejoice, your calvary has come to\nan end, you can finally enjoy email archives with consistent dates.</p>\n</div>\n<div class=\"section\" id=\"software-requisites\">\n<h1><a name=\"software-requisites\">Software requisites</a></h1>\n<p>This software requires Python (<a class=\"reference\" href=\"http://www.python.org\">http://www.python.org</a>). It is known\nto work with versions 1.5.2 or 2.2.3. You also need my mailbox_reader\nmodule, which you should be able to get from:</p>\n<blockquote>\n<ul class=\"simple\">\n<li><a class=\"reference\" href=\"http://gradha.sdf-eu.org/program/mailbox_reader.en.html\">http://gradha.sdf-eu.org/program/mailbox_reader.en.html</a></li>\n<li><a class=\"reference\" href=\"http://www.vex.net/parnassus/\">http://www.vex.net/parnassus/</a></li>\n<li><a class=\"reference\" href=\"http://freshmeat.net/\">http://freshmeat.net/</a></li>\n</ul>\n</blockquote>\n</div>\n<div class=\"section\" id=\"usage\">\n<h1><a name=\"usage\">Usage</a></h1>\n<p>mailbox_date_trimmer is a commandline tool with pretty few options.\nRunning mailbox_date_trimmer with the <tt class=\"literal\"><span class=\"pre\">-h</span></tt> or <tt class=\"literal\"><span class=\"pre\">--help</span></tt> arguments\nshould bring up a help screen showing you how to use the program\nand with what switches.  This program can read mailboxes from the\nhard disk or through standard input. It can also write new mailboxes\nor dump everything through standard output. The former means that\nif you run the program without arguments it will sit there idle\nwaiting for your input, just like the grep command.</p>\n<p>You can run the program like a filter inside a more complex command\nchain.  It consumes/produces data one email at a time, so you can\nfeed it gigabytes of data and it should not run out of memory unless\nyou have emails which don't fit in your available free memory,\nor you have another heavy weight process consuming all your memory.</p>\n<p>Note that while I have run this over all my personal mailing list\narchives, and the program is written in such a way that it should\nnever do stupid things, hey, I'm a stupid human, and the computer\njust followed my instructions. So better make a safe backup of\nyour mail archives before you use this software on them. Anyway,\nit has worked correctly with about 500MB of mail archives, which\nis all I have been able to get from internet and friends.</p>\n</div>\n<div class=\"section\" id=\"checking-the-generated-output\">\n<h1><a name=\"checking-the-generated-output\">Checking the generated output</a></h1>\n<p>In order to verify that mailbox_date_trimmer didn't break anything\nseriously, the first thing you should do is inspect the generated\nmail archive and count the number of emails, it should equal the\nnumber of emails in your original mailbox. If this is not the case,\nI'm sorry, I must have done something terrible. Drop me an email.</p>\n<p>The second thing you can do is go one email after another checking\nwhat dates were modified. When mailbox_date_trimmer modifies the\ndate of an email, if the verbose switch has been used, the original\ndate is stored in the header <tt class=\"literal\"><span class=\"pre\">X-DT</span></tt>. The reason of the change\nis stored in the header <tt class=\"literal\"><span class=\"pre\">X-pi</span></tt>. You can therefore extract all\nmodified messages with the following command, if you have grepmail\navailable on your machine:</p>\n<pre class=\"literal-block\">\ngrepmail -h X-pi mailbox &gt; changed\n</pre>\n<p>Now you can open this new mailbox and see easier which messages\nwhere modified. Don't you like these extra headers? Well, currently\nyou have to grep them out yourself.</p>\n<p>You will notice that most of the dates the program generates are\nnot accurate. I didn't bother to parse timezones, an error of some\nhours is irrelevant when the acceptation time frame is one month\nin both directions.  Also, time operations are done using the local\ntime of your machine, should be using UTC.</p>\n<p>However, little differences in time didn't cause me any problems\nat all. You are welcome to send me patches in unified diff format\nto improve this or any other aspect of the program. The current\nversion satisfied all my neccesities, so it is quite unlikely that\nI will actively improve this software (no itch to scratch).</p>\n</div>\n<div class=\"section\" id=\"contact-information\">\n<h1><a name=\"contact-information\">Contact information</a></h1>\n<p>You should be able to get me through <a class=\"reference\" href=\"mailto:gradha&#64;users.sourceforge.net\">gradha&#64;users.sourceforge.net</a>. If\nthis fails, try going to my web page (currently at\n<a class=\"reference\" href=\"http://gradha.sdf-eu.org/\">http://gradha.sdf-eu.org/</a>), my current email address is stamped at\nthe bottom of most pages. If that URL fails, you could try Googling\nby &quot;Grzegorz Adam Hankiewicz&quot; (don't forget the quotes). Am I\nnarcissistic or what? As if you ever wanted to know that much...</p>\n</div>\n<div class=\"section\" id=\"license\">\n<h1><a name=\"license\">License</a></h1>\n<p>This software is covered under the <a class=\"reference\" href=\"http://www.gnu.org/licenses/licenses.html#GPL\">GPL</a>. See the full license text\nin the provided LICENSE file.</p>\n</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "contrib/mailbox_date_trimmer/README.mailbox_reader",
    "content": "Python Library Documentation: module mailbox_reader\n\nNAME\n    mailbox_reader - Python module to read UNIX mailboxes sequentially.\n\nFILE\n    /home/gregorio/project/python/mailbox_reader/mailbox_reader.py\n\nDESCRIPTION\n    The module provides two classes: Mailbox, a file-like object\n    which allows you to iterate through the contents of a mailbox,\n    and Email, an object which holds the individual emails returned by\n    Mailbox. Mailbox inherits from Mailbox_base, but usually you don't\n    need to even know about this class. Mailbox_base implements the\n    file like mailbox reading part of the class, and the Email object\n    creation. Use the Mailbox class in your code, which will always\n    maintain the same API for backwards compatibility.\n    \n    This module has been written with simplicity in mind, and low memory\n    consumption. Unless you do something bad, I estimate maximum memory\n    consumption as twice the memory required by the largest email of\n    the opened mailbox. But I'm guessing, maybe it is lower, like one\n    time your biggest email.\n    \n    Reasons why you would want to use this module:\n    \n    * python 1.5.2 support.\n    \n    * last time I checked I was unable to use the mailbox module to read\n      a mailbox, write it, and have them byte to byte identical. Didn't\n      bother to check if this has changed, though:\n    \n     http://groups.google.com/groups?threadm=f4c749a5.0201291538.2cd15616%40posting.google.com\n    \n    * MUCH easier to use, open and read, you can't do much more.\n    \n    * MUCH smaller. Easier to read the source and understand it.\n    \n    Here is a COMPLETE example code which shows correct usage:\n    \n       import mailbox_reader\n       mbox = mailbox_reader.Mailbox(\"whatever\")\n       try:\n          try:\n             email = mbox.read_mail()\n          except mbox.Parse_error, msg:\n             print msg\n             return\n             \n          while email:\n             do_stuff_with_email_object(email)\n             email.close()\n             email = mbox.read_mail()\n       finally:\n          mbox.close()\n    \n    This module comes with a setup.py file for installation, so running\n    \"python setup.py install\" will copy the module to your system's\n    python library path. You need the Distutils package to do so\n    (usually Python 1.5.2 users). More info at:\n    \n       http://www.python.org/sigs/distutils-sig/.\n    \n    This module is known to work under python versions 1.5.2 and 2.2.3.\n    There are other modules implementing mailbox reader, usually\n    with greater complexity than what I needed. Go to the Vault\n    of Parnassus (http://www.vex.net/parnassus/, also linked from\n    http://www.python.org/) and search for `mailbox'.\n    \n    This module is announced at comp.lang.python and found at:\n    \n       http://gradha.sdf-eu.org/program/mailbox_reader.en.html\n       http://www.vex.net/parnassus/\n       http://freshmeat.net/\n       http://www.linuxlinks.com/\n    \n    License\n    =======\n    \n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published\n    by the Free Software Foundation; either version 2 of the License,\n    or (at your option) any later version.\n    \n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    General Public License for more details.\n    \n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\nCLASSES\n    Email\n    exceptions.Exception\n        Error\n            Parse_error\n        Error\n            Parse_error\n    Mailbox_base\n        Mailbox\n    \n    class Email\n     |  Holds the headers and body of an individual mail.\n     |  \n     |  You can read the body lines of an email with the readline()\n     |  method.  You can retrieve the headers and body from the\n     |  Email object just by accessing the same attributes which hold\n     |  them. There are two more attributes you might want to use: the\n     |  size attribute counts the size of the email in bytes. The rfc822\n     |  attribute is a Message instance of Python's rfc822 module. You\n     |  could access it to get specific mail headers, though there's\n     |  the get_header method to abbreviate.\n     |  \n     |  Note that once you are done with an email, deleting it or keeping\n     |  zero references to it will cause a memory leak unless you call\n     |  its close() method.  This is because the self.rfc822 object\n     |  holds references to the Email, which turn to be cyclic.\n     |  \n     |  Methods defined here:\n     |  \n     |  __init__(self, headers, body)\n     |      Construct an email holder, passing headers and body as lists.\n     |      \n     |      You should not try to build Email objects yourself, only get\n     |      built ones from the Mailbox class.\n     |  \n     |  all_lines(self)\n     |      Returns the whole message as a list of lines.\n     |      \n     |      The returned list is composed of headers + \"\\n\" + body.\n     |      You can call this method as many times as you want, and\n     |      it won't interfere with the .readline() method. Available\n     |      since 1.0.2.\n     |  \n     |  close(self)\n     |      Call this to free a reference cycle, avoiding amemory leak.\n     |      \n     |      This frees the rfc822 object, which holds a reference to the\n     |      header lines.\n     |  \n     |  get_header(self, header_name)\n     |      Simple wrapper around the rfc822 object held by the email.\n     |      \n     |      self.get_header(...) is equal to self.rfc822.get(..., None)\n     |  \n     |  readline(self)\n     |      Use this method to get lines from the message header/body.\n     |      \n     |      This method returns one line at a time from the\n     |      header/body. When you reach the end of the body, None is\n     |      returned in successive calls. You can return to the beginning\n     |      of the message calling .readline_reset().\n     |      \n     |      Usually you will prefer to access directly the headers and body\n     |      of the Email object through their respective attributes. This\n     |      method exists for other functions accepting file like objects\n     |      which implement the standard .readline() method.\n     |  \n     |  readline_reset(self)\n     |      Resets the .readline() method, starting from headers again.\n     |      \n     |      Call this if you reached the end of the mail and want to read\n     |      it again with the .readline() method. Available since 1.0.2.\n     |  \n     |  ----------------------------------------------------------------------\n     |  Data and non-method functions defined here:\n     |  \n     |  __doc__ = 'Holds the headers and body of an individual mail...rences t...\n     |  \n     |  __module__ = 'mailbox_reader'\n    \n    class Error(exceptions.Exception)\n     |  # Exception hierarchy\n     |  \n     |  Data and non-method functions defined here:\n     |  \n     |  __doc__ = None\n     |  \n     |  __module__ = 'mailbox_reader'\n     |  \n     |  ----------------------------------------------------------------------\n     |  Methods inherited from exceptions.Exception:\n     |  \n     |  __getitem__(...)\n     |  \n     |  __init__(...)\n     |  \n     |  __str__(...)\n    \n    class Mailbox(Mailbox_base)\n     |  Simple mailbox reader.\n     |  \n     |  This class is an interface wrapper around Mailbox_base, which\n     |  provides the real methods to read mail messages.\n     |  \n     |  Methods defined here:\n     |  \n     |  __init__(self, filename_or_file_object)\n     |      Creates a wrapper around the given parameter.\n     |      \n     |      The input parameter can be a filename or a file like object\n     |      supporting the .readline() method. First the .readline() method\n     |      will be tried, and if it doesn't exist, filename_or_file_object\n     |      will be used as filename to open a file.\n     |  \n     |  close(self)\n     |      Closes the opened mailbox forever.\n     |      \n     |      You don't need to call this method if you wrapped a file\n     |      like object, because in this situation only a reference to\n     |      its .readline() method is held, and that is quite unlikely\n     |      to create a cyclic reference which can't be cleaned up by\n     |      the garbage collector.\n     |      \n     |      If you opened the Mailbox with a filename, however, you have\n     |      to call this method to close the opened file and release\n     |      it for good. Otherwise you could consume all your OS' file\n     |      resources maintaining opened mailboxes around.\n     |  \n     |  read_mail(self)\n     |      Returns the next mail from the mailbox as Email object.\n     |      \n     |      The only difference of this method with regards to\n     |      Mailbox_base.read_mail() is that if Parse_error is raised,\n     |      .close() is automatically called before reraising again the\n     |      exception. The rationale for this is that you don't need to\n     |      keep opened mailboxes which you can't read or extract messages\n     |      from them, and you don't have to remember calling the .close()\n     |      method in your except block.\n     |      \n     |      Read the documentation of Mailbox_base.read_mail() for details.\n     |  \n     |  ----------------------------------------------------------------------\n     |  Data and non-method functions defined here:\n     |  \n     |  __doc__ = 'Simple mailbox reader.\\n\\n   This class is an inte...vides ...\n     |  \n     |  __module__ = 'mailbox_reader'\n     |  \n     |  ----------------------------------------------------------------------\n     |  Methods inherited from Mailbox_base:\n     |  \n     |  __del__(self)\n     |      Calls the close method, in case the user forgot.\n     |  \n     |  ----------------------------------------------------------------------\n     |  Data and non-method functions inherited from Mailbox_base:\n     |  \n     |  Error = <class mailbox_reader.Error>\n     |  \n     |  Mailbox_reader_error = <class mailbox_reader.Error>\n     |  \n     |  Parse_error = <class mailbox_reader.Parse_error>\n    \n    class Mailbox_base\n     |  File like object mailbox reader.\n     |  \n     |  Wrapper around a file like object which should provide the\n     |  contents of a mailbox file. After object creation, you are\n     |  supposed to call .read_mail() until it returns None or you are\n     |  tired of it. The wrapper keeps a method reference to the input\n     |  file like object used to create the wrapper, so you better call\n     |  .close() once you are done with the mail reading to break the\n     |  reference and ease garbage collection.\n     |  \n     |  There is no way to go back through a file like object. You\n     |  have to open a new wrapper around one or keep yourself a copy\n     |  of the messages in memory if you want to iterate back through\n     |  the returned messages.\n     |  \n     |  Methods defined here:\n     |  \n     |  __del__(self)\n     |      Calls the close method, in case the user forgot.\n     |  \n     |  __init__(self, file_object)\n     |      Creates a Mailbox object around the given file like object.\n     |      \n     |      file_object has to be a file like object implementing the\n     |      .readline() method. If the parameter doesn't support this\n     |      interface, an AttributeError exception will be thrown during\n     |      the constructor call.\n     |      \n     |      Mailbox files have to start with a `From...' like line to\n     |      be valid.  There is no way to know this until you try to read\n     |      the first email from the file_object with .read_mail().\n     |  \n     |  close(self)\n     |      Looses the method reference to the input file object.\n     |      \n     |      After this call, the .read_mail() method will be unable to\n     |      return more messages. Usually you don't need to call this\n     |      method manually, it's quite unlikely that the .readline()\n     |      method reference creates a cyclic reference. Call it if you\n     |      can't sleep well.\n     |  \n     |  read_mail(self)\n     |      Returns the next mail from the mailbox as Email object.\n     |      \n     |      If there are no more mails, or .close() has been previously\n     |      called, None is returned.\n     |      \n     |      If it is the first time you call this method on a recently\n     |      opened mailbox, it can raise Parse_error if the first line is\n     |      not a mailbox `From...' like line. This can happen only with\n     |      the first call, posterior calls never raise this exception.\n     |  \n     |  ----------------------------------------------------------------------\n     |  Data and non-method functions defined here:\n     |  \n     |  Error = <class mailbox_reader.Error>\n     |  \n     |  Mailbox_reader_error = <class mailbox_reader.Error>\n     |  \n     |  Parse_error = <class mailbox_reader.Parse_error>\n     |  \n     |  __doc__ = 'File like object mailbox reader.\\n\\n   Wrapper aro...terate...\n     |  \n     |  __module__ = 'mailbox_reader'\n    \n    Mailbox_reader_error = class Error(exceptions.Exception)\n     |  # Exception hierarchy\n     |  \n     |  Data and non-method functions defined here:\n     |  \n     |  __doc__ = None\n     |  \n     |  __module__ = 'mailbox_reader'\n     |  \n     |  ----------------------------------------------------------------------\n     |  Methods inherited from exceptions.Exception:\n     |  \n     |  __getitem__(...)\n     |  \n     |  __init__(...)\n     |  \n     |  __str__(...)\n    \n    class Parse_error(Error)\n     |  Method resolution order:\n     |      Parse_error\n     |      Error\n     |      exceptions.Exception\n     |  \n     |  Data and non-method functions defined here:\n     |  \n     |  __doc__ = None\n     |  \n     |  __module__ = 'mailbox_reader'\n     |  \n     |  ----------------------------------------------------------------------\n     |  Methods inherited from exceptions.Exception:\n     |  \n     |  __getitem__(...)\n     |  \n     |  __init__(...)\n     |  \n     |  __str__(...)\n\nDATA\n    HUMAN_VERSION = '1.0.4'\n    __author__ = 'Grzegorz Adam Hankiewicz'\n    __credits__ = ''\n    __date__ = '$Date$'\n    __email__ = 'gradha@users.sourceforge.net'\n    __file__ = './mailbox_reader.pyc'\n    __name__ = 'mailbox_reader'\n    __version__ = '$Revision$'\n    _from_re = <_sre.SRE_Pattern object>\n\nVERSION\n    1.21\n\nDATE\n    $Date$\n\nAUTHOR\n    Grzegorz Adam Hankiewicz\n\nCREDITS\n\n\n"
  },
  {
    "path": "contrib/mailbox_date_trimmer/mailbox_date_trimmer.py",
    "content": "#!/usr/bin/env python\n# -*- mode:Python; tab-width: 3 -*-\n\"\"\"Corrects dates in a mailbox archives.\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published\nby the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\"\"\"\n\n__author__ = \"Grzegorz Adam Hankiewicz\"\n__date__ = \"$Date$\"\n__version__ = \"$Revision$\"\n__email__ = \"gradha@users.sourceforge.net\"\n__credits__ = \"\"\n\n\nimport time\nimport re\nimport sys\nimport os\nimport string\nfrom stat import *\ntry:\n   import mailbox_reader\nexcept ImportError, msg:\n   print msg\n   print \"For this program to work you need the mailbox_reader module.\"\n   print \"You should be able to get it from one of these places:\"\n   print \"\\n\\thttp://gradha.sdf-eu.org/program/mailbox_reader.en.html\"\n   print \"\\thttp://www.vex.net/parnassus/\"\n   print \"\\thttp://freshmeat.net/\\n\"\n   sys.exit(1)\n\n\n# Exception hierarchy\nclass Error(Exception): pass\nclass Parse_error(Error): pass\nclass Parse_time_error(Parse_error): pass\n   \n\nHUMAN_VERSION = \"1.0.1\"\nDAY_STRIPPER = re.compile(r\"\\d+.*\")\nDATE_FINDER = re.compile((r\"(?P<day>\\d+)\\s+(?P<month>\\w\\w\\w)\\s+\"\n   \"(?P<year>\\d\\d\\d\\d+)\\s+(?P<time>\\d\\d:\\d\\d:\\d\\d)\\s+\"\n   \"(?P<zone>\\+\\d+|-\\d+)?\"))\nTIME_FORMAT = \"%d %b %Y %H:%M:%S\"\nWEEK_TIME = 60 * 60 * 24 * 7\nMONTH_TIME = WEEK_TIME * 4\n\n\ndef complete_time_string(time_string):\n   \"\"\"Returns string `xx:xx' into `xx:xx:00' if needed.\n\n   While the rfc says loud and clear that times should be written\n   with second precision, there are many mail programs which only\n   have minute precission. This function takes one time string and\n   verifies that it is made of three pieces separated by a colon.\n\n   If the string is made of three parts, it is returned untouched. If\n   it is made of two parts, zeros are used to fill the seconds\n   field. In all other cases a Parse_time_error exception is raised.\n   \"\"\"\n   chunks = string.split(time_string, \":\")\n   if len(chunks) == 2:\n      return \"%s:00\" % time_string\n   if len(chunks) != 3:\n      raise Parse_time_error(\"Couldn't parse `%s'\" % time_string)\n   return time_string\n   \n\ndef parse_date(date_string):\n   \"\"\"Returns the time in seconds of date_string.\n\n   If date_string cannot be parsed, Parse_error will be\n   raised. Currently this function ignores timezone, resulting in\n   times with poor precision.\n   \"\"\"\n   if not date_string:\n      raise Parse_error(\"`%s' not a valid date string\" % date_string)\n   # strip unnecessary commas\n   date_string = string.replace(date_string, \",\", \"\")\n   # strip unnecessary day name\n   match = DAY_STRIPPER.search(date_string)\n   if not match:\n      raise Parse_error(\"Didn't find any date in `%s'\" % date_string)\n   date_string = date_string[match.start():]\n   # split into daynumber, month, year, time and optionally timezone\n   components = string.split(date_string)\n   c = components[:5]\n   try:\n      fake_date = \"%s %s %s %s\" % (c[0], c[1], c[2], complete_time_string(c[3]))\n   except IndexError:\n      raise Parse_error(\"Not enough values (4) in `%s' \" % date_string)\n   try:\n      date_time = time.mktime(time.strptime(fake_date, TIME_FORMAT))\n   except (ValueError, OverflowError), msg:\n      raise Parse_time_error(\"Unable to parse time `%s'\\n%s\" % (msg, fake_date))\n\n   # todo, parse timezone?\n   return date_time\n\n\ndef extract_header_dates(headers):\n   \"\"\"Given a list of headers returns a list of pairs with date info.\n\n   The returned list of pairs is the time of the date in seconds\n   since Epoch and the string representing this time in the\n   appropriate format (see RFC2822). Note that the returned time\n   in seconds is way off inaccurate, since I don't care about\n   timezones or conversions from/to localtime. It doesn't matter,\n   since comarisons are usually done with a margin of weeks.\n   \"\"\"\n   results = []\n   for line in headers:\n      if line[:5] == \"Date:\":\n         return results\n      match = DATE_FINDER.search(line)\n      if match:\n         fake_date = \"%s %s %s %s\" % match.group(\"day\", \"month\", \"year\", \"time\")\n         try:   \n            date_time = time.mktime(time.strptime(fake_date, TIME_FORMAT))\n         except ValueError:\n            # Oops, couldn't extract date? Stupid server...\n            continue\n         if match.group(\"zone\"):\n            fake_date = \"%s %s\" % (fake_date, match.group(\"zone\"))\n            time.localtime(date_time)\n         # prepend day in string format\n         fake_date = \"%s, %s\" % (time.strftime(\"%a\",\n            time.gmtime(date_time)), fake_date)\n         results.append((date_time, fake_date))\n   return results\n\n\ndef time_to_string(time_in_seconds):\n   \"\"\"Returns time_in_seconds as an RFC2822 date string.\"\"\"\n   return time.strftime(\"%a, %d %b %Y %H:%M:%S +0000\",\n      time.gmtime(time_in_seconds))\n\n   \ndef get_acceptable_date(reference_time, time_range, headers):\n   \"\"\"Returns first date in the acceptable time frame.\n\n   reference_time is the time time_range is added or substracted\n   from to check if a date is in the acceptable time frame. headers\n   is a list with the email headers of the message. If there are\n   no dates found IndexError is raised. If none of the available\n   dates is acceptable, returns the first one anyway.\n   \"\"\"\n   candidates = extract_header_dates(headers)\n   candidates.reverse()\n   for time, date in candidates:\n      if abs(reference_time - time) <= time_range:\n         return time, date\n   # return possibly closest match\n   return candidates[0]\n\n\ndef replace_date_header(email, new_date, verbose):\n   \"\"\"Updates the current date header in email with new_date.\n\n   The previous date (if any) is stored as X-DT header. The date\n   is not really replaced, new_date is appended to the headers.\n   verbose is a boolean flag indicating whether extra headers have\n   to be generated.\n   \"\"\"\n   for f in range(len(email.headers)):\n      if string.find(email.headers[f], \"Date:\") == 0:\n         if verbose:\n            email.headers[f] = \"X-DT:%s\" % email.headers[f][5:]\n            break\n         else:\n            email.headers[f] = \"Date: %s\\n\" % new_date\n            return\n            \n   email.headers.append(\"Date: %s\\n\" % new_date)\n   email.header_lines = email.header_lines + 1\n\n   \ndef usage_information(exit_code = 0, binary_name = \"mailbox_date_trimmer.py\"):\n   \"\"\"Prints usage information and terminates execution.\"\"\"\n   print \"\"\"Usage: %s [-hv -i xxx -o xxx]\n\n-h, --help\n   Print this help screen.\n-v, --version\n   Print version number and exit.\n-i xxx, --input xxx\n   The mailbox you want to use as input. If you don't specify any\n   mailbox file, the mailbox will be read through standard input.\n-o xxx, --output xxx\n   Where you want the filtered mailbox to be written. If you don't\n   specify any output, the filtered mailbox will be dumped to\n   standard output.\n-V, --verbose\n   Add to the generated mailbox extra headers which explain what\n   changes were made. By default no extra headers are added.\n\n\nUsage examples:\n %s --input my_mailbox > filtered_mailbox\n cat my_mailbox | %s --output filtered_mailbox\n\"\"\" % (binary_name, binary_name, binary_name)\n   sys.exit(exit_code)\n\n\ndef process_command_line(argv = None):\n   \"\"\"Extracts from argv the options and returns them in a tuple.\n\n   This function is a command line wrapper against main_process,\n   it returns a tuple which you can `apply' calling main_process. If\n   something in the command line is missing, the program will exit\n   with a hopefully helpfull message.\n\n   args should be a list with the full command line. If it is None\n   or empty, the arguments will be extracted from sys.argv. The\n   correct format of the accepted command line is documented by\n   usage_information.\n   \"\"\"\n   import getopt\n   if not argv:\n      argv = sys.argv\n\n   short = \"hvi:o:V\"\n   long = [\"help\", \"version\", \"input=\", \"output=\", \"verbose\"]\n\n   try:\n      opts, args = getopt.getopt(argv[1:], short, long)\n   except getopt.GetoptError, msg:\n      print \"Error processing command line: %s\\n\" % msg\n      usage_information(2)\n\n   input = None\n   output = None\n   verbose = 0\n\n   for option, value in opts:\n      if option in (\"-h\", \"--help\"):\n         usage_information()\n      elif option in (\"-v\", \"--version\"):\n         print HUMAN_VERSION\n         sys.exit(0)\n      elif option in (\"-i\", \"--input\"):\n         input = value\n      elif option in (\"-o\", \"--output\"):\n         output = value\n      elif option in (\"-V\", \"--verbose\"):\n         verbose = 1\n\n   if output is None:\n      output = sys.stdout\n\n   if input is None:\n      input = sys.stdin\n\n   return (input, output, verbose)\n\n\ndef main_process(input, output, verbose):\n   \"\"\"Goes over the input filtering to the output.\n\n   input can be a string with a filename or an already opened file\n   with a mailbox. output has to be a file like object supporting\n   the write method. verbose is a boolean flag indicating if extra\n   headers are to be appended to the generated mail archive.\n   \"\"\"\n   mbox = mailbox_reader.Mailbox(input)\n   email = mbox.read_mail()\n   if not email:\n      return\n   last_header = email.get_header(\"date\")\n   # special case for first email, get its header/time\n   try:\n      last_time = parse_date(last_header)\n   except Parse_error, msg:\n      try: # oops, see if other timestamps are acceptable\n         last_time, last_header = get_acceptable_date(0,\n            MONTH_TIME, email.headers)\n      except IndexError:\n         # I can't feel my legs\n         sys.stderr.write(\"%s\\nUnable to process first date! Please fix it.\\n\" % msg)\n         email.close()\n         mbox.close()\n         return\n\n   # loop over available emails\n   while email:\n      reason = \"\"\n      current_header = email.get_header(\"date\")\n      try:\n         current_time = parse_date(current_header)\n      except Parse_error, e:\n         current_time = 0\n         reason = \" %s\" % e\n\n      # did we detect a big time difference?\n      if abs(last_time - current_time) > MONTH_TIME:\n         try:\n            current_time, current_header = get_acceptable_date(last_time,\n               MONTH_TIME, email.headers)\n            reason = \"%s Got acceptable date\" % reason\n         except IndexError:\n            reason = \"%s No acceptable header date\" % reason\n            current_time = last_time + 1\n            current_header = time_to_string(current_time)\n\n         # did we really improve the date field?\n         if abs(last_time - current_time) <= MONTH_TIME:\n            replace_date_header(email, current_header, verbose)\n            if verbose:\n               email.headers.append(\"X-pi:%s - Previous mail %s\\n\" %\n                  (reason, last_header))\n               email.header_lines = email.header_lines + 1\n\n      output.write(string.join(email.headers, \"\"))\n      output.write(\"\\n\")\n      output.write(string.join(email.body, \"\"))\n\n      last_header = current_header\n      last_time = current_time\n      \n      email.close()\n      email = mbox.read_mail()\n      \n   mbox.close()\n\n\nif __name__ == \"__main__\":\n   \"\"\"Entry point of the script.\"\"\"\n   input, output, verbose = process_command_line()\n   if not getattr(output, \"close\", None):\n      output = open(output, \"wt\")\n   main_process(input, output, verbose)\n   output.close()\n"
  },
  {
    "path": "contrib/mailbox_date_trimmer/mailbox_reader.py",
    "content": "# -*- mode:Python; tab-width: 3 -*-\n\"\"\"Python module to read UNIX mailboxes sequentially.\n\nThe module provides two classes: Mailbox, a file-like object\nwhich allows you to iterate through the contents of a mailbox,\nand Email, an object which holds the individual emails returned by\nMailbox. Mailbox inherits from Mailbox_base, but usually you don't\nneed to even know about this class. Mailbox_base implements the\nfile like mailbox reading part of the class, and the Email object\ncreation. Use the Mailbox class in your code, which will always\nmaintain the same API for backwards compatibility.\n\nThis module has been written with simplicity in mind, and low memory\nconsumption. Unless you do something bad, I estimate maximum memory\nconsumption as twice the memory required by the largest email of\nthe opened mailbox. But I'm guessing, maybe it is lower, like one\ntime your biggest email.\n\nReasons why you would want to use this module:\n\n* python 1.5.2 support.\n\n* last time I checked I was unable to use the mailbox module to read\n  a mailbox, write it, and have them byte to byte identical. Didn't\n  bother to check if this has changed, though:\n\n http://groups.google.com/groups?threadm=f4c749a5.0201291538.2cd15616%40posting.google.com\n\n* MUCH easier to use, open and read, you can't do much more.\n\n* MUCH smaller. Easier to read the source and understand it.\n\nHere is a COMPLETE example code which shows correct usage:\n\n   import mailbox_reader\n   mbox = mailbox_reader.Mailbox(\"whatever\")\n   try:\n      try:\n         email = mbox.read_mail()\n      except mbox.Parse_error, msg:\n         print msg\n         return\n         \n      while email:\n         do_stuff_with_email_object(email)\n         email.close()\n         email = mbox.read_mail()\n   finally:\n      mbox.close()\n\nThis module comes with a setup.py file for installation, so running\n\"python setup.py install\" will copy the module to your system's\npython library path. You need the Distutils package to do so\n(usually Python 1.5.2 users). More info at:\n\n   http://www.python.org/sigs/distutils-sig/.\n\nThis module is known to work under python versions 1.5.2 and 2.2.3.\nThere are other modules implementing mailbox reader, usually\nwith greater complexity than what I needed. Go to the Vault\nof Parnassus (http://www.vex.net/parnassus/, also linked from\nhttp://www.python.org/) and search for `mailbox'.\n\nThis module is announced at comp.lang.python and found at:\n\n   http://gradha.sdf-eu.org/program/mailbox_reader.en.html\n   http://www.vex.net/parnassus/\n   http://freshmeat.net/\n   http://www.linuxlinks.com/\n\nLicense\n=======\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published\nby the Free Software Foundation; either version 2 of the License,\nor (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\"\"\"\n\n\n__author__ = \"Grzegorz Adam Hankiewicz\"\n__email__ = \"gradha@users.sourceforge.net\"\n__date__ = \"$Date$\"\n__version__ = \"$Revision$\"\n__credits__ = \"\"\n\n\nimport string\nimport re\nimport rfc822\n\n\n# Exception hierarchy\nclass Error(Exception): pass\nclass Parse_error(Error): pass\n\nMailbox_reader_error = Error # DEPRECATED\n\nHUMAN_VERSION = \"1.0.4\"\n\n# A valid from line is \"From return-path weekday month day time\n# [timezone] year. This info was taken from http://www.mutt.org/.\n_from_re = re.compile((r\"From \\s*[^\\s]+\\s+\\w\\w\\w\\s+\\w\\w\\w\\s+\\d?\\d\\s+\"\n   r\"\\d?\\d:\\d\\d(:\\d\\d)?(\\s+[^\\s]+)?\\s+\\d\\d\\d\\d\\s*$\"))\n\n\nclass Mailbox_base:\n   \"\"\"File like object mailbox reader.\n\n   Wrapper around a file like object which should provide the\n   contents of a mailbox file. After object creation, you are\n   supposed to call .read_mail() until it returns None or you are\n   tired of it. The wrapper keeps a method reference to the input\n   file like object used to create the wrapper, so you better call\n   .close() once you are done with the mail reading to break the\n   reference and ease garbage collection.\n   \n   There is no way to go back through a file like object. You\n   have to open a new wrapper around one or keep yourself a copy\n   of the messages in memory if you want to iterate back through\n   the returned messages.\n   \"\"\"\n\n   # Exceptions\n   Error = Mailbox_reader_error = Error\n   Parse_error = Parse_error\n   \n   def __init__(self, file_object):\n      \"\"\"Creates a Mailbox object around the given file like object.\n\n      file_object has to be a file like object implementing the\n      .readline() method. If the parameter doesn't support this\n      interface, an AttributeError exception will be thrown during\n      the constructor call.\n\n      Mailbox files have to start with a `From...' like line to\n      be valid.  There is no way to know this until you try to read\n      the first email from the file_object with .read_mail().\n      \"\"\"\n      self._line = None\n      self._input_readline = file_object.readline\n\n   def __del__(self):\n      \"\"\"Calls the close method, in case the user forgot.\"\"\"\n      self.close()\n\n   def read_mail(self):\n      \"\"\"Returns the next mail from the mailbox as Email object.\n\n      If there are no more mails, or .close() has been previously\n      called, None is returned.\n\n      If it is the first time you call this method on a recently\n      opened mailbox, it can raise Parse_error if the first line is\n      not a mailbox `From...' like line. This can happen only with\n      the first call, posterior calls never raise this exception.\n      \"\"\"\n      if self._input_readline is None:\n         return None\n         \n      headers = []\n      body = []\n      reading_body = 0\n\n      # initial mailbox reading\n      if not self._line:\n         self._line = self._input_readline()\n         if not _from_re.match(self._line):\n            self.close()\n            raise Parse_error(\"First line in mailbox has to \"\n               \"begin with `From...'\")\n         \n      while self._line:\n         if reading_body and _from_re.match(self._line):\n            return Email(headers, body)\n   \n         if reading_body:\n            body.append(self._line)\n         elif not reading_body and not string.strip(self._line):\n            \"\"\"Matched the start of the body\"\"\"\n            reading_body = 1\n         else:\n            headers.append(self._line)\n\n         self._line = self._input_readline()\n\n      # Ok, we read last line\n      self.close()\n\n      if len(headers) and len(body):\n         return Email(headers, body)\n      else:\n         return None\n\n   def close(self):\n      \"\"\"Looses the method reference to the input file object.\n\n      After this call, the .read_mail() method will be unable to\n      return more messages. Usually you don't need to call this\n      method manually, it's quite unlikely that the .readline()\n      method reference creates a cyclic reference. Call it if you\n      can't sleep well.\n      \"\"\"\n      self._input_readline = None\n         \n      \nclass Mailbox(Mailbox_base):\n   \"\"\"Simple mailbox reader.\n\n   This class is an interface wrapper around Mailbox_base, which\n   provides the real methods to read mail messages.\n   \"\"\"\n\n   def __init__(self, filename_or_file_object):\n      \"\"\"Creates a wrapper around the given parameter.\n\n      The input parameter can be a filename or a file like object\n      supporting the .readline() method. First the .readline() method\n      will be tried, and if it doesn't exist, filename_or_file_object\n      will be used as filename to open a file.\n      \"\"\"\n      try:\n         self._file = None\n         Mailbox_base.__init__(self, filename_or_file_object)\n      except AttributeError:\n         self._file = open(filename_or_file_object, \"rt\")\n         Mailbox_base.__init__(self, self._file)\n\n   def read_mail(self):\n      \"\"\"Returns the next mail from the mailbox as Email object.\n\n      The only difference of this method with regards to\n      Mailbox_base.read_mail() is that if Parse_error is raised,\n      .close() is automatically called before reraising again the\n      exception. The rationale for this is that you don't need to\n      keep opened mailboxes which you can't read or extract messages\n      from them, and you don't have to remember calling the .close()\n      method in your except block.\n\n      Read the documentation of Mailbox_base.read_mail() for details.\n      \"\"\"\n      try:\n         return Mailbox_base.read_mail(self)\n      except Parse_error:\n         self.close()\n         raise\n\n   def close(self):\n      \"\"\"Closes the opened mailbox forever.\n\n      You don't need to call this method if you wrapped a file\n      like object, because in this situation only a reference to\n      its .readline() method is held, and that is quite unlikely\n      to create a cyclic reference which can't be cleaned up by\n      the garbage collector.\n\n      If you opened the Mailbox with a filename, however, you have\n      to call this method to close the opened file and release\n      it for good. Otherwise you could consume all your OS' file\n      resources maintaining opened mailboxes around.\n      \"\"\"\n      Mailbox_base.close(self)\n      if self._file:\n         self._file.close()\n         self._file = None\n\n\nclass Email:\n   \"\"\"Holds the headers and body of an individual mail.\n\n   You can read the body lines of an email with the readline()\n   method.  You can retrieve the headers and body from the\n   Email object just by accessing the same attributes which hold\n   them. There are two more attributes you might want to use: the\n   size attribute counts the size of the email in bytes. The rfc822\n   attribute is a Message instance of Python's rfc822 module. You\n   could access it to get specific mail headers, though there's\n   the get_header method to abbreviate.\n\n   Note that once you are done with an email, deleting it or keeping\n   zero references to it will cause a memory leak unless you call\n   its close() method.  This is because the self.rfc822 object\n   holds references to the Email, which turn to be cyclic.\n   \"\"\"\n   \n   def __init__(self, headers, body):\n      \"\"\"Construct an email holder, passing headers and body as lists.\n\n      You should not try to build Email objects yourself, only get\n      built ones from the Mailbox class.\n      \"\"\"\n      self._reading_line = 0\n      self.headers = headers\n      self.body = body\n      self.size = 1 # Line separating body from headers not included later\n      self.header_lines = len(self.headers)\n      for f in range(len(self.headers)): self.size = self.size + len(self.headers[f]) + 1\n      for f in range(len(self.body)): self.size = self.size + len(self.body[f]) + 1\n\n      # Create method to retrieve generic headers\n      self.rfc822 = rfc822.Message(self)\n      # Retrieve commond headers, some lowered case\n      self.subject = string.strip(self.rfc822.get(\"subject\", \"\"))\n      self.ffrom = string.strip(self.rfc822.get(\"from\", \"\"))\n      self.to = string.strip(self.rfc822.get(\"to\", \"\"))\n\n   def readline(self):\n      \"\"\"Use this method to get lines from the message header/body.\n\n      This method returns one line at a time from the\n      header/body. When you reach the end of the body, None is\n      returned in successive calls. You can return to the beginning\n      of the message calling .readline_reset().\n\n      Usually you will prefer to access directly the headers and body\n      of the Email object through their respective attributes. This\n      method exists for other functions accepting file like objects\n      which implement the standard .readline() method.\n      \"\"\"\n      if self._reading_line < self.header_lines:\n         result = self.headers[self._reading_line]\n      elif self._reading_line == self.header_lines:\n         result = \"\\n\"\n      else:\n         try:\n            result = self.body[self._reading_line - self.header_lines - 1]\n         except IndexError:\n            return None\n\n      self._reading_line = self._reading_line + 1\n      return result\n\n   def readline_reset(self):\n      \"\"\"Resets the .readline() method, starting from headers again.\n\n      Call this if you reached the end of the mail and want to read\n      it again with the .readline() method. Available since 1.0.2.\n      \"\"\"\n      self._reading_line = 0\n\n   def all_lines(self):\n      r\"\"\"Returns the whole message as a list of lines.\n\n      The returned list is composed of headers + \"\\n\" + body.\n      You can call this method as many times as you want, and\n      it won't interfere with the .readline() method. Available\n      since 1.0.2.\n      \"\"\"\n      return self.headers + [\"\\n\"] + self.body\n\n   def close(self):\n      \"\"\"Call this to free a reference cycle, avoiding amemory leak.\n\n      This frees the rfc822 object, which holds a reference to the\n      header lines.\n      \"\"\"\n      if self.rfc822:\n         self.rfc822 = None\n\n   def get_header(self, header_name):\n      \"\"\"Simple wrapper around the rfc822 object held by the email.\n\n      self.get_header(...) is equal to self.rfc822.get(..., None)\n      \"\"\"\n      return self.rfc822.get(header_name, None)\n\n"
  },
  {
    "path": "contrib/msg2hypermailarchive.py",
    "content": "#!/usr/bin/env python\n\"\"\"Take one email and put it in the right archive using hypermail. v%(version)s\n\n\nExample usage:\n\ncat email | %(progname)s [OPTIONS] -L <listname>\n\nOPTIONS:\n    -h  --help          print this usage information\n    -L  --listname=     (required) archive for this list\n    -M  --month=        use this month instead of current, e.g. 4 for April\n    -v  --verbose       report actions\n    -Y  --year=         use year (e.g. 2001) instead of current (needs -M, too)\n\nThis is a Free Software reimplementation of the little programs \nliving in hypermail/archive/.\n\n    Copyright (C) 2002  Bernhard Reiter <bernhard@gnu.org>\n\n    This is Free Software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This software is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\"\"\"\n\n__version__=\"0.2\"\n# initial 3.8.2002  Bernhard Reiter <bernhard@gnu.org>\n#  5. 8.2002    Bernhard\n#   added -M and -Y options; made yearstring and month local variables\n#   improved error message when list unknown\n#   added a proper copyright message\n\nimport getopt\nimport sys\nimport os\nimport time\n\nmonths=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]\n\n\nverbose=0\n\nclass listconfig:\n    \"\"\"Keep configuration options for one list.\"\"\"\n    def __init__(self,\n                listname,archive,label,aboutlink=\"../\",options=\"\",\n                mailboxdir=\"\",hypermail=\"/usr/bin/hypermail\"):\n        self.listname=listname\n        self.archive=archive\n\n        if mailboxdir:\n            self.mailboxdir=mailboxdir\n        else:\n            self.mailboxdir=os.path.join(self.archive,\"mailbox\")\n\n        self.label=label\n        self.aboutlink=aboutlink\n        self.options=options\n        self.hypermail=hypermail\n\n\n# configuration section\nlists={}\n\nl=listconfig(   listname=\"hypermail-test\",\n                archive=\"../tests/mail-archive\",\n                label=\"Hypermail Test Archive\",\n                options=\"-X -L en\",\n                hypermail=\"../src/hypermail\"\n            )\nlists[l.listname]=l\n\nl=listconfig(   listname=\"testmailman\",\n                archive=\"/var/www/mail-archive\",\n                label=\"Testmailman Archive\",\n                aboutlink=\"../\",\n                options=\"-X -L de\"\n            )\nlists[l.listname]=l\n\n# end configuration section\n\n\ndef usage():\n    sys.stderr.write(\"\\n\"+ __doc__ %\n        {\"progname\":sys.argv[0], \"version\":__version__})\n\n    sys.stderr.write(\"\\nThe following mailinglist configurations are known:\\n\")\n    listnames=lists.keys()\n    listnames.sort()\n    for l in listnames:\n        sys.stderr.write(l+\" \")\n    sys.stderr.write(\"\\n\")\n\ndef openmailboxfile(list,yearstring,month):\n    \"\"\"Construct mailbox file, open and return it.\n\n    To get the old original msg2archive.c behaviour you would\n    have to replace yearstring with:   (\"%.2d\" % int(yearstring)-1900)\n    \"\"\"\n    n=list.listname+\".\"+yearstring+(\"%.2d\"%month)\n    fn=os.path.join(list.mailboxdir,n)\n\n    if verbose:\n        sys.stderr.write(\"Will append message to [%s]...\\n\" % fn)\n\n    f=open(fn,\"a\")\n    return f\n\n\ndef openhypermailpipe(list,yearstring, month):\n    \"\"\"Construct hypermail command line and open pipe for it.\"\"\"\n\n    d=os.path.join(list.archive,yearstring,months[month-1])\n    cmd=( \"%s -u -i -d \\\"%s\\\" -l \\\"%s\\\" -b \\\"%s\\\" %s\\n\" %\n        (list.hypermail,d,list.label,list.aboutlink,list.options))\n\n    if verbose:\n        sys.stderr.write(\"Will pipe message into [%s]...\\n\" % cmd)\n\n    p=os.popen(cmd,\"w\")\n    return p\n\n\ndef archivemail(listname,inputfile, yearstring, month):\n    \"\"\"Write one email to the mailbox and the hypermail pipe.\n\n    The email is read from inputfile and the non header \"From \"s\n    are quoted for the mboxfile, but not for the hypermail pipe.\n    \"\"\"\n\n    mboxfile=openmailboxfile(listname,yearstring,month)\n    pipe=openhypermailpipe(listname,yearstring,month)\n\n    inheader=1\n\n    try:\n        line=inputfile.readline()\n        while line:\n            if line==\"\\n\" or line == \"\\r\\n\":\n                inheader=0\n\n            if not inheader:\n                if line[:5]==\"From \":\n                    mboxfile.write(\"> \")\n\n            mboxfile.write(line)\n            pipe.write(line)\n\n            line=inputfile.readline()\n\n        # seperate mails\n        mboxfile.write(\"\\n\")\n    finally:\n        mboxfile.close()\n        piperesult=pipe.close()\n\n    if piperesult:\n        sys.stderr.write(\"Pipe to hypermail failed. Popen() returned \"+ \n                    repr(piperesult)+ \"\\n\")\n        sys.exit(3)\n\n    if verbose:\n        sys.stderr.write(\"done.\\n\")\n\n\ndef main():\n    \"Process arguments and call functions doing the real work.\"\n    global verbose\n    yearstring=\"\"\n    month=0\n\n\n    try:\n        opts, args = getopt.getopt(sys.argv[1:], \"hL:M:vY:\", \n            [\"help\", \"listname=\",\"month=\",\"verbose\", \"year=\"])\n    except getopt.GetoptError:\n        # print help information and exit:\n        usage()\n        sys.exit(2)\n    listname = None\n    for o, a in opts:\n\n        if o in (\"-h\", \"--help\"):\n            usage()\n            sys.exit()\n\n        if o in (\"-L\", \"--listname\"):\n            listname = a\n\n        if o in (\"-M\",\"--month\"):\n            month=int(a)\n            if month<1 or month>12:\n                sys.stderr.write(\"Month [%s] out of range!\\n\"%a)\n                sys.exit(1)\n\n        if o in (\"-v\", \"--verbose\"):\n            verbose = 1\n\n        if o in (\"-Y\", \"--year\"):\n            if int(a) >1950 and int(a) <3002:\n                yearstring=a\n            else:\n                sys.stderr.write(\"Year [%s] out of sensible range!\\n\"%a)\n                sys.exit(1)\n\n\n    if yearstring and not month:\n        sys.stderr.write(\"Whem specifying year you also must specify month!\\n\")\n        usage()\n        sys.exit(1)\n\n    now=time.localtime(time.time())\n\n    if not yearstring:\n        yearstring=time.strftime(\"%Y\",now)\n\n    if not month:\n        month=now[1] # note time() returns 1 .. 12 in this field\n\n\n    if not listname or not lists.has_key(listname):\n        sys.stderr.write(\"List [%s] not known!\\n\" % listname)\n        usage()\n        sys.exit(1)\n\n    archivemail(lists[listname],sys.stdin,yearstring, month)\n\n\nif __name__==\"__main__\":\n            main()\n"
  },
  {
    "path": "contrib/runtest",
    "content": "#!/bin/sh\n#\n\nDIR=`pwd`\nMsg2archive=$DIR/msg2hypermailarchive.py\nTestMsg=$DIR/test-msg\n\nif [ ! -d  ../tests/mail-archive ]; then\n     mkdir ../tests/mail-archive\nfi\n\nif [ ! -d  ../tests/mail-archive/mailbox ]; then\n     mkdir ../tests/mail-archive/mailbox\nfi\n\n#cat test-msg | htestmail -v\n\n# Tests for generic msg2archive executable\n#\n# usage: msg2archive [options] (file on stdin only)\n#        -A archive-basedir      (#define ARCHIVE)\n#        -b about_link           (#define ABOUT_LINK)\n#        -c configfile           (#define CONFIGFILE)\n#        -H hypermail executable (#define HYPERMAIL)\n#        -L listname             (#define LISTNAME)\n#        -l list lable           (#define LABEL)\n#        -M mailbox directory    (#define MAILBOXDIR)\n#        -t testing (no execution, assumes -v)\n#        -v verbose\n\n(cd ../tests; cat $TestMsg | $Msg2archive -v -L hypermail-test )\n"
  },
  {
    "path": "docs/Makefile.in",
    "content": "#\n# Hypermail documentation make file\n#\n# This is where the man page goes\n\nprefix=@prefix@\ndatarootdir = @datarootdir@\ndatadir = @datadir@\n\n# Man page base directory\nmandir=@mandir@\n\n# This is where the HTML documentation goes\nhtmldir=@htmldir@\n\n# Installation program \nINSTALL_PROG=@INSTALL@ \n\nall:   install\n\t\nuninstall: \n\trm -f $(mandir)/man1/hypermail.1\n\trm -f $(mandir)/man4/hmrc.4\n\t(if [ -d $(htmldir) ]; then \\\n\t\trm -f $(htmldir)/hr.yellow.png; \\\n\t\trm -f $(htmldir)/hypermail.png; \\\n\t\trm -f $(htmldir)/stars.png; \\\n\t\trm -f $(htmldir)/archive_search.html; \\\n\t\trm -f $(htmldir)/hypermail.html; \\\n\t\trm -f $(htmldir)/hypermail-faq.html; \\\n\t\trm -f $(htmldir)/customizing.html; \\\n\t\trm -f $(htmldir)/hmrc.html; \\\n\t\trmdir $(htmldir); \\\n\tfi)\n\ninstall: install.man install.html\n\ninstall.man:\n\t@(if [ ! -d $(mandir) ]; then mkdir -p $(mandir); fi)\n\t@(if [ ! -d $(mandir)/man1 ]; then mkdir -p $(mandir)/man1; fi)\n\t@(if [ ! -d $(mandir)/man4 ]; then mkdir -p $(mandir)/man4; fi)\n\t$(INSTALL_PROG) -c -m 0644 hypermail.1 $(mandir)/man1\n\t$(INSTALL_PROG) -c -m 0644 hmrc.4 $(mandir)/man4\n\ninstall.html:\n\t@(if [ ! -d $(htmldir) ]; then mkdir -p $(htmldir); fi)\n\t$(INSTALL_PROG) -c -m 0644 hr.yellow.png $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 hypermail.png $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 stars.png $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 archive_search.html $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 hypermail.html $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 hypermail-faq.html $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 customizing.html $(htmldir)\n\t$(INSTALL_PROG) -c -m 0644 hmrc.html $(htmldir)\n\nclean:\nclobber:\ndistclean:\n"
  },
  {
    "path": "docs/archive_search.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n     \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n   <title>Adding a search engine to your Hypermail archives</title>\n   <meta http-equiv=\"Content-Type\" content=\"text/html;CHARSET=iso-8859-1\" />\n   <meta name=\"description\" content=\"hypermail documentation: adding search engine\" />\n   <meta name=\"keywords\" content=\"search, hypermail\" />\n   <meta name=\"Author\" content=\"Bob Crispen\" />\n   <style type=\"text/css\">\n      body, html {\n         color: #000;\n         background: #fff;\n         padding: 0.2em 2em;\n      }\n      pre {\n         color: #000;\n         background: #eee;\n         border: 1px solid #888;\n         padding-top: 1em;\n         margin-top: 0em;\n         white-space: pre;\n      }\n      h1 {\n         text-align: center;\n         font-family: sans-serif;\n         font-weight: bold;\n         background: #deedf8;\n      }\n      h4 {\n         border-top: 1px solid #888;\n         border-left: 1px solid #888;\n         border-right: 1px solid #888;\n         text-align: center;\n         font-family: sans-serif;\n         font-weight: bold;\n         background: #deedf8;\n         padding-bottom: 0em;\n         margin-bottom: 0em;\n      }\n   </style>\n</head>\n<body>\n<h1>Adding a search engine<br />to your Hypermail archives</h1>\n\n<p>One of the feature requests we hear most often is to incorporate\na search engine in Hypermail.  But because everyone has his or her\nown favorite search engine, and since it's hard to imagine a search engine\nthat may not turn out to be unusable\nfor some archives, we haven't built a search engine into hypermail, and\nwe probably won't.</p>\n\n<p>But hypermail's page\ncustomizations make it easy to integrate your own search engine into your\nhypermail archives.</p>\n\n<p>For our example, we're going to put a form box on the top and bottom of\nevery index page, and we'll use the <a href=\"http://swish-e.org/\">swish-e</a>\nsearch engine.  We'll show a typical <a href=\"http://www.php.net/\">PHP</a>\nscript and a typical <a href=\"http://www.cpan.org/\">Perl</a> script that can\nfunction as a glue layer between the web and the search engine.\nThere ought to be enough information here to get you\nstarted regardless of what search engine and scripting language you choose\nfor your site.</p>\n\n<p>Let's begin by modifying the header and footer hypermail puts on each\nindex file.</p>\n\n<p>(1) Create a file called indexheader.hyp containing the following:</p>\n<h4>indexheader.hyp</h4>\n<pre>\n    &lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"&gt;\n    &lt;html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"&gt;\n    &lt;head&gt;\n    &lt;title&gt;%l: %s&lt;/title&gt;\n    &lt;meta http-equiv=\"Content-Type\" content=\"text/html;CHARSET=iso-8859-1\" /&gt;\n    &lt;meta name=\"generator\" content=\"%p %v, see %h\" /&gt;\n    &lt;meta name=\"Subject\" content=\"%s\" /&gt;\n    &lt;meta name=\"Date\" content=\"(nil)\" /&gt;\n    &lt;link rev=\"made\" href=\"mailto:%m\" /&gt;\n    &lt;style type=\"text/css\"&gt;\n        body {color: black; background: #ffffff}\n        h1.center {text-align: center}\n        div.center {text-align: center}\n        .quotelev1 {color : #990099}\n        .quotelev2 {color : #ff7700}\n        .quotelev3 {color : #007799}\n        .quotelev4 {color : #95c500}\n        .headers {background : #e0e0d0}\n        .links {background : #f8f8e0}\n    &lt;/style&gt;\n    &lt;/head&gt;\n    &lt;body&gt;\n    &lt;h1 class=\"center\"&gt;%l&lt;br /&gt;%s&lt;/h1&gt;\n\n    &lt;!-- Your custom code goes below this line --&gt;\n\n    &lt;div class=\"center\"&gt;\n    &lt;form action=\"http://url/of/search.php\" method=\"post\"\n        enctype=\"application/x-www-form-urlencoded\"&gt;\n    &lt;div&gt;\n    &lt;input type=\"hidden\" name=\"db\" value=\"name.of.index\" /&gt;\n    &lt;p class=\"headers\"&gt;\n    &lt;input type=\"text\" name=\"str\" size=\"20\" /&gt;\n    &lt;input type=\"submit\" value=\"Search\" /&gt;\n    &lt;/p&gt;\n    &lt;/div&gt;\n    &lt;/form&gt;\n    &lt;/div&gt;\n\n</pre>\n\n<p>Notice the HTML comment about 2/3 of the way down.  Everything\nabove that line is standard, and ought to be very similar to the default\nheader.  The custom code (below the comment) adds the features you\nwant to add.  In this case, it's a form for a search.</p>\n\n<p>You will, of course, substitute your own URL for search.php for the form's ACTION\nand the name of your own search index for \"name.of.index\".  See the bottom of this page for\nan example of creating a search index file.</p>\n\n<p>If you like the general appearance of the web pages Hypermail creates and\ndon't want to spend a lot of time playing with the HTML, you might want to\nlook at the source of \"index.html\" in the directory for which you're installing\na search engine and just copy the appropriate lines (<i>e.g.</i>, the lines\nabove the first &lt;hr /&gt;) to indexheader.hyp.</p>\n\n<p>(2) Create a file called indexfooter.hyp containing the following:</p>\n\n<h4>indexfooter.hyp</h4>\n<pre>\n    &lt;div class=\"center\"&gt;\n    &lt;form action=\"/url/of/search.php\" method=\"post\"\n        enctype=\"application/x-www-form-urlencoded\"&gt;\n    &lt;div&gt;\n    &lt;input type=\"hidden\" name=\"db\" value=\"name.of.index\" /&gt;\n    &lt;p class=\"headers\"&gt;\n    &lt;input type=\"text\" name=\"str\" size=\"20\" /&gt;\n    &lt;input type\"submit\" value=\"Search\" /&gt;\n    &lt;/p&gt;\n    &lt;/div&gt;\n    &lt;/form&gt;\n    &lt;/div&gt;\n\n    &lt;!-- Your custom code goes above this line --&gt;\n\n    &lt;hr /&gt;\n    &lt;p&gt;&lt;small&gt;&lt;em&gt;\n    This archive was generated by &lt;a href=\"%h\"&gt;%p %v&lt;/a&gt; : %g\n    &lt;/em&gt;&lt;/small&gt;&lt;/p&gt;\n    &lt;/body&gt;\n    &lt;/html&gt;\n\n</pre>\n<p>Since this is a footer file, the common code will be at the end, and\nyou'll put your custom code above the comment.</p>\n\n<p>You may have noted what seem to be superfluous &lt;div&gt; elements in\nthe HTML in the header and footer file.\nThe <a href=\"http://validator.w3.org/\">W3C validator</a> likes them, and\nthey do no harm.</p>\n\n<p>(3) Modify the .hmrc file to point to your custom header and footer:</p>\n\n<h4>.hmrc (excerpt)</h4>\n<pre>\n    # ihtmlheaderfile = [ path to index header template file | NONE ]\n    #\n    # Set this to the path to the Index header template file containing\n    # valid HTML statements and substitution cookies for runtime expansion.\n    # This will be included at the top of every index page.\n    \n    ihtmlheaderfile = /path/to/indexheader.hyp\n    \n    # ihtmlfooterfile = [ path to index footer template file | NONE ]\n    #\n    # Set this to the path to the Index footer template file containing\n    # valid HTML statements and substitution cookies for runtime expansion.\n    # This will be included at the bottom of every index page.\n    \n    ihtmlfooterfile = /path/to/indexfooter.hyp\n\n</pre>\n<p>You'll call hypermail using this .hmrc file to create your archive\nor add a message:</p>\n\n<pre>\n    hypermail -c /path/to/.hmrc [...]\n\n</pre>\n<p>Here's a sample PHP script that performs the minimum functionality\nrequired for \"search.php\":</p>\n\n<h4>search.php</h4>\n<pre>\n    &lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"&gt;\n    &lt;html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"&gt;\n    &lt;head&gt;\n    &lt;title&gt;Search results&lt;/title&gt;\n    &lt;meta http-equiv=\"Content-Type\" content=\"text/html;CHARSET=iso-8859-1\" /&gt;\n    &lt;/head&gt;\n    &lt;body&gt;\n    &lt;div&gt;\n    &lt;?\n        // Very simple search using swish-e (see http://swish-e.org/)\n        // copyright 2003 by Bob Crispen &lt;http://www.crispen.org/&gt;\n        // May be distributed without restriction for any purpose.\n    \n        // This program is distributed in the hope that it will be useful,\n        // but WITHOUT ANY WARRANTY; without even the implied warranty of\n        // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n        // GNU General Public License for more details.\n    \n        // Set these values to the appropriate ones for your system\n        $db_dir = \"/path/to/swish-e-databases/\";          // Directory where\n            // you keep the databases and indexes that swish-e generates\n        $swishe = \"/usr/local/bin/swish-e\";               // swish-e executable\n    \n        // Get arguments from call\n        //  \"str\" -- String to search for\n        //  \"db\"  -- swish-e Database name (e.g., \"site.index\")\n        $str = $_POST[\"str\"];\n        $db  = $_POST[\"db\"];\n    \n        // This script is probably called from a form similar to the one\n        // below.  If you call it without arguments, all it'll do is print\n        // the form.\n    \n        if (($str != \"\") &amp;&amp; ($db != \"\")) {\n            // Prevent shell execution exploit\n            $searchfor = escapeshellarg($str);\n            $database  = escapeshellarg($db_dir . $db);\n    \n            // Do the search\n            $result = `$swishe -H 0 -d '\\t' -w $searchfor -f $database`;\n    \n            // Turn the results into an array\n            $results = split(\"\\n\", $result);\n    \n            // See how many results we have.  Ignore the final blank line.\n            $count = count($results)-1;\n            if ($count &gt; 0) {\n                print(\"Search results for &lt;strong&gt;$searchfor&lt;/strong&gt;:\\n\");\n                print(\"&lt;ul&gt;\\n\");\n                for ($i=0; $i&lt;$count; $i++) {\n                    list($score, $url, $title, $len) = split(\"\\t\", $results[$i], 4);\n                    print(\"&lt;li&gt; &lt;a href=\\\"$url\\\"&gt;$title&lt;/a&gt; [$score]&lt;/li&gt;\\n\");\n                }\n                print(\"&lt;/ul&gt;\\n\");\n            } else {\n                print(\"Sorry, &lt;strong&gt;$searchfor&lt;/strong&gt; not found\\n\");\n            }\n        }\n    \n        // Print a new form so they can continue searching\n        print &lt;&lt;&lt;EOT\n    &lt;form action=\"$PHP_SELF\" method=\"post\"\n        enctype=\"application/x-www-form-urlencoded\"&gt;\n    &lt;div&gt;\n    &lt;input type=\"hidden\" name=\"db\" value=\"$db\" /&gt;\n    &lt;input type=\"text\" name=\"str\" size=\"20\" /&gt;\n    &lt;input type=\"submit\" value=\"Search\" /&gt;\n    &lt;/div&gt;\n    &lt;/form&gt;\n    &lt;/div&gt;\n\n    EOT;\n    ?&gt;\n    &lt;/body&gt;\n    &lt;/html&gt;\n\n</pre>\n\n<p>If you prefer Perl, or if your web server doesn't offer PHP, then you could\nmodify these lines in indexheader.hyp and indexfooter.hyp:</p>\n\n<pre>\n    &lt;form action=\"/url/of/search.php\" method=\"post\"\n        enctype=\"application/x-www-form-urlencoded\"&gt;\n\n</pre>\n\n<p>to</p>\n\n<pre>\n    &lt;form action=\"/url/of/search.pl\" method=\"post\"\n        enctype=\"application/x-www-form-urlencoded\"&gt;\n\n</pre>\n\n<p>Here's a sample script contributed by Perl maven Greg Bacon that\nperforms the minimum functionality required for \"search.pl\":</p>\n\n<h4>search.pl</h4>\n<pre>\n\n    #! /usr/local/bin/perl -T\n    \n    # Perl implementation of Bob Crispen's PHP swish-e search available\n    # at &lt;URL:http://www.crispen.org/doc/hypermail/archive_search.html&gt;\n    # Copyright 2003 Greg Bacon.\n    \n    # Very simple search using swish-e (see http://swish-e.org/)\n    # copyright 2003 by Bob Crispen &lt;http://www.crispen.org/&gt;\n    # May be distributed without restriction for any purpose.\n        \n    # This program is distributed in the hope that it will be useful,\n    # but WITHOUT ANY WARRANTY; without even the implied warranty of\n    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n    # GNU General Public License for more details.\n    \n    use warnings;\n    use strict;\n    \n    my @warnings;\n    \n    BEGIN {\n        $SIG{__WARN__} = sub { push @warnings, @_ };\n    \n        print &lt;&lt;'EOHeader';\n    Content-type: text/html\n    \n    &lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"&gt;\n    &lt;html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"&gt;\n    &lt;head&gt;\n    &lt;title&gt;Search results&lt;/title&gt;\n    &lt;meta http-equiv=\"Content-Type\" content=\"text/html;CHARSET=iso-8859-1\" /&gt;\n    &lt;/head&gt;\n    &lt;body&gt;\n    &lt;div&gt;\n    EOHeader\n    \n        $SIG{__DIE__} = sub {\n            print \"&lt;h1&gt;Error!&lt;/h1&gt;\\n\",\n                  map { \"&lt;pre&gt;$_&lt;/pre&gt;\\n\" } @_;\n        };\n    }\n    \n    use CGI qw/ :standard /;\n    use HTML::Entities;\n    \n    # keep the taint checker happy\n    $ENV{PATH} = \"/bin:/usr/bin:/usr/local/bin\";\n    \n    # ----------------------- Configuration ------------------------\n    \n    # Directory where you keep the databases and\n    # indexes that swish-e generates\n    my $db_dir = \"/path/to/index/\";\n    \n    # swish-e executable\n    my $swishe = \"/path/to/bin/swish-e\";\n    \n    # -------------------- End of Configuration --------------------\n    \n    sub drop_privs {\n        my @temp = ($&gt;, $));\n    \n        my $orig_uid = $&lt;;\n        my $orig_gid = $(;\n    \n        # set effective user and group id to real \n        $&gt; = $&lt;;\n        $) = $(;\n    \n        # Drop privileges\n        $&lt; = $orig_uid;\n        $( = $orig_gid;\n    \n        # Make sure privs are really gone\n        ($&gt;, $)) = @temp;\n        die \"FATAL: can't drop privileges\" unless $&lt; == $&gt; &amp;&amp; $( eq $);\n    }\n    \n    sub search {\n        my $str = shift;\n        my $db  = shift;\n    \n        return unless $str &amp;&amp; $db;\n    \n        my $database = $db_dir . $db;\n        \n        my $pid = open SWISHE, \"-|\";\n        unless (defined $pid) {\n            warn \"failed fork: $!\";\n            return;\n        }\n    \n        my @results;\n    \n        if ($pid) {\n            # parent\n    \n            while (&lt;SWISHE&gt;) {\n                chomp;\n    \n                # swish-e output is four TAB-separated fields, so\n                # we assume lines with three TABs are from swish-e\n                # and all other non-blank lines are warnings\n                if (/\\t.*\\t.*\\t/) {\n                    push @results, [split /\\t/, $_, 4];\n                }\n                else {\n                    push @warnings, $_ if /\\S/;\n                }\n            }\n    \n            close SWISHE\n                or warn $! ? \"Error closing $swishe pipe: $!\"\n                           : \"Exit status $? from $swishe\";\n    \n        }\n        else {\n            # child\n    \n            local $SIG{__WARN__} = sub { print @_ };\n            local $SIG{__DIE__}  = sub { print @_; exit 1 };\n    \n            # 2&gt;&amp;1\n            open STDERR, \"&gt;&amp;STDOUT\" or warn \"WARNING: dup STDOUT: $!\";\n    \n            drop_privs;\n    \n            # Do the search\n            no warnings;\n            exec $swishe, '-H', 0, '-d', '\\t', '-w', $str, '-f', $database\n                or die \"FATAL: exec $swishe: $!\";\n    \n            exit 1;\n        }\n    \n        my $searchfor = encode_entities $str;\n        if (@results) {\n            print \"Search results for &lt;strong&gt;$searchfor&lt;/strong&gt;:\\n\",\n                  \"&lt;ul&gt;\\n\";\n    \n            for (@results) {\n                my($score,$url,$title,$len) = @$_;\n    \n                print qq{  &lt;li&gt; &lt;a href=\"$url\"&gt;$title&lt;/a&gt; [$score]&lt;/li&gt;\\n};\n            }\n    \n            print \"&lt;/ul&gt;\\n\";\n        }\n        else {\n            print(\"Sorry, &lt;strong&gt;$searchfor&lt;/strong&gt; not found\\n\");\n        }\n    }\n    \n    ## main\n    \n    # URL of this page\n    my $me = url -full =&gt; 1;\n    \n    # Get arguments from call\n    #  \"str\" -- String to search for\n    #  \"db\"  -- swish-e Database name (e.g., \"site.index\")\n    my $str = param \"str\";\n    my $db  = param \"db\";\n    \n    # This script is probably called from a form similar to the one\n    # below.  If you call it without arguments, all it'll do is print\n    # the form.\n    \n    my @results = search $str, $db;\n    \n    # Print a new form so they can continue searching\n    print startform,\n          \"&lt;div&gt;\\n\",\n          hidden(db =&gt; $db),\n          textfield(-name =&gt; 'str', -size =&gt; 20),\n          submit('Search'),\n          \"&lt;/div&gt;\\n\",\n          end_form, \"\\n\";\n    \n    if (@warnings) {\n        my $messages = @warnings == 1 ? \"message\" : \"messages\";\n    \n        print &lt;&lt;EOWarningsHead;\n    &lt;p&gt;&lt;hr&gt;\n    &lt;h1&gt;Warnings&lt;/h1&gt;\n    &lt;em&gt;Warning $messages:&lt;/em&gt;\n    &lt;ul&gt;\n    EOWarningsHead\n    \n        for (@warnings) {\n            print \"  &lt;li&gt;&lt;code&gt;$_&lt;/code&gt;&lt;/li&gt;\\n\";\n        }\n    \n        print \"&lt;/ul&gt;\\n\";\n    }\n    \n    print &lt;&lt;EOFooter;\n    \n    &lt;/div&gt;\n    &lt;/body&gt;\n    \n    &lt;/html&gt;\n    EOFooter\n\n</pre>\n\n<p>Swish-e, like many other search engines, requires you to generate\na search index before you perform any searches.  Here's a .conf file for\nswish-e that might generate a reasonable\nsearch index for a hypermail archive of messages about model railroading:</p>\n\n<h4>model-rr.conf</h4>\n<pre>\n    IndexDir /path/to/model-rr-archive\n    IndexFile /path/to/model-rr.index\n    IndexReport 3\n    IndexOnly .html\n    ReplaceRules replace \"/path/to/document_root/\" \"http://www.yoursite.com/\"\n    FileRules filename is attachment.html\n    FileRules filename is author.html\n    FileRules filename is date.html\n    FileRules filename is index.html\n    FileRules filename is subject.html\n    FileRules filename is thread.html\n\n</pre>\n\n<p>This tells swish-e to collect data from all the HTML files in your\nmodel railroading archive <em>except</em> the index pages that hypermail\ngenerates.  That way, all the search results will point directly to the\nmessages themselves.</p>\n\n<p>When you want to build your search index, you'll call swish-e something like this:</p>\n\n<pre>\n    swish-e -v 3 -c /path/to/model-rr.conf &gt; /path/to/model-rr.report 2&gt;&amp;1\n\n</pre>\n<p>Many people do this either in a cron job during off-peak hours or\nthrough a CGI script that they call whenever they update their archive.</p>\n\n<p>You might want to add search logging, page control (so you only\nprint, say, 20 results at a time), some nice CSS, and all sorts of other\nthings to your script.  And if you'd prefer to write your script in\nPython, sh, or Ada, you can do that too.  From here on, it's up to you.</p>\n\n<div>\n-- \n<address>Bob Crispen</address>\n<address>Thursday, June 26, 2003</address>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/attachments.txt",
    "content": "Hypermail can deal with attachments enclosed in MIME messages.\nFor more information on MIME \n\n   + RFC 2045, which specifies the various headers used to describe\n     the structure of MIME messages.\n\n   + RFC 2046, which defines the general structure of the MIME media\n     typing system and defines an initial set of media types,\n\n   + RFC 2047 which describes the  Message Header Extensions for \n     Non-ASCII Text\n\n   + RFC 2048, which specifies various IANA registration procedures\n     for MIME-related facilities, and\n\n   + RFC 2049, which describes MIME conformance criteria and\n     provides some illustrative examples of MIME message formats,\n     acknowledgements, and the bibliography.\n\n   + RFC 2383, which describes Communicating Presentation Information \n     in Internet Messages: The Content-Disposition Header Field.\n\nSaving Attachments:\n-------------------\n  \nWhen hypermail encounters an attachment it saves the attachment to disk as a\nseparate file. The basename of the filepath specified in the message is used\nas the rightmost part of the filename used to store the attachment file,\n\n    <a href=\"att-<msgnum>/<num>-budget.doc\">budget.doc</a>\n\n<msgnum> - The number used for the message in which this attachment was found.\n<num>    - The MIME part number, simply numbered from top-to-bottom in the\n           mail this attachment was found.\n\nIn the event that there is no file name specified in the message then\na random name is generated instead. \n \nHypermail prints a comment in the message HTML file to indicate the message \nhas an attachment and what the name of the attachment file is.\n\n           <!-- attachment=\"filepath1\" -->\n           <!-- attachment=\"filepath2\" -->\n           ...\n           <!-- attachment=\"filepathN\" -->\n\nBesides making it much easier for removal or converter processes, standard\nincremental mailbox updates will be able to recognize that there are\nattachments and use the existing filenames or remove them prior to generating\nnew ones.\n\nAttachment File Modes:\n----------------------\n\n      For security reasons, all binary attachments written to disk get the\n      same file permissions as the ordinary messages. They should never be to\n      be executable, to any user.\n\nControlling archiving of attachments\n-------------------------------------\n\n       The user can control the use of attachments by:\n\n       1. Indicating which mime types should not be stored at all.  \n          (i.e. vcard attachments) (see ignore_types)\n\n       2. Specifying a list with 'preferred' content-types when \n          receiving/decoding mixed/alternative attachments\n          (see prefered_types)\n\n       3. Indicating which content-types of images that is preferred \n          to get in-lined - <img> instead of <a href>.\n          (see inline_types)\n\n       4. Use the 'attachmentlink' config file keyword to control how to\n          \"display\" the attachment. You can for example use this to always\n          display a warning page before the actual attachment is displayed or\n          run by a client.\n\nConfig file additions: \n----------------------\n\n   # For each type to be ignored, put an ignore record for that\n   # type. It is added to the list of ignored types when the config\n   # file is read.\n   #\n   ignore_types = text/x-vcard\n   ignore_types = application/x-msdownload\n\n   #\n   # ordered list, Do the first and if that is not present, \n   # do the next and if that is not present ...\n   #\n   prefered_types = text/plain text/html ...\n\n   #\n   # Determine which image mime types should be inlined for\n   # display in the message. <IMG SRC=..> instead of <A HREF=...>\n   #\n   inline_types = image/gif image/jpeg ...\n\n   #\n   # Format of the attachment links.\n   # %p for the full path to the attachment\n   # %f for the file name part only\n   # %d for the directory name only\n   # %n for the message number\n   # %c for the content type string\n   #\n   attachmentlink = %p\n\nThe readconfigs function is now able to look for more than one entry of\ncertain types of variables. This can be on one line or on multiple lines. This\ntype of parsing is only supported for\n\n\tignore_types\n\tinline_types\n\tprefered_types\n\n\n"
  },
  {
    "path": "docs/customizing.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n   \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<HTML>\n<HEAD>\n<TITLE>Hypermail Documentation</TITLE>\n<LINK REV=\"made\" HREF=\"mailto:webmaster@hypermail.org\">\n</HEAD>\n<BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\">\n<H1 ALIGN=CENTER><IMG SRC=\"hypermail.png\" WIDTH=\"60\" ALIGN=\"middle\" HEIGHT=\"60\" ALT=\"\">&nbsp;&nbsp;&nbsp;Customizing Hypermail Pages</H1>\n\n<HR>\n\n<P>\n<STRONG>Contents:</STRONG>\n<UL>\n  <LI><A HREF=\"#1\">Hypermail Pages</A>\n  <P>\n  <LI><A HREF=\"#2\">Definitions</A>\n  <P>\n  <LI><A HREF=\"#3\">Choosing the Default Look of Your Pages</A>\n    <UL>\n    <LI><A HREF=\"#3-1\">Standard Page HTML</A>\n    <UL>\n      <LI><A HREF=\"#3-1-1\">Index Page Headers</A>\n      <LI><A HREF=\"#3-1-2\">Message Pages</A>\n      <LI><A HREF=\"#3-1-3\">Page Footer</A>\n    </UL>\n    <LI><A HREF=\"#3-2\">Table Menu Display</A>\n  </UL>\n  <P>\n  <LI><A HREF=\"#4\">Using Template Files to Customize Your Pages</A>\n  <UL>\n    <LI><A HREF=\"#4-1\">Substitution Cookies</A>\n    <LI><A HREF=\"#4-2\">Specifying template file locations</A>\n    <UL>\n      <LI><A HREF=\"#4-2-1\">Using Environment Variables</A>\n      <LI><A HREF=\"#4-2-2\">Using Configuration File Entries</A>\n      <LI><A HREF=\"#4-2-3\">Examples</A>\n    </UL>\n    <LI><A HREF=\"#4-3\">Message Pages</A>\n  </UL>\n  <P>\n  <LI><A HREF=\"#5\">Including Reference Links</A>\n  <LI><A HREF=\"#6\">In-lining Images</A>\n  <LI><A HREF=\"#7\">Changing The HTML File Suffix</A>\n</UL>\n\n<P><HR><P>\n\n<H2><A NAME=\"1\" HREF=\"#\">Hypermail Pages</A></H2>\n\nYou can customize hypermail generated pages to suit your local web site\nneeds as well as the needs of the list. \nHypermail generates three types of files:\n<UL>\n<LI>HTML index pages, \n<LI>HTML message pages, \n<LI>MIME enclosure attactment files.\n</UL>\n<P>\nThe attachment files are a copy of the attachment the user included and \nare not altered.  \n<P>\nThis version of hypermail allows you to \ncustomize both index and message pages separately as described below.\n\n<P><HR><P>\n\n<H2><A NAME=\"2\" HREF=\"#\">Definitions</A></H2>\n<P>\nIn the examples below, the following terms are used.\n<P>\n<STRONG><EM>label</EM></STRONG> - the label passed in via the \ncommand line or specified in the list configuration file.\n<P>\n<STRONG><EM>indextype</EM></STRONG> - depends on the type of index being \npresented. It could be <STRONG><EM>By Author, By Date, By Subject, or By \nThread</EM></STRONG>.\n<P>\n<STRONG><EM>mailto-address</EM></STRONG> - the <STRONG>MAILTO</STRONG> \nvalue compiled into hypermail, specified in the environment with the \n<STRONG>HM_MAILTO</STRONG> variable, or specified in the \n<STRONG>hm_mailto</STRONG> variable in the list specific \nconfiguration file.\n<P>\n<STRONG><EM>subject-of-message</EM></STRONG> - the contents of the message's \n<A HREF=\"http://www.faqs.org/rfcs/rfc2822.html\">RFC 2822</A> Subject: \nheader.\n<P>\n<STRONG><EM>HMURL</EM></STRONG> - Used to contain a link to the Hypermail \nDevelopment Center. Defined in hypermail.h.\n<P>\n<STRONG><EM>PROGNAME</EM></STRONG> - contains the name of the executable. \nDefined in hypermail.h.\n<P>\n<STRONG><EM>VERSION</EM></STRONG> - contains the version of the software that\ngenerated the page this appears on. Defined in src/hypermail.h.\n\n<P><HR><P>\n\n<H2><A NAME=\"3\" HREF=\"#\">Choosing the Default Look of Your Pages</A></H2>\n<P>\nThere is no need to customize hypermail pages unless you have a specific\nneed. There are two different default page layouts provided with hypermail,\nthe Table Menu Display and the Standard Display.\n\n<P>\n<H3><A NAME=\"3-1\" HREF=\"#\">Standard Page HTML</A></H3>\n<P>\n\nIf you are not <A HREF=\"#4\">using the HTML template files</A> described \nbelow then Hypermail generates headers and footers that look similar\nto the following. Note that you can substitute a &lt;BODY&gt; statement by\neither defining <STRONG>BODY</STRONG> in options.h or by using the \n<STRONG>hm_body</STRONG> variable in a list specific configuration file.\n\n<P>\n<H4><A NAME=\"3-1-1\" HREF=\"#\">Index Page Headers</A></H4>\n<P>\n\nThe default Index page headers used in hypermail look like:\n\n<BLOCKQUOTE>\n<STRONG>\n<SMALL>\n&lt;!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"&gt;\n<BR>&lt;HTML&gt;\n<BR>&lt;HEAD&gt;\n<BR>&lt;TITLE&gt;<EM>label</EM>:&nbsp;<EM>indextype</EM>&lt;/TITLE&gt;\n<BR>&lt;LINK REV=\"made\" HREF=\"mailto:<EM>mailto-address</EM>\"&gt;\n<BR>&lt;HEAD&gt;\n<BR>&lt;BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\"&gt;\n<BR>&lt;H1 ALIGN=CENTER&gt;<EM>label</EM>&lt;BR&gt;By&nbsp;<EM>indextype</EM>&lt;/H1&gt;\n<BR>&lt;HR WIDTH=400&gt;\n</SMALL>\n</STRONG>\n</BLOCKQUOTE>\n\n<P>\n<H4><A NAME=\"3-1-2\" HREF=\"#\">Message Pages</A></H4>\n<P>\n\nThe default Message page headers used in hypermail look like:\n\n<BLOCKQUOTE>\n<STRONG>\n<SMALL>\n&lt;!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"&gt;\n<BR>&lt;HTML&gt;\n<BR>&lt;HEAD&gt;\n<BR>&lt;TITLE&gt;<EM>label:&nbsp;&nbsp;subject-of-message</EM>&lt;/TITLE&gt;\n<BR>&lt;LINK REV=\"made\" HREF=\"mailto:<EM>mailto-address</EM>\"&gt;\n<BR>&lt;HEAD&gt;\n<BR>&lt;BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\"&gt;\n&lt;H1 ALIGN=CENTER&gt;<EM>subject</EM>&lt;/H1&gt;\n<BR>&lt;HR&gt;\n</SMALL>\n</STRONG>\n</BLOCKQUOTE>\n\n<P>\n<H4><A NAME=\"3-1-3\" HREF=\"#\">Page Footer</A></H4>\n<P>\n\nThe default page footer shown below is used in hypermail on both the \nindex and the message pages look like:\n\n<BLOCKQUOTE>\n<STRONG>\n<SMALL>\n&lt;HR&gt;\n<BR>&lt;P&gt;\n<BR>&lt;SMALL&gt;\n<BR>&lt;EM&gt;\n<BR>This archive was generated by &nbsp;&lt;A HREF=\"HMURL\"&gt;PROGNAME VERSION&lt;/A&gt; on DATE and TIME\n<BR>&lt;/EM&gt;\n<BR>&lt;/SMALL&gt;\n<BR>&lt;/BODY&gt;\n<BR>&lt;/HTML&gt;\n</SMALL>\n</STRONG>\n</BLOCKQUOTE>\n\n<P>\n<H3><A NAME=\"3-2\" HREF=\"#\">Table Menu Display</A></H3>\n<P>\n\nThe table menu display generates pages that have a menu bar at the top\nand the bottom of the page that looks something like the following. If\nyou have enabled the \"About\" and \"Other Archives\" links are displayed if\nyou have enabled them in options.h, the environment variables or in the\nlist configuration file.  A example page:\n\n<H1 ALIGN=CENTER>TITLE HERE</H1>\n<P>\n<DIV ALIGN=CENTER>\n<TABLE BORDER=2 WIDTH=\"100%\">\n<TR>\n<TH><A HREF=\"mailto:hypermail@hypermail.org\">New Message</A></TH>\n<TH><A HREF=\"mailto:hypermail@hypermail.org?subject=Re:%20TITLE%20HERE\">Reply</A></TH>\n<TH><A HREF=\"http://www.hypermail.org/\">About this list</A></TH>\n<TH><A HREF=\"customizing.html\">Date view</A></TH>\n<TH><A HREF=\"customizing.html\">Thread view</A></TH>\n<TH><A HREF=\"customizing.html\">Subject view</A></TH>\n<TH><A HREF=\"customizing.html\">Author view</A></TH>\n</TR>\n</TABLE>\n</DIV>\n<P>\n<STRONG>Kent Landfield</STRONG> (<A HREF=\"mailto:kent@landfield.com?subject=Re:%20TITLE%20HERE\"><EM>kent@landfield.com</EM></A>)<BR>\n<EM>Wed, 17 Jun 1998 22:28:29 -0500 (CDT)</EM>\n<P>\n<UL>\n<LI><STRONG>Next message:</STRONG> <A HREF=\"customizing.html\">Kent Landfield: \"Re: Getting started\"</A>\n<LI><STRONG>Previous message:</STRONG> <A HREF=\"customizing.html\">Crispen, Bob: \"RE: Ideas\"</A>\n<LI><STRONG>Next in thread:</STRONG> <A HREF=\"customizing.html\">Andrew Kuchling: \"Re: Getting started\"</A>\n</UL>\n<HR>\n<P ALIGN=CENTER><STRONG><EM>BODY OF MESSAGE HERE</EM></STRONG></P>\n<HR>\n<P>\n<UL>\n<LI><STRONG>Next message:</STRONG> <A HREF=\"customizing.html\">Kent Landfield: \"Ideas\"</A>\n<LI><STRONG>Next in thread:</STRONG> <A HREF=\"customizing.html\">Guido van Rossum: \"Re: Getting started\"</A>\n</UL>\n<DIV ALIGN=CENTER>\n<TABLE BORDER=2 WIDTH=\"100%\">\n<TR>\n<TH><A HREF=\"mailto:hypermail@hypermail.org\">New Message</A></TH>\n<TH><A HREF=\"mailto:hypermail@hypermail.org?subject=Re:%20TITLE%20HERE\">Reply</A></TH>\n<TH><A HREF=\"http://www.hypermail.org/\">About this list</A></TH>\n<TH><A HREF=\"customizing.html\">Date view</A></TH>\n<TH><A HREF=\"customizing.html\">Thread view</A></TH>\n<TH><A HREF=\"customizing.html\">Subject view</A></TH>\n<TH><A HREF=\"customizing.html\">Author view</A></TH>\n</TR>\n</TABLE>\n</DIV>\n\n<P>\n<SMALL>\n<EM>\nThis archive was generated by <A HREF=\"http://www.hypermail.org/\">hypermail 2.0x</A> \non <EM>Thu Jun 04 1998 - 10:05:34 CDT</EM>\n</EM>\n</SMALL>\n<P>\nIf you do not want to use the table display then make sure that \n<STRONG>USETABLE</STRONG> is not defined in options.h and the \n<STRONG>hm_usetable</STRONG> is not enabled in the list configuration file.\nWhen you do so you will get the standard look and feel of the hypermail \nyou have grown acustomed to.\n\n<P>\n\nAlso note that <STRONG>New Message</STRONG> allows you to provide a means\nfor someone to post a message to the list. This feature is currently only \navailabe on the Table Menu Display. It can be enabled or disabled by defining\n<STRONG>HMAIL</STRONG> in options.h or by setting the <STRONG>hm_hmail</STRONG>\nvariable in the list specific configuration file.\n \n<P><HR><P>\n\n<H2><A NAME=\"4\" HREF=\"#\">Using Template Files to Customize Your Pages</A></H2>\n<P>\nYou can customize your page headers and footers by specifying HTML template\nfiles. Hypermail reads template files and uses those in generating the header\nand footer sections of the index and message pages.  Template files contain \nthe actual HTML that you want used when generating the pages. Template files \nmay also contain \"Substitution Cookies\".\n\n<P>\n<H3><A NAME=\"4-1\" HREF=\"#\">Substitution Cookies</A></H3>\n<P>\nYou can insert \"substitution cookies\" in the header and footer template \nfiles so the appropriate information is filled in at runtime.\n<P>\n<STRONG>Substitution cookies supported:</STRONG>\n<P>\n<BLOCKQUOTE>\n<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=\"75%\">\n<TR><TD><STRONG>%%</STRONG></TD><TD>- '%' character</TD></TR>\n<TR><TD><STRONG>%~</STRONG></TD><TD>- Storage directory</TD></TR>\n<TR><TD><STRONG>%a</STRONG></TD><TD>- Other Archives URL</TD></TR>\n<TR><TD><STRONG>%b</STRONG></TD><TD>- About Archive URL</TD></TR>\n<TR><TD><STRONG>%e</STRONG></TD><TD>- Email address of message Author - Not valid on index pages</TD></TR>\n<TR><TD><STRONG>%g</STRONG></TD><TD>- Date and time archive generated</TD></TR>\n<TR><TD><STRONG>%h</STRONG></TD><TD>- HMURL</TD></TR>\n<TR><TD><STRONG>%i</STRONG></TD><TD>- Message-id - Not valid on index pages</TD></TR>\n<TR><TD><STRONG>%l</STRONG></TD><TD>- Archive label</TD></TR>\n<TR><TD><STRONG>%m</STRONG></TD><TD>- Mailto address</TD></TR>\n<TR><TD><STRONG>%p</STRONG></TD><TD>- PROGNAME</TD></TR>\n<TR><TD><STRONG>%s</STRONG></TD><TD>- Subject of message or Index Title</TD></TR>\n<TR><TD><STRONG>%v</STRONG></TD><TD>- VERSION</TD></TR>\n<TR><TD><STRONG>%u</STRONG></TD><TD>- Expanded version link (HMURL,PROGNAME,VERSION)</TD></TR>\n<TR><TD><STRONG>\\n</STRONG></TD><TD>- newline character</TD></TR>\n<TR><TD><STRONG>\\t</STRONG></TD><TD>- tab character</TD></TR>\n</TABLE>\n</BLOCKQUOTE>\n<P>\n<STRONG>Additional cookies generate the complete HTML lines:</STRONG>\n<BLOCKQUOTE>\n<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=\"75%\">\n<TR><TD><STRONG>%A</STRONG></TD><TD>- Author META HTML - Not valid on index pages</TD></TR>\n<TR><TD><STRONG>%B</STRONG></TD><TD>- BODY HTML statement</TD></TR>\n<TR><TD><STRONG>%S</STRONG></TD><TD>- Subject META HTML</TD></TR>\n</TABLE>\n</BLOCKQUOTE>\n\n<P>\n<H3><A NAME=\"4-2\" HREF=\"#\">Specifying template file locations</A></H3>\n<P>\nYou can specify the location of the template files either via environment \nvariables or via entries in the list specific configuration file.\n<P>\n<H4><A NAME=\"4-2-1\" HREF=\"#\">Using Environment Variables</A></H4>\n<P>\nIf you wish to use environment variables, make sure they are exported and\ncorrectly available for hypermail to use. How to do this is dependent on\nthe type of shell in use. See the appropriate man pages if you need more\ninformation.\n<UL>\n<LI><STRONG>HM_IHTMLHEADERFILE</STRONG> - the location of the INDEX header template.\n<LI><STRONG>HM_IHTMLFOOTERFILE</STRONG> - the location of the INDEX footer template. \n<LI><STRONG>HM_MHTMLHEADERFILE</STRONG> - the location of the MESSAGE header template. \n<LI><STRONG>HM_MHTMLFOOTERFILE</STRONG> - the location of the MESSAGE footer template. \n</UL>\n<P>\n<H4><A NAME=\"4-2-2\" HREF=\"#\">Using Configuration File Entries</A></H4>\n<P>\nAn easy way is to tell hypermail where the template files are is via a\nlist specific configuration file.  The following entries can be used.\n<P>\n<UL>\n<LI><STRONG>hm_ihtmlheaderfile</STRONG> - the location of the INDEX header template.\n<LI><STRONG>hm_ihtmlfooterfile</STRONG> - the location of the INDEX footer template. \n<LI><STRONG>hm_mhtmlheaderfile</STRONG> - the location of the MESSAGE header template. \n<LI><STRONG>hm_mhtmlfooterfile</STRONG> - the location of the MESSAGE footer template. \n</UL>\n\n<P>\n<H4><A NAME=\"4-2-3\" HREF=\"#\">Examples</A></H4>\n<P>\n\nIt is acceptable to have a single configuration file listed in more than\none entry. Suppose you want to have a common footer for all pages and\nseparate headers. The following example shows that.\n<P>\n<BLOCKQUOTE>\nhm_ihtmlheaderfile = /lists/wu-ftpd/wu-ftpd-index.hyp<BR>\nhm_mhtmlheaderfile = /lists/wu-ftpd/wu-ftpd-msg.hyp<BR>\nhm_ihtmlfooterfile = /lists/wu-ftpd/wu-ftpd-msgfooter.hyp<BR>\nhm_mhtmlfooterfile = /lists/wu-ftpd/wu-ftpd-msgfooter.hyp\n</BLOCKQUOTE>\n<P>\n\nIf an entry is left blank and a location is not specified via an environment\nvariable then the hypermail default headers are used.\n<P>\n<BLOCKQUOTE>\nhm_ihtmlheaderfile = /lists/wu-ftpd/wu-ftpd-index.hyp<BR>\nhm_ihtmlfooterfile = <BR>\nhm_mhtmlheaderfile = /lists/wu-ftpd/wu-ftpd-msg.hyp<BR>\nhm_mhtmlfooterfile = /lists/wu-ftpd/wu-ftpd-msgfooter.hyp<BR>\n</BLOCKQUOTE>\n\nThe above example informs hypermail to use the template files listed for \nthe Index header and the Message header and footer. The hypermail default \npage footer would be used on the index pages.\n<P>\n\n<STRONG>NOTE:</STRONG> While it is not necessary to provide absolute paths, \nit is a good idea to.\n\n<P>\n<H3><A NAME=\"4-3\" HREF=\"#\">Message Pages</A></H3>\n<P>\n\nEach HTML file that is generated for a message contains (where applicable):\n<P>\n<UL>\n<LI>the subject of the article,\n<LI>the name and email address of the sender,\n<LI>the date the article was sent,\n<LI>links to the next and previous messages in the archive,\n<LI>a link to the message the article is in reply to, and\n<LI>a link to the message next in the current thread.\n</UL>\n\n<P><HR><P>\n\n<H3><A NAME=\"5\" HREF=\"#\">Including Reference Links</A></H3>\n<P>\n\nReference links such as the following \n\n<UL>\n<LI><STRONG>Next message:</STRONG> <A HREF=\"customizing.html\">Kent Landfield: \"Re: Getting started\"</A>\n<LI><STRONG>Previous message:</STRONG> <A HREF=\"customizing.html\">Crispen, Bob: \"RE: Ideas\"</A>\n<LI><STRONG>Next in thread:</STRONG> <A HREF=\"customizing.html\">Andrew Kuchling: \"Re: Getting started\"</A>\n</UL>\n\nare normally included on each of the message pages. If this\nis not what you want you can disable them by using the \n<STRONG>SHOW_MESSAGE_LINKS</STRONG>\ndefine in options.h or the <STRONG>hm_show_msg_links</STRONG>\nin the list's configuration file.\n\n<P>\n\nAdditionally, if you want to list <STRONG>all</STRONG> replies to a message \nsuch as the following,\n\n<UL>\n<LI><STRONG>In reply to:</STRONG> <A HREF=\"customizing.html\">Kent Landfield: \"Getting started\"</A>\n<LI><STRONG>Reply:</STRONG> <A HREF=\"customizing.html\">Guido van Rossum: \"Re: Getting started\"</A>\n<LI><STRONG>Reply:</STRONG> <A HREF=\"customizing.html\">Andrew Kuchling: \"Re: Getting started\"</A>\n<LI><STRONG>Reply:</STRONG> <A HREF=\"customizing.html\">Kent Landfield: \"Re: Getting started\"</A>\n</UL>\n\nyou can do so by setting the <STRONG>SHOWREPLIES</STRONG>\ndefine in options.h or the <STRONG>hm_showreplies</STRONG>\nin the list's configuration file.\n\n<P><HR><P>\n\n<H3><A NAME=\"6\" HREF=\"#\">In-lining Images</A></H3>\n<P>\nIt is possible to have images that are sent in email automatically\ndisplayed when the message is presented. To do this you need to set\nthe <STRONG>hm_inline_types</STRONG> in the list configuration file.\n\n<P>\nFor example, if you listed\n<BLOCKQUOTE>\nhm_inline_types = image/gif image/jpeg\n</BLOCKQUOTE>\nthen both GIF files and JPEG files would be displayed as part of the\nmessage. Types that are not \"in-lined\" are linked as a simple attachment\nrequiring the user to click on it to have it displayed.\n\n<P><HR><P>\n\n<H3><A NAME=\"7\" HREF=\"#\">Changing The HTML File Suffix</A></H3>\n<P>\nYou may wish to have the pages generated use a different HTML file\nsuffix other than the default &quot;.html&quot;. To do this you need\nto either set the default define <STRONG>HTMLSUFFIX</STRONG> in options.h, \nset the environment variable <STRONG>HM_HTMLSUFFIX</STRONG> or set it in \nthe list's configuration file by using the <STRONG>hm_htmlsuffix</STRONG>\nvariable.  \n<P>\n<STRONG>Note:</STRONG>\nDo not include a &quot;.&quot; in the suffix; If you do \nyou will end up with filenames that look like. &quot;..html&quot;\n\n<P><HR><P>\n<H2>See Also</H2>\n<BLOCKQUOTE>\n<STRONG>hypermail.(1)</STRONG>,\n&nbsp;\n<STRONG>hmrc.(4)</STRONG>,\n&nbsp;\n<STRONG><A HREF=\"hypermail.html\">Hypermail</A></STRONG>\n&nbsp;\nand\n&nbsp;\n<STRONG><A HREF=\"hmrc.html\">Hypermail List Configuration File</A></STRONG>.\nand <STRONG><A HREF=\"archive_search.html\">Adding a Search Engines to your Hypermail Archive</A></STRONG>\n</BLOCKQUOTE>\n\n<HR>\n<SMALL><EM><STRONG>\nLast updated April 10, 2003\n</STRONG></EM></SMALL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "docs/hmrc.4",
    "content": ".TH hmrc 4 \"July 19, 2018\"\n.SH NAME\nhmrc \\- Hypermail configuration file \n.SH DESCRIPTION\n.B Hypermail\ncan use a configuration file to allow you to customize the individual \naspects of a list.  In past versions of hypermail it was necessary for \nall hmrc variables to begin with 'hm_'.  While still supported, it is \nnot necessary to use the 'hm_' prefix any longer and this document\nreflects that. [This page may be out of date. See the hmrc.html file for\ncomplete and up to date info.]\n.RE\n.LP\nIn the configuration file, blank lines and lines beginning with a hash mark\n.RB ( # )\nare considered comments and are ignored.  The format of the \"options\" need to\nbe in lowercase and separated with an equals\n.RB ( = )\nsign, such as:\n.LP\n.PD 0\n.RS\n.B option = value\n.LP\n.B mbox = \"/home/john/my_mailbox\"\n.LP\n.B filemode = 0600\n.PD\n.RE\n.LP\nYou can specify which configuration file to use on the command line or, if \nnot specified, Hypermail will use the one specified as\n.B CONFIGFILE\nin options.h.  If the first character is \"~\", Hypermail will look for the \nfile under the current user's home directory.\n.SH CONFIGURATION OPTIONS\n.TP\nBelow is a list of variables that Hypermail understands. \n.LP\nBoolean numbers can have the value of\n.B 0\nor\n.B 1.\n.TP\n.B language = two letter language specification\nThis is a two-letter string specifying the default language to use, or a\nlonger string specifying a language and locale.\nSet this the value of the language table you wish to use when running\nand generating archives. \n\n.in 10\n.B Current supported languages:\n\n      de (de_DE) - German\n      en (en_US) - English\n      es (es_ES) - Spanish\n      fi (fi_FI) - Finnish\n      fr (fr_FR) - French\n      el (el) - Greek\n      gr (el_GR) - Greek\n      is (is_IS) - Icelandic\n      no (no_NO) - Norwegian\n      pl (pl_PL) - Polish\n      pt (pt_BR) - Brazilian Portuguese\n      ru (ru_RU) - Russian\n      sv (sv_SE) - Swedish\n\n.nr\nThe directory /usr/share/i18n/locales on many systems has the locale\ncodes that are available on that system.\n\n.TP\n.B mbox = \"filename\"\nThis is the mailbox to read messages in from.  Set this with a value of\n.B \"NONE\"\nto read from standard input.\n.TP\n.B ietf_mbox = boolean_number\nSetting this variable to\n.B 1\nwill tell hypermail that the mbox is formatted according to the IETF\nmbox convention: all lines, except for the envelope, are prefixed with a\n.B >\nchar.\n.TP\n.B linkquotes = [ 0 | 1 ]\nSet this to On to create fine-grained links from quoted\ntext to the text where the quote originated. It also improves\nthe threads index file by more accurately matching messages\nwith replies. Note that this may be rather cpu intensive (see\nthe searchbackmsgnum option to alter the performance).\n.TP\n.B eurodate = boolean_number\nSet this to\n.B 1\nto display article received dates with days before months instead of months \nbefore days.\n.TP\n.B folder_by_date = strftime date format\nThis string causes the messages to be put in subdirectories\nby date. The string will be passed to strftime(3) to generate\nsubdirectory names based on message dates. Suggested values are\n\"%y%m\" or \"%b%y\" for monthly subdirectories, \"%Y\" for\nyearly, \"%G/%V\" for weekly. Do not alter this for an existing\narchive without removing the old html files. If you use this\nand update the archive incrementally (e.g. with -u), you must\nuse the usegdbm option.\n.TP\n.B msgsperfolder = number\nPut messages in subdirectories with this many messages per\ndirectory. Do not use this and folder_by_date on the same archive.\nDo not alter this for an existing archive without removing the old\nhtml files. Deleted/expired messages ARE COUNTED for the purpose\nof deciding how many messages to put in a subdirectory.\n.TP\n.B increment = [ 0 | 1 | -1 ]\nDefine as\n.B 1\nto append all input messages to the end of existing archives.\n Define as\n.B 0\nfor it to read a mailbox that corresponds to the entire\narchive. (See the mbox_shortened option for\nan exception to the requirement that it be the entire archive).\nIf there are any existing html messages, it will figure out which\nones at the end of the mailbox are new, and add only those that haven't been\nconverted yet.\n Define as\n.B -1\nto have hypermail figure out whether the input\nis entirely new messages to be appended or whether it contains\nmessages that are already in the archive. A value of -1 cannot be\nused with the mbox_shortened option or with the -i command line\noption or with mbox = NONE.\n.TP\n.B label = \"label name\"\nDefine this as the label to put in archives. \n.TP\n.B dir = \"directory\"\nThis is the directory that Hypermail will look for when creating and\nupdating archives.  If defined as\n.B \"NONE\"\nthe directory will have the same name as the input mailbox.\n.LP\n.in 10\nUsing date substitution cookies, you can tell Hypermail to archive \nmessages in directories by the date they were received.\n.LP\n.in 10\n.B Substitution cookies supported\n\n    %d - two digit day of month (1-28/30/31)\n    %D - three letter day of the week\n    %m - two digit month of year (1-12)\n    %M - three letter month of year (Jan, ..., Dec)\n    %y - four digit year (1990,..2001)\n.LP\n.in 10\nFor example, if you wished to have Hypermail archive files by year and month,\nyou might use\n.LP\n.in 20\n.B dir = /lists/somelist/%y/%M\n.LP\n.in 10\nWhen a message was processed it would be put into a directory \n.B /lists/somelist/1998/Jun \n(if the message is processed in June of 1998).  If the message arrives and there \nis no storage directory, Hypermail will automatically create it and store \nthe message in the new directory.\n Note that the date that Hypermail was run will be used, not\na date from the message (use the folder_by_date option to\nhave Hypermail use dates from messages).\n.TP\n.B dateformat = strftime date format\nFormat used in \n.B strftime(3) \ncall for displaying dates.\nSee \n.B strftime(3) \nfor the valid conversion specifications.\n.TP\n.B stripsubject = \"string\"\nA string to be stripped from all subject lines. Helps unclutter\nmailing lists which add tags to subject lines.\n.TP\n.B archives = \"URL\"\nThis will create a link in the archived index pages labeled\n.I \"Other mail archives\"\nto the specified URL.  Set this to\n.B \"NONE\"\nto omit such a link.\n.TP\n.B custom_archives = HTML text\nIf this variable is defined, a navigation entry will be\ncreated below the sorted_by_x list entry, with the text\n.I Other mail archives:\nfollowed by the value of this variable. Set it to\n.B NONE\nto ommit such an entry.\n.TP\n.B about = \"URL\"\nThis will create a link in the archived index pages labeled\n.I \"About this archive\"\nto the specified URL.  Set this to\n.B \"NONE\"\nto omit such a link.\n.TP\n.B usemeta = boolean_number\nThis option allows you to use metadata to store the content type of a MIME\nattachment and, later on,  when a user browses the attachment, send back\nthis information in the HTTP Content-Type header.  When set to\n.B 1,\nthe Content-Type\nheader of  a MIME attachment will be stored in a metadata\nfile.  Let us say that the MIME attachments for a message are stored in\ndirectory\n.B att-num.\nThe metadata for those attachments will then be stored in directory\n.B att-num/.meta.\nIf a MIME attachment is stored in file\n.B att-file,\nits metadata will be stored in file\n.B att-file.meta.\nThis convention is directly compatible with the Apache server handling of\nmetada.\n.TP\n.B userobotmeta = boolean_number\nIf a message has annotations for robots and\n.B usemeta\nis enabled, \nsetting this option to\n.B 1\nwill associate the value of the annotations to each attachment using the\nexperimental\n.B X-Robots-Tag\nHTTP header. For more information, browse https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag\n.TP\n.B indextable = boolean_number\nSetting this variable to \n.B 1\nwill tell Hypermail to generate an message index \nSubject/Author/Date listings using a table format.  \nSet to \n.B 0 \nif you want the standard Hypermail index page look and feel. \n.TP\n.B reverse = boolean_number\nSetting this variable to\n.B 1\nwill reverse-sort the article entries in the date and thread index files \nby the date they were received.  That is, the most recent messages will \nappear at the top of the index rather than the other way around.\n.TP\n.B showheaders = boolean_number\nSet this to\n.B 1\nto show the article header lines in the archived HTML files.  These \nlines typically include the\n.B \"To:\", \"From:\",\nand\n.B \"Subject:\"\ninformation found in most email messages.\n.TP\n.B showhtml = [ 0 | 1 | 2 ]\nSet this to\n.B 1\nto show the articles in a proportionally-spaced font rather than a \nfixed-width (monospace) font.\nSet this to\n.B 2\nfor more complex conversion to html similar to that in\n.B txt2html.pl.\nShowhtml = 2 will normally produce nicer looking results than\nshowhtml = 1, and showhtml = 0 will look pretty dull, but\n1 and 2 run risks of altering the appearance in undesired ways.\n.TP\n.B showbr = boolean_number\nSet this to\n.B 1\nto place\n.B <br>\ntags at the end of article lines.  Otherwise, all non-quoted article lines \nwill word wrap.  This only takes effect if\n.B showhtml\nis enabled.\n.TP\n.B iquotes = boolean_number\nSet this to\n.B 1\nto italicize quoted lines.\n.TP\n.B show_msg_links = boolean_number\nSet this to\n.B 1\nto put the individual message links at the top of the individual\nmessage pages.  Set this to\n.B 0\nto produce pages without the Next, Previous, Reply, In-Reply-To, etc.  links.\n.TP\n.B showreplies = boolean_number\nSet this to\n.B 1\nto show all replies to a message as links in article files.\n.TP\n.B discard_dup_msgids = boolean_number\nSet this to \n.B 0\nto accept messages with a Message-ID matching that of a message \nalready in this archive.  By default such messages are discarded.\n.TP\n.B require_msgids = boolean_number\nSet this to \n.B 0\nto accept messages without a Message-ID header.  Set this to \n.B 1\nto discard messages without a Message-ID header.  By default such \nmessages are discarded.\n.TP\n.B fragment_prefix =  \"string\"\nPut this string before the message number in each URI fragment. The defaul\nprefix is\n.B msg.\n.TP\n.B email_address_obfuscation = boolean_number\nSet to\n.B 1\nto enable email address obfuscation using numeric character references.\nOption \n.B disabled\nby default.\n.TP\n.B i18n = boolean_number\nEnable I18N features, hypermail must be linked with \n.B libiconv.\nOption\n.B disabled\nby default.\n.TP\n.B i18n_body = boolean_number\nTranslate message body into UTF-8. The\n.B i18n\nconfiguration option must be\n.B  enabled.\nOption\n.B disabled\nby default.\n.TP\n.B htmlmessage_edited = \"string\"\nSet this to HTML markup you want to appear in the body of manually \nedited messages. Option\n.B disabled\nby default.\n.TP\n.B htmlmessage_deleted_other = \"string\"\nSet this to HTML markup you want to appear in the body of deleted \nmessages (by reasons other than spam). Option\n.B disabled\nby default.\n.TP\n.B htmlmessage_deleted_spam = \"string\"\nSet this to HTML markup you want to appear in the body of deleted \nmessages (by spam reasons). Option \n.B disabled\nby default.\n.TP\n.B spamprotect = boolean_number\nSet this to \n.B 1\nto make hypermail not output real email addresses in the output\nHTML, but instead obfuscate them a little.  By default email\naddresses are obfuscated.\n.TP\n.B antispam_at = \"string\"\nSet this to \n.B 1\nmake hypermail use something like \"_at_\" instead of the RFC 2822 @ address\nseparator.\n.TP\n.B spamprotect_id = boolean_number\nSet this to \n.B 1\nto make hypermail not output real email message\nids in HTML comments (sometimes used internally by hypermail) but\ninstead it will obfuscate them a little so they don't look like\nemail addresses to spammers.\n.TP\n.B attachmentsindex = boolean_number\nSet this to\n.B 0\nto make hypermail not output an index of articles with attachments.\nBy default hypermail outputs this index.\n.TP\n.B mailto = \"address\"\nThe address of the contact point that is put in the HTML header line \n   <LINK REV=made HREF=mailto:MAILTO>\n.br\nSetting this to\n.B \"NONE\"\ndisables <LINK...> header generation.\n.TP\n.B mailcommand = \"command\"\nThis specifies the mail command to use when converting email addresses to \nlinks.  The variables\n.B $TO, $SUBJECT,\nand\n.B $ID\ncan be used in constructing the command string.\n.LP\n.in 10\n.B $TO\nrepresents the address to send mail to,\n.LP\n.in 10\n.B $SUBJECT\nrepresents the subject that is being replied to, and\n.LP\n.in 10\n.B $ID\nrepresents the message ID of the article that is being replied to. \n.LP\n.in 10\nIf \ndefined as\n.B \"NONE\",\nemail addresses will not be converted to links in articles.  A possible \ncommand one could use is\n.B \"mailto:$TO?subject=$SUBJECT\"\nand the Subject: would also be filled in.\nThis can be changed to specify a CGI program such as\n.B \"/cgi-bin/mail?to=$TO\".\nA CGI mail program is included with the source which can be used for \nthis purpose.\n.TP\n.B domainaddr = \"domainname\"\nSet this to the domainname you want added to a mail address appearing \nin the RFC822 field which lack a hostname.  When the list resides on the \nsame host as the user sending the message, it is often not required of\nthe MTA to domain-ize these addresses for delivery.  In such cases, \nHypermail will add the DOMAINADDR to the email address.  If defined as\n.B \"NONE\",\nthis feature is turned off.\n.TP\n.B htmlsuffix = \"suffix\"\nUse this to specify the html file suffix to be used when Hypermail \ngenerates the html files.  This is dependent on local needs.  Do not \nput a '.' in the value.  It would result in \"file..html\", probably \nnot what you want. \n.TP\n.B describe_folder = \"string describing folder\"\nControls the labels used in folders.html to describe the\ndirectories created by the folder_by_date or msgsperfolder\noptions. For folder_by_date labels, the describe_folder string\nwill be passed to strftime(3) the same as the folder_by_date string.\nFor msgsperfolder:\n\n  %d for the directory number (starts with 0)\n  %D for the directory number (starts with 1)\n  %m for the number of the first message in the directory\n  %M for the number of the last message that can be put in the directory.\n\n.TP\n.B latest_folder = \"string\"\nIf folder_by_date or msgsperfolder are in use, create\na symbolic link by this name to the most recently created\nsubdirectory. Note that many web servers are configured to\nnot follow symbolic links for security reasons. The link will\nbe created in the directory specified by the \"dir\" or \"-d\" option.\n.TP\n.B noindex_onindex = boolean_number\nTells hypermail to add a\n.B noindex\nmetadata to its generated message indexes (by author, etc.), to instruct robots\nto not index the indexes. See\n.B anontated\nfor further discussion on the\n.B noindex\nmetadata value.\n.TP\n.B base_url = \"url\"\nThe url of the archive's main directory. This is needed when\nthe latest_folder option is used and the folder_by_date makes\ndirectories more than one level deep (e.g. with '%y/%m').\n.TP\n.B iso2022jp = boolean_number\nSet this to On to support ISO-2022-JP messages.\n.TP\n.B uselock = boolean_number\nControls whether to use hypermail's built-in locking mechanism.  By default,\nthis option is set to \n.B 1.\nSet it to \n.B 0\nif you have an external locking mechanism,\nlike, for example, when using procmail or smartlist.\n.TP\n.B locktime = number-of-seconds\nSet this to the number of seconds that a lock should be honored\nwhen processing inbound messages.  Defaults to 3600 seconds.\n.TP\n.B annotated = \"list of headers\"\nThis is the list of headers that indicate that a message was annotated. Option\n.B disabled\nby default.\n\nIn an annotated message, the values of the header specify the type of\nannotations. The header may have one or more comma-separated values. Order and\ncase are not important. Hypermail recognizes two types of\nannotations:\n.B content\nand\n.B robot\nannotations. \n\n.B \"Content annotations\"\ngive information to the reader about how an archive maintainer has operated on\nan original received message. This operation typically happens as a belated\naction, for example, when removing spam from an existing archive.  Content\nannotations can have one, and only one, of the following values:\n\n.in 18\n.I spam\nmessage deleted because it is spam;\n.br\n.in 18\n.I deleted\nmessage deleted, other reasons;\n.br\n.in 18\n.I edited\noriginal received message was manually edited.\n.in 14\n\nIf a message specifies more than one content annotation, only the first one\nwill be taken into account. You can customize the markup that\\'s shown for\ncontent annotations by means of the\n.I \"htmlmessage_deleted_other,\"\n.I \"htmlmessage_deleted_spam,\"\nand \n.I \"htmlmessage_edited\"\ndirectives.\n\n.B Robot annotations\ninstruct a visiting web robot if the contents of a message should be indexed\nand/or if the outgoing links from the message should be followed, doing so thru\na specific HTML meta tag.  (browse http://www.robotstxt.org/ for further\ndetails).\n\n.B Robot annotations\ncan have either one or both of the following values:\n\n.in 18\n.I \"nofollow\"\ndo not follow outgoing HTML links from this file;\n.br\n.in 18\n.I \"noindex\"\ndo not index the contents of this file.\n.in 14\n\nYou can use one or both values and combine them with the edited content annotation.\nNote that\n.I spam\nand\n.I deleted\nannotations have an implicit robot\n.I \"noindex\"\nannotation. \nIn such case, user supplied robot annotations values will be silently ignored.\n\nUse \n.B userobotmeta\nfor associating attachments with annotations for robots.\n\nNOTE: The list maintainer must be careful on whether to accept incoming messages\ncontaining the \n.B annotated\nheader. If the policy is not to allow that header on incoming messages, it must\nbe filtered out before the message is stored or acted upon by hypermail.\n\n.TP\n.B deleted = \"list of headers\"\n.B NOTE:\nthis option has been deprecated by\n.B \"annotated,\"\nbut it will continue being parsed and honored for legacy reasons.\n\nThis is the list of headers that indicate the message should\nnot be displayed if the value of this header is 'yes'.\nThe default is \"X-Hypermail-Deleted X-No-Archive\".\n.TP\n.B expires = \"list of headers\"\nThis is the list of headers that indicate the message should\nnot be displayed if the value of this header is a date in the past.\nThe default value is \"Expires\".\n.TP\n.B delete_older = \"date\"\nAny message older than this date should not be displayed.\nExample: delete_older = \"Wed, 14 Mar 2001 12:59:51 +0200\"\n.TP\n.B delete_newer = \"date\"\nAny message newer than this date should not be displayed.\n.TP\n.B delete_msgnum = \"list of message numbers\"\n This is the list of message numbers that should be deleted from the\nhtml archive. The mbox is not changed.\n.TP\n.B delete_level = [ 0 | 1 | 2 | 3 ]\n 0 - remove deleted and expired files. Note that with this choice threading may be screwed up if there are replies to deleted or expired options and the archive is updated incrementally\n 1 - remove message body\n 2 - remove message body for deleted messages, leave expired messages\n 3 - leave all messages\nDeleted and expired messages are removed from the index files\nregardless of the delete_level selection. The default is 1.\n.TP\n.B delete_incremental =  boolean_number\nIf this option is enabled, hypermail will perform deletions on old\nmessages when run in incremental mode (according to the other delete\nconfiguration options). Note that depending on your hypermail setup,\nthe size of the archive, and the complexity of the markup,\nthere may be memory and parsing issues, specifically when there are\nnon-deleted replies to a deleted message.\nIf this option is disabled, deleted messages will only be removed\nwhen rebuilding the whole archive. Option\n.B enabled\nby default.\n.TP\n.B txtsuffix = \"suffix\"\n If you want the original mail messages archived in individual files,\nset this to the extension that you want these messages to have\n(recommended value: txt).\n.TP\n.B filter_out = \"list of patterns\"\nDelete from the html archives any message having a header line\nwhich matches any of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same\nsyntax as Perl regular expressions.\n.TP\n.B filter_require = \"list of patterns\"\nDelete from the html archives any message not having header lines\nwhich match each of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same\nsyntax as Perl regular expressions.\n.TP\n.B filter_out_full_body = \"list of patterns\"\nDelete from the html archives any message having a line\nwhich matches any of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same\nsyntax as Perl regular expressions.\n.TP\n.B filter_require_full_body = \"list of patterns\"\nDelete from the html archives any message not having lines\nwhich match each of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same\nsyntax as Perl regular expressions.\n.TP\n.B save_alts = [ 0 | 1 | 2 ]\nThis controls what happens to alternatives (other than the prefered\nalternative) for multipart/alternative messages.\n 0 - discard non-prefered alternatives\n 1 - show all alternatives inline\n 2 - put non-prefered alternatives in a separate file.\n.TP\n.B alts_text = \"string\"\nIf save_alts is 1, this text is put between the alternatives.\nIf save_alts is 2, this text is used to describe the link to each\nalternative file.\n.TP\n.B warn_suppressions = boolean_number\nSet this to On to get warnings (on stdout) about messages that\nare not converted because of they are missing a msgid (if\nrequire_msgids is On) or because one of the following options\nsuppressed it: deleted expires delete_msgnum filter_out\nfilter_require filter_out_full_body filter_require_full_body.\n.TP\n.B unsafe_chars = \"characters\"\nAny characters listed in this string are removed from user-specified\nattachment filenames. Those characters will be replaced by a \"_\"\n(which means that specifying \"_\" here won't have any effect).\nNote that many characters (including / and ) are removed by the\nsafe_filename in parse.c regardless of what this option says. There\nmight be some security problems that can be prevented if you specify\n\".\" here (e.g. if a web server is configured to enable server side\nincludes on filenames ending in something other than .shtml), but\nthat will prevent browsers from recognizing many file types.\n.TP\n.B files_by_thread = boolean_number\nSet this to On to generate (in addition to the usual files),\na file for each thread that contains all the messages in that thread.\n.TP\n.B href_detection = boolean_number\nSet this to On to assume that any string on the body of the message\nthat says <A HREF=\" ... </A> is a URL, together with its markup\nand treat it as such.\n.TP\n.B mbox_shortened = boolean_number\nSet this to On to enable use of mbox that has had some of its\ninitial messages deleted. Requires usegdbm = 1 and increment = 0.\nThe first message in the shortened mbox must have a Message-Id header.\nIf discard_dup_msgids is 0, the first message in the shortened mbox\nmay not have the same Message-Id as a message that was deleted.\nThe mbox may not be altered in any way other than deleting from\nbeginning of the mbox or appending new messages to the end (unless\nyou rebuild the archive from scratch using a complete mbox).\n.TP\n.B report_new_folder = boolean_number\nSet this to On to have it print (on stdout) the names of any\nnew directories created pursuant to the folder_by_date or\nmsgsperfolder option, or the initial creation of the archive.\nIt will print the full path if that is what you use to specify\nthe archive directory. Does not print anything when attachment\nor metadata directories are created.\n.TP\n.B report_new_file = boolean_number\nSet this to On to have it print (on stdout) the names of any\nnew files created for new messages. It will print the full path\nif that is what you use to specify the archive directory.\n.TP\n.B startmsgnum = number\nSets the number of the first message of an archive. This option is\nonly active when adding new messages to brand new archive.\nIf not set, the default number will be 0000.\nNote that if you change this setting, you are stuck with it. If you\nrebuild your archive, you must use the same value or you'll break any\nlink pointing to your archive.\n.TP\n.B attachmentlink = attachment link format\n.LP\n.in 10\n.B Substitution cookies supported:\n\n    %p for the full path to the attachment\n    %f for the file name part only\n    %d for the directory name only\n    %n for the message number\n    %c for the content type string\n.TP\n.B dirmode = octal_number\nThis is an octal number representing the permissions that new directories \nare set to when they are created.  If the archives will be made publically \navailable, it's a good idea to define this as\n.B 0755. \n.TP\n.B filemode = octal_number\nThis is an octal number representing the file permissions that new files \nare set to when they are created.  If the archives will be made publically \navailable, it's a good idea to define this as\n.B 0644.\n.TP\n.B overwrite = boolean_number\nSet this to\n.B 1\nto make Hypermail overwrite existing archives. \n.TP\n.B progress = [ 0 | 1 | 2 ]\nSet this to\n.B 1\nor\n.B 2\nto always show a progress report as Hypermail works.  With a setting of 1,\nhypermail overwrites the progress information relating to attachment creation.\nWith a setting of 2, attachment creation information is listed individually\nwith the number of the message the attachments relate to.\nThis is written to stdout.\n.TP\n.B thrdlevels = number\nThis specifies the number of thread levels to outline in the thread index.  For instance, if\n.B thrdlevels\nis\n.B 2,\nreplies to messages will be indented once in the index, but replies to replies, etc., will only be indented once as well.\n.TP\n.B defaultindex = type\nThis specifies the default index that users can view when entering the \narchive.  Valid types are\n.B \"date,\"\n.B \"thread,\"\n.B \"author,\"\nand\n.B \"subject.\"\n.TP\n.B avoid_indices = which_index_files_not_to_use\nThis is a list of index files to not generate. Valid types are\n.B \"date,\"\n.B \"thread,\"\n.B \"author,\"\nand\n.B \"subject.\"\n.TP\n.B ihtmlheaderfile = path\nDefine path as the path to a template file containing valid HTML formatting \nstatements that you wish to included at the top of every index page.  Hypermail\nwill print this file as the header of the index so make sure it contains \n.B <HTML>, <HEAD>, <BODY> \nand other statements that suit your local customized needs. \n.TP\n.B ihtmlfooterfile = path\nDefine path as the path to a template file containing valid HTML formatting \nstatements that you wish to included at the bottom of every index page. \nHypermail will print this file as the trailer of the index so make sure it \ncontains at a minimum a \n.B </BODY>\nand\n.B </HTML> \nstatement.\n.TP\n.B mhtmlheaderfile = path\nDefine path as the path to a template file containing valid HTML formatting \nstatements that you wish to use at the top of every message page.  Hypermail \nwill print this file as the header of the message so make sure it contains \n.B <HTML>, <HEAD>, <BODY> \nand other statements that suit your local customized needs.\n.TP\n.B mhtmlfooterfile = path\nDefine path as the path to a template file containing valid HTML formatting \nstatements you wish to use at the bottom of every message page.  Hypermail \nwill print this file as the trailer of the message so make sure it contains \nat a minimum a \n.B </BODY>\nand\n.B </HTML> \nstatement.\n.TP\n.B hmail =  Mailing_List_Submission_Address\nSet this to the list's submission address.  When enabled, this can be \nused to submit a new message to the list served by the hypermail archive. \n.B \"NONE\" \nmeans don't use it.\n.TP\n.B newmsg_command = \"mailto:$TO\"\nThis specifies the mail command to use when converting the\n.B set_hmail\naddress to links in replies. The variables\n.B $TO, \n.B $SUBJECT,\nand \n.B $ID \ncan be used in constructing the command string.\n.TP\n.B replymsg_command = \"mailto:$TO\"\nThis specifies the mail command to use when converting the\nset_hmail address to links in replies. The variables \n.B $TO, \n.B $SUBJECT,\nand \n.B $ID\ncan be used in constructing the command string. The value\nfrom mailcommand will be used if this option is not specified.\n.TP\n.B inreplyto_command = \"URL\"\nThis gives a URI template to a script that hypermail will link to\nif it's unable to find in the archive's messages the MID corresponding\nto an\n.B In-Reply-To\nheader. The variable\n.B $ID\nis used to specify where the\n.B Message-Identifier value\nwill appear in the link. A possible command one could use is\n.B http://example.org/mid-resolver/$ID.\nThis option is \n.B disabled\nby default.\n.TP\n.B icss_url = \"URL\"\nThis will link an external stylesheet found at the given URL to\nthe index files. This will happen thru a\n.B LINK\nelement in the index document's\n.B HEAD.\nBy default this option is disabled.\n.TP\n.B mcss_url = \"URL\"\nThis will link an external stylesheet found at the given URL to\nthe message files. This will happen thru a\n.B LINK\nelement in the message document's\n.B HEAD.\nBy default this option is disabled.\n.TP\n.B show_headers = list_of_RFC_Headers_to_display\nThis is the list of headers to be displayed if showheaders is set to \n1 (TRUE).  They can be listed comma or space separated all on a single \nline.  If it contains the special character ``*''\n.B hypermail\nwill display all header lines.\n.TP\n.B format_flowed = boolean_number\nSet this option to 1 (TRUE) to support RFC 3676 format=flowed. When this\noption is enabled and a message says it is supporting format=flowed, hypermail\nwill recreate a long-line that has been split into multiple lines as a single one.\n.TP\n.B format_flowed_disable_quoted = boolean_number\nSet this option to 1 (TRUE) if you want to disable RFC 3676 format=flowed\nprocessing on quoted line texts (the ones that begin with one or more '>' characters).\nThis option is always disabled if\n.B format_flowed\nis not enabled.\n.TP\n.B readone = boolean_number\nSet this to\n.B 1\nto specify there is only one message in the input.\n.TP\n.B inlinehtml = boolean_number\nThis is used to make text/html parts to get inlined within the \nmail messages.  If set to\n.B 0\n, HTML-parts will be stored as separate files.\n.TP\n.B text_types = MIME types to be treated as text/plain.\nThis is a list of MIME types that you want hypermail to treat\nexactly as if they were text/plain.  This can be listed \nindividually on multiple lines or comma or space separated \non a single line.\n.TP\n.B prefered_types = which alternative types to use\nWhen mails using multipart/mixed types are scanned, this is the \nlist of alternative MIME types that you want used.  This can be \nlisted individually on multiple lines or comma or space separated \non a single line.  Note: Order is important.\n.TP\n.B inline_types = which_image_types_should_be_inlined\nThis is the list of MIME types that you want inlined as opposed to\nsimply linked into the message.  They can be listed individually on \nmultiple lines or comma or space separated on a single line.\n.TP\n.B inline_addlink = boolean_number\nEnable add inline links to content that is stored in the\nattachments subdirectory.  Option\n.B inline_types\nmust also be enabled. This option is \n.B enabled\nby default.\n.TP\n.B ignore_types = types_of_MIME_attachments_to_ignore \nThis is the list of MIME attachment types that you do not want to\ndo anything with.  They are quietly ignored.  They can be listed \nindividually on multiple lines or comma or space separated on a \nsingle line.\n.TP\n.B applemail_mimehack = [ 0 | 1]\nIn a multipart/alternative message, Apple Mail (as of June/2018)\nis only adding attachments to the text/html related part. Set this\noption to\n.B On\nto force the display of all alternate parts when\nprocessing an Apple Mail message.  If the message has only a\ntext/plain and a text/html alternatives and the preference is for\ntext/plain, the text/html alternative won't be displayed.\nThis option won't be taken into account if your\n.B prefered type\nis text/html\nor if you enabled the\n.B save_alts\noption.\n.B Disabled\nby default.\n.TP\n.B searchbackmsgnum = postive integer\nIf the linkquotes option is on and an incremental update is being\ndone (-u option), this controls the tradeoff between speed and\nthe reliability of finding the right source for quoted text.\nTry to set it to the largest number of messages between a\nmessage and the final direct reply to that message.\n.TP\n.B link_to_replies = [ string | NONE]\nIf the linkquotes option is on, specifying a string here\ncauses it to generate links from original quoted text the\nlocation(s) in replies which quote them. The string\nis used to display the link.\n.TP\n.B quote_hide_threshold = percent (integer)\nIf the linkquotes option is on, setting this to an\ninteger less than 100 will cause it to replace quoted\ntext with one-line links if the percent of lines in the\nmessage body (exluding the signature) consisting of\nquoted text exceeds the number indicated by this option.\n.TP\n.B quote_link_string = [ string | NONE ]\nIf the quote_hide_threshold option is being used, the\nquote_link_string will be used if available to display the\nlink that replaces the quoted text. If no string is specified\nhere, the first line of each section of quoted text will used.\n.TP\n.B monthly_index = [ 0 | 1 ]\nSet this to On to create additional index files broken up\nby month. A summary.html file will provide links to all the\nmonthly indices.\n.TP\n.B yearly_index = [ 0 | 1 ]\nSet this to On to create additional index files broken up\nby year. A summary.html file will provide links to all the\nyearly indices.\n.TP\n.B thread_file_depth = [ 0 | 1 ]\nIf nonzero, break the threads index file into multiple files,\nwith the initial message of each thread in the main index file\nalong with links to files containing the replies. Setting this\nto 1 creates one file for each thread that has replies, and is\nrecommended for archives with over a few hundred messages.\nSetting this greater than 1 will produce multiple levels of files\nfor each thread whose replies are nested by more than 1 level,\nbut that is rarely useful. This option is currently disabled\nif the indextable option is turned on, and probably needs to\nbe less than thrdlevels.\n.LP\n.SH HTML TEMPLATE FILE SUBSTITUTION COOKIES\n.LP\nYou can insert \"substitution cookies\" in the header and footer HTML template \nfiles so appropriate information can be filled in at runtime. \n.LP\n.B Substitution cookies supported: \n.LP\n.nf\n     %% - '%' character\n     %~ - Storage directory\n     %e - Email addres of message author - Not valid on index pages\n     %h - HMURL\n     %i - Message-id - Not valid on index pages\n     %l - Archive label\n     %m - Mailto address\n     %p - PROGNAME\n     %s - Subject of message or Index Title\n     %v - VERSION\n     %u - Expanded version link (HMURL,PROGNAME,VERSION)\n     \\\\n - newline character\n     \\\\t - tab character\n.nr\n.LP\n.B Additional cookies generate the complete META lines: \n.LP\n.nf\n     %A - Author META TAG - Not valid on index pages\n     %D - Date META TAG - Not valid on index pages\n     %S - Subject META TAG \n.nr\n.TP\n"
  },
  {
    "path": "docs/hmrc.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta name=\"generator\" content=\n\"HTML Tidy for HTML5 for Linux/x86 version 5.2.0\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<title>Hypermail - hmrc list configuration</title>\n<link rel=\"author\" href=\"https://github.com/hypermail-project\">\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n<h1 align=\"center\"><img src=\"hypermail.png\" width=\"60\" align=\n\"middle\" height=\"60\" alt=\"\">&nbsp;&nbsp;&nbsp;Hypermail List\nConfiguration File</h1>\n<hr width=\"400\" noshade>\n<p>The hypermail list configuration file is used to specify\n<em>list specific</em> or <em>user specific</em> information to\nhypermail. Comments are denoted by the '#' character at the\nbegining of the line. The file to use can be specified via the -c\ncommand line argument. The default file is .hmrc in the user's home\ndirectory.</p>\n<p>Examples listed on this page are shown <i>in this style</i>. The\ndefault value is shown unless otherwise indicated. <b>Off</b> is\nequivalent to 0, and <b>On</b> is equivalent to 1 for options which\nare either on or off.</p>\n<ul>\n<li><a href=\"#allpages\">Options affecting both messages and index\npages</a>\n<ul>\n<li><a href=\"#locale\">Locale</a>\n<ul>\n<li><a href=\"#language\">language</a> English, German, French,\netc.</li>\n<li><a href=\"#iso2022jp\">iso2022jp</a> Japanese characters</li>\n<li><a href=\"#i18n\">i18n</a> enable Internationalization (i18n)\nfeatures</li>\n<li><a href=\"#eurodate\">eurodate</a> format</li>\n<li><a href=\"#dateformat\">dateformat</a> strftime-style format\nstring</li>\n<li><a href=\"#isodate\">isodate</a> standard YYYY-MM-DD HH:MM:SS\nformat</li>\n<li><a href=\"#gmtime\">gmtime</a> GMT/UTC vs local time</li>\n</ul>\n</li>\n<li><a href=\"#headers\">Headers</a>\n<ul>\n<li><a href=\"#label\">label</a> set the &lt;title&gt;</li>\n<li><a href=\"#hmail\">hmail</a> list submission address</li>\n<li><a href=\"#newmsg_command\">newmsg_command</a> new list message\nmailto</li>\n<li><a href=\"#replymsg_command\">replymsg_command</a> reply\nmailto</li>\n<li><a href=\"#inreplyto_command\">inreplyto_command</a> resolver for\nmessages found outside the archive</li>\n</ul>\n</li>\n<li><a href=\"#misc_pages\">Miscellaneous</a>\n<ul>\n<li><a href=\"#stripsubject\">stripsubject</a> text to be removed\nfrom subject line</li>\n<li><a href=\"#mailcommand\">mailcommand</a> controls most\nmailto's</li>\n<li><a href=\"#mailto\">mailto</a> for &lt;link rev=made\nhref=mailto:</li>\n<li><a href=\"#domainaddr\">domainaddr</a> to append to incomplete\naddresses</li>\n<li><a href=\"#use_sender_date\">use_sender_date</a> which date to\ntrust more</li>\n<li><a href=\"#fragment_prefix\">fragment_prefix</a> how to prefix\neach URI fragment</li>\n<li><a href=\n\"#email_address_obfuscation\">email_address_obfuscation</a> simple\nobfuscation of email addresses</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#index\">Index page options</a>\n<ul>\n<li><a href=\"#index_avail\">Index availability</a>\n<ul>\n<li><a href=\"#folder_by_date\">folder_by_date</a> split into subdirs\nby date</li>\n<li><a href=\"#msgsperfolder\">msgsperfolder</a> split into subdirs\nof n messages</li>\n<li><a href=\"#monthly_index\">monthly_index</a> create monthly index\nfiles</li>\n<li><a href=\"#yearly_index\">yearly_index</a> create yearly index\nfiles</li>\n<li><a href=\"#defaultindex\">defaultindex</a> what goes in\nindex.html</li>\n<li><a href=\"#default_top_index\">default_top_index</a> what goes in\ntop directory index.html</li>\n<li><a href=\"#avoid_indices\">avoid_indices</a> don't generate these\nfiles</li>\n<li><a href=\"#avoid_top_indices\">avoid_top_indices</a> don't\ngenerate these files</li>\n<li><a href=\"#attachmentsindex\">attachmentsindex</a> create these\nfiles</li>\n<li><a href=\"#latest_folder\">latest_folder</a> symlink to recent\nsubdir</li>\n<li><a href=\"#noindex_onindexes\">noindex_onindexes</a> instruct\nrobots to not index hypermail generated indexes</li>\n</ul>\n</li>\n<li><a href=\"#index_body\">Body style</a>\n<ul>\n<li><a href=\"#indextable\">indextable</a> style of message\nlists</li>\n<li><a href=\"#reverse\">reverse</a> sort order, date/thread\nfiles</li>\n<li><a href=\"#reverse_folders\">reverse_folders</a> sort order, list\nof folders</li>\n<li><a href=\"#thrdlevels\">thrdlevels</a> max indentation</li>\n<li><a href=\"#thread_file_depth\">thread_file_depth</a> threads get\ntheir own files</li>\n<li><a href=\"#icss_url\">icss_url</a> stylesheet</li>\n<li><a href=\"#describe_folder\">describe_folder</a> labels for\nsubdirs</li>\n</ul>\n</li>\n<li><a href=\"#footers\">Headers/footers</a>\n<ul>\n<li><a href=\"#archives\">archives</a> link to other archives</li>\n<li><a href=\"#custom_archives\">custom_archives</a> link to other\narchives</li>\n<li><a href=\"#about\">about</a> descriptive link</li>\n<li><a href=\"#ihtmlheaderfile\">ihtmlheaderfile</a> template</li>\n<li><a href=\"#ihtmlfooterfile\">ihtmlfooterfile</a> template</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#messages\">Message page options</a>\n<ul>\n<li><a href=\"#msg_body\">Body style</a>\n<ul>\n<li><a href=\"#showhtml\">showhtml</a> how much conversion to\nhtml?</li>\n<li><a href=\"#href_detection\">href_detection</a> how to handle\nURLs</li>\n<li><a href=\"#showbr\">showbr</a> line wrapping for body</li>\n<li><a href=\"#iquotes\">iquotes</a> italicize quotes</li>\n<li><a href=\"#i18n_body\">i18n_body</a> translate message body into\nUTF-8</li>\n<li><a href=\"#mcss_url\">mcss_url</a> stylesheet</li>\n<li><a href=\"#quote_hide_threshold\">quote_hide_threshold</a> cut\nexcessive quoting</li>\n<li><a href=\"#files_by_thread\">files_by_thread</a> add file with\nall messages in 1 thread</li>\n</ul>\n</li>\n<li><a href=\"#links\">Links</a>\n<ul>\n<li><a href=\"#linkquotes\">linkquotes</a> fine-grained link to\nsource of quoted text</li>\n<li><a href=\"#searchbackmsgnum\">searchbackmsgnum</a> linkquotes\nperformance</li>\n<li><a href=\"#link_to_replies\">link_to_replies</a> fine-grained\nlink to responses</li>\n<li><a href=\"#quote_link_string\">quote_link_string</a> linkquotes\nlabels</li>\n<li><a href=\"#spamprotect\">spamprotect</a> obfuscate email\naddresses</li>\n<li><a href=\"#antispamdomain\">antispamdomain</a> how to obfuscate\naddress</li>\n<li><a href=\"#spamprotect_id\">spamprotect_id</a> obfuscate message\nids</li>\n</ul>\n</li>\n<li><a href=\"#msg_head\">Headers/footers</a>\n<ul>\n<li><a href=\"#showreplies\">showreplies</a> list of messages</li>\n<li><a href=\"#show_msg_links\">show_msg_links</a> next, previous,\nnext in thread</li>\n<li><a href=\"#show_index_links\">show_index_links</a> control links\nto index pages</li>\n<li><a href=\"#showheaders\">showheaders</a> To:, From:,\nSubject:</li>\n<li><a href=\"#show_headers\">show_headers</a> others (Message-ID,\netc)</li>\n<li><a href=\"#format_flowed\">format_flowed</a> support RFC 3676\nformat=flowed</li>\n<li><a href=\n\"#format_flowed_disable_quoted\">format_flowed_disable_quoted</a>\ndisable support for RFC 3676 format=flowed in quoted text</li>\n<li><a href=\"#mhtmlheaderfile\">mhtmlheaderfile</a> template</li>\n<li><a href=\"#mhtmlfooterfile\">mhtmlfooterfile</a> template</li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#attachments\">Attachments</a> <b>Note that some of\nthese may affect security</b>\n<ul>\n<li><a href=\"#inlinehtml\">inlinehtml</a> where to put\ntext/html</li>\n<li><a href=\"#usemeta\">usemeta</a> save Content-Type in meta\nfile</li>\n<li><a href=\"#userobotmeta\">userobotmeta</a> use X-Robots-Tag in\nmeta files to associate attachments with annotations for\nrobots</li>\n<li><a href=\"#text_types\">text_types</a> what types are like\ntext/plain?</li>\n<li><a href=\"#inline_types\">inline_types</a> list what should go on\nmain page</li>\n<li><a href=\"#inline_addlink\">inline_addlink</a> add in-line links\nto attachments</li>\n<li><a href=\"#prefered_types\">prefered_types</a> choose from\nmultipart/mixed</li>\n<li><a href=\"#ignore_types\">ignore_types</a> discard text/x-vcard,\netc</li>\n<li><a href=\"#attachmentlink\">attachmentlink</a> control\nfilenames</li>\n<li><a href=\"#applemail_mimehack\">applemail_mimehack</a> process\nmultipart/alternative as multipart/mixed</li>\n<li><a href=\"#unsafe_chars\">unsafe_chars</a> restrict filename\nchars</li>\n<li><a href=\"#save_alts\">save_alts</a> multipart/alternative\nhandling</li>\n<li><a href=\"#alts_text\">alts_text</a> text for some save_alts\nchoices</li>\n<li><a href=\"#filename_base\">filename_base</a> attachment file\nname</li>\n</ul>\n</li>\n<li><a href=\"#sysadmin\">System Administration</a>\n<ul>\n<li><a href=\"#input\">Message Input</a>\n<ul>\n<li><a href=\"#increment\">increment</a> append new message(s) to old\narchive</li>\n<li><a href=\"#readone\">readone</a> treat input as one message</li>\n<li><a href=\"#mbox\">mbox</a> read messages from this file</li>\n<li><a href=\"#mbox_shortened\">mbox_shortened</a> allow partial\nmbox</li>\n<li><a href=\"#ietf_mbox\">ietf_mbox</a> file format</li>\n<li><a href=\"#discard_dup_msgids\">discard_dup_msgids</a></li>\n<li><a href=\"#require_msgids\">require_msgids</a> discard messages\nwithout ids</li>\n</ul>\n</li>\n<li><a href=\"#filters\">Message Filtering</a>\n<ul>\n<li><a href=\"#filter_out\">filter_out</a> delete files with header\nline(s)</li>\n<li><a href=\"#filter_require\">filter_require</a> delete files\nwithout header line(s)</li>\n<li><a href=\"#filter_out_full_body\">filter_out_full_body</a> delete\nfiles with line(s)</li>\n<li><a href=\n\"#filter_require_full_body\">filter_require_full_body</a> delete\nfiles without line(s)</li>\n</ul>\n</li>\n<li><a href=\"#files\">Filesystem Output</a>\n<ul>\n<li><a href=\"#dir\">dir</a> where the archive goes</li>\n<li><a href=\"#overwrite\">overwrite</a> regenerate old messages</li>\n<li><a href=\"#htmlsuffix\">htmlsuffix</a> .html, .htm, etc</li>\n<li><a href=\"#dirmode\">dirmode</a> chmod directories</li>\n<li><a href=\"#filemode\">filemode</a> chmod html files</li>\n<li><a href=\"#filename_base\">filename_base</a> attachment file\nname</li>\n</ul>\n</li>\n<li><a href=\"#sysmisc\">Miscellaneous</a>\n<ul>\n<li><a href=\"#usegdbm\">usegdbm</a> cache header info</li>\n<li><a href=\"#writehaof\">writehaof</a> write XML archive overview\nfile</li>\n<li><a href=\"#append\">append</a> create mbox archive also</li>\n<li><a href=\"#append_filename\">append_filename</a> name of mbox\noutput</li>\n<li><a href=\"#txtsuffix\">txtsuffix</a> save each raw message</li>\n<li><a href=\"#annotated\">annotated</a> what headers indicate\nmessage annotations</li>\n<li><a href=\"#deleted\">deleted</a> what headers indicate deletion\n<strong>deprecated</strong></li>\n<li><a href=\"#expires\">expires</a> what headers indicate expire\ndate</li>\n<li><a href=\"#delete_older\">delete_older</a> delete messages before\na date</li>\n<li><a href=\"#delete_newer\">delete_newer</a> delete messages after\na date</li>\n<li><a href=\"#delete_msgnum\">delete_msgnum</a> delete these\nmessages</li>\n<li><a href=\"#delete_level\">delete_level</a> what to do with\ndeleted messages</li>\n<li><a href=\"#delete_incremental\">delete_incremental</a> remove\nprevious deleted messages on-the-fly</li>\n<li><a href=\"#htmlmessage_edited\">htmlmessage_edited</a> custom\nmarkup body for edited messages</li>\n<li><a href=\n\"#htmlmessage_deleted_other\">htmlmessage_deleted_other</a> custom\nmarkup body for deleted messages (by reasons other than spam)</li>\n<li><a href=\n\"#htmlmessage_deleted_spam\">htmlmessage_deleted_spam</a> custom\nmarkup body for deleted messages (by spam reasons)</li>\n<li><a href=\"#progress\">progress</a> verbosity</li>\n<li><a href=\"#warn_suppressions\">warn_suppressions</a> warn about\nignored messages</li>\n<li><a href=\"#uselock\">uselock</a> serialize</li>\n<li><a href=\"#locktime\">locktime</a> timeouts</li>\n<li><a href=\"#base_url\">base_url</a></li>\n<li><a href=\"#report_new_folder\">report_new_folder</a> notify when\ncreating directory</li>\n<li><a href=\"#report_new_file\">report_new_file</a> notify when\ncreating new message files</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<h2><a name=\"allpages\" id=\"allpages\">Options affecting both\nmessages and index pages</a></h2>\n<h3><a name=\"locale\" id=\"locale\">Locale</a></h3>\n<dl>\n<dd><a id=\"language\" name=\"language\"></a></dd>\n<dt><strong>language = [ two-or-more-letter-language-id\n]</strong></dt>\n<dd>This is a two-letter string specifying the default language to\nuse, or a longer string specifying a language and locale. Set this\nthe value of the language table you wish to use when running and\ngenerating archives. See also <a href=\"#iso2022jp\">iso2022jp</a>\nand <a href=\"#eurodate\">eurodate</a>.<br>\n<br>\nCurrent supported languages, with their default locales:<br>\n<br>\nde (de_DE) - German<br>\nen (en_US) - English<br>\nes (es_ES) - Spanish<br>\nfi (fi_FI) - Finnish<br>\nfr (fr_FR) - French<br>\nel (el) - Greek<br>\ngr (el_GR) - Greek<br>\nis (is_IS) - Icelandic<br>\nno (no_NO) - Norwegian<br>\npl (pl_PL) - Polish<br>\npt (pt_BR) - Brazilian Portuguese<br>\nru (ru_RU) - Russian<br>\nsv (sv_SE) - Swedish<br>\n<br>\nThe directory /usr/share/i18n/locales on many systems has the\nlocale codes that are available on that system.<br>\n<br>\n<i>language = en</i></dd>\n<dd><a name=\"iso2022jp\" id=\"iso2022jp\"></a></dd>\n<dt><strong>iso2022jp = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to support ISO-2022-JP messages.<br>\n<br>\n<i>iso2022jp = 0</i></dd>\n<dd><a name=\"i18n\" id=\"i18n\"></a></dd>\n<dt><strong>i18n = [ 0 | 1 ]</strong></dt>\n<dd>Enable I18N features, hypermail must be linked with <a href=\n\"http://www.gnu.org/software/libiconv/\">libiconv</a>.<br>\n<br>\n<i>i18n = 1</i> (disabled by default)</dd>\n<dd><a name=\"eurodate\" id=\"eurodate\"></a></dd>\n<dt><strong>eurodate = [ 0 | 1 ]</strong></dt>\n<dd>Set this to reflect how you want dates displayed in the index\nfiles.<br>\nSet as 1 to to use European date format \"DD MM YYYY\".<br>\nDefine as 0 to to use American date format \"MM DD YYYY\".<br>\n<br>\n<i>eurodate = 0</i></dd>\n<dd><a name=\"dateformat\" id=\"dateformat\"></a></dd>\n<dt><strong>dateformat = strftime-date-format</strong></dt>\n<dd>Format used in strftime(3) call for displaying dates.<br>\nSee strftime(3) for the valid conversion specifications.<br>\n<br>\n<i>dateformat = \"%D-%r Z\"</i> (disabled by default)</dd>\n<dd><a name=\"isodate\" id=\"isodate\"></a></dd>\n<dt><strong>isodate = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to display article received dates in YYYY-MM-DD\nHH:MM:SS format. If used with the gmtime option, a Z will be\ninserted between the DD and HH.<br>\n<br>\n<i>isodate = 0</i></dd>\n<dd><a name=\"gmtime\" id=\"gmtime\"></a></dd>\n<dt><strong>gmtime = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to display article received dates using\nGreenwich Mean Time (UTC) rather than local time.<br>\n<br>\n<i>gmtime = 0</i></dd>\n<dd>\n<h3><a name=\"headers\" id=\"headers\">Header options</a></h3>\n<a name=\"label\" id=\"label\"></a></dd>\n<dt><strong>label = [ Title | NONE ]</strong></dt>\n<dd>This is the default title you want to call your archives.<br>\nSet this to NONE to use the name of the input mailbox.<br>\n<br>\n<i>label = Hypermail Development List</i> (default value is\nfilename?????)</dd>\n<dd><a name=\"hmail\" id=\"hmail\"></a></dd>\n<dt><strong>hmail = [ Mailing List Submission Address | NONE\n]</strong></dt>\n<dd>Set this to the list's submission address. When enabled, this\ncan be used to submit a new message to the list served by the\nhypermail archive. \"NONE\" means don't use it.<br>\n<br>\n<i>hmail = hypermail@hypermail.org</i> (disabled by default)</dd>\n<dd><a name=\"newmsg_command\" id=\"newmsg_command\"></a></dd>\n<dt><strong>newmsg_command = [ string ]</strong></dt>\n<dd>This specifies the mail command to use when converting the\nset_hmail address to links in replies. The variables $TO, $SUBJECT,\nand $ID can be used in constructing the command string.<br>\n<br>\n<i>newmsg_command=mailto:$TO</i></dd>\n<dd><a name=\"replymsg_command\" id=\"replymsg_command\"></a></dd>\n<dt><strong>replymsg_command = [ string ]</strong></dt>\n<dd>This specifies the mail command to use when converting the\nset_hmail address to links in replies. The variables $TO, $SUBJECT,\nand $ID can be used in constructing the command string. The value\nfrom the <a href=\"#mailcommand\">mailcommand</a> option will be used\nif this option is not specified.<br>\nThere may be browsers that will benefit from adding something like\n<blockquote>%26In-Reply-To=&amp;lt;$ID&amp;gt;</blockquote>\nto the command, but I've heard no reports of this actually\nworking.<br>\n<br>\n<i>replymsg_command=mailto:$TO?Subject=$SUBJECT</i></dd>\n<dd><a name=\"inreplyto_command\" id=\"inreplyto_command\"></a></dd>\n<dt><strong>inreplyto_command = [ string ]</strong></dt>\n<dd>This specifies a URI template to a script that hypermail will\nlink to if it's unable to find in the archive's messages the MID\ncorresponding to an <em>In-Reply-To</em> header. The variable\n<em>$ID</em> is used to specify where the <em>Message-Identifier\nvalue</em> will appear in the link.<br>\n<br>\n<em>inreplyto_command = http://example.org/mid-resolver/$ID.</em>\n(disabled by default)</dd>\n<dd>\n<h3><a name=\"misc_pages\" id=\"misc_pages\">Miscellaneous</a></h3>\n<a name=\"stripsubject\" id=\"stripsubject\"></a></dd>\n<dt><strong>stripsubject = [ string | NONE ]</strong></dt>\n<dd>A string to be stripped from all subject lines. Helps unclutter\nmailing lists which add tags to subject lines.<br>\n<br>\n<i>stripsubject = NONE</i></dd>\n<dd><a name=\"mailcommand\" id=\"mailcommand\"></a></dd>\n<dt><strong>mailcommand = [ direct mailto | cgi-bin script path |\nNONE ]</strong></dt>\n<dd>This is the mail command that email links go to, for instance\n\"mailto:$TO\" or\n\"/cgi-bin/mail?to=$TO&amp;replyto=$ID&amp;subject=$SUBJECT\"<br>\nIn constructing this command, you can specify variables:<br>\n<br>\n$TO : the email address of the person you're sending mail to.<br>\n$ID : the ID of the message you're replying to.<br>\n$SUBJECT: the subject you're replying to.<br>\n<br>\nNONE disables mailcommand usage.<br>\nThere may be browsers that will benefit from adding something like\n<blockquote>%26In-Reply-To=&amp;lt;$ID&amp;gt;</blockquote>\nto the command, but I've heard no reports of this actually\nworking.<br>\n<br>\n<i>mailcommand = mailto:$TO?Subject=$SUBJECT</i></dd>\n<dd><a name=\"mailto\" id=\"mailto\"></a></dd>\n<dt><strong>mailto = [ email-address | NONE ]</strong></dt>\n<dd>The address of the contact point that is put in the HTML header\nline<br>\n&lt;LINK REV=made HREF=mailto:mailto&gt;<br>\n<br>\nThe &lt;LINK...&gt; header can be disabled by default by setting\nmailto to NONE.<br>\n<br>\n<i>mailto = webmaster@hypermail.org</i> (disabled by default)</dd>\n<dd><a name=\"domainaddr\" id=\"domainaddr\"></a></dd>\n<dt><strong>domainaddr = [ domainname | NONE ]</strong></dt>\n<dd>Domain-ize Addresses -- addresses appearing in the RFC2822\nfield which lack hostname can't be made into proper HREFs. Because\nthe MTA resides on the same host as the list, it is often not\nrequired to domain-ize these addresses for delivery. In such cases,\nhypermail will add the DOMAINADDR to the email address.<br>\n<br>\n<i>domainaddr = hypermail.org</i> (disabled by default)</dd>\n<dd><a name=\"use_sender_date\" id=\"use_sender_date\"></a></dd>\n<dt><strong>use_sender_date = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to have it use the Date: header (created by the\nthe system that sent the message) rather than the date/time the\nmessage was received, for purposes such as putting in folders or\nsorting. Details of which purposes this affects may change in the\nfuture.<br>\n<br>\n<i>use_sender_date = 0</i></dd>\n<dd><a name=\"fragment_prefix\" id=\"fragment_prefix\"></a></dd>\n<dt><strong>fragment_prefix = [ preifx ]</strong></dt>\n<dd>Put this string before the message number in each URI\nfragment.<br>\n<br>\n<i>fragment_prefix = id</i> (default is <em>msg</em>)</dd>\n<dd><a name=\"email_address_obfuscationx\" id=\n\"email_address_obfuscationx\"></a></dd>\n<dt><strong>email_address_obfuscation = [ 0 | 1 ]</strong></dt>\n<dd>Set to 1 to enable email address obfuscation using numeric\ncharacter references.<br>\n<br>\n<i>mail_address_obfuscationx = 1</i> (disabled by default)</dd>\n<dd>\n<h2><a name=\"index\" id=\"index\">Index page options</a></h2>\n<h3><a name=\"index_avail\" id=\"index_avail\">Index\navailability</a></h3>\n<a name=\"folder_by_date\" id=\"folder_by_date\"></a></dd>\n<dt><strong>folder_by_date = [ strftime-date-format ]</strong></dt>\n<dd>This string causes the messages to be put in subdirectories by\ndate. The string will be passed to strftime(3) to generate\nsubdirectory names based on message dates. Suggested values are\n\"%y%m\" or \"%b%y\" for monthly subdirectories, \"%Y\" for yearly,\n\"%G/%V\" for weekly. Do not alter this for an existing archive\nwithout removing the old html files. If you use this and update the\narchive incrementally (e.g. with -u), you must use the <a href=\n\"#usegdbm\">usegdbm</a> option.<br>\n<br>\n<i>folder_by_date = %y%m</i> (disabled by default)</dd>\n<dd><a name=\"monthly_index\" id=\"monthly_index\"></a></dd>\n<dt><strong>monthly_index = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to create additional index files broken up by\nmonth. A summary.html file will provide links to all the monthly\nindices.<br>\n<br>\n<i>monthly_index = 0</i></dd>\n<dd><a name=\"msgsperfolder\" id=\"msgsperfolder\"></a></dd>\n<dt><strong>msgsperfolder = integer</strong></dt>\n<dd>Put messages in subdirectories with this many messages per\ndirectory. Do not use this and folder_by_date on the same archive.\nDo not alter this for an existing archive without removing the old\nhtml files. Deleted/expired messages <strong>are counted</strong>\nfor the purpose of deciding how many messages to put in a\nsubdirectory.<br>\n<br>\n<i>msgsperfolder = 100</i> (disabled by default)</dd>\n<dd><a name=\"yearly_index\" id=\"yearly_index\"></a></dd>\n<dt><strong>yearly_index = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to create additional index files broken up by\nyear. A summary.html file will provide links to all the yearly\nindices.<br>\n<br>\n<i>yearly_index = 0</i></dd>\n<dd><a name=\"defaultindex\" id=\"defaultindex\"></a></dd>\n<dt><strong>defaultindex = [ thread | date | subject | author |\nattachment ]</strong></dt>\n<dd>This indicates the default type of main index hypermail will\ngenerate. Users see this type of index when the archive is first\naccessed. When using the <a href=\n\"#folder_by_date\">folder_by_date</a> or <a href=\n\"#msgsperfolder\">msgsperfolder</a> options, this option applies to\nsubdirectories.<br>\n<br>\n<i>defaultindex = thread</i></dd>\n<dd><a name=\"default_top_index\" id=\"default_top_index\"></a></dd>\n<dt><strong>default_top_index = [ folders | thread | date | subject\n| author | attachment ]</strong></dt>\n<dd>This specifies the default index that users can view when\nentering the top level of an archive that uses the <a href=\n\"#folder_by_date\">folder_by_date</a> or <a href=\n\"#msgsperfolder\">msgsperfolder</a> option.<br>\n<br>\n<i>default_top_index = folders</i></dd>\n<dd><a name=\"avoid_indices\" id=\"avoid_indices\"></a></dd>\n<dt><strong>avoid_indices = [ string ]</strong></dt>\n<dd>This is a list of index files to not generate. Valid types are\ndate, thread, author, and subject. They can be listed individually\non multiple lines or comma or space separated on a single line.\nWhen using the <a href=\"#folder_by_date\">folder_by_date</a> or\n<a href=\"#msgsperfolder\">msgsperfolder</a> options, this option\napplies to subdirectories.<br>\n<br>\n<i>avoid_indices = subject author</i> (disabled by default)</dd>\n<dd><a name=\"avoid_top_indices\" id=\"avoid_top_indices\"></a></dd>\n<dt><strong>avoid_top_indices = [ string ]</strong></dt>\n<dd>This is a list of index files to not generate for the top\ndirectory of an archive using the folder_by_date or msgsperfolder\noption. Valid types are date, thread, author, subject, folders, and\nattachment.<br>\n<br>\n<i>avoid_top_indices = date thread author subject</i></dd>\n<dd><a name=\"attachmentsindex\" id=\"attachmentsindex\"></a></dd>\n<dt><strong>attachmentsindex = [ 0 | 1 ]</strong></dt>\n<dd>Set this to Off to make hypermail not output an index of\nmessages with attachments.<br>\n<br>\n<i>attachmentsindex = On</i></dd>\n<dd><a name=\"latest_folder\" id=\"latest_folder\"></a></dd>\n<dt><strong>latest_folder = [ string ]</strong></dt>\n<dd>If <a href=\"#folder_by_date\">folder_by_date</a> or <a href=\n\"#msgsperfolder\">msgsperfolder</a> are in use, create a symbolic\nlink by this name to the most recently created subdirectory. Note\nthat many web servers are configured to not follow symbolic links\nfor security reasons. The link will be created in the directory\nspecified by the \"dir\" or \"-d\" option.<br>\n<br>\n<i>latest_folder = current</i> (disabled by default)</dd>\n<dd><a name=\"noindex_onindexes\" id=\"noindex_onindexes\"></a></dd>\n<dt><strong>noindex_onindexes = [ 0 | 1 ]</strong></dt>\n<dd>Tells hypermail to add a <strong>noindex</strong> metadata to\nits generated message indexes (by author, etc.), to instruct robots\nto not index the indexes. See <a href=\"#annotated\">anontated</a>\nfor further discussion on <strong>noindex</strong>.<br>\n<br>\n<em>noindex_onindexes = 0</em></dd>\n<dd>\n<h3><a name=\"index_body\" id=\"index_body\">Index body style</a></h3>\n<a name=\"indextable\" id=\"indextable\"></a></dd>\n<dt><strong>indextable = [ 0 | 1 ]</strong></dt>\n<dd>Setting this variable to 1 will tell Hypermail to generate a\nmessage index Subject/Author/Date listings using a table format.\nSet to 0 if you want the standard Hypermail index page look and\nfeel.<br>\n<br>\n<i>indextable = 0</i></dd>\n<dd><a name=\"reverse\" id=\"reverse\"></a></dd>\n<dt><strong>reverse = [ 0 | 1 ]</strong></dt>\n<dd>Setting this variable to 1 will reverse-sort the article\nentries in the date and thread index files by the date they were\nreceived. That is, the most recent messages will appear at the top\nof the index rather than the other way around. Set to 0 if you want\nlatest message on the bottom for date and thread indexes.<br>\n<br>\n<i>reverse = 0</i></dd>\n<dd><a name=\"reverse_folders\" id=\"reverse_folders\"></a></dd>\n<dt><strong>reverse_folders = [ 0 | 1 ]</strong></dt>\n<dd>Setting this variable to On will reverse-sort the list of\nfolders. That is, the most recent folders will appear at the top of\nthe index rather than the other way around.<br>\n<br>\n<i>reverse_folders = 0</i></dd>\n<dd><a name=\"thrdlevels\" id=\"thrdlevels\"></a></dd>\n<dt><strong>thrdlevels = number</strong></dt>\n<dd>This specifies the number of thread levels to outline in the\nthread index. For instance, if thrdlevels is 2, replies to messages\nwill be indented once in the index, but replies to replies, etc.,\nwill only be indented once as well. The normal value is 4.<br>\n<br>\n<i>thrdlevels = 4</i></dd>\n<dd><a name=\"thread_file_depth\" id=\"thread_file_depth\"></a></dd>\n<dt><strong>thread_file_depth = [ 0 | 1 ]</strong></dt>\n<dd>If nonzero, break the threads index file into multiple files,\nwith the initial message of each thread in the main index file\nalong with links to files containing the replies. Setting this to 1\ncreates one file for each thread that has replies, and is\nrecommended for archives with over a few hundred messages. Setting\nthis greater than 1 will produce multiple levels of files for each\nthread whose replies are nested by more than 1 level, but that is\nrarely useful. This option is currently disabled if the indextable\noption is turned on, and probably needs to be less than\nthrdlevels.<br>\n<br>\n<i>thread_file_depth = 0</i></dd>\n<dd><a name=\"icss_url\" id=\"icss_url\"></a></dd>\n<dt><strong>icss_url= [ URL | NONE ]</strong></dt>\n<dd>This option let's you specify an external stylesheet that you\nwould like to link to the index files. The stylesheet will be\nlinked to thru a LINK element in the HEAD in the document's\nHEAD.<br>\nBy default, this option is deactivated.<br>\n<br>\n<i>icss_url =\nhttp://www.w3.org/StyleSheets/Mail/public-messagelist.css</i></dd>\n<dd><a name=\"describe_folder\" id=\"describe_folder\"></a></dd>\n<dt><strong>describe_folder = format string</strong></dt>\n<dd>Controls the labels used in folders.html to describe the\ndirectories created by the <a href=\n\"#folder_by_date\">folder_by_date</a> or <a href=\n\"#msgsperfolder\">msgsperfolder</a> options. For folder_by_date\nlabels, the describe_folder string will be passed to strftime(3)\nthe same as the folder_by_date string.<br>\nFor msgsperfolder:<br>\n%d for the directory number (starts with 0)<br>\n%D for the directory number (starts with 1)<br>\n%m for the number of the first message in the directory<br>\n%M for the number of the last message that can be put in the\ndirectory.<br>\nThe default is the value of folder_by_date if that is selected,\n\"%d\" for msgsperfolder.<br>\n<br>\n<i>describe_folder = \"%b %Y\"</i></dd>\n<dd>\n<h3><a name=\"footers\" id=\"footers\">Index headers/footers</a></h3>\n<a name=\"archives\" id=\"archives\"></a></dd>\n<dt><strong>archives = [ URL | NONE ]</strong></dt>\n<dd>This creates a link in the archived index pages labeled \"Other\nmail archives\". Set this to NONE to omit such a link.<br>\n<br>\n<i>archives = NONE</i></dd>\n<dd><a name=\"custom_archives\" id=\"custom_archives\"></a></dd>\n<dt><strong>custom_archives = [ HTML text | NONE ]</strong></dt>\n<dd>If this variable is defined, a navigation entry will be created\nbelow the sorted_by_x list entry, with the text \"Other mail\narchives: \" followed by the value of this variable. Set it to NONE\nto ommit such an entry.<br>\n<br>\n<i>custom_archives = NONE</i></dd>\n<dd><a name=\"about\" id=\"about\"></a></dd>\n<dt><strong>about = [ URL | NONE ]</strong></dt>\n<dd>This creates a link in the archived index pages labeled \"About\nthis archive\". Set this to NONE to omit such a link.<br>\n<br>\n<i>about = NONE</i></dd>\n<dd><a name=\"ihtmlheaderfile\" id=\"ihtmlheaderfile\"></a></dd>\n<dt><strong>ihtmlheaderfile = [ path to index header template file\n| NONE ]</strong></dt>\n<dd>Set this to the path to the Index header template file. The\ntemplate file contains HTML directives and substitution cookies for\nruntime expansion.<br>\n<br>\n<i>ihtmlheaderfile = /lists/hypermail-idxheader.hyp</i> (disabled\nby default)</dd>\n<dd><a name=\"ihtmlfooterfile\" id=\"ihtmlfooterfile\"></a></dd>\n<dt><strong>ihtmlfooterfile = [ path to index footer template file\n| NONE ]</strong></dt>\n<dd>Set this to the path to the Index footer template file. The\ntemplate file contains HTML directives and substitution cookies for\nruntime expansion.<br>\n<br>\n<i>ihtmlfooterfile = /lists/hypermail-idxfooter.hyp</i> (disabled\nby default)</dd>\n<dd>\n<h2><a name=\"messages\" id=\"messages\">Message page options</a></h2>\n<h3><a name=\"msg_body\" id=\"msg_body\">Body style</a></h3>\n<a name=\"showhtml\" id=\"showhtml\"></a></dd>\n<dt><strong>showhtml = [ 0 | 1 | 2 ]</strong></dt>\n<dd>Set this to 1 to show the articles in a proportionally-spaced\nfont rather than a fixed-width (monospace) font. Setting this\noption to 1 also tells Hypermail to attempt to italicize quoted\npassages in articles.<br>\nSet this to 2 for more complex conversion to html similar to that\nin <a href=\n\"http://www.cs.wustl.edu/~seth/txt2html/\">txt2html.pl</a>.<br>\nShowhtml = 2 will normally produce nicer looking results than<br>\nshowhtml = 1, and showhtml = 0 will look pretty dull, but<br>\n1 and 2 run risks of altering the appearance in undesired ways.<br>\n<br>\n<i>showhtml = 1</i></dd>\n<dd><a name=\"href_detection\" id=\"href_detection\"></a></dd>\n<dt><strong>href_detection = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to assume that any string on the body of the\nmessage that says &lt;A HREF=\" ... &lt;/A&gt; is a URL, together\nwith its markup and treat it as such.<br>\n<br>\n<i>href_detection = 0</i></dd>\n<dd><a name=\"showbr\" id=\"showbr\"></a></dd>\n<dt><strong>showbr = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 if you want article lines to end with the\n&lt;br&gt; tag. Else set to 0 to have non-quoted lines word-wrap.\nOnly takes effect if showhtml is set to 1.<br>\n<br>\n<i>showbr = 1</i></dd>\n<dd><a name=\"iquotes\" id=\"iquotes\"></a></dd>\n<dt><strong>iquotes = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 if you want quoted lines to be shown in italics.\nOnly take effect if showhtml is set to 1.<br>\n<br>\n<i>iquotes = 1</i></dd>\n<dd><a name=\"i18n_body\" id=\"i18n_body\"></a></dd>\n<dt><strong>i18n_body = [ 0 | 1 ]</strong></dt>\n<dd>Translate message body into UTF-8. The <i>i18n</i>\nconfiguration option must be enabled.<br>\n<br>\n<i>i18n_body = 1</i> (disabled by default)</dd>\n<dd><a name=\"mcss_url\" id=\"mcss_url\"></a></dd>\n<dt><strong>mcss_url= [ URL | NONE ]</strong></dt>\n<dd>This option let's you specify an external stylesheet that you\nwould like to link to the message files. The stylesheet will be\nlinked to thru a LINK element in the HEAD in the document's HEAD.\nBy default, this option is inactive.<br>\n<br>\n<i>mcss_url =\nhttp://www.w3.org/StyleSheets/Mail/public-message.css</i></dd>\n<dd><a name=\"quote_hide_threshold\" id=\n\"quote_hide_threshold\"></a></dd>\n<dt><strong>quote_hide_threshold = percent (integer)</strong></dt>\n<dd>If the <a href=\"#linkquotes\">linkquotes</a> option is on,\nsetting this to an integer less than 100 will cause it to replace\nquoted text with one-line links if the percent of lines in the\nmessage body (exluding the signature) consisting of quoted text\nexceeds the number indicated by this option.<br>\n<br>\n<i>quote_hide_threshold = 100</i></dd>\n<dd><a name=\"files_by_thread\" id=\"files_by_thread\"></a></dd>\n<dt><strong>files_by_thread = [ 0 | 1]</strong></dt>\n<dd>Set this to 1 to generate (in addition to the usual files), a\nfile for each thread that contains all the messages in that thread.\nThe first line in each thread of the thread index page links to\nthis file instead of to a single message.<br>\n<br>\n<i>files_by_thread = 0</i></dd>\n<dd>\n<h3><a name=\"links\" id=\"links\">Message page links</a></h3>\n<a name=\"linkquotes\" id=\"linkquotes\"></a></dd>\n<dt><strong>linkquotes = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to create fine-grained links from quoted text to\nthe text where the quote originated. It also improves the threads\nindex file by more accurately matching messages with replies. Note\nthat this may be rather cpu intensive (see the <a href=\n\"#searchbackmsgnum\">searchbackmsgnum</a> option to alter the\nperformance).<br>\n<br>\n<i>linkquotes = 0</i></dd>\n<dd><a name=\"searchbackmsgnum\" id=\"searchbackmsgnum\"></a></dd>\n<dt><strong>searchbackmsgnum = postive integer</strong></dt>\n<dd>If the <a href=\"#linkquotes\">linkquotes</a> option is on and an\nincremental update is being done (-u option), this controls the\ntradeoff between speed and the reliability of finding the right\nsource for quoted text. Try to set it to the largest number of\nmessages between a message and the final direct reply to that\nmessage.<br>\n<br>\n<i>searchbackmsgnum = 500</i></dd>\n<dd><a name=\"link_to_replies\" id=\"link_to_replies\"></a></dd>\n<dt><strong>link_to_replies = [ string | NONE]</strong></dt>\n<dd>If the <a href=\"#linkquotes\">linkquotes</a> option is on,\nspecifying a string here causes it to generate links from original\nquoted text the location(s) in replies which quote them. The string\nis used to display the link.<br>\n<br>\n<i>link_to_replies = NONE</i></dd>\n<dd><a name=\"quote_link_string\" id=\"quote_link_string\"></a></dd>\n<dt><strong>quote_link_string = [ string | NONE ]</strong></dt>\n<dd>If the <a href=\"#quote_hide_threshold\">quote_hide_threshold</a>\noption is being used, the quote_link_string will be used if\navailable to display the link that replaces the quoted text. If no\nstring is specified here, the first line of each section of quoted\ntext will used.<br>\n<br>\n<i>quote_link_string = NONE</i></dd>\n<dd><a name=\"spamprotect\" id=\"spamprotect\"></a></dd>\n<dt><strong>spamprotect = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to make hypermail not output real email\naddresses in the output HTML but instead it will obfuscate them a\nlittle. You can control the obfuscation with <a href=\n\"#antispamdomain\">antispamdomain</a>.<br>\n<br>\n<i>spamprotect = On</i></dd>\n<dd><a name=\"antispamdomain\" id=\"antispamdomain\"></a></dd>\n<dt><strong>antispamdomain = string with invalid\ndomain</strong></dt>\n<dd>By default the spamprotect option only does a small amount of\nmassaging of email addresses. Use this to completely replace the\ndomain from which a message originates (everything after the @)\nwith some string to confuse screen-scraping programs. It is\nprobably wise to make this an invalid mail domain.<br>\n<br>\n<i>antispamdomain = \"email.domain.hidden\"</i> (disabled by\ndefault)</dd>\n<dd><a name=\"spamprotect_id\" id=\"spamprotect_id\"></a></dd>\n<dt><strong>spamprotect_id = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to make hypermail not output real email message\nids in HTML comments (sometimes used internally by hypermail) but\ninstead it will obfuscate them a little so they don't look like\nemail addresses to spammers.<br>\n<br>\n<i>spamprotect_id = On</i></dd>\n<dd>\n<h3><a name=\"msg_head\" id=\"msg_head\">Message page\nheaders/footers</a></h3>\n<a name=\"showreplies\" id=\"showreplies\"></a></dd>\n<dt><strong>showreplies = [ 0 | 1 ]</strong></dt>\n<dd>Set to 1 to show all replies to a message as links in article\nfiles. If this is set to 0 no reply links are generated.<br>\n<br>\n<i>showreplies = 1</i></dd>\n<dd><a name=\"show_msg_links\" id=\"show_msg_links\"></a></dd>\n<dt><strong>show_msg_links = [ 0 | 1 | 3 | 4 ]</strong></dt>\n<dd>Set this to 1 if you want links to Next, Prev, Next thread,\nReply to, etc. displayed on the article pages. Setting this to 0\ndisables these links from appearing on the generated pages. Set it\nto 3 to produce those links only at the top of the message pages,\nor 4 to produce those links only at the bottom of the message.<br>\n<br>\n<i>show_msg_links = 1</i></dd>\n<dd><a name=\"show_index_links\" id=\"show_index_links\"></a></dd>\n<dt><strong>show_index_links = [ 0 | 1 | 3 | 4 ]</strong></dt>\n<dd>Set this to 1 to show links to index pages from the top and\nbottom of each message file. Set it to 0 to avoid those links. Set\nit to 3 to show the links only at the top of the message pages, or\n4 to produce those links only at the bottom of the message.<br>\n<br>\n<i>show_index_links = 1</i></dd>\n<dd><a name=\"showheaders\" id=\"showheaders\"></a></dd>\n<dt><strong>showheaders = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to show the RFC 2822 message headers To:, From:,\nand Subject: information found in the email messages. Set to 0 if\nyou want to hide mail headers in articles.<br>\n<br>\n<i>showheaders = 0</i></dd>\n<dd><a name=\"show_headers\" id=\"show_headers\"></a></dd>\n<dt><strong>show_headers = List of RFC 2822 Headers to\ndisplay</strong></dt>\n<dd>This is the list of headers to be displayed if showheaders is\nset to 1 (TRUE) They can be listed comman or space separated all on\na single line such as<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_headers =\nFrom,Subject,Date,Message-ID<br>\n<br>\nor they can be listed individually or any combination of.<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_headers = From<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_headers = Subject<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_headers = Date<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_headers = Message-ID<br>\n<br>\nIf show_headers contains the special character ``*'', then\nhypermail will display all header lines.<br>\n<strong>NOTE:</strong> Do not put the ':' at the end of the\nheaders.<br>\n<br>\n<i>show_headers = From,Subject,Date,Message-ID</i> (disabled by\ndefault)</dd>\n<dd><a name=\"format_flowed\" id=\"format_flowed\"></a></dd>\n<dt><strong>format_flowed [ 0 | 1 ] (EXPERIMENTAL)</strong></dt>\n<dd>Enable this option to support RFC 3676 format=flowed. When this\noption is enabled and a message says it is supporting\nformat=flowed, hypermail will recreate a long-line that has been\nsplit into multiple lines as a single one.<br>\n<br>\n<em>format_flowed = 1</em> (disabled by default)</dd>\n<dd><a name=\"format_flowed_disable_quoted\" id=\n\"format_flowed_disable_quoted\"></a></dd>\n<dt><strong>format_flowed_disable_quoted [ 0 | 1 ]</strong></dt>\n<dd>Use this option if you want to disable support for\nformat=flowed inside quoted text (the lines starting with one or\nmore '&gt;' characters). This option is always disabled if\n<strong>format_flowed</strong> is not enabled.<br>\n<br>\n<em>format_flowed_disable_quoted = 1</em> (disabled by\ndefault)</dd>\n<dd><a name=\"mhtmlheaderfile\" id=\"mhtmlheaderfile\"></a></dd>\n<dt><strong>mhtmlheaderfile = [ path to message header template\nfile | NONE ]</strong></dt>\n<dd>Set this to the path to the Message header template file. The\ntemplate file contains HTML directives and substitution cookies for\nruntime expansion.<br>\n<br>\n<i>mhtmlheaderfile = /lists/hypermail-msgheader.hyp</i> (disabled\nby default)</dd>\n<dd><a name=\"mhtmlfooterfile\" id=\"mhtmlfooterfile\"></a></dd>\n<dt><strong>mhtmlfooterfile = [ path to message footer template\nfile | NONE ]</strong></dt>\n<dd>Set this to the path to the Message footer template file. The\ntemplate file contains HTML directives and substitution cookies for\nruntime expansion.<br>\n<br>\n<i>mhtmlfooterfile = /lists/hypermail-msgfooter.hyp</i> (disabled\nby default)</dd>\n<dd>\n<h2><a name=\"attachments\" id=\"attachments\">Attachments</a></h2>\n<a name=\"inlinehtml\" id=\"inlinehtml\"></a></dd>\n<dt><strong>inlinehtml [ 0 | 1 ]</strong></dt>\n<dd>Define to On to make text/html parts to get inlined with the\nmails. If set to Off, HTML-parts will be stored as separate files.\nA \"Content-Disposition: attachment;\" line in the mail will cause an\nHTML-part to be stored as a separate file even if this option is\nOn.<br>\n<br>\n<i>inlinehtml = 1</i></dd>\n<dd><a name=\"usemeta\" id=\"usemeta\"></a></dd>\n<dt><strong>usemeta [ 0 | 1 ]</strong></dt>\n<dd>This option allows you to use metadata to store the content\ntype of a MIME attachments and, later on, when a user browses the\nattachment, send back this information in the HTTP Content-Type\nheader. When set to <strong>1</strong>, the Content-Type header of\na MIME attachment will be stored in a metadata file.<br>\nLet us say that the MIME attachments for a message are stored in\ndirectory <strong>att-num</strong>. The metadata for those\nattachments will then be stored in directory\n<strong>att-num/.meta</strong>. If a MIME attachment is stored in\nfile <strong>att-file</strong>, its metadata will be stored in file\n<strong>att-file.meta</strong>. This convention is directly\ncompatible with the Apache server handling of metadata.<br>\n<br>\n<i>usemeta = 0</i></dd>\n<dd><a name=\"userobotmeta\" id=\"userobotmeta\"></a></dd>\n<dt><strong>userobotmeta [ 0 | 1 ]</strong></dt>\n<dd>If a message has annotations for robots and <a href=\n\"#usemeta\">usemeta</a> is enabled, setting this option to\n<strong>1</strong> will associate the value of the annotations to\neach attachment using the experimental\n<strong>X-Robots-Tag</strong> HTTP header. For more information,\nbrowse Google's <a href=\n\"https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag\">\nRobots Meta Tag documentation</a>.<br>\n<br>\n<em>userobotmeta = 0</em></dd>\n<dd><a name=\"text_types\" id=\"text_types\"></a></dd>\n<dt><strong>text_types = list of types to be the same as\ntext/plain</strong></dt>\n<dd>This is a list of MIME types that you want hypermail to treat\nexactly as if they were text/plain. They can be listed individually\non multiple lines or comma or space separated on a single line.<br>\n<br>\n<i>text_types = text, text/plain, message/rfc2822</i> (disabled by\ndefault)</dd>\n<dd><a name=\"inline_types\" id=\"inline_types\"></a></dd>\n<dt><strong>inline_types = indicate data types data to be\ninlined</strong></dt>\n<dd>This is the list of MIME types that you want inlined as opposed\nto simply linked into the message. They can be listed individually\non multiple lines or comma or space separated on a single line.<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline_types = image/gif\nimage/jpeg<br>\nor<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline_types = image/gif<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline_types = image/jpeg<br>\n<br>\n<i>inline_types = image/gif image/jpeg</i></dd>\n<dd><a name=\"inline_addlink\" id=\"inline_addlink\"></a></dd>\n<dt><strong>inline_addlink = [ 0 | 1 ]</strong></dt>\n<dd>Set to On to add inline links to content that is stored in the\\\nattachments subdirectory. <strong>inline_types</strong> must be\nenabled.<br>\n<br>\n<i>inline_addlink = 1</i> (enabled by default)</dd>\n<dd><a name=\"prefered_types\" id=\"prefered_types\"></a></dd>\n<dt><strong>prefered_types = multipart/mixed types to\npresent</strong></dt>\n<dd>When mails using multipart/mixed or multipart/alternative types\nare scanned, this list of MIME types defines which part you want\npresented in the result.<br>\n<br>\n<i>prefered_types = text/plain, text/html</i></dd>\n<dd><a name=\"ignore_types\" id=\"ignore_types\"></a></dd>\n<dt><strong>ignore_types = indicate types of attachments to\nignore</strong></dt>\n<dd>This is the list of MIME attachment types that you do not want\nto do anything with. They are quietly ignored and are not\nprocessed. They can be listed individually on multiple lines or\ncomma or space separated on a single line.\n<p>Two special types may be used here:<br>\n$BINARY - ignore all types that would be stored as separate\nfiles.<br>\n$NONPLAIN - ignore all types not treated as text/plain, and all\n$BINARY types.<br>\nNote: the behavior of these may be affected by the <a href=\n\"#inlinehtml\">inlinehtml</a> option.</p>\n<p><br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ignore_types = text/x-vcard\napplication/x-msdownload<br>\nor<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ignore_types = text/x-vcard<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ignore_types =\napplication/x-msdownload<br>\n<br>\n<i>ignore_types = text/x-vcard<br>\nignore_types = application/x-msdownload</i></p>\n</dd>\n<dd><a name=\"attachmentlink\" id=\"attachmentlink\"></a></dd>\n<dt><strong>attachmentlink = attachment-link-format</strong></dt>\n<dd>Format of the attachment links.<br>\n<br>\n%p for the full path to the attachment<br>\n%f for the file name part only<br>\n%d for the directory name only<br>\n%n for the message number<br>\n%c for the content type string<br>\n<br>\n<i>attachmentlink = \"%p\"</i></dd>\n<dd><a name=\"applemail_mimehack\" id=\"applemail_mimehack\"></a></dd>\n<dt><strong>applemail_mimehack [ 0 | 1 ]</strong></dt>\n<dd>In a multipart/alternative message, Apple Mail (as of\nJune/2018) is only adding attachments to the text/html related\npart. Set this option to On to force the display of all alternate\nparts when processing an Apple Mail message. If the message has\nonly a text/plain and a text/html alternatives and the preference\nis for text/plain, the text/html alternative won't be displayed.\nThis option won't be taken into account if your prefered type is\ntext/html or if you enabled the save_alts option.<br>\n<i>applemail_mimehack = 0</i> (disabled by default)</dd>\n<dd><a name=\"unsafe_chars\" id=\"unsafe_chars\"></a></dd>\n<dt><strong>unsafe_chars = list of chars to prohibit</strong></dt>\n<dd>Any characters listed in this string are removed from\nuser-specified attachment filenames. Those characters will be\nreplaced by a \"_\" (which means that specifying \"_\" here won't have\nany effect). Note that many characters (including / and \\) are\nremoved by the safe_filename in parse.c regardless of what this\noption says. There might be some security problems that can be\nprevented if you specify \".\" here (e.g. if a web server is\nconfigured to enable server side includes on filenames ending in\nsomething other than .shtml), but that will prevent browsers from\nrecognizing many file types.<br>\n<br>\n<i>unsafe_chars = \".\"</i> (disabled by default)</dd>\n<dd><a name=\"save_alts\" id=\"save_alts\"></a></dd>\n<dt><strong>save_alts = [ 0 | 1 | 2 ]</strong></dt>\n<dd>This controls what happens to alternatives (other than the\nprefered alternative) for multipart/alternative messages.<br>\n0 - discard non-prefered alternatives<br>\n1 - show all alternatives inline<br>\n2 - put non-prefered alternatives in a separate file.<br>\n<br>\n<i>save_alts = 0</i></dd>\n<dd><a name=\"alts_text\" id=\"alts_text\"></a></dd>\n<dt><strong>alts_text = descriptive text</strong></dt>\n<dd>If save_alts is 1, this text is put between the\nalternatives.<br>\nIf save_alts is 2, this text is used to describe the link to each\nalternative file.<br>\n<br>\n<i>alts_text = \"alternate version of message\"</i> (the default if\nsave_alts = 2)<br>\n<i>alts_text = \"&lt;hr&gt;\"</i> (the default if save_alts = 1)</dd>\n<dd>\n<h2><a name=\"sysadmin\" id=\"sysadmin\">System administration</a></h2>\n<h3><a name=\"input\" id=\"input\">Message input</a></h3>\n<a name=\"increment\" id=\"increment\"></a></dd>\n<dt><strong>increment = [ -1 | 0 | 1 ]</strong></dt>\n<dd><br>\nDefine as 1 to append all input messages to the end of existing\narchives.<br>\nDefine as 0 for it to read a mailbox that corresponds to the entire\narchive. (See the <a href=\"#mbox_shortened\">mbox_shortened</a>\noption for an exception to the requirement that it be the entire\narchive). If there are any existing html messages, it will figure\nout which ones at the end of the mailbox are new, and add only\nthose that haven't been converted yet.<br>\nDefine as -1 to have hypermail figure out whether the input is\nentirely new messages to be appended or whether it contains\nmessages that are already in the archive. A value of -1 cannot be\nused with the mbox_shortened option or with the -i command line\noption or with mbox = NONE.<br>\n<br>\n<i>increment = 0</i></dd>\n<dd><a name=\"readone\" id=\"readone\"></a></dd>\n<dt><strong>readone = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to specify there is only one message in the\ninput.<br>\n<br>\n<i>readone = 0</i></dd>\n<dd><a name=\"mbox\" id=\"mbox\"></a></dd>\n<dt><strong>mbox = [ filename | NONE ]</strong></dt>\n<dd>This is the default mailbox to read messages in from. Set this\nwith a value of NONE to read from standard input as the\ndefault.<br>\n<br>\n<i>mbox = NONE</i></dd>\n<dd><a name=\"mbox_shortened\" id=\"mbox_shortened\"></a></dd>\n<dt><strong>mbox_shortened = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to enable use of mbox that has had some of its\ninitial messages deleted. Requires usegdbm = 1 and increment = 0.\nThe first message in the shortened mbox must have a Message-Id\nheader. If <a href=\"#discard_dup_msgids\">discard_dup_msgids</a> is\n0, the first message in the shortened mbox may not have the same\nMessage-Id as a message that was deleted. The mbox may not be\naltered in any way other than deleting from beginning of the mbox\nor appending new messages to the end (unless you rebuild the\narchive from scratch using a complete mbox).<br>\n<br>\n<i>mbox_shortened = 0</i></dd>\n<dd><a name=\"ietf_mbox\" id=\"ietf_mbox\"></a></dd>\n<dt><strong>ietf_mbox = [ 0 | 1 ]</strong></dt>\n<dd>Setting this variable to 1 will tell hypermail that the mbox is\nformatted according to the IETF mbox convention: all lines, except\nfor the envelope, are prefixed with a &gt; char.<br>\n<br>\n<i>ietf_mbox = 0</i></dd>\n<dd><a name=\"discard_dup_msgids\" id=\"discard_dup_msgids\"></a></dd>\n<dt><strong>discard_dup_msgids = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 0 to accept messages with a Message-ID matching\nthat of a message already in this archive. By default such messages\nare discarded.<br>\n<br>\n<i>discard_dup_msgids = 1</i></dd>\n<dd><a name=\"require_msgids\" id=\"require_msgids\"></a></dd>\n<dt><strong>require_msgids = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 0 to accept messages without a Message-ID\nheader.<br>\nSet this to 1 to discard messages without a Message-ID header.<br>\nBy default such messages are discarded.<br>\n<br>\n<i>require_msgids = 1</i></dd>\n<dd>\n<h3><a name=\"filters\" id=\"filters\">Message Filtering</a></h3>\nRegular expression support is provided by the <a href=\n\"http://www.pcre.org/\">PCRE</a>&nbsp; library package, which is\nopen source software, written by Philip Hazel, and copyright by the\nUniversity of Cambridge, England.\n<p>The full body searches can be slow, and do not match multi-line\nstrings in message bodies. A string that spans multiple lines of a\nheader can be matched.</p>\n<p><a name=\"filter_out\" id=\"filter_out\"></a></p>\n</dd>\n<dt><strong>filter_out = expression</strong></dt>\n<dd>Delete from the html archives any message having a header line\nwhich matches any of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same syntax\nas Perl regular expressions.\n<p>The following examples should reject messages Cc'd to more than\n3 addresses or from any address at spammers.com. This option is\ndisabled by default.<br>\n<br>\n<i>filter_out=Cc:([^,]*,){3}</i><br>\n<i>filter_out=From:.+@spammers.com</i></p>\n</dd>\n<dd><a name=\"filter_require\" id=\"filter_require\"></a></dd>\n<dt><strong>filter_require = expression</strong></dt>\n<dd>Delete from the html archives any message not having header\nlines which match each of these expressions. Uses the same rules\nfor deletion as the expires option. The expressions use the same\nsyntax as Perl regular expressions.<br>\n<br>\n<i>filter_require =</i></dd>\n<dd><a name=\"filter_out_full_body\" id=\n\"filter_out_full_body\"></a></dd>\n<dt><strong>filter_out_full_body = expression</strong></dt>\n<dd>Delete from the html archives any message having a line which\nmatches any of these expressions. Uses the same rules for deletion\nas the expires option. The expressions use the same syntax as Perl\nregular expressions.<br>\n<br>\n<i>filter_out_full_body =</i></dd>\n<dd><a name=\"filter_require_full_body\" id=\n\"filter_require_full_body\"></a></dd>\n<dt><strong>filter_require_full_body = expression</strong></dt>\n<dd>Delete from the html archives any message not having lines\nwhich match each of these expressions. Uses the same rules for\ndeletion as the expires option. The expressions use the same syntax\nas Perl regular expressions.<br>\n<br>\n<i>filter_require_full_body =</i></dd>\n<dd>\n<h3><a name=\"files\" id=\"files\">Filesystem output</a></h3>\n<a name=\"dir\" id=\"dir\"></a></dd>\n<dt><strong>dir = [ directory path | NONE ]</strong></dt>\n<dd>This is the default directory that Hypermail uses when creating\nand updating archives. If set to NONE, the directory will have the\nsame name as the input mailbox.<br>\nNote that the date that Hypermail was run will be used, not a date\nfrom the message (use the <a href=\n\"#folder_by_date\">folder_by_date</a> option to have Hypermail use\ndates from messages).<br>\n<br>\n<i>dir = NONE</i></dd>\n<dd><a name=\"overwrite\" id=\"overwrite\"></a></dd>\n<dt><strong>overwrite = [ 0 | 1 ]</strong></dt>\n<dd>Set to 1 to make Hypermail rewrite all messages.<br>\nSet to 0 to rewrite as few messages as possible.<br>\nRewriting all messages is slower, but if you change the options\nthat control the appearance of the messages you may want to rewrite\nall the messages to make the appearance consistent throughout the\narchive. (This defaulted to 1 for most versions 2.0 through 2.1.3,\npresumably to encourage archives that upgraded to have a single\nstyle. The default was changed back to 0 after 2.1.3).<br>\n<br>\n<i>overwrite = 0</i></dd>\n<dd><a name=\"htmlsuffix\" id=\"htmlsuffix\"></a></dd>\n<dt><strong>htmlsuffix = [ html | htm | shtml ... ]</strong></dt>\n<dd>Use this to specify the html file suffix to be used when\nHypermail generates the html files. This is dependent on local\nneeds. Do not put a '.' in the value. It would result in\n\"file..html\", probably not what you want.<br>\n<br>\n<i>htmlsuffix = shtml</i></dd>\n<dd><a name=\"dirmode\" id=\"dirmode\"></a></dd>\n<dt><strong>dirmode = octal number</strong></dt>\n<dd>This is an octal number representing the rwx modes that new\ndirectories are set to when they are created. If the archives will\nbe made publically available, it's a good idea to define this as\n0755. This must be an octal number.<br>\n<br>\n<i>dirmode = 0755</i></dd>\n<dd><a name=\"filemode\" id=\"filemode\"></a></dd>\n<dt><strong>filemode = octal number</strong></dt>\n<dd>This is an octal number representing the permission modes that\nnew files are set to when they are created. If the archives will be\nmade publically available, it's a good idea to define this as 0644.\nThis must be an octal number.<br>\n<br>\n<i>filemode = 0644</i></dd>\n<dd><a name=\"filename_base\" id=\"filename_base\"></a></dd>\n<dt><strong>filename_base = [ string ]</strong></dt>\n<dd>This option overrides the normal rules for creating attachment\nfile names, and creates file names from the string that this option\nis set to plus a file name extension if one can be found in the\nname supplied by the message. This option is mainly for languages\nthat use different character sets from English.<br>\n<br>\n<i>filename_base = attachment</i> (disabled by default)</dd>\n<dd>\n<h3><a name=\"sysmisc\" id=\"sysmisc\">System miscellaneous</a></h3>\n<a name=\"usegdbm\" id=\"usegdbm\"></a></dd>\n<dt><strong>usegdbm = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to use gdbm to implement a header cache. This\nwill speed up hypermail, especially if your filesystem is slow. It\nwill not provide any speedup with the <a href=\n\"#linkquotes\">linkquotes</a> option.<br>\n<br>\n<i>usegdbm = 0</i></dd>\n<dd><a name=\"writehaof\" id=\"writehaof\"></a></dd>\n<dt><strong>writehaof = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to let hypermail write an XML archive overview\nfile in each directory. The filename is archive_overview.haof.<br>\n<br>\n<i>writehaof = 0</i></dd>\n<dd><a name=\"append\" id=\"append\"></a></dd>\n<dt><strong>append = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to maintain a parallel mbox archive. The file\nname defaults to mbox in the directory specified by -d or dir.<br>\n<br>\n<i>append = 1</i></dd>\n<dd><a name=\"append_filename\" id=\"append_filename\"></a></dd>\n<dt><strong>append_filename = [ string ]</strong></dt>\n<dd>Specifies the filename to be used by the append option. $DIR may\nbe used to specify a name relative to the directory specified in the\n-d or dir option.  The string will be passed to strftime(3) to allow\nsplitting the mailbox into yearly or monthy files, such as\n\"%Y-%m.mbox\". <br>\n<br>\n<i>append_filename = $DIR/INBOX</i></dd>\n<dd><a name=\"txtsuffix\" id=\"txtsuffix\"></a></dd>\n<dt><strong>txtsuffix = [ string ]</strong></dt>\n<dd>If you want the original mail messages archived in individual\nfiles, set this to the extension that you want these messages to\nhave (recommended value: <strong>txt</strong>).<br>\n<br>\n<i>txtsuffix = txt</i> (off by default)</dd>\n<dd><a name=\"annotated\" id=\"annotated\"></a></dd>\n<dt><strong>annotated = list of headers used to indicate\ndeletion</strong></dt>\n<dd>This is the list of headers that indicate that a message\ncontains an annotation. Options <strong>disabled</strong> by\ndefault.<br>\n<br>\nIn an annotated message, the values of the header specify the type\nof annotations. The header may have one or more comma-separated\nvalues. Order and case are not important. Hypermail recognizes two\ntypes of annotations: <strong>content</strong> and\n<strong>robot</strong> annotations.<br>\n<br>\n<strong>Content annotations</strong> give information to the reader\nabout how an archive maintainer has operated on an original\nreceived message. This operation typically happens as a belated\naction, for example, when removing spam from an existing archive.\nContent annotations can have one, and only one, of the following\nvalues:<br>\n<dl>\n<dt>spam</dt>\n<dd>message deleted because it is spam;</dd>\n<dt>deleted</dt>\n<dd>message deleted, other reasons;</dd>\n<dt>edited</dt>\n<dd>original received message was manually edited.</dd>\n</dl>\n<br>\nIf a message specifies more than one content annotation, only the\nfirst one will be taken into account. You can customize the markup\nthat\\'s shown for content annotations by means of the <a href=\n\"#htmlmessage_deleted_other\">htmlmessage_deleted_other</a>,\n<a href=\"#htmlmessage_deleted_spam\">htmlmessage_deleted_spam</a>,\nand <a href=\"#htmlmessage_edited\">htmlmessage_edited</a>\ndirectives. See also the <a href=\"#delete_level\">delete_level</a>\noption for more info about what happens to a deleted message.<br>\n<br>\n<strong>Robot annotations</strong> instruct a visiting web robot if\na the contents of a message should be indexed and/or if the\noutgoing links from the message should be followed, doing so thru a\nspecific HTML meta tag (browse <a href=\n\"http://www.robotstxt.org/\">About the Robots &lt;META&gt; tag</a>\nfor further details).<br>\nRobot annotations can have either one or both of the following\nvalues:\n<dl>\n<dt>nofollow</dt>\n<dd>don't follow outgoing HTML links from this file;</dd>\n<dt>noindex</dt>\n<dd>don't index this message.</dd>\n</dl>\n<br>\nYou can use one or both robot annotation values and combine them\nwith the <strong>edited</strong> content annotation. Note that\n<strong>spam</strong> and <strong>deleted</strong> annotations have\nan implicit robot <strong>noindex</strong> annotation. In such\ncase, user supplied robot annotations values will be silently\nignored.<br>\n<br>\nUse <a href=\"#userobotmeta\">userobotmeta</a> for associating\nattachments with annotations for robots.<br>\n<br>\nNote that the list maintainer must be careful on whether to accept\nincoming messages containing the <strong>annotated</strong> header.\nIf the policy is not to allow that header on incoming messages, it\nmust be filtered out before the message is stored or acted upon by\nhypermail.<br>\n<br>\nIn an <strong>hmrc</strong> file:<br>\n<em>annotated = X-Hypermail-Annotated</em> (off by default)<br>\nIn a message:<br>\n<em>X-Hypermail-Annotated: edited, noindex</em></dd>\n<dd><a name=\"deleted\" id=\"deleted\"></a></dd>\n<dt><strong>deleted = list of headers used to indicate\ndeletion</strong> <strong>[DEPRECATED]</strong></dt>\n<dd>This is the list of headers that indicate the message should\nnot be displayed if the value of this header is 'yes'. See the\n<a href=\"#delete_level\">delete_level</a> option for more info about\nwhat happens to the message.<br>\nNOTE: This option has been <strong>deprecated</strong> if favor of\n<a href=\"#annotated\">annotated</a>. However, it will still be\nparsed and honored to take into account legacy archives.<br>\n<br>\n<i>deleted = X-Hypermail-Deleted X-No-Archive</i></dd>\n<dd><a name=\"expires\" id=\"expires\"></a></dd>\n<dt><strong>expires = list of headers used to indicate\nexpiration</strong></dt>\n<dd>This is the list of headers that indicate the message should\nnot be displayed if the value of this header is a date in the past.\nSee the <a href=\"#delete_level\">delete_level</a> option for more\ninfo about what happens to the message.<br>\n<br>\n<i>expires = Expires</i></dd>\n<dd><a name=\"delete_older\" id=\"delete_older\"></a></dd>\n<dt><strong>delete_older = date/time string</strong></dt>\n<dd>Any message older than this date should not be displayed. See\nthe <a href=\"#delete_level\">delete_level</a> option for more info\nabout what happens to the message. Any date format that works in\nthe Date: header line of an email message should work here.<br>\n<br>\n<i>delete_older = \"Wed, 14 Mar 2001 12:59:51 +0200\"</i> (off by\ndefault)</dd>\n<dd><a name=\"delete_newer\" id=\"delete_newer\"></a></dd>\n<dt><strong>delete_newer = date/time string</strong></dt>\n<dd>Any message newer than this date should not be displayed. See\nthe <a href=\"#delete_level\">delete_level</a> option for more info\nabout what happens to the message. Any date format that works in\nthe Date: header line of an email message should work here.<br>\n<br>\n<i>delete_newer = \"Wed, 28 Mar 2001 12:59:51 +0200\"</i> (off by\ndefault)</dd>\n<dd><a name=\"delete_msgnum\" id=\"delete_msgnum\"></a></dd>\n<dt><strong>delete_msgnum = list of message numbers</strong></dt>\n<dd>This is the list of message numbers that should be deleted from\nthe html archive. The mbox is not changed. See the <a href=\n\"#delete_level\">delete_level</a> option for more info about what\nhappens to the message.<br>\n<br>\n<i>delete_msgnum = 42 666</i> (off by default) <a name=\n\"delete_level\" id=\"delete_level\"></a></dd>\n<dt><strong>delete_level = [ 0 | 1 | 2 | 3 ]</strong></dt>\n<dd><br>\n0 - remove deleted and expired files. Note that with this choice\nthreading may be screwed up if there are replies to deleted or\nexpired options and the archive is updated incrementally<br>\n1 - remove message body<br>\n2 - remove message body for deleted messages, leave expired\nmessages<br>\n3 - leave all messages<br>\nDeleted and expired messages are removed from the index files\nregardless of the delete_level selection.<br>\n<br>\n<i>delete_level = 1</i></dd>\n<dd><a name=\"delete_incremental\" id=\"delete_incremental\"></a></dd>\n<dt><strong>delete_incremental = [ 0 | 1 ]</strong></dt>\n<dd><br>\nIf this option is enabled, hypermail will perform deletions on old\nmessages when run in incremental mode (according to the other\ndelete configuration options). Note that depending on your\nhypermail setup, the size of the archive, and the complexity of the\nmarkup, there may be memory and parsing issues, specifically when\nthere are non-deleted replies to a deleted message. If this option\nis disabled, deleted messages will only be removed when rebuilding\nthe whole archive.<br>\n<br>\n<i>delete_incremental = 0</i> (enabled by default)</dd>\n<dd><a name=\"htmlmessage_edited\" id=\"htmlmessage_edited\"></a></dd>\n<dt><strong>htmlmessage_edited = [HTML markup string]</strong></dt>\n<dd><br>\nCustom markup to use in the body of manually edited message\nwhen <em>delete_level</em> is equal or superior to 2.<br>\n<br>\n<i>htmlmessage_edited = &lt;div class=\"edited\"&gt;&lt;img\nsrc=\"http://example.org/Mail/edited.png\" alt=\"original message\nedited\" /&gt; &lt;p class=\"editedmmes\"&gt;The originally received\nmessage was edited by the archive maintainer.&lt;/p&gt;&lt;p\nclass=\"spamfooter\"&gt;The editing of this email is consistent with\n&lt;a href=\"http://example.org/Mail/\"&gt;example.org's Mailing List\nand Archive Usage Policy.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</i>\n(disabled by default)</dd>\n<dd><a name=\"htmlmessage_deleted_other\" id=\n\"htmlmessage_deleted_other\"></a></dd>\n<dt><strong>htmlmessage_deleted_other = [HTML markup\nstring]</strong></dt>\n<dd><br>\nCustom markup to use in the body of deleted messages (by\nreasons other than spam) when <em>delete_level</em> is equal or\nsuperior to 2.<br>\n<br>\n<i>htmlmessage_deleted_spam = &lt;div class=\"deleted\"&gt;&lt;img\nsrc=\"http://example.org/Mail/deleted.png\" alt=\"email removed\" /&gt;\n&lt;p class=\"deletedmmes\"&gt;This message was removed from our mail\narchives by the archive maintainer.&lt;/p&gt;&lt;p\nclass=\"deletedfooter\"&gt;The removal of this email is consistent\nwith &lt;a href=\"http://example.org/Mail/\"&gt;example.org's Mailing\nList and Archive Usage Policy.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</i>\n(disabled by default)</dd>\n<dd><a name=\"htmlmessage_deleted_spam\" id=\n\"htmlmessage_deleted_spam\"></a></dd>\n<dt><strong>htmlmessage_deleted_spam = [HTML markup\nstring]</strong></dt>\n<dd><br>\nCustom markup to use in the body of deleted messages (by spam\nreasons) when <em>delete_level</em> is equal or superior to 2.<br>\n<br>\n<i>htmlmessage_deleted_spam = &lt;div class=\"spam\"&gt;&lt;img\nsrc=\"http://example.org/Mail/noUCE.png\" alt=\"unsolicited bulk email\nremoved\" /&gt; &lt;p class=\"spammes\"&gt;This message was determined\nto be unsolicited bulk email and has been removed from our\narchives.&lt;/p&gt;&lt;p class=\"spamfooter\"&gt;The removal of this\nemail is consistent with &lt;a\nhref=\"http://example.org/Mail/\"&gt;example.org's Mailing List and\nArchive Usage Policy.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</i> (disabled\nby default)</dd>\n<dd><a name=\"progress\" id=\"progress\"></a></dd>\n<dt><strong>progress = [ 0 | 1 | 2 ]</strong></dt>\n<dd>Set to 1 or 2 to show progress as Hypermail works. Set to 0 for\nsilent operation. Output goes to standard output. Set to 1,\nprogress information relating to attachments creation is\noverwritten for each new attachment. Set to 2, attachment creation\ninformation is listed individually with the number of the message\nthe attachments relates to.<br>\n<br>\n<i>progress = 0</i></dd>\n<dd><a name=\"warn_suppressions\" id=\"warn_suppressions\"></a></dd>\n<dt><strong>warn_suppressions = [ 0 | 1 ]</strong></dt>\n<dd>Set this to 1 to get warnings (on stdout) about messages that\nare not converted because of they are missing a msgid (if\nrequire_msgids is On) or because one of the following options\nsuppressed it: deleted expires delete_msgnum filter_out\nfilter_require filter_out_full_body filter_require_full_body.<br>\n<br>\n<i>warn_suppressions = 1</i></dd>\n<dd><a name=\"uselock\" id=\"uselock\"></a></dd>\n<dt><strong>uselock = [ 0 | 1 ]</strong></dt>\n<dd>Controls whether to use hypermail's built-in locking mechanism.\nBy default, this option is set to <strong>1</strong>. Set it to\n<strong>0</strong> if you have an external locking mechanism, like,\nfor example, when using procmail or smartlist.<br>\n<br>\n<i>uselock = 0</i></dd>\n<dd><a name=\"locktime\" id=\"locktime\"></a></dd>\n<dt><strong>locktime = number-of-seconds</strong></dt>\n<dd>The number of seconds that a lock should be honored when\nprocessing inbound messages before it is overridden.<br>\n<br>\n<i>locktime = 3600</i></dd>\n<dd><a name=\"base_url\" id=\"base_url\"></a></dd>\n<dt><strong>base_url = url-of-main-archive-directory</strong></dt>\n<dd>The url of the archive's main directory. This is needed when\nthe latest_folder option is used and the folder_by_date makes\ndirectories more than one level deep (e.g. with '%y/%m').<br>\n<br>\n<i>base_url = http://www.hypermail-project.org/archive/</i></dd>\n<dd><a name=\"report_new_folder\" id=\"report_new_folder\"></a></dd>\n<dt><strong>report_new_folder = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to have it print (on stdout) the names of any\nnew directories created pursuant to the folder_by_date or\nmsgsperfolder option, or the initial creation of the archive. It\nwill print the full path if that is what you use to specify the\narchive directory. Does not print anything when attachment or\nmetadata directories are created.<br>\n<br>\n<i>report_new_folder = 0</i></dd>\n<dd><a name=\"report_new_file\" id=\"report_new_file\"></a></dd>\n<dt><strong>report_new_file = [ 0 | 1 ]</strong></dt>\n<dd>Set this to On to have it print (on stdout) the names of any\nnew files created for new messages. It will print the full path if\nthat is what you use to specify the archive directory.<br>\n<i>report_new_file = 0</i></dd>\n</dl>\n<hr noshade>\n<big><strong>See Also</strong></big>\n<blockquote><strong>hypermail(1)</strong>, &nbsp;\n<strong>hmrc(4)</strong>, &nbsp; <strong><a href=\n\"hypermail.html\">Hypermail</a></strong> &nbsp; and &nbsp;\n<strong><a href=\"customizing.html\">Customizing Hypermail\nPages</a></strong> and <strong><a href=\"archive_search.html\">Adding\na Search Engines to your Hypermail Archive</a></strong>\n<hr noshade>\n<small><em><strong>Last updated February 6,\n2013</strong></em></small></blockquote>\n</body>\n</html>\n"
  },
  {
    "path": "docs/hypermail-faq.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<HTML>\n<HEAD>\n<TITLE>Hypermail Frequently Asked Questions</TITLE>\n<LINK REV=\"made\" HREF=\"mailto:webmaster@hypermail-project.org\">\n<META name=\"description\" content=\"Hypermail Related Software Tools\">\n<META name=\"keywords\" content=\"Hypermail tools, email tools, conversion software, checking Hypermail configurations\">\n</HEAD>\n<BODY BACKGROUND=\"stars.png\" BGCOLOR=\"#000000\" TEXT=\"#FFFFFF\" LINK=\"#998800\" ALINK=\"#FFFFFF\" VLINK=\"#998800\">  \n<BR>\n<H1 ALIGN=CENTER>Hypermail Frequently Asked Questions</H1>\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n\nThis is the beginning of the Hypermail FAQ.  Don't dispair that there is \nlittle here.  That will change shortly.\n<P>\n<H2>Table of Contents</H2>\n<OL>\n<LI><A HREF=\"#1\">Why is the License Different ?</A>\n<LI><A HREF=\"#2\">Will hypermail run on my system ?</A>\n<LI><A HREF=\"#3\">What Happened to EIT ?</A>\n<LI><A HREF=\"#4\">Where in the World is Kevin Hughes ?</A>\n<LI><A HREF=\"#5\">What is the latest version of Hypermail ?</A>\n<LI><A HREF=\"#6\">Where can I get the latest version of Hypermail ?</A>\n<LI><A HREF=\"#7\">How can I split the archives into months ?</A>\n<LI><A HREF=\"#8\">How do I change the font on the pages ?</A>\n<LI><A HREF=\"#9\">What is HM_MAILTO used for ?</A>\n<LI><A HREF=\"#10\">Can I send a message to the list from the web archive ?</A>\n<LI><A HREF=\"#11\">Can I build and run this on Windows 98/2000/NT ?</A>\n<LI><A HREF=\"#12\">How can I remove a listserver subject prefix ?</A>\n<LI><A HREF=\"#13\">Which configuration file should I use ?</A>\n<LI><A HREF=\"#14\">Why is the downloaded file name different when I download hypermail.tar.gz ?</A>\n<LI><A HREF=\"#15\">Can I throttle hypermail's CPU usage ?</A>\n<LI><A HREF=\"#16\">How can I make my archive searchable ?</A>\n<LI><A HREF=\"#17\">How does hypermail decide whether messages are in the same thread?</A>\n<LI><A HREF=\"#18\">How can I have multiple mailboxes produce one archive?</A>\n<LI><A HREF=\"#19\">I have received an email with attachment that needs octet-stream. What should I do?</A>\n<LI><A HREF=\"#20\">Why is Hypermail ignoring some messages?</A>\n<LI><A HREF=\"#21\">Bogus dates are causing some emails to be put in a strange folder. Is there an easy way around this?</A>\n</OL>\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"1\">1. Why is the License Different ?</A></H3>\n<P>\nHewlett-Packard (who is now the legal owner of Hypermail, since EIT was \nbought by VeriFone, which was bought by Hewlett-Packard) has put it\nunder the GNU license, a widely used \"free software\" license. This means \nthat you can use and modify the source code as long as you make your changes \npublically available and do not charge for their use (although, under GNU, \nyou can charge for their distribution).  More details are available at \n<A HREF=\"http://www.fsf.org/\">http://www.fsf.org/</A> and\n<A HREF=\"http://www.fsf.org/copyleft/gpl.html\">http://www.fsf.org/copyleft/gpl.html</A>.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n\n<H3><A HREF=\"#\" NAME=\"2\">2. Will hypermail run on my system ?</A></H3>\n<P>\nHypermail can compile and run as-is on most of the more popular UNIX systems \ntoday. If you're not sure if \nhypermail will run on your UNIX system, try compiling it and see!\n<p>\nHypermail has been reported to work on MacOSX (X.2.6), with the advice\nto use --disable-shared and manually execute make in src/pcre.\n<P>\nPeople have indeed ported hypermail to DOS, Windows 95, and Windows NT (but \nnot Java ...yet). Installation advice for some Windows systems is available at\n<A HREF=\"http://www.hypermail.org/win32.html\">win32.html</A>.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"3\">3. What Happened to EIT ?</A></H3>\n<P>\nA very old and established government contractor company called Electronic \nInstrumentation and Technology Inc.  made legal moves to obtain the eit.com \ndomain. Since VeriFone/HP had no interest in keeping EIT, they dissolved it \ncompletely some months ago. This company had a trademark on EIT so the \ndomain name was given to them. (Thank you InterNic...)\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"4\">4. Where in the World is Kevin Hughes ?</A></H3>\n<P>\nKevin has not dropped off the face of the earth but is extremely busy\nthese days as a Hypermedia Engineer at Veo Systems.\n\n<BLOCKQUOTE>\n        Kevin Hughes\n        <BR><A HREF=\"mailto:kev@kevcom.com\">kev@kevcom.com</A>\n        <BR><A HREF=\"mailto:kevinh@veosys.com\">kevinh@veosys.com</A>\n        <BR>(650) 858-7710 (office number)\n        <BR>(650) 858-4925 (fax)\n        <BR><A HREF=\"http://www.veosystems.com/\">www.veosystems.com</A>\n</BLOCKQUOTE>\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"5\">5. What is the latest version of Hypermail ?</A></H3>\n<P>\nThe latest stable version of Hypermail is Version 2.1.9. It is available from\n<A HREF=\"http://www.hypermail-project.org\">http://www.hypermail-project.org</A>\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"6\">6. Where can I get the latest version of Hypermail ?</A></H3>\n<P>\nThe latest version of Hypermail is available from the Hypermail Development\nCenter at \n\n<a href=\"http://sourceforge.net/projects/hypermail/\">SourceForge</a>\nand/or at\n<P ALIGN=CENTER>\n<A HREF=\"http://www.hypermail-project.org\">http://www.hypermail-project.org/</A>\n</P>\n\nIt and past versions are also available via FTP from\n\n<P ALIGN=CENTER><A HREF=\"ftp://ftp.hypermail.org/hypermail/\">ftp://ftp.hypermail.org/hypermail/</A></P>\n<p>\nThe cvs server at <a href=\"http://cvs.hypermail.org\">:pserver:cvs@cvs.hypermail.org:/CVS</a>\nusually has a more recent but less tested version.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"7\">7. How can I split the archives into months ?</A></H3>\n<P>\n<EM>I have a fat archive that I'd like to split up by month, like I see so many\nothers doing.  Is there a description somewhere of a procedure to follow,\nor will I just have to think it through?</EM>\n<P>\nIf you are using version 2.1.0 or later and either have gdbm or don't\ndo incremental updates, see the \n\n<a href=\"hmrc.html#folder_by_date\">folder_by_date</a>\n\noption. The simple way to use this is to add these to your .hmrc:\n<blockquote>\nfolder_by_date=\"%y%m\"\n<br>usegdbm = 1\n</blockquote>\nand regenerate your archive from its mbox file.\n<p>\nAn older alternative is a set of scripts in a directory\nnamed <A HREF=\"source/archive/\">archive/</A> that has tools to do just what \nyou want to do.\n<P>\nIf you want index files split by month but don't need to split the archive\ninto multiple directories, try adding &quot;monthly_index=1&quot; in your\nconfig file (usually ~/.hmrc) (available in version 2.1). A summary.html\nfile will provide links to all the monthly indices.\nThis is probably appropriate for archives with a few thousand messages,\nbut for larger archives I recommend splitting into multiple directories.\n<p>\n There's a script at\n<a href=\"http://users.netrus.net/troc/perl.html\">http://users.netrus.net/troc/perl.html</a>\ncalled mms (monthly mail splitter) which has also been reported useful.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"8\">8. How do I change the font on the pages ?</A></H3>\n<P>\n<EM>What I'd like to do is change the font of the archives pages.  I tried \ndoing this by adding a &lt;FONT FACE=...&gt; tag in the header.hyp file and a \n&lt;FONT&gt; tag in the footer file, but it didn't work.  Is there something \nin the program itself that's preventing me from making this change?</EM>\n<P>\nYes and no. Let me guess... You have <STRONG>hm_usetable = 1</STRONG>.  \nThe code for tables is not inheriting the FONT values and that they need \nto be set in the &lt;TH..&gt; tags.  If tables are not used it works as \nexpected.\n<P>\nTo test it put a \n<STRONG><SMALL>\n<BLOCKQUOTE>\n&lt;FONT SIZE=\"1\" FACE=\"GENEVA,ARIAL,HELVETICA\"&gt;\n</BLOCKQUOTE>\n</SMALL></STRONG>\nin the test-index.hyp and test-msg.hyp. In  test-footer.hyp put\n<STRONG><SMALL>\n<BLOCKQUOTE>\n&lt;/FONT&gt;\n</BLOCKQUOTE>\n</SMALL></STRONG>\n<P>\nWith <STRONG>hm_usetable = 1</STRONG> in the test.rc file, then ran \n\"<STRONG>hypermail -c test.rc -m testmail</STRONG>\" and everything \nbetween the \"menus\" was the right FONT but the menus were not.\n<P>\nThen edit the test.rc file and set <STRONG>hm_usetable = 0</STRONG>. \nNext remove the existing testdir and rerun hypermail again. This time \nthe FONT works as expected. \n<P>\nIs this what is happening to you ?  If so the code will need to be modified.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"9\">9. What is HM_MAILTO used for ?</A></H3>\n<P>\n\n<EM>I've enabled this option in .hyprc (the configuration file to which\nthe pipe script for my archive points). Unlike the other options, this one\ndoes not create a link to mailto:admin@domain.com as I would expect. Any\nideas?</EM>\n<P>\nHM_MAILTO has a couple different uses. One is to trigger the insertion of\nthe &lt;LINK REV=made HREF=mailto:...&gt; header in the HTML sources.\nThis is most useable with ascii browsers such as lynx. \n<P>\n<STRONG><SMALL>\n<BLOCKQUOTE>\n     hm_mailto = [ email-address | NONE ] \n     <BR># \n     <BR># The address of the contact point that is put in the HTML header line \n     <BR># &lt;LINK REV=made HREF=mailto:hm_mailto&gt;\n     <BR># \n     <BR># The &lt;LINK...&gt; header can be disabled by default by setting \n     <BR># mailto to NONE. \n</BLOCKQUOTE>\n</SMALL></STRONG>\n<P>\nIt can also be used in a hypermail page template file since it resolves \nto %m.\n<P>\nFor example, your footer file might look like...\n<STRONG><SMALL>\n<P>&lt;P ALIGN=CENTER&gt;&lt;IMG SRC=\"/images/bar.png\" WIDTH=\"400\" HEIGHT=\"4\" ALT=\"---------\"&gt;&lt;/P&gt;\n<BR>&lt;ADDRESS&gt;\n<BR>&lt;EM&gt;\n<BR>&lt;SMALL&gt;\n<BR>This archive was generated by %u on %g\n<BR>&lt;P ALIGN=CENTER&gt;\n<BR>Send administrative comments to&lt;A HREF=\"mailto:%m\"&gt;%m&lt;/A&gt;\n<BR>&lt;/P&gt;\n<BR>&lt;/SMALL&gt;\n<BR>&lt;/EM&gt;\n<BR>&lt;/ADDRESS&gt;\n<BR>&lt;/BODY&gt;\n<BR>&lt;/HTML&gt;\n</SMALL></STRONG>\n<P>\nIn this case the %m is expanded to admin@domain.com.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=300 HEIGHT=2 ALT=\"----\"></P>\n<P>\n<H3><A HREF=\"#\" NAME=\"10\">10. Can I send a message to the list from the web archive ?</A></H3>\n<P>\n<EM>I would like to add a link to the menu that says \"Send a Message to the \nList.\" I read through the documentation on your website, and I think I \nknow what I have to do. However, I cannot find an example of what a .hyp \ntemplate file should look like. </EM>\n<P>\nThat's what \"Respond\" on the menubar does. It allows a person\nto reply to the existing message, with the reply sent to the list address.\nAnd \"mail a new topic\" on the menubar allows a user to send\na new message to the list.\n<P>\nTo enable this feature set\n<P>\n<STRONG><SMALL>\n<BR>hm_hmail = listaddr@your-site.domain\n</SMALL></STRONG>\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"11\">Can I build and run this on Windows 98/2000/NT ?</A></H3>\n<P>\n<EM>I would like to use Hypermail on my Windows box. Can I ? If so how do\nI build the latest version ?</EM>  \n<P>\nThere is a complete description on how to build hypermail on a Windows\n    system at <A HREF=\"http://www.hypermail.org/win32.html\">win32.html</A>.  This was written by\nBob Crispen &lt;bob.crispen@boeing.com&gt;. (Thanks Bob!)\n\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"12\">How can I remove a listserver subject prefix ?</A></H3>\n<P>\n<EM>The Subject index page does not seem to do the right sorting. My list\nhas a \"subject prefix\" so people can filter their inbound mail better. Is\nthat confusing the sorting ?</EM>\n<P>\nYes.  Hypermail functions that deal with replies look for the Re: and \nreturn a pointer to the subject line after the \"Re: \".  \nThe listserver software is prefixing the subject line contents with\n[subject-prefix].  For example:\n<P>\n<STRONG><SMALL>\nInitial message: <BR>\n<BLOCKQUOTE>\n   Subject: [subject-prefix] the subject of the message\n</BLOCKQUOTE>\n<P>\nReplies: <BR>\n<BLOCKQUOTE>\n   Subject: [subject-prefix] Re: the subject of the message\n</BLOCKQUOTE>\n</SMALL></STRONG>\n<P>\nThe best solution is to use the directive\n<BLOCKQUOTE>\n        <STRONG>stripsubject = [subject-prefix]</STRONG>\n</BLOCKQUOTE>\nin the config file for that list. Then [subject-prefix] is stripped before    \nthe Reply processing occurs and the proper things happen. This is the proper \nfix since hypermail would need to know to strip the [subject-prefix] from\nthe initial messages to get it right.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"13\">Which configuration file should I use ?</A></H3>\n<P>\n<EM>Which configuration file should I use ?. Is it the hypermail.rc file \nin the Configs directory? I'm trying to edit the appearance of pages created \nby hypermail, but I think I'm trying to edit the wrong config file.</EM>\n<P>\nWith one of the later versions you can use the -v option to generate \na config file that you can use. There is not just one config file. \nWhat are included are examples. \n<P>\n<STRONG><SMALL>\n<BLOCKQUOTE>\n   $ hypermail -v &gt; some-file.rc \n</BLOCKQUOTE>\n</SMALL></STRONG>\n \nEdit the some-file.rc and set the values to what you want.\n<P>\nThen run hypermail using the config file by:\n \n<STRONG><SMALL>\n<BLOCKQUOTE>\n  $ hypermail -c some-file.rc. \n</BLOCKQUOTE>\n</SMALL></STRONG>\n \n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"14\">Why is the downloaded file name different when I download hypermail.tar.gz ?</A></H3>\n<P>\n<EM>\nThe source is available from \n<BLOCKQUOTE>\n<A HREF=\"http://www.hypermail-project.org/hypermail.tar.gz\">www.hypermail.org/hypermail.tar.gz</A>\n</BLOCKQUOTE>\nHowever: When downloading though IE v4 browser on an NT \nPC, you get a file called hypermail_tar.tar.\n</EM>\n<P>\nDepending on your browser MIME type setup and support applications,\nthe filename downloaded might be hypermail.tar, hypermail.tar.gz, etc.\nIn any case, you will be informed as to the filename when you actually \ndownload it onto a Windows/NT PC.  Use that name from that point forward.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"15\">Can I throttle hypermail's CPU usage ?</A></H3>\n<P>\n<EM>\nI'm looking for a good way to throttle hypermail. When it runs it is\ntaking over both CPU's on my system. Is there a way to have it limit\nitself?\n</EM>\n<P>\nThere is currently no \"nice\" call in hypermail to limit itself.  Maybe \nwe can consider it in the future. You might run it as a subcommand to \nnice.  For example in an aliases file:\n<STRONG><SMALL>\n<BLOCKQUOTE>\n \"|nice someval 'hypermail command line'\"\n</BLOCKQUOTE>\n</SMALL></STRONG>\nI've NEVER tried this so... ;) \n<P>\nYou might also be looking at a very large archive with lots of messages\nbeing the cause.  If so then try breaking it up into smaller archives\nsuch as monthly archives.  Tools are available for that in the latest\nrelease.\n<P>\nAnd if the list is a high traffic list, consider not running it from a\nsendmail alias and instead, run it from cron. (To assure it does not\nrun unnecessarily, consider using 'make' to check dependencies on the\ninbound mailbox and the archive itself. If the mailbox is newer, then\nrun the hypermail command. If not, then no new message have been received\nso don't bother running it. \n\n<P>\nIf the you are using the linkquotes option and incremental update \n(-u option), add a searchbackmsgnum line to your config file.\nIt controls the tradeoff between speed and\nthe reliability of finding the right source for quoted text.\nTry to set it to the largest number of messages between a\nmessage and the final direct reply to that message.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"16\">How can I make my archive searchable ?</A></H3>\n<P>\n<EM>Where can I find a program that provides an easy way of adding a\n\"search this archive\" feature to my hypermail archive?\n</EM>\n<P>\nThese seem to be the most popular choices:\n<ul>\n<li><a href=\"http://www.htdig.org\">Htdig</a>\n<li><a href=\"http://swish-e.org\">Swish-E</a>\n<li><a href=\"http://webglimpse.org/\">Glimpse</a>\n<li><a href=\"http://www.namazu.org/\">Namazu</a>\n<li><a href=\"http://search.mnogo.ru/\">mnoGoSearch</a>\n</ul>\nSwish-E comes with a script (index_hypermail.pl) that is customized for\nindexing Hypermail archives. <a href=\"index_hypermail.txt\">index_hypermail.txt</a>\nhas a description of how to use it.\n<p>\n You can also use search engines by putting text such as this on\nyour web page (although this search produces results from an entire site,\nnot just the email archive):\n<br>&lt;form action=http://www.google.com/search&gt;\n<br>&lt;input type=text name=as_q&gt;\n<br>&lt;input type=hidden name=as_sitesearch value=hypermail-project.org&gt;\n<br>&lt;input type=submit value=&quot;Search Hypermail&quot;&gt;\n<br>&lt;/form>\n<p>\nYou can probably get more complete (but apparently not recent) info at:\n<a href=\"http://www.searchenginewatch.com/resources/software.html\">Search Engine Software For Your Web Site</a>.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"17\">How does hypermail decide whether messages are in the same thread?</A></H3>\n<P>\n It uses the In-Reply-To: header if that is available. If not, it uses\nthe References: header if that is available. If these are not available,\nit looks for previous messages with the same subject header. Matches based\non the subject are listed as \"maybe\" replies.\n<P>\n If the linkquotes option is used, it will also search the message bodies\nof the previous searchbackmsgnum (default = 500) messages for text that\nlooks like it is being quoted in the current message. If it finds one or more\nprior messages with such text matches, it will treat the one with the longest\nmatch as the message being replied to. The exact algorithms for deciding what\nis quoted text are a bit complex. These matches override the In-Reply-To:\nand References: info (this rule may deserve further thought).\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"18\">How can I have multiple mailboxes produce one archive?</A></H3>\n<P>\n  One simple way is to combine them into one mailbox, and send that to\nhypermail. Something like <br><blockquote>&quot;cat file1 file2 file3 &gt; combined&quot;</blockquote> \nshould do that.\n<p>\n Another way is to invoke hypermail several times, using the -u flag for\nany mailboxes that you want added after the html archive has been started:\n<pre>\n hypermail -m file1\n hypermail -u -m file2\n hypermail -u -m file3\n</pre>\n<p>\n Do not try to send hypermail more than one mailbox at a time, or send\nit a second mailbox without using the -u flag or the increment=1 or\nincrement=-1 option.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"19\">I have received an email with attachment that needs octet-stream. What should I do?</A></H3>\n<p>\nNo attachment \"needs\" octet-stream. octet-stream is a label that describes\nthe attachment as being \"a stream of octets\". What is that you say? Well, the\napplication didn't know any more specifics and thus it identified it as good\nas possible. It knows it is a stream of octets, nothing else.\n<p>\nSo, an attachment coming as \"octet-stream\" can be pretty much ANYTHING. You\nhave no idea, and neither does anyone else. The only way to figure out is to\ndownload the file and see for yourself, ask the person who mailed it or to\nhope that the mail it came with describes what the attachment was about.\n<p>\n\"octet-stream\" could just as well be named \"I haven't got the slightest idea\nwhat this is, but I know it is built up with a series of bytes\".\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"20\">Why is Hypermail ignoring some messages?</A></H3>\n<p>One possibility is that those messages have a header saying\n<blockquote>\nX-No-Archive: yes\n</blockquote>\nwhich seems to indicate that the author doesn't want them included in any\narchive. This is controlled by a configure option which defaults to:\n<blockquote>\ndeleted = \"X-Hypermail-Deleted X-No-Archive\"\n</blockquote>\nTo get Hypermail to treat these as normal messages, add this to your\nconfig file (which is ~/.hmrc by default) or alter the \"deleted\" line\nin your existing config file to:\n<blockquote>\ndeleted = \"X-Hypermail-Deleted\"\n</blockquote>\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<H3><A HREF=\"#\" NAME=\"21\">Bogus dates are causing some emails to be put in a strange folder. Is there an easy way around this?</A></H3>\n<p>\nIf the bad dates were caused by a computer with the date set absurdly, try\nrunning <a href=\"http://gradha.sdf-eu.org/program/mailbox_date_trimmer.en.html\">\nmailbox_date_trimmer.py</a>, available in the Hypermail's contrib directory.\n<p>\nIf the bad dates are in a format that Hypermail doesn't understand, then\nyou will probably need to edit them manually.\n\n<P ALIGN=CENTER><IMG SRC=\"hr.yellow.png\" WIDTH=400 HEIGHT=2 ALT=\"----\"></P>\n<BR>\n<DIV ALIGN=CENTER>\n<ADDRESS>\n<STRONG>\nDo you have a Hypermail related question you'd like to see listed here ?\nIf so send mail to the Hypermail mailing list\n<A HREF=\"mailto:hypermail@hypermail-project.org\">hypermail@hypermail-project.org</A> \n&nbsp;&nbsp;(preferably with the answers). In order to minimize spam on the list, you must subscribe to the list (at least temporarily) in order to send mail to it.\nYou may subscribe to the list by sending a message with the word\n\"subscribe\" in the Subject: field to hypermail-request@hypermail-project.org.\n</STRONG>\n</ADDRESS>\n</DIV>\n<P>&nbsp;</P>\n</BODY>\n</HTML>\n"
  },
  {
    "path": "docs/hypermail.1",
    "content": ".TH HYPERMAIL 1 \"June 24, 2000\"\n.SH NAME\nhypermail \\- convert mail archives in UNIX box format to HTML pages\n.SH SYNOPSIS\n.BR \"hypermail \" [ \\-AgiMptTuvVxX1 ]\n.RB [ \\-m\n.IR \"mailbox\" ]\n.RB [ \\-d\n.IR \"directory\" ]\n.RB [ \\-l\n.IR \"label\" ]\n.RB [ \\-L\n.IR \"language\" ]\n.RB [ \\-a\n.IR \"URL\" ]\n.RB [ \\-b\n.IR \"URL\" ]\n.RB [ \\-c\n.IR \"file\" ]\n.RB [ \\-n\n.IR \"listaddress\" ]\n.RB [ \\-o\n.IR \"keyword=value\" ]\n.RB [ \\-s\n.IR \"htmlsuffix\" ]\n.RB [ \\-0\n.IR \"number\" ]\n.RB [ \"mailbox\" ]\n.SH DESCRIPTION\n.B hypermail\nis a program that takes a file of mail messages in UNIX mailbox format and generates a set of cross-referenced HTML documents.  Each file that is created represents a separate message in the mail archive and contains links to other articles, so that the entire archive can be browsed in a number of ways by following links.  Archives generated by Hypermail can be incrementally updated, and Hypermail is set by default to only update archives when changes are detected.\n.LP\nEach HTML file that is generated for a message contains (where applicable): the subject of the article, the name and email address of the sender, the date the article was sent, links to the next and previous messages in the archive, a link to the message the article is in reply to, and a link to the message next in the current thread.\n.LP\nIn addition, Hypermail will convert references in each message to email addresses and URLs to hyperlinks so they can be selected.  Email addresses will be converted to \n.B mailto:\nURLs, or links to a CGI mail program. \n.LP\nTo complement each set of HTML messages, four\n.I index files\nare created which sort the articles by date received, thread, subject, and author.  Each entry in these index files are links to the individual articles and provide a bird's-eye view of every archived message:\n.TP\n.B date.html\nThe index of articles sorted by the date they were received by the mail daemon.\n.TP\n.B thread.html\nThe index of articles sorted by thread first, then the date they were received.\n.TP\n.B subject.html\nThe index of articles sorted by subject.  Any\n.B \"Re:\"\nprefixes in front of subjects will have been stripped out.\n.TP\n.B author.html\nis the index of articles sorted by the first word of the author's name.  If the author's name can't be determined, their email address will be substituted.\n.LP\nOne of the index files will be called\n.B index.html\nand is the default index that users can go to when entering the archive.  In the specified directory, articles will be read out in the order that they were read from a mailbox or standard input.  Filenames start at zero and increase\nin this fashion:\n.B 0000.html, 0001.html, 0002.html,\netc.\n.SH OPTIONS\n.TP\n.BI \\-a \" URL\"\nThis option includes a link labelled\n.B \"Other mail archives\"\nin the index pages to the specified URL.  This way users who are looking at the Hypermail archive have the opportunity to go to pointers to other mail archives.  By default, this is a link to the parent directory which holds the archive files.\n.TP\n.BI \\-A\nUse this to maintain a parallel mbox archive. The file\nname defaults to mbox in the directory specified by -d or dir.\n.TP\n.BI \\-b \" URL\"\nThis option includes a link labelled\n.B \"About this archive\"\nin the index pages to the specified URL.  This way users who are looking at the Hypermail archive have the opportunity to go to information about the archive.\n.TP\n.BI \\-c \" file\"\nThis option specifies a configuration file to read settings from.  By default, Hypermail will look for a file called\n.B .hmrc\nin the user's home directory.\n.TP\n.BI \\-d \" directory\"\nSpecifies the directory to put the HTML files and index files that are created.  If the directory doesn't exist, a new one will be created with the name that is specified.  If the\n.B \\-d\noption isn't used, Hypermail will look for a directory with the same name as the input mailbox or will create one if needed. \n.TP\n.B \\-g\nUse this to use gdbm to implement a header cache.\nThis will speed up hypermail, especially if your filesystem is slow.\nIt will probably not provide any speedup if you use the linkquotes option.\n.TP\n.B \\-i\nReads in articles from standard input.\n.TP\n.BI \\-l \" label\"\nThis option tells Hypermail what to call the archive \\- the name that is specified will be in the title of the index pages so users know what sort of messages are being archived.\n.TP\n.BI \\-L \" language\"\n This is a two-letter string specifying the default\nlanguage  to  use, or a longer string specifying a language\nand locale. Set this the value of the language\ntable you wish  to  use  when  running  and  generating\narchives.  See also the iso2022jp and eurodate config file options.\n Current supported languages, with their default locales:\n de (de_DE) - German\n en (en_US) - English\n es (es_ES) - Spanish\n fi (fi_FI) - Finnish\n fr (fr_FR) - French\n el (el) - Greek\n gr (el_GR) - Greek\n is (is_IS) - Icelandic\n no (no_NO) - Norwegian\n pl (pl_PL) - Polish\n pt (pt_BR) - Brazilian Portuguese\n ru (ru_RU) - Russian\n sv (sv_SE) - Swedish\n.TP\n.BI \\-m \" mailbox\"\nSpecifies the mailbox to read articles in from.  By default, Hypermail will look for a file called\n.B mbox.\n.TP\n.B \\-M\n This option allows you to use metadata to store the content type\nof a MIME attachments and, later on,  when a user browses the\nattachment, send back this information in the HTTP Content-Type\nheader. When used, the Content-Type header of a MIME\nattachment will be stored in a metadata file. \n.TP\n.BI \\-n \" submission-address\"\nThis is the list\\'s submission address.  In this manner people will be able \nto submit new messages to the list the hypermail archive serves.\n.TP\n.BI \\-o \" keyword=value\"\nThis is a means of setting any variable that can be specified in a config\nfile.\n.TP\n.B \\-p\nThis shows a progress report as Hypermail reads in and writes out messages \\- the number of files that Hypermail is reading and writing and the file names of the directory and files created are shown.\n.TP\n.B \\-s htmlsuffix\nUse this to specify the html file suffix to be used when Hypermail\ngenerates the html files. This is dependent on local needs. Do not \nput a '.' in the value. It would result in \"file..html\", probably\nnot what you want.\n.TP\n.B \\-t\n This will tell Hypermail to generate an\nindex menu at the top and bottom of each page in a table format.\n.TP\n.B \\-T\nThis will tell Hypermail to  generate  \na message index Subject/Author/Date listings using a table format.\n.TP\n.B \\-u\nThis option tells Hypermail to add message(s) to the end of the existing HTML file archive and integrate them into it by links and cross-references. All archive index files will be regenerated to include the new message.\n Hypermail used to require that you only send it one message at a time when\nusing the -u option, but it should now work reasonably when\ngiven mailboxes containing multiple messages.\n When using the -u option, don't send any messages that\nHypermail has already processed. If you want Hypermail to recognize that\nsome messages are old messages that shouldn't be added to the archive again,\nsend it a mailbox with a complete set of messages and avoid the -u option. \n.TP\n.B \\-v\nThis shows a the variables and their values that Hypermail will use when.\n.TP\n.B \\-V\nThis shows the version information for the executing Hypermail.\nOnce displayed, Hypermail exits without doing any processing.\n.TP\n.B \\-x\nThis tells Hypermail to explicitly overwrite any previous HTML files that may exist.  Use this option only when it is desirable to completely rewrite the entire archive.\n.TP\n.B \\-X\nUse this to let hypermail write an XML archive overview file in each\ndirectory. The filename is archive_overview.haof.\n.TP\n.B \\-0 number\n This is a message number that should be deleted from the\nhtml archive. The mbox is not changed.\n See the delete_level config file option for more info about\nwhat happens to the message.\n.TP\n.B \\-1\n Use this to specify there is only one message in the input.\n.LP\n.SS\nGENERAL EXECUTION NOTES\n.LP\n.B Note:\nNo matter what options are specified, the index files are always rewritten.  The date when Hypermail was last run is included in index pages, so it's easy to tell when the archive was last updated.\n.LP\n.B Note:\nThe\n.B \\-i\nand\n.B \\-m\noptions cannot be used together.  Only archives in UNIX mailbox format can be read in - mailboxes of this kind are usually appended RFC2822-compliant articles separated by lines such as \"\\\\nFrom person@site Mon Jan 10 12:34:56 1994\".\n.LP\n.B Note:\nIf the mailbox that is being read from is an archive that new messages are always being added to, don't use the\n.B \\-u\noption.  Hypermail will then read in all the messages given it but will only write new messages that have been appended to the mailbox.\n.LP\n.SS\nCONFIGURATION OPTIONS\n.LP\nThe following settings can be read in as environment variables or from the specified configuration file.  Environment settings are in uppercase.  For instance, in the C shell, variables can be set as:\n.LP\n.PD 0\n.RS\n.B setenv HM_MBOX \"/home/john/my_mailbox\"\n.LP\n.B setenv HM_FILEMODE 0600\n.PD\n.RE\n.LP\nIn the configuration file, blank lines and lines beginning with a hash mark\n.RB ( # )\nare ignored.  Variables must be in lowercase and separated by values with an equals\n.RB ( = )\nsign, such as:\n.LP\n.PD 0\n.RS\n.B mbox = \"/home/john/my_mailbox\"\n.LP\n.B filemode = 0600\n.PD\n.RE\n.LP\nSettings are read in this order: from the program's hard-wired internal defaults, from environment variables, from the configuration file, from command-line options.\n.LP\nSee \n.B hmrc.4\nfor more information on configuration file usage.\n.LP\nBelow is a partial list of variables that Hypermail understands. A full list is available in the file hmrc.html, or you can also look in setup.c. Boolean numbers can have the value of\n.B 0\nor\n.B 1.\n.TP\n.B HM_CONFIGFILE \"filename\"\nThis is the default configuration file to read settings in from.  This can only be specified as an environment variable.  If the first character is \"~\", Hypermail will look for the file under the current user's home directory.\n.TP\n.B HM_MBOX \"filename\"\nThis is the default mailbox to read messages in from.  Define this with a value of\n.B \"NONE\"\nto read from standard input as the default.\n.TP\n.B HM_ARCHIVES \"URL\"\nThis will create a link in the archived index pages labelled\n.I \"Other mail archives\"\nto the specified URL.  Define as\n.B \"NONE\"\nto omit such a link.\n.TP\n.B HM_ABOUT \"URL\"\nThis will create a link in the archived index pages labelled\n.I \"About this archive\"\nto the specified URL.  Define as\n.B \"NONE\"\nto omit such a link.\n.TP\n.B HM_REVERSE boolean_number\nDefining this variable as\n.B 1\nwill reverse-sort the article entries in the date and thread index files by the date they were received.  That is, the most recent messages will appear at the top of the index rather than the other way around.\n.TP\n.B HM_SHOWHEADERS boolean_number\nDefine this as\n.B 1\n to show the article header lines in the archived HTML files.  These lines \ntypically include the\n.BR \"To:\" , \" From: \" and \" Subject:\"\ninformation found in most email messages.\n.TP\n.B HM_SHOWHTML 0, 1, or 2\nDefine as\n.B 1\nto show the articles in a proportionally-spaced\nfont rather than a fixed-width (monospace) font. Setting this \noption to 1 also tells Hypermail to attempt to italicize quoted \npassages in articles.\nDefine as\n.B 2\nfor more complex conversion to html\nsimilar to that in txt2html.pl.\nShowhtml = 2 will normally produce nicer looking results than\nshowhtml = 1, and showhtml = 0 will look pretty dull, but\n1 and 2 run risks of altering the appearance in undesired ways.\n.TP\n.B HM_SHOWBR boolean_number\nDefine as\n.B 1\nto place\n.B <br>\ntags at the end of article lines.  Otherwise, all non-quoted article lines will word wrap.  This only takes effect if\n.B HM_SHOWHTML\nis defined.\n.TP\n.B HM_IQUOTES boolean_number\nDefine as\n.B 1\nto italicize quoted lines.\n.TP\n.B HM_SHOW_MSG_LINKS boolean_number\nDefine as\n.B 1\nto put the individual message links at the top of the individual\nmessage pages.  Define as\n.B 0\nto produce pages without the Next, Previous, Reply, In reply to, etc.  links.\n.TP\n.B HM_EURODATE boolean_number\nDefine as\n.B 1\nto display article received dates with days before months instead of months before days.\n.TP\n.B HM_SHOWREPLIES boolean_number\nDefine as\n.B 1\nto show all replies to a message as links in article files.\n.TP\n.B HM_MAILTO \"address\"\nThe address of the contact point that is put in the HTML header line \n   <LINK REV=made HREF=mailto:MAILTO>\n The <LINK...> header can be disabled by default by setting HM_MAILTO to \"NONE\".\n.TP\n.B HM_MAILCOMMAND \"command\"\nThis specifies the mail command to use when converting email addresses to links. The variables\n.B $TO, $SUBJECT,\nand\n.B $ID\ncan be used in constructing the command string.\n.B $TO\nrepresents the address to send mail to,\n.B $SUBJECT\nrepresents the subject that is being replied to, and\n.B $ID\nrepresents the message ID of the article that is being replied to.  If defined as\n.B \"NONE\",\nemail addresses will not be converted to links in articles.  A possible command one could use is\n.B \"mailto:$TO\",\nbut this could easily be changed to specify a CGI program such as\n.B \"/cgi-bin/mail?to=$TO\".\nA CGI mail program is included with the source which can be used for this purpose.\n.TP\n.B HM_DOMAINADDR \"domainname\"\nSet this to the domainname you want added to a mail address appearing\nin the RFC2822 field which lack a hostname.  When the list resides on the \nsame host as the user sending the message, it is often not required of\nthe MTA to domain-ize these addresses for delivery.  In such cases, \nHypermail will add the DOMAINADDR to the email address.  If defined as\n.B \"NONE\",\nthis feature is turned off.\n.TP\n.B HM_LABEL \"label name\"\nDefine this as the default label to put in archives. \n.TP\n.B HM_DIR \"directory\"\nThis is the default directory that Hypermail will look for when creating and updating archives.  If defined as\n.B \"NONE\"\nthe directory will have the same name as the input mailbox.\n.TP\n.B HM_DIRMODE octal_number\nThis is an octal number that new directories are set to when they are created.  If the archives will be made publically available, it's a good idea to define this as\n.B 0755. \nIf files will be updated incrementally with sendmail, this will have to be\n.B 0777.\n.TP\n.B HM_FILEMODE octal_number\nThis is an octal number that new files are set to when they are created.  If the archives will be made publically available, it's a good idea to define this as\n.B 0644.\n.TP\n.B HM_OVERWRITE boolean_number\nDefine as\n.B 1\nto make Hypermail overwrite existing archives by default. \n.TP\n.B HM_INCREMENT 0, 1, or -1\nDefine as\n.B 1\nto append all input messages to the end of existing archives.\n Define as\n.B 0\nfor it to read a mailbox that corresponds to the entire\narchive. (See the mbox_shortened option for\nan exception to the requirement that it be the entire archive).\nIf there are any existing html messages, it will figure out which\nones at the end of the mailbox are new, and add only those that haven't been\nconverted yet.\n Define as\n.B -1\nto have hypermail figure out whether the input\nis entirely new messages to be appended or whether it contains\nmessages that are already in the archive. A value of -1 cannot be\nused with the mbox_shortened option or with the -i command line\noption or with mbox = NONE.\n.TP\n.B HM_PROGRESS boolean_number\nDefine as\n.B 1\nor as\n.B 2\nto always show a progress report as Hypermail works.  Defined as 2 shows more information about the attachment files created.  This is written to stdout.\n.TP\n.B HM_THRDLEVELS number\nThis specifies the number of thread levels to outline in the thread index.  For instance, if\n.B HM_THRDLEVELS\nis\n.B 2,\nreplies to messages will be indented once in the index, but replies to replies, etc., will only be indented once as well.\n.TP\n.B HM_DEFAULTINDEX type\nThis specifies the default index that users can view when entering the archive.  Valid types are\n.B \"date,\"\n.B \"thread,\"\n.B \"author,\"\nand\n.B \"subject.\"\n.TP\n.BI HM_HMAIL \" submission-address\"\nThis is the email address used to send a new message to a hypermail archive.  \"NONE\" means don't use it.  Since this is different for each hypermail archive, you should probably leave it set to \"NONE\" here, and let it be specified at runtime by command-line parameters in the list specific configfile.\n.TP\n.B HM_IHTMLHEADERFILE path\nDefine path as the path to a file containing valid HTML formatting statements \nthat you wish to included at the top of every index page.  Hypermail will print\nthis file as the header of the index so make sure it contains \n.B <HTML>, <HEAD>, <BODY> \nand other statements that suit your local customized needs.\n.TP\n.B HM_IHTMLFOOTERFILE path\nDefine path as the path to a file containing valid HTML formatting statements \nthat you wish to included at the bottom of every index page.  Hypermail will \nprint this file as the trailer of the index so make sure it contains at a \nminimum a \n.B </BODY>\nand\n.B </HTML> \nstatement.\n.TP\n.B HM_MHTMLHEADERFILE path\nDefine path as the path to a file containing valid HTML formatting statements \nthat you wish to included at the top of every message page.  Hypermail will \nprint this file as the header of the message so make sure it contains \n.B <HTML>, <HEAD>, <BODY> \nand other statements that suit your local customized needs.\n.TP\n.B HM_MHTMLFOOTERFILE path\nDefine path as the path to a file containing valid HTML formatting statements \nthat you wish to included at the bottom of every message page.  Hypermail will \nprint this file as the trailer of the message so make sure it contains at a \nminimum a \n.B </BODY>\nand\n.B </HTML> \nstatement.\n.TP\n.B HM_SHOW_HEADERS list of headers to display\nDefine the list of headers to be displayed if the variable HM_SHOWHEADERS is set to 1 (ON).  This is a comma or space separated all on a single line such as \n\n  show_headers = From,Subject,Date,Message-ID \n\n or they can be listed individually or any combination of. \n\n.nf\n  show_headers = From \n  show_headers = Subject \n  show_headers = Date \n  show_headers = Message-ID \n.nr\n\nAs a special case you can use the identifier ``*'' as header to tell\n.B hypermail\nto display all header lines.\n\n.TP\n.B HM_INLINE_TYPES image data types to inline\nThis is the list of MIME types that you want inlined as opposed to \nsimply linked into the message.  They can be listed individually on \nmultiple lines or comma or space separated on a single line. \n\n.nf\n  inline_types = image/gif image/jpeg \n or \n  inline_types = image/gif inline_types = image/jpeg \n.nr\n.TP\n.B HM_IGNORE_TYPES indicate attachment types to ignore\nThis is the list of MIME attachment types that you do not want to do \nanything with.  They are quietly ignored.  They can be listed individually \non multiple lines or comma or space separated on a single line. \n\n.nf\n  ignore_types = text/x-vcard application/x-msdownload \n or \n  ignore_types = text/x-vcard \n  ignore_types = application/x-msdownload \n.nr\n.TP\n.B HM_LINKQUOTES boolean_number\nSet this to On to create fine-grained links from quoted\ntext to the text where the quote originated. It also improves\nthe threads index file by more accurately matching messages\nwith replies. Note that this may be rather cpu intensive (see\nthe searchbackmsgnum option to alter the performance).\n.TP\n.B HM_SEARCHBACKMSGNUM postive integer\nIf the linkquotes option is on and an incremental update is being\ndone (-u option), this controls the tradeoff between speed and\nthe reliability of finding the right source for quoted text.\nTry to set it to the largest number of messages between a\nmessage and the final direct reply to that message.\n.TP\n.B HM_LINK_TO_REPLIES \"text used to indicate links to replies\"\nIf the linkquotes option is on, specifying a string here\ncauses it to generate links from original quoted text the\nlocation(s) in replies which quote them. The string\nis used to display the link.\n.TP\n.B HM_QUOTE_HIDE_THRESHOLD percent (integer)\nIf the linkquotes option is on, setting this to an\ninteger less than 100 will cause it to replace quoted\ntext with one-line links if the percent of lines in the\nmessage body (exluding the signature) consisting of\nquoted text exceeds the number indicated by this option.\n.TP\n.B HM_QUOTE_LINK_STRING \"text to appear in place of quoted text\"\nIf the quote_hide_threshold option is being used, the\nquote_link_string will be used if available to display the\nlink that replaces the quoted text. If no string is specified\nhere, the first line of each section of quoted text will used.\n.TP\n.B HM_MONTHLY_INDEX = boolean_number\nSet this to On to create additional index files broken up\nby month. A summary.html file will provide links to all the\nmonthly indices.\n.TP\n.B HM_YEARLY_INDEX = boolean_number\nSet this to On to create additional index files broken up\nby year. A summary.html file will provide links to all the\nyearly indices.\n.TP\n.B HM_THREAD_FILE_DEPTH = 0 or 1\nIf nonzero, break the threads index file into multiple files,\nwith the initial message of each thread in the main index file\nalong with links to files containing the replies. Setting this\nto 1 creates one file for each thread that has replies, and is\nrecommended for archives with over a few hundred messages.\nSetting this greater than 1 will produce multiple levels of files\nfor each thread whose replies are nested by more than 1 level,\nbut that is rarely useful. This option is currently disabled\nif the indextable option is turned on, and probably needs to\nbe less than thrdlevels.\n\n.SH BUGS\n\n.LP\n.B Sorting:\nIn the date and thread index files, note that these lists are sorted by the date the articles were received by the system's mail daemon, not by the date they were written on.  The order of articles in the date index may not necessarily match the order in which the article files are written and linked together.  Because of this, it is a good idea to make sure the mailbox is sorted by date with the most recent messages towards the bottom.\n.LP\nForwarded messages with bad headers may be incorrectly handled.\n.LP\n.SH AUTHORS\n.LP\n.B Hypermail\nwas originally designed and developed by Tom Gruber\n.RI <gruber@intraspect.com>\nfor Enterprise Integration Technologies (EIT) in Common Lisp.  It was later rewritten in C by Kevin Hughes\n.RI <kev@kevcom.com>\nwhile at EIT.  Kevin passed on\\-going development and support for Hypermail \nto Kent Landfield\n.RI <kent@landfield.com>.\n.LP\nThe latest documentation can usually be found at\n .B http://www.hypermail.org/\n but you might also want to check the cvs repository which is the first\nplace that changes become available:\n .B http://cvs.hypermail.org/cgi-bin/cvsweb.cgi/hypermail/docs/\n.LP\n.SH CREDITS\n.LP\n.LP\nI'd like to thank the members of the Hypermail Development list for their \ncontinued encouragement, ideas, bug fixes and participation.  Additionally,\nfollowing people should be noted for their work and contributions to the \nhypermail development.  This list is far from complete ...\n.LP\n.nf\nBob Crispen <bob.crispen@boeing.com>\nAshley M. Kirchner <ashley@pcraft.com>\nDarci Chapman <minerva@phix.com> \nByron C. Darrah <bdarr@sse.FU.HAC.COM>\nDave Kopper <dave@birman.com>\nDaniel Stenberg <Daniel.Stenberg@haxx.nu>\nI.Ioannou <roryt@hol.gr>\nElliot Lee <sopwith@redhat.com>\nMartin Schulze <joey@infodrom.north.de>\nJay Soffian <jay@cimedia.com>\nJared Reisinger <feety@hhhh.org>\nPeter C. McCluskey <pcm@rahul.net>\nRoy T. Fielding <fielding@kiwi.ics.uci.edu>\nRoy Tennant <rtennant@library.berkeley.edu>\nJose Kahan <jose@w3.org>\nBjarni R. Einarsson <bre@netverjar.is>\nFrancisco Iacobelli <fiacobelli@ibersis.cl>\nNicolas Noble <pixels@chez.com>\nScott Rose <srose@direct.ca>\nGreg Shenaut <greg@bogslab.ucdavis.edu>\nW. Tasin <tasin@fhm.edu>\nDarryl Lee <lee@darryl.com>\nPaul Haldane <Paul.Haldane@newcastle.ac.uk>\nAndreas Fuchs <asf@ycom.at>\nDavid D Kilzer <ddkilzer@ti.com>\nTim Witham <twitham@pcocd2.intel.com>\nJyrki Kuoppala <jkp@kaapeli.fi>\nBernhard Reiter <bernhard@climate2.geog.uwm.edu>\nHisashi Gotoh <gotoh@horae.dti.ne.jp>\nDavid Eisner <cradle@glue.umd.edu>\nAndy Yoder <ayoder@heisenbug.org>\nPeter Karlsson <peter@softwolves.pp.se>\nMoritz Willers <Moritz.Willers@ubsw.com>\nDavid Bau <davidbau@hotmail.com>\nBrian Kirkby <bkirkby@Concentrico.net>\nWilliam King <William.King@dadaboom.com>\n.nr\n.TP\n"
  },
  {
    "path": "docs/hypermail.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n   \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<HTML>\n<HEAD>\n<TITLE>Hypermail Documentation</TITLE>\n<LINK REV=\"made\" HREF=\"mailto:webmaster@hypermail-project.org\">\n</HEAD>\n<BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\">\n<H1 ALIGN=CENTER><IMG SRC=\"hypermail.png\" ALIGN=\"middle\" WIDTH=\"60\" HEIGHT=\"60\" ALT=\"\">&nbsp;&nbsp;Hypermail</H1>\n\n<HR>\n\n<P>\n<STRONG>Contents:</STRONG>\n<UL>\n<LI><A HREF=\"#1\">What is Hypermail?</A>\n<LI><A HREF=\"#2\">Usage</A>\n<LI><A HREF=\"#3\">Command-Line Options</A>\n<UL>\n<LI><A HREF=\"#3.1\">Input and Output Options</A>\n<LI><A HREF=\"#3.2\">Archive Interface Options</A>\n<LI><A HREF=\"#3.3\">Updating Options</A>\n<LI><A HREF=\"#3.4\">Miscellaneous Options</A>\n</UL>\n<LI><A HREF=\"#4\">Configuration Options</A>\n<LI><A HREF=\"#5\">Order of Options Processing</A>\n<LI><A HREF=\"#6\">Other Things</A>\n<LI><A HREF=\"#6b\">Running Hypermail Automatically</A>\n<LI><A HREF=\"#7\">Getting Help With Hypermail</A>\n<LI><A HREF=\"#8\">Getting Hypermail Software</A>\n<LI><A HREF=\"#9\">Credits</A>\n<LI><A HREF=\"#10\">See Also</A>\n</UL>\n<P>\n\n<HR>\n\n<H1><A NAME=\"1\" HREF=\"#\">What is Hypermail?</A></H1>\n\n<STRONG>Hypermail</STRONG> is a program that takes a file of mail messages in UNIX mailbox format and generates a set of cross-referenced HTML documents. Each file that is created represents a separate message in the mail archive and contains links to other articles, so that the entire archive can be browsed in a number of ways by following links. Archives generated by Hypermail can be incrementally updated, and Hypermail is set by default to only update archives when changes are detected.\n<P>\nEach HTML file that is generated for a message contains (where applicable):\n<P>\n<UL>\n<LI>the subject of the article,\n<LI>the name and email address of the sender,\n<LI>the date the article was sent,\n<LI>links to the next and previous messages in the archive,\n<LI>a link to the message the article is in reply to, and\n<LI>a link to the message next in the current thread.\n</UL>\n<P>\nIn addition, Hypermail will convert references in each message to email addresses and URLs to hyperlinks so they can be selected. Email addresses can be converted to <STRONG>mailto:</STRONG> URLs or links to a CGI mail program. \n<P>\nTo complement each set of HTML messages, four index files are created which sort the articles by date received, thread, subject, and author. Each entry in these index files are links to the individual articles and provide a bird's-eye view of every archived message.\n<P>\nHypermail was originally developed and designed by <A HREF=\"mailto:gruber@intraspect.com\">Tom Gruber</A> for Enterprise Integration Technologies (EIT) in Common Lisp. It was later rewritten in C by <A HREF=\"mailto:kev@kevcom.com\">Kevin Hughes</A> while at EIT. Hypermail is now being maintained by Peter McCluskey <A HREF=\"mailto:pcm@rahul.net\">&lt;pcm@rahul.net&gt;</A>.\n<P>\n\nTo see what Hypermail can do, take a look at these Hypermail-produced archives:\n<P>\n<UL>\n<LI><A HREF=\"http://www.hypermail-project.org/archive/\">Hypermail Development Archives</A>\n<LI><A HREF=\"http://www.landfield.com/wu-ftpd/mail-archive/\">WU-FTPD Mailing list Archives</A>\n<LI><A HREF=\"http://www.faqs.org/faq-maintainers/mail-archive\">FAQ Maintainers Archives</A>\n</UL>\n<P>\n\n<HR>\n\n<H1><A NAME=\"2\" HREF=\"#\">Usage</A></H1>\n\n<P>\n<PRE>\nUsage: hypermail [options]\n\nOptions:\n  -a URL        : URL to other archives\n  -A            : Maintain an mbox archive\n  -b URL        : URL to archive information\n  -c file       : Configuration file to read in\n  -d dir        : The directory to save HTML files in\n  -g            : Build a GDBM header cache\n  -i            : Read messages from standard input\n  -l label      : What to name the output archive\n  -m mbox       : Mail archive to read in\n  -M            : Use metadata\n  -n listaddr   : The submission address of the list\n  -o keyword=val: Set config item\n  -p            : Show progress\n  -s htmlsuffix : HTML file suffix (.html, .htm, ..)\n  -t            : Use Tables\n  -T            : Use index tables\n  -u            : Append all input messages\n  -v            : Show configuration variables only\n  -V            : Show version information and exit\n  -x            : Overwrite previous messages\n  -X            : Write haof XML files\n  -0 number     : Delete messages\n  -1            : Read only one mail from input\n  -L lang       : Specify language to use (de en es fi fr is pl pt sv no el gr ru it )\n\n</PRE>\n<P>\nUsing the flags <STRONG>-h</STRONG>, or <STRONG>-?</STRONG> with Hypermail will display this usage summary.\n<P>\n\n<HR>\n\n<H1><A NAME=\"3\" HREF=\"#\">Command-Line Options</A></H1>\n\n<A NAME=\"3.1\" HREF=\"#\"><STRONG>Input and Output Options:</STRONG><BR></A>\n<BLOCKQUOTE>\n<STRONG>-i</STRONG>,\n<BR><STRONG>-m</STRONG>&nbsp;&nbsp;<EM>\"mailbox\"</EM>,\n<BR><STRONG>-d</STRONG>&nbsp;&nbsp;<EM>\"directory\"</EM>,\n<BR> <STRONG>-c</STRONG>&nbsp;&nbsp;<EM>\"file\"</EM>\n</BLOCKQUOTE>\n<P>\n\nTo tell Hypermail what mailbox to read in, use the <STRONG>-m</STRONG> option. If articles will be sent to Hypermail through standard input, use the <STRONG>-i</STRONG> option. Note that the <STRONG>-m</STRONG> and <STRONG>-i</STRONG> options can't be used together! By default, Hypermail will look for a file called <STRONG>mbox</STRONG> to read its articles in from.\n<P>\nThe <STRONG>-d</STRONG> option specifies the directory to put the HTML files and index files that are created into. If the directory doesn't exist, a new one will be created with the name that is specified. If the <STRONG>-d</STRONG> option isn't used, Hypermail will look for a directory with the same name as the mailbox or will create one if needed.\n<P>\n<PRE>\n   example 1: hypermail -m \"wu-ftpd\" -d \"/wu-ftpd\"\n   example 2: cat \"/var/spool/mail/wu-ftpd\" | hypermail -i\n</PRE>\n<P>\n<OL>\n<LI>This example reads the articles in <STRONG>wu-ftpd</STRONG> and will save the output in the <STRONG>/wu-ftpd</STRONG> directory.\n<P>\n<LI>This reads the file <STRONG>/var/spool/mail/wu-ftpd</STRONG> from standard input and will save the output in a directory called <STRONG>archive</STRONG> in the same directory Hypermail was run from.\n</OL>\n<P>\nNote that Hypermail can only read messages in the UNIX mailbox format! Such archives are typically RFC 2822 mail messages appended to each other that look similar to this:\n<P>\n<PRE>\n   From john@foo.com  Mon Jan  1 00:01:30 1994\n   Date: Mon, 1 Jan 1994 00:01:15 PDT\n   From: john@foo.com\n   To: everyone@foo.com\n   Subject: Hello, world!\n\n   Hi, everyone, just saying hello!\n\n   From someone.else@foo.com  Mon Jan  1 00:02:00 1994\n   Date: Mon, 1 Jan 1994 00:01:45 PDT\n   ...\n</PRE>\n<P>\nThe messages are typically separated by lines in this format:\n<P>\n<PRE>\n   From wu-ftpd@wugate.wustl.edu  Fri Jul  1 00:18:20 1994\n</PRE>\n<P>\nThe <STRONG>-c</STRONG> option tells Hypermail to read in settings from a <A HREF=\"hmrc.html\">configuration file</A>. By default, the program will attempt to read settings from a file called <STRONG>.hmrc</STRONG> in the user's home directory if it exists.\n<P>\nIn the configuration file, variables are set in the following manner:\n<P>\n<BLOCKQUOTE>\n<STRONG>\nvariable = number\n<BR>variable = \"string\"\n</STRONG>\n</BLOCKQUOTE>\n\nThe complete set of variables that Hypermail recognizes is described in the <A HREF=\"hmrc.html\">Configuration Options</A> page.\n<P>\n\n<A NAME=\"3.2\" HREF=\"#\"><STRONG>Archive Interface Options:</STRONG></A>\n<BLOCKQUOTE>\n<STRONG>-l</STRONG>&nbsp;&nbsp;<EM>\"label\"</EM>,\n<BR><STRONG>-b</STRONG>&nbsp;&nbsp;<EM>\"About URL\"</EM>,\n<BR> <STRONG>-a</STRONG>&nbsp;&nbsp;<EM>\"Other Archives URL\"</EM>\n</BLOCKQUOTE>\n<P>\nThe <STRONG>-l</STRONG> option tells Hypermail what to call the archive - the name that is specified will be in the title of the index pages so users know what sort of messages are being archived.\n<P>\nThe <STRONG>-a</STRONG> option includes a link labelled \"Other mail archives\" in the index pages to any specified URL. This way users who are looking at the archive have the opportunity to go to pointers to other mail archives. By default, this will be a pointer to the parent directory in which the archive files reside.\n<P>\nThe <STRONG>-b</STRONG> option includes a link labelled \"About this archive\" in the index pages to any specified URL. This way users who are looking at the archive have the opportunity to go to information about the archive.\n<P>\n<PRE>\n   example: hypermail -l \"WU-FTPD Development Archives\"\n            -a \"http://www.landfield.com/wu-ftpd/\"\n            -b \"http://www.landfield.com/wu-ftpd/mail-archive/\"\n</PRE>\n<P>\nIn the index files for the archive, the above setting will produce something like this:\n<P>\n<BLOCKQUOTE>\n<STRONG>(top of page)</STRONG>\n<P>\n<STRONG>WU-FTPD Archives</STRONG>\n<UL>\n<LI><A HREF=\"http://landfield.com/wu-ftpd/\"><STRONG>About this archive</STRONG></A>\n<LI><A HREF=\"http://landfield.com/wu-ftpd/mail-archive/\"><STRONG>Other mail archives</STRONG></A>\n</UL>\n<P>\n<STRONG>(list of indexed articles below)</STRONG>\n</BLOCKQUOTE>\n<P>\n\n<A NAME=\"3.3\" HREF=\"#\"><STRONG>Updating Options:</STRONG><BR></A>\n<BLOCKQUOTE>\n<STRONG>-x</STRONG>,\n<BR><STRONG>-u</STRONG>\n</BLOCKQUOTE>\n<P>\nThe <STRONG>-x</STRONG> option tells Hypermail to explicitly overwrite any previous HTML files that may exist. Use this option only when it is desirable to completely rewrite the entire archive.\n<P>\nThe <STRONG>-u</STRONG> option tells Hypermail to add message(s) to the end of the existing HTML file archive and integrate them into it by links and cross-references. All archive index files will be regenerated to include the new message.\n<P>\n Hypermail used to require that you only send it one message at a time when\nusing the <STRONG>-u</STRONG> option, but it should now work reasonably when\ngiven mailboxes containing multiple messages.\n<P>\nWhen using the <STRONG>-u</STRONG> option, don't send any messages that\nHypermail has already processed. If you want Hypermail to recognize that\nsome messages are old messages that shouldn't be added to the archive again,\nsend it a mailbox with a complete set of messages and avoid the\n<STRONG>-u</STRONG> option. \n<P>\n<PRE>\n   example 1: cat \"one.letter\" | hypermail -i -u -d \"/wu-ftpd/mail-archives\"\n   example 2: hypermail -u -m \"one.letter\" -d \"/wu-ftpd/mail-archives\"\n   example 3: hypermail -m \"mailbox\" -d \"/wu-ftpd/mail-archives\" -x\n   example 4: hypermail -m \"mailbox\" -d \"/wu-ftpd/mail-archives\"\n</PRE>\n<P>\n<OL>\n<LI>This tells Hypermail to take the article it receives from standard input \nand integrate it with the archive under the <STRONG>wu-ftpd/mail-archives</STRONG> \ndirectory. If no archive exists, a new one will be created with the specified \nletter as the first file of the archive.\n<P>\n<LI>This does the same thing, except that the letter is read in from a file that contains only that letter.\n<P>\n<LI>With these options, Hypermail will read in the articles from \n<STRONG>mailbox</STRONG> and write over any existing files in the \n<STRONG>wu-ftpd/mail-archives</STRONG> directory if they exist. If no archive \nexists, a new one will be created.\n<P>\n<LI>With these options, Hypermail will read in the articles from \n<STRONG>mailbox</STRONG> and only write new articles - it will not overwrite \nany existing archive files.\n</OL>\n<P>\nNote that no matter what options are specified, the index files are always \nrewritten. The date when Hypermail was last run is included in index pages, \nso it's easy to tell when the archive was last updated.\n<P>\n\n<A NAME=\"3.4\" HREF=\"#\"><STRONG>Miscellaneous Options</STRONG><BR></A>\n<BLOCKQUOTE>\n<STRONG>-p</STRONG>\n<BR><STRONG>-v</STRONG>\n<BR><STRONG>-V</STRONG>\n</BLOCKQUOTE>\n<P>\nThe <STRONG>-p</STRONG> option shows a progress report as Hypermail reads in and writes out messages - the number of files that Hypermail is reading and writing and the file names of the directory and files created are shown. This information is written to standard output.\n<P>\nThe <STRONG>-v</STRONG> option shows the configuration variables and their values that Hypermail would use if it was run with the same <A HREF=\"hmrc.html\">configuration file</A> and command line options. This is useful when starting up a new list or modifying a list configuration file. Once the information is displayed, Hypermail terminates and no actual processing occurs.\n<P>\nThe <STRONG>-V</STRONG> option prints the Hypermail version information. Once the information is displayed, Hypermail terminates and not actual processing occurs.\n<p>\nThe <strong>-0</strong> option list message numbers that should be deleted\nfrom the html archive. The mbox is not changed.\nIt is equivalent to the <a href=\"hmrc.html#delete_msgnum\">delete_msgnum</a>\noption.\n<P>\n<HR>\n\n<H1><A NAME=\"4\" HREF=\"#\">Configuration Options</A></H1>\n\nHypermail has many variables that can be set as environment variables or as variables in the specified <A HREF=\"hmrc.html\">configuration file</A>. For instance, using the C shell, one could define variables in this manner:\n<P>\n<PRE>\n   setenv HM_MBOX /home/john/my_mailbox\n   setenv HM_FILEMODE 0600\n</PRE>\n<P>\nIn the configuration file, variables must be in lowercase and separated by their values with an equals (<STRONG>=</STRONG>) sign. Blank lines and lines beginning with the <STRONG>#</STRONG> character are skipped:\n<PRE>\n   mbox = \"/home/john/my_mailbox\"\n   filemode = 0600\n</PRE>\nWhile the example uses quotes (<STRONG>\"</STRONG>), they is not required when used in the configuration file.\n<P>\nBelow is a list of the more important configuration variables.\nFor a complete list, see <a href=\"hmrc.html\">hmrc.html</a>.\n<P>\n<DL>\n<DT><STRONG>HM_LABEL \"label name\"</STRONG>\n<DD> Define this as the default label to put in archives.\n<P>\n<DT> <STRONG>HM_ARCHIVES \"URL\"</STRONG>\n<DD> This will create a link in the archived index pages to the specified \n     URL. Define as <STRONG>\"NONE\"</STRONG> to omit such a link.\n See also <a href=\"hmrc.html#custom_archives\">custom_archives</a>.\n<P>\n<DT> <STRONG>HM_HMAIL \"list submission address\"</STRONG>\n<DD> This is the email address used to send a new message to a hypermail archive.  \"NONE\" means don't use it.  Since this is different for each hypermail archive, you should probably leave it set to \"NONE\" here, and let it be specified at runtime by command-line parameters in the list specific configfile.\n<br>See also <a href=\"hmrc.html#newmsg_command\">newmsg_command</a>\nand  <a href=\"hmrc.html#replymsg_command\">replymsg_command</a>.\n<P>\n<DT> <STRONG>HM_DIR \"directory\"</STRONG>\n<DD> This is the default directory that Hypermail will look for when creating and updating archives. If defined as <STRONG>\"NONE\"</STRONG>, the directory name will be the same name as the mailbox read in.\n<P>\n<DT><STRONG>HM_MBOX \"filename\"</STRONG>\n<DD> This is the default mailbox to read messages in from. Define this with \n     a value of <STRONG>\"NONE\"</STRONG> to read from standard input as the \n     default.\n<P>\n<dt><strong>HM_STRIPSUBJECT \"text\"</strong></dt><dd>\n A string to be stripped from all subject lines. Helps\nunclutter  mailing  lists  which  add  tags  to subject lines.\n</dd>\n<P>\n<a name=\"folder_by_date\"></a>\n<dt><strong>HM_FOLDER_BY_DATE = \"strftime-date-format\"</strong></dt><dd>\nThis string causes the messages to be put in subdirectories\nby date. The string will be passed to strftime(3) to generate\nsubdirectory names based on message dates. Suggested values are\n&quot;%y%m&quot; or &quot;%b%y&quot; for monthly subdirectories, &quot;%Y&quot; for\nyearly, &quot;%G/%V&quot; for weekly. Do not alter this for an existing\narchive without removing the old html files. If you use this\nand update the archive incrementally (e.g. with -u), you must\nuse the <a href=\"hmrc.html#usegdbm\">usegdbm</a> option.\n<br>See also <a href=\"hmrc.html#monthly_index\">monthly_index</a>.\n</dd>\n<P>\n<a name=\"isodate\"></a>\n<dt><strong>HM_ISODATE boolean_number</strong></dt><dd>\nSet this to On to display article received dates in\nYYYY-MM-DD HH:MM:SS format. If used with the <a href=\"hmrc.html#gmtime\">gmtime</a>\noption, a Z will be inserted between the DD and HH.\n<br>See also <a href=\"hmrc.html#eurodate\">eurodate</a> and <a href=\"hmrc.html#dateformat\">dateformat</a>.\n</dd>\n<P>\n<DT><STRONG>HM_LANGUAGE \"language-id\"</STRONG>\n<DD> This is a two-letter string specifying the default\n     language  to  use, or a longer string specifying a language\n     and locale. Set this the value of the language\n     table you wish  to  use  when  running  and  generating\n     archives.  See also <a href=\"hmrc.html#iso2022jp\">iso2022jp</a>\n     and <a href=\"hmrc.html#eurodate\">eurodate</a>.\n<BR> \n<BR> Current supported languages, with their default locales:\n<BLOCKQUOTE>\nde (de_DE) - German\n<BR>en (en_US) - English\n<BR>es (es_ES) - Spanish\n<BR>fi (fi_FI) - Finnish\n<BR>fr (fr_FR) - French\n<BR>el (el) - Greek\n<BR>gr (el_GR) - Greek\n<BR>is (is_IS) - Icelandic\n<br>no (no_NO) - Norwegian\n<BR>pl (pl_PL) - Polish\n<br>pt (pt_BR) - Brazilian Portuguese\n<BR>ru (ru_RU) - Russian\n<BR>sv (sv_SE) - Swedish\n</BLOCKQUOTE>\nThe directory /usr/share/i18n/locales on many systems has the locale\ncodes that are available on that system.\n<P>\n<DT> <STRONG>HM_INCREMENT -1, 0, or 1</STRONG>\n<br> Define as <strong>1</strong> to append all input messages to the end of existing archives.\n<br> Define as <strong>0</strong> for it to read a mailbox that corresponds to the entire\narchive. If there are any existing html messages, it will figure out which\nones at the end of the mailbox are new, and add only those that haven't been\nconverted yet.\n<br> Define as <strong>-1</strong> to have hypermail figure out whether the input\nis entirely new messages to be appended or whether it contains\nmessages that are already in the archive. A value of -1 cannot be\nused with the mbox_shortened option or with the -i command line\noption or with mbox = NONE.<br>\n<P>\n<a name=\"append\"></a>\n<dt><strong>HM_APPEND boolean_number</strong></dt><dd>\nSet this to On to maintain a parallel mbox archive. The file\nname defaults to mbox in the directory specified by -d or dir.\n<br>See also <a href=\"hmrc.html#append_filename\">append_filename</a>\nand <a href=\"hmrc.html#txtsuffix\">txtsuffix</a>.\n</dd>\n<P>\n<DT> <STRONG>HM_SHOWHTML 0, 1, or 2</STRONG>\n<DD> \nDefine as <STRONG>1</STRONG> to show the articles in a proportionally-spaced\nfont rather than a fixed-width (monospace) font. Setting this \noption to 1 also tells Hypermail to attempt to italicize quoted \npassages in articles.\n<P>\nDefine as <STRONG>2</STRONG> for more complex conversion to html\nsimilar to that in <a href=\"http://www.cs.wustl.edu/~seth/txt2html/\">txt2html.pl</a>.\nShowhtml = 2 will normally produce nicer looking results than\nshowhtml = 1, and showhtml = 0 will look pretty dull, but\n1 and 2 run risks of altering the appearance in undesired ways.\n<P>\n<DT> <STRONG>HM_LINKQUOTES boolean_number</STRONG>\n<DD> Set this to On to create fine-grained links from quoted\ntext to the text where the quote originated. It also improves\nthe threads index file by more accurately matching messages\nwith replies. Note that this may be rather cpu intensive (see\nthe <a href=\"hmrc.html#searchbackmsgnum\">searchbackmsgnum</a> option to alter the performance).\n<P>\n<DT> <STRONG>HM_ABOUT \"URL\"</STRONG>\n<DD> This will create a link in the archived index pages to the specified URL. Define as <STRONG>\"NONE\"</STRONG> to omit such a link.\n<P>\n<DT> <STRONG>HM_MAILTO address</STRONG>\n<DD> The address of the contact point that is put in the HTML header line\n<DL>\n<DD><STRONG>&lt;LINK REV=made HREF=mailto:MAILTO&gt;</STRONG>\n</DL>\n     The &lt;LINK...&gt; header can be  disabled  by  default  by setting HM_MAILTO to \"NONE\".\n<P>\n<DT><STRONG>HM_INDEXTABLE boolean_number</STRONG>\n<DD>Setting this variable to 1 will tell Hypermail to  generate  \n    a message index Subject/Author/Date listings using a table \n    format. Set to 0 if you want the standard Hypermail index \n    page look and feel.\n<P>\n<DT><STRONG>HM_FILTER_OUT expression</STRONG>\nDelete messages with headers matching regular expressions\n(<a href=\"http://www.pcre.org/\">PCRE</a> syntax).\nSee also <a href=\"hmrc.html#filter_require\">filter_require</a>,\n<a href=\"hmrc.html#filter_out_full_body\">filter_out_full_body</a>, and\n<a href=\"hmrc.html#filter_require_full_body\">filter_require_full_body</a>.\n\n<P>\n<DT> <STRONG>HM_DOMAINADDR \"domainname\"</STRONG>\n<DD>Set this to the domainname you want added to a mail address appearing\nin the RFC2822 field which lack a hostname. When the list resides on the \nsame host as the user sending the message, it is often not required of\nthe MTA to domain-ize these addresses for delivery.  In such cases, \nHypermail will add the DOMAINADDR to the email address. If defined as\nNONE, this feature is turned off.\n<P>\n<DT><STRONG>HM_USEMETA  [ 0 | 1 ]</STRONG>\n<DD>This option allows you to use metadata to store the content type\n    of a MIME attachments and, later on,  when a user browses the\n    attachment, send back this information in the HTTP Content-Type\n    header. When set to <STRONG>1</STRONG>, the Content-Type header of a \n    MIME attachment will be stored in a metadata file. Let us say that \n    the MIME attachments for a message are stored in directory \n    <STRONG>att-num</STRONG>. The metadata for those attachments will \n    then be stored in  directory <STRONG>att-num/.meta</STRONG>. If a \n    MIME attachment is stored in file <STRONG>att-file</STRONG>, its \n    metadata will be stored in file <STRONG>att-file.meta</STRONG>. This \n    convention is directly compatible with the Apache server handling of \n    metadata.\n<P>\n<DT> <STRONG>HM_REVERSE boolean_number</STRONG>\n<DD> Defining this variable as <STRONG>1</STRONG> will reverse-sort the article entries in the date and thread index files by the date they were received. That is, the most recent messages will appear at the top of the index rather than the other way around.\n<P>\n<DT> <STRONG>HM_MHTMLHEADERFILE \"path\"</STRONG>\n<DD> Define path as the path to a file containing valid HTML formatting statements that you wish to included at the top of every message page. Hypermail will print this file as the header of the message so make sure it contains <STRONG>&lt;HTML&gt;, &lt;HEAD&gt;, and &lt;BODY&gt; </STRONG> and other statements that suit your local customized needs.\n<br>\nSee also <a href=\"hmrc.html#ihtmlheaderfile\">ihtmlheaderfile</a>,\n<a href=\"hmrc.html#ihtmlfooterfile\">ihtmlfooterfile</a>, and\n<a href=\"hmrc.html#mhtmlfooterfile\">mhtmlfooterfile</a>.\n<P>\n<DT><STRONG>HM_CONFIGFILE \"filename\"</STRONG>\n<DD>This is the default configuration file to read settings in from. This \n     can only be specified as an environment variable. If the first character \n     is \"~\", Hypermail will look for the file under the current user's home \n     directory.\n<P>\n</DL>\n<P>\n\n<HR>\n\n<H1><A NAME=\"5\" HREF=\"#\">Order of Options Processing</A></H1>\n<P>\nSettings are processed in this order:\n<P>\n<OL>\n<LI>From the program's hard-wired internal defaults (specified in options.h),\n<LI>From runtime environment variables,\n<LI>From the configuration file,\n<LI>From command-line options.\n</OL>\n<P>\nEarly versions of Hypermail read the command line before reading the\nconfiguration file.\n<P>\n<HR>\n\n<H1><A NAME=\"6\" HREF=\"#\">Other Things</A></H1>\n\n<STRONG>Filenames:</STRONG> In the specified directory, articles will be read out in the order that they were read in from a mailbox or standard input. Filenames start at zero and increase in this fashion: <STRONG>0000.html, 0001.html, 0002.html</STRONG>, etc. In the same directory:\n<P>\n<UL>\n<LI><STRONG>date.html</STRONG> is the index of articles sorted by the date they were received by the system's mail daemon.\n<LI><STRONG>thread.html</STRONG> is the index of articles sorted by thread first, then the date they were received.\n<LI><STRONG>subject.html</STRONG> is the index of articles sorted by subject. Any \"Re:\" prefixes in front of subjects will have been stripped out.\n<LI><STRONG>author.html</STRONG> is the index of articles sorted by the first word of the author's name. If the author's name can't be determined, their email address will be substituted.\n<LI>One of the above files will be called <STRONG>index.html</STRONG> and is the default index that users can go to when entering the archive.\n</UL>\n<P>\n\n<STRONG>Sorting:</STRONG> In the date and thread index files, note that these lists are sorted by the date the articles were received by the system's mail daemon, not by the date they were written on. The order of articles in the date index may not necessarily match the order in which the article files are written and linked together. Because of this, it is a good idea to make sure the mailbox is sorted by date with the most recent messages towards the bottom.\n<P>\n\n<a name=\"6b\"></a>\n<STRONG>Running Hypermail automatically:</STRONG> All that's needed to start archiving email messages is to set up Hypermail to do incremental updates in your <STRONG>/etc/aliases</STRONG> file (assuming that you use <strong>sendmail</strong> or something that works like it to deliver mail).\n Here's what an entry might look like (the last line is one unbroken line):\n<BLOCKQUOTE>\n<STRONG>\n#\n<BR># WU-FTPD Mailing List Archives\n<BR># \n<BR>wulist: \"|/usr/local/bin/hypermail -i -u -d /wu-ftpd/mail-archive -l \\\"WU-FTPD Mailing List Archive\\\"\"\n</STRONG>\n</BLOCKQUOTE>\n\nAfter adding the entry, make sure <STRONG>newaliases</STRONG> is run to update the \nmail aliases. This entry will run Hypermail and update/create the archive whenever \na new message is received. Hypermail also works well as a <STRONG>cron</STRONG> job. \nBecause <STRONG>sendmail</STRONG> may run Hypermail as different users, you will \nwant to make sure that archive directories and files are made readable and writeable \nby a trusted sendmail user (or read/writable by everyone if you can't do that)\nwhen they are created. This will ensure that there will be no problems incrementally \nupdating the archive.\n<P>If you use qmail instead of sendmail, you probably want to create a file\n/var/qmail/alias/.qmail-&lt;mylistemailaddress&gt; containing something like this:\n<blockquote>\n|/usr/local/bin/hypermail -i -u -d /wu-ftpd/mail-archive -l \\\"WU-FTPD Mailing List Archive\\\"\n</blockquote>\n<P>\n If you are running Linux kernel version 2.4 or higher, \n<a href=\"http://www.student.lu.se/~nbi98oli/dnotify.html\">dnotify</a>\nlooks like it provides another way to automate Hypermail.\n\n<P>\n<STRONG>Including HTML in messages:</STRONG> One can include formatted HTML in message bodies by enclosing the HTML with the &lt;HTML&gt; tag (in either uppercase or lowercase). This tag must be on a line by itself:\n<P>\n<PRE>\n   This text will not be parsed...\n   &lt;html&gt;\n   <STRONG>this text</STRONG> will be parsed as HTML.\n   &lt;/html&gt;\n   This text will not be parsed...\n</PRE>\n<P>\nThere is no limit to how often the &lt;HTML&gt; tag can be used in an article.\n<P>\n\n<HR>\n\n<H1><A NAME=\"7\" HREF=\"#\">Getting Help With Hypermail</A></H1>\n<P>\nIf you are are looking for more information on Hypermail and its features and\ndevelopmental status, check out\n<a href=\"http://sourceforge.net/projects/hypermail/\">SourceForge: Project Info - hypermail</a>\nand <a href=\"http://www.hypermail-project.org\">hypermail-project.org</a>. Additional\ndocumentation and the hypermail development list archives are available there.\n\n<P>\n<HR>\n\n<H1><A NAME=\"8\" HREF=\"#\">Getting Hypermail Software</A></H1>\n\n<P>\nHypermail is available free of charge under GNU Public License. More details \nabout the GPL are available at <A HREF=\"http://www.fsf.org/copyleft/gpl.html\">http://www.fsf.org/copyleft/gpl.html</A>.\n<P>\nCurrently, <a href=\"http://sourceforge.net/projects/hypermail/\">SourceForge: Project Info - hypermail</a>\nhas the most recent version.\n<P>\n<A HREF=\"http://www.hypermail-project.org/\">The Hypermail Development Center</A> also has beta development versions of hypermail available from time to time.\n\n<P>\n<HR>\n\n<H1><A NAME=\"9\" HREF=\"#\">Credits</A></H1>\n \nI would like to thank <A HREF=\"mailto:gruber@intraspect.com\">Tom Gruber</A>, \nwho originally designed and developed Hypermail in Common Lisp, for the basis \nof a <STRONG>GREAT</STRONG> tool.  \n<P>\nI'd also like to thank <A HREF=\"mailto:kev@kevcom.com\">Kevin Hughes</A> for \ndeveloping the initial C version of Hypermail. Kevin also provided a great \ndeal of assistance with restarting the current hypermail development.\n<P>\nThere are a great deal of people that also contributed to Hypermail's development. \nThe <A HREF=\"http://www.hypermail.org/hypermail/credits.html\">Hypermail Development Center Credits</A> page is an attempt to let you know just who they are. \n<P>\nHypermail development is currently being fostered by\n<A HREF=\"mailto:pcm@rahul.net\">&lt;Peter McCluskey&gt;</A>.\n\n<P>\n\n<HR>\n<H1><A NAME=\"10\" HREF=\"#\">See Also</A></H1>\n<BLOCKQUOTE> \n<STRONG>hypermail(1)</STRONG>,\n&nbsp; \n<STRONG>hmrc(4)</STRONG>,\n&nbsp; \n<STRONG><A HREF=\"hmrc.html\">Hypermail List Configuration File</A></STRONG>.\n&nbsp; \nand \n&nbsp; \n<STRONG><A HREF=\"customizing.html\">Customizing Hypermail Pages</A></STRONG>\nand <STRONG><A HREF=\"archive_search.html\">Adding a Search Engines to your Hypermail Archive</A></STRONG>\n</BLOCKQUOTE> \n \n\n<HR>\n<P>\n<EM>\nPlease send any feature requests, bug fixes, and comments on Hypermail \nto <A HREF=\"mailto:hypermail@hypermail-project.org\">&lt;hypermail@hypermail-project.org&gt;</A>. In order to minimize spam on the list, you must subscribe to the list (at least temporarily) in order to send mail to it.\nYou may subscribe to the list by sending a message with the word\n\"subscribe\" in the Subject: field to hypermail-request@hypermail-project.org.\n</EM>\n<P>\n<SMALL><EM><STRONG>\nLast updated Sep 2, 2006\n</STRONG></EM></SMALL>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "docs/index_hypermail.txt",
    "content": "From Bill Moseley:\n\nI noticed this page on indexing with Swish-e:\n\n  http://hypermail.org/source/docs/archive_search.html\n\nHere's another way if using Perl.\n\nThe Swish-e (http://swish-e.org) package comes with a script for\nindexing hypermail archives and includes instructions on usage.  Below\nI've included part of the documentation.\n\nThat script is in use here:\n\n  http://swish-e.org/Discussion/archive/\n\nThe search results page is not that pretty, but it's just using the\ndefault templates.  I'm often frustrated when searching archives that I\ncan't limit by date or author.  So besides being able to just search by\nname, email, title, etc., you can do a search like:\n\n  hypermail name=moseley\n\nto find posts with \"hypermail\" in either the title or body, and also\nonly messages from moseley.\n\n\nHere's the (un-proof read) instructions:\n\n\nNAME\n    index_hypermail.pl - Parse Hypermail archive for indexing with Swish-e\n\nSYNOPSIS\n    Using an example data structure like this:\n\n        hypermail/\n            archive/\n            search/\n\n    Create the hypermail archive:\n\n        $ cd hypermail\n        $ hypermail -i -d archive < messages.mbox\n\n    Create a swish-e config file:\n\n        $ cd search\n        $ cat swish.conf\n\n        # config for indexing hypermail v2.1.8 archives\n\n        IndexDir ./index_hypermail.pl\n        SwishProgParameters ../archive\n\n        MetaNames swishtitle name email\n        PropertyNames name email\n        IndexContents HTML* .html\n        StoreDescription HTML* <body> 100000\n        UndefinedMetaTags  ignore\n\n    Copy index_hypermail.pl to the current directory. Swish-e installs\n    index_hypermail.pl in the $prefix/share/doc/swish-e/examples/prog-bin\n    directory, where $prefix is typically \"/usr/local\" or simply \"/usr\" on\n    some distributions.\n\n        $ cp /usr/local/share/doc/swish-e/example/prog-bin/index_hypermail .\n\n    Then\n\n    Index the documents:\n\n        $ swish-e -c swish.conf -S prog\n\n    Now create the search interface:\n\n        $ cp /usr/local/lib/swish-e/swish.cgi .\n        $ cat .swishcgi.conf\n\n        $ENV{TZ} = 'UTC'; # display dates in UTC format\n\n        return {\n            title           => \"Search the Foo List Archive\",\n            display_props   => [qw/ name email swishlastmodified /],\n            sorts           => [qw/swishrank swishtitle email swishlastmodified/],\n            metanames       => [qw/swishdefault swishtitle name email/],\n            name_labels     => {\n                swishrank           =>  'Rank',\n                swishtitle          =>  'Subject Only',\n                name                =>  \"Poster's Name\",\n                email               =>  \"Poster's Email\",\n                swishlastmodified   =>  'Message Date',\n                swishdefault        =>  'Subject & Body',\n            },\n\n            highlight       => {\n                package         => 'SWISH::PhraseHighlight',\n\n                xhighlight_on    => '<font style=\"background:#FFFF99\">',\n                xhighlight_off   => '</font>',\n\n                meta_to_prop_map => {   # this maps search metatags to display properties\n                    swishdefault    => [ qw/swishtitle swishdescription/ ],\n                    swishtitle      => [ qw/swishtitle/ ],\n                    email           => [ qw/email/ ],\n                    name            => [ qw/name/ ],\n                    swishdocpath    => [ qw/swishdocpath/ ],\n                },\n            },\n        };\n\n    Setup web server (OS/web server dependent):\n\n        /var/www # ln -s /path/to/hypermail/search\n        /var/www # ln -s /path/to/hypermail/archive\n\n    and maybe tell apache to run the script:\n\n        $ cat .htaccess \n        Deny from all\n        <files swish.cgi>\n            Allow from all\n            SetHandler cgi-script\n            Options +ExecCGI\n        </files>\n\n"
  },
  {
    "path": "install-sh",
    "content": "#! /bin/sh\n#\n# install - install a program, script, or datafile\n# This comes from X11R5 (mit/util/scripts/install.sh).\n#\n# Copyright 1991 by the Massachusetts Institute of Technology\n#\n# Permission to use, copy, modify, distribute, and sell this software and its\n# documentation for any purpose is hereby granted without fee, provided that\n# the above copyright notice appear in all copies and that both that\n# copyright notice and this permission notice appear in supporting\n# documentation, and that the name of M.I.T. not be used in advertising or\n# publicity pertaining to distribution of the software without specific,\n# written prior permission.  M.I.T. makes no representations about the\n# suitability of this software for any purpose.  It is provided \"as is\"\n# without express or implied warranty.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.  It can only install one file at a time, a restriction\n# shared with many OS's install programs.\n\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=\"${DOITPROG-}\"\n\n\n# put in absolute paths if you don't have them in your path; or use env. vars.\n\nmvprog=\"${MVPROG-mv}\"\ncpprog=\"${CPPROG-cp}\"\nchmodprog=\"${CHMODPROG-chmod}\"\nchownprog=\"${CHOWNPROG-chown}\"\nchgrpprog=\"${CHGRPPROG-chgrp}\"\nstripprog=\"${STRIPPROG-strip}\"\nrmprog=\"${RMPROG-rm}\"\nmkdirprog=\"${MKDIRPROG-mkdir}\"\n\ntransformbasename=\"\"\ntransform_arg=\"\"\ninstcmd=\"$mvprog\"\nchmodcmd=\"$chmodprog 0755\"\nchowncmd=\"\"\nchgrpcmd=\"\"\nstripcmd=\"\"\nrmcmd=\"$rmprog -f\"\nmvcmd=\"$mvprog\"\nsrc=\"\"\ndst=\"\"\ndir_arg=\"\"\n\nwhile [ x\"$1\" != x ]; do\n    case $1 in\n\t-c) instcmd=\"$cpprog\"\n\t    shift\n\t    continue;;\n\n\t-d) dir_arg=true\n\t    shift\n\t    continue;;\n\n\t-m) chmodcmd=\"$chmodprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-o) chowncmd=\"$chownprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-g) chgrpcmd=\"$chgrpprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-s) stripcmd=\"$stripprog\"\n\t    shift\n\t    continue;;\n\n\t-t=*) transformarg=`echo $1 | sed 's/-t=//'`\n\t    shift\n\t    continue;;\n\n\t-b=*) transformbasename=`echo $1 | sed 's/-b=//'`\n\t    shift\n\t    continue;;\n\n\t*)  if [ x\"$src\" = x ]\n\t    then\n\t\tsrc=$1\n\t    else\n\t\t# this colon is to work around a 386BSD /bin/sh bug\n\t\t:\n\t\tdst=$1\n\t    fi\n\t    shift\n\t    continue;;\n    esac\ndone\n\nif [ x\"$src\" = x ]\nthen\n\techo \"install:\tno input file specified\"\n\texit 1\nelse\n\ttrue\nfi\n\nif [ x\"$dir_arg\" != x ]; then\n\tdst=$src\n\tsrc=\"\"\n\t\n\tif [ -d $dst ]; then\n\t\tinstcmd=:\n\telse\n\t\tinstcmd=mkdir\n\tfi\nelse\n\n# Waiting for this to be detected by the \"$instcmd $src $dsttmp\" command\n# might cause directories to be created, which would be especially bad \n# if $src (and thus $dsttmp) contains '*'.\n\n\tif [ -f $src -o -d $src ]\n\tthen\n\t\ttrue\n\telse\n\t\techo \"install:  $src does not exist\"\n\t\texit 1\n\tfi\n\t\n\tif [ x\"$dst\" = x ]\n\tthen\n\t\techo \"install:\tno destination specified\"\n\t\texit 1\n\telse\n\t\ttrue\n\tfi\n\n# If destination is a directory, append the input filename; if your system\n# does not like double slashes in filenames, you may need to add some logic\n\n\tif [ -d $dst ]\n\tthen\n\t\tdst=\"$dst\"/`basename $src`\n\telse\n\t\ttrue\n\tfi\nfi\n\n## this sed command emulates the dirname command\ndstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`\n\n# Make sure that the destination directory exists.\n#  this part is taken from Noah Friedman's mkinstalldirs script\n\n# Skip lots of stat calls in the usual case.\nif [ ! -d \"$dstdir\" ]; then\ndefaultIFS='\t\n'\nIFS=\"${IFS-${defaultIFS}}\"\n\noIFS=\"${IFS}\"\n# Some sh's can't handle IFS=/ for some reason.\nIFS='%'\nset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`\nIFS=\"${oIFS}\"\n\npathcomp=''\n\nwhile [ $# -ne 0 ] ; do\n\tpathcomp=\"${pathcomp}${1}\"\n\tshift\n\n\tif [ ! -d \"${pathcomp}\" ] ;\n        then\n\t\t$mkdirprog \"${pathcomp}\"\n\telse\n\t\ttrue\n\tfi\n\n\tpathcomp=\"${pathcomp}/\"\ndone\nfi\n\nif [ x\"$dir_arg\" != x ]\nthen\n\t$doit $instcmd $dst &&\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dst; else true ; fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dst; else true ; fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dst; else true ; fi\nelse\n\n# If we're going to rename the final executable, determine the name now.\n\n\tif [ x\"$transformarg\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\tdstfile=`basename $dst $transformbasename | \n\t\t\tsed $transformarg`$transformbasename\n\tfi\n\n# don't allow the sed command to completely eliminate the filename\n\n\tif [ x\"$dstfile\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\ttrue\n\tfi\n\n# Make a temp file name in the proper directory.\n\n\tdsttmp=$dstdir/#inst.$$#\n\n# Move or copy the file name to the temp name\n\n\t$doit $instcmd $src $dsttmp &&\n\n\ttrap \"rm -f ${dsttmp}\" 0 &&\n\n# and set any options; do chmod last to preserve setuid bits\n\n# If any of these fail, we abort the whole thing.  If we want to\n# ignore errors from any of these, just make sure not to ignore\n# errors from the above \"$doit $instcmd $src $dsttmp\" command.\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&\n\n# Now rename the file to the real destination.\n\n\t$doit $rmcmd -f $dstdir/$dstfile &&\n\t$doit $mvcmd $dsttmp $dstdir/$dstfile \n\nfi &&\n\n\nexit 0\n"
  },
  {
    "path": "lcc/README.txt",
    "content": "A.  COMPILING HYPERMAIL USING LCC-Win32\n\n1.  Install LCC-Win32 in c:\\lcc (the default installation directory)\n\n2.  Put the Hypermail directory tree in c:\\lcc\\projects\\hypermail\n\n3.  Bring up wedit, select \"Project\" and \"Create\"\n\n4.  Name the project \"hypermail\"\n\n5.  Make the path to the project's working directory\n\n\tc:\\lcc\\projects\\hypermail\\lcc\n\n6.  Check to see that the Output Directory is\n\n\tc:\\lcc\\projects\\hypermail\\lcc\\lcc\n\n7.  Click on \"Create\".\n\n8.  On the \"Do you want to use the wizard to generate the application\n    skeleton?\" dialog, click \"No\".\n\n9.  On the \"Add source files to project\" dialog, click \"Cancel\" \n\n10. On the \"Source files for project\" dialog, click \"Read file list\n    from a text file\"\n\n11. Select \"hypermail_files.txt\"\n\n12. Click on \"OK\"\n\n13. On the \"Compiler settings dialog\", click \"Next\"\n\n14. On the \"Linker settings\" dialog type \"gdbm.lib\" in the \"Additional\n    files to be included in the link\" space, then click \"Next\".\n\n15. On the \"Debugger settings\" dialog, make any changes you'd like\n    to use to begin your debugging session and click \"Finish\".\n\n16. At this point you should see a lot of text file windows open and\n    a dialog labeles \"Building makefile for hypermail\" with a progress\n    bar which moves to the end.\n\n17. Select \"Compiler\" and \"Make\".  Observe some fairly meaningless\n    error messages and observe the linker return code is \"0\" (success).\n\n\nB.  TIPS, BUGS, AND LIMITATIONS ON HYPERMAIL FOR WINDOWS\n\n1.  Hypermail gives a warning message when it attempts to set a locale\n    on Windows 98 (and probably 95 and ME).  I believe this is due to a\n    limitation in the Windows 9x family of operating systems.  It should\n    work OK on NT family operating systems.\n\n2.  LCC version 3.3's standard library gives a blank output for date\n    and time when the \"%D\" format string is specified.  Since \"%D\" is\n    deprecated anyway, I recommend using \"%c\" instead, which will give\n    the same result on U.S. systems.\n\n3.  Don't build hypermail archives in directories that are shortcuts to\n    other directories.\n\n4.  The \"latest_folder\" configuration option is turned off in Windows.\n\n5.  By default, we're building PCRE as an 8-bit library. If you want\n    to build it instead as an 16-bit or 32-bit library, change the\n    pcre file names in hypermail_files.txt to use the pcre16\n    or pcre32 prefix for the following files: pcrenn_maketables.c,\n    pcrenn_study.c, pcrenn_get.c, where nn should be 16 or 32.\n\n6.  If you have problems comping the newer pcre library, check\n    the NON-AUTOTOOLS-BUILD file for more info and send feedback\n    so that we can updat these instructions.\n\nBob Crispen\nrevbob@crispen.org\n\n"
  },
  {
    "path": "lcc/defaults.h",
    "content": "#ifndef __DEFAULTS_H\n#define __DEFAULTS_H\n\n/* ALERT! ALERT! ALERT! ALERT! ALERT! ALERT! ALERT! ALERT!\n *\n * The #defines following here ARE NOT intended to be modified locally \n * before you compile hypermail. They're here to set internal defaults \n * and they are set during the configure process. To alter these settings\n * for use during runtime, modify your config file!\n */\n\n#define CONFIGFILE \"~/.hmrc\"\n\n#define INLINE_TYPES \"image/gif image/jpeg image/png\"\n\n#define SHOW_HEADERS \"From Subject Date Message-ID\"\n\n#define MAILCOMMAND \"mailto:$TO?Subject=$SUBJECT\"\n\n#define PROGRESS 0\n\n#define RECOGNIZE_SUPERCITE_QUOTES 1\n\n#define LANGUAGE     \"@language@\"\n\n#define HTMLSUFFIX   \"@htmlsuffix@\"\n\n#define DEFAULTINDEX \"@defaultindex@\"\n\n#define DOMAINADDR   \"@domainaddr@\"\n\n#define ANTISPAM_AT   \"_at_\"\n\n#endif\n"
  },
  {
    "path": "lcc/dirent.c",
    "content": "/*\n\n    Implementation of POSIX directory browsing functions and types for Win32.\n\n    Author:  Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com)\n    History: Created March 1997. Updated February 2003.\n    Rights:  See end of file.\n\n*/\n\n#include \"dirent.h\"\n#include <errno.h>\n#include <io.h> /* _findfirst and _findnext set errno iff they return -1 */\n#include <stdlib.h>\n#include <string.h>\n\nstruct DIR\n{\n    long                handle; /* -1 for failed rewind */\n    struct _finddata_t  info;\n    struct dirent       result; /* d_name null iff first time */\n    char                *name;  /* null-terminated char string */\n};\n\nDIR *opendir(const char *name)\n{\n    DIR *dir = 0;\n\n    if(name && name[0])\n    {\n        size_t base_length = strlen(name);\n        const char *all = /* search pattern must end with suitable wildcard */\n            strchr(\"/\\\\\", name[base_length - 1]) ? \"*\" : \"/*\";\n\n        if((dir = (DIR *) malloc(sizeof *dir)) != 0 &&\n           (dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0)\n        {\n            strcat(strcpy(dir->name, name), all);\n\n            if((dir->handle = _findfirst(dir->name, &dir->info)) != -1)\n            {\n                dir->result.d_name = 0;\n            }\n            else /* rollback */\n            {\n                free(dir->name);\n                free(dir);\n                dir = 0;\n            }\n        }\n        else /* rollback */\n        {\n            free(dir);\n            dir   = 0;\n            errno = ENOMEM;\n        }\n    }\n    else\n    {\n        errno = EINVAL;\n    }\n\n    return dir;\n}\n\nint closedir(DIR *dir)\n{\n    int result = -1;\n\n    if(dir)\n    {\n        if(dir->handle != -1)\n        {\n            result = _findclose(dir->handle);\n        }\n\n        free(dir->name);\n        free(dir);\n    }\n\n    if(result == -1) /* map all errors to EBADF */\n    {\n        errno = EBADF;\n    }\n\n    return result;\n}\n\nstruct dirent *readdir(DIR *dir)\n{\n    struct dirent *result = 0;\n\n    if(dir && dir->handle != -1)\n    {\n        if(!dir->result.d_name || _findnext(dir->handle, &dir->info) != -1)\n        {\n            result         = &dir->result;\n            result->d_name = dir->info.name;\n        }\n    }\n    else\n    {\n        errno = EBADF;\n    }\n\n    return result;\n}\n\nvoid rewinddir(DIR *dir)\n{\n    if(dir && dir->handle != -1)\n    {\n        _findclose(dir->handle);\n        dir->handle = _findfirst(dir->name, &dir->info);\n        dir->result.d_name = 0;\n    }\n    else\n    {\n        errno = EBADF;\n    }\n}\n\n/*\n\n    Copyright Kevlin Henney, 1997, 2003. All rights reserved.\n\n    Permission to use, copy, modify, and distribute this software and its\n    documentation for any purpose is hereby granted without fee, provided\n    that this copyright and permissions notice appear in all copies and\n    derivatives.\n    \n    This software is supplied \"as is\" without express or implied warranty.\n\n    But that said, if there are any problems please get in touch.\n\n*/\n\n"
  },
  {
    "path": "lcc/dirent.h",
    "content": "#ifndef DIRENT_INCLUDED\n#define DIRENT_INCLUDED\n\n/*\n\n    Declaration of POSIX directory browsing functions and types for Win32.\n\n    Author:  Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com)\n    History: Created March 1997. Updated February 2003.\n    Rights:  See end of file.\n    \n*/\n\ntypedef struct DIR DIR;\n\nstruct dirent\n{\n    char *d_name;\n};\n\nDIR           *opendir(const char *);\nint           closedir(DIR *);\nstruct dirent *readdir(DIR *);\nvoid          rewinddir(DIR *);\n\n/*\n\n    Copyright Kevlin Henney, 1997, 2003. All rights reserved.\n\n    Permission to use, copy, modify, and distribute this software and its\n    documentation for any purpose is hereby granted without fee, provided\n    that this copyright and permissions notice appear in all copies and\n    derivatives.\n    \n    This software is supplied \"as is\" without express or implied warranty.\n\n    But that said, if there are any problems please get in touch.\n\n*/\n\n#endif\n"
  },
  {
    "path": "lcc/getdate.c",
    "content": "/* A Bison parser, made from getdate.y\n   by GNU bison 1.35.  */\n\n#define YYBISON 1  /* Identify Bison output.  */\n\n# define\ttAGO\t257\n# define\ttDAY\t258\n# define\ttDAY_UNIT\t259\n# define\ttDAYZONE\t260\n# define\ttDST\t261\n# define\ttHOUR_UNIT\t262\n# define\ttID\t263\n# define\ttMERIDIAN\t264\n# define\ttMINUTE_UNIT\t265\n# define\ttMONTH\t266\n# define\ttMONTH_UNIT\t267\n# define\ttSEC_UNIT\t268\n# define\ttSNUMBER\t269\n# define\ttUNUMBER\t270\n# define\ttYEAR_UNIT\t271\n# define\ttZONE\t272\n\n#line 1 \"getdate.y\"\n\n/*\n**  Originally written by Steven M. Bellovin <smb@research.att.com> while\n**  at the University of North Carolina at Chapel Hill.  Later tweaked by\n**  a couple of people on Usenet.  Completely overhauled by Rich $alz\n**  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;\n**\n**  This grammar has 13 shift/reduce conflicts.\n**\n**  This code is in the public domain and has no copyright.\n*/\n\n#include \"config.h\"\n#include \"../src/setup.h\"\n\n#ifdef HAVE_CONFIG_H\n# ifdef FORCE_ALLOCA_H\n#  include <alloca.h>\n# endif\n#endif\n\n/* Since the code of getdate.y is not included in the Emacs executable\n   itself, there is no need to #define static in this file.  Even if\n   the code were included in the Emacs executable, it probably\n   wouldn't do any harm to #undef it here; this will only cause\n   problems if we try to write to a static variable, which I don't\n   think this code needs to do.  */\n#ifdef emacs\n# undef static\n#endif\n\n#ifdef HAVE_STDIO_H\n#include <stdio.h>\n#endif\n\n#ifdef HAVE_CTYPE_H\n#include <ctype.h>\n#endif\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))\n# define IN_CTYPE_DOMAIN(c) 1\n#else\n# define IN_CTYPE_DOMAIN(c) isascii(c)\n#endif\n\n#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))\n#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))\n#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))\n#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))\n\n/* ISDIGIT differs from ISDIGIT_LOCALE, as follows:\n   - Its arg may be any int or unsigned int; it need not be an unsigned char.\n   - It's guaranteed to evaluate its argument exactly once.\n   - It's typically faster.\n   Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that\n   only '0' through '9' are digits.  Prefer ISDIGIT to ISDIGIT_LOCALE unless\n   it's important to use the locale's definition of `digit' even when the\n   host does not conform to Posix.  */\n#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)\n\n#include \"../src/getdate.h\"\n\n#if defined (STDC_HEADERS) || defined (USG)\n# include <string.h>\n#endif\n\n/* Some old versions of bison generate parsers that use bcopy.\n   That loses on systems that don't provide the function, so we have\n   to redefine it here.  */\n#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)\n# define bcopy(from, to, len) memcpy ((to), (from), (len))\n#endif\n\n/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),\n   as well as gratuitiously global symbol names, so we can have multiple\n   yacc generated parsers in the same program.  Note that these are only\n   the variables produced by yacc.  If other parser generators (bison,\n   byacc, etc) produce additional global names that conflict at link time,\n   then those parser generators need to be fixed instead of adding those\n   names to this list. */\n\n#define yymaxdepth gd_maxdepth\n#define yyparse gd_parse\n#define yylex   gd_lex\n#define yyerror gd_error\n#define yylval  gd_lval\n#define yychar  gd_char\n#define yydebug gd_debug\n#define yypact  gd_pact\n#define yyr1    gd_r1\n#define yyr2    gd_r2\n#define yydef   gd_def\n#define yychk   gd_chk\n#define yypgo   gd_pgo\n#define yyact   gd_act\n#define yyexca  gd_exca\n#define yyerrflag gd_errflag\n#define yynerrs gd_nerrs\n#define yyps    gd_ps\n#define yypv    gd_pv\n#define yys     gd_s\n#define yy_yys  gd_yys\n#define yystate gd_state\n#define yytmp   gd_tmp\n#define yyv     gd_v\n#define yy_yyv  gd_yyv\n#define yyval   gd_val\n#define yylloc  gd_lloc\n#define yyreds  gd_reds          /* With YYDEBUG defined */\n#define yytoks  gd_toks          /* With YYDEBUG defined */\n#define yylhs   gd_yylhs\n#define yylen   gd_yylen\n#define yydefred gd_yydefred\n#define yydgoto gd_yydgoto\n#define yysindex gd_yysindex\n#define yyrindex gd_yyrindex\n#define yygindex gd_yygindex\n#define yytable  gd_yytable\n#define yycheck  gd_yycheck\n\nstatic int yylex (void);\nstatic int yyerror (char *s);\nextern int yyparse (void);\n\n#define EPOCH\t\t1970\n#define HOUR(x)\t\t((x) * 60)\n\n#define MAX_BUFF_LEN    128   /* size of buffer to read the date into */\n\n/*\n**  An entry in the lexical lookup table.\n*/\ntypedef struct _TABLE {\n    const char\t*name;\n    int\t\ttype;\n    int\t\tvalue;\n} TABLE;\n\n\n/*\n**  Meridian:  am, pm, or 24-hour style.\n*/\ntypedef enum _MERIDIAN {\n    MERam, MERpm, MER24\n} MERIDIAN;\n\n\n/*\n**  Global variables.  We could get rid of most of these by using a good\n**  union as the yacc stack.  (This routine was originally written before\n**  yacc had the %union construct.)  Maybe someday; right now we only use\n**  the %union very rarely.\n*/\nstatic const char\t*yyInput;\nstatic int\tyyDayOrdinal;\nstatic int\tyyDayNumber;\nstatic int\tyyHaveDate;\nstatic int\tyyHaveDay;\nstatic int\tyyHaveRel;\nstatic int\tyyHaveTime;\nstatic int\tyyHaveZone;\nstatic int\tyyTimezone;\nstatic int\tyyDay;\nstatic int\tyyHour;\nstatic int\tyyMinutes;\nstatic int\tyyMonth;\nstatic int\tyySeconds;\nstatic int\tyyYear;\nstatic MERIDIAN\tyyMeridian;\nstatic int\tyyRelDay;\nstatic int\tyyRelHour;\nstatic int\tyyRelMinutes;\nstatic int\tyyRelMonth;\nstatic int\tyyRelSeconds;\nstatic int\tyyRelYear;\n\n\n#line 183 \"getdate.y\"\n#ifndef YYSTYPE\ntypedef union {\n    int\t\t\tNumber;\n    enum _MERIDIAN\tMeridian;\n} yystype;\n# define YYSTYPE yystype\n# define YYSTYPE_IS_TRIVIAL 1\n#endif\n#ifndef YYDEBUG\n# define YYDEBUG 0\n#endif\n\n\n\n#define\tYYFINAL\t\t61\n#define\tYYFLAG\t\t-32768\n#define\tYYNTBASE\t22\n\n/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n#define YYTRANSLATE(x) ((unsigned)(x) <= 272 ? yytranslate[x] : 32)\n\n/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */\nstatic const char yytranslate[] =\n{\n       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,    20,     2,     2,    21,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,    19,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,\n       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,\n       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,\n      16,    17,    18\n};\n\n#if YYDEBUG\nstatic const short yyprhs[] =\n{\n       0,     0,     1,     4,     6,     8,    10,    12,    14,    16,\n      19,    24,    29,    36,    43,    45,    47,    50,    52,    55,\n      58,    62,    68,    72,    76,    79,    84,    87,    91,    94,\n      96,    99,   102,   104,   107,   110,   112,   115,   118,   120,\n     123,   126,   128,   131,   134,   136,   139,   142,   144,   146,\n     147\n};\nstatic const short yyrhs[] =\n{\n      -1,    22,    23,     0,    24,     0,    25,     0,    27,     0,\n      26,     0,    28,     0,    30,     0,    16,    10,     0,    16,\n      19,    16,    31,     0,    16,    19,    16,    15,     0,    16,\n      19,    16,    19,    16,    31,     0,    16,    19,    16,    19,\n      16,    15,     0,    18,     0,     6,     0,    18,     7,     0,\n       4,     0,     4,    20,     0,    16,     4,     0,    16,    21,\n      16,     0,    16,    21,    16,    21,    16,     0,    16,    15,\n      15,     0,    16,    12,    15,     0,    12,    16,     0,    12,\n      16,    20,    16,     0,    16,    12,     0,    16,    12,    16,\n       0,    29,     3,     0,    29,     0,    16,    17,     0,    15,\n      17,     0,    17,     0,    16,    13,     0,    15,    13,     0,\n      13,     0,    16,     5,     0,    15,     5,     0,     5,     0,\n      16,     8,     0,    15,     8,     0,     8,     0,    16,    11,\n       0,    15,    11,     0,    11,     0,    16,    14,     0,    15,\n      14,     0,    14,     0,    16,     0,     0,    10,     0\n};\n\n#endif\n\n#if YYDEBUG\n/* YYRLINE[YYN] -- source line where rule number YYN was defined. */\nstatic const short yyrline[] =\n{\n       0,   199,   200,   203,   206,   209,   212,   215,   218,   221,\n     227,   233,   242,   248,   260,   263,   266,   272,   276,   280,\n     286,   290,   308,   314,   320,   324,   329,   333,   340,   348,\n     351,   354,   357,   360,   363,   366,   369,   372,   375,   378,\n     381,   384,   387,   390,   393,   396,   399,   402,   407,   440,\n     444\n};\n#endif\n\n\n#if (YYDEBUG) || defined YYERROR_VERBOSE\n\n/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\nstatic const char *const yytname[] =\n{\n  \"$\", \"error\", \"$undefined.\", \"tAGO\", \"tDAY\", \"tDAY_UNIT\", \"tDAYZONE\", \n  \"tDST\", \"tHOUR_UNIT\", \"tID\", \"tMERIDIAN\", \"tMINUTE_UNIT\", \"tMONTH\", \n  \"tMONTH_UNIT\", \"tSEC_UNIT\", \"tSNUMBER\", \"tUNUMBER\", \"tYEAR_UNIT\", \n  \"tZONE\", \"':'\", \"','\", \"'/'\", \"spec\", \"item\", \"time\", \"zone\", \"day\", \n  \"date\", \"rel\", \"relunit\", \"number\", \"o_merid\", 0\n};\n#endif\n\n/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */\nstatic const short yyr1[] =\n{\n       0,    22,    22,    23,    23,    23,    23,    23,    23,    24,\n      24,    24,    24,    24,    25,    25,    25,    26,    26,    26,\n      27,    27,    27,    27,    27,    27,    27,    27,    28,    28,\n      29,    29,    29,    29,    29,    29,    29,    29,    29,    29,\n      29,    29,    29,    29,    29,    29,    29,    29,    30,    31,\n      31\n};\n\n/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */\nstatic const short yyr2[] =\n{\n       0,     0,     2,     1,     1,     1,     1,     1,     1,     2,\n       4,     4,     6,     6,     1,     1,     2,     1,     2,     2,\n       3,     5,     3,     3,     2,     4,     2,     3,     2,     1,\n       2,     2,     1,     2,     2,     1,     2,     2,     1,     2,\n       2,     1,     2,     2,     1,     2,     2,     1,     1,     0,\n       1\n};\n\n/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE\n   doesn't specify something else to do.  Zero means the default is an\n   error. */\nstatic const short yydefact[] =\n{\n       1,     0,    17,    38,    15,    41,    44,     0,    35,    47,\n       0,    48,    32,    14,     2,     3,     4,     6,     5,     7,\n      29,     8,    18,    24,    37,    40,    43,    34,    46,    31,\n      19,    36,    39,     9,    42,    26,    33,    45,     0,    30,\n       0,     0,    16,    28,     0,    23,    27,    22,    49,    20,\n      25,    50,    11,     0,    10,     0,    49,    21,    13,    12,\n       0,     0\n};\n\nstatic const short yydefgoto[] =\n{\n       1,    14,    15,    16,    17,    18,    19,    20,    21,    54\n};\n\nstatic const short yypact[] =\n{\n  -32768,     0,   -19,-32768,-32768,-32768,-32768,   -13,-32768,-32768,\n      30,    15,-32768,    14,-32768,-32768,-32768,-32768,-32768,-32768,\n      19,-32768,-32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,\n  -32768,-32768,-32768,-32768,-32768,    -6,-32768,-32768,    16,-32768,\n      17,    23,-32768,-32768,    24,-32768,-32768,-32768,    27,    28,\n  -32768,-32768,-32768,    29,-32768,    32,    -8,-32768,-32768,-32768,\n      50,-32768\n};\n\nstatic const short yypgoto[] =\n{\n  -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    -5\n};\n\n\n#define\tYYLAST\t\t51\n\n\nstatic const short yytable[] =\n{\n      60,    22,    51,    23,     2,     3,     4,    58,     5,    45,\n      46,     6,     7,     8,     9,    10,    11,    12,    13,    30,\n      31,    42,    43,    32,    44,    33,    34,    35,    36,    37,\n      38,    47,    39,    48,    40,    24,    41,    51,    25,    49,\n      50,    26,    52,    27,    28,    56,    53,    29,    57,    55,\n      61,    59\n};\n\nstatic const short yycheck[] =\n{\n       0,    20,    10,    16,     4,     5,     6,    15,     8,    15,\n      16,    11,    12,    13,    14,    15,    16,    17,    18,     4,\n       5,     7,     3,     8,    20,    10,    11,    12,    13,    14,\n      15,    15,    17,    16,    19,     5,    21,    10,     8,    16,\n      16,    11,    15,    13,    14,    16,    19,    17,    16,    21,\n       0,    56\n};\n/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */\n#line 3 \"/usr/share/bison/bison.simple\"\n\n/* Skeleton output parser for bison,\n\n   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software\n   Foundation, Inc.\n\n   This program is free software; you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation; either version 2, or (at your option)\n   any later version.\n\n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n\n   You should have received a copy of the GNU General Public License\n   along with this program; if not, write to the Free Software\n   Foundation, Inc., 59 Temple Place - Suite 330,\n   Boston, MA 02111-1307, USA.  */\n\n/* As a special exception, when this file is copied by Bison into a\n   Bison output file, you may use that output file without restriction.\n   This special exception was added by the Free Software Foundation\n   in version 1.24 of Bison.  */\n\n/* This is the parser code that is written into each bison parser when\n   the %semantic_parser declaration is not specified in the grammar.\n   It was written by Richard Stallman by simplifying the hairy parser\n   used when %semantic_parser is specified.  */\n\n/* All symbols defined below should begin with yy or YY, to avoid\n   infringing on user name space.  This should be done even for local\n   variables, as they might otherwise be expanded by user macros.\n   There are some unavoidable exceptions within include files to\n   define necessary library symbols; they are noted \"INFRINGES ON\n   USER NAME SPACE\" below.  */\n\n#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)\n\n/* The parser invokes alloca or malloc; define the necessary symbols.  */\n\n# if YYSTACK_USE_ALLOCA\n#  define YYSTACK_ALLOC alloca\n# else\n#  ifndef YYSTACK_USE_ALLOCA\n#   if defined (alloca) || defined (_ALLOCA_H)\n#    define YYSTACK_ALLOC alloca\n#   else\n#    ifdef __GNUC__\n#     define YYSTACK_ALLOC __builtin_alloca\n#    endif\n#   endif\n#  endif\n# endif\n\n# ifdef YYSTACK_ALLOC\n   /* Pacify GCC's `empty if-body' warning. */\n#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)\n# else\n#  if defined (__STDC__) || defined (__cplusplus)\n#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */\n#   define YYSIZE_T size_t\n#  endif\n#  define YYSTACK_ALLOC malloc\n#  define YYSTACK_FREE free\n# endif\n#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */\n\n\n#if (! defined (yyoverflow) \\\n     && (! defined (__cplusplus) \\\n\t || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))\n\n/* A type that is properly aligned for any stack member.  */\nunion yyalloc\n{\n  short yyss;\n  YYSTYPE yyvs;\n# if YYLSP_NEEDED\n  YYLTYPE yyls;\n# endif\n};\n\n/* The size of the maximum gap between one aligned stack and the next.  */\n# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)\n\n/* The size of an array large to enough to hold all stacks, each with\n   N elements.  */\n# if YYLSP_NEEDED\n#  define YYSTACK_BYTES(N) \\\n     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))\t\\\n      + 2 * YYSTACK_GAP_MAX)\n# else\n#  define YYSTACK_BYTES(N) \\\n     ((N) * (sizeof (short) + sizeof (YYSTYPE))\t\t\t\t\\\n      + YYSTACK_GAP_MAX)\n# endif\n\n/* Copy COUNT objects from FROM to TO.  The source and destination do\n   not overlap.  */\n# ifndef YYCOPY\n#  if 1 < __GNUC__\n#   define YYCOPY(To, From, Count) \\\n      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))\n#  else\n#   define YYCOPY(To, From, Count)\t\t\\\n      do\t\t\t\t\t\\\n\t{\t\t\t\t\t\\\n\t  register YYSIZE_T yyi;\t\t\\\n\t  for (yyi = 0; yyi < (Count); yyi++)\t\\\n\t    (To)[yyi] = (From)[yyi];\t\t\\\n\t}\t\t\t\t\t\\\n      while (0)\n#  endif\n# endif\n\n/* Relocate STACK from its old location to the new one.  The\n   local variables YYSIZE and YYSTACKSIZE give the old and new number of\n   elements in the stack, and YYPTR gives the new location of the\n   stack.  Advance YYPTR to a properly aligned location for the next\n   stack.  */\n# define YYSTACK_RELOCATE(Stack)\t\t\t\t\t\\\n    do\t\t\t\t\t\t\t\t\t\\\n      {\t\t\t\t\t\t\t\t\t\\\n\tYYSIZE_T yynewbytes;\t\t\t\t\t\t\\\n\tYYCOPY (&yyptr->Stack, Stack, yysize);\t\t\t\t\\\n\tStack = &yyptr->Stack;\t\t\t\t\t\t\\\n\tyynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;\t\\\n\tyyptr += yynewbytes / sizeof (*yyptr);\t\t\t\t\\\n      }\t\t\t\t\t\t\t\t\t\\\n    while (0)\n\n#endif\n\n\n#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)\n# define YYSIZE_T __SIZE_TYPE__\n#endif\n#if ! defined (YYSIZE_T) && defined (size_t)\n# define YYSIZE_T size_t\n#endif\n#if ! defined (YYSIZE_T)\n# if defined (__STDC__) || defined (__cplusplus)\n#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYSIZE_T size_t\n# endif\n#endif\n#if ! defined (YYSIZE_T)\n# define YYSIZE_T unsigned int\n#endif\n\n#define yyerrok\t\t(yyerrstatus = 0)\n#define yyclearin\t(yychar = YYEMPTY)\n#define YYEMPTY\t\t-2\n#define YYEOF\t\t0\n#define YYACCEPT\tgoto yyacceptlab\n#define YYABORT \tgoto yyabortlab\n#define YYERROR\t\tgoto yyerrlab1\n/* Like YYERROR except do call yyerror.  This remains here temporarily\n   to ease the transition to the new meaning of YYERROR, for GCC.\n   Once GCC version 2 has supplanted version 1, this can go.  */\n#define YYFAIL\t\tgoto yyerrlab\n#define YYRECOVERING()  (!!yyerrstatus)\n#define YYBACKUP(Token, Value)\t\t\t\t\t\\\ndo\t\t\t\t\t\t\t\t\\\n  if (yychar == YYEMPTY && yylen == 1)\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      yychar = (Token);\t\t\t\t\t\t\\\n      yylval = (Value);\t\t\t\t\t\t\\\n      yychar1 = YYTRANSLATE (yychar);\t\t\t\t\\\n      YYPOPSTACK;\t\t\t\t\t\t\\\n      goto yybackup;\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\n  else\t\t\t\t\t\t\t\t\\\n    { \t\t\t\t\t\t\t\t\\\n      yyerror (\"syntax error: cannot back up\");\t\t\t\\\n      YYERROR;\t\t\t\t\t\t\t\\\n    }\t\t\t\t\t\t\t\t\\\nwhile (0)\n\n#define YYTERROR\t1\n#define YYERRCODE\t256\n\n\n/* YYLLOC_DEFAULT -- Compute the default location (before the actions\n   are run).\n\n   When YYLLOC_DEFAULT is run, CURRENT is set the location of the\n   first token.  By default, to implement support for ranges, extend\n   its range to the last symbol.  */\n\n#ifndef YYLLOC_DEFAULT\n# define YYLLOC_DEFAULT(Current, Rhs, N)       \t\\\n   Current.last_line   = Rhs[N].last_line;\t\\\n   Current.last_column = Rhs[N].last_column;\n#endif\n\n\n/* YYLEX -- calling `yylex' with the right arguments.  */\n\n#if YYPURE\n# if YYLSP_NEEDED\n#  ifdef YYLEX_PARAM\n#   define YYLEX\t\tyylex (&yylval, &yylloc, YYLEX_PARAM)\n#  else\n#   define YYLEX\t\tyylex (&yylval, &yylloc)\n#  endif\n# else /* !YYLSP_NEEDED */\n#  ifdef YYLEX_PARAM\n#   define YYLEX\t\tyylex (&yylval, YYLEX_PARAM)\n#  else\n#   define YYLEX\t\tyylex (&yylval)\n#  endif\n# endif /* !YYLSP_NEEDED */\n#else /* !YYPURE */\n# define YYLEX\t\t\tyylex ()\n#endif /* !YYPURE */\n\n\n/* Enable debugging if requested.  */\n#if YYDEBUG\n\n# ifndef YYFPRINTF\n#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */\n#  define YYFPRINTF fprintf\n# endif\n\n# define YYDPRINTF(Args)\t\t\t\\\ndo {\t\t\t\t\t\t\\\n  if (yydebug)\t\t\t\t\t\\\n    YYFPRINTF Args;\t\t\t\t\\\n} while (0)\n/* Nonzero means print parse trace.  It is left uninitialized so that\n   multiple parsers can coexist.  */\nint yydebug;\n#else /* !YYDEBUG */\n# define YYDPRINTF(Args)\n#endif /* !YYDEBUG */\n\n/* YYINITDEPTH -- initial size of the parser's stacks.  */\n#ifndef\tYYINITDEPTH\n# define YYINITDEPTH 200\n#endif\n\n/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only\n   if the built-in stack extension method is used).\n\n   Do not make this value too large; the results are undefined if\n   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)\n   evaluated with infinite-precision integer arithmetic.  */\n\n#if YYMAXDEPTH == 0\n# undef YYMAXDEPTH\n#endif\n\n#ifndef YYMAXDEPTH\n# define YYMAXDEPTH 10000\n#endif\n\f\n#ifdef YYERROR_VERBOSE\n\n# ifndef yystrlen\n#  if defined (__GLIBC__) && defined (_STRING_H)\n#   define yystrlen strlen\n#  else\n/* Return the length of YYSTR.  */\nstatic YYSIZE_T\n#   if defined (__STDC__) || defined (__cplusplus)\nyystrlen (const char *yystr)\n#   else\nyystrlen (yystr)\n     const char *yystr;\n#   endif\n{\n  register const char *yys = yystr;\n\n  while (*yys++ != '\\0')\n    continue;\n\n  return yys - yystr - 1;\n}\n#  endif\n# endif\n\n# ifndef yystpcpy\n#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)\n#   define yystpcpy stpcpy\n#  else\n/* Copy YYSRC to YYDEST, returning the address of the terminating '\\0' in\n   YYDEST.  */\nstatic char *\n#   if defined (__STDC__) || defined (__cplusplus)\nyystpcpy (char *yydest, const char *yysrc)\n#   else\nyystpcpy (yydest, yysrc)\n     char *yydest;\n     const char *yysrc;\n#   endif\n{\n  register char *yyd = yydest;\n  register const char *yys = yysrc;\n\n  while ((*yyd++ = *yys++) != '\\0')\n    continue;\n\n  return yyd - 1;\n}\n#  endif\n# endif\n#endif\n\f\n#line 315 \"/usr/share/bison/bison.simple\"\n\n\n/* The user can define YYPARSE_PARAM as the name of an argument to be passed\n   into yyparse.  The argument should have type void *.\n   It should actually point to an object.\n   Grammar actions can access the variable by casting it\n   to the proper pointer type.  */\n\n#ifdef YYPARSE_PARAM\n# if defined (__STDC__) || defined (__cplusplus)\n#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM\n#  define YYPARSE_PARAM_DECL\n# else\n#  define YYPARSE_PARAM_ARG YYPARSE_PARAM\n#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;\n# endif\n#else /* !YYPARSE_PARAM */\n# define YYPARSE_PARAM_ARG\n# define YYPARSE_PARAM_DECL\n#endif /* !YYPARSE_PARAM */\n\n/* Prevent warning if -Wstrict-prototypes.  */\n#ifdef __GNUC__\n# ifdef YYPARSE_PARAM\nint yyparse (void *);\n# else\nint yyparse (void);\n# endif\n#endif\n\n/* YY_DECL_VARIABLES -- depending whether we use a pure parser,\n   variables are global, or local to YYPARSE.  */\n\n#define YY_DECL_NON_LSP_VARIABLES\t\t\t\\\n/* The lookahead symbol.  */\t\t\t\t\\\nint yychar;\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\\\n/* The semantic value of the lookahead symbol. */\t\\\nYYSTYPE yylval;\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\\\n/* Number of parse errors so far.  */\t\t\t\\\nint yynerrs;\n\n#if YYLSP_NEEDED\n# define YY_DECL_VARIABLES\t\t\t\\\nYY_DECL_NON_LSP_VARIABLES\t\t\t\\\n\t\t\t\t\t\t\\\n/* Location data for the lookahead symbol.  */\t\\\nYYLTYPE yylloc;\n#else\n# define YY_DECL_VARIABLES\t\t\t\\\nYY_DECL_NON_LSP_VARIABLES\n#endif\n\n\n/* If nonreentrant, generate the variables here. */\n\n#if !YYPURE\nYY_DECL_VARIABLES\n#endif  /* !YYPURE */\n\nint\nyyparse (YYPARSE_PARAM_ARG)\n     YYPARSE_PARAM_DECL\n{\n  /* If reentrant, generate the variables here. */\n#if YYPURE\n  YY_DECL_VARIABLES\n#endif  /* !YYPURE */\n\n  register int yystate;\n  register int yyn;\n  int yyresult;\n  /* Number of tokens to shift before error messages enabled.  */\n  int yyerrstatus;\n  /* Lookahead token as an internal (translated) token number.  */\n  int yychar1 = 0;\n\n  /* Three stacks and their tools:\n     `yyss': related to states,\n     `yyvs': related to semantic values,\n     `yyls': related to locations.\n\n     Refer to the stacks thru separate pointers, to allow yyoverflow\n     to reallocate them elsewhere.  */\n\n  /* The state stack. */\n  short\tyyssa[YYINITDEPTH];\n  short *yyss = yyssa;\n  register short *yyssp;\n\n  /* The semantic value stack.  */\n  YYSTYPE yyvsa[YYINITDEPTH];\n  YYSTYPE *yyvs = yyvsa;\n  register YYSTYPE *yyvsp;\n\n#if YYLSP_NEEDED\n  /* The location stack.  */\n  YYLTYPE yylsa[YYINITDEPTH];\n  YYLTYPE *yyls = yylsa;\n  YYLTYPE *yylsp;\n#endif\n\n#if YYLSP_NEEDED\n# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)\n#else\n# define YYPOPSTACK   (yyvsp--, yyssp--)\n#endif\n\n  YYSIZE_T yystacksize = YYINITDEPTH;\n\n\n  /* The variables used to return semantic value and location from the\n     action routines.  */\n  YYSTYPE yyval;\n#if YYLSP_NEEDED\n  YYLTYPE yyloc;\n#endif\n\n  /* When reducing, the number of symbols on the RHS of the reduced\n     rule. */\n  int yylen;\n\n  YYDPRINTF ((stderr, \"Starting parse\\n\"));\n\n  yystate = 0;\n  yyerrstatus = 0;\n  yynerrs = 0;\n  yychar = YYEMPTY;\t\t/* Cause a token to be read.  */\n\n  /* Initialize stack pointers.\n     Waste one element of value and location stack\n     so that they stay on the same level as the state stack.\n     The wasted elements are never initialized.  */\n\n  yyssp = yyss;\n  yyvsp = yyvs;\n#if YYLSP_NEEDED\n  yylsp = yyls;\n#endif\n  goto yysetstate;\n\n/*------------------------------------------------------------.\n| yynewstate -- Push a new state, which is found in yystate.  |\n`------------------------------------------------------------*/\n yynewstate:\n  /* In all cases, when you get here, the value and location stacks\n     have just been pushed. so pushing a state here evens the stacks.\n     */\n  yyssp++;\n\n yysetstate:\n  *yyssp = yystate;\n\n  if (yyssp >= yyss + yystacksize - 1)\n    {\n      /* Get the current used size of the three stacks, in elements.  */\n      YYSIZE_T yysize = yyssp - yyss + 1;\n\n#ifdef yyoverflow\n      {\n\t/* Give user a chance to reallocate the stack. Use copies of\n\t   these so that the &'s don't force the real ones into\n\t   memory.  */\n\tYYSTYPE *yyvs1 = yyvs;\n\tshort *yyss1 = yyss;\n\n\t/* Each stack pointer address is followed by the size of the\n\t   data in use in that stack, in bytes.  */\n# if YYLSP_NEEDED\n\tYYLTYPE *yyls1 = yyls;\n\t/* This used to be a conditional around just the two extra args,\n\t   but that might be undefined if yyoverflow is a macro.  */\n\tyyoverflow (\"parser stack overflow\",\n\t\t    &yyss1, yysize * sizeof (*yyssp),\n\t\t    &yyvs1, yysize * sizeof (*yyvsp),\n\t\t    &yyls1, yysize * sizeof (*yylsp),\n\t\t    &yystacksize);\n\tyyls = yyls1;\n# else\n\tyyoverflow (\"parser stack overflow\",\n\t\t    &yyss1, yysize * sizeof (*yyssp),\n\t\t    &yyvs1, yysize * sizeof (*yyvsp),\n\t\t    &yystacksize);\n# endif\n\tyyss = yyss1;\n\tyyvs = yyvs1;\n      }\n#else /* no yyoverflow */\n# ifndef YYSTACK_RELOCATE\n      goto yyoverflowlab;\n# else\n      /* Extend the stack our own way.  */\n      if (yystacksize >= YYMAXDEPTH)\n\tgoto yyoverflowlab;\n      yystacksize *= 2;\n      if (yystacksize > YYMAXDEPTH)\n\tyystacksize = YYMAXDEPTH;\n\n      {\n\tshort *yyss1 = yyss;\n\tunion yyalloc *yyptr =\n\t  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));\n\tif (! yyptr)\n\t  goto yyoverflowlab;\n\tYYSTACK_RELOCATE (yyss);\n\tYYSTACK_RELOCATE (yyvs);\n# if YYLSP_NEEDED\n\tYYSTACK_RELOCATE (yyls);\n# endif\n# undef YYSTACK_RELOCATE\n\tif (yyss1 != yyssa)\n\t  YYSTACK_FREE (yyss1);\n      }\n# endif\n#endif /* no yyoverflow */\n\n      yyssp = yyss + yysize - 1;\n      yyvsp = yyvs + yysize - 1;\n#if YYLSP_NEEDED\n      yylsp = yyls + yysize - 1;\n#endif\n\n      YYDPRINTF ((stderr, \"Stack size increased to %lu\\n\",\n\t\t  (unsigned long int) yystacksize));\n\n      if (yyssp >= yyss + yystacksize - 1)\n\tYYABORT;\n    }\n\n  YYDPRINTF ((stderr, \"Entering state %d\\n\", yystate));\n\n  goto yybackup;\n\n\n/*-----------.\n| yybackup.  |\n`-----------*/\nyybackup:\n\n/* Do appropriate processing given the current state.  */\n/* Read a lookahead token if we need one and don't already have one.  */\n/* yyresume: */\n\n  /* First try to decide what to do without reference to lookahead token.  */\n\n  yyn = yypact[yystate];\n  if (yyn == YYFLAG)\n    goto yydefault;\n\n  /* Not known => get a lookahead token if don't already have one.  */\n\n  /* yychar is either YYEMPTY or YYEOF\n     or a valid token in external form.  */\n\n  if (yychar == YYEMPTY)\n    {\n      YYDPRINTF ((stderr, \"Reading a token: \"));\n      yychar = YYLEX;\n    }\n\n  /* Convert token to internal form (in yychar1) for indexing tables with */\n\n  if (yychar <= 0)\t\t/* This means end of input. */\n    {\n      yychar1 = 0;\n      yychar = YYEOF;\t\t/* Don't call YYLEX any more */\n\n      YYDPRINTF ((stderr, \"Now at end of input.\\n\"));\n    }\n  else\n    {\n      yychar1 = YYTRANSLATE (yychar);\n\n#if YYDEBUG\n     /* We have to keep this `#if YYDEBUG', since we use variables\n\twhich are defined only if `YYDEBUG' is set.  */\n      if (yydebug)\n\t{\n\t  YYFPRINTF (stderr, \"Next token is %d (%s\",\n\t\t     yychar, yytname[yychar1]);\n\t  /* Give the individual parser a way to print the precise\n\t     meaning of a token, for further debugging info.  */\n# ifdef YYPRINT\n\t  YYPRINT (stderr, yychar, yylval);\n# endif\n\t  YYFPRINTF (stderr, \")\\n\");\n\t}\n#endif\n    }\n\n  yyn += yychar1;\n  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)\n    goto yydefault;\n\n  yyn = yytable[yyn];\n\n  /* yyn is what to do for this token type in this state.\n     Negative => reduce, -yyn is rule number.\n     Positive => shift, yyn is new state.\n       New state is final state => don't bother to shift,\n       just return success.\n     0, or most negative number => error.  */\n\n  if (yyn < 0)\n    {\n      if (yyn == YYFLAG)\n\tgoto yyerrlab;\n      yyn = -yyn;\n      goto yyreduce;\n    }\n  else if (yyn == 0)\n    goto yyerrlab;\n\n  if (yyn == YYFINAL)\n    YYACCEPT;\n\n  /* Shift the lookahead token.  */\n  YYDPRINTF ((stderr, \"Shifting token %d (%s), \",\n\t      yychar, yytname[yychar1]));\n\n  /* Discard the token being shifted unless it is eof.  */\n  if (yychar != YYEOF)\n    yychar = YYEMPTY;\n\n  *++yyvsp = yylval;\n#if YYLSP_NEEDED\n  *++yylsp = yylloc;\n#endif\n\n  /* Count tokens shifted since error; after three, turn off error\n     status.  */\n  if (yyerrstatus)\n    yyerrstatus--;\n\n  yystate = yyn;\n  goto yynewstate;\n\n\n/*-----------------------------------------------------------.\n| yydefault -- do the default action for the current state.  |\n`-----------------------------------------------------------*/\nyydefault:\n  yyn = yydefact[yystate];\n  if (yyn == 0)\n    goto yyerrlab;\n  goto yyreduce;\n\n\n/*-----------------------------.\n| yyreduce -- Do a reduction.  |\n`-----------------------------*/\nyyreduce:\n  /* yyn is the number of a rule to reduce with.  */\n  yylen = yyr2[yyn];\n\n  /* If YYLEN is nonzero, implement the default value of the action:\n     `$$ = $1'.\n\n     Otherwise, the following line sets YYVAL to the semantic value of\n     the lookahead token.  This behavior is undocumented and Bison\n     users should not rely upon it.  Assigning to YYVAL\n     unconditionally makes the parser a bit smaller, and it avoids a\n     GCC warning that YYVAL may be used uninitialized.  */\n  yyval = yyvsp[1-yylen];\n\n#if YYLSP_NEEDED\n  /* Similarly for the default location.  Let the user run additional\n     commands if for instance locations are ranges.  */\n  yyloc = yylsp[1-yylen];\n  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);\n#endif\n\n#if YYDEBUG\n  /* We have to keep this `#if YYDEBUG', since we use variables which\n     are defined only if `YYDEBUG' is set.  */\n  if (yydebug)\n    {\n      int yyi;\n\n      YYFPRINTF (stderr, \"Reducing via rule %d (line %d), \",\n\t\t yyn, yyrline[yyn]);\n\n      /* Print the symbols being reduced, and their result.  */\n      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)\n\tYYFPRINTF (stderr, \"%s \", yytname[yyrhs[yyi]]);\n      YYFPRINTF (stderr, \" -> %s\\n\", yytname[yyr1[yyn]]);\n    }\n#endif\n\n  switch (yyn) {\n\ncase 3:\n#line 203 \"getdate.y\"\n{\n\t    yyHaveTime++;\n\t}\n    break;\ncase 4:\n#line 206 \"getdate.y\"\n{\n\t    yyHaveZone++;\n\t}\n    break;\ncase 5:\n#line 209 \"getdate.y\"\n{\n\t    yyHaveDate++;\n\t}\n    break;\ncase 6:\n#line 212 \"getdate.y\"\n{\n\t    yyHaveDay++;\n\t}\n    break;\ncase 7:\n#line 215 \"getdate.y\"\n{\n\t    yyHaveRel++;\n\t}\n    break;\ncase 9:\n#line 221 \"getdate.y\"\n{\n\t    yyHour = yyvsp[-1].Number;\n\t    yyMinutes = 0;\n\t    yySeconds = 0;\n\t    yyMeridian = yyvsp[0].Meridian;\n\t}\n    break;\ncase 10:\n#line 227 \"getdate.y\"\n{\n\t    yyHour = yyvsp[-3].Number;\n\t    yyMinutes = yyvsp[-1].Number;\n\t    yySeconds = 0;\n\t    yyMeridian = yyvsp[0].Meridian;\n\t}\n    break;\ncase 11:\n#line 233 \"getdate.y\"\n{\n\t    yyHour = yyvsp[-3].Number;\n\t    yyMinutes = yyvsp[-1].Number;\n\t    yyMeridian = MER24;\n\t    yyHaveZone++;\n\t    yyTimezone = (yyvsp[0].Number < 0\n\t\t\t  ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60\n\t\t\t  : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));\n\t}\n    break;\ncase 12:\n#line 242 \"getdate.y\"\n{\n\t    yyHour = yyvsp[-5].Number;\n\t    yyMinutes = yyvsp[-3].Number;\n\t    yySeconds = yyvsp[-1].Number;\n\t    yyMeridian = yyvsp[0].Meridian;\n\t}\n    break;\ncase 13:\n#line 248 \"getdate.y\"\n{\n\t    yyHour = yyvsp[-5].Number;\n\t    yyMinutes = yyvsp[-3].Number;\n\t    yySeconds = yyvsp[-1].Number;\n\t    yyMeridian = MER24;\n\t    yyHaveZone++;\n\t    yyTimezone = (yyvsp[0].Number < 0\n\t\t\t  ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60\n\t\t\t  : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));\n\t}\n    break;\ncase 14:\n#line 260 \"getdate.y\"\n{\n\t    yyTimezone = yyvsp[0].Number;\n\t}\n    break;\ncase 15:\n#line 263 \"getdate.y\"\n{\n\t    yyTimezone = yyvsp[0].Number - 60;\n\t}\n    break;\ncase 16:\n#line 267 \"getdate.y\"\n{\n\t    yyTimezone = yyvsp[-1].Number - 60;\n\t}\n    break;\ncase 17:\n#line 272 \"getdate.y\"\n{\n\t    yyDayOrdinal = 1;\n\t    yyDayNumber = yyvsp[0].Number;\n\t}\n    break;\ncase 18:\n#line 276 \"getdate.y\"\n{\n\t    yyDayOrdinal = 1;\n\t    yyDayNumber = yyvsp[-1].Number;\n\t}\n    break;\ncase 19:\n#line 280 \"getdate.y\"\n{\n\t    yyDayOrdinal = yyvsp[-1].Number;\n\t    yyDayNumber = yyvsp[0].Number;\n\t}\n    break;\ncase 20:\n#line 286 \"getdate.y\"\n{\n\t    yyMonth = yyvsp[-2].Number;\n\t    yyDay = yyvsp[0].Number;\n\t}\n    break;\ncase 21:\n#line 290 \"getdate.y\"\n{\n\t  /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.\n\t     The goal in recognizing YYYY/MM/DD is solely to support legacy\n\t     machine-generated dates like those in an RCS log listing.  If\n\t     you want portability, use the ISO 8601 format.  */\n\t  if (yyvsp[-4].Number >= 1000)\n\t    {\n\t      yyYear = yyvsp[-4].Number;\n\t      yyMonth = yyvsp[-2].Number;\n\t      yyDay = yyvsp[0].Number;\n\t    }\n\t  else\n\t    {\n\t      yyMonth = yyvsp[-4].Number;\n\t      yyDay = yyvsp[-2].Number;\n\t      yyYear = yyvsp[0].Number;\n\t    }\n\t}\n    break;\ncase 22:\n#line 308 \"getdate.y\"\n{\n\t    /* ISO 8601 format.  yyyy-mm-dd.  */\n\t    yyYear = yyvsp[-2].Number;\n\t    yyMonth = -yyvsp[-1].Number;\n\t    yyDay = -yyvsp[0].Number;\n\t}\n    break;\ncase 23:\n#line 314 \"getdate.y\"\n{\n\t    /* e.g. 17-JUN-1992.  */\n\t    yyDay = yyvsp[-2].Number;\n\t    yyMonth = yyvsp[-1].Number;\n\t    yyYear = -yyvsp[0].Number;\n\t}\n    break;\ncase 24:\n#line 320 \"getdate.y\"\n{\n\t    yyMonth = yyvsp[-1].Number;\n\t    yyDay = yyvsp[0].Number;\n\t}\n    break;\ncase 25:\n#line 324 \"getdate.y\"\n{\n\t    yyMonth = yyvsp[-3].Number;\n\t    yyDay = yyvsp[-2].Number;\n\t    yyYear = yyvsp[0].Number;\n\t}\n    break;\ncase 26:\n#line 329 \"getdate.y\"\n{\n\t    yyMonth = yyvsp[0].Number;\n\t    yyDay = yyvsp[-1].Number;\n\t}\n    break;\ncase 27:\n#line 333 \"getdate.y\"\n{\n\t    yyMonth = yyvsp[-1].Number;\n\t    yyDay = yyvsp[-2].Number;\n\t    yyYear = yyvsp[0].Number;\n\t}\n    break;\ncase 28:\n#line 340 \"getdate.y\"\n{\n\t    yyRelSeconds = -yyRelSeconds;\n\t    yyRelMinutes = -yyRelMinutes;\n\t    yyRelHour = -yyRelHour;\n\t    yyRelDay = -yyRelDay;\n\t    yyRelMonth = -yyRelMonth;\n\t    yyRelYear = -yyRelYear;\n\t}\n    break;\ncase 30:\n#line 351 \"getdate.y\"\n{\n\t    yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 31:\n#line 354 \"getdate.y\"\n{\n\t    yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 32:\n#line 357 \"getdate.y\"\n{\n\t    yyRelYear++;\n\t}\n    break;\ncase 33:\n#line 360 \"getdate.y\"\n{\n\t    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 34:\n#line 363 \"getdate.y\"\n{\n\t    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 35:\n#line 366 \"getdate.y\"\n{\n\t    yyRelMonth++;\n\t}\n    break;\ncase 36:\n#line 369 \"getdate.y\"\n{\n\t    yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 37:\n#line 372 \"getdate.y\"\n{\n\t    yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 38:\n#line 375 \"getdate.y\"\n{\n\t    yyRelDay++;\n\t}\n    break;\ncase 39:\n#line 378 \"getdate.y\"\n{\n\t    yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 40:\n#line 381 \"getdate.y\"\n{\n\t    yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 41:\n#line 384 \"getdate.y\"\n{\n\t    yyRelHour++;\n\t}\n    break;\ncase 42:\n#line 387 \"getdate.y\"\n{\n\t    yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 43:\n#line 390 \"getdate.y\"\n{\n\t    yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 44:\n#line 393 \"getdate.y\"\n{\n\t    yyRelMinutes++;\n\t}\n    break;\ncase 45:\n#line 396 \"getdate.y\"\n{\n\t    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 46:\n#line 399 \"getdate.y\"\n{\n\t    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;\n\t}\n    break;\ncase 47:\n#line 402 \"getdate.y\"\n{\n\t    yyRelSeconds++;\n\t}\n    break;\ncase 48:\n#line 408 \"getdate.y\"\n{\n\t    if (yyHaveTime && yyHaveDate && !yyHaveRel)\n\t      yyYear = yyvsp[0].Number;\n\t    else\n\t      {\n\t\tif (yyvsp[0].Number>10000)\n\t\t  {\n\t\t    yyHaveDate++;\n\t\t    yyDay= (yyvsp[0].Number)%100;\n\t\t    yyMonth= (yyvsp[0].Number/100)%100;\n\t\t    yyYear = yyvsp[0].Number/10000;\n\t\t  }\n\t\telse\n\t\t  {\n\t\t    yyHaveTime++;\n\t\t    if (yyvsp[0].Number < 100)\n\t\t      {\n\t\t\tyyHour = yyvsp[0].Number;\n\t\t\tyyMinutes = 0;\n\t\t      }\n\t\t    else\n\t\t      {\n\t\t    \tyyHour = yyvsp[0].Number / 100;\n\t\t    \tyyMinutes = yyvsp[0].Number % 100;\n\t\t      }\n\t\t    yySeconds = 0;\n\t\t    yyMeridian = MER24;\n\t\t  }\n\t      }\n\t  }\n    break;\ncase 49:\n#line 441 \"getdate.y\"\n{\n\t    yyval.Meridian = MER24;\n\t  }\n    break;\ncase 50:\n#line 445 \"getdate.y\"\n{\n\t    yyval.Meridian = yyvsp[0].Meridian;\n\t  }\n    break;\n}\n\n#line 705 \"/usr/share/bison/bison.simple\"\n\n\f\n  yyvsp -= yylen;\n  yyssp -= yylen;\n#if YYLSP_NEEDED\n  yylsp -= yylen;\n#endif\n\n#if YYDEBUG\n  if (yydebug)\n    {\n      short *yyssp1 = yyss - 1;\n      YYFPRINTF (stderr, \"state stack now\");\n      while (yyssp1 != yyssp)\n\tYYFPRINTF (stderr, \" %d\", *++yyssp1);\n      YYFPRINTF (stderr, \"\\n\");\n    }\n#endif\n\n  *++yyvsp = yyval;\n#if YYLSP_NEEDED\n  *++yylsp = yyloc;\n#endif\n\n  /* Now `shift' the result of the reduction.  Determine what state\n     that goes to, based on the state we popped back to and the rule\n     number reduced by.  */\n\n  yyn = yyr1[yyn];\n\n  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;\n  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)\n    yystate = yytable[yystate];\n  else\n    yystate = yydefgoto[yyn - YYNTBASE];\n\n  goto yynewstate;\n\n\n/*------------------------------------.\n| yyerrlab -- here on detecting error |\n`------------------------------------*/\nyyerrlab:\n  /* If not already recovering from an error, report this error.  */\n  if (!yyerrstatus)\n    {\n      ++yynerrs;\n\n#ifdef YYERROR_VERBOSE\n      yyn = yypact[yystate];\n\n      if (yyn > YYFLAG && yyn < YYLAST)\n\t{\n\t  YYSIZE_T yysize = 0;\n\t  char *yymsg;\n\t  int yyx, yycount;\n\n\t  yycount = 0;\n\t  /* Start YYX at -YYN if negative to avoid negative indexes in\n\t     YYCHECK.  */\n\t  for (yyx = yyn < 0 ? -yyn : 0;\n\t       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)\n\t    if (yycheck[yyx + yyn] == yyx)\n\t      yysize += yystrlen (yytname[yyx]) + 15, yycount++;\n\t  yysize += yystrlen (\"parse error, unexpected \") + 1;\n\t  yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);\n\t  yymsg = (char *) YYSTACK_ALLOC (yysize);\n\t  if (yymsg != 0)\n\t    {\n\t      char *yyp = yystpcpy (yymsg, \"parse error, unexpected \");\n\t      yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);\n\n\t      if (yycount < 5)\n\t\t{\n\t\t  yycount = 0;\n\t\t  for (yyx = yyn < 0 ? -yyn : 0;\n\t\t       yyx < (int) (sizeof (yytname) / sizeof (char *));\n\t\t       yyx++)\n\t\t    if (yycheck[yyx + yyn] == yyx)\n\t\t      {\n\t\t\tconst char *yyq = ! yycount ? \", expecting \" : \" or \";\n\t\t\tyyp = yystpcpy (yyp, yyq);\n\t\t\tyyp = yystpcpy (yyp, yytname[yyx]);\n\t\t\tyycount++;\n\t\t      }\n\t\t}\n\t      yyerror (yymsg);\n\t      YYSTACK_FREE (yymsg);\n\t    }\n\t  else\n\t    yyerror (\"parse error; also virtual memory exhausted\");\n\t}\n      else\n#endif /* defined (YYERROR_VERBOSE) */\n\tyyerror (\"parse error\");\n    }\n  goto yyerrlab1;\n\n\n/*--------------------------------------------------.\n| yyerrlab1 -- error raised explicitly by an action |\n`--------------------------------------------------*/\nyyerrlab1:\n  if (yyerrstatus == 3)\n    {\n      /* If just tried and failed to reuse lookahead token after an\n\t error, discard it.  */\n\n      /* return failure if at end of input */\n      if (yychar == YYEOF)\n\tYYABORT;\n      YYDPRINTF ((stderr, \"Discarding token %d (%s).\\n\",\n\t\t  yychar, yytname[yychar1]));\n      yychar = YYEMPTY;\n    }\n\n  /* Else will try to reuse lookahead token after shifting the error\n     token.  */\n\n  yyerrstatus = 3;\t\t/* Each real token shifted decrements this */\n\n  goto yyerrhandle;\n\n\n/*-------------------------------------------------------------------.\n| yyerrdefault -- current state does not do anything special for the |\n| error token.                                                       |\n`-------------------------------------------------------------------*/\nyyerrdefault:\n#if 0\n  /* This is wrong; only states that explicitly want error tokens\n     should shift them.  */\n\n  /* If its default is to accept any token, ok.  Otherwise pop it.  */\n  yyn = yydefact[yystate];\n  if (yyn)\n    goto yydefault;\n#endif\n\n\n/*---------------------------------------------------------------.\n| yyerrpop -- pop the current state because it cannot handle the |\n| error token                                                    |\n`---------------------------------------------------------------*/\nyyerrpop:\n  if (yyssp == yyss)\n    YYABORT;\n  yyvsp--;\n  yystate = *--yyssp;\n#if YYLSP_NEEDED\n  yylsp--;\n#endif\n\n#if YYDEBUG\n  if (yydebug)\n    {\n      short *yyssp1 = yyss - 1;\n      YYFPRINTF (stderr, \"Error: state stack now\");\n      while (yyssp1 != yyssp)\n\tYYFPRINTF (stderr, \" %d\", *++yyssp1);\n      YYFPRINTF (stderr, \"\\n\");\n    }\n#endif\n\n/*--------------.\n| yyerrhandle.  |\n`--------------*/\nyyerrhandle:\n  yyn = yypact[yystate];\n  if (yyn == YYFLAG)\n    goto yyerrdefault;\n\n  yyn += YYTERROR;\n  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)\n    goto yyerrdefault;\n\n  yyn = yytable[yyn];\n  if (yyn < 0)\n    {\n      if (yyn == YYFLAG)\n\tgoto yyerrpop;\n      yyn = -yyn;\n      goto yyreduce;\n    }\n  else if (yyn == 0)\n    goto yyerrpop;\n\n  if (yyn == YYFINAL)\n    YYACCEPT;\n\n  YYDPRINTF ((stderr, \"Shifting error token, \"));\n\n  *++yyvsp = yylval;\n#if YYLSP_NEEDED\n  *++yylsp = yylloc;\n#endif\n\n  yystate = yyn;\n  goto yynewstate;\n\n\n/*-------------------------------------.\n| yyacceptlab -- YYACCEPT comes here.  |\n`-------------------------------------*/\nyyacceptlab:\n  yyresult = 0;\n  goto yyreturn;\n\n/*-----------------------------------.\n| yyabortlab -- YYABORT comes here.  |\n`-----------------------------------*/\nyyabortlab:\n  yyresult = 1;\n  goto yyreturn;\n\n/*---------------------------------------------.\n| yyoverflowab -- parser overflow comes here.  |\n`---------------------------------------------*/\nyyoverflowlab:\n  yyerror (\"parser stack overflow\");\n  yyresult = 2;\n  /* Fall through.  */\n\nyyreturn:\n#ifndef yyoverflow\n  if (yyss != yyssa)\n    YYSTACK_FREE (yyss);\n#endif\n  return yyresult;\n}\n#line 450 \"getdate.y\"\n\n\n/* Month and day table. */\nstatic TABLE const MonthDayTable[] = {\n    { \"january\",\ttMONTH,  1 },\n    { \"february\",\ttMONTH,  2 },\n    { \"march\",\t\ttMONTH,  3 },\n    { \"april\",\t\ttMONTH,  4 },\n    { \"may\",\t\ttMONTH,  5 },\n    { \"june\",\t\ttMONTH,  6 },\n    { \"july\",\t\ttMONTH,  7 },\n    { \"august\",\t\ttMONTH,  8 },\n    { \"september\",\ttMONTH,  9 },\n    { \"sept\",\t\ttMONTH,  9 },\n    { \"october\",\ttMONTH, 10 },\n    { \"november\",\ttMONTH, 11 },\n    { \"december\",\ttMONTH, 12 },\n    { \"sunday\",\t\ttDAY, 0 },\n    { \"monday\",\t\ttDAY, 1 },\n    { \"tuesday\",\ttDAY, 2 },\n    { \"tues\",\t\ttDAY, 2 },\n    { \"wednesday\",\ttDAY, 3 },\n    { \"wednes\",\t\ttDAY, 3 },\n    { \"thursday\",\ttDAY, 4 },\n    { \"thur\",\t\ttDAY, 4 },\n    { \"thurs\",\t\ttDAY, 4 },\n    { \"friday\",\t\ttDAY, 5 },\n    { \"saturday\",\ttDAY, 6 },\n    { NULL }\n};\n\n/* Time units table. */\nstatic TABLE const UnitsTable[] = {\n    { \"year\",\t\ttYEAR_UNIT,\t1 },\n    { \"month\",\t\ttMONTH_UNIT,\t1 },\n    { \"fortnight\",\ttDAY_UNIT,\t14 },\n    { \"week\",\t\ttDAY_UNIT,\t7 },\n    { \"day\",\t\ttDAY_UNIT,\t1 },\n    { \"hour\",\t\ttHOUR_UNIT,\t1 },\n    { \"minute\",\t\ttMINUTE_UNIT,\t1 },\n    { \"min\",\t\ttMINUTE_UNIT,\t1 },\n    { \"second\",\t\ttSEC_UNIT,\t1 },\n    { \"sec\",\t\ttSEC_UNIT,\t1 },\n    { NULL }\n};\n\n/* Assorted relative-time words. */\nstatic TABLE const OtherTable[] = {\n    { \"tomorrow\",\ttMINUTE_UNIT,\t1 * 24 * 60 },\n    { \"yesterday\",\ttMINUTE_UNIT,\t-1 * 24 * 60 },\n    { \"today\",\t\ttMINUTE_UNIT,\t0 },\n    { \"now\",\t\ttMINUTE_UNIT,\t0 },\n    { \"last\",\t\ttUNUMBER,\t-1 },\n    { \"this\",\t\ttMINUTE_UNIT,\t0 },\n    { \"next\",\t\ttUNUMBER,\t2 },\n    { \"first\",\t\ttUNUMBER,\t1 },\n/*  { \"second\",\t\ttUNUMBER,\t2 }, */\n    { \"third\",\t\ttUNUMBER,\t3 },\n    { \"fourth\",\t\ttUNUMBER,\t4 },\n    { \"fifth\",\t\ttUNUMBER,\t5 },\n    { \"sixth\",\t\ttUNUMBER,\t6 },\n    { \"seventh\",\ttUNUMBER,\t7 },\n    { \"eighth\",\t\ttUNUMBER,\t8 },\n    { \"ninth\",\t\ttUNUMBER,\t9 },\n    { \"tenth\",\t\ttUNUMBER,\t10 },\n    { \"eleventh\",\ttUNUMBER,\t11 },\n    { \"twelfth\",\ttUNUMBER,\t12 },\n    { \"ago\",\t\ttAGO,\t1 },\n    { NULL }\n};\n\n/* The timezone table. */\nstatic TABLE const TimezoneTable[] = {\n    { \"gmt\",\ttZONE,     HOUR ( 0) },\t/* Greenwich Mean */\n    { \"ut\",\ttZONE,     HOUR ( 0) },\t/* Universal (Coordinated) */\n    { \"utc\",\ttZONE,     HOUR ( 0) },\n    { \"wet\",\ttZONE,     HOUR ( 0) },\t/* Western European */\n    { \"bst\",\ttDAYZONE,  HOUR ( 0) },\t/* British Summer */\n    { \"wat\",\ttZONE,     HOUR ( 1) },\t/* West Africa */\n    { \"at\",\ttZONE,     HOUR ( 2) },\t/* Azores */\n#if\t0\n    /* For completeness.  BST is also British Summer, and GST is\n     * also Guam Standard. */\n    { \"bst\",\ttZONE,     HOUR ( 3) },\t/* Brazil Standard */\n    { \"gst\",\ttZONE,     HOUR ( 3) },\t/* Greenland Standard */\n#endif\n#if 0\n    { \"nft\",\ttZONE,     HOUR (3.5) },\t/* Newfoundland */\n    { \"nst\",\ttZONE,     HOUR (3.5) },\t/* Newfoundland Standard */\n    { \"ndt\",\ttDAYZONE,  HOUR (3.5) },\t/* Newfoundland Daylight */\n#endif\n    { \"ast\",\ttZONE,     HOUR ( 4) },\t/* Atlantic Standard */\n    { \"adt\",\ttDAYZONE,  HOUR ( 4) },\t/* Atlantic Daylight */\n    { \"est\",\ttZONE,     HOUR ( 5) },\t/* Eastern Standard */\n    { \"edt\",\ttDAYZONE,  HOUR ( 5) },\t/* Eastern Daylight */\n    { \"cst\",\ttZONE,     HOUR ( 6) },\t/* Central Standard */\n    { \"cdt\",\ttDAYZONE,  HOUR ( 6) },\t/* Central Daylight */\n    { \"mst\",\ttZONE,     HOUR ( 7) },\t/* Mountain Standard */\n    { \"mdt\",\ttDAYZONE,  HOUR ( 7) },\t/* Mountain Daylight */\n    { \"pst\",\ttZONE,     HOUR ( 8) },\t/* Pacific Standard */\n    { \"pdt\",\ttDAYZONE,  HOUR ( 8) },\t/* Pacific Daylight */\n    { \"yst\",\ttZONE,     HOUR ( 9) },\t/* Yukon Standard */\n    { \"ydt\",\ttDAYZONE,  HOUR ( 9) },\t/* Yukon Daylight */\n    { \"hst\",\ttZONE,     HOUR (10) },\t/* Hawaii Standard */\n    { \"hdt\",\ttDAYZONE,  HOUR (10) },\t/* Hawaii Daylight */\n    { \"cat\",\ttZONE,     HOUR (10) },\t/* Central Alaska */\n    { \"ahst\",\ttZONE,     HOUR (10) },\t/* Alaska-Hawaii Standard */\n    { \"nt\",\ttZONE,     HOUR (11) },\t/* Nome */\n    { \"idlw\",\ttZONE,     HOUR (12) },\t/* International Date Line West */\n    { \"cet\",\ttZONE,     -HOUR (1) },\t/* Central European */\n    { \"met\",\ttZONE,     -HOUR (1) },\t/* Middle European */\n    { \"mewt\",\ttZONE,     -HOUR (1) },\t/* Middle European Winter */\n    { \"mest\",\ttDAYZONE,  -HOUR (1) },\t/* Middle European Summer */\n    { \"mesz\",\ttDAYZONE,  -HOUR (1) },\t/* Middle European Summer */\n    { \"swt\",\ttZONE,     -HOUR (1) },\t/* Swedish Winter */\n    { \"sst\",\ttDAYZONE,  -HOUR (1) },\t/* Swedish Summer */\n    { \"fwt\",\ttZONE,     -HOUR (1) },\t/* French Winter */\n    { \"fst\",\ttDAYZONE,  -HOUR (1) },\t/* French Summer */\n    { \"eet\",\ttZONE,     -HOUR (2) },\t/* Eastern Europe, USSR Zone 1 */\n    { \"bt\",\ttZONE,     -HOUR (3) },\t/* Baghdad, USSR Zone 2 */\n#if 0\n    { \"it\",\ttZONE,     -HOUR (3.5) },/* Iran */\n#endif\n    { \"zp4\",\ttZONE,     -HOUR (4) },\t/* USSR Zone 3 */\n    { \"zp5\",\ttZONE,     -HOUR (5) },\t/* USSR Zone 4 */\n#if 0\n    { \"ist\",\ttZONE,     -HOUR (5.5) },/* Indian Standard */\n#endif\n    { \"zp6\",\ttZONE,     -HOUR (6) },\t/* USSR Zone 5 */\n#if\t0\n    /* For completeness.  NST is also Newfoundland Standard, and SST is\n     * also Swedish Summer. */\n    { \"nst\",\ttZONE,     -HOUR (6.5) },/* North Sumatra */\n    { \"sst\",\ttZONE,     -HOUR (7) },\t/* South Sumatra, USSR Zone 6 */\n#endif\t/* 0 */\n    { \"wast\",\ttZONE,     -HOUR (7) },\t/* West Australian Standard */\n    { \"wadt\",\ttDAYZONE,  -HOUR (7) },\t/* West Australian Daylight */\n#if 0\n    { \"jt\",\ttZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */\n#endif\n    { \"cct\",\ttZONE,     -HOUR (8) },\t/* China Coast, USSR Zone 7 */\n    { \"jst\",\ttZONE,     -HOUR (9) },\t/* Japan Standard, USSR Zone 8 */\n#if 0\n    { \"cast\",\ttZONE,     -HOUR (9.5) },/* Central Australian Standard */\n    { \"cadt\",\ttDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */\n#endif\n    { \"east\",\ttZONE,     -HOUR (10) },\t/* Eastern Australian Standard */\n    { \"eadt\",\ttDAYZONE,  -HOUR (10) },\t/* Eastern Australian Daylight */\n    { \"gst\",\ttZONE,     -HOUR (10) },\t/* Guam Standard, USSR Zone 9 */\n    { \"nzt\",\ttZONE,     -HOUR (12) },\t/* New Zealand */\n    { \"nzst\",\ttZONE,     -HOUR (12) },\t/* New Zealand Standard */\n    { \"nzdt\",\ttDAYZONE,  -HOUR (12) },\t/* New Zealand Daylight */\n    { \"idle\",\ttZONE,     -HOUR (12) },\t/* International Date Line East */\n    {  NULL  }\n};\n\n/* Military timezone table. */\nstatic TABLE const MilitaryTable[] = {\n    { \"a\",\ttZONE,\tHOUR (  1) },\n    { \"b\",\ttZONE,\tHOUR (  2) },\n    { \"c\",\ttZONE,\tHOUR (  3) },\n    { \"d\",\ttZONE,\tHOUR (  4) },\n    { \"e\",\ttZONE,\tHOUR (  5) },\n    { \"f\",\ttZONE,\tHOUR (  6) },\n    { \"g\",\ttZONE,\tHOUR (  7) },\n    { \"h\",\ttZONE,\tHOUR (  8) },\n    { \"i\",\ttZONE,\tHOUR (  9) },\n    { \"k\",\ttZONE,\tHOUR ( 10) },\n    { \"l\",\ttZONE,\tHOUR ( 11) },\n    { \"m\",\ttZONE,\tHOUR ( 12) },\n    { \"n\",\ttZONE,\tHOUR (- 1) },\n    { \"o\",\ttZONE,\tHOUR (- 2) },\n    { \"p\",\ttZONE,\tHOUR (- 3) },\n    { \"q\",\ttZONE,\tHOUR (- 4) },\n    { \"r\",\ttZONE,\tHOUR (- 5) },\n    { \"s\",\ttZONE,\tHOUR (- 6) },\n    { \"t\",\ttZONE,\tHOUR (- 7) },\n    { \"u\",\ttZONE,\tHOUR (- 8) },\n    { \"v\",\ttZONE,\tHOUR (- 9) },\n    { \"w\",\ttZONE,\tHOUR (-10) },\n    { \"x\",\ttZONE,\tHOUR (-11) },\n    { \"y\",\ttZONE,\tHOUR (-12) },\n    { \"z\",\ttZONE,\tHOUR (  0) },\n    { NULL }\n};\n\n\f\n\n\n/* ARGSUSED */\nstatic int yyerror (char *s)\n{\n  return 0;\n}\n\nstatic int ToHour (int Hours, MERIDIAN Meridian)\n{\n  switch (Meridian)\n    {\n    case MER24:\n      if (Hours < 0 || Hours > 23)\n\treturn -1;\n      return Hours;\n    case MERam:\n      if (Hours < 1 || Hours > 12)\n\treturn -1;\n      if (Hours == 12)\n\tHours = 0;\n      return Hours;\n    case MERpm:\n      if (Hours < 1 || Hours > 12)\n\treturn -1;\n      if (Hours == 12)\n\tHours = 0;\n      return Hours + 12;\n    default:\n      abort ();\n    }\n  /* NOTREACHED */\n}\n\nstatic int ToYear (int Year)\n{\n  if (Year < 0)\n    Year = -Year;\n\n  /* XPG4 suggests that years 00-68 map to 2000-2068, and\n     years 69-99 map to 1969-1999.  */\n  if (Year < 69)\n    Year += 2000;\n  else if (Year < 100)\n    Year += 1900;\n\n  return Year;\n}\n\nstatic int LookupWord (char *buff)\n{\n  register char *p;\n  register char *q;\n  register const TABLE *tp;\n  int i;\n  int abbrev;\n\n  /* Make it lowercase. */\n  for (p = buff; *p; p++)\n    if (ISUPPER (*p))\n      *p = tolower (*p);\n\n  if (strcmp (buff, \"am\") == 0 || strcmp (buff, \"a.m.\") == 0)\n    {\n      yylval.Meridian = MERam;\n      return tMERIDIAN;\n    }\n  if (strcmp (buff, \"pm\") == 0 || strcmp (buff, \"p.m.\") == 0)\n    {\n      yylval.Meridian = MERpm;\n      return tMERIDIAN;\n    }\n\n  /* See if we have an abbreviation for a month. */\n  if (strlen (buff) == 3)\n    abbrev = 1;\n  else if (strlen (buff) == 4 && buff[3] == '.')\n    {\n      abbrev = 1;\n      buff[3] = '\\0';\n    }\n  else\n    abbrev = 0;\n\n  for (tp = MonthDayTable; tp->name; tp++)\n    {\n      if (abbrev)\n\t{\n\t  if (strncmp (buff, tp->name, 3) == 0)\n\t    {\n\t      yylval.Number = tp->value;\n\t      return tp->type;\n\t    }\n\t}\n      else if (strcmp (buff, tp->name) == 0)\n\t{\n\t  yylval.Number = tp->value;\n\t  return tp->type;\n\t}\n    }\n\n  for (tp = TimezoneTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  if (strcmp (buff, \"dst\") == 0)\n    return tDST;\n\n  for (tp = UnitsTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  /* Strip off any plural and try the units table again. */\n  i = strlen (buff) - 1;\n  if (buff[i] == 's')\n    {\n      buff[i] = '\\0';\n      for (tp = UnitsTable; tp->name; tp++)\n\tif (strcmp (buff, tp->name) == 0)\n\t  {\n\t    yylval.Number = tp->value;\n\t    return tp->type;\n\t  }\n      buff[i] = 's';\t\t/* Put back for \"this\" in OtherTable. */\n    }\n\n  for (tp = OtherTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  /* Military timezones. */\n  if (buff[1] == '\\0' && ISALPHA (*buff))\n    {\n      for (tp = MilitaryTable; tp->name; tp++)\n\tif (strcmp (buff, tp->name) == 0)\n\t  {\n\t    yylval.Number = tp->value;\n\t    return tp->type;\n\t  }\n    }\n\n  /* Drop out any periods and try the timezone table again. */\n  for (i = 0, p = q = buff; *q; q++)\n    if (*q != '.')\n      *p++ = *q;\n    else\n      i++;\n  *p = '\\0';\n  if (i)\n    for (tp = TimezoneTable; tp->name; tp++)\n      if (strcmp (buff, tp->name) == 0)\n\t{\n\t  yylval.Number = tp->value;\n\t  return tp->type;\n\t}\n\n  return tID;\n}\n\nstatic int yylex (void)\n{\n  register char c;\n  register char *p;\n  char buff[20];\n  int Count;\n  int sign;\n\n  for (;;)\n    {\n      while (ISSPACE (*yyInput))\n\tyyInput++;\n\n      if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')\n\t{\n\t  if (c == '-' || c == '+')\n\t    {\n\t      sign = c == '-' ? -1 : 1;\n\t      if (!ISDIGIT (*++yyInput))\n\t\t/* skip the '-' sign */\n\t\tcontinue;\n\t    }\n\t  else\n\t    sign = 0;\n\t  for (yylval.Number = 0; ISDIGIT (c = *yyInput++);)\n\t    yylval.Number = 10 * yylval.Number + c - '0';\n\t  yyInput--;\n\t  if (sign < 0)\n\t    yylval.Number = -yylval.Number;\n\t  return sign ? tSNUMBER : tUNUMBER;\n\t}\n      if (ISALPHA (c))\n\t{\n\t  for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';)\n\t    if (p < &buff[sizeof buff - 1])\n\t      *p++ = c;\n\t  *p = '\\0';\n\t  yyInput--;\n\t  return LookupWord (buff);\n\t}\n      if (c != '(')\n\treturn *yyInput++;\n      Count = 0;\n      do\n\t{\n\t  c = *yyInput++;\n\t  if (c == '\\0')\n\t    return c;\n\t  if (c == '(')\n\t    Count++;\n\t  else if (c == ')')\n\t    Count--;\n\t}\n      while (Count > 0);\n    }\n}\n\n#define TM_YEAR_ORIGIN 1900\n\n/* Yield A - B, measured in seconds.  */\nstatic long difftm (struct tm *a, struct tm *b)\n{\n  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);\n  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);\n  long days = (\n  /* difference in day of year */\n\t\ta->tm_yday - b->tm_yday\n  /* + intervening leap days */\n\t\t+ ((ay >> 2) - (by >> 2))\n\t\t- (ay / 100 - by / 100)\n\t\t+ ((ay / 100 >> 2) - (by / 100 >> 2))\n  /* + difference in years * 365 */\n\t\t+ (long) (ay - by) * 365\n  );\n  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))\n\t\t+ (a->tm_min - b->tm_min))\n\t  + (a->tm_sec - b->tm_sec));\n}\n\ntime_t get_date (const char *p, const time_t *now)\n{\n  struct tm tm, tm0, *tmp;\n  time_t Start;\n\n  yyInput = p;\n  Start = now ? *now : time ((time_t *) NULL);\n  tmp = (set_gmtime ? gmtime(&Start) : localtime (&Start));\n  yyYear = tmp->tm_year + TM_YEAR_ORIGIN;\n  yyMonth = tmp->tm_mon + 1;\n  yyDay = tmp->tm_mday;\n  yyHour = tmp->tm_hour;\n  yyMinutes = tmp->tm_min;\n  yySeconds = tmp->tm_sec;\n  yyMeridian = MER24;\n  yyRelSeconds = 0;\n  yyRelMinutes = 0;\n  yyRelHour = 0;\n  yyRelDay = 0;\n  yyRelMonth = 0;\n  yyRelYear = 0;\n  yyHaveDate = 0;\n  yyHaveDay = 0;\n  yyHaveRel = 0;\n  yyHaveTime = 0;\n  yyHaveZone = 0;\n\n  if (yyparse ()\n      || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)\n    return -1;\n\n  tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear;\n  tm.tm_mon = yyMonth - 1 + yyRelMonth;\n  tm.tm_mday = yyDay + yyRelDay;\n  if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay))\n    {\n      tm.tm_hour = ToHour (yyHour, yyMeridian);\n      if (tm.tm_hour < 0)\n\treturn -1;\n      tm.tm_min = yyMinutes;\n      tm.tm_sec = yySeconds;\n    }\n  else\n    {\n      tm.tm_hour = tm.tm_min = tm.tm_sec = 0;\n    }\n  tm.tm_hour += yyRelHour;\n  tm.tm_min += yyRelMinutes;\n  tm.tm_sec += yyRelSeconds;\n  tm.tm_isdst = -1;\n  tm0 = tm;\n\n  Start = mktime (&tm);\n\n  if (Start == (time_t) -1)\n    {\n\n      /* Guard against falsely reporting errors near the time_t boundaries\n         when parsing times in other time zones.  For example, if the min\n         time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead\n         of UTC, then the min localtime value is 1970-01-01 08:00:00; if\n         we apply mktime to 1970-01-01 00:00:00 we will get an error, so\n         we apply mktime to 1970-01-02 08:00:00 instead and adjust the time\n         zone by 24 hours to compensate.  This algorithm assumes that\n         there is no DST transition within a day of the time_t boundaries.  */\n      if (yyHaveZone)\n\t{\n\t  tm = tm0;\n\t  if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN)\n\t    {\n\t      tm.tm_mday++;\n\t      yyTimezone -= 24 * 60;\n\t    }\n\t  else\n\t    {\n\t      tm.tm_mday--;\n\t      yyTimezone += 24 * 60;\n\t    }\n\t  Start = mktime (&tm);\n\t}\n\n      if (Start == (time_t) -1)\n\treturn Start;\n    }\n\n  if (yyHaveDay && !yyHaveDate)\n    {\n      tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7\n\t\t     + 7 * (yyDayOrdinal - (0 < yyDayOrdinal)));\n      Start = mktime (&tm);\n      if (Start == (time_t) -1)\n\treturn Start;\n    }\n\n  if (yyHaveZone)\n    {\n      long delta = yyTimezone * 60L + difftm (&tm, gmtime (&Start));\n      if ((Start + delta < Start) != (delta < 0))\n\treturn -1;\t\t/* time_t overflow */\n      Start += delta;\n    }\n\n  return Start;\n}\n\n#if\tdefined (TEST)\n\n/* ARGSUSED */\nint main (int ac, char *av[])\n{\n  char buff[MAX_BUFF_LEN + 1];\n  time_t d;\n\n  (void) printf (\"Enter date, or blank line to exit.\\n\\t> \");\n  (void) fflush (stdout);\n\n  buff[MAX_BUFF_LEN] = 0;\n  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])\n    {\n      d = get_date (buff, (time_t *) NULL);\n      if (d == -1)\n\t(void) printf (\"Bad format - couldn't convert.\\n\");\n      else\n\t(void) printf (\"%s\", ctime (&d));\n      (void) printf (\"\\t> \");\n      (void) fflush (stdout);\n    }\n  exit (0);\n  /* NOTREACHED */\n}\n#endif /* defined (TEST) */\n"
  },
  {
    "path": "lcc/hypermail_files.txt",
    "content": "lcc_extras.c\ngetdate.c\ndirent.c\n..\\src\\uudecode.c\n..\\src\\txt2html.c\n..\\src\\trio\\triostr.c\n..\\src\\trio\\trionan.c\n..\\src\\trio\\trio.c\n..\\src\\threadprint.c\n..\\src\\struct.c\n..\\src\\string.c\n..\\src\\setup.c\n..\\src\\search.c\n..\\src\\quotes.c\n..\\src\\printfile.c\n..\\src\\print.c\n..\\src\\pcre\\pcre_study.c\n..\\src\\pcre\\pcreposix.c\n..\\src\\pcre\\pcre.c\n..\\src\\pcre\\pcre_maketables.c\n..\\src\\pcre\\pcre_get.c\n..\\src\\parse.c\n..\\src\\mem.c\n..\\src\\lock.c\n..\\src\\lang.c\n..\\src\\hypermail.c\n..\\src\\getname.c\n..\\src\\finelink.c\n..\\src\\file.c\n..\\src\\domains.c\n..\\src\\dmatch.c\n..\\src\\date.c\n..\\src\\base64.c\n"
  },
  {
    "path": "lcc/lcc_extras.c",
    "content": "/* \n  stat and fstat are defined in lcc, but not lstat\n*/\n\n#include <sys/stat.h>\n\n/*\n* The way we're handling this now is to assume that we'll never try this\n* on a symlink\n*/\nint lstat(const char *file_name, struct stat *buf)\n{\n    return stat(file_name, buf);\n}\n"
  },
  {
    "path": "lcc/lcc_extras.h",
    "content": "/* \n  stat and fstat are defined in lcc, but not lstat\n*/\n\nint lstat(const char *file_name, struct stat *buf);\n"
  },
  {
    "path": "lcc/pcre.h",
    "content": "/*************************************************\n*       Perl-Compatible Regular Expressions      *\n*************************************************/\n\n/* This is the public header file for the PCRE library, to be #included by\napplications that call the PCRE functions.\n\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifndef _PCRE_H\n#define _PCRE_H\n\n/* The current PCRE version information. */\n\n#define PCRE_MAJOR          8\n#define PCRE_MINOR          32\n#define PCRE_PRERELEASE     \n#define PCRE_DATE           2012-11-30\n\n/* When an application links to a PCRE DLL in Windows, the symbols that are\nimported have to be identified as such. When building PCRE, the appropriate\nexport setting is defined in pcre_internal.h, which includes this file. So we\ndon't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */\n\n#if defined(_WIN32) && !defined(PCRE_STATIC)\n#  ifndef PCRE_EXP_DECL\n#    define PCRE_EXP_DECL  extern __declspec(dllimport)\n#  endif\n#  ifdef __cplusplus\n#    ifndef PCRECPP_EXP_DECL\n#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)\n#    endif\n#    ifndef PCRECPP_EXP_DEFN\n#      define PCRECPP_EXP_DEFN  __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n/* By default, we use the standard \"extern\" declarations. */\n\n#ifndef PCRE_EXP_DECL\n#  ifdef __cplusplus\n#    define PCRE_EXP_DECL  extern \"C\"\n#  else\n#    define PCRE_EXP_DECL  extern\n#  endif\n#endif\n\n#ifdef __cplusplus\n#  ifndef PCRECPP_EXP_DECL\n#    define PCRECPP_EXP_DECL  extern\n#  endif\n#  ifndef PCRECPP_EXP_DEFN\n#    define PCRECPP_EXP_DEFN\n#  endif\n#endif\n\n/* Have to include stdlib.h in order to ensure that size_t is defined;\nit is needed here for malloc. */\n\n#include <stdlib.h>\n\n/* Allow for C++ users */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Public options. Some are compile-time only, some are run-time only, and some\nare both, so we keep them all distinct. However, almost all the bits in the\noptions word are now used. In the long run, we may have to re-use some of the\ncompile-time only bits for runtime options, or vice versa. Any of the\ncompile-time options may be inspected during studying (and therefore JIT\ncompiling).\n\nSome options for pcre_compile() change its behaviour but do not affect the\nbehaviour of the execution functions. Other options are passed through to the\nexecution functions and affect their behaviour, with or without affecting the\nbehaviour of pcre_compile().\n\nOptions that can be passed to pcre_compile() are tagged Cx below, with these\nvariants:\n\nC1   Affects compile only\nC2   Does not affect compile; affects exec, dfa_exec\nC3   Affects compile, exec, dfa_exec\nC4   Affects compile, exec, dfa_exec, study\nC5   Affects compile, exec, study\n\nOptions that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with\nE and D, respectively. They take precedence over C3, C4, and C5 settings passed\nfrom pcre_compile(). Those that are compatible with JIT execution are flagged\nwith J. */\n\n#define PCRE_CASELESS           0x00000001  /* C1       */\n#define PCRE_MULTILINE          0x00000002  /* C1       */\n#define PCRE_DOTALL             0x00000004  /* C1       */\n#define PCRE_EXTENDED           0x00000008  /* C1       */\n#define PCRE_ANCHORED           0x00000010  /* C4 E D   */\n#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */\n#define PCRE_EXTRA              0x00000040  /* C1       */\n#define PCRE_NOTBOL             0x00000080  /*    E D J */\n#define PCRE_NOTEOL             0x00000100  /*    E D J */\n#define PCRE_UNGREEDY           0x00000200  /* C1       */\n#define PCRE_NOTEMPTY           0x00000400  /*    E D J */\n#define PCRE_UTF8               0x00000800  /* C4        )          */\n#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */\n#define PCRE_UTF32              0x00000800  /* C4        )          */\n#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */\n#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */\n#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */\n#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */\n#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */\n#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */\n#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */\n#define PCRE_DFA_SHORTEST       0x00010000  /*      D   */\n#define PCRE_DFA_RESTART        0x00020000  /*      D   */\n#define PCRE_FIRSTLINE          0x00040000  /* C3       */\n#define PCRE_DUPNAMES           0x00080000  /* C1       */\n#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */\n#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */\n#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */\n#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */\n#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */\n#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */\n#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */\n#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */\n#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */\n#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */\n#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */\n#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */\n#define PCRE_UCP                0x20000000  /* C3       */\n\n/* Exec-time and get/set-time error codes */\n\n#define PCRE_ERROR_NOMATCH          (-1)\n#define PCRE_ERROR_NULL             (-2)\n#define PCRE_ERROR_BADOPTION        (-3)\n#define PCRE_ERROR_BADMAGIC         (-4)\n#define PCRE_ERROR_UNKNOWN_OPCODE   (-5)\n#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */\n#define PCRE_ERROR_NOMEMORY         (-6)\n#define PCRE_ERROR_NOSUBSTRING      (-7)\n#define PCRE_ERROR_MATCHLIMIT       (-8)\n#define PCRE_ERROR_CALLOUT          (-9)  /* Never used by PCRE itself */\n#define PCRE_ERROR_BADUTF8         (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_PARTIAL         (-12)\n#define PCRE_ERROR_BADPARTIAL      (-13)\n#define PCRE_ERROR_INTERNAL        (-14)\n#define PCRE_ERROR_BADCOUNT        (-15)\n#define PCRE_ERROR_DFA_UITEM       (-16)\n#define PCRE_ERROR_DFA_UCOND       (-17)\n#define PCRE_ERROR_DFA_UMLIMIT     (-18)\n#define PCRE_ERROR_DFA_WSSIZE      (-19)\n#define PCRE_ERROR_DFA_RECURSE     (-20)\n#define PCRE_ERROR_RECURSIONLIMIT  (-21)\n#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */\n#define PCRE_ERROR_BADNEWLINE      (-23)\n#define PCRE_ERROR_BADOFFSET       (-24)\n#define PCRE_ERROR_SHORTUTF8       (-25)\n#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */\n#define PCRE_ERROR_RECURSELOOP     (-26)\n#define PCRE_ERROR_JIT_STACKLIMIT  (-27)\n#define PCRE_ERROR_BADMODE         (-28)\n#define PCRE_ERROR_BADENDIANNESS   (-29)\n#define PCRE_ERROR_DFA_BADRESTART  (-30)\n#define PCRE_ERROR_JIT_BADOPTION   (-31)\n#define PCRE_ERROR_BADLENGTH       (-32)\n\n/* Specific error codes for UTF-8 validity checks */\n\n#define PCRE_UTF8_ERR0               0\n#define PCRE_UTF8_ERR1               1\n#define PCRE_UTF8_ERR2               2\n#define PCRE_UTF8_ERR3               3\n#define PCRE_UTF8_ERR4               4\n#define PCRE_UTF8_ERR5               5\n#define PCRE_UTF8_ERR6               6\n#define PCRE_UTF8_ERR7               7\n#define PCRE_UTF8_ERR8               8\n#define PCRE_UTF8_ERR9               9\n#define PCRE_UTF8_ERR10             10\n#define PCRE_UTF8_ERR11             11\n#define PCRE_UTF8_ERR12             12\n#define PCRE_UTF8_ERR13             13\n#define PCRE_UTF8_ERR14             14\n#define PCRE_UTF8_ERR15             15\n#define PCRE_UTF8_ERR16             16\n#define PCRE_UTF8_ERR17             17\n#define PCRE_UTF8_ERR18             18\n#define PCRE_UTF8_ERR19             19\n#define PCRE_UTF8_ERR20             20\n#define PCRE_UTF8_ERR21             21\n#define PCRE_UTF8_ERR22             22\n\n/* Specific error codes for UTF-16 validity checks */\n\n#define PCRE_UTF16_ERR0              0\n#define PCRE_UTF16_ERR1              1\n#define PCRE_UTF16_ERR2              2\n#define PCRE_UTF16_ERR3              3\n#define PCRE_UTF16_ERR4              4\n\n/* Specific error codes for UTF-32 validity checks */\n\n#define PCRE_UTF32_ERR0              0\n#define PCRE_UTF32_ERR1              1\n#define PCRE_UTF32_ERR2              2\n#define PCRE_UTF32_ERR3              3\n\n/* Request types for pcre_fullinfo() */\n\n#define PCRE_INFO_OPTIONS            0\n#define PCRE_INFO_SIZE               1\n#define PCRE_INFO_CAPTURECOUNT       2\n#define PCRE_INFO_BACKREFMAX         3\n#define PCRE_INFO_FIRSTBYTE          4\n#define PCRE_INFO_FIRSTCHAR          4  /* For backwards compatibility */\n#define PCRE_INFO_FIRSTTABLE         5\n#define PCRE_INFO_LASTLITERAL        6\n#define PCRE_INFO_NAMEENTRYSIZE      7\n#define PCRE_INFO_NAMECOUNT          8\n#define PCRE_INFO_NAMETABLE          9\n#define PCRE_INFO_STUDYSIZE         10\n#define PCRE_INFO_DEFAULT_TABLES    11\n#define PCRE_INFO_OKPARTIAL         12\n#define PCRE_INFO_JCHANGED          13\n#define PCRE_INFO_HASCRORLF         14\n#define PCRE_INFO_MINLENGTH         15\n#define PCRE_INFO_JIT               16\n#define PCRE_INFO_JITSIZE           17\n#define PCRE_INFO_MAXLOOKBEHIND     18\n#define PCRE_INFO_FIRSTCHARACTER      19\n#define PCRE_INFO_FIRSTCHARACTERFLAGS   20\n#define PCRE_INFO_REQUIREDCHAR      21\n#define PCRE_INFO_REQUIREDCHARFLAGS   22\n\n/* Request types for pcre_config(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_CONFIG_UTF8                    0\n#define PCRE_CONFIG_NEWLINE                 1\n#define PCRE_CONFIG_LINK_SIZE               2\n#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD  3\n#define PCRE_CONFIG_MATCH_LIMIT             4\n#define PCRE_CONFIG_STACKRECURSE            5\n#define PCRE_CONFIG_UNICODE_PROPERTIES      6\n#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7\n#define PCRE_CONFIG_BSR                     8\n#define PCRE_CONFIG_JIT                     9\n#define PCRE_CONFIG_UTF16                  10\n#define PCRE_CONFIG_JITTARGET              11\n#define PCRE_CONFIG_UTF32                  12\n\n/* Request types for pcre_study(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_STUDY_JIT_COMPILE                0x0001\n#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002\n#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004\n#define PCRE_STUDY_EXTRA_NEEDED               0x0008\n\n/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine\nthese bits, just add new ones on the end, in order to remain compatible. */\n\n#define PCRE_EXTRA_STUDY_DATA             0x0001\n#define PCRE_EXTRA_MATCH_LIMIT            0x0002\n#define PCRE_EXTRA_CALLOUT_DATA           0x0004\n#define PCRE_EXTRA_TABLES                 0x0008\n#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010\n#define PCRE_EXTRA_MARK                   0x0020\n#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040\n\n/* Types */\n\nstruct real_pcre;                 /* declaration; the definition is private  */\ntypedef struct real_pcre pcre;\n\nstruct real_pcre16;               /* declaration; the definition is private  */\ntypedef struct real_pcre16 pcre16;\n\nstruct real_pcre32;               /* declaration; the definition is private  */\ntypedef struct real_pcre32 pcre32;\n\nstruct real_pcre_jit_stack;       /* declaration; the definition is private  */\ntypedef struct real_pcre_jit_stack pcre_jit_stack;\n\nstruct real_pcre16_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre16_jit_stack pcre16_jit_stack;\n\nstruct real_pcre32_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre32_jit_stack pcre32_jit_stack;\n\n/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain\na 16 bit wide signed data type. Otherwise it can be a dummy data type since\npcre16 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR16\n#define PCRE_UCHAR16 unsigned short\n#endif\n\n#ifndef PCRE_SPTR16\n#define PCRE_SPTR16 const PCRE_UCHAR16 *\n#endif\n\n/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain\na 32 bit wide signed data type. Otherwise it can be a dummy data type since\npcre32 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR32\n#define PCRE_UCHAR32 unsigned int\n#endif\n\n#ifndef PCRE_SPTR32\n#define PCRE_SPTR32 const PCRE_UCHAR32 *\n#endif\n\n/* When PCRE is compiled as a C++ library, the subject pointer type can be\nreplaced with a custom type. For conventional use, the public interface is a\nconst char *. */\n\n#ifndef PCRE_SPTR\n#define PCRE_SPTR const char *\n#endif\n\n/* The structure for passing additional data to pcre_exec(). This is defined in\nsuch as way as to be extensible. Always add new fields at the end, in order to\nremain compatible. */\n\ntypedef struct pcre_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  unsigned char **mark;           /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre_extra;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre16_extra;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre32_extra;\n\n/* The structure for passing out data via the pcre_callout_function. We use a\nstructure so that new fields can be added on the end in future versions,\nwithout changing the API of the function, thereby allowing old clients to work\nwithout modification. */\n\ntypedef struct pcre_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR    subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const unsigned char *mark;      /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre_callout_block;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR16  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre16_callout_block;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR32  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre32_callout_block;\n\n/* Indirection for store get and free functions. These can be set to\nalternative malloc/free functions if required. Special ones are used in the\nnon-recursive case for \"frames\". There is also an optional callout function\nthat is triggered by the (?) regex item. For Virtual Pascal, these definitions\nhave to take another form. */\n\n#ifndef VPCOMPAT\nPCRE_EXP_DECL void *(*pcre_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_free)(void *);\nPCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);\n\nPCRE_EXP_DECL void *(*pcre16_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_free)(void *);\nPCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);\n\nPCRE_EXP_DECL void *(*pcre32_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_free)(void *);\nPCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);\n#else   /* VPCOMPAT */\nPCRE_EXP_DECL void *pcre_malloc(size_t);\nPCRE_EXP_DECL void  pcre_free(void *);\nPCRE_EXP_DECL void *pcre_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre_stack_free(void *);\nPCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);\n\nPCRE_EXP_DECL void *pcre16_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_free(void *);\nPCRE_EXP_DECL void *pcre16_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_stack_free(void *);\nPCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);\n\nPCRE_EXP_DECL void *pcre32_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_free(void *);\nPCRE_EXP_DECL void *pcre32_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_stack_free(void *);\nPCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);\n#endif  /* VPCOMPAT */\n\n/* User defined callback which provides a stack just before the match starts. */\n\ntypedef pcre_jit_stack *(*pcre_jit_callback)(void *);\ntypedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);\ntypedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);\n\n/* Exported PCRE functions */\n\nPCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL int  pcre_config(int, void *);\nPCRE_EXP_DECL int  pcre16_config(int, void *);\nPCRE_EXP_DECL int  pcre32_config(int, void *);\nPCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,\n                  int *, int, const char *, char *, int);\nPCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,\n                  char *, int);\nPCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,\n                  const char *, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,\n                  PCRE_SPTR16, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,\n                  PCRE_SPTR32, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,\n                   int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,\n                   PCRE_SPTR, int, int, int, int *, int,\n                   pcre_jit_stack *);\nPCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int,\n                   pcre16_jit_stack *);\nPCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int,\n                   pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_free_substring(const char *);\nPCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);\nPCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);\nPCRE_EXP_DECL void pcre_free_substring_list(const char **);\nPCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);\nPCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,\n                  int *, int, const char *, const char **);\nPCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);\nPCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);\nPCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);\nPCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,\n                  char **, char **);\nPCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,\n                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);\nPCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,\n                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);\nPCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,\n                  const char **);\nPCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,\n                  const char ***);\nPCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,\n                  PCRE_SPTR16 **);\nPCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,\n                  PCRE_SPTR32 **);\nPCRE_EXP_DECL const unsigned char *pcre_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre16_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre32_maketables(void);\nPCRE_EXP_DECL int  pcre_refcount(pcre *, int);\nPCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);\nPCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);\nPCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);\nPCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);\nPCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);\nPCRE_EXP_DECL void pcre_free_study(pcre_extra *);\nPCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);\nPCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);\nPCRE_EXP_DECL const char *pcre_version(void);\nPCRE_EXP_DECL const char *pcre16_version(void);\nPCRE_EXP_DECL const char *pcre32_version(void);\n\n/* Utility functions for byte order swaps. */\nPCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,\n                  PCRE_SPTR16, int, int *, int);\nPCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,\n                  PCRE_SPTR32, int, int *, int);\n\n/* JIT compiler related functions. */\n\nPCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);\nPCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);\nPCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);\nPCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,\n                  pcre_jit_callback, void *);\nPCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,\n                  pcre16_jit_callback, void *);\nPCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,\n                  pcre32_jit_callback, void *);\n\n#ifdef __cplusplus\n}  /* extern \"C\" */\n#endif\n\n#endif /* End of pcre.h */\n"
  },
  {
    "path": "lcc/pcre_chartables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* This file contains character tables that are used when no external tables\nare passed to PCRE by the application that calls it. The tables are used only\nfor characters whose code values are less than 256.\n\nThis is a default version of the tables that assumes ASCII encoding. A program\ncalled dftables (which is distributed with PCRE) can be used to build\nalternative versions of this file. This is necessary if you are running in an\nEBCDIC environment, or if you want to default to a different encoding, for\nexample ISO-8859-1. When dftables is run, it creates these tables in the\ncurrent locale. If PCRE is configured with --enable-rebuild-chartables, this\nhappens automatically.\n\nThe following #includes are present because without them gcc 4.x may remove the\narray definition from the final binary if PCRE is built into a static library\nand dead code stripping is activated. This leads to link errors. Pulling in the\nheader ensures that the array gets flagged as \"someone outside this compilation\nunit might reference this\" and so it will always be supplied to the linker. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\nconst pcre_uint8 PRIV(default_tables)[] = {\n\n/* This table is a lower casing table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table is a case flipping table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 65, 66, 67, 68, 69, 70, 71,\n   72, 73, 74, 75, 76, 77, 78, 79,\n   80, 81, 82, 83, 84, 85, 86, 87,\n   88, 89, 90,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table contains bit maps for various character classes. Each map is 32\nbytes long and the bits run from the least significant end of each byte. The\nclasses that have their own maps are: space, xdigit, digit, upper, lower, word,\ngraph, print, punct, and cntrl. Other classes are built from combinations. */\n\n  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,\n  0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n/* This table identifies various classes of character by individual bits:\n  0x01   white space character\n  0x02   letter\n  0x04   decimal digit\n  0x08   hexadecimal digit\n  0x10   alphanumeric or '_'\n  0x80   regular expression metacharacter or binary zero\n*/\n\n  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */\n  0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /*   8- 15 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */\n  0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /*    - '  */\n  0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /*  ( - /  */\n  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */\n  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /*  8 - ?  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  @ - G  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  H - O  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  P - W  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /*  X - _  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  ` - g  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  h - o  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  p - w  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /*  x -127 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */\n\n/* End of pcre_chartables.c */\n"
  },
  {
    "path": "lcc/pcre_config.h",
    "content": "/* config.h.  Generated from config.h.in by configure.  */\n/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* PCRE is written in Standard C, but there are a few non-standard things it\ncan cope with, allowing it to run on SunOS4 and other \"close to standard\"\nsystems.\n\nIn environments that support the facilities, config.h.in is converted by\n\"configure\", or config-cmake.h.in is converted by CMake, into config.h. If you\nare going to build PCRE \"by hand\" without using \"configure\" or CMake, you\nshould copy the distributed config.h.generic to config.h, and then edit the\nmacro definitions to be the way you need them. You must then add\n-DHAVE_CONFIG_H to all of your compile commands, so that config.h is included\nat the start of every source.\n\nAlternatively, you can avoid editing by using -D on the compiler command line\nto set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H.\n\nPCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if\nHAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set\nthem both to 0; an emulation function will be used. */\n\n/* By default, the \\R escape sequence matches any Unicode line ending\n   character or sequence of characters. If BSR_ANYCRLF is defined (to any\n   value), this is changed so that backslash-R matches only CR, LF, or CRLF.\n   The build-time default can be overridden by the user of PCRE at runtime. */\n/* #undef BSR_ANYCRLF */\n\n/* If you are compiling for a system that uses EBCDIC instead of ASCII\n   character codes, define this macro to any value. You must also edit the\n   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).\n   On systems that can use \"configure\" or CMake to set EBCDIC, NEWLINE is\n   automatically adjusted. When EBCDIC is set, PCRE assumes that all input\n   strings are in EBCDIC. If you do not define this macro, PCRE will assume\n   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build\n   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */\n/* #undef EBCDIC */\n\n/* In an EBCDIC environment, define this macro to any value to arrange for the\n   NL character to be 0x25 instead of the default 0x15. NL plays the role that\n   LF does in an ASCII/Unicode environment. The value must also be set in the\n   NEWLINE macro below. On systems that can use \"configure\" or CMake to set\n   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */\n/* #undef EBCDIC_NL25 */\n\n/* Define to 1 if you have the `bcopy' function. */\n#ifndef HAVE_BCOPY\n#define HAVE_BCOPY 1\n#endif\n\n/* Define to 1 if you have the <bits/type_traits.h> header file. */\n/* #undef HAVE_BITS_TYPE_TRAITS_H */\n\n/* Define to 1 if you have the <bzlib.h> header file. */\n#ifndef HAVE_BZLIB_H\n#define HAVE_BZLIB_H 1\n#endif\n\n/* Define to 1 if you have the <dirent.h> header file. */\n#ifndef HAVE_DIRENT_H\n#define HAVE_DIRENT_H 1\n#endif\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#ifndef HAVE_DLFCN_H\n#define HAVE_DLFCN_H 1\n#endif\n\n/* Define to 1 if you have the <editline/readline.h> header file. */\n/* #undef HAVE_EDITLINE_READLINE_H */\n\n/* Define to 1 if you have the <edit/readline/readline.h> header file. */\n/* #undef HAVE_EDIT_READLINE_READLINE_H */\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#ifndef HAVE_INTTYPES_H\n#define HAVE_INTTYPES_H 1\n#endif\n\n/* Define to 1 if you have the <limits.h> header file. */\n#ifndef HAVE_LIMITS_H\n#define HAVE_LIMITS_H 1\n#endif\n\n/* Define to 1 if the system has the type `long long'. */\n#ifndef HAVE_LONG_LONG\n#define HAVE_LONG_LONG 1\n#endif\n\n/* Define to 1 if you have the `memmove' function. */\n#ifndef HAVE_MEMMOVE\n#define HAVE_MEMMOVE 1\n#endif\n\n/* Define to 1 if you have the <memory.h> header file. */\n#ifndef HAVE_MEMORY_H\n#define HAVE_MEMORY_H 1\n#endif\n\n/* Define if you have POSIX threads libraries and header files. */\n/* #undef HAVE_PTHREAD */\n\n/* Have PTHREAD_PRIO_INHERIT. */\n/* #undef HAVE_PTHREAD_PRIO_INHERIT */\n\n/* Define to 1 if you have the <readline/history.h> header file. */\n/* #undef HAVE_READLINE_HISTORY_H */\n\n/* Define to 1 if you have the <readline/readline.h> header file. */\n/* #undef HAVE_READLINE_READLINE_H */\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#ifndef HAVE_STDINT_H\n#define HAVE_STDINT_H 1\n#endif\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#ifndef HAVE_STDLIB_H\n#define HAVE_STDLIB_H 1\n#endif\n\n/* Define to 1 if you have the `strerror' function. */\n#ifndef HAVE_STRERROR\n#define HAVE_STRERROR 1\n#endif\n\n/* Define to 1 if you have the <string> header file. */\n#ifndef HAVE_STRING\n#define HAVE_STRING 1\n#endif\n\n/* Define to 1 if you have the <strings.h> header file. */\n#ifndef HAVE_STRINGS_H\n#define HAVE_STRINGS_H 1\n#endif\n\n/* Define to 1 if you have the <string.h> header file. */\n#ifndef HAVE_STRING_H\n#define HAVE_STRING_H 1\n#endif\n\n/* Define to 1 if you have `strtoimax'. */\n/* #undef HAVE_STRTOIMAX */\n\n/* Define to 1 if you have `strtoll'. */\n/* #undef HAVE_STRTOLL */\n\n/* Define to 1 if you have `strtoq'. */\n#ifndef HAVE_STRTOQ\n#define HAVE_STRTOQ 1\n#endif\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#ifndef HAVE_SYS_STAT_H\n#define HAVE_SYS_STAT_H 1\n#endif\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#ifndef HAVE_SYS_TYPES_H\n#define HAVE_SYS_TYPES_H 1\n#endif\n\n/* Define to 1 if you have the <type_traits.h> header file. */\n/* #undef HAVE_TYPE_TRAITS_H */\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#ifndef HAVE_UNISTD_H\n#define HAVE_UNISTD_H 1\n#endif\n\n/* Define to 1 if the system has the type `unsigned long long'. */\n#ifndef HAVE_UNSIGNED_LONG_LONG\n#define HAVE_UNSIGNED_LONG_LONG 1\n#endif\n\n/* Define to 1 or 0, depending whether the compiler supports simple visibility\n   declarations. */\n#ifndef HAVE_VISIBILITY\n#define HAVE_VISIBILITY 1\n#endif\n\n/* Define to 1 if you have the <windows.h> header file. */\n/* #undef HAVE_WINDOWS_H */\n\n/* Define to 1 if you have the <zlib.h> header file. */\n#ifndef HAVE_ZLIB_H\n#define HAVE_ZLIB_H 1\n#endif\n\n/* Define to 1 if you have `_strtoi64'. */\n/* #undef HAVE__STRTOI64 */\n\n/* The value of LINK_SIZE determines the number of bytes used to store links\n   as offsets within the compiled regex. The default is 2, which allows for\n   compiled patterns up to 64K long. This covers the vast majority of cases.\n   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows\n   for longer patterns in extreme cases. */\n#ifndef LINK_SIZE\n#define LINK_SIZE 2\n#endif\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#ifndef LT_OBJDIR\n#define LT_OBJDIR \".libs/\"\n#endif\n\n/* The value of MATCH_LIMIT determines the default number of times the\n   internal match() function can be called during a single execution of\n   pcre_exec(). There is a runtime interface for setting a different limit.\n   The limit exists in order to catch runaway regular expressions that take\n   for ever to determine that they do not match. The default is set very large\n   so that it does not accidentally catch legitimate cases. */\n#ifndef MATCH_LIMIT\n#define MATCH_LIMIT 10000000\n#endif\n\n/* The above limit applies to all calls of match(), whether or not they\n   increase the recursion depth. In some environments it is desirable to limit\n   the depth of recursive calls of match() more strictly, in order to restrict\n   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is\n   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of\n   match(). To have any useful effect, it must be less than the value of\n   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is\n   a runtime method for setting a different limit. */\n#ifndef MATCH_LIMIT_RECURSION\n#define MATCH_LIMIT_RECURSION MATCH_LIMIT\n#endif\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#ifndef MAX_NAME_COUNT\n#define MAX_NAME_COUNT 10000\n#endif\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#ifndef MAX_NAME_SIZE\n#define MAX_NAME_SIZE 32\n#endif\n\n/* The value of NEWLINE determines the default newline character sequence.\n   PCRE client programs can override this by selecting other values at run\n   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338\n   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or\n   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and\n   0x25) that are used as the NL line terminator that is equivalent to ASCII\n   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),\n   or -2 (ANYCRLF). */\n#ifndef NEWLINE\n#define NEWLINE 10\n#endif\n\n/* Define to 1 if your C compiler doesn't accept -c and -o together. */\n/* #undef NO_MINUS_C_MINUS_O */\n\n/* PCRE uses recursive function calls to handle backtracking while matching.\n   This can sometimes be a problem on systems that have stacks of limited\n   size. Define NO_RECURSE to any value to get a version that doesn't use\n   recursion in the match() function; instead it creates its own stack by\n   steam using pcre_recurse_malloc() to obtain memory from the heap. For more\n   detail, see the comments and other stuff just above the match() function.\n   */\n/* #undef NO_RECURSE */\n\n/* Name of package */\n#define PACKAGE \"pcre\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"PCRE\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"PCRE 8.32\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"pcre\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"8.32\"\n\n/* The value of PCREGREP_BUFSIZE determines the size of buffer used by\n   pcregrep to hold parts of the file it is searching. This is also the\n   minimum value. The actual amount of memory used by pcregrep is three times\n   this number, because it allows for the buffering of \"before\" and \"after\"\n   lines. */\n#ifndef PCREGREP_BUFSIZE\n#define PCREGREP_BUFSIZE 20480\n#endif\n\n/* If you are compiling for a system other than a Unix-like system or\n   Win32, and it needs some magic to be inserted before the definition\n   of a function that is exported by the library, define this macro to\n   contain the relevant magic. If you do not define this macro, a suitable\n    __declspec value is used for Windows systems; in other environments\n   \"extern\" is used for a C compiler and \"extern C\" for a C++ compiler.\n   This macro apears at the start of every exported function that is part\n   of the external API. It does not appear on functions that are \"external\"\n   in the C sense, but which are internal to the library. */\n/* #undef PCRE_EXP_DEFN */\n\n/* Define to any value if linking statically (TODO: make nice with Libtool) */\n/* #undef PCRE_STATIC */\n\n/* When calling PCRE via the POSIX interface, additional working storage is\n   required for holding the pointers to capturing substrings because PCRE\n   requires three integers per substring, whereas the POSIX interface provides\n   only two. If the number of expected substrings is small, the wrapper\n   function uses space on the stack, because this is faster than using\n   malloc() for each call. The threshold above which the stack is no longer\n   used is defined by POSIX_MALLOC_THRESHOLD. */\n#ifndef POSIX_MALLOC_THRESHOLD\n#define POSIX_MALLOC_THRESHOLD 10\n#endif\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n/* #undef PTHREAD_CREATE_JOINABLE */\n\n/* Define to 1 if you have the ANSI C header files. */\n#ifndef STDC_HEADERS\n#define STDC_HEADERS 1\n#endif\n\n/* Define to allow pcretest and pcregrep to be linked with gcov, so that they\n   are able to generate code coverage reports. */\n/* #undef SUPPORT_GCOV */\n\n/* Define to any value to enable support for Just-In-Time compiling. */\n/* #undef SUPPORT_JIT */\n\n/* Define to any value to allow pcregrep to be linked with libbz2, so that it\n   is able to handle .bz2 files. */\n/* #undef SUPPORT_LIBBZ2 */\n\n/* Define to any value to allow pcretest to be linked with libedit. */\n/* #undef SUPPORT_LIBEDIT */\n\n/* Define to any value to allow pcretest to be linked with libreadline. */\n/* #undef SUPPORT_LIBREADLINE */\n\n/* Define to any value to allow pcregrep to be linked with libz, so that it is\n   able to handle .gz files. */\n/* #undef SUPPORT_LIBZ */\n\n/* Define to any value to enable the 16 bit PCRE library. */\n/* #undef SUPPORT_PCRE16 */\n\n/* Define to any value to enable the 32 bit PCRE library. */\n/* #undef SUPPORT_PCRE32 */\n\n/* Define to any value to enable the 8 bit PCRE library. */\n#ifndef SUPPORT_PCRE8\n#define SUPPORT_PCRE8 /**/\n#endif\n\n/* Define to any value to enable JIT support in pcregrep. */\n/* #undef SUPPORT_PCREGREP_JIT */\n\n/* Define to any value to enable support for Unicode properties. */\n/* #undef SUPPORT_UCP */\n\n/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.\n   This will work even in an EBCDIC environment, but it is incompatible with\n   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*\n   ASCII/UTF-8/16/32, but not both at once. */\n/* #undef SUPPORT_UTF */\n\n/* Valgrind support to find invalid memory reads. */\n/* #undef SUPPORT_VALGRIND */\n\n/* Version number of package */\n#ifndef VERSION\n#define VERSION \"8.32\"\n#endif\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Define to the type of a signed integer type of width exactly 64 bits if\n   such a type exists and the standard includes do not define it. */\n/* #undef int64_t */\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n/* #undef size_t */\n"
  },
  {
    "path": "libcgi/.indent.pro",
    "content": "-nbad -bap -nbbo -nbc -br -brs -c33 -cd33 -ncdb -nce -ci4 \n-cp33 -ncs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs\n-npsl -nsc -nsob -nss\n-Tform_entry\n-Tcgi_info\n-TFILE\n"
  },
  {
    "path": "libcgi/Makefile.in",
    "content": "# CGI virdoc library makefile\n\n#WNOERROR=-Werror\n#WARNINGS=$(WNOERROR) -ansi -pedantic -Wall -Wtraditional -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Dlint\n \n# You shouldn't have to edit anything else.\nCC=@CC@ $(WARNINGS)\nINSTALL=@INSTALL@\nAUX_LIBS=\nRANLIB=@RANLIB@\nRM=rm\nLINT=lint\n\nSRCS=form_ent.c get_cgi_info.c main.c syn_mime.c syn_url.c mcode.c\\\n        form_tags.c strops.c html.c\n\n.c.o:\n\t$(CC) -c $(CFLAGS) $(AUX_CFLAGS) $(INF_INCS) $<\n\nALL = libcgi.a\n\n%.o: %.c\n\t$(CC) -c $(CFLAGS) $(AUX_CFLAGS) $(INF_INCS) $<\n\nall: $(ALL)\n\nlibcgi.a: form_ent.o get_cgi_info.o main.o syn_mime.o syn_url.o mcode.o\\\n\tform_tags.o strops.o html.o\n\tar r $@ $?\n\t${RANLIB} $@\n\ninstall: $(ALL)\n\nclean:\n\t-$(RM) -f *.o *~ *.a\n\nclobber: clean\ndistclean: clean\n\ninsight: clean\n\t$(MAKE) CC=\"insight\"\n\nlint:\n\t$(LINT) $(LINTFLAGS) $(SRCS) 2>&1 | tee lint.out\n\n"
  },
  {
    "path": "libcgi/cgi.h",
    "content": "/** \n ** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n **         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n ** Kevin Hughes, kev@kevcom.com 3/11/94\n ** Kent Landfield, kent@landfield.com 4/6/97\n ** \n ** This program and library is free software; you can redistribute it and/or \n ** modify it under the terms of the GNU (Library) General Public License \n ** as published by the Free Software Foundation; either version 2 \n ** of the License, or any later version. \n ** \n ** This program is distributed in the hope that it will be useful, \n ** but WITHOUT ANY WARRANTY; without even the implied warranty of \n ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n ** GNU (Library) General Public License for more details. \n ** \n ** You should have received a copy of the GNU (Library) General Public License\n ** along with this program; if not, write to the Free Software \n ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n **/\n\n/**\n ** This file is part of the LIBCGI library\n **\n */\n\n#ifndef CGI_H\n#define CGI_H\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include \"../config.h\"\n\n#ifdef NO_MACRO\n#undef isspace\n#undef isdigit\n#undef isalpha\n#undef isupper\n#undef islower\n#undef isxdigit\n#undef isalnum\n#undef ispunct\n#undef isprint\n#undef isgraph\n#undef iscntrl\n#undef isascii\n#endif\n\n\n\n#define MCODE_GET 1\n#define MCODE_POST 2\n#define MCODE_PUT 3\n#define MCODE_HEAD 4\n\ntypedef struct {\n    char *server_software;\n    char *server_name;\n    char *gateway_interface;\n    char *server_protocol;\n    char *server_port;\n    char *request_method;\n    char *http_accept;\n    char *path_info;\n    char *path_translated;\n    char *script_name;\n    char *query_string;\n    char *remote_host;\n    char *remote_addr;\n    char *remote_user;\n    char *auth_type;\n    char *remote_ident;\n    char *content_type;\n    int content_length;\n} cgi_info;\n\ntypedef struct festruct {\n    char *name;\n    char *val;\n    struct festruct *next;\n} form_entry;\n\n\n/* Prototypes */\n/* ---------- */\n\nint get_cgi_info(cgi_info *);\nint syn_base_url(char *, cgi_info *);\nint syn_mimeheader(char *, char *);\nint mcode(cgi_info *);\nchar *trim(char *);\nchar *strmaxcpy(char *, char *, int);\nchar *sanitize(char *, char *);\nchar *parmval(form_entry *, char *);\nint print_base_url(cgi_info *);\nint print_mimeheader(const char *);\nvoid print_doc_begin(char *);\nvoid print_doc_end(char *);\nvoid print_logo(void);\nvoid print_sel_list(char *, char **, char *);\nvoid print_submit(char *);\nvoid print_input_blank(char *, unsigned int, unsigned int, char *);\nform_entry *get_form_entries(cgi_info *);\nvoid free_form_entries(form_entry *);\nform_entry *get_fes_from_string(char *);\nform_entry *get_fes_from_stream(int, FILE *);\nunsigned char dd2c(char, char);\nvoid dump_cgi_info(cgi_info *);\n\n#ifdef lint\nextern int isspace(int);\nextern int isalnum(int);\n\nextern int strcasecmp(const char *, const char *);\nextern int strncasecmp(const char *, const char *, size_t);\n#endif\n#endif\n"
  },
  {
    "path": "libcgi/form_ent.c",
    "content": "/**\n ** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n **         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n ** Kevin Hughes, kev@kevcom.com 3/11/94\n ** Kent Landfield, kent@landfield.com 4/6/97\n ** \n ** This program and library is free software; you can redistribute it and/or \n ** modify it under the terms of the GNU (Library) General Public License \n ** as published by the Free Software Foundation; either version 2 \n ** of the License, or any later version. \n ** \n ** This program is distributed in the hope that it will be useful, \n ** but WITHOUT ANY WARRANTY; without even the implied warranty of \n ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n ** GNU (Library) General Public License for more details. \n ** \n ** You should have received a copy of the GNU (Library) General Public License\n ** along with this program; if not, write to the Free Software \n ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n */\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\n#define LF 10\n#define CR 13\n\n#define STARTSIZE 8\n\nform_entry *get_form_entries(cgi_info *ci)\n{\n    if (ci && ci->request_method &&\n\t!strncasecmp(ci->request_method, \"POST\", 4) && ci->content_type &&\n\t!strncasecmp(ci->content_type, \"application/x-www-form-urlencoded\",\n\t\t     33)) return get_fes_from_stream(ci->content_length,\n\t\t\t\t\t\t     stdin);\n    else if (ci && ci->request_method &&\n\t     !strncasecmp(ci->request_method, \"GET\", 3))\n\treturn get_fes_from_string(ci->query_string);\n    else\n\treturn NULL;\n}\n\nvoid free_form_entries(form_entry *fe)\n{\n    form_entry *tempfe;\n    while (fe) {\n\tif (fe->name)\n\t    free(fe->name);\n\tif (fe->val)\n\t    free(fe->val);\n\ttempfe = fe->next;\n\tfree(fe);\n\tfe = tempfe;\n    }\n}\n\nchar *parmval(form_entry *fe, char *s)\n{\n    while (fe) {\n\tif (!strcasecmp(fe->name, s))\n\t    return fe->val;\n\telse\n\t    fe = fe->next;\n    }\n    return NULL;\n}\n\nform_entry *get_fes_from_string(char *s)\n{\n    form_entry *fe;\n    int asize;\n    int i;\n\n    if (s == NULL)\n\treturn NULL;\n    while (isspace(*s) || *s == '&')\n\ts++;\t\t\t/* some cases that shouldn't happen */\n    if (*s == '\\0')\n\treturn NULL;\n    fe = (form_entry *)malloc(sizeof(form_entry));\n    if (fe == NULL)\n\treturn NULL;\n    fe->name = malloc((asize = STARTSIZE * sizeof(char)));\n    if (fe->name == NULL) {\n\tfree(fe);\n\treturn NULL;\n    }\n    /* get form field name */\n    for (i = 0; *s && *s != '&' && *s != '='; s++, i++) {\n\tswitch (*s) {\n\tcase '+':\n\t    fe->name[i] = ' ';\n\t    break;\n\tcase '%':\n\t    fe->name[i] = dd2c(s[1], s[2]);\n\t    s += 2;\n\t    break;\n\tdefault:\n\t    fe->name[i] = *s;\n\t}\n\tif (i + 1 >= asize) {\t/* try to double the buffer */\n\t    fe->name = realloc(fe->name, (asize *= 2));\n\t    if (fe->name == NULL)\n\t\treturn NULL;\n\t}\n    }\n    fe->name[i] = '\\0';\n    switch (*s++) {\n    case '&':\n\tfe->val = NULL;\n\tbreak;\n    case '=':\n\tfe->val = malloc((asize = STARTSIZE * sizeof(char)));\n\tif (fe->val == NULL)\n\t    break;\n\tfor (i = 0; *s && *s != '&'; s++, i++) {\n\t    switch (*s) {\n\t    case '+':\n\t\tfe->val[i] = ' ';\n\t\tbreak;\n\t    case '%':\n\t\tfe->val[i] = dd2c(s[1], s[2]);\n\t\ts += 2;\n\t\tbreak;\n\t    default:\n\t\tfe->val[i] = *s;\n\t    }\n\t    if (i + 1 >= asize) {\t/* try to double the buffer */\n\t\tfe->val = realloc(fe->val, (asize *= 2));\n\t\tif (fe->val == NULL)\n\t\t    return NULL;\n\t    }\n\t}\n\tfe->val[i] = '\\0';\n\tswitch (*s++) {\n\tcase '&':\n\t    fe->next = get_fes_from_string(s);\n\t    break;\n\tcase '\\0':\n\tdefault:\n\t    fe->next = NULL;\n\t}\n\tbreak;\n    case '\\0':\n    default:\n\tfe->val = NULL;\n\tfe->next = NULL;\n    }\n    return fe;\n}\n\n#define getccl(s, l) (l-- ? getc(s) : EOF)\n\nform_entry *get_fes_from_stream(int length, FILE *stream)\n{\n    form_entry *fe;\n    int asize;\n    int i;\n    int c;\n    int c1, c2;\n\n    while (isspace(c = getccl(stream, length)) || c == '&');\n    if (c == EOF)\n\treturn NULL;\n    fe = (form_entry *)malloc(sizeof(form_entry));\n    if (fe == NULL)\n\treturn NULL;\n    fe->name = malloc((asize = STARTSIZE * sizeof(char)));\n    if (fe->name == NULL) {\n\tfree(fe);\n\treturn NULL;\n    }\n    /* get form field name */\n    for (i = 0; c != EOF && c != '&' && c != '=';\n\t c = getccl(stream, length), i++) {\n\tswitch (c) {\n\tcase '+':\n\t    fe->name[i] = ' ';\n\t    break;\n\tcase '%':\n\t    c1 = getccl(stream, length);\n\t    c2 = getccl(stream, length);\n\t    fe->name[i] = dd2c(c1, c2);\n\t    break;\n\tdefault:\n\t    fe->name[i] = c;\n\t}\n\tif (i + 1 >= asize) {\t/* try to double the buffer */\n\t    fe->name = realloc(fe->name, (asize *= 2));\n\t    if (fe->name == NULL)\n\t\treturn NULL;\n\t}\n    }\n    fe->name[i] = '\\0';\n    if (c == EOF) {\n\tfe->val = NULL;\n\tfe->next = NULL;\n    }\n    else\n\tswitch (c) {\n\tcase '&':\n\t    fe->val = NULL;\n\t    break;\n\tcase '=':\n\t    fe->val = malloc((asize = STARTSIZE * sizeof(char)));\n\t    for (i = 0, c = getccl(stream, length); c != EOF && c != '&';\n\t\t c = getccl(stream, length), i++) {\n\t\tswitch (c) {\n\t\tcase '+':\n\t\t    fe->val[i] = ' ';\n\t\t    break;\n\t\tcase '%':\n\t\t    c1 = getccl(stream, length);\n\t\t    c2 = getccl(stream, length);\n\t\t    fe->val[i] = dd2c(c1, c2);\n\t\t    break;\n\t\tdefault:\n\t\t    fe->val[i] = c;\n\t\t}\n\t\tif (i + 1 >= asize) {\t/* try to double the buffer */\n\t\t    fe->val = realloc(fe->val, (asize *= 2));\n\t\t    if (fe->val == NULL)\n\t\t\treturn NULL;\n\t\t}\n\t    }\n\t    fe->val[i] = '\\0';\n\t    if (c == '&') {\n\t\tfe->next = get_fes_from_stream(length, stream);\n\t    }\n\t    else\n\t\tfe->next = NULL;\n\t}\n    return fe;\n}\n\nunsigned char dd2c(char d1, char d2)\n{\n    register unsigned char digit;\n\n    digit = (d1 >= 'A' ? ((d1 & 0xdf) - 'A') + 10 : (d1 - '0'));\n    digit *= 16;\n    digit += (d2 >= 'A' ? ((d2 & 0xdf) - 'A') + 10 : (d2 - '0'));\n    return (digit);\n}\n\n\nvoid dump_cgi_info(cgi_info *ci)\n{\n    printf(\"CONTENT_LENGTH:    %d\\n\", ci->content_length);\n    if (ci->content_type != NULL)\n\tprintf(\"<BR>CONTENT_TYPE:      %s\\n\", ci->content_type);\n    if (ci->server_name != NULL)\n\tprintf(\"<BR>SERVER_NAME:       %s\\n\", ci->server_name);\n    if (ci->server_software != NULL)\n\tprintf(\"<BR>SERVER_SOFTWARE:   %s\\n\", ci->server_software);\n    if (ci->gateway_interface != NULL)\n\tprintf(\"<BR>GATEWAY_INTERFACE: %s\\n\", ci->gateway_interface);\n    if (ci->server_protocol != NULL)\n\tprintf(\"<BR>SERVER_PROTOCOL:   %s\\n\", ci->server_protocol);\n    if (ci->server_port != NULL)\n\tprintf(\"<BR>SERVER_PORT:       %s\\n\", ci->server_port);\n    if (ci->request_method != NULL)\n\tprintf(\"<BR>REQUEST_METHOD:    %s\\n\", ci->request_method);\n    if (ci->http_accept != NULL)\n\tprintf(\"<BR>HTTP_ACCEPT:       %s\\n\", ci->http_accept);\n    if (ci->path_info != NULL)\n\tprintf(\"<BR>PATH_INFO:         %s\\n\", ci->path_info);\n    if (ci->path_translated != NULL)\n\tprintf(\"<BR>PATH_TRANSLATED:   %s\\n\", ci->path_translated);\n    if (ci->script_name != NULL)\n\tprintf(\"<BR>SCRIPT_NAME:       %s\\n\", ci->script_name);\n    if (ci->query_string != NULL)\n\tprintf(\"<BR>QUERY_STRING:      %s\\n\", ci->query_string);\n    if (ci->remote_host != NULL)\n\tprintf(\"<BR>REMOTE_HOST:       %s\\n\", ci->remote_host);\n    if (ci->remote_addr != NULL)\n\tprintf(\"<BR>REMOTE_ADDR:       %s\\n\", ci->remote_addr);\n    if (ci->auth_type != NULL)\n\tprintf(\"<BR>AUTH_TYPE:         %s\\n\", ci->auth_type);\n    if (ci->remote_user != NULL)\n\tprintf(\"<BR>REMOTE_USER:       %s\\n\", ci->remote_user);\n    if (ci->remote_ident != NULL)\n\tprintf(\"<BR>REMOTE_IDENT:      %s\\n\", ci->remote_ident);\n    return;\n}\n"
  },
  {
    "path": "libcgi/form_tags.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nvoid print_sel_list(char *tname, char **opts, char *init)\n{\n    printf(\"<select name=\\\"%s\\\">\\n\", tname);\n    while (*opts) {\n\tprintf(\"<option%s>%s\\n\", init &&\n\t       !strcasecmp(*opts, init) ? \" selected\" : \"\", *opts);\n\topts++;\n    }\n    fputs(\"</select>\", stdout);\n}\n\nvoid print_input_blank(char *tname, unsigned int size,\n\t\t       unsigned int maxlength, char *init)\n{\n    printf(\"<input name=\\\"%s\\\"\", tname);\n    if (size)\n\tprintf(\" size=%d\", size);\n    if (maxlength)\n\tprintf(\" maxlength=%d\", maxlength);\n    if (init && *init)\n\tprintf(\" value=\\\"%s\\\"\", init);\n    fputs(\">\", stdout);\n}\n\nvoid print_submit(char *label)\n{\n    printf(\"<input type=submit\");\n    if (label && *label)\n\tprintf(\" value=\\\"%s\\\"\", label);\n    fputs(\">\", stdout);\n}\n"
  },
  {
    "path": "libcgi/get_cgi_info.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nint get_cgi_info(cgi_info *ci)\n{\n    char *s;\n\n    ci->content_length = (s = getenv(\"CONTENT_LENGTH\")) ? atoi(s) : 0;\n    ci->content_type = getenv(\"CONTENT_TYPE\");\n    ci->server_software = getenv(\"SERVER_SOFTWARE\");\n    ci->gateway_interface = getenv(\"GATEWAY_INTERFACE\");\n    ci->server_protocol = getenv(\"SERVER_PROTOCOL\");\n    ci->server_port = getenv(\"SERVER_PORT\");\n    ci->request_method = getenv(\"REQUEST_METHOD\");\n    ci->http_accept = getenv(\"HTTP_ACCEPT\");\n    ci->path_info = getenv(\"PATH_INFO\");\n    ci->path_translated = getenv(\"PATH_TRANSLATED\");\n    ci->script_name = getenv(\"SCRIPT_NAME\");\n    ci->query_string = getenv(\"QUERY_STRING\");\n    ci->remote_host = getenv(\"REMOTE_HOST\");\n    ci->remote_addr = getenv(\"REMOTE_ADDR\");\n    ci->remote_user = getenv(\"REMOTE_USER\");\n    ci->auth_type = getenv(\"AUTH_TYPE\");\n    ci->remote_user = getenv(\"REMOTE_USER\");\n    ci->remote_ident = getenv(\"REMOTE_IDENT\");\n    return (ci->server_name = getenv(\"SERVER_NAME\")) != NULL;\n}\n"
  },
  {
    "path": "libcgi/html.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nvoid print_doc_begin(char *title)\n{\n    printf(\"<head><title>%s</title></head>\\n\", title);\n    printf(\"<h1>%s</h1>\\n<img src=\\\"http://www.hypermail.org/images/stripe.bottom.gif alt=\\\"\\\"><br>\",\n\t title);\n}\n\nvoid print_doc_end(char *text)\n{\n    char *w;\n\n    puts(\"<p><hr>\");\n    if (text && *text)\n\tputs(text);\n    else if ((w = getenv(\"WEBMASTER\")))\n\tprintf(\"<address>%s</address>\\n\", w);\n}\n\nvoid print_logo(void)\n{\n    printf(\"<a href=\\\"http://www.hypermail.org/\\\"><img src=\\\"http://www.hypermail.org/images/hypermail-small.gif alt=\\\"HYPERMAIL\\\" align=bottom></a>\");\n}\n"
  },
  {
    "path": "libcgi/libcgi.html",
    "content": "<HTML>\n<HEAD>\n<TITLE>Hypermail's CGI Library</TITLE>\n</HEAD>\n<BODY>\n<H1 ALIGN=CENTER><A HREF=\"http://www.hypermail.org/\"><IMG SRC=\"http://www.hypermail.org/images/hypermail/hypermail-small.gif\" WIDTH=\"188\" HEIGHT=\"59\" BORDER=0 ALT=\"Hypermail.ORG\" ALIGN=MIDDLE></A><BR>CGI Library</H1>\n<P>\nThese functions help you write virtual document (CGI) programs using C.\nLook at the <A HREF=\"template.c\">template.c</A> file for an illustrative\nexample.  Feel free to download \n<A HREF=\"http://ftp.hypermail.org/hypermail/\">the latest\ndistributions</A> from ftp.hypermail.org.\n<P>\n\n<UL>\n<LI><A HREF=\"#main\">main()</A>\n<LI><A HREF=\"#cgi_main\">cgi_main(cgi_info *ci)</A>\n<LI><A HREF=\"#getcgiinfo\">int get_cgi_info(cgi_info *)</A>\n<LI><A HREF=\"#getformentries\">form_entry *get_form_entries(cgi_info *)</A>\n<LI><A HREF=\"#freeformentries\">void free_form_entries(cgi_info *)</A>\n<LI><A HREF=\"#parmval\">char *parmval(form_entry *, char *)</A>\n<LI><A HREF=\"#synmimeheader\">int syn_mimeheader(char *, char *)</A>\n<LI><A HREF=\"#printmimeheader\">int print_mimeheader(char *)</A>\n<LI><A HREF=\"#synbaseurl\">int syn_base_url(char *, cgi_info *)</A>\n<LI><A HREF=\"#printbaseurl\">int print_base_url(cgi_info *)</A>\n<LI><A HREF=\"#mcode\">int mcode(cgi_info *)</A>\n<LI><A HREF=\"#printsellist\">void print_sel_list(char *tname, char **opts, char *init)</A>\n<LI><A HREF=\"#printinputblank\">void print_input_blank(char *tname, unsigned size, char *init)</A>\n<LI><A HREF=\"#printsubmit\">void print_submit(char *label)</A>\n<LI><A HREF=\"#trim\">char *trim(char *s)</A>\n<LI><A HREF=\"#sanitize\">char *sanitize(char *to, char *from)</A>\n<LI><A HREF=\"#strmaxcpy\">char *strmaxcpy(char *s1, char *s2, int n)</A>\n</UL>\n\n<HR NOSHADE>\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A NAME=\"main\" HREF=\"main.c\">main()</A>\n<A NAME=\"cgimain\" HREF=\"template.c\">cgi_main(cgi_info *ci)</A>\n</PRE>\n\n<H3>Description</H3>\nlibcgi contains a simple stub of a main program, which merely\ncalls <CODE>cgi_main()</CODE> with a struct filled with all the CGI\nvars.  Thus cgi_main is actually the entry point for\nyour CGI-processing code.  It is this way to be upwardly-compatible\nwith a scheme for virtual document \"daemons\" that we're hatching.\n\n<HR NOSHADE>\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"get_cgi_info.c\" NAME=\"getcgiinfo\">int get_cgi_info(cgi_info *)</A>\n</PRE>\n<H3>Description</H3>\nThis routine paws through the environment and fills up the struct\nprovided, which must already be allocated.\n<P>\nThis function is called by <CODE>main</CODE>, and the result passed to\n<CODE>cgi_main</CODE>.\n\n<H3>Returns</H3>\n0 if there is a problem.\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"form_ent.c\" NAME=\"getformentries\">form_entry *get_form_entries(cgi_info *)</A>\n<A HREF=\"form_ent.c\" NAME=\"freeformentries\">void free_form_entries(cgi_info *)</A>\n<A HREF=\"form_ent.c\" NAME=\"parmval\">char *parmval(form_entry *, char *)</A>\n</PRE>\n<H3>Description</H3>\nget_form_entries parses any form inputs information into a linked-list\nof name/value pairs, returning the head pointer of that list. It does\nall plus-to-space and hex code translations.\n<P>\nfree_form_entries reclaims all the memory from the provided linked-list.\n<P>\nparmval return the value corresponding to the name in the second\nargument (a caseless string compar) by a linear search through the list\nin the first argument.\n\n<H3>Returns</H3>\nget_form_enties returns the head pointer, or NULL if there is a problem\nor no form input information was available.\n \nparmval returns the corresponding value string or NULL if there is a\nproblem or no matching name.\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"form_ent.c\" NAME=\"synmimeheader\">int syn_mimeheader(char *, char *)</A>\n<A HREF=\"form_ent.c\" NAME=\"printmimeheader\">int print_mimeheader(char *)</A>\n</PRE>\n<H3>Description</H3>\nsyn_mimeheader creates a MIME header based on the MIME type in\nthe second string and writes it into the first string buffer\n(including trailing double-newline).\n<P>\nprint_mimeheader creates the same MIME header based on the MIME\ntype in its sole argument, and prints it to stdout\n\n<H3>Returns</H3>\nboth return 0 if there is a problem\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"syn_url.c\" NAME=\"synbaseurl\">int syn_base_url(char *, cgi_info *)</A>\n<A HREF=\"syn_url.c\" NAME=\"printbaseurl\">int print_base_url(cgi_info *)</A>\n</PRE>\n<H3>Description</H3>\nsyn_base_url reconstructs the virtual document's URL given the\ncgi_info, minus any query string, and fills the provided char\nbuffer.\n<P>\nprint_base_url does the same but prints to stdout instead\n\n<H3>Returns</H3>\nboth return 0 if there is a problem\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=cgi.h>libcgi/cgi.h</A>\"\n<A HREF=\"mcode.c\" NAME=\"mcode\">int mcode(cgi_info *)</A>\n</PRE>\n<H3>Description</H3>\nThis function examines the request_method in the cgi information\nand returns an integer code.  These codes are defined in cgi.h.\n\n<H3>Returns</H3>\n0 if it doesn't recognize the method name, otherwise the code as\ndefined in cgi.h\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"form_tags.c\" NAME=\"printsellist\">void print_sel_list(char *tname, char **opts, char *init)</A>\n</PRE>\n<H3>Description</H3>\nPrints an HTML+ selection list construct to stdout.  The name of\nthe SELECT tag is given by tname, and the NULL-terminated string\narray opts is turned into separate OPTION tags with values\ncorresponding to entries in opts.  If any of these entries\nare a caseless match with init, then that OPTION tag is the\ndefault selection.\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"form_tags.c\" NAME=\"printinputblank\">void print_input_blank(char *tname, unsigned size, char *init)</A>\n</PRE>\n<H3>Description</H3>\nPrints an HTML+ INPUT tag (of type text) to stdout.  The tag's\nname is tname, its size is size, and initial value is init.\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"form_tags.c\" NAME=printsubmit>void print_submit(char *label)</A>\n</PRE>\n<H3>Description</H3>\nPrints an HTML+ INPUT tag of type submit to stdout.  The submit\nbutton will be labelled by label if non-NULL.\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"strops.c\" NAME=\"trim\">char *trim(char *s)</A>\n</PRE>\n<H3>Description</H3>\nChanges the string from blank-padded to NULL-padded\n\n<H3>Returns</H3>\nits argument\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"strops.c\" NAME=\"sanitize\">char *sanitize(char *to, char *from)</A>\n</PRE>\n<H3>Description</H3>\nPrepares the string for inclusion in a URL.  That is, the from\nstring is copied to the to buffer except that blanks are turned\ninto '+' characters and non-alphanumerics are turned into\n3-character sequences of a '%' followed by two hex digits\ncorresponding to the ascii code.\n\n<H3>Returns</H3>\nthe to string\n\n<HR NOSHADE>\n\n<H2>Synopsis</H2>\n<PRE>\n#include \"<A HREF=\"cgi.h\">libcgi/cgi.h</A>\"\n<A HREF=\"strops.c\" NAME=strmaxcpy>char *strmaxcpy(char *s1, char *s2, int n)</A>\n</PRE>\n\n<H3>Description</H3>\ncopies at most n-1 characters from s2 into s1, and then\nnull-terminates.  Handy for truncating while copying.\n\n<H3>Returns</H3>\ns1 as long as n &gt; 0, NULL otherwise\n\n<P>\n<HR NOSHADE>\n<address>hypermail@hypermail.org</address>\n\n</BODY>\n</HTML>\n"
  },
  {
    "path": "libcgi/main.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nvoid cgi_main(cgi_info *ci);\n\nint main(void)\n{\n    cgi_info ci;\n\n    get_cgi_info(&ci);\n    cgi_main(&ci);\n    return (0);\n}\n"
  },
  {
    "path": "libcgi/mcode.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nint mcode(cgi_info *ci)\n{\n    if (ci->request_method == NULL)\n\treturn 0;\n    else if (!strncasecmp(ci->request_method, \"GET\", 3))\n\treturn MCODE_GET;\n    else if (!strncasecmp(ci->request_method, \"POST\", 4))\n\treturn MCODE_POST;\n    else if (!strncasecmp(ci->request_method, \"PUT\", 3))\n\treturn MCODE_PUT;\n    else if (!strncasecmp(ci->request_method, \"HEAD\", 4))\n\treturn MCODE_HEAD;\n    else\n\treturn 0;\n}\n"
  },
  {
    "path": "libcgi/strops.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n** This file is part of the LIBCGI library\n**\n*/\n\n#include \"cgi.h\"\n\nchar *trim(char *s)\n{\n    char *t = s;\n\n    while (*t)\n\tt++;\n    while (t > s && *--t == ' ')\n\t*t = 0;\n    return s;\n}\n\n#if 0\nchar *sanitize(char *buf, char *s)\n{\n    char *t;\n\n    for (t = buf; *s; s++)\n\tif (*s == ' ')\n\t    *t++ = '+';\n\telse if (isalnum(*s))\n\t    *t++ = *s;\n\telse {\n\t    sprintf(t, \"%%%2X\", *s);\n\t    t += 3;\n\t}\n    *t = '\\0';\n    return buf;\n}\n#endif\n\nchar *strmaxcpy(char *dest, char *src, int n)\n{\n    char *d = dest;\n\n    if (n < 1)\n\treturn NULL;\n    while (--n && *src)\n\t*d++ = *src++;\n    *d = 0;\n    return dest;\n}\n"
  },
  {
    "path": "libcgi/syn_mime.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\n#if 0\nint syn_mimeheader(char *buf, char *ct)\n{\n    int x;\n\n    if (buf && ct) {\n\tx = (int)sprintf(buf, \"Content-Type: %s\\n\\n\", ct);\n\treturn (x && x != EOF);\n    }\n    else\n\treturn 0;\n}\n#endif\n\nint print_mimeheader(const char *ct)\n{\n    return (ct && (printf(\"Content-Type: %s\\n\\n\", ct) != EOF));\n}\n"
  },
  {
    "path": "libcgi/syn_url.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\n#if 0\nint syn_base_url(char *buf, cgi_info *ci)\n{\n    int x;\n\n    if (ci && buf) {\n\tx =\n\t    (int)sprintf(buf, \"http://%s:%s%s\", ci->server_name,\n\t\t\t ci->server_port, ci->script_name);\n\treturn (x && x != EOF);\n    }\n    else\n\treturn 0;\n}\n#endif\n\nint print_base_url(cgi_info *ci)\n{\n    return (ci &&\n\t    (printf(\"http://%s:%s%s\", ci->server_name, ci->server_port,\n\t\t    ci->script_name) != EOF));\n}\n"
  },
  {
    "path": "libcgi/template.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n * This file is part of the LIBCGI library\n *\n */\n\n#include \"cgi.h\"\n\nvoid cgi_main(cgi_info *ci)\n{\n    char *parmval();\n    form_entry *parms, *p;\n    form_entry *get_form_entries();\n    char *foo, *bar;\n\n    print_mimeheader(\"text/html\");\n\n    puts(\"<title>Your Title Here</title>\");\n    puts(\"<h1>Your heading here</h1>\");\n\n    parms = get_form_entries(ci);\n    if (parms) {\n\t/* extract specific form parameters */\n\tfor (p = parms; p; p = p->next) {\n\t    if (strcasecmp(p->name, \"foo\"))\n\t\tfoo = p->val;\n\t    else if (strcasecmp(p->name, \"bar\"))\n\t\tbar = p->val;\n\t}\n    }\n\n    switch (mcode(ci)) {\n\n    case MCODE_HEAD:\n\treturn;\n\n    case MCODE_GET:\n\tputs(\"Your GET response here\");\n\tprintf(\"based on foo=%s and bar=%s.\\n\", foo, bar);\n\tbreak;\n\n    case MCODE_POST:\n\tputs(\"Your POST response here\");\n\tprintf(\"based on foo=%s and bar=%s.\\n\", foo, bar);\n\tbreak;\n\n    default:\n\tprintf(\"Unrecognized method '%s'.\\n\", ci->request_method);\n    }\n\n    free_form_entries(parms);\n}\n"
  },
  {
    "path": "ltmain.sh",
    "content": "# ltmain.sh - Provide generalized library-building support services.\n# NOTE: Changing this file will not affect anything until you rerun configure.\n#\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001\n# Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Check that we have a working $echo.\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $echo works!\n  :\nelse\n  # Restart under the correct shell, and then maybe $echo will work.\n  exec $SHELL \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit 0\nfi\n\n# The name of this program.\nprogname=`$echo \"$0\" | sed 's%^.*/%%'`\nmodename=\"$progname\"\n\n# Constants.\nPROGRAM=ltmain.sh\nPACKAGE=libtool\nVERSION=1.4.2a\nTIMESTAMP=\" (1.922.2.79 2001/11/28 21:50:31)\"\n\ndefault_mode=\nhelp=\"Try \\`$progname --help' for more information.\"\nmagic=\"%%%MAGIC variable%%%\"\nmkdir=\"mkdir\"\nmv=\"mv -f\"\nrm=\"rm -f\"\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e 1s/^X//'\nsed_quote_subst='s/\\([\\\\`\\\\\"$\\\\\\\\]\\)/\\\\\\1/g'\nSP2NL='tr \\040 \\012'\nNL2SP='tr \\015\\012 \\040\\040'\n\n# NLS nuisances.\n# Only set LANG and LC_ALL to C if already set.\n# These must not be set unconditionally because not all systems understand\n# e.g. LANG=C (notably SCO).\n# We save the old values to restore during execute mode.\nif test \"${LC_ALL+set}\" = set; then\n  save_LC_ALL=\"$LC_ALL\"; LC_ALL=C; export LC_ALL\nfi\nif test \"${LANG+set}\" = set; then\n  save_LANG=\"$LANG\"; LANG=C; export LANG\nfi\n\n# Make sure IFS has a sensible default\n: ${IFS=\" \t\"}\n\nif test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n  echo \"$modename: not configured to build any kind of library\" 1>&2\n  echo \"Fatal configuration error.  See the $PACKAGE docs for more information.\" 1>&2\n  exit 1\nfi\n\n# Global variables.\nmode=$default_mode\nnonopt=\nprev=\nprevopt=\nrun=\nshow=\"$echo\"\nshow_help=\nexecute_dlfiles=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\n\n# Parse our command line options once, thoroughly.\nwhile test $# -gt 0\ndo\n  arg=\"$1\"\n  shift\n\n  case $arg in\n  -*=*) optarg=`$echo \"X$arg\" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) optarg= ;;\n  esac\n\n  # If the previous option needs an argument, assign it.\n  if test -n \"$prev\"; then\n    case $prev in\n    execute_dlfiles)\n      execute_dlfiles=\"$execute_dlfiles $arg\"\n      ;;\n    *)\n      eval \"$prev=\\$arg\"\n      ;;\n    esac\n\n    prev=\n    prevopt=\n    continue\n  fi\n\n  # Have we seen a non-optional argument yet?\n  case $arg in\n  --help)\n    show_help=yes\n    ;;\n\n  --version)\n    echo \"$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP\"\n    exit 0\n    ;;\n\n  --config)\n    sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0\n    exit 0\n    ;;\n\n  --debug)\n    echo \"$progname: enabling shell trace mode\"\n    set -x\n    ;;\n\n  --dry-run | -n)\n    run=:\n    ;;\n\n  --features)\n    echo \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n    exit 0\n    ;;\n\n  --finish) mode=\"finish\" ;;\n\n  --mode) prevopt=\"--mode\" prev=mode ;;\n  --mode=*) mode=\"$optarg\" ;;\n\n  --preserve-dup-deps) duplicate_deps=\"yes\" ;;\n\n  --quiet | --silent)\n    show=:\n    ;;\n\n  -dlopen)\n    prevopt=\"-dlopen\"\n    prev=execute_dlfiles\n    ;;\n\n  -*)\n    $echo \"$modename: unrecognized option \\`$arg'\" 1>&2\n    $echo \"$help\" 1>&2\n    exit 1\n    ;;\n\n  *)\n    nonopt=\"$arg\"\n    break\n    ;;\n  esac\ndone\n\nif test -n \"$prevopt\"; then\n  $echo \"$modename: option \\`$prevopt' requires an argument\" 1>&2\n  $echo \"$help\" 1>&2\n  exit 1\nfi\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\nif test -z \"$show_help\"; then\n\n  # Infer the operation mode.\n  if test -z \"$mode\"; then\n    case $nonopt in\n    *cc | *++ | gcc* | *-gcc*)\n      mode=link\n      for arg\n      do\n\tcase $arg in\n\t-c)\n\t   mode=compile\n\t   break\n\t   ;;\n\tesac\n      done\n      ;;\n    *db | *dbx | *strace | *truss)\n      mode=execute\n      ;;\n    *install*|cp|mv)\n      mode=install\n      ;;\n    *rm)\n      mode=uninstall\n      ;;\n    *)\n      # If we have no mode, but dlfiles were specified, then do execute mode.\n      test -n \"$execute_dlfiles\" && mode=execute\n\n      # Just use the default operation mode.\n      if test -z \"$mode\"; then\n\tif test -n \"$nonopt\"; then\n\t  $echo \"$modename: warning: cannot infer operation mode from \\`$nonopt'\" 1>&2\n\telse\n\t  $echo \"$modename: warning: cannot infer operation mode without MODE-ARGS\" 1>&2\n\tfi\n      fi\n      ;;\n    esac\n  fi\n\n  # Only execute mode is allowed to have -dlopen flags.\n  if test -n \"$execute_dlfiles\" && test \"$mode\" != execute; then\n    $echo \"$modename: unrecognized option \\`-dlopen'\" 1>&2\n    $echo \"$help\" 1>&2\n    exit 1\n  fi\n\n  # Change the help message to a mode-specific one.\n  generic_help=\"$help\"\n  help=\"Try \\`$modename --help --mode=$mode' for more information.\"\n\n  # These modes are in order of execution frequency so that they run quickly.\n  case $mode in\n  # libtool compile mode\n  compile)\n    modename=\"$modename: compile\"\n    # Get the compilation command and the source file.\n    base_compile=\n    prev=\n    lastarg=\n    srcfile=\"$nonopt\"\n    suppress_output=\n\n    user_target=no\n    for arg\n    do\n      case $prev in\n      \"\") ;;\n      xcompiler)\n\t# Aesthetically quote the previous argument.\n\tprev=\n\tlastarg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\n\tcase $arg in\n\t# Double-quote args containing other shell metacharacters.\n\t# Many Bourne shells cannot handle close brackets correctly\n\t# in scan sets, so we specify it separately.\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\n\t# Add the previous argument to base_compile.\n\tif test -z \"$base_compile\"; then\n\t  base_compile=\"$lastarg\"\n\telse\n\t  base_compile=\"$base_compile $lastarg\"\n\tfi\n\tcontinue\n\t;;\n      esac\n\n      # Accept any command-line options.\n      case $arg in\n      -o)\n\tif test \"$user_target\" != \"no\"; then\n\t  $echo \"$modename: you cannot specify \\`-o' more than once\" 1>&2\n\t  exit 1\n\tfi\n\tuser_target=next\n\t;;\n\n      -static)\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Wc,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"s/^-Wc,//\"`\n\tlastarg=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor arg in $args; do\n\t  IFS=\"$save_ifs\"\n\n\t  # Double-quote args containing other shell metacharacters.\n\t  # Many Bourne shells cannot handle close brackets correctly\n\t  # in scan sets, so we specify it separately.\n\t  case $arg in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    arg=\"\\\"$arg\\\"\"\n\t    ;;\n\t  esac\n\t  lastarg=\"$lastarg $arg\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tlastarg=`$echo \"X$lastarg\" | $Xsed -e \"s/^ //\"`\n\n\t# Add the arguments to base_compile.\n\tif test -z \"$base_compile\"; then\n\t  base_compile=\"$lastarg\"\n\telse\n\t  base_compile=\"$base_compile $lastarg\"\n\tfi\n\tcontinue\n\t;;\n      esac\n\n      case $user_target in\n      next)\n\t# The next one is the -o target name\n\tuser_target=yes\n\tcontinue\n\t;;\n      yes)\n\t# We got the output file\n\tuser_target=set\n\tlibobj=\"$arg\"\n\tcontinue\n\t;;\n      esac\n\n      # Accept the current argument as the source file.\n      lastarg=\"$srcfile\"\n      srcfile=\"$arg\"\n\n      # Aesthetically quote the previous argument.\n\n      # Backslashify any backslashes, double quotes, and dollar signs.\n      # These are the only characters that are still specially\n      # interpreted inside of double-quoted scrings.\n      lastarg=`$echo \"X$lastarg\" | $Xsed -e \"$sed_quote_subst\"`\n\n      # Double-quote args containing other shell metacharacters.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      case $lastarg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\tlastarg=\"\\\"$lastarg\\\"\"\n\t;;\n      esac\n\n      # Add the previous argument to base_compile.\n      if test -z \"$base_compile\"; then\n\tbase_compile=\"$lastarg\"\n      else\n\tbase_compile=\"$base_compile $lastarg\"\n      fi\n    done\n\n    case $user_target in\n    set)\n      ;;\n    no)\n      # Get the name of the library object.\n      libobj=`$echo \"X$srcfile\" | $Xsed -e 's%^.*/%%'`\n      ;;\n    *)\n      $echo \"$modename: you must specify a target with \\`-o'\" 1>&2\n      exit 1\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    xform='[cCFSfmso]'\n    case $libobj in\n    *.ada) xform=ada ;;\n    *.adb) xform=adb ;;\n    *.ads) xform=ads ;;\n    *.asm) xform=asm ;;\n    *.c++) xform=c++ ;;\n    *.cc) xform=cc ;;\n    *.cpp) xform=cpp ;;\n    *.cxx) xform=cxx ;;\n    *.f90) xform=f90 ;;\n    *.for) xform=for ;;\n    esac\n\n    libobj=`$echo \"X$libobj\" | $Xsed -e \"s/\\.$xform$/.lo/\"`\n\n    case $libobj in\n    *.lo) obj=`$echo \"X$libobj\" | $Xsed -e \"$lo2o\"` ;;\n    *)\n      $echo \"$modename: cannot determine name of library object from \\`$libobj'\" 1>&2\n      exit 1\n      ;;\n    esac\n\n    if test -z \"$base_compile\"; then\n      $echo \"$modename: you must specify a compilation command\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $libobj\"\n    else\n      removelist=\"$libobj\"\n    fi\n\n    $run $rm $removelist\n    trap \"$run $rm $removelist; exit 1\" 1 2 15\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2*)\n      pic_mode=default\n      ;;\n    esac\n    if test $pic_mode = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$echo \"X$srcfile\" | $Xsed -e 's%^.*/%%' -e 's%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n      removelist=\"$removelist $output_obj $lockfile\"\n      trap \"$run $rm $removelist; exit 1\" 1 2 15\n    else\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $run ln \"$0\" \"$lockfile\" 2>/dev/null; do\n\t$show \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\techo \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n      echo $srcfile > \"$lockfile\"\n    fi\n\n    if test -n \"$fix_srcfile_path\"; then\n      eval srcfile=\\\"$fix_srcfile_path\\\"\n    fi\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\t# All platforms use -DPIC, to notify preprocessed assembler code.\n\tcommand=\"$base_compile $srcfile $pic_flag -DPIC\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $srcfile\"\n      fi\n      if test \"$build_old_libs\" = yes; then\n\tlo_libobj=\"$libobj\"\n\tdir=`$echo \"X$libobj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$dir\" = \"X$libobj\"; then\n\t  dir=\"$objdir\"\n\telse\n\t  dir=\"$dir/$objdir\"\n\tfi\n\tlibobj=\"$dir/\"`$echo \"X$libobj\" | $Xsed -e 's%^.*/%%'`\n\n\tif test -d \"$dir\"; then\n\t  $show \"$rm $libobj\"\n\t  $run $rm $libobj\n\telse\n\t  $show \"$mkdir $dir\"\n\t  $run $mkdir $dir\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d $dir; then\n\t    exit $status\n\t  fi\n\tfi\n      fi\n      if test \"$compiler_o_lo\" = yes; then\n\toutput_obj=\"$libobj\"\n\tcommand=\"$command -o $output_obj\"\n      elif test \"$compiler_c_o\" = yes; then\n\toutput_obj=\"$obj\"\n\tcommand=\"$command -o $output_obj\"\n      fi\n\n      $run $rm \"$output_obj\"\n      $show \"$command\"\n      if $run eval \"$command\"; then :\n      else\n\ttest -n \"$output_obj\" && $run $rm $removelist\n\texit 1\n      fi\n\n      if test \"$need_locks\" = warn &&\n\t test x\"`cat $lockfile 2>/dev/null`\" != x\"$srcfile\"; then\n\techo \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test x\"$output_obj\" != x\"$libobj\"; then\n\t$show \"$mv $output_obj $libobj\"\n\tif $run $mv $output_obj $libobj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # If we have no pic_flag, then copy the object into place and finish.\n      if (test -z \"$pic_flag\" || test \"$pic_mode\" != default) &&\n\t test \"$build_old_libs\" = yes; then\n\t# Rename the .lo from within objdir to obj\n\tif test -f $obj; then\n\t  $show $rm $obj\n\t  $run $rm $obj\n\tfi\n\n\t$show \"$mv $libobj $obj\"\n\tif $run $mv $libobj $obj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n\n\txdir=`$echo \"X$obj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$xdir\" = \"X$obj\"; then\n\t  xdir=\".\"\n\telse\n\t  xdir=\"$xdir\"\n\tfi\n\tbaseobj=`$echo \"X$obj\" | $Xsed -e \"s%.*/%%\"`\n\tlibobj=`$echo \"X$baseobj\" | $Xsed -e \"$o2lo\"`\n\t# Now arrange that obj and lo_libobj become the same file\n\t$show \"(cd $xdir && $LN_S $baseobj $libobj)\"\n\tif $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then\n\t  # Unlock the critical section if it was locked\n\t  if test \"$need_locks\" != no; then\n\t    $run $rm \"$lockfile\"\n\t  fi\n\t  exit 0\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # Allow error messages only from the first compilation.\n      suppress_output=' >/dev/null 2>&1'\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $srcfile\"\n      else\n\t# All platforms use -DPIC, to notify preprocessed assembler code.\n\tcommand=\"$base_compile $srcfile $pic_flag -DPIC\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tcommand=\"$command -o $obj\"\n\toutput_obj=\"$obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      command=\"$command$suppress_output\"\n      $run $rm \"$output_obj\"\n      $show \"$command\"\n      if $run eval \"$command\"; then :\n      else\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      if test \"$need_locks\" = warn &&\n\t test x\"`cat $lockfile 2>/dev/null`\" != x\"$srcfile\"; then\n\techo \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      # Just move the object if needed\n      if test x\"$output_obj\" != x\"$obj\"; then\n\t$show \"$mv $output_obj $obj\"\n\tif $run $mv $output_obj $obj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # Create an invalid libtool object if no PIC, so that we do not\n      # accidentally link it into a program.\n      if test \"$build_libtool_libs\" != yes; then\n\t$show \"echo timestamp > $libobj\"\n\t$run eval \"echo timestamp > \\$libobj\" || exit $?\n      else\n\t# Move the .lo from within objdir\n\t$show \"$mv $libobj $lo_libobj\"\n\tif $run $mv $libobj $lo_libobj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n    fi\n\n    # Unlock the critical section if it was locked\n    if test \"$need_locks\" != no; then\n      $run $rm \"$lockfile\"\n    fi\n\n    exit 0\n    ;;\n\n  # libtool link mode\n  link | relink)\n    modename=\"$modename: link\"\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invokation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=\"$nonopt\"\n    compile_command=\"$nonopt\"\n    finalize_command=\"$nonopt\"\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n\n    avoid_version=no\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -all-static | -static)\n\tif test \"X$arg\" = \"X-all-static\"; then\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    $echo \"$modename: warning: complete static linking is impossible in this configuration\" 1>&2\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\telse\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\tfi\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tprefer_static_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test $# -gt 0; do\n      arg=\"$1\"\n      shift\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\tqarg=\\\"`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\\\" ### testsuite: skip nested quoting test\n\t;;\n      *) qarg=$arg ;;\n      esac\n      libtool_args=\"$libtool_args $qarg\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  compile_command=\"$compile_command @OUTPUT@\"\n\t  finalize_command=\"$finalize_command @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    compile_command=\"$compile_command @SYMFILE@\"\n\t    finalize_command=\"$finalize_command @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      dlfiles=\"$dlfiles $arg\"\n\t    else\n\t      dlprefiles=\"$dlprefiles $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  if test ! -f \"$arg\"; then\n\t    $echo \"$modename: symbol file \\`$arg' does not exist\"\n\t    exit 1\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    $echo \"$modename: only absolute run-paths are allowed\" 1>&2\n\t    exit 1\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) rpath=\"$rpath $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) xrpath=\"$xrpath $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\txcompiler)\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  compile_command=\"$compile_command $qarg\"\n\t  finalize_command=\"$finalize_command $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $wl$qarg\"\n\t  prev=\n\t  compile_command=\"$compile_command $wl$qarg\"\n\t  finalize_command=\"$finalize_command $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n $prev\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  compile_command=\"$compile_command $link_static_flag\"\n\t  finalize_command=\"$finalize_command $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\t$echo \"$modename: \\`-allow-undefined' is deprecated because it is the default\" 1>&2\n\tcontinue\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  $echo \"$modename: more than one -exported-symbols argument is not allowed\"\n\t  exit 1\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | no/*-*-nonstopux*)\n\t  compile_command=\"$compile_command $arg\"\n\t  finalize_command=\"$finalize_command $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tdir=`$echo \"X$arg\" | $Xsed -e 's/^-L//'`\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  if test -z \"$absdir\"; then\n\t    $echo \"$modename: cannot determine absolute directory name of \\`$dir'\" 1>&2\n\t    exit 1\n\t  fi\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"*) ;;\n\t*)\n\t  deplibs=\"$deplibs -L$dir\"\n\t  lib_search_path=\"$lib_search_path $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  *) dllsearchpath=\"$dllsearchpath:$dir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-pw32* | *-*-beos*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-mingw* | *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\t elif test \"X$arg\" = \"X-lc_r\"; then\n\t  case $host in\n\t *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc_r directly, use -pthread flag.\n\t    continue\n\t    ;;\n\t  esac\n\tfi\n\tdeplibs=\"$deplibs $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # in order for the loader to find any dlls it needs.\n\t  $echo \"$modename: warning: \\`-no-install' is ignored for $host\" 1>&2\n\t  $echo \"$modename: warning: assuming \\`-no-fast-install' instead\" 1>&2\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tdir=`$echo \"X$arg\" | $Xsed -e 's/^-R//'`\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  $echo \"$modename: only absolute run-paths are allowed\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) xrpath=\"$xrpath $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -static)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -Wc,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\" -e 's/^-Wc,//'`\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n\t  case $flag in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    flag=\"\\\"$flag\\\"\"\n\t    ;;\n\t  esac\n\t  arg=\"$arg $wl$flag\"\n\t  compiler_flags=\"$compiler_flags $flag\"\n\tdone\n\tIFS=\"$save_ifs\"\n\targ=`$echo \"X$arg\" | $Xsed -e \"s/^ //\"`\n\t;;\n\n      -Wl,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\" -e 's/^-Wl,//'`\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n\t  case $flag in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    flag=\"\\\"$flag\\\"\"\n\t    ;;\n\t  esac\n\t  arg=\"$arg $wl$flag\"\n\t  compiler_flags=\"$compiler_flags $wl$flag\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tdone\n\tIFS=\"$save_ifs\"\n\targ=`$echo \"X$arg\" | $Xsed -e \"s/^ //\"`\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      # Some other compiler flag.\n      -* | +*)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\targ=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\tcase $arg in\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\t;;\n\n      *.lo | *.$objext)\n\t# A library or standard object.\n\tif test \"$prev\" = dlfiles; then\n\t  # This file was specified with -dlopen.\n\t  if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t    dlfiles=\"$dlfiles $arg\"\n\t    prev=\n\t    continue\n\t  else\n\t    # If libtool objects are unsupported, then we need to preload.\n\t    prev=dlprefiles\n\t  fi\n\tfi\n\n\tif test \"$prev\" = dlprefiles; then\n\t  # Preload the old-style object.\n\t  dlprefiles=\"$dlprefiles \"`$echo \"X$arg\" | $Xsed -e \"$lo2o\"`\n\t  prev=\n\telse\n\t  case $arg in\n\t  *.lo) libobjs=\"$libobjs $arg\" ;;\n\t  *) objs=\"$objs $arg\" ;;\n\t  esac\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tdeplibs=\"$deplibs $arg\"\n\told_deplibs=\"$old_deplibs $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  dlfiles=\"$dlfiles $arg\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  dlprefiles=\"$dlprefiles $arg\"\n\t  prev=\n\telse\n\t  deplibs=\"$deplibs $arg\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\targ=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\tcase $arg in\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tcompile_command=\"$compile_command $arg\"\n\tfinalize_command=\"$finalize_command $arg\"\n      fi\n    done # argument parsing loop\n\n    if test -n \"$prev\"; then\n      $echo \"$modename: the \\`$prevarg' option requires an argument\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      compile_command=\"$compile_command $arg\"\n      finalize_command=\"$finalize_command $arg\"\n    fi\n\n    # calculate the name of the file, without its directory\n    outputname=`$echo \"X$output\" | $Xsed -e 's%^.*/%%'`\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$echo \\\"X\\${$shlibpath_var}\\\" \\| \\$Xsed -e \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    output_objdir=`$echo \"X$output\" | $Xsed -e 's%/[^/]*$%%'`\n    if test \"X$output_objdir\" = \"X$output\"; then\n      output_objdir=\"$objdir\"\n    else\n      output_objdir=\"$output_objdir/$objdir\"\n    fi\n    # Create the object directory.\n    if test ! -d $output_objdir; then\n      $show \"$mkdir $output_objdir\"\n      $run $mkdir $output_objdir\n      status=$?\n      if test $status -ne 0 && test ! -d $output_objdir; then\n\texit $status\n      fi\n    fi\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      $echo \"$modename: you must specify an output file\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\tesac\n      fi\n      libs=\"$libs $deplib\"\n    done\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n    case $linkmode in\n    lib)\n\tpasses=\"conv link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    $echo \"$modename: libraries can \\`-dlopen' only libtool libraries: $file\" 1>&2\n\t    exit 1\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n    for pass in $passes; do\n      if test $linkmode = prog; then\n\t# Determine which files to process\n\tcase $pass in\n\tdlopen)\n\t  libs=\"$dlfiles\"\n\t  save_deplibs=\"$deplibs\" # Collect dlpreopened libraries\n\t  deplibs=\n\t  ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink) libs=\"$deplibs %DEPLIBS% $dependency_libs\" ;;\n\tesac\n      fi\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-l*)\n\t  if test $linkmode = oldlib && test $linkmode = obj; then\n\t    $echo \"$modename: warning: \\`-l' is ignored for archives/objects: $deplib\" 1>&2\n\t    continue\n\t  fi\n\t  if test $pass = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  name=`$echo \"X$deplib\" | $Xsed -e 's/^-l//'`\n\t  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t    # Search the libtool library\n\t    lib=\"$searchdir/lib${name}.la\"\n\t    if test -f \"$lib\"; then\n\t      found=yes\n\t      break\n\t    fi\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test $linkmode = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  fi\n\t  ;; # -l\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test $pass = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`\n\t    ;;\n\t  prog)\n\t    if test $pass = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test $pass = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    ;;\n\t  *)\n\t    $echo \"$modename: warning: \\`-L' is ignored for archives/objects: $deplib\" 1>&2\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test $pass = link; then\n\t    dir=`$echo \"X$deplib\" | $Xsed -e 's/^-R//'`\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) xrpath=\"$xrpath $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la) lib=\"$deplib\" ;;\n\t*.$libext)\n\t  if test $pass = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    if test \"$deplibs_check_method\" != pass_all; then\n\t      echo\n\t      echo \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t      echo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t      echo \"*** that it is just a static archive that I should not used here.\"\n\t    else\n\t      echo\n\t      echo \"*** Warning: Linking the shared library $output against the\"\n\t      echo \"*** static library $deplib is not portable!\"\n\t      deplibs=\"$deplib $deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test $pass != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test $pass = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlopen support or we're linking statically,\n\t    # we need to preload.\n\t    newdlprefiles=\"$newdlprefiles $deplib\"\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $deplib\"\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\tif test $found = yes || test -f \"$lib\"; then :\n\telse\n\t  $echo \"$modename: cannot find the library \\`$lib'\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $lib | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t  exit 1\n\tfi\n\n\tladir=`$echo \"X$lib\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$ladir\" = \"X$lib\" && ladir=\".\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variable installed.\n\tinstalled=yes\n\n\t# Read the .la file\n\tcase $lib in\n\t*/* | *\\\\*) . $lib ;;\n\t*) . ./$lib ;;\n\tesac\n\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test $linkmode = oldlib && test $linkmode = obj; }; then\n\t   # Add dl[pre]opened files of deplib\n\t  test -n \"$dlopen\" && dlfiles=\"$dlfiles $dlopen\"\n\t  test -n \"$dlpreopen\" && dlprefiles=\"$dlprefiles $dlpreopen\"\n\tfi\n\n\tif test $pass = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      $echo \"$modename: cannot find name of link library for \\`$lib'\" 1>&2\n\t      exit 1\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    convenience=\"$convenience $ladir/$objdir/$old_library\"\n\t    old_convenience=\"$old_convenience $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n              if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t        case \"$tmp_libs \" in\n\t        *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t        esac\n              fi\n\t      tmp_libs=\"$tmp_libs $deplib\"\n\t    done\n\t  elif test $linkmode != prog && test $linkmode != lib; then\n\t    $echo \"$modename: \\`$lib' is not a convenience library\" 1>&2\n\t    exit 1\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tfor l in $old_library $library_names; do\n\t  linklib=\"$l\"\n\tdone\n\tif test -z \"$linklib\"; then\n\t  $echo \"$modename: cannot find name of link library for \\`$lib'\" 1>&2\n\t  exit 1\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test $pass = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    $echo \"$modename: cannot -dlopen a convenience library: \\`$lib'\" 1>&2\n\t    exit 1\n\t  fi\n\t  if test -z \"$dlname\" || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.\n\t    dlprefiles=\"$dlprefiles $lib\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    $echo \"$modename: warning: cannot determine absolute directory name of \\`$ladir'\" 1>&2\n\t    $echo \"$modename: passing it literally to the linker, although it might fail\" 1>&2\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tlaname=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    $echo \"$modename: warning: library \\`$lib' was moved.\" 1>&2\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$libdir\"\n\t    absdir=\"$libdir\"\n\t  fi\n\telse\n\t  dir=\"$ladir/$objdir\"\n\t  absdir=\"$abs_ladir/$objdir\"\n\t  # Remove this search path later\n\t  notinst_path=\"$notinst_path $abs_ladir\"\n\tfi # $installed = yes\n\tname=`$echo \"X$laname\" | $Xsed -e 's/\\.la$//' -e 's/^lib//'`\n\n\t# This library was specified with -dlpreopen.\n\tif test $pass = dlpreopen; then\n\t  if test -z \"$libdir\"; then\n\t    $echo \"$modename: cannot -dlpreopen a convenience library: \\`$lib'\" 1>&2\n\t    exit 1\n\t  fi\n\t  # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t  # are required to link).\n\t  if test -n \"$old_library\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$old_library\"\n\t  # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t  elif test -n \"$dlname\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$dlname\"\n\t  else\n\t    newdlprefiles=\"$newdlprefiles $dir/$linklib\"\n\t  fi\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test $linkmode = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\"\n\t  fi\n\t  continue\n\tfi\n\n\tif test $linkmode = prog && test $pass != link; then\n\t  newlib_search_path=\"$newlib_search_path $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test $linkalldeplibs = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tif test -n \"$library_names\" &&\n\t   { test \"$prefer_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  # Link against this shared library\n\n\t  if test \"$linkmode,$pass\" = \"prog,link\" ||\n\t   { test $linkmode = lib && test $hardcode_into_libs = yes; }; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    if test $linkmode = prog; then\n\t      # We need to hardcode the library path\n\t      if test -n \"$shlibpath_var\"; then\n\t\t# Make sure the rpath contains only unique directories.\n\t\tcase \"$temp_rpath \" in\n\t\t*\" $dir \"*) ;;\n\t\t*\" $absdir \"*) ;;\n\t\t*) temp_rpath=\"$temp_rpath $dir\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\n\t  if test \"$installed\" = no; then\n\t    notinst_deplibs=\"$notinst_deplibs $lib\"\n\t    need_relink=yes\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    realname=\"$2\"\n\t    shift; shift\n\t    libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin*)\n\t\tmajor=`expr $current - $age`\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    soname=`echo $soroot | sed -e 's/^.*\\///'`\n\t    newlib=\"libimp-`echo $soname | sed 's/^lib//;s/\\.dll$//'`.a\"\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      $show \"extracting exported symbol list from \\`$soname'\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      eval cmds=\\\"$extract_expsyms_cmds\\\"\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\" || exit $?\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      $show \"generating import library for \\`$soname'\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      eval cmds=\\\"$old_archive_from_expsyms_cmds\\\"\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\" || exit $?\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n $old_archive_from_expsyms_cmds\n\n\t  if test $linkmode = prog || test \"$mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      $echo \"$modename: configuration error: unsupported hardcode properties\"\n\t      exit 1\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) compile_shlibpath=\"$compile_shlibpath$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test $linkmode = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes && \\\n\t\t test \"$hardcode_minus_L\" != yes && \\\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test $linkmode = prog || test \"$mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test $linkmode = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test $linkmode = prog; then\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\n\t  # Try to link the static library\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    echo \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    convenience=\"$convenience $dir/$old_library\"\n\t    old_convenience=\"$old_convenience $dir/$old_library\"\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test $linkmode = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test $hardcode_into_libs != yes || test $build_old_libs = yes ||\n\t       test $link_static = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) temp_xrpath=`$echo \"X$libdir\" | $Xsed -e 's/^-R//'`\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) xrpath=\"$xrpath $temp_xrpath\";;\n\t\t   esac;;\n\t      *) temp_deplibs=\"$temp_deplibs $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  newlib_search_path=\"$newlib_search_path $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done\n\n\t  if test $link_all_deplibs != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t\tdir=`$echo \"X$deplib\" | $Xsed -e 's%/[^/]*$%%'`\n\t\ttest \"X$dir\" = \"X$deplib\" && dir=\".\"\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    $echo \"$modename: warning: cannot determine absolute directory name of \\`$dir'\" 1>&2\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif grep \"^installed=no\" $deplib > /dev/null; then\n\t\t  path=\"-L$absdir/$objdir\"\n\t\telse\n\t\t  eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -z \"$libdir\"; then\n\t\t    $echo \"$modename: \\`$deplib' is not a valid libtool archive\" 1>&2\n\t\t    exit 1\n\t\t  fi\n\t\t  if test \"$absdir\" != \"$libdir\"; then\n\t\t    $echo \"$modename: warning: \\`$deplib' seems to be moved\" 1>&2\n\t\t  fi\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      *) continue ;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$deplibs $path\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test $pass = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test $pass != dlopen; then\n\ttest $pass != scan && dependency_libs=\"$newdependency_libs\"\n\tif test $pass != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) lib_search_path=\"$lib_search_path $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    *)\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      if test \"$pass\" = \"conv\" &&\n       { test \"$linkmode\" = \"lib\" || test \"$linkmode\" = \"prog\"; }; then\n\tlibs=\"$deplibs\" # reset libs\n\tdeplibs=\n      fi\n    done # for pass\n    if test $linkmode = prog; then\n      dlfiles=\"$newdlfiles\"\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$rpath\"; then\n\t$echo \"$modename: warning: \\`-rpath' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$xrpath\"; then\n\t$echo \"$modename: warning: \\`-R' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t$echo \"$modename: warning: \\`-export-symbols' is ignored for archives\" 1>&2\n      fi\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      objs=\"$objs$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tname=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//' -e 's/^lib//'`\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\tif test \"$module\" = no; then\n\t  $echo \"$modename: libtool library \\`$output' must begin with \\`lib'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  name=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//'`\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  libname=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//'`\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  $echo \"$modename: cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\" 2>&1\n\t  exit 1\n\telse\n\t  echo\n\t  echo \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  echo \"*** objects $objs is not portable!\"\n\t  libobjs=\"$libobjs $objs\"\n\tfi\n      fi\n\n      if test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen self' is ignored for libtool libraries\" 1>&2\n      fi\n\n      set dummy $rpath\n      if test $# -gt 2; then\n\t$echo \"$modename: warning: ignoring multiple \\`-rpath's for a libtool library\" 1>&2\n      fi\n      install_libdir=\"$2\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  libext=al\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\tif test -n \"$vinfo\"; then\n\t  $echo \"$modename: warning: \\`-version-info' is ignored for convenience libraries\" 1>&2\n\tfi\n\n\tif test -n \"$release\"; then\n\t  $echo \"$modename: warning: \\`-release' is ignored for convenience libraries\" 1>&2\n\tfi\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tIFS=\"$save_ifs\"\n\n\tif test -n \"$8\"; then\n\t  $echo \"$modename: too many parameters to \\`-version-info'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\tcurrent=\"$2\"\n\trevision=\"$3\"\n\tage=\"$4\"\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: CURRENT \\`$current' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: REVISION \\`$revision' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: AGE \\`$age' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tif test $age -gt $current; then\n\t  $echo \"$modename: AGE \\`$age' is greater than the current interface number \\`$current'\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  major=.`expr $current - $age`\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  minor_current=`expr $current + 1`\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\";\n\t  ;;\n\n\tirix | nonstopux)\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  major=`expr $current - $age + 1`\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test $loop != 0; do\n\t    iface=`expr $revision - $loop`\n\t    loop=`expr $loop - 1`\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux)\n\t  major=.`expr $current - $age`\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  major=`expr $current - $age`\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test $loop != 0; do\n\t    iface=`expr $current - $loop`\n\t    loop=`expr $loop - 1`\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  verstring=\"$verstring:${current}.0\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  major=`expr $current - $age`\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  $echo \"$modename: unknown library version type \\`$version_type'\" 1>&2\n\t  echo \"Fatal configuration error.  See the $PACKAGE docs for more information.\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  verstring=\"0.0\"\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\"\"\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    $echo \"$modename: warning: undefined symbols not allowed in $host shared libraries\" 1>&2\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n      fi\n\n      if test \"$mode\" != relink; then\n\t# Remove our outputs.\n\t$show \"${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*\"\n\t$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\toldlibs=\"$oldlibs $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$echo \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e \"$lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      for path in $notinst_path; do\n\tlib_search_path=`echo \"$lib_search_path \" | sed -e 's% $path % %g'`\n\tdeplibs=`echo \"$deplibs \" | sed -e 's% -L$path % %g'`\n\tdependency_libs=`echo \"$dependency_libs \" | sed -e 's% -L$path % %g'`\n      done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  temp_xrpath=\"$temp_xrpath -R$libdir\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n\tif test $hardcode_into_libs != yes || test $build_old_libs = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlfiles=\"$dlfiles $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlprefiles=\"$dlprefiles $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    deplibs=\"$deplibs -framework System\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test $build_libtool_need_lc = \"yes\"; then\n\t      deplibs=\"$deplibs -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behaviour.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $rm conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $rm conftest\n\t  $CC -o conftest conftest.c $deplibs\n\t  if test $? -eq 0 ; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      name=\"`expr $i : '-l\\(.*\\)'`\"\n\t      # If $name is empty we are operating on a -L argument.\n\t      if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t\tlibname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t\tdeplib_matches=`eval \\\\$echo \\\"$library_names_spec\\\"`\n\t\tset dummy $deplib_matches\n\t\tdeplib_match=$2\n\t\tif test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t  newdeplibs=\"$newdeplibs $i\"\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  echo \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t  echo \"*** I have the capability to make that library automatically link in when\"\n\t\t  echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t  echo \"*** shared version of the library, which I believe you do not have\"\n\t\t  echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t  echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\tfi\n\t      else\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t      fi\n\t    done\n\t  else\n\t    # Error occured in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      name=\"`expr $i : '-l\\(.*\\)'`\"\n\t     # If $name is empty we are operating on a -L argument.\n\t      if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t\t$rm conftest\n\t\t$CC -o conftest conftest.c $i\n\t\t# Did it work?\n\t\tif test $? -eq 0 ; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t\t  deplib_matches=`eval \\\\$echo \\\"$library_names_spec\\\"`\n\t\t  set dummy $deplib_matches\n\t\t  deplib_match=$2\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    echo \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which you do not appear to have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t    echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  echo \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"***  make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t      else\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t      fi\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$2 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    name=\"`expr $a_deplib : '-l\\(.*\\)'`\"\n\t    # If $name is empty we are operating on a -L argument.\n\t    if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t      libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t    potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t    for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null \\\n\t\t\t | grep \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | sed 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$echo \"X$potlib\" | $Xsed -e 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null \\\n\t\t\t | sed 10q \\\n\t\t\t | egrep \"$file_magic_regex\" > /dev/null; then\n\t\t\tnewdeplibs=\"$newdeplibs $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t    done\n\t      done\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\techo \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  echo \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  echo \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  echo \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t    else\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t    fi\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$2 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    name=\"`expr $a_deplib : '-l\\(.*\\)'`\"\n\t    # If $name is empty we are operating on a -L argument.\n\t    if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t      libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\tpotential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\tfor potent_lib in $potential_libs; do\n\t\t  potlib=\"$potent_lib\" # see symlink-check below in file_magic test\n\t\t  if eval echo \\\"$potent_lib\\\" 2>/dev/null \\\n\t\t      | sed 10q \\\n\t\t      | egrep \"$match_pattern_regex\" > /dev/null; then\n\t\t    newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t    a_deplib=\"\"\n\t\t    break 2\n\t\t  fi\n\t\tdone\n\t      done\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\techo \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  echo \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  echo \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  echo \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t    else\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t    fi\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  if $echo \"X $deplibs\" | $Xsed -e 's/ -lc$//' \\\n\t       -e 's/ -[LR][^ ]*//g' -e 's/[ \t]//g' |\n\t     grep . >/dev/null; then\n\t    echo\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t  fi\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library is the System framework\n\t  newdeplibs=`$echo \"X $newdeplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    echo \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test $allow_undefined = no; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\tif test $hardcode_into_libs = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    hardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tdep_rpath=\"$dep_rpath $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    eval dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      rpath=\"$rpath$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\trealname=\"$2\"\n\tshift; shift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\ttest -z \"$dlname\" && dlname=$soname\n\n\tlib=\"$output_objdir/$realname\"\n\tfor link\n\tdo\n\t  linknames=\"$linknames $link\"\n\tdone\n\n\t# Ensure that we have .o objects for linkers which dislike .lo\n\t# (e.g. aix) in case we are running --disable-static\n\tfor obj in $libobjs; do\n\t  xdir=`$echo \"X$obj\" | $Xsed -e 's%/[^/]*$%%'`\n\t  if test \"X$xdir\" = \"X$obj\"; then\n\t    xdir=\".\"\n\t  else\n\t    xdir=\"$xdir\"\n\t  fi\n\t  baseobj=`$echo \"X$obj\" | $Xsed -e 's%^.*/%%'`\n\t  oldobj=`$echo \"X$baseobj\" | $Xsed -e \"$lo2o\"`\n\t  if test ! -f $xdir/$oldobj; then\n\t    $show \"(cd $xdir && ${LN_S} $baseobj $oldobj)\"\n\t    $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?\n\t  fi\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$echo \"X$libobjs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    $show \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $run $rm $export_symbols\n\t    eval cmds=\\\"$export_symbols_cmds\\\"\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $show \"$cmd\"\n\t      $run eval \"$cmd\" || exit $?\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\"; then\n\t      $show \"egrep -e \\\"$export_symbols_regex\\\" \\\"$export_symbols\\\" > \\\"${export_symbols}T\\\"\"\n\t      $run eval 'egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      $show \"$mv \\\"${export_symbols}T\\\" \\\"$export_symbols\\\"\"\n\t      $run eval '$mv \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $run eval '$echo \"X$include_expsyms\" | $SP2NL >> \"$export_symbols\"'\n\tfi\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    $show \"${rm}r $gentop\"\n\t    $run ${rm}r \"$gentop\"\n\t    $show \"mkdir $gentop\"\n\t    $run mkdir \"$gentop\"\n\t    status=$?\n\t    if test $status -ne 0 && test ! -d \"$gentop\"; then\n\t      exit $status\n\t    fi\n\t    generated=\"$generated $gentop\"\n\n\t    for xlib in $convenience; do\n\t      # Extract the objects.\n\t      case $xlib in\n\t      [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t      *) xabs=`pwd`\"/$xlib\" ;;\n\t      esac\n\t      xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t      xdir=\"$gentop/$xlib\"\n\n\t      $show \"${rm}r $xdir\"\n\t      $run ${rm}r \"$xdir\"\n\t      $show \"mkdir $xdir\"\n\t      $run mkdir \"$xdir\"\n\t      status=$?\n\t      if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t\texit $status\n\t      fi\n\t      $show \"(cd $xdir && $AR x $xabs)\"\n\t      $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t      libobjs=\"$libobjs \"`find $xdir -name \\*.o -print -o -name \\*.lo -print | $NL2SP`\n\t    done\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$mode\" = relink; then\n\t  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t  eval cmds=\\\"$archive_expsym_cmds\\\"\n\telse\n\t  eval cmds=\\\"$archive_cmds\\\"\n\tfi\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  $show \"$cmd\"\n\t  $run eval \"$cmd\" || exit $?\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$mode\" = relink; then\n\t  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv \"$realname\"U $realname)' || exit $?\n\t  exit 0\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    $show \"(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$deplibs\"; then\n\t$echo \"$modename: warning: \\`-l' and \\`-L' are ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$rpath\"; then\n\t$echo \"$modename: warning: \\`-rpath' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$xrpath\"; then\n\t$echo \"$modename: warning: \\`-R' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for objects\" 1>&2\n      fi\n\n      case $output in\n      *.lo)\n\tif test -n \"$objs$old_deplibs\"; then\n\t  $echo \"$modename: cannot build library object \\`$output' from non-libtool objects\" 1>&2\n\t  exit 1\n\tfi\n\tlibobj=\"$output\"\n\tobj=`$echo \"X$output\" | $Xsed -e \"$lo2o\"`\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $run $rm $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval reload_conv_objs=\\\"\\$reload_objs $whole_archive_flag_spec\\\"\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r \"$gentop\"\n\t  $show \"mkdir $gentop\"\n\t  $run mkdir \"$gentop\"\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d \"$gentop\"; then\n\t    exit $status\n\t  fi\n\t  generated=\"$generated $gentop\"\n\n\t  for xlib in $convenience; do\n\t    # Extract the objects.\n\t    case $xlib in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t    *) xabs=`pwd`\"/$xlib\" ;;\n\t    esac\n\t    xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t    xdir=\"$gentop/$xlib\"\n\n\t    $show \"${rm}r $xdir\"\n\t    $run ${rm}r \"$xdir\"\n\t    $show \"mkdir $xdir\"\n\t    $run mkdir \"$xdir\"\n\t    status=$?\n\t    if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t      exit $status\n\t    fi\n\t    $show \"(cd $xdir && $AR x $xabs)\"\n\t    $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t    reload_conv_objs=\"$reload_objs \"`find $xdir -name \\*.o -print -o -name \\*.lo -print | $NL2SP`\n\t  done\n\tfi\n      fi\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$echo \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}$'/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      eval cmds=\\\"$reload_cmds\\\"\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r $gentop\n\tfi\n\n\texit 0\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r $gentop\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t$show \"echo timestamp > $libobj\"\n\t$run eval \"echo timestamp > $libobj\" || exit $?\n\texit 0\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\teval cmds=\\\"$reload_cmds\\\"\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  $show \"$cmd\"\n\t  $run eval \"$cmd\" || exit $?\n\tdone\n\tIFS=\"$save_ifs\"\n      else\n\t# Just create a symlink.\n\t$show $rm $libobj\n\t$run $rm $libobj\n\txdir=`$echo \"X$libobj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$xdir\" = \"X$libobj\"; then\n\t  xdir=\".\"\n\telse\n\t  xdir=\"$xdir\"\n\tfi\n\tbaseobj=`$echo \"X$libobj\" | $Xsed -e 's%^.*/%%'`\n\toldobj=`$echo \"X$baseobj\" | $Xsed -e \"$lo2o\"`\n\t$show \"(cd $xdir && $LN_S $oldobj $baseobj)\"\n\t$run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?\n      fi\n\n      if test -n \"$gentop\"; then\n\t$show \"${rm}r $gentop\"\n\t$run ${rm}r $gentop\n      fi\n\n      exit 0\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;\n      esac\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for programs\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for programs\" 1>&2\n      fi\n\n      if test \"$preload\" = yes; then\n\tif test \"$dlopen_support\" = unknown && test \"$dlopen_self\" = unknown &&\n\t   test \"$dlopen_self_static\" = unknown; then\n\t  $echo \"$modename: warning: \\`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support.\"\n\tfi\n      fi\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$echo \"X $compile_deplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\tfinalize_deplibs=`$echo \"X $finalize_deplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\t;;\n      esac\n\n      compile_command=\"$compile_command $compile_deplibs\"\n      finalize_command=\"$finalize_command $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  *) dllsearchpath=\"$dllsearchpath:$libdir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_perm_rpath=\"$finalize_perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$echo \"X$compile_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$echo \"X$finalize_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n      fi\n\n      dlsyms=\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tif test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\t  dlsyms=\"${outputname}S.c\"\n\telse\n\t  $echo \"$modename: not configured to extract global symbols from dlpreopened files\" 1>&2\n\tfi\n      fi\n\n      if test -n \"$dlsyms\"; then\n\tcase $dlsyms in\n\t\"\") ;;\n\t*.c)\n\t  # Discover the nlist of each of the dlfiles.\n\t  nlist=\"$output_objdir/${outputname}.nm\"\n\n\t  $show \"$rm $nlist ${nlist}S ${nlist}T\"\n\t  $run $rm \"$nlist\" \"${nlist}S\" \"${nlist}T\"\n\n\t  # Parse the name list into a source file.\n\t  $show \"creating $output_objdir/$dlsyms\"\n\n\t  test -z \"$run\" && $echo > \"$output_objdir/$dlsyms\" \"\\\n/* $dlsyms - symbol resolution table for \\`$outputname' dlsym emulation. */\n/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n/* Prevent the only kind of declaration conflicts we can make. */\n#define lt_preloaded_symbols some_other_symbol\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\t  if test \"$dlself\" = yes; then\n\t    $show \"generating symbol list for \\`$output'\"\n\n\t    test -z \"$run\" && $echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t    # Add our own program objects to the symbol list.\n\t    progfiles=`$echo \"X$objs$old_deplibs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\t    for arg in $progfiles; do\n\t      $show \"extracting global C symbols from \\`$arg'\"\n\t      $run eval \"$NM $arg | $global_symbol_pipe >> '$nlist'\"\n\t    done\n\n\t    if test -n \"$exclude_expsyms\"; then\n\t      $run eval 'egrep -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      $run eval '$mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\n\t    if test -n \"$export_symbols_regex\"; then\n\t      $run eval 'egrep -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      $run eval '$mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\n\t    # Prepare the list of exported symbols\n\t    if test -z \"$export_symbols\"; then\n\t      export_symbols=\"$output_objdir/$output.exp\"\n\t      $run $rm $export_symbols\n\t      $run eval \"sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t    else\n\t      $run eval \"sed -e 's/\\([][.*^$]\\)/\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$output.exp\"'\n\t      $run eval 'grep -f \"$output_objdir/$output.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      $run eval 'mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\t  fi\n\n\t  for arg in $dlprefiles; do\n\t    $show \"extracting global C symbols from \\`$arg'\"\n\t    name=`echo \"$arg\" | sed -e 's%^.*/%%'`\n\t    $run eval 'echo \": $name \" >> \"$nlist\"'\n\t    $run eval \"$NM $arg | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -z \"$run\"; then\n\t    # Make sure we have at least an empty file.\n\t    test -f \"$nlist\" || : > \"$nlist\"\n\n\t    if test -n \"$exclude_expsyms\"; then\n\t      egrep -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t      $mv \"$nlist\"T \"$nlist\"\n\t    fi\n\n\t    # Try sorting and uniquifying the output.\n\t    if grep -v \"^: \" < \"$nlist\" | sort +2 | uniq > \"$nlist\"S; then\n\t      :\n\t    else\n\t      grep -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t    fi\n\n\t    if test -f \"$nlist\"S; then\n\t      eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$dlsyms\"'\n\t    else\n\t      echo '/* NONE */' >> \"$output_objdir/$dlsyms\"\n\t    fi\n\n\t    $echo >> \"$output_objdir/$dlsyms\" \"\\\n\n#undef lt_preloaded_symbols\n\n#if defined (__STDC__) && __STDC__\n# define lt_ptr void *\n#else\n# define lt_ptr char *\n# define const\n#endif\n\n/* The mapping between symbol names and symbols. */\nconst struct {\n  const char *name;\n  lt_ptr address;\n}\nlt_preloaded_symbols[] =\n{\\\n\"\n\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$dlsyms\"\n\n\t    $echo >> \"$output_objdir/$dlsyms\" \"\\\n  {0, (lt_ptr) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t  fi\n\n\t  pic_flag_for_symtable=\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    case \"$compile_command \" in\n\t    *\" -static \"*) ;;\n\t    *) pic_flag_for_symtable=\" $pic_flag -DPIC -DFREEBSD_WORKAROUND\";;\n\t    esac;;\n\t  *-*-hpux*)\n\t    case \"$compile_command \" in\n\t    *\" -static \"*) ;;\n\t    *) pic_flag_for_symtable=\" $pic_flag -DPIC\";;\n\t    esac\n\t  esac\n\n\t  # Now compile the dynamic symbol file.\n\t  $show \"(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \\\"$dlsyms\\\")\"\n\t  $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")' || exit $?\n\n\t  # Clean up the generated files.\n\t  $show \"$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T\"\n\t  $run $rm \"$output_objdir/$dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"\n\n\t  # Transform the symbol file into the correct name.\n\t  compile_command=`$echo \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%\"`\n\t  finalize_command=`$echo \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%\"`\n\t  ;;\n\t*)\n\t  $echo \"$modename: unknown suffix for \\`$dlsyms'\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n      else\n\t# We keep going just in case the user didn't refer to\n\t# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n\t# really was required.\n\n\t# Nullify the symbol file.\n\tcompile_command=`$echo \"X$compile_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n\tfinalize_command=`$echo \"X$finalize_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n      fi\n\n      if test $need_relink = no || test \"$build_libtool_libs\" != yes; then\n\t# Replace the output file specification.\n\tcompile_command=`$echo \"X$compile_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\t$show \"$link_command\"\n\t$run eval \"$link_command\"\n\tstatus=$?\n\n\t# Delete the generated files.\n\tif test -n \"$dlsyms\"; then\n\t  $show \"$rm $output_objdir/${outputname}S.${objext}\"\n\t  $run $rm \"$output_objdir/${outputname}S.${objext}\"\n\tfi\n\n\texit $status\n      fi\n\n      if test -n \"$shlibpath_var\"; then\n\t# We should set the shlibpath_var\n\trpath=\n\tfor dir in $temp_rpath; do\n\t  case $dir in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*)\n\t    # Absolute path.\n\t    rpath=\"$rpath$dir:\"\n\t    ;;\n\t  *)\n\t    # Relative path: add a thisdir entry.\n\t    rpath=\"$rpath\\$thisdir/$dir:\"\n\t    ;;\n\t  esac\n\tdone\n\ttemp_rpath=\"$rpath\"\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$echo \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$run $rm $output\n\t# Link the executable and exit\n\t$show \"$link_command\"\n\t$run eval \"$link_command\" || exit $?\n\texit 0\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\t$echo \"$modename: warning: this platform does not like uninstalled shared libraries\" 1>&2\n\t$echo \"$modename: \\`$output' will be relinked during installation\" 1>&2\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$echo \"X$compile_var$compile_command$compile_rpath\" | $Xsed -e 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$echo \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      $show \"$link_command\"\n      $run eval \"$link_command\" || exit $?\n\n      # Now create the wrapper script.\n      $show \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    var_value=`$echo \"X$var_value\" | $Xsed -e \"$sed_quote_subst\"`\n\t    relink_command=\"$var=\\\"$var_value\\\"; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$echo \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Quote $echo for shipping.\n      if test \"X$echo\" = \"X$SHELL $0 --fallback-echo\"; then\n\tcase $0 in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) qecho=\"$SHELL $0 --fallback-echo\";;\n\t*) qecho=\"$SHELL `pwd`/$0 --fallback-echo\";;\n\tesac\n\tqecho=`$echo \"X$qecho\" | $Xsed -e \"$sed_quote_subst\"`\n      else\n\tqecho=`$echo \"X$echo\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if our run command is non-null.\n      if test -z \"$run\"; then\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) output=`echo $output|sed 's,.exe$,,'` ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*) exeext=.exe ;;\n\t  *) exeext= ;;\n\tesac\n\t$rm $output\n\ttrap \"$rm $output; exit 1\" 1 2 15\n\n\t$echo > $output \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e 1s/^X//'\nsed_quote_subst='$sed_quote_subst'\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \\\"\\${CDPATH+set}\\\" = set; then CDPATH=:; export CDPATH; fi\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variable:\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$echo are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    echo=\\\"$qecho\\\"\n    file=\\\"\\$0\\\"\n    # Make sure echo works.\n    if test \\\"X\\$1\\\" = X--no-reexec; then\n      # Discard the --no-reexec flag, and continue.\n      shift\n    elif test \\\"X\\`(\\$echo '\\t') 2>/dev/null\\`\\\" = 'X\\t'; then\n      # Yippee, \\$echo works!\n      :\n    else\n      # Restart under the correct shell, and then maybe \\$echo will work.\n      exec $SHELL \\\"\\$0\\\" --no-reexec \\${1+\\\"\\$@\\\"}\n    fi\n  fi\\\n\"\n\t$echo >> $output \"\\\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | sed -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | sed -n 's/.*-> //p'\\`\n  done\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  echo >> $output \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" || \\\\\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | sed 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $mkdir \\\"\\$progdir\\\"\n    else\n      $rm \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  echo >> $output \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$echo \\\"\\$relink_command_output\\\" >&2\n\t$rm \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $mv \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $rm \\\"\\$progdir/\\$program\\\";\n      $mv \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $rm \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  echo >> $output \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\techo >> $output \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $echo >> $output \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$echo \\\"X\\$$shlibpath_var\\\" | \\$Xsed -e 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t# fixup the dll searchpath if we need to.\n\tif test -n \"$dllsearchpath\"; then\n\t  $echo >> $output \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t$echo >> $output \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n\"\n\tcase $host in\n\t# win32 systems need to use the prog path for dll\n\t# lookup to work\n\t*-*-cygwin* | *-*-pw32*)\n\t  $echo >> $output \"\\\n      exec \\$progdir/\\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t# Backslashes separate directories on plain windows\n\t*-*-mingw | *-*-os2*)\n\t  $echo >> $output \"\\\n      exec \\$progdir\\\\\\\\\\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t*)\n\t  $echo >> $output \"\\\n      # Export the path to the program.\n      PATH=\\\"\\$progdir:\\$PATH\\\"\n      export PATH\n\n      exec \\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\tesac\n\t$echo >> $output \"\\\n      \\$echo \\\"\\$0: cannot exec \\$program \\${1+\\\"\\$@\\\"}\\\"\n      exit 1\n    fi\n  else\n    # The program doesn't exist.\n    \\$echo \\\"\\$0: error: \\$progdir/\\$program does not exist\\\" 1>&2\n    \\$echo \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    echo \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n\tchmod +x $output\n      fi\n      exit 0\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$objs$old_deplibs \"`$echo \"X$libobjs_save\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\t$show \"${rm}r $gentop\"\n\t$run ${rm}r \"$gentop\"\n\t$show \"mkdir $gentop\"\n\t$run mkdir \"$gentop\"\n\tstatus=$?\n\tif test $status -ne 0 && test ! -d \"$gentop\"; then\n\t  exit $status\n\tfi\n\tgenerated=\"$generated $gentop\"\n\n\t# Add in members from convenience archives.\n\tfor xlib in $addlibs; do\n\t  # Extract the objects.\n\t  case $xlib in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t  *) xabs=`pwd`\"/$xlib\" ;;\n\t  esac\n\t  xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t  xdir=\"$gentop/$xlib\"\n\n\t  $show \"${rm}r $xdir\"\n\t  $run ${rm}r \"$xdir\"\n\t  $show \"mkdir $xdir\"\n\t  $run mkdir \"$xdir\"\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t    exit $status\n\t  fi\n\t  $show \"(cd $xdir && $AR x $xabs)\"\n\t  $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t  oldobjs=\"$oldobjs \"`find $xdir -name \\*.${objext} -print -o -name \\*.lo -print | $NL2SP`\n\tdone\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\teval cmds=\\\"$old_archive_from_new_cmds\\\"\n      else\n\t# Ensure that we have .o objects in place in case we decided\n\t# not to build a shared library, and have fallen back to building\n\t# static libs even though --disable-static was passed!\n\tfor oldobj in $oldobjs; do\n\t  if test ! -f $oldobj; then\n\t    xdir=`$echo \"X$oldobj\" | $Xsed -e 's%/[^/]*$%%'`\n\t    if test \"X$xdir\" = \"X$oldobj\"; then\n\t      xdir=\".\"\n\t    else\n\t      xdir=\"$xdir\"\n\t    fi\n\t    baseobj=`$echo \"X$oldobj\" | $Xsed -e 's%^.*/%%'`\n\t    obj=`$echo \"X$baseobj\" | $Xsed -e \"$o2lo\"`\n\t    $show \"(cd $xdir && ${LN_S} $obj $baseobj)\"\n\t    $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?\n\t  fi\n\tdone\n\n\teval cmds=\\\"$old_archive_cmds\\\"\n      fi\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n    done\n\n    if test -n \"$generated\"; then\n      $show \"${rm}r$generated\"\n      $run ${rm}r$generated\n    fi\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      $show \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  var_value=`$echo \"X$var_value\" | $Xsed -e \"$sed_quote_subst\"`\n\t  relink_command=\"$var=\\\"$var_value\\\"; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $0 --mode=relink $libtool_args)\"\n      relink_command=`$echo \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n\n      # Only create the output if not a dry run.\n      if test -z \"$run\"; then\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tname=`$echo \"X$deplib\" | $Xsed -e 's%^.*/%%'`\n\t\teval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\tif test -z \"$libdir\"; then\n\t\t  $echo \"$modename: \\`$deplib' is not a valid libtool archive\" 1>&2\n\t\t  exit 1\n\t\tfi\n\t\tnewdependency_libs=\"$newdependency_libs $libdir/$name\"\n\t\t;;\n\t      *) newdependency_libs=\"$newdependency_libs $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      name=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\t      eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t      if test -z \"$libdir\"; then\n\t\t$echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t\texit 1\n\t      fi\n\t      newdlfiles=\"$newdlfiles $libdir/$name\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      name=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\t      eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t      if test -z \"$libdir\"; then\n\t\t$echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t\texit 1\n\t      fi\n\t      newdlprefiles=\"$newdlprefiles $libdir/$name\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $rm $output\n\t  # place dlname in correct position for cygwin\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;\n\t  esac\n\t  $echo > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test $need_relink = yes; then\n\t    $echo >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      fi\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      $show \"(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)\"\n      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?\n      ;;\n    esac\n    exit 0\n    ;;\n\n  # libtool install mode\n  install)\n    modename=\"$modename: install\"\n\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       $echo \"X$nonopt\" | $Xsed | grep shtool > /dev/null; then\n      # Aesthetically quote it.\n      arg=`$echo \"X$nonopt\" | $Xsed -e \"$sed_quote_subst\"`\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n\targ=\"\\\"$arg\\\"\"\n\t;;\n      esac\n      install_prog=\"$arg \"\n      arg=\"$1\"\n      shift\n    else\n      install_prog=\n      arg=\"$nonopt\"\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    arg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n    case $arg in\n    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n      arg=\"\\\"$arg\\\"\"\n      ;;\n    esac\n    install_prog=\"$install_prog$arg\"\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    for arg\n    do\n      if test -n \"$dest\"; then\n\tfiles=\"$files $dest\"\n\tdest=\"$arg\"\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f) prev=\"-f\" ;;\n      -g) prev=\"-g\" ;;\n      -m) prev=\"-m\" ;;\n      -o) prev=\"-o\" ;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*) ;;\n\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  prev=\n\telse\n\t  dest=\"$arg\"\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      arg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n\targ=\"\\\"$arg\\\"\"\n\t;;\n      esac\n      install_prog=\"$install_prog $arg\"\n    done\n\n    if test -z \"$install_prog\"; then\n      $echo \"$modename: you must specify an install program\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test -n \"$prev\"; then\n      $echo \"$modename: the \\`$prev' option requires an argument\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\t$echo \"$modename: no file or destination specified\" 1>&2\n      else\n\t$echo \"$modename: you must specify a destination\" 1>&2\n      fi\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    # Strip any trailing slash from the destination.\n    dest=`$echo \"X$dest\" | $Xsed -e 's%/$%%'`\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      destdir=`$echo \"X$dest\" | $Xsed -e 's%/[^/]*$%%'`\n      test \"X$destdir\" = \"X$dest\" && destdir=.\n      destname=`$echo \"X$dest\" | $Xsed -e 's%^.*/%%'`\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files\n      if test $# -gt 2; then\n\t$echo \"$modename: \\`$dest' is not a directory\" 1>&2\n\t$echo \"$help\" 1>&2\n\texit 1\n      fi\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  $echo \"$modename: \\`$destdir' must be an absolute directory name\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tstaticlibs=\"$staticlibs $file\"\n\t;;\n\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$file' is not a valid libtool archive\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\t# If there is no directory component, then add one.\n\tcase $file in\n\t*/* | *\\\\*) . $file ;;\n\t*) . ./$file ;;\n\tesac\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) current_libdirs=\"$current_libdirs $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) future_libdirs=\"$future_libdirs $libdir\" ;;\n\t  esac\n\tfi\n\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`/\n\ttest \"X$dir\" = \"X$file/\" && dir=\n\tdir=\"$dir$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  $echo \"$modename: warning: relinking \\`$file'\" 1>&2\n\t  $show \"$relink_command\"\n\t  if $run eval \"$relink_command\"; then :\n\t  else\n\t    $echo \"$modename: error: relink \\`$file' with the above command before installing it\" 1>&2\n\t    continue\n\t  fi\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names\n\tif test -n \"$2\"; then\n\t  realname=\"$2\"\n\t  shift\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  $show \"$install_prog $dir/$srcname $destdir/$realname\"\n\t  $run eval \"$install_prog $dir/$srcname $destdir/$realname\" || exit $?\n\t  if test -n \"$stripme\" && test -n \"$striplib\"; then\n\t    $show \"$striplib $destdir/$realname\"\n\t    $run eval \"$striplib $destdir/$realname\" || exit $?\n\t  fi\n\n\t  if test $# -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    for linkname\n\t    do\n\t      if test \"$linkname\" != \"$realname\"; then\n\t\t$show \"(cd $destdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t\t$run eval \"(cd $destdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t      fi\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  eval cmds=\\\"$postinstall_cmds\\\"\n\t  save_ifs=\"$IFS\"; IFS='~'\n\t  for cmd in $cmds; do\n\t    IFS=\"$save_ifs\"\n\t    $show \"$cmd\"\n\t    $run eval \"$cmd\" || exit $?\n\t  done\n\t  IFS=\"$save_ifs\"\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tname=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\tinstname=\"$dir/$name\"i\n\t$show \"$install_prog $instname $destdir/$name\"\n\t$run eval \"$install_prog $instname $destdir/$name\" || exit $?\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && staticlibs=\"$staticlibs $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  destfile=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  staticdest=`$echo \"X$destfile\" | $Xsed -e \"$lo2o\"`\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  $echo \"$modename: cannot copy a libtool object to \\`$destfile'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\tif test -n \"$destfile\"; then\n\t  $show \"$install_prog $file $destfile\"\n\t  $run eval \"$install_prog $file $destfile\" || exit $?\n\tfi\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  staticobj=`$echo \"X$file\" | $Xsed -e \"$lo2o\"`\n\n\t  $show \"$install_prog $staticobj $staticdest\"\n\t  $run eval \"$install_prog \\$staticobj \\$staticdest\" || exit $?\n\tfi\n\texit 0\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  destfile=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin*|*mingw*)\n\t    wrapper=`echo $file | sed -e 's,.exe$,,'`\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif (sed -e '4q' $wrapper | egrep \"^# Generated by .*$PACKAGE\")>/dev/null 2>&1; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $wrapper ;;\n\t  *) . ./$wrapper ;;\n\t  esac\n\n\t  # Check the variables that should have been set.\n\t  if test -z \"$notinst_deplibs\"; then\n\t    $echo \"$modename: invalid libtool wrapper script \\`$wrapper'\" 1>&2\n\t    exit 1\n\t  fi\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      # If there is no directory component, then add one.\n\t      case $lib in\n\t      */* | *\\\\*) . $lib ;;\n\t      *) . ./$lib ;;\n\t      esac\n\t    fi\n\t    libfile=\"$libdir/\"`$echo \"X$lib\" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      $echo \"$modename: warning: \\`$lib' has not been installed in \\`$libdir'\" 1>&2\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $wrapper ;;\n\t  *) . ./$wrapper ;;\n\t  esac\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    if test \"$finalize\" = yes && test -z \"$run\"; then\n\t      tmpdir=\"/tmp\"\n\t      test -n \"$TMPDIR\" && tmpdir=\"$TMPDIR\"\n\t      tmpdir=\"$tmpdir/libtool-$$\"\n\t      if $mkdir -p \"$tmpdir\" && chmod 700 \"$tmpdir\"; then :\n\t      else\n\t\t$echo \"$modename: error: cannot create temporary directory \\`$tmpdir'\" 1>&2\n\t\tcontinue\n\t      fi\n\t      file=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t      outputname=\"$tmpdir/$file\"\n\t      # Replace the output file specification.\n\t      relink_command=`$echo \"X$relink_command\" | $Xsed -e 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t      $show \"$relink_command\"\n\t      if $run eval \"$relink_command\"; then :\n\t      else\n\t\t$echo \"$modename: error: relink \\`$file' with the above command before installing it\" 1>&2\n\t\t${rm}r \"$tmpdir\"\n\t\tcontinue\n\t      fi\n\t      file=\"$outputname\"\n\t    else\n\t      $echo \"$modename: warning: cannot relink \\`$file'\" 1>&2\n\t    fi\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$echo \"X$file\" | $Xsed -e \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyways\n\tcase $install_prog,$host in\n\t/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    destfile=`echo $destfile | sed -e 's,.exe$,,'`\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\t$show \"$install_prog$stripme $file $destfile\"\n\t$run eval \"$install_prog\\$stripme \\$file \\$destfile\" || exit $?\n\ttest -n \"$outputname\" && ${rm}r \"$tmpdir\"\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      name=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n\n      $show \"$install_prog $file $oldlib\"\n      $run eval \"$install_prog \\$file \\$oldlib\" || exit $?\n\n      if test -n \"$stripme\" && test -n \"$striplib\"; then\n\t$show \"$old_striplib $oldlib\"\n\t$run eval \"$old_striplib $oldlib\" || exit $?\n      fi\n\n      # Do each command in the postinstall commands.\n      eval cmds=\\\"$old_postinstall_cmds\\\"\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n    done\n\n    if test -n \"$future_libdirs\"; then\n      $echo \"$modename: warning: remember to run \\`$progname --finish$future_libdirs'\" 1>&2\n    fi\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      test -n \"$run\" && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $0 --finish$current_libdirs'\n    else\n      exit 0\n    fi\n    ;;\n\n  # libtool finish mode\n  finish)\n    modename=\"$modename: finish\"\n    libdirs=\"$nonopt\"\n    admincmds=\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for dir\n      do\n\tlibdirs=\"$libdirs $dir\"\n      done\n\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  eval cmds=\\\"$finish_cmds\\\"\n\t  save_ifs=\"$IFS\"; IFS='~'\n\t  for cmd in $cmds; do\n\t    IFS=\"$save_ifs\"\n\t    $show \"$cmd\"\n\t    $run eval \"$cmd\" || admincmds=\"$admincmds\n       $cmd\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $run eval \"$cmds\" || admincmds=\"$admincmds\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    test \"$show\" = \":\" && exit 0\n\n    echo \"----------------------------------------------------------------------\"\n    echo \"Libraries have been installed in:\"\n    for libdir in $libdirs; do\n      echo \"   $libdir\"\n    done\n    echo\n    echo \"If you ever happen to want to link against installed libraries\"\n    echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n    echo \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n    echo \"flag during linking and do at least one of the following:\"\n    if test -n \"$shlibpath_var\"; then\n      echo \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n      echo \"     during execution\"\n    fi\n    if test -n \"$runpath_var\"; then\n      echo \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n      echo \"     during linking\"\n    fi\n    if test -n \"$hardcode_libdir_flag_spec\"; then\n      libdir=LIBDIR\n      eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n      echo \"   - use the \\`$flag' linker flag\"\n    fi\n    if test -n \"$admincmds\"; then\n      echo \"   - have your system administrator run these commands:$admincmds\"\n    fi\n    if test -f /etc/ld.so.conf; then\n      echo \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n    fi\n    echo\n    echo \"See any operating system documentation about shared libraries for\"\n    echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n    echo \"----------------------------------------------------------------------\"\n    exit 0\n    ;;\n\n  # libtool execute mode\n  execute)\n    modename=\"$modename: execute\"\n\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    if test -z \"$cmd\"; then\n      $echo \"$modename: you must specify a COMMAND\" 1>&2\n      $echo \"$help\"\n      exit 1\n    fi\n\n    # Handle -dlopen flags immediately.\n    for file in $execute_dlfiles; do\n      if test ! -f \"$file\"; then\n\t$echo \"$modename: \\`$file' is not a file\" 1>&2\n\t$echo \"$help\" 1>&2\n\texit 1\n      fi\n\n      dir=\n      case $file in\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\n\t# If there is no directory component, then add one.\n\tcase $file in\n\t*/* | *\\\\*) . $file ;;\n\t*) . ./$file ;;\n\tesac\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && $echo \"$modename: warning: \\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$dir\" = \"X$file\" && dir=.\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  dir=\"$dir/$objdir\"\n\telse\n\t  $echo \"$modename: cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\" 1>&2\n\t  exit 1\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$dir\" = \"X$file\" && dir=.\n\t;;\n\n      *)\n\t$echo \"$modename: warning \\`-dlopen' is ignored for non-libtool libraries and objects\" 1>&2\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -*) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif (sed -e '4q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $file ;;\n\t  *) . ./$file ;;\n\t  esac\n\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      file=`$echo \"X$file\" | $Xsed -e \"$sed_quote_subst\"`\n      args=\"$args \\\"$file\\\"\"\n    done\n\n    if test -z \"$run\"; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved enviroment variables\n      if test \"${save_LC_ALL+set}\" = set; then\n\tLC_ALL=\"$save_LC_ALL\"; export LC_ALL\n      fi\n      if test \"${save_LANG+set}\" = set; then\n\tLANG=\"$save_LANG\"; export LANG\n      fi\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$echo \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\t$echo \"export $shlibpath_var\"\n      fi\n      $echo \"$cmd$args\"\n      exit 0\n    fi\n    ;;\n\n  # libtool clean and uninstall mode\n  clean | uninstall)\n    modename=\"$modename: $mode\"\n    rm=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) rm=\"$rm $arg\"; rmforce=yes ;;\n      -*) rm=\"$rm $arg\" ;;\n      *) files=\"$files $arg\" ;;\n      esac\n    done\n\n    if test -z \"$rm\"; then\n      $echo \"$modename: you must specify an RM program\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    rmdirs=\n\n    for file in $files; do\n      dir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n      if test \"X$dir\" = \"X$file\"; then\n\tdir=.\n\tobjdir=\"$objdir\"\n      else\n\tobjdir=\"$dir/$objdir\"\n      fi\n      name=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n      test $mode = uninstall && objdir=\"$dir\"\n\n      # Remember objdir for removal later, being careful to avoid duplicates\n      if test $mode = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $objdir \"*) ;;\n\t  *) rmdirs=\"$rmdirs $objdir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if (test -L \"$file\") >/dev/null 2>&1 \\\n\t|| (test -h \"$file\") >/dev/null 2>&1 \\\n\t|| test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  . $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    rmfiles=\"$rmfiles $objdir/$n\"\n\t  done\n\t  test -n \"$old_library\" && rmfiles=\"$rmfiles $objdir/$old_library\"\n\t  test $mode = clean && rmfiles=\"$rmfiles $objdir/$name $objdir/${name}i\"\n\n\t  if test $mode = uninstall; then\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      eval cmds=\\\"$postuninstall_cmds\\\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\"\n\t\tif test $? != 0 && test \"$rmforce\" != yes; then\n\t\t  exit_status=1\n\t\tfi\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      eval cmds=\\\"$old_postuninstall_cmds\\\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\"\n\t\tif test $? != 0 && test \"$rmforce\" != yes; then\n\t\t  exit_status=1\n\t\tfi\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\tif test \"$build_old_libs\" = yes; then\n\t  oldobj=`$echo \"X$name\" | $Xsed -e \"$lo2o\"`\n\t  rmfiles=\"$rmfiles $dir/$oldobj\"\n\tfi\n\t;;\n\n      *)\n\t# Do a test to see if this is a libtool program.\n\tif test $mode = clean &&\n\t   (sed -e '4q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  relink_command=\n\t  . $dir/$file\n\n\t  rmfiles=\"$rmfiles $objdir/$name $objdir/${name}S.${objext}\"\n\t  if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t    rmfiles=\"$rmfiles $objdir/lt-$name\"\n\t  fi\n\tfi\n\t;;\n      esac\n      $show \"$rm $rmfiles\"\n      $run $rm $rmfiles || exit_status=1\n    done\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\t$show \"rmdir $dir\"\n\t$run rmdir $dir >/dev/null 2>&1\n      fi\n    done\n\n    exit $exit_status\n    ;;\n\n  \"\")\n    $echo \"$modename: you must specify a MODE\" 1>&2\n    $echo \"$generic_help\" 1>&2\n    exit 1\n    ;;\n  esac\n\n  if test -z \"$exec_cmd\"; then\n    $echo \"$modename: invalid operation mode \\`$mode'\" 1>&2\n    $echo \"$generic_help\" 1>&2\n    exit 1\n  fi\nfi # test -z \"$show_help\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec $exec_cmd\n  exit 1\nfi\n\n# We need to display help for each of the modes.\ncase $mode in\n\"\") $echo \\\n\"Usage: $modename [OPTION]... [MODE-ARG]...\n\nProvide generalized library-building support services.\n\n    --config          show all configuration variables\n    --debug           enable verbose shell tracing\n-n, --dry-run         display commands without modifying any files\n    --features        display basic configuration information and exit\n    --finish          same as \\`--mode=finish'\n    --help            display this help message and exit\n    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]\n    --quiet           same as \\`--silent'\n    --silent          don't print informational messages\n    --version         print version information\n\nMODE must be one of the following:\n\n      clean           remove files from the build directory\n      compile         compile a source file into a libtool object\n      execute         automatically set library path, then run a program\n      finish          complete the installation of libtool libraries\n      install         install libraries or executables\n      link            create a library or an executable\n      uninstall       remove libraries from an installed directory\n\nMODE-ARGS vary depending on the MODE.  Try \\`$modename --help --mode=MODE' for\na more detailed description of MODE.\"\n  exit 0\n  ;;\n\nclean)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n  ;;\n\ncompile)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -prefer-pic       try to building PIC objects only\n  -prefer-non-pic   try to building non-PIC objects only\n  -static           always build a \\`.o' file suitable for static linking\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n  ;;\n\nexecute)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n  ;;\n\nfinish)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n  ;;\n\ninstall)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n  ;;\n\nlink)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n\t\t    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n\t\t    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -static           do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n\t\t    specify library version info [each variable defaults to 0]\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n  ;;\n\nuninstall)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n  ;;\n\n*)\n  $echo \"$modename: invalid operation mode \\`$mode'\" 1>&2\n  $echo \"$help\" 1>&2\n  exit 1\n  ;;\nesac\n\necho\n$echo \"Try \\`$modename --help' for more information about other modes.\"\n\nexit 0\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n"
  },
  {
    "path": "maketgz",
    "content": "#! /bin/sh\n# Script to build release-archives with\n#\n\necho \"Version number ?\"\nread version\n\necho \"Patchlevel ?\"\nread patchlevel\n\nHEADER=\"patchlevel.h\"\n\n# Replace version number in header file:\nsed -e 's/#define VERSION.*/#define VERSION \"'$version'\"/g' \\\n    -e 's/#define PATCHLEVEL.*/#define PATCHLEVEL \"'$patchlevel'\"/g' $HEADER >$HEADER.new\n\n# Save old header file\ncp -p $HEADER $HEADER.old\n\n# Make new header:\nmv $HEADER.new $HEADER\n\n# get current dir\ndir=`pwd`\n\n# Get basename\norig=`basename $dir`\n\n# Get the left part of the dash (-)\nnew=`echo $orig | cut -d- -f1`\n\n# Build new directory name\nn=$new-$version;\n\n# Tell the world what we're doing\necho \"creates $n.tar.gz\";\n\nif [ -r $n ]; then\n  echo \"Directory already exists!\"\n  exit\nfi\n\n# Create the new dir\nmkdir $n\n\n# Copy all relevant files, with path and permissions!\ntar -cf - `cat FILES | grep -v \\#` | (cd $n; tar -xBpf -)\n\n# Make a tar archive of it all\ntar -cvf $n.tar $n\n\n# gzip the archive\ngzip $n.tar\n\n# Make it world readable\nchmod a+r $n.tar.gz ;\n\n# Delete the temp dir\nrm -rf $n\n"
  },
  {
    "path": "patchlevel.h",
    "content": "#define VERSION \"2.4.0\"\n#define PATCHLEVEL \"0\"\n"
  },
  {
    "path": "src/.indent.pro",
    "content": "-nbad -bap -nbbo -nbc -br -brs -ncdb -nce -ci4 -cp33 \n-ncs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs \n-npsl -nsc -nsob -nss\n-Tform_entry\n-Tcgi_info\n-TFILE\n-Ttime_t\n-Tva_stack_t\n-Tpattern\n"
  },
  {
    "path": "src/.splintrc",
    "content": "#\n# Standard mode of checking.\n#\n-weak\n#-standard\n#-checks\n#-strict\n#\n# MEMORY/NULL/SECURITY\n+nullterminated\n+bounds\n+boundsread\n+boundswrite\n+fcnpost\n+redundantconstraints\n+checkpost\n+implictconstraint\n+orconstraint\n+nullterminated\n+showconstraintparens\n+boundscompacterrormessages\n+showconstraintlocation\n+debugfcnconstraint\n+deparrays\n+charindex\n+enumindex\n+mustfreefresh\n+mustfreeonly\n+mustfree\n+compdestroy\n+strictdestroy\n+null\n+nullderef\n+nullpass\n+nullret\n+nullstate\n+nullassign\n+bufferoverflow\n+bufferoverflowhigh\n+implementationoptional\n+multithreaded\n+portability\n+superuser\n+toctou\n+unixstandard\n+its4mostrisky\n+its4veryrisky\n+its4risky\n+its4moderate\n+its4low\n#\n# Others\n#\n#\n#-abstract\n#-badflag\n#-boolops\n#-booltype\n#-branchstate\n#-casebreak\n#+charintliteral\n#-compdef\n#-compdestroy\n#-compmempass\n#-dependenttrans\n#-evalorder\n#-exitarg\n#-exportlocal\n#-formatconst\n#-formattype\n#-fullinitblock\n#-globstate\n#-globuse\n#-ifempty\n+ignoresigns\n#-immediatetrans\n#-incondefs\n#-infloops\n#-initallelements\n#-kepttrans\n#-likelybool\n#-macroredef\n+matchanyintegral\n#-mayaliasunique\n#-modobserver\n#-mustfreefresh\n#-mustfreeonly\n#-noret\n#-nullassign\n#-nullderef\n#-nullpass\n#-nullret\n#-nullstate\n#-observertrans\n#-onlytrans\n#-paramuse\n#-posix-lib \n#-predboolint\n#-predboolothers\n#+ptrnegate\n#-realcompare\n#-redef\n#-retvalint\n-retvalother\n#-shadow\n#-shiftimplementation\n#-shiftnegative\n#+showscan\n#-showsummary\n#-statictrans\n#+stats\n#-temptrans\n#-type\n#-uniondef\n#-unqualifiedtrans\n#-unreachable\n-unrecog\n#-unrecogcomments\n#-usedef\n#-usereleased\n-usevarargs\n#-varuse\n#-warnlintcomments\n-warnposixheaders\n"
  },
  {
    "path": "src/Makefile.in",
    "content": "#\n# Makefile for Hypermail\n#\n@SET_MAKE@\n\nprefix=@prefix@\ndatarootdir = @datarootdir@\ndatadir = @datadir@\nexec_prefix=@exec_prefix@\n \n# This is where you want hypermail to be installed\nbindir=@bindir@\n \n# This is where the man page goes\nmandir=@mandir@\n\n# This is where your CGI programs live\ncgidir=@cgidir@\n\n# Executable program suffix (.exe for windows, null for Unix systems)\nSUFFIX=@suffix@\n\n# Compiler to use\nCC=@CC@\n\n# Installation program to use\nINSTALL_PROG=@INSTALL@ \n\nSPLINTFLAGS=@INCLUDES@\n\nPCRE_DEP=@PCRE_DEP@\nTRIO_DEP=@TRIO_DEP@\nFNV_DEP=@FNV_DEP@\n\n#WNOERROR=-Werror\n#WARNINGS=$(WNOERROR) -ansi -pedantic -Wall -Wtraditional -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Dlint\n\nCFLAGS=@CFLAGS@ $(WARNINGS)\nCPPFLAGS=@CPPFLAGS@ @INCLUDES@\nYACC=@YACC@\nNETLIBS=@LIBS@\nLDFLAGS=@LDFLAGS@\nMISC_LIBS= -lpcre -ltrio -lm\nOPT_LIBS=@EXTRA_LIBS@\n\nINCS=\t\tdomains.h hypermail.h lang.h proto.h \\\n\t\t../config.h ../patchlevel.h dsprintf.h threadprint.h \\\n\t\tgetdate.h getname.h finelink.h txt2html.h search.h\n\nSRCS=\t\tbase64.c date.c domains.c file.c hypermail.c lang.c lock.c \\\n\t\tmem.c parse.c print.c printfile.c string.c struct.c uudecode.c\\\n\t\tdmatch.c setup.c threadprint.c getdate.c getname.c\\\n\t\tfinelink.c txt2html.c search.c quotes.c\n\nOBJS=\t\tbase64.o date.o domains.o file.o hypermail.o lang.o lock.o \\\n\t\tmem.o parse.o print.o printfile.o string.o struct.o uudecode.o\\\n\t\tdmatch.o setup.o threadprint.o getdate.o getname.o\\\n\t\tfinelink.o txt2html.o search.o quotes.o\n\nMAILOBJS=\tmail.o ../libcgi/libcgi.a\n\n.c.o:\n\t$(CC) -c $(CFLAGS) $(CPPFLAGS) $<\n\nall:    @PCRE_DEP@ @TRIO_DEP@ @FNV_DEP@ hypermail$(SUFFIX) mail$(SUFFIX) lang$(SUFFIX)\n\npcre/.libs/libpcre.a:\n\t@cd pcre; $(MAKE) CC=\"$(CC)\" ; rm -f .libs/lib*.so*\n\ntrio/libtrio.a:\n\t@cd trio; $(MAKE) CC=\"$(CC)\"\n\nfnv/libfnv.a:\n\t@cd fnv; $(MAKE) libfnv.a CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" CPPFLAGS=\"$(CPPFLAGS)\"\n\nhypermail$(SUFFIX): $(OBJS) \n\t$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(OBJS) $(OPT_LIBS) $(MISC_LIBS)\n\tchmod 0755 $@\n\nmail$(SUFFIX):\t$(MAILOBJS)\n\t$(CC) -o $@ $(CFLAGS) $(MAILOBJS) $(NETLIBS) -lm\n\tchmod 0755 $@\n\nlang$(SUFFIX): lang.c lang.h\n\t$(CC) -DLANG_PROG $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ lang.c $(MISC_LIBS)\n\n../libcgi/libcgi.a:\n\t@cd ../libcgi; $(MAKE) all CC=\"$(CC)\" CFLAGS=\"$(CFLAGS)\" CPPFLAGS=\"$(CPPFLAGS)\"\n\ngetdate.c: getdate.y getdate.h\n\t@echo \"Expect 13 shift/reduce conflicts.\"\n\t$(YACC) getdate.y\n\t@mv -f y.tab.c getdate.c\n\ninstall: all\n\t@if [ ! -d $(bindir) ]; then mkdir -p $(bindir); fi\n\t$(INSTALL_PROG) -s -c -m 0755 hypermail$(SUFFIX) $(bindir)\n\nmail.install:\n\t@if [ ! -d $(cgidir) ]; then mkdir -p $(cgidir); fi\n\t$(INSTALL_PROG) -s -c -m 0755 mail$(SUFFIX) $(cgidir)\n\nuninstall:\n\trm -f $(bindir)/hypermail$(SUFFIX)\n\trm -f $(cgidir)/mail$(SUFFIX)\n\ninsight:\n\t$(MAKE) CC=\"insight\" \n\npure:\n\t$(MAKE) CFLAGS=\"-g\" $(OBJS)  \n\tpurify $(CC) -o hypermail -g $(CFLAGS) $(CPPFLAGS) $(OBJS) \n\nquant:\n\t$(MAKE) CFLAGS=\"-g\" $(OBJS)\n\tquantify $(CC) -o hypermail -g $(CFLAGS) $(CPPFLAGS) $(OBJS)\n\n\nsplint: \n\tsplint $(SPLINTFLAGS) $(SRCS) 2>&1 | tee splint.out\n\nlint:\t\n\tlint $(SRCS) 2>&1 | tee lint.out\n\nlint_mail:\t\n\tlint mail.c 2>&1 | tee lint.out\n\t@(cd ../libcgi; $(MAKE) lint 2>&1 | tee -a ../lint.out)\n\nclean:\n\trm -f hypermail$(SUFFIX) mail$(SUFFIX) lang$(SUFFIX)\n\trm -f *.o .pure *qx *qv *.ln core\n\trm -f .inslog tca.map lint.out splint.out\n\trm -f getdate.c\n\t@(if test \"$(PCRE_DEP)\" != \"\" ; then cd pcre; $(MAKE) clean; fi)\n\t@(if test \"$(TRIO_DEP)\" != \"\" ; then cd trio; $(MAKE) clean; fi)\n\t@(if test \"$(FNV_DEP)\" != \"\" ; then cd fnv; $(MAKE) clean; fi)\n\t@cd ../libcgi; $(MAKE) clean\n\nclobber: clean\n\t@(if test \"$(PCRE_DEP)\" != \"\" ; then cd pcre; rm -f *.lock; fi)\n\t@(if test \"$(TRIO_DEP)\" != \"\"; then cd trio; rm -f *.lock; fi)\n\t@(if test \"$(FNV_DEP)\" != \"\" ; then cd fnv; $(MAKE) clobber; fi)\n\t@cd ../libcgi; $(MAKE) clobber\n\ndistclean: clobber\n\t@(if test \"$(PCRE_DEP)\" != \"\" ; then cd pcre; $(MAKE) distclean; fi)\n\t@(if test \"$(TRIO_DEP)\" != \"\"; then cd trio; $(MAKE) clean; fi)\n\t@(if test \"$(FNV_DEP)\" != \"\" ; then cd fnv; $(MAKE) distclean; fi)\n\t@cd ../libcgi; $(MAKE) distclean\n\n#\n# Regenerate this dependency list with gcc -MM *.c:\n#\n\nbase64.o: base64.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n base64.h\ndate.o: date.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h\ndmatch.o: dmatch.c dmatch.h ../config.h\ndomains.o: domains.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h domains.h\nfile.o: file.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h struct.h\nfinelink.o: finelink.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h finelink.h setup.h print.h struct.h search.h\ngetname.o: getname.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h getname.h setup.h\nhypermail.o: hypermail.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h defaults.h setup.h parse.h print.h finelink.h search.h struct.h\nlang.o: lang.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h\nlock.o: lock.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h\nmail.o: mail.c ../libcgi/cgi.h ../libcgi/../config.h ../config.h\nmem.o: mem.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h\nparse.o: parse.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h struct.h uudecode.h base64.h search.h getname.h parse.h print.h\nprint.o: print.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h struct.h printfile.h print.h parse.h txt2html.h finelink.h \\\n threadprint.h\nprintfile.o: printfile.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h setup.h print.h printfile.h struct.h\nquotes.o: quotes.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h\nsearch.o: search.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h struct.h print.h search.h\nsetup.o: setup.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n defaults.h setup.h struct.h print.h\nstring.o: string.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n setup.h parse.h uconvert.h\nstruct.o: struct.c hypermail.h ../config.h ../patchlevel.h proto.h lang.h \\\n dmatch.h setup.h struct.h parse.h getname.h\nthreadprint.o: threadprint.c hypermail.h ../config.h ../patchlevel.h \\\n proto.h lang.h setup.h struct.h threadprint.h printfile.h print.h\ntxt2html.o: txt2html.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h setup.h print.h finelink.h txt2html.h\nuudecode.o: uudecode.c hypermail.h ../config.h ../patchlevel.h proto.h \\\n lang.h setup.h uudecode.h\n"
  },
  {
    "path": "src/base64.c",
    "content": "/* \n** Author:  Daniel Stenberg <Daniel.Stenberg@haxx.nu>\n** Version: 0.1\n**\n** This is a Base64 encoder as defined in RFC 2045. If the output is gonna be\n** used in a mail body: \"The encoded output stream must be represented in\n** lines of no more than 76 characters each.\"\n**\n** CHANGES by Daniel Stenberg. May 11, 1998:\n**\n** - Encoded strings that ended with more than one = caused the decode \n**   function+ to generate 3 extra zero bytes at the end of the output.\n*/\n\n#include \"hypermail.h\"\n#include \"base64.h\"\n\nvoid base64Decode(char *intext, char *out, int *length)\n{\n    unsigned char ibuf[4];\n    unsigned char obuf[3];\n    char ignore;\n    char endtext = FALSE;\n    char ch;\n    int lindex = 0;\n    *length = 0;\n\n    memset(ibuf, 0, sizeof(ibuf));\n\n    while (*intext) {\n\tch = *intext;\n\n\tignore = FALSE;\n\tif ((ch >= 'A') && (ch <= 'Z'))\n\t    ch = ch - 'A';\n\telse if ((ch >= 'a') && (ch <= 'z'))\n\t    ch = ch - 'a' + 26;\n\telse if ((ch >= '0') && (ch <= '9'))\n\t    ch = ch - '0' + 52;\n\telse if (ch == '+')\n\t    ch = 62;\n\telse if (ch == '=') {\t/* end of text */\n\t    if (endtext)\n\t\tbreak;\n\t    endtext = TRUE;\n\t    lindex--;\n\t    if (lindex < 0)\n\t\tlindex = 3;\n\t}\n\telse if (ch == '/')\n\t    ch = 63;\n\telse if (endtext)\n\t    break;\n\telse\n\t    ignore = TRUE;\n\n\tif (!ignore) {\n\t    if (!endtext) {\n\t\tibuf[lindex] = ch;\n\n\t\tlindex++;\n\t\tlindex &= 3;\t/* use bit arithmetic instead of remainder */\n\t    }\n\t    if ((0 == lindex) || endtext) {\n\n\t\tobuf[0] = (ibuf[0] << 2) | ((ibuf[1] & 0x30) >> 4);\n\t\tobuf[1] =\n\t\t    ((ibuf[1] & 0x0F) << 4) | ((ibuf[2] & 0x3C) >> 2);\n\t\tobuf[2] = ((ibuf[2] & 0x03) << 6) | (ibuf[3] & 0x3F);\n\n\t\tswitch (lindex) {\n\t\tcase 1:\n\t\t    sprintf(out, \"%c\", obuf[0]);\n\t\t    out++;\n\t\t    (*length)++;\n\t\t    break;\n\t\tcase 2:\n\t\t    sprintf(out, \"%c%c\", obuf[0], obuf[1]);\n\t\t    out += 2;\n\t\t    (*length) += 2;\n\t\t    break;\n\t\tdefault:\n\t\t    sprintf(out, \"%c%c%c\", obuf[0], obuf[1], obuf[2]);\n\t\t    out += 3;\n\t\t    (*length) += 3;\n\t\t    break;\n\t\t}\n\t\tmemset(ibuf, 0, sizeof(ibuf));\n\t    }\n\t}\n\tintext++;\n    }\n    *out = 0;\n}\n"
  },
  {
    "path": "src/base64.h",
    "content": "/* \n** MIME Decode - base64.c\n*/\n\nvoid base64Decode(char *, char *, int *);\n"
  },
  {
    "path": "src/date.c",
    "content": "/*\n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n**\n** This program and library is free software; you can redistribute it and/or\n** modify it under the terms of the GNU (Library) General Public License\n** as published by the Free Software Foundation; either version 2\n** of the License, or any later version.\n**\n** This program is distributed in the hope that it will be useful,\n** but WITHOUT ANY WARRANTY; without even the implied warranty of\n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n** GNU (Library) General Public License for more details.\n**\n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software\n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n** Move to wrappers calling standard functions - perhaps slower\n** but easier to maintain\n*/\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n\n/* \n** Given a long date string, it returns the number of seconds\n** since BASEYEAR. (Y2K ok)\n*/\n\nextern time_t get_date(const char *, const time_t *);\n\nstatic time_t ydhms_tm_diff(int, int, int, int, int, const struct tm *);\nstatic time_t my_mktime(struct tm *);\n\ntime_t convtoyearsecs(char *date)\n{\n    time_t yearsecs;\n    char *p, *s = date;\n\n    /* the (non-standard) timezone specs GMT0 and BST-1\n     * confuse the get_date routines (GMT0 sets the year to 0).\n     * Rather than altering the standard routine, we try to\n     * put them into a standard format here.\n     */\n    if ((p = strstr(date, \"GMT0\")) != NULL) {\n\ts = malloc(strlen(date) + 1);\n\tstrcpy(s, date);\n\t*(s + (p - date) + 3) = '\\0';\n    }\n    else if ((p = strstr(date, \"BST-1\")) != NULL) {\n\ts = malloc(strlen(date) + 1);\n\tstrcpy(s, date);\n\tstrcpy(s + (p - date), \"-1\");\n    }\n\n    yearsecs = get_date(s, (time_t *)NULL);\n    if (s != date) {\n\tfree(s);\n    }\n\n    /* if we can't parse the date string, the calling\n     * routine needs to know as it may have another\n     * way of getting the date.\n     */\n    return yearsecs;\n}\n\n/* \n** Gets the local time and returns it formatted.\n*/\n\nchar *getlocaltime(void)\n{\n    static char s[DATESTRLEN + 5];\n    time_t tp;\n    struct tm *tmptr;\n\n    time(&tp);\n    tmptr = (set_gmtime ? gmtime(&tp) : localtime(&tp));\n\n    s[0] = '\\0';\n\n    if (set_dateformat != NULL) {\n\tstrftime(s, DATESTRLEN, set_dateformat, tmptr);\n        /* \n\t * Need to check if the timezone %Z was specified. \n\t * If so do not print it out automatically.\n\t */\n       if (strstr(set_dateformat, \"%Z\") == NULL)\n           sprintf(s, \"%s %s\", s, timezonestr);\n    }\n    else {\n\tif (set_eurodate)\n\t    strftime(s, DATESTRLEN, \"%a %d %b %Y - %H:%M:%S\", tmptr);\n\telse if (set_isodate) {\n\t    if (set_gmtime)\n\t        strftime(s, DATESTRLEN, \"%Y-%m-%dZ%H:%M:%S\", tmptr);\n\t    else\n\t        strftime(s, DATESTRLEN, \"%Y-%m-%d %H:%M:%S\", tmptr);\n\t}\n\telse\n\t    strftime(s, DATESTRLEN, \"%a %b %d %Y - %H:%M:%S\", tmptr);\n\n        sprintf(s, \"%s %s\", s, timezonestr);\n    }\n    return s;\n}\n\n/* \n** Gets the local time zone.\n*/\n\nvoid gettimezone(void)\n{\n    time_t tp;\n\n    time(&tp);\n    strftime(timezonestr, TIMEZONELEN, \"%Z\",\n\t     set_gmtime ? gmtime(&tp) : localtime(&tp));\n}\n\n/*\n** Gets the current year.\n*/\n\nvoid getthisyear(void)\n{\n    time_t tp;\n\n    time(&tp);\n    strftime(thisyear, YEARLEN, \"%Y\", set_gmtime ? gmtime(&tp) : localtime(&tp));\n}\n\nint year_of_datenum(time_t t)\n{\n  struct tm *tptr = (set_gmtime ? gmtime(&t) : localtime(&t));\n  return tptr->tm_year + 1900;\n}\n\nint month_of_datenum(time_t t)\n{\n  struct tm *tptr = (set_gmtime ? gmtime(&t) : localtime(&t));\n  return tptr->tm_mon;\n}\n\n/* \n** From the number of seconds since BASEYEAR, this pretty-prints\n** a date for you. \n*/\n\nchar *getdatestr(time_t yearsecs)\n{\n    static char date[DATESTRLEN];\n    struct tm *tmptr = (set_gmtime ? gmtime(&yearsecs) : localtime(&yearsecs));\n\n    if (set_dateformat != NULL) {\n\tstrftime(date, DATESTRLEN, set_dateformat, tmptr);\n    }\n    else {\n\tif (set_eurodate)\n\t    strftime(date, DATESTRLEN, \"%a %d %b %Y - %H:%M:%S %Z\", tmptr);\n\telse if (set_isodate) {\n\t    if (set_gmtime)\n\t        strftime(date, DATESTRLEN, \"%Y-%m-%dZ%H:%M:%S\", tmptr);\n\t    else\n\t        strftime(date, DATESTRLEN, \"%Y-%m-%d %H:%M:%S\", tmptr);\n\t}\n\telse\n\t    strftime(date, DATESTRLEN, \"%a %b %d %Y - %H:%M:%S %Z\", tmptr);\n    }\n    return date;\n}\n\n/* \n** This function calls getdatestr, but with an alternate date format\n** that is used for showing dates in the indexs\n*/\n\nchar *getindexdatestr(time_t yearsecs)\n{\n  char *previous_dateformat;\n  char *date;\n\n  /* store the previous dateformat */\n  previous_dateformat = set_dateformat;\n  /* if there's an index date format, we use it, otherwise use the\n   standard  dateformat */\n  if (set_indexdateformat)\n    set_dateformat = set_indexdateformat;\n  date = getdatestr (yearsecs);\n  /* restore the previous dateformat */\n  set_dateformat = previous_dateformat;\n  return date;\n}\n\n/* \n** This function calls getdatestr, but with a fixed  alternate\n**  date format that we use for comparing two dates minus the hour.\n*/\n\nchar *getdateindexdatestr(time_t yearsecs)\n{\n  char *previous_dateformat;\n  char *date;\n\n  /* store the previous dateformat */\n  previous_dateformat = set_dateformat;\n  set_dateformat = \"%A, %e %B %Y\";\n  date = getdatestr (yearsecs);\n  /* restore the previous dateformat */\n  set_dateformat = previous_dateformat;\n  return date;\n}\n\nchar *secs_to_iso(time_t t)\n{\n    /* is passed time_t variable\n     * holding number of seconds since EPOCH\n     * returns pointer to string holding date in format\n     * YYYYMMDDHHMMSS\n     * This buffer will be overwritten by next call to secs_to_iso.\n     */\n    static char s[15];\n    struct tm *tm;\n\n    tm = gmtime(&t);\n    sprintf(s, \"%4.4d%02.2d%02.2d%02.2d%02.2d%02.2d\",\n\t    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,\n\t    tm->tm_hour, tm->tm_min, tm->tm_sec);\n    return s;\n}\n\nchar *secs_to_iso_meta(time_t t)\n{\n    /* is passed time_t variable\n     * holding number of seconds since EPOCH\n     * returns pointer to string holding date in format\n     * YYYY-MM-DD\n     * This buffer will be overwritten by next call to secs_to_iso_meta.\n     */\n    static char s[11];\n    struct tm *tm;\n\n    tm = localtime(&t);\n    sprintf(s, \"%4.4d-%02.2d-%02.2d\",\n\t    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);\n    return s;\n}\n\ntime_t iso_to_secs(char *isodate)\n{\n    /* is passed string holding date in format\n     * YYYYMMDDHHMMSS\n     * returns number of seconds since EPOCH\n     */\n    struct tm t;\n    char s[15];\n\n    strncpy(s, isodate, 14);\n    s[14] = '\\0';\n    t.tm_isdst = 0;\n    t.tm_yday = 0;\n    t.tm_wday = 0;\n    t.tm_sec = atoi(s + 12);\n    *(s + 12) = '\\0';\n    t.tm_min = atoi(s + 10);\n    *(s + 10) = '\\0';\n    t.tm_hour = atoi(s + 8);\n    *(s + 8) = '\\0';\n    t.tm_mday = atoi(s + 6);\n    *(s + 6) = '\\0';\n    t.tm_mon = atoi(s + 4) - 1;\n    *(s + 4) = '\\0';\n    t.tm_year = atoi(s) - 1900;\n\n    return my_mktime(&t);\n}\n\n\n/* Based on mktime.c from the GNU C library (glibc-2.0.6)\n * simplified to ignore timezones completely for use by hypermail when \n * converting from iso string representation of time to seconds since\n * epoch (interpreting given time as UTC).\n *\n * Paul Haldane\n */\n\n#define TM_YEAR_BASE 1900\n#define EPOCH_YEAR 1970\n\n#ifndef __isleap\n/* Nonzero if YEAR is a leap year (every 4 years,\n   except every 100th isn't, and every 400th is).  */\n# define __isleap(year)\t\\\n  ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))\n#endif\n\n/* How many days come before each month (0-12).  */\nconst unsigned short int __mon_yday[2][13] = {\n    /* Normal years.  */\n    {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},\n    /* Leap years.  */\n    {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}\n};\n\n/* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),\n   measured in seconds, ignoring leap seconds.\n   YEAR uses the same numbering as TM->tm_year.\n   All values are in range, except possibly YEAR.\n   If overflow occurs, yield the low order bits of the correct answer.  */\n\nstatic time_t ydhms_tm_diff(int year, int yday, int hour,\n\t\t\t    int min, int sec, const struct tm *tp)\n{\n    /* Compute intervening leap days correctly even if year is negative.\n       Take care to avoid int overflow.  time_t overflow is OK, since\n       only the low order bits of the correct time_t answer are needed.\n       Don't convert to time_t until after all divisions are done, since\n       time_t might be unsigned.  */\n    int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - !(year & 3);\n    int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - !(tp->tm_year & 3);\n    int a100 = a4 / 25 - (a4 % 25 < 0);\n    int b100 = b4 / 25 - (b4 % 25 < 0);\n    int a400 = a100 >> 2;\n    int b400 = b100 >> 2;\n    int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);\n    time_t years = year - (time_t)tp->tm_year;\n    time_t ddays = (365 * years + intervening_leap_days + (yday - tp->tm_yday));\n    return (60 * (60 * (24 * ddays + (hour - tp->tm_hour))\n\t\t  + (min - tp->tm_min)) + (sec - tp->tm_sec));\n}\n\n/* Convert *TP to a time_t value */\n\nstatic time_t my_mktime(struct tm *tp)\n{\n    time_t t0;\n    struct tm tm;\n\n    /* Time requested.  Copy it in case CONVERT modifies *TP; this can\n       occur if TP is localtime's returned value and CONVERT is localtime.  */\n    int sec = tp->tm_sec;\n    int min = tp->tm_min;\n    int hour = tp->tm_hour;\n    int mday = tp->tm_mday;\n    int mon = tp->tm_mon;\n    int year_requested = tp->tm_year;\n\n    /* Ensure that mon is in range, and set year accordingly.  */\n    int mon_remainder = mon % 12;\n    int negative_mon_remainder = mon_remainder < 0;\n    int mon_years = mon / 12 - negative_mon_remainder;\n    int year = year_requested + mon_years;\n\n    /* The other values need not be in range:\n       the remaining code handles minor overflows correctly,\n       assuming int and time_t arithmetic wraps around.\n       Major overflows are caught at the end.  */\n\n    /* Calculate day of year from year, month, and day of month.\n       The result need not be in range.  */\n    int yday = ((__mon_yday[__isleap(year + TM_YEAR_BASE)]\n\t\t [mon_remainder + 12 * negative_mon_remainder])\n\t\t+ mday - 1);\n\n    tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;\n    tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;\n    t0 = ydhms_tm_diff(year, yday, hour, min, sec, &tm);\n\n    return t0;\n}\n"
  },
  {
    "path": "src/defaults.h.in",
    "content": "#ifndef __DEFAULTS_H\n#define __DEFAULTS_H\n\n/* ALERT! ALERT! ALERT! ALERT! ALERT! ALERT! ALERT! ALERT!\n *\n * The #defines following here ARE NOT intended to be modified locally \n * before you compile hypermail. They're here to set internal defaults \n * and they are set during the configure process. To alter these settings\n * for use during runtime, modify your config file!\n */\n\n#define CONFIGFILE \"~/.hmrc\"\n\n#define INLINE_TYPES \"image/gif image/jpeg image/png\"\n\n#define SHOW_HEADERS \"From Subject Date Message-ID\"\n\n#define MAILCOMMAND \"mailto:$TO?Subject=$SUBJECT\"\n\n#define PROGRESS 0\n\n#define RECOGNIZE_SUPERCITE_QUOTES 1\n\n#define LANGUAGE     \"@language@\"\n\n#define HTMLSUFFIX   \"@htmlsuffix@\"\n\n#define DEFAULTINDEX \"@defaultindex@\"\n\n#define DOMAINADDR   \"@domainaddr@\"\n\n#define ANTISPAM_AT   \"_at_\"\n\n#define APPLE_MAIL_UA \"Apple iPhone iPad\"\n\n#endif\n"
  },
  {
    "path": "src/dmatch.c",
    "content": "/*\n  The shortest ever? 88 characters...\n\n  m(char*s,char*t){return*t-'*'?*s?*t=='?'|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);}\n\n  Written by Staffan Ulfberg <staffanu@tcs07.nada.kth.se>\n\n  What follows below is a rewrite of the above into readable C and a small\n  patch to prevent really deep recursiveness on patterns featuring a long\n  sequence of '*'. Done by Daniel Stenberg <Daniel.Stenberg@haxx.nu>\n */\n\n#include \"dmatch.h\"\n#ifdef __LCC__\n#include \"../lcc/config.h\"\n#else\n#include \"../config.h\"\n#endif\n\n#ifdef HAVE_CTYPE_H\n#include <ctype.h>\n#endif\n\n#undef FALSE\n#define FALSE 0\n#undef TRUE\n#define TRUE 1\n\nchar Match(char *string, char *pattern)\n{\n    for (; '*'^*pattern; ++pattern, ++string) {\n\tif (!*string)\n\t    return (!*pattern);\n\tif (toupper(*string) ^ toupper(*pattern) && '?'^*pattern)\n\t     return (FALSE);\n    }\n\n    /* two-line patch to prevent *too* much recursiveness: */\n\n    while ('*' == pattern[1])\n\tpattern ++;\n\n    do {\n\tif (Match(string, pattern +1))\n\t     return (TRUE);\n    } while (*string++);\n\n    return (FALSE);\n}\n"
  },
  {
    "path": "src/dmatch.h",
    "content": "char Match(char *, char *);\n"
  },
  {
    "path": "src/domains.c",
    "content": "#include \"hypermail.h\"\n#include \"domains.h\"\n\nstruct co_code *ccptr;\n\nint valid_root_domain(char *eaddr)\n{\n    char *name_to_check;\n\n    /* First check to see if it has a '.' in it.  \n    ** Not invalid if there is no '.'.  \n    */\n\n    if ((name_to_check = strrchr(eaddr, '.')) == NULL)\n        return (0);\n\n    ++name_to_check;\n    if (!*name_to_check)\n        return (0);\n\n    /* DNS has evolved and we have now a variety of new domains, hard\n       to track and that are not covered by this function. While temporary\n       waiting to see if we evolve this function to be user configurable,\n       we're going to return 1 (valid) all the time. 19/06/2020 -JK */\n      return (1);\n       \n\n    for (ccptr = domain_codes; ccptr->domain != NULL; ccptr++) {\n        if (strcasecmp(name_to_check, ccptr->domain) == 0)\n            return (1);\n    }\n    return (0);\n}\n"
  },
  {
    "path": "src/domains.h",
    "content": "/* \n** @(#)domains.h\t1.17 03/09/03 - Kent Landfield\n*/\n\n/*\n** Domain Address COUNTRY Abbreviations \n** Domain codes \n**\n** Thanks to Olivier Crepin-Leblond <ocl@gih.com> for the basis of\n** this file.  For more timely information, check out \n**\n**    http://www.nsrc.org/codes/country-codes.html\n**    http://www.faqs.org/faqs/mail/country-codes/\n**\n*/\nstruct co_code {\n        char *domain;\n        char *country;\n};\n\nstruct co_code domain_codes[] = {\n    {  \"ARPA\",   \"Arpanet\"                         },\n    {  \"AERO\",   \"Air Transport Industry\"          },\n    {  \"BIZ\",    \"Businesses\"                      },\n    {  \"COOP\",   \"Non-profit cooperatives\"         },\n    {  \"COM\",    \"Commercial Entity\"               },\n    {  \"EDU\",    \"Educational Institution\"         },\n    {  \"GOV\",    \"Government Office\"               },\n    {  \"INFO\",   \"Informational\"                   },\n    {  \"INT\",    \"International Organization\"      },\n    {  \"MIL\",    \"US Military\"                     },\n    {  \"MUSEUM\", \"Museum\"                          },\n    {  \"NAME\",   \"Personal Name\"                   },\n    {  \"NET\",    \"Network Service Provider\"        },\n    {  \"PRO\",    \"Accountants, lawyers and physicians\" },\n    {  \"ORG\",    \"Organizations\"                   },\n    {  \"AC\",     \"Ascension Island\"                },\n    {  \"AD\",     \"Andorra\"                         },\n    {  \"AE\",     \"United Arab Emirates\"            },\n    {  \"AF\",     \"Afghanistan\"                     },\n    {  \"AG\",     \"Antigua and Barbuda\"             },\n    {  \"AI\",     \"Anguilla\"                        },\n    {  \"AL\",     \"Albania\"                         },\n    {  \"AM\",     \"Armenia\"                         },\n    {  \"AN\",     \"Netherlands Antilles\"            },\n    {  \"AO\",     \"Republic of Angola\"              },\n    {  \"AQ\",     \"Antarctica\"                      },\n    {  \"AR\",     \"Argentina\"                       },\n    {  \"AS\",     \"American Samoa\"                  },\n    {  \"AT\",     \"Austria\"                         },\n    {  \"AU\",     \"Australia\"                       },\n    {  \"AW\",     \"Aruba\"                           },\n    {  \"AZ\",     \"Azerbaijan\"                      },\n    {  \"BA\",     \"Bosnia-Herzegovina\"              },\n    {  \"BB\",     \"Barbados\"                        },\n    {  \"BD\",     \"Bangladesh\"                      },\n    {  \"BE\",     \"Belgium\"                         },\n    {  \"BF\",     \"Burkina Faso\"                    },\n    {  \"BG\",     \"Bulgaria\"                        },\n    {  \"BH\",     \"Bahrain\"                         },\n    {  \"BI\",     \"Burundi\"                         },\n    {  \"BJ\",     \"Benin\"                           },\n    {  \"BM\",     \"Bermuda\"                         },\n    {  \"BN\",     \"Brunei Darussalam\"               },\n    {  \"BO\",     \"Bolivia\"                         },\n    {  \"BR\",     \"Brazil\"                          },\n    {  \"BS\",     \"Bahamas\"                         },\n    {  \"BT\",     \"Bhutan\"                          },\n    {  \"BV\",     \"Bouvet Island\"                   },\n    {  \"BW\",     \"Botswana\"                        },\n    {  \"BY\",     \"Belarus\"                         },\n    {  \"BZ\",     \"Belize\"                          },\n    {  \"CA\",     \"Canada\"                          },\n    {  \"CC\",     \"Cocos (Keeling) Islands\"         },\n    {  \"CD\",     \"Democratic Republic of Congo\",   },\n    {  \"CF\",     \"Central African Republic\"        },\n    {  \"CG\",     \"Congo, Republic of\"              },\n    {  \"CH\",     \"Switzerland\"                     },\n    {  \"CI\",     \"Cote D'Ivoire (Ivory Coast)\"     },\n    {  \"CK\",     \"Cook Islands\"                    },\n    {  \"CL\",     \"Chile\"                           },\n    {  \"CM\",     \"Cameroon\"                        },\n    {  \"CN\",     \"China\"                           },\n    {  \"CO\",     \"Colombia\"                        },\n    {  \"CR\",     \"Costa Rica\"                      },\n    {  \"CU\",     \"Cuba\"                            },\n    {  \"CV\",     \"Cape Verde\"                      },\n    {  \"CX\",     \"Christmas Island\"                },\n    {  \"CY\",     \"Cyprus\"                          },\n    {  \"CZ\",     \"Czech Republic\"                  },\n    {  \"DE\",     \"Germany\"                         },\n    {  \"DJ\",     \"Djibouti\"                        },\n    {  \"DK\",     \"Denmark\"                         },\n    {  \"DM\",     \"Dominica\"                        },\n    {  \"DO\",     \"Dominican Republic\"              },\n    {  \"DZ\",     \"Algeria\"                         },\n    {  \"EC\",     \"Ecuador\"                         },\n    {  \"EE\",     \"Estonia\"                         },\n    {  \"EG\",     \"Egypt\"                           },\n    {  \"EH\",     \"Western Sahara\"                  },\n    {  \"ER\",     \"Eritrea\"                         },\n    {  \"ES\",     \"Spain\"                           },\n    {  \"ET\",     \"Ethiopia\"                        },\n    {  \"FI\",     \"Finland\"                         },\n    {  \"FJ\",     \"Fiji\"                            },\n    {  \"FK\",     \"Falkland Islands (Malvinas)\"     },\n    {  \"FM\",     \"Micronesia, Federal State of\"    },\n    {  \"FO\",     \"Faroe Islands\"                   },\n    {  \"FR\",     \"France\"                          },\n    {  \"GA\",     \"Gabon\"                           },\n    {  \"GB\",     \"Great Britian\"                   },\n    {  \"GD\",     \"Grenada\"                         },\n    {  \"GE\",     \"Georgia\"                         },\n    {  \"GF\",     \"French Guiana\"                   },\n    {  \"GG\",     \"Guernsey\"                        },\n    {  \"GH\",     \"Ghana\"                           },\n    {  \"GI\",     \"Gibraltar\"                       },\n    {  \"GL\",     \"Greenland\"                       },\n    {  \"GM\",     \"Gambia\"                          },\n    {  \"GN\",     \"Guinea\"                          },\n    {  \"GP\",     \"Guadeloupe\"                      },\n    {  \"GQ\",     \"Equatorial Guinea\"               },\n    {  \"GR\",     \"Greece\"                          },\n    {  \"GS\",     \"S.Georgia & S.Sandwich Islands.\" },\n    {  \"GT\",     \"Guatemala\"                       },\n    {  \"GU\",     \"Guam (US)\"                       },\n    {  \"GW\",     \"Guinea-Bissau\"                   },\n    {  \"GY\",     \"Guyana\"                          },\n    {  \"HK\",     \"Hong Kong\"                       },\n    {  \"HM\",     \"Heard and McDonald Islands\"      },\n    {  \"HN\",     \"Honduras\"                        },\n    {  \"HR\",     \"Croatia/Hrvatska\"                },\n    {  \"HT\",     \"Haiti\"                           },\n    {  \"HU\",     \"Hungary\"                         },\n    {  \"ID\",     \"Indonesia\"                       },\n    {  \"IE\",     \"Ireland\"                         },\n    {  \"IL\",     \"Israel\"                          },\n    {  \"IM\",     \"Isle of Man\"                     },\n    {  \"IN\",     \"India\"                           },\n    {  \"IO\",     \"British Indian Ocean Territory.\" },\n    {  \"IQ\",     \"Iraq\"                            },\n    {  \"IR\",     \"Iran (Islamic Republic of)\"      },\n    {  \"IS\",     \"Iceland\"                         },\n    {  \"IT\",     \"Italy\"                           },\n    {  \"JE\",     \"Jersey\"                          },\n    {  \"JM\",     \"Jamaica\"                         },\n    {  \"JO\",     \"Jordan\"                          },\n    {  \"JP\",     \"Japan\"                           },\n    {  \"KE\",     \"Kenya\"                           },\n    {  \"KG\",     \"Kyrgyzstan\"                      },\n    {  \"KH\",     \"Cambodia\"                        },\n    {  \"KI\",     \"Kiribati\"                        },\n    {  \"KM\",     \"Comoros\"                         },\n    {  \"KN\",     \"Saint Kitts and Nevis\"           },\n    {  \"KP\",     \"Korea (North)\"                   },\n    {  \"KR\",     \"Korea (South)\"                   },\n    {  \"KW\",     \"Kuwait\"                          },\n    {  \"KY\",     \"Cayman Islands\"                  },\n    {  \"KZ\",     \"Kazakhstan\"                      },\n    {  \"LA\",     \"Laos\"                            },\n    {  \"LB\",     \"Lebanon\"                         },\n    {  \"LC\",     \"Saint Lucia\"                     },\n    {  \"LI\",     \"Liechtenstein\"                   },\n    {  \"LK\",     \"Sri Lanka\"                       },\n    {  \"LR\",     \"Liberia\"                         },\n    {  \"LS\",     \"Lesotho\"                         },\n    {  \"LT\",     \"Lithuania\"                       },\n    {  \"LU\",     \"Luxembourg\"                      },\n    {  \"LV\",     \"Latvia\"                          },\n    {  \"LY\",     \"Libya\"                           },\n    {  \"MA\",     \"Morocco\"                         },\n    {  \"MC\",     \"Monaco\"                          },\n    {  \"MD\",     \"Moldova (Republic of)\"           },\n    {  \"MG\",     \"Madagascar\"                      },\n    {  \"MH\",     \"Marshall Islands\"                },\n    {  \"MK\",     \"Macedonia\"                       },\n    {  \"ML\",     \"Mali\"                            },\n    {  \"MM\",     \"Myanmar\"                         },\n    {  \"MN\",     \"Mongolia\"                        },\n    {  \"MO\",     \"Macau\"                           },\n    {  \"MP\",     \"Northern Mariana Islands\"        },\n    {  \"MQ\",     \"Martinique\"                      },\n    {  \"MR\",     \"Mauritania\"                      },\n    {  \"MS\",     \"Montserrat\"                      },\n    {  \"MT\",     \"Malta\"                           },\n    {  \"MU\",     \"Mauritius\"                       },\n    {  \"MV\",     \"Maldives\"                        },\n    {  \"MW\",     \"Malawi\"                          },\n    {  \"MX\",     \"Mexico\"                          },\n    {  \"MY\",     \"Malaysia\"                        },\n    {  \"MZ\",     \"Mozambique\"                      },\n    {  \"NA\",     \"Namibia\"                         },\n    {  \"NC\",     \"New Caledonia\"                   },\n    {  \"NE\",     \"Niger\"                           },\n    {  \"NF\",     \"Norfolk Island\"                  },\n    {  \"NG\",     \"Nigeria\"                         },\n    {  \"NI\",     \"Nicaragua\"                       },\n    {  \"NL\",     \"Netherlands\"                     },\n    {  \"NO\",     \"Norway\"                          },\n    {  \"NP\",     \"Nepal\"                           },\n    {  \"NR\",     \"Nauru\"                           },\n    {  \"NU\",     \"Niue\"                            },\n    {  \"NZ\",     \"New Zealand\"                     },\n    {  \"OM\",     \"Oman\"                            },\n    {  \"PA\",     \"Panama\"                          },\n    {  \"PE\",     \"Peru\"                            },\n    {  \"PF\",     \"French Polynesia\"                },\n    {  \"PG\",     \"Papua New Guinea\"                },\n    {  \"PH\",     \"Philippines\"                     },\n    {  \"PK\",     \"Pakistan\"                        },\n    {  \"PL\",     \"Poland\"                          },\n    {  \"PM\",     \"St. Pierre and Miquelon\"         },\n    {  \"PN\",     \"Pitcairn Island\"                 },\n    {  \"PR\",     \"Puerto Rico\"                     },\n    {  \"PT\",     \"Portugal\"                        },\n    {  \"PW\",     \"Palau\"                           },\n    {  \"PY\",     \"Paraguay\"                        },\n    {  \"QA\",     \"Qatar\"                           },\n    {  \"RE\",     \"Reunion Island\"                  },\n    {  \"RO\",     \"Romania\"                         },\n    {  \"RU\",     \"Russian Federation\"              },\n    {  \"RW\",     \"Rwanda\"                          },\n    {  \"SA\",     \"Saudi Arabia\"                    },\n    {  \"SB\",     \"Solomon Islands\"                 },\n    {  \"SC\",     \"Seychelles\"                      },\n    {  \"SD\",     \"Sudan\"                           },\n    {  \"SE\",     \"Sweden\"                          },\n    {  \"SG\",     \"Singapore\"                       },\n    {  \"SH\",     \"St. Helena\"                      },\n    {  \"SI\",     \"Slovenia\"                        },\n    {  \"SJ\",     \"Svalbard and Jan Mayen Islands.\" },\n    {  \"SK\",     \"Slovak Republic\"                 },\n    {  \"SL\",     \"Sierra Leone\"                    },\n    {  \"SM\",     \"San Marino\"                      },\n    {  \"SN\",     \"Senegal\"                         },\n    {  \"SO\",     \"Somalia\"                         },\n    {  \"SR\",     \"Suriname\"                        },\n    {  \"ST\",     \"Sao Tome and Principe\"           },\n    {  \"SU\",     \"Soviet Union\"                    }, /* NOTLISTED */\n    {  \"SV\",     \"El Salvador\"                     },\n    {  \"SY\",     \"Syrian Arab Republic\"            },\n    {  \"SZ\",     \"Swaziland\"                       },\n    {  \"TC\",     \"Turks and Caicos Islands\"        },\n    {  \"TD\",     \"Chad\"                            },\n    {  \"TF\",     \"French Southern Territories\"     },\n    {  \"TG\",     \"Togo\"                            },\n    {  \"TH\",     \"Thailand\"                        },\n    {  \"TJ\",     \"Tajikistan\"                      },\n    {  \"TK\",     \"Tokelau\"                         },\n    {  \"TM\",     \"Turkmenistan\"                    },\n    {  \"TN\",     \"Tunisia\"                         },\n    {  \"TO\",     \"Tonga\"                           },\n    {  \"TP\",     \"East Timor\"                      },\n    {  \"TR\",     \"Turkey\"                          },\n    {  \"TT\",     \"Trinidad and Tobago\"             },\n    {  \"TV\",     \"Tuvalu\"                          },\n    {  \"TW\",     \"Taiwan\"                          },\n    {  \"TZ\",     \"Tanzania\"                        },\n    {  \"UA\",     \"Ukraine\"                         },\n    {  \"UG\",     \"Uganda\"                          },\n    {  \"UK\",     \"United Kingdom\"                  },\n    {  \"UM\",     \"US Minor Outlying Islands\"       },\n    {  \"US\",     \"United States\"                   },\n    {  \"UY\",     \"Uruguay\"                         },\n    {  \"UZ\",     \"Uzbekistan\"                      },\n    {  \"VA\",     \"Vatican City State (Holy See)\"   },\n    {  \"VC\",     \"Saint Vincent & The Grenadines\"  },\n    {  \"VE\",     \"Venezuela\"                       },\n    {  \"VG\",     \"Virgin Islands (British)\"        },\n    {  \"VI\",     \"Virgin Islands (USA)\"            },\n    {  \"VN\",     \"Vietnam\"                         },\n    {  \"VU\",     \"Vanuatu\"                         },\n    {  \"WF\",     \"Wallis and Futuna Islands\"       },\n    {  \"WS\",     \"Western Samoa\"                   },\n    {  \"YE\",     \"Yemen\"                           },\n    {  \"YT\",     \"Mayotte\"                         },\n    {  \"YU\",     \"Yugoslavia\"                      },\n    {  \"ZA\",     \"South Africa\"                    },\n    {  \"ZM\",     \"Zambia\"                          },\n    {  \"ZW\",     \"Zimbabwe\"                        },\n    {  NULL,     NULL                              },\n};\n\n#define num_root_domains (sizeof (domain_codes) / sizeof (struct co_code))\n\n#define MIN_DOMAIN_LEN 2\n"
  },
  {
    "path": "src/file.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include <errno.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <pwd.h>\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"parse.h\"\n#ifdef HAVE_DIRENT_H\n#ifdef __LCC__\n#include \"../lcc/dirent.h\"\n#include <direct.h>\n#else\n#include <dirent.h>\n#endif\n#else\n#include <sys/dir.h>\n#endif\n#ifdef GDBM\n#include \"gdbm.h\"\n#endif\n#ifdef HAVE_LIBFNV\n/*\n** Since LCC won't use configure which moves fnv.h to this directory,\n** include it in its original location.\n*/\n#ifdef __LCC__\n#include \"fnv/fnv.h\"\n#else\n#include \"fnv.h\"\n#endif\n#endif /* HAVE_LIBFNV */\n\n/*\n** Does a file exist?\n*/\n\nint isfile(char *path)\n{\n    struct stat stbuf;\n\n    if (stat(path, &stbuf))\n\treturn 0;\n    return ((stbuf.st_mode & S_IFMT) == S_IFREG) ? 1 : 0;\n}\n\n/*\n** Does a directory exist?\n*/\n\nint isdir(char *path)\n{\n    struct stat stbuf;\n\n    if (stat(path, &stbuf))\n\treturn 0;\n    return ((stbuf.st_mode & S_IFMT) == S_IFDIR) ? 1 : 0;\n}\n\n/*\n** This tries to create and chmod a directory.\n*/\n\nvoid check1dir(char *dir)\n{\n    struct stat sbuf;\n\n    if (stat(dir, &sbuf)) {\n    /*\n    ** LCC only has the short mkdir().  Fortunately, we do a chmod\n    ** immediately afterward, so it's a don't care.\n    */\n#ifdef __LCC__\n\tif (errno != ENOENT || mkdir(dir) < 0) {\n#else\n\tif (errno != ENOENT || mkdir(dir, set_dirmode) < 0) {\n#endif\n            if (errno != EEXIST) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_CANNOT_CREATE_DIRECTORY], dir);\n\t\tprogerr(errmsg);\n\t    }\n\t}\n\tif (set_showprogress)\n\t\t\tprintf(\" %s \\\"%s\\\", %s %o.\\n\", lang[MSG_CREATING_DIRECTORY], dir, lang[MSG_MODE], set_dirmode);\n\n\tif (chmod(dir, set_dirmode) == -1) {\n\t\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\" to %o.\", lang[MSG_CANNOT_CHMOD], dir, set_dirmode);\n\t    progerr(errmsg);\n\t}\n    }\n}\n\n/*\n** This tries to create and chmod a path to a directory.\n*/\n\nvoid checkdir(char *dir)\n{\n    register char *p;\n    struct stat sbuf;\n    int ch;\n\n    p = dir;\n\n    if (*p && *p == '/')\t/* get off root */\n\tp++;\n\n    for (;; ++p) {\n\tif (!*p || *p == '/') {\n\t    ch = *p;\n\t    *p = '\\0';\n\t    if (stat(dir, &sbuf)) {\n\t    /* See comment in check1dir */\n#ifdef __LCC__\n\t\tif (errno != ENOENT || mkdir(dir) < 0) {\n#else\n\t\tif (errno != ENOENT || mkdir(dir, set_dirmode) < 0) {\n#endif\n\t\t    if (errno != EEXIST) {\n\t\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_CANNOT_CREATE_DIRECTORY], dir);\n\t\t\tprogerr(errmsg);\n\t\t    }\n\t\t}\n\t\tif (set_report_new_folder) {\n\t\t    printf(\"%s\\n\", dir);\n\t\t}\n\t\tif (set_showprogress)\n\t\t    printf(\" %s \\\"%s\\\", %s %o.\\n\", lang[MSG_CREATING_DIRECTORY], dir, lang[MSG_MODE], set_dirmode);\n\n\t\tif (chmod(dir, set_dirmode) == -1) {\n\t\t    snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\" to %o.\", lang[MSG_CANNOT_CHMOD], dir, set_dirmode);\n\t\t    progerr(errmsg);\n\t\t}\n\t    }\n\t    *p = ch;\n\t    if (!*p)\n\t\tbreak;\n\t}\n    }\n}\n\nchar *getfilecontents(char *filename)\n{\n    FILE *infile;\n    struct stat finfo;\n    char *retval;\n\n    if ((infile = fopen(filename, \"r\")) == NULL)\n\treturn (NULL);\n\n    if (fstat(fileno(infile), &finfo) != 0) {\n\t(void)fclose(infile);\n\treturn (NULL);\n    }\n\n    if (finfo.st_size == 0) {\n\t(void)fclose(infile);\n\treturn (NULL);\n    }\n\n    else {\n\tif (!(retval = (char *)malloc((unsigned)finfo.st_size + 1))) {\n\t    (void)fclose(infile);\n\t    return (NULL);\n\t}\n\tif (!fread(retval, (size_t) finfo.st_size, 1, infile)) {\n\t    (void)fclose(infile);\n\t    free(retval);\n\t    return (NULL);\n\t}\n\t*(retval + finfo.st_size) = '\\0';\n    }\n    (void)fclose(infile);\n    return (retval);\n}\n\n\n/*\n** expand_path - fill in values substituting for magic cookies\n**\n**      Substitution cookies supported\n**\n**              %d - two digit day of month (1-28/30/31)\n**              %D - three letter day of the week\n**              %m - two digit month of year (1-12)\n**              %M - three letter month of year (Jan, Feb, ..., Dec)\n**              %y - four digit year (1990,..2001)\n**\n** Returns:   expanded path string\n*/\n\nchar *dirpath(char *frmptr)\n{\n    register char *aptr;\n    char dtstr[DATESTRLEN];\n    char c;\n    struct tm *now;\n    time_t clk;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    clk = time((time_t *)0);\n    now = localtime(&clk);\n\n    aptr = frmptr;\n\n    while ((c = *aptr++)) {\n\tif (c == '%') {\n\t    switch (*aptr++) {\n\t    case '%':\t\t/* Add the % character */\n\t\tPushByte(&buff, '%');\n\t\tcontinue;\n\t    case 'd':\t\t/* two digit day of month (1-31) */\n\t\tsprintf(dtstr, \"%.2d\", now->tm_mday);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'D':\t\t/* three letter day of week */\n\t\tPushString(&buff, days[now->tm_wday]);\n\t\tcontinue;\n\t    case 'j':\t\t/* julian date */\n\t\tsprintf(dtstr, \"%.3d\", now->tm_yday);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'm':\t\t/* two digit month of year (1-12) */\n\t\tsprintf(dtstr, \"%.2d\", now->tm_mon + 1);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'M':\t\t/* three letter month of year */\n\t\tPushString(&buff, months[now->tm_mon]);\n\t\tcontinue;\n\t    case 'y':\t\t/* 4 digit year */\n\t\tsprintf(dtstr, \"%.4d\", now->tm_year + 1900);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    default:\n\t\tPushString(&buff, \"%?\");\n\t\tcontinue;\n\t    }\t\t\t/* end switch */\n\t}\n\n\tPushByte(&buff, c);\n    }\t\t\t\t/* end while */\n\n    RETURN_PUSH(buff);\n}\n\n/*\n** Reads a configuration file if it exists and puts all the right\n** values into the right variables.\n*/\n\nvoid readconfigs(char *path, int cmd_show_variables)\n{\n    if (path && path[0] == '~') {\n    \tchar *ep; \n\tchar tmppath[MAXFILELEN]; /*AUDIT biege: pathname + filename is more then 4KB long on linux */\n        struct passwd *pp;\n\n#ifndef __LCC__\n\t/*\n\t** Getting password data from /etc/passwd is pretty silly in\n\t** Win9x systems since nearly everybody builds this file after\n\t** they set up $HOME.  Just skip this try at finding a default\n\t** location for the config file and go on to try $HOME.\n\t*/\n        if ((pp = getpwuid(getuid())) != NULL) {\n\t\t\tsnprintf(tmppath, sizeof(tmppath), \"%s%s\", pp->pw_dir, path + 1);\t/* AUDIT biege: who gurantees that path+1 contains data? */\n            ConfigInit(tmppath);\n        } \n\telse\n#endif\n            if ((ep = getenv(\"HOME\")) != NULL) { /* AUDIT biege: possible BOF.. but it's not setuid.. so why to care? */\n\t\t\tsnprintf(tmppath, sizeof(tmppath), \"%s%s\", ep, path + 1);\t/* AUDIT biege: who gurantees that path+1 contains data? */\n            ConfigInit(tmppath);\n        }\n        /* \n         * So what happens here if the above two conditions fail ????\n         * Simply use the compiled in defaults ?\n         */\n    }    \n    else {\n\tConfigInit(path);\n\n\tif (set_showprogress && !cmd_show_variables)\n\t    printf(\"%s: %s\\n\", lang[MSG_PATH], path);\n    }\n}\n\nvoid symlink_latest()\n{\n    /*\n    ** Symlinks work so differently in Windows that I think we'll just\n    ** skip that whole thing and ignore that option.\n    */\n#ifdef __LCC__\n    snprintf(errmsg, sizeof(errmsg),\n\t\"WARNING: latest_folder not supported in Win32 environment.\\n\");\n    fprintf(stderr, \"%s\", errmsg);\n#else\n    char filename[MAXFILELEN];\n    \n    struct stat stbuf;\n\n    if (!latest_folder_path)\n\treturn;\t\t\t/* haven't created new folder this time? */\n    trio_snprintf(filename, MAXFILELEN, \"%s%s\", set_dir, set_latest_folder);\n\n    if (!stat(filename, &stbuf) && unlink(filename)) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\" (latest_folder option).\", lang[MSG_CANNOT_UNLINK], filename);\n\tprogerr(errmsg);\n\treturn;\n    }\n\n    if (symlink(latest_folder_path, filename)) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\" (latest_folder option).\", lang[MSG_CANNOT_CREATE_SYMLINK], filename);\n\tprogerr(errmsg);\n\treturn;\n    }\n#endif\n}\n\nint find_max_msgnum()\n{\n    DIR *dir;\n#ifdef HAVE_DIRENT_H\n    struct dirent *entry;\n#else\n    struct direct *entry;\n#endif\n    int max_num = -1;\n    int num;\n    char *s_dir = strsav(set_dir);\n    int len = (int)strlen(s_dir);\n\n    if (len > 0 && s_dir[len - 1] == PATH_SEPARATOR)\n       s_dir[len - 1] = 0;\n    dir = opendir(s_dir);\n    if (dir == NULL)\n\treturn -1;\n#ifdef GDBM\n    if (set_folder_by_date && set_usegdbm) {\n\treturn loadoldheadersfromGDBMindex(set_dir, 1) - 1;\n    }\n#endif\n    if (set_msgsperfolder) {\n        int max_folder = -1;\n\tchar *tmpptr;\n\twhile ((entry = readdir(dir))) {\n\t    const char *p = entry->d_name;\n\t    while (isdigit(*p))\n\t        ++p;\n\t    if (!*p && p > entry->d_name) {\n\t        num = atoi(entry->d_name);\n\t\tif (num > max_folder) {\n\t\t    char *full_path;\n\t\t    trio_asprintf(&full_path, \"%s%d\", set_dir, num);\n\t\t    if (isdir(full_path))\n\t\t        max_folder = num;\n\t\t    free(full_path);\n\t\t}\n\t    }\n\t}\n\tclosedir(dir);\n\ttrio_asprintf(&tmpptr, \"%s%d\", set_dir, max_folder);\n\tfree(s_dir);\n\ts_dir = tmpptr;\n\tif (max_folder == -1)\n\t    return -1;\n\tdir = opendir(s_dir);\n\tif (dir == NULL) {\n\t\t\tsnprintf(errmsg, sizeof(errmsg), \"internal error find_max_msgnum opening \\\"%s\\\".\", s_dir);\n\t    progerr(errmsg);\n\t}\n    }\n    while ((entry = readdir(dir))) {\n\tconst char *p = entry->d_name;\n\twhile (isdigit(*p))\n\t    ++p;\n\tif (*p == '.' && p >= entry->d_name + 4) {\n\t    ++p;\n\t    if (!strcmp(p, set_htmlsuffix)) {\n\t        num = atoi(entry->d_name);\n\t\tif (num > max_num)\n\t\t    max_num = num;\n\t    }\n\t}\n    }\n    closedir(dir);\n    free(s_dir);\n    return max_num;\n}\n\n/*\n** Returns a buffer with  the name of the message index name file.\n** The caller has to free this buffer.\n*/\n\nchar *messageindex_name(void)\n{\n  char *buf;\n\n\ttrio_asprintf(&buf, \"%s%s\", set_dir, \"msgindex\");\n  return (buf);\n}\n\n/*\n** Returns the corresponding message number from the messageindex file.\n*/\nint find_max_msgnum_id()\n{\n    int max_num = -1;\n\n    FILE *fp;\n    char line[MAXLINE];\n    int maxnum;\n    int startnum;\n    char *buf;\n    \n    /* open the index file */\n    buf = messageindex_name();\n    fp = fopen(buf, \"r\");\n    free(buf);\n    if (fp) {\n        fgets(line, sizeof(line), fp);\n        if (2 == sscanf(line, \"%04d %04d\", &startnum, &maxnum))\n        max_num = maxnum;\n        fclose(fp);\n    }\n    return max_num;\n}\n\n/* \n** Get a list of msgid corresponding to hypermail msg numbers\n*/\nchar **read_msgnum_id_table(int max_num)\n{\n    char **table;\n    int read_msgs;\n    FILE *fp;\n    char line[MAXLINE];\n    char *buf;\n\n    if (max_num == -1)\n      return NULL;\n\n\ttable = (char **)calloc(sizeof(char *), max_num + 1);\n\n    /* open the index file */\n\tbuf = messageindex_name();\n\tfp = fopen(buf, \"r\");\n\tfree(buf);\n\n    /* skip the max_msgnum (first) line */\n\tfgets(line, sizeof(line), fp);\n\n    read_msgs = 0;\n\twhile (fgets(line, sizeof(line), fp) && read_msgs <= max_num) {\n\tchar *msgid;\n\tint num;\n\t\tmsgid = malloc(strlen(line) + 1);\n\t\tsscanf(line, \"%d %s\\n\", &num, msgid);\n\t/* was the message skipped? */\n\t\tif (read_msgs < num) {\n\t\t\twhile (read_msgs < num) {\n\t\ttable[read_msgs] = NULL;\n\t\tread_msgs++;\n\t      }\n\t  }\n\ttable[read_msgs] = msgid;\n\tread_msgs++;\n      }\n\tfclose(fp);\n    \n    return table;\n}\n\n/* \n** Frees the table used to store the msgnum id correspondance\n*/\nvoid free_msgnum_id_table(char *table[], int max_num)\n{\n  int i;\n\n  if (!table)\n    return;\n\n  for (i = 0; i < max_num; i++)\n    if (table[i])\n\t\t\tfree(table[i]);\n\tfree(table);\n}\n\nint is_empty_archive()\n{\n    DIR *dir;\n#ifdef HAVE_DIRENT_H\n    struct dirent *entry;\n#else\n    struct direct *entry;\n#endif\n    int num_files = 0;\n    char *s_dir = strsav(set_dir);\n    int len = (int)strlen(s_dir);\n    if (len > 0 && s_dir[len - 1] == PATH_SEPARATOR)\n        s_dir[len - 1] = 0;\n    dir = opendir(s_dir);\n    if (dir == NULL)\n\treturn 1;\n    while ((entry = readdir(dir))) {\n\tconst char *p = entry->d_name;\n\tif (*p != '.') {\n\t    ++num_files;\n\t    break;\n\t}\n    }\n    closedir(dir);\n    free(s_dir);\n    return num_files == 0;\n}\n\nstatic char *msgsperfolder_label(char *frmptr, int subdir_no)\n{\n    register char *aptr;\n    char dtstr[DATESTRLEN];\n    char c;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    aptr = frmptr;\n\n    while ((c = *aptr++)) {\n\tif (c == '%') {\n\t    switch (*aptr++) {\n\t    case '%':\t\t/* Add the % character */\n\t\tPushByte(&buff, '%');\n\t\tcontinue;\n\t    case 'd':\t\t/* directory number, starting at 0 */\n\t\tsprintf(dtstr, \"%d\", subdir_no);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'D':\t\t/* directory number, starting with 1 */\n\t\t\t\tsprintf(dtstr, \"%d\", subdir_no + 1);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'm':\t\t/* number of first message in directory */\n\t\t\t\tsprintf(dtstr, \"%d\", set_msgsperfolder * subdir_no);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    case 'M':\t\t/* number of last message possible */\n\t\t\t\tsprintf(dtstr, \"%d\", set_msgsperfolder * (subdir_no + 1) - 1);\n\t\tPushString(&buff, dtstr);\n\t\tcontinue;\n\t    default:\n\t\tPushString(&buff, \"%?\");\n\t\tcontinue;\n\t    }\t\t\t/* end switch */\n\t}\n\n\tPushByte(&buff, c);\n    }\t\t\t\t/* end while */\n\n    RETURN_PUSH(buff);\n}\n\nstruct emailsubdir *msg_subdir(int msgnum, time_t date)\n{\n    static struct emailsubdir *last_subdir;\n    static struct emailsubdir *subdir;\n    char s[DATESTRLEN];\n    char desc_buf[DATESTRLEN];\n    char *desc = NULL;\n    char *fmt = set_describe_folder;\n    if (set_msgsperfolder > 0) {\n\tint subdir_no = msgnum / set_msgsperfolder;\n\ttrio_snprintf(s, DATESTRLEN, \"%d/\", subdir_no);\n\tif (!fmt)\n\t    fmt = \"%d\";\n\tdesc = msgsperfolder_label(fmt, subdir_no);\n    }\n    else if (set_folder_by_date) {\n\tstrftime(s, DATESTRLEN - 1, set_folder_by_date, localtime(&date));\n\tif (!fmt)\n\t    fmt = set_folder_by_date;\n\tstrftime(desc_buf, DATESTRLEN, fmt, localtime(&date));\n\tdesc = strsav(desc_buf);\n\n\tif (s[0] && s[strlen(s) - 1] != '/')\n\t    strcat(s, \"/\");\n    }\n    else\n\treturn NULL;\n    subdir = last_subdir;\n    if (!last_subdir || strcmp(s, last_subdir->subdir)) {\n\tsubdir = new_subdir(s, last_subdir, desc, date);\n\tif (set_increment != -1)\n\t    last_subdir = subdir;\n    }\n    if (desc)\n      free(desc);\n    return subdir;\n}\n\n/*\n** Returns the filename we want to use. According to the convention, this\n** can be the msgnumber, the msgid, or some other kind of name. \n*/\nchar *message_name (struct emailinfo *email)\n{\n  static char buffer[8 + sizeof (time_t) * 2 + 1];\n\n#ifdef HAVE_LIBFNV\n  if (set_nonsequential && email->msgid)\n    {\n      /* Call the FNV msg hash library */\n      Fnv32_t hash_val; \n\n      hash_val = fnv_32_buf(email->msgid, strlen (email->msgid), FNV1_32_INIT);\n      /* the line below is what we used before when the hash included\n\t the fromdate string, and we didn't concatenate the mail date.\n\t However, we changed strategies to avoid collisions. */\n      /* hash_val = fnv_32_str(email->fromdatestr, hash_val); */\n      sprintf (buffer, \"%08x%08x\", hash_val, email->fromdate);\n\n      return buffer;\n    }\n  else\n    {\n#endif /* HAVE_LIBFNV */\n      sprintf (buffer, \"%.4d\", email->msgnum);\n      return buffer;\n#ifdef HAVE_LIBFNV\n    }\n#endif /* HAVE_LIBFNV */\n}\n\n/*\n * returns \"<a href=...>\" that links to to_email from the directory of\n * from_email, or from the set_dir directory if email is NULL.\n */\n\nchar *msg_href(struct emailinfo *to_email, struct emailinfo *from_email, bool generate_markup)\n/* note: you probably have to make a copy of\n * the buffer returned before the next call to this function.\n */\n{\n    static char buffer[MAXFILELEN + 11];\n    char *ptr;\n\n    ptr = msg_relpath(to_email, from_email);\n    if (generate_markup)\n      trio_snprintf(buffer, MAXFILELEN + 11, \"<a href=\\\"%s\\\">\", \n\t\t    ptr);\n    else\n      trio_snprintf(buffer, MAXFILELEN + 11, \"%s\", ptr);\n\n    return buffer;\n}\n\n\nchar *msg_relpath(struct emailinfo *to_email, struct emailinfo *from_email)\n/* called by msg_href() : note: you probably have to make a copy of\n * the buffer returned before the next call to this function.\n */\n{\n    static char buffer[MAXFILELEN];\n    char *name;\n\n    name = message_name(to_email);\n\n    if (!from_email && to_email->subdir)\n\ttrio_snprintf(buffer, MAXFILELEN, \"%s%s.%s\", to_email->subdir->subdir, name, set_htmlsuffix);\n    else if (!to_email->subdir || to_email->subdir == from_email->subdir)\n\ttrio_snprintf(buffer, MAXFILELEN, \"%s.%s\", name, set_htmlsuffix);\n    else\n\ttrio_snprintf(buffer, MAXFILELEN, \"%s%s%s.%s\", to_email->subdir->rel_path_to_top, to_email->subdir->subdir, name, set_htmlsuffix);\n\n    return buffer;\n}\n\nchar *articlehtmlfilename(struct emailinfo *email)\n{\n    char *buf;\n    char *name;\n\n    name = message_name(email);\n\n    trio_asprintf(&buf, \"%s%s.%s\", email->subdir ? email->subdir->full_path : set_dir, name, set_htmlsuffix);\n    return buf;\n}\n\nchar *htmlfilename(const char *file, struct emailinfo *email, const char *suffix)\n{\n    char *buf;\n\n    trio_asprintf(&buf, \"%s%s%s%s\", email && email->subdir ? email->subdir->full_path : set_dir, file, *suffix ? \".\" : \"\", suffix);\n\n    return buf;\n}\n\nchar *haofname(struct emailinfo *email)\n{\n    char *buf;\n\n    trio_asprintf(&buf, \"%s%s\", email && email->subdir ? email->subdir->full_path : set_dir, HAOF_NAME);\n\n    return buf;\n\n}\n\n/* matches_existing returns 0 if it finds a file with the same msgnum as\n argument eptr but different contents. A return value of 1 does not\n guarantee that they match, it only says a difference wasn't found\n (which can mean that no file was found). \n*/\n\nint matches_existing(int msgnum)\n{\n  struct emailinfo *eptr;\n  if (hashnumlookup(msgnum, &eptr) == NULL)\n      return -1;\n\n#ifdef GDBM\n  if (set_usegdbm) {\n      char *indexname;\n      GDBM_FILE gp;\n      int num;\n\n      trio_asprintf(&indexname, \"%s%s\", set_dir, GDBM_INDEX_NAME);\n\n      if ((gp = gdbm_open(indexname, 0, GDBM_READER, 0, 0))) {\n\n\t/* we _can_ read the index */\n\n\tdatum content;\n\tdatum key;\n\tint max_num;\n\n\tkey.dptr = (char *)&num;\n\tkey.dsize = (int)sizeof(num);\n\n\tnum = -1;\n\tcontent = gdbm_fetch(gp, key);\n\tif (!content.dptr)\n\t    max_num = -1;\n\telse\n\t    max_num = atoi(content.dptr);\n\n\tif (eptr->msgnum <= max_num) {\n\t  char *dp, *dp_end;\n\t  char *name = NULL;\n\t  char *email = NULL;\n\t  char *date = NULL;\n\t  char *msgid = NULL;\n\t  char *fromdate = NULL;\n\n\t  num = eptr->msgnum;\n\t  key.dptr = (char *)&num;\n\t  key.dsize = (int)sizeof(num);\n\t  content = gdbm_fetch(gp, key);\n\t  if (!(dp = content.dptr)) {\n\t      return 1;\n\t  }\n\t  dp_end = dp + content.dsize;\n\t  fromdate = dp;\n\t  dp += strlen(dp) + 1;\n\t  date = dp;\n\t  dp += strlen(dp) + 1;\n\t  name = dp;\n\t  dp += strlen(dp) + 1;\n\t  email = dp;\n\t  dp += strlen(dp) + 1;\n\t  dp += strlen(dp) + 1;\n\t  msgid = dp;\n\n\t  if (strcmp(msgid, eptr->msgid))\n\t      return 0;\n\t}\n\n\tgdbm_close(gp);\n      } /* end case of able to read gdbm index */\n\n      free(indexname);\n  }  \n#endif\n  if (!set_usegdbm) {\n\tint msgids_are_same;\n\tmsgids_are_same = parse_old_html(msgnum, eptr, 0, 0, NULL, 1);\n\treturn msgids_are_same != 0;\n  }\n  return 1;\n}\n"
  },
  {
    "path": "src/finelink.c",
    "content": "/*\n** Copyright (C) 1997, Peter McCluskey (pcm@rahul.net)\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include \"hypermail.h\"\n#include \"finelink.h\"\n#include \"print.h\"\n#include \"struct.h\"\n#include \"search.h\"\n#include \"setup.h\"\n#include \"proto.h\"\n#include <string.h>\n#include <ctype.h>\n\nstatic int str_similar_str(const char *str1, const char *str2);\nstatic char *stripwhitespace(const char *line);\nstatic int new_reply_to = -1;\n\nstatic int found_quote = 0;\n\nstatic char *get_path(struct emailinfo *ep, struct emailinfo *ep2)\n{\n    char *path = \"\";\n    if (ep2->subdir && ep2->subdir != ep->subdir)\n       trio_asprintf(&path, \"%s%s\", ep2->subdir->rel_path_to_top, ep2->subdir->subdir);\n    return path;\n}\n\nstatic struct body *place_anchor(const String_Match * match_info, \n                                 struct body *bp, char *buffer, FILE *fp2, \n                                 char **ptr, const char *anchor)\n{\n    if (match_info) {\n\tint index;\n\tchar token[MAXLINE];\n\tchar *tptr;\n\tchar *ptr1 = buffer;\n\tchar *last_ptr0 = *ptr;\n\tchar *penultimate_ptr0 = last_ptr0;\n\tchar *last_ptr = ptr1;\n\tchar *penultimate_ptr = ptr1;\n\tif (!bp)\n\t    return FALSE;\n\twhile ((bp = tokenize_body(bp, token, ptr, &index, TRUE)) != NULL) {\n\t    if (*ptr == match_info->start_match) {\n\t\tstrcpy(token, last_ptr);\n\t\t*last_ptr = 0;\n\t\tfprintf(fp2, \"%s<a name=\\\"%s\\\">\", buffer, anchor);\n\t\tstrcpy(buffer, token);\n\t\t*ptr = last_ptr0;\n\t\treturn bp;\n\t    }\n\t    penultimate_ptr = ptr1;\n\t    last_ptr = penultimate_ptr;\n\t    last_ptr0 = penultimate_ptr0;\n\t    penultimate_ptr0 = *ptr;\n\n\t    if (!(tptr = strstr(ptr1, *ptr))) {\n\t\tint len = (4 * strlen(*ptr)) / 5;\n\t\tchar *temp1 = (char *)emalloc(len + 1);\n\t\tstrncpy(temp1, *ptr, len);\n\t\ttemp1[len] = 0;\n\t\ttptr = strstr(ptr1, temp1);\n\t\tfree(temp1);\n\t\tif (!tptr)\n\t\t    break;\n\t    }\n\t    ptr1 = tptr;\n\t    while (ispunct(*ptr1) && *ptr1 != '<')\n\t\t++ptr1;\n\t}\n\tif (0)\n\t    printf(\"No match found %s; %s\", anchor, buffer);\n    }\n    fprintf(fp2, \"<a name=\\\"%s\\\">\", anchor);\n    return bp;\n}\n\nstatic int place_a_end(const String_Match * match_info, struct body **bp, char *buffer, FILE *fp2, char **ptr)\n{\n    int index;\n    char token[MAXLINE];\n    char *ptr1 = buffer;\n    char *last_ptr = ptr1;\n    char *tptr;\n    if (!*bp)\n\treturn FALSE;\n    while ((*bp = tokenize_body(*bp, token, ptr, &index, TRUE)) != NULL) {\n\tif (*ptr == match_info->stop_match) {\n\t    strcpy(token, ptr1);\n\t    *ptr1 = 0;\n\t    fprintf(fp2, \"%s</a>%s\", buffer, token);\n\t    return TRUE;\n\t}\n\tlast_ptr = ptr1;\n\tif (!(tptr = strstr(ptr1, *ptr))) {\n\t    int len = (4 * strlen(*ptr)) / 5;\n\t    char *temp1 = (char *)emalloc(len + 1);\n\t    strncpy(temp1, *ptr, len);\n\t    temp1[len] = 0;\n\t    tptr = strstr(ptr1, temp1);\n\t    free(temp1);\n\t    if (!tptr)\n\t\treturn FALSE;\n\t}\n\tptr1 = tptr;\n\twhile (ispunct(*ptr1) && *ptr1 != '<')\n\t    ++ptr1;\n    }\n    return FALSE;\n}\n\n/*\n** Alter the message being quoted to add an anchor specifying the quoted text\n*/\n\nstatic int add_anchor(int msgnum, int quoting_msgnum, int quote_num, const char *anchor, char *line, int find_substr, int count_quoted_lines, const String_Match * match_info)\n{\n    char *filename;\n    char *tmpfilename;\n    char buffer[MAXLINE];\n    FILE *fp1, *fp2;\n    int matches = 0;\n    int in_body = FALSE;\n    int cmp_len = strlen(line);\n    struct emailinfo *ep;\n    struct body *bp = hashnumlookup(msgnum, &ep);\n    char *ptr;\n    char *tmpptr;\n    while (bp && (!strncmp(bp->line, \"Date:\", 5)\n\t\t  || !strncmp(bp->line, \"From:\", 5)\n\t\t  || !strncmp(bp->line, \"From:\", 5)\n\t\t  || !strncasecmp(bp->line, \"Message-Id:\", 11)\n\t\t  || !strncmp(bp->line, \"Subject:\", 8)\n\t\t  || !strncasecmp(bp->line, \"In-Reply-To:\", 12)\n\t\t  || !strncasecmp(bp->line, \"References:\", 11)\n\t\t  || !strncmp(bp->line, \"To:\", 3)))\n\tbp = bp->next;\t\t/* skip over header info */\n    ptr = bp ? bp->line : NULL;\n    while (ptr && !*ptr) {\n\tbp = bp->next;\n\tif (!bp)\n\t    break;\n\tptr = bp->line;\n    }\n    filename = articlehtmlfilename(ep);\n    if ((fp1 = fopen(filename, \"r\")) == NULL) {\n\tfree(filename);\n\tif (msgnum > quoting_msgnum)\n\t    return 0;\t\t/* just a forward ref */\n\tif (set_showprogress)\n\t\t\tfprintf(stderr, \"Couldn't read message number %d (linked from %d). \" \"May mean message deleted with delete_level = 0.\\n\", msgnum, quoting_msgnum);\n\treturn -1;\n    }\n    tmpfilename = htmlfilename(\"tmp\", ep, \"tmp\");\t/* AUDIT biege: where is the tmp-file created? cwd? what about checking the return-value */\n    if ((fp2 = fopen(tmpfilename, \"w\")) == NULL) {\n\tsnprintf(errmsg, sizeof(errmsg), \"Couldn't write \\\"%s\\\".\", tmpfilename);\n\tprogerr(errmsg);\n    }\n    while (fgets(buffer, sizeof(buffer), fp1)) {\n\tif ((find_substr && str_similar_str(buffer, line))\n\t    || (!find_substr && !strncmp(buffer, line, cmp_len))) {\n\t    int wrote_a_end = FALSE;\n\t    ++matches;\n\t    bp = place_anchor(match_info, bp, buffer, fp2, &ptr, anchor);\n\t    if (set_link_to_replies) {\n\t        struct emailinfo *ep2;\n\t\tif (hashnumlookup(quoting_msgnum, &ep2)) {\n\t\t    char *path = get_path(ep, ep2);\n\t\t\t\t\tfprintf(fp2, \"<a href=\\\"%s%.4d.%s#qlink%d\\\">%s</a>\", path, quoting_msgnum, set_htmlsuffix, quote_num, set_link_to_replies);\n\t\t    if (*path)\n\t\t        free(path);\n\t\t}\n\t    }\n\t    /* Now find end of quoted text: */\n\t    do {\n\t\tif (!strcmp(buffer, \"<!-- body=\\\"end\\\" -->\\n\")) {\n\t\t    count_quoted_lines = -1;\n\t\t    break;\t/* reply quoted more lines than exist? */\n\t\t}\n\t\tif (match_info && place_a_end(match_info, &bp, buffer, fp2, &ptr)) {\n\t\t    wrote_a_end = TRUE;\n\t\t    count_quoted_lines = 0;\n\t\t    if (bp)\n\t\t\tbp = bp->next;\n\t\t    if (bp)\n\t\t\tptr = bp->line;\n\t\t    break;\n\t\t}\n\t\tfputs(buffer, fp2);\n\t\t/* suppress decrement for lines inserted by html conversion: */\n\t\tif (!strcasecmp(buffer, \"<p>\\n\"))\n\t\t    ++count_quoted_lines;\n\t\telse {\n\t\t    char *tptr = remove_hypermail_tags(buffer);\n\t\t    if (tptr)\n\t\t\tfree(tptr);\n\t\t    else\n\t\t\t++count_quoted_lines;\n\t\t}\n\t    } while (--count_quoted_lines > 0 && fgets(buffer, sizeof(buffer), fp1));\n\t    if (!wrote_a_end)\n\t\tfputs(\"</a>\", fp2);\n\t    if (count_quoted_lines > 0)\t/* got eof? */\n\t\tbreak;\t\t/* avoid last fputs */\n            else if (count_quoted_lines == 0 && !fgets(buffer, sizeof(buffer), fp1))\n\t\tbreak;\n\t}\n\telse if (in_body && bp && (tmpptr = remove_hypermail_tags(buffer))) {\n\t    char *tmpptr2 = unconvchars(tmpptr);\n\t    if (tmpptr2 && str_similar_str(tmpptr, bp->line))\n\t\tbp = bp->next;\n\t    if (bp)\n\t\tptr = bp->line;\n\t    if (tmpptr2)\n\t\tfree(tmpptr2);\n\t    free(tmpptr);\n\t}\n\telse if (!in_body && !strcmp(buffer, \"<!-- body=\\\"start\\\" -->\\n\"))\n\t    in_body = TRUE;\n\tfputs(buffer, fp2);\n    }\n\n    fclose(fp1);\n    fclose(fp2);\n\n    if (matches != 1)\n\tremove(tmpfilename);\n    else {\n\tif (rename(tmpfilename, filename) == -1) {\n\t    snprintf(errmsg, sizeof(errmsg), \"Couldn't rename \\\"%s\\\" to %s.\", tmpfilename, filename);\n\t    progerr(errmsg);\n\t}\n\tif (chmod(filename, set_filemode) == -1) {\n\t    snprintf(errmsg, sizeof(errmsg), \"Couldn't chmod \\\"%s\\\" to %o.\", filename, set_filemode);\n\t    progerr(errmsg);\n\t}\n    }\n    free(filename);\n    free(tmpfilename);\n    return matches == 1;\n}\n\nstatic char *unquote_and_strip(char *line)\n{\n    char *p = unquote(line);\n    char *p2;\n    char *cvtd_line;\n    while (*p && isspace(*p))\n\t++p;\n    cvtd_line = (char *)emalloc(strlen(p) + 1);\n    strcpy(cvtd_line, p);\n    p2 = cvtd_line + strlen(cvtd_line);\n    if (p2 > cvtd_line && p2[-1] == '\\n')\n\t*--p2 = 0;\n    if (p2 > cvtd_line && *--p2 == '-')\n\t*p2 = 0;\t\t/* don't demand trailing '-' in searches; may have been unhyphenated */\n    return cvtd_line;\n}\n\n/*\n** Find URL of the message this line of quoted text was taken from\n*/\n\nstatic char *url_replying_to(struct emailinfo *email, char *line1,\t/* first line of quoted text, with html */\n\t\t\t     const char *line2,\t/* first line of quoted text, w/o html */\n\t\t\t     const struct body *bp, int quote_num, int *quoting_msgnum, int count_quoted_lines, int maybe_reply)\n{\n    String_Match match_info;\n    char *p;\n    int subjmatch = 0;\n    char *anchor;\n    struct emailinfo *ep;\n\tint statusnum = hashreplynumlookup(*quoting_msgnum, email->inreplyto, email->subject,\n\t\t\t   &subjmatch);\n    hashnumlookup(*quoting_msgnum, &ep);\n    trio_asprintf(&anchor, \"%.4dqlink%d\", *quoting_msgnum, quote_num);\n    if (statusnum != -1) {\n\tstruct emailinfo *ep2;\n\thashnumlookup(statusnum, &ep2);\n\t\tif (add_anchor(statusnum, *quoting_msgnum, quote_num, anchor, line1, 0, count_quoted_lines, NULL)) {\n\t    char *path = get_path(ep, ep2);\n\t    char *buf;\n\t\t\ttrio_asprintf(&buf, \"%s%.4d.%s#%s\", path, statusnum, set_htmlsuffix, anchor);\n\t    if (maybe_reply)\n\t\tset_new_reply_to(statusnum, strlen(line2));\n\t    if (*path)\n\t        free(path);\n\t    free(anchor);\n\t    return buf;\n\t}\n\tif (strlen(line2) > 6 && (p = strstr(line2, \"...\"))) {\n\t    char *parsed;\n\t    char *tptr = (char *)emalloc(p - line2 + 1 + strlen(p + 3));\t/* AUDIT biege: IOF unlikely */\n\t    strncpy(tptr, line2, p - line2);\n\t    strcpy(tptr + (p - line2), p + 3);\n\t    parsed = ConvURLsString(tptr, email->msgid, email->subject, email->charset);\n\t    free(tptr);\n\t    tptr = stripwhitespace(parsed ? parsed : \"\");\n\t    if (parsed)\n\t\tfree(parsed);\n\t\t\tif (add_anchor(statusnum, *quoting_msgnum, quote_num, anchor, tptr, 1, count_quoted_lines, NULL)) {\n\t        char *path = get_path(ep, ep2);\n\t\tchar *buf;\n\t\t\t\ttrio_asprintf(&buf, \"%s%.4d.%s#%s\", path, statusnum, set_htmlsuffix, anchor);\n\t\tfree(tptr);\n\t\tif (maybe_reply)\n\t\t    set_new_reply_to(statusnum, strlen(buf));\n\t\tif (*path)\n\t            free(path);\n\t\tfree(anchor);\n\t\treturn buf;\n\t    }\n\t    free(tptr);\n\t}\n    }\n    {\n\tint i;\n\tstruct Push full_line;\n\tstruct Push exact_line;\n\tINIT_PUSH(full_line);\n\tINIT_PUSH(exact_line);\n\tPushString(&full_line, p = stripwhitespace(line2));\n\tfree(p);\n\tPushString(&exact_line, line2);\n\tfor (i = 1; i < count_quoted_lines && (bp = bp->next); ++i) {\n\t    char *stripped = unquote_and_strip(bp->line);\n\t    PushByte(&full_line, '\\n');\n\t    PushString(&full_line, p = stripwhitespace(stripped));\n\t    free(p);\n\t    free(stripped);\n\t    PushString(&exact_line, unquote(bp->line));\n\t}\n\t\tsearch_for_quote(PUSH_STRING(full_line), PUSH_STRING(exact_line), *quoting_msgnum, &match_info);\n\tfree(PUSH_STRING(full_line));\n\tfree(PUSH_STRING(exact_line));\n    }\n    if (match_info.msgnum >= 0) {\n\t\tchar *parsed = ConvURLsString(match_info.last_matched_string, email->msgid,\n\t\t\t   email->subject, email->charset);\n\tif (parsed) {\n\t    char *parsed2 = stripwhitespace(parsed);\n\t    free(parsed);\n\t    if (add_anchor(match_info.msgnum, *quoting_msgnum, quote_num, anchor, parsed2, 1, count_quoted_lines, &match_info)) {\n\t        struct emailinfo *ep2;\n                char *path;\n                char *buf;\n                hashnumlookup(match_info.msgnum, &ep2);\n                path = get_path(ep, ep2);\n\n\t\ttrio_asprintf(&buf, \"%s%.4d.%s#%s\", path, match_info.msgnum, set_htmlsuffix, anchor);\n\t\tset_new_reply_to(match_info.msgnum, match_info.match_len_bytes);\n\t\tfree(parsed2);\n\t\tif (*path)\n\t\t    free(path);\n\t\tfree(anchor);\n\t\treturn buf;\n\t    }\n\t    free(parsed2);\n\t}\n\tif (match_info.last_matched_string)\n\t    free(match_info.last_matched_string);\n    }\n    if (count_quoted_lines < 3 && strcmp(get_quote_prefix(), \">\")\n\t&& strcmp(get_quote_prefix(), \" >\"))\t/* was quote_prefix guess shaky? */\n\t*quoting_msgnum = -1;\t/* msg probably doesn't have any quotes */\n    free(anchor);\n    return NULL;\n}\n\n/*\n** handles everything we do for a single line that is a quote\n** of another message\n*/\n\nint handle_quoted_text(FILE *fp, struct emailinfo *email, const struct body *bp, char *line, int inquote, int quote_num, bool replace_quoted, int maybe_reply)\n{\n    char *url1;\n    int quoting_msgnum = email->msgnum;\n    const struct body *last_quoted_line = bp;\n    int count_quoted_lines = 0;\n    char *fmt2;\n    char *cvtd_line = ConvURLsString(unquote(line), email->msgid, email->subject, email->charset);\n    char *buffer1;\n\ttrio_asprintf(&fmt2, set_iquotes ? \"<em class=\\\"%s\\\">%%s</em><br>\" : \"<span class=\\\"%s\\\">%%s</span><br>\", find_quote_class(line));\n    trio_asprintf(&buffer1, fmt2, cvtd_line ? cvtd_line : \"\");\n    if (cvtd_line)\n\tfree(cvtd_line);\n    found_quote = (quote_num > 0);\n    while (last_quoted_line && isquote(last_quoted_line->line)) {\n\t++count_quoted_lines;\n\tlast_quoted_line = last_quoted_line->next;\n    }\n    cvtd_line = unquote_and_strip(line);\n    if (strlen(cvtd_line) < 5 && (!replace_quoted || !inquote)) {\n\tchar *parsed = ConvURLsString(line, email->msgid, email->subject, email->charset);\n\tif (parsed) {\n\t    fprintf(fp, fmt2, parsed);\n\t    free(parsed);\n\t}\n    }\n    else if ((!inquote || !found_quote)\n\t\t && (url1 = url_replying_to(email, buffer1, cvtd_line, bp, ++quote_num, &quoting_msgnum, count_quoted_lines, maybe_reply))) {\n\tstatic const char *fmt1 = \"<a href=\\\"%s\\\">%s</a>%s<br>\\n\";\n\tchar *tmpline;\n\tchar *p2;\n\t\tbool replacing = replace_quoted && set_quote_link_string && set_quote_link_string[0];\n\tchar *part2 = strcasestr(line, \"<a href=\");\n\tif (!part2) {\n\t    part2 = \"\";\n\t    tmpline = strsav(line);\n\t}\n\telse {\n\t    tmpline = (char *)emalloc(part2 - line + 1);\n\t    strncpy(tmpline, line, part2 - line);\n\t    tmpline[part2 - line] = 0;\n\t}\n\tif (set_link_to_replies)\n\t    fprintf(fp, \"<a name=\\\"qlink%d\\\"></a>\", quote_num);\n\tp2 = ConvURLsString(part2, email->msgid, email->subject, email->charset);\n\tif (replacing)\n\t    fprintf(fp, fmt1, url1, set_quote_link_string, p2 ? p2 : \"\");\n\telse {\n\t    char *tmpptr = convchars(tmpline, email->charset);\n\t    if (tmpptr) {\n\t\tfprintf(fp, fmt1, url1, tmpptr, p2 ? p2 : \"\");\n\t\tfree(tmpptr);\n\t    }\n\t}\n\tfree(url1);\n\tfree(tmpline);\n\tif (p2)\n\t    free(p2);\n\tfree(cvtd_line);\n\tfree(buffer1);\n\tfree(fmt2);\n\treturn 1;\n    }\n    else if (!replace_quoted || !inquote) {\n\tchar *parsed = ConvURLsString(bp->line, email->msgid, email->subject, email->charset);\n\tif (parsed) {\n\t    fprintf(fp, quoting_msgnum >= 0 ? fmt2 : \"%s<br>\\n\", parsed);\n\t    free(parsed);\n\t}\n    }\n    free(cvtd_line);\n    free(buffer1);\n    free(fmt2);\n    return 0;\n}\n\n/*\n** Update guess about which message the current message is replying to;\n** do nothing if set_new_reply_to has been called more for another msgnum since\n** starting this message or if another msgnum had longer match_len.\n*/\n\nvoid set_new_reply_to(int msgnum, int match_len)\n{\n    static int alt_msgnum = -1;\n    static int count_alt = 0;\n    static int count_last = 0;\n    static int best_match_len = -1;\n    if (new_reply_to == -1 || msgnum == -1) {\n\tnew_reply_to = msgnum;\n\tcount_last = 1;\n\tcount_alt = 0;\n\talt_msgnum = -1;\n\tbest_match_len = match_len;\n    }\n    else if (msgnum == new_reply_to) {\n\t++count_last;\n    }\n    else {\n\tif (msgnum == alt_msgnum || alt_msgnum == -1) {\n\t\t\tif (++count_alt > count_last || (count_alt == count_last && match_len > best_match_len)) {\n\t\tcount_last = count_alt;\n\t\tnew_reply_to = msgnum;\n\t\tif (match_len > best_match_len)\n\t\t    best_match_len = match_len;\n\t    }\n\t}\n\telse\n\t    count_alt = 0;\n\talt_msgnum = msgnum;\n    }\n}\n\nint get_new_reply_to()\n{\n    return new_reply_to;\n}\n\n/*\n * Update a message to change \"maybe in reply to\"'s to a single definite\n * \"In reply to\"\n*/\n\nvoid replace_maybe_replies(const char *filename, struct emailinfo *ep, int new_reply_to)\n{\n    char tmpfilename[MAXFILELEN];\n    char buffer[MAXLINE];\n    FILE *fp1, *fp2;\n    struct emailinfo *ep2;\n    int in_body = 0;\n    char *ptr;\n    static const char *prev_patt0 = \".html\\\">[ Previous ]</a>\";\n\n    if (!hashnumlookup(new_reply_to, &ep2))\n\treturn;\n    snprintf(tmpfilename, sizeof(tmpfilename), \"%s/aaaa.tmp\", set_dir);\t/* AUDIT biege: poss. BOF. */\n    if ((fp1 = fopen(filename, \"r\")) == NULL) {\n        snprintf(errmsg, sizeof(errmsg), \"Couldn't read \\\"%s\\\".\", filename);\n\tprogerr(errmsg);\n    }\n    if ((fp2 = fopen(tmpfilename, \"w\")) == NULL) {\n        snprintf(errmsg, sizeof(errmsg), \"Couldn't write \\\"%s\\\".\", tmpfilename);\n\tprogerr(errmsg);\n    }\n    while (fgets(buffer, sizeof(buffer), fp1)) {\n\tif (strstr(buffer, \"<!-- body=\\\"end\\\" -->\\n\"))\n\t    in_body = 0;\n\tif (!strcmp(buffer, \"<!-- body=\\\"start\\\" -->\\n\"))\n\t    in_body = 1;\n\tif (!in_body) {\n\t  if (!strcmp(buffer, \"<!-- unextthread=\\\"start\\\" -->\\n\")) {\n\t\tchar *tmpptr = convchars(ep2->subject, ep2->charset);\n\t\tif (tmpptr) {\n\t\t    char *path = get_path(ep, ep2);\n                    fprintf(fp2,\"[ <a href=\\\"%s%.4d.%s\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t\t    path, new_reply_to, set_htmlsuffix, lang[MSG_LTITLE_IN_REPLY_TO], \n\t\t\t    ep2->name, tmpptr ? tmpptr : \"\");\n\t\t    free(tmpptr);\n\t\t}\n\t  }\n\t  else\n\t  if (!strcmp(buffer, \"<!-- lnextthread=\\\"start\\\" -->\\n\")) {\n\t        char *tmpptr = convchars(ep2->subject, ep2->charset);\n\t\tif (tmpptr) {\n\t\t    char *path = get_path(ep, ep2);\n                    fprintf(fp2, \"<li><dfn>%s</dfn> \" \n\t\t\t    \"<a href=\\\"%s%.4d.%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t\t    lang[MSG_IN_REPLY_TO], path, \n\t\t\t    new_reply_to, set_htmlsuffix, lang[MSG_LTITLE_IN_REPLY_TO], \n\t\t\t    ep2->name, tmpptr ? tmpptr : \"\");\n\t\t    free(tmpptr);\n\t\t}\n\t  }\n\t  else\n\t  if (!strcmp(buffer, \"<!-- nextthread=\\\"start\\\" -->\\n\")) {\n\t\tchar *tmpptr = convchars(ep2->subject, ep2->charset);\n\t\tif (tmpptr) {\n\t\t    char *path = get_path(ep, ep2);\n                    fprintf(fp2, \"<li> <strong>%s:</strong> \" \"<a href=\\\"%s%.4d.%s\\\">%s: \\\"%s\\\"</a>\\n\", lang[MSG_IN_REPLY_TO], path, new_reply_to, set_htmlsuffix, ep2->name, tmpptr ? tmpptr : \"\");\n\t\t    free(tmpptr);\n\t\t}\n\t  }\n\t  else {\n\t\tstatic const char *patts[] = {\n\t\t    \"<b>Maybe in reply to:</b>\",\n\t\t    \"<strong>%s:</strong>\",\n\t\t    \"<b>In reply to:</b>\",\n\t\t    \"<strong>%s:</strong>\",\n\t\t    \"<li> <b>Previous message:</b> <a href=\\\"\",\n\t\t    \"<li> <strong>%s:</strong> <a href=\\\"\",\n\t\t    \"<li><dfn>%s</dfn>: <a href=\\\"\",\n\t\t    \"<li><dfn>%s</dfn>: <a href=\\\"\",\n\t\t    \"<li><dfn>%s</dfn>: <a href=\\\"\",\n\t\t    NULL\n\t\t};\n\t\tstatic const int indices[] = { MSG_MAYBE_IN_REPLY_TO,\n\t\t    MSG_MAYBE_IN_REPLY_TO,\n\t\t    MSG_IN_REPLY_TO,\n\t\t    MSG_IN_REPLY_TO,\n\t\t    MSG_PREVIOUS_MESSAGE,\n\t\t    MSG_PREVIOUS_MESSAGE,\n\t\t    MSG_MAYBE_IN_REPLY_TO,\n\t\t    MSG_IN_REPLY_TO,\n\t\t    MSG_PREVIOUS_MESSAGE\n\t\t};\n\t\tint i;\n\t\tint suppress = 0;\n\t\tfor (i = 0; patts[i]; ++i) {\n\t\t    char temp[256];\n\t\t    snprintf(temp,sizeof(temp), patts[i], lang[indices[i]]);\n\t\t    if ((ptr = strcasestr(buffer, temp))\n\t\t\t&& (i < 4 || new_reply_to == atoi(ptr + strlen(temp)))) {\n\t\t\tsuppress = 1;\n\t\t\tbreak;\n\t\t    }\n\t\t}\n\t\tif (suppress)\n\t\t    continue;\n\t    }\n\t    /* check for old critmail format */\n\t    if ((ptr = strstr(buffer, prev_patt0))\n\t\t&& new_reply_to == atoi(ptr - 4)\n\t\t&& !strncasecmp(ptr - 13, \"<a href\", 7)) {\n\t\tptr[-13] = 0;\n\t    }\n\t}\n\tfputs(buffer, fp2);\n    }\n    fclose(fp1);\n    fclose(fp2);\n\n    if (rename(tmpfilename, filename) == -1) {\n\tsnprintf(errmsg, sizeof(errmsg), \"Couldn't rename \\\"%s\\\" to %s.\", tmpfilename, filename);\n\tprogerr(errmsg);\n    }\n}\n\n/*\n * a fuzzy version of strstr()\n*/\n\nstatic int str_similar_str(const char *str1, const char *str2)\n{\n    int len;\n    char *s;\n    char *temp1;\n    if (strstr(str1, str2))\n\treturn TRUE;\n    len = strlen(str2);\n    if (strstr(str1, str2 + len / 5))\n\treturn TRUE;\n    len = (4 * len) / 5;\n    temp1 = (char *)emalloc(len + 1);\n    strncpy(temp1, str2, len);\n    temp1[len] = 0;\n    s = strstr(str1, temp1);\n    free(temp1);\n    if (s)\n\treturn TRUE;\n    return FALSE;\n}\n\n/*\n** remove whitespace from begin and end of a string\n*/\n\nstatic char *stripwhitespace(const char *line)\n{\n    char *buffer = (char *)emalloc(strlen(line) + 1);\n    int i = 0;\n    while (*line && isspace(*line))\n\t++line;\n    while (*line)\n\tbuffer[i++] = *line++;\n    buffer[i] = 0;\n    while (i >= 0 && isspace(buffer[--i]))\n\tbuffer[i] = '\\0';\n    return buffer;\n}\n"
  },
  {
    "path": "src/finelink.h",
    "content": "#ifndef __FINELINK_H\n#define __FINELINK_H\n\n#include \"hypermail.h\"\n#include \"setup.h\"\t\t/* for bool */\n\nint\nhandle_quoted_text(FILE *fp, struct emailinfo *, const struct body *,\n\t\t   char *line, int inquote, int quote_num,\n\t\t   bool replace_quoted, int maybe_reply);\nvoid replace_maybe_replies(const char *, struct emailinfo *, int);\nvoid set_new_reply_to(int msgnum, int match_len);\nint get_new_reply_to(void);\n\n#endif\n"
  },
  {
    "path": "src/fnv/Makefile.in",
    "content": "\n# Makefile.in for Fowler / Noll / Vo (FNV) Hash Tools library\n#\n# Prepared for the autoconf tools from the original Makefile\n# by Jose KAHAN (jose.kahan@w3.org).\n#\n# -------------------------------------------------------------\n#  Original comments\n#  ------------------------------------------------------------\n#\n# @(#) $Revision: 1.2 $\n# @(#) $Id: Makefile.in,v 1.2 2013-04-11 13:48:18 kahan Exp $\n# @(#) $Source: /sources/public/hypermess/hypermail/src/fnv/Makefile.in,v $\n#\n# See:\n#\thttp://www.isthe.com/chongo/tech/comp/fnv/index.html\n#\n# for the most up to date copy of this code and the FNV hash home page.\n#\n# Please do not copyright this code.  This code is in the public domain.\n#\n# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n# PERFORMANCE OF THIS SOFTWARE.\n#\n# By:\n#\tchongo <Landon Curt Noll> /\\oo/\\\n#\thttp://www.isthe.com/chongo/\n#\n# Share and Enjoy!\t:-)\n\n\n#---------------------------------------------------------------------------#\n# To build mingw32 DLL uncomment the next two lines. This addition for      #\n# mingw32 was contributed by <Paul.Sokolovsky@technologist.com>. I (Philip  #\n# Hazel) don't know anything about it! There are some additional targets at #\n# the bottom of this Makefile.                                              #\n#---------------------------------------------------------------------------#\n#\n# include dll.mk\n# DLL_LDFLAGS=-s\n\n#---------------------------------------------------------------------------#\n# The next few lines are modified by \"configure\" to insert data that it is  #\n# given in its arguments, or which it finds out for itself.                 #\n#---------------------------------------------------------------------------#\n\n# BINDIR is the directory in which the fnv command is installed.\n# INCDIR is the directory in which the public header file fnv.h is installed.\n# LIBDIR is the directory in which the libraries are installed.\n# MANDIR is the directory in which the man pages are installed.\n\nprefix = @prefix@\nexec_prefix = @exec_prefix@\n\nBINDIR = @bindir@\nLIBDIR = @libdir@\nINCDIR = @includedir@\nMANDIR = @mandir@\n\nCC = @CC@\nCFLAGS = @CFLAGS@\nRANLIB = @RANLIB@\nUTF8   = @UTF8@\n\n\n# LIBTOOL defaults to \"./libtool\", which enables the building of shared\n# libraries. If \"configure\" is called with --disable-shared-libraries, LIBTOOL\n# is set to \"\", which stops shared libraries from being built, and LIBSUFFIX\n# is set to \"a\" instead of \"la\", which causes the shared libraries not to be\n# installed.\n\nLIBTOOL = @LIBTOOL@\nLIBSUFFIX = @LIBSUFFIX@\n\n# These are the version numbers for the shared libraries\n\nFNVLIBVERSION = @FNV_LIB_VERSION@\nFNVPOSIXLIBVERSION = @FNV_POSIXLIB_VERSION@\n\n#---------------------------------------------------------------------------#\n# For almost all systems, the command to create a library is \"ar cq\", but   #\n# there is at least one where it is different, so this command must be      #\n# configurable. However, I haven't got round to learning how to make        #\n# \"configure\" find this out for itself. It is necessary to use a command    #\n# such as \"make AR='ar -rc'\" if you need to vary this. The setting of AR is #\n# *not* passed over to ./ltconfig, because it does its own setting up.      #\n#---------------------------------------------------------------------------#\n\nAR = ar cq\n\n# make tools\n#\nSHELL= /bin/sh\nTAR= tar\nEGREP= egrep\nGZIP_BIN= gzip\nINSTALL= install\n\nDESTBIN= /usr/local/bin\nDESTLIB= /usr/local/lib\nDESTINC= /usr/local/include\n# NOTE: Lines with WWW in them are removed from the shipped Makefile\nWWW= /web/isthe/chroot/html/chongo/src/fnv\n\n# what to build\n#\nSRC=\thash_32.c hash_64.c \\\n\tfnv32.c fnv64.c \\\n\thave_ulong64.c\nHSRC=\tfnv.h \\\n\tlonglong.h\nALL=\t${SRC} ${HSRC} \\\n\tREADME Makefile\nPROGS=\tfnv032 fnv064 fnv0_32 fnv0_64 fnv132 fnv164 fnv1_32 fnv1_64\nLIBS=\tlibfnv.$(LIBSUFFIX)\nLIBOBJ=\thash_32.o hash_64.o\nOTHEROBJ= fnv32.o fnv64.o\nTARGETS= ${LIBOBJ} ${LIBS} ${PROGS}\n\n# default rule\n#\nall: libtool ${TARGETS}\n\n# things to build\n\nlibtool: config.guess config.sub ltconfig ltmain.sh\n\t@if test \"$(LIBTOOL)\" = \"./libtool\"; then \\\n\techo '--- Building libtool ---'; \\\n\tCC=$(CC) CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)' ./ltconfig ./ltmain.sh; \\\n\techo '--- Built libtool ---'; fi\n\nhash_32.o: hash_32.c longlong.h fnv.h\n\t${CC} ${CFLAGS} hash_32.c -c\n\nhash_64.o: hash_64.c longlong.h fnv.h\n\t${CC} ${CFLAGS} hash_64.c -c\n\nlibfnv.la:     $(OBJ)\n\t@echo ' '\n\t@echo '--- Building shared library: libfnv'\n\t@echo ' '\n\t-rm -f libpcre.la\n\t./libtool $(CC) -version-info '$(FNVLIBVERSION)' -o libfnv.la -rpath $(LIBDIR) $(LOBJ)\n\nlibfnv.a: ${LIBOBJ}\n\t@echo ' '\n\t@echo '--- Building static library: libfnv'\n\t@echo ' '\n\trm -f $@\n\t${AR} $@ ${LIBOBJ}\n\t${RANLIB} $@\n\nfnv32.o: fnv32.c longlong.h fnv.h\n\t${CC} ${CFLAGS} fnv32.c -c\n\nfnv032: fnv32.o libfnv.a\n\t${CC} fnv32.o libfnv.a -o fnv032\n\nfnv64.o: fnv64.c longlong.h fnv.h\n\t${CC} ${CFLAGS} fnv64.c -c\n\nfnv064: fnv64.o libfnv.a\n\t${CC} fnv64.o libfnv.a -o fnv064\n\nfnv0_32: fnv032\n\t-rm -f $@\n\t-cp -f $? $@\n\nfnv0_64: fnv064\n\t-rm -f $@\n\t-cp -f $? $@\n\nfnv132: fnv032\n\t-rm -f $@\n\t-cp -f $? $@\n\nfnv164: fnv064\n\t-rm -f $@\n\t-cp -f $? $@\n\nfnv1_32: fnv032\n\t-rm -f $@\n\t-cp -f $? $@\n\nfnv1_64: fnv064\n\t-rm -f $@\n\t-cp -f $? $@\n\nlonglong.h: have_ulong64.c Makefile\n\t-@rm -f have_ulong64 have_ulong64.o ll_tmp longlong.h\n\t@echo 'forming longlong.h'\n\t@echo '/*' > longlong.h\n\t@echo ' * DO NOT EDIT -- generated by the Makefile' >> longlong.h\n\t@echo ' */' >> longlong.h\n\t@echo '' >> longlong.h\n\t@echo '#if !defined(__LONGLONG_H__)' >> longlong.h\n\t@echo '#define __LONGLONG_H__' >> longlong.h\n\t@echo '' >> longlong.h\n\t@echo '/* do we have/want to use a long long type? */' >> longlong.h\n\t-@rm -f have_ulong64.o have_ulong64\n\t-@${CC} ${CFLAGS} have_ulong64.c -c 2>/dev/null; true\n\t-@${CC} ${CFLAGS} have_ulong64.o -o have_ulong64 2>/dev/null; true\n\t-@${SHELL} -c \"./have_ulong64 > ll_tmp 2>/dev/null\" \\\n\t    >/dev/null 2>&1; true\n\t-@if [ -s ll_tmp ]; then \\\n\t    cat ll_tmp >> longlong.h; \\\n\telse \\\n\t    echo '#undef HAVE_64BIT_LONG_LONG\t/* no */' >> longlong.h; \\\n\tfi\n\t@echo '' >> longlong.h\n\t@echo '#endif /* !__LONGLONG_H__ */' >> longlong.h\n\t-@rm -f have_ulong64 have_ulong64.o ll_tmp\n\t@echo 'longlong.h formed'\n\n# utilities\n#\ninstall: all\n\t-@if [ -d \"${DESTBIN}\" ]; then \\\n\t    echo \"\tmkdir -p ${DESTBIN}\"; \\\n\t    mkdir -p ${DESTBIN}; \\\n\tfi\n\t-@if [ -d \"${DESTLIB}\" ]; then \\\n\t    echo \"\tmkdir -p ${DESTLIB}\"; \\\n\t    mkdir -p ${DESTLIB}; \\\n\tfi\n\t-@if [ -d \"${DESTINC}\" ]; then \\\n\t    echo \"\tmkdir -p ${DESTINC}\"; \\\n\t    mkdir -p ${DESTINC}; \\\n\tfi\n\t${INSTALL} -m 0755 ${PROGS} ${DESTBIN}\n\t${INSTALL} -m 0644 ${LIBS} ${DESTLIB}\n\t${RANLIB} ${DESTLIB}/libfnv.a\n\t${INSTALL} -m 0644 ${HSRC} ${DESTINC}\n\t@# NOTE: Lines with WWW in them are removed from the shipped Makefile\n\t-@if [ -d ${WWW} ]; then \\\n\t    echo \"rm -f Makefile.ship\";\t\t\t: WWW; \\\n\t    rm -f Makefile.ship;\t\t\t: WWW; \\\n\t    echo \"${EGREP} -v WWW Makefile > Makefile.ship\"; \t: WWW; \\\n\t    ${EGREP} -v WWW Makefile > Makefile.ship; \t: WWW; \\\n\t    echo \"rm -f Makefile.save\";\t\t\t: WWW; \\\n\t    rm -f Makefile.save;\t\t\t: WWW; \\\n\t    echo \"ln Makefile Makefile.save\";\t\t: WWW; \\\n\t    ln Makefile Makefile.save;\t\t\t: WWW; \\\n\t    echo \"cp -f Makefile.ship Makefile\";\t: WWW; \\\n\t    cp -f Makefile.ship Makefile;\t\t: WWW; \\\n\t    echo \"${TAR} -cf - ${ALL} | ${GZIP_BIN} --best > fnv_hash.tar.gz\";: WWW; \\\n\t    ${TAR} -cf - ${ALL} | ${GZIP_BIN} --best > fnv_hash.tar.gz;: WWW; \\\n\t    echo \"${INSTALL} -m 0644 fnv_hash.tar.gz ${ALL} ${WWW}\"; \\\n\t    ${INSTALL} -m 0644 fnv_hash.tar.gz ${ALL} ${WWW}; \\\n\t    echo \"mv -f Makefile.save Makefile\";\t: WWW; \\\n\t    mv -f Makefile.save Makefile;\t\t: WWW; \\\n\t    echo \"rm -f fnv_hash.tar.gz Makefile.ship\";\t: WWW; \\\n\t    rm -f fnv_hash.tar.gz Makefile.ship;\t: WWW; \\\n\tfi;\t\t\t\t\t\t: WWW\n\nclean:\n\t-rm -f have_ulong64 have_ulong64.o ll_tmp ll_tmp2 longlong.h\n\t-rm -f ${LIBOBJ}\n\t-rm -f ${OTHEROBJ}\n\t-rm -rf *.lo *.la .libs\n\t-rm -f *.a\n\t-rm -f fnv_hash.tar.gz Makefile.ship\t# WWW\n\nclobber: clean\n\t-rm -f ${TARGETS}\n\ndistclean: clobber\n\t-rm -f Makefile libtool config.h config.status config.log config.cache\t\n\ncheck: all\n\t@echo\n\t@echo \"\tThese tests should not print an un-indented hash value:\"\n\t@echo\n\t@echo \"\tfnv0_32 -s hi == 0x6800a3d1\"\n\t-@./fnv0_32 -s hi | ${EGREP} -v 0x6800a3d1; /bin/true\n\t@echo \"\tfnv0_32 -s hello == 0xec6d6be8\"\n\t-@./fnv0_32 -s hello | ${EGREP} -v 0xec6d6be8; /bin/true\n\t@echo \"\tfnv0_32 -s curds and whey == 0x4a83403b\"\n\t-@./fnv0_32 -s curds and whey | ${EGREP} -v 0x4a83403b; /bin/true\n\t@echo \"\tfnv0_64 -s hi == 0x000068000000b0d1\"\n\t-@./fnv0_64 -s hi | ${EGREP} -v 0x000068000000b0d1; /bin/true\n\t@echo \"\tfnv0_64 -s hello == 0x3fa86e63bc7d03c8\"\n\t-@./fnv0_64 -s hello | ${EGREP} -v 0x3fa86e63bc7d03c8; /bin/true\n\t@echo \"\tfnv0_64 -s curds and whey == 0x09d2b4132bd1333b\"\n\t-@./fnv0_64 -s curds and whey | ${EGREP} -v 0x09d2b4132bd1333b;/bin/true\n\t-@rm -f ll_tmp ll_tmp2\n\t-@echo line 1 > ll_tmp\n\t-@echo line 2 >> ll_tmp\n\t-@echo line 3 >> ll_tmp\n\t@echo '\techo \"line 1\\\\nline 2\\\\nline 3\" > ll_tmp'\n\t@echo \"\tdd if=/dev/zero bs=1024k count=4 of=ll_tmp2 >/dev/null 2>&1\"\n\t-@dd if=/dev/zero bs=1024k count=4 of=ll_tmp2 >/dev/null 2>&1\n\t@echo \"\tfnv0_32 < ll_tmp == 0x1fad81d0\"\n\t-@./fnv0_32 < ll_tmp | ${EGREP} -v 0x1fad81d0; /bin/true\n\t@echo \"\tfnv0_64 < ll_tmp == 0xa8cf5b7784759250\"\n\t-@./fnv0_64 < ll_tmp | ${EGREP} -v 0xa8cf5b7784759250; /bin/true\n\t@echo \"\tfnv0_32 < ll_tmp2 == 0x00000000\"\n\t-@./fnv0_32 < ll_tmp2 | ${EGREP} -v 0x00000000; /bin/true\n\t@echo \"\tfnv0_64 < ll_tmp2 == 0x0000000000000000\"\n\t-@./fnv0_64 < ll_tmp2 | ${EGREP} -v 0x0000000000000000; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp == 0x1fad81d0\"\n\t-@./fnv0_32 ll_tmp | ${EGREP} -v 0x1fad81d0; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp == 0xa8cf5b7784759250\"\n\t-@./fnv0_64 ll_tmp | ${EGREP} -v 0xa8cf5b7784759250; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp2 == 0x00000000\"\n\t-@./fnv0_32 ll_tmp2 | ${EGREP} -v 0x00000000; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp2 == 0x0000000000000000\"\n\t-@./fnv0_64 ll_tmp2 | ${EGREP} -v 0x0000000000000000; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp ll_tmp == 0xc500fd20\"\n\t-@./fnv0_32 ll_tmp ll_tmp | ${EGREP} -v 0xc500fd20; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp ll_tmp == 0x3c8b9c3715fc1920\"\n\t-@./fnv0_64 ll_tmp ll_tmp | ${EGREP} -v 0x3c8b9c3715fc1920; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp ll_tmp2 == 0x6fad81d0\"\n\t-@./fnv0_32 ll_tmp ll_tmp2 | ${EGREP} -v 0x6fad81d0; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp ll_tmp2 == 0x29a78f5dd4759250\"\n\t-@./fnv0_64 ll_tmp ll_tmp2 | ${EGREP} -v 0x29a78f5dd4759250; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp2 ll_tmp == 0x1fad81d0\"\n\t-@./fnv0_32 ll_tmp2 ll_tmp | ${EGREP} -v 0x1fad81d0; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp2 ll_tmp == 0xa8cf5b7784759250\"\n\t-@./fnv0_64 ll_tmp2 ll_tmp | ${EGREP} -v 0xa8cf5b7784759250; /bin/true\n\t@echo \"\tfnv0_32 ll_tmp2 ll_tmp2 == 0x00000000\"\n\t-@./fnv0_32 ll_tmp2 ll_tmp2 | ${EGREP} -v 0x00000000; /bin/true\n\t@echo \"\tfnv0_64 ll_tmp2 ll_tmp2 == 0x0000000000000000\"\n\t-@./fnv0_64 ll_tmp2 ll_tmp2 | ${EGREP} -v 0x0000000000000000; /bin/true\n\t@echo\n\t@echo \"\tfnv1_32 -s hi == 0x6977223c\"\n\t-@./fnv1_32 -s hi | ${EGREP} -v 0x6977223c; /bin/true\n\t@echo \"\tfnv1_32 -s hello == 0xb6fa7167\"\n\t-@./fnv1_32 -s hello | ${EGREP} -v 0xb6fa7167; /bin/true\n\t@echo \"\tfnv1_32 -s curds and whey == 0x08ebf912\"\n\t-@./fnv1_32 -s curds and whey | ${EGREP} -v 0x08ebf912; /bin/true\n\t@echo \"\tfnv1_64 -s hi == 0x08326007b4eb2b9c\"\n\t-@./fnv1_64 -s hi | ${EGREP} -v 0x08326007b4eb2b9c; /bin/true\n\t@echo \"\tfnv1_64 -s hello == 0x7b495389bdbdd4c7\"\n\t-@./fnv1_64 -s hello | ${EGREP} -v 0x7b495389bdbdd4c7; /bin/true\n\t@echo \"\tfnv1_64 -s curds and whey == 0x795ad7b2d9a7dc72\"\n\t-@./fnv1_64 -s curds and whey | ${EGREP} -v 0x795ad7b2d9a7dc72;/bin/true\n\t@echo \"\tfnv1_32 < ll_tmp == 0xb8cbeb33\"\n\t-@./fnv1_32 < ll_tmp | ${EGREP} -v 0xb8cbeb33; /bin/true\n\t@echo \"\tfnv1_64 < ll_tmp == 0x79dcad190c3291b3\"\n\t-@./fnv1_64 < ll_tmp | ${EGREP} -v 0x79dcad190c3291b3; /bin/true\n\t@echo \"\tfnv1_32 < ll_tmp2 == 0xce1c9dc5\"\n\t-@./fnv1_32 < ll_tmp2 | ${EGREP} -v 0xce1c9dc5; /bin/true\n\t@echo \"\tfnv1_64 < ll_tmp2 == 0xf8e3e56ce9222325\"\n\t-@./fnv1_64 < ll_tmp2 | ${EGREP} -v 0xf8e3e56ce9222325; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp == 0xb8cbeb33\"\n\t-@./fnv1_32 ll_tmp | ${EGREP} -v 0xb8cbeb33; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp == 0x79dcad190c3291b3\"\n\t-@./fnv1_64 ll_tmp | ${EGREP} -v 0x79dcad190c3291b3; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp2 == 0xce1c9dc5\"\n\t-@./fnv1_32 ll_tmp2 | ${EGREP} -v 0xce1c9dc5; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp2 == 0xf8e3e56ce9222325\"\n\t-@./fnv1_64 ll_tmp2 | ${EGREP} -v 0xf8e3e56ce9222325; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp ll_tmp == 0x08ae22e5\"\n\t-@./fnv1_32 ll_tmp ll_tmp | ${EGREP} -v 0x08ae22e5; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp ll_tmp == 0x10a587a0ff68f305\"\n\t-@./fnv1_64 ll_tmp ll_tmp | ${EGREP} -v 0x10a587a0ff68f305; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp ll_tmp2 == 0x23cbeb33\"\n\t-@./fnv1_32 ll_tmp ll_tmp2 | ${EGREP} -v 0x23cbeb33; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp ll_tmp2 == 0xcafae19b7f3291b3\"\n\t-@./fnv1_64 ll_tmp ll_tmp2 | ${EGREP} -v 0xcafae19b7f3291b3; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp2 ll_tmp == 0x1fcbeb33\"\n\t-@./fnv1_32 ll_tmp2 ll_tmp | ${EGREP} -v 0x1fcbeb33; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp2 ll_tmp == 0x06319755db3291b3\"\n\t-@./fnv1_64 ll_tmp2 ll_tmp | ${EGREP} -v 0x06319755db3291b3; /bin/true\n\t@echo \"\tfnv1_32 ll_tmp2 ll_tmp2 == 0x1b1c9dc5\"\n\t-@./fnv1_32 ll_tmp2 ll_tmp2 | ${EGREP} -v 0x1b1c9dc5; /bin/true\n\t@echo \"\tfnv1_64 ll_tmp2 ll_tmp2 == 0x637a2df54e222325\"\n\t-@./fnv1_64 ll_tmp2 ll_tmp2 | ${EGREP} -v 0x637a2df54e222325; /bin/true\n\t@echo\n\t-@rm -f ll_tmp ll_tmp2\n\t@echo \"\tAll done!\"\n\n\n\n\n"
  },
  {
    "path": "src/fnv/README",
    "content": "#=====================#\n# Fowler/Noll/Vo hash #\n#=====================#\n\nThe basis of this hash algorithm was taken from an idea sent\nas reviewer comments to the IEEE POSIX P1003.2 committee by:\n\n     Phong Vo (http://www.research.att.com/info/kpv)\n     Glenn Fowler (http://www.research.att.com/~gsf/)\n\nIn a subsequent ballot round:\n\n     Landon Curt Noll (http://www.isthe.com/chongo)\n\nimproved on their algorithm.  Some people tried this hash\nand found that it worked rather well.  In an EMail message\nto Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n\nFNV hashes are designed to be fast while maintaining a low\ncollision rate. The FNV speed allows one to quickly hash lots\nof data while maintaining a reasonable collision rate.  See:\n\n     http://www.isthe.com/chongo/tech/comp/fnv/index.html\n\nfor more details as well as other forms of the FNV hash.\nComments, questions, bug fixes and suggestions welcome at\nthe address given in the above URL.\n\n\n#==================#\n# FNV hash utility #\n#==================#\n\nTwo hash utilities (32 bit and 64 bit) are provided:\n\n\tfnv0_32 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\tfnv0_64 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\n\tfnv1_32 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\tfnv1_64 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\nor:\n\tfnv032 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\tfnv064 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\n\tfnv132 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\tfnv164 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n\n\t-b bcnt\t  mask off all but the lower bcnt bits (default: 32)\n \t-m\t  multiple hashes, one per line for each arg\n\t-s\t  hash arg as a string (ignoring terminating NUL bytes)\n \t-v\t  verbose mode, print arg after hash (implies -m)\n\targ\t  string (if -s was given) or filename (default stdin)\n\nThese serve as examples of how to use the FNV hash library.  For those\nwho do not like _'s, the same tools exist without the _ are provided.  :-)\n\nThe fnv0_32, fnv0_64 (fnv032, fnv064) implement the historic FNV-0 hash.\nThe fnv1_32, fnv1_64 (fnv132, fnv164) implement the recommended FNV-1 hash.\n\nThis is the original historic FNV algorithm with a 0 offset basis.\nIt is recommended that FNV-1, with a non-0 offset basis be used instead.\n\n\n#==================#\n# FNV hash library #\n#==================#\n\nThe libfnv.a library implements both a 32 bit and a 64 bit FNV hash\non collections of bytes, a NUL terminated strings or on an open file\ndescriptor.\n\nHere is the 32 bit FNV hash:\n\n\tFnv32_t fnv_32_buf(void *buf, int len, Fnv32_t hval);\t/* byte buf */\n\tFnv32_t fnv_32_str(char *string, Fnv32_t hval);\t\t/* string */\n\nHere is the 64 bit FNV hash:\n\n\tFnv64_t fnv_64_buf(void *buf, int len, Fnv64_t hval);\t/* byte buf */\n\tFnv64_t fnv_64_str(char *string, Fnv64_t hval);\t\t/* string */\n\nOn the first call to a hash function, one must supply the initial basis\nthat is appropriate for the hash in question:\n\n    FNV-0:\t(not recommended)\n\n\tFNV0_32_INIT\t\t/* 32 bit FNV-0 initial basis */\n\tFNV0_64_INIT\t\t/* 64 bit FNV-0 initial basis */\n\n    FNV-1:\n\n\tFNV1_32_INIT\t\t/* 32 bit FNV-1 initial basis */\n\tFNV1_64_INIT\t\t/* 64 bit FNV-1 initial basis */\n\nFor example to perform a 64 bit FNV-1 hash:\n\n\t#include \"fnv.h\"\n\n\tFnv64_t hash_val;\n\n\thash_val = fnv_64_str(\"a string\", FNV1_64_INIT);\n\thash_val = fnv0_64_str(\"more string\", hash_val);\n\nproduces the same final hash value as:\n\n\thash_val = fnv_64_str(\"a stringmore string\", FNV1_64_INIT);\n\nNOTE: If one used 'FNV0_64_INIT' instead of 'FNV1_64_INIT' one would get the\n      historic FNV-0 hash instead recommended FNV-1 hash.\n\nTo perform a 32 bit FNV-1 hash:\n\n\t#include \"fnv.h\"\n\n\tFnv32_t hash_val;\n\n\thash_val = fnv_32_buf(buf, length_of_buf, FNV1_32_INIT);\n\thash_val = fnv324_str(\"more data\", hash_val);\n\n=-=\n\nchongo <Landon Curt Noll> /\\oo/\\\nhttp://www.isthe.com/chongo\n\nShare and Enjoy!\n"
  },
  {
    "path": "src/fnv/aclocal.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-\n## Copyright 1996, 1997, 1998, 1999, 2000, 2001\n## Free Software Foundation, Inc.\n## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n##\n## This program is free software; you can redistribute it and/or modify\n## it under the terms of the GNU General Public License as published by\n## the Free Software Foundation; either version 2 of the License, or\n## (at your option) any later version.\n##\n## This program is distributed in the hope that it will be useful, but\n## WITHOUT ANY WARRANTY; without even the implied warranty of\n## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n## General Public License for more details.\n##\n## You should have received a copy of the GNU General Public License\n## along with this program; if not, write to the Free Software\n## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n##\n## As a special exception to the GNU General Public License, if you\n## distribute this file as part of a program that contains a\n## configuration script generated by Autoconf, you may include it under\n## the same distribution terms that you use for the rest of that program.\n\n# serial 46 AC_PROG_LIBTOOL\n\nAC_DEFUN([AC_PROG_LIBTOOL],\n[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ac_aux_dir/ltmain.sh\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n# Prevent multiple expansion\ndefine([AC_PROG_LIBTOOL], [])\n])\n\nAC_DEFUN([AC_LIBTOOL_SETUP],\n[AC_PREREQ(2.13)dnl\nAC_REQUIRE([AC_ENABLE_SHARED])dnl\nAC_REQUIRE([AC_ENABLE_STATIC])dnl\nAC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_LD])dnl\nAC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl\nAC_REQUIRE([AC_PROG_NM])dnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\nAC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl\nAC_REQUIRE([AC_OBJEXT])dnl\nAC_REQUIRE([AC_EXEEXT])dnl\ndnl\n\n_LT_AC_PROG_ECHO_BACKSLASH\n# Only perform the check for file, if the check method requires it\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    AC_PATH_MAGIC\n  fi\n  ;;\nesac\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\nAC_CHECK_TOOL(STRIP, strip, :)\n\nifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)\nifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],\nenable_win32_dll=yes, enable_win32_dll=no)\n\nAC_ARG_ENABLE(libtool-lock,\n  [  --disable-libtool-lock  avoid locking (might break parallel builds)])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line __oline__ \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n    *32-bit*)\n      LD=\"${LD-ld} -32\"\n      ;;\n    *N32*)\n      LD=\"${LD-ld} -n32\"\n      ;;\n    *64-bit*)\n      LD=\"${LD-ld} -64\"\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_SAVE\n     AC_LANG_C\n     AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_RESTORE])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n\nifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],\n[*-*-cygwin* | *-*-mingw* | *-*-pw32*)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n\n  # recent cygwin and mingw systems supply a stub DllMain which the user\n  # can override, but on older systems we have to supply one\n  AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain,\n    [AC_TRY_LINK([],\n      [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*);\n      DllMain (0, 0, 0);],\n      [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])])\n\n  case $host/$CC in\n  *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*)\n    # old mingw systems require \"-dll\" to link a DLL, while more recent ones\n    # require \"-mdll\"\n    SAVE_CFLAGS=\"$CFLAGS\"\n    CFLAGS=\"$CFLAGS -mdll\"\n    AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch,\n      [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])])\n    CFLAGS=\"$SAVE_CFLAGS\" ;;\n  *-*-cygwin* | *-*-pw32*)\n    # cygwin systems need to pass --dll to the linker, and not link\n    # crt.o which will require a WinMain@16 definition.\n    lt_cv_cc_dll_switch=\"-Wl,--dll -nostartfiles\" ;;\n  esac\n  ;;\n  ])\nesac\n\n_LT_AC_LTCONFIG_HACK\n\n])\n\n# AC_LIBTOOL_HEADER_ASSERT\n# ------------------------\nAC_DEFUN([AC_LIBTOOL_HEADER_ASSERT],\n[AC_CACHE_CHECK([whether $CC supports assert without backlinking],\n    [lt_cv_func_assert_works],\n    [case $host in\n    *-*-solaris*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" != yes; then\n        case `$CC --version 2>/dev/null` in\n        [[12]].*) lt_cv_func_assert_works=no ;;\n        *)        lt_cv_func_assert_works=yes ;;\n        esac\n      fi\n      ;;\n    esac])\n\nif test \"x$lt_cv_func_assert_works\" = xyes; then\n  AC_CHECK_HEADERS(assert.h)\nfi\n])# AC_LIBTOOL_HEADER_ASSERT\n\n# _LT_AC_CHECK_DLFCN\n# --------------------\nAC_DEFUN([_LT_AC_CHECK_DLFCN],\n[AC_CHECK_HEADERS(dlfcn.h)\n])# _LT_AC_CHECK_DLFCN\n\n# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE\n# ---------------------------------\nAC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],\n[AC_REQUIRE([AC_CANONICAL_HOST])\nAC_REQUIRE([AC_PROG_NM])\nAC_REQUIRE([AC_OBJEXT])\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Transform the above into a raw symbol and a C symbol.\nsymxfrm='\\1 \\2\\3 \\3'\n\n# Transform an extracted symbol line into a proper C declaration\nlt_cv_global_symbol_to_cdecl=\"sed -n -e 's/^. .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (lt_ptr) 0},/p' -e 's/^$symcode \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/p'\"\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*) # Its linker distinguishes data from code symbols\n  lt_cv_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern char \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n  lt_cv_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/p'\"\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nsolaris* | sysv5*)\n  symcode='[[BDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $host_os in\nmingw*)\n  opt_cr=`echo 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\nif $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then\n  symcode='[[ABCDGISTW]]'\nfi\n\n# Try without a prefix undercore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Write the raw and C identifiers.\nlt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[ \t]]\\($symcode$symcode*\\)[[ \t]][[ \t]]*\\($ac_symprfx\\)$sympat$opt_cr$/$symxfrm/p'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n  rm -f conftest*\n  cat > conftest.$ac_ext <<EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\nEOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if egrep ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif egrep ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nEOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_global_symbol_to_cdecl\"' < \"$nlist\" >> conftest.$ac_ext'\n\n\t  cat <<EOF >> conftest.$ac_ext\n#if defined (__STDC__) && __STDC__\n# define lt_ptr void *\n#else\n# define lt_ptr char *\n# define const\n#endif\n\n/* The mapping between symbol names and symbols. */\nconst struct {\n  const char *name;\n  lt_ptr address;\n}\nlt_preloaded_symbols[[]] =\n{\nEOF\n\t  sed \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/\" < \"$nlist\" >> conftest.$ac_ext\n\t  cat <<\\EOF >> conftest.$ac_ext\n  {0, (lt_ptr) 0}\n};\n\n#ifdef __cplusplus\n}\n#endif\nEOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  save_LIBS=\"$LIBS\"\n\t  save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$no_builtin_flag\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$save_LIBS\"\n\t  CFLAGS=\"$save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AC_FD_CC\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AC_FD_CC\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AC_FD_CC\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AC_FD_CC\n    cat conftest.$ac_ext >&5\n  fi\n  rm -f conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nglobal_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe\"\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  global_symbol_to_cdecl=\n  global_symbol_to_c_name_address=\nelse\n  global_symbol_to_cdecl=\"$lt_cv_global_symbol_to_cdecl\"\n  global_symbol_to_c_name_address=\"$lt_cv_global_symbol_to_c_name_address\"\nfi\nif test -z \"$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address\";\nthen\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE\n\n# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR\n# ---------------------------------\nAC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR],\n[# Find the correct PATH separator.  Usually this is `:', but\n# DJGPP uses `;' like DOS.\nif test \"X${PATH_SEPARATOR+set}\" != Xset; then\n  UNAME=${UNAME-`uname 2>/dev/null`}\n  case X$UNAME in\n    *-DOS) lt_cv_sys_path_separator=';' ;;\n    *)     lt_cv_sys_path_separator=':' ;;\n  esac\n  PATH_SEPARATOR=$lt_cv_sys_path_separator\nfi\n])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR\n\n# _LT_AC_PROG_ECHO_BACKSLASH\n# --------------------------\n# Add some code to the start of the generated configure script which\n# will find an echo command which doesn't interpret backslashes.\nAC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],\n[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],\n\t\t\t      [AC_DIVERT_PUSH(NOTICE)])\n_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR\n\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$ECHO\" | sed 's,\\\\\\\\\\[$]\\\\[$]0,'[$]0','`\n  ;;\nesac\n\necho=${ECHO-echo}\nif test \"X[$]1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X[$]1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $echo works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\nfi\n\nif test \"X[$]1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\nif test -z \"$ECHO\"; then\nif test \"X${echo_test_string+set}\" != Xset; then\n# find a string as large as possible, as long as the shell can cope with it\n  for cmd in 'sed 50q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 2q \"[$]0\"' 'echo test'; do\n    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n    if (echo_test_string=\"`eval $cmd`\") 2>/dev/null &&\n       echo_test_string=\"`eval $cmd`\" &&\n       (test \"X$echo_test_string\" = \"X$echo_test_string\") 2>/dev/null\n    then\n      break\n    fi\n  done\nfi\n\nif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n   echo_testing_string=`($echo \"$echo_test_string\") 2>/dev/null` &&\n   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n  :\nelse\n  # The Solaris, AIX, and Digital Unix default echo programs unquote\n  # backslashes.  This makes it impossible to quote backslashes using\n  #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n  #\n  # So, first we look for a working echo in the user's PATH.\n\n  IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for dir in $PATH /usr/ucb; do\n    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n       test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n       echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n       test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n      echo=\"$dir/echo\"\n      break\n    fi\n  done\n  IFS=\"$save_ifs\"\n\n  if test \"X$echo\" = Xecho; then\n    # We didn't find a better echo, so look for alternatives.\n    if test \"X`(print -r '\\t') 2>/dev/null`\" = 'X\\t' &&\n       echo_testing_string=`(print -r \"$echo_test_string\") 2>/dev/null` &&\n       test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n      # This shell has a builtin print -r that does the trick.\n      echo='print -r'\n    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&\n\t test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n      # If we have ksh, try running configure again with it.\n      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n      export ORIGINAL_CONFIG_SHELL\n      CONFIG_SHELL=/bin/ksh\n      export CONFIG_SHELL\n      exec $CONFIG_SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\n    else\n      # Try using printf.\n      echo='printf %s\\n'\n      if test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n\t echo_testing_string=`($echo \"$echo_test_string\") 2>/dev/null` &&\n\t test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t# Cool, printf works\n\t:\n      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = 'X\\t' &&\n\t   echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\tCONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\texport CONFIG_SHELL\n\tSHELL=\"$CONFIG_SHELL\"\n\texport SHELL\n\techo=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n      elif echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = 'X\\t' &&\n\t   echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\techo=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n      else\n\t# maybe with a smaller string...\n\tprev=:\n\n\tfor cmd in 'echo test' 'sed 2q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 50q \"[$]0\"'; do\n\t  if (test \"X$echo_test_string\" = \"X`eval $cmd`\") 2>/dev/null\n\t  then\n\t    break\n\t  fi\n\t  prev=\"$cmd\"\n\tdone\n\n\tif test \"$prev\" != 'sed 50q \"[$]0\"'; then\n\t  echo_test_string=`eval $prev`\n\t  export echo_test_string\n\t  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"[$]0\" ${1+\"[$]@\"}\n\telse\n\t  # Oops.  We lost completely, so just stick with echo.\n\t  echo=echo\n\tfi\n      fi\n    fi\n  fi\nfi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nECHO=$echo\nif test \"X$ECHO\" = \"X$CONFIG_SHELL [$]0 --fallback-echo\"; then\n   ECHO=\"$CONFIG_SHELL \\\\\\$\\[$]0 --fallback-echo\"\nfi\n\nAC_SUBST(ECHO)\nAC_DIVERT_POP\n])# _LT_AC_PROG_ECHO_BACKSLASH\n\n# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                           ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ------------------------------------------------------------------\nAC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],\n[if test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<EOF\n[#line __oline__ \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" void exit (int);\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n\n    exit (status);\n}]\nEOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_unknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_AC_TRY_DLOPEN_SELF\n\n# AC_LIBTOOL_DLOPEN_SELF\n# -------------------\nAC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],\n[if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n   ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n          [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n            [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-dld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t        [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t          [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t            [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-dld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_AC_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      LDFLAGS=\"$LDFLAGS $link_static_flag\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n    \t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_AC_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n])# AC_LIBTOOL_DLOPEN_SELF\n\nAC_DEFUN([_LT_AC_LTCONFIG_HACK],\n[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e s/^X//'\nsed_quote_subst='s/\\([[\\\\\"\\\\`$\\\\\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\\\\\"\\\\`\\\\\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Constants:\nrm=\"rm -f\"\n\n# Global variables:\ndefault_ofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except M$VC,\n# which needs '.lib').\nlibext=a\nltmain=\"$ac_aux_dir/ltmain.sh\"\nofile=\"$default_ofile\"\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\nneed_locks=\"$enable_libtool_lock\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\ntest -z \"$AS\" && AS=as\ntest -z \"$CC\" && CC=cc\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\ntest -z \"$LD\" && LD=ld\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ntest -z \"$NM\" && NM=nm\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\ntest -z \"$RANLIB\" && RANLIB=:\ntest -z \"$STRIP\" && STRIP=:\ntest -z \"$ac_objext\" && ac_objext=o\n\nif test x\"$host\" != x\"$build\"; then\n  ac_tool_prefix=${host_alias}-\nelse\n  ac_tool_prefix=\nfi\n\n# Transform linux* to *-*-linux-gnu*, to support old configure scripts.\ncase $host_os in\nlinux-gnu*) ;;\nlinux*) host=`echo $host | sed 's/^\\(.*-.*-linux\\)\\(.*\\)$/\\1-gnu\\2/'`\nesac\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"\\$RANLIB -t \\$oldlib~$old_postinstall_cmds\"\n    ;;\n  *)\n    old_postinstall_cmds=\"\\$RANLIB \\$oldlib~$old_postinstall_cmds\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n\n# Allow CC to be a program name with arguments.\nset dummy $CC\ncompiler=\"[$]2\"\n\n## FIXME: this should be a separate macro\n##\nAC_MSG_CHECKING([for objdir])\nrm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nAC_MSG_RESULT($objdir)\n##\n## END FIXME\n\n\n## FIXME: this should be a separate macro\n##\nAC_ARG_WITH(pic,\n[  --with-pic              try to use only PIC/non-PIC objects [default=use both]],\npic_mode=\"$withval\", pic_mode=default)\ntest -z \"$pic_mode\" && pic_mode=default\n\n# We assume here that the value for lt_cv_prog_cc_pic will not be cached\n# in isolation, and that seeing it set (from the cache) indicates that\n# the associated values are set (in the cache) correctly too.\nAC_MSG_CHECKING([for $compiler option to produce PIC])\nAC_CACHE_VAL(lt_cv_prog_cc_pic,\n[ lt_cv_prog_cc_pic=\n  lt_cv_prog_cc_shlib=\n  lt_cv_prog_cc_wl=\n  lt_cv_prog_cc_static=\n  lt_cv_prog_cc_no_builtin=\n  lt_cv_prog_cc_can_build_shared=$can_build_shared\n\n  if test \"$GCC\" = yes; then\n    lt_cv_prog_cc_wl='-Wl,'\n    lt_cv_prog_cc_static='-static'\n\n    case $host_os in\n    aix*)\n      # Below there is a dirty hack to force normal static linking with -ldl\n      # The problem is because libdl dynamically linked with both libc and\n      # libC (AIX C++ library), which obviously doesn't included in libraries\n      # list by gcc. This cause undefined symbols with -static flags.\n      # This hack allows C programs to be linked with \"-static -ldl\", but\n      # not sure about C++ programs.\n      lt_cv_prog_cc_static=\"$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC\"\n      ;;\n    amigaos*)\n      # FIXME: we need at least 68020 code to build shared libraries, but\n      # adding the `-m68020' flag to GCC prevents building anything better,\n      # like `-m68040'.\n      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'\n      ;;\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_cv_prog_cc_pic='-fno-common'\n      ;;\n    cygwin* | mingw* | pw32* | os2*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_cv_prog_cc_pic='-DDLL_EXPORT'\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t lt_cv_prog_cc_pic=-Kconform_pic\n      fi\n      ;;\n    *)\n      lt_cv_prog_cc_pic='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for PIC flags for the system compiler.\n    case $host_os in\n    aix3* | aix4* | aix5*)\n      lt_cv_prog_cc_wl='-Wl,'\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_cv_prog_cc_static='-Bstatic'\n      else\n\tlt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static=\"${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive\"\n      lt_cv_prog_cc_pic='+Z'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static='-non_shared'\n      # PIC (with -KPIC) is the default.\n      ;;\n\n    cygwin* | mingw* | pw32* | os2*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_cv_prog_cc_pic='-DDLL_EXPORT'\n      ;;\n\n    newsos6)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      # All OSF/1 code is PIC.\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static='-non_shared'\n      ;;\n\n    sco3.2v5*)\n      lt_cv_prog_cc_pic='-Kpic'\n      lt_cv_prog_cc_static='-dn'\n      lt_cv_prog_cc_shlib='-belf'\n      ;;\n\n    solaris*)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      lt_cv_prog_cc_wl='-Wl,'\n      ;;\n\n    sunos4*)\n      lt_cv_prog_cc_pic='-PIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      lt_cv_prog_cc_wl='-Qoption ld '\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      if test \"x$host_vendor\" = xsni; then\n\tlt_cv_prog_cc_wl='-LD'\n      else\n\tlt_cv_prog_cc_wl='-Wl,'\n      fi\n      ;;\n\n    uts4*)\n      lt_cv_prog_cc_pic='-pic'\n      lt_cv_prog_cc_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_cv_prog_cc_pic='-Kconform_pic'\n\tlt_cv_prog_cc_static='-Bstatic'\n      fi\n      ;;\n\n    *)\n      lt_cv_prog_cc_can_build_shared=no\n      ;;\n    esac\n  fi\n])\nif test -z \"$lt_cv_prog_cc_pic\"; then\n  AC_MSG_RESULT([none])\nelse\n  AC_MSG_RESULT([$lt_cv_prog_cc_pic])\n\n  # Check to make sure the pic_flag actually works.\n  AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works])\n  AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl\n    save_CFLAGS=\"$CFLAGS\"\n    CFLAGS=\"$CFLAGS $lt_cv_prog_cc_pic -DPIC\"\n    AC_TRY_COMPILE([], [], [dnl\n      case $host_os in\n      hpux9* | hpux10* | hpux11*)\n\t# On HP-UX, both CC and GCC only warn that PIC is supported... then\n\t# they create non-PIC objects.  So, if there were any warnings, we\n\t# assume that PIC is not supported.\n\tif test -s conftest.err; then\n\t  lt_cv_prog_cc_pic_works=no\n\telse\n\t  lt_cv_prog_cc_pic_works=yes\n\tfi\n\t;;\n      *)\n\tlt_cv_prog_cc_pic_works=yes\n\t;;\n      esac\n    ], [dnl\n      lt_cv_prog_cc_pic_works=no\n    ])\n    CFLAGS=\"$save_CFLAGS\"\n  ])\n\n  if test \"X$lt_cv_prog_cc_pic_works\" = Xno; then\n    lt_cv_prog_cc_pic=\n    lt_cv_prog_cc_can_build_shared=no\n  else\n    lt_cv_prog_cc_pic=\" $lt_cv_prog_cc_pic\"\n  fi\n\n  AC_MSG_RESULT([$lt_cv_prog_cc_pic_works])\nfi\n##\n## END FIXME\n\n# Check for any special shared library compilation flags.\nif test -n \"$lt_cv_prog_cc_shlib\"; then\n  AC_MSG_WARN([\\`$CC' requires \\`$lt_cv_prog_cc_shlib' to build shared libraries])\n  if echo \"$old_CC $old_CFLAGS \" | egrep -e \"[[ \t]]$lt_cv_prog_cc_shlib[[ \t]]\" >/dev/null; then :\n  else\n   AC_MSG_WARN([add \\`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure])\n    lt_cv_prog_cc_can_build_shared=no\n  fi\nfi\n\n## FIXME: this should be a separate macro\n##\nAC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works])\nAC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl\n  lt_cv_prog_cc_static_works=no\n  save_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$LDFLAGS $lt_cv_prog_cc_static\"\n  AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes])\n  LDFLAGS=\"$save_LDFLAGS\"\n])\n\n# Belt *and* braces to stop my trousers falling down:\ntest \"X$lt_cv_prog_cc_static_works\" = Xno && lt_cv_prog_cc_static=\nAC_MSG_RESULT([$lt_cv_prog_cc_static_works])\n\npic_flag=\"$lt_cv_prog_cc_pic\"\nspecial_shlib_compile_flags=\"$lt_cv_prog_cc_shlib\"\nwl=\"$lt_cv_prog_cc_wl\"\nlink_static_flag=\"$lt_cv_prog_cc_static\"\nno_builtin_flag=\"$lt_cv_prog_cc_no_builtin\"\ncan_build_shared=\"$lt_cv_prog_cc_can_build_shared\"\n##\n## END FIXME\n\n\n## FIXME: this should be a separate macro\n##\n# Check to see if options -o and -c are simultaneously supported by compiler\nAC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext])\nAC_CACHE_VAL([lt_cv_compiler_c_o], [\n$rm -r conftest 2>/dev/null\nmkdir conftest\ncd conftest\necho \"int some_variable = 0;\" > conftest.$ac_ext\nmkdir out\n# According to Tom Tromey, Ian Lance Taylor reported there are C compilers\n# that will create temporary files in the current directory regardless of\n# the output directory.  Thus, making CWD read-only will cause this test\n# to fail, enabling locking or at least warning the user not to do parallel\n# builds.\nchmod -w .\nsave_CFLAGS=\"$CFLAGS\"\nCFLAGS=\"$CFLAGS -o out/conftest2.$ac_objext\"\ncompiler_c_o=no\nif { (eval echo configure:__oline__: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then\n  # The compiler can only warn and ignore the option if not recognized\n  # So say no if there are warnings\n  if test -s out/conftest.err; then\n    lt_cv_compiler_c_o=no\n  else\n    lt_cv_compiler_c_o=yes\n  fi\nelse\n  # Append any errors to the config.log.\n  cat out/conftest.err 1>&AC_FD_CC\n  lt_cv_compiler_c_o=no\nfi\nCFLAGS=\"$save_CFLAGS\"\nchmod u+w .\n$rm conftest* out/*\nrmdir out\ncd ..\nrmdir conftest\n$rm -r conftest 2>/dev/null\n])\ncompiler_c_o=$lt_cv_compiler_c_o\nAC_MSG_RESULT([$compiler_c_o])\n\nif test x\"$compiler_c_o\" = x\"yes\"; then\n  # Check to see if we can write to a .lo\n  AC_MSG_CHECKING([if $compiler supports -c -o file.lo])\n  AC_CACHE_VAL([lt_cv_compiler_o_lo], [\n  lt_cv_compiler_o_lo=no\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -c -o conftest.lo\"\n  save_objext=\"$ac_objext\"\n  ac_objext=lo\n  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl\n    # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n    if test -s conftest.err; then\n      lt_cv_compiler_o_lo=no\n    else\n      lt_cv_compiler_o_lo=yes\n    fi\n  ])\n  ac_objext=\"$save_objext\"\n  CFLAGS=\"$save_CFLAGS\"\n  ])\n  compiler_o_lo=$lt_cv_compiler_o_lo\n  AC_MSG_RESULT([$compiler_o_lo])\nelse\n  compiler_o_lo=no\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Check to see if we can do hard links to lock some files if needed\nhard_links=\"nottested\"\nif test \"$compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $rm conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([\\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nif test \"$GCC\" = yes; then\n  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler\n  AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions])\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext\"\n  compiler_rtti_exceptions=no\n  AC_TRY_COMPILE([], [int some_variable = 0;], [dnl\n    # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n    if test -s conftest.err; then\n      compiler_rtti_exceptions=no\n    else\n      compiler_rtti_exceptions=yes\n    fi\n  ])\n  CFLAGS=\"$save_CFLAGS\"\n  AC_MSG_RESULT([$compiler_rtti_exceptions])\n\n  if test \"$compiler_rtti_exceptions\" = \"yes\"; then\n    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'\n  else\n    no_builtin_flag=' -fno-builtin'\n  fi\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# See if the linker supports building shared libraries.\nAC_MSG_CHECKING([whether the linker ($LD) supports shared libraries])\n\nallow_undefined_flag=\nno_undefined_flag=\nneed_lib_prefix=unknown\nneed_version=unknown\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\narchive_cmds=\narchive_expsym_cmds=\nold_archive_from_new_cmds=\nold_archive_from_expsyms_cmds=\nexport_dynamic_flag_spec=\nwhole_archive_flag_spec=\nthread_safe_flag_spec=\nhardcode_into_libs=no\nhardcode_libdir_flag_spec=\nhardcode_libdir_separator=\nhardcode_direct=no\nhardcode_minus_L=no\nhardcode_shlibpath_var=unsupported\nrunpath_var=\nlink_all_deplibs=unknown\nalways_export_symbols=no\nexport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n# include_expsyms should be a list of space-separated symbols to be *always*\n# included in the symbol list\ninclude_expsyms=\n# exclude_expsyms can be an egrep regular expression of symbols to exclude\n# it will be wrapped by ` (' and `)$', so one must not match beginning or\n# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n# as well as any symbol that contains `d'.\nexclude_expsyms=\"_GLOBAL_OFFSET_TABLE_\"\n# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n# platforms (ab)use it in PIC code, but their linkers get confused if\n# the symbol is explicitly referenced.  Since portable code cannot\n# rely on this symbol name, it's probably fine to never include it in\n# preloaded symbol tables.\nextract_expsyms_cmds=\n\ncase $host_os in\ncygwin* | mingw* | pw32*)\n  # FIXME: the MSVC++ port hasn't been tested in a loooong time\n  # When not using gcc, we currently assume that we are using\n  # Microsoft Visual C++.\n  if test \"$GCC\" != yes; then\n    with_gnu_ld=no\n  fi\n  ;;\nopenbsd*)\n  with_gnu_ld=no\n  ;;\nesac\n\nld_shlibs=yes\nif test \"$with_gnu_ld\" = yes; then\n  # If archive_cmds runs LD, not CC, wlarc should be empty\n  wlarc='${wl}'\n\n  # See if GNU ld supports shared libraries.\n  case $host_os in\n  aix3* | aix4* | aix5*)\n    # On AIX, the GNU linker is very broken\n    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.\n    ld_shlibs=no\n    cat <<EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\nEOF\n    ;;\n\n  amigaos*)\n    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n\n    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports\n    # that the semantics of dynamic libraries on AmigaOS, at least up\n    # to version 4, is to share data among multiple programs linked\n    # with the same dynamic library.  Since this doesn't match the\n    # behavior of shared libraries on other platforms, we can use\n    # them.\n    ld_shlibs=no\n    ;;\n\n  beos*)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      allow_undefined_flag=unsupported\n      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n      # support --undefined.  This deserves some investigation.  FIXME\n      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec='-L$libdir'\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n\n    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \\\n      sed -e \"/^# \\/\\* impgen\\.c starts here \\*\\//,/^# \\/\\* impgen.c ends here \\*\\// { s/^# //;s/^# *$//; p; }\" -e d < $''0 > $output_objdir/impgen.c~\n      test -f $output_objdir/impgen.exe || (cd $output_objdir && \\\n      if test \"x$HOST_CC\" != \"x\" ; then $HOST_CC -o impgen impgen.c ; \\\n      else $CC -o impgen impgen.c ; fi)~\n      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'\n\n    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'\n\n    # cygwin and mingw dlls have different entry points and sets of symbols\n    # to exclude.\n    # FIXME: what about values for MSVC?\n    dll_entry=__cygwin_dll_entry@12\n    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~\n    case $host_os in\n    mingw*)\n      # mingw values\n      dll_entry=_DllMainCRTStartup@12\n      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~\n      ;;\n    esac\n\n    # mingw and cygwin differ, and it's simplest to just exclude the union\n    # of the two symbol sets.\n    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12\n\n    # recent cygwin and mingw systems supply a stub DllMain which the user\n    # can override, but on older systems we have to supply one (in ltdll.c)\n    if test \"x$lt_cv_need_dllmain\" = \"xyes\"; then\n      ltdll_obj='$output_objdir/$soname-ltdll.'\"$ac_objext \"\n      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e \"/^# \\/\\* ltdll\\.c starts here \\*\\//,/^# \\/\\* ltdll.c ends here \\*\\// { s/^# //; p; }\" -e d < $''0 > $output_objdir/$soname-ltdll.c~\n\ttest -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'\n    else\n      ltdll_obj=\n      ltdll_cmds=\n    fi\n\n    # Extract the symbol export list from an `--export-all' def file,\n    # then regenerate the def file from the symbol export list, so that\n    # the compiled dll only exports the symbol export list.\n    # Be careful not to strip the DATA tag left be newer dlltools.\n    export_symbols_cmds=\"$ltdll_cmds\"'\n      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~\n      sed -e \"1,/EXPORTS/d\" -e \"s/ @ [[0-9]]*//\" -e \"s/ *;.*$//\" < $output_objdir/$soname-def > $export_symbols'\n\n    # If the export-symbols file already is a .def file (1st line\n    # is EXPORTS), use it as is.\n    # If DATA tags from a recent dlltool are present, honour them!\n    archive_expsym_cmds='if test \"x`head -1 $export_symbols`\" = xEXPORTS; then\n\tcp $export_symbols $output_objdir/$soname-def;\n      else\n\techo EXPORTS > $output_objdir/$soname-def;\n\t_lt_hint=1;\n\tcat $export_symbols | while read symbol; do\n\t set dummy \\$symbol;\n\t case \\[$]# in\n\t   2) echo \"   \\[$]2 @ \\$_lt_hint ; \" >> $output_objdir/$soname-def;;\n\t   *) echo \"     \\[$]2 @ \\$_lt_hint \\[$]3 ; \" >> $output_objdir/$soname-def;;\n\t esac;\n\t _lt_hint=`expr 1 + \\$_lt_hint`;\n\tdone;\n      fi~\n      '\"$ltdll_cmds\"'\n      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~\n      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~\n      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'\n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n      wlarc=\n    else\n      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    fi\n    ;;\n\n  solaris* | sysv5*)\n    if $LD -v 2>&1 | egrep 'BFD 2\\.8' > /dev/null; then\n      ld_shlibs=no\n      cat <<EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\nEOF\n    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n\n  sunos4*)\n    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n    wlarc=\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n  esac\n\n  if test \"$ld_shlibs\" = yes; then\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    case $host_os in\n    cygwin* | mingw* | pw32*)\n      # dlltool doesn't understand --whole-archive et. al.\n      whole_archive_flag_spec=\n      ;;\n    *)\n      # ancient GNU ld didn't support --whole-archive et. al.\n      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then\n\twhole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n      else\n\twhole_archive_flag_spec=\n      fi\n      ;;\n    esac\n  fi\nelse\n  # PORTME fill in a description of your system's linker (not GNU ld)\n  case $host_os in\n  aix3*)\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n    # Note: this linker hardcodes the directories in LIBPATH if there\n    # are no directories specified by -L.\n    hardcode_minus_L=yes\n    if test \"$GCC\" = yes && test -z \"$link_static_flag\"; then\n      # Neither direct hardcoding nor static linking is supported with a\n      # broken collect2.\n      hardcode_direct=unsupported\n    fi\n    ;;\n\n  aix4* | aix5*)\n    if test \"$host_cpu\" = ia64; then\n      # On IA64, the linker does run time linking by default, so we don't\n      # have to do anything special.\n      aix_use_runtimelinking=no\n      exp_sym_flag='-Bexport'\n      no_entry_flag=\"\"\n    else\n      aix_use_runtimelinking=no\n\n      # Test if we are trying to use run time linking or normal\n      # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n      # need to do runtime linking.\n      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)\n\tfor ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\tdone\n      esac\n\n      exp_sym_flag='-bexport'\n      no_entry_flag='-bnoentry'\n    fi\n\n    # When large executables or shared objects are built, AIX ld can\n    # have problems creating the table of contents.  If linking a library\n    # or program results in \"error TOC overflow\" add -mminimal-toc to\n    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n    hardcode_direct=yes\n    archive_cmds=''\n    hardcode_libdir_separator=':'\n    if test \"$GCC\" = yes; then\n      case $host_os in aix4.[[012]]|aix4.[[012]].*)\n\tcollect2name=`${CC} -print-prog-name=collect2`\n\tif test -f \"$collect2name\" && \\\n\t  strings \"$collect2name\" | grep resolve_lib_name >/dev/null\n\tthen\n\t  # We have reworked collect2\n\t  hardcode_direct=yes\n\telse\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\tfi\n      esac\n\n      shared_flag='-shared'\n    else\n      # not using gcc\n      if test \"$host_cpu\" = ia64; then\n\tshared_flag='${wl}-G'\n      else\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag='${wl}-G'\n\telse\n\t  shared_flag='${wl}-bM:SRE'\n\tfi\n      fi\n    fi\n\n    # It seems that -bexpall can do strange things, so it is better to\n    # generate a list of symbols to export.\n    always_export_symbols=yes\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # Warning - without using the other runtime loading flags (-brtl),\n      # -berok will link without error, but may produce a broken library.\n      allow_undefined_flag='-berok'\n      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'\n      archive_expsym_cmds=\"\\$CC\"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then echo \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n    else\n      if test \"$host_cpu\" = ia64; then\n\thardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\tallow_undefined_flag=\"-z nodefs\"\n\tarchive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols\"\n      else\n\thardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'\n\t# Warning - without using the other run time loading flags,\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='${wl}-berok'\n\t# This is a bit strange, but is similar to how AIX traditionally builds\n\t# it's shared libraries.\n\tarchive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols\"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'\n      fi\n    fi\n    ;;\n\n  amigaos*)\n    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    # see comment about different semantics on the GNU ld section\n    ld_shlibs=no\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec=' '\n    allow_undefined_flag=unsupported\n    # Tell ltmain to make .lib files, not .a files.\n    libext=lib\n    # FIXME: Setting linknames here is a bad hack.\n    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo \"$deplibs\" | sed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n    # The linker will automatically build a .lib file if we build a DLL.\n    old_archive_from_new_cmds='true'\n    # FIXME: Should let the user specify the lib program.\n    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'\n    fix_srcfile_path='`cygpath -w \"$srcfile\"`'\n    ;;\n\n  darwin* | rhapsody*)\n    case \"$host_os\" in\n    rhapsody* | darwin1.[[012]])\n      allow_undefined_flag='-undefined suppress'\n      ;;\n    *) # Darwin 1.3 on\n      allow_undefined_flag='-flat_namespace -undefined suppress'\n      ;;\n    esac\n    # FIXME: Relying on posixy $() will cause problems for\n    #        cross-compilation, but unfortunately the echo tests do not\n    #        yet detect zsh echo's removal of \\ escapes.  Also zsh mangles\n    #\t     `\"' quotes if we put them in here... so don't!\n    archive_cmds='$nonopt $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'\n    # We need to add '_' to the symbols in $export_symbols first\n    #archive_expsym_cmds=\"$archive_cmds\"' && strip -s $export_symbols'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    whole_archive_flag_spec='-all_load $convenience'\n    ;;\n\n  freebsd1*)\n    ld_shlibs=no\n    ;;\n\n  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n  # support.  Future versions do this automatically, but an explicit c++rt0.o\n  # does not break anything, and helps significantly (at the cost of a little\n  # extra space).\n  freebsd2.2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n  freebsd2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n  freebsd*)\n    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  hpux9* | hpux10* | hpux11*)\n    case $host_os in\n    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;\n    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;\n    esac\n    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n    hardcode_libdir_separator=:\n    hardcode_direct=yes\n    hardcode_minus_L=yes # Not in the search PATH, but as the default\n\t\t\t # location of the library.\n    export_dynamic_flag_spec='${wl}-E'\n    ;;\n\n  irix5* | irix6* | nonstopux*)\n    if test \"$GCC\" = yes; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n    else\n      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    link_all_deplibs=yes\n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n    else\n      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n    fi\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  newsos6)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    hardcode_shlibpath_var=no\n    ;;\n\n  openbsd*)\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n    else\n      case \"$host_os\" in\n      openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_libdir_flag_spec='-R$libdir'\n        ;;\n      *)\n        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'\n        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n        ;;\n      esac\n    fi\n    ;;\n\n  os2*)\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    allow_undefined_flag=unsupported\n    archive_cmds='$echo \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$echo \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n    ;;\n\n  osf3*)\n    if test \"$GCC\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    ;;\n\n  osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n    if test \"$GCC\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n      archive_expsym_cmds='for i in `cat $export_symbols`; do printf \"-exported_symbol \" >> $lib.exp; echo \"\\$i\" >> $lib.exp; done; echo \"-hidden\">> $lib.exp~\n      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'\n\n      #Both c and cxx compiler support -rpath directly\n      hardcode_libdir_flag_spec='-rpath $libdir'\n    fi\n    hardcode_libdir_separator=:\n    ;;\n\n  sco3.2v5*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_shlibpath_var=no\n    runpath_var=LD_RUN_PATH\n    hardcode_runpath_var=yes\n    export_dynamic_flag_spec='${wl}-Bexport'\n    ;;\n\n  solaris*)\n    # gcc --version < 3.0 without binutils cannot create self contained\n    # shared libraries reliably, requiring libgcc.a to resolve some of\n    # the object symbols generated in some cases.  Libraries that use\n    # assert need libgcc.a to resolve __eprintf, for example.  Linking\n    # a copy of libgcc.a into every shared library to guarantee resolving\n    # such symbols causes other problems:  According to Tim Van Holder\n    # <tim.van.holder@pandora.be>, C++ libraries end up with a separate\n    # (to the application) exception stack for one thing.\n    no_undefined_flag=' -z defs'\n    if test \"$GCC\" = yes; then\n      case `$CC --version 2>/dev/null` in\n      [[12]].*)\n\tcat <<EOF 1>&2\n\n*** Warning: Releases of GCC earlier than version 3.0 cannot reliably\n*** create self contained shared libraries on Solaris systems, without\n*** introducing a dependency on libgcc.a.  Therefore, libtool is disabling\n*** -no-undefined support, which will at least allow you to build shared\n*** libraries.  However, you may find that when you link such libraries\n*** into an application without using GCC, you have to manually add\n*** \\`gcc --print-libgcc-file-name\\` to the link command.  We urge you to\n*** upgrade to a newer version of GCC.  Another option is to rebuild your\n*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.\n\nEOF\n        no_undefined_flag=\n\t;;\n      esac\n    fi\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_shlibpath_var=no\n    case $host_os in\n    solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n    *) # Supported since Solaris 2.6 (maybe 2.5.1?)\n      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;\n    esac\n    link_all_deplibs=yes\n    ;;\n\n  sunos4*)\n    if test \"x$host_vendor\" = xsequent; then\n      # Use $CC to link under sequent, because it throws in some extra .o\n      # files that make .init and .fini sections work.\n      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n    else\n      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n    fi\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4)\n    if test \"x$host_vendor\" = xsno; then\n      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes # is this really true???\n    else\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n    fi\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4.3*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_shlibpath_var=no\n    export_dynamic_flag_spec='-Bexport'\n    ;;\n\n  sysv5*)\n    no_undefined_flag=' -z text'\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'\n    hardcode_libdir_flag_spec=\n    hardcode_shlibpath_var=no\n    runpath_var='LD_RUN_PATH'\n    ;;\n\n  uts4*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  dgux*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4*MP*)\n    if test -d /usr/nec; then\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      runpath_var=LD_RUN_PATH\n      hardcode_runpath_var=yes\n      ld_shlibs=yes\n    fi\n    ;;\n\n  sysv4.2uw2*)\n    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_minus_L=no\n    hardcode_shlibpath_var=no\n    hardcode_runpath_var=yes\n    runpath_var=LD_RUN_PATH\n    ;;\n\n  sysv5uw7* | unixware7*)\n    no_undefined_flag='${wl}-z ${wl}text'\n    if test \"$GCC\" = yes; then\n      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n    else\n      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n    fi\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    ld_shlibs=no\n    ;;\n  esac\nfi\nAC_MSG_RESULT([$ld_shlibs])\ntest \"$ld_shlibs\" = no && can_build_shared=no\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Check hardcoding attributes.\nAC_MSG_CHECKING([how to hardcode library paths into programs])\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" || \\\n   test -n \"$runpath_var\"; then\n\n  # We can hardcode non-existant directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$hardcode_shlibpath_var\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\nAC_MSG_RESULT([$hardcode_action])\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | grep \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n  AC_MSG_RESULT([no])\nfi\n##\n## END FIXME\n\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n## FIXME: this should be a separate macro\n##\n# PORTME Fill in your ld.so characteristics\nAC_MSG_CHECKING([dynamic linker characteristics])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nsys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}.so$major'\n  ;;\n\naix4* | aix5*)\n  version_type=linux\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n\tif { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t     echo ' yes '\n\t     echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then\n\t  :\n\telse\n\t  can_build_shared=no\n\tfi\n\t;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can\n    # not hardcode correct soname into executable. Probably we can\n    # add versioning support to collect2, so additional links can\n    # be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}.so$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  library_names_spec='$libname.ixlibrary $libname.a'\n  # Create ${libname}_ixlibrary.a entries in /sys/libs.\n  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo \"X$lib\" | $Xsed -e '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show \"(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)\"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'\n  ;;\n\nbeos*)\n  library_names_spec='${libname}.so'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi4*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  export_dynamic_flag_spec=-rdynamic\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32*)\n  version_type=windows\n  need_version=no\n  need_lib_prefix=no\n  case $GCC,$host_os in\n  yes,cygwin*)\n    library_names_spec='$libname.dll.a'\n    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'\n    postinstall_cmds='dlpath=`bash 2>&1 -c '\\''. $dir/${file}i;echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog .libs/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`bash 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $rm \\$dlpath'\n    ;;\n  yes,mingw*)\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'\n    sys_lib_search_path_spec=`$CC -print-search-dirs | grep \"^libraries:\" | sed -e \"s/^libraries://\" -e \"s/;/ /g\"`\n    ;;\n  yes,pw32*)\n    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'\n    ;;\n  *)\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  # FIXME: Relying on posixy $() will cause problems for\n  #        cross-compilation, but unfortunately the echo tests do not\n  #        yet detect zsh echo's removal of \\ escapes.\n  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'\n  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd*)\n  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  *)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  dynamic_linker=\"$host_os dld.sl\"\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  shlibpath_var=SHLIB_PATH\n  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'\n  soname_spec='${libname}${release}.sl$major'\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)          version_type=irix ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}.so$major'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \") libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \") libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \") libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux-gnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'\n    soname_spec='${libname}${release}.so$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case \"$host_os\" in\n    openbsd2.[[89]] | openbsd2.[[89]].*)\n      shlibpath_overrides_runpath=no\n      ;;\n    *)\n      shlibpath_overrides_runpath=yes\n      ;;\n    esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nos2*)\n  libname_spec='$name'\n  need_lib_prefix=no\n  library_names_spec='$libname.dll $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_version=no\n  need_lib_prefix=no\n  soname_spec='${libname}${release}.so'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nsco3.2v5*)\n  version_type=osf\n  soname_spec='${libname}${release}.so$major'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'\n    soname_spec='$libname.so.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Report the final consequences.\nAC_MSG_CHECKING([if libtool supports shared libraries])\nAC_MSG_RESULT([$can_build_shared])\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nAC_MSG_CHECKING([whether to build shared libraries])\ntest \"$can_build_shared\" = \"no\" && enable_shared=no\n\n# On AIX, shared libraries and static libraries use the same namespace, and\n# are all built from PIC.\ncase \"$host_os\" in\naix3*)\n  test \"$enable_shared\" = yes && enable_static=no\n  if test -n \"$RANLIB\"; then\n    archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n    postinstall_cmds='$RANLIB $lib'\n  fi\n  ;;\n\naix4*)\n  if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n    test \"$enable_shared\" = yes && enable_static=no\n  fi\n  ;;\nesac\nAC_MSG_RESULT([$enable_shared])\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nAC_MSG_CHECKING([whether to build static libraries])\n# Make sure either enable_shared or enable_static is yes.\ntest \"$enable_shared\" = yes || enable_static=yes\nAC_MSG_RESULT([$enable_static])\n##\n## END FIXME\n\nif test \"$hardcode_action\" = relink; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nAC_LIBTOOL_DLOPEN_SELF\n\n## FIXME: this should be a separate macro\n##\nif test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n  case $archive_cmds in\n  *'~'*)\n    # FIXME: we may have to deal with multi-command sequences.\n    ;;\n  '$CC '*)\n    # Test whether the compiler implicitly links with -lc since on some\n    # systems, -lgcc has to come before -lc. If gcc already passes -lc\n    # to ld, don't add -lc before -lgcc.\n    AC_MSG_CHECKING([whether -lc should be explicitly linked in])\n    AC_CACHE_VAL([lt_cv_archive_cmds_need_lc],\n    [$rm conftest*\n    echo 'static int dummy;' > conftest.$ac_ext\n\n    if AC_TRY_EVAL(ac_compile); then\n      soname=conftest\n      lib=conftest\n      libobjs=conftest.$ac_objext\n      deplibs=\n      wl=$lt_cv_prog_cc_wl\n      compiler_flags=-v\n      linker_flags=-v\n      verstring=\n      output_objdir=.\n      libname=conftest\n      save_allow_undefined_flag=$allow_undefined_flag\n      allow_undefined_flag=\n      if AC_TRY_EVAL(archive_cmds 2\\>\\&1 \\| grep \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n      then\n\tlt_cv_archive_cmds_need_lc=no\n      else\n\tlt_cv_archive_cmds_need_lc=yes\n      fi\n      allow_undefined_flag=$save_allow_undefined_flag\n    else\n      cat conftest.err 1>&5\n    fi])\n    AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc])\n    ;;\n  esac\nfi\nneed_lc=${lt_cv_archive_cmds_need_lc-yes}\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# The second clause should only fire when bootstrapping the\n# libtool distribution, otherwise you forgot to ship ltmain.sh\n# with your package, and you will get complaints that there are\n# no rules to generate ltmain.sh.\nif test -f \"$ltmain\"; then\n  :\nelse\n  # If there is no Makefile yet, we rely on a make rule to execute\n  # `config.status --recheck' to rerun these tests and create the\n  # libtool script then.\n  test -f Makefile && make \"$ltmain\"\nfi\n\nif test -f \"$ltmain\"; then\n  trap \"$rm \\\"${ofile}T\\\"; exit 1\" 1 2 15\n  $rm -f \"${ofile}T\"\n\n  echo creating $ofile\n\n  # Now quote all the things that may contain metacharacters while being\n  # careful not to overquote the AC_SUBSTed values.  We take copies of the\n  # variables and quote the copies for generation of the libtool script.\n  for var in echo old_CC old_CFLAGS \\\n    AR AR_FLAGS CC LD LN_S NM SHELL \\\n    reload_flag reload_cmds wl \\\n    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \\\n    thread_safe_flag_spec whole_archive_flag_spec libname_spec \\\n    library_names_spec soname_spec \\\n    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \\\n    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \\\n    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \\\n    old_striplib striplib file_magic_cmd export_symbols_cmds \\\n    deplibs_check_method allow_undefined_flag no_undefined_flag \\\n    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \\\n    global_symbol_to_c_name_address \\\n    hardcode_libdir_flag_spec hardcode_libdir_separator  \\\n    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \\\n    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do\n\n    case $var in\n    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \\\n    old_postinstall_cmds | old_postuninstall_cmds | \\\n    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \\\n    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \\\n    postinstall_cmds | postuninstall_cmds | \\\n    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)\n      # Double-quote double-evaled strings.\n      eval \"lt_$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$double_quote_subst\\\" -e \\\"\\$sed_quote_subst\\\" -e \\\"\\$delay_variable_subst\\\"\\`\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$sed_quote_subst\\\"\\`\\\\\\\"\"\n      ;;\n    esac\n  done\n\n  cat <<__EOF__ > \"${ofile}T\"\n#! $SHELL\n\n# `$echo \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n# Copyright (C) 1996-2000 Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"sed -e s/^X//\"\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X\\${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$need_lc\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\n\n# An echo program that does not interpret backslashes.\necho=$lt_echo\n\n# The archiver.\nAR=$lt_AR\nAR_FLAGS=$lt_AR_FLAGS\n\n# The default C compiler.\nCC=$lt_CC\n\n# Is the compiler the GNU C compiler?\nwith_gcc=$GCC\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# Whether we need hard or soft links.\nLN_S=$lt_LN_S\n\n# A BSD-compatible nm program.\nNM=$lt_NM\n\n# A symbol stripping program\nSTRIP=$STRIP\n\n# Used to examine libraries when file_magic_cmd begins \"file\"\nMAGIC_CMD=$MAGIC_CMD\n\n# Used on cygwin: DLL creation program.\nDLLTOOL=\"$DLLTOOL\"\n\n# Used on cygwin: object dumper.\nOBJDUMP=\"$OBJDUMP\"\n\n# Used on cygwin: assembler.\nAS=\"$AS\"\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# How to pass a linker flag through the compiler.\nwl=$lt_wl\n\n# Object file suffix (normally \"o\").\nobjext=\"$ac_objext\"\n\n# Old archive suffix (normally \"a\").\nlibext=\"$libext\"\n\n# Executable file suffix (normally \"\").\nexeext=\"$exeext\"\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_pic_flag\npic_mode=$pic_mode\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_compiler_c_o\n\n# Can we write directly to a .lo ?\ncompiler_o_lo=$lt_compiler_o_lo\n\n# Must we lock files when doing compilation ?\nneed_locks=$lt_need_locks\n\n# Do we need the lib prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_link_static_flag\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_no_builtin_flag\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Compiler flag to generate thread-safe objects.\nthread_safe_flag_spec=$lt_thread_safe_flag_spec\n\n# Library versioning type.\nversion_type=$version_type\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME.\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Commands used to build and install an old-style archive.\nRANLIB=$lt_RANLIB\nold_archive_cmds=$lt_old_archive_cmds\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build and install a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\npostinstall_cmds=$lt_postinstall_cmds\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method == file_magic.\nfile_magic_cmd=$lt_file_magic_cmd\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that forces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# Same as above, but a single script fragment to be evaled but not shown.\nfinish_eval=$lt_finish_eval\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration\nglobal_symbol_to_cdecl=$lt_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair\nglobal_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address\n\n# This is the shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# This is the shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single -rpath flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the\n# resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to yes if using the -LDIR flag during linking hardcodes DIR into the\n# resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into\n# the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at relink time.\nvariables_saved_for_relink=\"$variables_saved_for_relink\"\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Compile-time system search path for libraries\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=\"$fix_srcfile_path\"\n\n# Set to yes if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# ### END LIBTOOL CONFIG\n\n__EOF__\n\n  case $host_os in\n  aix3*)\n    cat <<\\EOF >> \"${ofile}T\"\n\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\nEOF\n    ;;\n  esac\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | os2*)\n    cat <<'EOF' >> \"${ofile}T\"\n      # This is a source program that is used to create dlls on Windows\n      # Don't remove nor modify the starting and closing comments\n# /* ltdll.c starts here */\n# #define WIN32_LEAN_AND_MEAN\n# #include <windows.h>\n# #undef WIN32_LEAN_AND_MEAN\n# #include <stdio.h>\n#\n# #ifndef __CYGWIN__\n# #  ifdef __CYGWIN32__\n# #    define __CYGWIN__ __CYGWIN32__\n# #  endif\n# #endif\n#\n# #ifdef __cplusplus\n# extern \"C\" {\n# #endif\n# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);\n# #ifdef __cplusplus\n# }\n# #endif\n#\n# #ifdef __CYGWIN__\n# #include <cygwin/cygwin_dll.h>\n# DECLARE_CYGWIN_DLL( DllMain );\n# #endif\n# HINSTANCE __hDllInstance_base;\n#\n# BOOL APIENTRY\n# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)\n# {\n#   __hDllInstance_base = hInst;\n#   return TRUE;\n# }\n# /* ltdll.c ends here */\n\t# This is a source program that is used to create import libraries\n\t# on Windows for dlls which lack them. Don't remove nor modify the\n\t# starting and closing comments\n# /* impgen.c starts here */\n# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.\n#\n#  This file is part of GNU libtool.\n#\n#  This program is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 2 of the License, or\n#  (at your option) any later version.\n#\n#  This program is distributed in the hope that it will be useful,\n#  but WITHOUT ANY WARRANTY; without even the implied warranty of\n#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#  GNU General Public License for more details.\n#\n#  You should have received a copy of the GNU General Public License\n#  along with this program; if not, write to the Free Software\n#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#  */\n#\n# #include <stdio.h>\t\t/* for printf() */\n# #include <unistd.h>\t\t/* for open(), lseek(), read() */\n# #include <fcntl.h>\t\t/* for O_RDONLY, O_BINARY */\n# #include <string.h>\t\t/* for strdup() */\n#\n# /* O_BINARY isn't required (or even defined sometimes) under Unix */\n# #ifndef O_BINARY\n# #define O_BINARY 0\n# #endif\n#\n# static unsigned int\n# pe_get16 (fd, offset)\n#      int fd;\n#      int offset;\n# {\n#   unsigned char b[2];\n#   lseek (fd, offset, SEEK_SET);\n#   read (fd, b, 2);\n#   return b[0] + (b[1]<<8);\n# }\n#\n# static unsigned int\n# pe_get32 (fd, offset)\n#     int fd;\n#     int offset;\n# {\n#   unsigned char b[4];\n#   lseek (fd, offset, SEEK_SET);\n#   read (fd, b, 4);\n#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);\n# }\n#\n# static unsigned int\n# pe_as32 (ptr)\n#      void *ptr;\n# {\n#   unsigned char *b = ptr;\n#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);\n# }\n#\n# int\n# main (argc, argv)\n#     int argc;\n#     char *argv[];\n# {\n#     int dll;\n#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;\n#     unsigned long export_rva, export_size, nsections, secptr, expptr;\n#     unsigned long name_rvas, nexp;\n#     unsigned char *expdata, *erva;\n#     char *filename, *dll_name;\n#\n#     filename = argv[1];\n#\n#     dll = open(filename, O_RDONLY|O_BINARY);\n#     if (dll < 1)\n# \treturn 1;\n#\n#     dll_name = filename;\n#\n#     for (i=0; filename[i]; i++)\n# \tif (filename[i] == '/' || filename[i] == '\\\\'  || filename[i] == ':')\n# \t    dll_name = filename + i +1;\n#\n#     pe_header_offset = pe_get32 (dll, 0x3c);\n#     opthdr_ofs = pe_header_offset + 4 + 20;\n#     num_entries = pe_get32 (dll, opthdr_ofs + 92);\n#\n#     if (num_entries < 1) /* no exports */\n# \treturn 1;\n#\n#     export_rva = pe_get32 (dll, opthdr_ofs + 96);\n#     export_size = pe_get32 (dll, opthdr_ofs + 100);\n#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);\n#     secptr = (pe_header_offset + 4 + 20 +\n# \t      pe_get16 (dll, pe_header_offset + 4 + 16));\n#\n#     expptr = 0;\n#     for (i = 0; i < nsections; i++)\n#     {\n# \tchar sname[8];\n# \tunsigned long secptr1 = secptr + 40 * i;\n# \tunsigned long vaddr = pe_get32 (dll, secptr1 + 12);\n# \tunsigned long vsize = pe_get32 (dll, secptr1 + 16);\n# \tunsigned long fptr = pe_get32 (dll, secptr1 + 20);\n# \tlseek(dll, secptr1, SEEK_SET);\n# \tread(dll, sname, 8);\n# \tif (vaddr <= export_rva && vaddr+vsize > export_rva)\n# \t{\n# \t    expptr = fptr + (export_rva - vaddr);\n# \t    if (export_rva + export_size > vaddr + vsize)\n# \t\texport_size = vsize - (export_rva - vaddr);\n# \t    break;\n# \t}\n#     }\n#\n#     expdata = (unsigned char*)malloc(export_size);\n#     lseek (dll, expptr, SEEK_SET);\n#     read (dll, expdata, export_size);\n#     erva = expdata - export_rva;\n#\n#     nexp = pe_as32 (expdata+24);\n#     name_rvas = pe_as32 (expdata+32);\n#\n#     printf (\"EXPORTS\\n\");\n#     for (i = 0; i<nexp; i++)\n#     {\n# \tunsigned long name_rva = pe_as32 (erva+name_rvas+i*4);\n# \tprintf (\"\\t%s @ %ld ;\\n\", erva+name_rva, 1+ i);\n#     }\n#\n#     return 0;\n# }\n# /* impgen.c ends here */\n\nEOF\n    ;;\n  esac\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"${ofile}T\" || (rm -f \"${ofile}T\"; exit 1)\n\n  mv -f \"${ofile}T\" \"$ofile\" || \\\n    (rm -f \"$ofile\" && cp \"${ofile}T\" \"$ofile\" && rm -f \"${ofile}T\")\n  chmod +x \"$ofile\"\nfi\n##\n## END FIXME\n\n])# _LT_AC_LTCONFIG_HACK\n\n# AC_LIBTOOL_DLOPEN - enable checks for dlopen support\nAC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])\n\n# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's\nAC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])\n\n# AC_ENABLE_SHARED - implement the --enable-shared flag\n# Usage: AC_ENABLE_SHARED[(DEFAULT)]\n#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to\n#   `yes'.\nAC_DEFUN([AC_ENABLE_SHARED],\n[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl\nAC_ARG_ENABLE(shared,\nchangequote(<<, >>)dnl\n<<  --enable-shared[=PKGS]  build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],\nchangequote([, ])dnl\n[p=${PACKAGE-default}\ncase $enableval in\nyes) enable_shared=yes ;;\nno) enable_shared=no ;;\n*)\n  enable_shared=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_shared=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac],\nenable_shared=AC_ENABLE_SHARED_DEFAULT)dnl\n])\n\n# AC_DISABLE_SHARED - set the default shared flag to --disable-shared\nAC_DEFUN([AC_DISABLE_SHARED],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\nAC_ENABLE_SHARED(no)])\n\n# AC_ENABLE_STATIC - implement the --enable-static flag\n# Usage: AC_ENABLE_STATIC[(DEFAULT)]\n#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to\n#   `yes'.\nAC_DEFUN([AC_ENABLE_STATIC],\n[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl\nAC_ARG_ENABLE(static,\nchangequote(<<, >>)dnl\n<<  --enable-static[=PKGS]  build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],\nchangequote([, ])dnl\n[p=${PACKAGE-default}\ncase $enableval in\nyes) enable_static=yes ;;\nno) enable_static=no ;;\n*)\n  enable_static=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_static=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac],\nenable_static=AC_ENABLE_STATIC_DEFAULT)dnl\n])\n\n# AC_DISABLE_STATIC - set the default static flag to --disable-static\nAC_DEFUN([AC_DISABLE_STATIC],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\nAC_ENABLE_STATIC(no)])\n\n\n# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag\n# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]\n#   Where DEFAULT is either `yes' or `no'.  If omitted, it defaults to\n#   `yes'.\nAC_DEFUN([AC_ENABLE_FAST_INSTALL],\n[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl\nAC_ARG_ENABLE(fast-install,\nchangequote(<<, >>)dnl\n<<  --enable-fast-install[=PKGS]  optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],\nchangequote([, ])dnl\n[p=${PACKAGE-default}\ncase $enableval in\nyes) enable_fast_install=yes ;;\nno) enable_fast_install=no ;;\n*)\n  enable_fast_install=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_fast_install=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac],\nenable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl\n])\n\n# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install\nAC_DEFUN([AC_DISABLE_FAST_INSTALL],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\nAC_ENABLE_FAST_INSTALL(no)])\n\n# AC_LIBTOOL_PICMODE - implement the --with-pic flag\n# Usage: AC_LIBTOOL_PICMODE[(MODE)]\n#   Where MODE is either `yes' or `no'.  If omitted, it defaults to\n#   `both'.\nAC_DEFUN([AC_LIBTOOL_PICMODE],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\npic_mode=ifelse($#,1,$1,default)])\n\n\n# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library\nAC_DEFUN([AC_PATH_TOOL_PREFIX],\n[AC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n  /*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n  ?:/*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a dos path.\n  ;;\n  *)\n  ac_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  IFS=\"${IFS=   }\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"ifelse([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=\"`expr \\\"$deplibs_check_method\\\" : \\\"file_magic \\(.*\\)\\\"`\"\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    egrep \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\nEOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  MAGIC_CMD=\"$ac_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n])\n\n\n# AC_PATH_MAGIC - find a file program which can recognise a shared library\nAC_DEFUN([AC_PATH_MAGIC],\n[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl\nAC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])\n\n\n# AC_PROG_LD - find the path to the GNU or non-GNU linker\nAC_DEFUN([AC_PROG_LD],\n[AC_ARG_WITH(gnu-ld,\n[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],\ntest \"$withval\" = no || with_gnu_ld=yes, with_gnu_ld=no)\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by GCC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | [[A-Za-z]]:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the path of ld\n      ac_prog=`echo $ac_prog| sed 's%\\\\\\\\%/%g'`\n      while echo $ac_prog | grep \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`echo $ac_prog| sed \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some GNU ld's only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      if \"$lt_cv_path_LD\" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then\n\ttest \"$with_gnu_ld\" != no && break\n      else\n\ttest \"$with_gnu_ld\" != yes && break\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\nAC_PROG_LD_GNU\n])\n\n# AC_PROG_LD_GNU -\nAC_DEFUN([AC_PROG_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU ld's only accept -v.\nif $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then\n  lt_cv_prog_gnu_ld=yes\nelse\n  lt_cv_prog_gnu_ld=no\nfi])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])\n\n# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nAC_DEFUN([AC_PROG_LD_RELOAD_FLAG],\n[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag,\n[lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ntest -n \"$reload_flag\" && reload_flag=\" $reload_flag\"\n])\n\n# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nAC_DEFUN([AC_DEPLIBS_CHECK_METHOD],\n[AC_CACHE_CHECK([how to recognise dependant libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given egrep regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix4* | aix5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi4*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin* | mingw* | pw32*)\n  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  case \"$host_os\" in\n  rhapsody* | darwin1.[[012]])\n    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`\n    ;;\n  *) # Darwin 1.3 on\n    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'\n    ;;\n  esac\n  ;;\n\nfreebsd*)\n  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20*|hpux11*)\n  lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libc.sl\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n  irix5* | nonstopux*)\n    # this will be overridden with pass_all, but let us keep it just in case\n    lt_cv_deplibs_check_method=\"file_magic ELF 32-bit MSB dynamic lib MIPS - version 1\"\n    ;;\n  *)\n    case $LD in\n    *-32|*\"-32 \") libmagic=32-bit;;\n    *-n32|*\"-n32 \") libmagic=N32;;\n    *-64|*\"-64 \") libmagic=64-bit;;\n    *) libmagic=never-match;;\n    esac\n    # this will be overridden with pass_all, but let us keep it just in case\n    lt_cv_deplibs_check_method=\"file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1\"\n    ;;\n  esac\n  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux-gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`\n  ;;\n\nnetbsd*)\n  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/\\.]]+\\.so\\.[[0-9]]+\\.[[0-9]]+$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/\\.]]+\\.so$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\nopenbsd*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'\n  else\n    lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  # this will be overridden with pass_all, but let us keep it just in case\n  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsco3.2v5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  lt_cv_file_magic_test_file=/lib/libc.so\n  ;;\n\nsysv5uw[[78]]* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  esac\n  ;;\nesac\n])\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\n])\n\n\n# AC_PROG_NM - find the path to a BSD-compatible name lister\nAC_DEFUN([AC_PROG_NM],\n[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl\nAC_MSG_CHECKING([for BSD-compatible nm])\nAC_CACHE_VAL(lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do\n    test -z \"$ac_dir\" && ac_dir=.\n    tmp_nm=$ac_dir/${ac_tool_prefix}nm\n    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then\n      # Check to see if the nm accepts a BSD-compat flag.\n      # Adding the `sed 1q' prevents false positives on HP-UX, which says:\n      #   nm: unknown option \"B\" ignored\n      # Tru64's nm complains that /dev/null is an invalid object file\n      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then\n\tlt_cv_path_NM=\"$tmp_nm -B\"\n\tbreak\n      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then\n\tlt_cv_path_NM=\"$tmp_nm -p\"\n\tbreak\n      else\n\tlt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\tcontinue # so that we can try to find one that supports BSD flags\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$lt_cv_path_NM\" && lt_cv_path_NM=nm\nfi])\nNM=\"$lt_cv_path_NM\"\nAC_MSG_RESULT([$NM])\n])\n\n# AC_CHECK_LIBM - check for math library\nAC_DEFUN([AC_CHECK_LIBM],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cygwin* | *-*-pw32*)\n  # These system don't have libm\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, main, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, main, LIBM=\"-lm\")\n  ;;\nesac\n])\n\n# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for\n# the libltdl convenience library and LTDLINCL to the include flags for\n# the libltdl header and adds --enable-ltdl-convenience to the\n# configure arguments.  Note that LIBLTDL and LTDLINCL are not\n# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If DIR is not\n# provided, it is assumed to be `libltdl'.  LIBLTDL will be prefixed\n# with '${top_builddir}/' and LTDLINCL will be prefixed with\n# '${top_srcdir}/' (note the single quotes!).  If your package is not\n# flat and you're not using automake, define top_builddir and\n# top_srcdir appropriately in the Makefiles.\nAC_DEFUN([AC_LIBLTDL_CONVENIENCE],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\n  case $enable_ltdl_convenience in\n  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;\n  \"\") enable_ltdl_convenience=yes\n      ac_configure_args=\"$ac_configure_args --enable-ltdl-convenience\" ;;\n  esac\n  LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la\n  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])\n  # For backwards non-gettext consistent compatibility...\n  INCLTDL=\"$LTDLINCL\"\n])\n\n# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for\n# the libltdl installable library and LTDLINCL to the include flags for\n# the libltdl header and adds --enable-ltdl-install to the configure\n# arguments.  Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is\n# AC_CONFIG_SUBDIRS called.  If DIR is not provided and an installed\n# libltdl is not found, it is assumed to be `libltdl'.  LIBLTDL will\n# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed\n# with '${top_srcdir}/' (note the single quotes!).  If your package is\n# not flat and you're not using automake, define top_builddir and\n# top_srcdir appropriately in the Makefiles.\n# In the future, this macro may have to be called after AC_PROG_LIBTOOL.\nAC_DEFUN([AC_LIBLTDL_INSTALLABLE],\n[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl\n  AC_CHECK_LIB(ltdl, main,\n  [test x\"$enable_ltdl_install\" != xyes && enable_ltdl_install=no],\n  [if test x\"$enable_ltdl_install\" = xno; then\n     AC_MSG_WARN([libltdl not installed, but installation disabled])\n   else\n     enable_ltdl_install=yes\n   fi\n  ])\n  if test x\"$enable_ltdl_install\" = x\"yes\"; then\n    ac_configure_args=\"$ac_configure_args --enable-ltdl-install\"\n    LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la\n    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])\n  else\n    ac_configure_args=\"$ac_configure_args --enable-ltdl-install=no\"\n    LIBLTDL=\"-lltdl\"\n    LTDLINCL=\n  fi\n  # For backwards non-gettext consistent compatibility...\n  INCLTDL=\"$LTDLINCL\"\n])\n\n# old names\nAC_DEFUN([AM_PROG_LIBTOOL],   [AC_PROG_LIBTOOL])\nAC_DEFUN([AM_ENABLE_SHARED],  [AC_ENABLE_SHARED($@)])\nAC_DEFUN([AM_ENABLE_STATIC],  [AC_ENABLE_STATIC($@)])\nAC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\nAC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\nAC_DEFUN([AM_PROG_LD],        [AC_PROG_LD])\nAC_DEFUN([AM_PROG_NM],        [AC_PROG_NM])\n\n# This is just to silence aclocal about the macro not being used\nifelse([AC_DISABLE_FAST_INSTALL])\n"
  },
  {
    "path": "src/fnv/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-20'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Per Bothner <per@bothner.com>.\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# The plan is that this can be called by configure scripts if you\n# don't specify an explicit build system type.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\n\ndummy=dummy-$$\ntrap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script.\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\nset_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int dummy(){}\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;\n\t  if test $? = 0 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\trm -f $dummy.c $dummy.o $dummy.rel ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep __ELF__ >/dev/null\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t        os=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit 0 ;;\n    amiga:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    arc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    hp300:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mac68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    macppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme68k:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvme88k:OpenBSD:*:*)\n\techo m88k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    mvmeppc:OpenBSD:*:*)\n\techo powerpc-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    pmax:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sgi:OpenBSD:*:*)\n\techo mipseb-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    sun3:OpenBSD:*:*)\n\techo m68k-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    wgrisc:OpenBSD:*:*)\n\techo mipsel-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    *:OpenBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}\n\texit 0 ;;\n    alpha:OSF1:*:*)\n\tif test $UNAME_RELEASE = \"V4.0\"; then\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\tfi\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\tcat <<EOF >$dummy.s\n\t.data\n\\$Lformat:\n\t.byte 37,100,45,37,120,10,0\t# \"%d-%x\\n\"\n\n\t.text\n\t.globl main\n\t.align 4\n\t.ent main\nmain:\n\t.frame \\$30,16,\\$26,0\n\tldgp \\$29,0(\\$27)\n\t.prologue 1\n\t.long 0x47e03d80 # implver \\$0\n\tlda \\$2,-1\n\t.long 0x47e20c21 # amask \\$2,\\$1\n\tlda \\$16,\\$Lformat\n\tmov \\$0,\\$17\n\tnot \\$1,\\$18\n\tjsr \\$26,printf\n\tldgp \\$29,0(\\$26)\n\tmov 0,\\$16\n\tjsr \\$26,exit\n\t.end main\nEOF\n\teval $set_cc_for_build\n\t$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null\n\tif test \"$?\" = 0 ; then\n\t\tcase `./$dummy` in\n\t\t\t0-0)\n\t\t\t\tUNAME_MACHINE=\"alpha\"\n\t\t\t\t;;\n\t\t\t1-0)\n\t\t\t\tUNAME_MACHINE=\"alphaev5\"\n\t\t\t\t;;\n\t\t\t1-1)\n\t\t\t\tUNAME_MACHINE=\"alphaev56\"\n\t\t\t\t;;\n\t\t\t1-101)\n\t\t\t\tUNAME_MACHINE=\"alphapca56\"\n\t\t\t\t;;\n\t\t\t2-303)\n\t\t\t\tUNAME_MACHINE=\"alphaev6\"\n\t\t\t\t;;\n\t\t\t2-307)\n\t\t\t\tUNAME_MACHINE=\"alphaev67\"\n\t\t\t\t;;\n\t\t\t2-1307)\n\t\t\t\tUNAME_MACHINE=\"alphaev68\"\n\t\t\t\t;;\n\t\tesac\n\tfi\n\trm -f $dummy.s $dummy\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\texit 0 ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit 0 ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit 0 ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit 0;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit 0 ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit 0 ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit 0 ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit 0;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit 0;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit 0 ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit 0 ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    i86pc:SunOS:5.*:*)\n\techo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit 0 ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit 0 ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit 0 ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit 0 ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n        echo m68k-milan-mint${UNAME_RELEASE}\n        exit 0 ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n        echo m68k-hades-mint${UNAME_RELEASE}\n        exit 0 ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n        echo m68k-unknown-mint${UNAME_RELEASE}\n        exit 0 ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit 0 ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit 0 ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit 0 ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit 0 ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy \\\n\t  && ./$dummy `echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` \\\n\t  && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit 0 ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit 0 ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit 0 ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit 0 ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit 0 ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    AViiON:dgux:*:*)\n        # DG/UX returns AViiON for all architectures\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n \texit 0 ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit 0 ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit 0 ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit 0 ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit 0 ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit 0 ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id\n\texit 0 ;;              # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit 0 ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\t\trm -f $dummy.c $dummy\n\t\techo rs6000-ibm-aix3.2.5\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit 0 ;;\n    *:AIX:*:[45])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit 0 ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit 0 ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit 0 ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit 0 ;;                           # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit 0 ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit 0 ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit 0 ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit 0 ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n                    case \"${sc_cpu_version}\" in\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n                      532)                      # CPU_PA_RISC2_0\n                        case \"${sc_kernel_bits}\" in\n                          32) HP_ARCH=\"hppa2.0n\" ;;\n                          64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n                        esac ;;\n                    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^              //' << EOF >$dummy.c\n\n              #define _HPUX_SOURCE\n              #include <stdlib.h>\n              #include <unistd.h>\n\n              int main ()\n              {\n              #if defined(_SC_KERNEL_BITS)\n                  long bits = sysconf(_SC_KERNEL_BITS);\n              #endif\n                  long cpu  = sysconf (_SC_CPU_VERSION);\n\n                  switch (cpu)\n              \t{\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n              \tcase CPU_PA_RISC2_0:\n              #if defined(_SC_KERNEL_BITS)\n              \t    switch (bits)\n              \t\t{\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\n              \t\tdefault: puts (\"hppa2.0\"); break;\n              \t\t} break;\n              #else  /* !defined(_SC_KERNEL_BITS) */\n              \t    puts (\"hppa2.0\"); break;\n              #endif\n              \tdefault: puts (\"hppa1.0\"); break;\n              \t}\n                  exit (0);\n              }\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy`\n\t\t    if test -z \"$HP_ARCH\"; then HP_ARCH=hppa; fi\n\t\t    rm -f $dummy.c $dummy\n\t\tfi ;;\n\tesac\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit 0 ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0\n\trm -f $dummy.c $dummy\n\techo unknown-hitachi-hiuxwe2\n\texit 0 ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit 0 ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit 0 ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit 0 ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit 0 ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit 0 ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit 0 ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit 0 ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n        exit 0 ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n        exit 0 ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n        exit 0 ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n        exit 0 ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n        exit 0 ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3D:*:*:*)\n\techo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit 0 ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n        exit 0 ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit 0 ;;\n    *:FreeBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit 0 ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit 0 ;;\n    i*:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit 0 ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit 0 ;;\n    x86:Interix*:3*)\n\techo i386-pc-interix3\n\texit 0 ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i386-pc-interix\n\texit 0 ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit 0 ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit 0 ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit 0 ;;\n    *:GNU:*:*)\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit 0 ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit 0 ;;\n    arm*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    mips:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef mips\n\t#undef mipsel\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=mipsel\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=mips\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`\n\trm -f $dummy.c\n\ttest x\"${CPU}\" != x && echo \"${CPU}-pc-linux-gnu\" && exit 0\n\t;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit 0 ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit 0 ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n        esac\n\tobjdump --private-headers /bin/sh | grep ld.so.1 >/dev/null\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit 0 ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit 0 ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit 0 ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit 0 ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit 0 ;;\n    x86_64:Linux:*:*)\n\techo x86_64-unknown-linux-gnu\n\texit 0 ;;\n    i*86:Linux:*:*)\n\t# The BFD linker knows what the default object file format is, so\n\t# first see if it will tell us. cd to the root directory to prevent\n\t# problems with other programs or directories called `ld' in the path.\n\t# Set LC_ALL=C to ensure ld outputs messages in English.\n\tld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \\\n\t\t\t | sed -ne '/supported targets:/!d\n\t\t\t\t    s/[ \t][ \t]*/ /g\n\t\t\t\t    s/.*supported targets: *//\n\t\t\t\t    s/ .*//\n\t\t\t\t    p'`\n        case \"$ld_supported_targets\" in\n\t  elf32-i386)\n\t\tTENTATIVE=\"${UNAME_MACHINE}-pc-linux-gnu\"\n\t\t;;\n\t  a.out-i386-linux)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuaout\"\n\t\texit 0 ;;\t\t\n\t  coff-i386)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnucoff\"\n\t\texit 0 ;;\n\t  \"\")\n\t\t# Either a pre-BFD a.out linker (linux-gnuoldld) or\n\t\t# one that does not give us useful --help.\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuoldld\"\n\t\texit 0 ;;\n\tesac\n\t# Determine whether the default compiler is a.out or elf\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <features.h>\n\t#ifdef __ELF__\n\t# ifdef __GLIBC__\n\t#  if __GLIBC__ >= 2\n\tLIBC=gnu\n\t#  else\n\tLIBC=gnulibc1\n\t#  endif\n\t# else\n\tLIBC=gnulibc1\n\t# endif\n\t#else\n\t#ifdef __INTEL_COMPILER\n\tLIBC=gnu\n\t#else\n\tLIBC=gnuaout\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`\n\trm -f $dummy.c\n\ttest x\"${LIBC}\" != x && echo \"${UNAME_MACHINE}-pc-linux-${LIBC}\" && exit 0\n\ttest x\"${TENTATIVE}\" != x && echo \"${TENTATIVE}\" && exit 0\n\t;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit 0 ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n        # Unixware is an offshoot of SVR4, but it has its own version\n        # number series starting with 2...\n        # I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n        # Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit 0 ;;\n    i*86:*:5:[78]*)\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit 0 ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit 0 ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit 0 ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\n        # the processor, so we play safe by assuming i386.\n\techo i386-pc-msdosdjgpp\n        exit 0 ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit 0 ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit 0 ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit 0 ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit 0 ;;\n    M68*:*:R3V[567]*:*)\n\ttest -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;\n    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && echo i486-ncr-sysv4.3${OS_REL} && exit 0\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n          && echo i486-ncr-sysv4 && exit 0 ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit 0 ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit 0 ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit 0 ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit 0 ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit 0 ;;\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\n        echo i586-unisys-sysv4\n        exit 0 ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit 0 ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit 0 ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit 0 ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit 0 ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit 0 ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t        echo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n        exit 0 ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit 0 ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit 0 ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit 0 ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit 0 ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit 0 ;;\n    *:Darwin:*:*)\n\techo `uname -p`-apple-darwin${UNAME_RELEASE}\n\texit 0 ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit 0 ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit 0 ;;\n    NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit 0 ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit 0 ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit 0 ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit 0 ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit 0 ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit 0 ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit 0 ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit 0 ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit 0 ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit 0 ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit 0 ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit 0 ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit 0 ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit 0 ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n          \"4\"\n#else\n\t  \"\"\n#endif\n         ); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0\nrm -f $dummy.c $dummy\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit 0 ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit 0 ;;\n    c34*)\n\techo c34-convex-bsd\n\texit 0 ;;\n    c38*)\n\techo c38-convex-bsd\n\texit 0 ;;\n    c4*)\n\techo c4-convex-bsd\n\texit 0 ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n    ftp://ftp.gnu.org/pub/gnu/config/\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/fnv/config.in",
    "content": "/* config.in.  Generated automatically from configure.in by autoheader 2.13.  */\n\n/* Define to empty if the keyword does not work.  */\n#undef const\n\n/* Define to `unsigned' if <sys/types.h> doesn't define.  */\n#undef size_t\n\n/* Define if you have the ANSI C header files.  */\n#undef STDC_HEADERS\n\n/* Define if you have the <dlfcn.h> header file.  */\n#undef HAVE_DLFCN_H\n\n/* Define if you have the <fcntl.h> header file.  */\n#undef HAVE_FCNTL_H\n\n/* Define if you have the <unistd.h> header file.  */\n#undef HAVE_UNISTD_H\n"
  },
  {
    "path": "src/fnv/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002 Free Software Foundation, Inc.\n\ntimestamp='2002-03-07'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330,\n# Boston, MA 02111-1307, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit 0 ;;\n    --version | -v )\n       echo \"$version\" ; exit 0 ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit 0 ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit 0;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n \t-chorusrdb)\n \t\tos=-chorusrdb\n\t\tbasic_machine=$1\n \t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dsp16xx \\\n\t| fr30 \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| m32r | m68000 | m68k | m88k | mcore \\\n\t| mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \\\n\t| mips64vr4100 | mips64vr4100el | mips64vr4300 \\\n\t| mips64vr4300el | mips64vr5000 | mips64vr5000el \\\n\t| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \\\n\t| mipsisa32 | mipsisa64 \\\n\t| mn10200 | mn10300 \\\n\t| ns16k | ns32k \\\n\t| openrisc | or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \\\n\t| pyramid \\\n\t| sh | sh[34] | sh[34]eb | shbe | shle | sh64 \\\n\t| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \\\n\t| strongarm \\\n\t| tahoe | thumb | tic80 | tron \\\n\t| v850 | v850e \\\n\t| we32k \\\n\t| x86 | xscale | xstormy16 | xtensa \\\n\t| z8k)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12)\n\t\t# Motorola 68HC11/12.\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armv*-* \\\n\t| avr-* \\\n\t| bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c54x-* \\\n\t| clipper-* | cydra-* \\\n\t| d10v-* | d30v-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fr30-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| m32r-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | mcore-* \\\n\t| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \\\n\t| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \\\n\t| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \\\n\t| pyramid-* \\\n\t| romp-* | rs6000-* \\\n\t| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \\\n\t| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \\\n\t| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \\\n\t| tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \\\n\t| v850-* | v850e-* | vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \\\n\t| xtensa-* \\\n\t| ymp-* \\\n\t| z8k-*)\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n# I'm not sure what \"Sysv32\" means.  Should this be sysv3.2?\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmmix*)\n\t\tbasic_machine=mmix-knuth\n\t\tos=-mmixware\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\tor32 | or32-*)\n\t\tbasic_machine=or32-unknown\n\t\tos=-coff\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n        pc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc)\tbasic_machine=powerpc-unknown\n\t        ;;\n\tppc-*)\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t        ;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t        ;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t        ;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n        sv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3d)\n\t\tbasic_machine=alpha-cray\n\t\tos=-unicos\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttic54x | c54x*)\n\t\tbasic_machine=tic54x-unknown\n\t\tos=-coff\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n               basic_machine=f301-fujitsu\n               ;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\twindows32)\n\t\tbasic_machine=i386-pc\n\t\tos=-windows32-msvcrt\n\t\t;;\n        xps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh3 | sh4 | sh3eb | sh4eb)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparc | sparcv9 | sparcv9b)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n        cydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\tc4x*)\n\t\tbasic_machine=c4x-none\n\t\tos=-coff\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n        # First match some system type aliases\n        # that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \\\n\t      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* \\\n\t      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto*)\n\t\tos=-nto-qnx\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t        os=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t        os=-mint\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n        pdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t# This also exists in the configure program, but was not the\n\t\t# default.\n\t\t# os=-sunos4\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n        *-gould)\n\t\tos=-sysv\n\t\t;;\n        *-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n        *-sgi)\n\t\tos=-irix\n\t\t;;\n        *-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/fnv/configure",
    "content": "#! /bin/sh\n\n# Guess values for system-dependent variables and create Makefiles.\n# Generated automatically using autoconf version 2.13 \n# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n\n# Defaults:\nac_help=\nac_default_prefix=/usr/local\n# Any additions from configure.in:\nac_help=\"$ac_help\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\"\nac_help=\"$ac_help\n  --enable-static[=PKGS]  build static libraries [default=yes]\"\nac_help=\"$ac_help\n  --enable-fast-install[=PKGS]  optimize for fast installation [default=yes]\"\nac_help=\"$ac_help\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\"\n\n# Find the correct PATH separator.  Usually this is `:', but\n# DJGPP uses `;' like DOS.\nif test \"X${PATH_SEPARATOR+set}\" != Xset; then\n  UNAME=${UNAME-`uname 2>/dev/null`}\n  case X$UNAME in\n    *-DOS) lt_cv_sys_path_separator=';' ;;\n    *)     lt_cv_sys_path_separator=':' ;;\n  esac\n  PATH_SEPARATOR=$lt_cv_sys_path_separator\nfi\n\n\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$ECHO\" | sed 's,\\\\\\\\\\$\\\\$0,'$0','`\n  ;;\nesac\n\necho=${ECHO-echo}\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $echo works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n\nEOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\nif test -z \"$ECHO\"; then\nif test \"X${echo_test_string+set}\" != Xset; then\n# find a string as large as possible, as long as the shell can cope with it\n  for cmd in 'sed 50q \"$0\"' 'sed 20q \"$0\"' 'sed 10q \"$0\"' 'sed 2q \"$0\"' 'echo test'; do\n    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n    if (echo_test_string=\"`eval $cmd`\") 2>/dev/null &&\n       echo_test_string=\"`eval $cmd`\" &&\n       (test \"X$echo_test_string\" = \"X$echo_test_string\") 2>/dev/null\n    then\n      break\n    fi\n  done\nfi\n\nif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n   echo_testing_string=`($echo \"$echo_test_string\") 2>/dev/null` &&\n   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n  :\nelse\n  # The Solaris, AIX, and Digital Unix default echo programs unquote\n  # backslashes.  This makes it impossible to quote backslashes using\n  #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n  #\n  # So, first we look for a working echo in the user's PATH.\n\n  IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for dir in $PATH /usr/ucb; do\n    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n       test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n       echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n       test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n      echo=\"$dir/echo\"\n      break\n    fi\n  done\n  IFS=\"$save_ifs\"\n\n  if test \"X$echo\" = Xecho; then\n    # We didn't find a better echo, so look for alternatives.\n    if test \"X`(print -r '\\t') 2>/dev/null`\" = 'X\\t' &&\n       echo_testing_string=`(print -r \"$echo_test_string\") 2>/dev/null` &&\n       test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n      # This shell has a builtin print -r that does the trick.\n      echo='print -r'\n    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&\n\t test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n      # If we have ksh, try running configure again with it.\n      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n      export ORIGINAL_CONFIG_SHELL\n      CONFIG_SHELL=/bin/ksh\n      export CONFIG_SHELL\n      exec $CONFIG_SHELL \"$0\" --no-reexec ${1+\"$@\"}\n    else\n      # Try using printf.\n      echo='printf %s\\n'\n      if test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n\t echo_testing_string=`($echo \"$echo_test_string\") 2>/dev/null` &&\n\t test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t# Cool, printf works\n\t:\n      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = 'X\\t' &&\n\t   echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\tCONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\texport CONFIG_SHELL\n\tSHELL=\"$CONFIG_SHELL\"\n\texport SHELL\n\techo=\"$CONFIG_SHELL $0 --fallback-echo\"\n      elif echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = 'X\\t' &&\n\t   echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\techo=\"$CONFIG_SHELL $0 --fallback-echo\"\n      else\n\t# maybe with a smaller string...\n\tprev=:\n\n\tfor cmd in 'echo test' 'sed 2q \"$0\"' 'sed 10q \"$0\"' 'sed 20q \"$0\"' 'sed 50q \"$0\"'; do\n\t  if (test \"X$echo_test_string\" = \"X`eval $cmd`\") 2>/dev/null\n\t  then\n\t    break\n\t  fi\n\t  prev=\"$cmd\"\n\tdone\n\n\tif test \"$prev\" != 'sed 50q \"$0\"'; then\n\t  echo_test_string=`eval $prev`\n\t  export echo_test_string\n\t  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"$0\" ${1+\"$@\"}\n\telse\n\t  # Oops.  We lost completely, so just stick with echo.\n\t  echo=echo\n\tfi\n      fi\n    fi\n  fi\nfi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nECHO=$echo\nif test \"X$ECHO\" = \"X$CONFIG_SHELL $0 --fallback-echo\"; then\n   ECHO=\"$CONFIG_SHELL \\\\\\$\\$0 --fallback-echo\"\nfi\n\n\nac_help=\"$ac_help\n  --disable-libtool-lock  avoid locking (might break parallel builds)\"\nac_help=\"$ac_help\n  --with-pic              try to use only PIC/non-PIC objects [default=use both]\"\nac_help=\"$ac_help\n  --enable-shared         build FNV as a shared library\"\n\n# Initialize some variables set by options.\n# The variables have the same names as the options, with\n# dashes changed to underlines.\nbuild=NONE\ncache_file=./config.cache\nexec_prefix=NONE\nhost=NONE\nno_create=\nnonopt=NONE\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\ntarget=NONE\nverbose=\nx_includes=NONE\nx_libraries=NONE\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatadir='${prefix}/share'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nlibdir='${exec_prefix}/lib'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ninfodir='${prefix}/info'\nmandir='${prefix}/man'\n\n# Initialize some other variables.\nsubdirs=\nMFLAGS= MAKEFLAGS=\nSHELL=${CONFIG_SHELL-/bin/sh}\n# Maximum number of lines to put in a shell here document.\nac_max_here_lines=12\n\nac_prev=\nfor ac_option\ndo\n\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval \"$ac_prev=\\$ac_option\"\n    ac_prev=\n    continue\n  fi\n\n  case \"$ac_option\" in\n  -*=*) ac_optarg=`echo \"$ac_option\" | sed 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) ac_optarg= ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case \"$ac_option\" in\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=\"$ac_optarg\" ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build=\"$ac_optarg\" ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=\"$ac_optarg\" ;;\n\n  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \\\n  | --da=*)\n    datadir=\"$ac_optarg\" ;;\n\n  -disable-* | --disable-*)\n    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`\n    # Reject names that are not valid shell variable names.\n    if test -n \"`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`\"; then\n      { echo \"configure: error: $ac_feature: invalid feature name\" 1>&2; exit 1; }\n    fi\n    ac_feature=`echo $ac_feature| sed 's/-/_/g'`\n    eval \"enable_${ac_feature}=no\" ;;\n\n  -enable-* | --enable-*)\n    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`\n    # Reject names that are not valid shell variable names.\n    if test -n \"`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`\"; then\n      { echo \"configure: error: $ac_feature: invalid feature name\" 1>&2; exit 1; }\n    fi\n    ac_feature=`echo $ac_feature| sed 's/-/_/g'`\n    case \"$ac_option\" in\n      *=*) ;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"enable_${ac_feature}='$ac_optarg'\" ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=\"$ac_optarg\" ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he)\n    # Omit some internal or obsolete options to make the list less imposing.\n    # This message is too long to be a string in the A/UX 3.1 sh.\n    cat << EOF\nUsage: configure [options] [host]\nOptions: [defaults in brackets after descriptions]\nConfiguration:\n  --cache-file=FILE       cache test results in FILE\n  --help                  print this message\n  --no-create             do not create output files\n  --quiet, --silent       do not print \\`checking...' messages\n  --version               print the version of autoconf that created configure\nDirectory and file names:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [same as prefix]\n  --bindir=DIR            user executables in DIR [EPREFIX/bin]\n  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]\n  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]\n  --datadir=DIR           read-only architecture-independent data in DIR\n                          [PREFIX/share]\n  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data in DIR\n                          [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]\n  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]\n  --includedir=DIR        C header files in DIR [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]\n  --infodir=DIR           info documentation in DIR [PREFIX/info]\n  --mandir=DIR            man documentation in DIR [PREFIX/man]\n  --srcdir=DIR            find the sources in DIR [configure dir or ..]\n  --program-prefix=PREFIX prepend PREFIX to installed program names\n  --program-suffix=SUFFIX append SUFFIX to installed program names\n  --program-transform-name=PROGRAM\n                          run sed PROGRAM on installed program names\nEOF\n    cat << EOF\nHost type:\n  --build=BUILD           configure for building on BUILD [BUILD=HOST]\n  --host=HOST             configure for HOST [guessed]\n  --target=TARGET         configure for TARGET [TARGET=HOST]\nFeatures and packages:\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --x-includes=DIR        X include files are in DIR\n  --x-libraries=DIR       X library files are in DIR\nEOF\n    if test -n \"$ac_help\"; then\n      echo \"--enable and --with options recognized:$ac_help\"\n    fi\n    exit 0 ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host=\"$ac_optarg\" ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=\"$ac_optarg\" ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=\"$ac_optarg\" ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=\"$ac_optarg\" ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=\"$ac_optarg\" ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst \\\n  | --locals | --local | --loca | --loc | --lo)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* \\\n  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)\n    localstatedir=\"$ac_optarg\" ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=\"$ac_optarg\" ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=\"$ac_optarg\" ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=\"$ac_optarg\" ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=\"$ac_optarg\" ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=\"$ac_optarg\" ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=\"$ac_optarg\" ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=\"$ac_optarg\" ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=\"$ac_optarg\" ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=\"$ac_optarg\" ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=\"$ac_optarg\" ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=\"$ac_optarg\" ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target=\"$ac_optarg\" ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers)\n    echo \"configure generated by autoconf version 2.13\"\n    exit 0 ;;\n\n  -with-* | --with-*)\n    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`\n    # Reject names that are not valid shell variable names.\n    if test -n \"`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`\"; then\n      { echo \"configure: error: $ac_package: invalid package name\" 1>&2; exit 1; }\n    fi\n    ac_package=`echo $ac_package| sed 's/-/_/g'`\n    case \"$ac_option\" in\n      *=*) ;;\n      *) ac_optarg=yes ;;\n    esac\n    eval \"with_${ac_package}='$ac_optarg'\" ;;\n\n  -without-* | --without-*)\n    ac_package=`echo $ac_option|sed -e 's/-*without-//'`\n    # Reject names that are not valid shell variable names.\n    if test -n \"`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`\"; then\n      { echo \"configure: error: $ac_package: invalid package name\" 1>&2; exit 1; }\n    fi\n    ac_package=`echo $ac_package| sed 's/-/_/g'`\n    eval \"with_${ac_package}=no\" ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=\"$ac_optarg\" ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=\"$ac_optarg\" ;;\n\n  -*) { echo \"configure: error: $ac_option: invalid option; use --help to show usage\" 1>&2; exit 1; }\n    ;;\n\n  *)\n    if test -n \"`echo $ac_option| sed 's/[-a-z0-9.]//g'`\"; then\n      echo \"configure: warning: $ac_option: invalid host type\" 1>&2\n    fi\n    if test \"x$nonopt\" != xNONE; then\n      { echo \"configure: error: can only configure for one host and one target at a time\" 1>&2; exit 1; }\n    fi\n    nonopt=\"$ac_option\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  { echo \"configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`\" 1>&2; exit 1; }\nfi\n\ntrap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15\n\n# File descriptor usage:\n# 0 standard input\n# 1 file creation\n# 2 errors and warnings\n# 3 some systems may open it to /dev/tty\n# 4 used on the Kubota Titan\n# 6 checking for... messages and results\n# 5 compiler messages saved in config.log\nif test \"$silent\" = yes; then\n  exec 6>/dev/null\nelse\n  exec 6>&1\nfi\nexec 5>./config.log\n\necho \"\\\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\" 1>&5\n\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Also quote any args containing shell metacharacters.\nac_configure_args=\nfor ac_arg\ndo\n  case \"$ac_arg\" in\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c) ;;\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;\n  *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?]*)\n  ac_configure_args=\"$ac_configure_args '$ac_arg'\" ;;\n  *) ac_configure_args=\"$ac_configure_args $ac_arg\" ;;\n  esac\ndone\n\n# NLS nuisances.\n# Only set these to C if already set.  These must not be set unconditionally\n# because not all systems understand e.g. LANG=C (notably SCO).\n# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!\n# Non-C LC_CTYPE values break the ctype check.\nif test \"${LANG+set}\"   = set; then LANG=C;   export LANG;   fi\nif test \"${LC_ALL+set}\" = set; then LC_ALL=C; export LC_ALL; fi\nif test \"${LC_MESSAGES+set}\" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi\nif test \"${LC_CTYPE+set}\"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -rf conftest* confdefs.h\n# AIX cpp loses on an empty file, so make sure it contains at least a newline.\necho > confdefs.h\n\n# A filename unique to this package, relative to the directory that\n# configure is in, which we can look for to find out if srcdir is correct.\nac_unique_file=fnv.h\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then its parent.\n  ac_prog=$0\n  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`\n  test \"x$ac_confdir\" = \"x$ac_prog\" && ac_confdir=.\n  srcdir=$ac_confdir\n  if test ! -r $srcdir/$ac_unique_file; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r $srcdir/$ac_unique_file; then\n  if test \"$ac_srcdir_defaulted\" = yes; then\n    { echo \"configure: error: can not find sources in $ac_confdir or ..\" 1>&2; exit 1; }\n  else\n    { echo \"configure: error: can not find sources in $srcdir\" 1>&2; exit 1; }\n  fi\nfi\nsrcdir=`echo \"${srcdir}\" | sed 's%\\([^/]\\)/*$%\\1%'`\n\n# Prefer explicitly selected file to automatically selected ones.\nif test -z \"$CONFIG_SITE\"; then\n  if test \"x$prefix\" != xNONE; then\n    CONFIG_SITE=\"$prefix/share/config.site $prefix/etc/config.site\"\n  else\n    CONFIG_SITE=\"$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site\"\n  fi\nfi\nfor ac_site_file in $CONFIG_SITE; do\n  if test -r \"$ac_site_file\"; then\n    echo \"loading site script $ac_site_file\"\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  echo \"loading cache $cache_file\"\n  . $cache_file\nelse\n  echo \"creating cache $cache_file\"\n  > $cache_file\nfi\n\nac_ext=c\n# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.\nac_cpp='$CPP $CPPFLAGS'\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\ncross_compiling=$ac_cv_prog_cc_cross\n\nac_exeext=\nac_objext=o\nif (echo \"testing\\c\"; echo 1,2,3) | grep c >/dev/null; then\n  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.\n  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then\n    ac_n= ac_c='\n' ac_t='\t'\n  else\n    ac_n=-n ac_c= ac_t=\n  fi\nelse\n  ac_n= ac_c='\\c' ac_t=\nfi\n\n\n\n\n\n\nFNV_MAJOR=1\nFNV_MINOR=0\nFNV_DATE=09-Sep-2002\nFNV_VERSION=${FNV_MAJOR}.${FNV_MINOR}\n\n\nFNV_LIB_VERSION=0:1:0\n\n# Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:713: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_CC'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_CC=\"gcc\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nfi\nfi\nCC=\"$ac_cv_prog_CC\"\nif test -n \"$CC\"; then\n  echo \"$ac_t\"\"$CC\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:743: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_CC'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_prog_rejected=no\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      if test \"$ac_dir/$ac_word\" = \"/usr/ucb/cc\"; then\n        ac_prog_rejected=yes\n\tcontinue\n      fi\n      ac_cv_prog_CC=\"cc\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# -gt 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    set dummy \"$ac_dir/$ac_word\" \"$@\"\n    shift\n    ac_cv_prog_CC=\"$@\"\n  fi\nfi\nfi\nfi\nCC=\"$ac_cv_prog_CC\"\nif test -n \"$CC\"; then\n  echo \"$ac_t\"\"$CC\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n  if test -z \"$CC\"; then\n    case \"`uname -s`\" in\n    *win32* | *WIN32*)\n      # Extract the first word of \"cl\", so it can be a program name with args.\nset dummy cl; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:794: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_CC'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_CC=\"cl\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nfi\nfi\nCC=\"$ac_cv_prog_CC\"\nif test -n \"$CC\"; then\n  echo \"$ac_t\"\"$CC\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n ;;\n    esac\n  fi\n  test -z \"$CC\" && { echo \"configure: error: no acceptable cc found in \\$PATH\" 1>&2; exit 1; }\nfi\n\necho $ac_n \"checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works\"\"... $ac_c\" 1>&6\necho \"configure:826: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works\" >&5\n\nac_ext=c\n# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.\nac_cpp='$CPP $CPPFLAGS'\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\ncross_compiling=$ac_cv_prog_cc_cross\n\ncat > conftest.$ac_ext << EOF\n\n#line 837 \"configure\"\n#include \"confdefs.h\"\n\nmain(){return(0);}\nEOF\nif { (eval echo configure:842: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  ac_cv_prog_cc_works=yes\n  # If we can't run a trivial program, we are probably using a cross compiler.\n  if (./conftest; exit) 2>/dev/null; then\n    ac_cv_prog_cc_cross=no\n  else\n    ac_cv_prog_cc_cross=yes\n  fi\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  ac_cv_prog_cc_works=no\nfi\nrm -fr conftest*\nac_ext=c\n# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.\nac_cpp='$CPP $CPPFLAGS'\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\ncross_compiling=$ac_cv_prog_cc_cross\n\necho \"$ac_t\"\"$ac_cv_prog_cc_works\" 1>&6\nif test $ac_cv_prog_cc_works = no; then\n  { echo \"configure: error: installation or configuration problem: C compiler cannot create executables.\" 1>&2; exit 1; }\nfi\necho $ac_n \"checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler\"\"... $ac_c\" 1>&6\necho \"configure:868: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler\" >&5\necho \"$ac_t\"\"$ac_cv_prog_cc_cross\" 1>&6\ncross_compiling=$ac_cv_prog_cc_cross\n\necho $ac_n \"checking whether we are using GNU C\"\"... $ac_c\" 1>&6\necho \"configure:873: checking whether we are using GNU C\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_gcc'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.c <<EOF\n#ifdef __GNUC__\n  yes;\n#endif\nEOF\nif { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:882: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then\n  ac_cv_prog_gcc=yes\nelse\n  ac_cv_prog_gcc=no\nfi\nfi\n\necho \"$ac_t\"\"$ac_cv_prog_gcc\" 1>&6\n\nif test $ac_cv_prog_gcc = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\n\nac_test_CFLAGS=\"${CFLAGS+set}\"\nac_save_CFLAGS=\"$CFLAGS\"\nCFLAGS=\necho $ac_n \"checking whether ${CC-cc} accepts -g\"\"... $ac_c\" 1>&6\necho \"configure:901: checking whether ${CC-cc} accepts -g\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_cc_g'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  echo 'void f(){}' > conftest.c\nif test -z \"`${CC-cc} -g -c conftest.c 2>&1`\"; then\n  ac_cv_prog_cc_g=yes\nelse\n  ac_cv_prog_cc_g=no\nfi\nrm -f conftest*\n\nfi\n\necho \"$ac_t\"\"$ac_cv_prog_cc_g\" 1>&6\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=\"$ac_save_CFLAGS\"\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n\nac_aux_dir=\nfor ac_dir in $srcdir $srcdir/.. $srcdir/../..; do\n  if test -f $ac_dir/install-sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f $ac_dir/install.sh; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  { echo \"configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../..\" 1>&2; exit 1; }\nfi\nac_config_guess=$ac_aux_dir/config.guess\nac_config_sub=$ac_aux_dir/config.sub\nac_configure=$ac_aux_dir/configure # This should be Cygnus configure.\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# ./install, which can be erroneously created by make from ./install.sh.\necho $ac_n \"checking for a BSD compatible install\"\"... $ac_c\" 1>&6\necho \"configure:963: checking for a BSD compatible install\" >&5\nif test -z \"$INSTALL\"; then\nif eval \"test \\\"`echo '$''{'ac_cv_path_install'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n    IFS=\"${IFS= \t}\"; ac_save_IFS=\"$IFS\"; IFS=\":\"\n  for ac_dir in $PATH; do\n    # Account for people who put trailing slashes in PATH elements.\n    case \"$ac_dir/\" in\n    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;\n    *)\n      # OSF1 and SCO ODT 3.0 have their own names for install.\n      # Don't use installbsd from OSF since it installs stuff as root\n      # by default.\n      for ac_prog in ginstall scoinst install; do\n        if test -f $ac_dir/$ac_prog; then\n\t  if test $ac_prog = install &&\n            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  else\n\t    ac_cv_path_install=\"$ac_dir/$ac_prog -c\"\n\t    break 2\n\t  fi\n\tfi\n      done\n      ;;\n    esac\n  done\n  IFS=\"$ac_save_IFS\"\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=\"$ac_cv_path_install\"\n  else\n    # As a last resort, use the slow shell script.  We don't cache a\n    # path for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the path is relative.\n    INSTALL=\"$ac_install_sh\"\n  fi\nfi\necho \"$ac_t\"\"$INSTALL\" 1>&6\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\necho $ac_n \"checking whether ln -s works\"\"... $ac_c\" 1>&6\necho \"configure:1016: checking whether ln -s works\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_LN_S'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  rm -f conftestdata\nif ln -s X conftestdata 2>/dev/null\nthen\n  rm -f conftestdata\n  ac_cv_prog_LN_S=\"ln -s\"\nelse\n  ac_cv_prog_LN_S=ln\nfi\nfi\nLN_S=\"$ac_cv_prog_LN_S\"\nif test \"$ac_cv_prog_LN_S\" = \"ln -s\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n# Find the correct PATH separator.  Usually this is `:', but\n# DJGPP uses `;' like DOS.\nif test \"X${PATH_SEPARATOR+set}\" != Xset; then\n  UNAME=${UNAME-`uname 2>/dev/null`}\n  case X$UNAME in\n    *-DOS) lt_cv_sys_path_separator=';' ;;\n    *)     lt_cv_sys_path_separator=':' ;;\n  esac\n  PATH_SEPARATOR=$lt_cv_sys_path_separator\nfi\n\necho $ac_n \"checking for Cygwin environment\"\"... $ac_c\" 1>&6\necho \"configure:1048: checking for Cygwin environment\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_cygwin'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 1053 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\n\n#ifndef __CYGWIN__\n#define __CYGWIN__ __CYGWIN32__\n#endif\nreturn __CYGWIN__;\n; return 0; }\nEOF\nif { (eval echo configure:1064: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n  ac_cv_cygwin=yes\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  ac_cv_cygwin=no\nfi\nrm -f conftest*\nrm -f conftest*\nfi\n\necho \"$ac_t\"\"$ac_cv_cygwin\" 1>&6\nCYGWIN=\ntest \"$ac_cv_cygwin\" = yes && CYGWIN=yes\necho $ac_n \"checking for mingw32 environment\"\"... $ac_c\" 1>&6\necho \"configure:1081: checking for mingw32 environment\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_mingw32'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 1086 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\nreturn __MINGW32__;\n; return 0; }\nEOF\nif { (eval echo configure:1093: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n  ac_cv_mingw32=yes\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  ac_cv_mingw32=no\nfi\nrm -f conftest*\nrm -f conftest*\nfi\n\necho \"$ac_t\"\"$ac_cv_mingw32\" 1>&6\nMINGW32=\ntest \"$ac_cv_mingw32\" = yes && MINGW32=yes\necho $ac_n \"checking how to run the C preprocessor\"\"... $ac_c\" 1>&6\necho \"configure:1110: checking how to run the C preprocessor\" >&5\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\nif eval \"test \\\"`echo '$''{'ac_cv_prog_CPP'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n    # This must be in double quotes, not single quotes, because CPP may get\n  # substituted into the Makefile and \"${CC-cc}\" will confuse make.\n  CPP=\"${CC-cc} -E\"\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp.\n  cat > conftest.$ac_ext <<EOF\n#line 1125 \"configure\"\n#include \"confdefs.h\"\n#include <assert.h>\nSyntax Error\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:1131: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  :\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  CPP=\"${CC-cc} -E -traditional-cpp\"\n  cat > conftest.$ac_ext <<EOF\n#line 1142 \"configure\"\n#include \"confdefs.h\"\n#include <assert.h>\nSyntax Error\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:1148: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  :\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  CPP=\"${CC-cc} -nologo -E\"\n  cat > conftest.$ac_ext <<EOF\n#line 1159 \"configure\"\n#include \"confdefs.h\"\n#include <assert.h>\nSyntax Error\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:1165: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  :\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  CPP=/lib/cpp\nfi\nrm -f conftest*\nfi\nrm -f conftest*\nfi\nrm -f conftest*\n  ac_cv_prog_CPP=\"$CPP\"\nfi\n  CPP=\"$ac_cv_prog_CPP\"\nelse\n  ac_cv_prog_CPP=\"$CPP\"\nfi\necho \"$ac_t\"\"$CPP\" 1>&6\n\n# Check whether --enable-shared or --disable-shared was given.\nif test \"${enable_shared+set}\" = set; then\n  enableval=\"$enable_shared\"\n  p=${PACKAGE-default}\ncase $enableval in\nyes) enable_shared=yes ;;\nno) enable_shared=no ;;\n*)\n  enable_shared=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_shared=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac\nelse\n  enable_shared=yes\nfi\n\n# Check whether --enable-static or --disable-static was given.\nif test \"${enable_static+set}\" = set; then\n  enableval=\"$enable_static\"\n  p=${PACKAGE-default}\ncase $enableval in\nyes) enable_static=yes ;;\nno) enable_static=no ;;\n*)\n  enable_static=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_static=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac\nelse\n  enable_static=yes\nfi\n\n# Check whether --enable-fast-install or --disable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then\n  enableval=\"$enable_fast_install\"\n  p=${PACKAGE-default}\ncase $enableval in\nyes) enable_fast_install=yes ;;\nno) enable_fast_install=no ;;\n*)\n  enable_fast_install=no\n  # Look at the argument we got.  We use all the common list separators.\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}:,\"\n  for pkg in $enableval; do\n    if test \"X$pkg\" = \"X$p\"; then\n      enable_fast_install=yes\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  ;;\nesac\nelse\n  enable_fast_install=yes\nfi\n\n\n# Make sure we can run config.sub.\nif ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :\nelse { echo \"configure: error: can not run $ac_config_sub\" 1>&2; exit 1; }\nfi\n\necho $ac_n \"checking host system type\"\"... $ac_c\" 1>&6\necho \"configure:1265: checking host system type\" >&5\n\nhost_alias=$host\ncase \"$host_alias\" in\nNONE)\n  case $nonopt in\n  NONE)\n    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :\n    else { echo \"configure: error: can not guess host type; you must specify one\" 1>&2; exit 1; }\n    fi ;;\n  *) host_alias=$nonopt ;;\n  esac ;;\nesac\n\nhost=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`\nhost_cpu=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\necho \"$ac_t\"\"$host\" 1>&6\n\necho $ac_n \"checking build system type\"\"... $ac_c\" 1>&6\necho \"configure:1286: checking build system type\" >&5\n\nbuild_alias=$build\ncase \"$build_alias\" in\nNONE)\n  case $nonopt in\n  NONE) build_alias=$host_alias ;;\n  *) build_alias=$nonopt ;;\n  esac ;;\nesac\n\nbuild=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`\nbuild_cpu=`echo $build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nbuild_vendor=`echo $build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nbuild_os=`echo $build | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\necho \"$ac_t\"\"$build\" 1>&6\n\n# Check whether --with-gnu-ld or --without-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then\n  withval=\"$with_gnu_ld\"\n  test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  echo $ac_n \"checking for ld used by GCC\"\"... $ac_c\" 1>&6\necho \"configure:1315: checking for ld used by GCC\" >&5\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | [A-Za-z]:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the path of ld\n      ac_prog=`echo $ac_prog| sed 's%\\\\\\\\%/%g'`\n      while echo $ac_prog | grep \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`echo $ac_prog| sed \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  echo $ac_n \"checking for GNU ld\"\"... $ac_c\" 1>&6\necho \"configure:1345: checking for GNU ld\" >&5\nelse\n  echo $ac_n \"checking for non-GNU ld\"\"... $ac_c\" 1>&6\necho \"configure:1348: checking for non-GNU ld\" >&5\nfi\nif eval \"test \\\"`echo '$''{'lt_cv_path_LD'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -z \"$LD\"; then\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some GNU ld's only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      if \"$lt_cv_path_LD\" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then\n\ttest \"$with_gnu_ld\" != no && break\n      else\n\ttest \"$with_gnu_ld\" != yes && break\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  echo \"$ac_t\"\"$LD\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\ntest -z \"$LD\" && { echo \"configure: error: no acceptable ld found in \\$PATH\" 1>&2; exit 1; }\necho $ac_n \"checking if the linker ($LD) is GNU ld\"\"... $ac_c\" 1>&6\necho \"configure:1383: checking if the linker ($LD) is GNU ld\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  # I'd rather use --version here, but apparently some GNU ld's only accept -v.\nif $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then\n  lt_cv_prog_gnu_ld=yes\nelse\n  lt_cv_prog_gnu_ld=no\nfi\nfi\n\necho \"$ac_t\"\"$lt_cv_prog_gnu_ld\" 1>&6\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\necho $ac_n \"checking for $LD option to reload object files\"\"... $ac_c\" 1>&6\necho \"configure:1400: checking for $LD option to reload object files\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n\necho \"$ac_t\"\"$lt_cv_ld_reload_flag\" 1>&6\nreload_flag=$lt_cv_ld_reload_flag\ntest -n \"$reload_flag\" && reload_flag=\" $reload_flag\"\n\necho $ac_n \"checking for BSD-compatible nm\"\"... $ac_c\" 1>&6\necho \"configure:1412: checking for BSD-compatible nm\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_path_NM'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do\n    test -z \"$ac_dir\" && ac_dir=.\n    tmp_nm=$ac_dir/${ac_tool_prefix}nm\n    if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then\n      # Check to see if the nm accepts a BSD-compat flag.\n      # Adding the `sed 1q' prevents false positives on HP-UX, which says:\n      #   nm: unknown option \"B\" ignored\n      # Tru64's nm complains that /dev/null is an invalid object file\n      if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then\n\tlt_cv_path_NM=\"$tmp_nm -B\"\n\tbreak\n      elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then\n\tlt_cv_path_NM=\"$tmp_nm -p\"\n\tbreak\n      else\n\tlt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\tcontinue # so that we can try to find one that supports BSD flags\n      fi\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$lt_cv_path_NM\" && lt_cv_path_NM=nm\nfi\nfi\n\nNM=\"$lt_cv_path_NM\"\necho \"$ac_t\"\"$NM\" 1>&6\n\necho $ac_n \"checking how to recognise dependant libraries\"\"... $ac_c\" 1>&6\necho \"configure:1450: checking how to recognise dependant libraries\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given egrep regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix4* | aix5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi4*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin* | mingw* | pw32*)\n  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  case \"$host_os\" in\n  rhapsody* | darwin1.[012])\n    lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`\n    ;;\n  *) # Darwin 1.3 on\n    lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'\n    ;;\n  esac\n  ;;\n\nfreebsd*)\n  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20*|hpux11*)\n  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libc.sl\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n  irix5* | nonstopux*)\n    # this will be overridden with pass_all, but let us keep it just in case\n    lt_cv_deplibs_check_method=\"file_magic ELF 32-bit MSB dynamic lib MIPS - version 1\"\n    ;;\n  *)\n    case $LD in\n    *-32|*\"-32 \") libmagic=32-bit;;\n    *-n32|*\"-n32 \") libmagic=N32;;\n    *-64|*\"-64 \") libmagic=64-bit;;\n    *) libmagic=never-match;;\n    esac\n    # this will be overridden with pass_all, but let us keep it just in case\n    lt_cv_deplibs_check_method=\"file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1\"\n    ;;\n  esac\n  lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux-gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`\n  ;;\n\nnetbsd*)\n  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/\\.]+\\.so\\.[0-9]+\\.[0-9]+$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/\\.]+\\.so$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\nopenbsd*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'\n  else\n    lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  # this will be overridden with pass_all, but let us keep it just in case\n  lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsco3.2v5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  lt_cv_file_magic_test_file=/lib/libc.so\n  ;;\n\nsysv5uw[78]* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  esac\n  ;;\nesac\n\nfi\n\necho \"$ac_t\"\"$lt_cv_deplibs_check_method\" 1>&6\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\n\necho $ac_n \"checking for object suffix\"\"... $ac_c\" 1>&6\necho \"configure:1627: checking for object suffix\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_objext'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  rm -f conftest*\necho 'int i = 1;' > conftest.$ac_ext\nif { (eval echo configure:1633: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  for ac_file in conftest.*; do\n    case $ac_file in\n    *.c) ;;\n    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;\n    esac\n  done\nelse\n  { echo \"configure: error: installation or configuration problem; compiler does not work\" 1>&2; exit 1; }\nfi\nrm -f conftest*\nfi\n\necho \"$ac_t\"\"$ac_cv_objext\" 1>&6\nOBJEXT=$ac_cv_objext\nac_objext=$ac_cv_objext\n\n\n\necho $ac_n \"checking for executable suffix\"\"... $ac_c\" 1>&6\necho \"configure:1653: checking for executable suffix\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_exeext'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test \"$CYGWIN\" = yes || test \"$MINGW32\" = yes; then\n  ac_cv_exeext=.exe\nelse\n  rm -f conftest*\n  echo 'int main () { return 0; }' > conftest.$ac_ext\n  ac_cv_exeext=\n  if { (eval echo configure:1663: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; }; then\n    for file in conftest.*; do\n      case $file in\n      *.$ac_ext | *.c | *.o | *.obj) ;;\n      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;\n      esac\n    done\n  else\n    { echo \"configure: error: installation or configuration problem: compiler cannot create executables.\" 1>&2; exit 1; }\n  fi\n  rm -f conftest*\n  test x\"${ac_cv_exeext}\" = x && ac_cv_exeext=no\nfi\nfi\n\nEXEEXT=\"\"\ntest x\"${ac_cv_exeext}\" != xno && EXEEXT=${ac_cv_exeext}\necho \"$ac_t\"\"${ac_cv_exeext}\" 1>&6\nac_exeext=$EXEEXT\n\nif test $host != $build; then\n  ac_tool_prefix=${host_alias}-\nelse\n  ac_tool_prefix=\nfi\n\n\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\necho $ac_n \"checking command to parse $NM output\"\"... $ac_c\" 1>&6\necho \"configure:1694: checking command to parse $NM output\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_sys_global_symbol_pipe'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Transform the above into a raw symbol and a C symbol.\nsymxfrm='\\1 \\2\\3 \\3'\n\n# Transform an extracted symbol line into a proper C declaration\nlt_cv_global_symbol_to_cdecl=\"sed -n -e 's/^. .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (lt_ptr) 0},/p' -e 's/^$symcode \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/p'\"\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*) # Its linker distinguishes data from code symbols\n  lt_cv_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern char \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n  lt_cv_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/p'\"\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nsolaris* | sysv5*)\n  symcode='[BDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $host_os in\nmingw*)\n  opt_cr=`echo 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\nif $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then\n  symcode='[ABCDGISTW]'\nfi\n\n# Try without a prefix undercore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Write the raw and C identifiers.\nlt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[ \t]\\($symcode$symcode*\\)[ \t][ \t]*\\($ac_symprfx\\)$sympat$opt_cr$/$symxfrm/p'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n  rm -f conftest*\n  cat > conftest.$ac_ext <<EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\nEOF\n\n  if { (eval echo configure:1774: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { (eval echo configure:1777: \\\"$NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist\\\") 1>&5; (eval $NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) 2>&5; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if egrep ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif egrep ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nEOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_global_symbol_to_cdecl\"' < \"$nlist\" >> conftest.$ac_ext'\n\n\t  cat <<EOF >> conftest.$ac_ext\n#if defined (__STDC__) && __STDC__\n# define lt_ptr void *\n#else\n# define lt_ptr char *\n# define const\n#endif\n\n/* The mapping between symbol names and symbols. */\nconst struct {\n  const char *name;\n  lt_ptr address;\n}\nlt_preloaded_symbols[] =\n{\nEOF\n\t  sed \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (lt_ptr) \\&\\2},/\" < \"$nlist\" >> conftest.$ac_ext\n\t  cat <<\\EOF >> conftest.$ac_ext\n  {0, (lt_ptr) 0}\n};\n\n#ifdef __cplusplus\n}\n#endif\nEOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  save_LIBS=\"$LIBS\"\n\t  save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$no_builtin_flag\"\n\t  if { (eval echo configure:1828: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$save_LIBS\"\n\t  CFLAGS=\"$save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -f conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nglobal_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe\"\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  global_symbol_to_cdecl=\n  global_symbol_to_c_name_address=\nelse\n  global_symbol_to_cdecl=\"$lt_cv_global_symbol_to_cdecl\"\n  global_symbol_to_c_name_address=\"$lt_cv_global_symbol_to_c_name_address\"\nfi\nif test -z \"$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address\";\nthen\n  echo \"$ac_t\"\"failed\" 1>&6\nelse\n  echo \"$ac_t\"\"ok\" 1>&6\nfi\n\nfor ac_hdr in dlfcn.h\ndo\nac_safe=`echo \"$ac_hdr\" | sed 'y%./+-%__p_%'`\necho $ac_n \"checking for $ac_hdr\"\"... $ac_c\" 1>&6\necho \"configure:1877: checking for $ac_hdr\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 1882 \"configure\"\n#include \"confdefs.h\"\n#include <$ac_hdr>\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:1887: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=yes\"\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=no\"\nfi\nrm -f conftest*\nfi\nif eval \"test \\\"`echo '$ac_cv_header_'$ac_safe`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`\n  cat >> confdefs.h <<EOF\n#define $ac_tr_hdr 1\nEOF\n \nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\ndone\n\n\n\n\n\n# Only perform the check for file, if the check method requires it\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    echo $ac_n \"checking for ${ac_tool_prefix}file\"\"... $ac_c\" 1>&6\necho \"configure:1922: checking for ${ac_tool_prefix}file\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  case $MAGIC_CMD in\n  /*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n  ?:/*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a dos path.\n  ;;\n  *)\n  ac_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  IFS=\"${IFS=   }\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"/usr/bin:$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=\"`expr \\\"$deplibs_check_method\\\" : \\\"file_magic \\(.*\\)\\\"`\"\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    egrep \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\nEOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  MAGIC_CMD=\"$ac_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  echo \"$ac_t\"\"$MAGIC_CMD\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    echo $ac_n \"checking for file\"\"... $ac_c\" 1>&6\necho \"configure:1984: checking for file\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  case $MAGIC_CMD in\n  /*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n  ?:/*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a dos path.\n  ;;\n  *)\n  ac_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  IFS=\"${IFS=   }\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"/usr/bin:$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=\"`expr \\\"$deplibs_check_method\\\" : \\\"file_magic \\(.*\\)\\\"`\"\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    egrep \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\nEOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  MAGIC_CMD=\"$ac_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  echo \"$ac_t\"\"$MAGIC_CMD\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:2055: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nfi\nfi\nRANLIB=\"$ac_cv_prog_RANLIB\"\nif test -n \"$RANLIB\"; then\n  echo \"$ac_t\"\"$RANLIB\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n\nif test -z \"$ac_cv_prog_RANLIB\"; then\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:2087: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_RANLIB=\"ranlib\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$ac_cv_prog_RANLIB\" && ac_cv_prog_RANLIB=\":\"\nfi\nfi\nRANLIB=\"$ac_cv_prog_RANLIB\"\nif test -n \"$RANLIB\"; then\n  echo \"$ac_t\"\"$RANLIB\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\nelse\n  RANLIB=\":\"\nfi\nfi\n\n# Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:2122: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_STRIP'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\nfi\nfi\nSTRIP=\"$ac_cv_prog_STRIP\"\nif test -n \"$STRIP\"; then\n  echo \"$ac_t\"\"$STRIP\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n\nif test -z \"$ac_cv_prog_STRIP\"; then\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\necho $ac_n \"checking for $ac_word\"\"... $ac_c\" 1>&6\necho \"configure:2154: checking for $ac_word\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_prog_STRIP'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\n  IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\":\"\n  ac_dummy=\"$PATH\"\n  for ac_dir in $ac_dummy; do\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$ac_word; then\n      ac_cv_prog_STRIP=\"strip\"\n      break\n    fi\n  done\n  IFS=\"$ac_save_ifs\"\n  test -z \"$ac_cv_prog_STRIP\" && ac_cv_prog_STRIP=\":\"\nfi\nfi\nSTRIP=\"$ac_cv_prog_STRIP\"\nif test -n \"$STRIP\"; then\n  echo \"$ac_t\"\"$STRIP\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\nelse\n  STRIP=\":\"\nfi\nfi\n\n\nenable_dlopen=no\nenable_win32_dll=no\n\n# Check whether --enable-libtool-lock or --disable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then\n  enableval=\"$enable_libtool_lock\"\n  :\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line 2203 \"configure\"' > conftest.$ac_ext\n  if { (eval echo configure:2204: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n    *32-bit*)\n      LD=\"${LD-ld} -32\"\n      ;;\n    *N32*)\n      LD=\"${LD-ld} -n32\"\n      ;;\n    *64-bit*)\n      LD=\"${LD-ld} -64\"\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  echo $ac_n \"checking whether the C compiler needs -belf\"\"... $ac_c\" 1>&6\necho \"configure:2225: checking whether the C compiler needs -belf\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \n     ac_ext=c\n# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.\nac_cpp='$CPP $CPPFLAGS'\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\ncross_compiling=$ac_cv_prog_cc_cross\n\n     cat > conftest.$ac_ext <<EOF\n#line 2238 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\n\n; return 0; }\nEOF\nif { (eval echo configure:2245: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  lt_cv_cc_needs_belf=yes\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  lt_cv_cc_needs_belf=no\nfi\nrm -f conftest*\n     ac_ext=c\n# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.\nac_cpp='$CPP $CPPFLAGS'\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\ncross_compiling=$ac_cv_prog_cc_cross\n\nfi\n\necho \"$ac_t\"\"$lt_cv_cc_needs_belf\" 1>&6\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n\n\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e s/^X//'\nsed_quote_subst='s/\\([\\\\\"\\\\`$\\\\\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\\\\\"\\\\`\\\\\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Constants:\nrm=\"rm -f\"\n\n# Global variables:\ndefault_ofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except M$VC,\n# which needs '.lib').\nlibext=a\nltmain=\"$ac_aux_dir/ltmain.sh\"\nofile=\"$default_ofile\"\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\nneed_locks=\"$enable_libtool_lock\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\ntest -z \"$AS\" && AS=as\ntest -z \"$CC\" && CC=cc\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\ntest -z \"$LD\" && LD=ld\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ntest -z \"$NM\" && NM=nm\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\ntest -z \"$RANLIB\" && RANLIB=:\ntest -z \"$STRIP\" && STRIP=:\ntest -z \"$ac_objext\" && ac_objext=o\n\nif test x\"$host\" != x\"$build\"; then\n  ac_tool_prefix=${host_alias}-\nelse\n  ac_tool_prefix=\nfi\n\n# Transform linux* to *-*-linux-gnu*, to support old configure scripts.\ncase $host_os in\nlinux-gnu*) ;;\nlinux*) host=`echo $host | sed 's/^\\(.*-.*-linux\\)\\(.*\\)$/\\1-gnu\\2/'`\nesac\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"\\$RANLIB -t \\$oldlib~$old_postinstall_cmds\"\n    ;;\n  *)\n    old_postinstall_cmds=\"\\$RANLIB \\$oldlib~$old_postinstall_cmds\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n\n# Allow CC to be a program name with arguments.\nset dummy $CC\ncompiler=\"$2\"\n\n## FIXME: this should be a separate macro\n##\necho $ac_n \"checking for objdir\"\"... $ac_c\" 1>&6\necho \"configure:2367: checking for objdir\" >&5\nrm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  objdir=_libs\nfi\nrmdir .libs 2>/dev/null\necho \"$ac_t\"\"$objdir\" 1>&6\n##\n## END FIXME\n\n\n## FIXME: this should be a separate macro\n##\n# Check whether --with-pic or --without-pic was given.\nif test \"${with_pic+set}\" = set; then\n  withval=\"$with_pic\"\n  pic_mode=\"$withval\"\nelse\n  pic_mode=default\nfi\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n# We assume here that the value for lt_cv_prog_cc_pic will not be cached\n# in isolation, and that seeing it set (from the cache) indicates that\n# the associated values are set (in the cache) correctly too.\necho $ac_n \"checking for $compiler option to produce PIC\"\"... $ac_c\" 1>&6\necho \"configure:2398: checking for $compiler option to produce PIC\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_prog_cc_pic'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n   lt_cv_prog_cc_pic=\n  lt_cv_prog_cc_shlib=\n  lt_cv_prog_cc_wl=\n  lt_cv_prog_cc_static=\n  lt_cv_prog_cc_no_builtin=\n  lt_cv_prog_cc_can_build_shared=$can_build_shared\n\n  if test \"$GCC\" = yes; then\n    lt_cv_prog_cc_wl='-Wl,'\n    lt_cv_prog_cc_static='-static'\n\n    case $host_os in\n    aix*)\n      # Below there is a dirty hack to force normal static linking with -ldl\n      # The problem is because libdl dynamically linked with both libc and\n      # libC (AIX C++ library), which obviously doesn't included in libraries\n      # list by gcc. This cause undefined symbols with -static flags.\n      # This hack allows C programs to be linked with \"-static -ldl\", but\n      # not sure about C++ programs.\n      lt_cv_prog_cc_static=\"$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC\"\n      ;;\n    amigaos*)\n      # FIXME: we need at least 68020 code to build shared libraries, but\n      # adding the `-m68020' flag to GCC prevents building anything better,\n      # like `-m68040'.\n      lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'\n      ;;\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_cv_prog_cc_pic='-fno-common'\n      ;;\n    cygwin* | mingw* | pw32* | os2*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_cv_prog_cc_pic='-DDLL_EXPORT'\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t lt_cv_prog_cc_pic=-Kconform_pic\n      fi\n      ;;\n    *)\n      lt_cv_prog_cc_pic='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for PIC flags for the system compiler.\n    case $host_os in\n    aix3* | aix4* | aix5*)\n      lt_cv_prog_cc_wl='-Wl,'\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_cv_prog_cc_static='-Bstatic'\n      else\n\tlt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      # Is there a better lt_cv_prog_cc_static that works with the bundled CC?\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static=\"${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive\"\n      lt_cv_prog_cc_pic='+Z'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static='-non_shared'\n      # PIC (with -KPIC) is the default.\n      ;;\n\n    cygwin* | mingw* | pw32* | os2*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_cv_prog_cc_pic='-DDLL_EXPORT'\n      ;;\n\n    newsos6)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      # All OSF/1 code is PIC.\n      lt_cv_prog_cc_wl='-Wl,'\n      lt_cv_prog_cc_static='-non_shared'\n      ;;\n\n    sco3.2v5*)\n      lt_cv_prog_cc_pic='-Kpic'\n      lt_cv_prog_cc_static='-dn'\n      lt_cv_prog_cc_shlib='-belf'\n      ;;\n\n    solaris*)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      lt_cv_prog_cc_wl='-Wl,'\n      ;;\n\n    sunos4*)\n      lt_cv_prog_cc_pic='-PIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      lt_cv_prog_cc_wl='-Qoption ld '\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n      lt_cv_prog_cc_pic='-KPIC'\n      lt_cv_prog_cc_static='-Bstatic'\n      if test \"x$host_vendor\" = xsni; then\n\tlt_cv_prog_cc_wl='-LD'\n      else\n\tlt_cv_prog_cc_wl='-Wl,'\n      fi\n      ;;\n\n    uts4*)\n      lt_cv_prog_cc_pic='-pic'\n      lt_cv_prog_cc_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_cv_prog_cc_pic='-Kconform_pic'\n\tlt_cv_prog_cc_static='-Bstatic'\n      fi\n      ;;\n\n    *)\n      lt_cv_prog_cc_can_build_shared=no\n      ;;\n    esac\n  fi\n\nfi\n\nif test -z \"$lt_cv_prog_cc_pic\"; then\n  echo \"$ac_t\"\"none\" 1>&6\nelse\n  echo \"$ac_t\"\"$lt_cv_prog_cc_pic\" 1>&6\n\n  # Check to make sure the pic_flag actually works.\n  echo $ac_n \"checking if $compiler PIC flag $lt_cv_prog_cc_pic works\"\"... $ac_c\" 1>&6\necho \"configure:2550: checking if $compiler PIC flag $lt_cv_prog_cc_pic works\" >&5\n  if eval \"test \\\"`echo '$''{'lt_cv_prog_cc_pic_works'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n      save_CFLAGS=\"$CFLAGS\"\n    CFLAGS=\"$CFLAGS $lt_cv_prog_cc_pic -DPIC\"\n    cat > conftest.$ac_ext <<EOF\n#line 2557 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\n\n; return 0; }\nEOF\nif { (eval echo configure:2564: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n        case $host_os in\n      hpux9* | hpux10* | hpux11*)\n\t# On HP-UX, both CC and GCC only warn that PIC is supported... then\n\t# they create non-PIC objects.  So, if there were any warnings, we\n\t# assume that PIC is not supported.\n\tif test -s conftest.err; then\n\t  lt_cv_prog_cc_pic_works=no\n\telse\n\t  lt_cv_prog_cc_pic_works=yes\n\tfi\n\t;;\n      *)\n\tlt_cv_prog_cc_pic_works=yes\n\t;;\n      esac\n    \nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n        lt_cv_prog_cc_pic_works=no\n    \nfi\nrm -f conftest*\n    CFLAGS=\"$save_CFLAGS\"\n  \nfi\n\n\n  if test \"X$lt_cv_prog_cc_pic_works\" = Xno; then\n    lt_cv_prog_cc_pic=\n    lt_cv_prog_cc_can_build_shared=no\n  else\n    lt_cv_prog_cc_pic=\" $lt_cv_prog_cc_pic\"\n  fi\n\n  echo \"$ac_t\"\"$lt_cv_prog_cc_pic_works\" 1>&6\nfi\n##\n## END FIXME\n\n# Check for any special shared library compilation flags.\nif test -n \"$lt_cv_prog_cc_shlib\"; then\n  echo \"configure: warning: \\`$CC' requires \\`$lt_cv_prog_cc_shlib' to build shared libraries\" 1>&2\n  if echo \"$old_CC $old_CFLAGS \" | egrep -e \"[ \t]$lt_cv_prog_cc_shlib[ \t]\" >/dev/null; then :\n  else\n   echo \"configure: warning: add \\`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure\" 1>&2\n    lt_cv_prog_cc_can_build_shared=no\n  fi\nfi\n\n## FIXME: this should be a separate macro\n##\necho $ac_n \"checking if $compiler static flag $lt_cv_prog_cc_static works\"\"... $ac_c\" 1>&6\necho \"configure:2620: checking if $compiler static flag $lt_cv_prog_cc_static works\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_prog_cc_static_works'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n    lt_cv_prog_cc_static_works=no\n  save_LDFLAGS=\"$LDFLAGS\"\n  LDFLAGS=\"$LDFLAGS $lt_cv_prog_cc_static\"\n  cat > conftest.$ac_ext <<EOF\n#line 2628 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\n\n; return 0; }\nEOF\nif { (eval echo configure:2635: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  lt_cv_prog_cc_static_works=yes\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\nfi\nrm -f conftest*\n  LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n\n\n# Belt *and* braces to stop my trousers falling down:\ntest \"X$lt_cv_prog_cc_static_works\" = Xno && lt_cv_prog_cc_static=\necho \"$ac_t\"\"$lt_cv_prog_cc_static_works\" 1>&6\n\npic_flag=\"$lt_cv_prog_cc_pic\"\nspecial_shlib_compile_flags=\"$lt_cv_prog_cc_shlib\"\nwl=\"$lt_cv_prog_cc_wl\"\nlink_static_flag=\"$lt_cv_prog_cc_static\"\nno_builtin_flag=\"$lt_cv_prog_cc_no_builtin\"\ncan_build_shared=\"$lt_cv_prog_cc_can_build_shared\"\n##\n## END FIXME\n\n\n## FIXME: this should be a separate macro\n##\n# Check to see if options -o and -c are simultaneously supported by compiler\necho $ac_n \"checking if $compiler supports -c -o file.$ac_objext\"\"... $ac_c\" 1>&6\necho \"configure:2666: checking if $compiler supports -c -o file.$ac_objext\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_compiler_c_o'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \n$rm -r conftest 2>/dev/null\nmkdir conftest\ncd conftest\necho \"int some_variable = 0;\" > conftest.$ac_ext\nmkdir out\n# According to Tom Tromey, Ian Lance Taylor reported there are C compilers\n# that will create temporary files in the current directory regardless of\n# the output directory.  Thus, making CWD read-only will cause this test\n# to fail, enabling locking or at least warning the user not to do parallel\n# builds.\nchmod -w .\nsave_CFLAGS=\"$CFLAGS\"\nCFLAGS=\"$CFLAGS -o out/conftest2.$ac_objext\"\ncompiler_c_o=no\nif { (eval echo configure:2685: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then\n  # The compiler can only warn and ignore the option if not recognized\n  # So say no if there are warnings\n  if test -s out/conftest.err; then\n    lt_cv_compiler_c_o=no\n  else\n    lt_cv_compiler_c_o=yes\n  fi\nelse\n  # Append any errors to the config.log.\n  cat out/conftest.err 1>&5\n  lt_cv_compiler_c_o=no\nfi\nCFLAGS=\"$save_CFLAGS\"\nchmod u+w .\n$rm conftest* out/*\nrmdir out\ncd ..\nrmdir conftest\n$rm -r conftest 2>/dev/null\n\nfi\n\ncompiler_c_o=$lt_cv_compiler_c_o\necho \"$ac_t\"\"$compiler_c_o\" 1>&6\n\nif test x\"$compiler_c_o\" = x\"yes\"; then\n  # Check to see if we can write to a .lo\n  echo $ac_n \"checking if $compiler supports -c -o file.lo\"\"... $ac_c\" 1>&6\necho \"configure:2714: checking if $compiler supports -c -o file.lo\" >&5\n  if eval \"test \\\"`echo '$''{'lt_cv_compiler_o_lo'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \n  lt_cv_compiler_o_lo=no\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -c -o conftest.lo\"\n  save_objext=\"$ac_objext\"\n  ac_objext=lo\n  cat > conftest.$ac_ext <<EOF\n#line 2725 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\nint some_variable = 0;\n; return 0; }\nEOF\nif { (eval echo configure:2732: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n      # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n    if test -s conftest.err; then\n      lt_cv_compiler_o_lo=no\n    else\n      lt_cv_compiler_o_lo=yes\n    fi\n  \nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\nfi\nrm -f conftest*\n  ac_objext=\"$save_objext\"\n  CFLAGS=\"$save_CFLAGS\"\n  \nfi\n\n  compiler_o_lo=$lt_cv_compiler_o_lo\n  echo \"$ac_t\"\"$compiler_o_lo\" 1>&6\nelse\n  compiler_o_lo=no\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Check to see if we can do hard links to lock some files if needed\nhard_links=\"nottested\"\nif test \"$compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  echo $ac_n \"checking if we can lock with hard links\"\"... $ac_c\" 1>&6\necho \"configure:2767: checking if we can lock with hard links\" >&5\n  hard_links=yes\n  $rm conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  echo \"$ac_t\"\"$hard_links\" 1>&6\n  if test \"$hard_links\" = no; then\n    echo \"configure: warning: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" 1>&2\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nif test \"$GCC\" = yes; then\n  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler\n  echo $ac_n \"checking if $compiler supports -fno-rtti -fno-exceptions\"\"... $ac_c\" 1>&6\necho \"configure:2790: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext\"\n  compiler_rtti_exceptions=no\n  cat > conftest.$ac_ext <<EOF\n#line 2796 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\nint some_variable = 0;\n; return 0; }\nEOF\nif { (eval echo configure:2803: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n      # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n    if test -s conftest.err; then\n      compiler_rtti_exceptions=no\n    else\n      compiler_rtti_exceptions=yes\n    fi\n  \nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\nfi\nrm -f conftest*\n  CFLAGS=\"$save_CFLAGS\"\n  echo \"$ac_t\"\"$compiler_rtti_exceptions\" 1>&6\n\n  if test \"$compiler_rtti_exceptions\" = \"yes\"; then\n    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'\n  else\n    no_builtin_flag=' -fno-builtin'\n  fi\nfi\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# See if the linker supports building shared libraries.\necho $ac_n \"checking whether the linker ($LD) supports shared libraries\"\"... $ac_c\" 1>&6\necho \"configure:2834: checking whether the linker ($LD) supports shared libraries\" >&5\n\nallow_undefined_flag=\nno_undefined_flag=\nneed_lib_prefix=unknown\nneed_version=unknown\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\narchive_cmds=\narchive_expsym_cmds=\nold_archive_from_new_cmds=\nold_archive_from_expsyms_cmds=\nexport_dynamic_flag_spec=\nwhole_archive_flag_spec=\nthread_safe_flag_spec=\nhardcode_into_libs=no\nhardcode_libdir_flag_spec=\nhardcode_libdir_separator=\nhardcode_direct=no\nhardcode_minus_L=no\nhardcode_shlibpath_var=unsupported\nrunpath_var=\nlink_all_deplibs=unknown\nalways_export_symbols=no\nexport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n# include_expsyms should be a list of space-separated symbols to be *always*\n# included in the symbol list\ninclude_expsyms=\n# exclude_expsyms can be an egrep regular expression of symbols to exclude\n# it will be wrapped by ` (' and `)$', so one must not match beginning or\n# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n# as well as any symbol that contains `d'.\nexclude_expsyms=\"_GLOBAL_OFFSET_TABLE_\"\n# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n# platforms (ab)use it in PIC code, but their linkers get confused if\n# the symbol is explicitly referenced.  Since portable code cannot\n# rely on this symbol name, it's probably fine to never include it in\n# preloaded symbol tables.\nextract_expsyms_cmds=\n\ncase $host_os in\ncygwin* | mingw* | pw32*)\n  # FIXME: the MSVC++ port hasn't been tested in a loooong time\n  # When not using gcc, we currently assume that we are using\n  # Microsoft Visual C++.\n  if test \"$GCC\" != yes; then\n    with_gnu_ld=no\n  fi\n  ;;\nopenbsd*)\n  with_gnu_ld=no\n  ;;\nesac\n\nld_shlibs=yes\nif test \"$with_gnu_ld\" = yes; then\n  # If archive_cmds runs LD, not CC, wlarc should be empty\n  wlarc='${wl}'\n\n  # See if GNU ld supports shared libraries.\n  case $host_os in\n  aix3* | aix4* | aix5*)\n    # On AIX, the GNU linker is very broken\n    # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.\n    ld_shlibs=no\n    cat <<EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\nEOF\n    ;;\n\n  amigaos*)\n    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n\n    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports\n    # that the semantics of dynamic libraries on AmigaOS, at least up\n    # to version 4, is to share data among multiple programs linked\n    # with the same dynamic library.  Since this doesn't match the\n    # behavior of shared libraries on other platforms, we can use\n    # them.\n    ld_shlibs=no\n    ;;\n\n  beos*)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      allow_undefined_flag=unsupported\n      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n      # support --undefined.  This deserves some investigation.  FIXME\n      archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec='-L$libdir'\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n\n    extract_expsyms_cmds='test -f $output_objdir/impgen.c || \\\n      sed -e \"/^# \\/\\* impgen\\.c starts here \\*\\//,/^# \\/\\* impgen.c ends here \\*\\// { s/^# //;s/^# *$//; p; }\" -e d < $''0 > $output_objdir/impgen.c~\n      test -f $output_objdir/impgen.exe || (cd $output_objdir && \\\n      if test \"x$HOST_CC\" != \"x\" ; then $HOST_CC -o impgen impgen.c ; \\\n      else $CC -o impgen impgen.c ; fi)~\n      $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'\n\n    old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'\n\n    # cygwin and mingw dlls have different entry points and sets of symbols\n    # to exclude.\n    # FIXME: what about values for MSVC?\n    dll_entry=__cygwin_dll_entry@12\n    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~\n    case $host_os in\n    mingw*)\n      # mingw values\n      dll_entry=_DllMainCRTStartup@12\n      dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~\n      ;;\n    esac\n\n    # mingw and cygwin differ, and it's simplest to just exclude the union\n    # of the two symbol sets.\n    dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12\n\n    # recent cygwin and mingw systems supply a stub DllMain which the user\n    # can override, but on older systems we have to supply one (in ltdll.c)\n    if test \"x$lt_cv_need_dllmain\" = \"xyes\"; then\n      ltdll_obj='$output_objdir/$soname-ltdll.'\"$ac_objext \"\n      ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e \"/^# \\/\\* ltdll\\.c starts here \\*\\//,/^# \\/\\* ltdll.c ends here \\*\\// { s/^# //; p; }\" -e d < $''0 > $output_objdir/$soname-ltdll.c~\n\ttest -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'\n    else\n      ltdll_obj=\n      ltdll_cmds=\n    fi\n\n    # Extract the symbol export list from an `--export-all' def file,\n    # then regenerate the def file from the symbol export list, so that\n    # the compiled dll only exports the symbol export list.\n    # Be careful not to strip the DATA tag left be newer dlltools.\n    export_symbols_cmds=\"$ltdll_cmds\"'\n      $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~\n      sed -e \"1,/EXPORTS/d\" -e \"s/ @ [0-9]*//\" -e \"s/ *;.*$//\" < $output_objdir/$soname-def > $export_symbols'\n\n    # If the export-symbols file already is a .def file (1st line\n    # is EXPORTS), use it as is.\n    # If DATA tags from a recent dlltool are present, honour them!\n    archive_expsym_cmds='if test \"x`head -1 $export_symbols`\" = xEXPORTS; then\n\tcp $export_symbols $output_objdir/$soname-def;\n      else\n\techo EXPORTS > $output_objdir/$soname-def;\n\t_lt_hint=1;\n\tcat $export_symbols | while read symbol; do\n\t set dummy \\$symbol;\n\t case \\$# in\n\t   2) echo \"   \\$2 @ \\$_lt_hint ; \" >> $output_objdir/$soname-def;;\n\t   *) echo \"     \\$2 @ \\$_lt_hint \\$3 ; \" >> $output_objdir/$soname-def;;\n\t esac;\n\t _lt_hint=`expr 1 + \\$_lt_hint`;\n\tdone;\n      fi~\n      '\"$ltdll_cmds\"'\n      $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~\n      $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~\n      $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'\n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n      wlarc=\n    else\n      archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    fi\n    ;;\n\n  solaris* | sysv5*)\n    if $LD -v 2>&1 | egrep 'BFD 2\\.8' > /dev/null; then\n      ld_shlibs=no\n      cat <<EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\nEOF\n    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n\n  sunos4*)\n    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n    wlarc=\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n  esac\n\n  if test \"$ld_shlibs\" = yes; then\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    case $host_os in\n    cygwin* | mingw* | pw32*)\n      # dlltool doesn't understand --whole-archive et. al.\n      whole_archive_flag_spec=\n      ;;\n    *)\n      # ancient GNU ld didn't support --whole-archive et. al.\n      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then\n\twhole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n      else\n\twhole_archive_flag_spec=\n      fi\n      ;;\n    esac\n  fi\nelse\n  # PORTME fill in a description of your system's linker (not GNU ld)\n  case $host_os in\n  aix3*)\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n    archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n    # Note: this linker hardcodes the directories in LIBPATH if there\n    # are no directories specified by -L.\n    hardcode_minus_L=yes\n    if test \"$GCC\" = yes && test -z \"$link_static_flag\"; then\n      # Neither direct hardcoding nor static linking is supported with a\n      # broken collect2.\n      hardcode_direct=unsupported\n    fi\n    ;;\n\n  aix4* | aix5*)\n    if test \"$host_cpu\" = ia64; then\n      # On IA64, the linker does run time linking by default, so we don't\n      # have to do anything special.\n      aix_use_runtimelinking=no\n      exp_sym_flag='-Bexport'\n      no_entry_flag=\"\"\n    else\n      aix_use_runtimelinking=no\n\n      # Test if we are trying to use run time linking or normal\n      # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n      # need to do runtime linking.\n      case $host_os in aix4.[23]|aix4.[23].*|aix5*)\n\tfor ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\tdone\n      esac\n\n      exp_sym_flag='-bexport'\n      no_entry_flag='-bnoentry'\n    fi\n\n    # When large executables or shared objects are built, AIX ld can\n    # have problems creating the table of contents.  If linking a library\n    # or program results in \"error TOC overflow\" add -mminimal-toc to\n    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n    hardcode_direct=yes\n    archive_cmds=''\n    hardcode_libdir_separator=':'\n    if test \"$GCC\" = yes; then\n      case $host_os in aix4.[012]|aix4.[012].*)\n\tcollect2name=`${CC} -print-prog-name=collect2`\n\tif test -f \"$collect2name\" && \\\n\t  strings \"$collect2name\" | grep resolve_lib_name >/dev/null\n\tthen\n\t  # We have reworked collect2\n\t  hardcode_direct=yes\n\telse\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\tfi\n      esac\n\n      shared_flag='-shared'\n    else\n      # not using gcc\n      if test \"$host_cpu\" = ia64; then\n\tshared_flag='${wl}-G'\n      else\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag='${wl}-G'\n\telse\n\t  shared_flag='${wl}-bM:SRE'\n\tfi\n      fi\n    fi\n\n    # It seems that -bexpall can do strange things, so it is better to\n    # generate a list of symbols to export.\n    always_export_symbols=yes\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # Warning - without using the other runtime loading flags (-brtl),\n      # -berok will link without error, but may produce a broken library.\n      allow_undefined_flag='-berok'\n      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'\n      archive_expsym_cmds=\"\\$CC\"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then echo \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n    else\n      if test \"$host_cpu\" = ia64; then\n\thardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\tallow_undefined_flag=\"-z nodefs\"\n\tarchive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols\"\n      else\n\thardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'\n\t# Warning - without using the other run time loading flags,\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='${wl}-berok'\n\t# This is a bit strange, but is similar to how AIX traditionally builds\n\t# it's shared libraries.\n\tarchive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '\"\\${wl}$no_entry_flag \\${wl}$exp_sym_flag:\\$export_symbols\"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'\n      fi\n    fi\n    ;;\n\n  amigaos*)\n    archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    # see comment about different semantics on the GNU ld section\n    ld_shlibs=no\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec=' '\n    allow_undefined_flag=unsupported\n    # Tell ltmain to make .lib files, not .a files.\n    libext=lib\n    # FIXME: Setting linknames here is a bad hack.\n    archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo \"$deplibs\" | sed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n    # The linker will automatically build a .lib file if we build a DLL.\n    old_archive_from_new_cmds='true'\n    # FIXME: Should let the user specify the lib program.\n    old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'\n    fix_srcfile_path='`cygpath -w \"$srcfile\"`'\n    ;;\n\n  darwin* | rhapsody*)\n    case \"$host_os\" in\n    rhapsody* | darwin1.[012])\n      allow_undefined_flag='-undefined suppress'\n      ;;\n    *) # Darwin 1.3 on\n      allow_undefined_flag='-flat_namespace -undefined suppress'\n      ;;\n    esac\n    # FIXME: Relying on posixy $() will cause problems for\n    #        cross-compilation, but unfortunately the echo tests do not\n    #        yet detect zsh echo's removal of \\ escapes.  Also zsh mangles\n    #\t     `\"' quotes if we put them in here... so don't!\n    archive_cmds='$nonopt $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'\n    # We need to add '_' to the symbols in $export_symbols first\n    #archive_expsym_cmds=\"$archive_cmds\"' && strip -s $export_symbols'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    whole_archive_flag_spec='-all_load $convenience'\n    ;;\n\n  freebsd1*)\n    ld_shlibs=no\n    ;;\n\n  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n  # support.  Future versions do this automatically, but an explicit c++rt0.o\n  # does not break anything, and helps significantly (at the cost of a little\n  # extra space).\n  freebsd2.2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n  freebsd2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n  freebsd*)\n    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  hpux9* | hpux10* | hpux11*)\n    case $host_os in\n    hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;\n    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;\n    esac\n    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n    hardcode_libdir_separator=:\n    hardcode_direct=yes\n    hardcode_minus_L=yes # Not in the search PATH, but as the default\n\t\t\t # location of the library.\n    export_dynamic_flag_spec='${wl}-E'\n    ;;\n\n  irix5* | irix6* | nonstopux*)\n    if test \"$GCC\" = yes; then\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n    else\n      archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    link_all_deplibs=yes\n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n    else\n      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n    fi\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  newsos6)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    hardcode_shlibpath_var=no\n    ;;\n\n  openbsd*)\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n    else\n      case \"$host_os\" in\n      openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_libdir_flag_spec='-R$libdir'\n        ;;\n      *)\n        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'\n        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n        ;;\n      esac\n    fi\n    ;;\n\n  os2*)\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    allow_undefined_flag=unsupported\n    archive_cmds='$echo \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$echo \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n    old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n    ;;\n\n  osf3*)\n    if test \"$GCC\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    ;;\n\n  osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n    if test \"$GCC\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'\n      archive_expsym_cmds='for i in `cat $export_symbols`; do printf \"-exported_symbol \" >> $lib.exp; echo \"\\$i\" >> $lib.exp; done; echo \"-hidden\">> $lib.exp~\n      $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'\n\n      #Both c and cxx compiler support -rpath directly\n      hardcode_libdir_flag_spec='-rpath $libdir'\n    fi\n    hardcode_libdir_separator=:\n    ;;\n\n  sco3.2v5*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_shlibpath_var=no\n    runpath_var=LD_RUN_PATH\n    hardcode_runpath_var=yes\n    export_dynamic_flag_spec='${wl}-Bexport'\n    ;;\n\n  solaris*)\n    # gcc --version < 3.0 without binutils cannot create self contained\n    # shared libraries reliably, requiring libgcc.a to resolve some of\n    # the object symbols generated in some cases.  Libraries that use\n    # assert need libgcc.a to resolve __eprintf, for example.  Linking\n    # a copy of libgcc.a into every shared library to guarantee resolving\n    # such symbols causes other problems:  According to Tim Van Holder\n    # <tim.van.holder@pandora.be>, C++ libraries end up with a separate\n    # (to the application) exception stack for one thing.\n    no_undefined_flag=' -z defs'\n    if test \"$GCC\" = yes; then\n      case `$CC --version 2>/dev/null` in\n      [12].*)\n\tcat <<EOF 1>&2\n\n*** Warning: Releases of GCC earlier than version 3.0 cannot reliably\n*** create self contained shared libraries on Solaris systems, without\n*** introducing a dependency on libgcc.a.  Therefore, libtool is disabling\n*** -no-undefined support, which will at least allow you to build shared\n*** libraries.  However, you may find that when you link such libraries\n*** into an application without using GCC, you have to manually add\n*** \\`gcc --print-libgcc-file-name\\` to the link command.  We urge you to\n*** upgrade to a newer version of GCC.  Another option is to rebuild your\n*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.\n\nEOF\n        no_undefined_flag=\n\t;;\n      esac\n    fi\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_shlibpath_var=no\n    case $host_os in\n    solaris2.[0-5] | solaris2.[0-5].*) ;;\n    *) # Supported since Solaris 2.6 (maybe 2.5.1?)\n      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;\n    esac\n    link_all_deplibs=yes\n    ;;\n\n  sunos4*)\n    if test \"x$host_vendor\" = xsequent; then\n      # Use $CC to link under sequent, because it throws in some extra .o\n      # files that make .init and .fini sections work.\n      archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n    else\n      archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n    fi\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4)\n    if test \"x$host_vendor\" = xsno; then\n      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes # is this really true???\n    else\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n    fi\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4.3*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_shlibpath_var=no\n    export_dynamic_flag_spec='-Bexport'\n    ;;\n\n  sysv5*)\n    no_undefined_flag=' -z text'\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'\n    hardcode_libdir_flag_spec=\n    hardcode_shlibpath_var=no\n    runpath_var='LD_RUN_PATH'\n    ;;\n\n  uts4*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  dgux*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4*MP*)\n    if test -d /usr/nec; then\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      runpath_var=LD_RUN_PATH\n      hardcode_runpath_var=yes\n      ld_shlibs=yes\n    fi\n    ;;\n\n  sysv4.2uw2*)\n    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n    hardcode_direct=yes\n    hardcode_minus_L=no\n    hardcode_shlibpath_var=no\n    hardcode_runpath_var=yes\n    runpath_var=LD_RUN_PATH\n    ;;\n\n  sysv5uw7* | unixware7*)\n    no_undefined_flag='${wl}-z ${wl}text'\n    if test \"$GCC\" = yes; then\n      archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n    else\n      archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n    fi\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    ld_shlibs=no\n    ;;\n  esac\nfi\necho \"$ac_t\"\"$ld_shlibs\" 1>&6\ntest \"$ld_shlibs\" = no && can_build_shared=no\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Check hardcoding attributes.\necho $ac_n \"checking how to hardcode library paths into programs\"\"... $ac_c\" 1>&6\necho \"configure:3523: checking how to hardcode library paths into programs\" >&5\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" || \\\n   test -n \"$runpath_var\"; then\n\n  # We can hardcode non-existant directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$hardcode_shlibpath_var\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\necho \"$ac_t\"\"$hardcode_action\" 1>&6\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\nstriplib=\nold_striplib=\necho $ac_n \"checking whether stripping libraries is possible\"\"... $ac_c\" 1>&6\necho \"configure:3555: checking whether stripping libraries is possible\" >&5\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | grep \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  echo \"$ac_t\"\"yes\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n##\n## END FIXME\n\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n## FIXME: this should be a separate macro\n##\n# PORTME Fill in your ld.so characteristics\necho $ac_n \"checking dynamic linker characteristics\"\"... $ac_c\" 1>&6\necho \"configure:3573: checking dynamic linker characteristics\" >&5\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nsys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}.so$major'\n  ;;\n\naix4* | aix5*)\n  version_type=linux\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n\tif { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t     echo ' yes '\n\t     echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then\n\t  :\n\telse\n\t  can_build_shared=no\n\tfi\n\t;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can\n    # not hardcode correct soname into executable. Probably we can\n    # add versioning support to collect2, so additional links can\n    # be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}.so$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  library_names_spec='$libname.ixlibrary $libname.a'\n  # Create ${libname}_ixlibrary.a entries in /sys/libs.\n  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo \"X$lib\" | $Xsed -e '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show \"(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)\"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'\n  ;;\n\nbeos*)\n  library_names_spec='${libname}.so'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi4*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  export_dynamic_flag_spec=-rdynamic\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32*)\n  version_type=windows\n  need_version=no\n  need_lib_prefix=no\n  case $GCC,$host_os in\n  yes,cygwin*)\n    library_names_spec='$libname.dll.a'\n    soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'\n    postinstall_cmds='dlpath=`bash 2>&1 -c '\\''. $dir/${file}i;echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog .libs/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`bash 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $rm \\$dlpath'\n    ;;\n  yes,mingw*)\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'\n    sys_lib_search_path_spec=`$CC -print-search-dirs | grep \"^libraries:\" | sed -e \"s/^libraries://\" -e \"s/;/ /g\"`\n    ;;\n  yes,pw32*)\n    library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'\n    ;;\n  *)\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  # FIXME: Relying on posixy $() will cause problems for\n  #        cross-compilation, but unfortunately the echo tests do not\n  #        yet detect zsh echo's removal of \\ escapes.\n  library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'\n  soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd*)\n  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  *)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  dynamic_linker=\"$host_os dld.sl\"\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  shlibpath_var=SHLIB_PATH\n  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'\n  soname_spec='${libname}${release}.sl$major'\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)          version_type=irix ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}.so$major'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \") libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \") libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \") libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux-gnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'\n    soname_spec='${libname}${release}.so$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case \"$host_os\" in\n    openbsd2.[89] | openbsd2.[89].*)\n      shlibpath_overrides_runpath=no\n      ;;\n    *)\n      shlibpath_overrides_runpath=yes\n      ;;\n    esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nos2*)\n  libname_spec='$name'\n  need_lib_prefix=no\n  library_names_spec='$libname.dll $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_version=no\n  need_lib_prefix=no\n  soname_spec='${libname}${release}.so'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nsco3.2v5*)\n  version_type=osf\n  soname_spec='${libname}${release}.so$major'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'\n    soname_spec='$libname.so.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\necho \"$ac_t\"\"$dynamic_linker\" 1>&6\ntest \"$dynamic_linker\" = no && can_build_shared=no\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# Report the final consequences.\necho $ac_n \"checking if libtool supports shared libraries\"\"... $ac_c\" 1>&6\necho \"configure:3978: checking if libtool supports shared libraries\" >&5\necho \"$ac_t\"\"$can_build_shared\" 1>&6\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\necho $ac_n \"checking whether to build shared libraries\"\"... $ac_c\" 1>&6\necho \"configure:3986: checking whether to build shared libraries\" >&5\ntest \"$can_build_shared\" = \"no\" && enable_shared=no\n\n# On AIX, shared libraries and static libraries use the same namespace, and\n# are all built from PIC.\ncase \"$host_os\" in\naix3*)\n  test \"$enable_shared\" = yes && enable_static=no\n  if test -n \"$RANLIB\"; then\n    archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n    postinstall_cmds='$RANLIB $lib'\n  fi\n  ;;\n\naix4*)\n  if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n    test \"$enable_shared\" = yes && enable_static=no\n  fi\n  ;;\nesac\necho \"$ac_t\"\"$enable_shared\" 1>&6\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\necho $ac_n \"checking whether to build static libraries\"\"... $ac_c\" 1>&6\necho \"configure:4013: checking whether to build static libraries\" >&5\n# Make sure either enable_shared or enable_static is yes.\ntest \"$enable_shared\" = yes || enable_static=yes\necho \"$ac_t\"\"$enable_static\" 1>&6\n##\n## END FIXME\n\nif test \"$hardcode_action\" = relink; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  cygwin* | mingw* | pw32*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n   ;;\n\n  *)\n    echo $ac_n \"checking for shl_load\"\"... $ac_c\" 1>&6\necho \"configure:4056: checking for shl_load\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_func_shl_load'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 4061 \"configure\"\n#include \"confdefs.h\"\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char shl_load(); below.  */\n#include <assert.h>\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar shl_load();\n\nint main() {\n\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_shl_load) || defined (__stub___shl_load)\nchoke me\n#else\nshl_load();\n#endif\n\n; return 0; }\nEOF\nif { (eval echo configure:4084: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_func_shl_load=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_func_shl_load=no\"\nfi\nrm -f conftest*\nfi\n\nif eval \"test \\\"`echo '$ac_cv_func_'shl_load`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"shl_load\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for shl_load in -ldld\"\"... $ac_c\" 1>&6\necho \"configure:4102: checking for shl_load in -ldld\" >&5\nac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldld  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 4110 \"configure\"\n#include \"confdefs.h\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar shl_load();\n\nint main() {\nshl_load()\n; return 0; }\nEOF\nif { (eval echo configure:4121: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-dld\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dlopen\"\"... $ac_c\" 1>&6\necho \"configure:4140: checking for dlopen\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_func_dlopen'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 4145 \"configure\"\n#include \"confdefs.h\"\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char dlopen(); below.  */\n#include <assert.h>\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar dlopen();\n\nint main() {\n\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_dlopen) || defined (__stub___dlopen)\nchoke me\n#else\ndlopen();\n#endif\n\n; return 0; }\nEOF\nif { (eval echo configure:4168: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_func_dlopen=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_func_dlopen=no\"\nfi\nrm -f conftest*\nfi\n\nif eval \"test \\\"`echo '$ac_cv_func_'dlopen`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dlopen\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dlopen in -ldl\"\"... $ac_c\" 1>&6\necho \"configure:4186: checking for dlopen in -ldl\" >&5\nac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldl  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 4194 \"configure\"\n#include \"confdefs.h\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar dlopen();\n\nint main() {\ndlopen()\n; return 0; }\nEOF\nif { (eval echo configure:4205: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dlopen in -lsvld\"\"... $ac_c\" 1>&6\necho \"configure:4224: checking for dlopen in -lsvld\" >&5\nac_lib_var=`echo svld'_'dlopen | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-lsvld  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 4232 \"configure\"\n#include \"confdefs.h\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar dlopen();\n\nint main() {\ndlopen()\n; return 0; }\nEOF\nif { (eval echo configure:4243: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dld_link in -ldld\"\"... $ac_c\" 1>&6\necho \"configure:4262: checking for dld_link in -ldld\" >&5\nac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldld  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 4270 \"configure\"\n#include \"confdefs.h\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\nchar dld_link();\n\nint main() {\ndld_link()\n; return 0; }\nEOF\nif { (eval echo configure:4281: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-dld\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n\t      \nfi\n\n\t    \nfi\n\n\t  \nfi\n\n\t\nfi\n\n      \nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n        test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    echo $ac_n \"checking whether a program can dlopen itself\"\"... $ac_c\" 1>&6\necho \"configure:4337: checking whether a program can dlopen itself\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_dlopen_self'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<EOF\n#line 4347 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" void exit (int);\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n\n    exit (status);\n}\nEOF\n  if { (eval echo configure:4408: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_unknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n    \nfi\n\necho \"$ac_t\"\"$lt_cv_dlopen_self\" 1>&6\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      LDFLAGS=\"$LDFLAGS $link_static_flag\"\n      echo $ac_n \"checking whether a statically linked program can dlopen itself\"\"... $ac_c\" 1>&6\necho \"configure:4431: checking whether a statically linked program can dlopen itself\" >&5\nif eval \"test \\\"`echo '$''{'lt_cv_dlopen_self_static'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<EOF\n#line 4441 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" void exit (int);\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n\n    exit (status);\n}\nEOF\n  if { (eval echo configure:4502: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n      \nfi\n\necho \"$ac_t\"\"$lt_cv_dlopen_self_static\" 1>&6\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n## FIXME: this should be a separate macro\n##\nif test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n  case $archive_cmds in\n  *'~'*)\n    # FIXME: we may have to deal with multi-command sequences.\n    ;;\n  '$CC '*)\n    # Test whether the compiler implicitly links with -lc since on some\n    # systems, -lgcc has to come before -lc. If gcc already passes -lc\n    # to ld, don't add -lc before -lgcc.\n    echo $ac_n \"checking whether -lc should be explicitly linked in\"\"... $ac_c\" 1>&6\necho \"configure:4553: checking whether -lc should be explicitly linked in\" >&5\n    if eval \"test \\\"`echo '$''{'lt_cv_archive_cmds_need_lc'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  $rm conftest*\n    echo 'static int dummy;' > conftest.$ac_ext\n\n    if { (eval echo configure:4560: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n      soname=conftest\n      lib=conftest\n      libobjs=conftest.$ac_objext\n      deplibs=\n      wl=$lt_cv_prog_cc_wl\n      compiler_flags=-v\n      linker_flags=-v\n      verstring=\n      output_objdir=.\n      libname=conftest\n      save_allow_undefined_flag=$allow_undefined_flag\n      allow_undefined_flag=\n      if { (eval echo configure:4573: \\\"$archive_cmds 2\\>\\&1 \\| grep \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\") 1>&5; (eval $archive_cmds 2\\>\\&1 \\| grep \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5; }\n      then\n\tlt_cv_archive_cmds_need_lc=no\n      else\n\tlt_cv_archive_cmds_need_lc=yes\n      fi\n      allow_undefined_flag=$save_allow_undefined_flag\n    else\n      cat conftest.err 1>&5\n    fi\nfi\n\n    echo \"$ac_t\"\"$lt_cv_archive_cmds_need_lc\" 1>&6\n    ;;\n  esac\nfi\nneed_lc=${lt_cv_archive_cmds_need_lc-yes}\n##\n## END FIXME\n\n## FIXME: this should be a separate macro\n##\n# The second clause should only fire when bootstrapping the\n# libtool distribution, otherwise you forgot to ship ltmain.sh\n# with your package, and you will get complaints that there are\n# no rules to generate ltmain.sh.\nif test -f \"$ltmain\"; then\n  :\nelse\n  # If there is no Makefile yet, we rely on a make rule to execute\n  # `config.status --recheck' to rerun these tests and create the\n  # libtool script then.\n  test -f Makefile && make \"$ltmain\"\nfi\n\nif test -f \"$ltmain\"; then\n  trap \"$rm \\\"${ofile}T\\\"; exit 1\" 1 2 15\n  $rm -f \"${ofile}T\"\n\n  echo creating $ofile\n\n  # Now quote all the things that may contain metacharacters while being\n  # careful not to overquote the AC_SUBSTed values.  We take copies of the\n  # variables and quote the copies for generation of the libtool script.\n  for var in echo old_CC old_CFLAGS \\\n    AR AR_FLAGS CC LD LN_S NM SHELL \\\n    reload_flag reload_cmds wl \\\n    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \\\n    thread_safe_flag_spec whole_archive_flag_spec libname_spec \\\n    library_names_spec soname_spec \\\n    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \\\n    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \\\n    postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \\\n    old_striplib striplib file_magic_cmd export_symbols_cmds \\\n    deplibs_check_method allow_undefined_flag no_undefined_flag \\\n    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \\\n    global_symbol_to_c_name_address \\\n    hardcode_libdir_flag_spec hardcode_libdir_separator  \\\n    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \\\n    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do\n\n    case $var in\n    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \\\n    old_postinstall_cmds | old_postuninstall_cmds | \\\n    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \\\n    extract_expsyms_cmds | old_archive_from_expsyms_cmds | \\\n    postinstall_cmds | postuninstall_cmds | \\\n    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)\n      # Double-quote double-evaled strings.\n      eval \"lt_$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$double_quote_subst\\\" -e \\\"\\$sed_quote_subst\\\" -e \\\"\\$delay_variable_subst\\\"\\`\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$sed_quote_subst\\\"\\`\\\\\\\"\"\n      ;;\n    esac\n  done\n\n  cat <<__EOF__ > \"${ofile}T\"\n#! $SHELL\n\n# `$echo \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n# Copyright (C) 1996-2000 Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"sed -e s/^X//\"\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X\\${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$need_lc\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\n\n# An echo program that does not interpret backslashes.\necho=$lt_echo\n\n# The archiver.\nAR=$lt_AR\nAR_FLAGS=$lt_AR_FLAGS\n\n# The default C compiler.\nCC=$lt_CC\n\n# Is the compiler the GNU C compiler?\nwith_gcc=$GCC\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# Whether we need hard or soft links.\nLN_S=$lt_LN_S\n\n# A BSD-compatible nm program.\nNM=$lt_NM\n\n# A symbol stripping program\nSTRIP=$STRIP\n\n# Used to examine libraries when file_magic_cmd begins \"file\"\nMAGIC_CMD=$MAGIC_CMD\n\n# Used on cygwin: DLL creation program.\nDLLTOOL=\"$DLLTOOL\"\n\n# Used on cygwin: object dumper.\nOBJDUMP=\"$OBJDUMP\"\n\n# Used on cygwin: assembler.\nAS=\"$AS\"\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# How to pass a linker flag through the compiler.\nwl=$lt_wl\n\n# Object file suffix (normally \"o\").\nobjext=\"$ac_objext\"\n\n# Old archive suffix (normally \"a\").\nlibext=\"$libext\"\n\n# Executable file suffix (normally \"\").\nexeext=\"$exeext\"\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_pic_flag\npic_mode=$pic_mode\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_compiler_c_o\n\n# Can we write directly to a .lo ?\ncompiler_o_lo=$lt_compiler_o_lo\n\n# Must we lock files when doing compilation ?\nneed_locks=$lt_need_locks\n\n# Do we need the lib prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_link_static_flag\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_no_builtin_flag\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Compiler flag to generate thread-safe objects.\nthread_safe_flag_spec=$lt_thread_safe_flag_spec\n\n# Library versioning type.\nversion_type=$version_type\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME.\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Commands used to build and install an old-style archive.\nRANLIB=$lt_RANLIB\nold_archive_cmds=$lt_old_archive_cmds\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build and install a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\npostinstall_cmds=$lt_postinstall_cmds\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method == file_magic.\nfile_magic_cmd=$lt_file_magic_cmd\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that forces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# Same as above, but a single script fragment to be evaled but not shown.\nfinish_eval=$lt_finish_eval\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration\nglobal_symbol_to_cdecl=$lt_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair\nglobal_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address\n\n# This is the shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# This is the shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single -rpath flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the\n# resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to yes if using the -LDIR flag during linking hardcodes DIR into the\n# resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into\n# the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at relink time.\nvariables_saved_for_relink=\"$variables_saved_for_relink\"\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Compile-time system search path for libraries\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=\"$fix_srcfile_path\"\n\n# Set to yes if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# ### END LIBTOOL CONFIG\n\n__EOF__\n\n  case $host_os in\n  aix3*)\n    cat <<\\EOF >> \"${ofile}T\"\n\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\nEOF\n    ;;\n  esac\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | os2*)\n    cat <<'EOF' >> \"${ofile}T\"\n      # This is a source program that is used to create dlls on Windows\n      # Don't remove nor modify the starting and closing comments\n# /* ltdll.c starts here */\n# #define WIN32_LEAN_AND_MEAN\n# #include <windows.h>\n# #undef WIN32_LEAN_AND_MEAN\n# #include <stdio.h>\n#\n# #ifndef __CYGWIN__\n# #  ifdef __CYGWIN32__\n# #    define __CYGWIN__ __CYGWIN32__\n# #  endif\n# #endif\n#\n# #ifdef __cplusplus\n# extern \"C\" {\n# #endif\n# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);\n# #ifdef __cplusplus\n# }\n# #endif\n#\n# #ifdef __CYGWIN__\n# #include <cygwin/cygwin_dll.h>\n# DECLARE_CYGWIN_DLL( DllMain );\n# #endif\n# HINSTANCE __hDllInstance_base;\n#\n# BOOL APIENTRY\n# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)\n# {\n#   __hDllInstance_base = hInst;\n#   return TRUE;\n# }\n# /* ltdll.c ends here */\n\t# This is a source program that is used to create import libraries\n\t# on Windows for dlls which lack them. Don't remove nor modify the\n\t# starting and closing comments\n# /* impgen.c starts here */\n# /*   Copyright (C) 1999-2000 Free Software Foundation, Inc.\n#\n#  This file is part of GNU libtool.\n#\n#  This program is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 2 of the License, or\n#  (at your option) any later version.\n#\n#  This program is distributed in the hope that it will be useful,\n#  but WITHOUT ANY WARRANTY; without even the implied warranty of\n#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#  GNU General Public License for more details.\n#\n#  You should have received a copy of the GNU General Public License\n#  along with this program; if not, write to the Free Software\n#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#  */\n#\n# #include <stdio.h>\t\t/* for printf() */\n# #include <unistd.h>\t\t/* for open(), lseek(), read() */\n# #include <fcntl.h>\t\t/* for O_RDONLY, O_BINARY */\n# #include <string.h>\t\t/* for strdup() */\n#\n# /* O_BINARY isn't required (or even defined sometimes) under Unix */\n# #ifndef O_BINARY\n# #define O_BINARY 0\n# #endif\n#\n# static unsigned int\n# pe_get16 (fd, offset)\n#      int fd;\n#      int offset;\n# {\n#   unsigned char b[2];\n#   lseek (fd, offset, SEEK_SET);\n#   read (fd, b, 2);\n#   return b[0] + (b[1]<<8);\n# }\n#\n# static unsigned int\n# pe_get32 (fd, offset)\n#     int fd;\n#     int offset;\n# {\n#   unsigned char b[4];\n#   lseek (fd, offset, SEEK_SET);\n#   read (fd, b, 4);\n#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);\n# }\n#\n# static unsigned int\n# pe_as32 (ptr)\n#      void *ptr;\n# {\n#   unsigned char *b = ptr;\n#   return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);\n# }\n#\n# int\n# main (argc, argv)\n#     int argc;\n#     char *argv[];\n# {\n#     int dll;\n#     unsigned long pe_header_offset, opthdr_ofs, num_entries, i;\n#     unsigned long export_rva, export_size, nsections, secptr, expptr;\n#     unsigned long name_rvas, nexp;\n#     unsigned char *expdata, *erva;\n#     char *filename, *dll_name;\n#\n#     filename = argv[1];\n#\n#     dll = open(filename, O_RDONLY|O_BINARY);\n#     if (dll < 1)\n# \treturn 1;\n#\n#     dll_name = filename;\n#\n#     for (i=0; filename[i]; i++)\n# \tif (filename[i] == '/' || filename[i] == '\\\\'  || filename[i] == ':')\n# \t    dll_name = filename + i +1;\n#\n#     pe_header_offset = pe_get32 (dll, 0x3c);\n#     opthdr_ofs = pe_header_offset + 4 + 20;\n#     num_entries = pe_get32 (dll, opthdr_ofs + 92);\n#\n#     if (num_entries < 1) /* no exports */\n# \treturn 1;\n#\n#     export_rva = pe_get32 (dll, opthdr_ofs + 96);\n#     export_size = pe_get32 (dll, opthdr_ofs + 100);\n#     nsections = pe_get16 (dll, pe_header_offset + 4 +2);\n#     secptr = (pe_header_offset + 4 + 20 +\n# \t      pe_get16 (dll, pe_header_offset + 4 + 16));\n#\n#     expptr = 0;\n#     for (i = 0; i < nsections; i++)\n#     {\n# \tchar sname[8];\n# \tunsigned long secptr1 = secptr + 40 * i;\n# \tunsigned long vaddr = pe_get32 (dll, secptr1 + 12);\n# \tunsigned long vsize = pe_get32 (dll, secptr1 + 16);\n# \tunsigned long fptr = pe_get32 (dll, secptr1 + 20);\n# \tlseek(dll, secptr1, SEEK_SET);\n# \tread(dll, sname, 8);\n# \tif (vaddr <= export_rva && vaddr+vsize > export_rva)\n# \t{\n# \t    expptr = fptr + (export_rva - vaddr);\n# \t    if (export_rva + export_size > vaddr + vsize)\n# \t\texport_size = vsize - (export_rva - vaddr);\n# \t    break;\n# \t}\n#     }\n#\n#     expdata = (unsigned char*)malloc(export_size);\n#     lseek (dll, expptr, SEEK_SET);\n#     read (dll, expdata, export_size);\n#     erva = expdata - export_rva;\n#\n#     nexp = pe_as32 (expdata+24);\n#     name_rvas = pe_as32 (expdata+32);\n#\n#     printf (\"EXPORTS\\n\");\n#     for (i = 0; i<nexp; i++)\n#     {\n# \tunsigned long name_rva = pe_as32 (erva+name_rvas+i*4);\n# \tprintf (\"\\t%s @ %ld ;\\n\", erva+name_rva, 1+ i);\n#     }\n#\n#     return 0;\n# }\n# /* impgen.c ends here */\n\nEOF\n    ;;\n  esac\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"${ofile}T\" || (rm -f \"${ofile}T\"; exit 1)\n\n  mv -f \"${ofile}T\" \"$ofile\" || \\\n    (rm -f \"$ofile\" && cp \"${ofile}T\" \"$ofile\" && rm -f \"${ofile}T\")\n  chmod +x \"$ofile\"\nfi\n##\n## END FIXME\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ac_aux_dir/ltmain.sh\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n# Prevent multiple expansion\n\n\n\n\necho $ac_n \"checking for ANSI C header files\"\"... $ac_c\" 1>&6\necho \"configure:5163: checking for ANSI C header files\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_header_stdc'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 5168 \"configure\"\n#include \"confdefs.h\"\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:5176: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  rm -rf conftest*\n  ac_cv_header_stdc=yes\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\ncat > conftest.$ac_ext <<EOF\n#line 5193 \"configure\"\n#include \"confdefs.h\"\n#include <string.h>\nEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  egrep \"memchr\" >/dev/null 2>&1; then\n  :\nelse\n  rm -rf conftest*\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\ncat > conftest.$ac_ext <<EOF\n#line 5211 \"configure\"\n#include \"confdefs.h\"\n#include <stdlib.h>\nEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  egrep \"free\" >/dev/null 2>&1; then\n  :\nelse\n  rm -rf conftest*\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\nif test \"$cross_compiling\" = yes; then\n  :\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 5232 \"configure\"\n#include \"confdefs.h\"\n#include <ctype.h>\n#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint main () { int i; for (i = 0; i < 256; i++)\nif (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);\nexit (0); }\n\nEOF\nif { (eval echo configure:5243: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null\nthen\n  :\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -fr conftest*\n  ac_cv_header_stdc=no\nfi\nrm -fr conftest*\nfi\n\nfi\nfi\n\necho \"$ac_t\"\"$ac_cv_header_stdc\" 1>&6\nif test $ac_cv_header_stdc = yes; then\n  cat >> confdefs.h <<\\EOF\n#define STDC_HEADERS 1\nEOF\n\nfi\n\nfor ac_hdr in fcntl.h unistd.h\ndo\nac_safe=`echo \"$ac_hdr\" | sed 'y%./+-%__p_%'`\necho $ac_n \"checking for $ac_hdr\"\"... $ac_c\" 1>&6\necho \"configure:5270: checking for $ac_hdr\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 5275 \"configure\"\n#include \"confdefs.h\"\n#include <$ac_hdr>\nEOF\nac_try=\"$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out\"\n{ (eval echo configure:5280: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=yes\"\nelse\n  echo \"$ac_err\" >&5\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=no\"\nfi\nrm -f conftest*\nfi\nif eval \"test \\\"`echo '$ac_cv_header_'$ac_safe`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`\n  cat >> confdefs.h <<EOF\n#define $ac_tr_hdr 1\nEOF\n \nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\ndone\n\n\necho $ac_n \"checking for working const\"\"... $ac_c\" 1>&6\necho \"configure:5308: checking for working const\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_c_const'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 5313 \"configure\"\n#include \"confdefs.h\"\n\nint main() {\n\n/* Ultrix mips cc rejects this.  */\ntypedef int charset[2]; const charset x;\n/* SunOS 4.1.1 cc rejects this.  */\nchar const *const *ccp;\nchar **p;\n/* NEC SVR4.0.2 mips cc rejects this.  */\nstruct point {int x, y;};\nstatic struct point const zero = {0,0};\n/* AIX XL C 1.02.0.0 rejects this.\n   It does not let you subtract one const X* pointer from another in an arm\n   of an if-expression whose if-part is not a constant expression */\nconst char *g = \"string\";\nccp = &g + (g ? g-g : 0);\n/* HPUX 7.0 cc rejects these. */\n++ccp;\np = (char**) ccp;\nccp = (char const *const *) p;\n{ /* SCO 3.2v4 cc rejects this.  */\n  char *t;\n  char const *s = 0 ? (char *) 0 : (char const *) 0;\n\n  *t++ = 0;\n}\n{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */\n  int x[] = {25, 17};\n  const int *foo = &x[0];\n  ++foo;\n}\n{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */\n  typedef const int *iptr;\n  iptr p = 0;\n  ++p;\n}\n{ /* AIX XL C 1.02.0.0 rejects this saying\n     \"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */\n  struct s { int j; const int *ap[3]; };\n  struct s *b; b->j = 5;\n}\n{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */\n  const int foo = 10;\n}\n\n; return 0; }\nEOF\nif { (eval echo configure:5362: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; }; then\n  rm -rf conftest*\n  ac_cv_c_const=yes\nelse\n  echo \"configure: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  ac_cv_c_const=no\nfi\nrm -f conftest*\nfi\n\necho \"$ac_t\"\"$ac_cv_c_const\" 1>&6\nif test $ac_cv_c_const = no; then\n  cat >> confdefs.h <<\\EOF\n#define const \nEOF\n\nfi\n\necho $ac_n \"checking for size_t\"\"... $ac_c\" 1>&6\necho \"configure:5383: checking for size_t\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_type_size_t'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 5388 \"configure\"\n#include \"confdefs.h\"\n#include <sys/types.h>\n#if STDC_HEADERS\n#include <stdlib.h>\n#include <stddef.h>\n#endif\nEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  egrep \"(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]\" >/dev/null 2>&1; then\n  rm -rf conftest*\n  ac_cv_type_size_t=yes\nelse\n  rm -rf conftest*\n  ac_cv_type_size_t=no\nfi\nrm -f conftest*\n\nfi\necho \"$ac_t\"\"$ac_cv_type_size_t\" 1>&6\nif test $ac_cv_type_size_t = no; then\n  cat >> confdefs.h <<\\EOF\n#define size_t unsigned\nEOF\n\nfi\n\n\n\nLIBTOOL=./libtool\nLIBSUFFIX=la\n# Check whether --enable-shared or --disable-shared was given.\nif test \"${enable_shared+set}\" = set; then\n  enableval=\"$enable_shared\"\n  if test \"$enableval\" = \"no\"; then\n  LIBTOOL=\n  LIBSUFFIX=a\nfi\n\nfi\n\n\n# JK: as the install/uninstall stuff is not yet ready, I am forcing the\n# unshared lib by default\nLIBTOOL=\nLIBSUFFIX=a\n\n\n\n\n\n\n\n\n\n\n\n\ntrap '' 1 2 15\ncat > confcache <<\\EOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs.  It is not useful on other systems.\n# If it contains results you don't want to keep, you may remove or edit it.\n#\n# By default, configure uses ./config.cache as the cache file,\n# creating it if it does not exist already.  You can give configure\n# the --cache-file=FILE option to use a different cache file; that is\n# what configure does when it calls configure scripts in\n# subdirectories, so they share the cache.\n# Giving --cache-file=/dev/null disables caching, for debugging configure.\n# config.status only pays attention to the cache file if you give it the\n# --recheck option to rerun configure.\n#\nEOF\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, don't put newlines in cache variables' values.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(set) 2>&1 |\n  case `(ac_space=' '; set | grep ac_space) 2>&1` in\n  *ac_space=\\ *)\n    # `set' does not quote correctly, so add quotes (double-quote substitution\n    # turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\).\n    sed -n \\\n      -e \"s/'/'\\\\\\\\''/g\" \\\n      -e \"s/^\\\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\\\)=\\\\(.*\\\\)/\\\\1=\\${\\\\1='\\\\2'}/p\"\n    ;;\n  *)\n    # `set' quotes correctly as required by POSIX, so do not add quotes.\n    sed -n -e 's/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=${\\1=\\2}/p'\n    ;;\n  esac >> confcache\nif cmp -s $cache_file confcache; then\n  :\nelse\n  if test -w $cache_file; then\n    echo \"updating cache $cache_file\"\n    cat confcache > $cache_file\n  else\n    echo \"not updating unwritable cache $cache_file\"\n  fi\nfi\nrm -f confcache\n\ntrap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# Any assignment to VPATH causes Sun make to only execute\n# the first set of double-colon rules, so remove it if not needed.\n# If there is a colon in the path, we need to keep it.\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[ \t]*VPATH[ \t]*=[^:]*$/d'\nfi\n\ntrap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15\n\nDEFS=-DHAVE_CONFIG_H\n\n# Without the \"./\", some shells look in PATH for config.status.\n: ${CONFIG_STATUS=./config.status}\n\necho creating $CONFIG_STATUS\nrm -f $CONFIG_STATUS\ncat > $CONFIG_STATUS <<EOF\n#! /bin/sh\n# Generated automatically by configure.\n# Run this file to recreate the current configuration.\n# This directory was configured as follows,\n# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n#\n# $0 $ac_configure_args\n#\n# Compiler output produced by configure, useful for debugging\n# configure, is in ./config.log if it exists.\n\nac_cs_usage=\"Usage: $CONFIG_STATUS [--recheck] [--version] [--help]\"\nfor ac_option\ndo\n  case \"\\$ac_option\" in\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    echo \"running \\${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion\"\n    exec \\${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;\n  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)\n    echo \"$CONFIG_STATUS generated by autoconf version 2.13\"\n    exit 0 ;;\n  -help | --help | --hel | --he | --h)\n    echo \"\\$ac_cs_usage\"; exit 0 ;;\n  *) echo \"\\$ac_cs_usage\"; exit 1 ;;\n  esac\ndone\n\nac_given_srcdir=$srcdir\nac_given_INSTALL=\"$INSTALL\"\n\ntrap 'rm -fr `echo \"Makefile config.h:config.in\" | sed \"s/:[^ ]*//g\"` conftest*; exit 1' 1 2 15\nEOF\ncat >> $CONFIG_STATUS <<EOF\n\n# Protect against being on the right side of a sed subst in config.status.\nsed 's/%@/@@/; s/@%/@@/; s/%g\\$/@g/; /@g\\$/s/[\\\\\\\\&%]/\\\\\\\\&/g;\n s/@@/%@/; s/@@/@%/; s/@g\\$/%g/' > conftest.subs <<\\\\CEOF\n$ac_vpsub\n$extrasub\ns%@SHELL@%$SHELL%g\ns%@CFLAGS@%$CFLAGS%g\ns%@CPPFLAGS@%$CPPFLAGS%g\ns%@CXXFLAGS@%$CXXFLAGS%g\ns%@FFLAGS@%$FFLAGS%g\ns%@DEFS@%$DEFS%g\ns%@LDFLAGS@%$LDFLAGS%g\ns%@LIBS@%$LIBS%g\ns%@exec_prefix@%$exec_prefix%g\ns%@prefix@%$prefix%g\ns%@program_transform_name@%$program_transform_name%g\ns%@bindir@%$bindir%g\ns%@sbindir@%$sbindir%g\ns%@libexecdir@%$libexecdir%g\ns%@datadir@%$datadir%g\ns%@sysconfdir@%$sysconfdir%g\ns%@sharedstatedir@%$sharedstatedir%g\ns%@localstatedir@%$localstatedir%g\ns%@libdir@%$libdir%g\ns%@includedir@%$includedir%g\ns%@oldincludedir@%$oldincludedir%g\ns%@infodir@%$infodir%g\ns%@mandir@%$mandir%g\ns%@CC@%$CC%g\ns%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g\ns%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g\ns%@INSTALL_DATA@%$INSTALL_DATA%g\ns%@LN_S@%$LN_S%g\ns%@host@%$host%g\ns%@host_alias@%$host_alias%g\ns%@host_cpu@%$host_cpu%g\ns%@host_vendor@%$host_vendor%g\ns%@host_os@%$host_os%g\ns%@build@%$build%g\ns%@build_alias@%$build_alias%g\ns%@build_cpu@%$build_cpu%g\ns%@build_vendor@%$build_vendor%g\ns%@build_os@%$build_os%g\ns%@OBJEXT@%$OBJEXT%g\ns%@EXEEXT@%$EXEEXT%g\ns%@ECHO@%$ECHO%g\ns%@RANLIB@%$RANLIB%g\ns%@STRIP@%$STRIP%g\ns%@CPP@%$CPP%g\ns%@LIBTOOL@%$LIBTOOL%g\ns%@LIBSUFFIX@%$LIBSUFFIX%g\ns%@FNV_MAJOR@%$FNV_MAJOR%g\ns%@FNV_MINOR@%$FNV_MINOR%g\ns%@FNV_DATE@%$FNV_DATE%g\ns%@FNV_VERSION@%$FNV_VERSION%g\ns%@FNV_LIB_VERSION@%$FNV_LIB_VERSION%g\n\nCEOF\nEOF\n\ncat >> $CONFIG_STATUS <<\\EOF\n\n# Split the substitutions into bite-sized pieces for seds with\n# small command number limits, like on Digital OSF/1 and HP-UX.\nac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.\nac_file=1 # Number of current file.\nac_beg=1 # First line for current file.\nac_end=$ac_max_sed_cmds # Line after last line for current file.\nac_more_lines=:\nac_sed_cmds=\"\"\nwhile $ac_more_lines; do\n  if test $ac_beg -gt 1; then\n    sed \"1,${ac_beg}d; ${ac_end}q\" conftest.subs > conftest.s$ac_file\n  else\n    sed \"${ac_end}q\" conftest.subs > conftest.s$ac_file\n  fi\n  if test ! -s conftest.s$ac_file; then\n    ac_more_lines=false\n    rm -f conftest.s$ac_file\n  else\n    if test -z \"$ac_sed_cmds\"; then\n      ac_sed_cmds=\"sed -f conftest.s$ac_file\"\n    else\n      ac_sed_cmds=\"$ac_sed_cmds | sed -f conftest.s$ac_file\"\n    fi\n    ac_file=`expr $ac_file + 1`\n    ac_beg=$ac_end\n    ac_end=`expr $ac_end + $ac_max_sed_cmds`\n  fi\ndone\nif test -z \"$ac_sed_cmds\"; then\n  ac_sed_cmds=cat\nfi\nEOF\n\ncat >> $CONFIG_STATUS <<EOF\n\nCONFIG_FILES=\\${CONFIG_FILES-\"Makefile\"}\nEOF\ncat >> $CONFIG_STATUS <<\\EOF\nfor ac_file in .. $CONFIG_FILES; do if test \"x$ac_file\" != x..; then\n  # Support \"outfile[:infile[:infile...]]\", defaulting infile=\"outfile.in\".\n  case \"$ac_file\" in\n  *:*) ac_file_in=`echo \"$ac_file\"|sed 's%[^:]*:%%'`\n       ac_file=`echo \"$ac_file\"|sed 's%:.*%%'` ;;\n  *) ac_file_in=\"${ac_file}.in\" ;;\n  esac\n\n  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.\n\n  # Remove last slash and all that follows it.  Not all systems have dirname.\n  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`\n  if test \"$ac_dir\" != \"$ac_file\" && test \"$ac_dir\" != .; then\n    # The file is in a subdirectory.\n    test ! -d \"$ac_dir\" && mkdir \"$ac_dir\"\n    ac_dir_suffix=\"/`echo $ac_dir|sed 's%^\\./%%'`\"\n    # A \"../\" for each directory in $ac_dir_suffix.\n    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`\n  else\n    ac_dir_suffix= ac_dots=\n  fi\n\n  case \"$ac_given_srcdir\" in\n  .)  srcdir=.\n      if test -z \"$ac_dots\"; then top_srcdir=.\n      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;\n  /*) srcdir=\"$ac_given_srcdir$ac_dir_suffix\"; top_srcdir=\"$ac_given_srcdir\" ;;\n  *) # Relative path.\n    srcdir=\"$ac_dots$ac_given_srcdir$ac_dir_suffix\"\n    top_srcdir=\"$ac_dots$ac_given_srcdir\" ;;\n  esac\n\n  case \"$ac_given_INSTALL\" in\n  [/$]*) INSTALL=\"$ac_given_INSTALL\" ;;\n  *) INSTALL=\"$ac_dots$ac_given_INSTALL\" ;;\n  esac\n\n  echo creating \"$ac_file\"\n  rm -f \"$ac_file\"\n  configure_input=\"Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure.\"\n  case \"$ac_file\" in\n  *Makefile*) ac_comsub=\"1i\\\\\n# $configure_input\" ;;\n  *) ac_comsub= ;;\n  esac\n\n  ac_file_inputs=`echo $ac_file_in|sed -e \"s%^%$ac_given_srcdir/%\" -e \"s%:% $ac_given_srcdir/%g\"`\n  sed -e \"$ac_comsub\ns%@configure_input@%$configure_input%g\ns%@srcdir@%$srcdir%g\ns%@top_srcdir@%$top_srcdir%g\ns%@INSTALL@%$INSTALL%g\n\" $ac_file_inputs | (eval \"$ac_sed_cmds\") > $ac_file\nfi; done\nrm -f conftest.s*\n\n# These sed commands are passed to sed as \"A NAME B NAME C VALUE D\", where\n# NAME is the cpp macro being defined and VALUE is the value it is being given.\n#\n# ac_d sets the value in \"#define NAME VALUE\" lines.\nac_dA='s%^\\([ \t]*\\)#\\([ \t]*define[ \t][ \t]*\\)'\nac_dB='\\([ \t][ \t]*\\)[^ \t]*%\\1#\\2'\nac_dC='\\3'\nac_dD='%g'\n# ac_u turns \"#undef NAME\" with trailing blanks into \"#define NAME VALUE\".\nac_uA='s%^\\([ \t]*\\)#\\([ \t]*\\)undef\\([ \t][ \t]*\\)'\nac_uB='\\([ \t]\\)%\\1#\\2define\\3'\nac_uC=' '\nac_uD='\\4%g'\n# ac_e turns \"#undef NAME\" without trailing blanks into \"#define NAME VALUE\".\nac_eA='s%^\\([ \t]*\\)#\\([ \t]*\\)undef\\([ \t][ \t]*\\)'\nac_eB='$%\\1#\\2define\\3'\nac_eC=' '\nac_eD='%g'\n\nif test \"${CONFIG_HEADERS+set}\" != set; then\nEOF\ncat >> $CONFIG_STATUS <<EOF\n  CONFIG_HEADERS=\"config.h:config.in\"\nEOF\ncat >> $CONFIG_STATUS <<\\EOF\nfi\nfor ac_file in .. $CONFIG_HEADERS; do if test \"x$ac_file\" != x..; then\n  # Support \"outfile[:infile[:infile...]]\", defaulting infile=\"outfile.in\".\n  case \"$ac_file\" in\n  *:*) ac_file_in=`echo \"$ac_file\"|sed 's%[^:]*:%%'`\n       ac_file=`echo \"$ac_file\"|sed 's%:.*%%'` ;;\n  *) ac_file_in=\"${ac_file}.in\" ;;\n  esac\n\n  echo creating $ac_file\n\n  rm -f conftest.frag conftest.in conftest.out\n  ac_file_inputs=`echo $ac_file_in|sed -e \"s%^%$ac_given_srcdir/%\" -e \"s%:% $ac_given_srcdir/%g\"`\n  cat $ac_file_inputs > conftest.in\n\nEOF\n\n# Transform confdefs.h into a sed script conftest.vals that substitutes\n# the proper values into config.h.in to produce config.h.  And first:\n# Protect against being on the right side of a sed subst in config.status.\n# Protect against being in an unquoted here document in config.status.\nrm -f conftest.vals\ncat > conftest.hdr <<\\EOF\ns/[\\\\&%]/\\\\&/g\ns%[\\\\$`]%\\\\&%g\ns%#define \\([A-Za-z_][A-Za-z0-9_]*\\) *\\(.*\\)%${ac_dA}\\1${ac_dB}\\1${ac_dC}\\2${ac_dD}%gp\ns%ac_d%ac_u%gp\ns%ac_u%ac_e%gp\nEOF\nsed -n -f conftest.hdr confdefs.h > conftest.vals\nrm -f conftest.hdr\n\n# This sed command replaces #undef with comments.  This is necessary, for\n# example, in the case of _POSIX_SOURCE, which is predefined and required\n# on some systems where configure will not decide to define it.\ncat >> conftest.vals <<\\EOF\ns%^[ \t]*#[ \t]*undef[ \t][ \t]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%\nEOF\n\n# Break up conftest.vals because some shells have a limit on\n# the size of here documents, and old seds have small limits too.\n\nrm -f conftest.tail\nwhile :\ndo\n  ac_lines=`grep -c . conftest.vals`\n  # grep -c gives empty output for an empty file on some AIX systems.\n  if test -z \"$ac_lines\" || test \"$ac_lines\" -eq 0; then break; fi\n  # Write a limited-size here document to conftest.frag.\n  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS\n  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS\n  echo 'CEOF\n  sed -f conftest.frag conftest.in > conftest.out\n  rm -f conftest.in\n  mv conftest.out conftest.in\n' >> $CONFIG_STATUS\n  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail\n  rm -f conftest.vals\n  mv conftest.tail conftest.vals\ndone\nrm -f conftest.vals\n\ncat >> $CONFIG_STATUS <<\\EOF\n  rm -f conftest.frag conftest.h\n  echo \"/* $ac_file.  Generated automatically by configure.  */\" > conftest.h\n  cat conftest.in >> conftest.h\n  rm -f conftest.in\n  if cmp -s $ac_file conftest.h 2>/dev/null; then\n    echo \"$ac_file is unchanged\"\n    rm -f conftest.h\n  else\n    # Remove last slash and all that follows it.  Not all systems have dirname.\n      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`\n      if test \"$ac_dir\" != \"$ac_file\" && test \"$ac_dir\" != .; then\n      # The file is in a subdirectory.\n      test ! -d \"$ac_dir\" && mkdir \"$ac_dir\"\n    fi\n    rm -f $ac_file\n    mv conftest.h $ac_file\n  fi\nfi; done\n\nEOF\ncat >> $CONFIG_STATUS <<EOF\n\nEOF\ncat >> $CONFIG_STATUS <<\\EOF\n\nexit 0\nEOF\nchmod +x $CONFIG_STATUS\nrm -fr confdefs* $ac_clean_files\ntest \"$no_create\" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1\n\n"
  },
  {
    "path": "src/fnv/configure.in",
    "content": "dnl Process this file with autoconf to produce a configure script.\nAC_INIT(fnv.h)\n\ndnl Arrange to build config.h from config.in.\ndnl Manual says this macro should come right after AC_INIT.\nAC_CONFIG_HEADER(config.h:config.in)\n\ndnl Provide the current FNV version information. Do not use numbers\ndnl with leading zeros for the minor version, as they end up in a C\ndnl macro, and may be treated as octal constants. Stick to single\ndnl digits for minor numbers less than 10. There are unlikely to be\ndnl that many releases anyway. \ndnl JK: As there was no such release number, I gave it 1.0 and the\ndnl date of last commit of the Makefile\n\nFNV_MAJOR=1\nFNV_MINOR=0\nFNV_DATE=09-Sep-2002\nFNV_VERSION=${FNV_MAJOR}.${FNV_MINOR}\n\ndnl Provide versioning information for libtool shared libraries that\ndnl are built by default on Unix systems.\n\nFNV_LIB_VERSION=0:1:0\n\ndnl Checks for programs.\nAC_PROG_CC\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_LIBTOOL\n\ndnl Checks for libraries.\n\ndnl Checks for header files.\nAC_HEADER_STDC\nAC_CHECK_HEADERS(fcntl.h unistd.h)\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_TYPE_SIZE_T\n\ndnl Handle --enable-shared-libraries\n\nLIBTOOL=./libtool\nLIBSUFFIX=la\nAC_ARG_ENABLE(shared,\n[  --enable-shared         build FNV as a shared library],\nif test \"$enableval\" = \"no\"; then\n  LIBTOOL=\n  LIBSUFFIX=a\nfi\n)\n\n# JK: as the install/uninstall stuff is not yet ready, I am forcing the\n# unshared lib by default\nLIBTOOL=\nLIBSUFFIX=a\n\n\ndnl Checks for library functions.\n\ndnl \"Export\" these variables\n\nAC_SUBST(LIBTOOL)\nAC_SUBST(LIBSUFFIX)\nAC_SUBST(FNV_MAJOR)\nAC_SUBST(FNV_MINOR)\nAC_SUBST(FNV_DATE)\nAC_SUBST(FNV_VERSION)\nAC_SUBST(FNV_LIB_VERSION)\n\nAC_OUTPUT(Makefile)\n"
  },
  {
    "path": "src/fnv/configure.scan",
    "content": "dnl Process this file with autoconf to produce a configure script.\nAC_INIT(fnv.h)\n\ndnl Checks for programs.\nAC_PROG_CC\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_RANLIB\n\ndnl Checks for libraries.\n\ndnl Checks for header files.\nAC_HEADER_STDC\nAC_CHECK_HEADERS(fcntl.h unistd.h)\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_TYPE_SIZE_T\n\ndnl Checks for library functions.\n\nAC_OUTPUT(Makefile)\n"
  },
  {
    "path": "src/fnv/fnv.h",
    "content": "/*\n * fnv - Fowler/Noll/Vo- hash code\n *\n * @(#) $Revision$\n * @(#) $Id$\n * @(#) $Source$\n *\n ***\n *\n * Fowler/Noll/Vo- hash\n *\n * The basis of this hash algorithm was taken from an idea sent\n * as reviewer comments to the IEEE POSIX P1003.2 committee by:\n *\n *      Phong Vo (http://www.research.att.com/info/kpv/)\n *      Glenn Fowler (http://www.research.att.com/~gsf/)\n *\n * In a subsequent ballot round:\n *\n *      Landon Curt Noll (http://www.isthe.com/chongo/)\n *\n * improved on their algorithm.  Some people tried this hash\n * and found that it worked rather well.  In an EMail message\n * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n *\n * FNV hashes are designed to be fast while maintaining a low\n * collision rate. The FNV speed allows one to quickly hash lots\n * of data while maintaining a reasonable collision rate.  See:\n *\n *      http://www.isthe.com/chongo/tech/comp/fnv/index.html\n *\n * for more details as well as other forms of the FNV hash.\n *\n ***\n *\n * NOTE: The FNV-0 historic hash is not recommended.  One should use\n *\t the FNV-1 hash instead.\n *\n * To use the 32 bit FNV-0 historic hash, pass FNV0_32_INIT as the\n * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().\n *\n * To use the 64 bit FNV-0 historic hash, pass FNV0_64_INIT as the\n * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().\n *\n * To use the recommended 32 bit FNV-1 hash, pass FNV1_32_INIT as the\n * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().\n *\n * To use the recommended 64 bit FNV-1 hash, pass FNV1_64_INIT as the\n * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().\n *\n ***\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n#if !defined(__FNV_H__)\n#define __FNV_H__\n\n#include \"config.h\"\n\n/*\n * 32 bit FNV-0 hash type\n */\ntypedef unsigned long Fnv32_t;\n\n\n/*\n * 32 bit FNV-0 zero initial basis\n *\n * This historic hash is not recommended.  One should use\n * the FNV-1 hash and initial basis instead.\n */\n#define FNV0_32_INIT ((Fnv32_t)0)\n\n\n/*\n * 32 bit FNV-1 non-zero initial basis\n *\n * The FNV-1 initial basis is the FNV-0 hash of the following 32 octets:\n *\n *              chongo <Landon Curt Noll> /\\../\\\n *\n * Note that the \\'s above are not back-slashing escape characters.\n * They are literal ASCII  backslash 0x5c characters.\n */\n#define FNV1_32_INIT ((Fnv32_t)0x811c9dc5)\n\n\n/*\n * determine how 64 bit unsigned values are represented\n */\n#include \"longlong.h\"\n\n\n/*\n * 64 bit FNV-0 hash\n */\n#if defined(HAVE_64BIT_LONG_LONG)\ntypedef unsigned long long Fnv64_t;\n#else\ntypedef struct {\n    unsigned long w32[2];\n} Fnv64_t;\n#endif\n\n\n/*\n * 64 bit FNV-0 zero initial basis\n *\n * This historic hash is not recommended.  One should use\n * the FNV-1 hash and initial basis instead.\n */\n#if defined(HAVE_64BIT_LONG_LONG)\n#define FNV0_64_INIT ((Fnv64_t)0)\n#else\nextern const Fnv64_t fnv1_64_init;\n#define FNV0_64_INIT (fnv1_64_init)\n#endif\n\n\n/*\n * 64 bit FNV-1 non-zero initial basis\n *\n * The FNV-1 initial basis is the FNV-0 hash of the following 32 octets:\n *\n *              chongo <Landon Curt Noll> /\\../\\\n *\n * Note that the \\'s above are not back-slashing escape characters.\n * They are literal ASCII  backslash 0x5c characters.\n */\n#if defined(HAVE_64BIT_LONG_LONG)\n#define FNV1_64_INIT ((Fnv64_t)0xcbf29ce484222325ULL)\n#else\nextern const Fnv64_t fnv1_64_init;\n#define FNV1_64_INIT (fnv1_64_init)\n#endif\n\n\n/*\n * external functions\n */\nextern Fnv32_t fnv_32_buf(void *buf, size_t len, Fnv32_t hashval);\nextern Fnv32_t fnv_32_str(char *buf, Fnv32_t hashval);\nextern Fnv64_t fnv_64_buf(void *buf, size_t len, Fnv64_t hashval);\nextern Fnv64_t fnv_64_str(char *buf, Fnv64_t hashval);\n\n\n#endif /* __FNV_H__ */\n"
  },
  {
    "path": "src/fnv/fnv32.c",
    "content": "/*\n * fnv32 - 32 bit Fowler/Noll/Vo hash of a buffer or string\n *\n * @(#) $Revision$\n * @(#) $Id$\n * @(#) $Source$\n *\n ***\n *\n * usage:\n *\tfnv032 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\tfnv0_32 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\n *\tfnv132 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\tfnv1_32 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\n *\t-b bcnt\t  mask off all but the lower bcnt bits (default 32)\n *\t-m\t  multiple hashes, one per line for each arg\n *\t-s\t  hash arg as a string (ignoring terminating NUL bytes)\n *\t-v\t  verbose mode, print arg after hash (implies -m)\n *\targ\t  string (if -s was given) or filename (default stdin)\n *\n * The fnv032 and fnv0_32 basenames perform the 32 bit FNV-0 historic hash.\n * The fnv132 and fnv1_32 basenames perform the 32 bit recommended FNV-1 hash.\n *\n * NOTE: The FNV-0 historic hash is not recommended.\n *\t One should use the FNV-1 hash instead.\n *\n ***\n *\n * Fowler/Noll/Vo hash\n *\n * The basis of this hash algorithm was taken from an idea sent\n * as reviewer comments to the IEEE POSIX P1003.2 committee by:\n *\n *      Phong Vo (http://www.research.att.com/info/kpv/)\n *      Glenn Fowler (http://www.research.att.com/~gsf/)\n *\n * In a subsequent ballot round:\n *\n *      Landon Curt Noll (http://www.isthe.com/chongo/)\n *\n * improved on their algorithm.  Some people tried this hash\n * and found that it worked rather well.  In an EMail message\n * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n *\n * FNV hashes are designed to be fast while maintaining a low\n * collision rate. The FNV speed allows one to quickly hash lots\n * of data while maintaining a reasonable collision rate.  See:\n *\n *      http://www.isthe.com/chongo/tech/comp/fnv/index.html\n *\n * for more details as well as other forms of the FNV hash.\n *\n ***\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <string.h>\n#include \"fnv.h\"\n\n#ifdef HAVE_FCNTL_H\n#include <fcntl.h>\n#endif\n\n#define WIDTH 32\t/* bit width of hash */\n\n#define BUF_SIZE (32*1024)\t/* number of bytes to hash at a time */\n\nstatic char *usage = \"usage: %s [-b bcnt] [-m [-v]] [-s arg] [arg ...]\\n\";\nstatic char *program;\t/* our name */\n\n\n/*\n * print_fnv - print an FNV hash\n *\n * given:\n *\thval\t  the hash value to print\n *\tmask\t  lower bit mask\n *\tverbose\t  1 => print arg with hash\n *\targ\t  string or filename arg\n */\nstatic void\nprint_fnv(Fnv32_t hval, Fnv32_t mask, int verbose, char *arg)\n{\n    if (verbose) {\n\tprintf(\"0x%08lx %s\\n\", hval & mask, arg);\n    } else {\n\tprintf(\"0x%08lx\\n\", hval & mask);\n    }\n}\n\n\n/*\n * main - the main function\n *\n * See the above usage for details.\n */\nint\nmain(int argc, char *argv[])\n{\n    char buf[BUF_SIZE+1];\t/* read buffer */\n    int readcnt;\t\t/* number of characters written */\n    Fnv32_t hval;\t\t/* current hash value */\n    int s_flag = 0;\t\t/* 1 => -s was given, hash args as strings */\n    int m_flag = 0;\t\t/* 1 => print multiple hashes, one per arg */\n    int v_flag = 0;\t\t/* 1 => verbose hash print */\n    int b_flag = WIDTH;\t\t/* -b flag value */\n    Fnv32_t bmask;\t\t/* mask to apply to output */\n    extern char *optarg;\t/* option argument */\n    extern int optind;\t\t/* argv index of the next arg */\n    int fd;\t\t\t/* open file to process */\n    char *p;\n    int i;\n\n    /*\n     * parse args\n     */\n    program = argv[0];\n    while ((i = getopt(argc, argv, \"b:msv\")) != -1) {\n\tswitch (i) {\n\tcase 'b':\t/* bcnt bit mask count */\n\t    b_flag = atoi(optarg);\n\t    break;\n\tcase 'm':\t/* print multiple hashes, one per arg */\n\t    m_flag = 1;\n\t    break;\n\tcase 's':\t/* hash args as strings */\n\t    s_flag = 1;\n\t    break;\n\tcase 'v':\t/* verbose hash print */\n\t    m_flag = 1;\n\t    v_flag = 1;\n\t    break;\n\tdefault:\n\t    fprintf(stderr, usage, program);\n\t    exit(1);\n\t}\n    }\n    /* -s requires at least 1 arg */\n    if (s_flag && optind >= argc) {\n\tfprintf(stderr, usage, program);\n\texit(2);\n    }\n    /* limit -b values */\n    if (b_flag < 0 || b_flag > WIDTH) {\n\tfprintf(stderr, \"%s: -b bcnt: %d must be >= 0 and < %d\\n\",\n\t\tprogram, b_flag, WIDTH);\n\texit(3);\n    }\n    if (b_flag == WIDTH) {\n\tbmask = (Fnv32_t)0xffffffff;\n    } else {\n\tbmask = (Fnv32_t)((1 << b_flag) - 1);\n    }\n\n    /*\n     * start with the initial basis depending on the hash type\n     */\n    p = strrchr(program, '/');\n    if (p == NULL) {\n\tp = program;\n    } else {\n\t++p;\n    }\n    if (strcmp(p, \"fnv0_32\") == 0 || strcmp(p, \"fnv032\") == 0) {\n\t/* using non-recommended FNV-0 and zero initial basis */\n\thval = FNV0_32_INIT;\n    } else {\n\t/* using recommended FNV-1 and non-zero initial basis */\n\thval = FNV1_32_INIT;\n    }\n\n    /*\n     * string hashing\n     */\n    if (s_flag) {\n\n\t/* hash any other strings */\n\tfor (i=optind; i < argc; ++i) {\n\t    hval = fnv_32_str(argv[i], hval);\n\t    if (m_flag) {\n\t\tprint_fnv(hval, bmask, v_flag, argv[i]);\n\t    }\n\t}\n\n\n    /*\n     * file hashing\n     */\n    } else {\n\n\t/*\n\t * case: process only stdin\n\t */\n\tif (optind >= argc) {\n\n\t    /* case: process only stdin */\n\t    while ((readcnt = read(0, buf, BUF_SIZE)) > 0) {\n\t\thval = fnv_32_buf(buf, readcnt, hval);\n\t    }\n\t    if (m_flag) {\n\t\tprint_fnv(hval, bmask, v_flag, \"(stdin)\");\n\t    }\n\n\t} else {\n\n\t    /*\n\t     * process any other files\n\t     */\n\t    for (i=optind; i < argc; ++i) {\n\n\t\t/* open the file */\n\t\tfd = open(argv[i], O_RDONLY);\n\t\tif (fd < 0) {\n\t\t    fprintf(stderr, \"%s: unable to open file: %s\\n\",\n\t\t\t    program, argv[i]);\n\t\t    exit(4);\n\t\t}\n\n\t\t/*  hash the file */\n\t\twhile ((readcnt = read(fd, buf, BUF_SIZE)) > 0) {\n\t\t    hval = fnv_32_buf(buf, readcnt, hval);\n\t\t}\n\n\t\t/* finish processing the file */\n\t\tif (m_flag) {\n\t\t    print_fnv(hval, bmask, v_flag, argv[i]);\n\t\t}\n\t\tclose(fd);\n\t    }\n\t}\n    }\n\n    /*\n     * report hash and exit\n     */\n    if (!m_flag) {\n\tprint_fnv(hval, bmask, v_flag, \"\");\n    }\n    return 0;\t/* exit(0); */\n}\n"
  },
  {
    "path": "src/fnv/fnv64.c",
    "content": "/*\n * fnv_64 - 64 bit Fowler/Noll/Vo hash of a buffer or string\n *\n * @(#) $Revision$\n * @(#) $Id$\n * @(#) $Source$\n *\n ***\n *\n * usage:\n *\tfnv064 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\tfnv0_64 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\n *\tfnv164 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\tfnv1_64 [-b bcnt] [-m [-v]] [-s arg] [arg ...]\n *\n *\t-b bcnt\t  mask off all but the lower bcnt bits (default: 64)\n *\t-m\t  multiple hashes, one per line for each arg\n *\t-s\t  hash arg as a string (ignoring terminating NUL bytes)\n *\t-v\t  verbose mode, print arg after hash (implies -m)\n *\targ\t  string (if -s was given) or filename (default stdin)\n *\n * The fnv064 and fnv0_64 basenames perform the 64 bit FNV-0 historic hash.\n * The fnv164 and fnv1_64 basenames perform the 64 bit recommended FNV-1 hash.\n *\n * NOTE: The FNV-0 historic hash is not recommended.\n *\t One should use the FNV-1 hash instead.\n *\n ***\n *\n * Fowler/Noll/Vo hash\n *\n * The basis of this hash algorithm was taken from an idea sent\n * as reviewer comments to the IEEE POSIX P1003.2 committee by:\n *\n *      Phong Vo (http://www.research.att.com/info/kpv/)\n *      Glenn Fowler (http://www.research.att.com/~gsf/)\n *\n * In a subsequent ballot round:\n *\n *      Landon Curt Noll (http://www.isthe.com/chongo/)\n *\n * improved on their algorithm.  Some people tried this hash\n * and found that it worked rather well.  In an EMail message\n * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n *\n * FNV hashes are designed to be fast while maintaining a low\n * collision rate. The FNV speed allows one to quickly hash lots\n * of data while maintaining a reasonable collision rate.  See:\n *\n *      http://www.isthe.com/chongo/tech/comp/fnv/index.html\n *\n * for more details as well as other forms of the FNV hash.\n *\n ***\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <string.h>\n#include \"fnv.h\"\n#include \"longlong.h\"\n\n#ifdef HAVE_FCNTL_H\n#include <fcntl.h>\n#endif\n\n#define WIDTH 64\t/* bit width of hash */\n\n#define BUF_SIZE (32*1024)\t/* number of bytes to hash at a time */\n\nstatic char *usage = \"usage: %s [-b bcnt] [-m [-v]] [-s arg] [arg ...]\\n\";\nstatic char *program;\t/* our name */\n\n\n/*\n * print_fnv - print an FNV hash\n *\n * given:\n *\thval\t  the hash value to print\n *\tmask\t  lower bit mask\n *\tverbose\t  1 => print arg with hash\n *\targ\t  string or filename arg\n */\nstatic void\nprint_fnv(Fnv64_t hval, Fnv64_t mask, int verbose, char *arg)\n{\n#if defined(HAVE_64BIT_LONG_LONG)\n    if (verbose) {\n\tprintf(\"0x%016llx %s\\n\", hval & mask, arg);\n    } else {\n\tprintf(\"0x%016llx\\n\", hval & mask);\n    }\n#else\n    if (verbose) {\n\tprintf(\"0x%08lx%08lx %s\\n\",\n\t       hval.w32[1] & mask.w32[1],\n\t       hval.w32[0] & mask.w32[0],\n\t       arg);\n    } else {\n\tprintf(\"0x%08lx%08lx\\n\",\n\t       hval.w32[1] & mask.w32[1],\n\t       hval.w32[0] & mask.w32[0]);\n    }\n#endif\n}\n\n\n/*\n * main - the main function\n *\n * See the above usage for details.\n */\nint\nmain(int argc, char *argv[])\n{\n    char buf[BUF_SIZE+1];\t/* read buffer */\n    int readcnt;\t\t/* number of characters written */\n    Fnv64_t hval;\t\t/* current hash value */\n    int s_flag = 0;\t\t/* 1 => -s was given, hash args as strings */\n    int m_flag = 0;\t\t/* 1 => print multiple hashes, one per arg */\n    int v_flag = 0;\t\t/* 1 => verbose hash print */\n    int b_flag = WIDTH;\t\t/* -b flag value */\n    Fnv64_t bmask;\t\t/* mask to apply to output */\n    extern char *optarg;\t/* option argument */\n    extern int optind;\t\t/* argv index of the next arg */\n    int fd;\t\t\t/* open file to process */\n    char *p;\n    int i;\n\n    /*\n     * parse args\n     */\n    program = argv[0];\n    while ((i = getopt(argc, argv, \"b:msv\")) != -1) {\n\tswitch (i) {\n\tcase 'b':\t/* bcnt bit mask count */\n\t    b_flag = atoi(optarg);\n\t    break;\n\tcase 'm':\t/* print multiple hashes, one per arg */\n\t    m_flag = 1;\n\t    break;\n\tcase 's':\t/* hash args as strings */\n\t    s_flag = 1;\n\t    break;\n\tcase 'v':\t/* verbose hash print */\n\t    m_flag = 1;\n\t    v_flag = 1;\n\t    break;\n\tdefault:\n\t    fprintf(stderr, usage, program);\n\t    exit(1);\n\t}\n    }\n    /* -s requires at least 1 arg */\n    if (s_flag && optind >= argc) {\n\tfprintf(stderr, usage, program);\n\texit(2);\n    }\n    /* limit -b values */\n    if (b_flag < 0 || b_flag > WIDTH) {\n\tfprintf(stderr, \"%s: -b bcnt: %d must be >= 0 and < %d\\n\",\n\t\tprogram, b_flag, WIDTH);\n\texit(3);\n    }\n#if defined(HAVE_64BIT_LONG_LONG)\n    if (b_flag == WIDTH) {\n\tbmask = (Fnv64_t)0xffffffffffffffffULL;\n    } else {\n\tbmask = (Fnv64_t)((1ULL << b_flag) - 1ULL);\n    }\n#else\n    if (b_flag == WIDTH) {\n\tbmask.w32[0] = 0xffffffffUL;\n\tbmask.w32[1] = 0xffffffffUL;\n    } else if (b_flag >= WIDTH/2) {\n\tbmask.w32[0] = 0xffffffffUL;\n\tbmask.w32[1] = ((1UL << (b_flag-(WIDTH/2))) - 1UL);\n    } else {\n\tbmask.w32[0] = ((1UL << b_flag) - 1UL);\n\tbmask.w32[1] = 0UL;\n    }\n#endif\n\n    /*\n     * start with the initial basis depending on the hash type\n     */\n    p = strrchr(program, '/');\n    if (p == NULL) {\n\tp = program;\n    } else {\n\t++p;\n    }\n    if (strcmp(p, \"fnv0_64\") == 0 || strcmp(p, \"fnv064\") == 0) {\n\t/* using non-recommended FNV-0 and zero initial basis */\n\thval = FNV0_64_INIT;\n    } else {\n\t/* using recommended FNV-1 and non-zero initial basis */\n\thval = FNV1_64_INIT;\n    }\n\n    /*\n     * string hashing\n     */\n    if (s_flag) {\n\n\t/* hash any other strings */\n\tfor (i=optind; i < argc; ++i) {\n\t    hval = fnv_64_str(argv[i], hval);\n\t    if (m_flag) {\n\t\tprint_fnv(hval, bmask, v_flag, argv[i]);\n\t    }\n\t}\n\n\n    /*\n     * file hashing\n     */\n    } else {\n\n\t/*\n\t * case: process only stdin\n\t */\n\tif (optind >= argc) {\n\n\t    /* case: process only stdin */\n\t    while ((readcnt = read(0, buf, BUF_SIZE)) > 0) {\n\t\thval = fnv_64_buf(buf, readcnt, hval);\n\t    }\n\t    if (m_flag) {\n\t\tprint_fnv(hval, bmask, v_flag, \"(stdin)\");\n\t    }\n\n\t} else {\n\n\t    /*\n\t     * process any other files\n\t     */\n\t    for (i=optind; i < argc; ++i) {\n\n\t\t/* open the file */\n\t\tfd = open(argv[i], O_RDONLY);\n\t\tif (fd < 0) {\n\t\t    fprintf(stderr, \"%s: unable to open file: %s\\n\",\n\t\t\t    program, argv[i]);\n\t\t    exit(4);\n\t\t}\n\n\t\t/*  hash the file */\n\t\twhile ((readcnt = read(fd, buf, BUF_SIZE)) > 0) {\n\t\t    hval = fnv_64_buf(buf, readcnt, hval);\n\t\t}\n\n\t\t/* finish processing the file */\n\t\tif (m_flag) {\n\t\t    print_fnv(hval, bmask, v_flag, argv[i]);\n\t\t}\n\t\tclose(fd);\n\t    }\n\t}\n    }\n\n    /*\n     * report hash and exit\n     */\n    if (!m_flag) {\n\tprint_fnv(hval, bmask, v_flag, \"\");\n    }\n    return 0;\t/* exit(0); */\n}\n"
  },
  {
    "path": "src/fnv/hash_32.c",
    "content": "/*\n * hash_32 - 32 bit Fowler/Noll/Vo hash code\n *\n * @(#) $Revision$\n * @(#) $Id$\n * @(#) $Source$\n *\n ***\n *\n * Fowler/Noll/Vo hash\n *\n * The basis of this hash algorithm was taken from an idea sent\n * as reviewer comments to the IEEE POSIX P1003.2 committee by:\n *\n *      Phong Vo (http://www.research.att.com/info/kpv/)\n *      Glenn Fowler (http://www.research.att.com/~gsf/)\n *\n * In a subsequent ballot round:\n *\n *      Landon Curt Noll (http://www.isthe.com/chongo/)\n *\n * improved on their algorithm.  Some people tried this hash\n * and found that it worked rather well.  In an EMail message\n * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n *\n * FNV hashes are designed to be fast while maintaining a low\n * collision rate. The FNV speed allows one to quickly hash lots\n * of data while maintaining a reasonable collision rate.  See:\n *\n *      http://www.isthe.com/chongo/tech/comp/fnv/index.html\n *\n * for more details as well as other forms of the FNV hash.\n ***\n *\n * NOTE: The FNV-0 historic hash is not recommended.  One should use\n *\t the FNV-1 hash instead.\n *\n * To use the 32 bit FNV-0 historic hash, pass FNV0_32_INIT as the\n * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().\n *\n * To use the recommended 32 bit FNV-1 hash, pass FNV1_32_INIT as the\n * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().\n *\n ***\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n#include <stdlib.h>\n#include \"fnv.h\"\n\n\n/*\n * 32 bit magic FNV-0 and FNV-1 prime\n */\n#define FNV_32_PRIME ((Fnv32_t)0x01000193)\n\n\n/*\n * fnv_32_buf - perform a 32 bit Fowler/Noll/Vo hash on a buffer\n *\n * input:\n *\tbuf\t- start of buffer to hash\n *\tlen\t- length of buffer in octets\n *\thval\t- previous hash value or 0 if first call\n *\n * returns:\n *\t32 bit hash as a static hash type\n *\n * NOTE: To use the 32 bit FNV-0 historic hash, use FNV0_32_INIT as the hval\n *\t argument on the first call to either fnv_32_buf() or fnv_32_str().\n *\n * NOTE: To use the recommended 32 bit FNV-1 hash, use FNV1_32_INIT as the hval\n *\t argument on the first call to either fnv_32_buf() or fnv_32_str().\n */\nFnv32_t\nfnv_32_buf(void *buf, size_t len, Fnv32_t hval)\n{\n    unsigned char *bp = (unsigned char *)buf;\t/* start of buffer */\n    unsigned char *be = bp + len;\t\t/* beyond end of buffer */\n\n    /*\n     * FNV-1 hash each octet in the buffer\n     */\n    while (bp < be) {\n\n\t/* multiply by the 32 bit FNV magic prime mod 2^64 */\n\thval *= FNV_32_PRIME;\n\n\t/* xor the bottom with the current octet */\n\thval ^= (Fnv32_t)*bp++;\n    }\n\n    /* return our new hash value */\n    return hval;\n}\n\n\n/*\n * fnv_32_str - perform a 32 bit Fowler/Noll/Vo hash on a string\n *\n * input:\n *\tstr\t- string to hash\n *\thval\t- previous hash value or 0 if first call\n *\n * returns:\n *\t32 bit hash as a static hash type\n *\n * NOTE: To use the 32 bit FNV-0 historic hash, use FNV0_32_INIT as the hval\n *\t argument on the first call to either fnv_32_buf() or fnv_32_str().\n *\n * NOTE: To use the recommended 32 bit FNV-1 hash, use FNV1_32_INIT as the hval\n *\t argument on the first call to either fnv_32_buf() or fnv_32_str().\n */\nFnv32_t\nfnv_32_str(char *str, Fnv32_t hval)\n{\n    unsigned char *s = (unsigned char *)str;\t/* unsigned string */\n\n    /*\n     * FNV-1 hash each octet in the buffer\n     */\n    while (*s) {\n\n\t/* multiply by the 32 bit FNV magic prime mod 2^64 */\n\thval *= FNV_32_PRIME;\n\n\t/* xor the bottom with the current octet */\n\thval ^= (Fnv32_t)*s++;\n    }\n\n    /* return our new hash value */\n    return hval;\n}\n"
  },
  {
    "path": "src/fnv/hash_64.c",
    "content": "/*\n * hash_64 - 64 bit Fowler/Noll/Vo-0 hash code\n *\n * @(#) $Revision$\n * @(#) $Id$\n * @(#) $Source$\n *\n ***\n *\n * Fowler/Noll/Vo hash\n *\n * The basis of this hash algorithm was taken from an idea sent\n * as reviewer comments to the IEEE POSIX P1003.2 committee by:\n *\n *      Phong Vo (http://www.research.att.com/info/kpv/)\n *      Glenn Fowler (http://www.research.att.com/~gsf/)\n *\n * In a subsequent ballot round:\n *\n *      Landon Curt Noll (http://www.isthe.com/chongo/)\n *\n * improved on their algorithm.  Some people tried this hash\n * and found that it worked rather well.  In an EMail message\n * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.\n *\n * FNV hashes are designed to be fast while maintaining a low\n * collision rate. The FNV speed allows one to quickly hash lots\n * of data while maintaining a reasonable collision rate.  See:\n *\n *      http://www.isthe.com/chongo/tech/comp/fnv/index.html\n *\n * for more details as well as other forms of the FNV hash.\n *\n ***\n *\n * NOTE: The FNV-0 historic hash is not recommended.  One should use\n *\t the FNV-1 hash instead.\n *\n * To use the 64 bit FNV-0 historic hash, pass FNV0_64_INIT as the\n * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().\n *\n * To use the recommended 64 bit FNV-1 hash, pass FNV1_64_INIT as the\n * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().\n *\n ***\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n#include <stdlib.h>\n#include \"fnv.h\"\n\n\n/*\n * FNV-0 defines the initial basis to be zero\n */\n#if !defined(HAVE_64BIT_LONG_LONG)\nconst Fnv64_t fnv0_64_init = { 0, 0 };\n#endif\n\n\n/*\n * FNV-1 defines the initial basis to be non-zero\n */\n#if !defined(HAVE_64BIT_LONG_LONG)\nconst Fnv64_t fnv1_64_init = { 0x84222325, 0xcbf29ce4 };\n#endif\n\n\n/*\n * 64 bit magic FNV-0 and FNV-1 prime\n */\n#if defined(HAVE_64BIT_LONG_LONG)\n#define FNV_64_PRIME ((Fnv64_t)0x100000001b3ULL)\n#else\n#define FNV_64_PRIME_LOW ((unsigned long)0x1b3)\t/* lower bits of FNV prime */\n#define FNV_64_PRIME_SHIFT (8)\t\t/* top FNV prime shift above 2^32 */\n#endif\n\n\n/*\n * fnv_64_buf - perform a 64 bit Fowler/Noll/Vo hash on a buffer\n *\n * input:\n *\tbuf\t- start of buffer to hash\n *\tlen\t- length of buffer in octets\n *\thval\t- previous hash value or 0 if first call\n *\n * returns:\n *\t64 bit hash as a static hash type\n *\n * NOTE: To use the 64 bit FNV-0 historic hash, use FNV0_64_INIT as the hval\n *\t argument on the first call to either fnv_64_buf() or fnv_64_str().\n *\n * NOTE: To use the recommended 64 bit FNV-1 hash, use FNV1_64_INIT as the hval\n *\t argument on the first call to either fnv_64_buf() or fnv_64_str().\n */\nFnv64_t\nfnv_64_buf(void *buf, size_t len, Fnv64_t hval)\n{\n#if defined(HAVE_64BIT_LONG_LONG)\n\n    unsigned char *bp = (unsigned char *)buf;\t/* start of buffer */\n    unsigned char *be = bp + len;\t\t/* beyond end of buffer */\n\n    /*\n     * FNV-1 hash each octet of the buffer\n     */\n    while (bp < be) {\n\n\t/* multiply by the 64 bit FNV magic prime mod 2^64 */\n\thval *= FNV_64_PRIME;\n\n\t/* xor the bottom with the current octet */\n\thval ^= (Fnv64_t)*bp++;\n    }\n\n#else /* HAVE_64BIT_LONG_LONG */\n\n    unsigned long val[4];\t\t\t/* hash value in base 2^16 */\n    unsigned long tmp[4];\t\t\t/* tmp 64 bit value */\n\n    /*\n     * Convert Fnv64_t hval into a base 2^16 array\n     */\n    val[0] = hval->w32[0];\n    val[1] = (val[0] >> 16);\n    val[0] &= 0xffff;\n    val[2] = hval->w32[1];\n    val[3] = (val[2] >> 16);\n    val[2] &= 0xffff;\n\n    /*\n     * FNV-1 hash each octet of the buffer\n     */\n    while (bp < be) {\n\n\t/*\n\t * multiply by the 64 bit FNV magic prime mod 2^64\n\t *\n\t * Using 0x100000001b3 we have the following digits base 2^16:\n\t *\n\t *\t0x0\t0x100\t0x0\t0x1b3\n\t *\n\t * which is the same as:\n\t *\n\t *\t0x0\t1<<FNV_64_PRIME_SHIFT\t0x0\tFNV_64_PRIME_LOW\n\t */\n\t/* multiply by the lowest order digit base 2^16 */\n\ttmp[0] = val[0] * FNV_64_PRIME_LOW;\n\ttmp[1] = val[1] * FNV_64_PRIME_LOW;\n\ttmp[2] = val[2] * FNV_64_PRIME_LOW;\n\ttmp[3] = val[3] * FNV_64_PRIME_LOW;\n\t/* multiply by the other non-zero digit */\n\ttmp[2] += val[0] << FNV_64_PRIME_SHIFT;\t/* tmp[2] += val[0] * 0x100 */\n\ttmp[3] += val[1] << FNV_64_PRIME_SHIFT;\t/* tmp[3] += val[1] * 0x100 */\n\t/* propagate carries */\n\ttmp[1] += (tmp[0] >> 16);\n\tval[0] = tmp[0] & 0xffff;\n\ttmp[2] += (tmp[1] >> 16);\n\tval[1] = tmp[1] & 0xffff;\n\tval[3] = tmp[3] + (tmp[2] >> 16);\n\tval[2] = tmp[2] & 0xffff;\n\t/*\n\t * Doing a val[3] &= 0xffff; is not really needed since it simply\n\t * removes multiples of 2^64.  We can discard these excess bits\n\t * outside of the loop when we convert to Fnv64_t.\n\t */\n\n\t/* xor the bottom with the current octet */\n\tval[0] ^= (unsigned long)*bp++;\n    }\n\n    /*\n     * Convert base 2^16 array back into an Fnv64_t\n     */\n    hval.w32[1] = ((val[3]<<16) | val[2]);\n    hval.w32[0] = ((val[1]<<16) | val[0]);\n\n#endif /* HAVE_64BIT_LONG_LONG */\n\n    /* return our new hash value */\n    return hval;\n}\n\n\n/*\n * fnv_64_str - perform a 64 bit Fowler/Noll/Vo hash on a buffer\n *\n * input:\n *\tbuf\t- start of buffer to hash\n *\thval\t- previous hash value or 0 if first call\n *\n * returns:\n *\t64 bit hash as a static hash type\n *\n * NOTE: To use the 64 bit FNV-0 historic hash, use FNV0_64_INIT as the hval\n *\t argument on the first call to either fnv_64_buf() or fnv_64_str().\n *\n * NOTE: To use the recommended 64 bit FNV-1 hash, use FNV1_64_INIT as the hval\n *\t argument on the first call to either fnv_64_buf() or fnv_64_str().\n */\nFnv64_t\nfnv_64_str(char *str, Fnv64_t hval)\n{\n    unsigned char *s = (unsigned char *)str;\t/* unsigned string */\n\n#if defined(HAVE_64BIT_LONG_LONG)\n\n    /*\n     * FNV-1 hash each octet of the string\n     */\n    while (*s) {\n\n\t/* multiply by the 64 bit FNV magic prime mod 2^64 */\n\thval *= FNV_64_PRIME;\n\n\t/* xor the bottom with the current octet */\n\thval ^= (Fnv64_t)*s++;\n    }\n\n#else /* !HAVE_64BIT_LONG_LONG */\n\n    unsigned long val[4];\t/* hash value in base 2^16 */\n    unsigned long tmp[4];\t/* tmp 64 bit value */\n\n    /*\n     * Convert Fnv64_t hval into a base 2^16 array\n     */\n    val[0] = hval->w32[0];\n    val[1] = (val[0] >> 16);\n    val[0] &= 0xffff;\n    val[2] = hval->w32[1];\n    val[3] = (val[2] >> 16);\n    val[2] &= 0xffff;\n\n    /*\n     * FNV-1 hash each octet of the string\n     */\n    while (*s) {\n\n\t/*\n\t * multiply by the 64 bit FNV magic prime mod 2^64\n\t *\n\t * Using 1099511628211, we have the following digits base 2^16:\n\t *\n\t *\t0x0\t0x100\t0x0\t0x1b3\n\t *\n\t * which is the same as:\n\t *\n\t *\t0x0\t1<<FNV_64_PRIME_SHIFT\t0x0\tFNV_64_PRIME_LOW\n\t */\n\t/* multiply by the lowest order digit base 2^16 */\n\ttmp[0] = val[0] * FNV_64_PRIME_LOW;\n\ttmp[1] = val[1] * FNV_64_PRIME_LOW;\n\ttmp[2] = val[2] * FNV_64_PRIME_LOW;\n\ttmp[3] = val[3] * FNV_64_PRIME_LOW;\n\t/* multiply by the other non-zero digit */\n\ttmp[2] += val[0] << FNV_64_PRIME_SHIFT;\t/* tmp[2] += val[0] * 0x100 */\n\ttmp[3] += val[1] << FNV_64_PRIME_SHIFT;\t/* tmp[3] += val[1] * 0x100 */\n\t/* propagate carries */\n\ttmp[1] += (tmp[0] >> 16);\n\tval[0] = tmp[0] & 0xffff;\n\ttmp[2] += (tmp[1] >> 16);\n\tval[1] = tmp[1] & 0xffff;\n\tval[3] = tmp[3] + (tmp[2] >> 16);\n\tval[2] = tmp[2] & 0xffff;\n\t/*\n\t * Doing a val[3] &= 0xffff; is not really needed since it simply\n\t * removes multiples of 2^64.  We can discard these excess bits\n\t * outside of the loop when we convert to Fnv64_t.\n\t */\n\n\t/* xor the bottom with the current octet */\n\tval[0] ^= (unsigned long)(*s++);\n    }\n\n    /*\n     * Convert base 2^16 array back into an Fnv64_t\n     */\n    hval.w32[1] = ((val[3]<<16) | val[2]);\n    hval.w32[0] = ((val[1]<<16) | val[0]);\n\n#endif /* !HAVE_64BIT_LONG_LONG */\n\n    /* return our new hash value */\n    return hval;\n}\n"
  },
  {
    "path": "src/fnv/have_ulong64.c",
    "content": "/*\n * have_ulong64 - Determine if we have a 64 bit unsigned long long\n *\n * usage:\n *\thave_ulong64 > longlong.h\n *\n * Not all systems have a 'long long type' so this may not compile on\n * your system.\n *\n * This prog outputs the define:\n *\n *\tHAVE_64BIT_LONG_LONG\n *\t\tdefined ==> we have a 64 bit unsigned long long\n *\t\tundefined ==> we must simulate a 64 bit unsigned long long\n */\n/*\n *\n * Please do not copyright this code.  This code is in the public domain.\n *\n * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,\n * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO\n * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR\n * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF\n * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n *\n * By:\n *\tchongo <Landon Curt Noll> /\\oo/\\\n *      http://www.isthe.com/chongo/\n *\n * Share and Enjoy!\t:-)\n */\n\n/*\n * have the compiler try its hand with unsigned and signed long longs\n */\nunsigned long long val = 1099511628211ULL;\n\nint\nmain(void)\n{\n\tint longlong_bits;\t/* bits in a long long */\n\n\t/*\n\t * ensure that the length of long long val is what we expect\n\t */\n\tif (val == 1099511628211ULL && sizeof(val) == 8) {\n\t\tprintf(\"#define HAVE_64BIT_LONG_LONG\\t/* yes */\\n\");\n\t}\n\n\t/* exit(0); */\n\treturn 0;\n}\n"
  },
  {
    "path": "src/fnv/ltconfig",
    "content": "#! /bin/sh\n\n# ltconfig - Create a system-specific libtool.\n# Copyright (C) 1996-1999 Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# A lot of this script is taken from autoconf-2.10.\n\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\necho=echo\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $echo works!\n  :\nelse\n  # Restart under the correct shell.\n  exec \"$SHELL\" \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit 0\nfi\n\n# Find the correct PATH separator.  Usually this is `:', but\n# DJGPP uses `;' like DOS.\nif test \"X${PATH_SEPARATOR+set}\" != Xset; then\n  UNAME=${UNAME-`uname 2>/dev/null`}\n  case X$UNAME in\n    *-DOS) PATH_SEPARATOR=';' ;;\n    *)     PATH_SEPARATOR=':' ;;\n  esac\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\nif test \"X${echo_test_string+set}\" != Xset; then\n  # find a string as large as possible, as long as the shell can cope with it\n  for cmd in 'sed 50q \"$0\"' 'sed 20q \"$0\"' 'sed 10q \"$0\"' 'sed 2q \"$0\"' 'echo test'; do\n    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n    if (echo_test_string=\"`eval $cmd`\") 2>/dev/null &&\n       echo_test_string=\"`eval $cmd`\" &&\n       (test \"X$echo_test_string\" = \"X$echo_test_string\") 2>/dev/null; then\n      break\n    fi\n  done\nfi\n\nif test \"X`($echo '\\t') 2>/dev/null`\" != 'X\\t' ||\n   test \"X`($echo \"$echo_test_string\") 2>/dev/null`\" != X\"$echo_test_string\"; then\n  # The Solaris, AIX, and Digital Unix default echo programs unquote\n  # backslashes.  This makes it impossible to quote backslashes using\n  #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n  #\n  # So, first we look for a working echo in the user's PATH.\n\n  IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n  for dir in $PATH /usr/ucb; do\n    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n       test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n       test \"X`($dir/echo \"$echo_test_string\") 2>/dev/null`\" = X\"$echo_test_string\"; then\n      echo=\"$dir/echo\"\n      break\n    fi\n  done\n  IFS=\"$save_ifs\"\n\n  if test \"X$echo\" = Xecho; then\n    # We didn't find a better echo, so look for alternatives.\n    if test \"X`(print -r '\\t') 2>/dev/null`\" = 'X\\t' &&\n       test \"X`(print -r \"$echo_test_string\") 2>/dev/null`\" = X\"$echo_test_string\"; then\n      # This shell has a builtin print -r that does the trick.\n      echo='print -r'\n    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&\n\t test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n      # If we have ksh, try running ltconfig again with it.\n      ORIGINAL_CONFIG_SHELL=\"${CONFIG_SHELL-/bin/sh}\"\n      export ORIGINAL_CONFIG_SHELL\n      CONFIG_SHELL=/bin/ksh\n      export CONFIG_SHELL\n      exec \"$CONFIG_SHELL\" \"$0\" --no-reexec ${1+\"$@\"}\n    else\n      # Try using printf.\n      echo='printf \"%s\\n\"'\n      if test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n\t test \"X`($echo \"$echo_test_string\") 2>/dev/null`\" = X\"$echo_test_string\"; then\n\t# Cool, printf works\n\t:\n      elif test \"X`(\"$ORIGINAL_CONFIG_SHELL\" \"$0\" --fallback-echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n\t   test \"X`(\"$ORIGINAL_CONFIG_SHELL\" \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null`\" = X\"$echo_test_string\"; then\n\tCONFIG_SHELL=\"$ORIGINAL_CONFIG_SHELL\"\n\texport CONFIG_SHELL\n\tSHELL=\"$CONFIG_SHELL\"\n\texport SHELL\n\techo=\"$CONFIG_SHELL $0 --fallback-echo\"\n      elif test \"X`(\"$CONFIG_SHELL\" \"$0\" --fallback-echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n\t   test \"X`(\"$CONFIG_SHELL\" \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null`\" = X\"$echo_test_string\"; then\n\techo=\"$CONFIG_SHELL $0 --fallback-echo\"\n      else\n\t# maybe with a smaller string...\n\tprev=:\n\n\tfor cmd in 'echo test' 'sed 2q \"$0\"' 'sed 10q \"$0\"' 'sed 20q \"$0\"' 'sed 50q \"$0\"'; do\n\t  if (test \"X$echo_test_string\" = \"X`eval $cmd`\") 2>/dev/null; then\n\t    break\n\t  fi\n\t  prev=\"$cmd\"\n\tdone\n\n\tif test \"$prev\" != 'sed 50q \"$0\"'; then\n\t  echo_test_string=`eval $prev`\n\t  export echo_test_string\n\t  exec \"${ORIGINAL_CONFIG_SHELL}\" \"$0\" ${1+\"$@\"}\n\telse\n\t  # Oops.  We lost completely, so just stick with echo.\n\t  echo=echo\n\tfi\n      fi\n    fi\n  fi\nfi\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e s/^X//'\nsed_quote_subst='s/\\([\\\\\"\\\\`$\\\\\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\\\\\"\\\\`\\\\\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# The name of this program.\nprogname=`$echo \"X$0\" | $Xsed -e 's%^.*/%%'`\n\n# Constants:\nPROGRAM=ltconfig\nPACKAGE=libtool\nVERSION=1.3.4\nTIMESTAMP=\" (1.385.2.196 1999/12/07 21:47:57)\"\nac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'\nac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'\nrm=\"rm -f\"\n\nhelp=\"Try \\`$progname --help' for more information.\"\n\n# Global variables:\ndefault_ofile=libtool\ncan_build_shared=yes\nenable_shared=yes\n# All known linkers require a `.a' archive for static linking (except M$VC,\n# which needs '.lib').\nenable_static=yes\nenable_fast_install=yes\nenable_dlopen=unknown\nenable_win32_dll=no\nltmain=\nsilent=\nsrcdir=\nac_config_guess=\nac_config_sub=\nhost=\nnonopt=\nofile=\"$default_ofile\"\nverify_host=yes\nwith_gcc=no\nwith_gnu_ld=no\nneed_locks=yes\nac_ext=c\nobjext=o\nlibext=a\nexeext=\ncache_file=\n\nold_AR=\"$AR\"\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\nold_CPPFLAGS=\"$CPPFLAGS\"\nold_LDFLAGS=\"$LDFLAGS\"\nold_LD=\"$LD\"\nold_LN_S=\"$LN_S\"\nold_LIBS=\"$LIBS\"\nold_NM=\"$NM\"\nold_RANLIB=\"$RANLIB\"\nold_DLLTOOL=\"$DLLTOOL\"\nold_OBJDUMP=\"$OBJDUMP\"\nold_AS=\"$AS\"\n\n# Parse the command line options.\nargs=\nprev=\nfor option\ndo\n  case \"$option\" in\n  -*=*) optarg=`echo \"$option\" | sed 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) optarg= ;;\n  esac\n\n  # If the previous option needs an argument, assign it.\n  if test -n \"$prev\"; then\n    eval \"$prev=\\$option\"\n    prev=\n    continue\n  fi\n\n  case \"$option\" in\n  --help) cat <<EOM\nUsage: $progname [OPTION]... [HOST [LTMAIN]]\n\nGenerate a system-specific libtool script.\n\n    --debug                enable verbose shell tracing\n    --disable-shared       do not build shared libraries\n    --disable-static       do not build static libraries\n    --disable-fast-install do not optimize for fast installation\n    --enable-dlopen        enable dlopen support\n    --enable-win32-dll     enable building dlls on win32 hosts\n    --help                 display this help and exit\n    --no-verify            do not verify that HOST is a valid host type\n-o, --output=FILE          specify the output file [default=$default_ofile]\n    --quiet                same as \\`--silent'\n    --silent               do not print informational messages\n    --srcdir=DIR           find \\`config.guess' in DIR\n    --version              output version information and exit\n    --with-gcc             assume that the GNU C compiler will be used\n    --with-gnu-ld          assume that the C compiler uses the GNU linker\n    --disable-lock         disable file locking\n    --cache-file=FILE      configure cache file\n\nLTMAIN is the \\`ltmain.sh' shell script fragment or \\`ltmain.c' program\nthat provides basic libtool functionality.\n\nHOST is the canonical host system name [default=guessed].\nEOM\n  exit 0\n  ;;\n\n  --debug)\n    echo \"$progname: enabling shell trace mode\"\n    set -x\n    ;;\n\n  --disable-shared) enable_shared=no ;;\n\n  --disable-static) enable_static=no ;;\n\n  --disable-fast-install) enable_fast_install=no ;;\n\n  --enable-dlopen) enable_dlopen=yes ;;\n\n  --enable-win32-dll) enable_win32_dll=yes ;;\n\n  --quiet | --silent) silent=yes ;;\n\n  --srcdir) prev=srcdir ;;\n  --srcdir=*) srcdir=\"$optarg\" ;;\n\n  --no-verify) verify_host=no ;;\n\n  --output | -o) prev=ofile ;;\n  --output=*) ofile=\"$optarg\" ;;\n\n  --version) echo \"$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP\"; exit 0 ;;\n\n  --with-gcc) with_gcc=yes ;;\n  --with-gnu-ld) with_gnu_ld=yes ;;\n\n  --disable-lock) need_locks=no ;;\n\n  --cache-file=*) cache_file=\"$optarg\" ;;\n\n  -*)\n    echo \"$progname: unrecognized option \\`$option'\" 1>&2\n    echo \"$help\" 1>&2\n    exit 1\n    ;;\n\n  *)\n    if test -z \"$ltmain\"; then\n      ltmain=\"$option\"\n    elif test -z \"$host\"; then\n# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1\n#      if test -n \"`echo $option| sed 's/[-a-z0-9.]//g'`\"; then\n#        echo \"$progname: warning \\`$option' is not a valid host type\" 1>&2\n#      fi\n      host=\"$option\"\n    else\n      echo \"$progname: too many arguments\" 1>&2\n      echo \"$help\" 1>&2\n      exit 1\n    fi ;;\n  esac\ndone\n\nif test -z \"$ltmain\"; then\n  echo \"$progname: you must specify a LTMAIN file\" 1>&2\n  echo \"$help\" 1>&2\n  exit 1\nfi\n\nif test ! -f \"$ltmain\"; then\n  echo \"$progname: \\`$ltmain' does not exist\" 1>&2\n  echo \"$help\" 1>&2\n  exit 1\nfi\n\n# Quote any args containing shell metacharacters.\nltconfig_args=\nfor arg\ndo\n  case \"$arg\" in\n  *\" \"*|*\"\t\"*|*[\\[\\]\\~\\#\\$\\^\\&\\*\\(\\)\\{\\}\\\\\\|\\;\\<\\>\\?]*)\n  ltconfig_args=\"$ltconfig_args '$arg'\" ;;\n  *) ltconfig_args=\"$ltconfig_args $arg\" ;;\n  esac\ndone\n\n# A relevant subset of AC_INIT.\n\n# File descriptor usage:\n# 0 standard input\n# 1 file creation\n# 2 errors and warnings\n# 3 some systems may open it to /dev/tty\n# 4 used on the Kubota Titan\n# 5 compiler messages saved in config.log\n# 6 checking for... messages and results\nif test \"$silent\" = yes; then\n  exec 6>/dev/null\nelse\n  exec 6>&1\nfi\nexec 5>>./config.log\n\n# NLS nuisances.\n# Only set LANG and LC_ALL to C if already set.\n# These must not be set unconditionally because not all systems understand\n# e.g. LANG=C (notably SCO).\nif test \"X${LC_ALL+set}\" = Xset; then LC_ALL=C; export LC_ALL; fi\nif test \"X${LANG+set}\"   = Xset; then LANG=C;   export LANG;   fi\n\nif test -n \"$cache_file\" && test -r \"$cache_file\"; then\n  echo \"loading cache $cache_file within ltconfig\"\n  . $cache_file\nfi\n\nif (echo \"testing\\c\"; echo 1,2,3) | grep c >/dev/null; then\n  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.\n  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then\n    ac_n= ac_c='\n' ac_t='\t'\n  else\n    ac_n=-n ac_c= ac_t=\n  fi\nelse\n  ac_n= ac_c='\\c' ac_t=\nfi\n\nif test -z \"$srcdir\"; then\n  # Assume the source directory is the same one as the path to LTMAIN.\n  srcdir=`$echo \"X$ltmain\" | $Xsed -e 's%/[^/]*$%%'`\n  test \"$srcdir\" = \"$ltmain\" && srcdir=.\nfi\n\ntrap \"$rm conftest*; exit 1\" 1 2 15\nif test \"$verify_host\" = yes; then\n  # Check for config.guess and config.sub.\n  ac_aux_dir=\n  for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do\n    if test -f $ac_dir/config.guess; then\n      ac_aux_dir=$ac_dir\n      break\n    fi\n  done\n  if test -z \"$ac_aux_dir\"; then\n    echo \"$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../..\" 1>&2\n    echo \"$help\" 1>&2\n    exit 1\n  fi\n  ac_config_guess=$ac_aux_dir/config.guess\n  ac_config_sub=$ac_aux_dir/config.sub\n\n  # Make sure we can run config.sub.\n  if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :\n  else\n    echo \"$progname: cannot run $ac_config_sub\" 1>&2\n    echo \"$help\" 1>&2\n    exit 1\n  fi\n\n  echo $ac_n \"checking host system type\"\"... $ac_c\" 1>&6\n\n  host_alias=$host\n  case \"$host_alias\" in\n  \"\")\n    if host_alias=`$SHELL $ac_config_guess`; then :\n    else\n      echo \"$progname: cannot guess host type; you must specify one\" 1>&2\n      echo \"$help\" 1>&2\n      exit 1\n    fi ;;\n  esac\n  host=`$SHELL $ac_config_sub $host_alias`\n  echo \"$ac_t$host\" 1>&6\n\n  # Make sure the host verified.\n  test -z \"$host\" && exit 1\n\nelif test -z \"$host\"; then\n  echo \"$progname: you must specify a host type if you use \\`--no-verify'\" 1>&2\n  echo \"$help\" 1>&2\n  exit 1\nelse\n  host_alias=$host\nfi\n\n# Transform linux* to *-*-linux-gnu*, to support old configure scripts.\ncase \"$host_os\" in\nlinux-gnu*) ;;\nlinux*) host=`echo $host | sed 's/^\\(.*-.*-linux\\)\\(.*\\)$/\\1-gnu\\2/'`\nesac\n\nhost_cpu=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\1/'`\nhost_vendor=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\2/'`\nhost_os=`echo $host | sed 's/^\\([^-]*\\)-\\([^-]*\\)-\\(.*\\)$/\\3/'`\n\ncase \"$host_os\" in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR cru $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\n# Set a sane default for `AR'.\ntest -z \"$AR\" && AR=ar\n\n# Set a sane default for `OBJDUMP'.\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n# If RANLIB is not set, then run the test.\nif test \"${RANLIB+set}\" != \"set\"; then\n  result=no\n\n  echo $ac_n \"checking for ranlib... $ac_c\" 1>&6\n  IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n  for dir in $PATH; do\n    test -z \"$dir\" && dir=.\n    if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then\n      RANLIB=\"ranlib\"\n      result=\"ranlib\"\n      break\n    fi\n  done\n  IFS=\"$save_ifs\"\n\n  echo \"$ac_t$result\" 1>&6\nfi\n\nif test -n \"$RANLIB\"; then\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\n  old_postinstall_cmds=\"\\$RANLIB \\$oldlib~$old_postinstall_cmds\"\nfi\n\n# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\ntest -z \"$AS\" && AS=as\n\n# Check to see if we are using GCC.\nif test \"$with_gcc\" != yes || test -z \"$CC\"; then\n  # If CC is not set, then try to find GCC or a usable CC.\n  if test -z \"$CC\"; then\n    echo $ac_n \"checking for gcc... $ac_c\" 1>&6\n    IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n    for dir in $PATH; do\n      test -z \"$dir\" && dir=.\n      if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then\n\tCC=\"gcc\"\n\tbreak\n      fi\n    done\n    IFS=\"$save_ifs\"\n\n    if test -n \"$CC\"; then\n      echo \"$ac_t$CC\" 1>&6\n    else\n      echo \"$ac_t\"no 1>&6\n    fi\n  fi\n\n  # Not \"gcc\", so try \"cc\", rejecting \"/usr/ucb/cc\".\n  if test -z \"$CC\"; then\n    echo $ac_n \"checking for cc... $ac_c\" 1>&6\n    IFS=\"${IFS= \t}\"; save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n    cc_rejected=no\n    for dir in $PATH; do\n      test -z \"$dir\" && dir=.\n      if test -f $dir/cc || test -f $dir/cc$ac_exeext; then\n\tif test \"$dir/cc\" = \"/usr/ucb/cc\"; then\n\t  cc_rejected=yes\n\t  continue\n\tfi\n\tCC=\"cc\"\n\tbreak\n      fi\n    done\n    IFS=\"$save_ifs\"\n    if test $cc_rejected = yes; then\n      # We found a bogon in the path, so make sure we never use it.\n      set dummy $CC\n      shift\n      if test $# -gt 0; then\n\t# We chose a different compiler from the bogus one.\n\t# However, it has the same name, so the bogon will be chosen\n\t# first if we set CC to just the name; use the full file name.\n\tshift\n\tset dummy \"$dir/cc\" \"$@\"\n\tshift\n\tCC=\"$@\"\n      fi\n    fi\n\n    if test -n \"$CC\"; then\n      echo \"$ac_t$CC\" 1>&6\n    else\n      echo \"$ac_t\"no 1>&6\n    fi\n\n    if test -z \"$CC\"; then\n      echo \"$progname: error: no acceptable cc found in \\$PATH\" 1>&2\n      exit 1\n    fi\n  fi\n\n  # Now see if the compiler is really GCC.\n  with_gcc=no\n  echo $ac_n \"checking whether we are using GNU C... $ac_c\" 1>&6\n  echo \"$progname:581: checking whether we are using GNU C\" >&5\n\n  $rm conftest.c\n  cat > conftest.c <<EOF\n#ifdef __GNUC__\n  yes;\n#endif\nEOF\n  if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then\n    with_gcc=yes\n  fi\n  $rm conftest.c\n  echo \"$ac_t$with_gcc\" 1>&6\nfi\n\n# Allow CC to be a program name with arguments.\nset dummy $CC\ncompiler=\"$2\"\n\necho $ac_n \"checking for object suffix... $ac_c\" 1>&6\n$rm conftest*\necho 'int i = 1;' > conftest.c\necho \"$progname:603: checking for object suffix\" >& 5\nif { (eval echo $progname:604: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then\n  # Append any warnings to the config.log.\n  cat conftest.err 1>&5\n\n  for ac_file in conftest.*; do\n    case $ac_file in\n    *.c) ;;\n    *) objext=`echo $ac_file | sed -e s/conftest.//` ;;\n    esac\n  done\nelse\n  cat conftest.err 1>&5\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.c >&5\nfi\n$rm conftest*\necho \"$ac_t$objext\" 1>&6\n\necho $ac_n \"checking for executable suffix... $ac_c\" 1>&6\nif eval \"test \\\"`echo '$''{'ac_cv_exeext'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_cv_exeext=\"no\"\n  $rm conftest*\n  echo 'main () { return 0; }' > conftest.c\n  echo \"$progname:629: checking for executable suffix\" >& 5\n  if { (eval echo $progname:630: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>conftest.err; }; then\n    # Append any warnings to the config.log.\n    cat conftest.err 1>&5\n\n    for ac_file in conftest.*; do\n      case $ac_file in\n      *.c | *.err | *.$objext ) ;;\n      *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;\n      esac\n    done\n  else\n    cat conftest.err 1>&5\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.c >&5\n  fi\n  $rm conftest*\nfi\nif test \"X$ac_cv_exeext\" = Xno; then\n  exeext=\"\"\nelse\n  exeext=\"$ac_cv_exeext\"\nfi\necho \"$ac_t$ac_cv_exeext\" 1>&6\n\necho $ac_n \"checking for $compiler option to produce PIC... $ac_c\" 1>&6\npic_flag=\nspecial_shlib_compile_flags=\nwl=\nlink_static_flag=\nno_builtin_flag=\n\nif test \"$with_gcc\" = yes; then\n  wl='-Wl,'\n  link_static_flag='-static'\n\n  case \"$host_os\" in\n  beos* | irix5* | irix6* | osf3* | osf4* | osf5*)\n    # PIC is the default for these OSes.\n    ;;\n  aix*)\n    # Below there is a dirty hack to force normal static linking with -ldl\n    # The problem is because libdl dynamically linked with both libc and\n    # libC (AIX C++ library), which obviously doesn't included in libraries\n    # list by gcc. This cause undefined symbols with -static flags.\n    # This hack allows C programs to be linked with \"-static -ldl\", but\n    # we not sure about C++ programs.\n    link_static_flag=\"$link_static_flag ${wl}-lC\"\n    ;;\n  cygwin* | mingw* | os2*)\n    # We can build DLLs from non-PIC.\n    ;;\n  amigaos*)\n    # FIXME: we need at least 68020 code to build shared libraries, but\n    # adding the `-m68020' flag to GCC prevents building anything better,\n    # like `-m68040'.\n    pic_flag='-m68020 -resident32 -malways-restore-a4'\n    ;;\n  sysv4*MP*)\n    if test -d /usr/nec; then\n       pic_flag=-Kconform_pic\n    fi\n    ;;\n  *)\n    pic_flag='-fPIC'\n    ;;\n  esac\nelse\n  # PORTME Check for PIC flags for the system compiler.\n  case \"$host_os\" in\n  aix3* | aix4*)\n    # All AIX code is PIC.\n    link_static_flag='-bnso -bI:/lib/syscalls.exp'\n    ;;\n\n  hpux9* | hpux10* | hpux11*)\n    # Is there a better link_static_flag that works with the bundled CC?\n    wl='-Wl,'\n    link_static_flag=\"${wl}-a ${wl}archive\"\n    pic_flag='+Z'\n    ;;\n\n  irix5* | irix6*)\n    wl='-Wl,'\n    link_static_flag='-non_shared'\n    # PIC (with -KPIC) is the default.\n    ;;\n\n  cygwin* | mingw* | os2*)\n    # We can build DLLs from non-PIC.\n    ;;\n\n  osf3* | osf4* | osf5*)\n    # All OSF/1 code is PIC.\n    wl='-Wl,'\n    link_static_flag='-non_shared'\n    ;;\n\n  sco3.2v5*)\n    pic_flag='-Kpic'\n    link_static_flag='-dn'\n    special_shlib_compile_flags='-belf'\n    ;;\n\n  solaris*)\n    pic_flag='-KPIC'\n    link_static_flag='-Bstatic'\n    wl='-Wl,'\n    ;;\n\n  sunos4*)\n    pic_flag='-PIC'\n    link_static_flag='-Bstatic'\n    wl='-Qoption ld '\n    ;;\n\n  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n    pic_flag='-KPIC'\n    link_static_flag='-Bstatic'\n    wl='-Wl,'\n    ;;\n\n  uts4*)\n    pic_flag='-pic'\n    link_static_flag='-Bstatic'\n    ;;\n  sysv4*MP*)\n    if test -d /usr/nec ;then\n      pic_flag='-Kconform_pic'\n      link_static_flag='-Bstatic'\n    fi\n    ;;\n  *)\n    can_build_shared=no\n    ;;\n  esac\nfi\n\nif test -n \"$pic_flag\"; then\n  echo \"$ac_t$pic_flag\" 1>&6\n\n  # Check to make sure the pic_flag actually works.\n  echo $ac_n \"checking if $compiler PIC flag $pic_flag works... $ac_c\" 1>&6\n  $rm conftest*\n  echo \"int some_variable = 0;\" > conftest.c\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS $pic_flag -DPIC\"\n  echo \"$progname:776: checking if $compiler PIC flag $pic_flag works\" >&5\n  if { (eval echo $progname:777: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then\n    # Append any warnings to the config.log.\n    cat conftest.err 1>&5\n    \n    case \"$host_os\" in\n    hpux9* | hpux10* | hpux11*)\n      # On HP-UX, both CC and GCC only warn that PIC is supported... then they\n      # create non-PIC objects.  So, if there were any warnings, we assume that\n      # PIC is not supported.\n      if test -s conftest.err; then\n\techo \"$ac_t\"no 1>&6\n\tcan_build_shared=no\n\tpic_flag=\n      else\n\techo \"$ac_t\"yes 1>&6\n\tpic_flag=\" $pic_flag\"\n      fi\n      ;;\n    *)\n      echo \"$ac_t\"yes 1>&6\n      pic_flag=\" $pic_flag\"\n      ;;\n    esac\n  else\n    # Append any errors to the config.log.\n    cat conftest.err 1>&5\n    can_build_shared=no\n    pic_flag=\n    echo \"$ac_t\"no 1>&6\n  fi\n  CFLAGS=\"$save_CFLAGS\"\n  $rm conftest*\nelse\n  echo \"$ac_t\"none 1>&6\nfi\n\n# Check to see if options -o and -c are simultaneously supported by compiler\necho $ac_n \"checking if $compiler supports -c -o file.o... $ac_c\" 1>&6\n$rm -r conftest 2>/dev/null\nmkdir conftest\ncd conftest\n$rm conftest*\necho \"int some_variable = 0;\" > conftest.c\nmkdir out\n# According to Tom Tromey, Ian Lance Taylor reported there are C compilers\n# that will create temporary files in the current directory regardless of\n# the output directory.  Thus, making CWD read-only will cause this test\n# to fail, enabling locking or at least warning the user not to do parallel\n# builds.\nchmod -w .\nsave_CFLAGS=\"$CFLAGS\"\nCFLAGS=\"$CFLAGS -o out/conftest2.o\"\necho \"$progname:829: checking if $compiler supports -c -o file.o\" >&5\nif { (eval echo $progname:830: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then\n\n  # The compiler can only warn and ignore the option if not recognized\n  # So say no if there are warnings\n    if test -s out/conftest.err; then\n      echo \"$ac_t\"no 1>&6\n      compiler_c_o=no\n    else\n      echo \"$ac_t\"yes 1>&6\n      compiler_c_o=yes\n    fi\nelse\n  # Append any errors to the config.log.\n  cat out/conftest.err 1>&5\n  compiler_c_o=no\n  echo \"$ac_t\"no 1>&6\nfi\nCFLAGS=\"$save_CFLAGS\"\nchmod u+w .\n$rm conftest* out/*\nrmdir out\ncd ..\nrmdir conftest\n$rm -r conftest 2>/dev/null\n\nif test x\"$compiler_c_o\" = x\"yes\"; then\n  # Check to see if we can write to a .lo\n  echo $ac_n \"checking if $compiler supports -c -o file.lo... $ac_c\" 1>&6\n  $rm conftest*\n  echo \"int some_variable = 0;\" > conftest.c\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -c -o conftest.lo\"\n  echo \"$progname:862: checking if $compiler supports -c -o file.lo\" >&5\nif { (eval echo $progname:863: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then\n\n    # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n      if test -s conftest.err; then\n\techo \"$ac_t\"no 1>&6\n\tcompiler_o_lo=no\n      else\n\techo \"$ac_t\"yes 1>&6\n\tcompiler_o_lo=yes\n      fi\n  else\n    # Append any errors to the config.log.\n    cat conftest.err 1>&5\n    compiler_o_lo=no\n    echo \"$ac_t\"no 1>&6\n  fi\n  CFLAGS=\"$save_CFLAGS\"\n  $rm conftest*\nelse\n  compiler_o_lo=no\nfi\n\n# Check to see if we can do hard links to lock some files if needed\nhard_links=\"nottested\"\nif test \"$compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  echo $ac_n \"checking if we can lock with hard links... $ac_c\" 1>&6\n  hard_links=yes\n  $rm conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  echo \"$ac_t$hard_links\" 1>&6\n  $rm conftest*\n  if test \"$hard_links\" = no; then\n    echo \"*** WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\nif test \"$with_gcc\" = yes; then\n  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler\n  echo $ac_n \"checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c\" 1>&6\n  $rm conftest*\n  echo \"int some_variable = 0;\" > conftest.c\n  save_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -fno-rtti -fno-exceptions -c conftest.c\"\n  echo \"$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n  if { (eval echo $progname:915: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then\n\n    # The compiler can only warn and ignore the option if not recognized\n    # So say no if there are warnings\n      if test -s conftest.err; then\n\techo \"$ac_t\"no 1>&6\n\tcompiler_rtti_exceptions=no\n      else\n\techo \"$ac_t\"yes 1>&6\n\tcompiler_rtti_exceptions=yes\n      fi\n  else\n    # Append any errors to the config.log.\n    cat conftest.err 1>&5\n    compiler_rtti_exceptions=no\n    echo \"$ac_t\"no 1>&6\n  fi\n  CFLAGS=\"$save_CFLAGS\"\n  $rm conftest*\n\n  if test \"$compiler_rtti_exceptions\" = \"yes\"; then\n    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'\n  else\n    no_builtin_flag=' -fno-builtin'\n  fi\n  \nfi\n\n# Check for any special shared library compilation flags.\nif test -n \"$special_shlib_compile_flags\"; then\n  echo \"$progname: warning: \\`$CC' requires \\`$special_shlib_compile_flags' to build shared libraries\" 1>&2\n  if echo \"$old_CC $old_CFLAGS \" | egrep -e \"[ \t]$special_shlib_compile_flags[ \t]\" >/dev/null; then :\n  else\n    echo \"$progname: add \\`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure\" 1>&2\n    can_build_shared=no\n  fi\nfi\n\necho $ac_n \"checking if $compiler static flag $link_static_flag works... $ac_c\" 1>&6\n$rm conftest*\necho 'main(){return(0);}' > conftest.c\nsave_LDFLAGS=\"$LDFLAGS\"\nLDFLAGS=\"$LDFLAGS $link_static_flag\"\necho \"$progname:958: checking if $compiler static flag $link_static_flag works\" >&5\nif { (eval echo $progname:959: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then\n  echo \"$ac_t$link_static_flag\" 1>&6\nelse\n  echo \"$ac_t\"none 1>&6\n  link_static_flag=\nfi\nLDFLAGS=\"$save_LDFLAGS\"\n$rm conftest*\n\nif test -z \"$LN_S\"; then\n  # Check to see if we can use ln -s, or we need hard links.\n  echo $ac_n \"checking whether ln -s works... $ac_c\" 1>&6\n  $rm conftest.dat\n  if ln -s X conftest.dat 2>/dev/null; then\n    $rm conftest.dat\n    LN_S=\"ln -s\"\n  else\n    LN_S=ln\n  fi\n  if test \"$LN_S\" = \"ln -s\"; then\n    echo \"$ac_t\"yes 1>&6\n  else\n    echo \"$ac_t\"no 1>&6\n  fi\nfi\n\n# Make sure LD is an absolute path.\nif test -z \"$LD\"; then\n  ac_prog=ld\n  if test \"$with_gcc\" = yes; then\n    # Check if gcc -print-prog-name=ld gives a path.\n    echo $ac_n \"checking for ld used by GCC... $ac_c\" 1>&6\n    echo \"$progname:991: checking for ld used by GCC\" >&5\n    ac_prog=`($CC -print-prog-name=ld) 2>&5`\n    case \"$ac_prog\" in\n    # Accept absolute paths.\n    [\\\\/]* | [A-Za-z]:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the path of ld\n      ac_prog=`echo $ac_prog| sed 's%\\\\\\\\%/%g'`\n      while echo $ac_prog | grep \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`echo $ac_prog| sed \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n    \"\")\n      # If it fails, then pretend we are not using GCC.\n      ac_prog=ld\n      ;;\n    *)\n      # If it is relative, then search for the first ld in PATH.\n      with_gnu_ld=unknown\n      ;;\n    esac\n  elif test \"$with_gnu_ld\" = yes; then\n    echo $ac_n \"checking for GNU ld... $ac_c\" 1>&6\n    echo \"$progname:1015: checking for GNU ld\" >&5\n  else\n    echo $ac_n \"checking for non-GNU ld\"\"... $ac_c\" 1>&6\n    echo \"$progname:1018: checking for non-GNU ld\" >&5\n  fi\n\n  if test -z \"$LD\"; then\n    IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n    for ac_dir in $PATH; do\n      test -z \"$ac_dir\" && ac_dir=.\n      if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n\tLD=\"$ac_dir/$ac_prog\"\n\t# Check to see if the program is GNU ld.  I'd rather use --version,\n\t# but apparently some GNU ld's only accept -v.\n\t# Break only if it was the GNU/non-GNU ld that we prefer.\n\tif \"$LD\" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then\n\t  test \"$with_gnu_ld\" != no && break\n\telse\n\t  test \"$with_gnu_ld\" != yes && break\n\tfi\n      fi\n    done\n    IFS=\"$ac_save_ifs\"\n  fi\n\n  if test -n \"$LD\"; then\n    echo \"$ac_t$LD\" 1>&6\n  else\n    echo \"$ac_t\"no 1>&6\n  fi\n\n  if test -z \"$LD\"; then\n    echo \"$progname: error: no acceptable ld found in \\$PATH\" 1>&2\n    exit 1\n  fi\nfi\n\n# Check to see if it really is or is not GNU ld.\necho $ac_n \"checking if the linker ($LD) is GNU ld... $ac_c\" 1>&6\n# I'd rather use --version here, but apparently some GNU ld's only accept -v.\nif $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then\n  with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\necho \"$ac_t$with_gnu_ld\" 1>&6\n\n# See if the linker supports building shared libraries.\necho $ac_n \"checking whether the linker ($LD) supports shared libraries... $ac_c\" 1>&6\n\nallow_undefined_flag=\nno_undefined_flag=\nneed_lib_prefix=unknown\nneed_version=unknown\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\narchive_cmds=\narchive_expsym_cmds=\nold_archive_from_new_cmds=\nexport_dynamic_flag_spec=\nwhole_archive_flag_spec=\nthread_safe_flag_spec=\nhardcode_libdir_flag_spec=\nhardcode_libdir_separator=\nhardcode_direct=no\nhardcode_minus_L=no\nhardcode_shlibpath_var=unsupported\nrunpath_var=\nalways_export_symbols=no\nexport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n# include_expsyms should be a list of space-separated symbols to be *always*\n# included in the symbol list\ninclude_expsyms=\n# exclude_expsyms can be an egrep regular expression of symbols to exclude\n# it will be wrapped by ` (' and `)$', so one must not match beginning or\n# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n# as well as any symbol that contains `d'.\nexclude_expsyms=\"_GLOBAL_OFFSET_TABLE_\"\n# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n# platforms (ab)use it in PIC code, but their linkers get confused if\n# the symbol is explicitly referenced.  Since portable code cannot\n# rely on this symbol name, it's probably fine to never include it in\n# preloaded symbol tables.\n\ncase \"$host_os\" in\ncygwin* | mingw*)\n  # FIXME: the MSVC++ port hasn't been tested in a loooong time\n  # When not using gcc, we currently assume that we are using\n  # Microsoft Visual C++.\n  if test \"$with_gcc\" != yes; then\n    with_gnu_ld=no\n  fi\n  ;;\n\nesac\n\nld_shlibs=yes\nif test \"$with_gnu_ld\" = yes; then\n  # If archive_cmds runs LD, not CC, wlarc should be empty\n  wlarc='${wl}'\n\n  # See if GNU ld supports shared libraries.\n  case \"$host_os\" in\n  aix3* | aix4*)\n    # On AIX, the GNU linker is very broken\n    ld_shlibs=no\n    cat <<EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\nEOF\n    ;;\n\n  amigaos*)\n    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n\n    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports\n    # that the semantics of dynamic libraries on AmigaOS, at least up\n    # to version 4, is to share data among multiple programs linked\n    # with the same dynamic library.  Since this doesn't match the\n    # behavior of shared libraries on other platforms, we can use\n    # them.\n    ld_shlibs=no\n    ;;\n\n  beos*)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      allow_undefined_flag=unsupported\n      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n      # support --undefined.  This deserves some investigation.  FIXME\n      archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n\n  cygwin* | mingw*)\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec='-L$libdir'\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n\n    # Extract the symbol export list from an `--export-all' def file,\n    # then regenerate the def file from the symbol export list, so that\n    # the compiled dll only exports the symbol export list.\n    export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e \"/^# \\/\\* ltdll\\.c starts here \\*\\//,/^# \\/\\* ltdll.c ends here \\*\\// { s/^# //; p; }\" -e d < $0 > $objdir/$soname-ltdll.c~\n      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~\n      $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def  $objdir/$soname-ltdll.$objext $libobjs $convenience~\n      sed -e \"1,/EXPORTS/d\" -e \"s/ @ [0-9]* ; *//\" < $objdir/$soname-def > $export_symbols'\n\n    archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~\n      _lt_hint=1;\n      for symbol in `cat $export_symbols`; do\n\techo \"\t\\$symbol @ \\$_lt_hint ; \" >> $objdir/$soname-def;\n\t_lt_hint=`expr 1 + \\$_lt_hint`;\n      done~\n      test -f $objdir/$soname-ltdll.c || sed -e \"/^# \\/\\* ltdll\\.c starts here \\*\\//,/^# \\/\\* ltdll.c ends here \\*\\// { s/^# //; p; }\" -e d < $0 > $objdir/$soname-ltdll.c~\n      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~\n      $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~\n      $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~\n      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~\n      $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'\n\n      old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' \n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'\n      # can we support soname and/or expsyms with a.out? -oliva\n    fi\n    ;;\n\n  solaris* | sysv5*)\n    if $LD -v 2>&1 | egrep 'BFD 2\\.8' > /dev/null; then\n      ld_shlibs=no\n      cat <<EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\nEOF\n    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;      \n\n  sunos4*)\n    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'\n    wlarc=\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then\n      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'\n      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n    else\n      ld_shlibs=no\n    fi\n    ;;\n  esac\n\n  if test \"$ld_shlibs\" = yes; then\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    case $host_os in\n    cygwin* | mingw*)\n      # dlltool doesn't understand --whole-archive et. al.\n      whole_archive_flag_spec=\n      ;;\n    *)\n      # ancient GNU ld didn't support --whole-archive et. al.\n      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then\n        whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n      else\n        whole_archive_flag_spec=\n      fi\n      ;;\n    esac\n  fi\nelse\n  # PORTME fill in a description of your system's linker (not GNU ld)\n  case \"$host_os\" in\n  aix3*)\n    allow_undefined_flag=unsupported\n    always_export_symbols=yes\n    archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'\n    # Note: this linker hardcodes the directories in LIBPATH if there\n    # are no directories specified by -L.\n    hardcode_minus_L=yes\n    if test \"$with_gcc\" = yes && test -z \"$link_static_flag\"; then\n      # Neither direct hardcoding nor static linking is supported with a\n      # broken collect2.\n      hardcode_direct=unsupported\n    fi\n    ;;\n\n  aix4*)\n    hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'\n    hardcode_libdir_separator=':'\n    if test \"$with_gcc\" = yes; then\n      collect2name=`${CC} -print-prog-name=collect2`\n      if test -f \"$collect2name\" && \\\n\t strings \"$collect2name\" | grep resolve_lib_name >/dev/null\n      then\n\t# We have reworked collect2\n\thardcode_direct=yes\n      else\n\t# We have old collect2\n\thardcode_direct=unsupported\n\t# It fails to find uninstalled libraries when the uninstalled\n\t# path is not listed in the libpath.  Setting hardcode_minus_L\n\t# to unsupported forces relinking\n\thardcode_minus_L=yes\n\thardcode_libdir_flag_spec='-L$libdir'\n\thardcode_libdir_separator=\n      fi\n      shared_flag='-shared'\n    else\n      shared_flag='${wl}-bM:SRE'\n      hardcode_direct=yes\n    fi\n    allow_undefined_flag=' ${wl}-berok'\n    archive_cmds=\"\\$CC $shared_flag\"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'\n    archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'\n    case \"$host_os\" in aix4.[01]|aix4.[01].*)\n      # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on\n      always_export_symbols=yes ;;\n    esac\n   ;;\n\n  amigaos*)\n    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo \"#define NAME $libname\" > $objdir/a2ixlibrary.data~$echo \"#define LIBRARY_ID 1\" >> $objdir/a2ixlibrary.data~$echo \"#define VERSION $major\" >> $objdir/a2ixlibrary.data~$echo \"#define REVISION $revision\" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    # see comment about different semantics on the GNU ld section\n    ld_shlibs=no\n    ;;\n\n  cygwin* | mingw*)\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    # hardcode_libdir_flag_spec is actually meaningless, as there is\n    # no search path for DLLs.\n    hardcode_libdir_flag_spec=' '\n    allow_undefined_flag=unsupported\n    # Tell ltmain to make .lib files, not .a files.\n    libext=lib\n    # FIXME: Setting linknames here is a bad hack.\n    archive_cmds='$CC -o $lib $libobjs $linkopts `echo \"$deplibs\" | sed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n    # The linker will automatically build a .lib file if we build a DLL.\n    old_archive_from_new_cmds='true'\n    # FIXME: Should let the user specify the lib program.\n    old_archive_cmds='lib /OUT:$oldlib$oldobjs'\n    fix_srcfile_path='`cygpath -w $srcfile`'\n    ;;\n\n  freebsd1*)\n    ld_shlibs=no\n    ;;\n\n  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n  # support.  Future versions do this automatically, but an explicit c++rt0.o\n  # does not break anything, and helps significantly (at the cost of a little\n  # extra space).\n  freebsd2.2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n  freebsd2*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n  freebsd*)\n    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  hpux9* | hpux10* | hpux11*)\n    case \"$host_os\" in\n    hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;\n    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;\n    esac\n    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n    hardcode_libdir_separator=:\n    hardcode_direct=yes\n    hardcode_minus_L=yes # Not in the search PATH, but as the default\n\t\t\t # location of the library.\n    export_dynamic_flag_spec='${wl}-E'\n    ;;\n\n  irix5* | irix6*)\n    if test \"$with_gcc\" = yes; then\n      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'\n    else\n      archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    ;;\n\n  netbsd*)\n    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'  # a.out\n    else\n      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts'      # ELF\n    fi\n    hardcode_libdir_flag_spec='${wl}-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  openbsd*)\n    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_direct=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  os2*)\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_minus_L=yes\n    allow_undefined_flag=unsupported\n    archive_cmds='$echo \"LIBRARY $libname INITINSTANCE\" > $objdir/$libname.def~$echo \"DESCRIPTION \\\"$libname\\\"\" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo \" SINGLE NONSHARED\" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'\n    old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'\n    ;;\n\n  osf3*)\n    if test \"$with_gcc\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    ;;\n\n  osf4* | osf5*)  # As osf3* with the addition of the -msym flag\n    if test \"$with_gcc\" = yes; then\n      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'\n    else\n      allow_undefined_flag=' -expect_unresolved \\*'\n      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n \"$verstring\" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'\n    fi\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    hardcode_libdir_separator=:\n    ;;\n\n  sco3.2v5*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    hardcode_shlibpath_var=no\n    runpath_var=LD_RUN_PATH\n    hardcode_runpath_var=yes\n    ;;\n\n  solaris*)\n    no_undefined_flag=' -z text'\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'\n    hardcode_libdir_flag_spec='-R$libdir'\n    hardcode_shlibpath_var=no\n    case \"$host_os\" in\n    solaris2.[0-5] | solaris2.[0-5].*) ;;\n    *) # Supported since Solaris 2.6 (maybe 2.5.1?)\n      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;\n    esac\n    ;;\n\n  sunos4*)\n    archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_direct=yes\n    hardcode_minus_L=yes\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    hardcode_direct=no #Motorola manual says yes, but my tests say they lie \n    ;;  \n\n  sysv4.3*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    hardcode_shlibpath_var=no\n    export_dynamic_flag_spec='-Bexport'\n    ;;\n\n  sysv5*)\n    no_undefined_flag=' -z text'\n    # $CC -shared without GNU ld will not create a library from C++\n    # object files and a static libstdc++, better avoid it by now\n    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'\n    archive_expsym_cmds='$echo \"{ global:\" > $lib.exp~cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~$echo \"local: *; };\" >> $lib.exp~\n\t\t$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'\n    hardcode_libdir_flag_spec=\n    hardcode_shlibpath_var=no\n    runpath_var='LD_RUN_PATH'\n    ;;\n\n  uts4*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  dgux*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    hardcode_libdir_flag_spec='-L$libdir'\n    hardcode_shlibpath_var=no\n    ;;\n\n  sysv4*MP*)\n    if test -d /usr/nec; then\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n      hardcode_shlibpath_var=no\n      runpath_var=LD_RUN_PATH\n      hardcode_runpath_var=yes\n      ld_shlibs=yes\n    fi\n    ;;\n\n  sysv4.2uw2*)\n    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'\n    hardcode_direct=yes\n    hardcode_minus_L=no\n    hardcode_shlibpath_var=no\n    hardcode_runpath_var=yes\n    runpath_var=LD_RUN_PATH\n    ;;\n\n  unixware7*)\n    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'\n    runpath_var='LD_RUN_PATH'\n    hardcode_shlibpath_var=no\n    ;;\n\n  *)\n    ld_shlibs=no\n    ;;\n  esac\nfi\necho \"$ac_t$ld_shlibs\" 1>&6\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nif test -z \"$NM\"; then\n  echo $ac_n \"checking for BSD-compatible nm... $ac_c\" 1>&6\n  case \"$NM\" in\n  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;; # Let the user override the test with a path.\n  *)\n    IFS=\"${IFS= \t}\"; ac_save_ifs=\"$IFS\"; IFS=\"${IFS}${PATH_SEPARATOR}\"\n    for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do\n      test -z \"$ac_dir\" && ac_dir=.\n      if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\tif ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then\n\t  NM=\"$ac_dir/nm -B\"\n\t  break\n\telif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then\n\t  NM=\"$ac_dir/nm -p\"\n\t  break\n\telse\n\t  NM=${NM=\"$ac_dir/nm\"} # keep the first match, but\n\t  continue # so that we can try to find one that supports BSD flags\n\tfi\n      fi\n    done\n    IFS=\"$ac_save_ifs\"\n    test -z \"$NM\" && NM=nm\n    ;;\n  esac\n  echo \"$ac_t$NM\" 1>&6\nfi\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\necho $ac_n \"checking command to parse $NM output... $ac_c\" 1>&6\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Transform the above into a raw symbol and a C symbol.\nsymxfrm='\\1 \\2\\3 \\3'\n\n# Transform an extracted symbol line into a proper C declaration\nglobal_symbol_to_cdecl=\"sed -n -e 's/^. .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Define system-specific variables.\ncase \"$host_os\" in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*) # Its linker distinguishes data from code symbols\n  global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern char \\1();/p' -e 's/^. .* \\(.*\\)$/extern char \\1;/p'\"\n  ;;\nirix*)\n  symcode='[BCDEGRST]'\n  ;;\nsolaris*)\n  symcode='[BDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\nif $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then\n  symcode='[ABCDGISTW]'\nfi\n\n# Try without a prefix undercore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Write the raw and C identifiers.\n  global_symbol_pipe=\"sed -n -e 's/^.*[ \t]\\($symcode\\)[ \t][ \t]*\\($ac_symprfx\\)$sympat$/$symxfrm/p'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n  $rm conftest*\n  cat > conftest.c <<EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(){}\n#ifdef __cplusplus\n}\n#endif\nmain(){nm_test_var='a';nm_test_func();return(0);}\nEOF\n\n  echo \"$progname:1635: checking if global_symbol_pipe works\" >&5\n  if { (eval echo $progname:1636: \\\"$ac_compile\\\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { echo \"$progname:1639: eval \\\"$NM conftest.$objext | $global_symbol_pipe > $nlist\\\"\" >&5; eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5\"; } && test -s \"$nlist\"; then\n\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if egrep ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif egrep ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<EOF > conftest.c\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nEOF\n\t  # Now generate the symbol file.\n\t  eval \"$global_symbol_to_cdecl\"' < \"$nlist\" >> conftest.c'\n\n\t  cat <<EOF >> conftest.c\n#if defined (__STDC__) && __STDC__\n# define lt_ptr_t void *\n#else\n# define lt_ptr_t char *\n# define const\n#endif\n\n/* The mapping between symbol names and symbols. */\nconst struct {\n  const char *name;\n  lt_ptr_t address;\n}\nlt_preloaded_symbols[] =\n{\nEOF\n\t  sed 's/^. \\(.*\\) \\(.*\\)$/  {\"\\2\", (lt_ptr_t) \\&\\2},/' < \"$nlist\" >> conftest.c\n\t  cat <<\\EOF >> conftest.c\n  {0, (lt_ptr_t) 0}\n};\n\n#ifdef __cplusplus\n}\n#endif\nEOF\n\t  # Now try linking the two files.\n\t  mv conftest.$objext conftstm.$objext\n\t  save_LIBS=\"$LIBS\"\n\t  save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$objext\"\n\t  CFLAGS=\"$CFLAGS$no_builtin_flag\"\n\t  if { (eval echo $progname:1691: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then\n\t    pipe_works=yes\n\t  else\n\t    echo \"$progname: failed program was:\" >&5\n\t    cat conftest.c >&5\n\t  fi\n\t  LIBS=\"$save_LIBS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.c >&5\n  fi\n  $rm conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    global_symbol_pipe=\n  fi\ndone\nif test \"$pipe_works\" = yes; then\n  echo \"${ac_t}ok\" 1>&6\nelse\n  echo \"${ac_t}failed\" 1>&6\nfi\n\nif test -z \"$global_symbol_pipe\"; then\n  global_symbol_to_cdecl=\nfi\n\n# Check hardcoding attributes.\necho $ac_n \"checking how to hardcode library paths into programs... $ac_c\" 1>&6\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" || \\\n   test -n \"$runpath_var\"; then\n\n  # We can hardcode non-existant directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$hardcode_shlibpath_var\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\necho \"$ac_t$hardcode_action\" 1>&6\n\n\nreload_flag=\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\necho $ac_n \"checking for $LD option to reload object files... $ac_c\" 1>&6\n# PORTME Some linkers may need a different reload flag.\nreload_flag='-r'\necho \"$ac_t$reload_flag\" 1>&6\ntest -n \"$reload_flag\" && reload_flag=\" $reload_flag\"\n\n# PORTME Fill in your ld.so characteristics\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nsys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfile_magic_cmd=\nfile_magic_test_file=\ndeplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [regex]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given egrep regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\necho $ac_n \"checking dynamic linker characteristics... $ac_c\" 1>&6\ncase \"$host_os\" in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}.so$major'\n  ;;\n\naix4*)\n  version_type=linux\n  # AIX has no versioning support, so currently we can not hardcode correct\n  # soname into executable. Probably we can add versioning support to\n  # collect2, so additional links can be useful in future.\n  # We preserve .a as extension for shared libraries though AIX4.2\n  # and later linker supports .so\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'\n  shlibpath_var=LIBPATH\n  deplibs_check_method=pass_all\n  ;;\n\namigaos*)\n  library_names_spec='$libname.ixlibrary $libname.a'\n  # Create ${libname}_ixlibrary.a entries in /sys/libs.\n  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo \"X$lib\" | $Xsed -e '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show \"(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)\"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'\n  ;;\n\nbeos*)\n  library_names_spec='${libname}.so'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  deplibs_check_method=pass_all\n  lt_cv_dlopen=\"load_add_on\"\n  lt_cv_dlopen_libs=\n  lt_cv_dlopen_self=yes\n  ;;\n\nbsdi4*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  file_magic_cmd=/usr/bin/file\n  file_magic_test_file=/shlib/libc.so\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  export_dynamic_flag_spec=-rdynamic\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw*)\n  version_type=windows\n  need_version=no\n  need_lib_prefix=no\n  if test \"$with_gcc\" = yes; then\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'\n  else\n    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'\n  fi\n  dynamic_linker='Win32 ld.exe'\n  deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n  file_magic_cmd='${OBJDUMP} -f'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  lt_cv_dlopen=\"LoadLibrary\"\n  lt_cv_dlopen_libs=\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n  \nfreebsd*)\n  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`\n  version_type=freebsd-$objformat\n  case \"$version_type\" in\n    freebsd-elf*)\n      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'\n      file_magic_cmd=/usr/bin/file\n      file_magic_test_file=`echo /usr/lib/libc.so*`\n      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      deplibs_check_method=unknown\n      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case \"$host_os\" in\n  freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  *) # from 3.2 on\n    shlibpath_overrides_runpath=no\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  dynamic_linker=\"$host_os dld.sl\"\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  shlibpath_var=SHLIB_PATH\n  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'\n  soname_spec='${libname}${release}.sl$major'\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\nirix5* | irix6*)\n  version_type=irix\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}.so.$major'\n  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'\n  case \"$host_os\" in\n  irix5*)\n    libsuff= shlibsuff=\n    # this will be overridden with pass_all, but let us keep it just in case\n    deplibs_check_method=\"file_magic ELF 32-bit MSB dynamic lib MIPS - version 1\"\n    ;;\n  *)\n    case \"$LD\" in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \") libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \") libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \") libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  file_magic_cmd=/usr/bin/file\n  file_magic_test_file=`echo /lib${libsuff}/libc.so*`\n  deplibs_check_method='pass_all'\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux-gnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n  file_magic_cmd=/usr/bin/file\n  file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`\n\n  if test -f /lib/ld.so.1; then\n    dynamic_linker='GNU ld.so'\n  else\n    # Only the GNU ld.so supports shared libraries on MkLinux.\n    case \"$host_cpu\" in\n    powerpc*) dynamic_linker=no ;;\n    *) dynamic_linker='Linux ld.so' ;;\n    esac\n  fi\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'\n    soname_spec='${libname}${release}.so$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n    need_version=no\n  fi\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nos2*)\n  libname_spec='$name'\n  need_lib_prefix=no\n  library_names_spec='$libname.dll $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_version=no\n  soname_spec='${libname}${release}.so'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  # this will be overridden with pass_all, but let us keep it just in case\n  deplibs_check_method='file_magic COFF format alpha shared library'\n  file_magic_cmd=/usr/bin/file\n  file_magic_test_file=/shlib/libc.so\n  deplibs_check_method='pass_all'\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nsco3.2v5*)\n  version_type=osf\n  soname_spec='${libname}${release}.so$major'\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  deplibs_check_method=\"file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib\"\n  file_magic_cmd=/usr/bin/file\n  file_magic_test_file=/lib/libc.so\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case \"$host_vendor\" in\n    ncr)\n      deplibs_check_method='pass_all'\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n      file_magic_cmd=/usr/bin/file\n      file_magic_test_file=`echo /usr/lib/libc.so*`\n      ;;\n  esac\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'\n  soname_spec='${libname}${release}.so$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'\n    soname_spec='$libname.so.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\necho \"$ac_t$dynamic_linker\" 1>&6\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\n# Report the final consequences.\necho \"checking if libtool supports shared libraries... $can_build_shared\" 1>&6\n\n# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in\n# configure.in, otherwise build static only libraries.\ncase \"$host_os\" in\ncygwin* | mingw* | os2*)\n  if test x$can_build_shared = xyes; then\n    test x$enable_win32_dll = xno && can_build_shared=no\n    echo \"checking if package supports dlls... $can_build_shared\" 1>&6\n  fi\n;;\nesac\n\nif test -n \"$file_magic_test_file\" && test -n \"$file_magic_cmd\"; then\n  case \"$deplibs_check_method\" in\n  \"file_magic \"*)\n    file_magic_regex=\"`expr \\\"$deplibs_check_method\\\" : \\\"file_magic \\(.*\\)\\\"`\"\n    if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n       egrep \"$file_magic_regex\" > /dev/null; then\n      :\n    else\n      cat <<EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\nEOF\n    fi ;;\n  esac\nfi\n\necho $ac_n \"checking whether to build shared libraries... $ac_c\" 1>&6\ntest \"$can_build_shared\" = \"no\" && enable_shared=no\n\n# On AIX, shared libraries and static libraries use the same namespace, and\n# are all built from PIC.\ncase \"$host_os\" in\naix3*)\n  test \"$enable_shared\" = yes && enable_static=no\n  if test -n \"$RANLIB\"; then\n    archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n    postinstall_cmds='$RANLIB $lib'\n  fi\n  ;;\n\naix4*)\n  test \"$enable_shared\" = yes && enable_static=no\n  ;;\nesac\n\necho \"$ac_t$enable_shared\" 1>&6\n\n# Make sure either enable_shared or enable_static is yes.\ntest \"$enable_shared\" = yes || enable_static=yes\n\necho \"checking whether to build static libraries... $enable_static\" 1>&6\n\nif test \"$hardcode_action\" = relink; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\necho $ac_n \"checking for objdir... $ac_c\" 1>&6\nrm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  objdir=_libs\nfi\nrmdir .libs 2>/dev/null\necho \"$ac_t$objdir\" 1>&6\n\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\nif eval \"test \\\"`echo '$''{'lt_cv_dlopen'+set}'`\\\" != set\"; then\n  lt_cv_dlopen=no lt_cv_dlopen_libs=\necho $ac_n \"checking for dlopen in -ldl\"\"... $ac_c\" 1>&6\necho \"$progname:2212: checking for dlopen in -ldl\" >&5\nac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldl  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 2220 \"ltconfig\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen();\n\nint main() {\ndlopen()\n; return 0; }\nEOF\nif { (eval echo $progname:2233: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dlopen\"\"... $ac_c\" 1>&6\necho \"$progname:2252: checking for dlopen\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_func_dlopen'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 2257 \"ltconfig\"\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char dlopen(); below.  */\n#include <assert.h>\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen();\n\nint main() {\n\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_dlopen) || defined (__stub___dlopen)\nchoke me\n#else\ndlopen();\n#endif\n\n; return 0; }\nEOF\nif { (eval echo $progname:2282: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_func_dlopen=yes\"\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_func_dlopen=no\"\nfi\nrm -f conftest*\nfi\nif eval \"test \\\"`echo '$ac_cv_func_'dlopen`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dlopen\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for dld_link in -ldld\"\"... $ac_c\" 1>&6\necho \"$progname:2299: checking for dld_link in -ldld\" >&5\nac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldld  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 2307 \"ltconfig\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link();\n\nint main() {\ndld_link()\n; return 0; }\nEOF\nif { (eval echo $progname:2320: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for shl_load\"\"... $ac_c\" 1>&6\necho \"$progname:2339: checking for shl_load\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_func_shl_load'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 2344 \"ltconfig\"\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char shl_load(); below.  */\n#include <assert.h>\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load();\n\nint main() {\n\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined (__stub_shl_load) || defined (__stub___shl_load)\nchoke me\n#else\nshl_load();\n#endif\n\n; return 0; }\nEOF\nif { (eval echo $progname:2369: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_func_shl_load=yes\"\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_func_shl_load=no\"\nfi\nrm -f conftest*\nfi\n\nif eval \"test \\\"`echo '$ac_cv_func_'shl_load`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"shl_load\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\necho $ac_n \"checking for shl_load in -ldld\"\"... $ac_c\" 1>&6\necho \"$progname:2387: checking for shl_load in -ldld\" >&5\nac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`\nif eval \"test \\\"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  ac_save_LIBS=\"$LIBS\"\nLIBS=\"-ldld  $LIBS\"\ncat > conftest.$ac_ext <<EOF\n#line 2395 \"ltconfig\"\n#include \"confdefs.h\"\n/* Override any gcc2 internal prototype to avoid an error.  */\n/* We use char because int might match the return type of a gcc2\n    builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load();\n\nint main() {\nshl_load()\n; return 0; }\nEOF\nif { (eval echo $progname:2409: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=yes\"\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_lib_$ac_lib_var=no\"\nfi\nrm -f conftest*\nLIBS=\"$ac_save_LIBS\"\n\nfi\nif eval \"test \\\"`echo '$ac_cv_lib_'$ac_lib_var`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\n\n\nfi\n\n    \nfi\n\n  \nfi\n\n\nfi\n\nfi\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  fi\n\n  case \"$lt_cv_dlopen\" in\n  dlopen)\nfor ac_hdr in dlfcn.h; do\nac_safe=`echo \"$ac_hdr\" | sed 'y%./+-%__p_%'`\necho $ac_n \"checking for $ac_hdr\"\"... $ac_c\" 1>&6\necho \"$progname:2452: checking for $ac_hdr\" >&5\nif eval \"test \\\"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\\\" = set\"; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  cat > conftest.$ac_ext <<EOF\n#line 2457 \"ltconfig\"\n#include <$ac_hdr>\nint fnord = 0;\nEOF\nac_try=\"$ac_compile >/dev/null 2>conftest.out\"\n{ (eval echo $progname:2462: \\\"$ac_try\\\") 1>&5; (eval $ac_try) 2>&5; }\nac_err=`grep -v '^ *+' conftest.out | grep -v \"^conftest.${ac_ext}\\$\"`\nif test -z \"$ac_err\"; then\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=yes\"\nelse\n  echo \"$ac_err\" >&5\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -rf conftest*\n  eval \"ac_cv_header_$ac_safe=no\"\nfi\nrm -f conftest*\nfi\nif eval \"test \\\"`echo '$ac_cv_header_'$ac_safe`\\\" = yes\"; then\n  echo \"$ac_t\"\"yes\" 1>&6\nelse\n  echo \"$ac_t\"\"no\" 1>&6\nfi\ndone\n\n    if test \"x$ac_cv_header_dlfcn_h\" = xyes; then\n      CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n    fi\n    eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n  echo $ac_n \"checking whether a program can dlopen itself\"\"... $ac_c\" 1>&6\necho \"$progname:2490: checking whether a program can dlopen itself\" >&5\nif test \"${lt_cv_dlopen_self+set}\" = set; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test \"$cross_compiling\" = yes; then\n    lt_cv_dlopen_self=cross\n  else\n    cat > conftest.c <<EOF\n#line 2498 \"ltconfig\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n# define LTDL_GLOBAL\tRTLD_GLOBAL\n#else\n# ifdef DL_GLOBAL\n#  define LTDL_GLOBAL\tDL_GLOBAL\n# else\n#  define LTDL_GLOBAL\t0\n# endif\n#endif\n\n/* We may have to define LTDL_LAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LTDL_LAZY_OR_NOW\n# ifdef RTLD_LAZY\n#  define LTDL_LAZY_OR_NOW\tRTLD_LAZY\n# else\n#  ifdef DL_LAZY\n#   define LTDL_LAZY_OR_NOW\tDL_LAZY\n#  else\n#   ifdef RTLD_NOW\n#    define LTDL_LAZY_OR_NOW\tRTLD_NOW\n#   else\n#    ifdef DL_NOW\n#     define LTDL_LAZY_OR_NOW\tDL_NOW\n#    else\n#     define LTDL_LAZY_OR_NOW\t0\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\nfnord() { int i=42;}\nmain() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);\n    if(self) { ptr1=dlsym(self,\"fnord\"); ptr2=dlsym(self,\"_fnord\");\n\t       if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } \n\nEOF\nif { (eval echo $progname:2544: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null\nthen\n  lt_cv_dlopen_self=yes\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -fr conftest*\n  lt_cv_dlopen_self=no\nfi\nrm -fr conftest*\nfi\n\nfi\n\necho \"$ac_t\"\"$lt_cv_dlopen_self\" 1>&6\n\n  if test \"$lt_cv_dlopen_self\" = yes; then\n    LDFLAGS=\"$LDFLAGS $link_static_flag\"\n  echo $ac_n \"checking whether a statically linked program can dlopen itself\"\"... $ac_c\" 1>&6\necho \"$progname:2563: checking whether a statically linked program can dlopen itself\" >&5\nif test \"${lt_cv_dlopen_self_static+set}\" = set; then\n  echo $ac_n \"(cached) $ac_c\" 1>&6\nelse\n  if test \"$cross_compiling\" = yes; then\n    lt_cv_dlopen_self_static=cross\n  else\n    cat > conftest.c <<EOF\n#line 2571 \"ltconfig\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n# define LTDL_GLOBAL\tRTLD_GLOBAL\n#else\n# ifdef DL_GLOBAL\n#  define LTDL_GLOBAL\tDL_GLOBAL\n# else\n#  define LTDL_GLOBAL\t0\n# endif\n#endif\n\n/* We may have to define LTDL_LAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LTDL_LAZY_OR_NOW\n# ifdef RTLD_LAZY\n#  define LTDL_LAZY_OR_NOW\tRTLD_LAZY\n# else\n#  ifdef DL_LAZY\n#   define LTDL_LAZY_OR_NOW\tDL_LAZY\n#  else\n#   ifdef RTLD_NOW\n#    define LTDL_LAZY_OR_NOW\tRTLD_NOW\n#   else\n#    ifdef DL_NOW\n#     define LTDL_LAZY_OR_NOW\tDL_NOW\n#    else\n#     define LTDL_LAZY_OR_NOW\t0\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\nfnord() { int i=42;}\nmain() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);\n    if(self) { ptr1=dlsym(self,\"fnord\"); ptr2=dlsym(self,\"_fnord\");\n    if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } \n\nEOF\nif { (eval echo $progname:2617: \\\"$ac_link\\\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null\nthen\n  lt_cv_dlopen_self_static=yes\nelse\n  echo \"$progname: failed program was:\" >&5\n  cat conftest.$ac_ext >&5\n  rm -fr conftest*\n  lt_cv_dlopen_self_static=no\nfi\nrm -fr conftest*\nfi\n\nfi\n\necho \"$ac_t\"\"$lt_cv_dlopen_self_static\" 1>&6\nfi\n    ;;\n  esac\n\n  case \"$lt_cv_dlopen_self\" in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case \"$lt_cv_dlopen_self_static\" in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n# Copy echo and quote the copy, instead of the original, because it is\n# used later.\nltecho=\"$echo\"\nif test \"X$ltecho\" = \"X$CONFIG_SHELL $0 --fallback-echo\"; then\n   ltecho=\"$CONFIG_SHELL \\$0 --fallback-echo\"\nfi\nLTSHELL=\"$SHELL\"\n\nLTCONFIG_VERSION=\"$VERSION\"\n\n# Only quote variables if we're using ltmain.sh.\ncase \"$ltmain\" in\n*.sh)\n  # Now quote all the things that may contain metacharacters.\n  for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \\\n    old_LD old_LDFLAGS old_LIBS \\\n    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \\\n    AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \\\n    reload_flag reload_cmds wl \\\n    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \\\n    thread_safe_flag_spec whole_archive_flag_spec libname_spec \\\n    library_names_spec soname_spec \\\n    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \\\n    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \\\n    file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \\\n    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \\\n    hardcode_libdir_flag_spec hardcode_libdir_separator  \\\n    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \\\n    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do\n\n    case \"$var\" in\n    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \\\n    old_postinstall_cmds | old_postuninstall_cmds | \\\n    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \\\n    postinstall_cmds | postuninstall_cmds | \\\n    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)\n      # Double-quote double-evaled strings.\n      eval \"$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$double_quote_subst\\\" -e \\\"\\$sed_quote_subst\\\" -e \\\"\\$delay_variable_subst\\\"\\`\\\\\\\"\"\n      ;;\n    *)\n      eval \"$var=\\\\\\\"\\`\\$echo \\\"X\\$$var\\\" | \\$Xsed -e \\\"\\$sed_quote_subst\\\"\\`\\\\\\\"\"\n      ;;\n    esac\n  done\n\n  case \"$ltecho\" in\n  *'\\$0 --fallback-echo\"')\n    ltecho=`$echo \"X$ltecho\" | $Xsed -e 's/\\\\\\\\\\\\\\$0 --fallback-echo\"$/$0 --fallback-echo\"/'`\n    ;;\n  esac\n\n  trap \"$rm \\\"$ofile\\\"; exit 1\" 1 2 15\n  echo \"creating $ofile\"\n  $rm \"$ofile\"\n  cat <<EOF > \"$ofile\"\n#! $SHELL\n\n# `$echo \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)\n# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.\n#\n# Copyright (C) 1996-1999 Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"sed -e s/^X//\"\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \"X\\${CDPATH+set}\" = Xset; then CDPATH=:; export CDPATH; fi\n\n### BEGIN LIBTOOL CONFIG\nEOF\n  cfgfile=\"$ofile\"\n  ;;\n\n*)\n  # Double-quote the variables that need it (for aesthetics).\n  for var in old_CC old_CFLAGS old_CPPFLAGS \\\n    old_LD old_LDFLAGS old_LIBS \\\n    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do\n    eval \"$var=\\\\\\\"\\$var\\\\\\\"\"\n  done\n\n  # Just create a config file.\n  cfgfile=\"$ofile.cfg\"\n  trap \"$rm \\\"$cfgfile\\\"; exit 1\" 1 2 15\n  echo \"creating $cfgfile\"\n  $rm \"$cfgfile\"\n  cat <<EOF > \"$cfgfile\"\n# `$echo \"$cfgfile\" | sed 's%^.*/%%'` - Libtool configuration file.\n# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)\nEOF\n  ;;\nesac\n\ncat <<EOF >> \"$cfgfile\"\n# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n#\n# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\\\\n# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\\\\n# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\\\\n# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\\\\n#   $0$ltconfig_args\n#\n# Compiler and other test output produced by $progname, useful for\n# debugging $progname, is in ./config.log if it exists.\n\n# The version of $progname that generated this script.\nLTCONFIG_VERSION=$LTCONFIG_VERSION\n\n# Shell to use when invoking shell scripts.\nSHELL=$LTSHELL\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\n\n# An echo program that does not interpret backslashes.\necho=$ltecho\n\n# The archiver.\nAR=$AR\n\n# The default C compiler.\nCC=$CC\n\n# The linker used to build libraries.\nLD=$LD\n\n# Whether we need hard or soft links.\nLN_S=$LN_S\n\n# A BSD-compatible nm program.\nNM=$NM\n\n# Used on cygwin: DLL creation program.\nDLLTOOL=\"$DLLTOOL\"\n\n# Used on cygwin: object dumper.\nOBJDUMP=\"$OBJDUMP\"\n\n# Used on cygwin: assembler.\nAS=\"$AS\"\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# How to create reloadable object files.\nreload_flag=$reload_flag\nreload_cmds=$reload_cmds\n\n# How to pass a linker flag through the compiler.\nwl=$wl\n\n# Object file suffix (normally \"o\").\nobjext=\"$objext\"\n\n# Old archive suffix (normally \"a\").\nlibext=\"$libext\"\n\n# Executable file suffix (normally \"\").\nexeext=\"$exeext\"\n\n# Additional compiler flags for building library objects.\npic_flag=$pic_flag\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$compiler_c_o\n\n# Can we write directly to a .lo ?\ncompiler_o_lo=$compiler_o_lo\n\n# Must we lock files when doing compilation ?\nneed_locks=$need_locks\n\n# Do we need the lib prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Whether dlopen is supported.\ndlopen=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$link_static_flag\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$no_builtin_flag\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$whole_archive_flag_spec\n\n# Compiler flag to generate thread-safe objects.\nthread_safe_flag_spec=$thread_safe_flag_spec\n\n# Library versioning type.\nversion_type=$version_type\n\n# Format of library name prefix.\nlibname_spec=$libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME.\nlibrary_names_spec=$library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$soname_spec\n\n# Commands used to build and install an old-style archive.\nRANLIB=$RANLIB\nold_archive_cmds=$old_archive_cmds\nold_postinstall_cmds=$old_postinstall_cmds\nold_postuninstall_cmds=$old_postuninstall_cmds\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$old_archive_from_new_cmds\n\n# Commands used to build and install a shared archive.\narchive_cmds=$archive_cmds\narchive_expsym_cmds=$archive_expsym_cmds\npostinstall_cmds=$postinstall_cmds\npostuninstall_cmds=$postuninstall_cmds\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$deplibs_check_method\n\n# Command to use when deplibs_check_method == file_magic.\nfile_magic_cmd=$file_magic_cmd\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$allow_undefined_flag\n\n# Flag that forces no undefined symbols.\nno_undefined_flag=$no_undefined_flag\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$finish_cmds\n\n# Same as above, but a single script fragment to be evaled but not shown.\nfinish_eval=$finish_eval\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration\nglobal_symbol_to_cdecl=$global_symbol_to_cdecl\n\n# This is the shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# This is the shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec=$hardcode_libdir_flag_spec\n\n# Whether we need a single -rpath flag with a separated argument.\nhardcode_libdir_separator=$hardcode_libdir_separator\n\n# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the\n# resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to yes if using the -LDIR flag during linking hardcodes DIR into the\n# resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into\n# the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Compile-time system search path for libraries\nsys_lib_search_path_spec=$sys_lib_search_path_spec\n\n# Run-time system search path for libraries\nsys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=\"$fix_srcfile_path\"\n\n# Set to yes if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$include_expsyms\n\nEOF\n\ncase \"$ltmain\" in\n*.sh)\n  echo '### END LIBTOOL CONFIG' >> \"$ofile\"\n  echo >> \"$ofile\"\n  case \"$host_os\" in\n  aix3*)\n    cat <<\\EOF >> \"$ofile\"\n\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\nEOF\n    ;;\n  esac\n\n  # Append the ltmain.sh script.\n  sed '$q' \"$ltmain\" >> \"$ofile\" || (rm -f \"$ofile\"; exit 1)\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n\n  chmod +x \"$ofile\"\n  ;;\n\n*)\n  # Compile the libtool program.\n  echo \"FIXME: would compile $ltmain\"\n  ;;\nesac\n\ntest -n \"$cache_file\" || exit 0\n\n# AC_CACHE_SAVE\ntrap '' 1 2 15\ncat > confcache <<\\EOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs.  It is not useful on other systems.\n# If it contains results you don't want to keep, you may remove or edit it.\n#\n# By default, configure uses ./config.cache as the cache file,\n# creating it if it does not exist already.  You can give configure\n# the --cache-file=FILE option to use a different cache file; that is\n# what configure does when it calls configure scripts in\n# subdirectories, so they share the cache.\n# Giving --cache-file=/dev/null disables caching, for debugging configure.\n# config.status only pays attention to the cache file if you give it the\n# --recheck option to rerun configure.\n#\nEOF\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, don't put newlines in cache variables' values.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(set) 2>&1 |\n  case `(ac_space=' '; set | grep ac_space) 2>&1` in\n  *ac_space=\\ *)\n    # `set' does not quote correctly, so add quotes (double-quote substitution\n    # turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\).\n    sed -n \\\n      -e \"s/'/'\\\\\\\\''/g\" \\\n      -e \"s/^\\\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\\\)=\\\\(.*\\\\)/\\\\1=\\${\\\\1='\\\\2'}/p\"\n    ;;\n  *)\n    # `set' quotes correctly as required by POSIX, so do not add quotes.\n    sed -n -e 's/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=${\\1=\\2}/p'\n    ;;\n  esac >> confcache\nif cmp -s $cache_file confcache; then\n  :\nelse\n  if test -w $cache_file; then\n    echo \"updating cache $cache_file\"\n    cat confcache > $cache_file\n  else\n    echo \"not updating unwritable cache $cache_file\"\n  fi\nfi\nrm -f confcache\n\nexit 0\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n"
  },
  {
    "path": "src/fnv/ltmain.sh",
    "content": "# ltmain.sh - Provide generalized library-building support services.\n# NOTE: Changing this file will not affect anything until you rerun configure.\n#\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001\n# Free Software Foundation, Inc.\n# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Check that we have a working $echo.\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`($echo '\\t') 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $echo works!\n  :\nelse\n  # Restart under the correct shell, and then maybe $echo will work.\n  exec $SHELL \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit 0\nfi\n\n# The name of this program.\nprogname=`$echo \"$0\" | sed 's%^.*/%%'`\nmodename=\"$progname\"\n\n# Constants.\nPROGRAM=ltmain.sh\nPACKAGE=libtool\nVERSION=1.4.2a\nTIMESTAMP=\" (1.922.2.79 2001/11/28 21:50:31)\"\n\ndefault_mode=\nhelp=\"Try \\`$progname --help' for more information.\"\nmagic=\"%%%MAGIC variable%%%\"\nmkdir=\"mkdir\"\nmv=\"mv -f\"\nrm=\"rm -f\"\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e 1s/^X//'\nsed_quote_subst='s/\\([\\\\`\\\\\"$\\\\\\\\]\\)/\\\\\\1/g'\nSP2NL='tr \\040 \\012'\nNL2SP='tr \\015\\012 \\040\\040'\n\n# NLS nuisances.\n# Only set LANG and LC_ALL to C if already set.\n# These must not be set unconditionally because not all systems understand\n# e.g. LANG=C (notably SCO).\n# We save the old values to restore during execute mode.\nif test \"${LC_ALL+set}\" = set; then\n  save_LC_ALL=\"$LC_ALL\"; LC_ALL=C; export LC_ALL\nfi\nif test \"${LANG+set}\" = set; then\n  save_LANG=\"$LANG\"; LANG=C; export LANG\nfi\n\n# Make sure IFS has a sensible default\n: ${IFS=\" \t\"}\n\nif test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n  echo \"$modename: not configured to build any kind of library\" 1>&2\n  echo \"Fatal configuration error.  See the $PACKAGE docs for more information.\" 1>&2\n  exit 1\nfi\n\n# Global variables.\nmode=$default_mode\nnonopt=\nprev=\nprevopt=\nrun=\nshow=\"$echo\"\nshow_help=\nexecute_dlfiles=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\n\n# Parse our command line options once, thoroughly.\nwhile test $# -gt 0\ndo\n  arg=\"$1\"\n  shift\n\n  case $arg in\n  -*=*) optarg=`$echo \"X$arg\" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) optarg= ;;\n  esac\n\n  # If the previous option needs an argument, assign it.\n  if test -n \"$prev\"; then\n    case $prev in\n    execute_dlfiles)\n      execute_dlfiles=\"$execute_dlfiles $arg\"\n      ;;\n    *)\n      eval \"$prev=\\$arg\"\n      ;;\n    esac\n\n    prev=\n    prevopt=\n    continue\n  fi\n\n  # Have we seen a non-optional argument yet?\n  case $arg in\n  --help)\n    show_help=yes\n    ;;\n\n  --version)\n    echo \"$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP\"\n    exit 0\n    ;;\n\n  --config)\n    sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0\n    exit 0\n    ;;\n\n  --debug)\n    echo \"$progname: enabling shell trace mode\"\n    set -x\n    ;;\n\n  --dry-run | -n)\n    run=:\n    ;;\n\n  --features)\n    echo \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n    exit 0\n    ;;\n\n  --finish) mode=\"finish\" ;;\n\n  --mode) prevopt=\"--mode\" prev=mode ;;\n  --mode=*) mode=\"$optarg\" ;;\n\n  --preserve-dup-deps) duplicate_deps=\"yes\" ;;\n\n  --quiet | --silent)\n    show=:\n    ;;\n\n  -dlopen)\n    prevopt=\"-dlopen\"\n    prev=execute_dlfiles\n    ;;\n\n  -*)\n    $echo \"$modename: unrecognized option \\`$arg'\" 1>&2\n    $echo \"$help\" 1>&2\n    exit 1\n    ;;\n\n  *)\n    nonopt=\"$arg\"\n    break\n    ;;\n  esac\ndone\n\nif test -n \"$prevopt\"; then\n  $echo \"$modename: option \\`$prevopt' requires an argument\" 1>&2\n  $echo \"$help\" 1>&2\n  exit 1\nfi\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\nif test -z \"$show_help\"; then\n\n  # Infer the operation mode.\n  if test -z \"$mode\"; then\n    case $nonopt in\n    *cc | *++ | gcc* | *-gcc*)\n      mode=link\n      for arg\n      do\n\tcase $arg in\n\t-c)\n\t   mode=compile\n\t   break\n\t   ;;\n\tesac\n      done\n      ;;\n    *db | *dbx | *strace | *truss)\n      mode=execute\n      ;;\n    *install*|cp|mv)\n      mode=install\n      ;;\n    *rm)\n      mode=uninstall\n      ;;\n    *)\n      # If we have no mode, but dlfiles were specified, then do execute mode.\n      test -n \"$execute_dlfiles\" && mode=execute\n\n      # Just use the default operation mode.\n      if test -z \"$mode\"; then\n\tif test -n \"$nonopt\"; then\n\t  $echo \"$modename: warning: cannot infer operation mode from \\`$nonopt'\" 1>&2\n\telse\n\t  $echo \"$modename: warning: cannot infer operation mode without MODE-ARGS\" 1>&2\n\tfi\n      fi\n      ;;\n    esac\n  fi\n\n  # Only execute mode is allowed to have -dlopen flags.\n  if test -n \"$execute_dlfiles\" && test \"$mode\" != execute; then\n    $echo \"$modename: unrecognized option \\`-dlopen'\" 1>&2\n    $echo \"$help\" 1>&2\n    exit 1\n  fi\n\n  # Change the help message to a mode-specific one.\n  generic_help=\"$help\"\n  help=\"Try \\`$modename --help --mode=$mode' for more information.\"\n\n  # These modes are in order of execution frequency so that they run quickly.\n  case $mode in\n  # libtool compile mode\n  compile)\n    modename=\"$modename: compile\"\n    # Get the compilation command and the source file.\n    base_compile=\n    prev=\n    lastarg=\n    srcfile=\"$nonopt\"\n    suppress_output=\n\n    user_target=no\n    for arg\n    do\n      case $prev in\n      \"\") ;;\n      xcompiler)\n\t# Aesthetically quote the previous argument.\n\tprev=\n\tlastarg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\n\tcase $arg in\n\t# Double-quote args containing other shell metacharacters.\n\t# Many Bourne shells cannot handle close brackets correctly\n\t# in scan sets, so we specify it separately.\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\n\t# Add the previous argument to base_compile.\n\tif test -z \"$base_compile\"; then\n\t  base_compile=\"$lastarg\"\n\telse\n\t  base_compile=\"$base_compile $lastarg\"\n\tfi\n\tcontinue\n\t;;\n      esac\n\n      # Accept any command-line options.\n      case $arg in\n      -o)\n\tif test \"$user_target\" != \"no\"; then\n\t  $echo \"$modename: you cannot specify \\`-o' more than once\" 1>&2\n\t  exit 1\n\tfi\n\tuser_target=next\n\t;;\n\n      -static)\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Wc,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"s/^-Wc,//\"`\n\tlastarg=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor arg in $args; do\n\t  IFS=\"$save_ifs\"\n\n\t  # Double-quote args containing other shell metacharacters.\n\t  # Many Bourne shells cannot handle close brackets correctly\n\t  # in scan sets, so we specify it separately.\n\t  case $arg in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    arg=\"\\\"$arg\\\"\"\n\t    ;;\n\t  esac\n\t  lastarg=\"$lastarg $arg\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tlastarg=`$echo \"X$lastarg\" | $Xsed -e \"s/^ //\"`\n\n\t# Add the arguments to base_compile.\n\tif test -z \"$base_compile\"; then\n\t  base_compile=\"$lastarg\"\n\telse\n\t  base_compile=\"$base_compile $lastarg\"\n\tfi\n\tcontinue\n\t;;\n      esac\n\n      case $user_target in\n      next)\n\t# The next one is the -o target name\n\tuser_target=yes\n\tcontinue\n\t;;\n      yes)\n\t# We got the output file\n\tuser_target=set\n\tlibobj=\"$arg\"\n\tcontinue\n\t;;\n      esac\n\n      # Accept the current argument as the source file.\n      lastarg=\"$srcfile\"\n      srcfile=\"$arg\"\n\n      # Aesthetically quote the previous argument.\n\n      # Backslashify any backslashes, double quotes, and dollar signs.\n      # These are the only characters that are still specially\n      # interpreted inside of double-quoted scrings.\n      lastarg=`$echo \"X$lastarg\" | $Xsed -e \"$sed_quote_subst\"`\n\n      # Double-quote args containing other shell metacharacters.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      case $lastarg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\tlastarg=\"\\\"$lastarg\\\"\"\n\t;;\n      esac\n\n      # Add the previous argument to base_compile.\n      if test -z \"$base_compile\"; then\n\tbase_compile=\"$lastarg\"\n      else\n\tbase_compile=\"$base_compile $lastarg\"\n      fi\n    done\n\n    case $user_target in\n    set)\n      ;;\n    no)\n      # Get the name of the library object.\n      libobj=`$echo \"X$srcfile\" | $Xsed -e 's%^.*/%%'`\n      ;;\n    *)\n      $echo \"$modename: you must specify a target with \\`-o'\" 1>&2\n      exit 1\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    xform='[cCFSfmso]'\n    case $libobj in\n    *.ada) xform=ada ;;\n    *.adb) xform=adb ;;\n    *.ads) xform=ads ;;\n    *.asm) xform=asm ;;\n    *.c++) xform=c++ ;;\n    *.cc) xform=cc ;;\n    *.cpp) xform=cpp ;;\n    *.cxx) xform=cxx ;;\n    *.f90) xform=f90 ;;\n    *.for) xform=for ;;\n    esac\n\n    libobj=`$echo \"X$libobj\" | $Xsed -e \"s/\\.$xform$/.lo/\"`\n\n    case $libobj in\n    *.lo) obj=`$echo \"X$libobj\" | $Xsed -e \"$lo2o\"` ;;\n    *)\n      $echo \"$modename: cannot determine name of library object from \\`$libobj'\" 1>&2\n      exit 1\n      ;;\n    esac\n\n    if test -z \"$base_compile\"; then\n      $echo \"$modename: you must specify a compilation command\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $libobj\"\n    else\n      removelist=\"$libobj\"\n    fi\n\n    $run $rm $removelist\n    trap \"$run $rm $removelist; exit 1\" 1 2 15\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2*)\n      pic_mode=default\n      ;;\n    esac\n    if test $pic_mode = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$echo \"X$srcfile\" | $Xsed -e 's%^.*/%%' -e 's%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n      removelist=\"$removelist $output_obj $lockfile\"\n      trap \"$run $rm $removelist; exit 1\" 1 2 15\n    else\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $run ln \"$0\" \"$lockfile\" 2>/dev/null; do\n\t$show \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\techo \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n      echo $srcfile > \"$lockfile\"\n    fi\n\n    if test -n \"$fix_srcfile_path\"; then\n      eval srcfile=\\\"$fix_srcfile_path\\\"\n    fi\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\t# All platforms use -DPIC, to notify preprocessed assembler code.\n\tcommand=\"$base_compile $srcfile $pic_flag -DPIC\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $srcfile\"\n      fi\n      if test \"$build_old_libs\" = yes; then\n\tlo_libobj=\"$libobj\"\n\tdir=`$echo \"X$libobj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$dir\" = \"X$libobj\"; then\n\t  dir=\"$objdir\"\n\telse\n\t  dir=\"$dir/$objdir\"\n\tfi\n\tlibobj=\"$dir/\"`$echo \"X$libobj\" | $Xsed -e 's%^.*/%%'`\n\n\tif test -d \"$dir\"; then\n\t  $show \"$rm $libobj\"\n\t  $run $rm $libobj\n\telse\n\t  $show \"$mkdir $dir\"\n\t  $run $mkdir $dir\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d $dir; then\n\t    exit $status\n\t  fi\n\tfi\n      fi\n      if test \"$compiler_o_lo\" = yes; then\n\toutput_obj=\"$libobj\"\n\tcommand=\"$command -o $output_obj\"\n      elif test \"$compiler_c_o\" = yes; then\n\toutput_obj=\"$obj\"\n\tcommand=\"$command -o $output_obj\"\n      fi\n\n      $run $rm \"$output_obj\"\n      $show \"$command\"\n      if $run eval \"$command\"; then :\n      else\n\ttest -n \"$output_obj\" && $run $rm $removelist\n\texit 1\n      fi\n\n      if test \"$need_locks\" = warn &&\n\t test x\"`cat $lockfile 2>/dev/null`\" != x\"$srcfile\"; then\n\techo \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test x\"$output_obj\" != x\"$libobj\"; then\n\t$show \"$mv $output_obj $libobj\"\n\tif $run $mv $output_obj $libobj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # If we have no pic_flag, then copy the object into place and finish.\n      if (test -z \"$pic_flag\" || test \"$pic_mode\" != default) &&\n\t test \"$build_old_libs\" = yes; then\n\t# Rename the .lo from within objdir to obj\n\tif test -f $obj; then\n\t  $show $rm $obj\n\t  $run $rm $obj\n\tfi\n\n\t$show \"$mv $libobj $obj\"\n\tif $run $mv $libobj $obj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n\n\txdir=`$echo \"X$obj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$xdir\" = \"X$obj\"; then\n\t  xdir=\".\"\n\telse\n\t  xdir=\"$xdir\"\n\tfi\n\tbaseobj=`$echo \"X$obj\" | $Xsed -e \"s%.*/%%\"`\n\tlibobj=`$echo \"X$baseobj\" | $Xsed -e \"$o2lo\"`\n\t# Now arrange that obj and lo_libobj become the same file\n\t$show \"(cd $xdir && $LN_S $baseobj $libobj)\"\n\tif $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then\n\t  # Unlock the critical section if it was locked\n\t  if test \"$need_locks\" != no; then\n\t    $run $rm \"$lockfile\"\n\t  fi\n\t  exit 0\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # Allow error messages only from the first compilation.\n      suppress_output=' >/dev/null 2>&1'\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $srcfile\"\n      else\n\t# All platforms use -DPIC, to notify preprocessed assembler code.\n\tcommand=\"$base_compile $srcfile $pic_flag -DPIC\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tcommand=\"$command -o $obj\"\n\toutput_obj=\"$obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      command=\"$command$suppress_output\"\n      $run $rm \"$output_obj\"\n      $show \"$command\"\n      if $run eval \"$command\"; then :\n      else\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      if test \"$need_locks\" = warn &&\n\t test x\"`cat $lockfile 2>/dev/null`\" != x\"$srcfile\"; then\n\techo \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$run $rm $removelist\n\texit 1\n      fi\n\n      # Just move the object if needed\n      if test x\"$output_obj\" != x\"$obj\"; then\n\t$show \"$mv $output_obj $obj\"\n\tif $run $mv $output_obj $obj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n\n      # Create an invalid libtool object if no PIC, so that we do not\n      # accidentally link it into a program.\n      if test \"$build_libtool_libs\" != yes; then\n\t$show \"echo timestamp > $libobj\"\n\t$run eval \"echo timestamp > \\$libobj\" || exit $?\n      else\n\t# Move the .lo from within objdir\n\t$show \"$mv $libobj $lo_libobj\"\n\tif $run $mv $libobj $lo_libobj; then :\n\telse\n\t  error=$?\n\t  $run $rm $removelist\n\t  exit $error\n\tfi\n      fi\n    fi\n\n    # Unlock the critical section if it was locked\n    if test \"$need_locks\" != no; then\n      $run $rm \"$lockfile\"\n    fi\n\n    exit 0\n    ;;\n\n  # libtool link mode\n  link | relink)\n    modename=\"$modename: link\"\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invokation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=\"$nonopt\"\n    compile_command=\"$nonopt\"\n    finalize_command=\"$nonopt\"\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n\n    avoid_version=no\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -all-static | -static)\n\tif test \"X$arg\" = \"X-all-static\"; then\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    $echo \"$modename: warning: complete static linking is impossible in this configuration\" 1>&2\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\telse\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\tfi\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tprefer_static_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test $# -gt 0; do\n      arg=\"$1\"\n      shift\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\tqarg=\\\"`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\\\" ### testsuite: skip nested quoting test\n\t;;\n      *) qarg=$arg ;;\n      esac\n      libtool_args=\"$libtool_args $qarg\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  compile_command=\"$compile_command @OUTPUT@\"\n\t  finalize_command=\"$finalize_command @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    compile_command=\"$compile_command @SYMFILE@\"\n\t    finalize_command=\"$finalize_command @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      dlfiles=\"$dlfiles $arg\"\n\t    else\n\t      dlprefiles=\"$dlprefiles $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  if test ! -f \"$arg\"; then\n\t    $echo \"$modename: symbol file \\`$arg' does not exist\"\n\t    exit 1\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    $echo \"$modename: only absolute run-paths are allowed\" 1>&2\n\t    exit 1\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) rpath=\"$rpath $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) xrpath=\"$xrpath $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\txcompiler)\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  compile_command=\"$compile_command $qarg\"\n\t  finalize_command=\"$finalize_command $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $wl$qarg\"\n\t  prev=\n\t  compile_command=\"$compile_command $wl$qarg\"\n\t  finalize_command=\"$finalize_command $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n $prev\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  compile_command=\"$compile_command $link_static_flag\"\n\t  finalize_command=\"$finalize_command $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\t$echo \"$modename: \\`-allow-undefined' is deprecated because it is the default\" 1>&2\n\tcontinue\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  $echo \"$modename: more than one -exported-symbols argument is not allowed\"\n\t  exit 1\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | no/*-*-nonstopux*)\n\t  compile_command=\"$compile_command $arg\"\n\t  finalize_command=\"$finalize_command $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tdir=`$echo \"X$arg\" | $Xsed -e 's/^-L//'`\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  if test -z \"$absdir\"; then\n\t    $echo \"$modename: cannot determine absolute directory name of \\`$dir'\" 1>&2\n\t    exit 1\n\t  fi\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"*) ;;\n\t*)\n\t  deplibs=\"$deplibs -L$dir\"\n\t  lib_search_path=\"$lib_search_path $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  *) dllsearchpath=\"$dllsearchpath:$dir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-pw32* | *-*-beos*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-mingw* | *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\t elif test \"X$arg\" = \"X-lc_r\"; then\n\t  case $host in\n\t *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc_r directly, use -pthread flag.\n\t    continue\n\t    ;;\n\t  esac\n\tfi\n\tdeplibs=\"$deplibs $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # in order for the loader to find any dlls it needs.\n\t  $echo \"$modename: warning: \\`-no-install' is ignored for $host\" 1>&2\n\t  $echo \"$modename: warning: assuming \\`-no-fast-install' instead\" 1>&2\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tdir=`$echo \"X$arg\" | $Xsed -e 's/^-R//'`\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  $echo \"$modename: only absolute run-paths are allowed\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) xrpath=\"$xrpath $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -static)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -Wc,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\" -e 's/^-Wc,//'`\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n\t  case $flag in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    flag=\"\\\"$flag\\\"\"\n\t    ;;\n\t  esac\n\t  arg=\"$arg $wl$flag\"\n\t  compiler_flags=\"$compiler_flags $flag\"\n\tdone\n\tIFS=\"$save_ifs\"\n\targ=`$echo \"X$arg\" | $Xsed -e \"s/^ //\"`\n\t;;\n\n      -Wl,*)\n\targs=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\" -e 's/^-Wl,//'`\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n\t  case $flag in\n\t    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t    flag=\"\\\"$flag\\\"\"\n\t    ;;\n\t  esac\n\t  arg=\"$arg $wl$flag\"\n\t  compiler_flags=\"$compiler_flags $wl$flag\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tdone\n\tIFS=\"$save_ifs\"\n\targ=`$echo \"X$arg\" | $Xsed -e \"s/^ //\"`\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      # Some other compiler flag.\n      -* | +*)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\targ=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\tcase $arg in\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\t;;\n\n      *.lo | *.$objext)\n\t# A library or standard object.\n\tif test \"$prev\" = dlfiles; then\n\t  # This file was specified with -dlopen.\n\t  if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t    dlfiles=\"$dlfiles $arg\"\n\t    prev=\n\t    continue\n\t  else\n\t    # If libtool objects are unsupported, then we need to preload.\n\t    prev=dlprefiles\n\t  fi\n\tfi\n\n\tif test \"$prev\" = dlprefiles; then\n\t  # Preload the old-style object.\n\t  dlprefiles=\"$dlprefiles \"`$echo \"X$arg\" | $Xsed -e \"$lo2o\"`\n\t  prev=\n\telse\n\t  case $arg in\n\t  *.lo) libobjs=\"$libobjs $arg\" ;;\n\t  *) objs=\"$objs $arg\" ;;\n\t  esac\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tdeplibs=\"$deplibs $arg\"\n\told_deplibs=\"$old_deplibs $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  dlfiles=\"$dlfiles $arg\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  dlprefiles=\"$dlprefiles $arg\"\n\t  prev=\n\telse\n\t  deplibs=\"$deplibs $arg\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\targ=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n\tcase $arg in\n\t*[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n\t  arg=\"\\\"$arg\\\"\"\n\t  ;;\n\tesac\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tcompile_command=\"$compile_command $arg\"\n\tfinalize_command=\"$finalize_command $arg\"\n      fi\n    done # argument parsing loop\n\n    if test -n \"$prev\"; then\n      $echo \"$modename: the \\`$prevarg' option requires an argument\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      compile_command=\"$compile_command $arg\"\n      finalize_command=\"$finalize_command $arg\"\n    fi\n\n    # calculate the name of the file, without its directory\n    outputname=`$echo \"X$output\" | $Xsed -e 's%^.*/%%'`\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$echo \\\"X\\${$shlibpath_var}\\\" \\| \\$Xsed -e \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    output_objdir=`$echo \"X$output\" | $Xsed -e 's%/[^/]*$%%'`\n    if test \"X$output_objdir\" = \"X$output\"; then\n      output_objdir=\"$objdir\"\n    else\n      output_objdir=\"$output_objdir/$objdir\"\n    fi\n    # Create the object directory.\n    if test ! -d $output_objdir; then\n      $show \"$mkdir $output_objdir\"\n      $run $mkdir $output_objdir\n      status=$?\n      if test $status -ne 0 && test ! -d $output_objdir; then\n\texit $status\n      fi\n    fi\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      $echo \"$modename: you must specify an output file\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\tesac\n      fi\n      libs=\"$libs $deplib\"\n    done\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n    case $linkmode in\n    lib)\n\tpasses=\"conv link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    $echo \"$modename: libraries can \\`-dlopen' only libtool libraries: $file\" 1>&2\n\t    exit 1\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n    for pass in $passes; do\n      if test $linkmode = prog; then\n\t# Determine which files to process\n\tcase $pass in\n\tdlopen)\n\t  libs=\"$dlfiles\"\n\t  save_deplibs=\"$deplibs\" # Collect dlpreopened libraries\n\t  deplibs=\n\t  ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink) libs=\"$deplibs %DEPLIBS% $dependency_libs\" ;;\n\tesac\n      fi\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-l*)\n\t  if test $linkmode = oldlib && test $linkmode = obj; then\n\t    $echo \"$modename: warning: \\`-l' is ignored for archives/objects: $deplib\" 1>&2\n\t    continue\n\t  fi\n\t  if test $pass = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  name=`$echo \"X$deplib\" | $Xsed -e 's/^-l//'`\n\t  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t    # Search the libtool library\n\t    lib=\"$searchdir/lib${name}.la\"\n\t    if test -f \"$lib\"; then\n\t      found=yes\n\t      break\n\t    fi\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test $linkmode = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  fi\n\t  ;; # -l\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test $pass = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`\n\t    ;;\n\t  prog)\n\t    if test $pass = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test $pass = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    ;;\n\t  *)\n\t    $echo \"$modename: warning: \\`-L' is ignored for archives/objects: $deplib\" 1>&2\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test $pass = link; then\n\t    dir=`$echo \"X$deplib\" | $Xsed -e 's/^-R//'`\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) xrpath=\"$xrpath $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la) lib=\"$deplib\" ;;\n\t*.$libext)\n\t  if test $pass = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    if test \"$deplibs_check_method\" != pass_all; then\n\t      echo\n\t      echo \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t      echo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t      echo \"*** that it is just a static archive that I should not used here.\"\n\t    else\n\t      echo\n\t      echo \"*** Warning: Linking the shared library $output against the\"\n\t      echo \"*** static library $deplib is not portable!\"\n\t      deplibs=\"$deplib $deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test $pass != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test $pass = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlopen support or we're linking statically,\n\t    # we need to preload.\n\t    newdlprefiles=\"$newdlprefiles $deplib\"\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $deplib\"\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\tif test $found = yes || test -f \"$lib\"; then :\n\telse\n\t  $echo \"$modename: cannot find the library \\`$lib'\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $lib | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t  exit 1\n\tfi\n\n\tladir=`$echo \"X$lib\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$ladir\" = \"X$lib\" && ladir=\".\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variable installed.\n\tinstalled=yes\n\n\t# Read the .la file\n\tcase $lib in\n\t*/* | *\\\\*) . $lib ;;\n\t*) . ./$lib ;;\n\tesac\n\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test $linkmode = oldlib && test $linkmode = obj; }; then\n\t   # Add dl[pre]opened files of deplib\n\t  test -n \"$dlopen\" && dlfiles=\"$dlfiles $dlopen\"\n\t  test -n \"$dlpreopen\" && dlprefiles=\"$dlprefiles $dlpreopen\"\n\tfi\n\n\tif test $pass = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      $echo \"$modename: cannot find name of link library for \\`$lib'\" 1>&2\n\t      exit 1\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    convenience=\"$convenience $ladir/$objdir/$old_library\"\n\t    old_convenience=\"$old_convenience $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n              if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t        case \"$tmp_libs \" in\n\t        *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t        esac\n              fi\n\t      tmp_libs=\"$tmp_libs $deplib\"\n\t    done\n\t  elif test $linkmode != prog && test $linkmode != lib; then\n\t    $echo \"$modename: \\`$lib' is not a convenience library\" 1>&2\n\t    exit 1\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tfor l in $old_library $library_names; do\n\t  linklib=\"$l\"\n\tdone\n\tif test -z \"$linklib\"; then\n\t  $echo \"$modename: cannot find name of link library for \\`$lib'\" 1>&2\n\t  exit 1\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test $pass = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    $echo \"$modename: cannot -dlopen a convenience library: \\`$lib'\" 1>&2\n\t    exit 1\n\t  fi\n\t  if test -z \"$dlname\" || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.\n\t    dlprefiles=\"$dlprefiles $lib\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    $echo \"$modename: warning: cannot determine absolute directory name of \\`$ladir'\" 1>&2\n\t    $echo \"$modename: passing it literally to the linker, although it might fail\" 1>&2\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tlaname=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    $echo \"$modename: warning: library \\`$lib' was moved.\" 1>&2\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$libdir\"\n\t    absdir=\"$libdir\"\n\t  fi\n\telse\n\t  dir=\"$ladir/$objdir\"\n\t  absdir=\"$abs_ladir/$objdir\"\n\t  # Remove this search path later\n\t  notinst_path=\"$notinst_path $abs_ladir\"\n\tfi # $installed = yes\n\tname=`$echo \"X$laname\" | $Xsed -e 's/\\.la$//' -e 's/^lib//'`\n\n\t# This library was specified with -dlpreopen.\n\tif test $pass = dlpreopen; then\n\t  if test -z \"$libdir\"; then\n\t    $echo \"$modename: cannot -dlpreopen a convenience library: \\`$lib'\" 1>&2\n\t    exit 1\n\t  fi\n\t  # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t  # are required to link).\n\t  if test -n \"$old_library\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$old_library\"\n\t  # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t  elif test -n \"$dlname\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$dlname\"\n\t  else\n\t    newdlprefiles=\"$newdlprefiles $dir/$linklib\"\n\t  fi\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test $linkmode = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\"\n\t  fi\n\t  continue\n\tfi\n\n\tif test $linkmode = prog && test $pass != link; then\n\t  newlib_search_path=\"$newlib_search_path $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) newlib_search_path=\"$newlib_search_path \"`$echo \"X$deplib\" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test $linkalldeplibs = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tif test -n \"$library_names\" &&\n\t   { test \"$prefer_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  # Link against this shared library\n\n\t  if test \"$linkmode,$pass\" = \"prog,link\" ||\n\t   { test $linkmode = lib && test $hardcode_into_libs = yes; }; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    if test $linkmode = prog; then\n\t      # We need to hardcode the library path\n\t      if test -n \"$shlibpath_var\"; then\n\t\t# Make sure the rpath contains only unique directories.\n\t\tcase \"$temp_rpath \" in\n\t\t*\" $dir \"*) ;;\n\t\t*\" $absdir \"*) ;;\n\t\t*) temp_rpath=\"$temp_rpath $dir\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\n\t  if test \"$installed\" = no; then\n\t    notinst_deplibs=\"$notinst_deplibs $lib\"\n\t    need_relink=yes\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    realname=\"$2\"\n\t    shift; shift\n\t    libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin*)\n\t\tmajor=`expr $current - $age`\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    soname=`echo $soroot | sed -e 's/^.*\\///'`\n\t    newlib=\"libimp-`echo $soname | sed 's/^lib//;s/\\.dll$//'`.a\"\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      $show \"extracting exported symbol list from \\`$soname'\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      eval cmds=\\\"$extract_expsyms_cmds\\\"\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\" || exit $?\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      $show \"generating import library for \\`$soname'\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      eval cmds=\\\"$old_archive_from_expsyms_cmds\\\"\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\" || exit $?\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n $old_archive_from_expsyms_cmds\n\n\t  if test $linkmode = prog || test \"$mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      $echo \"$modename: configuration error: unsupported hardcode properties\"\n\t      exit 1\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) compile_shlibpath=\"$compile_shlibpath$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test $linkmode = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes && \\\n\t\t test \"$hardcode_minus_L\" != yes && \\\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test $linkmode = prog || test \"$mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test $linkmode = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test $linkmode = prog; then\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\n\t  # Try to link the static library\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    echo \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    convenience=\"$convenience $dir/$old_library\"\n\t    old_convenience=\"$old_convenience $dir/$old_library\"\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test $linkmode = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test $hardcode_into_libs != yes || test $build_old_libs = yes ||\n\t       test $link_static = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) temp_xrpath=`$echo \"X$libdir\" | $Xsed -e 's/^-R//'`\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) xrpath=\"$xrpath $temp_xrpath\";;\n\t\t   esac;;\n\t      *) temp_deplibs=\"$temp_deplibs $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  newlib_search_path=\"$newlib_search_path $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    if test \"X$duplicate_deps\" = \"Xyes\" ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done\n\n\t  if test $link_all_deplibs != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t\tdir=`$echo \"X$deplib\" | $Xsed -e 's%/[^/]*$%%'`\n\t\ttest \"X$dir\" = \"X$deplib\" && dir=\".\"\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    $echo \"$modename: warning: cannot determine absolute directory name of \\`$dir'\" 1>&2\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif grep \"^installed=no\" $deplib > /dev/null; then\n\t\t  path=\"-L$absdir/$objdir\"\n\t\telse\n\t\t  eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -z \"$libdir\"; then\n\t\t    $echo \"$modename: \\`$deplib' is not a valid libtool archive\" 1>&2\n\t\t    exit 1\n\t\t  fi\n\t\t  if test \"$absdir\" != \"$libdir\"; then\n\t\t    $echo \"$modename: warning: \\`$deplib' seems to be moved\" 1>&2\n\t\t  fi\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      *) continue ;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$deplibs $path\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test $pass = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test $pass != dlopen; then\n\ttest $pass != scan && dependency_libs=\"$newdependency_libs\"\n\tif test $pass != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) lib_search_path=\"$lib_search_path $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    *)\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      if test \"$pass\" = \"conv\" &&\n       { test \"$linkmode\" = \"lib\" || test \"$linkmode\" = \"prog\"; }; then\n\tlibs=\"$deplibs\" # reset libs\n\tdeplibs=\n      fi\n    done # for pass\n    if test $linkmode = prog; then\n      dlfiles=\"$newdlfiles\"\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$rpath\"; then\n\t$echo \"$modename: warning: \\`-rpath' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$xrpath\"; then\n\t$echo \"$modename: warning: \\`-R' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for archives\" 1>&2\n      fi\n\n      if test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t$echo \"$modename: warning: \\`-export-symbols' is ignored for archives\" 1>&2\n      fi\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      objs=\"$objs$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tname=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//' -e 's/^lib//'`\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\tif test \"$module\" = no; then\n\t  $echo \"$modename: libtool library \\`$output' must begin with \\`lib'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  name=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//'`\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  libname=`$echo \"X$outputname\" | $Xsed -e 's/\\.la$//'`\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  $echo \"$modename: cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\" 2>&1\n\t  exit 1\n\telse\n\t  echo\n\t  echo \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  echo \"*** objects $objs is not portable!\"\n\t  libobjs=\"$libobjs $objs\"\n\tfi\n      fi\n\n      if test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen self' is ignored for libtool libraries\" 1>&2\n      fi\n\n      set dummy $rpath\n      if test $# -gt 2; then\n\t$echo \"$modename: warning: ignoring multiple \\`-rpath's for a libtool library\" 1>&2\n      fi\n      install_libdir=\"$2\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  libext=al\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\tif test -n \"$vinfo\"; then\n\t  $echo \"$modename: warning: \\`-version-info' is ignored for convenience libraries\" 1>&2\n\tfi\n\n\tif test -n \"$release\"; then\n\t  $echo \"$modename: warning: \\`-release' is ignored for convenience libraries\" 1>&2\n\tfi\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tIFS=\"$save_ifs\"\n\n\tif test -n \"$8\"; then\n\t  $echo \"$modename: too many parameters to \\`-version-info'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\tcurrent=\"$2\"\n\trevision=\"$3\"\n\tage=\"$4\"\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: CURRENT \\`$current' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: REVISION \\`$revision' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;;\n\t*)\n\t  $echo \"$modename: AGE \\`$age' is not a nonnegative integer\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\tif test $age -gt $current; then\n\t  $echo \"$modename: AGE \\`$age' is greater than the current interface number \\`$current'\" 1>&2\n\t  $echo \"$modename: \\`$vinfo' is not valid version information\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  major=.`expr $current - $age`\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  minor_current=`expr $current + 1`\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\";\n\t  ;;\n\n\tirix | nonstopux)\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  major=`expr $current - $age + 1`\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test $loop != 0; do\n\t    iface=`expr $revision - $loop`\n\t    loop=`expr $loop - 1`\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux)\n\t  major=.`expr $current - $age`\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  major=`expr $current - $age`\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test $loop != 0; do\n\t    iface=`expr $current - $loop`\n\t    loop=`expr $loop - 1`\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  verstring=\"$verstring:${current}.0\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  major=`expr $current - $age`\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  $echo \"$modename: unknown library version type \\`$version_type'\" 1>&2\n\t  echo \"Fatal configuration error.  See the $PACKAGE docs for more information.\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  verstring=\"0.0\"\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\"\"\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    $echo \"$modename: warning: undefined symbols not allowed in $host shared libraries\" 1>&2\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n      fi\n\n      if test \"$mode\" != relink; then\n\t# Remove our outputs.\n\t$show \"${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*\"\n\t$run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\toldlibs=\"$oldlibs $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$echo \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e \"$lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      for path in $notinst_path; do\n\tlib_search_path=`echo \"$lib_search_path \" | sed -e 's% $path % %g'`\n\tdeplibs=`echo \"$deplibs \" | sed -e 's% -L$path % %g'`\n\tdependency_libs=`echo \"$dependency_libs \" | sed -e 's% -L$path % %g'`\n      done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  temp_xrpath=\"$temp_xrpath -R$libdir\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n\tif test $hardcode_into_libs != yes || test $build_old_libs = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlfiles=\"$dlfiles $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlprefiles=\"$dlprefiles $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    deplibs=\"$deplibs -framework System\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test $build_libtool_need_lc = \"yes\"; then\n\t      deplibs=\"$deplibs -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behaviour.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $rm conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $rm conftest\n\t  $CC -o conftest conftest.c $deplibs\n\t  if test $? -eq 0 ; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      name=\"`expr $i : '-l\\(.*\\)'`\"\n\t      # If $name is empty we are operating on a -L argument.\n\t      if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t\tlibname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t\tdeplib_matches=`eval \\\\$echo \\\"$library_names_spec\\\"`\n\t\tset dummy $deplib_matches\n\t\tdeplib_match=$2\n\t\tif test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t  newdeplibs=\"$newdeplibs $i\"\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  echo \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t  echo \"*** I have the capability to make that library automatically link in when\"\n\t\t  echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t  echo \"*** shared version of the library, which I believe you do not have\"\n\t\t  echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t  echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\tfi\n\t      else\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t      fi\n\t    done\n\t  else\n\t    # Error occured in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      name=\"`expr $i : '-l\\(.*\\)'`\"\n\t     # If $name is empty we are operating on a -L argument.\n\t      if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t\t$rm conftest\n\t\t$CC -o conftest conftest.c $i\n\t\t# Did it work?\n\t\tif test $? -eq 0 ; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t\t  deplib_matches=`eval \\\\$echo \\\"$library_names_spec\\\"`\n\t\t  set dummy $deplib_matches\n\t\t  deplib_match=$2\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    echo \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which you do not appear to have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t    echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  echo \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"***  make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t      else\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t      fi\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$2 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    name=\"`expr $a_deplib : '-l\\(.*\\)'`\"\n\t    # If $name is empty we are operating on a -L argument.\n\t    if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t      libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t    potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t    for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null \\\n\t\t\t | grep \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | sed 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$echo \"X$potlib\" | $Xsed -e 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null \\\n\t\t\t | sed 10q \\\n\t\t\t | egrep \"$file_magic_regex\" > /dev/null; then\n\t\t\tnewdeplibs=\"$newdeplibs $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t    done\n\t      done\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\techo \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  echo \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  echo \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  echo \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t    else\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t    fi\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$2 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    name=\"`expr $a_deplib : '-l\\(.*\\)'`\"\n\t    # If $name is empty we are operating on a -L argument.\n\t    if test -n \"$name\" && test \"$name\" != \"0\"; then\n\t      libname=`eval \\\\$echo \\\"$libname_spec\\\"`\n\t      for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\tpotential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\tfor potent_lib in $potential_libs; do\n\t\t  potlib=\"$potent_lib\" # see symlink-check below in file_magic test\n\t\t  if eval echo \\\"$potent_lib\\\" 2>/dev/null \\\n\t\t      | sed 10q \\\n\t\t      | egrep \"$match_pattern_regex\" > /dev/null; then\n\t\t    newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t    a_deplib=\"\"\n\t\t    break 2\n\t\t  fi\n\t\tdone\n\t      done\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\techo \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  echo \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  echo \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  echo \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t    else\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t    fi\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  if $echo \"X $deplibs\" | $Xsed -e 's/ -lc$//' \\\n\t       -e 's/ -[LR][^ ]*//g' -e 's/[ \t]//g' |\n\t     grep . >/dev/null; then\n\t    echo\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t  fi\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library is the System framework\n\t  newdeplibs=`$echo \"X $newdeplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    echo \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test $allow_undefined = no; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\tif test $hardcode_into_libs = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    hardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tdep_rpath=\"$dep_rpath $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    eval dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      rpath=\"$rpath$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\trealname=\"$2\"\n\tshift; shift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\ttest -z \"$dlname\" && dlname=$soname\n\n\tlib=\"$output_objdir/$realname\"\n\tfor link\n\tdo\n\t  linknames=\"$linknames $link\"\n\tdone\n\n\t# Ensure that we have .o objects for linkers which dislike .lo\n\t# (e.g. aix) in case we are running --disable-static\n\tfor obj in $libobjs; do\n\t  xdir=`$echo \"X$obj\" | $Xsed -e 's%/[^/]*$%%'`\n\t  if test \"X$xdir\" = \"X$obj\"; then\n\t    xdir=\".\"\n\t  else\n\t    xdir=\"$xdir\"\n\t  fi\n\t  baseobj=`$echo \"X$obj\" | $Xsed -e 's%^.*/%%'`\n\t  oldobj=`$echo \"X$baseobj\" | $Xsed -e \"$lo2o\"`\n\t  if test ! -f $xdir/$oldobj; then\n\t    $show \"(cd $xdir && ${LN_S} $baseobj $oldobj)\"\n\t    $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?\n\t  fi\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$echo \"X$libobjs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    $show \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $run $rm $export_symbols\n\t    eval cmds=\\\"$export_symbols_cmds\\\"\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $show \"$cmd\"\n\t      $run eval \"$cmd\" || exit $?\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\"; then\n\t      $show \"egrep -e \\\"$export_symbols_regex\\\" \\\"$export_symbols\\\" > \\\"${export_symbols}T\\\"\"\n\t      $run eval 'egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      $show \"$mv \\\"${export_symbols}T\\\" \\\"$export_symbols\\\"\"\n\t      $run eval '$mv \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $run eval '$echo \"X$include_expsyms\" | $SP2NL >> \"$export_symbols\"'\n\tfi\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    $show \"${rm}r $gentop\"\n\t    $run ${rm}r \"$gentop\"\n\t    $show \"mkdir $gentop\"\n\t    $run mkdir \"$gentop\"\n\t    status=$?\n\t    if test $status -ne 0 && test ! -d \"$gentop\"; then\n\t      exit $status\n\t    fi\n\t    generated=\"$generated $gentop\"\n\n\t    for xlib in $convenience; do\n\t      # Extract the objects.\n\t      case $xlib in\n\t      [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t      *) xabs=`pwd`\"/$xlib\" ;;\n\t      esac\n\t      xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t      xdir=\"$gentop/$xlib\"\n\n\t      $show \"${rm}r $xdir\"\n\t      $run ${rm}r \"$xdir\"\n\t      $show \"mkdir $xdir\"\n\t      $run mkdir \"$xdir\"\n\t      status=$?\n\t      if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t\texit $status\n\t      fi\n\t      $show \"(cd $xdir && $AR x $xabs)\"\n\t      $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t      libobjs=\"$libobjs \"`find $xdir -name \\*.o -print -o -name \\*.lo -print | $NL2SP`\n\t    done\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$mode\" = relink; then\n\t  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t  eval cmds=\\\"$archive_expsym_cmds\\\"\n\telse\n\t  eval cmds=\\\"$archive_cmds\\\"\n\tfi\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  $show \"$cmd\"\n\t  $run eval \"$cmd\" || exit $?\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$mode\" = relink; then\n\t  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv \"$realname\"U $realname)' || exit $?\n\t  exit 0\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    $show \"(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$deplibs\"; then\n\t$echo \"$modename: warning: \\`-l' and \\`-L' are ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\t$echo \"$modename: warning: \\`-dlopen' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$rpath\"; then\n\t$echo \"$modename: warning: \\`-rpath' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$xrpath\"; then\n\t$echo \"$modename: warning: \\`-R' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for objects\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for objects\" 1>&2\n      fi\n\n      case $output in\n      *.lo)\n\tif test -n \"$objs$old_deplibs\"; then\n\t  $echo \"$modename: cannot build library object \\`$output' from non-libtool objects\" 1>&2\n\t  exit 1\n\tfi\n\tlibobj=\"$output\"\n\tobj=`$echo \"X$output\" | $Xsed -e \"$lo2o\"`\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $run $rm $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval reload_conv_objs=\\\"\\$reload_objs $whole_archive_flag_spec\\\"\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r \"$gentop\"\n\t  $show \"mkdir $gentop\"\n\t  $run mkdir \"$gentop\"\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d \"$gentop\"; then\n\t    exit $status\n\t  fi\n\t  generated=\"$generated $gentop\"\n\n\t  for xlib in $convenience; do\n\t    # Extract the objects.\n\t    case $xlib in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t    *) xabs=`pwd`\"/$xlib\" ;;\n\t    esac\n\t    xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t    xdir=\"$gentop/$xlib\"\n\n\t    $show \"${rm}r $xdir\"\n\t    $run ${rm}r \"$xdir\"\n\t    $show \"mkdir $xdir\"\n\t    $run mkdir \"$xdir\"\n\t    status=$?\n\t    if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t      exit $status\n\t    fi\n\t    $show \"(cd $xdir && $AR x $xabs)\"\n\t    $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t    reload_conv_objs=\"$reload_objs \"`find $xdir -name \\*.o -print -o -name \\*.lo -print | $NL2SP`\n\t  done\n\tfi\n      fi\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$echo \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}$'/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      eval cmds=\\\"$reload_cmds\\\"\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r $gentop\n\tfi\n\n\texit 0\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  $show \"${rm}r $gentop\"\n\t  $run ${rm}r $gentop\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t$show \"echo timestamp > $libobj\"\n\t$run eval \"echo timestamp > $libobj\" || exit $?\n\texit 0\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\teval cmds=\\\"$reload_cmds\\\"\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  $show \"$cmd\"\n\t  $run eval \"$cmd\" || exit $?\n\tdone\n\tIFS=\"$save_ifs\"\n      else\n\t# Just create a symlink.\n\t$show $rm $libobj\n\t$run $rm $libobj\n\txdir=`$echo \"X$libobj\" | $Xsed -e 's%/[^/]*$%%'`\n\tif test \"X$xdir\" = \"X$libobj\"; then\n\t  xdir=\".\"\n\telse\n\t  xdir=\"$xdir\"\n\tfi\n\tbaseobj=`$echo \"X$libobj\" | $Xsed -e 's%^.*/%%'`\n\toldobj=`$echo \"X$baseobj\" | $Xsed -e \"$lo2o\"`\n\t$show \"(cd $xdir && $LN_S $oldobj $baseobj)\"\n\t$run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?\n      fi\n\n      if test -n \"$gentop\"; then\n\t$show \"${rm}r $gentop\"\n\t$run ${rm}r $gentop\n      fi\n\n      exit 0\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;\n      esac\n      if test -n \"$vinfo\"; then\n\t$echo \"$modename: warning: \\`-version-info' is ignored for programs\" 1>&2\n      fi\n\n      if test -n \"$release\"; then\n\t$echo \"$modename: warning: \\`-release' is ignored for programs\" 1>&2\n      fi\n\n      if test \"$preload\" = yes; then\n\tif test \"$dlopen_support\" = unknown && test \"$dlopen_self\" = unknown &&\n\t   test \"$dlopen_self_static\" = unknown; then\n\t  $echo \"$modename: warning: \\`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support.\"\n\tfi\n      fi\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$echo \"X $compile_deplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\tfinalize_deplibs=`$echo \"X $finalize_deplibs\" | $Xsed -e 's/ -lc / -framework System /'`\n\t;;\n      esac\n\n      compile_command=\"$compile_command $compile_deplibs\"\n      finalize_command=\"$finalize_command $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  *) dllsearchpath=\"$dllsearchpath:$libdir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_perm_rpath=\"$finalize_perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$echo \"X$compile_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$echo \"X$finalize_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n      fi\n\n      dlsyms=\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tif test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\t  dlsyms=\"${outputname}S.c\"\n\telse\n\t  $echo \"$modename: not configured to extract global symbols from dlpreopened files\" 1>&2\n\tfi\n      fi\n\n      if test -n \"$dlsyms\"; then\n\tcase $dlsyms in\n\t\"\") ;;\n\t*.c)\n\t  # Discover the nlist of each of the dlfiles.\n\t  nlist=\"$output_objdir/${outputname}.nm\"\n\n\t  $show \"$rm $nlist ${nlist}S ${nlist}T\"\n\t  $run $rm \"$nlist\" \"${nlist}S\" \"${nlist}T\"\n\n\t  # Parse the name list into a source file.\n\t  $show \"creating $output_objdir/$dlsyms\"\n\n\t  test -z \"$run\" && $echo > \"$output_objdir/$dlsyms\" \"\\\n/* $dlsyms - symbol resolution table for \\`$outputname' dlsym emulation. */\n/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n/* Prevent the only kind of declaration conflicts we can make. */\n#define lt_preloaded_symbols some_other_symbol\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\t  if test \"$dlself\" = yes; then\n\t    $show \"generating symbol list for \\`$output'\"\n\n\t    test -z \"$run\" && $echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t    # Add our own program objects to the symbol list.\n\t    progfiles=`$echo \"X$objs$old_deplibs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\t    for arg in $progfiles; do\n\t      $show \"extracting global C symbols from \\`$arg'\"\n\t      $run eval \"$NM $arg | $global_symbol_pipe >> '$nlist'\"\n\t    done\n\n\t    if test -n \"$exclude_expsyms\"; then\n\t      $run eval 'egrep -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      $run eval '$mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\n\t    if test -n \"$export_symbols_regex\"; then\n\t      $run eval 'egrep -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      $run eval '$mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\n\t    # Prepare the list of exported symbols\n\t    if test -z \"$export_symbols\"; then\n\t      export_symbols=\"$output_objdir/$output.exp\"\n\t      $run $rm $export_symbols\n\t      $run eval \"sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t    else\n\t      $run eval \"sed -e 's/\\([][.*^$]\\)/\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$output.exp\"'\n\t      $run eval 'grep -f \"$output_objdir/$output.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      $run eval 'mv \"$nlist\"T \"$nlist\"'\n\t    fi\n\t  fi\n\n\t  for arg in $dlprefiles; do\n\t    $show \"extracting global C symbols from \\`$arg'\"\n\t    name=`echo \"$arg\" | sed -e 's%^.*/%%'`\n\t    $run eval 'echo \": $name \" >> \"$nlist\"'\n\t    $run eval \"$NM $arg | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -z \"$run\"; then\n\t    # Make sure we have at least an empty file.\n\t    test -f \"$nlist\" || : > \"$nlist\"\n\n\t    if test -n \"$exclude_expsyms\"; then\n\t      egrep -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t      $mv \"$nlist\"T \"$nlist\"\n\t    fi\n\n\t    # Try sorting and uniquifying the output.\n\t    if grep -v \"^: \" < \"$nlist\" | sort +2 | uniq > \"$nlist\"S; then\n\t      :\n\t    else\n\t      grep -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t    fi\n\n\t    if test -f \"$nlist\"S; then\n\t      eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$dlsyms\"'\n\t    else\n\t      echo '/* NONE */' >> \"$output_objdir/$dlsyms\"\n\t    fi\n\n\t    $echo >> \"$output_objdir/$dlsyms\" \"\\\n\n#undef lt_preloaded_symbols\n\n#if defined (__STDC__) && __STDC__\n# define lt_ptr void *\n#else\n# define lt_ptr char *\n# define const\n#endif\n\n/* The mapping between symbol names and symbols. */\nconst struct {\n  const char *name;\n  lt_ptr address;\n}\nlt_preloaded_symbols[] =\n{\\\n\"\n\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$dlsyms\"\n\n\t    $echo >> \"$output_objdir/$dlsyms\" \"\\\n  {0, (lt_ptr) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t  fi\n\n\t  pic_flag_for_symtable=\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    case \"$compile_command \" in\n\t    *\" -static \"*) ;;\n\t    *) pic_flag_for_symtable=\" $pic_flag -DPIC -DFREEBSD_WORKAROUND\";;\n\t    esac;;\n\t  *-*-hpux*)\n\t    case \"$compile_command \" in\n\t    *\" -static \"*) ;;\n\t    *) pic_flag_for_symtable=\" $pic_flag -DPIC\";;\n\t    esac\n\t  esac\n\n\t  # Now compile the dynamic symbol file.\n\t  $show \"(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \\\"$dlsyms\\\")\"\n\t  $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")' || exit $?\n\n\t  # Clean up the generated files.\n\t  $show \"$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T\"\n\t  $run $rm \"$output_objdir/$dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"\n\n\t  # Transform the symbol file into the correct name.\n\t  compile_command=`$echo \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%\"`\n\t  finalize_command=`$echo \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%\"`\n\t  ;;\n\t*)\n\t  $echo \"$modename: unknown suffix for \\`$dlsyms'\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n      else\n\t# We keep going just in case the user didn't refer to\n\t# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n\t# really was required.\n\n\t# Nullify the symbol file.\n\tcompile_command=`$echo \"X$compile_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n\tfinalize_command=`$echo \"X$finalize_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n      fi\n\n      if test $need_relink = no || test \"$build_libtool_libs\" != yes; then\n\t# Replace the output file specification.\n\tcompile_command=`$echo \"X$compile_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\t$show \"$link_command\"\n\t$run eval \"$link_command\"\n\tstatus=$?\n\n\t# Delete the generated files.\n\tif test -n \"$dlsyms\"; then\n\t  $show \"$rm $output_objdir/${outputname}S.${objext}\"\n\t  $run $rm \"$output_objdir/${outputname}S.${objext}\"\n\tfi\n\n\texit $status\n      fi\n\n      if test -n \"$shlibpath_var\"; then\n\t# We should set the shlibpath_var\n\trpath=\n\tfor dir in $temp_rpath; do\n\t  case $dir in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*)\n\t    # Absolute path.\n\t    rpath=\"$rpath$dir:\"\n\t    ;;\n\t  *)\n\t    # Relative path: add a thisdir entry.\n\t    rpath=\"$rpath\\$thisdir/$dir:\"\n\t    ;;\n\t  esac\n\tdone\n\ttemp_rpath=\"$rpath\"\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$echo \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$run $rm $output\n\t# Link the executable and exit\n\t$show \"$link_command\"\n\t$run eval \"$link_command\" || exit $?\n\texit 0\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\t$echo \"$modename: warning: this platform does not like uninstalled shared libraries\" 1>&2\n\t$echo \"$modename: \\`$output' will be relinked during installation\" 1>&2\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$echo \"X$compile_var$compile_command$compile_rpath\" | $Xsed -e 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$echo \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      $show \"$link_command\"\n      $run eval \"$link_command\" || exit $?\n\n      # Now create the wrapper script.\n      $show \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    var_value=`$echo \"X$var_value\" | $Xsed -e \"$sed_quote_subst\"`\n\t    relink_command=\"$var=\\\"$var_value\\\"; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$echo \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Quote $echo for shipping.\n      if test \"X$echo\" = \"X$SHELL $0 --fallback-echo\"; then\n\tcase $0 in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) qecho=\"$SHELL $0 --fallback-echo\";;\n\t*) qecho=\"$SHELL `pwd`/$0 --fallback-echo\";;\n\tesac\n\tqecho=`$echo \"X$qecho\" | $Xsed -e \"$sed_quote_subst\"`\n      else\n\tqecho=`$echo \"X$echo\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if our run command is non-null.\n      if test -z \"$run\"; then\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) output=`echo $output|sed 's,.exe$,,'` ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*) exeext=.exe ;;\n\t  *) exeext= ;;\n\tesac\n\t$rm $output\n\ttrap \"$rm $output; exit 1\" 1 2 15\n\n\t$echo > $output \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='sed -e 1s/^X//'\nsed_quote_subst='$sed_quote_subst'\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\nif test \\\"\\${CDPATH+set}\\\" = set; then CDPATH=:; export CDPATH; fi\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variable:\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$echo are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    echo=\\\"$qecho\\\"\n    file=\\\"\\$0\\\"\n    # Make sure echo works.\n    if test \\\"X\\$1\\\" = X--no-reexec; then\n      # Discard the --no-reexec flag, and continue.\n      shift\n    elif test \\\"X\\`(\\$echo '\\t') 2>/dev/null\\`\\\" = 'X\\t'; then\n      # Yippee, \\$echo works!\n      :\n    else\n      # Restart under the correct shell, and then maybe \\$echo will work.\n      exec $SHELL \\\"\\$0\\\" --no-reexec \\${1+\\\"\\$@\\\"}\n    fi\n  fi\\\n\"\n\t$echo >> $output \"\\\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | sed -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$echo \\\"X\\$file\\\" | \\$Xsed -e 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | sed -n 's/.*-> //p'\\`\n  done\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  echo >> $output \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" || \\\\\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | sed 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $mkdir \\\"\\$progdir\\\"\n    else\n      $rm \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  echo >> $output \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$echo \\\"\\$relink_command_output\\\" >&2\n\t$rm \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $mv \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $rm \\\"\\$progdir/\\$program\\\";\n      $mv \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $rm \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  echo >> $output \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\techo >> $output \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $echo >> $output \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$echo \\\"X\\$$shlibpath_var\\\" | \\$Xsed -e 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t# fixup the dll searchpath if we need to.\n\tif test -n \"$dllsearchpath\"; then\n\t  $echo >> $output \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t$echo >> $output \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n\"\n\tcase $host in\n\t# win32 systems need to use the prog path for dll\n\t# lookup to work\n\t*-*-cygwin* | *-*-pw32*)\n\t  $echo >> $output \"\\\n      exec \\$progdir/\\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t# Backslashes separate directories on plain windows\n\t*-*-mingw | *-*-os2*)\n\t  $echo >> $output \"\\\n      exec \\$progdir\\\\\\\\\\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t*)\n\t  $echo >> $output \"\\\n      # Export the path to the program.\n      PATH=\\\"\\$progdir:\\$PATH\\\"\n      export PATH\n\n      exec \\$program \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\tesac\n\t$echo >> $output \"\\\n      \\$echo \\\"\\$0: cannot exec \\$program \\${1+\\\"\\$@\\\"}\\\"\n      exit 1\n    fi\n  else\n    # The program doesn't exist.\n    \\$echo \\\"\\$0: error: \\$progdir/\\$program does not exist\\\" 1>&2\n    \\$echo \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    echo \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n\tchmod +x $output\n      fi\n      exit 0\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$objs$old_deplibs \"`$echo \"X$libobjs_save\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\t$show \"${rm}r $gentop\"\n\t$run ${rm}r \"$gentop\"\n\t$show \"mkdir $gentop\"\n\t$run mkdir \"$gentop\"\n\tstatus=$?\n\tif test $status -ne 0 && test ! -d \"$gentop\"; then\n\t  exit $status\n\tfi\n\tgenerated=\"$generated $gentop\"\n\n\t# Add in members from convenience archives.\n\tfor xlib in $addlibs; do\n\t  # Extract the objects.\n\t  case $xlib in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) xabs=\"$xlib\" ;;\n\t  *) xabs=`pwd`\"/$xlib\" ;;\n\t  esac\n\t  xlib=`$echo \"X$xlib\" | $Xsed -e 's%^.*/%%'`\n\t  xdir=\"$gentop/$xlib\"\n\n\t  $show \"${rm}r $xdir\"\n\t  $run ${rm}r \"$xdir\"\n\t  $show \"mkdir $xdir\"\n\t  $run mkdir \"$xdir\"\n\t  status=$?\n\t  if test $status -ne 0 && test ! -d \"$xdir\"; then\n\t    exit $status\n\t  fi\n\t  $show \"(cd $xdir && $AR x $xabs)\"\n\t  $run eval \"(cd \\$xdir && $AR x \\$xabs)\" || exit $?\n\n\t  oldobjs=\"$oldobjs \"`find $xdir -name \\*.${objext} -print -o -name \\*.lo -print | $NL2SP`\n\tdone\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\teval cmds=\\\"$old_archive_from_new_cmds\\\"\n      else\n\t# Ensure that we have .o objects in place in case we decided\n\t# not to build a shared library, and have fallen back to building\n\t# static libs even though --disable-static was passed!\n\tfor oldobj in $oldobjs; do\n\t  if test ! -f $oldobj; then\n\t    xdir=`$echo \"X$oldobj\" | $Xsed -e 's%/[^/]*$%%'`\n\t    if test \"X$xdir\" = \"X$oldobj\"; then\n\t      xdir=\".\"\n\t    else\n\t      xdir=\"$xdir\"\n\t    fi\n\t    baseobj=`$echo \"X$oldobj\" | $Xsed -e 's%^.*/%%'`\n\t    obj=`$echo \"X$baseobj\" | $Xsed -e \"$o2lo\"`\n\t    $show \"(cd $xdir && ${LN_S} $obj $baseobj)\"\n\t    $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?\n\t  fi\n\tdone\n\n\teval cmds=\\\"$old_archive_cmds\\\"\n      fi\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n    done\n\n    if test -n \"$generated\"; then\n      $show \"${rm}r$generated\"\n      $run ${rm}r$generated\n    fi\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      $show \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  var_value=`$echo \"X$var_value\" | $Xsed -e \"$sed_quote_subst\"`\n\t  relink_command=\"$var=\\\"$var_value\\\"; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $0 --mode=relink $libtool_args)\"\n      relink_command=`$echo \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n\n      # Only create the output if not a dry run.\n      if test -z \"$run\"; then\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tname=`$echo \"X$deplib\" | $Xsed -e 's%^.*/%%'`\n\t\teval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\tif test -z \"$libdir\"; then\n\t\t  $echo \"$modename: \\`$deplib' is not a valid libtool archive\" 1>&2\n\t\t  exit 1\n\t\tfi\n\t\tnewdependency_libs=\"$newdependency_libs $libdir/$name\"\n\t\t;;\n\t      *) newdependency_libs=\"$newdependency_libs $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      name=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\t      eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t      if test -z \"$libdir\"; then\n\t\t$echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t\texit 1\n\t      fi\n\t      newdlfiles=\"$newdlfiles $libdir/$name\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      name=`$echo \"X$lib\" | $Xsed -e 's%^.*/%%'`\n\t      eval libdir=`sed -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t      if test -z \"$libdir\"; then\n\t\t$echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t\texit 1\n\t      fi\n\t      newdlprefiles=\"$newdlprefiles $libdir/$name\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $rm $output\n\t  # place dlname in correct position for cygwin\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;\n\t  esac\n\t  $echo > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test $need_relink = yes; then\n\t    $echo >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      fi\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      $show \"(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)\"\n      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?\n      ;;\n    esac\n    exit 0\n    ;;\n\n  # libtool install mode\n  install)\n    modename=\"$modename: install\"\n\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       $echo \"X$nonopt\" | $Xsed | grep shtool > /dev/null; then\n      # Aesthetically quote it.\n      arg=`$echo \"X$nonopt\" | $Xsed -e \"$sed_quote_subst\"`\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n\targ=\"\\\"$arg\\\"\"\n\t;;\n      esac\n      install_prog=\"$arg \"\n      arg=\"$1\"\n      shift\n    else\n      install_prog=\n      arg=\"$nonopt\"\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    arg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n    case $arg in\n    *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n      arg=\"\\\"$arg\\\"\"\n      ;;\n    esac\n    install_prog=\"$install_prog$arg\"\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    for arg\n    do\n      if test -n \"$dest\"; then\n\tfiles=\"$files $dest\"\n\tdest=\"$arg\"\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f) prev=\"-f\" ;;\n      -g) prev=\"-g\" ;;\n      -m) prev=\"-m\" ;;\n      -o) prev=\"-o\" ;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*) ;;\n\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  prev=\n\telse\n\t  dest=\"$arg\"\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      arg=`$echo \"X$arg\" | $Xsed -e \"$sed_quote_subst\"`\n      case $arg in\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*)\n\targ=\"\\\"$arg\\\"\"\n\t;;\n      esac\n      install_prog=\"$install_prog $arg\"\n    done\n\n    if test -z \"$install_prog\"; then\n      $echo \"$modename: you must specify an install program\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test -n \"$prev\"; then\n      $echo \"$modename: the \\`$prev' option requires an argument\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\t$echo \"$modename: no file or destination specified\" 1>&2\n      else\n\t$echo \"$modename: you must specify a destination\" 1>&2\n      fi\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    # Strip any trailing slash from the destination.\n    dest=`$echo \"X$dest\" | $Xsed -e 's%/$%%'`\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      destdir=`$echo \"X$dest\" | $Xsed -e 's%/[^/]*$%%'`\n      test \"X$destdir\" = \"X$dest\" && destdir=.\n      destname=`$echo \"X$dest\" | $Xsed -e 's%^.*/%%'`\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files\n      if test $# -gt 2; then\n\t$echo \"$modename: \\`$dest' is not a directory\" 1>&2\n\t$echo \"$help\" 1>&2\n\texit 1\n      fi\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  $echo \"$modename: \\`$destdir' must be an absolute directory name\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tstaticlibs=\"$staticlibs $file\"\n\t;;\n\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$file' is not a valid libtool archive\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\t# If there is no directory component, then add one.\n\tcase $file in\n\t*/* | *\\\\*) . $file ;;\n\t*) . ./$file ;;\n\tesac\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) current_libdirs=\"$current_libdirs $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) future_libdirs=\"$future_libdirs $libdir\" ;;\n\t  esac\n\tfi\n\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`/\n\ttest \"X$dir\" = \"X$file/\" && dir=\n\tdir=\"$dir$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  $echo \"$modename: warning: relinking \\`$file'\" 1>&2\n\t  $show \"$relink_command\"\n\t  if $run eval \"$relink_command\"; then :\n\t  else\n\t    $echo \"$modename: error: relink \\`$file' with the above command before installing it\" 1>&2\n\t    continue\n\t  fi\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names\n\tif test -n \"$2\"; then\n\t  realname=\"$2\"\n\t  shift\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  $show \"$install_prog $dir/$srcname $destdir/$realname\"\n\t  $run eval \"$install_prog $dir/$srcname $destdir/$realname\" || exit $?\n\t  if test -n \"$stripme\" && test -n \"$striplib\"; then\n\t    $show \"$striplib $destdir/$realname\"\n\t    $run eval \"$striplib $destdir/$realname\" || exit $?\n\t  fi\n\n\t  if test $# -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    for linkname\n\t    do\n\t      if test \"$linkname\" != \"$realname\"; then\n\t\t$show \"(cd $destdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t\t$run eval \"(cd $destdir && $rm $linkname && $LN_S $realname $linkname)\"\n\t      fi\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  eval cmds=\\\"$postinstall_cmds\\\"\n\t  save_ifs=\"$IFS\"; IFS='~'\n\t  for cmd in $cmds; do\n\t    IFS=\"$save_ifs\"\n\t    $show \"$cmd\"\n\t    $run eval \"$cmd\" || exit $?\n\t  done\n\t  IFS=\"$save_ifs\"\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tname=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\tinstname=\"$dir/$name\"i\n\t$show \"$install_prog $instname $destdir/$name\"\n\t$run eval \"$install_prog $instname $destdir/$name\" || exit $?\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && staticlibs=\"$staticlibs $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  destfile=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  staticdest=`$echo \"X$destfile\" | $Xsed -e \"$lo2o\"`\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  $echo \"$modename: cannot copy a libtool object to \\`$destfile'\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\tif test -n \"$destfile\"; then\n\t  $show \"$install_prog $file $destfile\"\n\t  $run eval \"$install_prog $file $destfile\" || exit $?\n\tfi\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  staticobj=`$echo \"X$file\" | $Xsed -e \"$lo2o\"`\n\n\t  $show \"$install_prog $staticobj $staticdest\"\n\t  $run eval \"$install_prog \\$staticobj \\$staticdest\" || exit $?\n\tfi\n\texit 0\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  destfile=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin*|*mingw*)\n\t    wrapper=`echo $file | sed -e 's,.exe$,,'`\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif (sed -e '4q' $wrapper | egrep \"^# Generated by .*$PACKAGE\")>/dev/null 2>&1; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $wrapper ;;\n\t  *) . ./$wrapper ;;\n\t  esac\n\n\t  # Check the variables that should have been set.\n\t  if test -z \"$notinst_deplibs\"; then\n\t    $echo \"$modename: invalid libtool wrapper script \\`$wrapper'\" 1>&2\n\t    exit 1\n\t  fi\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      # If there is no directory component, then add one.\n\t      case $lib in\n\t      */* | *\\\\*) . $lib ;;\n\t      *) . ./$lib ;;\n\t      esac\n\t    fi\n\t    libfile=\"$libdir/\"`$echo \"X$lib\" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      $echo \"$modename: warning: \\`$lib' has not been installed in \\`$libdir'\" 1>&2\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $wrapper ;;\n\t  *) . ./$wrapper ;;\n\t  esac\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    if test \"$finalize\" = yes && test -z \"$run\"; then\n\t      tmpdir=\"/tmp\"\n\t      test -n \"$TMPDIR\" && tmpdir=\"$TMPDIR\"\n\t      tmpdir=\"$tmpdir/libtool-$$\"\n\t      if $mkdir -p \"$tmpdir\" && chmod 700 \"$tmpdir\"; then :\n\t      else\n\t\t$echo \"$modename: error: cannot create temporary directory \\`$tmpdir'\" 1>&2\n\t\tcontinue\n\t      fi\n\t      file=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\t      outputname=\"$tmpdir/$file\"\n\t      # Replace the output file specification.\n\t      relink_command=`$echo \"X$relink_command\" | $Xsed -e 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t      $show \"$relink_command\"\n\t      if $run eval \"$relink_command\"; then :\n\t      else\n\t\t$echo \"$modename: error: relink \\`$file' with the above command before installing it\" 1>&2\n\t\t${rm}r \"$tmpdir\"\n\t\tcontinue\n\t      fi\n\t      file=\"$outputname\"\n\t    else\n\t      $echo \"$modename: warning: cannot relink \\`$file'\" 1>&2\n\t    fi\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$echo \"X$file\" | $Xsed -e \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyways\n\tcase $install_prog,$host in\n\t/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    destfile=`echo $destfile | sed -e 's,.exe$,,'`\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\t$show \"$install_prog$stripme $file $destfile\"\n\t$run eval \"$install_prog\\$stripme \\$file \\$destfile\" || exit $?\n\ttest -n \"$outputname\" && ${rm}r \"$tmpdir\"\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      name=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n\n      $show \"$install_prog $file $oldlib\"\n      $run eval \"$install_prog \\$file \\$oldlib\" || exit $?\n\n      if test -n \"$stripme\" && test -n \"$striplib\"; then\n\t$show \"$old_striplib $oldlib\"\n\t$run eval \"$old_striplib $oldlib\" || exit $?\n      fi\n\n      # Do each command in the postinstall commands.\n      eval cmds=\\\"$old_postinstall_cmds\\\"\n      save_ifs=\"$IFS\"; IFS='~'\n      for cmd in $cmds; do\n\tIFS=\"$save_ifs\"\n\t$show \"$cmd\"\n\t$run eval \"$cmd\" || exit $?\n      done\n      IFS=\"$save_ifs\"\n    done\n\n    if test -n \"$future_libdirs\"; then\n      $echo \"$modename: warning: remember to run \\`$progname --finish$future_libdirs'\" 1>&2\n    fi\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      test -n \"$run\" && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $0 --finish$current_libdirs'\n    else\n      exit 0\n    fi\n    ;;\n\n  # libtool finish mode\n  finish)\n    modename=\"$modename: finish\"\n    libdirs=\"$nonopt\"\n    admincmds=\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for dir\n      do\n\tlibdirs=\"$libdirs $dir\"\n      done\n\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  eval cmds=\\\"$finish_cmds\\\"\n\t  save_ifs=\"$IFS\"; IFS='~'\n\t  for cmd in $cmds; do\n\t    IFS=\"$save_ifs\"\n\t    $show \"$cmd\"\n\t    $run eval \"$cmd\" || admincmds=\"$admincmds\n       $cmd\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $run eval \"$cmds\" || admincmds=\"$admincmds\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    test \"$show\" = \":\" && exit 0\n\n    echo \"----------------------------------------------------------------------\"\n    echo \"Libraries have been installed in:\"\n    for libdir in $libdirs; do\n      echo \"   $libdir\"\n    done\n    echo\n    echo \"If you ever happen to want to link against installed libraries\"\n    echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n    echo \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n    echo \"flag during linking and do at least one of the following:\"\n    if test -n \"$shlibpath_var\"; then\n      echo \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n      echo \"     during execution\"\n    fi\n    if test -n \"$runpath_var\"; then\n      echo \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n      echo \"     during linking\"\n    fi\n    if test -n \"$hardcode_libdir_flag_spec\"; then\n      libdir=LIBDIR\n      eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n      echo \"   - use the \\`$flag' linker flag\"\n    fi\n    if test -n \"$admincmds\"; then\n      echo \"   - have your system administrator run these commands:$admincmds\"\n    fi\n    if test -f /etc/ld.so.conf; then\n      echo \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n    fi\n    echo\n    echo \"See any operating system documentation about shared libraries for\"\n    echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n    echo \"----------------------------------------------------------------------\"\n    exit 0\n    ;;\n\n  # libtool execute mode\n  execute)\n    modename=\"$modename: execute\"\n\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    if test -z \"$cmd\"; then\n      $echo \"$modename: you must specify a COMMAND\" 1>&2\n      $echo \"$help\"\n      exit 1\n    fi\n\n    # Handle -dlopen flags immediately.\n    for file in $execute_dlfiles; do\n      if test ! -f \"$file\"; then\n\t$echo \"$modename: \\`$file' is not a file\" 1>&2\n\t$echo \"$help\" 1>&2\n\texit 1\n      fi\n\n      dir=\n      case $file in\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then :\n\telse\n\t  $echo \"$modename: \\`$lib' is not a valid libtool archive\" 1>&2\n\t  $echo \"$help\" 1>&2\n\t  exit 1\n\tfi\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\n\t# If there is no directory component, then add one.\n\tcase $file in\n\t*/* | *\\\\*) . $file ;;\n\t*) . ./$file ;;\n\tesac\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && $echo \"$modename: warning: \\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$dir\" = \"X$file\" && dir=.\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  dir=\"$dir/$objdir\"\n\telse\n\t  $echo \"$modename: cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\" 1>&2\n\t  exit 1\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tdir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n\ttest \"X$dir\" = \"X$file\" && dir=.\n\t;;\n\n      *)\n\t$echo \"$modename: warning \\`-dlopen' is ignored for non-libtool libraries and objects\" 1>&2\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -*) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif (sed -e '4q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  # If there is no directory component, then add one.\n\t  case $file in\n\t  */* | *\\\\*) . $file ;;\n\t  *) . ./$file ;;\n\t  esac\n\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      file=`$echo \"X$file\" | $Xsed -e \"$sed_quote_subst\"`\n      args=\"$args \\\"$file\\\"\"\n    done\n\n    if test -z \"$run\"; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved enviroment variables\n      if test \"${save_LC_ALL+set}\" = set; then\n\tLC_ALL=\"$save_LC_ALL\"; export LC_ALL\n      fi\n      if test \"${save_LANG+set}\" = set; then\n\tLANG=\"$save_LANG\"; export LANG\n      fi\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$echo \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\t$echo \"export $shlibpath_var\"\n      fi\n      $echo \"$cmd$args\"\n      exit 0\n    fi\n    ;;\n\n  # libtool clean and uninstall mode\n  clean | uninstall)\n    modename=\"$modename: $mode\"\n    rm=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) rm=\"$rm $arg\"; rmforce=yes ;;\n      -*) rm=\"$rm $arg\" ;;\n      *) files=\"$files $arg\" ;;\n      esac\n    done\n\n    if test -z \"$rm\"; then\n      $echo \"$modename: you must specify an RM program\" 1>&2\n      $echo \"$help\" 1>&2\n      exit 1\n    fi\n\n    rmdirs=\n\n    for file in $files; do\n      dir=`$echo \"X$file\" | $Xsed -e 's%/[^/]*$%%'`\n      if test \"X$dir\" = \"X$file\"; then\n\tdir=.\n\tobjdir=\"$objdir\"\n      else\n\tobjdir=\"$dir/$objdir\"\n      fi\n      name=`$echo \"X$file\" | $Xsed -e 's%^.*/%%'`\n      test $mode = uninstall && objdir=\"$dir\"\n\n      # Remember objdir for removal later, being careful to avoid duplicates\n      if test $mode = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $objdir \"*) ;;\n\t  *) rmdirs=\"$rmdirs $objdir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if (test -L \"$file\") >/dev/null 2>&1 \\\n\t|| (test -h \"$file\") >/dev/null 2>&1 \\\n\t|| test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif (sed -e '2q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  . $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    rmfiles=\"$rmfiles $objdir/$n\"\n\t  done\n\t  test -n \"$old_library\" && rmfiles=\"$rmfiles $objdir/$old_library\"\n\t  test $mode = clean && rmfiles=\"$rmfiles $objdir/$name $objdir/${name}i\"\n\n\t  if test $mode = uninstall; then\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      eval cmds=\\\"$postuninstall_cmds\\\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\"\n\t\tif test $? != 0 && test \"$rmforce\" != yes; then\n\t\t  exit_status=1\n\t\tfi\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      eval cmds=\\\"$old_postuninstall_cmds\\\"\n\t      save_ifs=\"$IFS\"; IFS='~'\n\t      for cmd in $cmds; do\n\t\tIFS=\"$save_ifs\"\n\t\t$show \"$cmd\"\n\t\t$run eval \"$cmd\"\n\t\tif test $? != 0 && test \"$rmforce\" != yes; then\n\t\t  exit_status=1\n\t\tfi\n\t      done\n\t      IFS=\"$save_ifs\"\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\tif test \"$build_old_libs\" = yes; then\n\t  oldobj=`$echo \"X$name\" | $Xsed -e \"$lo2o\"`\n\t  rmfiles=\"$rmfiles $dir/$oldobj\"\n\tfi\n\t;;\n\n      *)\n\t# Do a test to see if this is a libtool program.\n\tif test $mode = clean &&\n\t   (sed -e '4q' $file | egrep \"^# Generated by .*$PACKAGE\") >/dev/null 2>&1; then\n\t  relink_command=\n\t  . $dir/$file\n\n\t  rmfiles=\"$rmfiles $objdir/$name $objdir/${name}S.${objext}\"\n\t  if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t    rmfiles=\"$rmfiles $objdir/lt-$name\"\n\t  fi\n\tfi\n\t;;\n      esac\n      $show \"$rm $rmfiles\"\n      $run $rm $rmfiles || exit_status=1\n    done\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\t$show \"rmdir $dir\"\n\t$run rmdir $dir >/dev/null 2>&1\n      fi\n    done\n\n    exit $exit_status\n    ;;\n\n  \"\")\n    $echo \"$modename: you must specify a MODE\" 1>&2\n    $echo \"$generic_help\" 1>&2\n    exit 1\n    ;;\n  esac\n\n  if test -z \"$exec_cmd\"; then\n    $echo \"$modename: invalid operation mode \\`$mode'\" 1>&2\n    $echo \"$generic_help\" 1>&2\n    exit 1\n  fi\nfi # test -z \"$show_help\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec $exec_cmd\n  exit 1\nfi\n\n# We need to display help for each of the modes.\ncase $mode in\n\"\") $echo \\\n\"Usage: $modename [OPTION]... [MODE-ARG]...\n\nProvide generalized library-building support services.\n\n    --config          show all configuration variables\n    --debug           enable verbose shell tracing\n-n, --dry-run         display commands without modifying any files\n    --features        display basic configuration information and exit\n    --finish          same as \\`--mode=finish'\n    --help            display this help message and exit\n    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]\n    --quiet           same as \\`--silent'\n    --silent          don't print informational messages\n    --version         print version information\n\nMODE must be one of the following:\n\n      clean           remove files from the build directory\n      compile         compile a source file into a libtool object\n      execute         automatically set library path, then run a program\n      finish          complete the installation of libtool libraries\n      install         install libraries or executables\n      link            create a library or an executable\n      uninstall       remove libraries from an installed directory\n\nMODE-ARGS vary depending on the MODE.  Try \\`$modename --help --mode=MODE' for\na more detailed description of MODE.\"\n  exit 0\n  ;;\n\nclean)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n  ;;\n\ncompile)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -prefer-pic       try to building PIC objects only\n  -prefer-non-pic   try to building non-PIC objects only\n  -static           always build a \\`.o' file suitable for static linking\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n  ;;\n\nexecute)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n  ;;\n\nfinish)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n  ;;\n\ninstall)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n  ;;\n\nlink)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n\t\t    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n\t\t    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -static           do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n\t\t    specify library version info [each variable defaults to 0]\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n  ;;\n\nuninstall)\n  $echo \\\n\"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n  ;;\n\n*)\n  $echo \"$modename: invalid operation mode \\`$mode'\" 1>&2\n  $echo \"$help\" 1>&2\n  exit 1\n  ;;\nesac\n\necho\n$echo \"Try \\`$modename --help' for more information about other modes.\"\n\nexit 0\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n"
  },
  {
    "path": "src/getdate.h",
    "content": "/*  Copyright (C) 1995 Free Software Foundation, Inc.\n\n   This program is free software; you can redistribute it and/or modify\n   it under the terms of the GNU General Public License as published by\n   the Free Software Foundation; either version 2, or (at your option)\n   any later version.\n\n   This program is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n   GNU General Public License for more details.\n\n   You should have received a copy of the GNU General Public License\n   along with this program; if not, write to the Free Software Foundation,\n   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */\n\n#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n#if defined (vms)\n# include <types.h>\n# include <time.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n# include <sys/types.h>\n# ifdef TIME_WITH_SYS_TIME\n#  include <sys/time.h>\n#  include <time.h>\n# else\n#  ifdef HAVE_SYS_TIME_H\n#   include <sys/time.h>\n#  else\n#   include <time.h>\n#  endif\n# endif\n#endif\t\t\t\t/* defined (vms) */\n\n#ifdef NO_MACRO\n#undef isspace\n#undef isdigit\n#undef isalpha\n#undef isupper\n#undef islower\n#undef isxdigit\n#undef isalnum\n#undef ispunct\n#undef isprint\n#undef isgraph\n#undef iscntrl\n#undef isascii\n#endif\n\ntime_t get_date (const char *p, const time_t *now);\n"
  },
  {
    "path": "src/getdate.texi",
    "content": "@node Date input formats\r\n@chapter Date input formats\r\n\r\n@cindex date input formats\r\n@findex getdate\r\n\r\n@quotation\r\nOur units of temporal measurement, from seconds on up to months, are so\r\ncomplicated, asymmetrical and disjunctive so as to make coherent mental\r\nreckoning in time all but impossible.  Indeed, had some tyrannical god\r\ncontrived to enslave our minds to time, to make it all but impossible\r\nfor us to escape subjection to sodden routines and unpleasant surprises,\r\nhe could hardly have done better than handing down our present system.\r\nIt is like a set of trapezoidal building blocks, with no vertical or\r\nhorizontal surfaces, like a language in which the simplest thought\r\ndemands ornate constructions, useless particles and lengthy\r\ncircumlocutions.  Unlike the more successful patterns of language and\r\nscience, which enable us to face experience boldly or at least\r\nlevel-headedly, our system of temporal calculation silently and\r\npersistently encourages our terror of time.\r\n\r\n@dots{}  It is as though architects had to measure length in feet, width\r\nin meters and height in ells; as though basic instruction manuals\r\ndemanded a knowledge of five different languages.  It is no wonder then\r\nthat we often look into our own immediate past or future, last Tuesday\r\nor a week from Sunday, with feelings of helpless confusion.  @dots{}\r\n\r\n--- Robert Grudin, @cite{Time and the Art of Living}.\r\n@end quotation\r\n\r\nThis section describes the textual date representations that GNU\r\nprograms accept.  These are the strings you, as a user, can supply as\r\narguments to the various programs.  The C interface (via the\r\n@code{getdate} function) is not described here.\r\n\r\n@cindex beginning of time, for Unix\r\n@cindex epoch, for Unix\r\nAlthough the date syntax here can represent any possible time since zero\r\nA.D., computer integers are not big enough for such a (comparatively)\r\nlong time.  The earliest date semantically allowed on Unix systems is\r\nmidnight, 1 January 1970 UCT.\r\n\r\n@menu\r\n* General date syntax::            Common rules.\r\n* Calendar date item::             19 Dec 1994.\r\n* Time of day item::               9:20pm.\r\n* Timezone item::                  EST, DST, BST, UCT, AHST, ...\r\n* Day of week item::               Monday and others.\r\n* Relative item in date strings::  next tuesday, 2 years ago.\r\n* Pure numbers in date strings::   19931219, 1440.\r\n* Authors of getdate::             Bellovin, Salz, Berets, et al.\r\n@end menu\r\n\r\n\r\n@node General date syntax\r\n@section General date syntax\r\n\r\n@cindex general date syntax\r\n\r\n@cindex items in date strings\r\nA @dfn{date} is a string, possibly empty, containing many items\r\nseparated by whitespace.  The whitespace may be omitted when no\r\nambiguity arises.  The empty string means the beginning of today (i.e.,\r\nmidnight).  Order of the items is immaterial.  A date string may contain\r\nmany flavors of items:\r\n\r\n@itemize @bullet\r\n@item calendar date items\r\n@item time of the day items\r\n@item time zone items\r\n@item day of the week items\r\n@item relative items\r\n@item pure numbers.\r\n@end itemize\r\n\r\n@noindent We describe each of these item types in turn, below.\r\n\r\n@cindex numbers, written-out\r\n@cindex ordinal numbers\r\n@findex first @r{in date strings}\r\n@findex next @r{in date strings}\r\n@findex last @r{in date strings}\r\nA few numbers may be written out in words in most contexts.  This is\r\nmost useful for specifying day of the week items or relative items (see\r\nbelow).  Here is the list: @samp{first} for 1, @samp{next} for 2,\r\n@samp{third} for 3, @samp{fourth} for 4, @samp{fifth} for 5,\r\n@samp{sixth} for 6, @samp{seventh} for 7, @samp{eighth} for 8,\r\n@samp{ninth} for 9, @samp{tenth} for 10, @samp{eleventh} for 11 and\r\n@samp{twelfth} for 12.  Also, @samp{last} means exactly @math{-1}.\r\n\r\n@cindex months, written-out\r\nWhen a month is written this way, it is still considered to be written\r\nnumerically, instead of being ``spelled in full''; this changes the\r\nallowed strings.\r\n\r\n@cindex case, ignored in dates\r\n@cindex comments, in dates\r\nAlphabetic case is completely ignored in dates.  Comments may be introduced\r\nbetween round parentheses, as long as included parentheses are properly\r\nnested.  Hyphens not followed by a digit are currently ignored.  Leading\r\nzeros on numbers are ignored.\r\n\r\n\r\n@node Calendar date item\r\n@section Calendar date item\r\n\r\n@cindex calendar date item\r\n\r\nA @dfn{calendar date item} specifies a day of the year.  It is\r\nspecified differently, depending on whether the month is specified\r\nnumerically or literally.  All these strings specify the same calendar date:\r\n\r\n@example\r\n1970-09-17           # ISO 8601.\r\n70-9-17              # This century assumed by default.\r\n70-09-17             # Leading zeros are ignored.\r\n9/17/72              # Common U.S. writing.\r\n24 September 1972\r\n24 Sept 72           # September has a special abbreviation.\r\n24 Sep 72            # Three-letter abbreviations always allowed.\r\nSep 24, 1972\r\n24-sep-72\r\n24sep72\r\n@end example\r\n\r\nThe year can also be omitted.  In this case, the last specified year is\r\nused, or the current year if none.  For example:\r\n\r\n@example\r\n9/17\r\nsep 17\r\n@end example\r\n\r\nHere are the rules.\r\n\r\n@cindex ISO 8601 date format\r\n@cindex date format, ISO 8601\r\nFor numeric months, the ISO 8601 format\r\n@samp{@var{year}-@var{month}-@var{day}} is allowed, where @var{year} is\r\nany positive number, @var{month} is a number between 01 and 12, and\r\n@var{day} is a number between 01 and 31.  A leading zero must be present\r\nif a number is less than ten.  If @var{year} is less than 100, then 1900\r\nis added to it to force a date in this century.  The construct\r\n@samp{@var{month}/@var{day}/@var{year}}, popular in the United States,\r\nis accepted.  Also @samp{@var{month}/@var{day}}, omitting the year.\r\n\r\n@cindex month names in date strings\r\n@cindex abbreviations for months\r\nLiteral months may be spelled out in full: @samp{January},\r\n@samp{February}, @samp{March}, @samp{April}, @samp{May}, @samp{June},\r\n@samp{July}, @samp{August}, @samp{September}, @samp{October},\r\n@samp{November} or @samp{December}.  Literal months may be abbreviated\r\nto their first three letters, possibly followed by an abbreviating dot.\r\nIt is also permitted to write @samp{Sept} instead of @samp{September}.\r\n\r\nWhen months are written literally, the calendar date may be given as any\r\nof the following:\r\n\r\n@example\r\n@var{day} @var{month} @var{year}\r\n@var{day} @var{month}\r\n@var{month} @var{day} @var{year}\r\n@var{day}-@var{month}-@var{year}\r\n@end example\r\n\r\nOr, omitting the year:\r\n\r\n@example\r\n@var{month} @var{day}\r\n@end example\r\n\r\n\r\n@node Time of day item\r\n@section Time of day item\r\n\r\n@cindex time of day item\r\n\r\nA @dfn{time of day item} in date strings specifies the time on a given\r\nday.  Here are some examples, all of which represent the same time:\r\n\r\n@example\r\n20:02:0\r\n20:02\r\n8:02pm\r\n20:02-0500      # In EST (Eastern U.S. Standard Time).\r\n@end example\r\n\r\nMore generally, the time of the day may be given as\r\n@samp{@var{hour}:@var{minute}:@var{second}}, where @var{hour} is\r\na number between 0 and 23, @var{minute} is a number between 0 and\r\n59, and @var{second} is a number between 0 and 59.  Alternatively,\r\n@samp{:@var{second}} can be omitted, in which case it is taken to\r\nbe zero.\r\n\r\n@findex am @r{in date strings}\r\n@findex pm @r{in date strings}\r\n@findex midnight @r{in date strings}\r\n@findex noon @r{in date strings}\r\nIf the time is followed by @samp{am} or @samp{pm} (or @samp{a.m.}\r\nor @samp{p.m.}), @var{hour} is restricted to run from 1 to 12, and\r\n@samp{:@var{minute}} may be omitted (taken to be zero).  @samp{am}\r\nindicates the first half of the day, @samp{pm} indicates the second\r\nhalf of the day.  In this notation, 12 is the predecessor of 1:\r\nmidnight is @samp{12am} while noon is @samp{12pm}.\r\n\r\n@cindex timezone correction\r\n@cindex minutes, timezone correction by\r\nThe time may alternatively be followed by a timezone correction,\r\nexpressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+}\r\nor @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number\r\nof zone minutes.  When a timezone correction is given this way, it\r\nforces interpretation of the time in UTC, overriding any previous\r\nspecification for the timezone or the local timezone.  The @var{minute}\r\npart of the time of the day may not be elided when a timezone correction\r\nis used.  This is the only way to specify a timezone correction by\r\nfractional parts of an hour.\r\n\r\nEither @samp{am}/@samp{pm} or a timezone correction may be specified,\r\nbut not both.\r\n\r\n\r\n@node Timezone item\r\n@section Timezone item\r\n\r\n@cindex timezone item\r\n\r\nA @dfn{timezone item} specifies an international timezone, indicated by\r\na small set of letters.  Any included period is ignored.  Military\r\ntimezone designations use a single letter.  Currently, only integral\r\nzone hours may be represented in a timezone item.  See the previous\r\nsection for a finer control over the timezone correction.\r\n\r\nHere are many non-daylight-savings-time timezones, indexed by the zone\r\nhour value.\r\n\r\n@table @asis\r\n@item +000\r\n@cindex Greenwich Mean Time\r\n@cindex Universal Coordinated Time\r\n@cindex Western European Time\r\n@samp{GMT} for Greenwich Mean, @samp{UT} or @samp{UTC} for Universal\r\n(Coordinated), @samp{WET} for Western European and @samp{Z} for\r\nmilitaries.\r\n@item +100\r\n@cindex West African Time\r\n@samp{WAT} for West Africa and\r\n@samp{A} for militaries.\r\n@item +200\r\n@cindex Azores Time\r\n@samp{AT} for Azores and @samp{B} for militaries.\r\n@item +300\r\n@samp{C} for militaries.\r\n@item +400\r\n@cindex Atlantic Standard Time\r\n@samp{AST} for Atlantic Standard and @samp{D} for militaries.\r\n@item +500\r\n@cindex Eastern Standard Time\r\n@samp{E} for militaries and @samp{EST} for Eastern Standard.\r\n@item +600\r\n@cindex Central Standard Time\r\n@samp{CST} for Central Standard and @samp{F} for militaries.\r\n@item +700\r\n@cindex Mountain Standard Time\r\n@samp{G} for militaries and @samp{MST} for Mountain Standard.\r\n@item +800\r\n@cindex Pacific Standard Time\r\n@samp{H} for militaries and @samp{PST} for Pacific Standard.\r\n@item +900\r\n@cindex Yukon Standard Time\r\n@samp{I} for militaries and @samp{YST} for Yukon Standard.\r\n@item +1000\r\n@cindex Alaska-Hawaii Time\r\n@cindex Central Alaska Time\r\n@cindex Hawaii Standard Time\r\n@samp{AHST} for Alaska-Hawaii Standard, @samp{CAT} for Central Alaska,\r\n@samp{HST} for Hawaii Standard and @samp{K} for militaries.\r\n@item +1100\r\n@cindex Nome Standard Time\r\n@samp{L} for militaries and @samp{NT} for Nome.\r\n@item +1200\r\n@cindex International Date Line West\r\n@samp{IDLW} for International Date Line West and @samp{M} for\r\nmilitaries.\r\n@item -100\r\n@cindex Central European Time\r\n@cindex Middle European Time\r\n@cindex Middle European Winter Time\r\n@cindex French Winter Time\r\n@cindex Swedish Winter Time\r\n@samp{CET} for Central European, @samp{FWT} for French Winter,\r\n@samp{MET} for Middle European, @samp{MEWT} for Middle European\r\nWinter, @samp{N} for militaries and @samp{SWT} for Swedish Winter.\r\n@item -200\r\n@cindex Eastern European Time\r\n@cindex USSR Zone\r\n@samp{EET} for Eastern European, USSR Zone 1 and @samp{O} for militaries.\r\n@item -300\r\n@cindex Baghdad Time\r\n@samp{BT} for Baghdad, USSR Zone 2 and @samp{P} for militaries.\r\n@item -400\r\n@samp{Q} for militaries and @samp{ZP4} for USSR Zone 3.\r\n@item -500\r\n@samp{R} for militaries and @samp{ZP5} for USSR Zone 4.\r\n@item -600\r\n@samp{S} for militaries and @samp{ZP6} for USSR Zone 5.\r\n@item -700\r\n@cindex West Australian Standard Time\r\n@samp{T} for militaries and @samp{WAST} for West Australian Standard.\r\n@item -800\r\n@cindex China Coast Time\r\n@samp{CCT} for China Coast, USSR Zone 7 and @samp{U} for militaries.\r\n@item -900\r\n@cindex Japan Standard Time\r\n@samp{JST} for Japan Standard, USSR Zone 8 and @samp{V} for militaries.\r\n@item -1000\r\n@cindex East Australian Standard Time\r\n@cindex Guam Standard Time\r\n@samp{EAST} for East Australian Standard, @samp{GST} for Guam\r\nStandard, USSR Zone 9 and @samp{W} for militaries.\r\n@item -1100\r\n@samp{X} for militaries.\r\n@item -1200\r\n@cindex International Date Line East\r\n@cindex New Zealand Standard Time\r\n@samp{IDLE} for International Date Line East, @samp{NZST} for\r\nNew Zealand Standard, @samp{NZT} for New Zealand and @samp{Y} for\r\nmilitaries.\r\n@end table\r\n\r\n@cindex daylight savings time\r\nHere are many DST timezones, indexed by the zone hour value.  Also, by\r\nfollowing a non-DST timezone by the string @samp{DST} in a separate word\r\n(that is, separated by some whitespace), the corresponding DST timezone\r\nmay be specified.\r\n\r\n@table @asis\r\n@item 0\r\n@samp{BST} for British Summer.\r\n@item +400\r\n@samp{ADT} for Atlantic Daylight.\r\n@item +500\r\n@samp{EDT} for Eastern Daylight.\r\n@item +600\r\n@samp{CDT} for Central Daylight.\r\n@item +700\r\n@samp{MDT} for Mountain Daylight.\r\n@item +800\r\n@samp{PDT} for Pacific Daylight.\r\n@item +900\r\n@samp{YDT} for Yukon Daylight.\r\n@item +1000\r\n@samp{HDT} for Hawaii Daylight.\r\n@item -100\r\n@samp{MEST} for Middle European Summer, @samp{MESZ} for Middle European\r\nSummer, @samp{SST} for Swedish Summer and @samp{FST} for French Summer.\r\n@item -700\r\n@samp{WADT} for West Australian Daylight.\r\n@item -1000\r\n@samp{EADT} for Eastern Australian Daylight.\r\n@item -1200\r\n@samp{NZDT} for New Zealand Daylight.\r\n@end table\r\n\r\n\r\n@node Day of week item\r\n@section Day of week item\r\n\r\n@cindex day of week item\r\n\r\nThe explicit mention of a day of the week will forward the date\r\n(only if necessary) to reach that day of the week in the future.\r\n\r\nDays of the week may be spelled out in full: @samp{Sunday},\r\n@samp{Monday}, @samp{Tuesday}, @samp{Wednesday}, @samp{Thursday},\r\n@samp{Friday} or @samp{Saturday}.  Days may be abbreviated to their\r\nfirst three letters, optionally followed by a period.  The special\r\nabbreviations @samp{Tues} for @samp{Tuesday}, @samp{Wednes} for\r\n@samp{Wednesday} and @samp{Thur} or @samp{Thurs} for @samp{Thursday} are\r\nalso allowed.\r\n\r\n@findex next @var{day}\r\n@findex last @var{day}\r\nA number may precede a day of the week item to move forward\r\nsupplementary weeks.  It is best used in expression like @samp{third\r\nmonday}.  In this context, @samp{last @var{day}} or @samp{next\r\n@var{day}} is also acceptable; they move one week before or after\r\nthe day that @var{day} by itself would represent.\r\n\r\nA comma following a day of the week item is ignored.\r\n\r\n\r\n@node Relative item in date strings\r\n@section Relative item in date strings\r\n\r\n@cindex relative items in date strings\r\n@cindex displacement of dates\r\n\r\n@dfn{Relative items} adjust a date (or the current date if none) forward\r\nor backward.  The effects of relative items accumulate.  Here are some\r\nexamples:\r\n\r\n@example\r\n1 year\r\n1 year ago\r\n3 years\r\n2 days\r\n@end example\r\n\r\n@findex year @r{in date strings}\r\n@findex month @r{in date strings}\r\n@findex fortnight @r{in date strings}\r\n@findex week @r{in date strings}\r\n@findex day @r{in date strings}\r\n@findex hour @r{in date strings}\r\n@findex minute @r{in date strings}\r\nThe unit of time displacement may be selected by the string @samp{year}\r\nor @samp{month} for moving by whole years or months.  These are fuzzy\r\nunits, as years and months are not all of equal duration.  More precise\r\nunits are @samp{fortnight} which is worth 14 days, @samp{week} worth 7\r\ndays, @samp{day} worth 24 hours, @samp{hour} worth 60 minutes,\r\n@samp{minute} or @samp{min} worth 60 seconds, and @samp{second} or\r\n@samp{sec} worth one second.  An @samp{s} suffix on these units is\r\naccepted and ignored.\r\n\r\n@findex ago @r{in date strings}\r\nThe unit of time may be preceded by a multiplier, given as an optionally\r\nsigned number.  Unsigned numbers are taken as positively signed.  No\r\nnumber at all implies 1 for a multiplier.  Following a relative item by\r\nthe string @samp{ago} is equivalent to preceding the unit by a\r\nmultiplicator with value @math{-1}.\r\n\r\n@findex day @r{in date strings}\r\n@findex tomorrow @r{in date strings}\r\n@findex yesterday @r{in date strings}\r\nThe string @samp{tomorrow} is worth one day in the future (equivalent\r\nto @samp{day}), the string @samp{yesterday} is worth\r\none day in the past (equivalent to @samp{day ago}).\r\n\r\n@findex now @r{in date strings}\r\n@findex today @r{in date strings}\r\n@findex this @r{in date strings}\r\nThe strings @samp{now} or @samp{today} are relative items corresponding\r\nto zero-valued time displacement, these strings come from the fact\r\na zero-valued time displacement represents the current time when not\r\notherwise change by previous items.  They may be used to stress other\r\nitems, like in @samp{12:00 today}.  The string @samp{this} also has\r\nthe meaning of a zero-valued time displacement, but is preferred in\r\ndate strings like @samp{this thursday}.\r\n\r\nWhen a relative item makes the resulting date to cross the boundary\r\nbetween DST and non-DST (or vice-versa), the hour is adjusted according\r\nto the local time.\r\n\r\n\r\n@node Pure numbers in date strings\r\n@section Pure numbers in date strings\r\n\r\n@cindex pure numbers in date strings\r\n\r\nThe precise intepretation of a pure decimal number is dependent of\r\nthe context in the date string.\r\n\r\nIf the decimal number is of the form @var{yyyy}@var{mm}@var{dd} and no\r\nother calendar date item (@pxref{Calendar date item}) appears before it\r\nin the date string, then @var{yyyy} is read as the year, @var{mm} as the\r\nmonth number and @var{dd} as the day of the month, for the specified\r\ncalendar date.\r\n\r\nIf the decimal number is of the form @var{hh}@var{mm} and no other time\r\nof day item appears before it in the date string, then @var{hh} is read\r\nas the hour of the day and @var{mm} as the minute of the hour, for the\r\nspecified time of the day.  @var{mm} can also be omitted.\r\n\r\nIf both a calendar date and a time of day appear to the left of a number\r\nin the date string, but no relative item, then the number overrides the\r\nyear.\r\n\r\n\r\n@node Authors of getdate\r\n@section Authors of @code{getdate}\r\n\r\n@cindex authors of @code{getdate}\r\n\r\n@cindex Bellovin, Steven M.\r\n@cindex Salz, Rich\r\n@cindex Berets, Jim\r\n@cindex MacKenzie, David\r\n@cindex Meyering, Jim\r\n@code{getdate} was originally implemented by Steven M. Bellovin\r\n(@samp{smb@@research.att.com}) while at the University of North Carolina\r\nat Chapel Hill.  The code was later tweaked by a couple of people on\r\nUsenet, then completely overhauled by Rich $alz (@samp{rsalz@@bbn.com})\r\nand Jim Berets (@samp{jberets@@bbn.com}) in August, 1990.  Various\r\nrevisions for the GNU system were made by David MacKenzie, Jim Meyering,\r\nand others.\r\n\r\n@cindex Pinard, F.\r\n@cindex Berry, K.\r\nThis chapter was originally produced by Fran@,{c}ois Pinard\r\n(@samp{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,\r\nand then edited by K.@: Berry (@samp{kb@@cs.umb.edu}).\r\n"
  },
  {
    "path": "src/getdate.y",
    "content": "%{\n/*\n**  Originally written by Steven M. Bellovin <smb@research.att.com> while\n**  at the University of North Carolina at Chapel Hill.  Later tweaked by\n**  a couple of people on Usenet.  Completely overhauled by Rich $alz\n**  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;\n**\n**  This grammar has 13 shift/reduce conflicts.\n**\n**  This code is in the public domain and has no copyright.\n*/\n\n#include \"../config.h\"\n#include \"setup.h\"\n\n#ifdef HAVE_CONFIG_H\n# ifdef FORCE_ALLOCA_H\n#  include <alloca.h>\n# endif\n#endif\n\n/* Since the code of getdate.y is not included in the Emacs executable\n   itself, there is no need to #define static in this file.  Even if\n   the code were included in the Emacs executable, it probably\n   wouldn't do any harm to #undef it here; this will only cause\n   problems if we try to write to a static variable, which I don't\n   think this code needs to do.  */\n#ifdef emacs\n# undef static\n#endif\n\n#ifdef HAVE_STDIO_H\n#include <stdio.h>\n#endif\n\n#ifdef HAVE_CTYPE_H\n#include <ctype.h>\n#endif\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))\n# define IN_CTYPE_DOMAIN(c) 1\n#else\n# define IN_CTYPE_DOMAIN(c) isascii(c)\n#endif\n\n#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))\n#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))\n#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))\n#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))\n\n/* ISDIGIT differs from ISDIGIT_LOCALE, as follows:\n   - Its arg may be any int or unsigned int; it need not be an unsigned char.\n   - It's guaranteed to evaluate its argument exactly once.\n   - It's typically faster.\n   Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that\n   only '0' through '9' are digits.  Prefer ISDIGIT to ISDIGIT_LOCALE unless\n   it's important to use the locale's definition of `digit' even when the\n   host does not conform to Posix.  */\n#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)\n\n#include \"getdate.h\"\n\n#if defined (STDC_HEADERS) || defined (USG)\n# include <string.h>\n#endif\n\n/* Some old versions of bison generate parsers that use bcopy.\n   That loses on systems that don't provide the function, so we have\n   to redefine it here.  */\n#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)\n# define bcopy(from, to, len) memcpy ((to), (from), (len))\n#endif\n\n/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),\n   as well as gratuitiously global symbol names, so we can have multiple\n   yacc generated parsers in the same program.  Note that these are only\n   the variables produced by yacc.  If other parser generators (bison,\n   byacc, etc) produce additional global names that conflict at link time,\n   then those parser generators need to be fixed instead of adding those\n   names to this list. */\n\n#define yymaxdepth gd_maxdepth\n#define yyparse gd_parse\n#define yylex   gd_lex\n#define yyerror gd_error\n#define yylval  gd_lval\n#define yychar  gd_char\n#define yydebug gd_debug\n#define yypact  gd_pact\n#define yyr1    gd_r1\n#define yyr2    gd_r2\n#define yydef   gd_def\n#define yychk   gd_chk\n#define yypgo   gd_pgo\n#define yyact   gd_act\n#define yyexca  gd_exca\n#define yyerrflag gd_errflag\n#define yynerrs gd_nerrs\n#define yyps    gd_ps\n#define yypv    gd_pv\n#define yys     gd_s\n#define yy_yys  gd_yys\n#define yystate gd_state\n#define yytmp   gd_tmp\n#define yyv     gd_v\n#define yy_yyv  gd_yyv\n#define yyval   gd_val\n#define yylloc  gd_lloc\n#define yyreds  gd_reds          /* With YYDEBUG defined */\n#define yytoks  gd_toks          /* With YYDEBUG defined */\n#define yylhs   gd_yylhs\n#define yylen   gd_yylen\n#define yydefred gd_yydefred\n#define yydgoto gd_yydgoto\n#define yysindex gd_yysindex\n#define yyrindex gd_yyrindex\n#define yygindex gd_yygindex\n#define yytable  gd_yytable\n#define yycheck  gd_yycheck\n\nstatic int yylex (void);\nstatic int yyerror (char *s);\nextern int yyparse (void);\n\n#define EPOCH\t\t1970\n#define HOUR(x)\t\t((x) * 60)\n\n#define MAX_BUFF_LEN    128   /* size of buffer to read the date into */\n\n/*\n**  An entry in the lexical lookup table.\n*/\ntypedef struct _TABLE {\n    const char\t*name;\n    int\t\ttype;\n    int\t\tvalue;\n} TABLE;\n\n\n/*\n**  Meridian:  am, pm, or 24-hour style.\n*/\ntypedef enum _MERIDIAN {\n    MERam, MERpm, MER24\n} MERIDIAN;\n\n\n/*\n**  Global variables.  We could get rid of most of these by using a good\n**  union as the yacc stack.  (This routine was originally written before\n**  yacc had the %union construct.)  Maybe someday; right now we only use\n**  the %union very rarely.\n*/\nstatic const char\t*yyInput;\nstatic int\tyyDayOrdinal;\nstatic int\tyyDayNumber;\nstatic int\tyyHaveDate;\nstatic int\tyyHaveDay;\nstatic int\tyyHaveRel;\nstatic int\tyyHaveTime;\nstatic int\tyyHaveZone;\nstatic int\tyyTimezone;\nstatic int\tyyDay;\nstatic int\tyyHour;\nstatic int\tyyMinutes;\nstatic int\tyyMonth;\nstatic int\tyySeconds;\nstatic int\tyyYear;\nstatic MERIDIAN\tyyMeridian;\nstatic int\tyyRelDay;\nstatic int\tyyRelHour;\nstatic int\tyyRelMinutes;\nstatic int\tyyRelMonth;\nstatic int\tyyRelSeconds;\nstatic int\tyyRelYear;\n\n%}\n\n%union {\n    int\t\t\tNumber;\n    enum _MERIDIAN\tMeridian;\n}\n\n%token\ttAGO tDAY tDAY_UNIT tDAYZONE tDST tHOUR_UNIT tID\n%token\ttMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT\n%token\ttSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE\n\n%type\t<Number>\ttDAY tDAY_UNIT tDAYZONE tHOUR_UNIT tMINUTE_UNIT\n%type\t<Number>\ttMONTH tMONTH_UNIT\n%type\t<Number>\ttSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE\n%type\t<Meridian>\ttMERIDIAN o_merid\n\n%%\n\nspec\t: /* NULL */\n\t| spec item\n\t;\n\nitem\t: time {\n\t    yyHaveTime++;\n\t}\n\t| zone {\n\t    yyHaveZone++;\n\t}\n\t| date {\n\t    yyHaveDate++;\n\t}\n\t| day {\n\t    yyHaveDay++;\n\t}\n\t| rel {\n\t    yyHaveRel++;\n\t}\n\t| number\n\t;\n\ntime\t: tUNUMBER tMERIDIAN {\n\t    yyHour = $1;\n\t    yyMinutes = 0;\n\t    yySeconds = 0;\n\t    yyMeridian = $2;\n\t}\n\t| tUNUMBER ':' tUNUMBER o_merid {\n\t    yyHour = $1;\n\t    yyMinutes = $3;\n\t    yySeconds = 0;\n\t    yyMeridian = $4;\n\t}\n\t| tUNUMBER ':' tUNUMBER tSNUMBER {\n\t    yyHour = $1;\n\t    yyMinutes = $3;\n\t    yySeconds = 0;\n\t    yyMeridian = MER24;\n\t    yyHaveZone++;\n\t    yyTimezone = ($4 < 0\n\t\t\t  ? -$4 % 100 + (-$4 / 100) * 60\n\t\t\t  : - ($4 % 100 + ($4 / 100) * 60));\n\t}\n\t| tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {\n\t    yyHour = $1;\n\t    yyMinutes = $3;\n\t    yySeconds = $5;\n\t    yyMeridian = $6;\n\t}\n\t| tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {\n\t    yyHour = $1;\n\t    yyMinutes = $3;\n\t    yySeconds = $5;\n\t    yyMeridian = MER24;\n\t    yyHaveZone++;\n\t    yyTimezone = ($6 < 0\n\t\t\t  ? -$6 % 100 + (-$6 / 100) * 60\n\t\t\t  : - ($6 % 100 + ($6 / 100) * 60));\n\t}\n\t;\n\nzone\t: tZONE {\n\t    yyTimezone = $1;\n\t}\n\t| tDAYZONE {\n\t    yyTimezone = $1 - 60;\n\t}\n\t|\n\t  tZONE tDST {\n\t    yyTimezone = $1 - 60;\n\t}\n\t;\n\nday\t: tDAY {\n\t    yyDayOrdinal = 1;\n\t    yyDayNumber = $1;\n\t}\n\t| tDAY ',' {\n\t    yyDayOrdinal = 1;\n\t    yyDayNumber = $1;\n\t}\n\t| tUNUMBER tDAY {\n\t    yyDayOrdinal = $1;\n\t    yyDayNumber = $2;\n\t}\n\t;\n\ndate\t: tUNUMBER '/' tUNUMBER {\n\t    yyMonth = $1;\n\t    yyDay = $3;\n\t}\n\t| tUNUMBER '/' tUNUMBER '/' tUNUMBER {\n\t  /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.\n\t     The goal in recognizing YYYY/MM/DD is solely to support legacy\n\t     machine-generated dates like those in an RCS log listing.  If\n\t     you want portability, use the ISO 8601 format.  */\n\t  if ($1 >= 1000)\n\t    {\n\t      yyYear = $1;\n\t      yyMonth = $3;\n\t      yyDay = $5;\n\t    }\n\t  else\n\t    {\n\t      yyMonth = $1;\n\t      yyDay = $3;\n\t      yyYear = $5;\n\t    }\n\t}\n\t| tUNUMBER tSNUMBER tSNUMBER {\n\t    /* ISO 8601 format.  yyyy-mm-dd.  */\n\t    yyYear = $1;\n\t    yyMonth = -$2;\n\t    yyDay = -$3;\n\t}\n\t| tUNUMBER tMONTH tSNUMBER {\n\t    /* e.g. 17-JUN-1992.  */\n\t    yyDay = $1;\n\t    yyMonth = $2;\n\t    yyYear = -$3;\n\t}\n\t| tMONTH tUNUMBER {\n\t    yyMonth = $1;\n\t    yyDay = $2;\n\t}\n\t| tMONTH tUNUMBER ',' tUNUMBER {\n\t    yyMonth = $1;\n\t    yyDay = $2;\n\t    yyYear = $4;\n\t}\n\t| tUNUMBER tMONTH {\n\t    yyMonth = $2;\n\t    yyDay = $1;\n\t}\n\t| tUNUMBER tMONTH tUNUMBER {\n\t    yyMonth = $2;\n\t    yyDay = $1;\n\t    yyYear = $3;\n\t}\n\t;\n\nrel\t: relunit tAGO {\n\t    yyRelSeconds = -yyRelSeconds;\n\t    yyRelMinutes = -yyRelMinutes;\n\t    yyRelHour = -yyRelHour;\n\t    yyRelDay = -yyRelDay;\n\t    yyRelMonth = -yyRelMonth;\n\t    yyRelYear = -yyRelYear;\n\t}\n\t| relunit\n\t;\n\nrelunit\t: tUNUMBER tYEAR_UNIT {\n\t    yyRelYear += $1 * $2;\n\t}\n\t| tSNUMBER tYEAR_UNIT {\n\t    yyRelYear += $1 * $2;\n\t}\n\t| tYEAR_UNIT {\n\t    yyRelYear++;\n\t}\n\t| tUNUMBER tMONTH_UNIT {\n\t    yyRelMonth += $1 * $2;\n\t}\n\t| tSNUMBER tMONTH_UNIT {\n\t    yyRelMonth += $1 * $2;\n\t}\n\t| tMONTH_UNIT {\n\t    yyRelMonth++;\n\t}\n\t| tUNUMBER tDAY_UNIT {\n\t    yyRelDay += $1 * $2;\n\t}\n\t| tSNUMBER tDAY_UNIT {\n\t    yyRelDay += $1 * $2;\n\t}\n\t| tDAY_UNIT {\n\t    yyRelDay++;\n\t}\n\t| tUNUMBER tHOUR_UNIT {\n\t    yyRelHour += $1 * $2;\n\t}\n\t| tSNUMBER tHOUR_UNIT {\n\t    yyRelHour += $1 * $2;\n\t}\n\t| tHOUR_UNIT {\n\t    yyRelHour++;\n\t}\n\t| tUNUMBER tMINUTE_UNIT {\n\t    yyRelMinutes += $1 * $2;\n\t}\n\t| tSNUMBER tMINUTE_UNIT {\n\t    yyRelMinutes += $1 * $2;\n\t}\n\t| tMINUTE_UNIT {\n\t    yyRelMinutes++;\n\t}\n\t| tUNUMBER tSEC_UNIT {\n\t    yyRelSeconds += $1 * $2;\n\t}\n\t| tSNUMBER tSEC_UNIT {\n\t    yyRelSeconds += $1 * $2;\n\t}\n\t| tSEC_UNIT {\n\t    yyRelSeconds++;\n\t}\n\t;\n\nnumber\t: tUNUMBER\n          {\n\t    if (yyHaveTime && yyHaveDate && !yyHaveRel)\n\t      yyYear = $1;\n\t    else\n\t      {\n\t\tif ($1>10000)\n\t\t  {\n\t\t    yyHaveDate++;\n\t\t    yyDay= ($1)%100;\n\t\t    yyMonth= ($1/100)%100;\n\t\t    yyYear = $1/10000;\n\t\t  }\n\t\telse\n\t\t  {\n\t\t    yyHaveTime++;\n\t\t    if ($1 < 100)\n\t\t      {\n\t\t\tyyHour = $1;\n\t\t\tyyMinutes = 0;\n\t\t      }\n\t\t    else\n\t\t      {\n\t\t    \tyyHour = $1 / 100;\n\t\t    \tyyMinutes = $1 % 100;\n\t\t      }\n\t\t    yySeconds = 0;\n\t\t    yyMeridian = MER24;\n\t\t  }\n\t      }\n\t  }\n\t;\n\no_merid\t: /* NULL */\n\t  {\n\t    $$ = MER24;\n\t  }\n\t| tMERIDIAN\n\t  {\n\t    $$ = $1;\n\t  }\n\t;\n\n%%\n\n/* Month and day table. */\nstatic TABLE const MonthDayTable[] = {\n    { \"january\",\ttMONTH,  1 },\n    { \"february\",\ttMONTH,  2 },\n    { \"march\",\t\ttMONTH,  3 },\n    { \"april\",\t\ttMONTH,  4 },\n    { \"may\",\t\ttMONTH,  5 },\n    { \"june\",\t\ttMONTH,  6 },\n    { \"july\",\t\ttMONTH,  7 },\n    { \"august\",\t\ttMONTH,  8 },\n    { \"september\",\ttMONTH,  9 },\n    { \"sept\",\t\ttMONTH,  9 },\n    { \"october\",\ttMONTH, 10 },\n    { \"november\",\ttMONTH, 11 },\n    { \"december\",\ttMONTH, 12 },\n    { \"sunday\",\t\ttDAY, 0 },\n    { \"monday\",\t\ttDAY, 1 },\n    { \"tuesday\",\ttDAY, 2 },\n    { \"tues\",\t\ttDAY, 2 },\n    { \"wednesday\",\ttDAY, 3 },\n    { \"wednes\",\t\ttDAY, 3 },\n    { \"thursday\",\ttDAY, 4 },\n    { \"thur\",\t\ttDAY, 4 },\n    { \"thurs\",\t\ttDAY, 4 },\n    { \"friday\",\t\ttDAY, 5 },\n    { \"saturday\",\ttDAY, 6 },\n    { NULL }\n};\n\n/* Time units table. */\nstatic TABLE const UnitsTable[] = {\n    { \"year\",\t\ttYEAR_UNIT,\t1 },\n    { \"month\",\t\ttMONTH_UNIT,\t1 },\n    { \"fortnight\",\ttDAY_UNIT,\t14 },\n    { \"week\",\t\ttDAY_UNIT,\t7 },\n    { \"day\",\t\ttDAY_UNIT,\t1 },\n    { \"hour\",\t\ttHOUR_UNIT,\t1 },\n    { \"minute\",\t\ttMINUTE_UNIT,\t1 },\n    { \"min\",\t\ttMINUTE_UNIT,\t1 },\n    { \"second\",\t\ttSEC_UNIT,\t1 },\n    { \"sec\",\t\ttSEC_UNIT,\t1 },\n    { NULL }\n};\n\n/* Assorted relative-time words. */\nstatic TABLE const OtherTable[] = {\n    { \"tomorrow\",\ttMINUTE_UNIT,\t1 * 24 * 60 },\n    { \"yesterday\",\ttMINUTE_UNIT,\t-1 * 24 * 60 },\n    { \"today\",\t\ttMINUTE_UNIT,\t0 },\n    { \"now\",\t\ttMINUTE_UNIT,\t0 },\n    { \"last\",\t\ttUNUMBER,\t-1 },\n    { \"this\",\t\ttMINUTE_UNIT,\t0 },\n    { \"next\",\t\ttUNUMBER,\t2 },\n    { \"first\",\t\ttUNUMBER,\t1 },\n/*  { \"second\",\t\ttUNUMBER,\t2 }, */\n    { \"third\",\t\ttUNUMBER,\t3 },\n    { \"fourth\",\t\ttUNUMBER,\t4 },\n    { \"fifth\",\t\ttUNUMBER,\t5 },\n    { \"sixth\",\t\ttUNUMBER,\t6 },\n    { \"seventh\",\ttUNUMBER,\t7 },\n    { \"eighth\",\t\ttUNUMBER,\t8 },\n    { \"ninth\",\t\ttUNUMBER,\t9 },\n    { \"tenth\",\t\ttUNUMBER,\t10 },\n    { \"eleventh\",\ttUNUMBER,\t11 },\n    { \"twelfth\",\ttUNUMBER,\t12 },\n    { \"ago\",\t\ttAGO,\t1 },\n    { NULL }\n};\n\n/* The timezone table. */\nstatic TABLE const TimezoneTable[] = {\n    { \"gmt\",\ttZONE,     HOUR ( 0) },\t/* Greenwich Mean */\n    { \"ut\",\ttZONE,     HOUR ( 0) },\t/* Universal (Coordinated) */\n    { \"utc\",\ttZONE,     HOUR ( 0) },\n    { \"wet\",\ttZONE,     HOUR ( 0) },\t/* Western European */\n    { \"bst\",\ttDAYZONE,  HOUR ( 0) },\t/* British Summer */\n    { \"wat\",\ttZONE,     HOUR ( 1) },\t/* West Africa */\n    { \"at\",\ttZONE,     HOUR ( 2) },\t/* Azores */\n#if\t0\n    /* For completeness.  BST is also British Summer, and GST is\n     * also Guam Standard. */\n    { \"bst\",\ttZONE,     HOUR ( 3) },\t/* Brazil Standard */\n    { \"gst\",\ttZONE,     HOUR ( 3) },\t/* Greenland Standard */\n#endif\n#if 0\n    { \"nft\",\ttZONE,     HOUR (3.5) },\t/* Newfoundland */\n    { \"nst\",\ttZONE,     HOUR (3.5) },\t/* Newfoundland Standard */\n    { \"ndt\",\ttDAYZONE,  HOUR (3.5) },\t/* Newfoundland Daylight */\n#endif\n    { \"ast\",\ttZONE,     HOUR ( 4) },\t/* Atlantic Standard */\n    { \"adt\",\ttDAYZONE,  HOUR ( 4) },\t/* Atlantic Daylight */\n    { \"est\",\ttZONE,     HOUR ( 5) },\t/* Eastern Standard */\n    { \"edt\",\ttDAYZONE,  HOUR ( 5) },\t/* Eastern Daylight */\n    { \"cst\",\ttZONE,     HOUR ( 6) },\t/* Central Standard */\n    { \"cdt\",\ttDAYZONE,  HOUR ( 6) },\t/* Central Daylight */\n    { \"mst\",\ttZONE,     HOUR ( 7) },\t/* Mountain Standard */\n    { \"mdt\",\ttDAYZONE,  HOUR ( 7) },\t/* Mountain Daylight */\n    { \"pst\",\ttZONE,     HOUR ( 8) },\t/* Pacific Standard */\n    { \"pdt\",\ttDAYZONE,  HOUR ( 8) },\t/* Pacific Daylight */\n    { \"yst\",\ttZONE,     HOUR ( 9) },\t/* Yukon Standard */\n    { \"ydt\",\ttDAYZONE,  HOUR ( 9) },\t/* Yukon Daylight */\n    { \"hst\",\ttZONE,     HOUR (10) },\t/* Hawaii Standard */\n    { \"hdt\",\ttDAYZONE,  HOUR (10) },\t/* Hawaii Daylight */\n    { \"cat\",\ttZONE,     HOUR (10) },\t/* Central Alaska */\n    { \"ahst\",\ttZONE,     HOUR (10) },\t/* Alaska-Hawaii Standard */\n    { \"nt\",\ttZONE,     HOUR (11) },\t/* Nome */\n    { \"idlw\",\ttZONE,     HOUR (12) },\t/* International Date Line West */\n    { \"cet\",\ttZONE,     -HOUR (1) },\t/* Central European */\n    { \"met\",\ttZONE,     -HOUR (1) },\t/* Middle European */\n    { \"mewt\",\ttZONE,     -HOUR (1) },\t/* Middle European Winter */\n    { \"mest\",\ttDAYZONE,  -HOUR (1) },\t/* Middle European Summer */\n    { \"mesz\",\ttDAYZONE,  -HOUR (1) },\t/* Middle European Summer */\n    { \"swt\",\ttZONE,     -HOUR (1) },\t/* Swedish Winter */\n    { \"sst\",\ttDAYZONE,  -HOUR (1) },\t/* Swedish Summer */\n    { \"fwt\",\ttZONE,     -HOUR (1) },\t/* French Winter */\n    { \"fst\",\ttDAYZONE,  -HOUR (1) },\t/* French Summer */\n    { \"eet\",\ttZONE,     -HOUR (2) },\t/* Eastern Europe, USSR Zone 1 */\n    { \"bt\",\ttZONE,     -HOUR (3) },\t/* Baghdad, USSR Zone 2 */\n#if 0\n    { \"it\",\ttZONE,     -HOUR (3.5) },/* Iran */\n#endif\n    { \"zp4\",\ttZONE,     -HOUR (4) },\t/* USSR Zone 3 */\n    { \"zp5\",\ttZONE,     -HOUR (5) },\t/* USSR Zone 4 */\n#if 0\n    { \"ist\",\ttZONE,     -HOUR (5.5) },/* Indian Standard */\n#endif\n    { \"zp6\",\ttZONE,     -HOUR (6) },\t/* USSR Zone 5 */\n#if\t0\n    /* For completeness.  NST is also Newfoundland Standard, and SST is\n     * also Swedish Summer. */\n    { \"nst\",\ttZONE,     -HOUR (6.5) },/* North Sumatra */\n    { \"sst\",\ttZONE,     -HOUR (7) },\t/* South Sumatra, USSR Zone 6 */\n#endif\t/* 0 */\n    { \"wast\",\ttZONE,     -HOUR (7) },\t/* West Australian Standard */\n    { \"wadt\",\ttDAYZONE,  -HOUR (7) },\t/* West Australian Daylight */\n#if 0\n    { \"jt\",\ttZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */\n#endif\n    { \"javt\",\ttZONE,     -HOUR (7) },/* Java */\n    { \"cct\",\ttZONE,     -HOUR (8) },\t/* China Coast, USSR Zone 7 */\n    { \"jst\",\ttZONE,     -HOUR (9) },\t/* Japan Standard, USSR Zone 8 */\n#if 0\n    { \"cast\",\ttZONE,     -HOUR (9.5) },/* Central Australian Standard */\n    { \"cadt\",\ttDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */\n#endif\n    { \"east\",\ttZONE,     -HOUR (10) },\t/* Eastern Australian Standard */\n    { \"eadt\",\ttDAYZONE,  -HOUR (10) },\t/* Eastern Australian Daylight */\n    { \"gst\",\ttZONE,     -HOUR (10) },\t/* Guam Standard, USSR Zone 9 */\n    { \"nzt\",\ttZONE,     -HOUR (12) },\t/* New Zealand */\n    { \"nzst\",\ttZONE,     -HOUR (12) },\t/* New Zealand Standard */\n    { \"nzdt\",\ttDAYZONE,  -HOUR (12) },\t/* New Zealand Daylight */\n    { \"idle\",\ttZONE,     -HOUR (12) },\t/* International Date Line East */\n    {  NULL  }\n};\n\n/* Military timezone table. */\nstatic TABLE const MilitaryTable[] = {\n    { \"a\",\ttZONE,\tHOUR (  1) },\n    { \"b\",\ttZONE,\tHOUR (  2) },\n    { \"c\",\ttZONE,\tHOUR (  3) },\n    { \"d\",\ttZONE,\tHOUR (  4) },\n    { \"e\",\ttZONE,\tHOUR (  5) },\n    { \"f\",\ttZONE,\tHOUR (  6) },\n    { \"g\",\ttZONE,\tHOUR (  7) },\n    { \"h\",\ttZONE,\tHOUR (  8) },\n    { \"i\",\ttZONE,\tHOUR (  9) },\n    { \"k\",\ttZONE,\tHOUR ( 10) },\n    { \"l\",\ttZONE,\tHOUR ( 11) },\n    { \"m\",\ttZONE,\tHOUR ( 12) },\n    { \"n\",\ttZONE,\tHOUR (- 1) },\n    { \"o\",\ttZONE,\tHOUR (- 2) },\n    { \"p\",\ttZONE,\tHOUR (- 3) },\n    { \"q\",\ttZONE,\tHOUR (- 4) },\n    { \"r\",\ttZONE,\tHOUR (- 5) },\n    { \"s\",\ttZONE,\tHOUR (- 6) },\n    { \"t\",\ttZONE,\tHOUR (- 7) },\n    { \"u\",\ttZONE,\tHOUR (- 8) },\n    { \"v\",\ttZONE,\tHOUR (- 9) },\n    { \"w\",\ttZONE,\tHOUR (-10) },\n    { \"x\",\ttZONE,\tHOUR (-11) },\n    { \"y\",\ttZONE,\tHOUR (-12) },\n    { \"z\",\ttZONE,\tHOUR (  0) },\n    { NULL }\n};\n\n\f\n\n\n/* ARGSUSED */\nstatic int yyerror (char *s)\n{\n  return 0;\n}\n\nstatic int ToHour (int Hours, MERIDIAN Meridian)\n{\n  switch (Meridian)\n    {\n    case MER24:\n      if (Hours < 0 || Hours > 23)\n\treturn -1;\n      return Hours;\n    case MERam:\n      if (Hours < 1 || Hours > 12)\n\treturn -1;\n      if (Hours == 12)\n\tHours = 0;\n      return Hours;\n    case MERpm:\n      if (Hours < 1 || Hours > 12)\n\treturn -1;\n      if (Hours == 12)\n\tHours = 0;\n      return Hours + 12;\n    default:\n      abort ();\n    }\n  /* NOTREACHED */\n}\n\nstatic int ToYear (int Year)\n{\n  if (Year < 0)\n    Year = -Year;\n\n  /* XPG4 suggests that years 00-68 map to 2000-2068, and\n     years 69-99 map to 1969-1999.  */\n  if (Year < 69)\n    Year += 2000;\n  else if (Year < 100)\n    Year += 1900;\n\n  return Year;\n}\n\nstatic int LookupWord (char *buff)\n{\n  register char *p;\n  register char *q;\n  register const TABLE *tp;\n  int i;\n  int abbrev;\n\n  /* Make it lowercase. */\n  for (p = buff; *p; p++)\n    if (ISUPPER (*p))\n      *p = tolower (*p);\n\n  if (strcmp (buff, \"am\") == 0 || strcmp (buff, \"a.m.\") == 0)\n    {\n      yylval.Meridian = MERam;\n      return tMERIDIAN;\n    }\n  if (strcmp (buff, \"pm\") == 0 || strcmp (buff, \"p.m.\") == 0)\n    {\n      yylval.Meridian = MERpm;\n      return tMERIDIAN;\n    }\n\n  /* See if we have an abbreviation for a month. */\n  if (strlen (buff) == 3)\n    abbrev = 1;\n  else if (strlen (buff) == 4 && buff[3] == '.')\n    {\n      abbrev = 1;\n      buff[3] = '\\0';\n    }\n  else\n    abbrev = 0;\n\n  for (tp = MonthDayTable; tp->name; tp++)\n    {\n      if (abbrev)\n\t{\n\t  if (strncmp (buff, tp->name, 3) == 0)\n\t    {\n\t      yylval.Number = tp->value;\n\t      return tp->type;\n\t    }\n\t}\n      else if (strcmp (buff, tp->name) == 0)\n\t{\n\t  yylval.Number = tp->value;\n\t  return tp->type;\n\t}\n    }\n\n  for (tp = TimezoneTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  if (strcmp (buff, \"dst\") == 0)\n    return tDST;\n\n  for (tp = UnitsTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  /* Strip off any plural and try the units table again. */\n  i = strlen (buff) - 1;\n  if (buff[i] == 's')\n    {\n      buff[i] = '\\0';\n      for (tp = UnitsTable; tp->name; tp++)\n\tif (strcmp (buff, tp->name) == 0)\n\t  {\n\t    yylval.Number = tp->value;\n\t    return tp->type;\n\t  }\n      buff[i] = 's';\t\t/* Put back for \"this\" in OtherTable. */\n    }\n\n  for (tp = OtherTable; tp->name; tp++)\n    if (strcmp (buff, tp->name) == 0)\n      {\n\tyylval.Number = tp->value;\n\treturn tp->type;\n      }\n\n  /* Military timezones. */\n  if (buff[1] == '\\0' && ISALPHA (*buff))\n    {\n      for (tp = MilitaryTable; tp->name; tp++)\n\tif (strcmp (buff, tp->name) == 0)\n\t  {\n\t    yylval.Number = tp->value;\n\t    return tp->type;\n\t  }\n    }\n\n  /* Drop out any periods and try the timezone table again. */\n  for (i = 0, p = q = buff; *q; q++)\n    if (*q != '.')\n      *p++ = *q;\n    else\n      i++;\n  *p = '\\0';\n  if (i)\n    for (tp = TimezoneTable; tp->name; tp++)\n      if (strcmp (buff, tp->name) == 0)\n\t{\n\t  yylval.Number = tp->value;\n\t  return tp->type;\n\t}\n\n  return tID;\n}\n\nstatic int yylex (void)\n{\n  register char c;\n  register char *p;\n  char buff[20];\n  int Count;\n  int sign;\n\n  for (;;)\n    {\n      while (ISSPACE (*yyInput))\n\tyyInput++;\n\n      if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')\n\t{\n\t  if (c == '-' || c == '+')\n\t    {\n\t      sign = c == '-' ? -1 : 1;\n\t      if (!ISDIGIT (*++yyInput))\n\t\t/* skip the '-' sign */\n\t\tcontinue;\n\t    }\n\t  else\n\t    sign = 0;\n\t  for (yylval.Number = 0; ISDIGIT (c = *yyInput++);)\n\t    yylval.Number = 10 * yylval.Number + c - '0';\n\t  yyInput--;\n\t  if (sign < 0)\n\t    yylval.Number = -yylval.Number;\n\t  return sign ? tSNUMBER : tUNUMBER;\n\t}\n      if (ISALPHA (c))\n\t{\n\t  for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';)\n\t    if (p < &buff[sizeof buff - 1])\n\t      *p++ = c;\n\t  *p = '\\0';\n\t  yyInput--;\n\t  return LookupWord (buff);\n\t}\n      if (c != '(')\n\treturn *yyInput++;\n      Count = 0;\n      do\n\t{\n\t  c = *yyInput++;\n\t  if (c == '\\0')\n\t    return c;\n\t  if (c == '(')\n\t    Count++;\n\t  else if (c == ')')\n\t    Count--;\n\t}\n      while (Count > 0);\n    }\n}\n\n#define TM_YEAR_ORIGIN 1900\n\n/* Yield A - B, measured in seconds.  */\nstatic long difftm (struct tm *a, struct tm *b)\n{\n  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);\n  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);\n  long days = (\n  /* difference in day of year */\n\t\ta->tm_yday - b->tm_yday\n  /* + intervening leap days */\n\t\t+ ((ay >> 2) - (by >> 2))\n\t\t- (ay / 100 - by / 100)\n\t\t+ ((ay / 100 >> 2) - (by / 100 >> 2))\n  /* + difference in years * 365 */\n\t\t+ (long) (ay - by) * 365\n  );\n  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))\n\t\t+ (a->tm_min - b->tm_min))\n\t  + (a->tm_sec - b->tm_sec));\n}\n\ntime_t get_date (const char *p, const time_t *now)\n{\n  struct tm tm, tm0, *tmp;\n  time_t Start;\n\n  yyInput = p;\n  Start = now ? *now : time ((time_t *) NULL);\n  tmp = (set_gmtime ? gmtime(&Start) : localtime (&Start));\n  yyYear = tmp->tm_year + TM_YEAR_ORIGIN;\n  yyMonth = tmp->tm_mon + 1;\n  yyDay = tmp->tm_mday;\n  yyHour = tmp->tm_hour;\n  yyMinutes = tmp->tm_min;\n  yySeconds = tmp->tm_sec;\n  yyMeridian = MER24;\n  yyRelSeconds = 0;\n  yyRelMinutes = 0;\n  yyRelHour = 0;\n  yyRelDay = 0;\n  yyRelMonth = 0;\n  yyRelYear = 0;\n  yyHaveDate = 0;\n  yyHaveDay = 0;\n  yyHaveRel = 0;\n  yyHaveTime = 0;\n  yyHaveZone = 0;\n\n  if (yyparse ()\n      || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)\n    return -1;\n\n  tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear;\n  tm.tm_mon = yyMonth - 1 + yyRelMonth;\n  tm.tm_mday = yyDay + yyRelDay;\n  if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay))\n    {\n      tm.tm_hour = ToHour (yyHour, yyMeridian);\n      if (tm.tm_hour < 0)\n\treturn -1;\n      tm.tm_min = yyMinutes;\n      tm.tm_sec = yySeconds;\n    }\n  else\n    {\n      tm.tm_hour = tm.tm_min = tm.tm_sec = 0;\n    }\n  tm.tm_hour += yyRelHour;\n  tm.tm_min += yyRelMinutes;\n  tm.tm_sec += yyRelSeconds;\n  tm.tm_isdst = -1;\n  tm0 = tm;\n\n  Start = mktime (&tm);\n\n  if (Start == (time_t) -1)\n    {\n\n      /* Guard against falsely reporting errors near the time_t boundaries\n         when parsing times in other time zones.  For example, if the min\n         time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead\n         of UTC, then the min localtime value is 1970-01-01 08:00:00; if\n         we apply mktime to 1970-01-01 00:00:00 we will get an error, so\n         we apply mktime to 1970-01-02 08:00:00 instead and adjust the time\n         zone by 24 hours to compensate.  This algorithm assumes that\n         there is no DST transition within a day of the time_t boundaries.  */\n      if (yyHaveZone)\n\t{\n\t  tm = tm0;\n\t  if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN)\n\t    {\n\t      tm.tm_mday++;\n\t      yyTimezone -= 24 * 60;\n\t    }\n\t  else\n\t    {\n\t      tm.tm_mday--;\n\t      yyTimezone += 24 * 60;\n\t    }\n\t  Start = mktime (&tm);\n\t}\n\n      if (Start == (time_t) -1)\n\treturn Start;\n    }\n\n  if (yyHaveDay && !yyHaveDate)\n    {\n      tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7\n\t\t     + 7 * (yyDayOrdinal - (0 < yyDayOrdinal)));\n      Start = mktime (&tm);\n      if (Start == (time_t) -1)\n\treturn Start;\n    }\n\n  if (yyHaveZone)\n    {\n      long delta = yyTimezone * 60L + difftm (&tm, gmtime (&Start));\n      if ((Start + delta < Start) != (delta < 0))\n\treturn -1;\t\t/* time_t overflow */\n      Start += delta;\n    }\n\n  return Start;\n}\n\n#if\tdefined (TEST)\n\n/* ARGSUSED */\nint main (int ac, char *av[])\n{\n  char buff[MAX_BUFF_LEN + 1];\n  time_t d;\n\n  (void) printf (\"Enter date, or blank line to exit.\\n\\t> \");\n  (void) fflush (stdout);\n\n  buff[MAX_BUFF_LEN] = 0;\n  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])\n    {\n      d = get_date (buff, (time_t *) NULL);\n      if (d == -1)\n\t(void) printf (\"Bad format - couldn't convert.\\n\");\n      else\n\t(void) printf (\"%s\", ctime (&d));\n      (void) printf (\"\\t> \");\n      (void) fflush (stdout);\n    }\n  exit (0);\n  /* NOTREACHED */\n}\n#endif /* defined (TEST) */\n"
  },
  {
    "path": "src/getname.c",
    "content": "#include \"hypermail.h\"\n#include \"getname.h\"\n#include \"setup.h\"\n\nextern char *set_domainaddr;\n\nstatic int blankstring(char *str)\n{\n    register char *cp;\n    for (cp = str; *cp; cp++) {\n        if (*cp != ' ' && *cp != '\\t' && *cp != '\\r' && *cp != '\\n')\n          return (0);\n    }\n    return (1);\n}\n\n/*\n** Grabs the name and email address from a From: header.\n** This could get tricky; I've tried to keep it simple.\n** Should be able to handle all the addresses below:\n**\n**   From: user                   [no @]\n**   From: kent (Kent Landfield)  [no @ - with comment]\n**   From: <user@node.domain>     [no text name, use email as text name]\n**   From: Kent Landfield <kent>  [text name but no @]\n**   From: (kent)                 [comment - no email address]\n**   From: \"\" <kent>              [email address but null comment]\n**   From:                        [blank From: line]\n**   From: uu.net!kent            [uucp addresses - no comment]\n**   From: uu.net!kent (kent)     [uucp addresses - with comment]\n**   From: \"(Joe Bloggs)\" <joe@anorg.com> \n**   From: \"Roy T. Fielding\" <fielding@kiwi.ics.uci.edu>\n**   From: kent@localhost\n**   From: kent@uu.net (Kent Landfield)\n**   From: (George Burgyan) <gburgyan@cybercon.com>\n**   From: <gburgyan@cybercon.com> (George Burgyan) \n**   From:              Kent B. Landfield <kent@landfield.com>\n**   From:      IN%\"fekete+reply@c2.net\" 26-JAN-1997 13:28:55.36\n**   From:      IN%\"vicric@panix.com\"  \"Vicki Richman\" 13-AUG-1996 10:54:33.38\n**   From:      US2RMC::\"lwv26@cas.org\" \"Larry W. Virden, x2487\" 22-OCT-1994 09:44:21.44\n**   From:          Mail Delivery Subsystem <postmaster@igc.apc.org>\n**   From:          Self <ehasbrouck>\n**   From:         adam@eden.apana.org.au (Adam Frey)\n**   From:        faqserv@penguin-lust.mit.edu\n**   From:    nc0548@freebsd.netcom.com (Mark Hittinger)\n**   From: \"- Pam Greene, one of the *.answers moderators\" <pgreene@MIT.EDU>\n**   From: \"Felan shena Thoron'edras\" <felan@netcom.com>\n**   From: David Muir Sharnoff <muir@idiom.com>\n**   From: A.J.Doherty@reading.ac.uk (Andy Doherty)\n**   From: Jordan Hubbard                        <jkh@vector.eikon.e-technik.tu-muenchen.de>\n**   From: ZXPAN%SLACVM.BITNET@MITVMA.MIT.EDU\n**   From: afs!piz!alf@uu5.psi.com (Alf the Poet)\n**   From: answers@cp.tn.tudelft.nl (\"Moderator *.answers\")\n**   From: mdw%merengue@merengue.oit.unc.edu (Matt Welsh)\n**   From: bgoffe@whale.st.usm.edu (William L. Goffe)\n**\n** This is an interesting new one (1998-11-26):\n** From: <name.hidden@era.ericsson.se>Name.Hidden@era.ericsson.se\n*/\n\n/* AUDIT biege: this code is really tricky and may lead to BOFs in email[] and/or name[] */\nvoid getname(char *line, char **namep, char **emailp)\n{\n    int i;\n    int len;\n    char *c;\n    int comment_fnd;\n\n    char email[MAILSTRLEN];\n    char name[NAMESTRLEN];\n\n    len = MAILSTRLEN - 1;\n    comment_fnd = 0;\n\n    /*\n    ** Zero out data storage.\n    */\n    memset(email, 0, MAILSTRLEN);\n    memset(name, 0, NAMESTRLEN);\n\n    *namep = NULL;\n    *emailp = NULL;\n\n    /* EMail Processing First:\n    ** First, is there an '@' sign we can use as an anchor ?\n    */\n    if ((c = hm_strchr(line, '@')) == NULL) {\n        /* \n        ** No '@' sign here so ...\n        */\n        if (strchr(line, '(')) {    /* From: bob (The Big Guy) */\n            c = strchr(line, ':') + 1;\n            while (*c == ' ' || *c == '\\t')\n                c++;\n            for (i = 0; *c && *c != '(' && *c != ' ' && *c != '\\t' && *c != '\\n' && i < len; c++)\n                email[i++] = *c;\n            email[i] = '\\0';\n        }\n        else if ((c = strchr(line, '<'))) {    /* From: <kent> */\n            c++;\n            for (i = 0; *c && *c != '>' && *c != ' ' && *c != '\\t' && *c != '\\n' && i < len; c++)\n                email[i++] = *c;\n            email[i] = '\\0';\n        }\n        else {\n            /* \n            ** - check to see if the From: line is blank, (taken care of)\n            ** - check if From: uu.net!kent formatted line\n            ** - check if \"From: kent\" formatted line\n            */\n            c = strchr(line, ':') + 1;\n            while (*c == ' ' || *c == '\\t')\n                c++;\n\n            for (i = 0; *c && *c != ' ' && *c != '\\t' && *c != '\\n' && *c != ',' && i < len; c++)\n                email[i++] = *c;\n            email[i] = '\\0';\n        }\n\n        if (email[0] == '\\0')    /* Was it a junk From line ? */\n            strcpymax(email, NOEMAIL, MAILSTRLEN);\n\n        else if (use_domainaddr) {\n            /*\n             * check if site domainizes addresses \n             * but don't modify uucp addresses\n             */\n            if ((c = strchr(email, '!')) == NULL) {\n                if (strlen(email) < len) { \n                    strcat(email, \"@\");\n                    strncat(email, set_domainaddr, len-strlen(email));\n                }\n            }\n        }\n    }\n    else {\n        while (*c != ' ' && *c != '\\t' && *c != '<' && *c != '\"' && *c != ':')\n            c--;\n        c++;\n        for (i = 0; *c && *c != '>' && *c != ' ' && *c != '\\t' && *c != '\"' && *c != '\\n' && *c != ']' && *c != ',' && i < len; c++)\n            email[i++] = *c;\n        email[i] = '\\0';\n    }\n\n    /*\n     * NAME Processing - Boy are there a bunch of funky formats here.\n     *                   No promises... I'll do my best. Let me know\n     *                   what I missed...\n     */\n\n    if (strchr(line, '<')) {\n        c = strchr(line, ':') + 1;\n        while (*c == ' ' || *c == '\\t')\n            c++;\n\n        /* if a comment then just look for the end point */\n\n        if (*c == '\\\"') {\n            int rmparen = 0;\n\n            ++c;\n            if (*c == '(') {\n                ++c;\n                rmparen = 1;\n            }\n            for (i = 0, len = NAMESTRLEN - 1; *c && *c != '\\\"' && *c != '\\n' && i < len; c++)\n                name[i++] = *c;\n\n            if (rmparen && name[(i - 1)] == ')')\n                --i;        /* get rid of \"(name-comment)\" parens */\n\n            comment_fnd = 1;\n        }\n        else if (hm_strchr(line, '(')) {\n            c = hm_strchr(line, '(') + 1;\n            if (*c == '\"')    /* is there a comment in the comment ? */\n                c++;\n        }\n        else if (*c == '<') {    /* Comment may be on the end */\n            /* From: <bill@celestial.com> Bill Campbell */\n            char *c2 = strchr(line, '>');\n            if (c2 != NULL) {\n                c = c2 + 1;\n                for (i = 0, len = NAMESTRLEN - 1; *c && *c != '\\n' && i < len; c++) {\n                    name[i++] = *c;\n\t\t}\n                comment_fnd = 1;\n            }\n        }\n    }\n    else if (strchr(line, '(')) {\n        c = strchr(line, '(');\n        c++;\n        if (*c == '\"')        /* is there a comment in the comment ? */\n            c++;\n        while (*c == ' ' || *c == '\\t')\n            c++;\n    }\n    else if (strchr(line, '[')) {\n        c = strchr(line, ':') + 1;\n        while (*c == ' ' || *c == '\\t')\n            c++;\n\n        for (i = 0, len = NAMESTRLEN - 1; *c && *c != '\\\"' && *c != '[' && *c != '\\n' && i < len; c++)\n            name[i++] = *c;\n\n        name[--i] = '\\0';\n        comment_fnd = 1;\n    }\n    else {\n        /*\n         * Is there an email address available \n         * that we can use for the name ?\n         */\n        if (!strcmp(email, NOEMAIL))    /* No */\n            strcpymax(name, NONAME, NAMESTRLEN);\n        else {\n            c = email + strlen(email) - 1;\n            while (isspace(*c))\n                *c-- = '\\0';\n            strcpymax(name, email, NAMESTRLEN);    /* Yes */\n        }\n        *namep = strsav(name);\n        *emailp = strsav(email);\n        return;\n    }\n\n    if (!comment_fnd) {\n        int in_ascii = TRUE, esclen = 0;\n        for (i = 0, len = NAMESTRLEN - 1; *c && *c != '<' && *c != '\\\"' && *c != ')' && *c != '(' && *c != '\\n' && i < len; c++) {\n            if (set_iso2022jp) {\n                iso2022_state(c, &in_ascii, &esclen);\n                if (esclen) {\n                    for (; esclen; esclen--, c++)\n                        name[i++] = *c;\n                    for (; in_ascii == FALSE && i < len; c++, iso2022_state(c, &in_ascii, &esclen)) {\n                        name[i++] = *c;\n                    }\n                    c--;\n                }\n                else {\n                    name[i++] = *c;\n                }\n            }\n            else {\n                name[i++] = *c;\n            }\n        }\n    }\n\n    if (i > 0 && name[i - 1] == ' ' && (*c == '<' || *c == '('))\n        name[--i] = '\\0';\n    else\n        name[i] = '\\0';\n\n    /*\n     * Is the name string blank ? If so then \n     * force it to get filled with something.\n     */\n    if (blankstring(name))\n        name[0] = '\\0';\n\n    /* Bailing and taking the easy way out... */\n\n    if (name[0] == '\\0') {\n        if (email[0] == '\\0')\n            strcpymax(name, NONAME, NAMESTRLEN);\n        else\n            strcpymax(name, email, NAMESTRLEN);\n    }\n\n    /* \n     * need to strip spaces off the end of \n     * the email and name strings \n     */\n\n    c = email + (strlen(email) - 1);\n    while (c > email && isspace(*c))\n        *c-- = '\\0';\n\n    *namep = strsav(name);\n    *emailp = strsav(email);\n}\n"
  },
  {
    "path": "src/getname.h",
    "content": "void getname(char *, char **, char **);\n"
  },
  {
    "path": "src/hypermail.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#define MAIN_FILE 1\n\n#include \"hypermail.h\"\n\n#ifdef __LCC__\n#include \"../lcc/defaults.h\"\n#else\n#include \"defaults.h\"\n#endif\n\n#include \"setup.h\"\n#include \"parse.h\"\n#include \"print.h\"\n#include \"finelink.h\"\n#include \"search.h\"\n#include \"struct.h\"\n\n#ifdef HAVE_LOCALE_H\n#include <locale.h>\n#endif\n\n/* #include <stdlib.h> */\n\nextern int getopt(int, char *const *, const char *);\nextern char *optarg;\nextern int optind;\nextern int opterr;\n\n/*\n** Prints user startup errors stops. \n*/\nvoid cmderr(char *errorstr)\n{\n    fprintf(stderr, \"\\n%s: %s: %s\\n\", lang[MSG_ERROR], PROGNAME, errorstr);\n    usage();\n    unlock_archive();\n    exit(-1);\n}\n\n/*\n** Prints a program error string and stops. \n*/\n\nvoid progerr(char *errorstr)\n{\n    fprintf(stderr, \"%s: %s\\n\", PROGNAME, errorstr);\n    unlock_archive();\n    exit(-1);\n}\n\nstatic char *expand_contents(char *variable)\n{\n    char *return_value = NULL;\n\n    /*\n     * Potentially read the header and footer files. Check to make\n     * sure the value is a valid file or else assure the original\n     * value is there.\n     */\n    if (variable) {\n\t/*\n\t * Check if valid filename. If not then just return the\n\t * variable listed. \n\t * NOTE !! This really should be an error message!\n\t */\n\tif (isfile(variable)) {\n\t    /* \n\t     * Now try to assign the contents of the file to\n\t     * the return value. If it is able to read the file\n\t     * then free the existing storage and return.\n\t     * If not then just return the existing value.\n\t     * NOTE !! This really should be an error message!\n\t     */\n\t    return_value = getfilecontents(variable);\n\t}\n    }\n    return return_value;\n}\n\nchar *setindex(char *dfltindex, char *indextype, char *suffix)\n{\n    char *p, *rp;\n\n    p = (!strcmp(dfltindex, indextype)) ? INDEXNAME : indextype;\n    rp = (char *)emalloc(strlen(p) + strlen(suffix) + 2);\n    sprintf(rp, \"%s.%s\", p, suffix);\n\n    return (rp);\n}\n\n\n/* Print out the version number and die. */\n\nvoid version(void)\n{\n    printf(\"%s: %s: %s %s: %s\\n\", PROGNAME, lang[MSG_VERSION], VERSION, lang[MSG_PATCHLEVEL], PATCHLEVEL);\n    exit(0);\n}\n\n/*\n** Prints the usage.\n*/\n\nvoid usage(void)\n{\n    struct language_entry *lte;\n\n    printf(\"%s: %s [options]\\n\", lang[MSG_USAGE], PROGNAME);\n\n    printf(\"%s:\\n\", lang[MSG_OPTIONS]);\n    printf(\"  -a URL        : %s\\n\", lang[MSG_OPTION_A]);\n    printf(\"  -A            : %s\\n\", lang[MSG_OPTION_ARCHIVE]);\n    printf(\"  -b URL        : %s\\n\", lang[MSG_OPTION_B]);\n    printf(\"  -c file       : %s\\n\", lang[MSG_OPTION_C]);\n    printf(\"  -d dir        : %s\\n\", lang[MSG_OPTION_D]);\n#ifdef GDBM\n    printf(\"  -g            : %s\\n\", lang[MSG_OPTION_G]);\n#else\n    printf(\"  [ -g            : %s ]\\n\", lang[MSG_OPTION_G_NOT_BUILD_IN]);\n#endif\n    printf(\"  -i            : %s\\n\", lang[MSG_OPTION_I]);\n    printf(\"  -l label      : %s\\n\", lang[MSG_OPTION_L]);\n    printf(\"  -m mbox       : %s\\n\", lang[MSG_OPTION_M]);\n    printf(\"  -M            : %s\\n\", \"Use metadata\");\n    printf(\"  -n listaddr   : %s\\n\", lang[MSG_OPTION_N]);\n    printf(\"  -o keyword=val: Set config item\\n\");\n    printf(\"  -p            : %s\\n\", lang[MSG_OPTION_P]);\n    printf(\"  -s htmlsuffix : %s\\n\", \"HTML file suffix (.html, .htm, ..)\");\n    printf(\"  -t            : %s\\n\", \"Use Tables\");\n    printf(\"  -T            : %s\\n\", \"Use index tables\");\n    printf(\"  -u            : %s\\n\", lang[MSG_OPTION_U]);\n    printf(\"  -v            : %s\\n\", lang[MSG_OPTION_VERBOSE]);\n    printf(\"  -V            : %s\\n\", lang[MSG_OPTION_VERSION]);\n    printf(\"  -x            : %s\\n\", lang[MSG_OPTION_X]);\n    printf(\"  -X            : %s\\n\", lang[MSG_OPTION_XML]);\n    printf(\"  -1            : %s\\n\", lang[MSG_OPTION_1]);\n    printf(\"  -L lang       : %s (\", lang[MSG_OPTION_LANG]);\n\n    /* Print out languages supported */\n    lte = &ltable[0];\n    while (lte->langcode != NULL) {\n\tprintf(\"%s \", lte->langcode);\n\tlte++;\n    }\n    printf(\")\\n\");\n    printf(\"%s         : %s\\n\", lang[MSG_VERSION], VERSION);\n    printf(\"%s      : %s\\n\", lang[MSG_PATCHLEVEL], PATCHLEVEL);\n    printf(\"%s            : %s\\n\\n\", lang[MSG_DOCS], HMURL);\n    exit(1);\n}\n\nint main(int argc, char **argv)\n{\n    int i, use_stdin, use_mbox;\n    char *configfile = NULL;\n    char **tlang, *locale_code;\n    int cmd_show_variables;\n    int print_usage;\n\n    int amount_old = 0;\t\t/* number of old mails */\n    int amount_new = 0;\t\t/* number of new mails */\n\n#ifdef HAVE_LOCALE_H\n    setlocale(LC_ALL, \"\");\n#endif\n\n    lockfile[0] = '\\0';\n    use_stdin = 0;\n    print_usage = 0;\n    use_mbox = 0;\n\n    firstdatenum = lastdatenum = 0;\n\n    configfile = strsav(CONFIGFILE);\n\n    cmd_show_variables = 0;\n\n    opterr = 0;\n\n#define GETOPT_OPTSTRING (\"a:Ab:c:d:gil:L:m:n:o:ps:tTuvVxX0:1M?\")\n\n    /* get pre config options here */\n\twhile ((i = getopt(argc, argv, GETOPT_OPTSTRING)) != -1) {\n\t\tswitch ((char)i) {\n\tcase 'c':\n\t    configfile = strreplace(configfile, optarg);\n\t    break;\n\tcase 'v':\n\t    cmd_show_variables = TRUE;\n\t    break;\n\tcase 'V':\n\t    version();\n\t\t /*NOTREACHED*/ case 'a':\n\tcase 'A':\n\tcase 'b':\n\tcase 'd':\n\tcase 'g':\n\tcase 'i':\n\tcase 'l':\n\tcase 'L':\n\tcase 'm':\n\tcase 'n':\n\tcase 'o':\n\tcase 'p':\n\tcase 's':\n\tcase 't':\n\tcase 'T':\n\tcase 'u':\n\tcase 'x':\n\tcase 'X':\n\tcase '0':\n\tcase '1':\n\tcase 'M':\n\t    break;\n\tcase '?':\n\tdefault:\n\t    /* \n\t     * Because we need to setup the language support, \n\t     * printing of the usage message must be deferred \n\t     * until the proper language is determined.\n\t     */\n\t    print_usage = 1;\n\t    break;\n\t}\n    }\n\n    /* \n     * ...then read the configuration file.\n     */\n\n    readconfigs(configfile, cmd_show_variables);\n\n    /* reset the getopt() index variable */\n    optind = 1;\n\n    /* now get the post-config options! */\n\n\twhile ((i = getopt(argc, argv, GETOPT_OPTSTRING)) != -1) {\n\t\tswitch ((char)i) {\n\tcase 'A':\n\t    set_append = 1;\n\t    break;\n\tcase 'a':\n\t    set_archives = strreplace(set_archives, optarg);\n\t    break;\n\tcase 'b':\n\t    set_about = strreplace(set_about, optarg);\n\t    break;\n\tcase 'c':\n\t    /* config file from pre-config options */\n\t    break;\n\tcase 'd':\n\t    set_dir = strreplace(set_dir, optarg);\n\t    break;\n\tcase 'g':\n\t    set_usegdbm = 1;\n\t    break;\n\tcase 'i':\n\t    use_stdin = TRUE;\n\t    break;\n\tcase 'l':\n\t    set_label = strreplace(set_label, optarg);\n\t    break;\n\tcase 'L':\n\t    set_language = strreplace(set_language, optarg);\n\t    break;\n\tcase 'm':\n\t    set_mbox = strreplace(set_mbox, optarg);\n\t    break;\n\tcase 'n':\n\t    set_hmail = strreplace(set_hmail, optarg);\n\t    break;\n\tcase 'o':\n\t    ConfigAddItem(optarg);\n\t    break;\n\tcase 'p':\n\t    set_showprogress = TRUE;\n\t    break;\n\tcase 's':\n\t    set_htmlsuffix = strreplace(set_htmlsuffix, optarg);\n\t    break;\n\tcase 't':\n\t    set_usetable = TRUE;\n\t    break;\n\tcase 'T':\n\t    set_indextable = TRUE;\n\t    break;\n\tcase 'u':\n\t    set_increment = TRUE;\n\t    break;\n\tcase 'v':\n\t    cmd_show_variables = TRUE;\n\t    break;\n\tcase 'x':\n\t    set_overwrite = TRUE;\n\t    break;\n\tcase 'X':\n\t    set_writehaof = TRUE;\n\t    break;\n\tcase '0':\n\t    set_delete_msgnum = add_list(set_delete_msgnum, optarg);\n\t    break;\n\tcase '1':\n\t    set_readone = TRUE;\n\t    break;\n\tcase 'M':\n\t    set_usemeta = TRUE;\n\t    break;\n\tcase 'N':\n \t    set_nonsequential = TRUE;\n\t    break;\n\tcase '?':\n\tdefault:\n\t    break;\n\t}\n    }\n\n#ifdef DEBUG\n    dump_config();\n    exit(0);\n#endif\n\n    /*\n     * Now override the configuration file variables with any explicitly\n     * passed on the command line. This way you need not change the\n     * configuration file settings for a minor change in a single run.\n     */\n\n    /* \n     * Check and make sure that the supplied language is a\n     * valid language. Otherwise strange things happen quickly.\n     */\n\n    if (strlen(set_language) > 2) {\n\tlocale_code = strsav(set_language);\n\tset_language[2] = 0;\t/* shorten to 2-letter code */\n    }\n    else\n\tlocale_code = NULL;\n\n    if ((tlang = valid_language(set_language, &locale_code)) == NULL) {\n\tsnprintf(errmsg, sizeof(errmsg), \"\\\"%s\\\" %s.\", set_language, lang[MSG_LANGUAGE_NOT_SUPPORTED]);\n\tcmderr(errmsg);\n    }\n\n#ifdef HAVE_LOCALE_H\n\tif (!setlocale(LC_ALL, locale_code)) {\n            char *rv;\n            \n            if (!strcmp(locale_code, \"en_US\")) {\n                /* many systems now install by defualt en_US.UTF-8.\n                   Here we assume that the mapping between en_US and en_US.UTF-8\n                   in system messages is identical. \n                   We cannot do the same for other languages, though */\n                rv = setlocale(LC_ALL, \"en_US.UTF-8\");\n            }\n            if (!rv) {\n                snprintf(errmsg, sizeof(errmsg), \"WARNING: locale \\\"%s\\\", not supported.\\n\", locale_code);\n                fprintf(stderr, \"%s\", errmsg);/* AUDIT biege: avoid format-bug warning */\n            }\n    }\n#endif\n\t\n    lang = tlang;\t\t/* A good language, make it so. */\n\n    if (print_usage)\t\t/* Print the usage message and terminate */\n\tusage();\n\n#ifndef GDBM\n    if (set_usegdbm) {\n    fprintf(stderr, \"%s: %s\\n\", PROGNAME, lang[MSG_OPTION_G_NOT_BUILD_IN]);\n    usage();\n    }\n#endif\n\n#ifndef HAVE_LIBFNV\n    if (set_nonsequential)\n      progerr(\"Hypermail isn't built with the libfnv hash library.\\n\"\n\t     \"You cannot use the nonsequential option.\\n\");\n#endif /* HAVE_LIBFNV */\n\n    if (set_mbox && !strcasecmp(set_mbox, \"NONE\")) {\n\tuse_stdin = TRUE;\n    }\n\n    /* the list of headers that we always show and that we want to avoid\n       showing twice when printing the body */\n    set_skip_headers = add_list(set_skip_headers, \"from\");\n    set_skip_headers = add_list(set_skip_headers, \"date\");\n    set_skip_headers = add_list(set_skip_headers, \"subject\");\n\n    /*\n     * Did they decide to use stdin by specifying it on the command line ?\n     * If not then check and see if that is the default they wanted from\n     * the options.h or environment values.\n     */\n    if (!use_stdin) {\n\tif (optind < argc && set_increment == -1 && !set_mbox) {\n\t    set_mbox = strsav(argv[optind]);\n\t}\n\telse if (!set_mbox || !strcasecmp(set_mbox, \"NONE\"))\n\t    use_stdin = TRUE;\n\telse\n\t    use_stdin = FALSE;\n    }\n    else {\n\tif (set_mbox)\n\t    free(set_mbox);\n\tset_mbox = NULL;\n    }\n\n    /*\n    ** Deprecated options \n    */\n    if (set_showhr) {\n      fprintf (stderr, \"The \\\"showhr\\\" option has been deprecated. Ignoring it.\\n\");\n      set_showhr = FALSE;\n    }\n\n    if (set_usetable) {\n      fprintf (stderr, \"The \\\"usetable\\\" option has been deprecated. Ignoring it.\\n\");\n      set_usetable = FALSE;\n    }\n\n    /*\n     * Read the contents of the file into the variables to be used\n     * in printing out the pages.\n     */\n\n    ihtmlheaderfile = expand_contents(set_ihtmlheader);\n    ihtmlfooterfile = expand_contents(set_ihtmlfooter);\n    ihtmlheadfile = expand_contents(set_ihtmlhead);\n    ihtmlhelpupfile = expand_contents(set_ihtmlhelpup);\n    ihtmlhelplowfile = expand_contents(set_ihtmlhelplow);\n    ihtmlnavbar2upfile = expand_contents(set_ihtmlnavbar2up);\n    mhtmlheaderfile = expand_contents(set_mhtmlheader);\n    mhtmlfooterfile = expand_contents(set_mhtmlfooter);\n\n    if (set_dir)\n\tset_dir = strreplace(set_dir, dirpath(set_dir));\n\n    /*\n     * Default names for directories and labels need to be figured out.\n     */\n\n    if (use_stdin && (!set_dir || !strcasecmp(set_dir, \"NONE\")))\n\tset_dir = strreplace(set_dir, DIRNAME);\n\n    if (!set_dir || !strcasecmp(set_dir, \"NONE\"))\n\tset_dir = strreplace(set_dir, (strrchr(set_mbox, '/')) ? strrchr(set_mbox, '/') + 1 : set_mbox);\n\n    if (set_dir[strlen(set_dir) - 1] != PATH_SEPARATOR)\n\ttrio_asprintf(&set_dir, \"%s%c\", set_dir, PATH_SEPARATOR);\n\n    if (!set_label || !strcasecmp(set_label, \"NONE\"))\n\tset_label = set_mbox ? (strreplace(set_label, (strrchr(set_mbox, '/')) ? strrchr(set_mbox, '/') + 1 : set_mbox)) : \"stdin\";\n\n    /*\n     * Which index file will be called \"index.html\"?\n     */\n\n    index_name[1][DATE_INDEX] = setindex(set_defaultindex, \"date\", set_htmlsuffix);\n    index_name[1][THREAD_INDEX] = setindex(set_defaultindex, \"thread\", set_htmlsuffix);\n    index_name[1][SUBJECT_INDEX] = setindex(set_defaultindex, \"subject\", set_htmlsuffix);\n    index_name[1][AUTHOR_INDEX] = setindex(set_defaultindex, \"author\", set_htmlsuffix);\n    if (set_attachmentsindex) {\n\tindex_name[1][ATTACHMENT_INDEX]\n\t    = setindex(set_defaultindex, \"attachment\", set_htmlsuffix);\n    }\n    if (set_folder_by_date || set_msgsperfolder) {\n\tindex_name[0][DATE_INDEX] = setindex(set_default_top_index, \"date\", set_htmlsuffix);\n\tindex_name[0][THREAD_INDEX] = setindex(set_default_top_index, \"thread\", set_htmlsuffix);\n\tindex_name[0][SUBJECT_INDEX] = setindex(set_default_top_index, \"subject\", set_htmlsuffix);\n\tindex_name[0][AUTHOR_INDEX] = setindex(set_default_top_index, \"author\", set_htmlsuffix);\n\tif (set_attachmentsindex) {\n\t    index_name[0][ATTACHMENT_INDEX] = setindex(set_default_top_index, \"attachment\", set_htmlsuffix);\n\t}\n\tindex_name[0][FOLDERS_INDEX] = setindex(set_default_top_index, \"folders\", set_htmlsuffix);\n    }\n    else {\n\tindex_name[0][DATE_INDEX] = index_name[1][DATE_INDEX];\n\tindex_name[0][THREAD_INDEX] = index_name[1][THREAD_INDEX];\n\tindex_name[0][AUTHOR_INDEX] = index_name[1][AUTHOR_INDEX];\n\tindex_name[0][SUBJECT_INDEX] = index_name[1][SUBJECT_INDEX];\n\tindex_name[0][ATTACHMENT_INDEX] = index_name[1][ATTACHMENT_INDEX];\n    }\n\n    init_index_names();\n\n    if (set_msgsperfolder && set_folder_by_date) {\n\tprogerr(\"msgsperfolder and folder_by_date may not be used at the same time!\");\n    }\n\n    /*\n     * General settings for mail command and rewriting.\n     */\n\n    if (!set_domainaddr || !strcasecmp(set_domainaddr, \"NONE\"))\n\tuse_domainaddr = 0;\n    else\n\tuse_domainaddr = 1;\n\n    if (!set_mailto || !strcasecmp(set_mailto, \"NONE\"))\n\tuse_mailto = 0;\n    else\n\tuse_mailto = 1;\n\n    if (!set_mailcommand || !strcasecmp(set_mailcommand, \"NONE\"))\n\tuse_mailcommand = 0;\n    else\n\tuse_mailcommand = 1;\n\n#ifndef HAVE_LIBFNV\n    /* the nonsequential mode won't work unless we compiled the FNV hash library\n       (./configure --enable-libfnv) */\n    if (set_nonsequential)\n\t\tprogerr(\"the nonsequential mode is only available if you enabled the\\n compilation\" \"of the fnv hash library. Try doing a\\n\\t./configure --enable-libfnv\\n\" \"and recompile if you want to use this option.\");\n#endif /* HAVE_LIBFNV */\n\n    /* \n     * A little performance speed up.  The following was being done\n     * over and over in the write functions. This way it is done once.\n     * A bigger win on larger archives.\n     */\n\n    if (set_hmail && !strcasecmp(set_hmail, \"NONE\")) {\n\tfree(set_hmail);\n\tset_hmail = NULL;\n    }\n\n    if (set_archives && !strcasecmp(set_archives, \"NONE\")) {\n\tfree(set_archives);\n\tset_archives = NULL;\n    }\n\n    if (set_custom_archives && !strcasecmp(set_custom_archives, \"NONE\")) {\n\tfree(set_custom_archives);\n\tset_custom_archives = NULL;\n    }\n\n    if (set_about && !strcasecmp(set_about, \"NONE\")) {\n\tfree(set_about);\n\tset_about = NULL;\n    }\n\n    /* Simply show what the values of the variables are and exit */\n\n    if (cmd_show_variables) {\n\tif (!set_mbox)\n\t    set_mbox = \"NONE\";\n\tMakeConfig(TRUE); \n\tfree(configfile);\n\treturn (0);\n    }\n\n    /* Injecting a little sanity... */\n\n    if (use_mbox && use_stdin) {\n\tcmderr(lang[MSG_CANNOT_READ_FROM_BOTH_FILE_AND_STDIN]);\n    }\n    if (set_append && use_mbox) {\n        cmderr(lang[MSG_CANNOT_BOTH_READ_AND_WRITE_TO_MBOX]);\n    }\n\n    gettimezone();\n    getthisyear();\n\n    /*\n     * MIME processing requires the files be created as they\n     * are read in loadheaders() so assure the directories are \n     * there first...\n     */\n\n    checkdir(set_dir);\n\n    /*\n     * Let's do it.\n     */\n\n    if (set_uselock)\n\tlock_archive(set_dir);\n\n    if (set_increment == -1) {\n\tint save_append = set_append;\n\tset_append = 0;\n\tif (set_mbox_shortened)\n\t    progerr(\"can not use increment = -1 option with mbox_shortened option\\n\");\n\tamount_new = parsemail(set_mbox, use_stdin, 1, -1, set_dir, set_inlinehtml, 0);\n\tset_increment = !matches_existing(set_startmsgnum);\n\tif (set_increment && set_folder_by_date && !set_usegdbm)\n\t    progerr(\"folder_by_date with incremental update requires usegdbm option\");\n\treinit_structs();\n\tset_append = save_append;\n    }\n    if (set_increment) {\n\tint num_displayable;\n\tint num_added;\n\tif (set_linkquotes)\n\t    replylist = NULL;\n\t/* we have to start with the msgnum - 1 so that the rest of the\n\t   code works ok when there are no old headers. */\n\tmax_msgnum = set_startmsgnum - 1;\n\tnum_displayable = loadoldheaders(set_dir);\n\tamount_old = max_msgnum + 1; /* counts gaps as messages */\n\n\t/* start numbering at this number */\n\tnum_added = parsemail(set_mbox, use_stdin, set_readone, set_increment, set_dir, set_inlinehtml, amount_old);\n\tif (num_added > 0) {\n\t    amount_new = num_displayable + num_added;\n\t    if (set_linkquotes)\n\t\tanalyze_headers(max_msgnum + 1);\n\n\t    /* write the index of msgno/msgid_hash filenames */\n\t    if (set_nonsequential)\n\t\t    write_messageindex(0, max_msgnum + 1);\n\n\t    writearticles(amount_old, max_msgnum + 1);\n\n\t    /* JK: in function of other hypermail configuration options, \n\t       delete_incremental will continuous escape and add more markup\n\t       to non-deleted messages that are replies to deleted messages.\n\t       Thus, a setup option to disable it */\n\t    if (set_delete_incremental && deletedlist)\n\t\tupdate_deletions(amount_old);\n\n\t    if (set_show_msg_links) {\n\t\tfixnextheader(set_dir, amount_old, -1);\n\t\tfor (i = amount_old; i <= max_msgnum; ++i) {\n\t\t    if (set_showreplies)\n\t\t\tfixreplyheader(set_dir, i, 0, amount_old);\n\t\t    fixthreadheader(set_dir, i, amount_old);\n\t\t}\n\t    }\n\t}\n    }\n    else {\n\tif (set_mbox_shortened) {\n\t    if (!set_usegdbm) progerr(\"mbox_shortened option requires that the usegdbm option be on\");\n\t    max_msgnum = set_startmsgnum - 1;\n\t    loadoldheaders(set_dir);\n\t}\n\tamount_new = parsemail(set_mbox, use_stdin, set_readone, set_increment, set_dir, \n\t\t\t       set_inlinehtml, set_startmsgnum);\t/* number from 0 */\n\tif (!set_mbox_shortened && !matches_existing(0)) {\n\t    progerr(\"First message in mailbox does not \"\n\t\t    \"match first message in archive\\n\"\n\t\t    \"or obsolete gdbm file present.\\n\"\n\t\t    \"Maybe you want to enable the mbox_shortened option?\\n\");\n\t}\n\tif (set_linkquotes)\n\t    analyze_headers(max_msgnum + 1);\n\n\t/* write the index of msgno/msgid_hash filenames */\n\tif (set_nonsequential)\n\t\twrite_messageindex(0, max_msgnum + 1);\n\n\twritearticles(0, max_msgnum + 1);\n    }\n\n    if (amount_new) {\t\t/* Always write the index files */\n\tif (set_linkquotes) {\n\t    threadlist = NULL;\n\t    threadlist_end = NULL;\n\t    printedthreadlist = NULL;\n\t    for (i = 0; i <= max_msgnum; ++i) {\n\t        struct emailinfo *ep;\n\t\tif (hashnumlookup(i, &ep)) {\n\t\t    ep->flags &= ~USED_THREAD;\n#ifdef FASTREPLYCODE\n\t\t    ep->isreply = 0;\n#endif\n\t\t}\n\t\tthreadlist_by_msgnum[i] = NULL;\n\t    } /* redo threading with more complete info than in 1st pass */\n\t    crossindexthread1(datelist);\n\t    for (i = 0; i <= max_msgnum; ++i) {\n\t        struct emailinfo *ep, *etmp;\n\t\thashnumlookup(i, &ep);\n\t\tetmp = nextinthread(i);\n\t\tif (etmp && ep->initial_next_in_thread != etmp->msgnum)\n\t\t    fixthreadheader(set_dir, etmp->msgnum, amount_new);\n\t\t/* if (ep->flags & THREADING_ALTERED) */\n\t    }\n\t}\n\tcount_deleted(max_msgnum + 1);\n\tif (show_index[0][DATE_INDEX])\n\t    writedates(amount_new, NULL);\n\tif (show_index[0][THREAD_INDEX])\n\t    writethreads(amount_new, NULL);\n\tif (show_index[0][SUBJECT_INDEX])\n\t    writesubjects(amount_new, NULL);\n\tif (show_index[0][AUTHOR_INDEX])\n\t    writeauthors(amount_new, NULL);\n\tif (set_attachmentsindex) {\n\t    writeattachments(amount_new, NULL);\n\t}\n\tif (set_writehaof) \n            writehaof(amount_new, NULL);\n\tif (set_folder_by_date || set_msgsperfolder)\n\t    write_toplevel_indices(amount_new);\n\tif (set_monthly_index || set_yearly_index)\n\t    write_summary_indices(amount_new);\n\tif (set_latest_folder)\n\t    symlink_latest();\n    }\n    else {\n\tprintf(\"No mails to output!\\n\");\n    }\n\n    if (set_uselock)\n\tunlock_archive();\n\n    if (configfile)\n\tfree(configfile);\n    if (ihtmlheaderfile)\n\tfree(ihtmlheaderfile);\n    if (ihtmlfooterfile)\n\tfree(ihtmlfooterfile);\n    if (ihtmlheadfile)\n\tfree(ihtmlheadfile);\n    if (ihtmlhelpupfile)\n\tfree(ihtmlhelpupfile);\n    if (ihtmlhelplowfile)\n\tfree(ihtmlhelplowfile);\n    if (ihtmlnavbar2upfile)\n\tfree(ihtmlnavbar2upfile);\n    if (mhtmlheaderfile)\n\tfree(mhtmlheaderfile);\n    if (mhtmlfooterfile)\n\tfree(mhtmlfooterfile);\n\n    return (0);\n}\n"
  },
  {
    "path": "src/hypermail.h",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#ifndef _HYPERMAIL_HYPERMAIL_H\n#define _HYPERMAIL_HYPERMAIL_H\n\n#ifndef MAIN_FILE\n#define VAR extern\n#else\n#define VAR\n#endif\n\n#ifdef __LCC__\n#include \"../lcc/config.h\"\n#else\n#include \"../config.h\"\n#endif\n\n#include \"../patchlevel.h\"\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef HAVE_STDIO_H\n#include <stdio.h>\n#endif\n\n#ifdef HAVE_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n\n#ifdef HAVE_SYS_STAT_H\n#include <sys/stat.h>\n#endif\n\n#ifdef TM_IN_SYS_TIME\n#include <sys/time.h>\n#else\n#include <time.h>\n#endif\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#ifdef HAVE_PWD_H\n#include <pwd.h>\n#endif\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n#ifdef HAVE_CTYPE_H\n#include <ctype.h>\n#endif\n\n#ifdef HAVE_ERRNO_H\n#include <errno.h>\n#endif\n\n#ifdef HAVE_GDBM_H\n#define GDBM 1\n#endif\n\n#ifdef NO_MACRO\n#undef isspace\n#undef isdigit\n#undef isalpha\n#undef isupper\n#undef islower\n#undef isxdigit\n#undef isalnum\n#undef ispunct\n#undef isprint\n#undef isgraph\n#undef iscntrl\n#undef isascii\n#endif\n\n/*\n* this redefines the standard *printf() to use ours \n*/\n#define TRIO_REPLACE_STDIO\n#define HAVE_SSCANF  /* avoid problems in setup.c with trio_sscanf */\n#include <trio.h>\n\n#ifndef NO_FASTREPLYCODE\n#define FASTREPLYCODE\n#endif\n\n#undef FALSE\n#define FALSE 0\n#undef TRUE\n#define TRUE  1\n\n#define PROGNAME    \"hypermail\"\n#define HMURL       \"http://www.hypermail-project.org/\"\n\n#define INDEXNAME   \"index\"\n#define DIRNAME     \"archive\"\n#define NONAME      \"(no name)\"\n#define NODATE      \"(no date)\"\n#define NOEMAIL     \"(no email)\"\n#define NOSUBJECT   \"(no subject)\"\n\n#define GDBM_INDEX_NAME \".hm2index\"\n\n/* Name of the Hypertext Archive Overview File an XML file\n * which contains pointers to the various index files\n * and some header information about each mail\n * to allow further processing\n */\n#define HAOF_NAME \"archive_overview.haof\"\n\n#define NUMSTRLEN    10\n#define MAXLINE\t     1024\n#define MAXFILELEN   256\n#define NAMESTRLEN   320\n#define MAILSTRLEN   80\n#define DATESTRLEN   80\n#define MSGDSTRLEN   256\n#define REPYSTRLEN   256\n#define SUBJSTRLEN   256\n#define URLSTRLEN    256\n#define HOSTSTRLEN   256\n#define TITLESTRLEN  64\n#define HASHSIZE     673\n\n#define SHORTDATELEN   12\n#define TIMEZONELEN    10\n#define YEARLEN        5\n#define BASEYEAR       1970\n#define DAYSPERYEAR    365\n#define SECSPERMIN     60\n#define SECSPERHOUR    3600\n#define SECSPERDAY     86400\n#define IS_LEAP(y) (y > 1752 && (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)))\n\n#define PAGE_TOP     1\n#define PAGE_BOTTOM  2\n\ntypedef enum { DATE_INDEX, THREAD_INDEX, SUBJECT_INDEX, AUTHOR_INDEX,\n    ATTACHMENT_INDEX, FOLDERS_INDEX, NO_INDEX\n} mindex_t;\n\ntypedef enum {\n  FILTERED_DELETE = 1, /*spam */\n  FILTERED_EXPIRE = 2,\n  FILTERED_OUT = 4,\n  FILTERED_REQUIRED = 8,\n  FILTERED_OLD = 16,\n  FILTERED_NEW = 32,\n  FILTERED_DELETE_OTHER = 64\n} filtered_reason_t;\n\ntypedef enum {\n  ANNOTATION_ROBOT_NONE = 0,\n  ANNOTATION_ROBOT_NO_FOLLOW = 1,\n  ANNOTATION_ROBOT_NO_INDEX = 2\n} annotation_robot_t;\n\ntypedef enum {\n  ANNOTATION_CONTENT_NONE = 0,\n  ANNOTATION_CONTENT_EDITED = 1,\n  ANNOTATION_CONTENT_DELETED_OTHER = 2,\n  ANNOTATION_CONTENT_DELETED_SPAM = 4\n} annotation_content_t;\n\ntypedef enum {\n  FORMAT_FIXED = 0,\n  FORMAT_FLOWED = 1\n} textplain_format_t;\n\n/* conversions supported by string.c:parseemail() */\ntypedef enum {\n  MAKEMAILCOMMAND = 1, /* makes links clickable */\n  REPLACE_DOMAIN = 2,  /* replaces domain by antispamdomain */\n} parseemail_conversion_t;\n\n/* \n * Path separator for attachment file path generation\n */\n#define PATH_SEPARATOR '/'\n\n/*\n** Use this struct to build expandable buffers. Quick and easy.\n** Daniel 1998-11-17.\n*/\n\nstruct Push {\n    char *string;\n    size_t len;\n    size_t alloc;\n};\n\n#define INIT_PUSH(x) memset(&(x), 0, sizeof(struct Push))\n#define RETURN_PUSH(x) return (x).string\n\n#define PUSH_STRING(x) (x).string\n#define PUSH_STRLEN(x) (x).len\n\nstruct reply {\n    int frommsgnum;\n    int msgnum;\n    struct emailinfo *data;\n    int maybereply; /* 0 means pretty sure msgnum is reply to frommsgnum; */\n\t\t    /* 1 means there is doubt. */\n    struct reply *next;\n};\n\nstruct body {\n    char *line;\n    char html;\t\t\t/* set to TRUE if already converted to HTML */\n    char header;\t\t/* part of header */\n    char parsedheader;\t\t/* this header line has been parsed once */\n    char attached;\t\t/* part of attachment */\n    char demimed;\t\t/* if this is a header, this is set to TRUE if\n\t\t\t\t   it has passed the decoderfc2047() function */\n    int format_flowed;          /* TRUE if this a text/plain f=f line */\n    int msgnum;\n    struct body *next;\n};\n\nstruct printed {\n    int msgnum;\n    struct printed *next;\n};\n\nstruct hmlist {\n    char *val;\n    struct hmlist *next;\n};\n\nstruct hashemail {\n    struct emailinfo *data;\n    struct hashemail *next;\n};\n\nstruct emailsubdir {\t/* used by set_folder_by_date, set_msgsperfolder */\n    struct emailinfo *first_email;\n    struct emailinfo *last_email;\n    struct emailsubdir *prior_subdir;\n    struct emailsubdir *next_subdir;\n    char *subdir;\n    char *full_path;\n    char *rel_path_to_top;\t/* usually \"../\", sometimes \"../../\" */\n\t\t\t\t/* will be absolute url if set_base_url != 0 */\n    int count;\n    char *description;\t\t/* label to go in folders.html */\n    time_t a_date; /* date of msg which first generated this subdir. not guaranteed to be earliest date in subdir */\n};\n\nstruct emailinfo {\n    int msgnum;\n    char *name;\n    char *emailaddr;\n    char *fromdatestr;\n    time_t fromdate;\n    char *datestr;\n    time_t date;\n    char *msgid;\n    char *subject;\n    char *unre_subject;\n    char *inreplyto;\n    char *charset;\t\t/* added in 2b10 */\n\n    long datenum;\t\t/* moved here from 'struct header' */\n    long flags;\t\t\t/* added 1999-03-19 for the new thread output functions */\n\n#define PRINT_THREAD  1\t\t/* set if already used in the thread output */\n#define USED_THREAD   2\t\t/* set if already stored in threadlist */\n\n    int initial_next_in_thread;\t/* msgnum written as next during normal print*/\n\n    struct body *bodylist;\n#ifdef FASTREPLYCODE\n    struct reply *replylist;    /* list all possible direct replies to this */\n    int isreply;\n#endif\n    struct emailsubdir *subdir;\t/* NULL unless set_msgsperfolder or set_folder_by_date */\n    annotation_robot_t annotation_robot;\t/* special metada for controlling how robots\n\t\t\t\t\t\t   index a message */\n    long exp_time;\n    annotation_content_t annotation_content;\t/* annotations concerning the content of the\n\t\t\t\t\t\t   message (edited, spam, deleted)  */\n    int is_deleted;\t/* 1=deleted (spam), 2=expired, 4=filtered out, */\n\t\t\t/* 8=filtered (required line missing), 16=deleted (other) */\n    int deletion_completed; /* -1 or delete_level that reflects last time */\n                            /* that file was rewritten to reflect is_deleted */\n};\n\nstruct header {\n    struct emailinfo *data;\n    struct header *left;\n    struct header *right;\n};\n\nstruct attach {\n    char *contenttype;\n    char *name;\n    char *id;\n    char *storedas;\t\t/* filename used for storage */\n    char *descr;\t\t/* \"Content-Description\" */\n    struct attach *next;\n};\n\n/* MIME Support */\n\n#define BODY_NONE     0\n#define BODY_CONTINUE (1<<0)\t/* this is a continued line */\n#define BODY_HTMLIZED (1<<1)\t/* this is already htmlified */\n#define BODY_HEADER   (1<<2)\t/* this is a header line */\n#define BODY_ATTACHED (1<<3)\t/* this line was attached */\n#define BODY_FORMAT_FLOWED (1<<4) /* this line is format-flowed */\n#define BODY_DEL_SSQ  (1<<5)    /* remove both space stuffing and\n                                 * quotes where applicable for f=f */\n\n\nstruct boundary {\n    struct boundary *next;\n    struct boundary *prev;\n    char *line;\n};\n\nstruct charset_stack {\n    struct charset_stack *next;\n    struct charset_stack *prev;\n    char *charset;\n    char *charsetsave;\n};\n\nVAR struct header *subjectlist;\nVAR struct header *authorlist;\nVAR struct header *datelist;\nVAR struct hashemail *deletedlist;\nVAR struct reply *replylist;\nVAR struct reply *replylist_end; /* last node in replylist */\nVAR struct reply *threadlist;\nVAR struct reply *threadlist_end; /* last node in threadlist */\nVAR struct reply **threadlist_by_msgnum; /* array of ptrs into threadlist */\nVAR struct printed *printedlist;\nVAR struct printed *printedthreadlist;\nVAR struct hashemail *etable[HASHSIZE];\nVAR struct emailsubdir *folders;\n\nVAR struct hmlist *show_headers;\n\nVAR char timezonestr[TIMEZONELEN];\nVAR char thisyear[YEARLEN];\nVAR char errmsg[MAXLINE];\nVAR char lockfile[MAXFILELEN];\n#if 0     /* replaced by index_name */\nVAR char *authname;\t\t/* By author index file             */\nVAR char *datename;\t\t/* By date index file               */\nVAR char *subjname;\t\t/* By subject index file            */\nVAR char *thrdname;\t\t/* By thread index file             */\nVAR char *attname;\t\t/* By attachment index file         */\nVAR char *top_index[NO_INDEX];\n#endif\n#define MAX_DIRECTORY_LEVELS 2\nVAR char *index_name[MAX_DIRECTORY_LEVELS][NO_INDEX];\nVAR int show_index[MAX_DIRECTORY_LEVELS][NO_INDEX];\n\nVAR char *antispamdomain;\n\nVAR int use_mailcommand;\nVAR int use_mailto;\nVAR int use_domainaddr;\n\nVAR char *ihtmlheaderfile;\nVAR char *ihtmlfooterfile;\nVAR char *ihtmlheadfile;\nVAR char *ihtmlhelpupfile;\nVAR char *ihtmlhelplowfile;\nVAR char *ihtmlnavbar2upfile;\nVAR char *mhtmlheaderfile;\nVAR char *mhtmlfooterfile;\n\nVAR long firstdatenum;\nVAR long lastdatenum;\nVAR int max_msgnum;\n\nVAR char **msgnum_id_table;\n\nVAR const char *latest_folder_path;\n\n#ifdef MAIN_FILE\n/*\n** months[] and days[] should not be converted to native \n** language since these are used in protocol and SMTP date parsing.\n*/\n\nchar *months[] = {\n    \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n    \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n};\n\nchar *days[] = {\n    \"Sun \", \"Mon \", \"Tue \", \"Wed \", \"Thu \", \"Fri \", \"Sat \", NULL\n};\n\n#else\nextern char *months[], *days[];\n#endif\n\n#include \"proto.h\"\n#include \"lang.h\"\n\n#ifdef lint\nextern int strcasecmp(const char *, const char *);\nextern int strncasecmp(const char *, const char *, size_t);\n#endif\n\n#endif\t\t\t\t/* ! _HYPERMAIL_HYPERMAIL_H */\n"
  },
  {
    "path": "src/lang.c",
    "content": "#ifdef LANG_PROG\n#define MAIN_FILE\n#endif\n\n#include <getopt.h>\n\n#include \"hypermail.h\"\n\nchar **valid_language(char *lg, char **locale_code)\n{\n    struct language_entry *lte;\n\n    if (!strcmp(lg, \"se\")) {\n\tprintf(\"Warning: language code 'se' not supported. Using 'sv' (Swedish) instead.\\n\");\n\tlg = \"sv\";\n    }\n    lte = &ltable[0];\n    while (lte->langcode != NULL) {\n\tif (strcmp(lg, lte->langcode) == 0) {\n\t    if (locale_code != NULL && *locale_code == NULL)\n\t\t*locale_code = lte->locale_code;\n\t    return (lte->mtable);\n\t}\n\tlte++;\n    }\n    return (NULL);\n}\n\n#ifdef LANG_PROG\n\nextern char *optarg;\nextern int opterr;\n\nint main(int argc, char **argv)\n{\n    char *progname;\n    char *language = \"en\";\n\n    int c;\n    int verbose = 0;\n    int print_table = 0;\n\n\n    opterr = 0;\n    progname = argv[0];\n\n    if (argc > 1) {\n\twhile ((c = getopt(argc, argv, \"L:tv\")) != EOF) {\n\t    switch (c) {\n\t    case 'v':\n\t\tverbose++;\n\t\tbreak;\n\t    case 'L':\n\t\tlanguage = optarg;\n\t\tbreak;\n\t    case 't':\n\t\tprint_table++;\n\t\tbreak;\n\t    default:\n\t\tfprintf(stderr,\n\t\t\t\"usage: %s [-tv] [-L lang] [msg-num [..]]\\n\",\n\t\t\tprogname);\n\t\treturn (1);\n\t    }\n\t}\n    }\n\n    if ((lang = valid_language(language, NULL)) == NULL) {\n\t(void)fprintf(stderr, \"%s: %s: invalid language specified\\n\",\n\t\t      progname, language);\n\treturn (1);\n    }\n\n    if (print_table || (argc <= optind)) {\n\tint cnt;\n\tfor (cnt = 0; lang[cnt] != NULL; cnt++) {\n\t    printf(\"%02d: %s\\n\", cnt, lang[cnt]);\n\t}\n    }\n\n    else {\n\tfor (; optind < argc; optind++)\t/* process files to print */\n\t    printf(\"%s: \\n\", lang[atoi(argv[optind])]);\n    }\n\n    return (0);\t\t\t/* terminate this process */\n}\n\n#endif\n"
  },
  {
    "path": "src/lang.h",
    "content": "/*\n** WARNING!!! Don't muck with this file unless you know what you are\n**            getting yourself into!!!!!!\n*/\n\n/* \n** Below are the messages used within hypermail that \n** are for user consumption. There are differences\n** between user message strings and strings used in\n** the HTML and SMTP protocols. Beware not to get\n** confused with which is which.\n** \n** What follows are a set of defines that act as indices \n** into the specific language array that is setup for\n** this list archive. They need to point to the right\n** messages in the language arrays or things get interesting.\n**\n** To add a new language, simply copy an existing language\n** array and make the appropriate translations. For example,\n** the Spanish language message array has the English message\n** as the comment on the side of the message. (It is hoped\n** this makes for easier translations... Also make sure and\n** add the language to the supported_languages array.\n**\n** Currently this does not support wide-characters but it is\n** a start in the right direction.  \n*/\n\nstruct language_entry {\n    char     *langcode;\n    char     **mtable;\n    char     *locale_code;\n};\n\n/* print.c */\n#define MSG_NEW_MESSAGE            0\n#define MSG_REPLY                  1\n#define MSG_ABOUT_THIS_LIST        2\n#define MSG_END_OF_MESSAGES        3\n#define MSG_START_OF_MESSAGES      4\n#define MSG_DATE_VIEW              5\n#define MSG_THREAD_VIEW            6\n#define MSG_SUBJECT_VIEW           7\n#define MSG_AUTHOR_VIEW            8\n#define MSG_ATTACHMENT_VIEW        9\n#define MSG_MESSAGES              10\n#define MSG_STARTING              11\n#define MSG_ENDING                12\n#define MSG_ABOUT_THIS_ARCHIVE    13\n#define MSG_SORTED_BY             14\n#define MSG_OTHER_MAIL_ARCHIVES   15\n#define MSG_BY_DATE               16\n#define MSG_MOST_RECENT_MESSAGES  17\n#define MSG_AUTHOR                18\n#define MSG_DATE                  19\n#define MSG_THREAD                20\n#define MSG_SUBJECT               21\n#define MSG_FOR_OPTIONS           22\n#define MSG_WRITING_ARTICLES      23\n#define MSG_WRITING_DATE_INDEX    24\n#define MSG_WRITING_THREAD_INDEX  25\n#define MSG_WRITING_SUBJECT_INDEX 26\n#define MSG_WRITING_AUTHOR_INDEX  27\n#define MSG_LAST_MESSAGE_DATE     28\n#define MSG_ARCHIVED_ON           29\n#define MSG_CANNOT_CHMOD          30\n#define MSG_COULD_NOT_WRITE       31\n#define MSG_NEXT_MESSAGE          32\n#define MSG_PREVIOUS_MESSAGE      33\n#define MSG_MAYBE_IN_REPLY_TO     34\n#define MSG_IN_REPLY_TO           35\n#define MSG_NEXT_IN_THREAD        36\n#define MSG_MAYBE_REPLY           37\n#define MSG_BY_THREAD             38\n#define MSG_BY_SUBJECT            39\n#define MSG_BY_AUTHOR             40\n\n/* file.c */\n#define MSG_CANNOT_CREATE_DIRECTORY   41\n#define MSG_CREATING_DIRECTORY        42\n#define MSG_CONFIGURATION_VALUES      43\n#define MSG_PATH                      44\n\n/* mem.c */\n#define MSG_RAN_OUT_OF_MEMORY         45\n\n/* printfile.c */\n#define MSG_ARCHIVE_GENERATED_BY      46\n\n/* struct.c */\n#define MSG_ELEMENTS                  47\n#define MSG_NO_ELEMENTS               48\n\n/* parse.c */\n#define MSG_CANNOT_OPEN_MAIL_ARCHIVE  49\n#define MSG_READING_NEW_HEADER        50\n#define MSG_LOADING_MAILBOX           51\n#define MSG_ENCODING_IS_NOT_SUPPORTED 52\n#define MSG_ARTICLES                  53\n\n/* hypermail.c */\n#define MSG_VERSION                              54\n#define MSG_PATCHLEVEL                           55\n#define MSG_DOCS                                 56\n#define MSG_COMMAND_AND_CONTROL_VARIABLES        57\n#define MSG_YES                                  58\n#define MSG_NO                                   59\n#define MSG_ABOUT_THE_ARCHIVE_NOT_USED           60\n#define MSG_OTHER_ARCHIVES_NOT_USED              61\n#define MSG_ADDRESS_NOT_USED                     62\n#define MSG_BUILTIN_BODY_STATEMENT_USED          63\n#define MSG_CANNOT_READ_FROM_BOTH_FILE_AND_STDIN 64\n#define MSG_OPTIONS                              65\n#define MSG_OPTION_A                             66\n#define MSG_OPTION_B                             67\n#define MSG_OPTION_C                             68\n#define MSG_OPTION_D                             69\n#define MSG_OPTION_I                             70\n#define MSG_OPTION_L                             71\n#define MSG_OPTION_M                             72\n#define MSG_OPTION_P                             73\n#define MSG_OPTION_VERBOSE                       74\n#define MSG_OPTION_VERSION                       75\n#define MSG_OPTION_U                             76\n#define MSG_OPTION_X                             77\n#define MSG_OPTION_LANG                          78\n#define MSG_USAGE                                79\n#define MSG_LANGUAGE_NOT_SUPPORTED               80\n#define MSG_NOT_SET                              81\n#define MSG_NOT_USED                             82\n#define MSG_CREATED_ATTACHMENT_FILE              83\n#define MSG_ATTACHMENT                           84\n#define MSG_MODE                                 85\n#define MSG_READING_OLD_HEADERS                  86\n#define MSG_OPTIONS_STRING2                      87\n#define MSG_ERROR                                88\n#define MSG_OPTION_N                             89\n#define MSG_OPTION_1                             90\n#define MSG_CAUTHOR                \t\t 91\n#define MSG_CDATE                  \t\t 92\n#define MSG_CSUBJECT               \t\t 93\n\n/* print.c This belong in the first list, but it's quite a lot of work\n   to move all the numbers to add them there :-/ How can we simplify\n   this work? Jose */\n#define MSG_MAIL_ACTIONS                         94\n#define MSG_MA_NEW_MESSAGE                       95\n#define MSG_MA_REPLY                             96\n\n#define MSG_MONTHLY_INDEX                        97\n#define MSG_YEARLY_INDEX                         98\n\n#define MSG_OPTION_G                             99\n#define MSG_OPTION_G_NOT_BUILD_IN                100\n#define MSG_CREATING_GDBM_INDEX                  101\n#define MSG_CANT_CREATE_GDBM_INDEX               102\n#define MSG_OPTION_ARCHIVE                       103\n#define MSG_CANNOT_BOTH_READ_AND_WRITE_TO_MBOX   104\n\n/* XXX Move these up with the others */\n#define MSG_ATTACHMENT_VIEW_OBSOLETED\t\t 105\n#define MSG_BY_ATTACHMENT\t\t\t 106\n#define MSG_WRITING_ATTACHMENT_INDEX  \t\t 107\n#define MSG_BYTES                                108\n\n#define MSG_CANNOT_CREATE_SYMLINK                109\n#define MSG_CANNOT_UNLINK                        110\n#define MSG_PREV_DIRECTORY                       111\n#define MSG_NEXT_DIRECTORY                       112\n#define MSG_FOLDERS_INDEX                        113\n#define MSG_DELETED                              114\n#define MSG_EXPIRED                              115\n#define MSG_DEL_SHORT                            116\n#define MSG_TXT_VERSION                          117\n#define MSG_FILTERED_OUT                         118\n#define MSG_FROM                                 119\n\n#define MSG_OPTION_XML\t\t\t\t 120\n#define MSG_WRITING_HAOF\t\t\t 121\n\n/* JK: new messages added by WAI. When this is ready, it would\n   be good to merge them into the above sections. The current\n   use of localization in hypermail makes this quite complex to do. */\n\n/* print.c */\n\n#define MSG_THIS_MESSAGE                         122\n#define MSG_MSG_BODY                             123\n#define MSG_RESPOND                              124\n#define MSG_MORE_OPTIONS                         125\n#define MSG_RELATED_MESSAGES                     126\n#define MSG_NEXT                                 127\n#define MSG_PREVIOUS                             128\n#define MSG_REPLIES                              129\n#define MSG_CONTEMPORARY_MSGS_SORTED             130\n#define MSG_HELP                                 131\n#define MSG_LTITLE_IN_REPLY_TO                   132\n#define MSG_LTITLE_NEXT_IN_THREAD                133\n#define MSG_LTITLE_REPLIES                       134\n#define MSG_LTITLE_BY_DATE                       135\n#define MSG_LTITLE_BY_THREAD                     136\n#define MSG_LTITLE_BY_SUBJECT                    137\n#define MSG_LTITLE_BY_AUTHOR                     138\n#define MSG_LTITLE_NEXT                          139\n#define MSG_LTITLE_PREVIOUS                      140\n#define MSG_LTITLE_BY_ATTACHMENT                 141\n#define MSG_NAVBAR2UPPERLEVELS                   142\n#define MSG_NAVBAR                               143\n#define MSG_SORT_BY                              144\n#define MSG_OTHER_PERIODS                        145\n#define MSG_NEXTPERIOD                           146\n#define MSG_LTITLE_NEXTPERIOD                    147\n#define MSG_PREVPERIOD                           148\n#define MSG_LTITLE_PREVPERIOD                    149\n#define MSG_LTITLE_FOLDERS_INDEX                 150\n#define MSG_THIS_PERIOD                          151\n#define MSG_RECEIVED_ON                          152\n#define MSG_NEARBY                               153\n#define MSG_RESORTED                             154\n#define MSG_LTITLE_LISTED_BY_DATE                155\n#define MSG_LTITLE_DISCUSSION_THREADS            156\n#define MSG_LTITLE_LISTED_BY_AUTHOR              157\n#define MSG_LTITLE_LISTED_BY_SUBJECT             158\n#define MSG_LTITLE_LISTED_BY_ATTACHMENT          159\n#define MSG_PERIOD                               160\n#define MSG_TO                                   161\n#define MSG_FROM_TITLE                           162\n#define MSG_ON_TITLE                             163\n#define MSG_UNKNOWN_IN_REPLY_TO                  164\n#define MSG_DELETED_OTHER                        165\n#define MSG_EDITED                               166\n#define MSG_SENDER_DELETED                       167\n#define MSG_SUBJECT_DELETED                      168\n#ifdef MAIN_FILE\n\n/*\n** German version of the language table\n** Translation by Martin Schulze <joey@kuolema.Infodrom.North.DE> \n*/\n\nchar *de[] = {       /* German */\n  \"Neue Nachricht\",                       /* New Message        -HTML*/\n  \"Antwort\",                              /* Reply              -HTML*/\n  \"ber diese Liste\",                  /* About this list    -HTML*/\n  \"Ende der Nachricht\",                   /* End of Messages    -HTML*/\n  \"Anfang der Nachricht\",                 /* Start of Messages  -HTML*/\n  \"Datumsansicht\",                         /* Date view          -HTML*/\n  \"Themenansicht\",                         /* Thread view        -HTML*/\n  \"Titelansicht\",                        /* Subject view       -HTML*/\n  \"Autorenansicht\",                         /* Author view        -HTML*/\n  \"Anhnge-bersicht\",                    /* Attachment view       -HTML*/\n  \"Nachrichten\",                          /* Messages           -HTML*/\n  \"Anfang\",                               /* Starting           -HTML*/\n  \"Ende\",                                 /* Ending             -HTML*/\n  \"ber dieses Archiv\",                /* About this archive -HTML*/\n  \"sortiert nach\",            /* sorted by -HTML*/\n  \"Weitere Mail-Archive\",                 /* Other mail archives -HTML*/\n  \"Nach Datum\",                                /* By Date             -HTML*/\n  \"Neueste Nachrichten\",                  /* Most recent messages-HTML*/\n  \"Autor\",                                /* author              -HTML*/\n  \"Datum\",                                /* date                -HTML*/\n  \"Themenstrang\",                               /* thread              -HTML*/\n  \"Titel\",                              /* subject             -HTML*/\n  \"fr Optionen\",                      /* for options       -STDOUT*/\n  \"Schreibe Nachrichten in\",              /* Writing messages to-STDOUT*/\n  \"Schreibe Datums-Index in\",             /* Writing date index to-STDOUT*/\n  \"Schreibe Themenstrang-Index in\",       /* Writing thread index to -STDOUT*/\n  \"Schreibe Titel-Index in\",            /* Writing subject index to-STDOUT*/\n  \"Schreibe Autoren-Index in\",            /* Writing author index to-STDOUT*/\n  \"Letztes Datum\",                        /* Last message date   -HTML*/\n  \"Archiviert am\",                       /* Archived on         -HTML*/\n  \"Kann Dateimodus nicht ndern\",      /* Can not chmod     -STDERR*/\n  \"Kann nicht schreiben\",                 /* Could not write   -STDERR*/\n  \"Nchste Nachricht\",                 /* Next message        -HTML*/\n  \"Vorherige Nachricht\",                  /* Previous message    -HTML*/\n  \"Vielleicht als Antwort auf\",           /* Maybe in reply to   -HTML*/\n  \"Als Antwort auf\",                      /* In reply to         -HTML*/\n  \"Nchste zum Thema\",           \t  /* Next in thread      -HTML*/\n  \"Eventuelle Antwort\",                   /* Maybe reply         -HTML*/\n  \"Nach Strang\",                          /* By Thread           -HTML*/\n  \"Nach Titel\",                         /* By Subject          -HTML*/\n  \"Nach Autor\",                           /* By Author           -HTML*/\n  \"Kann das Verzeichnis nicht erstellen\", /* Can not create directory -STDERR*/\n  \"Erstelle Verzeichnis\",                 /* Creating directory -STDOUT*/\n  \"Konfiguration\",                        /* Configuration Values -STDOUT*/\n  \"Pfad\",                                 /* path              -STDOUT*/\n  \"Kein Speicher mehr!\",                  /* Ran out of memory!-STDERR*/\n  \"Dieses Archiv wurde generiert von\",    /* This archive was generated by-HTML*/\n  \"Elemente\",                             /* Elements          -STDOUT*/\n  \"Keine Elemente\",                       /* No Elements       -STDOUT*/\n  \"Kann E-Mail-Archiv nicht ffnen\",     /* Cannot open mail archive */\n  \"Lese neue Kopfzeilen...\",                  /* Reading new header...-STDOUT*/\n  \"Lade Mailbox\",                         /* Loading mailbox      -STDOUT*/\n  \"Kodierung wird nicht untersttzt, speichere so\", \n                        /* encoding is not supported, stored as-is -HTML*/\n  \"Nachrichten\",                          /* messages             -HTML*/\n  \"Version\",                              /* Version            -STDOUT*/\n  \"Patchlevel\",                           /* Patchlevel         -STDOUT*/\n  \"Dokus\",                                /* Docs               -STDOUT*/\n  \"Befehls- und Kontrollvariablen\",       /* Command and Control Variables-STDOUT*/\n  \"Ja\",                                   /* Yes                -STDOUT*/\n  \"Nein\",                                 /* No                 -STDOUT*/\n  \"ber das Archiv: nicht benutzt\",    /* About the archive: not used-STDOUT */\n  \"Andere Archive: nicht benutzt\",        /* Other archives: not used-STDOUT*/\n  \"Adresse nicht benutzt\",                /* address not used        -STDOUT*/\n  \"Eingebautes <BODY> benutzt\",           /* Builtin <BODY> statement used-STDOUT*/\n  \"Kann nicht gleichzeitig von Datei und Standardeingabe lesen.\", \n  \t\t\t   /* Cannot read from both file and stdin. -STDERR*/\n  \"Optionen\",                             /* Options                -STDOUT*/\n  \"URL fr weitere Archive\",              /* URL to other archives  -STDOUT*/\n  \"URL fr Informationen ber Archiv\",  \n                                      /* URL to archive information -STDOUT*/\n  \"Konfigurationsdatei zum Einlesen\", \n                                    /* Configuration file to read in -STDOUT*/\n  \"Das Verzeichnis, um die HTML-Dateien zu speichern\", \n                              /* The directory to save HTML files in -STDOUT*/\n  \"Lese Nachrichten von der Standardeingabe\",\n                                /* Read messages from standard input -STDOUT*/\n  \"Wie soll das Archiv genannt werden\",   \n                                  /* What to name the output archive -STDOUT*/\n  \"Mail-Archive zum Einlesen\",            /* Mail archive to read in -STDOUT*/\n  \"Zeige Zwischenbericht\",                /* Show progress           -STDOUT*/\n  \"Zeigt nur die Konfigurationsvariablen\", /* Show configuration variables only -STDOUT*/\n  \"Zeigt Version und beende\",             /* Show version information and exit -STDOUT*/\n  \"Jeweils einen Artikel hinzufgen\",  /* Update archive by one article -STDOUT*/\n  \"Vorherige Nachrichten berschreiben\", /* Overwrite previous messages -STDOUT*/\n  \"Sprache angeben\",                      /* Specify language to use -STDOUT*/\n  \"Anleitung\",                                /* Usage -STDOUT*/\n  \"Die Sprache wird nicht untersttzt\",/* Language not supported  -STDERR*/\n  \"Nicht gesetzt\",                        /* Not set               -STDOUT*/\n  \"Nicht benutzt\",                        /* Not used              -STDOUT*/\n  \"Anhang in Datei gespeichert\",           /* Created attachment file -STDOUT*/\n  \"Anhang\",                          /* attachment           -HTML*/\n  \"Modus\",                                 /* mode                 -STDOUT*/\n  \"Lese alte Kopfzeilen\",                     /* Reading old headers  -STDOUT*/\n  \"\",       /* for alignment only -STDOUT*/\n  \"FEHLER\",                       /* ERROR                       -STDERR*/\n  \"Einsendeadresse fr die Liste\", \n                           /* The submission address of the list-STDERR*/\n  \"Lese nur eine E-Mail aus der Eingabe\",\n  \"Autor\",                                /* author              -HTML*/\n  \"Datum\",                                /* date                -HTML*/\n  \"Titel\",                                /* subject             -HTML*/\n  \"Aktionsmglichkeiten\",                 /* Mail actions (MA) header -HTML*/\n  \"Sende E-Mail mit neuen Titel\",         /* MA New Message      -HTML*/\n  \"Antworte auf die E-Mail\",              /* MA Reply            -HTML*/\n  \"Zusammenfassung der monatlichen Index-Dateien\", \n  \t\t\t\t\t  /* monthly             -HTML*/\n  \"Zusammenfassung der jhrlichen Index-Dateien\",        \n  \t\t\t\t\t  /* yearly              -HTML*/\n  \"Lege GDBM-Zwischenspeicher fr Kopfzeilen an\", \n  \t\t\t\t/* Build a GDBM header cache   -STDOUT*/\n  \"GDBM-Zwischenspeicher-Option nicht eingebaut\",  \n  \t\t     /* GDBM header cache option not build in  -STDERR*/\n  \"Erstelle Gdbm Index... \",    /* Creating gdbm index         -STDOUT*/\n  \"Kann Gdbm Datei nicht erstellen... \",  \n  \t\t\t\t/* Can't create gdbm index     -STDOUT*/\n  \"Pflege ein zustzliches mbox-Archiv\", /* Maintain an mbox archive -STDOUT*/\n  \"Kann nicht gleichzeitig von mbox lesen und schreiben.\", \n  \t       /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Anhnge-bersicht\",                      /* Attachment view       -HTML*/\n  \"Nach Nachrichten mit Anhang\",/* By messages with attachments -HTML*/\n  \"Schreibe Anhang-Index in\",\t/* Writing attachment index to -STDOUT*/\n  \"Bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Kann symbolischen Verweis nicht erstellen.\", \n  \t\t\t     /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Kann Datei nicht entfernen\", /* MSG_CANNOT_UNLINK          -STDOUT */\n  \"Vorheriges Verzeichnis\",              /* MSG_PREV_DIRECTORY  -HTML */\n  \"Nchstes Verzeichnis\",                 /* MSG_NEXT_DIRECTORY  -HTML */\n  \"Verzeichnisliste\",  /* MSG_FOLDERS_INDEX                     -HTML */\n  \"Diese Nachricht wurde aus dem Archiv entfernt\",/* MSG_DELETED -HTML */\n  \"Diese Nachricht ist abgelaufen\",              /* MSG_EXPIRED -HTML */\n  \"(gelschte Nachricht)\",          /* MSG_DEL_SHORT            -HTML */\n  \"Ursprnglicher Text dieser Nachricht\", /* MSG_TXT_VERSION    -HTML */\n  \"Diese Nachricht wurde herausgefiltert\",  /* MSG_FILTERED_OUT -HTML */\n  \"Autor\",                              /* MSG_FROM              -HTML*/\n  \"Erstelle haof XML Dateien\",  /* Write hoaf XML files       -STDOUT */\n  \"Schreibe Hoaf in\",           /* Writing haof to               -HTML*/\n  \"Diese Nachricht\",                 /* This message -HTML */\n  \"Inhalt\",                 /* Message body -HTML */\n  \"Antworten\",                      /* Respond -HTML */\n  \"Weitere Mglichkeiten\",                 /* More options -HTML */\n  \"Zugehrige Nachrichten\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Antworten\",                      /* Replies -HTML */\n  \"Nachrichten aus dem gleichen Zeitraum, sortiert\", /* Contemporary messages sorted -HTML */\n  \"Hilfe\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Nachrichten im gleichen Zeitraum, nach Datum\", /* Contemporary messages by date */\n  \"Themenstrnge im gleichen Zeitraum\", /* Contemporary messages by threads -  HTML */\n  \"Nachrichten im gleichen Zeitraum, nach Betreff\", /* Contemporary messages by subject - HTML */\n  \"Nachrichten im gleichen Zeitraum, nach Autor\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sortieren nach\", /* Sort by - HTML*/\n  \"Weitere Zeitrume\", /* Other periods - HTML */\n  \"Spter\", /* Next folder - HTML */\n  \"Im nchsten Zeitraum gespeicherte Nachrichten, sortiert nach Datum\", /* Next folder, by date - HTML link */\n  \"Frher\", /* Previous folder - HTML */\n  \"Im vorigen Zeitraum gespeicherte Nachrichten, sortiert nach Datum\", /* Previous folder, by date - HTML Link */\n  \"Liste aller Zeitrume\", /* List of all periods - HTML*/\n  \"Dieser Zeitraum\", /* This period - HTML*/\n  \"Empfangen am\", /* Received on - HTML */\n  \"Dazu\", /* Nearby - HTML */\n  \"sortiert\", /* Resorted - HTML */\n  \"in zeitlicher Reihenfolge\", /* listed by date - HTML */\n  \"nach Themenstrang\" , /* discussion threads - HTML */\n  \"nach Autor geordnet\", /* listed by author - HTML */\n  \"nach Titel\", /* listed by subject - HTML */\n  \"nach Anhngen\", /* by attachment - HTML */\n  \"Zeitraum\", /* period - HTML */\n  \" bis \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Diese Nachricht wurde aus dem Archiv entfernt\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                              /* End Of Message Table - NOWHERE*/\n};\n\n/*\n** Polish version of the language table (Polska wersja tabeli jzykowej)\n** Translation by Adam T. Tkocz <adam@storm.pl>\n*/\n\nchar *pl[] = {                      /* English */\n  \"Nowa wiadomo\",                 /* New Message        -HTML*/\n  \"Odpowiedz\",                      /* Reply              -HTML*/\n  \"O tej licie\",                   /* About this list    -HTML*/\n  \"D strony\",                     /* End of Messages    -HTML*/\n  \"Gra strony\",                    /* Start of Messages  -HTML*/\n  \"Wg daty\",                        /* Date view          -HTML*/\n  \"Wg wtkw\",                      /* Thread view        -HTML*/\n  \"Wg tematw\",                     /* Subject view       -HTML*/\n  \"Wg autorw\",                     /* Author view        -HTML*/\n  \"Wg zacznikw\",                 /* Attachment view    -HTML*/\n  \"Wiadomoci\",                     /* Messages           -HTML*/\n  \"Pocztek\",                       /* Starting           -HTML*/\n  \"Koniec\",                         /* Ending             -HTML*/\n  \"O tym archiwum\",                 /* About this archive -HTML*/\n  \"sortowane wg\",                   /* Messages sorted by -HTML*/\n  \"Inne archiwa maili\",             /* Other mail archives -HTML*/\n  \"Wg daty\",                        /* By Date             -HTML*/\n  \"Najwiesze wiadomoci\",         /* Most recent messages-HTML*/\n  \"autora\",                         /* author              -HTML*/\n  \"datay\",                          /* date                -HTML*/\n  \"wtku\",                          /* thread              -HTML*/\n  \"tematu\",                         /* subject             -HTML*/\n  \"Dla opcji\",                      /* for options       -STDOUT*/\n  \"Zapisywanie wiadomoci do\",      /* Writing messages to-STDOUT*/\n  \"Zapisywanie indeksu dat do\",     /* Writing date index to-STDOUT*/\n  \"Zapisywanie indeksu wtkw do\",  /* Writing thread index to -STDOUT*/\n  \"Zapisywanie indeksu tematw do\", /* Writing subject index to-STDOUT*/\n  \"Zapisywanie indeksu autorw do\", /* Writing author index to-STDOUT*/\n  \"Data ostatniej wiadomoci\",      /* Last message date   -HTML*/\n  \"Zarchiwizowane w\",               /* Archived on         -HTML*/\n  \"Niedozwolone chmod\",             /* Can not chmod     -STDERR*/\n  \"Nie mona zapisa\",              /* Could not write   -STDERR*/\n  \"Nastpna wiadomo\",             /* Next message        -HTML*/\n  \"Poprzednia wiadomo\",           /* Previous message    -HTML*/\n  \"Przypuszczalnie w odpowiedzi na\",/* Maybe in reply to   -HTML*/\n  \"W odpowiedzi na\",                /* In reply to         -HTML*/\n  \"Nastpna w wtku\",               /* Next in thread      -HTML*/\n  \"Prawdopodobna odpowied\",        /* Maybe reply         -HTML*/\n  \"Wg wtku\",                       /* By Thread           -HTML*/\n  \"Wg tematu\",                      /* By Subject          -HTML*/\n  \"Wg autora\",                      /* By Author           -HTML*/\n  \"Nie mona stworzy katalogu\",    /* Can not create directory -STDERR*/\n  \"Tworzenie katalogu\",             /* Creating directory -STDOUT*/\n  \"Parametry konfiguracji\",         /* Configuration Values -STDOUT*/\n  \"cieka\",                        /* path              -STDOUT*/\n  \"Przekroczona pami!\",           /* Ran out of memory!-STDERR*/\n  \"To archiwum zostao wygenerowane przez\",  /* This archive was generated by -HTML*/\n  \"Elementy\",                       /* Elements          -STDOUT*/\n  \"adnych elementw\",              /* No Elements       -STDOUT*/\n  \"Nie mona otworzy archiwum\",    /* Cannot open mail archive */\n  \"Czytanie nowego nagwka\",       /* Reading new header... -STDOUT   */\n  \"adowanie mailboxa\",             /* Loading mailbox      -STDOUT  */\n  \"kodowanie nie jest obsugiwane\", /* encoding is not supported, stored as-is -HTML*/\n  \"wiadomoci\",                     /* messages             -HTML*/\n  \"Wersja\",                         /* Version            -STDOUT*/\n  \"Wersja aty\",                    /* Patchlevel         -STDOUT*/\n  \"Dokumentacja\",                   /* Docs               -STDOUT*/\n  \"Polecenia i zmienne\",            /* Command and Control Variables-STDOUT*/\n  \"Tak\",                            /* Yes                -STDOUT*/\n  \"Nie\",                            /* No                 -STDOUT*/\n  \"O tym archiwum: nie uywane\",    /* About the archive: not used-STDOUT */\n  \"Inne archiwa: nie uywane\",      /* Other archives: not used-STDOUT*/\n  \"adres nie zosta uyty\",         /* address not used -STDOUT*/\n  \"Wbudowane <BODY> zostao uyte\", /* Builtin <BODY> statement used-STDOUT*/\n  \"Nie mona odczyta pliku ani stdin.\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Opcje\",                          /* Options                -STDOUT*/\n  \"URL do innych arciww\",          /* URL to other archives  -STDOUT*/\n  \"URL do informacji o archiwum\",   /* URL to archive information -STDOUT*/\n  \"Plik konfiguracyjny do wczytania\", /* Configuration file to read in -STDOUT*/\n  \"Katalog do zapisu plikw HTML\",  /* The directory to save HTML files in -STDOUT*/\n  \"Czytaj wiadomoci z stdin\",      /* Read messages from standard input -STDOUT*/\n  \"Podaj nazw archiwum\",           /* What to name the output archive -STDOUT*/\n  \"Archiwum do wczytania\",          /* Mail archive to read in -STDOUT*/\n  \"Poka postpy\",                  /* Show progress           -STDOUT*/\n  \"Poka tylko zmienne konfiguracyjne\", /* Show configuration variables only -STDOUT*/\n  \"Poka wersj i wyjd\",           /* Show version information and exit -STDOUT*/\n  \"Uzupelnij archiwum o jedn wiadomo\", /* Update archive by one article -STDOUT*/\n  \"Zastp poprzednia wiadomo\",    /* Overwrite previous messages -STDOUT*/\n  \"Wybierz uywany jzyk\",          /* Specify language to use     -STDOUT*/\n  \"Uycie\",                         /* Usage                       -STDOUT*/\n  \"Jzyk nie jest wspierany\",       /* Language not supported  -STDERR*/\n  \"Nie ustawione\",                  /* Not set     -STDOUT*/\n  \"Nie uywane\",                    /* Not used  -STDOUT*/\n  \"Stworzono zacznik\",            /* Created attachment file     -STDOUT*/\n  \"zacznik\",                      /* attachment                    -HTML*/\n  \"tryb\",                           /* mode                        -STDOUT*/\n  \"Czytanie starych nagwkw\",     /* Reading old headers      -STDOUT*/\n  \"\",                               /* tylko do wyrwnania       -STDOUT*/\n  \"BD\",                           /* ERROR                       -STDERR*/\n  \"Adres wypisujcy z listy\",       /* The submission address of the list-STDERR*/\n  \"Czytaj tylko jedn wiadomo\",\n  \"Autor\",                          /* author              -HTML*/\n  \"Data\",                           /* date                -HTML*/\n  \"Temat\",                          /* subject             -HTML*/\n  \"Wybierz\",                        /* Mail actions (MA) header -HTML*/\n  \"wylij nowy temat\",              /* MA New Message      -HTML*/\n  \"odpowiedz na t wiadomo\",      /* MA Reply            -HTML*/\n  \"Zestawienie miesicy\",           /* monthly             -HTML*/\n  \"Zestawienie lat\",                /* yearly              -HTML*/\n  \"Utwrz cache nagowkw GDBM\",    /* Build a GDBM header cache -STDOUT*/\n  \"GDBM header cache option not build in\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Tworzenie indeksu GDBM... \",     /* Creating gdbm index -STDOUT*/\n  \"Nie mona utworzy pliku GDBM... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Zachowaj archiwum mbox\",         /* Maintain an mbox archive    -STDOUT*/\n  \"Nie mona odczyta ani zapisa mailboxa.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Wg zacznikw\",                  /* Attachment view -HTML*/\n  \"Wg wiadomoci z zacznikami\",    /* By messages with attachments -HTML*/\n  \"Zapisywanie indeksu zacznikw\", /* Writing attachment index to -STDOUT*/\n  \"bajtw\",                          /* file size, so far only for attachments  -HTML */\n  \"Nie mona stworzy aliasa\",       /* MSG_CANNOT_CREATE_SYMLINK -STDOUT */\n  \"Nie mona usun pliku\",          /* MSG_CANNOT_UNLINK      -STDOUT */\n  \"Poprzedni katalog\",               /* MSG_PREV_DIRECTORY  -HTML */\n  \"Nastpny katalog\",                /* MSG_NEXT_DIRECTORY    -HTML */\n  \"Lista Katalogw\",                 /* MSG_FOLDERS_INDEX   -HTML */\n  \"Ta wiadomo zostaa usunita z archiwum\", /* MSG_DELETED  -HTML */\n  \"Ta wiadomo jest przedawniona\",  /*MSG_EXPIRED -HTML */\n  \"(usunita wiadomo)\",            /* MSG_DEL_SHORT     -HTML */\n  \"Tekst tej zawartoci\",            /* MSG_TXT_VERSION     -HTML */\n  \"Ta wiadomo zostaa odfiltrowana\",        /* MSG_FILTERED_OUT -HTML */\n  \"Autor\",                          /* MSG_FROM              -HTML*/\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Ta wiadomo zostaa usunita z archiwum\", /* MSG_DELETED_OTHER  -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                              /* End Of Message Table      - NOWHERE*/\n};\n\n\n/*\n** English version of the language table\n*/\n\nchar *en[] = {       /* English */\n  \"New Message\",                 /* New Message        -HTML*/\n  \"Reply\",                       /* Reply              -HTML*/\n  \"About this list\",             /* About this list    -HTML*/\n  \"End of Messages\",             /* End of Messages    -HTML*/\n  \"Start of Messages\",           /* Start of Messages  -HTML*/\n  \"Date view\",                   /* Date view          -HTML*/\n  \"Thread view\",                 /* Thread view        -HTML*/\n  \"Subject view\",                /* Subject view       -HTML*/\n  \"Author view\",                 /* Author view        -HTML*/\n  \"Attachment view\",             /* Attachment view    -HTML*/\n  \"Messages\",                    /* Messages           -HTML*/\n  \"Starting\",                    /* Starting           -HTML*/\n  \"Ending\",                      /* Ending             -HTML*/\n  \"About this archive\",          /* About this archive -HTML*/\n  \"sorted by\",                   /* Messages sorted by -HTML*/\n  \"Other mail archives\",         /* Other mail archives -HTML*/\n  \"by date\",                     /* By Date             -HTML*/\n  \"Most recent messages\",        /* Most recent messages-HTML*/\n  \"author\",                      /* author              -HTML*/\n  \"date\",                        /* date                -HTML*/\n  \"thread\",                      /* thread              -HTML*/\n  \"subject\",                     /* subject             -HTML*/\n  \"for options\",                 /* for options       -STDOUT*/\n  \"Writing messages to\",         /* Writing messages to-STDOUT*/\n  \"Writing date index to\",       /* Writing date index to-STDOUT*/\n  \"Writing thread index to\",     /* Writing thread index to -STDOUT*/\n  \"Writing subject index to\",    /* Writing subject index to-STDOUT*/\n  \"Writing author index to\",     /* Writing author index to-STDOUT*/\n  \"Last message date\",           /* Last message date   -HTML*/\n  \"Archived on\",                 /* Archived on         -HTML*/\n  \"Can not chmod\",               /* Can not chmod     -STDERR*/\n  \"Could not write\",             /* Could not write   -STDERR*/\n  \"Next message\",                /* Next message        -HTML*/\n  \"Previous message\",            /* Previous message    -HTML*/\n  \"Maybe in reply to\",           /* Maybe in reply to   -HTML*/\n  \"In reply to\",                 /* In reply to         -HTML*/\n  \"Next in thread\",              /* Next in thread      -HTML*/\n  \"Maybe reply\",                 /* Maybe reply         -HTML*/\n  \"by thread\",                   /* By Thread           -HTML*/\n  \"by subject\",                  /* By Subject          -HTML*/\n  \"by author\",                   /* By Author           -HTML*/\n  \"Can not create directory\",    /* Can not create directory -STDERR*/\n  \"Creating directory\",          /* Creating directory -STDOUT*/\n  \"Configuration Values\",        /* Configuration Values -STDOUT*/\n  \"path\",                        /* path              -STDOUT*/\n  \"Ran out of memory!\",          /* Ran out of memory!-STDERR*/\n  \"This archive was generated by\",  /* This archive was generated by-HTML*/\n  \"Elements\",                    /* Elements          -STDOUT*/\n  \"No Elements\",                 /* No Elements       -STDOUT*/\n  \"Cannot open mail archive\",    /* Cannot open mail archive */\n  \"Reading new header...\",       /* Reading new header...-STDOUT   */\n  \"Loading mailbox\",             /* Loading mailbox      -STDOUT   */\n  \"encoding is not supported, stored as-is\", /* encoding is not supported, stored as-is -HTML*/\n  \"messages\",                    /* messages             -HTML*/\n  \"Version\",                     /* Version            -STDOUT*/\n  \"Patchlevel\",                  /* Patchlevel         -STDOUT*/\n  \"Docs\",                        /* Docs               -STDOUT*/\n  \"Command and Control Variables\",       /* Command and Control Variables-STDOUT*/\n  \"Yes\",                         /* Yes                -STDOUT*/\n  \"No\",                          /* No                 -STDOUT*/\n  \"About the archive: not used\", /* About the archive: not used-STDOUT */\n  \"Other archives: not used\",    /* Other archives: not used-STDOUT*/\n  \"address not used\",            /* address not used        -STDOUT*/\n  \"Builtin <BODY> statement used\", /* Builtin <BODY> statement used-STDOUT*/\n  \"Cannot read from both file and stdin.\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Options\",                     /* Options                -STDOUT*/\n  \"URL to other archives\",       /* URL to other archives  -STDOUT*/\n  \"URL to archive information\",  /* URL to archive information -STDOUT*/\n  \"Configuration file to read in\", /* Configuration file to read in -STDOUT*/\n  \"The directory to save HTML files in\", /* The directory to save HTML files in -STDOUT*/\n  \"Read messages from standard input\",/* Read messages from standard input -STDOUT*/\n  \"What to name the output archive\", /* What to name the output archive -STDOUT*/\n  \"Mail archive to read in\",     /* Mail archive to read in -STDOUT*/\n  \"Show progress\",               /* Show progress           -STDOUT*/\n  \"Show configuration variables only\", /* Show configuration variables only -STDOUT*/\n  \"Show version information and exit\", /* Show version information and exit -STDOUT*/\n  \"Update archive by one article\", /* Update archive by one article -STDOUT*/\n  \"Overwrite previous messages\", /* Overwrite previous messages -STDOUT*/\n  \"Specify language to use\",     /* Specify language to use     -STDOUT*/\n  \"Usage\",                       /* Usage                       -STDOUT*/\n  \"Language not supported\",      /* Language not supported      -STDERR*/\n  \"Not set\",                     /* Not set                     -STDOUT*/\n  \"Not used\",                    /* Not used                    -STDOUT*/\n  \"Created attachment file\",     /* Created attachment file     -STDOUT*/\n  \"attachment\",                  /* attachment                    -HTML*/\n  \"mode\",                        /* mode                        -STDOUT*/\n  \"Reading old headers\",         /* Reading old headers         -STDOUT*/\n  \"\", /* for alignment only       -STDOUT*/\n  \"ERROR\",                       /* ERROR                       -STDERR*/\n  \"The submission address of the list\", \n                           /* The submission address of the list-STDERR*/\n  \"Read only one mail from input\",\n  \"Author\",                      /* author              -HTML*/\n  \"Date\",                        /* date                -HTML*/\n  \"Subject\",                     /* subject             -HTML*/\n  \"Mail actions\",                /* Mail actions (MA) header -HTML*/\n  \"mail a new topic\",            /* MA New Message      -HTML*/\n  \"respond to this message\",     /* MA Reply            -HTML*/\n  \"Summary of Monthly Index Files\",       /* monthly             -HTML*/\n  \"Summary of Yearly Index Files\",        /* yearly              -HTML*/\n  \"Build a GDBM header cache\",   /* Build a GDBM header cache   -STDOUT*/\n  \"GDBM header cache option not build in\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Creating gdbm index... \",     /* Creating gdbm index         -STDOUT*/\n  \"Can't create gdbm file... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Maintain an mbox archive\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Can't both read from and write to an mbox.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Attachment view\",\t\t\t  /* Attachment view       -HTML*/\n  \"by messages with attachments\",\t  /* By messages with attachments -HTML*/\n  \"Writing attachment index to\",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Cannot create symbolic link\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Cannot remove file\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Previous Folder\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Next Folder\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"List of Folders\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED -HTML */\n  \"This message has expired\",                       /* MSG_EXPIRED -HTML */\n  \"(deleted message)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Original text of this message\", /* MSG_TXT_VERSION                          -HTML */\n  \"This message has been filtered out\",        /* MSG_FILTERED_OUT -HTML */\n  \"From\",                       /* MSG_FROM                    \t -HTML*/\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                         /* End Of Message Table      - NOWHERE*/\n};\n\n/*\n** Spanish version of the language table\n** Translation by Francisco Iacobelli <fiacobelli@ibersis.cl>.\n*/\n\nchar *es[] = {       /* Espanol/Spanish */\n  \"Nuevo mensaje\",                    /* New Message \t\t      - HTML  */\n  \"Responder\",                        /* Reply  \t\t      - HTML  */\n  \"Acerca de la lista\",               /* About this list  \t      - HTML  */\n  \"Fin de los Mensajes\",              /* End of Messages  \t      - HTML  */\n  \"Inicio de mensajes\",               /* Start of Messages  \t      - HTML  */\n  \"Por fecha\",                        /* Date view  \t\t      - HTML  */\n  \"Por conversacin\",         \t      /* Thread view  \t\t      - HTML  */\n  \"Por tema\",                         /* Subject view  \t\t      - HTML  */\n  \"Por autor\",                        /* Author view  \t\t      - HTML  */\n  \"Por adjuntos\",                     /* Attachment view\t      - HTML  */\n  \"Mensajes\",                         /* Messages  \t\t      - HTML  */\n  \"Inicio\",                           /* Starting\t\t      - HTML  */\n  \"Fin\",                              /* Ending  \t\t      - HTML  */\n  \"Acerca de este archivo\",           /* About this archive           - HTML  */\n  \"Ordenados por\",                    /* Messages sorted by           - HTML  */\n  \"Otros archivos de correo\",         /* Other mail archives  \t      - HTML  */\n  \"Por fecha\",                        /* By Date  \t\t      - HTML  */\n  \"ltimos mensajes\",                 /* Most recent messages \t      - HTML  */\n  \"autor\",                            /* author \t\t      - HTML  */\n  \"fecha\",                            /* date \t\t\t      - HTML  */\n  \"Hilo de conversacin\",             /* thread \t\t      - HTML  */\n  \"tema\",                             /* subject \t\t      - HTML  */\n  \"para las opciones\",                /* for options \t \t      - STDOUT*/\n  \"Escribiendo mensajes en\",          /* Writing articles to \t      - STDOUT*/\n  \"Escribiendo ndice de fechas en\",  /* Writing date index to        - STDOUT*/\n  \"Escribiendo ndice de conversaciones en\",\n  \t\t\t\t      /* Writing thread index to      - STDOUT*/\n  \"Escribiendo ndice de temas en\",   /* Writing subject index to     - STDOUT*/\n  \"Escribiendo ndice de autores en\", /* Writing author index to      - STDOUT*/\n  \"Fecha del ltimo mensaje\",         /* Last message date \t      - HTML  */\n  \"Archivado el \",                    /* Archived on  \t\t      - HTML  */\n  \"No se puede ejecutar chmod\",       /* Can not chmod \t\t      - STDERR*/\n  \"No se pudo escribir\",              /* Could not write \t      - STDERR*/\n  \"Siguiente mensaje\",                /* Next message\t\t      - HTML  */\n  \"Mensaje anterior\",                 /* Previous message             - HTML  */\n  \"Posiblemente en respuesta a \",     /* Maybe in reply to  \t      - HTML  */\n  \"En Respuesta a\",                   /* In reply to  \t\t      - HTML  */\n  \"Siguiente en conversacin\",        /* Next in thread \t      - HTML  */\n  \"Posible respuesta\",                /* Maybe reply  \t\t      - HTML  */\n  \"Por conversacin\",                 /* By Thread  \t\t      - HTML  */\n  \"Por tema\",                         /* By Subject  \t\t      - HTML  */\n  \"Por autor\",                        /* By Author  \t\t      - HTML  */\n  \"No se puede crear el directorio\",  /* Can not create directory     - STDERR*/\n  \"Creando el directorio\",            /* Creating directory \t      - STDOUT*/\n  \"Parmetros de configuracn\",       /* Configuration Values         - STDOUT*/\n  \"ruta\",                             /* path \t\t\t      - STDOUT*/\n  \"No hay suficiente memoria!\",      /* Ran out of memory! \t      - STDERR*/\n  \"Este archivo fue generado por\",    /* This archive was generated by- HTML  */\n  \"Elementos\",                        /* Elements \t\t      - STDOUT*/\n  \"No existen elementos\",             /* No Elements \t\t      - STDOUT*/\n  \"No se puede abrir el archivo de correo\",\n  \t\t\t\t      /* Cannot open mail archive     - STDERR*/\n  \"Leyendo el encabezado nuevo...\",   /* Reading new header... \t      - STDOUT*/\n  \"Cargando la casilla\",              /* Loading mailbox \t      - STDOUT*/\n  \"codificacin no soportada, grabado -tal cual-\", \n\t                     /* encoding is not supported, stored as-is - HTML*/\n\n  \"mensajes\",                         /* articles */\n  \"Versin\",                          /* Version \t\t      - STDOUT*/\n  \"Parche No.\",                       /* Patchlevel \t\t      - STDOUT*/\n  \"Docs\",                             /* Docs \t\t\t      - STDOUT*/\n  \"Variables de comandos y control\",  /* Command and Control Variables- STDOUT*/\n  \"Si\",                               /* Yes\t\t\t      - STDOUT*/\n  \"No\",                               /* No \t\t\t      - STDOUT*/\n  \"Acerca del archivo: no utilizado\", /* About the archive: not used  - STDOUT*/\n  \"Otros archivos: no utilizado\",     /* Other archives: not used     - STDOUT*/\n  \"direccin no utilizada\",           /* address not used \t      - STDOUT*/\n  \"Utilizado <BODY> predefinido\",   /* Builtin <BODY> statement used  - STDOUT*/\n  \"No se puede leer de archivo y de stdin a la vez.\", \n                            /* Cannot read from both file and stdin.  - STDERR*/\n  \"Opciones\",                         /* Options \t\t      - STDOUT*/\n  \"URL de otros archivos\",            /* URL to other archives \t      - STDOUT*/\n  \"URL de informacin de archivos\",   /* URL to archive information   - STDOUT*/\n  \"Archivo de conf. para leer\",     /* Configuration file to read in  - STDOUT*/\n  \"Directorio donde grabar archivos HTML\", \n                              /* The directory to save HTML files in  - STDOUT*/\n  \"Leer mensajes de la entrada por defecto\",   \n                                /* Read messages from standard input  - STDOUT*/\n  \"Nombre del archivo de salida\", /* What to name the output archive  - STDOUT*/\n  \"Archivo de correo para leer\",      /* Mail archive to read in      - STDOUT*/\n  \"Mostrar progreso\",                 /* Show progress \t\t      - STDOUT*/\n  \"Mostrar solamente variables de conf.\",   \n                                 /* Show configuration variables only - STDOUT*/\n  \"Mostrar informacin de versin y salir\",   \n\t\t\t\t /* Show version information and exit - STDOUT*/\n  \"Actualizar archivo con un mensaje\",/*Update archive by one article - STDOUT*/\n  \"Sobreescribir mensajes anteriores\",/* Overwrite previous messages  - STDOUT*/\n  \"Especifique idioma utilizar\",      /* Specify language to use      - STDOUT*/\n  \"Modo de uso\",                      /* Usage                        - STDOUT*/\n  \"Idioma no soportado\",              /* Language not supported       - STDERR*/\n  \"No establecido\",                   /* Not set                      - STDOUT*/\n  \"No utilizado\",                     /* Not used                     - STDOUT*/\n  \"Archivo adjunto creado\",           /* Created attachment file      - STDOUT*/\n  \"adjunto\",                          /* attachment                   - HTML  */\n  \"modo\",                             /* mode                         - STDOUT*/\n  \"Leyendo encabezados antiguos\",     /* Reading old headers          - STDOUT*/\n  \"\",                                 /* (for alignment only)         - STDOUT*/\n  \"ERROR\",                            /* ERROR                        - STDERR*/\n  \"Direccin de correo de la lista\",  \n  \t\t\t\t/* The submission address of the list - STDERR*/\n  \"Leer slo un mensaje de la entrada\",\n  \t\t\t       /* Read only one mail from input\t\t      */\n  \"Autor\",                            /* author\t \t\t      - HTML  */\n  \"Fecha\",                            /* date \t\t\t      - HTML  */\n  \"Tema\",                             /* subject\t\t      - HTML  */\n  \"Cabecera MA (Mail actions)\",       /* Mail actions (MA) header     - HTML  */\n  \"Enviar un nuevo tema\",             /* MA New Message     \t      - HTML  */\n  \"responder a este mensaje\",         /* MA Reply       \t      - HTML  */\n  \"Resumen de ndices mensuales\",     /* monthly            \t      - HTML  */\n  \"Resumen de ndices anuales\",       /* yearly              \t      - HTML  */\n  \"Costruir cabecera para cach GDBM\",/* Build a GDBM header cache    - STDOUT*/\n  \"Creando ndice gdbm... \",          /* Creating gdbm index          - STDOUT*/\n  \"No pudo crearse fichero gdbm... \", /* Can't create gdbm index      - STDOUT*/\n  \"Mantener un archivo mbox\",         /* Maintain an mbox archive     - STDOUT*/\n  \"No se puede leer y escribir al tiempo de un fichero mbox.\",\n\t\t      /* \"Can't both read from and write to an mbox.\" - STDOUT*/\n  \"Por adjuntos\",                     /* Attachment view  \t      - HTML  */\n  \"Por mensajes con adjuntos\",\t      /* By messages with attachments - HTML  */\n  \"Escribiendo ndice de adjuntos en\",/* Writing attachment index to  - STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments - HTML  */\n  \"No pudo crearse enlace simblico\", /* MSG_CANNOT_CREATE_SYMLINK    - STDOUT*/\n  \"No puede borrarse fichero\",        /* MSG_CANNOT_UNLINK            - STDOUT*/\n  \"Carpeta anterior\",  \t\t      /* MSG_PREV_DIRECTORY           - HTML  */\n  \"Siguiente carpeta\",                /* MSG_NEXT_DIRECTORY           - HTML  */\n  \"Lista de carpetas\",  \t      /* MSG_FOLDERS_INDEX            - HTML  */\n  \"El mensaje ha sido borrado del archivo\",\n  \t\t\t\t      /* MSG_DELETED \t\t      - HTML  */\n  \"El mensaje ha caducado\",           /* MSG_EXPIRED \t\t      - HTML  */\n  \"(mensaje borrado)\",\t\t      /* MSG_DEL_SHORT                - HTML  */\n  \"Texto original del mensaje\",       /* MSG_TXT_VERSION   \t      - HTML  */\n  \"El mensaje ha sido filtrado\",      /* MSG_FILTERED_OUT \t      - HTML  */\n  \"Autor\",                            /* MSG_FROM \t\t      - HTML  */\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"El mensaje ha sido borrado del archivo\",\n  \t\t\t\t      /* MSG_DELETED_OTHER - HTML  */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                               /* End Of Message Table */\n};\n\n/*\n** Brazilian Portuguese Version of the language table\n** Translation by Hugo Cisneiros <hugo@devin.com.br>.\n*/\n\nchar *pt[] = {                     /* Brazilian Portuguese */\n  \"Nova Mensagem\",                    /* New Message        -HTML*/\n  \"Responder\",                        /* Reply              -HTML*/\n  \"Sobre esta lista\",                 /* About this list    -HTML*/\n  \"Fim das Mensagens\",                /* End of Messages    -HTML*/\n  \"Incio das Mensagens\",             /* Start of Messages  -HTML*/\n  \"Por Data\",                         /* Date view          -HTML*/\n  \"Por Tpico\",                       /* Thread view        -HTML*/\n  \"Por Assunto\",                      /* Subject view       -HTML*/\n  \"Por Autor\",                        /* Author view        -HTML*/\n  \"Por Anexo\",                        /* Attachment view    -HTML*/\n  \"Mensagens\",                        /* Messages           -HTML*/\n  \"Iniciando\",                        /* Starting           -HTML*/\n  \"Finalizando\",                      /* Ending             -HTML*/\n  \"Sobre este arquivo\",               /* About this archive -HTML*/\n  \"ordenado por\",                     /* Messages sorted by -HTML*/\n  \"Outros arquivos de lista\",         /* Other mail archives -HTML*/\n  \"Por Data\",                         /* By Date             -HTML*/\n  \"Mensagens mais recentes\",          /* Most recent messages-HTML*/\n  \"autor\",                            /* author              -HTML*/\n  \"data\",                             /* date                -HTML*/\n  \"tpico\",                           /* thread              -HTML*/\n  \"assunto\",                          /* subject             -HTML*/\n  \"para opes\",                      /* for options       -STDOUT*/\n  \"Escrevendo mensagens para\",        /* Writing messages to-STDOUT*/\n  \"Escrevendo ndice por data para\",     /* Writing date index to-STDOUT*/\n  \"Escrevendo ndice por tpico para\",   /* Writing thread index to -STDOUT*/\n  \"Escrevendo ndice por assunto para\",  /* Writing subject index to-STDOUT*/\n  \"Escrevendo ndice por autor para\",    /* Writing author index to-STDOUT*/\n  \"Data da ltima mensagem\",          /* Last message date   -HTML*/\n  \"Arquivado em\",                     /* Archived on         -HTML*/\n  \"No foi possvel utilizar o chmod\",   /* Can not chmod     -STDERR*/\n  \"No foi possivel escrever\",        /* Could not write   -STDERR*/\n  \"Prxima mensagem\",                 /* Next message        -HTML*/\n  \"Mensagem anterior\",                /* Previous message    -HTML*/\n  \"Talvez em resposta \",             /* Maybe in reply to   -HTML*/\n  \"Em resposta \",                    /* In reply to         -HTML*/\n  \"Poxima no tpico\",                /* Next in thread      -HTML*/\n  \"Talvez resposta\",                  /* Maybe reply         -HTML*/\n  \"Por Tpico\",                       /* By Thread           -HTML*/\n  \"Por Assunto\",                      /* By Subject          -HTML*/\n  \"Por Autor\",                        /* By Author           -HTML*/\n  \"No foi possvel criar diretrio\", /* Can not create directory -STDERR*/\n  \"Criando diretrio\",                /* Creating directory -STDOUT*/\n  \"Configurando valores\",             /* Configuration Values -STDOUT*/\n  \"caminho\",                          /* path              -STDOUT*/\n  \"Faltou memria!\",                  /* Ran out of memory!-STDERR*/\n  \"Este arquivo foi gerado por\",      /* This archive was generated by-HTML*/\n  \"Elementos\",                        /* Elements          -STDOUT*/\n  \"Sem Elementos\",                    /* No Elements       -STDOUT*/\n  \"No foi possvel abrir arquivo de lista\", /* Cannot open mail archive */\n  \"Lendo novo cabealho...\",          /* Reading new header...-STDOUT   */\n  \"Carregando caixa de e-mail\",       /* Loading mailbox      -STDOUT   */\n  \"Codificao no suportada, armazenando como est\",\n                                      /* encoding is not supported, stored as-is -HTML*/\n  \"mensagens\",                        /* messages             -HTML*/\n  \"Verso\",                           /* Version            -STDOUT*/\n  \"Nvel de Patch\",                   /* Patchlevel         -STDOUT*/\n  \"Documentao\",                     /* Docs               -STDOUT*/\n  \"Variveis de Comando e Controle\",  /* Command and Control Variables-STDOUT*/\n  \"Sim\",                              /* Yes                -STDOUT*/\n  \"No\",                              /* No                 -STDOUT*/\n  \"Sobre este arquivo: no usado\",    /* About the archive: not used-STDOUT */\n  \"Outros arquivos: no usado\",       /* Other archives: not used-STDOUT*/\n  \"endereo no usado\",               /* address not used        -STDOUT*/\n  \"Tag <BODY> integrada usada\",       /* Builtin <BODY> statement used-STDOUT*/\n  \"No foi possvel ler de ambos arquivos e entrada padro.\",\n                                      /* Cannot read from both file and stdin. -STDERR*/\n  \"Opes\",                           /* Options                -STDOUT*/\n  \"URL para outros arquivos\",         /* URL to other archives  -STDOUT*/\n  \"URL para informao do arquivo\",   /* URL to archive information -STDOUT*/\n  \"Arquivo de configurao para ler\", /* Configuration file to read in -STDOUT*/\n  \"O diretrio onde sero salvos os arquivos HTML\",\n                                      /* The directory to save HTML files in -STDOUT*/\n  \"Ler mensagens da entrada padro\",  /* Read messages from standard input -STDOUT*/\n  \"Qual o nome do arquivo de lista de sada\", /* What to name the output archive -STDOUT*/\n  \"Arquivo de Lista  ser lido\",      /* Mail archive to read in -STDOUT*/\n  \"Mostrar progresso\",                /* Show progress           -STDOUT*/\n  \"Mostrar apenas variveis de configurao\", /* Show configuration variables only -STDOUT*/\n  \"Mostrar informao de verso e sair\",      /* Show version information and exit -STDOUT*/\n  \"Atualizar arquivo por um artigo\",          /* Update archive by one article -STDOUT*/\n  \"Sobrescrever mensagens anteriores\",        /* Overwrite previous messages -STDOUT*/\n  \"Especifique a lngua  se usar\",           /* Specify language to use     -STDOUT*/\n  \"Uso\",                              /* Usage                       -STDOUT*/\n  \"Lngua no suportada\",             /* Language not supported      -STDERR*/\n  \"No configurado\",                  /* Not set                     -STDOUT*/\n  \"No usado\",                        /* Not used                    -STDOUT*/\n  \"Criado arquivo anexo\",             /* Created attachment file     -STDOUT*/\n  \"anexo\",                            /* attachment                    -HTML*/\n  \"modo\",                             /* mode                        -STDOUT*/\n  \"Lendo cabealhos antigos\",         /* Reading old headers         -STDOUT*/\n  \"\",                                 /* for alignment only       -STDOUT*/\n  \"ERRO\",                             /* ERROR                       -STDERR*/\n  \"O endereo de submisso da lista\", /* The submission address of the list-STDERR*/\n  \"Ler apenas um e-mail da entrada\",  /* Read only one e-mail from mbox */\n  \"Autor\",                            /* author              -HTML*/\n  \"Data\",                             /* date                -HTML*/\n  \"Assunto\",                          /* subject             -HTML*/\n  \"Aes de E-Mail\",                  /* Mail actions (MA) header -HTML*/\n  \"Novo tpico de E-Mail\",            /* MA New Message      -HTML*/\n  \"Responder  esta mensagem\",        /* MA Reply            -HTML*/\n  \"Sumrio dos Arquivos Mensais de ndice\", /* monthly             -HTML*/\n  \"Sumrio dos Arquivos Anuais de ndice\",  /* yearly              -HTML*/\n  \"Compilar cache de cabealho GDBM\",       /* Build a GDBM header cache   -STDOUT*/\n  \"Opo de cabealho GDBM no compilada\",  /* GDBM header cache option not build in  -STDERR*/\n  \"Criando ndice gdbm... \",                /* Creating gdbm index         -STDOUT*/\n  \"No foi possvel criar o arquivo gdbm... \",      /* Can't create gdbm index     -STDOUT*/\n  \"Manter um arquivo do tipo mbox\",   /* Maintain an mbox archive    -STDOUT*/\n  \"No foi possvel ler e escrever para uma mbox.\",\n                                       /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Por Anexo\",\t\t\t       /* Attachment view       -HTML*/\n  \"Por mensagens com anexo\",\t       /* By messages with attachments -HTML*/\n  \"Escrevendo ndice de anexos para \", /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t               /* file size, so far only for attachments  -HTML */\n  \"No foi possvel criar link simblico\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"No foi possvel remover o arquivo\",    /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Diretrio Anterior\",                /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Prximo Diretrio\",                 /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"Lista de Diretrios\",               /* MSG_FOLDERS_INDEX                      -HTML */\n  \"Esta mensagem foi removida do arquivo\", /* MSG_DELETED -HTML */\n  \"Esta mensagem expirou\",             /* MSG_EXPIRED -HTML */\n  \"(mensagem removida)\",               /* MSG_DEL_SHORT                            -HTML */\n  \"Texto original desta mensagem\",     /* MSG_TXT_VERSION                          -HTML */\n  \"Esta mensagem foi filtrada\",        /* MSG_FILTERED_OUT -HTML */\n  \"De\",                                /* MSG_FROM                    \t -HTML*/\n  \"Escrever arquivos XML haof\",        /* Write hoaf XML files       -STDOUT */\n  \"Escrevendo haof em\",                /* Writing haof to               -HTML*/\n  \"Esta mensagem\",                     /* This message -HTML */\n  \"Corpo da mensagem\",                 /* Message body -HTML */\n  \"Responder\",                         /* Respond -HTML */\n  \"Mais opes\",                       /* More options -HTML */\n  \"Mensagens relacionadas\",            /* Related messages -HTML */\n  \"Prximo\",                           /* Next -HTML */\n  \"Anterior\",                          /* Previous -HTML */\n  \"Respostas\",                         /* Replies -HTML */\n  \"Mensagens contemporneas ordenadas\", /* Contemporary messages sorted -HTML */\n  \"Ajuda\",                             /* Help  -HTML */\n  \"Mensagens que esta mensagem responde\",         /* In Reply To - HTML link*/\n  \"Prxima mensagem neste tpico de discusso\",   /* Next message in thread - HTML link*/\n  \"Mensagem mandada em resposta  esta mensagem\", /* Replies to this message - HTML link*/\n  \"Mensagens contemporneas por data\",    /* Contemporary messages by date */\n  \"Mensagens contemporneas por tpico\",  /* Contemporary messages by threads -  HTML */\n  \"Mensagens contemporneas por assunto\", /* Contemporary messages by subject - HTML */\n  \"Mensagens contemporneas por autor\",   /* Contemporary messages by author - HTML*/\n  \"Prxima mensagem na lista\",  /* Next message - HTML */\n  \"Mensagem anterior na lista\", /* Previous message - HTML */\n  \"Mensagens contemporneas por anexo\", /* Contemporary messages by attachments - HTML*/\n  \"Barra de navegao para nveis superiores\", /* Navigation bar, upper levels - HTML*/\n  \"Barra de navegao\",                /* Navigation bar - HTML*/\n  \"ordenar por\",                       /* Sort by - HTML*/\n  \"Outros perodos\",                   /* Other periods - HTML */\n  \"Prximo\",                           /* Next folder - HTML */\n  \"Mensagens arquivadas no prximo perodo, ordenadas por data\",\n                                       /* Next folder, by date - HTML link */\n  \"Anterior\",                          /* Previous folder - HTML */\n  \"Mensagens arquivadas no perodo anterior, ordenadas por data\",\n                                       /* Previous folder, by date - HTML Link */\n  \"Lista de todos os perodos\",        /* List of all periods - HTML*/\n  \"Este perodo\",                      /* This period - HTML*/\n  \"Recebida em\",                       /* Received on - HTML */\n  \"Perto\",                             /* Nearby - HTML */\n  \"re-organizado\",                     /* Resorted - HTML */\n  \"listado por data\",                  /* listed by date - HTML */\n  \"por tpicos de discusso\" ,         /* discussion threads - HTML */\n  \"listado por autor\",                 /* listed by author - HTML */\n  \"por assunto\",                       /* listed by subject - HTML */\n  \"por anexo\",                         /* by attachment - HTML */\n  \"perodo\",                           /* period - HTML */\n  \" para \",                            /* to - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Esta mensagem foi removida do arquivo\", /* MSG_DELETE_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                                /* End Of Message Table      - NOWHERE*/\n};\n\n/*\n** Finnish version of the language table\n*/\n\nchar *fi[] = {       /* Finnish */\n  \"Lhet uusi viesti\",              /* New Message        -HTML*/\n  \"Kommentoi\",                             /* Reply              -HTML*/\n  \"Tietoa listasta\",                       /* About this list    -HTML*/\n  \"Viestien loppuun\",                      /* End of Messages    -HTML*/\n  \"Viestien alkuun\",                       /* Start of Messages  -HTML*/\n  \"Pivysnkym\",             /* Date view          -HTML*/\n  \"Ketjunkym\",                     /* Thread view        -HTML*/\n  \"Aihenkym\",                      /* Subject view       -HTML*/\n  \"Kirjoittajankym\",               /* Author view        -HTML*/\n  \"Attachment view\",                       /* Attachment view    -HTML*/\n  \"Viestit\",                               /* Messages           -HTML*/\n  \"alkaa\",                                 /* Starting           -HTML*/\n  \"loppuu\",                                /* Ending             -HTML*/\n  \"Tietoa arkistosta\",                     /* About this archive -HTML*/\n  \"lajiteltuna\",                           /* Messages sorted by -HTML*/\n  \"Muita arkistoja\",                       /* Other mail archives -HTML*/\n  \"Pivyksittin\",               /* By Date             -HTML*/\n  \"Tuoreimmat viestit\",                    /* Most recent messages-HTML*/\n  \"kirjoittajittain\",                      /* author              -HTML*/\n  \"pivyksittin\",               /* date                -HTML*/\n  \"ketjuittain\",                           /* thread              -HTML*/\n  \"aiheittain\",                            /* subject             -HTML*/\n  \"asetuksiin\",                            /* for options       -STDOUT*/\n  \"Kirjoitan viestej\",                 /* Writing messages to-STDOUT*/\n  \"Kirjoitan hakemistoa pivyksittin\", /* Writing date index to-STDOUT*/\n  \"Kirjoitan hakemistoa ketjuittain\",      /* Writing thread index to -STDOUT*/\n  \"Kirjoitan hakemistoa aiheittain\",       /* Writing subject index to-STDOUT*/\n  \"Kirjoitan hakemistoa kirjoittajittain\", /* Writing author index to-STDOUT*/\n  \"Viimeinen viesti pivtty\",       /* Last message date   -HTML*/\n  \"Arkistoitu\",                            /* Archived on         -HTML*/\n  \"Ei voi muuttaa oikeuksia \",             /* Can not chmod     -STDERR*/\n  \"Kirjoitus eponnistui\",              /* Could not write   -STDERR*/\n  \"Seuraava viesti\",                       /* Next message        -HTML*/\n  \"Edellinen viesti\",                      /* Previous message    -HTML*/\n  \"Ehk kommentti viestiin\",            /* Maybe in reply to   -HTML*/\n  \"Kommentti viestiin\",                    /* In reply to         -HTML*/\n  \"Seuraava ketjussa\",                     /* Next in thread      -HTML*/\n  \"Ehk kommentti\",                     /* Maybe reply         -HTML*/\n  \"Ketjuittain\",                           /* By Thread           -HTML*/\n  \"Aiheittain\",                            /* By Subject          -HTML*/\n  \"Kirjoittajittain\",                      /* By Author           -HTML*/\n  \"Ei voi luoda hakemistoa\",               /* Can not create directory -STDERR*/\n  \"Luon hakemistoa\",                       /* Creating directory -STDOUT*/\n  \"Asetukset\",                             /* Configuration Values -STDOUT*/\n  \"polku\",                                 /* path              -STDOUT*/\n  \"Muisti loppui!\",                        /* Ran out of memory!-STDERR*/\n  \"Tmn arkiston loi\",            /* This archive was generated by-HTML*/\n  \"Osaset\",                                /* Elements          -STDOUT*/\n  \"Ei osasia\",                             /* No Elements       -STDOUT*/\n  \"Ei voi avata postiarkistoa\",            /* Cannot open mail archive */\n  \"Luen uusia otsikkorivej...\",        /* Reading new header...-STDOUT   */\n  \"Lataan postilaatikkoa\",                 /* Loading mailbox      -STDOUT   */\n  \"koodaus ei tuettu, talletettu sellaisenaan\", /* encoding is not supported, stored as-is -HTML*/\n  \"viesti\",                            /* messages             -HTML*/\n  \"Versio\",                                /* Version            -STDOUT*/\n  \"Patchlevel\",                            /* Patchlevel         -STDOUT*/\n  \"Ohjeet\",                                /* Docs               -STDOUT*/\n  \"Komento- ja ohjausmuuttujat\",       /* Command and Control Variables-STDOUT*/\n  \"Kyll\",                              /* Yes                -STDOUT*/\n  \"Ei\",                                    /* No                 -STDOUT*/\n  \"Tietoa arkistosta: ei kytss\", /* About the archive: not used-STDOUT */\n  \"Muut arkistot: ei kytss\",   /* Other archives: not used-STDOUT*/\n  \"osoite ei kytss\",           /* address not used        -STDOUT*/\n  \"Kytetn oletus-<BODY>-rakennetta\", /* Builtin <BODY> statement used-STDOUT*/\n  \"Ei voi lukea sek tiedostosta ett syttvirrasta (stdin).\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Asetukset\",                             /* Options                -STDOUT*/\n  \"URL muihin arkistoihin\",                /* URL to other archives  -STDOUT*/\n  \"URL arkiston tietoihin\",              /* URL to archive information -STDOUT*/\n  \"Asetustiedosto\",                   /* Configuration file to read in -STDOUT*/\n  \"HTML-tiedostojen talletushakemisto\", /* The directory to save HTML files in -STDOUT*/\n  \"Lue viestit syttvirrasta (stdin)\",/* Read messages from standard input -STDOUT*/\n  \"Talletettavan arkiston nimi\",   /* What to name the output archive -STDOUT*/\n  \"Luettava postiarkisto\",                /* Mail archive to read in -STDOUT*/\n  \"Nyt eteneminen\",               /* Show progress           -STDOUT*/\n  \"Nyt vain asetusmuuttujat\", /* Show configuration variables only -STDOUT*/\n  \"Nyt versiotieto ja lopeta ohjelma\", /* Show version information and exit -STDOUT*/\n  \"Pivit arkistoa yhdell viestill\", /* Update archive by one article -STDOUT*/\n  \"Korvaa aiemmat viestit\", /* Overwrite previous messages -STDOUT*/\n  \"Mrit kytettv kieli\",     /* Specify language to use     -STDOUT*/\n  \"Kyttohje\",                    /* Usage                   -STDOUT*/\n  \"Kieli ei tuettu\",                     /* Language not supported  -STDERR*/\n  \"Ei asetettu\",                         /* Not set                 -STDOUT*/\n  \"Ei kytss\",                /* Not used                -STDOUT*/\n  \"Luotu liitetiedosto\",                 /* Created attachment file -STDOUT*/\n  \"liite\",                               /* attachment              -HTML*/\n  \"suojaus\",                             /* mode                    -STDOUT*/\n  \"Luen vanhoja otsikkorivej\",       /* Reading old headers     -STDOUT*/\n  \"\",                                    /* for alignment only      -STDOUT*/\n  \"VIRHE\",                               /* ERROR                   -STDERR*/\n  \"Listan lhetysosoite\",   /* The submission address of the list-STDERR*/\n  \"Lue vain yksi viesti\",\n  \"Kirjoittajan mukaan\",                 /* author                    -HTML*/\n  \"Pivyksen mukaan\",             /* date                      -HTML*/\n  \"Aiheen mukaan\",                       /* subject                   -HTML*/\n  \"Mail actions\",                    /* Mail actions (MA) header -HTML*/\n  \"mail a new topic\",                /* MA New Message      -HTML*/\n  \"respond to this message\",         /* MA Reply            -HTML*/\n  \"Summary of Monthly Index Files\",      /* monthly             -HTML*/\n  \"Summary of Yearly Index Files\",       /* yearly              -HTML*/\n  \"Build a GDBM header cache\",   /* Build a GDBM header cache   -STDOUT*/\n  \"GDBM header cache option not build in\",\n   \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Creating gdbm index... \",     /* Creating gdbm index         -STDOUT*/\n  \"Can't create gdbm file... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Maintain an mbox archive\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Can't both read from and write to an mbox.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Attachment view\",                      /* Attachment view  -HTML*/\n  \"By messages with attachments\",\t  /* By messages with attachments -HTML*/\n  \"Writing attachment index to\",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Cannot create symbolic link\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Cannot remove file\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Previous Folder\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Next Folder\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"List of Folders\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED -HTML */\n  \"This message has expired\",                       /* MSG_EXPIRED -HTML */\n  \"(deleted message)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Original text of this message\", /* MSG_TXT_VERSION                          -HTML */\n  \"This message has been filtered out\",        /* MSG_FILTERED_OUT -HTML */\n  \"Kirjoittajan mukaan\",                 /* MSG_FROM                  -HTML*/\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                              /* End Of Message Table      - NOWHERE*/\n};\n\n\n/*\n** Italian version of the language table\n** Gabriele Bartolini <gbartolini@prato.linux.it>, Prato Linux User Group, Italia\n** Marco Nenciarini <mnencia@prato.linux.it>, Prato Linux User Group, Italia\n**\n*/\n\nchar *it[] = {       /* Italian */\n  \"Nuovo Messaggio\",                 /* New Message        -HTML*/\n  \"Rispondi\",                       /* Reply              -HTML*/\n  \"Riguardo questa lista\",             /* About this list    -HTML*/\n  \"Fine dei messaggi\",             /* End of Messages    -HTML*/\n  \"Inizio dei messaggi\",           /* Start of Messages  -HTML*/\n  \"Visualizza per data\",                   /* Date view          -HTML*/\n  \"Visualizza per discussione\",                 /* Thread view        -HTML*/\n  \"Visualizza per oggetto\",                /* Subject view       -HTML*/\n  \"Visualizza per autore\",                 /* Author view        -HTML*/\n  \"Altri gruppi\",                /* Other groups       -HTML*/\n  \"Messaggi\",                    /* Messages           -HTML*/\n  \"Inizio\",                    /* Starting           -HTML*/\n  \"Fine\",                      /* Ending             -HTML*/\n  \"Riguardo questo archivio\",          /* About this archive -HTML*/\n  \"ordinato per\",                   /* Messages sorted by -HTML*/\n  \"Altri archivi di posta\",         /* Other mail archives -HTML*/\n  \"Per data\",                     /* By Date             -HTML*/\n  \"Messaggi pi recenti\",        /* Most recent messages-HTML*/\n  \"autore\",                      /* author              -HTML*/\n  \"data\",                        /* date                -HTML*/\n  \"discussione\",                      /* thread              -HTML*/\n  \"oggetto\",                     /* subject             -HTML*/\n  \"per opzioni\",                 /* for options       -STDOUT*/\n  \"Scrittura messaggi su\",         /* Writing messages to-STDOUT*/\n  \"Scrittura indice delle date su\",       /* Writing date index to-STDOUT*/\n  \"Scrittura indice delle discussioni su\",     /* Writing thread index to -STDOUT*/\n  \"Scrittura indice degli oggetti su\",    /* Writing subject index to-STDOUT*/\n  \"Scrittura indice degli autori su\",     /* Writing author index to-STDOUT*/\n  \"Data dell'ultimo messaggio\",           /* Last message date   -HTML*/\n  \"Archiviato il\",                 /* Archived on         -HTML*/\n  \"Impossibile eseguire 'chmod'\",               /* Can not chmod     -STDERR*/\n  \"Impossibile scrivere\",             /* Could not write   -STDERR*/\n  \"Prossimo messaggio\",                /* Next message        -HTML*/\n  \"Messaggio precedente\",            /* Previous message    -HTML*/\n  \"Forse in risposta a\",           /* Maybe in reply to   -HTML*/\n  \"In risposta a\",                 /* In reply to         -HTML*/\n  \"Prossimo nella discussione\",              /* Next in thread      -HTML*/\n  \"Forse risposta\",                 /* Maybe reply         -HTML*/\n  \"Per discussione\",                   /* By Thread           -HTML*/\n  \"Per oggetto\",                  /* By Subject          -HTML*/\n  \"Per autore\",                   /* By Author           -HTML*/\n  \"Impossibile creare la directory\",    /* Can not create directory -STDERR*/\n  \"Creazione directory\",          /* Creating directory -STDOUT*/\n  \"Valori di configurazione\",        /* Configuration Values -STDOUT*/\n  \"percorso\",                        /* path              -STDOUT*/\n  \"Memoria insufficiente!\",          /* Ran out of memory!-STDERR*/\n  \"Questo archivio  stato generato da\",  /* This archive was generated by-HTML*/\n  \"Elementi\",                    /* Elements          -STDOUT*/\n  \"Nessun elemento\",                 /* No Elements       -STDOUT*/\n  \"Impossibile aprire archivio di posta\",    /* Cannot open mail archive */\n  \"Lettura nuove intestazioni\",       /* Reading new header...-STDOUT   */\n  \"Caricamento casella di posta\",             /* Loading mailbox      -STDOUT   */\n  \"Codifica non supportata, memorizzato 'cos come '\", /* encoding is not supported, stored as-is -HTML*/\n  \"messaggi\",                    /* messages             -HTML*/\n  \"Versione\",                     /* Version            -STDOUT*/\n  \"Patchlevel\",                  /* Patchlevel         -STDOUT*/\n  \"Documenti\",                        /* Docs               -STDOUT*/\n  \"Variabili di comando e controllo\",       /* Command and Control Variables-STDOUT*/\n  \"S\",                         /* Yes                -STDOUT*/\n  \"No\",                          /* No                 -STDOUT*/\n  \"Riguardo l'archivio: non usato\", /* About the archive: not used-STDOUT */\n  \"Altri archivi: non usati\",    /* Other archives: not used-STDOUT*/\n  \"indirizzo inutilizzato\",            /* address not used        -STDOUT*/\n  \"Istruzione <BODY> di default utilizzata\", /* Builtin <BODY> statement used-STDOUT*/\n  \"Impossibile leggere sia dal file che dal canale stdin\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Opzioni\",                     /* Options                -STDOUT*/\n  \"URL per gli altri archivi\",       /* URL to other archives  -STDOUT*/\n  \"URL per le informazioni sull'archivio\",  /* URL to archive information -STDOUT*/\n  \"File di configurazione\", /* Configuration file to read in -STDOUT*/\n  \"Directory in cui salvare i file HTML\", /* The directory to save HTML files in -STDOUT*/\n  \"Lettura messaggi dal canale stdin\",/* Read messages from standard input -STDOUT*/\n  \"Come nominare l'archivio in output\", /* What to name the output archive -STDOUT*/\n  \"Archivio di posta in lettura\",     /* Mail archive to read in -STDOUT*/\n  \"Mostra progresso\",               /* Show progress           -STDOUT*/\n  \"Mostra solo le variabili di configurazione\", /* Show configuration variables only -STDOUT*/\n  \"Mostra le informazioni sulla versione ed esci\", /* Show version information and exit -STDOUT*/\n  \"Aggiorna l'archivio per un articolo\", /* Update archive by one article -STDOUT*/\n  \"Sovrascrivi messaggi precedenti\", /* Overwrite previous messages -STDOUT*/\n  \"Specifica il linguaggio da usare\",     /* Specify language to use     -STDOUT*/\n  \"Utilizzo\",                       /* Usage                       -STDOUT*/\n  \"Linguaggio non supportato\",      /* Language not supported      -STDERR*/\n  \"Non impostato\",                     /* Not set                     -STDOUT*/\n  \"Non utilizzato\",                    /* Not used                    -STDOUT*/\n  \"Creato il file per l'allegato\",     /* Created attachment file     -STDOUT*/\n  \"allegato\",                  /* attachment                    -HTML*/\n  \"modalit\",                        /* mode                        -STDOUT*/\n  \"Lettura intestazioni vecchie\",         /* Reading old headers         -STDOUT*/\n  \"\", /* for alignment only       -STDOUT*/\n  \"ERRORE\",                       /* ERROR                       -STDERR*/\n  \"Indirizzo per l'iscrizione alla lista\",\n                           /* The submission address of the list-STDERR*/\n  \"Legge una mail soltanto dall'input\",\n  \"Autore\",                      /* author              -HTML*/\n  \"Data\",                        /* date                -HTML*/\n  \"Oggetto\",                     /* subject             -HTML*/\n  \"Azioni di posta\",                /* Mail actions (MA) header -HTML*/\n  \"spedisci un nuovo argomento\",            /* MA New Message      -HTML*/\n  \"rispondi a questo messaggio\",     /* MA Reply            -HTML*/\n  \"Riepilogo dei file di indice mensili\",       /* monthly             -HTML*/\n  \"Riepilogo dei file di indice annuali\",        /* yearly              -HTML*/\n  \"Costruisci una cache degli header in GDBM\",   /* Build a GDBM header cache   -STDOUT*/\n  \"Creazione dell'indice gdbm ... \",     /* Creating gdbm index         -STDOUT*/\n  \"Impossibile creare l'indice gdbm ... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Mantieni un archivio di tipo mbox\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Impossibile leggere da/scrivere su mbox.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Visualizza allegato\",\t\t\t  /* Attachment view       -HTML*/\n  \"Per messaggi con allegato\",\t  /* By messages with attachments -HTML*/\n  \"Scrittura indice allegato su\",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Impossibile creare link simbolico\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Impossibile eliminare file\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Cartella precedente\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Prossima cartella\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"Lista delle cartelle\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"Questo messaggio  stato cancellato dall'archivio\", /* MSG_DELETED -HTML */\n  \"Il messaggio  scaduto\",                       /* MSG_EXPIRED -HTML */\n  \"(messaggio cancellato)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Testo originale di questo messaggio\", /* MSG_TXT_VERSION                          -HTML */\n  \"Questo messaggio  stato filtrato\",        /* MSG_FILTERED_OUT -HTML */\n  \"From\",                       /* MSG_FROM                    \t -HTML*/\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Questo messaggio  stato cancellato dall'archivio\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                          /* End Of Message Table      - NOWHERE*/\n};\n\n/*\n** French version of the language table\n** Translation by Nicolas Noble <pixels@chez.com>\n*/\n\nchar *fr[] = {       /* French */\n  \"Nouveau Message\",                       /* New Message        -HTML*/\n  \"R&eacute;ponse\",                        /* Reply              -HTML*/\n  \"A propos de cette liste\",               /* About this list    -HTML*/\n  \"Fin des Messages\",                      /* End of Messages    -HTML*/\n  \"D&eacute;but des Messages\",             /* Start of Messages  -HTML*/\n  \"Liste par Date\",                        /* Date view          -HTML*/\n  \"Liste par Th&egrave;me\",                /* Thread view        -HTML*/\n  \"Liste par Sujet\",                       /* Subject view       -HTML*/\n  \"Liste par Auteur\",                      /* Author view        -HTML*/\n  \"Liste par fichier attachs\",            /* Attachment view    -HTML*/\n  \"Messages\",                              /* Messages           -HTML*/\n  \"D&eacute;but\",                          /* Starting           -HTML*/\n  \"Fin\",                                   /* Ending             -HTML*/\n  \"A propos de cette archive\",             /* About this archive -HTML*/\n  \", class&eacute;s par\",                  /* Messages sorted by -HTML*/\n  \"Autres archives\",                       /* Other mail archives -HTML*/\n  \"par Date\",                              /* By Date             -HTML*/\n  \"Messages les plus r&eacute;cents\",      /* Most recent messages-HTML*/\n  \"auteur\",                                /* author              -HTML*/\n  \"date\",                                  /* date                -HTML*/\n  \"th&egrave;me\",                          /* thread              -HTML*/\n  \"sujet\",                                 /* subject             -HTML*/\n  \"pour les options\",                      /* for options       -STDOUT*/\n  \"Ecriture des messages vers\",            /* Writing messages to-STDOUT*/\n  \"Ecriture de l'index 'date' dans\",       /* Writing date index to-STDOUT*/\n  \"Ecriture de l'index 'thme' dans\",      /* Writing thread index to -STDOUT*/\n  \"Ecriture de l'index 'sujet' dans\",      /* Writing subject index to-STDOUT*/\n  \"Ecriture de l'index 'auteur' dans\",     /* Writing author index to-STDOUT*/\n  \"Date du dernier message\",               /* Last message date   -HTML*/\n  \"Archiv&eacute; le\",                     /* Archived on         -HTML*/\n  \"Ne peut effectuer de chmod\",            /* Can not chmod     -STDERR*/\n  \"Ne peut crire\",                        /* Could not write   -STDERR*/\n  \"Message suivant\",                       /* Next message        -HTML*/\n  \"Message pr&eacute;c&eacute;dent\",       /* Previous message    -HTML*/\n  \"Sans doute en r&eacute;ponse &agrave;\", /* Maybe in reply to   -HTML*/\n  \"En r&eacute;ponse &agrave;\",             /* In reply to         -HTML*/\n  \"Suivant dans le th&egrave;me\",          /* Next in thread      -HTML*/\n  \"Sans doute en r&eacute;ponse\",          /* Maybe reply         -HTML*/\n  \"par Th&eagrave;me\",                      /* By Thread           -HTML*/\n  \"par Sujet\",                             /* By Subject          -HTML*/\n  \"par Auteur\",                            /* By Author           -HTML*/\n  \"Ne peut crer le rpertoire\",           /* Can not create directory -STDERR*/\n  \"Cration du rpertoire\",                /* Creating directory -STDOUT*/\n  \"Valeurs configures\",                   /* Configuration Values -STDOUT*/\n  \"chemin\",                                /* path              -STDOUT*/\n  \"Plus assez de mmoire!\",                 /* Ran out of memory!-STDERR*/\n  \"Cette archive a &eacute;t&eacute; cr&eacute;&eacute;e par\",  /* This archive was generated by-HTML*/\n  \"Elments\",                              /* Elements          -STDOUT*/\n  \"Aucun Elment\",                         /* No Elements       -STDOUT*/\n  \"Ne peut ouvrir l'archive de mail\",      /* Cannot open mail archive */\n  \"Lecture du nouvel en-tte...\",          /* Reading new header...-STDOUT   */\n  \"Chargement de la boite aux lettres\",    /* Loading mailbox      -STDOUT   */\n  \"encodage non support&eacute;, stock&eacute; tel quel\",/* encoding is not supported, stored as-is -HTML*/\n  \"messages\",                              /* messages             -HTML*/\n  \"Version\",                               /* Version            -STDOUT*/\n  \"Revision\",                              /* Patchlevel         -STDOUT*/\n  \"Documents\",                             /* Docs               -STDOUT*/\n  \"Variables de Commande et de Contrle\",  /* Command and Control Variables-STDOUT*/\n  \"Oui\",                                   /* Yes                -STDOUT*/\n  \"Non\",                                   /* No                 -STDOUT*/\n  \"A propos de l'archive: non utilis\",    /* About the archive: not used-STDOUT */\n  \"Autres archives: non utilis\",          /* Other archives: not used-STDOUT*/\n  \"adresse non utilise\",                  /* address not used        -STDOUT*/\n  \"Utilisation de la dclaration <BODY>\",  /* Builtin <BODY> statement used-STDOUT*/\n  \"Impossible de lire simulatanment un fichier et le flot d'entre standard (stdin)\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Options\",                               /* Options                -STDOUT*/\n  \"URL vers les autres archives\",          /* URL to other archives  -STDOUT*/\n  \"URL vers les informations sur l'archive\",  /* URL to archive information -STDOUT*/\n  \"Fichier de configuration  lire\",       /* Configuration file to read in -STDOUT*/\n  \"Rpertoire o sauver les fichiers HTML\",/* The directory to save HTML files in -STDOUT*/\n  \"Lecture des messages depuis le flot d'entre standard (stdin)\", /* Read messages from standard input -STDOUT*/\n  \"Nom de l'archive de sortie\",            /* What to name the output archive -STDOUT*/\n  \"Archive d'email  lire\",                   /* Mail archive to read in -STDOUT*/\n  \"Voir la progression\",                   /* Show progress           -STDOUT*/\n  \"Voir les variables de configuration seulement\", /* Show configuration variables only -STDOUT*/\n  \"Afficher la version et quitter\",        /* Show version information and exit -STDOUT*/\n  \"Mettre  jour l'archive d'un article\",  /* Update archive by one article -STDOUT*/\n  \"Ecraser les messages prcdents\",       /* Overwrite previous messages -STDOUT*/\n  \"Spcifier la langue  utiliser\",        /* Specify language to use     -STDOUT*/\n  \"Utilisation\",                           /* Usage           -STDOUT*/\n  \"Langue non supporte\",                  /* Language not supported -STDERR*/\n  \"Non dfini\",                            /* Not set        -STDOUT*/\n  \"Non utilis\",                           /* Not used       -STDOUT*/\n  \"Fichier attach cr\",                  /* Created attachment file -STDOUT*/\n  \"fichier attach&eacute;\",                /* attachment     -HTML*/\n  \"mode\",                                  /* mode           -STDOUT*/\n  \"Lecture des anciens en-ttes\",          /* Reading old headers -STDOUT*/\n  \"\",                                      /* for alignment only       -STDOUT*/\n  \"ERREUR\",                                /* ERROR                    -STDERR*/\n  \"Adresse d'envoi  la liste\", \n                                           /* The submission address of the list-STDERR*/\n  \"Lire seulement un mail depuis l'entre\",\n  \"Auteur\",                                /* author              -HTML*/\n  \"Date\",                                  /* date                -HTML*/\n  \"Sujet\",                                 /* subject             -HTML*/\n  \"Actions sur les mails\",                 /* Mail actions (MA) header -HTML*/\n  \"cr&eacute;er un nouveau th&egrave;me\",  /* MA New Message      -HTML*/\n  \"r&eacute;pondre &agrave; ce message\",   /* MA Reply            -HTML*/\n  \"R&eacute;capitulatif des fichiers Index mensuels\",   /* monthly             -HTML*/\n  \"R&eacute;capitulatif des fichiers Index annuels\",         /* yearly              -HTML*/\n  \"Creation d'un cache GDBM pour les en-ttes\",  /* Build a GDBM header cache   -STDOUT*/\n  \"GDBM header cache option not build in\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Generation de l'index GDBM... \",               /* Creating gdbm index         -STDOUT*/\n  \"Impossible de crer un fichier GDBM... \",    /* Can't create gdbm index     -STDOUT*/\n  \"Maintenance d'une archive email (mbox)\",     /* Maintain an mbox archive    -STDOUT*/\n  \"Impossible de lire et d'crire simultanment dans une archive email (mbox)\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Liste par fichier attach&eacute;s\",            /* Attachment view  -HTML*/\n  \"par messages avec fichiers attach&eacute;s\",    /* By messages with attachments -HTML*/\n  \"Ecriture de l'index 'fichiers attachs' dans\",/* Writing attachment index to -STDOUT*/\n  \"octets\",\t\t                   /* file size, so far only for attachments  -HTML */\n  \"Impossible de crer un lien symbolique\",/* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Impossible de supprimer le fichier\",    /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Dossier pr&eacute;c&eacute;dent\",                     /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Dossier suivant\",                       /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"Liste des dossiers\",                    /* MSG_FOLDERS_INDEX                      -HTML */\n  \"Ce message a &eacute;t&eacute; supprim&eacute; de l'archive\", /* MSG_DELETED -HTML */\n  \"Ce message est trop vieux\",             /* MSG_EXPIRED -HTML */\n  \"(message supprim&eacute;)\",              /* MSG_DEL_SHORT                            -HTML */\n  \"Texte original de ce message\",          /* MSG_TXT_VERSION                          -HTML */\n  \"Ce message a &eacute;t&eacute; supprim par filtrage\",    /* MSG_FILTERED_OUT -HTML */\n  \"Auteur\",                                /* MSG_FROM              -HTML*/\n  \"Ecrire fichiers XML haof (archive overview files)\",       /* Write hoaf XML files       -STDOUT */\n  \"Ecriture des fichiers haof (archive overview files) dans\",     /* Writing haof to               -HTML*/\n  \"Ce message\",                 /* This message -HTML */\n  \"Corps du message\",                 /* Message body -HTML */\n  \"R&eacute;pondre\",                      /* Respond -HTML */\n  \"Autres options\",                 /* More options -HTML */\n  \"Messages en rapport\",             /* Related messages -HTML */\n  \"Suivant\",                         /* Next -HTML */\n  \"Pr&eacute;cedent\",                     /* Previous -HTML */\n  \"R&eacute;ponses\",                      /* Replies -HTML */\n  \"Messages r&eacute;cents tri&eacute;s\", /* Contemporary messages sorted -HTML */\n  \"Aide\",                         /* Help  -HTML */\n  \"Message auquels ce message r&eacute;pond\", /* In Reply To - HTML link*/\n  \"Message suivant dans la discussion\", /* Next message in thread - HTML link*/\n  \"Message envoy&eacute; en r&eacute;ponse au message courant\", /* Replies to this message - HTML link*/\n  \"Messages r&eacute;cents par date\", /* Contemporary messages by date */\n  \"Discussions r&eacute;centes\", /* Contemporary messages by threads -  HTML */\n  \"Messages r&eacute;cents par sujet\", /* Contemporary messages by subject - HTML */\n  \"Messages r&eacute;cents par auteur\", /* Contemporary messages by author - HTML*/\n  \"Message suivant dans la liste\", /* Next message - HTML */\n  \"Message pr&eacute;cedent dans la liste\", /* Previous message - HTML */\n  \"Messages r&eacute;cents par fichier attach&eacute;\", /* Contemporary messages by attachments - HTML*/\n  \"Barre de navigation vers le niveau sup&eacute;rieur\", /* Navigation bar, upper levels - HTML*/\n  \"Barre de navigation\", /* Navigation bar - HTML*/\n  \"Trier par\", /* Sort by - HTML*/\n  \"Autres p&eacute;riodes\", /* Other periods - HTML */\n  \"Suivant\", /* Next folder - HTML */\n  \"Messages archives dans la p&eacute;riode suivante, tri&eacute;s par date\", /* Next folder, by date - HTML link */\n  \"Pr&eacute;cedent\", /* Previous folder - HTML */\n  \"Messages archives dans la p&eacute;riode pr&eacute;cedente, tri&eacute;s par date\", /* Previous folder, by date - HTML Link */\n  \"Liste de toutes les p&eacute;riodes\", /* List of all periods - HTML*/\n  \"Cette p&eacute;riode\", /* This period - HTML*/\n  \"Re&Ccedil;u le\", /* Received on - HTML */\n  \"A cot&eacute; de\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"list&eacute; par date\", /* listed by date - HTML */\n  \"par fil de discussion\" , /* discussion threads - HTML */\n  \"list&eacute; par auteur\", /* listed by author - HTML */\n  \"par sujet\", /* listed by subject - HTML */\n  \"par fichier attach&eacute;\", /* by attachment - HTML */\n  \"p&eacute;riode\", /* period - HTML */\n  \" &eagrave; \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Ce message a &eacute;t&eacute; supprim&eacute; de l'archive\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                                    /* End Of Message Table  - NOWHERE*/\n};\n\n/*\n** Icelandic version of the language table\n** Translation by Bjarni R. Einarsson <bre@netverjar.is>\n*/\n\nchar *is[] = {       /* Icelandic */\n  \"Ntt brf\",                   /* New Message        -HTML*/\n  \"Svar\",                              /* Reply              -HTML*/\n  \"Um ennan lista\",                /* About this list    -HTML*/\n  \"Endir safns\",                       /* End of Messages    -HTML*/\n  \"Upphaf safns\",                      /* Start of Messages  -HTML*/\n  \"Raa e. dagssetningum\",      /* Date view          -HTML*/\n  \"Raa e. umrum\",      /* Thread view        -HTML*/\n  \"Raa e. vifangsefnum\",   /* Subject view       -HTML*/\n  \"Raa e. hfundum\",        /* Author view        -HTML*/\n  \"Attachment view\",                  /* Attachment view    -HTML*/\n  \"Brfum\",                         /* Messages           -HTML*/\n  \"Fr\",                            /* Starting           -HTML*/\n  \"Til\",                               /* Ending             -HTML*/\n  \"Um etta safn\",                  /* About this archive -HTML*/\n  \"Raa eftir\",                     /* Messages sorted by -HTML*/\n  \"nnur sfn\",                  /* Other mail archives -HTML*/\n  \"eftir dagssetningum\",               /* By Date             -HTML*/\n  \"Njustu brfin\",              /* Most recent messages-HTML*/\n  \"hfundum\",                       /* author              -HTML*/\n  \"dags.\",                             /* date                -HTML*/\n  \"umrum\",                     /* thread              -HTML*/\n  \"vifangsefnum\",                  /* subject             -HTML*/\n  \"for options\",                       /* for options       -STDOUT*/\n  \"Writing messages to\",               /* Writing messages to-STDOUT*/\n  \"Writing date index to\",             /* Writing date index to-STDOUT*/\n  \"Writing thread index to\",           /* Writing thread index to -STDOUT*/\n  \"Writing subject index to\",          /* Writing subject index to-STDOUT*/\n  \"Writing author index to\",           /* Writing author index to-STDOUT*/\n  \"Dags. sasta brfs\",      /* Last message date   -HTML*/\n  \"Sasta brf mtteki\", /* Archived on         -HTML*/\n  \"Can not chmod\",                     /* Can not chmod     -STDERR*/\n  \"Could not write\",                   /* Could not write   -STDERR*/\n  \"Nsta brf\",                  /* Next message        -HTML*/\n  \"Fyrra brf\",                     /* Previous message    -HTML*/\n  \"Mgulega  frh. af\",          /* Maybe in reply to   -HTML*/\n  \" framhaldi af\",                 /* In reply to         -HTML*/\n  \"Nst  umru\",         /* Next in thread      -HTML*/\n  \"Mgulegt svar\",                  /* Maybe reply         -HTML*/\n  \"eftir umrum\",               /* By Thread           -HTML*/\n  \"eftir vifangsefnum\",            /* By Subject          -HTML*/\n  \"eftir hfundum\",                 /* By Author           -HTML*/\n  \"Can not create directory\",          /* Can not create directory -STDERR*/\n  \"Creating directory\",                /* Creating directory -STDOUT*/\n  \"Configuration Values\",              /* Configuration Values -STDOUT*/\n  \"path\",                              /* path              -STDOUT*/\n  \"Ran out of memory!\",                /* Ran out of memory!-STDERR*/\n  \"Framreitt af\",                      /* This archive was generated by-HTML*/\n  \"Elements\",                          /* Elements          -STDOUT*/\n  \"No Elements\",                       /* No Elements       -STDOUT*/\n  \"Cannot open mail archive\",          /* Cannot open mail archive */\n  \"Reading new header...\",             /* Reading new header...-STDOUT   */\n  \"Loading mailbox\",                   /* Loading mailbox      -STDOUT   */\n  \"framandi kun, geymt breytt\", /* encoding is not supported, stored as-is -HTML*/\n  \"brf.\",                          /* messages             -HTML*/\n  \"Version\",                           /* Version            -STDOUT*/\n  \"Patchlevel\",                        /* Patchlevel         -STDOUT*/\n  \"Docs\",                              /* Docs               -STDOUT*/\n  \"Command and Control Variables\",     /* Command and Control Variables-STDOUT*/\n  \"Yes\",                               /* Yes                -STDOUT*/\n  \"No\",                                /* No                 -STDOUT*/\n  \"About the archive: not used\",       /* About the archive: not used-STDOUT */\n  \"Other archives: not used\",          /* Other archives: not used-STDOUT*/\n  \"address not used\",                  /* address not used        -STDOUT*/\n  \"Builtin <BODY> statement used\",     /* Builtin <BODY> statement used-STDOUT*/\n  \"Cannot read from both file and stdin.\", /* Cannot read from both file and stdin. -STDERR*/\n  \"Options\",                           /* Options                -STDOUT*/\n  \"URL to other archives\",             /* URL to other archives  -STDOUT*/\n  \"URL to archive information\",        /* URL to archive information -STDOUT*/\n  \"Configuration file to read in\",    /* Configuration file to read in -STDOUT*/\n  \"The directory to save HTML files in\", /* The directory to save HTML files in -STDOUT*/\n  \"Read messages from standard input\", /* Read messages from standard input -STDOUT*/\n  \"What to name the output archive\",   /* What to name the output archive -STDOUT*/\n  \"Mail archive to read in\",           /* Mail archive to read in -STDOUT*/\n  \"Show progress\",                     /* Show progress           -STDOUT*/\n  \"Show configuration variables only\", /* Show configuration variables only -STDOUT*/\n  \"Show version information and exit\", /* Show version information and exit -STDOUT*/\n  \"Update archive by one article\",    /* Update archive by one article -STDOUT*/\n  \"Overwrite previous messages\",      /* Overwrite previous messages -STDOUT*/\n  \"Specify language to use\",          /* Specify language to use     -STDOUT*/\n  \"Usage\",                            /* Usage                       -STDOUT*/\n  \"Language not supported\",           /* Language not supported      -STDERR*/\n  \"Not set\",                          /* Not set                     -STDOUT*/\n  \"Not used\",                         /* Not used                    -STDOUT*/\n  \"Created attachment file\",          /* Created attachment file     -STDOUT*/\n  \"vihengi\",                      /* attachment                    -HTML*/\n  \"mode\",                             /* mode                        -STDOUT*/\n  \"Reading old headers\",              /* Reading old headers         -STDOUT*/\n  \"\",                                 /* for alignment only       -STDOUT*/\n  \"ERROR\",                            /* ERROR                       -STDERR*/\n  \"The submission address of the list\", \n                           /* The submission address of the list-STDERR*/\n  \"Read only one mail from input\",\n  \"Hfundur\",                      /* author              -HTML*/\n  \"Dagssetning\",                      /* date                -HTML*/\n  \"Vifangsefni\",                  /* subject             -HTML*/\n  \"Mail actions\",                     /* Mail actions (MA) header -HTML*/\n  \"mail a new topic\",                 /* MA New Message      -HTML*/\n  \"respond to this message\",          /* MA Reply            -HTML*/\n  \"Summary of Monthly Index Files\",   /* monthly             -HTML*/\n  \"Summary of Yearly Index Files\",    /* yearly              -HTML*/\n  \"Build a GDBM header cache\",   /* Build a GDBM header cache   -STDOUT*/\n  \"GDBM header cache option not build in\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"GDBM header cache option not build in\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Creating gdbm index... \",     /* Creating gdbm index         -STDOUT*/\n  \"Can't create gdbm file... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Maintain an mbox archive\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Can't both read from and write to an mbox.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Attachment view\",                      /* Attachment view  -HTML*/\n  \"By messages with attachments\",\t  /* By messages with attachments -HTML*/\n  \"Writing attachment index to\",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Cannot create symbolic link\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Cannot remove file\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Previous Folder\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Next Folder\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"List of Folders\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED -HTML */\n  \"This message has expired\",                       /* MSG_EXPIRED -HTML */\n  \"(deleted message)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Original text of this message\", /* MSG_TXT_VERSION                          -HTML */\n  \"This message has been filtered out\",        /* MSG_FILTERED_OUT -HTML */\n  \"Hfundur\",                         /* MSG_FROM              -HTML*/\n  \"Write haof XML files\",       /* Write hoaf XML files       -STDOUT */\n  \"Writing haof to\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"This message has been deleted from the archive\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                               /* End Of Message Table      - NOWHERE*/\n};\n\n/*\n** Swedish version of the language table. Daniel Stenberg translation.\n** (a little secret for free: we don't say bork ;-)\n*/\n\nchar *sv[] = {\n  \"Nytt brev\",                      /* New Message        -HTML*/\n  \"Svar\" ,                          /* Reply              -HTML*/\n  \"Om den h&auml;r listan\",      /* About this list    -HTML*/\n  \"Slut p&aring; brevlistan\",          /* End of Messages    -HTML*/\n  \"Start p&aring; brevlistan\",         /* Start of Messages  -HTML*/\n  \"Datumvy\",                        /* Date view          -HTML*/\n  \"Tr&aring;dvy\",                      /* Thread view        -HTML*/\n  \"&Auml;mnesvy\",                     /* Subject view       -HTML*/\n  \"F&ouml;rfattarvy\",                 /* Author view        -HTML*/\n  \"Bilagevy\",                  /* Attachment view    -HTML*/\n  \"Brev\",                           /* Messages           -HTML*/\n  \"Startar\",                        /* Starting           -HTML*/\n  \"Slutar\",                         /* Ending             -HTML*/\n  \"Om det h&auml;r arkivet\", /* About this archive -HTML*/\n  \"sorterade efter\",                 /* Messages sorted by -HTML*/\n  \"Andra brevarkiv\",                /* Other mail archives-HTML*/\n  \"Datumsorterat\",                    /* By Date            -HTML*/\n  \"Nyast brev\",                     /* Most recent messages-HTML*/\n  \"f&ouml;rfattare\",                  /* author             -HTML*/\n  \"datum\",                          /* date               -HTML*/\n  \"tr&aring;d\",                        /* thread             -HTML*/\n  \"&auml;mne\",                        /* subject            -HTML*/\n  \"fr instllningar\",        /* for options        -STDOUT*/\n  \"Skriver brev till\",              /* Writing messages to-STDOUT*/\n  \"Skriver datumindex till\",        /* Writing date index to-STDOUT*/\n  \"Skriver trdindex till\",      /* Writing thread index to -STDOUT*/\n  \"Skriver mnesindex till\",     /* Writing subject index to-STDOUT*/\n  \"Skriver frfattarindex till\", /* Writing author index to-STDOUT*/\n  \"Senaste brevdatum\",             /* Last message date  -HTML*/\n  \"Arkiverat\",                      /* Archived on        -HTML*/\n  \"Kan inte chmod\",                 /* Can not chmod      -STDERR*/\n  \"Kunde inte skriva\",              /* Could not write    -STDERR*/\n  \"N&auml;sta brev\",                  /* Next message       -HTML*/\n  \"Tidigare brev\",                  /* Previous message   -HTML*/\n  \"Kanske ett svar till\",           /* Maybe in reply to  -HTML*/\n  \"Svar till\",                      /* In reply to        -HTML*/\n  \"N&auml;sta i tr&aring;den\",               /* Next in thread     -HTML*/\n  \"Kanske svar\",                    /* Maybe reply        -HTML*/\n  \"Trdsorterat\",                    /* By Thread          -HTML*/\n  \"mnessorterat\",                    /* By Subject         -HTML*/\n  \"Frfattarsorterat\",              /* By Author          -HTML*/\n  \"Kan inte skapa katalog\",       /* Can not create directory -STDERR*/\n  \"Skapar katalog\",               /* Creating directory -STDOUT*/\n  \"Konfigureringsvrden\",        /* Configuration Values -STDOUT*/\n  \"path\",                           /* path               -STDOUT*/\n  \"Fick slut p minne!\",         /* Ran out of memory!-STDERR*/\n  \"Det h&auml;r arkivet skapades av\", /* This archive was generated by-HTML*/\n  \"Delar\",                          /* Elements           -STDOUT*/\n  \"Inga delar\",                     /* No Elements        -STDOUT*/\n  \"Kan inte ppna brevarkivet\",  /* Cannot open mail archive */\n  \"Lser nytt huvud...\",          /* Reading new header...-STDOUT*/\n  \"Laddar mailbox\",                 /* Loading mailbox   -STDOUT   */\n  \"kodformatet st&ouml;ds inte, sparat som det &auml;r\", \n                           /* encoding is not supported, stored as-is -HTML*/\n  \"brev\",                           /* messages          -HTML*/\n  \"Version\",                        /* Version           -STDOUT*/\n  \"Patchniv\",                   /* Patchlevel        -STDOUT*/\n  \"Dokumentation\",                  /* Docs              -STDOUT*/\n  \"Kommando- och styrvariabler\", /* Command and Control Variables-STDOUT*/\n  \"Ja\",                             /* Yes               -STDOUT*/\n  \"Nej\",                            /* No                -STDOUT*/\n  \"Om arkivet: ej anvnd\",      /* About the archive: not used-STDOUT */\n  \"Andra arkiv: ej anvnd\",      /* Other archives: not used-STDOUT*/\n  \"adress ej anvnd\",            /* address not used  -STDOUT*/\n  \"Inbyggd <BODY> anvnd\",       /* Builtin <BODY> statement used-STDOUT*/\n  \"Kan inte lsa bde frn fil och stdin.\", \n                           /* Cannot read from both file and stdin. -STDERR*/\n  \"Alternativ\",                     /* Options           -STDOUT*/\n  \"URL till andra arkiv\",           /* URL to other archives  -STDOUT*/\n  \"URL till arkivinformation\",      /* URL to archive information -STDOUT*/\n  \"Konfigurationsfil att lsa in\",   /* Configuration file to read in -STDOUT*/\n  \"Katalog att spara HTML-filerna i\", \n                            /* The directory to save HTML files in -STDOUT*/\n  \"Ls breven fr&aring;n standard in\", /* Read messages from standard input-STDOUT*/\n  \"Namnet p utarkivet\",         /* What to name the output archive-STDOUT*/\n  \"Brevarkiv att lsa in\",       /* Mail archive to read in -STDOUT*/\n  \"Visa frlopp\",                  /* Show progress      -STDOUT*/\n  \"Visa konfigurationsvariabler enbart\",\n                                /* Show configuration variables only-STDOUT*/\n  \"Visa versionsinformation och sluta\", \n                                /* Show version information and exit -STDOUT*/\n  \"Updatera arkivet med ett brev\", /*Update archive by one article -STDOUT*/\n  \"Skriv ver tidigare brev\",    /* Overwrite previous messages -STDOUT*/\n  \"Ange sprk att anvnda\",   /* Specify language to use -STDOUT*/\n  \"Anvndning\",                  /* Usage                   -STDOUT*/\n  \"Sprket stds ej\",          /* Language not supported  -STDERR*/\n  \"Ej angivet\",                     /* Not set                 -STDOUT*/\n  \"Ej anvnt\",                   /* Not used                -STDOUT*/\n  \"Skapade bilagefil\",          /* Created attachment file -STDOUT*/\n  \"bilaga\",                      /* attachment              -HTML*/\n  \"lge\",                           /* mode                    -STDOUT*/\n  \"Lser gamla huvuden\",         /* Reading old headers     -STDOUT*/\n  \"endast fr justering\",        /* for alignment only   -STDOUT*/\n  \"FEL\",                            /* ERROR                   -STDERR*/\n  \"Adressen fr att posta till listan\", \n                           /* The submission address of the list-STDERR*/\n  \"Ls bara ett brev frn indata\",\n  \"F&ouml;rfattare\",                  /* author             -HTML*/\n  \"Datum\",                          /* date               -HTML*/\n  \"&Auml;mne\",                        /* subject            -HTML*/\n  \"E-postfunktioner\",                   /* Mail actions (MA) header -HTML*/\n  \"s&auml;nd ett nytt &auml;mne\",               /* MA New Message      -HTML*/\n  \"svara p&aring; brevet\",        /* MA Reply            -HTML*/\n  \"Sammanfattning &ouml;ver m&aring;natliga indexfiler\", /* monthly             -HTML*/\n  \"Sammanfattning &ouml;ver &aring;rliga indexfiler\",  /* yearly              -HTML*/\n  \"Bygger en GDBM-huvudcache\",   /* Build a GDBM header cache   -STDOUT*/\n  \"Tillval fr GDBM-huvudcache inte inkompilerat\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Skapar gdbm-index... \",     /* Creating gdbm index         -STDOUT*/\n  \"Kan inte skapa gdbm-fil... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Underhll ett mbox-arkiv\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Kan inte bde lsa frn och skriva till en mbox.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \"Bilagevy\",                      /* Attachment view  -HTML*/\n  \"Efter brev med bilaga\",\t  /* By messages with attachments -HTML*/\n  \"Skriver bilageindex till\",\t  /* Writing attachment index to -STDOUT*/\n  \"byte\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Kan inte skapa symbolisk lnk\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Kan inte ta bort fil\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"F&ouml;reg&aring;ende mapp\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"N&auml;sta mapp\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"Mapplista\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"Detta brev har tagits bort fr&aring;n arkivet\", /* MSG_DELETED -HTML */\n  \"Detta brev har utg&aring;tt\",                       /* MSG_EXPIRED -HTML */\n  \"(borttaget brev)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Ursprunglig brevtext\", /* MSG_TXT_VERSION                          -HTML */\n  \"Detta brev har filtrerats\",        /* MSG_FILTERED_OUT -HTML */\n  \"F&ouml;rfattare\",                     /* MSG_FROM             -HTML*/\n  \"Skriv haof-XML-filer\",       /* Write hoaf XML files       -STDOUT */\n  \"Skriver haof till\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Detta brev har tagits bort fr&aring;n arkivet\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                             /* End Of Message Table    - NOWHERE*/\n};\n\n/*\n** Norwegian version of the language table.\n** Translation by Bosse Klykken <bosse@klykken.com>\n*/\n\nchar *no[] = {\n  \"Ny melding\",                      /* New Message        -HTML*/\n  \"Svar\" ,                          /* Reply              -HTML*/\n  \"Om denne listen\",     /* About this list    -HTML*/\n  \"Slutt p brevlisten\",          /* End of Messages    -HTML*/\n  \"Start p brevlisten\",         /* Start of Messages  -HTML*/\n  \"Oversikt dato\",                        /* Date view          -HTML*/\n  \"Oversikt trd\",                      /* Thread view        -HTML*/\n  \"Oversikt emne\",                     /* Subject view       -HTML*/\n  \"Oversikt forfatter\",                 /* Author view        -HTML*/\n  \"Andre grupper\",                  /* Other groups       -HTML*/\n  \"Meldinger\",                           /* Messages           -HTML*/\n  \"Starter\",                        /* Starting           -HTML*/\n  \"Slutter\",                         /* Ending             -HTML*/\n  \"Om dette arkivet\", /* About this archive -HTML*/\n  \"sortert etter\",                 /* Messages sorted by -HTML*/\n  \"Andre meldingsarkiv\",                /* Other mail archives-HTML*/\n  \"Sortert etter dato\",                    /* By Date            -HTML*/\n  \"Nyeste melding\",                     /* Most recent messages-HTML*/\n  \"forfatter\",                  /* author             -HTML*/\n  \"dato\",                          /* date               -HTML*/\n  \"trd\",                        /* thread             -HTML*/\n  \"emne\",                        /* subject            -HTML*/\n  \"for innstillinger\",        /* for options        -STDOUT*/\n  \"Skriver meldinger til\",              /* Writing messages to-STDOUT*/\n  \"Skriver datoindeks til\",        /* Writing date index to-STDOUT*/\n  \"Skriver trdindeks til\",      /* Writing thread index to -STDOUT*/\n  \"Skriver emneindeks til\",     /* Writing subject index to-STDOUT*/\n  \"Skriver forfatterindeks til\", /* Writing author index to-STDOUT*/\n  \"Siste meldingsdato\",             /* Last message date  -HTML*/\n  \"Arkivert\",                      /* Archived on        -HTML*/\n  \"Kan ikke chmod\",                 /* Can not chmod      -STDERR*/\n  \"Kunne ikke skrive\",              /* Could not write    -STDERR*/\n  \"Neste melding\",                  /* Next message       -HTML*/\n  \"Forrige melding\",                  /* Previous message   -HTML*/\n  \"Muligens et svar til\",           /* Maybe in reply to  -HTML*/\n  \"Som svar til\",                      /* In reply to        -HTML*/\n  \"Neste i trden\",               /* Next in thread     -HTML*/\n  \"Kanskje svar\",                    /* Maybe reply        -HTML*/\n  \"Sortert etter trd\",                    /* By Thread          -HTML*/\n  \"Sortert etter emne\",                    /* By Subject         -HTML*/\n  \"Sortert etter forfatter\",              /* By Author          -HTML*/\n  \"Kan ikke opprette katalog\",       /* Can not create directory -STDERR*/\n  \"Oppretter katalog\",               /* Creating directory -STDOUT*/\n  \"Konfigureringsverdier\",        /* Configuration Values -STDOUT*/\n  \"bane\",                           /* path               -STDOUT*/\n  \"Gikk tom for minne!\",         /* Ran out of memory!-STDERR*/\n  \"Dette arkivet er generert av\", /* This archive was generated by-HTML*/\n  \"Elementer\",                          /* Elements           -STDOUT*/\n  \"Ingen elementer\",                     /* No Elements        -STDOUT*/\n  \"Kan ikke pne meldingsarkivet\",  /* Cannot open mail archive */\n  \"Leser nytt meldingshode...\",          /* Reading new header...-STDOUT*/\n  \"Leser mailboks\",                 /* Loading mailbox   -STDOUT   */\n  \"kodeformatet er usupportet, lagret som den er\",\n                           /* encoding is not supported, stored as-is -HTML*/\n  \"meldinger\",                           /* messages          -HTML*/\n  \"Versjon\",                        /* Version           -STDOUT*/\n  \"Patchniv\",                   /* Patchlevel        -STDOUT*/\n  \"Dokumentasjon\",                  /* Docs              -STDOUT*/\n  \"Kommando- og kontrollvariabler\", /* Command and Control Variables-STDOUT*/\n  \"Ja\",                             /* Yes               -STDOUT*/\n  \"Nei\",                            /* No                -STDOUT*/\n  \"Om arkivet: ikke i bruk\",      /* About the archive: not used-STDOUT */\n  \"Andre arkiv: ikke i bruk\",      /* Other archives: not used-STDOUT*/\n  \"adresse ikke benyttet\",            /* address not used  -STDOUT*/\n  \"Innebygget <BODY> benyttet\",       /* Builtin <BODY> statement used-STDOUT*/\n  \"Kan ikke lese bde fra fil og stdin.\",\n                           /* Cannot read from both file and stdin. -STDERR*/\n  \"Alternativer\",                     /* Options           -STDOUT*/\n  \"URL til andre arkiv\",           /* URL to other archives  -STDOUT*/\n  \"URL til arkivinformasjon\",      /* URL to archive information -STDOUT*/\n  \"Konfigurasjonsfil til  lese inn\",   /* Configuration file to read in -STDOUT*/\n  \"Katalog til  spare HTML-filene i\",\n                            /* The directory to save HTML files in -STDOUT*/\n  \"Les brevene fra stdin\", /* Read messages from standard input-STDOUT*/\n  \"Navn p utarkivet\",         /* What to name the output archive-STDOUT*/\n  \"Meldingsarkiv som skal leses inn\",       /* Mail archive to read in -STDOUT*/\n  \"Vise fremdrift\",                  /* Show progress      -STDOUT*/\n  \"Vise kun konfigurasjonsvariablene\",\n                                /* Show configuration variables only-STDOUT*/\n  \"Vise versjonsinformasjon og avslutte\",\n                                /* Show version information and exit -STDOUT*/\n  \"Oppdatere arkivet med n melding\", /*Update archive by one article -STDOUT*/\n  \"Skriv over andre meldinger\",    /* Overwrite previous messages -STDOUT*/\n  \"Angi sprk som skal benyttes\",   /* Specify language to use -STDOUT*/\n  \"Bruk\",                  /* Usage                   -STDOUT*/\n  \"Sprket er ikke stttet\",          /* Language not supported  -STDERR*/\n  \"Ikke angitt\",                     /* Not set                 -STDOUT*/\n  \"Ikke benyttet\",                   /* Not used                -STDOUT*/\n  \"Lagde vedleggfil\",          /* Created attachment file -STDOUT*/\n  \"vedlegg\",                      /* attachment              -HTML*/\n  \"modus\",                           /* mode                    -STDOUT*/\n  \"Leser gamle meldingshoder\",         /* Reading old headers     -STDOUT*/\n  \"\",                               /* for alignment only   -STDOUT*/\n  \"FEIL\",                            /* ERROR                   -STDERR*/\n  \"Adressen som brukes for innlegg til listen\", \n                           /* The submission address of the list-STDERR*/\n  \"Les bare en melding fra inn\",\n  \"Forfatter\",                  /* author             -HTML*/\n  \"Dato\",                          /* date               -HTML*/\n  \"Emne\",                        /* subject            -HTML*/\n  \"E-postfunksjoner\",                   /* Mail actions (MA) header -HTML*/\n  \"Lag ny trd\",               /* MA New Message      -HTML*/\n  \"besvare meldingen\",        /* MA Reply            -HTML*/\n  \"Sammenfatning over mnedlige indeksfiler\", /* monthly             -HTML*/\n  \"Sammenfatning over rlige indeksfiler\",  /* yearly              -HTML*/\n  \"Bygger en GDBM-headercache\",   /* Build a GDBM header cache   -STDOUT*/\n  \"GDBM header cache opsjon ikke innebygget\",\n  \t\t      /* GDBM header cache option not build in  -STDERR*/\n  \"Lager gdbm-index... \",     /* Creating gdbm index         -STDOUT*/\n  \"Kan ikke lage gdbm-fil... \",  /* Can't create gdbm index     -STDOUT*/\n  \"Opprettholde et mbox-arkiv\",    /* Maintain an mbox archive    -STDOUT*/\n  \"Kan ikke bde lese fra og skrive til en mbox.\", /* \"Can't both read from and write to an mbox.\"-STDOUT*/\n  \"Oversikt vedlegg\",                      /* Attachment view  -HTML*/\n  \"Etter meldinger med vedlegg\",\t  /* By messages with attachments -HTML*/\n  \"Skriver vedleggsindeks til\",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    /* file size, so far only for attachments  -HTML */\n  \"Kan ikke lage symbolisk link\", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"Kan ikke fjerne link til fil\", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \"Forrige mappe\",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \"Neste mappe\",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \"Mappeliste\",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"Denne meldingen er fjernet fra arkivet\", /* MSG_DELETED -HTML */\n  \"Dette meldingen har utgtt\",                       /* MSG_EXPIRED -HTML */\n  \"(slettet melding)\", /* MSG_DEL_SHORT                            -HTML */\n  \"Opprinnelig brevtekst\", /* MSG_TXT_VERSION                          -HTML */\n  \"Denne meldingen har blitt filtrert bort\",        /* MSG_FILTERED_OUT -HTML */\n  \"Forfatter\",                     /* MSG_FROM             -HTML*/\n  \"Skrive haof XML filer\",       /* Write hoaf XML files       -STDOUT */\n  \"Skriver haof til\",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"Denne meldingen er fjernet fra arkivet\", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                             /* End Of Message Table    - NOWHERE*/\n};\n\n/*\n** Greek version of the language table\n** Translation by Akis Karnouskos <akis@ceid.upatras.gr> \n**       STDOUT/STDERROR\n**    ...\n**         \n**       update !\n*/\n\nchar *gr[] = {       /* Greek */\n  \" \",              \t\t/* New Message        -HTML*/\n  \"\",                   \t/* Reply              -HTML*/\n  \"    \",         \t/* About this list    -HTML*/\n  \" \",                   \t/* End of Messages    -HTML*/\n  \" \",                 \t/* Start of Messages  -HTML*/\n  \"  \",            \t/* Date view          -HTML*/\n  \"  thread\",                \t/* Thread view        -HTML*/\n  \"  \",                \t/* Subject view       -HTML*/\n  \"  \",          \t/* Author view        -HTML*/\n  \" \",                \t/* Attachment view    -HTML*/\n  \"\",                          \t/* Messages           -HTML*/\n  \"\",                               /* Starting           -HTML*/\n  \"\",                            \t/* Ending             -HTML*/\n  \"    \",       \t/* About this archive -HTML*/\n  \" \",            \t/* sorted by \t      -HTML*/\n  \"A Mail \",                 \t/* Other mail archives -HTML*/\n  \" \",                 \t/* By Date             -HTML*/\n  \"   \",        \t/* Most recent messages-HTML*/\n  \"\",                        \t/* author              -HTML*/\n  \"\",          \t\t/* date                -HTML*/\n  \"thread\",                       \t/* thread              -HTML*/\n  \"\",                              \t/* subject             -HTML*/\n  \" \",                      \t/* for options       -STDOUT*/\n  \"   \",              /* Writing messages to-STDOUT*/\n  \"    \",    \t/* Writing date index to-STDOUT*/\n  \"    thread\",    \t/* Writing thread index to -STDOUT*/\n  \"    \",     \t/* Writing subject index to-STDOUT*/\n  \"    \",  \t/* Writing author index to-STDOUT*/\n  \" \",              \t/* Last message date   -HTML*/\n  \"\",                   \t/* Archived on         -HTML*/\n  \"    chmod\",      \t/* Can not chmod     -STDERR*/\n  \"   \",           \t/* Could not write   -STDERR*/\n  \" \",                 \t/* Next message        -HTML*/\n  \" \",                  /* Previous message    -HTML*/\n  \"   \",           \t/* Maybe in reply to   -HTML*/\n  \"  \",               \t/* In reply to         -HTML*/\n  \"  thread\",                 /* Next in thread      -HTML*/\n  \" \",                   \t/* Maybe reply         -HTML*/\n  \" Thread\",                     \t/* By Thread           -HTML*/\n  \" \",                         \t/* By Subject          -HTML*/\n  \" \",                     \t/* By Author           -HTML*/\n  \"     directory\", /* Can not create directory -STDERR*/\n  \"  directory\",          \t/* Creating directory -STDOUT*/\n  \"configuration\",                 \t/* Configuration Values -STDOUT*/\n  \"path\",                            \t/* path              -STDOUT*/\n  \"    \", \t/* Ran out of memory!-STDERR*/\n  \"    \",  \t/* This archive was generated by-HTML*/\n  \"\",                        \t/* Elements          -STDOUT*/\n  \" \",                \t/* No Elements       -STDOUT*/\n  \"        \",     /* Cannot open mail archive */\n  \"   headers\",    \t/* Reading new header...-STDOUT*/\n  \"  mailbox\",               \t/* Loading mailbox      -STDOUT*/\n  \"   ,   \", \n                        \t\t/* encoding is not supported, stored as-is -HTML*/\n  \"\",                          \t/* messages             -HTML*/\n  \"\",                        \t/* Version            -STDOUT*/\n  \"Patchlevel\",               \t\t/* Patchlevel         -STDOUT*/\n  \"\",                          \t/* Docs               -STDOUT*/\n  \"   \", \t/* Command and Control Variables-STDOUT*/\n  \"\",                            \t/* Yes                -STDOUT*/\n  \"\",                         \t/* No                 -STDOUT*/\n  \"   :  \",    /* About the archive: not used-STDOUT */\n  \"A :  \", \t/* Other archives: not used-STDOUT*/\n  \":  \", \t/* address not used        -STDOUT*/\n  \"   <BODY> \",   \t/* Builtin <BODY> statement used-STDOUT*/\n  \"         stdin.\", /* Cannot read from both file and stdin. -STDERR*/\n  \"\",                      \t/* Options                -STDOUT*/\n  \"URL   \",           \t/* URL to other archives  -STDOUT*/\n  \"URL      \",  \n                                      \t/* URL to archive information -STDOUT*/\n  \"     \", \n                                    \t/* Configuration file to read in -STDOUT*/\n  \" directory     HTML  \", \n                              \t\t/* The directory to save HTML files in -STDOUT*/\n  \"      \",\n                                \t/* Read messages from standard input -STDOUT*/\n  \"     \",   \n                                  \t/* What to name the output archive -STDOUT*/\n  \"  Mail-   \",            /* Mail archive to read in -STDOUT*/\n  \"  \",                \t/* Show progress           -STDOUT*/\n  \"   \", \t/* Show configuration variables only -STDOUT*/\n  \"      \",             /* Show version information and exit -STDOUT*/\n  \"     \",  \t/* Update archive by one article -STDOUT*/\n  \"     \", /* Overwrite previous messages -STDOUT*/\n  \"     \",                      /* Specify language to use -STDOUT*/\n  \"\",                           \t/* Usage -STDOUT*/\n  \"   \",\t\t/* Language not supported  -STDERR*/\n  \" \",                        \t/* Not set               -STDOUT*/\n  \" \",             \t/* Not used              -STDOUT*/\n  \"  \",           /* Created attachment file -STDOUT*/\n  \"\",                   \t/* attachment           -HTML*/\n  \"\",                        \t/* mode                 -STDOUT*/\n  \"   headers\",          \t/* Reading old headers  -STDOUT*/\n  \"\",       \t\t\t\t/* for alignment only -STDOUT*/\n  \"\",                       \t/* ERROR                       -STDERR*/\n  \"      emails\", \n                           \t\t/* The submission address of the list-STDERR*/\n  \"   email   \", /* Read only one mail from input */\n  \"\",                        \t/* author              -HTML*/\n  \"\",                      \t/* date                -HTML*/\n  \"\",                              \t/* subject             -HTML*/\n  \"Mail \",                  \t/* Mail actions (MA) header -HTML*/\n  \"    \",    \t/* MA New Message      -HTML*/\n  \"    \",      \t/* MA Reply            -HTML*/\n  \"   \",  \t/* monthly             -HTML*/\n  \"   \",  \t/* yearly              -HTML*/\n  \"Build a GDBM header cache\",   \t/* Build a GDBM header cache   -STDOUT*/\n  \"  gdbm ... \",   \t/* Creating gdbm index         -STDOUT*/\n  \"     gdbm ... \",  /* Can't create gdbm index     -STDOUT*/\n  \"  mbox \",    \t/* Maintain an mbox archive    -STDOUT*/\n  \"         mbox \", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \" \",             \t/* Attachment view       -HTML*/\n  \"   \",\t/* By messages with attachments -HTML*/\n  \"    \",\t  /* Writing attachment index to -STDOUT*/\n  \"bytes\",\t\t    \t\t/* file size, so far only for attachments  -HTML */\n  \"      \", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"     \", \t/* MSG_CANNOT_UNLINK                       -STDOUT */\n  \" \",  \t\t/* MSG_PREV_DIRECTORY                     -HTML */\n  \" \",      \t\t/* MSG_NEXT_DIRECTORY                     -HTML */\n  \" \",  \t\t\t/* MSG_FOLDERS_INDEX                      -HTML */\n  \"       \", /* MSG_DELETED -HTML */\n  \"    \",      \t/* MSG_EXPIRED -HTML */\n  \"( )\", \t\t\t/* MSG_DEL_SHORT                            -HTML */\n  \"   \", \t/* MSG_TXT_VERSION                          -HTML */\n  \"     \",  /* MSG_FILTERED_OUT -HTML */\n  \"\",       \t\t\t/* MSG_FROM              -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"       \", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                           \t/* End Of Message Table - NOWHERE*/\n};\n\n/*\n** Russian version of the language table. \n** Translated by Igor Solovyoff (siv@intear.com.ua).\n*/\n\nchar *ru[] = {     /* Russian */\n  \" \",             /* New Message        -HTML*/\n  \"\",                       /* Reply              -HTML*/\n  \" \",                    /* About this list    -HTML*/\n  \" \",             /* End of Messages    -HTML*/\n  \" \",            /* Start of Messages  -HTML*/\n  \" \",                     /* Date view          -HTML*/\n  \" \",                    /* Thread view        -HTML*/\n  \" \",                    /* Subject view       -HTML*/\n  \" \",                  /* Author view        -HTML*/\n  \" \",               /* Other groups       -HTML*/\n  \"\",                   /* Messages           -HTML*/\n  \"\",                      /* Starting           -HTML*/\n  \"\",                       /* Ending             -HTML*/\n  \"  \",              /* About this archive -HTML*/\n  \" \",            /* Messages sorted by -HTML*/\n  \"  \",      /* Other mail archives -HTML*/\n  \" \",                     /* By Date             -HTML*/\n  \"  \",   /* Most recent messages-HTML*/\n  \"\",                       /* author              -HTML*/\n  \"\",                        /* date                -HTML*/\n  \"\",                        /* thread              -HTML*/\n  \"\",                        /* subject             -HTML*/\n  \" \",                   /* for options       -STDOUT*/\n  \"  \",           /* Writing messages to-STDOUT*/\n  \" date index \",          /* Writing date index to-STDOUT*/\n  \" thread index \",        /* Writing thread index to -STDOUT*/\n  \" subject index \",       /* Writing subject index to-STDOUT*/\n  \" author index \",        /* Writing author index to-STDOUT*/\n  \"  \",   /* Last message date   -HTML*/\n  \" \",             /* Archived on         -HTML*/\n  \"  chmod\",               /* Can not chmod     -STDERR*/\n  \"  \",              /* Could not write   -STDERR*/\n  \" \",         /* Next message        -HTML*/\n  \" \",        /* Previous message    -HTML*/\n  \"   \",        /* Maybe in reply to   -HTML*/\n  \"  \",                 /* In reply to         -HTML*/\n  \"  \",            /* Next in thread      -HTML*/\n  \" \",              /* Maybe reply         -HTML*/\n  \" \",                    /* By Thread           -HTML*/\n  \" \",                    /* By Subject          -HTML*/\n  \" \",                  /* By Author           -HTML*/\n  \"   \",  /* Can not create directory -STDERR*/\n  \" \",           /* Creating directory -STDOUT*/\n  \" \",      /* Configuration Values -STDOUT*/\n  \"\",                        /* path              -STDOUT*/\n  \"  !\",          /* Ran out of memory!-STDERR*/\n  \"   \", /* This archive was generated by-HTML*/\n  \"\",                   /* Elements          -STDOUT*/\n  \" \",               /* No Elements       -STDOUT*/\n  \"    \", /* Cannot open mail archive */\n  \"  ...\",    /* Reading new header...-STDOUT   */\n  \" mailbox\",            /* Loading mailbox      -STDOUT   */\n  \"  ,   \", /* encoding is not supported, stored as-is -HTML*/\n  \".\",                      /* messages             -HTML*/\n  \"\",                      /* Version            -STDOUT*/\n  \"Patchlevel\",                  /* Patchlevel         -STDOUT*/\n  \"\",                  /* Docs               -STDOUT*/\n  \"   \",       /* Command and Control Variables-STDOUT*/\n  \"\",                          /* Yes                -STDOUT*/\n  \"\",                         /* No                 -STDOUT*/\n  \" :  \", /* About the archive: not used-STDOUT */\n  \" :  \",    /* Other archives: not used-STDOUT*/\n  \"  \",            /* address not used        -STDOUT*/\n  \"   <BODY>\", /* Builtin <BODY> statement used-STDOUT*/\n  \"      and stdin.\", /* Cannot read from both file and stdin. -STDERR*/\n  \"\",                     /* Options                -STDOUT*/\n  \"URL   \",       /* URL to other archives  -STDOUT*/\n  \"URL   \",  /* URL to archive information -STDOUT*/\n  \"    \", /* Configuration file to read in -STDOUT*/\n  \"   HTML  \", /* The directory to save HTML files in -STDOUT*/\n  \"    \",/* Read messages from standard input -STDOUT*/\n  \"   \", /* What to name the output archive -STDOUT*/\n  \"    \",     /* Mail archive to read in -STDOUT*/\n  \" \",               /* Show progress           -STDOUT*/\n  \"   \", /* Show configuration variables only -STDOUT*/\n  \"   \", /* Show version information and exit -STDOUT*/\n  \"    \", /* Update archive by one article -STDOUT*/\n  \"  \", /* Overwrite previous messages -STDOUT*/\n  \"  \",     /* Specify language to use     -STDOUT*/\n  \"\",                       /* Usage                       -STDOUT*/\n  \"  \",      /* Language not supported      -STDERR*/\n  \" \",                     /* Not set                     -STDOUT*/\n  \" \",                    /* Not used                    -STDOUT*/\n  \" -\",     /* Created attachment file     -STDOUT*/\n  \"\",                  /* attachment                    -HTML*/\n  \"\",                        /* mode                        -STDOUT*/\n  \"  \",         /* Reading old headers         -STDOUT*/\n  \"\", /* for alignment only       -STDOUT*/\n  \"\",                       /* ERROR                       -STDERR*/\n  \"   \", /* The submission address of the list-STDERR*/\n  \"     \",\n  \"\",                      /* author              -HTML*/\n  \"\",                        /* date                -HTML*/\n  \"\",                     /* subject             -HTML*/\n  \"  \",                /* Mail actions (MA) header -HTML*/\n  \"  \",            /* MA New Message      -HTML*/\n  \"   \",     /* MA Reply            -HTML*/\n  \"    \",       /* monthly             -HTML*/\n  \"    \",        /* yearly              -HTML*/\n  \" GDBM  \",   /* Build a GDBM header cache   -STDOUT*/\n  \" GDBM header cache  \",/* GDBM header cache option not build in  -STDERR*/\n  \" gdbm ... \",     /* Creating gdbm index         -STDOUT*/\n  \"   gdbm ... \",  /* Can't create gdbm index     -STDOUT*/\n  \" mbox \",    /* Maintain an mbox archive    -STDOUT*/\n  \"        mbox-.\", /* \"Can't both read from and write to an mbox.\" -STDOUT*/\n  \" \",   /* Attachment view       -HTML*/\n  \"   \",   /* By messages with attachments -HTML*/\n  \"    \",   /* Writing attachment index to -STDOUT*/\n  \"\",     /* file size, so far only for attachments  -HTML */\n  \"    \", /* MSG_CANNOT_CREATE_SYMLINK     -STDOUT */\n  \"   \", /* MSG_CANNOT_UNLINK                       -STDOUT */\n  \" \",  /* MSG_PREV_DIRECTORY                     -HTML */\n  \" \",      /* MSG_NEXT_DIRECTORY                     -HTML */\n  \" \",  /* MSG_FOLDERS_INDEX                      -HTML */\n  \"     \", /* MSG_DELETED -HTML */\n  \"  \",                       /* MSG_EXPIRED -HTML */\n  \"( )\", /* MSG_DEL_SHORT                            -HTML */\n  \"   \", /* MSG_TXT_VERSION                          -HTML */\n  \"   \",        /* MSG_FILTERED_OUT -HTML */\n  \"\",                        /* MSG_FROM                      -HTML*/\n  \" haof XML \",       /* Write hoaf XML files       -STDOUT */\n  \" haof \",            /* Writing haof to               -HTML*/\n  \"This message\",                 /* This message -HTML */\n  \"Message body\",                 /* Message body -HTML */\n  \"Respond\",                      /* Respond -HTML */\n  \"More options\",                 /* More options -HTML */\n  \"Related messages\",             /* Related messages -HTML */\n  \"Next\",                         /* Next -HTML */\n  \"Previous\",                     /* Previous -HTML */\n  \"Replies\",                      /* Replies -HTML */\n  \"Contemporary messages sorted\", /* Contemporary messages sorted -HTML */\n  \"Help\",                         /* Help  -HTML */\n  \"Message to which this message replies\", /* In Reply To - HTML link*/\n  \"Next message in this discussion thread\", /* Next message in thread - HTML link*/\n  \"Message sent in reply to this message\", /* Replies to this message - HTML link*/\n  \"Contemporary messages by date\", /* Contemporary messages by date */\n  \"Contemporary discussion threads\", /* Contemporary messages by threads -  HTML */\n  \"Contemporary messages by subject\", /* Contemporary messages by subject - HTML */\n  \"Contemporary messages by author\", /* Contemporary messages by author - HTML*/\n  \"Next message in the list\", /* Next message - HTML */\n  \"Previous message in the list\", /* Previous message - HTML */\n  \"Contemporary messages by attachment\", /* Contemporary messages by attachments - HTML*/\n  \"Navigation bar to upper levels\", /* Navigation bar, upper levels - HTML*/\n  \"Navigation bar\", /* Navigation bar - HTML*/\n  \"sort by\", /* Sort by - HTML*/\n  \"Other periods\", /* Other periods - HTML */\n  \"Next\", /* Next folder - HTML */\n  \"Messages archived in the next period, sorted by date\", /* Next folder, by date - HTML link */\n  \"Previous\", /* Previous folder - HTML */\n  \"Messages archived in the previous period, sorted by date\", /* Previous folder, by date - HTML Link */\n  \"List of all periods\", /* List of all periods - HTML*/\n  \"This period\", /* This period - HTML*/\n  \"Received on\", /* Received on - HTML */\n  \"Nearby\", /* Nearby - HTML */\n  \"re-sorted\", /* Resorted - HTML */\n  \"listed by date\", /* listed by date - HTML */\n  \"by discussion threads\" , /* discussion threads - HTML */\n  \"listed by author\", /* listed by author - HTML */\n  \"by subject\", /* listed by subject - HTML */\n  \"by attachment\", /* by attachment - HTML */\n  \"period\", /* period - HTML */\n  \" to \", /* to - HTML */\n  \"from\", /* from - HTML */\n  \"on\", /* on - HTML */\n  \"message archived in another list or period\", /* unknown in reply to - HTML */\n  \"     \", /* MSG_DELETED_OTHER -HTML */\n  \"Note: this message has been edited and differs from the originally archived copy.\", /* MSG_EDITED -HTML */\n  \"deleted\", /* MSG_SENDER_DELETED -HTML */\n  \"deleted\", /* MSG_SUBJECT_DELETED -HTML */\n  NULL,                          /* End Of Message Table      - NOWHERE*/\n};\n\n\n/*\n** list of supported languages\n*/\n\nstruct language_entry ltable[] = {\n{    \"de\",      de,    \"de_DE\"   },     /* German  */\n{    \"en\",      en,    \"en_US\"   },     /* English */\n{    \"es\",      es,    \"es_ES\"   },     /* Spanish */\n{    \"fi\",      fi,    \"fi_FI\"   },     /* Finnish */\n{    \"fr\",      fr,    \"fr_FR\"   },     /* French  */\n{    \"is\",      is,    \"is_IS\"   },     /* Icelandic */\n{    \"pl\",      pl,    \"pl_PL\"   },     /* Polish  */\n{    \"pt\",      pt,    \"pt_BR\"   },     /* Brazilian Portuguese */\n{    \"sv\",      sv,    \"sv_SE\"   },     /* Swedish */\n{    \"no\",      no,    \"no_NO\"   },     /* Norwegian */\n{    \"el\",      gr,    \"el\"   \t },     /* Greek */\n{    \"gr\",      gr,    \"el_GR\"   },     /* Greek */\n{    \"ru\",      ru,    \"ru_RU\"   },     /* Russian */\n{    \"it\",      it,    \"it_IT\"   },     /* Italian */\n{     NULL,     NULL,  NULL\t },     /* EOL    */\n};\n\n/*\n** Default language table\n*/\nchar **lang = en;\n\n#else\n\nextern char **lang;\nextern struct language_entry ltable[];\n\n#endif\n"
  },
  {
    "path": "src/lock.c",
    "content": "#include \"hypermail.h\"\n#include \"setup.h\"\n\n#define LOCKBASE       \".hypermail.lock\"\n\nint i_locked_it = 0;\n\nvoid lock_archive(char *dir)\n{\n    FILE *fp;\n    char buffer[MAXLINE];\n\n    int count = 0;\t\t/* # minutes waited */\n    i_locked_it = 0;\t\t/* guilty until proven innocent */\n\n    snprintf(lockfile, sizeof(lockfile), \"%s/%s\", dir, LOCKBASE);\n\n    while ((fp = fopen(lockfile, \"r\")) != NULL) {\n\tfgets(buffer, MAXLINE-1, fp);\n\tfclose(fp);\n\t/*  \n         * \"set_locktime\" is the config file item named 'locktime', \n         * default is 3600 seconds \n         */\n\tif (time(NULL) > (time_t)(atol(buffer) + set_locktime))\n\t    break;\t\t/* lock over hour old - break it */\n\n\t++count;\n\tif (set_showprogress)\n\t    fprintf(stderr, \"Waiting for lock (file '%s')\\n\", lockfile);\n\tsleep(30);\n    }\n    if ((fp = fopen(lockfile, \"w\")) != NULL) {\n\ti_locked_it = 1;\n\tfprintf(fp, \"%ld\\n\", (long)time(NULL));\n\tfclose(fp);\n    }\n    else if (dir[0]) {\n\tsnprintf(errmsg, sizeof(errmsg), \"Couldn't create lock file \\\"%s\\\".\", lockfile);\n\tprogerr(errmsg);\n    }\n}\n\nvoid unlock_archive(void)\n{\n    if (lockfile && i_locked_it)\n\tremove(lockfile);\n    lockfile[0] = '\\0';\n}\n"
  },
  {
    "path": "src/mail.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Jay Weber, weber@eit.com\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n#include \"../libcgi/cgi.h\"\n#include \"../config.h\"\n\nvoid cgi_main(cgi_info *ci)\n{\n    /* This program has been disabled because it\n     * was probably easy for spammers to use as an open relay. It also\n     * had problems with enabling malicious use of JavaScript and\n     * CRLF Injection.\n     */\n    printf(\"<html>\\n\");\n    printf(\"<body bgcolor=\\\"#ffffff\\\" text=\\\"#000000\\\">\\n\");\n    printf(\"This page has been disabled due to potential abuse by spammers.\\n\");\n    printf(\"</body>\\n</html>\\n\");\n}\n"
  },
  {
    "path": "src/mem.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include \"hypermail.h\"\n\n/* Just a tiny malloc() error checker! */\n\nvoid *emalloc(int i)\n{\n    void *p;\n\n    if ((p = (void *)malloc(i)) == NULL)\n\tprogerr(lang[MSG_RAN_OUT_OF_MEMORY]);\n    return p;\n}\n\n#ifndef HAVE_MEMSET\n\nvoid *memset(void *s, int c, size_t n)\n{\n    if (n != 0) {\n\tregister char *d = s;\n\n\tdo\n\t    *d++ = c;\n\twhile (--n != 0);\n    }\n    return (s);\n}\n\n#endif\n"
  },
  {
    "path": "src/parse.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"uudecode.h\"\n#include \"base64.h\"\n#include \"search.h\"\n#include \"getname.h\"\n#include \"parse.h\"\n#include \"print.h\"\n\n#ifdef GDBM\n#include \"gdbm.h\"\n#endif\n\n#ifdef HAVE_FCNTL_H\n#include <fcntl.h>\n#endif\n\n#ifdef HAVE_DIRENT_H\n#ifdef __LCC__\n#include \"../lcc/dirent.h\"\n#include <direct.h>\n#else\n#include <dirent.h>\n#endif\n#else\n#include <sys/dir.h>\n#endif\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n/*\n** LCC doesn't have lstat() defined in sys/stat.h.  We'll define it\n** in lcc_extras.h, but really it just calls stat().\n*/\n#ifdef __LCC__\n#include <sys/stat.h>\n#include \"../lcc/lcc_extras.h\"\n#endif\n\nextern char *mktemp(char *);\n\ntypedef enum {\n    ENCODE_NORMAL,\n    ENCODE_QP,\t\t\t/* quoted printable */\n\n    ENCODE_MULTILINED,\t\t/* this is not a real type, but just a separator showing\n\t\t\t\t   that the types below are encoded in a way that makes\n\t\t\t\t   one line in the indata may become one or more lines\n\t\t\t\t   in the outdata */\n\n    ENCODE_BASE64,\t\t/* base64 */\n    ENCODE_UUENCODE,\t\t/* well, it seems there exist some kind of semi-standard\n\t\t\t\t   for uu-encoded attachments. */\n\n    ENCODE_UNKNOWN\t\t/* must be the last one */\n} EncodeType;\n\ntypedef enum {\n    CONTENT_TEXT,\t\t/* normal mails are text based default */\n    CONTENT_BINARY,\t\t/* this kind we store separately and href to */\n    CONTENT_HTML,\t\t/* this is html formated text */\n    CONTENT_IGNORE,\t\t/* don't care about this content */\n\n    CONTENT_UNKNOWN\t\t/* must be the last one */\n} ContentType;\n\nstatic int hasblack(char *p)\n{\n   while(p && *p && isspace(*p++));\n   return (*p ? TRUE : FALSE);\n}\n\nint ignorecontent(char *type)\n{\n    if (inlist(set_ignore_types, \"$NONPLAIN\") && !textcontent(type)\n\t&& strncasecmp(type, \"multipart/\", 10))\n      return 1;\n    if (inlist(set_ignore_types, \"$BINARY\") && !textcontent(type)\n\t&& strcasecmp(type, \"text/html\") && strncasecmp(type, \"multipart/\", 10))\n      return 1;\n    return (inlist(set_ignore_types, type));\n}\n\nint inlinecontent(char *type)\n{\n    return (inlist(set_inline_types, type));\n}\n\nint preferedcontent(int *current_weight, char *type, int decode)\n{\n    int weight = -1;\n    int status;\n\n    status = 0;\n\n    if (set_save_alts == 1)\n\treturn 1;\n\n    /* We let plain text remain PREFERED at all times */\n    if (!strcasecmp(\"text/plain\", type)) {\n\tif (*current_weight != 0) {\n\t    /* to avoid having two text/plain alternatives */\n\t    *current_weight = 0;\n\t    status = 1;\n\t}\n    }\n    /* find the weight of the type arg. If the weight is\n       inferior to the current_weight, we make it the\n       prefered content */\n    else {\n\tif (set_prefered_types)\n\t    weight = inlist_pos(set_prefered_types, type);\n\tif (weight == -1) {\t/* not known to be good, use weaker evidence */\n\t    if (!strncasecmp(\"text/\", type, 5))\n\t        weight = 1000;\n\t    else weight = 2000 + decode;\n\t}\n\tif (weight != -1) {\n\t    /* +1 so that weight 0 is reserved for text/plain */\n\t    weight++;\n\t    if (*current_weight == -1) {\n\t\t*current_weight = weight;\n\t\tstatus = 1;\n\t    }\n\t    else if (*current_weight > weight) {\n\t\t*current_weight = weight;\n\t\tstatus = 1;\n\t    }\n \t}\n    }\n\n    return status;\n}\n\nint textcontent(char *type)\n{\n    /* We let text/plain remain text at all times.  Appearantly, older mailers\n     * can still use just \"text\" as content-type, and we better treat that as\n     * text/plain to make all those users happy.  */\n    if (!strcasecmp(\"text/plain\", type) || !strcasecmp(\"text\", type))\n\treturn 1;\n\n    if (set_text_types) {\n\treturn (inlist(set_text_types, type));\n    }\n\n    return 0;\n}\n\nstatic int is_applemail_ua(char *ua_string)\n{\n    /* returns TRUE if the ua_string is one of the declared applemail\n     * clients */\n\n    int res = FALSE;\n\n    if (ua_string && *ua_string != '\\0') {\n        char *buff;\n        char *ptr;\n\n        buff = strsav(ua_string);\n        ptr = strcasestr(buff, \" Mail (\");\n        if (ptr) {\n            *ptr = '\\0';\n            res = inlist(set_applemail_ua_value, buff);\n        }\n        free(buff);\n    }\n\n    return res;\n}\n\n/*\n * Should return TRUE if the input is a Re: start. The end pointer should\n * then point on the first character after the Re:\n *\n * Identifies \"Re:\", \"Fw:\" as well as \"Re[<number>]:\" strings.\n */\n\nint isre(char *re, char **end)\n{\n    char *endp = NULL;\n    if (!strncasecmp(\"Re:\", re, 3)) {\n\tendp = re + 3;\n    }\n    else if (!strncasecmp(\"Fw:\", re, 3)) {\n\tendp = re + 3;\n    }\n    else if (!strncasecmp(\"Re[\", re, 3)) {\n\tlong level;\n\tre += 3;\n\tlevel = strtol(re, &re, 10);\t/* eat the number */\n\tif (!strncmp(\"]:\", re, 2)) {\n\t    /* we have an end \"]:\" and therefore it qualifies as a Re */\n\t    endp = re + 2;\n\t}\n    }\n    if (endp) {\n\tif (end)\n\t    *end = endp;\n\treturn TRUE;\n    }\n    return FALSE;\n}\n\n/*\n * Find the first re-substring in the input and return the position\n * where it is. The 'end' parameter will be filled in the first position\n * *after* the re.\n */\n\nchar *findre(char *in, char **end)\n{\n    while (*in) {\n\tif (isre(in, end))\n\t    return in;\n\tin++;\n    }\n    return NULL;\n}\n\n\nvoid print_progress(int num, char *msg, char *filename)\n{\n    char bufstr[256];\n    register int i;\n    static int lastlen = 0;\n    static int longest = 0;\n    int len = 0;\n    int newline = 0;\n\n    newline = 0;\n\n    if (msg != NULL) {\n\tif (filename != NULL) {\n\t    trio_snprintf(bufstr, sizeof(bufstr), \"%4d %-s %-s\", num, msg, filename);\n\t    if (set_showprogress > 1)\n\t\tnewline = 1;\n\t}\n\telse {\n\t    trio_snprintf(bufstr, sizeof(bufstr), \"%4d %-s.\", num, msg);\n\t    newline = 1;\n\t}\n    }\n    else\n\tsprintf(bufstr, \"%4d\", num);\n\n    for (i = 0; i < lastlen; i++)\t/* Back up to the beginning of line */\n\tfputc('\\b', stdout);\n\n    fputs(bufstr, stdout);\t/* put out the string */\n    len = strlen(bufstr);\t/* get length of new string */\n\n    /* \n     * If there is a new message then erase \n     * the trailing info from the enw string \n     */\n\n    if (msg != NULL) {\n\tfor (i = len; i <= longest; i++)\n\t    fputc(' ', stdout);\n\tfor (i = len; i <= longest; i++)\n\t    fputc('\\b', stdout);\n    }\n\n    lastlen = len;\n    if (lastlen > longest)\n\tlongest = lastlen;\n\n    if (newline)\n\tfputc('\\n', stdout);\n    fflush(stdout);\n}\n\nchar *safe_filename(char *name)\n{\n    register char *sp;\n    register char *np;\n\n    np = name;\n    while (*np && (*np == ' ' || *np == '\\t'))\n\tnp++;\n\n    if (!*np)\n\treturn (NULL);\n\n    for (sp = name, np = name; *np && *np != '\\n';) {\n\t/* if valid character then store it */\n\tif (((*np >= 'a' && *np <= 'z') || (*np >= '0' && *np <= '9') ||\n\t     (*np >= 'A' && *np <= 'Z') || (*np == '-') || (*np == '.') ||\n\t     (*np == ':') || (*np == '_'))\n\t    && !(set_unsafe_chars && strchr(set_unsafe_chars, *np))) {\n\t    *sp = *np;\n\t}\n\telse\t/* Need to replace the character with a safe one */\n\t    *sp = REPLACEMENT_CHAR;\n\tsp++;\n\tnp++;\n    }\n    *sp = '\\0';\n    if (sp >= name + 6 && !strcmp(sp - 6, \".shtml\"))\n\tstrcpy(sp - 6, \".html\");\n\n    return name;\n}\n\nstatic void\ncreate_attachname(char *attachname, int max_len)\n{\n    int i, max_i;\n    char suffix[8];\n    max_i = strlen(attachname);\n    if(max_i >= max_len)\n\tmax_i = max_len - 1;\n    i = max_i;\n    while(i >= 0 && i > max_i - sizeof(suffix) && attachname[i] != '.')\n\t--i;\n    if(i >= 0 && attachname[i] == '.')\n\tstrncpy(suffix, attachname + i, sizeof(suffix) - 1);\n    else\n\tsuffix[0] = 0;\n    strncpy(attachname, set_filename_base, max_len);\n    strncat(attachname, suffix, max_len - strlen(attachname) - 1);\n    safe_filename(attachname);\n}\n\n/*\n** Cross-indexes - adds to a list of replies. If a message is a reply to\n** another, the number of the message it's replying to is added to the list.\n** This list is searched upon printing.\n*/\n\nvoid crossindex(void)\n{\n    int num, status, maybereply;\n    struct emailinfo *email;\n\n    num = 0;\n    if(!set_linkquotes)\n        replylist = NULL;\n\n    while (num <= max_msgnum) {\n\tif (!hashnumlookup(num, &email)) {\n\t    ++num;\n\t    continue;\n\t}\n\tstatus = hashreplynumlookup(email->msgnum,\n\t\t\t\t    email->inreplyto, email->subject,\n\t\t\t\t    &maybereply);\n\tif (status != -1) {\n\t    struct emailinfo *email2;\n            \n\t    if (!hashnumlookup(status, &email2)) {\n\t\t++num;\n\t\tcontinue;\n\t    }\n\t    /*  make sure there is no recursion between the message\n                and reply lookup if a message and its reply-to were\n                archived in reverse, both messages share the same\n                subject (regardless of Re), and the message itself was\n                a reply to a non-archived message. */\n\t    if (maybereply && !strcmp (email2->inreplyto, email->msgid)) {\n                ++num;\n                continue;\n            }\n            \n\t    if (set_linkquotes) {\n\t        struct reply *rp;\n\t\tint found_num = 0;\n\t\tfor (rp = replylist; rp != NULL; rp = rp->next)\n\t\t    if(rp->msgnum == status && rp->frommsgnum == num) {\n\t\t        found_num = 1;\n\t\t\tbreak;\n\t\t    }\n\t\tif (!found_num && !(maybereply || num <= status))\n#ifdef FASTREPLYCODE\n\t\t    replylist = addreply2(replylist, email2, email, maybereply,\n\t\t\t\t\t &replylist_end);\n#else\n\t\t    replylist = addreply(replylist, status, email, maybereply,\n\t\t\t\t\t &replylist_end);\n#endif\t\t\n\t    }\n\t    else {\n#ifdef FASTREPLYCODE\n\t\treplylist = addreply2(replylist, email2, email, maybereply,\n\t\t\t\t      &replylist_end);\n#else\n\t\treplylist = addreply(replylist, status, email, maybereply,\n\t\t\t\t     &replylist_end);\n#endif\t\t\n\t    }\n\t}\n\tnum++;\n    }\n#if DEBUG_THREAD\n    {\n\tstruct reply *r;\n\tr = replylist;\n\tfprintf(stderr, \"START of replylist after crossindex\\n\");\n\tfprintf(stderr, \"- msgnum frommsgnum maybereply msgid\\n\");\n\twhile (r != NULL) {\n\t    fprintf(stderr, \"- %d %d %d '%s'\\n\",\n\t\t    r->data->msgnum,\n\t\t    r->frommsgnum, r->maybereply, r->data->msgid);\n\t    r = r->next;\n\t}\n\tfprintf(stderr, \"END of replylist after crossindex\\n\");\n    }\n#endif\n}\n\n/* \n** Recursively checks for replies to replies to a message, etc.\n** Replies are added to the thread list.\n*/\n\n#ifdef FASTREPLYCODE\nvoid crossindexthread2(int num)\n{\n    struct reply *rp;\n    struct emailinfo *ep;\n    if(!hashnumlookup(num, &ep)) {\n\tchar errmsg[512];\n        snprintf(errmsg, sizeof(errmsg), \n                 \"internal error crossindexthread2 %d\", num);\n\tprogerr(errmsg);\n    }\n\n    for (rp = ep->replylist; rp != NULL; rp = rp->next) {\n\tif (!(rp->data->flags & USED_THREAD)) {\n\t    rp->data->flags |= USED_THREAD;\n\t    if (0) fprintf(stderr, \"add thread.b %d %d %d\\n\", num, rp->data->msgnum, rp->msgnum);\n\t    threadlist = addreply(threadlist, num, rp->data, 0,\n\t\t\t\t  &threadlist_end);\n\t    printedlist = markasprinted(printedthreadlist, rp->msgnum);\n\t    crossindexthread2(rp->msgnum);\n\t}\n    }\n}\n#else\nvoid crossindexthread2(int num)\n{\n    struct reply *rp;\n\n    for (rp = replylist; rp != NULL; rp = rp->next) {\n\tif (!(rp->data->flags & USED_THREAD) && (rp->frommsgnum == num)) {\n\t    rp->data->flags |= USED_THREAD;\n\t    threadlist = addreply(threadlist, num, rp->data, 0,\n\t\t\t\t  &threadlist_end);\n\t    printedlist = markasprinted(printedthreadlist, rp->msgnum);\n\t    crossindexthread2(rp->msgnum);\n\t}\n    }\n}\n#endif\n\n\n/*\n** First, print out the threads in order by date...\n** Each message number is appended to a thread list. Threads and individual\n** messages are separated by a -1.\n*/\n\nvoid crossindexthread1(struct header *hp)\n{\n    int isreply;\n\n#ifndef FASTREPLYCODE\n    struct reply *rp;\n#endif\n\n    if (hp) {\n\tcrossindexthread1(hp->left);\n\n#ifdef FASTREPLYCODE\n\tisreply = hp->data->isreply;\n#else\n\tfor (isreply = 0, rp = replylist; rp != NULL; rp = rp->next) {\n\t    if (rp->msgnum == hp->data->msgnum) {\n\t\tisreply = 1;\n\t\tbreak;\n\t    }\n\t}\n#endif\n\n\t/* If this message is not a reply to any other messages then it\n\t * is the first message in a thread.  If it hasn't already\n\t * been dealt with, then add it to the thread list, followed by\n\t * any descendants and then the end of thread marker.\n\t */\n\tif (!isreply && !wasprinted(printedthreadlist, hp->data->msgnum) &&\n\t    !(hp->data->flags & USED_THREAD)) {\n\t    hp->data->flags |= USED_THREAD;\n\t    threadlist = addreply(threadlist, hp->data->msgnum, hp->data,\n\t\t\t\t  0, &threadlist_end);\n\t    crossindexthread2(hp->data->msgnum);\n\t    threadlist = addreply(threadlist, -1, NULL, 0, &threadlist_end);\n\t}\n\n\tcrossindexthread1(hp->right);\n    }\n}\n\n/*\n** Grabs the date string from a Date: header. (Y2K OK)\n*/\n\nchar *getmaildate(char *line)\n{\n    int i;\n    int len;\n    char *c;\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    c = strchr(line, ':');\n    if ((*(c + 1) && *(c + 1) == '\\n') || (*(c + 2) && *(c + 2) == '\\n')) {\n\tPushString(&buff, NODATE);\n\tRETURN_PUSH(buff);\n    }\n    c += 2;\n    while (*c == ' ' || *c == '\\t')\n\tc++;\n    for (i = 0, len = DATESTRLEN - 1; *c && *c != '\\n' && i < len; c++)\n\tPushByte(&buff, *c);\n\n    RETURN_PUSH(buff);\n}\n\n/*\n** Grabs the date string from a From article separator. (Y2K OK)\n*/\n\nchar *getfromdate(char *line)\n{\n    static char tmpdate[DATESTRLEN];\n    int i;\n    int len;\n    char *c = NULL;\n\n    for (i = 0; days[i] != NULL &&\n\t ((c = strstr(line, days[i])) == NULL); i++);\n    if (days[i] == NULL)\n\ttmpdate[0] = '\\0';\n    else {\n\tfor (i = 0, len = DATESTRLEN - 1; *c && *c != '\\n' && i < len; c++)\n\t    tmpdate[i++] = *c;\n\n\ttmpdate[i] = '\\0';\n    }\n    return tmpdate;\n}\n\n\n/* \n** Grabs the message ID, like <...> from the Message-ID: header.\n*/\n\nchar *getid(char *line)\n{\n    int i;\n    char *c;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    if (strrchr(line, '<') == NULL) {\n\t/* \n         * bozo alert!\n\t *   msg-id = \"<\" addr-spec \">\" \n\t * try to recover as best we can\n\t */\n\tc = strchr(line, ':') + 1;\t/* we know this exists! */\n\n\t/* skip spaces before message ID */\n\twhile (*c && (*c == ' ' || *c == '\\t'))\n\t    c++;\n    }\n    else\n\tc = strrchr(line, '<') + 1;\n\n    for (i = 0; *c && *c != '>' && *c != '\\n'; c++) {\n\tif (*c == '\\\\')\n\t    continue;\n\tPushByte(&buff, *c);\n\ti++;\n    }\n\n    if (i == 0)\n\tPushString(&buff, \"BOZO\");\n\n    RETURN_PUSH(buff);\n}\n\n\n/*\n** Grabs the subject from the Subject: header.\n**\n** Need to add a table of Re: equivalents (different languages, MUA, etc...)\n**\n** Returns ALLOCATED string.\n*/\n\nchar *getsubject(char *line)\n{\n    int i;\n    int len;\n    char *c;\n    char *startp;\n    char *strip_subject = NULL;\n    char *postre = NULL;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    c = strchr(line, ':');\n    if (!c)\n\treturn NULL;\n\n    c += 2;\n\n    if (set_stripsubject) {\n\t/* compute a new subject */\n\tstrip_subject = replace(c, set_stripsubject, \"\");\n\t/* point to it */\n\tc = strip_subject;\n    }\n\n    while (isspace(*c))\n\tc++;\n\n    startp = c;\n\n    for (i = len = 0; c && *c && (*c != '\\n'); c++) {\n\ti++;\n\t/* keep track of the max length without trailing white spaces: */\n\tif (!isspace(*c))\n\t    len = i;\n    }\n\n    if (isre(startp, &postre)) {\n\tif (!*postre || (*postre == '\\n'))\n\t    len = 0;\n    }\n\n    if (!len)\n\tPushString(&buff, NOSUBJECT);\n    else\n\tPushNString(&buff, startp, len);\n\n    if (set_stripsubject && (strip_subject != NULL))\n\tfree(strip_subject);\n\n    RETURN_PUSH(buff);\n}\n\n/*\n** Grabs the annotation values given in the annotation user-defined header\n** \n** annotation_content is set to the value of the content annotation\n** annotation_robot is set to the values of the robot annotations\n** Returns TRUE if an annotation was found, FALSE otherwise.\n*/\n\nstatic bool\ngetannotation(char *line, annotation_content_t *annotation_content,\n\t       annotation_robot_t *annotation_robot)\n{\n  char *c;\n\n  *annotation_content = ANNOTATION_CONTENT_NONE;;\n  *annotation_robot = ANNOTATION_ROBOT_NONE;\n  \n  c = strchr(line, ':');\n  if (!c)\n    return FALSE;\n  c++;\n\n  while (*c != '\\n') {\n    int len;\n    char *startp;\n\n    while (isspace(*c))\n      c++;\n  \n    startp = c;\n    while (!isspace (*c) && *c != '\\n' && *c != ',') {\n      c++;\n    }\n\n    len = (int) (c-startp);\n    if (len > 0) {\n      if (!strncasecmp (startp, \"deleted\", len)) {\n\t*annotation_content = ANNOTATION_CONTENT_DELETED_OTHER;\n\tbreak;\n      }\n      else if (!strncasecmp (startp, \"spam\", len)) {\n\t*annotation_content = ANNOTATION_CONTENT_DELETED_SPAM;\n\tbreak;\n      }\n      else if (!strncasecmp (startp, \"edited\", len))\n\t*annotation_content = ANNOTATION_CONTENT_EDITED;\n      else if (!strncasecmp (startp, \"noindex\", len))\n\t*annotation_robot |= ANNOTATION_ROBOT_NO_INDEX;\n      else if (!strncasecmp (startp, \"nofollow\", len))\n\t*annotation_robot |= ANNOTATION_ROBOT_NO_FOLLOW;\n    }\n    if (*c == ',')\n      c++;\n  }\n\n  /* only return true if at least a valid annotation was found */\n  return (*annotation_content != ANNOTATION_CONTENT_NONE \n\t  || *annotation_robot != ANNOTATION_ROBOT_NONE);\n}\n\n/*\n** Grabs the message ID, or date, from the In-reply-to: header.\n**\n** Maybe I'm confused but....\n**     What either ? Should it not be consistent and choose to return \n**     one (the msgid) as the default and fall back to date when a \n**     msgid cannot be found ?\n**\n** Who knows what other formats are out there...\n**\n** In-Reply-To: <1DD9B854E27@everett.pitt.cc.nc.us>\n** In-Reply-To: <199709181645.MAA02097@mail.clark.net> from \"Marcus J. Ranum\" at Sep 18, 97 12:41:40 pm\n** In-Reply-To: <199709181645.MAA02097@mail.clark.net> from \n** In-Reply-To: \"L. Detweiler\"'s message of Fri, 04 Feb 94 22:51:22 -0700 <199402050551.WAA16189@longs.lance.colostate.edu>\n**\n** The message id should always be returned for threading purposes. Mixing\n** message-ids and dates just does not allow for proper threading lookups.\n**\n** Returns ALLOCATED string.  */\n\nchar *getreply(char *line)\n{\n    char *c;\n    char *m;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    /* Check for blank line */\n\n    /* \n     * Check for line with \" from \" and \" at \".  Format of the line is \n     *     <msgid> from \"quoted user name\" at date-string\n     */\n\n    if (strstr(line, \" from \") != NULL) {\n\tif ((strstr(line, \" at \")) != NULL) {\n\t    if ((m = strchr(line, '<')) != NULL) {\n\t\tfor (m++; *m && *m != '>' && *m != '\\n'; m++) {\n\t\t    PushByte(&buff, *m);\n\t\t}\n\t\tRETURN_PUSH(buff);\n\t    }\n\t}\n\n\t/* \n\t * If no 'at' the line may be a continued line or a truncated line.\n\t * Both will be picked up later.\n\t */\n    }\n\n    /* \n     * Check for line with \" message of \".  Format of the line is \n     *     \"quoted user name\"'s message of date-string <msgid>\n     */\n\n    if ((c = strstr(line, \"message of \")) != NULL) {\n\t/*\n\t * Check to see if there is a message ID on the line. \n\t * If not this is a continued line and when you add a readline()\n\t * function that concatenates continuation lines collapsing\n\t * white space, you might want to revisit this...\n\t */\n\n\tif ((m = strchr(line, '<')) != NULL) {\n\t    for (m++; *m && *m != '>' && *m != '\\n'; m++) {\n\t\tPushByte(&buff, *m);\n\t    }\n\t    RETURN_PUSH(buff);\n\t}\n\n\t/* Nope... Go for the Date info... Bug... */\n\tc += 11;\n\twhile (isspace(*c))\n\t    c++;\n\tif (*c == '\"')\n\t    c++;\n\n\tfor (; *c && *c != '.' && *c != '\\n'; c++) {\n\t    PushByte(&buff, *c);\n\t}\n\tRETURN_PUSH(buff);\n    }\n\n    if ((c = strstr(line, \"dated: \")) != NULL) {\n\tc += 7;\n\tfor (; *c && *c != '.' && *c != '\\n'; c++) {\n\t    PushByte(&buff, *c);\n\t}\n\tRETURN_PUSH(buff);\n    }\n\n    if ((c = strstr(line, \"dated \")) != NULL) {\n\tc += 6;\n\tfor (; *c && *c != '.' && *c != '\\n'; c++) {\n\t    PushByte(&buff, *c);\n\t}\n\tRETURN_PUSH(buff);\n\n    }\n\n    if ((c = strchr(line, '<')) != NULL) {\n\tc++;\n\tfor (; *c && *c != '>' && *c != '\\n'; c++) {\n\t    if (*c == '\\\\')\n\t\tcontinue;\n\t    PushByte(&buff, *c);\n\t}\n\tRETURN_PUSH(buff);\n    }\n\n    if ((c = strstr(line, \"sage of \")) != NULL) {\n\tc += 8;\n\tif (*c == '\\\"')\n\t    c++;\n\n\tfor (; *c && *c != '.' && *c != '\\n' && *c != 'f'; c++) {\n\t    PushByte(&buff, *c);\n\t}\n\tRETURN_PUSH(buff);\n    }\n\n    PushByte(&buff, '\\0');\n    RETURN_PUSH(buff);\n}\n\nstatic char *\nextract_rfc2047_content(char *iptr)\n{\n    char *end_ptr, *ptr;\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    /* skip the charset, find the encoding */\n    ptr = strchr (iptr + 2, '?');\n    ptr++;\n    if ((*ptr == 'Q' || *ptr == 'q' || *ptr == 'B' || *ptr == 'b')\n\t&& *(ptr + 1) == '?') {\n      /* it's a valid encoding */\n      ptr = ptr + 2;\n      end_ptr = strstr(ptr, \"?=\");\n      if (end_ptr && ptr > iptr) {\n\tPushNString(&buff, ptr, end_ptr - ptr);\n\tRETURN_PUSH(buff);\n      }\n    }\n    return NULL;\n}\n\n/*\n** RFC 2047 defines MIME extensions for mail headers.\n**\n** This function decodes that into binary/8bit data.\n**\n** Example:\n**   =?iso-8859-1?q?I'm_called_?= =?iso-8859-1?q?Daniel?=\n**\n** Should result in \"I'm called Daniel\", but:\n**\n**   =?iso-8859-1?q?I'm_called?= Daniel\n**\n** Should result in \"I'm called Daniel\" too.\n**\n** Returns the newly allcated string, or the previous if nothing changed \n*/\n\nstatic char *mdecodeRFC2047(char *string, int length, char *charsetsave)\n{\n    char *iptr = string;\n    char *oldptr;\n    char *storage = (char *)emalloc(length*4 + 1);\n\n    char *output = storage;\n\n    char charset[129];\n    char encoding[33];\n    char dummy[129];\n    char *ptr, *endptr;\n    char *old_output;\n\n#ifdef NOTUSED\n    char equal;\n#endif\n    int value;\n\n    char didanything = FALSE;\n\n    while (*iptr) {\n\tif (!strncmp(iptr, \"=?\", 2) &&\n\t    (3 == sscanf(iptr + 2, \"%128[^?]?%32[^?]?%128[^ ]\",\n\t\t\t charset, encoding, dummy))) {\n\t    /* This is a full, valid 'encoded-word'. Decode! */\n\t    char *ptr;\n\t    char *blurb = extract_rfc2047_content(iptr);\n\t    if (!blurb) {\n\t\t*output++ = *iptr++;\n\t\t/* it wasn't a real encoded-word */\n\t\tcontinue;\n\t    }\n\t    ptr = blurb;\n\n\t    didanything = TRUE;\t/* yes, we decode something */\n\n\t    /* we could've done this with a %n in the sscanf, but we know all\n\t       sscanfs don't grok that */\n\n\t    iptr +=\n\t\t2 + strlen(charset) + 1 + strlen(encoding) + 1 +\n\t\tstrlen(blurb) + 2;\n\n\t    if (!strcasecmp(\"q\", encoding)) {\n\t\t/* quoted printable decoding */\n            endptr = ptr + strlen(ptr);\n\n#ifdef HAVE_ICONV\n\t      char *orig2,*output2,*output3;\n\t      size_t len, charsetlen;\n\t      orig2=output2=malloc(strlen(string)+1);\n\t      memset(output2,0,strlen(string)+1);\n\t      old_output=output;\n\n\t\tfor (; ptr < endptr; ptr++) {\n\t\t    switch (*ptr) {\n\t\t    case '=':\n\t\t\tsscanf(ptr + 1, \"%02X\", &value);\n\t\t\t*output2++ = value;\n\t\t\tptr += 2;\n\t\t\tbreak;\n\t\t    case '_':\n\t\t\t*output2++ = ' ';\n\t\t\tbreak;\n\t\t    default:\n\t\t\t*output2++ = *ptr;\n\t\t\tbreak;\n\t\t    }\n\t\t}\n\t\toutput3=i18n_convstring(orig2,charset,\"UTF-8\",&len);\n\t\tfree(orig2);\n\t\tmemcpy(output,output3,len);\n\t\toutput += len;\n\t\tfree(output3);\n\t\tcharsetlen = strlen(charset) < 255 ? strlen(charset) : 255;\n\t\tmemcpy(charsetsave,charset,charsetlen);\n\t\tcharsetsave[charsetlen] = '\\0';\n#else\n\t\tfor (; ptr < endptr; ptr++) {\n\t\t    switch (*ptr) {\n\t\t    case '=':\n\t\t\tsscanf(ptr + 1, \"%02X\", &value);\n\t\t\t*output++ = value;\n\t\t\tptr += 2;\n\t\t\tbreak;\n\t\t    case '_':\n\t\t\t*output++ = ' ';\n\t\t\tbreak;\n\t\t    default:\n\t\t\t*output++ = *ptr;\n\t\t\tbreak;\n\t\t    }\n\t\t}\n#endif\n\t    }\n\t    else if (!strcasecmp(\"b\", encoding)) {\n\t\t/* base64 decoding */\n\t\tint len;\n\t        size_t charsetlen;\n#ifdef HAVE_ICONV\n                size_t tmplen;\n\t\tchar *output2;\n\t\tbase64Decode(ptr, output, &len);\n\t\toutput2=i18n_convstring(output,charset,\"UTF-8\",&tmplen);\n\t\tmemcpy(output,output2,tmplen);\n\t\toutput += tmplen;\n\t\tfree(output2);\n\t\tcharsetlen = strlen(charset) < 255 ? strlen(charset) : 255;\n\t\tmemcpy(charsetsave,charset,charsetlen);\n\t\tcharsetsave[charsetlen] = '\\0';\n#else\n\t\tbase64Decode(ptr, output, &len);\n\t\toutput += len;\n#endif\n\t    }\n\t    else {\n\t\t/* unsupported encoding type */\n\t\tstrcpy(output, \"<unknown>\");\n\t\toutput += 9;\n\t    }\n\n\t    free(blurb);\n\t    blurb = ptr = NULL;\n\n\t    oldptr = iptr;\t/* save start position */\n\n\t    while (*iptr && isspace(*iptr))\n\t\tiptr++;\t\t/* pass all whitespaces */\n\n\t    /* if this is an encoded word here, we should skip the passed\n\t       whitespaces. If it isn't an encoded-word, we should include the\n\t       whitespaces in the output. */\n\n\t    if (!strncmp(iptr, \"=?\", 2) &&\n\t\t(3 == sscanf(iptr + 2, \"%128[^?]?%32[^?]?%128[^?]?\",\n\t\t\t     charset, encoding, dummy)) &&\n\t\t(blurb = extract_rfc2047_content(iptr))) {\n\t\tfree(blurb);\n\t\tcontinue;\t/* this IS an encoded-word, continue from here */\n\t    }\n\t    else\n\t\t/* this IS NOT an encoded-word, move back to the first whitespace */\n\t\tiptr = oldptr;\n\t}\n\telse\n\t    *output++ = *iptr++;\n    }\n    *output = 0;\n\n    if (didanything) {\n\t/* this check prevents unneccessary strsav() calls if not needed */\n\tfree(string);\t\t/* free old memory */\n\n#if DEBUG_PARSE\n\t/* debug display */\n\tprintf(\"NEW: %s\\n\", storage);\n\n\t{\n\t    char *f;\n\t    puts(\"NEW:\");\n\t    for (f = storage; f < output; f++) {\n\t\tif (isgraph(*f))\n\t\t    printf(\"%c\", *f);\n\t\telse\n\t\t    printf(\"%02X\", (unsigned char)*f);\n\t    }\n\t    puts(\"\");\n\t}\n#endif\n\treturn storage;\t\t/* return new */\n    }\n    else {\n\tfree(storage);\n#ifdef HAVE_ICONV\n        /* make sure there are only ascii chars in the string\n        ** for messages that don't respect rfc2047 */\n        i18n_replace_non_ascii_chars(string);\n#endif\n\treturn string;\n    }\n}\n\n/* \n** RFC 3676 format=flowed parsing routines\n*/\n\n/* get_quote_level returns the number of quotes in a line, \n   following the RFC 3676 section 4.5 criteria.\n*/\nstatic int get_quotelevel (const char *line)\n{\n  int quoted = 0;\n  char *p = (char *) line;\n\n  while (p && *p == '>')\n  {\n    quoted++;\n    p++;\n  }\n\n  return quoted;\n}\n\n/*\n** rfc3676_handler parses lines according to RFC 3676.  Its inputs are\n** the current line to parse, the delsp value (from the message\n** headers), the previous line quotelevel, and a flag saying if the\n** previous line was marked as a continuing one.\n**\n** The function updates the quotelevel to that of the current parsed\n** line. The function will update the continue_prev_flow_flag to say\n** if the current line should be joined to the previous one, and, if\n** positive, the padding offset that should be applied to the current\n** line when merging it (for skipping quotes or space-stuffing).\n**\n** If delsp is true, the function will remove the space in the soft\n** line break if the line is flowed.\n**\n** The function returns true if the current line is flowed.\n**\n*/\nstatic bool rfc3676_handler (char *line, bool delsp_flag, int *quotelevel, \n\t\t\t     bool *continue_prev_flow_flag)\n{\n  int new_quotelevel = 0;\n  int tmp_padding = 0;\n  bool sig_sep = FALSE;\n  bool flowed = FALSE;\n\n  /* rules for evaluation if the flow should stop:\n     1. new quote level is different from previous one\n     2. The line is a signature \"[(quotes)][(ss)]-- \\n\"\n     3. The line is a hard break \"\\n\"\n     4. The message body has ended\n\n     rules for removing space-stuffing:\n     1. if f=f, then remove the first space of any line beginning with a space,\n        before processing for f=f.\n     2. space char may depend on charset.\n\n     rules for quotes:\n     1. quoted lines always begin with a '>' char. This symbol may depend on the\n        msg charset. \n     2. They are not ss before the quote symbol but may be after it \n        appears.\n\n     rules for seeing if a line should be flowed with the next one:\n     1. line ends with a soft line break sp\\n\n     2. remove the sp if delsp=true; keep it otherwise\n\n     special case, space-stuffed or f=f? A line that has only this content:\n     \" \\n\": this is a space-stuffed newline.\n     @@ test this special case with mutt\n  */\n\n\n#if DEBUG_PARSE\n  printf(\"RFC3676: Previous quote level: %d\\n\", *quotelevel);\n  printf(\"RFC3676: Previous line flow flag: %d\\n\", *continue_prev_flow_flag);\n#endif\n\n  /* \n  ** hard crlf detection.\n  */\n  if (rfc3676_ishardlb(line)) {\n      /* Hard crlf, reset flags */\n      *quotelevel = 0;\n      *continue_prev_flow_flag = FALSE;\n#if DEBUG_PARSE\n      printf(\"RFC3676: hard CRLF detected. Stopping ff\\n\");\n#endif\n      return FALSE;\n  }\n  \n  /*\n  ** quote level detection\n  */\n  new_quotelevel = get_quotelevel (line);\n#if DEBUG_PARSE\n  printf(\"RFC3676: New quote level: %d\\n\", new_quotelevel);\n#endif\n\n  /* change of quote level, stop ff */\n  if (new_quotelevel != *quotelevel\n      || (new_quotelevel > 0 && set_format_flowed_disable_quoted)) {\n      *continue_prev_flow_flag = FALSE;\n\n#if DEBUG_PARSE\n      printf(\"RFC3676: different quote levels detected. Stopping ff\\n\");\n#endif      \n  }\n  tmp_padding = new_quotelevel;\n\n  /* \n  ** skip space stuffing if any \n  */\n  if (line[tmp_padding] == ' ') {\n      tmp_padding++;\n#if DEBUG_PARSE\n      printf(\"RFC3676: space-stuffing detected; skipping space\\n\");\n#endif            \n  }\n\n  /* \n  ** hard crlf detection after quotes\n  */\n  if (rfc3676_ishardlb(line+tmp_padding)) {\n      /* Hard crlf, reset flags */\n      /* *continue_prev_flow_flag = FALSE; */\n      *quotelevel = new_quotelevel;\n#if DEBUG_PARSE\n      printf(\"RFC3676: hard CRLF detected after quote. Stopping ff\\n\");\n#endif\n      return FALSE;\n  }\n\n  /*\n  ** signature detection\n  */\n  \n  /* Is it a signature separator? */\n  /* rfc3676 gives \"-- \\n\" and \"--\\r\\n\" as signatures. We also add \"--\\n\" to this list,\n     as mutt allows it */\n  if (!strcmp (line + tmp_padding, \"-- \\n\")\n      || !strcmp (line + tmp_padding, \"-- \\r\\n\")\n      || !strcmp (line + tmp_padding, \"--\\n\")) {\n      /* yes, stop f=f */\n      *continue_prev_flow_flag = FALSE;\n      sig_sep = TRUE;\n#if DEBUG_PARSE\n      printf (\"RFC3676: -- signature detected. Stopping ff\\n\", sig_sep);\n#endif\n      if (delsp_flag) {\n          rfc3676_trim_softlb (line);\n      }\n  }\n\n  /*\n  ** is this line f=f?\n  */\n  if (!sig_sep) {\n      char *eold;\n      eold = strrchr (line, '\\n');\n      if (line != eold) {\n          if (*(eold - 1) == '\\r')\n              eold--;\n      }\n      if (line != eold && (line + tmp_padding) != eold) {\n          if (*(eold - 1) == ' ') {\n              if (!sig_sep) {\n                  flowed = TRUE;\n#if DEBUG_PARSE\n                  printf(\"RFC3676: f=f line detected\\n\");\n#endif\n              }\n              if (delsp_flag) {\n                  /* remove the space stuffing and copy the end of line */\n                  rfc3676_trim_softlb(line);\n              }\n          }\n      }\n  }\n  \n  /*\n  ** update flags\n  */\n  *quotelevel = new_quotelevel;\n  \n#if DEBUG_PARSE\n  if (*continue_prev_flow_flag)\n      printf(\"RFC3676: Continuing previous flow\\n\");\n  if (flowed) {\n      printf(\"RFC3676: Current line is flowed\\n\");\n  }\n#endif\n\n  return flowed;\n}\n\n/*\n** Decode this [virtual] Quoted-Printable line as defined by RFC2045.\n** Written by Daniel.Stenberg@haxx.nu\n*/\n\nstatic char * mdecodeQP(FILE *file, char *input, char **result, int *length,\n\t\t\tFILE *fpo)\n{\n    int outcount = 0;\n    char i_buffer[MAXLINE];\n    char *buffer;\n    unsigned char inchar;\n    char *output;\n    struct Push pbuf;\n\n    int len = strlen(input);\n    output = strsav(input);\n\n    INIT_PUSH(pbuf);\n\n    while ((inchar = *input) != '\\0') {\n\n\tif (outcount >= len - 1) {\n\t    /* we need to enlarge the destination area! */\n\t    /* double the size each time enlargement is needed */\n\t    char *newp = (char *)realloc(output, len * 2);\n\t    if (newp) {\n\t\toutput = newp;\n\t\tlen *= 2;\n\t    }\n\t    else\n\t\tbreak;\n\t}\n\n\tinput++;\n\tif ('=' == inchar) {\n\t    int value;\n\t    if ('\\n' == *input) {\n\t\tif (!fgets(i_buffer, MAXLINE, file))\n\t\t    break;\n\t\tbuffer = i_buffer + set_ietf_mbox;\n\t\tif (set_append) {\n\t\t  if(fputs(buffer, fpo) < 0) {\n\t\t    progerr(\"Can't write to \\\"mbox\\\"\"); /* revisit me */\n\t\t  }\n\t\t}\n\t\tinput = buffer;\n\t\tPushString(&pbuf, buffer);\n\t\tcontinue;\n\t    }\n\t    else if ('=' == *input) {\n\t\tinchar = '=';\n\t\tinput++;\t/* pass this */\n\t    }\n\t    else if (isxdigit(*input)) {\n\t\tsscanf(input, \"%02X\", &value);\n\t\tinchar = (unsigned char)value;\n\t\tinput += 2;\t/* pass the two letters */\n\t    }\n\t    else\n\t\tinchar = '=';\n\t}\n\toutput[outcount++] = inchar;\n    }\n    output[outcount] = 0;\t/* zero terminate */\n\n    *result = output;\n    *length = outcount;\n    RETURN_PUSH(pbuf);\n}\n\nchar *createlink(char *format, char *dir, char *file, int num, char *type)\n{\n    struct Push buff;\n    char buffer[16];\n\n    INIT_PUSH(buff);\n\n    if (!format || !*format)\n\t/* nothing set, use internal default: */\n\tformat = \"%p\";\n\n    while (*format) {\n\tif ('%' == *format) {\n\t    format++;\n\t    switch (*format) {\n\t    default:\n\t\tPushByte(&buff, '%');\n\t\tPushByte(&buff, *format);\n\t\tbreak;\n\t    case '%':\n\t\tPushByte(&buff, '%');\n\t\tbreak;\n\t    case 'p':\t\t/* the full path+file */\n\t\tPushString(&buff, dir);\n\t\tPushByte(&buff, '/');\t/* this is for a HTML link and always uses\n\t\t\t\t\t   this path separator */\n\t\tif (file)\n\t\t    PushString(&buff, file);\n\t\telse\n\t\t    PushString(&buff, \"<void>\");\n\t\tbreak;\n\t    case 'f':\t\t/* file name */\n\t\tPushString(&buff, file);\n\t\tbreak;\n\t    case 'd':\t\t/* dir name */\n\t\tPushString(&buff, dir);\n\t\tbreak;\n\t    case 'n':\t\t/* message number */\n\t\tsprintf(buffer, \"%04d\", num);\n\t\tPushString(&buff, buffer);\n\t\tbreak;\n\t    case 'c':\t\t/* content-type (TODO: URL-encode this) */\n\t\tPushString(&buff, type);\n\t\tbreak;\n\t    }\n\t}\n\telse {\n\t    PushByte(&buff, *format);\n\t}\n\tformat++;\n    }\n\n    RETURN_PUSH(buff);\n}\n\n\nvoid emptydir(char *directory)\n{\n    struct stat fileinfo;\n\n    char *realdir = directory;\n\n    if (!lstat(realdir, &fileinfo)) {\n\tif (S_ISDIR(fileinfo.st_mode)) {\n\t    /* It exists AND it is a dir */\n\t    DIR *dir = opendir(realdir);\n\t    char *filename;\n\t    if (dir) {\n#ifdef HAVE_DIRENT_H\n\t\tstruct dirent *entry;\n#else\n\t\tstruct direct *entry;\n#endif\n\t\twhile ((entry = readdir(dir))) {\n\t\t    if (!strcmp(\".\", entry->d_name) ||\n\t\t\t!strcmp(\"..\", entry->d_name)) continue;\n\t\t    trio_asprintf(&filename, \"%s%c%s\", realdir,\n\t\t\t\t  PATH_SEPARATOR, entry->d_name);\n\t\t    if (set_showprogress)\n\t\t        fprintf(stderr, \"\\nWe delete %s\\n\", filename);\n\t\t    unlink(filename);\n\t\t    free(filename);\n\t\t}\n\t\tclosedir(dir);\n\t    }\n\t}\n    }\n}\n\nstatic int do_uudecode(FILE *fp, char *line, char *line_buf,\n\t\t       struct Push *raw_text_buf, FILE *fpo)\n{\n    struct Push pbuf;\n    char *p2;\n    INIT_PUSH(pbuf);\n\n    if (uudecode(fp, line, line, NULL, &pbuf))\n      /*\n       * oh gee, we failed this is chaos \n       */\n        return 0;\n    p2 = PUSH_STRING(pbuf);\n    if (p2) {\n        if (set_append) {\n\t    if(fputs(p2, fpo) < 0) {\n\t        progerr(\"Can't write to \\\"mbox\\\"\");\n\t    }\n\t}\n\tif (set_txtsuffix) {\n\t    PushString(raw_text_buf, line_buf);\n\t    line_buf[0] = 0; /*avoid dup at next for iter*/\n\t    PushString(raw_text_buf, p2);\n\t}\n\tfree(p2);\n    }\n    return 1;\n}\n\nstatic void write_txt_file(struct emailinfo *emp, struct Push *raw_text_buf)\n{\n    char *txt_filename;\n    char *p = PUSH_STRING(*raw_text_buf);\n    char tmp_buf[32];\n    sprintf(tmp_buf, \"%.4d\", emp->msgnum);\n    txt_filename = htmlfilename(tmp_buf, emp, set_txtsuffix);\n    if ((!emp->is_deleted\n\t || ((emp->is_deleted & (FILTERED_DELETE | FILTERED_OLD | FILTERED_NEW \n\t\t\t\t | FILTERED_DELETE_OTHER))\n\t     && set_delete_level > 2)\n\t || (emp->is_deleted == FILTERED_EXPIRE && set_delete_level == 2))\n\t&& (set_overwrite || !isfile(txt_filename))) {\n        FILE *fp = fopen(txt_filename, \"w\");\n\tif (fp) {\n\t    fwrite(p, strlen(p), 1, fp);\n\t    fclose(fp);\n\t}\n    }\n    free(p);\n    INIT_PUSH(*raw_text_buf);\n}\n\n/*\n** Parsing...the heart of Hypermail!\n** This loads in the articles from stdin or a mailbox, adding the right\n** field variables to the right structures. If readone is set, it will\n** think anything it reads in is one article only. Increment should be set\n** if this updates an archive.\n*/\n\nint parsemail(char *mbox,\t/* file name */\n\t      int use_stdin,\t/* read from stdin */\n\t      int readone,\t/* only one mail */\n\t      int increment,\t/* update an existing archive */\n\t      char *dir, int inlinehtml,\t/* if HTML should be inlined */\n\t      int startnum)\n{\n    FILE *fp;\n    struct Push raw_text_buf;\n    FILE *fpo = NULL;\n    char *date = NULL;\n    char *subject = NULL;\n    char *msgid = NULL;\n    char *inreply = NULL;\n    char *namep = NULL;\n    char *emailp = NULL;\n    char *line = NULL; \n    char line_buf[MAXLINE], fromdate[DATESTRLEN] = \"\";\n    char *cp;\n    char *dp = NULL;\n    int num, isinheader, hassubject, hasdate;\n    int num_added = 0;\n    long exp_time = -1;\n    time_t delete_older_than = (set_delete_older ? convtoyearsecs(set_delete_older) : 0);\n    time_t delete_newer_than = (set_delete_newer ? convtoyearsecs(set_delete_newer) : 0);\n    annotation_robot_t annotation_robot = ANNOTATION_ROBOT_NONE;\n    annotation_content_t annotation_content = ANNOTATION_CONTENT_NONE;\n    int is_deleted = 0;\n    int pos;\n    bool *require_filter, *require_filter_full;\n    int require_filter_len, require_filter_full_len;\n    struct hmlist *tlist;\n    char filename[MAXFILELEN];\n    char directory[MAXFILELEN];\n    char pathname[MAXFILELEN];\n    struct emailinfo *emp;\n    char *att_dir = NULL;\t/* directory name to store attachments in */\n    char *meta_dir = NULL;\t/* directory name where we're storing the meta data\n\t\t\t\t   that describes the attachments */\n    typedef enum {\n\tNO_FILE,\n\tMAKE_FILE,\n\tMADE_FILE\n    } FileStatus;\t\t/* for attachments */\n\n    /* -- variables for the multipart/alternative parser -- */\n    struct body *origbp = NULL;\t/* store the original bp */\n    struct body *origlp = NULL;\t/* ... and the original lp */\n    char alternativeparser = FALSE;\t/* set when inside alternative parser mode */\n    int alternative_weight = -1;\t/* the current weight of the prefered alternative content */\n    char *prefered_content_charset = NULL;  /* the current charset of the alternative */\n    struct body *alternative_lp = NULL;\t/* the previous alternative lp */\n    struct body *alternative_bp = NULL;\t/* the previous alternative bp */\n    struct body *append_bp = NULL; /* text to append to body after parse done*/\n    struct body *append_lp = NULL;\n    FileStatus alternative_lastfile_created = NO_FILE;\t/* previous alternative attachments, for non-inline MIME types */\n    char alternative_file[129];\t/* file name where we store the non-inline alternatives */\n    char alternative_lastfile[129];\t/* last file name where we store the non-inline alternatives */\n    char last_alternative_type[129];      /* the alternative Content-Type value */\n    int att_counter = 0;\t/* used to generate a unique name for attachments */\n    int parse_multipart_alternative_force_save_alts = 0; /* used to control if we are parsing alternative as multipart */\n    int old_set_save_alts = -1;  /* used to store the set_save_alts when overriding it for apple mail */\n    int applemail_ua_header_len = (set_applemail_mimehack) ? strlen (set_applemail_ua_header) : 0; /* code optimization to avoid computing it each time */\n    /* \n    ** keeps track of attachment file name used so far for this message \n    */\n    struct hmlist *att_name_list = NULL; \n    struct hmlist *att_name_last = NULL;\n\n    /* -- end of alternative parser variables -- */\n\n    struct body *bp;\n    struct body *lp = NULL;\t/* the last pointer, points to the last node in the\n\t\t\t\t   body list. Initially set to NULL since we have\n\t\t\t\t   none at the moment. */\n\n    struct body *headp = NULL;\t/* stored pointer to the point where we last\n\t\t\t\t   scanned the headers of this mail. */\n    struct body *content_type_p = NULL;  /* pointer to the Content-Type header */\n        \n    char Mime_B = FALSE;\n    char boundbuffer[256] = \"\";\n\n    struct boundary *boundp = NULL;\t/* This variable is used to store a stack \n\t\t\t\t\t   of boundary separators in cases with mimed \n\t\t\t\t\t   mails inside mimed mails */\n\n    struct boundary *multipartp = NULL; /* This variable is used to store a stack of\n                                           mimetypes when dealing with multipart mails */\n\n    struct charset_stack *charsetsp = NULL; /* This variable is used\n                                               to store a stack of\n                                               charset/charset_save\n                                               values when dealing\n                                               with multipart mails */\n\n    bool skip_mime_epilogue = FALSE;  /* This variable is used to help skip multipart/foo\n                                           epilogues */\n    \n    char multilinenoend = FALSE;\t/* This variable is set TRUE if we have read \n\t\t\t\t\t   a partial line off a multiline-encoded line, \n\t\t\t\t\t   and the next line we read is supposed to get\n\t\t\t\t\t   appended to the previous one */\n\n    int bodyflags = 0;\t\t/* This variable is set to extra flags that the \n\t\t\t\t   addbody() calls should OR in the flag parameter */\n\n    /* RFC 3676 related variables, set while parsing the headers and body content */\n    textplain_format_t textplain_format = FORMAT_FIXED;   \n    bool flowed_line = FALSE;\n    int quotelevel = 0;\n    bool continue_previous_flow_flag = FALSE;\n    bool delsp_flag = FALSE;\n\n    int binfile = -1;\n\n    char *charset = NULL;\t/* this is the LOCAL charset used in the mail */\n    char *charsetsave;      /* charset in MIME encoded text */\n\n    char *boundary_id = NULL;\n    char type[129];\t\t/* for Content-Type type */\n    char charbuffer[129];\t/* for Content-Type charset */\n    FileStatus file_created = NO_FILE;\t/* for attachments */\n\n    char attachname[129];\t/* for attachment file names */\n    char inline_force = FALSE;\t/* show a attachment in-line, regardles of\n\t\t\t\t   the content_disposition */\n    char *description = NULL;\t/* user-supplied description for an attachment */\n    /* @@@ test for attachment */\n    char attach_force;\n    /* @@@ */\n\n    EncodeType decode = ENCODE_NORMAL;\n    ContentType content = CONTENT_TEXT;\n\n    charsetsave=malloc(256);\n    memset(charsetsave,0,255);\n\n\n    if (use_stdin || !mbox || !strcasecmp(mbox, \"NONE\"))\n\tfp = stdin;\n    else if ((fp = fopen(mbox, \"rb\")) == NULL) {\n        snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", \n                 lang[MSG_CANNOT_OPEN_MAIL_ARCHIVE], mbox);\n\tprogerr(errmsg);\n    }\n    if(set_append) {\n    \n\t/* add to an mbox as we read */\n\t*directory = 0;\n\t*filename = 0;\n\t*pathname = 0;\n\tif (set_append_filename) {\n            time_t curtime;\n            const struct tm *local_curtime;\n            \n\t    time(&curtime);\n            local_curtime = localtime(&curtime);\n            \n\t    if(strncmp(set_append_filename, \"$DIR/\", 5) == 0) {\n\t        strncpy(directory, dir, MAXFILELEN - 1);\n                strftime(filename, MAXFILELEN - 1, set_append_filename+5, \n                         local_curtime);\n            } else {\n                strftime(filename, MAXFILELEN - 1, set_append_filename, \n                         local_curtime);\n\t    }\n\t} else {\n\t    strncpy(directory, dir, MAXFILELEN - 1);\n\t    strncpy(filename, \"mbox\", MAXFILELEN - 1);\n\t}\n\n\tif(trio_snprintf(pathname, sizeof(pathname), \"%s%s\", directory,\n\t\t\tfilename) == sizeof(pathname)) {\n\t    progerr(\"Can't build mbox filename\");\n\t}\n\tif(!(fpo = fopen(pathname, \"a\"))) {\n\t    trio_snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\",\n\t\t\t  lang[MSG_CANNOT_OPEN_MAIL_ARCHIVE], pathname);\n\t    progerr(errmsg);\n\t}\n    }\n\n    num = startnum;\n\n    INIT_PUSH(raw_text_buf);\n\n    hassubject = 0;\n    hasdate = 0;\n    isinheader = 1;\n    inreply = NULL;\n    msgid = NULL;\n    bp = NULL;\n    subject = NOSUBJECT;\n\n    parse_multipart_alternative_force_save_alts = 0;\n    old_set_save_alts = -1;\n    \n    require_filter_len = require_filter_full_len = 0;\n    for (tlist = set_filter_require; tlist != NULL; require_filter_len++, tlist = tlist->next)\n\t;\n    for (tlist = set_filter_require_full_body; tlist != NULL;\n\t require_filter_full_len++, tlist = tlist->next)\n\t;\n    pos = require_filter_len + require_filter_full_len;\n    require_filter = (pos ? (bool *)emalloc(pos * sizeof(*require_filter)) : NULL);\n    require_filter_full = require_filter + require_filter_len;\n    for (pos = 0; pos < require_filter_len; ++pos)\n\trequire_filter[pos] = FALSE;\n    for (pos = 0; pos < require_filter_full_len; ++pos)\n\trequire_filter_full[pos] = FALSE;\n\n    if (!increment) {\n\treplylist = NULL;\n\tsubjectlist = NULL;\n\tauthorlist = NULL;\n\tdatelist = NULL;\n    }\n\n    /* now what has this to do if readone is set or not? (Daniel) */\n    if (set_showprogress) {\n\tif (readone)\n\t    printf(\"%s\\n\", lang[MSG_READING_NEW_HEADER]);\n\telse {\n\t    if ((mbox && !strcasecmp(mbox, \"NONE\")) || use_stdin)\n\t\tprintf(\"%s...\\n\", lang[MSG_LOADING_MAILBOX]);\n\t    else\n\t\tprintf(\"%s \\\"%s\\\"...\\n\", lang[MSG_LOADING_MAILBOX], mbox);\n\t}\n    }\n\n    for ( ; fgets(line_buf, MAXLINE, fp) != NULL; \n\t  set_txtsuffix ? PushString(&raw_text_buf, line_buf) : 0) {\n#if DEBUG_PARSE\n        fprintf(stderr,\"\\n^IN: %s\", line_buf);\n        fprintf(stderr, \"^  BP %.0s: %.40s|\\n^  LP %.0s: %.40s|\\n^ ABP %.0s: %.40s|\\n^ ALP %.0s: %.40s|\\n^ OBP %.0s: %.40s|\\n^ \"\n                \"OLP %.0s: %.40s|\\n^HEAD %.0s: %.40s|\\n\",\n                \"bp\", (bp) ? bp->line : \"\",\n                \"lp\", (lp) ? lp->line : \"\",\n                \"alternative_bp\", (alternative_bp) ? alternative_bp->line : \"\",\n                \"alternative_lp\", (alternative_lp) ? alternative_lp->line : \"\",\n                \"origbp\", (origbp) ? origbp->line : \"\",\n                \"origlp\", (origlp) ? origlp->line : \"\",\n                \"headp\", (headp) ? headp->line : \"\");\t\n#endif \n\tif(set_append) {\n\t    if(fputs(line_buf, fpo) < 0) {\n\t        progerr(\"Can't write to \\\"mbox\\\"\"); /* revisit me */\n\t    }\n\t}\n\tline = line_buf + set_ietf_mbox;\n\n        if (skip_mime_epilogue) {\n            if (line[0] == '\\n') {\n                continue;\n            } else {\n                skip_mime_epilogue = FALSE;\n            }\n        }\n        \n\tif (!is_deleted &&\n\t    inlist_regex_pos(set_filter_out_full_body, line) != -1) {\n\t    is_deleted = FILTERED_OUT;\n\t}\n\tpos = inlist_regex_pos(set_filter_require_full_body, line);\n\tif (pos != -1 && pos < require_filter_full_len) {\n\t    require_filter_full[pos] = TRUE;\n\t}\n\tif (isinheader) {\n\t    if (!strncasecmp(line_buf, \"From \", 5))\n\t\tstrcpymax(fromdate, dp = getfromdate(line), DATESTRLEN);\n\t    /* check for MIME */\n\t    else if (!strncasecmp(line, \"MIME-Version:\", 13))\n\t\tMime_B = TRUE;\n\t    else if (isspace(line[0]) && ('\\n' != line[0]) \\\n\t\t     && !('\\r' == line[0] && '\\n' == line[1])) {\n\t\t/*\n\t\t * since this begins with a whitespace, it means the \n\t\t * previous line is continued on this line, leave only \n\t\t * one space character and go! \n\t\t */\n\t\tchar *ptr = line;\n\t\twhile (isspace(*ptr))\n\t\t    ptr++;\n\t\tptr--;\t\t/* leave one space */\n\t\t*ptr = ' ';\t/* make it a true space, no tabs here! */\n\t\tbp =\n\t\t    addbody(bp, &lp, ptr,\n\t\t\t    BODY_CONTINUE | BODY_HEADER | bodyflags);\n\t    }\n\n\t    else if (line[0] == '\\n' || (line[0] == '\\r' && line[1] == '\\n')) {\n\t\tstruct body *head;\n\n\t\tchar savealternative;\n\n\t\t/* \n\t\t * we mark this as a header-line, and we use it to \n\t\t * track end-of-header displays \n\t\t */\n\n\t\t/* skip the alternate \"\\n\", otherwise, we'll have\n\t\t   an extra \"\\n\" in the HTMLized message */\n\t\tif (!alternativeparser)\n\t\t    bp = addbody(bp, &lp, line, BODY_HEADER | bodyflags);\n\t\tisinheader--;\n\n\t\t/*\n\t\t * This signals us that we are no longer in the header, \n\t\t * let's fill in all those fields we are interested in. \n\t\t * Parse the headers up to now and copy to the target \n\t\t * variables \n\t\t */\n\n\t\tfor (head = bp; head; head = head->next) {\n\t\t    char head_name[128];\n\t\t    if (head->header && !head->demimed) {\n\t\t      head->line =\n\t\t\tmdecodeRFC2047(head->line, strlen(head->line),charsetsave);\n\t\t      head->demimed = TRUE;\n\t\t    }\n\n\t\t    if (head->parsedheader || head->attached ||\n\t\t\t!head->header) {\n\t\t\tcontinue;\n\t\t    }\n\t\t    if (!sscanf(head->line, \"%127[^:]\", head_name))\n\t\t        continue;\n\t\t    \n\t\t    if (inlist(set_deleted, head_name)) {\n\t\t        char *val = getsubject(head->line); /* revisit me */\n\t\t\tif (!strcasecmp(val, \"yes\"))\n\t\t\t    is_deleted = FILTERED_DELETE;\n\t\t\tfree(val);\n\t\t    }\n\n\t\t    if (inlist(set_expires, head_name)) {\n\t\t        char *val = getmaildate(head->line);\n\t\t\texp_time = convtoyearsecs(val);\n\t\t\tif (exp_time != -1 && exp_time < time(NULL))\n\t\t\t    is_deleted = FILTERED_EXPIRE;\n\t\t\tfree(val);\n\t\t    }\n\n\t\t    if (inlist(set_annotated, head_name)) {\n\t\t      getannotation(head->line, &annotation_content,\n\t\t\t\t    &annotation_robot);\n\t\t      if (annotation_content == ANNOTATION_CONTENT_DELETED_OTHER)\n\t\t\tis_deleted = FILTERED_DELETE_OTHER;\n\t\t      else if (annotation_content == ANNOTATION_CONTENT_DELETED_SPAM)\n\t\t\tis_deleted = FILTERED_DELETE;\n\t\t      head->parsedheader = TRUE;\n\t\t    }\n\n\t\t    if (!is_deleted &&\n\t\t\tinlist_regex_pos(set_filter_out, head->line) != -1) {\n\t\t        is_deleted = FILTERED_OUT;\n\t\t    }\n\n\t\t    pos = inlist_regex_pos(set_filter_require, head->line);\n\t\t    if (pos != -1 && pos < require_filter_len) {\n\t\t        require_filter[pos] = TRUE;\n\t\t    }\n\n\t\t    if (!strncasecmp(head->line, \"Date:\", 5)) {\n\t\t\tdate = getmaildate(head->line);\n\t\t\thead->parsedheader = TRUE;\n\t\t\thasdate = 1;\n\t\t    }\n\t\t    else if (!strncasecmp(head->line, \"From:\", 5)) {\n\t\t\tgetname(head->line, &namep, &emailp);\n\t\t\thead->parsedheader = TRUE;\n                        if (set_spamprotect) {\n\t\t\t    emailp = spamify(strsav(emailp));\n\t\t\t    /* we need to \"fix\" the name as well, as sometimes\n\t\t\t       the email ends up in the name part */\n\t\t\t    namep = spamify(strsav(namep));\n                        }\n\t\t    }\n\t\t    else if (!strncasecmp(head->line, \"Message-Id:\", 11)) {\n\t\t\tmsgid = getid(head->line);\n\t\t\thead->parsedheader = TRUE;\n\t\t    }\n\t\t    else if (!strncasecmp(head->line, \"Subject:\", 8)) {\n\t\t\tsubject = getsubject(head->line);\n\t\t\thassubject = 1;\n\t\t\thead->parsedheader = TRUE;\n\t\t    }\n\t\t    else if (!strncasecmp(head->line, \"In-Reply-To:\", 12)) {\n\t\t\tinreply = getreply(head->line);\n\t\t\thead->parsedheader = TRUE;\n\t\t    }\n\t\t    else if (!strncasecmp(head->line, \"References:\", 11)) {\n\t\t\t/*\n\t\t\t * Adding threading capability for the \"References\" \n\t\t\t * header, ala RFC 822, used only for messages that \n\t\t\t * have \"References\" but do not have an \"In-reply-to\"\n\t\t\t * field. This is partically a concession for Netscape's\n\t\t\t * email composer, which erroneously uses \"References\"\n\t\t\t * when it should use \"In-reply-to\". \n\t\t\t */\n\t\t\tif (!inreply)\n\t\t\t    inreply = getid(head->line);\n\t\t\tif (set_linkquotes) {\n\t\t\t    bp = addbody(bp, &lp, line, 0);\n\t\t\t}\n                        head->parsedheader = TRUE;\n\t\t    }\n                    else if (!strncasecmp(head->line, \"Content-Type:\", 13)) {\n                        content_type_p = head;\n                    }\n\t\t    else if (applemail_ua_header_len > 0\n                             && !strncasecmp(head_name, set_applemail_ua_header,\n                                             applemail_ua_header_len)) {\n                        /* we only need to set this one up once per message*/\n                        head->parsedheader = TRUE;\n                        if (alternativeparser\n                            || !Mime_B\n                            || set_save_alts\n                            || !set_applemail_mimehack) {\n                            continue;\n                        }\n                        \n                        /* If the UA is an apple mail client and we're configured to do the\n                         * applemail hack and we're not already configured to\n                         * save the alternatives, memorize the old setting and force\n                         * the alternatives save\n                         */\n                        if (!parse_multipart_alternative_force_save_alts\n                            && is_applemail_ua(head->line + applemail_ua_header_len + 2)) {\n\n                            parse_multipart_alternative_force_save_alts = 1;\n\n\t\t\t    /* to avoid confusion and quoting out of\n                            ** context, we won't show the alternatives\n                            ** in-line.\n                            */\n\n                            old_set_save_alts = set_save_alts;\n\t\t\t    set_save_alts = 2;\n\t\t\t    \n#if DEBUG_PARSE\n                            printf(\"Applemail_hack force save_alts: yes\\n\");\n\t\t\t    printf(\"Applemail_hack set_save_alts changed from %d to %d\\n\",\n                                   old_set_save_alts, set_save_alts);\n#endif\n                        }\n                    }\n                }\n                \n\t\tif (!is_deleted && set_delete_older && (date || fromdate)) {\n\t\t    time_t email_time = convtoyearsecs(date);\n\t\t    if (email_time == -1)\n\t\t        email_time = convtoyearsecs(fromdate);\n\t\t    if (email_time != -1 && email_time < delete_older_than)\n\t\t        is_deleted = FILTERED_OLD;\n\t\t}\n\t\tif (!is_deleted && set_delete_newer && (date || fromdate)) {\n\t\t    time_t email_time = convtoyearsecs(date);\n\t\t    if (email_time == -1)\n\t\t        email_time = convtoyearsecs(fromdate);\n\t\t    if (email_time != -1 && email_time > delete_newer_than)\n\t\t        is_deleted = FILTERED_NEW;\n\t\t}\n\n\t\tif (!headp)\n\t\t    headp = bp;\n\n\t\tsavealternative = FALSE;\n\t\tattach_force = FALSE;\n\n\t\tdescription = NULL;\n\t\tfor (head = headp; head; head = head->next) {\n\t\t    if (head->parsedheader || !head->header)\n\t\t\tcontinue;\n\t\t    /* Content-Description is defined ... where?? */\n\t\t    if (!strncasecmp(head->line, \"Content-Description:\", 20)) {\n\t\t\tchar *ptr = head->line;\n\t\t\tdescription = ptr + 21;\n\t\t    }\n\t\t    /* Content-Disposition is defined in RFC 2183 */\n\t\t    else\n\t\t\tif (!strncasecmp (head->line, \"Content-Disposition:\", 20)) {\n\t\t\tchar *ptr = head->line + 20;\n\t\t\tchar *fname;\n\t\t\tchar *jp;\n\t\t\tchar *np;\n\n\t\t\twhile (*ptr && isspace(*ptr))\n\t\t\t    ptr++;\n\t\t\tif (!strncasecmp(ptr, \"attachment;\", 11)\n\t\t\t    && (content != CONTENT_IGNORE)) {\n\t\t\t    /* signal we want to attach, rather than embeed this MIME \n\t\t\t       attachment */\n\t\t\t    if (inlist(set_ignore_types, \"$NONPLAIN\")\n\t\t\t\t|| inlist(set_ignore_types, \"$BINARY\"))\n                                content = CONTENT_IGNORE;\n\t\t\t    else {\n\t\t\t\tattach_force = TRUE;\n\n\t\t\t\t/* make sure it is binary */\n\t\t\t\tcontent = CONTENT_BINARY;\n\n\t\t\t\t/* see if there's a file name to use: */\n\t\t\t\tfname = strcasestr(ptr, \"filename=\");\n\t\t\t\tif (fname) {\n                                    np = fname+9;\n\t\t\t\t    if (*np == '\"')\n                                \tnp++;\n\t\t\t\t    for (jp = attachname; np && *np != '\\n'\n\t\t\t\t\t   && *np != '\"' && jp < attachname + sizeof(attachname) - 1;) {\n                                \t*jp++ = *np++;\n\t\t\t\t    }\n\t\t\t\t    *jp = '\\0';\n\t\t\t\t    safe_filename(attachname);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    attachname[0] = '\\0';  /* just clear it */\n\t\t\t\t}\n\t\t\t\tfile_created = MAKE_FILE; /* please make one */\n\t\t\t    }\n\t\t\t}\n#if 0\n/*\n** Why was this limited to just type image ? There are more inline types than just image.\n** I removed the image restriction and all of a sudden more attachments had the proper name.\n*/\n\n\t\t\telse if (!strncasecmp(ptr, \"inline;\", 7)\n\t\t\t\t && (content != CONTENT_IGNORE)\n\t\t\t\t && (!strncasecmp(type, \"image/\", 5))) {\t\n                          /* @@@ <-- here I should use the inline thingy */\n#endif\n\t\t\telse if (!strncasecmp(ptr, \"inline;\", 7)\n\t\t\t\t && (content != CONTENT_IGNORE)\n\t\t\t\t && inlinecontent(type)) {\n\t\t\t    inline_force = TRUE;\n\t\t\t    /* make sure it is binary */\n\t\t\t    content = CONTENT_BINARY;\n\t\t\t    /* see if there's a file name to use: */\n\t\t\t    fname = strcasestr(ptr, \"filename=\");\n\t\t\t    if (fname) {\n                                np = fname+9;\n                                if (*np == '\"')\n                                     np++;\n                                for (jp = attachname; np && *np != '\\n' && *np != '\"'\n\t\t\t\t       && jp < attachname + sizeof(attachname) - 1;) {\n                                     *jp++ = *np++;\n                                }\n                                *jp = '\\0';\n\t\t\t\tsafe_filename(attachname);\n\t\t\t    }\n\t\t\t    else {\n\t\t\t\tattachname[0] = '\\0';\t/* just clear it */\n\t\t\t    }\n\t\t\t    file_created = MAKE_FILE;\t/* please make one */\n\t\t\t} /* inline */\n                        } /* Content-Disposition: */\n\t\t    else if (!strncasecmp(head->line, \"Content-Base:\", 13)) {\n#ifdef NOTUSED\n\t\t\tchar *ptr = head->line + 13;\n#endif\n                        content=CONTENT_IGNORE;\n\t\t\t/* we must make sure this is not parsed more times\n\t\t\t   than this */\n\t\t\thead->parsedheader = TRUE;\n\n                    }\n\t\t    else if (!strncasecmp(head->line, \"Content-Type:\", 13)) {\n\t\t\tchar *ptr = head->line + 13;\n#define DISP_HREF 1\n#define DISP_IMG  2\n#define DISP_IGNORE 3\n\t\t\t/* we must make sure this is not parsed more times\n\t\t\t   than this */\n\t\t\thead->parsedheader = TRUE;\n\n\t\t\twhile (isspace(*ptr))\n\t\t\t    ptr++;\n\n\t\t\tsscanf(ptr, \"%128[^;]\", type);\n\t\t\tcp = type + strlen(type) - 1;\n\t\t\twhile (cp > type && isspace(*cp)) {\n\t\t\t    *cp = '\\0';\t/* rm newlines, etc */\n\t\t\t    --cp;\n\t\t\t}\n\n\t\t\t/* now, check if there's a charset indicator here too! */\n\t\t\tcp = strcasestr(ptr, \"charset=\");\n\t\t\tif (cp) {\n\t\t\t    cp += 8;\t/* pass charset= */\n\t\t\t    if ('\\\"' == *cp)\n\t\t\t\tcp++;\t/* pass a quote too if one is there */\n\n\t\t\t    sscanf(cp, \"%128[^;\\\"\\n]\", charbuffer);\n\t\t\t    /* save the charset info */\n\t\t\t    charset = strsav(charbuffer);\n\t\t\t}\n\n\t\t\t/* now check if there's a format indicator */\n\t\t\tif (set_format_flowed) {\n\t\t\t  cp = strcasestr(ptr, \"format=\");\n\t\t\t  if (cp) {\n\t\t\t    cp += 7;\t/* pass charset= */\n\t\t\t    if ('\\\"' == *cp)\n\t\t\t      cp++;\t/* pass a quote too if one is there */\n\t\t\t    \n\t\t\t    sscanf(cp, \"%128[^;\\\"\\n]\", charbuffer);\n\t\t\t    /* save the format info */\n\t\t\t    if (!strcasecmp (charbuffer, \"flowed\"))\n\t\t\t      textplain_format = FORMAT_FLOWED;\n\t\t\t  }\n\t\t\t  \n\t\t\t  /* now check if there's a delsp indicator */\t\t\t\n\t\t\t  cp = strcasestr(ptr, \"delsp=\");\n\t\t\t  if (cp) {\n\t\t\t    cp += 6;\t/* pass charset= */\n\t\t\t    if ('\\\"' == *cp)\n\t\t\t      cp++;\t/* pass a quote too if one is there */\n\t\t\t    \n\t\t\t    sscanf(cp, \"%128[^;\\\"\\n]\", charbuffer);\n\t\t\t    /* save the delsp info */\n\t\t\t    if (!strcasecmp (charbuffer, \"yes\"))\n\t\t\t      delsp_flag = TRUE;\n\t\t\t  }\n\t\t\t}\n\n\t\t\tif (alternativeparser) {\n\t\t\t    struct body *next;\n\t\t\t    struct body *temp_bp = NULL;\n                            \n\t\t\t    /* We are parsing alternatives... */\n\n                            if (parse_multipart_alternative_force_save_alts\n                                && multipartp\n                                && !strcasecmp(multipartp->line, \"multipart/alternative\")\n                                && *last_alternative_type\n                                && !strcasecmp(last_alternative_type, \"text/plain\")) {\n                            \n                                /* if the UA is Apple mail and if the only\n                                ** alternatives are text/plain and\n                                ** text/html and if the preference is\n                                ** text/plain, skip the text/html version\n                                ** if the applemail_hack is enabled\n                                */\n                                if (!strcasecmp(type, \"text/html\")) {\n#if DEBUG_PARSE\n                                    fprintf(stderr, \"Discarding apparently equivalent text//html alternative\\n\");\n#endif\n                                    content = CONTENT_IGNORE;\n                                    break;\n                                }\n                            }\n                            \n\t\t\t    if (preferedcontent(&alternative_weight, type, decode)) {\n\t\t\t\t/* ... this is a prefered type, we want to store\n\t\t\t\t   this [instead of the earlier one]. */\n\t\t\t\t/* erase the previous alternative info */\n\t\t\t\ttemp_bp = alternative_bp;\t/* remember the value of bp for GC */\n\t\t\t\talternative_bp = alternative_lp = NULL;\n                                if (prefered_content_charset) {\n                                    free(prefered_content_charset);\n                                }\n                                prefered_content_charset = strsav (charset);                                \n                                strncpy(last_alternative_type, type,\n                                        sizeof(last_alternative_type) - 1);\n#ifdef DEBUG_PARSE\n                                fprintf(stderr, \"setting new prefered alternative charset to %s\\n\", charset);\n#endif\n\n\t\t\t\talternative_lastfile_created = NO_FILE;\n\t\t\t\tcontent = CONTENT_UNKNOWN;\n\t\t\t\tif (alternative_lastfile[0] != '\\0') {\n\t\t\t\t    /* remove the previous attachment */\n\t\t\t\t    unlink(alternative_lastfile);\n\t\t\t\t    alternative_lastfile[0] = '\\0';\n\t\t\t\t}\n\t\t\t    }\n                            else if (set_save_alts == 2) {\n                                content = CONTENT_BINARY;\n                            } else {\n\t\t\t\t/* ...and this type is not a prefered one. Thus, we\n\t\t\t\t * shall ignore it completely! */\n\t\t\t\tcontent = CONTENT_IGNORE;\n                                /* erase the current alternative info */\n\t\t\t\ttemp_bp = bp;\t/* remember the value of bp for GC */\n\t\t\t\tlp = alternative_lp;\n\t\t\t\tbp = alternative_bp;\n\t\t\t\tstrcpy(alternative_file,\n\t\t\t\t       alternative_lastfile);\n\t\t\t\tfile_created =\n\t\t\t\t    alternative_lastfile_created;\n\t\t\t\talternative_bp = alternative_lp = NULL;\n\t\t\t\talternative_lastfile_created = NO_FILE;\n\t\t\t\talternative_lastfile[0] = '\\0';\n\t\t\t\t/* we haven't yet created any attachment file, so there's no need\n\t\t\t\t   to erase it yet */\n                            }\n                            \n\t\t\t    /* free any previous alternative */\n\t\t\t    while (temp_bp) {\n\t\t\t\tnext = temp_bp->next;\n\t\t\t\tif (temp_bp->line)\n\t\t\t\t    free(temp_bp->line);\n\t\t\t\tfree(temp_bp);\n\t\t\t\ttemp_bp = next;\n\t\t\t    }\n\n\t\t\t    /* @@ not sure if I should add a diff flag to do this break */\n\t\t\t    if (content == CONTENT_IGNORE)\n\t\t\t\t/* end the header parsing... we already know what we want */\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (content == CONTENT_IGNORE)\n\t\t\t    continue;\n\t\t\telse if (ignorecontent(type))\n\t\t\t    /* don't save this */\n\t\t\t    content = CONTENT_IGNORE;\n\t\t\telse if (textcontent(type)\n\t\t\t\t || (inlinehtml &&\n\t\t\t\t     !strcasecmp(type, \"text/html\"))) {\n\t\t\t    /* text content or text/html follows.\n\t\t\t     */\n\n\t\t\t    if (set_save_alts && alternativeparser\n\t\t\t\t&& content == CONTENT_BINARY) {\n\t\t\t\tfile_created = MAKE_FILE; /* please make one */\n\t\t\t\tdescription = set_alts_text ? set_alts_text\n\t\t\t\t  : \"alternate version of message\";\n\t\t\t\tif (strlen(description) >= sizeof(attachname))\n\t\t\t\t  progerr(\"alts_text too long\");\n\t\t\t\tstrcpy(attachname, description);\n\t\t\t\tsafe_filename(attachname);\n\t\t\t    }\n\t\t\t    else if (!strcasecmp(type, \"text/html\"))\n\t\t\t\tcontent = CONTENT_HTML;\n\t\t\t    else\n\t\t\t\tcontent = CONTENT_TEXT;\n                            \n\t\t\t    if (!alternativeparser && !prefered_content_charset) {\n                                /* there are apparently no\n                                   alternatives in this message, let's\n                                   use the first text/* charset we\n                                   found as the prefered one */\n                                prefered_content_charset = strsav (charset);\n                            }\n                            \n\t\t\t    continue;\n\t\t\t}\n\t\t\telse if (!strncasecmp(type, \"message/rfc822\", 14)) {\n\t\t\t    /* \n\t\t\t     * Here comes an attached mail! This can be ugly, \n\t\t\t     * since the attached mail may very well itself \n\t\t\t     * contain attached binaries, or why not another \n\t\t\t     * attached mail? :-)\n\t\t\t     *\n\t\t\t     * We need to store the current boundary separator \n\t\t\t     * in order to get it back when we're done parsing \n\t\t\t     * this particular mail, since each attached mail \n\t\t\t     * will have its own boundary separator that *might*\n\t\t\t     * be used.\n\t\t\t     */\n\t\t\t    bp = addbody(bp, &lp,\n\t\t\t\t\t \"<p><strong>attached mail follows:</strong></p><hr />\",\n\t\t\t\t\t BODY_HTMLIZED | bodyflags);\n\t\t\t    bodyflags |= BODY_ATTACHED;\n\t\t\t    /* @@ should it be 1 or 2 ?? should we use another method? */\n#if 0\n\t\t\t    isinheader = 2;\n#endif\n\t\t\t    isinheader = 1;\n\t\t\t    continue;\n\t\t\t}\n\t\t\telse if (strncasecmp(type, \"multipart/\", 10)) {\n\t\t\t    /* \n\t\t\t     * This is not a multipart and not text \n\t\t\t     */\n\t\t\t    char *fname = NULL;\t/* attachment filename */\n\n\t\t\t    /* \n                             * only do anything here if we're not \n                             * ignoring this content \n                             */\n\t\t\t    if (CONTENT_IGNORE != content) {\n\n\t\t\t\tfname = strcasestr(ptr, \"name=\");\n\t\t\t\tif (fname) {\n\t\t\t\t    fname += 5;\n\t\t\t\t    if ('\\\"' == *fname)\n\t\t\t\t\tfname++;\n\t\t\t\t    sscanf(fname, \"%128[^\\\"]\", attachname);\n\t\t\t\t    safe_filename(attachname);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    attachname[0] = '\\0';\t/* just clear it */\n\t\t\t\t}\n\n\t\t\t\tfile_created = MAKE_FILE;\t/* please make one */\n\n\t\t\t\tcontent = CONTENT_BINARY;\t/* uknown turns into binary */\n\t\t\t    }\n\t\t\t    continue;\n\t\t\t}\n\t\t\telse {\n\t\t\t    /*\n\t\t\t     * Find the first boundary separator \n\t\t\t     */\n\n\t\t\t    struct body *tmpbp;\n\t\t\t    struct body *tmplp;\n\t\t\t    \n\t\t\t    boundary_id = strcasestr(ptr, \"boundary=\");\n#if DEBUG_PARSE\n\t\t\t    printf(\"boundary found in %s\\n\", ptr);\n#endif\n\t\t\t    if (boundary_id) {\n\t\t\t\tboundary_id = strchr(boundary_id, '=');\n\t\t\t\tif (boundary_id) {\n\t\t\t\t    boundary_id++;\n\t\t\t\t    while (isspace(*boundary_id))\n\t\t\t\t\tboundary_id++;\n\t\t\t\t    if ('\\\"' == *boundary_id) {\n\t\t\t\t\tsscanf(++boundary_id, \"%255[^\\\"]\",\n\t\t\t\t\t       boundbuffer);\n\t\t\t\t    }\n\t\t\t\t    else\n\t\t\t\t\tsscanf(boundary_id, \"%255[^;\\n]\",\n\t\t\t\t\t       boundbuffer);\n\t\t\t\t    boundary_id = boundbuffer;\n\t\t\t\t}\n\n\t\t\t\t/* restart on a new list: */\n\t\t\t\ttmpbp = tmplp = NULL;\n\t\t\t\n\t\t\t\twhile (fgets(line_buf, MAXLINE, fp)) {\n\t\t\t\t    if(set_append) {\n\t\t\t\t        if(fputs(line_buf, fpo) < 0) {\n\t\t\t\t\t    progerr(\"Can't write to \\\"mbox\\\"\"); /* revisit me */\n\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t    if (!strncmp(line_buf + set_ietf_mbox, \"--\", 2) &&\n\t\t\t\t\t!strncmp(line_buf + set_ietf_mbox + 2, boundbuffer,\n\t\t\t\t\t\t strlen(boundbuffer))) {\n\t\t\t\t\tbreak;\n\t\t\t\t    }\n\t\t\t\t    if (!strncasecmp(line_buf, \"From \", 5)) {\n#if DEBUG_PARSE\n\t\t\t\t\tprintf(\"Error, new message found instead of boundary!\\n\");\n#endif\n\t\t\t\t        isinheader = 0;\n\t\t\t\t\tif (tmpbp)\n\t\t\t\t\t  bp = append_body(bp, &lp, tmpbp);\n\t\t\t\t\tboundary_id = NULL;\n\t\t\t\t\tgoto leave_header;\n\t\t\t\t    }\n\t\t\t\t    /* save lines in case no boundary found */\n\t\t\t\t    tmpbp = addbody(tmpbp, &tmplp, line_buf, bodyflags);\n\t\t\t\t}\n\t\t\t\tif (!strncmp(line_buf + set_ietf_mbox + 2 + strlen(boundary_id), \"--\", 2)\n\t\t\t\t    && tmpbp) {\n#if DEBUG_PARSE\n\t\t\t\t    printf(\"Error, end of mime found before mime start!\\n\");\n#endif\n\t\t\t\t    /* end of mime found before mime start */\n\t\t\t\t    bp = append_body(bp, &lp, tmpbp);\n\t\t\t\t    boundary_id = NULL;\n\t\t\t\t    goto leave_header;\n\t\t\t\t}\n\t\t\t\tfree_body(tmpbp);\n\n\t\t\t\t/* \n\t\t\t\t * This stores the boundary string in a stack \n\t\t\t\t * of strings: \n\t\t\t\t */\n\t\t\t\tboundp = bound(boundp, boundbuffer);\n                                multipartp = multipart(multipartp, type);\n                                skip_mime_epilogue = FALSE;\n                                \n\t\t\t\t/* printf(\"set new boundary: %s\\n\", boundp->line); */\n\n                                /* @@JK Take into account errors when we abort, malformed mime, etc,\n                                 probably put this call up, before detecting errors? */\n                                charsetsp = charsets(charsetsp, charset, charsetsave);\n#ifdef DEBUG_PARSE                                \n                                fprintf(stderr, \"pushing charset %s and charsetsave %s\\n\", charset, charsetsave);\n#endif\n                                    if (charset) {\n                                        free(charset);\n\t\t\t\t\tcharset = NULL;\n                                    }\n                                    charsetsave[0] = '\\0';\n\n#ifdef DEBUG_PARSE\n                                    fprintf(stderr, \"restoring parents charset %s and charsetsave %s\\n\", charset, charsetsave); \n#endif\n\n\t\t\t\t/*\n\t\t\t\t * We set ourselves, \"back in header\" since there is\n\t\t\t\t * gonna come MIME headers now after the separator\n\t\t\t\t */\n\t\t\t\tisinheader = 1;\n\n\t\t\t\t/* Daniel Stenberg started adding the\n\t\t\t\t * \"multipart/alternative\" parser 13th of July\n\t\t\t\t * 1998!  We check if this is a 'multipart/\n\t\t\t\t * alternative' header, in which case we need to\n\t\t\t\t * treat it very special.  \n\t\t\t\t */\n\n\t\t\t\tif (!strncasecmp\n\t\t\t\t    (&ptr[10], \"alternative\", 11)) {\n\t\t\t\t    /* It *is* an alternative session!  Alternative\n\t\t\t\t     * means there will be X parts with the same text\n\t\t\t\t     * using different content-types. We are supposed\n\t\t\t\t     * to take the most prefered format of the ones\n\t\t\t\t     * used and only output that one. MIME defines\n\t\t\t\t     * the order of the texts to start with pure text\n\t\t\t\t     * and then continue with more and more obscure\n\t\t\t\t     * formats. (well, it doesn't use those terms but\n\t\t\t\t     * that's what it means! ;-)) \n\t\t\t\t     */\n\n\t\t\t\t    /* How \"we\" are gonna deal with them:\n\t\t\t\t     *\n\t\t\t\t     * We create a \"spare\" linked list body for the\n\t\t\t\t     * very first part. Since the first part is\n\t\t\t\t     * defined to be the most readable, we save that\n\t\t\t\t     * in case no content-type present is prefered!\n\t\t\t\t     *\n\t\t\t\t     * We skip all parts that are not prefered. All\n\t\t\t\t     * prefered parts found will replace the first\n\t\t\t\t     * one that is saved. When we reach the end of\n\t\t\t\t     * the alternatives, we will use the last saved\n\t\t\t\t     * one as prefered.\n\t\t\t\t     */\n\n\t\t\t\t    savealternative = TRUE;\n#if DEBUG_PARSE\n\t\t\t\t    printf(\"SAVEALTERNATIVE: yes\\n\");\n#endif\n                                }\n\n\t\t\t    }\n\t\t\t    else\n\t\t\t\tboundary_id = NULL;\n\t\t\t}\n\t\t    }\n\t\t    else \n\t\t\tif (!strncasecmp\n\t\t\t    (head->line, \"Content-Transfer-Encoding:\", 26)) {\n\t\t\tchar *ptr = head->line + 26;\n\n\t\t\thead->parsedheader = TRUE;\n\t\t\twhile (isspace(*ptr))\n\t\t\t    ptr++;\n\t\t\tif (!strncasecmp(ptr, \"QUOTED-PRINTABLE\", 16)) {\n\t\t\t    decode = ENCODE_QP;\n\t\t\t}\n\t\t\telse if (!strncasecmp(ptr, \"BASE64\", 6)) {\n\t\t\t    decode = ENCODE_BASE64;\n\t\t\t}\n\t\t\telse if (!strncasecmp(ptr, \"8BIT\", 4)) {\n\t\t\t    decode = ENCODE_NORMAL;\n\t\t\t}\n\t\t\telse if (!strncasecmp(ptr, \"7BIT\", 4)) {\n\t\t\t    decode = ENCODE_NORMAL;\n\t\t\t}\n\t\t\telse if (!strncasecmp(ptr, \"x-uue\", 5)) {\n\t\t\t    decode = ENCODE_UUENCODE;\n\t\t\t    if (!do_uudecode(fp, line, line_buf,\n\t\t\t\t\t     &raw_text_buf, fpo))\n\t\t\t        break;\n\t\t\t}\n\t\t\telse {\n\t\t\t    /* Unknown format, we use default decoding */\n\t\t\t    char code[64];\n\n\t\t\t    /* is there any value for content-encoding or is it missing? */\n\t\t\t    if (sscanf(ptr, \"%63s\", code) != EOF) {\n\t\t\t      \n\t\t\t      snprintf(line, sizeof(line_buf) - set_ietf_mbox,\n\t\t\t\t       \" ('%s' %s)\\n\", code, \n\t\t\t\t       lang[MSG_ENCODING_IS_NOT_SUPPORTED]);\n\n\t\t\t      bp = addbody(bp, &lp, line,\n\t\t\t\t\t   BODY_HTMLIZED | bodyflags);\n\n#if DEBUG_PARSE\n\t\t\t      printf(\"Ignoring unknown Content-Transfer-Encoding: %s\\n\", code);\n#endif\n\t\t\t    } else {\n#if DEBUG_PARSE\n\t\t\t      printf(\"Missing Content-Transfer-Encoding value\\n\");\n#endif\n\t\t\t    }\n\t\t\t}\n#if DEBUG_PARSE\n\t\t\tprintf(\"DECODE set to %d\\n\", decode);\n#endif\n\t\t    }\n\t\t}\n\n\t\t/* @@@ here we try to do a post parsing cleanup */\n\t\t/* have to find out all the conditions to turn it off */\n\t\tif (attach_force) {\n\t\t    savealternative = FALSE;\n\t\t    isinheader = 0;\n\t\t}\n\n\t\tif (savealternative) {\n\t\t    /* let's remember 'bp' and 'lp' */\n\n\t\t    origbp = bp;\n\t\t    origlp = lp;\n\n\t\t    alternativeparser = TRUE;\n\t\t    /* restart on a new list: */\n\t\t    lp = bp = NULL;\n\t\t    /* clean the alternative status variables */\n\t\t    alternative_weight = -1;\n\t\t    alternative_lp = alternative_bp = NULL;\n\t\t    alternative_lastfile_created = NO_FILE;\n\t\t    alternative_file[0] = alternative_lastfile[0] = '\\0';\n                    last_alternative_type[0] = '\\0';\n\t\t}\n\t\theadp = lp;\t/* start at this point next time */\n\t    }\n\t    else {\n\t\tbp = addbody(bp, &lp, line, BODY_HEADER | bodyflags);\n\t    }\n\t}\n\telse {\n\n\t    /* not in header */\n\tleave_header:\n\t    /* If this isn't a single mail: see if the line is a message\n\t     * separator. If there is a \"^From \" found, check to see if there\n\t     * is a valid date field in the line. If not then consider it a\n\t     * part of the body of the message and skip it.\n\t     * Daniel: I don't like this. I don't think there is something like\n\t     * \"a valid date field\" in that line 100%.\n\t     */\n\t    if (!readone &&\n\t\t!strncmp(line_buf, \"From \", 5) &&\n\t\t(*(dp = getfromdate(line)) != '\\0')) {\n\t\tif (-1 != binfile) {\n\t\t    close(binfile);\n\t\t    binfile = -1;\n\t\t}\n\n                /* as long as we don't handle UTF-8 throughout), use the prefered\n                   content charset if we got one  */\n                if (prefered_content_charset) {\n                    if (charset) {\n                        free(charset);\n                    }\n                    charset = prefered_content_charset;\n                    prefered_content_charset = NULL;\n                }\n\n#ifdef HAVE_ICONV\n\t\tif (!charset) {\n                    if (*charsetsave!=0){\n#ifdef DEBUG_PARSE\n                        printf(\"put charset from subject header..\\n\");\n#endif\n                        charset=strsav(charsetsave);\n                    } else{\n                        /* default charset for plain/text is US-ASCII */\n                        /* ISO-8859-1 is modern, however (DM) */\n                        charset=strsav(\"US-ASCII\");\n#ifdef DEBUG_PARSE\n                        fprintf(stderr, \"found no charset for body, set ISO-8859-1.\\n\");\n#endif\n                    }\n\t\t} else {\n                    /* if body is us-ascii but subject is not,\n                       try to use subject's charset. */\n                    if (strncasecmp(charset,\"us-ascii\",8)==0){\n                        if (*charsetsave!=0 && strcasecmp(charsetsave,\"us-ascii\")!=0){\n                            free(charset);\n                            charset=strsav(charsetsave);\n                        }\n                    }\n\t\t}\n#endif\n\n#ifdef DEBUG_PARSE\n                fprintf(stderr, \"Message will be stored using charset %s\\n\", charset);\n#endif\n                \n\t\tisinheader = 1;\n\t\tif (!hassubject)\n\t\t    subject = NOSUBJECT;\n\t\telse\n\t\t    hassubject = 1;\n\n\t\tif (!hasdate)\n\t\t    date = NODATE;\n\t\telse\n\t\t    hasdate = 1;\n\n\t\tif (!inreply)\n\t\t    inreply = oneunre(subject);\n\n\t\t/* control the use of format and delsp according to RFC 3676 */\n\t\tif (textplain_format == FORMAT_FLOWED \n\t\t    && content != CONTENT_TEXT\n\t\t    || (content == CONTENT_TEXT && strcasecmp (type, \"text/plain\"))) {\n\t\t  /* format flowed only allowed on text/plain */\n\t\t  textplain_format = FORMAT_FIXED;\n\t\t}\n\n\t\tif (textplain_format == FORMAT_FIXED && delsp_flag) {\n                    /* delsp only accepted for format=flowed */\n                    delsp_flag = FALSE;\n\t\t}\n\n\t\tif (append_bp && append_bp != bp) {\n                    /* if we had attachments, close the structure */\n                    append_bp = \n                        addbody(append_bp, &append_lp, \"</div>\\n\",\n                                BODY_HTMLIZED | bodyflags);\n                    bp = append_body(bp, &lp, append_bp);\n\t\t    append_bp = append_lp = NULL;\n\t\t}\n\t\telse if(!bp)\t/* probably never used */\n\t\t    bp = addbody(bp, &lp, \"Hypermail was not able \"\n\t\t\t\t \"to parse this message correctly.\\n\",\n\t\t\t\t bodyflags);\n\n\t\twhile (rmlastlines(bp));\n\n\t\tif (set_mbox_shortened && !increment && num == startnum\n\t\t    && max_msgnum >= set_startmsgnum) {\n\t\t    emp = hashlookupbymsgid(msgid);\n\t\t    if (!emp) {\n\t\t      snprintf(errmsg, sizeof(errmsg),\n\t\t\t       \"Message with msgid '%s' not found in .hm2index\",\nmsgid);\n\t\t      progerr(errmsg);\n\t\t    }\n\t\t    num = emp->msgnum;\n\t\t    num_added = insert_older_msgs(num);\n\t\t}\n\t\temp = NULL;\n\t\tif (set_mbox_shortened) {\n\t\t    if (hashnumlookup(num, &emp)) {\n\t\t\tif(strcmp(msgid, emp->msgid)\n\t\t\t   && !strstr(emp->msgid, \"hypermail.dummy\")) {\n\t\t\t    snprintf(errmsg, sizeof(errmsg),\n\t\t\t\t     \"msgid mismatch %s %s\", msgid, emp->msgid);\n\t\t\t    progerr(errmsg);\n\t\t\t}\n\t\t    }\n\t\t}\n\t\tif (!emp)\n\t\t  emp =\n\t\t    addhash(num, date, namep, emailp, msgid, subject,\n\t\t\t    inreply, fromdate, charset, NULL, NULL, bp);\n                /* \n                 * dp, if it has a value, has a date from the \"From \" line of\n                 * the message after the one we are just finishing. \n                 * SMR 19 Oct 99: moved this *after* the addhash() call so it\n                 * isn't erroneously associate with the previous message \n                 */\n   \n                strcpymax(fromdate, dp ? dp : \"\", DATESTRLEN);\n\n\t\tif (emp) {\n\t\t    emp->exp_time = exp_time;\n\t\t    emp->is_deleted = is_deleted;\n\t\t    emp->annotation_robot = annotation_robot;\n\t\t    emp->annotation_content = annotation_content;\n\n\t\t    if (insert_in_lists(emp, require_filter,\n\t\t\t\t\trequire_filter_len + require_filter_full_len))\n\t\t        ++num_added;\n\t\t    num++;\n\t\t}\n\t\telse if (att_dir != NULL) {\n\t\t    emptydir(att_dir);\n\t\t    rmdir(att_dir);\n\t\t}\n\t\tfor (pos = 0; pos < require_filter_len; ++pos)\n\t\t    require_filter[pos] = FALSE;\n\t\tfor (pos = 0; pos < require_filter_full_len; ++pos)\n\t\t    require_filter_full[pos] = FALSE;\n\t\tif (set_txtsuffix && emp && set_increment != -1)\n\t\t    write_txt_file(emp, &raw_text_buf);\n\n\t\tif (hasdate)\n\t\t    free(date);\n\t\tif (hassubject)\n\t\t    free(subject);\n\t\tif (inreply) {\n\t\t    free(inreply);\n\t\t    inreply = NULL;\n\t\t}\n\t\tif (charset) {\n\t\t    free(charset);\n\t\t    charset = NULL;\n\t\t}\n\t\tif (charsetsave){\n\t\t  *charsetsave = 0;\n\t\t}\n                if (prefered_content_charset) {\n                    free(prefered_content_charset);\n                    prefered_content_charset = NULL;\n                }\n\t\tif (msgid) {\n\t\t    free(msgid);\n\t\t    msgid = NULL;\n\t\t}\n\t\tif (namep) {\n\t\t    free(namep);\n\t\t    namep = NULL;\n\t\t}\n\t\tif (emailp) {\n\t\t    free(emailp);\n\t\t    emailp = NULL;\n\t\t}\n\n\t\tbp = NULL;\n\t\tbodyflags = 0;\t/* reset state flags */\n\n\t\t/* reset related RFC 3676 state flags */\n\t\ttextplain_format = FORMAT_FIXED;\n\t\tdelsp_flag = FALSE;\n\t\tflowed_line = FALSE;\n\t\tquotelevel = 0;\n\t\tcontinue_previous_flow_flag = FALSE;\n\n\t\t/* go back to default mode: */\n\t\tcontent = CONTENT_TEXT;\n\t\tdecode = ENCODE_NORMAL;\n\t\tMime_B = FALSE;\n                skip_mime_epilogue = FALSE;\n\t\theadp = NULL;\n                content_type_p = NULL;\n\t\tmultilinenoend = FALSE;\n\t\tif (att_dir) {\n\t\t    free(att_dir);\n\t\t    att_dir = NULL;\n\t\t}\n\t\tif (set_usemeta && meta_dir) {\n\t\t    free(meta_dir);\n\t\t    meta_dir = NULL;\n\t\t}\n\t\tatt_counter = 0;\n\t\tatt_name_list = NULL;\n\t\tinline_force = FALSE;\n\t\tattachname[0] = '\\0';\n\n\t\t/* by default we have none! */\n\t\thassubject = 0;\n\t\thasdate = 0;\n\n\t\tannotation_robot = ANNOTATION_ROBOT_NONE;\n\t\tannotation_content = ANNOTATION_CONTENT_NONE;\n\n\t\tis_deleted = 0;\n\t\texp_time = -1;\n\n\t\tfree_bound (boundp);\n\t\tboundp = NULL;\n\t\t\n\t\tfree_multipart (multipartp);\n\t\tmultipartp = NULL;\n\n                free_charsets (charsetsp);\n                charsetsp = NULL;\n                \n                alternativeparser = FALSE; /* there is none anymore */\n\n\t\tif (parse_multipart_alternative_force_save_alts) {\n                    parse_multipart_alternative_force_save_alts = 0;\n                    \n#if DEBUG_PARSE\n                    printf(\"Applemail_hack resetting parse_multipart_alternative_force_save_alts\\n\");\n#endif\n                    if (old_set_save_alts != -1) {\n                        set_save_alts = old_set_save_alts;\n                        old_set_save_alts = -1;\n#if DEBUG_PARSE                        \n                        printf(\"Applemail_hack resetting save_alts to %d\\n\", old_set_save_alts);\n#endif                        \n                    }\n\t\t}\n                \n\t\tif (!(num % 10) && set_showprogress && !readone) {\n\t\t    print_progress(num - startnum, NULL, NULL);\n\t\t}\n#if DEBUG_PARSE\n\t\tprintf(\"LAST: %s\", line);\n#endif\n\t    }\n\t    else {\t\t/* decode MIME complient gibberish */\n\t\tchar newbuffer[MAXLINE];\n\t\tchar *data;\n\t\tint datalen = -1;\t/* -1 means use strlen to get length */\n\n\t\tif (set_linkquotes && !inreply) { /* why only if set_linkquotes? pcm */\n\t\t    char *new_inreply = getreply(line);\n\t\t    if (new_inreply && !*new_inreply) free(new_inreply);\n\t\t    else inreply = new_inreply;\n\t\t}\n    \n\t\tif (Mime_B) {\n\t\t    if (boundp &&\n\t\t\t!strncmp(line, \"--\", 2) &&\n\t\t\t!strncmp(line + 2, boundp->line,\n\t\t\t\t strlen(boundp->line))) {\n\t\t\t/* right at this point, we have another part coming up */\n#if DEBUG_PARSE\n\t\t\tprintf(\"hit %s\\n\", line);\n#endif\n\t\t\tif (!strncmp(line + 2 + strlen(boundp->line), \"--\", 2)) {\n\t\t\t  /* @@@ don't know why we had this line here. Doesn't hurt to take\n\t\t\t       it out, though */\n#if 0\n\t\t\t    bp = addbody(bp, &lp, \"\\n\",\n\t\t\t\t\tBODY_HTMLIZED | bodyflags);\n#endif\n\t\t\t    isinheader = 0;\t/* no header, the ending boundary\n\t\t\t\t\t\t   can't have any describing\n\t\t\t\t\t\t   headers */\n\n#if DEBUG_PARSE\n\t\t\t    printf(\"End boundary %s\\n\", line);\n                            printf(\"alternativeparser %d\\n\", alternativeparser);\n                            printf(\"has_more_alternatives %d\\n\", has_multipart(multipartp, \"multipart/alternative\"));\n#endif\n\n\t\t\t    boundp = bound(boundp, NULL);\n\t\t\t    if (!boundp) {\n\t\t\t\tbodyflags &= ~BODY_ATTACHED;\n                            }\n                            /* skip the MIME epilogue until the next section (or next message!) */\n                            skip_mime_epilogue = TRUE;\n\t\t\t    multipartp = multipart(multipartp, NULL);\n\n                            /* retrieve the parent's charset and charsetsave  */\n                            if (charsetsp->prev != NULL) {\n                                charsetsp = charsets(charsetsp, NULL, NULL);\n                            }\n                            if (charsetsp) {\n                                if (charset) {\n                                    free(charset);\n                                    if (charsetsp) {\n                                        charset = (charsetsp->charset) ? strsav (charsetsp->charset) : NULL;\t\t\t    }\n                                } else {\n                                    charsetsave[0]='\\0';\n                                }\n                                strcpy (charsetsave, charsetsp->charsetsave);\n                            }\n#ifdef DEBUG_PARSE\n                            fprintf(stderr, \"Pulling charset %s and charsetsave %s\\n\", charset, charsetsave);\n#endif                            \n                            if (!boundp && charsetsp->prev == NULL) {\n#ifdef DEBUG_PARSE\n                                fprintf(stderr, \"No more MIME parts, freeing charsetsp\\n\");\n#endif\n                                free_charsets(charsetsp);\n\n                                charsetsp = NULL;\n                            }\n                            \n\t\t\t    if (alternativeparser\n\t\t\t\t&& !has_multipart(multipartp, \"multipart/alternative\")) {\n#ifdef NOTUSED\n\t\t\t\tstruct body *next;\n#endif\n\t\t\t\t\n#if DEBUG_PARSE\n\t\t\t\tprintf(\"We no longer have alternatives\\n\");\n#endif\n\n\t\t\t\t/* we no longer have alternatives */\n\t\t\t\talternativeparser = FALSE;\n\t\t\t\t/* reset the alternative variables (I think we can skip\n\t\t\t\t   this step without problems */\n\t\t\t\talternative_weight = -1;\n\t\t\t\talternative_bp = NULL;\n\t\t\t\talternative_lastfile_created = NO_FILE;\n\t\t\t\talternative_file[0] =\n\t\t\t\t    alternative_lastfile[0] = '\\0';\n                                last_alternative_type[0] = '\\0';\n#if DEBUG_PARSE\n\t\t\t\tprintf(\"We DUMP the chosen alternative\\n\");\n#endif\n\t\t\t\tif (bp != origbp)\n\t\t\t\t    origbp = append_body(origbp, &origlp, bp);\n\t\t\t\tbp = origbp;\n\t\t\t\tlp = origlp;\n\t\t\t\torigbp = origlp = NULL;\n\n\t\t\t\theadp = NULL;\n\t\t\t    }\n#if DEBUG_PARSE\n\t\t\t    if (boundp)\n\t\t\t\tprintf(\"back %s\\n\", boundp->line);\n\t\t\t    else\n\t\t\t\tprintf(\"back to NONE\\n\");\n                            \n                            if (multipartp)\n                                printf(\"current multipart: %s\\n\", multipartp->line);\n\t\t\t    else\n\t\t\t\tprintf(\"current multipart: NONE\\n\");\n#endif\n\t\t\t}\n\t\t\telse {\n\t\t\t    /* we found the beginning of a new section */\n\t\t\t    skip_mime_epilogue = FALSE;\n\t\t\t    \n\t\t\t    if (alternativeparser && !set_save_alts) {\n\t\t\t\t/*\n\t\t\t\t * parsing another alternative, so we save the\n\t\t\t\t * precedent values \n\t\t\t\t */\n\t\t\t\talternative_bp = bp;\n\t\t\t\talternative_lp = lp;\n\t\t\t\talternative_lastfile_created =\n\t\t\t\t    file_created;\n\t\t\t\tstrcpy(alternative_lastfile,\n\t\t\t\t       alternative_file);\n                                strncpy(last_alternative_type, type,\n                                        sizeof(last_alternative_type) - 1);\n\n\t\t\t\t/* and now reset them */\n\t\t\t\theadp = bp = lp = NULL;\n\t\t\t\talternative_file[0] = '\\0';\n\t\t\t    }\n\t\t\t    else {\n\t\t\t\tatt_counter++;\n\t\t\t\tif (alternativeparser && set_save_alts == 1) {\n\t\t\t\t    bp = addbody(bp, &lp,\n\t\t\t\t\t\t set_alts_text ? set_alts_text\n\t\t\t\t\t\t : \"<hr />\",\n\t\t\t\t\t\t BODY_HTMLIZED | bodyflags);\n\t\t\t\t}\n\t\t\t    }\n#if DEBUG_PARSE\n\t\t\t    printf(\"mime parsing isinheader set to 1\\n\");\n#endif\n\t\t\t    isinheader = 1;\t/* back on a kind-of-header */\n\t\t\t    /* @@@ why are we changing the status of this variable? */\n\t\t\t    file_created = NO_FILE;\t/* not created any file yet */\n\t\t\t}\n\t\t\t/* go back to the MIME attachment default mode */\n\t\t\tcontent = CONTENT_TEXT;\n\t\t\tdecode = ENCODE_NORMAL;\n\t\t\tmultilinenoend = FALSE;\n\n\t\t\t/* reset related RFC 3676 state flags */\n\t\t\ttextplain_format = FORMAT_FIXED;\n\t\t\tdelsp_flag = FALSE;\n\t\t\tflowed_line = FALSE;\n\t\t\tquotelevel = 0;\n\t\t\tcontinue_previous_flow_flag = FALSE;\n\n\t\t\t/* restore the parent's charset/charsetsave values */\n                        if (charsetsp) {\n                            if (charset) {\n                                free(charset);\n                            }\n                            if (charsetsp->charset) {\n                                charset = strsav(charsetsp->charset);\n                            } else {\n                                charset = NULL;\n                            }\n                            strcpy(charsetsave, charsetsp->charsetsave);\n\n#ifdef DEBUG_PARSE\n                            printf(\"New section: restoring charset %s and charsetsave %s\\n\", charset, charsetsave);\n#endif\n                        }\n\t\t\tif (-1 != binfile) {\n\t\t\t    close(binfile);\n\t\t\t    binfile = -1;\n\t\t\t}\n                        \n\t\t\tcontinue;\n\t\t    }\n                }\n\n\t\tswitch (decode) {\n\t\tcase ENCODE_QP:\n\t\t    {\n\t\t\tchar *p2 = mdecodeQP(fp, line, &data, &datalen, fpo);\n\t\t\tif (p2) {\n\t\t\t    if (set_txtsuffix) {\n\t\t\t        PushString(&raw_text_buf, line);\n\t\t\t\tline_buf[0] = 0;\n\t\t\t\tPushString(&raw_text_buf, p2);\n\t\t\t    }\n\t\t\t    free(p2);\n\t\t\t}\n\t\t    }\n\t\t    break;\n\t\tcase ENCODE_BASE64:\n\t\t    base64Decode(line, newbuffer, &datalen);\n\t\t    data = newbuffer;\n\t\t    break;\n\t\tcase ENCODE_UUENCODE:\n\t\t    uudecode(NULL, line, newbuffer, &datalen, NULL);\n\t\t    data = newbuffer;\n\t\t    break;\n\t\tcase ENCODE_NORMAL:\n\t\t    data = line;\n\t\t    break;\n\t\tdefault:\n\t\t    /* we have no clue! */\n\t\t    data = NULL;\n\t\t    break;\n\t\t}\n#if DEBUG_PARSE\n\t\tprintf(\"LINE %s\\n\", (content != CONTENT_BINARY) ? data : \"<binary>\");\n#endif\n\t\tif (data) {\n\t\t    if ((content == CONTENT_TEXT) ||\n\t\t\t(content == CONTENT_HTML)) {\n\t\t\tif (decode > ENCODE_MULTILINED) {\n\t\t\t    /* \n\t\t\t     * This can be more than one resulting line, \n\t\t\t     * as the decoded the string may look like:\n\t\t\t     * \"#!/bin/sh\\r\\n\\r\\nhelp() {\\r\\n echo 'Usage: difftree\"\n\t\t\t     */\n\t\t\t    char *p = data;\n\t\t\t    char *n;\n\t\t\t    char store;\n\n#if DEBUG_PARSE\n\t\t\t    printf(\"decode type %d\\n\", decode);\n#endif\n\n\t\t\t    while ((n = strchr(p, '\\n'))) {\n\t\t\t\tstore = n[1];\n\t\t\t\tn[1] = 0;\n#if DEBUG_PARSE\n\t\t\t\tprintf(\"UNFOLDED %s\", p);\n#endif\n\t\t\t\tbp = addbody(bp, &lp, p,\n\t\t\t\t\t     (content == CONTENT_HTML ?\n\t\t\t\t\t      BODY_HTMLIZED : 0) |\n\t\t\t\t\t     (multilinenoend ?\n\t\t\t\t\t      BODY_CONTINUE : 0) |\n\t\t\t\t\t     bodyflags);\n\t\t\t\tmultilinenoend = FALSE;\t/* full line pushed */\n\t\t\t\tn[1] = store;\n\t\t\t\tp = n + 1;\n\t\t\t    }\n\t\t\t    if (strlen(p)) {\n\t\t\t\t/* \n\t\t\t\t * This line doesn't really end here, \n\t\t\t\t * we will get another line soon that \n\t\t\t\t * should get appended! \n\t\t\t\t */\n#if DEBUG_PARSE\n\t\t\t\tprintf(\"CONTINUE %s\\n\", p);\n#endif\n\t\t\t\tbp = addbody(bp, &lp, p,\n\t\t\t\t\t     (content == CONTENT_HTML ?\n\t\t\t\t\t      BODY_HTMLIZED : 0) |\n\t\t\t\t\t     (multilinenoend ?\n\t\t\t\t\t      BODY_CONTINUE : 0) |\n\t\t\t\t\t     bodyflags);\n\n\t\t\t\t/*\n\t\t\t\t * We want the next line to get appended to this!\n\t\t\t\t */\n\t\t\t\tmultilinenoend = TRUE;\n\t\t\t    }\n\t\t\t}\n\t\t\telse {\n\t\t\t  if (!isinheader && (textplain_format == FORMAT_FLOWED)) {\n                              /* remove both space stuffing and quotes\n                               * where applicable for f=f */\n                              bodyflags |= BODY_DEL_SSQ;\n                              flowed_line = rfc3676_handler (data, delsp_flag, &quotelevel, \n                                                             &continue_previous_flow_flag);\n                              if (continue_previous_flow_flag) {\n                                  bodyflags |= BODY_CONTINUE;\n                              } else  {\n                                  bodyflags &= ~BODY_CONTINUE;\n                                  if (flowed_line) {\n                                      bodyflags |= BODY_FORMAT_FLOWED;\n                                  } else {\n                                      bodyflags &= ~BODY_FORMAT_FLOWED;\n\t\t\t\t  }\n                              }\n                              continue_previous_flow_flag = flowed_line;\n\t\t\t  } else {\n                              bodyflags &= ~BODY_DEL_SSQ;\n\t\t\t  }\n\t\t\t  bp = addbody(bp, &lp, data,\n\t\t\t\t       (content == CONTENT_HTML ?\n\t\t\t\t\tBODY_HTMLIZED : 0) | bodyflags);\n\t\t\t}\n#if DEBUG_PARSE\n\t\t\tprintf(\"ALIVE?\\n\");\n#endif\n\t\t    }\n\t\t    else if (content == CONTENT_BINARY) {\n\n\t\t        /* don't create the attachments of deleted files */\n\t\t        /* (JK: this seems like a good place to call emptydir() to remove\n\t\t\t   existing attachments) from deleted messages */\n\t\t        if (is_deleted && file_created == MAKE_FILE) {\n\t\t\t  file_created = MADE_FILE;\n\t\t\t}\n\n#ifndef REMOVED_990310\n\t\t\t/* If there is no file created, we create and init one */\n\t\t\tif (file_created == MAKE_FILE) {\n\t\t\t    char *fname;\n\t\t\t    char *binname;\n\t\t\t    char *file = NULL;\n\t\t\t    char buffer[512];\n\n\t\t\t    file_created = MADE_FILE;\t/* we have, or at least we tried */\n\n\t\t\t    /* create the attachment directory if it doesn't exist */\n\t\t\t    if (att_dir == NULL) {\n\n\t\t\t\t/* first check the DIR_PREFIXER */\n#ifdef JOSE\n                                trio_asprintf(&att_dir,\"%s%c\" DIR_PREFIXER \"%s\",\n                                              dir, PATH_SEPARATOR,\n                                              message_name (emp))\n#else\n\t\t\t\ttrio_asprintf(&att_dir,\"%s%c\" DIR_PREFIXER \"%04d\",\n\t\t\t\t\t      dir, PATH_SEPARATOR, num);\n#endif\n\t\t\t\tif (set_increment != -1)\n\t\t\t\t    check1dir(att_dir);\n\t\t\t\t/* If this is a repeated run on the same archive we already\n\t\t\t\t * have HTML'ized, we risk extracting the same attachments\n\t\t\t\t * several times and therefore we need to remove all the \n\t\t\t\t * attachments currently present before we go ahead!\n\t\t\t\t *(Daniel -- August 6, 1999) */\n\t\t\t\t/* jk: removed it for a while, as it's not so necessary\n\t\t\t\t   once we can generate the same file names */\n#if DEBUG_PARSE\n\t\t\t\temptydir(att_dir);\n#endif\n\t\t\t\tif (set_usemeta && set_increment != -1) {\n\t\t\t\t    /* make the meta dir where we'll store the meta info,\n\t\t\t\t       such as content-type */\n\t\t\t\t    trio_asprintf(&meta_dir, \"%s%c\" META_DIR,\n\t\t\t\t\t\t  att_dir, PATH_SEPARATOR);\n\t\t\t\t    check1dir(meta_dir);\n\t\t\t\t}\n\t\t\t    }\n\n\t\t\t    /* If the attachment has a name, we keep it and add the\n\t\t\t       current value of the counter, to guarantee that we\n\t\t\t       have a unique name. Otherwise, we use a fixed name +\n\t\t\t       the counter. We go thru all this trouble so that we\n\t\t\t       can easily regenerate the same archive, without breaking\n\t\t\t       any links */\n\n\t\t\t    if (att_counter > 99)\n\t\t\t\tbinname = NULL;\n\t\t\t    else {\n\t\t\t\tif (set_filename_base)\n\t\t\t\t    create_attachname(attachname, sizeof(attachname));\n\t\t\t\tif (attachname[0])\n\t\t\t\t    fname = attachname;\n\t\t\t\telse\n\t\t\t\t    fname = FILE_SUFFIXER;\n\t\t\t\tif (!attachname[0] || inlist(att_name_list, fname))\n\t\t\t\t  trio_asprintf(&binname, \"%s%c%02d-%s\",\n\t\t\t\t\t\tatt_dir, PATH_SEPARATOR,\n\t\t\t\t\t\tatt_counter, fname);\n\t\t\t\telse\n\t\t\t\t  trio_asprintf(&binname, \"%s%c%s\",\n\t\t\t\t\t\tatt_dir, PATH_SEPARATOR,\n\t\t\t\t\t\tfname);\n\t\t\t\tif (att_name_list == NULL)\n\t\t\t\t    att_name_list = att_name_last = (struct hmlist *)malloc(sizeof(struct hmlist));\n\t\t\t\telse {\n\t\t\t\t  att_name_last->next = (struct hmlist *)malloc(sizeof(struct hmlist));\n\t\t\t\t  att_name_last = att_name_last->next;\n\t\t\t\t}\n\t\t\t\tatt_name_last->next = NULL;\n\t\t\t\tatt_name_last->val = strsav(fname);\n\t\t\t\t/* @@ move this one up */\n\t\t\t\t/* att_counter++; */\n\t\t\t    }\n\n\t\t\t    /* \n                             * Saving of the attachments is being done \n                             * inline as they are encountered. The \n                             * directories must exist first...  \n                             */\n\n#ifdef O_BINARY\n#define OPENBITMASK O_WRONLY | O_CREAT | O_TRUNC | O_BINARY\n#else\n#define OPENBITMASK O_WRONLY | O_CREAT | O_TRUNC\n#endif\n\t\t\t    if (binname) {\n\t\t\t\tbinfile = open(binname, OPENBITMASK,\n\t\t\t\t\t       set_filemode);\n\n#if DEBUG_PARSE\n\t\t\t\tprintf(\"%4d open attachment %s\\n\", num, binname);\n#endif\n\t\t\t\tif (-1 != binfile) {\n\t\t\t\t    chmod(binname, set_filemode);\n\t\t\t\t    if (set_showprogress)\n\t\t\t\t\tprint_progress(num, lang\n\t\t\t\t\t       [MSG_CREATED_ATTACHMENT_FILE],\n\t\t\t\t\t       binname);\n\t\t\t\t    if (set_usemeta) {\n\t\t\t\t\t/* write the mime meta info */\n\t\t\t\t\tFILE *file_ptr;\n\t\t\t\t\tchar *meta_file;\n\t\t\t\t\tchar *ptr;\n\n\t\t\t\t\tptr = strrchr(binname, PATH_SEPARATOR);\n\t\t\t\t\t*ptr = '\\0';\n\t\t\t\t\ttrio_asprintf(&meta_file, \"%s%c%s\"\n\t\t\t\t\t\t      META_EXTENSION,\n\t\t\t\t\t\t      meta_dir,\n\t\t\t\t\t\t      PATH_SEPARATOR,\n\t\t\t\t\t\t      ptr + 1);\n\t\t\t\t\t*ptr = PATH_SEPARATOR;\n\t\t\t\t\tfile_ptr = fopen(meta_file, \"w\");\n\t\t\t\t\tif (file_ptr) {\n\t\t\t\t\t    if (type) {\n\t\t\t\t\t\tif (charset)\n\t\t\t\t\t\t    fprintf(file_ptr,\n\t\t\t\t\t\t\t    \"Content-Type: %s; charset=\\\"%s\\\"\\n\",\n\t\t\t\t\t\t\t    type, charset);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t    fprintf(file_ptr,\n\t\t\t\t\t\t\t    \"Content-Type: %s\\n\",\n\t\t\t\t\t\t\t    type);\n\t\t\t\t\t    }\n\t\t\t\t\t    if (annotation_robot && set_userobotmeta) {\n\t\t\t\t\t      /* annotate the attachments using the experimental\n\t\t\t\t\t\t google X-Robots-Tag HTTP header.\n\t\t\t\t\t\t See https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag */\n\t\t\t\t\t      char *value;\n\t\t\t\t\t      if (annotation_robot == 1) \n\t\t\t\t\t\tvalue = \"nofollow\";\n\t\t\t\t\t      else if (annotation_robot == 2)\n\t\t\t\t\t\tvalue = \"noindex\";\n\t\t\t\t\t      else if (annotation_robot == 3)\n\t\t\t\t\t\tvalue = \"nofollow, noindex\";\n\t\t\t\t\t      fprintf(file_ptr,\"X-Robots-Tag: %s\\n\", value);\n\t\t\t\t\t    }\n\t\t\t\t\t    fclose(file_ptr);\n\t\t\t\t\t    chmod(meta_file, set_filemode);\n\t\t\t\t\t    free(meta_file);\n\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t    if (alternativeparser) {\n\t\t\t\t\t/* save the last name, in case we need to supress it */\n\t\t\t\t\tstrncpy(alternative_file, binname,\n\t\t\t\t\t\tsizeof(alternative_file) -\n\t\t\t\t\t\t1);\n                                        /* save the last mime type to help deal with the \n                                         * apple mail hack */\n\t\t\t\t\tstrncpy(last_alternative_type, type,\n\t\t\t\t\t\tsizeof(last_alternative_type) - 1);\n                                    }\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    if (alternativeparser) {\n\t\t\t\t\t/* save the last name, in case we need to supress it */\n\t\t\t\t\talternative_file[0] = '\\0';\n                                        /* save the last mime type to  help deal with the apple\n                                         * hack */\n                                        last_alternative_type[0] = '\\0';\n                                    }\n\t\t\t\t}\n\n\t\t\t\t/* point to the filename and skip the separator */\n\t\t\t\tfile = &binname[strlen(att_dir) + 1];\n\n\t\t\t\t/* protection against having a filename bigger than buffer */\n\t\t\t\tif (strlen(file) <= 500) {\n\t\t\t\t    char *desc;\n\t\t\t\t    char *sp;\n\t\t\t\t    struct emailsubdir *subdir;\n\n\t\t\t\t    if (description && description[0] != '\\0'\n                                        && hasblack(description))\n                                            desc = convchars(description, charset);\n\t\t\t\t    else if (inline_force ||\n\t\t\t\t\t     inlinecontent(type))\n\t\t\t\t        desc =\n\t\t\t\t\t    attachname[0] ? attachname\n\t\t\t\t\t    : \"picture\";\n\t\t\t\t    else\n\t\t\t\t\tdesc =\n\t\t\t\t\t    attachname[0] ? attachname\n\t\t\t\t\t    : \"stored\";\n\n\t\t\t\t    if (description)\n\t\t\t\t\tdescription = NULL;\n\n\t\t\t\t    subdir = NULL;\n\t\t\t\t    if (set_msgsperfolder || set_folder_by_date) {\n\t\t\t\t\tstruct emailinfo e;\n\t\t\t\t\tfill_email_dates(&e, date, fromdate,\n\t\t\t\t\t\t\t NULL, NULL);\n\t\t\t\t\tsubdir = msg_subdir(num,\n\t\t\t\t\t\t\t    set_use_sender_date\n\t\t\t\t\t\t\t    ? e.date\n\t\t\t\t\t\t\t    : e.fromdate);\n\t\t\t\t    }\n\n\t\t\t\t    if (inline_force ||\n\t\t\t\t\tinlinecontent(type)) {\n\t\t\t\t\t/* if we know our browsers can show this type of context\n\t\t\t\t\t   as-is, we make a <img> tag instead of <a href>! */\n \t\t\t\t      if(set_inline_addlink){\n \t\t\t\t\tchar *created_link =\n\t\t\t\t\t  createlink(set_attachmentlink,\n\t\t\t\t\t\t     &att_dir[strlen(dir)\n\t\t\t\t\t\t\t      + 1],\n\t\t\t\t\t\t     file, num, type);\n \t\t\t\t\ttrio_snprintf(buffer, sizeof(buffer),\n\t\t\t\t\t\t      \"<p><img src=\\\"%s%s%c%s\\\" alt=\\\"%s\\\" />\\n<br />\\n(%s %s: <a href=\\\"%s%s\\\">%s</a>)</p>\\n\",\n\t\t\t\t\t\t      subdir ? subdir->rel_path_to_top : \"\",\n\t\t\t\t\t\t      &att_dir[strlen(dir) + 1],\n\t\t\t\t\t\t      PATH_SEPARATOR, file,\n\t\t\t\t\t\t      desc, type,\n\t\t\t\t\t\t      lang[MSG_ATTACHMENT],\n\t\t\t\t\t\t      subdir ? subdir->rel_path_to_top : \"\",\n\t\t\t\t\t\t      created_link, file);\n \t\t\t\t\tfree(created_link);\n \t\t\t\t      }else {\n\t\t\t\t\ttrio_snprintf(buffer, sizeof(buffer),\n\t\t\t\t\t\t \"<img src=\\\"%s%s%c%s\\\" alt=\\\"%s\\\" />\\n\",\n\t\t\t\t\t\t subdir ? subdir->rel_path_to_top : \"\",\n\t\t\t\t\t\t &att_dir[strlen(dir) + 1],\n\t\t\t\t\t\t PATH_SEPARATOR, file,\n\t\t\t\t\t\t desc);\n\t\t\t\t      }\n\t\t\t\t    } else {\n\t\t\t\t\tchar *created_link =\n\t\t\t\t\t    createlink(set_attachmentlink,\n\t\t\t\t\t\t       &att_dir[strlen(dir)\n\t\t\t\t\t\t\t\t+ 1],\n\t\t\t\t\t\t       file, num, type);\n\n\t\t\t\t\tif ((sp = strchr(desc, '\\n')) !=\n\t\t\t\t\t    NULL) *sp = '\\0';\n\n\t\t\t\t\ttrio_snprintf(buffer, sizeof(buffer),\n\t\t\t\t\t\t \"<ul>\\n<li>%s %s: <a href=\\\"%s%s\\\">%s</a></li>\\n</ul>\\n\",\n\t\t\t\t\t\t type,\n\t\t\t\t\t\t lang[MSG_ATTACHMENT],\n\t\t\t\t\t\t subdir ? subdir->rel_path_to_top : \"\",\n\t\t\t\t\t\t created_link, desc);\n\n\t\t\t\t\tfree(created_link);\n\t\t\t\t    }\n\n\t\t\t\t    /* Print attachment comment before attachment */\n\t\t\t\t    /* add a DIV to store all this info first */\n\t\t\t\t    if (!append_bp)\n\t\t\t\t      append_bp = \n\t\t\t\t\taddbody(append_bp, &append_lp, \"<div>\\n\",\n\t\t\t\t\t\tBODY_HTMLIZED | bodyflags);\n\t\t\t\t    append_bp =\n\t\t\t\t\taddbody(append_bp, &append_lp, buffer,\n\t\t\t\t\t\tBODY_HTMLIZED | bodyflags);\n\t\t\t\t    trio_snprintf(buffer, sizeof(buffer),\n\t\t\t\t\t     \"<!-- attachment=\\\"%.80s\\\" -->\\n\",\n\t\t\t\t\t     file);\n\t\t\t\t    append_bp =\n\t\t\t\t\taddbody(append_bp, &append_lp, buffer,\n\t\t\t\t\t\tBODY_HTMLIZED | bodyflags);\n\t\t\t\t}\n\t\t\t    }\n\n\t\t\t    inline_force = FALSE;\n\t\t\t    attachname[0] = '\\0';\n\n\t\t\t    if (binname && (binfile != -1))\n\t\t\t\tcontent = CONTENT_BINARY;\n\t\t\t    else\n\t\t\t\tcontent = CONTENT_UNKNOWN;\n\n\t\t\t    if (binname)\n\t\t\t\tfree(binname);\n\t\t\t}\n\t\t    }\n#endif\n\t\t    if (-1 != binfile) {\n\t\t\tif (datalen < 0)\n\t\t\t    datalen = strlen(data);\n\n\t\t\twrite(binfile, data, datalen);\n\t\t    }\n\t\t}\n\n\t\tif (ENCODE_QP == decode)\n\t\t    free(data);\t/* this was allocatd by mdecodeQP() */\n\t    }\n\t}\n    }\n    if(set_append && fclose(fpo)) {\n\tprogerr(\"Can't close \\\"mbox\\\"\");\n    }\n\n    if (!isinheader || readone) {\n\n#ifdef HAVE_ICONV\n      if (!charset){\n\tif (*charsetsave!=0){\n\t  /**\n\t  if(set_showprogress){\n\t    printf(\"\\nput charset from subject header..\\n\");\n\t  }\n\t  **/\n\t  charset=strsav(charsetsave);\n\t}else{\n\t  /* default charset is US-ASCII */\n\t  charset=strsav(\"US-ASCII\");\n\t  /**\n\t  if(set_showprogress){\n\t    printf(\"\\nfound no charset for body, set ISO-8859-1.\\n\");\n\t  }\n\t  **/\n\t}\n      }else{\n\t/* if body is us-ascii but subject is not,\n\t   try to use subject's charset. */\n\tif (strncasecmp(charset,\"us-ascii\",8)==0){\n\t  if (*charsetsave!=0 && strcasecmp(charsetsave,\"us-ascii\")!=0){\n\t    free(charset);\n\t    charset=strsav(charsetsave);\n\t  }\n\t}\n      }\n#endif\n\tif (!hassubject)\n\t    subject = NOSUBJECT;\n\n\tif (!hasdate)\n\t    date = NODATE;\n\n\tif (!inreply)\n\t    inreply = oneunre(subject);\n\n\t/* control the use of format and delsp according to RFC2646 */\n\tif (textplain_format == FORMAT_FLOWED \n\t    && content != CONTENT_TEXT\n\t    || (content == CONTENT_TEXT && strcasecmp (type, \"text/plain\"))) {\n\t  /* format flowed only allowed on text/plain */\n\t  textplain_format = FORMAT_FIXED;\n\t}\n\n\tif (textplain_format == FORMAT_FIXED && delsp_flag) {\n\t  /* delsp only accepted for format=flowed */\n\t  delsp_flag = FALSE;\n\t}\n\n\tif (append_bp && append_bp != bp) {\n            /* close the DIV */\n            append_bp = \n                addbody(append_bp, &append_lp, \"</div>\\n\",\n                        BODY_HTMLIZED | bodyflags);\n            bp = append_body(bp, &lp, append_bp);\n\t    append_bp = append_lp = NULL;\n\t}\n\n\twhile (rmlastlines(bp));\n\n\tstrcpymax(fromdate, dp ? dp : \"\", DATESTRLEN);\n        if (prefered_content_charset) {\n            if (prefered_content_charset[0] != '\\0') {\n#ifdef DEBUG_PARSE\n                fprintf(stderr, \"Replacing charset %s with prefered_content_charset %s\\n\",\n                        charset, prefered_content_charset);\n#endif\n                if (charset) {\n                    free(charset);\n                }\n                charset = prefered_content_charset;\n            } else {\n                free(prefered_content_charset);\n            }\n            prefered_content_charset = NULL;\n        }\n        \n\temp = addhash(num, date, namep, emailp, msgid, subject, inreply,\n\t\t      fromdate, charset, NULL, NULL, bp);\n\tif (emp) {\n\t    emp->exp_time = exp_time;\n\t    emp->is_deleted = is_deleted;\n\t    emp->annotation_robot = annotation_robot;\n\t    emp->annotation_content = annotation_content;\n\t    if (insert_in_lists(emp, require_filter,\n\t\t\t\trequire_filter_len + require_filter_full_len))\n\t        ++num_added;\n\t    if (set_txtsuffix && set_increment != -1)\n\t        write_txt_file(emp, &raw_text_buf);\n\t    num++;\n\t}\n\n\t/* @@@ if we didn't add the message, we should consider erasing the attdir\n\t   if it's there */\n\n\tif (hasdate)\n\t    free(date);\n\tif (hassubject)\n\t    free(subject);\n\tif (inreply) {\n\t    free(inreply);\n\t    inreply = NULL;\n\t}\n\tif (charset) {\n\t    free(charset);\n\t    charset = NULL;\n\t}\n\tif (charsetsave){\n\t  *charsetsave = 0;\n\t}\n        if (prefered_content_charset) {\n            free(prefered_content_charset);\n            prefered_content_charset = NULL;\n        }\n\tif (msgid) {\n\t    free(msgid);\n\t    msgid = NULL;\n\t}\n\tif (namep) {\n\t    free(namep);\n\t    namep = NULL;\n\t}\n\tif (emailp) {\n\t    free(emailp);\n\t    emailp = NULL;\n\t}\n\n\t/* reset the status counters */\n\t/* @@ verify we're doing it everywhere */\n\tbodyflags = 0;\t\t/* reset state flags */\n\n\t/* reset related RFC 3676 state flags */\n\ttextplain_format = FORMAT_FIXED;\n\tdelsp_flag = FALSE;\n\tflowed_line = FALSE;\n\tquotelevel = 0;\n\tcontinue_previous_flow_flag = FALSE;\n\t\n\t/* go back to default mode: */\n\tcontent = CONTENT_TEXT;\n\tdecode = ENCODE_NORMAL;\n\tMime_B = FALSE;\n        skip_mime_epilogue = FALSE;\n\theadp = NULL;\n\tmultilinenoend = FALSE;\n\tif (att_dir) {\n\t    free(att_dir);\n\t    att_dir = NULL;\n\t}\n\tif (set_usemeta && meta_dir) {\n\t    free(meta_dir);\n\t    meta_dir = NULL;\n\t}\n\tatt_counter = 0;\n\twhile (att_name_list != NULL) {\n\t    struct hmlist *ptr_next_att = att_name_list->next;\n\t    free(att_name_list->val);\n\t    free(att_name_list);\n\t    att_name_list = ptr_next_att;\n\t}\n\tatt_name_list = NULL;\n\tdescription = NULL;\n\n\tif (parse_multipart_alternative_force_save_alts) {\n            parse_multipart_alternative_force_save_alts = 0;\n                    \n#if DEBUG_PARSE\n            printf(\"Applemail_hack resetting parse_multipart_alternative_force_save_alts\\n\");\n#endif\n            if (old_set_save_alts != -1) {\n                set_save_alts = old_set_save_alts;\n                old_set_save_alts = -1;\n#if DEBUG_PARSE                        \n                printf(\"Applemail_hack resetting save_alts to %d\\n\", old_set_save_alts);\n#endif                        \n            }\n        }\n\t\t\n\t/* by default we have none! */\n\thassubject = 0;\n\thasdate = 0;\n\n\tannotation_robot = ANNOTATION_ROBOT_NONE;\n\tannotation_content = ANNOTATION_CONTENT_NONE;\n    }\n    if (require_filter) free(require_filter);\n\n    if (set_showprogress && !readone)\n\tprint_progress(num, lang[MSG_ARTICLES], NULL);\n#if DEBUG_PARSE\n    printf(\"\\b\\b\\b\\b%4d %s.\\n\", num, lang[MSG_ARTICLES]);\n#endif\n\n    /* kpm - this is to prevent the closing of std and hypermail crashing\n     * if the input is from stdin\n     */\n    if (fp != stdin)\n\tfclose(fp);\n\n#ifdef FASTREPLYCODE\n    threadlist_by_msgnum = (struct reply **)emalloc((num + 1)*sizeof(struct reply *));\n    {\n\tint i;\n\tfor (i = 0; i <= num; ++i)\n\t    threadlist_by_msgnum[i] = NULL;\n    }\n#endif\n    if (num > max_msgnum)\n\tmax_msgnum = num - 1;\n    crossindex();\n    threadlist = NULL;\n    printedthreadlist = NULL;\n    crossindexthread1(datelist);\n#if DEBUG_THREAD\n    {\n\tstruct reply *r;\n\tr = threadlist;\n\tfprintf(stderr, \"START of threadlist after crossindexthread1\\n\");\n\tfprintf(stderr, \"- msgnum frommsgnum maybereply msgid\\n\");\n\twhile (r != NULL) {\n\t    if (r->data == NULL) {\n\t\tfprintf(stderr, \"- XX %d %d XX\\n\",\n\t\t\tr->frommsgnum, r->maybereply);\n\t    }\n\t    else {\n\t\tfprintf(stderr, \"- %d %d %d '%s'\\n\",\n\t\t\tr->data->msgnum,\n\t\t\tr->frommsgnum, r->maybereply, r->data->msgid);\n\t    }\n\t    r = r->next;\n\t}\n\tfprintf(stderr, \"END of threadlist after crossindexthread1\\n\");\n    }\n#endif\n\n    /* can we clean up a bit please... */\n\n    free_bound (boundp);\n    free_multipart (multipartp);\n\n    if(charsetsave){\n      free(charsetsave);\n    }\n    return num_added;\t\t\t/* amount of mails read */\n}\n\nstatic void check_expiry(struct emailinfo *emp)\n{\n    time_t email_time;\n    const char *option = \"expires\";\n    if (!emp->is_deleted) {\n        if (emp->exp_time != -1 && emp->exp_time < time(NULL))\n\t    emp->is_deleted = FILTERED_EXPIRE;\n\temail_time = emp->fromdate;\n\tif (email_time == -1)\n\t    email_time = emp->date;\n\tif (email_time != -1 && set_delete_older\n\t    && email_time < convtoyearsecs(set_delete_older)) {\n\t    emp->is_deleted = FILTERED_OLD;\n\t    option = \"delete_older\";\n\t}\n\tif (email_time != -1 && set_delete_newer\n\t    && email_time < convtoyearsecs(set_delete_newer)) {\n\t    emp->is_deleted = FILTERED_NEW;\n\t    option = \"delete_newer\";\n\t}\n\tif (emp->is_deleted)\n\t    printf(\"message %d deleted under option %s. msgid: %s\\n\",\n\t\t   emp->msgnum+1, option, emp->msgid);\n    }\n}\n\nint parse_old_html(int num, struct emailinfo *ep, int parse_body,\n\t\t   int do_insert, struct reply **replylist_tmp, int cmp_msgid)\n{\n    char line[MAXLINE];\n    char *name = NULL;\n    char *email = NULL;\n    char *date = NULL;\n    char *msgid = NULL;\n    char *subject = NULL;\n    char *inreply = NULL;\n    char *fromdate = NULL;\n    char *charset = NULL;\n    char *isodate = NULL;\n    char *isofromdate = NULL;\n    char command[100];\n    char *valp;\n    char legal = FALSE;\n    int reply_msgnum = -1;\n    long exp_time = -1;\n    int is_deleted = 0;\n    int num_added = 0;\n    struct body *bp = NULL;\n    struct body *lp = NULL;\n    int msgids_are_same = 0;\n\n    struct emailsubdir *subdir = ep ? ep->subdir : msg_subdir(num, 0);\n    char *filename;\n\n    FILE *fp;\n\n    char inreply_start[256];\n    static char *inreply_start_old = \"<li><dfn>In reply to</dfn>: <a href=\\\"\";\n\n    if (set_nonsequential && !msgnum_id_table[num])\n      return 0;\n\n    if (set_linkquotes) {\n        snprintf(inreply_start, sizeof(inreply_start), \n                \"<dfn>%s</dfn>: <a href=\\\"\", lang[MSG_IN_REPLY_TO]);\n    }\n\n    /* prepare the name of the file that stores the message */\n    if (set_nonsequential)\n      trio_asprintf(&filename, \"%s%s%s.%s\", set_dir,\n\t\t    subdir ? subdir->subdir : \"\", \n\t\t    msgnum_id_table[num],\n\t\t    set_htmlsuffix);\n    else\n      trio_asprintf(&filename, \"%s%s%.4d.%s\", set_dir,\n\t\t    subdir ? subdir->subdir : \"\", num, set_htmlsuffix);\n\n    /*\n     * fromdate == <!-- received=\"Wed Jun  3 10:12:00 1998 CDT\" -->\n     * date     == <!-- sent=\"Wed, 3 Jun 1998 10:12:07 -0500 (CDT)\" -->\n     * name     == <!-- name=\"Kent Landfield\" -->\n     * email    == <!-- email=\"kent@landfield.com\" -->\n     * subject  == <!-- subject=\"Test of the testmail mail address.\" -->\n     * msgid    == <!-- id=\"199806031512.KAA22323@landfield.com\" -->\n     * inreply  == <!-- inreplyto=\"\" -->\n     *\n     * New for 2b10:\n     * charset  == <!-- charset=\"iso-8859-2\" -->\n     *\n     * New for 2b18:\n     * isofromdate == <!-- isoreceived=\"19980603101200\" -->\n     * isodate     == <!-- isosent=\"19980603101207\" -->\n     */\n\n    if ((fp = fopen(filename, \"r\")) != NULL) {\n\twhile (fgets(line, sizeof(line), fp)) {\n\n\t    if (1 == sscanf(line, \"<!-- %99[^=]=\", command)) {\n\t\tif (!strcasecmp(command, \"received\"))\n\t\t    fromdate = getvalue(line);\n\t\telse if (!strcasecmp(command, \"sent\"))\n\t\t    date = getvalue(line);\n\t\telse if (!strcasecmp(command, \"name\"))\n\t\t    name = getvalue(line);\n\t\telse if (!strcasecmp(command, \"email\"))\n\t\t    email = unobfuscate_email_address(getvalue(line));\n\t\telse if (!strcasecmp(command, \"subject\")) {\n\t\t    valp = getvalue(line);\n\t\t    {\n\t\t\tsubject = unconvchars(valp);\n\t\t\tfree(valp);\n\t\t    }\n\t\t}\n\t\telse if (!strcasecmp(command, \"id\")) {\n\t\t    char *raw_msgid = getvalue(line);\n\t\t    msgid = unspamify(raw_msgid);\n\t\t    if (raw_msgid) free(raw_msgid);\n\t\t    if (msgid && !strstr(line,\"-->\") && set_linkquotes)\n\t\t        msgid = NULL;/* old version of Hypermail wrote junk? */\n\t\t}\n\t\telse if (!strcasecmp(command, \"charset\"))\n\t\t    charset = getvalue(line);\n\t\telse if (!strcasecmp(command, \"isosent\"))\n\t\t    isodate = getvalue(line);\n\t\telse if (!strcasecmp(command, \"isoreceived\"))\n\t\t    isofromdate = getvalue(line);\n\t\telse if (!strcasecmp(command, \"expires\")) {\n\t\t    valp = getvalue(line);\n\t\t    if (valp) {\n\t\t\texp_time = strcmp(valp, \"-1\") ? iso_to_secs(valp) : -1;\n\t\t\tfree(valp);\n\t\t    }\n\t\t}\n\t\telse if (!strcasecmp(command, \"isdeleted\")) {\n\t\t    valp = getvalue(line);\n\t\t    if (valp) {\n\t\t\tis_deleted = atoi(valp);\n\t\t\tfree(valp);\n\t\t    }\n\t\t}\n\t\telse if (!strcasecmp(command, \"inreplyto\")) {\n\t\t    char *raw_msgid = getvalue(line);\n\t\t    valp = unspamify(raw_msgid);\n\t\t    if (raw_msgid) free(raw_msgid);\n\t\t    if (valp) {\n\t\t\tinreply = unconvchars(valp);\n\t\t\tfree(valp);\n\t\t    }\n\t\t}\n\t\telse if (!strcasecmp(command, \"body\")) {\n\t\t    /*\n\t\t     * When we reach the mail body, we know we've got all the\n\t\t     * headers there were!\n\t\t     */\n\t\t    if (parse_body) {\n\t\t\twhile (fgets(line, MAXLINE, fp)) {\n\t\t\t    char *ptr;\n\t\t\t    char *line2;\n\t\t\t    if (!strcmp(line,\"<!-- body=\\\"end\\\" -->\\n\"))\n\t\t\t        break;\n#if 0\n\t\t\t    if (!strcmp(line,\"<p><!-- body=\\\"end\\\" -->\\n\"))\n\t\t\t        break;\n#endif\n\t\t\t    line2 = remove_hypermail_tags(line);\n\t\t\t    if (line2) {\n\t\t\t        if (!bp && *line2 != '\\n') {\n\t\t\t\t    bp = addbody(bp, &lp, \"\\n\", 0);\n\t\t\t\t    if (ep != NULL)\n\t\t\t\t        ep->bodylist = bp;\n\t\t\t\t}\n\t\t\t\tptr = unconvchars(line2);\n\t\t\t\tbp = addbody(bp, &lp, ptr ? ptr : \"\", 0);\n\t\t\t\tif (ep != NULL && !ep->bodylist->line[0])\n\t\t\t\t    ep->bodylist = bp;\n\t\t\t\tif(0) fprintf(stderr,\"addbody %p %d from %s\",\n\t\t\t\t\t      bp, !ep->bodylist->line[0], ptr);\n\t\t\t\tfree(ptr);\n\t\t\t\tif (set_linkquotes && !inreply) {\n\t\t\t\t    char *new_inreply = getreply(line2);\n\t\t\t\t    if (!*new_inreply) free(new_inreply);\n\t\t\t\t    else inreply = new_inreply;\n\t\t\t\t}\n\t\t\t\tfree(line2);\n\t\t\t    }\n\t\t\t}\n\t\t    }\n\t\t    if (!bp)\n\t\t\tbp = addbody(bp, &lp, \"\\0\", 0);\n\t\t    fclose(fp);\n\t\t    legal = TRUE;\t/* with a body tag we consider this a valid syntax */\n\t\t    break;\n\t\t}\n\t    }\n\t    else if (set_linkquotes) {\n\t\tchar *ptr;\n\t\tif ((ptr = strcasestr(line, inreply_start)) != NULL)\n\t\t    reply_msgnum = atoi(ptr + strlen(inreply_start));\n\t\telse if ((ptr = strstr(line, inreply_start_old)) != NULL)\n\t\t    reply_msgnum = atoi(ptr + strlen(inreply_start_old));\n\t    }\n\t}\n    }\n    else if (cmp_msgid)\n\treturn -1;\n\n    if (legal) {\t    /* only do this if the input was reliable */\n\tstruct emailinfo *emp;\n\n#if HAVE_ICONV\n\tif (charset){\n\t  char *tmpptr;\n\t  size_t tmplen=0;\n\t  tmpptr=subject;\n\t  subject=i18n_convstring(tmpptr,charset,\"UTF-8\",&tmplen);\n\t  if(tmpptr)\n\t    free(tmpptr);\n\t  tmpptr=name;\n\t  name=i18n_convstring(tmpptr,charset,\"UTF-8\",&tmplen);\n\t  if(tmpptr)\n\t    free(tmpptr);\n\t}\n#endif\n\tif (replylist_tmp == NULL || !do_insert)\n\t    emp = ep;\n\telse\n\t    emp = addhash(num, date ? date : NODATE,\n\t\t\t  name, email, msgid, subject, inreply,\n\t\t\t  fromdate, charset, isodate, isofromdate, bp);\n\tif (cmp_msgid)\n\t    msgids_are_same = !strcmp(ep->msgid, msgid);\n\tif (emp != NULL && replylist_tmp != NULL) {\n\t    if (do_insert) {\n\t        emp->exp_time = exp_time;\n\t\temp->is_deleted = is_deleted;\n\t\tcheck_expiry(emp);\n\t\tif (insert_in_lists(emp, NULL, 0))\n\t\t    ++num_added;\n\t    }\n\n\t    if(set_linkquotes && reply_msgnum != -1) {\n#ifdef FASTREPLYCODE\n\t\tstruct emailinfo *email2;\n\t\tif (hashnumlookup(reply_msgnum, &email2))\n\t\t    *replylist_tmp = addreply2(*replylist_tmp, email2, emp,\n\t\t\t\t\t       0, NULL);\n#else\n\t\t*replylist_tmp = addreply(*replylist_tmp, reply_msgnum,\n\t\t\t\t\t  emp, 0, NULL);\n#endif\n\t    }\n\t}\n    }\n    if (charset) {\n\tfree(charset);\n    }\n    if (name) {\n\tfree(name);\n    }\n    if (subject) {\n\tfree(subject);\n    }\n    if (msgid) {\n\tfree(msgid);\n    }\n    if (inreply) {\n\tfree(inreply);\n    }\n    if (fromdate) {\n\tfree(fromdate);\n    }\n    if (date) {\n\tfree(date);\n    }\n    if (email) {\n\tfree(email);\n    }\n    if (isodate) {\n\tfree(isodate);\n    }\n    if (isofromdate) {\n\tfree(isofromdate);\n    }\n    free(filename);\n#if 0\n    if (bp != NULL) {\t\t/* revisit me */\n\tif (bp->line)\n\t    free(bp->line);\n\tfree(bp);\n    }\n#endif\n    return (cmp_msgid ? msgids_are_same : num_added);\n}\n\n/*\n** All this does is get all the relevant header information from the\n** comment fields in existing archive files. Everything is loaded into\n** structures in the exact same way as if articles were being read from\n** stdin or a mailbox.\n**\n** Return the number of mails read.\n*/\n\nstatic int loadoldheadersfrommessages(char *dir, int num_from_gdbm)\n{\n    int num = 0;\n    int num_added = 0;\n    int max_num;\n    struct emailinfo *e0 = NULL;\n\n    struct reply *replylist_tmp = NULL;\n    int first_read_body = set_startmsgnum;\n    \n    if (num_from_gdbm != -1)\n      max_num = num_from_gdbm - 1;\n    else if (set_nonsequential)\n      max_num = find_max_msgnum_id();\n    else\n      max_num = find_max_msgnum();\n\n    if (max_num > max_msgnum)\n\tmax_msgnum = max_num;\n    if (set_searchbackmsgnum) {\n\tfirst_read_body = max_num - set_searchbackmsgnum;\n\tif (first_read_body < set_startmsgnum)\n\t    first_read_body = set_startmsgnum;\n\tif (num_from_gdbm != -1)\n\t    num = first_read_body;\n    }\n#if 0\n    else if (set_searchbackmsgnum && set_increment) {\n\tint jump = 1000;\t /* search for biggest message number */\n\twhile (jump && first_read_body >= 0) {\n\t    subdir = msg_subdir(first_read_body, 0);\n\t    trio_asprintf(&filename,\"%s%s%.4d.%s\", set_dir,\n\t\t\t  subdir ? subdir->subdir : \"\",\n\t\t\t  first_read_body, set_htmlsuffix);\n\t    if ((fp = fopen(filename, \"r\")) != NULL) {\n\t        fclose(fp);\n\t\tif (jump < 0) jump = -jump/2;\n\t\tfirst_read_body += jump;\n\t    }\n\t    else {\n\t        if (jump > 0) jump = -jump/2;\n\t\tfirst_read_body += jump;\n\t    }\n\t    free(filename);\n\t    free(subdir);\n\t}\n\tfirst_read_body -= set_searchbackmsgnum + 1;\n    }\n#endif\n    if (set_folder_by_date) {\n\tif (!num_from_gdbm)\n\t    return 0;\n#ifdef GDBM\n\tif (set_usegdbm && !hashnumlookup(first_read_body, &e0)\n\t    && set_startmsgnum == 0 && first_read_body == 0\n\t    && num_from_gdbm != -1 && hashnumlookup(1, &e0)) {\n\t    /* kludge to handle old archives that mistakenly started with 0001 */\n\t    first_read_body = 1;\n\t}\n#endif\n\tif (!hashnumlookup(first_read_body, &e0)) {\n#ifdef GDBM\n\t    if (set_usegdbm) {\n\t        if (num_from_gdbm == -1) {\n\t\t    if (is_empty_archive())\n\t\t        return 0;\n                    snprintf(errmsg, sizeof(errmsg),\n\t\t\t    \"Error: This archive does not appear to be empty, \"\n\t\t\t    \"and it has no gdbm file\\n(%s). If you want to \"\n\t\t\t    \"use incremental updates with the folder_by_date\\n\"\n\t\t\t    \"option, you must start with an empty archive or \"\n\t\t\t    \"with an archive\\nthat was generated using the \"\n\t\t\t    \"usegdbm option.\", GDBM_INDEX_NAME);\n\t\t}\n\t\telse\n                    snprintf(errmsg, sizeof(errmsg),\n\t\t\t    \"Error set_folder_by_date msg %d num_from_gdbm %d\",\n\t\t\t    first_read_body, num_from_gdbm);\n\t    }\n\t    else\n                snprintf(errmsg, sizeof(errmsg), \"folder_by_date with incremental update requires usegdbm option\");\n#else\n                snprintf(errmsg, sizeof(errmsg),\n\t                \"folder_by_date requires usegdbm option\"\n\t\t\t\". gdbm support has not been compiled into this\"\n\t\t\t\" copy of hypermail. You probably need to install\"\n\t\t\t\"gdbm and rerun configure.\");\n#endif\n\t    progerr(errmsg);\n\t}\n    }\n\n    if (num_from_gdbm == -1)\n        authorlist = subjectlist = datelist = NULL;\n\n#ifdef WANTDUPMESSAGES\n    if (set_showprogress)\n\tprintf(\"%s...\\n\", lang[MSG_READING_OLD_HEADERS]);\n#endif\n\n\n    /* Strategy: loop on files, opening each and copying the header comments\n     * into dynamically-allocated memory, then saving if it's not corrupt. */\n\n    if (set_nonsequential)\n      /* read the msgid to msgnum table */\n      msgnum_id_table = read_msgnum_id_table (max_num);\n\n    while (num <= max_num) {\n\tstruct emailinfo *ep0 = NULL;\n\tint parse_body = (set_linkquotes && num >= first_read_body);\n\tif (num_from_gdbm != -1 || set_folder_by_date) {\n\t    if (!hashnumlookup(num, &ep0)) {\n\t        if (++num > max_num)\n\t\t    break;\n\t        continue;\n\t    }\n\t}\n\tnum_added += parse_old_html(num, ep0, parse_body, num_from_gdbm == -1,\n\t\t\t\t    &replylist_tmp, 0);\n\n\tnum++;\n\n\tif (!(num % 10) && set_showprogress) {\n\t    printf(\"\\r%4d\", num);\n\t    fflush(stdout);\n\t}\n    }\n\n    if (set_nonsequential)\n      {\n\t/* free the msgnum_id_table */\n\tfree_msgnum_id_table (msgnum_id_table, max_num);\n\tmsgnum_id_table = NULL;\n      }\n\n#ifdef WANTDUPMESSAGES\n    if (set_showprogress)\n\tprintf(\"\\b\\b\\b\\b%4d %s.\\n\", num, lang[MSG_ARTICLES]);\n#endif\n\n    if (set_linkquotes)\n\tset_alt_replylist(replylist_tmp);\n\n    return num_added;\n} /* end loadoldheadersfrommessages() */\n\n/*\n** Load message summary information from a GDBM index.\n*/\n#ifdef GDBM\n\nint loadoldheadersfromGDBMindex(char *dir, int get_count_only)\n{\n      char *indexname;\n      GDBM_FILE gp;\n      int num;\n      int num_added = 0;\n      int old_delete_level = -1;\n\n      if (!get_count_only)\n\tauthorlist = subjectlist = datelist = NULL;\n\n      /* Use gdbm performance hack: instead of opening each and\n       * every .html file to get the comment information, get it\n       * from a gdbm index, where the key is the message number and\n       * the content is a string containing the values separated by\n       * nullchars, in this order:\n       *   fromdate\n       *   date\n       *   name\n       *   email\n       *   subject\n       *   inreply\n       *   charset      v2.0\n       *   isofromdate  v2.0\n       *   isodate      v2.0\n       */\n\n      trio_asprintf(&indexname, (dir[strlen(dir)-1] == '/') ? \"%s%s\" : \"%s/%s\",\n\t\t    dir, GDBM_INDEX_NAME);\n\n      if ((gp = gdbm_open(indexname, 0, GDBM_READER, 0, 0))) {\n\n\t/* we _can_ read the index */\n\n\tdatum content;\n\tdatum key;\n\tint max_num;\n\n\tkey.dptr = \"delete_level\";\n\tkey.dsize = strlen(key.dptr);\n\tcontent = gdbm_fetch(gp, key);\n\tif (content.dptr)\n\t    old_delete_level = atoi(content.dptr);\n\n\tkey.dptr = (char *) &num;\n\tkey.dsize = sizeof(num);\n\n\tnum = -1;\n\tcontent = gdbm_fetch(gp, key);\n\tif (!content.dptr)\n\t    max_num = -1;\n\telse\n\t    max_num = atoi(content.dptr);\n\tif (get_count_only) {\n\t    gdbm_close(gp);\n\t    return max_num;\n\t}\n\n\tfor(num = 0; max_num == -1 || num <= max_num; num++) {\n\t  char *dp, *dp_end;\n\t  char *name=NULL;\n\t  char *email=NULL;\n\t  char *date=NULL;\n\t  char *msgid=NULL;\n\t  char *subject=NULL;\n\t  char *inreply=NULL;\n\t  char *fromdate=NULL;\n\t  char *charset=NULL;\n\t  char *isodate=NULL;\n\t  char *isofromdate=NULL;\n\t  long exp_time = -1;\n\t  int is_deleted = 0;\n\t  struct emailinfo *emp;\n\t  struct body *bp = NULL;\n\t  struct body *lp = NULL;\n\t  bp = addbody(bp, &lp, \"\\0\", 0);\n\n\t  content = gdbm_fetch(gp, key);\n\t  if(!(dp = content.dptr)) {\n\t      if (max_num == -1) /* old file where gaps in nums not legal */\n\t\t  break;\t /* must be at end */ \n\t      continue;\n\t  }\n\t  dp_end = dp + content.dsize;\n\t  fromdate = dp;\n\t  dp += strlen(dp) + 1;\n\t  date = dp;\n\t  dp += strlen(dp) + 1;\n\t  name = dp;\n\t  dp += strlen(dp) + 1;\n\t  email = dp;\n\t  dp += strlen(dp) + 1;\n\t  subject = unconvchars(dp);\n\t  dp += strlen(dp) + 1;\n\t  msgid = dp;\n\t  dp += strlen(dp) + 1;\n\t  inreply = unconvchars(dp);\n\t  dp += strlen(dp) + 1;\n\t  charset = dp;\n\t  dp += strlen(dp) + 1;\n\t  isofromdate = dp;\n\t  dp += strlen(dp) + 1;\n\t  isodate = dp;\n\t  dp += strlen(dp) + 1;\n\t  if (dp < dp_end) {\n\t      exp_time = iso_to_secs(dp);\n\t      if (!*dp) exp_time = -1;\n\t      dp += strlen(dp) + 1;\n\t  }\n\t  if (dp < dp_end) {\n\t      is_deleted = atoi(dp);\n\t      dp += strlen(dp) + 1;\n\t  }\n\n\t  if ((emp = addhash(num, date, name, email, msgid, subject, inreply,\n\t\t\t   fromdate, charset, isodate, isofromdate, bp))) {\n\t      emp->exp_time = exp_time;\n\t      emp->is_deleted = is_deleted;\n\t      emp->deletion_completed = old_delete_level;\n\t      check_expiry(emp);\n\t      if (insert_in_lists(emp, NULL, 0))\n\t\t  ++num_added;\n\t      if (num == max_num) {\n\t\t  char *filename = articlehtmlfilename(emp);\n\t\t  if (!isfile(filename) && !is_deleted) {\n\t\t      trio_snprintf(errmsg, sizeof(errmsg),\n\t\t\t       \"%s \\\"%s\\\". If you deleted files,\"\n\t\t\t       \" you need to delete the gdbm file %s as well.\",\n\t\t\t       lang[MSG_CANNOT_OPEN_MAIL_ARCHIVE],\n\t\t\t       filename, indexname);\n\t\t      progerr(errmsg);\n\t\t  }\n\t\t  free(filename);\n\t      }\n\t  }\n\t  free(subject);\n\t  free(inreply);\n#if 0\n\t  if(bp) {\n\t      if (bp->line) \n\t\t  free(bp->line);\n\t      free(bp);\n\t  }\n#endif\n\n\t  if (!(num % 10) && set_showprogress) {\n\t    printf(\"\\r%4d\", num);\n\t    fflush(stdout);\n\t  }\n\n\t} /* end loop on messages */\n\n\tgdbm_close(gp);\n\tif (set_linkquotes)\n\t    loadoldheadersfrommessages(dir, num);\n      } /* end case of able to read gdbm index */\n\n      else { \n\tstruct emailinfo *emp;\n\n\tif (get_count_only)\n\t    return 0;\n\t/* can't read?  create. */\n\n\tif (set_showprogress)\n\t  printf(lang[MSG_CREATING_GDBM_INDEX]);\n\tnum = loadoldheadersfrommessages(dir, -1);\n\t\n\tif(!(gp = gdbm_open(indexname, 0, GDBM_NEWDB, 0600, 0))){\n\n\t  /* Serious problem here: can't create! So, just muddle on. */\n\n\t  if (set_showprogress)\n\t    printf(lang[MSG_CANT_CREATE_GDBM_INDEX]);\n\t  return num;\n\t}\n\n\t/* Can create new; now, populate it */\n\n\tfor (num = 0; hashnumlookup(num, &emp); num++) {\n\t    togdbm((void *) gp, emp);\n\t}\n\tgdbm_close(gp);\n\n      } /* end case of could not read gdbm index */\n\n      free(indexname);\n\n      return num_added;\n\n} /* end loadoldheadersfromGDBMindex() */\n#endif\n\n/* All this does is get all the relevant header information.\n** Everything is loaded into structures in the exact same way as if\n** articles were being read from stdin or a mailbox.\n**\n** Return the number of mails read.  */\n\nint loadoldheaders(char *dir)\n{\n  int num;\n\n  if (set_showprogress)\n    printf(\"%s...\\n\", lang[MSG_READING_OLD_HEADERS]);\n#ifdef GDBM\n  if(set_usegdbm)\n    num = loadoldheadersfromGDBMindex(dir, 0);\n  else\n#endif\n    num = loadoldheadersfrommessages(dir, -1);\n\n  if (set_showprogress)\n    printf(\"\\b\\b\\b\\b%4d %s.\\n\", num, lang[MSG_ARTICLES]);\n\n  return num;\n\n} /* end loadoldheaders() */\n\n\n/*\n** Adds a \"Next:\" link in the proper article, after the archive has been\n** incrementally updated.\n*/\n\nvoid fixnextheader(char *dir, int num, int direction)\n{\n    char *filename;\n    char line[MAXLINE];\n    struct emailinfo *email;\n\n    struct body *bp, *cp, *dp = NULL, *lp = NULL;\n    int ul;\n    FILE *fp;\n    char *ptr;\n    struct emailinfo *e3 = NULL;\n\n    dp = NULL;\n    ul = 0;\n\n    if ((e3 = neighborlookup(num, direction)) != NULL \n\t&& (email = neighborlookup(num-1, 1)) != NULL)\n\tfilename = articlehtmlfilename(e3);\n    else\n\treturn;\n    bp = NULL;\n    fp = fopen(filename, \"r\");\n    if (fp) {\n\twhile ((fgets(line, MAXLINE, fp)) != NULL)\n\t    bp = addbody(bp, &lp, line, 0);\n    }\n    else\n\treturn;\n    fclose(fp);\n\n    cp = bp;\t\t\t/* save start of list to free later */\n\n#ifdef HAVE_ICONV\n    char *numsubject,*numname;\n    numsubject=i18n_utf2numref(email->subject,1);\n    numname=i18n_utf2numref(email->name,1);\n#endif\n\n    fp = fopen(filename, \"w+\");\n    if (fp) {\n\twhile (bp) {\n\t    if (!strncmp(bp->line, \"<!-- emptylink=\", 15)) {\n\t      /* JK: just skip this line and the following which is just our\n\t       empty marker. */\n\t      bp = bp->next;\n\t      bp = bp->next;\n\t      continue;\n\t    }\n\t    fprintf(fp, \"%s\", bp->line);\n\n\t    if (!strncmp(bp->line, \"<!-- unext=\", 11)) {\n#ifdef HAVE_ICONV\n\t      ptr = strsav(numsubject);\n#else\n\t      ptr = convchars(email->subject, email->charset);\n#endif\n\t      fprintf(fp, \"[ <a href=\\\"%s\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t       msg_href (email, e3, FALSE), \n#ifdef HAVE_ICONV\n\t\t      numname, ptr ? ptr : \"\", \n#else\n\t\t      email->name, ptr ? ptr : \"\", \n#endif\n\t\t      lang[MSG_NEXT_MESSAGE]);\n\t      if (ptr)\n\t\tfree(ptr);\n\t    }\n\t    else if (!strncmp(bp->line, \"<!-- lnext=\", 11)) {\n#ifdef HAVE_ICONV\n\t      ptr = strsav(numsubject);\n#else\n\t      ptr = convchars(email->subject, email->charset);\n#endif\n\t      fprintf(fp, \"<li><dfn>%s</dfn>: \", lang[MSG_NEXT_MESSAGE]);\n\t      fprintf(fp, \"<a href=\\\"%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t      msg_href(email, e3, FALSE), lang[MSG_LTITLE_NEXT],\n#ifdef HAVE_ICONV\n\t\t      numname, ptr ? ptr : \"\");\n#else\n\t\t      email->name, ptr ? ptr : \"\");\n#endif\n\t      if (ptr)\n\t\tfree(ptr);\n\t    }\n\t    else if (!strncmp(bp->line, \"<!-- next=\", 10)) {\n\t      dp = bp->next;\n\t      if (!strncmp(dp->line, \"<ul\", 3)) {\n\t\tfprintf(fp, \"%s\", dp->line);\n\t\tul = 1;\n\t      }\n\t      fprintf(fp, \"<li><strong>%s:</strong> \",\n\t\t      lang[MSG_NEXT_MESSAGE]);\n\t      fprintf(fp, \"%s%s: \\\"%s\\\"</a></li>\\n\", msg_href(email, e3, TRUE),\n#ifdef HAVE_ICONV\n\t\t      numname, numsubject);\n#else\n\t\t      email->name, ptr = convchars(email->subject, email->charset));\n\t      free(ptr);\n#endif\t      \n\t      if (ul) {\n\t\tbp = dp;\n\t\tul = 0;\n\t      }\n\t      \n\t    }\n\t    bp = bp->next;\n\t}\n    }\n    fclose(fp);\n\n    /* can we clean up a bit please... */\n    free_body(cp);\n    free(filename);\n}\n\n/*\n** Adds a \"Reply:\" link in the proper article, after the archive has been\n** incrementally updated.\n*/\n\nvoid fixreplyheader(char *dir, int num, int remove_maybes, int max_update)\n{\n    char *filename;\n    char line[MAXLINE];\n\n    int subjmatch = 0;\n    int replynum = -1;\n\n    struct body *bp, *cp, *status;\n    struct body *lp = NULL;\n    FILE *fp;\n    char *ptr;\n\n    struct emailinfo *email;\n    struct emailinfo *email2 = NULL;\n\n    const char *last_reply = \"\";\n    int next_in_thread = -1;\n\n    const char *old_maybe_pattern = \"<li> <b>Maybe reply:</b> <a href=\";\n    const char *old_reply_pattern = \"<b>Reply:</b> \";\n    const char *old_nextinthread_pattern = \"<b>Next in thread:</b> <a href=\\\"\";\n    const char *old_next_pattern = \"<li> <b>Next message:</b>:\";\n\n    /* pre-WAI patterns */\n    char old2_maybe_pattern[MAXLINE];\n    char old2_link_maybe_pattern[MAXLINE];\n    char old2_reply_pattern[MAXLINE];\n    char old2_link_reply_pattern[MAXLINE];\n    char old2_nextinthread_pattern[MAXLINE];\n    char old2_next_pattern[MAXLINE];\n\n    char current_maybe_pattern[MAXLINE];\n    char current_link_maybe_pattern[MAXLINE];\n    char current_reply_pattern[MAXLINE];\n    char current_link_reply_pattern[MAXLINE];\n    char current_nextinthread_pattern[MAXLINE];\n    char current_next_pattern[MAXLINE];\n    \n    bool is_old_format = FALSE;\n\n    status = hashnumlookup(num, &email);\n\n    if (status == NULL || email->is_deleted)\n\treturn;\n\n    if (remove_maybes || set_linkquotes) {\n        snprintf(current_maybe_pattern, sizeof(current_maybe_pattern), \n                \"<li><dfn>%s</dfn>: <a href=\", lang[MSG_MAYBE_REPLY]);\n        snprintf(current_link_maybe_pattern, sizeof(current_maybe_pattern), \n                \"<li><a name=\\\"replies\\\" id=\\\"replies\\\"></a><dfn>%s</dfn>: <a href=\", \n\t\t lang[MSG_MAYBE_REPLY]);\n        snprintf(current_reply_pattern, sizeof(current_reply_pattern), \n                \"<li><dfn>%s</dfn>: <a href=\", lang[MSG_REPLY]);\n        snprintf(current_link_reply_pattern, sizeof(current_reply_pattern), \n                \"<li><a name=\\\"replies\\\" id=\\\"replies\\\"></a><dfn>%s</dfn>: <a href=\",\n\t\t lang[MSG_REPLY]);\n        snprintf(current_nextinthread_pattern, \n                sizeof(current_nextinthread_pattern), \n                \"<li><dfn>%s</dfn>: <a href=\", lang[MSG_NEXT_IN_THREAD]);\n        snprintf(current_next_pattern, sizeof(current_next_pattern), \n                \"<li>dfn>%s</dfn>: <a href=\", lang[MSG_NEXT_MESSAGE]);\n\n\t/* backwards compatiblity */\n\tsnprintf(old2_maybe_pattern, sizeof(old2_maybe_pattern), \n                \"<li><strong>%s:</strong> <a href=\", lang[MSG_MAYBE_REPLY]);\n        snprintf(old2_reply_pattern, sizeof(old2_reply_pattern), \n                \"<li><strong>%s:</strong> <a href=\", lang[MSG_REPLY]);\n        snprintf(old2_nextinthread_pattern, \n                sizeof(old2_nextinthread_pattern), \n                \"<li><strong>%s:</strong> <a href=\", lang[MSG_NEXT_IN_THREAD]);\n        snprintf(old2_next_pattern, sizeof(old2_next_pattern), \n                \"<li><strong>%s:</strong> <a href=\", lang[MSG_NEXT_MESSAGE]);\n    }\n\n    if (set_linkquotes) {\n      struct reply *rp;\n      for (rp = replylist; rp != NULL; rp = rp->next) {\n\tif (rp->msgnum == num && !rp->maybereply) {\n\t  replynum = rp->frommsgnum;\n\t  break;\n\t}\n      }\n      if (!set_showreplies && replynum != num - 1)\n\treturn;\n      if (replynum == -1 && email->inreplyto && email->inreplyto[0]) {\n\temail2 = hashreplylookup(email->msgnum, email->inreplyto,\n\t\t\t\t email->subject, &subjmatch);\n\tif (!email2)\n\t  return;\n\treplynum = email2->msgnum;\n\tif (subjmatch && remove_maybes)\n\t  return;\n      }\n      if (replynum == -1)\n\t  return;\n    }\n    else {\n\tif (!email->inreplyto || !email->inreplyto[0])\n\t    return;\n\temail2 = hashreplylookup(email->msgnum, email->inreplyto,\n\t\t\t\t email->subject, &subjmatch);\n\tif (!email2)\n\t    return;\n\treplynum = email2->msgnum;\n    }\n    if (replynum >= max_update)\t/* was created this session, must be current */\n\treturn;\n\n    if (email2 == NULL)\n\thashnumlookup(replynum, &email2);\n    filename = articlehtmlfilename(email2);\n\n    bp = NULL;\n    fp = fopen(filename, \"r\");\n    if (fp) {\n\twhile ((fgets(line, MAXLINE, fp)) != NULL) {\n\t    if (set_linkquotes) {\n\t        const char *ptr = strstr(line, old_nextinthread_pattern);\n\t\tif (ptr)\n\t\t    next_in_thread = atoi(ptr+strlen(old_nextinthread_pattern));\n\t\telse {\n\t\t    ptr = strstr(line, current_nextinthread_pattern);\n\t\t    if (ptr)\n\t\t        next_in_thread = atoi(ptr+strlen(current_nextinthread_pattern));\n\t\t    else {\n\t\t      ptr = strstr(line, old2_nextinthread_pattern);\n\t\t      if (ptr) {\n\t\t        next_in_thread = atoi(ptr+strlen(old2_nextinthread_pattern));\n\t\t\tis_old_format = TRUE;\n\t\t      }\n\t\t    }\n\t\t}\n\t    }\n\t    bp = addbody(bp, &lp, line, 0);\n\t}\n    }\n    else {\n\tfree(filename);\n\treturn;\n    }\n    fclose(fp);\n\n    cp = bp;\t\t\t/* save start of list to free later */\n\n#ifdef HAVE_ICONV\n    char *numsubject,*numname;\n    numsubject=i18n_utf2numref(email->subject,1);\n    numname=i18n_utf2numref(email->name,1);\n#endif\n\n    fp = fopen(filename, \"w+\");\n    if (fp) {\n        bool list_started = FALSE; /* tells when we're starting a reply list for the\n\t\t\t\t      first time */\n\twhile (bp) {\n\t    if (!strncmp(bp->line, \"<!-- emptylink=\", 15)) {\n\t      /* JK: just skip this line and the following which is just our\n\t       empty marker. */\n\t      bp = bp->next;\n\t      bp = bp->next;\n\t      continue;\n\t    }\n\t    if (!strncmp(bp->line, \" [ <a href=\\\"#replies\\\">\", 22)) {\n\t      list_started = TRUE; \n\t      fprintf (fp, \"%s\", bp->line);\n\t      bp = bp->next;\n\t      continue;\n\t    }\n\t    if (!strncmp(bp->line, \"<!-- ureply\", 11)) {\n\t      if (list_started == FALSE)\n\t\tfprintf (fp, \" [ <a href=\\\"#replies\\\">%s</a> ]\\n\", \n\t\t\t lang[MSG_REPLIES]);\n\t      fprintf (fp, \"%s\", bp->line);\n\t      bp = bp->next;\n\t      continue;\n\t    }\n\t    if (!strncmp(bp->line, \"<!-- lreply\", 11)) {\n\t        char *del_msg = (email2->is_deleted ? lang[MSG_DEL_SHORT] : \"\");\n\t\tchar *ptr1;\n#ifdef HAVE_ICONV\n\t\tptr=strsav(numsubject);\n#else\n\t\tptr = convchars(email->subject, email->charset);\n#endif\n\t\tif (list_started == FALSE) {\n\t\t  list_started = TRUE;\n\t\t  trio_asprintf(&ptr1,\n\t\t\t\t\"<li><a name=\\\"replies\\\" id=\\\"replies\\\"></a>\"\n\t\t\t\t\"<dfn>%s</dfn>: %s <a href=\\\"%s\\\" title=\\\"%s\\\">\"\n\t\t\t\t\"%s: \\\"%s\\\"</a></li>\\n\",\n\t\t\t\tlang[subjmatch ? MSG_MAYBE_REPLY : MSG_REPLY],\n\t\t\t\tdel_msg, msg_href(email, email2, FALSE), \n\t\t\t\tlang[MSG_LTITLE_REPLIES],\n#ifdef HAVE_ICONV\n\t\t\t\tnumname, ptr);\n#else\n\t\t\t\temail->name, ptr);\n#endif\n\t\t}\n\t\telse\n\t\t  trio_asprintf(&ptr1,\n\t\t\t\t\"<li><dfn>%s</dfn>: %s <a href=\\\"%s\\\" title=\\\"%s\\\">\"\n\t\t\t\t\"%s: \\\"%s\\\"</a></li>\\n\",\n\t\t\t\tlang[subjmatch ? MSG_MAYBE_REPLY : MSG_REPLY],\n\t\t\t\tdel_msg, msg_href(email, email2, FALSE), \n\t\t\t\tlang[MSG_LTITLE_REPLIES],\n#ifdef HAVE_ICONV\n\t\t\t\tnumname, ptr);\n#else\n\t\t\t\temail->name, ptr);\n#endif\n\t\tfree(ptr);\n\n\t\tif (!last_reply || strcmp(ptr1, last_reply))\n\t\t    fputs(ptr1, fp);\n\t\tfree(ptr1);\n\t    }\n\t    else if (!strncmp(bp->line, \"<!-- reply\", 10)) {\n\t      /* backwards compatiblity with the pre-WAI code */\n\t        char *del_msg = (email2->is_deleted ? lang[MSG_DEL_SHORT] : \"\");\n\t\tchar *ptr1;\n#ifdef HAVE_ICONV\n\t\tptr=strsav(email->subject);\n#else\n\t\tptr = convchars(email->subject, email->charset);\n#endif\n\t\ttrio_asprintf(&ptr1,\n\t\t\t      \"<li><strong>%s:</strong>%s %s%s: \\\"%s\\\"</a></li>\\n\",\n\t\t\t      lang[subjmatch ? MSG_MAYBE_REPLY : MSG_REPLY],\n\t\t\t      del_msg, msg_href(email, email2, TRUE),\n#ifdef HAVE_ICONV\n\t\t\t      numname, ptr);\n#else\n\t\t\t      email->name, ptr);\n#endif\n\t\tfree(ptr);\n\n\t\tif (!last_reply || strcmp(ptr1, last_reply))\n\t\t    fputs(ptr1, fp);\n\t\tfree(ptr1);\n\t    }\n\t    if (next_in_thread - 1 == replynum\n\t\t&& (strcasestr(bp->line, current_next_pattern)\n\t\t    || strcasestr(bp->line, old2_next_pattern)\n\t\t    || strstr(bp->line, old_next_pattern))) {\n\t        bp = bp->next;\n\t\tcontinue; /* line duplicates next in thread; suppress */\n\t    }\n\n\t    if (!remove_maybes\n\t\t|| strncasecmp(bp->line, current_maybe_pattern, strlen(current_maybe_pattern))\n\t\t|| strncasecmp(bp->line, current_link_maybe_pattern, \n\t\t\t       strlen(current_link_maybe_pattern))\n\t\t|| strncasecmp(bp->line, old2_link_maybe_pattern, \n\t\t\t       strlen(old2_link_maybe_pattern))\n\t\t|| strncasecmp(bp->line, old_maybe_pattern, strlen(old_maybe_pattern)))\n\t        fprintf(fp, \"%s\", bp->line); /* not redundant or disproven */\n\t    if (set_linkquotes && (strcasestr(bp->line, current_reply_pattern)\n\t\t\t\t   || strcasestr(bp->line, current_link_reply_pattern)\n\t\t\t\t   || strcasestr(bp->line, old2_reply_pattern)\n\t\t\t\t   || strcasestr(bp->line, old2_link_reply_pattern)\n\t\t\t\t   || strstr(bp->line, old_reply_pattern)))\n\t        last_reply = bp->line;\n\t    bp = bp->next;\n\t}\n    }\n    fclose(fp);\n\n    /* can we clean up a bit please... */\n    free_body(cp);\n    free(filename);\n}\n\n/*\n** Adds a \"Next in thread:\" link in the proper article, after the archive\n** has been incrementally updated.\n*/\n\nvoid fixthreadheader(char *dir, int num, int max_update)\n{\n    char *filename;\n    char line[MAXLINE];\n    char *name = NULL;\n    char *subject = NULL;\n    FILE *fp;\n    struct reply *rp;\n    struct body *bp, *cp;\n    struct body *lp = NULL;\n    int threadnum = 0;\n    char *ptr;\n\n    for (rp = threadlist; rp != NULL; rp = rp->next) {\n\tif (rp->next != NULL &&\n\t    (rp->next->data && rp->next->data->msgnum == num) &&\n\t    (rp->data && rp->msgnum != -1)\n\t    ) {\n\n\t    threadnum = rp->msgnum;\n\t    name = rp->next->data->name;\n\t    subject = rp->next->data->subject;\n\t    break;\n\t}\n    }\n\n    if (rp == NULL || threadnum >= max_update)\n\treturn;\n\n    filename = articlehtmlfilename(rp->data);\n\n    bp = NULL;\n    if ((fp = fopen(filename, \"r\")) != NULL) {\n\twhile ((fgets(line, MAXLINE, fp)) != NULL)\n\t    bp = addbody(bp, &lp, line, 0);\n    }\n    else {\n\tfree(filename);\n\treturn;\n    }\n\n    fclose(fp);\n\n    cp = bp;\t\t\t/* save start of list to free later */\n\n#ifdef HAVE_ICONV\n    char *numsubject,*numname;\n    ptr=NULL;\n    numsubject=i18n_utf2numref(subject,1);\n    numname=i18n_utf2numref(name,1);\n#endif\n\n    if ((fp = fopen(filename, \"w+\")) != NULL) {\n\twhile (bp != NULL) {\n\t   if (!strncmp(bp->line, \"<!-- emptylink=\", 15)) {\n\t      /* JK: just skip this line and the following which is just our\n\t       empty marker. */\n\t      bp = bp->next;\n\t      bp = bp->next;\n\t      continue;\n\t    }\n\t   /* @@ JK: don't I have the charset here? */\n\t    fprintf(fp, \"%s\", bp->line);\n\t    if (!strncmp(bp->line, \"<!-- unextthr\", 13)) {\n\t      struct emailinfo *e3;\n\t      if (hashnumlookup(num, &e3)) {\n\t\tfprintf (fp, \" [ <a href=\\\"%s\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\",\n\t\t\t msg_href (e3, rp->data, FALSE), \n#ifdef HAVE_ICONV\n\t\t\t numname, numsubject,\n#else\n\t\t\t name, ptr = convchars(subject, NULL),\n#endif\n\t\t\t lang[MSG_NEXT_IN_THREAD]);\n\t\tif (ptr)\n\t\t  free (ptr);\n\t\tif (bp->next && strstr(bp->next->line, lang[MSG_NEXT_IN_THREAD]))\n\t\t  bp = bp->next; /* skip old copy of this line */\n\t      }\n\t    }\n\t    else if (!strncmp(bp->line, \"<!-- lnextthr\", 13)) {\n\t      struct emailinfo *e3;\n\t      if (hashnumlookup(num, &e3)) {\n\t\tfprintf(fp, \"<li><dfn>%s</dfn>: \",\n\t\t\tlang[MSG_NEXT_IN_THREAD]);\n\t\tfprintf(fp, \"<a href=\\\"%s\\\" title=\\\"\\%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t\tmsg_href(e3, rp->data, FALSE), lang[MSG_LTITLE_NEXT_IN_THREAD],\n#ifdef HAVE_ICONV\n\t\t  numname, numsubject);\n                ptr=NULL;\n#else\n\t\t\tname, ptr = convchars(subject, NULL));\n#endif\n\t\tif (ptr)\n\t\t  free(ptr);\n\t\tif (bp->next && strstr(bp->next->line, lang[MSG_NEXT_IN_THREAD]))\n\t\t  bp = bp->next; /* skip old copy of this line */\n\t      }\n\t    }\n\t    else if (!strncmp(bp->line, \"<!-- nextthr\", 12)) {\n\t\tstruct emailinfo *e3;\n\t\tif(hashnumlookup(num, &e3)) {\n\t\t    fprintf(fp, \"<li><strong>%s:</strong> \",\n\t\t\t    lang[MSG_NEXT_IN_THREAD]);\n\t\t    fprintf(fp, \"%s\", msg_href(e3, rp->data, TRUE));\n\t\t    fprintf(fp, \"%s: \\\"%s\\\"</a></li>\\n\",\n#ifdef HAVE_ICONV\n\t\t\t    numname, numsubject);\n                    ptr=NULL;\n#else\n\t\t\t    name, ptr = convchars(subject, NULL));\n#endif\n\t\t    free(ptr);\n\t\t    if (bp->next && strstr(bp->next->line, lang[MSG_NEXT_IN_THREAD]))\n\t\t        bp = bp->next; /* skip old copy of this line */\n\t\t}\n\t    }\n\t    bp = bp->next;\n\t}\n    }\n    fclose(fp);\n\n    /* can we clean up a bit please... */\n    free_body(cp);\n    free(filename);\n}\n\nint count_deleted(int limit)\n{\n    struct hashemail *hp;\n    struct emailsubdir *sd;\n    int total = 0;\n    for (hp = deletedlist; hp != NULL; hp = hp->next) {\n\tif (hp->data->msgnum < limit) {\n\t    ++total;\n\t    if ((sd = hp->data->subdir) != NULL)\n\t        --sd->count;\n\t}\n    }\n    return total;\n}\n"
  },
  {
    "path": "src/parse.h",
    "content": "/*\n** parse.c Functions\n*/\n\nint ignorecontent(char *);\nint inlinecontent(char *);\nint preferedcontent(int *, char *, int);\nchar *safe_filename(char *);\nchar *getmaildate(char *);\nchar *getfromdate(char *);\nchar *getid(char *);\nchar *getsubject(char *);\nchar *getreply(char *);\nvoid print_progress(int, char *, char *);\nint parsemail(char *, int, int, int, char *, int, int);\nint parse_old_html(int, struct emailinfo *, int, int, struct reply **, int);\nint loadoldheaders(char *);\nint loadoldheadersfromGDBMindex(char *, int);\nvoid crossindex(void);\nvoid crossindexthread1(struct header *);\nvoid crossindexthread2(int);\nvoid fixnextheader(char *, int, int);\nvoid fixreplyheader(char *, int, int, int);\nvoid fixthreadheader(char *, int, int);\nint isre(char *, char **);\nchar *findre(char *, char **);\nint textcontent(char *);\nchar *createlink(char *, char *, char *, int, char *);\nvoid emptydir(char *);\nint count_deleted(int);\n\n/*\n * Suffix to prepend to all saved attachments' filenames when the\n * headers don't propose a filename\n */\n#define FILE_SUFFIXER \"part\"\n\n/*\n * Prefix to prepend to all saved attachments' directory names (before\n * the article number)\n */\n#define DIR_PREFIXER \"att-\"\n\n/* \n * Used to replace invalid characters in supplied attachment filenames\n */\n#define REPLACEMENT_CHAR '_'\n\n/*\n * Directory where meta information will be stored\n */\n#define META_DIR \".meta\"\n\n/*\n * Extension to add to meta files\n */\n#define META_EXTENSION \".meta\"\n"
  },
  {
    "path": "src/pcre/132html",
    "content": "#! /usr/bin/perl -w\n\n# Script to turn PCRE man pages into HTML\n\n\n# Subroutine to handle font changes and other escapes\n\nsub do_line {\nmy($s) = $_[0];\n\n$s =~ s/</&#60;/g;                   # Deal with < and >\n$s =~ s/>/&#62;/g;\n$s =~ s\"\\\\fI(.*?)\\\\f[RP]\"<i>$1</i>\"g;\n$s =~ s\"\\\\fB(.*?)\\\\f[RP]\"<b>$1</b>\"g;\n$s =~ s\"\\\\e\"\\\\\"g;\n$s =~ s/(?<=Copyright )\\(c\\)/&copy;/g;\n$s;\n}\n\n# Subroutine to ensure not in a paragraph\n\nsub end_para {\nif ($inpara)\n  {\n  print TEMP \"</PRE>\\n\" if ($inpre);\n  print TEMP \"</P>\\n\";\n  }\n$inpara = $inpre = 0;\n$wrotetext = 0;\n}\n\n# Subroutine to start a new paragraph\n\nsub new_para {\n&end_para();\nprint TEMP \"<P>\\n\";\n$inpara = 1;\n}\n\n\n# Main program\n\n$innf = 0;\n$inpara = 0;\n$inpre = 0;\n$wrotetext = 0;\n$toc = 0;\n$ref = 1;\n\nwhile ($#ARGV >= 0 && $ARGV[0] =~ /^-/)\n  {\n  $toc = 1 if $ARGV[0] eq \"-toc\";\n  shift;\n  }\n\n# Initial output to STDOUT\n\nprint <<End ;\n<html>\n<head>\n<title>$ARGV[0] specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>$ARGV[0] man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\nEnd\n\nprint \"<ul>\\n\" if ($toc);\n\nopen(TEMP, \">/tmp/$$\") || die \"Can't open /tmp/$$ for output\\n\";\n\nwhile (<STDIN>)\n  {\n  # Handle lines beginning with a dot\n\n  if (/^\\./)\n    {\n    # Some of the PCRE man pages used to contain instances of .br. However,\n    # they should have all been removed because they cause trouble in some\n    # (other) automated systems that translate man pages to HTML. Complain if\n    # we find .br or .in (another macro that is deprecated).\n\n    if (/^\\.br/ || /^\\.in/)\n      {\n      print STDERR \"\\n*** Deprecated macro encountered - rewrite needed\\n\";\n      print STDERR \"*** $_\\n\";\n      die \"*** Processing abandoned\\n\";\n      }\n\n    # Instead of .br, relevent \"literal\" sections are enclosed in .nf/.fi.\n\n    elsif (/^\\.nf/)\n      {\n      $innf = 1;\n      }\n\n    elsif (/^\\.fi/)\n      {\n      $innf = 0;\n      }\n\n    # Handling .sp is subtle. If it is inside a literal section, do nothing if\n    # the next line is a non literal text line; similarly, if not inside a\n    # literal section, do nothing if a literal follows, unless we are inside\n    # a .nf/.ne section. The point being that the <pre> and </pre> that delimit\n    # literal sections will do the spacing. Always skip if no previous output.\n\n    elsif (/^\\.sp/)\n      {\n      if ($wrotetext)\n        {\n        $_ = <STDIN>;\n        if ($inpre)\n          {\n          print TEMP \"\\n\" if (/^[\\s.]/);\n          }\n        else\n          {\n          print TEMP \"<br>\\n<br>\\n\" if ($innf || !/^[\\s.]/);\n          }\n        redo;    # Now process the lookahead line we just read\n        }\n      }\n    elsif (/^\\.TP/ || /^\\.PP/ || /^\\.P/)\n      {\n      &new_para();\n      }\n    elsif (/^\\.SH\\s*(\"?)(.*)\\1/)\n      {\n      # Ignore the NAME section\n      if ($2 =~ /^NAME\\b/)\n        {\n        <STDIN>;\n        next;\n        }\n\n      &end_para();\n      my($title) = &do_line($2);\n      if ($toc)\n        {\n        printf(\"<li><a name=\\\"TOC%d\\\" href=\\\"#SEC%d\\\">$title</a>\\n\",\n          $ref, $ref);\n        printf TEMP (\"<br><a name=\\\"SEC%d\\\" href=\\\"#TOC1\\\">$title</a><br>\\n\",\n          $ref);\n        $ref++;\n        }\n      else\n        {\n        print TEMP \"<br><b>\\n$title\\n</b><br>\\n\";\n        }\n      }\n    elsif (/^\\.SS\\s*(\"?)(.*)\\1/)\n      {\n      &end_para();\n      my($title) = &do_line($2);\n      print TEMP \"<br><b>\\n$title\\n</b><br>\\n\";\n      }\n    elsif (/^\\.B\\s*(.*)/)\n      {\n      &new_para() if (!$inpara);\n      $_ = &do_line($1);\n      s/\"(.*?)\"/$1/g;\n      print TEMP \"<b>$_</b>\\n\";\n      $wrotetext = 1;\n      }\n    elsif (/^\\.I\\s*(.*)/)\n      {\n      &new_para() if (!$inpara);\n      $_ = &do_line($1);\n      s/\"(.*?)\"/$1/g;\n      print TEMP \"<i>$_</i>\\n\";\n      $wrotetext = 1;\n      }\n\n    # A comment that starts \"HREF\" takes the next line as a name that\n    # is turned into a hyperlink, using the text given, which might be\n    # in a special font. If it ends in () or (digits) or punctuation, they\n    # aren't part of the link.\n\n    elsif (/^\\.\\\\\"\\s*HREF/)\n      {\n      $_=<STDIN>;\n      chomp;\n      $_ = &do_line($_);\n      $_ =~ s/\\s+$//;\n      $_ =~ /^(?:<.>)?([^<(]+)(?:\\(\\))?(?:<\\/.>)?(?:\\(\\d+\\))?[.,;:]?$/;\n      print TEMP \"<a href=\\\"$1.html\\\">$_</a>\\n\";\n      }\n\n    # A comment that starts \"HTML\" inserts literal HTML\n\n    elsif (/^\\.\\\\\"\\s*HTML\\s*(.*)/)\n      {\n      print TEMP $1;\n      }\n\n    # A comment that starts < inserts that HTML at the end of the\n    # *next* input line - so as not to get a newline between them.\n\n    elsif (/^\\.\\\\\"\\s*(<.*>)/)\n      {\n      my($markup) = $1;\n      $_=<STDIN>;\n      chomp;\n      $_ = &do_line($_);\n      $_ =~ s/\\s+$//;\n      print TEMP \"$_$markup\\n\";\n      }\n\n    # A comment that starts JOIN joins the next two lines together, with one\n    # space between them. Then that line is processed. This is used in some\n    # displays where two lines are needed for the \"man\" version. JOINSH works\n    # the same, except that it assumes this is a shell command, so removes\n    # continuation backslashes.\n\n    elsif (/^\\.\\\\\"\\s*JOIN(SH)?/)\n      {\n      my($one,$two);\n      $one = <STDIN>;\n      $two = <STDIN>;\n      $one =~ s/\\s*\\\\e\\s*$// if (defined($1));\n      chomp($one);\n      $two =~ s/^\\s+//;\n      $_ = \"$one $two\";\n      redo;            # Process the joined lines\n      }\n\n    # .EX/.EE are used in the pcredemo page to bracket the entire program,\n    # which is unmodified except for turning backslash into \"\\e\".\n\n    elsif (/^\\.EX\\s*$/)\n      {\n      print TEMP \"<PRE>\\n\";\n      while (<STDIN>)\n        {\n        last if /^\\.EE\\s*$/;\n        s/\\\\e/\\\\/g;\n        s/&/&amp;/g;\n        s/</&lt;/g;\n        s/>/&gt;/g;\n        print TEMP;\n        }\n      }\n\n    # Ignore anything not recognized\n\n    next;\n    }\n\n  # Line does not begin with a dot. Replace blank lines with new paragraphs\n\n  if (/^\\s*$/)\n    {\n    &end_para() if ($wrotetext);\n    next;\n    }\n\n  # Convert fonts changes and output an ordinary line. Ensure that indented\n  # lines are marked as literal.\n\n  $_ = &do_line($_);\n  &new_para() if (!$inpara);\n\n  if (/^\\s/)\n    {\n    if (!$inpre)\n      {\n      print TEMP \"<pre>\\n\";\n      $inpre = 1;\n      }\n    }\n  elsif ($inpre)\n    {\n    print TEMP \"</pre>\\n\";\n    $inpre = 0;\n    }\n\n  # Add <br> to the end of a non-literal line if we are within .nf/.fi\n\n  $_ .= \"<br>\\n\" if (!$inpre && $innf);\n\n  print TEMP;\n  $wrotetext = 1;\n  }\n\n# The TOC, if present, will have been written - terminate it\n\nprint \"</ul>\\n\" if ($toc);\n\n# Copy the remainder to the standard output\n\nclose(TEMP);\nopen(TEMP, \"/tmp/$$\") || die \"Can't open /tmp/$$ for input\\n\";\n\nprint while (<TEMP>);\n\nprint <<End ;\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\nEnd\n\nclose(TEMP);\nunlink(\"/tmp/$$\");\n\n# End\n"
  },
  {
    "path": "src/pcre/AUTHORS",
    "content": "THE MAIN PCRE LIBRARY\n---------------------\n\nWritten by:       Philip Hazel\nEmail local part: ph10\nEmail domain:     cam.ac.uk\n\nUniversity of Cambridge Computing Service,\nCambridge, England.\n\nCopyright (c) 1997-2019 University of Cambridge\nAll rights reserved\n\n\nPCRE JUST-IN-TIME COMPILATION SUPPORT\n-------------------------------------\n\nWritten by:       Zoltan Herczeg\nEmail local part: hzmester\nEmain domain:     freemail.hu\n\nCopyright(c) 2010-2019 Zoltan Herczeg\nAll rights reserved.\n\n\nSTACK-LESS JUST-IN-TIME COMPILER\n--------------------------------\n\nWritten by:       Zoltan Herczeg\nEmail local part: hzmester\nEmain domain:     freemail.hu\n\nCopyright(c) 2009-2019 Zoltan Herczeg\nAll rights reserved.\n\n\nTHE C++ WRAPPER LIBRARY\n-----------------------\n\nWritten by:       Google Inc.\n\nCopyright (c) 2007-2012 Google Inc\nAll rights reserved\n\n####\n"
  },
  {
    "path": "src/pcre/CMakeLists.txt",
    "content": "# CMakeLists.txt\n#\n#\n# This file allows building PCRE with the CMake configuration and build\n# tool. Download CMake in source or binary form from http://www.cmake.org/\n#\n# Original listfile by Christian Ehrlicher <Ch.Ehrlicher@gmx.de>\n# Refined and expanded by Daniel Richard G. <skunk@iSKUNK.ORG>\n# 2007-09-14 mod by Sheri so 7.4 supported configuration options can be entered\n# 2007-09-19 Adjusted by PH to retain previous default settings\n# 2007-12-26 (a) On UNIX, use names libpcre instead of just pcre\n#            (b) Ensure pcretest and pcregrep link with the local library,\n#                not a previously-installed one.\n#            (c) Add PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, and\n#                PCRE_SUPPORT_LIBBZ2.\n# 2008-01-20 Brought up to date to include several new features by Christian\n#            Ehrlicher.\n# 2008-01-22 Sheri added options for backward compatibility of library names\n#            when building with minGW:\n#            if \"ON\", NON_STANDARD_LIB_PREFIX causes shared libraries to\n#            be built without \"lib\" as prefix. (The libraries will be named\n#            pcre.dll, pcreposix.dll and pcrecpp.dll).\n#            if \"ON\", NON_STANDARD_LIB_SUFFIX causes shared libraries to\n#            be built with suffix of \"-0.dll\". (The libraries will be named\n#            libpcre-0.dll, libpcreposix-0.dll and libpcrecpp-0.dll - same names\n#            built by default with Configure and Make.\n# 2008-01-23 PH removed the automatic build of pcredemo.\n# 2008-04-22 PH modified READLINE support so it finds NCURSES when needed.\n# 2008-07-03 PH updated for revised UCP property support (change of files)\n# 2009-03-23 PH applied Steven Van Ingelgem's patch to change the name\n#            CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE\n#            is included within another project.\n# 2009-03-23 PH applied a modified version of Steven Van Ingelgem's patches to\n#            add options to stop the building of pcregrep and the tests, and\n#            to disable the final configuration report.\n# 2009-04-11 PH applied Christian Ehrlicher's patch to show compiler flags that\n#            are set by specifying a release type.\n# 2010-01-02 PH added test for stdint.h\n# 2010-03-02 PH added test for inttypes.h\n# 2011-08-01 PH added PCREGREP_BUFSIZE\n# 2011-08-22 PH added PCRE_SUPPORT_JIT\n# 2011-09-06 PH modified WIN32 ADD_TEST line as suggested by Sergey Cherepanov\n# 2011-09-06 PH added PCRE_SUPPORT_PCREGREP_JIT\n# 2011-10-04 Sheri added support for including coff data in windows shared libraries\n#            compiled with MINGW if pcre.rc and/or pcreposix.rc are placed in\n#            the source dir by the user prior to building\n# 2011-10-04 Sheri changed various add_test's to use exes' location built instead\n#            of DEBUG location only (likely only matters in MSVC)\n# 2011-10-04 Sheri added scripts to provide needed variables to RunTest and\n#            RunGrepTest (used for UNIX and Msys)\n# 2011-10-04 Sheri added scripts to provide needed variables and to execute\n#            RunTest.bat in Win32 (for effortless testing with \"make test\")\n# 2011-10-04 Sheri Increased minimum required cmake version\n# 2012-01-06 PH removed pcre_info.c and added pcre_string_utils.c\n# 2012-01-10 Zoltan Herczeg added libpcre16 support\n# 2012-01-13 Stephen Kelly added out of source build support\n# 2012-01-17 PH applied Stephen Kelly's patch to parse the version data out\n#            of the configure.ac file\n# 2012-02-26 PH added support for libedit\n# 2012-09-06 PH added support for PCRE_EBCDIC_NL25\n# 2012-09-08 ChPe added PCRE32 support\n# 2012-10-23 PH added support for VALGRIND and GCOV\n# 2012-12-08 PH added patch from Daniel Richard G to quash some MSVC warnings\n# 2013-07-01 PH realized that the \"support\" for GCOV was a total nonsense and\n#            so it has been removed.\n# 2013-10-08 PH got rid of the \"source\" command, which is a bash-ism (use \".\")\n# 2013-11-05 PH added support for PARENS_NEST_LIMIT\n# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build\n# 2016-06-24 PH applied Chris Wilson's revised patch (adds a separate option)\n\nPROJECT(PCRE C CXX)\n\n# Increased minimum to 2.8.0 to support newer add_test features. Set policy\n# CMP0026 to avoid warnings for the use of LOCATION in GET_TARGET_PROPERTY.\n\nCMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)\nCMAKE_POLICY(SET CMP0026 OLD)\n\nSET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake\n\n# external packages\nFIND_PACKAGE( BZip2 )\nFIND_PACKAGE( ZLIB )\nFIND_PACKAGE( Readline )\nFIND_PACKAGE( Editline )\n\n# Configuration checks\n\nINCLUDE(CheckIncludeFile)\nINCLUDE(CheckIncludeFileCXX)\nINCLUDE(CheckFunctionExists)\nINCLUDE(CheckTypeSize)\n\nCHECK_INCLUDE_FILE(dirent.h     HAVE_DIRENT_H)\nCHECK_INCLUDE_FILE(stdint.h     HAVE_STDINT_H)\nCHECK_INCLUDE_FILE(inttypes.h   HAVE_INTTYPES_H)\nCHECK_INCLUDE_FILE(sys/stat.h   HAVE_SYS_STAT_H)\nCHECK_INCLUDE_FILE(sys/types.h  HAVE_SYS_TYPES_H)\nCHECK_INCLUDE_FILE(unistd.h     HAVE_UNISTD_H)\nCHECK_INCLUDE_FILE(windows.h    HAVE_WINDOWS_H)\n\nCHECK_INCLUDE_FILE_CXX(type_traits.h            HAVE_TYPE_TRAITS_H)\nCHECK_INCLUDE_FILE_CXX(bits/type_traits.h       HAVE_BITS_TYPE_TRAITS_H)\n\nCHECK_FUNCTION_EXISTS(bcopy     HAVE_BCOPY)\nCHECK_FUNCTION_EXISTS(memmove   HAVE_MEMMOVE)\nCHECK_FUNCTION_EXISTS(strerror  HAVE_STRERROR)\nCHECK_FUNCTION_EXISTS(strtoll   HAVE_STRTOLL)\nCHECK_FUNCTION_EXISTS(strtoq    HAVE_STRTOQ)\nCHECK_FUNCTION_EXISTS(_strtoi64 HAVE__STRTOI64)\n\nCHECK_TYPE_SIZE(\"long long\"             LONG_LONG)\nCHECK_TYPE_SIZE(\"unsigned long long\"    UNSIGNED_LONG_LONG)\n\n# User-configurable options\n#\n# (Note: CMakeSetup displays these in alphabetical order, regardless of\n# the order we use here)\n\nSET(BUILD_SHARED_LIBS OFF CACHE BOOL\n    \"Build shared libraries instead of static ones.\")\n\nOPTION(PCRE_BUILD_PCRE8 \"Build 8 bit PCRE library\" ON)\n\nOPTION(PCRE_BUILD_PCRE16 \"Build 16 bit PCRE library\" OFF)\n\nOPTION(PCRE_BUILD_PCRE32 \"Build 32 bit PCRE library\" OFF)\n\nOPTION(PCRE_BUILD_PCRECPP \"Build the PCRE C++ library (pcrecpp).\" ON)\n\nSET(PCRE_EBCDIC OFF CACHE BOOL\n    \"Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems.)\")\n\nSET(PCRE_EBCDIC_NL25 OFF CACHE BOOL\n    \"Use 0x25 as EBCDIC NL character instead of 0x15; implies EBCDIC.\")\n\nSET(PCRE_LINK_SIZE \"2\" CACHE STRING\n    \"Internal link size (2, 3 or 4 allowed). See LINK_SIZE in config.h.in for details.\")\n\nSET(PCRE_PARENS_NEST_LIMIT \"250\" CACHE STRING\n    \"Default nested parentheses limit. See PARENS_NEST_LIMIT in config.h.in for details.\")\n\nSET(PCRE_MATCH_LIMIT \"10000000\" CACHE STRING\n    \"Default limit on internal looping. See MATCH_LIMIT in config.h.in for details.\")\n\nSET(PCRE_MATCH_LIMIT_RECURSION \"MATCH_LIMIT\" CACHE STRING\n    \"Default limit on internal recursion. See MATCH_LIMIT_RECURSION in config.h.in for details.\")\n\nSET(PCREGREP_BUFSIZE \"20480\" CACHE STRING\n    \"Buffer size parameter for pcregrep. See PCREGREP_BUFSIZE in config.h.in for details.\")\n\nSET(PCRE_NEWLINE \"LF\" CACHE STRING\n    \"What to recognize as a newline (one of CR, LF, CRLF, ANY, ANYCRLF).\")\n\nSET(PCRE_NO_RECURSE OFF CACHE BOOL\n    \"If ON, then don't use stack recursion when matching. See NO_RECURSE in config.h.in for details.\")\n\nSET(PCRE_POSIX_MALLOC_THRESHOLD \"10\" CACHE STRING\n    \"Threshold for malloc() usage. See POSIX_MALLOC_THRESHOLD in config.h.in for details.\")\n\nSET(PCRE_SUPPORT_JIT OFF CACHE BOOL\n    \"Enable support for Just-in-time compiling.\")\n\nSET(PCRE_SUPPORT_PCREGREP_JIT ON CACHE BOOL\n    \"Enable use of Just-in-time compiling in pcregrep.\")\n\nSET(PCRE_SUPPORT_UTF OFF CACHE BOOL\n    \"Enable support for Unicode Transformation Format (UTF-8/UTF-16/UTF-32) encoding.\")\n\nSET(PCRE_SUPPORT_UNICODE_PROPERTIES OFF CACHE BOOL\n    \"Enable support for Unicode properties (if set, UTF support will be enabled as well).\")\n\nSET(PCRE_SUPPORT_BSR_ANYCRLF OFF CACHE BOOL\n    \"ON=Backslash-R matches only LF CR and CRLF, OFF=Backslash-R matches all Unicode Linebreaks\")\n\nSET(PCRE_SUPPORT_VALGRIND OFF CACHE BOOL\n    \"Enable Valgrind support.\")\n\nOPTION(PCRE_SHOW_REPORT    \"Show the final configuration report\" ON)\nOPTION(PCRE_BUILD_PCREGREP \"Build pcregrep\" ON)\nOPTION(PCRE_BUILD_TESTS    \"Build the tests\" ON)\n\nIF (MINGW)\n  OPTION(NON_STANDARD_LIB_PREFIX\n         \"ON=Shared libraries built in mingw will be named pcre.dll, etc., instead of libpcre.dll, etc.\"\n         OFF)\n\n  OPTION(NON_STANDARD_LIB_SUFFIX\n         \"ON=Shared libraries built in mingw will be named libpcre-0.dll, etc., instead of libpcre.dll, etc.\"\n         OFF)\nENDIF(MINGW)\n\nIF(MSVC)\n  OPTION(PCRE_STATIC_RUNTIME\n\t\"ON=Compile against the static runtime (/MT).\"\n\tOFF)\n  OPTION(INSTALL_MSVC_PDB\n         \"ON=Install .pdb files built by MSVC, if generated\"\n         OFF)\nENDIF(MSVC)\n\n# bzip2 lib\nIF(BZIP2_FOUND)\n  OPTION (PCRE_SUPPORT_LIBBZ2 \"Enable support for linking pcregrep with libbz2.\" ON)\nENDIF(BZIP2_FOUND)\nIF(PCRE_SUPPORT_LIBBZ2)\n  INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})\nENDIF(PCRE_SUPPORT_LIBBZ2)\n\n# zlib\nIF(ZLIB_FOUND)\n  OPTION (PCRE_SUPPORT_LIBZ \"Enable support for linking pcregrep with libz.\" ON)\nENDIF(ZLIB_FOUND)\nIF(PCRE_SUPPORT_LIBZ)\n  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})\nENDIF(PCRE_SUPPORT_LIBZ)\n\n# editline lib\nIF(EDITLINE_FOUND)\n  OPTION (PCRE_SUPPORT_LIBEDIT  \"Enable support for linking pcretest with libedit.\" OFF)\nENDIF(EDITLINE_FOUND)\nIF(PCRE_SUPPORT_LIBEDIT)\n  INCLUDE_DIRECTORIES(${EDITLINE_INCLUDE_DIR})\nENDIF(PCRE_SUPPORT_LIBEDIT)\n\n# readline lib\nIF(READLINE_FOUND)\n  OPTION (PCRE_SUPPORT_LIBREADLINE  \"Enable support for linking pcretest with libreadline.\" ON)\nENDIF(READLINE_FOUND)\nIF(PCRE_SUPPORT_LIBREADLINE)\n  INCLUDE_DIRECTORIES(${READLINE_INCLUDE_DIR})\nENDIF(PCRE_SUPPORT_LIBREADLINE)\n\n# Prepare build configuration\n\nSET(pcre_have_type_traits 0)\nSET(pcre_have_bits_type_traits 0)\n\nIF(HAVE_TYPE_TRAITS_H)\n        SET(pcre_have_type_traits 1)\nENDIF(HAVE_TYPE_TRAITS_H)\n\nIF(HAVE_BITS_TYPE_TRAITS_H)\n        SET(pcre_have_bits_type_traits 1)\nENDIF(HAVE_BITS_TYPE_TRAITS_H)\n\nSET(pcre_have_long_long 0)\nSET(pcre_have_ulong_long 0)\n\nIF(HAVE_LONG_LONG)\n        SET(pcre_have_long_long 1)\nENDIF(HAVE_LONG_LONG)\n\nIF(HAVE_UNSIGNED_LONG_LONG)\n        SET(pcre_have_ulong_long 1)\nENDIF(HAVE_UNSIGNED_LONG_LONG)\n\nIF(NOT BUILD_SHARED_LIBS)\n        SET(PCRE_STATIC 1)\nENDIF(NOT BUILD_SHARED_LIBS)\n\nIF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32)\n        MESSAGE(FATAL_ERROR \"At least one of PCRE_BUILD_PCRE8, PCRE_BUILD_PCRE16 or PCRE_BUILD_PCRE32 must be enabled\")\nENDIF(NOT PCRE_BUILD_PCRE8 AND NOT PCRE_BUILD_PCRE16 AND NOT PCRE_BUILD_PCRE32)\n\nIF(PCRE_BUILD_PCRE8)\n        SET(SUPPORT_PCRE8 1)\nENDIF(PCRE_BUILD_PCRE8)\n\nIF(PCRE_BUILD_PCRE16)\n        SET(SUPPORT_PCRE16 1)\nENDIF(PCRE_BUILD_PCRE16)\n\nIF(PCRE_BUILD_PCRE32)\n        SET(SUPPORT_PCRE32 1)\nENDIF(PCRE_BUILD_PCRE32)\n\nIF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8)\n        MESSAGE(STATUS \"** PCRE_BUILD_PCRE8 must be enabled for the C++ library support\")\n        SET(PCRE_BUILD_PCRECPP OFF)\nENDIF(PCRE_BUILD_PCRECPP AND NOT PCRE_BUILD_PCRE8)\n\nIF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8)\n        MESSAGE(STATUS \"** PCRE_BUILD_PCRE8 must be enabled for the pcregrep program\")\n        SET(PCRE_BUILD_PCREGREP OFF)\nENDIF(PCRE_BUILD_PCREGREP AND NOT PCRE_BUILD_PCRE8)\n\nIF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT)\n        MESSAGE(FATAL_ERROR \"Only one of libreadline or libeditline can be specified\")\nENDIF(PCRE_SUPPORT_LIBREADLINE AND PCRE_SUPPORT_LIBEDIT)\n\nIF(PCRE_SUPPORT_BSR_ANYCRLF)\n        SET(BSR_ANYCRLF 1)\nENDIF(PCRE_SUPPORT_BSR_ANYCRLF)\n\nIF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES)\n        SET(SUPPORT_UTF 1)\n        SET(PCRE_SUPPORT_UTF ON)\nENDIF(PCRE_SUPPORT_UTF OR PCRE_SUPPORT_UNICODE_PROPERTIES)\n\nIF(PCRE_SUPPORT_UNICODE_PROPERTIES)\n        SET(SUPPORT_UCP 1)\nENDIF(PCRE_SUPPORT_UNICODE_PROPERTIES)\n\nIF(PCRE_SUPPORT_JIT)\n        SET(SUPPORT_JIT 1)\nENDIF(PCRE_SUPPORT_JIT)\n\nIF(PCRE_SUPPORT_PCREGREP_JIT)\n        SET(SUPPORT_PCREGREP_JIT 1)\nENDIF(PCRE_SUPPORT_PCREGREP_JIT)\n\nIF(PCRE_SUPPORT_VALGRIND)\n        SET(SUPPORT_VALGRIND 1)\nENDIF(PCRE_SUPPORT_VALGRIND)\n\n# This next one used to contain\n#       SET(PCRETEST_LIBS ${READLINE_LIBRARY})\n# but I was advised to add the NCURSES test as well, along with\n# some modifications to cmake/FindReadline.cmake which should\n# make it possible to override the default if necessary. PH\n\nIF(PCRE_SUPPORT_LIBREADLINE)\n        SET(SUPPORT_LIBREADLINE 1)\n        SET(PCRETEST_LIBS ${READLINE_LIBRARY} ${NCURSES_LIBRARY})\nENDIF(PCRE_SUPPORT_LIBREADLINE)\n\n# libedit is a plug-compatible alternative to libreadline\n\nIF(PCRE_SUPPORT_LIBEDIT)\n        SET(SUPPORT_LIBEDIT 1)\n        SET(PCRETEST_LIBS ${EDITLINE_LIBRARY} ${NCURSES_LIBRARY})\nENDIF(PCRE_SUPPORT_LIBEDIT)\n\nIF(PCRE_SUPPORT_LIBZ)\n        SET(SUPPORT_LIBZ 1)\n        SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${ZLIB_LIBRARIES})\nENDIF(PCRE_SUPPORT_LIBZ)\n\nIF(PCRE_SUPPORT_LIBBZ2)\n        SET(SUPPORT_LIBBZ2 1)\n        SET(PCREGREP_LIBS ${PCREGREP_LIBS} ${BZIP2_LIBRARIES})\nENDIF(PCRE_SUPPORT_LIBBZ2)\n\nSET(NEWLINE \"\")\n\nIF(PCRE_NEWLINE STREQUAL \"LF\")\n        SET(NEWLINE \"10\")\nENDIF(PCRE_NEWLINE STREQUAL \"LF\")\nIF(PCRE_NEWLINE STREQUAL \"CR\")\n        SET(NEWLINE \"13\")\nENDIF(PCRE_NEWLINE STREQUAL \"CR\")\nIF(PCRE_NEWLINE STREQUAL \"CRLF\")\n        SET(NEWLINE \"3338\")\nENDIF(PCRE_NEWLINE STREQUAL \"CRLF\")\nIF(PCRE_NEWLINE STREQUAL \"ANY\")\n        SET(NEWLINE \"-1\")\nENDIF(PCRE_NEWLINE STREQUAL \"ANY\")\nIF(PCRE_NEWLINE STREQUAL \"ANYCRLF\")\n        SET(NEWLINE \"-2\")\nENDIF(PCRE_NEWLINE STREQUAL \"ANYCRLF\")\n\nIF(NEWLINE STREQUAL \"\")\n        MESSAGE(FATAL_ERROR \"The PCRE_NEWLINE variable must be set to one of the following values: \\\"LF\\\", \\\"CR\\\", \\\"CRLF\\\", \\\"ANY\\\", \\\"ANYCRLF\\\".\")\nENDIF(NEWLINE STREQUAL \"\")\n\nIF(PCRE_EBCDIC)\n        SET(EBCDIC 1)\nIF(PCRE_NEWLINE STREQUAL \"LF\")\n        SET(NEWLINE \"21\")\nENDIF(PCRE_NEWLINE STREQUAL \"LF\")\nIF(PCRE_NEWLINE STREQUAL \"CRLF\")\n        SET(NEWLINE \"3349\")\nENDIF(PCRE_NEWLINE STREQUAL \"CRLF\")\nENDIF(PCRE_EBCDIC)\n\nIF(PCRE_EBCDIC_NL25)\n        SET(EBCDIC 1)\n        SET(EBCDIC_NL25 1)\nIF(PCRE_NEWLINE STREQUAL \"LF\")\n        SET(NEWLINE \"37\")\nENDIF(PCRE_NEWLINE STREQUAL \"LF\")\nIF(PCRE_NEWLINE STREQUAL \"CRLF\")\n        SET(NEWLINE \"3365\")\nENDIF(PCRE_NEWLINE STREQUAL \"CRLF\")\nENDIF(PCRE_EBCDIC_NL25)\n\nIF(PCRE_NO_RECURSE)\n        SET(NO_RECURSE 1)\nENDIF(PCRE_NO_RECURSE)\n\n# Output files\nCONFIGURE_FILE(config-cmake.h.in\n               ${PROJECT_BINARY_DIR}/config.h\n               @ONLY)\n\n# Parse version numbers and date out of configure.ac\n\nfile(STRINGS ${PROJECT_SOURCE_DIR}/configure.ac\n  configure_lines\n  LIMIT_COUNT 50 # Read only the first 50 lines of the file\n)\n\nset(SEARCHED_VARIABLES \"pcre_major\" \"pcre_minor\" \"pcre_prerelease\" \"pcre_date\")\nforeach(configure_line ${configure_lines})\n    foreach(_substitution_variable ${SEARCHED_VARIABLES})\n        string(TOUPPER ${_substitution_variable} _substitution_variable_upper)\n        if (NOT ${_substitution_variable_upper})\n            string(REGEX MATCH \"m4_define\\\\(${_substitution_variable}, \\\\[(.*)\\\\]\" MACTHED_STRING ${configure_line})\n            if (CMAKE_MATCH_1)\n                set(${_substitution_variable_upper} ${CMAKE_MATCH_1})\n            endif()\n        endif()\n    endforeach()\nendforeach()\n\nCONFIGURE_FILE(pcre.h.in\n               ${PROJECT_BINARY_DIR}/pcre.h\n               @ONLY)\n\n# What about pcre-config and libpcre.pc?\n\nIF(PCRE_BUILD_PCRECPP)\n        CONFIGURE_FILE(pcre_stringpiece.h.in\n                       ${PROJECT_BINARY_DIR}/pcre_stringpiece.h\n                       @ONLY)\n\n        CONFIGURE_FILE(pcrecpparg.h.in\n                       ${PROJECT_BINARY_DIR}/pcrecpparg.h\n                       @ONLY)\nENDIF(PCRE_BUILD_PCRECPP)\n\n# Character table generation\n\nOPTION(PCRE_REBUILD_CHARTABLES \"Rebuild char tables\" OFF)\nIF(PCRE_REBUILD_CHARTABLES)\n  ADD_EXECUTABLE(dftables dftables.c)\n\n  GET_TARGET_PROPERTY(DFTABLES_EXE dftables LOCATION)\n\n  ADD_CUSTOM_COMMAND(\n    COMMENT \"Generating character tables (pcre_chartables.c) for current locale\"\n    DEPENDS dftables\n    COMMAND ${DFTABLES_EXE}\n    ARGS        ${PROJECT_BINARY_DIR}/pcre_chartables.c\n    OUTPUT      ${PROJECT_BINARY_DIR}/pcre_chartables.c\n  )\nELSE(PCRE_REBUILD_CHARTABLES)\n  CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/pcre_chartables.c.dist\n                    ${PROJECT_BINARY_DIR}/pcre_chartables.c\n                    COPYONLY)\nENDIF(PCRE_REBUILD_CHARTABLES)\n\n# Source code\n\nSET(PCRE_HEADERS ${PROJECT_BINARY_DIR}/pcre.h)\n\nIF(PCRE_BUILD_PCRE8)\nSET(PCRE_SOURCES\n  pcre_byte_order.c\n  pcre_chartables.c\n  pcre_compile.c\n  pcre_config.c\n  pcre_dfa_exec.c\n  pcre_exec.c\n  pcre_fullinfo.c\n  pcre_get.c\n  pcre_globals.c\n  pcre_jit_compile.c\n  pcre_maketables.c\n  pcre_newline.c\n  pcre_ord2utf8.c\n  pcre_refcount.c\n  pcre_string_utils.c\n  pcre_study.c\n  pcre_tables.c\n  pcre_ucd.c\n  pcre_valid_utf8.c\n  pcre_version.c\n  pcre_xclass.c\n)\n\nSET(PCREPOSIX_HEADERS pcreposix.h)\n\nSET(PCREPOSIX_SOURCES pcreposix.c)\n\nENDIF(PCRE_BUILD_PCRE8)\n\nIF(PCRE_BUILD_PCRE16)\nSET(PCRE16_SOURCES\n  pcre16_byte_order.c\n  pcre16_chartables.c\n  pcre16_compile.c\n  pcre16_config.c\n  pcre16_dfa_exec.c\n  pcre16_exec.c\n  pcre16_fullinfo.c\n  pcre16_get.c\n  pcre16_globals.c\n  pcre16_jit_compile.c\n  pcre16_maketables.c\n  pcre16_newline.c\n  pcre16_ord2utf16.c\n  pcre16_refcount.c\n  pcre16_string_utils.c\n  pcre16_study.c\n  pcre16_tables.c\n  pcre16_ucd.c\n  pcre16_utf16_utils.c\n  pcre16_valid_utf16.c\n  pcre16_version.c\n  pcre16_xclass.c\n)\nENDIF(PCRE_BUILD_PCRE16)\n\nIF(PCRE_BUILD_PCRE32)\nSET(PCRE32_SOURCES\n  pcre32_byte_order.c\n  pcre32_chartables.c\n  pcre32_compile.c\n  pcre32_config.c\n  pcre32_dfa_exec.c\n  pcre32_exec.c\n  pcre32_fullinfo.c\n  pcre32_get.c\n  pcre32_globals.c\n  pcre32_jit_compile.c\n  pcre32_maketables.c\n  pcre32_newline.c\n  pcre32_ord2utf32.c\n  pcre32_refcount.c\n  pcre32_string_utils.c\n  pcre32_study.c\n  pcre32_tables.c\n  pcre32_ucd.c\n  pcre32_utf32_utils.c\n  pcre32_valid_utf32.c\n  pcre32_version.c\n  pcre32_xclass.c\n)\nENDIF(PCRE_BUILD_PCRE32)\n\nIF(MINGW AND NOT PCRE_STATIC)\nIF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)\nADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre.o\nPRE-LINK\nCOMMAND windres ARGS pcre.rc pcre.o\nWORKING_DIRECTORY ${PROJECT_SOURCE_DIR}\nCOMMENT Using pcre coff info in mingw build)\nSET(PCRE_SOURCES\n  ${PCRE_SOURCES} ${PROJECT_SOURCE_DIR}/pcre.o\n)\nENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)\nIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)\nADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcreposix.o\nPRE-LINK\nCOMMAND windres ARGS pcreposix.rc pcreposix.o\nWORKING_DIRECTORY ${PROJECT_SOURCE_DIR}\nCOMMENT Using pcreposix coff info in mingw build)\nSET(PCREPOSIX_SOURCES\n  ${PCREPOSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcreposix.o\n)\nENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)\nENDIF(MINGW AND NOT PCRE_STATIC)\n\nIF(MSVC AND NOT PCRE_STATIC)\nIF (EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)\nSET(PCRE_SOURCES\n  ${PCRE_SOURCES} pcre.rc)\nENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre.rc)\nIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)\nSET(PCREPOSIX_SOURCES\n  ${PCREPOSIX_SOURCES} pcreposix.rc)\nENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)\nENDIF(MSVC AND NOT PCRE_STATIC)\n\n# Fix static compilation with MSVC: https://bugs.exim.org/show_bug.cgi?id=1681\n# This code was taken from the CMake wiki, not from WebM.\n\nIF(MSVC AND PCRE_STATIC_RUNTIME)\n  MESSAGE(STATUS \"** MSVC and PCRE_STATIC_RUNTIME: modifying compiler flags to use static runtime library\")\n  foreach(flag_var\n          CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE\n          CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO\n          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n          CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n    string(REGEX REPLACE \"/MD\" \"/MT\" ${flag_var} \"${${flag_var}}\")\n  endforeach()\nENDIF(MSVC AND PCRE_STATIC_RUNTIME)\n\nSET(PCRECPP_HEADERS\n  pcrecpp.h\n  pcre_scanner.h\n  ${PROJECT_BINARY_DIR}/pcrecpparg.h\n  ${PROJECT_BINARY_DIR}/pcre_stringpiece.h\n)\n\nSET(PCRECPP_SOURCES\n        pcrecpp.cc\n        pcre_scanner.cc\n        pcre_stringpiece.cc\n)\n\n# Build setup\n\nADD_DEFINITIONS(-DHAVE_CONFIG_H)\n\nIF(MSVC)\n        ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS)\nENDIF(MSVC)\n\nSET(CMAKE_INCLUDE_CURRENT_DIR 1)\n# needed to make sure to not link debug libs\n# against release libs and vice versa\nIF(WIN32)\n  SET(CMAKE_DEBUG_POSTFIX \"d\")\nENDIF(WIN32)\n\nSET(targets)\n\n# Libraries\n# pcre\nIF(PCRE_BUILD_PCRE8)\nADD_LIBRARY(pcre ${PCRE_HEADERS} ${PCRE_SOURCES} ${PROJECT_BINARY_DIR}/config.h)\nSET(targets ${targets} pcre)\nADD_LIBRARY(pcreposix ${PCREPOSIX_HEADERS} ${PCREPOSIX_SOURCES})\nSET(targets ${targets} pcreposix)\nTARGET_LINK_LIBRARIES(pcreposix pcre)\n\nIF(MINGW AND NOT PCRE_STATIC)\n  IF(NON_STANDARD_LIB_PREFIX)\n    SET_TARGET_PROPERTIES(pcre pcreposix\n                        PROPERTIES PREFIX \"\"\n    )\n  ENDIF(NON_STANDARD_LIB_PREFIX)\n\n  IF(NON_STANDARD_LIB_SUFFIX)\n    SET_TARGET_PROPERTIES(pcre pcreposix\n                        PROPERTIES SUFFIX \"-0.dll\"\n    )\n  ENDIF(NON_STANDARD_LIB_SUFFIX)\nENDIF(MINGW AND NOT PCRE_STATIC)\n\nENDIF(PCRE_BUILD_PCRE8)\n\nIF(PCRE_BUILD_PCRE16)\nADD_LIBRARY(pcre16 ${PCRE_HEADERS} ${PCRE16_SOURCES} ${PROJECT_BINARY_DIR}/config.h)\nSET(targets ${targets} pcre16)\n\nIF(MINGW AND NOT PCRE_STATIC)\n  IF(NON_STANDARD_LIB_PREFIX)\n    SET_TARGET_PROPERTIES(pcre16\n                        PROPERTIES PREFIX \"\"\n    )\n  ENDIF(NON_STANDARD_LIB_PREFIX)\n\n  IF(NON_STANDARD_LIB_SUFFIX)\n    SET_TARGET_PROPERTIES(pcre16\n                        PROPERTIES SUFFIX \"-0.dll\"\n    )\n  ENDIF(NON_STANDARD_LIB_SUFFIX)\nENDIF(MINGW AND NOT PCRE_STATIC)\n\nENDIF(PCRE_BUILD_PCRE16)\n\nIF(PCRE_BUILD_PCRE32)\nADD_LIBRARY(pcre32 ${PCRE_HEADERS} ${PCRE32_SOURCES} ${PROJECT_BINARY_DIR}/config.h)\nSET(targets ${targets} pcre32)\n\nIF(MINGW AND NOT PCRE_STATIC)\n  IF(NON_STANDARD_LIB_PREFIX)\n    SET_TARGET_PROPERTIES(pcre32\n                        PROPERTIES PREFIX \"\"\n    )\n  ENDIF(NON_STANDARD_LIB_PREFIX)\n\n  IF(NON_STANDARD_LIB_SUFFIX)\n    SET_TARGET_PROPERTIES(pcre32\n                        PROPERTIES SUFFIX \"-0.dll\"\n    )\n  ENDIF(NON_STANDARD_LIB_SUFFIX)\nENDIF(MINGW AND NOT PCRE_STATIC)\n\nENDIF(PCRE_BUILD_PCRE32)\n\n# pcrecpp\nIF(PCRE_BUILD_PCRECPP)\nADD_LIBRARY(pcrecpp ${PCRECPP_HEADERS} ${PCRECPP_SOURCES})\nSET(targets ${targets} pcrecpp)\nTARGET_LINK_LIBRARIES(pcrecpp pcre)\n\n  IF(MINGW AND NOT PCRE_STATIC)\n    IF(NON_STANDARD_LIB_PREFIX)\n      SET_TARGET_PROPERTIES(pcrecpp\n                            PROPERTIES PREFIX \"\"\n      )\n    ENDIF(NON_STANDARD_LIB_PREFIX)\n\n    IF(NON_STANDARD_LIB_SUFFIX)\n      SET_TARGET_PROPERTIES(pcrecpp\n                          PROPERTIES SUFFIX \"-0.dll\"\n      )\n    ENDIF(NON_STANDARD_LIB_SUFFIX)\n  ENDIF(MINGW AND NOT PCRE_STATIC)\nENDIF(PCRE_BUILD_PCRECPP)\n\n\n# Executables\n\n# Removed by PH (2008-01-23) because pcredemo shouldn't really be built\n# automatically, and it gave trouble in some environments anyway.\n# ADD_EXECUTABLE(pcredemo pcredemo.c)\n# TARGET_LINK_LIBRARIES(pcredemo pcreposix)\n# IF(NOT BUILD_SHARED_LIBS)\n#     # make sure to not use declspec(dllimport) in static mode on windows\n#         SET_TARGET_PROPERTIES(pcredemo PROPERTIES COMPILE_FLAGS \"-DPCRE_STATIC\")\n# ENDIF(NOT BUILD_SHARED_LIBS)\n\nIF(PCRE_BUILD_PCREGREP)\n  ADD_EXECUTABLE(pcregrep pcregrep.c)\n  SET(targets ${targets} pcregrep)\n  TARGET_LINK_LIBRARIES(pcregrep pcreposix ${PCREGREP_LIBS})\nENDIF(PCRE_BUILD_PCREGREP)\n\n# Testing\nIF(PCRE_BUILD_TESTS)\n  ENABLE_TESTING()\n\n  SET(PCRETEST_SOURCES pcretest.c)\n  IF(PCRE_BUILD_PCRE8)\n    LIST(APPEND PCRETEST_SOURCES pcre_printint.c)\n  ENDIF(PCRE_BUILD_PCRE8)\n  IF(PCRE_BUILD_PCRE16)\n    LIST(APPEND PCRETEST_SOURCES pcre16_printint.c)\n  ENDIF(PCRE_BUILD_PCRE16)\n  IF(PCRE_BUILD_PCRE32)\n    LIST(APPEND PCRETEST_SOURCES pcre32_printint.c)\n  ENDIF(PCRE_BUILD_PCRE32)\n\n  ADD_EXECUTABLE(pcretest ${PCRETEST_SOURCES})\n  SET(targets ${targets} pcretest)\n  IF(PCRE_BUILD_PCRE8)\n    LIST(APPEND PCRETEST_LIBS pcreposix pcre)\n  ENDIF(PCRE_BUILD_PCRE8)\n  IF(PCRE_BUILD_PCRE16)\n    LIST(APPEND PCRETEST_LIBS pcre16)\n  ENDIF(PCRE_BUILD_PCRE16)\n  IF(PCRE_BUILD_PCRE32)\n    LIST(APPEND PCRETEST_LIBS pcre32)\n  ENDIF(PCRE_BUILD_PCRE32)\n  TARGET_LINK_LIBRARIES(pcretest ${PCRETEST_LIBS})\n\n  IF(PCRE_SUPPORT_JIT)\n    ADD_EXECUTABLE(pcre_jit_test pcre_jit_test.c)\n    SET(targets ${targets} pcre_jit_test)\n    SET(PCRE_JIT_TEST_LIBS )\n    IF(PCRE_BUILD_PCRE8)\n      LIST(APPEND PCRE_JIT_TEST_LIBS pcre)\n    ENDIF(PCRE_BUILD_PCRE8)\n    IF(PCRE_BUILD_PCRE16)\n      LIST(APPEND PCRE_JIT_TEST_LIBS pcre16)\n    ENDIF(PCRE_BUILD_PCRE16)\n    IF(PCRE_BUILD_PCRE32)\n      LIST(APPEND PCRE_JIT_TEST_LIBS pcre32)\n    ENDIF(PCRE_BUILD_PCRE32)\n    TARGET_LINK_LIBRARIES(pcre_jit_test ${PCRE_JIT_TEST_LIBS})\n  ENDIF(PCRE_SUPPORT_JIT)\n\n  IF(PCRE_BUILD_PCRECPP)\n    ADD_EXECUTABLE(pcrecpp_unittest pcrecpp_unittest.cc)\n    SET(targets ${targets} pcrecpp_unittest)\n    TARGET_LINK_LIBRARIES(pcrecpp_unittest pcrecpp)\n    IF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC)\n      SET_TARGET_PROPERTIES(pcrecpp\n                        PROPERTIES PREFIX \"\"\n      )\n    ENDIF(MINGW AND NON_STANDARD_LIB_NAMES AND NOT PCRE_STATIC)\n\n    ADD_EXECUTABLE(pcre_scanner_unittest pcre_scanner_unittest.cc)\n    SET(targets ${targets} pcre_scanner_unittest)\n    TARGET_LINK_LIBRARIES(pcre_scanner_unittest pcrecpp)\n\n    ADD_EXECUTABLE(pcre_stringpiece_unittest pcre_stringpiece_unittest.cc)\n    SET(targets ${targets} pcre_stringpiece_unittest)\n    TARGET_LINK_LIBRARIES(pcre_stringpiece_unittest pcrecpp)\n  ENDIF(PCRE_BUILD_PCRECPP)\n\n  # exes in Debug location tested by the RunTest shell script\n  # via \"make test\"\n  IF(PCRE_BUILD_PCREGREP)\n    GET_TARGET_PROPERTY(PCREGREP_EXE pcregrep DEBUG_LOCATION)\n  ENDIF(PCRE_BUILD_PCREGREP)\n\n  GET_TARGET_PROPERTY(PCRETEST_EXE pcretest DEBUG_LOCATION)\n\n# =================================================\n  # Write out a CTest configuration file\n  #\n  FILE(WRITE ${PROJECT_BINARY_DIR}/CTestCustom.ctest\n  \"# This is a generated file.\nMESSAGE(\\\"When testing is complete, review test output in the\n\\\\\\\"${PROJECT_BINARY_DIR}/Testing/Temporary\\\\\\\" folder.\\\")\nMESSAGE(\\\" \\\")\n\")\n\n  FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.sh\n  \"#! /bin/sh\n# This is a generated file.\nsrcdir=${PROJECT_SOURCE_DIR}\npcretest=${PCRETEST_EXE}\n. ${PROJECT_SOURCE_DIR}/RunTest\nif test \\\"$?\\\" != \\\"0\\\"; then exit 1; fi\n# End\n\")\n\n  IF(UNIX)\n    ADD_TEST(pcre_test      sh ${PROJECT_BINARY_DIR}/pcre_test.sh)\n  ENDIF(UNIX)\n\n  IF(PCRE_BUILD_PCREGREP)\n    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_grep_test.sh\n    \"#! /bin/sh\n# This is a generated file.\nsrcdir=${PROJECT_SOURCE_DIR}\npcregrep=${PCREGREP_EXE}\npcretest=${PCRETEST_EXE}\n. ${PROJECT_SOURCE_DIR}/RunGrepTest\nif test \\\"$?\\\" != \\\"0\\\"; then exit 1; fi\n# End\n\")\n\n    IF(UNIX)\n      ADD_TEST(pcre_grep_test sh ${PROJECT_BINARY_DIR}/pcre_grep_test.sh)\n    ENDIF(UNIX)\n  ENDIF(PCRE_BUILD_PCREGREP)\n\n  IF(WIN32)\n    # Provide environment for executing the bat file version of RunTest\n    FILE(TO_NATIVE_PATH ${PROJECT_SOURCE_DIR} winsrc)\n    FILE(TO_NATIVE_PATH ${PROJECT_BINARY_DIR} winbin)\n    FILE(TO_NATIVE_PATH ${PCRETEST_EXE} winexe)\n\n    FILE(WRITE ${PROJECT_BINARY_DIR}/pcre_test.bat\n    \"\\@REM This is a generated file.\n\\@echo off\nsetlocal\nSET srcdir=\\\"${winsrc}\\\"\nSET pcretest=\\\"${winexe}\\\"\nif not [%CMAKE_CONFIG_TYPE%]==[] SET pcretest=\\\"${winbin}\\\\%CMAKE_CONFIG_TYPE%\\\\pcretest.exe\\\"\ncall %srcdir%\\\\RunTest.Bat\nif errorlevel 1 exit /b 1\necho RunTest.bat tests successfully completed\n\")\n\n  ADD_TEST(NAME pcre_test_bat\n  COMMAND pcre_test.bat)\n  SET_TESTS_PROPERTIES(pcre_test_bat PROPERTIES\n  PASS_REGULAR_EXPRESSION \"RunTest\\\\.bat tests successfully completed\")\n\n    IF(\"$ENV{OSTYPE}\" STREQUAL \"msys\")\n      # Both the sh and bat file versions of RunTest are run if make test is used\n      # in msys\n      ADD_TEST(pcre_test_sh    sh.exe ${PROJECT_BINARY_DIR}/pcre_test.sh)\n      IF(PCRE_BUILD_PCREGREP)\n        ADD_TEST(pcre_grep_test  sh.exe ${PROJECT_BINARY_DIR}/pcre_grep_test.sh)\n      ENDIF(PCRE_BUILD_PCREGREP)\n    ENDIF(\"$ENV{OSTYPE}\" STREQUAL \"msys\")\n\n  ENDIF(WIN32)\n\n  # Changed to accommodate testing whichever location was just built\n\n  IF(PCRE_SUPPORT_JIT)\n    ADD_TEST(pcre_jit_test         pcre_jit_test)\n  ENDIF(PCRE_SUPPORT_JIT)\n\n  IF(PCRE_BUILD_PCRECPP)\n    ADD_TEST(pcrecpp_test          pcrecpp_unittest)\n    ADD_TEST(pcre_scanner_test     pcre_scanner_unittest)\n    ADD_TEST(pcre_stringpiece_test pcre_stringpiece_unittest)\n  ENDIF(PCRE_BUILD_PCRECPP)\n\nENDIF(PCRE_BUILD_TESTS)\n\n# Installation\nSET(CMAKE_INSTALL_ALWAYS 1)\n\nINSTALL(TARGETS ${targets}\n        RUNTIME DESTINATION bin\n        LIBRARY DESTINATION lib\n        ARCHIVE DESTINATION lib)\n\nINSTALL(FILES ${PCRE_HEADERS} ${PCREPOSIX_HEADERS} DESTINATION include)\n\nFILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html)\nFILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1)\nFILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3)\n\nIF(PCRE_BUILD_PCRECPP)\n        INSTALL(FILES ${PCRECPP_HEADERS} DESTINATION include)\nELSE(PCRE_BUILD_PCRECPP)\n        # Remove pcrecpp.3\n        FOREACH(man ${man3})\n                GET_FILENAME_COMPONENT(man_tmp ${man} NAME)\n                IF(NOT man_tmp STREQUAL \"pcrecpp.3\")\n                        SET(man3_new ${man3} ${man})\n                ENDIF(NOT man_tmp STREQUAL \"pcrecpp.3\")\n        ENDFOREACH(man ${man3})\n        SET(man3 ${man3_new})\nENDIF(PCRE_BUILD_PCRECPP)\n\nINSTALL(FILES ${man1} DESTINATION man/man1)\nINSTALL(FILES ${man3} DESTINATION man/man3)\nINSTALL(FILES ${html} DESTINATION share/doc/pcre/html)\n\nIF(MSVC AND INSTALL_MSVC_PDB)\n    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcre.pdb\n                  ${PROJECT_BINARY_DIR}/pcreposix.pdb\n            DESTINATION bin\n            CONFIGURATIONS RelWithDebInfo)\n    INSTALL(FILES ${PROJECT_BINARY_DIR}/pcred.pdb\n                  ${PROJECT_BINARY_DIR}/pcreposixd.pdb\n            DESTINATION bin\n            CONFIGURATIONS Debug)\nENDIF(MSVC AND INSTALL_MSVC_PDB)\n\n# help, only for nice output\nIF(BUILD_SHARED_LIBS)\n  SET(BUILD_STATIC_LIBS OFF)\nELSE(BUILD_SHARED_LIBS)\n  SET(BUILD_STATIC_LIBS ON)\nENDIF(BUILD_SHARED_LIBS)\n\nIF(PCRE_SHOW_REPORT)\n  STRING(TOUPPER \"${CMAKE_BUILD_TYPE}\" buildtype)\n  IF (CMAKE_C_FLAGS)\n    SET(cfsp \" \")\n  ENDIF(CMAKE_C_FLAGS)\n  IF (CMAKE_CXX_FLAGS)\n    SET(cxxfsp \" \")\n  ENDIF(CMAKE_CXX_FLAGS)\n  MESSAGE(STATUS \"\")\n  MESSAGE(STATUS \"\")\n  MESSAGE(STATUS \"PCRE configuration summary:\")\n  MESSAGE(STATUS \"\")\n  MESSAGE(STATUS \"  Install prefix .................. : ${CMAKE_INSTALL_PREFIX}\")\n  MESSAGE(STATUS \"  C compiler ...................... : ${CMAKE_C_COMPILER}\")\n  MESSAGE(STATUS \"  C++ compiler .................... : ${CMAKE_CXX_COMPILER}\")\n  MESSAGE(STATUS \"  C compiler flags ................ : ${CMAKE_C_FLAGS}${cfsp}${CMAKE_C_FLAGS_${buildtype}}\")\n  MESSAGE(STATUS \"  C++ compiler flags .............. : ${CMAKE_CXX_FLAGS}${cxxfsp}${CMAKE_CXX_FLAGS_${buildtype}}\")\n  MESSAGE(STATUS \"\")\n  MESSAGE(STATUS \"  Build 8 bit PCRE library ........ : ${PCRE_BUILD_PCRE8}\")\n  MESSAGE(STATUS \"  Build 16 bit PCRE library ....... : ${PCRE_BUILD_PCRE16}\")\n  MESSAGE(STATUS \"  Build 32 bit PCRE library ....... : ${PCRE_BUILD_PCRE32}\")\n  MESSAGE(STATUS \"  Build C++ library ............... : ${PCRE_BUILD_PCRECPP}\")\n  MESSAGE(STATUS \"  Enable JIT compiling support .... : ${PCRE_SUPPORT_JIT}\")\n  MESSAGE(STATUS \"  Enable UTF support .............. : ${PCRE_SUPPORT_UTF}\")\n  MESSAGE(STATUS \"  Unicode properties .............. : ${PCRE_SUPPORT_UNICODE_PROPERTIES}\")\n  MESSAGE(STATUS \"  Newline char/sequence ........... : ${PCRE_NEWLINE}\")\n  MESSAGE(STATUS \"  \\\\R matches only ANYCRLF ......... : ${PCRE_SUPPORT_BSR_ANYCRLF}\")\n  MESSAGE(STATUS \"  EBCDIC coding ................... : ${PCRE_EBCDIC}\")\n  MESSAGE(STATUS \"  EBCDIC coding with NL=0x25 ...... : ${PCRE_EBCDIC_NL25}\")\n  MESSAGE(STATUS \"  Rebuild char tables ............. : ${PCRE_REBUILD_CHARTABLES}\")\n  MESSAGE(STATUS \"  No stack recursion .............. : ${PCRE_NO_RECURSE}\")\n  MESSAGE(STATUS \"  POSIX mem threshold ............. : ${PCRE_POSIX_MALLOC_THRESHOLD}\")\n  MESSAGE(STATUS \"  Internal link size .............. : ${PCRE_LINK_SIZE}\")\n  MESSAGE(STATUS \"  Parentheses nest limit .......... : ${PCRE_PARENS_NEST_LIMIT}\")\n  MESSAGE(STATUS \"  Match limit ..................... : ${PCRE_MATCH_LIMIT}\")\n  MESSAGE(STATUS \"  Match limit recursion ........... : ${PCRE_MATCH_LIMIT_RECURSION}\")\n  MESSAGE(STATUS \"  Build shared libs ............... : ${BUILD_SHARED_LIBS}\")\n  MESSAGE(STATUS \"  Build static libs ............... : ${BUILD_STATIC_LIBS}\")\n  MESSAGE(STATUS \"  Build pcregrep .................. : ${PCRE_BUILD_PCREGREP}\")\n  MESSAGE(STATUS \"  Enable JIT in pcregrep .......... : ${PCRE_SUPPORT_PCREGREP_JIT}\")\n  MESSAGE(STATUS \"  Buffer size for pcregrep ........ : ${PCREGREP_BUFSIZE}\")\n  MESSAGE(STATUS \"  Build tests (implies pcretest  .. : ${PCRE_BUILD_TESTS}\")\n  MESSAGE(STATUS \"               and pcregrep)\")\n  IF(ZLIB_FOUND)\n    MESSAGE(STATUS \"  Link pcregrep with libz ......... : ${PCRE_SUPPORT_LIBZ}\")\n  ELSE(ZLIB_FOUND)\n    MESSAGE(STATUS \"  Link pcregrep with libz ......... : Library not found\" )\n  ENDIF(ZLIB_FOUND)\n  IF(BZIP2_FOUND)\n    MESSAGE(STATUS \"  Link pcregrep with libbz2 ....... : ${PCRE_SUPPORT_LIBBZ2}\")\n  ELSE(BZIP2_FOUND)\n    MESSAGE(STATUS \"  Link pcregrep with libbz2 ....... : Library not found\" )\n  ENDIF(BZIP2_FOUND)\n  IF(EDITLINE_FOUND)\n    MESSAGE(STATUS \"  Link pcretest with libeditline .. : ${PCRE_SUPPORT_LIBEDIT}\")\n  ELSE(EDITLINE_FOUND)\n    MESSAGE(STATUS \"  Link pcretest with libeditline .. : Library not found\" )\n  ENDIF(EDITLINE_FOUND)\n  IF(READLINE_FOUND)\n    MESSAGE(STATUS \"  Link pcretest with libreadline .. : ${PCRE_SUPPORT_LIBREADLINE}\")\n  ELSE(READLINE_FOUND)\n    MESSAGE(STATUS \"  Link pcretest with libreadline .. : Library not found\" )\n  ENDIF(READLINE_FOUND)\n  MESSAGE(STATUS \"  Support Valgrind .................: ${PCRE_SUPPORT_VALGRIND}\")\n  MESSAGE(STATUS \"  Support coverage .................: ${PCRE_SUPPORT_COVERAGE}\")\n\n  IF(MINGW AND NOT PCRE_STATIC)\n    MESSAGE(STATUS \"  Non-standard dll names (prefix) . : ${NON_STANDARD_LIB_PREFIX}\")\n    MESSAGE(STATUS \"  Non-standard dll names (suffix) . : ${NON_STANDARD_LIB_SUFFIX}\")\n  ENDIF(MINGW AND NOT PCRE_STATIC)\n\n  IF(MSVC)\n    MESSAGE(STATUS \"  Install MSVC .pdb files ..........: ${INSTALL_MSVC_PDB}\")\n  ENDIF(MSVC)\n\n  MESSAGE(STATUS \"\")\nENDIF(PCRE_SHOW_REPORT)\n\n# end CMakeLists.txt\n"
  },
  {
    "path": "src/pcre/COPYING",
    "content": "PCRE LICENCE\n\nPlease see the file LICENCE in the PCRE distribution for licensing details.\n\nEnd\n"
  },
  {
    "path": "src/pcre/ChangeLog",
    "content": "ChangeLog for PCRE\n------------------\n\nNote that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All\ndevelopment is happening in the PCRE2 10.xx series.\n\n\nVersion 8.43 23-February-2019\n-----------------------------\n\n1. Some time ago the config macro SUPPORT_UTF8 was changed to SUPPORT_UTF\nbecause it also applies to UTF-16 and UTF-32. However, this change was not made\nin the pcre2cpp files; consequently the C++ wrapper has from then been compiled\nwith a bug in it, which would have been picked up by the unit test except that\nit also had its UTF8 code cut out. The bug was in a global replace when moving\nforward after matching an empty string.\n\n2. The C++ wrapper got broken a long time ago (version 7.3, August 2007) when\n(*CR) was invented (assuming it was the first such start-of-pattern option).\nThe wrapper could never handle such patterns because it wraps patterns in\n(?:...)\\z in order to support end anchoring. I have hacked in some code to fix\nthis, that is, move the wrapping till after any existing start-of-pattern\nspecial settings.\n\n3. \"pcre2grep\" (sic) was accidentally mentioned in an error message (fix was\nported from PCRE2).\n\n4. Typo LCC_ALL for LC_ALL fixed in pcregrep.\n\n5. In a pattern such as /[^\\x{100}-\\x{ffff}]*[\\x80-\\xff]/ which has a repeated\nnegative class with no characters less than 0x100 followed by a positive class\nwith only characters less than 0x100, the first class was incorrectly being\nauto-possessified, causing incorrect match failures.\n\n6. If the only branch in a conditional subpattern was anchored, the whole\nsubpattern was treated as anchored, when it should not have been, since the\nassumed empty second branch cannot be anchored. Demonstrated by test patterns\nsuch as /(?(1)^())b/ or /(?(?=^))b/.\n\n7. Fix subject buffer overread in JIT when UTF is disabled and \\X or \\R has\na greater than 1 fixed quantifier. This issue was found by Yunho Kim.\n\n8. If a pattern started with a subroutine call that had a quantifier with a\nminimum of zero, an incorrect \"match must start with this character\" could be\nrecorded. Example: /(?&xxx)*ABC(?<xxx>XYZ)/ would (incorrectly) expect 'A' to\nbe the first character of a match.\n\n9. Improve MAP_JIT flag usage on MacOS. Patch by Rich Siegel.\n\n\nVersion 8.42 20-March-2018\n--------------------------\n\n1.  Fixed a MIPS issue in the JIT compiler reported by Joshua Kinard.\n\n2.  Fixed outdated real_pcre definitions in pcre.h.in (patch by Evgeny Kotkov).\n\n3.  pcregrep was truncating components of file names to 128 characters when\nprocessing files with the -r option, and also (some very odd code) truncating\npath names to 512 characters. There is now a check on the absolute length of\nfull path file names, which may be up to 2047 characters long.\n\n4.  Using pcre_dfa_exec(), in UTF mode when UCP support was not defined, there\nwas the possibility of a false positive match when caselessly matching a \"not\nthis character\" item such as [^\\x{1234}] (with a code point greater than 127)\nbecause the \"other case\" variable was not being initialized.\n\n5. Although pcre_jit_exec checks whether the pattern is compiled\nin a given mode, it was also expected that at least one mode is available.\nThis is fixed and pcre_jit_exec returns with PCRE_ERROR_JIT_BADOPTION\nwhen the pattern is not optimized by JIT at all.\n\n6. The line number and related variables such as match counts in pcregrep\nwere all int variables, causing overflow when files with more than 2147483647\nlines were processed (assuming 32-bit ints). They have all been changed to\nunsigned long ints.\n\n7. If a backreference with a minimum repeat count of zero was first in a\npattern, apart from assertions, an incorrect first matching character could be\nrecorded. For example, for the pattern /(?=(a))\\1?b/, \"b\" was incorrectly set\nas the first character of a match.\n\n8. Fix out-of-bounds read for partial matching of /./ against an empty string\nwhen the newline type is CRLF.\n\n9. When matching using the the REG_STARTEND feature of the POSIX API with a\nnon-zero starting offset, unset capturing groups with lower numbers than a\ngroup that did capture something were not being correctly returned as \"unset\"\n(that is, with offset values of -1).\n\n10. Matching the pattern /(*UTF)\\C[^\\v]+\\x80/ against an 8-bit string\ncontaining multi-code-unit characters caused bad behaviour and possibly a\ncrash. This issue was fixed for other kinds of repeat in release 8.37 by change\n38, but repeating character classes were overlooked.\n\n11. A small fix to pcregrep to avoid compiler warnings for -Wformat-overflow=2.\n\n12. Added --enable-jit=auto support to configure.ac.\n\n13. Fix misleading error message in configure.ac.\n\n\nVersion 8.41 05-July-2017\n-------------------------\n\n1.  Fixed typo in CMakeLists.txt (wrong number of arguments for\nPCRE_STATIC_RUNTIME (affects MSVC only).\n\n2.  Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline\nmode with --only-matching matched several lines, it restarted scanning at the\nnext line instead of moving on to the end of the matched string, which can be\nseveral lines after the start.\n\n3.  Fix a missing else in the JIT compiler reported by 'idaifish'.\n\n4.  A (?# style comment is now ignored between a basic quantifier and a\nfollowing '+' or '?' (example: /X+(?#comment)?Y/.\n\n5.  Avoid use of a potentially overflowing buffer in pcregrep (patch by Petr\nPisar).\n\n6.  Fuzzers have reported issues in pcretest. These are NOT serious (it is,\nafter all, just a test program). However, to stop the reports, some easy ones\nare fixed:\n\n    (a) Check for values < 256 when calling isprint() in pcretest.\n    (b) Give an error for too big a number after \\O.\n\n7.  In the 32-bit library in non-UTF mode, an attempt to find a Unicode\nproperty for a character with a code point greater than 0x10ffff (the Unicode\nmaximum) caused a crash.\n\n8. The alternative matching function, pcre_dfa_exec() misbehaved if it\nencountered a character class with a possessive repeat, for example [a-f]{3}+.\n\n9. When pcretest called pcre_copy_substring() in 32-bit mode, it set the buffer\nlength incorrectly, which could result in buffer overflow.\n\n10. Remove redundant line of code (accidentally left in ages ago).\n\n11. Applied C++ patch from Irfan Adilovic to guard 'using std::' directives\nwith namespace pcrecpp (Bugzilla #2084).\n\n12. Remove a duplication typo in pcre_tables.c.\n\n13. Fix returned offsets from regexec() when REG_STARTEND is used with a\nstarting offset greater than zero.\n\n\nVersion 8.40 11-January-2017\n----------------------------\n\n1.  Using -o with -M in pcregrep could cause unnecessary repeated output when\n    the match extended over a line boundary.\n\n2.  Applied Chris Wilson's second patch (Bugzilla #1681) to CMakeLists.txt for\n    MSVC static compilation, putting the first patch under a new option.\n\n3.  Fix register overwite in JIT when SSE2 acceleration is enabled.\n\n4.  Ignore \"show all captures\" (/=) for DFA matching.\n\n5.  Fix JIT unaligned accesses on x86. Patch by Marc Mutz.\n\n6.  In any wide-character mode (8-bit UTF or any 16-bit or 32-bit mode),\n    without PCRE_UCP set, a negative character type such as \\D in a positive\n    class should cause all characters greater than 255 to match, whatever else\n    is in the class. There was a bug that caused this not to happen if a\n    Unicode property item was added to such a class, for example [\\D\\P{Nd}] or\n    [\\W\\pL].\n\n7.  When pcretest was outputing information from a callout, the caret indicator\n    for the current position in the subject line was incorrect if it was after\n    an escape sequence for a character whose code point was greater than\n    \\x{ff}.\n\n8.  A pattern such as (?<RA>abc)(?(R)xyz) was incorrectly compiled such that\n    the conditional was interpreted as a reference to capturing group 1 instead\n    of a test for recursion. Any group whose name began with R was\n    misinterpreted in this way. (The reference interpretation should only\n    happen if the group's name is precisely \"R\".)\n\n9.  A number of bugs have been mended relating to match start-up optimizations\n    when the first thing in a pattern is a positive lookahead. These all\n    applied only when PCRE_NO_START_OPTIMIZE was *not* set:\n\n    (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed\n        both an initial 'X' and a following 'X'.\n    (b) Some patterns starting with an assertion that started with .* were\n        incorrectly optimized as having to match at the start of the subject or\n        after a newline. There are cases where this is not true, for example,\n        (?=.*[A-Z])(?=.{8,16})(?!.*[\\s]) matches after the start in lines that\n        start with spaces. Starting .* in an assertion is no longer taken as an\n        indication of matching at the start (or after a newline).\n\n\nVersion 8.39 14-June-2016\n-------------------------\n\n1.  If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between\n    an item and its qualifier (for example, A(?#comment)?B) pcre_compile()\n    misbehaved. This bug was found by the LLVM fuzzer.\n\n2.  Similar to the above, if an isolated \\E was present between an item and its\n    qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This\n    bug was found by the LLVM fuzzer.\n\n3.  Further to 8.38/46, negated classes such as [^[:^ascii:]\\d] were also not\n    working correctly in UCP mode.\n\n4.  The POSIX wrapper function regexec() crashed if the option REG_STARTEND\n    was set when the pmatch argument was NULL. It now returns REG_INVARG.\n\n5.  Allow for up to 32-bit numbers in the ordin() function in pcregrep.\n\n6.  An empty \\Q\\E sequence between an item and its qualifier caused\n    pcre_compile() to misbehave when auto callouts were enabled. This bug was\n    found by the LLVM fuzzer.\n\n7.  If a pattern that was compiled with PCRE_EXTENDED started with white\n    space or a #-type comment that was followed by (?-x), which turns off\n    PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again,\n    pcre_compile() assumed that (?-x) applied to the whole pattern and\n    consequently mis-compiled it. This bug was found by the LLVM fuzzer.\n\n8.  A call of pcre_copy_named_substring() for a named substring whose number\n    was greater than the space in the ovector could cause a crash.\n\n9.  Yet another buffer overflow bug involved duplicate named groups with a\n    group that reset capture numbers (compare 8.38/7 below). Once again, I have\n    just allowed for more memory, even if not needed. (A proper fix is\n    implemented in PCRE2, but it involves a lot of refactoring.)\n\n10. pcre_get_substring_list() crashed if the use of \\K in a match caused the\n    start of the match to be earlier than the end.\n\n11. Migrating appropriate PCRE2 JIT improvements to PCRE.\n\n12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind\n    assertion, caused pcretest to generate incorrect output, and also to read\n    uninitialized memory (detected by ASAN or valgrind).\n\n13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply\n    nested set of parentheses of sufficient size caused an overflow of the\n    compiling workspace (which was diagnosed, but of course is not desirable).\n\n14. And yet another buffer overflow bug involving duplicate named groups, this\n    time nested, with a nested back reference. Yet again, I have just allowed\n    for more memory, because anything more needs all the refactoring that has\n    been done for PCRE2. An example pattern that provoked this bug is:\n    /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\\k'R'))))))))/ and the bug was\n    registered as CVE-2016-1283.\n\n15. pcretest went into a loop if global matching was requested with an ovector\n    size less than 2. It now gives an error message. This bug was found by\n    afl-fuzz.\n\n16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error\n    (\"assertion expected\") when (?(?C) was not followed by an opening\n    parenthesis.\n\n17. Fixed typo (\"&&\" for \"&\") in pcre_study(). Fortunately, this could not\n    actually affect anything, by sheer luck.\n\n18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC\n    static compilation.\n\n19. Modified the RunTest script to incorporate a valgrind suppressions file so\n    that certain errors, provoked by the SSE2 instruction set when JIT is used,\n    are ignored.\n\n20. A racing condition is fixed in JIT reported by Mozilla.\n\n21. Minor code refactor to avoid \"array subscript is below array bounds\"\n    compiler warning.\n\n22. Minor code refactor to avoid \"left shift of negative number\" warning.\n\n23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without\n    UCP support.\n\n24. Refactor to avoid compiler warnings in pcrecpp.cc.\n\n25. Refactor to fix a typo in pcre_jit_test.c\n\n26. Patch to support compiling pcrecpp.cc with Intel compiler.\n\n\nVersion 8.38 23-November-2015\n-----------------------------\n\n1.  If a group that contained a recursive back reference also contained a\n    forward reference subroutine call followed by a non-forward-reference\n    subroutine call, for example /.((?2)(?R)\\1)()/, pcre_compile() failed to\n    compile correct code, leading to undefined behaviour or an internally\n    detected error. This bug was discovered by the LLVM fuzzer.\n\n2.  Quantification of certain items (e.g. atomic back references) could cause\n    incorrect code to be compiled when recursive forward references were\n    involved. For example, in this pattern: /(?1)()((((((\\1++))\\x85)+)|))/.\n    This bug was discovered by the LLVM fuzzer.\n\n3.  A repeated conditional group whose condition was a reference by name caused\n    a buffer overflow if there was more than one group with the given name.\n    This bug was discovered by the LLVM fuzzer.\n\n4.  A recursive back reference by name within a group that had the same name as\n    another group caused a buffer overflow. For example:\n    /(?J)(?'d'(?'d'\\g{d}))/. This bug was discovered by the LLVM fuzzer.\n\n5.  A forward reference by name to a group whose number is the same as the\n    current group, for example in this pattern: /(?|(\\k'Pm')|(?'Pm'))/, caused\n    a buffer overflow at compile time. This bug was discovered by the LLVM\n    fuzzer.\n\n6.  A lookbehind assertion within a set of mutually recursive subpatterns could\n    provoke a buffer overflow. This bug was discovered by the LLVM fuzzer.\n\n7.  Another buffer overflow bug involved duplicate named groups with a\n    reference between their definition, with a group that reset capture\n    numbers, for example: /(?J:(?|(?'R')(\\k'R')|((?'R'))))/. This has been\n    fixed by always allowing for more memory, even if not needed. (A proper fix\n    is implemented in PCRE2, but it involves more refactoring.)\n\n8.  There was no check for integer overflow in subroutine calls such as (?123).\n\n9.  The table entry for \\l in EBCDIC environments was incorrect, leading to its\n    being treated as a literal 'l' instead of causing an error.\n\n10. There was a buffer overflow if pcre_exec() was called with an ovector of\n    size 1. This bug was found by american fuzzy lop.\n\n11. If a non-capturing group containing a conditional group that could match\n    an empty string was repeated, it was not identified as matching an empty\n    string itself. For example: /^(?:(?(1)x|)+)+$()/.\n\n12. In an EBCDIC environment, pcretest was mishandling the escape sequences\n    \\a and \\e in test subject lines.\n\n13. In an EBCDIC environment, \\a in a pattern was converted to the ASCII\n    instead of the EBCDIC value.\n\n14. The handling of \\c in an EBCDIC environment has been revised so that it is\n    now compatible with the specification in Perl's perlebcdic page.\n\n15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in\n    ASCII/Unicode. This has now been added to the list of characters that are\n    recognized as white space in EBCDIC.\n\n16. When PCRE was compiled without UCP support, the use of \\p and \\P gave an\n    error (correctly) when used outside a class, but did not give an error\n    within a class.\n\n17. \\h within a class was incorrectly compiled in EBCDIC environments.\n\n18. A pattern with an unmatched closing parenthesis that contained a backward\n    assertion which itself contained a forward reference caused buffer\n    overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/.\n\n19. JIT should return with error when the compiled pattern requires more stack\n    space than the maximum.\n\n20. A possessively repeated conditional group that could match an empty string,\n    for example, /(?(R))*+/, was incorrectly compiled.\n\n21. Fix infinite recursion in the JIT compiler when certain patterns such as\n    /(?:|a|){100}x/ are analysed.\n\n22. Some patterns with character classes involving [: and \\\\ were incorrectly\n    compiled and could cause reading from uninitialized memory or an incorrect\n    error diagnosis.\n\n23. Pathological patterns containing many nested occurrences of [: caused\n    pcre_compile() to run for a very long time.\n\n24. A conditional group with only one branch has an implicit empty alternative\n    branch and must therefore be treated as potentially matching an empty\n    string.\n\n25. If (?R was followed by - or + incorrect behaviour happened instead of a\n    diagnostic.\n\n26. Arrange to give up on finding the minimum matching length for overly\n    complex patterns.\n\n27. Similar to (4) above: in a pattern with duplicated named groups and an\n    occurrence of (?| it is possible for an apparently non-recursive back\n    reference to become recursive if a later named group with the relevant\n    number is encountered. This could lead to a buffer overflow. Wen Guanxing\n    from Venustech ADLAB discovered this bug.\n\n28. If pcregrep was given the -q option with -c or -l, or when handling a\n    binary file, it incorrectly wrote output to stdout.\n\n29. The JIT compiler did not restore the control verb head in case of *THEN\n    control verbs. This issue was found by Karl Skomski with a custom LLVM\n    fuzzer.\n\n30. Error messages for syntax errors following \\g and \\k were giving inaccurate\n    offsets in the pattern.\n\n31. Added a check for integer overflow in conditions (?(<digits>) and\n    (?(R<digits>). This omission was discovered by Karl Skomski with the LLVM\n    fuzzer.\n\n32. Handling recursive references such as (?2) when the reference is to a group\n    later in the pattern uses code that is very hacked about and error-prone.\n    It has been re-written for PCRE2. Here in PCRE1, a check has been added to\n    give an internal error if it is obvious that compiling has gone wrong.\n\n33. The JIT compiler should not check repeats after a {0,1} repeat byte code.\n    This issue was found by Karl Skomski with a custom LLVM fuzzer.\n\n34. The JIT compiler should restore the control chain for empty possessive\n    repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer.\n\n35. Match limit check added to JIT recursion. This issue was found by Karl\n    Skomski with a custom LLVM fuzzer.\n\n36. Yet another case similar to 27 above has been circumvented by an\n    unconditional allocation of extra memory. This issue is fixed \"properly\" in\n    PCRE2 by refactoring the way references are handled. Wen Guanxing\n    from Venustech ADLAB discovered this bug.\n\n37. Fix two assertion fails in JIT. These issues were found by Karl Skomski\n    with a custom LLVM fuzzer.\n\n38. Fixed a corner case of range optimization in JIT.\n\n39. An incorrect error \"overran compiling workspace\" was given if there were\n    exactly enough group forward references such that the last one extended\n    into the workspace safety margin. The next one would have expanded the\n    workspace. The test for overflow was not including the safety margin.\n\n40. A match limit issue is fixed in JIT which was found by Karl Skomski\n    with a custom LLVM fuzzer.\n\n41. Remove the use of /dev/null in testdata/testinput2, because it doesn't\n    work under Windows. (Why has it taken so long for anyone to notice?)\n\n42. In a character class such as [\\W\\p{Any}] where both a negative-type escape\n    (\"not a word character\") and a property escape were present, the property\n    escape was being ignored.\n\n43. Fix crash caused by very long (*MARK) or (*THEN) names.\n\n44. A sequence such as [[:punct:]b] that is, a POSIX character class followed\n    by a single ASCII character in a class item, was incorrectly compiled in\n    UCP mode. The POSIX class got lost, but only if the single character\n    followed it.\n\n45. [:punct:] in UCP mode was matching some characters in the range 128-255\n    that should not have been matched.\n\n46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated\n    class, all characters with code points greater than 255 are in the class.\n    When a Unicode property was also in the class (if PCRE_UCP is set, escapes\n    such as \\w are turned into Unicode properties), wide characters were not\n    correctly handled, and could fail to match.\n\n\nVersion 8.37 28-April-2015\n--------------------------\n\n1.  When an (*ACCEPT) is triggered inside capturing parentheses, it arranges\n    for those parentheses to be closed with whatever has been captured so far.\n    However, it was failing to mark any other groups between the hightest\n    capture so far and the currrent group as \"unset\". Thus, the ovector for\n    those groups contained whatever was previously there. An example is the\n    pattern /(x)|((*ACCEPT))/ when matched against \"abcd\".\n\n2.  If an assertion condition was quantified with a minimum of zero (an odd\n    thing to do, but it happened), SIGSEGV or other misbehaviour could occur.\n\n3.  If a pattern in pcretest input had the P (POSIX) modifier followed by an\n    unrecognized modifier, a crash could occur.\n\n4.  An attempt to do global matching in pcretest with a zero-length ovector\n    caused a crash.\n\n5.  Fixed a memory leak during matching that could occur for a subpattern\n    subroutine call (recursive or otherwise) if the number of captured groups\n    that had to be saved was greater than ten.\n\n6.  Catch a bad opcode during auto-possessification after compiling a bad UTF\n    string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad\n    UTF with NO_UTF_CHECK is documented as having an undefined outcome.\n\n7.  A UTF pattern containing a \"not\" match of a non-ASCII character and a\n    subroutine reference could loop at compile time. Example: /[^\\xff]((?1))/.\n\n8. When a pattern is compiled, it remembers the highest back reference so that\n   when matching, if the ovector is too small, extra memory can be obtained to\n   use instead. A conditional subpattern whose condition is a check on a\n   capture having happened, such as, for example in the pattern\n   /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not\n   setting the highest backreference number. This mattered only if pcre_exec()\n   was called with an ovector that was too small to hold the capture, and there\n   was no other kind of back reference (a situation which is probably quite\n   rare). The effect of the bug was that the condition was always treated as\n   FALSE when the capture could not be consulted, leading to a incorrect\n   behaviour by pcre_exec(). This bug has been fixed.\n\n9. A reference to a duplicated named group (either a back reference or a test\n   for being set in a conditional) that occurred in a part of the pattern where\n   PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern\n   to be incorrectly calculated, leading to overwriting.\n\n10. A mutually recursive set of back references such as (\\2)(\\1) caused a\n    segfault at study time (while trying to find the minimum matching length).\n    The infinite loop is now broken (with the minimum length unset, that is,\n    zero).\n\n11. If an assertion that was used as a condition was quantified with a minimum\n    of zero, matching went wrong. In particular, if the whole group had\n    unlimited repetition and could match an empty string, a segfault was\n    likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows\n    assertions to be quantified, but not if they are being used as conditions,\n    so the above pattern is faulted by Perl. PCRE has now been changed so that\n    it also rejects such patterns.\n\n12. A possessive capturing group such as (a)*+ with a minimum repeat of zero\n    failed to allow the zero-repeat case if pcre2_exec() was called with an\n    ovector too small to capture the group.\n\n13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by\n    Red Hat Product Security:\n\n    (a) A crash if /K and /F were both set with the option to save the compiled\n    pattern.\n\n    (b) Another crash if the option to print captured substrings in a callout\n    was combined with setting a null ovector, for example \\O\\C+ as a subject\n    string.\n\n14. A pattern such as \"((?2){0,1999}())?\", which has a group containing a\n    forward reference repeated a large (but limited) number of times within a\n    repeated outer group that has a zero minimum quantifier, caused incorrect\n    code to be compiled, leading to the error \"internal error:\n    previously-checked referenced subpattern not found\" when an incorrect\n    memory address was read. This bug was reported as \"heap overflow\",\n    discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number\n    CVE-2015-2325.\n\n23. A pattern such as \"((?+1)(\\1))/\" containing a forward reference subroutine\n    call within a group that also contained a recursive back reference caused\n    incorrect code to be compiled. This bug was reported as \"heap overflow\",\n    discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE\n    number CVE-2015-2326.\n\n24. Computing the size of the JIT read-only data in advance has been a source\n    of various issues, and new ones are still appear unfortunately. To fix\n    existing and future issues, size computation is eliminated from the code,\n    and replaced by on-demand memory allocation.\n\n25. A pattern such as /(?i)[A-`]/, where characters in the other case are\n    adjacent to the end of the range, and the range contained characters with\n    more than one other case, caused incorrect behaviour when compiled in UTF\n    mode. In that example, the range a-j was left out of the class.\n\n26. Fix JIT compilation of conditional blocks, which assertion\n    is converted to (*FAIL). E.g: /(?(?!))/.\n\n27. The pattern /(?(?!)^)/ caused references to random memory. This bug was\n    discovered by the LLVM fuzzer.\n\n28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly\n    when this assertion was used as a condition, for example (?(?!)a|b). In\n    pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect\n    error about an unsupported item.\n\n29. For some types of pattern, for example /Z*(|d*){216}/, the auto-\n    possessification code could take exponential time to complete. A recursion\n    depth limit of 1000 has been imposed to limit the resources used by this\n    optimization.\n\n30. A pattern such as /(*UTF)[\\S\\V\\H]/, which contains a negated special class\n    such as \\S in non-UCP mode, explicit wide characters (> 255) can be ignored\n    because \\S ensures they are all in the class. The code for doing this was\n    interacting badly with the code for computing the amount of space needed to\n    compile the pattern, leading to a buffer overflow. This bug was discovered\n    by the LLVM fuzzer.\n\n31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside\n    other kinds of group caused stack overflow at compile time. This bug was\n    discovered by the LLVM fuzzer.\n\n32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment\n    between a subroutine call and its quantifier was incorrectly compiled,\n    leading to buffer overflow or other errors. This bug was discovered by the\n    LLVM fuzzer.\n\n33. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an\n    assertion after (?(. The code was failing to check the character after\n    (?(?< for the ! or = that would indicate a lookbehind assertion. This bug\n    was discovered by the LLVM fuzzer.\n\n34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with\n    a fixed maximum following a group that contains a subroutine reference was\n    incorrectly compiled and could trigger buffer overflow. This bug was\n    discovered by the LLVM fuzzer.\n\n35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))\n    caused a stack overflow instead of the diagnosis of a non-fixed length\n    lookbehind assertion. This bug was discovered by the LLVM fuzzer.\n\n36. The use of \\K in a positive lookbehind assertion in a non-anchored pattern\n    (e.g. /(?<=\\Ka)/) could make pcregrep loop.\n\n37. There was a similar problem to 36 in pcretest for global matches.\n\n38. If a greedy quantified \\X was preceded by \\C in UTF mode (e.g. \\C\\X*),\n    and a subsequent item in the pattern caused a non-match, backtracking over\n    the repeated \\X did not stop, but carried on past the start of the subject,\n    causing reference to random memory and/or a segfault. There were also some\n    other cases where backtracking after \\C could crash. This set of bugs was\n    discovered by the LLVM fuzzer.\n\n39. The function for finding the minimum length of a matching string could take\n    a very long time if mutual recursion was present many times in a pattern,\n    for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection\n    method has been implemented. This infelicity was discovered by the LLVM\n    fuzzer.\n\n40. Static linking against the PCRE library using the pkg-config module was\n    failing on missing pthread symbols.\n\n\nVersion 8.36 26-September-2014\n------------------------------\n\n1.  Got rid of some compiler warnings in the C++ modules that were shown up by\n    -Wmissing-field-initializers and -Wunused-parameter.\n\n2.  The tests for quantifiers being too big (greater than 65535) were being\n    applied after reading the number, and stupidly assuming that integer\n    overflow would give a negative number. The tests are now applied as the\n    numbers are read.\n\n3.  Tidy code in pcre_exec.c where two branches that used to be different are\n    now the same.\n\n4.  The JIT compiler did not generate match limit checks for certain\n    bracketed expressions with quantifiers. This may lead to exponential\n    backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This\n    issue should be resolved now.\n\n5.  Fixed an issue, which occures when nested alternatives are optimized\n    with table jumps.\n\n6.  Inserted two casts and changed some ints to size_t in the light of some\n    reported 64-bit compiler warnings (Bugzilla 1477).\n\n7.  Fixed a bug concerned with zero-minimum possessive groups that could match\n    an empty string, which sometimes were behaving incorrectly in the\n    interpreter (though correctly in the JIT matcher). This pcretest input is\n    an example:\n\n      '\\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'\n      NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED\n\n    the interpreter was reporting a match of 'NON QUOTED ' only, whereas the\n    JIT matcher and Perl both matched 'NON QUOTED \"QUOT\"\"ED\" AFTER '. The test\n    for an empty string was breaking the inner loop and carrying on at a lower\n    level, when possessive repeated groups should always return to a higher\n    level as they have no backtrack points in them. The empty string test now\n    occurs at the outer level.\n\n8.  Fixed a bug that was incorrectly auto-possessifying \\w+ in the pattern\n    ^\\w+(?>\\s*)(?<=\\w) which caused it not to match \"test test\".\n\n9.  Give a compile-time error for \\o{} (as Perl does) and for \\x{} (which Perl\n    doesn't).\n\n10. Change 8.34/15 introduced a bug that caused the amount of memory needed\n    to hold a pattern to be incorrectly computed (too small) when there were\n    named back references to duplicated names. This could cause \"internal\n    error: code overflow\" or \"double free or corruption\" or other memory\n    handling errors.\n\n11. When named subpatterns had the same prefixes, back references could be\n    confused. For example, in this pattern:\n\n      /(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/\n\n    the reference to 'Name' was incorrectly treated as a reference to a\n    duplicate name.\n\n12. A pattern such as /^s?c/mi8 where the optional character has more than\n    one \"other case\" was incorrectly compiled such that it would only try to\n    match starting at \"c\".\n\n13. When a pattern starting with \\s was studied, VT was not included in the\n    list of possible starting characters; this should have been part of the\n    8.34/18 patch.\n\n14. If a character class started [\\Qx]... where x is any character, the class\n    was incorrectly terminated at the ].\n\n15. If a pattern that started with a caseless match for a character with more\n    than one \"other case\" was studied, PCRE did not set up the starting code\n    unit bit map for the list of possible characters. Now it does. This is an\n    optimization improvement, not a bug fix.\n\n16. The Unicode data tables have been updated to Unicode 7.0.0.\n\n17. Fixed a number of memory leaks in pcregrep.\n\n18. Avoid a compiler warning (from some compilers) for a function call with\n    a cast that removes \"const\" from an lvalue by using an intermediate\n    variable (to which the compiler does not object).\n\n19. Incorrect code was compiled if a group that contained an internal recursive\n    back reference was optional (had quantifier with a minimum of zero). This\n    example compiled incorrect code: /(((a\\2)|(a*)\\g<-1>))*/ and other examples\n    caused segmentation faults because of stack overflows at compile time.\n\n20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a\n    group that is quantified with an indefinite repeat, caused a compile-time\n    loop which used up all the system stack and provoked a segmentation fault.\n    This was not the same bug as 19 above.\n\n21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h.\n    Patch by Mike Frysinger.\n\n\nVersion 8.35 04-April-2014\n--------------------------\n\n1.  A new flag is set, when property checks are present in an XCLASS.\n    When this flag is not set, PCRE can perform certain optimizations\n    such as studying these XCLASS-es.\n\n2.  The auto-possessification of character sets were improved: a normal\n    and an extended character set can be compared now. Furthermore\n    the JIT compiler optimizes more character set checks.\n\n3.  Got rid of some compiler warnings for potentially uninitialized variables\n    that show up only when compiled with -O2.\n\n4.  A pattern such as (?=ab\\K) that uses \\K in an assertion can set the start\n    of a match later then the end of the match. The pcretest program was not\n    handling the case sensibly - it was outputting from the start to the next\n    binary zero. It now reports this situation in a message, and outputs the\n    text from the end to the start.\n\n5.  Fast forward search is improved in JIT. Instead of the first three\n    characters, any three characters with fixed position can be searched.\n    Search order: first, last, middle.\n\n6.  Improve character range checks in JIT. Characters are read by an inprecise\n    function now, which returns with an unknown value if the character code is\n    above a certain threshold (e.g: 256). The only limitation is that the value\n    must be bigger than the threshold as well. This function is useful when\n    the characters above the threshold are handled in the same way.\n\n7.  The macros whose names start with RAWUCHAR are placeholders for a future\n    mode in which only the bottom 21 bits of 32-bit data items are used. To\n    make this more memorable for those maintaining the code, the names have\n    been changed to start with UCHAR21, and an extensive comment has been added\n    to their definition.\n\n8.  Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c\n    to the export list in Makefile.am (they were accidentally omitted from the\n    8.34 tarball).\n\n9.  The informational output from pcretest used the phrase \"starting byte set\"\n    which is inappropriate for the 16-bit and 32-bit libraries. As the output\n    for \"first char\" and \"need char\" really means \"non-UTF-char\", I've changed\n    \"byte\" to \"char\", and slightly reworded the output. The documentation about\n    these values has also been (I hope) clarified.\n\n10. Another JIT related optimization: use table jumps for selecting the correct\n    backtracking path, when more than four alternatives are present inside a\n    bracket.\n\n11. Empty match is not possible, when the minimum length is greater than zero,\n    and there is no \\K in the pattern. JIT should avoid empty match checks in\n    such cases.\n\n12. In a caseless character class with UCP support, when a character with more\n    than one alternative case was not the first character of a range, not all\n    the alternative cases were added to the class. For example, s and \\x{17f}\n    are both alternative cases for S: the class [RST] was handled correctly,\n    but [R-T] was not.\n\n13. The configure.ac file always checked for pthread support when JIT was\n    enabled. This is not used in Windows, so I have put this test inside a\n    check for the presence of windows.h (which was already tested for).\n\n14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT.\n    The algorithm provides a way to skip certain starting offsets, and usually\n    faster than linear prefix searches.\n\n15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well\n    as for 'fr_FR' and 'french'. For some reason, however, it then used the\n    Windows-specific input and output files, which have 'french' screwed in.\n    So this could never have worked. One of the problems with locales is that\n    they aren't always the same. I have now updated RunTest so that it checks\n    the output of the locale test (test 3) against three different output\n    files, and it allows the test to pass if any one of them matches. With luck\n    this should make the test pass on some versions of Solaris where it was\n    failing. Because of the uncertainty, the script did not used to stop if\n    test 3 failed; it now does. If further versions of a French locale ever\n    come to light, they can now easily be added.\n\n16. If --with-pcregrep-bufsize was given a non-integer value such as \"50K\",\n    there was a message during ./configure, but it did not stop. This now\n    provokes an error. The invalid example in README has been corrected.\n    If a value less than the minimum is given, the minimum value has always\n    been used, but now a warning is given.\n\n17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This\n    was a bug in the test system, which is now fixed. Also, the list of various\n    configurations that are tested for each release did not have one with both\n    16/32 bits and --enable-bar-anycrlf. It now does.\n\n18. pcretest was missing \"-C bsr\" for displaying the \\R default setting.\n\n19. Little endian PowerPC systems are supported now by the JIT compiler.\n\n20. The fast forward newline mechanism could enter to an infinite loop on\n    certain invalid UTF-8 input. Although we don't support these cases\n    this issue can be fixed by a performance optimization.\n\n21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does\n    not take account if existing stack usage. There is now a new global\n    variable called pcre_stack_guard that can be set to point to an external\n    function to check stack availability. It is called at the start of\n    processing every parenthesized group.\n\n22. A typo in the code meant that in ungreedy mode the max/min qualifier\n    behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did\n    not match \"ab\".\n\n23. When UTF was disabled, the JIT program reported some incorrect compile\n    errors. These messages are silenced now.\n\n24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT\n    compiler.\n\n25. Change all the temporary files used in RunGrepTest to be different to those\n    used by RunTest so that the tests can be run simultaneously, for example by\n    \"make -j check\".\n\n\nVersion 8.34 15-December-2013\n-----------------------------\n\n1.  Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT\n    executable memory. Patch inspired by Carsten Klein.\n\n2.  ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although\n    this macro is never tested and has no effect, because the work to support\n    coverage involves only compiling and linking options and special targets in\n    the Makefile. The comment in config.h implied that defining the macro would\n    enable coverage support, which is totally false. There was also support for\n    setting this macro in the CMake files (my fault, I just copied it from\n    configure). SUPPORT_GCOV has now been removed.\n\n3.  Make a small performance improvement in strlen16() and strlen32() in\n    pcretest.\n\n4.  Change 36 for 8.33 left some unreachable statements in pcre_exec.c,\n    detected by the Solaris compiler (gcc doesn't seem to be able to diagnose\n    these cases). There was also one in pcretest.c.\n\n5.  Cleaned up a \"may be uninitialized\" compiler warning in pcre_exec.c.\n\n6.  In UTF mode, the code for checking whether a group could match an empty\n    string (which is used for indefinitely repeated groups to allow for\n    breaking an infinite loop) was broken when the group contained a repeated\n    negated single-character class with a character that occupied more than one\n    data item and had a minimum repetition of zero (for example, [^\\x{100}]* in\n    UTF-8 mode). The effect was undefined: the group might or might not be\n    deemed as matching an empty string, or the program might have crashed.\n\n7.  The code for checking whether a group could match an empty string was not\n    recognizing that \\h, \\H, \\v, \\V, and \\R must match a character.\n\n8.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match\n    an empty string. If it can, pcretest shows this in its information output.\n\n9.  Fixed two related bugs that applied to Unicode extended grapheme clusters\n    that were repeated with a maximizing qualifier (e.g. \\X* or \\X{2,5}) when\n    matched by pcre_exec() without using JIT:\n\n    (a) If the rest of the pattern did not match after a maximal run of\n        grapheme clusters, the code for backing up to try with fewer of them\n        did not always back up over a full grapheme when characters that do not\n        have the modifier quality were involved, e.g. Hangul syllables.\n\n    (b) If the match point in a subject started with modifier character, and\n        there was no match, the code could incorrectly back up beyond the match\n        point, and potentially beyond the first character in the subject,\n        leading to a segfault or an incorrect match result.\n\n10. A conditional group with an assertion condition could lead to PCRE\n    recording an incorrect first data item for a match if no other first data\n    item was recorded. For example, the pattern (?(?=ab)ab) recorded \"a\" as a\n    first data item, and therefore matched \"ca\" after \"c\" instead of at the\n    start.\n\n11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a\n    bug that caused the command \"echo a | ./pcregrep -M '|a'\" to loop.\n\n12. The source of pcregrep now includes z/OS-specific code so that it can be\n    compiled for z/OS as part of the special z/OS distribution.\n\n13. Added the -T and -TM options to pcretest.\n\n14. The code in pcre_compile.c for creating the table of named capturing groups\n    has been refactored. Instead of creating the table dynamically during the\n    actual compiling pass, the information is remembered during the pre-compile\n    pass (on the stack unless there are more than 20 named groups, in which\n    case malloc() is used) and the whole table is created before the actual\n    compile happens. This has simplified the code (it is now nearly 150 lines\n    shorter) and prepared the way for better handling of references to groups\n    with duplicate names.\n\n15. A back reference to a named subpattern when there is more than one of the\n    same name now checks them in the order in which they appear in the pattern.\n    The first one that is set is used for the reference. Previously only the\n    first one was inspected. This change makes PCRE more compatible with Perl.\n\n16. Unicode character properties were updated from Unicode 6.3.0.\n\n17. The compile-time code for auto-possessification has been refactored, based\n    on a patch by Zoltan Herczeg. It now happens after instead of during\n    compilation. The code is cleaner, and more cases are handled. The option\n    PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O\n    options in pcretest are provided to set it. It can also be set by\n    (*NO_AUTO_POSSESS) at the start of a pattern.\n\n18. The character VT has been added to the default (\"C\" locale) set of\n    characters that match \\s and are generally treated as white space,\n    following this same change in Perl 5.18. There is now no difference between\n    \"Perl space\" and \"POSIX space\". Whether VT is treated as white space in\n    other locales depends on the locale.\n\n19. The code for checking named groups as conditions, either for being set or\n    for being recursed, has been refactored (this is related to 14 and 15\n    above). Processing unduplicated named groups should now be as fast at\n    numerical groups, and processing duplicated groups should be faster than\n    before.\n\n20. Two patches to the CMake build system, by Alexander Barkov:\n\n      (1) Replace the \"source\" command by \".\" in CMakeLists.txt because\n          \"source\" is a bash-ism.\n\n      (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in;\n          without these the CMake build does not work on Solaris.\n\n21. Perl has changed its handling of \\8 and \\9. If there is no previously\n    encountered capturing group of those numbers, they are treated as the\n    literal characters 8 and 9 instead of a binary zero followed by the\n    literals. PCRE now does the same.\n\n22. Following Perl, added \\o{} to specify codepoints in octal, making it\n    possible to specify values greater than 0777 and also making them\n    unambiguous.\n\n23. Perl now gives an error for missing closing braces after \\x{... instead of\n    treating the string as literal. PCRE now does the same.\n\n24. RunTest used to grumble if an inappropriate test was selected explicitly,\n    but just skip it when running all tests. This make it awkward to run ranges\n    of tests when one of them was inappropriate. Now it just skips any\n    inappropriate tests, as it always did when running all tests.\n\n25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained\n    character types such as \\d or \\w, too many callouts were inserted, and the\n    data that they returned was rubbish.\n\n26. In UCP mode, \\s was not matching two of the characters that Perl matches,\n    namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they\n    were matched by \\h. The code has now been refactored so that the lists of\n    the horizontal and vertical whitespace characters used for \\h and \\v (which\n    are defined only in one place) are now also used for \\s.\n\n27. Add JIT support for the 64 bit TileGX architecture.\n    Patch by Jiong Wang (Tilera Corporation).\n\n28. Possessive quantifiers for classes (both explicit and automatically\n    generated) now use special opcodes instead of wrapping in ONCE brackets.\n\n29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier\n    (because it's meaningless), this was not happening when PCRE_CASELESS was\n    set. Not wrong, but inefficient.\n\n30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode\n    properties for \\w, \\d, etc) is present in a test regex. Otherwise if the\n    test contains no characters greater than 255, Perl doesn't realise it\n    should be using Unicode semantics.\n\n31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and\n    [:punct:] when PCRE_UCP is set so as to include the same characters as Perl\n    does in Unicode mode.\n\n32. Added the \"forbid\" facility to pcretest so that putting tests into the\n    wrong test files can sometimes be quickly detected.\n\n33. There is now a limit (default 250) on the depth of nesting of parentheses.\n    This limit is imposed to control the amount of system stack used at compile\n    time. It can be changed at build time by --with-parens-nest-limit=xxx or\n    the equivalent in CMake.\n\n34. Character classes such as [A-\\d] or [a-[:digit:]] now cause compile-time\n    errors. Perl warns for these when in warning mode, but PCRE has no facility\n    for giving warnings.\n\n35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does.\n    However, this was not working for (?!) because it is optimized to (*FAIL),\n    for which PCRE does not allow quantifiers. The optimization is now disabled\n    when a quantifier follows (?!). I can't see any use for this, but it makes\n    things uniform.\n\n36. Perl no longer allows group names to start with digits, so I have made this\n    change also in PCRE. It simplifies the code a bit.\n\n37. In extended mode, Perl ignores spaces before a + that indicates a\n    possessive quantifier. PCRE allowed a space before the quantifier, but not\n    before the possessive +. It now does.\n\n38. The use of \\K (reset reported match start) within a repeated possessive\n    group such as (a\\Kb)*+ was not working.\n\n40. Document that the same character tables must be used at compile time and\n    run time, and that the facility to pass tables to pcre_exec() and\n    pcre_dfa_exec() is for use only with saved/restored patterns.\n\n41. Applied Jeff Trawick's patch CMakeLists.txt, which \"provides two new\n    features for Builds with MSVC:\n\n    1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW\n       builds). The .rc files can be used to set FileDescription and many other\n       attributes.\n\n    2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files.\n       This allows higher-level build scripts which want .pdb files to avoid\n       hard-coding the exact files needed.\"\n\n42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to\n    mean \"start of word\" and \"end of word\", respectively, as a transition aid.\n\n43. A minimizing repeat of a class containing codepoints greater than 255 in\n    non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was\n    compiled to use the heap for recursion.\n\n44. Got rid of some compiler warnings for unused variables when UTF but not UCP\n    is configured.\n\n\nVersion 8.33 28-May-2013\n------------------------\n\n1.  Added 'U' to some constants that are compared to unsigned integers, to\n    avoid compiler signed/unsigned warnings. Added (int) casts to unsigned\n    variables that are added to signed variables, to ensure the result is\n    signed and can be negated.\n\n2.  Applied patch by Daniel Richard G for quashing MSVC warnings to the\n    CMake config files.\n\n3.  Revise the creation of config.h.generic so that all boolean macros are\n    #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes\n    overriding via -D on the command line possible.\n\n4.  Changing the definition of the variable \"op\" in pcre_exec.c from pcre_uchar\n    to unsigned int is reported to make a quite noticeable speed difference in\n    a specific Windows environment. Testing on Linux did also appear to show\n    some benefit (and it is clearly not harmful). Also fixed the definition of\n    Xop which should be unsigned.\n\n5.  Related to (4), changing the definition of the intermediate variable cc\n    in repeated character loops from pcre_uchar to pcre_uint32 also gave speed\n    improvements.\n\n6.  Fix forward search in JIT when link size is 3 or greater. Also removed some\n    unnecessary spaces.\n\n7.  Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12\n    and later.\n\n8.  Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only.\n\n9.  Optimizing fast_forward_start_bits in JIT.\n\n10. Adding support for callouts in JIT, and fixing some issues revealed\n    during this work. Namely:\n\n    (a) Unoptimized capturing brackets incorrectly reset on backtrack.\n\n    (b) Minimum length was not checked before the matching is started.\n\n11. The value of capture_last that is passed to callouts was incorrect in some\n    cases when there was a capture on one path that was subsequently abandoned\n    after a backtrack. Also, the capture_last value is now reset after a\n    recursion, since all captures are also reset in this case.\n\n12. The interpreter no longer returns the \"too many substrings\" error in the\n    case when an overflowing capture is in a branch that is subsequently\n    abandoned after a backtrack.\n\n13. In the pathological case when an offset vector of size 2 is used, pcretest\n    now prints out the matched string after a yield of 0 or 1.\n\n14. Inlining subpatterns in recursions, when certain conditions are fulfilled.\n    Only supported by the JIT compiler at the moment.\n\n15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez.\n\n16. Partial matches now set offsets[2] to the \"bumpalong\" value, that is, the\n    offset of the starting point of the matching process, provided the offsets\n    vector is large enough.\n\n17. The \\A escape now records a lookbehind value of 1, though its execution\n    does not actually inspect the previous character. This is to ensure that,\n    in partial multi-segment matching, at least one character from the old\n    segment is retained when a new segment is processed. Otherwise, if there\n    are no lookbehinds in the pattern, \\A might match incorrectly at the start\n    of a new segment.\n\n18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations.\n\n19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this\n    gives some modest performance improvement in 8-bit mode.\n\n20. Added the PCRE-specific property \\p{Xuc} for matching characters that can\n    be expressed in certain programming languages using Universal Character\n    Names.\n\n21. Unicode validation has been updated in the light of Unicode Corrigendum #9,\n    which points out that \"non characters\" are not \"characters that may not\n    appear in Unicode strings\" but rather \"characters that are reserved for\n    internal use and have only local meaning\".\n\n22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and\n    there was a conditional group that depended on an assertion, if the\n    assertion was false, the callout that immediately followed the alternation\n    in the condition was skipped when pcre_exec() was used for matching.\n\n23. Allow an explicit callout to be inserted before an assertion that is the\n    condition for a conditional group, for compatibility with automatic\n    callouts, which always insert a callout at this point.\n\n24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also\n    confines (*SKIP) and (*PRUNE) in the same way, and this has now been done.\n\n25. (*PRUNE) is now supported by the JIT compiler.\n\n26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa.\n\n27. Fix the case where there are two or more SKIPs with arguments that may be\n    ignored.\n\n28. (*SKIP) is now supported by the JIT compiler.\n\n29. (*THEN) is now supported by the JIT compiler.\n\n30. Update RunTest with additional test selector options.\n\n31. The way PCRE handles backtracking verbs has been changed in two ways.\n\n    (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override\n    SKIP. Now, PCRE acts on whichever backtracking verb is reached first by\n    backtracking. In some cases this makes it more Perl-compatible, but Perl's\n    rather obscure rules do not always do the same thing.\n\n    (2) Previously, backtracking verbs were confined within assertions. This is\n    no longer the case for positive assertions, except for (*ACCEPT). Again,\n    this sometimes improves Perl compatibility, and sometimes does not.\n\n32. A number of tests that were in test 2 because Perl did things differently\n    have been moved to test 1, because either Perl or PCRE has changed, and\n    these tests are now compatible.\n\n32. Backtracking control verbs are now handled in the same way in JIT and\n    interpreter.\n\n33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that\n    contained a forward subroutine reference caused a compile error.\n\n34. Auto-detect and optimize limited repetitions in JIT.\n\n35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular,\n    blocking (*UTF) etc.\n\n36. In the interpreter, maximizing pattern repetitions for characters and\n    character types now use tail recursion, which reduces stack usage.\n\n37. The value of the max lookbehind was not correctly preserved if a compiled\n    and saved regex was reloaded on a host of different endianness.\n\n38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension\n    of the compiled pattern block, expand the flags field from 16 to 32 bits\n    because it was almost full.\n\n39. Try madvise first before posix_madvise.\n\n40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines\n    with a pattern such as ^$. It has taken 4 years for anybody to notice! The\n    original change locked out all matches of empty strings. This has been\n    changed so that one match of an empty string per line is recognized.\n    Subsequent searches on the same line (for colouring or for --only-matching,\n    for example) do not recognize empty strings.\n\n41. Applied a user patch to fix a number of spelling mistakes in comments.\n\n42. Data lines longer than 65536 caused pcretest to crash.\n\n43. Clarified the data type for length and startoffset arguments for pcre_exec\n    and pcre_dfa_exec in the function-specific man pages, where they were\n    explicitly stated to be in bytes, never having been updated. I also added\n    some clarification to the pcreapi man page.\n\n44. A call to pcre_dfa_exec() with an output vector size less than 2 caused\n    a segmentation fault.\n\n\nVersion 8.32 30-November-2012\n-----------------------------\n\n1.  Improved JIT compiler optimizations for first character search and single\n    character iterators.\n\n2.  Supporting IBM XL C compilers for PPC architectures in the JIT compiler.\n    Patch by Daniel Richard G.\n\n3.  Single character iterator optimizations in the JIT compiler.\n\n4.  Improved JIT compiler optimizations for character ranges.\n\n5.  Rename the \"leave\" variable names to \"quit\" to improve WinCE compatibility.\n    Reported by Giuseppe D'Angelo.\n\n6.  The PCRE_STARTLINE bit, indicating that a match can occur only at the start\n    of a line, was being set incorrectly in cases where .* appeared inside\n    atomic brackets at the start of a pattern, or where there was a subsequent\n    *PRUNE or *SKIP.\n\n7.  Improved instruction cache flush for POWER/PowerPC.\n    Patch by Daniel Richard G.\n\n8.  Fixed a number of issues in pcregrep, making it more compatible with GNU\n    grep:\n\n    (a) There is now no limit to the number of patterns to be matched.\n\n    (b) An error is given if a pattern is too long.\n\n    (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir\n        are now supported.\n\n    (d) --exclude-from and --include-from (multiple use) have been added.\n\n    (e) Exclusions and inclusions now apply to all files and directories, not\n        just to those obtained from scanning a directory recursively.\n\n    (f) Multiple uses of -f and --file-list are now supported.\n\n    (g) In a Windows environment, the default for -d has been changed from\n        \"read\" (the GNU grep default) to \"skip\", because otherwise the presence\n        of a directory in the file list provokes an error.\n\n    (h) The documentation has been revised and clarified in places.\n\n9.  Improve the matching speed of capturing brackets.\n\n10. Changed the meaning of \\X so that it now matches a Unicode extended\n    grapheme cluster.\n\n11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting\n    out POSIX threads when JIT support is configured.\n\n12. Added support for PCRE_STUDY_EXTRA_NEEDED.\n\n13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg\n    structure could go wrong in environments where size_t is not the same size\n    as int.\n\n14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be\n    set.\n\n15. The EBCDIC support had decayed; later updates to the code had included\n    explicit references to (e.g.) \\x0a instead of CHAR_LF. There has been a\n    general tidy up of EBCDIC-related issues, and the documentation was also\n    not quite right. There is now a test that can be run on ASCII systems to\n    check some of the EBCDIC-related things (but is it not a full test).\n\n16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting\n    in a small tidy to the code.\n\n17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled.\n\n18. If the --only-matching (-o) option in pcregrep is specified multiple\n    times, each one causes appropriate output. For example, -o1 -o2 outputs the\n    substrings matched by the 1st and 2nd capturing parentheses. A separating\n    string can be specified by --om-separator (default empty).\n\n19. Improving the first n character searches.\n\n20. Turn case lists for horizontal and vertical white space into macros so that\n    they are defined only once.\n\n21. This set of changes together give more compatible Unicode case-folding\n    behaviour for characters that have more than one other case when UCP\n    support is available.\n\n    (a) The Unicode property table now has offsets into a new table of sets of\n        three or more characters that are case-equivalent. The MultiStage2.py\n        script that generates these tables (the pcre_ucd.c file) now scans\n        CaseFolding.txt instead of UnicodeData.txt for character case\n        information.\n\n    (b) The code for adding characters or ranges of characters to a character\n        class has been abstracted into a generalized function that also handles\n        case-independence. In UTF-mode with UCP support, this uses the new data\n        to handle characters with more than one other case.\n\n    (c) A bug that is fixed as a result of (b) is that codepoints less than 256\n        whose other case is greater than 256 are now correctly matched\n        caselessly. Previously, the high codepoint matched the low one, but not\n        vice versa.\n\n    (d) The processing of \\h, \\H, \\v, and \\ in character classes now makes use\n        of the new class addition function, using character lists defined as\n        macros alongside the case definitions of 20 above.\n\n    (e) Caseless back references now work with characters that have more than\n        one other case.\n\n    (f) General caseless matching of characters with more than one other case\n        is supported.\n\n22. Unicode character properties were updated from Unicode 6.2.0\n\n23. Improved CMake support under Windows. Patch by Daniel Richard G.\n\n24. Add support for 32-bit character strings, and UTF-32\n\n25. Major JIT compiler update (code refactoring and bugfixing).\n    Experimental Sparc 32 support is added.\n\n26. Applied a modified version of Daniel Richard G's patch to create\n    pcre.h.generic and config.h.generic by \"make\" instead of in the\n    PrepareRelease script.\n\n27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in\n    pcre_compile.c when checking for a zero character.\n\n28. Introducing a native interface for JIT. Through this interface, the compiled\n    machine code can be directly executed. The purpose of this interface is to\n    provide fast pattern matching, so several sanity checks are not performed.\n    However, feature tests are still performed. The new interface provides\n    1.4x speedup compared to the old one.\n\n29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for\n    the subject string length, the error given was PCRE_ERROR_BADOFFSET, which\n    was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case.\n\n30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints\n    greater than 0x7fffffff (which cannot be represented in UTF-8, even under\n    the \"old\" RFC 2279). Instead, it ended up passing a negative length to\n    pcre_exec().\n\n31. Add support for GCC's visibility feature to hide internal functions.\n\n32. Running \"pcretest -C pcre8\" or \"pcretest -C pcre16\" gave a spurious error\n    \"unknown -C option\" after outputting 0 or 1.\n\n33. There is now support for generating a code coverage report for the test\n    suite in environments where gcc is the compiler and lcov is installed. This\n    is mainly for the benefit of the developers.\n\n34. If PCRE is built with --enable-valgrind, certain memory regions are marked\n    unaddressable using valgrind annotations, allowing valgrind to detect\n    invalid memory accesses. This is mainly for the benefit of the developers.\n\n25. (*UTF) can now be used to start a pattern in any of the three libraries.\n\n26. Give configure error if --enable-cpp but no C++ compiler found.\n\n\nVersion 8.31 06-July-2012\n-------------------------\n\n1.  Fixing a wrong JIT test case and some compiler warnings.\n\n2.  Removed a bashism from the RunTest script.\n\n3.  Add a cast to pcre_exec.c to fix the warning \"unary minus operator applied\n    to unsigned type, result still unsigned\" that was given by an MS compiler\n    on encountering the code \"-sizeof(xxx)\".\n\n4.  Partial matching support is added to the JIT compiler.\n\n5.  Fixed several bugs concerned with partial matching of items that consist\n    of more than one character:\n\n    (a) /^(..)\\1/ did not partially match \"aba\" because checking references was\n        done on an \"all or nothing\" basis. This also applied to repeated\n        references.\n\n    (b) \\R did not give a hard partial match if \\r was found at the end of the\n        subject.\n\n    (c) \\X did not give a hard partial match after matching one or more\n        characters at the end of the subject.\n\n    (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize\n        a partial match for the string \"\\r\".\n\n    (e) When newline was set to CRLF, the metacharacter \".\" did not recognize\n        a partial match for a CR character at the end of the subject string.\n\n6.  If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when\n    running pcretest, the text \"(JIT)\" added to the output whenever JIT is\n    actually used to run the match.\n\n7.  Individual JIT compile options can be set in pcretest by following -s+[+]\n    or /S+[+] with a digit between 1 and 7.\n\n8.  OP_NOT now supports any UTF character not just single-byte ones.\n\n9.  (*MARK) control verb is now supported by the JIT compiler.\n\n10. The command \"./RunTest list\" lists the available tests without actually\n    running any of them. (Because I keep forgetting what they all are.)\n\n11. Add PCRE_INFO_MAXLOOKBEHIND.\n\n12. Applied a (slightly modified) user-supplied patch that improves performance\n    when the heap is used for recursion (compiled with --disable-stack-for-\n    recursion). Instead of malloc and free for each heap frame each time a\n    logical recursion happens, frames are retained on a chain and re-used where\n    possible. This sometimes gives as much as 30% improvement.\n\n13. As documented, (*COMMIT) is now confined to within a recursive subpattern\n    call.\n\n14. As documented, (*COMMIT) is now confined to within a positive assertion.\n\n15. It is now possible to link pcretest with libedit as an alternative to\n    libreadline.\n\n16. (*COMMIT) control verb is now supported by the JIT compiler.\n\n17. The Unicode data tables have been updated to Unicode 6.1.0.\n\n18. Added --file-list option to pcregrep.\n\n19. Added binary file support to pcregrep, including the -a, --binary-files,\n    -I, and --text options.\n\n20. The madvise function is renamed for posix_madvise for QNX compatibility\n    reasons. Fixed by Giuseppe D'Angelo.\n\n21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler.\n\n22. Changed the option for creating symbolic links for 16-bit man pages from\n    -s to -sf so that re-installing does not cause issues.\n\n23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it.\n\n24. Fixed a very old bug in pcretest that caused errors with restarted DFA\n    matches in certain environments (the workspace was not being correctly\n    retained). Also added to pcre_dfa_exec() a simple plausibility check on\n    some of the workspace data at the beginning of a restart.\n\n25. \\s*\\R was auto-possessifying the \\s* when it should not, whereas \\S*\\R\n    was not doing so when it should - probably a typo introduced by SVN 528\n    (change 8.10/14).\n\n26. When PCRE_UCP was not set, \\w+\\x{c4} was incorrectly auto-possessifying the\n    \\w+ when the character tables indicated that \\x{c4} was a word character.\n    There were several related cases, all because the tests for doing a table\n    lookup were testing for characters less than 127 instead of 255.\n\n27. If a pattern contains capturing parentheses that are not used in a match,\n    their slots in the ovector are set to -1. For those that are higher than\n    any matched groups, this happens at the end of processing. In the case when\n    there were back references that the ovector was too small to contain\n    (causing temporary malloc'd memory to be used during matching), and the\n    highest capturing number was not used, memory off the end of the ovector\n    was incorrectly being set to -1. (It was using the size of the temporary\n    memory instead of the true size.)\n\n28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an\n    ovector size, it uses memory at the end of the block that it has got.\n\n29. Check for an overlong MARK name and give an error at compile time. The\n    limit is 255 for the 8-bit library and 65535 for the 16-bit library.\n\n30. JIT compiler update.\n\n31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger\n    Rill for the patch.\n\n32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11.\n\n33. Variable renamings in the PCRE-JIT compiler. No functionality change.\n\n34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of\n    SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib)\n    was enabled.\n\n35. Improve JIT code generation for greedy plus quantifier.\n\n36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against \"aac\", it set group\n    1 to \"aa\" instead of to an empty string. The bug affected repeated groups\n    that could potentially match an empty string.\n\n37. Optimizing single character iterators in JIT.\n\n38. Wide characters specified with \\uxxxx in JavaScript mode are now subject to\n    the same checks as \\x{...} characters in non-JavaScript mode. Specifically,\n    codepoints that are too big for the mode are faulted, and in a UTF mode,\n    disallowed codepoints are also faulted.\n\n39. If PCRE was compiled with UTF support, in three places in the DFA\n    matcher there was code that should only have been obeyed in UTF mode, but\n    was being obeyed unconditionally. In 8-bit mode this could cause incorrect\n    processing when bytes with values greater than 127 were present. In 16-bit\n    mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In\n    both cases the values are those that cannot be the first data item in a UTF\n    character. The three items that might have provoked this were recursions,\n    possessively repeated groups, and atomic groups.\n\n40. Ensure that libpcre is explicitly listed in the link commands for pcretest\n    and pcregrep, because some OS require shared objects to be explicitly\n    passed to ld, causing the link step to fail if they are not.\n\n41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit\n    mode, patterns that started with \\h* or \\R* might be incorrectly matched.\n\n\nVersion 8.30 04-February-2012\n-----------------------------\n\n1.  Renamed \"isnumber\" as \"is_a_number\" because in some Mac environments this\n    name is defined in ctype.h.\n\n2.  Fixed a bug in fixed-length calculation for lookbehinds that would show up\n    only in quite long subpatterns.\n\n3.  Removed the function pcre_info(), which has been obsolete and deprecated\n    since it was replaced by pcre_fullinfo() in February 2000.\n\n4.  For a non-anchored pattern, if (*SKIP) was given with a name that did not\n    match a (*MARK), and the match failed at the start of the subject, a\n    reference to memory before the start of the subject could occur. This bug\n    was introduced by fix 17 of release 8.21.\n\n5.  A reference to an unset group with zero minimum repetition was giving\n    totally wrong answers (in non-JavaScript-compatibility mode). For example,\n    /(another)?(\\1?)test/ matched against \"hello world test\". This bug was\n    introduced in release 8.13.\n\n6.  Add support for 16-bit character strings (a large amount of work involving\n    many changes and refactorings).\n\n7.  RunGrepTest failed on msys because \\r\\n was replaced by whitespace when the\n    command \"pattern=`printf 'xxx\\r\\njkl'`\" was run. The pattern is now taken\n    from a file.\n\n8.  Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size\n    rounding is not applied in this particular case).\n\n9.  The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected\n    if they appear, or are escaped, in patterns.\n\n10. Get rid of a number of -Wunused-but-set-variable warnings.\n\n11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark\n    \"x\". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all.\n    Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern\n    also returns the mark \"x\". This bug applied to capturing parentheses,\n    non-capturing parentheses, and atomic parentheses. It also applied to some\n    assertions.\n\n12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version\n    information out of configure.ac instead of relying on pcre.h.generic, which\n    is not stored in the repository.\n\n13. Applied Dmitry V. Levin's patch for a more portable method for linking with\n    -lreadline.\n\n14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C.\n\n15. Applied Graycode's patch to put the top-level frame on the stack rather\n    than the heap when not using the stack for recursion. This gives a\n    performance improvement in many cases when recursion is not deep.\n\n16. Experimental code added to \"pcretest -C\" to output the stack frame size.\n\n\nVersion 8.21 12-Dec-2011\n------------------------\n\n1.  Updating the JIT compiler.\n\n2.  JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases\n    are added as well.\n\n3.  Fix cache-flush issue on PowerPC (It is still an experimental JIT port).\n    PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before\n    calling _pcre_jit_exec. Some extra comments are added.\n\n4.  (*MARK) settings inside atomic groups that do not contain any capturing\n    parentheses, for example, (?>a(*:m)), were not being passed out. This bug\n    was introduced by change 18 for 8.20.\n\n5.  Supporting of \\x, \\U and \\u in JavaScript compatibility mode based on the\n    ECMA-262 standard.\n\n6.  Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were\n    erroneously being rejected as \"not fixed length\" if PCRE_CASELESS was set.\n    This bug was probably introduced by change 9 of 8.13.\n\n7.  While fixing 6 above, I noticed that a number of other items were being\n    incorrectly rejected as \"not fixed length\". This arose partly because newer\n    opcodes had not been added to the fixed-length checking code. I have (a)\n    corrected the bug and added tests for these items, and (b) arranged for an\n    error to occur if an unknown opcode is encountered while checking for fixed\n    length instead of just assuming \"not fixed length\". The items that were\n    rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP),\n    (*THEN), \\h, \\H, \\v, \\V, and single character negative classes with fixed\n    repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS.\n\n8.  A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was\n    being incorrectly compiled and would have given unpredicatble results.\n\n9.  A possessively repeated subpattern with minimum repeat count greater than\n    one behaved incorrectly. For example, (A){2,}+ behaved as if it was\n    (A)(A)++ which meant that, after a subsequent mismatch, backtracking into\n    the first (A) could occur when it should not.\n\n10. Add a cast and remove a redundant test from the code.\n\n11. JIT should use pcre_malloc/pcre_free for allocation.\n\n12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems\n    best practice nowadays, and helps with cross-compiling. (If the exec_prefix\n    is anything other than /usr, -L is still shown).\n\n13. In non-UTF-8 mode, \\C is now supported in lookbehinds and DFA matching.\n\n14. Perl does not support \\N without a following name in a [] class; PCRE now\n    also gives an error.\n\n15. If a forward reference was repeated with an upper limit of around 2000,\n    it caused the error \"internal error: overran compiling workspace\". The\n    maximum number of forward references (including repeats) was limited by the\n    internal workspace, and dependent on the LINK_SIZE. The code has been\n    rewritten so that the workspace expands (via pcre_malloc) if necessary, and\n    the default depends on LINK_SIZE. There is a new upper limit (for safety)\n    of around 200,000 forward references. While doing this, I also speeded up\n    the filling in of repeated forward references.\n\n16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was\n    incorrectly expecting the subject to contain another \"a\" after the start.\n\n17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier\n    in the match, the SKIP should be ignored. This was not happening; instead\n    the SKIP was being treated as NOMATCH. For patterns such as\n    /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never\n    tested.\n\n18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is\n    now much more compatible with Perl, in particular in cases where the result\n    is a non-match for a non-anchored pattern. For example, if\n    /b(*:m)f|a(*:n)w/ is matched against \"abc\", the non-match returns the name\n    \"m\", where previously it did not return a name. A side effect of this\n    change is that for partial matches, the last encountered mark name is\n    returned, as for non matches. A number of tests that were previously not\n    Perl-compatible have been moved into the Perl-compatible test files. The\n    refactoring has had the pleasing side effect of removing one argument from\n    the match() function, thus reducing its stack requirements.\n\n19. If the /S+ option was used in pcretest to study a pattern using JIT,\n    subsequent uses of /S (without +) incorrectly behaved like /S+.\n\n21. Retrieve executable code size support for the JIT compiler and fixing\n    some warnings.\n\n22. A caseless match of a UTF-8 character whose other case uses fewer bytes did\n    not work when the shorter character appeared right at the end of the\n    subject string.\n\n23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit\n    systems.\n\n24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also\n    output it when the /M option is used in pcretest.\n\n25. The CheckMan script was not being included in the distribution. Also, added\n    an explicit \"perl\" to run Perl scripts from the PrepareRelease script\n    because this is reportedly needed in Windows.\n\n26. If study data was being save in a file and studying had not found a set of\n    \"starts with\" bytes for the pattern, the data written to the file (though\n    never used) was taken from uninitialized memory and so caused valgrind to\n    complain.\n\n27. Updated RunTest.bat as provided by Sheri Pierce.\n\n28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c.\n\n29. Computation of memory usage for the table of capturing group names was\n    giving an unnecessarily large value.\n\n\nVersion 8.20 21-Oct-2011\n------------------------\n\n1.  Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had\n    a POSIX class. After further experiments with Perl, which convinced me that\n    Perl has bugs and confusions, a closing square bracket is no longer allowed\n    in a POSIX name. This bug also affected patterns with classes that started\n    with full stops.\n\n2.  If a pattern such as /(a)b|ac/ is matched against \"ac\", there is no\n    captured substring, but while checking the failing first alternative,\n    substring 1 is temporarily captured. If the output vector supplied to\n    pcre_exec() was not big enough for this capture, the yield of the function\n    was still zero (\"insufficient space for captured substrings\"). This cannot\n    be totally fixed without adding another stack variable, which seems a lot\n    of expense for a edge case. However, I have improved the situation in cases\n    such as /(a)(b)x|abc/ matched against \"abc\", where the return code\n    indicates that fewer than the maximum number of slots in the ovector have\n    been set.\n\n3.  Related to (2) above: when there are more back references in a pattern than\n    slots in the output vector, pcre_exec() uses temporary memory during\n    matching, and copies in the captures as far as possible afterwards. It was\n    using the entire output vector, but this conflicts with the specification\n    that only 2/3 is used for passing back captured substrings. Now it uses\n    only the first 2/3, for compatibility. This is, of course, another edge\n    case.\n\n4.  Zoltan Herczeg's just-in-time compiler support has been integrated into the\n    main code base, and can be used by building with --enable-jit. When this is\n    done, pcregrep automatically uses it unless --disable-pcregrep-jit or the\n    runtime --no-jit option is given.\n\n5.  When the number of matches in a pcre_dfa_exec() run exactly filled the\n    ovector, the return from the function was zero, implying that there were\n    other matches that did not fit. The correct \"exactly full\" value is now\n    returned.\n\n6.  If a subpattern that was called recursively or as a subroutine contained\n    (*PRUNE) or any other control that caused it to give a non-standard return,\n    invalid errors such as \"Error -26 (nested recursion at the same subject\n    position)\" or even infinite loops could occur.\n\n7.  If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped\n    computing the minimum length on reaching *ACCEPT, and so ended up with the\n    wrong value of 1 rather than 0. Further investigation indicates that\n    computing a minimum subject length in the presence of *ACCEPT is difficult\n    (think back references, subroutine calls), and so I have changed the code\n    so that no minimum is registered for a pattern that contains *ACCEPT.\n\n8.  If (*THEN) was present in the first (true) branch of a conditional group,\n    it was not handled as intended. [But see 16 below.]\n\n9.  Replaced RunTest.bat and CMakeLists.txt with improved versions provided by\n    Sheri Pierce.\n\n10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that\n    the first byte in a match must be \"a\".\n\n11. Change 17 for 8.13 increased the recursion depth for patterns like\n    /a(?:.)*?a/ drastically. I've improved things by remembering whether a\n    pattern contains any instances of (*THEN). If it does not, the old\n    optimizations are restored. It would be nice to do this on a per-group\n    basis, but at the moment that is not feasible.\n\n12. In some environments, the output of pcretest -C is CRLF terminated. This\n    broke RunTest's code that checks for the link size. A single white space\n    character after the value is now allowed for.\n\n13. RunTest now checks for the \"fr\" locale as well as for \"fr_FR\" and \"french\".\n    For \"fr\", it uses the Windows-specific input and output files.\n\n14. If (*THEN) appeared in a group that was called recursively or as a\n    subroutine, it did not work as intended. [But see next item.]\n\n15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex\n    pattern fragments (but not containing any | characters). If A and B are\n    matched, but there is a failure in C so that it backtracks to (*THEN), PCRE\n    was behaving differently to Perl. PCRE backtracked into A, but Perl goes to\n    D. In other words, Perl considers parentheses that do not contain any |\n    characters to be part of a surrounding alternative, whereas PCRE was\n    treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles\n    differently. PCRE now behaves in the same way as Perl, except in the case\n    of subroutine/recursion calls such as (?1) which have in any case always\n    been different (but PCRE had them first :-).\n\n16. Related to 15 above: Perl does not treat the | in a conditional group as\n    creating alternatives. Such a group is treated in the same way as an\n    ordinary group without any | characters when processing (*THEN). PCRE has\n    been changed to match Perl's behaviour.\n\n17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the\n    RunGrepTest script failed.\n\n18. Change 22 for version 13 caused atomic groups to use more stack. This is\n    inevitable for groups that contain captures, but it can lead to a lot of\n    stack use in large patterns. The old behaviour has been restored for atomic\n    groups that do not contain any capturing parentheses.\n\n19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not\n    suppress the check for a minimum subject length at run time. (If it was\n    given to pcre_exec() or pcre_dfa_exec() it did work.)\n\n20. Fixed an ASCII-dependent infelicity in pcretest that would have made it\n    fail to work when decoding hex characters in data strings in EBCDIC\n    environments.\n\n21. It appears that in at least one Mac OS environment, the isxdigit() function\n    is implemented as a macro that evaluates to its argument more than once,\n    contravening the C 90 Standard (I haven't checked a later standard). There\n    was an instance in pcretest which caused it to go wrong when processing\n    \\x{...} escapes in subject strings. The has been rewritten to avoid using\n    things like p++ in the argument of isxdigit().\n\n\nVersion 8.13 16-Aug-2011\n------------------------\n\n1.  The Unicode data tables have been updated to Unicode 6.0.0.\n\n2.  Two minor typos in pcre_internal.h have been fixed.\n\n3.  Added #include <string.h> to pcre_scanner_unittest.cc, pcrecpp.cc, and\n    pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr()\n    in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2).\n\n4.  There were a number of related bugs in the code for matching backrefences\n    caselessly in UTF-8 mode when codes for the characters concerned were\n    different numbers of bytes. For example, U+023A and U+2C65 are an upper\n    and lower case pair, using 2 and 3 bytes, respectively. The main bugs were:\n    (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte\n    code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a\n    2-byte code at the end of the subject (it thought there wasn't enough data\n    left).\n\n5.  Comprehensive information about what went wrong is now returned by\n    pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long\n    as the output vector has at least 2 elements. The offset of the start of\n    the failing character and a reason code are placed in the vector.\n\n6.  When the UTF-8 string check fails for pcre_compile(), the offset that is\n    now returned is for the first byte of the failing character, instead of the\n    last byte inspected. This is an incompatible change, but I hope it is small\n    enough not to be a problem. It makes the returned offset consistent with\n    pcre_exec() and pcre_dfa_exec().\n\n7.  pcretest now gives a text phrase as well as the error number when\n    pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check\n    failure, the offset and reason code are output.\n\n8.  When \\R was used with a maximizing quantifier it failed to skip backwards\n    over a \\r\\n pair if the subsequent match failed. Instead, it just skipped\n    back over a single character (\\n). This seems wrong (because it treated the\n    two characters as a single entity when going forwards), conflicts with the\n    documentation that \\R is equivalent to (?>\\r\\n|\\n|...etc), and makes the\n    behaviour of \\R* different to (\\R)*, which also seems wrong. The behaviour\n    has been changed.\n\n9.  Some internal refactoring has changed the processing so that the handling\n    of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile\n    time (the PCRE_DOTALL option was changed this way some time ago: version\n    7.7 change 16). This has made it possible to abolish the OP_OPT op code,\n    which was always a bit of a fudge. It also means that there is one less\n    argument for the match() function, which reduces its stack requirements\n    slightly. This change also fixes an incompatibility with Perl: the pattern\n    (?i:([^b]))(?1) should not match \"ab\", but previously PCRE gave a match.\n\n10. More internal refactoring has drastically reduced the number of recursive\n    calls to match() for possessively repeated groups such as (abc)++ when\n    using pcre_exec().\n\n11. While implementing 10, a number of bugs in the handling of groups were\n    discovered and fixed:\n\n    (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind).\n    (a|)*(?1) gave a compile-time internal error.\n    ((a|)+)+  did not notice that the outer group could match an empty string.\n    (^a|^)+   was not marked as anchored.\n    (.*a|.*)+ was not marked as matching at start or after a newline.\n\n12. Yet more internal refactoring has removed another argument from the match()\n    function. Special calls to this function are now indicated by setting a\n    value in a variable in the \"match data\" data block.\n\n13. Be more explicit in pcre_study() instead of relying on \"default\" for\n    opcodes that mean there is no starting character; this means that when new\n    ones are added and accidentally left out of pcre_study(), testing should\n    pick them up.\n\n14. The -s option of pcretest has been documented for ages as being an old\n    synonym of -m (show memory usage). I have changed it to mean \"force study\n    for every regex\", that is, assume /S for every regex. This is similar to -i\n    and -d etc. It's slightly incompatible, but I'm hoping nobody is still\n    using it. It makes it easier to run collections of tests with and without\n    study enabled, and thereby test pcre_study() more easily. All the standard\n    tests are now run with and without -s (but some patterns can be marked as\n    \"never study\" - see 20 below).\n\n15. When (*ACCEPT) was used in a subpattern that was called recursively, the\n    restoration of the capturing data to the outer values was not happening\n    correctly.\n\n16. If a recursively called subpattern ended with (*ACCEPT) and matched an\n    empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole\n    pattern had matched an empty string, and so incorrectly returned a no\n    match.\n\n17. There was optimizing code for the last branch of non-capturing parentheses,\n    and also for the obeyed branch of a conditional subexpression, which used\n    tail recursion to cut down on stack usage. Unfortunately, now that there is\n    the possibility of (*THEN) occurring in these branches, tail recursion is\n    no longer possible because the return has to be checked for (*THEN). These\n    two optimizations have therefore been removed. [But see 8.20/11 above.]\n\n18. If a pattern containing \\R was studied, it was assumed that \\R always\n    matched two bytes, thus causing the minimum subject length to be\n    incorrectly computed because \\R can also match just one byte.\n\n19. If a pattern containing (*ACCEPT) was studied, the minimum subject length\n    was incorrectly computed.\n\n20. If /S is present twice on a test pattern in pcretest input, it now\n    *disables* studying, thereby overriding the use of -s on the command line\n    (see 14 above). This is necessary for one or two tests to keep the output\n    identical in both cases.\n\n21. When (*ACCEPT) was used in an assertion that matched an empty string and\n    PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion.\n\n22. When an atomic group that contained a capturing parenthesis was\n    successfully matched, but the branch in which it appeared failed, the\n    capturing was not being forgotten if a higher numbered group was later\n    captured. For example, /(?>(a))b|(a)c/ when matching \"ac\" set capturing\n    group 1 to \"a\", when in fact it should be unset. This applied to multi-\n    branched capturing and non-capturing groups, repeated or not, and also to\n    positive assertions (capturing in negative assertions does not happen\n    in PCRE) and also to nested atomic groups.\n\n23. Add the ++ qualifier feature to pcretest, to show the remainder of the\n    subject after a captured substring, to make it easier to tell which of a\n    number of identical substrings has been captured.\n\n24. The way atomic groups are processed by pcre_exec() has been changed so that\n    if they are repeated, backtracking one repetition now resets captured\n    values correctly. For example, if ((?>(a+)b)+aabab) is matched against\n    \"aaaabaaabaabab\" the value of captured group 2 is now correctly recorded as\n    \"aaa\". Previously, it would have been \"a\". As part of this code\n    refactoring, the way recursive calls are handled has also been changed.\n\n25. If an assertion condition captured any substrings, they were not passed\n    back unless some other capturing happened later. For example, if\n    (?(?=(a))a) was matched against \"a\", no capturing was returned.\n\n26. When studying a pattern that contained subroutine calls or assertions,\n    the code for finding the minimum length of a possible match was handling\n    direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where\n    group 1 called group 2 while simultaneously a separate group 2 called group\n    1). A stack overflow occurred in this case. I have fixed this by limiting\n    the recursion depth to 10.\n\n27. Updated RunTest.bat in the distribution to the version supplied by Tom\n    Fortmann. This supports explicit test numbers on the command line, and has\n    argument validation and error reporting.\n\n28. An instance of \\X with an unlimited repeat could fail if at any point the\n    first character it looked at was a mark character.\n\n29. Some minor code refactoring concerning Unicode properties and scripts\n    should reduce the stack requirement of match() slightly.\n\n30. Added the '=' option to pcretest to check the setting of unused capturing\n    slots at the end of the pattern, which are documented as being -1, but are\n    not included in the return count.\n\n31. If \\k was not followed by a braced, angle-bracketed, or quoted name, PCRE\n    compiled something random. Now it gives a compile-time error (as does\n    Perl).\n\n32. A *MARK encountered during the processing of a positive assertion is now\n    recorded and passed back (compatible with Perl).\n\n33. If --only-matching or --colour was set on a pcregrep call whose pattern\n    had alternative anchored branches, the search for a second match in a line\n    was done as if at the line start. Thus, for example, /^01|^02/ incorrectly\n    matched the line \"0102\" twice. The same bug affected patterns that started\n    with a backwards assertion. For example /\\b01|\\b02/ also matched \"0102\"\n    twice.\n\n34. Previously, PCRE did not allow quantification of assertions. However, Perl\n    does, and because of capturing effects, quantifying parenthesized\n    assertions may at times be useful. Quantifiers are now allowed for\n    parenthesized assertions.\n\n35. A minor code tidy in pcre_compile() when checking options for \\R usage.\n\n36. \\g was being checked for fancy things in a character class, when it should\n    just be a literal \"g\".\n\n37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the\n    appearance of a nested POSIX class supersedes an apparent external class.\n    For example, [:a[:digit:]b:] matches \"a\", \"b\", \":\", or a digit. Also,\n    unescaped square brackets may also appear as part of class names. For\n    example, [:a[:abc]b:] gives unknown class \"[:abc]b:]\". PCRE now behaves\n    more like Perl. (But see 8.20/1 above.)\n\n38. PCRE was giving an error for \\N with a braced quantifier such as {1,} (this\n    was because it thought it was \\N{name}, which is not supported).\n\n39. Add minix to OS list not supporting the -S option in pcretest.\n\n40. PCRE tries to detect cases of infinite recursion at compile time, but it\n    cannot analyze patterns in sufficient detail to catch mutual recursions\n    such as ((?1))((?2)). There is now a runtime test that gives an error if a\n    subgroup is called recursively as a subpattern for a second time at the\n    same position in the subject string. In previous releases this might have\n    been caught by the recursion limit, or it might have run out of stack.\n\n41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can\n    happen only once. PCRE was, however incorrectly giving a compile time error\n    \"recursive call could loop indefinitely\" because it cannot analyze the\n    pattern in sufficient detail. The compile time test no longer happens when\n    PCRE is compiling a conditional subpattern, but actual runaway loops are\n    now caught at runtime (see 40 above).\n\n42. It seems that Perl allows any characters other than a closing parenthesis\n    to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE\n    has been changed to be the same.\n\n43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so\n    as not to get warnings when autogen.sh is called. Also changed\n    AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro).\n\n44. To help people who use pcregrep to scan files containing exceedingly long\n    lines, the following changes have been made:\n\n    (a) The default value of the buffer size parameter has been increased from\n        8K to 20K. (The actual buffer used is three times this size.)\n\n    (b) The default can be changed by ./configure --with-pcregrep-bufsize when\n        PCRE is built.\n\n    (c) A --buffer-size=n option has been added to pcregrep, to allow the size\n        to be set at run time.\n\n    (d) Numerical values in pcregrep options can be followed by K or M, for\n        example --buffer-size=50K.\n\n    (e) If a line being scanned overflows pcregrep's buffer, an error is now\n        given and the return code is set to 2.\n\n45. Add a pointer to the latest mark to the callout data block.\n\n46. The pattern /.(*F)/, when applied to \"abc\" with PCRE_PARTIAL_HARD, gave a\n    partial match of an empty string instead of no match. This was specific to\n    the use of \".\".\n\n47. The pattern /f.*/8s, when applied to \"for\" with PCRE_PARTIAL_HARD, gave a\n    complete match instead of a partial match. This bug was dependent on both\n    the PCRE_UTF8 and PCRE_DOTALL options being set.\n\n48. For a pattern such as /\\babc|\\bdef/ pcre_study() was failing to set up the\n    starting byte set, because \\b was not being ignored.\n\n\nVersion 8.12 15-Jan-2011\n------------------------\n\n1.  Fixed some typos in the markup of the man pages, and wrote a script that\n    checks for such things as part of the documentation building process.\n\n2.  On a big-endian 64-bit system, pcregrep did not correctly process the\n    --match-limit and --recursion-limit options (added for 8.11). In\n    particular, this made one of the standard tests fail. (The integer value\n    went into the wrong half of a long int.)\n\n3.  If the --colour option was given to pcregrep with -v (invert match), it\n    did strange things, either producing crazy output, or crashing. It should,\n    of course, ignore a request for colour when reporting lines that do not\n    match.\n\n4.  Another pcregrep bug caused similar problems if --colour was specified with\n    -M (multiline) and the pattern match finished with a line ending.\n\n5.  In pcregrep, when a pattern that ended with a literal newline sequence was\n    matched in multiline mode, the following line was shown as part of the\n    match. This seems wrong, so I have changed it.\n\n6.  Another pcregrep bug in multiline mode, when --colour was specified, caused\n    the check for further matches in the same line (so they could be coloured)\n    to overrun the end of the current line. If another match was found, it was\n    incorrectly shown (and then shown again when found in the next line).\n\n7.  If pcregrep was compiled under Windows, there was a reference to the\n    function pcregrep_exit() before it was defined. I am assuming this was\n    the cause of the \"error C2371: 'pcregrep_exit' : redefinition;\" that was\n    reported by a user. I've moved the definition above the reference.\n\n\nVersion 8.11 10-Dec-2010\n------------------------\n\n1.  (*THEN) was not working properly if there were untried alternatives prior\n    to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it\n    backtracked to try for \"b\" instead of moving to the next alternative branch\n    at the same level (in this case, to look for \"c\"). The Perl documentation\n    is clear that when (*THEN) is backtracked onto, it goes to the \"next\n    alternative in the innermost enclosing group\".\n\n2.  (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern\n    such as   (A(*COMMIT)B(*THEN)C|D)  any failure after matching A should\n    result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and\n    (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides\n    (*THEN).\n\n3.  If \\s appeared in a character class, it removed the VT character from\n    the class, even if it had been included by some previous item, for example\n    in [\\x00-\\xff\\s]. (This was a bug related to the fact that VT is not part\n    of \\s, but is part of the POSIX \"space\" class.)\n\n4.  A partial match never returns an empty string (because you can always\n    match an empty string at the end of the subject); however the checking for\n    an empty string was starting at the \"start of match\" point. This has been\n    changed to the \"earliest inspected character\" point, because the returned\n    data for a partial match starts at this character. This means that, for\n    example, /(?<=abc)def/ gives a partial match for the subject \"abc\"\n    (previously it gave \"no match\").\n\n5.  Changes have been made to the way PCRE_PARTIAL_HARD affects the matching\n    of $, \\z, \\Z, \\b, and \\B. If the match point is at the end of the string,\n    previously a full match would be given. However, setting PCRE_PARTIAL_HARD\n    has an implication that the given string is incomplete (because a partial\n    match is preferred over a full match). For this reason, these items now\n    give a partial match in this situation. [Aside: previously, the one case\n    /t\\b/ matched against \"cat\" with PCRE_PARTIAL_HARD set did return a partial\n    match rather than a full match, which was wrong by the old rules, but is\n    now correct.]\n\n6.  There was a bug in the handling of #-introduced comments, recognized when\n    PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set.\n    If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose\n    UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when\n    scanning for the end of the comment. (*Character* 0x85 is an \"any\" newline,\n    but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several\n    places in pcre_compile().\n\n7.  Related to (6) above, when pcre_compile() was skipping #-introduced\n    comments when looking ahead for named forward references to subpatterns,\n    the only newline sequence it recognized was NL. It now handles newlines\n    according to the set newline convention.\n\n8.  SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the\n    former, but used strtoul(), whereas pcretest avoided strtoul() but did not\n    cater for a lack of strerror(). These oversights have been fixed.\n\n9.  Added --match-limit and --recursion-limit to pcregrep.\n\n10. Added two casts needed to build with Visual Studio when NO_RECURSE is set.\n\n11. When the -o option was used, pcregrep was setting a return code of 1, even\n    when matches were found, and --line-buffered was not being honoured.\n\n12. Added an optional parentheses number to the -o and --only-matching options\n    of pcregrep.\n\n13. Imitating Perl's /g action for multiple matches is tricky when the pattern\n    can match an empty string. The code to do it in pcretest and pcredemo\n    needed fixing:\n\n    (a) When the newline convention was \"crlf\", pcretest got it wrong, skipping\n        only one byte after an empty string match just before CRLF (this case\n        just got forgotten; \"any\" and \"anycrlf\" were OK).\n\n    (b) The pcretest code also had a bug, causing it to loop forever in UTF-8\n        mode when an empty string match preceded an ASCII character followed by\n        a non-ASCII character. (The code for advancing by one character rather\n        than one byte was nonsense.)\n\n    (c) The pcredemo.c sample program did not have any code at all to handle\n        the cases when CRLF is a valid newline sequence.\n\n14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given\n    as a starting offset was within the subject string. There is now a new\n    error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is\n    negative or greater than the length of the string. In order to test this,\n    pcretest is extended to allow the setting of negative starting offsets.\n\n15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the\n    starting offset points to the beginning of a UTF-8 character was\n    unnecessarily clumsy. I tidied it up.\n\n16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a\n    bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.\n\n17. Nobody had reported that the --include_dir option, which was added in\n    release 7.7 should have been called --include-dir (hyphen, not underscore)\n    for compatibility with GNU grep. I have changed it to --include-dir, but\n    left --include_dir as an undocumented synonym, and the same for\n    --exclude-dir, though that is not available in GNU grep, at least as of\n    release 2.5.4.\n\n18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8\n    characters from a string of bytes) have been redefined so as not to use\n    loops, in order to improve performance in some environments. At the same\n    time, I abstracted some of the common code into auxiliary macros to save\n    repetition (this should not affect the compiled code).\n\n19. If \\c was followed by a multibyte UTF-8 character, bad things happened. A\n    compile-time error is now given if \\c is not followed by an ASCII\n    character, that is, a byte less than 128. (In EBCDIC mode, the code is\n    different, and any byte value is allowed.)\n\n20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_\n    START_OPTIMIZE option, which is now allowed at compile time - but just\n    passed through to pcre_exec() or pcre_dfa_exec(). This makes it available\n    to pcregrep and other applications that have no direct access to PCRE\n    options. The new /Y option in pcretest sets this option when calling\n    pcre_compile().\n\n21. Change 18 of release 8.01 broke the use of named subpatterns for recursive\n    back references. Groups containing recursive back references were forced to\n    be atomic by that change, but in the case of named groups, the amount of\n    memory required was incorrectly computed, leading to \"Failed: internal\n    error: code overflow\". This has been fixed.\n\n22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and\n    pcretest.c, to avoid build problems in some Borland environments.\n\n\nVersion 8.10 25-Jun-2010\n------------------------\n\n1.  Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and\n    THEN.\n\n2.  (*ACCEPT) was not working when inside an atomic group.\n\n3.  Inside a character class, \\B is treated as a literal by default, but\n    faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option\n    causes the error). The code is unchanged, but I tidied the documentation.\n\n4.  Inside a character class, PCRE always treated \\R and \\X as literals,\n    whereas Perl faults them if its -w option is set. I have changed PCRE so\n    that it faults them when PCRE_EXTRA is set.\n\n5.  Added support for \\N, which always matches any character other than\n    newline. (It is the same as \".\" when PCRE_DOTALL is not set.)\n\n6.  When compiling pcregrep with newer versions of gcc which may have\n    FORTIFY_SOURCE set, several warnings \"ignoring return value of 'fwrite',\n    declared with attribute warn_unused_result\" were given. Just casting the\n    result to (void) does not stop the warnings; a more elaborate fudge is\n    needed. I've used a macro to implement this.\n\n7.  Minor change to pcretest.c to avoid a compiler warning.\n\n8.  Added four artifical Unicode properties to help with an option to make\n    \\s etc use properties (see next item). The new properties are: Xan\n    (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word).\n\n9.  Added PCRE_UCP to make \\b, \\d, \\s, \\w, and certain POSIX character classes\n    use Unicode properties. (*UCP) at the start of a pattern can be used to set\n    this option. Modified pcretest to add /W to test this facility. Added\n    REG_UCP to make it available via the POSIX interface.\n\n10. Added --line-buffered to pcregrep.\n\n11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was\n    studied, and the match started with a letter with a code point greater than\n    127 whose first byte was different to the first byte of the other case of\n    the letter, the other case of this starting letter was not recognized\n    (#976).\n\n12. If a pattern that was studied started with a repeated Unicode property\n    test, for example, \\p{Nd}+, there was the theoretical possibility of\n    setting up an incorrect bitmap of starting bytes, but fortunately it could\n    not have actually happened in practice until change 8 above was made (it\n    added property types that matched character-matching opcodes).\n\n13. pcre_study() now recognizes \\h, \\v, and \\R when constructing a bit map of\n    possible starting bytes for non-anchored patterns.\n\n14. Extended the \"auto-possessify\" feature of pcre_compile(). It now recognizes\n    \\R, and also a number of cases that involve Unicode properties, both\n    explicit and implicit when PCRE_UCP is set.\n\n15. If a repeated Unicode property match (e.g. \\p{Lu}*) was used with non-UTF-8\n    input, it could crash or give wrong results if characters with values\n    greater than 0xc0 were present in the subject string. (Detail: it assumed\n    UTF-8 input when processing these items.)\n\n16. Added a lot of (int) casts to avoid compiler warnings in systems where\n    size_t is 64-bit (#991).\n\n17. Added a check for running out of memory when PCRE is compiled with\n    --disable-stack-for-recursion (#990).\n\n18. If the last data line in a file for pcretest does not have a newline on\n    the end, a newline was missing in the output.\n\n19. The default pcre_chartables.c file recognizes only ASCII characters (values\n    less than 128) in its various bitmaps. However, there is a facility for\n    generating tables according to the current locale when PCRE is compiled. It\n    turns out that in some environments, 0x85 and 0xa0, which are Unicode space\n    characters, are recognized by isspace() and therefore were getting set in\n    these tables, and indeed these tables seem to approximate to ISO 8859. This\n    caused a problem in UTF-8 mode when pcre_study() was used to create a list\n    of bytes that can start a match. For \\s, it was including 0x85 and 0xa0,\n    which of course cannot start UTF-8 characters. I have changed the code so\n    that only real ASCII characters (less than 128) and the correct starting\n    bytes for UTF-8 encodings are set for characters greater than 127 when in\n    UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different\n    altogether.)\n\n20. Added the /T option to pcretest so as to be able to run tests with non-\n    standard character tables, thus making it possible to include the tests\n    used for 19 above in the standard set of tests.\n\n21. A pattern such as (?&t)(?#()(?(DEFINE)(?<t>a)) which has a forward\n    reference to a subpattern the other side of a comment that contains an\n    opening parenthesis caused either an internal compiling error, or a\n    reference to the wrong subpattern.\n\n\nVersion 8.02 19-Mar-2010\n------------------------\n\n1.  The Unicode data tables have been updated to Unicode 5.2.0.\n\n2.  Added the option --libs-cpp to pcre-config, but only when C++ support is\n    configured.\n\n3.  Updated the licensing terms in the pcregexp.pas file, as agreed with the\n    original author of that file, following a query about its status.\n\n4.  On systems that do not have stdint.h (e.g. Solaris), check for and include\n    inttypes.h instead. This fixes a bug that was introduced by change 8.01/8.\n\n5.  A pattern such as (?&t)*+(?(DEFINE)(?<t>.)) which has a possessive\n    quantifier applied to a forward-referencing subroutine call, could compile\n    incorrect code or give the error \"internal error: previously-checked\n    referenced subpattern not found\".\n\n6.  Both MS Visual Studio and Symbian OS have problems with initializing\n    variables to point to external functions. For these systems, therefore,\n    pcre_malloc etc. are now initialized to local functions that call the\n    relevant global functions.\n\n7.  There were two entries missing in the vectors called coptable and poptable\n    in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors.\n    I've fixed the data, and added a kludgy way of testing at compile time that\n    the lengths are correct (equal to the number of opcodes).\n\n8.  Following on from 7, I added a similar kludge to check the length of the\n    eint vector in pcreposix.c.\n\n9.  Error texts for pcre_compile() are held as one long string to avoid too\n    much relocation at load time. To find a text, the string is searched,\n    counting zeros. There was no check for running off the end of the string,\n    which could happen if a new error number was added without updating the\n    string.\n\n10. \\K gave a compile-time error if it appeared in a lookbehind assersion.\n\n11. \\K was not working if it appeared in an atomic group or in a group that\n    was called as a \"subroutine\", or in an assertion. Perl 5.11 documents that\n    \\K is \"not well defined\" if used in an assertion. PCRE now accepts it if\n    the assertion is positive, but not if it is negative.\n\n12. Change 11 fortuitously reduced the size of the stack frame used in the\n    \"match()\" function of pcre_exec.c by one pointer. Forthcoming\n    implementation of support for (*MARK) will need an extra pointer on the\n    stack; I have reserved it now, so that the stack frame size does not\n    decrease.\n\n13. A pattern such as (?P<L1>(?P<L2>0)|(?P>L2)(?P>L1)) in which the only other\n    item in branch that calls a recursion is a subroutine call - as in the\n    second branch in the above example - was incorrectly given the compile-\n    time error \"recursive call could loop indefinitely\" because pcre_compile()\n    was not correctly checking the subroutine for matching a non-empty string.\n\n14. The checks for overrunning compiling workspace could trigger after an\n    overrun had occurred. This is a \"should never occur\" error, but it can be\n    triggered by pathological patterns such as hundreds of nested parentheses.\n    The checks now trigger 100 bytes before the end of the workspace.\n\n15. Fix typo in configure.ac: \"srtoq\" should be \"strtoq\".\n\n\nVersion 8.01 19-Jan-2010\n------------------------\n\n1.  If a pattern contained a conditional subpattern with only one branch (in\n    particular, this includes all (*DEFINE) patterns), a call to pcre_study()\n    computed the wrong minimum data length (which is of course zero for such\n    subpatterns). This could cause incorrect \"no match\" results.\n\n2.  For patterns such as (?i)a(?-i)b|c where an option setting at the start of\n    the pattern is reset in the first branch, pcre_compile() failed with\n    \"internal error: code overflow at offset...\". This happened only when\n    the reset was to the original external option setting. (An optimization\n    abstracts leading options settings into an external setting, which was the\n    cause of this.)\n\n3.  A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one\n    of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the\n    assertion pattern did not match (meaning that the assertion was true), it\n    was incorrectly treated as false if the SKIP had been reached during the\n    matching. This also applied to assertions used as conditions.\n\n4.  If an item that is not supported by pcre_dfa_exec() was encountered in an\n    assertion subpattern, including such a pattern used as a condition,\n    unpredictable results occurred, instead of the error return\n    PCRE_ERROR_DFA_UITEM.\n\n5.  The C++ GlobalReplace function was not working like Perl for the special\n    situation when an empty string is matched. It now does the fancy magic\n    stuff that is necessary.\n\n6.  In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been\n    removed. (These were left over from very, very early versions of PCRE.)\n\n7.  Some cosmetic changes to the code to make life easier when compiling it\n    as part of something else:\n\n    (a) Change DEBUG to PCRE_DEBUG.\n\n    (b) In pcre_compile(), rename the member of the \"branch_chain\" structure\n        called \"current\" as \"current_branch\", to prevent a collision with the\n        Linux macro when compiled as a kernel module.\n\n    (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to\n        prevent a collision with the Linux macro when compiled as a kernel\n        module.\n\n8.  In pcre_compile() there are some checks for integer overflows that used to\n    cast potentially large values to (double). This has been changed to that\n    when building, a check for int64_t is made, and if it is found, it is used\n    instead, thus avoiding the use of floating point arithmetic. (There is no\n    other use of FP in PCRE.) If int64_t is not found, the fallback is to\n    double.\n\n9.  Added two casts to avoid signed/unsigned warnings from VS Studio Express\n    2005 (difference between two addresses compared to an unsigned value).\n\n10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a\n    custom one, because of the following reported problem in Windows:\n\n      - libbz2 uses the Pascal calling convention (WINAPI) for the functions\n          under Win32.\n      - The standard autoconf AC_CHECK_LIB fails to include \"bzlib.h\",\n          therefore missing the function definition.\n      - The compiler thus generates a \"C\" signature for the test function.\n      - The linker fails to find the \"C\" function.\n      - PCRE fails to configure if asked to do so against libbz2.\n\n11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these\n    messages were output:\n\n      Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and\n      rerunning libtoolize, to keep the correct libtool macros in-tree.\n      Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.\n\n    I have done both of these things.\n\n12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec()\n    most of the time, it *can* run out if it is given a pattern that contains a\n    runaway infinite recursion. I updated the discussion in the pcrestack man\n    page.\n\n13. Now that we have gone to the x.xx style of version numbers, the minor\n    version may start with zero. Using 08 or 09 is a bad idea because users\n    might check the value of PCRE_MINOR in their code, and 08 or 09 may be\n    interpreted as invalid octal numbers. I've updated the previous comment in\n    configure.ac, and also added a check that gives an error if 08 or 09 are\n    used.\n\n14. Change 8.00/11 was not quite complete: code had been accidentally omitted,\n    causing partial matching to fail when the end of the subject matched \\W\n    in a UTF-8 pattern where \\W was quantified with a minimum of 3.\n\n15. There were some discrepancies between the declarations in pcre_internal.h\n    of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and\n    their definitions. The declarations used \"const uschar *\" and the\n    definitions used USPTR. Even though USPTR is normally defined as \"const\n    unsigned char *\" (and uschar is typedeffed as \"unsigned char\"), it was\n    reported that: \"This difference in casting confuses some C++ compilers, for\n    example, SunCC recognizes above declarations as different functions and\n    generates broken code for hbpcre.\" I have changed the declarations to use\n    USPTR.\n\n16. GNU libtool is named differently on some systems. The autogen.sh script now\n    tries several variants such as glibtoolize (MacOSX) and libtoolize1x\n    (FreeBSD).\n\n17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00\n    (strtoXX undefined when compiling pcrecpp.cc). The patch contains this\n    comment: \"Figure out how to create a longlong from a string: strtoll and\n    equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for\n    instance, but it only takes 2 args instead of 3!\"\n\n18. A subtle bug concerned with back references has been fixed by a change of\n    specification, with a corresponding code fix. A pattern such as\n    ^(xa|=?\\1a)+$ which contains a back reference inside the group to which it\n    refers, was giving matches when it shouldn't. For example, xa=xaaa would\n    match that pattern. Interestingly, Perl (at least up to 5.11.3) has the\n    same bug. Such groups have to be quantified to be useful, or contained\n    inside another quantified group. (If there's no repetition, the reference\n    can never match.) The problem arises because, having left the group and\n    moved on to the rest of the pattern, a later failure that backtracks into\n    the group uses the captured value from the final iteration of the group\n    rather than the correct earlier one. I have fixed this in PCRE by forcing\n    any group that contains a reference to itself to be an atomic group; that\n    is, there cannot be any backtracking into it once it has completed. This is\n    similar to recursive and subroutine calls.\n\n\nVersion 8.00 19-Oct-09\n----------------------\n\n1.  The table for translating pcre_compile() error codes into POSIX error codes\n    was out-of-date, and there was no check on the pcre_compile() error code\n    being within the table. This could lead to an OK return being given in\n    error.\n\n2.  Changed the call to open a subject file in pcregrep from fopen(pathname,\n    \"r\") to fopen(pathname, \"rb\"), which fixed a problem with some of the tests\n    in a Windows environment.\n\n3.  The pcregrep --count option prints the count for each file even when it is\n    zero, as does GNU grep. However, pcregrep was also printing all files when\n    --files-with-matches was added. Now, when both options are given, it prints\n    counts only for those files that have at least one match. (GNU grep just\n    prints the file name in this circumstance, but including the count seems\n    more useful - otherwise, why use --count?) Also ensured that the\n    combination -clh just lists non-zero counts, with no names.\n\n4.  The long form of the pcregrep -F option was incorrectly implemented as\n    --fixed_strings instead of --fixed-strings. This is an incompatible change,\n    but it seems right to fix it, and I didn't think it was worth preserving\n    the old behaviour.\n\n5.  The command line items --regex=pattern and --regexp=pattern were not\n    recognized by pcregrep, which required --regex pattern or --regexp pattern\n    (with a space rather than an '='). The man page documented the '=' forms,\n    which are compatible with GNU grep; these now work.\n\n6.  No libpcreposix.pc file was created for pkg-config; there was just\n    libpcre.pc and libpcrecpp.pc. The omission has been rectified.\n\n7.  Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size\n    when UCP support is not needed, by modifying the Python script that\n    generates it from Unicode data files. This should not matter if the module\n    is correctly used as a library, but I received one complaint about 50K of\n    unwanted data. My guess is that the person linked everything into his\n    program rather than using a library. Anyway, it does no harm.\n\n8.  A pattern such as /\\x{123}{2,2}+/8 was incorrectly compiled; the trigger\n    was a minimum greater than 1 for a wide character in a possessive\n    repetition. The same bug could also affect patterns like /(\\x{ff}{0,2})*/8\n    which had an unlimited repeat of a nested, fixed maximum repeat of a wide\n    character. Chaos in the form of incorrect output or a compiling loop could\n    result.\n\n9.  The restrictions on what a pattern can contain when partial matching is\n    requested for pcre_exec() have been removed. All patterns can now be\n    partially matched by this function. In addition, if there are at least two\n    slots in the offset vector, the offset of the earliest inspected character\n    for the match and the offset of the end of the subject are set in them when\n    PCRE_ERROR_PARTIAL is returned.\n\n10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is\n    synonymous with PCRE_PARTIAL, for backwards compatibility, and\n    PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match,\n    and may be more useful for multi-segment matching.\n\n11. Partial matching with pcre_exec() is now more intuitive. A partial match\n    used to be given if ever the end of the subject was reached; now it is\n    given only if matching could not proceed because another character was\n    needed. This makes a difference in some odd cases such as Z(*FAIL) with the\n    string \"Z\", which now yields \"no match\" instead of \"partial match\". In the\n    case of pcre_dfa_exec(), \"no match\" is given if every matching path for the\n    final character ended with (*FAIL).\n\n12. Restarting a match using pcre_dfa_exec() after a partial match did not work\n    if the pattern had a \"must contain\" character that was already found in the\n    earlier partial match, unless partial matching was again requested. For\n    example, with the pattern /dog.(body)?/, the \"must contain\" character is\n    \"g\". If the first part-match was for the string \"dog\", restarting with\n    \"sbody\" failed. This bug has been fixed.\n\n13. The string returned by pcre_dfa_exec() after a partial match has been\n    changed so that it starts at the first inspected character rather than the\n    first character of the match. This makes a difference only if the pattern\n    starts with a lookbehind assertion or \\b or \\B (\\K is not supported by\n    pcre_dfa_exec()). It's an incompatible change, but it makes the two\n    matching functions compatible, and I think it's the right thing to do.\n\n14. Added a pcredemo man page, created automatically from the pcredemo.c file,\n    so that the demonstration program is easily available in environments where\n    PCRE has not been installed from source.\n\n15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp,\n    libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared\n    library.\n\n16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user.\n    It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it\n    is not the first non-POSIX option to be added. Clearly some people find\n    these options useful.\n\n17. If a caller to the POSIX matching function regexec() passes a non-zero\n    value for nmatch with a NULL value for pmatch, the value of\n    nmatch is forced to zero.\n\n18. RunGrepTest did not have a test for the availability of the -u option of\n    the diff command, as RunTest does. It now checks in the same way as\n    RunTest, and also checks for the -b option.\n\n19. If an odd number of negated classes containing just a single character\n    interposed, within parentheses, between a forward reference to a named\n    subpattern and the definition of the subpattern, compilation crashed with\n    an internal error, complaining that it could not find the referenced\n    subpattern. An example of a crashing pattern is /(?&A)(([^m])(?<A>))/.\n    [The bug was that it was starting one character too far in when skipping\n    over the character class, thus treating the ] as data rather than\n    terminating the class. This meant it could skip too much.]\n\n20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the\n    /g option in pcretest when the pattern contains \\K, which makes it possible\n    to have an empty string match not at the start, even when the pattern is\n    anchored. Updated pcretest and pcredemo to use this option.\n\n21. If the maximum number of capturing subpatterns in a recursion was greater\n    than the maximum at the outer level, the higher number was returned, but\n    with unset values at the outer level. The correct (outer level) value is\n    now given.\n\n22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of\n    PCRE did not set those parentheses (unlike Perl). I have now found a way to\n    make it do so. The string so far is captured, making this feature\n    compatible with Perl.\n\n23. The tests have been re-organized, adding tests 11 and 12, to make it\n    possible to check the Perl 5.10 features against Perl 5.10.\n\n24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine\n    pattern matches a fixed length string. PCRE did not allow this; now it\n    does. Neither allows recursion.\n\n25. I finally figured out how to implement a request to provide the minimum\n    length of subject string that was needed in order to match a given pattern.\n    (It was back references and recursion that I had previously got hung up\n    on.) This code has now been added to pcre_study(); it finds a lower bound\n    to the length of subject needed. It is not necessarily the greatest lower\n    bound, but using it to avoid searching strings that are too short does give\n    some useful speed-ups. The value is available to calling programs via\n    pcre_fullinfo().\n\n26. While implementing 25, I discovered to my embarrassment that pcretest had\n    not been passing the result of pcre_study() to pcre_dfa_exec(), so the\n    study optimizations had never been tested with that matching function.\n    Oops. What is worse, even when it was passed study data, there was a bug in\n    pcre_dfa_exec() that meant it never actually used it. Double oops. There\n    were also very few tests of studied patterns with pcre_dfa_exec().\n\n27. If (?| is used to create subpatterns with duplicate numbers, they are now\n    allowed to have the same name, even if PCRE_DUPNAMES is not set. However,\n    on the other side of the coin, they are no longer allowed to have different\n    names, because these cannot be distinguished in PCRE, and this has caused\n    confusion. (This is a difference from Perl.)\n\n28. When duplicate subpattern names are present (necessarily with different\n    numbers, as required by 27 above), and a test is made by name in a\n    conditional pattern, either for a subpattern having been matched, or for\n    recursion in such a pattern, all the associated numbered subpatterns are\n    tested, and the overall condition is true if the condition is true for any\n    one of them. This is the way Perl works, and is also more like the way\n    testing by number works.\n\n\nVersion 7.9 11-Apr-09\n---------------------\n\n1.  When building with support for bzlib/zlib (pcregrep) and/or readline\n    (pcretest), all targets were linked against these libraries. This included\n    libpcre, libpcreposix, and libpcrecpp, even though they do not use these\n    libraries. This caused unwanted dependencies to be created. This problem\n    has been fixed, and now only pcregrep is linked with bzlib/zlib and only\n    pcretest is linked with readline.\n\n2.  The \"typedef int BOOL\" in pcre_internal.h that was included inside the\n    \"#ifndef FALSE\" condition by an earlier change (probably 7.8/18) has been\n    moved outside it again, because FALSE and TRUE are already defined in AIX,\n    but BOOL is not.\n\n3.  The pcre_config() function was treating the PCRE_MATCH_LIMIT and\n    PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints.\n\n4.  The pcregrep documentation said spaces were inserted as well as colons (or\n    hyphens) following file names and line numbers when outputting matching\n    lines. This is not true; no spaces are inserted. I have also clarified the\n    wording for the --colour (or --color) option.\n\n5.  In pcregrep, when --colour was used with -o, the list of matching strings\n    was not coloured; this is different to GNU grep, so I have changed it to be\n    the same.\n\n6.  When --colo(u)r was used in pcregrep, only the first matching substring in\n    each matching line was coloured. Now it goes on to look for further matches\n    of any of the test patterns, which is the same behaviour as GNU grep.\n\n7.  A pattern that could match an empty string could cause pcregrep to loop; it\n    doesn't make sense to accept an empty string match in pcregrep, so I have\n    locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this\n    seems to be how GNU grep behaves. [But see later change 40 for release\n    8.33.]\n\n8.  The pattern (?(?=.*b)b|^) was incorrectly compiled as \"match must be at\n    start or after a newline\", because the conditional assertion was not being\n    correctly handled. The rule now is that both the assertion and what follows\n    in the first alternative must satisfy the test.\n\n9.  If auto-callout was enabled in a pattern with a conditional group whose\n    condition was an assertion, PCRE could crash during matching, both with\n    pcre_exec() and pcre_dfa_exec().\n\n10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was\n    used for matching.\n\n11. Unicode property support in character classes was not working for\n    characters (bytes) greater than 127 when not in UTF-8 mode.\n\n12. Added the -M command line option to pcretest.\n\n14. Added the non-standard REG_NOTEMPTY option to the POSIX interface.\n\n15. Added the PCRE_NO_START_OPTIMIZE match-time option.\n\n16. Added comments and documentation about mis-use of no_arg in the C++\n    wrapper.\n\n17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch\n    from Martin Jerabek that uses macro names for all relevant character and\n    string constants.\n\n18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and\n    SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without\n    SUPPORT_UTF8, define SUPPORT_UTF8. The \"configure\" script handles both of\n    these, but not everybody uses configure.\n\n19. A conditional group that had only one branch was not being correctly\n    recognized as an item that could match an empty string. This meant that an\n    enclosing group might also not be so recognized, causing infinite looping\n    (and probably a segfault) for patterns such as ^\"((?(?=[a])[^\"])|b)*\"$\n    with the subject \"ab\", where knowledge that the repeated group can match\n    nothing is needed in order to break the loop.\n\n20. If a pattern that was compiled with callouts was matched using pcre_dfa_\n    exec(), but without supplying a callout function, matching went wrong.\n\n21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory\n    leak if the size of the offset vector was greater than 30. When the vector\n    is smaller, the saved offsets during recursion go onto a local stack\n    vector, but for larger vectors malloc() is used. It was failing to free\n    when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other \"abnormal\"\n    error, in fact).\n\n22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the\n    heapframe that is used only when UTF-8 support is enabled. This caused no\n    problem, but was untidy.\n\n23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name\n    CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is\n    included within another project.\n\n24. Steven Van Ingelgem's patches to add more options to the CMake support,\n    slightly modified by me:\n\n      (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including\n          not building pcregrep.\n\n      (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only\n          if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep.\n\n25. Forward references, both numeric and by name, in patterns that made use of\n    duplicate group numbers, could behave incorrectly or give incorrect errors,\n    because when scanning forward to find the reference group, PCRE was not\n    taking into account the duplicate group numbers. A pattern such as\n    ^X(?3)(a)(?|(b)|(q))(Y) is an example.\n\n26. Changed a few more instances of \"const unsigned char *\" to USPTR, making\n    the feature of a custom pointer more persuasive (as requested by a user).\n\n27. Wrapped the definitions of fileno and isatty for Windows, which appear in\n    pcretest.c, inside #ifndefs, because it seems they are sometimes already\n    pre-defined.\n\n28. Added support for (*UTF8) at the start of a pattern.\n\n29. Arrange for flags added by the \"release type\" setting in CMake to be shown\n    in the configuration summary.\n\n\nVersion 7.8 05-Sep-08\n---------------------\n\n1.  Replaced UCP searching code with optimized version as implemented for Ad\n    Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two-\n    stage table and inline lookup instead of a function, giving speed ups of 2\n    to 5 times on some simple patterns that I tested. Permission was given to\n    distribute the MultiStage2.py script that generates the tables (it's not in\n    the tarball, but is in the Subversion repository).\n\n2.  Updated the Unicode datatables to Unicode 5.1.0. This adds yet more\n    scripts.\n\n3.  Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained\n    a group with a zero qualifier. The result of the study could be incorrect,\n    or the function might crash, depending on the pattern.\n\n4.  Caseless matching was not working for non-ASCII characters in back\n    references. For example, /(\\x{de})\\1/8i was not matching \\x{de}\\x{fe}.\n    It now works when Unicode Property Support is available.\n\n5.  In pcretest, an escape such as \\x{de} in the data was always generating\n    a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in\n    non-UTF-8 mode. If the value is greater than 255, it gives a warning about\n    truncation.\n\n6.  Minor bugfix in pcrecpp.cc (change \"\" == ... to NULL == ...).\n\n7.  Added two (int) casts to pcregrep when printing the difference of two\n    pointers, in case they are 64-bit values.\n\n8.  Added comments about Mac OS X stack usage to the pcrestack man page and to\n    test 2 if it fails.\n\n9.  Added PCRE_CALL_CONVENTION just before the names of all exported functions,\n    and a #define of that name to empty if it is not externally set. This is to\n    allow users of MSVC to set it if necessary.\n\n10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from\n    the convenience functions in the pcre_get.c source file.\n\n11. An option change at the start of a pattern that had top-level alternatives\n    could cause overwriting and/or a crash. This command provoked a crash in\n    some environments:\n\n      printf \"/(?i)[\\xc3\\xa9\\xc3\\xbd]|[\\xc3\\xa9\\xc3\\xbdA]/8\\n\" | pcretest\n\n    This potential security problem was recorded as CVE-2008-2371.\n\n12. For a pattern where the match had to start at the beginning or immediately\n    after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and\n    pcre_dfa_exec() could read past the end of the passed subject if there was\n    no match. To help with detecting such bugs (e.g. with valgrind), I modified\n    pcretest so that it places the subject at the end of its malloc-ed buffer.\n\n13. The change to pcretest in 12 above threw up a couple more cases when pcre_\n    exec() might read past the end of the data buffer in UTF-8 mode.\n\n14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and\n    the data contained the byte 0x85 as part of a UTF-8 character within its\n    first line. This applied both to normal and DFA matching.\n\n15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example,\n    /^[^d]*?$/8 failed to match \"abc\".\n\n16. Added a missing copyright notice to pcrecpp_internal.h.\n\n17. Make it more clear in the documentation that values returned from\n    pcre_exec() in ovector are byte offsets, not character counts.\n\n18. Tidied a few places to stop certain compilers from issuing warnings.\n\n19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as\n    supplied by Stefan Weber. I made a further small update for 7.8 because\n    there is a change of source arrangements: the pcre_searchfuncs.c module is\n    replaced by pcre_ucd.c.\n\n\nVersion 7.7 07-May-08\n---------------------\n\n1.  Applied Craig's patch to sort out a long long problem: \"If we can't convert\n    a string to a long long, pretend we don't even have a long long.\" This is\n    done by checking for the strtoq, strtoll, and _strtoi64 functions.\n\n2.  Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with\n    pre-7.6 versions, which defined a global no_arg variable instead of putting\n    it in the RE class. (See also #8 below.)\n\n3.  Remove a line of dead code, identified by coverity and reported by Nuno\n    Lopes.\n\n4.  Fixed two related pcregrep bugs involving -r with --include or --exclude:\n\n    (1) The include/exclude patterns were being applied to the whole pathnames\n        of files, instead of just to the final components.\n\n    (2) If there was more than one level of directory, the subdirectories were\n        skipped unless they satisfied the include/exclude conditions. This is\n        inconsistent with GNU grep (and could even be seen as contrary to the\n        pcregrep specification - which I improved to make it absolutely clear).\n        The action now is always to scan all levels of directory, and just\n        apply the include/exclude patterns to regular files.\n\n5.  Added the --include_dir and --exclude_dir patterns to pcregrep, and used\n    --exclude_dir in the tests to avoid scanning .svn directories.\n\n6.  Applied Craig's patch to the QuoteMeta function so that it escapes the\n    NUL character as backslash + 0 rather than backslash + NUL, because PCRE\n    doesn't support NULs in patterns.\n\n7.  Added some missing \"const\"s to declarations of static tables in\n    pcre_compile.c and pcre_dfa_exec.c.\n\n8.  Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was\n    caused by fix #2  above. (Subsequently also a second patch to fix the\n    first patch. And a third patch - this was a messy problem.)\n\n9.  Applied Craig's patch to remove the use of push_back().\n\n10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX\n    matching function regexec().\n\n11. Added support for the Oniguruma syntax \\g<name>, \\g<n>, \\g'name', \\g'n',\n    which, however, unlike Perl's \\g{...}, are subroutine calls, not back\n    references. PCRE supports relative numbers with this syntax (I don't think\n    Oniguruma does).\n\n12. Previously, a group with a zero repeat such as (...){0} was completely\n    omitted from the compiled regex. However, this means that if the group\n    was called as a subroutine from elsewhere in the pattern, things went wrong\n    (an internal error was given). Such groups are now left in the compiled\n    pattern, with a new opcode that causes them to be skipped at execution\n    time.\n\n13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes\n    to the way PCRE behaves:\n\n    (a) A lone ] character is dis-allowed (Perl treats it as data).\n\n    (b) A back reference to an unmatched subpattern matches an empty string\n        (Perl fails the current match path).\n\n    (c) A data ] in a character class must be notated as \\] because if the\n        first data character in a class is ], it defines an empty class. (In\n        Perl it is not possible to have an empty class.) The empty class []\n        never matches; it forces failure and is equivalent to (*FAIL) or (?!).\n        The negative empty class [^] matches any one character, independently\n        of the DOTALL setting.\n\n14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a\n    non-existent subpattern following a character class starting with ']' and\n    containing () gave an internal compiling error instead of \"reference to\n    non-existent subpattern\". Fortunately, when the pattern did exist, the\n    compiled code was correct. (When scanning forwards to check for the\n    existence of the subpattern, it was treating the data ']' as terminating\n    the class, so got the count wrong. When actually compiling, the reference\n    was subsequently set up correctly.)\n\n15. The \"always fail\" assertion (?!) is optimzed to (*FAIL) by pcre_compile;\n    it was being rejected as not supported by pcre_dfa_exec(), even though\n    other assertions are supported. I have made pcre_dfa_exec() support\n    (*FAIL).\n\n16. The implementation of 13c above involved the invention of a new opcode,\n    OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s\n    cannot be changed at match time, I realized I could make a small\n    improvement to matching performance by compiling OP_ALLANY instead of\n    OP_ANY for \".\" when DOTALL was set, and then removing the runtime tests\n    on the OP_ANY path.\n\n17. Compiling pcretest on Windows with readline support failed without the\n    following two fixes: (1) Make the unistd.h include conditional on\n    HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno.\n\n18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the\n    ncurses library to be included for pcretest when ReadLine support is\n    requested, but also to allow for it to be overridden. This patch came from\n    Daniel Bergstrm.\n\n19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined\n    as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused\n    any errors with the current Unicode tables. Thanks to Peter Kankowski for\n    spotting this.\n\n\nVersion 7.6 28-Jan-08\n---------------------\n\n1.  A character class containing a very large number of characters with\n    codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer\n    overflow.\n\n2.  Patch to cut out the \"long long\" test in pcrecpp_unittest when\n    HAVE_LONG_LONG is not defined.\n\n3.  Applied Christian Ehrlicher's patch to update the CMake build files to\n    bring them up to date and include new features. This patch includes:\n\n    - Fixed PH's badly added libz and libbz2 support.\n    - Fixed a problem with static linking.\n    - Added pcredemo. [But later removed - see 7 below.]\n    - Fixed dftables problem and added an option.\n    - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and\n        HAVE_LONG_LONG.\n    - Added readline support for pcretest.\n    - Added an listing of the option settings after cmake has run.\n\n4.  A user submitted a patch to Makefile that makes it easy to create\n    \"pcre.dll\" under mingw when using Configure/Make. I added stuff to\n    Makefile.am that cause it to include this special target, without\n    affecting anything else. Note that the same mingw target plus all\n    the other distribution libraries and programs are now supported\n    when configuring with CMake (see 6 below) instead of with\n    Configure/Make.\n\n5.  Applied Craig's patch that moves no_arg into the RE class in the C++ code.\n    This is an attempt to solve the reported problem \"pcrecpp::no_arg is not\n    exported in the Windows port\". It has not yet been confirmed that the patch\n    solves the problem, but it does no harm.\n\n6.  Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and\n    NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured\n    with CMake, and also correct the comment about stack recursion.\n\n7.  Remove the automatic building of pcredemo from the ./configure system and\n    from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example\n    of a program that users should build themselves after PCRE is installed, so\n    building it automatically is not really right. What is more, it gave\n    trouble in some build environments.\n\n8.  Further tidies to CMakeLists.txt from Sheri and Christian.\n\n\nVersion 7.5 10-Jan-08\n---------------------\n\n1.  Applied a patch from Craig: \"This patch makes it possible to 'ignore'\n    values in parens when parsing an RE using the C++ wrapper.\"\n\n2.  Negative specials like \\S did not work in character classes in UTF-8 mode.\n    Characters greater than 255 were excluded from the class instead of being\n    included.\n\n3.  The same bug as (2) above applied to negated POSIX classes such as\n    [:^space:].\n\n4.  PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it\n    defined or documented. It seems to have been a typo for PCRE_STATIC, so\n    I have changed it.\n\n5.  The construct (?&) was not diagnosed as a syntax error (it referenced the\n    first named subpattern) and a construct such as (?&a) would reference the\n    first named subpattern whose name started with \"a\" (in other words, the\n    length check was missing). Both these problems are fixed. \"Subpattern name\n    expected\" is now given for (?&) (a zero-length name), and this patch also\n    makes it give the same error for \\k'' (previously it complained that that\n    was a reference to a non-existent subpattern).\n\n6.  The erroneous patterns (?+-a) and (?-+a) give different error messages;\n    this is right because (?- can be followed by option settings as well as by\n    digits. I have, however, made the messages clearer.\n\n7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns\n    than the number used in the conditional) now cause a compile-time error.\n    This is actually not compatible with Perl, which accepts such patterns, but\n    treats the conditional as always being FALSE (as PCRE used to), but it\n    seems to me that giving a diagnostic is better.\n\n8.  Change \"alphameric\" to the more common word \"alphanumeric\" in comments\n    and messages.\n\n9.  Fix two occurrences of \"backslash\" in comments that should have been\n    \"backspace\".\n\n10. Remove two redundant lines of code that can never be obeyed (their function\n    was moved elsewhere).\n\n11. The program that makes PCRE's Unicode character property table had a bug\n    which caused it to generate incorrect table entries for sequences of\n    characters that have the same character type, but are in different scripts.\n    It amalgamated them into a single range, with the script of the first of\n    them. In other words, some characters were in the wrong script. There were\n    thirteen such cases, affecting characters in the following ranges:\n\n      U+002b0 - U+002c1\n      U+0060c - U+0060d\n      U+0061e - U+00612\n      U+0064b - U+0065e\n      U+0074d - U+0076d\n      U+01800 - U+01805\n      U+01d00 - U+01d77\n      U+01d9b - U+01dbf\n      U+0200b - U+0200f\n      U+030fc - U+030fe\n      U+03260 - U+0327f\n      U+0fb46 - U+0fbb1\n      U+10450 - U+1049d\n\n12. The -o option (show only the matching part of a line) for pcregrep was not\n    compatible with GNU grep in that, if there was more than one match in a\n    line, it showed only the first of them. It now behaves in the same way as\n    GNU grep.\n\n13. If the -o and -v options were combined for pcregrep, it printed a blank\n    line for every non-matching line. GNU grep prints nothing, and pcregrep now\n    does the same. The return code can be used to tell if there were any\n    non-matching lines.\n\n14. Added --file-offsets and --line-offsets to pcregrep.\n\n15. The pattern (?=something)(?R) was not being diagnosed as a potentially\n    infinitely looping recursion. The bug was that positive lookaheads were not\n    being skipped when checking for a possible empty match (negative lookaheads\n    and both kinds of lookbehind were skipped).\n\n16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the\n    inclusion of <windows.h> to before rather than after the definition of\n    INVALID_FILE_ATTRIBUTES (patch from David Byron).\n\n17. Specifying a possessive quantifier with a specific limit for a Unicode\n    character property caused pcre_compile() to compile bad code, which led at\n    runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this\n    are: /\\p{Zl}{2,3}+/8 and /\\p{Cc}{2}+/8. It was the possessive \"+\" that\n    caused the error; without that there was no problem.\n\n18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2.\n\n19. Added --enable-pcretest-libreadline.\n\n20. In pcrecpp.cc, the variable 'count' was incremented twice in\n    RE::GlobalReplace(). As a result, the number of replacements returned was\n    double what it should be. I removed one of the increments, but Craig sent a\n    later patch that removed the other one (the right fix) and added unit tests\n    that check the return values (which was not done before).\n\n21. Several CMake things:\n\n    (1) Arranged that, when cmake is used on Unix, the libraries end up with\n        the names libpcre and libpcreposix, not just pcre and pcreposix.\n\n    (2) The above change means that pcretest and pcregrep are now correctly\n        linked with the newly-built libraries, not previously installed ones.\n\n    (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2.\n\n22. In UTF-8 mode, with newline set to \"any\", a pattern such as .*a.*=.b.*\n    crashed when matching a string such as a\\x{2029}b (note that \\x{2029} is a\n    UTF-8 newline character). The key issue is that the pattern starts .*;\n    this means that the match must be either at the beginning, or after a\n    newline. The bug was in the code for advancing after a failed match and\n    checking that the new position followed a newline. It was not taking\n    account of UTF-8 characters correctly.\n\n23. PCRE was behaving differently from Perl in the way it recognized POSIX\n    character classes. PCRE was not treating the sequence [:...:] as a\n    character class unless the ... were all letters. Perl, however, seems to\n    allow any characters between [: and :], though of course it rejects as\n    unknown any \"names\" that contain non-letters, because all the known class\n    names consist only of letters. Thus, Perl gives an error for [[:1234:]],\n    for example, whereas PCRE did not - it did not recognize a POSIX character\n    class. This seemed a bit dangerous, so the code has been changed to be\n    closer to Perl. The behaviour is not identical to Perl, because PCRE will\n    diagnose an unknown class for, for example, [[:l\\ower:]] where Perl will\n    treat it as [[:lower:]]. However, PCRE does now give \"unknown\" errors where\n    Perl does, and where it didn't before.\n\n24. Rewrite so as to remove the single use of %n from pcregrep because in some\n    Windows environments %n is disabled by default.\n\n\nVersion 7.4 21-Sep-07\n---------------------\n\n1.  Change 7.3/28 was implemented for classes by looking at the bitmap. This\n    means that a class such as [\\s] counted as \"explicit reference to CR or\n    LF\". That isn't really right - the whole point of the change was to try to\n    help when there was an actual mention of one of the two characters. So now\n    the change happens only if \\r or \\n (or a literal CR or LF) character is\n    encountered.\n\n2.  The 32-bit options word was also used for 6 internal flags, but the numbers\n    of both had grown to the point where there were only 3 bits left.\n    Fortunately, there was spare space in the data structure, and so I have\n    moved the internal flags into a new 16-bit field to free up more option\n    bits.\n\n3.  The appearance of (?J) at the start of a pattern set the DUPNAMES option,\n    but did not set the internal JCHANGED flag - either of these is enough to\n    control the way the \"get\" function works - but the PCRE_INFO_JCHANGED\n    facility is supposed to tell if (?J) was ever used, so now (?J) at the\n    start sets both bits.\n\n4.  Added options (at build time, compile time, exec time) to change \\R from\n    matching any Unicode line ending sequence to just matching CR, LF, or CRLF.\n\n5.  doc/pcresyntax.html was missing from the distribution.\n\n6.  Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward\n    compatibility, even though it is no longer used.\n\n7.  Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and\n    strtoull to pcrecpp.cc to select the available functions in WIN32 when the\n    windows.h file is present (where different names are used). [This was\n    reversed later after testing - see 16 below.]\n\n8.  Changed all #include <config.h> to #include \"config.h\". There were also\n    some further <pcre.h> cases that I changed to \"pcre.h\".\n\n9.  When pcregrep was used with the --colour option, it missed the line ending\n    sequence off the lines that it output.\n\n10. It was pointed out to me that arrays of string pointers cause lots of\n    relocations when a shared library is dynamically loaded. A technique of\n    using a single long string with a table of offsets can drastically reduce\n    these. I have refactored PCRE in four places to do this. The result is\n    dramatic:\n\n      Originally:                          290\n      After changing UCP table:            187\n      After changing error message table:   43\n      After changing table of \"verbs\"       36\n      After changing table of Posix names   22\n\n    Thanks to the folks working on Gregex for glib for this insight.\n\n11. --disable-stack-for-recursion caused compiling to fail unless -enable-\n    unicode-properties was also set.\n\n12. Updated the tests so that they work when \\R is defaulted to ANYCRLF.\n\n13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously\n    checked only for CRLF.\n\n14. Added casts to pcretest.c to avoid compiler warnings.\n\n15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings.\n\n16. Added Craig's patch to remove the WINDOWS_H tests, that were not working,\n    and instead check for _strtoi64 explicitly, and avoid the use of snprintf()\n    entirely. This removes changes made in 7 above.\n\n17. The CMake files have been updated, and there is now more information about\n    building with CMake in the NON-UNIX-USE document.\n\n\nVersion 7.3 28-Aug-07\n---------------------\n\n 1. In the rejigging of the build system that eventually resulted in 7.1, the\n    line \"#include <pcre.h>\" was included in pcre_internal.h. The use of angle\n    brackets there is not right, since it causes compilers to look for an\n    installed pcre.h, not the version that is in the source that is being\n    compiled (which of course may be different). I have changed it back to:\n\n      #include \"pcre.h\"\n\n    I have a vague recollection that the change was concerned with compiling in\n    different directories, but in the new build system, that is taken care of\n    by the VPATH setting the Makefile.\n\n 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed\n    when the subject happened to end in the byte 0x85 (e.g. if the last\n    character was \\x{1ec5}). *Character* 0x85 is one of the \"any\" newline\n    characters but of course it shouldn't be taken as a newline when it is part\n    of another character. The bug was that, for an unlimited repeat of . in\n    not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by\n    characters when looking for a newline.\n\n 3. A small performance improvement in the DOTALL UTF-8 mode .* case.\n\n 4. Debugging: adjusted the names of opcodes for different kinds of parentheses\n    in debug output.\n\n 5. Arrange to use \"%I64d\" instead of \"%lld\" and \"%I64u\" instead of \"%llu\" for\n    long printing in the pcrecpp unittest when running under MinGW.\n\n 6. ESC_K was left out of the EBCDIC table.\n\n 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing\n    parentheses; I made it 1000, which seemed large enough. Unfortunately, the\n    limit also applies to \"virtual nesting\" when a pattern is recursive, and in\n    this case 1000 isn't so big. I have been able to remove this limit at the\n    expense of backing off one optimization in certain circumstances. Normally,\n    when pcre_exec() would call its internal match() function recursively and\n    immediately return the result unconditionally, it uses a \"tail recursion\"\n    feature to save stack. However, when a subpattern that can match an empty\n    string has an unlimited repetition quantifier, it no longer makes this\n    optimization. That gives it a stack frame in which to save the data for\n    checking that an empty string has been matched. Previously this was taken\n    from the 1000-entry workspace that had been reserved. So now there is no\n    explicit limit, but more stack is used.\n\n 8. Applied Daniel's patches to solve problems with the import/export magic\n    syntax that is required for Windows, and which was going wrong for the\n    pcreposix and pcrecpp parts of the library. These were overlooked when this\n    problem was solved for the main library.\n\n 9. There were some crude static tests to avoid integer overflow when computing\n    the size of patterns that contain repeated groups with explicit upper\n    limits. As the maximum quantifier is 65535, the maximum group length was\n    set at 30,000 so that the product of these two numbers did not overflow a\n    32-bit integer. However, it turns out that people want to use groups that\n    are longer than 30,000 bytes (though not repeat them that many times).\n    Change 7.0/17 (the refactoring of the way the pattern size is computed) has\n    made it possible to implement the integer overflow checks in a much more\n    dynamic way, which I have now done. The artificial limitation on group\n    length has been removed - we now have only the limit on the total length of\n    the compiled pattern, which depends on the LINK_SIZE setting.\n\n10. Fixed a bug in the documentation for get/copy named substring when\n    duplicate names are permitted. If none of the named substrings are set, the\n    functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an\n    empty string.\n\n11. Because Perl interprets \\Q...\\E at a high level, and ignores orphan \\E\n    instances, patterns such as [\\Q\\E] or [\\E] or even [^\\E] cause an error,\n    because the ] is interpreted as the first data character and the\n    terminating ] is not found. PCRE has been made compatible with Perl in this\n    regard. Previously, it interpreted [\\Q\\E] as an empty class, and [\\E] could\n    cause memory overwriting.\n\n10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty\n    string has been matched (to stop an infinite loop). It was not recognizing\n    a conditional subpattern that could match an empty string if that\n    subpattern was within another subpattern. For example, it looped when\n    trying to match  (((?(1)X|))*)  but it was OK with  ((?(1)X|)*)  where the\n    condition was not nested. This bug has been fixed.\n\n12. A pattern like \\X?\\d or \\P{L}?\\d in non-UTF-8 mode could cause a backtrack\n    past the start of the subject in the presence of bytes with the top bit\n    set, for example \"\\x8aBCD\".\n\n13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE),\n    (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT).\n\n14. Optimized (?!) to (*FAIL).\n\n15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629.\n    This restricts code points to be within the range 0 to 0x10FFFF, excluding\n    the \"low surrogate\" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the\n    full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still\n    does: it's just the validity check that is more restrictive.\n\n16. Inserted checks for integer overflows during escape sequence (backslash)\n    processing, and also fixed erroneous offset values for syntax errors during\n    backslash processing.\n\n17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above)\n    for patterns like [\\PPP\\x8a]{1,}\\x80 with the subject \"A\\x80\".\n\n18. An unterminated class in a pattern like (?1)\\c[ with a \"forward reference\"\n    caused an overrun.\n\n19. A pattern like (?:[\\PPa*]*){8,} which had an \"extended class\" (one with\n    something other than just ASCII characters) inside a group that had an\n    unlimited repeat caused a loop at compile time (while checking to see\n    whether the group could match an empty string).\n\n20. Debugging a pattern containing \\p or \\P could cause a crash. For example,\n    [\\P{Any}] did so. (Error in the code for printing property names.)\n\n21. An orphan \\E inside a character class could cause a crash.\n\n22. A repeated capturing bracket such as (A)? could cause a wild memory\n    reference during compilation.\n\n23. There are several functions in pcre_compile() that scan along a compiled\n    expression for various reasons (e.g. to see if it's fixed length for look\n    behind). There were bugs in these functions when a repeated \\p or \\P was\n    present in the pattern. These operators have additional parameters compared\n    with \\d, etc, and these were not being taken into account when moving along\n    the compiled data. Specifically:\n\n    (a) A item such as \\p{Yi}{3} in a lookbehind was not treated as fixed\n        length.\n\n    (b) An item such as \\pL+ within a repeated group could cause crashes or\n        loops.\n\n    (c) A pattern such as \\p{Yi}+(\\P{Yi}+)(?1) could give an incorrect\n        \"reference to non-existent subpattern\" error.\n\n    (d) A pattern like (\\P{Yi}{2}\\277)? could loop at compile time.\n\n24. A repeated \\S or \\W in UTF-8 mode could give wrong answers when multibyte\n    characters were involved (for example /\\S{2}/8g with \"A\\x{a3}BC\").\n\n25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop.\n\n26. Patterns such as [\\P{Yi}A] which include \\p or \\P and just one other\n    character were causing crashes (broken optimization).\n\n27. Patterns such as (\\P{Yi}*\\277)* (group with possible zero repeat containing\n    \\p or \\P) caused a compile-time loop.\n\n28. More problems have arisen in unanchored patterns when CRLF is a valid line\n    break. For example, the unstudied pattern [\\r\\n]A does not match the string\n    \"\\r\\nA\" because change 7.0/46 below moves the current point on by two\n    characters after failing to match at the start. However, the pattern \\nA\n    *does* match, because it doesn't start till \\n, and if [\\r\\n]A is studied,\n    the same is true. There doesn't seem any very clean way out of this, but\n    what I have chosen to do makes the common cases work: PCRE now takes note\n    of whether there can be an explicit match for \\r or \\n anywhere in the\n    pattern, and if so, 7.0/46 no longer applies. As part of this change,\n    there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled\n    pattern has explicit CR or LF references.\n\n29. Added (*CR) etc for changing newline setting at start of pattern.\n\n\nVersion 7.2 19-Jun-07\n---------------------\n\n 1. If the fr_FR locale cannot be found for test 3, try the \"french\" locale,\n    which is apparently normally available under Windows.\n\n 2. Re-jig the pcregrep tests with different newline settings in an attempt\n    to make them independent of the local environment's newline setting.\n\n 3. Add code to configure.ac to remove -g from the CFLAGS default settings.\n\n 4. Some of the \"internals\" tests were previously cut out when the link size\n    was not 2, because the output contained actual offsets. The recent new\n    \"Z\" feature of pcretest means that these can be cut out, making the tests\n    usable with all link sizes.\n\n 5. Implemented Stan Switzer's goto replacement for longjmp() when not using\n    stack recursion. This gives a massive performance boost under BSD, but just\n    a small improvement under Linux. However, it saves one field in the frame\n    in all cases.\n\n 6. Added more features from the forthcoming Perl 5.10:\n\n    (a) (?-n) (where n is a string of digits) is a relative subroutine or\n        recursion call. It refers to the nth most recently opened parentheses.\n\n    (b) (?+n) is also a relative subroutine call; it refers to the nth next\n        to be opened parentheses.\n\n    (c) Conditions that refer to capturing parentheses can be specified\n        relatively, for example, (?(-2)... or (?(+3)...\n\n    (d) \\K resets the start of the current match so that everything before\n        is not part of it.\n\n    (e) \\k{name} is synonymous with \\k<name> and \\k'name' (.NET compatible).\n\n    (f) \\g{name} is another synonym - part of Perl 5.10's unification of\n        reference syntax.\n\n    (g) (?| introduces a group in which the numbering of parentheses in each\n        alternative starts with the same number.\n\n    (h) \\h, \\H, \\v, and \\V match horizontal and vertical whitespace.\n\n 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and\n    PCRE_INFO_JCHANGED.\n\n 8. A pattern such as  (.*(.)?)*  caused pcre_exec() to fail by either not\n    terminating or by crashing. Diagnosed by Viktor Griph; it was in the code\n    for detecting groups that can match an empty string.\n\n 9. A pattern with a very large number of alternatives (more than several\n    hundred) was running out of internal workspace during the pre-compile\n    phase, where pcre_compile() figures out how much memory will be needed. A\n    bit of new cunning has reduced the workspace needed for groups with\n    alternatives. The 1000-alternative test pattern now uses 12 bytes of\n    workspace instead of running out of the 4096 that are available.\n\n10. Inserted some missing (unsigned int) casts to get rid of compiler warnings.\n\n11. Applied patch from Google to remove an optimization that didn't quite work.\n    The report of the bug said:\n\n      pcrecpp::RE(\"a*\").FullMatch(\"aaa\") matches, while\n      pcrecpp::RE(\"a*?\").FullMatch(\"aaa\") does not, and\n      pcrecpp::RE(\"a*?\\\\z\").FullMatch(\"aaa\") does again.\n\n12. If \\p or \\P was used in non-UTF-8 mode on a character greater than 127\n    it matched the wrong number of bytes.\n\n\nVersion 7.1 24-Apr-07\n---------------------\n\n 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one\n    that is more \"standard\", making use of automake and other Autotools. There\n    is some re-arrangement of the files and adjustment of comments consequent\n    on this.\n\n 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r\n    for recursive directory scanning broke on some systems because the files\n    are not scanned in any specific order and on different systems the order\n    was different. A call to \"sort\" has been inserted into RunGrepTest for the\n    approprate test as a short-term fix. In the longer term there may be an\n    alternative.\n\n 3. I had an email from Eric Raymond about problems translating some of PCRE's\n    man pages to HTML (despite the fact that I distribute HTML pages, some\n    people do their own conversions for various reasons). The problems\n    concerned the use of low-level troff macros .br and .in. I have therefore\n    removed all such uses from the man pages (some were redundant, some could\n    be replaced by .nf/.fi pairs). The 132html script that I use to generate\n    HTML has been updated to handle .nf/.fi and to complain if it encounters\n    .br or .in.\n\n 4. Updated comments in configure.ac that get placed in config.h.in and also\n    arranged for config.h to be included in the distribution, with the name\n    config.h.generic, for the benefit of those who have to compile without\n    Autotools (compare pcre.h, which is now distributed as pcre.h.generic).\n\n 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan\n    Weber: (1) pcre_internal.h was missing some function renames; (2) updated\n    makevp.bat for the current PCRE, using the additional files\n    makevp_c.txt, makevp_l.txt, and pcregexp.pas.\n\n 6. A Windows user reported a minor discrepancy with test 2, which turned out\n    to be caused by a trailing space on an input line that had got lost in his\n    copy. The trailing space was an accident, so I've just removed it.\n\n 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told\n    that is needed.\n\n 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c)\n    as \"const\" (a) because they are and (b) because it helps the PHP\n    maintainers who have recently made a script to detect big data structures\n    in the php code that should be moved to the .rodata section. I remembered\n    to update Builducptable as well, so it won't revert if ucptable.h is ever\n    re-created.\n\n 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c,\n    pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in\n    order to be able to cut out the UTF-8 tables in the latter when UTF-8\n    support is not required. This saves 1.5-2K of code, which is important in\n    some applications.\n\n    Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c\n    so as not to refer to the tables, even though these functions will never be\n    called when UTF-8 support is disabled. Otherwise there are problems with a\n    shared library.\n\n10. Fixed two bugs in the emulated memmove() function in pcre_internal.h:\n\n    (a) It was defining its arguments as char * instead of void *.\n\n    (b) It was assuming that all moves were upwards in memory; this was true\n        a long time ago when I wrote it, but is no longer the case.\n\n    The emulated memove() is provided for those environments that have neither\n    memmove() nor bcopy(). I didn't think anyone used it these days, but that\n    is clearly not the case, as these two bugs were recently reported.\n\n11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt,\n    and Detrail to create the HTML documentation, the .txt form of the man\n    pages, and it removes trailing spaces from listed files. It also creates\n    pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter\n    case, it wraps all the #defines with #ifndefs. This script should be run\n    before \"make dist\".\n\n12. Fixed two fairly obscure bugs concerned with quantified caseless matching\n    with Unicode property support.\n\n    (a) For a maximizing quantifier, if the two different cases of the\n        character were of different lengths in their UTF-8 codings (there are\n        some cases like this - I found 11), and the matching function had to\n        back up over a mixture of the two cases, it incorrectly assumed they\n        were both the same length.\n\n    (b) When PCRE was configured to use the heap rather than the stack for\n        recursion during matching, it was not correctly preserving the data for\n        the other case of a UTF-8 character when checking ahead for a match\n        while processing a minimizing repeat. If the check also involved\n        matching a wide character, but failed, corruption could cause an\n        erroneous result when trying to check for a repeat of the original\n        character.\n\n13. Some tidying changes to the testing mechanism:\n\n    (a) The RunTest script now detects the internal link size and whether there\n        is UTF-8 and UCP support by running ./pcretest -C instead of relying on\n        values substituted by \"configure\". (The RunGrepTest script already did\n        this for UTF-8.) The configure.ac script no longer substitutes the\n        relevant variables.\n\n    (b) The debugging options /B and /D in pcretest show the compiled bytecode\n        with length and offset values. This means that the output is different\n        for different internal link sizes. Test 2 is skipped for link sizes\n        other than 2 because of this, bypassing the problem. Unfortunately,\n        there was also a test in test 3 (the locale tests) that used /B and\n        failed for link sizes other than 2. Rather than cut the whole test out,\n        I have added a new /Z option to pcretest that replaces the length and\n        offset values with spaces. This is now used to make test 3 independent\n        of link size. (Test 2 will be tidied up later.)\n\n14. If erroroffset was passed as NULL to pcre_compile, it provoked a\n    segmentation fault instead of returning the appropriate error message.\n\n15. In multiline mode when the newline sequence was set to \"any\", the pattern\n    ^$ would give a match between the \\r and \\n of a subject such as \"A\\r\\nB\".\n    This doesn't seem right; it now treats the CRLF combination as the line\n    ending, and so does not match in that case. It's only a pattern such as ^$\n    that would hit this one: something like ^ABC$ would have failed after \\r\n    and then tried again after \\r\\n.\n\n16. Changed the comparison command for RunGrepTest from \"diff -u\" to \"diff -ub\"\n    in an attempt to make files that differ only in their line terminators\n    compare equal. This works on Linux.\n\n17. Under certain error circumstances pcregrep might try to free random memory\n    as it exited. This is now fixed, thanks to valgrind.\n\n19. In pcretest, if the pattern /(?m)^$/g<any> was matched against the string\n    \"abc\\r\\n\\r\\n\", it found an unwanted second match after the second \\r. This\n    was because its rules for how to advance for /g after matching an empty\n    string at the end of a line did not allow for this case. They now check for\n    it specially.\n\n20. pcretest is supposed to handle patterns and data of any length, by\n    extending its buffers when necessary. It was getting this wrong when the\n    buffer for a data line had to be extended.\n\n21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or\n    CRLF as a newline sequence.\n\n22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut\n    out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but\n    I have nevertheless tidied it up.\n\n23. Added some casts to kill warnings from HP-UX ia64 compiler.\n\n24. Added a man page for pcre-config.\n\n\nVersion 7.0 19-Dec-06\n---------------------\n\n 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by\n    moving to gcc 4.1.1.\n\n 2. The -S option for pcretest uses setrlimit(); I had omitted to #include\n    sys/time.h, which is documented as needed for this function. It doesn't\n    seem to matter on Linux, but it showed up on some releases of OS X.\n\n 3. It seems that there are systems where bytes whose values are greater than\n    127 match isprint() in the \"C\" locale. The \"C\" locale should be the\n    default when a C program starts up. In most systems, only ASCII printing\n    characters match isprint(). This difference caused the output from pcretest\n    to vary, making some of the tests fail. I have changed pcretest so that:\n\n    (a) When it is outputting text in the compiled version of a pattern, bytes\n        other than 32-126 are always shown as hex escapes.\n\n    (b) When it is outputting text that is a matched part of a subject string,\n        it does the same, unless a different locale has been set for the match\n        (using the /L modifier). In this case, it uses isprint() to decide.\n\n 4. Fixed a major bug that caused incorrect computation of the amount of memory\n    required for a compiled pattern when options that changed within the\n    pattern affected the logic of the preliminary scan that determines the\n    length. The relevant options are -x, and -i in UTF-8 mode. The result was\n    that the computed length was too small. The symptoms of this bug were\n    either the PCRE error \"internal error: code overflow\" from pcre_compile(),\n    or a glibc crash with a message such as \"pcretest: free(): invalid next\n    size (fast)\". Examples of patterns that provoked this bug (shown in\n    pcretest format) are:\n\n      /(?-x: )/x\n      /(?x)(?-x: \\s*#\\s*)/\n      /((?i)[\\x{c0}])/8\n      /(?i:[\\x{c0}])/8\n\n    HOWEVER: Change 17 below makes this fix obsolete as the memory computation\n    is now done differently.\n\n 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++\n    wrapper classes; (b) implement a new function in the C++ scanner that is\n    more efficient than the old way of doing things because it avoids levels of\n    recursion in the regex matching; (c) add a paragraph to the documentation\n    for the FullMatch() function.\n\n 6. The escape sequence \\n was being treated as whatever was defined as\n    \"newline\". Not only was this contrary to the documentation, which states\n    that \\n is character 10 (hex 0A), but it also went horribly wrong when\n    \"newline\" was defined as CRLF. This has been fixed.\n\n 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c)\n    was being set to -1 for the \"end of line\" case (supposedly a value that no\n    character can have). Though this value is never used (the check for end of\n    line is \"zero bytes in current character\"), it caused compiler complaints.\n    I've changed it to 0xffffffff.\n\n 8. In pcre_version.c, the version string was being built by a sequence of\n    C macros that, in the event of PCRE_PRERELEASE being defined as an empty\n    string (as it is for production releases) called a macro with an empty\n    argument. The C standard says the result of this is undefined. The gcc\n    compiler treats it as an empty string (which was what was wanted) but it is\n    reported that Visual C gives an error. The source has been hacked around to\n    avoid this problem.\n\n 9. On the advice of a Windows user, included <io.h> and <fcntl.h> in Windows\n    builds of pcretest, and changed the call to _setmode() to use _O_BINARY\n    instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all\n    of them did).\n\n10. Originally, pcretest opened its input and output without \"b\"; then I was\n    told that \"b\" was needed in some environments, so it was added for release\n    5.0 to both the input and output. (It makes no difference on Unix-like\n    systems.) Later I was told that it is wrong for the input on Windows. I've\n    now abstracted the modes into two macros, to make it easier to fiddle with\n    them, and removed \"b\" from the input mode under Windows.\n\n11. Added pkgconfig support for the C++ wrapper library, libpcrecpp.\n\n12. Added -help and --help to pcretest as an official way of being reminded\n    of the options.\n\n13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in\n    and pcrecpp.cc because they annoy compilers at high warning levels.\n\n14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop.\n\n15. Fixed an occurrence of == in configure.ac that should have been = (shell\n    scripts are not C programs :-) and which was not noticed because it works\n    on Linux.\n\n16. pcretest is supposed to handle any length of pattern and data line (as one\n    line or as a continued sequence of lines) by extending its input buffer if\n    necessary. This feature was broken for very long pattern lines, leading to\n    a string of junk being passed to pcre_compile() if the pattern was longer\n    than about 50K.\n\n17. I have done a major re-factoring of the way pcre_compile() computes the\n    amount of memory needed for a compiled pattern. Previously, there was code\n    that made a preliminary scan of the pattern in order to do this. That was\n    OK when PCRE was new, but as the facilities have expanded, it has become\n    harder and harder to keep it in step with the real compile phase, and there\n    have been a number of bugs (see for example, 4 above). I have now found a\n    cunning way of running the real compile function in a \"fake\" mode that\n    enables it to compute how much memory it would need, while actually only\n    ever using a few hundred bytes of working memory and without too many\n    tests of the mode. This should make future maintenance and development\n    easier. A side effect of this work is that the limit of 200 on the nesting\n    depth of parentheses has been removed (though this was never a serious\n    limitation, I suspect). However, there is a downside: pcre_compile() now\n    runs more slowly than before (30% or more, depending on the pattern). I\n    hope this isn't a big issue. There is no effect on runtime performance.\n\n18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a\n    newline (only possible for the last line of a file) and it was a\n    pattern that set a locale (followed by /Lsomething), pcretest crashed.\n\n19. Added additional timing features to pcretest. (1) The -tm option now times\n    matching only, not compiling. (2) Both -t and -tm can be followed, as a\n    separate command line item, by a number that specifies the number of\n    repeats to use when timing. The default is 50000; this gives better\n    precision, but takes uncomfortably long for very large patterns.\n\n20. Extended pcre_study() to be more clever in cases where a branch of a\n    subpattern has no definite first character. For example, (a*|b*)[cd] would\n    previously give no result from pcre_study(). Now it recognizes that the\n    first character must be a, b, c, or d.\n\n21. There was an incorrect error \"recursive call could loop indefinitely\" if\n    a subpattern (or the entire pattern) that was being tested for matching an\n    empty string contained only one non-empty item after a nested subpattern.\n    For example, the pattern (?>\\x{100}*)\\d(?R) provoked this error\n    incorrectly, because the \\d was being skipped in the check.\n\n22. The pcretest program now has a new pattern option /B and a command line\n    option -b, which is equivalent to adding /B to every pattern. This causes\n    it to show the compiled bytecode, without the additional information that\n    -d shows. The effect of -d is now the same as -b with -i (and similarly, /D\n    is the same as /B/I).\n\n23. A new optimization is now able automatically to treat some sequences such\n    as a*b as a*+b. More specifically, if something simple (such as a character\n    or a simple class like \\d) has an unlimited quantifier, and is followed by\n    something that cannot possibly match the quantified thing, the quantifier\n    is automatically \"possessified\".\n\n24. A recursive reference to a subpattern whose number was greater than 39\n    went wrong under certain circumstances in UTF-8 mode. This bug could also\n    have affected the operation of pcre_study().\n\n25. Realized that a little bit of performance could be had by replacing\n    (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters.\n\n26. Timing data from pcretest is now shown to 4 decimal places instead of 3.\n\n27. Possessive quantifiers such as a++ were previously implemented by turning\n    them into atomic groups such as ($>a+). Now they have their own opcodes,\n    which improves performance. This includes the automatically created ones\n    from 23 above.\n\n28. A pattern such as (?=(\\w+))\\1: which simulates an atomic group using a\n    lookahead was broken if it was not anchored. PCRE was mistakenly expecting\n    the first matched character to be a colon. This applied both to named and\n    numbered groups.\n\n29. The ucpinternal.h header file was missing its idempotency #ifdef.\n\n30. I was sent a \"project\" file called libpcre.a.dev which I understand makes\n    building PCRE on Windows easier, so I have included it in the distribution.\n\n31. There is now a check in pcretest against a ridiculously large number being\n    returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G\n    loop, the loop is abandoned.\n\n32. Forward references to subpatterns in conditions such as (?(2)...) where\n    subpattern 2 is defined later cause pcre_compile() to search forwards in\n    the pattern for the relevant set of parentheses. This search went wrong\n    when there were unescaped parentheses in a character class, parentheses\n    escaped with \\Q...\\E, or parentheses in a #-comment in /x mode.\n\n33. \"Subroutine\" calls and backreferences were previously restricted to\n    referencing subpatterns earlier in the regex. This restriction has now\n    been removed.\n\n34. Added a number of extra features that are going to be in Perl 5.10. On the\n    whole, these are just syntactic alternatives for features that PCRE had\n    previously implemented using the Python syntax or my own invention. The\n    other formats are all retained for compatibility.\n\n    (a) Named groups can now be defined as (?<name>...) or (?'name'...) as well\n        as (?P<name>...). The new forms, as well as being in Perl 5.10, are\n        also .NET compatible.\n\n    (b) A recursion or subroutine call to a named group can now be defined as\n        (?&name) as well as (?P>name).\n\n    (c) A backreference to a named group can now be defined as \\k<name> or\n        \\k'name' as well as (?P=name). The new forms, as well as being in Perl\n        5.10, are also .NET compatible.\n\n    (d) A conditional reference to a named group can now use the syntax\n        (?(<name>) or (?('name') as well as (?(name).\n\n    (e) A \"conditional group\" of the form (?(DEFINE)...) can be used to define\n        groups (named and numbered) that are never evaluated inline, but can be\n        called as \"subroutines\" from elsewhere. In effect, the DEFINE condition\n        is always false. There may be only one alternative in such a group.\n\n    (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well\n        as the simple (?(R). The condition is true only if the most recent\n        recursion is that of the given number or name. It does not search out\n        through the entire recursion stack.\n\n    (g) The escape \\gN or \\g{N} has been added, where N is a positive or\n        negative number, specifying an absolute or relative reference.\n\n35. Tidied to get rid of some further signed/unsigned compiler warnings and\n    some \"unreachable code\" warnings.\n\n36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other\n    things, this adds five new scripts.\n\n37. Perl ignores orphaned \\E escapes completely. PCRE now does the same.\n    There were also incompatibilities regarding the handling of \\Q..\\E inside\n    character classes, for example with patterns like [\\Qa\\E-\\Qz\\E] where the\n    hyphen was adjacent to \\Q or \\E. I hope I've cleared all this up now.\n\n38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group\n    matches an empty string, and forcibly breaks the loop. There were bugs in\n    this code in non-simple cases. For a pattern such as  ^(a()*)*  matched\n    against  aaaa  the result was just \"a\" rather than \"aaaa\", for example. Two\n    separate and independent bugs (that affected different cases) have been\n    fixed.\n\n39. Refactored the code to abolish the use of different opcodes for small\n    capturing bracket numbers. This is a tidy that I avoided doing when I\n    removed the limit on the number of capturing brackets for 3.5 back in 2001.\n    The new approach is not only tidier, it makes it possible to reduce the\n    memory needed to fix the previous bug (38).\n\n40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline\n    sequences (http://unicode.org/unicode/reports/tr18/) as \"newline\" when\n    processing dot, circumflex, or dollar metacharacters, or #-comments in /x\n    mode.\n\n41. Add \\R to match any Unicode newline sequence, as suggested in the Unicode\n    report.\n\n42. Applied patch, originally from Ari Pollak, modified by Google, to allow\n    copy construction and assignment in the C++ wrapper.\n\n43. Updated pcregrep to support \"--newline=any\". In the process, I fixed a\n    couple of bugs that could have given wrong results in the \"--newline=crlf\"\n    case.\n\n44. Added a number of casts and did some reorganization of signed/unsigned int\n    variables following suggestions from Dair Grant. Also renamed the variable\n    \"this\" as \"item\" because it is a C++ keyword.\n\n45. Arranged for dftables to add\n\n      #include \"pcre_internal.h\"\n\n    to pcre_chartables.c because without it, gcc 4.x may remove the array\n    definition from the final binary if PCRE is built into a static library and\n    dead code stripping is activated.\n\n46. For an unanchored pattern, if a match attempt fails at the start of a\n    newline sequence, and the newline setting is CRLF or ANY, and the next two\n    characters are CRLF, advance by two characters instead of one.\n\n\nVersion 6.7 04-Jul-06\n---------------------\n\n 1. In order to handle tests when input lines are enormously long, pcretest has\n    been re-factored so that it automatically extends its buffers when\n    necessary. The code is crude, but this _is_ just a test program. The\n    default size has been increased from 32K to 50K.\n\n 2. The code in pcre_study() was using the value of the re argument before\n    testing it for NULL. (Of course, in any sensible call of the function, it\n    won't be NULL.)\n\n 3. The memmove() emulation function in pcre_internal.h, which is used on\n    systems that lack both memmove() and bcopy() - that is, hardly ever -\n    was missing a \"static\" storage class specifier.\n\n 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns\n    containing an extended class (one that cannot be represented by a bitmap\n    because it contains high-valued characters or Unicode property items, e.g.\n    [\\pZ]). Almost always one would set UTF-8 mode when processing such a\n    pattern, but PCRE should not loop if you do not (it no longer does).\n    [Detail: two cases were found: (a) a repeated subpattern containing an\n    extended class; (b) a recursive reference to a subpattern that followed a\n    previous extended class. It wasn't skipping over the extended class\n    correctly when UTF-8 mode was not set.]\n\n 5. A negated single-character class was not being recognized as fixed-length\n    in lookbehind assertions such as (?<=[^f]), leading to an incorrect\n    compile error \"lookbehind assertion is not fixed length\".\n\n 6. The RunPerlTest auxiliary script was showing an unexpected difference\n    between PCRE and Perl for UTF-8 tests. It turns out that it is hard to\n    write a Perl script that can interpret lines of an input file either as\n    byte characters or as UTF-8, which is what \"perltest\" was being required to\n    do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you\n    can't do is switch easily at run time between having the \"use utf8;\" pragma\n    or not. In the end, I fudged it by using the RunPerlTest script to insert\n    \"use utf8;\" explicitly for the UTF-8 tests.\n\n 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at\n    the end of the subject string, contrary to the documentation and to what\n    Perl does. This was true of both matching functions. Now it matches only at\n    the start of the subject and immediately after *internal* newlines.\n\n 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing\n    a pointer to an int instead of a pointer to an unsigned long int. This\n    caused problems on 64-bit systems.\n\n 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix \"another\n    instance of the 'standard' template library not being so standard\".\n\n10. There was no check on the number of named subpatterns nor the maximum\n    length of a subpattern name. The product of these values is used to compute\n    the size of the memory block for a compiled pattern. By supplying a very\n    long subpattern name and a large number of named subpatterns, the size\n    computation could be caused to overflow. This is now prevented by limiting\n    the length of names to 32 characters, and the number of named subpatterns\n    to 10,000.\n\n11. Subpatterns that are repeated with specific counts have to be replicated in\n    the compiled pattern. The size of memory for this was computed from the\n    length of the subpattern and the repeat count. The latter is limited to\n    65535, but there was no limit on the former, meaning that integer overflow\n    could in principle occur. The compiled length of a repeated subpattern is\n    now limited to 30,000 bytes in order to prevent this.\n\n12. Added the optional facility to have named substrings with the same name.\n\n13. Added the ability to use a named substring as a condition, using the\n    Python syntax: (?(name)yes|no). This overloads (?(R)... and names that\n    are numbers (not recommended). Forward references are permitted.\n\n14. Added forward references in named backreferences (if you see what I mean).\n\n15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the\n    pattern could run off the end of the subject. For example, the pattern\n    \"(?s)(.{1,5})\"8 did this with the subject \"ab\".\n\n16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if\n    PCRE_CASELESS was set when matching characters that were quantified with ?\n    or *.\n\n17. A character class other than a single negated character that had a minimum\n    but no maximum quantifier - for example [ab]{6,} - was not handled\n    correctly by pce_dfa_exec(). It would match only one character.\n\n18. A valid (though odd) pattern that looked like a POSIX character\n    class but used an invalid character after [ (for example [[,abc,]]) caused\n    pcre_compile() to give the error \"Failed: internal error: code overflow\" or\n    in some cases to crash with a glibc free() error. This could even happen if\n    the pattern terminated after [[ but there just happened to be a sequence of\n    letters, a binary zero, and a closing ] in the memory that followed.\n\n19. Perl's treatment of octal escapes in the range \\400 to \\777 has changed\n    over the years. Originally (before any Unicode support), just the bottom 8\n    bits were taken. Thus, for example, \\500 really meant \\100. Nowadays the\n    output from \"man perlunicode\" includes this:\n\n      The regular expression compiler produces polymorphic opcodes.  That\n      is, the pattern adapts to the data and automatically switches to\n      the Unicode character scheme when presented with Unicode data--or\n      instead uses a traditional byte scheme when presented with byte\n      data.\n\n    Sadly, a wide octal escape does not cause a switch, and in a string with\n    no other multibyte characters, these octal escapes are treated as before.\n    Thus, in Perl, the pattern  /\\500/ actually matches \\100 but the pattern\n    /\\500|\\x{1ff}/ matches \\500 or \\777 because the whole thing is treated as a\n    Unicode string.\n\n    I have not perpetrated such confusion in PCRE. Up till now, it took just\n    the bottom 8 bits, as in old Perl. I have now made octal escapes with\n    values greater than \\377 illegal in non-UTF-8 mode. In UTF-8 mode they\n    translate to the appropriate multibyte character.\n\n29. Applied some refactoring to reduce the number of warnings from Microsoft\n    and Borland compilers. This has included removing the fudge introduced\n    seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused\n    a warning about an unused variable.\n\n21. PCRE has not included VT (character 0x0b) in the set of whitespace\n    characters since release 4.0, because Perl (from release 5.004) does not.\n    [Or at least, is documented not to: some releases seem to be in conflict\n    with the documentation.] However, when a pattern was studied with\n    pcre_study() and all its branches started with \\s, PCRE still included VT\n    as a possible starting character. Of course, this did no harm; it just\n    caused an unnecessary match attempt.\n\n22. Removed a now-redundant internal flag bit that recorded the fact that case\n    dependency changed within the pattern. This was once needed for \"required\n    byte\" processing, but is no longer used. This recovers a now-scarce options\n    bit. Also moved the least significant internal flag bit to the most-\n    significant bit of the word, which was not previously used (hangover from\n    the days when it was an int rather than a uint) to free up another bit for\n    the future.\n\n23. Added support for CRLF line endings as well as CR and LF. As well as the\n    default being selectable at build time, it can now be changed at runtime\n    via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to\n    specify that it is scanning data with non-default line endings.\n\n24. Changed the definition of CXXLINK to make it agree with the definition of\n    LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS.\n\n25. Applied Ian Taylor's patches to avoid using another stack frame for tail\n    recursions. This makes a big different to stack usage for some patterns.\n\n26. If a subpattern containing a named recursion or subroutine reference such\n    as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of\n    the space required for the compiled pattern went wrong and gave too small a\n    value. Depending on the environment, this could lead to \"Failed: internal\n    error: code overflow at offset 49\" or \"glibc detected double free or\n    corruption\" errors.\n\n27. Applied patches from Google (a) to support the new newline modes and (b) to\n    advance over multibyte UTF-8 characters in GlobalReplace.\n\n28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a\n    difference for some implementation of PCRE in some Windows version.\n\n29. Added some extra testing facilities to pcretest:\n\n    \\q<number>   in a data line sets the \"match limit\" value\n    \\Q<number>   in a data line sets the \"match recursion limt\" value\n    -S <number>  sets the stack size, where <number> is in megabytes\n\n    The -S option isn't available for Windows.\n\n\nVersion 6.6 06-Feb-06\n---------------------\n\n 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined\n    in pcreposix.h. I have copied the definition from pcre.h.\n\n 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree\n    because pcre.h is no longer a built file.\n\n 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are\n    not normally included in the compiled code.\n\n\nVersion 6.5 01-Feb-06\n---------------------\n\n 1. When using the partial match feature with pcre_dfa_exec(), it was not\n    anchoring the second and subsequent partial matches at the new starting\n    point. This could lead to incorrect results. For example, with the pattern\n    /1234/, partially matching against \"123\" and then \"a4\" gave a match.\n\n 2. Changes to pcregrep:\n\n    (a) All non-match returns from pcre_exec() were being treated as failures\n        to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an\n        error message is output. Some extra information is given for the\n        PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are\n        probably the only errors that are likely to be caused by users (by\n        specifying a regex that has nested indefinite repeats, for instance).\n        If there are more than 20 of these errors, pcregrep is abandoned.\n\n    (b) A binary zero was treated as data while matching, but terminated the\n        output line if it was written out. This has been fixed: binary zeroes\n        are now no different to any other data bytes.\n\n    (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is\n        used to set a locale for matching. The --locale=xxxx long option has\n        been added (no short equivalent) to specify a locale explicitly on the\n        pcregrep command, overriding the environment variables.\n\n    (d) When -B was used with -n, some line numbers in the output were one less\n        than they should have been.\n\n    (e) Added the -o (--only-matching) option.\n\n    (f) If -A or -C was used with -c (count only), some lines of context were\n        accidentally printed for the final match.\n\n    (g) Added the -H (--with-filename) option.\n\n    (h) The combination of options -rh failed to suppress file names for files\n        that were found from directory arguments.\n\n    (i) Added the -D (--devices) and -d (--directories) options.\n\n    (j) Added the -F (--fixed-strings) option.\n\n    (k) Allow \"-\" to be used as a file name for -f as well as for a data file.\n\n    (l) Added the --colo(u)r option.\n\n    (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it\n        is not present by default.\n\n 3. A nasty bug was discovered in the handling of recursive patterns, that is,\n    items such as (?R) or (?1), when the recursion could match a number of\n    alternatives. If it matched one of the alternatives, but subsequently,\n    outside the recursion, there was a failure, the code tried to back up into\n    the recursion. However, because of the way PCRE is implemented, this is not\n    possible, and the result was an incorrect result from the match.\n\n    In order to prevent this happening, the specification of recursion has\n    been changed so that all such subpatterns are automatically treated as\n    atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)).\n\n 4. I had overlooked the fact that, in some locales, there are characters for\n    which isalpha() is true but neither isupper() nor islower() are true. In\n    the fr_FR locale, for instance, the \\xAA and \\xBA characters (ordmasculine\n    and ordfeminine) are like this. This affected the treatment of \\w and \\W\n    when they appeared in character classes, but not when they appeared outside\n    a character class. The bit map for \"word\" characters is now created\n    separately from the results of isalnum() instead of just taking it from the\n    upper, lower, and digit maps. (Plus the underscore character, of course.)\n\n 5. The above bug also affected the handling of POSIX character classes such as\n    [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's\n    permanent tables. Instead, the bit maps for such a class were previously\n    created as the appropriate unions of the upper, lower, and digit bitmaps.\n    Now they are created by subtraction from the [[:word:]] class, which has\n    its own bitmap.\n\n 6. The [[:blank:]] character class matches horizontal, but not vertical space.\n    It is created by subtracting the vertical space characters (\\x09, \\x0a,\n    \\x0b, \\x0c) from the [[:space:]] bitmap. Previously, however, the\n    subtraction was done in the overall bitmap for a character class, meaning\n    that a class such as [\\x0c[:blank:]] was incorrect because \\x0c would not\n    be recognized. This bug has been fixed.\n\n 7. Patches from the folks at Google:\n\n      (a) pcrecpp.cc: \"to handle a corner case that may or may not happen in\n      real life, but is still worth protecting against\".\n\n      (b) pcrecpp.cc: \"corrects a bug when negative radixes are used with\n      regular expressions\".\n\n      (c) pcre_scanner.cc: avoid use of std::count() because not all systems\n      have it.\n\n      (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by\n      \"configure\" and the latter not, in order to fix a problem somebody had\n      with compiling the Arg class on HP-UX.\n\n      (e) Improve the error-handling of the C++ wrapper a little bit.\n\n      (f) New tests for checking recursion limiting.\n\n 8. The pcre_memmove() function, which is used only if the environment does not\n    have a standard memmove() function (and is therefore rarely compiled),\n    contained two bugs: (a) use of int instead of size_t, and (b) it was not\n    returning a result (though PCRE never actually uses the result).\n\n 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously\n    large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is\n    returned instead of calling malloc() with an overflowing number that would\n    most likely cause subsequent chaos.\n\n10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag.\n\n11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled\n    with this option is matched, the nmatch and pmatch options of regexec() are\n    ignored.\n\n12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is\n    provided in case anyone wants to the the POSIX interface with UTF-8\n    strings.\n\n13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the\n    C++ linking (needed for some HP-UX environments).\n\n14. Avoid compiler warnings in get_ucpname() when compiled without UCP support\n    (unused parameter) and in the pcre_printint() function (omitted \"default\"\n    switch label when the default is to do nothing).\n\n15. Added some code to make it possible, when PCRE is compiled as a C++\n    library, to replace subject pointers for pcre_exec() with a smart pointer\n    class, thus making it possible to process discontinuous strings.\n\n16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform\n    much the same function. They were added by different people who were trying\n    to make PCRE easy to compile on non-Unix systems. It has been suggested\n    that PCRE_EXPORT be abolished now that there is more automatic apparatus\n    for compiling on Windows systems. I have therefore replaced it with\n    PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it\n    defaults to \"extern\" for C or \"extern C\" for C++, which works fine on\n    Unix-like systems. It is now possible to override the value of PCRE_DATA_\n    SCOPE with something explicit in config.h. In addition:\n\n    (a) pcreposix.h still had just \"extern\" instead of either of these macros;\n        I have replaced it with PCRE_DATA_SCOPE.\n\n    (b) Functions such as _pcre_xclass(), which are internal to the library,\n        but external in the C sense, all had PCRE_EXPORT in their definitions.\n        This is apparently wrong for the Windows case, so I have removed it.\n        (It makes no difference on Unix-like systems.)\n\n17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting\n    of recursive calls to match(). This is different to MATCH_LIMIT because\n    that limits the total number of calls to match(), not all of which increase\n    the depth of recursion. Limiting the recursion depth limits the amount of\n    stack (or heap if NO_RECURSE is set) that is used. The default can be set\n    when PCRE is compiled, and changed at run time. A patch from Google adds\n    this functionality to the C++ interface.\n\n18. Changes to the handling of Unicode character properties:\n\n    (a) Updated the table to Unicode 4.1.0.\n\n    (b) Recognize characters that are not in the table as \"Cn\" (undefined).\n\n    (c) I revised the way the table is implemented to a much improved format\n        which includes recognition of ranges. It now supports the ranges that\n        are defined in UnicodeData.txt, and it also amalgamates other\n        characters into ranges. This has reduced the number of entries in the\n        table from around 16,000 to around 3,000, thus reducing its size\n        considerably. I realized I did not need to use a tree structure after\n        all - a binary chop search is just as efficient. Having reduced the\n        number of entries, I extended their size from 6 bytes to 8 bytes to\n        allow for more data.\n\n    (d) Added support for Unicode script names via properties such as \\p{Han}.\n\n19. In UTF-8 mode, a backslash followed by a non-Ascii character was not\n    matching that character.\n\n20. When matching a repeated Unicode property with a minimum greater than zero,\n    (for example \\pL{2,}), PCRE could look past the end of the subject if it\n    reached it while seeking the minimum number of characters. This could\n    happen only if some of the characters were more than one byte long, because\n    there is a check for at least the minimum number of bytes.\n\n21. Refactored the implementation of \\p and \\P so as to be more general, to\n    allow for more different types of property in future. This has changed the\n    compiled form incompatibly. Anybody with saved compiled patterns that use\n    \\p or \\P will have to recompile them.\n\n22. Added \"Any\" and \"L&\" to the supported property types.\n\n23. Recognize \\x{...} as a code point specifier, even when not in UTF-8 mode,\n    but give a compile time error if the value is greater than 0xff.\n\n24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were\n    accidentally not being installed or uninstalled.\n\n25. The pcre.h file was built from pcre.h.in, but the only changes that were\n    made were to insert the current release number. This seemed silly, because\n    it made things harder for people building PCRE on systems that don't run\n    \"configure\". I have turned pcre.h into a distributed file, no longer built\n    by \"configure\", with the version identification directly included. There is\n    no longer a pcre.h.in file.\n\n    However, this change necessitated a change to the pcre-config script as\n    well. It is built from pcre-config.in, and one of the substitutions was the\n    release number. I have updated configure.ac so that ./configure now finds\n    the release number by grepping pcre.h.\n\n26. Added the ability to run the tests under valgrind.\n\n\nVersion 6.4 05-Sep-05\n---------------------\n\n 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines\n    \"--\" to be printed when multiple files were scanned, even when none of the\n    -A, -B, or -C options were used. This is not compatible with Gnu grep, so I\n    consider it to be a bug, and have restored the previous behaviour.\n\n 2. A couple of code tidies to get rid of compiler warnings.\n\n 3. The pcretest program used to cheat by referring to symbols in the library\n    whose names begin with _pcre_. These are internal symbols that are not\n    really supposed to be visible externally, and in some environments it is\n    possible to suppress them. The cheating is now confined to including\n    certain files from the library's source, which is a bit cleaner.\n\n 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the\n    file's purpose clearer.\n\n 5. Reorganized pcre_ucp_findchar().\n\n\nVersion 6.3 15-Aug-05\n---------------------\n\n 1. The file libpcre.pc.in did not have general read permission in the tarball.\n\n 2. There were some problems when building without C++ support:\n\n    (a) If C++ support was not built, \"make install\" and \"make test\" still\n        tried to test it.\n\n    (b) There were problems when the value of CXX was explicitly set. Some\n        changes have been made to try to fix these, and ...\n\n    (c) --disable-cpp can now be used to explicitly disable C++ support.\n\n    (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a\n        backslash in a target when C++ was disabled. This confuses some\n        versions of \"make\", apparently. Using an intermediate variable solves\n        this. (Same for CPP_LOBJ.)\n\n 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK)\n    (non-Windows) now includes $(CFLAGS) because these flags are sometimes\n    necessary on certain architectures.\n\n 4. Added a setting of -export-symbols-regex to the link command to remove\n    those symbols that are exported in the C sense, but actually are local\n    within the library, and not documented. Their names all begin with\n    \"_pcre_\". This is not a perfect job, because (a) we have to except some\n    symbols that pcretest (\"illegally\") uses, and (b) the facility isn't always\n    available (and never for static libraries). I have made a note to try to\n    find a way round (a) in the future.\n\n\nVersion 6.2 01-Aug-05\n---------------------\n\n 1. There was no test for integer overflow of quantifier values. A construction\n    such as {1111111111111111} would give undefined results. What is worse, if\n    a minimum quantifier for a parenthesized subpattern overflowed and became\n    negative, the calculation of the memory size went wrong. This could have\n    led to memory overwriting.\n\n 2. Building PCRE using VPATH was broken. Hopefully it is now fixed.\n\n 3. Added \"b\" to the 2nd argument of fopen() in dftables.c, for non-Unix-like\n    operating environments where this matters.\n\n 4. Applied Giuseppe Maxia's patch to add additional features for controlling\n    PCRE options from within the C++ wrapper.\n\n 5. Named capturing subpatterns were not being correctly counted when a pattern\n    was compiled. This caused two problems: (a) If there were more than 100\n    such subpatterns, the calculation of the memory needed for the whole\n    compiled pattern went wrong, leading to an overflow error. (b) Numerical\n    back references of the form \\12, where the number was greater than 9, were\n    not recognized as back references, even though there were sufficient\n    previous subpatterns.\n\n 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older\n    versions of gcc, e.g. 2.95.4.\n\n\nVersion 6.1 21-Jun-05\n---------------------\n\n 1. There was one reference to the variable \"posix\" in pcretest.c that was not\n    surrounded by \"#if !defined NOPOSIX\".\n\n 2. Make it possible to compile pcretest without DFA support, UTF8 support, or\n    the cross-check on the old pcre_info() function, for the benefit of the\n    cut-down version of PCRE that is currently imported into Exim.\n\n 3. A (silly) pattern starting with (?i)(?-i) caused an internal space\n    allocation error. I've done the easy fix, which wastes 2 bytes for sensible\n    patterns that start (?i) but I don't think that matters. The use of (?i) is\n    just an example; this all applies to the other options as well.\n\n 4. Since libtool seems to echo the compile commands it is issuing, the output\n    from \"make\" can be reduced a bit by putting \"@\" in front of each libtool\n    compile command.\n\n 5. Patch from the folks at Google for configure.in to be a bit more thorough\n    in checking for a suitable C++ installation before trying to compile the\n    C++ stuff. This should fix a reported problem when a compiler was present,\n    but no suitable headers.\n\n 6. The man pages all had just \"PCRE\" as their title. I have changed them to\n    be the relevant file name. I have also arranged that these names are\n    retained in the file doc/pcre.txt, which is a concatenation in text format\n    of all the man pages except the little individual ones for each function.\n\n 7. The NON-UNIX-USE file had not been updated for the different set of source\n    files that come with release 6. I also added a few comments about the C++\n    wrapper.\n\n\nVersion 6.0 07-Jun-05\n---------------------\n\n 1. Some minor internal re-organization to help with my DFA experiments.\n\n 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that\n    didn't matter for the library itself when fully configured, but did matter\n    when compiling without UCP support, or within Exim, where the ucp files are\n    not imported.\n\n 3. Refactoring of the library code to split up the various functions into\n    different source modules. The addition of the new DFA matching code (see\n    below) to a single monolithic source would have made it really too\n    unwieldy, quite apart from causing all the code to be include in a\n    statically linked application, when only some functions are used. This is\n    relevant even without the DFA addition now that patterns can be compiled in\n    one application and matched in another.\n\n    The downside of splitting up is that there have to be some external\n    functions and data tables that are used internally in different modules of\n    the library but which are not part of the API. These have all had their\n    names changed to start with \"_pcre_\" so that they are unlikely to clash\n    with other external names.\n\n 4. Added an alternate matching function, pcre_dfa_exec(), which matches using\n    a different (DFA) algorithm. Although it is slower than the original\n    function, it does have some advantages for certain types of matching\n    problem.\n\n 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(),\n    including restarting after a partial match.\n\n 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not\n    defined when compiling for Windows was sent to me. I have put it into the\n    code, though I have no means of testing or verifying it.\n\n 7. Added the pcre_refcount() auxiliary function.\n\n 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to\n    match before or at the first newline in the subject string. In pcretest,\n    the /f option on a pattern can be used to set this.\n\n 9. A repeated \\w when used in UTF-8 mode with characters greater than 256\n    would behave wrongly. This has been present in PCRE since release 4.0.\n\n10. A number of changes to the pcregrep command:\n\n    (a) Refactored how -x works; insert ^(...)$ instead of setting\n        PCRE_ANCHORED and checking the length, in preparation for adding\n        something similar for -w.\n\n    (b) Added the -w (match as a word) option.\n\n    (c) Refactored the way lines are read and buffered so as to have more\n        than one at a time available.\n\n    (d) Implemented a pcregrep test script.\n\n    (e) Added the -M (multiline match) option. This allows patterns to match\n        over several lines of the subject. The buffering ensures that at least\n        8K, or the rest of the document (whichever is the shorter) is available\n        for matching (and similarly the previous 8K for lookbehind assertions).\n\n    (f) Changed the --help output so that it now says\n\n          -w, --word-regex(p)\n\n        instead of two lines, one with \"regex\" and the other with \"regexp\"\n        because that confused at least one person since the short forms are the\n        same. (This required a bit of code, as the output is generated\n        automatically from a table. It wasn't just a text change.)\n\n    (g) -- can be used to terminate pcregrep options if the next thing isn't an\n        option but starts with a hyphen. Could be a pattern or a path name\n        starting with a hyphen, for instance.\n\n    (h) \"-\" can be given as a file name to represent stdin.\n\n    (i) When file names are being printed, \"(standard input)\" is used for\n        the standard input, for compatibility with GNU grep. Previously\n        \"<stdin>\" was used.\n\n    (j) The option --label=xxx can be used to supply a name to be used for\n        stdin when file names are being printed. There is no short form.\n\n    (k) Re-factored the options decoding logic because we are going to add\n        two more options that take data. Such options can now be given in four\n        different ways, e.g. \"-fname\", \"-f name\", \"--file=name\", \"--file name\".\n\n    (l) Added the -A, -B, and -C options for requesting that lines of context\n        around matches be printed.\n\n    (m) Added the -L option to print the names of files that do not contain\n        any matching lines, that is, the complement of -l.\n\n    (n) The return code is 2 if any file cannot be opened, but pcregrep does\n        continue to scan other files.\n\n    (o) The -s option was incorrectly implemented. For compatibility with other\n        greps, it now suppresses the error message for a non-existent or non-\n        accessible file (but not the return code). There is a new option called\n        -q that suppresses the output of matching lines, which was what -s was\n        previously doing.\n\n    (p) Added --include and --exclude options to specify files for inclusion\n        and exclusion when recursing.\n\n11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly.\n    Hopefully, it now does.\n\n12. Missing cast in pcre_study().\n\n13. Added an \"uninstall\" target to the makefile.\n\n14. Replaced \"extern\" in the function prototypes in Makefile.in with\n    \"PCRE_DATA_SCOPE\", which defaults to 'extern' or 'extern \"C\"' in the Unix\n    world, but is set differently for Windows.\n\n15. Added a second compiling function called pcre_compile2(). The only\n    difference is that it has an extra argument, which is a pointer to an\n    integer error code. When there is a compile-time failure, this is set\n    non-zero, in addition to the error test pointer being set to point to an\n    error message. The new argument may be NULL if no error number is required\n    (but then you may as well call pcre_compile(), which is now just a\n    wrapper). This facility is provided because some applications need a\n    numeric error indication, but it has also enabled me to tidy up the way\n    compile-time errors are handled in the POSIX wrapper.\n\n16. Added VPATH=.libs to the makefile; this should help when building with one\n    prefix path and installing with another. (Or so I'm told by someone who\n    knows more about this stuff than I do.)\n\n17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This\n    passes PCRE_DOTALL to the pcre_compile() function, making the \".\" character\n    match everything, including newlines. This is not POSIX-compatible, but\n    somebody wanted the feature. From pcretest it can be activated by using\n    both the P and the s flags.\n\n18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one.\n\n19. libpcre.pc was being incorrectly installed as executable.\n\n20. A couple of places in pcretest check for end-of-line by looking for '\\n';\n    it now also looks for '\\r' so that it will work unmodified on Windows.\n\n21. Added Google's contributed C++ wrapper to the distribution.\n\n22. Added some untidy missing memory free() calls in pcretest, to keep\n    Electric Fence happy when testing.\n\n\n\nVersion 5.0 13-Sep-04\n---------------------\n\n 1. Internal change: literal characters are no longer packed up into items\n    containing multiple characters in a single byte-string. Each character\n    is now matched using a separate opcode. However, there may be more than one\n    byte in the character in UTF-8 mode.\n\n 2. The pcre_callout_block structure has two new fields: pattern_position and\n    next_item_length. These contain the offset in the pattern to the next match\n    item, and its length, respectively.\n\n 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic\n    insertion of callouts before each pattern item. Added the /C option to\n    pcretest to make use of this.\n\n 4. On the advice of a Windows user, the lines\n\n      #if defined(_WIN32) || defined(WIN32)\n      _setmode( _fileno( stdout ), 0x8000 );\n      #endif  /* defined(_WIN32) || defined(WIN32) */\n\n    have been added to the source of pcretest. This apparently does useful\n    magic in relation to line terminators.\n\n 5. Changed \"r\" and \"w\" in the calls to fopen() in pcretest to \"rb\" and \"wb\"\n    for the benefit of those environments where the \"b\" makes a difference.\n\n 6. The icc compiler has the same options as gcc, but \"configure\" doesn't seem\n    to know about it. I have put a hack into configure.in that adds in code\n    to set GCC=yes if CC=icc. This seems to end up at a point in the\n    generated configure script that is early enough to affect the setting of\n    compiler options, which is what is needed, but I have no means of testing\n    whether it really works. (The user who reported this had patched the\n    generated configure script, which of course I cannot do.)\n\n    LATER: After change 22 below (new libtool files), the configure script\n    seems to know about icc (and also ecc). Therefore, I have commented out\n    this hack in configure.in.\n\n 7. Added support for pkg-config (2 patches were sent in).\n\n 8. Negated POSIX character classes that used a combination of internal tables\n    were completely broken. These were [[:^alpha:]], [[:^alnum:]], and\n    [[:^ascii]]. Typically, they would match almost any characters. The other\n    POSIX classes were not broken in this way.\n\n 9. Matching the pattern \"\\b.*?\" against \"ab cd\", starting at offset 1, failed\n    to find the match, as PCRE was deluded into thinking that the match had to\n    start at the start point or following a newline. The same bug applied to\n    patterns with negative forward assertions or any backward assertions\n    preceding \".*\" at the start, unless the pattern required a fixed first\n    character. This was a failing pattern: \"(?!.bcd).*\". The bug is now fixed.\n\n10. In UTF-8 mode, when moving forwards in the subject after a failed match\n    starting at the last subject character, bytes beyond the end of the subject\n    string were read.\n\n11. Renamed the variable \"class\" as \"classbits\" to make life easier for C++\n    users. (Previously there was a macro definition, but it apparently wasn't\n    enough.)\n\n12. Added the new field \"tables\" to the extra data so that tables can be passed\n    in at exec time, or the internal tables can be re-selected. This allows\n    a compiled regex to be saved and re-used at a later time by a different\n    program that might have everything at different addresses.\n\n13. Modified the pcre-config script so that, when run on Solaris, it shows a\n    -R library as well as a -L library.\n\n14. The debugging options of pcretest (-d on the command line or D on a\n    pattern) showed incorrect output for anything following an extended class\n    that contained multibyte characters and which was followed by a quantifier.\n\n15. Added optional support for general category Unicode character properties\n    via the \\p, \\P, and \\X escapes. Unicode property support implies UTF-8\n    support. It adds about 90K to the size of the library. The meanings of the\n    inbuilt class escapes such as \\d and \\s have NOT been changed.\n\n16. Updated pcredemo.c to include calls to free() to release the memory for the\n    compiled pattern.\n\n17. The generated file chartables.c was being created in the source directory\n    instead of in the building directory. This caused the build to fail if the\n    source directory was different from the building directory, and was\n    read-only.\n\n18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE\n    file. No doubt somebody will tell me if they don't make sense... Also added\n    Dan Mooney's comments about building on OpenVMS.\n\n19. Added support for partial matching via the PCRE_PARTIAL option for\n    pcre_exec() and the \\P data escape in pcretest.\n\n20. Extended pcretest with 3 new pattern features:\n\n    (i)   A pattern option of the form \">rest-of-line\" causes pcretest to\n          write the compiled pattern to the file whose name is \"rest-of-line\".\n          This is a straight binary dump of the data, with the saved pointer to\n          the character tables forced to be NULL. The study data, if any, is\n          written too. After writing, pcretest reads a new pattern.\n\n    (ii)  If, instead of a pattern, \"<rest-of-line\" is given, pcretest reads a\n          compiled pattern from the given file. There must not be any\n          occurrences of \"<\" in the file name (pretty unlikely); if there are,\n          pcretest will instead treat the initial \"<\" as a pattern delimiter.\n          After reading in the pattern, pcretest goes on to read data lines as\n          usual.\n\n    (iii) The F pattern option causes pcretest to flip the bytes in the 32-bit\n          and 16-bit fields in a compiled pattern, to simulate a pattern that\n          was compiled on a host of opposite endianness.\n\n21. The pcre-exec() function can now cope with patterns that were compiled on\n    hosts of opposite endianness, with this restriction:\n\n      As for any compiled expression that is saved and used later, the tables\n      pointer field cannot be preserved; the extra_data field in the arguments\n      to pcre_exec() should be used to pass in a tables address if a value\n      other than the default internal tables were used at compile time.\n\n22. Calling pcre_exec() with a negative value of the \"ovecsize\" parameter is\n    now diagnosed as an error. Previously, most of the time, a negative number\n    would have been treated as zero, but if in addition \"ovector\" was passed as\n    NULL, a crash could occur.\n\n23. Updated the files ltmain.sh, config.sub, config.guess, and aclocal.m4 with\n    new versions from the libtool 1.5 distribution (the last one is a copy of\n    a file called libtool.m4). This seems to have fixed the need to patch\n    \"configure\" to support Darwin 1.3 (which I used to do). However, I still\n    had to patch ltmain.sh to ensure that ${SED} is set (it isn't on my\n    workstation).\n\n24. Changed the PCRE licence to be the more standard \"BSD\" licence.\n\n\nVersion 4.5 01-Dec-03\n---------------------\n\n 1. There has been some re-arrangement of the code for the match() function so\n    that it can be compiled in a version that does not call itself recursively.\n    Instead, it keeps those local variables that need separate instances for\n    each \"recursion\" in a frame on the heap, and gets/frees frames whenever it\n    needs to \"recurse\". Keeping track of where control must go is done by means\n    of setjmp/longjmp. The whole thing is implemented by a set of macros that\n    hide most of the details from the main code, and operates only if\n    NO_RECURSE is defined while compiling pcre.c. If PCRE is built using the\n    \"configure\" mechanism, \"--disable-stack-for-recursion\" turns on this way of\n    operating.\n\n    To make it easier for callers to provide specially tailored get/free\n    functions for this usage, two new functions, pcre_stack_malloc, and\n    pcre_stack_free, are used. They are always called in strict stacking order,\n    and the size of block requested is always the same.\n\n    The PCRE_CONFIG_STACKRECURSE info parameter can be used to find out whether\n    PCRE has been compiled to use the stack or the heap for recursion. The\n    -C option of pcretest uses this to show which version is compiled.\n\n    A new data escape \\S, is added to pcretest; it causes the amounts of store\n    obtained and freed by both kinds of malloc/free at match time to be added\n    to the output.\n\n 2. Changed the locale test to use \"fr_FR\" instead of \"fr\" because that's\n    what's available on my current Linux desktop machine.\n\n 3. When matching a UTF-8 string, the test for a valid string at the start has\n    been extended. If start_offset is not zero, PCRE now checks that it points\n    to a byte that is the start of a UTF-8 character. If not, it returns\n    PCRE_ERROR_BADUTF8_OFFSET (-11). Note: the whole string is still checked;\n    this is necessary because there may be backward assertions in the pattern.\n    When matching the same subject several times, it may save resources to use\n    PCRE_NO_UTF8_CHECK on all but the first call if the string is long.\n\n 4. The code for checking the validity of UTF-8 strings has been tightened so\n    that it rejects (a) strings containing 0xfe or 0xff bytes and (b) strings\n    containing \"overlong sequences\".\n\n 5. Fixed a bug (appearing twice) that I could not find any way of exploiting!\n    I had written \"if ((digitab[*p++] && chtab_digit) == 0)\" where the \"&&\"\n    should have been \"&\", but it just so happened that all the cases this let\n    through by mistake were picked up later in the function.\n\n 6. I had used a variable called \"isblank\" - this is a C99 function, causing\n    some compilers to warn. To avoid this, I renamed it (as \"blankclass\").\n\n 7. Cosmetic: (a) only output another newline at the end of pcretest if it is\n    prompting; (b) run \"./pcretest /dev/null\" at the start of the test script\n    so the version is shown; (c) stop \"make test\" echoing \"./RunTest\".\n\n 8. Added patches from David Burgess to enable PCRE to run on EBCDIC systems.\n\n 9. The prototype for memmove() for systems that don't have it was using\n    size_t, but the inclusion of the header that defines size_t was later. I've\n    moved the #includes for the C headers earlier to avoid this.\n\n10. Added some adjustments to the code to make it easier to compiler on certain\n    special systems:\n\n      (a) Some \"const\" qualifiers were missing.\n      (b) Added the macro EXPORT before all exported functions; by default this\n          is defined to be empty.\n      (c) Changed the dftables auxiliary program (that builds chartables.c) so\n          that it reads its output file name as an argument instead of writing\n          to the standard output and assuming this can be redirected.\n\n11. In UTF-8 mode, if a recursive reference (e.g. (?1)) followed a character\n    class containing characters with values greater than 255, PCRE compilation\n    went into a loop.\n\n12. A recursive reference to a subpattern that was within another subpattern\n    that had a minimum quantifier of zero caused PCRE to crash. For example,\n    (x(y(?2))z)? provoked this bug with a subject that got as far as the\n    recursion. If the recursively-called subpattern itself had a zero repeat,\n    that was OK.\n\n13. In pcretest, the buffer for reading a data line was set at 30K, but the\n    buffer into which it was copied (for escape processing) was still set at\n    1024, so long lines caused crashes.\n\n14. A pattern such as /[ab]{1,3}+/ failed to compile, giving the error\n    \"internal error: code overflow...\". This applied to any character class\n    that was followed by a possessive quantifier.\n\n15. Modified the Makefile to add libpcre.la as a prerequisite for\n    libpcreposix.la because I was told this is needed for a parallel build to\n    work.\n\n16. If a pattern that contained .* following optional items at the start was\n    studied, the wrong optimizing data was generated, leading to matching\n    errors. For example, studying /[ab]*.*c/ concluded, erroneously, that any\n    matching string must start with a or b or c. The correct conclusion for\n    this pattern is that a match can start with any character.\n\n\nVersion 4.4 13-Aug-03\n---------------------\n\n 1. In UTF-8 mode, a character class containing characters with values between\n    127 and 255 was not handled correctly if the compiled pattern was studied.\n    In fixing this, I have also improved the studying algorithm for such\n    classes (slightly).\n\n 2. Three internal functions had redundant arguments passed to them. Removal\n    might give a very teeny performance improvement.\n\n 3. Documentation bug: the value of the capture_top field in a callout is *one\n    more than* the number of the hightest numbered captured substring.\n\n 4. The Makefile linked pcretest and pcregrep with -lpcre, which could result\n    in incorrectly linking with a previously installed version. They now link\n    explicitly with libpcre.la.\n\n 5. configure.in no longer needs to recognize Cygwin specially.\n\n 6. A problem in pcre.in for Windows platforms is fixed.\n\n 7. If a pattern was successfully studied, and the -d (or /D) flag was given to\n    pcretest, it used to include the size of the study block as part of its\n    output. Unfortunately, the structure contains a field that has a different\n    size on different hardware architectures. This meant that the tests that\n    showed this size failed. As the block is currently always of a fixed size,\n    this information isn't actually particularly useful in pcretest output, so\n    I have just removed it.\n\n 8. Three pre-processor statements accidentally did not start in column 1.\n    Sadly, there are *still* compilers around that complain, even though\n    standard C has not required this for well over a decade. Sigh.\n\n 9. In pcretest, the code for checking callouts passed small integers in the\n    callout_data field, which is a void * field. However, some picky compilers\n    complained about the casts involved for this on 64-bit systems. Now\n    pcretest passes the address of the small integer instead, which should get\n    rid of the warnings.\n\n10. By default, when in UTF-8 mode, PCRE now checks for valid UTF-8 strings at\n    both compile and run time, and gives an error if an invalid UTF-8 sequence\n    is found. There is a option for disabling this check in cases where the\n    string is known to be correct and/or the maximum performance is wanted.\n\n11. In response to a bug report, I changed one line in Makefile.in from\n\n        -Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \\\n    to\n        -Wl,--out-implib,.libs/@WIN_PREFIX@libpcreposix.dll.a \\\n\n    to look similar to other lines, but I have no way of telling whether this\n    is the right thing to do, as I do not use Windows. No doubt I'll get told\n    if it's wrong...\n\n\nVersion 4.3 21-May-03\n---------------------\n\n1. Two instances of @WIN_PREFIX@ omitted from the Windows targets in the\n   Makefile.\n\n2. Some refactoring to improve the quality of the code:\n\n   (i)   The utf8_table... variables are now declared \"const\".\n\n   (ii)  The code for \\cx, which used the \"case flipping\" table to upper case\n         lower case letters, now just substracts 32. This is ASCII-specific,\n         but the whole concept of \\cx is ASCII-specific, so it seems\n         reasonable.\n\n   (iii) PCRE was using its character types table to recognize decimal and\n         hexadecimal digits in the pattern. This is silly, because it handles\n         only 0-9, a-f, and A-F, but the character types table is locale-\n         specific, which means strange things might happen. A private\n         table is now used for this - though it costs 256 bytes, a table is\n         much faster than multiple explicit tests. Of course, the standard\n         character types table is still used for matching digits in subject\n         strings against \\d.\n\n   (iv)  Strictly, the identifier ESC_t is reserved by POSIX (all identifiers\n         ending in _t are). So I've renamed it as ESC_tee.\n\n3. The first argument for regexec() in the POSIX wrapper should have been\n   defined as \"const\".\n\n4. Changed pcretest to use malloc() for its buffers so that they can be\n   Electric Fenced for debugging.\n\n5. There were several places in the code where, in UTF-8 mode, PCRE would try\n   to read one or more bytes before the start of the subject string. Often this\n   had no effect on PCRE's behaviour, but in some circumstances it could\n   provoke a segmentation fault.\n\n6. A lookbehind at the start of a pattern in UTF-8 mode could also cause PCRE\n   to try to read one or more bytes before the start of the subject string.\n\n7. A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with\n   UTF-8 support could misbehave in various ways if the subject string\n   contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind\n   area. (PCRE was not checking for the UTF-8 mode flag, and trying to move\n   back over UTF-8 characters.)\n\n\nVersion 4.2 14-Apr-03\n---------------------\n\n1. Typo \"#if SUPPORT_UTF8\" instead of \"#ifdef SUPPORT_UTF8\" fixed.\n\n2. Changes to the building process, supplied by Ronald Landheer-Cieslak\n     [ON_WINDOWS]: new variable, \"#\" on non-Windows platforms\n     [NOT_ON_WINDOWS]: new variable, \"#\" on Windows platforms\n     [WIN_PREFIX]: new variable, \"cyg\" for Cygwin\n     * Makefile.in: use autoconf substitution for OBJEXT, EXEEXT, BUILD_OBJEXT\n       and BUILD_EXEEXT\n     Note: automatic setting of the BUILD variables is not yet working\n     set CPPFLAGS and BUILD_CPPFLAGS (but don't use yet) - should be used at\n       compile-time but not at link-time\n     [LINK]: use for linking executables only\n     make different versions for Windows and non-Windows\n     [LINKLIB]: new variable, copy of UNIX-style LINK, used for linking\n       libraries\n     [LINK_FOR_BUILD]: new variable\n     [OBJEXT]: use throughout\n     [EXEEXT]: use throughout\n     <winshared>: new target\n     <wininstall>: new target\n     <dftables.o>: use native compiler\n     <dftables>: use native linker\n     <install>: handle Windows platform correctly\n     <clean>: ditto\n     <check>: ditto\n     copy DLL to top builddir before testing\n\n   As part of these changes, -no-undefined was removed again. This was reported\n   to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea\n   in any case.\n\n3. Some tidies to get rid of compiler warnings:\n\n   . In the match_data structure, match_limit was an unsigned long int, whereas\n     match_call_count was an int. I've made them both unsigned long ints.\n\n   . In pcretest the fact that a const uschar * doesn't automatically cast to\n     a void * provoked a warning.\n\n   . Turning on some more compiler warnings threw up some \"shadow\" variables\n     and a few more missing casts.\n\n4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8\n   option, a class that contained a single character with a value between 128\n   and 255 (e.g. /[\\xFF]/) caused PCRE to crash.\n\n5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8\n   option, a class that contained several characters, but with at least one\n   whose value was between 128 and 255 caused PCRE to crash.\n\n\nVersion 4.1 12-Mar-03\n---------------------\n\n1. Compiling with gcc -pedantic found a couple of places where casts were\nneeded, and a string in dftables.c that was longer than standard compilers are\nrequired to support.\n\n2. Compiling with Sun's compiler found a few more places where the code could\nbe tidied up in order to avoid warnings.\n\n3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the\nfirst of these names is deprecated in the latest Autoconf in favour of the name\nCC_FOR_BUILD, because \"host\" is typically used to mean the system on which the\ncompiled code will be run. I can't find a reference for HOST_CFLAGS, but by\nanalogy I have changed it to CFLAGS_FOR_BUILD.\n\n4. Added -no-undefined to the linking command in the Makefile, because this is\napparently helpful for Windows. To make it work, also added \"-L. -lpcre\" to the\nlinking step for the pcreposix library.\n\n5. PCRE was failing to diagnose the case of two named groups with the same\nname.\n\n6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a\nliteral character that is needed in the subject for a match, and scans along to\nensure that it is present before embarking on the full matching process. This\nsaves time in cases of nested unlimited repeats that are never going to match.\nProblem: the scan can take a lot of time if the subject is very long (e.g.\nmegabytes), thus penalizing straightforward matches. It is now done only if the\namount of subject to be scanned is less than 1000 bytes.\n\n7. A lesser problem with the same optimization is that it was recording the\nfirst character of an anchored pattern as \"needed\", thus provoking a search\nright along the subject, even when the first match of the pattern was going to\nfail. The \"needed\" character is now not set for anchored patterns, unless it\nfollows something in the pattern that is of non-fixed length. Thus, it still\nfulfils its original purpose of finding quick non-matches in cases of nested\nunlimited repeats, but isn't used for simple anchored patterns such as /^abc/.\n\n\nVersion 4.0 17-Feb-03\n---------------------\n\n1. If a comment in an extended regex that started immediately after a meta-item\nextended to the end of string, PCRE compiled incorrect data. This could lead to\nall kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not.\n\n2. Moved to autoconf 2.53 and libtool 1.4.2.\n\n3. Perl 5.8 no longer needs \"use utf8\" for doing UTF-8 things. Consequently,\nthe special perltest8 script is no longer needed - all the tests can be run\nfrom a single perltest script.\n\n4. From 5.004, Perl has not included the VT character (0x0b) in the set defined\nby \\s. It has now been removed in PCRE. This means it isn't recognized as\nwhitespace in /x regexes too, which is the same as Perl. Note that the POSIX\nclass [:space:] *does* include VT, thereby creating a mess.\n\n5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only\nspace and tab.\n\n6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use\nits new features into the main test script, reducing the number of scripts.\n\n7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions\nwere backward compatible, and made the (?i) apply to the whole pattern, as if\n/i were given. Now it behaves more logically, and applies the option setting\nonly to what follows. PCRE has been changed to follow suit. However, if it\nfinds options settings right at the start of the pattern, it extracts them into\nthe global options, as before. Thus, they show up in the info data.\n\n8. Added support for the \\Q...\\E escape sequence. Characters in between are\ntreated as literals. This is slightly different from Perl in that $ and @ are\nalso handled as literals inside the quotes. In Perl, they will cause variable\ninterpolation. Note the following examples:\n\n    Pattern            PCRE matches      Perl matches\n\n    \\Qabc$xyz\\E        abc$xyz           abc followed by the contents of $xyz\n    \\Qabc\\$xyz\\E       abc\\$xyz          abc\\$xyz\n    \\Qabc\\E\\$\\Qxyz\\E   abc$xyz           abc$xyz\n\nFor compatibility with Perl, \\Q...\\E sequences are recognized inside character\nclasses as well as outside them.\n\n9. Re-organized 3 code statements in pcretest to avoid \"overflow in\nfloating-point constant arithmetic\" warnings from a Microsoft compiler. Added a\n(size_t) cast to one statement in pcretest and one in pcreposix to avoid\nsigned/unsigned warnings.\n\n10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o\noption for pcretest, so I've replaced it by a simple function that does just\nthat job.\n\n11. pcregrep was ending with code 0 instead of 2 for the commands \"pcregrep\" or\n\"pcregrep -\".\n\n12. Added \"possessive quantifiers\" ?+, *+, ++, and {,}+ which come from Sun's\nJava package. This provides some syntactic sugar for simple cases of what my\ndocumentation calls \"once-only subpatterns\". A pattern such as x*+ is the same\nas (?>x*). In other words, if what is inside (?>...) is just a single repeated\nitem, you can use this simplified notation. Note that only makes sense with\ngreedy quantifiers. Consequently, the use of the possessive quantifier forces\ngreediness, whatever the setting of the PCRE_UNGREEDY option.\n\n13. A change of greediness default within a pattern was not taking effect at\nthe current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized\nsubpatterns that followed. Patterns like /b+(?U)a+/ worked because the option\nwas abstracted outside.\n\n14. PCRE now supports the \\G assertion. It is true when the current matching\nposition is at the start point of the match. This differs from \\A when the\nstarting offset is non-zero. Used with the /g option of pcretest (or similar\ncode), it works in the same way as it does for Perl's /g option. If all\nalternatives of a regex begin with \\G, the expression is anchored to the start\nmatch position, and the \"anchored\" flag is set in the compiled expression.\n\n15. Some bugs concerning the handling of certain option changes within patterns\nhave been fixed. These applied to options other than (?ims). For example,\n\"a(?x: b c )d\" did not match \"XabcdY\" but did match \"Xa b c dY\". It should have\nbeen the other way round. Some of this was related to change 7 above.\n\n16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX\nfeatures, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/\nand /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports\nPOSIX classes only within a class (e.g. /[[:alpha:]]/).\n\n17. Added support for Perl's \\C escape. This matches one byte, even in UTF8\nmode. Unlike \".\", it always matches newline, whatever the setting of\nPCRE_DOTALL. However, PCRE does not permit \\C to appear in lookbehind\nassertions. Perl allows it, but it doesn't (in general) work because it can't\ncalculate the length of the lookbehind. At least, that's the case for Perl\n5.8.0 - I've been told they are going to document that it doesn't work in\nfuture.\n\n18. Added an error diagnosis for escapes that PCRE does not support: these are\n\\L, \\l, \\N, \\P, \\p, \\U, \\u, and \\X.\n\n19. Although correctly diagnosing a missing ']' in a character class, PCRE was\nreading past the end of the pattern in cases such as /[abcd/.\n\n20. PCRE was getting more memory than necessary for patterns with classes that\ncontained both POSIX named classes and other characters, e.g. /[[:space:]abc/.\n\n21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for\ncompiling PCRE for use with Virtual Pascal.\n\n22. Small fix to the Makefile to make it work properly if the build is done\noutside the source tree.\n\n23. Added a new extension: a condition to go with recursion. If a conditional\nsubpattern starts with (?(R) the \"true\" branch is used if recursion has\nhappened, whereas the \"false\" branch is used only at the top level.\n\n24. When there was a very long string of literal characters (over 255 bytes\nwithout UTF support, over 250 bytes with UTF support), the computation of how\nmuch memory was required could be incorrect, leading to segfaults or other\nstrange effects.\n\n25. PCRE was incorrectly assuming anchoring (either to start of subject or to\nstart of line for a non-DOTALL pattern) when a pattern started with (.*) and\nthere was a subsequent back reference to those brackets. This meant that, for\nexample, /(.*)\\d+\\1/ failed to match \"abc123bc\". Unfortunately, it isn't\npossible to check for precisely this case. All we can do is abandon the\noptimization if .* occurs inside capturing brackets when there are any back\nreferences whatsoever. (See below for a better fix that came later.)\n\n26. The handling of the optimization for finding the first character of a\nnon-anchored pattern, and for finding a character that is required later in the\nmatch were failing in some cases. This didn't break the matching; it just\nfailed to optimize when it could. The way this is done has been re-implemented.\n\n27. Fixed typo in error message for invalid (?R item (it said \"(?p\").\n\n28. Added a new feature that provides some of the functionality that Perl\nprovides with (?{...}). The facility is termed a \"callout\". The way it is done\nin PCRE is for the caller to provide an optional function, by setting\npcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a\nglobal variable. By default it is unset, which disables all calling out. To get\nthe function called, the regex must include (?C) at appropriate points. This\nis, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C).\nThis provides a means of identifying different callout points. When PCRE\nreaches such a point in the regex, if pcre_callout has been set, the external\nfunction is called. It is provided with data in a structure called\npcre_callout_block, which is defined in pcre.h. If the function returns 0,\nmatching continues; if it returns a non-zero value, the match at the current\npoint fails. However, backtracking will occur if possible. [This was changed\nlater and other features added - see item 49 below.]\n\n29. pcretest is upgraded to test the callout functionality. It provides a\ncallout function that displays information. By default, it shows the start of\nthe match and the current position in the text. There are some new data escapes\nto vary what happens:\n\n    \\C+         in addition, show current contents of captured substrings\n    \\C-         do not supply a callout function\n    \\C!n        return 1 when callout number n is reached\n    \\C!n!m      return 1 when callout number n is reached for the mth time\n\n30. If pcregrep was called with the -l option and just a single file name, it\noutput \"<stdin>\" if a match was found, instead of the file name.\n\n31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing\nslots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to\npcre_exec(). This saves a malloc/free per call. The default value of\nPOSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold\nwhen configuring.\n\n32. The default maximum size of a compiled pattern is 64K. There have been a\nfew cases of people hitting this limit. The code now uses macros to handle the\nstoring of links as offsets within the compiled pattern. It defaults to 2-byte\nlinks, but this can be changed to 3 or 4 bytes by --with-link-size when\nconfiguring. Tests 2 and 5 work only with 2-byte links because they output\ndebugging information about compiled patterns.\n\n33. Internal code re-arrangements:\n\n(a) Moved the debugging function for printing out a compiled regex into\n    its own source file (printint.c) and used #include to pull it into\n    pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two\n    separate copies.\n\n(b) Defined the list of op-code names for debugging as a macro in\n    internal.h so that it is next to the definition of the opcodes.\n\n(c) Defined a table of op-code lengths for simpler skipping along compiled\n    code. This is again a macro in internal.h so that it is next to the\n    definition of the opcodes.\n\n34. Added support for recursive calls to individual subpatterns, along the\nlines of Robin Houston's patch (but implemented somewhat differently).\n\n35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to\nallow it to read and process whole directories in Win32. This code was\ncontributed by Lionel Fourquaux; it has not been tested by me.\n\n36. Added support for named subpatterns. The Python syntax (?P<name>...) is\nused to name a group. Names consist of alphanumerics and underscores, and must\nbe unique. Back references use the syntax (?P=name) and recursive calls use\n(?P>name) which is a PCRE extension to the Python extension. Groups still have\nnumbers. The function pcre_fullinfo() can be used after compilation to extract\na name/number map. There are three relevant calls:\n\n  PCRE_INFO_NAMEENTRYSIZE        yields the size of each entry in the map\n  PCRE_INFO_NAMECOUNT            yields the number of entries\n  PCRE_INFO_NAMETABLE            yields a pointer to the map.\n\nThe map is a vector of fixed-size entries. The size of each entry depends on\nthe length of the longest name used. The first two bytes of each entry are the\ngroup number, most significant byte first. There follows the corresponding\nname, zero terminated. The names are in alphabetical order.\n\n37. Make the maximum literal string in the compiled code 250 for the non-UTF-8\ncase instead of 255. Making it the same both with and without UTF-8 support\nmeans that the same test output works with both.\n\n38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid\ncalling malloc() with a zero argument.\n\n39. Change 25 above had to resort to a heavy-handed test for the .* anchoring\noptimization. I've improved things by keeping a bitmap of backreferences with\nnumbers 1-31 so that if .* occurs inside capturing brackets that are not in\nfact referenced, the optimization can be applied. It is unlikely that a\nrelevant occurrence of .* (i.e. one which might indicate anchoring or forcing\nthe match to follow \\n) will appear inside brackets with a number greater than\n31, but if it does, any back reference > 31 suppresses the optimization.\n\n40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect\nof disabling numbered capturing parentheses. Any opening parenthesis that is\nnot followed by ? behaves as if it were followed by ?: but named parentheses\ncan still be used for capturing (and they will acquire numbers in the usual\nway).\n\n41. Redesigned the return codes from the match() function into yes/no/error so\nthat errors can be passed back from deep inside the nested calls. A malloc\nfailure while inside a recursive subpattern call now causes the\nPCRE_ERROR_NOMEMORY return instead of quietly going wrong.\n\n42. It is now possible to set a limit on the number of times the match()\nfunction is called in a call to pcre_exec(). This facility makes it possible to\nlimit the amount of recursion and backtracking, though not in a directly\nobvious way, because the match() function is used in a number of different\ncircumstances. The count starts from zero for each position in the subject\nstring (for non-anchored patterns). The default limit is, for compatibility, a\nlarge number, namely 10 000 000. You can change this in two ways:\n\n(a) When configuring PCRE before making, you can use --with-match-limit=n\n    to set a default value for the compiled library.\n\n(b) For each call to pcre_exec(), you can pass a pcre_extra block in which\n    a different value is set. See 45 below.\n\nIf the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.\n\n43. Added a new function pcre_config(int, void *) to enable run-time extraction\nof things that can be changed at compile time. The first argument specifies\nwhat is wanted and the second points to where the information is to be placed.\nThe current list of available information is:\n\n  PCRE_CONFIG_UTF8\n\nThe output is an integer that is set to one if UTF-8 support is available;\notherwise it is set to zero.\n\n  PCRE_CONFIG_NEWLINE\n\nThe output is an integer that it set to the value of the code that is used for\nnewline. It is either LF (10) or CR (13).\n\n  PCRE_CONFIG_LINK_SIZE\n\nThe output is an integer that contains the number of bytes used for internal\nlinkage in compiled expressions. The value is 2, 3, or 4. See item 32 above.\n\n  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n\nThe output is an integer that contains the threshold above which the POSIX\ninterface uses malloc() for output vectors. See item 31 above.\n\n  PCRE_CONFIG_MATCH_LIMIT\n\nThe output is an unsigned integer that contains the default limit of the number\nof match() calls in a pcre_exec() execution. See 42 above.\n\n44. pcretest has been upgraded by the addition of the -C option. This causes it\nto extract all the available output from the new pcre_config() function, and to\noutput it. The program then exits immediately.\n\n45. A need has arisen to pass over additional data with calls to pcre_exec() in\norder to support additional features. One way would have been to define\npcre_exec2() (for example) with extra arguments, but this would not have been\nextensible, and would also have required all calls to the original function to\nbe mapped to the new one. Instead, I have chosen to extend the mechanism that\nis used for passing in \"extra\" data from pcre_study().\n\nThe pcre_extra structure is now exposed and defined in pcre.h. It currently\ncontains the following fields:\n\n  flags         a bitmap indicating which of the following fields are set\n  study_data    opaque data from pcre_study()\n  match_limit   a way of specifying a limit on match() calls for a specific\n                  call to pcre_exec()\n  callout_data  data for callouts (see 49 below)\n\nThe flag bits are also defined in pcre.h, and are\n\n  PCRE_EXTRA_STUDY_DATA\n  PCRE_EXTRA_MATCH_LIMIT\n  PCRE_EXTRA_CALLOUT_DATA\n\nThe pcre_study() function now returns one of these new pcre_extra blocks, with\nthe actual study data pointed to by the study_data field, and the\nPCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as\nbefore. That is, this change is entirely upwards-compatible and requires no\nchange to existing code.\n\nIf you want to pass in additional data to pcre_exec(), you can either place it\nin a pcre_extra block provided by pcre_study(), or create your own pcre_extra\nblock.\n\n46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a\ndata string contains the escape sequence \\M, pcretest calls pcre_exec() several\ntimes with different match limits, until it finds the minimum value needed for\npcre_exec() to complete. The value is then output. This can be instructive; for\nmost simple matches the number is quite small, but for pathological cases it\ngets very large very quickly.\n\n47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It\nreturns the size of the data block pointed to by the study_data field in a\npcre_extra block, that is, the value that was passed as the argument to\npcre_malloc() when PCRE was getting memory in which to place the information\ncreated by pcre_study(). The fourth argument should point to a size_t variable.\npcretest has been extended so that this information is shown after a successful\npcre_study() call when information about the compiled regex is being displayed.\n\n48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR)\nbecause what follows is always an absolute path. (Later: it turns out that this\nis more than cosmetic for MinGW, because it doesn't like empty path\ncomponents.)\n\n49. Some changes have been made to the callout feature (see 28 above):\n\n(i)  A callout function now has three choices for what it returns:\n\n       0  =>  success, carry on matching\n     > 0  =>  failure at this point, but backtrack if possible\n     < 0  =>  serious error, return this value from pcre_exec()\n\n     Negative values should normally be chosen from the set of PCRE_ERROR_xxx\n     values. In particular, returning PCRE_ERROR_NOMATCH forces a standard\n     \"match failed\" error. The error number PCRE_ERROR_CALLOUT is reserved for\n     use by callout functions. It will never be used by PCRE itself.\n\n(ii) The pcre_extra structure (see 45 above) has a void * field called\n     callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The\n     pcre_callout_block structure has a field of the same name. The contents of\n     the field passed in the pcre_extra structure are passed to the callout\n     function in the corresponding field in the callout block. This makes it\n     easier to use the same callout-containing regex from multiple threads. For\n     testing, the pcretest program has a new data escape\n\n       \\C*n        pass the number n (may be negative) as callout_data\n\n     If the callout function in pcretest receives a non-zero value as\n     callout_data, it returns that value.\n\n50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also,\nthere were some redundant $(CFLAGS) in commands that are now specified as\n$(LINK), which already includes $(CFLAGS).\n\n51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE\nhas been compiled with UTF-8 support *and* pcre_compile() has been compiled\nwith the PCRE_UTF8 flag. Patterns that are compiled without that flag assume\none-byte characters throughout. Note that case-insensitive matching applies\nonly to characters whose values are less than 256. PCRE doesn't support the\nnotion of cases for higher-valued characters.\n\n(i)   A character class whose characters are all within 0-255 is handled as\n      a bit map, and the map is inverted for negative classes. Previously, a\n      character > 255 always failed to match such a class; however it should\n      match if the class was a negative one (e.g. [^ab]). This has been fixed.\n\n(ii)  A negated character class with a single character < 255 is coded as\n      \"not this character\" (OP_NOT). This wasn't working properly when the test\n      character was multibyte, either singly or repeated.\n\n(iii) Repeats of multibyte characters are now handled correctly in UTF-8\n      mode, for example: \\x{100}{2,3}.\n\n(iv)  The character escapes \\b, \\B, \\d, \\D, \\s, \\S, \\w, and \\W (either\n      singly or repeated) now correctly test multibyte characters. However,\n      PCRE doesn't recognize any characters with values greater than 255 as\n      digits, spaces, or word characters. Such characters always match \\D, \\S,\n      and \\W, and never match \\d, \\s, or \\w.\n\n(v)   Classes may now contain characters and character ranges with values\n      greater than 255. For example: [ab\\x{100}-\\x{400}].\n\n(vi)  pcregrep now has a --utf-8 option (synonym -u) which makes it call\n      PCRE in UTF-8 mode.\n\n52. The info request value PCRE_INFO_FIRSTCHAR has been renamed\nPCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is\nretained for backwards compatibility. (Note that LASTLITERAL is also a byte\nvalue.)\n\n53. The single man page has become too large. I have therefore split it up into\na number of separate man pages. These also give rise to individual HTML pages;\nthese are now put in a separate directory, and there is an index.html page that\nlists them all. Some hyperlinking between the pages has been installed.\n\n54. Added convenience functions for handling named capturing parentheses.\n\n55. Unknown escapes inside character classes (e.g. [\\M]) and escapes that\naren't interpreted therein (e.g. [\\C]) are literals in Perl. This is now also\ntrue in PCRE, except when the PCRE_EXTENDED option is set, in which case they\nare faulted.\n\n56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when\ncalling configure. These values are used when compiling the dftables.c program\nwhich is run to generate the source of the default character tables. They\ndefault to the values of CC and CFLAGS. If you are cross-compiling PCRE,\nyou will need to set these values.\n\n57. Updated the building process for Windows DLL, as provided by Fred Cox.\n\n\nVersion 3.9 02-Jan-02\n---------------------\n\n1. A bit of extraneous text had somehow crept into the pcregrep documentation.\n\n2. If --disable-static was given, the building process failed when trying to\nbuild pcretest and pcregrep. (For some reason it was using libtool to compile\nthem, which is not right, as they aren't part of the library.)\n\n\nVersion 3.8 18-Dec-01\n---------------------\n\n1. The experimental UTF-8 code was completely screwed up. It was packing the\nbytes in the wrong order. How dumb can you get?\n\n\nVersion 3.7 29-Oct-01\n---------------------\n\n1. In updating pcretest to check change 1 of version 3.6, I screwed up.\nThis caused pcretest, when used on the test data, to segfault. Unfortunately,\nthis didn't happen under Solaris 8, where I normally test things.\n\n2. The Makefile had to be changed to make it work on BSD systems, where 'make'\ndoesn't seem to recognize that ./xxx and xxx are the same file. (This entry\nisn't in ChangeLog distributed with 3.7 because I forgot when I hastily made\nthis fix an hour or so after the initial 3.7 release.)\n\n\nVersion 3.6 23-Oct-01\n---------------------\n\n1. Crashed with /(sens|respons)e and \\1ibility/ and \"sense and sensibility\" if\noffsets passed as NULL with zero offset count.\n\n2. The config.guess and config.sub files had not been updated when I moved to\nthe latest autoconf.\n\n\nVersion 3.5 15-Aug-01\n---------------------\n\n1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that\nhad been forgotten.\n\n2. By using declared but undefined structures, we can avoid using \"void\"\ndefinitions in pcre.h while keeping the internal definitions of the structures\nprivate.\n\n3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a\nuser point of view, this means that both static and shared libraries are built\nby default, but this can be individually controlled. More of the work of\nhandling this static/shared cases is now inside libtool instead of PCRE's make\nfile.\n\n4. The pcretest utility is now installed along with pcregrep because it is\nuseful for users (to test regexs) and by doing this, it automatically gets\nrelinked by libtool. The documentation has been turned into a man page, so\nthere are now .1, .txt, and .html versions in /doc.\n\n5. Upgrades to pcregrep:\n   (i)   Added long-form option names like gnu grep.\n   (ii)  Added --help to list all options with an explanatory phrase.\n   (iii) Added -r, --recursive to recurse into sub-directories.\n   (iv)  Added -f, --file to read patterns from a file.\n\n6. pcre_exec() was referring to its \"code\" argument before testing that\nargument for NULL (and giving an error if it was NULL).\n\n7. Upgraded Makefile.in to allow for compiling in a different directory from\nthe source directory.\n\n8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the\noptions bits, the pointer it was passed was to an int instead of to an unsigned\nlong int. This mattered only on 64-bit systems.\n\n9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is\ngenerated) instead of pcre.in, which it its source. Also made the same change\nin several of the .c files.\n\n10. A new release of gcc defines printf() as a macro, which broke pcretest\nbecause it had an ifdef in the middle of a string argument for printf(). Fixed\nby using separate calls to printf().\n\n11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure\nscript, to force use of CR or LF instead of \\n in the source. On non-Unix\nsystems, the value can be set in config.h.\n\n12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an\nabsolute limit. Changed the text of the error message to make this clear, and\nlikewise updated the man page.\n\n13. The limit of 99 on the number of capturing subpatterns has been removed.\nThe new limit is 65535, which I hope will not be a \"real\" limit.\n\n\nVersion 3.4 22-Aug-00\n---------------------\n\n1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.\n\n2. Diagnose condition (?(0) as an error instead of crashing on matching.\n\n\nVersion 3.3 01-Aug-00\n---------------------\n\n1. If an octal character was given, but the value was greater than \\377, it\nwas not getting masked to the least significant bits, as documented. This could\nlead to crashes in some systems.\n\n2. Perl 5.6 (if not earlier versions) accepts classes like [a-\\d] and treats\nthe hyphen as a literal. PCRE used to give an error; it now behaves like Perl.\n\n3. Added the functions pcre_free_substring() and pcre_free_substring_list().\nThese just pass their arguments on to (pcre_free)(), but they are provided\nbecause some uses of PCRE bind it to non-C systems that can call its functions,\nbut cannot call free() or pcre_free() directly.\n\n4. Add \"make test\" as a synonym for \"make check\". Corrected some comments in\nthe Makefile.\n\n5. Add $(DESTDIR)/ in front of all the paths in the \"install\" target in the\nMakefile.\n\n6. Changed the name of pgrep to pcregrep, because Solaris has introduced a\ncommand called pgrep for grepping around the active processes.\n\n7. Added the beginnings of support for UTF-8 character strings.\n\n8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and\nRANLIB to ./ltconfig so that they are used by libtool. I think these are all\nthe relevant ones. (AR is not passed because ./ltconfig does its own figuring\nout for the ar command.)\n\n\nVersion 3.2 12-May-00\n---------------------\n\nThis is purely a bug fixing release.\n\n1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead\nof ZA. This was just one example of several cases that could provoke this bug,\nwhich was introduced by change 9 of version 2.00. The code for breaking\ninfinite loops after an iteration that matches an empty string was't working\ncorrectly.\n\n2. The pcretest program was not imitating Perl correctly for the pattern /a*/g\nwhen matched against abbab (for example). After matching an empty string, it\nwasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this\ncaused it to match further down the string than it should.\n\n3. The code contained an inclusion of sys/types.h. It isn't clear why this\nwas there because it doesn't seem to be needed, and it causes trouble on some\nsystems, as it is not a Standard C header. It has been removed.\n\n4. Made 4 silly changes to the source to avoid stupid compiler warnings that\nwere reported on the Macintosh. The changes were from\n\n  while ((c = *(++ptr)) != 0 && c != '\\n');\nto\n  while ((c = *(++ptr)) != 0 && c != '\\n') ;\n\nTotally extraordinary, but if that's what it takes...\n\n5. PCRE is being used in one environment where neither memmove() nor bcopy() is\navailable. Added HAVE_BCOPY and an autoconf test for it; if neither\nHAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which\nassumes the way PCRE uses memmove() (always moving upwards).\n\n6. PCRE is being used in one environment where strchr() is not available. There\nwas only one use in pcre.c, and writing it out to avoid strchr() probably gives\nfaster code anyway.\n\n\nVersion 3.1 09-Feb-00\n---------------------\n\nThe only change in this release is the fixing of some bugs in Makefile.in for\nthe \"install\" target:\n\n(1) It was failing to install pcreposix.h.\n\n(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.\n\n\nVersion 3.0 01-Feb-00\n---------------------\n\n1. Add support for the /+ modifier to perltest (to output $` like it does in\npcretest).\n\n2. Add support for the /g modifier to perltest.\n\n3. Fix pcretest so that it behaves even more like Perl for /g when the pattern\nmatches null strings.\n\n4. Fix perltest so that it doesn't do unwanted things when fed an empty\npattern. Perl treats empty patterns specially - it reuses the most recent\npattern, which is not what we want. Replace // by /(?#)/ in order to avoid this\neffect.\n\n5. The POSIX interface was broken in that it was just handing over the POSIX\ncaptured string vector to pcre_exec(), but (since release 2.00) PCRE has\nrequired a bigger vector, with some working space on the end. This means that\nthe POSIX wrapper now has to get and free some memory, and copy the results.\n\n6. Added some simple autoconf support, placing the test data and the\ndocumentation in separate directories, re-organizing some of the\ninformation files, and making it build pcre-config (a GNU standard). Also added\nlibtool support for building PCRE as a shared library, which is now the\ndefault.\n\n7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and\n09 are not valid octal constants. Single digits will be used for minor values\nless than 10.\n\n8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that\nexisting programs that set these in the POSIX interface can use PCRE without\nmodification.\n\n9. Added a new function, pcre_fullinfo() with an extensible interface. It can\nreturn all that pcre_info() returns, plus additional data. The pcre_info()\nfunction is retained for compatibility, but is considered to be obsolete.\n\n10. Added experimental recursion feature (?R) to handle one common case that\nPerl 5.6 will be able to do with (?p{...}).\n\n11. Added support for POSIX character classes like [:alpha:], which Perl is\nadopting.\n\n\nVersion 2.08 31-Aug-99\n----------------------\n\n1. When startoffset was not zero and the pattern began with \".*\", PCRE was not\ntrying to match at the startoffset position, but instead was moving forward to\nthe next newline as if a previous match had failed.\n\n2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,\nand could get into a loop if a null string was matched other than at the start\nof the subject.\n\n3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can\nbe distinguished at compile time, and for completeness also added PCRE_DATE.\n\n5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL\nin GnuWin32 environments.\n\n\nVersion 2.07 29-Jul-99\n----------------------\n\n1. The documentation is now supplied in plain text form and HTML as well as in\nthe form of man page sources.\n\n2. C++ compilers don't like assigning (void *) values to other pointer types.\nIn particular this affects malloc(). Although there is no problem in Standard\nC, I've put in casts to keep C++ compilers happy.\n\n3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call\nshould be (const char *).\n\n4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may\nbe useful for non-Unix systems who don't want to bother with the POSIX stuff.\nHowever, I haven't made this a standard facility. The documentation doesn't\nmention it, and the Makefile doesn't support it.\n\n5. The Makefile now contains an \"install\" target, with editable destinations at\nthe top of the file. The pcretest program is not installed.\n\n6. pgrep -V now gives the PCRE version number and date.\n\n7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was\ncausing the entire string to be ignored, instead of just the last character.\n\n8. If a pattern like /\"([^\\\\\"]+|\\\\.)*\"/ is applied in the normal way to a\nnon-matching string, it can take a very, very long time, even for strings of\nquite modest length, because of the nested recursion. PCRE now does better in\nsome of these cases. It does this by remembering the last required literal\ncharacter in the pattern, and pre-searching the subject to ensure it is present\nbefore running the real match. In other words, it applies a heuristic to detect\nsome types of certain failure quickly, and in the above example, if presented\nwith a string that has no trailing \" it gives \"no match\" very quickly.\n\n9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;\nother alternatives are tried instead.\n\n\nVersion 2.06 09-Jun-99\n----------------------\n\n1. Change pcretest's output for amount of store used to show just the code\nspace, because the remainder (the data block) varies in size between 32-bit and\n64-bit systems.\n\n2. Added an extra argument to pcre_exec() to supply an offset in the subject to\nstart matching at. This allows lookbehinds to work when searching for multiple\noccurrences in a string.\n\n3. Added additional options to pcretest for testing multiple occurrences:\n\n   /+   outputs the rest of the string that follows a match\n   /g   loops for multiple occurrences, using the new startoffset argument\n   /G   loops for multiple occurrences by passing an incremented pointer\n\n4. PCRE wasn't doing the \"first character\" optimization for patterns starting\nwith \\b or \\B, though it was doing it for other lookbehind assertions. That is,\nit wasn't noticing that a match for a pattern such as /\\bxyz/ has to start with\nthe letter 'x'. On long subject strings, this gives a significant speed-up.\n\n\nVersion 2.05 21-Apr-99\n----------------------\n\n1. Changed the type of magic_number from int to long int so that it works\nproperly on 16-bit systems.\n\n2. Fixed a bug which caused patterns starting with .* not to work correctly\nwhen the subject string contained newline characters. PCRE was assuming\nanchoring for such patterns in all cases, which is not correct because .* will\nnot pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if\nDOTALL is set at top level; otherwise it knows that patterns starting with .*\nmust be retried after every newline in the subject.\n\n\nVersion 2.04 18-Feb-99\n----------------------\n\n1. For parenthesized subpatterns with repeats whose minimum was zero, the\ncomputation of the store needed to hold the pattern was incorrect (too large).\nIf such patterns were nested a few deep, this could multiply and become a real\nproblem.\n\n2. Added /M option to pcretest to show the memory requirement of a specific\npattern. Made -m a synonym of -s (which does this globally) for compatibility.\n\n3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being\ncompiled in such a way that the backtracking after subsequent failure was\npessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of\n((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.\n\n\nVersion 2.03 02-Feb-99\n----------------------\n\n1. Fixed typo and small mistake in man page.\n\n2. Added 4th condition (GPL supersedes if conflict) and created separate\nLICENCE file containing the conditions.\n\n3. Updated pcretest so that patterns such as /abc\\/def/ work like they do in\nPerl, that is the internal \\ allows the delimiter to be included in the\npattern. Locked out the use of \\ as a delimiter. If \\ immediately follows\nthe final delimiter, add \\ to the end of the pattern (to test the error).\n\n4. Added the convenience functions for extracting substrings after a successful\nmatch. Updated pcretest to make it able to test these functions.\n\n\nVersion 2.02 14-Jan-99\n----------------------\n\n1. Initialized the working variables associated with each extraction so that\ntheir saving and restoring doesn't refer to uninitialized store.\n\n2. Put dummy code into study.c in order to trick the optimizer of the IBM C\ncompiler for OS/2 into generating correct code. Apparently IBM isn't going to\nfix the problem.\n\n3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution\ncalls, and wasn't printing the correct value for compiling calls. Increased the\ndefault value of LOOPREPEAT, and the number of significant figures in the\ntimes.\n\n4. Changed \"/bin/rm\" in the Makefile to \"-rm\" so it works on Windows NT.\n\n5. Renamed \"deftables\" as \"dftables\" to get it down to 8 characters, to avoid\na building problem on Windows NT with a FAT file system.\n\n\nVersion 2.01 21-Oct-98\n----------------------\n\n1. Changed the API for pcre_compile() to allow for the provision of a pointer\nto character tables built by pcre_maketables() in the current locale. If NULL\nis passed, the default tables are used.\n\n\nVersion 2.00 24-Sep-98\n----------------------\n\n1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable\nit any more.\n\n2. Allow quantification of (?>) groups, and make it work correctly.\n\n3. The first character computation wasn't working for (?>) groups.\n\n4. Correct the implementation of \\Z (it is permitted to match on the \\n at the\nend of the subject) and add 5.005's \\z, which really does match only at the\nvery end of the subject.\n\n5. Remove the \\X \"cut\" facility; Perl doesn't have it, and (?> is neater.\n\n6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and\nDOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005\nlocalized options. All options to pcre_study() were also removed.\n\n7. Add other new features from 5.005:\n\n   $(?<=           positive lookbehind\n   $(?<!           negative lookbehind\n   (?imsx-imsx)    added the unsetting capability\n                   such a setting is global if at outer level; local otherwise\n   (?imsx-imsx:)   non-capturing groups with option setting\n   (?(cond)re|re)  conditional pattern matching\n\n   A backreference to itself in a repeated group matches the previous\n   captured string.\n\n8. General tidying up of studying (both automatic and via \"study\")\nconsequential on the addition of new assertions.\n\n9. As in 5.005, unlimited repeated groups that could match an empty substring\nare no longer faulted at compile time. Instead, the loop is forcibly broken at\nruntime if any iteration does actually match an empty substring.\n\n10. Include the RunTest script in the distribution.\n\n11. Added tests from the Perl 5.005_02 distribution. This showed up a few\ndiscrepancies, some of which were old and were also with respect to 5.004. They\nhave now been fixed.\n\n\nVersion 1.09 28-Apr-98\n----------------------\n\n1. A negated single character class followed by a quantifier with a minimum\nvalue of one (e.g.  [^x]{1,6}  ) was not compiled correctly. This could lead to\nprogram crashes, or just wrong answers. This did not apply to negated classes\ncontaining more than one character, or to minima other than one.\n\n\nVersion 1.08 27-Mar-98\n----------------------\n\n1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.\n\n2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The\nlatter must appear before anything that relies on it in the pattern.\n\n\nVersion 1.07 16-Feb-98\n----------------------\n\n1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited\nrepeat of a potentially empty string).\n\n\nVersion 1.06 23-Jan-98\n----------------------\n\n1. Added Markus Oberhumer's little patches for C++.\n\n2. Literal strings longer than 255 characters were broken.\n\n\nVersion 1.05 23-Dec-97\n----------------------\n\n1. Negated character classes containing more than one character were failing if\nPCRE_CASELESS was set at run time.\n\n\nVersion 1.04 19-Dec-97\n----------------------\n\n1. Corrected the man page, where some \"const\" qualifiers had been omitted.\n\n2. Made debugging output print \"{0,xxx}\" instead of just \"{,xxx}\" to agree with\ninput syntax.\n\n3. Fixed memory leak which occurred when a regex with back references was\nmatched with an offsets vector that wasn't big enough. The temporary memory\nthat is used in this case wasn't being freed if the match failed.\n\n4. Tidied pcretest to ensure it frees memory that it gets.\n\n5. Temporary memory was being obtained in the case where the passed offsets\nvector was exactly big enough.\n\n6. Corrected definition of offsetof() from change 5 below.\n\n7. I had screwed up change 6 below and broken the rules for the use of\nsetjmp(). Now fixed.\n\n\nVersion 1.03 18-Dec-97\n----------------------\n\n1. A erroneous regex with a missing opening parenthesis was correctly\ndiagnosed, but PCRE attempted to access brastack[-1], which could cause crashes\non some systems.\n\n2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because\nit was reported that one broken compiler failed on the former because \"code\" is\nalso an independent variable.\n\n3. The erroneous regex a[]b caused an array overrun reference.\n\n4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not\nfail on data ending with that character. (It was going on too far, and checking\nthe next character, typically a binary zero.) This was specific to the\noptimized code for single-character negative classes.\n\n5. Added a contributed patch from the TIN world which does the following:\n\n  + Add an undef for memmove, in case the the system defines a macro for it.\n\n  + Add a definition of offsetof(), in case there isn't one. (I don't know\n    the reason behind this - offsetof() is part of the ANSI standard - but\n    it does no harm).\n\n  + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating\n    most of the places where whitespace preceded '#'. I have given up and\n    allowed the remaining 2 cases to be at the margin.\n\n  + Rename some variables in pcre to eliminate shadowing. This seems very\n    pedantic, but does no harm, of course.\n\n6. Moved the call to setjmp() into its own function, to get rid of warnings\nfrom gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.\n\n7. Constructs such as \\d{8,} were compiling into the equivalent of\n\\d{8}\\d{0,65527} instead of \\d{8}\\d* which didn't make much difference to the\noutcome, but in this particular case used more store than had been allocated,\nwhich caused the bug to be discovered because it threw up an internal error.\n\n8. The debugging code in both pcre and pcretest for outputting the compiled\nform of a regex was going wrong in the case of back references followed by\ncurly-bracketed repeats.\n\n\nVersion 1.02 12-Dec-97\n----------------------\n\n1. Typos in pcre.3 and comments in the source fixed.\n\n2. Applied a contributed patch to get rid of places where it used to remove\n'const' from variables, and fixed some signed/unsigned and uninitialized\nvariable warnings.\n\n3. Added the \"runtest\" target to Makefile.\n\n4. Set default compiler flag to -O2 rather than just -O.\n\n\nVersion 1.01 19-Nov-97\n----------------------\n\n1. PCRE was failing to diagnose unlimited repeat of empty string for patterns\nlike /([ab]*)*/, that is, for classes with more than one character in them.\n\n2. Likewise, it wasn't diagnosing patterns with \"once-only\" subpatterns, such\nas /((?>a*))*/ (a PCRE_EXTRA facility).\n\n\nVersion 1.00 18-Nov-97\n----------------------\n\n1. Added compile-time macros to support systems such as SunOS4 which don't have\nmemmove() or strerror() but have other things that can be used instead.\n\n2. Arranged that \"make clean\" removes the executables.\n\n\nVersion 0.99 27-Oct-97\n----------------------\n\n1. Fixed bug in code for optimizing classes with only one character. It was\ninitializing a 32-byte map regardless, which could cause it to run off the end\nof the memory it had got.\n\n2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.\n\n\nVersion 0.98 22-Oct-97\n----------------------\n\n1. Fixed bug in code for handling temporary memory usage when there are more\nback references than supplied space in the ovector. This could cause segfaults.\n\n\nVersion 0.97 21-Oct-97\n----------------------\n\n1. Added the \\X \"cut\" facility, conditional on PCRE_EXTRA.\n\n2. Optimized negated single characters not to use a bit map.\n\n3. Brought error texts together as macro definitions; clarified some of them;\nfixed one that was wrong - it said \"range out of order\" when it meant \"invalid\nescape sequence\".\n\n4. Changed some char * arguments to const char *.\n\n5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).\n\n6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in\npcretest.\n\n\nVersion 0.96 16-Oct-97\n----------------------\n\n1. Added a simple \"pgrep\" utility to the distribution.\n\n2. Fixed an incompatibility with Perl: \"{\" is now treated as a normal character\nunless it appears in one of the precise forms \"{ddd}\", \"{ddd,}\", or \"{ddd,ddd}\"\nwhere \"ddd\" means \"one or more decimal digits\".\n\n3. Fixed serious bug. If a pattern had a back reference, but the call to\npcre_exec() didn't supply a large enough ovector to record the related\nidentifying subpattern, the match always failed. PCRE now remembers the number\nof the largest back reference, and gets some temporary memory in which to save\nthe offsets during matching if necessary, in order to ensure that\nbackreferences always work.\n\n4. Increased the compatibility with Perl in a number of ways:\n\n  (a) . no longer matches \\n by default; an option PCRE_DOTALL is provided\n      to request this handling. The option can be set at compile or exec time.\n\n  (b) $ matches before a terminating newline by default; an option\n      PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline\n      mode). The option can be set at compile or exec time.\n\n  (c) The handling of \\ followed by a digit other than 0 is now supposed to be\n      the same as Perl's. If the decimal number it represents is less than 10\n      or there aren't that many previous left capturing parentheses, an octal\n      escape is read. Inside a character class, it's always an octal escape,\n      even if it is a single digit.\n\n  (d) An escaped but undefined alphabetic character is taken as a literal,\n      unless PCRE_EXTRA is set. Currently this just reserves the remaining\n      escapes.\n\n  (e) {0} is now permitted. (The previous item is removed from the compiled\n      pattern).\n\n5. Changed all the names of code files so that the basic parts are no longer\nthan 10 characters, and abolished the teeny \"globals.c\" file.\n\n6. Changed the handling of character classes; they are now done with a 32-byte\nbit map always.\n\n7. Added the -d and /D options to pcretest to make it possible to look at the\ninternals of compilation without having to recompile pcre.\n\n\nVersion 0.95 23-Sep-97\n----------------------\n\n1. Fixed bug in pre-pass concerning escaped \"normal\" characters such as \\x5c or\n\\x20 at the start of a run of normal characters. These were being treated as\nreal characters, instead of the source characters being re-checked.\n\n\nVersion 0.94 18-Sep-97\n----------------------\n\n1. The functions are now thread-safe, with the caveat that the global variables\ncontaining pointers to malloc() and free() or alternative functions are the\nsame for all threads.\n\n2. Get pcre_study() to generate a bitmap of initial characters for non-\nanchored patterns when this is possible, and use it if passed to pcre_exec().\n\n\nVersion 0.93 15-Sep-97\n----------------------\n\n1. /(b)|(:+)/ was computing an incorrect first character.\n\n2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),\nbut not actually doing anything yet.\n\n3. Treat \"-\" characters in classes that cannot be part of ranges as literals,\nas Perl does (e.g. [-az] or [az-]).\n\n4. Set the anchored flag if a branch starts with .* or .*? because that tests\nall possible positions.\n\n5. Split up into different modules to avoid including unneeded functions in a\ncompiled binary. However, compile and exec are still in one module. The \"study\"\nfunction is split off.\n\n6. The character tables are now in a separate module whose source is generated\nby an auxiliary program - but can then be edited by hand if required. There are\nnow no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or\ntoupper() in the code.\n\n7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and\nmake them global. Abolish the function for setting them, as the caller can now\nset them directly.\n\n\nVersion 0.92 11-Sep-97\n----------------------\n\n1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character\n(e.g. /a{1,3}/) was broken (I mis-optimized it).\n\n2. Caseless matching was not working in character classes if the characters in\nthe pattern were in upper case.\n\n3. Make ranges like [W-c] work in the same way as Perl for caseless matching.\n\n4. Make PCRE_ANCHORED public and accept as a compile option.\n\n5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and\nPCRE_CASELESS at run time. Add escapes \\A and \\I to pcretest to cause it to\npass them.\n\n6. Give an error if bad option bits passed at compile or run time.\n\n7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \\M to\npcretest to cause it to pass that flag.\n\n8. Add pcre_info(), to get the number of identifying subpatterns, the stored\noptions, and the first character, if set.\n\n9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.\n\n\nVersion 0.91 10-Sep-97\n----------------------\n\n1. PCRE was failing to diagnose unlimited repeats of subpatterns that could\nmatch the empty string as in /(a*)*/. It was looping and ultimately crashing.\n\n2. PCRE was looping on encountering an indefinitely repeated back reference to\na subpattern that had matched an empty string, e.g. /(a|)\\1*/. It now does what\nPerl does - treats the match as successful.\n\n****\n"
  },
  {
    "path": "src/pcre/CheckMan",
    "content": "#! /usr/bin/perl\n\n# A script to scan PCRE's man pages to check for typos in the control\n# sequences. I use only a small set of the available repertoire, so it is \n# straightforward to check that nothing else has slipped in by mistake. This\n# script should be called in the doc directory.\n\n$yield = 0;\n\nwhile (scalar(@ARGV) > 0)\n  {\n  $line = 0; \n  $file = shift @ARGV;\n    \n  open (IN, $file) || die \"Failed to open $file\\n\";\n  \n  while (<IN>)\n    {  \n    $line++; \n    if (/^\\s*$/)\n      {\n      printf \"Empty line $line of $file\\n\";\n      $yield = 1;  \n      }   \n    elsif (/^\\./)\n      {\n      if (!/^\\.\\s*$|\n            ^\\.B\\s+\\S| \n            ^\\.TH\\s\\S|\n            ^\\.SH\\s\\S|\n            ^\\.SS\\s\\S|\n            ^\\.TP(?:\\s?\\d+)?\\s*$|\n            ^\\.SM\\s*$|\n            ^\\.br\\s*$| \n            ^\\.rs\\s*$| \n            ^\\.sp\\s*$| \n            ^\\.nf\\s*$| \n            ^\\.fi\\s*$| \n            ^\\.P\\s*$| \n            ^\\.PP\\s*$| \n            ^\\.\\\\\"(?:\\ HREF)?\\s*$|\n            ^\\.\\\\\"\\sHTML\\s<a\\shref=\"[^\"]+?\">\\s*$|\n            ^\\.\\\\\"\\sHTML\\s<a\\sname=\"[^\"]+?\"><\\/a>\\s*$|\n            ^\\.\\\\\"\\s<\\/a>\\s*$|\n            ^\\.\\\\\"\\sJOINSH\\s*$|\n            ^\\.\\\\\"\\sJOIN\\s*$/x  \n         )\n        {\n        printf \"Bad control line $line of $file\\n\";\n        $yield = 1;\n        }\n      }\n    else\n      {\n      if (/\\\\[^ef]|\\\\f[^IBP]/)\n        {\n        printf \"Bad backslash in line $line of $file\\n\";  \n        $yield = 1; \n        } \n      }   \n    }\n     \n  close(IN);   \n  }\n  \nexit $yield;\n# End  \n"
  },
  {
    "path": "src/pcre/CleanTxt",
    "content": "#! /usr/bin/perl -w\n\n# Script to take the output of nroff -man and remove all the backspacing and\n# the page footers and the screen commands etc so that it is more usefully\n# readable online. In fact, in the latest nroff, intermediate footers don't\n# seem to be generated any more.\n\n$blankcount = 0;\n$lastwascut = 0;\n$firstheader = 1;\n\n# Input on STDIN; output to STDOUT.\n\nwhile (<STDIN>)\n  {\n  s/\\x1b\\[\\d+m//g;   # Remove screen controls \"ESC [ number m\"\n  s/.\\x8//g;         # Remove \"char, backspace\"\n\n  # Handle header lines. Retain only the first one we encounter, but remove\n  # the blank line that follows. Any others (e.g. at end of document) and the\n  # following blank line are dropped.\n\n  if (/^PCRE(\\w*)\\(([13])\\)\\s+PCRE\\1\\(\\2\\)$/)\n    {\n    if ($firstheader)\n      {\n      $firstheader = 0;\n      print;\n      $lastprinted = $_;\n      $lastwascut = 0;\n      }\n    $_=<STDIN>;       # Remove a blank that follows\n    next;\n    }\n\n  # Count runs of empty lines\n\n  if (/^\\s*$/)\n    {\n    $blankcount++;\n    $lastwascut = 0;\n    next;\n    }\n\n  # If a chunk of lines has been cut out (page footer) and the next line\n  # has a different indentation, put back one blank line.\n\n  if ($lastwascut && $blankcount < 1 && defined($lastprinted))\n    {\n    ($a) = $lastprinted =~ /^(\\s*)/;\n    ($b) = $_ =~ /^(\\s*)/;\n    $blankcount++ if ($a ne $b);\n    }\n\n  # We get here only when we have a non-blank line in hand. If it was preceded\n  # by 3 or more blank lines, read the next 3 lines and see if they are blank.\n  # If so, remove all 7 lines, and remember that we have just done a cut.\n\n  if ($blankcount >= 3)\n    {\n    for ($i = 0; $i < 3; $i++)\n      {\n      $next[$i] = <STDIN>;\n      $next[$i] = \"\" if !defined $next[$i];\n      $next[$i] =~ s/\\x1b\\[\\d+m//g;   # Remove screen controls \"ESC [ number m\"\n      $next[$i] =~ s/.\\x8//g;         # Remove \"char, backspace\"\n      }\n\n    # Cut out chunks of the form <3 blanks><non-blank><3 blanks>\n\n    if ($next[0] =~ /^\\s*$/ &&\n        $next[1] =~ /^\\s*$/ &&\n        $next[2] =~ /^\\s*$/)\n      {\n      $blankcount -= 3;\n      $lastwascut = 1;\n      }\n\n    # Otherwise output the saved blanks, the current, and the next three\n    # lines. Remember the last printed line.\n\n    else\n      {\n      for ($i = 0; $i < $blankcount; $i++) { print \"\\n\"; }\n      print;\n      for ($i = 0; $i < 3; $i++)\n        {\n        $next[$i] =~ s/.\\x8//g;\n        print $next[$i];\n        $lastprinted = $_;\n        }\n      $lastwascut = 0;\n      $blankcount = 0;\n      }\n    }\n\n  # This non-blank line is not preceded by 3 or more blank lines. Output\n  # any blanks there are, and the line. Remember it. Force two blank lines\n  # before headings.\n\n  else\n    {\n    $blankcount = 2 if /^\\S/ && !/^Last updated/ && !/^Copyright/ &&\n      defined($lastprinted);\n    for ($i = 0; $i < $blankcount; $i++) { print \"\\n\"; }\n    print;\n    $lastprinted = $_;\n    $lastwascut = 0;\n    $blankcount = 0;\n    }\n  }\n\n# End\n"
  },
  {
    "path": "src/pcre/Detrail",
    "content": "#!/usr/bin/perl\n\n# This is a script for removing trailing whitespace from lines in files that\n# are listed on the command line.\n\n# This subroutine does the work for one file.\n\nsub detrail {\nmy($file) = $_[0];\nmy($changed) = 0;\nopen(IN, \"$file\") || die \"Can't open $file for input\";\n@lines = <IN>;\nclose(IN);\nforeach (@lines)\n  {\n  if (/\\s+\\n$/)\n    {\n    s/\\s+\\n$/\\n/;\n    $changed = 1;\n    }\n  }\nif ($changed)\n  {\n  open(OUT, \">$file\") || die \"Can't open $file for output\";\n  print OUT @lines;\n  close(OUT);\n  }\n}\n\n# This is the main program\n\n$, = \"\";   # Output field separator\nfor ($i = 0; $i < @ARGV; $i++) { &detrail($ARGV[$i]); }\n\n# End\n"
  },
  {
    "path": "src/pcre/HACKING",
    "content": "Technical Notes about PCRE\n--------------------------\n\nThese are very rough technical notes that record potentially useful information \nabout PCRE internals. For information about testing PCRE, see the pcretest \ndocumentation and the comment at the head of the RunTest file.\n\n\nHistorical note 1\n-----------------\n\nMany years ago I implemented some regular expression functions to an algorithm\nsuggested by Martin Richards. These were not Unix-like in form, and were quite\nrestricted in what they could do by comparison with Perl. The interesting part\nabout the algorithm was that the amount of space required to hold the compiled\nform of an expression was known in advance. The code to apply an expression did\nnot operate by backtracking, as the original Henry Spencer code and current\nPerl code does, but instead checked all possibilities simultaneously by keeping\na list of current states and checking all of them as it advanced through the\nsubject string. In the terminology of Jeffrey Friedl's book, it was a \"DFA\nalgorithm\", though it was not a traditional Finite State Machine (FSM). When\nthe pattern was all used up, all remaining states were possible matches, and\nthe one matching the longest subset of the subject string was chosen. This did\nnot necessarily maximize the individual wild portions of the pattern, as is\nexpected in Unix and Perl-style regular expressions.\n\n\nHistorical note 2\n-----------------\n\nBy contrast, the code originally written by Henry Spencer (which was\nsubsequently heavily modified for Perl) compiles the expression twice: once in\na dummy mode in order to find out how much store will be needed, and then for\nreal. (The Perl version probably doesn't do this any more; I'm talking about\nthe original library.) The execution function operates by backtracking and\nmaximizing (or, optionally, minimizing in Perl) the amount of the subject that\nmatches individual wild portions of the pattern. This is an \"NFA algorithm\" in\nFriedl's terminology.\n\n\nOK, here's the real stuff\n-------------------------\n\nFor the set of functions that form the \"basic\" PCRE library (which are\nunrelated to those mentioned above), I tried at first to invent an algorithm\nthat used an amount of store bounded by a multiple of the number of characters\nin the pattern, to save on compiling time. However, because of the greater\ncomplexity in Perl regular expressions, I couldn't do this. In any case, a\nfirst pass through the pattern is helpful for other reasons. \n\n\nSupport for 16-bit and 32-bit data strings\n-------------------------------------------\n\nFrom release 8.30, PCRE supports 16-bit as well as 8-bit data strings; and from\nrelease 8.32, PCRE supports 32-bit data strings. The library can be compiled\nin any combination of 8-bit, 16-bit or 32-bit modes, creating up to three\ndifferent libraries. In the description that follows, the word \"short\" is used\nfor a 16-bit data quantity, and the word \"unit\" is used for a quantity that is\na byte in 8-bit mode, a short in 16-bit mode and a 32-bit word in 32-bit mode.\nHowever, so as not to over-complicate the text, the names of PCRE functions are\ngiven in 8-bit form only.\n\n\nComputing the memory requirement: how it was\n--------------------------------------------\n\nUp to and including release 6.7, PCRE worked by running a very degenerate first\npass to calculate a maximum store size, and then a second pass to do the real\ncompile - which might use a bit less than the predicted amount of memory. The\nidea was that this would turn out faster than the Henry Spencer code because\nthe first pass is degenerate and the second pass can just store stuff straight\ninto the vector, which it knows is big enough.\n\n\nComputing the memory requirement: how it is\n-------------------------------------------\n\nBy the time I was working on a potential 6.8 release, the degenerate first pass\nhad become very complicated and hard to maintain. Indeed one of the early\nthings I did for 6.8 was to fix Yet Another Bug in the memory computation. Then\nI had a flash of inspiration as to how I could run the real compile function in\na \"fake\" mode that enables it to compute how much memory it would need, while\nactually only ever using a few hundred bytes of working memory, and without too\nmany tests of the mode that might slow it down. So I refactored the compiling\nfunctions to work this way. This got rid of about 600 lines of source. It\nshould make future maintenance and development easier. As this was such a major \nchange, I never released 6.8, instead upping the number to 7.0 (other quite \nmajor changes were also present in the 7.0 release).\n\nA side effect of this work was that the previous limit of 200 on the nesting\ndepth of parentheses was removed. However, there is a downside: pcre_compile()\nruns more slowly than before (30% or more, depending on the pattern) because it\nis doing a full analysis of the pattern. My hope was that this would not be a\nbig issue, and in the event, nobody has commented on it.\n\nAt release 8.34, a limit on the nesting depth of parentheses was re-introduced\n(default 250, settable at build time) so as to put a limit on the amount of \nsystem stack used by pcre_compile(). This is a safety feature for environments \nwith small stacks where the patterns are provided by users.\n\n\nTraditional matching function\n-----------------------------\n\nThe \"traditional\", and original, matching function is called pcre_exec(), and \nit implements an NFA algorithm, similar to the original Henry Spencer algorithm \nand the way that Perl works. This is not surprising, since it is intended to be\nas compatible with Perl as possible. This is the function most users of PCRE\nwill use most of the time. From release 8.20, if PCRE is compiled with \njust-in-time (JIT) support, and studying a compiled pattern with JIT is \nsuccessful, the JIT code is run instead of the normal pcre_exec() code, but the \nresult is the same.\n\n\nSupplementary matching function\n-------------------------------\n\nFrom PCRE 6.0, there is also a supplementary matching function called \npcre_dfa_exec(). This implements a DFA matching algorithm that searches \nsimultaneously for all possible matches that start at one point in the subject \nstring. (Going back to my roots: see Historical Note 1 above.) This function \nintreprets the same compiled pattern data as pcre_exec(); however, not all the \nfacilities are available, and those that are do not always work in quite the \nsame way. See the user documentation for details.\n\nThe algorithm that is used for pcre_dfa_exec() is not a traditional FSM, \nbecause it may have a number of states active at one time. More work would be\nneeded at compile time to produce a traditional FSM where only one state is\never active at once. I believe some other regex matchers work this way. JIT\nsupport is not available for this kind of matching.\n\n\nChangeable options\n------------------\n\nThe /i, /m, or /s options (PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and some \nothers) may change in the middle of patterns. From PCRE 8.13, their processing\nis handled entirely at compile time by generating different opcodes for the\ndifferent settings. The runtime functions do not need to keep track of an\noptions state any more.\n\n\nFormat of compiled patterns\n---------------------------\n\nThe compiled form of a pattern is a vector of unsigned units (bytes in 8-bit\nmode, shorts in 16-bit mode, 32-bit words in 32-bit mode), containing items of\nvariable length. The first unit in an item contains an opcode, and the length\nof the item is either implicit in the opcode or contained in the data that\nfollows it.\n\nIn many cases listed below, LINK_SIZE data values are specified for offsets\nwithin the compiled pattern. LINK_SIZE always specifies a number of bytes. The\ndefault value for LINK_SIZE is 2, but PCRE can be compiled to use 3-byte or\n4-byte values for these offsets, although this impairs the performance. (3-byte\nLINK_SIZE values are available only in 8-bit mode.) Specifing a LINK_SIZE\nlarger than 2 is necessary only when patterns whose compiled length is greater\nthan 64K are going to be processed. In this description, we assume the \"normal\"\ncompilation options. Data values that are counts (e.g. quantifiers) are two\nbytes long in 8-bit mode (most significant byte first), or one unit in 16-bit\nand 32-bit modes.\n\n\nOpcodes with no following data\n------------------------------\n\nThese items are all just one unit long\n\n  OP_END                 end of pattern\n  OP_ANY                 match any one character other than newline\n  OP_ALLANY              match any one character, including newline\n  OP_ANYBYTE             match any single unit, even in UTF-8/16 mode\n  OP_SOD                 match start of data: \\A\n  OP_SOM,                start of match (subject + offset): \\G\n  OP_SET_SOM,            set start of match (\\K) \n  OP_CIRC                ^ (start of data)\n  OP_CIRCM               ^ multiline mode (start of data or after newline)\n  OP_NOT_WORD_BOUNDARY   \\W\n  OP_WORD_BOUNDARY       \\w\n  OP_NOT_DIGIT           \\D\n  OP_DIGIT               \\d\n  OP_NOT_HSPACE          \\H\n  OP_HSPACE              \\h  \n  OP_NOT_WHITESPACE      \\S\n  OP_WHITESPACE          \\s\n  OP_NOT_VSPACE          \\V\n  OP_VSPACE              \\v  \n  OP_NOT_WORDCHAR        \\W\n  OP_WORDCHAR            \\w\n  OP_EODN                match end of data or newline at end: \\Z\n  OP_EOD                 match end of data: \\z\n  OP_DOLL                $ (end of data, or before final newline)\n  OP_DOLLM               $ multiline mode (end of data or before newline)\n  OP_EXTUNI              match an extended Unicode grapheme cluster \n  OP_ANYNL               match any Unicode newline sequence \n  \n  OP_ASSERT_ACCEPT       )\n  OP_ACCEPT              ) These are Perl 5.10's \"backtracking control   \n  OP_COMMIT              ) verbs\". If OP_ACCEPT is inside capturing\n  OP_FAIL                ) parentheses, it may be preceded by one or more\n  OP_PRUNE               ) OP_CLOSE, each followed by a count that\n  OP_SKIP                ) indicates which parentheses must be closed.\n  OP_THEN                )\n  \nOP_ASSERT_ACCEPT is used when (*ACCEPT) is encountered within an assertion. \nThis ends the assertion, not the entire pattern match.  \n  \n\nBacktracking control verbs with optional data\n---------------------------------------------\n\n(*THEN) without an argument generates the opcode OP_THEN and no following data.\nOP_MARK is followed by the mark name, preceded by a one-unit length, and\nfollowed by a binary zero. For (*PRUNE), (*SKIP), and (*THEN) with arguments,\nthe opcodes OP_PRUNE_ARG, OP_SKIP_ARG, and OP_THEN_ARG are used, with the name\nfollowing in the same format as OP_MARK.\n  \n\nMatching literal characters\n---------------------------\n\nThe OP_CHAR opcode is followed by a single character that is to be matched \ncasefully. For caseless matching, OP_CHARI is used. In UTF-8 or UTF-16 modes,\nthe character may be more than one unit long. In UTF-32 mode, characters\nare always exactly one unit long.\n\nIf there is only one character in a character class, OP_CHAR or OP_CHARI is\nused for a positive class, and OP_NOT or OP_NOTI for a negative one (that is,\nfor something like [^a]).\n\n\nRepeating single characters\n---------------------------\n\nThe common repeats (*, +, ?), when applied to a single character, use the\nfollowing opcodes, which come in caseful and caseless versions:\n\n  Caseful         Caseless\n  OP_STAR         OP_STARI      \n  OP_MINSTAR      OP_MINSTARI   \n  OP_POSSTAR      OP_POSSTARI   \n  OP_PLUS         OP_PLUSI      \n  OP_MINPLUS      OP_MINPLUSI   \n  OP_POSPLUS      OP_POSPLUSI   \n  OP_QUERY        OP_QUERYI     \n  OP_MINQUERY     OP_MINQUERYI  \n  OP_POSQUERY     OP_POSQUERYI  \n\nEach opcode is followed by the character that is to be repeated. In ASCII mode,\nthese are two-unit items; in UTF-8 or UTF-16 modes, the length is variable; in\nUTF-32 mode these are one-unit items. Those with \"MIN\" in their names are the\nminimizing versions. Those with \"POS\" in their names are possessive versions.\nOther repeats make use of these opcodes:\n\n  Caseful         Caseless\n  OP_UPTO         OP_UPTOI    \n  OP_MINUPTO      OP_MINUPTOI \n  OP_POSUPTO      OP_POSUPTOI \n  OP_EXACT        OP_EXACTI   \n\nEach of these is followed by a count and then the repeated character. OP_UPTO\nmatches from 0 to the given number. A repeat with a non-zero minimum and a\nfixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or\nOPT_POSUPTO).\n\nAnother set of matching repeating opcodes (called OP_NOTSTAR, OP_NOTSTARI,\netc.) are used for repeated, negated, single-character classes such as [^a]*.\nThe normal single-character opcodes (OP_STAR, etc.) are used for repeated\npositive single-character classes.\n\n\nRepeating character types\n-------------------------\n\nRepeats of things like \\d are done exactly as for single characters, except\nthat instead of a character, the opcode for the type is stored in the data\nunit. The opcodes are:\n\n  OP_TYPESTAR\n  OP_TYPEMINSTAR\n  OP_TYPEPOSSTAR \n  OP_TYPEPLUS\n  OP_TYPEMINPLUS\n  OP_TYPEPOSPLUS \n  OP_TYPEQUERY\n  OP_TYPEMINQUERY\n  OP_TYPEPOSQUERY \n  OP_TYPEUPTO\n  OP_TYPEMINUPTO\n  OP_TYPEPOSUPTO \n  OP_TYPEEXACT\n\n\nMatch by Unicode property\n-------------------------\n\nOP_PROP and OP_NOTPROP are used for positive and negative matches of a \ncharacter by testing its Unicode property (the \\p and \\P escape sequences).\nEach is followed by two units that encode the desired property as a type and a\nvalue. The types are a set of #defines of the form PT_xxx, and the values are\nenumerations of the form ucp_xx, defined in the ucp.h source file. The value is\nrelevant only for PT_GC (General Category), PT_PC (Particular Category), and\nPT_SC (Script).\n\nRepeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by\nthree units: OP_PROP or OP_NOTPROP, and then the desired property type and\nvalue.\n\n\nCharacter classes\n-----------------\n\nIf there is only one character in a class, OP_CHAR or OP_CHARI is used for a\npositive class, and OP_NOT or OP_NOTI for a negative one (that is, for\nsomething like [^a]). \n\nA set of repeating opcodes (called OP_NOTSTAR etc.) are used for repeated,\nnegated, single-character classes. The normal single-character opcodes\n(OP_STAR, etc.) are used for repeated positive single-character classes.\n\nWhen there is more than one character in a class, and all the code points are\nless than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a\nnegative one. In either case, the opcode is followed by a 32-byte (16-short, \n8-word) bit map containing a 1 bit for every character that is acceptable. The\nbits are counted from the least significant end of each unit. In caseless mode,\nbits for both cases are set.\n\nThe reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8/16/32\nmode, subject characters with values greater than 255 can be handled correctly.\nFor OP_CLASS they do not match, whereas for OP_NCLASS they do.\n\nFor classes containing characters with values greater than 255 or that contain \n\\p or \\P, OP_XCLASS is used. It optionally uses a bit map if any code points\nare less than 256, followed by a list of pairs (for a range) and single\ncharacters. In caseless mode, both cases are explicitly listed.\n\nOP_XCLASS is followed by a unit containing flag bits: XCL_NOT indicates that \nthis is a negative class, and XCL_MAP indicates that a bit map is present.\nThere follows the bit map, if XCL_MAP is set, and then a sequence of items\ncoded as follows:\n\n  XCL_END      marks the end of the list\n  XCL_SINGLE   one character follows\n  XCL_RANGE    two characters follow\n  XCL_PROP     a Unicode property (type, value) follows   \n  XCL_NOTPROP  a Unicode property (type, value) follows   \n\nIf a range starts with a code point less than 256 and ends with one greater \nthan 256, an XCL_RANGE item is used, without setting any bits in the bit map. \nThis means that if no other items in the class set bits in the map, a map is \nnot needed.\n\n\nBack references\n---------------\n\nOP_REF (caseful) or OP_REFI (caseless) is followed by a count containing the\nreference number if the reference is to a unique capturing group (either by\nnumber or by name). When named groups are used, there may be more than one\ngroup with the same name. In this case, a reference by name generates OP_DNREF\nor OP_DNREFI. These are followed by two counts: the index (not the byte offset) \nin the group name table of the first entry for the requred name, followed by\nthe number of groups with the same name.\n\n\nRepeating character classes and back references\n-----------------------------------------------\n\nSingle-character classes are handled specially (see above). This section\napplies to other classes and also to back references. In both cases, the repeat\ninformation follows the base item. The matching code looks at the following\nopcode to see if it is one of\n\n  OP_CRSTAR\n  OP_CRMINSTAR\n  OP_CRPOSSTAR \n  OP_CRPLUS\n  OP_CRMINPLUS\n  OP_CRPOSPLUS \n  OP_CRQUERY\n  OP_CRMINQUERY\n  OP_CRPOSQUERY \n  OP_CRRANGE\n  OP_CRMINRANGE\n  OP_CRPOSRANGE \n\nAll but the last three are single-unit items, with no data. The others are\nfollowed by the minimum and maximum repeat counts.\n\n\nBrackets and alternation\n------------------------\n\nA pair of non-capturing round brackets is wrapped round each expression at\ncompile time, so alternation always happens in the context of brackets.\n\n[Note for North Americans: \"bracket\" to some English speakers, including\nmyself, can be round, square, curly, or pointy. Hence this usage rather than \n\"parentheses\".]\n\nNon-capturing brackets use the opcode OP_BRA. Originally PCRE was limited to 99\ncapturing brackets and it used a different opcode for each one. From release\n3.5, the limit was removed by putting the bracket number into the data for\nhigher-numbered brackets. From release 7.0 all capturing brackets are handled\nthis way, using the single opcode OP_CBRA.\n\nA bracket opcode is followed by LINK_SIZE bytes which give the offset to the\nnext alternative OP_ALT or, if there aren't any branches, to the matching\nOP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to\nthe next one, or to the OP_KET opcode. For capturing brackets, the bracket \nnumber is a count that immediately follows the offset.\n\nOP_KET is used for subpatterns that do not repeat indefinitely, and OP_KETRMIN\nand OP_KETRMAX are used for indefinite repetitions, minimally or maximally\nrespectively (see below for possessive repetitions). All three are followed by\nLINK_SIZE bytes giving (as a positive number) the offset back to the matching\nbracket opcode.\n\nIf a subpattern is quantified such that it is permitted to match zero times, it\nis preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are\nsingle-unit opcodes that tell the matcher that skipping the following\nsubpattern entirely is a valid branch. In the case of the first two, not \nskipping the pattern is also valid (greedy and non-greedy). The third is used \nwhen a pattern has the quantifier {0,0}. It cannot be entirely discarded,\nbecause it may be called as a subroutine from elsewhere in the regex.\n\nA subpattern with an indefinite maximum repetition is replicated in the\ncompiled data its minimum number of times (or once with OP_BRAZERO if the\nminimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX\nas appropriate.\n\nA subpattern with a bounded maximum repetition is replicated in a nested\nfashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO\nbefore each replication after the minimum, so that, for example, (abc){2,5} is\ncompiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group \nhas the same number.\n\nWhen a repeated subpattern has an unbounded upper limit, it is checked to see \nwhether it could match an empty string. If this is the case, the opcode in the \nfinal replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher\nthat it needs to check for matching an empty string when it hits OP_KETRMIN or\nOP_KETRMAX, and if so, to break the loop.\n\n\nPossessive brackets\n-------------------\n\nWhen a repeated group (capturing or non-capturing) is marked as possessive by\nthe \"+\" notation, e.g. (abc)++, different opcodes are used. Their names all\nhave POS on the end, e.g. OP_BRAPOS instead of OP_BRA and OP_SCPBRPOS instead \nof OP_SCBRA. The end of such a group is marked by OP_KETRPOS. If the minimum \nrepetition is zero, the group is preceded by OP_BRAPOSZERO.\n\n\nOnce-only (atomic) groups\n-------------------------\n\nThese are just like other subpatterns, but they start with the opcode\nOP_ONCE or OP_ONCE_NC. The former is used when there are no capturing brackets \nwithin the atomic group; the latter when there are. The distinction is needed \nfor when there is a backtrack to before the group - any captures within the \ngroup must be reset, so it is necessary to retain backtracking points inside\nthe group even after it is complete in order to do this. When there are no \ncaptures in an atomic group, all the backtracking can be discarded when it is \ncomplete. This is more efficient, and also uses less stack.\n\nThe check for matching an empty string in an unbounded repeat is handled\nentirely at runtime, so there are just these two opcodes for atomic groups.\n\n\nAssertions\n----------\n\nForward assertions are also just like other subpatterns, but starting with one\nof the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes\nOP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion\nis OP_REVERSE, followed by a count of the number of characters to move back the\npointer in the subject string. In ASCII mode, the count is a number of units,\nbut in UTF-8/16 mode each character may occupy more than one unit; in UTF-32\nmode each character occupies exactly one unit. A separate count is present in\neach alternative of a lookbehind assertion, allowing them to have different\nfixed lengths.\n\n\nConditional subpatterns\n-----------------------\n\nThese are like other subpatterns, but they start with the opcode OP_COND, or\nOP_SCOND for one that might match an empty string in an unbounded repeat. If\nthe condition is a back reference, this is stored at the start of the\nsubpattern using the opcode OP_CREF followed by a count containing the\nreference number, provided that the reference is to a unique capturing group.\nIf the reference was by name and there is more than one group with that name, \nOP_DNCREF is used instead. It is followed by two counts: the index in the group \nnames table, and the number of groups with the same name.\n\nIf the condition is \"in recursion\" (coded as \"(?(R)\"), or \"in recursion of\ngroup x\" (coded as \"(?(Rx)\"), the group number is stored at the start of the\nsubpattern using the opcode OP_RREF (with a value of zero for \"the whole\npattern\") or OP_DNRREF (with data as for OP_DNCREF). For a DEFINE condition,\njust the single unit OP_DEF is used (it has no associated data). Otherwise, a\nconditional subpattern always starts with one of the assertions.\n\n\nRecursion\n---------\n\nRecursion either matches the current regex, or some subexpression. The opcode\nOP_RECURSE is followed by aLINK_SIZE value that is the offset to the starting\nbracket from the start of the whole pattern. From release 6.5, OP_RECURSE is\nautomatically wrapped inside OP_ONCE brackets, because otherwise some patterns\nbroke it. OP_RECURSE is also used for \"subroutine\" calls, even though they are\nnot strictly a recursion.\n\n\nCallout\n-------\n\nOP_CALLOUT is followed by one unit of data that holds a callout number in the\nrange 0 to 254 for manual callouts, or 255 for an automatic callout. In both \ncases there follows a count giving the offset in the pattern string to the\nstart of the following item, and another count giving the length of this item.\nThese values make is possible for pcretest to output useful tracing information \nusing automatic callouts.\n\nPhilip Hazel\nNovember 2013\n"
  },
  {
    "path": "src/pcre/INSTALL",
    "content": "Installation Instructions\n*************************\n\n   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software\nFoundation, Inc.\n\n   Copying and distribution of this file, with or without modification,\nare permitted in any medium without royalty provided the copyright\nnotice and this notice are preserved.  This file is offered as-is,\nwithout warranty of any kind.\n\nBasic Installation\n==================\n\n   Briefly, the shell command './configure && make && make install'\nshould configure, build, and install this package.  The following\nmore-detailed instructions are generic; see the 'README' file for\ninstructions specific to this package.  Some packages provide this\n'INSTALL' file but do not implement all of the features documented\nbelow.  The lack of an optional feature in a given package is not\nnecessarily a bug.  More recommendations for GNU packages can be found\nin *note Makefile Conventions: (standards)Makefile Conventions.\n\n   The 'configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a 'Makefile' in each directory of the package.\nIt may also create one or more '.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script 'config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile 'config.log' containing compiler output (useful mainly for\ndebugging 'configure').\n\n   It can also use an optional file (typically called 'config.cache' and\nenabled with '--cache-file=config.cache' or simply '-C') that saves the\nresults of its tests to speed up reconfiguring.  Caching is disabled by\ndefault to prevent problems with accidental use of stale cache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how 'configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the 'README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point 'config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file 'configure.ac' (or 'configure.in') is used to create\n'configure' by a program called 'autoconf'.  You need 'configure.ac' if\nyou want to change it or regenerate 'configure' using a newer version of\n'autoconf'.\n\n   The simplest way to compile this package is:\n\n  1. 'cd' to the directory containing the package's source code and type\n     './configure' to configure the package for your system.\n\n     Running 'configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type 'make' to compile the package.\n\n  3. Optionally, type 'make check' to run any self-tests that come with\n     the package, generally using the just-built uninstalled binaries.\n\n  4. Type 'make install' to install the programs and any data files and\n     documentation.  When installing into a prefix owned by root, it is\n     recommended that the package be configured and built as a regular\n     user, and only the 'make install' phase executed with root\n     privileges.\n\n  5. Optionally, type 'make installcheck' to repeat any self-tests, but\n     this time using the binaries in their final installed location.\n     This target does not install anything.  Running this target as a\n     regular user, particularly if the prior 'make install' required\n     root privileges, verifies that the installation completed\n     correctly.\n\n  6. You can remove the program binaries and object files from the\n     source code directory by typing 'make clean'.  To also remove the\n     files that 'configure' created (so you can compile the package for\n     a different kind of computer), type 'make distclean'.  There is\n     also a 'make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  7. Often, you can also type 'make uninstall' to remove the installed\n     files again.  In practice, not all packages have tested that\n     uninstallation works correctly, even though it is required by the\n     GNU Coding Standards.\n\n  8. Some packages, particularly those that use Automake, provide 'make\n     distcheck', which can by used by developers to test that all other\n     targets like 'make install' and 'make uninstall' work correctly.\n     This target is generally not run by end users.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe 'configure' script does not know about.  Run './configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give 'configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here is\nan example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU 'make'.  'cd' to the\ndirectory where you want the object files and executables to go and run\nthe 'configure' script.  'configure' automatically checks for the source\ncode in the directory that 'configure' is in and in '..'.  This is known\nas a \"VPATH\" build.\n\n   With a non-GNU 'make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use 'make distclean' before\nreconfiguring for another architecture.\n\n   On MacOS X 10.5 and later systems, you can create libraries and\nexecutables that work on multiple system types--known as \"fat\" or\n\"universal\" binaries--by specifying multiple '-arch' options to the\ncompiler but only a single '-arch' option to the preprocessor.  Like\nthis:\n\n     ./configure CC=\"gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CXX=\"g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CPP=\"gcc -E\" CXXCPP=\"g++ -E\"\n\n   This is not guaranteed to produce working output in all cases, you\nmay have to build one architecture at a time and combine the results\nusing the 'lipo' tool if you have problems.\n\nInstallation Names\n==================\n\n   By default, 'make install' installs the package's commands under\n'/usr/local/bin', include files under '/usr/local/include', etc.  You\ncan specify an installation prefix other than '/usr/local' by giving\n'configure' the option '--prefix=PREFIX', where PREFIX must be an\nabsolute file name.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option '--exec-prefix=PREFIX' to 'configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like '--bindir=DIR' to specify different values for particular\nkinds of files.  Run 'configure --help' for a list of the directories\nyou can set and what kinds of files go in them.  In general, the default\nfor these options is expressed in terms of '${prefix}', so that\nspecifying just '--prefix' will affect all of the other directory\nspecifications that were not explicitly provided.\n\n   The most portable way to affect installation locations is to pass the\ncorrect locations to 'configure'; however, many packages provide one or\nboth of the following shortcuts of passing variable assignments to the\n'make install' command line to change installation locations without\nhaving to reconfigure or recompile.\n\n   The first method involves providing an override variable for each\naffected directory.  For example, 'make install\nprefix=/alternate/directory' will choose an alternate location for all\ndirectory configuration variables that were expressed in terms of\n'${prefix}'.  Any directories that were specified during 'configure',\nbut not in terms of '${prefix}', must each be overridden at install time\nfor the entire installation to be relocated.  The approach of makefile\nvariable overrides for each directory variable is required by the GNU\nCoding Standards, and ideally causes no recompilation.  However, some\nplatforms have known limitations with the semantics of shared libraries\nthat end up requiring recompilation when using this method, particularly\nnoticeable in packages that use GNU Libtool.\n\n   The second method involves providing the 'DESTDIR' variable.  For\nexample, 'make install DESTDIR=/alternate/directory' will prepend\n'/alternate/directory' before all installation names.  The approach of\n'DESTDIR' overrides is not required by the GNU Coding Standards, and\ndoes not work on platforms that have drive letters.  On the other hand,\nit does better at avoiding recompilation issues, and works well even\nwhen some directory options were not specified in terms of '${prefix}'\nat 'configure' time.\n\nOptional Features\n=================\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving 'configure' the\noption '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.\n\n   Some packages pay attention to '--enable-FEATURE' options to\n'configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to '--with-PACKAGE' options, where PACKAGE\nis something like 'gnu-as' or 'x' (for the X Window System).  The\n'README' should mention any '--enable-' and '--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, 'configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the 'configure' options '--x-includes=DIR' and\n'--x-libraries=DIR' to specify their locations.\n\n   Some packages offer the ability to configure how verbose the\nexecution of 'make' will be.  For these packages, running './configure\n--enable-silent-rules' sets the default to minimal output, which can be\noverridden with 'make V=1'; while running './configure\n--disable-silent-rules' sets the default to verbose, which can be\noverridden with 'make V=0'.\n\nParticular systems\n==================\n\n   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC\nis not installed, it is recommended to use the following options in\norder to use an ANSI C compiler:\n\n     ./configure CC=\"cc -Ae -D_XOPEN_SOURCE=500\"\n\nand if that doesn't work, install pre-built binaries of GCC for HP-UX.\n\n   HP-UX 'make' updates targets which have the same time stamps as their\nprerequisites, which makes it generally unusable when shipped generated\nfiles such as 'configure' are involved.  Use GNU 'make' instead.\n\n   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot\nparse its '<wchar.h>' header file.  The option '-nodtk' can be used as a\nworkaround.  If GNU CC is not installed, it is therefore recommended to\ntry\n\n     ./configure CC=\"cc\"\n\nand if that doesn't work, try\n\n     ./configure CC=\"cc -nodtk\"\n\n   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This\ndirectory contains several dysfunctional programs; working variants of\nthese programs are available in '/usr/bin'.  So, if you need '/usr/ucb'\nin your 'PATH', put it _after_ '/usr/bin'.\n\n   On Haiku, software installed for all users goes in '/boot/common',\nnot '/usr/local'.  It is recommended to use the following options:\n\n     ./configure --prefix=/boot/common\n\nSpecifying the System Type\n==========================\n\n   There may be some features 'configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, 'configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n'--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as 'sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS\n     KERNEL-OS\n\n   See the file 'config.sub' for the possible values of each field.  If\n'config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option '--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with '--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for 'configure' scripts to share,\nyou can create a site shell script called 'config.site' that gives\ndefault values for variables like 'CC', 'cache_file', and 'prefix'.\n'configure' looks for 'PREFIX/share/config.site' if it exists, then\n'PREFIX/etc/config.site' if it exists.  Or, you can set the\n'CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all 'configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to 'configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the 'configure' command line, using 'VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified 'gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for 'CONFIG_SHELL' due to an\nAutoconf limitation.  Until the limitation is lifted, you can use this\nworkaround:\n\n     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n'configure' Invocation\n======================\n\n   'configure' recognizes the following options to control how it\noperates.\n\n'--help'\n'-h'\n     Print a summary of all of the options to 'configure', and exit.\n\n'--help=short'\n'--help=recursive'\n     Print a summary of the options unique to this package's\n     'configure', and exit.  The 'short' variant lists options used only\n     in the top level, while the 'recursive' variant lists options also\n     present in any nested packages.\n\n'--version'\n'-V'\n     Print the version of Autoconf used to generate the 'configure'\n     script, and exit.\n\n'--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally 'config.cache'.  FILE defaults to '/dev/null' to\n     disable caching.\n\n'--config-cache'\n'-C'\n     Alias for '--cache-file=config.cache'.\n\n'--quiet'\n'--silent'\n'-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to '/dev/null' (any error\n     messages will still be shown).\n\n'--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     'configure' can determine that directory automatically.\n\n'--prefix=DIR'\n     Use DIR as the installation prefix.  *note Installation Names:: for\n     more details, including other options available for fine-tuning the\n     installation locations.\n\n'--no-create'\n'-n'\n     Run the configure checks, but stop before creating any output\n     files.\n\n'configure' also accepts some other, not widely useful, options.  Run\n'configure --help' for more details.\n"
  },
  {
    "path": "src/pcre/LICENCE",
    "content": "PCRE LICENCE\n------------\n\nPCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\nRelease 8 of PCRE is distributed under the terms of the \"BSD\" licence, as\nspecified below. The documentation for PCRE, supplied in the \"doc\"\ndirectory, is distributed under the same terms as the software itself. The data\nin the testdata directory is not copyrighted and is in the public domain.\n\nThe basic library functions are written in C and are freestanding. Also\nincluded in the distribution is a set of C++ wrapper functions, and a\njust-in-time compiler that can be used to optimize pattern matching. These\nare both optional features that can be omitted when the library is built.\n\n\nTHE BASIC LIBRARY FUNCTIONS\n---------------------------\n\nWritten by:       Philip Hazel\nEmail local part: ph10\nEmail domain:     cam.ac.uk\n\nUniversity of Cambridge Computing Service,\nCambridge, England.\n\nCopyright (c) 1997-2019 University of Cambridge\nAll rights reserved.\n\n\nPCRE JUST-IN-TIME COMPILATION SUPPORT\n-------------------------------------\n\nWritten by:       Zoltan Herczeg\nEmail local part: hzmester\nEmail domain:     freemail.hu\n\nCopyright(c) 2010-2019 Zoltan Herczeg\nAll rights reserved.\n\n\nSTACK-LESS JUST-IN-TIME COMPILER\n--------------------------------\n\nWritten by:       Zoltan Herczeg\nEmail local part: hzmester\nEmail domain:     freemail.hu\n\nCopyright(c) 2009-2019 Zoltan Herczeg\nAll rights reserved.\n\n\nTHE C++ WRAPPER FUNCTIONS\n-------------------------\n\nContributed by:   Google Inc.\n\nCopyright (c) 2007-2012, Google Inc.\nAll rights reserved.\n\n\nTHE \"BSD\" LICENCE\n-----------------\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the name of Google\n      Inc. nor the names of their contributors may be used to endorse or\n      promote products derived from this software without specific prior\n      written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\nEnd\n"
  },
  {
    "path": "src/pcre/Makefile.am",
    "content": "## Process this file with automake to produce Makefile.in.\n\nACLOCAL_AMFLAGS = -I m4\n\ndist_doc_DATA = \\\n  doc/pcre.txt \\\n  doc/pcre-config.txt \\\n  doc/pcregrep.txt \\\n  doc/pcretest.txt \\\n  AUTHORS \\\n  COPYING \\\n  ChangeLog \\\n  LICENCE \\\n  NEWS \\\n  README\n\n# Note that pcrecpp.html is not in this list; it is listed separately below.\n\ndist_html_DATA = \\\n  doc/html/NON-AUTOTOOLS-BUILD.txt \\\n  doc/html/README.txt \\\n  doc/html/index.html \\\n  doc/html/pcre-config.html \\\n  doc/html/pcre.html \\\n  doc/html/pcre16.html \\\n  doc/html/pcre32.html \\\n  doc/html/pcre_assign_jit_stack.html \\\n  doc/html/pcre_compile.html \\\n  doc/html/pcre_compile2.html \\\n  doc/html/pcre_config.html \\\n  doc/html/pcre_copy_named_substring.html \\\n  doc/html/pcre_copy_substring.html \\\n  doc/html/pcre_dfa_exec.html \\\n  doc/html/pcre_exec.html \\\n  doc/html/pcre_free_study.html \\\n  doc/html/pcre_free_substring.html \\\n  doc/html/pcre_free_substring_list.html \\\n  doc/html/pcre_fullinfo.html \\\n  doc/html/pcre_get_named_substring.html \\\n  doc/html/pcre_get_stringnumber.html \\\n  doc/html/pcre_get_stringtable_entries.html \\\n  doc/html/pcre_get_substring.html \\\n  doc/html/pcre_get_substring_list.html \\\n  doc/html/pcre_jit_exec.html \\\n  doc/html/pcre_jit_stack_alloc.html \\\n  doc/html/pcre_jit_stack_free.html \\\n  doc/html/pcre_maketables.html \\\n  doc/html/pcre_pattern_to_host_byte_order.html \\\n  doc/html/pcre_refcount.html \\\n  doc/html/pcre_study.html \\\n  doc/html/pcre_utf16_to_host_byte_order.html \\\n  doc/html/pcre_utf32_to_host_byte_order.html \\\n  doc/html/pcre_version.html \\\n  doc/html/pcreapi.html \\\n  doc/html/pcrebuild.html \\\n  doc/html/pcrecallout.html \\\n  doc/html/pcrecompat.html \\\n  doc/html/pcredemo.html \\\n  doc/html/pcregrep.html \\\n  doc/html/pcrejit.html \\\n  doc/html/pcrelimits.html \\\n  doc/html/pcrematching.html \\\n  doc/html/pcrepartial.html \\\n  doc/html/pcrepattern.html \\\n  doc/html/pcreperform.html \\\n  doc/html/pcreposix.html \\\n  doc/html/pcreprecompile.html \\\n  doc/html/pcresample.html \\\n  doc/html/pcrestack.html \\\n  doc/html/pcresyntax.html \\\n  doc/html/pcretest.html \\\n  doc/html/pcreunicode.html\n\npcrecpp_html = doc/html/pcrecpp.html\ndist_noinst_DATA = $(pcrecpp_html)\n\nif WITH_PCRE_CPP\nhtml_DATA = $(pcrecpp_html)\nendif\n\n# The Libtool libraries to install.  We'll add to this later.\nlib_LTLIBRARIES =\n\n# Unit tests you want to run when people type 'make check'.\n# TESTS is for binary unit tests, check_SCRIPTS for script-based tests\nTESTS =\ncheck_SCRIPTS =\ndist_noinst_SCRIPTS =\n\n# Some of the binaries we make are to be installed, and others are\n# (non-user-visible) helper programs needed to build libpcre, libpcre16\n# or libpcre32.\nbin_PROGRAMS =\nnoinst_PROGRAMS =\n\n# Additional files to delete on 'make clean' and 'make maintainer-clean'.\nCLEANFILES =\nMAINTAINERCLEANFILES =\n\n# Additional files to bundle with the distribution, over and above what\n# the Autotools include by default.\nEXTRA_DIST =\n\n# These files contain additional m4 macros that are used by autoconf.\nEXTRA_DIST += \\\n  m4/ax_pthread.m4 m4/pcre_visibility.m4\n\n# These files contain maintenance information\nEXTRA_DIST += \\\n  doc/perltest.txt \\\n  NON-UNIX-USE \\\n  NON-AUTOTOOLS-BUILD \\\n  HACKING\n\n# These files are used in the preparation of a release\nEXTRA_DIST += \\\n  PrepareRelease \\\n  CheckMan \\\n  CleanTxt \\\n  Detrail \\\n  132html \\\n  doc/index.html.src\n\n# These files are to do with building for Virtual Pascal\nEXTRA_DIST += \\\n  makevp.bat \\\n  makevp_c.txt \\\n  makevp_l.txt \\\n  pcregexp.pas\n\n# These files are usable versions of pcre.h and config.h that are distributed\n# for the benefit of people who are building PCRE manually, without the\n# Autotools support.\nEXTRA_DIST += \\\n  pcre.h.generic \\\n  config.h.generic\n\n# The only difference between pcre.h.in and pcre.h is the setting of the PCRE\n# version number. Therefore, we can create the generic version just by copying.\npcre.h.generic: pcre.h.in configure.ac\n\trm -f $@\n\tcp -p pcre.h $@\n\n# It is more complicated for config.h.generic. We need the version that results\n# from a default configuration so as to get all the default values for PCRE\n# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by\n# doing a configure in a temporary directory. However, some trickery is needed,\n# because the source directory may already be configured. If you just try\n# running configure in a new directory, it complains. For this reason, we move\n# config.status out of the way while doing the default configuration. The\n# resulting config.h is munged by perl to put #ifdefs round any #defines for\n# macros with values, and to #undef all boolean macros such as HAVE_xxx and\n# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make\n# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings).\nconfig.h.generic: configure.ac\n\trm -rf $@ _generic\n\tmkdir _generic\n\tcs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside\n\tcd _generic && $(abs_top_srcdir)/configure || :\n\tcs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs\n\ttest -f _generic/config.h\n\tperl -n \\\n\t  -e 'BEGIN{$$blank=0;}' \\\n\t  -e 'if(/PCRE_EXP_DEFN/){print\"/* #undef PCRE_EXP_DEFN */\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/to make a symbol visible/){next;}' \\\n\t  -e 'if(/__attribute__ \\(\\(visibility/){next;}' \\\n\t  -e 'if(/LT_OBJDIR/){print\"/* This is ignored unless you are using libtool. */\\n\";}' \\\n\t  -e 'if(/^#define\\s((?:HAVE|SUPPORT|STDC)_\\w+)/){print\"/* #undef $$1 */\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/^#define\\s(?!PACKAGE|VERSION)(\\w+)/){print\"#ifndef $$1\\n$$_#endif\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/^\\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \\\n\t  _generic/config.h >$@\n\trm -rf _generic\n\nMAINTAINERCLEANFILES += pcre.h.generic config.h.generic\n\n# These are the header files we'll install. We do not distribute pcre.h because\n# it is generated from pcre.h.in.\nnodist_include_HEADERS = \\\n  pcre.h\ninclude_HEADERS = \\\n  pcreposix.h\n\n# These additional headers will be be installed if C++ support is enabled. We\n# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated\n# from corresponding .h.in files (which we do distribute).\nif WITH_PCRE_CPP\nnodist_include_HEADERS += \\\n  pcrecpparg.h \\\n  pcre_stringpiece.h\ninclude_HEADERS += \\\n  pcrecpp.h \\\n  pcre_scanner.h\nendif # WITH_PCRE_CPP\n\nbin_SCRIPTS = pcre-config\n\n## ---------------------------------------------------------------\n## The dftables program is used to rebuild character tables before compiling\n## PCRE, if --enable-rebuild-chartables is specified. It is not a user-visible\n## program. The default (when --enable-rebuild-chartables is not specified) is\n## to copy a distributed set of tables that are defined for ASCII code. In this\n## case, dftables is not needed.\n\nif WITH_REBUILD_CHARTABLES\n\nnoinst_PROGRAMS += dftables\ndftables_SOURCES = dftables.c\n\npcre_chartables.c: dftables$(EXEEXT)\n\t./dftables$(EXEEXT) $@\nelse\n\npcre_chartables.c: $(srcdir)/pcre_chartables.c.dist\n\trm -f $@\n\t$(LN_S) $(srcdir)/pcre_chartables.c.dist $@\n\nendif # WITH_REBUILD_CHARTABLES\n\nBUILT_SOURCES = pcre_chartables.c\n\n## The main pcre library\n\n# Build the 8 bit library if it is enabled.\nif WITH_PCRE8\nlib_LTLIBRARIES += libpcre.la\n\nlibpcre_la_SOURCES = \\\n  pcre_byte_order.c \\\n  pcre_compile.c \\\n  pcre_config.c \\\n  pcre_dfa_exec.c \\\n  pcre_exec.c \\\n  pcre_fullinfo.c \\\n  pcre_get.c \\\n  pcre_globals.c \\\n  pcre_internal.h \\\n  pcre_jit_compile.c \\\n  pcre_maketables.c \\\n  pcre_newline.c \\\n  pcre_ord2utf8.c \\\n  pcre_refcount.c \\\n  pcre_string_utils.c \\\n  pcre_study.c \\\n  pcre_tables.c \\\n  pcre_ucd.c \\\n  pcre_valid_utf8.c \\\n  pcre_version.c \\\n  pcre_xclass.c \\\n  ucp.h\n\nlibpcre_la_CFLAGS = \\\n  $(VISIBILITY_CFLAGS) \\\n  $(AM_CFLAGS)\n\nlibpcre_la_LIBADD =\n\n## This file is generated as part of the building process, so don't distribute.\nnodist_libpcre_la_SOURCES = \\\n  pcre_chartables.c\n\nendif # WITH_PCRE8\n\n# Build the 16 bit library if it is enabled.\nif WITH_PCRE16\nlib_LTLIBRARIES += libpcre16.la\nlibpcre16_la_SOURCES = \\\n  pcre16_byte_order.c \\\n  pcre16_chartables.c \\\n  pcre16_compile.c \\\n  pcre16_config.c \\\n  pcre16_dfa_exec.c \\\n  pcre16_exec.c \\\n  pcre16_fullinfo.c \\\n  pcre16_get.c \\\n  pcre16_globals.c \\\n  pcre16_jit_compile.c \\\n  pcre16_maketables.c \\\n  pcre16_newline.c \\\n  pcre16_ord2utf16.c \\\n  pcre16_refcount.c \\\n  pcre16_string_utils.c \\\n  pcre16_study.c \\\n  pcre16_tables.c \\\n  pcre16_ucd.c \\\n  pcre16_utf16_utils.c \\\n  pcre16_valid_utf16.c \\\n  pcre16_version.c \\\n  pcre16_xclass.c\n\nlibpcre16_la_CFLAGS = \\\n  $(VISIBILITY_CFLAGS) \\\n  $(AM_CFLAGS)\n\nlibpcre16_la_LIBADD =\n\n## This file is generated as part of the building process, so don't distribute.\nnodist_libpcre16_la_SOURCES = \\\n  pcre_chartables.c\n\nendif # WITH_PCRE16\n\n# Build the 32 bit library if it is enabled.\nif WITH_PCRE32\nlib_LTLIBRARIES += libpcre32.la\nlibpcre32_la_SOURCES = \\\n  pcre32_byte_order.c \\\n  pcre32_chartables.c \\\n  pcre32_compile.c \\\n  pcre32_config.c \\\n  pcre32_dfa_exec.c \\\n  pcre32_exec.c \\\n  pcre32_fullinfo.c \\\n  pcre32_get.c \\\n  pcre32_globals.c \\\n  pcre32_jit_compile.c \\\n  pcre32_maketables.c \\\n  pcre32_newline.c \\\n  pcre32_ord2utf32.c \\\n  pcre32_refcount.c \\\n  pcre32_string_utils.c \\\n  pcre32_study.c \\\n  pcre32_tables.c \\\n  pcre32_ucd.c \\\n  pcre32_utf32_utils.c \\\n  pcre32_valid_utf32.c \\\n  pcre32_version.c \\\n  pcre32_xclass.c\n\nlibpcre32_la_CFLAGS = \\\n  $(VISIBILITY_CFLAGS) \\\n  $(AM_CFLAGS)\n\nlibpcre32_la_LIBADD =\n\n## This file is generated as part of the building process, so don't distribute.\nnodist_libpcre32_la_SOURCES = \\\n  pcre_chartables.c\n\nendif # WITH_PCRE32\n\n# The pcre_chartables.c.dist file is the default version of pcre_chartables.c,\n# used unless --enable-rebuild-chartables is specified.\nEXTRA_DIST += pcre_chartables.c.dist\n\n# The JIT compiler lives in a separate directory, but its files are #included\n# when pcre_jit_compile.c is processed, so they must be distributed.\nEXTRA_DIST += \\\n  sljit/sljitConfig.h \\\n  sljit/sljitConfigInternal.h \\\n  sljit/sljitExecAllocator.c \\\n  sljit/sljitLir.c \\\n  sljit/sljitLir.h \\\n  sljit/sljitNativeARM_32.c \\\n  sljit/sljitNativeARM_64.c \\\n  sljit/sljitNativeARM_T2_32.c \\\n  sljit/sljitNativeMIPS_32.c \\\n  sljit/sljitNativeMIPS_64.c \\\n  sljit/sljitNativeMIPS_common.c \\\n  sljit/sljitNativePPC_32.c \\\n  sljit/sljitNativePPC_64.c \\\n  sljit/sljitNativePPC_common.c \\\n  sljit/sljitNativeSPARC_32.c \\\n  sljit/sljitNativeSPARC_common.c \\\n  sljit/sljitNativeTILEGX_64.c \\\n  sljit/sljitNativeTILEGX-encoder.c \\\n  sljit/sljitNativeX86_32.c \\\n  sljit/sljitNativeX86_64.c \\\n  sljit/sljitNativeX86_common.c \\\n  sljit/sljitUtils.c\n\nif WITH_PCRE8\nlibpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS)\nendif # WITH_PCRE8\nif WITH_PCRE16\nlibpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS)\nendif # WITH_PCRE16\nif WITH_PCRE32\nlibpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS)\nendif # WITH_PCRE32\n\nif WITH_VALGRIND\nif WITH_PCRE8\nlibpcre_la_CFLAGS += $(VALGRIND_CFLAGS)\nendif # WITH_PCRE8\nif WITH_PCRE16\nlibpcre16_la_CFLAGS += $(VALGRIND_CFLAGS)\nendif # WITH_PCRE16\nif WITH_PCRE32\nlibpcre32_la_CFLAGS += $(VALGRIND_CFLAGS)\nendif # WITH_PCRE32\nendif # WITH_VALGRIND\n\nif WITH_GCOV\nif WITH_PCRE8\nlibpcre_la_CFLAGS += $(GCOV_CFLAGS)\nendif # WITH_PCRE8\nif WITH_PCRE16\nlibpcre16_la_CFLAGS += $(GCOV_CFLAGS)\nendif # WITH_PCRE16\nif WITH_PCRE32\nlibpcre32_la_CFLAGS += $(GCOV_CFLAGS)\nendif # WITH_PCRE32\nendif # WITH_GCOV\n\nCLEANFILES += pcre_chartables.c\n\n## If JIT support is enabled, arrange for the JIT test program to run.\nif WITH_JIT\nTESTS += pcre_jit_test\nnoinst_PROGRAMS += pcre_jit_test\npcre_jit_test_SOURCES = pcre_jit_test.c\npcre_jit_test_CFLAGS = $(AM_CFLAGS)\npcre_jit_test_LDADD =\nif WITH_PCRE8\npcre_jit_test_LDADD += libpcre.la\nendif # WITH_PCRE8\nif WITH_PCRE16\npcre_jit_test_LDADD += libpcre16.la\nendif # WITH_PCRE16\nif WITH_PCRE32\npcre_jit_test_LDADD += libpcre32.la\nendif # WITH_PCRE32\nif WITH_GCOV\npcre_jit_test_CFLAGS += $(GCOV_CFLAGS)\npcre_jit_test_LDADD += $(GCOV_LIBS)\nendif # WITH_GCOV\nendif # WITH_JIT\n\n## A version of the main pcre library that has a posix re API.\nif WITH_PCRE8\n\nlib_LTLIBRARIES += libpcreposix.la\nlibpcreposix_la_SOURCES = \\\n  pcreposix.c\nlibpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS)\nlibpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS)\nlibpcreposix_la_LIBADD = libpcre.la\n\nif WITH_GCOV\nlibpcreposix_la_CFLAGS += $(GCOV_CFLAGS)\nendif # WITH_GCOV\n\nendif # WITH_PCRE8\n\n## There's a C++ library as well.\nif WITH_PCRE_CPP\n\nlib_LTLIBRARIES += libpcrecpp.la\nlibpcrecpp_la_SOURCES = \\\n  pcrecpp_internal.h \\\n  pcrecpp.cc \\\n  pcre_scanner.cc \\\n  pcre_stringpiece.cc\nlibpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(AM_CXXFLAGS)\nlibpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS)\nlibpcrecpp_la_LIBADD = libpcre.la\n\nTESTS += pcrecpp_unittest\nnoinst_PROGRAMS += pcrecpp_unittest\npcrecpp_unittest_SOURCES = pcrecpp_unittest.cc\npcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS)\npcrecpp_unittest_LDADD = libpcrecpp.la\n\nTESTS += pcre_scanner_unittest\nnoinst_PROGRAMS += pcre_scanner_unittest\npcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc\npcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS)\npcre_scanner_unittest_LDADD = libpcrecpp.la\n\nTESTS += pcre_stringpiece_unittest\nnoinst_PROGRAMS += pcre_stringpiece_unittest\npcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc\npcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS)\npcre_stringpiece_unittest_LDADD = libpcrecpp.la\n\nif WITH_GCOV\nlibpcrecpp_la_CXXFLAGS += $(GCOV_CXXFLAGS)\npcrecpp_unittest_LDADD += $(GCOV_LIBS)\npcre_scanner_unittest_LDADD += $(GCOV_LIBS)\npcre_stringpiece_unittest_LDADD += $(GCOV_LIBS)\nendif # WITH_GCOV\n\nendif # WITH_PCRE_CPP\n\n## The main unit tests\n\n# Each unit test is a binary plus a script that runs that binary in various\n# ways. We install these test binaries in case folks find it helpful.\n\nTESTS += RunTest\ndist_noinst_SCRIPTS += RunTest\nEXTRA_DIST += RunTest.bat\nbin_PROGRAMS += pcretest\npcretest_SOURCES = pcretest.c\npcretest_CFLAGS = $(AM_CFLAGS)\npcretest_LDADD = $(LIBREADLINE)\nif WITH_PCRE8\npcretest_SOURCES += pcre_printint.c\npcretest_LDADD += libpcre.la libpcreposix.la\nendif # WITH_PCRE8\nif WITH_PCRE16\npcretest_SOURCES += pcre16_printint.c\npcretest_LDADD += libpcre16.la\nendif # WITH_PCRE16\nif WITH_PCRE32\npcretest_SOURCES += pcre32_printint.c\npcretest_LDADD += libpcre32.la\nendif # WITH_PCRE32\nif WITH_VALGRIND\npcretest_CFLAGS += $(VALGRIND_CFLAGS)\nendif # WITH_VALGRIND\nif WITH_GCOV\npcretest_CFLAGS += $(GCOV_CFLAGS)\npcretest_LDADD += $(GCOV_LIBS)\nendif # WITH_GCOV\n\nif WITH_PCRE8\nTESTS += RunGrepTest\ndist_noinst_SCRIPTS += RunGrepTest\nbin_PROGRAMS += pcregrep\npcregrep_SOURCES = pcregrep.c\npcregrep_CFLAGS = $(AM_CFLAGS)\npcregrep_LDADD = $(LIBZ) $(LIBBZ2)\npcregrep_LDADD += libpcre.la libpcreposix.la\nif WITH_GCOV\npcregrep_CFLAGS += $(GCOV_CFLAGS)\npcregrep_LDADD += $(GCOV_LIBS)\nendif # WITH_GCOV\nendif # WITH_PCRE8\n\nEXTRA_DIST += \\\n  testdata/grepbinary \\\n  testdata/grepfilelist \\\n  testdata/grepinput \\\n  testdata/grepinput3 \\\n  testdata/grepinput8 \\\n  testdata/grepinputv \\\n  testdata/grepinputx \\\n  testdata/greplist \\\n  testdata/grepoutput \\\n  testdata/grepoutput8 \\\n  testdata/grepoutputN \\\n  testdata/greppatN4 \\\n  testdata/saved16 \\\n  testdata/saved16BE-1 \\\n  testdata/saved16BE-2 \\\n  testdata/saved16LE-1 \\\n  testdata/saved16LE-2 \\\n  testdata/saved32 \\\n  testdata/saved32BE-1 \\\n  testdata/saved32BE-2 \\\n  testdata/saved32LE-1 \\\n  testdata/saved32LE-2 \\\n  testdata/saved8 \\\n  testdata/testinput1 \\\n  testdata/testinput2 \\\n  testdata/testinput3 \\\n  testdata/testinput4 \\\n  testdata/testinput5 \\\n  testdata/testinput6 \\\n  testdata/testinput7 \\\n  testdata/testinput8 \\\n  testdata/testinput9 \\\n  testdata/testinput10 \\\n  testdata/testinput11 \\\n  testdata/testinput12 \\\n  testdata/testinput13 \\\n  testdata/testinput14 \\\n  testdata/testinput15 \\\n  testdata/testinput16 \\\n  testdata/testinput17 \\\n  testdata/testinput18 \\\n  testdata/testinput19 \\\n  testdata/testinput20 \\\n  testdata/testinput21 \\\n  testdata/testinput22 \\\n  testdata/testinput23 \\\n  testdata/testinput24 \\\n  testdata/testinput25 \\\n  testdata/testinput26 \\\n  testdata/testinputEBC \\\n  testdata/testoutput1 \\\n  testdata/testoutput2 \\\n  testdata/testoutput3 \\\n  testdata/testoutput3A \\\n  testdata/testoutput3B \\\n  testdata/testoutput4 \\\n  testdata/testoutput5 \\\n  testdata/testoutput6 \\\n  testdata/testoutput7 \\\n  testdata/testoutput8 \\\n  testdata/testoutput9 \\\n  testdata/testoutput10 \\\n  testdata/testoutput11-8 \\\n  testdata/testoutput11-16 \\\n  testdata/testoutput11-32 \\\n  testdata/testoutput12 \\\n  testdata/testoutput13 \\\n  testdata/testoutput14 \\\n  testdata/testoutput15 \\\n  testdata/testoutput16 \\\n  testdata/testoutput17 \\\n  testdata/testoutput18-16 \\\n  testdata/testoutput18-32 \\\n  testdata/testoutput19 \\\n  testdata/testoutput20 \\\n  testdata/testoutput21-16 \\\n  testdata/testoutput21-32 \\\n  testdata/testoutput22-16 \\\n  testdata/testoutput22-32 \\\n  testdata/testoutput23 \\\n  testdata/testoutput24 \\\n  testdata/testoutput25 \\\n  testdata/testoutput26 \\\n  testdata/testoutputEBC \\\n  testdata/valgrind-jit.supp \\\n  testdata/wintestinput3 \\\n  testdata/wintestoutput3 \\\n  perltest.pl\n\nCLEANFILES += \\\n\ttestsavedregex \\\n\tteststderr \\\n        testtemp* \\\n\ttesttry \\\n        testNinput \\\n        testtrygrep \\\n        teststderrgrep \\\n        testNinputgrep\n\n# PCRE demonstration program. No longer built automatcally. The point is that\n# the users should build it themselves. So just distribute the source.\n# noinst_PROGRAMS += pcredemo\n# pcredemo_SOURCES = pcredemo.c\n# pcredemo_LDADD = libpcre.la\n\nEXTRA_DIST += pcredemo.c\n\n\n## Utility rules, documentation, etc.\n\n# A compatibility line, the old build system worked with 'make test'\ntest: check ;\n\n\n# A PCRE user submitted the following addition, saying that it \"will allow\n# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a\n# nice DLL for Windows use\". (It is used by the pcre.dll target.)\nDLL_OBJS= pcre_byte_order.o pcre_compile.o pcre_config.o \\\n\tpcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \\\n\tpcre_globals.o pcre_jit_compile.o pcre_maketables.o \\\n\tpcre_newline.o pcre_ord2utf8.o pcre_refcount.o \\\n\tpcre_study.o pcre_tables.o pcre_ucd.o \\\n\tpcre_valid_utf8.o pcre_version.o pcre_chartables.o \\\n\tpcre_xclass.o\n\n# A PCRE user submitted the following addition, saying that it \"will allow\n# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a\n# nice DLL for Windows use\".\npcre.dll: $(DLL_OBJS)\n\t$(CC) -shared -o pcre.dll -Wl,\"--strip-all\" -Wl,\"--export-all-symbols\" $(DLL_OBJS)\n\n\n# We have .pc files for pkg-config users.\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = libpcre.pc libpcreposix.pc\nif WITH_PCRE16\npkgconfig_DATA += libpcre16.pc\nendif\nif WITH_PCRE32\npkgconfig_DATA += libpcre32.pc\nendif\nif WITH_PCRE_CPP\npkgconfig_DATA += libpcrecpp.pc\nendif\n\n# Note that pcrecpp.3 is not in this list, but is included separately below.\n\ndist_man_MANS = \\\n  doc/pcre-config.1 \\\n  doc/pcre.3 \\\n  doc/pcre16.3 \\\n  doc/pcre32.3 \\\n  doc/pcre_assign_jit_stack.3 \\\n  doc/pcre_compile.3 \\\n  doc/pcre_compile2.3 \\\n  doc/pcre_config.3 \\\n  doc/pcre_copy_named_substring.3 \\\n  doc/pcre_copy_substring.3 \\\n  doc/pcre_dfa_exec.3 \\\n  doc/pcre_exec.3 \\\n  doc/pcre_free_study.3 \\\n  doc/pcre_free_substring.3 \\\n  doc/pcre_free_substring_list.3 \\\n  doc/pcre_fullinfo.3 \\\n  doc/pcre_get_named_substring.3 \\\n  doc/pcre_get_stringnumber.3 \\\n  doc/pcre_get_stringtable_entries.3 \\\n  doc/pcre_get_substring.3 \\\n  doc/pcre_get_substring_list.3 \\\n  doc/pcre_jit_exec.3 \\\n  doc/pcre_jit_stack_alloc.3 \\\n  doc/pcre_jit_stack_free.3 \\\n  doc/pcre_maketables.3 \\\n  doc/pcre_pattern_to_host_byte_order.3 \\\n  doc/pcre_refcount.3 \\\n  doc/pcre_study.3 \\\n  doc/pcre_utf16_to_host_byte_order.3 \\\n  doc/pcre_utf32_to_host_byte_order.3 \\\n  doc/pcre_version.3 \\\n  doc/pcreapi.3 \\\n  doc/pcrebuild.3 \\\n  doc/pcrecallout.3 \\\n  doc/pcrecompat.3 \\\n  doc/pcredemo.3 \\\n  doc/pcregrep.1 \\\n  doc/pcrejit.3 \\\n  doc/pcrelimits.3 \\\n  doc/pcrematching.3 \\\n  doc/pcrepartial.3 \\\n  doc/pcrepattern.3 \\\n  doc/pcreperform.3 \\\n  doc/pcreposix.3 \\\n  doc/pcreprecompile.3 \\\n  doc/pcresample.3 \\\n  doc/pcrestack.3 \\\n  doc/pcresyntax.3 \\\n  doc/pcretest.1 \\\n  doc/pcreunicode.3\n\n# Arrange for the per-function man pages to have 16- and 32-bit names as well.\ninstall-data-hook:\n\tln -sf pcre_assign_jit_stack.3\t\t $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3\n\tln -sf pcre_compile.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_compile.3\n\tln -sf pcre_compile2.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_compile2.3\n\tln -sf pcre_config.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_config.3\n\tln -sf pcre_copy_named_substring.3\t $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3\n\tln -sf pcre_copy_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_copy_substring.3\n\tln -sf pcre_dfa_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3\n\tln -sf pcre_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_exec.3\n\tln -sf pcre_free_study.3\t\t $(DESTDIR)$(man3dir)/pcre16_free_study.3\n\tln -sf pcre_free_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_free_substring.3\n\tln -sf pcre_free_substring_list.3\t $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3\n\tln -sf pcre_fullinfo.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_fullinfo.3\n\tln -sf pcre_get_named_substring.3\t $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3\n\tln -sf pcre_get_stringnumber.3\t\t $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3\n\tln -sf pcre_get_stringtable_entries.3\t $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3\n\tln -sf pcre_get_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_get_substring.3\n\tln -sf pcre_get_substring_list.3\t $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3\n\tln -sf pcre_jit_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_jit_exec.3\n\tln -sf pcre_jit_stack_alloc.3\t\t $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3\n\tln -sf pcre_jit_stack_free.3\t\t $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3\n\tln -sf pcre_maketables.3\t\t $(DESTDIR)$(man3dir)/pcre16_maketables.3\n\tln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3\n\tln -sf pcre_refcount.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_refcount.3\n\tln -sf pcre_study.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_study.3\n\tln -sf pcre_utf16_to_host_byte_order.3\t $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3\n\tln -sf pcre_version.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_version.3\n\tln -sf pcre_assign_jit_stack.3\t\t $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3\n\tln -sf pcre_compile.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_compile.3\n\tln -sf pcre_compile2.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_compile2.3\n\tln -sf pcre_config.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_config.3\n\tln -sf pcre_copy_named_substring.3\t $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3\n\tln -sf pcre_copy_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_copy_substring.3\n\tln -sf pcre_dfa_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3\n\tln -sf pcre_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_exec.3\n\tln -sf pcre_free_study.3\t\t $(DESTDIR)$(man3dir)/pcre32_free_study.3\n\tln -sf pcre_free_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_free_substring.3\n\tln -sf pcre_free_substring_list.3\t $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3\n\tln -sf pcre_fullinfo.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_fullinfo.3\n\tln -sf pcre_get_named_substring.3\t $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3\n\tln -sf pcre_get_stringnumber.3\t\t $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3\n\tln -sf pcre_get_stringtable_entries.3\t $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3\n\tln -sf pcre_get_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_get_substring.3\n\tln -sf pcre_get_substring_list.3\t $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3\n\tln -sf pcre_jit_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_jit_exec.3\n\tln -sf pcre_jit_stack_alloc.3\t\t $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3\n\tln -sf pcre_jit_stack_free.3\t\t $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3\n\tln -sf pcre_maketables.3\t\t $(DESTDIR)$(man3dir)/pcre32_maketables.3\n\tln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3\n\tln -sf pcre_refcount.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_refcount.3\n\tln -sf pcre_study.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_study.3\n\tln -sf pcre_utf32_to_host_byte_order.3\t $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3\n\tln -sf pcre_version.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_version.3\n\npcrecpp_man = doc/pcrecpp.3\nEXTRA_DIST += $(pcrecpp_man)\n\nif WITH_PCRE_CPP\nman_MANS = $(pcrecpp_man)\nendif\n\n# gcov/lcov code coverage reporting\n\nif WITH_GCOV\n\n# Coverage reporting targets:\n#\n# coverage: Create a coverage report from 'make check'\n# coverage-baseline: Capture baseline coverage information\n# coverage-reset: This zeros the coverage counters only\n# coverage-report: This creates the coverage report only\n# coverage-clean-report: This removes the generated coverage report\n#   without cleaning the coverage data itself\n# coverage-clean-data: This removes the captured coverage data without\n#   removing the coverage files created at compile time (*.gcno)\n# coverage-clean: This cleans all coverage data including the generated\n#   coverage report.\n\nCOVERAGE_TEST_NAME = $(PACKAGE)\nCOVERAGE_NAME = $(PACKAGE)-$(VERSION)\nCOVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info\nCOVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage\nCOVERAGE_LCOV_EXTRA_FLAGS =\nCOVERAGE_GENHTML_EXTRA_FLAGS =\n\ncoverage_quiet = $(coverage_quiet_$(V))\ncoverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))\ncoverage_quiet_0 = --quiet\n\ncoverage-check: all\n\t-$(MAKE) $(AM_MAKEFLAGS) -k check\n\ncoverage-baseline:\n\t$(LCOV) $(coverage_quiet) \\\n\t\t--directory $(top_builddir) \\\n\t\t--output-file \"$(COVERAGE_OUTPUT_FILE)\" \\\n\t\t--capture \\\n\t\t--initial\n\ncoverage-report:\n\t$(LCOV) $(coverage_quiet) \\\n\t\t--directory $(top_builddir) \\\n\t\t--capture \\\n\t\t--output-file \"$(COVERAGE_OUTPUT_FILE).tmp\" \\\n\t\t--test-name \"$(COVERAGE_TEST_NAME)\" \\\n\t\t--no-checksum \\\n\t\t--compat-libtool \\\n\t\t$(COVERAGE_LCOV_EXTRA_FLAGS)\n\t$(LCOV) $(coverage_quiet) \\\n\t\t--directory $(top_builddir) \\\n\t\t--output-file \"$(COVERAGE_OUTPUT_FILE)\" \\\n\t\t--remove \"$(COVERAGE_OUTPUT_FILE).tmp\" \\\n\t\t\"/tmp/*\" \\\n\t\t\"/usr/include/*\" \\\n\t\t\"$(includedir)/*\"\n\t-@rm -f \"$(COVERAGE_OUTPUT_FILE).tmp\"\n\tLANG=C $(GENHTML) $(coverage_quiet) \\\n\t\t--prefix $(top_builddir) \\\n\t\t--output-directory \"$(COVERAGE_OUTPUT_DIR)\" \\\n\t\t--title \"$(PACKAGE) $(VERSION) Code Coverage Report\" \\\n\t\t--show-details \"$(COVERAGE_OUTPUT_FILE)\" \\\n\t\t--legend \\\n\t\t$(COVERAGE_GENHTML_EXTRA_FLAGS)\n\t@echo \"Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html\"\n\ncoverage-reset:\n\t-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)\n\ncoverage-clean-report:\n\t-rm -f \"$(COVERAGE_OUTPUT_FILE)\" \"$(COVERAGE_OUTPUT_FILE).tmp\"\n\t-rm -rf \"$(COVERAGE_OUTPUT_DIR)\"\n\ncoverage-clean-data:\n\t-find $(top_builddir) -name \"*.gcda\" -delete\n\ncoverage-clean: coverage-reset coverage-clean-report coverage-clean-data\n\t-find $(top_builddir) -name \"*.gcno\" -delete\n\ncoverage-distclean: coverage-clean\n\ncoverage: coverage-reset coverage-baseline coverage-check coverage-report\nclean-local: coverage-clean\ndistclean-local: coverage-distclean\n\n.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean\n\nelse\n\ncoverage:\n\t@echo \"Configuring with --enable-coverage required to generate code coverage report.\"\n\nendif # WITH_GCOV\n\n## CMake support\n\nEXTRA_DIST += \\\n  cmake/COPYING-CMAKE-SCRIPTS \\\n  cmake/FindPackageHandleStandardArgs.cmake \\\n  cmake/FindReadline.cmake \\\n  cmake/FindEditline.cmake \\\n  CMakeLists.txt \\\n  config-cmake.h.in\n\n## end Makefile.am\n"
  },
  {
    "path": "src/pcre/Makefile.in",
    "content": "# Makefile.in generated by automake 1.16.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2018 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\n\n\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nTESTS = $(am__EXEEXT_3) $(am__EXEEXT_4) RunTest $(am__append_38)\nbin_PROGRAMS = pcretest$(EXEEXT) $(am__EXEEXT_1)\nnoinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4)\n\n# These additional headers will be be installed if C++ support is enabled. We\n# do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated\n# from corresponding .h.in files (which we do distribute).\n@WITH_PCRE_CPP_TRUE@am__append_1 = \\\n@WITH_PCRE_CPP_TRUE@  pcrecpparg.h \\\n@WITH_PCRE_CPP_TRUE@  pcre_stringpiece.h\n\n@WITH_PCRE_CPP_TRUE@am__append_2 = \\\n@WITH_PCRE_CPP_TRUE@  pcrecpp.h \\\n@WITH_PCRE_CPP_TRUE@  pcre_scanner.h\n\n@WITH_REBUILD_CHARTABLES_TRUE@am__append_3 = dftables\n\n# Build the 8 bit library if it is enabled.\n@WITH_PCRE8_TRUE@am__append_4 = libpcre.la\n\n# Build the 16 bit library if it is enabled.\n@WITH_PCRE16_TRUE@am__append_5 = libpcre16.la\n\n# Build the 32 bit library if it is enabled.\n@WITH_PCRE32_TRUE@am__append_6 = libpcre32.la\n@WITH_PCRE8_TRUE@@WITH_VALGRIND_TRUE@am__append_7 = $(VALGRIND_CFLAGS)\n@WITH_PCRE16_TRUE@@WITH_VALGRIND_TRUE@am__append_8 = $(VALGRIND_CFLAGS)\n@WITH_PCRE32_TRUE@@WITH_VALGRIND_TRUE@am__append_9 = $(VALGRIND_CFLAGS)\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_10 = $(GCOV_CFLAGS)\n@WITH_GCOV_TRUE@@WITH_PCRE16_TRUE@am__append_11 = $(GCOV_CFLAGS)\n@WITH_GCOV_TRUE@@WITH_PCRE32_TRUE@am__append_12 = $(GCOV_CFLAGS)\n@WITH_JIT_TRUE@am__append_13 = pcre_jit_test\n@WITH_JIT_TRUE@am__append_14 = pcre_jit_test\n@WITH_JIT_TRUE@@WITH_PCRE8_TRUE@am__append_15 = libpcre.la\n@WITH_JIT_TRUE@@WITH_PCRE16_TRUE@am__append_16 = libpcre16.la\n@WITH_JIT_TRUE@@WITH_PCRE32_TRUE@am__append_17 = libpcre32.la\n@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_18 = $(GCOV_CFLAGS)\n@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__append_19 = $(GCOV_LIBS)\n@WITH_PCRE8_TRUE@am__append_20 = libpcreposix.la\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_21 = $(GCOV_CFLAGS)\n@WITH_PCRE_CPP_TRUE@am__append_22 = libpcrecpp.la\n@WITH_PCRE_CPP_TRUE@am__append_23 = pcrecpp_unittest \\\n@WITH_PCRE_CPP_TRUE@\tpcre_scanner_unittest \\\n@WITH_PCRE_CPP_TRUE@\tpcre_stringpiece_unittest\n@WITH_PCRE_CPP_TRUE@am__append_24 = pcrecpp_unittest \\\n@WITH_PCRE_CPP_TRUE@\tpcre_scanner_unittest \\\n@WITH_PCRE_CPP_TRUE@\tpcre_stringpiece_unittest\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_25 = $(GCOV_CXXFLAGS)\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_26 = $(GCOV_LIBS)\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_27 = $(GCOV_LIBS)\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__append_28 = $(GCOV_LIBS)\n@WITH_PCRE8_TRUE@am__append_29 = pcre_printint.c\n@WITH_PCRE8_TRUE@am__append_30 = libpcre.la libpcreposix.la\n@WITH_PCRE16_TRUE@am__append_31 = pcre16_printint.c\n@WITH_PCRE16_TRUE@am__append_32 = libpcre16.la\n@WITH_PCRE32_TRUE@am__append_33 = pcre32_printint.c\n@WITH_PCRE32_TRUE@am__append_34 = libpcre32.la\n@WITH_VALGRIND_TRUE@am__append_35 = $(VALGRIND_CFLAGS)\n@WITH_GCOV_TRUE@am__append_36 = $(GCOV_CFLAGS)\n@WITH_GCOV_TRUE@am__append_37 = $(GCOV_LIBS)\n@WITH_PCRE8_TRUE@am__append_38 = RunGrepTest\n@WITH_PCRE8_TRUE@am__append_39 = RunGrepTest\n@WITH_PCRE8_TRUE@am__append_40 = pcregrep\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_41 = $(GCOV_CFLAGS)\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__append_42 = $(GCOV_LIBS)\n@WITH_PCRE16_TRUE@am__append_43 = libpcre16.pc\n@WITH_PCRE32_TRUE@am__append_44 = libpcre32.pc\n@WITH_PCRE_CPP_TRUE@am__append_45 = libpcrecpp.pc\nsubdir = .\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/m4/pcre_visibility.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \\\n\t$(am__configure_deps) $(am__dist_noinst_SCRIPTS_DIST) \\\n\t$(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \\\n\t$(am__include_HEADERS_DIST) $(am__DIST_COMMON)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = config.h\nCONFIG_CLEAN_FILES = libpcre.pc libpcre16.pc libpcre32.pc \\\n\tlibpcreposix.pc libpcrecpp.pc pcre-config pcre.h \\\n\tpcre_stringpiece.h pcrecpparg.h\nCONFIG_CLEAN_VPATH_FILES =\n@WITH_PCRE8_TRUE@am__EXEEXT_1 = pcregrep$(EXEEXT)\nam__installdirs = \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(libdir)\" \\\n\t\"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(man1dir)\" \\\n\t\"$(DESTDIR)$(man3dir)\" \"$(DESTDIR)$(docdir)\" \\\n\t\"$(DESTDIR)$(htmldir)\" \"$(DESTDIR)$(htmldir)\" \\\n\t\"$(DESTDIR)$(pkgconfigdir)\" \"$(DESTDIR)$(includedir)\" \\\n\t\"$(DESTDIR)$(includedir)\"\n@WITH_REBUILD_CHARTABLES_TRUE@am__EXEEXT_2 = dftables$(EXEEXT)\n@WITH_JIT_TRUE@am__EXEEXT_3 = pcre_jit_test$(EXEEXT)\n@WITH_PCRE_CPP_TRUE@am__EXEEXT_4 = pcrecpp_unittest$(EXEEXT) \\\n@WITH_PCRE_CPP_TRUE@\tpcre_scanner_unittest$(EXEEXT) \\\n@WITH_PCRE_CPP_TRUE@\tpcre_stringpiece_unittest$(EXEEXT)\nPROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__uninstall_files_from_dir = { \\\n  test -z \"$$files\" \\\n    || { test ! -d \"$$dir\" && test ! -f \"$$dir\" && test ! -r \"$$dir\"; } \\\n    || { echo \" ( cd '$$dir' && rm -f\" $$files \")\"; \\\n         $(am__cd) \"$$dir\" && rm -f $$files; }; \\\n  }\nLTLIBRARIES = $(lib_LTLIBRARIES)\nlibpcre_la_DEPENDENCIES =\nam__libpcre_la_SOURCES_DIST = pcre_byte_order.c pcre_compile.c \\\n\tpcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c \\\n\tpcre_get.c pcre_globals.c pcre_internal.h pcre_jit_compile.c \\\n\tpcre_maketables.c pcre_newline.c pcre_ord2utf8.c \\\n\tpcre_refcount.c pcre_string_utils.c pcre_study.c pcre_tables.c \\\n\tpcre_ucd.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c \\\n\tucp.h\n@WITH_PCRE8_TRUE@am_libpcre_la_OBJECTS =  \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_byte_order.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_compile.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_config.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_dfa_exec.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_exec.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_fullinfo.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_get.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_globals.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_jit_compile.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_maketables.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_newline.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_ord2utf8.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_refcount.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_string_utils.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_study.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_tables.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_ucd.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_valid_utf8.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_version.lo \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_xclass.lo\n@WITH_PCRE8_TRUE@nodist_libpcre_la_OBJECTS =  \\\n@WITH_PCRE8_TRUE@\tlibpcre_la-pcre_chartables.lo\nlibpcre_la_OBJECTS = $(am_libpcre_la_OBJECTS) \\\n\t$(nodist_libpcre_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 =\nlibpcre_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre_la_CFLAGS) \\\n\t$(CFLAGS) $(libpcre_la_LDFLAGS) $(LDFLAGS) -o $@\n@WITH_PCRE8_TRUE@am_libpcre_la_rpath = -rpath $(libdir)\nlibpcre16_la_DEPENDENCIES =\nam__libpcre16_la_SOURCES_DIST = pcre16_byte_order.c \\\n\tpcre16_chartables.c pcre16_compile.c pcre16_config.c \\\n\tpcre16_dfa_exec.c pcre16_exec.c pcre16_fullinfo.c pcre16_get.c \\\n\tpcre16_globals.c pcre16_jit_compile.c pcre16_maketables.c \\\n\tpcre16_newline.c pcre16_ord2utf16.c pcre16_refcount.c \\\n\tpcre16_string_utils.c pcre16_study.c pcre16_tables.c \\\n\tpcre16_ucd.c pcre16_utf16_utils.c pcre16_valid_utf16.c \\\n\tpcre16_version.c pcre16_xclass.c\n@WITH_PCRE16_TRUE@am_libpcre16_la_OBJECTS =  \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_byte_order.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_chartables.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_compile.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_config.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_dfa_exec.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_exec.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_fullinfo.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_get.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_globals.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_jit_compile.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_maketables.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_newline.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_ord2utf16.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_refcount.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_string_utils.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_study.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_tables.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_ucd.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_utf16_utils.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_valid_utf16.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_version.lo \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre16_xclass.lo\n@WITH_PCRE16_TRUE@nodist_libpcre16_la_OBJECTS =  \\\n@WITH_PCRE16_TRUE@\tlibpcre16_la-pcre_chartables.lo\nlibpcre16_la_OBJECTS = $(am_libpcre16_la_OBJECTS) \\\n\t$(nodist_libpcre16_la_OBJECTS)\nlibpcre16_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre16_la_CFLAGS) \\\n\t$(CFLAGS) $(libpcre16_la_LDFLAGS) $(LDFLAGS) -o $@\n@WITH_PCRE16_TRUE@am_libpcre16_la_rpath = -rpath $(libdir)\nlibpcre32_la_DEPENDENCIES =\nam__libpcre32_la_SOURCES_DIST = pcre32_byte_order.c \\\n\tpcre32_chartables.c pcre32_compile.c pcre32_config.c \\\n\tpcre32_dfa_exec.c pcre32_exec.c pcre32_fullinfo.c pcre32_get.c \\\n\tpcre32_globals.c pcre32_jit_compile.c pcre32_maketables.c \\\n\tpcre32_newline.c pcre32_ord2utf32.c pcre32_refcount.c \\\n\tpcre32_string_utils.c pcre32_study.c pcre32_tables.c \\\n\tpcre32_ucd.c pcre32_utf32_utils.c pcre32_valid_utf32.c \\\n\tpcre32_version.c pcre32_xclass.c\n@WITH_PCRE32_TRUE@am_libpcre32_la_OBJECTS =  \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_byte_order.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_chartables.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_compile.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_config.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_dfa_exec.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_exec.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_fullinfo.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_get.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_globals.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_jit_compile.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_maketables.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_newline.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_ord2utf32.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_refcount.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_string_utils.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_study.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_tables.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_ucd.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_utf32_utils.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_valid_utf32.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_version.lo \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre32_xclass.lo\n@WITH_PCRE32_TRUE@nodist_libpcre32_la_OBJECTS =  \\\n@WITH_PCRE32_TRUE@\tlibpcre32_la-pcre_chartables.lo\nlibpcre32_la_OBJECTS = $(am_libpcre32_la_OBJECTS) \\\n\t$(nodist_libpcre32_la_OBJECTS)\nlibpcre32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpcre32_la_CFLAGS) \\\n\t$(CFLAGS) $(libpcre32_la_LDFLAGS) $(LDFLAGS) -o $@\n@WITH_PCRE32_TRUE@am_libpcre32_la_rpath = -rpath $(libdir)\n@WITH_PCRE_CPP_TRUE@libpcrecpp_la_DEPENDENCIES = libpcre.la\nam__libpcrecpp_la_SOURCES_DIST = pcrecpp_internal.h pcrecpp.cc \\\n\tpcre_scanner.cc pcre_stringpiece.cc\n@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_OBJECTS =  \\\n@WITH_PCRE_CPP_TRUE@\tlibpcrecpp_la-pcrecpp.lo \\\n@WITH_PCRE_CPP_TRUE@\tlibpcrecpp_la-pcre_scanner.lo \\\n@WITH_PCRE_CPP_TRUE@\tlibpcrecpp_la-pcre_stringpiece.lo\nlibpcrecpp_la_OBJECTS = $(am_libpcrecpp_la_OBJECTS)\nlibpcrecpp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \\\n\t$(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) $(libpcrecpp_la_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\n@WITH_PCRE_CPP_TRUE@am_libpcrecpp_la_rpath = -rpath $(libdir)\n@WITH_PCRE8_TRUE@libpcreposix_la_DEPENDENCIES = libpcre.la\nam__libpcreposix_la_SOURCES_DIST = pcreposix.c\n@WITH_PCRE8_TRUE@am_libpcreposix_la_OBJECTS =  \\\n@WITH_PCRE8_TRUE@\tlibpcreposix_la-pcreposix.lo\nlibpcreposix_la_OBJECTS = $(am_libpcreposix_la_OBJECTS)\nlibpcreposix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \\\n\t$(libpcreposix_la_CFLAGS) $(CFLAGS) $(libpcreposix_la_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\n@WITH_PCRE8_TRUE@am_libpcreposix_la_rpath = -rpath $(libdir)\nam__dftables_SOURCES_DIST = dftables.c\n@WITH_REBUILD_CHARTABLES_TRUE@am_dftables_OBJECTS =  \\\n@WITH_REBUILD_CHARTABLES_TRUE@\tdftables.$(OBJEXT)\ndftables_OBJECTS = $(am_dftables_OBJECTS)\ndftables_LDADD = $(LDADD)\nam__pcre_jit_test_SOURCES_DIST = pcre_jit_test.c\n@WITH_JIT_TRUE@am_pcre_jit_test_OBJECTS =  \\\n@WITH_JIT_TRUE@\tpcre_jit_test-pcre_jit_test.$(OBJEXT)\npcre_jit_test_OBJECTS = $(am_pcre_jit_test_OBJECTS)\nam__DEPENDENCIES_1 =\n@WITH_GCOV_TRUE@@WITH_JIT_TRUE@am__DEPENDENCIES_2 =  \\\n@WITH_GCOV_TRUE@@WITH_JIT_TRUE@\t$(am__DEPENDENCIES_1)\n@WITH_JIT_TRUE@pcre_jit_test_DEPENDENCIES = $(am__append_15) \\\n@WITH_JIT_TRUE@\t$(am__append_16) $(am__append_17) \\\n@WITH_JIT_TRUE@\t$(am__DEPENDENCIES_2)\npcre_jit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcre_jit_test_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__pcre_scanner_unittest_SOURCES_DIST = pcre_scanner_unittest.cc\n@WITH_PCRE_CPP_TRUE@am_pcre_scanner_unittest_OBJECTS = pcre_scanner_unittest-pcre_scanner_unittest.$(OBJEXT)\npcre_scanner_unittest_OBJECTS = $(am_pcre_scanner_unittest_OBJECTS)\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@am__DEPENDENCIES_3 =  \\\n@WITH_GCOV_TRUE@@WITH_PCRE_CPP_TRUE@\t$(am__DEPENDENCIES_1)\n@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_DEPENDENCIES =  \\\n@WITH_PCRE_CPP_TRUE@\tlibpcrecpp.la $(am__DEPENDENCIES_3)\npcre_scanner_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \\\n\t$(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nam__pcre_stringpiece_unittest_SOURCES_DIST =  \\\n\tpcre_stringpiece_unittest.cc\n@WITH_PCRE_CPP_TRUE@am_pcre_stringpiece_unittest_OBJECTS = pcre_stringpiece_unittest-pcre_stringpiece_unittest.$(OBJEXT)\npcre_stringpiece_unittest_OBJECTS =  \\\n\t$(am_pcre_stringpiece_unittest_OBJECTS)\n@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_DEPENDENCIES =  \\\n@WITH_PCRE_CPP_TRUE@\tlibpcrecpp.la $(am__DEPENDENCIES_3)\npcre_stringpiece_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \\\n\t$(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__pcrecpp_unittest_SOURCES_DIST = pcrecpp_unittest.cc\n@WITH_PCRE_CPP_TRUE@am_pcrecpp_unittest_OBJECTS = pcrecpp_unittest-pcrecpp_unittest.$(OBJEXT)\npcrecpp_unittest_OBJECTS = $(am_pcrecpp_unittest_OBJECTS)\n@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_DEPENDENCIES = libpcrecpp.la \\\n@WITH_PCRE_CPP_TRUE@\t$(am__DEPENDENCIES_3)\npcrecpp_unittest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \\\n\t$(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nam__pcregrep_SOURCES_DIST = pcregrep.c\n@WITH_PCRE8_TRUE@am_pcregrep_OBJECTS = pcregrep-pcregrep.$(OBJEXT)\npcregrep_OBJECTS = $(am_pcregrep_OBJECTS)\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@am__DEPENDENCIES_4 =  \\\n@WITH_GCOV_TRUE@@WITH_PCRE8_TRUE@\t$(am__DEPENDENCIES_1)\n@WITH_PCRE8_TRUE@pcregrep_DEPENDENCIES = $(am__DEPENDENCIES_1) \\\n@WITH_PCRE8_TRUE@\t$(am__DEPENDENCIES_1) libpcre.la \\\n@WITH_PCRE8_TRUE@\tlibpcreposix.la $(am__DEPENDENCIES_4)\npcregrep_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcregrep_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__pcretest_SOURCES_DIST = pcretest.c pcre_printint.c \\\n\tpcre16_printint.c pcre32_printint.c\n@WITH_PCRE8_TRUE@am__objects_1 = pcretest-pcre_printint.$(OBJEXT)\n@WITH_PCRE16_TRUE@am__objects_2 = pcretest-pcre16_printint.$(OBJEXT)\n@WITH_PCRE32_TRUE@am__objects_3 = pcretest-pcre32_printint.$(OBJEXT)\nam_pcretest_OBJECTS = pcretest-pcretest.$(OBJEXT) $(am__objects_1) \\\n\t$(am__objects_2) $(am__objects_3)\npcretest_OBJECTS = $(am_pcretest_OBJECTS)\n@WITH_GCOV_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1)\npcretest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_30) \\\n\t$(am__append_32) $(am__append_34) $(am__DEPENDENCIES_5)\npcretest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pcretest_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__dist_noinst_SCRIPTS_DIST = RunTest RunGrepTest\nSCRIPTS = $(bin_SCRIPTS) $(dist_noinst_SCRIPTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 =\nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 =\nDEFAULT_INCLUDES = -I.@am__isrc@\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__maybe_remake_depfiles = depfiles\nam__depfiles_remade = ./$(DEPDIR)/dftables.Po \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_config.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_get.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_study.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_version.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo \\\n\t./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_config.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_get.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_study.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_version.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo \\\n\t./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_chartables.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_compile.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_config.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_exec.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_get.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_globals.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_maketables.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_newline.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_refcount.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_study.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_tables.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_ucd.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_version.Plo \\\n\t./$(DEPDIR)/libpcre_la-pcre_xclass.Plo \\\n\t./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo \\\n\t./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo \\\n\t./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo \\\n\t./$(DEPDIR)/libpcreposix_la-pcreposix.Plo \\\n\t./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po \\\n\t./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po \\\n\t./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po \\\n\t./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po \\\n\t./$(DEPDIR)/pcregrep-pcregrep.Po \\\n\t./$(DEPDIR)/pcretest-pcre16_printint.Po \\\n\t./$(DEPDIR)/pcretest-pcre32_printint.Po \\\n\t./$(DEPDIR)/pcretest-pcre_printint.Po \\\n\t./$(DEPDIR)/pcretest-pcretest.Po\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 =\nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 =\nCXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)\nLTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CXXFLAGS) $(CXXFLAGS)\nAM_V_CXX = $(am__v_CXX_@AM_V@)\nam__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)\nam__v_CXX_0 = @echo \"  CXX     \" $@;\nam__v_CXX_1 =\nCXXLD = $(CXX)\nCXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \\\n\t$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CXXLD = $(am__v_CXXLD_@AM_V@)\nam__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)\nam__v_CXXLD_0 = @echo \"  CXXLD   \" $@;\nam__v_CXXLD_1 =\nSOURCES = $(libpcre_la_SOURCES) $(nodist_libpcre_la_SOURCES) \\\n\t$(libpcre16_la_SOURCES) $(nodist_libpcre16_la_SOURCES) \\\n\t$(libpcre32_la_SOURCES) $(nodist_libpcre32_la_SOURCES) \\\n\t$(libpcrecpp_la_SOURCES) $(libpcreposix_la_SOURCES) \\\n\t$(dftables_SOURCES) $(pcre_jit_test_SOURCES) \\\n\t$(pcre_scanner_unittest_SOURCES) \\\n\t$(pcre_stringpiece_unittest_SOURCES) \\\n\t$(pcrecpp_unittest_SOURCES) $(pcregrep_SOURCES) \\\n\t$(pcretest_SOURCES)\nDIST_SOURCES = $(am__libpcre_la_SOURCES_DIST) \\\n\t$(am__libpcre16_la_SOURCES_DIST) \\\n\t$(am__libpcre32_la_SOURCES_DIST) \\\n\t$(am__libpcrecpp_la_SOURCES_DIST) \\\n\t$(am__libpcreposix_la_SOURCES_DIST) \\\n\t$(am__dftables_SOURCES_DIST) $(am__pcre_jit_test_SOURCES_DIST) \\\n\t$(am__pcre_scanner_unittest_SOURCES_DIST) \\\n\t$(am__pcre_stringpiece_unittest_SOURCES_DIST) \\\n\t$(am__pcrecpp_unittest_SOURCES_DIST) \\\n\t$(am__pcregrep_SOURCES_DIST) $(am__pcretest_SOURCES_DIST)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nman1dir = $(mandir)/man1\nman3dir = $(mandir)/man3\nNROFF = nroff\nMANS = $(dist_man_MANS) $(man_MANS)\nDATA = $(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \\\n\t$(html_DATA) $(pkgconfig_DATA)\nam__include_HEADERS_DIST = pcreposix.h pcrecpp.h pcre_scanner.h\nHEADERS = $(include_HEADERS) $(nodist_include_HEADERS)\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \\\n\t$(LISP)config.h.in\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nCSCOPE = cscope\nAM_RECURSIVE_TARGETS = cscope check recheck\nam__tty_colors_dummy = \\\n  mgn= red= grn= lgn= blu= brg= std=; \\\n  am__color_tests=no\nam__tty_colors = { \\\n  $(am__tty_colors_dummy); \\\n  if test \"X$(AM_COLOR_TESTS)\" = Xno; then \\\n    am__color_tests=no; \\\n  elif test \"X$(AM_COLOR_TESTS)\" = Xalways; then \\\n    am__color_tests=yes; \\\n  elif test \"X$$TERM\" != Xdumb && { test -t 1; } 2>/dev/null; then \\\n    am__color_tests=yes; \\\n  fi; \\\n  if test $$am__color_tests = yes; then \\\n    red='\u001b[0;31m'; \\\n    grn='\u001b[0;32m'; \\\n    lgn='\u001b[1;32m'; \\\n    blu='\u001b[1;34m'; \\\n    mgn='\u001b[0;35m'; \\\n    brg='\u001b[1m'; \\\n    std='\u001b[m'; \\\n  fi; \\\n}\nam__recheck_rx = ^[ \t]*:recheck:[ \t]*\nam__global_test_result_rx = ^[ \t]*:global-test-result:[ \t]*\nam__copy_in_global_log_rx = ^[ \t]*:copy-in-global-log:[ \t]*\n# A command that, given a newline-separated list of test names on the\n# standard input, print the name of the tests that are to be re-run\n# upon \"make recheck\".\nam__list_recheck_tests = $(AWK) '{ \\\n  recheck = 1; \\\n  while ((rc = (getline line < ($$0 \".trs\"))) != 0) \\\n    { \\\n      if (rc < 0) \\\n        { \\\n          if ((getline line2 < ($$0 \".log\")) < 0) \\\n\t    recheck = 0; \\\n          break; \\\n        } \\\n      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \\\n        { \\\n          recheck = 0; \\\n          break; \\\n        } \\\n      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \\\n        { \\\n          break; \\\n        } \\\n    }; \\\n  if (recheck) \\\n    print $$0; \\\n  close ($$0 \".trs\"); \\\n  close ($$0 \".log\"); \\\n}'\n# A command that, given a newline-separated list of test names on the\n# standard input, create the global log from their .trs and .log files.\nam__create_global_log = $(AWK) ' \\\nfunction fatal(msg) \\\n{ \\\n  print \"fatal: making $@: \" msg | \"cat >&2\"; \\\n  exit 1; \\\n} \\\nfunction rst_section(header) \\\n{ \\\n  print header; \\\n  len = length(header); \\\n  for (i = 1; i <= len; i = i + 1) \\\n    printf \"=\"; \\\n  printf \"\\n\\n\"; \\\n} \\\n{ \\\n  copy_in_global_log = 1; \\\n  global_test_result = \"RUN\"; \\\n  while ((rc = (getline line < ($$0 \".trs\"))) != 0) \\\n    { \\\n      if (rc < 0) \\\n         fatal(\"failed to read from \" $$0 \".trs\"); \\\n      if (line ~ /$(am__global_test_result_rx)/) \\\n        { \\\n          sub(\"$(am__global_test_result_rx)\", \"\", line); \\\n          sub(\"[ \t]*$$\", \"\", line); \\\n          global_test_result = line; \\\n        } \\\n      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \\\n        copy_in_global_log = 0; \\\n    }; \\\n  if (copy_in_global_log) \\\n    { \\\n      rst_section(global_test_result \": \" $$0); \\\n      while ((rc = (getline line < ($$0 \".log\"))) != 0) \\\n      { \\\n        if (rc < 0) \\\n          fatal(\"failed to read from \" $$0 \".log\"); \\\n        print line; \\\n      }; \\\n      printf \"\\n\"; \\\n    }; \\\n  close ($$0 \".trs\"); \\\n  close ($$0 \".log\"); \\\n}'\n# Restructured Text title.\nam__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }\n# Solaris 10 'make', and several other traditional 'make' implementations,\n# pass \"-e\" to $(SHELL), and POSIX 2008 even requires this.  Work around it\n# by disabling -e (using the XSI extension \"set +e\") if it's set.\nam__sh_e_setup = case $$- in *e*) set +e;; esac\n# Default flags passed to test drivers.\nam__common_driver_flags = \\\n  --color-tests \"$$am__color_tests\" \\\n  --enable-hard-errors \"$$am__enable_hard_errors\" \\\n  --expect-failure \"$$am__expect_failure\"\n# To be inserted before the command running the test.  Creates the\n# directory for the log if needed.  Stores in $dir the directory\n# containing $f, in $tst the test, in $log the log.  Executes the\n# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and\n# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that\n# will run the test scripts (or their associated LOG_COMPILER, if\n# thy have one).\nam__check_pre = \\\n$(am__sh_e_setup);\t\t\t\t\t\\\n$(am__vpath_adj_setup) $(am__vpath_adj)\t\t\t\\\n$(am__tty_colors);\t\t\t\t\t\\\nsrcdir=$(srcdir); export srcdir;\t\t\t\\\ncase \"$@\" in\t\t\t\t\t\t\\\n  */*) am__odir=`echo \"./$@\" | sed 's|/[^/]*$$||'`;;\t\\\n    *) am__odir=.;; \t\t\t\t\t\\\nesac;\t\t\t\t\t\t\t\\\ntest \"x$$am__odir\" = x\".\" || test -d \"$$am__odir\" \t\\\n  || $(MKDIR_P) \"$$am__odir\" || exit $$?;\t\t\\\nif test -f \"./$$f\"; then dir=./;\t\t\t\\\nelif test -f \"$$f\"; then dir=;\t\t\t\t\\\nelse dir=\"$(srcdir)/\"; fi;\t\t\t\t\\\ntst=$$dir$$f; log='$@'; \t\t\t\t\\\nif test -n '$(DISABLE_HARD_ERRORS)'; then\t\t\\\n  am__enable_hard_errors=no; \t\t\t\t\\\nelse\t\t\t\t\t\t\t\\\n  am__enable_hard_errors=yes; \t\t\t\t\\\nfi; \t\t\t\t\t\t\t\\\ncase \" $(XFAIL_TESTS) \" in\t\t\t\t\\\n  *[\\ \\\t]$$f[\\ \\\t]* | *[\\ \\\t]$$dir$$f[\\ \\\t]*) \\\n    am__expect_failure=yes;;\t\t\t\t\\\n  *)\t\t\t\t\t\t\t\\\n    am__expect_failure=no;;\t\t\t\t\\\nesac; \t\t\t\t\t\t\t\\\n$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)\n# A shell command to get the names of the tests scripts with any registered\n# extension removed (i.e., equivalently, the names of the test logs, with\n# the '.log' extension removed).  The result is saved in the shell variable\n# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,\n# we cannot use something simpler, involving e.g., \"$(TEST_LOGS:.log=)\",\n# since that might cause problem with VPATH rewrites for suffix-less tests.\n# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.\nam__set_TESTS_bases = \\\n  bases='$(TEST_LOGS)'; \\\n  bases=`for i in $$bases; do echo $$i; done | sed 's/\\.log$$//'`; \\\n  bases=`echo $$bases`\nRECHECK_LOGS = $(TEST_LOGS)\nTEST_SUITE_LOG = test-suite.log\nTEST_EXTENSIONS = @EXEEXT@ .test\nLOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver\nLOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)\nam__set_b = \\\n  case '$@' in \\\n    */*) \\\n      case '$*' in \\\n        */*) b='$*';; \\\n          *) b=`echo '$@' | sed 's/\\.log$$//'`; \\\n       esac;; \\\n    *) \\\n      b='$*';; \\\n  esac\nam__test_logs1 = $(TESTS:=.log)\nam__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)\nTEST_LOGS = $(am__test_logs2:.test.log=.log)\nTEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver\nTEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \\\n\t$(TEST_LOG_FLAGS)\nam__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \\\n\t$(srcdir)/config.h.in $(srcdir)/libpcre.pc.in \\\n\t$(srcdir)/libpcre16.pc.in $(srcdir)/libpcre32.pc.in \\\n\t$(srcdir)/libpcrecpp.pc.in $(srcdir)/libpcreposix.pc.in \\\n\t$(srcdir)/pcre-config.in $(srcdir)/pcre.h.in \\\n\t$(srcdir)/pcre_stringpiece.h.in $(srcdir)/pcrecpparg.h.in \\\n\tAUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \\\n\tconfig.guess config.sub depcomp install-sh ltmain.sh missing \\\n\ttest-driver\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  if test -d \"$(distdir)\"; then \\\n    find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n      && rm -rf \"$(distdir)\" \\\n      || { sleep 5 && rm -rf \"$(distdir)\"; }; \\\n  else :; fi\nam__post_remove_distdir = $(am__remove_distdir)\nDIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip\nGZIP_ENV = --best\nDIST_TARGETS = dist-bzip2 dist-gzip dist-zip\ndistuninstallcheck_listfiles = find . -type f -print\nam__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \\\n  | sed 's|^\\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nAS = @AS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCXX = @CXX@\nCXXCPP = @CXXCPP@\nCXXDEPMODE = @CXXDEPMODE@\nCXXFLAGS = @CXXFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nEXTRA_LIBPCRE16_LDFLAGS = @EXTRA_LIBPCRE16_LDFLAGS@\nEXTRA_LIBPCRE32_LDFLAGS = @EXTRA_LIBPCRE32_LDFLAGS@\nEXTRA_LIBPCRECPP_LDFLAGS = @EXTRA_LIBPCRECPP_LDFLAGS@\nEXTRA_LIBPCREPOSIX_LDFLAGS = @EXTRA_LIBPCREPOSIX_LDFLAGS@\nEXTRA_LIBPCRE_LDFLAGS = @EXTRA_LIBPCRE_LDFLAGS@\nFGREP = @FGREP@\nGCOV_CFLAGS = @GCOV_CFLAGS@\nGCOV_CXXFLAGS = @GCOV_CXXFLAGS@\nGCOV_LIBS = @GCOV_LIBS@\nGENHTML = @GENHTML@\nGREP = @GREP@\nHAVE_VISIBILITY = @HAVE_VISIBILITY@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLCOV = @LCOV@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBBZ2 = @LIBBZ2@\nLIBOBJS = @LIBOBJS@\nLIBREADLINE = @LIBREADLINE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBZ = @LIBZ@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nLT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_DATE = @PCRE_DATE@\nPCRE_MAJOR = @PCRE_MAJOR@\nPCRE_MINOR = @PCRE_MINOR@\nPCRE_PRERELEASE = @PCRE_PRERELEASE@\nPCRE_STATIC_CFLAG = @PCRE_STATIC_CFLAG@\nPKG_CONFIG = @PKG_CONFIG@\nPKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@\nPKG_CONFIG_PATH = @PKG_CONFIG_PATH@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSHTOOL = @SHTOOL@\nSTRIP = @STRIP@\nVALGRIND_CFLAGS = @VALGRIND_CFLAGS@\nVALGRIND_LIBS = @VALGRIND_LIBS@\nVERSION = @VERSION@\nVISIBILITY_CFLAGS = @VISIBILITY_CFLAGS@\nVISIBILITY_CXXFLAGS = @VISIBILITY_CXXFLAGS@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_CXX = @ac_ct_CXX@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nenable_cpp = @enable_cpp@\nenable_pcre16 = @enable_pcre16@\nenable_pcre32 = @enable_pcre32@\nenable_pcre8 = @enable_pcre8@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_have_bits_type_traits = @pcre_have_bits_type_traits@\npcre_have_long_long = @pcre_have_long_long@\npcre_have_type_traits = @pcre_have_type_traits@\npcre_have_ulong_long = @pcre_have_ulong_long@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nACLOCAL_AMFLAGS = -I m4\ndist_doc_DATA = \\\n  doc/pcre.txt \\\n  doc/pcre-config.txt \\\n  doc/pcregrep.txt \\\n  doc/pcretest.txt \\\n  AUTHORS \\\n  COPYING \\\n  ChangeLog \\\n  LICENCE \\\n  NEWS \\\n  README\n\n\n# Note that pcrecpp.html is not in this list; it is listed separately below.\ndist_html_DATA = \\\n  doc/html/NON-AUTOTOOLS-BUILD.txt \\\n  doc/html/README.txt \\\n  doc/html/index.html \\\n  doc/html/pcre-config.html \\\n  doc/html/pcre.html \\\n  doc/html/pcre16.html \\\n  doc/html/pcre32.html \\\n  doc/html/pcre_assign_jit_stack.html \\\n  doc/html/pcre_compile.html \\\n  doc/html/pcre_compile2.html \\\n  doc/html/pcre_config.html \\\n  doc/html/pcre_copy_named_substring.html \\\n  doc/html/pcre_copy_substring.html \\\n  doc/html/pcre_dfa_exec.html \\\n  doc/html/pcre_exec.html \\\n  doc/html/pcre_free_study.html \\\n  doc/html/pcre_free_substring.html \\\n  doc/html/pcre_free_substring_list.html \\\n  doc/html/pcre_fullinfo.html \\\n  doc/html/pcre_get_named_substring.html \\\n  doc/html/pcre_get_stringnumber.html \\\n  doc/html/pcre_get_stringtable_entries.html \\\n  doc/html/pcre_get_substring.html \\\n  doc/html/pcre_get_substring_list.html \\\n  doc/html/pcre_jit_exec.html \\\n  doc/html/pcre_jit_stack_alloc.html \\\n  doc/html/pcre_jit_stack_free.html \\\n  doc/html/pcre_maketables.html \\\n  doc/html/pcre_pattern_to_host_byte_order.html \\\n  doc/html/pcre_refcount.html \\\n  doc/html/pcre_study.html \\\n  doc/html/pcre_utf16_to_host_byte_order.html \\\n  doc/html/pcre_utf32_to_host_byte_order.html \\\n  doc/html/pcre_version.html \\\n  doc/html/pcreapi.html \\\n  doc/html/pcrebuild.html \\\n  doc/html/pcrecallout.html \\\n  doc/html/pcrecompat.html \\\n  doc/html/pcredemo.html \\\n  doc/html/pcregrep.html \\\n  doc/html/pcrejit.html \\\n  doc/html/pcrelimits.html \\\n  doc/html/pcrematching.html \\\n  doc/html/pcrepartial.html \\\n  doc/html/pcrepattern.html \\\n  doc/html/pcreperform.html \\\n  doc/html/pcreposix.html \\\n  doc/html/pcreprecompile.html \\\n  doc/html/pcresample.html \\\n  doc/html/pcrestack.html \\\n  doc/html/pcresyntax.html \\\n  doc/html/pcretest.html \\\n  doc/html/pcreunicode.html\n\npcrecpp_html = doc/html/pcrecpp.html\ndist_noinst_DATA = $(pcrecpp_html)\n@WITH_PCRE_CPP_TRUE@html_DATA = $(pcrecpp_html)\n\n# The Libtool libraries to install.  We'll add to this later.\nlib_LTLIBRARIES = $(am__append_4) $(am__append_5) $(am__append_6) \\\n\t$(am__append_20) $(am__append_22)\ncheck_SCRIPTS =\ndist_noinst_SCRIPTS = RunTest $(am__append_39)\n\n# Additional files to delete on 'make clean' and 'make maintainer-clean'.\nCLEANFILES = pcre_chartables.c testsavedregex teststderr testtemp* \\\n\ttesttry testNinput testtrygrep teststderrgrep testNinputgrep\nMAINTAINERCLEANFILES = pcre.h.generic config.h.generic\n\n# Additional files to bundle with the distribution, over and above what\n# the Autotools include by default.\n\n# These files contain additional m4 macros that are used by autoconf.\n\n# These files contain maintenance information\n\n# These files are used in the preparation of a release\n\n# These files are to do with building for Virtual Pascal\n\n# These files are usable versions of pcre.h and config.h that are distributed\n# for the benefit of people who are building PCRE manually, without the\n# Autotools support.\n\n# The pcre_chartables.c.dist file is the default version of pcre_chartables.c,\n# used unless --enable-rebuild-chartables is specified.\n\n# The JIT compiler lives in a separate directory, but its files are #included\n# when pcre_jit_compile.c is processed, so they must be distributed.\n\n# PCRE demonstration program. No longer built automatcally. The point is that\n# the users should build it themselves. So just distribute the source.\n# noinst_PROGRAMS += pcredemo\n# pcredemo_SOURCES = pcredemo.c\n# pcredemo_LDADD = libpcre.la\nEXTRA_DIST = m4/ax_pthread.m4 m4/pcre_visibility.m4 doc/perltest.txt \\\n\tNON-UNIX-USE NON-AUTOTOOLS-BUILD HACKING PrepareRelease \\\n\tCheckMan CleanTxt Detrail 132html doc/index.html.src \\\n\tmakevp.bat makevp_c.txt makevp_l.txt pcregexp.pas \\\n\tpcre.h.generic config.h.generic pcre_chartables.c.dist \\\n\tsljit/sljitConfig.h sljit/sljitConfigInternal.h \\\n\tsljit/sljitExecAllocator.c sljit/sljitLir.c sljit/sljitLir.h \\\n\tsljit/sljitNativeARM_32.c sljit/sljitNativeARM_64.c \\\n\tsljit/sljitNativeARM_T2_32.c sljit/sljitNativeMIPS_32.c \\\n\tsljit/sljitNativeMIPS_64.c sljit/sljitNativeMIPS_common.c \\\n\tsljit/sljitNativePPC_32.c sljit/sljitNativePPC_64.c \\\n\tsljit/sljitNativePPC_common.c sljit/sljitNativeSPARC_32.c \\\n\tsljit/sljitNativeSPARC_common.c sljit/sljitNativeTILEGX_64.c \\\n\tsljit/sljitNativeTILEGX-encoder.c sljit/sljitNativeX86_32.c \\\n\tsljit/sljitNativeX86_64.c sljit/sljitNativeX86_common.c \\\n\tsljit/sljitUtils.c RunTest.bat testdata/grepbinary \\\n\ttestdata/grepfilelist testdata/grepinput testdata/grepinput3 \\\n\ttestdata/grepinput8 testdata/grepinputv testdata/grepinputx \\\n\ttestdata/greplist testdata/grepoutput testdata/grepoutput8 \\\n\ttestdata/grepoutputN testdata/greppatN4 testdata/saved16 \\\n\ttestdata/saved16BE-1 testdata/saved16BE-2 testdata/saved16LE-1 \\\n\ttestdata/saved16LE-2 testdata/saved32 testdata/saved32BE-1 \\\n\ttestdata/saved32BE-2 testdata/saved32LE-1 testdata/saved32LE-2 \\\n\ttestdata/saved8 testdata/testinput1 testdata/testinput2 \\\n\ttestdata/testinput3 testdata/testinput4 testdata/testinput5 \\\n\ttestdata/testinput6 testdata/testinput7 testdata/testinput8 \\\n\ttestdata/testinput9 testdata/testinput10 testdata/testinput11 \\\n\ttestdata/testinput12 testdata/testinput13 testdata/testinput14 \\\n\ttestdata/testinput15 testdata/testinput16 testdata/testinput17 \\\n\ttestdata/testinput18 testdata/testinput19 testdata/testinput20 \\\n\ttestdata/testinput21 testdata/testinput22 testdata/testinput23 \\\n\ttestdata/testinput24 testdata/testinput25 testdata/testinput26 \\\n\ttestdata/testinputEBC testdata/testoutput1 \\\n\ttestdata/testoutput2 testdata/testoutput3 \\\n\ttestdata/testoutput3A testdata/testoutput3B \\\n\ttestdata/testoutput4 testdata/testoutput5 testdata/testoutput6 \\\n\ttestdata/testoutput7 testdata/testoutput8 testdata/testoutput9 \\\n\ttestdata/testoutput10 testdata/testoutput11-8 \\\n\ttestdata/testoutput11-16 testdata/testoutput11-32 \\\n\ttestdata/testoutput12 testdata/testoutput13 \\\n\ttestdata/testoutput14 testdata/testoutput15 \\\n\ttestdata/testoutput16 testdata/testoutput17 \\\n\ttestdata/testoutput18-16 testdata/testoutput18-32 \\\n\ttestdata/testoutput19 testdata/testoutput20 \\\n\ttestdata/testoutput21-16 testdata/testoutput21-32 \\\n\ttestdata/testoutput22-16 testdata/testoutput22-32 \\\n\ttestdata/testoutput23 testdata/testoutput24 \\\n\ttestdata/testoutput25 testdata/testoutput26 \\\n\ttestdata/testoutputEBC testdata/valgrind-jit.supp \\\n\ttestdata/wintestinput3 testdata/wintestoutput3 perltest.pl \\\n\tpcredemo.c $(pcrecpp_man) cmake/COPYING-CMAKE-SCRIPTS \\\n\tcmake/FindPackageHandleStandardArgs.cmake \\\n\tcmake/FindReadline.cmake cmake/FindEditline.cmake \\\n\tCMakeLists.txt config-cmake.h.in\n\n# These are the header files we'll install. We do not distribute pcre.h because\n# it is generated from pcre.h.in.\nnodist_include_HEADERS = pcre.h $(am__append_1)\ninclude_HEADERS = pcreposix.h $(am__append_2)\nbin_SCRIPTS = pcre-config\n@WITH_REBUILD_CHARTABLES_TRUE@dftables_SOURCES = dftables.c\nBUILT_SOURCES = pcre_chartables.c\n@WITH_PCRE8_TRUE@libpcre_la_SOURCES = \\\n@WITH_PCRE8_TRUE@  pcre_byte_order.c \\\n@WITH_PCRE8_TRUE@  pcre_compile.c \\\n@WITH_PCRE8_TRUE@  pcre_config.c \\\n@WITH_PCRE8_TRUE@  pcre_dfa_exec.c \\\n@WITH_PCRE8_TRUE@  pcre_exec.c \\\n@WITH_PCRE8_TRUE@  pcre_fullinfo.c \\\n@WITH_PCRE8_TRUE@  pcre_get.c \\\n@WITH_PCRE8_TRUE@  pcre_globals.c \\\n@WITH_PCRE8_TRUE@  pcre_internal.h \\\n@WITH_PCRE8_TRUE@  pcre_jit_compile.c \\\n@WITH_PCRE8_TRUE@  pcre_maketables.c \\\n@WITH_PCRE8_TRUE@  pcre_newline.c \\\n@WITH_PCRE8_TRUE@  pcre_ord2utf8.c \\\n@WITH_PCRE8_TRUE@  pcre_refcount.c \\\n@WITH_PCRE8_TRUE@  pcre_string_utils.c \\\n@WITH_PCRE8_TRUE@  pcre_study.c \\\n@WITH_PCRE8_TRUE@  pcre_tables.c \\\n@WITH_PCRE8_TRUE@  pcre_ucd.c \\\n@WITH_PCRE8_TRUE@  pcre_valid_utf8.c \\\n@WITH_PCRE8_TRUE@  pcre_version.c \\\n@WITH_PCRE8_TRUE@  pcre_xclass.c \\\n@WITH_PCRE8_TRUE@  ucp.h\n\n@WITH_PCRE8_TRUE@libpcre_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) \\\n@WITH_PCRE8_TRUE@\t$(am__append_7) $(am__append_10)\n@WITH_PCRE8_TRUE@libpcre_la_LIBADD =\n@WITH_PCRE8_TRUE@nodist_libpcre_la_SOURCES = \\\n@WITH_PCRE8_TRUE@  pcre_chartables.c\n\n@WITH_PCRE16_TRUE@libpcre16_la_SOURCES = \\\n@WITH_PCRE16_TRUE@  pcre16_byte_order.c \\\n@WITH_PCRE16_TRUE@  pcre16_chartables.c \\\n@WITH_PCRE16_TRUE@  pcre16_compile.c \\\n@WITH_PCRE16_TRUE@  pcre16_config.c \\\n@WITH_PCRE16_TRUE@  pcre16_dfa_exec.c \\\n@WITH_PCRE16_TRUE@  pcre16_exec.c \\\n@WITH_PCRE16_TRUE@  pcre16_fullinfo.c \\\n@WITH_PCRE16_TRUE@  pcre16_get.c \\\n@WITH_PCRE16_TRUE@  pcre16_globals.c \\\n@WITH_PCRE16_TRUE@  pcre16_jit_compile.c \\\n@WITH_PCRE16_TRUE@  pcre16_maketables.c \\\n@WITH_PCRE16_TRUE@  pcre16_newline.c \\\n@WITH_PCRE16_TRUE@  pcre16_ord2utf16.c \\\n@WITH_PCRE16_TRUE@  pcre16_refcount.c \\\n@WITH_PCRE16_TRUE@  pcre16_string_utils.c \\\n@WITH_PCRE16_TRUE@  pcre16_study.c \\\n@WITH_PCRE16_TRUE@  pcre16_tables.c \\\n@WITH_PCRE16_TRUE@  pcre16_ucd.c \\\n@WITH_PCRE16_TRUE@  pcre16_utf16_utils.c \\\n@WITH_PCRE16_TRUE@  pcre16_valid_utf16.c \\\n@WITH_PCRE16_TRUE@  pcre16_version.c \\\n@WITH_PCRE16_TRUE@  pcre16_xclass.c\n\n@WITH_PCRE16_TRUE@libpcre16_la_CFLAGS = $(VISIBILITY_CFLAGS) \\\n@WITH_PCRE16_TRUE@\t$(AM_CFLAGS) $(am__append_8) \\\n@WITH_PCRE16_TRUE@\t$(am__append_11)\n@WITH_PCRE16_TRUE@libpcre16_la_LIBADD =\n@WITH_PCRE16_TRUE@nodist_libpcre16_la_SOURCES = \\\n@WITH_PCRE16_TRUE@  pcre_chartables.c\n\n@WITH_PCRE32_TRUE@libpcre32_la_SOURCES = \\\n@WITH_PCRE32_TRUE@  pcre32_byte_order.c \\\n@WITH_PCRE32_TRUE@  pcre32_chartables.c \\\n@WITH_PCRE32_TRUE@  pcre32_compile.c \\\n@WITH_PCRE32_TRUE@  pcre32_config.c \\\n@WITH_PCRE32_TRUE@  pcre32_dfa_exec.c \\\n@WITH_PCRE32_TRUE@  pcre32_exec.c \\\n@WITH_PCRE32_TRUE@  pcre32_fullinfo.c \\\n@WITH_PCRE32_TRUE@  pcre32_get.c \\\n@WITH_PCRE32_TRUE@  pcre32_globals.c \\\n@WITH_PCRE32_TRUE@  pcre32_jit_compile.c \\\n@WITH_PCRE32_TRUE@  pcre32_maketables.c \\\n@WITH_PCRE32_TRUE@  pcre32_newline.c \\\n@WITH_PCRE32_TRUE@  pcre32_ord2utf32.c \\\n@WITH_PCRE32_TRUE@  pcre32_refcount.c \\\n@WITH_PCRE32_TRUE@  pcre32_string_utils.c \\\n@WITH_PCRE32_TRUE@  pcre32_study.c \\\n@WITH_PCRE32_TRUE@  pcre32_tables.c \\\n@WITH_PCRE32_TRUE@  pcre32_ucd.c \\\n@WITH_PCRE32_TRUE@  pcre32_utf32_utils.c \\\n@WITH_PCRE32_TRUE@  pcre32_valid_utf32.c \\\n@WITH_PCRE32_TRUE@  pcre32_version.c \\\n@WITH_PCRE32_TRUE@  pcre32_xclass.c\n\n@WITH_PCRE32_TRUE@libpcre32_la_CFLAGS = $(VISIBILITY_CFLAGS) \\\n@WITH_PCRE32_TRUE@\t$(AM_CFLAGS) $(am__append_9) \\\n@WITH_PCRE32_TRUE@\t$(am__append_12)\n@WITH_PCRE32_TRUE@libpcre32_la_LIBADD =\n@WITH_PCRE32_TRUE@nodist_libpcre32_la_SOURCES = \\\n@WITH_PCRE32_TRUE@  pcre_chartables.c\n\n@WITH_PCRE8_TRUE@libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS)\n@WITH_PCRE16_TRUE@libpcre16_la_LDFLAGS = $(EXTRA_LIBPCRE16_LDFLAGS)\n@WITH_PCRE32_TRUE@libpcre32_la_LDFLAGS = $(EXTRA_LIBPCRE32_LDFLAGS)\n@WITH_JIT_TRUE@pcre_jit_test_SOURCES = pcre_jit_test.c\n@WITH_JIT_TRUE@pcre_jit_test_CFLAGS = $(AM_CFLAGS) $(am__append_18)\n@WITH_JIT_TRUE@pcre_jit_test_LDADD = $(am__append_15) $(am__append_16) \\\n@WITH_JIT_TRUE@\t$(am__append_17) $(am__append_19)\n@WITH_PCRE8_TRUE@libpcreposix_la_SOURCES = \\\n@WITH_PCRE8_TRUE@  pcreposix.c\n\n@WITH_PCRE8_TRUE@libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) \\\n@WITH_PCRE8_TRUE@\t$(AM_CFLAGS) $(am__append_21)\n@WITH_PCRE8_TRUE@libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS)\n@WITH_PCRE8_TRUE@libpcreposix_la_LIBADD = libpcre.la\n@WITH_PCRE_CPP_TRUE@libpcrecpp_la_SOURCES = \\\n@WITH_PCRE_CPP_TRUE@  pcrecpp_internal.h \\\n@WITH_PCRE_CPP_TRUE@  pcrecpp.cc \\\n@WITH_PCRE_CPP_TRUE@  pcre_scanner.cc \\\n@WITH_PCRE_CPP_TRUE@  pcre_stringpiece.cc\n\n@WITH_PCRE_CPP_TRUE@libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) \\\n@WITH_PCRE_CPP_TRUE@\t$(AM_CXXFLAGS) $(am__append_25)\n@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS)\n@WITH_PCRE_CPP_TRUE@libpcrecpp_la_LIBADD = libpcre.la\n@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc\n@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_CXXFLAGS = $(AM_CXXFLAGS)\n@WITH_PCRE_CPP_TRUE@pcrecpp_unittest_LDADD = libpcrecpp.la \\\n@WITH_PCRE_CPP_TRUE@\t$(am__append_26)\n@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc\n@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_CXXFLAGS = $(AM_CXXFLAGS)\n@WITH_PCRE_CPP_TRUE@pcre_scanner_unittest_LDADD = libpcrecpp.la \\\n@WITH_PCRE_CPP_TRUE@\t$(am__append_27)\n@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc\n@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_CXXFLAGS = $(AM_CXXFLAGS)\n@WITH_PCRE_CPP_TRUE@pcre_stringpiece_unittest_LDADD = libpcrecpp.la \\\n@WITH_PCRE_CPP_TRUE@\t$(am__append_28)\npcretest_SOURCES = pcretest.c $(am__append_29) $(am__append_31) \\\n\t$(am__append_33)\npcretest_CFLAGS = $(AM_CFLAGS) $(am__append_35) $(am__append_36)\npcretest_LDADD = $(LIBREADLINE) $(am__append_30) $(am__append_32) \\\n\t$(am__append_34) $(am__append_37)\n@WITH_PCRE8_TRUE@pcregrep_SOURCES = pcregrep.c\n@WITH_PCRE8_TRUE@pcregrep_CFLAGS = $(AM_CFLAGS) $(am__append_41)\n@WITH_PCRE8_TRUE@pcregrep_LDADD = $(LIBZ) $(LIBBZ2) libpcre.la \\\n@WITH_PCRE8_TRUE@\tlibpcreposix.la $(am__append_42)\n\n# A PCRE user submitted the following addition, saying that it \"will allow\n# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a\n# nice DLL for Windows use\". (It is used by the pcre.dll target.)\nDLL_OBJS = pcre_byte_order.o pcre_compile.o pcre_config.o \\\n\tpcre_dfa_exec.o pcre_exec.o pcre_fullinfo.o pcre_get.o \\\n\tpcre_globals.o pcre_jit_compile.o pcre_maketables.o \\\n\tpcre_newline.o pcre_ord2utf8.o pcre_refcount.o \\\n\tpcre_study.o pcre_tables.o pcre_ucd.o \\\n\tpcre_valid_utf8.o pcre_version.o pcre_chartables.o \\\n\tpcre_xclass.o\n\n\n# We have .pc files for pkg-config users.\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = libpcre.pc libpcreposix.pc $(am__append_43) \\\n\t$(am__append_44) $(am__append_45)\n\n# Note that pcrecpp.3 is not in this list, but is included separately below.\ndist_man_MANS = \\\n  doc/pcre-config.1 \\\n  doc/pcre.3 \\\n  doc/pcre16.3 \\\n  doc/pcre32.3 \\\n  doc/pcre_assign_jit_stack.3 \\\n  doc/pcre_compile.3 \\\n  doc/pcre_compile2.3 \\\n  doc/pcre_config.3 \\\n  doc/pcre_copy_named_substring.3 \\\n  doc/pcre_copy_substring.3 \\\n  doc/pcre_dfa_exec.3 \\\n  doc/pcre_exec.3 \\\n  doc/pcre_free_study.3 \\\n  doc/pcre_free_substring.3 \\\n  doc/pcre_free_substring_list.3 \\\n  doc/pcre_fullinfo.3 \\\n  doc/pcre_get_named_substring.3 \\\n  doc/pcre_get_stringnumber.3 \\\n  doc/pcre_get_stringtable_entries.3 \\\n  doc/pcre_get_substring.3 \\\n  doc/pcre_get_substring_list.3 \\\n  doc/pcre_jit_exec.3 \\\n  doc/pcre_jit_stack_alloc.3 \\\n  doc/pcre_jit_stack_free.3 \\\n  doc/pcre_maketables.3 \\\n  doc/pcre_pattern_to_host_byte_order.3 \\\n  doc/pcre_refcount.3 \\\n  doc/pcre_study.3 \\\n  doc/pcre_utf16_to_host_byte_order.3 \\\n  doc/pcre_utf32_to_host_byte_order.3 \\\n  doc/pcre_version.3 \\\n  doc/pcreapi.3 \\\n  doc/pcrebuild.3 \\\n  doc/pcrecallout.3 \\\n  doc/pcrecompat.3 \\\n  doc/pcredemo.3 \\\n  doc/pcregrep.1 \\\n  doc/pcrejit.3 \\\n  doc/pcrelimits.3 \\\n  doc/pcrematching.3 \\\n  doc/pcrepartial.3 \\\n  doc/pcrepattern.3 \\\n  doc/pcreperform.3 \\\n  doc/pcreposix.3 \\\n  doc/pcreprecompile.3 \\\n  doc/pcresample.3 \\\n  doc/pcrestack.3 \\\n  doc/pcresyntax.3 \\\n  doc/pcretest.1 \\\n  doc/pcreunicode.3\n\npcrecpp_man = doc/pcrecpp.3\n@WITH_PCRE_CPP_TRUE@man_MANS = $(pcrecpp_man)\n\n# gcov/lcov code coverage reporting\n\n# Coverage reporting targets:\n#\n# coverage: Create a coverage report from 'make check'\n# coverage-baseline: Capture baseline coverage information\n# coverage-reset: This zeros the coverage counters only\n# coverage-report: This creates the coverage report only\n# coverage-clean-report: This removes the generated coverage report\n#   without cleaning the coverage data itself\n# coverage-clean-data: This removes the captured coverage data without\n#   removing the coverage files created at compile time (*.gcno)\n# coverage-clean: This cleans all coverage data including the generated\n#   coverage report.\n@WITH_GCOV_TRUE@COVERAGE_TEST_NAME = $(PACKAGE)\n@WITH_GCOV_TRUE@COVERAGE_NAME = $(PACKAGE)-$(VERSION)\n@WITH_GCOV_TRUE@COVERAGE_OUTPUT_FILE = $(COVERAGE_NAME)-coverage.info\n@WITH_GCOV_TRUE@COVERAGE_OUTPUT_DIR = $(COVERAGE_NAME)-coverage\n@WITH_GCOV_TRUE@COVERAGE_LCOV_EXTRA_FLAGS =\n@WITH_GCOV_TRUE@COVERAGE_GENHTML_EXTRA_FLAGS =\n@WITH_GCOV_TRUE@coverage_quiet = $(coverage_quiet_$(V))\n@WITH_GCOV_TRUE@coverage_quiet_ = $(coverage_quiet_$(AM_DEFAULT_VERBOSITY))\n@WITH_GCOV_TRUE@coverage_quiet_0 = --quiet\nall: $(BUILT_SOURCES) config.h\n\t$(MAKE) $(AM_MAKEFLAGS) all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs\nam--refresh: Makefile\n\t@:\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --gnu Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\n\nconfig.h: stamp-h1\n\t@test -f $@ || rm -f stamp-h1\n\t@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1\n\nstamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status\n\t@rm -f stamp-h1\n\tcd $(top_builddir) && $(SHELL) ./config.status config.h\n$(srcdir)/config.h.in:  $(am__configure_deps)\n\t($(am__cd) $(top_srcdir) && $(AUTOHEADER))\n\trm -f stamp-h1\n\ttouch $@\n\ndistclean-hdr:\n\t-rm -f config.h stamp-h1\nlibpcre.pc: $(top_builddir)/config.status $(srcdir)/libpcre.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\nlibpcre16.pc: $(top_builddir)/config.status $(srcdir)/libpcre16.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\nlibpcre32.pc: $(top_builddir)/config.status $(srcdir)/libpcre32.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\nlibpcreposix.pc: $(top_builddir)/config.status $(srcdir)/libpcreposix.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\nlibpcrecpp.pc: $(top_builddir)/config.status $(srcdir)/libpcrecpp.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\npcre-config: $(top_builddir)/config.status $(srcdir)/pcre-config.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\npcre.h: $(top_builddir)/config.status $(srcdir)/pcre.h.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\npcre_stringpiece.h: $(top_builddir)/config.status $(srcdir)/pcre_stringpiece.h.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\npcrecpparg.h: $(top_builddir)/config.status $(srcdir)/pcrecpparg.h.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\ninstall-binPROGRAMS: $(bin_PROGRAMS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do echo \"$$p $$p\"; done | \\\n\tsed 's/$(EXEEXT)$$//' | \\\n\twhile read p p1; do if test -f $$p \\\n\t || test -f $$p1 \\\n\t  ; then echo \"$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n;h' \\\n\t    -e 's|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \\\n\tsed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1 } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) files[d] = files[d] \" \" $$1; \\\n\t    else { print \"f\", $$3 \"/\" $$4, $$1; } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t    if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t    test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t    } \\\n\t; done\n\nuninstall-binPROGRAMS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \\\n\t      -e 's/$$/$(EXEEXT)/' \\\n\t`; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nclean-binPROGRAMS:\n\t@list='$(bin_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\n\nclean-noinstPROGRAMS:\n\t@list='$(noinst_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\n\ninstall-libLTLIBRARIES: $(lib_LTLIBRARIES)\n\t@$(NORMAL_INSTALL)\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tlist2=; for p in $$list; do \\\n\t  if test -f $$p; then \\\n\t    list2=\"$$list2 $$p\"; \\\n\t  else :; fi; \\\n\tdone; \\\n\ttest -z \"$$list2\" || { \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(libdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(libdir)\" || exit 1; \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 \"$(DESTDIR)$(libdir)\"; \\\n\t}\n\nuninstall-libLTLIBRARIES:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  $(am__strip_dir) \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f \"$(DESTDIR)$(libdir)/$$f\"; \\\n\tdone\n\nclean-libLTLIBRARIES:\n\t-test -z \"$(lib_LTLIBRARIES)\" || rm -f $(lib_LTLIBRARIES)\n\t@list='$(lib_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\n\nlibpcre.la: $(libpcre_la_OBJECTS) $(libpcre_la_DEPENDENCIES) $(EXTRA_libpcre_la_DEPENDENCIES)\n\t$(AM_V_CCLD)$(libpcre_la_LINK) $(am_libpcre_la_rpath) $(libpcre_la_OBJECTS) $(libpcre_la_LIBADD) $(LIBS)\n\nlibpcre16.la: $(libpcre16_la_OBJECTS) $(libpcre16_la_DEPENDENCIES) $(EXTRA_libpcre16_la_DEPENDENCIES)\n\t$(AM_V_CCLD)$(libpcre16_la_LINK) $(am_libpcre16_la_rpath) $(libpcre16_la_OBJECTS) $(libpcre16_la_LIBADD) $(LIBS)\n\nlibpcre32.la: $(libpcre32_la_OBJECTS) $(libpcre32_la_DEPENDENCIES) $(EXTRA_libpcre32_la_DEPENDENCIES)\n\t$(AM_V_CCLD)$(libpcre32_la_LINK) $(am_libpcre32_la_rpath) $(libpcre32_la_OBJECTS) $(libpcre32_la_LIBADD) $(LIBS)\n\nlibpcrecpp.la: $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_DEPENDENCIES) $(EXTRA_libpcrecpp_la_DEPENDENCIES)\n\t$(AM_V_CXXLD)$(libpcrecpp_la_LINK) $(am_libpcrecpp_la_rpath) $(libpcrecpp_la_OBJECTS) $(libpcrecpp_la_LIBADD) $(LIBS)\n\nlibpcreposix.la: $(libpcreposix_la_OBJECTS) $(libpcreposix_la_DEPENDENCIES) $(EXTRA_libpcreposix_la_DEPENDENCIES)\n\t$(AM_V_CCLD)$(libpcreposix_la_LINK) $(am_libpcreposix_la_rpath) $(libpcreposix_la_OBJECTS) $(libpcreposix_la_LIBADD) $(LIBS)\n\ndftables$(EXEEXT): $(dftables_OBJECTS) $(dftables_DEPENDENCIES) $(EXTRA_dftables_DEPENDENCIES)\n\t@rm -f dftables$(EXEEXT)\n\t$(AM_V_CCLD)$(LINK) $(dftables_OBJECTS) $(dftables_LDADD) $(LIBS)\n\npcre_jit_test$(EXEEXT): $(pcre_jit_test_OBJECTS) $(pcre_jit_test_DEPENDENCIES) $(EXTRA_pcre_jit_test_DEPENDENCIES)\n\t@rm -f pcre_jit_test$(EXEEXT)\n\t$(AM_V_CCLD)$(pcre_jit_test_LINK) $(pcre_jit_test_OBJECTS) $(pcre_jit_test_LDADD) $(LIBS)\n\npcre_scanner_unittest$(EXEEXT): $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_DEPENDENCIES) $(EXTRA_pcre_scanner_unittest_DEPENDENCIES)\n\t@rm -f pcre_scanner_unittest$(EXEEXT)\n\t$(AM_V_CXXLD)$(pcre_scanner_unittest_LINK) $(pcre_scanner_unittest_OBJECTS) $(pcre_scanner_unittest_LDADD) $(LIBS)\n\npcre_stringpiece_unittest$(EXEEXT): $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_DEPENDENCIES) $(EXTRA_pcre_stringpiece_unittest_DEPENDENCIES)\n\t@rm -f pcre_stringpiece_unittest$(EXEEXT)\n\t$(AM_V_CXXLD)$(pcre_stringpiece_unittest_LINK) $(pcre_stringpiece_unittest_OBJECTS) $(pcre_stringpiece_unittest_LDADD) $(LIBS)\n\npcrecpp_unittest$(EXEEXT): $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_DEPENDENCIES) $(EXTRA_pcrecpp_unittest_DEPENDENCIES)\n\t@rm -f pcrecpp_unittest$(EXEEXT)\n\t$(AM_V_CXXLD)$(pcrecpp_unittest_LINK) $(pcrecpp_unittest_OBJECTS) $(pcrecpp_unittest_LDADD) $(LIBS)\n\npcregrep$(EXEEXT): $(pcregrep_OBJECTS) $(pcregrep_DEPENDENCIES) $(EXTRA_pcregrep_DEPENDENCIES)\n\t@rm -f pcregrep$(EXEEXT)\n\t$(AM_V_CCLD)$(pcregrep_LINK) $(pcregrep_OBJECTS) $(pcregrep_LDADD) $(LIBS)\n\npcretest$(EXEEXT): $(pcretest_OBJECTS) $(pcretest_DEPENDENCIES) $(EXTRA_pcretest_DEPENDENCIES)\n\t@rm -f pcretest$(EXEEXT)\n\t$(AM_V_CCLD)$(pcretest_LINK) $(pcretest_OBJECTS) $(pcretest_LDADD) $(LIBS)\ninstall-binSCRIPTS: $(bin_SCRIPTS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  if test -f \"$$d$$p\"; then echo \"$$d$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n' \\\n\t    -e 'h;s|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1; } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) { files[d] = files[d] \" \" $$1; \\\n\t      if (++n[d] == $(am__install_max)) { \\\n\t\tprint \"f\", d, files[d]; n[d] = 0; files[d] = \"\" } } \\\n\t    else { print \"f\", d \"/\" $$4, $$1 } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t     if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t     test -z \"$$files\" || { \\\n\t       echo \" $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t       $(INSTALL_SCRIPT) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t     } \\\n\t; done\n\nuninstall-binSCRIPTS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || exit 0; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t       sed -e 's,.*/,,;$(transform)'`; \\\n\tdir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftables.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_config.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_get.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_study.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_version.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_config.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_get.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_study.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_version.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_chartables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_config.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_exec.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_get.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_globals.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_maketables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_newline.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_refcount.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_study.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_tables.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_ucd.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_version.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcre_la-pcre_xclass.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpcreposix_la-pcreposix.Plo@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcregrep-pcregrep.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre16_printint.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre32_printint.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcre_printint.Po@am__quote@ # am--include-marker\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcretest-pcretest.Po@am__quote@ # am--include-marker\n\n$(am__depfiles_remade):\n\t@$(MKDIR_P) $(@D)\n\t@echo '# dummy' >$@-t && $(am__mv) $@-t $@\n\nam--depfiles: $(am__depfiles_remade)\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nlibpcre_la-pcre_byte_order.lo: pcre_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_byte_order.Tpo $(DEPDIR)/libpcre_la-pcre_byte_order.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_byte_order.c' object='libpcre_la-pcre_byte_order.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_byte_order.lo `test -f 'pcre_byte_order.c' || echo '$(srcdir)/'`pcre_byte_order.c\n\nlibpcre_la-pcre_compile.lo: pcre_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_compile.Tpo -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_compile.Tpo $(DEPDIR)/libpcre_la-pcre_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_compile.c' object='libpcre_la-pcre_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_compile.lo `test -f 'pcre_compile.c' || echo '$(srcdir)/'`pcre_compile.c\n\nlibpcre_la-pcre_config.lo: pcre_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_config.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_config.Tpo -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_config.Tpo $(DEPDIR)/libpcre_la-pcre_config.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_config.c' object='libpcre_la-pcre_config.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_config.lo `test -f 'pcre_config.c' || echo '$(srcdir)/'`pcre_config.c\n\nlibpcre_la-pcre_dfa_exec.lo: pcre_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_dfa_exec.Tpo $(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_dfa_exec.c' object='libpcre_la-pcre_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_dfa_exec.lo `test -f 'pcre_dfa_exec.c' || echo '$(srcdir)/'`pcre_dfa_exec.c\n\nlibpcre_la-pcre_exec.lo: pcre_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_exec.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_exec.Tpo -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_exec.Tpo $(DEPDIR)/libpcre_la-pcre_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_exec.c' object='libpcre_la-pcre_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_exec.lo `test -f 'pcre_exec.c' || echo '$(srcdir)/'`pcre_exec.c\n\nlibpcre_la-pcre_fullinfo.lo: pcre_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_fullinfo.Tpo $(DEPDIR)/libpcre_la-pcre_fullinfo.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_fullinfo.c' object='libpcre_la-pcre_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_fullinfo.lo `test -f 'pcre_fullinfo.c' || echo '$(srcdir)/'`pcre_fullinfo.c\n\nlibpcre_la-pcre_get.lo: pcre_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_get.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_get.Tpo -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_get.Tpo $(DEPDIR)/libpcre_la-pcre_get.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_get.c' object='libpcre_la-pcre_get.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_get.lo `test -f 'pcre_get.c' || echo '$(srcdir)/'`pcre_get.c\n\nlibpcre_la-pcre_globals.lo: pcre_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_globals.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_globals.Tpo -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_globals.Tpo $(DEPDIR)/libpcre_la-pcre_globals.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_globals.c' object='libpcre_la-pcre_globals.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_globals.lo `test -f 'pcre_globals.c' || echo '$(srcdir)/'`pcre_globals.c\n\nlibpcre_la-pcre_jit_compile.lo: pcre_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_jit_compile.Tpo $(DEPDIR)/libpcre_la-pcre_jit_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_jit_compile.c' object='libpcre_la-pcre_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_jit_compile.lo `test -f 'pcre_jit_compile.c' || echo '$(srcdir)/'`pcre_jit_compile.c\n\nlibpcre_la-pcre_maketables.lo: pcre_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_maketables.Tpo -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_maketables.Tpo $(DEPDIR)/libpcre_la-pcre_maketables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_maketables.c' object='libpcre_la-pcre_maketables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_maketables.lo `test -f 'pcre_maketables.c' || echo '$(srcdir)/'`pcre_maketables.c\n\nlibpcre_la-pcre_newline.lo: pcre_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_newline.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_newline.Tpo -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_newline.Tpo $(DEPDIR)/libpcre_la-pcre_newline.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_newline.c' object='libpcre_la-pcre_newline.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_newline.lo `test -f 'pcre_newline.c' || echo '$(srcdir)/'`pcre_newline.c\n\nlibpcre_la-pcre_ord2utf8.lo: pcre_ord2utf8.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ord2utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ord2utf8.Tpo $(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_ord2utf8.c' object='libpcre_la-pcre_ord2utf8.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ord2utf8.lo `test -f 'pcre_ord2utf8.c' || echo '$(srcdir)/'`pcre_ord2utf8.c\n\nlibpcre_la-pcre_refcount.lo: pcre_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_refcount.Tpo -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_refcount.Tpo $(DEPDIR)/libpcre_la-pcre_refcount.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_refcount.c' object='libpcre_la-pcre_refcount.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_refcount.lo `test -f 'pcre_refcount.c' || echo '$(srcdir)/'`pcre_refcount.c\n\nlibpcre_la-pcre_string_utils.lo: pcre_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_string_utils.Tpo $(DEPDIR)/libpcre_la-pcre_string_utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_string_utils.c' object='libpcre_la-pcre_string_utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_string_utils.lo `test -f 'pcre_string_utils.c' || echo '$(srcdir)/'`pcre_string_utils.c\n\nlibpcre_la-pcre_study.lo: pcre_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_study.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_study.Tpo -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_study.Tpo $(DEPDIR)/libpcre_la-pcre_study.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_study.c' object='libpcre_la-pcre_study.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_study.lo `test -f 'pcre_study.c' || echo '$(srcdir)/'`pcre_study.c\n\nlibpcre_la-pcre_tables.lo: pcre_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_tables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_tables.Tpo -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_tables.Tpo $(DEPDIR)/libpcre_la-pcre_tables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_tables.c' object='libpcre_la-pcre_tables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_tables.lo `test -f 'pcre_tables.c' || echo '$(srcdir)/'`pcre_tables.c\n\nlibpcre_la-pcre_ucd.lo: pcre_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_ucd.Tpo -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_ucd.Tpo $(DEPDIR)/libpcre_la-pcre_ucd.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_ucd.c' object='libpcre_la-pcre_ucd.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_ucd.lo `test -f 'pcre_ucd.c' || echo '$(srcdir)/'`pcre_ucd.c\n\nlibpcre_la-pcre_valid_utf8.lo: pcre_valid_utf8.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_valid_utf8.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_valid_utf8.Tpo $(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_valid_utf8.c' object='libpcre_la-pcre_valid_utf8.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_valid_utf8.lo `test -f 'pcre_valid_utf8.c' || echo '$(srcdir)/'`pcre_valid_utf8.c\n\nlibpcre_la-pcre_version.lo: pcre_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_version.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_version.Tpo -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_version.Tpo $(DEPDIR)/libpcre_la-pcre_version.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_version.c' object='libpcre_la-pcre_version.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_version.lo `test -f 'pcre_version.c' || echo '$(srcdir)/'`pcre_version.c\n\nlibpcre_la-pcre_xclass.lo: pcre_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_xclass.Tpo -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_xclass.Tpo $(DEPDIR)/libpcre_la-pcre_xclass.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_xclass.c' object='libpcre_la-pcre_xclass.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_xclass.lo `test -f 'pcre_xclass.c' || echo '$(srcdir)/'`pcre_xclass.c\n\nlibpcre_la-pcre_chartables.lo: pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -MT libpcre_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre_la-pcre_chartables.Tpo -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre_la-pcre_chartables.Tpo $(DEPDIR)/libpcre_la-pcre_chartables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_chartables.c' object='libpcre_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre_la_CFLAGS) $(CFLAGS) -c -o libpcre_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n\nlibpcre16_la-pcre16_byte_order.lo: pcre16_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_byte_order.Tpo $(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_byte_order.c' object='libpcre16_la-pcre16_byte_order.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_byte_order.lo `test -f 'pcre16_byte_order.c' || echo '$(srcdir)/'`pcre16_byte_order.c\n\nlibpcre16_la-pcre16_chartables.lo: pcre16_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre16_chartables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_chartables.c' object='libpcre16_la-pcre16_chartables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_chartables.lo `test -f 'pcre16_chartables.c' || echo '$(srcdir)/'`pcre16_chartables.c\n\nlibpcre16_la-pcre16_compile.lo: pcre16_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_compile.c' object='libpcre16_la-pcre16_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_compile.lo `test -f 'pcre16_compile.c' || echo '$(srcdir)/'`pcre16_compile.c\n\nlibpcre16_la-pcre16_config.lo: pcre16_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_config.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_config.Tpo -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_config.Tpo $(DEPDIR)/libpcre16_la-pcre16_config.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_config.c' object='libpcre16_la-pcre16_config.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_config.lo `test -f 'pcre16_config.c' || echo '$(srcdir)/'`pcre16_config.c\n\nlibpcre16_la-pcre16_dfa_exec.lo: pcre16_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_dfa_exec.c' object='libpcre16_la-pcre16_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_dfa_exec.lo `test -f 'pcre16_dfa_exec.c' || echo '$(srcdir)/'`pcre16_dfa_exec.c\n\nlibpcre16_la-pcre16_exec.lo: pcre16_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_exec.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_exec.Tpo $(DEPDIR)/libpcre16_la-pcre16_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_exec.c' object='libpcre16_la-pcre16_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_exec.lo `test -f 'pcre16_exec.c' || echo '$(srcdir)/'`pcre16_exec.c\n\nlibpcre16_la-pcre16_fullinfo.lo: pcre16_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Tpo $(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_fullinfo.c' object='libpcre16_la-pcre16_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_fullinfo.lo `test -f 'pcre16_fullinfo.c' || echo '$(srcdir)/'`pcre16_fullinfo.c\n\nlibpcre16_la-pcre16_get.lo: pcre16_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_get.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_get.Tpo -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_get.Tpo $(DEPDIR)/libpcre16_la-pcre16_get.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_get.c' object='libpcre16_la-pcre16_get.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_get.lo `test -f 'pcre16_get.c' || echo '$(srcdir)/'`pcre16_get.c\n\nlibpcre16_la-pcre16_globals.lo: pcre16_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_globals.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_globals.Tpo $(DEPDIR)/libpcre16_la-pcre16_globals.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_globals.c' object='libpcre16_la-pcre16_globals.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_globals.lo `test -f 'pcre16_globals.c' || echo '$(srcdir)/'`pcre16_globals.c\n\nlibpcre16_la-pcre16_jit_compile.lo: pcre16_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Tpo $(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_jit_compile.c' object='libpcre16_la-pcre16_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_jit_compile.lo `test -f 'pcre16_jit_compile.c' || echo '$(srcdir)/'`pcre16_jit_compile.c\n\nlibpcre16_la-pcre16_maketables.lo: pcre16_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_maketables.Tpo $(DEPDIR)/libpcre16_la-pcre16_maketables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_maketables.c' object='libpcre16_la-pcre16_maketables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_maketables.lo `test -f 'pcre16_maketables.c' || echo '$(srcdir)/'`pcre16_maketables.c\n\nlibpcre16_la-pcre16_newline.lo: pcre16_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_newline.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_newline.Tpo $(DEPDIR)/libpcre16_la-pcre16_newline.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_newline.c' object='libpcre16_la-pcre16_newline.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_newline.lo `test -f 'pcre16_newline.c' || echo '$(srcdir)/'`pcre16_newline.c\n\nlibpcre16_la-pcre16_ord2utf16.lo: pcre16_ord2utf16.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ord2utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_ord2utf16.c' object='libpcre16_la-pcre16_ord2utf16.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ord2utf16.lo `test -f 'pcre16_ord2utf16.c' || echo '$(srcdir)/'`pcre16_ord2utf16.c\n\nlibpcre16_la-pcre16_refcount.lo: pcre16_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_refcount.Tpo $(DEPDIR)/libpcre16_la-pcre16_refcount.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_refcount.c' object='libpcre16_la-pcre16_refcount.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_refcount.lo `test -f 'pcre16_refcount.c' || echo '$(srcdir)/'`pcre16_refcount.c\n\nlibpcre16_la-pcre16_string_utils.lo: pcre16_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_string_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_string_utils.c' object='libpcre16_la-pcre16_string_utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_string_utils.lo `test -f 'pcre16_string_utils.c' || echo '$(srcdir)/'`pcre16_string_utils.c\n\nlibpcre16_la-pcre16_study.lo: pcre16_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_study.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_study.Tpo -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_study.Tpo $(DEPDIR)/libpcre16_la-pcre16_study.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_study.c' object='libpcre16_la-pcre16_study.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_study.lo `test -f 'pcre16_study.c' || echo '$(srcdir)/'`pcre16_study.c\n\nlibpcre16_la-pcre16_tables.lo: pcre16_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_tables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_tables.Tpo $(DEPDIR)/libpcre16_la-pcre16_tables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_tables.c' object='libpcre16_la-pcre16_tables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_tables.lo `test -f 'pcre16_tables.c' || echo '$(srcdir)/'`pcre16_tables.c\n\nlibpcre16_la-pcre16_ucd.lo: pcre16_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_ucd.Tpo $(DEPDIR)/libpcre16_la-pcre16_ucd.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_ucd.c' object='libpcre16_la-pcre16_ucd.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_ucd.lo `test -f 'pcre16_ucd.c' || echo '$(srcdir)/'`pcre16_ucd.c\n\nlibpcre16_la-pcre16_utf16_utils.lo: pcre16_utf16_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_utf16_utils.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Tpo $(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_utf16_utils.c' object='libpcre16_la-pcre16_utf16_utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_utf16_utils.lo `test -f 'pcre16_utf16_utils.c' || echo '$(srcdir)/'`pcre16_utf16_utils.c\n\nlibpcre16_la-pcre16_valid_utf16.lo: pcre16_valid_utf16.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_valid_utf16.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Tpo $(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_valid_utf16.c' object='libpcre16_la-pcre16_valid_utf16.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_valid_utf16.lo `test -f 'pcre16_valid_utf16.c' || echo '$(srcdir)/'`pcre16_valid_utf16.c\n\nlibpcre16_la-pcre16_version.lo: pcre16_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_version.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_version.Tpo -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_version.Tpo $(DEPDIR)/libpcre16_la-pcre16_version.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_version.c' object='libpcre16_la-pcre16_version.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_version.lo `test -f 'pcre16_version.c' || echo '$(srcdir)/'`pcre16_version.c\n\nlibpcre16_la-pcre16_xclass.lo: pcre16_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre16_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre16_xclass.Tpo $(DEPDIR)/libpcre16_la-pcre16_xclass.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_xclass.c' object='libpcre16_la-pcre16_xclass.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre16_xclass.lo `test -f 'pcre16_xclass.c' || echo '$(srcdir)/'`pcre16_xclass.c\n\nlibpcre16_la-pcre_chartables.lo: pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -MT libpcre16_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre16_la-pcre_chartables.Tpo $(DEPDIR)/libpcre16_la-pcre_chartables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_chartables.c' object='libpcre16_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre16_la_CFLAGS) $(CFLAGS) -c -o libpcre16_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n\nlibpcre32_la-pcre32_byte_order.lo: pcre32_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_byte_order.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_byte_order.Tpo $(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_byte_order.c' object='libpcre32_la-pcre32_byte_order.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_byte_order.lo `test -f 'pcre32_byte_order.c' || echo '$(srcdir)/'`pcre32_byte_order.c\n\nlibpcre32_la-pcre32_chartables.lo: pcre32_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre32_chartables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_chartables.c' object='libpcre32_la-pcre32_chartables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_chartables.lo `test -f 'pcre32_chartables.c' || echo '$(srcdir)/'`pcre32_chartables.c\n\nlibpcre32_la-pcre32_compile.lo: pcre32_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_compile.c' object='libpcre32_la-pcre32_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_compile.lo `test -f 'pcre32_compile.c' || echo '$(srcdir)/'`pcre32_compile.c\n\nlibpcre32_la-pcre32_config.lo: pcre32_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_config.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_config.Tpo -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_config.Tpo $(DEPDIR)/libpcre32_la-pcre32_config.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_config.c' object='libpcre32_la-pcre32_config.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_config.lo `test -f 'pcre32_config.c' || echo '$(srcdir)/'`pcre32_config.c\n\nlibpcre32_la-pcre32_dfa_exec.lo: pcre32_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_dfa_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_dfa_exec.c' object='libpcre32_la-pcre32_dfa_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_dfa_exec.lo `test -f 'pcre32_dfa_exec.c' || echo '$(srcdir)/'`pcre32_dfa_exec.c\n\nlibpcre32_la-pcre32_exec.lo: pcre32_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_exec.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_exec.Tpo $(DEPDIR)/libpcre32_la-pcre32_exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_exec.c' object='libpcre32_la-pcre32_exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_exec.lo `test -f 'pcre32_exec.c' || echo '$(srcdir)/'`pcre32_exec.c\n\nlibpcre32_la-pcre32_fullinfo.lo: pcre32_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_fullinfo.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Tpo $(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_fullinfo.c' object='libpcre32_la-pcre32_fullinfo.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_fullinfo.lo `test -f 'pcre32_fullinfo.c' || echo '$(srcdir)/'`pcre32_fullinfo.c\n\nlibpcre32_la-pcre32_get.lo: pcre32_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_get.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_get.Tpo -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_get.Tpo $(DEPDIR)/libpcre32_la-pcre32_get.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_get.c' object='libpcre32_la-pcre32_get.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_get.lo `test -f 'pcre32_get.c' || echo '$(srcdir)/'`pcre32_get.c\n\nlibpcre32_la-pcre32_globals.lo: pcre32_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_globals.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_globals.Tpo $(DEPDIR)/libpcre32_la-pcre32_globals.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_globals.c' object='libpcre32_la-pcre32_globals.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_globals.lo `test -f 'pcre32_globals.c' || echo '$(srcdir)/'`pcre32_globals.c\n\nlibpcre32_la-pcre32_jit_compile.lo: pcre32_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_jit_compile.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Tpo $(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_jit_compile.c' object='libpcre32_la-pcre32_jit_compile.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_jit_compile.lo `test -f 'pcre32_jit_compile.c' || echo '$(srcdir)/'`pcre32_jit_compile.c\n\nlibpcre32_la-pcre32_maketables.lo: pcre32_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_maketables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_maketables.Tpo $(DEPDIR)/libpcre32_la-pcre32_maketables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_maketables.c' object='libpcre32_la-pcre32_maketables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_maketables.lo `test -f 'pcre32_maketables.c' || echo '$(srcdir)/'`pcre32_maketables.c\n\nlibpcre32_la-pcre32_newline.lo: pcre32_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_newline.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_newline.Tpo $(DEPDIR)/libpcre32_la-pcre32_newline.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_newline.c' object='libpcre32_la-pcre32_newline.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_newline.lo `test -f 'pcre32_newline.c' || echo '$(srcdir)/'`pcre32_newline.c\n\nlibpcre32_la-pcre32_ord2utf32.lo: pcre32_ord2utf32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ord2utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_ord2utf32.c' object='libpcre32_la-pcre32_ord2utf32.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ord2utf32.lo `test -f 'pcre32_ord2utf32.c' || echo '$(srcdir)/'`pcre32_ord2utf32.c\n\nlibpcre32_la-pcre32_refcount.lo: pcre32_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_refcount.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_refcount.Tpo $(DEPDIR)/libpcre32_la-pcre32_refcount.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_refcount.c' object='libpcre32_la-pcre32_refcount.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_refcount.lo `test -f 'pcre32_refcount.c' || echo '$(srcdir)/'`pcre32_refcount.c\n\nlibpcre32_la-pcre32_string_utils.lo: pcre32_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_string_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_string_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_string_utils.c' object='libpcre32_la-pcre32_string_utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_string_utils.lo `test -f 'pcre32_string_utils.c' || echo '$(srcdir)/'`pcre32_string_utils.c\n\nlibpcre32_la-pcre32_study.lo: pcre32_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_study.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_study.Tpo -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_study.Tpo $(DEPDIR)/libpcre32_la-pcre32_study.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_study.c' object='libpcre32_la-pcre32_study.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_study.lo `test -f 'pcre32_study.c' || echo '$(srcdir)/'`pcre32_study.c\n\nlibpcre32_la-pcre32_tables.lo: pcre32_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_tables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_tables.Tpo $(DEPDIR)/libpcre32_la-pcre32_tables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_tables.c' object='libpcre32_la-pcre32_tables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_tables.lo `test -f 'pcre32_tables.c' || echo '$(srcdir)/'`pcre32_tables.c\n\nlibpcre32_la-pcre32_ucd.lo: pcre32_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_ucd.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_ucd.Tpo $(DEPDIR)/libpcre32_la-pcre32_ucd.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_ucd.c' object='libpcre32_la-pcre32_ucd.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_ucd.lo `test -f 'pcre32_ucd.c' || echo '$(srcdir)/'`pcre32_ucd.c\n\nlibpcre32_la-pcre32_utf32_utils.lo: pcre32_utf32_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_utf32_utils.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Tpo $(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_utf32_utils.c' object='libpcre32_la-pcre32_utf32_utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_utf32_utils.lo `test -f 'pcre32_utf32_utils.c' || echo '$(srcdir)/'`pcre32_utf32_utils.c\n\nlibpcre32_la-pcre32_valid_utf32.lo: pcre32_valid_utf32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_valid_utf32.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Tpo $(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_valid_utf32.c' object='libpcre32_la-pcre32_valid_utf32.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_valid_utf32.lo `test -f 'pcre32_valid_utf32.c' || echo '$(srcdir)/'`pcre32_valid_utf32.c\n\nlibpcre32_la-pcre32_version.lo: pcre32_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_version.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_version.Tpo -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_version.Tpo $(DEPDIR)/libpcre32_la-pcre32_version.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_version.c' object='libpcre32_la-pcre32_version.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_version.lo `test -f 'pcre32_version.c' || echo '$(srcdir)/'`pcre32_version.c\n\nlibpcre32_la-pcre32_xclass.lo: pcre32_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre32_xclass.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre32_xclass.Tpo $(DEPDIR)/libpcre32_la-pcre32_xclass.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_xclass.c' object='libpcre32_la-pcre32_xclass.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre32_xclass.lo `test -f 'pcre32_xclass.c' || echo '$(srcdir)/'`pcre32_xclass.c\n\nlibpcre32_la-pcre_chartables.lo: pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -MT libpcre32_la-pcre_chartables.lo -MD -MP -MF $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcre32_la-pcre_chartables.Tpo $(DEPDIR)/libpcre32_la-pcre_chartables.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_chartables.c' object='libpcre32_la-pcre_chartables.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcre32_la_CFLAGS) $(CFLAGS) -c -o libpcre32_la-pcre_chartables.lo `test -f 'pcre_chartables.c' || echo '$(srcdir)/'`pcre_chartables.c\n\nlibpcreposix_la-pcreposix.lo: pcreposix.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -MT libpcreposix_la-pcreposix.lo -MD -MP -MF $(DEPDIR)/libpcreposix_la-pcreposix.Tpo -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcreposix_la-pcreposix.Tpo $(DEPDIR)/libpcreposix_la-pcreposix.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcreposix.c' object='libpcreposix_la-pcreposix.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcreposix_la_CFLAGS) $(CFLAGS) -c -o libpcreposix_la-pcreposix.lo `test -f 'pcreposix.c' || echo '$(srcdir)/'`pcreposix.c\n\npcre_jit_test-pcre_jit_test.o: pcre_jit_test.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.o -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.o `test -f 'pcre_jit_test.c' || echo '$(srcdir)/'`pcre_jit_test.c\n\npcre_jit_test-pcre_jit_test.obj: pcre_jit_test.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -MT pcre_jit_test-pcre_jit_test.obj -MD -MP -MF $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_jit_test-pcre_jit_test.Tpo $(DEPDIR)/pcre_jit_test-pcre_jit_test.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_jit_test.c' object='pcre_jit_test-pcre_jit_test.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_jit_test_CFLAGS) $(CFLAGS) -c -o pcre_jit_test-pcre_jit_test.obj `if test -f 'pcre_jit_test.c'; then $(CYGPATH_W) 'pcre_jit_test.c'; else $(CYGPATH_W) '$(srcdir)/pcre_jit_test.c'; fi`\n\npcregrep-pcregrep.o: pcregrep.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.o -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.o `test -f 'pcregrep.c' || echo '$(srcdir)/'`pcregrep.c\n\npcregrep-pcregrep.obj: pcregrep.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -MT pcregrep-pcregrep.obj -MD -MP -MF $(DEPDIR)/pcregrep-pcregrep.Tpo -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcregrep-pcregrep.Tpo $(DEPDIR)/pcregrep-pcregrep.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcregrep.c' object='pcregrep-pcregrep.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcregrep_CFLAGS) $(CFLAGS) -c -o pcregrep-pcregrep.obj `if test -f 'pcregrep.c'; then $(CYGPATH_W) 'pcregrep.c'; else $(CYGPATH_W) '$(srcdir)/pcregrep.c'; fi`\n\npcretest-pcretest.o: pcretest.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.o -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.o `test -f 'pcretest.c' || echo '$(srcdir)/'`pcretest.c\n\npcretest-pcretest.obj: pcretest.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcretest.obj -MD -MP -MF $(DEPDIR)/pcretest-pcretest.Tpo -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcretest.Tpo $(DEPDIR)/pcretest-pcretest.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcretest.c' object='pcretest-pcretest.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcretest.obj `if test -f 'pcretest.c'; then $(CYGPATH_W) 'pcretest.c'; else $(CYGPATH_W) '$(srcdir)/pcretest.c'; fi`\n\npcretest-pcre_printint.o: pcre_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.o `test -f 'pcre_printint.c' || echo '$(srcdir)/'`pcre_printint.c\n\npcretest-pcre_printint.obj: pcre_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre_printint.Tpo -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre_printint.Tpo $(DEPDIR)/pcretest-pcre_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre_printint.c' object='pcretest-pcre_printint.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre_printint.obj `if test -f 'pcre_printint.c'; then $(CYGPATH_W) 'pcre_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre_printint.c'; fi`\n\npcretest-pcre16_printint.o: pcre16_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.o `test -f 'pcre16_printint.c' || echo '$(srcdir)/'`pcre16_printint.c\n\npcretest-pcre16_printint.obj: pcre16_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre16_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre16_printint.Tpo -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre16_printint.Tpo $(DEPDIR)/pcretest-pcre16_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre16_printint.c' object='pcretest-pcre16_printint.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre16_printint.obj `if test -f 'pcre16_printint.c'; then $(CYGPATH_W) 'pcre16_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre16_printint.c'; fi`\n\npcretest-pcre32_printint.o: pcre32_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.o -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.o `test -f 'pcre32_printint.c' || echo '$(srcdir)/'`pcre32_printint.c\n\npcretest-pcre32_printint.obj: pcre32_printint.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -MT pcretest-pcre32_printint.obj -MD -MP -MF $(DEPDIR)/pcretest-pcre32_printint.Tpo -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcretest-pcre32_printint.Tpo $(DEPDIR)/pcretest-pcre32_printint.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pcre32_printint.c' object='pcretest-pcre32_printint.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcretest_CFLAGS) $(CFLAGS) -c -o pcretest-pcre32_printint.obj `if test -f 'pcre32_printint.c'; then $(CYGPATH_W) 'pcre32_printint.c'; else $(CYGPATH_W) '$(srcdir)/pcre32_printint.c'; fi`\n\n.cc.o:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<\n\n.cc.obj:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.cc.lo:\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<\n\nlibpcrecpp_la-pcrecpp.lo: pcrecpp.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcrecpp.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcrecpp.Tpo $(DEPDIR)/libpcrecpp_la-pcrecpp.Plo\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcrecpp.cc' object='libpcrecpp_la-pcrecpp.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcrecpp.lo `test -f 'pcrecpp.cc' || echo '$(srcdir)/'`pcrecpp.cc\n\nlibpcrecpp_la-pcre_scanner.lo: pcre_scanner.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_scanner.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_scanner.Tpo $(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_scanner.cc' object='libpcrecpp_la-pcre_scanner.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_scanner.lo `test -f 'pcre_scanner.cc' || echo '$(srcdir)/'`pcre_scanner.cc\n\nlibpcrecpp_la-pcre_stringpiece.lo: pcre_stringpiece.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -MT libpcrecpp_la-pcre_stringpiece.lo -MD -MP -MF $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Tpo $(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_stringpiece.cc' object='libpcrecpp_la-pcre_stringpiece.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpcrecpp_la_CXXFLAGS) $(CXXFLAGS) -c -o libpcrecpp_la-pcre_stringpiece.lo `test -f 'pcre_stringpiece.cc' || echo '$(srcdir)/'`pcre_stringpiece.cc\n\npcre_scanner_unittest-pcre_scanner_unittest.o: pcre_scanner_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.o -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.o `test -f 'pcre_scanner_unittest.cc' || echo '$(srcdir)/'`pcre_scanner_unittest.cc\n\npcre_scanner_unittest-pcre_scanner_unittest.obj: pcre_scanner_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_scanner_unittest-pcre_scanner_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Tpo $(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_scanner_unittest.cc' object='pcre_scanner_unittest-pcre_scanner_unittest.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_scanner_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_scanner_unittest-pcre_scanner_unittest.obj `if test -f 'pcre_scanner_unittest.cc'; then $(CYGPATH_W) 'pcre_scanner_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_scanner_unittest.cc'; fi`\n\npcre_stringpiece_unittest-pcre_stringpiece_unittest.o: pcre_stringpiece_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.o -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.o `test -f 'pcre_stringpiece_unittest.cc' || echo '$(srcdir)/'`pcre_stringpiece_unittest.cc\n\npcre_stringpiece_unittest-pcre_stringpiece_unittest.obj: pcre_stringpiece_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj -MD -MP -MF $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Tpo $(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcre_stringpiece_unittest.cc' object='pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcre_stringpiece_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcre_stringpiece_unittest-pcre_stringpiece_unittest.obj `if test -f 'pcre_stringpiece_unittest.cc'; then $(CYGPATH_W) 'pcre_stringpiece_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcre_stringpiece_unittest.cc'; fi`\n\npcrecpp_unittest-pcrecpp_unittest.o: pcrecpp_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.o -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.o `test -f 'pcrecpp_unittest.cc' || echo '$(srcdir)/'`pcrecpp_unittest.cc\n\npcrecpp_unittest-pcrecpp_unittest.obj: pcrecpp_unittest.cc\n@am__fastdepCXX_TRUE@\t$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -MT pcrecpp_unittest-pcrecpp_unittest.obj -MD -MP -MF $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi`\n@am__fastdepCXX_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Tpo $(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\t$(AM_V_CXX)source='pcrecpp_unittest.cc' object='pcrecpp_unittest-pcrecpp_unittest.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCXX_FALSE@\tDEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCXX_FALSE@\t$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcrecpp_unittest_CXXFLAGS) $(CXXFLAGS) -c -o pcrecpp_unittest-pcrecpp_unittest.obj `if test -f 'pcrecpp_unittest.cc'; then $(CYGPATH_W) 'pcrecpp_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/pcrecpp_unittest.cc'; fi`\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\ndistclean-libtool:\n\t-rm -f libtool config.lt\ninstall-man1: $(dist_man_MANS) $(man_MANS)\n\t@$(NORMAL_INSTALL)\n\t@list1=''; \\\n\tlist2='$(dist_man_MANS) $(man_MANS)'; \\\n\ttest -n \"$(man1dir)\" \\\n\t  && test -n \"`echo $$list1$$list2`\" \\\n\t  || exit 0; \\\n\techo \" $(MKDIR_P) '$(DESTDIR)$(man1dir)'\"; \\\n\t$(MKDIR_P) \"$(DESTDIR)$(man1dir)\" || exit 1; \\\n\t{ for i in $$list1; do echo \"$$i\"; done;  \\\n\tif test -n \"$$list2\"; then \\\n\t  for i in $$list2; do echo \"$$i\"; done \\\n\t    | sed -n '/\\.1[a-z]*$$/p'; \\\n\tfi; \\\n\t} | while read p; do \\\n\t  if test -f $$p; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; echo \"$$p\"; \\\n\tdone | \\\n\tsed -e 'n;s,.*/,,;p;h;s,.*\\.,,;s,^[^1][0-9a-z]*$$,1,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,' | \\\n\tsed 'N;N;s,\\n, ,g' | { \\\n\tlist=; while read file base inst; do \\\n\t  if test \"$$base\" = \"$$inst\"; then list=\"$$list $$file\"; else \\\n\t    echo \" $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'\"; \\\n\t    $(INSTALL_DATA) \"$$file\" \"$(DESTDIR)$(man1dir)/$$inst\" || exit $$?; \\\n\t  fi; \\\n\tdone; \\\n\tfor i in $$list; do echo \"$$i\"; done | $(am__base_list) | \\\n\twhile read files; do \\\n\t  test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'\"; \\\n\t    $(INSTALL_DATA) $$files \"$(DESTDIR)$(man1dir)\" || exit $$?; }; \\\n\tdone; }\n\nuninstall-man1:\n\t@$(NORMAL_UNINSTALL)\n\t@list=''; test -n \"$(man1dir)\" || exit 0; \\\n\tfiles=`{ for i in $$list; do echo \"$$i\"; done; \\\n\tl2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo \"$$i\"; done | \\\n\t  sed -n '/\\.1[a-z]*$$/p'; \\\n\t} | sed -e 's,.*/,,;h;s,.*\\.,,;s,^[^1][0-9a-z]*$$,1,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,'`; \\\n\tdir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)\ninstall-man3: $(dist_man_MANS) $(man_MANS)\n\t@$(NORMAL_INSTALL)\n\t@list1=''; \\\n\tlist2='$(dist_man_MANS) $(man_MANS)'; \\\n\ttest -n \"$(man3dir)\" \\\n\t  && test -n \"`echo $$list1$$list2`\" \\\n\t  || exit 0; \\\n\techo \" $(MKDIR_P) '$(DESTDIR)$(man3dir)'\"; \\\n\t$(MKDIR_P) \"$(DESTDIR)$(man3dir)\" || exit 1; \\\n\t{ for i in $$list1; do echo \"$$i\"; done;  \\\n\tif test -n \"$$list2\"; then \\\n\t  for i in $$list2; do echo \"$$i\"; done \\\n\t    | sed -n '/\\.3[a-z]*$$/p'; \\\n\tfi; \\\n\t} | while read p; do \\\n\t  if test -f $$p; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; echo \"$$p\"; \\\n\tdone | \\\n\tsed -e 'n;s,.*/,,;p;h;s,.*\\.,,;s,^[^3][0-9a-z]*$$,3,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,' | \\\n\tsed 'N;N;s,\\n, ,g' | { \\\n\tlist=; while read file base inst; do \\\n\t  if test \"$$base\" = \"$$inst\"; then list=\"$$list $$file\"; else \\\n\t    echo \" $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'\"; \\\n\t    $(INSTALL_DATA) \"$$file\" \"$(DESTDIR)$(man3dir)/$$inst\" || exit $$?; \\\n\t  fi; \\\n\tdone; \\\n\tfor i in $$list; do echo \"$$i\"; done | $(am__base_list) | \\\n\twhile read files; do \\\n\t  test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'\"; \\\n\t    $(INSTALL_DATA) $$files \"$(DESTDIR)$(man3dir)\" || exit $$?; }; \\\n\tdone; }\n\nuninstall-man3:\n\t@$(NORMAL_UNINSTALL)\n\t@list=''; test -n \"$(man3dir)\" || exit 0; \\\n\tfiles=`{ for i in $$list; do echo \"$$i\"; done; \\\n\tl2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo \"$$i\"; done | \\\n\t  sed -n '/\\.3[a-z]*$$/p'; \\\n\t} | sed -e 's,.*/,,;h;s,.*\\.,,;s,^[^3][0-9a-z]*$$,3,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,'`; \\\n\tdir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)\ninstall-dist_docDATA: $(dist_doc_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(dist_doc_DATA)'; test -n \"$(docdir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(docdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(docdir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(docdir)\" || exit $$?; \\\n\tdone\n\nuninstall-dist_docDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(dist_doc_DATA)'; test -n \"$(docdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)\ninstall-dist_htmlDATA: $(dist_html_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(dist_html_DATA)'; test -n \"$(htmldir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(htmldir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(htmldir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(htmldir)\" || exit $$?; \\\n\tdone\n\nuninstall-dist_htmlDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(dist_html_DATA)'; test -n \"$(htmldir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)\ninstall-htmlDATA: $(html_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(html_DATA)'; test -n \"$(htmldir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(htmldir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(htmldir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(htmldir)\" || exit $$?; \\\n\tdone\n\nuninstall-htmlDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(html_DATA)'; test -n \"$(htmldir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir)\ninstall-pkgconfigDATA: $(pkgconfig_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(pkgconfig_DATA)'; test -n \"$(pkgconfigdir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(pkgconfigdir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(pkgconfigdir)\" || exit $$?; \\\n\tdone\n\nuninstall-pkgconfigDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(pkgconfig_DATA)'; test -n \"$(pkgconfigdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)\ninstall-includeHEADERS: $(include_HEADERS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(includedir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(includedir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(includedir)\" || exit $$?; \\\n\tdone\n\nuninstall-includeHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)\ninstall-nodist_includeHEADERS: $(nodist_include_HEADERS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(nodist_include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(includedir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(includedir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(includedir)\" || exit $$?; \\\n\tdone\n\nuninstall-nodist_includeHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(nodist_include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscope: cscope.files\n\ttest ! -s cscope.files \\\n\t  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)\nclean-cscope:\n\t-rm -f cscope.files\ncscope.files: clean-cscope cscopelist\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\t-rm -f cscope.out cscope.in.out cscope.po.out cscope.files\n\n# Recover from deleted '.trs' file; this should ensure that\n# \"rm -f foo.log; make foo.trs\" re-run 'foo.test', and re-create\n# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells\n# to avoid problems with \"make -n\".\n.log.trs:\n\trm -f $< $@\n\t$(MAKE) $(AM_MAKEFLAGS) $<\n\n# Leading 'am--fnord' is there to ensure the list of targets does not\n# expand to empty, as could happen e.g. with make check TESTS=''.\nam--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)\nam--force-recheck:\n\t@:\n\n$(TEST_SUITE_LOG): $(TEST_LOGS)\n\t@$(am__set_TESTS_bases); \\\n\tam__f_ok () { test -f \"$$1\" && test -r \"$$1\"; }; \\\n\tredo_bases=`for i in $$bases; do \\\n\t              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \\\n\t            done`; \\\n\tif test -n \"$$redo_bases\"; then \\\n\t  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \\\n\t  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \\\n\t  if $(am__make_dryrun); then :; else \\\n\t    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \\\n\t  fi; \\\n\tfi; \\\n\tif test -n \"$$am__remaking_logs\"; then \\\n\t  echo \"fatal: making $(TEST_SUITE_LOG): possible infinite\" \\\n\t       \"recursion detected\" >&2; \\\n\telif test -n \"$$redo_logs\"; then \\\n\t  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \\\n\tfi; \\\n\tif $(am__make_dryrun); then :; else \\\n\t  st=0;  \\\n\t  errmsg=\"fatal: making $(TEST_SUITE_LOG): failed to create\"; \\\n\t  for i in $$redo_bases; do \\\n\t    test -f $$i.trs && test -r $$i.trs \\\n\t      || { echo \"$$errmsg $$i.trs\" >&2; st=1; }; \\\n\t    test -f $$i.log && test -r $$i.log \\\n\t      || { echo \"$$errmsg $$i.log\" >&2; st=1; }; \\\n\t  done; \\\n\t  test $$st -eq 0 || exit 1; \\\n\tfi\n\t@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \\\n\tws='[ \t]'; \\\n\tresults=`for b in $$bases; do echo $$b.trs; done`; \\\n\ttest -n \"$$results\" || results=/dev/null; \\\n\tall=`  grep \"^$$ws*:test-result:\"           $$results | wc -l`; \\\n\tpass=` grep \"^$$ws*:test-result:$$ws*PASS\"  $$results | wc -l`; \\\n\tfail=` grep \"^$$ws*:test-result:$$ws*FAIL\"  $$results | wc -l`; \\\n\tskip=` grep \"^$$ws*:test-result:$$ws*SKIP\"  $$results | wc -l`; \\\n\txfail=`grep \"^$$ws*:test-result:$$ws*XFAIL\" $$results | wc -l`; \\\n\txpass=`grep \"^$$ws*:test-result:$$ws*XPASS\" $$results | wc -l`; \\\n\terror=`grep \"^$$ws*:test-result:$$ws*ERROR\" $$results | wc -l`; \\\n\tif test `expr $$fail + $$xpass + $$error` -eq 0; then \\\n\t  success=true; \\\n\telse \\\n\t  success=false; \\\n\tfi; \\\n\tbr='==================='; br=$$br$$br$$br$$br; \\\n\tresult_count () \\\n\t{ \\\n\t    if test x\"$$1\" = x\"--maybe-color\"; then \\\n\t      maybe_colorize=yes; \\\n\t    elif test x\"$$1\" = x\"--no-color\"; then \\\n\t      maybe_colorize=no; \\\n\t    else \\\n\t      echo \"$@: invalid 'result_count' usage\" >&2; exit 4; \\\n\t    fi; \\\n\t    shift; \\\n\t    desc=$$1 count=$$2; \\\n\t    if test $$maybe_colorize = yes && test $$count -gt 0; then \\\n\t      color_start=$$3 color_end=$$std; \\\n\t    else \\\n\t      color_start= color_end=; \\\n\t    fi; \\\n\t    echo \"$${color_start}# $$desc $$count$${color_end}\"; \\\n\t}; \\\n\tcreate_testsuite_report () \\\n\t{ \\\n\t  result_count $$1 \"TOTAL:\" $$all   \"$$brg\"; \\\n\t  result_count $$1 \"PASS: \" $$pass  \"$$grn\"; \\\n\t  result_count $$1 \"SKIP: \" $$skip  \"$$blu\"; \\\n\t  result_count $$1 \"XFAIL:\" $$xfail \"$$lgn\"; \\\n\t  result_count $$1 \"FAIL: \" $$fail  \"$$red\"; \\\n\t  result_count $$1 \"XPASS:\" $$xpass \"$$red\"; \\\n\t  result_count $$1 \"ERROR:\" $$error \"$$mgn\"; \\\n\t}; \\\n\t{\t\t\t\t\t\t\t\t\\\n\t  echo \"$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)\" |\t\\\n\t    $(am__rst_title);\t\t\t\t\t\t\\\n\t  create_testsuite_report --no-color;\t\t\t\t\\\n\t  echo;\t\t\t\t\t\t\t\t\\\n\t  echo \".. contents:: :depth: 2\";\t\t\t\t\\\n\t  echo;\t\t\t\t\t\t\t\t\\\n\t  for b in $$bases; do echo $$b; done\t\t\t\t\\\n\t    | $(am__create_global_log);\t\t\t\t\t\\\n\t} >$(TEST_SUITE_LOG).tmp || exit 1;\t\t\t\t\\\n\tmv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);\t\t\t\\\n\tif $$success; then\t\t\t\t\t\t\\\n\t  col=\"$$grn\";\t\t\t\t\t\t\t\\\n\t else\t\t\t\t\t\t\t\t\\\n\t  col=\"$$red\";\t\t\t\t\t\t\t\\\n\t  test x\"$$VERBOSE\" = x || cat $(TEST_SUITE_LOG);\t\t\\\n\tfi;\t\t\t\t\t\t\t\t\\\n\techo \"$${col}$$br$${std}\"; \t\t\t\t\t\\\n\techo \"$${col}Testsuite summary for $(PACKAGE_STRING)$${std}\";\t\\\n\techo \"$${col}$$br$${std}\"; \t\t\t\t\t\\\n\tcreate_testsuite_report --maybe-color;\t\t\t\t\\\n\techo \"$$col$$br$$std\";\t\t\t\t\t\t\\\n\tif $$success; then :; else\t\t\t\t\t\\\n\t  echo \"$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}\";\t\t\\\n\t  if test -n \"$(PACKAGE_BUGREPORT)\"; then\t\t\t\\\n\t    echo \"$${col}Please report to $(PACKAGE_BUGREPORT)$${std}\";\t\\\n\t  fi;\t\t\t\t\t\t\t\t\\\n\t  echo \"$$col$$br$$std\";\t\t\t\t\t\\\n\tfi;\t\t\t\t\t\t\t\t\\\n\t$$success || exit 1\n\ncheck-TESTS: $(check_SCRIPTS)\n\t@list='$(RECHECK_LOGS)';           test -z \"$$list\" || rm -f $$list\n\t@list='$(RECHECK_LOGS:.log=.trs)'; test -z \"$$list\" || rm -f $$list\n\t@test -z \"$(TEST_SUITE_LOG)\" || rm -f $(TEST_SUITE_LOG)\n\t@set +e; $(am__set_TESTS_bases); \\\n\tlog_list=`for i in $$bases; do echo $$i.log; done`; \\\n\ttrs_list=`for i in $$bases; do echo $$i.trs; done`; \\\n\tlog_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \\\n\t$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS=\"$$log_list\"; \\\n\texit $$?;\nrecheck: all $(check_SCRIPTS)\n\t@test -z \"$(TEST_SUITE_LOG)\" || rm -f $(TEST_SUITE_LOG)\n\t@set +e; $(am__set_TESTS_bases); \\\n\tbases=`for i in $$bases; do echo $$i; done \\\n\t         | $(am__list_recheck_tests)` || exit 1; \\\n\tlog_list=`for i in $$bases; do echo $$i.log; done`; \\\n\tlog_list=`echo $$log_list`; \\\n\t$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \\\n\t        am__force_recheck=am--force-recheck \\\n\t        TEST_LOGS=\"$$log_list\"; \\\n\texit $$?\npcre_jit_test.log: pcre_jit_test$(EXEEXT)\n\t@p='pcre_jit_test$(EXEEXT)'; \\\n\tb='pcre_jit_test'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\npcrecpp_unittest.log: pcrecpp_unittest$(EXEEXT)\n\t@p='pcrecpp_unittest$(EXEEXT)'; \\\n\tb='pcrecpp_unittest'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\npcre_scanner_unittest.log: pcre_scanner_unittest$(EXEEXT)\n\t@p='pcre_scanner_unittest$(EXEEXT)'; \\\n\tb='pcre_scanner_unittest'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\npcre_stringpiece_unittest.log: pcre_stringpiece_unittest$(EXEEXT)\n\t@p='pcre_stringpiece_unittest$(EXEEXT)'; \\\n\tb='pcre_stringpiece_unittest'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\nRunTest.log: RunTest\n\t@p='RunTest'; \\\n\tb='RunTest'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\nRunGrepTest.log: RunGrepTest\n\t@p='RunGrepTest'; \\\n\tb='RunGrepTest'; \\\n\t$(am__check_pre) $(LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\n.test.log:\n\t@p='$<'; \\\n\t$(am__set_b); \\\n\t$(am__check_pre) $(TEST_LOG_DRIVER) --test-name \"$$f\" \\\n\t--log-file $$b.log --trs-file $$b.trs \\\n\t$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \\\n\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\n@am__EXEEXT_TRUE@.test$(EXEEXT).log:\n@am__EXEEXT_TRUE@\t@p='$<'; \\\n@am__EXEEXT_TRUE@\t$(am__set_b); \\\n@am__EXEEXT_TRUE@\t$(am__check_pre) $(TEST_LOG_DRIVER) --test-name \"$$f\" \\\n@am__EXEEXT_TRUE@\t--log-file $$b.log --trs-file $$b.trs \\\n@am__EXEEXT_TRUE@\t$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \\\n@am__EXEEXT_TRUE@\t\"$$tst\" $(AM_TESTS_FD_REDIRECT)\n\ndistdir: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) distdir-am\n\ndistdir-am: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz\n\t$(am__post_remove_distdir)\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2\n\t$(am__post_remove_distdir)\n\ndist-lzip: distdir\n\ttardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz\n\t$(am__post_remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz\n\t$(am__post_remove_distdir)\n\ndist-tarZ: distdir\n\t@echo WARNING: \"Support for distribution archives compressed with\" \\\n\t\t       \"legacy program 'compress' is deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__post_remove_distdir)\n\ndist-shar: distdir\n\t@echo WARNING: \"Support for shar distribution archives is\" \\\n\t               \"deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\tshar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz\n\t$(am__post_remove_distdir)\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__post_remove_distdir)\n\ndist dist-all:\n\t$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'\n\t$(am__post_remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lz*) \\\n\t  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir)\n\tchmod u+w $(distdir)\n\tmkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build/sub \\\n\t  && ../../configure \\\n\t    $(AM_DISTCHECK_CONFIGURE_FLAGS) \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t    --srcdir=../.. --prefix=\"$$dc_install_base\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__post_remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@test -n '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: trying to run $@ with an empty' \\\n\t       '$$(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\t$(am__cd) '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\ttest `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\n\t$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)\n\t$(MAKE) $(AM_MAKEFLAGS) check-TESTS\ncheck: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) check-am\nall-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(MANS) $(DATA) \\\n\t\t$(HEADERS) config.h\ninstall-binPROGRAMS: install-libLTLIBRARIES\n\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(libdir)\" \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(man1dir)\" \"$(DESTDIR)$(man3dir)\" \"$(DESTDIR)$(docdir)\" \"$(DESTDIR)$(htmldir)\" \"$(DESTDIR)$(htmldir)\" \"$(DESTDIR)$(pkgconfigdir)\" \"$(DESTDIR)$(includedir)\" \"$(DESTDIR)$(includedir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: $(BUILT_SOURCES)\n\t$(MAKE) $(AM_MAKEFLAGS) install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\t-test -z \"$(TEST_LOGS)\" || rm -f $(TEST_LOGS)\n\t-test -z \"$(TEST_LOGS:.log=.trs)\" || rm -f $(TEST_LOGS:.log=.trs)\n\t-test -z \"$(TEST_SUITE_LOG)\" || rm -f $(TEST_SUITE_LOG)\n\nclean-generic:\n\t-test -z \"$(CLEANFILES)\" || rm -f $(CLEANFILES)\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\n\t-test -z \"$(BUILT_SOURCES)\" || rm -f $(BUILT_SOURCES)\n\t-test -z \"$(MAINTAINERCLEANFILES)\" || rm -f $(MAINTAINERCLEANFILES)\n@WITH_GCOV_FALSE@clean-local:\n@WITH_GCOV_FALSE@distclean-local:\nclean: clean-am\n\nclean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \\\n\tclean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t\t-rm -f ./$(DEPDIR)/dftables.Po\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo\n\t-rm -f ./$(DEPDIR)/libpcreposix_la-pcreposix.Plo\n\t-rm -f ./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po\n\t-rm -f ./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcregrep-pcregrep.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre16_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre32_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcretest.Po\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-hdr distclean-libtool distclean-local distclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am: install-dist_docDATA install-dist_htmlDATA \\\n\tinstall-htmlDATA install-includeHEADERS install-man \\\n\tinstall-nodist_includeHEADERS install-pkgconfigDATA\n\t@$(NORMAL_INSTALL)\n\t$(MAKE) $(AM_MAKEFLAGS) install-data-hook\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binPROGRAMS install-binSCRIPTS \\\n\tinstall-libLTLIBRARIES\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man: install-man1 install-man3\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t\t-rm -f ./$(DEPDIR)/dftables.Po\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ord2utf16.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_utf16_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_valid_utf16.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre16_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcre16_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ord2utf32.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_utf32_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_valid_utf32.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre32_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcre32_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_byte_order.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_chartables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_config.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_dfa_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_exec.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_fullinfo.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_get.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_globals.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_jit_compile.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_maketables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_newline.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_ord2utf8.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_refcount.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_string_utils.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_study.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_tables.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_ucd.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_valid_utf8.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_version.Plo\n\t-rm -f ./$(DEPDIR)/libpcre_la-pcre_xclass.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_scanner.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcre_stringpiece.Plo\n\t-rm -f ./$(DEPDIR)/libpcrecpp_la-pcrecpp.Plo\n\t-rm -f ./$(DEPDIR)/libpcreposix_la-pcreposix.Plo\n\t-rm -f ./$(DEPDIR)/pcre_jit_test-pcre_jit_test.Po\n\t-rm -f ./$(DEPDIR)/pcre_scanner_unittest-pcre_scanner_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcre_stringpiece_unittest-pcre_stringpiece_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcrecpp_unittest-pcrecpp_unittest.Po\n\t-rm -f ./$(DEPDIR)/pcregrep-pcregrep.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre16_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre32_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcre_printint.Po\n\t-rm -f ./$(DEPDIR)/pcretest-pcretest.Po\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \\\n\tuninstall-dist_docDATA uninstall-dist_htmlDATA \\\n\tuninstall-htmlDATA uninstall-includeHEADERS \\\n\tuninstall-libLTLIBRARIES uninstall-man \\\n\tuninstall-nodist_includeHEADERS uninstall-pkgconfigDATA\n\nuninstall-man: uninstall-man1 uninstall-man3\n\n.MAKE: all check check-am install install-am install-data-am \\\n\tinstall-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \\\n\tcheck-TESTS check-am clean clean-binPROGRAMS clean-cscope \\\n\tclean-generic clean-libLTLIBRARIES clean-libtool clean-local \\\n\tclean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \\\n\tdist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \\\n\tdist-xz dist-zip distcheck distclean distclean-compile \\\n\tdistclean-generic distclean-hdr distclean-libtool \\\n\tdistclean-local distclean-tags distcleancheck distdir \\\n\tdistuninstallcheck dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-binPROGRAMS install-binSCRIPTS \\\n\tinstall-data install-data-am install-data-hook \\\n\tinstall-dist_docDATA install-dist_htmlDATA install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-htmlDATA install-includeHEADERS \\\n\tinstall-info install-info-am install-libLTLIBRARIES \\\n\tinstall-man install-man1 install-man3 \\\n\tinstall-nodist_includeHEADERS install-pdf install-pdf-am \\\n\tinstall-pkgconfigDATA install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\trecheck tags tags-am uninstall uninstall-am \\\n\tuninstall-binPROGRAMS uninstall-binSCRIPTS \\\n\tuninstall-dist_docDATA uninstall-dist_htmlDATA \\\n\tuninstall-htmlDATA uninstall-includeHEADERS \\\n\tuninstall-libLTLIBRARIES uninstall-man uninstall-man1 \\\n\tuninstall-man3 uninstall-nodist_includeHEADERS \\\n\tuninstall-pkgconfigDATA\n\n.PRECIOUS: Makefile\n\n\n# The only difference between pcre.h.in and pcre.h is the setting of the PCRE\n# version number. Therefore, we can create the generic version just by copying.\npcre.h.generic: pcre.h.in configure.ac\n\trm -f $@\n\tcp -p pcre.h $@\n\n# It is more complicated for config.h.generic. We need the version that results\n# from a default configuration so as to get all the default values for PCRE\n# configuration macros such as MATCH_LIMIT and NEWLINE. We can get this by\n# doing a configure in a temporary directory. However, some trickery is needed,\n# because the source directory may already be configured. If you just try\n# running configure in a new directory, it complains. For this reason, we move\n# config.status out of the way while doing the default configuration. The\n# resulting config.h is munged by perl to put #ifdefs round any #defines for\n# macros with values, and to #undef all boolean macros such as HAVE_xxx and\n# SUPPORT_xxx. We also get rid of any gcc-specific visibility settings. Make\n# sure that PCRE_EXP_DEFN is unset (in case it has visibility settings).\nconfig.h.generic: configure.ac\n\trm -rf $@ _generic\n\tmkdir _generic\n\tcs=$(srcdir)/config.status; test ! -f $$cs || mv -f $$cs $$cs.aside\n\tcd _generic && $(abs_top_srcdir)/configure || :\n\tcs=$(srcdir)/config.status; test ! -f $$cs.aside || mv -f $$cs.aside $$cs\n\ttest -f _generic/config.h\n\tperl -n \\\n\t  -e 'BEGIN{$$blank=0;}' \\\n\t  -e 'if(/PCRE_EXP_DEFN/){print\"/* #undef PCRE_EXP_DEFN */\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/to make a symbol visible/){next;}' \\\n\t  -e 'if(/__attribute__ \\(\\(visibility/){next;}' \\\n\t  -e 'if(/LT_OBJDIR/){print\"/* This is ignored unless you are using libtool. */\\n\";}' \\\n\t  -e 'if(/^#define\\s((?:HAVE|SUPPORT|STDC)_\\w+)/){print\"/* #undef $$1 */\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/^#define\\s(?!PACKAGE|VERSION)(\\w+)/){print\"#ifndef $$1\\n$$_#endif\\n\";$$blank=0;next;}' \\\n\t  -e 'if(/^\\s*$$/){print unless $$blank; $$blank=1;} else{print;$$blank=0;}' \\\n\t  _generic/config.h >$@\n\trm -rf _generic\n\n@WITH_REBUILD_CHARTABLES_TRUE@pcre_chartables.c: dftables$(EXEEXT)\n@WITH_REBUILD_CHARTABLES_TRUE@\t./dftables$(EXEEXT) $@\n\n@WITH_REBUILD_CHARTABLES_FALSE@pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist\n@WITH_REBUILD_CHARTABLES_FALSE@\trm -f $@\n@WITH_REBUILD_CHARTABLES_FALSE@\t$(LN_S) $(srcdir)/pcre_chartables.c.dist $@\n\n# A compatibility line, the old build system worked with 'make test'\ntest: check ;\n\n# A PCRE user submitted the following addition, saying that it \"will allow\n# anyone using the 'mingw32' compiler to simply type 'make pcre.dll' and get a\n# nice DLL for Windows use\".\npcre.dll: $(DLL_OBJS)\n\t$(CC) -shared -o pcre.dll -Wl,\"--strip-all\" -Wl,\"--export-all-symbols\" $(DLL_OBJS)\n\n# Arrange for the per-function man pages to have 16- and 32-bit names as well.\ninstall-data-hook:\n\tln -sf pcre_assign_jit_stack.3\t\t $(DESTDIR)$(man3dir)/pcre16_assign_jit_stack.3\n\tln -sf pcre_compile.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_compile.3\n\tln -sf pcre_compile2.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_compile2.3\n\tln -sf pcre_config.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_config.3\n\tln -sf pcre_copy_named_substring.3\t $(DESTDIR)$(man3dir)/pcre16_copy_named_substring.3\n\tln -sf pcre_copy_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_copy_substring.3\n\tln -sf pcre_dfa_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_dfa_exec.3\n\tln -sf pcre_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_exec.3\n\tln -sf pcre_free_study.3\t\t $(DESTDIR)$(man3dir)/pcre16_free_study.3\n\tln -sf pcre_free_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_free_substring.3\n\tln -sf pcre_free_substring_list.3\t $(DESTDIR)$(man3dir)/pcre16_free_substring_list.3\n\tln -sf pcre_fullinfo.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_fullinfo.3\n\tln -sf pcre_get_named_substring.3\t $(DESTDIR)$(man3dir)/pcre16_get_named_substring.3\n\tln -sf pcre_get_stringnumber.3\t\t $(DESTDIR)$(man3dir)/pcre16_get_stringnumber.3\n\tln -sf pcre_get_stringtable_entries.3\t $(DESTDIR)$(man3dir)/pcre16_get_stringtable_entries.3\n\tln -sf pcre_get_substring.3\t\t $(DESTDIR)$(man3dir)/pcre16_get_substring.3\n\tln -sf pcre_get_substring_list.3\t $(DESTDIR)$(man3dir)/pcre16_get_substring_list.3\n\tln -sf pcre_jit_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_jit_exec.3\n\tln -sf pcre_jit_stack_alloc.3\t\t $(DESTDIR)$(man3dir)/pcre16_jit_stack_alloc.3\n\tln -sf pcre_jit_stack_free.3\t\t $(DESTDIR)$(man3dir)/pcre16_jit_stack_free.3\n\tln -sf pcre_maketables.3\t\t $(DESTDIR)$(man3dir)/pcre16_maketables.3\n\tln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre16_pattern_to_host_byte_order.3\n\tln -sf pcre_refcount.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_refcount.3\n\tln -sf pcre_study.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_study.3\n\tln -sf pcre_utf16_to_host_byte_order.3\t $(DESTDIR)$(man3dir)/pcre16_utf16_to_host_byte_order.3\n\tln -sf pcre_version.3\t\t\t $(DESTDIR)$(man3dir)/pcre16_version.3\n\tln -sf pcre_assign_jit_stack.3\t\t $(DESTDIR)$(man3dir)/pcre32_assign_jit_stack.3\n\tln -sf pcre_compile.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_compile.3\n\tln -sf pcre_compile2.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_compile2.3\n\tln -sf pcre_config.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_config.3\n\tln -sf pcre_copy_named_substring.3\t $(DESTDIR)$(man3dir)/pcre32_copy_named_substring.3\n\tln -sf pcre_copy_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_copy_substring.3\n\tln -sf pcre_dfa_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_dfa_exec.3\n\tln -sf pcre_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_exec.3\n\tln -sf pcre_free_study.3\t\t $(DESTDIR)$(man3dir)/pcre32_free_study.3\n\tln -sf pcre_free_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_free_substring.3\n\tln -sf pcre_free_substring_list.3\t $(DESTDIR)$(man3dir)/pcre32_free_substring_list.3\n\tln -sf pcre_fullinfo.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_fullinfo.3\n\tln -sf pcre_get_named_substring.3\t $(DESTDIR)$(man3dir)/pcre32_get_named_substring.3\n\tln -sf pcre_get_stringnumber.3\t\t $(DESTDIR)$(man3dir)/pcre32_get_stringnumber.3\n\tln -sf pcre_get_stringtable_entries.3\t $(DESTDIR)$(man3dir)/pcre32_get_stringtable_entries.3\n\tln -sf pcre_get_substring.3\t\t $(DESTDIR)$(man3dir)/pcre32_get_substring.3\n\tln -sf pcre_get_substring_list.3\t $(DESTDIR)$(man3dir)/pcre32_get_substring_list.3\n\tln -sf pcre_jit_exec.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_jit_exec.3\n\tln -sf pcre_jit_stack_alloc.3\t\t $(DESTDIR)$(man3dir)/pcre32_jit_stack_alloc.3\n\tln -sf pcre_jit_stack_free.3\t\t $(DESTDIR)$(man3dir)/pcre32_jit_stack_free.3\n\tln -sf pcre_maketables.3\t\t $(DESTDIR)$(man3dir)/pcre32_maketables.3\n\tln -sf pcre_pattern_to_host_byte_order.3 $(DESTDIR)$(man3dir)/pcre32_pattern_to_host_byte_order.3\n\tln -sf pcre_refcount.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_refcount.3\n\tln -sf pcre_study.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_study.3\n\tln -sf pcre_utf32_to_host_byte_order.3\t $(DESTDIR)$(man3dir)/pcre32_utf32_to_host_byte_order.3\n\tln -sf pcre_version.3\t\t\t $(DESTDIR)$(man3dir)/pcre32_version.3\n\n@WITH_GCOV_TRUE@coverage-check: all\n@WITH_GCOV_TRUE@\t-$(MAKE) $(AM_MAKEFLAGS) -k check\n\n@WITH_GCOV_TRUE@coverage-baseline:\n@WITH_GCOV_TRUE@\t$(LCOV) $(coverage_quiet) \\\n@WITH_GCOV_TRUE@\t\t--directory $(top_builddir) \\\n@WITH_GCOV_TRUE@\t\t--output-file \"$(COVERAGE_OUTPUT_FILE)\" \\\n@WITH_GCOV_TRUE@\t\t--capture \\\n@WITH_GCOV_TRUE@\t\t--initial\n\n@WITH_GCOV_TRUE@coverage-report:\n@WITH_GCOV_TRUE@\t$(LCOV) $(coverage_quiet) \\\n@WITH_GCOV_TRUE@\t\t--directory $(top_builddir) \\\n@WITH_GCOV_TRUE@\t\t--capture \\\n@WITH_GCOV_TRUE@\t\t--output-file \"$(COVERAGE_OUTPUT_FILE).tmp\" \\\n@WITH_GCOV_TRUE@\t\t--test-name \"$(COVERAGE_TEST_NAME)\" \\\n@WITH_GCOV_TRUE@\t\t--no-checksum \\\n@WITH_GCOV_TRUE@\t\t--compat-libtool \\\n@WITH_GCOV_TRUE@\t\t$(COVERAGE_LCOV_EXTRA_FLAGS)\n@WITH_GCOV_TRUE@\t$(LCOV) $(coverage_quiet) \\\n@WITH_GCOV_TRUE@\t\t--directory $(top_builddir) \\\n@WITH_GCOV_TRUE@\t\t--output-file \"$(COVERAGE_OUTPUT_FILE)\" \\\n@WITH_GCOV_TRUE@\t\t--remove \"$(COVERAGE_OUTPUT_FILE).tmp\" \\\n@WITH_GCOV_TRUE@\t\t\"/tmp/*\" \\\n@WITH_GCOV_TRUE@\t\t\"/usr/include/*\" \\\n@WITH_GCOV_TRUE@\t\t\"$(includedir)/*\"\n@WITH_GCOV_TRUE@\t-@rm -f \"$(COVERAGE_OUTPUT_FILE).tmp\"\n@WITH_GCOV_TRUE@\tLANG=C $(GENHTML) $(coverage_quiet) \\\n@WITH_GCOV_TRUE@\t\t--prefix $(top_builddir) \\\n@WITH_GCOV_TRUE@\t\t--output-directory \"$(COVERAGE_OUTPUT_DIR)\" \\\n@WITH_GCOV_TRUE@\t\t--title \"$(PACKAGE) $(VERSION) Code Coverage Report\" \\\n@WITH_GCOV_TRUE@\t\t--show-details \"$(COVERAGE_OUTPUT_FILE)\" \\\n@WITH_GCOV_TRUE@\t\t--legend \\\n@WITH_GCOV_TRUE@\t\t$(COVERAGE_GENHTML_EXTRA_FLAGS)\n@WITH_GCOV_TRUE@\t@echo \"Code coverage report written to file://$(abs_builddir)/$(COVERAGE_OUTPUT_DIR)/index.html\"\n\n@WITH_GCOV_TRUE@coverage-reset:\n@WITH_GCOV_TRUE@\t-$(LCOV) $(coverage_quiet) --zerocounters --directory $(top_builddir)\n\n@WITH_GCOV_TRUE@coverage-clean-report:\n@WITH_GCOV_TRUE@\t-rm -f \"$(COVERAGE_OUTPUT_FILE)\" \"$(COVERAGE_OUTPUT_FILE).tmp\"\n@WITH_GCOV_TRUE@\t-rm -rf \"$(COVERAGE_OUTPUT_DIR)\"\n\n@WITH_GCOV_TRUE@coverage-clean-data:\n@WITH_GCOV_TRUE@\t-find $(top_builddir) -name \"*.gcda\" -delete\n\n@WITH_GCOV_TRUE@coverage-clean: coverage-reset coverage-clean-report coverage-clean-data\n@WITH_GCOV_TRUE@\t-find $(top_builddir) -name \"*.gcno\" -delete\n\n@WITH_GCOV_TRUE@coverage-distclean: coverage-clean\n\n@WITH_GCOV_TRUE@coverage: coverage-reset coverage-baseline coverage-check coverage-report\n@WITH_GCOV_TRUE@clean-local: coverage-clean\n@WITH_GCOV_TRUE@distclean-local: coverage-distclean\n\n@WITH_GCOV_TRUE@.PHONY: coverage coverage-baseline coverage-check coverage-report coverage-reset coverage-clean-report coverage-clean-data coverage-clean coverage-distclean\n\n@WITH_GCOV_FALSE@coverage:\n@WITH_GCOV_FALSE@\t@echo \"Configuring with --enable-coverage required to generate code coverage report.\"\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/pcre/NEWS",
    "content": "News about PCRE releases\n------------------------\n\nNote that this library (now called PCRE1) is now being maintained for bug fixes\nonly. New projects are advised to use the new PCRE2 libraries.\n\n\nRelease 8.43 23-February-2019\n-----------------------------\n\nThis is a bug-fix release.\n\n\nRelease 8.42 20-March-2018\n--------------------------\n\nThis is a bug-fix release.\n\n\nRelease 8.41 13-June-2017\n-------------------------\n\nThis is a bug-fix release.\n\n\nRelease 8.40 11-January-2017\n----------------------------\n\nThis is a bug-fix release.\n\n\nRelease 8.39 14-June-2016\n-------------------------\n\nSome appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart\nfrom that, this is another bug-fix release. Note that this library (now called\nPCRE1) is now being maintained for bug fixes only. New projects are advised to\nuse the new PCRE2 libraries.\n\n\nRelease 8.38 23-November-2015\n-----------------------------\n\nThis is bug-fix release. Note that this library (now called PCRE1) is now being\nmaintained for bug fixes only. New projects are advised to use the new PCRE2\nlibraries.\n\n\nRelease 8.37 28-April-2015\n--------------------------\n\nThis is bug-fix release. Note that this library (now called PCRE1) is now being\nmaintained for bug fixes only. New projects are advised to use the new PCRE2\nlibraries.\n\n\nRelease 8.36 26-September-2014\n------------------------------\n\nThis is primarily a bug-fix release. However, in addition, the Unicode data\ntables have been updated to Unicode 7.0.0.\n\n\nRelease 8.35 04-April-2014\n--------------------------\n\nThere have been performance improvements for classes containing non-ASCII\ncharacters and the \"auto-possessification\" feature has been extended. Other\nminor improvements have been implemented and bugs fixed. There is a new callout\nfeature to enable applications to do detailed stack checks at compile time, to\navoid running out of stack for deeply nested parentheses. The JIT compiler has\nbeen extended with experimental support for ARM-64, MIPS-64, and PPC-LE.\n\n\nRelease 8.34 15-December-2013\n-----------------------------\n\nAs well as fixing the inevitable bugs, performance has been improved by\nrefactoring and extending the amount of \"auto-possessification\" that PCRE does.\nOther notable changes:\n\n.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match\n   an empty string. If it can, pcretest shows this in its information output.\n\n.  A back reference to a named subpattern when there is more than one of the\n   same name now checks them in the order in which they appear in the pattern.\n   The first one that is set is used for the reference. Previously only the\n   first one was inspected. This change makes PCRE more compatible with Perl.\n\n.  Unicode character properties were updated from Unicode 6.3.0.\n\n.  The character VT has been added to the set of characters that match \\s and\n   are generally treated as white space, following this same change in Perl\n   5.18. There is now no difference between \"Perl space\" and \"POSIX space\".\n\n.  Perl has changed its handling of \\8 and \\9. If there is no previously\n   encountered capturing group of those numbers, they are treated as the\n   literal characters 8 and 9 instead of a binary zero followed by the\n   literals. PCRE now does the same.\n\n.  Following Perl, added \\o{} to specify codepoints in octal, making it\n   possible to specify values greater than 0777 and also making them\n   unambiguous.\n\n.  In UCP mode, \\s was not matching two of the characters that Perl matches,\n   namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they\n   were matched by \\h.\n\n.  Add JIT support for the 64 bit TileGX architecture.\n\n.  Upgraded the handling of the POSIX classes [:graph:], [:print:], and\n   [:punct:] when PCRE_UCP is set so as to include the same characters as Perl\n   does in Unicode mode.\n\n.  Perl no longer allows group names to start with digits, so I have made this\n   change also in PCRE.\n\n.  Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to\n   mean \"start of word\" and \"end of word\", respectively, as a transition aid.\n\n\nRelease 8.33 28-May-2013\n--------------------------\n\nA number of bugs are fixed, and some performance improvements have been made.\nThere are also some new features, of which these are the most important:\n\n.  The behaviour of the backtracking verbs has been rationalized and\n   documented in more detail.\n\n.  JIT now supports callouts and all of the backtracking verbs.\n\n.  Unicode validation has been updated in the light of Unicode Corrigendum #9,\n   which points out that \"non characters\" are not \"characters that may not\n   appear in Unicode strings\" but rather \"characters that are reserved for\n   internal use and have only local meaning\".\n\n.  (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the\n   creator of a pattern can specify lower (but not higher) limits for the\n   matching process.\n\n.  The PCRE_NEVER_UTF option is available to prevent pattern-writers from using\n   the (*UTF) feature, as this could be a security issue.\n\n\nRelease 8.32 30-November-2012\n-----------------------------\n\nThis release fixes a number of bugs, but also has some new features. These are\nthe highlights:\n\n.  There is now support for 32-bit character strings and UTF-32. Like the\n   16-bit support, this is done by compiling a separate 32-bit library.\n\n.  \\X now matches a Unicode extended grapheme cluster.\n\n.  Case-independent matching of Unicode characters that have more than one\n   \"other case\" now makes all three (or more) characters equivalent. This\n   applies, for example, to Greek Sigma, which has two lowercase versions.\n\n.  Unicode character properties are updated to Unicode 6.2.0.\n\n.  The EBCDIC support, which had decayed, has had a spring clean.\n\n.  A number of JIT optimizations have been added, which give faster JIT\n   execution speed. In addition, a new direct interface to JIT execution is\n   available. This bypasses some of the sanity checks of pcre_exec() to give a\n   noticeable speed-up.\n\n.  A number of issues in pcregrep have been fixed, making it more compatible\n   with GNU grep. In particular, --exclude and --include (and variants) apply\n   to all files now, not just those obtained from scanning a directory\n   recursively. In Windows environments, the default action for directories is\n   now \"skip\" instead of \"read\" (which provokes an error).\n\n.  If the --only-matching (-o) option in pcregrep is specified multiple\n   times, each one causes appropriate output. For example, -o1 -o2 outputs the\n   substrings matched by the 1st and 2nd capturing parentheses. A separating\n   string can be specified by --om-separator (default empty).\n\n.  When PCRE is built via Autotools using a version of gcc that has the\n   \"visibility\" feature, it is used to hide internal library functions that are\n   not part of the public API.\n\n\nRelease 8.31 06-July-2012\n-------------------------\n\nThis is mainly a bug-fixing release, with a small number of developments:\n\n. The JIT compiler now supports partial matching and the (*MARK) and\n  (*COMMIT) verbs.\n\n. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a\n  pattern.\n\n. There should be a performance improvement when using the heap instead of the\n  stack for recursion.\n\n. pcregrep can now be linked with libedit as an alternative to libreadline.\n\n. pcregrep now has a --file-list option where the list of files to scan is\n  given as a file.\n\n. pcregrep now recognizes binary files and there are related options.\n\n. The Unicode tables have been updated to 6.1.0.\n\nAs always, the full list of changes is in the ChangeLog file.\n\n\nRelease 8.30 04-February-2012\n-----------------------------\n\nRelease 8.30 introduces a major new feature: support for 16-bit character\nstrings, compiled as a separate library. There are a few changes to the\n8-bit library, in addition to some bug fixes.\n\n. The pcre_info() function, which has been obsolete for over 10 years, has\n  been removed.\n\n. When a compiled pattern was saved to a file and later reloaded on a host\n  with different endianness, PCRE used automatically to swap the bytes in some\n  of the data fields. With the advent of the 16-bit library, where more of this\n  swapping is needed, it is no longer done automatically. Instead, the bad\n  endianness is detected and a specific error is given. The user can then call\n  a new function called pcre_pattern_to_host_byte_order() (or an equivalent\n  16-bit function) to do the swap.\n\n. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode\n  code points and are now faulted. (They are the so-called \"surrogates\"\n  that are reserved for coding high values in UTF-16.)\n\n\nRelease 8.21 12-Dec-2011\n------------------------\n\nThis is almost entirely a bug-fix release. The only new feature is the ability\nto obtain the size of the memory used by the JIT compiler.\n\n\nRelease 8.20 21-Oct-2011\n------------------------\n\nThe main change in this release is the inclusion of Zoltan Herczeg's\njust-in-time compiler support, which can be accessed by building PCRE with\n--enable-jit. Large performance benefits can be had in many situations. 8.20\nalso fixes an unfortunate bug that was introduced in 8.13 as well as tidying up\na number of infelicities and differences from Perl.\n\n\nRelease 8.13 16-Aug-2011\n------------------------\n\nThis is mainly a bug-fix release. There has been a lot of internal refactoring.\nThe Unicode tables have been updated. The only new feature in the library is\nthe passing of *MARK information to callouts. Some additions have been made to\npcretest to make testing easier and more comprehensive. There is a new option\nfor pcregrep to adjust its internal buffer size.\n\n\nRelease 8.12 15-Jan-2011\n------------------------\n\nThis release fixes some bugs in pcregrep, one of which caused the tests to fail\non 64-bit big-endian systems. There are no changes to the code of the library.\n\n\nRelease 8.11 10-Dec-2010\n------------------------\n\nA number of bugs in the library and in pcregrep have been fixed. As always, see\nChangeLog for details. The following are the non-bug-fix changes:\n\n. Added --match-limit and --recursion-limit to pcregrep.\n\n. Added an optional parentheses number to the -o and --only-matching options\n  of pcregrep.\n\n. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \\z, \\Z, \\b, and\n  \\B.\n\n. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a\n  bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.\n\n. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_\n  START_OPTIMIZE option, which is now allowed at compile time\n\n\nRelease 8.10 25-Jun-2010\n------------------------\n\nThere are two major additions: support for (*MARK) and friends, and the option\nPCRE_UCP, which changes the behaviour of \\b, \\d, \\s, and \\w (and their\nopposites) so that they make use of Unicode properties. There are also a number\nof lesser new features, and several bugs have been fixed. A new option,\n--line-buffered, has been added to pcregrep, for use when it is connected to\npipes.\n\n\nRelease 8.02 19-Mar-2010\n------------------------\n\nAnother bug-fix release.\n\n\nRelease 8.01 19-Jan-2010\n------------------------\n\nThis is a bug-fix release. Several bugs in the code itself and some bugs and\ninfelicities in the build system have been fixed.\n\n\nRelease 8.00 19-Oct-09\n----------------------\n\nBugs have been fixed in the library and in pcregrep. There are also some\nenhancements. Restrictions on patterns used for partial matching have been\nremoved, extra information is given for partial matches, the partial matching\nprocess has been improved, and an option to make a partial match override a\nfull match is available. The \"study\" process has been enhanced by finding a\nlower bound matching length. Groups with duplicate numbers may now have\nduplicated names without the use of PCRE_DUPNAMES. However, they may not have\ndifferent names. The documentation has been revised to reflect these changes.\nThe version number has been expanded to 3 digits as it is clear that the rate\nof change is not slowing down.\n\n\nRelease 7.9 11-Apr-09\n---------------------\n\nMostly bugfixes and tidies with just a couple of minor functional additions.\n\n\nRelease 7.8 05-Sep-08\n---------------------\n\nMore bug fixes, plus a performance improvement in Unicode character property\nlookup.\n\n\nRelease 7.7 07-May-08\n---------------------\n\nThis is once again mainly a bug-fix release, but there are a couple of new\nfeatures.\n\n\nRelease 7.6 28-Jan-08\n---------------------\n\nThe main reason for having this release so soon after 7.5 is because it fixes a\npotential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In\naddition, the CMake configuration files have been brought up to date.\n\n\nRelease 7.5 10-Jan-08\n---------------------\n\nThis is mainly a bug-fix release. However the ability to link pcregrep with\nlibz or libbz2 and the ability to link pcretest with libreadline have been\nadded. Also the --line-offsets and --file-offsets options were added to\npcregrep.\n\n\nRelease 7.4 21-Sep-07\n---------------------\n\nThe only change of specification is the addition of options to control whether\n\\R matches any Unicode line ending (the default) or just CR, LF, and CRLF.\nOtherwise, the changes are bug fixes and a refactoring to reduce the number of\nrelocations needed in a shared library. There have also been some documentation\nupdates, in particular, some more information about using CMake to build PCRE\nhas been added to the NON-UNIX-USE file.\n\n\nRelease 7.3 28-Aug-07\n---------------------\n\nMost changes are bug fixes. Some that are not:\n\n1. There is some support for Perl 5.10's experimental \"backtracking control\n   verbs\" such as (*PRUNE).\n\n2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more\n   restrictive in the strings it accepts.\n\n3. Checking for potential integer overflow has been made more dynamic, and as a\n   consequence there is no longer a hard limit on the size of a subpattern that\n   has a limited repeat count.\n\n4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec()\n   no longer advance by two characters instead of one when an unanchored match\n   fails at CRLF if there are explicit CR or LF matches within the pattern.\n   This gets rid of some anomalous effects that previously occurred.\n\n5. Some PCRE-specific settings for varying the newline options at the start of\n   a pattern have been added.\n\n\nRelease 7.2 19-Jun-07\n---------------------\n\nWARNING: saved patterns that were compiled by earlier versions of PCRE must be\nrecompiled for use with 7.2 (necessitated by the addition of \\K, \\h, \\H, \\v,\nand \\V).\n\nCorrection to the notes for 7.1: the note about shared libraries for Windows is\nwrong. Previously, three libraries were built, but each could function\nindependently. For example, the pcreposix library also included all the\nfunctions from the basic pcre library. The change is that the three libraries\nare no longer independent. They are like the Unix libraries. To use the\npcreposix functions, for example, you need to link with both the pcreposix and\nthe basic pcre library.\n\nSome more features from Perl 5.10 have been added:\n\n  (?-n) and (?+n) relative references for recursion and subroutines.\n\n  (?(-n) and (?(+n) relative references as conditions.\n\n  \\k{name} and \\g{name} are synonyms for \\k<name>.\n\n  \\K to reset the start of the matched string; for example, (foo)\\Kbar\n  matches bar preceded by foo, but only sets bar as the matched string.\n\n  (?| introduces a group where the capturing parentheses in each alternative\n  start from the same number; for example, (?|(abc)|(xyz)) sets capturing\n  parentheses number 1 in both cases.\n\n  \\h, \\H, \\v, \\V match horizontal and vertical whitespace, respectively.\n\n\nRelease 7.1 24-Apr-07\n---------------------\n\nThere is only one new feature in this release: a linebreak setting of\nPCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which\nrecognizes only CRLF, CR, and LF as linebreaks.\n\nA few bugs are fixed (see ChangeLog for details), but the major change is a\ncomplete re-implementation of the build system. This now has full Autotools\nsupport and so is now \"standard\" in some sense. It should help with compiling\nPCRE in a wide variety of environments.\n\nNOTE: when building shared libraries for Windows, three dlls are now built,\ncalled libpcre, libpcreposix, and libpcrecpp. Previously, everything was\nincluded in a single dll.\n\nAnother important change is that the dftables auxiliary program is no longer\ncompiled and run at \"make\" time by default. Instead, a default set of character\ntables (assuming ASCII coding) is used. If you want to use dftables to generate\nthe character tables as previously, add --enable-rebuild-chartables to the\n\"configure\" command. You must do this if you are compiling PCRE to run on a\nsystem that uses EBCDIC code.\n\nThere is a discussion about character tables in the README file. The default is\nnot to use dftables so that that there is no problem when cross-compiling.\n\n\nRelease 7.0 19-Dec-06\n---------------------\n\nThis release has a new major number because there have been some internal\nupheavals to facilitate the addition of new optimizations and other facilities,\nand to make subsequent maintenance and extension easier. Compilation is likely\nto be a bit slower, but there should be no major effect on runtime performance.\nPreviously compiled patterns are NOT upwards compatible with this release. If\nyou have saved compiled patterns from a previous release, you will have to\nre-compile them. Important changes that are visible to users are:\n\n1. The Unicode property tables have been updated to Unicode 5.0.0, which adds\n   some more scripts.\n\n2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline\n   sequence as a newline.\n\n3. The \\R escape matches a single Unicode newline sequence as a single unit.\n\n4. New features that will appear in Perl 5.10 are now in PCRE. These include\n   alternative Perl syntax for named parentheses, and Perl syntax for\n   recursion.\n\n5. The C++ wrapper interface has been extended by the addition of a\n   QuoteMeta function and the ability to allow copy construction and\n   assignment.\n\nFor a complete list of changes, see the ChangeLog file.\n\n\nRelease 6.7 04-Jul-06\n---------------------\n\nThe main additions to this release are the ability to use the same name for\nmultiple sets of parentheses, and support for CRLF line endings in both the\nlibrary and pcregrep (and in pcretest for testing).\n\nThanks to Ian Taylor, the stack usage for many kinds of pattern has been\nsignificantly reduced for certain subject strings.\n\n\nRelease 6.5 01-Feb-06\n---------------------\n\nImportant changes in this release:\n\n1. A number of new features have been added to pcregrep.\n\n2. The Unicode property tables have been updated to Unicode 4.1.0, and the\n   supported properties have been extended with script names such as \"Arabic\",\n   and the derived properties \"Any\" and \"L&\". This has necessitated a change to\n   the interal format of compiled patterns. Any saved compiled patterns that\n   use \\p or \\P must be recompiled.\n\n3. The specification of recursion in patterns has been changed so that all\n   recursive subpatterns are automatically treated as atomic groups. Thus, for\n   example, (?R) is treated as if it were (?>(?R)). This is necessary because\n   otherwise there are situations where recursion does not work.\n\nSee the ChangeLog for a complete list of changes, which include a number of bug\nfixes and tidies.\n\n\nRelease 6.0 07-Jun-05\n---------------------\n\nThe release number has been increased to 6.0 because of the addition of several\nmajor new pieces of functionality.\n\nA new function, pcre_dfa_exec(), which implements pattern matching using a DFA\nalgorithm, has been added. This has a number of advantages for certain cases,\nthough it does run more slowly, and lacks the ability to capture substrings. On\nthe other hand, it does find all matches, not just the first, and it works\nbetter for partial matching. The pcrematching man page discusses the\ndifferences.\n\nThe pcretest program has been enhanced so that it can make use of the new\npcre_dfa_exec() matching function and the extra features it provides.\n\nThe distribution now includes a C++ wrapper library. This is built\nautomatically if a C++ compiler is found. The pcrecpp man page discusses this\ninterface.\n\nThe code itself has been re-organized into many more files, one for each\nfunction, so it no longer requires everything to be linked in when static\nlinkage is used. As a consequence, some internal functions have had to have\ntheir names exposed. These functions all have names starting with _pcre_. They\nare undocumented, and are not intended for use by outside callers.\n\nThe pcregrep program has been enhanced with new functionality such as\nmultiline-matching and options for output more matching context. See the\nChangeLog for a complete list of changes to the library and the utility\nprograms.\n\n\nRelease 5.0 13-Sep-04\n---------------------\n\nThe licence under which PCRE is released has been changed to the more\nconventional \"BSD\" licence.\n\nIn the code, some bugs have been fixed, and there are also some major changes\nin this release (which is why I've increased the number to 5.0). Some changes\nare internal rearrangements, and some provide a number of new facilities. The\nnew features are:\n\n1. There's an \"automatic callout\" feature that inserts callouts before every\n   item in the regex, and there's a new callout field that gives the position\n   in the pattern - useful for debugging and tracing.\n\n2. The extra_data structure can now be used to pass in a set of character\n   tables at exec time. This is useful if compiled regex are saved and re-used\n   at a later time when the tables may not be at the same address. If the\n   default internal tables are used, the pointer saved with the compiled\n   pattern is now set to NULL, which means that you don't need to do anything\n   special unless you are using custom tables.\n\n3. It is possible, with some restrictions on the content of the regex, to\n   request \"partial\" matching. A special return code is given if all of the\n   subject string matched part of the regex. This could be useful for testing\n   an input field as it is being typed.\n\n4. There is now some optional support for Unicode character properties, which\n   means that the patterns items such as \\p{Lu} and \\X can now be used. Only\n   the general category properties are supported. If PCRE is compiled with this\n   support, an additional 90K data structure is include, which increases the\n   size of the library dramatically.\n\n5. There is support for saving compiled patterns and re-using them later.\n\n6. There is support for running regular expressions that were compiled on a\n   different host with the opposite endianness.\n\n7. The pcretest program has been extended to accommodate the new features.\n\nThe main internal rearrangement is that sequences of literal characters are no\nlonger handled as strings. Instead, each character is handled on its own. This\nmakes some UTF-8 handling easier, and makes the support of partial matching\npossible. Compiled patterns containing long literal strings will be larger as a\nresult of this change; I hope that performance will not be much affected.\n\n\nRelease 4.5 01-Dec-03\n---------------------\n\nAgain mainly a bug-fix and tidying release, with only a couple of new features:\n\n1. It's possible now to compile PCRE so that it does not use recursive\nfunction calls when matching. Instead it gets memory from the heap. This slows\nthings down, but may be necessary on systems with limited stacks.\n\n2. UTF-8 string checking has been tightened to reject overlong sequences and to\ncheck that a starting offset points to the start of a character. Failure of the\nlatter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET.\n\n3. PCRE can now be compiled for systems that use EBCDIC code.\n\n\nRelease 4.4 21-Aug-03\n---------------------\n\nThis is mainly a bug-fix and tidying release. The only new feature is that PCRE\nchecks UTF-8 strings for validity by default. There is an option to suppress\nthis, just in case anybody wants that teeny extra bit of performance.\n\n\nReleases 4.1 - 4.3\n------------------\n\nSorry, I forgot about updating the NEWS file for these releases. Please take a\nlook at ChangeLog.\n\n\nRelease 4.0 17-Feb-03\n---------------------\n\nThere have been a lot of changes for the 4.0 release, adding additional\nfunctionality and mending bugs. Below is a list of the highlights of the new\nfunctionality. For full details of these features, please consult the\ndocumentation. For a complete list of changes, see the ChangeLog file.\n\n1. Support for Perl's \\Q...\\E escapes.\n\n2. \"Possessive quantifiers\" ?+, *+, ++, and {,}+ which come from Sun's Java\npackage. They provide some syntactic sugar for simple cases of \"atomic\ngrouping\".\n\n3. Support for the \\G assertion. It is true when the current matching position\nis at the start point of the match.\n\n4. A new feature that provides some of the functionality that Perl provides\nwith (?{...}). The facility is termed a \"callout\". The way it is done in PCRE\nis for the caller to provide an optional function, by setting pcre_callout to\nits entry point. To get the function called, the regex must include (?C) at\nappropriate points.\n\n5. Support for recursive calls to individual subpatterns. This makes it really\neasy to get totally confused.\n\n6. Support for named subpatterns. The Python syntax (?P<name>...) is used to\nname a group.\n\n7. Several extensions to UTF-8 support; it is now fairly complete. There is an\noption for pcregrep to make it operate in UTF-8 mode.\n\n8. The single man page has been split into a number of separate man pages.\nThese also give rise to individual HTML pages which are put in a separate\ndirectory. There is an index.html page that lists them all. Some hyperlinking\nbetween the pages has been installed.\n\n\nRelease 3.5 15-Aug-01\n---------------------\n\n1. The configuring system has been upgraded to use later versions of autoconf\nand libtool. By default it builds both a shared and a static library if the OS\nsupports it. You can use --disable-shared or --disable-static on the configure\ncommand if you want only one of them.\n\n2. The pcretest utility is now installed along with pcregrep because it is\nuseful for users (to test regexs) and by doing this, it automatically gets\nrelinked by libtool. The documentation has been turned into a man page, so\nthere are now .1, .txt, and .html versions in /doc.\n\n3. Upgrades to pcregrep:\n   (i)   Added long-form option names like gnu grep.\n   (ii)  Added --help to list all options with an explanatory phrase.\n   (iii) Added -r, --recursive to recurse into sub-directories.\n   (iv)  Added -f, --file to read patterns from a file.\n\n4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure\nscript, to force use of CR or LF instead of \\n in the source. On non-Unix\nsystems, the value can be set in config.h.\n\n5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an\nabsolute limit. Changed the text of the error message to make this clear, and\nlikewise updated the man page.\n\n6. The limit of 99 on the number of capturing subpatterns has been removed.\nThe new limit is 65535, which I hope will not be a \"real\" limit.\n\n\nRelease 3.3 01-Aug-00\n---------------------\n\nThere is some support for UTF-8 character strings. This is incomplete and\nexperimental. The documentation describes what is and what is not implemented.\nOtherwise, this is just a bug-fixing release.\n\n\nRelease 3.0 01-Feb-00\n---------------------\n\n1. A \"configure\" script is now used to configure PCRE for Unix systems. It\nbuilds a Makefile, a config.h file, and the pcre-config script.\n\n2. PCRE is built as a shared library by default.\n\n3. There is support for POSIX classes such as [:alpha:].\n\n5. There is an experimental recursion feature.\n\n----------------------------------------------------------------------------\n          IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00\n\nPlease note that there has been a change in the API such that a larger\novector is required at matching time, to provide some additional workspace.\nThe new man page has details. This change was necessary in order to support\nsome of the new functionality in Perl 5.005.\n\n          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00\n\nAnother (I hope this is the last!) change has been made to the API for the\npcre_compile() function. An additional argument has been added to make it\npossible to pass over a pointer to character tables built in the current\nlocale by pcre_maketables(). To use the default tables, this new argument\nshould be passed as NULL.\n\n          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05\n\nYet another (and again I hope this really is the last) change has been made\nto the API for the pcre_exec() function. An additional argument has been\nadded to make it possible to start the match other than at the start of the\nsubject string. This is important if there are lookbehinds. The new man\npage has the details, but you just want to convert existing programs, all\nyou need to do is to stick in a new fifth argument to pcre_exec(), with a\nvalue of zero. For example, change\n\n  pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)\nto\n  pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)\n\n****\n"
  },
  {
    "path": "src/pcre/NON-AUTOTOOLS-BUILD",
    "content": "Building PCRE without using autotools\n-------------------------------------\n\nNOTE: This document relates to PCRE releases that use the original API, with\nlibrary names libpcre, libpcre16, and libpcre32. January 2015 saw the first\nrelease of a new API, known as PCRE2, with release numbers starting at 10.00\nand library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries\n(now called PCRE1) are still being maintained for bug fixes, but there will be\nno new development. New projects are advised to use the new PCRE2 libraries.\n\n\nThis document contains the following sections:\n\n  General\n  Generic instructions for the PCRE C library\n  The C++ wrapper functions\n  Building for virtual Pascal\n  Stack size in Windows environments\n  Linking programs in Windows environments\n  Calling conventions in Windows environments\n  Comments about Win32 builds\n  Building PCRE on Windows with CMake\n  Use of relative paths with CMake on Windows\n  Testing with RunTest.bat\n  Building under Windows CE with Visual Studio 200x\n  Building under Windows with BCC5.5\n  Building using Borland C++ Builder 2007 (CB2007) and higher\n  Building PCRE on OpenVMS\n  Building PCRE on Stratus OpenVOS\n  Building PCRE on native z/OS and z/VM\n\n\nGENERAL\n\nI (Philip Hazel) have no experience of Windows or VMS sytems and how their\nlibraries work. The items in the PCRE distribution and Makefile that relate to\nanything other than Linux systems are untested by me.\n\nThere are some other comments and files (including some documentation in CHM\nformat) in the Contrib directory on the FTP site:\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib\n\nThe basic PCRE library consists entirely of code written in Standard C, and so\nshould compile successfully on any system that has a Standard C compiler and\nlibrary. The C++ wrapper functions are a separate issue (see below).\n\nThe PCRE distribution includes a \"configure\" file for use by the configure/make\n(autotools) build system, as found in many Unix-like environments. The README\nfile contains information about the options for \"configure\".\n\nThere is also support for CMake, which some users prefer, especially in Windows\nenvironments, though it can also be run in Unix-like environments. See the\nsection entitled \"Building PCRE on Windows with CMake\" below.\n\nVersions of config.h and pcre.h are distributed in the PCRE tarballs under the\nnames config.h.generic and pcre.h.generic. These are provided for those who\nbuild PCRE without using \"configure\" or CMake. If you use \"configure\" or CMake,\nthe .generic versions are not used.\n\n\nGENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY\n\nThe following are generic instructions for building the PCRE C library \"by\nhand\". If you are going to use CMake, this section does not apply to you; you\ncan skip ahead to the CMake section.\n\n (1) Copy or rename the file config.h.generic as config.h, and edit the macro\n     settings that it contains to whatever is appropriate for your environment.\n\n     In particular, you can alter the definition of the NEWLINE macro to\n     specify what character(s) you want to be interpreted as line terminators.\n     In an EBCDIC environment, you MUST change NEWLINE, because its default\n     value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15,\n     NL), though in some cases it may be 37 (0x25).\n\n     When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H\n     to your compiler so that config.h is included in the sources.\n\n     An alternative approach is not to edit config.h, but to use -D on the\n     compiler command line to make any changes that you need to the\n     configuration options. In this case -DHAVE_CONFIG_H must not be set.\n\n     NOTE: There have been occasions when the way in which certain parameters\n     in config.h are used has changed between releases. (In the configure/make\n     world, this is handled automatically.) When upgrading to a new release,\n     you are strongly advised to review config.h.generic before re-using what\n     you had previously.\n\n (2) Copy or rename the file pcre.h.generic as pcre.h.\n\n (3) EITHER:\n       Copy or rename file pcre_chartables.c.dist as pcre_chartables.c.\n\n     OR:\n       Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if\n       you have set up config.h), and then run it with the single argument\n       \"pcre_chartables.c\". This generates a set of standard character tables\n       and writes them to that file. The tables are generated using the default\n       C locale for your system. If you want to use a locale that is specified\n       by LC_xxx environment variables, add the -L option to the dftables\n       command. You must use this method if you are building on a system that\n       uses EBCDIC code.\n\n     The tables in pcre_chartables.c are defaults. The caller of PCRE can\n     specify alternative tables at run time.\n\n (4) Ensure that you have the following header files:\n\n       pcre_internal.h\n       ucp.h\n\n (5) For an 8-bit library, compile the following source files, setting\n     -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your\n     configuration, or else use other -D settings to change the configuration\n     as required.\n\n       pcre_byte_order.c\n       pcre_chartables.c\n       pcre_compile.c\n       pcre_config.c\n       pcre_dfa_exec.c\n       pcre_exec.c\n       pcre_fullinfo.c\n       pcre_get.c\n       pcre_globals.c\n       pcre_jit_compile.c\n       pcre_maketables.c\n       pcre_newline.c\n       pcre_ord2utf8.c\n       pcre_refcount.c\n       pcre_string_utils.c\n       pcre_study.c\n       pcre_tables.c\n       pcre_ucd.c\n       pcre_valid_utf8.c\n       pcre_version.c\n       pcre_xclass.c\n\n     Make sure that you include -I. in the compiler command (or equivalent for\n     an unusual compiler) so that all included PCRE header files are first\n     sought in the current directory. Otherwise you run the risk of picking up\n     a previously-installed file from somewhere else.\n\n     Note that you must still compile pcre_jit_compile.c, even if you have not\n     defined SUPPORT_JIT in config.h, because when JIT support is not\n     configured, dummy functions are compiled. When JIT support IS configured,\n     pcre_jit_compile.c #includes sources from the sljit subdirectory, where\n     there should be 16 files, all of whose names begin with \"sljit\".\n\n (6) Now link all the compiled code into an object library in whichever form\n     your system keeps such libraries. This is the basic PCRE C 8-bit library.\n     If your system has static and shared libraries, you may have to do this\n     once for each type.\n\n (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit\n     or 32-bit libraries) repeat steps 5-6 with the following files:\n\n       pcre16_byte_order.c\n       pcre16_chartables.c\n       pcre16_compile.c\n       pcre16_config.c\n       pcre16_dfa_exec.c\n       pcre16_exec.c\n       pcre16_fullinfo.c\n       pcre16_get.c\n       pcre16_globals.c\n       pcre16_jit_compile.c\n       pcre16_maketables.c\n       pcre16_newline.c\n       pcre16_ord2utf16.c\n       pcre16_refcount.c\n       pcre16_string_utils.c\n       pcre16_study.c\n       pcre16_tables.c\n       pcre16_ucd.c\n       pcre16_utf16_utils.c\n       pcre16_valid_utf16.c\n       pcre16_version.c\n       pcre16_xclass.c\n\n (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit\n     or 16-bit libraries) repeat steps 5-6 with the following files:\n\n       pcre32_byte_order.c\n       pcre32_chartables.c\n       pcre32_compile.c\n       pcre32_config.c\n       pcre32_dfa_exec.c\n       pcre32_exec.c\n       pcre32_fullinfo.c\n       pcre32_get.c\n       pcre32_globals.c\n       pcre32_jit_compile.c\n       pcre32_maketables.c\n       pcre32_newline.c\n       pcre32_ord2utf32.c\n       pcre32_refcount.c\n       pcre32_string_utils.c\n       pcre32_study.c\n       pcre32_tables.c\n       pcre32_ucd.c\n       pcre32_utf32_utils.c\n       pcre32_valid_utf32.c\n       pcre32_version.c\n       pcre32_xclass.c\n\n (9) If you want to build the POSIX wrapper functions (which apply only to the\n     8-bit library), ensure that you have the pcreposix.h file and then compile\n     pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result\n     (on its own) as the pcreposix library.\n\n(10) The pcretest program can be linked with any combination of the 8-bit,\n     16-bit and 32-bit libraries (depending on what you selected in config.h).\n     Compile pcretest.c and pcre_printint.c (again, don't forget\n     -DHAVE_CONFIG_H) and link them together with the appropriate library/ies.\n     If you compiled an 8-bit library, pcretest also needs the pcreposix\n     wrapper library unless you compiled it with -DNOPOSIX.\n\n(11) Run pcretest on the testinput files in the testdata directory, and check\n     that the output matches the corresponding testoutput files. There are\n     comments about what each test does in the section entitled \"Testing PCRE\"\n     in the README file. If you compiled more than one of the 8-bit, 16-bit and\n     32-bit libraries, you need to run pcretest with the -16 option to do\n     16-bit tests and with the -32 option to do 32-bit tests.\n\n     Some tests are relevant only when certain build-time options are selected.\n     For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run\n     if you have built PCRE without it. See the comments at the start of each\n     testinput file. If you have a suitable Unix-like shell, the RunTest script\n     will run the appropriate tests for you. The command \"RunTest list\" will\n     output a list of all the tests.\n\n     Note that the supplied files are in Unix format, with just LF characters\n     as line terminators. You may need to edit them to change this if your\n     system uses a different convention. If you are using Windows, you probably\n     should use the wintestinput3 file instead of testinput3 (and the\n     corresponding output file). This is a locale test; wintestinput3 sets the\n     locale to \"french\" rather than \"fr_FR\", and there some minor output\n     differences.\n\n(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested\n     by the testdata files. However, you might also like to build and run\n     the freestanding JIT test program, pcre_jit_test.c.\n\n(13) If you want to use the pcregrep command, compile and link pcregrep.c; it\n     uses only the basic 8-bit PCRE library (it does not need the pcreposix\n     library).\n\n\nTHE C++ WRAPPER FUNCTIONS\n\nThe PCRE distribution also contains some C++ wrapper functions and tests,\napplicable to the 8-bit library, which were contributed by Google Inc. On a\nsystem that can use \"configure\" and \"make\", the functions are automatically\nbuilt into a library called pcrecpp. It should be straightforward to compile\nthe .cc files manually on other systems. The files called xxx_unittest.cc are\ntest programs for each of the corresponding xxx.cc files.\n\n\nBUILDING FOR VIRTUAL PASCAL\n\nA script for building PCRE using Borland's C++ compiler for use with VPASCAL\nwas contributed by Alexander Tokarev. Stefan Weber updated the script and added\nadditional files. The following files in the distribution are for building PCRE\nfor use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas.\n\n\nSTACK SIZE IN WINDOWS ENVIRONMENTS\n\nThe default processor stack size of 1Mb in some Windows environments is too\nsmall for matching patterns that need much recursion. In particular, test 2 may\nfail because of this. Normally, running out of stack causes a crash, but there\nhave been cases where the test program has just died silently. See your linker\ndocumentation for how to increase stack size if you experience problems. The\nLinux default of 8Mb is a reasonable choice for the stack, though even that can\nbe too small for some pattern/subject combinations.\n\nPCRE has a compile configuration option to disable the use of stack for\nrecursion so that heap is used instead. However, pattern matching is\nsignificantly slower when this is done. There is more about stack usage in the\n\"pcrestack\" documentation.\n\n\nLINKING PROGRAMS IN WINDOWS ENVIRONMENTS\n\nIf you want to statically link a program against a PCRE library in the form of\na non-dll .a file, you must define PCRE_STATIC before including pcre.h or\npcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will\nbe declared __declspec(dllimport), with unwanted results.\n\n\nCALLING CONVENTIONS IN WINDOWS ENVIRONMENTS\n\nIt is possible to compile programs to use different calling conventions using\nMSVC. Search the web for \"calling conventions\" for more information. To make it\neasier to change the calling convention for the exported functions in the\nPCRE library, the macro PCRE_CALL_CONVENTION is present in all the external\ndefinitions. It can be set externally when compiling (e.g. in CFLAGS). If it is\nnot set, it defaults to empty; the default calling convention is then used\n(which is what is wanted most of the time).\n\n\nCOMMENTS ABOUT WIN32 BUILDS (see also \"BUILDING PCRE ON WINDOWS WITH CMAKE\")\n\nThere are two ways of building PCRE using the \"configure, make, make install\"\nparadigm on Windows systems: using MinGW or using Cygwin. These are not at all\nthe same thing; they are completely different from each other. There is also\nsupport for building using CMake, which some users find a more straightforward\nway of building PCRE under Windows.\n\nThe MinGW home page (http://www.mingw.org/) says this:\n\n  MinGW: A collection of freely available and freely distributable Windows\n  specific header files and import libraries combined with GNU toolsets that\n  allow one to produce native Windows programs that do not rely on any\n  3rd-party C runtime DLLs.\n\nThe Cygwin home page (http://www.cygwin.com/) says this:\n\n  Cygwin is a Linux-like environment for Windows. It consists of two parts:\n\n  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing\n    substantial Linux API functionality\n\n  . A collection of tools which provide Linux look and feel.\n\n  The Cygwin DLL currently works with all recent, commercially released x86 32\n  bit and 64 bit versions of Windows, with the exception of Windows CE.\n\nOn both MinGW and Cygwin, PCRE should build correctly using:\n\n  ./configure && make && make install\n\nThis should create two libraries called libpcre and libpcreposix, and, if you\nhave enabled building the C++ wrapper, a third one called libpcrecpp. These are\nindependent libraries: when you link with libpcreposix or libpcrecpp you must\nalso link with libpcre, which contains the basic functions. (Some earlier\nreleases of PCRE included the basic libpcre functions in libpcreposix. This no\nlonger happens.)\n\nA user submitted a special-purpose patch that makes it easy to create\n\"pcre.dll\" under mingw32 using the \"msys\" environment. It provides \"pcre.dll\"\nas a special target. If you use this target, no other files are built, and in\nparticular, the pcretest and pcregrep programs are not built. An example of how\nthis might be used is:\n\n  ./configure --enable-utf --disable-cpp CFLAGS=\"-03 -s\"; make pcre.dll\n\nUsing Cygwin's compiler generates libraries and executables that depend on\ncygwin1.dll. If a library that is generated this way is distributed,\ncygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL\nlicence, this forces not only PCRE to be under the GPL, but also the entire\napplication. A distributor who wants to keep their own code proprietary must\npurchase an appropriate Cygwin licence.\n\nMinGW has no such restrictions. The MinGW compiler generates a library or\nexecutable that can run standalone on Windows without any third party dll or\nlicensing issues.\n\nBut there is more complication:\n\nIf a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is\nto tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a\nfront end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's\ngcc and MinGW's gcc). So, a user can:\n\n. Build native binaries by using MinGW or by getting Cygwin and using\n  -mno-cygwin.\n\n. Build binaries that depend on cygwin1.dll by using Cygwin with the normal\n  compiler flags.\n\nThe test files that are supplied with PCRE are in UNIX format, with LF\ncharacters as line terminators. Unless your PCRE library uses a default newline\noption that includes LF as a valid newline, it may be necessary to change the\nline terminators in the test files to get some of the tests to work.\n\n\nBUILDING PCRE ON WINDOWS WITH CMAKE\n\nCMake is an alternative configuration facility that can be used instead of\n\"configure\". CMake creates project files (make files, solution files, etc.)\ntailored to numerous development environments, including Visual Studio,\nBorland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no\nspaces in the names for your CMake installation and your PCRE source and build\ndirectories.\n\nThe following instructions were contributed by a PCRE user. If they are not\nfollowed exactly, errors may occur. In the event that errors do occur, it is\nrecommended that you delete the CMake cache before attempting to repeat the\nCMake build process. In the CMake GUI, the cache can be deleted by selecting\n\"File > Delete Cache\".\n\n1.  Install the latest CMake version available from http://www.cmake.org/, and\n    ensure that cmake\\bin is on your path.\n\n2.  Unzip (retaining folder structure) the PCRE source tree into a source\n    directory such as C:\\pcre. You should ensure your local date and time\n    is not earlier than the file dates in your source dir if the release is\n    very new.\n\n3.  Create a new, empty build directory, preferably a subdirectory of the\n    source dir. For example, C:\\pcre\\pcre-xx\\build.\n\n4.  Run cmake-gui from the Shell envirornment of your build tool, for example,\n    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try\n    to start Cmake from the Windows Start menu, as this can lead to errors.\n\n5.  Enter C:\\pcre\\pcre-xx and C:\\pcre\\pcre-xx\\build for the source and build\n    directories, respectively.\n\n6.  Hit the \"Configure\" button.\n\n7.  Select the particular IDE / build tool that you are using (Visual\n    Studio, MSYS makefiles, MinGW makefiles, etc.)\n\n8.  The GUI will then list several configuration options. This is where\n    you can enable UTF-8 support or other PCRE optional features.\n\n9.  Hit \"Configure\" again. The adjacent \"Generate\" button should now be\n    active.\n\n10. Hit \"Generate\".\n\n11. The build directory should now contain a usable build system, be it a\n    solution file for Visual Studio, makefiles for MinGW, etc. Exit from\n    cmake-gui and use the generated build system with your compiler or IDE.\n    E.g., for MinGW you can run \"make\", or for Visual Studio, open the PCRE\n    solution, select the desired configuration (Debug, or Release, etc.) and\n    build the ALL_BUILD project.\n\n12. If during configuration with cmake-gui you've elected to build the test\n    programs, you can execute them by building the test project. E.g., for\n    MinGW: \"make test\"; for Visual Studio build the RUN_TESTS project. The\n    most recent build configuration is targeted by the tests. A summary of\n    test results is presented. Complete test output is subsequently\n    available for review in Testing\\Temporary under your build dir.\n\n\nUSE OF RELATIVE PATHS WITH CMAKE ON WINDOWS\n\nA PCRE user comments as follows: I thought that others may want to know the\ncurrent state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is:\n\n-- AdditionalIncludeDirectories is only partially modified (only the\n   first path - see below)\n-- Only some of the contained file paths are modified - shown below for\n   pcre.vcproj\n-- It properly modifies\n\nI am sure CMake people can fix that if they want to. Until then one will\nneed to replace existing absolute paths in project files with relative\npaths manually (e.g. from VS) - relative to project file location. I did\njust that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big\ndeal.\n\nAdditionalIncludeDirectories=\"E:\\builds\\pcre\\build;E:\\builds\\pcre\\pcre-7.5;\"\nAdditionalIncludeDirectories=\".;E:\\builds\\pcre\\pcre-7.5;\"\n\nRelativePath=\"pcre.h\"\nRelativePath=\"pcre_chartables.c\"\nRelativePath=\"pcre_chartables.c.rule\"\n\n\nTESTING WITH RUNTEST.BAT\n\nIf configured with CMake, building the test project (\"make test\" or building\nALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending\non your configuration options, possibly other test programs) in the build\ndirectory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths.\n\nFor manual testing with RunTest.bat, provided the build dir is a subdirectory\nof the source directory: Open command shell window. Chdir to the location\nof your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with\n\"..\\RunTest.Bat\" or \"..\\..\\RunTest.bat\" as appropriate.\n\nTo run only a particular test with RunTest.Bat provide a test number argument.\n\nOtherwise:\n\n1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe\n   have been created.\n\n2. Edit RunTest.bat to indentify the full or relative location of\n   the pcre source (wherein which the testdata folder resides), e.g.:\n\n   set srcdir=C:\\pcre\\pcre-8.20\n\n3. In a Windows command environment, chdir to the location of your bat and\n   exe programs.\n\n4. Run RunTest.bat. Test outputs will automatically be compared to expected\n   results, and discrepancies will be identified in the console output.\n\nTo independently test the just-in-time compiler, run pcre_jit_test.exe.\nTo test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and\npcre_scanner_unittest.exe.\n\n\nBUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x\n\nVincent Richomme sent a zip archive of files to help with this process. They\ncan be found in the file \"pcre-vsbuild.zip\" in the Contrib directory of the FTP\nsite.\n\n\nBUILDING UNDER WINDOWS WITH BCC5.5\n\nMichael Roy sent these comments about building PCRE under Windows with BCC5.5:\n\nSome of the core BCC libraries have a version of PCRE from 1998 built in, which\ncan lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version\nmismatch. I'm including an easy workaround below, if you'd like to include it\nin the non-unix instructions:\n\nWhen linking a project with BCC5.5, pcre.lib must be included before any of the\nlibraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line.\n\n\nBUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER\n\nA PCRE user sent these comments about this environment (see also the comment\nfrom another user that follows them):\n\nThe XE versions of C++ Builder come with a RegularExpressionsCore class which\ncontain a version of TPerlRegEx. However, direct use of the C PCRE library may\nbe desirable.\n\nThe default makevp.bat, however, supplied with PCRE builds a version of PCRE\nthat is not usable with any version of C++ Builder because the compiler ships\nwith an embedded version of PCRE, version 2.01 from 1998! [See also the note\nabout BCC5.5 above.] If you want to use PCRE you'll need to rename the\nfunctions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just\nuse the 16 bit versions. I'm using std::wstring everywhere anyway. Since the\nembedded version of PCRE does not have the 16 bit function names, there is no\nconflict.\n\nBuilding PCRE using a C++ Builder static library project file (recommended):\n\n1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder\noriginal include path.\n\n2. Download PCRE from pcre.org and extract to a directory.\n\n3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to\npcre.h, and config.h.generic to config.h.\n\n4. Edit pcre.h and pcre_config.c so that they include config.h.\n\n5. Edit config.h like so:\n\nComment out the following lines:\n#define PACKAGE \"pcre\"\n#define PACKAGE_BUGREPORT \"\"\n#define PACKAGE_NAME \"PCRE\"\n#define PACKAGE_STRING \"PCRE 8.32\"\n#define PACKAGE_TARNAME \"pcre\"\n#define PACKAGE_URL \"\"\n#define PACKAGE_VERSION \"8.32\"\n\nAdd the following lines:\n#ifndef SUPPORT_UTF\n#define SUPPORT_UTF 100 // any value is fine\n#endif\n\n#ifndef SUPPORT_UCP\n#define SUPPORT_UCP 101 // any value is fine\n#endif\n\n#ifndef SUPPORT_UCP\n#define SUPPORT_PCRE16 102 // any value is fine\n#endif\n\n#ifndef SUPPORT_UTF8\n#define SUPPORT_UTF8 103 // any value is fine\n#endif\n\n6. Build a C++ Builder project using the IDE. Go to File / New / Other and\nchoose Static Library. You can name it pcre.cbproj or whatever. Now set your\npaths by going to Project / Options. Set the Include path. Do this from the\n\"Base\" option to apply to both Release and Debug builds. Now add the following\nfiles to the project:\n\npcre.h\npcre16_byte_order.c\npcre16_chartables.c\npcre16_compile.c\npcre16_config.c\npcre16_dfa_exec.c\npcre16_exec.c\npcre16_fullinfo.c\npcre16_get.c\npcre16_globals.c\npcre16_maketables.c\npcre16_newline.c\npcre16_ord2utf16.c\npcre16_printint.c\npcre16_refcount.c\npcre16_string_utils.c\npcre16_study.c\npcre16_tables.c\npcre16_ucd.c\npcre16_utf16_utils.c\npcre16_valid_utf16.c\npcre16_version.c\npcre16_xclass.c\n\n//Optional\npcre_version.c\n\n7. After compiling the .lib file, copy the .lib and header files to a project\nyou want to use PCRE with. Enjoy.\n\nOptional ... Building PCRE using the makevp.bat file:\n\n1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit\nversions.\n\n2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat.\n\nAnother PCRE user added this comment:\n\nAnother approach I successfully used for some years with BCB 5 and 6 was to\nmake sure that include and library paths of PCRE are configured before the\ndefault paths of the IDE in the dialogs where one can manage those paths.\nAfterwards one can open the project files using a text editor and manually add\nthe self created library for pcre itself, pcrecpp doesn't ship with the IDE, in\nthe library nodes where the IDE manages its own libraries to link against in\nfront of the IDE-own libraries. This way one can use the default PCRE function\nnames without getting access violations on runtime.\n\n  <ALLLIB value=\"libpcre.lib $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib\"/>\n\n\nBUILDING PCRE ON OPENVMS\n\nStephen Hoffman sent the following, in December 2012:\n\n\"Here <http://labs.hoffmanlabs.com/node/1847> is a very short write-up on the\nOpenVMS port and here\n\n<http://labs.hoffmanlabs.com/labsnotes/pcre-vms-8_32.zip>\n\nis a zip with the OpenVMS files, and with one modified testing-related PCRE\nfile.\" This is a port of PCRE 8.32.\n\nEarlier, Dan Mooney sent the following comments about building PCRE on OpenVMS.\nThey relate to an older version of PCRE that used fewer source files, so the\nexact commands will need changing. See the current list of source files above.\n\n\"It was quite easy to compile and link the library. I don't have a formal\nmake file but the attached file [reproduced below] contains the OpenVMS DCL\ncommands I used to build the library. I had to add #define\nPOSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere.\n\nThe library was built on:\nO/S: HP OpenVMS v7.3-1\nCompiler: Compaq C v6.5-001-48BCD\nLinker: vA13-01\n\nThe test results did not match 100% due to the issues you mention in your\ndocumentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I\nmodified some of the character tables temporarily and was able to get the\nresults to match. Tests using the fr locale did not match since I don't have\nthat locale loaded. The study size was always reported to be 3 less than the\nvalue in the standard test output files.\"\n\n=========================\n$! This DCL procedure builds PCRE on OpenVMS\n$!\n$! I followed the instructions in the non-unix-use file in the distribution.\n$!\n$ COMPILE == \"CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES\n$ COMPILE DFTABLES.C\n$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ\n$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C\n$ COMPILE MAKETABLES.C\n$ COMPILE GET.C\n$ COMPILE STUDY.C\n$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol\n$! did not seem to be defined anywhere.\n$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support.\n$ COMPILE PCRE.C\n$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ\n$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol\n$! did not seem to be defined anywhere.\n$ COMPILE PCREPOSIX.C\n$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ\n$ COMPILE PCRETEST.C\n$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB\n$! C programs that want access to command line arguments must be\n$! defined as a symbol\n$ PCRETEST :== \"$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE\"\n$! Arguments must be enclosed in quotes.\n$ PCRETEST \"-C\"\n$! Test results:\n$!\n$!   The test results did not match 100%. The functions isprint(), iscntrl(),\n$!   isgraph() and ispunct() on OpenVMS must not produce the same results\n$!   as the system that built the test output files provided with the\n$!   distribution.\n$!\n$!   The study size did not match and was always 3 less on OpenVMS.\n$!\n$!   Locale could not be set to fr\n$!\n=========================\n\n\nBUILDING PCRE ON STRATUS OPENVOS\n\nThese notes on the port of PCRE to VOS (lightly edited) were supplied by\nAshutosh Warikoo, whose email address has the local part awarikoo and the\ndomain nse.co.in. The port was for version 7.9 in August 2009.\n\n1.   Building PCRE\n\nI built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any\nproblems. I used the following packages to build PCRE:\n\n  ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz\n\nPlease read and follow the instructions that come with these packages. To start\nthe build of pcre, from the root of the package type:\n\n  ./build.sh\n\n2. Installing PCRE\n\nOnce you have successfully built PCRE, login to the SysAdmin group, switch to\nthe root user, and type\n\n  [ !create_dir (master_disk)>usr   --if needed ]\n  [ !create_dir (master_disk)>usr>local   --if needed ]\n    !gmake install\n\nThis installs PCRE and its man pages into /usr/local. You can add\n(master_disk)>usr>local>bin to your command search paths, or if you are in\nBASH, add /usr/local/bin to the PATH environment variable.\n\n4. Restrictions\n\nThis port requires readline library optionally. However during the build I\nfaced some yet unexplored errors while linking with readline. As it was an\noptional component I chose to disable it.\n\n5. Known Problems\n\nI ran the test suite, but you will have to be your own judge of whether this\ncommand, and this port, suits your purposes. If you find any problems that\nappear to be related to the port itself, please let me know. Please see the\nbuild.log file in the root of the package also.\n\n\nBUILDING PCRE ON NATIVE Z/OS AND Z/VM\n\nz/OS and z/VM are operating systems for mainframe computers, produced by IBM.\nThe character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and\napplications can be supported through UNIX System Services, and in such an\nenvironment PCRE can be built in the same way as in other systems. However, in\nnative z/OS (without UNIX System Services) and in z/VM, special ports are\nrequired. PCRE1 version 8.39 is available in file 882 on this site:\n\n  http://www.cbttape.org\n\nEverything, source and executable, is in EBCDIC and native z/OS file formats.\nHowever, this software is not maintained and will not be upgraded. If you are\nnew to PCRE you should be looking at PCRE2 (version 10.30 or later).\n\n===============================\nLast Updated: 13 September 2017\n===============================\n"
  },
  {
    "path": "src/pcre/NON-UNIX-USE",
    "content": "Compiling PCRE on non-Unix systems\n----------------------------------\n\nThis has been renamed to better reflect its contents. Please see the file\nNON-AUTOTOOLS-BUILD for details of how to build PCRE without using autotools.\n\n####\n"
  },
  {
    "path": "src/pcre/PrepareRelease",
    "content": "#/bin/sh\n\n# Script to prepare the files for building a PCRE release. It does some\n# processing of the documentation, detrails files, and creates pcre.h.generic\n# and config.h.generic (for use by builders who can't run ./configure).\n\n# You must run this script before runnning \"make dist\". If its first argument\n# is \"doc\", it stops after preparing the documentation. There are no other\n# arguments. The script makes use of the following files:\n\n# 132html     A Perl script that converts a .1 or .3 man page into HTML. It\n#             \"knows\" the relevant troff constructs that are used in the PCRE\n#             man pages.\n\n# CheckMan    A Perl script that checks man pages for typos in the mark up.\n\n# CleanTxt    A Perl script that cleans up the output of \"nroff -man\" by\n#             removing backspaces and other redundant text so as to produce\n#             a readable .txt file.\n\n# Detrail     A Perl script that removes trailing spaces from files.\n\n# doc/index.html.src\n#             A file that is copied as index.html into the doc/html directory\n#             when the HTML documentation is built. It works like this so that\n#             doc/html can be deleted and re-created from scratch.\n\n# README & NON-AUTOTOOLS-BUILD\n#             These files are copied into the doc/html directory, with .txt\n#             extensions so that they can by hyperlinked from the HTML \n#             documentation, because some people just go to the HTML without\n#             looking for text files.\n\n\n# First, sort out the documentation. Remove pcredemo.3 first because it won't\n# pass the markup check (it is created below, using markup that none of the\n# other pages use).\n\ncd doc\necho Processing documentation\n\n/bin/rm -f pcredemo.3\n\n# Check the remaining man pages\n\nperl ../CheckMan *.1 *.3\nif [ $? != 0 ] ; then exit 1; fi\n\n# Make Text form of the documentation. It needs some mangling to make it\n# tidy for online reading. Concatenate all the .3 stuff, but omit the\n# individual function pages.\n\ncat <<End >pcre.txt\n-----------------------------------------------------------------------------\nThis file contains a concatenation of the PCRE man pages, converted to plain\ntext format for ease of searching with a text editor, or for use on systems\nthat do not have a man page processor. The small individual files that give\nsynopses of each function in the library have not been included. Neither has\nthe pcredemo program. There are separate text files for the pcregrep and\npcretest commands.\n-----------------------------------------------------------------------------\n\n\nEnd\n\necho \"Making pcre.txt\"\nfor file in pcre pcre16 pcre32 pcrebuild pcrematching pcreapi pcrecallout \\\n            pcrecompat pcrepattern pcresyntax pcreunicode pcrejit pcrepartial \\\n            pcreprecompile pcreperform pcreposix pcrecpp pcresample \\\n            pcrelimits pcrestack ; do\n  echo \"  Processing $file.3\"\n  nroff -c -man $file.3 >$file.rawtxt\n  perl ../CleanTxt <$file.rawtxt >>pcre.txt\n  /bin/rm $file.rawtxt\n  echo \"------------------------------------------------------------------------------\" >>pcre.txt\n  if [ \"$file\" != \"pcresample\" ] ; then\n    echo \" \" >>pcre.txt\n    echo \" \" >>pcre.txt\n  fi\ndone\n\n# The three commands\nfor file in pcretest pcregrep pcre-config ; do\n  echo Making $file.txt\n  nroff -c -man $file.1 >$file.rawtxt\n  perl ../CleanTxt <$file.rawtxt >$file.txt\n  /bin/rm $file.rawtxt\ndone\n\n\n# Make pcredemo.3 from the pcredemo.c source file\n\necho \"Making pcredemo.3\"\nperl <<\"END\" >pcredemo.3\n  open(IN, \"../pcredemo.c\") || die \"Failed to open pcredemo.c\\n\";\n  open(OUT, \">pcredemo.3\") || die \"Failed to open pcredemo.3\\n\";\n  print OUT \".\\\\\\\" Start example.\\n\" .\n            \".de EX\\n\" .\n            \".  nr mE \\\\\\\\n(.f\\n\" .\n            \".  nf\\n\" .\n            \".  nh\\n\" .\n            \".  ft CW\\n\" .\n            \"..\\n\" .\n            \".\\n\" .\n            \".\\n\" .\n            \".\\\\\\\" End example.\\n\" .\n            \".de EE\\n\" .\n            \".  ft \\\\\\\\n(mE\\n\" .\n            \".  fi\\n\" .\n            \".  hy \\\\\\\\n(HY\\n\" .\n            \"..\\n\" .\n            \".\\n\" .\n            \".EX\\n\" ;\n  while (<IN>)\n    {\n    s/\\\\/\\\\e/g;\n    print OUT;\n    }\n  print OUT \".EE\\n\";\n  close(IN);\n  close(OUT);\nEND\nif [ $? != 0 ] ; then exit 1; fi\n\n\n# Make HTML form of the documentation.\n\necho \"Making HTML documentation\"\n/bin/rm html/*\ncp index.html.src html/index.html\ncp ../README html/README.txt\ncp ../NON-AUTOTOOLS-BUILD html/NON-AUTOTOOLS-BUILD.txt\n\nfor file in *.1 ; do\n  base=`basename $file .1`\n  echo \"  Making $base.html\"\n  perl ../132html -toc $base <$file >html/$base.html\ndone\n\n# Exclude table of contents for function summaries. It seems that expr\n# forces an anchored regex. Also exclude them for small pages that have\n# only one section.\n\nfor file in *.3 ; do\n  base=`basename $file .3`\n  toc=-toc\n  if [ `expr $base : '.*_'` -ne 0 ] ; then toc=\"\" ; fi\n  if [ \"$base\" = \"pcresample\" ]  || \\\n     [ \"$base\" = \"pcrestack\" ]   || \\\n     [ \"$base\" = \"pcrecompat\" ]  || \\\n     [ \"$base\" = \"pcrelimits\" ]  || \\\n     [ \"$base\" = \"pcreperform\" ] || \\\n     [ \"$base\" = \"pcreunicode\" ] ; then\n    toc=\"\"\n  fi\n  echo \"  Making $base.html\"\n  perl ../132html $toc $base <$file >html/$base.html\n  if [ $? != 0 ] ; then exit 1; fi\ndone\n\n# End of documentation processing; stop if only documentation required.\n\ncd ..\necho Documentation done\nif [ \"$1\" = \"doc\" ] ; then exit; fi\n\n# These files are detrailed; do not detrail the test data because there may be\n# significant trailing spaces. Do not detrail RunTest.bat, because it has CRLF\n# line endings and the detrail script removes all trailing white space. The\n# configure files are also omitted from the detrailing. We don't bother with\n# those pcre[16|32]_xx files that just define COMPILE_PCRE16 and then #include the\n# common file, because they aren't going to change.\n\nfiles=\"\\\n  Makefile.am \\\n  Makefile.in \\\n  configure.ac \\\n  README \\\n  LICENCE \\\n  COPYING \\\n  AUTHORS \\\n  NEWS \\\n  NON-UNIX-USE \\\n  NON-AUTOTOOLS-BUILD \\\n  INSTALL \\\n  132html \\\n  CleanTxt \\\n  Detrail \\\n  ChangeLog \\\n  CMakeLists.txt \\\n  RunGrepTest \\\n  RunTest \\\n  pcre-config.in \\\n  libpcre.pc.in \\\n  libpcre16.pc.in \\\n  libpcre32.pc.in \\\n  libpcreposix.pc.in \\\n  libpcrecpp.pc.in \\\n  config.h.in \\\n  pcre_chartables.c.dist \\\n  pcredemo.c \\\n  pcregrep.c \\\n  pcretest.c \\\n  dftables.c \\\n  pcreposix.c \\\n  pcreposix.h \\\n  pcre.h.in \\\n  pcre_internal.h \\\n  pcre_byte_order.c \\\n  pcre_compile.c \\\n  pcre_config.c \\\n  pcre_dfa_exec.c \\\n  pcre_exec.c \\\n  pcre_fullinfo.c \\\n  pcre_get.c \\\n  pcre_globals.c \\\n  pcre_jit_compile.c \\\n  pcre_jit_test.c \\\n  pcre_maketables.c \\\n  pcre_newline.c \\\n  pcre_ord2utf8.c \\\n  pcre16_ord2utf16.c \\\n  pcre32_ord2utf32.c \\\n  pcre_printint.c \\\n  pcre_refcount.c \\\n  pcre_string_utils.c \\\n  pcre_study.c \\\n  pcre_tables.c \\\n  pcre_valid_utf8.c \\\n  pcre_version.c \\\n  pcre_xclass.c \\\n  pcre16_utf16_utils.c \\\n  pcre32_utf32_utils.c \\\n  pcre16_valid_utf16.c \\\n  pcre32_valid_utf32.c \\\n  pcre_scanner.cc \\\n  pcre_scanner.h \\\n  pcre_scanner_unittest.cc \\\n  pcrecpp.cc \\\n  pcrecpp.h \\\n  pcrecpparg.h.in \\\n  pcrecpp_unittest.cc \\\n  pcre_stringpiece.cc \\\n  pcre_stringpiece.h.in \\\n  pcre_stringpiece_unittest.cc \\\n  perltest.pl \\\n  ucp.h \\\n  makevp.bat \\\n  pcre.def \\\n  libpcre.def \\\n  libpcreposix.def\"\n\necho Detrailing\nperl ./Detrail $files doc/p* doc/html/*\n\necho Done\n\n#End\n"
  },
  {
    "path": "src/pcre/README",
    "content": "README file for PCRE (Perl-compatible regular expression library)\n-----------------------------------------------------------------\n\nNOTE: This set of files relates to PCRE releases that use the original API,\nwith library names libpcre, libpcre16, and libpcre32. January 2015 saw the\nfirst release of a new API, known as PCRE2, with release numbers starting at\n10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old\nlibraries (now called PCRE1) are still being maintained for bug fixes, but\nthere will be no new development. New projects are advised to use the new PCRE2\nlibraries.\n\n\nThe latest release of PCRE1 is always available in three alternative formats\nfrom:\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip\n\nThere is a mailing list for discussion about the development of PCRE at\npcre-dev@exim.org. You can access the archives and subscribe or manage your\nsubscription here:\n\n   https://lists.exim.org/mailman/listinfo/pcre-dev\n\nPlease read the NEWS file if you are upgrading from a previous release.\nThe contents of this README file are:\n\n  The PCRE APIs\n  Documentation for PCRE\n  Contributions by users of PCRE\n  Building PCRE on non-Unix-like systems\n  Building PCRE without using autotools\n  Building PCRE using autotools\n  Retrieving configuration information\n  Shared libraries\n  Cross-compiling using autotools\n  Using HP's ANSI C++ compiler (aCC)\n  Compiling in Tru64 using native compilers\n  Using Sun's compilers for Solaris\n  Using PCRE from MySQL\n  Making new tarballs\n  Testing PCRE\n  Character tables\n  File manifest\n\n\nThe PCRE APIs\n-------------\n\nPCRE is written in C, and it has its own API. There are three sets of\nfunctions, one for the 8-bit library, which processes strings of bytes, one for\nthe 16-bit library, which processes strings of 16-bit values, and one for the\n32-bit library, which processes strings of 32-bit values. The distribution also\nincludes a set of C++ wrapper functions (see the pcrecpp man page for details),\ncourtesy of Google Inc., which can be used to call the 8-bit PCRE library from\nC++. Other C++ wrappers have been created from time to time. See, for example:\nhttps://github.com/YasserAsmi/regexp, which aims to be simple and similar in\nstyle to the C API.\n\nThe distribution also contains a set of C wrapper functions (again, just for\nthe 8-bit library) that are based on the POSIX regular expression API (see the\npcreposix man page). These end up in the library called libpcreposix. Note that\nthis just provides a POSIX calling interface to PCRE; the regular expressions\nthemselves still follow Perl syntax and semantics. The POSIX API is restricted,\nand does not give full access to all of PCRE's facilities.\n\nThe header file for the POSIX-style functions is called pcreposix.h. The\nofficial POSIX name is regex.h, but I did not want to risk possible problems\nwith existing files of that name by distributing it that way. To use PCRE with\nan existing program that uses the POSIX API, pcreposix.h will have to be\nrenamed or pointed at by a link.\n\nIf you are using the POSIX interface to PCRE and there is already a POSIX regex\nlibrary installed on your system, as well as worrying about the regex.h header\nfile (as mentioned above), you must also take care when linking programs to\nensure that they link with PCRE's libpcreposix library. Otherwise they may pick\nup the POSIX functions of the same name from the other library.\n\nOne way of avoiding this confusion is to compile PCRE with the addition of\n-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the\ncompiler flags (CFLAGS if you are using \"configure\" -- see below). This has the\neffect of renaming the functions so that the names no longer clash. Of course,\nyou have to do the same thing for your applications, or write them using the\nnew names.\n\n\nDocumentation for PCRE\n----------------------\n\nIf you install PCRE in the normal way on a Unix-like system, you will end up\nwith a set of man pages whose names all start with \"pcre\". The one that is just\ncalled \"pcre\" lists all the others. In addition to these man pages, the PCRE\ndocumentation is supplied in two other forms:\n\n  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and\n     doc/pcretest.txt in the source distribution. The first of these is a\n     concatenation of the text forms of all the section 3 man pages except\n     the listing of pcredemo.c and those that summarize individual functions.\n     The other two are the text forms of the section 1 man pages for the\n     pcregrep and pcretest commands. These text forms are provided for ease of\n     scanning with text editors or similar tools. They are installed in\n     <prefix>/share/doc/pcre, where <prefix> is the installation prefix\n     (defaulting to /usr/local).\n\n  2. A set of files containing all the documentation in HTML form, hyperlinked\n     in various ways, and rooted in a file called index.html, is distributed in\n     doc/html and installed in <prefix>/share/doc/pcre/html.\n\nUsers of PCRE have contributed files containing the documentation for various\nreleases in CHM format. These can be found in the Contrib directory of the FTP\nsite (see next section).\n\n\nContributions by users of PCRE\n------------------------------\n\nYou can find contributions from PCRE users in the directory\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib\n\nThere is a README file giving brief descriptions of what they are. Some are\ncomplete in themselves; others are pointers to URLs containing relevant files.\nSome of this material is likely to be well out-of-date. Several of the earlier\ncontributions provided support for compiling PCRE on various flavours of\nWindows (I myself do not use Windows). Nowadays there is more Windows support\nin the standard distribution, so these contibutions have been archived.\n\nA PCRE user maintains downloadable Windows binaries of the pcregrep and\npcretest programs here:\n\n  http://www.rexegg.com/pcregrep-pcretest.html\n\n\nBuilding PCRE on non-Unix-like systems\n--------------------------------------\n\nFor a non-Unix-like system, please read the comments in the file\nNON-AUTOTOOLS-BUILD, though if your system supports the use of \"configure\" and\n\"make\" you may be able to build PCRE using autotools in the same way as for\nmany Unix-like systems.\n\nPCRE can also be configured using the GUI facility provided by CMake's\ncmake-gui command. This creates Makefiles, solution files, etc. The file\nNON-AUTOTOOLS-BUILD has information about CMake.\n\nPCRE has been compiled on many different operating systems. It should be\nstraightforward to build PCRE on any system that has a Standard C compiler and\nlibrary, because it uses only Standard C functions.\n\n\nBuilding PCRE without using autotools\n-------------------------------------\n\nThe use of autotools (in particular, libtool) is problematic in some\nenvironments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD\nfile for ways of building PCRE without using autotools.\n\n\nBuilding PCRE using autotools\n-----------------------------\n\nIf you are using HP's ANSI C++ compiler (aCC), please see the special note\nin the section entitled \"Using HP's ANSI C++ compiler (aCC)\" below.\n\nThe following instructions assume the use of the widely used \"configure; make;\nmake install\" (autotools) process.\n\nTo build PCRE on system that supports autotools, first run the \"configure\"\ncommand from the PCRE distribution directory, with your current directory set\nto the directory where you want the files to be created. This command is a\nstandard GNU \"autoconf\" configuration script, for which generic instructions\nare supplied in the file INSTALL.\n\nMost commonly, people build PCRE within its own distribution directory, and in\nthis case, on many systems, just running \"./configure\" is sufficient. However,\nthe usual methods of changing standard defaults are available. For example:\n\nCFLAGS='-O2 -Wall' ./configure --prefix=/opt/local\n\nThis command specifies that the C compiler should be run with the flags '-O2\n-Wall' instead of the default, and that \"make install\" should install PCRE\nunder /opt/local instead of the default /usr/local.\n\nIf you want to build in a different directory, just run \"configure\" with that\ndirectory as current. For example, suppose you have unpacked the PCRE source\ninto /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:\n\ncd /build/pcre/pcre-xxx\n/source/pcre/pcre-xxx/configure\n\nPCRE is written in C and is normally compiled as a C library. However, it is\npossible to build it as a C++ library, though the provided building apparatus\ndoes not have any features to support this.\n\nThere are some optional features that can be included or omitted from the PCRE\nlibrary. They are also documented in the pcrebuild man page.\n\n. By default, both shared and static libraries are built. You can change this\n  by adding one of these options to the \"configure\" command:\n\n  --disable-shared\n  --disable-static\n\n  (See also \"Shared libraries on Unix-like systems\" below.)\n\n. By default, only the 8-bit library is built. If you add --enable-pcre16 to\n  the \"configure\" command, the 16-bit library is also built. If you add\n  --enable-pcre32 to the \"configure\" command, the 32-bit library is also built.\n  If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable\n  building the 8-bit library.\n\n. If you are building the 8-bit library and want to suppress the building of\n  the C++ wrapper library, you can add --disable-cpp to the \"configure\"\n  command. Otherwise, when \"configure\" is run without --disable-pcre8, it will\n  try to find a C++ compiler and C++ header files, and if it succeeds, it will\n  try to build the C++ wrapper.\n\n. If you want to include support for just-in-time compiling, which can give\n  large performance improvements on certain platforms, add --enable-jit to the\n  \"configure\" command. This support is available only for certain hardware\n  architectures. If you try to enable it on an unsupported architecture, there\n  will be a compile time error.\n\n. When JIT support is enabled, pcregrep automatically makes use of it, unless\n  you add --disable-pcregrep-jit to the \"configure\" command.\n\n. If you want to make use of the support for UTF-8 Unicode character strings in\n  the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library,\n  or UTF-32 Unicode character strings in the 32-bit library, you must add\n  --enable-utf to the \"configure\" command. Without it, the code for handling\n  UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even\n  when --enable-utf is included, the use of a UTF encoding still has to be\n  enabled by an option at run time. When PCRE is compiled with this option, its\n  input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC\n  platforms. It is not possible to use both --enable-utf and --enable-ebcdic at\n  the same time.\n\n. There are no separate options for enabling UTF-8, UTF-16 and UTF-32\n  independently because that would allow ridiculous settings such as requesting\n  UTF-16 support while building only the 8-bit library. However, the option\n  --enable-utf8 is retained for backwards compatibility with earlier releases\n  that did not support 16-bit or 32-bit character strings. It is synonymous with\n  --enable-utf. It is not possible to configure one library with UTF support\n  and the other without in the same configuration.\n\n. If, in addition to support for UTF-8/16/32 character strings, you want to\n  include support for the \\P, \\p, and \\X sequences that recognize Unicode\n  character properties, you must add --enable-unicode-properties to the\n  \"configure\" command. This adds about 30K to the size of the library (in the\n  form of a property table); only the basic two-letter properties such as Lu\n  are supported.\n\n. You can build PCRE to recognize either CR or LF or the sequence CRLF or any\n  of the preceding, or any of the Unicode newline sequences as indicating the\n  end of a line. Whatever you specify at build time is the default; the caller\n  of PCRE can change the selection at run time. The default newline indicator\n  is a single LF character (the Unix standard). You can specify the default\n  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf\n  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or\n  --enable-newline-is-any to the \"configure\" command, respectively.\n\n  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of\n  the standard tests will fail, because the lines in the test files end with\n  LF. Even if the files are edited to change the line endings, there are likely\n  to be some failures. With --enable-newline-is-anycrlf or\n  --enable-newline-is-any, many tests should succeed, but there may be some\n  failures.\n\n. By default, the sequence \\R in a pattern matches any Unicode line ending\n  sequence. This is independent of the option specifying what PCRE considers to\n  be the end of a line (see above). However, the caller of PCRE can restrict \\R\n  to match only CR, LF, or CRLF. You can make this the default by adding\n  --enable-bsr-anycrlf to the \"configure\" command (bsr = \"backslash R\").\n\n. When called via the POSIX interface, PCRE uses malloc() to get additional\n  storage for processing capturing parentheses if there are more than 10 of\n  them in a pattern. You can increase this threshold by setting, for example,\n\n  --with-posix-malloc-threshold=20\n\n  on the \"configure\" command.\n\n. PCRE has a counter that limits the depth of nesting of parentheses in a\n  pattern. This limits the amount of system stack that a pattern uses when it\n  is compiled. The default is 250, but you can change it by setting, for\n  example,\n\n  --with-parens-nest-limit=500\n\n. PCRE has a counter that can be set to limit the amount of resources it uses\n  when matching a pattern. If the limit is exceeded during a match, the match\n  fails. The default is ten million. You can change the default by setting, for\n  example,\n\n  --with-match-limit=500000\n\n  on the \"configure\" command. This is just the default; individual calls to\n  pcre_exec() can supply their own value. There is more discussion on the\n  pcreapi man page.\n\n. There is a separate counter that limits the depth of recursive function calls\n  during a matching process. This also has a default of ten million, which is\n  essentially \"unlimited\". You can change the default by setting, for example,\n\n  --with-match-limit-recursion=500000\n\n  Recursive function calls use up the runtime stack; running out of stack can\n  cause programs to crash in strange ways. There is a discussion about stack\n  sizes in the pcrestack man page.\n\n. The default maximum compiled pattern size is around 64K. You can increase\n  this by adding --with-link-size=3 to the \"configure\" command. In the 8-bit\n  library, PCRE then uses three bytes instead of two for offsets to different\n  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is\n  the same as --with-link-size=4, which (in both libraries) uses four-byte\n  offsets. Increasing the internal link size reduces performance. In the 32-bit\n  library, the only supported link size is 4.\n\n. You can build PCRE so that its internal match() function that is called from\n  pcre_exec() does not call itself recursively. Instead, it uses memory blocks\n  obtained from the heap via the special functions pcre_stack_malloc() and\n  pcre_stack_free() to save data that would otherwise be saved on the stack. To\n  build PCRE like this, use\n\n  --disable-stack-for-recursion\n\n  on the \"configure\" command. PCRE runs more slowly in this mode, but it may be\n  necessary in environments with limited stack sizes. This applies only to the\n  normal execution of the pcre_exec() function; if JIT support is being\n  successfully used, it is not relevant. Equally, it does not apply to\n  pcre_dfa_exec(), which does not use deeply nested recursion. There is a\n  discussion about stack sizes in the pcrestack man page.\n\n. For speed, PCRE uses four tables for manipulating and identifying characters\n  whose code point values are less than 256. By default, it uses a set of\n  tables for ASCII encoding that is part of the distribution. If you specify\n\n  --enable-rebuild-chartables\n\n  a program called dftables is compiled and run in the default C locale when\n  you obey \"make\". It builds a source file called pcre_chartables.c. If you do\n  not specify this option, pcre_chartables.c is created as a copy of\n  pcre_chartables.c.dist. See \"Character tables\" below for further information.\n\n. It is possible to compile PCRE for use on systems that use EBCDIC as their\n  character code (as opposed to ASCII/Unicode) by specifying\n\n  --enable-ebcdic\n\n  This automatically implies --enable-rebuild-chartables (see above). However,\n  when PCRE is built this way, it always operates in EBCDIC. It cannot support\n  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,\n  which specifies that the code value for the EBCDIC NL character is 0x25\n  instead of the default 0x15.\n\n. In environments where valgrind is installed, if you specify\n\n  --enable-valgrind\n\n  PCRE will use valgrind annotations to mark certain memory regions as\n  unaddressable. This allows it to detect invalid memory accesses, and is\n  mostly useful for debugging PCRE itself.\n\n. In environments where the gcc compiler is used and lcov version 1.6 or above\n  is installed, if you specify\n\n  --enable-coverage\n\n  the build process implements a code coverage report for the test suite. The\n  report is generated by running \"make coverage\". If ccache is installed on\n  your system, it must be disabled when building PCRE for coverage reporting.\n  You can do this by setting the environment variable CCACHE_DISABLE=1 before\n  running \"make\" to build PCRE. There is more information about coverage\n  reporting in the \"pcrebuild\" documentation.\n\n. The pcregrep program currently supports only 8-bit data files, and so\n  requires the 8-bit PCRE library. It is possible to compile pcregrep to use\n  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by\n  specifying one or both of\n\n  --enable-pcregrep-libz\n  --enable-pcregrep-libbz2\n\n  Of course, the relevant libraries must be installed on your system.\n\n. The default size (in bytes) of the internal buffer used by pcregrep can be\n  set by, for example:\n\n  --with-pcregrep-bufsize=51200\n\n  The value must be a plain integer. The default is 20480.\n\n. It is possible to compile pcretest so that it links with the libreadline\n  or libedit libraries, by specifying, respectively,\n\n  --enable-pcretest-libreadline or --enable-pcretest-libedit\n\n  If this is done, when pcretest's input is from a terminal, it reads it using\n  the readline() function. This provides line-editing and history facilities.\n  Note that libreadline is GPL-licenced, so if you distribute a binary of\n  pcretest linked in this way, there may be licensing issues. These can be\n  avoided by linking with libedit (which has a BSD licence) instead.\n\n  Enabling libreadline causes the -lreadline option to be added to the pcretest\n  build. In many operating environments with a sytem-installed readline\n  library this is sufficient. However, in some environments (e.g. if an\n  unmodified distribution version of readline is in use), it may be necessary\n  to specify something like LIBS=\"-lncurses\" as well. This is because, to quote\n  the readline INSTALL, \"Readline uses the termcap functions, but does not link\n  with the termcap or curses library itself, allowing applications which link\n  with readline the to choose an appropriate library.\" If you get error\n  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,\n  this is the problem, and linking with the ncurses library should fix it.\n\nThe \"configure\" script builds the following files for the basic C library:\n\n. Makefile             the makefile that builds the library\n. config.h             build-time configuration options for the library\n. pcre.h               the public PCRE header file\n. pcre-config          script that shows the building settings such as CFLAGS\n                         that were set for \"configure\"\n. libpcre.pc         ) data for the pkg-config command\n. libpcre16.pc       )\n. libpcre32.pc       )\n. libpcreposix.pc    )\n. libtool              script that builds shared and/or static libraries\n\nVersions of config.h and pcre.h are distributed in the PCRE tarballs under the\nnames config.h.generic and pcre.h.generic. These are provided for those who\nhave to built PCRE without using \"configure\" or CMake. If you use \"configure\"\nor CMake, the .generic versions are not used.\n\nWhen building the 8-bit library, if a C++ compiler is found, the following\nfiles are also built:\n\n. libpcrecpp.pc        data for the pkg-config command\n. pcrecpparg.h         header file for calling PCRE via the C++ wrapper\n. pcre_stringpiece.h   header for the C++ \"stringpiece\" functions\n\nThe \"configure\" script also creates config.status, which is an executable\nscript that can be run to recreate the configuration, and config.log, which\ncontains compiler output from tests that \"configure\" runs.\n\nOnce \"configure\" has run, you can run \"make\". This builds the the libraries\nlibpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you\nenabled JIT support with --enable-jit, a test program called pcre_jit_test is\nbuilt as well.\n\nIf the 8-bit library is built, libpcreposix and the pcregrep command are also\nbuilt, and if a C++ compiler was found on your system, and you did not disable\nit with --disable-cpp, \"make\" builds the C++ wrapper library, which is called\nlibpcrecpp, as well as some test programs called pcrecpp_unittest,\npcre_scanner_unittest, and pcre_stringpiece_unittest.\n\nThe command \"make check\" runs all the appropriate tests. Details of the PCRE\ntests are given below in a separate section of this document.\n\nYou can use \"make install\" to install PCRE into live directories on your\nsystem. The following are installed (file names are all relative to the\n<prefix> that is set when \"configure\" is run):\n\n  Commands (bin):\n    pcretest\n    pcregrep (if 8-bit support is enabled)\n    pcre-config\n\n  Libraries (lib):\n    libpcre16     (if 16-bit support is enabled)\n    libpcre32     (if 32-bit support is enabled)\n    libpcre       (if 8-bit support is enabled)\n    libpcreposix  (if 8-bit support is enabled)\n    libpcrecpp    (if 8-bit and C++ support is enabled)\n\n  Configuration information (lib/pkgconfig):\n    libpcre16.pc\n    libpcre32.pc\n    libpcre.pc\n    libpcreposix.pc\n    libpcrecpp.pc (if C++ support is enabled)\n\n  Header files (include):\n    pcre.h\n    pcreposix.h\n    pcre_scanner.h      )\n    pcre_stringpiece.h  ) if C++ support is enabled\n    pcrecpp.h           )\n    pcrecpparg.h        )\n\n  Man pages (share/man/man{1,3}):\n    pcregrep.1\n    pcretest.1\n    pcre-config.1\n    pcre.3\n    pcre*.3 (lots more pages, all starting \"pcre\")\n\n  HTML documentation (share/doc/pcre/html):\n    index.html\n    *.html (lots more pages, hyperlinked from index.html)\n\n  Text file documentation (share/doc/pcre):\n    AUTHORS\n    COPYING\n    ChangeLog\n    LICENCE\n    NEWS\n    README\n    pcre.txt         (a concatenation of the man(3) pages)\n    pcretest.txt     the pcretest man page\n    pcregrep.txt     the pcregrep man page\n    pcre-config.txt  the pcre-config man page\n\nIf you want to remove PCRE from your system, you can run \"make uninstall\".\nThis removes all the files that \"make install\" installed. However, it does not\nremove any directories, because these are often shared with other programs.\n\n\nRetrieving configuration information\n------------------------------------\n\nRunning \"make install\" installs the command pcre-config, which can be used to\nrecall information about the PCRE configuration and installation. For example:\n\n  pcre-config --version\n\nprints the version number, and\n\n  pcre-config --libs\n\noutputs information about where the library is installed. This command can be\nincluded in makefiles for programs that use PCRE, saving the programmer from\nhaving to remember too many details.\n\nThe pkg-config command is another system for saving and retrieving information\nabout installed libraries. Instead of separate commands for each library, a\nsingle command is used. For example:\n\n  pkg-config --cflags pcre\n\nThe data is held in *.pc files that are installed in a directory called\n<prefix>/lib/pkgconfig.\n\n\nShared libraries\n----------------\n\nThe default distribution builds PCRE as shared libraries and static libraries,\nas long as the operating system supports shared libraries. Shared library\nsupport relies on the \"libtool\" script which is built as part of the\n\"configure\" process.\n\nThe libtool script is used to compile and link both shared and static\nlibraries. They are placed in a subdirectory called .libs when they are newly\nbuilt. The programs pcretest and pcregrep are built to use these uninstalled\nlibraries (by means of wrapper scripts in the case of shared libraries). When\nyou use \"make install\" to install shared libraries, pcregrep and pcretest are\nautomatically re-built to use the newly installed shared libraries before being\ninstalled themselves. However, the versions left in the build directory still\nuse the uninstalled libraries.\n\nTo build PCRE using static libraries only you must use --disable-shared when\nconfiguring it. For example:\n\n./configure --prefix=/usr/gnu --disable-shared\n\nThen run \"make\" in the usual way. Similarly, you can use --disable-static to\nbuild only shared libraries.\n\n\nCross-compiling using autotools\n-------------------------------\n\nYou can specify CC and CFLAGS in the normal way to the \"configure\" command, in\norder to cross-compile PCRE for some other host. However, you should NOT\nspecify --enable-rebuild-chartables, because if you do, the dftables.c source\nfile is compiled and run on the local host, in order to generate the inbuilt\ncharacter tables (the pcre_chartables.c file). This will probably not work,\nbecause dftables.c needs to be compiled with the local compiler, not the cross\ncompiler.\n\nWhen --enable-rebuild-chartables is not specified, pcre_chartables.c is created\nby making a copy of pcre_chartables.c.dist, which is a default set of tables\nthat assumes ASCII code. Cross-compiling with the default tables should not be\na problem.\n\nIf you need to modify the character tables when cross-compiling, you should\nmove pcre_chartables.c.dist out of the way, then compile dftables.c by hand and\nrun it on the local host to make a new version of pcre_chartables.c.dist.\nThen when you cross-compile PCRE this new version of the tables will be used.\n\n\nUsing HP's ANSI C++ compiler (aCC)\n----------------------------------\n\nUnless C++ support is disabled by specifying the \"--disable-cpp\" option of the\n\"configure\" script, you must include the \"-AA\" option in the CXXFLAGS\nenvironment variable in order for the C++ components to compile correctly.\n\nAlso, note that the aCC compiler on PA-RISC platforms may have a defect whereby\nneeded libraries fail to get included when specifying the \"-AA\" compiler\noption. If you experience unresolved symbols when linking the C++ programs,\nuse the workaround of specifying the following environment variable prior to\nrunning the \"configure\" script:\n\n  CXXLDFLAGS=\"-lstd_v2 -lCsup_v2\"\n\n\nCompiling in Tru64 using native compilers\n-----------------------------------------\n\nThe following error may occur when compiling with native compilers in the Tru64\noperating system:\n\n  CXX    libpcrecpp_la-pcrecpp.lo\ncxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error\n          directive: \"cannot include iosfwd -- define __USE_STD_IOSTREAM to\n          override default - see section 7.1.2 of the C++ Using Guide\"\n#error \"cannot include iosfwd -- define __USE_STD_IOSTREAM to override default\n- see section 7.1.2 of the C++ Using Guide\"\n\nThis may be followed by other errors, complaining that 'namespace \"std\" has no\nmember'. The solution to this is to add the line\n\n#define __USE_STD_IOSTREAM 1\n\nto the config.h file.\n\n\nUsing Sun's compilers for Solaris\n---------------------------------\n\nA user reports that the following configurations work on Solaris 9 sparcv9 and\nSolaris 9 x86 (32-bit):\n\n  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS=\"-m64 -g\"\n  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS=\"-g\"\n\n\nUsing PCRE from MySQL\n---------------------\n\nOn systems where both PCRE and MySQL are installed, it is possible to make use\nof PCRE from within MySQL, as an alternative to the built-in pattern matching.\nThere is a web page that tells you how to do this:\n\n  http://www.mysqludf.org/lib_mysqludf_preg/index.php\n\n\nMaking new tarballs\n-------------------\n\nThe command \"make dist\" creates three PCRE tarballs, in tar.gz, tar.bz2, and\nzip formats. The command \"make distcheck\" does the same, but then does a trial\nbuild of the new distribution to ensure that it works.\n\nIf you have modified any of the man page sources in the doc directory, you\nshould first run the PrepareRelease script before making a distribution. This\nscript creates the .txt and HTML forms of the documentation from the man pages.\n\n\nTesting PCRE\n------------\n\nTo test the basic PCRE library on a Unix-like system, run the RunTest script.\nThere is another script called RunGrepTest that tests the options of the\npcregrep command. If the C++ wrapper library is built, three test programs\ncalled pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest\nare also built. When JIT support is enabled, another test program called\npcre_jit_test is built.\n\nBoth the scripts and all the program tests are run if you obey \"make check\" or\n\"make test\". For other environments, see the instructions in\nNON-AUTOTOOLS-BUILD.\n\nThe RunTest script runs the pcretest test program (which is documented in its\nown man page) on each of the relevant testinput files in the testdata\ndirectory, and compares the output with the contents of the corresponding\ntestoutput files. RunTest uses a file called testtry to hold the main output\nfrom pcretest. Other files whose names begin with \"test\" are used as working\nfiles in some tests.\n\nSome tests are relevant only when certain build-time options were selected. For\nexample, the tests for UTF-8/16/32 support are run only if --enable-utf was\nused. RunTest outputs a comment when it skips a test.\n\nMany of the tests that are not skipped are run up to three times. The second\nrun forces pcre_study() to be called for all patterns except for a few in some\ntests that are marked \"never study\" (see the pcretest program for how this is\ndone). If JIT support is available, the non-DFA tests are run a third time,\nthis time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option.\nThis testing can be suppressed by putting \"nojit\" on the RunTest command line.\n\nThe entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit\nlibraries that are enabled. If you want to run just one set of tests, call\nRunTest with either the -8, -16 or -32 option.\n\nIf valgrind is installed, you can run the tests under it by putting \"valgrind\"\non the RunTest command line. To run pcretest on just one or more specific test\nfiles, give their numbers as arguments to RunTest, for example:\n\n  RunTest 2 7 11\n\nYou can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the\nend), or a number preceded by ~ to exclude a test. For example:\n\n  Runtest 3-15 ~10\n\nThis runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests\nexcept test 13. Whatever order the arguments are in, the tests are always run\nin numerical order.\n\nYou can also call RunTest with the single argument \"list\" to cause it to output\na list of tests.\n\nThe first test file can be fed directly into the perltest.pl script to check\nthat Perl gives the same results. The only difference you should see is in the\nfirst few lines, where the Perl version is given instead of the PCRE version.\n\nThe second set of tests check pcre_fullinfo(), pcre_study(),\npcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error\ndetection, and run-time flags that are specific to PCRE, as well as the POSIX\nwrapper API. It also uses the debugging flags to check some of the internals of\npcre_compile().\n\nIf you build PCRE with a locale setting that is not the standard C locale, the\ncharacter tables may be different (see next paragraph). In some cases, this may\ncause failures in the second set of tests. For example, in a locale where the\nisprint() function yields TRUE for characters in the range 128-255, the use of\n[:isascii:] inside a character class defines a different set of characters, and\nthis shows up in this test as a difference in the compiled code, which is being\nlisted for checking. Where the comparison test output contains [\\x00-\\x7f] the\ntest will contain [\\x00-\\xff], and similarly in some other cases. This is not a\nbug in PCRE.\n\nThe third set of tests checks pcre_maketables(), the facility for building a\nset of character tables for a specific locale and using them instead of the\ndefault tables. The tests make use of the \"fr_FR\" (French) locale. Before\nrunning the test, the script checks for the presence of this locale by running\nthe \"locale\" command. If that command fails, or if it doesn't include \"fr_FR\"\nin the list of available locales, the third test cannot be run, and a comment\nis output to say why. If running this test produces instances of the error\n\n  ** Failed to set locale \"fr_FR\"\n\nin the comparison output, it means that locale is not available on your system,\ndespite being listed by \"locale\". This does not mean that PCRE is broken.\n\n[If you are trying to run this test on Windows, you may be able to get it to\nwork by changing \"fr_FR\" to \"french\" everywhere it occurs. Alternatively, use\nRunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses\nWindows versions of test 2. More info on using RunTest.bat is included in the\ndocument entitled NON-UNIX-USE.]\n\nThe fourth and fifth tests check the UTF-8/16/32 support and error handling and\ninternal UTF features of PCRE that are not relevant to Perl, respectively. The\nsixth and seventh tests do the same for Unicode character properties support.\n\nThe eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative\nmatching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32\nmode with Unicode property support, respectively.\n\nThe eleventh test checks some internal offsets and code size features; it is\nrun only when the default \"link size\" of 2 is set (in other cases the sizes\nchange) and when Unicode property support is enabled.\n\nThe twelfth test is run only when JIT support is available, and the thirteenth\ntest is run only when JIT support is not available. They test some JIT-specific\nfeatures such as information output from pcretest about JIT compilation.\n\nThe fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and\nthe seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit\nmode. These are tests that generate different output in the two modes. They are\nfor general cases, UTF-8/16/32 support, and Unicode property support,\nrespectively.\n\nThe twentieth test is run only in 16/32-bit mode. It tests some specific\n16/32-bit features of the DFA matching engine.\n\nThe twenty-first and twenty-second tests are run only in 16/32-bit mode, when\nthe link size is set to 2 for the 16-bit library. They test reloading\npre-compiled patterns.\n\nThe twenty-third and twenty-fourth tests are run only in 16-bit mode. They are\nfor general cases, and UTF-16 support, respectively.\n\nThe twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are\nfor general cases, and UTF-32 support, respectively.\n\n\nCharacter tables\n----------------\n\nFor speed, PCRE uses four tables for manipulating and identifying characters\nwhose code point values are less than 256. The final argument of the\npcre_compile() function is a pointer to a block of memory containing the\nconcatenated tables. A call to pcre_maketables() can be used to generate a set\nof tables in the current locale. If the final argument for pcre_compile() is\npassed as NULL, a set of default tables that is built into the binary is used.\n\nThe source file called pcre_chartables.c contains the default set of tables. By\ndefault, this is created as a copy of pcre_chartables.c.dist, which contains\ntables for ASCII coding. However, if --enable-rebuild-chartables is specified\nfor ./configure, a different version of pcre_chartables.c is built by the\nprogram dftables (compiled from dftables.c), which uses the ANSI C character\nhandling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to\nbuild the table sources. This means that the default C locale which is set for\nyour system will control the contents of these default tables. You can change\nthe default tables by editing pcre_chartables.c and then re-building PCRE. If\nyou do this, you should take care to ensure that the file does not get\nautomatically re-generated. The best way to do this is to move\npcre_chartables.c.dist out of the way and replace it with your customized\ntables.\n\nWhen the dftables program is run as a result of --enable-rebuild-chartables,\nit uses the default C locale that is set on your system. It does not pay\nattention to the LC_xxx environment variables. In other words, it uses the\nsystem's default locale rather than whatever the compiling user happens to have\nset. If you really do want to build a source set of character tables in a\nlocale that is specified by the LC_xxx variables, you can run the dftables\nprogram by hand with the -L option. For example:\n\n  ./dftables -L pcre_chartables.c.special\n\nThe first two 256-byte tables provide lower casing and case flipping functions,\nrespectively. The next table consists of three 32-byte bit maps which identify\ndigits, \"word\" characters, and white space, respectively. These are used when\nbuilding 32-byte bit maps that represent character classes for code points less\nthan 256.\n\nThe final 256-byte table has bits indicating various character types, as\nfollows:\n\n    1   white space character\n    2   letter\n    4   decimal digit\n    8   hexadecimal digit\n   16   alphanumeric or '_'\n  128   regular expression metacharacter or binary zero\n\nYou should not alter the set of characters that contain the 128 bit, as that\nwill cause PCRE to malfunction.\n\n\nFile manifest\n-------------\n\nThe distribution should contain the files listed below. Where a file name is\ngiven as pcre[16|32]_xxx it means that there are three files, one with the name\npcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.\n\n(A) Source files of the PCRE library functions and their headers:\n\n  dftables.c              auxiliary program for building pcre_chartables.c\n                          when --enable-rebuild-chartables is specified\n\n  pcre_chartables.c.dist  a default set of character tables that assume ASCII\n                          coding; used, unless --enable-rebuild-chartables is\n                          specified, by copying to pcre[16]_chartables.c\n\n  pcreposix.c                )\n  pcre[16|32]_byte_order.c   )\n  pcre[16|32]_compile.c      )\n  pcre[16|32]_config.c       )\n  pcre[16|32]_dfa_exec.c     )\n  pcre[16|32]_exec.c         )\n  pcre[16|32]_fullinfo.c     )\n  pcre[16|32]_get.c          ) sources for the functions in the library,\n  pcre[16|32]_globals.c      )   and some internal functions that they use\n  pcre[16|32]_jit_compile.c  )\n  pcre[16|32]_maketables.c   )\n  pcre[16|32]_newline.c      )\n  pcre[16|32]_refcount.c     )\n  pcre[16|32]_string_utils.c )\n  pcre[16|32]_study.c        )\n  pcre[16|32]_tables.c       )\n  pcre[16|32]_ucd.c          )\n  pcre[16|32]_version.c      )\n  pcre[16|32]_xclass.c       )\n  pcre_ord2utf8.c            )\n  pcre_valid_utf8.c          )\n  pcre16_ord2utf16.c         )\n  pcre16_utf16_utils.c       )\n  pcre16_valid_utf16.c       )\n  pcre32_utf32_utils.c       )\n  pcre32_valid_utf32.c       )\n\n  pcre[16|32]_printint.c     ) debugging function that is used by pcretest,\n                             )   and can also be #included in pcre_compile()\n\n  pcre.h.in               template for pcre.h when built by \"configure\"\n  pcreposix.h             header for the external POSIX wrapper API\n  pcre_internal.h         header for internal use\n  sljit/*                 16 files that make up the JIT compiler\n  ucp.h                   header for Unicode property handling\n\n  config.h.in             template for config.h, which is built by \"configure\"\n\n  pcrecpp.h               public header file for the C++ wrapper\n  pcrecpparg.h.in         template for another C++ header file\n  pcre_scanner.h          public header file for C++ scanner functions\n  pcrecpp.cc              )\n  pcre_scanner.cc         ) source for the C++ wrapper library\n\n  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the\n                            C++ stringpiece functions\n  pcre_stringpiece.cc     source for the C++ stringpiece functions\n\n(B) Source files for programs that use PCRE:\n\n  pcredemo.c              simple demonstration of coding calls to PCRE\n  pcregrep.c              source of a grep utility that uses PCRE\n  pcretest.c              comprehensive test program\n\n(C) Auxiliary files:\n\n  132html                 script to turn \"man\" pages into HTML\n  AUTHORS                 information about the author of PCRE\n  ChangeLog               log of changes to the code\n  CleanTxt                script to clean nroff output for txt man pages\n  Detrail                 script to remove trailing spaces\n  HACKING                 some notes about the internals of PCRE\n  INSTALL                 generic installation instructions\n  LICENCE                 conditions for the use of PCRE\n  COPYING                 the same, using GNU's standard name\n  Makefile.in             ) template for Unix Makefile, which is built by\n                          )   \"configure\"\n  Makefile.am             ) the automake input that was used to create\n                          )   Makefile.in\n  NEWS                    important changes in this release\n  NON-UNIX-USE            the previous name for NON-AUTOTOOLS-BUILD\n  NON-AUTOTOOLS-BUILD     notes on building PCRE without using autotools\n  PrepareRelease          script to make preparations for \"make dist\"\n  README                  this file\n  RunTest                 a Unix shell script for running tests\n  RunGrepTest             a Unix shell script for pcregrep tests\n  aclocal.m4              m4 macros (generated by \"aclocal\")\n  config.guess            ) files used by libtool,\n  config.sub              )   used only when building a shared library\n  configure               a configuring shell script (built by autoconf)\n  configure.ac            ) the autoconf input that was used to build\n                          )   \"configure\" and config.h\n  depcomp                 ) script to find program dependencies, generated by\n                          )   automake\n  doc/*.3                 man page sources for PCRE\n  doc/*.1                 man page sources for pcregrep and pcretest\n  doc/index.html.src      the base HTML page\n  doc/html/*              HTML documentation\n  doc/pcre.txt            plain text version of the man pages\n  doc/pcretest.txt        plain text documentation of test program\n  doc/perltest.txt        plain text documentation of Perl test program\n  install-sh              a shell script for installing files\n  libpcre16.pc.in         template for libpcre16.pc for pkg-config\n  libpcre32.pc.in         template for libpcre32.pc for pkg-config\n  libpcre.pc.in           template for libpcre.pc for pkg-config\n  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config\n  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config\n  ltmain.sh               file used to build a libtool script\n  missing                 ) common stub for a few missing GNU programs while\n                          )   installing, generated by automake\n  mkinstalldirs           script for making install directories\n  perltest.pl             Perl test program\n  pcre-config.in          source of script which retains PCRE information\n  pcre_jit_test.c         test program for the JIT compiler\n  pcrecpp_unittest.cc          )\n  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper\n  pcre_stringpiece_unittest.cc )\n  testdata/testinput*     test data for main library tests\n  testdata/testoutput*    expected test results\n  testdata/grep*          input and output for pcregrep tests\n  testdata/*              other supporting test files\n\n(D) Auxiliary files for cmake support\n\n  cmake/COPYING-CMAKE-SCRIPTS\n  cmake/FindPackageHandleStandardArgs.cmake\n  cmake/FindEditline.cmake\n  cmake/FindReadline.cmake\n  CMakeLists.txt\n  config-cmake.h.in\n\n(E) Auxiliary files for VPASCAL\n\n  makevp.bat\n  makevp_c.txt\n  makevp_l.txt\n  pcregexp.pas\n\n(F) Auxiliary files for building PCRE \"by hand\"\n\n  pcre.h.generic          ) a version of the public PCRE header file\n                          )   for use in non-\"configure\" environments\n  config.h.generic        ) a version of config.h for use in non-\"configure\"\n                          )   environments\n\n(F) Miscellaneous\n\n  RunTest.bat            a script for running tests under Windows\n\nPhilip Hazel\nEmail local part: ph10\nEmail domain: cam.ac.uk\nLast updated: 10 February 2015\n"
  },
  {
    "path": "src/pcre/RunGrepTest",
    "content": "#! /bin/sh\n\n# Run pcregrep tests. The assumption is that the PCRE tests check the library\n# itself. What we are checking here is the file handling and options that are\n# supported by pcregrep. This script must be run in the build directory.\n\n# Set the C locale, so that sort(1) behaves predictably.\n\nLC_ALL=C\nexport LC_ALL\n\n# Remove any non-default colouring and aliases that the caller may have set.\n\nunset PCREGREP_COLOUR PCREGREP_COLOR\nunset cp ls mv rm\n\n# Remember the current (build) directory, set the program to be tested, and\n# valgrind settings when requested.\n\nbuilddir=`pwd`\npcregrep=$builddir/pcregrep\n\nvalgrind=\nwhile [ $# -gt 0 ] ; do\n  case $1 in\n    valgrind) valgrind=\"valgrind -q --leak-check=no --smc-check=all\";;\n    *) echo \"RunGrepTest: Unknown argument $1\"; exit 1;;\n  esac\n  shift\ndone\n\necho \" \"\npcregrep_version=`$pcregrep -V`\nif [ \"$valgrind\" = \"\" ] ; then\n  echo \"Testing $pcregrep_version\"\nelse\n  echo \"Testing $pcregrep_version using valgrind\"\nfi\n\n# Set up a suitable \"diff\" command for comparison. Some systems have a diff\n# that lacks a -u option. Try to deal with this; better do the test for the -b\n# option as well.\n\ncf=\"diff\"\ndiff -b  /dev/null /dev/null 2>/dev/null && cf=\"diff -b\"\ndiff -u  /dev/null /dev/null 2>/dev/null && cf=\"diff -u\"\ndiff -ub /dev/null /dev/null 2>/dev/null && cf=\"diff -ub\"\n\n# If this test is being run from \"make check\", $srcdir will be set. If not, set\n# it to the current or parent directory, whichever one contains the test data.\n# Subsequently, we run most of the pcregrep tests in the source directory so\n# that the file names in the output are always the same.\n\nif [ -z \"$srcdir\" -o ! -d \"$srcdir/testdata\" ] ; then\n  if [ -d \"./testdata\" ] ; then\n    srcdir=.\n  elif [ -d \"../testdata\" ] ; then\n    srcdir=..\n  else\n    echo \"Cannot find the testdata directory\"\n    exit 1\n  fi\nfi\n\n# Check for the availability of UTF-8 support\n\n./pcretest -C utf >/dev/null\nutf8=$?\n\n# We need valgrind suppressions when JIT is in use. (This isn't perfect because\n# some tests are run with -no-jit, but as PCRE1 is in maintenance only, I have\n# not bothered about that.)\n\n./pcretest -C jit >/dev/null\nif [ $? -eq 1 -a \"$valgrind\" != \"\" ] ; then\n  valgrind=\"$valgrind --suppressions=./testdata/valgrind-jit.supp\"\nfi\n\necho \"Testing pcregrep main features\"\n\necho \"---------------------------- Test 1 ------------------------------\" >testtrygrep\n(cd $srcdir; $valgrind $pcregrep PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 2 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep '^PATTERN' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 3 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 4 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -ic PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 5 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 6 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -inh PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 7 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -il PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 8 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -l PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 9 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -q PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 10 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -q NEVER-PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 11 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -vn pattern ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 12 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -ix pattern ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 13 -----------------------------\" >>testtrygrep\necho seventeen >testtemp1grep\n(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist -f $builddir/testtemp1grep ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 14 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -w pat ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 15 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep 'abc^*' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 16 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep abc ./testdata/grepinput ./testdata/nonexistfile) 2>>testtrygrep >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 17 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -M 'the\\noutput' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 18 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Mn '(the\\noutput|dog\\.\\n--)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 19 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Mix 'Pattern' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 20 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Mixn 'complete pair\\nof lines' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 21 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -nA3 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 22 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -nB3 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 23 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -C3 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 24 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -A9 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 25 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -nB9 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 26 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -A9 -B9 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 27 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -A10 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 28 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -nB10 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 29 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -C12 -B10 'four' ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 30 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -inB3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 31 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -inA3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 32 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -L 'fox' ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 33 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 34 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -s 'fox' ./testdata/grepnonexist) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 35 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 --exclude-dir='^\\.' 'fox' ./testdata | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 36 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude 'grepinput$' --exclude=grepinput8 --exclude-dir='^\\.' 'fox' ./testdata | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 37 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep  '^(a+)*\\d' ./testdata/grepinput) >>testtrygrep 2>teststderrgrep\necho \"RC=$?\" >>testtrygrep\necho \"======== STDERR ========\" >>testtrygrep\ncat teststderrgrep >>testtrygrep\n\necho \"---------------------------- Test 38 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep '>\\x00<' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 39 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -A1 'before the binary zero' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 40 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -B1 'after the binary zero' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 41 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -B1 -o '\\w+ the binary zero' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 42 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -B1 -onH '\\w+ the binary zero' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 43 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -on 'before|zero|after' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 44 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -on -e before -ezero -e after ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 45 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -on -f ./testdata/greplist -e binary ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 46 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -eabc -e '(unclosed' ./testdata/grepinput) 2>>testtrygrep >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 47 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Fx \"AB.VE\nelephant\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 48 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -F \"AB.VE\nelephant\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 49 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -F -e DATA -e \"AB.VE\nelephant\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 50 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep \"^(abc|def|ghi|jkl)\" ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 51 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Mv \"brown\\sfox\" ./testdata/grepinputv) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 52 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --colour=always jumps ./testdata/grepinputv) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 53 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --file-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 54 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --line-offsets 'before|zero|after' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 55 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -f./testdata/greplist --color=always ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 56 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -c lazy ./testdata/grepinput*) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 57 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -c -l lazy ./testdata/grepinput*) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 58 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --regex=PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 59 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --regexp=PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 60 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --regex PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 61 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --regexp PATTERN ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 62 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --match-limit=1000 --no-jit -M 'This is a file(.|\\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 63 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --recursion-limit=1000 --no-jit -M 'This is a file(.|\\R)*file.' ./testdata/grepinput) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 64 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o1 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 65 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 66 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o3 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 67 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o12 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 68 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --only-matching=2 '(?<=PAT)TERN (ap(pear)s)' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 69 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -vn --colour=always pattern ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 70 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --color=always -M \"triple:\\t.*\\n\\n\" ./testdata/grepinput3) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 71 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o \"^01|^02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 72 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --color=always \"^01|^02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 73 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o --colour=always \"^01|^02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 74 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o \"^01|02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 75 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --color=always \"^01|02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 76 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o --colour=always \"^01|02|^03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 77 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o \"^01|^02|03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 78 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --color=always \"^01|^02|03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 79 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o --colour=always \"^01|^02|03\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 80 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o \"\\b01|\\b02\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 81 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --color=always \"\\\\b01|\\\\b02\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 82 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o --colour=always \"\\\\b01|\\\\b02\" ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 83 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --buffer-size=100 \"^a\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 84 -----------------------------\" >>testtrygrep\necho testdata/grepinput3 >testtemp1grep\n(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --file-list $builddir/testtemp1grep \"fox|complete|t7\") >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 85 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --file-list=./testdata/grepfilelist \"dolor\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 86 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 87 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep \"cat\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 88 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -v \"cat\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 89 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -I \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 90 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --binary-files=without-match \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 91 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -a \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 92 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --binary-files=text \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 93 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --text \"dog\" ./testdata/grepbinary) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 94 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx --include grepinput8 'fox' ./testdata/grepinput* | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 95 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --file-list ./testdata/grepfilelist --exclude grepinputv \"fox|complete\") >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 96 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -L -r --include-dir=testdata --exclude '^(?!grepinput)' 'fox' ./test* | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 97 -----------------------------\" >>testtrygrep\necho \"grepinput$\" >testtemp1grep\necho \"grepinput8\" >>testtemp1grep\n(cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\\.' 'fox' ./testdata | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 98 -----------------------------\" >>testtrygrep\necho \"grepinput$\" >testtemp1grep\necho \"grepinput8\" >>testtemp1grep\n(cd $srcdir; $valgrind $pcregrep -L -r --exclude=grepinput3 --include=grepinput --exclude-from $builddir/testtemp1grep --exclude-dir='^\\.' 'fox' ./testdata | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 99 -----------------------------\" >>testtrygrep\necho \"grepinput$\" >testtemp1grep\necho \"grepinput8\" >testtemp2grep\n(cd $srcdir; $valgrind $pcregrep -L -r --include grepinput --exclude-from $builddir/testtemp1grep --exclude-from=$builddir/testtemp2grep --exclude-dir='^\\.' 'fox' ./testdata | sort) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 100 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -Ho2 --only-matching=1 -o3 '(\\w+) binary (\\w+)(\\.)?' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 101 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -o3 -Ho2 -o12 --only-matching=1 -o3 --colour=always --om-separator='|' '(\\w+) binary (\\w+)(\\.)?' ./testdata/grepinput) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 102 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -n \"^$\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 103 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --only-matching \"^$\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 104 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -n --only-matching \"^$\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 105 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep --colour=always \"ipsum|\" ./testdata/grepinput3) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 106 -----------------------------\" >>testtrygrep\n(cd $srcdir; echo \"a\" | $valgrind $pcregrep -M \"|a\" ) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 107 -----------------------------\" >>testtrygrep\necho \"a\" >testtemp1grep\necho \"aaaaa\" >>testtemp1grep\n(cd $srcdir; $valgrind $pcregrep  --line-offsets '(?<=\\Ka)' $builddir/testtemp1grep) >>testtrygrep 2>&1\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 108 ------------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -lq PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\necho \"---------------------------- Test 109 -----------------------------\" >>testtrygrep\n(cd $srcdir; $valgrind $pcregrep -cq lazy ./testdata/grepinput*) >>testtrygrep\necho \"RC=$?\" >>testtrygrep\n\n# Now compare the results.\n\n$cf $srcdir/testdata/grepoutput testtrygrep\nif [ $? != 0 ] ; then exit 1; fi\n\n\n# These tests require UTF-8 support\n\nif [ $utf8 -ne 0 ] ; then\n  echo \"Testing pcregrep UTF-8 features\"\n\n  echo \"---------------------------- Test U1 ------------------------------\" >testtrygrep\n  (cd $srcdir; $valgrind $pcregrep -n -u --newline=any \"^X\" ./testdata/grepinput8) >>testtrygrep\n  echo \"RC=$?\" >>testtrygrep\n\n  echo \"---------------------------- Test U2 ------------------------------\" >>testtrygrep\n  (cd $srcdir; $valgrind $pcregrep -n -u -C 3 --newline=any \"Match\" ./testdata/grepinput8) >>testtrygrep\n  echo \"RC=$?\" >>testtrygrep\n\n  $cf $srcdir/testdata/grepoutput8 testtrygrep\n  if [ $? != 0 ] ; then exit 1; fi\n\nelse\n  echo \"Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library\"\nfi\n\n\n# We go to some contortions to try to ensure that the tests for the various\n# newline settings will work in environments where the normal newline sequence\n# is not \\n. Do not use exported files, whose line endings might be changed.\n# Instead, create an input file using printf so that its contents are exactly\n# what we want. Note the messy fudge to get printf to write a string that\n# starts with a hyphen. These tests are run in the build directory.\n\necho \"Testing pcregrep newline settings\"\nprintf \"abc\\rdef\\r\\nghi\\njkl\" >testNinputgrep\n\nprintf \"%c--------------------------- Test N1 ------------------------------\\r\\n\" - >testtrygrep\n$valgrind $pcregrep -n -N CR \"^(abc|def|ghi|jkl)\" testNinputgrep >>testtrygrep\n\nprintf \"%c--------------------------- Test N2 ------------------------------\\r\\n\" - >>testtrygrep\n$valgrind $pcregrep -n --newline=crlf \"^(abc|def|ghi|jkl)\" testNinputgrep >>testtrygrep\n\nprintf \"%c--------------------------- Test N3 ------------------------------\\r\\n\" - >>testtrygrep\npattern=`printf 'def\\rjkl'`\n$valgrind $pcregrep -n --newline=cr -F \"$pattern\" testNinputgrep >>testtrygrep\n\nprintf \"%c--------------------------- Test N4 ------------------------------\\r\\n\" - >>testtrygrep\n$valgrind $pcregrep -n --newline=crlf -F -f $srcdir/testdata/greppatN4 testNinputgrep >>testtrygrep\n\nprintf \"%c--------------------------- Test N5 ------------------------------\\r\\n\" - >>testtrygrep\n$valgrind $pcregrep -n --newline=any \"^(abc|def|ghi|jkl)\" testNinputgrep >>testtrygrep\n\nprintf \"%c--------------------------- Test N6 ------------------------------\\r\\n\" - >>testtrygrep\n$valgrind $pcregrep -n --newline=anycrlf \"^(abc|def|ghi|jkl)\" testNinputgrep >>testtrygrep\n\n$cf $srcdir/testdata/grepoutputN testtrygrep\nif [ $? != 0 ] ; then exit 1; fi\n\nexit 0\n\n# End\n"
  },
  {
    "path": "src/pcre/RunTest",
    "content": "#! /bin/sh\n\n###############################################################################\n# Run the PCRE tests using the pcretest program. The appropriate tests are\n# selected, depending on which build-time options were used.\n#\n# All tests are now run both with and without -s, to ensure that everything is\n# tested with and without studying. However, there are some tests that produce\n# different output after studying, typically when we are tracing the actual\n# matching process (for example, using auto-callouts). In these few cases, the\n# tests are duplicated in the files, one with /S to force studying always, and\n# one with /SS to force *not* studying always. The use of -s doesn't then make\n# any difference to their output. There is also one test which compiles invalid\n# UTF-8 with the UTF-8 check turned off; for this, studying must also be\n# disabled with /SS.\n#\n# When JIT support is available, all appropriate tests are also run with -s+ to\n# test (again, almost) everything with studying and the JIT option, unless\n# \"nojit\" is given on the command line. There are also two tests for\n# JIT-specific features, one to be run when JIT support is available (unless\n# \"nojit\" is specified), and one when it is not.\n#\n# Whichever of the 8-, 16- and 32-bit libraries exist are tested. It is also\n# possible to select which to test by giving \"-8\", \"-16\" or \"-32\" on the\n# command line.\n#\n# As well as \"nojit\", \"-8\", \"-16\", and \"-32\", arguments for this script are\n# individual test numbers, ranges of tests such as 3-6 or 3- (meaning 3 to the\n# end), or a number preceded by ~ to exclude a test. For example, \"3-15 ~10\"\n# runs tests 3 to 15, excluding test 10, and just \"~10\" runs all the tests\n# except test 10. Whatever order the arguments are in, the tests are always run\n# in numerical order.\n#\n# The special argument \"3S\" runs test 3, stopping if it fails. Test 3 is the\n# locale test, and failure usually means there's an issue with the locale\n# rather than a bug in PCRE, so normally subsequent tests are run. \"3S\" is\n# useful when you want to debug or update the test.\n#\n# Inappropriate tests are automatically skipped (with a comment to say so): for\n# example, if JIT support is not compiled, test 12 is skipped, whereas if JIT\n# support is compiled, test 13 is skipped.\n#\n# Other arguments can be one of the words \"valgrind\", \"valgrind-log\", or \"sim\"\n# followed by an argument to run cross-compiled executables under a simulator,\n# for example:\n#\n# RunTest 3 sim \"qemu-arm -s 8388608\"\n#\n# There are two special cases where only one argument is allowed:\n#\n# If the first and only argument is \"ebcdic\", the script runs the special\n# EBCDIC test that can be useful for checking certain EBCDIC features, even\n# when run in an ASCII environment.\n#\n# If the script is obeyed as \"RunTest list\", a list of available tests is\n# output, but none of them are run.\n###############################################################################\n\n# Define test titles in variables so that they can be output as a list. Some\n# of them are modified (e.g. with -8 or -16) when used in the actual tests.\n\ntitle1=\"Test 1: Main functionality (Compatible with Perl >= 5.10)\"\ntitle2=\"Test 2: API, errors, internals, and non-Perl stuff\"\ntitle3=\"Test 3: Locale-specific features\"\ntitle4A=\"Test 4: UTF\"\ntitle4B=\" support (Compatible with Perl >= 5.10)\"\ntitle5=\"Test 5: API, internals, and non-Perl stuff for UTF\"\ntitle6=\"Test 6: Unicode property support (Compatible with Perl >= 5.10)\"\ntitle7=\"Test 7: API, internals, and non-Perl stuff for Unicode property support\"\ntitle8=\"Test 8: DFA matching main functionality\"\ntitle9=\"Test 9: DFA matching with UTF\"\ntitle10=\"Test 10: DFA matching with Unicode properties\"\ntitle11=\"Test 11: Internal offsets and code size tests\"\ntitle12=\"Test 12: JIT-specific features (when JIT is available)\"\ntitle13=\"Test 13: JIT-specific features (when JIT is not available)\"\ntitle14=\"Test 14: Specials for the basic 8-bit library\"\ntitle15=\"Test 15: Specials for the 8-bit library with UTF-8 support\"\ntitle16=\"Test 16: Specials for the 8-bit library with Unicode propery support\"\ntitle17=\"Test 17: Specials for the basic 16/32-bit library\"\ntitle18=\"Test 18: Specials for the 16/32-bit library with UTF-16/32 support\"\ntitle19=\"Test 19: Specials for the 16/32-bit library with Unicode property support\"\ntitle20=\"Test 20: DFA specials for the basic 16/32-bit library\"\ntitle21=\"Test 21: Reloads for the basic 16/32-bit library\"\ntitle22=\"Test 22: Reloads for the 16/32-bit library with UTF-16/32 support\"\ntitle23=\"Test 23: Specials for the 16-bit library\"\ntitle24=\"Test 24: Specials for the 16-bit library with UTF-16 support\"\ntitle25=\"Test 25: Specials for the 32-bit library\"\ntitle26=\"Test 26: Specials for the 32-bit library with UTF-32 support\"\n\nmaxtest=26\n\nif [ $# -eq 1 -a \"$1\" = \"list\" ]; then\n  echo $title1\n  echo $title2 \"(not UTF)\"\n  echo $title3\n  echo $title4A $title4B\n  echo $title5 support\n  echo $title6\n  echo $title7\n  echo $title8\n  echo $title9\n  echo $title10\n  echo $title11\n  echo $title12\n  echo $title13\n  echo $title14\n  echo $title15\n  echo $title16\n  echo $title17\n  echo $title18\n  echo $title19\n  echo $title20\n  echo $title21\n  echo $title22\n  echo $title23\n  echo $title24\n  echo $title25\n  echo $title26\n  exit 0\nfi\n\n# Set up a suitable \"diff\" command for comparison. Some systems\n# have a diff that lacks a -u option. Try to deal with this.\n\ncf=\"diff\"\ndiff -u /dev/null /dev/null 2>/dev/null && cf=\"diff -u\"\n\n# Find the test data\n\nif [ -n \"$srcdir\" -a -d \"$srcdir\" ] ; then\n  testdata=\"$srcdir/testdata\"\nelif [ -d \"./testdata\" ] ; then\n  testdata=./testdata\nelif [ -d \"../testdata\" ] ; then\n  testdata=../testdata\nelse\n  echo \"Cannot find the testdata directory\"\n  exit 1\nfi\n\n\n# ------ Special EBCDIC Test -------\n\nif [ $# -eq 1 -a \"$1\" = \"ebcdic\" ]; then\n  ./pcretest -C ebcdic >/dev/null\n  ebcdic=$?\n  if [ $ebcdic -ne 1 ] ; then\n    echo \"Cannot run EBCDIC tests: EBCDIC support not compiled\"\n    exit 1\n  fi\n\n  for opt in \"\" \"-s\" \"-dfa\" \"-s -dfa\"; do\n    ./pcretest -q $opt $testdata/testinputEBC >testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutputEBC testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n    elif [ \"$opt\" = \"-dfa\" ] ; then echo \"  OK using DFA\"\n    elif [ \"$opt\" = \"-s -dfa\" ] ; then echo \"  OK using DFA with study\"\n    else echo \"  OK\"\n    fi\n  done\n\nexit 0\nfi\n\n\n# ------ Normal Tests ------\n\n# Default values\n\narg8=\narg16=\narg32=\nnojit=\nsim=\nskip=\nvalgrind=\nvjs=\n\n# This is in case the caller has set aliases (as I do - PH)\nunset cp ls mv rm\n\n# Process options and select which tests to run; for those that are explicitly\n# requested, check that the necessary optional facilities are available.\n\ndo1=no\ndo2=no\ndo3=no\ndo4=no\ndo5=no\ndo6=no\ndo7=no\ndo8=no\ndo9=no\ndo10=no\ndo11=no\ndo12=no\ndo13=no\ndo14=no\ndo15=no\ndo16=no\ndo17=no\ndo18=no\ndo19=no\ndo20=no\ndo21=no\ndo22=no\ndo23=no\ndo24=no\ndo25=no\ndo26=no\n\nwhile [ $# -gt 0 ] ; do\n  case $1 in\n    1) do1=yes;;\n    2) do2=yes;;\n    3) do3=yes;;\n    4) do4=yes;;\n    5) do5=yes;;\n    6) do6=yes;;\n    7) do7=yes;;\n    8) do8=yes;;\n    9) do9=yes;;\n   10) do10=yes;;\n   11) do11=yes;;\n   12) do12=yes;;\n   13) do13=yes;;\n   14) do14=yes;;\n   15) do15=yes;;\n   16) do16=yes;;\n   17) do17=yes;;\n   18) do18=yes;;\n   19) do19=yes;;\n   20) do20=yes;;\n   21) do21=yes;;\n   22) do22=yes;;\n   23) do23=yes;;\n   24) do24=yes;;\n   25) do25=yes;;\n   26) do26=yes;;\n   -8) arg8=yes;;\n  -16) arg16=yes;;\n  -32) arg32=yes;;\n   nojit) nojit=yes;;\n   sim) shift; sim=$1;;\n   valgrind) valgrind=\"valgrind --tool=memcheck -q --smc-check=all\";;\n   valgrind-log) valgrind=\"valgrind --tool=memcheck --num-callers=30 --leak-check=no --error-limit=no --smc-check=all --log-file=report.%p \";;\n   ~*)\n     if expr \"$1\" : '~[0-9][0-9]*$' >/dev/null; then\n       skip=\"$skip `expr \"$1\" : '~\\([0-9]*\\)*$'`\"\n     else\n       echo \"Unknown option or test selector '$1'\"; exit 1\n     fi\n   ;;\n   *-*)\n     if expr \"$1\" : '[0-9][0-9]*-[0-9]*$' >/dev/null; then\n       tf=`expr \"$1\" : '\\([0-9]*\\)'`\n       tt=`expr \"$1\" : '.*-\\([0-9]*\\)'`\n       if [ \"$tt\" = \"\" ] ; then tt=$maxtest; fi\n       if expr \\( \"$tf\" \"<\" 1 \\) \\| \\( \"$tt\" \">\" \"$maxtest\" \\) >/dev/null; then\n         echo \"Invalid test range '$1'\"; exit 1\n       fi\n       while expr \"$tf\" \"<=\" \"$tt\" >/dev/null; do\n         eval do${tf}=yes\n         tf=`expr $tf + 1`\n       done\n     else\n       echo \"Invalid test range '$1'\"; exit 1\n     fi\n   ;;\n   *) echo \"Unknown option or test selector '$1'\"; exit 1;;\n  esac\n  shift\ndone\n\n# Find which optional facilities are available.\n\n$sim ./pcretest -C linksize >/dev/null\nlink_size=$?\nif [ $link_size -lt 2 ] ; then\n  echo \"Failed to find internal link size\"\n  exit 1\nfi\nif [ $link_size -gt 4 ] ; then\n  echo \"Failed to find internal link size\"\n  exit 1\nfi\n\n# All of 8-bit, 16-bit, and 32-bit character strings may be supported, but only\n# one need be.\n\n$sim ./pcretest -C pcre8 >/dev/null\nsupport8=$?\n$sim ./pcretest -C pcre16 >/dev/null\nsupport16=$?\n$sim ./pcretest -C pcre32 >/dev/null\nsupport32=$?\n\n# Initialize all bitsizes skipped\n\ntest8=skip\ntest16=skip\ntest32=skip\n\n# If no bitsize arguments, select all that are available\n\nif [ \"$arg8$arg16$arg32\" = \"\" ] ; then\n  if [ $support8 -ne 0 ] ; then\n    test8=\n  fi\n  if [ $support16 -ne 0 ] ; then\n    test16=-16\n  fi\n  if [ $support32 -ne 0 ] ; then\n    test32=-32\n  fi\n\n# Select requested bit sizes\n\nelse\n  if [ \"$arg8\" = yes ] ; then\n    if [ $support8 -eq 0 ] ; then\n      echo \"Cannot run 8-bit library tests: 8-bit library not compiled\"\n      exit 1\n    fi\n    test8=\n  fi\n  if [ \"$arg16\" = yes ] ; then\n    if [ $support16 -eq 0 ] ; then\n      echo \"Cannot run 16-bit library tests: 16-bit library not compiled\"\n      exit 1\n    fi\n    test16=-16\n  fi\n  if [ \"$arg32\" = yes ] ; then\n    if [ $support32 -eq 0 ] ; then\n      echo \"Cannot run 32-bit library tests: 32-bit library not compiled\"\n      exit 1\n    fi\n    test32=-32\n  fi\nfi\n\n# UTF support always applies to all bit sizes if both are supported; we can't\n# have UTF-8 support without UTF-16 support (for example).\n\n$sim ./pcretest -C utf >/dev/null\nutf=$?\n\n$sim ./pcretest -C ucp >/dev/null\nucp=$?\n\njitopt=\n$sim ./pcretest -C jit >/dev/null\njit=$?\nif [ $jit -ne 0 -a \"$nojit\" != \"yes\" ] ; then\n  jitopt=-s+\n  if [ \"$valgrind\" != \"\" ] ; then\n    vjs=\"--suppressions=$testdata/valgrind-jit.supp\"\n  fi\nfi\n\n# If no specific tests were requested, select all. Those that are not\n# relevant will be automatically skipped.\n\nif [ $do1  = no -a $do2  = no -a $do3  = no -a $do4  = no -a \\\n     $do5  = no -a $do6  = no -a $do7  = no -a $do8  = no -a \\\n     $do9  = no -a $do10 = no -a $do11 = no -a $do12 = no -a \\\n     $do13 = no -a $do14 = no -a $do15 = no -a $do16 = no -a \\\n     $do17 = no -a $do18 = no -a $do19 = no -a $do20 = no -a \\\n     $do21 = no -a $do22 = no -a $do23 = no -a $do24 = no -a \\\n     $do25 = no -a $do26 = no ] ; then\n  do1=yes\n  do2=yes\n  do3=yes\n  do4=yes\n  do5=yes\n  do6=yes\n  do7=yes\n  do8=yes\n  do9=yes\n  do10=yes\n  do11=yes\n  do12=yes\n  do13=yes\n  do14=yes\n  do15=yes\n  do16=yes\n  do17=yes\n  do18=yes\n  do19=yes\n  do20=yes\n  do21=yes\n  do22=yes\n  do23=yes\n  do24=yes\n  do25=yes\n  do26=yes\nfi\n\n# Handle any explicit skips at this stage, so that an argument list may consist\n# only of explicit skips.\n\nfor i in $skip; do eval do$i=no; done\n\n# Show which release and which test data\n\necho \"\"\necho PCRE C library tests using test data from $testdata\n$sim ./pcretest /dev/null\n\nfor bmode in \"$test8\" \"$test16\" \"$test32\"; do\n  case \"$bmode\" in\n    skip) continue;;\n    -16)  if [ \"$test8$test32\" != \"skipskip\" ] ; then echo \"\"; fi\n          bits=16; echo \"---- Testing 16-bit library ----\"; echo \"\";;\n    -32)  if [ \"$test8$test16\" != \"skipskip\" ] ; then echo \"\"; fi\n          bits=32; echo \"---- Testing 32-bit library ----\"; echo \"\";;\n    *)    bits=8; echo \"---- Testing 8-bit library ----\"; echo \"\";;\n  esac\n\n# Primary test, compatible with JIT and all versions of Perl >= 5.8\n\nif [ $do1 = yes ] ; then\n  echo $title1\n  for opt in \"\" \"-s\" $jitopt; do\n    $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput1 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput1 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n    elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n    else echo \"  OK\"\n    fi\n  done\nfi\n\n# PCRE tests that are not JIT or Perl-compatible: API, errors, internals\n\nif [ $do2 = yes ] ; then\n  echo $title2 \"(not UTF-$bits)\"\n  for opt in \"\" \"-s\" $jitopt; do\n    $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput2 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput2 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else\n      echo \" \"\n      echo \"** Test 2 requires a lot of stack. If it has crashed with a\"\n      echo \"** segmentation fault, it may be that you do not have enough\"\n      echo \"** stack available by default. Please see the 'pcrestack' man\"\n      echo \"** page for a discussion of PCRE's stack usage.\"\n      echo \" \"\n      exit 1\n    fi\n    if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n    elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n    else echo \"  OK\"\n    fi\n  done\nfi\n\n# Locale-specific tests, provided that either the \"fr_FR\" or the \"french\"\n# locale is available. The former is the Unix-like standard; the latter is\n# for Windows. Another possibility is \"fr\". Unfortunately, different versions\n# of the French locale give different outputs for some items. This test passes\n# if the output matches any one of the alternative output files.\n\nif [ $do3 = yes ] ; then\n  locale -a | grep '^fr_FR$' >/dev/null\n  if [ $? -eq 0 ] ; then\n    locale=fr_FR\n    infile=$testdata/testinput3\n    outfile=$testdata/testoutput3\n    outfile2=$testdata/testoutput3A\n    outfile3=$testdata/testoutput3B\n  else\n    infile=test3input\n    outfile=test3output\n    outfile2=test3outputA\n    outfile3=test3outputB\n    locale -a | grep '^french$' >/dev/null\n    if [ $? -eq 0 ] ; then\n      locale=french\n      sed 's/fr_FR/french/' $testdata/testinput3 >test3input\n      sed 's/fr_FR/french/' $testdata/testoutput3 >test3output\n      sed 's/fr_FR/french/' $testdata/testoutput3A >test3outputA\n      sed 's/fr_FR/french/' $testdata/testoutput3B >test3outputB\n    else\n      locale -a | grep '^fr$' >/dev/null\n      if [ $? -eq 0 ] ; then\n        locale=fr\n        sed 's/fr_FR/fr/' $testdata/intestinput3 >test3input\n        sed 's/fr_FR/fr/' $testdata/intestoutput3 >test3output\n        sed 's/fr_FR/fr/' $testdata/intestoutput3A >test3outputA\n        sed 's/fr_FR/fr/' $testdata/intestoutput3B >test3outputB\n      else\n        locale=\n      fi\n    fi\n  fi\n\n  if [ \"$locale\" != \"\" ] ; then\n    echo $title3 \"(using '$locale' locale)\"\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $infile testtry\n      if [ $? = 0 ] ; then\n        if $cf $outfile testtry >teststdout || \\\n           $cf $outfile2 testtry >teststdout || \\\n           $cf $outfile3 testtry >teststdout\n        then\n          if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n          elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n          else echo \"  OK\"\n          fi\n        else\n          echo \"** Locale test did not run successfully. The output did not match\"\n          echo \"   $outfile, $outfile2 or $outfile3.\"\n          echo \"   This may mean that there is a problem with the locale settings rather\"\n          echo \"   than a bug in PCRE.\"\n          exit 1\n        fi\n      else exit 1\n      fi\n    done\n  else\n    echo \"Cannot test locale-specific features - none of the 'fr_FR', 'fr' or\"\n    echo \"'french' locales exist, or the \\\"locale\\\" command is not available\"\n    echo \"to check for them.\"\n    echo \" \"\n  fi\nfi\n\n# Additional tests for UTF support\n\nif [ $do4 = yes ] ; then\n  echo ${title4A}-${bits}${title4B}\n  if [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput4 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput4 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\nif [ $do5 = yes ] ; then\n  echo ${title5}-${bits} support\n  if [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput5 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput5 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\nif [ $do6 = yes ] ; then\n  echo $title6\n  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput6 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput6 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Test non-Perl-compatible Unicode property support\n\nif [ $do7 = yes ] ; then\n  echo $title7\n  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput7 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput7 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for DFA matching support\n\nif [ $do8 = yes ] ; then\n  echo $title8\n  for opt in \"\" \"-s\"; do\n    $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput8 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput8 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\" ; else echo \"  OK\"; fi\n  done\nfi\n\nif [ $do9 = yes ] ; then\n  echo ${title9}-${bits}\n  if [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    for opt in \"\" \"-s\"; do\n      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput9 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput9 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\" ; else echo \"  OK\"; fi\n    done\n  fi\nfi\n\nif [ $do10 = yes ] ; then\n  echo $title10\n  if [ $utf -eq 0 -o $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\"; do\n      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput10 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput10 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\" ; else echo \"  OK\"; fi\n    done\n  fi\nfi\n\n# Test of internal offsets and code sizes. This test is run only when there\n# is Unicode property support and the link size is 2. The actual tests are\n# mostly the same as in some of the above, but in this test we inspect some\n# offsets and sizes that require a known link size. This is a doublecheck for\n# the maintainer, just in case something changes unexpectely. The output from\n# this test is not the same in 8-bit and 16-bit modes.\n\nif [ $do11 = yes ] ; then\n  echo $title11\n  if [ $link_size -ne 2 ] ; then\n    echo \"  Skipped because link size is not 2\"\n  elif [ $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\"; do\n      $sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput11 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput11-$bits testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\" ; else echo \"  OK\"; fi\n    done\n  fi\nfi\n\n# Test JIT-specific features when JIT is available\n\nif [ $do12 = yes ] ; then\n  echo $title12\n  if [ $jit -eq 0 -o \"$nojit\" = \"yes\" ] ; then\n    echo \"  Skipped because JIT is not available or not usable\"\n  else\n    $sim $valgrind $vjs ./pcretest -q $bmode $testdata/testinput12 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput12 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\n# Test JIT-specific features when JIT is not available\n\nif [ $do13 = yes ] ; then\n  echo $title13\n  if [ $jit -ne 0 ] ; then\n    echo \"  Skipped because JIT is available\"\n  else\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput13 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput13 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\n# Tests for 8-bit-specific features\n\nif [ \"$do14\" = yes ] ; then\n  echo $title14\n  if [ \"$bits\" = \"16\" -o \"$bits\" = \"32\" ] ; then\n    echo \"  Skipped when running 16/32-bit tests\"\n  else\n    cp -f $testdata/saved16 testsaved16\n    cp -f $testdata/saved32 testsaved32\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput14 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput14 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 8-bit-specific features (needs UTF-8 support)\n\nif [ \"$do15\" = yes ] ; then\n  echo $title15\n  if [ \"$bits\" = \"16\" -o \"$bits\" = \"32\" ] ; then\n    echo \"  Skipped when running 16/32-bit tests\"\n  elif [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput15 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput15 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 8-bit-specific features (Unicode property support)\n\nif [ $do16 = yes ] ; then\n  echo $title16\n  if [ \"$bits\" = \"16\" -o \"$bits\" = \"32\" ] ; then\n    echo \"  Skipped when running 16/32-bit tests\"\n  elif [ $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput16 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput16 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 16/32-bit-specific features\n\nif [ $do17 = yes ] ; then\n  echo $title17\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput17 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput17 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 16/32-bit-specific features (UTF-16/32 support)\n\nif [ $do18 = yes ] ; then\n  echo $title18\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  elif [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput18 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput18-$bits testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 16/32-bit-specific features (Unicode property support)\n\nif [ $do19 = yes ] ; then\n  echo $title19\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  elif [ $ucp -eq 0 ] ; then\n    echo \"  Skipped because Unicode property support is not available\"\n  else\n    for opt in \"\" \"-s\" $jitopt; do\n      $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput19 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput19 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      elif [ \"$opt\" = \"-s+\" ] ; then echo \"  OK with JIT study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for 16/32-bit-specific features in DFA non-UTF-16/32 mode\n\nif [ $do20 = yes ] ; then\n  echo $title20\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  else\n    for opt in \"\" \"-s\"; do\n      $sim $valgrind ./pcretest -q $bmode $opt -dfa $testdata/testinput20 testtry\n      if [ $? = 0 ] ; then\n        $cf $testdata/testoutput20 testtry\n        if [ $? != 0 ] ; then exit 1; fi\n      else exit 1\n      fi\n      if [ \"$opt\" = \"-s\" ] ; then echo \"  OK with study\"\n      else echo \"  OK\"\n      fi\n    done\n  fi\nfi\n\n# Tests for reloads with 16/32-bit library\n\nif [ $do21 = yes ] ; then\n  echo $title21\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  elif [ $link_size -ne 2 ] ; then\n    echo \"  Skipped because link size is not 2\"\n  else\n    cp -f $testdata/saved8 testsaved8\n    cp -f $testdata/saved16LE-1 testsaved16LE-1\n    cp -f $testdata/saved16BE-1 testsaved16BE-1\n    cp -f $testdata/saved32LE-1 testsaved32LE-1\n    cp -f $testdata/saved32BE-1 testsaved32BE-1\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput21 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput21-$bits testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\n# Tests for reloads with 16/32-bit library (UTF-16 support)\n\nif [ $do22 = yes ] ; then\n  echo $title22\n  if [ \"$bits\" = \"8\" ] ; then\n    echo \"  Skipped when running 8-bit tests\"\n  elif [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  elif [ $link_size -ne 2 ] ; then\n    echo \"  Skipped because link size is not 2\"\n  else\n    cp -f $testdata/saved16LE-2 testsaved16LE-2\n    cp -f $testdata/saved16BE-2 testsaved16BE-2\n    cp -f $testdata/saved32LE-2 testsaved32LE-2\n    cp -f $testdata/saved32BE-2 testsaved32BE-2\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput22 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput22-$bits testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\nif [ $do23 = yes ] ; then\n  echo $title23\n  if [ \"$bits\" = \"8\" -o \"$bits\" = \"32\" ] ; then\n    echo \"  Skipped when running 8/32-bit tests\"\n  else\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput23 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput23 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\nif [ $do24 = yes ] ; then\n  echo $title24\n  if [ \"$bits\" = \"8\" -o \"$bits\" = \"32\" ] ; then\n    echo \"  Skipped when running 8/32-bit tests\"\n  elif [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput24 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput24 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\nif [ $do25 = yes ] ; then\n  echo $title25\n  if [ \"$bits\" = \"8\" -o \"$bits\" = \"16\" ] ; then\n    echo \"  Skipped when running 8/16-bit tests\"\n  else\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput25 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput25 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\nif [ $do26 = yes ] ; then\n  echo $title26\n  if [ \"$bits\" = \"8\" -o \"$bits\" = \"16\" ] ; then\n    echo \"  Skipped when running 8/16-bit tests\"\n  elif [ $utf -eq 0 ] ; then\n    echo \"  Skipped because UTF-$bits support is not available\"\n  else\n    $sim $valgrind ./pcretest -q $bmode $testdata/testinput26 testtry\n    if [ $? = 0 ] ; then\n      $cf $testdata/testoutput26 testtry\n      if [ $? != 0 ] ; then exit 1; fi\n    else exit 1\n    fi\n    echo \"  OK\"\n  fi\nfi\n\n# End of loop for 8/16/32-bit tests\ndone\n\n# Clean up local working files\nrm -f test3input test3output test3outputA testNinput testsaved* teststderr teststdout testtry\n\n# End\n"
  },
  {
    "path": "src/pcre/RunTest.bat",
    "content": "@echo off\r\n@rem This file must use CRLF linebreaks to function properly\r\n@rem and requires both pcretest and pcregrep\r\n@rem  This file was originally contributed by Ralf Junker, and touched up by\r\n@rem  Daniel Richard G. Tests 10-12 added by Philip H.\r\n@rem  Philip H also changed test 3 to use \"wintest\" files.\r\n@rem\r\n@rem  Updated by Tom Fortmann to support explicit test numbers on the command line.\r\n@rem  Added argument validation and added error reporting.\r\n@rem\r\n@rem  MS Windows batch file to run pcretest on testfiles with the correct\r\n@rem  options.\r\n@rem\r\n@rem Sheri Pierce added logic to skip feature dependent tests\r\n@rem tests 4 5 9 15 and 18 require utf support\r\n@rem tests 6 7 10 16 and 19 require ucp support\r\n@rem 11 requires ucp and link size 2\r\n@rem 12 requires presence of jit support\r\n@rem 13 requires absence of jit support\r\n@rem Sheri P also added override tests for study and jit testing\r\n@rem Zoltan Herczeg added libpcre16 support\r\n@rem Zoltan Herczeg added libpcre32 support\r\n\r\nsetlocal enabledelayedexpansion\r\nif [%srcdir%]==[] (\r\nif exist testdata\\ set srcdir=.)\r\nif [%srcdir%]==[] (\r\nif exist ..\\testdata\\ set srcdir=..)\r\nif [%srcdir%]==[] (\r\nif exist ..\\..\\testdata\\ set srcdir=..\\..)\r\nif NOT exist %srcdir%\\testdata\\ (\r\nError: echo distribution testdata folder not found!\r\ncall :conferror\r\nexit /b 1\r\ngoto :eof\r\n)\r\n\r\nif [%pcretest%]==[] set pcretest=.\\pcretest.exe\r\n\r\necho source dir is %srcdir%\r\necho pcretest=%pcretest%\r\n\r\nif NOT exist %pcretest% (\r\necho Error: %pcretest% not found!\r\necho.\r\ncall :conferror\r\nexit /b 1\r\n)\r\n\r\n%pcretest% -C linksize >NUL\r\nset link_size=%ERRORLEVEL%\r\n%pcretest% -C pcre8 >NUL\r\nset support8=%ERRORLEVEL%\r\n%pcretest% -C pcre16 >NUL\r\nset support16=%ERRORLEVEL%\r\n%pcretest% -C pcre32 >NUL\r\nset support32=%ERRORLEVEL%\r\n%pcretest% -C utf >NUL\r\nset utf=%ERRORLEVEL%\r\n%pcretest% -C ucp >NUL\r\nset ucp=%ERRORLEVEL%\r\n%pcretest% -C jit >NUL\r\nset jit=%ERRORLEVEL%\r\n\r\nif %support8% EQU 1 (\r\nif not exist testout8 md testout8\r\nif not exist testoutstudy8 md testoutstudy8\r\nif not exist testoutjit8 md testoutjit8\r\n)\r\n\r\nif %support16% EQU 1 (\r\nif not exist testout16 md testout16\r\nif not exist testoutstudy16 md testoutstudy16\r\nif not exist testoutjit16 md testoutjit16\r\n)\r\n\r\nif %support16% EQU 1 (\r\nif not exist testout32 md testout32\r\nif not exist testoutstudy32 md testoutstudy32\r\nif not exist testoutjit32 md testoutjit32\r\n)\r\n\r\nset do1=no\r\nset do2=no\r\nset do3=no\r\nset do4=no\r\nset do5=no\r\nset do6=no\r\nset do7=no\r\nset do8=no\r\nset do9=no\r\nset do10=no\r\nset do11=no\r\nset do12=no\r\nset do13=no\r\nset do14=no\r\nset do15=no\r\nset do16=no\r\nset do17=no\r\nset do18=no\r\nset do19=no\r\nset do20=no\r\nset do21=no\r\nset do22=no\r\nset do23=no\r\nset do24=no\r\nset do25=no\r\nset do26=no\r\nset all=yes\r\n\r\nfor %%a in (%*) do (\r\n  set valid=no\r\n  for %%v in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26) do if %%v == %%a set valid=yes\r\n  if \"!valid!\" == \"yes\" (\r\n    set do%%a=yes\r\n    set all=no\r\n) else (\r\n    echo Invalid test number - %%a!\r\n        echo Usage %0 [ test_number ] ...\r\n        echo Where test_number is one or more optional test numbers 1 through 26, default is all tests.\r\n        exit /b 1\r\n)\r\n)\r\nset failed=\"no\"\r\n\r\nif \"%all%\" == \"yes\" (\r\n  set do1=yes\r\n  set do2=yes\r\n  set do3=yes\r\n  set do4=yes\r\n  set do5=yes\r\n  set do6=yes\r\n  set do7=yes\r\n  set do8=yes\r\n  set do9=yes\r\n  set do10=yes\r\n  set do11=yes\r\n  set do12=yes\r\n  set do13=yes\r\n  set do14=yes\r\n  set do15=yes\r\n  set do16=yes\r\n  set do17=yes\r\n  set do18=yes\r\n  set do19=yes\r\n  set do20=yes\r\n  set do21=yes\r\n  set do22=yes\r\n  set do23=yes\r\n  set do24=yes\r\n  set do25=yes\r\n  set do26=yes\r\n)\r\n\r\n@echo RunTest.bat's pcretest output is written to newly created subfolders named\r\n@echo testout, testoutstudy and testoutjit.\r\n@echo.\r\n\r\nset mode=\r\nset bits=8\r\n\r\n:nextMode\r\nif \"%mode%\" == \"\" (\r\n  if %support8% EQU 0 goto modeSkip\r\n  echo.\r\n  echo ---- Testing 8-bit library ----\r\n  echo.\r\n)\r\nif \"%mode%\" == \"-16\" (\r\n  if %support16% EQU 0 goto modeSkip\r\n  echo.\r\n  echo ---- Testing 16-bit library ----\r\n  echo.\r\n)\r\nif \"%mode%\" == \"-32\" (\r\n  if %support32% EQU 0 goto modeSkip\r\n  echo.\r\n  echo ---- Testing 32-bit library ----\r\n  echo.\r\n)\r\nif \"%do1%\" == \"yes\" call :do1\r\nif \"%do2%\" == \"yes\" call :do2\r\nif \"%do3%\" == \"yes\" call :do3\r\nif \"%do4%\" == \"yes\" call :do4\r\nif \"%do5%\" == \"yes\" call :do5\r\nif \"%do6%\" == \"yes\" call :do6\r\nif \"%do7%\" == \"yes\" call :do7\r\nif \"%do8%\" == \"yes\" call :do8\r\nif \"%do9%\" == \"yes\" call :do9\r\nif \"%do10%\" == \"yes\" call :do10\r\nif \"%do11%\" == \"yes\" call :do11\r\nif \"%do12%\" == \"yes\" call :do12\r\nif \"%do13%\" == \"yes\" call :do13\r\nif \"%do14%\" == \"yes\" call :do14\r\nif \"%do15%\" == \"yes\" call :do15\r\nif \"%do16%\" == \"yes\" call :do16\r\nif \"%do17%\" == \"yes\" call :do17\r\nif \"%do18%\" == \"yes\" call :do18\r\nif \"%do19%\" == \"yes\" call :do19\r\nif \"%do20%\" == \"yes\" call :do20\r\nif \"%do21%\" == \"yes\" call :do21\r\nif \"%do22%\" == \"yes\" call :do22\r\nif \"%do23%\" == \"yes\" call :do23\r\nif \"%do24%\" == \"yes\" call :do24\r\nif \"%do25%\" == \"yes\" call :do25\r\nif \"%do26%\" == \"yes\" call :do26\r\n:modeSkip\r\nif \"%mode%\" == \"\" (\r\n  set mode=-16\r\n  set bits=16\r\n  goto nextMode\r\n)\r\nif \"%mode%\" == \"-16\" (\r\n  set mode=-32\r\n  set bits=32\r\n  goto nextMode\r\n)\r\n\r\n@rem If mode is -32, testing is finished\r\nif %failed% == \"yes\" (\r\necho In above output, one or more of the various tests failed!\r\nexit /b 1\r\n)\r\necho All OK\r\ngoto :eof\r\n\r\n:runsub\r\n@rem Function to execute pcretest and compare the output\r\n@rem Arguments are as follows:\r\n@rem\r\n@rem       1 = test number\r\n@rem       2 = outputdir\r\n@rem       3 = test name use double quotes\r\n@rem   4 - 9 = pcretest options\r\n\r\nif [%1] == [] (\r\n  echo Missing test number argument!\r\n  exit /b 1\r\n)\r\n\r\nif [%2] == [] (\r\n  echo Missing outputdir!\r\n  exit /b 1\r\n)\r\n\r\nif [%3] == [] (\r\n  echo Missing test name argument!\r\n  exit /b 1\r\n)\r\n\r\nset testinput=testinput%1\r\nset testoutput=testoutput%1\r\nif exist %srcdir%\\testdata\\win%testinput% (\r\n  set testinput=wintestinput%1\r\n  set testoutput=wintestoutput%1\r\n)\r\n\r\necho Test %1: %3\r\n%pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\\testdata\\%testinput% >%2%bits%\\%testoutput%\r\nif errorlevel 1 (\r\n  echo.          failed executing command-line:\r\n  echo.            %pcretest% %mode% %4 %5 %6 %7 %8 %9 %srcdir%\\testdata\\%testinput% ^>%2%bits%\\%testoutput%\r\n  set failed=\"yes\"\r\n  goto :eof\r\n)\r\n\r\nset type=\r\nif [%1]==[11] (\r\n  set type=-%bits%\r\n)\r\nif [%1]==[18] (\r\n  set type=-%bits%\r\n)\r\nif [%1]==[21] (\r\n  set type=-%bits%\r\n)\r\nif [%1]==[22] (\r\n  set type=-%bits%\r\n)\r\n\r\nfc /n %srcdir%\\testdata\\%testoutput%%type% %2%bits%\\%testoutput% >NUL\r\n\r\nif errorlevel 1 (\r\n  echo.          failed comparison: fc /n %srcdir%\\testdata\\%testoutput% %2%bits%\\%testoutput%\r\n  if [%1]==[2] (\r\n    echo.\r\n    echo ** Test 2 requires a lot of stack. PCRE can be configured to\r\n    echo ** use heap for recursion. Otherwise, to pass Test 2\r\n    echo ** you generally need to allocate 8 mb stack to PCRE.\r\n    echo ** See the 'pcrestack' page for a discussion of PCRE's\r\n    echo ** stack usage.\r\n    echo.\r\n)\r\n  if [%1]==[3] (\r\n    echo.\r\n    echo ** Test 3 failure usually means french locale is not\r\n    echo ** available on the system, rather than a bug or problem with PCRE.\r\n    echo.\r\n    goto :eof\r\n)\r\n\r\n  set failed=\"yes\"\r\n  goto :eof\r\n)\r\n\r\necho.          Passed.\r\ngoto :eof\r\n\r\n:do1\r\ncall :runsub 1 testout \"Main functionality (Compatible with Perl >= 5.10)\" -q\r\ncall :runsub 1 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 1 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do2\r\n  call :runsub 2 testout \"API, errors, internals, and non-Perl stuff\" -q\r\n  call :runsub 2 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 2 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do3\r\n  call :runsub 3 testout \"Locale-specific features\" -q\r\n  call :runsub 3 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 3 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do4\r\nif %utf% EQU 0 (\r\n  echo Test 4 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\n  call :runsub 4 testout \"UTF-%bits% support - (Compatible with Perl >= 5.10)\" -q\r\n  call :runsub 4 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 4 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do5\r\nif %utf% EQU 0 (\r\n  echo Test 5 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\n  call :runsub 5 testout \"API, internals, and non-Perl stuff for UTF-%bits%\" -q\r\n  call :runsub 5 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 5 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do6\r\nif %ucp% EQU 0 (\r\n  echo Test 6 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 6 testout \"Unicode property support (Compatible with Perl >= 5.10)\" -q\r\n  call :runsub 6 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 6 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do7\r\nif %ucp% EQU 0 (\r\n  echo Test 7 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 7 testout \"API, internals, and non-Perl stuff for Unicode property support\" -q\r\n  call :runsub 7 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 7 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do8\r\n  call :runsub 8 testout \"DFA matching main functionality\" -q -dfa\r\n  call :runsub 8 testoutstudy \"Test with Study Override\" -q -dfa -s\r\ngoto :eof\r\n\r\n:do9\r\nif %utf% EQU 0 (\r\n  echo Test 9 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\n  call :runsub 9 testout \"DFA matching with UTF-%bits%\" -q -dfa\r\n  call :runsub 9 testoutstudy \"Test with Study Override\" -q -dfa -s\r\n  goto :eof\r\n\r\n:do10\r\nif %ucp% EQU 0 (\r\n  echo Test 10 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 10 testout \"DFA matching with Unicode properties\" -q -dfa\r\n  call :runsub 10 testoutstudy \"Test with Study Override\" -q -dfa -s\r\ngoto :eof\r\n\r\n:do11\r\nif NOT %link_size% EQU 2 (\r\n  echo Test 11 Skipped because link size is not 2.\r\n  goto :eof\r\n)\r\nif %ucp% EQU 0 (\r\n  echo Test 11 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 11 testout \"Internal offsets and code size tests\" -q\r\n  call :runsub 11 testoutstudy \"Test with Study Override\" -q -s\r\ngoto :eof\r\n\r\n:do12\r\nif %jit% EQU 0 (\r\n  echo Test 12 Skipped due to absence of JIT support.\r\n  goto :eof\r\n)\r\n  call :runsub 12 testout \"JIT-specific features (JIT available)\" -q\r\ngoto :eof\r\n\r\n:do13\r\nif %jit% EQU 1 (\r\n  echo Test 13 Skipped due to presence of JIT support.\r\n  goto :eof\r\n)\r\n  call :runsub 13 testout \"JIT-specific features (JIT not available)\" -q\r\ngoto :eof\r\n\r\n:do14\r\nif NOT %bits% EQU 8 (\r\n  echo Test 14 Skipped when running 16/32-bit tests.\r\n  goto :eof\r\n)\r\n  copy /Y %srcdir%\\testdata\\saved16 testsaved16\r\n  copy /Y %srcdir%\\testdata\\saved32 testsaved32\r\n  call :runsub 14 testout \"Specials for the basic 8-bit library\" -q\r\n  call :runsub 14 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 14 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do15\r\nif NOT %bits% EQU 8 (\r\n  echo Test 15 Skipped when running 16/32-bit tests.\r\n  goto :eof\r\n)\r\nif %utf% EQU 0 (\r\n  echo Test 15 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\n  call :runsub 15 testout \"Specials for the 8-bit library with UTF-%bits% support\" -q\r\n  call :runsub 15 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 15 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do16\r\nif NOT %bits% EQU 8 (\r\n  echo Test 16 Skipped when running 16/32-bit tests.\r\n  goto :eof\r\n)\r\nif %ucp% EQU 0 (\r\n  echo Test 16 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 16 testout \"Specials for the 8-bit library with Unicode propery support\" -q\r\n  call :runsub 16 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 16 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do17\r\nif %bits% EQU 8 (\r\n  echo Test 17 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\n  call :runsub 17 testout \"Specials for the basic 16/32-bit library\" -q\r\n  call :runsub 17 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 17 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do18\r\nif %bits% EQU 8 (\r\n  echo Test 18 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\nif %utf% EQU 0 (\r\n  echo Test 18 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\n  call :runsub 18 testout \"Specials for the 16/32-bit library with UTF-%bits% support\" -q\r\n  call :runsub 18 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 18 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do19\r\nif %bits% EQU 8 (\r\n  echo Test 19 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\nif %ucp% EQU 0 (\r\n  echo Test 19 Skipped due to absence of Unicode property support.\r\n  goto :eof\r\n)\r\n  call :runsub 19 testout \"Specials for the 16/32-bit library with Unicode property support\" -q\r\n  call :runsub 19 testoutstudy \"Test with Study Override\" -q -s\r\n  if %jit% EQU 1 call :runsub 19 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do20\r\nif %bits% EQU 8 (\r\n  echo Test 20 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\n  call :runsub 20 testout \"DFA specials for the basic 16/32-bit library\" -q -dfa\r\n  call :runsub 20 testoutstudy \"Test with Study Override\" -q -dfa -s\r\ngoto :eof\r\n\r\n:do21\r\nif %bits% EQU 8 (\r\n  echo Test 21 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\nif NOT %link_size% EQU 2 (\r\n  echo Test 21 Skipped because link size is not 2.\r\n  goto :eof\r\n)\r\ncopy /Y %srcdir%\\testdata\\saved8 testsaved8\r\ncopy /Y %srcdir%\\testdata\\saved16LE-1 testsaved16LE-1\r\ncopy /Y %srcdir%\\testdata\\saved16BE-1 testsaved16BE-1\r\ncopy /Y %srcdir%\\testdata\\saved32LE-1 testsaved32LE-1\r\ncopy /Y %srcdir%\\testdata\\saved32BE-1 testsaved32BE-1\r\ncall :runsub 21 testout \"Reloads for the basic 16/32-bit library\" -q\r\ncall :runsub 21 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 21 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do22\r\nif %bits% EQU 8 (\r\n  echo Test 22 Skipped when running 8-bit tests.\r\n  goto :eof\r\n)\r\nif %utf% EQU 0 (\r\n  echo Test 22 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\nif NOT %link_size% EQU 2 (\r\n  echo Test 22 Skipped because link size is not 2.\r\n  goto :eof\r\n)\r\ncopy /Y %srcdir%\\testdata\\saved16LE-2 testsaved16LE-2\r\ncopy /Y %srcdir%\\testdata\\saved16BE-2 testsaved16BE-2\r\ncopy /Y %srcdir%\\testdata\\saved32LE-2 testsaved32LE-2\r\ncopy /Y %srcdir%\\testdata\\saved32BE-2 testsaved32BE-2\r\ncall :runsub 22 testout \"Reloads for the 16/32-bit library with UTF-16/32 support\" -q\r\ncall :runsub 22 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 22 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do23\r\nif NOT %bits% EQU 16 (\r\n  echo Test 23 Skipped when running 8/32-bit tests.\r\n  goto :eof\r\n)\r\ncall :runsub 23 testout \"Specials for the 16-bit library\" -q\r\ncall :runsub 23 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 23 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do24\r\nif NOT %bits% EQU 16 (\r\n  echo Test 24 Skipped when running 8/32-bit tests.\r\n  goto :eof\r\n)\r\nif %utf% EQU 0 (\r\n  echo Test 24 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\ncall :runsub 24 testout \"Specials for the 16-bit library with UTF-16 support\" -q\r\ncall :runsub 24 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 24 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do25\r\nif NOT %bits% EQU 32 (\r\n  echo Test 25 Skipped when running 8/16-bit tests.\r\n  goto :eof\r\n)\r\ncall :runsub 25 testout \"Specials for the 32-bit library\" -q\r\ncall :runsub 25 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 25 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:do26\r\nif NOT %bits% EQU 32 (\r\n  echo Test 26 Skipped when running 8/16-bit tests.\r\n  goto :eof\r\n)\r\nif %utf% EQU 0 (\r\n  echo Test 26 Skipped due to absence of UTF-%bits% support.\r\n  goto :eof\r\n)\r\ncall :runsub 26 testout \"Specials for the 32-bit library with UTF-32 support\" -q\r\ncall :runsub 26 testoutstudy \"Test with Study Override\" -q -s\r\nif %jit% EQU 1 call :runsub 26 testoutjit \"Test with JIT Override\" -q -s+\r\ngoto :eof\r\n\r\n:conferror\r\n@echo.\r\n@echo Either your build is incomplete or you have a configuration error.\r\n@echo.\r\n@echo If configured with cmake and executed via \"make test\" or the MSVC \"RUN_TESTS\"\r\n@echo project, pcre_test.bat defines variables and automatically calls RunTest.bat.\r\n@echo For manual testing of all available features, after configuring with cmake\r\n@echo and building, you can run the built pcre_test.bat. For best results with\r\n@echo cmake builds and tests avoid directories with full path names that include\r\n@echo spaces for source or build.\r\n@echo.\r\n@echo Otherwise, if the build dir is in a subdir of the source dir, testdata needed\r\n@echo for input and verification should be found automatically when (from the\r\n@echo location of the the built exes) you call RunTest.bat. By default RunTest.bat\r\n@echo runs all tests compatible with the linked pcre library but it can be given\r\n@echo a test number as an argument.\r\n@echo.\r\n@echo If the build dir is not under the source dir you can either copy your exes\r\n@echo to the source folder or copy RunTest.bat and the testdata folder to the\r\n@echo location of your built exes and then run RunTest.bat.\r\n@echo.\r\ngoto :eof\r\n"
  },
  {
    "path": "src/pcre/aclocal.m4",
    "content": "# generated automatically by aclocal 1.16.1 -*- Autoconf -*-\n\n# Copyright (C) 1996-2018 Free Software Foundation, Inc.\n\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,\n[m4_warning([this file was generated for autoconf 2.69.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically 'autoreconf'.])])\n\n# pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-\n# serial 11 (pkg-config-0.29.1)\n\ndnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.\ndnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>\ndnl\ndnl This program is free software; you can redistribute it and/or modify\ndnl it under the terms of the GNU General Public License as published by\ndnl the Free Software Foundation; either version 2 of the License, or\ndnl (at your option) any later version.\ndnl\ndnl This program is distributed in the hope that it will be useful, but\ndnl WITHOUT ANY WARRANTY; without even the implied warranty of\ndnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\ndnl General Public License for more details.\ndnl\ndnl You should have received a copy of the GNU General Public License\ndnl along with this program; if not, write to the Free Software\ndnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\ndnl 02111-1307, USA.\ndnl\ndnl As a special exception to the GNU General Public License, if you\ndnl distribute this file as part of a program that contains a\ndnl configuration script generated by Autoconf, you may include it under\ndnl the same distribution terms that you use for the rest of that\ndnl program.\n\ndnl PKG_PREREQ(MIN-VERSION)\ndnl -----------------------\ndnl Since: 0.29\ndnl\ndnl Verify that the version of the pkg-config macros are at least\ndnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's\ndnl installed version of pkg-config, this checks the developer's version\ndnl of pkg.m4 when generating configure.\ndnl\ndnl To ensure that this macro is defined, also add:\ndnl m4_ifndef([PKG_PREREQ],\ndnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])\ndnl\ndnl See the \"Since\" comment for each macro you use to see what version\ndnl of the macros you require.\nm4_defun([PKG_PREREQ],\n[m4_define([PKG_MACROS_VERSION], [0.29.1])\nm4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,\n    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])\n])dnl PKG_PREREQ\n\ndnl PKG_PROG_PKG_CONFIG([MIN-VERSION])\ndnl ----------------------------------\ndnl Since: 0.16\ndnl\ndnl Search for the pkg-config tool and set the PKG_CONFIG variable to\ndnl first found in the path. Checks that the version of pkg-config found\ndnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is\ndnl used since that's the first version where most current features of\ndnl pkg-config existed.\nAC_DEFUN([PKG_PROG_PKG_CONFIG],\n[m4_pattern_forbid([^_?PKG_[A-Z_]+$])\nm4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])\nm4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])\nAC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])\nAC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])\nAC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tAC_PATH_TOOL([PKG_CONFIG], [pkg-config])\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=m4_default([$1], [0.9.0])\n\tAC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\tAC_MSG_RESULT([yes])\n\telse\n\t\tAC_MSG_RESULT([no])\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi[]dnl\n])dnl PKG_PROG_PKG_CONFIG\n\ndnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])\ndnl -------------------------------------------------------------------\ndnl Since: 0.18\ndnl\ndnl Check to see whether a particular set of modules exists. Similar to\ndnl PKG_CHECK_MODULES(), but does not set variables or print errors.\ndnl\ndnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])\ndnl only at the first occurence in configure.ac, so if the first place\ndnl it's called might be skipped (such as if it is within an \"if\", you\ndnl have to call PKG_CHECK_EXISTS manually\nAC_DEFUN([PKG_CHECK_EXISTS],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nif test -n \"$PKG_CONFIG\" && \\\n    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors \"$1\"]); then\n  m4_default([$2], [:])\nm4_ifvaln([$3], [else\n  $3])dnl\nfi])\n\ndnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])\ndnl ---------------------------------------------\ndnl Internal wrapper calling pkg-config via PKG_CONFIG and setting\ndnl pkg_failed based on the result.\nm4_define([_PKG_CONFIG],\n[if test -n \"$$1\"; then\n    pkg_cv_[]$1=\"$$1\"\n elif test -n \"$PKG_CONFIG\"; then\n    PKG_CHECK_EXISTS([$3],\n                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 \"$3\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes ],\n\t\t     [pkg_failed=yes])\n else\n    pkg_failed=untried\nfi[]dnl\n])dnl _PKG_CONFIG\n\ndnl _PKG_SHORT_ERRORS_SUPPORTED\ndnl ---------------------------\ndnl Internal check to see if pkg-config supports short errors.\nAC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi[]dnl\n])dnl _PKG_SHORT_ERRORS_SUPPORTED\n\n\ndnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],\ndnl   [ACTION-IF-NOT-FOUND])\ndnl --------------------------------------------------------------\ndnl Since: 0.4.0\ndnl\ndnl Note that if there is a possibility the first call to\ndnl PKG_CHECK_MODULES might not happen, you should be sure to include an\ndnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac\nAC_DEFUN([PKG_CHECK_MODULES],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nAC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl\nAC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl\n\npkg_failed=no\nAC_MSG_CHECKING([for $1])\n\n_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])\n_PKG_CONFIG([$1][_LIBS], [libs], [$2])\n\nm4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS\nand $1[]_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.])\n\nif test $pkg_failed = yes; then\n   \tAC_MSG_RESULT([no])\n        _PKG_SHORT_ERRORS_SUPPORTED\n        if test $_pkg_short_errors_supported = yes; then\n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"$2\" 2>&1`\n        else \n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"$2\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$$1[]_PKG_ERRORS\" >&AS_MESSAGE_LOG_FD\n\n\tm4_default([$4], [AC_MSG_ERROR(\n[Package requirements ($2) were not met:\n\n$$1_PKG_ERRORS\n\nConsider adjusting the PKG_CONFIG_PATH environment variable if you\ninstalled software in a non-standard prefix.\n\n_PKG_TEXT])[]dnl\n        ])\nelif test $pkg_failed = untried; then\n     \tAC_MSG_RESULT([no])\n\tm4_default([$4], [AC_MSG_FAILURE(\n[The pkg-config script could not be found or is too old.  Make sure it\nis in your PATH or set the PKG_CONFIG environment variable to the full\npath to pkg-config.\n\n_PKG_TEXT\n\nTo get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl\n        ])\nelse\n\t$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS\n\t$1[]_LIBS=$pkg_cv_[]$1[]_LIBS\n        AC_MSG_RESULT([yes])\n\t$3\nfi[]dnl\n])dnl PKG_CHECK_MODULES\n\n\ndnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],\ndnl   [ACTION-IF-NOT-FOUND])\ndnl ---------------------------------------------------------------------\ndnl Since: 0.29\ndnl\ndnl Checks for existence of MODULES and gathers its build flags with\ndnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags\ndnl and VARIABLE-PREFIX_LIBS from --libs.\ndnl\ndnl Note that if there is a possibility the first call to\ndnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to\ndnl include an explicit call to PKG_PROG_PKG_CONFIG in your\ndnl configure.ac.\nAC_DEFUN([PKG_CHECK_MODULES_STATIC],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\n_save_PKG_CONFIG=$PKG_CONFIG\nPKG_CONFIG=\"$PKG_CONFIG --static\"\nPKG_CHECK_MODULES($@)\nPKG_CONFIG=$_save_PKG_CONFIG[]dnl\n])dnl PKG_CHECK_MODULES_STATIC\n\n\ndnl PKG_INSTALLDIR([DIRECTORY])\ndnl -------------------------\ndnl Since: 0.27\ndnl\ndnl Substitutes the variable pkgconfigdir as the location where a module\ndnl should install pkg-config .pc files. By default the directory is\ndnl $libdir/pkgconfig, but the default can be changed by passing\ndnl DIRECTORY. The user can override through the --with-pkgconfigdir\ndnl parameter.\nAC_DEFUN([PKG_INSTALLDIR],\n[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])\nm4_pushdef([pkg_description],\n    [pkg-config installation directory @<:@]pkg_default[@:>@])\nAC_ARG_WITH([pkgconfigdir],\n    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,\n    [with_pkgconfigdir=]pkg_default)\nAC_SUBST([pkgconfigdir], [$with_pkgconfigdir])\nm4_popdef([pkg_default])\nm4_popdef([pkg_description])\n])dnl PKG_INSTALLDIR\n\n\ndnl PKG_NOARCH_INSTALLDIR([DIRECTORY])\ndnl --------------------------------\ndnl Since: 0.27\ndnl\ndnl Substitutes the variable noarch_pkgconfigdir as the location where a\ndnl module should install arch-independent pkg-config .pc files. By\ndnl default the directory is $datadir/pkgconfig, but the default can be\ndnl changed by passing DIRECTORY. The user can override through the\ndnl --with-noarch-pkgconfigdir parameter.\nAC_DEFUN([PKG_NOARCH_INSTALLDIR],\n[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])\nm4_pushdef([pkg_description],\n    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])\nAC_ARG_WITH([noarch-pkgconfigdir],\n    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,\n    [with_noarch_pkgconfigdir=]pkg_default)\nAC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])\nm4_popdef([pkg_default])\nm4_popdef([pkg_description])\n])dnl PKG_NOARCH_INSTALLDIR\n\n\ndnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,\ndnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])\ndnl -------------------------------------------\ndnl Since: 0.28\ndnl\ndnl Retrieves the value of the pkg-config variable for the given module.\nAC_DEFUN([PKG_CHECK_VAR],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nAC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl\n\n_PKG_CONFIG([$1], [variable=\"][$3][\"], [$2])\nAS_VAR_COPY([$1], [pkg_cv_][$1])\n\nAS_VAR_IF([$1], [\"\"], [$5], [$4])dnl\n])dnl PKG_CHECK_VAR\n\ndnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,\ndnl   [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],\ndnl   [DESCRIPTION], [DEFAULT])\ndnl ------------------------------------------\ndnl\ndnl Prepare a \"--with-\" configure option using the lowercase\ndnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and\ndnl PKG_CHECK_MODULES in a single macro.\nAC_DEFUN([PKG_WITH_MODULES],\n[\nm4_pushdef([with_arg], m4_tolower([$1]))\n\nm4_pushdef([description],\n           [m4_default([$5], [build with ]with_arg[ support])])\n\nm4_pushdef([def_arg], [m4_default([$6], [auto])])\nm4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])\nm4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])\n\nm4_case(def_arg,\n            [yes],[m4_pushdef([with_without], [--without-]with_arg)],\n            [m4_pushdef([with_without],[--with-]with_arg)])\n\nAC_ARG_WITH(with_arg,\n     AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,\n    [AS_TR_SH([with_]with_arg)=def_arg])\n\nAS_CASE([$AS_TR_SH([with_]with_arg)],\n            [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],\n            [auto],[PKG_CHECK_MODULES([$1],[$2],\n                                        [m4_n([def_action_if_found]) $3],\n                                        [m4_n([def_action_if_not_found]) $4])])\n\nm4_popdef([with_arg])\nm4_popdef([description])\nm4_popdef([def_arg])\n\n])dnl PKG_WITH_MODULES\n\ndnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,\ndnl   [DESCRIPTION], [DEFAULT])\ndnl -----------------------------------------------\ndnl\ndnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES\ndnl check._[VARIABLE-PREFIX] is exported as make variable.\nAC_DEFUN([PKG_HAVE_WITH_MODULES],\n[\nPKG_WITH_MODULES([$1],[$2],,,[$3],[$4])\n\nAM_CONDITIONAL([HAVE_][$1],\n               [test \"$AS_TR_SH([with_]m4_tolower([$1]))\" = \"yes\"])\n])dnl PKG_HAVE_WITH_MODULES\n\ndnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,\ndnl   [DESCRIPTION], [DEFAULT])\ndnl ------------------------------------------------------\ndnl\ndnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after\ndnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make\ndnl and preprocessor variable.\nAC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],\n[\nPKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])\n\nAS_IF([test \"$AS_TR_SH([with_]m4_tolower([$1]))\" = \"yes\"],\n        [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])\n])dnl PKG_HAVE_DEFINE_WITH_MODULES\n\n# Copyright (C) 2002-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.16'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.16.1], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.16.1])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# Copyright (C) 2011-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_AR([ACT-IF-FAIL])\n# -------------------------\n# Try to determine the archiver interface, and trigger the ar-lib wrapper\n# if it is needed.  If the detection of archiver interface fails, run\n# ACT-IF-FAIL (default is to abort configure with a proper error message).\nAC_DEFUN([AM_PROG_AR],\n[AC_BEFORE([$0], [LT_INIT])dnl\nAC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl\nAC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([ar-lib])dnl\nAC_CHECK_TOOLS([AR], [ar lib \"link -lib\"], [false])\n: ${AR=ar}\n\nAC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],\n  [AC_LANG_PUSH([C])\n   am_cv_ar_interface=ar\n   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],\n     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([am_ar_try])\n      if test \"$ac_status\" -eq 0; then\n        am_cv_ar_interface=ar\n      else\n        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'\n        AC_TRY_EVAL([am_ar_try])\n        if test \"$ac_status\" -eq 0; then\n          am_cv_ar_interface=lib\n        else\n          am_cv_ar_interface=unknown\n        fi\n      fi\n      rm -f conftest.lib libconftest.a\n     ])\n   AC_LANG_POP([C])])\n\ncase $am_cv_ar_interface in\nar)\n  ;;\nlib)\n  # Microsoft lib, so override with the ar-lib wrapper script.\n  # FIXME: It is wrong to rewrite AR.\n  # But if we don't then we get into trouble of one sort or another.\n  # A longer-term fix would be to have automake use am__AR in this case,\n  # and then we could set am__AR=\"$am_aux_dir/ar-lib \\$(AR)\" or something\n  # similar.\n  AR=\"$am_aux_dir/ar-lib $AR\"\n  ;;\nunknown)\n  m4_default([$1],\n             [AC_MSG_ERROR([could not determine $AR interface])])\n  ;;\nesac\nAC_SUBST([AR])dnl\n])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to\n# '$srcdir', '$srcdir/..', or '$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is '.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\n# Expand $ac_aux_dir to an absolute path.\nam_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ([2.52])dnl\n m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n\n# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"OBJC\", \"OBJCXX\", \"UPC\", or \"GJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nm4_if([$1], [CC],   [depcc=\"$CC\"   am_compiler_list=],\n      [$1], [CXX],  [depcc=\"$CXX\"  am_compiler_list=],\n      [$1], [OBJC], [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n      [$1], [OBJCXX], [depcc=\"$OBJCXX\" am_compiler_list='gcc3 gcc'],\n      [$1], [UPC],  [depcc=\"$UPC\"  am_compiler_list=],\n      [$1], [GCJ],  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                    [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES.\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE([dependency-tracking], [dnl\nAS_HELP_STRING(\n  [--enable-dependency-tracking],\n  [do not reject slow dependency extractors])\nAS_HELP_STRING(\n  [--disable-dependency-tracking],\n  [speeds up one-time build])])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\nAC_SUBST([am__nodep])dnl\n_AM_SUBST_NOTMAKE([am__nodep])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  # TODO: see whether this extra hack can be removed once we start\n  # requiring Autoconf 2.70 or later.\n  AS_CASE([$CONFIG_FILES],\n          [*\\'*], [eval set x \"$CONFIG_FILES\"],\n          [*], [set x $CONFIG_FILES])\n  shift\n  # Used to flag and report bootstrapping failures.\n  am_rc=0\n  for am_mf\n  do\n    # Strip MF so we end up with the name of the file.\n    am_mf=`AS_ECHO([\"$am_mf\"]) | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile which includes\n    # dependency-tracking related rules and includes.\n    # Grep'ing the whole file directly is not great: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    sed -n 's,^am--depfiles:.*,X,p' \"$am_mf\" | grep X >/dev/null 2>&1 \\\n      || continue\n    am_dirpart=`AS_DIRNAME([\"$am_mf\"])`\n    am_filepart=`AS_BASENAME([\"$am_mf\"])`\n    AM_RUN_LOG([cd \"$am_dirpart\" \\\n      && sed -e '/# am--include-marker/d' \"$am_filepart\" \\\n        | $MAKE -f - am--depfiles]) || am_rc=$?\n  done\n  if test $am_rc -ne 0; then\n    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments\n    for automatic dependency tracking.  Try re-running configure with the\n    '--disable-dependency-tracking' option to at least be able to build\n    the package (albeit without support for automatic dependency tracking).])\n  fi\n  AS_UNSET([am_dirpart])\n  AS_UNSET([am_filepart])\n  AS_UNSET([am_mf])\n  AS_UNSET([am_rc])\n  rm -f conftest-deps.mk\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking is enabled.\n# This creates each '.Po' and '.Plo' makefile fragment that we'll need in\n# order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" MAKE=\"${MAKE-make}\"])])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\ndnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.\nm4_define([AC_PROG_CC],\nm4_defn([AC_PROG_CC])\n[_AM_PROG_CC_C_O\n])\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.65])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[AC_DIAGNOSE([obsolete],\n             [$0: two- and three-arguments forms are deprecated.])\nm4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(\n  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),\n  [ok:ok],,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED([PACKAGE], [\"$PACKAGE\"], [Name of package])\n AC_DEFINE_UNQUOTED([VERSION], [\"$VERSION\"], [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])\nAM_MISSING_PROG([AUTOCONF], [autoconf])\nAM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])\nAM_MISSING_PROG([AUTOHEADER], [autoheader])\nAM_MISSING_PROG([MAKEINFO], [makeinfo])\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nAC_SUBST([mkdir_p], ['$(MKDIR_P)'])\n# We need awk for the \"check\" target (and possibly the TAP driver).  The\n# system \"awk\" is bad on some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES([CC])],\n\t\t  [m4_define([AC_PROG_CC],\n\t\t\t     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES([CXX])],\n\t\t  [m4_define([AC_PROG_CXX],\n\t\t\t     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES([OBJC])],\n\t\t  [m4_define([AC_PROG_OBJC],\n\t\t\t     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJCXX],\n\t\t  [_AM_DEPENDENCIES([OBJCXX])],\n\t\t  [m4_define([AC_PROG_OBJCXX],\n\t\t\t     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl\n])\nAC_REQUIRE([AM_SILENT_RULES])dnl\ndnl The testsuite driver may need to know about EXEEXT, so add the\ndnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This\ndnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <https://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])\n  fi\nfi\ndnl The trailing newline in this macro's definition is deliberate, for\ndnl backward compatibility and to allow trailing 'dnl'-style comments\ndnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.\n])\n\ndnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST([install_sh])])\n\n# Copyright (C) 2003-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check whether make has an 'include' directive that can support all\n# the idioms we need for our automatic dependency tracking code.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])\ncat > confinc.mk << 'END'\nam__doit:\n\t@echo this is the am__doit target >confinc.out\n.PHONY: am__doit\nEND\nam__include=\"#\"\nam__quote=\n# BSD make does it like this.\necho '.include \"confinc.mk\" # ignored' > confmf.BSD\n# Other make implementations (GNU, Solaris 10, AIX) do it like this.\necho 'include confinc.mk # ignored' > confmf.GNU\n_am_result=no\nfor s in GNU BSD; do\n  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])\n  AS_CASE([$?:`cat confinc.out 2>/dev/null`],\n      ['0:this is the am__doit target'],\n      [AS_CASE([$s],\n          [BSD], [am__include='.include' am__quote='\"'],\n          [am__include='include' am__quote=''])])\n  if test \"$am__include\" != \"#\"; then\n    _am_result=\"yes ($s style)\"\n    break\n  fi\ndone\nrm -f confinc.* confmf.*\nAC_MSG_RESULT([${_am_result}])\nAC_SUBST([am__include])])\nAC_SUBST([am__quote])])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it is modern enough.\n# If it is, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  AC_MSG_WARN(['missing' script is too old or missing])\nfi\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# --------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), [1])])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Copyright (C) 1999-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_CC_C_O\n# ---------------\n# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC\n# to automatically call this.\nAC_DEFUN([_AM_PROG_CC_C_O],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([compile])dnl\nAC_LANG_PUSH([C])dnl\nAC_CACHE_CHECK(\n  [whether $CC understands -c and -o together],\n  [am_cv_prog_cc_c_o],\n  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i])\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nAC_LANG_POP([C])])\n\n# For backward compatibility.\nAC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_RUN_LOG(COMMAND)\n# -------------------\n# Run COMMAND, save the exit status in ac_status, and log it.\n# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)\nAC_DEFUN([AM_RUN_LOG],\n[{ echo \"$as_me:$LINENO: $1\" >&AS_MESSAGE_LOG_FD\n   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   (exit $ac_status); }])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$[*]\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tAC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment])\n     fi\n     if test \"$[2]\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT([yes])\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\nAC_CONFIG_COMMANDS_PRE(\n  [AC_MSG_CHECKING([that generated files are newer than configure])\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   AC_MSG_RESULT([done])])\nrm -f conftest.file\n])\n\n# Copyright (C) 2009-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SILENT_RULES([DEFAULT])\n# --------------------------\n# Enable less verbose build rules; with the default set to DEFAULT\n# (\"yes\" being less verbose, \"no\" or empty being verbose).\nAC_DEFUN([AM_SILENT_RULES],\n[AC_ARG_ENABLE([silent-rules], [dnl\nAS_HELP_STRING(\n  [--enable-silent-rules],\n  [less verbose build output (undo: \"make V=1\")])\nAS_HELP_STRING(\n  [--disable-silent-rules],\n  [verbose build output (undo: \"make V=0\")])dnl\n])\ncase $enable_silent_rules in @%:@ (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;\nesac\ndnl\ndnl A few 'make' implementations (e.g., NonStop OS and NextStep)\ndnl do not support nested variable expansions.\ndnl See automake bug#9928 and bug#10237.\nam_make=${MAKE-make}\nAC_CACHE_CHECK([whether $am_make supports nested variables],\n   [am_cv_make_support_nested_variables],\n   [if AS_ECHO([['TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi])\nif test $am_cv_make_support_nested_variables = yes; then\n  dnl Using '$V' instead of '$(V)' breaks IRIX make.\n  AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAC_SUBST([AM_V])dnl\nAM_SUBST_NOTMAKE([AM_V])dnl\nAC_SUBST([AM_DEFAULT_V])dnl\nAM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl\nAC_SUBST([AM_DEFAULT_VERBOSITY])dnl\nAM_BACKSLASH='\\'\nAC_SUBST([AM_BACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl\n])\n\n# Copyright (C) 2001-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor 'install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in \"make install-strip\", and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be 'maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# --------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004-2018 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of 'v7', 'ustar', or 'pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\n#\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAC_SUBST([AMTAR], ['$${TAR-tar}'])\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n\nm4_if([$1], [v7],\n  [am__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'],\n\n  [m4_case([$1],\n    [ustar],\n     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.\n      # There is notably a 21 bits limit for the UID and the GID.  In fact,\n      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343\n      # and bug#13588).\n      am_max_uid=2097151 # 2^21 - 1\n      am_max_gid=$am_max_uid\n      # The $UID and $GID variables are not portable, so we need to resort\n      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls\n      # below are definitely unexpected, so allow the users to see them\n      # (that is, avoid stderr redirection).\n      am_uid=`id -u || echo unknown`\n      am_gid=`id -g || echo unknown`\n      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])\n      if test $am_uid -le $am_max_uid; then\n         AC_MSG_RESULT([yes])\n      else\n         AC_MSG_RESULT([no])\n         _am_tools=none\n      fi\n      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])\n      if test $am_gid -le $am_max_gid; then\n         AC_MSG_RESULT([yes])\n      else\n        AC_MSG_RESULT([no])\n        _am_tools=none\n      fi],\n\n  [pax],\n    [],\n\n  [m4_fatal([Unknown tar format])])\n\n  AC_MSG_CHECKING([how to create a $1 tar archive])\n\n  # Go ahead even if we have the value already cached.  We do so because we\n  # need to set the values for the 'am__tar' and 'am__untar' variables.\n  _am_tools=${am_cv_prog_tar_$1-$_am_tools}\n\n  for _am_tool in $_am_tools; do\n    case $_am_tool in\n    gnutar)\n      for _am_tar in tar gnutar gtar; do\n        AM_RUN_LOG([$_am_tar --version]) && break\n      done\n      am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n      am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n      am__untar=\"$_am_tar -xf -\"\n      ;;\n    plaintar)\n      # Must skip GNU tar: if it does not support --format= it doesn't create\n      # ustar tarball either.\n      (tar --version) >/dev/null 2>&1 && continue\n      am__tar='tar chf - \"$$tardir\"'\n      am__tar_='tar chf - \"$tardir\"'\n      am__untar='tar xf -'\n      ;;\n    pax)\n      am__tar='pax -L -x $1 -w \"$$tardir\"'\n      am__tar_='pax -L -x $1 -w \"$tardir\"'\n      am__untar='pax -r'\n      ;;\n    cpio)\n      am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n      am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n      am__untar='cpio -i -H $1 -d'\n      ;;\n    none)\n      am__tar=false\n      am__tar_=false\n      am__untar=false\n      ;;\n    esac\n\n    # If the value was cached, stop now.  We just wanted to have am__tar\n    # and am__untar set.\n    test -n \"${am_cv_prog_tar_$1}\" && break\n\n    # tar/untar a dummy directory, and stop if the command works.\n    rm -rf conftest.dir\n    mkdir conftest.dir\n    echo GrepMe > conftest.dir/file\n    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n    rm -rf conftest.dir\n    if test -s conftest.tar; then\n      AM_RUN_LOG([$am__untar <conftest.tar])\n      AM_RUN_LOG([cat conftest.dir/file])\n      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n    fi\n  done\n  rm -rf conftest.dir\n\n  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\n  AC_MSG_RESULT([$am_cv_prog_tar_$1])])\n\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\nm4_include([m4/ax_pthread.m4])\nm4_include([m4/libtool.m4])\nm4_include([m4/ltoptions.m4])\nm4_include([m4/ltsugar.m4])\nm4_include([m4/ltversion.m4])\nm4_include([m4/lt~obsolete.m4])\nm4_include([m4/pcre_visibility.m4])\n"
  },
  {
    "path": "src/pcre/ar-lib",
    "content": "#! /bin/sh\n# Wrapper for Microsoft lib.exe\n\nme=ar-lib\nscriptversion=2012-03-01.08; # UTC\n\n# Copyright (C) 2010-2018 Free Software Foundation, Inc.\n# Written by Peter Rosin <peda@lysator.liu.se>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\n\n# func_error message\nfunc_error ()\n{\n  echo \"$me: $1\" 1>&2\n  exit 1\n}\n\nfile_conv=\n\n# func_file_conv build_file\n# Convert a $build file to $host form and store it in $file\n# Currently only supports Windows hosts.\nfunc_file_conv ()\n{\n  file=$1\n  case $file in\n    / | /[!/]*) # absolute file, and not a UNC file\n      if test -z \"$file_conv\"; then\n\t# lazily determine how to convert abs files\n\tcase `uname -s` in\n\t  MINGW*)\n\t    file_conv=mingw\n\t    ;;\n\t  CYGWIN*)\n\t    file_conv=cygwin\n\t    ;;\n\t  *)\n\t    file_conv=wine\n\t    ;;\n\tesac\n      fi\n      case $file_conv in\n\tmingw)\n\t  file=`cmd //C echo \"$file \" | sed -e 's/\"\\(.*\\) \" *$/\\1/'`\n\t  ;;\n\tcygwin)\n\t  file=`cygpath -m \"$file\" || echo \"$file\"`\n\t  ;;\n\twine)\n\t  file=`winepath -w \"$file\" || echo \"$file\"`\n\t  ;;\n      esac\n      ;;\n  esac\n}\n\n# func_at_file at_file operation archive\n# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE\n# for each of them.\n# When interpreting the content of the @FILE, do NOT use func_file_conv,\n# since the user would need to supply preconverted file names to\n# binutils ar, at least for MinGW.\nfunc_at_file ()\n{\n  operation=$2\n  archive=$3\n  at_file_contents=`cat \"$1\"`\n  eval set x \"$at_file_contents\"\n  shift\n\n  for member\n  do\n    $AR -NOLOGO $operation:\"$member\" \"$archive\" || exit $?\n  done\n}\n\ncase $1 in\n  '')\n     func_error \"no command.  Try '$0 --help' for more information.\"\n     ;;\n  -h | --h*)\n    cat <<EOF\nUsage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]\n\nMembers may be specified in a file named with @FILE.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"$me, version $scriptversion\"\n    exit $?\n    ;;\nesac\n\nif test $# -lt 3; then\n  func_error \"you must specify a program, an action and an archive\"\nfi\n\nAR=$1\nshift\nwhile :\ndo\n  if test $# -lt 2; then\n    func_error \"you must specify a program, an action and an archive\"\n  fi\n  case $1 in\n    -lib | -LIB \\\n    | -ltcg | -LTCG \\\n    | -machine* | -MACHINE* \\\n    | -subsystem* | -SUBSYSTEM* \\\n    | -verbose | -VERBOSE \\\n    | -wx* | -WX* )\n      AR=\"$AR $1\"\n      shift\n      ;;\n    *)\n      action=$1\n      shift\n      break\n      ;;\n  esac\ndone\norig_archive=$1\nshift\nfunc_file_conv \"$orig_archive\"\narchive=$file\n\n# strip leading dash in $action\naction=${action#-}\n\ndelete=\nextract=\nlist=\nquick=\nreplace=\nindex=\ncreate=\n\nwhile test -n \"$action\"\ndo\n  case $action in\n    d*) delete=yes  ;;\n    x*) extract=yes ;;\n    t*) list=yes    ;;\n    q*) quick=yes   ;;\n    r*) replace=yes ;;\n    s*) index=yes   ;;\n    S*)             ;; # the index is always updated implicitly\n    c*) create=yes  ;;\n    u*)             ;; # TODO: don't ignore the update modifier\n    v*)             ;; # TODO: don't ignore the verbose modifier\n    *)\n      func_error \"unknown action specified\"\n      ;;\n  esac\n  action=${action#?}\ndone\n\ncase $delete$extract$list$quick$replace,$index in\n  yes,* | ,yes)\n    ;;\n  yesyes*)\n    func_error \"more than one action specified\"\n    ;;\n  *)\n    func_error \"no action specified\"\n    ;;\nesac\n\nif test -n \"$delete\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  for member\n  do\n    case $1 in\n      @*)\n        func_at_file \"${1#@}\" -REMOVE \"$archive\"\n        ;;\n      *)\n        func_file_conv \"$1\"\n        $AR -NOLOGO -REMOVE:\"$file\" \"$archive\" || exit $?\n        ;;\n    esac\n  done\n\nelif test -n \"$extract\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  if test $# -gt 0; then\n    for member\n    do\n      case $1 in\n        @*)\n          func_at_file \"${1#@}\" -EXTRACT \"$archive\"\n          ;;\n        *)\n          func_file_conv \"$1\"\n          $AR -NOLOGO -EXTRACT:\"$file\" \"$archive\" || exit $?\n          ;;\n      esac\n    done\n  else\n    $AR -NOLOGO -LIST \"$archive\" | sed -e 's/\\\\/\\\\\\\\/g' | while read member\n    do\n      $AR -NOLOGO -EXTRACT:\"$member\" \"$archive\" || exit $?\n    done\n  fi\n\nelif test -n \"$quick$replace\"; then\n  if test ! -f \"$orig_archive\"; then\n    if test -z \"$create\"; then\n      echo \"$me: creating $orig_archive\"\n    fi\n    orig_archive=\n  else\n    orig_archive=$archive\n  fi\n\n  for member\n  do\n    case $1 in\n    @*)\n      func_file_conv \"${1#@}\"\n      set x \"$@\" \"@$file\"\n      ;;\n    *)\n      func_file_conv \"$1\"\n      set x \"$@\" \"$file\"\n      ;;\n    esac\n    shift\n    shift\n  done\n\n  if test -n \"$orig_archive\"; then\n    $AR -NOLOGO -OUT:\"$archive\" \"$orig_archive\" \"$@\" || exit $?\n  else\n    $AR -NOLOGO -OUT:\"$archive\" \"$@\" || exit $?\n  fi\n\nelif test -n \"$list\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  $AR -NOLOGO -LIST \"$archive\" || exit $?\nfi\n"
  },
  {
    "path": "src/pcre/cmake/COPYING-CMAKE-SCRIPTS",
    "content": "Redistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n3. The name of the author may not be used to endorse or promote products \n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/pcre/cmake/FindEditline.cmake",
    "content": "# Modified from FindReadline.cmake (PH Feb 2012)\n\nif(EDITLINE_INCLUDE_DIR AND EDITLINE_LIBRARY AND NCURSES_LIBRARY)\n  set(EDITLINE_FOUND TRUE)\nelse(EDITLINE_INCLUDE_DIR AND EDITLINE_LIBRARY AND NCURSES_LIBRARY)\n  FIND_PATH(EDITLINE_INCLUDE_DIR readline.h\n    /usr/include/editline\n    /usr/include/edit/readline  \n    /usr/include/readline\n  )\n  \n  FIND_LIBRARY(EDITLINE_LIBRARY NAMES edit)\n  include(FindPackageHandleStandardArgs)\n  FIND_PACKAGE_HANDLE_STANDARD_ARGS(Editline DEFAULT_MSG EDITLINE_INCLUDE_DIR EDITLINE_LIBRARY )\n\n  MARK_AS_ADVANCED(EDITLINE_INCLUDE_DIR EDITLINE_LIBRARY)\nendif(EDITLINE_INCLUDE_DIR AND EDITLINE_LIBRARY AND NCURSES_LIBRARY)\n"
  },
  {
    "path": "src/pcre/cmake/FindPackageHandleStandardArgs.cmake",
    "content": "# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME (DEFAULT_MSG|\"Custom failure message\") VAR1 ... )\n#    This macro is intended to be used in FindXXX.cmake modules files.\n#    It handles the REQUIRED and QUIET argument to FIND_PACKAGE() and\n#    it also sets the <UPPERCASED_NAME>_FOUND variable.\n#    The package is found if all variables listed are TRUE.\n#    Example:\n#\n#    FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibXml2 DEFAULT_MSG LIBXML2_LIBRARIES LIBXML2_INCLUDE_DIR)\n#\n#    LibXml2 is considered to be found, if both LIBXML2_LIBRARIES and \n#    LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to TRUE.\n#    If it is not found and REQUIRED was used, it fails with FATAL_ERROR, \n#    independent whether QUIET was used or not.\n#    If it is found, the location is reported using the VAR1 argument, so \n#    here a message \"Found LibXml2: /usr/lib/libxml2.so\" will be printed out.\n#    If the second argument is DEFAULT_MSG, the message in the failure case will \n#    be \"Could NOT find LibXml2\", if you don't like this message you can specify\n#    your own custom failure message there.\n\nMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FAIL_MSG _VAR1 )\n\n  IF(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n    IF (${_NAME}_FIND_REQUIRED)\n      SET(_FAIL_MESSAGE \"Could not find REQUIRED package ${_NAME}\")\n    ELSE (${_NAME}_FIND_REQUIRED)\n      SET(_FAIL_MESSAGE \"Could not find OPTIONAL package ${_NAME}\")\n    ENDIF (${_NAME}_FIND_REQUIRED)\n  ELSE(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n    SET(_FAIL_MESSAGE \"${_FAIL_MSG}\")\n  ENDIF(\"${_FAIL_MSG}\" STREQUAL \"DEFAULT_MSG\")\n\n  STRING(TOUPPER ${_NAME} _NAME_UPPER)\n\n  SET(${_NAME_UPPER}_FOUND TRUE)\n  IF(NOT ${_VAR1})\n    SET(${_NAME_UPPER}_FOUND FALSE)\n  ENDIF(NOT ${_VAR1})\n\n  FOREACH(_CURRENT_VAR ${ARGN})\n    IF(NOT ${_CURRENT_VAR})\n      SET(${_NAME_UPPER}_FOUND FALSE)\n    ENDIF(NOT ${_CURRENT_VAR})\n  ENDFOREACH(_CURRENT_VAR)\n\n  IF (${_NAME_UPPER}_FOUND)\n    IF (NOT ${_NAME}_FIND_QUIETLY)\n        MESSAGE(STATUS \"Found ${_NAME}: ${${_VAR1}}\")\n    ENDIF (NOT ${_NAME}_FIND_QUIETLY)\n  ELSE (${_NAME_UPPER}_FOUND)\n    IF (${_NAME}_FIND_REQUIRED)\n        MESSAGE(FATAL_ERROR \"${_FAIL_MESSAGE}\")\n    ELSE (${_NAME}_FIND_REQUIRED)\n      IF (NOT ${_NAME}_FIND_QUIETLY)\n        MESSAGE(STATUS \"${_FAIL_MESSAGE}\")\n      ENDIF (NOT ${_NAME}_FIND_QUIETLY)\n    ENDIF (${_NAME}_FIND_REQUIRED)\n  ENDIF (${_NAME_UPPER}_FOUND)\nENDMACRO(FIND_PACKAGE_HANDLE_STANDARD_ARGS)\n"
  },
  {
    "path": "src/pcre/cmake/FindReadline.cmake",
    "content": "# from http://websvn.kde.org/trunk/KDE/kdeedu/cmake/modules/FindReadline.cmake\n# http://websvn.kde.org/trunk/KDE/kdeedu/cmake/modules/COPYING-CMAKE-SCRIPTS\n# --> BSD licensed\n#\n# GNU Readline library finder\nif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY)\n  set(READLINE_FOUND TRUE)\nelse(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY)\n  FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h\n    /usr/include/readline\n  )\n  \n# 2008-04-22 The next clause used to read like this:\n#\n#  FIND_LIBRARY(READLINE_LIBRARY NAMES readline)\n#        FIND_LIBRARY(NCURSES_LIBRARY NAMES ncurses )\n#        include(FindPackageHandleStandardArgs)\n#        FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG NCURSES_LIBRARY READLINE_INCLUDE_DIR READLINE_LIBRARY )\n#\n# I was advised to modify it such that it will find an ncurses library if\n# required, but not if one was explicitly given, that is, it allows the\n# default to be overridden. PH \n\n  FIND_LIBRARY(READLINE_LIBRARY NAMES readline)\n        include(FindPackageHandleStandardArgs)\n        FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG READLINE_INCLUDE_DIR READLINE_LIBRARY )\n\n  MARK_AS_ADVANCED(READLINE_INCLUDE_DIR READLINE_LIBRARY)\nendif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY AND NCURSES_LIBRARY)\n"
  },
  {
    "path": "src/pcre/compile",
    "content": "#! /bin/sh\n# Wrapper for compilers which do not understand '-c -o'.\n\nscriptversion=2018-03-07.03; # UTC\n\n# Copyright (C) 1999-2018 Free Software Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\nnl='\n'\n\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent tools from complaining about whitespace usage.\nIFS=\" \"\"\t$nl\"\n\nfile_conv=\n\n# func_file_conv build_file lazy\n# Convert a $build file to $host form and store it in $file\n# Currently only supports Windows hosts. If the determined conversion\n# type is listed in (the comma separated) LAZY, no conversion will\n# take place.\nfunc_file_conv ()\n{\n  file=$1\n  case $file in\n    / | /[!/]*) # absolute file, and not a UNC file\n      if test -z \"$file_conv\"; then\n\t# lazily determine how to convert abs files\n\tcase `uname -s` in\n\t  MINGW*)\n\t    file_conv=mingw\n\t    ;;\n\t  CYGWIN*)\n\t    file_conv=cygwin\n\t    ;;\n\t  *)\n\t    file_conv=wine\n\t    ;;\n\tesac\n      fi\n      case $file_conv/,$2, in\n\t*,$file_conv,*)\n\t  ;;\n\tmingw/*)\n\t  file=`cmd //C echo \"$file \" | sed -e 's/\"\\(.*\\) \" *$/\\1/'`\n\t  ;;\n\tcygwin/*)\n\t  file=`cygpath -m \"$file\" || echo \"$file\"`\n\t  ;;\n\twine/*)\n\t  file=`winepath -w \"$file\" || echo \"$file\"`\n\t  ;;\n      esac\n      ;;\n  esac\n}\n\n# func_cl_dashL linkdir\n# Make cl look for libraries in LINKDIR\nfunc_cl_dashL ()\n{\n  func_file_conv \"$1\"\n  if test -z \"$lib_path\"; then\n    lib_path=$file\n  else\n    lib_path=\"$lib_path;$file\"\n  fi\n  linker_opts=\"$linker_opts -LIBPATH:$file\"\n}\n\n# func_cl_dashl library\n# Do a library search-path lookup for cl\nfunc_cl_dashl ()\n{\n  lib=$1\n  found=no\n  save_IFS=$IFS\n  IFS=';'\n  for dir in $lib_path $LIB\n  do\n    IFS=$save_IFS\n    if $shared && test -f \"$dir/$lib.dll.lib\"; then\n      found=yes\n      lib=$dir/$lib.dll.lib\n      break\n    fi\n    if test -f \"$dir/$lib.lib\"; then\n      found=yes\n      lib=$dir/$lib.lib\n      break\n    fi\n    if test -f \"$dir/lib$lib.a\"; then\n      found=yes\n      lib=$dir/lib$lib.a\n      break\n    fi\n  done\n  IFS=$save_IFS\n\n  if test \"$found\" != yes; then\n    lib=$lib.lib\n  fi\n}\n\n# func_cl_wrapper cl arg...\n# Adjust compile command to suit cl\nfunc_cl_wrapper ()\n{\n  # Assume a capable shell\n  lib_path=\n  shared=:\n  linker_opts=\n  for arg\n  do\n    if test -n \"$eat\"; then\n      eat=\n    else\n      case $1 in\n\t-o)\n\t  # configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t  eat=1\n\t  case $2 in\n\t    *.o | *.[oO][bB][jJ])\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fo\"$file\"\n\t      shift\n\t      ;;\n\t    *)\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fe\"$file\"\n\t      shift\n\t      ;;\n\t  esac\n\t  ;;\n\t-I)\n\t  eat=1\n\t  func_file_conv \"$2\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-I*)\n\t  func_file_conv \"${1#-I}\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-l)\n\t  eat=1\n\t  func_cl_dashl \"$2\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-l*)\n\t  func_cl_dashl \"${1#-l}\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-L)\n\t  eat=1\n\t  func_cl_dashL \"$2\"\n\t  ;;\n\t-L*)\n\t  func_cl_dashL \"${1#-L}\"\n\t  ;;\n\t-static)\n\t  shared=false\n\t  ;;\n\t-Wl,*)\n\t  arg=${1#-Wl,}\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for flag in $arg; do\n\t    IFS=\"$save_ifs\"\n\t    linker_opts=\"$linker_opts $flag\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  ;;\n\t-Xlinker)\n\t  eat=1\n\t  linker_opts=\"$linker_opts $2\"\n\t  ;;\n\t-*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n\t*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)\n\t  func_file_conv \"$1\"\n\t  set x \"$@\" -Tp\"$file\"\n\t  shift\n\t  ;;\n\t*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])\n\t  func_file_conv \"$1\" mingw\n\t  set x \"$@\" \"$file\"\n\t  shift\n\t  ;;\n\t*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n      esac\n    fi\n    shift\n  done\n  if test -n \"$linker_opts\"; then\n    linker_opts=\"-link$linker_opts\"\n  fi\n  exec \"$@\" $linker_opts\n  exit 1\n}\n\neat=\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: compile [--help] [--version] PROGRAM [ARGS]\n\nWrapper for compilers which do not understand '-c -o'.\nRemove '-o dest.o' from ARGS, run PROGRAM with the remaining\narguments, and rename the output as expected.\n\nIf you are trying to build a whole package this is not the\nright script to run: please start by reading the file 'INSTALL'.\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"compile $scriptversion\"\n    exit $?\n    ;;\n  cl | *[/\\\\]cl | cl.exe | *[/\\\\]cl.exe | \\\n  icl | *[/\\\\]icl | icl.exe | *[/\\\\]icl.exe )\n    func_cl_wrapper \"$@\"      # Doesn't return...\n    ;;\nesac\n\nofile=\ncfile=\n\nfor arg\ndo\n  if test -n \"$eat\"; then\n    eat=\n  else\n    case $1 in\n      -o)\n\t# configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t# So we strip '-o arg' only if arg is an object.\n\teat=1\n\tcase $2 in\n\t  *.o | *.obj)\n\t    ofile=$2\n\t    ;;\n\t  *)\n\t    set x \"$@\" -o \"$2\"\n\t    shift\n\t    ;;\n\tesac\n\t;;\n      *.c)\n\tcfile=$1\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n      *)\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n    esac\n  fi\n  shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n  # If no '-o' option was seen then we might have been invoked from a\n  # pattern rule where we don't need one.  That is ok -- this is a\n  # normal compilation that the losing compiler can handle.  If no\n  # '.c' file was seen then we are probably linking.  That is also\n  # ok.\n  exec \"$@\"\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo \"$cfile\" | sed 's|^.*[\\\\/]||; s|^[a-zA-Z]:||; s/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use '[/\\\\:.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo \"$cofile\" | sed -e 's|[/\\\\:.-]|_|g'`.d\nwhile true; do\n  if mkdir \"$lockdir\" >/dev/null 2>&1; then\n    break\n  fi\n  sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir '$lockdir'; exit 1\" 1 2 15\n\n# Run the compile.\n\"$@\"\nret=$?\n\nif test -f \"$cofile\"; then\n  test \"$cofile\" = \"$ofile\" || mv \"$cofile\" \"$ofile\"\nelif test -f \"${cofile}bj\"; then\n  test \"${cofile}bj\" = \"$ofile\" || mv \"${cofile}bj\" \"$ofile\"\nfi\n\nrmdir \"$lockdir\"\nexit $ret\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/pcre/config-cmake.h.in",
    "content": "/* config.h for CMake builds */\n\n#cmakedefine HAVE_DIRENT_H 1\n#cmakedefine HAVE_SYS_STAT_H 1\n#cmakedefine HAVE_SYS_TYPES_H 1\n#cmakedefine HAVE_UNISTD_H 1\n#cmakedefine HAVE_WINDOWS_H 1\n#cmakedefine HAVE_STDINT_H 1                                                   \n#cmakedefine HAVE_INTTYPES_H 1    \n\n#cmakedefine HAVE_TYPE_TRAITS_H 1\n#cmakedefine HAVE_BITS_TYPE_TRAITS_H 1\n\n#cmakedefine HAVE_BCOPY 1\n#cmakedefine HAVE_MEMMOVE 1\n#cmakedefine HAVE_STRERROR 1\n#cmakedefine HAVE_STRTOLL 1\n#cmakedefine HAVE_STRTOQ 1\n#cmakedefine HAVE__STRTOI64 1\n\n#cmakedefine PCRE_STATIC 1\n\n#cmakedefine SUPPORT_PCRE8 1\n#cmakedefine SUPPORT_PCRE16 1\n#cmakedefine SUPPORT_PCRE32 1\n#cmakedefine SUPPORT_JIT 1\n#cmakedefine SUPPORT_PCREGREP_JIT 1\n#cmakedefine SUPPORT_UTF 1\n#cmakedefine SUPPORT_UCP 1\n#cmakedefine EBCDIC 1\n#cmakedefine EBCDIC_NL25 1\n#cmakedefine BSR_ANYCRLF 1\n#cmakedefine NO_RECURSE 1\n\n#cmakedefine HAVE_LONG_LONG 1\n#cmakedefine HAVE_UNSIGNED_LONG_LONG 1\n\n#cmakedefine SUPPORT_LIBBZ2 1\n#cmakedefine SUPPORT_LIBZ 1\n#cmakedefine SUPPORT_LIBEDIT 1\n#cmakedefine SUPPORT_LIBREADLINE 1\n\n#cmakedefine SUPPORT_VALGRIND 1\n#cmakedefine SUPPORT_GCOV 1\n\n#define NEWLINE\t\t\t@NEWLINE@\n#define POSIX_MALLOC_THRESHOLD\t@PCRE_POSIX_MALLOC_THRESHOLD@\n#define LINK_SIZE\t\t@PCRE_LINK_SIZE@\n#define PARENS_NEST_LIMIT       @PCRE_PARENS_NEST_LIMIT@\n#define MATCH_LIMIT\t\t@PCRE_MATCH_LIMIT@\n#define MATCH_LIMIT_RECURSION\t@PCRE_MATCH_LIMIT_RECURSION@\n#define PCREGREP_BUFSIZE        @PCREGREP_BUFSIZE@\n\n#define MAX_NAME_SIZE\t32\n#define MAX_NAME_COUNT\t10000\n\n/* end config.h for CMake builds */\n"
  },
  {
    "path": "src/pcre/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright 1992-2018 Free Software Foundation, Inc.\n\ntimestamp='2018-03-08'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <https://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n#\n# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.\n#\n# You can get the latest version of this script from:\n# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess\n#\n# Please send patches to <config-patches@gnu.org>.\n\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOptions:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright 1992-2018 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > \"$dummy.c\" ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o \"$dummy.o\" \"$dummy.c\") >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\ncase \"$UNAME_SYSTEM\" in\nLinux|GNU|GNU/*)\n\t# If the system lacks a compiler, then just pick glibc.\n\t# We could probably try harder.\n\tLIBC=gnu\n\n\teval \"$set_cc_for_build\"\n\tcat <<-EOF > \"$dummy.c\"\n\t#include <features.h>\n\t#if defined(__UCLIBC__)\n\tLIBC=uclibc\n\t#elif defined(__dietlibc__)\n\tLIBC=dietlibc\n\t#else\n\tLIBC=gnu\n\t#endif\n\tEOF\n\teval \"`$CC_FOR_BUILD -E \"$dummy.c\" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`\"\n\n\t# If ldd exists, use it to detect musl libc.\n\tif command -v ldd >/dev/null && \\\n\t\tldd --version 2>&1 | grep -q ^musl\n\tthen\n\t    LIBC=musl\n\tfi\n\t;;\nesac\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \\\n\t    \"/sbin/$sysctl\" 2>/dev/null || \\\n\t    \"/usr/sbin/$sysctl\" 2>/dev/null || \\\n\t    echo unknown)`\n\tcase \"$UNAME_MACHINE_ARCH\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    earmv*)\n\t\tarch=`echo \"$UNAME_MACHINE_ARCH\" | sed -e 's,^e\\(armv[0-9]\\).*$,\\1,'`\n\t\tendian=`echo \"$UNAME_MACHINE_ARCH\" | sed -ne 's,^.*\\(eb\\)$,\\1,p'`\n\t\tmachine=\"${arch}${endian}\"-unknown\n\t\t;;\n\t    *) machine=\"$UNAME_MACHINE_ARCH\"-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently (or will in the future) and ABI.\n\tcase \"$UNAME_MACHINE_ARCH\" in\n\t    earm*)\n\t\tos=netbsdelf\n\t\t;;\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval \"$set_cc_for_build\"\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# Determine ABI tags.\n\tcase \"$UNAME_MACHINE_ARCH\" in\n\t    earm*)\n\t\texpr='s/^earmv[0-9]/-eabi/;s/eb$//'\n\t\tabi=`echo \"$UNAME_MACHINE_ARCH\" | sed -e \"$expr\"`\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"$UNAME_VERSION\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo \"$UNAME_RELEASE\" | sed -e 's/[-_].*//' | cut -d. -f1,2`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"$machine-${os}${release}${abi}\"\n\texit ;;\n    *:Bitrig:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`\n\techo \"$UNAME_MACHINE_ARCH\"-unknown-bitrig\"$UNAME_RELEASE\"\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo \"$UNAME_MACHINE_ARCH\"-unknown-openbsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:LibertyBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\\.//'`\n\techo \"$UNAME_MACHINE_ARCH\"-unknown-libertybsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:MidnightBSD:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-midnightbsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-ekkobsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:SolidBSD:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-solidbsd\"$UNAME_RELEASE\"\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:MirBSD:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-mirbsd\"$UNAME_RELEASE\"\n\texit ;;\n    *:Sortix:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-sortix\n\texit ;;\n    *:Redox:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-redox\n\texit ;;\n    mips:OSF1:*.*)\n        echo mips-dec-osf1\n        exit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=alpha ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=alphaev5 ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=alphaev56 ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=alphapca56 ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=alphapca57 ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=alphaev6 ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=alphaev67 ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=alphaev68 ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=alphaev69 ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=alphaev7 ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=alphaev79 ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo \"$UNAME_MACHINE\"-dec-osf\"`echo \"$UNAME_RELEASE\" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`\"\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\texitcode=$?\n\ttrap '' 0\n\texit $exitcode ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n\techo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix\"$UNAME_RELEASE\"\n\texit ;;\n    arm*:riscos:*:*|arm*:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo \"$UNAME_MACHINE\"-ibm-solaris2\"`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\"\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2\"`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*//'`\"\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2\"`echo \"$UNAME_RELEASE\" | sed -e 's/[^.]*//'`\"\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux\"$UNAME_RELEASE\"\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval \"$set_cc_for_build\"\n\tSUN_ARCH=i386\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != no_compiler_found ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=x86_64\n\t    fi\n\tfi\n\techo \"$SUN_ARCH\"-pc-solaris2\"`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*//'`\"\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3\"`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*//'`\"\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos\"`echo \"$UNAME_RELEASE\"|sed -e 's/-/_/'`\"\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos\"$UNAME_RELEASE\"\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x$UNAME_RELEASE\" = x && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos\"$UNAME_RELEASE\"\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos\"$UNAME_RELEASE\"\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos\"$UNAME_RELEASE\"\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint\"$UNAME_RELEASE\"\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint\"$UNAME_RELEASE\"\n\texit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\techo m68k-atari-mint\"$UNAME_RELEASE\"\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\techo m68k-milan-mint\"$UNAME_RELEASE\"\n\texit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\techo m68k-hades-mint\"$UNAME_RELEASE\"\n\texit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\techo m68k-unknown-mint\"$UNAME_RELEASE\"\n\texit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten\"$UNAME_RELEASE\"\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten\"$UNAME_RELEASE\"\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix\"$UNAME_RELEASE\"\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix\"$UNAME_RELEASE\"\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix\"$UNAME_RELEASE\"\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval \"$set_cc_for_build\"\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" &&\n\t  dummyarg=`echo \"$UNAME_RELEASE\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`\"$dummy\" \"$dummyarg\"` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos\"$UNAME_RELEASE\"\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ \"$UNAME_PROCESSOR\" = mc88100 ] || [ \"$UNAME_PROCESSOR\" = mc88110 ]\n\tthen\n\t    if [ \"$TARGET_BINARY_INTERFACE\"x = m88kdguxelfx ] || \\\n\t       [ \"$TARGET_BINARY_INTERFACE\"x = x ]\n\t    then\n\t\techo m88k-dg-dgux\"$UNAME_RELEASE\"\n\t    else\n\t\techo m88k-dg-dguxbcs\"$UNAME_RELEASE\"\n\t    fi\n\telse\n\t    echo i586-dg-dgux\"$UNAME_RELEASE\"\n\tfi\n\texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix\"`echo \"$UNAME_RELEASE\"|sed -e 's/-/_/g'`\"\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=\"$UNAME_VERSION.$UNAME_RELEASE\"\n\tfi\n\techo \"$UNAME_MACHINE\"-ibm-aix\"$IBM_REV\"\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval \"$set_cc_for_build\"\n\t\tsed 's/^\t\t//' << EOF > \"$dummy.c\"\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" && SYSTEM_NAME=`\"$dummy\"`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El \"$IBM_CPU_ID\" | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/lslpp ] ; then\n\t\tIBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |\n\t\t\t   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`\n\telse\n\t\tIBM_REV=\"$UNAME_VERSION.$UNAME_RELEASE\"\n\tfi\n\techo \"$IBM_ARCH\"-ibm-aix\"$IBM_REV\"\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd\"$UNAME_RELEASE\"   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"$UNAME_MACHINE\" in\n\t    9000/31?)            HP_ARCH=m68000 ;;\n\t    9000/[34]??)         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case \"$sc_cpu_version\" in\n\t\t      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase \"$sc_kernel_bits\" in\n\t\t\t  32) HP_ARCH=hppa2.0n ;;\n\t\t\t  64) HP_ARCH=hppa2.0w ;;\n\t\t\t  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif [ \"$HP_ARCH\" = \"\" ]; then\n\t\t    eval \"$set_cc_for_build\"\n\t\t    sed 's/^\t\t//' << EOF > \"$dummy.c\"\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS=\"\" $CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" 2>/dev/null) && HP_ARCH=`\"$dummy\"`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ \"$HP_ARCH\" = hppa2.0w ]\n\tthen\n\t    eval \"$set_cc_for_build\"\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=hppa2.0w\n\t    else\n\t\tHP_ARCH=hppa64\n\t    fi\n\tfi\n\techo \"$HP_ARCH\"-hp-hpux\"$HPUX_REV\"\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux\"$HPUX_REV\"\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval \"$set_cc_for_build\"\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o \"$dummy\" \"$dummy.c\" && SYSTEM_NAME=`\"$dummy\"` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo \"$UNAME_MACHINE\"-unknown-osf1mk\n\telse\n\t    echo \"$UNAME_MACHINE\"-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n\texit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n\texit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n\texit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n\texit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos\"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo \"$UNAME_MACHINE\"-cray-unicos\"$UNAME_RELEASE\" \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos\"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk\"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos\"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp\"$UNAME_RELEASE\" | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`\n\tFUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo \"$UNAME_RELEASE\" | sed -e 's/ /_/'`\n\techo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo \"$UNAME_RELEASE\" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`\n\techo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo \"$UNAME_MACHINE\"-pc-bsdi\"$UNAME_RELEASE\"\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi\"$UNAME_RELEASE\"\n\texit ;;\n    *:BSD/OS:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-bsdi\"$UNAME_RELEASE\"\n\texit ;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase \"$UNAME_PROCESSOR\" in\n\t    amd64)\n\t\tUNAME_PROCESSOR=x86_64 ;;\n\t    i386)\n\t\tUNAME_PROCESSOR=i586 ;;\n\tesac\n\techo \"$UNAME_PROCESSOR\"-unknown-freebsd\"`echo \"$UNAME_RELEASE\"|sed -e 's/[-(].*//'`\"\n\texit ;;\n    i*:CYGWIN*:*)\n\techo \"$UNAME_MACHINE\"-pc-cygwin\n\texit ;;\n    *:MINGW64*:*)\n\techo \"$UNAME_MACHINE\"-pc-mingw64\n\texit ;;\n    *:MINGW*:*)\n\techo \"$UNAME_MACHINE\"-pc-mingw32\n\texit ;;\n    *:MSYS*:*)\n\techo \"$UNAME_MACHINE\"-pc-msys\n\texit ;;\n    i*:PW*:*)\n\techo \"$UNAME_MACHINE\"-pc-pw32\n\texit ;;\n    *:Interix*:*)\n\tcase \"$UNAME_MACHINE\" in\n\t    x86)\n\t\techo i586-pc-interix\"$UNAME_RELEASE\"\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix\"$UNAME_RELEASE\"\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix\"$UNAME_RELEASE\"\n\t\texit ;;\n\tesac ;;\n    i*:UWIN*:*)\n\techo \"$UNAME_MACHINE\"-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2\"`echo \"$UNAME_RELEASE\"|sed -e 's/[^.]*//'`\"\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo \"`echo \"$UNAME_MACHINE\"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo \"$UNAME_RELEASE\"|sed -e 's,/.*$,,'`\"\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo \"$UNAME_MACHINE-unknown-`echo \"$UNAME_SYSTEM\" | sed 's,^[^/]*/,,' | tr \"[:upper:]\" \"[:lower:]\"``echo \"$UNAME_RELEASE\"|sed -e 's/[-(].*//'`-$LIBC\"\n\texit ;;\n    i*86:Minix:*:*)\n\techo \"$UNAME_MACHINE\"-pc-minix\n\texit ;;\n    aarch64:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=gnulibc1 ; fi\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    arc:Linux:*:* | arceb:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    arm*:Linux:*:*)\n\teval \"$set_cc_for_build\"\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"eabi\n\t    else\n\t\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"eabihf\n\t    fi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    cris:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-axis-linux-\"$LIBC\"\n\texit ;;\n    crisv32:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-axis-linux-\"$LIBC\"\n\texit ;;\n    e2k:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    frv:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    hexagon:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    i*86:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-pc-linux-\"$LIBC\"\n\texit ;;\n    ia64:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    k1om:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    m32r*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    m68*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval \"$set_cc_for_build\"\n\tsed 's/^\t//' << EOF > \"$dummy.c\"\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval \"`$CC_FOR_BUILD -E \"$dummy.c\" 2>/dev/null | grep '^CPU'`\"\n\ttest \"x$CPU\" != x && { echo \"$CPU-unknown-linux-$LIBC\"; exit; }\n\t;;\n    mips64el:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    openrisc*:Linux:*:*)\n\techo or1k-unknown-linux-\"$LIBC\"\n\texit ;;\n    or32:Linux:*:* | or1k*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-\"$LIBC\"\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-\"$LIBC\"\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-\"$LIBC\" ;;\n\t  PA8*) echo hppa2.0-unknown-linux-\"$LIBC\" ;;\n\t  *)    echo hppa-unknown-linux-\"$LIBC\" ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-\"$LIBC\"\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-\"$LIBC\"\n\texit ;;\n    ppc64le:Linux:*:*)\n\techo powerpc64le-unknown-linux-\"$LIBC\"\n\texit ;;\n    ppcle:Linux:*:*)\n\techo powerpcle-unknown-linux-\"$LIBC\"\n\texit ;;\n    riscv32:Linux:*:* | riscv64:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-ibm-linux-\"$LIBC\"\n\texit ;;\n    sh64*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    sh*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    tile*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    vax:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-dec-linux-\"$LIBC\"\n\texit ;;\n    x86_64:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-pc-linux-\"$LIBC\"\n\texit ;;\n    xtensa*:Linux:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-linux-\"$LIBC\"\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\techo \"$UNAME_MACHINE\"-pc-sysv4.2uw\"$UNAME_VERSION\"\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo \"$UNAME_MACHINE\"-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo \"$UNAME_MACHINE\"-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo \"$UNAME_MACHINE\"-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos\"$UNAME_RELEASE\"\n\texit ;;\n    i*86:*DOS:*:*)\n\techo \"$UNAME_MACHINE\"-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:*)\n\tUNAME_REL=`echo \"$UNAME_RELEASE\" | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo \"$UNAME_MACHINE\"-univel-sysv\"$UNAME_REL\"\n\telse\n\t\techo \"$UNAME_MACHINE\"-pc-sysv\"$UNAME_REL\"\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo \"$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}\"\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo \"$UNAME_MACHINE\"-pc-isc\"$UNAME_REL\"\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo \"$UNAME_MACHINE\"-pc-sco\"$UNAME_REL\"\n\telse\n\t\techo \"$UNAME_MACHINE\"-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configure will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n\texit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv\"$UNAME_RELEASE\" # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv\"$UNAME_RELEASE\"  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    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)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3\"$OS_REL\"; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos\"$UNAME_RELEASE\"\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos\"$UNAME_RELEASE\"\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos\"$UNAME_RELEASE\"\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos\"$UNAME_RELEASE\"\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv\"$UNAME_RELEASE\"\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo \"$UNAME_MACHINE\"-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\techo i586-unisys-sysv4\n\texit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo \"$UNAME_MACHINE\"-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux\"$UNAME_RELEASE\"\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t\techo mips-nec-sysv\"$UNAME_RELEASE\"\n\telse\n\t\techo mips-unknown-sysv\"$UNAME_RELEASE\"\n\tfi\n\texit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    x86_64:Haiku:*:*)\n\techo x86_64-unknown-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    SX-ACE:SUPER-UX:*:*)\n\techo sxace-nec-superux\"$UNAME_RELEASE\"\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody\"$UNAME_RELEASE\"\n\texit ;;\n    *:Rhapsody:*:*)\n\techo \"$UNAME_MACHINE\"-apple-rhapsody\"$UNAME_RELEASE\"\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\teval \"$set_cc_for_build\"\n\tif test \"$UNAME_PROCESSOR\" = unknown ; then\n\t    UNAME_PROCESSOR=powerpc\n\tfi\n\tif test \"`echo \"$UNAME_RELEASE\" | sed -e 's/\\..*//'`\" -le 10 ; then\n\t    if [ \"$CC_FOR_BUILD\" != no_compiler_found ]; then\n\t\tif (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t       (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t       grep IS_64BIT_ARCH >/dev/null\n\t\tthen\n\t\t    case $UNAME_PROCESSOR in\n\t\t\ti386) UNAME_PROCESSOR=x86_64 ;;\n\t\t\tpowerpc) UNAME_PROCESSOR=powerpc64 ;;\n\t\t    esac\n\t\tfi\n\t\t# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc\n\t\tif (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \\\n\t\t       (CCOPTS=\"\" $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t       grep IS_PPC >/dev/null\n\t\tthen\n\t\t    UNAME_PROCESSOR=powerpc\n\t\tfi\n\t    fi\n\telif test \"$UNAME_PROCESSOR\" = i386 ; then\n\t    # Avoid executing cc on OS X 10.9, as it ships with a stub\n\t    # that puts up a graphical alert prompting to install\n\t    # developer tools.  Any system running Mac OS X 10.7 or\n\t    # later (Darwin 11 and later) is required to have a 64-bit\n\t    # processor. This is not true of the ARM version of Darwin\n\t    # that Apple uses in portable devices.\n\t    UNAME_PROCESSOR=x86_64\n\tfi\n\techo \"$UNAME_PROCESSOR\"-apple-darwin\"$UNAME_RELEASE\"\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = x86; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo \"$UNAME_PROCESSOR\"-\"$UNAME_MACHINE\"-nto-qnx\"$UNAME_RELEASE\"\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NEO-*:NONSTOP_KERNEL:*:*)\n\techo neo-tandem-nsk\"$UNAME_RELEASE\"\n\texit ;;\n    NSE-*:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk\"$UNAME_RELEASE\"\n\texit ;;\n    NSR-*:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk\"$UNAME_RELEASE\"\n\texit ;;\n    NSV-*:NONSTOP_KERNEL:*:*)\n\techo nsv-tandem-nsk\"$UNAME_RELEASE\"\n\texit ;;\n    NSX-*:NONSTOP_KERNEL:*:*)\n\techo nsx-tandem-nsk\"$UNAME_RELEASE\"\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo \"$UNAME_MACHINE\"-\"$UNAME_SYSTEM\"-\"$UNAME_RELEASE\"\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = 386; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo \"$UNAME_MACHINE\"-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n\techo mips-sei-seiux\"$UNAME_RELEASE\"\n\texit ;;\n    *:DragonFly:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-dragonfly\"`echo \"$UNAME_RELEASE\"|sed -e 's/[-(].*//'`\"\n\texit ;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"$UNAME_MACHINE\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo \"$UNAME_MACHINE\"-pc-skyos\"`echo \"$UNAME_RELEASE\" | sed -e 's/ .*$//'`\"\n\texit ;;\n    i*86:rdos:*:*)\n\techo \"$UNAME_MACHINE\"-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo \"$UNAME_MACHINE\"-pc-aros\n\texit ;;\n    x86_64:VMkernel:*:*)\n\techo \"$UNAME_MACHINE\"-unknown-esx\n\texit ;;\n    amd64:Isilon\\ OneFS:*:*)\n\techo x86_64-unknown-onefs\n\texit ;;\nesac\n\necho \"$0: unable to guess system type\" >&2\n\ncase \"$UNAME_MACHINE:$UNAME_SYSTEM\" in\n    mips:Linux | mips64:Linux)\n\t# If we got here on MIPS GNU/Linux, output extra information.\n\tcat >&2 <<EOF\n\nNOTE: MIPS GNU/Linux systems require a C compiler to fully recognize\nthe system type. Please install a C compiler and try again.\nEOF\n\t;;\nesac\n\ncat >&2 <<EOF\n\nThis script (version $timestamp), has failed to recognize the\noperating system you are using. If your script is old, overwrite *all*\ncopies of config.guess and config.sub with the latest versions from:\n\n  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess\nand\n  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub\n\nIf $0 has already been updated, send the following data and any\ninformation you think might be pertinent to config-patches@gnu.org to\nprovide the necessary information to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = \"$UNAME_MACHINE\"\nUNAME_RELEASE = \"$UNAME_RELEASE\"\nUNAME_SYSTEM  = \"$UNAME_SYSTEM\"\nUNAME_VERSION = \"$UNAME_VERSION\"\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/pcre/config.h.generic",
    "content": "/* config.h.  Generated from config.h.in by configure.  */\n/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* PCRE is written in Standard C, but there are a few non-standard things it\ncan cope with, allowing it to run on SunOS4 and other \"close to standard\"\nsystems.\n\nIn environments that support the GNU autotools, config.h.in is converted into\nconfig.h by the \"configure\" script. In environments that use CMake,\nconfig-cmake.in is converted into config.h. If you are going to build PCRE \"by\nhand\" without using \"configure\" or CMake, you should copy the distributed\nconfig.h.generic to config.h, and edit the macro definitions to be the way you\nneed them. You must then add -DHAVE_CONFIG_H to all of your compile commands,\nso that config.h is included at the start of every source.\n\nAlternatively, you can avoid editing by using -D on the compiler command line\nto set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,\nbut if you do, default values will be taken from config.h for non-boolean\nmacros that are not defined on the command line.\n\nBoolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined\n(conventionally to 1) for TRUE, and not defined at all for FALSE. All such\nmacros are listed as a commented #undef in config.h.generic. Macros such as\nMATCH_LIMIT, whose actual value is relevant, have defaults defined, but are\nsurrounded by #ifndef/#endif lines so that the value can be overridden by -D.\n\nPCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if\nHAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make\nsure both macros are undefined; an emulation function will then be used. */\n\n/* By default, the \\R escape sequence matches any Unicode line ending\n   character or sequence of characters. If BSR_ANYCRLF is defined (to any\n   value), this is changed so that backslash-R matches only CR, LF, or CRLF.\n   The build-time default can be overridden by the user of PCRE at runtime. */\n/* #undef BSR_ANYCRLF */\n\n/* If you are compiling for a system that uses EBCDIC instead of ASCII\n   character codes, define this macro to any value. You must also edit the\n   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).\n   On systems that can use \"configure\" or CMake to set EBCDIC, NEWLINE is\n   automatically adjusted. When EBCDIC is set, PCRE assumes that all input\n   strings are in EBCDIC. If you do not define this macro, PCRE will assume\n   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build\n   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */\n/* #undef EBCDIC */\n\n/* In an EBCDIC environment, define this macro to any value to arrange for the\n   NL character to be 0x25 instead of the default 0x15. NL plays the role that\n   LF does in an ASCII/Unicode environment. The value must also be set in the\n   NEWLINE macro below. On systems that can use \"configure\" or CMake to set\n   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */\n/* #undef EBCDIC_NL25 */\n\n/* Define to 1 if you have the `bcopy' function. */\n/* #undef HAVE_BCOPY */\n\n/* Define to 1 if you have the <bits/type_traits.h> header file. */\n/* #undef HAVE_BITS_TYPE_TRAITS_H */\n\n/* Define to 1 if you have the <bzlib.h> header file. */\n/* #undef HAVE_BZLIB_H */\n\n/* Define to 1 if you have the <dirent.h> header file. */\n/* #undef HAVE_DIRENT_H */\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n/* #undef HAVE_DLFCN_H */\n\n/* Define to 1 if you have the <editline/readline.h> header file. */\n/* #undef HAVE_EDITLINE_READLINE_H */\n\n/* Define to 1 if you have the <edit/readline/readline.h> header file. */\n/* #undef HAVE_EDIT_READLINE_READLINE_H */\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n/* #undef HAVE_INTTYPES_H */\n\n/* Define to 1 if you have the <limits.h> header file. */\n/* #undef HAVE_LIMITS_H */\n\n/* Define to 1 if the system has the type `long long'. */\n/* #undef HAVE_LONG_LONG */\n\n/* Define to 1 if you have the `memmove' function. */\n/* #undef HAVE_MEMMOVE */\n\n/* Define to 1 if you have the <memory.h> header file. */\n/* #undef HAVE_MEMORY_H */\n\n/* Define if you have POSIX threads libraries and header files. */\n/* #undef HAVE_PTHREAD */\n\n/* Have PTHREAD_PRIO_INHERIT. */\n/* #undef HAVE_PTHREAD_PRIO_INHERIT */\n\n/* Define to 1 if you have the <readline/history.h> header file. */\n/* #undef HAVE_READLINE_HISTORY_H */\n\n/* Define to 1 if you have the <readline/readline.h> header file. */\n/* #undef HAVE_READLINE_READLINE_H */\n\n/* Define to 1 if you have the <stdint.h> header file. */\n/* #undef HAVE_STDINT_H */\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n/* #undef HAVE_STDLIB_H */\n\n/* Define to 1 if you have the `strerror' function. */\n/* #undef HAVE_STRERROR */\n\n/* Define to 1 if you have the <string> header file. */\n/* #undef HAVE_STRING */\n\n/* Define to 1 if you have the <strings.h> header file. */\n/* #undef HAVE_STRINGS_H */\n\n/* Define to 1 if you have the <string.h> header file. */\n/* #undef HAVE_STRING_H */\n\n/* Define to 1 if you have `strtoimax'. */\n/* #undef HAVE_STRTOIMAX */\n\n/* Define to 1 if you have `strtoll'. */\n/* #undef HAVE_STRTOLL */\n\n/* Define to 1 if you have `strtoq'. */\n/* #undef HAVE_STRTOQ */\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n/* #undef HAVE_SYS_STAT_H */\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n/* #undef HAVE_SYS_TYPES_H */\n\n/* Define to 1 if you have the <type_traits.h> header file. */\n/* #undef HAVE_TYPE_TRAITS_H */\n\n/* Define to 1 if you have the <unistd.h> header file. */\n/* #undef HAVE_UNISTD_H */\n\n/* Define to 1 if the system has the type `unsigned long long'. */\n/* #undef HAVE_UNSIGNED_LONG_LONG */\n\n/* Define to 1 if the compiler supports simple visibility declarations. */\n/* #undef HAVE_VISIBILITY */\n\n/* Define to 1 if you have the <windows.h> header file. */\n/* #undef HAVE_WINDOWS_H */\n\n/* Define to 1 if you have the <zlib.h> header file. */\n/* #undef HAVE_ZLIB_H */\n\n/* Define to 1 if you have `_strtoi64'. */\n/* #undef HAVE__STRTOI64 */\n\n/* The value of LINK_SIZE determines the number of bytes used to store links\n   as offsets within the compiled regex. The default is 2, which allows for\n   compiled patterns up to 64K long. This covers the vast majority of cases.\n   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows\n   for longer patterns in extreme cases. */\n#ifndef LINK_SIZE\n#define LINK_SIZE 2\n#endif\n\n/* Define to the sub-directory where libtool stores uninstalled libraries. */\n/* This is ignored unless you are using libtool. */\n#ifndef LT_OBJDIR\n#define LT_OBJDIR \".libs/\"\n#endif\n\n/* The value of MATCH_LIMIT determines the default number of times the\n   internal match() function can be called during a single execution of\n   pcre_exec(). There is a runtime interface for setting a different limit.\n   The limit exists in order to catch runaway regular expressions that take\n   for ever to determine that they do not match. The default is set very large\n   so that it does not accidentally catch legitimate cases. */\n#ifndef MATCH_LIMIT\n#define MATCH_LIMIT 10000000\n#endif\n\n/* The above limit applies to all calls of match(), whether or not they\n   increase the recursion depth. In some environments it is desirable to limit\n   the depth of recursive calls of match() more strictly, in order to restrict\n   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is\n   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of\n   match(). To have any useful effect, it must be less than the value of\n   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is\n   a runtime method for setting a different limit. */\n#ifndef MATCH_LIMIT_RECURSION\n#define MATCH_LIMIT_RECURSION MATCH_LIMIT\n#endif\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#ifndef MAX_NAME_COUNT\n#define MAX_NAME_COUNT 10000\n#endif\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#ifndef MAX_NAME_SIZE\n#define MAX_NAME_SIZE 32\n#endif\n\n/* The value of NEWLINE determines the default newline character sequence.\n   PCRE client programs can override this by selecting other values at run\n   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338\n   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or\n   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and\n   0x25) that are used as the NL line terminator that is equivalent to ASCII\n   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),\n   or -2 (ANYCRLF). */\n#ifndef NEWLINE\n#define NEWLINE 10\n#endif\n\n/* PCRE uses recursive function calls to handle backtracking while matching.\n   This can sometimes be a problem on systems that have stacks of limited\n   size. Define NO_RECURSE to any value to get a version that doesn't use\n   recursion in the match() function; instead it creates its own stack by\n   steam using pcre_recurse_malloc() to obtain memory from the heap. For more\n   detail, see the comments and other stuff just above the match() function.\n   */\n/* #undef NO_RECURSE */\n\n/* Name of package */\n#define PACKAGE \"pcre\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"PCRE\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"PCRE 8.43\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"pcre\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"8.43\"\n\n/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested\n   parentheses (of any kind) in a pattern. This limits the amount of system\n   stack that is used while compiling a pattern. */\n#ifndef PARENS_NEST_LIMIT\n#define PARENS_NEST_LIMIT 250\n#endif\n\n/* The value of PCREGREP_BUFSIZE determines the size of buffer used by\n   pcregrep to hold parts of the file it is searching. This is also the\n   minimum value. The actual amount of memory used by pcregrep is three times\n   this number, because it allows for the buffering of \"before\" and \"after\"\n   lines. */\n#ifndef PCREGREP_BUFSIZE\n#define PCREGREP_BUFSIZE 20480\n#endif\n\n/* If you are compiling for a system other than a Unix-like system or\n   Win32, and it needs some magic to be inserted before the definition\n   of a function that is exported by the library, define this macro to\n   contain the relevant magic. If you do not define this macro, a suitable\n    __declspec value is used for Windows systems; in other environments\n   \"extern\" is used for a C compiler and \"extern C\" for a C++ compiler.\n   This macro apears at the start of every exported function that is part\n   of the external API. It does not appear on functions that are \"external\"\n   in the C sense, but which are internal to the library. */\n/* #undef PCRE_EXP_DEFN */\n\n/* Define to any value if linking statically (TODO: make nice with Libtool) */\n/* #undef PCRE_STATIC */\n\n/* When calling PCRE via the POSIX interface, additional working storage is\n   required for holding the pointers to capturing substrings because PCRE\n   requires three integers per substring, whereas the POSIX interface provides\n   only two. If the number of expected substrings is small, the wrapper\n   function uses space on the stack, because this is faster than using\n   malloc() for each call. The threshold above which the stack is no longer\n   used is defined by POSIX_MALLOC_THRESHOLD. */\n#ifndef POSIX_MALLOC_THRESHOLD\n#define POSIX_MALLOC_THRESHOLD 10\n#endif\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n/* #undef PTHREAD_CREATE_JOINABLE */\n\n/* Define to 1 if you have the ANSI C header files. */\n/* #undef STDC_HEADERS */\n\n/* Define to any value to enable support for Just-In-Time compiling. */\n/* #undef SUPPORT_JIT */\n\n/* Define to any value to allow pcregrep to be linked with libbz2, so that it\n   is able to handle .bz2 files. */\n/* #undef SUPPORT_LIBBZ2 */\n\n/* Define to any value to allow pcretest to be linked with libedit. */\n/* #undef SUPPORT_LIBEDIT */\n\n/* Define to any value to allow pcretest to be linked with libreadline. */\n/* #undef SUPPORT_LIBREADLINE */\n\n/* Define to any value to allow pcregrep to be linked with libz, so that it is\n   able to handle .gz files. */\n/* #undef SUPPORT_LIBZ */\n\n/* Define to any value to enable the 16 bit PCRE library. */\n/* #undef SUPPORT_PCRE16 */\n\n/* Define to any value to enable the 32 bit PCRE library. */\n/* #undef SUPPORT_PCRE32 */\n\n/* Define to any value to enable the 8 bit PCRE library. */\n/* #undef SUPPORT_PCRE8 */\n\n/* Define to any value to enable JIT support in pcregrep. */\n/* #undef SUPPORT_PCREGREP_JIT */\n\n/* Define to any value to enable support for Unicode properties. */\n/* #undef SUPPORT_UCP */\n\n/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.\n   This will work even in an EBCDIC environment, but it is incompatible with\n   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*\n   ASCII/UTF-8/16/32, but not both at once. */\n/* #undef SUPPORT_UTF */\n\n/* Define to any value for valgrind support to find invalid memory reads. */\n/* #undef SUPPORT_VALGRIND */\n\n/* Version number of package */\n#define VERSION \"8.43\"\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Define to the type of a signed integer type of width exactly 64 bits if\n   such a type exists and the standard includes do not define it. */\n/* #undef int64_t */\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n/* #undef size_t */\n"
  },
  {
    "path": "src/pcre/config.h.in",
    "content": "/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n\n/* PCRE is written in Standard C, but there are a few non-standard things it\ncan cope with, allowing it to run on SunOS4 and other \"close to standard\"\nsystems.\n\nIn environments that support the GNU autotools, config.h.in is converted into\nconfig.h by the \"configure\" script. In environments that use CMake,\nconfig-cmake.in is converted into config.h. If you are going to build PCRE \"by\nhand\" without using \"configure\" or CMake, you should copy the distributed\nconfig.h.generic to config.h, and edit the macro definitions to be the way you\nneed them. You must then add -DHAVE_CONFIG_H to all of your compile commands,\nso that config.h is included at the start of every source.\n\nAlternatively, you can avoid editing by using -D on the compiler command line\nto set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,\nbut if you do, default values will be taken from config.h for non-boolean\nmacros that are not defined on the command line.\n\nBoolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined\n(conventionally to 1) for TRUE, and not defined at all for FALSE. All such\nmacros are listed as a commented #undef in config.h.generic. Macros such as\nMATCH_LIMIT, whose actual value is relevant, have defaults defined, but are\nsurrounded by #ifndef/#endif lines so that the value can be overridden by -D.\n\nPCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if\nHAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make\nsure both macros are undefined; an emulation function will then be used. */\n\n/* By default, the \\R escape sequence matches any Unicode line ending\n   character or sequence of characters. If BSR_ANYCRLF is defined (to any\n   value), this is changed so that backslash-R matches only CR, LF, or CRLF.\n   The build-time default can be overridden by the user of PCRE at runtime. */\n#undef BSR_ANYCRLF\n\n/* If you are compiling for a system that uses EBCDIC instead of ASCII\n   character codes, define this macro to any value. You must also edit the\n   NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).\n   On systems that can use \"configure\" or CMake to set EBCDIC, NEWLINE is\n   automatically adjusted. When EBCDIC is set, PCRE assumes that all input\n   strings are in EBCDIC. If you do not define this macro, PCRE will assume\n   input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build\n   a version of PCRE that supports both EBCDIC and UTF-8/16/32. */\n#undef EBCDIC\n\n/* In an EBCDIC environment, define this macro to any value to arrange for the\n   NL character to be 0x25 instead of the default 0x15. NL plays the role that\n   LF does in an ASCII/Unicode environment. The value must also be set in the\n   NEWLINE macro below. On systems that can use \"configure\" or CMake to set\n   EBCDIC_NL25, the adjustment of NEWLINE is automatic. */\n#undef EBCDIC_NL25\n\n/* Define to 1 if you have the `bcopy' function. */\n#undef HAVE_BCOPY\n\n/* Define to 1 if you have the <bits/type_traits.h> header file. */\n#undef HAVE_BITS_TYPE_TRAITS_H\n\n/* Define to 1 if you have the <bzlib.h> header file. */\n#undef HAVE_BZLIB_H\n\n/* Define to 1 if you have the <dirent.h> header file. */\n#undef HAVE_DIRENT_H\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <editline/readline.h> header file. */\n#undef HAVE_EDITLINE_READLINE_H\n\n/* Define to 1 if you have the <edit/readline/readline.h> header file. */\n#undef HAVE_EDIT_READLINE_READLINE_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <limits.h> header file. */\n#undef HAVE_LIMITS_H\n\n/* Define to 1 if the system has the type `long long'. */\n#undef HAVE_LONG_LONG\n\n/* Define to 1 if you have the `memmove' function. */\n#undef HAVE_MEMMOVE\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define if you have POSIX threads libraries and header files. */\n#undef HAVE_PTHREAD\n\n/* Have PTHREAD_PRIO_INHERIT. */\n#undef HAVE_PTHREAD_PRIO_INHERIT\n\n/* Define to 1 if you have the <readline/history.h> header file. */\n#undef HAVE_READLINE_HISTORY_H\n\n/* Define to 1 if you have the <readline/readline.h> header file. */\n#undef HAVE_READLINE_READLINE_H\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the `strerror' function. */\n#undef HAVE_STRERROR\n\n/* Define to 1 if you have the <string> header file. */\n#undef HAVE_STRING\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have `strtoimax'. */\n#undef HAVE_STRTOIMAX\n\n/* Define to 1 if you have `strtoll'. */\n#undef HAVE_STRTOLL\n\n/* Define to 1 if you have `strtoq'. */\n#undef HAVE_STRTOQ\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <type_traits.h> header file. */\n#undef HAVE_TYPE_TRAITS_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if the system has the type `unsigned long long'. */\n#undef HAVE_UNSIGNED_LONG_LONG\n\n/* Define to 1 if the compiler supports simple visibility declarations. */\n#undef HAVE_VISIBILITY\n\n/* Define to 1 if you have the <windows.h> header file. */\n#undef HAVE_WINDOWS_H\n\n/* Define to 1 if you have the <zlib.h> header file. */\n#undef HAVE_ZLIB_H\n\n/* Define to 1 if you have `_strtoi64'. */\n#undef HAVE__STRTOI64\n\n/* The value of LINK_SIZE determines the number of bytes used to store links\n   as offsets within the compiled regex. The default is 2, which allows for\n   compiled patterns up to 64K long. This covers the vast majority of cases.\n   However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows\n   for longer patterns in extreme cases. */\n#undef LINK_SIZE\n\n/* Define to the sub-directory where libtool stores uninstalled libraries. */\n#undef LT_OBJDIR\n\n/* The value of MATCH_LIMIT determines the default number of times the\n   internal match() function can be called during a single execution of\n   pcre_exec(). There is a runtime interface for setting a different limit.\n   The limit exists in order to catch runaway regular expressions that take\n   for ever to determine that they do not match. The default is set very large\n   so that it does not accidentally catch legitimate cases. */\n#undef MATCH_LIMIT\n\n/* The above limit applies to all calls of match(), whether or not they\n   increase the recursion depth. In some environments it is desirable to limit\n   the depth of recursive calls of match() more strictly, in order to restrict\n   the maximum amount of stack (or heap, if NO_RECURSE is defined) that is\n   used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of\n   match(). To have any useful effect, it must be less than the value of\n   MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is\n   a runtime method for setting a different limit. */\n#undef MATCH_LIMIT_RECURSION\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#undef MAX_NAME_COUNT\n\n/* This limit is parameterized just in case anybody ever wants to change it.\n   Care must be taken if it is increased, because it guards against integer\n   overflow caused by enormously large patterns. */\n#undef MAX_NAME_SIZE\n\n/* The value of NEWLINE determines the default newline character sequence.\n   PCRE client programs can override this by selecting other values at run\n   time. In ASCII environments, the value can be 10 (LF), 13 (CR), or 3338\n   (CRLF); in EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or\n   3349 or 3365 (CRLF) because there are two alternative codepoints (0x15 and\n   0x25) that are used as the NL line terminator that is equivalent to ASCII\n   LF. In both ASCII and EBCDIC environments the value can also be -1 (ANY),\n   or -2 (ANYCRLF). */\n#undef NEWLINE\n\n/* PCRE uses recursive function calls to handle backtracking while matching.\n   This can sometimes be a problem on systems that have stacks of limited\n   size. Define NO_RECURSE to any value to get a version that doesn't use\n   recursion in the match() function; instead it creates its own stack by\n   steam using pcre_recurse_malloc() to obtain memory from the heap. For more\n   detail, see the comments and other stuff just above the match() function.\n   */\n#undef NO_RECURSE\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested\n   parentheses (of any kind) in a pattern. This limits the amount of system\n   stack that is used while compiling a pattern. */\n#undef PARENS_NEST_LIMIT\n\n/* to make a symbol visible */\n#undef PCRECPP_EXP_DECL\n\n/* to make a symbol visible */\n#undef PCRECPP_EXP_DEFN\n\n/* The value of PCREGREP_BUFSIZE determines the size of buffer used by\n   pcregrep to hold parts of the file it is searching. This is also the\n   minimum value. The actual amount of memory used by pcregrep is three times\n   this number, because it allows for the buffering of \"before\" and \"after\"\n   lines. */\n#undef PCREGREP_BUFSIZE\n\n/* to make a symbol visible */\n#undef PCREPOSIX_EXP_DECL\n\n/* to make a symbol visible */\n#undef PCREPOSIX_EXP_DEFN\n\n/* to make a symbol visible */\n#undef PCRE_EXP_DATA_DEFN\n\n/* to make a symbol visible */\n#undef PCRE_EXP_DECL\n\n\n/* If you are compiling for a system other than a Unix-like system or\n   Win32, and it needs some magic to be inserted before the definition\n   of a function that is exported by the library, define this macro to\n   contain the relevant magic. If you do not define this macro, a suitable\n    __declspec value is used for Windows systems; in other environments\n   \"extern\" is used for a C compiler and \"extern C\" for a C++ compiler.\n   This macro apears at the start of every exported function that is part\n   of the external API. It does not appear on functions that are \"external\"\n   in the C sense, but which are internal to the library. */\n#undef PCRE_EXP_DEFN\n\n/* Define to any value if linking statically (TODO: make nice with Libtool) */\n#undef PCRE_STATIC\n\n/* When calling PCRE via the POSIX interface, additional working storage is\n   required for holding the pointers to capturing substrings because PCRE\n   requires three integers per substring, whereas the POSIX interface provides\n   only two. If the number of expected substrings is small, the wrapper\n   function uses space on the stack, because this is faster than using\n   malloc() for each call. The threshold above which the stack is no longer\n   used is defined by POSIX_MALLOC_THRESHOLD. */\n#undef POSIX_MALLOC_THRESHOLD\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#undef PTHREAD_CREATE_JOINABLE\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Define to any value to enable support for Just-In-Time compiling. */\n#undef SUPPORT_JIT\n\n/* Define to any value to allow pcregrep to be linked with libbz2, so that it\n   is able to handle .bz2 files. */\n#undef SUPPORT_LIBBZ2\n\n/* Define to any value to allow pcretest to be linked with libedit. */\n#undef SUPPORT_LIBEDIT\n\n/* Define to any value to allow pcretest to be linked with libreadline. */\n#undef SUPPORT_LIBREADLINE\n\n/* Define to any value to allow pcregrep to be linked with libz, so that it is\n   able to handle .gz files. */\n#undef SUPPORT_LIBZ\n\n/* Define to any value to enable the 16 bit PCRE library. */\n#undef SUPPORT_PCRE16\n\n/* Define to any value to enable the 32 bit PCRE library. */\n#undef SUPPORT_PCRE32\n\n/* Define to any value to enable the 8 bit PCRE library. */\n#undef SUPPORT_PCRE8\n\n/* Define to any value to enable JIT support in pcregrep. */\n#undef SUPPORT_PCREGREP_JIT\n\n/* Define to any value to enable support for Unicode properties. */\n#undef SUPPORT_UCP\n\n/* Define to any value to enable support for the UTF-8/16/32 Unicode encoding.\n   This will work even in an EBCDIC environment, but it is incompatible with\n   the EBCDIC macro. That is, PCRE can support *either* EBCDIC code *or*\n   ASCII/UTF-8/16/32, but not both at once. */\n#undef SUPPORT_UTF\n\n/* Define to any value for valgrind support to find invalid memory reads. */\n#undef SUPPORT_VALGRIND\n\n/* Version number of package */\n#undef VERSION\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to the type of a signed integer type of width exactly 64 bits if\n   such a type exists and the standard includes do not define it. */\n#undef int64_t\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n"
  },
  {
    "path": "src/pcre/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright 1992-2018 Free Software Foundation, Inc.\n\ntimestamp='2018-03-08'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <https://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n\n\n# Please send patches to <config-patches@gnu.org>.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS\n\nCanonicalize a configuration name.\n\nOptions:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright 1992-2018 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo \"$1\"\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo \"$1\" | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \\\n  kopensolaris*-gnu* | cloudabi*-eabi* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo \"$1\" | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  android-linux)\n    os=-linux-android\n    basic_machine=`echo \"$1\" | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`-unknown\n    ;;\n  *)\n    basic_machine=`echo \"$1\" | sed 's/-[^-]*$//'`\n    if [ \"$basic_machine\" != \"$1\" ]\n    then os=`echo \"$1\" | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze*)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-bluegene*)\n\t\tos=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusrdb)\n\t\tos=-chorusrdb\n\t\tbasic_machine=$1\n\t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*178)\n\t\tos=-lynxos178\n\t\t;;\n\t-lynx*5)\n\t\tos=-lynxos5\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| aarch64 | aarch64_be \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arceb \\\n\t| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \\\n\t| avr | avr32 \\\n\t| ba \\\n\t| be32 | be64 \\\n\t| bfin \\\n\t| c4x | c8051 | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| e2k | epiphany \\\n\t| fido | fr30 | frv | ft32 \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| hexagon \\\n\t| i370 | i860 | i960 | ia16 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| k1om \\\n\t| le32 | le64 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | microblazeel | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa32r6 | mipsisa32r6el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64r6 | mipsisa64r6el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipsr5900 | mipsr5900el \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nds32 | nds32le | nds32be \\\n\t| nios | nios2 | nios2eb | nios2el \\\n\t| ns16k | ns32k \\\n\t| open8 | or1k | or1knd | or32 \\\n\t| pdp10 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle \\\n\t| pru \\\n\t| pyramid \\\n\t| riscv32 | riscv64 \\\n\t| rl78 | rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu \\\n\t| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \\\n\t| visium \\\n\t| wasm32 \\\n\t| x86 | xc16x | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tc54x)\n\t\tbasic_machine=tic54x-unknown\n\t\t;;\n\tc55x)\n\t\tbasic_machine=tic55x-unknown\n\t\t;;\n\tc6x)\n\t\tbasic_machine=tic6x-unknown\n\t\t;;\n\tleon|leon[3-9])\n\t\tbasic_machine=sparc-$basic_machine\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\tstrongarm | thumb | xscale)\n\t\tbasic_machine=arm-unknown\n\t\t;;\n\txgate)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\txscaleeb)\n\t\tbasic_machine=armeb-unknown\n\t\t;;\n\n\txscaleel)\n\t\tbasic_machine=armel-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`\"$1\"\\': machine \\`\"$basic_machine\"\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| aarch64-* | aarch64_be-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| ba-* \\\n\t| be32-* | be64-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* \\\n\t| c8051-* | clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| e2k-* | elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| hexagon-* \\\n\t| i*86-* | i860-* | i960-* | ia16-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| k1om-* \\\n\t| le32-* | le64-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \\\n\t| microblaze-* | microblazeel-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa32r6-* | mipsisa32r6el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64r6-* | mipsisa64r6el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipsr5900-* | mipsr5900el-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nds32-* | nds32le-* | nds32be-* \\\n\t| nios-* | nios2-* | nios2eb-* | nios2el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| open8-* \\\n\t| or1k*-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \\\n\t| pru-* \\\n\t| pyramid-* \\\n\t| riscv32-* | riscv64-* \\\n\t| rl78-* | romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \\\n\t| tahoe-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile*-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \\\n\t| vax-* \\\n\t| visium-* \\\n\t| wasm32-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-pc\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\tasmjs)\n\t\tbasic_machine=asmjs-unknown\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc54x-*)\n\t\tbasic_machine=tic54x-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tc55x-*)\n\t\tbasic_machine=tic55x-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tc6x-*)\n\t\tbasic_machine=tic6x-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tcegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16 | cr16-*)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2*)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\te500v[12])\n\t\tbasic_machine=powerpc-unknown\n\t\tos=$os\"spe\"\n\t\t;;\n\te500v[12]-*)\n\t\tbasic_machine=powerpc-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\tos=$os\"spe\"\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n\ti*86v32)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo \"$1\" | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\tvsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tleon-*|leon[3-9]-*)\n\t\tbasic_machine=sparc-`echo \"$basic_machine\" | sed 's/-.*//'`\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmicroblaze*)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-mingw64\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmoxiebox)\n\t\tbasic_machine=moxie-unknown\n\t\tos=-moxiebox\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmsys)\n\t\tbasic_machine=i686-pc\n\t\tos=-msys\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tnacl)\n\t\tbasic_machine=le32-unknown\n\t\tos=-nacl\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next)\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tneo-tandem)\n\t\tbasic_machine=neo-tandem\n\t\t;;\n\tnse-tandem)\n\t\tbasic_machine=nse-tandem\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\tnsv-tandem)\n\t\tbasic_machine=nsv-tandem\n\t\t;;\n\tnsx-tandem)\n\t\tbasic_machine=nsx-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc | ppcbe)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tbasic_machine=powerpc-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos | rdos64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-rdos\n\t\t;;\n\trdos32)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsimso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tbasic_machine=arm-`echo \"$basic_machine\" | sed 's/^[^-]*-//'`\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttile*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\tx64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed 's/^xscale/arm/'`\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`\"$1\"\\': machine \\`\"$basic_machine\"\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo \"$basic_machine\" | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n\t# First match some system type aliases that might get confused\n\t# with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-auroraux)\n\t\tos=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# es1800 is here to avoid being matched by es* (a different OS)\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t# Now accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST end in a * to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* | -plan9* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* | -cloudabi* | -sortix* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \\\n\t      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \\\n\t      | -linux-newlib* | -linux-musl* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \\\n\t      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \\\n\t      | -midnightbsd*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -xray | -os68k* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo \"$os\" | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo \"$os\" | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo \"$os\" | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2)\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n\t-pikeos*)\n\t\t# Until real need of OS specific support for\n\t\t# particular features comes up, bare metal\n\t\t# configurations are quite functional.\n\t\tcase $basic_machine in\n\t\t    arm*)\n\t\t\tos=-eabi\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-elf\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nacl*)\n\t\t;;\n\t-ios)\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`\"$1\"\\': system \\`\"$os\"\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\tscore-*)\n\t\tos=-elf\n\t\t;;\n\tspu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=-coff\n\t\t;;\n\tc8051-*)\n\t\tos=-elf\n\t\t;;\n\thexagon-*)\n\t\tos=-elf\n\t\t;;\n\ttic54x-*)\n\t\tos=-coff\n\t\t;;\n\ttic55x-*)\n\t\tos=-coff\n\t\t;;\n\ttic6x-*)\n\t\tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\tpru-*)\n\t\tos=-elf\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next)\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo \"$basic_machine\" | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho \"$basic_machine$os\"\nexit\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/pcre/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69 for PCRE 8.43.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\n\n  test -n \\\"\\${ZSH_VERSION+set}\\${BASH_VERSION+set}\\\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \\\"X\\`printf %s \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" \\\\\n      || test \\\"X\\`print -r -- \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" ) || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='PCRE'\nPACKAGE_TARNAME='pcre'\nPACKAGE_VERSION='8.43'\nPACKAGE_STRING='PCRE 8.43'\nPACKAGE_BUGREPORT=''\nPACKAGE_URL=''\n\nac_unique_file=\"pcre.h.in\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nWITH_GCOV_FALSE\nWITH_GCOV_TRUE\nGCOV_LIBS\nGCOV_CXXFLAGS\nGCOV_CFLAGS\nGENHTML\nLCOV\nSHTOOL\nVALGRIND_LIBS\nVALGRIND_CFLAGS\nPKG_CONFIG_LIBDIR\nPKG_CONFIG_PATH\nPKG_CONFIG\nLIBBZ2\nLIBZ\nDISTCHECK_CONFIGURE_FLAGS\nEXTRA_LIBPCRECPP_LDFLAGS\nEXTRA_LIBPCREPOSIX_LDFLAGS\nEXTRA_LIBPCRE32_LDFLAGS\nEXTRA_LIBPCRE16_LDFLAGS\nEXTRA_LIBPCRE_LDFLAGS\nPTHREAD_CFLAGS\nPTHREAD_LIBS\nPTHREAD_CC\nax_pthread_config\nPCRE_STATIC_CFLAG\nLIBREADLINE\nWITH_VALGRIND_FALSE\nWITH_VALGRIND_TRUE\nWITH_UTF_FALSE\nWITH_UTF_TRUE\nWITH_JIT_FALSE\nWITH_JIT_TRUE\nWITH_REBUILD_CHARTABLES_FALSE\nWITH_REBUILD_CHARTABLES_TRUE\nWITH_PCRE_CPP_FALSE\nWITH_PCRE_CPP_TRUE\nWITH_PCRE32_FALSE\nWITH_PCRE32_TRUE\nWITH_PCRE16_FALSE\nWITH_PCRE16_TRUE\nWITH_PCRE8_FALSE\nWITH_PCRE8_TRUE\npcre_have_bits_type_traits\npcre_have_type_traits\npcre_have_ulong_long\npcre_have_long_long\nenable_cpp\nenable_pcre32\nenable_pcre16\nenable_pcre8\nPCRE_DATE\nPCRE_PRERELEASE\nPCRE_MINOR\nPCRE_MAJOR\nHAVE_VISIBILITY\nVISIBILITY_CXXFLAGS\nVISIBILITY_CFLAGS\nCXXCPP\nLT_SYS_LIBRARY_PATH\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nMANIFEST_TOOL\nRANLIB\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nSED\nLIBTOOL\nOBJDUMP\nDLLTOOL\nAS\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nEGREP\nGREP\nCPP\nam__fastdepCXX_FALSE\nam__fastdepCXX_TRUE\nCXXDEPMODE\nac_ct_CXX\nCXXFLAGS\nCXX\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nam__nodep\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\nac_ct_AR\nAR\nAM_BACKSLASH\nAM_DEFAULT_VERBOSITY\nAM_DEFAULT_V\nAM_V\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL\nam__quote'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_silent_rules\nenable_dependency_tracking\nenable_shared\nenable_static\nwith_pic\nenable_fast_install\nwith_aix_soname\nwith_gnu_ld\nwith_sysroot\nenable_libtool_lock\nenable_pcre8\nenable_pcre16\nenable_pcre32\nenable_cpp\nenable_jit\nenable_pcregrep_jit\nenable_rebuild_chartables\nenable_utf8\nenable_utf\nenable_unicode_properties\nenable_newline_is_cr\nenable_newline_is_lf\nenable_newline_is_crlf\nenable_newline_is_anycrlf\nenable_newline_is_any\nenable_bsr_anycrlf\nenable_ebcdic\nenable_ebcdic_nl25\nenable_stack_for_recursion\nenable_pcregrep_libz\nenable_pcregrep_libbz2\nwith_pcregrep_bufsize\nenable_pcretest_libedit\nenable_pcretest_libreadline\nwith_posix_malloc_threshold\nwith_link_size\nwith_parens_nest_limit\nwith_match_limit\nwith_match_limit_recursion\nenable_valgrind\nenable_coverage\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCXX\nCXXFLAGS\nCCC\nCPP\nLT_SYS_LIBRARY_PATH\nCXXCPP\nPKG_CONFIG\nPKG_CONFIG_PATH\nPKG_CONFIG_LIBDIR\nVALGRIND_CFLAGS\nVALGRIND_LIBS\nLCOV\nGENHTML'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures PCRE 8.43 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/pcre]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of PCRE 8.43:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-silent-rules   less verbose build output (undo: \"make V=1\")\n  --disable-silent-rules  verbose build output (undo: \"make V=0\")\n  --enable-dependency-tracking\n                          do not reject slow dependency extractors\n  --disable-dependency-tracking\n                          speeds up one-time build\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n  --disable-pcre8         disable 8 bit character support\n  --enable-pcre16         enable 16 bit character support\n  --enable-pcre32         enable 32 bit character support\n  --disable-cpp           disable C++ support\n  --enable-jit            enable Just-In-Time compiling support\n  --disable-pcregrep-jit  disable JIT support in pcregrep\n  --enable-rebuild-chartables\n                          rebuild character tables in current locale\n  --enable-utf8           another name for --enable-utf. Kept only for\n                          compatibility reasons\n  --enable-utf            enable UTF-8/16/32 support (incompatible with\n                          --enable-ebcdic)\n  --enable-unicode-properties\n                          enable Unicode properties support (implies\n                          --enable-utf)\n  --enable-newline-is-cr  use CR as newline character\n  --enable-newline-is-lf  use LF as newline character (default)\n  --enable-newline-is-crlf\n                          use CRLF as newline sequence\n  --enable-newline-is-anycrlf\n                          use CR, LF, or CRLF as newline sequence\n  --enable-newline-is-any use any valid Unicode newline sequence\n  --enable-bsr-anycrlf    \\R matches only CR, LF, CRLF by default\n  --enable-ebcdic         assume EBCDIC coding rather than ASCII; incompatible\n                          with --enable-utf; use only in (uncommon) EBCDIC\n                          environments; it implies --enable-rebuild-chartables\n  --enable-ebcdic-nl25    set EBCDIC code for NL to 0x25 instead of 0x15; it\n                          implies --enable-ebcdic\n  --disable-stack-for-recursion\n                          don't use stack recursion when matching\n  --enable-pcregrep-libz  link pcregrep with libz to handle .gz files\n  --enable-pcregrep-libbz2\n                          link pcregrep with libbz2 to handle .bz2 files\n  --enable-pcretest-libedit\n                          link pcretest with libedit\n  --enable-pcretest-libreadline\n                          link pcretest with libreadline\n  --enable-valgrind       valgrind support\n  --enable-coverage       enable code coverage reports using gcov\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-aix-soname=aix|svr4|both\n                          shared library versioning (aka \"SONAME\") variant to\n                          provide on AIX, [default=aix].\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the\n                          compiler's sysroot if not specified).\n  --with-pcregrep-bufsize=N\n                          pcregrep buffer size (default=20480, minimum=8192)\n  --with-posix-malloc-threshold=NBYTES\n                          threshold for POSIX malloc usage (default=10)\n  --with-link-size=N      internal link size (2, 3, or 4 allowed; default=2)\n  --with-parens-nest-limit=N\n                          nested parentheses limit (default=250)\n  --with-match-limit=N    default limit on internal looping (default=10000000)\n  --with-match-limit-recursion=N\n                          default limit on internal recursion\n                          (default=MATCH_LIMIT)\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  CPP         C preprocessor\n  LT_SYS_LIBRARY_PATH\n              User-defined run-time library search path.\n  CXXCPP      C++ preprocessor\n  PKG_CONFIG  path to pkg-config utility\n  PKG_CONFIG_PATH\n              directories to add to pkg-config's search path\n  PKG_CONFIG_LIBDIR\n              path overriding pkg-config's built-in search path\n  VALGRIND_CFLAGS\n              C compiler flags for VALGRIND, overriding pkg-config\n  VALGRIND_LIBS\n              linker flags for VALGRIND, overriding pkg-config\n  LCOV        the ltp lcov program\n  GENHTML     the ltp genhtml program\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nPCRE configure 8.43\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_cxx_try_compile LINENO\n# ----------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_find_intX_t LINENO BITS VAR\n# -----------------------------------\n# Finds a signed integer type with width BITS, setting cache variable VAR\n# accordingly.\nac_fn_c_find_intX_t ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for int$2_t\" >&5\n$as_echo_n \"checking for int$2_t... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n     # Order is important - never check a type that is potentially smaller\n     # than half of the expected target width.\n     for ac_type in int$2_t 'int' 'long int' \\\n\t 'long long int' 'short int' 'signed char'; do\n       cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\n\t     enum { N = $2 / 2 - 1 };\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];\ntest_array [0] = 0;\nreturn test_array [0];\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\n\t        enum { N = $2 / 2 - 1 };\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)\n\t\t < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];\ntest_array [0] = 0;\nreturn test_array [0];\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  case $ac_type in #(\n  int$2_t) :\n    eval \"$3=yes\" ;; #(\n  *) :\n    eval \"$3=\\$ac_type\" ;;\nesac\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n       if eval test \\\"x\\$\"$3\"\\\" = x\"no\"; then :\n\nelse\n  break\nfi\n     done\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_find_intX_t\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\n\n# ac_fn_cxx_try_cpp LINENO\n# ------------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_cpp\n\n# ac_fn_cxx_try_link LINENO\n# -------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_link\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_mongrel\n\n# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES\n# ---------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_cxx_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_header_mongrel\n\n# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES\n# ---------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_cxx_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_cxx_check_type\n\n# ac_fn_c_check_type LINENO TYPE VAR INCLUDES\n# -------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_c_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_type\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by PCRE $as_me 8.43, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\nam__api_version='1.16'\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error $? \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error $? \"unsafe srcdir value: '$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$*\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tas_fn_error $? \"ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment\" \"$LINENO\" 5\n     fi\n     if test \"$2\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error $? \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\n\nrm -f conftest.file\n\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# Expand $ac_aux_dir to an absolute path.\nam_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: 'missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if ${ac_cv_path_mkdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\" || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AWK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=1;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error $? \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='pcre'\n VERSION='8.43'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nmkdir_p='$(MKDIR_P)'\n\n# We need awk for the \"check\" target (and possibly the TAP driver).  The\n# system \"awk\" is bad on some platforms.\n# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAMTAR='$${TAR-tar}'\n\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar  pax cpio none'\n\nam__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'\n\n\n\n\n\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <https://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    as_fn_error $? \"Your 'rm' program is bad, sorry.\" \"$LINENO\" 5\n  fi\nfi\n\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=0;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\nac_config_headers=\"$ac_config_headers config.h\"\n\n\n# This is a new thing required to stop a warning from automake 1.12\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive\" >&5\n$as_echo_n \"checking whether ${MAKE-make} supports the include directive... \" >&6; }\ncat > confinc.mk << 'END'\nam__doit:\n\t@echo this is the am__doit target >confinc.out\n.PHONY: am__doit\nEND\nam__include=\"#\"\nam__quote=\n# BSD make does it like this.\necho '.include \"confinc.mk\" # ignored' > confmf.BSD\n# Other make implementations (GNU, Solaris 10, AIX) do it like this.\necho 'include confinc.mk # ignored' > confmf.GNU\n_am_result=no\nfor s in GNU BSD; do\n  { echo \"$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out\" >&5\n   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); }\n  case $?:`cat confinc.out 2>/dev/null` in #(\n  '0:this is the am__doit target') :\n    case $s in #(\n  BSD) :\n    am__include='.include' am__quote='\"' ;; #(\n  *) :\n    am__include='include' am__quote='' ;;\nesac ;; #(\n  *) :\n     ;;\nesac\n  if test \"$am__include\" != \"#\"; then\n    _am_result=\"yes ($s style)\"\n    break\n  fi\ndone\nrm -f confinc.* confmf.*\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${_am_result}\" >&5\n$as_echo \"${_am_result}\" >&6; }\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together\" >&5\n$as_echo_n \"checking whether $CC understands -c and -o together... \" >&6; }\nif ${am_cv_prog_cc_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if { echo \"$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext\" >&5\n   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o\" >&5\n$as_echo \"$am_cv_prog_cc_c_o\" >&6; }\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar lib \"link -lib\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar lib \"link -lib\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface\" >&5\n$as_echo_n \"checking the archiver ($AR) interface... \" >&6; }\nif ${am_cv_ar_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n   am_cv_ar_interface=ar\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint some_variable = 0;\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$am_ar_try\\\"\"; } >&5\n  (eval $am_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test \"$ac_status\" -eq 0; then\n        am_cv_ar_interface=ar\n      else\n        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'\n        { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$am_ar_try\\\"\"; } >&5\n  (eval $am_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n        if test \"$ac_status\" -eq 0; then\n          am_cv_ar_interface=lib\n        else\n          am_cv_ar_interface=unknown\n        fi\n      fi\n      rm -f conftest.lib libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface\" >&5\n$as_echo \"$am_cv_ar_interface\" >&6; }\n\ncase $am_cv_ar_interface in\nar)\n  ;;\nlib)\n  # Microsoft lib, so override with the ar-lib wrapper script.\n  # FIXME: It is wrong to rewrite AR.\n  # But if we don't then we get into trouble of one sort or another.\n  # A longer-term fix would be to have automake use am__AR in this case,\n  # and then we could set am__AR=\"$am_aux_dir/ar-lib \\$(AR)\" or something\n  # similar.\n  AR=\"$am_aux_dir/ar-lib $AR\"\n  ;;\nunknown)\n  as_fn_error $? \"could not determine $AR interface\" \"$LINENO\" 5\n  ;;\nesac\n\n\n# This was added at the suggestion of libtoolize (03-Jan-10)\n\n\n# The default CFLAGS and CXXFLAGS in Autoconf are \"-g -O2\" for gcc and just\n# \"-g\" for any other compiler. There doesn't seem to be a standard way of\n# getting rid of the -g (which I don't think is needed for a production\n# library). This fudge seems to achieve the necessary. First, we remember the\n# externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and\n# AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not\n# set, they will be set to Autoconf's defaults. Afterwards, if the original\n# values were not set, remove the -g from the Autoconf defaults.\n# (PH 02-May-07)\n\nremember_set_CFLAGS=\"$CFLAGS\"\nremember_set_CXXFLAGS=\"$CXXFLAGS\"\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together\" >&5\n$as_echo_n \"checking whether $CC understands -c and -o together... \" >&6; }\nif ${am_cv_prog_cc_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if { echo \"$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext\" >&5\n   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o\" >&5\n$as_echo \"$am_cv_prog_cc_c_o\" >&6; }\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif ${ac_cv_cxx_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif ${ac_cv_prog_cxx_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CXX_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n\n\n\nif test \"x$remember_set_CFLAGS\" = \"x\"\nthen\n  if test \"$CFLAGS\" = \"-g -O2\"\n  then\n    CFLAGS=\"-O2\"\n  elif test \"$CFLAGS\" = \"-g\"\n  then\n    CFLAGS=\"\"\n  fi\nfi\n\nif test \"x$remember_set_CXXFLAGS\" = \"x\"\nthen\n  if test \"$CXXFLAGS\" = \"-g -O2\"\n  then\n    CXXFLAGS=\"-O2\"\n  elif test \"$CXXFLAGS\" = \"-g\"\n  then\n    CXXFLAGS=\"\"\n  fi\nfi\n\n# AC_PROG_CXX will return \"g++\" even if no c++ compiler is installed.\n# Check for that case, and just disable c++ code if g++ doesn't run.\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  CXX=\"\"; CXXCP=\"\"; CXXFLAGS=\"\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Check for a 64-bit integer type\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nac_fn_c_find_intX_t \"$LINENO\" \"64\" \"ac_cv_c_int64_t\"\ncase $ac_cv_c_int64_t in #(\n  no|yes) ;; #(\n  *)\n\ncat >>confdefs.h <<_ACEOF\n#define int64_t $ac_cv_c_int64_t\n_ACEOF\n;;\nesac\n\n\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\nenable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}as\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}as; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AS+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AS\"; then\n  ac_cv_prog_AS=\"$AS\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AS=\"${ac_tool_prefix}as\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAS=$ac_cv_prog_AS\nif test -n \"$AS\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AS\" >&5\n$as_echo \"$AS\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_AS\"; then\n  ac_ct_AS=$AS\n  # Extract the first word of \"as\", so it can be a program name with args.\nset dummy as; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AS+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AS\"; then\n  ac_cv_prog_ac_ct_AS=\"$ac_ct_AS\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AS=\"as\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AS=$ac_cv_prog_ac_ct_AS\nif test -n \"$ac_ct_AS\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS\" >&5\n$as_echo \"$ac_ct_AS\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_AS\" = x; then\n    AS=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AS=$ac_ct_AS\n  fi\nelse\n  AS=\"$ac_cv_prog_AS\"\nfi\n\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n\n\n\n\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\n\n\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.4.6.42-b88ce'\nmacro_revision='2.4.6.42'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=$ac_aux_dir/ltmain.sh\n\n# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\nECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to print strings\" >&5\n$as_echo_n \"checking how to print strings... \" >&6; }\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"\"\n}\n\ncase $ECHO in\n  printf*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: printf\" >&5\n$as_echo \"printf\" >&6; } ;;\n  print*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: print -r\" >&5\n$as_echo \"print -r\" >&6; } ;;\n  *) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: cat\" >&5\n$as_echo \"cat\" >&6; } ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif ${ac_cv_path_SED+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_SED\" || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error $? \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif ${ac_cv_path_FGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_FGREP\" || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error $? \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test no = \"$withval\" || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test yes = \"$GCC\"; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return, which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=$ac_prog\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test yes = \"$with_gnu_ld\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=$ac_dir/$ac_prog\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest no != \"$with_gnu_ld\" && break\n\t;;\n      *)\n\ttest yes != \"$with_gnu_ld\" && break\n\t;;\n      esac\n    fi\n  done\n  IFS=$lt_save_ifs\nelse\n  lt_cv_path_LD=$LD # Let the user override the test with a path.\nfi\nfi\n\nLD=$lt_cv_path_LD\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif ${lt_cv_path_NM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=$NM\nelse\n  lt_nm_to_check=${ac_tool_prefix}nm\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=$lt_save_ifs\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=$ac_dir/$lt_tmp_nm\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\"; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the 'sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\t# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty\n\tcase $build_os in\n\tmingw*) lt_bad_file=conftest.nm/nofile ;;\n\t*) lt_bad_file=/dev/null ;;\n\tesac\n\tcase `\"$tmp_nm\" -B $lt_bad_file 2>&1 | sed '1q'` in\n\t*$lt_bad_file* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break 2\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break 2\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=$lt_save_ifs\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test no != \"$lt_cv_path_NM\"; then\n  NM=$lt_cv_path_NM\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in dumpbin \"link -dump\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in dumpbin \"link -dump\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols -headers\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n\n  if test : != \"$DUMPBIN\"; then\n    NM=$DUMPBIN\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif ${lt_cv_nm_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif ${lt_cv_sys_max_cmd_len+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=ABCD\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n       test undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test X`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test 17 != \"$i\" # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n \"$lt_cv_sys_max_cmd_len\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format\" >&5\n$as_echo_n \"checking how to convert $build file names to $host format... \" >&6; }\nif ${lt_cv_to_host_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n\nfi\n\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd\" >&5\n$as_echo \"$lt_cv_to_host_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format\" >&5\n$as_echo_n \"checking how to convert $build file names to toolchain format... \" >&6; }\nif ${lt_cv_to_tool_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  #assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n\nfi\n\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd\" >&5\n$as_echo \"$lt_cv_to_tool_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif ${lt_cv_ld_reload_flag+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test yes != \"$GCC\"; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test yes = \"$GCC\"; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif ${lt_cv_deplibs_check_method+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# 'unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# that responds to the $file_magic_cmd with a given extended regex.\n# If you have 'file' or equivalent on your system and you're not sure\n# whether 'pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\\.[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd* | bitrig*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nos2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[\\1]\\/[\\1]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries\" >&5\n$as_echo_n \"checking how to associate runtime and link libraries... \" >&6; }\nif ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh;\n  # decide which one to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=$ECHO\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd\" >&5\n$as_echo \"$lt_cv_sharedlib_from_linklib_cmd\" >&6; }\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n\n\n\n\n\n\n# Use ARFLAGS variable as AR's operation code to sync the variable naming with\n# Automake.  If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have\n# higher priority because thats what people were doing historically (setting\n# ARFLAGS for automake and AR_FLAGS for libtool).  FIXME: Make the AR_FLAGS\n# variable obsoleted/removed.\n\ntest ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}\nlt_ar_flags=$AR_FLAGS\n\n\n\n\n\n\n# Make AR_FLAGS overridable by 'make ARFLAGS='.  Don't try to run-time override\n# by AR_FLAGS because that was never working and AR_FLAGS is about to die.\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support\" >&5\n$as_echo_n \"checking for archiver @FILE support... \" >&6; }\nif ${lt_cv_ar_at_file+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ar_at_file=no\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test 0 -eq \"$ac_status\"; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\t{ { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\tif test 0 -ne \"$ac_status\"; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file\" >&5\n$as_echo \"$lt_cv_ar_at_file\" >&6; }\n\nif test no = \"$lt_cv_ar_at_file\"; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  bitrig* | openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif ${lt_cv_sys_global_symbol_pipe+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test ia64 = \"$host_cpu\"; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  # Gets list of data symbols to import.\n  lt_cv_sys_global_symbol_to_import=\"sed -n -e 's/^I .* \\(.*\\)$/\\1/p'\"\n  # Adjust the below global symbol transforms to fixup imported variables.\n  lt_cdecl_hook=\" -e 's/^I .* \\(.*\\)$/extern __declspec(dllimport) char \\1;/p'\"\n  lt_c_name_hook=\" -e 's/^I .* \\(.*\\)$/  {\\\"\\1\\\", (void *) 0},/p'\"\n  lt_c_name_lib_hook=\"\\\n  -e 's/^I .* \\(lib.*\\)$/  {\\\"\\1\\\", (void *) 0},/p'\\\n  -e 's/^I .* \\(.*\\)$/  {\\\"lib\\1\\\", (void *) 0},/p'\"\nelse\n  # Disable hooks by default.\n  lt_cv_sys_global_symbol_to_import=\n  lt_cdecl_hook=\n  lt_c_name_hook=\n  lt_c_name_lib_hook=\nfi\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n\"\\\n$lt_cdecl_hook\\\n\" -e 's/^T .* \\(.*\\)$/extern int \\1();/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n\"\\\n$lt_c_name_hook\\\n\" -e 's/^: \\(.*\\) .*$/  {\\\"\\1\\\", (void *) 0},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/p'\"\n\n# Transform an extracted symbol line into symbol name with lib prefix and\n# symbol address.\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n\"\\\n$lt_c_name_lib_hook\\\n\" -e 's/^: \\(.*\\) .*$/  {\\\"\\1\\\", (void *) 0},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(lib.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/  {\\\"lib\\1\\\", (void *) \\&\\1},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function,\n    # D for any global variable and I for any imported variable.\n    # Also find C++ and __fastcall symbols from MSVC++ or ICC,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     /^ *Symbol name *: /{split(\\$ 0,sn,\\\":\\\"); si=substr(sn[2],2)};\"\\\n\"     /^ *Type *: code/{print \\\"T\\\",si,substr(si,length(prfx))};\"\\\n\"     /^ *Type *: data/{print \\\"I\\\",si,substr(si,length(prfx))};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=\\\"D\\\"}; \\$ 0~/\\(\\).*\\|/{f=\\\"T\\\"};\"\\\n\"     {split(\\$ 0,a,/\\||\\r/); split(a[2],s)};\"\\\n\"     s[1]~/^[@?]/{print f,s[1],s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print f,t[1],substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE\n/* DATA imports from DLLs on WIN32 can't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined __osf__\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* .* \\(.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=conftstm.$ac_objext\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest$ac_exeext; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test yes = \"$pipe_works\"; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sysroot\" >&5\n$as_echo_n \"checking for sysroot... \" >&6; }\n\n# Check whether --with-sysroot was given.\nif test \"${with_sysroot+set}\" = set; then :\n  withval=$with_sysroot;\nelse\n  with_sysroot=no\nfi\n\n\nlt_sysroot=\ncase $with_sysroot in #(\n yes)\n   if test yes = \"$GCC\"; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $with_sysroot\" >&5\n$as_echo \"$with_sysroot\" >&6; }\n   as_fn_error $? \"The sysroot must be an absolute path.\" \"$LINENO\" 5\n   ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}\" >&5\n$as_echo \"${lt_sysroot:-no}\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a working dd\" >&5\n$as_echo_n \"checking for a working dd... \" >&6; }\nif ${ac_cv_path_lt_DD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  printf 0123456789abcdef0123456789abcdef >conftest.i\ncat conftest.i conftest.i >conftest2.i\n: ${lt_DD:=$DD}\nif test -z \"$lt_DD\"; then\n  ac_path_lt_DD_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in dd; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_lt_DD=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_lt_DD\" || continue\nif \"$ac_path_lt_DD\" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then\n  cmp -s conftest.i conftest.out \\\n  && ac_cv_path_lt_DD=\"$ac_path_lt_DD\" ac_path_lt_DD_found=:\nfi\n      $ac_path_lt_DD_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_lt_DD\"; then\n    :\n  fi\nelse\n  ac_cv_path_lt_DD=$lt_DD\nfi\n\nrm -f conftest.i conftest2.i conftest.out\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD\" >&5\n$as_echo \"$ac_cv_path_lt_DD\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes\" >&5\n$as_echo_n \"checking how to truncate binary pipes... \" >&6; }\nif ${lt_cv_truncate_bin+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  printf 0123456789abcdef0123456789abcdef >conftest.i\ncat conftest.i conftest.i >conftest2.i\nlt_cv_truncate_bin=\nif \"$ac_cv_path_lt_DD\" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then\n  cmp -s conftest.i conftest.out \\\n  && lt_cv_truncate_bin=\"$ac_cv_path_lt_DD bs=4096 count=1\"\nfi\nrm -f conftest.i conftest2.i conftest.out\ntest -z \"$lt_cv_truncate_bin\" && lt_cv_truncate_bin=\"$SED -e 4q\"\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin\" >&5\n$as_echo \"$lt_cv_truncate_bin\" >&6; }\n\n\n\n\n\n\n\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nfunc_cc_basename ()\n{\n    for cc_temp in $*\"\"; do\n      case $cc_temp in\n        compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n        distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n        \\-*) ;;\n        *) break;;\n      esac\n    done\n    func_cc_basename_result=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n}\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest no = \"$enable_libtool_lock\" || enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out what ABI is being produced by ac_compile, and set mode\n  # options accordingly.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=32\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=64\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo '#line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test yes = \"$lt_cv_prog_gnu_ld\"; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nmips64*-*linux*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo '#line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    emul=elf\n    case `/usr/bin/file conftest.$ac_objext` in\n      *32-bit*)\n\temul=\"${emul}32\"\n\t;;\n      *64-bit*)\n\temul=\"${emul}64\"\n\t;;\n    esac\n    case `/usr/bin/file conftest.$ac_objext` in\n      *MSB*)\n\temul=\"${emul}btsmip\"\n\t;;\n      *LSB*)\n\temul=\"${emul}ltsmip\"\n\t;;\n    esac\n    case `/usr/bin/file conftest.$ac_objext` in\n      *N32*)\n\temul=\"${emul}n32\"\n\t;;\n    esac\n    LD=\"${LD-ld} -m $emul\"\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.  Note that the listed cases only cover the\n  # situations where additional linker options are needed (such as when\n  # doing 32-bit compilation for a host where ld defaults to 64-bit, or\n  # vice versa); the common cases where no linker options are needed do\n  # not appear in the list.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*linux*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*linux*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=$CFLAGS\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif ${lt_cv_cc_needs_belf+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test yes != \"$lt_cv_cc_needs_belf\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=$SAVE_CFLAGS\n  fi\n  ;;\n*-*solaris*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*|x86_64-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=${LD-ld}_sol2\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=$enable_libtool_lock\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}mt\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$MANIFEST_TOOL\"; then\n  ac_cv_prog_MANIFEST_TOOL=\"$MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_MANIFEST_TOOL=\"${ac_tool_prefix}mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nMANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL\nif test -n \"$MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL\" >&5\n$as_echo \"$MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_MANIFEST_TOOL\"; then\n  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL\n  # Extract the first word of \"mt\", so it can be a program name with args.\nset dummy mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  ac_cv_prog_ac_ct_MANIFEST_TOOL=\"$ac_ct_MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_MANIFEST_TOOL=\"mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL\nif test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL\" >&5\n$as_echo \"$ac_ct_MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_MANIFEST_TOOL\" = x; then\n    MANIFEST_TOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL\n  fi\nelse\n  MANIFEST_TOOL=\"$ac_cv_prog_MANIFEST_TOOL\"\nfi\n\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool\" >&5\n$as_echo_n \"checking if $MANIFEST_TOOL is a manifest tool... \" >&6; }\nif ${lt_cv_path_mainfest_tool+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&5\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&5\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool\" >&5\n$as_echo \"$lt_cv_path_mainfest_tool\" >&6; }\nif test yes != \"$lt_cv_path_mainfest_tool\"; then\n  MANIFEST_TOOL=:\nfi\n\n\n\n\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif ${lt_cv_apple_cc_single_mod+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"$LT_MULTI_MODULE\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&5\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test 0 = \"$_lt_result\"; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif ${lt_cv_ld_exported_symbols_list+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=$save_LDFLAGS\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag\" >&5\n$as_echo_n \"checking for -force_load linker flag... \" >&6; }\nif ${lt_cv_ld_force_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&5\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5\n      echo \"$AR $AR_FLAGS libconftest.a conftest.o\" >&5\n      $AR $AR_FLAGS libconftest.a conftest.o 2>&5\n      echo \"$RANLIB libconftest.a\" >&5\n      $RANLIB libconftest.a 2>&5\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&5\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&5\n      elif test -f conftest && test 0 = \"$_lt_result\" && $GREP forced_load conftest >/dev/null 2>&1; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&5\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load\" >&5\n$as_echo \"$lt_cv_ld_force_load\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;\n\t10.[012][,.]*)\n\t  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test yes = \"$lt_cv_apple_cc_single_mod\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test yes = \"$lt_cv_ld_exported_symbols_list\"; then\n      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'\n    fi\n    if test : != \"$DSYMUTIL\" && test no = \"$lt_cv_ld_force_load\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\n# func_munge_path_list VARIABLE PATH\n# -----------------------------------\n# VARIABLE is name of variable containing _space_ separated list of\n# directories to be munged by the contents of PATH, which is string\n# having a format:\n# \"DIR[:DIR]:\"\n#       string \"DIR[ DIR]\" will be prepended to VARIABLE\n# \":DIR[:DIR]\"\n#       string \"DIR[ DIR]\" will be appended to VARIABLE\n# \"DIRP[:DIRP]::[DIRA:]DIRA\"\n#       string \"DIRP[ DIRP]\" will be prepended to VARIABLE and string\n#       \"DIRA[ DIRA]\" will be appended to VARIABLE\n# \"DIR[:DIR]\"\n#       VARIABLE will be replaced by \"DIR[ DIR]\"\nfunc_munge_path_list ()\n{\n    case x$2 in\n    x)\n        ;;\n    *:)\n        eval $1=\\\"`$ECHO $2 | $SED 's/:/ /g'` \\$$1\\\"\n        ;;\n    x:*)\n        eval $1=\\\"\\$$1 `$ECHO $2 | $SED 's/:/ /g'`\\\"\n        ;;\n    *::*)\n        eval $1=\\\"\\$$1\\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\\\"\n        eval $1=\\\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\\ \\$$1\\\"\n        ;;\n    *)\n        eval $1=\\\"`$ECHO $2 | $SED 's/:/ /g'`\\\"\n        ;;\n    esac\n}\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\nfunc_stripname_cnf ()\n{\n  case $2 in\n  .*) func_stripname_result=`$ECHO \"$3\" | $SED \"s%^$1%%; s%\\\\\\\\$2\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"$3\" | $SED \"s%^$1%%; s%$2\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n\n\n\n\n\n# Set options\n\n\n\n        enable_dlopen=no\n\n\n\n            # Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac\nelse\n  enable_shared=yes\nfi\n\n\n\n\n\n\n\n\n\n  # Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac\nelse\n  enable_static=yes\nfi\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for lt_pkg in $withval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac\nelse\n  pic_mode=default\nfi\n\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n  shared_archive_member_spec=\ncase $host,$enable_shared in\npower*-*-aix[5-9]*,yes)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide\" >&5\n$as_echo_n \"checking which variant of shared library versioning to provide... \" >&6; }\n\n# Check whether --with-aix-soname was given.\nif test \"${with_aix_soname+set}\" = set; then :\n  withval=$with_aix_soname; case $withval in\n    aix|svr4|both)\n      ;;\n    *)\n      as_fn_error $? \"Unknown argument to --with-aix-soname\" \"$LINENO\" 5\n      ;;\n    esac\n    lt_cv_with_aix_soname=$with_aix_soname\nelse\n  if ${lt_cv_with_aix_soname+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_with_aix_soname=aix\nfi\n\n    with_aix_soname=$lt_cv_with_aix_soname\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $with_aix_soname\" >&5\n$as_echo \"$with_aix_soname\" >&6; }\n  if test aix != \"$with_aix_soname\"; then\n    # For the AIX way of multilib, we name the shared archive member\n    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',\n    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.\n    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,\n    # the AIX toolchain works better with OBJECT_MODE set (default 32).\n    if test 64 = \"${OBJECT_MODE-32}\"; then\n      shared_archive_member_spec=shr_64\n    else\n      shared_archive_member_spec=shr\n    fi\n  fi\n  ;;\n*)\n  with_aix_soname=aix\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=$ltmain\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\"; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif ${lt_cv_objdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test set != \"${COLLECT_NAMES+set}\"; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a '.a' archive for static linking (except MSVC and\n# ICC, which need '.lib').\nlibext=a\n\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\nold_CC=$CC\nold_CFLAGS=$CFLAGS\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfunc_cc_basename $compiler\ncc_basename=$func_cc_basename_result\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=$MAGIC_CMD\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/${ac_tool_prefix}file\"; then\n      lt_cv_path_MAGIC_CMD=$ac_dir/\"${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=$lt_cv_path_MAGIC_CMD\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=$lt_save_ifs\n  MAGIC_CMD=$lt_save_MAGIC_CMD\n  ;;\nesac\nfi\n\nMAGIC_CMD=$lt_cv_path_MAGIC_CMD\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=$MAGIC_CMD\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/file\"; then\n      lt_cv_path_MAGIC_CMD=$ac_dir/\"file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=$lt_cv_path_MAGIC_CMD\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=$lt_save_ifs\n  MAGIC_CMD=$lt_save_MAGIC_CMD\n  ;;\nesac\nfi\n\nMAGIC_CMD=$lt_cv_path_MAGIC_CMD\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=$CC\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test yes = \"$GCC\"; then\n  case $cc_basename in\n  nvcc*)\n    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;\n  *)\n    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;\n  esac\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"  ## exclude from sc_useless_quotes_in_assignment\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler_rtti_exceptions\"; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n\n  if test yes = \"$GCC\"; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the '-m68020' flag to GCC prevents building anything better,\n            # like '-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      case $host_os in\n      os2*)\n\tlt_prog_compiler_static='$wl-static'\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      lt_prog_compiler_wl='-Xlinker '\n      if test -n \"$lt_prog_compiler_pic\"; then\n        lt_prog_compiler_pic=\"-Xcompiler $lt_prog_compiler_pic\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      case $cc_basename in\n      nagfor*)\n        # NAG Fortran compiler\n        lt_prog_compiler_wl='-Wl,-Wl,,'\n        lt_prog_compiler_pic='-PIC'\n        lt_prog_compiler_static='-Bstatic'\n        ;;\n      esac\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      case $host_os in\n      os2*)\n\tlt_prog_compiler_static='$wl-static'\n\t;;\n      esac\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='$wl-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64, which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\tlt_prog_compiler_wl='-Wl,-Wl,,'\n\tlt_prog_compiler_pic='-PIC'\n\tlt_prog_compiler_static='-Bstatic'\n\t;;\n      tcc*)\n\t# Fabrice Bellard et al's Tiny C Compiler\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [1-7].* | *Sun*Fortran*\\ 8.[0-3]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n        *Intel*\\ [CF]*Compiler*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fPIC'\n\t  lt_prog_compiler_static='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fpic'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms that do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic\" >&6; }\nlt_prog_compiler_pic=$lt_cv_prog_compiler_pic\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"  ## exclude from sc_useless_quotes_in_assignment\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler_pic_works\"; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=$LDFLAGS\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=$save_LDFLAGS\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler_static_works\"; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=nottested\nif test no = \"$lt_cv_prog_compiler_c_o\" && test no != \"$need_locks\"; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test no = \"$hard_links\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ' (' and ')$', so one must not match beginning or\n  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',\n  # as well as any symbol that contains 'd'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++ or Intel C++ Compiler.\n    if test yes != \"$GCC\"; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)\n    with_gnu_ld=yes\n    ;;\n  openbsd* | bitrig*)\n    with_gnu_ld=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test yes = \"$with_gnu_ld\"; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[2-9]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [3-9]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test yes = \"$lt_use_gnu_ld_interface\"; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='$wl'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n    export_dynamic_flag_spec='$wl--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v | $SED -e 's/(^)\\+)\\s\\+//' 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test ia64 != \"$host_cpu\"; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      export_dynamic_flag_spec='$wl--export-all-symbols'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file, use it as\n\t# is; otherwise, prepend EXPORTS...\n\tarchive_expsym_cmds='if   test DEF = \"`$SED -n     -e '\\''s/^[\t ]*//'\\''     -e '\\''/^\\(;.*\\)*$/d'\\''     -e '\\''s/^\\(EXPORTS\\|LIBRARY\\)\\([\t ].*\\)*$/DEF/p'\\''     -e q     $export_symbols`\" ; then\n          cp $export_symbols $output_objdir/$soname.def;\n        else\n          echo EXPORTS > $output_objdir/$soname.def;\n          cat $export_symbols >> $output_objdir/$soname.def;\n        fi~\n        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    haiku*)\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n      link_all_deplibs=yes\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      shrext_cmds=.dll\n      archive_cmds='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\temxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      archive_expsym_cmds='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\tprefix_cmds=\"$SED\"~\n\tif test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t  prefix_cmds=\"$prefix_cmds -e 1d\";\n\tfi~\n\tprefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\tcat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n      enable_shared_with_static_runtimes=yes\n      file_list_spec='@'\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='$wl-rpath,$libdir'\n      export_dynamic_flag_spec='$wl-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s|^|_|\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test linux-dietlibc = \"$host_os\"; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test no = \"$tmp_diet\"\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n        nagfor*)                        # NAGFOR 5.3\n          tmp_sharedflag='-Wl,-shared' ;;\n\txl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\n        if test yes = \"$supports_anon_versioning\"; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n            cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n            echo \"local: *; };\" >> $output_objdir/$libname.ver~\n            $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\ttcc*)\n\t  export_dynamic_flag_spec='-rdynamic'\n\t  ;;\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test yes = \"$supports_anon_versioning\"; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n              cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n              echo \"local: *; };\" >> $output_objdir/$libname.ver~\n              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd*)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test no = \"$ld_shlibs\"; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test yes = \"$GCC\" && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test ia64 = \"$host_cpu\"; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to GNU nm, but means don't demangle to AIX nm.\n\t# Without the \"-l\" option, or with the \"-B\" option, AIX nm treats\n\t# weak defined symbols like other global defined symbols, whereas\n\t# GNU nm marks them as \"W\".\n\t# While the 'weak' keyword is ignored in the Export File, we need\n\t# it in the Import File for the 'aix-soname' feature, so we have\n\t# to replace the \"-B\" option with \"-P\" for AIX nm.\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { if (\\$ 2 == \"W\") { print \\$ 3 \" weak\" } else { print \\$ 3 } } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='`func_echo_all $NM | $SED -e '\\''s/B\\([^B]*\\)$/P\\1/'\\''` -PCpgl $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"L\") || (\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) && (substr(\\$ 1,1,1) != \".\")) { if ((\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) { print \\$ 1 \" weak\" } else { print \\$ 1 } } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# have runtime linking enabled, and use it for executables.\n\t# For shared libraries, we enable/disable runtime linking\n\t# depending on the kind of the shared library created -\n\t# when \"with_aix_soname,aix_use_runtimelinking\" is:\n\t# \"aix,no\"   lib.a(lib.so.V) shared, rtl:no,  for executables\n\t# \"aix,yes\"  lib.so          shared, rtl:yes, for executables\n\t#            lib.a           static archive\n\t# \"both,no\"  lib.so.V(shr.o) shared, rtl:yes\n\t#            lib.a(lib.so.V) shared, rtl:no,  for executables\n\t# \"both,yes\" lib.so.V(shr.o) shared, rtl:yes, for executables\n\t#            lib.a(lib.so.V) shared, rtl:no\n\t# \"svr4,*\"   lib.so.V(shr.o) shared, rtl:yes, for executables\n\t#            lib.a           static archive\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test x-brtl = \"x$ld_flag\" || test x-Wl,-brtl = \"x$ld_flag\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  if test svr4,no = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t    # With aix-soname=svr4, we create the lib.so.V shared archives only,\n\t    # so we don't have lib.a shared libs to link our executables.\n\t    # We have to force runtime linking in this case.\n\t    aix_use_runtimelinking=yes\n\t    LDFLAGS=\"$LDFLAGS -Wl,-brtl\"\n\t  fi\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='$wl-f,'\n      case $with_aix_soname,$aix_use_runtimelinking in\n      aix,*) ;; # traditional, no import file\n      svr4,* | *,yes) # use import file\n\t# The Import File defines what to hardcode.\n\thardcode_direct=no\n\thardcode_direct_absolute=no\n\t;;\n      esac\n\n      if test yes = \"$GCC\"; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`$CC -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test yes = \"$aix_use_runtimelinking\"; then\n\t  shared_flag=\"$shared_flag \"'$wl-G'\n\tfi\n\t# Need to ensure runtime linking is disabled for the traditional\n\t# shared library, or the linker may eventually find shared libraries\n\t# /with/ Import File - we do not want to mix them.\n\tshared_flag_aix='-shared'\n\tshared_flag_svr4='-shared $wl-G'\n      else\n\t# not using gcc\n\tif test ia64 = \"$host_cpu\"; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test yes = \"$aix_use_runtimelinking\"; then\n\t    shared_flag='$wl-G'\n\t  else\n\t    shared_flag='$wl-bM:SRE'\n\t  fi\n\t  shared_flag_aix='$wl-bM:SRE'\n\t  shared_flag_svr4='$wl-G'\n\tfi\n      fi\n\n      export_dynamic_flag_spec='$wl-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test aix,yes = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        if test set = \"${lt_cv_aix_libpath+set}\"; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=/usr/lib:/lib\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n \"$allow_undefined_flag\"; then func_echo_all \"$wl$allow_undefined_flag\"; else :; fi` $wl'$exp_sym_flag:\\$export_symbols' '$shared_flag\n      else\n\tif test ia64 = \"$host_cpu\"; then\n\t  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\$wl$no_entry_flag\"' $compiler_flags $wl$allow_undefined_flag '\"\\$wl$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t if test set = \"${lt_cv_aix_libpath+set}\"; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=/usr/lib:/lib\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n\t hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' $wl-bernotok'\n\t  allow_undefined_flag=' $wl-berok'\n\t  if test yes = \"$with_gnu_ld\"; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    whole_archive_flag_spec='$convenience'\n\t  fi\n\t  archive_cmds_need_lc=yes\n\t  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'\n\t  # -brtl affects multiple linker settings, -berok does not and is overridden later\n\t  compiler_flags_filtered='`func_echo_all \"$compiler_flags \" | $SED -e \"s%-brtl\\\\([, ]\\\\)%-berok\\\\1%g\"`'\n\t  if test svr4 != \"$with_aix_soname\"; then\n\t    # This is similar to how AIX traditionally builds its shared libraries.\n\t    archive_expsym_cmds=\"$archive_expsym_cmds\"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'\n\t  fi\n\t  if test aix != \"$with_aix_soname\"; then\n\t    archive_expsym_cmds=\"$archive_expsym_cmds\"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all \"#! $soname($shared_archive_member_spec.o)\"; if test shr_64 = \"$shared_archive_member_spec\"; then func_echo_all \"# 64\"; else func_echo_all \"# 32\"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'\n\t  else\n\t    # used by -dlpreopen to get the symbols\n\t    archive_expsym_cmds=\"$archive_expsym_cmds\"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'\n\t  fi\n\t  archive_expsym_cmds=\"$archive_expsym_cmds\"'~$RM -r $output_objdir/$realname.d'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++ or Intel C++ Compiler.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl* | icl*)\n\t# Native MSVC or ICC\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\talways_export_symbols=yes\n\tfile_list_spec='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=.dll\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~linknames='\n\tarchive_expsym_cmds='if   test DEF = \"`$SED -n     -e '\\''s/^[\t ]*//'\\''     -e '\\''/^\\(;.*\\)*$/d'\\''     -e '\\''s/^\\(EXPORTS\\|LIBRARY\\)\\([\t ].*\\)*$/DEF/p'\\''     -e q     $export_symbols`\" ; then\n            cp \"$export_symbols\" \"$output_objdir/$soname.def\";\n            echo \"$tool_output_objdir$soname.def\" > \"$output_objdir/$soname.exp\";\n          else\n            $SED -e '\\''s/^/-link -EXPORT:/'\\'' < $export_symbols > $output_objdir/$soname.exp;\n          fi~\n          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n          linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, )='true'\n\tenable_shared_with_static_runtimes=yes\n\texclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\texport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\told_postinstall_cmds='chmod 644 $oldlib'\n\tpostlink_cmds='lt_outputfile=\"@OUTPUT@\"~\n          lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n          case $lt_outputfile in\n            *.exe|*.EXE) ;;\n            *)\n              lt_outputfile=$lt_outputfile.exe\n              lt_tool_outputfile=$lt_tool_outputfile.exe\n              ;;\n          esac~\n          if test : != \"$MANIFEST_TOOL\" && test -f \"$lt_outputfile.manifest\"; then\n            $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n            $RM \"$lt_outputfile.manifest\";\n          fi'\n\t;;\n      *)\n\t# Assume MSVC and ICC wrapper\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=.dll\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\told_archive_from_new_cmds='true'\n\t# FIXME: Should let the user specify the lib program.\n\told_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\tenable_shared_with_static_runtimes=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  if test yes = \"$lt_cv_ld_force_load\"; then\n    whole_archive_flag_spec='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience $wl-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec=''\n  fi\n  link_all_deplibs=yes\n  allow_undefined_flag=$_lt_dar_allow_undefined\n  case $cc_basename in\n     ifort*|nagfor*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test yes = \"$_lt_dar_can_shared\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dsymutil\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dsymutil\"\n    archive_expsym_cmds=\"sed 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil\"\n    module_expsym_cmds=\"sed -e 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dar_export_syms$_lt_dsymutil\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test yes = \"$GCC\"; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='$wl+b $wl$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='$wl-E'\n      ;;\n\n    hpux10*)\n      if test yes,no = \"$GCC,$with_gnu_ld\"; then\n\tarchive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test no = \"$with_gnu_ld\"; then\n\thardcode_libdir_flag_spec='$wl+b $wl$libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='$wl-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test yes,no = \"$GCC,$with_gnu_ld\"; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC understands -b\" >&5\n$as_echo_n \"checking if $CC understands -b... \" >&6; }\nif ${lt_cv_prog_compiler__b+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler__b=no\n   save_LDFLAGS=$LDFLAGS\n   LDFLAGS=\"$LDFLAGS -b\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler__b=yes\n       fi\n     else\n       lt_cv_prog_compiler__b=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=$save_LDFLAGS\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b\" >&5\n$as_echo \"$lt_cv_prog_compiler__b\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler__b\"; then\n    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\nelse\n    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\nfi\n\n\t  ;;\n\tesac\n      fi\n      if test no = \"$with_gnu_ld\"; then\n\thardcode_libdir_flag_spec='$wl+b $wl$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='$wl-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test yes = \"$GCC\"; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol\" >&5\n$as_echo_n \"checking whether the $host_os linker accepts -exported_symbol... \" >&6; }\nif ${lt_cv_irix_exported_symbol+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  save_LDFLAGS=$LDFLAGS\n\t   LDFLAGS=\"$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo (void) { return 0; }\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_irix_exported_symbol=yes\nelse\n  lt_cv_irix_exported_symbol=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n           LDFLAGS=$save_LDFLAGS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol\" >&5\n$as_echo \"$lt_cv_irix_exported_symbol\" >&6; }\n\tif test yes = \"$lt_cv_irix_exported_symbol\"; then\n          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'\n\tfi\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    linux*)\n      case $cc_basename in\n      tcc*)\n\t# Fabrice Bellard et al's Tiny C Compiler\n\tld_shlibs=yes\n\tarchive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t;;\n      esac\n      ;;\n\n    netbsd*)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd* | bitrig*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='$wl-rpath,$libdir'\n\t  export_dynamic_flag_spec='$wl-E'\n\telse\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  hardcode_libdir_flag_spec='$wl-rpath,$libdir'\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      shrext_cmds=.dll\n      archive_cmds='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\temxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      archive_expsym_cmds='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\tprefix_cmds=\"$SED\"~\n\tif test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t  prefix_cmds=\"$prefix_cmds -e 1d\";\n\tfi~\n\tprefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\tcat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n      enable_shared_with_static_runtimes=yes\n      file_list_spec='@'\n      ;;\n\n    osf3*)\n      if test yes = \"$GCC\"; then\n\tallow_undefined_flag=' $wl-expect_unresolved $wl\\*'\n\tarchive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test yes = \"$GCC\"; then\n\tallow_undefined_flag=' $wl-expect_unresolved $wl\\*'\n\tarchive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\thardcode_libdir_flag_spec='$wl-rpath $wl$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test yes = \"$GCC\"; then\n\twlarc='$wl'\n\tarchive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='$wl'\n\t  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands '-z linker_flag'.  GCC discards it without '$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test yes = \"$GCC\"; then\n\t  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test sequent = \"$host_vendor\"; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='$wl-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test yes = \"$GCC\"; then\n\tarchive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We CANNOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='$wl-z,text'\n      allow_undefined_flag='$wl-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='$wl-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='$wl-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test yes = \"$GCC\"; then\n\tarchive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test sni = \"$host_vendor\"; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='$wl-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest no = \"$ld_shlibs\" && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test yes,yes = \"$GCC,$enable_shared\"; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl\n\t  pic_flag=$lt_prog_compiler_pic\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag\n\t  allow_undefined_flag=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc=yes\n\t  fi\n\t  allow_undefined_flag=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc\" >&6; }\n      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test yes = \"$GCC\"; then\n  case $host_os in\n    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;\n    *) lt_awk_arg='/^libraries:/' ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq='s|=\\([A-Za-z]:\\)|\\1|g' ;;\n    *) lt_sed_strip_eq='s|=/|/|g' ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary...\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  # ...but if some path component already ends with the multilib dir we assume\n  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).\n  case \"$lt_multi_os_dir; $lt_search_path_spec \" in\n  \"/; \"* | \"/.; \"* | \"/./; \"* | *\"$lt_multi_os_dir \"* | *\"$lt_multi_os_dir/ \"*)\n    lt_multi_os_dir=\n    ;;\n  esac\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir\"\n    elif test -n \"$lt_multi_os_dir\"; then\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS = \" \"; FS = \"/|\\n\";} {\n  lt_foo = \"\";\n  lt_count = 0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo = \"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's|/\\([A-Za-z]:\\)|\\1|g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=.so\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\n\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='$libname$release$shared_ext$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test ia64 = \"$host_cpu\"; then\n    # AIX 5 supports IA64\n    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line '#! .'.  This would cause the generated library to\n    # depend on '.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # Using Import Files as archive members, it is possible to support\n    # filename-based versioning of shared library archives on AIX. While\n    # this would work for both with and without runtime linking, it will\n    # prevent static linking of such archives. So we do filename-based\n    # shared library versioning with .so extension only, which is used\n    # when both runtime linking and shared linking is enabled.\n    # Unfortunately, runtime linking may impact performance, so we do\n    # not want this to be the default eventually. Also, we use the\n    # versioned .so libs for executables only if there is the -brtl\n    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.\n    # To allow for filename-based versioning support, we need to create\n    # libNAME.so.V as an archive file, containing:\n    # *) an Import File, referring to the versioned filename of the\n    #    archive as well as the shared archive member, telling the\n    #    bitwidth (32 or 64) of that shared object, and providing the\n    #    list of exported symbols of that shared object, eventually\n    #    decorated with the 'weak' keyword\n    # *) the shared object with the F_LOADONLY flag set, to really avoid\n    #    it being seen by the linker.\n    # At run time we better use the real file rather than another symlink,\n    # but for link time we create the symlink libNAME.so -> libNAME.so.V\n\n    case $with_aix_soname,$aix_use_runtimelinking in\n    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    aix,yes) # traditional libtool\n      dynamic_linker='AIX unversionable lib.so'\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      ;;\n    aix,no) # traditional AIX only\n      dynamic_linker='AIX lib.a(lib.so.V)'\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      ;;\n    svr4,*) # full svr4 only\n      dynamic_linker=\"AIX lib.so.V($shared_archive_member_spec.o)\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,yes) # both, prefer svr4\n      dynamic_linker=\"AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # unpreferred sharedlib libNAME.a needs extra handling\n      postinstall_cmds='test -n \"$linkname\" || linkname=\"$realname\"~func_stripname \"\" \".so\" \"$linkname\"~$install_shared_prog \"$dir/$func_stripname_result.$libext\" \"$destdir/$func_stripname_result.$libext\"~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib \"$destdir/$func_stripname_result.$libext\"'\n      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname \"\" \".so\" \"$n\"~test \"$func_stripname_result\" = \"$n\" || func_append rmfiles \" $odir/$func_stripname_result.$libext\"'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,no) # both, prefer aix\n      dynamic_linker=\"AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)\"\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling\n      postinstall_cmds='test -z \"$dlname\" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib $destdir/$dlname~test -n \"$linkname\" || linkname=$realname~func_stripname \"\" \".a\" \"$linkname\"~(cd \"$destdir\" && $LN_S -f $dlname $func_stripname_result.so)'\n      postuninstall_cmds='test -z \"$dlname\" || func_append rmfiles \" $odir/$dlname\"~for n in $old_library $library_names; do :; done~func_stripname \"\" \".a\" \"$n\"~func_append rmfiles \" $odir/$func_stripname_result.so\"'\n      ;;\n    esac\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='$libname$shared_ext'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl* | *,icl*)\n    # Native MSVC or ICC\n    libname_spec='$name'\n    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n    library_names_spec='$libname.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=$LIB\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC and ICC wrapper\n    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$major$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      soname_spec='$libname$release$shared_ext$major'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    if test 32 = \"$HPUX_IA64_MODE\"; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux32\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux64\n    fi\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test yes = \"$lt_cv_prog_gnu_ld\"; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib$libsuff /lib$libsuff\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\nlinux*android*)\n  version_type=none # Android doesn't support versioned libraries.\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext'\n  soname_spec='$libname$release$shared_ext'\n  finish_cmds=\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  dynamic_linker='Android linker'\n  # Don't embed -rpath directories since the linker doesn't support them.\n  hardcode_libdir_flag_spec='-L$libdir'\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Ideally, we could use ldconfig to report *all* directores which are\n  # searched for libraries, however this is still not possible.  Aside from not\n  # being certain /sbin/ldconfig is available, command\n  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,\n  # even though it is searched at run-time.  Try to do the best guess by\n  # appending ld.so.conf contents (and includes) to the search path.\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd* | bitrig*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=/usr/lib\n  need_lib_prefix=no\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n    need_version=no\n  else\n    need_version=yes\n  fi\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\nos2*)\n  libname_spec='$name'\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n  # OS/2 can only load a DLL with a base name of 8 characters or less.\n  soname_spec='`test -n \"$os2dllname\" && libname=\"$os2dllname\";\n    v=$($ECHO $release$versuffix | tr -d .-);\n    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);\n    $ECHO $n$v`$shared_ext'\n  library_names_spec='${libname}_dll.$libext'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=BEGINLIBPATH\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  postinstall_cmds='base_file=`basename \\$file`~\n    dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; $ECHO \\$dlname'\\''`~\n    dldir=$destdir/`dirname \\$dlpath`~\n    test -d \\$dldir || mkdir -p \\$dldir~\n    $install_prog $dir/$dlname \\$dldir/$dlname~\n    chmod a+x \\$dldir/$dlname~\n    if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n      eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n    fi'\n  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; $ECHO \\$dlname'\\''`~\n    dlpath=$dir/\\$dldll~\n    $RM \\$dlpath'\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test yes = \"$with_gnu_ld\"; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec; then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'\n    soname_spec='$libname$shared_ext.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=sco\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test yes = \"$with_gnu_ld\"; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest no = \"$dynamic_linker\" && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test yes = \"$GCC\"; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test set = \"${lt_cv_sys_lib_search_path_spec+set}\"; then\n  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec\nfi\n\nif test set = \"${lt_cv_sys_lib_dlsearch_path_spec+set}\"; then\n  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec\nfi\n\n# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...\nconfigure_time_dlsearch_path=$sys_lib_dlsearch_path_spec\n\n# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code\nfunc_munge_path_list sys_lib_dlsearch_path_spec \"$LT_SYS_LIBRARY_PATH\"\n\n# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool\nconfigure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test yes = \"$hardcode_automatic\"; then\n\n  # We can hardcode non-existent directories.\n  if test no != \"$hardcode_direct\" &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test no != \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" &&\n     test no != \"$hardcode_minus_L\"; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test relink = \"$hardcode_action\" ||\n   test yes = \"$inherit_rpath\"; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test yes = \"$shlibpath_overrides_runpath\" ||\n     test no = \"$enable_shared\"; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test yes != \"$enable_dlopen\"; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=load_add_on\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=LoadLibrary\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=dlopen\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n    # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl\nelse\n\n    lt_cv_dlopen=dyld\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  tpf*)\n    # Don't try to run any link tests for TPF.  We know it's impossible\n    # because TPF is a cross-compiler, and we know how we open DSOs.\n    lt_cv_dlopen=dlopen\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=no\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = xyes; then :\n  lt_cv_dlopen=shl_load\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_shl_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = xyes; then :\n  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = xyes; then :\n  lt_cv_dlopen=dlopen\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif ${ac_cv_lib_svld_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = xyes; then :\n  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_dld_link+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = xyes; then :\n  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test no = \"$lt_cv_dlopen\"; then\n    enable_dlopen=no\n  else\n    enable_dlopen=yes\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=$CPPFLAGS\n    test yes = \"$ac_cv_header_dlfcn_h\" && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=$LDFLAGS\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=$LIBS\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test yes = \"$cross_compiling\"; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisibility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"conftest$ac_exeext\" 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test yes = \"$lt_cv_dlopen_self\"; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self_static+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test yes = \"$cross_compiling\"; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisibility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"conftest$ac_exeext\" 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=$save_CPPFLAGS\n    LDFLAGS=$save_LDFLAGS\n    LIBS=$save_LIBS\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -z \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nelse\n  if $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n    old_striplib=\"$STRIP --strip-debug\"\n    striplib=\"$STRIP --strip-unneeded\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  else\n    case $host_os in\n    darwin*)\n      # FIXME - insert some real tests, host_os isn't really good enough\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      ;;\n    freebsd*)\n      if $STRIP -V 2>&1 | $GREP \"elftoolchain\" >/dev/null; then\n        old_striplib=\"$STRIP --strip-debug\"\n        striplib=\"$STRIP --strip-unneeded\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      else\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n      fi\n      ;;\n    *)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n      ;;\n    esac\n  fi\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report what library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test no = \"$can_build_shared\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test yes = \"$enable_shared\" && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test ia64 != \"$host_cpu\"; then\n      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in\n      yes,aix,yes) ;;\t\t\t# shared object as lib.so file only\n      yes,svr4,*) ;;\t\t\t# shared object as lib.so archive member only\n      yes,*) enable_static=no ;;\t# shared object in lib.a archive as well\n      esac\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test yes = \"$enable_shared\" || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nCC=$lt_save_CC\n\n      if test -n \"$CXX\" && ( test no != \"$CXX\" &&\n    ( (test g++ = \"$CXX\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test g++ != \"$CXX\"))); then\n  ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if ${ac_cv_prog_CXXCPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C++ preprocessor \\\"$CXXCPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\narchive_cmds_need_lc_CXX=no\nallow_undefined_flag_CXX=\nalways_export_symbols_CXX=no\narchive_expsym_cmds_CXX=\ncompiler_needs_object_CXX=no\nexport_dynamic_flag_spec_CXX=\nhardcode_direct_CXX=no\nhardcode_direct_absolute_CXX=no\nhardcode_libdir_flag_spec_CXX=\nhardcode_libdir_separator_CXX=\nhardcode_minus_L_CXX=no\nhardcode_shlibpath_var_CXX=unsupported\nhardcode_automatic_CXX=no\ninherit_rpath_CXX=no\nmodule_cmds_CXX=\nmodule_expsym_cmds_CXX=\nlink_all_deplibs_CXX=unknown\nold_archive_cmds_CXX=$old_archive_cmds\nreload_flag_CXX=$reload_flag\nreload_cmds_CXX=$reload_cmds\nno_undefined_flag_CXX=\nwhole_archive_flag_spec_CXX=\nenable_shared_with_static_runtimes_CXX=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\nobjext_CXX=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test yes != \"$_lt_caught_CXX_error\"; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n  # save warnings/boilerplate of simple test code\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  compiler_CXX=$CC\n  func_cc_basename $compiler\ncc_basename=$func_cc_basename_result\n\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test yes = \"$GXX\"; then\n      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'\n    else\n      lt_prog_compiler_no_builtin_flag_CXX=\n    fi\n\n    if test yes = \"$GXX\"; then\n      # Set up default GNU C++ configuration\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test no = \"$withval\" || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test yes = \"$GCC\"; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return, which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=$ac_prog\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test yes = \"$with_gnu_ld\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=$ac_dir/$ac_prog\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest no != \"$with_gnu_ld\" && break\n\t;;\n      *)\n\ttest yes != \"$with_gnu_ld\" && break\n\t;;\n      esac\n    fi\n  done\n  IFS=$lt_save_ifs\nelse\n  lt_cv_path_LD=$LD # Let the user override the test with a path.\nfi\nfi\n\nLD=$lt_cv_path_LD\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test yes = \"$with_gnu_ld\"; then\n        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\n        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'\n        export_dynamic_flag_spec_CXX='$wl--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='$wl'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n        else\n          whole_archive_flag_spec_CXX=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n    ld_shlibs_CXX=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n      aix[4-9]*)\n        if test ia64 = \"$host_cpu\"; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # have runtime linking enabled, and use it for executables.\n          # For shared libraries, we enable/disable runtime linking\n          # depending on the kind of the shared library created -\n          # when \"with_aix_soname,aix_use_runtimelinking\" is:\n          # \"aix,no\"   lib.a(lib.so.V) shared, rtl:no,  for executables\n          # \"aix,yes\"  lib.so          shared, rtl:yes, for executables\n          #            lib.a           static archive\n          # \"both,no\"  lib.so.V(shr.o) shared, rtl:yes\n          #            lib.a(lib.so.V) shared, rtl:no,  for executables\n          # \"both,yes\" lib.so.V(shr.o) shared, rtl:yes, for executables\n          #            lib.a(lib.so.V) shared, rtl:no\n          # \"svr4,*\"   lib.so.V(shr.o) shared, rtl:yes, for executables\n          #            lib.a           static archive\n          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    if test svr4,no = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t      # With aix-soname=svr4, we create the lib.so.V shared archives only,\n\t      # so we don't have lib.a shared libs to link our executables.\n\t      # We have to force runtime linking in this case.\n\t      aix_use_runtimelinking=yes\n\t      LDFLAGS=\"$LDFLAGS -Wl,-brtl\"\n\t    fi\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        archive_cmds_CXX=''\n        hardcode_direct_CXX=yes\n        hardcode_direct_absolute_CXX=yes\n        hardcode_libdir_separator_CXX=':'\n        link_all_deplibs_CXX=yes\n        file_list_spec_CXX='$wl-f,'\n        case $with_aix_soname,$aix_use_runtimelinking in\n        aix,*) ;;\t# no import file\n        svr4,* | *,yes) # use import file\n          # The Import File defines what to hardcode.\n          hardcode_direct_CXX=no\n          hardcode_direct_absolute_CXX=no\n          ;;\n        esac\n\n        if test yes = \"$GXX\"; then\n          case $host_os in aix4.[012]|aix4.[012].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`$CC -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    hardcode_direct_CXX=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    hardcode_minus_L_CXX=yes\n\t    hardcode_libdir_flag_spec_CXX='-L$libdir'\n\t    hardcode_libdir_separator_CXX=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test yes = \"$aix_use_runtimelinking\"; then\n\t    shared_flag=$shared_flag' $wl-G'\n\t  fi\n\t  # Need to ensure runtime linking is disabled for the traditional\n\t  # shared library, or the linker may eventually find shared libraries\n\t  # /with/ Import File - we do not want to mix them.\n\t  shared_flag_aix='-shared'\n\t  shared_flag_svr4='-shared $wl-G'\n        else\n          # not using gcc\n          if test ia64 = \"$host_cpu\"; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test yes = \"$aix_use_runtimelinking\"; then\n\t      shared_flag='$wl-G'\n\t    else\n\t      shared_flag='$wl-bM:SRE'\n\t    fi\n\t    shared_flag_aix='$wl-bM:SRE'\n\t    shared_flag_svr4='$wl-G'\n          fi\n        fi\n\n        export_dynamic_flag_spec_CXX='$wl-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        always_export_symbols_CXX=yes\n\tif test aix,yes = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          # The \"-G\" linker flag allows undefined symbols.\n          no_undefined_flag_CXX='-bernotok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          if test set = \"${lt_cv_aix_libpath+set}\"; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath__CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=/usr/lib:/lib\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath__CXX\nfi\n\n          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\n          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n \"$allow_undefined_flag\"; then func_echo_all \"$wl$allow_undefined_flag\"; else :; fi` $wl'$exp_sym_flag:\\$export_symbols' '$shared_flag\n        else\n          if test ia64 = \"$host_cpu\"; then\n\t    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'\n\t    allow_undefined_flag_CXX=\"-z nodefs\"\n\t    archive_expsym_cmds_CXX=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\$wl$no_entry_flag\"' $compiler_flags $wl$allow_undefined_flag '\"\\$wl$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    if test set = \"${lt_cv_aix_libpath+set}\"; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath__CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath__CXX\"; then\n    lt_cv_aix_libpath__CXX=/usr/lib:/lib\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath__CXX\nfi\n\n\t    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    no_undefined_flag_CXX=' $wl-bernotok'\n\t    allow_undefined_flag_CXX=' $wl-berok'\n\t    if test yes = \"$with_gnu_ld\"; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      whole_archive_flag_spec_CXX='$convenience'\n\t    fi\n\t    archive_cmds_need_lc_CXX=yes\n\t    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'\n\t    # -brtl affects multiple linker settings, -berok does not and is overridden later\n\t    compiler_flags_filtered='`func_echo_all \"$compiler_flags \" | $SED -e \"s%-brtl\\\\([, ]\\\\)%-berok\\\\1%g\"`'\n\t    if test svr4 != \"$with_aix_soname\"; then\n\t      # This is similar to how AIX traditionally builds its shared\n\t      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.\n\t      archive_expsym_cmds_CXX=\"$archive_expsym_cmds_CXX\"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'\n\t    fi\n\t    if test aix != \"$with_aix_soname\"; then\n\t      archive_expsym_cmds_CXX=\"$archive_expsym_cmds_CXX\"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all \"#! $soname($shared_archive_member_spec.o)\"; if test shr_64 = \"$shared_archive_member_spec\"; then func_echo_all \"# 64\"; else func_echo_all \"# 32\"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'\n\t    else\n\t      # used by -dlpreopen to get the symbols\n\t      archive_expsym_cmds_CXX=\"$archive_expsym_cmds_CXX\"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'\n\t    fi\n\t    archive_expsym_cmds_CXX=\"$archive_expsym_cmds_CXX\"'~$RM -r $output_objdir/$realname.d'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  allow_undefined_flag_CXX=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  ld_shlibs_CXX=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl* | ,icl* | no,icl*)\n\t  # Native MSVC or ICC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  hardcode_libdir_flag_spec_CXX=' '\n\t  allow_undefined_flag_CXX=unsupported\n\t  always_export_symbols_CXX=yes\n\t  file_list_spec_CXX='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=.dll\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~linknames='\n\t  archive_expsym_cmds_CXX='if   test DEF = \"`$SED -n     -e '\\''s/^[\t ]*//'\\''     -e '\\''/^\\(;.*\\)*$/d'\\''     -e '\\''s/^\\(EXPORTS\\|LIBRARY\\)\\([\t ].*\\)*$/DEF/p'\\''     -e q     $export_symbols`\" ; then\n              cp \"$export_symbols\" \"$output_objdir/$soname.def\";\n              echo \"$tool_output_objdir$soname.def\" > \"$output_objdir/$soname.exp\";\n            else\n              $SED -e '\\''s/^/-link -EXPORT:/'\\'' < $export_symbols > $output_objdir/$soname.exp;\n            fi~\n            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n            linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'\n\t  enable_shared_with_static_runtimes_CXX=yes\n\t  # Don't use ranlib\n\t  old_postinstall_cmds_CXX='chmod 644 $oldlib'\n\t  postlink_cmds_CXX='lt_outputfile=\"@OUTPUT@\"~\n            lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n            case $lt_outputfile in\n              *.exe|*.EXE) ;;\n              *)\n                lt_outputfile=$lt_outputfile.exe\n                lt_tool_outputfile=$lt_tool_outputfile.exe\n                ;;\n            esac~\n            func_to_tool_file \"$lt_outputfile\"~\n            if test : != \"$MANIFEST_TOOL\" && test -f \"$lt_outputfile.manifest\"; then\n              $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n              $RM \"$lt_outputfile.manifest\";\n            fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  hardcode_libdir_flag_spec_CXX='-L$libdir'\n\t  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'\n\t  allow_undefined_flag_CXX=unsupported\n\t  always_export_symbols_CXX=no\n\t  enable_shared_with_static_runtimes_CXX=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file, use it as\n\t    # is; otherwise, prepend EXPORTS...\n\t    archive_expsym_cmds_CXX='if   test DEF = \"`$SED -n     -e '\\''s/^[\t ]*//'\\''     -e '\\''/^\\(;.*\\)*$/d'\\''     -e '\\''s/^\\(EXPORTS\\|LIBRARY\\)\\([\t ].*\\)*$/DEF/p'\\''     -e q     $export_symbols`\" ; then\n              cp $export_symbols $output_objdir/$soname.def;\n            else\n              echo EXPORTS > $output_objdir/$soname.def;\n              cat $export_symbols >> $output_objdir/$soname.def;\n            fi~\n            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    ld_shlibs_CXX=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc_CXX=no\n  hardcode_direct_CXX=no\n  hardcode_automatic_CXX=yes\n  hardcode_shlibpath_var_CXX=unsupported\n  if test yes = \"$lt_cv_ld_force_load\"; then\n    whole_archive_flag_spec_CXX='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience $wl-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec_CXX=''\n  fi\n  link_all_deplibs_CXX=yes\n  allow_undefined_flag_CXX=$_lt_dar_allow_undefined\n  case $cc_basename in\n     ifort*|nagfor*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test yes = \"$_lt_dar_can_shared\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds_CXX=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dsymutil\"\n    module_cmds_CXX=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dsymutil\"\n    archive_expsym_cmds_CXX=\"sed 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil\"\n    module_expsym_cmds_CXX=\"sed -e 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dar_export_syms$_lt_dsymutil\"\n       if test yes != \"$lt_cv_apple_cc_single_mod\"; then\n      archive_cmds_CXX=\"\\$CC -r -keep_private_externs -nostdlib -o \\$lib-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$lib-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring$_lt_dsymutil\"\n      archive_expsym_cmds_CXX=\"sed 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\$lib-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$lib-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring$_lt_dar_export_syms$_lt_dsymutil\"\n    fi\n\n  else\n  ld_shlibs_CXX=no\n  fi\n\n\t;;\n\n      os2*)\n\thardcode_libdir_flag_spec_CXX='-L$libdir'\n\thardcode_minus_L_CXX=yes\n\tallow_undefined_flag_CXX=unsupported\n\tshrext_cmds=.dll\n\tarchive_cmds_CXX='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t  $ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t  $ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t  $ECHO EXPORTS >> $output_objdir/$libname.def~\n\t  emxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\t  emximp -o $lib $output_objdir/$libname.def'\n\tarchive_expsym_cmds_CXX='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t  $ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t  $ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t  $ECHO EXPORTS >> $output_objdir/$libname.def~\n\t  prefix_cmds=\"$SED\"~\n\t  if test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t    prefix_cmds=\"$prefix_cmds -e 1d\";\n\t  fi~\n\t  prefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\t  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\t  emximp -o $lib $output_objdir/$libname.def'\n\told_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n\tenable_shared_with_static_runtimes_CXX=yes\n\tfile_list_spec_CXX='@'\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        ld_shlibs_CXX=no\n        ;;\n\n      freebsd-elf*)\n        archive_cmds_need_lc_CXX=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        ld_shlibs_CXX=yes\n        ;;\n\n      haiku*)\n        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n        link_all_deplibs_CXX=yes\n        ;;\n\n      hpux9*)\n        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'\n        hardcode_libdir_separator_CXX=:\n        export_dynamic_flag_spec_CXX='$wl-E'\n        hardcode_direct_CXX=yes\n        hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            ld_shlibs_CXX=no\n            ;;\n          aCC*)\n            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test yes = \"$GXX\"; then\n              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              ld_shlibs_CXX=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test no = \"$with_gnu_ld\"; then\n\t  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'\n\t  hardcode_libdir_separator_CXX=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      export_dynamic_flag_spec_CXX='$wl-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            hardcode_direct_CXX=no\n            hardcode_shlibpath_var_CXX=no\n            ;;\n          *)\n            hardcode_direct_CXX=yes\n            hardcode_direct_absolute_CXX=yes\n            hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test yes = \"$GXX\"; then\n\t      if test no = \"$with_gnu_ld\"; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[3-9]*)\n\thardcode_direct_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'\n\texport_dynamic_flag_spec_CXX='$wl-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\tarchive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\tarchive_expsym_cmds_CXX='sed \"s|^|_|\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test yes = \"$GXX\"; then\n\t      if test no = \"$with_gnu_ld\"; then\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t      else\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    link_all_deplibs_CXX=yes\n\t    ;;\n        esac\n        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'\n        hardcode_libdir_separator_CXX=:\n        inherit_rpath_CXX=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib $wl-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='$wl--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        archive_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    archive_cmds_need_lc_CXX=no\n\t    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='$wl--export-dynamic'\n\t    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [1-5].* | *pgcpp\\ [1-5].*)\n\t      prelink_cmds_CXX='tpldir=Template.dir~\n               rm -rf $tpldir~\n               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n               compile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      old_archive_cmds_CXX='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n                $RANLIB $oldlib'\n\t      archive_cmds_CXX='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t      archive_expsym_cmds_CXX='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'\n\t    export_dynamic_flag_spec_CXX='$wl--export-dynamic'\n\t    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'\n\t    export_dynamic_flag_spec_CXX='$wl--export-dynamic'\n\t    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    if test yes = \"$supports_anon_versioning\"; then\n\t      archive_expsym_cmds_CXX='echo \"{ global:\" > $output_objdir/$libname.ver~\n                cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n                echo \"local: *; };\" >> $output_objdir/$libname.ver~\n                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      no_undefined_flag_CXX=' -zdefs'\n\t      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'\n\t      hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t      compiler_needs_object_CXX=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\tld_shlibs_CXX=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        ld_shlibs_CXX=yes\n\t;;\n\n      openbsd* | bitrig*)\n\tif test -f /usr/libexec/ld.so; then\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\t  hardcode_direct_absolute_CXX=yes\n\t  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\"; then\n\t    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'\n\t    export_dynamic_flag_spec_CXX='$wl-E'\n\t    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\\*'\n\t        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'\n\t\t;;\n\t      *)\n\t        allow_undefined_flag_CXX=' -expect_unresolved \\*'\n\t        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n                  echo \"-hidden\">> $lib.exp~\n                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib~\n                  $RM $lib.exp'\n\t        hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test yes,no = \"$GXX,$with_gnu_ld\"; then\n\t      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\\*'\n\t      case $host in\n\t        osf3*)\n\t          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'\n\t      hardcode_libdir_separator_CXX=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            archive_cmds_need_lc_CXX=yes\n\t    no_undefined_flag_CXX=' -zdefs'\n\t    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t    hardcode_shlibpath_var_CXX=no\n\t    case $host_os in\n\t      solaris2.[0-5] | solaris2.[0-5].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands '-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\twhole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    link_all_deplibs_CXX=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test yes,no = \"$GXX,$with_gnu_ld\"; then\n\t      no_undefined_flag_CXX=' $wl-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require '-G' NOT '-shared' on this\n\t        # platform.\n\t        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[0-5] | solaris2.[0-5].*) ;;\n\t\t*)\n\t\t  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag_CXX='$wl-z,text'\n      archive_cmds_need_lc_CXX=no\n      hardcode_shlibpath_var_CXX=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We CANNOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\tno_undefined_flag_CXX='$wl-z,text'\n\tallow_undefined_flag_CXX='$wl-z,nodefs'\n\tarchive_cmds_need_lc_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='$wl-R,$libdir'\n\thardcode_libdir_separator_CXX=':'\n\tlink_all_deplibs_CXX=yes\n\texport_dynamic_flag_spec_CXX='$wl-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~\n              '\"$old_archive_cmds_CXX\"\n\t    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~\n              '\"$reload_cmds_CXX\"\n\t    ;;\n\t  *)\n\t    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n    esac\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\n    test no = \"$ld_shlibs_CXX\" && can_build_shared=no\n\n    GCC_CXX=$GXX\n    LD_CXX=$LD\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    # Dependencies to place before and after the object being linked:\npredep_objects_CXX=\npostdep_objects_CXX=\npredeps_CXX=\npostdeps_CXX=\ncompiler_lib_search_path_CXX=\n\ncat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\nif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case $prev$p in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test x-L = \"$p\" ||\n          test x-R = \"$p\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test no = \"$pre_test_object_deps_done\"; then\n\t case $prev in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$compiler_lib_search_path_CXX\"; then\n\t     compiler_lib_search_path_CXX=$prev$p\n\t   else\n\t     compiler_lib_search_path_CXX=\"${compiler_lib_search_path_CXX} $prev$p\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$postdeps_CXX\"; then\n\t   postdeps_CXX=$prev$p\n\t else\n\t   postdeps_CXX=\"${postdeps_CXX} $prev$p\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test no = \"$pre_test_object_deps_done\"; then\n\t if test -z \"$predep_objects_CXX\"; then\n\t   predep_objects_CXX=$p\n\t else\n\t   predep_objects_CXX=\"$predep_objects_CXX $p\"\n\t fi\n       else\n\t if test -z \"$postdep_objects_CXX\"; then\n\t   postdep_objects_CXX=$p\n\t else\n\t   postdep_objects_CXX=\"$postdep_objects_CXX $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling CXX test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\ncase $host_os in\ninterix[3-9]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  predep_objects_CXX=\n  postdep_objects_CXX=\n  postdeps_CXX=\n  ;;\nesac\n\n\ncase \" $postdeps_CXX \" in\n*\" -lc \"*) archive_cmds_need_lc_CXX=no ;;\nesac\n compiler_lib_search_dirs_CXX=\nif test -n \"${compiler_lib_search_path_CXX}\"; then\n compiler_lib_search_dirs_CXX=`echo \" ${compiler_lib_search_path_CXX}\" | $SED -e 's! -L! !g' -e 's!^ !!'`\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    lt_prog_compiler_wl_CXX=\nlt_prog_compiler_pic_CXX=\nlt_prog_compiler_static_CXX=\n\n\n  # C++ specific cases for pic, static, wl, etc.\n  if test yes = \"$GXX\"; then\n    lt_prog_compiler_wl_CXX='-Wl,'\n    lt_prog_compiler_static_CXX='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static_CXX='-Bstatic'\n      fi\n      lt_prog_compiler_pic_CXX='-fPIC'\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic_CXX='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the '-m68020' flag to GCC prevents building anything better,\n            # like '-m68040'.\n            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'\n      case $host_os in\n      os2*)\n\tlt_prog_compiler_static_CXX='$wl-static'\n\t;;\n      esac\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic_CXX='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      lt_prog_compiler_pic_CXX=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static_CXX=\n      ;;\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic_CXX=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\tlt_prog_compiler_pic_CXX='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic_CXX='-fPIC -shared'\n      ;;\n    *)\n      lt_prog_compiler_pic_CXX='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[4-9]*)\n\t# All AIX code is PIC.\n\tif test ia64 = \"$host_cpu\"; then\n\t  # AIX 5 now supports IA64 processor\n\t  lt_prog_compiler_static_CXX='-Bstatic'\n\telse\n\t  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, CXX)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tlt_prog_compiler_pic_CXX='-DDLL_EXPORT'\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'\n\t    if test ia64 != \"$host_cpu\"; then\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64, which still supported -KPIC.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fpic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-qpic'\n\t    lt_prog_compiler_static_CXX='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      lt_prog_compiler_pic_CXX='-KPIC'\n\t      lt_prog_compiler_static_CXX='-Bstatic'\n\t      lt_prog_compiler_wl_CXX='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    lt_prog_compiler_pic_CXX='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd*)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        lt_prog_compiler_pic_CXX='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    lt_prog_compiler_wl_CXX='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\tlt_prog_compiler_can_build_shared_CXX=no\n\t;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms that do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic_CXX=\n    ;;\n  *)\n    lt_prog_compiler_pic_CXX=\"$lt_prog_compiler_pic_CXX -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_CXX\" >&6; }\nlt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works_CXX=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic_CXX -DPIC\"  ## exclude from sc_useless_quotes_in_assignment\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works_CXX=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works_CXX\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler_pic_works_CXX\"; then\n    case $lt_prog_compiler_pic_CXX in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic_CXX=\" $lt_prog_compiler_pic_CXX\" ;;\n     esac\nelse\n    lt_prog_compiler_pic_CXX=\n     lt_prog_compiler_can_build_shared_CXX=no\nfi\n\nfi\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static_CXX\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works_CXX=no\n   save_LDFLAGS=$LDFLAGS\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works_CXX=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works_CXX=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=$save_LDFLAGS\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works_CXX\" >&6; }\n\nif test yes = \"$lt_cv_prog_compiler_static_works_CXX\"; then\n    :\nelse\n    lt_prog_compiler_static_CXX=\nfi\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n\nhard_links=nottested\nif test no = \"$lt_cv_prog_compiler_c_o_CXX\" && test no != \"$need_locks\"; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test no = \"$hard_links\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  case $host_os in\n  aix[4-9]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to GNU nm, but means don't demangle to AIX nm.\n    # Without the \"-l\" option, or with the \"-B\" option, AIX nm treats\n    # weak defined symbols like other global defined symbols, whereas\n    # GNU nm marks them as \"W\".\n    # While the 'weak' keyword is ignored in the Export File, we need\n    # it in the Import File for the 'aix-soname' feature, so we have\n    # to replace the \"-B\" option with \"-P\" for AIX nm.\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { if (\\$ 2 == \"W\") { print \\$ 3 \" weak\" } else { print \\$ 3 } } }'\\'' | sort -u > $export_symbols'\n    else\n      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\\''s/B\\([^B]*\\)$/P\\1/'\\''` -PCpgl $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"L\") || (\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) && (substr(\\$ 1,1,1) != \".\")) { if ((\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) { print \\$ 1 \" weak\" } else { print \\$ 1 } } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    export_symbols_cmds_CXX=$ltdll_cmds\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl* | icl*)\n      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n      ;;\n    esac\n    ;;\n  *)\n    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\ntest no = \"$ld_shlibs_CXX\" && can_build_shared=no\n\nwith_gnu_ld_CXX=$with_gnu_ld\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc_CXX\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc_CXX=yes\n\n  if test yes,yes = \"$GCC,$enable_shared\"; then\n    case $archive_cmds_CXX in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl_CXX\n\t  pic_flag=$lt_prog_compiler_pic_CXX\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX\n\t  allow_undefined_flag_CXX=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc_CXX=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc_CXX=yes\n\t  fi\n\t  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc_CXX\" >&6; }\n      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=.so\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\n\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='$libname$release$shared_ext$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test ia64 = \"$host_cpu\"; then\n    # AIX 5 supports IA64\n    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line '#! .'.  This would cause the generated library to\n    # depend on '.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # Using Import Files as archive members, it is possible to support\n    # filename-based versioning of shared library archives on AIX. While\n    # this would work for both with and without runtime linking, it will\n    # prevent static linking of such archives. So we do filename-based\n    # shared library versioning with .so extension only, which is used\n    # when both runtime linking and shared linking is enabled.\n    # Unfortunately, runtime linking may impact performance, so we do\n    # not want this to be the default eventually. Also, we use the\n    # versioned .so libs for executables only if there is the -brtl\n    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.\n    # To allow for filename-based versioning support, we need to create\n    # libNAME.so.V as an archive file, containing:\n    # *) an Import File, referring to the versioned filename of the\n    #    archive as well as the shared archive member, telling the\n    #    bitwidth (32 or 64) of that shared object, and providing the\n    #    list of exported symbols of that shared object, eventually\n    #    decorated with the 'weak' keyword\n    # *) the shared object with the F_LOADONLY flag set, to really avoid\n    #    it being seen by the linker.\n    # At run time we better use the real file rather than another symlink,\n    # but for link time we create the symlink libNAME.so -> libNAME.so.V\n\n    case $with_aix_soname,$aix_use_runtimelinking in\n    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    aix,yes) # traditional libtool\n      dynamic_linker='AIX unversionable lib.so'\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      ;;\n    aix,no) # traditional AIX only\n      dynamic_linker='AIX lib.a(lib.so.V)'\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      ;;\n    svr4,*) # full svr4 only\n      dynamic_linker=\"AIX lib.so.V($shared_archive_member_spec.o)\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,yes) # both, prefer svr4\n      dynamic_linker=\"AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # unpreferred sharedlib libNAME.a needs extra handling\n      postinstall_cmds='test -n \"$linkname\" || linkname=\"$realname\"~func_stripname \"\" \".so\" \"$linkname\"~$install_shared_prog \"$dir/$func_stripname_result.$libext\" \"$destdir/$func_stripname_result.$libext\"~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib \"$destdir/$func_stripname_result.$libext\"'\n      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname \"\" \".so\" \"$n\"~test \"$func_stripname_result\" = \"$n\" || func_append rmfiles \" $odir/$func_stripname_result.$libext\"'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,no) # both, prefer aix\n      dynamic_linker=\"AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)\"\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling\n      postinstall_cmds='test -z \"$dlname\" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib $destdir/$dlname~test -n \"$linkname\" || linkname=$realname~func_stripname \"\" \".a\" \"$linkname\"~(cd \"$destdir\" && $LN_S -f $dlname $func_stripname_result.so)'\n      postuninstall_cmds='test -z \"$dlname\" || func_append rmfiles \" $odir/$dlname\"~for n in $old_library $library_names; do :; done~func_stripname \"\" \".a\" \"$n\"~func_append rmfiles \" $odir/$func_stripname_result.so\"'\n      ;;\n    esac\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='$libname$shared_ext'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl* | *,icl*)\n    # Native MSVC or ICC\n    libname_spec='$name'\n    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'\n    library_names_spec='$libname.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=$LIB\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC and ICC wrapper\n    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$major$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      soname_spec='$libname$release$shared_ext$major'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    if test 32 = \"$HPUX_IA64_MODE\"; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux32\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux64\n    fi\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test yes = \"$lt_cv_prog_gnu_ld\"; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib$libsuff /lib$libsuff\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\nlinux*android*)\n  version_type=none # Android doesn't support versioned libraries.\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext'\n  soname_spec='$libname$release$shared_ext'\n  finish_cmds=\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  dynamic_linker='Android linker'\n  # Don't embed -rpath directories since the linker doesn't support them.\n  hardcode_libdir_flag_spec_CXX='-L$libdir'\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl_CXX\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec_CXX\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Ideally, we could use ldconfig to report *all* directores which are\n  # searched for libraries, however this is still not possible.  Aside from not\n  # being certain /sbin/ldconfig is available, command\n  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,\n  # even though it is searched at run-time.  Try to do the best guess by\n  # appending ld.so.conf contents (and includes) to the search path.\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd* | bitrig*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=/usr/lib\n  need_lib_prefix=no\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n    need_version=no\n  else\n    need_version=yes\n  fi\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\nos2*)\n  libname_spec='$name'\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n  # OS/2 can only load a DLL with a base name of 8 characters or less.\n  soname_spec='`test -n \"$os2dllname\" && libname=\"$os2dllname\";\n    v=$($ECHO $release$versuffix | tr -d .-);\n    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);\n    $ECHO $n$v`$shared_ext'\n  library_names_spec='${libname}_dll.$libext'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=BEGINLIBPATH\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  postinstall_cmds='base_file=`basename \\$file`~\n    dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; $ECHO \\$dlname'\\''`~\n    dldir=$destdir/`dirname \\$dlpath`~\n    test -d \\$dldir || mkdir -p \\$dldir~\n    $install_prog $dir/$dlname \\$dldir/$dlname~\n    chmod a+x \\$dldir/$dlname~\n    if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n      eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n    fi'\n  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; $ECHO \\$dlname'\\''`~\n    dlpath=$dir/\\$dldll~\n    $RM \\$dlpath'\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test yes = \"$with_gnu_ld\"; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec; then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'\n    soname_spec='$libname$shared_ext.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=sco\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test yes = \"$with_gnu_ld\"; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest no = \"$dynamic_linker\" && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test yes = \"$GCC\"; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test set = \"${lt_cv_sys_lib_search_path_spec+set}\"; then\n  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec\nfi\n\nif test set = \"${lt_cv_sys_lib_dlsearch_path_spec+set}\"; then\n  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec\nfi\n\n# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...\nconfigure_time_dlsearch_path=$sys_lib_dlsearch_path_spec\n\n# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code\nfunc_munge_path_list sys_lib_dlsearch_path_spec \"$LT_SYS_LIBRARY_PATH\"\n\n# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool\nconfigure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action_CXX=\nif test -n \"$hardcode_libdir_flag_spec_CXX\" ||\n   test -n \"$runpath_var_CXX\" ||\n   test yes = \"$hardcode_automatic_CXX\"; then\n\n  # We can hardcode non-existent directories.\n  if test no != \"$hardcode_direct_CXX\" &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test no != \"$_LT_TAGVAR(hardcode_shlibpath_var, CXX)\" &&\n     test no != \"$hardcode_minus_L_CXX\"; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action_CXX=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action_CXX=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action_CXX=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX\" >&5\n$as_echo \"$hardcode_action_CXX\" >&6; }\n\nif test relink = \"$hardcode_action_CXX\" ||\n   test yes = \"$inherit_rpath_CXX\"; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test yes = \"$shlibpath_overrides_runpath\" ||\n     test no = \"$enable_shared\"; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test yes != \"$_lt_caught_CXX_error\"\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n\n# Check for GCC visibility feature\n\n\n\n  VISIBILITY_CFLAGS=\n  VISIBILITY_CXXFLAGS=\n  HAVE_VISIBILITY=0\n  if test -n \"$GCC\"; then\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable\" >&5\n$as_echo_n \"checking whether the -Werror option is usable... \" >&6; }\n    if ${pcre_cv_cc_vis_werror+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n      pcre_save_CFLAGS=\"$CFLAGS\"\n      CFLAGS=\"$CFLAGS -Werror\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  pcre_cv_cc_vis_werror=yes\nelse\n  pcre_cv_cc_vis_werror=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n      CFLAGS=\"$pcre_save_CFLAGS\"\nfi\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_vis_werror\" >&5\n$as_echo \"$pcre_cv_cc_vis_werror\" >&6; }\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations\" >&5\n$as_echo_n \"checking for simple visibility declarations... \" >&6; }\n    if ${pcre_cv_cc_visibility+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n      pcre_save_CFLAGS=\"$CFLAGS\"\n      CFLAGS=\"$CFLAGS -fvisibility=hidden\"\n                                    if test $pcre_cv_cc_vis_werror = yes; then\n        CFLAGS=\"$CFLAGS -Werror\"\n      fi\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nextern __attribute__((__visibility__(\"hidden\"))) int hiddenvar;\n             extern __attribute__((__visibility__(\"default\"))) int exportedvar;\n             extern __attribute__((__visibility__(\"hidden\"))) int hiddenfunc (void);\n             extern __attribute__((__visibility__(\"default\"))) int exportedfunc (void);\n             void dummyfunc (void) {}\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  pcre_cv_cc_visibility=yes\nelse\n  pcre_cv_cc_visibility=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n      CFLAGS=\"$pcre_save_CFLAGS\"\nfi\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pcre_cv_cc_visibility\" >&5\n$as_echo \"$pcre_cv_cc_visibility\" >&6; }\n    if test $pcre_cv_cc_visibility = yes; then\n      VISIBILITY_CFLAGS=\"-fvisibility=hidden\"\n      VISIBILITY_CXXFLAGS=\"-fvisibility=hidden -fvisibility-inlines-hidden\"\n      HAVE_VISIBILITY=1\n\n$as_echo \"#define PCRE_EXP_DECL extern __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCRE_EXP_DEFN __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCRE_EXP_DATA_DEFN __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCREPOSIX_EXP_DECL extern __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCREPOSIX_EXP_DEFN extern __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCRECPP_EXP_DECL extern __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n\n$as_echo \"#define PCRECPP_EXP_DEFN __attribute__ ((visibility (\\\"default\\\")))\" >>confdefs.h\n\n    fi\n  fi\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_VISIBILITY $HAVE_VISIBILITY\n_ACEOF\n\n\n\n# Versioning\n\nPCRE_MAJOR=\"8\"\nPCRE_MINOR=\"43\"\nPCRE_PRERELEASE=\"\"\nPCRE_DATE=\"2019-02-23\"\n\nif test \"$PCRE_MINOR\" = \"08\" -o \"$PCRE_MINOR\" = \"09\"\nthen\n  echo \"***\"\n  echo \"*** Minor version number $PCRE_MINOR must not be used. ***\"\n  echo \"*** Use only 01 to 07 or 10 onwards, to avoid octal issues. ***\"\n  echo \"***\"\n  exit 1\nfi\n\n\n\n\n\n\n# Set a more sensible default value for $(htmldir).\nif test \"x$htmldir\" = 'x${docdir}'\nthen\n  htmldir='${docdir}/html'\nfi\n\n# Handle --disable-pcre8 (enabled by default)\n# Check whether --enable-pcre8 was given.\nif test \"${enable_pcre8+set}\" = set; then :\n  enableval=$enable_pcre8;\nelse\n  enable_pcre8=unset\nfi\n\n\n\n# Handle --enable-pcre16 (disabled by default)\n# Check whether --enable-pcre16 was given.\nif test \"${enable_pcre16+set}\" = set; then :\n  enableval=$enable_pcre16;\nelse\n  enable_pcre16=unset\nfi\n\n\n\n# Handle --enable-pcre32 (disabled by default)\n# Check whether --enable-pcre32 was given.\nif test \"${enable_pcre32+set}\" = set; then :\n  enableval=$enable_pcre32;\nelse\n  enable_pcre32=unset\nfi\n\n\n\n# Handle --disable-cpp. The substitution of enable_cpp is needed for use in\n# pcre-config.\n# Check whether --enable-cpp was given.\nif test \"${enable_cpp+set}\" = set; then :\n  enableval=$enable_cpp;\nelse\n  enable_cpp=unset\nfi\n\n\n\n# Handle --enable-jit (disabled by default)\n# Check whether --enable-jit was given.\nif test \"${enable_jit+set}\" = set; then :\n  enableval=$enable_jit;\nelse\n  enable_jit=no\nfi\n\n\n# This code enables JIT if the hardware supports it.\n\nif test \"$enable_jit\" = \"auto\"; then\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n  #define SLJIT_CONFIG_AUTO 1\n  #include \"sljit/sljitConfigInternal.h\"\n  #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n  #error unsupported\n  #endif\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  enable_jit=yes\nelse\n  enable_jit=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\n# Handle --disable-pcregrep-jit (enabled by default)\n# Check whether --enable-pcregrep-jit was given.\nif test \"${enable_pcregrep_jit+set}\" = set; then :\n  enableval=$enable_pcregrep_jit;\nelse\n  enable_pcregrep_jit=yes\nfi\n\n\n# Handle --enable-rebuild-chartables\n# Check whether --enable-rebuild-chartables was given.\nif test \"${enable_rebuild_chartables+set}\" = set; then :\n  enableval=$enable_rebuild_chartables;\nelse\n  enable_rebuild_chartables=no\nfi\n\n\n# Handle --enable-utf8 (disabled by default)\n# Check whether --enable-utf8 was given.\nif test \"${enable_utf8+set}\" = set; then :\n  enableval=$enable_utf8;\nelse\n  enable_utf8=unset\nfi\n\n\n# Handle --enable-utf (disabled by default)\n# Check whether --enable-utf was given.\nif test \"${enable_utf+set}\" = set; then :\n  enableval=$enable_utf;\nelse\n  enable_utf=unset\nfi\n\n\n# Handle --enable-unicode-properties\n# Check whether --enable-unicode-properties was given.\nif test \"${enable_unicode_properties+set}\" = set; then :\n  enableval=$enable_unicode_properties;\nelse\n  enable_unicode_properties=no\nfi\n\n\n# Handle newline options\nac_pcre_newline=lf\n# Check whether --enable-newline-is-cr was given.\nif test \"${enable_newline_is_cr+set}\" = set; then :\n  enableval=$enable_newline_is_cr; ac_pcre_newline=cr\nfi\n\n# Check whether --enable-newline-is-lf was given.\nif test \"${enable_newline_is_lf+set}\" = set; then :\n  enableval=$enable_newline_is_lf; ac_pcre_newline=lf\nfi\n\n# Check whether --enable-newline-is-crlf was given.\nif test \"${enable_newline_is_crlf+set}\" = set; then :\n  enableval=$enable_newline_is_crlf; ac_pcre_newline=crlf\nfi\n\n# Check whether --enable-newline-is-anycrlf was given.\nif test \"${enable_newline_is_anycrlf+set}\" = set; then :\n  enableval=$enable_newline_is_anycrlf; ac_pcre_newline=anycrlf\nfi\n\n# Check whether --enable-newline-is-any was given.\nif test \"${enable_newline_is_any+set}\" = set; then :\n  enableval=$enable_newline_is_any; ac_pcre_newline=any\nfi\n\nenable_newline=\"$ac_pcre_newline\"\n\n# Handle --enable-bsr-anycrlf\n# Check whether --enable-bsr-anycrlf was given.\nif test \"${enable_bsr_anycrlf+set}\" = set; then :\n  enableval=$enable_bsr_anycrlf;\nelse\n  enable_bsr_anycrlf=no\nfi\n\n\n# Handle --enable-ebcdic\n# Check whether --enable-ebcdic was given.\nif test \"${enable_ebcdic+set}\" = set; then :\n  enableval=$enable_ebcdic;\nelse\n  enable_ebcdic=no\nfi\n\n\n# Handle --enable-ebcdic-nl25\n# Check whether --enable-ebcdic-nl25 was given.\nif test \"${enable_ebcdic_nl25+set}\" = set; then :\n  enableval=$enable_ebcdic_nl25;\nelse\n  enable_ebcdic_nl25=no\nfi\n\n\n# Handle --disable-stack-for-recursion\n# Check whether --enable-stack-for-recursion was given.\nif test \"${enable_stack_for_recursion+set}\" = set; then :\n  enableval=$enable_stack_for_recursion;\nelse\n  enable_stack_for_recursion=yes\nfi\n\n\n# Handle --enable-pcregrep-libz\n# Check whether --enable-pcregrep-libz was given.\nif test \"${enable_pcregrep_libz+set}\" = set; then :\n  enableval=$enable_pcregrep_libz;\nelse\n  enable_pcregrep_libz=no\nfi\n\n\n# Handle --enable-pcregrep-libbz2\n# Check whether --enable-pcregrep-libbz2 was given.\nif test \"${enable_pcregrep_libbz2+set}\" = set; then :\n  enableval=$enable_pcregrep_libbz2;\nelse\n  enable_pcregrep_libbz2=no\nfi\n\n\n# Handle --with-pcregrep-bufsize=N\n\n# Check whether --with-pcregrep-bufsize was given.\nif test \"${with_pcregrep_bufsize+set}\" = set; then :\n  withval=$with_pcregrep_bufsize;\nelse\n  with_pcregrep_bufsize=20480\nfi\n\n\n# Handle --enable-pcretest-libedit\n# Check whether --enable-pcretest-libedit was given.\nif test \"${enable_pcretest_libedit+set}\" = set; then :\n  enableval=$enable_pcretest_libedit;\nelse\n  enable_pcretest_libedit=no\nfi\n\n\n# Handle --enable-pcretest-libreadline\n# Check whether --enable-pcretest-libreadline was given.\nif test \"${enable_pcretest_libreadline+set}\" = set; then :\n  enableval=$enable_pcretest_libreadline;\nelse\n  enable_pcretest_libreadline=no\nfi\n\n\n# Handle --with-posix-malloc-threshold=NBYTES\n\n# Check whether --with-posix-malloc-threshold was given.\nif test \"${with_posix_malloc_threshold+set}\" = set; then :\n  withval=$with_posix_malloc_threshold;\nelse\n  with_posix_malloc_threshold=10\nfi\n\n\n# Handle --with-link-size=N\n\n# Check whether --with-link-size was given.\nif test \"${with_link_size+set}\" = set; then :\n  withval=$with_link_size;\nelse\n  with_link_size=2\nfi\n\n\n# Handle --with-parens-nest-limit=N\n\n# Check whether --with-parens-nest-limit was given.\nif test \"${with_parens_nest_limit+set}\" = set; then :\n  withval=$with_parens_nest_limit;\nelse\n  with_parens_nest_limit=250\nfi\n\n\n# Handle --with-match-limit=N\n\n# Check whether --with-match-limit was given.\nif test \"${with_match_limit+set}\" = set; then :\n  withval=$with_match_limit;\nelse\n  with_match_limit=10000000\nfi\n\n\n# Handle --with-match-limit_recursion=N\n#\n# Note: In config.h, the default is to define MATCH_LIMIT_RECURSION\n# symbolically as MATCH_LIMIT, which in turn is defined to be some numeric\n# value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some\n# different numeric value (or even the same numeric value as MATCH_LIMIT,\n# though no longer defined in terms of the latter).\n#\n\n# Check whether --with-match-limit-recursion was given.\nif test \"${with_match_limit_recursion+set}\" = set; then :\n  withval=$with_match_limit_recursion;\nelse\n  with_match_limit_recursion=MATCH_LIMIT\nfi\n\n\n# Handle --enable-valgrind\n# Check whether --enable-valgrind was given.\nif test \"${enable_valgrind+set}\" = set; then :\n  enableval=$enable_valgrind;\nelse\n  enable_valgrind=no\nfi\n\n\n# Enable code coverage reports using gcov\n# Check whether --enable-coverage was given.\nif test \"${enable_coverage+set}\" = set; then :\n  enableval=$enable_coverage;\nelse\n  enable_coverage=no\nfi\n\n\n# Copy enable_utf8 value to enable_utf for compatibility reasons\nif test \"x$enable_utf8\" != \"xunset\"\nthen\n  if test \"x$enable_utf\" != \"xunset\"\n  then\n    as_fn_error $? \"--enable/disable-utf8 is kept only for compatibility reasons and its value is copied to --enable/disable-utf. Newer code must use --enable/disable-utf alone.\" \"$LINENO\" 5\n  fi\n  enable_utf=$enable_utf8\nfi\n\n# Set the default value for pcre8\nif test \"x$enable_pcre8\" = \"xunset\"\nthen\n  enable_pcre8=yes\nfi\n\n# Set the default value for pcre16\nif test \"x$enable_pcre16\" = \"xunset\"\nthen\n  enable_pcre16=no\nfi\n\n# Set the default value for pcre32\nif test \"x$enable_pcre32\" = \"xunset\"\nthen\n  enable_pcre32=no\nfi\n\n# Make sure enable_pcre8 or enable_pcre16 was set\nif test \"x$enable_pcre8$enable_pcre16$enable_pcre32\" = \"xnonono\"\nthen\n  as_fn_error $? \"At least one of 8, 16 or 32 bit pcre library must be enabled\" \"$LINENO\" 5\nfi\n\n# Make sure that if enable_unicode_properties was set, that UTF support is enabled.\nif test \"x$enable_unicode_properties\" = \"xyes\"\nthen\n  if test \"x$enable_utf\" = \"xno\"\n  then\n    as_fn_error $? \"support for Unicode properties requires UTF-8/16/32 support\" \"$LINENO\" 5\n  fi\n  enable_utf=yes\nfi\n\n# enable_utf is disabled by default.\nif test \"x$enable_utf\" = \"xunset\"\nthen\n  enable_utf=no\nfi\n\n# enable_cpp copies the value of enable_pcre8 by default\nif test \"x$enable_cpp\" = \"xunset\"\nthen\n  enable_cpp=$enable_pcre8\nfi\n\n# Make sure that if enable_cpp was set, that enable_pcre8 support is enabled\nif test \"x$enable_cpp\" = \"xyes\"\nthen\n  if test \"x$enable_pcre8\" = \"xno\"\n  then\n    as_fn_error $? \"C++ library requires pcre library with 8 bit characters\" \"$LINENO\" 5\n  fi\nfi\n\n# Convert the newline identifier into the appropriate integer value. The first\n# three are ASCII values 0x0a, 0x0d, and 0x0d0a, but if EBCDIC is enabled, they\n# are changed below.\n\ncase \"$enable_newline\" in\n  lf)      ac_pcre_newline_value=10   ;;\n  cr)      ac_pcre_newline_value=13   ;;\n  crlf)    ac_pcre_newline_value=3338 ;;\n  anycrlf) ac_pcre_newline_value=-2   ;;\n  any)     ac_pcre_newline_value=-1   ;;\n  *)\n  as_fn_error $? \"invalid argument \\\"$enable_newline\\\" to --enable-newline option\" \"$LINENO\" 5\n  ;;\nesac\n\n# --enable-ebcdic-nl25 implies --enable-ebcdic\nif test \"x$enable_ebcdic_nl25\" = \"xyes\"; then\n  enable_ebcdic=yes\nfi\n\n# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled,\n# and the newline value is adjusted appropriately (CR is still 13, but LF is\n# 21 or 37). Also check that UTF support is not requested, because PCRE cannot\n# handle EBCDIC and UTF in the same build. To do so it would need to use\n# different character constants depending on the mode.\n#\nif test \"x$enable_ebcdic\" = \"xyes\"; then\n  enable_rebuild_chartables=yes\n\n  if test \"x$enable_utf\" = \"xyes\"; then\n    as_fn_error $? \"support for EBCDIC and UTF-8/16/32 cannot be enabled at the same time\" \"$LINENO\" 5\n  fi\n\n  if test \"x$enable_ebcdic_nl25\" = \"xno\"; then\n    case \"$ac_pcre_newline_value\" in\n      10)   ac_pcre_newline_value=21 ;;\n      3338) ac_pcre_newline_value=3349 ;;\n    esac\n  else\n    case \"$ac_pcre_newline_value\" in\n      10)   ac_pcre_newline_value=37 ;;\n      3338) ac_pcre_newline_value=3365 ;;\n    esac\n  fi\nfi\n\n# Check argument to --with-link-size\ncase \"$with_link_size\" in\n  2|3|4) ;;\n  *)\n  as_fn_error $? \"invalid argument \\\"$with_link_size\\\" to --with-link-size option\" \"$LINENO\" 5\n  ;;\nesac\n\n\n\n# Checks for header files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\nfor ac_header in limits.h sys/types.h sys/stat.h dirent.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in windows.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"windows.h\" \"ac_cv_header_windows_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_windows_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_WINDOWS_H 1\n_ACEOF\n HAVE_WINDOWS_H=1\nfi\n\ndone\n\n\n# The files below are C++ header files.\npcre_have_type_traits=\"0\"\npcre_have_bits_type_traits=\"0\"\n\nif test \"x$enable_cpp\" = \"xyes\" -a -z \"$CXX\"; then\n   as_fn_error $? \"Invalid C++ compiler or C++ compiler flags\" \"$LINENO\" 5\nfi\n\nif test \"x$enable_cpp\" = \"xyes\" -a -n \"$CXX\"\nthen\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n# Older versions of pcre defined pcrecpp::no_arg, but in new versions\n# it's called pcrecpp::RE::no_arg.  For backwards ABI compatibility,\n# we want to make one an alias for the other.  Different systems do\n# this in different ways.  Some systems, for instance, can do it via\n# a linker flag: -alias (for os x 10.5) or -i (for os x <=10.4).\nOLD_LDFLAGS=\"$LDFLAGS\"\nfor flag in \"-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE\" \\\n            \"-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE\"; do\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for alias support in the linker\" >&5\n$as_echo_n \"checking for alias support in the linker... \" >&6; }\n  LDFLAGS=\"$OLD_LDFLAGS -Wl,$flag\"\n  # We try to run the linker with this new ld flag.  If the link fails,\n  # we give up and remove the new flag from LDFLAGS.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nnamespace pcrecpp {\n                                    class RE { static int no_arg; };\n                                    int RE::no_arg;\n                                  }\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; };\n                  EXTRA_LIBPCRECPP_LDFLAGS=\"$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag\";\n                  break;\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\ndone\nLDFLAGS=\"$OLD_LDFLAGS\"\n\n# We could be more clever here, given we're doing AC_SUBST with this\n# (eg set a var to be the name of the include file we want). But we're not\n# so it's easy to change back to 'regular' autoconf vars if we needed to.\n\nfor ac_header in string\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"string\" \"ac_cv_header_string\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_string\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_STRING 1\n_ACEOF\n pcre_have_cpp_headers=\"1\"\nelse\n  pcre_have_cpp_headers=\"0\"\nfi\n\ndone\n\nfor ac_header in bits/type_traits.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"bits/type_traits.h\" \"ac_cv_header_bits_type_traits_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_bits_type_traits_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_BITS_TYPE_TRAITS_H 1\n_ACEOF\n pcre_have_bits_type_traits=\"1\"\nelse\n  pcre_have_bits_type_traits=\"0\"\nfi\n\ndone\n\nfor ac_header in type_traits.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"type_traits.h\" \"ac_cv_header_type_traits_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_type_traits_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_TYPE_TRAITS_H 1\n_ACEOF\n pcre_have_type_traits=\"1\"\nelse\n  pcre_have_type_traits=\"0\"\nfi\n\ndone\n\n\n# (This isn't c++-specific, but is only used in pcrecpp.cc, so try this\n# in a c++ context.  This matters becuase strtoimax is C99 and may not\n# be supported by the C++ compiler.)\n# Figure out how to create a longlong from a string: strtoll and\n# equiv.  It's not enough to call AC_CHECK_FUNCS: hpux has a\n# strtoll, for instance, but it only takes 2 args instead of 3!\n# We have to call AH_TEMPLATE since AC_DEFINE_UNQUOTED below is complex.\n\n\n\n\nhave_strto_fn=0\nfor fn in strtoq strtoll _strtoi64 strtoimax; do\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $fn\" >&5\n$as_echo_n \"checking for $fn... \" >&6; }\n  if test \"$fn\" = strtoimax; then\n    include=stdint.h\n  else\n    include=stdlib.h\n  fi\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$include>\nint\nmain ()\n{\nchar* e; return $fn(\"100\", &e, 10)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` 1\n_ACEOF\n\n                     have_strto_fn=1\n                     break\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\ndone\n\nif test \"$have_strto_fn\" = 1; then\n  ac_fn_cxx_check_type \"$LINENO\" \"long long\" \"ac_cv_type_long_long\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_long_long\" = xyes; then :\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_LONG_LONG 1\n_ACEOF\n\npcre_have_long_long=\"1\"\nelse\n  pcre_have_long_long=\"0\"\nfi\n\n  ac_fn_cxx_check_type \"$LINENO\" \"unsigned long long\" \"ac_cv_type_unsigned_long_long\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_unsigned_long_long\" = xyes; then :\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_UNSIGNED_LONG_LONG 1\n_ACEOF\n\npcre_have_ulong_long=\"1\"\nelse\n  pcre_have_ulong_long=\"0\"\nfi\n\nelse\n  pcre_have_long_long=\"0\"\n  pcre_have_ulong_long=\"0\"\nfi\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n# Using AC_SUBST eliminates the need to include config.h in a public .h file\n\n\n\n# Conditional compilation\n if test \"x$enable_pcre8\" = \"xyes\"; then\n  WITH_PCRE8_TRUE=\n  WITH_PCRE8_FALSE='#'\nelse\n  WITH_PCRE8_TRUE='#'\n  WITH_PCRE8_FALSE=\nfi\n\n if test \"x$enable_pcre16\" = \"xyes\"; then\n  WITH_PCRE16_TRUE=\n  WITH_PCRE16_FALSE='#'\nelse\n  WITH_PCRE16_TRUE='#'\n  WITH_PCRE16_FALSE=\nfi\n\n if test \"x$enable_pcre32\" = \"xyes\"; then\n  WITH_PCRE32_TRUE=\n  WITH_PCRE32_FALSE='#'\nelse\n  WITH_PCRE32_TRUE='#'\n  WITH_PCRE32_FALSE=\nfi\n\n if test \"x$enable_cpp\" = \"xyes\"; then\n  WITH_PCRE_CPP_TRUE=\n  WITH_PCRE_CPP_FALSE='#'\nelse\n  WITH_PCRE_CPP_TRUE='#'\n  WITH_PCRE_CPP_FALSE=\nfi\n\n if test \"x$enable_rebuild_chartables\" = \"xyes\"; then\n  WITH_REBUILD_CHARTABLES_TRUE=\n  WITH_REBUILD_CHARTABLES_FALSE='#'\nelse\n  WITH_REBUILD_CHARTABLES_TRUE='#'\n  WITH_REBUILD_CHARTABLES_FALSE=\nfi\n\n if test \"x$enable_jit\" = \"xyes\"; then\n  WITH_JIT_TRUE=\n  WITH_JIT_FALSE='#'\nelse\n  WITH_JIT_TRUE='#'\n  WITH_JIT_FALSE=\nfi\n\n if test \"x$enable_utf\" = \"xyes\"; then\n  WITH_UTF_TRUE=\n  WITH_UTF_FALSE='#'\nelse\n  WITH_UTF_TRUE='#'\n  WITH_UTF_FALSE=\nfi\n\n if test \"x$enable_valgrind\" = \"xyes\"; then\n  WITH_VALGRIND_TRUE=\n  WITH_VALGRIND_FALSE='#'\nelse\n  WITH_VALGRIND_TRUE='#'\n  WITH_VALGRIND_FALSE=\nfi\n\n\n# Checks for typedefs, structures, and compiler characteristics.\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const\" >&5\n$as_echo_n \"checking for an ANSI C-conforming const... \" >&6; }\nif ${ac_cv_c_const+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n#ifndef __cplusplus\n  /* Ultrix mips cc rejects this sort of thing.  */\n  typedef int charset[2];\n  const charset cs = { 0, 0 };\n  /* SunOS 4.1.1 cc rejects this.  */\n  char const *const *pcpcc;\n  char **ppc;\n  /* NEC SVR4.0.2 mips cc rejects this.  */\n  struct point {int x, y;};\n  static struct point const zero = {0,0};\n  /* AIX XL C 1.02.0.0 rejects this.\n     It does not let you subtract one const X* pointer from another in\n     an arm of an if-expression whose if-part is not a constant\n     expression */\n  const char *g = \"string\";\n  pcpcc = &g + (g ? g-g : 0);\n  /* HPUX 7.0 cc rejects these. */\n  ++pcpcc;\n  ppc = (char**) pcpcc;\n  pcpcc = (char const *const *) ppc;\n  { /* SCO 3.2v4 cc rejects this sort of thing.  */\n    char tx;\n    char *t = &tx;\n    char const *s = 0 ? (char *) 0 : (char const *) 0;\n\n    *t++ = 0;\n    if (s) return 0;\n  }\n  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */\n    int x[] = {25, 17};\n    const int *foo = &x[0];\n    ++foo;\n  }\n  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */\n    typedef const int *iptr;\n    iptr p = 0;\n    ++p;\n  }\n  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying\n       \"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */\n    struct s { int j; const int *ap[3]; } bx;\n    struct s *b = &bx; b->j = 5;\n  }\n  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */\n    const int foo = 10;\n    if (!foo) return 0;\n  }\n  return !cs[0] && !zero.x;\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_const=yes\nelse\n  ac_cv_c_const=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const\" >&5\n$as_echo \"$ac_cv_c_const\" >&6; }\nif test $ac_cv_c_const = no; then\n\n$as_echo \"#define const /**/\" >>confdefs.h\n\nfi\n\nac_fn_c_check_type \"$LINENO\" \"size_t\" \"ac_cv_type_size_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_size_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define size_t unsigned int\n_ACEOF\n\nfi\n\n\n# Checks for library functions.\n\nfor ac_func in bcopy memmove strerror\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n# Check for the availability of libz (aka zlib)\n\nfor ac_header in zlib.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"zlib.h\" \"ac_cv_header_zlib_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_zlib_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_ZLIB_H 1\n_ACEOF\n HAVE_ZLIB_H=1\nfi\n\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz\" >&5\n$as_echo_n \"checking for gzopen in -lz... \" >&6; }\nif ${ac_cv_lib_z_gzopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lz  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar gzopen ();\nint\nmain ()\n{\nreturn gzopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_z_gzopen=yes\nelse\n  ac_cv_lib_z_gzopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen\" >&5\n$as_echo \"$ac_cv_lib_z_gzopen\" >&6; }\nif test \"x$ac_cv_lib_z_gzopen\" = xyes; then :\n  HAVE_LIBZ=1\nfi\n\n\n# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB,\n# as for libz. However, this had the following problem, diagnosed and fixed by\n# a user:\n#\n#   - libbz2 uses the Pascal calling convention (WINAPI) for the functions\n#     under Win32.\n#   - The standard autoconf AC_CHECK_LIB fails to include \"bzlib.h\",\n#     therefore missing the function definition.\n#   - The compiler thus generates a \"C\" signature for the test function.\n#   - The linker fails to find the \"C\" function.\n#   - PCRE fails to configure if asked to do so against libbz2.\n#\n# Solution:\n#\n#   - Replace the AC_CHECK_LIB test with a custom test.\n\nfor ac_header in bzlib.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"bzlib.h\" \"ac_cv_header_bzlib_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_bzlib_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_BZLIB_H 1\n_ACEOF\n HAVE_BZLIB_H=1\nfi\n\ndone\n\n# Original test\n# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1])\n#\n# Custom test follows\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for libbz2\" >&5\n$as_echo_n \"checking for libbz2... \" >&6; }\nOLD_LIBS=\"$LIBS\"\nLIBS=\"$LIBS -lbz2\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#ifdef HAVE_BZLIB_H\n#include <bzlib.h>\n#endif\nint\nmain ()\n{\nreturn (int)BZ2_bzopen(\"conftest\", \"rb\");\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; };HAVE_LIBBZ2=1; break;\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=\"$OLD_LIBS\"\n\n# Check for the availabiity of libreadline\n\nif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n for ac_header in readline/readline.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"readline/readline.h\" \"ac_cv_header_readline_readline_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_readline_readline_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_READLINE_READLINE_H 1\n_ACEOF\n HAVE_READLINE_H=1\nfi\n\ndone\n\n for ac_header in readline/history.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"readline/history.h\" \"ac_cv_header_readline_history_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_readline_history_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_READLINE_HISTORY_H 1\n_ACEOF\n HAVE_HISTORY_H=1\nfi\n\ndone\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-lreadline\"\nelse\n  unset ac_cv_lib_readline_readline;\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline -ltinfo $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-ltinfo\"\nelse\n  unset ac_cv_lib_readline_readline;\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline -lcurses $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-lcurses\"\nelse\n  unset ac_cv_lib_readline_readline;\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline -lncurses $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-lncurses\"\nelse\n  unset ac_cv_lib_readline_readline;\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline -lncursesw $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-lncursesw\"\nelse\n  unset ac_cv_lib_readline_readline;\n\t    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline\" >&5\n$as_echo_n \"checking for readline in -lreadline... \" >&6; }\nif ${ac_cv_lib_readline_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lreadline -ltermcap $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_readline_readline=yes\nelse\n  ac_cv_lib_readline_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline\" >&5\n$as_echo \"$ac_cv_lib_readline_readline\" >&6; }\nif test \"x$ac_cv_lib_readline_readline\" = xyes; then :\n  LIBREADLINE=\"-ltermcap\"\nelse\n  LIBREADLINE=\"\"\nfi\n\nfi\n\nfi\n\nfi\n\nfi\n\nfi\n\n\n if test -n \"$LIBREADLINE\"; then\n   if test \"$LIBREADLINE\" != \"-lreadline\"; then\n     echo \"-lreadline needs $LIBREADLINE\"\n     LIBREADLINE=\"-lreadline $LIBREADLINE\"\n   fi\n fi\nfi\n\n\n# Check for the availability of libedit. Different distributions put its\n# headers in different places. Try to cover the most common ones.\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n  for ac_header in editline/readline.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"editline/readline.h\" \"ac_cv_header_editline_readline_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_editline_readline_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_EDITLINE_READLINE_H 1\n_ACEOF\n HAVE_EDITLINE_READLINE_H=1\nelse\n  for ac_header in edit/readline/readline.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"edit/readline/readline.h\" \"ac_cv_header_edit_readline_readline_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_edit_readline_readline_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_EDIT_READLINE_READLINE_H 1\n_ACEOF\n HAVE_READLINE_READLINE_H=1\nelse\n  for ac_header in readline/readline.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"readline/readline.h\" \"ac_cv_header_readline_readline_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_readline_readline_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_READLINE_READLINE_H 1\n_ACEOF\n HAVE_READLINE_READLINE_H=1\nfi\n\ndone\n\nfi\n\ndone\n\nfi\n\ndone\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for readline in -ledit\" >&5\n$as_echo_n \"checking for readline in -ledit... \" >&6; }\nif ${ac_cv_lib_edit_readline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ledit  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar readline ();\nint\nmain ()\n{\nreturn readline ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_edit_readline=yes\nelse\n  ac_cv_lib_edit_readline=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline\" >&5\n$as_echo \"$ac_cv_lib_edit_readline\" >&6; }\nif test \"x$ac_cv_lib_edit_readline\" = xyes; then :\n  LIBEDIT=\"-ledit\"\nfi\n\nfi\n\n# This facilitates -ansi builds under Linux\n\nPCRE_STATIC_CFLAG=\"\"\nif test \"x$enable_shared\" = \"xno\" ; then\n\n$as_echo \"#define PCRE_STATIC 1\" >>confdefs.h\n\n  PCRE_STATIC_CFLAG=\"-DPCRE_STATIC\"\nfi\n\n\n# Here is where pcre specific defines are handled\n\nif test \"$enable_pcre8\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_PCRE8 /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_pcre16\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_PCRE16 /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_pcre32\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_PCRE32 /**/\" >>confdefs.h\n\nfi\n\n# Unless running under Windows, JIT support requires pthreads.\n\nif test \"$enable_jit\" = \"yes\"; then\n  if test \"$HAVE_WINDOWS_H\" != \"1\"; then\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nax_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS\" >&5\n$as_echo_n \"checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... \" >&6; }\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar pthread_join ();\nint\nmain ()\n{\nreturn pthread_join ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok\" >&5\n$as_echo \"$ax_pthread_ok\" >&6; }\n        if test x\"$ax_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nax_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase ${host_os} in\n        solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        ax_pthread_flags=\"-pthreads pthread -mt -pthread $ax_pthread_flags\"\n        ;;\n\n        darwin*)\n        ax_pthread_flags=\"-pthread $ax_pthread_flags\"\n        ;;\nesac\n\nif test x\"$ax_pthread_ok\" = xno; then\nfor flag in $ax_pthread_flags; do\n\n        case $flag in\n                none)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags\" >&5\n$as_echo_n \"checking whether pthreads work without any flags... \" >&6; }\n                ;;\n\n                -*)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag\" >&5\n$as_echo_n \"checking whether pthreads work with $flag... \" >&6; }\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n                pthread-config)\n                # Extract the first word of \"pthread-config\", so it can be a program name with args.\nset dummy pthread-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ax_pthread_config+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ax_pthread_config\"; then\n  ac_cv_prog_ax_pthread_config=\"$ax_pthread_config\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ax_pthread_config=\"yes\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_prog_ax_pthread_config\" && ac_cv_prog_ax_pthread_config=\"no\"\nfi\nfi\nax_pthread_config=$ac_cv_prog_ax_pthread_config\nif test -n \"$ax_pthread_config\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config\" >&5\n$as_echo \"$ax_pthread_config\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n                if test x\"$ax_pthread_config\" = xno; then continue; fi\n                PTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n                PTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n                ;;\n\n                *)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag\" >&5\n$as_echo_n \"checking for the pthreads library -l$flag... \" >&6; }\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\n                        static void routine(void *a) { a = 0; }\n                        static void *start_routine(void *a) { return a; }\nint\nmain ()\n{\npthread_t th; pthread_attr_t attr;\n                        pthread_create(&th, 0, start_routine, 0);\n                        pthread_join(th, 0);\n                        pthread_attr_init(&attr);\n                        pthread_cleanup_push(routine, 0);\n                        pthread_cleanup_pop(0) /* ; */\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok\" >&5\n$as_echo \"$ax_pthread_ok\" >&6; }\n        if test \"x$ax_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$ax_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute\" >&5\n$as_echo_n \"checking for joinable pthread attribute... \" >&6; }\n        attr_name=unknown\n        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n            cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\nint attr = $attr; return attr /* ; */\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  attr_name=$attr; break\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        done\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $attr_name\" >&5\n$as_echo \"$attr_name\" >&6; }\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n\ncat >>confdefs.h <<_ACEOF\n#define PTHREAD_CREATE_JOINABLE $attr_name\n_ACEOF\n\n        fi\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads\" >&5\n$as_echo_n \"checking if more special flags are required for pthreads... \" >&6; }\n        flag=no\n        case ${host_os} in\n            aix* | freebsd* | darwin*) flag=\"-D_THREAD_SAFE\";;\n            osf* | hpux*) flag=\"-D_REENTRANT\";;\n            solaris*)\n            if test \"$GCC\" = \"yes\"; then\n                flag=\"-D_REENTRANT\"\n            else\n                flag=\"-mt -D_REENTRANT\"\n            fi\n            ;;\n        esac\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${flag}\" >&5\n$as_echo \"${flag}\" >&6; }\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT\" >&5\n$as_echo_n \"checking for PTHREAD_PRIO_INHERIT... \" >&6; }\nif ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n                cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n                    #include <pthread.h>\nint\nmain ()\n{\nint i = PTHREAD_PRIO_INHERIT;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_PTHREAD_PRIO_INHERIT=yes\nelse\n  ax_cv_PTHREAD_PRIO_INHERIT=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT\" >&5\n$as_echo \"$ax_cv_PTHREAD_PRIO_INHERIT\" >&6; }\n        if test \"x$ax_cv_PTHREAD_PRIO_INHERIT\" = \"xyes\"; then :\n\n$as_echo \"#define HAVE_PTHREAD_PRIO_INHERIT 1\" >>confdefs.h\n\nfi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        # More AIX lossage: must compile with xlc_r or cc_r\n        if test x\"$GCC\" != xyes; then\n          for ac_prog in xlc_r cc_r\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_PTHREAD_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$PTHREAD_CC\"; then\n  ac_cv_prog_PTHREAD_CC=\"$PTHREAD_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_PTHREAD_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nPTHREAD_CC=$ac_cv_prog_PTHREAD_CC\nif test -n \"$PTHREAD_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC\" >&5\n$as_echo \"$PTHREAD_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$PTHREAD_CC\" && break\ndone\ntest -n \"$PTHREAD_CC\" || PTHREAD_CC=\"${CC}\"\n\n        else\n          PTHREAD_CC=$CC\n        fi\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\n\n\n\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$ax_pthread_ok\" = xyes; then\n\n$as_echo \"#define HAVE_PTHREAD 1\" >>confdefs.h\n\n        :\nelse\n        ax_pthread_ok=no\n        as_fn_error $? \"JIT support requires pthreads\" \"$LINENO\" 5\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n    CC=\"$PTHREAD_CC\"\n    CFLAGS=\"$PTHREAD_CFLAGS $CFLAGS\"\n    LIBS=\"$PTHREAD_LIBS $LIBS\"\n  fi\n\n$as_echo \"#define SUPPORT_JIT /**/\" >>confdefs.h\n\nelse\n  enable_pcregrep_jit=\"no\"\nfi\n\nif test \"$enable_pcregrep_jit\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_PCREGREP_JIT /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_utf\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_UTF /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_unicode_properties\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_UCP /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_stack_for_recursion\" = \"no\"; then\n\n$as_echo \"#define NO_RECURSE /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_pcregrep_libz\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_LIBZ /**/\" >>confdefs.h\n\nfi\n\nif test \"$enable_pcregrep_libbz2\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_LIBBZ2 /**/\" >>confdefs.h\n\nfi\n\nif test $with_pcregrep_bufsize -lt 8192 ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192\" >&5\n$as_echo \"$as_me: WARNING: $with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192\" >&2;}\n  with_pcregrep_bufsize=\"8192\"\nelse\n  if test $? -gt 1 ; then\n  as_fn_error $? \"Bad value for  --with-pcregrep-bufsize\" \"$LINENO\" 5\n  fi\nfi\n\n\ncat >>confdefs.h <<_ACEOF\n#define PCREGREP_BUFSIZE $with_pcregrep_bufsize\n_ACEOF\n\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_LIBEDIT /**/\" >>confdefs.h\n\n  LIBREADLINE=\"$LIBEDIT\"\nelif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n\n$as_echo \"#define SUPPORT_LIBREADLINE /**/\" >>confdefs.h\n\nfi\n\n\ncat >>confdefs.h <<_ACEOF\n#define NEWLINE $ac_pcre_newline_value\n_ACEOF\n\n\nif test \"$enable_bsr_anycrlf\" = \"yes\"; then\n\n$as_echo \"#define BSR_ANYCRLF /**/\" >>confdefs.h\n\nfi\n\n\ncat >>confdefs.h <<_ACEOF\n#define LINK_SIZE $with_link_size\n_ACEOF\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define POSIX_MALLOC_THRESHOLD $with_posix_malloc_threshold\n_ACEOF\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define PARENS_NEST_LIMIT $with_parens_nest_limit\n_ACEOF\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define MATCH_LIMIT $with_match_limit\n_ACEOF\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define MATCH_LIMIT_RECURSION $with_match_limit_recursion\n_ACEOF\n\n\n\n$as_echo \"#define MAX_NAME_SIZE 32\" >>confdefs.h\n\n\n\n$as_echo \"#define MAX_NAME_COUNT 10000\" >>confdefs.h\n\n\n\n\nif test \"$enable_ebcdic\" = \"yes\"; then\n\ncat >>confdefs.h <<_ACEOF\n#define EBCDIC /**/\n_ACEOF\n\nfi\n\nif test \"$enable_ebcdic_nl25\" = \"yes\"; then\n\ncat >>confdefs.h <<_ACEOF\n#define EBCDIC_NL25 /**/\n_ACEOF\n\nfi\n\nif test \"$enable_valgrind\" = \"yes\"; then\n\ncat >>confdefs.h <<_ACEOF\n#define SUPPORT_VALGRIND /**/\n_ACEOF\n\nfi\n\n# Platform specific issues\nNO_UNDEFINED=\nEXPORT_ALL_SYMBOLS=\ncase $host_os in\n  cygwin* | mingw* )\n    if test X\"$enable_shared\" = Xyes; then\n      NO_UNDEFINED=\"-no-undefined\"\n      EXPORT_ALL_SYMBOLS=\"-Wl,--export-all-symbols\"\n    fi\n    ;;\nesac\n\n# The extra LDFLAGS for each particular library\n# (Note: The libpcre*_version bits are m4 variables, assigned above)\n\nEXTRA_LIBPCRE_LDFLAGS=\"$EXTRA_LIBPCRE_LDFLAGS \\\n                       $NO_UNDEFINED -version-info 3:11:2\"\n\nEXTRA_LIBPCRE16_LDFLAGS=\"$EXTRA_LIBPCRE16_LDFLAGS \\\n                       $NO_UNDEFINED -version-info 2:11:2\"\n\nEXTRA_LIBPCRE32_LDFLAGS=\"$EXTRA_LIBPCRE32_LDFLAGS \\\n                       $NO_UNDEFINED -version-info 0:11:0\"\n\nEXTRA_LIBPCREPOSIX_LDFLAGS=\"$EXTRA_LIBPCREPOSIX_LDFLAGS \\\n                            $NO_UNDEFINED -version-info 0:6:0\"\n\nEXTRA_LIBPCRECPP_LDFLAGS=\"$EXTRA_LIBPCRECPP_LDFLAGS \\\n                          $NO_UNDEFINED -version-info 0:1:0 \\\n                          $EXPORT_ALL_SYMBOLS\"\n\n\n\n\n\n\n\n# When we run 'make distcheck', use these arguments. Turning off compiler\n# optimization makes it run faster.\nDISTCHECK_CONFIGURE_FLAGS=\"CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties\"\n\n\n# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is\n# specified, the relevant library is available.\n\nif test \"$enable_pcregrep_libz\" = \"yes\"; then\n  if test \"$HAVE_ZLIB_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libz because zlib.h was not found\"\n    exit 1\n  fi\n  if test \"$HAVE_LIBZ\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libz because libz was not found\"\n    exit 1\n  fi\n  LIBZ=\"-lz\"\nfi\n\n\nif test \"$enable_pcregrep_libbz2\" = \"yes\"; then\n  if test \"$HAVE_BZLIB_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found\"\n    exit 1\n  fi\n  if test \"$HAVE_LIBBZ2\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libbz2 because libbz2 was not found\"\n    exit 1\n  fi\n  LIBBZ2=\"-lbz2\"\nfi\n\n\n# Similarly for --enable-pcretest-readline\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n  if test \"$enable_pcretest_libreadline\" = \"yes\"; then\n    echo \"** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline\"\n    exit 1\n  fi\n  if test \"$HAVE_EDITLINE_READLINE_H\" != \"1\" -a \\\n          \"$HAVE_READLINE_READLINE_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-libedit because neither editline/readline.h\"\n    echo \"** nor readline/readline.h was found.\"\n    exit 1\n  fi\n  if test -z \"$LIBEDIT\"; then\n    echo \"** Cannot --enable-pcretest-libedit because libedit library was not found.\"\n    exit 1\n  fi\nfi\n\nif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n  if test \"$HAVE_READLINE_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline/readline.h was not found.\"\n    exit 1\n  fi\n  if test \"$HAVE_HISTORY_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline/history.h was not found.\"\n    exit 1\n  fi\n  if test -z \"$LIBREADLINE\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline library was not found.\"\n    exit 1\n  fi\nfi\n\n# Handle valgrind support\n\nif test \"$enable_valgrind\" = \"yes\"; then\n\n\n\n\n\n\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}pkg-config\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_PKG_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $PKG_CONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_PKG_CONFIG=\"$PKG_CONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_PKG_CONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nPKG_CONFIG=$ac_cv_path_PKG_CONFIG\nif test -n \"$PKG_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG\" >&5\n$as_echo \"$PKG_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_path_PKG_CONFIG\"; then\n  ac_pt_PKG_CONFIG=$PKG_CONFIG\n  # Extract the first word of \"pkg-config\", so it can be a program name with args.\nset dummy pkg-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $ac_pt_PKG_CONFIG in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_ac_pt_PKG_CONFIG=\"$ac_pt_PKG_CONFIG\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_ac_pt_PKG_CONFIG=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG\nif test -n \"$ac_pt_PKG_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG\" >&5\n$as_echo \"$ac_pt_PKG_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_pt_PKG_CONFIG\" = x; then\n    PKG_CONFIG=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    PKG_CONFIG=$ac_pt_PKG_CONFIG\n  fi\nelse\n  PKG_CONFIG=\"$ac_cv_path_PKG_CONFIG\"\nfi\n\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=0.9.0\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version\" >&5\n$as_echo_n \"checking pkg-config is at least version $_pkg_min_version... \" >&6; }\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\telse\n\t\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi\n\npkg_failed=no\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for VALGRIND\" >&5\n$as_echo_n \"checking for VALGRIND... \" >&6; }\n\nif test -n \"$VALGRIND_CFLAGS\"; then\n    pkg_cv_VALGRIND_CFLAGS=\"$VALGRIND_CFLAGS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"valgrind\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"valgrind\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags \"valgrind\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\nif test -n \"$VALGRIND_LIBS\"; then\n    pkg_cv_VALGRIND_LIBS=\"$VALGRIND_LIBS\"\n elif test -n \"$PKG_CONFIG\"; then\n    if test -n \"$PKG_CONFIG\" && \\\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: \\$PKG_CONFIG --exists --print-errors \\\"valgrind\\\"\"; } >&5\n  ($PKG_CONFIG --exists --print-errors \"valgrind\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs \"valgrind\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes\nelse\n  pkg_failed=yes\nfi\n else\n    pkg_failed=untried\nfi\n\n\n\nif test $pkg_failed = yes; then\n   \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi\n        if test $_pkg_short_errors_supported = yes; then\n\t        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"valgrind\" 2>&1`\n        else\n\t        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"valgrind\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$VALGRIND_PKG_ERRORS\" >&5\n\n\tas_fn_error $? \"Package requirements (valgrind) were not met:\n\n$VALGRIND_PKG_ERRORS\n\nConsider adjusting the PKG_CONFIG_PATH environment variable if you\ninstalled software in a non-standard prefix.\n\nAlternatively, you may set the environment variables VALGRIND_CFLAGS\nand VALGRIND_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.\" \"$LINENO\" 5\nelif test $pkg_failed = untried; then\n     \t{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"The pkg-config script could not be found or is too old.  Make sure it\nis in your PATH or set the PKG_CONFIG environment variable to the full\npath to pkg-config.\n\nAlternatively, you may set the environment variables VALGRIND_CFLAGS\nand VALGRIND_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.\n\nTo get pkg-config, see <http://pkg-config.freedesktop.org/>.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n\tVALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS\n\tVALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\nfi\nfi\n\n# Handle code coverage reporting support\nif test \"$enable_coverage\" = \"yes\"; then\n  if test \"x$GCC\" != \"xyes\"; then\n    as_fn_error $? \"Code coverage reports can only be generated when using GCC\" \"$LINENO\" 5\n  fi\n\n  # ccache is incompatible with gcov\n  # Extract the first word of \"shtool\", so it can be a program name with args.\nset dummy shtool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_SHTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $SHTOOL in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_SHTOOL=\"$SHTOOL\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_SHTOOL=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_SHTOOL\" && ac_cv_path_SHTOOL=\"false\"\n  ;;\nesac\nfi\nSHTOOL=$ac_cv_path_SHTOOL\nif test -n \"$SHTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $SHTOOL\" >&5\n$as_echo \"$SHTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  case `$SHTOOL path $CC` in\n    *ccache*) cc_ccache=yes;;\n    *) cc_ccache=no;;\n  esac\n\n  if test \"$cc_ccache\" = \"yes\"; then\n    if test -z \"$CCACHE_DISABLE\" -o \"$CCACHE_DISABLE\" != \"1\"; then\n      as_fn_error $? \"must export CCACHE_DISABLE=1 to disable ccache for code coverage\" \"$LINENO\" 5\n    fi\n  fi\n\n\n  # Extract the first word of \"lcov\", so it can be a program name with args.\nset dummy lcov; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_LCOV+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $LCOV in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_LCOV=\"$LCOV\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_LCOV=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_LCOV\" && ac_cv_path_LCOV=\"false\"\n  ;;\nesac\nfi\nLCOV=$ac_cv_path_LCOV\nif test -n \"$LCOV\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LCOV\" >&5\n$as_echo \"$LCOV\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  if test \"x$LCOV\" = \"xfalse\"; then\n    as_fn_error $? \"lcov not found\" \"$LINENO\" 5\n  fi\n\n\n  # Extract the first word of \"genhtml\", so it can be a program name with args.\nset dummy genhtml; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_GENHTML+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $GENHTML in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_GENHTML=\"$GENHTML\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_GENHTML=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_GENHTML\" && ac_cv_path_GENHTML=\"false\"\n  ;;\nesac\nfi\nGENHTML=$ac_cv_path_GENHTML\nif test -n \"$GENHTML\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GENHTML\" >&5\n$as_echo \"$GENHTML\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  if test \"x$GENHTML\" = \"xfalse\"; then\n    as_fn_error $? \"genhtml not found\" \"$LINENO\" 5\n  fi\n\n  # Set flags needed for gcov\n  GCOV_CFLAGS=\"-O0 -ggdb3 -fprofile-arcs -ftest-coverage\"\n  GCOV_CXXFLAGS=\"-O0 -ggdb3 -fprofile-arcs -ftest-coverage\"\n  GCOV_LIBS=\"-lgcov\"\n\n\n\nfi # enable_coverage\n\n if test \"x$enable_coverage\" = \"xyes\"; then\n  WITH_GCOV_TRUE=\n  WITH_GCOV_FALSE='#'\nelse\n  WITH_GCOV_TRUE='#'\n  WITH_GCOV_FALSE=\nfi\n\n\n# Produce these files, in addition to config.h.\nac_config_files=\"$ac_config_files Makefile libpcre.pc libpcre16.pc libpcre32.pc libpcreposix.pc libpcrecpp.pc pcre-config pcre.h pcre_stringpiece.h pcrecpparg.h\"\n\n\n# Make the generated script files executable.\nac_config_commands=\"$ac_config_commands script-chmod\"\n\n\n# Make sure that pcre_chartables.c is removed in case the method for\n# creating it was changed by reconfiguration.\nac_config_commands=\"$ac_config_commands delete-old-chartables\"\n\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure\" >&5\n$as_echo_n \"checking that generated files are newer than configure... \" >&6; }\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: done\" >&5\n$as_echo \"done\" >&6; }\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_PCRE8_TRUE}\" && test -z \"${WITH_PCRE8_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_PCRE8\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_PCRE16_TRUE}\" && test -z \"${WITH_PCRE16_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_PCRE16\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_PCRE32_TRUE}\" && test -z \"${WITH_PCRE32_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_PCRE32\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_PCRE_CPP_TRUE}\" && test -z \"${WITH_PCRE_CPP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_PCRE_CPP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_REBUILD_CHARTABLES_TRUE}\" && test -z \"${WITH_REBUILD_CHARTABLES_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_REBUILD_CHARTABLES\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_JIT_TRUE}\" && test -z \"${WITH_JIT_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_JIT\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_UTF_TRUE}\" && test -z \"${WITH_UTF_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_UTF\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_VALGRIND_TRUE}\" && test -z \"${WITH_VALGRIND_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_VALGRIND\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${WITH_GCOV_TRUE}\" && test -z \"${WITH_GCOV_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"WITH_GCOV\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by PCRE $as_me 8.43, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nPCRE config.status 8.43\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" MAKE=\"${MAKE-make}\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nAS='`$ECHO \"$AS\" | $SED \"$delay_single_quote_subst\"`'\nDLLTOOL='`$ECHO \"$DLLTOOL\" | $SED \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"$OBJDUMP\" | $SED \"$delay_single_quote_subst\"`'\nmacro_version='`$ECHO \"$macro_version\" | $SED \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"$macro_revision\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"$enable_shared\" | $SED \"$delay_single_quote_subst\"`'\nenable_static='`$ECHO \"$enable_static\" | $SED \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"$pic_mode\" | $SED \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"$enable_fast_install\" | $SED \"$delay_single_quote_subst\"`'\nshared_archive_member_spec='`$ECHO \"$shared_archive_member_spec\" | $SED \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"$SHELL\" | $SED \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"$ECHO\" | $SED \"$delay_single_quote_subst\"`'\nPATH_SEPARATOR='`$ECHO \"$PATH_SEPARATOR\" | $SED \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"$host_alias\" | $SED \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"$host\" | $SED \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"$host_os\" | $SED \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"$build_alias\" | $SED \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"$build\" | $SED \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"$build_os\" | $SED \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"$SED\" | $SED \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"$Xsed\" | $SED \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"$GREP\" | $SED \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"$EGREP\" | $SED \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"$FGREP\" | $SED \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"$LD\" | $SED \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"$NM\" | $SED \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"$LN_S\" | $SED \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"$max_cmd_len\" | $SED \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"$ac_objext\" | $SED \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"$exeext\" | $SED \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"$lt_unset\" | $SED \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"$lt_SP2NL\" | $SED \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"$lt_NL2SP\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_host_file_cmd='`$ECHO \"$lt_cv_to_host_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_tool_file_cmd='`$ECHO \"$lt_cv_to_tool_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"$reload_flag\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"$reload_cmds\" | $SED \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"$deplibs_check_method\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"$file_magic_cmd\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_glob='`$ECHO \"$file_magic_glob\" | $SED \"$delay_single_quote_subst\"`'\nwant_nocaseglob='`$ECHO \"$want_nocaseglob\" | $SED \"$delay_single_quote_subst\"`'\nsharedlib_from_linklib_cmd='`$ECHO \"$sharedlib_from_linklib_cmd\" | $SED \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"$AR\" | $SED \"$delay_single_quote_subst\"`'\nlt_ar_flags='`$ECHO \"$lt_ar_flags\" | $SED \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"$AR_FLAGS\" | $SED \"$delay_single_quote_subst\"`'\narchiver_list_spec='`$ECHO \"$archiver_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"$STRIP\" | $SED \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"$RANLIB\" | $SED \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"$old_postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"$old_postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"$old_archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\nlock_old_archive_extraction='`$ECHO \"$lock_old_archive_extraction\" | $SED \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"$CC\" | $SED \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"$CFLAGS\" | $SED \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"$compiler\" | $SED \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"$GCC\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"$lt_cv_sys_global_symbol_pipe\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"$lt_cv_sys_global_symbol_to_cdecl\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_import='`$ECHO \"$lt_cv_sys_global_symbol_to_import\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_nm_interface='`$ECHO \"$lt_cv_nm_interface\" | $SED \"$delay_single_quote_subst\"`'\nnm_file_list_spec='`$ECHO \"$nm_file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nlt_sysroot='`$ECHO \"$lt_sysroot\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_truncate_bin='`$ECHO \"$lt_cv_truncate_bin\" | $SED \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"$objdir\" | $SED \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"$MAGIC_CMD\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"$lt_prog_compiler_no_builtin_flag\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"$lt_prog_compiler_pic\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"$lt_prog_compiler_wl\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"$lt_prog_compiler_static\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"$lt_cv_prog_compiler_c_o\" | $SED \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"$need_locks\" | $SED \"$delay_single_quote_subst\"`'\nMANIFEST_TOOL='`$ECHO \"$MANIFEST_TOOL\" | $SED \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"$DSYMUTIL\" | $SED \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"$NMEDIT\" | $SED \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"$LIPO\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"$OTOOL\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"$OTOOL64\" | $SED \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"$libext\" | $SED \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"$shrext_cmds\" | $SED \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"$extract_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"$archive_cmds_need_lc\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"$enable_shared_with_static_runtimes\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"$export_dynamic_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"$whole_archive_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"$compiler_needs_object\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"$old_archive_from_new_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"$old_archive_from_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"$archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"$archive_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"$module_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"$module_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"$with_gnu_ld\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"$allow_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"$no_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"$hardcode_libdir_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"$hardcode_libdir_separator\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"$hardcode_direct\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"$hardcode_direct_absolute\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"$hardcode_minus_L\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"$hardcode_shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"$hardcode_automatic\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"$inherit_rpath\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"$link_all_deplibs\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"$always_export_symbols\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"$export_symbols_cmds\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"$exclude_expsyms\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"$include_expsyms\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"$prelink_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds='`$ECHO \"$postlink_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"$file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"$variables_saved_for_relink\" | $SED \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"$need_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"$need_version\" | $SED \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"$version_type\" | $SED \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"$runpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"$shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"$shlibpath_overrides_runpath\" | $SED \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"$libname_spec\" | $SED \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"$library_names_spec\" | $SED \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"$soname_spec\" | $SED \"$delay_single_quote_subst\"`'\ninstall_override_mode='`$ECHO \"$install_override_mode\" | $SED \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"$postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"$postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"$finish_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"$finish_eval\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"$hardcode_into_libs\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"$sys_lib_search_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nconfigure_time_dlsearch_path='`$ECHO \"$configure_time_dlsearch_path\" | $SED \"$delay_single_quote_subst\"`'\nconfigure_time_lt_sys_library_path='`$ECHO \"$configure_time_lt_sys_library_path\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"$hardcode_action\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"$enable_dlopen\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"$enable_dlopen_self\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"$enable_dlopen_self_static\" | $SED \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"$old_striplib\" | $SED \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"$striplib\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs='`$ECHO \"$compiler_lib_search_dirs\" | $SED \"$delay_single_quote_subst\"`'\npredep_objects='`$ECHO \"$predep_objects\" | $SED \"$delay_single_quote_subst\"`'\npostdep_objects='`$ECHO \"$postdep_objects\" | $SED \"$delay_single_quote_subst\"`'\npredeps='`$ECHO \"$predeps\" | $SED \"$delay_single_quote_subst\"`'\npostdeps='`$ECHO \"$postdeps\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path='`$ECHO \"$compiler_lib_search_path\" | $SED \"$delay_single_quote_subst\"`'\nLD_CXX='`$ECHO \"$LD_CXX\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag_CXX='`$ECHO \"$reload_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds_CXX='`$ECHO \"$reload_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds_CXX='`$ECHO \"$old_archive_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_CXX='`$ECHO \"$compiler_CXX\" | $SED \"$delay_single_quote_subst\"`'\nGCC_CXX='`$ECHO \"$GCC_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag_CXX='`$ECHO \"$lt_prog_compiler_no_builtin_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic_CXX='`$ECHO \"$lt_prog_compiler_pic_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl_CXX='`$ECHO \"$lt_prog_compiler_wl_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static_CXX='`$ECHO \"$lt_prog_compiler_static_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o_CXX='`$ECHO \"$lt_cv_prog_compiler_c_o_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc_CXX='`$ECHO \"$archive_cmds_need_lc_CXX\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes_CXX='`$ECHO \"$enable_shared_with_static_runtimes_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec_CXX='`$ECHO \"$export_dynamic_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec_CXX='`$ECHO \"$whole_archive_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object_CXX='`$ECHO \"$compiler_needs_object_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds_CXX='`$ECHO \"$old_archive_from_new_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds_CXX='`$ECHO \"$old_archive_from_expsyms_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_CXX='`$ECHO \"$archive_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds_CXX='`$ECHO \"$archive_expsym_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds_CXX='`$ECHO \"$module_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds_CXX='`$ECHO \"$module_expsym_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld_CXX='`$ECHO \"$with_gnu_ld_CXX\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag_CXX='`$ECHO \"$allow_undefined_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag_CXX='`$ECHO \"$no_undefined_flag_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_CXX='`$ECHO \"$hardcode_libdir_flag_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator_CXX='`$ECHO \"$hardcode_libdir_separator_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_CXX='`$ECHO \"$hardcode_direct_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute_CXX='`$ECHO \"$hardcode_direct_absolute_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L_CXX='`$ECHO \"$hardcode_minus_L_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var_CXX='`$ECHO \"$hardcode_shlibpath_var_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic_CXX='`$ECHO \"$hardcode_automatic_CXX\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath_CXX='`$ECHO \"$inherit_rpath_CXX\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs_CXX='`$ECHO \"$link_all_deplibs_CXX\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols_CXX='`$ECHO \"$always_export_symbols_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds_CXX='`$ECHO \"$export_symbols_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms_CXX='`$ECHO \"$exclude_expsyms_CXX\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms_CXX='`$ECHO \"$include_expsyms_CXX\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds_CXX='`$ECHO \"$prelink_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds_CXX='`$ECHO \"$postlink_cmds_CXX\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec_CXX='`$ECHO \"$file_list_spec_CXX\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action_CXX='`$ECHO \"$hardcode_action_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs_CXX='`$ECHO \"$compiler_lib_search_dirs_CXX\" | $SED \"$delay_single_quote_subst\"`'\npredep_objects_CXX='`$ECHO \"$predep_objects_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostdep_objects_CXX='`$ECHO \"$postdep_objects_CXX\" | $SED \"$delay_single_quote_subst\"`'\npredeps_CXX='`$ECHO \"$predeps_CXX\" | $SED \"$delay_single_quote_subst\"`'\npostdeps_CXX='`$ECHO \"$postdeps_CXX\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path_CXX='`$ECHO \"$compiler_lib_search_path_CXX\" | $SED \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in AS \\\nDLLTOOL \\\nOBJDUMP \\\nSHELL \\\nECHO \\\nPATH_SEPARATOR \\\nSED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nfile_magic_glob \\\nwant_nocaseglob \\\nsharedlib_from_linklib_cmd \\\nAR \\\narchiver_list_spec \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_import \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nlt_cv_nm_interface \\\nnm_file_list_spec \\\nlt_cv_truncate_bin \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nMANIFEST_TOOL \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_separator \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\ninstall_override_mode \\\nfinish_eval \\\nold_striplib \\\nstriplib \\\ncompiler_lib_search_dirs \\\npredep_objects \\\npostdep_objects \\\npredeps \\\npostdeps \\\ncompiler_lib_search_path \\\nLD_CXX \\\nreload_flag_CXX \\\ncompiler_CXX \\\nlt_prog_compiler_no_builtin_flag_CXX \\\nlt_prog_compiler_pic_CXX \\\nlt_prog_compiler_wl_CXX \\\nlt_prog_compiler_static_CXX \\\nlt_cv_prog_compiler_c_o_CXX \\\nexport_dynamic_flag_spec_CXX \\\nwhole_archive_flag_spec_CXX \\\ncompiler_needs_object_CXX \\\nwith_gnu_ld_CXX \\\nallow_undefined_flag_CXX \\\nno_undefined_flag_CXX \\\nhardcode_libdir_flag_spec_CXX \\\nhardcode_libdir_separator_CXX \\\nexclude_expsyms_CXX \\\ninclude_expsyms_CXX \\\nfile_list_spec_CXX \\\ncompiler_lib_search_dirs_CXX \\\npredep_objects_CXX \\\npostdep_objects_CXX \\\npredeps_CXX \\\npostdeps_CXX \\\ncompiler_lib_search_path_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\" ## exclude from sc_prohibit_nested_quotes\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostlink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nconfigure_time_dlsearch_path \\\nconfigure_time_lt_sys_library_path \\\nreload_cmds_CXX \\\nold_archive_cmds_CXX \\\nold_archive_from_new_cmds_CXX \\\nold_archive_from_expsyms_cmds_CXX \\\narchive_cmds_CXX \\\narchive_expsym_cmds_CXX \\\nmodule_cmds_CXX \\\nmodule_expsym_cmds_CXX \\\nexport_symbols_cmds_CXX \\\nprelink_cmds_CXX \\\npostlink_cmds_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\" ## exclude from sc_prohibit_nested_quotes\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\nac_aux_dir='$ac_aux_dir'\n\n# See if we are running on zsh, and set the options that allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\"; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"libpcre.pc\") CONFIG_FILES=\"$CONFIG_FILES libpcre.pc\" ;;\n    \"libpcre16.pc\") CONFIG_FILES=\"$CONFIG_FILES libpcre16.pc\" ;;\n    \"libpcre32.pc\") CONFIG_FILES=\"$CONFIG_FILES libpcre32.pc\" ;;\n    \"libpcreposix.pc\") CONFIG_FILES=\"$CONFIG_FILES libpcreposix.pc\" ;;\n    \"libpcrecpp.pc\") CONFIG_FILES=\"$CONFIG_FILES libpcrecpp.pc\" ;;\n    \"pcre-config\") CONFIG_FILES=\"$CONFIG_FILES pcre-config\" ;;\n    \"pcre.h\") CONFIG_FILES=\"$CONFIG_FILES pcre.h\" ;;\n    \"pcre_stringpiece.h\") CONFIG_FILES=\"$CONFIG_FILES pcre_stringpiece.h\" ;;\n    \"pcrecpparg.h\") CONFIG_FILES=\"$CONFIG_FILES pcrecpparg.h\" ;;\n    \"script-chmod\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS script-chmod\" ;;\n    \"delete-old-chartables\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS delete-old-chartables\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  # TODO: see whether this extra hack can be removed once we start\n  # requiring Autoconf 2.70 or later.\n  case $CONFIG_FILES in #(\n  *\\'*) :\n    eval set x \"$CONFIG_FILES\" ;; #(\n  *) :\n    set x $CONFIG_FILES ;; #(\n  *) :\n     ;;\nesac\n  shift\n  # Used to flag and report bootstrapping failures.\n  am_rc=0\n  for am_mf\n  do\n    # Strip MF so we end up with the name of the file.\n    am_mf=`$as_echo \"$am_mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile which includes\n    # dependency-tracking related rules and includes.\n    # Grep'ing the whole file directly is not great: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    sed -n 's,^am--depfiles:.*,X,p' \"$am_mf\" | grep X >/dev/null 2>&1 \\\n      || continue\n    am_dirpart=`$as_dirname -- \"$am_mf\" ||\n$as_expr X\"$am_mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$am_mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$am_mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$am_mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$am_mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    am_filepart=`$as_basename -- \"$am_mf\" ||\n$as_expr X/\"$am_mf\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$am_mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$am_mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$am_mf\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    { echo \"$as_me:$LINENO: cd \"$am_dirpart\" \\\n      && sed -e '/# am--include-marker/d' \"$am_filepart\" \\\n        | $MAKE -f - am--depfiles\" >&5\n   (cd \"$am_dirpart\" \\\n      && sed -e '/# am--include-marker/d' \"$am_filepart\" \\\n        | $MAKE -f - am--depfiles) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } || am_rc=$?\n  done\n  if test $am_rc -ne 0; then\n    { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"Something went wrong bootstrapping makefile fragments\n    for automatic dependency tracking.  Try re-running configure with the\n    '--disable-dependency-tracking' option to at least be able to build\n    the package (albeit without support for automatic dependency tracking).\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\n  { am_dirpart=; unset am_dirpart;}\n  { am_filepart=; unset am_filepart;}\n  { am_mf=; unset am_mf;}\n  { am_rc=; unset am_rc;}\n  rm -f conftest-deps.mk\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options that allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\"; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=${ofile}T\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n# Generated automatically by $as_me ($PACKAGE) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n\n# Provide generalized library-building support services.\n# Written by Gordon Matzigkeit, 1996\n\n# Copyright (C) 2014 Free Software Foundation, Inc.\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\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program or library that is built\n# using GNU Libtool, you may include this file under the  same\n# distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags='CXX '\n\n# Configured defaults for sys_lib_dlsearch_path munging.\n: \\${LT_SYS_LIBRARY_PATH=\"$configure_time_lt_sys_library_path\"}\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Assembler program.\nAS=$lt_AS\n\n# DLL creation program.\nDLLTOOL=$lt_DLLTOOL\n\n# Object dumper program.\nOBJDUMP=$lt_OBJDUMP\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# Shared archive member basename,for filename based shared library versioning on AIX.\nshared_archive_member_spec=$shared_archive_member_spec\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that protects backslashes.\nECHO=$lt_ECHO\n\n# The PATH separator for the build system.\nPATH_SEPARATOR=$lt_PATH_SEPARATOR\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# convert \\$build file names to \\$host format.\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n\n# convert \\$build files to toolchain format.\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method = \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# How to find potential files when deplibs_check_method = \"file_magic\".\nfile_magic_glob=$lt_file_magic_glob\n\n# Find potential files using nocaseglob when deplibs_check_method = \"file_magic\".\nwant_nocaseglob=$lt_want_nocaseglob\n\n# Command to associate shared and link libraries.\nsharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd\n\n# The archiver.\nAR=$lt_AR\n\n# Flags to create an archive (by configure).\nlt_ar_flags=$lt_ar_flags\n\n# Flags to create an archive.\nAR_FLAGS=\\${ARFLAGS-\"\\$lt_ar_flags\"}\n\n# How to feed a file listing to the archiver.\narchiver_list_spec=$lt_archiver_list_spec\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Whether to use a lock for old archive extraction.\nlock_old_archive_extraction=$lock_old_archive_extraction\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm into a list of symbols to manually relocate.\nglobal_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# The name lister interface.\nnm_interface=$lt_lt_cv_nm_interface\n\n# Specify filename containing input files for \\$NM.\nnm_file_list_spec=$lt_nm_file_list_spec\n\n# The root where to search for dependent libraries,and where our libraries should be installed.\nlt_sysroot=$lt_sysroot\n\n# Command to truncate a binary pipe.\nlt_truncate_bin=$lt_lt_cv_truncate_bin\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Manifest tool.\nMANIFEST_TOOL=$lt_MANIFEST_TOOL\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Permission mode override for installation of shared libraries.\ninstall_override_mode=$lt_install_override_mode\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Detected run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path\n\n# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.\nconfigure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\$shared_ext during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\$shared_ext during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\$shlibpath_var if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects\npostdep_objects=$lt_postdep_objects\npredeps=$lt_predeps\npostdeps=$lt_postdeps\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n    cat <<'_LT_EOF' >> \"$cfgfile\"\n\n# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE\n\n# func_munge_path_list VARIABLE PATH\n# -----------------------------------\n# VARIABLE is name of variable containing _space_ separated list of\n# directories to be munged by the contents of PATH, which is string\n# having a format:\n# \"DIR[:DIR]:\"\n#       string \"DIR[ DIR]\" will be prepended to VARIABLE\n# \":DIR[:DIR]\"\n#       string \"DIR[ DIR]\" will be appended to VARIABLE\n# \"DIRP[:DIRP]::[DIRA:]DIRA\"\n#       string \"DIRP[ DIRP]\" will be prepended to VARIABLE and string\n#       \"DIRA[ DIRA]\" will be appended to VARIABLE\n# \"DIR[:DIR]\"\n#       VARIABLE will be replaced by \"DIR[ DIR]\"\nfunc_munge_path_list ()\n{\n    case x$2 in\n    x)\n        ;;\n    *:)\n        eval $1=\\\"`$ECHO $2 | $SED 's/:/ /g'` \\$$1\\\"\n        ;;\n    x:*)\n        eval $1=\\\"\\$$1 `$ECHO $2 | $SED 's/:/ /g'`\\\"\n        ;;\n    *::*)\n        eval $1=\\\"\\$$1\\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\\\"\n        eval $1=\\\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\\ \\$$1\\\"\n        ;;\n    *)\n        eval $1=\\\"`$ECHO $2 | $SED 's/:/ /g'`\\\"\n        ;;\n    esac\n}\n\n\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nfunc_cc_basename ()\n{\n    for cc_temp in $*\"\"; do\n      case $cc_temp in\n        compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n        distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n        \\-*) ;;\n        *) break;;\n      esac\n    done\n    func_cc_basename_result=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n}\n\n\n# ### END FUNCTIONS SHARED WITH CONFIGURE\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test set != \"${COLLECT_NAMES+set}\"; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=$ac_aux_dir/ltmain.sh\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n\n    cat <<_LT_EOF >> \"$ofile\"\n\n# ### BEGIN LIBTOOL TAG CONFIG: CXX\n\n# The linker used to build libraries.\nLD=$lt_LD_CXX\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag_CXX\nreload_cmds=$lt_reload_cmds_CXX\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds_CXX\n\n# A language specific compiler.\nCC=$lt_compiler_CXX\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC_CXX\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic_CXX\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl_CXX\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static_CXX\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc_CXX\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object_CXX\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds_CXX\narchive_expsym_cmds=$lt_archive_expsym_cmds_CXX\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds_CXX\nmodule_expsym_cmds=$lt_module_expsym_cmds_CXX\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld_CXX\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag_CXX\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag_CXX\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\$shared_ext during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\$shared_ext during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\$shlibpath_var if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute_CXX\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L_CXX\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var_CXX\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic_CXX\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath_CXX\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs_CXX\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols_CXX\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds_CXX\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms_CXX\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms_CXX\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds_CXX\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds_CXX\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec_CXX\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action_CXX\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects_CXX\npostdep_objects=$lt_postdep_objects_CXX\npredeps=$lt_predeps_CXX\npostdeps=$lt_postdeps_CXX\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path_CXX\n\n# ### END LIBTOOL TAG CONFIG: CXX\n_LT_EOF\n\n ;;\n    \"script-chmod\":C) chmod a+x pcre-config ;;\n    \"delete-old-chartables\":C) rm -f pcre_chartables.c ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n\n# Print out a nice little message after configure is run displaying the\n# chosen options.\n\nebcdic_nl_code=n/a\nif test \"$enable_ebcdic_nl25\" = \"yes\"; then\n  ebcdic_nl_code=0x25\nelif test \"$enable_ebcdic\" = \"yes\"; then\n  ebcdic_nl_code=0x15\nfi\n\ncat <<EOF\n\n$PACKAGE-$VERSION configuration summary:\n\n    Install prefix .................. : ${prefix}\n    C preprocessor .................. : ${CPP}\n    C compiler ...................... : ${CC}\n    C++ preprocessor ................ : ${CXXCPP}\n    C++ compiler .................... : ${CXX}\n    Linker .......................... : ${LD}\n    C preprocessor flags ............ : ${CPPFLAGS}\n    C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS}\n    C++ compiler flags .............. : ${CXXFLAGS} ${VISIBILITY_CXXFLAGS}\n    Linker flags .................... : ${LDFLAGS}\n    Extra libraries ................. : ${LIBS}\n\n    Build 8 bit pcre library ........ : ${enable_pcre8}\n    Build 16 bit pcre library ....... : ${enable_pcre16}\n    Build 32 bit pcre library ....... : ${enable_pcre32}\n    Build C++ library ............... : ${enable_cpp}\n    Enable JIT compiling support .... : ${enable_jit}\n    Enable UTF-8/16/32 support ...... : ${enable_utf}\n    Unicode properties .............. : ${enable_unicode_properties}\n    Newline char/sequence ........... : ${enable_newline}\n    \\R matches only ANYCRLF ......... : ${enable_bsr_anycrlf}\n    EBCDIC coding ................... : ${enable_ebcdic}\n    EBCDIC code for NL .............. : ${ebcdic_nl_code}\n    Rebuild char tables ............. : ${enable_rebuild_chartables}\n    Use stack recursion ............. : ${enable_stack_for_recursion}\n    POSIX mem threshold ............. : ${with_posix_malloc_threshold}\n    Internal link size .............. : ${with_link_size}\n    Nested parentheses limit ........ : ${with_parens_nest_limit}\n    Match limit ..................... : ${with_match_limit}\n    Match limit recursion ........... : ${with_match_limit_recursion}\n    Build shared libs ............... : ${enable_shared}\n    Build static libs ............... : ${enable_static}\n    Use JIT in pcregrep ............. : ${enable_pcregrep_jit}\n    Buffer size for pcregrep ........ : ${with_pcregrep_bufsize}\n    Link pcregrep with libz ......... : ${enable_pcregrep_libz}\n    Link pcregrep with libbz2 ....... : ${enable_pcregrep_libbz2}\n    Link pcretest with libedit ...... : ${enable_pcretest_libedit}\n    Link pcretest with libreadline .. : ${enable_pcretest_libreadline}\n    Valgrind support ................ : ${enable_valgrind}\n    Code coverage ................... : ${enable_coverage}\n\nEOF\n\n"
  },
  {
    "path": "src/pcre/configure.ac",
    "content": "dnl Process this file with autoconf to produce a configure script.\n\ndnl NOTE FOR MAINTAINERS: Do not use minor version numbers 08 or 09 because\ndnl the leading zeros may cause them to be treated as invalid octal constants\ndnl if a PCRE user writes code that uses PCRE_MINOR as a number. There is now\ndnl a check further down that throws an error if 08 or 09 are used.\n\ndnl The PCRE_PRERELEASE feature is for identifying release candidates. It might\ndnl be defined as -RC2, for example. For real releases, it should be empty.\n\nm4_define(pcre_major, [8])\nm4_define(pcre_minor, [43])\nm4_define(pcre_prerelease, [])\nm4_define(pcre_date, [2019-02-23])\n\n# NOTE: The CMakeLists.txt file searches for the above variables in the first\n# 50 lines of this file. Please update that if the variables above are moved.\n\n# Libtool shared library interface versions (current:revision:age)\nm4_define(libpcre_version, [3:11:2])\nm4_define(libpcre16_version, [2:11:2])\nm4_define(libpcre32_version, [0:11:0])\nm4_define(libpcreposix_version, [0:6:0])\nm4_define(libpcrecpp_version, [0:1:0])\n\nAC_PREREQ(2.57)\nAC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre)\nAC_CONFIG_SRCDIR([pcre.h.in])\nAM_INIT_AUTOMAKE([dist-bzip2 dist-zip])\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\nAC_CONFIG_HEADERS(config.h)\n\n# This is a new thing required to stop a warning from automake 1.12\nm4_ifdef([AM_PROG_AR], [AM_PROG_AR])\n\n# This was added at the suggestion of libtoolize (03-Jan-10)\nAC_CONFIG_MACRO_DIR([m4])\n\n# The default CFLAGS and CXXFLAGS in Autoconf are \"-g -O2\" for gcc and just\n# \"-g\" for any other compiler. There doesn't seem to be a standard way of\n# getting rid of the -g (which I don't think is needed for a production\n# library). This fudge seems to achieve the necessary. First, we remember the\n# externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and\n# AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not\n# set, they will be set to Autoconf's defaults. Afterwards, if the original\n# values were not set, remove the -g from the Autoconf defaults.\n# (PH 02-May-07)\n\nremember_set_CFLAGS=\"$CFLAGS\"\nremember_set_CXXFLAGS=\"$CXXFLAGS\"\n\nAC_PROG_CC\nAC_PROG_CXX\nAM_PROG_CC_C_O\n\nif test \"x$remember_set_CFLAGS\" = \"x\"\nthen\n  if test \"$CFLAGS\" = \"-g -O2\"\n  then\n    CFLAGS=\"-O2\"\n  elif test \"$CFLAGS\" = \"-g\"\n  then\n    CFLAGS=\"\"\n  fi\nfi\n\nif test \"x$remember_set_CXXFLAGS\" = \"x\"\nthen\n  if test \"$CXXFLAGS\" = \"-g -O2\"\n  then\n    CXXFLAGS=\"-O2\"\n  elif test \"$CXXFLAGS\" = \"-g\"\n  then\n    CXXFLAGS=\"\"\n  fi\nfi\n\n# AC_PROG_CXX will return \"g++\" even if no c++ compiler is installed.\n# Check for that case, and just disable c++ code if g++ doesn't run.\nAC_LANG_PUSH(C++)\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],, CXX=\"\"; CXXCP=\"\"; CXXFLAGS=\"\")\nAC_LANG_POP\n\n# Check for a 64-bit integer type\nAC_TYPE_INT64_T\n\nAC_PROG_INSTALL\nAC_LIBTOOL_WIN32_DLL\nLT_INIT\nAC_PROG_LN_S\n\n# Check for GCC visibility feature\n\nPCRE_VISIBILITY\n\n# Versioning\n\nPCRE_MAJOR=\"pcre_major\"\nPCRE_MINOR=\"pcre_minor\"\nPCRE_PRERELEASE=\"pcre_prerelease\"\nPCRE_DATE=\"pcre_date\"\n\nif test \"$PCRE_MINOR\" = \"08\" -o \"$PCRE_MINOR\" = \"09\"\nthen\n  echo \"***\"\n  echo \"*** Minor version number $PCRE_MINOR must not be used. ***\"\n  echo \"*** Use only 01 to 07 or 10 onwards, to avoid octal issues. ***\"\n  echo \"***\"\n  exit 1\nfi\n\nAC_SUBST(PCRE_MAJOR)\nAC_SUBST(PCRE_MINOR)\nAC_SUBST(PCRE_PRERELEASE)\nAC_SUBST(PCRE_DATE)\n\n# Set a more sensible default value for $(htmldir).\nif test \"x$htmldir\" = 'x${docdir}'\nthen\n  htmldir='${docdir}/html'\nfi\n\n# Handle --disable-pcre8 (enabled by default)\nAC_ARG_ENABLE(pcre8,\n              AS_HELP_STRING([--disable-pcre8],\n                             [disable 8 bit character support]),\n              , enable_pcre8=unset)\nAC_SUBST(enable_pcre8)\n\n# Handle --enable-pcre16 (disabled by default)\nAC_ARG_ENABLE(pcre16,\n              AS_HELP_STRING([--enable-pcre16],\n                             [enable 16 bit character support]),\n              , enable_pcre16=unset)\nAC_SUBST(enable_pcre16)\n\n# Handle --enable-pcre32 (disabled by default)\nAC_ARG_ENABLE(pcre32,\n              AS_HELP_STRING([--enable-pcre32],\n                             [enable 32 bit character support]),\n              , enable_pcre32=unset)\nAC_SUBST(enable_pcre32)\n\n# Handle --disable-cpp. The substitution of enable_cpp is needed for use in\n# pcre-config.\nAC_ARG_ENABLE(cpp,\n              AS_HELP_STRING([--disable-cpp],\n                             [disable C++ support]),\n              , enable_cpp=unset)\nAC_SUBST(enable_cpp)\n\n# Handle --enable-jit (disabled by default)\nAC_ARG_ENABLE(jit,\n              AS_HELP_STRING([--enable-jit],\n                             [enable Just-In-Time compiling support]),\n              , enable_jit=no)\n\n# This code enables JIT if the hardware supports it.\n\nif test \"$enable_jit\" = \"auto\"; then\n  AC_LANG(C)\n  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[\n  #define SLJIT_CONFIG_AUTO 1\n  #include \"sljit/sljitConfigInternal.h\"\n  #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n  #error unsupported\n  #endif]])], enable_jit=yes, enable_jit=no)\nfi\n\n# Handle --disable-pcregrep-jit (enabled by default)\nAC_ARG_ENABLE(pcregrep-jit,\n              AS_HELP_STRING([--disable-pcregrep-jit],\n                             [disable JIT support in pcregrep]),\n              , enable_pcregrep_jit=yes)\n\n# Handle --enable-rebuild-chartables\nAC_ARG_ENABLE(rebuild-chartables,\n              AS_HELP_STRING([--enable-rebuild-chartables],\n                             [rebuild character tables in current locale]),\n              , enable_rebuild_chartables=no)\n\n# Handle --enable-utf8 (disabled by default)\nAC_ARG_ENABLE(utf8,\n              AS_HELP_STRING([--enable-utf8],\n                             [another name for --enable-utf. Kept only for compatibility reasons]),\n              , enable_utf8=unset)\n\n# Handle --enable-utf (disabled by default)\nAC_ARG_ENABLE(utf,\n              AS_HELP_STRING([--enable-utf],\n                             [enable UTF-8/16/32 support (incompatible with --enable-ebcdic)]),\n              , enable_utf=unset)\n\n# Handle --enable-unicode-properties\nAC_ARG_ENABLE(unicode-properties,\n              AS_HELP_STRING([--enable-unicode-properties],\n                             [enable Unicode properties support (implies --enable-utf)]),\n              , enable_unicode_properties=no)\n\n# Handle newline options\nac_pcre_newline=lf\nAC_ARG_ENABLE(newline-is-cr,\n              AS_HELP_STRING([--enable-newline-is-cr],\n                             [use CR as newline character]),\n              ac_pcre_newline=cr)\nAC_ARG_ENABLE(newline-is-lf,\n              AS_HELP_STRING([--enable-newline-is-lf],\n                             [use LF as newline character (default)]),\n              ac_pcre_newline=lf)\nAC_ARG_ENABLE(newline-is-crlf,\n              AS_HELP_STRING([--enable-newline-is-crlf],\n                             [use CRLF as newline sequence]),\n              ac_pcre_newline=crlf)\nAC_ARG_ENABLE(newline-is-anycrlf,\n              AS_HELP_STRING([--enable-newline-is-anycrlf],\n                             [use CR, LF, or CRLF as newline sequence]),\n              ac_pcre_newline=anycrlf)\nAC_ARG_ENABLE(newline-is-any,\n              AS_HELP_STRING([--enable-newline-is-any],\n                             [use any valid Unicode newline sequence]),\n              ac_pcre_newline=any)\nenable_newline=\"$ac_pcre_newline\"\n\n# Handle --enable-bsr-anycrlf\nAC_ARG_ENABLE(bsr-anycrlf,\n              AS_HELP_STRING([--enable-bsr-anycrlf],\n                             [\\R matches only CR, LF, CRLF by default]),\n              , enable_bsr_anycrlf=no)\n\n# Handle --enable-ebcdic\nAC_ARG_ENABLE(ebcdic,\n              AS_HELP_STRING([--enable-ebcdic],\n                             [assume EBCDIC coding rather than ASCII; incompatible with --enable-utf; use only in (uncommon) EBCDIC environments; it implies --enable-rebuild-chartables]),\n              , enable_ebcdic=no)\n\n# Handle --enable-ebcdic-nl25\nAC_ARG_ENABLE(ebcdic-nl25,\n              AS_HELP_STRING([--enable-ebcdic-nl25],\n                             [set EBCDIC code for NL to 0x25 instead of 0x15; it implies --enable-ebcdic]),\n              , enable_ebcdic_nl25=no)\n\n# Handle --disable-stack-for-recursion\nAC_ARG_ENABLE(stack-for-recursion,\n              AS_HELP_STRING([--disable-stack-for-recursion],\n                             [don't use stack recursion when matching]),\n              , enable_stack_for_recursion=yes)\n\n# Handle --enable-pcregrep-libz\nAC_ARG_ENABLE(pcregrep-libz,\n              AS_HELP_STRING([--enable-pcregrep-libz],\n                             [link pcregrep with libz to handle .gz files]),\n              , enable_pcregrep_libz=no)\n\n# Handle --enable-pcregrep-libbz2\nAC_ARG_ENABLE(pcregrep-libbz2,\n              AS_HELP_STRING([--enable-pcregrep-libbz2],\n                             [link pcregrep with libbz2 to handle .bz2 files]),\n              , enable_pcregrep_libbz2=no)\n\n# Handle --with-pcregrep-bufsize=N\nAC_ARG_WITH(pcregrep-bufsize,\n              AS_HELP_STRING([--with-pcregrep-bufsize=N],\n                             [pcregrep buffer size (default=20480, minimum=8192)]),\n              , with_pcregrep_bufsize=20480)\n\n# Handle --enable-pcretest-libedit\nAC_ARG_ENABLE(pcretest-libedit,\n              AS_HELP_STRING([--enable-pcretest-libedit],\n                             [link pcretest with libedit]),\n              , enable_pcretest_libedit=no)\n\n# Handle --enable-pcretest-libreadline\nAC_ARG_ENABLE(pcretest-libreadline,\n              AS_HELP_STRING([--enable-pcretest-libreadline],\n                             [link pcretest with libreadline]),\n              , enable_pcretest_libreadline=no)\n\n# Handle --with-posix-malloc-threshold=NBYTES\nAC_ARG_WITH(posix-malloc-threshold,\n            AS_HELP_STRING([--with-posix-malloc-threshold=NBYTES],\n                           [threshold for POSIX malloc usage (default=10)]),\n            , with_posix_malloc_threshold=10)\n\n# Handle --with-link-size=N\nAC_ARG_WITH(link-size,\n            AS_HELP_STRING([--with-link-size=N],\n                           [internal link size (2, 3, or 4 allowed; default=2)]),\n            , with_link_size=2)\n\n# Handle --with-parens-nest-limit=N\nAC_ARG_WITH(parens-nest-limit,\n            AS_HELP_STRING([--with-parens-nest-limit=N],\n                           [nested parentheses limit (default=250)]),\n            , with_parens_nest_limit=250)\n\n# Handle --with-match-limit=N\nAC_ARG_WITH(match-limit,\n            AS_HELP_STRING([--with-match-limit=N],\n                           [default limit on internal looping (default=10000000)]),\n            , with_match_limit=10000000)\n\n# Handle --with-match-limit_recursion=N\n#\n# Note: In config.h, the default is to define MATCH_LIMIT_RECURSION\n# symbolically as MATCH_LIMIT, which in turn is defined to be some numeric\n# value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some\n# different numeric value (or even the same numeric value as MATCH_LIMIT,\n# though no longer defined in terms of the latter).\n#\nAC_ARG_WITH(match-limit-recursion,\n            AS_HELP_STRING([--with-match-limit-recursion=N],\n                           [default limit on internal recursion (default=MATCH_LIMIT)]),\n            , with_match_limit_recursion=MATCH_LIMIT)\n\n# Handle --enable-valgrind\nAC_ARG_ENABLE(valgrind,\n              AS_HELP_STRING([--enable-valgrind],\n                             [valgrind support]),\n              , enable_valgrind=no)\n\n# Enable code coverage reports using gcov\nAC_ARG_ENABLE(coverage,\n              AS_HELP_STRING([--enable-coverage],\n                             [enable code coverage reports using gcov]),\n              , enable_coverage=no)\n\n# Copy enable_utf8 value to enable_utf for compatibility reasons\nif test \"x$enable_utf8\" != \"xunset\"\nthen\n  if test \"x$enable_utf\" != \"xunset\"\n  then\n    AC_MSG_ERROR([--enable/disable-utf8 is kept only for compatibility reasons and its value is copied to --enable/disable-utf. Newer code must use --enable/disable-utf alone.])\n  fi\n  enable_utf=$enable_utf8\nfi\n\n# Set the default value for pcre8\nif test \"x$enable_pcre8\" = \"xunset\"\nthen\n  enable_pcre8=yes\nfi\n\n# Set the default value for pcre16\nif test \"x$enable_pcre16\" = \"xunset\"\nthen\n  enable_pcre16=no\nfi\n\n# Set the default value for pcre32\nif test \"x$enable_pcre32\" = \"xunset\"\nthen\n  enable_pcre32=no\nfi\n\n# Make sure enable_pcre8 or enable_pcre16 was set\nif test \"x$enable_pcre8$enable_pcre16$enable_pcre32\" = \"xnonono\"\nthen\n  AC_MSG_ERROR([At least one of 8, 16 or 32 bit pcre library must be enabled])\nfi\n\n# Make sure that if enable_unicode_properties was set, that UTF support is enabled.\nif test \"x$enable_unicode_properties\" = \"xyes\"\nthen\n  if test \"x$enable_utf\" = \"xno\"\n  then\n    AC_MSG_ERROR([support for Unicode properties requires UTF-8/16/32 support])\n  fi\n  enable_utf=yes\nfi\n\n# enable_utf is disabled by default.\nif test \"x$enable_utf\" = \"xunset\"\nthen\n  enable_utf=no\nfi\n\n# enable_cpp copies the value of enable_pcre8 by default\nif test \"x$enable_cpp\" = \"xunset\"\nthen\n  enable_cpp=$enable_pcre8\nfi\n\n# Make sure that if enable_cpp was set, that enable_pcre8 support is enabled\nif test \"x$enable_cpp\" = \"xyes\"\nthen\n  if test \"x$enable_pcre8\" = \"xno\"\n  then\n    AC_MSG_ERROR([C++ library requires pcre library with 8 bit characters])\n  fi\nfi\n\n# Convert the newline identifier into the appropriate integer value. The first\n# three are ASCII values 0x0a, 0x0d, and 0x0d0a, but if EBCDIC is enabled, they\n# are changed below.\n\ncase \"$enable_newline\" in\n  lf)      ac_pcre_newline_value=10   ;;\n  cr)      ac_pcre_newline_value=13   ;;\n  crlf)    ac_pcre_newline_value=3338 ;;\n  anycrlf) ac_pcre_newline_value=-2   ;;\n  any)     ac_pcre_newline_value=-1   ;;\n  *)\n  AC_MSG_ERROR([invalid argument \\\"$enable_newline\\\" to --enable-newline option])\n  ;;\nesac\n\n# --enable-ebcdic-nl25 implies --enable-ebcdic\nif test \"x$enable_ebcdic_nl25\" = \"xyes\"; then\n  enable_ebcdic=yes\nfi\n\n# Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled,\n# and the newline value is adjusted appropriately (CR is still 13, but LF is\n# 21 or 37). Also check that UTF support is not requested, because PCRE cannot\n# handle EBCDIC and UTF in the same build. To do so it would need to use\n# different character constants depending on the mode.\n#\nif test \"x$enable_ebcdic\" = \"xyes\"; then\n  enable_rebuild_chartables=yes\n\n  if test \"x$enable_utf\" = \"xyes\"; then\n    AC_MSG_ERROR([support for EBCDIC and UTF-8/16/32 cannot be enabled at the same time])\n  fi\n\n  if test \"x$enable_ebcdic_nl25\" = \"xno\"; then\n    case \"$ac_pcre_newline_value\" in\n      10)   ac_pcre_newline_value=21 ;;\n      3338) ac_pcre_newline_value=3349 ;;\n    esac\n  else\n    case \"$ac_pcre_newline_value\" in\n      10)   ac_pcre_newline_value=37 ;;\n      3338) ac_pcre_newline_value=3365 ;;\n    esac\n  fi\nfi\n\n# Check argument to --with-link-size\ncase \"$with_link_size\" in\n  2|3|4) ;;\n  *)\n  AC_MSG_ERROR([invalid argument \\\"$with_link_size\\\" to --with-link-size option])\n  ;;\nesac\n\nAH_TOP([\n/* PCRE is written in Standard C, but there are a few non-standard things it\ncan cope with, allowing it to run on SunOS4 and other \"close to standard\"\nsystems.\n\nIn environments that support the GNU autotools, config.h.in is converted into\nconfig.h by the \"configure\" script. In environments that use CMake,\nconfig-cmake.in is converted into config.h. If you are going to build PCRE \"by\nhand\" without using \"configure\" or CMake, you should copy the distributed\nconfig.h.generic to config.h, and edit the macro definitions to be the way you\nneed them. You must then add -DHAVE_CONFIG_H to all of your compile commands,\nso that config.h is included at the start of every source.\n\nAlternatively, you can avoid editing by using -D on the compiler command line\nto set the macro values. In this case, you do not have to set -DHAVE_CONFIG_H,\nbut if you do, default values will be taken from config.h for non-boolean\nmacros that are not defined on the command line.\n\nBoolean macros such as HAVE_STDLIB_H and SUPPORT_PCRE8 should either be defined\n(conventionally to 1) for TRUE, and not defined at all for FALSE. All such\nmacros are listed as a commented #undef in config.h.generic. Macros such as\nMATCH_LIMIT, whose actual value is relevant, have defaults defined, but are\nsurrounded by #ifndef/#endif lines so that the value can be overridden by -D.\n\nPCRE uses memmove() if HAVE_MEMMOVE is defined; otherwise it uses bcopy() if\nHAVE_BCOPY is defined. If your system has neither bcopy() nor memmove(), make\nsure both macros are undefined; an emulation function will then be used. */])\n\n# Checks for header files.\nAC_HEADER_STDC\nAC_CHECK_HEADERS(limits.h sys/types.h sys/stat.h dirent.h)\nAC_CHECK_HEADERS([windows.h], [HAVE_WINDOWS_H=1])\n\n# The files below are C++ header files.\npcre_have_type_traits=\"0\"\npcre_have_bits_type_traits=\"0\"\n\nif test \"x$enable_cpp\" = \"xyes\" -a -z \"$CXX\"; then\n   AC_MSG_ERROR([Invalid C++ compiler or C++ compiler flags])\nfi\n\nif test \"x$enable_cpp\" = \"xyes\" -a -n \"$CXX\"\nthen\nAC_LANG_PUSH(C++)\n\n# Older versions of pcre defined pcrecpp::no_arg, but in new versions\n# it's called pcrecpp::RE::no_arg.  For backwards ABI compatibility,\n# we want to make one an alias for the other.  Different systems do\n# this in different ways.  Some systems, for instance, can do it via\n# a linker flag: -alias (for os x 10.5) or -i (for os x <=10.4).\nOLD_LDFLAGS=\"$LDFLAGS\"\nfor flag in \"-alias,__ZN7pcrecpp2RE6no_argE,__ZN7pcrecpp6no_argE\" \\\n            \"-i__ZN7pcrecpp6no_argE:__ZN7pcrecpp2RE6no_argE\"; do\n  AC_MSG_CHECKING([for alias support in the linker])\n  LDFLAGS=\"$OLD_LDFLAGS -Wl,$flag\"\n  # We try to run the linker with this new ld flag.  If the link fails,\n  # we give up and remove the new flag from LDFLAGS.\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([namespace pcrecpp {\n                                    class RE { static int no_arg; };\n                                    int RE::no_arg;\n                                  }],\n                                 [])],\n                 [AC_MSG_RESULT([yes]);\n                  EXTRA_LIBPCRECPP_LDFLAGS=\"$EXTRA_LIBPCRECPP_LDFLAGS -Wl,$flag\";\n                  break;],\n                 AC_MSG_RESULT([no]))\ndone\nLDFLAGS=\"$OLD_LDFLAGS\"\n\n# We could be more clever here, given we're doing AC_SUBST with this\n# (eg set a var to be the name of the include file we want). But we're not\n# so it's easy to change back to 'regular' autoconf vars if we needed to.\nAC_CHECK_HEADERS(string, [pcre_have_cpp_headers=\"1\"],\n                         [pcre_have_cpp_headers=\"0\"])\nAC_CHECK_HEADERS(bits/type_traits.h, [pcre_have_bits_type_traits=\"1\"],\n                                     [pcre_have_bits_type_traits=\"0\"])\nAC_CHECK_HEADERS(type_traits.h, [pcre_have_type_traits=\"1\"],\n                                [pcre_have_type_traits=\"0\"])\n\n# (This isn't c++-specific, but is only used in pcrecpp.cc, so try this\n# in a c++ context.  This matters becuase strtoimax is C99 and may not\n# be supported by the C++ compiler.)\n# Figure out how to create a longlong from a string: strtoll and\n# equiv.  It's not enough to call AC_CHECK_FUNCS: hpux has a\n# strtoll, for instance, but it only takes 2 args instead of 3!\n# We have to call AH_TEMPLATE since AC_DEFINE_UNQUOTED below is complex.\nAH_TEMPLATE(HAVE_STRTOQ, [Define to 1 if you have `strtoq'.])\nAH_TEMPLATE(HAVE_STRTOLL, [Define to 1 if you have `strtoll'.])\nAH_TEMPLATE(HAVE__STRTOI64, [Define to 1 if you have `_strtoi64'.])\nAH_TEMPLATE(HAVE_STRTOIMAX, [Define to 1 if you have `strtoimax'.])\nhave_strto_fn=0\nfor fn in strtoq strtoll _strtoi64 strtoimax; do\n  AC_MSG_CHECKING([for $fn])\n  if test \"$fn\" = strtoimax; then\n    include=stdint.h\n  else\n    include=stdlib.h\n  fi\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <$include>],\n                                    [char* e; return $fn(\"100\", &e, 10)])],\n                    [AC_MSG_RESULT(yes)\n                     AC_DEFINE_UNQUOTED(HAVE_`echo $fn | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`, 1,\n                                        [Define to 1 if you have `$fn'.])\n                     have_strto_fn=1\n                     break],\n                    [AC_MSG_RESULT(no)])\ndone\n\nif test \"$have_strto_fn\" = 1; then\n  AC_CHECK_TYPES([long long],\n                 [pcre_have_long_long=\"1\"],\n                 [pcre_have_long_long=\"0\"])\n  AC_CHECK_TYPES([unsigned long long],\n                 [pcre_have_ulong_long=\"1\"],\n                 [pcre_have_ulong_long=\"0\"])\nelse\n  pcre_have_long_long=\"0\"\n  pcre_have_ulong_long=\"0\"\nfi\nAC_SUBST(pcre_have_long_long)\nAC_SUBST(pcre_have_ulong_long)\n\nAC_LANG_POP\nfi\n# Using AC_SUBST eliminates the need to include config.h in a public .h file\nAC_SUBST(pcre_have_type_traits)\nAC_SUBST(pcre_have_bits_type_traits)\n\n# Conditional compilation\nAM_CONDITIONAL(WITH_PCRE8, test \"x$enable_pcre8\" = \"xyes\")\nAM_CONDITIONAL(WITH_PCRE16, test \"x$enable_pcre16\" = \"xyes\")\nAM_CONDITIONAL(WITH_PCRE32, test \"x$enable_pcre32\" = \"xyes\")\nAM_CONDITIONAL(WITH_PCRE_CPP, test \"x$enable_cpp\" = \"xyes\")\nAM_CONDITIONAL(WITH_REBUILD_CHARTABLES, test \"x$enable_rebuild_chartables\" = \"xyes\")\nAM_CONDITIONAL(WITH_JIT, test \"x$enable_jit\" = \"xyes\")\nAM_CONDITIONAL(WITH_UTF, test \"x$enable_utf\" = \"xyes\")\nAM_CONDITIONAL(WITH_VALGRIND, test \"x$enable_valgrind\" = \"xyes\")\n\n# Checks for typedefs, structures, and compiler characteristics.\n\nAC_C_CONST\nAC_TYPE_SIZE_T\n\n# Checks for library functions.\n\nAC_CHECK_FUNCS(bcopy memmove strerror)\n\n# Check for the availability of libz (aka zlib)\n\nAC_CHECK_HEADERS([zlib.h], [HAVE_ZLIB_H=1])\nAC_CHECK_LIB([z], [gzopen], [HAVE_LIBZ=1])\n\n# Check for the availability of libbz2. Originally we just used AC_CHECK_LIB,\n# as for libz. However, this had the following problem, diagnosed and fixed by\n# a user:\n#\n#   - libbz2 uses the Pascal calling convention (WINAPI) for the functions\n#     under Win32.\n#   - The standard autoconf AC_CHECK_LIB fails to include \"bzlib.h\",\n#     therefore missing the function definition.\n#   - The compiler thus generates a \"C\" signature for the test function.\n#   - The linker fails to find the \"C\" function.\n#   - PCRE fails to configure if asked to do so against libbz2.\n#\n# Solution:\n#\n#   - Replace the AC_CHECK_LIB test with a custom test.\n\nAC_CHECK_HEADERS([bzlib.h], [HAVE_BZLIB_H=1])\n# Original test\n# AC_CHECK_LIB([bz2], [BZ2_bzopen], [HAVE_LIBBZ2=1])\n#\n# Custom test follows\n\nAC_MSG_CHECKING([for libbz2])\nOLD_LIBS=\"$LIBS\"\nLIBS=\"$LIBS -lbz2\"\nAC_LINK_IFELSE([AC_LANG_PROGRAM([[\n#ifdef HAVE_BZLIB_H\n#include <bzlib.h>\n#endif]],\n[[return (int)BZ2_bzopen(\"conftest\", \"rb\");]])],\n[AC_MSG_RESULT([yes]);HAVE_LIBBZ2=1; break;],\nAC_MSG_RESULT([no]))\nLIBS=\"$OLD_LIBS\"\n\n# Check for the availabiity of libreadline\n\nif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_H=1])\n AC_CHECK_HEADERS([readline/history.h], [HAVE_HISTORY_H=1])\n AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-lreadline\"],\n   [unset ac_cv_lib_readline_readline;\n    AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-ltinfo\"],\n     [unset ac_cv_lib_readline_readline;\n      AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-lcurses\"],\n       [unset ac_cv_lib_readline_readline;\n        AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-lncurses\"],\n         [unset ac_cv_lib_readline_readline;\n\t  AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-lncursesw\"],\n           [unset ac_cv_lib_readline_readline;\n\t    AC_CHECK_LIB([readline], [readline], [LIBREADLINE=\"-ltermcap\"],\n             [LIBREADLINE=\"\"],\n             [-ltermcap])],\n           [-lncursesw])],\n         [-lncurses])],\n       [-lcurses])],\n     [-ltinfo])])\n AC_SUBST(LIBREADLINE)\n if test -n \"$LIBREADLINE\"; then\n   if test \"$LIBREADLINE\" != \"-lreadline\"; then\n     echo \"-lreadline needs $LIBREADLINE\"\n     LIBREADLINE=\"-lreadline $LIBREADLINE\"\n   fi\n fi\nfi\n\n\n# Check for the availability of libedit. Different distributions put its\n# headers in different places. Try to cover the most common ones.\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n  AC_CHECK_HEADERS([editline/readline.h], [HAVE_EDITLINE_READLINE_H=1],\n    [AC_CHECK_HEADERS([edit/readline/readline.h], [HAVE_READLINE_READLINE_H=1],\n      [AC_CHECK_HEADERS([readline/readline.h], [HAVE_READLINE_READLINE_H=1])])])\n  AC_CHECK_LIB([edit], [readline], [LIBEDIT=\"-ledit\"])\nfi\n\n# This facilitates -ansi builds under Linux\ndnl AC_DEFINE([_GNU_SOURCE], [], [Enable GNU extensions in glibc])\n\nPCRE_STATIC_CFLAG=\"\"\nif test \"x$enable_shared\" = \"xno\" ; then\n  AC_DEFINE([PCRE_STATIC], [1], [\n    Define to any value if linking statically (TODO: make nice with Libtool)])\n  PCRE_STATIC_CFLAG=\"-DPCRE_STATIC\"\nfi\nAC_SUBST(PCRE_STATIC_CFLAG)\n\n# Here is where pcre specific defines are handled\n\nif test \"$enable_pcre8\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_PCRE8], [], [\n    Define to any value to enable the 8 bit PCRE library.])\nfi\n\nif test \"$enable_pcre16\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_PCRE16], [], [\n    Define to any value to enable the 16 bit PCRE library.])\nfi\n\nif test \"$enable_pcre32\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_PCRE32], [], [\n    Define to any value to enable the 32 bit PCRE library.])\nfi\n\n# Unless running under Windows, JIT support requires pthreads.\n\nif test \"$enable_jit\" = \"yes\"; then\n  if test \"$HAVE_WINDOWS_H\" != \"1\"; then\n    AX_PTHREAD([], [AC_MSG_ERROR([JIT support requires pthreads])])\n    CC=\"$PTHREAD_CC\"\n    CFLAGS=\"$PTHREAD_CFLAGS $CFLAGS\"\n    LIBS=\"$PTHREAD_LIBS $LIBS\"\n  fi\n  AC_DEFINE([SUPPORT_JIT], [], [\n    Define to any value to enable support for Just-In-Time compiling.])\nelse\n  enable_pcregrep_jit=\"no\"\nfi\n\nif test \"$enable_pcregrep_jit\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_PCREGREP_JIT], [], [\n    Define to any value to enable JIT support in pcregrep.])\nfi\n\nif test \"$enable_utf\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_UTF], [], [\n    Define to any value to enable support for the UTF-8/16/32 Unicode encoding.\n    This will work even in an EBCDIC environment, but it is incompatible\n    with the EBCDIC macro. That is, PCRE can support *either* EBCDIC\n    code *or* ASCII/UTF-8/16/32, but not both at once.])\nfi\n\nif test \"$enable_unicode_properties\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_UCP], [], [\n    Define to any value to enable support for Unicode properties.])\nfi\n\nif test \"$enable_stack_for_recursion\" = \"no\"; then\n  AC_DEFINE([NO_RECURSE], [], [\n    PCRE uses recursive function calls to handle backtracking while\n    matching. This can sometimes be a problem on systems that have\n    stacks of limited size. Define NO_RECURSE to any value to get a\n    version that doesn't use recursion in the match() function; instead\n    it creates its own stack by steam using pcre_recurse_malloc() to obtain\n    memory from the heap. For more detail, see the comments and other stuff\n    just above the match() function.])\nfi\n\nif test \"$enable_pcregrep_libz\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_LIBZ], [], [\n    Define to any value to allow pcregrep to be linked with libz, so that it is\n    able to handle .gz files.])\nfi\n\nif test \"$enable_pcregrep_libbz2\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_LIBBZ2], [], [\n    Define to any value to allow pcregrep to be linked with libbz2, so that it\n    is able to handle .bz2 files.])\nfi\n\nif test $with_pcregrep_bufsize -lt 8192 ; then\n  AC_MSG_WARN([$with_pcregrep_bufsize is too small for --with-pcregrep-bufsize; using 8192])\n  with_pcregrep_bufsize=\"8192\"\nelse\n  if test $? -gt 1 ; then\n  AC_MSG_ERROR([Bad value for  --with-pcregrep-bufsize])\n  fi\nfi\n\nAC_DEFINE_UNQUOTED([PCREGREP_BUFSIZE], [$with_pcregrep_bufsize], [\n  The value of PCREGREP_BUFSIZE determines the size of buffer used by pcregrep\n  to hold parts of the file it is searching. This is also the minimum value.\n  The actual amount of memory used by pcregrep is three times this number,\n  because it allows for the buffering of \"before\" and \"after\" lines.])\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_LIBEDIT], [], [\n    Define to any value to allow pcretest to be linked with libedit.])\n  LIBREADLINE=\"$LIBEDIT\"\nelif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n  AC_DEFINE([SUPPORT_LIBREADLINE], [], [\n    Define to any value to allow pcretest to be linked with libreadline.])\nfi\n\nAC_DEFINE_UNQUOTED([NEWLINE], [$ac_pcre_newline_value], [\n  The value of NEWLINE determines the default newline character sequence. PCRE\n  client programs can override this by selecting other values at run time. In\n  ASCII environments, the value can be 10 (LF), 13 (CR), or 3338 (CRLF); in\n  EBCDIC environments the value can be 21 or 37 (LF), 13 (CR), or 3349 or 3365\n  (CRLF) because there are two alternative codepoints (0x15 and 0x25) that are\n  used as the NL line terminator that is equivalent to ASCII LF. In both ASCII\n  and EBCDIC environments the value can also be -1 (ANY), or -2 (ANYCRLF).])\n\nif test \"$enable_bsr_anycrlf\" = \"yes\"; then\n  AC_DEFINE([BSR_ANYCRLF], [], [\n    By default, the \\R escape sequence matches any Unicode line ending\n    character or sequence of characters. If BSR_ANYCRLF is defined (to any\n    value), this is changed so that backslash-R matches only CR, LF, or CRLF.\n    The build-time default can be overridden by the user of PCRE at runtime.])\nfi\n\nAC_DEFINE_UNQUOTED([LINK_SIZE], [$with_link_size], [\n  The value of LINK_SIZE determines the number of bytes used to store\n  links as offsets within the compiled regex. The default is 2, which\n  allows for compiled patterns up to 64K long. This covers the vast\n  majority of cases. However, PCRE can also be compiled to use 3 or 4\n  bytes instead. This allows for longer patterns in extreme cases.])\n\nAC_DEFINE_UNQUOTED([POSIX_MALLOC_THRESHOLD], [$with_posix_malloc_threshold], [\n  When calling PCRE via the POSIX interface, additional working storage\n  is required for holding the pointers to capturing substrings because\n  PCRE requires three integers per substring, whereas the POSIX\n  interface provides only two. If the number of expected substrings is\n  small, the wrapper function uses space on the stack, because this is\n  faster than using malloc() for each call. The threshold above which\n  the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD.])\n\nAC_DEFINE_UNQUOTED([PARENS_NEST_LIMIT], [$with_parens_nest_limit], [\n  The value of PARENS_NEST_LIMIT specifies the maximum depth of nested\n  parentheses (of any kind) in a pattern. This limits the amount of system\n  stack that is used while compiling a pattern.])\n\nAC_DEFINE_UNQUOTED([MATCH_LIMIT], [$with_match_limit], [\n  The value of MATCH_LIMIT determines the default number of times the\n  internal match() function can be called during a single execution of\n  pcre_exec(). There is a runtime interface for setting a different\n  limit. The limit exists in order to catch runaway regular\n  expressions that take for ever to determine that they do not match.\n  The default is set very large so that it does not accidentally catch\n  legitimate cases.])\n\nAC_DEFINE_UNQUOTED([MATCH_LIMIT_RECURSION], [$with_match_limit_recursion], [\n  The above limit applies to all calls of match(), whether or not they\n  increase the recursion depth. In some environments it is desirable\n  to limit the depth of recursive calls of match() more strictly, in\n  order to restrict the maximum amount of stack (or heap, if\n  NO_RECURSE is defined) that is used. The value of\n  MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To\n  have any useful effect, it must be less than the value of\n  MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT.\n  There is a runtime method for setting a different limit.])\n\nAC_DEFINE([MAX_NAME_SIZE], [32], [\n  This limit is parameterized just in case anybody ever wants to\n  change it. Care must be taken if it is increased, because it guards\n  against integer overflow caused by enormously large patterns.])\n\nAC_DEFINE([MAX_NAME_COUNT], [10000], [\n  This limit is parameterized just in case anybody ever wants to\n  change it. Care must be taken if it is increased, because it guards\n  against integer overflow caused by enormously large patterns.])\n\nAH_VERBATIM([PCRE_EXP_DEFN], [\n/* If you are compiling for a system other than a Unix-like system or\n   Win32, and it needs some magic to be inserted before the definition\n   of a function that is exported by the library, define this macro to\n   contain the relevant magic. If you do not define this macro, a suitable\n    __declspec value is used for Windows systems; in other environments\n   \"extern\" is used for a C compiler and \"extern C\" for a C++ compiler.\n   This macro apears at the start of every exported function that is part\n   of the external API. It does not appear on functions that are \"external\"\n   in the C sense, but which are internal to the library. */\n#undef PCRE_EXP_DEFN])\n\nif test \"$enable_ebcdic\" = \"yes\"; then\n  AC_DEFINE_UNQUOTED([EBCDIC], [], [\n    If you are compiling for a system that uses EBCDIC instead of ASCII\n    character codes, define this macro to any value. You must also edit the\n    NEWLINE macro below to set a suitable EBCDIC newline, commonly 21 (0x15).\n    On systems that can use \"configure\" or CMake to set EBCDIC, NEWLINE is\n    automatically adjusted. When EBCDIC is set, PCRE assumes that all input\n    strings are in EBCDIC. If you do not define this macro, PCRE will assume\n    input strings are ASCII or UTF-8/16/32 Unicode. It is not possible to build\n    a version of PCRE that supports both EBCDIC and UTF-8/16/32.])\nfi\n\nif test \"$enable_ebcdic_nl25\" = \"yes\"; then\n  AC_DEFINE_UNQUOTED([EBCDIC_NL25], [], [\n    In an EBCDIC environment, define this macro to any value to arrange for\n    the NL character to be 0x25 instead of the default 0x15. NL plays the role\n    that LF does in an ASCII/Unicode environment. The value must also be set in\n    the NEWLINE macro below. On systems that can use \"configure\" or CMake to\n    set EBCDIC_NL25, the adjustment of NEWLINE is automatic.])\nfi\n\nif test \"$enable_valgrind\" = \"yes\"; then\n  AC_DEFINE_UNQUOTED([SUPPORT_VALGRIND], [], [\n     Define to any value for valgrind support to find invalid memory reads.])\nfi\n\n# Platform specific issues\nNO_UNDEFINED=\nEXPORT_ALL_SYMBOLS=\ncase $host_os in\n  cygwin* | mingw* )\n    if test X\"$enable_shared\" = Xyes; then\n      NO_UNDEFINED=\"-no-undefined\"\n      EXPORT_ALL_SYMBOLS=\"-Wl,--export-all-symbols\"\n    fi\n    ;;\nesac\n\n# The extra LDFLAGS for each particular library\n# (Note: The libpcre*_version bits are m4 variables, assigned above)\n\nEXTRA_LIBPCRE_LDFLAGS=\"$EXTRA_LIBPCRE_LDFLAGS \\\n                       $NO_UNDEFINED -version-info libpcre_version\"\n\nEXTRA_LIBPCRE16_LDFLAGS=\"$EXTRA_LIBPCRE16_LDFLAGS \\\n                       $NO_UNDEFINED -version-info libpcre16_version\"\n\nEXTRA_LIBPCRE32_LDFLAGS=\"$EXTRA_LIBPCRE32_LDFLAGS \\\n                       $NO_UNDEFINED -version-info libpcre32_version\"\n\nEXTRA_LIBPCREPOSIX_LDFLAGS=\"$EXTRA_LIBPCREPOSIX_LDFLAGS \\\n                            $NO_UNDEFINED -version-info libpcreposix_version\"\n\nEXTRA_LIBPCRECPP_LDFLAGS=\"$EXTRA_LIBPCRECPP_LDFLAGS \\\n                          $NO_UNDEFINED -version-info libpcrecpp_version \\\n                          $EXPORT_ALL_SYMBOLS\"\n\nAC_SUBST(EXTRA_LIBPCRE_LDFLAGS)\nAC_SUBST(EXTRA_LIBPCRE16_LDFLAGS)\nAC_SUBST(EXTRA_LIBPCRE32_LDFLAGS)\nAC_SUBST(EXTRA_LIBPCREPOSIX_LDFLAGS)\nAC_SUBST(EXTRA_LIBPCRECPP_LDFLAGS)\n\n# When we run 'make distcheck', use these arguments. Turning off compiler\n# optimization makes it run faster.\nDISTCHECK_CONFIGURE_FLAGS=\"CFLAGS='' CXXFLAGS='' --enable-pcre16 --enable-pcre32 --enable-jit --enable-cpp --enable-unicode-properties\"\nAC_SUBST(DISTCHECK_CONFIGURE_FLAGS)\n\n# Check that, if --enable-pcregrep-libz or --enable-pcregrep-libbz2 is\n# specified, the relevant library is available.\n\nif test \"$enable_pcregrep_libz\" = \"yes\"; then\n  if test \"$HAVE_ZLIB_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libz because zlib.h was not found\"\n    exit 1\n  fi\n  if test \"$HAVE_LIBZ\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libz because libz was not found\"\n    exit 1\n  fi\n  LIBZ=\"-lz\"\nfi\nAC_SUBST(LIBZ)\n\nif test \"$enable_pcregrep_libbz2\" = \"yes\"; then\n  if test \"$HAVE_BZLIB_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libbz2 because bzlib.h was not found\"\n    exit 1\n  fi\n  if test \"$HAVE_LIBBZ2\" != \"1\"; then\n    echo \"** Cannot --enable-pcregrep-libbz2 because libbz2 was not found\"\n    exit 1\n  fi\n  LIBBZ2=\"-lbz2\"\nfi\nAC_SUBST(LIBBZ2)\n\n# Similarly for --enable-pcretest-readline\n\nif test \"$enable_pcretest_libedit\" = \"yes\"; then\n  if test \"$enable_pcretest_libreadline\" = \"yes\"; then\n    echo \"** Cannot use both --enable-pcretest-libedit and --enable-pcretest-readline\"\n    exit 1\n  fi\n  if test \"$HAVE_EDITLINE_READLINE_H\" != \"1\" -a \\\n          \"$HAVE_READLINE_READLINE_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-libedit because neither editline/readline.h\"\n    echo \"** nor readline/readline.h was found.\"\n    exit 1\n  fi\n  if test -z \"$LIBEDIT\"; then\n    echo \"** Cannot --enable-pcretest-libedit because libedit library was not found.\"\n    exit 1\n  fi\nfi\n\nif test \"$enable_pcretest_libreadline\" = \"yes\"; then\n  if test \"$HAVE_READLINE_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline/readline.h was not found.\"\n    exit 1\n  fi\n  if test \"$HAVE_HISTORY_H\" != \"1\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline/history.h was not found.\"\n    exit 1\n  fi\n  if test -z \"$LIBREADLINE\"; then\n    echo \"** Cannot --enable-pcretest-readline because readline library was not found.\"\n    exit 1\n  fi\nfi\n\n# Handle valgrind support\n\nif test \"$enable_valgrind\" = \"yes\"; then\n  m4_ifdef([PKG_CHECK_MODULES],\n           [PKG_CHECK_MODULES([VALGRIND],[valgrind])],\n           [AC_MSG_ERROR([pkg-config not supported])])\nfi\n\n# Handle code coverage reporting support\nif test \"$enable_coverage\" = \"yes\"; then\n  if test \"x$GCC\" != \"xyes\"; then\n    AC_MSG_ERROR([Code coverage reports can only be generated when using GCC])\n  fi\n\n  # ccache is incompatible with gcov\n  AC_PATH_PROG([SHTOOL],[shtool],[false])\n  case `$SHTOOL path $CC` in\n    *ccache*) cc_ccache=yes;;\n    *) cc_ccache=no;;\n  esac\n\n  if test \"$cc_ccache\" = \"yes\"; then\n    if test -z \"$CCACHE_DISABLE\" -o \"$CCACHE_DISABLE\" != \"1\"; then\n      AC_MSG_ERROR([must export CCACHE_DISABLE=1 to disable ccache for code coverage])\n    fi\n  fi\n\n  AC_ARG_VAR([LCOV],[the ltp lcov program])\n  AC_PATH_PROG([LCOV],[lcov],[false])\n  if test \"x$LCOV\" = \"xfalse\"; then\n    AC_MSG_ERROR([lcov not found])\n  fi\n\n  AC_ARG_VAR([GENHTML],[the ltp genhtml program])\n  AC_PATH_PROG([GENHTML],[genhtml],[false])\n  if test \"x$GENHTML\" = \"xfalse\"; then\n    AC_MSG_ERROR([genhtml not found])\n  fi\n\n  # Set flags needed for gcov\n  GCOV_CFLAGS=\"-O0 -ggdb3 -fprofile-arcs -ftest-coverage\"\n  GCOV_CXXFLAGS=\"-O0 -ggdb3 -fprofile-arcs -ftest-coverage\"\n  GCOV_LIBS=\"-lgcov\"\n  AC_SUBST([GCOV_CFLAGS])\n  AC_SUBST([GCOV_CXXFLAGS])\n  AC_SUBST([GCOV_LIBS])\nfi # enable_coverage\n\nAM_CONDITIONAL([WITH_GCOV],[test \"x$enable_coverage\" = \"xyes\"])\n\n# Produce these files, in addition to config.h.\nAC_CONFIG_FILES(\n\tMakefile\n\tlibpcre.pc\n\tlibpcre16.pc\n\tlibpcre32.pc\n\tlibpcreposix.pc\n\tlibpcrecpp.pc\n\tpcre-config\n\tpcre.h\n\tpcre_stringpiece.h\n\tpcrecpparg.h\n)\n\n# Make the generated script files executable.\nAC_CONFIG_COMMANDS([script-chmod], [chmod a+x pcre-config])\n\n# Make sure that pcre_chartables.c is removed in case the method for\n# creating it was changed by reconfiguration.\nAC_CONFIG_COMMANDS([delete-old-chartables], [rm -f pcre_chartables.c])\n\nAC_OUTPUT\n\n# Print out a nice little message after configure is run displaying the\n# chosen options.\n\nebcdic_nl_code=n/a\nif test \"$enable_ebcdic_nl25\" = \"yes\"; then\n  ebcdic_nl_code=0x25\nelif test \"$enable_ebcdic\" = \"yes\"; then\n  ebcdic_nl_code=0x15\nfi\n\ncat <<EOF\n\n$PACKAGE-$VERSION configuration summary:\n\n    Install prefix .................. : ${prefix}\n    C preprocessor .................. : ${CPP}\n    C compiler ...................... : ${CC}\n    C++ preprocessor ................ : ${CXXCPP}\n    C++ compiler .................... : ${CXX}\n    Linker .......................... : ${LD}\n    C preprocessor flags ............ : ${CPPFLAGS}\n    C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS}\n    C++ compiler flags .............. : ${CXXFLAGS} ${VISIBILITY_CXXFLAGS}\n    Linker flags .................... : ${LDFLAGS}\n    Extra libraries ................. : ${LIBS}\n\n    Build 8 bit pcre library ........ : ${enable_pcre8}\n    Build 16 bit pcre library ....... : ${enable_pcre16}\n    Build 32 bit pcre library ....... : ${enable_pcre32}\n    Build C++ library ............... : ${enable_cpp}\n    Enable JIT compiling support .... : ${enable_jit}\n    Enable UTF-8/16/32 support ...... : ${enable_utf}\n    Unicode properties .............. : ${enable_unicode_properties}\n    Newline char/sequence ........... : ${enable_newline}\n    \\R matches only ANYCRLF ......... : ${enable_bsr_anycrlf}\n    EBCDIC coding ................... : ${enable_ebcdic}\n    EBCDIC code for NL .............. : ${ebcdic_nl_code}\n    Rebuild char tables ............. : ${enable_rebuild_chartables}\n    Use stack recursion ............. : ${enable_stack_for_recursion}\n    POSIX mem threshold ............. : ${with_posix_malloc_threshold}\n    Internal link size .............. : ${with_link_size}\n    Nested parentheses limit ........ : ${with_parens_nest_limit}\n    Match limit ..................... : ${with_match_limit}\n    Match limit recursion ........... : ${with_match_limit_recursion}\n    Build shared libs ............... : ${enable_shared}\n    Build static libs ............... : ${enable_static}\n    Use JIT in pcregrep ............. : ${enable_pcregrep_jit}\n    Buffer size for pcregrep ........ : ${with_pcregrep_bufsize}\n    Link pcregrep with libz ......... : ${enable_pcregrep_libz}\n    Link pcregrep with libbz2 ....... : ${enable_pcregrep_libbz2}\n    Link pcretest with libedit ...... : ${enable_pcretest_libedit}\n    Link pcretest with libreadline .. : ${enable_pcretest_libreadline}\n    Valgrind support ................ : ${enable_valgrind}\n    Code coverage ................... : ${enable_coverage}\n\nEOF\n\ndnl end configure.ac\n"
  },
  {
    "path": "src/pcre/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2018-03-07.03; # UTC\n\n# Copyright (C) 1999-2018 Free Software Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n    echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n    exit 1;\n    ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by 'PROGRAMS ARGS'.\n  object      Object file output by 'PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputting dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\n# Get the directory component of the given path, and save it in the\n# global variables '$dir'.  Note that this directory component will\n# be either empty or ending with a '/' character.  This is deliberate.\nset_dir_from ()\n{\n  case $1 in\n    */*) dir=`echo \"$1\" | sed -e 's|/[^/]*$|/|'`;;\n      *) dir=;;\n  esac\n}\n\n# Get the suffix-stripped basename of the given path, and save it the\n# global variable '$base'.\nset_base_from ()\n{\n  base=`echo \"$1\" | sed -e 's|^.*/||' -e 's/\\.[^.]*$//'`\n}\n\n# If no dependency file was actually created by the compiler invocation,\n# we still have to create a dummy depfile, to avoid errors with the\n# Makefile \"include basename.Plo\" scheme.\nmake_dummy_depfile ()\n{\n  echo \"#dummy\" > \"$depfile\"\n}\n\n# Factor out some common post-processing of the generated depfile.\n# Requires the auxiliary global variable '$tmpdepfile' to be set.\naix_post_process_depfile ()\n{\n  # If the compiler actually managed to produce a dependency file,\n  # post-process it.\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form 'foo.o: dependency.h'.\n    # Do two passes, one to just change these to\n    #   $object: dependency.h\n    # and one to simply output\n    #   dependency.h:\n    # which is needed to avoid the deleted-header problem.\n    { sed -e \"s,^.*\\.[$lower]*:,$object:,\" < \"$tmpdepfile\"\n      sed -e \"s,^.*\\.[$lower]*:[$tab ]*,,\" -e 's,$,:,' < \"$tmpdepfile\"\n    } > \"$depfile\"\n    rm -f \"$tmpdepfile\"\n  else\n    make_dummy_depfile\n  fi\n}\n\n# A tabulation character.\ntab='\t'\n# A newline character.\nnl='\n'\n# Character ranges might be problematic outside the C locale.\n# These definitions help.\nupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ\nlower=abcdefghijklmnopqrstuvwxyz\ndigits=0123456789\nalpha=${upper}${lower}\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Avoid interferences from the environment.\ngccflag= dashmflag=\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n  # This is just like dashmstdout with a different argument.\n  dashmflag=-xM\n  depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n  # This is just like msvisualcpp but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvisualcpp\nfi\n\nif test \"$depmode\" = msvc7msys; then\n  # This is just like msvc7 but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvc7\nfi\n\nif test \"$depmode\" = xlc; then\n  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.\n  gccflag=-qmakedep=gcc,-MF\n  depmode=gcc\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.\n## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.\n## (see the conditional assignment to $gccflag above).\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).  Also, it might not be\n##   supported by the other compilers which use the 'gcc' depmode.\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The second -e expression handles DOS-style file names with drive\n  # letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the \"deleted header file\" problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n## Some versions of gcc put a space before the ':'.  On the theory\n## that the space means something, we add a space to the output as\n## well.  hp depmode also adds that space, but also prefixes the VPATH\n## to the object.  Take care to not repeat it in the output.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e \"s|.*$object$||\" -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like '#:fec' to the end of the\n    # dependency line.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' \\\n      | tr \"$nl\" ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n      >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nxlc)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts '$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  set_dir_from \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  aix_post_process_depfile\n  ;;\n\ntcc)\n  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26\n  # FIXME: That version still under development at the moment of writing.\n  #        Make that this statement remains true also for stable, released\n  #        versions.\n  # It will wrap lines (doesn't matter whether long or short) with a\n  # trailing '\\', as in:\n  #\n  #   foo.o : \\\n  #    foo.c \\\n  #    foo.h \\\n  #\n  # It will put a trailing '\\' even on the last line, and will use leading\n  # spaces rather than leading tabs (at least since its commit 0394caf7\n  # \"Emit spaces for -MD\").\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each non-empty line is of the form 'foo.o : \\' or ' dep.h \\'.\n  # We have to change lines of the first kind to '$object: \\'.\n  sed -e \"s|.*:|$object :|\" < \"$tmpdepfile\" > \"$depfile\"\n  # And for each line of the second kind, we have to emit a 'dep.h:'\n  # dummy dependency, to avoid the deleted-header problem.\n  sed -n -e 's|^  *\\(.*\\) *\\\\$|\\1:|p' < \"$tmpdepfile\" >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\n## The order of this option in the case statement is important, since the\n## shell code in configure will try each of these formats in the order\n## listed in this file.  A plain '-MD' option would be understood by many\n## compilers, so we must ensure this comes after the gcc and icc options.\npgcc)\n  # Portland's C compiler understands '-MD'.\n  # Will always output deps to 'file.d' where file is the root name of the\n  # source file under compilation, even if file resides in a subdirectory.\n  # The object file name does not affect the name of the '.d' file.\n  # pgcc 10.2 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using '\\' :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n  set_dir_from \"$object\"\n  # Use the source, not the object, to determine the base name, since\n  # that's sadly what pgcc will do too.\n  set_base_from \"$source\"\n  tmpdepfile=$base.d\n\n  # For projects that build the same source file twice into different object\n  # files, the pgcc approach of using the *source* file root name can cause\n  # problems in parallel builds.  Use a locking strategy to avoid stomping on\n  # the same $tmpdepfile.\n  lockdir=$base.d-lock\n  trap \"\n    echo '$0: caught signal, cleaning up...' >&2\n    rmdir '$lockdir'\n    exit 1\n  \" 1 2 13 15\n  numtries=100\n  i=$numtries\n  while test $i -gt 0; do\n    # mkdir is a portable test-and-set.\n    if mkdir \"$lockdir\" 2>/dev/null; then\n      # This process acquired the lock.\n      \"$@\" -MD\n      stat=$?\n      # Release the lock.\n      rmdir \"$lockdir\"\n      break\n    else\n      # If the lock is being held by a different process, wait\n      # until the winning process is done or we timeout.\n      while test -d \"$lockdir\" && test $i -gt 0; do\n        sleep 1\n        i=`expr $i - 1`\n      done\n    fi\n    i=`expr $i - 1`\n  done\n  trap - 1 2 13 15\n  if test $i -le 0; then\n    echo \"$0: failed to acquire lock after $numtries attempts\" >&2\n    echo \"$0: check lockdir '$lockdir'\" >&2\n    exit 1\n  fi\n\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[$lower]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add 'dependent.h:' lines.\n    sed -ne '2,${\n               s/^ *//\n               s/ \\\\*$//\n               s/$/:/\n               p\n             }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n  # The Tru64 compiler uses -MD to generate dependencies as a side\n  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.\n  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n  # dependencies in 'foo.d' instead, so we check for that too.\n  # Subdirectories are respected.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n\n  if test \"$libtool\" = yes; then\n    # Libtool generates 2 separate objects for the 2 libraries.  These\n    # two compilations output dependencies in $dir.libs/$base.o.d and\n    # in $dir$base.o.d.  We have to check for both files, because\n    # one of the two compilations can be disabled.  We should prefer\n    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n    # automatically cleaned when .libs/ is deleted, while ignoring\n    # the former would cause a distcleancheck panic.\n    tmpdepfile1=$dir$base.o.d          # libtool 1.5\n    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.\n    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504\n    \"$@\" -Wc,-MD\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    tmpdepfile3=$dir$base.d\n    \"$@\" -MD\n  fi\n\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  # Same post-processing that is required for AIX mode.\n  aix_post_process_depfile\n  ;;\n\nmsvc7)\n  if test \"$libtool\" = yes; then\n    showIncludes=-Wc,-showIncludes\n  else\n    showIncludes=-showIncludes\n  fi\n  \"$@\" $showIncludes > \"$tmpdepfile\"\n  stat=$?\n  grep -v '^Note: including file: ' \"$tmpdepfile\"\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The first sed program below extracts the file names and escapes\n  # backslashes for cygpath.  The second sed program outputs the file\n  # name when reading, but also accumulates all include files in the\n  # hold buffer in order to output them again at the end.  This only\n  # works with sed implementations that can handle large buffers.\n  sed < \"$tmpdepfile\" -n '\n/^Note: including file:  *\\(.*\\)/ {\n  s//\\1/\n  s/\\\\/\\\\\\\\/g\n  p\n}' | $cygpath_u | sort -u | sed -n '\ns/ /\\\\ /g\ns/\\(.*\\)/'\"$tab\"'\\1 \\\\/p\ns/.\\(.*\\) \\\\/\\1:/\nH\n$ {\n  s/.*/'\"$tab\"'/\n  G\n  p\n}' >> \"$depfile\"\n  echo >> \"$depfile\" # make sure the fragment doesn't end with a backslash\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvc7msys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for ':'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.\n  \"$@\" $dashmflag |\n    sed \"s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |\" > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this sed invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  # makedepend may prepend the VPATH from the source file name to the object.\n  # No need to regex-escape $object, excess matching of '.' is harmless.\n  sed \"s|^.*\\($object *:\\)|\\1|\" \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process the last invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed '1,2d' \"$tmpdepfile\" \\\n    | tr ' ' \"$nl\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E \\\n    | sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n             -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n    | sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n        set fnord \"$@\"\n        shift\n        shift\n        ;;\n    *)\n        set fnord \"$@\" \"$arg\"\n        shift\n        shift\n        ;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::'\"$tab\"'\\1 \\\\:p' >> \"$depfile\"\n  echo \"$tab\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/pcre/dftables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This is a freestanding support program to generate a file containing\ncharacter tables for PCRE. The tables are built according to the current\nlocale. Now that pcre_maketables is a function visible to the outside world, we\nmake use of its code from here in order to be consistent. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <ctype.h>\n#include <stdio.h>\n#include <string.h>\n#include <locale.h>\n\n#include \"pcre_internal.h\"\n\n#define DFTABLES          /* pcre_maketables.c notices this */\n#include \"pcre_maketables.c\"\n\n\nint main(int argc, char **argv)\n{\nFILE *f;\nint i = 1;\nconst unsigned char *tables;\nconst unsigned char *base_of_tables;\n\n/* By default, the default C locale is used rather than what the building user\nhappens to have set. However, if the -L option is given, set the locale from\nthe LC_xxx environment variables. */\n\nif (argc > 1 && strcmp(argv[1], \"-L\") == 0)\n  {\n  setlocale(LC_ALL, \"\");        /* Set from environment variables */\n  i++;\n  }\n\nif (argc < i + 1)\n  {\n  fprintf(stderr, \"dftables: one filename argument is required\\n\");\n  return 1;\n  }\n\ntables = pcre_maketables();\nbase_of_tables = tables;\n\nf = fopen(argv[i], \"wb\");\nif (f == NULL)\n  {\n  fprintf(stderr, \"dftables: failed to open %s for writing\\n\", argv[1]);\n  return 1;\n  }\n\n/* There are several fprintf() calls here, because gcc in pedantic mode\ncomplains about the very long string otherwise. */\n\nfprintf(f,\n  \"/*************************************************\\n\"\n  \"*      Perl-Compatible Regular Expressions       *\\n\"\n  \"*************************************************/\\n\\n\"\n  \"/* This file was automatically written by the dftables auxiliary\\n\"\n  \"program. It contains character tables that are used when no external\\n\"\n  \"tables are passed to PCRE by the application that calls it. The tables\\n\"\n  \"are used only for characters whose code values are less than 256.\\n\\n\");\nfprintf(f,\n  \"The following #includes are present because without them gcc 4.x may remove\\n\"\n  \"the array definition from the final binary if PCRE is built into a static\\n\"\n  \"library and dead code stripping is activated. This leads to link errors.\\n\"\n  \"Pulling in the header ensures that the array gets flagged as \\\"someone\\n\"\n  \"outside this compilation unit might reference this\\\" and so it will always\\n\"\n  \"be supplied to the linker. */\\n\\n\");\n\n/* Force config.h in z/OS */\n\n#if defined NATIVE_ZOS\nfprintf(f,\n  \"/* For z/OS, config.h is forced */\\n\"\n  \"#ifndef HAVE_CONFIG_H\\n\"\n  \"#define HAVE_CONFIG_H 1\\n\"\n  \"#endif\\n\\n\");\n#endif\n\nfprintf(f,\n  \"#ifdef HAVE_CONFIG_H\\n\"\n  \"#include \\\"config.h\\\"\\n\"\n  \"#endif\\n\\n\"\n  \"#include \\\"pcre_internal.h\\\"\\n\\n\");\n\nfprintf(f,\n  \"const pcre_uint8 PRIV(default_tables)[] = {\\n\\n\"\n  \"/* This table is a lower casing table. */\\n\\n\");\n\nfprintf(f, \"  \");\nfor (i = 0; i < 256; i++)\n  {\n  if ((i & 7) == 0 && i != 0) fprintf(f, \"\\n  \");\n  fprintf(f, \"%3d\", *tables++);\n  if (i != 255) fprintf(f, \",\");\n  }\nfprintf(f, \",\\n\\n\");\n\nfprintf(f, \"/* This table is a case flipping table. */\\n\\n\");\n\nfprintf(f, \"  \");\nfor (i = 0; i < 256; i++)\n  {\n  if ((i & 7) == 0 && i != 0) fprintf(f, \"\\n  \");\n  fprintf(f, \"%3d\", *tables++);\n  if (i != 255) fprintf(f, \",\");\n  }\nfprintf(f, \",\\n\\n\");\n\nfprintf(f,\n  \"/* This table contains bit maps for various character classes.\\n\"\n  \"Each map is 32 bytes long and the bits run from the least\\n\"\n  \"significant end of each byte. The classes that have their own\\n\"\n  \"maps are: space, xdigit, digit, upper, lower, word, graph\\n\"\n  \"print, punct, and cntrl. Other classes are built from combinations. */\\n\\n\");\n\nfprintf(f, \"  \");\nfor (i = 0; i < cbit_length; i++)\n  {\n  if ((i & 7) == 0 && i != 0)\n    {\n    if ((i & 31) == 0) fprintf(f, \"\\n\");\n    fprintf(f, \"\\n  \");\n    }\n  fprintf(f, \"0x%02x\", *tables++);\n  if (i != cbit_length - 1) fprintf(f, \",\");\n  }\nfprintf(f, \",\\n\\n\");\n\nfprintf(f,\n  \"/* This table identifies various classes of character by individual bits:\\n\"\n  \"  0x%02x   white space character\\n\"\n  \"  0x%02x   letter\\n\"\n  \"  0x%02x   decimal digit\\n\"\n  \"  0x%02x   hexadecimal digit\\n\"\n  \"  0x%02x   alphanumeric or '_'\\n\"\n  \"  0x%02x   regular expression metacharacter or binary zero\\n*/\\n\\n\",\n  ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,\n  ctype_meta);\n\nfprintf(f, \"  \");\nfor (i = 0; i < 256; i++)\n  {\n  if ((i & 7) == 0 && i != 0)\n    {\n    fprintf(f, \" /* \");\n    if (isprint(i-8)) fprintf(f, \" %c -\", i-8);\n      else fprintf(f, \"%3d-\", i-8);\n    if (isprint(i-1)) fprintf(f, \" %c \", i-1);\n      else fprintf(f, \"%3d\", i-1);\n    fprintf(f, \" */\\n  \");\n    }\n  fprintf(f, \"0x%02x\", *tables++);\n  if (i != 255) fprintf(f, \",\");\n  }\n\nfprintf(f, \"};/* \");\nif (isprint(i-8)) fprintf(f, \" %c -\", i-8);\n  else fprintf(f, \"%3d-\", i-8);\nif (isprint(i-1)) fprintf(f, \" %c \", i-1);\n  else fprintf(f, \"%3d\", i-1);\nfprintf(f, \" */\\n\\n/* End of pcre_chartables.c */\\n\");\n\nfclose(f);\nfree((void *)base_of_tables);\nreturn 0;\n}\n\n/* End of dftables.c */\n"
  },
  {
    "path": "src/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt",
    "content": "Building PCRE without using autotools\n-------------------------------------\n\nNOTE: This document relates to PCRE releases that use the original API, with\nlibrary names libpcre, libpcre16, and libpcre32. January 2015 saw the first\nrelease of a new API, known as PCRE2, with release numbers starting at 10.00\nand library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries\n(now called PCRE1) are still being maintained for bug fixes, but there will be\nno new development. New projects are advised to use the new PCRE2 libraries.\n\n\nThis document contains the following sections:\n\n  General\n  Generic instructions for the PCRE C library\n  The C++ wrapper functions\n  Building for virtual Pascal\n  Stack size in Windows environments\n  Linking programs in Windows environments\n  Calling conventions in Windows environments\n  Comments about Win32 builds\n  Building PCRE on Windows with CMake\n  Use of relative paths with CMake on Windows\n  Testing with RunTest.bat\n  Building under Windows CE with Visual Studio 200x\n  Building under Windows with BCC5.5\n  Building using Borland C++ Builder 2007 (CB2007) and higher\n  Building PCRE on OpenVMS\n  Building PCRE on Stratus OpenVOS\n  Building PCRE on native z/OS and z/VM\n\n\nGENERAL\n\nI (Philip Hazel) have no experience of Windows or VMS sytems and how their\nlibraries work. The items in the PCRE distribution and Makefile that relate to\nanything other than Linux systems are untested by me.\n\nThere are some other comments and files (including some documentation in CHM\nformat) in the Contrib directory on the FTP site:\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib\n\nThe basic PCRE library consists entirely of code written in Standard C, and so\nshould compile successfully on any system that has a Standard C compiler and\nlibrary. The C++ wrapper functions are a separate issue (see below).\n\nThe PCRE distribution includes a \"configure\" file for use by the configure/make\n(autotools) build system, as found in many Unix-like environments. The README\nfile contains information about the options for \"configure\".\n\nThere is also support for CMake, which some users prefer, especially in Windows\nenvironments, though it can also be run in Unix-like environments. See the\nsection entitled \"Building PCRE on Windows with CMake\" below.\n\nVersions of config.h and pcre.h are distributed in the PCRE tarballs under the\nnames config.h.generic and pcre.h.generic. These are provided for those who\nbuild PCRE without using \"configure\" or CMake. If you use \"configure\" or CMake,\nthe .generic versions are not used.\n\n\nGENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY\n\nThe following are generic instructions for building the PCRE C library \"by\nhand\". If you are going to use CMake, this section does not apply to you; you\ncan skip ahead to the CMake section.\n\n (1) Copy or rename the file config.h.generic as config.h, and edit the macro\n     settings that it contains to whatever is appropriate for your environment.\n\n     In particular, you can alter the definition of the NEWLINE macro to\n     specify what character(s) you want to be interpreted as line terminators.\n     In an EBCDIC environment, you MUST change NEWLINE, because its default\n     value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15,\n     NL), though in some cases it may be 37 (0x25).\n\n     When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H\n     to your compiler so that config.h is included in the sources.\n\n     An alternative approach is not to edit config.h, but to use -D on the\n     compiler command line to make any changes that you need to the\n     configuration options. In this case -DHAVE_CONFIG_H must not be set.\n\n     NOTE: There have been occasions when the way in which certain parameters\n     in config.h are used has changed between releases. (In the configure/make\n     world, this is handled automatically.) When upgrading to a new release,\n     you are strongly advised to review config.h.generic before re-using what\n     you had previously.\n\n (2) Copy or rename the file pcre.h.generic as pcre.h.\n\n (3) EITHER:\n       Copy or rename file pcre_chartables.c.dist as pcre_chartables.c.\n\n     OR:\n       Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if\n       you have set up config.h), and then run it with the single argument\n       \"pcre_chartables.c\". This generates a set of standard character tables\n       and writes them to that file. The tables are generated using the default\n       C locale for your system. If you want to use a locale that is specified\n       by LC_xxx environment variables, add the -L option to the dftables\n       command. You must use this method if you are building on a system that\n       uses EBCDIC code.\n\n     The tables in pcre_chartables.c are defaults. The caller of PCRE can\n     specify alternative tables at run time.\n\n (4) Ensure that you have the following header files:\n\n       pcre_internal.h\n       ucp.h\n\n (5) For an 8-bit library, compile the following source files, setting\n     -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your\n     configuration, or else use other -D settings to change the configuration\n     as required.\n\n       pcre_byte_order.c\n       pcre_chartables.c\n       pcre_compile.c\n       pcre_config.c\n       pcre_dfa_exec.c\n       pcre_exec.c\n       pcre_fullinfo.c\n       pcre_get.c\n       pcre_globals.c\n       pcre_jit_compile.c\n       pcre_maketables.c\n       pcre_newline.c\n       pcre_ord2utf8.c\n       pcre_refcount.c\n       pcre_string_utils.c\n       pcre_study.c\n       pcre_tables.c\n       pcre_ucd.c\n       pcre_valid_utf8.c\n       pcre_version.c\n       pcre_xclass.c\n\n     Make sure that you include -I. in the compiler command (or equivalent for\n     an unusual compiler) so that all included PCRE header files are first\n     sought in the current directory. Otherwise you run the risk of picking up\n     a previously-installed file from somewhere else.\n\n     Note that you must still compile pcre_jit_compile.c, even if you have not\n     defined SUPPORT_JIT in config.h, because when JIT support is not\n     configured, dummy functions are compiled. When JIT support IS configured,\n     pcre_jit_compile.c #includes sources from the sljit subdirectory, where\n     there should be 16 files, all of whose names begin with \"sljit\".\n\n (6) Now link all the compiled code into an object library in whichever form\n     your system keeps such libraries. This is the basic PCRE C 8-bit library.\n     If your system has static and shared libraries, you may have to do this\n     once for each type.\n\n (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit\n     or 32-bit libraries) repeat steps 5-6 with the following files:\n\n       pcre16_byte_order.c\n       pcre16_chartables.c\n       pcre16_compile.c\n       pcre16_config.c\n       pcre16_dfa_exec.c\n       pcre16_exec.c\n       pcre16_fullinfo.c\n       pcre16_get.c\n       pcre16_globals.c\n       pcre16_jit_compile.c\n       pcre16_maketables.c\n       pcre16_newline.c\n       pcre16_ord2utf16.c\n       pcre16_refcount.c\n       pcre16_string_utils.c\n       pcre16_study.c\n       pcre16_tables.c\n       pcre16_ucd.c\n       pcre16_utf16_utils.c\n       pcre16_valid_utf16.c\n       pcre16_version.c\n       pcre16_xclass.c\n\n (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit\n     or 16-bit libraries) repeat steps 5-6 with the following files:\n\n       pcre32_byte_order.c\n       pcre32_chartables.c\n       pcre32_compile.c\n       pcre32_config.c\n       pcre32_dfa_exec.c\n       pcre32_exec.c\n       pcre32_fullinfo.c\n       pcre32_get.c\n       pcre32_globals.c\n       pcre32_jit_compile.c\n       pcre32_maketables.c\n       pcre32_newline.c\n       pcre32_ord2utf32.c\n       pcre32_refcount.c\n       pcre32_string_utils.c\n       pcre32_study.c\n       pcre32_tables.c\n       pcre32_ucd.c\n       pcre32_utf32_utils.c\n       pcre32_valid_utf32.c\n       pcre32_version.c\n       pcre32_xclass.c\n\n (9) If you want to build the POSIX wrapper functions (which apply only to the\n     8-bit library), ensure that you have the pcreposix.h file and then compile\n     pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result\n     (on its own) as the pcreposix library.\n\n(10) The pcretest program can be linked with any combination of the 8-bit,\n     16-bit and 32-bit libraries (depending on what you selected in config.h).\n     Compile pcretest.c and pcre_printint.c (again, don't forget\n     -DHAVE_CONFIG_H) and link them together with the appropriate library/ies.\n     If you compiled an 8-bit library, pcretest also needs the pcreposix\n     wrapper library unless you compiled it with -DNOPOSIX.\n\n(11) Run pcretest on the testinput files in the testdata directory, and check\n     that the output matches the corresponding testoutput files. There are\n     comments about what each test does in the section entitled \"Testing PCRE\"\n     in the README file. If you compiled more than one of the 8-bit, 16-bit and\n     32-bit libraries, you need to run pcretest with the -16 option to do\n     16-bit tests and with the -32 option to do 32-bit tests.\n\n     Some tests are relevant only when certain build-time options are selected.\n     For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run\n     if you have built PCRE without it. See the comments at the start of each\n     testinput file. If you have a suitable Unix-like shell, the RunTest script\n     will run the appropriate tests for you. The command \"RunTest list\" will\n     output a list of all the tests.\n\n     Note that the supplied files are in Unix format, with just LF characters\n     as line terminators. You may need to edit them to change this if your\n     system uses a different convention. If you are using Windows, you probably\n     should use the wintestinput3 file instead of testinput3 (and the\n     corresponding output file). This is a locale test; wintestinput3 sets the\n     locale to \"french\" rather than \"fr_FR\", and there some minor output\n     differences.\n\n(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested\n     by the testdata files. However, you might also like to build and run\n     the freestanding JIT test program, pcre_jit_test.c.\n\n(13) If you want to use the pcregrep command, compile and link pcregrep.c; it\n     uses only the basic 8-bit PCRE library (it does not need the pcreposix\n     library).\n\n\nTHE C++ WRAPPER FUNCTIONS\n\nThe PCRE distribution also contains some C++ wrapper functions and tests,\napplicable to the 8-bit library, which were contributed by Google Inc. On a\nsystem that can use \"configure\" and \"make\", the functions are automatically\nbuilt into a library called pcrecpp. It should be straightforward to compile\nthe .cc files manually on other systems. The files called xxx_unittest.cc are\ntest programs for each of the corresponding xxx.cc files.\n\n\nBUILDING FOR VIRTUAL PASCAL\n\nA script for building PCRE using Borland's C++ compiler for use with VPASCAL\nwas contributed by Alexander Tokarev. Stefan Weber updated the script and added\nadditional files. The following files in the distribution are for building PCRE\nfor use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas.\n\n\nSTACK SIZE IN WINDOWS ENVIRONMENTS\n\nThe default processor stack size of 1Mb in some Windows environments is too\nsmall for matching patterns that need much recursion. In particular, test 2 may\nfail because of this. Normally, running out of stack causes a crash, but there\nhave been cases where the test program has just died silently. See your linker\ndocumentation for how to increase stack size if you experience problems. The\nLinux default of 8Mb is a reasonable choice for the stack, though even that can\nbe too small for some pattern/subject combinations.\n\nPCRE has a compile configuration option to disable the use of stack for\nrecursion so that heap is used instead. However, pattern matching is\nsignificantly slower when this is done. There is more about stack usage in the\n\"pcrestack\" documentation.\n\n\nLINKING PROGRAMS IN WINDOWS ENVIRONMENTS\n\nIf you want to statically link a program against a PCRE library in the form of\na non-dll .a file, you must define PCRE_STATIC before including pcre.h or\npcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will\nbe declared __declspec(dllimport), with unwanted results.\n\n\nCALLING CONVENTIONS IN WINDOWS ENVIRONMENTS\n\nIt is possible to compile programs to use different calling conventions using\nMSVC. Search the web for \"calling conventions\" for more information. To make it\neasier to change the calling convention for the exported functions in the\nPCRE library, the macro PCRE_CALL_CONVENTION is present in all the external\ndefinitions. It can be set externally when compiling (e.g. in CFLAGS). If it is\nnot set, it defaults to empty; the default calling convention is then used\n(which is what is wanted most of the time).\n\n\nCOMMENTS ABOUT WIN32 BUILDS (see also \"BUILDING PCRE ON WINDOWS WITH CMAKE\")\n\nThere are two ways of building PCRE using the \"configure, make, make install\"\nparadigm on Windows systems: using MinGW or using Cygwin. These are not at all\nthe same thing; they are completely different from each other. There is also\nsupport for building using CMake, which some users find a more straightforward\nway of building PCRE under Windows.\n\nThe MinGW home page (http://www.mingw.org/) says this:\n\n  MinGW: A collection of freely available and freely distributable Windows\n  specific header files and import libraries combined with GNU toolsets that\n  allow one to produce native Windows programs that do not rely on any\n  3rd-party C runtime DLLs.\n\nThe Cygwin home page (http://www.cygwin.com/) says this:\n\n  Cygwin is a Linux-like environment for Windows. It consists of two parts:\n\n  . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing\n    substantial Linux API functionality\n\n  . A collection of tools which provide Linux look and feel.\n\n  The Cygwin DLL currently works with all recent, commercially released x86 32\n  bit and 64 bit versions of Windows, with the exception of Windows CE.\n\nOn both MinGW and Cygwin, PCRE should build correctly using:\n\n  ./configure && make && make install\n\nThis should create two libraries called libpcre and libpcreposix, and, if you\nhave enabled building the C++ wrapper, a third one called libpcrecpp. These are\nindependent libraries: when you link with libpcreposix or libpcrecpp you must\nalso link with libpcre, which contains the basic functions. (Some earlier\nreleases of PCRE included the basic libpcre functions in libpcreposix. This no\nlonger happens.)\n\nA user submitted a special-purpose patch that makes it easy to create\n\"pcre.dll\" under mingw32 using the \"msys\" environment. It provides \"pcre.dll\"\nas a special target. If you use this target, no other files are built, and in\nparticular, the pcretest and pcregrep programs are not built. An example of how\nthis might be used is:\n\n  ./configure --enable-utf --disable-cpp CFLAGS=\"-03 -s\"; make pcre.dll\n\nUsing Cygwin's compiler generates libraries and executables that depend on\ncygwin1.dll. If a library that is generated this way is distributed,\ncygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL\nlicence, this forces not only PCRE to be under the GPL, but also the entire\napplication. A distributor who wants to keep their own code proprietary must\npurchase an appropriate Cygwin licence.\n\nMinGW has no such restrictions. The MinGW compiler generates a library or\nexecutable that can run standalone on Windows without any third party dll or\nlicensing issues.\n\nBut there is more complication:\n\nIf a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is\nto tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a\nfront end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's\ngcc and MinGW's gcc). So, a user can:\n\n. Build native binaries by using MinGW or by getting Cygwin and using\n  -mno-cygwin.\n\n. Build binaries that depend on cygwin1.dll by using Cygwin with the normal\n  compiler flags.\n\nThe test files that are supplied with PCRE are in UNIX format, with LF\ncharacters as line terminators. Unless your PCRE library uses a default newline\noption that includes LF as a valid newline, it may be necessary to change the\nline terminators in the test files to get some of the tests to work.\n\n\nBUILDING PCRE ON WINDOWS WITH CMAKE\n\nCMake is an alternative configuration facility that can be used instead of\n\"configure\". CMake creates project files (make files, solution files, etc.)\ntailored to numerous development environments, including Visual Studio,\nBorland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no\nspaces in the names for your CMake installation and your PCRE source and build\ndirectories.\n\nThe following instructions were contributed by a PCRE user. If they are not\nfollowed exactly, errors may occur. In the event that errors do occur, it is\nrecommended that you delete the CMake cache before attempting to repeat the\nCMake build process. In the CMake GUI, the cache can be deleted by selecting\n\"File > Delete Cache\".\n\n1.  Install the latest CMake version available from http://www.cmake.org/, and\n    ensure that cmake\\bin is on your path.\n\n2.  Unzip (retaining folder structure) the PCRE source tree into a source\n    directory such as C:\\pcre. You should ensure your local date and time\n    is not earlier than the file dates in your source dir if the release is\n    very new.\n\n3.  Create a new, empty build directory, preferably a subdirectory of the\n    source dir. For example, C:\\pcre\\pcre-xx\\build.\n\n4.  Run cmake-gui from the Shell envirornment of your build tool, for example,\n    Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try\n    to start Cmake from the Windows Start menu, as this can lead to errors.\n\n5.  Enter C:\\pcre\\pcre-xx and C:\\pcre\\pcre-xx\\build for the source and build\n    directories, respectively.\n\n6.  Hit the \"Configure\" button.\n\n7.  Select the particular IDE / build tool that you are using (Visual\n    Studio, MSYS makefiles, MinGW makefiles, etc.)\n\n8.  The GUI will then list several configuration options. This is where\n    you can enable UTF-8 support or other PCRE optional features.\n\n9.  Hit \"Configure\" again. The adjacent \"Generate\" button should now be\n    active.\n\n10. Hit \"Generate\".\n\n11. The build directory should now contain a usable build system, be it a\n    solution file for Visual Studio, makefiles for MinGW, etc. Exit from\n    cmake-gui and use the generated build system with your compiler or IDE.\n    E.g., for MinGW you can run \"make\", or for Visual Studio, open the PCRE\n    solution, select the desired configuration (Debug, or Release, etc.) and\n    build the ALL_BUILD project.\n\n12. If during configuration with cmake-gui you've elected to build the test\n    programs, you can execute them by building the test project. E.g., for\n    MinGW: \"make test\"; for Visual Studio build the RUN_TESTS project. The\n    most recent build configuration is targeted by the tests. A summary of\n    test results is presented. Complete test output is subsequently\n    available for review in Testing\\Temporary under your build dir.\n\n\nUSE OF RELATIVE PATHS WITH CMAKE ON WINDOWS\n\nA PCRE user comments as follows: I thought that others may want to know the\ncurrent state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is:\n\n-- AdditionalIncludeDirectories is only partially modified (only the\n   first path - see below)\n-- Only some of the contained file paths are modified - shown below for\n   pcre.vcproj\n-- It properly modifies\n\nI am sure CMake people can fix that if they want to. Until then one will\nneed to replace existing absolute paths in project files with relative\npaths manually (e.g. from VS) - relative to project file location. I did\njust that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big\ndeal.\n\nAdditionalIncludeDirectories=\"E:\\builds\\pcre\\build;E:\\builds\\pcre\\pcre-7.5;\"\nAdditionalIncludeDirectories=\".;E:\\builds\\pcre\\pcre-7.5;\"\n\nRelativePath=\"pcre.h\"\nRelativePath=\"pcre_chartables.c\"\nRelativePath=\"pcre_chartables.c.rule\"\n\n\nTESTING WITH RUNTEST.BAT\n\nIf configured with CMake, building the test project (\"make test\" or building\nALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending\non your configuration options, possibly other test programs) in the build\ndirectory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths.\n\nFor manual testing with RunTest.bat, provided the build dir is a subdirectory\nof the source directory: Open command shell window. Chdir to the location\nof your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with\n\"..\\RunTest.Bat\" or \"..\\..\\RunTest.bat\" as appropriate.\n\nTo run only a particular test with RunTest.Bat provide a test number argument.\n\nOtherwise:\n\n1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe\n   have been created.\n\n2. Edit RunTest.bat to indentify the full or relative location of\n   the pcre source (wherein which the testdata folder resides), e.g.:\n\n   set srcdir=C:\\pcre\\pcre-8.20\n\n3. In a Windows command environment, chdir to the location of your bat and\n   exe programs.\n\n4. Run RunTest.bat. Test outputs will automatically be compared to expected\n   results, and discrepancies will be identified in the console output.\n\nTo independently test the just-in-time compiler, run pcre_jit_test.exe.\nTo test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and\npcre_scanner_unittest.exe.\n\n\nBUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x\n\nVincent Richomme sent a zip archive of files to help with this process. They\ncan be found in the file \"pcre-vsbuild.zip\" in the Contrib directory of the FTP\nsite.\n\n\nBUILDING UNDER WINDOWS WITH BCC5.5\n\nMichael Roy sent these comments about building PCRE under Windows with BCC5.5:\n\nSome of the core BCC libraries have a version of PCRE from 1998 built in, which\ncan lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version\nmismatch. I'm including an easy workaround below, if you'd like to include it\nin the non-unix instructions:\n\nWhen linking a project with BCC5.5, pcre.lib must be included before any of the\nlibraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line.\n\n\nBUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER\n\nA PCRE user sent these comments about this environment (see also the comment\nfrom another user that follows them):\n\nThe XE versions of C++ Builder come with a RegularExpressionsCore class which\ncontain a version of TPerlRegEx. However, direct use of the C PCRE library may\nbe desirable.\n\nThe default makevp.bat, however, supplied with PCRE builds a version of PCRE\nthat is not usable with any version of C++ Builder because the compiler ships\nwith an embedded version of PCRE, version 2.01 from 1998! [See also the note\nabout BCC5.5 above.] If you want to use PCRE you'll need to rename the\nfunctions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just\nuse the 16 bit versions. I'm using std::wstring everywhere anyway. Since the\nembedded version of PCRE does not have the 16 bit function names, there is no\nconflict.\n\nBuilding PCRE using a C++ Builder static library project file (recommended):\n\n1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder\noriginal include path.\n\n2. Download PCRE from pcre.org and extract to a directory.\n\n3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to\npcre.h, and config.h.generic to config.h.\n\n4. Edit pcre.h and pcre_config.c so that they include config.h.\n\n5. Edit config.h like so:\n\nComment out the following lines:\n#define PACKAGE \"pcre\"\n#define PACKAGE_BUGREPORT \"\"\n#define PACKAGE_NAME \"PCRE\"\n#define PACKAGE_STRING \"PCRE 8.32\"\n#define PACKAGE_TARNAME \"pcre\"\n#define PACKAGE_URL \"\"\n#define PACKAGE_VERSION \"8.32\"\n\nAdd the following lines:\n#ifndef SUPPORT_UTF\n#define SUPPORT_UTF 100 // any value is fine\n#endif\n\n#ifndef SUPPORT_UCP\n#define SUPPORT_UCP 101 // any value is fine\n#endif\n\n#ifndef SUPPORT_UCP\n#define SUPPORT_PCRE16 102 // any value is fine\n#endif\n\n#ifndef SUPPORT_UTF8\n#define SUPPORT_UTF8 103 // any value is fine\n#endif\n\n6. Build a C++ Builder project using the IDE. Go to File / New / Other and\nchoose Static Library. You can name it pcre.cbproj or whatever. Now set your\npaths by going to Project / Options. Set the Include path. Do this from the\n\"Base\" option to apply to both Release and Debug builds. Now add the following\nfiles to the project:\n\npcre.h\npcre16_byte_order.c\npcre16_chartables.c\npcre16_compile.c\npcre16_config.c\npcre16_dfa_exec.c\npcre16_exec.c\npcre16_fullinfo.c\npcre16_get.c\npcre16_globals.c\npcre16_maketables.c\npcre16_newline.c\npcre16_ord2utf16.c\npcre16_printint.c\npcre16_refcount.c\npcre16_string_utils.c\npcre16_study.c\npcre16_tables.c\npcre16_ucd.c\npcre16_utf16_utils.c\npcre16_valid_utf16.c\npcre16_version.c\npcre16_xclass.c\n\n//Optional\npcre_version.c\n\n7. After compiling the .lib file, copy the .lib and header files to a project\nyou want to use PCRE with. Enjoy.\n\nOptional ... Building PCRE using the makevp.bat file:\n\n1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit\nversions.\n\n2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat.\n\nAnother PCRE user added this comment:\n\nAnother approach I successfully used for some years with BCB 5 and 6 was to\nmake sure that include and library paths of PCRE are configured before the\ndefault paths of the IDE in the dialogs where one can manage those paths.\nAfterwards one can open the project files using a text editor and manually add\nthe self created library for pcre itself, pcrecpp doesn't ship with the IDE, in\nthe library nodes where the IDE manages its own libraries to link against in\nfront of the IDE-own libraries. This way one can use the default PCRE function\nnames without getting access violations on runtime.\n\n  <ALLLIB value=\"libpcre.lib $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib\"/>\n\n\nBUILDING PCRE ON OPENVMS\n\nStephen Hoffman sent the following, in December 2012:\n\n\"Here <http://labs.hoffmanlabs.com/node/1847> is a very short write-up on the\nOpenVMS port and here\n\n<http://labs.hoffmanlabs.com/labsnotes/pcre-vms-8_32.zip>\n\nis a zip with the OpenVMS files, and with one modified testing-related PCRE\nfile.\" This is a port of PCRE 8.32.\n\nEarlier, Dan Mooney sent the following comments about building PCRE on OpenVMS.\nThey relate to an older version of PCRE that used fewer source files, so the\nexact commands will need changing. See the current list of source files above.\n\n\"It was quite easy to compile and link the library. I don't have a formal\nmake file but the attached file [reproduced below] contains the OpenVMS DCL\ncommands I used to build the library. I had to add #define\nPOSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere.\n\nThe library was built on:\nO/S: HP OpenVMS v7.3-1\nCompiler: Compaq C v6.5-001-48BCD\nLinker: vA13-01\n\nThe test results did not match 100% due to the issues you mention in your\ndocumentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I\nmodified some of the character tables temporarily and was able to get the\nresults to match. Tests using the fr locale did not match since I don't have\nthat locale loaded. The study size was always reported to be 3 less than the\nvalue in the standard test output files.\"\n\n=========================\n$! This DCL procedure builds PCRE on OpenVMS\n$!\n$! I followed the instructions in the non-unix-use file in the distribution.\n$!\n$ COMPILE == \"CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES\n$ COMPILE DFTABLES.C\n$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ\n$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C\n$ COMPILE MAKETABLES.C\n$ COMPILE GET.C\n$ COMPILE STUDY.C\n$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol\n$! did not seem to be defined anywhere.\n$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support.\n$ COMPILE PCRE.C\n$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ\n$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol\n$! did not seem to be defined anywhere.\n$ COMPILE PCREPOSIX.C\n$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ\n$ COMPILE PCRETEST.C\n$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB\n$! C programs that want access to command line arguments must be\n$! defined as a symbol\n$ PCRETEST :== \"$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE\"\n$! Arguments must be enclosed in quotes.\n$ PCRETEST \"-C\"\n$! Test results:\n$!\n$!   The test results did not match 100%. The functions isprint(), iscntrl(),\n$!   isgraph() and ispunct() on OpenVMS must not produce the same results\n$!   as the system that built the test output files provided with the\n$!   distribution.\n$!\n$!   The study size did not match and was always 3 less on OpenVMS.\n$!\n$!   Locale could not be set to fr\n$!\n=========================\n\n\nBUILDING PCRE ON STRATUS OPENVOS\n\nThese notes on the port of PCRE to VOS (lightly edited) were supplied by\nAshutosh Warikoo, whose email address has the local part awarikoo and the\ndomain nse.co.in. The port was for version 7.9 in August 2009.\n\n1.   Building PCRE\n\nI built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any\nproblems. I used the following packages to build PCRE:\n\n  ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz\n\nPlease read and follow the instructions that come with these packages. To start\nthe build of pcre, from the root of the package type:\n\n  ./build.sh\n\n2. Installing PCRE\n\nOnce you have successfully built PCRE, login to the SysAdmin group, switch to\nthe root user, and type\n\n  [ !create_dir (master_disk)>usr   --if needed ]\n  [ !create_dir (master_disk)>usr>local   --if needed ]\n    !gmake install\n\nThis installs PCRE and its man pages into /usr/local. You can add\n(master_disk)>usr>local>bin to your command search paths, or if you are in\nBASH, add /usr/local/bin to the PATH environment variable.\n\n4. Restrictions\n\nThis port requires readline library optionally. However during the build I\nfaced some yet unexplored errors while linking with readline. As it was an\noptional component I chose to disable it.\n\n5. Known Problems\n\nI ran the test suite, but you will have to be your own judge of whether this\ncommand, and this port, suits your purposes. If you find any problems that\nappear to be related to the port itself, please let me know. Please see the\nbuild.log file in the root of the package also.\n\n\nBUILDING PCRE ON NATIVE Z/OS AND Z/VM\n\nz/OS and z/VM are operating systems for mainframe computers, produced by IBM.\nThe character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and\napplications can be supported through UNIX System Services, and in such an\nenvironment PCRE can be built in the same way as in other systems. However, in\nnative z/OS (without UNIX System Services) and in z/VM, special ports are\nrequired. PCRE1 version 8.39 is available in file 882 on this site:\n\n  http://www.cbttape.org\n\nEverything, source and executable, is in EBCDIC and native z/OS file formats.\nHowever, this software is not maintained and will not be upgraded. If you are\nnew to PCRE you should be looking at PCRE2 (version 10.30 or later).\n\n===============================\nLast Updated: 13 September 2017\n===============================\n"
  },
  {
    "path": "src/pcre/doc/html/README.txt",
    "content": "README file for PCRE (Perl-compatible regular expression library)\n-----------------------------------------------------------------\n\nNOTE: This set of files relates to PCRE releases that use the original API,\nwith library names libpcre, libpcre16, and libpcre32. January 2015 saw the\nfirst release of a new API, known as PCRE2, with release numbers starting at\n10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old\nlibraries (now called PCRE1) are still being maintained for bug fixes, but\nthere will be no new development. New projects are advised to use the new PCRE2\nlibraries.\n\n\nThe latest release of PCRE1 is always available in three alternative formats\nfrom:\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip\n\nThere is a mailing list for discussion about the development of PCRE at\npcre-dev@exim.org. You can access the archives and subscribe or manage your\nsubscription here:\n\n   https://lists.exim.org/mailman/listinfo/pcre-dev\n\nPlease read the NEWS file if you are upgrading from a previous release.\nThe contents of this README file are:\n\n  The PCRE APIs\n  Documentation for PCRE\n  Contributions by users of PCRE\n  Building PCRE on non-Unix-like systems\n  Building PCRE without using autotools\n  Building PCRE using autotools\n  Retrieving configuration information\n  Shared libraries\n  Cross-compiling using autotools\n  Using HP's ANSI C++ compiler (aCC)\n  Compiling in Tru64 using native compilers\n  Using Sun's compilers for Solaris\n  Using PCRE from MySQL\n  Making new tarballs\n  Testing PCRE\n  Character tables\n  File manifest\n\n\nThe PCRE APIs\n-------------\n\nPCRE is written in C, and it has its own API. There are three sets of\nfunctions, one for the 8-bit library, which processes strings of bytes, one for\nthe 16-bit library, which processes strings of 16-bit values, and one for the\n32-bit library, which processes strings of 32-bit values. The distribution also\nincludes a set of C++ wrapper functions (see the pcrecpp man page for details),\ncourtesy of Google Inc., which can be used to call the 8-bit PCRE library from\nC++. Other C++ wrappers have been created from time to time. See, for example:\nhttps://github.com/YasserAsmi/regexp, which aims to be simple and similar in\nstyle to the C API.\n\nThe distribution also contains a set of C wrapper functions (again, just for\nthe 8-bit library) that are based on the POSIX regular expression API (see the\npcreposix man page). These end up in the library called libpcreposix. Note that\nthis just provides a POSIX calling interface to PCRE; the regular expressions\nthemselves still follow Perl syntax and semantics. The POSIX API is restricted,\nand does not give full access to all of PCRE's facilities.\n\nThe header file for the POSIX-style functions is called pcreposix.h. The\nofficial POSIX name is regex.h, but I did not want to risk possible problems\nwith existing files of that name by distributing it that way. To use PCRE with\nan existing program that uses the POSIX API, pcreposix.h will have to be\nrenamed or pointed at by a link.\n\nIf you are using the POSIX interface to PCRE and there is already a POSIX regex\nlibrary installed on your system, as well as worrying about the regex.h header\nfile (as mentioned above), you must also take care when linking programs to\nensure that they link with PCRE's libpcreposix library. Otherwise they may pick\nup the POSIX functions of the same name from the other library.\n\nOne way of avoiding this confusion is to compile PCRE with the addition of\n-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the\ncompiler flags (CFLAGS if you are using \"configure\" -- see below). This has the\neffect of renaming the functions so that the names no longer clash. Of course,\nyou have to do the same thing for your applications, or write them using the\nnew names.\n\n\nDocumentation for PCRE\n----------------------\n\nIf you install PCRE in the normal way on a Unix-like system, you will end up\nwith a set of man pages whose names all start with \"pcre\". The one that is just\ncalled \"pcre\" lists all the others. In addition to these man pages, the PCRE\ndocumentation is supplied in two other forms:\n\n  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and\n     doc/pcretest.txt in the source distribution. The first of these is a\n     concatenation of the text forms of all the section 3 man pages except\n     the listing of pcredemo.c and those that summarize individual functions.\n     The other two are the text forms of the section 1 man pages for the\n     pcregrep and pcretest commands. These text forms are provided for ease of\n     scanning with text editors or similar tools. They are installed in\n     <prefix>/share/doc/pcre, where <prefix> is the installation prefix\n     (defaulting to /usr/local).\n\n  2. A set of files containing all the documentation in HTML form, hyperlinked\n     in various ways, and rooted in a file called index.html, is distributed in\n     doc/html and installed in <prefix>/share/doc/pcre/html.\n\nUsers of PCRE have contributed files containing the documentation for various\nreleases in CHM format. These can be found in the Contrib directory of the FTP\nsite (see next section).\n\n\nContributions by users of PCRE\n------------------------------\n\nYou can find contributions from PCRE users in the directory\n\n  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib\n\nThere is a README file giving brief descriptions of what they are. Some are\ncomplete in themselves; others are pointers to URLs containing relevant files.\nSome of this material is likely to be well out-of-date. Several of the earlier\ncontributions provided support for compiling PCRE on various flavours of\nWindows (I myself do not use Windows). Nowadays there is more Windows support\nin the standard distribution, so these contibutions have been archived.\n\nA PCRE user maintains downloadable Windows binaries of the pcregrep and\npcretest programs here:\n\n  http://www.rexegg.com/pcregrep-pcretest.html\n\n\nBuilding PCRE on non-Unix-like systems\n--------------------------------------\n\nFor a non-Unix-like system, please read the comments in the file\nNON-AUTOTOOLS-BUILD, though if your system supports the use of \"configure\" and\n\"make\" you may be able to build PCRE using autotools in the same way as for\nmany Unix-like systems.\n\nPCRE can also be configured using the GUI facility provided by CMake's\ncmake-gui command. This creates Makefiles, solution files, etc. The file\nNON-AUTOTOOLS-BUILD has information about CMake.\n\nPCRE has been compiled on many different operating systems. It should be\nstraightforward to build PCRE on any system that has a Standard C compiler and\nlibrary, because it uses only Standard C functions.\n\n\nBuilding PCRE without using autotools\n-------------------------------------\n\nThe use of autotools (in particular, libtool) is problematic in some\nenvironments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD\nfile for ways of building PCRE without using autotools.\n\n\nBuilding PCRE using autotools\n-----------------------------\n\nIf you are using HP's ANSI C++ compiler (aCC), please see the special note\nin the section entitled \"Using HP's ANSI C++ compiler (aCC)\" below.\n\nThe following instructions assume the use of the widely used \"configure; make;\nmake install\" (autotools) process.\n\nTo build PCRE on system that supports autotools, first run the \"configure\"\ncommand from the PCRE distribution directory, with your current directory set\nto the directory where you want the files to be created. This command is a\nstandard GNU \"autoconf\" configuration script, for which generic instructions\nare supplied in the file INSTALL.\n\nMost commonly, people build PCRE within its own distribution directory, and in\nthis case, on many systems, just running \"./configure\" is sufficient. However,\nthe usual methods of changing standard defaults are available. For example:\n\nCFLAGS='-O2 -Wall' ./configure --prefix=/opt/local\n\nThis command specifies that the C compiler should be run with the flags '-O2\n-Wall' instead of the default, and that \"make install\" should install PCRE\nunder /opt/local instead of the default /usr/local.\n\nIf you want to build in a different directory, just run \"configure\" with that\ndirectory as current. For example, suppose you have unpacked the PCRE source\ninto /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:\n\ncd /build/pcre/pcre-xxx\n/source/pcre/pcre-xxx/configure\n\nPCRE is written in C and is normally compiled as a C library. However, it is\npossible to build it as a C++ library, though the provided building apparatus\ndoes not have any features to support this.\n\nThere are some optional features that can be included or omitted from the PCRE\nlibrary. They are also documented in the pcrebuild man page.\n\n. By default, both shared and static libraries are built. You can change this\n  by adding one of these options to the \"configure\" command:\n\n  --disable-shared\n  --disable-static\n\n  (See also \"Shared libraries on Unix-like systems\" below.)\n\n. By default, only the 8-bit library is built. If you add --enable-pcre16 to\n  the \"configure\" command, the 16-bit library is also built. If you add\n  --enable-pcre32 to the \"configure\" command, the 32-bit library is also built.\n  If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable\n  building the 8-bit library.\n\n. If you are building the 8-bit library and want to suppress the building of\n  the C++ wrapper library, you can add --disable-cpp to the \"configure\"\n  command. Otherwise, when \"configure\" is run without --disable-pcre8, it will\n  try to find a C++ compiler and C++ header files, and if it succeeds, it will\n  try to build the C++ wrapper.\n\n. If you want to include support for just-in-time compiling, which can give\n  large performance improvements on certain platforms, add --enable-jit to the\n  \"configure\" command. This support is available only for certain hardware\n  architectures. If you try to enable it on an unsupported architecture, there\n  will be a compile time error.\n\n. When JIT support is enabled, pcregrep automatically makes use of it, unless\n  you add --disable-pcregrep-jit to the \"configure\" command.\n\n. If you want to make use of the support for UTF-8 Unicode character strings in\n  the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library,\n  or UTF-32 Unicode character strings in the 32-bit library, you must add\n  --enable-utf to the \"configure\" command. Without it, the code for handling\n  UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even\n  when --enable-utf is included, the use of a UTF encoding still has to be\n  enabled by an option at run time. When PCRE is compiled with this option, its\n  input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC\n  platforms. It is not possible to use both --enable-utf and --enable-ebcdic at\n  the same time.\n\n. There are no separate options for enabling UTF-8, UTF-16 and UTF-32\n  independently because that would allow ridiculous settings such as requesting\n  UTF-16 support while building only the 8-bit library. However, the option\n  --enable-utf8 is retained for backwards compatibility with earlier releases\n  that did not support 16-bit or 32-bit character strings. It is synonymous with\n  --enable-utf. It is not possible to configure one library with UTF support\n  and the other without in the same configuration.\n\n. If, in addition to support for UTF-8/16/32 character strings, you want to\n  include support for the \\P, \\p, and \\X sequences that recognize Unicode\n  character properties, you must add --enable-unicode-properties to the\n  \"configure\" command. This adds about 30K to the size of the library (in the\n  form of a property table); only the basic two-letter properties such as Lu\n  are supported.\n\n. You can build PCRE to recognize either CR or LF or the sequence CRLF or any\n  of the preceding, or any of the Unicode newline sequences as indicating the\n  end of a line. Whatever you specify at build time is the default; the caller\n  of PCRE can change the selection at run time. The default newline indicator\n  is a single LF character (the Unix standard). You can specify the default\n  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf\n  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or\n  --enable-newline-is-any to the \"configure\" command, respectively.\n\n  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of\n  the standard tests will fail, because the lines in the test files end with\n  LF. Even if the files are edited to change the line endings, there are likely\n  to be some failures. With --enable-newline-is-anycrlf or\n  --enable-newline-is-any, many tests should succeed, but there may be some\n  failures.\n\n. By default, the sequence \\R in a pattern matches any Unicode line ending\n  sequence. This is independent of the option specifying what PCRE considers to\n  be the end of a line (see above). However, the caller of PCRE can restrict \\R\n  to match only CR, LF, or CRLF. You can make this the default by adding\n  --enable-bsr-anycrlf to the \"configure\" command (bsr = \"backslash R\").\n\n. When called via the POSIX interface, PCRE uses malloc() to get additional\n  storage for processing capturing parentheses if there are more than 10 of\n  them in a pattern. You can increase this threshold by setting, for example,\n\n  --with-posix-malloc-threshold=20\n\n  on the \"configure\" command.\n\n. PCRE has a counter that limits the depth of nesting of parentheses in a\n  pattern. This limits the amount of system stack that a pattern uses when it\n  is compiled. The default is 250, but you can change it by setting, for\n  example,\n\n  --with-parens-nest-limit=500\n\n. PCRE has a counter that can be set to limit the amount of resources it uses\n  when matching a pattern. If the limit is exceeded during a match, the match\n  fails. The default is ten million. You can change the default by setting, for\n  example,\n\n  --with-match-limit=500000\n\n  on the \"configure\" command. This is just the default; individual calls to\n  pcre_exec() can supply their own value. There is more discussion on the\n  pcreapi man page.\n\n. There is a separate counter that limits the depth of recursive function calls\n  during a matching process. This also has a default of ten million, which is\n  essentially \"unlimited\". You can change the default by setting, for example,\n\n  --with-match-limit-recursion=500000\n\n  Recursive function calls use up the runtime stack; running out of stack can\n  cause programs to crash in strange ways. There is a discussion about stack\n  sizes in the pcrestack man page.\n\n. The default maximum compiled pattern size is around 64K. You can increase\n  this by adding --with-link-size=3 to the \"configure\" command. In the 8-bit\n  library, PCRE then uses three bytes instead of two for offsets to different\n  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is\n  the same as --with-link-size=4, which (in both libraries) uses four-byte\n  offsets. Increasing the internal link size reduces performance. In the 32-bit\n  library, the only supported link size is 4.\n\n. You can build PCRE so that its internal match() function that is called from\n  pcre_exec() does not call itself recursively. Instead, it uses memory blocks\n  obtained from the heap via the special functions pcre_stack_malloc() and\n  pcre_stack_free() to save data that would otherwise be saved on the stack. To\n  build PCRE like this, use\n\n  --disable-stack-for-recursion\n\n  on the \"configure\" command. PCRE runs more slowly in this mode, but it may be\n  necessary in environments with limited stack sizes. This applies only to the\n  normal execution of the pcre_exec() function; if JIT support is being\n  successfully used, it is not relevant. Equally, it does not apply to\n  pcre_dfa_exec(), which does not use deeply nested recursion. There is a\n  discussion about stack sizes in the pcrestack man page.\n\n. For speed, PCRE uses four tables for manipulating and identifying characters\n  whose code point values are less than 256. By default, it uses a set of\n  tables for ASCII encoding that is part of the distribution. If you specify\n\n  --enable-rebuild-chartables\n\n  a program called dftables is compiled and run in the default C locale when\n  you obey \"make\". It builds a source file called pcre_chartables.c. If you do\n  not specify this option, pcre_chartables.c is created as a copy of\n  pcre_chartables.c.dist. See \"Character tables\" below for further information.\n\n. It is possible to compile PCRE for use on systems that use EBCDIC as their\n  character code (as opposed to ASCII/Unicode) by specifying\n\n  --enable-ebcdic\n\n  This automatically implies --enable-rebuild-chartables (see above). However,\n  when PCRE is built this way, it always operates in EBCDIC. It cannot support\n  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,\n  which specifies that the code value for the EBCDIC NL character is 0x25\n  instead of the default 0x15.\n\n. In environments where valgrind is installed, if you specify\n\n  --enable-valgrind\n\n  PCRE will use valgrind annotations to mark certain memory regions as\n  unaddressable. This allows it to detect invalid memory accesses, and is\n  mostly useful for debugging PCRE itself.\n\n. In environments where the gcc compiler is used and lcov version 1.6 or above\n  is installed, if you specify\n\n  --enable-coverage\n\n  the build process implements a code coverage report for the test suite. The\n  report is generated by running \"make coverage\". If ccache is installed on\n  your system, it must be disabled when building PCRE for coverage reporting.\n  You can do this by setting the environment variable CCACHE_DISABLE=1 before\n  running \"make\" to build PCRE. There is more information about coverage\n  reporting in the \"pcrebuild\" documentation.\n\n. The pcregrep program currently supports only 8-bit data files, and so\n  requires the 8-bit PCRE library. It is possible to compile pcregrep to use\n  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by\n  specifying one or both of\n\n  --enable-pcregrep-libz\n  --enable-pcregrep-libbz2\n\n  Of course, the relevant libraries must be installed on your system.\n\n. The default size (in bytes) of the internal buffer used by pcregrep can be\n  set by, for example:\n\n  --with-pcregrep-bufsize=51200\n\n  The value must be a plain integer. The default is 20480.\n\n. It is possible to compile pcretest so that it links with the libreadline\n  or libedit libraries, by specifying, respectively,\n\n  --enable-pcretest-libreadline or --enable-pcretest-libedit\n\n  If this is done, when pcretest's input is from a terminal, it reads it using\n  the readline() function. This provides line-editing and history facilities.\n  Note that libreadline is GPL-licenced, so if you distribute a binary of\n  pcretest linked in this way, there may be licensing issues. These can be\n  avoided by linking with libedit (which has a BSD licence) instead.\n\n  Enabling libreadline causes the -lreadline option to be added to the pcretest\n  build. In many operating environments with a sytem-installed readline\n  library this is sufficient. However, in some environments (e.g. if an\n  unmodified distribution version of readline is in use), it may be necessary\n  to specify something like LIBS=\"-lncurses\" as well. This is because, to quote\n  the readline INSTALL, \"Readline uses the termcap functions, but does not link\n  with the termcap or curses library itself, allowing applications which link\n  with readline the to choose an appropriate library.\" If you get error\n  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,\n  this is the problem, and linking with the ncurses library should fix it.\n\nThe \"configure\" script builds the following files for the basic C library:\n\n. Makefile             the makefile that builds the library\n. config.h             build-time configuration options for the library\n. pcre.h               the public PCRE header file\n. pcre-config          script that shows the building settings such as CFLAGS\n                         that were set for \"configure\"\n. libpcre.pc         ) data for the pkg-config command\n. libpcre16.pc       )\n. libpcre32.pc       )\n. libpcreposix.pc    )\n. libtool              script that builds shared and/or static libraries\n\nVersions of config.h and pcre.h are distributed in the PCRE tarballs under the\nnames config.h.generic and pcre.h.generic. These are provided for those who\nhave to built PCRE without using \"configure\" or CMake. If you use \"configure\"\nor CMake, the .generic versions are not used.\n\nWhen building the 8-bit library, if a C++ compiler is found, the following\nfiles are also built:\n\n. libpcrecpp.pc        data for the pkg-config command\n. pcrecpparg.h         header file for calling PCRE via the C++ wrapper\n. pcre_stringpiece.h   header for the C++ \"stringpiece\" functions\n\nThe \"configure\" script also creates config.status, which is an executable\nscript that can be run to recreate the configuration, and config.log, which\ncontains compiler output from tests that \"configure\" runs.\n\nOnce \"configure\" has run, you can run \"make\". This builds the the libraries\nlibpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you\nenabled JIT support with --enable-jit, a test program called pcre_jit_test is\nbuilt as well.\n\nIf the 8-bit library is built, libpcreposix and the pcregrep command are also\nbuilt, and if a C++ compiler was found on your system, and you did not disable\nit with --disable-cpp, \"make\" builds the C++ wrapper library, which is called\nlibpcrecpp, as well as some test programs called pcrecpp_unittest,\npcre_scanner_unittest, and pcre_stringpiece_unittest.\n\nThe command \"make check\" runs all the appropriate tests. Details of the PCRE\ntests are given below in a separate section of this document.\n\nYou can use \"make install\" to install PCRE into live directories on your\nsystem. The following are installed (file names are all relative to the\n<prefix> that is set when \"configure\" is run):\n\n  Commands (bin):\n    pcretest\n    pcregrep (if 8-bit support is enabled)\n    pcre-config\n\n  Libraries (lib):\n    libpcre16     (if 16-bit support is enabled)\n    libpcre32     (if 32-bit support is enabled)\n    libpcre       (if 8-bit support is enabled)\n    libpcreposix  (if 8-bit support is enabled)\n    libpcrecpp    (if 8-bit and C++ support is enabled)\n\n  Configuration information (lib/pkgconfig):\n    libpcre16.pc\n    libpcre32.pc\n    libpcre.pc\n    libpcreposix.pc\n    libpcrecpp.pc (if C++ support is enabled)\n\n  Header files (include):\n    pcre.h\n    pcreposix.h\n    pcre_scanner.h      )\n    pcre_stringpiece.h  ) if C++ support is enabled\n    pcrecpp.h           )\n    pcrecpparg.h        )\n\n  Man pages (share/man/man{1,3}):\n    pcregrep.1\n    pcretest.1\n    pcre-config.1\n    pcre.3\n    pcre*.3 (lots more pages, all starting \"pcre\")\n\n  HTML documentation (share/doc/pcre/html):\n    index.html\n    *.html (lots more pages, hyperlinked from index.html)\n\n  Text file documentation (share/doc/pcre):\n    AUTHORS\n    COPYING\n    ChangeLog\n    LICENCE\n    NEWS\n    README\n    pcre.txt         (a concatenation of the man(3) pages)\n    pcretest.txt     the pcretest man page\n    pcregrep.txt     the pcregrep man page\n    pcre-config.txt  the pcre-config man page\n\nIf you want to remove PCRE from your system, you can run \"make uninstall\".\nThis removes all the files that \"make install\" installed. However, it does not\nremove any directories, because these are often shared with other programs.\n\n\nRetrieving configuration information\n------------------------------------\n\nRunning \"make install\" installs the command pcre-config, which can be used to\nrecall information about the PCRE configuration and installation. For example:\n\n  pcre-config --version\n\nprints the version number, and\n\n  pcre-config --libs\n\noutputs information about where the library is installed. This command can be\nincluded in makefiles for programs that use PCRE, saving the programmer from\nhaving to remember too many details.\n\nThe pkg-config command is another system for saving and retrieving information\nabout installed libraries. Instead of separate commands for each library, a\nsingle command is used. For example:\n\n  pkg-config --cflags pcre\n\nThe data is held in *.pc files that are installed in a directory called\n<prefix>/lib/pkgconfig.\n\n\nShared libraries\n----------------\n\nThe default distribution builds PCRE as shared libraries and static libraries,\nas long as the operating system supports shared libraries. Shared library\nsupport relies on the \"libtool\" script which is built as part of the\n\"configure\" process.\n\nThe libtool script is used to compile and link both shared and static\nlibraries. They are placed in a subdirectory called .libs when they are newly\nbuilt. The programs pcretest and pcregrep are built to use these uninstalled\nlibraries (by means of wrapper scripts in the case of shared libraries). When\nyou use \"make install\" to install shared libraries, pcregrep and pcretest are\nautomatically re-built to use the newly installed shared libraries before being\ninstalled themselves. However, the versions left in the build directory still\nuse the uninstalled libraries.\n\nTo build PCRE using static libraries only you must use --disable-shared when\nconfiguring it. For example:\n\n./configure --prefix=/usr/gnu --disable-shared\n\nThen run \"make\" in the usual way. Similarly, you can use --disable-static to\nbuild only shared libraries.\n\n\nCross-compiling using autotools\n-------------------------------\n\nYou can specify CC and CFLAGS in the normal way to the \"configure\" command, in\norder to cross-compile PCRE for some other host. However, you should NOT\nspecify --enable-rebuild-chartables, because if you do, the dftables.c source\nfile is compiled and run on the local host, in order to generate the inbuilt\ncharacter tables (the pcre_chartables.c file). This will probably not work,\nbecause dftables.c needs to be compiled with the local compiler, not the cross\ncompiler.\n\nWhen --enable-rebuild-chartables is not specified, pcre_chartables.c is created\nby making a copy of pcre_chartables.c.dist, which is a default set of tables\nthat assumes ASCII code. Cross-compiling with the default tables should not be\na problem.\n\nIf you need to modify the character tables when cross-compiling, you should\nmove pcre_chartables.c.dist out of the way, then compile dftables.c by hand and\nrun it on the local host to make a new version of pcre_chartables.c.dist.\nThen when you cross-compile PCRE this new version of the tables will be used.\n\n\nUsing HP's ANSI C++ compiler (aCC)\n----------------------------------\n\nUnless C++ support is disabled by specifying the \"--disable-cpp\" option of the\n\"configure\" script, you must include the \"-AA\" option in the CXXFLAGS\nenvironment variable in order for the C++ components to compile correctly.\n\nAlso, note that the aCC compiler on PA-RISC platforms may have a defect whereby\nneeded libraries fail to get included when specifying the \"-AA\" compiler\noption. If you experience unresolved symbols when linking the C++ programs,\nuse the workaround of specifying the following environment variable prior to\nrunning the \"configure\" script:\n\n  CXXLDFLAGS=\"-lstd_v2 -lCsup_v2\"\n\n\nCompiling in Tru64 using native compilers\n-----------------------------------------\n\nThe following error may occur when compiling with native compilers in the Tru64\noperating system:\n\n  CXX    libpcrecpp_la-pcrecpp.lo\ncxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error\n          directive: \"cannot include iosfwd -- define __USE_STD_IOSTREAM to\n          override default - see section 7.1.2 of the C++ Using Guide\"\n#error \"cannot include iosfwd -- define __USE_STD_IOSTREAM to override default\n- see section 7.1.2 of the C++ Using Guide\"\n\nThis may be followed by other errors, complaining that 'namespace \"std\" has no\nmember'. The solution to this is to add the line\n\n#define __USE_STD_IOSTREAM 1\n\nto the config.h file.\n\n\nUsing Sun's compilers for Solaris\n---------------------------------\n\nA user reports that the following configurations work on Solaris 9 sparcv9 and\nSolaris 9 x86 (32-bit):\n\n  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS=\"-m64 -g\"\n  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS=\"-g\"\n\n\nUsing PCRE from MySQL\n---------------------\n\nOn systems where both PCRE and MySQL are installed, it is possible to make use\nof PCRE from within MySQL, as an alternative to the built-in pattern matching.\nThere is a web page that tells you how to do this:\n\n  http://www.mysqludf.org/lib_mysqludf_preg/index.php\n\n\nMaking new tarballs\n-------------------\n\nThe command \"make dist\" creates three PCRE tarballs, in tar.gz, tar.bz2, and\nzip formats. The command \"make distcheck\" does the same, but then does a trial\nbuild of the new distribution to ensure that it works.\n\nIf you have modified any of the man page sources in the doc directory, you\nshould first run the PrepareRelease script before making a distribution. This\nscript creates the .txt and HTML forms of the documentation from the man pages.\n\n\nTesting PCRE\n------------\n\nTo test the basic PCRE library on a Unix-like system, run the RunTest script.\nThere is another script called RunGrepTest that tests the options of the\npcregrep command. If the C++ wrapper library is built, three test programs\ncalled pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest\nare also built. When JIT support is enabled, another test program called\npcre_jit_test is built.\n\nBoth the scripts and all the program tests are run if you obey \"make check\" or\n\"make test\". For other environments, see the instructions in\nNON-AUTOTOOLS-BUILD.\n\nThe RunTest script runs the pcretest test program (which is documented in its\nown man page) on each of the relevant testinput files in the testdata\ndirectory, and compares the output with the contents of the corresponding\ntestoutput files. RunTest uses a file called testtry to hold the main output\nfrom pcretest. Other files whose names begin with \"test\" are used as working\nfiles in some tests.\n\nSome tests are relevant only when certain build-time options were selected. For\nexample, the tests for UTF-8/16/32 support are run only if --enable-utf was\nused. RunTest outputs a comment when it skips a test.\n\nMany of the tests that are not skipped are run up to three times. The second\nrun forces pcre_study() to be called for all patterns except for a few in some\ntests that are marked \"never study\" (see the pcretest program for how this is\ndone). If JIT support is available, the non-DFA tests are run a third time,\nthis time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option.\nThis testing can be suppressed by putting \"nojit\" on the RunTest command line.\n\nThe entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit\nlibraries that are enabled. If you want to run just one set of tests, call\nRunTest with either the -8, -16 or -32 option.\n\nIf valgrind is installed, you can run the tests under it by putting \"valgrind\"\non the RunTest command line. To run pcretest on just one or more specific test\nfiles, give their numbers as arguments to RunTest, for example:\n\n  RunTest 2 7 11\n\nYou can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the\nend), or a number preceded by ~ to exclude a test. For example:\n\n  Runtest 3-15 ~10\n\nThis runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests\nexcept test 13. Whatever order the arguments are in, the tests are always run\nin numerical order.\n\nYou can also call RunTest with the single argument \"list\" to cause it to output\na list of tests.\n\nThe first test file can be fed directly into the perltest.pl script to check\nthat Perl gives the same results. The only difference you should see is in the\nfirst few lines, where the Perl version is given instead of the PCRE version.\n\nThe second set of tests check pcre_fullinfo(), pcre_study(),\npcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error\ndetection, and run-time flags that are specific to PCRE, as well as the POSIX\nwrapper API. It also uses the debugging flags to check some of the internals of\npcre_compile().\n\nIf you build PCRE with a locale setting that is not the standard C locale, the\ncharacter tables may be different (see next paragraph). In some cases, this may\ncause failures in the second set of tests. For example, in a locale where the\nisprint() function yields TRUE for characters in the range 128-255, the use of\n[:isascii:] inside a character class defines a different set of characters, and\nthis shows up in this test as a difference in the compiled code, which is being\nlisted for checking. Where the comparison test output contains [\\x00-\\x7f] the\ntest will contain [\\x00-\\xff], and similarly in some other cases. This is not a\nbug in PCRE.\n\nThe third set of tests checks pcre_maketables(), the facility for building a\nset of character tables for a specific locale and using them instead of the\ndefault tables. The tests make use of the \"fr_FR\" (French) locale. Before\nrunning the test, the script checks for the presence of this locale by running\nthe \"locale\" command. If that command fails, or if it doesn't include \"fr_FR\"\nin the list of available locales, the third test cannot be run, and a comment\nis output to say why. If running this test produces instances of the error\n\n  ** Failed to set locale \"fr_FR\"\n\nin the comparison output, it means that locale is not available on your system,\ndespite being listed by \"locale\". This does not mean that PCRE is broken.\n\n[If you are trying to run this test on Windows, you may be able to get it to\nwork by changing \"fr_FR\" to \"french\" everywhere it occurs. Alternatively, use\nRunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses\nWindows versions of test 2. More info on using RunTest.bat is included in the\ndocument entitled NON-UNIX-USE.]\n\nThe fourth and fifth tests check the UTF-8/16/32 support and error handling and\ninternal UTF features of PCRE that are not relevant to Perl, respectively. The\nsixth and seventh tests do the same for Unicode character properties support.\n\nThe eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative\nmatching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32\nmode with Unicode property support, respectively.\n\nThe eleventh test checks some internal offsets and code size features; it is\nrun only when the default \"link size\" of 2 is set (in other cases the sizes\nchange) and when Unicode property support is enabled.\n\nThe twelfth test is run only when JIT support is available, and the thirteenth\ntest is run only when JIT support is not available. They test some JIT-specific\nfeatures such as information output from pcretest about JIT compilation.\n\nThe fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and\nthe seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit\nmode. These are tests that generate different output in the two modes. They are\nfor general cases, UTF-8/16/32 support, and Unicode property support,\nrespectively.\n\nThe twentieth test is run only in 16/32-bit mode. It tests some specific\n16/32-bit features of the DFA matching engine.\n\nThe twenty-first and twenty-second tests are run only in 16/32-bit mode, when\nthe link size is set to 2 for the 16-bit library. They test reloading\npre-compiled patterns.\n\nThe twenty-third and twenty-fourth tests are run only in 16-bit mode. They are\nfor general cases, and UTF-16 support, respectively.\n\nThe twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are\nfor general cases, and UTF-32 support, respectively.\n\n\nCharacter tables\n----------------\n\nFor speed, PCRE uses four tables for manipulating and identifying characters\nwhose code point values are less than 256. The final argument of the\npcre_compile() function is a pointer to a block of memory containing the\nconcatenated tables. A call to pcre_maketables() can be used to generate a set\nof tables in the current locale. If the final argument for pcre_compile() is\npassed as NULL, a set of default tables that is built into the binary is used.\n\nThe source file called pcre_chartables.c contains the default set of tables. By\ndefault, this is created as a copy of pcre_chartables.c.dist, which contains\ntables for ASCII coding. However, if --enable-rebuild-chartables is specified\nfor ./configure, a different version of pcre_chartables.c is built by the\nprogram dftables (compiled from dftables.c), which uses the ANSI C character\nhandling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to\nbuild the table sources. This means that the default C locale which is set for\nyour system will control the contents of these default tables. You can change\nthe default tables by editing pcre_chartables.c and then re-building PCRE. If\nyou do this, you should take care to ensure that the file does not get\nautomatically re-generated. The best way to do this is to move\npcre_chartables.c.dist out of the way and replace it with your customized\ntables.\n\nWhen the dftables program is run as a result of --enable-rebuild-chartables,\nit uses the default C locale that is set on your system. It does not pay\nattention to the LC_xxx environment variables. In other words, it uses the\nsystem's default locale rather than whatever the compiling user happens to have\nset. If you really do want to build a source set of character tables in a\nlocale that is specified by the LC_xxx variables, you can run the dftables\nprogram by hand with the -L option. For example:\n\n  ./dftables -L pcre_chartables.c.special\n\nThe first two 256-byte tables provide lower casing and case flipping functions,\nrespectively. The next table consists of three 32-byte bit maps which identify\ndigits, \"word\" characters, and white space, respectively. These are used when\nbuilding 32-byte bit maps that represent character classes for code points less\nthan 256.\n\nThe final 256-byte table has bits indicating various character types, as\nfollows:\n\n    1   white space character\n    2   letter\n    4   decimal digit\n    8   hexadecimal digit\n   16   alphanumeric or '_'\n  128   regular expression metacharacter or binary zero\n\nYou should not alter the set of characters that contain the 128 bit, as that\nwill cause PCRE to malfunction.\n\n\nFile manifest\n-------------\n\nThe distribution should contain the files listed below. Where a file name is\ngiven as pcre[16|32]_xxx it means that there are three files, one with the name\npcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.\n\n(A) Source files of the PCRE library functions and their headers:\n\n  dftables.c              auxiliary program for building pcre_chartables.c\n                          when --enable-rebuild-chartables is specified\n\n  pcre_chartables.c.dist  a default set of character tables that assume ASCII\n                          coding; used, unless --enable-rebuild-chartables is\n                          specified, by copying to pcre[16]_chartables.c\n\n  pcreposix.c                )\n  pcre[16|32]_byte_order.c   )\n  pcre[16|32]_compile.c      )\n  pcre[16|32]_config.c       )\n  pcre[16|32]_dfa_exec.c     )\n  pcre[16|32]_exec.c         )\n  pcre[16|32]_fullinfo.c     )\n  pcre[16|32]_get.c          ) sources for the functions in the library,\n  pcre[16|32]_globals.c      )   and some internal functions that they use\n  pcre[16|32]_jit_compile.c  )\n  pcre[16|32]_maketables.c   )\n  pcre[16|32]_newline.c      )\n  pcre[16|32]_refcount.c     )\n  pcre[16|32]_string_utils.c )\n  pcre[16|32]_study.c        )\n  pcre[16|32]_tables.c       )\n  pcre[16|32]_ucd.c          )\n  pcre[16|32]_version.c      )\n  pcre[16|32]_xclass.c       )\n  pcre_ord2utf8.c            )\n  pcre_valid_utf8.c          )\n  pcre16_ord2utf16.c         )\n  pcre16_utf16_utils.c       )\n  pcre16_valid_utf16.c       )\n  pcre32_utf32_utils.c       )\n  pcre32_valid_utf32.c       )\n\n  pcre[16|32]_printint.c     ) debugging function that is used by pcretest,\n                             )   and can also be #included in pcre_compile()\n\n  pcre.h.in               template for pcre.h when built by \"configure\"\n  pcreposix.h             header for the external POSIX wrapper API\n  pcre_internal.h         header for internal use\n  sljit/*                 16 files that make up the JIT compiler\n  ucp.h                   header for Unicode property handling\n\n  config.h.in             template for config.h, which is built by \"configure\"\n\n  pcrecpp.h               public header file for the C++ wrapper\n  pcrecpparg.h.in         template for another C++ header file\n  pcre_scanner.h          public header file for C++ scanner functions\n  pcrecpp.cc              )\n  pcre_scanner.cc         ) source for the C++ wrapper library\n\n  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the\n                            C++ stringpiece functions\n  pcre_stringpiece.cc     source for the C++ stringpiece functions\n\n(B) Source files for programs that use PCRE:\n\n  pcredemo.c              simple demonstration of coding calls to PCRE\n  pcregrep.c              source of a grep utility that uses PCRE\n  pcretest.c              comprehensive test program\n\n(C) Auxiliary files:\n\n  132html                 script to turn \"man\" pages into HTML\n  AUTHORS                 information about the author of PCRE\n  ChangeLog               log of changes to the code\n  CleanTxt                script to clean nroff output for txt man pages\n  Detrail                 script to remove trailing spaces\n  HACKING                 some notes about the internals of PCRE\n  INSTALL                 generic installation instructions\n  LICENCE                 conditions for the use of PCRE\n  COPYING                 the same, using GNU's standard name\n  Makefile.in             ) template for Unix Makefile, which is built by\n                          )   \"configure\"\n  Makefile.am             ) the automake input that was used to create\n                          )   Makefile.in\n  NEWS                    important changes in this release\n  NON-UNIX-USE            the previous name for NON-AUTOTOOLS-BUILD\n  NON-AUTOTOOLS-BUILD     notes on building PCRE without using autotools\n  PrepareRelease          script to make preparations for \"make dist\"\n  README                  this file\n  RunTest                 a Unix shell script for running tests\n  RunGrepTest             a Unix shell script for pcregrep tests\n  aclocal.m4              m4 macros (generated by \"aclocal\")\n  config.guess            ) files used by libtool,\n  config.sub              )   used only when building a shared library\n  configure               a configuring shell script (built by autoconf)\n  configure.ac            ) the autoconf input that was used to build\n                          )   \"configure\" and config.h\n  depcomp                 ) script to find program dependencies, generated by\n                          )   automake\n  doc/*.3                 man page sources for PCRE\n  doc/*.1                 man page sources for pcregrep and pcretest\n  doc/index.html.src      the base HTML page\n  doc/html/*              HTML documentation\n  doc/pcre.txt            plain text version of the man pages\n  doc/pcretest.txt        plain text documentation of test program\n  doc/perltest.txt        plain text documentation of Perl test program\n  install-sh              a shell script for installing files\n  libpcre16.pc.in         template for libpcre16.pc for pkg-config\n  libpcre32.pc.in         template for libpcre32.pc for pkg-config\n  libpcre.pc.in           template for libpcre.pc for pkg-config\n  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config\n  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config\n  ltmain.sh               file used to build a libtool script\n  missing                 ) common stub for a few missing GNU programs while\n                          )   installing, generated by automake\n  mkinstalldirs           script for making install directories\n  perltest.pl             Perl test program\n  pcre-config.in          source of script which retains PCRE information\n  pcre_jit_test.c         test program for the JIT compiler\n  pcrecpp_unittest.cc          )\n  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper\n  pcre_stringpiece_unittest.cc )\n  testdata/testinput*     test data for main library tests\n  testdata/testoutput*    expected test results\n  testdata/grep*          input and output for pcregrep tests\n  testdata/*              other supporting test files\n\n(D) Auxiliary files for cmake support\n\n  cmake/COPYING-CMAKE-SCRIPTS\n  cmake/FindPackageHandleStandardArgs.cmake\n  cmake/FindEditline.cmake\n  cmake/FindReadline.cmake\n  CMakeLists.txt\n  config-cmake.h.in\n\n(E) Auxiliary files for VPASCAL\n\n  makevp.bat\n  makevp_c.txt\n  makevp_l.txt\n  pcregexp.pas\n\n(F) Auxiliary files for building PCRE \"by hand\"\n\n  pcre.h.generic          ) a version of the public PCRE header file\n                          )   for use in non-\"configure\" environments\n  config.h.generic        ) a version of config.h for use in non-\"configure\"\n                          )   environments\n\n(F) Miscellaneous\n\n  RunTest.bat            a script for running tests under Windows\n\nPhilip Hazel\nEmail local part: ph10\nEmail domain: cam.ac.uk\nLast updated: 10 February 2015\n"
  },
  {
    "path": "src/pcre/doc/html/index.html",
    "content": "<html>\n<!-- This is a manually maintained file that is the root of the HTML version of\n     the PCRE documentation. When the HTML documents are built from the man\n     page versions, the entire doc/html directory is emptied, this file is then\n     copied into doc/html/index.html, and the remaining files therein are\n     created by the 132html script.\n-->\n<head>\n<title>PCRE specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>Perl-compatible Regular Expressions (PCRE)</h1>\n<p>\nThe HTML documentation for PCRE consists of a number of pages that are listed\nbelow in alphabetical order. If you are new to PCRE, please read the first one\nfirst.\n</p>\n\n<table>\n<tr><td><a href=\"pcre.html\">pcre</a></td>\n    <td>&nbsp;&nbsp;Introductory page</td></tr>\n\n<tr><td><a href=\"pcre-config.html\">pcre-config</a></td>\n    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>\n\n<tr><td><a href=\"pcre16.html\">pcre16</a></td>\n    <td>&nbsp;&nbsp;Discussion of the 16-bit PCRE library</td></tr>\n\n<tr><td><a href=\"pcre32.html\">pcre32</a></td>\n    <td>&nbsp;&nbsp;Discussion of the 32-bit PCRE library</td></tr>\n\n<tr><td><a href=\"pcreapi.html\">pcreapi</a></td>\n    <td>&nbsp;&nbsp;PCRE's native API</td></tr>\n\n<tr><td><a href=\"pcrebuild.html\">pcrebuild</a></td>\n    <td>&nbsp;&nbsp;Building PCRE</td></tr>\n\n<tr><td><a href=\"pcrecallout.html\">pcrecallout</a></td>\n    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>\n\n<tr><td><a href=\"pcrecompat.html\">pcrecompat</a></td>\n    <td>&nbsp;&nbsp;Compability with Perl</td></tr>\n\n<tr><td><a href=\"pcrecpp.html\">pcrecpp</a></td>\n    <td>&nbsp;&nbsp;The C++ wrapper for the PCRE library</td></tr>\n\n<tr><td><a href=\"pcredemo.html\">pcredemo</a></td>\n    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE library</td></tr>\n\n<tr><td><a href=\"pcregrep.html\">pcregrep</a></td>\n    <td>&nbsp;&nbsp;The <b>pcregrep</b> command</td></tr>\n\n<tr><td><a href=\"pcrejit.html\">pcrejit</a></td>\n    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>\n\n<tr><td><a href=\"pcrelimits.html\">pcrelimits</a></td>\n    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>\n\n<tr><td><a href=\"pcrematching.html\">pcrematching</a></td>\n    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>\n\n<tr><td><a href=\"pcrepartial.html\">pcrepartial</a></td>\n    <td>&nbsp;&nbsp;Using PCRE for partial matching</td></tr>\n\n<tr><td><a href=\"pcrepattern.html\">pcrepattern</a></td>\n    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE</td></tr>\n\n<tr><td><a href=\"pcreperform.html\">pcreperform</a></td>\n    <td>&nbsp;&nbsp;Some comments on performance</td></tr>\n\n<tr><td><a href=\"pcreposix.html\">pcreposix</a></td>\n    <td>&nbsp;&nbsp;The POSIX API to the PCRE 8-bit library</td></tr>\n\n<tr><td><a href=\"pcreprecompile.html\">pcreprecompile</a></td>\n    <td>&nbsp;&nbsp;How to save and re-use compiled patterns</td></tr>\n\n<tr><td><a href=\"pcresample.html\">pcresample</a></td>\n    <td>&nbsp;&nbsp;Discussion of the pcredemo program</td></tr>\n\n<tr><td><a href=\"pcrestack.html\">pcrestack</a></td>\n    <td>&nbsp;&nbsp;Discussion of PCRE's stack usage</td></tr>\n\n<tr><td><a href=\"pcresyntax.html\">pcresyntax</a></td>\n    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>\n\n<tr><td><a href=\"pcretest.html\">pcretest</a></td>\n    <td>&nbsp;&nbsp;The <b>pcretest</b> command for testing PCRE</td></tr>\n\n<tr><td><a href=\"pcreunicode.html\">pcreunicode</a></td>\n    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>\n</table>\n\n<p>\nThere are also individual pages that summarize the interface for each function\nin the library. There is a single page for each triple of 8-bit/16-bit/32-bit\nfunctions.\n</p>\n\n<table>\n\n<tr><td><a href=\"pcre_assign_jit_stack.html\">pcre_assign_jit_stack</a></td>\n    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_compile.html\">pcre_compile</a></td>\n    <td>&nbsp;&nbsp;Compile a regular expression</td></tr>\n\n<tr><td><a href=\"pcre_compile2.html\">pcre_compile2</a></td>\n    <td>&nbsp;&nbsp;Compile a regular expression (alternate interface)</td></tr>\n\n<tr><td><a href=\"pcre_config.html\">pcre_config</a></td>\n    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>\n\n<tr><td><a href=\"pcre_copy_named_substring.html\">pcre_copy_named_substring</a></td>\n    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>\n\n<tr><td><a href=\"pcre_copy_substring.html\">pcre_copy_substring</a></td>\n    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>\n\n<tr><td><a href=\"pcre_dfa_exec.html\">pcre_dfa_exec</a></td>\n    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string\n    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>\n\n<tr><td><a href=\"pcre_exec.html\">pcre_exec</a></td>\n    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string\n    (Perl compatible)</td></tr>\n\n<tr><td><a href=\"pcre_free_study.html\">pcre_free_study</a></td>\n    <td>&nbsp;&nbsp;Free study data</td></tr>\n\n<tr><td><a href=\"pcre_free_substring.html\">pcre_free_substring</a></td>\n    <td>&nbsp;&nbsp;Free extracted substring</td></tr>\n\n<tr><td><a href=\"pcre_free_substring_list.html\">pcre_free_substring_list</a></td>\n    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>\n\n<tr><td><a href=\"pcre_fullinfo.html\">pcre_fullinfo</a></td>\n    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>\n\n<tr><td><a href=\"pcre_get_named_substring.html\">pcre_get_named_substring</a></td>\n    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>\n\n<tr><td><a href=\"pcre_get_stringnumber.html\">pcre_get_stringnumber</a></td>\n    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>\n\n<tr><td><a href=\"pcre_get_stringtable_entries.html\">pcre_get_stringtable_entries</a></td>\n    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>\n\n<tr><td><a href=\"pcre_get_substring.html\">pcre_get_substring</a></td>\n    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>\n\n<tr><td><a href=\"pcre_get_substring_list.html\">pcre_get_substring_list</a></td>\n    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>\n\n<tr><td><a href=\"pcre_jit_exec.html\">pcre_jit_exec</a></td>\n    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_jit_stack_alloc.html\">pcre_jit_stack_alloc</a></td>\n    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_jit_stack_free.html\">pcre_jit_stack_free</a></td>\n    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>\n\n<tr><td><a href=\"pcre_maketables.html\">pcre_maketables</a></td>\n    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>\n\n<tr><td><a href=\"pcre_pattern_to_host_byte_order.html\">pcre_pattern_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert compiled pattern to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_refcount.html\">pcre_refcount</a></td>\n    <td>&nbsp;&nbsp;Maintain reference count in compiled pattern</td></tr>\n\n<tr><td><a href=\"pcre_study.html\">pcre_study</a></td>\n    <td>&nbsp;&nbsp;Study a compiled pattern</td></tr>\n\n<tr><td><a href=\"pcre_utf16_to_host_byte_order.html\">pcre_utf16_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert UTF-16 string to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_utf32_to_host_byte_order.html\">pcre_utf32_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert UTF-32 string to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_version.html\">pcre_version</a></td>\n    <td>&nbsp;&nbsp;Return PCRE version and release date</td></tr>\n</table>\n\n</html>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre-config.html",
    "content": "<html>\n<head>\n<title>pcre-config specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre-config man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">DESCRIPTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">OPTIONS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">SEE ALSO</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">AUTHOR</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS</a><br>\n<P>\n<b>pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]</b>\n<b>            [--libs16] [--libs32] [--libs-cpp] [--libs-posix]</b>\n<b>            [--cflags] [--cflags-posix]</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\n<b>pcre-config</b> returns the configuration of the installed PCRE\nlibraries and the options required to compile a program to use them. Some of\nthe options apply only to the 8-bit, or 16-bit, or 32-bit libraries,\nrespectively, and are\nnot available if only one of those libraries has been built. If an unavailable\noption is encountered, the \"usage\" information is output.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">OPTIONS</a><br>\n<P>\n<b>--prefix</b>\nWrites the directory prefix used in the PCRE installation for architecture\nindependent files (<i>/usr</i> on many systems, <i>/usr/local</i> on some\nsystems) to the standard output.\n</P>\n<P>\n<b>--exec-prefix</b>\nWrites the directory prefix used in the PCRE installation for architecture\ndependent files (normally the same as <b>--prefix</b>) to the standard output.\n</P>\n<P>\n<b>--version</b>\nWrites the version number of the installed PCRE libraries to the standard\noutput.\n</P>\n<P>\n<b>--libs</b>\nWrites to the standard output the command line options required to link\nwith the 8-bit PCRE library (<b>-lpcre</b> on many systems).\n</P>\n<P>\n<b>--libs16</b>\nWrites to the standard output the command line options required to link\nwith the 16-bit PCRE library (<b>-lpcre16</b> on many systems).\n</P>\n<P>\n<b>--libs32</b>\nWrites to the standard output the command line options required to link\nwith the 32-bit PCRE library (<b>-lpcre32</b> on many systems).\n</P>\n<P>\n<b>--libs-cpp</b>\nWrites to the standard output the command line options required to link with\nPCRE's C++ wrapper library (<b>-lpcrecpp</b> <b>-lpcre</b> on many\nsystems).\n</P>\n<P>\n<b>--libs-posix</b>\nWrites to the standard output the command line options required to link with\nPCRE's POSIX API wrapper library (<b>-lpcreposix</b> <b>-lpcre</b> on many\nsystems).\n</P>\n<P>\n<b>--cflags</b>\nWrites to the standard output the command line options required to compile\nfiles that use PCRE (this may include some <b>-I</b> options, but is blank on\nmany systems).\n</P>\n<P>\n<b>--cflags-posix</b>\nWrites to the standard output the command line options required to compile\nfiles that use PCRE's POSIX API wrapper library (this may include some <b>-I</b>\noptions, but is blank on many systems).\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcre(3)</b>\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nThis manual page was originally written by Mark Baker for the Debian GNU/Linux\nsystem. It has been subsequently revised as a generic PCRE man page.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 24 June 2012\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre.html",
    "content": "<html>\n<head>\n<title>pcre specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PLEASE TAKE NOTE</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">INTRODUCTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">SECURITY CONSIDERATIONS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">USER DOCUMENTATION</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">AUTHOR</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PLEASE TAKE NOTE</a><br>\n<P>\nThis document relates to PCRE releases that use the original API,\nwith library names libpcre, libpcre16, and libpcre32. January 2015 saw the\nfirst release of a new API, known as PCRE2, with release numbers starting at\n10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old\nlibraries (now called PCRE1) are still being maintained for bug fixes, but\nthere will be no new development. New projects are advised to use the new PCRE2\nlibraries.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">INTRODUCTION</a><br>\n<P>\nThe PCRE library is a set of functions that implement regular expression\npattern matching using the same syntax and semantics as Perl, with just a few\ndifferences. Some features that appeared in Python and PCRE before they\nappeared in Perl are also available using the Python syntax, there is some\nsupport for one or two .NET and Oniguruma syntax items, and there is an option\nfor requesting some minor changes that give better JavaScript compatibility.\n</P>\n<P>\nStarting with release 8.30, it is possible to compile two separate PCRE\nlibraries: the original, which supports 8-bit character strings (including\nUTF-8 strings), and a second library that supports 16-bit character strings\n(including UTF-16 strings). The build process allows either one or both to be\nbuilt. The majority of the work to make this possible was done by Zoltan\nHerczeg.\n</P>\n<P>\nStarting with release 8.32 it is possible to compile a third separate PCRE\nlibrary that supports 32-bit character strings (including UTF-32 strings). The\nbuild process allows any combination of the 8-, 16- and 32-bit libraries. The\nwork to make this possible was done by Christian Persch.\n</P>\n<P>\nThe three libraries contain identical sets of functions, except that the names\nin the 16-bit library start with <b>pcre16_</b> instead of <b>pcre_</b>, and the\nnames in the 32-bit library start with <b>pcre32_</b> instead of <b>pcre_</b>. To\navoid over-complication and reduce the documentation maintenance load, most of\nthe documentation describes the 8-bit library, with the differences for the\n16-bit and 32-bit libraries described separately in the\n<a href=\"pcre16.html\"><b>pcre16</b></a>\nand\n<a href=\"pcre32.html\"><b>pcre32</b></a>\npages. References to functions or structures of the form <i>pcre[16|32]_xxx</i>\nshould be read as meaning \"<i>pcre_xxx</i> when using the 8-bit library,\n<i>pcre16_xxx</i> when using the 16-bit library, or <i>pcre32_xxx</i> when using\nthe 32-bit library\".\n</P>\n<P>\nThe current implementation of PCRE corresponds approximately with Perl 5.12,\nincluding support for UTF-8/16/32 encoded strings and Unicode general category\nproperties. However, UTF-8/16/32 and Unicode support has to be explicitly\nenabled; it is not the default. The Unicode tables correspond to Unicode\nrelease 6.3.0.\n</P>\n<P>\nIn addition to the Perl-compatible matching function, PCRE contains an\nalternative function that matches the same compiled patterns in a different\nway. In certain circumstances, the alternative function has some advantages.\nFor a discussion of the two matching algorithms, see the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\npage.\n</P>\n<P>\nPCRE is written in C and released as a C library. A number of people have\nwritten wrappers and interfaces of various kinds. In particular, Google Inc.\nhave provided a comprehensive C++ wrapper for the 8-bit library. This is now\nincluded as part of the PCRE distribution. The\n<a href=\"pcrecpp.html\"><b>pcrecpp</b></a>\npage has details of this interface. Other people's contributions can be found\nin the <i>Contrib</i> directory at the primary FTP site, which is:\n<a href=\"ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre\">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre</a>\n</P>\n<P>\nDetails of exactly which Perl regular expression features are and are not\nsupported by PCRE are given in separate documents. See the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\nand\n<a href=\"pcrecompat.html\"><b>pcrecompat</b></a>\npages. There is a syntax summary in the\n<a href=\"pcresyntax.html\"><b>pcresyntax</b></a>\npage.\n</P>\n<P>\nSome features of PCRE can be included, excluded, or changed when the library is\nbuilt. The\n<a href=\"pcre_config.html\"><b>pcre_config()</b></a>\nfunction makes it possible for a client to discover which features are\navailable. The features themselves are described in the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\npage. Documentation about building PCRE for various operating systems can be\nfound in the\n<a href=\"README.txt\"><b>README</b></a>\nand\n<a href=\"NON-AUTOTOOLS-BUILD.txt\"><b>NON-AUTOTOOLS_BUILD</b></a>\nfiles in the source distribution.\n</P>\n<P>\nThe libraries contains a number of undocumented internal functions and data\ntables that are used by more than one of the exported external functions, but\nwhich are not intended for use by external callers. Their names all begin with\n\"_pcre_\" or \"_pcre16_\" or \"_pcre32_\", which hopefully will not provoke any name\nclashes. In some environments, it is possible to control which external symbols\nare exported when a shared library is built, and in these cases the\nundocumented symbols are not exported.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">SECURITY CONSIDERATIONS</a><br>\n<P>\nIf you are using PCRE in a non-UTF application that permits users to supply\narbitrary patterns for compilation, you should be aware of a feature that\nallows users to turn on UTF support from within a pattern, provided that PCRE\nwas built with UTF support. For example, an 8-bit pattern that begins with\n\"(*UTF8)\" or \"(*UTF)\" turns on UTF-8 mode, which interprets patterns and\nsubjects as strings of UTF-8 characters instead of individual 8-bit characters.\nThis causes both the pattern and any data against which it is matched to be\nchecked for UTF-8 validity. If the data string is very long, such a check might\nuse sufficiently many resources as to cause your application to lose\nperformance.\n</P>\n<P>\nOne way of guarding against this possibility is to use the\n<b>pcre_fullinfo()</b> function to check the compiled pattern's options for UTF.\nAlternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at\ncompile time. This causes an compile time error if a pattern contains a\nUTF-setting sequence.\n</P>\n<P>\nIf your application is one that supports UTF, be aware that validity checking\ncan take time. If the same data string is to be matched many times, you can use\nthe PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to\nsave redundant checks.\n</P>\n<P>\nAnother way that performance can be hit is by running a pattern that has a very\nlarge search tree against a string that will never match. Nested unlimited\nrepeats in a pattern are a common example. PCRE provides some protection\nagainst this: see the PCRE_EXTRA_MATCH_LIMIT feature in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">USER DOCUMENTATION</a><br>\n<P>\nThe user documentation for PCRE comprises a number of different sections. In\nthe \"man\" format, each of these is a separate \"man page\". In the HTML format,\neach is a separate page, linked from the index page. In the plain text format,\nthe descriptions of the <b>pcregrep</b> and <b>pcretest</b> programs are in files\ncalled <b>pcregrep.txt</b> and <b>pcretest.txt</b>, respectively. The remaining\nsections, except for the <b>pcredemo</b> section (which is a program listing),\nare concatenated in <b>pcre.txt</b>, for ease of searching. The sections are as\nfollows:\n<pre>\n  pcre              this document\n  pcre-config       show PCRE installation configuration information\n  pcre16            details of the 16-bit library\n  pcre32            details of the 32-bit library\n  pcreapi           details of PCRE's native C API\n  pcrebuild         building PCRE\n  pcrecallout       details of the callout feature\n  pcrecompat        discussion of Perl compatibility\n  pcrecpp           details of the C++ wrapper for the 8-bit library\n  pcredemo          a demonstration C program that uses PCRE\n  pcregrep          description of the <b>pcregrep</b> command (8-bit only)\n  pcrejit           discussion of the just-in-time optimization support\n  pcrelimits        details of size and other limits\n  pcrematching      discussion of the two matching algorithms\n  pcrepartial       details of the partial matching facility\n  pcrepattern       syntax and semantics of supported regular expressions\n  pcreperform       discussion of performance issues\n  pcreposix         the POSIX-compatible C API for the 8-bit library\n  pcreprecompile    details of saving and re-using precompiled patterns\n  pcresample        discussion of the pcredemo program\n  pcrestack         discussion of stack usage\n  pcresyntax        quick syntax reference\n  pcretest          description of the <b>pcretest</b> testing command\n  pcreunicode       discussion of Unicode and UTF-8/16/32 support\n</pre>\nIn the \"man\" and HTML formats, there is also a short page for each C library\nfunction, listing its arguments and results.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<P>\nPutting an actual email address here seems to have been a spam magnet, so I've\ntaken it away. If you want to email me, use my two initials, followed by the\ntwo digits 10, at the domain cam.ac.uk.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 10 February 2015\n<br>\nCopyright &copy; 1997-2015 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre16.html",
    "content": "<html>\n<head>\n<title>pcre16 specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre16 man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE 16-BIT API BASIC FUNCTIONS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">PCRE 16-BIT API STRING EXTRACTION FUNCTIONS</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">PCRE 16-BIT API AUXILIARY FUNCTIONS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">PCRE 16-BIT API INDIRECTED FUNCTIONS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">PCRE 16-BIT API 16-BIT-ONLY FUNCTION</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">THE PCRE 16-BIT LIBRARY</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">THE HEADER FILE</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">THE LIBRARY NAME</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">STRING TYPES</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">STRUCTURE TYPES</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">16-BIT FUNCTIONS</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">SUBJECT STRING OFFSETS</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">NAMED SUBPATTERNS</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">OPTION NAMES</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">CHARACTER CODES</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">ERROR NAMES</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">ERROR TEXTS</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">CALLOUTS</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">TESTING</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">NOT SUPPORTED IN 16-BIT MODE</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">AUTHOR</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">REVISION</a>\n</ul>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE 16-BIT API BASIC FUNCTIONS</a><br>\n<P>\n<b>pcre16 *pcre16_compile(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre16 *pcre16_compile2(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre16_extra *pcre16_study(const pcre16 *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n<br>\n<br>\n<b>void pcre16_free_study(pcre16_extra *<i>extra</i>);</b>\n<br>\n<br>\n<b>int pcre16_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n<br>\n<br>\n<b>int pcre16_dfa_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">PCRE 16-BIT API STRING EXTRACTION FUNCTIONS</a><br>\n<P>\n<b>int pcre16_copy_named_substring(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>\n<b>     PCRE_UCHAR16 *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre16_copy_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR16 *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_named_substring(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>\n<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_stringnumber(const pcre16 *<i>code</i>,</b>\n<b>\"     PCRE_SPTR16 <i>name</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_stringtable_entries(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>name</i>, PCRE_UCHAR16 **<i>first</i>, PCRE_UCHAR16 **<i>last</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_substring_list(PCRE_SPTR16 <i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR16 **<i>listptr</i>);</b>\n<br>\n<br>\n<b>void pcre16_free_substring(PCRE_SPTR16 <i>stringptr</i>);</b>\n<br>\n<br>\n<b>void pcre16_free_substring_list(PCRE_SPTR16 *<i>stringptr</i>);</b>\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">PCRE 16-BIT API AUXILIARY FUNCTIONS</a><br>\n<P>\n<b>pcre16_jit_stack *pcre16_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>\n<br>\n<br>\n<b>void pcre16_jit_stack_free(pcre16_jit_stack *<i>stack</i>);</b>\n<br>\n<br>\n<b>void pcre16_assign_jit_stack(pcre16_extra *<i>extra</i>,</b>\n<b>     pcre16_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n<br>\n<br>\n<b>const unsigned char *pcre16_maketables(void);</b>\n<br>\n<br>\n<b>int pcre16_fullinfo(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>int pcre16_refcount(pcre16 *<i>code</i>, int <i>adjust</i>);</b>\n<br>\n<br>\n<b>int pcre16_config(int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>const char *pcre16_version(void);</b>\n<br>\n<br>\n<b>int pcre16_pattern_to_host_byte_order(pcre16 *<i>code</i>,</b>\n<b>     pcre16_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">PCRE 16-BIT API INDIRECTED FUNCTIONS</a><br>\n<P>\n<b>void *(*pcre16_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre16_free)(void *);</b>\n<br>\n<br>\n<b>void *(*pcre16_stack_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre16_stack_free)(void *);</b>\n<br>\n<br>\n<b>int (*pcre16_callout)(pcre16_callout_block *);</b>\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">PCRE 16-BIT API 16-BIT-ONLY FUNCTION</a><br>\n<P>\n<b>int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *<i>output</i>,</b>\n<b>     PCRE_SPTR16 <i>input</i>, int <i>length</i>, int *<i>byte_order</i>,</b>\n<b>     int <i>keep_boms</i>);</b>\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">THE PCRE 16-BIT LIBRARY</a><br>\n<P>\nStarting with release 8.30, it is possible to compile a PCRE library that\nsupports 16-bit character strings, including UTF-16 strings, as well as or\ninstead of the original 8-bit library. The majority of the work to make this\npossible was done by Zoltan Herczeg. The two libraries contain identical sets\nof functions, used in exactly the same way. Only the names of the functions and\nthe data types of their arguments and results are different. To avoid\nover-complication and reduce the documentation maintenance load, most of the\nPCRE documentation describes the 8-bit library, with only occasional references\nto the 16-bit library. This page describes what is different when you use the\n16-bit library.\n</P>\n<P>\nWARNING: A single application can be linked with both libraries, but you must\ntake care when processing any particular pattern to use functions from just one\nlibrary. For example, if you want to study a pattern that was compiled with\n<b>pcre16_compile()</b>, you must do so with <b>pcre16_study()</b>, not\n<b>pcre_study()</b>, and you must free the study data with\n<b>pcre16_free_study()</b>.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">THE HEADER FILE</a><br>\n<P>\nThere is only one header file, <b>pcre.h</b>. It contains prototypes for all the\nfunctions in all libraries, as well as definitions of flags, structures, error\ncodes, etc.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">THE LIBRARY NAME</a><br>\n<P>\nIn Unix-like systems, the 16-bit library is called <b>libpcre16</b>, and can\nnormally be accesss by adding <b>-lpcre16</b> to the command for linking an\napplication that uses PCRE.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">STRING TYPES</a><br>\n<P>\nIn the 8-bit library, strings are passed to PCRE library functions as vectors\nof bytes with the C type \"char *\". In the 16-bit library, strings are passed as\nvectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an\nappropriate data type, and PCRE_SPTR16 is defined as \"const PCRE_UCHAR16 *\". In\nvery many environments, \"short int\" is a 16-bit data type. When PCRE is built,\nit defines PCRE_UCHAR16 as \"unsigned short int\", but checks that it really is a\n16-bit data type. If it is not, the build fails with an error message telling\nthe maintainer to modify the definition appropriately.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">STRUCTURE TYPES</a><br>\n<P>\nThe types of the opaque structures that are used for compiled 16-bit patterns\nand JIT stacks are <b>pcre16</b> and <b>pcre16_jit_stack</b> respectively. The\ntype of the user-accessible structure that is returned by <b>pcre16_study()</b>\nis <b>pcre16_extra</b>, and the type of the structure that is used for passing\ndata to a callout function is <b>pcre16_callout_block</b>. These structures\ncontain the same fields, with the same names, as their 8-bit counterparts. The\nonly difference is that pointers to character strings are 16-bit instead of\n8-bit types.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">16-BIT FUNCTIONS</a><br>\n<P>\nFor every function in the 8-bit library there is a corresponding function in\nthe 16-bit library with a name that starts with <b>pcre16_</b> instead of\n<b>pcre_</b>. The prototypes are listed above. In addition, there is one extra\nfunction, <b>pcre16_utf16_to_host_byte_order()</b>. This is a utility function\nthat converts a UTF-16 character string to host byte order if necessary. The\nother 16-bit functions expect the strings they are passed to be in host byte\norder.\n</P>\n<P>\nThe <i>input</i> and <i>output</i> arguments of\n<b>pcre16_utf16_to_host_byte_order()</b> may point to the same address, that is,\nconversion in place is supported. The output buffer must be at least as long as\nthe input.\n</P>\n<P>\nThe <i>length</i> argument specifies the number of 16-bit data units in the\ninput string; a negative value specifies a zero-terminated string.\n</P>\n<P>\nIf <i>byte_order</i> is NULL, it is assumed that the string starts off in host\nbyte order. This may be changed by byte-order marks (BOMs) anywhere in the\nstring (commonly as the first character).\n</P>\n<P>\nIf <i>byte_order</i> is not NULL, a non-zero value of the integer to which it\npoints means that the input starts off in host byte order, otherwise the\nopposite order is assumed. Again, BOMs in the string can change this. The final\nbyte order is passed back at the end of processing.\n</P>\n<P>\nIf <i>keep_boms</i> is not zero, byte-order mark characters (0xfeff) are copied\ninto the output string. Otherwise they are discarded.\n</P>\n<P>\nThe result of the function is the number of 16-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">SUBJECT STRING OFFSETS</a><br>\n<P>\nThe lengths and starting offsets of subject strings must be specified in 16-bit\ndata units, and the offsets within subject strings that are returned by the\nmatching functions are in also 16-bit units rather than bytes.\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">NAMED SUBPATTERNS</a><br>\n<P>\nThe name-to-number translation table that is maintained for named subpatterns\nuses 16-bit characters. The <b>pcre16_get_stringtable_entries()</b> function\nreturns the length of each entry in the table as the number of 16-bit data\nunits.\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">OPTION NAMES</a><br>\n<P>\nThere are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK,\nwhich correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In\nfact, these new options define the same bits in the options word. There is a\ndiscussion about the\n<a href=\"pcreunicode.html#utf16strings\">validity of UTF-16 strings</a>\nin the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage.\n</P>\n<P>\nFor the <b>pcre16_config()</b> function there is an option PCRE_CONFIG_UTF16\nthat returns 1 if UTF-16 support is configured, otherwise 0. If this option is\ngiven to <b>pcre_config()</b> or <b>pcre32_config()</b>, or if the\nPCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to <b>pcre16_config()</b>,\nthe result is the PCRE_ERROR_BADOPTION error.\n</P>\n<br><a name=\"SEC15\" href=\"#TOC1\">CHARACTER CODES</a><br>\n<P>\nIn 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the\nsame way as in 8-bit, non UTF-8 mode, except, of course, that they can range\nfrom 0 to 0xffff instead of 0 to 0xff. Character types for characters less than\n0xff can therefore be influenced by the locale in the same way as before.\nCharacters greater than 0xff have only one case, and no \"type\" (such as letter\nor digit).\n</P>\n<P>\nIn UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with\nthe exception of values in the range 0xd800 to 0xdfff because those are\n\"surrogate\" values that are used in pairs to encode values greater than 0xffff.\n</P>\n<P>\nA UTF-16 string can indicate its endianness by special code knows as a\nbyte-order mark (BOM). The PCRE functions do not handle this, expecting strings\nto be in host byte order. A utility function called\n<b>pcre16_utf16_to_host_byte_order()</b> is provided to help with this (see\nabove).\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">ERROR NAMES</a><br>\n<P>\nThe errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to\ntheir 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled\npattern is passed to a function that processes patterns in the other\nmode, for example, if a pattern compiled with <b>pcre_compile()</b> is passed to\n<b>pcre16_exec()</b>.\n</P>\n<P>\nThere are new error codes whose names begin with PCRE_UTF16_ERR for invalid\nUTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that\nare described in the section entitled\n<a href=\"pcreapi.html#badutf8reasons\">\"Reason codes for invalid UTF-8 strings\"</a>\nin the main\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage. The UTF-16 errors are:\n<pre>\n  PCRE_UTF16_ERR1  Missing low surrogate at end of string\n  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate\n  PCRE_UTF16_ERR3  Isolated low surrogate\n  PCRE_UTF16_ERR4  Non-character\n</PRE>\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">ERROR TEXTS</a><br>\n<P>\nIf there is an error while compiling a pattern, the error text that is passed\nback by <b>pcre16_compile()</b> or <b>pcre16_compile2()</b> is still an 8-bit\ncharacter string, zero-terminated.\n</P>\n<br><a name=\"SEC18\" href=\"#TOC1\">CALLOUTS</a><br>\n<P>\nThe <i>subject</i> and <i>mark</i> fields in the callout block that is passed to\na callout function point to 16-bit vectors.\n</P>\n<br><a name=\"SEC19\" href=\"#TOC1\">TESTING</a><br>\n<P>\nThe <b>pcretest</b> program continues to operate with 8-bit input and output\nfiles, but it can be used for testing the 16-bit library. If it is run with the\ncommand line option <b>-16</b>, patterns and subject strings are converted from\n8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions\nare used instead of the 8-bit ones. Returned 16-bit strings are converted to\n8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled,\n<b>pcretest</b> defaults to 16-bit and the <b>-16</b> option is ignored.\n</P>\n<P>\nWhen PCRE is being built, the <b>RunTest</b> script that is called by \"make\ncheck\" uses the <b>pcretest</b> <b>-C</b> option to discover which of the 8-bit,\n16-bit and 32-bit libraries has been built, and runs the tests appropriately.\n</P>\n<br><a name=\"SEC20\" href=\"#TOC1\">NOT SUPPORTED IN 16-BIT MODE</a><br>\n<P>\nNot all the features of the 8-bit library are available with the 16-bit\nlibrary. The C++ and POSIX wrapper functions support only the 8-bit library,\nand the <b>pcregrep</b> program is at present 8-bit only.\n</P>\n<br><a name=\"SEC21\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC22\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 May 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre32.html",
    "content": "<html>\n<head>\n<title>pcre32 specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre32 man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE 32-BIT API BASIC FUNCTIONS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">PCRE 32-BIT API STRING EXTRACTION FUNCTIONS</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">PCRE 32-BIT API AUXILIARY FUNCTIONS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">PCRE 32-BIT API INDIRECTED FUNCTIONS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">PCRE 32-BIT API 32-BIT-ONLY FUNCTION</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">THE PCRE 32-BIT LIBRARY</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">THE HEADER FILE</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">THE LIBRARY NAME</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">STRING TYPES</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">STRUCTURE TYPES</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">32-BIT FUNCTIONS</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">SUBJECT STRING OFFSETS</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">NAMED SUBPATTERNS</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">OPTION NAMES</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">CHARACTER CODES</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">ERROR NAMES</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">ERROR TEXTS</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">CALLOUTS</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">TESTING</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">NOT SUPPORTED IN 32-BIT MODE</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">AUTHOR</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">REVISION</a>\n</ul>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE 32-BIT API BASIC FUNCTIONS</a><br>\n<P>\n<b>pcre32 *pcre32_compile(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre32 *pcre32_compile2(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre32_extra *pcre32_study(const pcre32 *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n<br>\n<br>\n<b>void pcre32_free_study(pcre32_extra *<i>extra</i>);</b>\n<br>\n<br>\n<b>int pcre32_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n<br>\n<br>\n<b>int pcre32_dfa_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">PCRE 32-BIT API STRING EXTRACTION FUNCTIONS</a><br>\n<P>\n<b>int pcre32_copy_named_substring(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>\n<b>     PCRE_UCHAR32 *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre32_copy_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR32 *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_named_substring(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>\n<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_stringnumber(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>name</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_stringtable_entries(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>name</i>, PCRE_UCHAR32 **<i>first</i>, PCRE_UCHAR32 **<i>last</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_substring_list(PCRE_SPTR32 <i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR32 **<i>listptr</i>);</b>\n<br>\n<br>\n<b>void pcre32_free_substring(PCRE_SPTR32 <i>stringptr</i>);</b>\n<br>\n<br>\n<b>void pcre32_free_substring_list(PCRE_SPTR32 *<i>stringptr</i>);</b>\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">PCRE 32-BIT API AUXILIARY FUNCTIONS</a><br>\n<P>\n<b>pcre32_jit_stack *pcre32_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>\n<br>\n<br>\n<b>void pcre32_jit_stack_free(pcre32_jit_stack *<i>stack</i>);</b>\n<br>\n<br>\n<b>void pcre32_assign_jit_stack(pcre32_extra *<i>extra</i>,</b>\n<b>     pcre32_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n<br>\n<br>\n<b>const unsigned char *pcre32_maketables(void);</b>\n<br>\n<br>\n<b>int pcre32_fullinfo(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>int pcre32_refcount(pcre32 *<i>code</i>, int <i>adjust</i>);</b>\n<br>\n<br>\n<b>int pcre32_config(int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>const char *pcre32_version(void);</b>\n<br>\n<br>\n<b>int pcre32_pattern_to_host_byte_order(pcre32 *<i>code</i>,</b>\n<b>     pcre32_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">PCRE 32-BIT API INDIRECTED FUNCTIONS</a><br>\n<P>\n<b>void *(*pcre32_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre32_free)(void *);</b>\n<br>\n<br>\n<b>void *(*pcre32_stack_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre32_stack_free)(void *);</b>\n<br>\n<br>\n<b>int (*pcre32_callout)(pcre32_callout_block *);</b>\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">PCRE 32-BIT API 32-BIT-ONLY FUNCTION</a><br>\n<P>\n<b>int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *<i>output</i>,</b>\n<b>     PCRE_SPTR32 <i>input</i>, int <i>length</i>, int *<i>byte_order</i>,</b>\n<b>     int <i>keep_boms</i>);</b>\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">THE PCRE 32-BIT LIBRARY</a><br>\n<P>\nStarting with release 8.32, it is possible to compile a PCRE library that\nsupports 32-bit character strings, including UTF-32 strings, as well as or\ninstead of the original 8-bit library. This work was done by Christian Persch,\nbased on the work done by Zoltan Herczeg for the 16-bit library. All three\nlibraries contain identical sets of functions, used in exactly the same way.\nOnly the names of the functions and the data types of their arguments and\nresults are different. To avoid over-complication and reduce the documentation\nmaintenance load, most of the PCRE documentation describes the 8-bit library,\nwith only occasional references to the 16-bit and 32-bit libraries. This page\ndescribes what is different when you use the 32-bit library.\n</P>\n<P>\nWARNING: A single application can be linked with all or any of the three\nlibraries, but you must take care when processing any particular pattern\nto use functions from just one library. For example, if you want to study\na pattern that was compiled with <b>pcre32_compile()</b>, you must do so\nwith <b>pcre32_study()</b>, not <b>pcre_study()</b>, and you must free the\nstudy data with <b>pcre32_free_study()</b>.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">THE HEADER FILE</a><br>\n<P>\nThere is only one header file, <b>pcre.h</b>. It contains prototypes for all the\nfunctions in all libraries, as well as definitions of flags, structures, error\ncodes, etc.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">THE LIBRARY NAME</a><br>\n<P>\nIn Unix-like systems, the 32-bit library is called <b>libpcre32</b>, and can\nnormally be accesss by adding <b>-lpcre32</b> to the command for linking an\napplication that uses PCRE.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">STRING TYPES</a><br>\n<P>\nIn the 8-bit library, strings are passed to PCRE library functions as vectors\nof bytes with the C type \"char *\". In the 32-bit library, strings are passed as\nvectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an\nappropriate data type, and PCRE_SPTR32 is defined as \"const PCRE_UCHAR32 *\". In\nvery many environments, \"unsigned int\" is a 32-bit data type. When PCRE is\nbuilt, it defines PCRE_UCHAR32 as \"unsigned int\", but checks that it really is\na 32-bit data type. If it is not, the build fails with an error message telling\nthe maintainer to modify the definition appropriately.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">STRUCTURE TYPES</a><br>\n<P>\nThe types of the opaque structures that are used for compiled 32-bit patterns\nand JIT stacks are <b>pcre32</b> and <b>pcre32_jit_stack</b> respectively. The\ntype of the user-accessible structure that is returned by <b>pcre32_study()</b>\nis <b>pcre32_extra</b>, and the type of the structure that is used for passing\ndata to a callout function is <b>pcre32_callout_block</b>. These structures\ncontain the same fields, with the same names, as their 8-bit counterparts. The\nonly difference is that pointers to character strings are 32-bit instead of\n8-bit types.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">32-BIT FUNCTIONS</a><br>\n<P>\nFor every function in the 8-bit library there is a corresponding function in\nthe 32-bit library with a name that starts with <b>pcre32_</b> instead of\n<b>pcre_</b>. The prototypes are listed above. In addition, there is one extra\nfunction, <b>pcre32_utf32_to_host_byte_order()</b>. This is a utility function\nthat converts a UTF-32 character string to host byte order if necessary. The\nother 32-bit functions expect the strings they are passed to be in host byte\norder.\n</P>\n<P>\nThe <i>input</i> and <i>output</i> arguments of\n<b>pcre32_utf32_to_host_byte_order()</b> may point to the same address, that is,\nconversion in place is supported. The output buffer must be at least as long as\nthe input.\n</P>\n<P>\nThe <i>length</i> argument specifies the number of 32-bit data units in the\ninput string; a negative value specifies a zero-terminated string.\n</P>\n<P>\nIf <i>byte_order</i> is NULL, it is assumed that the string starts off in host\nbyte order. This may be changed by byte-order marks (BOMs) anywhere in the\nstring (commonly as the first character).\n</P>\n<P>\nIf <i>byte_order</i> is not NULL, a non-zero value of the integer to which it\npoints means that the input starts off in host byte order, otherwise the\nopposite order is assumed. Again, BOMs in the string can change this. The final\nbyte order is passed back at the end of processing.\n</P>\n<P>\nIf <i>keep_boms</i> is not zero, byte-order mark characters (0xfeff) are copied\ninto the output string. Otherwise they are discarded.\n</P>\n<P>\nThe result of the function is the number of 32-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">SUBJECT STRING OFFSETS</a><br>\n<P>\nThe lengths and starting offsets of subject strings must be specified in 32-bit\ndata units, and the offsets within subject strings that are returned by the\nmatching functions are in also 32-bit units rather than bytes.\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">NAMED SUBPATTERNS</a><br>\n<P>\nThe name-to-number translation table that is maintained for named subpatterns\nuses 32-bit characters. The <b>pcre32_get_stringtable_entries()</b> function\nreturns the length of each entry in the table as the number of 32-bit data\nunits.\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">OPTION NAMES</a><br>\n<P>\nThere are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK,\nwhich correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In\nfact, these new options define the same bits in the options word. There is a\ndiscussion about the\n<a href=\"pcreunicode.html#utf32strings\">validity of UTF-32 strings</a>\nin the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage.\n</P>\n<P>\nFor the <b>pcre32_config()</b> function there is an option PCRE_CONFIG_UTF32\nthat returns 1 if UTF-32 support is configured, otherwise 0. If this option is\ngiven to <b>pcre_config()</b> or <b>pcre16_config()</b>, or if the\nPCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to <b>pcre32_config()</b>,\nthe result is the PCRE_ERROR_BADOPTION error.\n</P>\n<br><a name=\"SEC15\" href=\"#TOC1\">CHARACTER CODES</a><br>\n<P>\nIn 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the\nsame way as in 8-bit, non UTF-8 mode, except, of course, that they can range\nfrom 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less\nthan 0xff can therefore be influenced by the locale in the same way as before.\nCharacters greater than 0xff have only one case, and no \"type\" (such as letter\nor digit).\n</P>\n<P>\nIn UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with\nthe exception of values in the range 0xd800 to 0xdfff because those are\n\"surrogate\" values that are ill-formed in UTF-32.\n</P>\n<P>\nA UTF-32 string can indicate its endianness by special code knows as a\nbyte-order mark (BOM). The PCRE functions do not handle this, expecting strings\nto be in host byte order. A utility function called\n<b>pcre32_utf32_to_host_byte_order()</b> is provided to help with this (see\nabove).\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">ERROR NAMES</a><br>\n<P>\nThe error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart.\nThe error PCRE_ERROR_BADMODE is given when a compiled\npattern is passed to a function that processes patterns in the other\nmode, for example, if a pattern compiled with <b>pcre_compile()</b> is passed to\n<b>pcre32_exec()</b>.\n</P>\n<P>\nThere are new error codes whose names begin with PCRE_UTF32_ERR for invalid\nUTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that\nare described in the section entitled\n<a href=\"pcreapi.html#badutf8reasons\">\"Reason codes for invalid UTF-8 strings\"</a>\nin the main\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage. The UTF-32 errors are:\n<pre>\n  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)\n  PCRE_UTF32_ERR2  Non-character\n  PCRE_UTF32_ERR3  Character &#62; 0x10ffff\n</PRE>\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">ERROR TEXTS</a><br>\n<P>\nIf there is an error while compiling a pattern, the error text that is passed\nback by <b>pcre32_compile()</b> or <b>pcre32_compile2()</b> is still an 8-bit\ncharacter string, zero-terminated.\n</P>\n<br><a name=\"SEC18\" href=\"#TOC1\">CALLOUTS</a><br>\n<P>\nThe <i>subject</i> and <i>mark</i> fields in the callout block that is passed to\na callout function point to 32-bit vectors.\n</P>\n<br><a name=\"SEC19\" href=\"#TOC1\">TESTING</a><br>\n<P>\nThe <b>pcretest</b> program continues to operate with 8-bit input and output\nfiles, but it can be used for testing the 32-bit library. If it is run with the\ncommand line option <b>-32</b>, patterns and subject strings are converted from\n8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions\nare used instead of the 8-bit ones. Returned 32-bit strings are converted to\n8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled,\n<b>pcretest</b> defaults to 32-bit and the <b>-32</b> option is ignored.\n</P>\n<P>\nWhen PCRE is being built, the <b>RunTest</b> script that is called by \"make\ncheck\" uses the <b>pcretest</b> <b>-C</b> option to discover which of the 8-bit,\n16-bit and 32-bit libraries has been built, and runs the tests appropriately.\n</P>\n<br><a name=\"SEC20\" href=\"#TOC1\">NOT SUPPORTED IN 32-BIT MODE</a><br>\n<P>\nNot all the features of the 8-bit library are available with the 32-bit\nlibrary. The C++ and POSIX wrapper functions support only the 8-bit library,\nand the <b>pcregrep</b> program is at present 8-bit only.\n</P>\n<br><a name=\"SEC21\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC22\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 May 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_assign_jit_stack.html",
    "content": "<html>\n<head>\n<title>pcre_assign_jit_stack specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_assign_jit_stack man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>void pcre_assign_jit_stack(pcre_extra *<i>extra</i>,</b>\n<b>     pcre_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n<br>\n<br>\n<b>void pcre16_assign_jit_stack(pcre16_extra *<i>extra</i>,</b>\n<b>     pcre16_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n<br>\n<br>\n<b>void pcre32_assign_jit_stack(pcre32_extra *<i>extra</i>,</b>\n<b>     pcre32_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function provides control over the memory used as a stack at run-time by a\ncall to <b>pcre[16|32]_exec()</b> with a pattern that has been successfully\ncompiled with JIT optimization. The arguments are:\n<pre>\n  extra     the data pointer returned by <b>pcre[16|32]_study()</b>\n  callback  a callback function\n  data      a JIT stack or a value to be passed to the callback\n              function\n</PRE>\n</P>\n<P>\nIf <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block on\nthe machine stack is used.\n</P>\n<P>\nIf <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must\nbe a valid JIT stack, the result of calling <b>pcre[16|32]_jit_stack_alloc()</b>.\n</P>\n<P>\nIf <i>callback</i> not NULL, it is called with <i>data</i> as an argument at\nthe start of matching, in order to set up a JIT stack. If the result is NULL,\nthe internal 32K stack is used; otherwise the return value must be a valid JIT\nstack, the result of calling <b>pcre[16|32]_jit_stack_alloc()</b>.\n</P>\n<P>\nYou may safely assign the same JIT stack to multiple patterns, as long as they\nare all matched in the same thread. In a multithread application, each thread\nmust use its own JIT stack. For more details, see the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\npage.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_compile.html",
    "content": "<html>\n<head>\n<title>pcre_compile specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_compile man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre16 *pcre16_compile(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre32 *pcre32_compile(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function compiles a regular expression into an internal form. It is the\nsame as <b>pcre[16|32]_compile2()</b>, except for the absence of the\n<i>errorcodeptr</i> argument. Its arguments are:\n<pre>\n  <i>pattern</i>       A zero-terminated string containing the\n                  regular expression to be compiled\n  <i>options</i>       Zero or more option bits\n  <i>errptr</i>        Where to put an error message\n  <i>erroffset</i>     Offset in pattern where error was found\n  <i>tableptr</i>      Pointer to character tables, or NULL to\n                  use the built-in default\n</pre>\nThe option bits are:\n<pre>\n  PCRE_ANCHORED           Force pattern anchoring\n  PCRE_AUTO_CALLOUT       Compile automatic callouts\n  PCRE_BSR_ANYCRLF        \\R matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE        \\R matches all Unicode line endings\n  PCRE_CASELESS           Do caseless matching\n  PCRE_DOLLAR_ENDONLY     $ not to match newline at end\n  PCRE_DOTALL             . matches anything including NL\n  PCRE_DUPNAMES           Allow duplicate names for subpatterns\n  PCRE_EXTENDED           Ignore white space and # comments\n  PCRE_EXTRA              PCRE extra features\n                            (not much use currently)\n  PCRE_FIRSTLINE          Force matching to be before newline\n  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility\n  PCRE_MULTILINE          ^ and $ match newlines within data\n  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)\n  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline\n                            sequences\n  PCRE_NEWLINE_CR         Set CR as the newline sequence\n  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence\n  PCRE_NEWLINE_LF         Set LF as the newline sequence\n  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-\n                            theses (named ones available)\n  PCRE_NO_AUTO_POSSESS    Disable auto-possessification\n  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations\n  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16\n                            validity (only relevant if\n                            PCRE_UTF16 is set)\n  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32\n                            validity (only relevant if\n                            PCRE_UTF32 is set)\n  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8\n                            validity (only relevant if\n                            PCRE_UTF8 is set)\n  PCRE_UCP                Use Unicode properties for \\d, \\w, etc.\n  PCRE_UNGREEDY           Invert greediness of quantifiers\n  PCRE_UTF16              Run in <b>pcre16_compile()</b> UTF-16 mode\n  PCRE_UTF32              Run in <b>pcre32_compile()</b> UTF-32 mode\n  PCRE_UTF8               Run in <b>pcre_compile()</b> UTF-8 mode\n</pre>\nPCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and\nPCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.\n</P>\n<P>\nThe yield of the function is a pointer to a private data structure that\ncontains the compiled pattern, or NULL if an error was detected. Note that\ncompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_compile2.html",
    "content": "<html>\n<head>\n<title>pcre_compile2 specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_compile2 man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre16 *pcre16_compile2(PCRE_SPTR16 <i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre32 *pcre32_compile2(PCRE_SPTR32 <i>pattern</i>, int <i>options</i>,</b>\n<b>\"     int *<i>errorcodeptr</i>,£</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function compiles a regular expression into an internal form. It is the\nsame as <b>pcre[16|32]_compile()</b>, except for the addition of the\n<i>errorcodeptr</i> argument. The arguments are:\n<pre>\n  <i>pattern</i>       A zero-terminated string containing the\n                  regular expression to be compiled\n  <i>options</i>       Zero or more option bits\n  <i>errorcodeptr</i>  Where to put an error code\n  <i>errptr</i>        Where to put an error message\n  <i>erroffset</i>     Offset in pattern where error was found\n  <i>tableptr</i>      Pointer to character tables, or NULL to\n                  use the built-in default\n</pre>\nThe option bits are:\n<pre>\n  PCRE_ANCHORED           Force pattern anchoring\n  PCRE_AUTO_CALLOUT       Compile automatic callouts\n  PCRE_BSR_ANYCRLF        \\R matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE        \\R matches all Unicode line endings\n  PCRE_CASELESS           Do caseless matching\n  PCRE_DOLLAR_ENDONLY     $ not to match newline at end\n  PCRE_DOTALL             . matches anything including NL\n  PCRE_DUPNAMES           Allow duplicate names for subpatterns\n  PCRE_EXTENDED           Ignore white space and # comments\n  PCRE_EXTRA              PCRE extra features\n                            (not much use currently)\n  PCRE_FIRSTLINE          Force matching to be before newline\n  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility\n  PCRE_MULTILINE          ^ and $ match newlines within data\n  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)\n  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline\n                            sequences\n  PCRE_NEWLINE_CR         Set CR as the newline sequence\n  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence\n  PCRE_NEWLINE_LF         Set LF as the newline sequence\n  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-\n                            theses (named ones available)\n  PCRE_NO_AUTO_POSSESS    Disable auto-possessification\n  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations\n  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16\n                            validity (only relevant if\n                            PCRE_UTF16 is set)\n  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32\n                            validity (only relevant if\n                            PCRE_UTF32 is set)\n  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8\n                            validity (only relevant if\n                            PCRE_UTF8 is set)\n  PCRE_UCP                Use Unicode properties for \\d, \\w, etc.\n  PCRE_UNGREEDY           Invert greediness of quantifiers\n  PCRE_UTF16              Run <b>pcre16_compile()</b> in UTF-16 mode\n  PCRE_UTF32              Run <b>pcre32_compile()</b> in UTF-32 mode\n  PCRE_UTF8               Run <b>pcre_compile()</b> in UTF-8 mode\n</pre>\nPCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and\nPCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.\n</P>\n<P>\nThe yield of the function is a pointer to a private data structure that\ncontains the compiled pattern, or NULL if an error was detected. Note that\ncompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_config.html",
    "content": "<html>\n<head>\n<title>pcre_config specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_config man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<P>\n<b>int pcre16_config(int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<P>\n<b>int pcre32_config(int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function makes it possible for a client program to find out which optional\nfeatures are available in the version of the PCRE library it is using. The\narguments are as follows:\n<pre>\n  <i>what</i>     A code specifying what information is required\n  <i>where</i>    Points to where to put the data\n</pre>\nThe <i>where</i> argument must point to an integer variable, except for\nPCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and\nPCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer,\nand for PCRE_CONFIG_JITTARGET, when it must point to a const char*.\nThe available codes are:\n<pre>\n  PCRE_CONFIG_JIT           Availability of just-in-time compiler\n                              support (1=yes 0=no)\n  PCRE_CONFIG_JITTARGET     String containing information about the\n                              target architecture for the JIT compiler,\n                              or NULL if there is no JIT support\n  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4\n  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit\n  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit\n  PCRE_CONFIG_MATCH_LIMIT_RECURSION\n                            Internal recursion depth limit\n  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:\n                                13 (0x000d)    for CR\n                                10 (0x000a)    for LF\n                              3338 (0x0d0a)    for CRLF\n                                -2             for ANYCRLF\n                                -1             for ANY\n  PCRE_CONFIG_BSR           Indicates what \\R matches by default:\n                                 0             all Unicode line endings\n                                 1             CR, LF, or CRLF only\n  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n                            Threshold of return slots, above which\n                              <b>malloc()</b> is used by the POSIX API\n  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)\n  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes\n                               0=no); option for <b>pcre16_config()</b>\n  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes\n                               0=no); option for <b>pcre32_config()</b>\n  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);\n                              option for <b>pcre_config()</b>\n  PCRE_CONFIG_UNICODE_PROPERTIES\n                            Availability of Unicode property support\n                              (1=yes 0=no)\n</pre>\nThe function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error\nis also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to\n<b>pcre_config()</b>, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to\n<b>pcre16_config()</b>, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to\n<b>pcre32_config()</b>.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_copy_named_substring.html",
    "content": "<html>\n<head>\n<title>pcre_copy_named_substring specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_copy_named_substring man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre16_copy_named_substring(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>\n<b>     PCRE_UCHAR16 *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre32_copy_named_substring(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>\n<b>     PCRE_UCHAR32 *<i>buffer</i>, int <i>buffersize</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for extracting a captured substring, identified\nby name, into a given buffer. The arguments are:\n<pre>\n  <i>code</i>          Pattern that was successfully matched\n  <i>subject</i>       Subject that has been successfully matched\n  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used\n  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>\n  <i>stringname</i>    Name of the required substring\n  <i>buffer</i>        Buffer to receive the string\n  <i>buffersize</i>    Size of buffer\n</pre>\nThe yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was\ntoo small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_copy_substring.html",
    "content": "<html>\n<head>\n<title>pcre_copy_substring specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_copy_substring man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre16_copy_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR16 *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre32_copy_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, PCRE_UCHAR32 *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for extracting a captured substring into a given\nbuffer. The arguments are:\n<pre>\n  <i>subject</i>       Subject that has been successfully matched\n  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used\n  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>\n  <i>stringnumber</i>  Number of the required substring\n  <i>buffer</i>        Buffer to receive the string\n  <i>buffersize</i>    Size of buffer\n</pre>\nThe yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was\ntoo small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_dfa_exec.html",
    "content": "<html>\n<head>\n<title>pcre_dfa_exec specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_dfa_exec man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n<br>\n<br>\n<b>int pcre16_dfa_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n<br>\n<br>\n<b>int pcre32_dfa_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function matches a compiled regular expression against a given subject\nstring, using an alternative matching algorithm that scans the subject string\njust once (<i>not</i> Perl-compatible). Note that the main, Perl-compatible,\nmatching function is <b>pcre[16|32]_exec()</b>. The arguments for this function\nare:\n<pre>\n  <i>code</i>         Points to the compiled pattern\n  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,\n                 or is NULL\n  <i>subject</i>      Points to the subject string\n  <i>length</i>       Length of the subject string\n  <i>startoffset</i>  Offset in the subject at which to start matching\n  <i>options</i>      Option bits\n  <i>ovector</i>      Points to a vector of ints for result offsets\n  <i>ovecsize</i>     Number of elements in the vector\n  <i>workspace</i>    Points to a vector of ints used as working space\n  <i>wscount</i>      Number of elements in the vector\n</pre>\nThe units for <i>length</i> and <i>startoffset</i> are bytes for\n<b>pcre_exec()</b>, 16-bit data items for <b>pcre16_exec()</b>, and 32-bit items\nfor <b>pcre32_exec()</b>. The options are:\n<pre>\n  PCRE_ANCHORED          Match only at the first position\n  PCRE_BSR_ANYCRLF       \\R matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE       \\R matches all Unicode line endings\n  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences\n  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence\n  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence\n  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence\n  PCRE_NOTBOL            Subject is not the beginning of a line\n  PCRE_NOTEOL            Subject is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_START_OPTIMIZE Do not do \"start-match\" optimizations\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           even if there is a full match as well\n  PCRE_DFA_SHORTEST      Return only the shortest match\n  PCRE_DFA_RESTART       Restart after a partial match\n</pre>\nThere are restrictions on what may appear in a pattern when using this matching\nfunction. Details are given in the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\ndocumentation. For details of partial matching, see the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\npage.\n</P>\n<P>\nA <b>pcre[16|32]_extra</b> structure contains the following fields:\n<pre>\n  <i>flags</i>            Bits indicating which fields are set\n  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>\n  <i>match_limit</i>      Limit on internal resource use\n  <i>match_limit_recursion</i>  Limit on internal recursion depth\n  <i>callout_data</i>     Opaque data passed back to callouts\n  <i>tables</i>           Points to character tables or is NULL\n  <i>mark</i>             For passing back a *MARK pointer\n  <i>executable_jit</i>   Opaque data from JIT compilation\n</pre>\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this\nmatching function, the <i>match_limit</i> and <i>match_limit_recursion</i> fields\nare not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and\nthe corresponding variable are ignored.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_exec.html",
    "content": "<html>\n<head>\n<title>pcre_exec specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_exec man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n<br>\n<br>\n<b>int pcre16_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n<br>\n<br>\n<b>int pcre32_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function matches a compiled regular expression against a given subject\nstring, using a matching algorithm that is similar to Perl's. It returns\noffsets to captured substrings. Its arguments are:\n<pre>\n  <i>code</i>         Points to the compiled pattern\n  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,\n                 or is NULL\n  <i>subject</i>      Points to the subject string\n  <i>length</i>       Length of the subject string\n  <i>startoffset</i>  Offset in the subject at which to start matching\n  <i>options</i>      Option bits\n  <i>ovector</i>      Points to a vector of ints for result offsets\n  <i>ovecsize</i>     Number of elements in the vector (a multiple of 3)\n</pre>\nThe units for <i>length</i> and <i>startoffset</i> are bytes for\n<b>pcre_exec()</b>, 16-bit data items for <b>pcre16_exec()</b>, and 32-bit items\nfor <b>pcre32_exec()</b>. The options are:\n<pre>\n  PCRE_ANCHORED          Match only at the first position\n  PCRE_BSR_ANYCRLF       \\R matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE       \\R matches all Unicode line endings\n  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences\n  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence\n  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence\n  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence\n  PCRE_NOTBOL            Subject string is not the beginning of a line\n  PCRE_NOTEOL            Subject string is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_START_OPTIMIZE Do not do \"start-match\" optimizations\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           if that is found before a full match\n</pre>\nFor details of partial matching, see the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\npage. A <b>pcre_extra</b> structure contains the following fields:\n<pre>\n  <i>flags</i>            Bits indicating which fields are set\n  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>\n  <i>match_limit</i>      Limit on internal resource use\n  <i>match_limit_recursion</i>  Limit on internal recursion depth\n  <i>callout_data</i>     Opaque data passed back to callouts\n  <i>tables</i>           Points to character tables or is NULL\n  <i>mark</i>             For passing back a *MARK pointer\n  <i>executable_jit</i>   Opaque data from JIT compilation\n</pre>\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_free_study.html",
    "content": "<html>\n<head>\n<title>pcre_free_study specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_free_study man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>void pcre_free_study(pcre_extra *<i>extra</i>);</b>\n</P>\n<P>\n<b>void pcre16_free_study(pcre16_extra *<i>extra</i>);</b>\n</P>\n<P>\n<b>void pcre32_free_study(pcre32_extra *<i>extra</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function is used to free the memory used for the data generated by a call\nto <b>pcre[16|32]_study()</b> when it is no longer needed. The argument must be the\nresult of such a call.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_free_substring.html",
    "content": "<html>\n<head>\n<title>pcre_free_substring specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_free_substring man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>\n</P>\n<P>\n<b>void pcre16_free_substring(PCRE_SPTR16 <i>stringptr</i>);</b>\n</P>\n<P>\n<b>void pcre32_free_substring(PCRE_SPTR32 <i>stringptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for freeing the store obtained by a previous\ncall to <b>pcre[16|32]_get_substring()</b> or <b>pcre[16|32]_get_named_substring()</b>.\nIts only argument is a pointer to the string.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_free_substring_list.html",
    "content": "<html>\n<head>\n<title>pcre_free_substring_list specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_free_substring_list man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>\n</P>\n<P>\n<b>void pcre16_free_substring_list(PCRE_SPTR16 *<i>stringptr</i>);</b>\n</P>\n<P>\n<b>void pcre32_free_substring_list(PCRE_SPTR32 *<i>stringptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for freeing the store obtained by a previous\ncall to <b>pcre[16|32]_get_substring_list()</b>. Its only argument is a pointer to\nthe list of string pointers.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_fullinfo.html",
    "content": "<html>\n<head>\n<title>pcre_fullinfo specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_fullinfo man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>int pcre16_fullinfo(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>int pcre32_fullinfo(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function returns information about a compiled pattern. Its arguments are:\n<pre>\n  <i>code</i>                      Compiled regular expression\n  <i>extra</i>                     Result of <b>pcre[16|32]_study()</b> or NULL\n  <i>what</i>                      What information is required\n  <i>where</i>                     Where to put the information\n</pre>\nThe following information is available:\n<pre>\n  PCRE_INFO_BACKREFMAX      Number of highest back reference\n  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns\n  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables\n  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or\n                              -1 for start of string\n                                 or after newline, or\n                              -2 otherwise\n  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)\n  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist\n  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used\n  PCRE_INFO_JIT             Return 1 after successful JIT compilation\n  PCRE_INFO_JITSIZE         Size of JIT compiled code\n  PCRE_INFO_LASTLITERAL     Literal last data unit required\n  PCRE_INFO_MINLENGTH       Lower bound length of matching strings\n  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,\n                               0 otherwise\n  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET\n  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion\n  PCRE_INFO_NAMECOUNT       Number of named subpatterns\n  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry\n  PCRE_INFO_NAMETABLE       Pointer to name table\n  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried\n                              (always returns 1 after release 8.00)\n  PCRE_INFO_OPTIONS         Option bits used for compilation\n  PCRE_INFO_SIZE            Size of compiled pattern\n  PCRE_INFO_STUDYSIZE       Size of study data\n  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match\n  PCRE_INFO_FIRSTCHARACTERFLAGS Returns\n                                  1 if there is a first data character set, which can\n                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,\n                                  2 if the first character is at the start of the data\n                                    string or after a newline, and\n                                  0 otherwise\n  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET\n  PCRE_INFO_REQUIREDCHAR      Literal last data unit required\n  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then\n                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise\n</pre>\nThe <i>where</i> argument must point to an integer variable, except for the\nfollowing <i>what</i> values:\n<pre>\n  PCRE_INFO_DEFAULT_TABLES  const uint8_t *\n  PCRE_INFO_FIRSTCHARACTER  uint32_t\n  PCRE_INFO_FIRSTTABLE      const uint8_t *\n  PCRE_INFO_JITSIZE         size_t\n  PCRE_INFO_MATCHLIMIT      uint32_t\n  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)\n  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)\n  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)\n  PCRE_INFO_OPTIONS         unsigned long int\n  PCRE_INFO_SIZE            size_t\n  PCRE_INFO_STUDYSIZE       size_t\n  PCRE_INFO_RECURSIONLIMIT  uint32_t\n  PCRE_INFO_REQUIREDCHAR    uint32_t\n</pre>\nThe yield of the function is zero on success or:\n<pre>\n  PCRE_ERROR_NULL           the argument <i>code</i> was NULL\n                            the argument <i>where</i> was NULL\n  PCRE_ERROR_BADMAGIC       the \"magic number\" was not found\n  PCRE_ERROR_BADOPTION      the value of <i>what</i> was invalid\n  PCRE_ERROR_UNSET          the option was not set\n</PRE>\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_get_named_substring.html",
    "content": "<html>\n<head>\n<title>pcre_get_named_substring specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_get_named_substring man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_named_substring(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR16 <i>stringname</i>,</b>\n<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_named_substring(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, PCRE_SPTR32 <i>stringname</i>,</b>\n<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for extracting a captured substring by name. The\narguments are:\n<pre>\n  <i>code</i>          Compiled pattern\n  <i>subject</i>       Subject that has been successfully matched\n  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used\n  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>\n  <i>stringname</i>    Name of the required substring\n  <i>stringptr</i>     Where to put the string pointer\n</pre>\nThe memory in which the substring is placed is obtained by calling\n<b>pcre[16|32]_malloc()</b>. The convenience function\n<b>pcre[16|32]_free_substring()</b> can be used to free it when it is no longer\nneeded. The yield of the function is the length of the extracted substring,\nPCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or\nPCRE_ERROR_NOSUBSTRING if the string name is invalid.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_get_stringnumber.html",
    "content": "<html>\n<head>\n<title>pcre_get_stringnumber specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_get_stringnumber man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_stringnumber(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>name</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_stringnumber(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>name</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis convenience function finds the number of a named substring capturing\nparenthesis in a compiled pattern. Its arguments are:\n<pre>\n  <i>code</i>    Compiled regular expression\n  <i>name</i>    Name whose number is required\n</pre>\nThe yield of the function is the number of the parenthesis if the name is\nfound, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed\n(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by\n<b>pcre[16|32]_get_stringnumber()</b>. You can obtain the complete list by calling\n<b>pcre[16|32]_get_stringtable_entries()</b>.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_get_stringtable_entries.html",
    "content": "<html>\n<head>\n<title>pcre_get_stringtable_entries specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_get_stringtable_entries man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_stringtable_entries(const pcre16 *<i>code</i>,</b>\n<b>     PCRE_SPTR16 <i>name</i>, PCRE_UCHAR16 **<i>first</i>, PCRE_UCHAR16 **<i>last</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_stringtable_entries(const pcre32 *<i>code</i>,</b>\n<b>     PCRE_SPTR32 <i>name</i>, PCRE_UCHAR32 **<i>first</i>, PCRE_UCHAR32 **<i>last</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis convenience function finds, for a compiled pattern, the first and last\nentries for a given name in the table that translates capturing parenthesis\nnames into numbers. When names are required to be unique (PCRE_DUPNAMES is\n<i>not</i> set), it is usually easier to use <b>pcre[16|32]_get_stringnumber()</b>\ninstead.\n<pre>\n  <i>code</i>    Compiled regular expression\n  <i>name</i>    Name whose entries required\n  <i>first</i>   Where to return a pointer to the first entry\n  <i>last</i>    Where to return a pointer to the last entry\n</pre>\nThe yield of the function is the length of each entry, or\nPCRE_ERROR_NOSUBSTRING if none are found.\n</P>\n<P>\nThere is a complete description of the PCRE native API, including the format of\nthe table entries, in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage, and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_get_substring.html",
    "content": "<html>\n<head>\n<title>pcre_get_substring specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_get_substring man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_substring(PCRE_SPTR16 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     PCRE_SPTR16 *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_substring(PCRE_SPTR32 <i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     PCRE_SPTR32 *<i>stringptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for extracting a captured substring. The\narguments are:\n<pre>\n  <i>subject</i>       Subject that has been successfully matched\n  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec()</b> used\n  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec()</b>\n  <i>stringnumber</i>  Number of the required substring\n  <i>stringptr</i>     Where to put the string pointer\n</pre>\nThe memory in which the substring is placed is obtained by calling\n<b>pcre[16|32]_malloc()</b>. The convenience function\n<b>pcre[16|32]_free_substring()</b> can be used to free it when it is no longer\nneeded. The yield of the function is the length of the substring,\nPCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or\nPCRE_ERROR_NOSUBSTRING if the string number is invalid.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_get_substring_list.html",
    "content": "<html>\n<head>\n<title>pcre_get_substring_list specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_get_substring_list man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>\n<br>\n<br>\n<b>int pcre16_get_substring_list(PCRE_SPTR16 <i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR16 **<i>listptr</i>);</b>\n<br>\n<br>\n<b>int pcre32_get_substring_list(PCRE_SPTR32 <i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, PCRE_SPTR32 **<i>listptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis is a convenience function for extracting a list of all the captured\nsubstrings. The arguments are:\n<pre>\n  <i>subject</i>       Subject that has been successfully matched\n  <i>ovector</i>       Offset vector that <b>pcre[16|32]_exec</b> used\n  <i>stringcount</i>   Value returned by <b>pcre[16|32]_exec</b>\n  <i>listptr</i>       Where to put a pointer to the list\n</pre>\nThe memory in which the substrings and the list are placed is obtained by\ncalling <b>pcre[16|32]_malloc()</b>. The convenience function\n<b>pcre[16|32]_free_substring_list()</b> can be used to free it when it is no\nlonger needed. A pointer to a list of pointers is put in the variable whose\naddress is in <i>listptr</i>. The list is terminated by a NULL pointer. The\nyield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient\nmemory could not be obtained.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_jit_exec.html",
    "content": "<html>\n<head>\n<title>pcre_jit_exec specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_jit_exec man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_jit_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     pcre_jit_stack *<i>jstack</i>);</b>\n<br>\n<br>\n<b>int pcre16_jit_exec(const pcre16 *<i>code</i>, const pcre16_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR16 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     pcre_jit_stack *<i>jstack</i>);</b>\n<br>\n<br>\n<b>int pcre32_jit_exec(const pcre32 *<i>code</i>, const pcre32_extra *<i>extra</i>,</b>\n<b>     PCRE_SPTR32 <i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     pcre_jit_stack *<i>jstack</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function matches a compiled regular expression that has been successfully\nstudied with one of the JIT options against a given subject string, using a\nmatching algorithm that is similar to Perl's. It is a \"fast path\" interface to\nJIT, and it bypasses some of the sanity checks that <b>pcre_exec()</b> applies.\nIt returns offsets to captured substrings. Its arguments are:\n<pre>\n  <i>code</i>         Points to the compiled pattern\n  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,\n                 or is NULL\n  <i>subject</i>      Points to the subject string\n  <i>length</i>       Length of the subject string, in bytes\n  <i>startoffset</i>  Offset in bytes in the subject at which to\n                 start matching\n  <i>options</i>      Option bits\n  <i>ovector</i>      Points to a vector of ints for result offsets\n  <i>ovecsize</i>     Number of elements in the vector (a multiple of 3)\n  <i>jstack</i>       Pointer to a JIT stack\n</pre>\nThe allowed options are:\n<pre>\n  PCRE_NOTBOL            Subject string is not the beginning of a line\n  PCRE_NOTEOL            Subject string is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           if that is found before a full match\n</pre>\nHowever, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check\nis never applied. For details of partial matching, see the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\npage. A <b>pcre_extra</b> structure contains the following fields:\n<pre>\n  <i>flags</i>            Bits indicating which fields are set\n  <i>study_data</i>       Opaque data from <b>pcre[16|32]_study()</b>\n  <i>match_limit</i>      Limit on internal resource use\n  <i>match_limit_recursion</i>  Limit on internal recursion depth\n  <i>callout_data</i>     Opaque data passed back to callouts\n  <i>tables</i>           Points to character tables or is NULL\n  <i>mark</i>             For passing back a *MARK pointer\n  <i>executable_jit</i>   Opaque data from JIT compilation\n</pre>\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the JIT API in the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_jit_stack_alloc.html",
    "content": "<html>\n<head>\n<title>pcre_jit_stack_alloc specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_jit_stack_alloc man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>pcre_jit_stack *pcre_jit_stack_alloc(int <i>startsize</i>,</b>\n<b>     int <i>maxsize</i>);</b>\n<br>\n<br>\n<b>pcre16_jit_stack *pcre16_jit_stack_alloc(int <i>startsize</i>,</b>\n<b>     int <i>maxsize</i>);</b>\n<br>\n<br>\n<b>pcre32_jit_stack *pcre32_jit_stack_alloc(int <i>startsize</i>,</b>\n<b>     int <i>maxsize</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function is used to create a stack for use by the code compiled by the JIT\noptimization of <b>pcre[16|32]_study()</b>. The arguments are a starting size for\nthe stack, and a maximum size to which it is allowed to grow. The result can be\npassed to the JIT run-time code by <b>pcre[16|32]_assign_jit_stack()</b>, or that\nfunction can set up a callback for obtaining a stack. A maximum stack size of\n512K to 1M should be more than enough for any pattern. For more details, see\nthe\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\npage.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_jit_stack_free.html",
    "content": "<html>\n<head>\n<title>pcre_jit_stack_free specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_jit_stack_free man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>void pcre_jit_stack_free(pcre_jit_stack *<i>stack</i>);</b>\n</P>\n<P>\n<b>void pcre16_jit_stack_free(pcre16_jit_stack *<i>stack</i>);</b>\n</P>\n<P>\n<b>void pcre32_jit_stack_free(pcre32_jit_stack *<i>stack</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function is used to free a JIT stack that was created by\n<b>pcre[16|32]_jit_stack_alloc()</b> when it is no longer needed. For more details,\nsee the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\npage.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_maketables.html",
    "content": "<html>\n<head>\n<title>pcre_maketables specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_maketables man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>const unsigned char *pcre_maketables(void);</b>\n</P>\n<P>\n<b>const unsigned char *pcre16_maketables(void);</b>\n</P>\n<P>\n<b>const unsigned char *pcre32_maketables(void);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function builds a set of character tables for character values less than\n256. These can be passed to <b>pcre[16|32]_compile()</b> to override PCRE's\ninternal, built-in tables (which were made by <b>pcre[16|32]_maketables()</b> when\nPCRE was compiled). You might want to do this if you are using a non-standard\nlocale. The function yields a pointer to the tables.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_pattern_to_host_byte_order.html",
    "content": "<html>\n<head>\n<title>pcre_pattern_to_host_byte_order specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_pattern_to_host_byte_order man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_pattern_to_host_byte_order(pcre *<i>code</i>,</b>\n<b>     pcre_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n<br>\n<br>\n<b>int pcre16_pattern_to_host_byte_order(pcre16 *<i>code</i>,</b>\n<b>     pcre16_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n<br>\n<br>\n<b>int pcre32_pattern_to_host_byte_order(pcre32 *<i>code</i>,</b>\n<b>     pcre32_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function ensures that the bytes in 2-byte and 4-byte values in a compiled\npattern are in the correct order for the current host. It is useful when a\npattern that has been compiled on one host is transferred to another that might\nhave different endianness. The arguments are:\n<pre>\n  <i>code</i>         A compiled regular expression\n  <i>extra</i>        Points to an associated <b>pcre[16|32]_extra</b> structure,\n                 or is NULL\n  <i>tables</i>       Pointer to character tables, or NULL to\n                 set the built-in default\n</pre>\nThe result is 0 for success, a negative PCRE_ERROR_xxx value otherwise.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_refcount.html",
    "content": "<html>\n<head>\n<title>pcre_refcount specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_refcount man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>\n</P>\n<P>\n<b>int pcre16_refcount(pcre16 *<i>code</i>, int <i>adjust</i>);</b>\n</P>\n<P>\n<b>int pcre32_refcount(pcre32 *<i>code</i>, int <i>adjust</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function is used to maintain a reference count inside a data block that\ncontains a compiled pattern. Its arguments are:\n<pre>\n  <i>code</i>                      Compiled regular expression\n  <i>adjust</i>                    Adjustment to reference value\n</pre>\nThe yield of the function is the adjusted reference value, which is constrained\nto lie between 0 and 65535.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_study.html",
    "content": "<html>\n<head>\n<title>pcre_study specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_study man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n<br>\n<br>\n<b>pcre16_extra *pcre16_study(const pcre16 *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n<br>\n<br>\n<b>pcre32_extra *pcre32_study(const pcre32 *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function studies a compiled pattern, to see if additional information can\nbe extracted that might speed up matching. Its arguments are:\n<pre>\n  <i>code</i>       A compiled regular expression\n  <i>options</i>    Options for <b>pcre[16|32]_study()</b>\n  <i>errptr</i>     Where to put an error message\n</pre>\nIf the function succeeds, it returns a value that can be passed to\n<b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> via their <i>extra</i>\narguments.\n</P>\n<P>\nIf the function returns NULL, either it could not find any additional\ninformation, or there was an error. You can tell the difference by looking at\nthe error value. It is NULL in first case.\n</P>\n<P>\nThe only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation\nif possible. If PCRE has been compiled without JIT support, this option is\nignored. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\npage for further details.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_utf16_to_host_byte_order.html",
    "content": "<html>\n<head>\n<title>pcre_utf16_to_host_byte_order specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_utf16_to_host_byte_order man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *<i>output</i>,</b>\n<b>     PCRE_SPTR16 <i>input</i>, int <i>length</i>, int *<i>host_byte_order</i>,</b>\n<b>     int <i>keep_boms</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function, which exists only in the 16-bit library, converts a UTF-16\nstring to the correct order for the current host, taking account of any byte\norder marks (BOMs) within the string. Its arguments are:\n<pre>\n  <i>output</i>           pointer to output buffer, may be the same as <i>input</i>\n  <i>input</i>            pointer to input buffer\n  <i>length</i>           number of 16-bit units in the input, or negative for\n                     a zero-terminated string\n  <i>host_byte_order</i>  a NULL value or a non-zero value pointed to means\n                     start in host byte order\n  <i>keep_boms</i>        if non-zero, BOMs are copied to the output string\n</pre>\nThe result of the function is the number of 16-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n</P>\n<P>\nIf <i>host_byte_order</i> is not NULL, it is set to indicate the byte order that\nis current at the end of the string.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_utf32_to_host_byte_order.html",
    "content": "<html>\n<head>\n<title>pcre_utf32_to_host_byte_order specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_utf32_to_host_byte_order man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *<i>output</i>,</b>\n<b>     PCRE_SPTR32 <i>input</i>, int <i>length</i>, int *<i>host_byte_order</i>,</b>\n<b>     int <i>keep_boms</i>);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function, which exists only in the 32-bit library, converts a UTF-32\nstring to the correct order for the current host, taking account of any byte\norder marks (BOMs) within the string. Its arguments are:\n<pre>\n  <i>output</i>           pointer to output buffer, may be the same as <i>input</i>\n  <i>input</i>            pointer to input buffer\n  <i>length</i>           number of 32-bit units in the input, or negative for\n                     a zero-terminated string\n  <i>host_byte_order</i>  a NULL value or a non-zero value pointed to means\n                     start in host byte order\n  <i>keep_boms</i>        if non-zero, BOMs are copied to the output string\n</pre>\nThe result of the function is the number of 32-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n</P>\n<P>\nIf <i>host_byte_order</i> is not NULL, it is set to indicate the byte order that\nis current at the end of the string.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcre_version.html",
    "content": "<html>\n<head>\n<title>pcre_version specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcre_version man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSYNOPSIS\n</b><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>const char *pcre_version(void);</b>\n</P>\n<P>\n<b>const char *pcre16_version(void);</b>\n</P>\n<P>\n<b>const char *pcre32_version(void);</b>\n</P>\n<br><b>\nDESCRIPTION\n</b><br>\n<P>\nThis function (even in the 16-bit and 32-bit libraries) returns a\nzero-terminated, 8-bit character string that gives the version number of the\nPCRE library and the date of its release.\n</P>\n<P>\nThere is a complete description of the PCRE native API in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage and a description of the POSIX API in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\npage.\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcreapi.html",
    "content": "<html>\n<head>\n<title>pcreapi specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcreapi man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE NATIVE API BASIC FUNCTIONS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">PCRE NATIVE API STRING EXTRACTION FUNCTIONS</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">PCRE NATIVE API AUXILIARY FUNCTIONS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">PCRE NATIVE API INDIRECTED FUNCTIONS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">PCRE API OVERVIEW</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">NEWLINES</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">MULTITHREADING</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">SAVING PRECOMPILED PATTERNS FOR LATER USE</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">CHECKING BUILD-TIME OPTIONS</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">COMPILING A PATTERN</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">COMPILATION ERROR CODES</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">STUDYING A PATTERN</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">LOCALE SUPPORT</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">INFORMATION ABOUT A PATTERN</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">REFERENCE COUNTS</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">DUPLICATE SUBPATTERN NAMES</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">FINDING ALL POSSIBLE MATCHES</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">OBTAINING AN ESTIMATE OF STACK USAGE</a>\n<li><a name=\"TOC23\" href=\"#SEC23\">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a>\n<li><a name=\"TOC24\" href=\"#SEC24\">SEE ALSO</a>\n<li><a name=\"TOC25\" href=\"#SEC25\">AUTHOR</a>\n<li><a name=\"TOC26\" href=\"#SEC26\">REVISION</a>\n</ul>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE NATIVE API BASIC FUNCTIONS</a><br>\n<P>\n<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n<br>\n<br>\n<b>void pcre_free_study(pcre_extra *<i>extra</i>);</b>\n<br>\n<br>\n<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n<br>\n<br>\n<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">PCRE NATIVE API STRING EXTRACTION FUNCTIONS</a><br>\n<P>\n<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>);</b>\n<br>\n<br>\n<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>\n<br>\n<br>\n<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>\n<br>\n<br>\n<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>\n<br>\n<br>\n<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">PCRE NATIVE API AUXILIARY FUNCTIONS</a><br>\n<P>\n<b>int pcre_jit_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     pcre_jit_stack *<i>jstack</i>);</b>\n<br>\n<br>\n<b>pcre_jit_stack *pcre_jit_stack_alloc(int <i>startsize</i>, int <i>maxsize</i>);</b>\n<br>\n<br>\n<b>void pcre_jit_stack_free(pcre_jit_stack *<i>stack</i>);</b>\n<br>\n<br>\n<b>void pcre_assign_jit_stack(pcre_extra *<i>extra</i>,</b>\n<b>     pcre_jit_callback <i>callback</i>, void *<i>data</i>);</b>\n<br>\n<br>\n<b>const unsigned char *pcre_maketables(void);</b>\n<br>\n<br>\n<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>\n<br>\n<br>\n<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>\n<br>\n<br>\n<b>const char *pcre_version(void);</b>\n<br>\n<br>\n<b>int pcre_pattern_to_host_byte_order(pcre *<i>code</i>,</b>\n<b>     pcre_extra *<i>extra</i>, const unsigned char *<i>tables</i>);</b>\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">PCRE NATIVE API INDIRECTED FUNCTIONS</a><br>\n<P>\n<b>void *(*pcre_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre_free)(void *);</b>\n<br>\n<br>\n<b>void *(*pcre_stack_malloc)(size_t);</b>\n<br>\n<br>\n<b>void (*pcre_stack_free)(void *);</b>\n<br>\n<br>\n<b>int (*pcre_callout)(pcre_callout_block *);</b>\n<br>\n<br>\n<b>int (*pcre_stack_guard)(void);</b>\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES</a><br>\n<P>\nAs well as support for 8-bit character strings, PCRE also supports 16-bit\nstrings (from release 8.30) and 32-bit strings (from release 8.32), by means of\ntwo additional libraries. They can be built as well as, or instead of, the\n8-bit library. To avoid too much complication, this document describes the\n8-bit versions of the functions, with only occasional references to the 16-bit\nand 32-bit libraries.\n</P>\n<P>\nThe 16-bit and 32-bit functions operate in the same way as their 8-bit\ncounterparts; they just use different data types for their arguments and\nresults, and their names start with <b>pcre16_</b> or <b>pcre32_</b> instead of\n<b>pcre_</b>. For every option that has UTF8 in its name (for example,\nPCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced\nby UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the\n16-bit and 32-bit option names define the same bit values.\n</P>\n<P>\nReferences to bytes and UTF-8 in this document should be read as references to\n16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data\nunits and UTF-32 when using the 32-bit library, unless specified otherwise.\nMore details of the specific differences for the 16-bit and 32-bit libraries\nare given in the\n<a href=\"pcre16.html\"><b>pcre16</b></a>\nand\n<a href=\"pcre32.html\"><b>pcre32</b></a>\npages.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">PCRE API OVERVIEW</a><br>\n<P>\nPCRE has its own native API, which is described in this document. There are\nalso some wrapper functions (for the 8-bit library only) that correspond to the\nPOSIX regular expression API, but they do not give access to all the\nfunctionality. They are described in the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\ndocumentation. Both of these APIs define a set of C function calls. A C++\nwrapper (again for the 8-bit library only) is also distributed with PCRE. It is\ndocumented in the\n<a href=\"pcrecpp.html\"><b>pcrecpp</b></a>\npage.\n</P>\n<P>\nThe native API C function prototypes are defined in the header file\n<b>pcre.h</b>, and on Unix-like systems the (8-bit) library itself is called\n<b>libpcre</b>. It can normally be accessed by adding <b>-lpcre</b> to the\ncommand for linking an application that uses PCRE. The header file defines the\nmacros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers\nfor the library. Applications can use these to include support for different\nreleases of PCRE.\n</P>\n<P>\nIn a Windows environment, if you want to statically link an application program\nagainst a non-dll <b>pcre.a</b> file, you must define PCRE_STATIC before\nincluding <b>pcre.h</b> or <b>pcrecpp.h</b>, because otherwise the\n<b>pcre_malloc()</b> and <b>pcre_free()</b> exported functions will be declared\n<b>__declspec(dllimport)</b>, with unwanted results.\n</P>\n<P>\nThe functions <b>pcre_compile()</b>, <b>pcre_compile2()</b>, <b>pcre_study()</b>,\nand <b>pcre_exec()</b> are used for compiling and matching regular expressions\nin a Perl-compatible manner. A sample program that demonstrates the simplest\nway of using them is provided in the file called <i>pcredemo.c</i> in the PCRE\nsource distribution. A listing of this program is given in the\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\ndocumentation, and the\n<a href=\"pcresample.html\"><b>pcresample</b></a>\ndocumentation describes how to compile and run it.\n</P>\n<P>\nJust-in-time compiler support is an optional feature of PCRE that can be built\nin appropriate hardware environments. It greatly speeds up the matching\nperformance of many patterns. Simple programs can easily request that it be\nused if available, by setting an option that is ignored when it is not\nrelevant. More complicated programs might need to make use of the functions\n<b>pcre_jit_stack_alloc()</b>, <b>pcre_jit_stack_free()</b>, and\n<b>pcre_assign_jit_stack()</b> in order to control the JIT code's memory usage.\n</P>\n<P>\nFrom release 8.32 there is also a direct interface for JIT execution, which\ngives improved performance. The JIT-specific functions are discussed in the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation.\n</P>\n<P>\nA second matching function, <b>pcre_dfa_exec()</b>, which is not\nPerl-compatible, is also provided. This uses a different algorithm for the\nmatching. The alternative algorithm finds all possible matches (at a given\npoint in the subject), and scans the subject just once (unless there are\nlookbehind assertions). However, this algorithm does not return captured\nsubstrings. A description of the two matching algorithms and their advantages\nand disadvantages is given in the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\ndocumentation.\n</P>\n<P>\nIn addition to the main compiling and matching functions, there are convenience\nfunctions for extracting captured substrings from a subject string that is\nmatched by <b>pcre_exec()</b>. They are:\n<pre>\n  <b>pcre_copy_substring()</b>\n  <b>pcre_copy_named_substring()</b>\n  <b>pcre_get_substring()</b>\n  <b>pcre_get_named_substring()</b>\n  <b>pcre_get_substring_list()</b>\n  <b>pcre_get_stringnumber()</b>\n  <b>pcre_get_stringtable_entries()</b>\n</pre>\n<b>pcre_free_substring()</b> and <b>pcre_free_substring_list()</b> are also\nprovided, to free the memory used for extracted strings.\n</P>\n<P>\nThe function <b>pcre_maketables()</b> is used to build a set of character tables\nin the current locale for passing to <b>pcre_compile()</b>, <b>pcre_exec()</b>,\nor <b>pcre_dfa_exec()</b>. This is an optional facility that is provided for\nspecialist use. Most commonly, no special tables are passed, in which case\ninternal tables that are generated when PCRE is built are used.\n</P>\n<P>\nThe function <b>pcre_fullinfo()</b> is used to find out information about a\ncompiled pattern. The function <b>pcre_version()</b> returns a pointer to a\nstring containing the version of PCRE and its date of release.\n</P>\n<P>\nThe function <b>pcre_refcount()</b> maintains a reference count in a data block\ncontaining a compiled pattern. This is provided for the benefit of\nobject-oriented applications.\n</P>\n<P>\nThe global variables <b>pcre_malloc</b> and <b>pcre_free</b> initially contain\nthe entry points of the standard <b>malloc()</b> and <b>free()</b> functions,\nrespectively. PCRE calls the memory management functions via these variables,\nso a calling program can replace them if it wishes to intercept the calls. This\nshould be done before calling any PCRE functions.\n</P>\n<P>\nThe global variables <b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> are also\nindirections to memory management functions. These special functions are used\nonly when PCRE is compiled to use the heap for remembering data, instead of\nrecursive function calls, when running the <b>pcre_exec()</b> function. See the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation for details of how to do this. It is a non-standard way of\nbuilding PCRE, for use in environments that have limited stacks. Because of the\ngreater use of memory management, it runs more slowly. Separate functions are\nprovided so that special-purpose external code can be used for this case. When\nused, these functions always allocate memory blocks of the same size. There is\na discussion about PCRE's stack usage in the\n<a href=\"pcrestack.html\"><b>pcrestack</b></a>\ndocumentation.\n</P>\n<P>\nThe global variable <b>pcre_callout</b> initially contains NULL. It can be set\nby the caller to a \"callout\" function, which PCRE will then call at specified\npoints during a matching operation. Details are given in the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n</P>\n<P>\nThe global variable <b>pcre_stack_guard</b> initially contains NULL. It can be\nset by the caller to a function that is called by PCRE whenever it starts\nto compile a parenthesized part of a pattern. When parentheses are nested, PCRE\nuses recursive function calls, which use up the system stack. This function is\nprovided so that applications with restricted stacks can force a compilation\nerror if the stack runs out. The function should return zero if all is well, or\nnon-zero to force an error.\n<a name=\"newlines\"></a></P>\n<br><a name=\"SEC7\" href=\"#TOC1\">NEWLINES</a><br>\n<P>\nPCRE supports five different conventions for indicating line breaks in\nstrings: a single CR (carriage return) character, a single LF (linefeed)\ncharacter, the two-character sequence CRLF, any of the three preceding, or any\nUnicode newline sequence. The Unicode newline sequences are the three just\nmentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,\nU+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS\n(paragraph separator, U+2029).\n</P>\n<P>\nEach of the first three conventions is used by at least one operating system as\nits standard newline sequence. When PCRE is built, a default can be specified.\nThe default default is LF, which is the Unix standard. When PCRE is run, the\ndefault can be overridden, either when a pattern is compiled, or when it is\nmatched.\n</P>\n<P>\nAt compile time, the newline convention can be specified by the <i>options</i>\nargument of <b>pcre_compile()</b>, or it can be specified by special text at the\nstart of the pattern itself; this overrides any other settings. See the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\npage for details of the special character sequences.\n</P>\n<P>\nIn the PCRE documentation the word \"newline\" is used to mean \"the character or\npair of characters that indicate a line break\". The choice of newline\nconvention affects the handling of the dot, circumflex, and dollar\nmetacharacters, the handling of #-comments in /x mode, and, when CRLF is a\nrecognized line ending sequence, the match position advancement for a\nnon-anchored pattern. There is more detail about this in the\n<a href=\"#execoptions\">section on <b>pcre_exec()</b> options</a>\nbelow.\n</P>\n<P>\nThe choice of newline convention does not affect the interpretation of\nthe \\n or \\r escape sequences, nor does it affect what \\R matches, which is\ncontrolled in a similar way, but by separate options.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">MULTITHREADING</a><br>\n<P>\nThe PCRE functions can be used in multi-threading applications, with the\nproviso that the memory management functions pointed to by <b>pcre_malloc</b>,\n<b>pcre_free</b>, <b>pcre_stack_malloc</b>, and <b>pcre_stack_free</b>, and the\ncallout and stack-checking functions pointed to by <b>pcre_callout</b> and\n<b>pcre_stack_guard</b>, are shared by all threads.\n</P>\n<P>\nThe compiled form of a regular expression is not altered during matching, so\nthe same compiled pattern can safely be used by several threads at once.\n</P>\n<P>\nIf the just-in-time optimization feature is being used, it needs separate\nmemory stack areas for each thread. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for more details.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">SAVING PRECOMPILED PATTERNS FOR LATER USE</a><br>\n<P>\nThe compiled form of a regular expression can be saved and re-used at a later\ntime, possibly by a different program, and even on a host other than the one on\nwhich it was compiled. Details are given in the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation, which includes a description of the\n<b>pcre_pattern_to_host_byte_order()</b> function. However, compiling a regular\nexpression with one version of PCRE for use with a different version is not\nguaranteed to work and may cause crashes.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">CHECKING BUILD-TIME OPTIONS</a><br>\n<P>\n<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<P>\nThe function <b>pcre_config()</b> makes it possible for a PCRE client to\ndiscover which optional features have been compiled into the PCRE library. The\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation has more details about these optional features.\n</P>\n<P>\nThe first argument for <b>pcre_config()</b> is an integer, specifying which\ninformation is required; the second argument is a pointer to a variable into\nwhich the information is placed. The returned value is zero on success, or the\nnegative error code PCRE_ERROR_BADOPTION if the value in the first argument is\nnot recognized. The following information is available:\n<pre>\n  PCRE_CONFIG_UTF8\n</pre>\nThe output is an integer that is set to one if UTF-8 support is available;\notherwise it is set to zero. This value should normally be given to the 8-bit\nversion of this function, <b>pcre_config()</b>. If it is given to the 16-bit\nor 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n<pre>\n  PCRE_CONFIG_UTF16\n</pre>\nThe output is an integer that is set to one if UTF-16 support is available;\notherwise it is set to zero. This value should normally be given to the 16-bit\nversion of this function, <b>pcre16_config()</b>. If it is given to the 8-bit\nor 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n<pre>\n  PCRE_CONFIG_UTF32\n</pre>\nThe output is an integer that is set to one if UTF-32 support is available;\notherwise it is set to zero. This value should normally be given to the 32-bit\nversion of this function, <b>pcre32_config()</b>. If it is given to the 8-bit\nor 16-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n<pre>\n  PCRE_CONFIG_UNICODE_PROPERTIES\n</pre>\nThe output is an integer that is set to one if support for Unicode character\nproperties is available; otherwise it is set to zero.\n<pre>\n  PCRE_CONFIG_JIT\n</pre>\nThe output is an integer that is set to one if support for just-in-time\ncompiling is available; otherwise it is set to zero.\n<pre>\n  PCRE_CONFIG_JITTARGET\n</pre>\nThe output is a pointer to a zero-terminated \"const char *\" string. If JIT\nsupport is available, the string contains the name of the architecture for\nwhich the JIT compiler is configured, for example \"x86 32bit (little endian +\nunaligned)\". If JIT support is not available, the result is NULL.\n<pre>\n  PCRE_CONFIG_NEWLINE\n</pre>\nThe output is an integer whose value specifies the default character sequence\nthat is recognized as meaning \"newline\". The values that are supported in\nASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for\nANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the\nsame values. However, the value for LF is normally 21, though some EBCDIC\nenvironments use 37. The corresponding values for CRLF are 3349 and 3365. The\ndefault should normally correspond to the standard sequence for your operating\nsystem.\n<pre>\n  PCRE_CONFIG_BSR\n</pre>\nThe output is an integer whose value indicates what character sequences the \\R\nescape sequence matches by default. A value of 0 means that \\R matches any\nUnicode line ending sequence; a value of 1 means that \\R matches only CR, LF,\nor CRLF. The default can be overridden when a pattern is compiled or matched.\n<pre>\n  PCRE_CONFIG_LINK_SIZE\n</pre>\nThe output is an integer that contains the number of bytes used for internal\nlinkage in compiled regular expressions. For the 8-bit library, the value can\nbe 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still\na number of bytes. For the 32-bit library, the value is either 2 or 4 and is\nstill a number of bytes. The default value of 2 is sufficient for all but the\nmost massive patterns, since it allows the compiled pattern to be up to 64K in\nsize. Larger values allow larger regular expressions to be compiled, at the\nexpense of slower matching.\n<pre>\n  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n</pre>\nThe output is an integer that contains the threshold above which the POSIX\ninterface uses <b>malloc()</b> for output vectors. Further details are given in\nthe\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\ndocumentation.\n<pre>\n  PCRE_CONFIG_PARENS_LIMIT\n</pre>\nThe output is a long integer that gives the maximum depth of nesting of\nparentheses (of any kind) in a pattern. This limit is imposed to cap the amount\nof system stack used when a pattern is compiled. It is specified when PCRE is\nbuilt; the default is 250. This limit does not take into account the stack that\nmay already be used by the calling application. For finer control over\ncompilation stack usage, you can set a pointer to an external checking function\nin <b>pcre_stack_guard</b>.\n<pre>\n  PCRE_CONFIG_MATCH_LIMIT\n</pre>\nThe output is a long integer that gives the default limit for the number of\ninternal matching function calls in a <b>pcre_exec()</b> execution. Further\ndetails are given with <b>pcre_exec()</b> below.\n<pre>\n  PCRE_CONFIG_MATCH_LIMIT_RECURSION\n</pre>\nThe output is a long integer that gives the default limit for the depth of\nrecursion when calling the internal matching function in a <b>pcre_exec()</b>\nexecution. Further details are given with <b>pcre_exec()</b> below.\n<pre>\n  PCRE_CONFIG_STACKRECURSE\n</pre>\nThe output is an integer that is set to one if internal recursion when running\n<b>pcre_exec()</b> is implemented by recursive function calls that use the stack\nto remember their state. This is the usual way that PCRE is compiled. The\noutput is zero if PCRE was compiled to use blocks of data on the heap instead\nof recursive function calls. In this case, <b>pcre_stack_malloc</b> and\n<b>pcre_stack_free</b> are called to manage memory blocks on the heap, thus\navoiding the use of the stack.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">COMPILING A PATTERN</a><br>\n<P>\n<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n<br>\n<br>\n<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>\n<b>     int *<i>errorcodeptr</i>,</b>\n<b>     const char **<i>errptr</i>, int *<i>erroffset</i>,</b>\n<b>     const unsigned char *<i>tableptr</i>);</b>\n</P>\n<P>\nEither of the functions <b>pcre_compile()</b> or <b>pcre_compile2()</b> can be\ncalled to compile a pattern into an internal form. The only difference between\nthe two interfaces is that <b>pcre_compile2()</b> has an additional argument,\n<i>errorcodeptr</i>, via which a numerical error code can be returned. To avoid\ntoo much repetition, we refer just to <b>pcre_compile()</b> below, but the\ninformation applies equally to <b>pcre_compile2()</b>.\n</P>\n<P>\nThe pattern is a C string terminated by a binary zero, and is passed in the\n<i>pattern</i> argument. A pointer to a single block of memory that is obtained\nvia <b>pcre_malloc</b> is returned. This contains the compiled code and related\ndata. The <b>pcre</b> type is defined for the returned block; this is a typedef\nfor a structure whose contents are not externally defined. It is up to the\ncaller to free the memory (via <b>pcre_free</b>) when it is no longer required.\n</P>\n<P>\nAlthough the compiled code of a PCRE regex is relocatable, that is, it does not\ndepend on memory location, the complete <b>pcre</b> data block is not\nfully relocatable, because it may contain a copy of the <i>tableptr</i>\nargument, which is an address (see below).\n</P>\n<P>\nThe <i>options</i> argument contains various bit settings that affect the\ncompilation. It should be zero if no options are required. The available\noptions are described below. Some of them (in particular, those that are\ncompatible with Perl, but some others as well) can also be set and unset from\nwithin the pattern (see the detailed description in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation). For those options that can be different in different parts of\nthe pattern, the contents of the <i>options</i> argument specifies their\nsettings at the start of compilation and execution. The PCRE_ANCHORED,\nPCRE_BSR_<i>xxx</i>, PCRE_NEWLINE_<i>xxx</i>, PCRE_NO_UTF8_CHECK, and\nPCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at\ncompile time.\n</P>\n<P>\nIf <i>errptr</i> is NULL, <b>pcre_compile()</b> returns NULL immediately.\nOtherwise, if compilation of a pattern fails, <b>pcre_compile()</b> returns\nNULL, and sets the variable pointed to by <i>errptr</i> to point to a textual\nerror message. This is a static string that is part of the library. You must\nnot try to free it. Normally, the offset from the start of the pattern to the\ndata unit that was being processed when the error was discovered is placed in\nthe variable pointed to by <i>erroffset</i>, which must not be NULL (if it is,\nan immediate error is given). However, for an invalid UTF-8 or UTF-16 string,\nthe offset is that of the first data unit of the failing character.\n</P>\n<P>\nSome errors are not detected until the whole pattern has been scanned; in these\ncases, the offset passed back is the length of the pattern. Note that the\noffset is in data units, not characters, even in a UTF mode. It may sometimes\npoint into the middle of a UTF-8 or UTF-16 character.\n</P>\n<P>\nIf <b>pcre_compile2()</b> is used instead of <b>pcre_compile()</b>, and the\n<i>errorcodeptr</i> argument is not NULL, a non-zero error code number is\nreturned via this argument in the event of an error. This is in addition to the\ntextual error message. Error codes and messages are listed below.\n</P>\n<P>\nIf the final argument, <i>tableptr</i>, is NULL, PCRE uses a default set of\ncharacter tables that are built when PCRE is compiled, using the default C\nlocale. Otherwise, <i>tableptr</i> must be an address that is the result of a\ncall to <b>pcre_maketables()</b>. This value is stored with the compiled\npattern, and used again by <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b> when the\npattern is matched. For more discussion, see the section on locale support\nbelow.\n</P>\n<P>\nThis code fragment shows a typical straightforward call to <b>pcre_compile()</b>:\n<pre>\n  pcre *re;\n  const char *error;\n  int erroffset;\n  re = pcre_compile(\n    \"^A.*Z\",          /* the pattern */\n    0,                /* default options */\n    &error,           /* for error message */\n    &erroffset,       /* for error offset */\n    NULL);            /* use default character tables */\n</pre>\nThe following names for option bits are defined in the <b>pcre.h</b> header\nfile:\n<pre>\n  PCRE_ANCHORED\n</pre>\nIf this bit is set, the pattern is forced to be \"anchored\", that is, it is\nconstrained to match only at the first matching point in the string that is\nbeing searched (the \"subject string\"). This effect can also be achieved by\nappropriate constructs in the pattern itself, which is the only way to do it in\nPerl.\n<pre>\n  PCRE_AUTO_CALLOUT\n</pre>\nIf this bit is set, <b>pcre_compile()</b> automatically inserts callout items,\nall with number 255, before each pattern item. For discussion of the callout\nfacility, see the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n<pre>\n  PCRE_BSR_ANYCRLF\n  PCRE_BSR_UNICODE\n</pre>\nThese options (which are mutually exclusive) control what the \\R escape\nsequence matches. The choice is either to match only CR, LF, or CRLF, or to\nmatch any Unicode newline sequence. The default is specified when PCRE is\nbuilt. It can be overridden from within the pattern, or by setting an option\nwhen a compiled pattern is matched.\n<pre>\n  PCRE_CASELESS\n</pre>\nIf this bit is set, letters in the pattern match both upper and lower case\nletters. It is equivalent to Perl's /i option, and it can be changed within a\npattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the\nconcept of case for characters whose values are less than 128, so caseless\nmatching is always possible. For characters with higher values, the concept of\ncase is supported if PCRE is compiled with Unicode property support, but not\notherwise. If you want to use caseless matching for characters 128 and above,\nyou must ensure that PCRE is compiled with Unicode property support as well as\nwith UTF-8 support.\n<pre>\n  PCRE_DOLLAR_ENDONLY\n</pre>\nIf this bit is set, a dollar metacharacter in the pattern matches only at the\nend of the subject string. Without this option, a dollar also matches\nimmediately before a newline at the end of the string (but not before any other\nnewlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.\nThere is no equivalent to this option in Perl, and no way to set it within a\npattern.\n<pre>\n  PCRE_DOTALL\n</pre>\nIf this bit is set, a dot metacharacter in the pattern matches a character of\nany value, including one that indicates a newline. However, it only ever\nmatches one character, even if newlines are coded as CRLF. Without this option,\na dot does not match when the current position is at a newline. This option is\nequivalent to Perl's /s option, and it can be changed within a pattern by a\n(?s) option setting. A negative class such as [^a] always matches newline\ncharacters, independent of the setting of this option.\n<pre>\n  PCRE_DUPNAMES\n</pre>\nIf this bit is set, names used to identify capturing subpatterns need not be\nunique. This can be helpful for certain types of pattern when it is known that\nonly one instance of the named subpattern can ever be matched. There are more\ndetails of named subpatterns below; see also the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation.\n<pre>\n  PCRE_EXTENDED\n</pre>\nIf this bit is set, most white space characters in the pattern are totally\nignored except when escaped or inside a character class. However, white space\nis not allowed within sequences such as (?&#62; that introduce various\nparenthesized subpatterns, nor within a numerical quantifier such as {1,3}.\nHowever, ignorable white space is permitted between an item and a following\nquantifier and between a quantifier and a following + that indicates\npossessiveness.\n</P>\n<P>\nWhite space did not used to include the VT character (code 11), because Perl\ndid not treat this character as white space. However, Perl changed at release\n5.18, so PCRE followed at release 8.34, and VT is now treated as white space.\n</P>\n<P>\nPCRE_EXTENDED also causes characters between an unescaped # outside a character\nclass and the next newline, inclusive, to be ignored. PCRE_EXTENDED is\nequivalent to Perl's /x option, and it can be changed within a pattern by a\n(?x) option setting.\n</P>\n<P>\nWhich characters are interpreted as newlines is controlled by the options\npassed to <b>pcre_compile()</b> or by a special sequence at the start of the\npattern, as described in the section entitled\n<a href=\"pcrepattern.html#newlines\">\"Newline conventions\"</a>\nin the <b>pcrepattern</b> documentation. Note that the end of this type of\ncomment is a literal newline sequence in the pattern; escape sequences that\nhappen to represent a newline do not count.\n</P>\n<P>\nThis option makes it possible to include comments inside complicated patterns.\nNote, however, that this applies only to data characters. White space characters\nmay never appear within special character sequences in a pattern, for example\nwithin the sequence (?( that introduces a conditional subpattern.\n<pre>\n  PCRE_EXTRA\n</pre>\nThis option was invented in order to turn on additional functionality of PCRE\nthat is incompatible with Perl, but it is currently of very little use. When\nset, any backslash in a pattern that is followed by a letter that has no\nspecial meaning causes an error, thus reserving these combinations for future\nexpansion. By default, as in Perl, a backslash followed by a letter with no\nspecial meaning is treated as a literal. (Perl can, however, be persuaded to\ngive an error for this, by running it with the -w option.) There are at present\nno other features controlled by this option. It can also be set by a (?X)\noption setting within a pattern.\n<pre>\n  PCRE_FIRSTLINE\n</pre>\nIf this option is set, an unanchored pattern is required to match before or at\nthe first newline in the subject string, though the matched text may continue\nover the newline.\n<pre>\n  PCRE_JAVASCRIPT_COMPAT\n</pre>\nIf this option is set, PCRE's behaviour is changed in some ways so that it is\ncompatible with JavaScript rather than Perl. The changes are as follows:\n</P>\n<P>\n(1) A lone closing square bracket in a pattern causes a compile-time error,\nbecause this is illegal in JavaScript (by default it is treated as a data\ncharacter). Thus, the pattern AB]CD becomes illegal when this option is set.\n</P>\n<P>\n(2) At run time, a back reference to an unset subpattern group matches an empty\nstring (by default this causes the current matching alternative to fail). A\npattern such as (\\1)(a) succeeds when this option is set (assuming it can find\nan \"a\" in the subject), whereas it fails by default, for Perl compatibility.\n</P>\n<P>\n(3) \\U matches an upper case \"U\" character; by default \\U causes a compile\ntime error (Perl uses \\U to upper case subsequent characters).\n</P>\n<P>\n(4) \\u matches a lower case \"u\" character unless it is followed by four\nhexadecimal digits, in which case the hexadecimal number defines the code point\nto match. By default, \\u causes a compile time error (Perl uses it to upper\ncase the following character).\n</P>\n<P>\n(5) \\x matches a lower case \"x\" character unless it is followed by two\nhexadecimal digits, in which case the hexadecimal number defines the code point\nto match. By default, as in Perl, a hexadecimal number is always expected after\n\\x, but it may have zero, one, or two digits (so, for example, \\xz matches a\nbinary zero character followed by z).\n<pre>\n  PCRE_MULTILINE\n</pre>\nBy default, for the purposes of matching \"start of line\" and \"end of line\",\nPCRE treats the subject string as consisting of a single line of characters,\neven if it actually contains newlines. The \"start of line\" metacharacter (^)\nmatches only at the start of the string, and the \"end of line\" metacharacter\n($) matches only at the end of the string, or before a terminating newline\n(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless\nPCRE_DOTALL is set, the \"any character\" metacharacter (.) does not match at a\nnewline. This behaviour (for ^, $, and dot) is the same as Perl.\n</P>\n<P>\nWhen PCRE_MULTILINE it is set, the \"start of line\" and \"end of line\" constructs\nmatch immediately following or immediately before internal newlines in the\nsubject string, respectively, as well as at the very start and end. This is\nequivalent to Perl's /m option, and it can be changed within a pattern by a\n(?m) option setting. If there are no newlines in a subject string, or no\noccurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.\n<pre>\n  PCRE_NEVER_UTF\n</pre>\nThis option locks out interpretation of the pattern as UTF-8 (or UTF-16 or\nUTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the\ncreator of the pattern from switching to UTF interpretation by starting the\npattern with (*UTF). This may be useful in applications that process patterns\nfrom external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also\ncauses an error.\n<pre>\n  PCRE_NEWLINE_CR\n  PCRE_NEWLINE_LF\n  PCRE_NEWLINE_CRLF\n  PCRE_NEWLINE_ANYCRLF\n  PCRE_NEWLINE_ANY\n</pre>\nThese options override the default newline definition that was chosen when PCRE\nwas built. Setting the first or the second specifies that a newline is\nindicated by a single character (CR or LF, respectively). Setting\nPCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character\nCRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three\npreceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies\nthat any Unicode newline sequence should be recognized.\n</P>\n<P>\nIn an ASCII/Unicode environment, the Unicode newline sequences are the three\njust mentioned, plus the single characters VT (vertical tab, U+000B), FF (form\nfeed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS\n(paragraph separator, U+2029). For the 8-bit library, the last two are\nrecognized only in UTF-8 mode.\n</P>\n<P>\nWhen PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for\nCR is 0x0d, the same as ASCII. However, the character code for LF is normally\n0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is\nnot LF is made to correspond to Unicode's NEL character. EBCDIC codes are all\nless than 256. For more details, see the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation.\n</P>\n<P>\nThe newline setting in the options word uses three bits that are treated\nas a number, giving eight possibilities. Currently only six are used (default\nplus the five values above). This means that if you set more than one newline\noption, the combination may or may not be sensible. For example,\nPCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but\nother combinations may yield unused numbers and cause an error.\n</P>\n<P>\nThe only time that a line break in a pattern is specially recognized when\ncompiling is when PCRE_EXTENDED is set. CR and LF are white space characters,\nand so are ignored in this mode. Also, an unescaped # outside a character class\nindicates a comment that lasts until after the next line break sequence. In\nother circumstances, line break sequences in patterns are treated as literal\ndata.\n</P>\n<P>\nThe newline option that is set at compile time becomes the default that is used\nfor <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, but it can be overridden.\n<pre>\n  PCRE_NO_AUTO_CAPTURE\n</pre>\nIf this option is set, it disables the use of numbered capturing parentheses in\nthe pattern. Any opening parenthesis that is not followed by ? behaves as if it\nwere followed by ?: but named parentheses can still be used for capturing (and\nthey acquire numbers in the usual way). There is no equivalent of this option\nin Perl.\n<pre>\n  PCRE_NO_AUTO_POSSESS\n</pre>\nIf this option is set, it disables \"auto-possessification\". This is an\noptimization that, for example, turns a+b into a++b in order to avoid\nbacktracks into a+ that can never be successful. However, if callouts are in\nuse, auto-possessification means that some of them are never taken. You can set\nthis option if you want the matching functions to do a full unoptimized search\nand run all the callouts, but it is mainly provided for testing purposes.\n<pre>\n  PCRE_NO_START_OPTIMIZE\n</pre>\nThis is an option that acts at matching time; that is, it is really an option\nfor <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. If it is set at compile time,\nit is remembered with the compiled pattern and assumed at matching time. This\nis necessary if you want to use JIT execution, because the JIT compiler needs\nto know whether or not this option is set. For details see the discussion of\nPCRE_NO_START_OPTIMIZE\n<a href=\"#execoptions\">below.</a>\n<pre>\n  PCRE_UCP\n</pre>\nThis option changes the way PCRE processes \\B, \\b, \\D, \\d, \\S, \\s, \\W,\n\\w, and some of the POSIX character classes. By default, only ASCII characters\nare recognized, but if PCRE_UCP is set, Unicode properties are used instead to\nclassify characters. More details are given in the section on\n<a href=\"pcre.html#genericchartypes\">generic character types</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\npage. If you set PCRE_UCP, matching one of the items it affects takes much\nlonger. The option is available only if PCRE has been compiled with Unicode\nproperty support.\n<pre>\n  PCRE_UNGREEDY\n</pre>\nThis option inverts the \"greediness\" of the quantifiers so that they are not\ngreedy by default, but become greedy if followed by \"?\". It is not compatible\nwith Perl. It can also be set by a (?U) option setting within the pattern.\n<pre>\n  PCRE_UTF8\n</pre>\nThis option causes PCRE to regard both the pattern and the subject as strings\nof UTF-8 characters instead of single-byte strings. However, it is available\nonly when PCRE is built to include UTF support. If not, the use of this option\nprovokes an error. Details of how this option changes the behaviour of PCRE are\ngiven in the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage.\n<pre>\n  PCRE_NO_UTF8_CHECK\n</pre>\nWhen PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is\nautomatically checked. There is a discussion about the\n<a href=\"pcreunicode.html#utf8strings\">validity of UTF-8 strings</a>\nin the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage. If an invalid UTF-8 sequence is found, <b>pcre_compile()</b> returns an\nerror. If you already know that your pattern is valid, and you want to skip\nthis check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option.\nWhen it is set, the effect of passing an invalid UTF-8 string as a pattern is\nundefined. It may cause your program to crash or loop. Note that this option\ncan also be passed to <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, to suppress\nthe validity checking of subject strings only. If the same string is being\nmatched many times, the option can be safely set for the second and subsequent\nmatchings to improve performance.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">COMPILATION ERROR CODES</a><br>\n<P>\nThe following table lists the error codes than may be returned by\n<b>pcre_compile2()</b>, along with the error messages that may be returned by\nboth compiling functions. Note that error messages are always 8-bit ASCII\nstrings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes\nhave fallen out of use. To avoid confusion, they have not been re-used.\n<pre>\n   0  no error\n   1  \\ at end of pattern\n   2  \\c at end of pattern\n   3  unrecognized character follows \\\n   4  numbers out of order in {} quantifier\n   5  number too big in {} quantifier\n   6  missing terminating ] for character class\n   7  invalid escape sequence in character class\n   8  range out of order in character class\n   9  nothing to repeat\n  10  [this code is not in use]\n  11  internal error: unexpected repeat\n  12  unrecognized character after (? or (?-\n  13  POSIX named classes are supported only within a class\n  14  missing )\n  15  reference to non-existent subpattern\n  16  erroffset passed as NULL\n  17  unknown option bit(s) set\n  18  missing ) after comment\n  19  [this code is not in use]\n  20  regular expression is too large\n  21  failed to get memory\n  22  unmatched parentheses\n  23  internal error: code overflow\n  24  unrecognized character after (?&#60;\n  25  lookbehind assertion is not fixed length\n  26  malformed number or name after (?(\n  27  conditional group contains more than two branches\n  28  assertion expected after (?(\n  29  (?R or (?[+-]digits must be followed by )\n  30  unknown POSIX class name\n  31  POSIX collating elements are not supported\n  32  this version of PCRE is compiled without UTF support\n  33  [this code is not in use]\n  34  character value in \\x{} or \\o{} is too large\n  35  invalid condition (?(0)\n  36  \\C not allowed in lookbehind assertion\n  37  PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\n  38  number after (?C is &#62; 255\n  39  closing ) for (?C expected\n  40  recursive call could loop indefinitely\n  41  unrecognized character after (?P\n  42  syntax error in subpattern name (missing terminator)\n  43  two named subpatterns have the same name\n  44  invalid UTF-8 string (specifically UTF-8)\n  45  support for \\P, \\p, and \\X has not been compiled\n  46  malformed \\P or \\p sequence\n  47  unknown property name after \\P or \\p\n  48  subpattern name is too long (maximum 32 characters)\n  49  too many named subpatterns (maximum 10000)\n  50  [this code is not in use]\n  51  octal value is greater than \\377 in 8-bit non-UTF-8 mode\n  52  internal error: overran compiling workspace\n  53  internal error: previously-checked referenced subpattern\n        not found\n  54  DEFINE group contains more than one branch\n  55  repeating a DEFINE group is not allowed\n  56  inconsistent NEWLINE options\n  57  \\g is not followed by a braced, angle-bracketed, or quoted\n        name/number or by a plain number\n  58  a numbered reference must not be zero\n  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\n  60  (*VERB) not recognized or malformed\n  61  number is too big\n  62  subpattern name expected\n  63  digit expected after (?+\n  64  ] is an invalid data character in JavaScript compatibility mode\n  65  different names for subpatterns of the same number are\n        not allowed\n  66  (*MARK) must have an argument\n  67  this version of PCRE is not compiled with Unicode property\n        support\n  68  \\c must be followed by an ASCII character\n  69  \\k is not followed by a braced, angle-bracketed, or quoted name\n  70  internal error: unknown opcode in find_fixedlength()\n  71  \\N is not supported in a class\n  72  too many forward references\n  73  disallowed Unicode code point (&#62;= 0xd800 && &#60;= 0xdfff)\n  74  invalid UTF-16 string (specifically UTF-16)\n  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\n  76  character value in \\u.... sequence is too large\n  77  invalid UTF-32 string (specifically UTF-32)\n  78  setting UTF is disabled by the application\n  79  non-hex character in \\x{} (closing brace missing?)\n  80  non-octal character in \\o{} (closing brace missing?)\n  81  missing opening brace after \\o\n  82  parentheses are too deeply nested\n  83  invalid range in character class\n  84  group name must start with a non-digit\n  85  parentheses are too deeply nested (stack check)\n</pre>\nThe numbers 32 and 10000 in errors 48 and 49 are defaults; different values may\nbe used if the limits were changed when PCRE was built.\n<a name=\"studyingapattern\"></a></P>\n<br><a name=\"SEC13\" href=\"#TOC1\">STUDYING A PATTERN</a><br>\n<P>\n<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>\n<b>     const char **<i>errptr</i>);</b>\n</P>\n<P>\nIf a compiled pattern is going to be used several times, it is worth spending\nmore time analyzing it in order to speed up the time taken for matching. The\nfunction <b>pcre_study()</b> takes a pointer to a compiled pattern as its first\nargument. If studying the pattern produces additional information that will\nhelp speed up matching, <b>pcre_study()</b> returns a pointer to a\n<b>pcre_extra</b> block, in which the <i>study_data</i> field points to the\nresults of the study.\n</P>\n<P>\nThe returned value from <b>pcre_study()</b> can be passed directly to\n<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. However, a <b>pcre_extra</b> block\nalso contains other fields that can be set by the caller before the block is\npassed; these are described\n<a href=\"#extradata\">below</a>\nin the section on matching a pattern.\n</P>\n<P>\nIf studying the pattern does not produce any useful information,\n<b>pcre_study()</b> returns NULL by default. In that circumstance, if the\ncalling program wants to pass any of the other fields to <b>pcre_exec()</b> or\n<b>pcre_dfa_exec()</b>, it must set up its own <b>pcre_extra</b> block. However,\nif <b>pcre_study()</b> is called with the PCRE_STUDY_EXTRA_NEEDED option, it\nreturns a <b>pcre_extra</b> block even if studying did not find any additional\ninformation. It may still return NULL, however, if an error occurs in\n<b>pcre_study()</b>.\n</P>\n<P>\nThe second argument of <b>pcre_study()</b> contains option bits. There are three\nfurther options in addition to PCRE_STUDY_EXTRA_NEEDED:\n<pre>\n  PCRE_STUDY_JIT_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n</pre>\nIf any of these are set, and the just-in-time compiler is available, the\npattern is further compiled into machine code that executes much faster than\nthe <b>pcre_exec()</b> interpretive matching function. If the just-in-time\ncompiler is not available, these options are ignored. All undefined bits in the\n<i>options</i> argument must be zero.\n</P>\n<P>\nJIT compilation is a heavyweight optimization. It can take some time for\npatterns to be analyzed, and for one-off matches and simple patterns the\nbenefit of faster execution might be offset by a much slower study time.\nNot all patterns can be optimized by the JIT compiler. For those that cannot be\nhandled, matching automatically falls back to the <b>pcre_exec()</b>\ninterpreter. For more details, see the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation.\n</P>\n<P>\nThe third argument for <b>pcre_study()</b> is a pointer for an error message. If\nstudying succeeds (even if no data is returned), the variable it points to is\nset to NULL. Otherwise it is set to point to a textual error message. This is a\nstatic string that is part of the library. You must not try to free it. You\nshould test the error pointer for NULL after calling <b>pcre_study()</b>, to be\nsure that it has run successfully.\n</P>\n<P>\nWhen you are finished with a pattern, you can free the memory used for the\nstudy data by calling <b>pcre_free_study()</b>. This function was added to the\nAPI for release 8.20. For earlier versions, the memory could be freed with\n<b>pcre_free()</b>, just like the pattern itself. This will still work in cases\nwhere JIT optimization is not used, but it is advisable to change to the new\nfunction when convenient.\n</P>\n<P>\nThis is a typical way in which <b>pcre_study</b>() is used (except that in a\nreal application there should be tests for errors):\n<pre>\n  int rc;\n  pcre *re;\n  pcre_extra *sd;\n  re = pcre_compile(\"pattern\", 0, &error, &erroroffset, NULL);\n  sd = pcre_study(\n    re,             /* result of pcre_compile() */\n    0,              /* no options */\n    &error);        /* set to NULL or points to a message */\n  rc = pcre_exec(   /* see below for details of pcre_exec() options */\n    re, sd, \"subject\", 7, 0, 0, ovector, 30);\n  ...\n  pcre_free_study(sd);\n  pcre_free(re);\n</pre>\nStudying a pattern does two things: first, a lower bound for the length of\nsubject string that is needed to match the pattern is computed. This does not\nmean that there are any strings of that length that match, but it does\nguarantee that no shorter strings match. The value is used to avoid wasting\ntime by trying to match strings that are shorter than the lower bound. You can\nfind out the value in a calling program via the <b>pcre_fullinfo()</b> function.\n</P>\n<P>\nStudying a pattern is also useful for non-anchored patterns that do not have a\nsingle fixed starting character. A bitmap of possible starting bytes is\ncreated. This speeds up finding a position in the subject at which to start\nmatching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256.\nIn 32-bit mode, the bitmap is used for 32-bit values less than 256.)\n</P>\n<P>\nThese two optimizations apply to both <b>pcre_exec()</b> and\n<b>pcre_dfa_exec()</b>, and the information is also used by the JIT compiler.\nThe optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option.\nYou might want to do this if your pattern contains callouts or (*MARK) and you\nwant to make use of these facilities in cases where matching fails.\n</P>\n<P>\nPCRE_NO_START_OPTIMIZE can be specified at either compile time or execution\ntime. However, if PCRE_NO_START_OPTIMIZE is passed to <b>pcre_exec()</b>, (that\nis, after any JIT compilation has happened) JIT execution is disabled. For JIT\nexecution to work with PCRE_NO_START_OPTIMIZE, the option must be set at\ncompile time.\n</P>\n<P>\nThere is a longer discussion of PCRE_NO_START_OPTIMIZE\n<a href=\"#execoptions\">below.</a>\n<a name=\"localesupport\"></a></P>\n<br><a name=\"SEC14\" href=\"#TOC1\">LOCALE SUPPORT</a><br>\n<P>\nPCRE handles caseless matching, and determines whether characters are letters,\ndigits, or whatever, by reference to a set of tables, indexed by character\ncode point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this\napplies only to characters with code points less than 256. By default,\nhigher-valued code points never match escapes such as \\w or \\d. However, if\nPCRE is built with Unicode property support, all characters can be tested with\n\\p and \\P, or, alternatively, the PCRE_UCP option can be set when a pattern\nis compiled; this causes \\w and friends to use Unicode property support\ninstead of the built-in tables.\n</P>\n<P>\nThe use of locales with Unicode is discouraged. If you are handling characters\nwith code points greater than 128, you should either use Unicode support, or\nuse locales, but not try to mix the two.\n</P>\n<P>\nPCRE contains an internal set of tables that are used when the final argument\nof <b>pcre_compile()</b> is NULL. These are sufficient for many applications.\nNormally, the internal tables recognize only ASCII characters. However, when\nPCRE is built, it is possible to cause the internal tables to be rebuilt in the\ndefault \"C\" locale of the local system, which may cause them to be different.\n</P>\n<P>\nThe internal tables can always be overridden by tables supplied by the\napplication that calls PCRE. These may be created in a different locale from\nthe default. As more and more applications change to using Unicode, the need\nfor this locale support is expected to die away.\n</P>\n<P>\nExternal tables are built by calling the <b>pcre_maketables()</b> function,\nwhich has no arguments, in the relevant locale. The result can then be passed\nto <b>pcre_compile()</b> as often as necessary. For example, to build and use\ntables that are appropriate for the French locale (where accented characters\nwith values greater than 128 are treated as letters), the following code could\nbe used:\n<pre>\n  setlocale(LC_CTYPE, \"fr_FR\");\n  tables = pcre_maketables();\n  re = pcre_compile(..., tables);\n</pre>\nThe locale name \"fr_FR\" is used on Linux and other Unix-like systems; if you\nare using Windows, the name for the French locale is \"french\".\n</P>\n<P>\nWhen <b>pcre_maketables()</b> runs, the tables are built in memory that is\nobtained via <b>pcre_malloc</b>. It is the caller's responsibility to ensure\nthat the memory containing the tables remains available for as long as it is\nneeded.\n</P>\n<P>\nThe pointer that is passed to <b>pcre_compile()</b> is saved with the compiled\npattern, and the same tables are used via this pointer by <b>pcre_study()</b>\nand also by <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>. Thus, for any single\npattern, compilation, studying and matching all happen in the same locale, but\ndifferent patterns can be processed in different locales.\n</P>\n<P>\nIt is possible to pass a table pointer or NULL (indicating the use of the\ninternal tables) to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> (see the\ndiscussion below in the section on matching a pattern). This facility is\nprovided for use with pre-compiled patterns that have been saved and reloaded.\nCharacter tables are not saved with patterns, so if a non-standard table was\nused at compile time, it must be provided again when the reloaded pattern is\nmatched. Attempting to use this facility to match a pattern in a different\nlocale from the one in which it was compiled is likely to lead to anomalous\n(usually incorrect) results.\n<a name=\"infoaboutpattern\"></a></P>\n<br><a name=\"SEC15\" href=\"#TOC1\">INFORMATION ABOUT A PATTERN</a><br>\n<P>\n<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     int <i>what</i>, void *<i>where</i>);</b>\n</P>\n<P>\nThe <b>pcre_fullinfo()</b> function returns information about a compiled\npattern. It replaces the <b>pcre_info()</b> function, which was removed from the\nlibrary at version 8.30, after more than 10 years of obsolescence.\n</P>\n<P>\nThe first argument for <b>pcre_fullinfo()</b> is a pointer to the compiled\npattern. The second argument is the result of <b>pcre_study()</b>, or NULL if\nthe pattern was not studied. The third argument specifies which piece of\ninformation is required, and the fourth argument is a pointer to a variable\nto receive the data. The yield of the function is zero for success, or one of\nthe following negative numbers:\n<pre>\n  PCRE_ERROR_NULL           the argument <i>code</i> was NULL\n                            the argument <i>where</i> was NULL\n  PCRE_ERROR_BADMAGIC       the \"magic number\" was not found\n  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different\n                            endianness\n  PCRE_ERROR_BADOPTION      the value of <i>what</i> was invalid\n  PCRE_ERROR_UNSET          the requested field is not set\n</pre>\nThe \"magic number\" is placed at the start of each compiled pattern as an simple\ncheck against passing an arbitrary memory pointer. The endianness error can\noccur if a compiled pattern is saved and reloaded on a different host. Here is\na typical call of <b>pcre_fullinfo()</b>, to obtain the length of the compiled\npattern:\n<pre>\n  int rc;\n  size_t length;\n  rc = pcre_fullinfo(\n    re,               /* result of pcre_compile() */\n    sd,               /* result of pcre_study(), or NULL */\n    PCRE_INFO_SIZE,   /* what is required */\n    &length);         /* where to put the data */\n</pre>\nThe possible values for the third argument are defined in <b>pcre.h</b>, and are\nas follows:\n<pre>\n  PCRE_INFO_BACKREFMAX\n</pre>\nReturn the number of the highest back reference in the pattern. The fourth\nargument should point to an <b>int</b> variable. Zero is returned if there are\nno back references.\n<pre>\n  PCRE_INFO_CAPTURECOUNT\n</pre>\nReturn the number of capturing subpatterns in the pattern. The fourth argument\nshould point to an <b>int</b> variable.\n<pre>\n  PCRE_INFO_DEFAULT_TABLES\n</pre>\nReturn a pointer to the internal default character tables within PCRE. The\nfourth argument should point to an <b>unsigned char *</b> variable. This\ninformation call is provided for internal use by the <b>pcre_study()</b>\nfunction. External callers can cause PCRE to use its internal tables by passing\na NULL table pointer.\n<pre>\n  PCRE_INFO_FIRSTBYTE (deprecated)\n</pre>\nReturn information about the first data unit of any matched string, for a\nnon-anchored pattern. The name of this option refers to the 8-bit library,\nwhere data units are bytes. The fourth argument should point to an <b>int</b>\nvariable. Negative values are used for special cases. However, this means that\nwhen the 32-bit library is in non-UTF-32 mode, the full 32-bit range of\ncharacters cannot be returned. For this reason, this value is deprecated; use\nPCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead.\n</P>\n<P>\nIf there is a fixed first value, for example, the letter \"c\" from a pattern\nsuch as (cat|cow|coyote), its value is returned. In the 8-bit library, the\nvalue is always less than 256. In the 16-bit library the value can be up to\n0xffff. In the 32-bit library the value can be up to 0x10ffff.\n</P>\n<P>\nIf there is no fixed first value, and if either\n<br>\n<br>\n(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\nstarts with \"^\", or\n<br>\n<br>\n(b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not set\n(if it were set, the pattern would be anchored),\n<br>\n<br>\n-1 is returned, indicating that the pattern matches only at the start of a\nsubject string or after any newline within the string. Otherwise -2 is\nreturned. For anchored patterns, -2 is returned.\n<pre>\n  PCRE_INFO_FIRSTCHARACTER\n</pre>\nReturn the value of the first data unit (non-UTF character) of any matched\nstring in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;\notherwise return 0. The fourth argument should point to an <b>uint_t</b>\nvariable.\n</P>\n<P>\nIn the 8-bit library, the value is always less than 256. In the 16-bit library\nthe value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value\ncan be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode.\n<pre>\n  PCRE_INFO_FIRSTCHARACTERFLAGS\n</pre>\nReturn information about the first data unit of any matched string, for a\nnon-anchored pattern. The fourth argument should point to an <b>int</b>\nvariable.\n</P>\n<P>\nIf there is a fixed first value, for example, the letter \"c\" from a pattern\nsuch as (cat|cow|coyote), 1 is returned, and the character value can be\nretrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and\nif either\n<br>\n<br>\n(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\nstarts with \"^\", or\n<br>\n<br>\n(b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not set\n(if it were set, the pattern would be anchored),\n<br>\n<br>\n2 is returned, indicating that the pattern matches only at the start of a\nsubject string or after any newline within the string. Otherwise 0 is\nreturned. For anchored patterns, 0 is returned.\n<pre>\n  PCRE_INFO_FIRSTTABLE\n</pre>\nIf the pattern was studied, and this resulted in the construction of a 256-bit\ntable indicating a fixed set of values for the first data unit in any matching\nstring, a pointer to the table is returned. Otherwise NULL is returned. The\nfourth argument should point to an <b>unsigned char *</b> variable.\n<pre>\n  PCRE_INFO_HASCRORLF\n</pre>\nReturn 1 if the pattern contains any explicit matches for CR or LF characters,\notherwise 0. The fourth argument should point to an <b>int</b> variable. An\nexplicit match is either a literal CR or LF character, or \\r or \\n.\n<pre>\n  PCRE_INFO_JCHANGED\n</pre>\nReturn 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise\n0. The fourth argument should point to an <b>int</b> variable. (?J) and\n(?-J) set and unset the local PCRE_DUPNAMES option, respectively.\n<pre>\n  PCRE_INFO_JIT\n</pre>\nReturn 1 if the pattern was studied with one of the JIT options, and\njust-in-time compiling was successful. The fourth argument should point to an\n<b>int</b> variable. A return value of 0 means that JIT support is not available\nin this version of PCRE, or that the pattern was not studied with a JIT option,\nor that the JIT compiler could not handle this particular pattern. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for details of what can and cannot be handled.\n<pre>\n  PCRE_INFO_JITSIZE\n</pre>\nIf the pattern was successfully studied with a JIT option, return the size of\nthe JIT compiled code, otherwise return zero. The fourth argument should point\nto a <b>size_t</b> variable.\n<pre>\n  PCRE_INFO_LASTLITERAL\n</pre>\nReturn the value of the rightmost literal data unit that must exist in any\nmatched string, other than at its start, if such a value has been recorded. The\nfourth argument should point to an <b>int</b> variable. If there is no such\nvalue, -1 is returned. For anchored patterns, a last literal value is recorded\nonly if it follows something of variable length. For example, for the pattern\n/^a\\d+z\\d+/ the returned value is \"z\", but for /^a\\dz\\d/ the returned value\nis -1.\n</P>\n<P>\nSince for the 32-bit library using the non-UTF-32 mode, this function is unable\nto return the full 32-bit range of characters, this value is deprecated;\ninstead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should\nbe used.\n<pre>\n  PCRE_INFO_MATCH_EMPTY\n</pre>\nReturn 1 if the pattern can match an empty string, otherwise 0. The fourth\nargument should point to an <b>int</b> variable.\n<pre>\n  PCRE_INFO_MATCHLIMIT\n</pre>\nIf the pattern set a match limit by including an item of the form\n(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument\nshould point to an unsigned 32-bit integer. If no such value has been set, the\ncall to <b>pcre_fullinfo()</b> returns the error PCRE_ERROR_UNSET.\n<pre>\n  PCRE_INFO_MAXLOOKBEHIND\n</pre>\nReturn the number of characters (NB not data units) in the longest lookbehind\nassertion in the pattern. This information is useful when doing multi-segment\nmatching using the partial matching facilities. Note that the simple assertions\n\\b and \\B require a one-character lookbehind. \\A also registers a\none-character lookbehind, though it does not actually inspect the previous\ncharacter. This is to ensure that at least one character from the old segment\nis retained when a new segment is processed. Otherwise, if there are no\nlookbehinds in the pattern, \\A might match incorrectly at the start of a new\nsegment.\n<pre>\n  PCRE_INFO_MINLENGTH\n</pre>\nIf the pattern was studied and a minimum length for matching subject strings\nwas computed, its value is returned. Otherwise the returned value is -1. The\nvalue is a number of characters, which in UTF mode may be different from the\nnumber of data units. The fourth argument should point to an <b>int</b>\nvariable. A non-negative value is a lower bound to the length of any matching\nstring. There may not be any strings of that length that do actually match, but\nevery string that does match is at least that long.\n<pre>\n  PCRE_INFO_NAMECOUNT\n  PCRE_INFO_NAMEENTRYSIZE\n  PCRE_INFO_NAMETABLE\n</pre>\nPCRE supports the use of named as well as numbered capturing parentheses. The\nnames are just an additional way of identifying the parentheses, which still\nacquire numbers. Several convenience functions such as\n<b>pcre_get_named_substring()</b> are provided for extracting captured\nsubstrings by name. It is also possible to extract the data directly, by first\nconverting the name to a number in order to access the correct pointers in the\noutput vector (described with <b>pcre_exec()</b> below). To do the conversion,\nyou need to use the name-to-number map, which is described by these three\nvalues.\n</P>\n<P>\nThe map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives\nthe number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each\nentry; both of these return an <b>int</b> value. The entry size depends on the\nlength of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first\nentry of the table. This is a pointer to <b>char</b> in the 8-bit library, where\nthe first two bytes of each entry are the number of the capturing parenthesis,\nmost significant byte first. In the 16-bit library, the pointer points to\n16-bit data units, the first of which contains the parenthesis number. In the\n32-bit library, the pointer points to 32-bit data units, the first of which\ncontains the parenthesis number. The rest of the entry is the corresponding\nname, zero terminated.\n</P>\n<P>\nThe names are in alphabetical order. If (?| is used to create multiple groups\nwith the same number, as described in the\n<a href=\"pcrepattern.html#dupsubpatternnumber\">section on duplicate subpattern numbers</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\npage, the groups may be given the same name, but there is only one entry in the\ntable. Different names for groups of the same number are not permitted.\nDuplicate names for subpatterns with different numbers are permitted,\nbut only if PCRE_DUPNAMES is set. They appear in the table in the order in\nwhich they were found in the pattern. In the absence of (?| this is the order\nof increasing number; when (?| is used this is not necessarily the case because\nlater subpatterns may have lower numbers.\n</P>\n<P>\nAs a simple example of the name/number table, consider the following pattern\nafter compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white\nspace - including newlines - is ignored):\n<pre>\n  (?&#60;date&#62; (?&#60;year&#62;(\\d\\d)?\\d\\d) - (?&#60;month&#62;\\d\\d) - (?&#60;day&#62;\\d\\d) )\n</pre>\nThere are four named subpatterns, so the table has four entries, and each entry\nin the table is eight bytes long. The table is as follows, with non-printing\nbytes shows in hexadecimal, and undefined bytes shown as ??:\n<pre>\n  00 01 d  a  t  e  00 ??\n  00 05 d  a  y  00 ?? ??\n  00 04 m  o  n  t  h  00\n  00 02 y  e  a  r  00 ??\n</pre>\nWhen writing code to extract data from named subpatterns using the\nname-to-number map, remember that the length of the entries is likely to be\ndifferent for each compiled pattern.\n<pre>\n  PCRE_INFO_OKPARTIAL\n</pre>\nReturn 1 if the pattern can be used for partial matching with\n<b>pcre_exec()</b>, otherwise 0. The fourth argument should point to an\n<b>int</b> variable. From release 8.00, this always returns 1, because the\nrestrictions that previously applied to partial matching have been lifted. The\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation gives details of partial matching.\n<pre>\n  PCRE_INFO_OPTIONS\n</pre>\nReturn a copy of the options with which the pattern was compiled. The fourth\nargument should point to an <b>unsigned long int</b> variable. These option bits\nare those specified in the call to <b>pcre_compile()</b>, modified by any\ntop-level option settings at the start of the pattern itself. In other words,\nthey are the options that will be in force when matching starts. For example,\nif the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the\nresult is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.\n</P>\n<P>\nA pattern is automatically anchored by PCRE if all of its top-level\nalternatives begin with one of the following:\n<pre>\n  ^     unless PCRE_MULTILINE is set\n  \\A    always\n  \\G    always\n  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears\n</pre>\nFor such patterns, the PCRE_ANCHORED bit is set in the options returned by\n<b>pcre_fullinfo()</b>.\n<pre>\n  PCRE_INFO_RECURSIONLIMIT\n</pre>\nIf the pattern set a recursion limit by including an item of the form\n(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth\nargument should point to an unsigned 32-bit integer. If no such value has been\nset, the call to <b>pcre_fullinfo()</b> returns the error PCRE_ERROR_UNSET.\n<pre>\n  PCRE_INFO_SIZE\n</pre>\nReturn the size of the compiled pattern in bytes (for all three libraries). The\nfourth argument should point to a <b>size_t</b> variable. This value does not\ninclude the size of the <b>pcre</b> structure that is returned by\n<b>pcre_compile()</b>. The value that is passed as the argument to\n<b>pcre_malloc()</b> when <b>pcre_compile()</b> is getting memory in which to\nplace the compiled data is the value returned by this option plus the size of\nthe <b>pcre</b> structure. Studying a compiled pattern, with or without JIT,\ndoes not alter the value returned by this option.\n<pre>\n  PCRE_INFO_STUDYSIZE\n</pre>\nReturn the size in bytes (for all three libraries) of the data block pointed to\nby the <i>study_data</i> field in a <b>pcre_extra</b> block. If <b>pcre_extra</b>\nis NULL, or there is no study data, zero is returned. The fourth argument\nshould point to a <b>size_t</b> variable. The <i>study_data</i> field is set by\n<b>pcre_study()</b> to record information that will speed up matching (see the\nsection entitled\n<a href=\"#studyingapattern\">\"Studying a pattern\"</a>\nabove). The format of the <i>study_data</i> block is private, but its length\nis made available via this option so that it can be saved and restored (see the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation for details).\n<pre>\n  PCRE_INFO_REQUIREDCHARFLAGS\n</pre>\nReturns 1 if there is a rightmost literal data unit that must exist in any\nmatched string, other than at its start. The fourth argument should  point to\nan <b>int</b> variable. If there is no such value, 0 is returned. If returning\n1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR.\n</P>\n<P>\nFor anchored patterns, a last literal value is recorded only if it follows\nsomething of variable length. For example, for the pattern /^a\\d+z\\d+/ the\nreturned value 1 (with \"z\" returned from PCRE_INFO_REQUIREDCHAR), but for\n/^a\\dz\\d/ the returned value is 0.\n<pre>\n  PCRE_INFO_REQUIREDCHAR\n</pre>\nReturn the value of the rightmost literal data unit that must exist in any\nmatched string, other than at its start, if such a value has been recorded. The\nfourth argument should point to an <b>uint32_t</b> variable. If there is no such\nvalue, 0 is returned.\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">REFERENCE COUNTS</a><br>\n<P>\n<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>\n</P>\n<P>\nThe <b>pcre_refcount()</b> function is used to maintain a reference count in the\ndata block that contains a compiled pattern. It is provided for the benefit of\napplications that operate in an object-oriented manner, where different parts\nof the application may be using the same compiled pattern, but you want to free\nthe block when they are all done.\n</P>\n<P>\nWhen a pattern is compiled, the reference count field is initialized to zero.\nIt is changed only by calling this function, whose action is to add the\n<i>adjust</i> value (which may be positive or negative) to it. The yield of the\nfunction is the new value. However, the value of the count is constrained to\nlie between 0 and 65535, inclusive. If the new value is outside these limits,\nit is forced to the appropriate limit value.\n</P>\n<P>\nExcept when it is zero, the reference count is not correctly preserved if a\npattern is compiled on one host and then transferred to a host whose byte-order\nis different. (This seems a highly unlikely scenario.)\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a><br>\n<P>\n<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>\n</P>\n<P>\nThe function <b>pcre_exec()</b> is called to match a subject string against a\ncompiled pattern, which is passed in the <i>code</i> argument. If the\npattern was studied, the result of the study should be passed in the\n<i>extra</i> argument. You can call <b>pcre_exec()</b> with the same <i>code</i>\nand <i>extra</i> arguments as many times as you like, in order to match\ndifferent subject strings with the same pattern.\n</P>\n<P>\nThis function is the main matching facility of the library, and it operates in\na Perl-like manner. For specialist use there is also an alternative matching\nfunction, which is described\n<a href=\"#dfamatch\">below</a>\nin the section about the <b>pcre_dfa_exec()</b> function.\n</P>\n<P>\nIn most applications, the pattern will have been compiled (and optionally\nstudied) in the same process that calls <b>pcre_exec()</b>. However, it is\npossible to save compiled patterns and study data, and then use them later\nin different processes, possibly even on different hosts. For a discussion\nabout this, see the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation.\n</P>\n<P>\nHere is an example of a simple call to <b>pcre_exec()</b>:\n<pre>\n  int rc;\n  int ovector[30];\n  rc = pcre_exec(\n    re,             /* result of pcre_compile() */\n    NULL,           /* we didn't study the pattern */\n    \"some string\",  /* the subject string */\n    11,             /* the length of the subject string */\n    0,              /* start at offset 0 in the subject */\n    0,              /* default options */\n    ovector,        /* vector of integers for substring information */\n    30);            /* number of elements (NOT size in bytes) */\n<a name=\"extradata\"></a></PRE>\n</P>\n<br><b>\nExtra data for <b>pcre_exec()</b>\n</b><br>\n<P>\nIf the <i>extra</i> argument is not NULL, it must point to a <b>pcre_extra</b>\ndata block. The <b>pcre_study()</b> function returns such a block (when it\ndoesn't return NULL), but you can also create one for yourself, and pass\nadditional information in it. The <b>pcre_extra</b> block contains the following\nfields (not necessarily in this order):\n<pre>\n  unsigned long int <i>flags</i>;\n  void *<i>study_data</i>;\n  void *<i>executable_jit</i>;\n  unsigned long int <i>match_limit</i>;\n  unsigned long int <i>match_limit_recursion</i>;\n  void *<i>callout_data</i>;\n  const unsigned char *<i>tables</i>;\n  unsigned char **<i>mark</i>;\n</pre>\nIn the 16-bit version of this structure, the <i>mark</i> field has type\n\"PCRE_UCHAR16 **\".\n<br>\n<br>\nIn the 32-bit version of this structure, the <i>mark</i> field has type\n\"PCRE_UCHAR32 **\".\n</P>\n<P>\nThe <i>flags</i> field is used to specify which of the other fields are set. The\nflag bits are:\n<pre>\n  PCRE_EXTRA_CALLOUT_DATA\n  PCRE_EXTRA_EXECUTABLE_JIT\n  PCRE_EXTRA_MARK\n  PCRE_EXTRA_MATCH_LIMIT\n  PCRE_EXTRA_MATCH_LIMIT_RECURSION\n  PCRE_EXTRA_STUDY_DATA\n  PCRE_EXTRA_TABLES\n</pre>\nOther flag bits should be set to zero. The <i>study_data</i> field and sometimes\nthe <i>executable_jit</i> field are set in the <b>pcre_extra</b> block that is\nreturned by <b>pcre_study()</b>, together with the appropriate flag bits. You\nshould not set these yourself, but you may add to the block by setting other\nfields and their corresponding flag bits.\n</P>\n<P>\nThe <i>match_limit</i> field provides a means of preventing PCRE from using up a\nvast amount of resources when running patterns that are not going to match,\nbut which have a very large number of possibilities in their search trees. The\nclassic example is a pattern that uses nested unlimited repeats.\n</P>\n<P>\nInternally, <b>pcre_exec()</b> uses a function called <b>match()</b>, which it\ncalls repeatedly (sometimes recursively). The limit set by <i>match_limit</i> is\nimposed on the number of times this function is called during a match, which\nhas the effect of limiting the amount of backtracking that can take place. For\npatterns that are not anchored, the count restarts from zero for each position\nin the subject string.\n</P>\n<P>\nWhen <b>pcre_exec()</b> is called with a pattern that was successfully studied\nwith a JIT option, the way that the matching is executed is entirely different.\nHowever, there is still the possibility of runaway matching that goes on for a\nvery long time, and so the <i>match_limit</i> value is also used in this case\n(but in a different way) to limit how long the matching can continue.\n</P>\n<P>\nThe default value for the limit can be set when PCRE is built; the default\ndefault is 10 million, which handles all but the most extreme cases. You can\noverride the default by suppling <b>pcre_exec()</b> with a <b>pcre_extra</b>\nblock in which <i>match_limit</i> is set, and PCRE_EXTRA_MATCH_LIMIT is set in\nthe <i>flags</i> field. If the limit is exceeded, <b>pcre_exec()</b> returns\nPCRE_ERROR_MATCHLIMIT.\n</P>\n<P>\nA value for the match limit may also be supplied by an item at the start of a\npattern of the form\n<pre>\n  (*LIMIT_MATCH=d)\n</pre>\nwhere d is a decimal number. However, such a setting is ignored unless d is\nless than the limit set by the caller of <b>pcre_exec()</b> or, if no such limit\nis set, less than the default.\n</P>\n<P>\nThe <i>match_limit_recursion</i> field is similar to <i>match_limit</i>, but\ninstead of limiting the total number of times that <b>match()</b> is called, it\nlimits the depth of recursion. The recursion depth is a smaller number than the\ntotal number of calls, because not all calls to <b>match()</b> are recursive.\nThis limit is of use only if it is set smaller than <i>match_limit</i>.\n</P>\n<P>\nLimiting the recursion depth limits the amount of machine stack that can be\nused, or, when PCRE has been compiled to use memory on the heap instead of the\nstack, the amount of heap memory that can be used. This limit is not relevant,\nand is ignored, when matching is done using JIT compiled code.\n</P>\n<P>\nThe default value for <i>match_limit_recursion</i> can be set when PCRE is\nbuilt; the default default is the same value as the default for\n<i>match_limit</i>. You can override the default by suppling <b>pcre_exec()</b>\nwith a <b>pcre_extra</b> block in which <i>match_limit_recursion</i> is set, and\nPCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the <i>flags</i> field. If the limit\nis exceeded, <b>pcre_exec()</b> returns PCRE_ERROR_RECURSIONLIMIT.\n</P>\n<P>\nA value for the recursion limit may also be supplied by an item at the start of\na pattern of the form\n<pre>\n  (*LIMIT_RECURSION=d)\n</pre>\nwhere d is a decimal number. However, such a setting is ignored unless d is\nless than the limit set by the caller of <b>pcre_exec()</b> or, if no such limit\nis set, less than the default.\n</P>\n<P>\nThe <i>callout_data</i> field is used in conjunction with the \"callout\" feature,\nand is described in the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n</P>\n<P>\nThe <i>tables</i> field is provided for use with patterns that have been\npre-compiled using custom character tables, saved to disc or elsewhere, and\nthen reloaded, because the tables that were used to compile a pattern are not\nsaved with it. See the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation for a discussion of saving compiled patterns for later use. If\nNULL is passed using this mechanism, it forces PCRE's internal tables to be\nused.\n</P>\n<P>\n<b>Warning:</b> The tables that <b>pcre_exec()</b> uses must be the same as those\nthat were used when the pattern was compiled. If this is not the case, the\nbehaviour of <b>pcre_exec()</b> is undefined. Therefore, when a pattern is\ncompiled and matched in the same process, this field should never be set. In\nthis (the most common) case, the correct table pointer is automatically passed\nwith the compiled pattern from <b>pcre_compile()</b> to <b>pcre_exec()</b>.\n</P>\n<P>\nIf PCRE_EXTRA_MARK is set in the <i>flags</i> field, the <i>mark</i> field must\nbe set to point to a suitable variable. If the pattern contains any\nbacktracking control verbs such as (*MARK:NAME), and the execution ends up with\na name to pass back, a pointer to the name string (zero terminated) is placed\nin the variable pointed to by the <i>mark</i> field. The names are within the\ncompiled pattern; if you wish to retain such a name you must copy it before\nfreeing the memory of a compiled pattern. If there is no name to pass back, the\nvariable pointed to by the <i>mark</i> field is set to NULL. For details of the\nbacktracking control verbs, see the section entitled\n<a href=\"pcrepattern#backtrackcontrol\">\"Backtracking control\"</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation.\n<a name=\"execoptions\"></a></P>\n<br><b>\nOption bits for <b>pcre_exec()</b>\n</b><br>\n<P>\nThe unused bits of the <i>options</i> argument for <b>pcre_exec()</b> must be\nzero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,\nPCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,\nPCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and\nPCRE_PARTIAL_SOFT.\n</P>\n<P>\nIf the pattern was successfully studied with one of the just-in-time (JIT)\ncompile options, the only supported options for JIT execution are\nPCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY,\nPCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an\nunsupported option is used, JIT execution is disabled and the normal\ninterpretive code in <b>pcre_exec()</b> is run.\n<pre>\n  PCRE_ANCHORED\n</pre>\nThe PCRE_ANCHORED option limits <b>pcre_exec()</b> to matching at the first\nmatching position. If a pattern was compiled with PCRE_ANCHORED, or turned out\nto be anchored by virtue of its contents, it cannot be made unachored at\nmatching time.\n<pre>\n  PCRE_BSR_ANYCRLF\n  PCRE_BSR_UNICODE\n</pre>\nThese options (which are mutually exclusive) control what the \\R escape\nsequence matches. The choice is either to match only CR, LF, or CRLF, or to\nmatch any Unicode newline sequence. These options override the choice that was\nmade or defaulted when the pattern was compiled.\n<pre>\n  PCRE_NEWLINE_CR\n  PCRE_NEWLINE_LF\n  PCRE_NEWLINE_CRLF\n  PCRE_NEWLINE_ANYCRLF\n  PCRE_NEWLINE_ANY\n</pre>\nThese options override the newline definition that was chosen or defaulted when\nthe pattern was compiled. For details, see the description of\n<b>pcre_compile()</b> above. During matching, the newline choice affects the\nbehaviour of the dot, circumflex, and dollar metacharacters. It may also alter\nthe way the match position is advanced after a match failure for an unanchored\npattern.\n</P>\n<P>\nWhen PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a\nmatch attempt for an unanchored pattern fails when the current position is at a\nCRLF sequence, and the pattern contains no explicit matches for CR or LF\ncharacters, the match position is advanced by two characters instead of one, in\nother words, to after the CRLF.\n</P>\n<P>\nThe above rule is a compromise that makes the most common cases work as\nexpected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not\nset), it does not match the string \"\\r\\nA\" because, after failing at the\nstart, it skips both the CR and the LF before retrying. However, the pattern\n[\\r\\n]A does match that string, because it contains an explicit CR or LF\nreference, and so advances only by one character after the first failure.\n</P>\n<P>\nAn explicit match for CR of LF is either a literal appearance of one of those\ncharacters, or one of the \\r or \\n escape sequences. Implicit matches such as\n[^X] do not count, nor does \\s (which includes CR and LF in the characters\nthat it matches).\n</P>\n<P>\nNotwithstanding the above, anomalous effects may still occur when CRLF is a\nvalid newline sequence and explicit \\r or \\n escapes appear in the pattern.\n<pre>\n  PCRE_NOTBOL\n</pre>\nThis option specifies that first character of the subject string is not the\nbeginning of a line, so the circumflex metacharacter should not match before\nit. Setting this without PCRE_MULTILINE (at compile time) causes circumflex\nnever to match. This option affects only the behaviour of the circumflex\nmetacharacter. It does not affect \\A.\n<pre>\n  PCRE_NOTEOL\n</pre>\nThis option specifies that the end of the subject string is not the end of a\nline, so the dollar metacharacter should not match it nor (except in multiline\nmode) a newline immediately before it. Setting this without PCRE_MULTILINE (at\ncompile time) causes dollar never to match. This option affects only the\nbehaviour of the dollar metacharacter. It does not affect \\Z or \\z.\n<pre>\n  PCRE_NOTEMPTY\n</pre>\nAn empty string is not considered to be a valid match if this option is set. If\nthere are alternatives in the pattern, they are tried. If all the alternatives\nmatch the empty string, the entire match fails. For example, if the pattern\n<pre>\n  a?b?\n</pre>\nis applied to a string not beginning with \"a\" or \"b\", it matches an empty\nstring at the start of the subject. With PCRE_NOTEMPTY set, this match is not\nvalid, so PCRE searches further into the string for occurrences of \"a\" or \"b\".\n<pre>\n  PCRE_NOTEMPTY_ATSTART\n</pre>\nThis is like PCRE_NOTEMPTY, except that an empty string match that is not at\nthe start of the subject is permitted. If the pattern is anchored, such a match\ncan occur only if the pattern contains \\K.\n</P>\n<P>\nPerl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it\ndoes make a special case of a pattern match of the empty string within its\n<b>split()</b> function, and when using the /g modifier. It is possible to\nemulate Perl's behaviour after matching a null string by first trying the match\nagain at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then\nif that fails, by advancing the starting offset (see below) and trying an\nordinary match again. There is some code that demonstrates how to do this in\nthe\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\nsample program. In the most general case, you have to check to see if the\nnewline convention recognizes CRLF as a newline, and if so, and the current\ncharacter is CR followed by LF, advance the starting offset by two characters\ninstead of one.\n<pre>\n  PCRE_NO_START_OPTIMIZE\n</pre>\nThere are a number of optimizations that <b>pcre_exec()</b> uses at the start of\na match, in order to speed up the process. For example, if it is known that an\nunanchored match must start with a specific character, it searches the subject\nfor that character, and fails immediately if it cannot find it, without\nactually running the main matching function. This means that a special item\nsuch as (*COMMIT) at the start of a pattern is not considered until after a\nsuitable starting point for the match has been found. Also, when callouts or\n(*MARK) items are in use, these \"start-up\" optimizations can cause them to be\nskipped if the pattern is never actually used. The start-up optimizations are\nin effect a pre-scan of the subject that takes place before the pattern is run.\n</P>\n<P>\nThe PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly\ncausing performance to suffer, but ensuring that in cases where the result is\n\"no match\", the callouts do occur, and that items such as (*COMMIT) and (*MARK)\nare considered at every possible starting position in the subject string. If\nPCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching\ntime. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it\nto <b>pcre_exec()</b>) disables JIT execution; in this situation, matching is\nalways done using interpretively.\n</P>\n<P>\nSetting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation.\nConsider the pattern\n<pre>\n  (*COMMIT)ABC\n</pre>\nWhen this is compiled, PCRE records the fact that a match must start with the\ncharacter \"A\". Suppose the subject string is \"DEFABC\". The start-up\noptimization scans along the subject, finds \"A\" and runs the first match\nattempt from there. The (*COMMIT) item means that the pattern must match the\ncurrent starting position, which in this case, it does. However, if the same\nmatch is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the\nsubject string does not happen. The first match attempt is run starting from\n\"D\" and when this fails, (*COMMIT) prevents any further matches being tried, so\nthe overall result is \"no match\". If the pattern is studied, more start-up\noptimizations may be used. For example, a minimum length for the subject may be\nrecorded. Consider the pattern\n<pre>\n  (*MARK:A)(X|Y)\n</pre>\nThe minimum length for a match is one character. If the subject is \"ABC\", there\nwill be attempts to match \"ABC\", \"BC\", \"C\", and then finally an empty string.\nIf the pattern is studied, the final attempt does not take place, because PCRE\nknows that the subject is too short, and so the (*MARK) is never encountered.\nIn this case, studying the pattern does not affect the overall match result,\nwhich is still \"no match\", but it does affect the auxiliary information that is\nreturned.\n<pre>\n  PCRE_NO_UTF8_CHECK\n</pre>\nWhen PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8\nstring is automatically checked when <b>pcre_exec()</b> is subsequently called.\nThe entire string is checked before any other processing takes place. The value\nof <i>startoffset</i> is also checked to ensure that it points to the start of a\nUTF-8 character. There is a discussion about the\n<a href=\"pcreunicode.html#utf8strings\">validity of UTF-8 strings</a>\nin the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage. If an invalid sequence of bytes is found, <b>pcre_exec()</b> returns the\nerror PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a\ntruncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both\ncases, information about the precise nature of the error may also be returned\n(see the descriptions of these errors in the section entitled \\fIError return\nvalues from\\fP <b>pcre_exec()</b>\n<a href=\"#errorlist\">below).</a>\nIf <i>startoffset</i> contains a value that does not point to the start of a\nUTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is\nreturned.\n</P>\n<P>\nIf you already know that your subject is valid, and you want to skip these\nchecks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when\ncalling <b>pcre_exec()</b>. You might want to do this for the second and\nsubsequent calls to <b>pcre_exec()</b> if you are making repeated calls to find\nall the matches in a single subject string. However, you should be sure that\nthe value of <i>startoffset</i> points to the start of a character (or the end\nof the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an\ninvalid string as a subject or an invalid value of <i>startoffset</i> is\nundefined. Your program may crash or loop.\n<pre>\n  PCRE_PARTIAL_HARD\n  PCRE_PARTIAL_SOFT\n</pre>\nThese options turn on the partial matching feature. For backwards\ncompatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match\noccurs if the end of the subject string is reached successfully, but there are\nnot enough subject characters to complete the match. If this happens when\nPCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by\ntesting any remaining alternatives. Only if no complete match can be found is\nPCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words,\nPCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match,\nbut only if no complete match can be found.\n</P>\n<P>\nIf PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a\npartial match is found, <b>pcre_exec()</b> immediately returns\nPCRE_ERROR_PARTIAL, without considering any other alternatives. In other words,\nwhen PCRE_PARTIAL_HARD is set, a partial match is considered to be more\nimportant that an alternative complete match.\n</P>\n<P>\nIn both cases, the portion of the string that was inspected when the partial\nmatch was found is set as the first matching string. There is a more detailed\ndiscussion of partial and multi-segment matching, with examples, in the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation.\n</P>\n<br><b>\nThe string to be matched by <b>pcre_exec()</b>\n</b><br>\n<P>\nThe subject string is passed to <b>pcre_exec()</b> as a pointer in\n<i>subject</i>, a length in <i>length</i>, and a starting offset in\n<i>startoffset</i>. The units for <i>length</i> and <i>startoffset</i> are bytes\nfor the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit\ndata items for the 32-bit library.\n</P>\n<P>\nIf <i>startoffset</i> is negative or greater than the length of the subject,\n<b>pcre_exec()</b> returns PCRE_ERROR_BADOFFSET. When the starting offset is\nzero, the search for a match starts at the beginning of the subject, and this\nis by far the most common case. In UTF-8 or UTF-16 mode, the offset must point\nto the start of a character, or the end of the subject (in UTF-32 mode, one\ndata unit equals one character, so all offsets are valid). Unlike the pattern\nstring, the subject may contain binary zeroes.\n</P>\n<P>\nA non-zero starting offset is useful when searching for another match in the\nsame subject by calling <b>pcre_exec()</b> again after a previous success.\nSetting <i>startoffset</i> differs from just passing over a shortened string and\nsetting PCRE_NOTBOL in the case of a pattern that begins with any kind of\nlookbehind. For example, consider the pattern\n<pre>\n  \\Biss\\B\n</pre>\nwhich finds occurrences of \"iss\" in the middle of words. (\\B matches only if\nthe current position in the subject is not a word boundary.) When applied to\nthe string \"Mississipi\" the first call to <b>pcre_exec()</b> finds the first\noccurrence. If <b>pcre_exec()</b> is called again with just the remainder of the\nsubject, namely \"issipi\", it does not match, because \\B is always false at the\nstart of the subject, which is deemed to be a word boundary. However, if\n<b>pcre_exec()</b> is passed the entire string again, but with <i>startoffset</i>\nset to 4, it finds the second occurrence of \"iss\" because it is able to look\nbehind the starting point to discover that it is preceded by a letter.\n</P>\n<P>\nFinding all the matches in a subject is tricky when the pattern can match an\nempty string. It is possible to emulate Perl's /g behaviour by first trying the\nmatch again at the same offset, with the PCRE_NOTEMPTY_ATSTART and\nPCRE_ANCHORED options, and then if that fails, advancing the starting offset\nand trying an ordinary match again. There is some code that demonstrates how to\ndo this in the\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\nsample program. In the most general case, you have to check to see if the\nnewline convention recognizes CRLF as a newline, and if so, and the current\ncharacter is CR followed by LF, advance the starting offset by two characters\ninstead of one.\n</P>\n<P>\nIf a non-zero starting offset is passed when the pattern is anchored, one\nattempt to match at the given offset is made. This can only succeed if the\npattern does not require the match to be at the start of the subject.\n</P>\n<br><b>\nHow <b>pcre_exec()</b> returns captured substrings\n</b><br>\n<P>\nIn general, a pattern matches a certain portion of the subject, and in\naddition, further substrings from the subject may be picked out by parts of the\npattern. Following the usage in Jeffrey Friedl's book, this is called\n\"capturing\" in what follows, and the phrase \"capturing subpattern\" is used for\na fragment of a pattern that picks out a substring. PCRE supports several other\nkinds of parenthesized subpattern that do not cause substrings to be captured.\n</P>\n<P>\nCaptured substrings are returned to the caller via a vector of integers whose\naddress is passed in <i>ovector</i>. The number of elements in the vector is\npassed in <i>ovecsize</i>, which must be a non-negative number. <b>Note</b>: this\nargument is NOT the size of <i>ovector</i> in bytes.\n</P>\n<P>\nThe first two-thirds of the vector is used to pass back captured substrings,\neach substring using a pair of integers. The remaining third of the vector is\nused as workspace by <b>pcre_exec()</b> while matching capturing subpatterns,\nand is not available for passing back information. The number passed in\n<i>ovecsize</i> should always be a multiple of three. If it is not, it is\nrounded down.\n</P>\n<P>\nWhen a match is successful, information about captured substrings is returned\nin pairs of integers, starting at the beginning of <i>ovector</i>, and\ncontinuing up to two-thirds of its length at the most. The first element of\neach pair is set to the offset of the first character in a substring, and the\nsecond is set to the offset of the first character after the end of a\nsubstring. These values are always data unit offsets, even in UTF mode. They\nare byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit\nlibrary, and 32-bit data item offsets in the 32-bit library. <b>Note</b>: they\nare not character counts.\n</P>\n<P>\nThe first pair of integers, <i>ovector[0]</i> and <i>ovector[1]</i>, identify the\nportion of the subject string matched by the entire pattern. The next pair is\nused for the first capturing subpattern, and so on. The value returned by\n<b>pcre_exec()</b> is one more than the highest numbered pair that has been set.\nFor example, if two substrings have been captured, the returned value is 3. If\nthere are no capturing subpatterns, the return value from a successful match is\n1, indicating that just the first pair of offsets has been set.\n</P>\n<P>\nIf a capturing subpattern is matched repeatedly, it is the last portion of the\nstring that it matched that is returned.\n</P>\n<P>\nIf the vector is too small to hold all the captured substring offsets, it is\nused as far as possible (up to two-thirds of its length), and the function\nreturns a value of zero. If neither the actual string matched nor any captured\nsubstrings are of interest, <b>pcre_exec()</b> may be called with <i>ovector</i>\npassed as NULL and <i>ovecsize</i> as zero. However, if the pattern contains\nback references and the <i>ovector</i> is not big enough to remember the related\nsubstrings, PCRE has to get additional memory for use during matching. Thus it\nis usually advisable to supply an <i>ovector</i> of reasonable size.\n</P>\n<P>\nThere are some cases where zero is returned (indicating vector overflow) when\nin fact the vector is exactly the right size for the final match. For example,\nconsider the pattern\n<pre>\n  (a)(?:(b)c|bd)\n</pre>\nIf a vector of 6 elements (allowing for only 1 captured substring) is given\nwith subject string \"abd\", <b>pcre_exec()</b> will try to set the second\ncaptured string, thereby recording a vector overflow, before failing to match\n\"c\" and backing up to try the second alternative. The zero return, however,\ndoes correctly indicate that the maximum number of slots (namely 2) have been\nfilled. In similar cases where there is temporary overflow, but the final\nnumber of used slots is actually less than the maximum, a non-zero value is\nreturned.\n</P>\n<P>\nThe <b>pcre_fullinfo()</b> function can be used to find out how many capturing\nsubpatterns there are in a compiled pattern. The smallest size for\n<i>ovector</i> that will allow for <i>n</i> captured substrings, in addition to\nthe offsets of the substring matched by the whole pattern, is (<i>n</i>+1)*3.\n</P>\n<P>\nIt is possible for capturing subpattern number <i>n+1</i> to match some part of\nthe subject when subpattern <i>n</i> has not been used at all. For example, if\nthe string \"abc\" is matched against the pattern (a|(z))(bc) the return from the\nfunction is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this\nhappens, both values in the offset pairs corresponding to unused subpatterns\nare set to -1.\n</P>\n<P>\nOffset values that correspond to unused subpatterns at the end of the\nexpression are also set to -1. For example, if the string \"abc\" is matched\nagainst the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The\nreturn from the function is 2, because the highest used capturing subpattern\nnumber is 1, and the offsets for for the second and third capturing subpatterns\n(assuming the vector is large enough, of course) are set to -1.\n</P>\n<P>\n<b>Note</b>: Elements in the first two-thirds of <i>ovector</i> that do not\ncorrespond to capturing parentheses in the pattern are never changed. That is,\nif a pattern contains <i>n</i> capturing parentheses, no more than\n<i>ovector[0]</i> to <i>ovector[2n+1]</i> are set by <b>pcre_exec()</b>. The other\nelements (in the first two-thirds) retain whatever values they previously had.\n</P>\n<P>\nSome convenience functions are provided for extracting the captured substrings\nas separate strings. These are described below.\n<a name=\"errorlist\"></a></P>\n<br><b>\nError return values from <b>pcre_exec()</b>\n</b><br>\n<P>\nIf <b>pcre_exec()</b> fails, it returns a negative number. The following are\ndefined in the header file:\n<pre>\n  PCRE_ERROR_NOMATCH        (-1)\n</pre>\nThe subject string did not match the pattern.\n<pre>\n  PCRE_ERROR_NULL           (-2)\n</pre>\nEither <i>code</i> or <i>subject</i> was passed as NULL, or <i>ovector</i> was\nNULL and <i>ovecsize</i> was not zero.\n<pre>\n  PCRE_ERROR_BADOPTION      (-3)\n</pre>\nAn unrecognized bit was set in the <i>options</i> argument.\n<pre>\n  PCRE_ERROR_BADMAGIC       (-4)\n</pre>\nPCRE stores a 4-byte \"magic number\" at the start of the compiled code, to catch\nthe case when it is passed a junk pointer and to detect when a pattern that was\ncompiled in an environment of one endianness is run in an environment with the\nother endianness. This is the error that PCRE gives when the magic number is\nnot present.\n<pre>\n  PCRE_ERROR_UNKNOWN_OPCODE (-5)\n</pre>\nWhile running the pattern match, an unknown item was encountered in the\ncompiled pattern. This error could be caused by a bug in PCRE or by overwriting\nof the compiled pattern.\n<pre>\n  PCRE_ERROR_NOMEMORY       (-6)\n</pre>\nIf a pattern contains back references, but the <i>ovector</i> that is passed to\n<b>pcre_exec()</b> is not big enough to remember the referenced substrings, PCRE\ngets a block of memory at the start of matching to use for this purpose. If the\ncall via <b>pcre_malloc()</b> fails, this error is given. The memory is\nautomatically freed at the end of matching.\n</P>\n<P>\nThis error is also given if <b>pcre_stack_malloc()</b> fails in\n<b>pcre_exec()</b>. This can happen only when PCRE has been compiled with\n<b>--disable-stack-for-recursion</b>.\n<pre>\n  PCRE_ERROR_NOSUBSTRING    (-7)\n</pre>\nThis error is used by the <b>pcre_copy_substring()</b>,\n<b>pcre_get_substring()</b>, and <b>pcre_get_substring_list()</b> functions (see\nbelow). It is never returned by <b>pcre_exec()</b>.\n<pre>\n  PCRE_ERROR_MATCHLIMIT     (-8)\n</pre>\nThe backtracking limit, as specified by the <i>match_limit</i> field in a\n<b>pcre_extra</b> structure (or defaulted) was reached. See the description\nabove.\n<pre>\n  PCRE_ERROR_CALLOUT        (-9)\n</pre>\nThis error is never generated by <b>pcre_exec()</b> itself. It is provided for\nuse by callout functions that want to yield a distinctive error code. See the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation for details.\n<pre>\n  PCRE_ERROR_BADUTF8        (-10)\n</pre>\nA string that contains an invalid UTF-8 byte sequence was passed as a subject,\nand the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector\n(<i>ovecsize</i>) is at least 2, the byte offset to the start of the the invalid\nUTF-8 character is placed in the first element, and a reason code is placed in\nthe second element. The reason codes are listed in the\n<a href=\"#badutf8reasons\">following section.</a>\nFor backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a\ntruncated UTF-8 character at the end of the subject (reason codes 1 to 5),\nPCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.\n<pre>\n  PCRE_ERROR_BADUTF8_OFFSET (-11)\n</pre>\nThe UTF-8 byte sequence that was passed as a subject was checked and found to\nbe valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of\n<i>startoffset</i> did not point to the beginning of a UTF-8 character or the\nend of the subject.\n<pre>\n  PCRE_ERROR_PARTIAL        (-12)\n</pre>\nThe subject string did not match, but it did match partially. See the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation for details of partial matching.\n<pre>\n  PCRE_ERROR_BADPARTIAL     (-13)\n</pre>\nThis code is no longer in use. It was formerly returned when the PCRE_PARTIAL\noption was used with a compiled pattern containing items that were not\nsupported for partial matching. From release 8.00 onwards, there are no\nrestrictions on partial matching.\n<pre>\n  PCRE_ERROR_INTERNAL       (-14)\n</pre>\nAn unexpected internal error has occurred. This error could be caused by a bug\nin PCRE or by overwriting of the compiled pattern.\n<pre>\n  PCRE_ERROR_BADCOUNT       (-15)\n</pre>\nThis error is given if the value of the <i>ovecsize</i> argument is negative.\n<pre>\n  PCRE_ERROR_RECURSIONLIMIT (-21)\n</pre>\nThe internal recursion limit, as specified by the <i>match_limit_recursion</i>\nfield in a <b>pcre_extra</b> structure (or defaulted) was reached. See the\ndescription above.\n<pre>\n  PCRE_ERROR_BADNEWLINE     (-23)\n</pre>\nAn invalid combination of PCRE_NEWLINE_<i>xxx</i> options was given.\n<pre>\n  PCRE_ERROR_BADOFFSET      (-24)\n</pre>\nThe value of <i>startoffset</i> was negative or greater than the length of the\nsubject, that is, the value in <i>length</i>.\n<pre>\n  PCRE_ERROR_SHORTUTF8      (-25)\n</pre>\nThis error is returned instead of PCRE_ERROR_BADUTF8 when the subject string\nends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set.\nInformation about the failure is returned as for PCRE_ERROR_BADUTF8. It is in\nfact sufficient to detect this case, but this special error code for\nPCRE_PARTIAL_HARD precedes the implementation of returned information; it is\nretained for backwards compatibility.\n<pre>\n  PCRE_ERROR_RECURSELOOP    (-26)\n</pre>\nThis error is returned when <b>pcre_exec()</b> detects a recursion loop within\nthe pattern. Specifically, it means that either the whole pattern or a\nsubpattern has been called recursively for the second time at the same position\nin the subject string. Some simple patterns that might do this are detected and\nfaulted at compile time, but more complicated cases, in particular mutual\nrecursions between two different subpatterns, cannot be detected until run\ntime.\n<pre>\n  PCRE_ERROR_JIT_STACKLIMIT (-27)\n</pre>\nThis error is returned when a pattern that was successfully studied using a\nJIT compile option is being matched, but the memory available for the\njust-in-time processing stack is not large enough. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for more details.\n<pre>\n  PCRE_ERROR_BADMODE        (-28)\n</pre>\nThis error is given if a pattern that was compiled by the 8-bit library is\npassed to a 16-bit or 32-bit library function, or vice versa.\n<pre>\n  PCRE_ERROR_BADENDIANNESS  (-29)\n</pre>\nThis error is given if a pattern that was compiled and saved is reloaded on a\nhost with different endianness. The utility function\n<b>pcre_pattern_to_host_byte_order()</b> can be used to convert such a pattern\nso that it runs on the new host.\n<pre>\n  PCRE_ERROR_JIT_BADOPTION\n</pre>\nThis error is returned when a pattern that was successfully studied using a JIT\ncompile option is being matched, but the matching mode (partial or complete\nmatch) does not correspond to any JIT compilation mode. When the JIT fast path\nfunction is used, this error may be also given for invalid options. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for more details.\n<pre>\n  PCRE_ERROR_BADLENGTH      (-32)\n</pre>\nThis error is given if <b>pcre_exec()</b> is called with a negative value for\nthe <i>length</i> argument.\n</P>\n<P>\nError numbers -16 to -20, -22, and 30 are not used by <b>pcre_exec()</b>.\n<a name=\"badutf8reasons\"></a></P>\n<br><b>\nReason codes for invalid UTF-8 strings\n</b><br>\n<P>\nThis section applies only to the 8-bit library. The corresponding information\nfor the 16-bit and 32-bit libraries is given in the\n<a href=\"pcre16.html\"><b>pcre16</b></a>\nand\n<a href=\"pcre32.html\"><b>pcre32</b></a>\npages.\n</P>\n<P>\nWhen <b>pcre_exec()</b> returns either PCRE_ERROR_BADUTF8 or\nPCRE_ERROR_SHORTUTF8, and the size of the output vector (<i>ovecsize</i>) is at\nleast 2, the offset of the start of the invalid UTF-8 character is placed in\nthe first output vector element (<i>ovector[0]</i>) and a reason code is placed\nin the second element (<i>ovector[1]</i>). The reason codes are given names in\nthe <b>pcre.h</b> header file:\n<pre>\n  PCRE_UTF8_ERR1\n  PCRE_UTF8_ERR2\n  PCRE_UTF8_ERR3\n  PCRE_UTF8_ERR4\n  PCRE_UTF8_ERR5\n</pre>\nThe string ends with a truncated UTF-8 character; the code specifies how many\nbytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be\nno longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)\nallows for up to 6 bytes, and this is checked first; hence the possibility of\n4 or 5 missing bytes.\n<pre>\n  PCRE_UTF8_ERR6\n  PCRE_UTF8_ERR7\n  PCRE_UTF8_ERR8\n  PCRE_UTF8_ERR9\n  PCRE_UTF8_ERR10\n</pre>\nThe two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the\ncharacter do not have the binary value 0b10 (that is, either the most\nsignificant bit is 0, or the next bit is 1).\n<pre>\n  PCRE_UTF8_ERR11\n  PCRE_UTF8_ERR12\n</pre>\nA character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;\nthese code points are excluded by RFC 3629.\n<pre>\n  PCRE_UTF8_ERR13\n</pre>\nA 4-byte character has a value greater than 0x10fff; these code points are\nexcluded by RFC 3629.\n<pre>\n  PCRE_UTF8_ERR14\n</pre>\nA 3-byte character has a value in the range 0xd800 to 0xdfff; this range of\ncode points are reserved by RFC 3629 for use with UTF-16, and so are excluded\nfrom UTF-8.\n<pre>\n  PCRE_UTF8_ERR15\n  PCRE_UTF8_ERR16\n  PCRE_UTF8_ERR17\n  PCRE_UTF8_ERR18\n  PCRE_UTF8_ERR19\n</pre>\nA 2-, 3-, 4-, 5-, or 6-byte character is \"overlong\", that is, it codes for a\nvalue that can be represented by fewer bytes, which is invalid. For example,\nthe two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just\none byte.\n<pre>\n  PCRE_UTF8_ERR20\n</pre>\nThe two most significant bits of the first byte of a character have the binary\nvalue 0b10 (that is, the most significant bit is 1 and the second is 0). Such a\nbyte can only validly occur as the second or subsequent byte of a multi-byte\ncharacter.\n<pre>\n  PCRE_UTF8_ERR21\n</pre>\nThe first byte of a character has the value 0xfe or 0xff. These values can\nnever occur in a valid UTF-8 string.\n<pre>\n  PCRE_UTF8_ERR22\n</pre>\nThis error code was formerly used when the presence of a so-called\n\"non-character\" caused an error. Unicode corrigendum #9 makes it clear that\nsuch characters should not cause a string to be rejected, and so this code is\nno longer in use and is never returned.\n</P>\n<br><a name=\"SEC18\" href=\"#TOC1\">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a><br>\n<P>\n<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>\n<b>     int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, int <i>stringnumber</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n<br>\n<br>\n<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>\n<b>     int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>\n</P>\n<P>\nCaptured substrings can be accessed directly by using the offsets returned by\n<b>pcre_exec()</b> in <i>ovector</i>. For convenience, the functions\n<b>pcre_copy_substring()</b>, <b>pcre_get_substring()</b>, and\n<b>pcre_get_substring_list()</b> are provided for extracting captured substrings\nas new, separate, zero-terminated strings. These functions identify substrings\nby number. The next section describes functions for extracting named\nsubstrings.\n</P>\n<P>\nA substring that contains a binary zero is correctly extracted and has a\nfurther zero added on the end, but the result is not, of course, a C string.\nHowever, you can process such a string by referring to the length that is\nreturned by <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>.\nUnfortunately, the interface to <b>pcre_get_substring_list()</b> is not adequate\nfor handling strings containing binary zeros, because the end of the final\nstring is not independently indicated.\n</P>\n<P>\nThe first three arguments are the same for all three of these functions:\n<i>subject</i> is the subject string that has just been successfully matched,\n<i>ovector</i> is a pointer to the vector of integer offsets that was passed to\n<b>pcre_exec()</b>, and <i>stringcount</i> is the number of substrings that were\ncaptured by the match, including the substring that matched the entire regular\nexpression. This is the value returned by <b>pcre_exec()</b> if it is greater\nthan zero. If <b>pcre_exec()</b> returned zero, indicating that it ran out of\nspace in <i>ovector</i>, the value passed as <i>stringcount</i> should be the\nnumber of elements in the vector divided by three.\n</P>\n<P>\nThe functions <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>\nextract a single substring, whose number is given as <i>stringnumber</i>. A\nvalue of zero extracts the substring that matched the entire pattern, whereas\nhigher values extract the captured substrings. For <b>pcre_copy_substring()</b>,\nthe string is placed in <i>buffer</i>, whose length is given by\n<i>buffersize</i>, while for <b>pcre_get_substring()</b> a new block of memory is\nobtained via <b>pcre_malloc</b>, and its address is returned via\n<i>stringptr</i>. The yield of the function is the length of the string, not\nincluding the terminating zero, or one of these error codes:\n<pre>\n  PCRE_ERROR_NOMEMORY       (-6)\n</pre>\nThe buffer was too small for <b>pcre_copy_substring()</b>, or the attempt to get\nmemory failed for <b>pcre_get_substring()</b>.\n<pre>\n  PCRE_ERROR_NOSUBSTRING    (-7)\n</pre>\nThere is no substring whose number is <i>stringnumber</i>.\n</P>\n<P>\nThe <b>pcre_get_substring_list()</b> function extracts all available substrings\nand builds a list of pointers to them. All this is done in a single block of\nmemory that is obtained via <b>pcre_malloc</b>. The address of the memory block\nis returned via <i>listptr</i>, which is also the start of the list of string\npointers. The end of the list is marked by a NULL pointer. The yield of the\nfunction is zero if all went well, or the error code\n<pre>\n  PCRE_ERROR_NOMEMORY       (-6)\n</pre>\nif the attempt to get the memory block failed.\n</P>\n<P>\nWhen any of these functions encounter a substring that is unset, which can\nhappen when capturing subpattern number <i>n+1</i> matches some part of the\nsubject, but subpattern <i>n</i> has not been used at all, they return an empty\nstring. This can be distinguished from a genuine zero-length substring by\ninspecting the appropriate offset in <i>ovector</i>, which is negative for unset\nsubstrings.\n</P>\n<P>\nThe two convenience functions <b>pcre_free_substring()</b> and\n<b>pcre_free_substring_list()</b> can be used to free the memory returned by\na previous call of <b>pcre_get_substring()</b> or\n<b>pcre_get_substring_list()</b>, respectively. They do nothing more than call\nthe function pointed to by <b>pcre_free</b>, which of course could be called\ndirectly from a C program. However, PCRE is used in some situations where it is\nlinked via a special interface to another programming language that cannot use\n<b>pcre_free</b> directly; it is for these cases that the functions are\nprovided.\n</P>\n<br><a name=\"SEC19\" href=\"#TOC1\">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a><br>\n<P>\n<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>);</b>\n<br>\n<br>\n<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     char *<i>buffer</i>, int <i>buffersize</i>);</b>\n<br>\n<br>\n<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>\n<b>     const char *<i>subject</i>, int *<i>ovector</i>,</b>\n<b>     int <i>stringcount</i>, const char *<i>stringname</i>,</b>\n<b>     const char **<i>stringptr</i>);</b>\n</P>\n<P>\nTo extract a substring by name, you first have to find associated number.\nFor example, for this pattern\n<pre>\n  (a+)b(?&#60;xxx&#62;\\d+)...\n</pre>\nthe number of the subpattern called \"xxx\" is 2. If the name is known to be\nunique (PCRE_DUPNAMES was not set), you can find the number from the name by\ncalling <b>pcre_get_stringnumber()</b>. The first argument is the compiled\npattern, and the second is the name. The yield of the function is the\nsubpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of\nthat name.\n</P>\n<P>\nGiven the number, you can extract the substring directly, or use one of the\nfunctions described in the previous section. For convenience, there are also\ntwo functions that do the whole job.\n</P>\n<P>\nMost of the arguments of <b>pcre_copy_named_substring()</b> and\n<b>pcre_get_named_substring()</b> are the same as those for the similarly named\nfunctions that extract by number. As these are described in the previous\nsection, they are not re-described here. There are just two differences:\n</P>\n<P>\nFirst, instead of a substring number, a substring name is given. Second, there\nis an extra argument, given at the start, which is a pointer to the compiled\npattern. This is needed in order to gain access to the name-to-number\ntranslation table.\n</P>\n<P>\nThese functions call <b>pcre_get_stringnumber()</b>, and if it succeeds, they\nthen call <b>pcre_copy_substring()</b> or <b>pcre_get_substring()</b>, as\nappropriate. <b>NOTE:</b> If PCRE_DUPNAMES is set and there are duplicate names,\nthe behaviour may not be what you want (see the next section).\n</P>\n<P>\n<b>Warning:</b> If the pattern uses the (?| feature to set up multiple\nsubpatterns with the same number, as described in the\n<a href=\"pcrepattern.html#dupsubpatternnumber\">section on duplicate subpattern numbers</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\npage, you cannot use names to distinguish the different subpatterns, because\nnames are not included in the compiled code. The matching process uses only\nnumbers. For this reason, the use of different names for subpatterns of the\nsame number causes an error at compile time.\n</P>\n<br><a name=\"SEC20\" href=\"#TOC1\">DUPLICATE SUBPATTERN NAMES</a><br>\n<P>\n<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>\n<b>     const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>\n</P>\n<P>\nWhen a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns\nare not required to be unique. (Duplicate names are always allowed for\nsubpatterns with the same number, created by using the (?| feature. Indeed, if\nsuch subpatterns are named, they are required to use the same names.)\n</P>\n<P>\nNormally, patterns with duplicate names are such that in any one match, only\none of the named subpatterns participates. An example is shown in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation.\n</P>\n<P>\nWhen duplicates are present, <b>pcre_copy_named_substring()</b> and\n<b>pcre_get_named_substring()</b> return the first substring corresponding to\nthe given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is\nreturned; no data is returned. The <b>pcre_get_stringnumber()</b> function\nreturns one of the numbers that are associated with the name, but it is not\ndefined which it is.\n</P>\n<P>\nIf you want to get full details of all captured substrings for a given name,\nyou must use the <b>pcre_get_stringtable_entries()</b> function. The first\nargument is the compiled pattern, and the second is the name. The third and\nfourth are pointers to variables which are updated by the function. After it\nhas run, they point to the first and last entries in the name-to-number table\nfor the given name. The function itself returns the length of each entry, or\nPCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is\ndescribed above in the section entitled <i>Information about a pattern</i>\n<a href=\"#infoaboutpattern\">above.</a>\nGiven all the relevant entries for the name, you can extract each of their\nnumbers, and hence the captured data, if any.\n</P>\n<br><a name=\"SEC21\" href=\"#TOC1\">FINDING ALL POSSIBLE MATCHES</a><br>\n<P>\nThe traditional matching function uses a similar algorithm to Perl, which stops\nwhen it finds the first match, starting at a given point in the subject. If you\nwant to find all possible matches, or the longest possible match, consider\nusing the alternative matching function (see below) instead. If you cannot use\nthe alternative function, but still need to find all possible matches, you\ncan kludge it up by making use of the callout facility, which is described in\nthe\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n</P>\n<P>\nWhat you have to do is to insert a callout right at the end of the pattern.\nWhen your callout function is called, extract and save the current matched\nsubstring. Then return 1, which forces <b>pcre_exec()</b> to backtrack and try\nother alternatives. Ultimately, when it runs out of matches, <b>pcre_exec()</b>\nwill yield PCRE_ERROR_NOMATCH.\n</P>\n<br><a name=\"SEC22\" href=\"#TOC1\">OBTAINING AN ESTIMATE OF STACK USAGE</a><br>\n<P>\nMatching certain patterns using <b>pcre_exec()</b> can use a lot of process\nstack, which in certain environments can be rather limited in size. Some users\nfind it helpful to have an estimate of the amount of stack that is used by\n<b>pcre_exec()</b>, to help them set recursion limits, as described in the\n<a href=\"pcrestack.html\"><b>pcrestack</b></a>\ndocumentation. The estimate that is output by <b>pcretest</b> when called with\nthe <b>-m</b> and <b>-C</b> options is obtained by calling <b>pcre_exec</b> with\nthe values NULL, NULL, NULL, -999, and -999 for its first five arguments.\n</P>\n<P>\nNormally, if its first argument is NULL, <b>pcre_exec()</b> immediately returns\nthe negative error code PCRE_ERROR_NULL, but with this special combination of\narguments, it returns instead a negative number whose absolute value is the\napproximate stack frame size in bytes. (A negative number is used so that it is\nclear that no match has happened.) The value is approximate because in some\ncases, recursive calls to <b>pcre_exec()</b> occur when there are one or two\nadditional variables on the stack.\n</P>\n<P>\nIf PCRE has been compiled to use the heap instead of the stack for recursion,\nthe value returned is the size of each block that is obtained from the heap.\n<a name=\"dfamatch\"></a></P>\n<br><a name=\"SEC23\" href=\"#TOC1\">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a><br>\n<P>\n<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>\n<b>     const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>\n<b>     int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>\n<b>     int *<i>workspace</i>, int <i>wscount</i>);</b>\n</P>\n<P>\nThe function <b>pcre_dfa_exec()</b> is called to match a subject string against\na compiled pattern, using a matching algorithm that scans the subject string\njust once, and does not backtrack. This has different characteristics to the\nnormal algorithm, and is not compatible with Perl. Some of the features of PCRE\npatterns are not supported. Nevertheless, there are times when this kind of\nmatching can be useful. For a discussion of the two matching algorithms, and a\nlist of features that <b>pcre_dfa_exec()</b> does not support, see the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\ndocumentation.\n</P>\n<P>\nThe arguments for the <b>pcre_dfa_exec()</b> function are the same as for\n<b>pcre_exec()</b>, plus two extras. The <i>ovector</i> argument is used in a\ndifferent way, and this is described below. The other common arguments are used\nin the same way as for <b>pcre_exec()</b>, so their description is not repeated\nhere.\n</P>\n<P>\nThe two additional arguments provide workspace for the function. The workspace\nvector should contain at least 20 elements. It is used for keeping track of\nmultiple paths through the pattern tree. More workspace will be needed for\npatterns and subjects where there are a lot of potential matches.\n</P>\n<P>\nHere is an example of a simple call to <b>pcre_dfa_exec()</b>:\n<pre>\n  int rc;\n  int ovector[10];\n  int wspace[20];\n  rc = pcre_dfa_exec(\n    re,             /* result of pcre_compile() */\n    NULL,           /* we didn't study the pattern */\n    \"some string\",  /* the subject string */\n    11,             /* the length of the subject string */\n    0,              /* start at offset 0 in the subject */\n    0,              /* default options */\n    ovector,        /* vector of integers for substring information */\n    10,             /* number of elements (NOT size in bytes) */\n    wspace,         /* working space vector */\n    20);            /* number of elements (NOT size in bytes) */\n</PRE>\n</P>\n<br><b>\nOption bits for <b>pcre_dfa_exec()</b>\n</b><br>\n<P>\nThe unused bits of the <i>options</i> argument for <b>pcre_dfa_exec()</b> must be\nzero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,\nPCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,\nPCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE,\nPCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART.\nAll but the last four of these are exactly the same as for <b>pcre_exec()</b>,\nso their description is not repeated here.\n<pre>\n  PCRE_PARTIAL_HARD\n  PCRE_PARTIAL_SOFT\n</pre>\nThese have the same general effect as they do for <b>pcre_exec()</b>, but the\ndetails are slightly different. When PCRE_PARTIAL_HARD is set for\n<b>pcre_dfa_exec()</b>, it returns PCRE_ERROR_PARTIAL if the end of the subject\nis reached and there is still at least one matching possibility that requires\nadditional characters. This happens even if some complete matches have also\nbeen found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH\nis converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,\nthere have been no complete matches, but there is still at least one matching\npossibility. The portion of the string that was inspected when the longest\npartial match was found is set as the first matching string in both cases.\nThere is a more detailed discussion of partial and multi-segment matching, with\nexamples, in the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation.\n<pre>\n  PCRE_DFA_SHORTEST\n</pre>\nSetting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as\nsoon as it has found one match. Because of the way the alternative algorithm\nworks, this is necessarily the shortest possible match at the first possible\nmatching point in the subject string.\n<pre>\n  PCRE_DFA_RESTART\n</pre>\nWhen <b>pcre_dfa_exec()</b> returns a partial match, it is possible to call it\nagain, with additional subject characters, and have it continue with the same\nmatch. The PCRE_DFA_RESTART option requests this action; when it is set, the\n<i>workspace</i> and <i>wscount</i> options must reference the same vector as\nbefore because data about the match so far is left in them after a partial\nmatch. There is more discussion of this facility in the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation.\n</P>\n<br><b>\nSuccessful returns from <b>pcre_dfa_exec()</b>\n</b><br>\n<P>\nWhen <b>pcre_dfa_exec()</b> succeeds, it may have matched more than one\nsubstring in the subject. Note, however, that all the matches from one run of\nthe function start at the same point in the subject. The shorter matches are\nall initial substrings of the longer matches. For example, if the pattern\n<pre>\n  &#60;.*&#62;\n</pre>\nis matched against the string\n<pre>\n  This is &#60;something&#62; &#60;something else&#62; &#60;something further&#62; no more\n</pre>\nthe three matched strings are\n<pre>\n  &#60;something&#62;\n  &#60;something&#62; &#60;something else&#62;\n  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;\n</pre>\nOn success, the yield of the function is a number greater than zero, which is\nthe number of matched substrings. The substrings themselves are returned in\n<i>ovector</i>. Each string uses two elements; the first is the offset to the\nstart, and the second is the offset to the end. In fact, all the strings have\nthe same start offset. (Space could have been saved by giving this only once,\nbut it was decided to retain some compatibility with the way <b>pcre_exec()</b>\nreturns data, even though the meaning of the strings is different.)\n</P>\n<P>\nThe strings are returned in reverse order of length; that is, the longest\nmatching string is given first. If there were too many matches to fit into\n<i>ovector</i>, the yield of the function is zero, and the vector is filled with\nthe longest matches. Unlike <b>pcre_exec()</b>, <b>pcre_dfa_exec()</b> can use\nthe entire <i>ovector</i> for returning matched strings.\n</P>\n<P>\nNOTE: PCRE's \"auto-possessification\" optimization usually applies to character\nrepeats at the end of a pattern (as well as internally). For example, the\npattern \"a\\d+\" is compiled as if it were \"a\\d++\" because there is no point\neven considering the possibility of backtracking into the repeated digits. For\nDFA matching, this means that only one possible match is found. If you really\ndo want multiple matches in such cases, either use an ungreedy repeat\n(\"a\\d+?\") or set the PCRE_NO_AUTO_POSSESS option when compiling.\n</P>\n<br><b>\nError returns from <b>pcre_dfa_exec()</b>\n</b><br>\n<P>\nThe <b>pcre_dfa_exec()</b> function returns a negative number when it fails.\nMany of the errors are the same as for <b>pcre_exec()</b>, and these are\ndescribed\n<a href=\"#errorlist\">above.</a>\nThere are in addition the following errors that are specific to\n<b>pcre_dfa_exec()</b>:\n<pre>\n  PCRE_ERROR_DFA_UITEM      (-16)\n</pre>\nThis return is given if <b>pcre_dfa_exec()</b> encounters an item in the pattern\nthat it does not support, for instance, the use of \\C or a back reference.\n<pre>\n  PCRE_ERROR_DFA_UCOND      (-17)\n</pre>\nThis return is given if <b>pcre_dfa_exec()</b> encounters a condition item that\nuses a back reference for the condition, or a test for recursion in a specific\ngroup. These are not supported.\n<pre>\n  PCRE_ERROR_DFA_UMLIMIT    (-18)\n</pre>\nThis return is given if <b>pcre_dfa_exec()</b> is called with an <i>extra</i>\nblock that contains a setting of the <i>match_limit</i> or\n<i>match_limit_recursion</i> fields. This is not supported (these fields are\nmeaningless for DFA matching).\n<pre>\n  PCRE_ERROR_DFA_WSSIZE     (-19)\n</pre>\nThis return is given if <b>pcre_dfa_exec()</b> runs out of space in the\n<i>workspace</i> vector.\n<pre>\n  PCRE_ERROR_DFA_RECURSE    (-20)\n</pre>\nWhen a recursive subpattern is processed, the matching function calls itself\nrecursively, using private vectors for <i>ovector</i> and <i>workspace</i>. This\nerror is given if the output vector is not large enough. This should be\nextremely rare, as a vector of size 1000 is used.\n<pre>\n  PCRE_ERROR_DFA_BADRESTART (-30)\n</pre>\nWhen <b>pcre_dfa_exec()</b> is called with the <b>PCRE_DFA_RESTART</b> option,\nsome plausibility checks are made on the contents of the workspace, which\nshould contain data about the previous partial match. If any of these checks\nfail, this error is given.\n</P>\n<br><a name=\"SEC24\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcre16</b>(3), <b>pcre32</b>(3), <b>pcrebuild</b>(3), <b>pcrecallout</b>(3),\n<b>pcrecpp(3)</b>(3), <b>pcrematching</b>(3), <b>pcrepartial</b>(3),\n<b>pcreposix</b>(3), <b>pcreprecompile</b>(3), <b>pcresample</b>(3),\n<b>pcrestack</b>(3).\n</P>\n<br><a name=\"SEC25\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC26\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 18 December 2015\n<br>\nCopyright &copy; 1997-2015 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrebuild.html",
    "content": "<html>\n<head>\n<title>pcrebuild specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrebuild man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">BUILDING PCRE</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">PCRE BUILD-TIME OPTIONS</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">BUILDING SHARED AND STATIC LIBRARIES</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">C++ SUPPORT</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">UTF-8, UTF-16 AND UTF-32 SUPPORT</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">UNICODE CHARACTER PROPERTY SUPPORT</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">JUST-IN-TIME COMPILER SUPPORT</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">CODE VALUE OF NEWLINE</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">WHAT \\R MATCHES</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">POSIX MALLOC USAGE</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">HANDLING VERY LARGE PATTERNS</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">AVOIDING EXCESSIVE STACK USAGE</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">LIMITING PCRE RESOURCE USAGE</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">CREATING CHARACTER TABLES AT BUILD TIME</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">USING EBCDIC CODE</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">PCREGREP BUFFER SIZE</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">DEBUGGING WITH VALGRIND SUPPORT</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">CODE COVERAGE REPORTING</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">SEE ALSO</a>\n<li><a name=\"TOC23\" href=\"#SEC23\">AUTHOR</a>\n<li><a name=\"TOC24\" href=\"#SEC24\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">BUILDING PCRE</a><br>\n<P>\nPCRE is distributed with a <b>configure</b> script that can be used to build the\nlibrary in Unix-like environments using the applications known as Autotools.\nAlso in the distribution are files to support building using <b>CMake</b>\ninstead of <b>configure</b>. The text file\n<a href=\"README.txt\"><b>README</b></a>\ncontains general information about building with Autotools (some of which is\nrepeated below), and also has some comments about building on various operating\nsystems. There is a lot more information about building PCRE without using\nAutotools (including information about using <b>CMake</b> and building \"by\nhand\") in the text file called\n<a href=\"NON-AUTOTOOLS-BUILD.txt\"><b>NON-AUTOTOOLS-BUILD</b>.</a>\nYou should consult this file as well as the\n<a href=\"README.txt\"><b>README</b></a>\nfile if you are building in a non-Unix-like environment.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">PCRE BUILD-TIME OPTIONS</a><br>\n<P>\nThe rest of this document describes the optional features of PCRE that can be\nselected when the library is compiled. It assumes use of the <b>configure</b>\nscript, where the optional features are selected or deselected by providing\noptions to <b>configure</b> before running the <b>make</b> command. However, the\nsame options can be selected in both Unix-like and non-Unix-like environments\nusing the GUI facility of <b>cmake-gui</b> if you are using <b>CMake</b> instead\nof <b>configure</b> to build PCRE.\n</P>\n<P>\nIf you are not using Autotools or <b>CMake</b>, option selection can be done by\nediting the <b>config.h</b> file, or by passing parameter settings to the\ncompiler, as described in\n<a href=\"NON-AUTOTOOLS-BUILD.txt\"><b>NON-AUTOTOOLS-BUILD</b>.</a>\n</P>\n<P>\nThe complete list of options for <b>configure</b> (which includes the standard\nones such as the selection of the installation directory) can be obtained by\nrunning\n<pre>\n  ./configure --help\n</pre>\nThe following sections include descriptions of options whose names begin with\n--enable or --disable. These settings specify changes to the defaults for the\n<b>configure</b> command. Because of the way that <b>configure</b> works,\n--enable and --disable always come in pairs, so the complementary option always\nexists as well, but as it specifies the default, it is not described.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>\n<P>\nBy default, a library called <b>libpcre</b> is built, containing functions that\ntake string arguments contained in vectors of bytes, either as single-byte\ncharacters, or interpreted as UTF-8 strings. You can also build a separate\nlibrary, called <b>libpcre16</b>, in which strings are contained in vectors of\n16-bit data units and interpreted either as single-unit characters or UTF-16\nstrings, by adding\n<pre>\n  --enable-pcre16\n</pre>\nto the <b>configure</b> command. You can also build yet another separate\nlibrary, called <b>libpcre32</b>, in which strings are contained in vectors of\n32-bit data units and interpreted either as single-unit characters or UTF-32\nstrings, by adding\n<pre>\n  --enable-pcre32\n</pre>\nto the <b>configure</b> command. If you do not want the 8-bit library, add\n<pre>\n  --disable-pcre8\n</pre>\nas well. At least one of the three libraries must be built. Note that the C++\nand POSIX wrappers are for the 8-bit library only, and that <b>pcregrep</b> is\nan 8-bit program. None of these are built if you select only the 16-bit or\n32-bit libraries.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">BUILDING SHARED AND STATIC LIBRARIES</a><br>\n<P>\nThe Autotools PCRE building process uses <b>libtool</b> to build both shared and\nstatic libraries by default. You can suppress one of these by adding one of\n<pre>\n  --disable-shared\n  --disable-static\n</pre>\nto the <b>configure</b> command, as required.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">C++ SUPPORT</a><br>\n<P>\nBy default, if the 8-bit library is being built, the <b>configure</b> script\nwill search for a C++ compiler and C++ header files. If it finds them, it\nautomatically builds the C++ wrapper library (which supports only 8-bit\nstrings). You can disable this by adding\n<pre>\n  --disable-cpp\n</pre>\nto the <b>configure</b> command.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">UTF-8, UTF-16 AND UTF-32 SUPPORT</a><br>\n<P>\nTo build PCRE with support for UTF Unicode character strings, add\n<pre>\n  --enable-utf\n</pre>\nto the <b>configure</b> command. This setting applies to all three libraries,\nadding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit\nlibrary, and support for UTF-32 to the to the 32-bit library. There are no\nseparate options for enabling UTF-8, UTF-16 and UTF-32 independently because\nthat would allow ridiculous settings such as requesting UTF-16 support while\nbuilding only the 8-bit library. It is not possible to build one library with\nUTF support and another without in the same configuration. (For backwards\ncompatibility, --enable-utf8 is a synonym of --enable-utf.)\n</P>\n<P>\nOf itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or\nUTF-32. As well as compiling PCRE with this option, you also have have to set\nthe PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call\none of the pattern compiling functions.\n</P>\n<P>\nIf you set --enable-utf when compiling in an EBCDIC environment, PCRE expects\nits input to be either ASCII or UTF-8 (depending on the run-time option). It is\nnot possible to support both EBCDIC and UTF-8 codes in the same version of the\nlibrary. Consequently, --enable-utf and --enable-ebcdic are mutually\nexclusive.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">UNICODE CHARACTER PROPERTY SUPPORT</a><br>\n<P>\nUTF support allows the libraries to process character codepoints up to 0x10ffff\nin the strings that they handle. On its own, however, it does not provide any\nfacilities for accessing the properties of such characters. If you want to be\nable to use the pattern escapes \\P, \\p, and \\X, which refer to Unicode\ncharacter properties, you must add\n<pre>\n  --enable-unicode-properties\n</pre>\nto the <b>configure</b> command. This implies UTF support, even if you have\nnot explicitly requested it.\n</P>\n<P>\nIncluding Unicode property support adds around 30K of tables to the PCRE\nlibrary. Only the general category properties such as <i>Lu</i> and <i>Nd</i> are\nsupported. Details are given in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">JUST-IN-TIME COMPILER SUPPORT</a><br>\n<P>\nJust-in-time compiler support is included in the build by specifying\n<pre>\n  --enable-jit\n</pre>\nThis support is available only for certain hardware architectures. If this\noption is set for an unsupported architecture, a compile time error occurs.\nSee the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for a discussion of JIT usage. When JIT support is enabled,\npcregrep automatically makes use of it, unless you add\n<pre>\n  --disable-pcregrep-jit\n</pre>\nto the \"configure\" command.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">CODE VALUE OF NEWLINE</a><br>\n<P>\nBy default, PCRE interprets the linefeed (LF) character as indicating the end\nof a line. This is the normal newline character on Unix-like systems. You can\ncompile PCRE to use carriage return (CR) instead, by adding\n<pre>\n  --enable-newline-is-cr\n</pre>\nto the <b>configure</b> command. There is also a --enable-newline-is-lf option,\nwhich explicitly specifies linefeed as the newline character.\n<br>\n<br>\nAlternatively, you can specify that line endings are to be indicated by the two\ncharacter sequence CRLF. If you want this, add\n<pre>\n  --enable-newline-is-crlf\n</pre>\nto the <b>configure</b> command. There is a fourth option, specified by\n<pre>\n  --enable-newline-is-anycrlf\n</pre>\nwhich causes PCRE to recognize any of the three sequences CR, LF, or CRLF as\nindicating a line ending. Finally, a fifth option, specified by\n<pre>\n  --enable-newline-is-any\n</pre>\ncauses PCRE to recognize any Unicode newline sequence.\n</P>\n<P>\nWhatever line ending convention is selected when PCRE is built can be\noverridden when the library functions are called. At build time it is\nconventional to use the standard for your operating system.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">WHAT \\R MATCHES</a><br>\n<P>\nBy default, the sequence \\R in a pattern matches any Unicode newline sequence,\nwhatever has been selected as the line ending sequence. If you specify\n<pre>\n  --enable-bsr-anycrlf\n</pre>\nthe default is changed so that \\R matches only CR, LF, or CRLF. Whatever is\nselected when PCRE is built can be overridden when the library functions are\ncalled.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">POSIX MALLOC USAGE</a><br>\n<P>\nWhen the 8-bit library is called through the POSIX interface (see the\n<a href=\"pcreposix.html\"><b>pcreposix</b></a>\ndocumentation), additional working storage is required for holding the pointers\nto capturing substrings, because PCRE requires three integers per substring,\nwhereas the POSIX interface provides only two. If the number of expected\nsubstrings is small, the wrapper function uses space on the stack, because this\nis faster than using <b>malloc()</b> for each call. The default threshold above\nwhich the stack is no longer used is 10; it can be changed by adding a setting\nsuch as\n<pre>\n  --with-posix-malloc-threshold=20\n</pre>\nto the <b>configure</b> command.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">HANDLING VERY LARGE PATTERNS</a><br>\n<P>\nWithin a compiled pattern, offset values are used to point from one part to\nanother (for example, from an opening parenthesis to an alternation\nmetacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values\nare used for these offsets, leading to a maximum size for a compiled pattern of\naround 64K. This is sufficient to handle all but the most gigantic patterns.\nNevertheless, some people do want to process truly enormous patterns, so it is\npossible to compile PCRE to use three-byte or four-byte offsets by adding a\nsetting such as\n<pre>\n  --with-link-size=3\n</pre>\nto the <b>configure</b> command. The value given must be 2, 3, or 4. For the\n16-bit library, a value of 3 is rounded up to 4. In these libraries, using\nlonger offsets slows down the operation of PCRE because it has to load\nadditional data when handling them. For the 32-bit library the value is always\n4 and cannot be overridden; the value of --with-link-size is ignored.\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">AVOIDING EXCESSIVE STACK USAGE</a><br>\n<P>\nWhen matching with the <b>pcre_exec()</b> function, PCRE implements backtracking\nby making recursive calls to an internal function called <b>match()</b>. In\nenvironments where the size of the stack is limited, this can severely limit\nPCRE's operation. (The Unix environment does not usually suffer from this\nproblem, but it may sometimes be necessary to increase the maximum stack size.\nThere is a discussion in the\n<a href=\"pcrestack.html\"><b>pcrestack</b></a>\ndocumentation.) An alternative approach to recursion that uses memory from the\nheap to remember data, instead of using recursive function calls, has been\nimplemented to work round the problem of limited stack size. If you want to\nbuild a version of PCRE that works this way, add\n<pre>\n  --disable-stack-for-recursion\n</pre>\nto the <b>configure</b> command. With this configuration, PCRE will use the\n<b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> variables to call memory\nmanagement functions. By default these point to <b>malloc()</b> and\n<b>free()</b>, but you can replace the pointers so that your own functions are\nused instead.\n</P>\n<P>\nSeparate functions are provided rather than using <b>pcre_malloc</b> and\n<b>pcre_free</b> because the usage is very predictable: the block sizes\nrequested are always the same, and the blocks are always freed in reverse\norder. A calling program might be able to implement optimized functions that\nperform better than <b>malloc()</b> and <b>free()</b>. PCRE runs noticeably more\nslowly when built in this way. This option affects only the <b>pcre_exec()</b>\nfunction; it is not relevant for <b>pcre_dfa_exec()</b>.\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">LIMITING PCRE RESOURCE USAGE</a><br>\n<P>\nInternally, PCRE has a function called <b>match()</b>, which it calls repeatedly\n(sometimes recursively) when matching a pattern with the <b>pcre_exec()</b>\nfunction. By controlling the maximum number of times this function may be\ncalled during a single matching operation, a limit can be placed on the\nresources used by a single call to <b>pcre_exec()</b>. The limit can be changed\nat run time, as described in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation. The default is 10 million, but this can be changed by adding a\nsetting such as\n<pre>\n  --with-match-limit=500000\n</pre>\nto the <b>configure</b> command. This setting has no effect on the\n<b>pcre_dfa_exec()</b> matching function.\n</P>\n<P>\nIn some environments it is desirable to limit the depth of recursive calls of\n<b>match()</b> more strictly than the total number of calls, in order to\nrestrict the maximum amount of stack (or heap, if --disable-stack-for-recursion\nis specified) that is used. A second limit controls this; it defaults to the\nvalue that is set for --with-match-limit, which imposes no additional\nconstraints. However, you can set a lower limit by adding, for example,\n<pre>\n  --with-match-limit-recursion=10000\n</pre>\nto the <b>configure</b> command. This value can also be overridden at run time.\n</P>\n<br><a name=\"SEC15\" href=\"#TOC1\">CREATING CHARACTER TABLES AT BUILD TIME</a><br>\n<P>\nPCRE uses fixed tables for processing characters whose code values are less\nthan 256. By default, PCRE is built with a set of tables that are distributed\nin the file <i>pcre_chartables.c.dist</i>. These tables are for ASCII codes\nonly. If you add\n<pre>\n  --enable-rebuild-chartables\n</pre>\nto the <b>configure</b> command, the distributed tables are no longer used.\nInstead, a program called <b>dftables</b> is compiled and run. This outputs the\nsource for new set of tables, created in the default locale of your C run-time\nsystem. (This method of replacing the tables does not work if you are cross\ncompiling, because <b>dftables</b> is run on the local host. If you need to\ncreate alternative tables when cross compiling, you will have to do so \"by\nhand\".)\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">USING EBCDIC CODE</a><br>\n<P>\nPCRE assumes by default that it will run in an environment where the character\ncode is ASCII (or Unicode, which is a superset of ASCII). This is the case for\nmost computer operating systems. PCRE can, however, be compiled to run in an\nEBCDIC environment by adding\n<pre>\n  --enable-ebcdic\n</pre>\nto the <b>configure</b> command. This setting implies\n--enable-rebuild-chartables. You should only use it if you know that you are in\nan EBCDIC environment (for example, an IBM mainframe operating system). The\n--enable-ebcdic option is incompatible with --enable-utf.\n</P>\n<P>\nThe EBCDIC character that corresponds to an ASCII LF is assumed to have the\nvalue 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In\nsuch an environment you should use\n<pre>\n  --enable-ebcdic-nl25\n</pre>\nas well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the\nsame value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is <i>not</i>\nchosen as LF is made to correspond to the Unicode NEL character (which, in\nUnicode, is 0x85).\n</P>\n<P>\nThe options that select newline behaviour, such as --enable-newline-is-cr,\nand equivalent run-time options, refer to these character values in an EBCDIC\nenvironment.\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a><br>\n<P>\nBy default, <b>pcregrep</b> reads all files as plain text. You can build it so\nthat it recognizes files whose names end in <b>.gz</b> or <b>.bz2</b>, and reads\nthem with <b>libz</b> or <b>libbz2</b>, respectively, by adding one or both of\n<pre>\n  --enable-pcregrep-libz\n  --enable-pcregrep-libbz2\n</pre>\nto the <b>configure</b> command. These options naturally require that the\nrelevant libraries are installed on your system. Configuration will fail if\nthey are not.\n</P>\n<br><a name=\"SEC18\" href=\"#TOC1\">PCREGREP BUFFER SIZE</a><br>\n<P>\n<b>pcregrep</b> uses an internal buffer to hold a \"window\" on the file it is\nscanning, in order to be able to output \"before\" and \"after\" lines when it\nfinds a match. The size of the buffer is controlled by a parameter whose\ndefault value is 20K. The buffer itself is three times this size, but because\nof the way it is used for holding \"before\" lines, the longest line that is\nguaranteed to be processable is the parameter size. You can change the default\nparameter value by adding, for example,\n<pre>\n  --with-pcregrep-bufsize=50K\n</pre>\nto the <b>configure</b> command. The caller of \\fPpcregrep\\fP can, however,\noverride this value by specifying a run-time option.\n</P>\n<br><a name=\"SEC19\" href=\"#TOC1\">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a><br>\n<P>\nIf you add\n<pre>\n  --enable-pcretest-libreadline\n</pre>\nto the <b>configure</b> command, <b>pcretest</b> is linked with the\n<b>libreadline</b> library, and when its input is from a terminal, it reads it\nusing the <b>readline()</b> function. This provides line-editing and history\nfacilities. Note that <b>libreadline</b> is GPL-licensed, so if you distribute a\nbinary of <b>pcretest</b> linked in this way, there may be licensing issues.\n</P>\n<P>\nSetting this option causes the <b>-lreadline</b> option to be added to the\n<b>pcretest</b> build. In many operating environments with a sytem-installed\n<b>libreadline</b> this is sufficient. However, in some environments (e.g.\nif an unmodified distribution version of readline is in use), some extra\nconfiguration may be necessary. The INSTALL file for <b>libreadline</b> says\nthis:\n<pre>\n  \"Readline uses the termcap functions, but does not link with the\n  termcap or curses library itself, allowing applications which link\n  with readline the to choose an appropriate library.\"\n</pre>\nIf your environment has not been set up so that an appropriate library is\nautomatically included, you may need to add something like\n<pre>\n  LIBS=\"-ncurses\"\n</pre>\nimmediately before the <b>configure</b> command.\n</P>\n<br><a name=\"SEC20\" href=\"#TOC1\">DEBUGGING WITH VALGRIND SUPPORT</a><br>\n<P>\nBy adding the\n<pre>\n  --enable-valgrind\n</pre>\noption to to the <b>configure</b> command, PCRE will use valgrind annotations\nto mark certain memory regions as unaddressable. This allows it to detect\ninvalid memory accesses, and is mostly useful for debugging PCRE itself.\n</P>\n<br><a name=\"SEC21\" href=\"#TOC1\">CODE COVERAGE REPORTING</a><br>\n<P>\nIf your C compiler is gcc, you can build a version of PCRE that can generate a\ncode coverage report for its test suite. To enable this, you must install\n<b>lcov</b> version 1.6 or above. Then specify\n<pre>\n  --enable-coverage\n</pre>\nto the <b>configure</b> command and build PCRE in the usual way.\n</P>\n<P>\nNote that using <b>ccache</b> (a caching C compiler) is incompatible with code\ncoverage reporting. If you have configured <b>ccache</b> to run automatically\non your system, you must set the environment variable\n<pre>\n  CCACHE_DISABLE=1\n</pre>\nbefore running <b>make</b> to build PCRE, so that <b>ccache</b> is not used.\n</P>\n<P>\nWhen --enable-coverage is used, the following addition targets are added to the\n<i>Makefile</i>:\n<pre>\n  make coverage\n</pre>\nThis creates a fresh coverage report for the PCRE test suite. It is equivalent\nto running \"make coverage-reset\", \"make coverage-baseline\", \"make check\", and\nthen \"make coverage-report\".\n<pre>\n  make coverage-reset\n</pre>\nThis zeroes the coverage counters, but does nothing else.\n<pre>\n  make coverage-baseline\n</pre>\nThis captures baseline coverage information.\n<pre>\n  make coverage-report\n</pre>\nThis creates the coverage report.\n<pre>\n  make coverage-clean-report\n</pre>\nThis removes the generated coverage report without cleaning the coverage data\nitself.\n<pre>\n  make coverage-clean-data\n</pre>\nThis removes the captured coverage data without removing the coverage files\ncreated at compile time (*.gcno).\n<pre>\n  make coverage-clean\n</pre>\nThis cleans all coverage data including the generated coverage report. For more\ninformation about code coverage, see the <b>gcov</b> and <b>lcov</b>\ndocumentation.\n</P>\n<br><a name=\"SEC22\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcreapi</b>(3), <b>pcre16</b>, <b>pcre32</b>, <b>pcre_config</b>(3).\n</P>\n<br><a name=\"SEC23\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC24\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 May 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrecallout.html",
    "content": "<html>\n<head>\n<title>pcrecallout specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrecallout man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">DESCRIPTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">MISSING CALLOUTS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">THE CALLOUT INTERFACE</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">RETURN VALUES</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">AUTHOR</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS</a><br>\n<P>\n<b>#include &#60;pcre.h&#62;</b>\n</P>\n<P>\n<b>int (*pcre_callout)(pcre_callout_block *);</b>\n</P>\n<P>\n<b>int (*pcre16_callout)(pcre16_callout_block *);</b>\n</P>\n<P>\n<b>int (*pcre32_callout)(pcre32_callout_block *);</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\nPCRE provides a feature called \"callout\", which is a means of temporarily\npassing control to the caller of PCRE in the middle of pattern matching. The\ncaller of PCRE provides an external function by putting its entry point in the\nglobal variable <i>pcre_callout</i> (<i>pcre16_callout</i> for the 16-bit\nlibrary, <i>pcre32_callout</i> for the 32-bit library). By default, this\nvariable contains NULL, which disables all calling out.\n</P>\n<P>\nWithin a regular expression, (?C) indicates the points at which the external\nfunction is to be called. Different callout points can be identified by putting\na number less than 256 after the letter C. The default value is zero.\nFor example, this pattern has two callout points:\n<pre>\n  (?C1)abc(?C2)def\n</pre>\nIf the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE\nautomatically inserts callouts, all with number 255, before each item in the\npattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern\n<pre>\n  A(\\d{2}|--)\n</pre>\nit is processed as if it were\n<br>\n<br>\n(?C255)A(?C255)((?C255)\\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)\n<br>\n<br>\nNotice that there is a callout before and after each parenthesis and\nalternation bar. If the pattern contains a conditional group whose condition is\nan assertion, an automatic callout is inserted immediately before the\ncondition. Such a callout may also be inserted explicitly, for example:\n<pre>\n  (?(?C9)(?=a)ab|de)\n</pre>\nThis applies only to assertion conditions (because they are themselves\nindependent groups).\n</P>\n<P>\nAutomatic callouts can be used for tracking the progress of pattern matching.\nThe\n<a href=\"pcretest.html\"><b>pcretest</b></a>\nprogram has a pattern qualifier (/C) that sets automatic callouts; when it is\nused, the output indicates how the pattern is being matched. This is useful\ninformation when you are trying to optimize the performance of a particular\npattern.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">MISSING CALLOUTS</a><br>\n<P>\nYou should be aware that, because of optimizations in the way PCRE compiles and\nmatches patterns, callouts sometimes do not happen exactly as you might expect.\n</P>\n<P>\nAt compile time, PCRE \"auto-possessifies\" repeated items when it knows that\nwhat follows cannot be part of the repeat. For example, a+[bc] is compiled as\nif it were a++[bc]. The <b>pcretest</b> output when this pattern is anchored and\nthen applied with automatic callouts to the string \"aaaa\" is:\n<pre>\n  ---&#62;aaaa\n   +0 ^        ^\n   +1 ^        a+\n   +3 ^   ^    [bc]\n  No match\n</pre>\nThis indicates that when matching [bc] fails, there is no backtracking into a+\nand therefore the callouts that would be taken for the backtracks do not occur.\nYou can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS\nto <b>pcre_compile()</b>, or starting the pattern with (*NO_AUTO_POSSESS). If\nthis is done in <b>pcretest</b> (using the /O qualifier), the output changes to\nthis:\n<pre>\n  ---&#62;aaaa\n   +0 ^        ^\n   +1 ^        a+\n   +3 ^   ^    [bc]\n   +3 ^  ^     [bc]\n   +3 ^ ^      [bc]\n   +3 ^^       [bc]\n  No match\n</pre>\nThis time, when matching [bc] fails, the matcher backtracks into a+ and tries\nagain, repeatedly, until a+ itself fails.\n</P>\n<P>\nOther optimizations that provide fast \"no match\" results also affect callouts.\nFor example, if the pattern is\n<pre>\n  ab(?C4)cd\n</pre>\nPCRE knows that any matching string must contain the letter \"d\". If the subject\nstring is \"abyz\", the lack of \"d\" means that matching doesn't ever start, and\nthe callout is never reached. However, with \"abyd\", though the result is still\nno match, the callout is obeyed.\n</P>\n<P>\nIf the pattern is studied, PCRE knows the minimum length of a matching string,\nand will immediately give a \"no match\" return without actually running a match\nif the subject is not long enough, or, for unanchored patterns, if it has\nbeen scanned far enough.\n</P>\n<P>\nYou can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE\noption to the matching function, or by starting the pattern with\n(*NO_START_OPT). This slows down the matching process, but does ensure that\ncallouts such as the example above are obeyed.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">THE CALLOUT INTERFACE</a><br>\n<P>\nDuring matching, when PCRE reaches a callout point, the external function\ndefined by <i>pcre_callout</i> or <i>pcre[16|32]_callout</i> is called (if it is\nset). This applies to both normal and DFA matching. The only argument to the\ncallout function is a pointer to a <b>pcre_callout</b> or\n<b>pcre[16|32]_callout</b> block. These structures contains the following\nfields:\n<pre>\n  int           <i>version</i>;\n  int           <i>callout_number</i>;\n  int          *<i>offset_vector</i>;\n  const char   *<i>subject</i>;           (8-bit version)\n  PCRE_SPTR16   <i>subject</i>;           (16-bit version)\n  PCRE_SPTR32   <i>subject</i>;           (32-bit version)\n  int           <i>subject_length</i>;\n  int           <i>start_match</i>;\n  int           <i>current_position</i>;\n  int           <i>capture_top</i>;\n  int           <i>capture_last</i>;\n  void         *<i>callout_data</i>;\n  int           <i>pattern_position</i>;\n  int           <i>next_item_length</i>;\n  const unsigned char *<i>mark</i>;       (8-bit version)\n  const PCRE_UCHAR16  *<i>mark</i>;       (16-bit version)\n  const PCRE_UCHAR32  *<i>mark</i>;       (32-bit version)\n</pre>\nThe <i>version</i> field is an integer containing the version number of the\nblock format. The initial version was 0; the current version is 2. The version\nnumber will change again in future if additional fields are added, but the\nintention is never to remove any of the existing fields.\n</P>\n<P>\nThe <i>callout_number</i> field contains the number of the callout, as compiled\ninto the pattern (that is, the number after ?C for manual callouts, and 255 for\nautomatically generated callouts).\n</P>\n<P>\nThe <i>offset_vector</i> field is a pointer to the vector of offsets that was\npassed by the caller to the matching function. When <b>pcre_exec()</b> or\n<b>pcre[16|32]_exec()</b> is used, the contents can be inspected, in order to\nextract substrings that have been matched so far, in the same way as for\nextracting substrings after a match has completed. For the DFA matching\nfunctions, this field is not useful.\n</P>\n<P>\nThe <i>subject</i> and <i>subject_length</i> fields contain copies of the values\nthat were passed to the matching function.\n</P>\n<P>\nThe <i>start_match</i> field normally contains the offset within the subject at\nwhich the current match attempt started. However, if the escape sequence \\K\nhas been encountered, this value is changed to reflect the modified starting\npoint. If the pattern is not anchored, the callout function may be called\nseveral times from the same point in the pattern for different starting points\nin the subject.\n</P>\n<P>\nThe <i>current_position</i> field contains the offset within the subject of the\ncurrent match pointer.\n</P>\n<P>\nWhen the <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> is used, the\n<i>capture_top</i> field contains one more than the number of the highest\nnumbered captured substring so far. If no substrings have been captured, the\nvalue of <i>capture_top</i> is one. This is always the case when the DFA\nfunctions are used, because they do not support captured substrings.\n</P>\n<P>\nThe <i>capture_last</i> field contains the number of the most recently captured\nsubstring. However, when a recursion exits, the value reverts to what it was\noutside the recursion, as do the values of all captured substrings. If no\nsubstrings have been captured, the value of <i>capture_last</i> is -1. This is\nalways the case for the DFA matching functions.\n</P>\n<P>\nThe <i>callout_data</i> field contains a value that is passed to a matching\nfunction specifically so that it can be passed back in callouts. It is passed\nin the <i>callout_data</i> field of a <b>pcre_extra</b> or <b>pcre[16|32]_extra</b>\ndata structure. If no such data was passed, the value of <i>callout_data</i> in\na callout block is NULL. There is a description of the <b>pcre_extra</b>\nstructure in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<P>\nThe <i>pattern_position</i> field is present from version 1 of the callout\nstructure. It contains the offset to the next item to be matched in the pattern\nstring.\n</P>\n<P>\nThe <i>next_item_length</i> field is present from version 1 of the callout\nstructure. It contains the length of the next item to be matched in the pattern\nstring. When the callout immediately precedes an alternation bar, a closing\nparenthesis, or the end of the pattern, the length is zero. When the callout\nprecedes an opening parenthesis, the length is that of the entire subpattern.\n</P>\n<P>\nThe <i>pattern_position</i> and <i>next_item_length</i> fields are intended to\nhelp in distinguishing between different automatic callouts, which all have the\nsame callout number. However, they are set for all callouts.\n</P>\n<P>\nThe <i>mark</i> field is present from version 2 of the callout structure. In\ncallouts from <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> it contains a\npointer to the zero-terminated name of the most recently passed (*MARK),\n(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been\npassed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a\nprevious (*MARK). In callouts from the DFA matching functions this field always\ncontains NULL.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">RETURN VALUES</a><br>\n<P>\nThe external callout function returns an integer to PCRE. If the value is zero,\nmatching proceeds as normal. If the value is greater than zero, matching fails\nat the current point, but the testing of other matching possibilities goes\nahead, just as if a lookahead assertion had failed. If the value is less than\nzero, the match is abandoned, the matching function returns the negative value.\n</P>\n<P>\nNegative values should normally be chosen from the set of PCRE_ERROR_xxx\nvalues. In particular, PCRE_ERROR_NOMATCH forces a standard \"no match\" failure.\nThe error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;\nit will never be used by PCRE itself.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 November 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrecompat.html",
    "content": "<html>\n<head>\n<title>pcrecompat specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrecompat man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nDIFFERENCES BETWEEN PCRE AND PERL\n</b><br>\n<P>\nThis document describes the differences in the ways that PCRE and Perl handle\nregular expressions. The differences described here are with respect to Perl\nversions 5.10 and above.\n</P>\n<P>\n1. PCRE has only a subset of Perl's Unicode support. Details of what it does\nhave are given in the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage.\n</P>\n<P>\n2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do\nnot mean what you might think. For example, (?!a){3} does not assert that the\nnext three characters are not \"a\". It just asserts that the next character is\nnot \"a\" three times (in principle: PCRE optimizes this to run the assertion\njust once). Perl allows repeat quantifiers on other assertions such as \\b, but\nthese do not seem to have any use.\n</P>\n<P>\n3. Capturing subpatterns that occur inside negative lookahead assertions are\ncounted, but their entries in the offsets vector are never set. Perl sometimes\n(but not always) sets its numerical variables from inside negative assertions.\n</P>\n<P>\n4. Though binary zero characters are supported in the subject string, they are\nnot allowed in a pattern string because it is passed as a normal C string,\nterminated by zero. The escape sequence \\0 can be used in the pattern to\nrepresent a binary zero.\n</P>\n<P>\n5. The following Perl escape sequences are not supported: \\l, \\u, \\L,\n\\U, and \\N when followed by a character name or Unicode value. (\\N on its\nown, matching a non-newline character, is supported.) In fact these are\nimplemented by Perl's general string-handling and are not part of its pattern\nmatching engine. If any of these are encountered by PCRE, an error is\ngenerated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set,\n\\U and \\u are interpreted as JavaScript interprets them.\n</P>\n<P>\n6. The Perl escape sequences \\p, \\P, and \\X are supported only if PCRE is\nbuilt with Unicode character property support. The properties that can be\ntested with \\p and \\P are limited to the general category properties such as\nLu and Nd, script names such as Greek or Han, and the derived properties Any\nand L&. PCRE does support the Cs (surrogate) property, which Perl does not; the\nPerl documentation says \"Because Perl hides the need for the user to understand\nthe internal representation of Unicode characters, there is no need to\nimplement the somewhat messy concept of surrogates.\"\n</P>\n<P>\n7. PCRE does support the \\Q...\\E escape for quoting substrings. Characters in\nbetween are treated as literals. This is slightly different from Perl in that $\nand @ are also handled as literals inside the quotes. In Perl, they cause\nvariable interpolation (but of course PCRE does not have variables). Note the\nfollowing examples:\n<pre>\n    Pattern            PCRE matches      Perl matches\n\n    \\Qabc$xyz\\E        abc$xyz           abc followed by the contents of $xyz\n    \\Qabc\\$xyz\\E       abc\\$xyz          abc\\$xyz\n    \\Qabc\\E\\$\\Qxyz\\E   abc$xyz           abc$xyz\n</pre>\nThe \\Q...\\E sequence is recognized both inside and outside character classes.\n</P>\n<P>\n8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})\nconstructions. However, there is support for recursive patterns. This is not\navailable in Perl 5.8, but it is in Perl 5.10. Also, the PCRE \"callout\"\nfeature allows an external function to be called during pattern matching. See\nthe\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation for details.\n</P>\n<P>\n9. Subpatterns that are called as subroutines (whether or not recursively) are\nalways treated as atomic groups in PCRE. This is like Python, but unlike Perl.\nCaptured values that are set outside a subroutine call can be reference from\ninside in PCRE, but not in Perl. There is a discussion that explains these\ndifferences in more detail in the\n<a href=\"pcrepattern.html#recursiondifference\">section on recursion differences from Perl</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\npage.\n</P>\n<P>\n10. If any of the backtracking control verbs are used in a subpattern that is\ncalled as a subroutine (whether or not recursively), their effect is confined\nto that subpattern; it does not extend to the surrounding pattern. This is not\nalways the case in Perl. In particular, if (*THEN) is present in a group that\nis called as a subroutine, its action is limited to that group, even if the\ngroup does not contain any | characters. Note that such subpatterns are\nprocessed as anchored at the point where they are tested.\n</P>\n<P>\n11. If a pattern contains more than one backtracking control verb, the first\none that is backtracked onto acts. For example, in the pattern\nA(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C\ntriggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the\nsame as PCRE, but there are examples where it differs.\n</P>\n<P>\n12. Most backtracking verbs in assertions have their normal actions. They are\nnot confined to the assertion.\n</P>\n<P>\n13. There are some differences that are concerned with the settings of captured\nstrings when part of a pattern is repeated. For example, matching \"aba\" against\nthe pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to \"b\".\n</P>\n<P>\n14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern\nnames is not as general as Perl's. This is a consequence of the fact the PCRE\nworks internally just with numbers, using an external table to translate\nbetween numbers and names. In particular, a pattern such as (?|(?&#60;a&#62;A)|(?&#60;b&#62;B),\nwhere the two capturing parentheses have the same number but different names,\nis not supported, and causes an error at compile time. If it were allowed, it\nwould not be possible to distinguish which parentheses matched, because both\nnames map to capturing subpattern number 1. To avoid this confusing situation,\nan error is given at compile time.\n</P>\n<P>\n15. Perl recognizes comments in some places that PCRE does not, for example,\nbetween the ( and ? at the start of a subpattern. If the /x modifier is set,\nPerl allows white space between ( and ? (though current Perls warn that this is\ndeprecated) but PCRE never does, even if the PCRE_EXTENDED option is set.\n</P>\n<P>\n16. Perl, when in warning mode, gives warnings for character classes such as\n[A-\\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no\nwarning features, so it gives an error in these cases because they are almost\ncertainly user mistakes.\n</P>\n<P>\n17. In PCRE, the upper/lower case character properties Lu and Ll are not\naffected when case-independent matching is specified. For example, \\p{Lu}\nalways matches an upper case letter. I think Perl has changed in this respect;\nin the release at the time of writing (5.16), \\p{Lu} and \\p{Ll} match all\nletters, regardless of case, when case independence is specified.\n</P>\n<P>\n18. PCRE provides some extensions to the Perl regular expression facilities.\nPerl 5.10 includes new features that are not in earlier versions of Perl, some\nof which (such as named parentheses) have been in PCRE for some time. This list\nis with respect to Perl 5.10:\n<br>\n<br>\n(a) Although lookbehind assertions in PCRE must match fixed length strings,\neach alternative branch of a lookbehind assertion can match a different length\nof string. Perl requires them all to have the same length.\n<br>\n<br>\n(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $\nmeta-character matches only at the very end of the string.\n<br>\n<br>\n(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\nmeaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.\n(Perl can be made to issue a warning.)\n<br>\n<br>\n(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\ninverted, that is, by default they are not greedy, but if followed by a\nquestion mark they are.\n<br>\n<br>\n(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried\nonly at the first matching position in the subject string.\n<br>\n<br>\n(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and\nPCRE_NO_AUTO_CAPTURE options for <b>pcre_exec()</b> have no Perl equivalents.\n<br>\n<br>\n(g) The \\R escape sequence can be restricted to match only CR, LF, or CRLF\nby the PCRE_BSR_ANYCRLF option.\n<br>\n<br>\n(h) The callout facility is PCRE-specific.\n<br>\n<br>\n(i) The partial matching facility is PCRE-specific.\n<br>\n<br>\n(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on\ndifferent hosts that have the other endianness. However, this does not apply to\noptimized data created by the just-in-time compiler.\n<br>\n<br>\n(k) The alternative matching functions (<b>pcre_dfa_exec()</b>,\n<b>pcre16_dfa_exec()</b> and <b>pcre32_dfa_exec()</b>,) match in a different way\nand are not Perl-compatible.\n<br>\n<br>\n(l) PCRE recognizes some special sequences such as (*CR) at the start of\na pattern that set overall options that cannot be changed within the pattern.\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 10 November 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrecpp.html",
    "content": "<html>\n<head>\n<title>pcrecpp specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrecpp man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS OF C++ WRAPPER</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">DESCRIPTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">MATCHING INTERFACE</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">QUOTING METACHARACTERS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">PARTIAL MATCHES</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">UTF-8 AND THE MATCHING INTERFACE</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">SCANNING TEXT INCREMENTALLY</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">PARSING HEX/OCTAL/C-RADIX NUMBERS</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">REPLACING PARTS OF STRINGS</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">AUTHOR</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS OF C++ WRAPPER</a><br>\n<P>\n<b>#include &#60;pcrecpp.h&#62;</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\nThe C++ wrapper for PCRE was provided by Google Inc. Some additional\nfunctionality was added by Giuseppe Maxia. This brief man page was constructed\nfrom the notes in the <i>pcrecpp.h</i> file, which should be consulted for\nfurther details. Note that the C++ wrapper supports only the original 8-bit\nPCRE library. There is no 16-bit or 32-bit support at present.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">MATCHING INTERFACE</a><br>\n<P>\nThe \"FullMatch\" operation checks that supplied text matches a supplied pattern\nexactly. If pointer arguments are supplied, it copies matched sub-strings that\nmatch sub-patterns into them.\n<pre>\n  Example: successful match\n     pcrecpp::RE re(\"h.*o\");\n     re.FullMatch(\"hello\");\n\n  Example: unsuccessful match (requires full match):\n     pcrecpp::RE re(\"e\");\n     !re.FullMatch(\"hello\");\n\n  Example: creating a temporary RE object:\n     pcrecpp::RE(\"h.*o\").FullMatch(\"hello\");\n</pre>\nYou can pass in a \"const char*\" or a \"string\" for \"text\". The examples below\ntend to use a const char*. You can, as in the different examples above, store\nthe RE object explicitly in a variable or use a temporary RE object. The\nexamples below use one mode or the other arbitrarily. Either could correctly be\nused for any of these examples.\n</P>\n<P>\nYou must supply extra pointer arguments to extract matched subpieces.\n<pre>\n  Example: extracts \"ruby\" into \"s\" and 1234 into \"i\"\n     int i;\n     string s;\n     pcrecpp::RE re(\"(\\\\w+):(\\\\d+)\");\n     re.FullMatch(\"ruby:1234\", &s, &i);\n\n  Example: does not try to extract any extra sub-patterns\n     re.FullMatch(\"ruby:1234\", &s);\n\n  Example: does not try to extract into NULL\n     re.FullMatch(\"ruby:1234\", NULL, &i);\n\n  Example: integer overflow causes failure\n     !re.FullMatch(\"ruby:1234567891234\", NULL, &i);\n\n  Example: fails because there aren't enough sub-patterns:\n     !pcrecpp::RE(\"\\\\w+:\\\\d+\").FullMatch(\"ruby:1234\", &s);\n\n  Example: fails because string cannot be stored in integer\n     !pcrecpp::RE(\"(.*)\").FullMatch(\"ruby\", &i);\n</pre>\nThe provided pointer arguments can be pointers to any scalar numeric\ntype, or one of:\n<pre>\n   string        (matched piece is copied to string)\n   StringPiece   (StringPiece is mutated to point to matched piece)\n   T             (where \"bool T::ParseFrom(const char*, int)\" exists)\n   NULL          (the corresponding matched sub-pattern is not copied)\n</pre>\nThe function returns true iff all of the following conditions are satisfied:\n<pre>\n  a. \"text\" matches \"pattern\" exactly;\n\n  b. The number of matched sub-patterns is &#62;= number of supplied\n     pointers;\n\n  c. The \"i\"th argument has a suitable type for holding the\n     string captured as the \"i\"th sub-pattern. If you pass in\n     void * NULL for the \"i\"th argument, or a non-void * NULL\n     of the correct type, or pass fewer arguments than the\n     number of sub-patterns, \"i\"th captured sub-pattern is\n     ignored.\n</pre>\nCAVEAT: An optional sub-pattern that does not exist in the matched\nstring is assigned the empty string. Therefore, the following will\nreturn false (because the empty string is not a valid number):\n<pre>\n   int number;\n   pcrecpp::RE::FullMatch(\"abc\", \"[a-z]+(\\\\d+)?\", &number);\n</pre>\nThe matching interface supports at most 16 arguments per call.\nIf you need more, consider using the more general interface\n<b>pcrecpp::RE::DoMatch</b>. See <b>pcrecpp.h</b> for the signature for\n<b>DoMatch</b>.\n</P>\n<P>\nNOTE: Do not use <b>no_arg</b>, which is used internally to mark the end of a\nlist of optional arguments, as a placeholder for missing arguments, as this can\nlead to segfaults.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">QUOTING METACHARACTERS</a><br>\n<P>\nYou can use the \"QuoteMeta\" operation to insert backslashes before all\npotentially meaningful characters in a string. The returned string, used as a\nregular expression, will exactly match the original string.\n<pre>\n  Example:\n     string quoted = RE::QuoteMeta(unquoted);\n</pre>\nNote that it's legal to escape a character even if it has no special meaning in\na regular expression -- so this function does that. (This also makes it\nidentical to the perl function of the same name; see \"perldoc -f quotemeta\".)\nFor example, \"1.5-2.0?\" becomes \"1\\.5\\-2\\.0\\?\".\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">PARTIAL MATCHES</a><br>\n<P>\nYou can use the \"PartialMatch\" operation when you want the pattern\nto match any substring of the text.\n<pre>\n  Example: simple search for a string:\n     pcrecpp::RE(\"ell\").PartialMatch(\"hello\");\n\n  Example: find first number in a string:\n     int number;\n     pcrecpp::RE re(\"(\\\\d+)\");\n     re.PartialMatch(\"x*100 + 20\", &number);\n     assert(number == 100);\n</PRE>\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">UTF-8 AND THE MATCHING INTERFACE</a><br>\n<P>\nBy default, pattern and text are plain text, one byte per character. The UTF8\nflag, passed to the constructor, causes both pattern and string to be treated\nas UTF-8 text, still a byte stream but potentially multiple bytes per\ncharacter. In practice, the text is likelier to be UTF-8 than the pattern, but\nthe match returned may depend on the UTF8 flag, so always use it when matching\nUTF8 text. For example, \".\" will match one byte normally but with UTF8 set may\nmatch up to three bytes of a multi-byte character.\n<pre>\n  Example:\n     pcrecpp::RE_Options options;\n     options.set_utf8();\n     pcrecpp::RE re(utf8_pattern, options);\n     re.FullMatch(utf8_string);\n\n  Example: using the convenience function UTF8():\n     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());\n     re.FullMatch(utf8_string);\n</pre>\nNOTE: The UTF8 flag is ignored if pcre was not configured with the\n<pre>\n      --enable-utf8 flag.\n</PRE>\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a><br>\n<P>\nPCRE defines some modifiers to change the behavior of the regular expression\nengine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to\npass such modifiers to a RE class. Currently, the following modifiers are\nsupported:\n<pre>\n   modifier              description               Perl corresponding\n\n   PCRE_CASELESS         case insensitive match      /i\n   PCRE_MULTILINE        multiple lines match        /m\n   PCRE_DOTALL           dot matches newlines        /s\n   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A\n   PCRE_EXTRA            strict escape parsing       N/A\n   PCRE_EXTENDED         ignore white spaces         /x\n   PCRE_UTF8             handles UTF8 chars          built-in\n   PCRE_UNGREEDY         reverses * and *?           N/A\n   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)\n</pre>\n(*) Both Perl and PCRE allow non capturing parentheses by means of the\n\"?:\" modifier within the pattern itself. e.g. (?:ab|cd) does not\ncapture, while (ab|cd) does.\n</P>\n<P>\nFor a full account on how each modifier works, please check the\nPCRE API reference page.\n</P>\n<P>\nFor each modifier, there are two member functions whose name is made\nout of the modifier in lowercase, without the \"PCRE_\" prefix. For\ninstance, PCRE_CASELESS is handled by\n<pre>\n  bool caseless()\n</pre>\nwhich returns true if the modifier is set, and\n<pre>\n  RE_Options & set_caseless(bool)\n</pre>\nwhich sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be\naccessed through the <b>set_match_limit()</b> and <b>match_limit()</b> member\nfunctions. Setting <i>match_limit</i> to a non-zero value will limit the\nexecution of pcre to keep it from doing bad things like blowing the stack or\ntaking an eternity to return a result. A value of 5000 is good enough to stop\nstack blowup in a 2MB thread stack. Setting <i>match_limit</i> to zero disables\nmatch limiting. Alternatively, you can call <b>match_limit_recursion()</b>\nwhich uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE\nrecurses. <b>match_limit()</b> limits the number of matches PCRE does;\n<b>match_limit_recursion()</b> limits the depth of internal recursion, and\ntherefore the amount of stack that is used.\n</P>\n<P>\nNormally, to pass one or more modifiers to a RE class, you declare\na <i>RE_Options</i> object, set the appropriate options, and pass this\nobject to a RE constructor. Example:\n<pre>\n   RE_Options opt;\n   opt.set_caseless(true);\n   if (RE(\"HELLO\", opt).PartialMatch(\"hello world\")) ...\n</pre>\nRE_options has two constructors. The default constructor takes no arguments and\ncreates a set of flags that are off by default. The optional parameter\n<i>option_flags</i> is to facilitate transfer of legacy code from C programs.\nThis lets you do\n<pre>\n   RE(pattern,\n     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);\n</pre>\nHowever, new code is better off doing\n<pre>\n   RE(pattern,\n     RE_Options().set_caseless(true).set_multiline(true))\n       .PartialMatch(str);\n</pre>\nIf you are going to pass one of the most used modifiers, there are some\nconvenience functions that return a RE_Options class with the\nappropriate modifier already set: <b>CASELESS()</b>, <b>UTF8()</b>,\n<b>MULTILINE()</b>, <b>DOTALL</b>(), and <b>EXTENDED()</b>.\n</P>\n<P>\nIf you need to set several options at once, and you don't want to go through\nthe pains of declaring a RE_Options object and setting several options, there\nis a parallel method that give you such ability on the fly. You can concatenate\nseveral <b>set_xxxxx()</b> member functions, since each of them returns a\nreference to its class object. For example, to pass PCRE_CASELESS,\nPCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:\n<pre>\n   RE(\" ^ xyz \\\\s+ .* blah$\",\n     RE_Options()\n       .set_caseless(true)\n       .set_extended(true)\n       .set_multiline(true)).PartialMatch(sometext);\n\n</PRE>\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">SCANNING TEXT INCREMENTALLY</a><br>\n<P>\nThe \"Consume\" operation may be useful if you want to repeatedly\nmatch regular expressions at the front of a string and skip over\nthem as they match. This requires use of the \"StringPiece\" type,\nwhich represents a sub-range of a real string. Like RE, StringPiece\nis defined in the pcrecpp namespace.\n<pre>\n  Example: read lines of the form \"var = value\" from a string.\n     string contents = ...;                 // Fill string somehow\n     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece\n\n     string var;\n     int value;\n     pcrecpp::RE re(\"(\\\\w+) = (\\\\d+)\\n\");\n     while (re.Consume(&input, &var, &value)) {\n       ...;\n     }\n</pre>\nEach successful call to \"Consume\" will set \"var/value\", and also\nadvance \"input\" so it points past the matched text.\n</P>\n<P>\nThe \"FindAndConsume\" operation is similar to \"Consume\" but does not\nanchor your match at the beginning of the string. For example, you\ncould extract all words from a string by repeatedly calling\n<pre>\n  pcrecpp::RE(\"(\\\\w+)\").FindAndConsume(&input, &word)\n</PRE>\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">PARSING HEX/OCTAL/C-RADIX NUMBERS</a><br>\n<P>\nBy default, if you pass a pointer to a numeric value, the\ncorresponding text is interpreted as a base-10 number. You can\ninstead wrap the pointer with a call to one of the operators Hex(),\nOctal(), or CRadix() to interpret the text in another base. The\nCRadix operator interprets C-style \"0\" (base-8) and \"0x\" (base-16)\nprefixes, but defaults to base-10.\n<pre>\n  Example:\n    int a, b, c, d;\n    pcrecpp::RE re(\"(.*) (.*) (.*) (.*)\");\n    re.FullMatch(\"100 40 0100 0x40\",\n                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),\n                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));\n</pre>\nwill leave 64 in a, b, c, and d.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">REPLACING PARTS OF STRINGS</a><br>\n<P>\nYou can replace the first match of \"pattern\" in \"str\" with \"rewrite\".\nWithin \"rewrite\", backslash-escaped digits (\\1 to \\9) can be\nused to insert text matching corresponding parenthesized group\nfrom the pattern. \\0 in \"rewrite\" refers to the entire matching\ntext. For example:\n<pre>\n  string s = \"yabba dabba doo\";\n  pcrecpp::RE(\"b+\").Replace(\"d\", &s);\n</pre>\nwill leave \"s\" containing \"yada dabba doo\". The result is true if the pattern\nmatches and a replacement occurs, false otherwise.\n</P>\n<P>\n<b>GlobalReplace</b> is like <b>Replace</b> except that it replaces all\noccurrences of the pattern in the string with the rewrite. Replacements are\nnot subject to re-matching. For example:\n<pre>\n  string s = \"yabba dabba doo\";\n  pcrecpp::RE(\"b+\").GlobalReplace(\"d\", &s);\n</pre>\nwill leave \"s\" containing \"yada dada doo\". It returns the number of\nreplacements made.\n</P>\n<P>\n<b>Extract</b> is like <b>Replace</b>, except that if the pattern matches,\n\"rewrite\" is copied into \"out\" (an additional argument) with substitutions.\nThe non-matching portions of \"text\" are ignored. Returns true iff a match\noccurred and the extraction happened successfully;  if no match occurs, the\nstring is left unaffected.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nThe C++ wrapper was contributed by Google Inc.\n<br>\nCopyright &copy; 2007 Google Inc.\n<br>\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 08 January 2012\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcredemo.html",
    "content": "<html>\n<head>\n<title>pcredemo specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcredemo man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n</ul>\n<PRE>\n/*************************************************\n*           PCRE DEMONSTRATION PROGRAM           *\n*************************************************/\n\n/* This is a demonstration program to illustrate the most straightforward ways\nof calling the PCRE regular expression library from a C program. See the\npcresample documentation for a short discussion (\"man pcresample\" if you have\nthe PCRE man pages installed).\n\nIn Unix-like environments, if PCRE is installed in your standard system\nlibraries, you should be able to compile this program using this command:\n\ngcc -Wall pcredemo.c -lpcre -o pcredemo\n\nIf PCRE is not installed in a standard place, it is likely to be installed with\nsupport for the pkg-config mechanism. If you have pkg-config, you can compile\nthis program using this command:\n\ngcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo\n\nIf you do not have pkg-config, you may have to use this:\n\ngcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \\\n  -R/usr/local/lib -lpcre -o pcredemo\n\nReplace \"/usr/local/include\" and \"/usr/local/lib\" with wherever the include and\nlibrary files for PCRE are installed on your system. Only some operating\nsystems (e.g. Solaris) use the -R option.\n\nBuilding under Windows:\n\nIf you want to statically link this program against a non-dll .a file, you must\ndefine PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and\npcre_free() exported functions will be declared __declspec(dllimport), with\nunwanted results. So in this environment, uncomment the following line. */\n\n/* #define PCRE_STATIC */\n\n#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;pcre.h&gt;\n\n#define OVECCOUNT 30    /* should be a multiple of 3 */\n\n\nint main(int argc, char **argv)\n{\npcre *re;\nconst char *error;\nchar *pattern;\nchar *subject;\nunsigned char *name_table;\nunsigned int option_bits;\nint erroffset;\nint find_all;\nint crlf_is_newline;\nint namecount;\nint name_entry_size;\nint ovector[OVECCOUNT];\nint subject_length;\nint rc, i;\nint utf8;\n\n\n/**************************************************************************\n* First, sort out the command line. There is only one possible option at  *\n* the moment, \"-g\" to request repeated matching to find all occurrences,  *\n* like Perl's /g option. We set the variable find_all to a non-zero value *\n* if the -g option is present. Apart from that, there must be exactly two *\n* arguments.                                                              *\n**************************************************************************/\n\nfind_all = 0;\nfor (i = 1; i &lt; argc; i++)\n  {\n  if (strcmp(argv[i], \"-g\") == 0) find_all = 1;\n    else break;\n  }\n\n/* After the options, we require exactly two arguments, which are the pattern,\nand the subject string. */\n\nif (argc - i != 2)\n  {\n  printf(\"Two arguments required: a regex and a subject string\\n\");\n  return 1;\n  }\n\npattern = argv[i];\nsubject = argv[i+1];\nsubject_length = (int)strlen(subject);\n\n\n/*************************************************************************\n* Now we are going to compile the regular expression pattern, and handle *\n* and errors that are detected.                                          *\n*************************************************************************/\n\nre = pcre_compile(\n  pattern,              /* the pattern */\n  0,                    /* default options */\n  &amp;error,               /* for error message */\n  &amp;erroffset,           /* for error offset */\n  NULL);                /* use default character tables */\n\n/* Compilation failed: print the error message and exit */\n\nif (re == NULL)\n  {\n  printf(\"PCRE compilation failed at offset %d: %s\\n\", erroffset, error);\n  return 1;\n  }\n\n\n/*************************************************************************\n* If the compilation succeeded, we call PCRE again, in order to do a     *\n* pattern match against the subject string. This does just ONE match. If *\n* further matching is needed, it will be done below.                     *\n*************************************************************************/\n\nrc = pcre_exec(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  subject,              /* the subject string */\n  subject_length,       /* the length of the subject */\n  0,                    /* start at offset 0 in the subject */\n  0,                    /* default options */\n  ovector,              /* output vector for substring information */\n  OVECCOUNT);           /* number of elements in the output vector */\n\n/* Matching failed: handle error cases */\n\nif (rc &lt; 0)\n  {\n  switch(rc)\n    {\n    case PCRE_ERROR_NOMATCH: printf(\"No match\\n\"); break;\n    /*\n    Handle other special cases if you like\n    */\n    default: printf(\"Matching error %d\\n\", rc); break;\n    }\n  pcre_free(re);     /* Release memory used for the compiled pattern */\n  return 1;\n  }\n\n/* Match succeded */\n\nprintf(\"\\nMatch succeeded at offset %d\\n\", ovector[0]);\n\n\n/*************************************************************************\n* We have found the first match within the subject string. If the output *\n* vector wasn't big enough, say so. Then output any substrings that were *\n* captured.                                                              *\n*************************************************************************/\n\n/* The output vector wasn't big enough */\n\nif (rc == 0)\n  {\n  rc = OVECCOUNT/3;\n  printf(\"ovector only has room for %d captured substrings\\n\", rc - 1);\n  }\n\n/* Show substrings stored in the output vector by number. Obviously, in a real\napplication you might want to do things other than print them. */\n\nfor (i = 0; i &lt; rc; i++)\n  {\n  char *substring_start = subject + ovector[2*i];\n  int substring_length = ovector[2*i+1] - ovector[2*i];\n  printf(\"%2d: %.*s\\n\", i, substring_length, substring_start);\n  }\n\n\n/**************************************************************************\n* That concludes the basic part of this demonstration program. We have    *\n* compiled a pattern, and performed a single match. The code that follows *\n* shows first how to access named substrings, and then how to code for    *\n* repeated matches on the same subject.                                   *\n**************************************************************************/\n\n/* See if there are any named substrings, and if so, show them by name. First\nwe have to extract the count of named parentheses from the pattern. */\n\n(void)pcre_fullinfo(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  PCRE_INFO_NAMECOUNT,  /* number of named substrings */\n  &amp;namecount);          /* where to put the answer */\n\nif (namecount &lt;= 0) printf(\"No named substrings\\n\"); else\n  {\n  unsigned char *tabptr;\n  printf(\"Named substrings\\n\");\n\n  /* Before we can access the substrings, we must extract the table for\n  translating names to numbers, and the size of each entry in the table. */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMETABLE,      /* address of the table */\n    &amp;name_table);             /* where to put the answer */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */\n    &amp;name_entry_size);        /* where to put the answer */\n\n  /* Now we can scan the table and, for each entry, print the number, the name,\n  and the substring itself. */\n\n  tabptr = name_table;\n  for (i = 0; i &lt; namecount; i++)\n    {\n    int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];\n    printf(\"(%d) %*s: %.*s\\n\", n, name_entry_size - 3, tabptr + 2,\n      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n    tabptr += name_entry_size;\n    }\n  }\n\n\n/*************************************************************************\n* If the \"-g\" option was given on the command line, we want to continue  *\n* to search for additional matches in the subject string, in a similar   *\n* way to the /g option in Perl. This turns out to be trickier than you   *\n* might think because of the possibility of matching an empty string.    *\n* What happens is as follows:                                            *\n*                                                                        *\n* If the previous match was NOT for an empty string, we can just start   *\n* the next match at the end of the previous one.                         *\n*                                                                        *\n* If the previous match WAS for an empty string, we can't do that, as it *\n* would lead to an infinite loop. Instead, a special call of pcre_exec() *\n* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *\n* The first of these tells PCRE that an empty string at the start of the *\n* subject is not a valid match; other possibilities must be tried. The   *\n* second flag restricts PCRE to one match attempt at the initial string  *\n* position. If this match succeeds, an alternative to the empty string   *\n* match has been found, and we can print it and proceed round the loop,  *\n* advancing by the length of whatever was found. If this match does not  *\n* succeed, we still stay in the loop, advancing by just one character.   *\n* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *\n* more than one byte.                                                    *\n*                                                                        *\n* However, there is a complication concerned with newlines. When the     *\n* newline convention is such that CRLF is a valid newline, we must       *\n* advance by two characters rather than one. The newline convention can  *\n* be set in the regex by (*CR), etc.; if not, we must find the default.  *\n*************************************************************************/\n\nif (!find_all)     /* Check for -g */\n  {\n  pcre_free(re);   /* Release the memory used for the compiled pattern */\n  return 0;        /* Finish unless -g was given */\n  }\n\n/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline\nsequence. First, find the options with which the regex was compiled; extract\nthe UTF-8 state, and mask off all but the newline options. */\n\n(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &amp;option_bits);\nutf8 = option_bits &amp; PCRE_UTF8;\noption_bits &amp;= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|\n               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;\n\n/* If no newline options were set, find the default newline convention from the\nbuild configuration. */\n\nif (option_bits == 0)\n  {\n  int d;\n  (void)pcre_config(PCRE_CONFIG_NEWLINE, &amp;d);\n  /* Note that these values are always the ASCII ones, even in\n  EBCDIC environments. CR = 13, NL = 10. */\n  option_bits = (d == 13)? PCRE_NEWLINE_CR :\n          (d == 10)? PCRE_NEWLINE_LF :\n          (d == (13&lt;&lt;8 | 10))? PCRE_NEWLINE_CRLF :\n          (d == -2)? PCRE_NEWLINE_ANYCRLF :\n          (d == -1)? PCRE_NEWLINE_ANY : 0;\n  }\n\n/* See if CRLF is a valid newline sequence. */\n\ncrlf_is_newline =\n     option_bits == PCRE_NEWLINE_ANY ||\n     option_bits == PCRE_NEWLINE_CRLF ||\n     option_bits == PCRE_NEWLINE_ANYCRLF;\n\n/* Loop for second and subsequent matches */\n\nfor (;;)\n  {\n  int options = 0;                 /* Normally no options */\n  int start_offset = ovector[1];   /* Start at end of previous match */\n\n  /* If the previous match was for an empty string, we are finished if we are\n  at the end of the subject. Otherwise, arrange to run another match at the\n  same point to see if a non-empty match can be found. */\n\n  if (ovector[0] == ovector[1])\n    {\n    if (ovector[0] == subject_length) break;\n    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;\n    }\n\n  /* Run the next matching operation */\n\n  rc = pcre_exec(\n    re,                   /* the compiled pattern */\n    NULL,                 /* no extra data - we didn't study the pattern */\n    subject,              /* the subject string */\n    subject_length,       /* the length of the subject */\n    start_offset,         /* starting offset in the subject */\n    options,              /* options */\n    ovector,              /* output vector for substring information */\n    OVECCOUNT);           /* number of elements in the output vector */\n\n  /* This time, a result of NOMATCH isn't an error. If the value in \"options\"\n  is zero, it just means we have found all possible matches, so the loop ends.\n  Otherwise, it means we have failed to find a non-empty-string match at a\n  point where there was a previous empty-string match. In this case, we do what\n  Perl does: advance the matching position by one character, and continue. We\n  do this by setting the \"end of previous match\" offset, because that is picked\n  up at the top of the loop as the point at which to start again.\n\n  There are two complications: (a) When CRLF is a valid newline sequence, and\n  the current position is just before it, advance by an extra byte. (b)\n  Otherwise we must ensure that we skip an entire UTF-8 character if we are in\n  UTF-8 mode. */\n\n  if (rc == PCRE_ERROR_NOMATCH)\n    {\n    if (options == 0) break;                    /* All matches found */\n    ovector[1] = start_offset + 1;              /* Advance one byte */\n    if (crlf_is_newline &amp;&amp;                      /* If CRLF is newline &amp; */\n        start_offset &lt; subject_length - 1 &amp;&amp;    /* we are at CRLF, */\n        subject[start_offset] == '\\r' &amp;&amp;\n        subject[start_offset + 1] == '\\n')\n      ovector[1] += 1;                          /* Advance by one more. */\n    else if (utf8)                              /* Otherwise, ensure we */\n      {                                         /* advance a whole UTF-8 */\n      while (ovector[1] &lt; subject_length)       /* character. */\n        {\n        if ((subject[ovector[1]] &amp; 0xc0) != 0x80) break;\n        ovector[1] += 1;\n        }\n      }\n    continue;    /* Go round the loop again */\n    }\n\n  /* Other matching errors are not recoverable. */\n\n  if (rc &lt; 0)\n    {\n    printf(\"Matching error %d\\n\", rc);\n    pcre_free(re);    /* Release memory used for the compiled pattern */\n    return 1;\n    }\n\n  /* Match succeded */\n\n  printf(\"\\nMatch succeeded again at offset %d\\n\", ovector[0]);\n\n  /* The match succeeded, but the output vector wasn't big enough. */\n\n  if (rc == 0)\n    {\n    rc = OVECCOUNT/3;\n    printf(\"ovector only has room for %d captured substrings\\n\", rc - 1);\n    }\n\n  /* As before, show substrings stored in the output vector by number, and then\n  also any named substrings. */\n\n  for (i = 0; i &lt; rc; i++)\n    {\n    char *substring_start = subject + ovector[2*i];\n    int substring_length = ovector[2*i+1] - ovector[2*i];\n    printf(\"%2d: %.*s\\n\", i, substring_length, substring_start);\n    }\n\n  if (namecount &lt;= 0) printf(\"No named substrings\\n\"); else\n    {\n    unsigned char *tabptr = name_table;\n    printf(\"Named substrings\\n\");\n    for (i = 0; i &lt; namecount; i++)\n      {\n      int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];\n      printf(\"(%d) %*s: %.*s\\n\", n, name_entry_size - 3, tabptr + 2,\n        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n      tabptr += name_entry_size;\n      }\n    }\n  }      /* End of loop to find second and subsequent matches */\n\nprintf(\"\\n\");\npcre_free(re);       /* Release memory used for the compiled pattern */\nreturn 0;\n}\n\n/* End of pcredemo.c */\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcregrep.html",
    "content": "<html>\n<head>\n<title>pcregrep specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcregrep man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">DESCRIPTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">SUPPORT FOR COMPRESSED FILES</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">BINARY FILES</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">OPTIONS</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">ENVIRONMENT VARIABLES</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">NEWLINES</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">OPTIONS COMPATIBILITY</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">OPTIONS WITH DATA</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">MATCHING ERRORS</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">DIAGNOSTICS</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">SEE ALSO</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">AUTHOR</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS</a><br>\n<P>\n<b>pcregrep [options] [long options] [pattern] [path1 path2 ...]</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\n<b>pcregrep</b> searches files for character patterns, in the same way as other\ngrep commands do, but it uses the PCRE regular expression library to support\npatterns that are compatible with the regular expressions of Perl 5. See\n<a href=\"pcresyntax.html\"><b>pcresyntax</b>(3)</a>\nfor a quick-reference summary of pattern syntax, or\n<a href=\"pcrepattern.html\"><b>pcrepattern</b>(3)</a>\nfor a full description of the syntax and semantics of the regular expressions\nthat PCRE supports.\n</P>\n<P>\nPatterns, whether supplied on the command line or in a separate file, are given\nwithout delimiters. For example:\n<pre>\n  pcregrep Thursday /etc/motd\n</pre>\nIf you attempt to use delimiters (for example, by surrounding a pattern with\nslashes, as is common in Perl scripts), they are interpreted as part of the\npattern. Quotes can of course be used to delimit patterns on the command line\nbecause they are interpreted by the shell, and indeed quotes are required if a\npattern contains white space or shell metacharacters.\n</P>\n<P>\nThe first argument that follows any option settings is treated as the single\npattern to be matched when neither <b>-e</b> nor <b>-f</b> is present.\nConversely, when one or both of these options are used to specify patterns, all\narguments are treated as path names. At least one of <b>-e</b>, <b>-f</b>, or an\nargument pattern must be provided.\n</P>\n<P>\nIf no files are specified, <b>pcregrep</b> reads the standard input. The\nstandard input can also be referenced by a name consisting of a single hyphen.\nFor example:\n<pre>\n  pcregrep some-pattern /file1 - /file3\n</pre>\nBy default, each line that matches a pattern is copied to the standard\noutput, and if there is more than one file, the file name is output at the\nstart of each line, followed by a colon. However, there are options that can\nchange how <b>pcregrep</b> behaves. In particular, the <b>-M</b> option makes it\npossible to search for patterns that span line boundaries. What defines a line\nboundary is controlled by the <b>-N</b> (<b>--newline</b>) option.\n</P>\n<P>\nThe amount of memory used for buffering files that are being scanned is\ncontrolled by a parameter that can be set by the <b>--buffer-size</b> option.\nThe default value for this parameter is specified when <b>pcregrep</b> is built,\nwith the default default being 20K. A block of memory three times this size is\nused (to allow for buffering \"before\" and \"after\" lines). An error occurs if a\nline overflows the buffer.\n</P>\n<P>\nPatterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater.\nBUFSIZ is defined in <b>&#60;stdio.h&#62;</b>. When there is more than one pattern\n(specified by the use of <b>-e</b> and/or <b>-f</b>), each pattern is applied to\neach line in the order in which they are defined, except that all the <b>-e</b>\npatterns are tried before the <b>-f</b> patterns.\n</P>\n<P>\nBy default, as soon as one pattern matches a line, no further patterns are\nconsidered. However, if <b>--colour</b> (or <b>--color</b>) is used to colour the\nmatching substrings, or if <b>--only-matching</b>, <b>--file-offsets</b>, or\n<b>--line-offsets</b> is used to output only the part of the line that matched\n(either shown literally, or as an offset), scanning resumes immediately\nfollowing the match, so that further matches on the same line can be found. If\nthere are multiple patterns, they are all tried on the remainder of the line,\nbut patterns that follow the one that matched are not tried on the earlier part\nof the line.\n</P>\n<P>\nThis behaviour means that the order in which multiple patterns are specified\ncan affect the output when one of the above options is used. This is no longer\nthe same behaviour as GNU grep, which now manages to display earlier matches\nfor later patterns (as long as there is no overlap).\n</P>\n<P>\nPatterns that can match an empty string are accepted, but empty string\nmatches are never recognized. An example is the pattern \"(super)?(man)?\", in\nwhich all components are optional. This pattern finds all occurrences of both\n\"super\" and \"man\"; the output differs from matching with \"super|man\" when only\nthe matching substrings are being shown.\n</P>\n<P>\nIf the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variable is set,\n<b>pcregrep</b> uses the value to set a locale when calling the PCRE library.\nThe <b>--locale</b> option can be used to override this.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">SUPPORT FOR COMPRESSED FILES</a><br>\n<P>\nIt is possible to compile <b>pcregrep</b> so that it uses <b>libz</b> or\n<b>libbz2</b> to read files whose names end in <b>.gz</b> or <b>.bz2</b>,\nrespectively. You can find out whether your binary has support for one or both\nof these file types by running it with the <b>--help</b> option. If the\nappropriate support is not present, files are treated as plain text. The\nstandard input is always so treated.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">BINARY FILES</a><br>\n<P>\nBy default, a file that contains a binary zero byte within the first 1024 bytes\nis identified as a binary file, and is processed specially. (GNU grep also\nidentifies binary files in this manner.) See the <b>--binary-files</b> option\nfor a means of changing the way binary files are handled.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">OPTIONS</a><br>\n<P>\nThe order in which some of the options appear can affect the output. For\nexample, both the <b>-h</b> and <b>-l</b> options affect the printing of file\nnames. Whichever comes later in the command line will be the one that takes\neffect. Similarly, except where noted below, if an option is given twice, the\nlater setting is used. Numerical values for options may be followed by K or M,\nto signify multiplication by 1024 or 1024*1024 respectively.\n</P>\n<P>\n<b>--</b>\nThis terminates the list of options. It is useful if the next item on the\ncommand line starts with a hyphen but is not an option. This allows for the\nprocessing of patterns and filenames that start with hyphens.\n</P>\n<P>\n<b>-A</b> <i>number</i>, <b>--after-context=</b><i>number</i>\nOutput <i>number</i> lines of context after each matching line. If filenames\nand/or line numbers are being output, a hyphen separator is used instead of a\ncolon for the context lines. A line containing \"--\" is output between each\ngroup of lines, unless they are in fact contiguous in the input file. The value\nof <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>\nguarantees to have up to 8K of following text available for context output.\n</P>\n<P>\n<b>-a</b>, <b>--text</b>\nTreat binary files as text. This is equivalent to\n<b>--binary-files</b>=<i>text</i>.\n</P>\n<P>\n<b>-B</b> <i>number</i>, <b>--before-context=</b><i>number</i>\nOutput <i>number</i> lines of context before each matching line. If filenames\nand/or line numbers are being output, a hyphen separator is used instead of a\ncolon for the context lines. A line containing \"--\" is output between each\ngroup of lines, unless they are in fact contiguous in the input file. The value\nof <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>\nguarantees to have up to 8K of preceding text available for context output.\n</P>\n<P>\n<b>--binary-files=</b><i>word</i>\nSpecify how binary files are to be processed. If the word is \"binary\" (the\ndefault), pattern matching is performed on binary files, but the only output is\n\"Binary file &#60;name&#62; matches\" when a match succeeds. If the word is \"text\",\nwhich is equivalent to the <b>-a</b> or <b>--text</b> option, binary files are\nprocessed in the same way as any other file. In this case, when a match\nsucceeds, the output may be binary garbage, which can have nasty effects if\nsent to a terminal. If the word is \"without-match\", which is equivalent to the\n<b>-I</b> option, binary files are not processed at all; they are assumed not to\nbe of interest.\n</P>\n<P>\n<b>--buffer-size=</b><i>number</i>\nSet the parameter that controls how much memory is used for buffering files\nthat are being scanned.\n</P>\n<P>\n<b>-C</b> <i>number</i>, <b>--context=</b><i>number</i>\nOutput <i>number</i> lines of context both before and after each matching line.\nThis is equivalent to setting both <b>-A</b> and <b>-B</b> to the same value.\n</P>\n<P>\n<b>-c</b>, <b>--count</b>\nDo not output individual lines from the files that are being scanned; instead\noutput the number of lines that would otherwise have been shown. If no lines\nare selected, the number zero is output. If several files are are being\nscanned, a count is output for each of them. However, if the\n<b>--files-with-matches</b> option is also used, only those files whose counts\nare greater than zero are listed. When <b>-c</b> is used, the <b>-A</b>,\n<b>-B</b>, and <b>-C</b> options are ignored.\n</P>\n<P>\n<b>--colour</b>, <b>--color</b>\nIf this option is given without any data, it is equivalent to \"--colour=auto\".\nIf data is required, it must be given in the same shell item, separated by an\nequals sign.\n</P>\n<P>\n<b>--colour=</b><i>value</i>, <b>--color=</b><i>value</i>\nThis option specifies under what circumstances the parts of a line that matched\na pattern should be coloured in the output. By default, the output is not\ncoloured. The value (which is optional, see above) may be \"never\", \"always\", or\n\"auto\". In the latter case, colouring happens only if the standard output is\nconnected to a terminal. More resources are used when colouring is enabled,\nbecause <b>pcregrep</b> has to search for all possible matches in a line, not\njust one, in order to colour them all.\n<br>\n<br>\nThe colour that is used can be specified by setting the environment variable\nPCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a\nstring of two numbers, separated by a semicolon. They are copied directly into\nthe control string for setting colour on a terminal, so it is your\nresponsibility to ensure that they make sense. If neither of the environment\nvariables is set, the default is \"1;31\", which gives red.\n</P>\n<P>\n<b>-D</b> <i>action</i>, <b>--devices=</b><i>action</i>\nIf an input path is not a regular file or a directory, \"action\" specifies how\nit is to be processed. Valid values are \"read\" (the default) or \"skip\"\n(silently skip the path).\n</P>\n<P>\n<b>-d</b> <i>action</i>, <b>--directories=</b><i>action</i>\nIf an input path is a directory, \"action\" specifies how it is to be processed.\nValid values are \"read\" (the default in non-Windows environments, for\ncompatibility with GNU grep), \"recurse\" (equivalent to the <b>-r</b> option), or\n\"skip\" (silently skip the path, the default in Windows environments). In the\n\"read\" case, directories are read as if they were ordinary files. In some\noperating systems the effect of reading a directory like this is an immediate\nend-of-file; in others it may provoke an error.\n</P>\n<P>\n<b>-e</b> <i>pattern</i>, <b>--regex=</b><i>pattern</i>, <b>--regexp=</b><i>pattern</i>\nSpecify a pattern to be matched. This option can be used multiple times in\norder to specify several patterns. It can also be used as a way of specifying a\nsingle pattern that starts with a hyphen. When <b>-e</b> is used, no argument\npattern is taken from the command line; all arguments are treated as file\nnames. There is no limit to the number of patterns. They are applied to each\nline in the order in which they are defined until one matches.\n<br>\n<br>\nIf <b>-f</b> is used with <b>-e</b>, the command line patterns are matched first,\nfollowed by the patterns from the file(s), independent of the order in which\nthese options are specified. Note that multiple use of <b>-e</b> is not the same\nas a single pattern with alternatives. For example, X|Y finds the first\ncharacter in a line that is X or Y, whereas if the two patterns are given\nseparately, with X first, <b>pcregrep</b> finds X if it is present, even if it\nfollows Y in the line. It finds Y only if there is no X in the line. This\nmatters only if you are using <b>-o</b> or <b>--colo(u)r</b> to show the part(s)\nof the line that matched.\n</P>\n<P>\n<b>--exclude</b>=<i>pattern</i>\nFiles (but not directories) whose names match the pattern are skipped without\nbeing processed. This applies to all files, whether listed on the command line,\nobtained from <b>--file-list</b>, or by scanning a directory. The pattern is a\nPCRE regular expression, and is matched against the final component of the file\nname, not the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not\napply to this pattern. The option may be given any number of times in order to\nspecify multiple patterns. If a file name matches both an <b>--include</b>\nand an <b>--exclude</b> pattern, it is excluded. There is no short form for this\noption.\n</P>\n<P>\n<b>--exclude-from=</b><i>filename</i>\nTreat each non-empty line of the file as the data for an <b>--exclude</b>\noption. What constitutes a newline when reading the file is the operating\nsystem's default. The <b>--newline</b> option has no effect on this option. This\noption may be given more than once in order to specify a number of files to\nread.\n</P>\n<P>\n<b>--exclude-dir</b>=<i>pattern</i>\nDirectories whose names match the pattern are skipped without being processed,\nwhatever the setting of the <b>--recursive</b> option. This applies to all\ndirectories, whether listed on the command line, obtained from\n<b>--file-list</b>, or by scanning a parent directory. The pattern is a PCRE\nregular expression, and is matched against the final component of the directory\nname, not the entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not\napply to this pattern. The option may be given any number of times in order to\nspecify more than one pattern. If a directory matches both <b>--include-dir</b>\nand <b>--exclude-dir</b>, it is excluded. There is no short form for this\noption.\n</P>\n<P>\n<b>-F</b>, <b>--fixed-strings</b>\nInterpret each data-matching pattern as a list of fixed strings, separated by\nnewlines, instead of as a regular expression. What constitutes a newline for\nthis purpose is controlled by the <b>--newline</b> option. The <b>-w</b> (match\nas a word) and <b>-x</b> (match whole line) options can be used with <b>-F</b>.\nThey apply to each of the fixed strings. A line is selected if any of the fixed\nstrings are found in it (subject to <b>-w</b> or <b>-x</b>, if present). This\noption applies only to the patterns that are matched against the contents of\nfiles; it does not apply to patterns specified by any of the <b>--include</b> or\n<b>--exclude</b> options.\n</P>\n<P>\n<b>-f</b> <i>filename</i>, <b>--file=</b><i>filename</i>\nRead patterns from the file, one per line, and match them against\neach line of input. What constitutes a newline when reading the file is the\noperating system's default. The <b>--newline</b> option has no effect on this\noption. Trailing white space is removed from each line, and blank lines are\nignored. An empty file contains no patterns and therefore matches nothing. See\nalso the comments about multiple patterns versus a single pattern with\nalternatives in the description of <b>-e</b> above.\n<br>\n<br>\nIf this option is given more than once, all the specified files are\nread. A data line is output if any of the patterns match it. A filename can\nbe given as \"-\" to refer to the standard input. When <b>-f</b> is used, patterns\nspecified on the command line using <b>-e</b> may also be present; they are\ntested before the file's patterns. However, no other pattern is taken from the\ncommand line; all arguments are treated as the names of paths to be searched.\n</P>\n<P>\n<b>--file-list</b>=<i>filename</i>\nRead a list of files and/or directories that are to be scanned from the given\nfile, one per line. Trailing white space is removed from each line, and blank\nlines are ignored. These paths are processed before any that are listed on the\ncommand line. The filename can be given as \"-\" to refer to the standard input.\nIf <b>--file</b> and <b>--file-list</b> are both specified as \"-\", patterns are\nread first. This is useful only when the standard input is a terminal, from\nwhich further lines (the list of files) can be read after an end-of-file\nindication. If this option is given more than once, all the specified files are\nread.\n</P>\n<P>\n<b>--file-offsets</b>\nInstead of showing lines or parts of lines that match, show each match as an\noffset from the start of the file and a length, separated by a comma. In this\nmode, no context is shown. That is, the <b>-A</b>, <b>-B</b>, and <b>-C</b>\noptions are ignored. If there is more than one match in a line, each of them is\nshown separately. This option is mutually exclusive with <b>--line-offsets</b>\nand <b>--only-matching</b>.\n</P>\n<P>\n<b>-H</b>, <b>--with-filename</b>\nForce the inclusion of the filename at the start of output lines when searching\na single file. By default, the filename is not shown in this case. For matching\nlines, the filename is followed by a colon; for context lines, a hyphen\nseparator is used. If a line number is also being output, it follows the file\nname.\n</P>\n<P>\n<b>-h</b>, <b>--no-filename</b>\nSuppress the output filenames when searching multiple files. By default,\nfilenames are shown when multiple files are searched. For matching lines, the\nfilename is followed by a colon; for context lines, a hyphen separator is used.\nIf a line number is also being output, it follows the file name.\n</P>\n<P>\n<b>--help</b>\nOutput a help message, giving brief details of the command options and file\ntype support, and then exit. Anything else on the command line is\nignored.\n</P>\n<P>\n<b>-I</b>\nTreat binary files as never matching. This is equivalent to\n<b>--binary-files</b>=<i>without-match</i>.\n</P>\n<P>\n<b>-i</b>, <b>--ignore-case</b>\nIgnore upper/lower case distinctions during comparisons.\n</P>\n<P>\n<b>--include</b>=<i>pattern</i>\nIf any <b>--include</b> patterns are specified, the only files that are\nprocessed are those that match one of the patterns (and do not match an\n<b>--exclude</b> pattern). This option does not affect directories, but it\napplies to all files, whether listed on the command line, obtained from\n<b>--file-list</b>, or by scanning a directory. The pattern is a PCRE regular\nexpression, and is matched against the final component of the file name, not\nthe entire path. The <b>-F</b>, <b>-w</b>, and <b>-x</b> options do not apply to\nthis pattern. The option may be given any number of times. If a file name\nmatches both an <b>--include</b> and an <b>--exclude</b> pattern, it is excluded.\nThere is no short form for this option.\n</P>\n<P>\n<b>--include-from=</b><i>filename</i>\nTreat each non-empty line of the file as the data for an <b>--include</b>\noption. What constitutes a newline for this purpose is the operating system's\ndefault. The <b>--newline</b> option has no effect on this option. This option\nmay be given any number of times; all the files are read.\n</P>\n<P>\n<b>--include-dir</b>=<i>pattern</i>\nIf any <b>--include-dir</b> patterns are specified, the only directories that\nare processed are those that match one of the patterns (and do not match an\n<b>--exclude-dir</b> pattern). This applies to all directories, whether listed\non the command line, obtained from <b>--file-list</b>, or by scanning a parent\ndirectory. The pattern is a PCRE regular expression, and is matched against the\nfinal component of the directory name, not the entire path. The <b>-F</b>,\n<b>-w</b>, and <b>-x</b> options do not apply to this pattern. The option may be\ngiven any number of times. If a directory matches both <b>--include-dir</b> and\n<b>--exclude-dir</b>, it is excluded. There is no short form for this option.\n</P>\n<P>\n<b>-L</b>, <b>--files-without-match</b>\nInstead of outputting lines from the files, just output the names of the files\nthat do not contain any lines that would have been output. Each file name is\noutput once, on a separate line.\n</P>\n<P>\n<b>-l</b>, <b>--files-with-matches</b>\nInstead of outputting lines from the files, just output the names of the files\ncontaining lines that would have been output. Each file name is output\nonce, on a separate line. Searching normally stops as soon as a matching line\nis found in a file. However, if the <b>-c</b> (count) option is also used,\nmatching continues in order to obtain the correct count, and those files that\nhave at least one match are listed along with their counts. Using this option\nwith <b>-c</b> is a way of suppressing the listing of files with no matches.\n</P>\n<P>\n<b>--label</b>=<i>name</i>\nThis option supplies a name to be used for the standard input when file names\nare being output. If not supplied, \"(standard input)\" is used. There is no\nshort form for this option.\n</P>\n<P>\n<b>--line-buffered</b>\nWhen this option is given, input is read and processed line by line, and the\noutput is flushed after each write. By default, input is read in large chunks,\nunless <b>pcregrep</b> can determine that it is reading from a terminal (which\nis currently possible only in Unix-like environments). Output to terminal is\nnormally automatically flushed by the operating system. This option can be\nuseful when the input or output is attached to a pipe and you do not want\n<b>pcregrep</b> to buffer up large amounts of data. However, its use will affect\nperformance, and the <b>-M</b> (multiline) option ceases to work.\n</P>\n<P>\n<b>--line-offsets</b>\nInstead of showing lines or parts of lines that match, show each match as a\nline number, the offset from the start of the line, and a length. The line\nnumber is terminated by a colon (as usual; see the <b>-n</b> option), and the\noffset and length are separated by a comma. In this mode, no context is shown.\nThat is, the <b>-A</b>, <b>-B</b>, and <b>-C</b> options are ignored. If there is\nmore than one match in a line, each of them is shown separately. This option is\nmutually exclusive with <b>--file-offsets</b> and <b>--only-matching</b>.\n</P>\n<P>\n<b>--locale</b>=<i>locale-name</i>\nThis option specifies a locale to be used for pattern matching. It overrides\nthe value in the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variables. If no\nlocale is specified, the PCRE library's default (usually the \"C\" locale) is\nused. There is no short form for this option.\n</P>\n<P>\n<b>--match-limit</b>=<i>number</i>\nProcessing some regular expression patterns can require a very large amount of\nmemory, leading in some cases to a program crash if not enough is available.\nOther patterns may take a very long time to search for all possible matching\nstrings. The <b>pcre_exec()</b> function that is called by <b>pcregrep</b> to do\nthe matching has two parameters that can limit the resources that it uses.\n<br>\n<br>\nThe <b>--match-limit</b> option provides a means of limiting resource usage\nwhen processing patterns that are not going to match, but which have a very\nlarge number of possibilities in their search trees. The classic example is a\npattern that uses nested unlimited repeats. Internally, PCRE uses a function\ncalled <b>match()</b> which it calls repeatedly (sometimes recursively). The\nlimit set by <b>--match-limit</b> is imposed on the number of times this\nfunction is called during a match, which has the effect of limiting the amount\nof backtracking that can take place.\n<br>\n<br>\nThe <b>--recursion-limit</b> option is similar to <b>--match-limit</b>, but\ninstead of limiting the total number of times that <b>match()</b> is called, it\nlimits the depth of recursive calls, which in turn limits the amount of memory\nthat can be used. The recursion depth is a smaller number than the total number\nof calls, because not all calls to <b>match()</b> are recursive. This limit is\nof use only if it is set smaller than <b>--match-limit</b>.\n<br>\n<br>\nThere are no short forms for these options. The default settings are specified\nwhen the PCRE library is compiled, with the default default being 10 million.\n</P>\n<P>\n<b>-M</b>, <b>--multiline</b>\nAllow patterns to match more than one line. When this option is given, patterns\nmay usefully contain literal newline characters and internal occurrences of ^\nand $ characters. The output for a successful match may consist of more than\none line, the last of which is the one in which the match ended. If the matched\nstring ends with a newline sequence the output ends at the end of that line.\n<br>\n<br>\nWhen this option is set, the PCRE library is called in \"multiline\" mode.\nThere is a limit to the number of lines that can be matched, imposed by the way\nthat <b>pcregrep</b> buffers the input file as it scans it. However,\n<b>pcregrep</b> ensures that at least 8K characters or the rest of the document\n(whichever is the shorter) are available for forward matching, and similarly\nthe previous 8K characters (or all the previous characters, if fewer than 8K)\nare guaranteed to be available for lookbehind assertions. This option does not\nwork when input is read line by line (see \\fP--line-buffered\\fP.)\n</P>\n<P>\n<b>-N</b> <i>newline-type</i>, <b>--newline</b>=<i>newline-type</i>\nThe PCRE library supports five different conventions for indicating\nthe ends of lines. They are the single-character sequences CR (carriage return)\nand LF (linefeed), the two-character sequence CRLF, an \"anycrlf\" convention,\nwhich recognizes any of the preceding three types, and an \"any\" convention, in\nwhich any Unicode line ending sequence is assumed to end a line. The Unicode\nsequences are the three just mentioned, plus VT (vertical tab, U+000B), FF\n(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and\nPS (paragraph separator, U+2029).\n<br>\n<br>\nWhen the PCRE library is built, a default line-ending sequence is specified.\nThis is normally the standard sequence for the operating system. Unless\notherwise specified by this option, <b>pcregrep</b> uses the library's default.\nThe possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This\nmakes it possible to use <b>pcregrep</b> to scan files that have come from other\nenvironments without having to modify their line endings. If the data that is\nbeing scanned does not agree with the convention set by this option,\n<b>pcregrep</b> may behave in strange ways. Note that this option does not\napply to files specified by the <b>-f</b>, <b>--exclude-from</b>, or\n<b>--include-from</b> options, which are expected to use the operating system's\nstandard newline sequence.\n</P>\n<P>\n<b>-n</b>, <b>--line-number</b>\nPrecede each output line by its line number in the file, followed by a colon\nfor matching lines or a hyphen for context lines. If the filename is also being\noutput, it precedes the line number. This option is forced if\n<b>--line-offsets</b> is used.\n</P>\n<P>\n<b>--no-jit</b>\nIf the PCRE library is built with support for just-in-time compiling (which\nspeeds up matching), <b>pcregrep</b> automatically makes use of this, unless it\nwas explicitly disabled at build time. This option can be used to disable the\nuse of JIT at run time. It is provided for testing and working round problems.\nIt should never be needed in normal use.\n</P>\n<P>\n<b>-o</b>, <b>--only-matching</b>\nShow only the part of the line that matched a pattern instead of the whole\nline. In this mode, no context is shown. That is, the <b>-A</b>, <b>-B</b>, and\n<b>-C</b> options are ignored. If there is more than one match in a line, each\nof them is shown separately. If <b>-o</b> is combined with <b>-v</b> (invert the\nsense of the match to find non-matching lines), no output is generated, but the\nreturn code is set appropriately. If the matched portion of the line is empty,\nnothing is output unless the file name or line number are being printed, in\nwhich case they are shown on an otherwise empty line. This option is mutually\nexclusive with <b>--file-offsets</b> and <b>--line-offsets</b>.\n</P>\n<P>\n<b>-o</b><i>number</i>, <b>--only-matching</b>=<i>number</i>\nShow only the part of the line that matched the capturing parentheses of the\ngiven number. Up to 32 capturing parentheses are supported, and -o0 is\nequivalent to <b>-o</b> without a number. Because these options can be given\nwithout an argument (see above), if an argument is present, it must be given in\nthe same shell item, for example, -o3 or --only-matching=2. The comments given\nfor the non-argument case above also apply to this case. If the specified\ncapturing parentheses do not exist in the pattern, or were not set in the\nmatch, nothing is output unless the file name or line number are being printed.\n<br>\n<br>\nIf this option is given multiple times, multiple substrings are output, in the\norder the options are given. For example, -o3 -o1 -o3 causes the substrings\nmatched by capturing parentheses 3 and 1 and then 3 again to be output. By\ndefault, there is no separator (but see the next option).\n</P>\n<P>\n<b>--om-separator</b>=<i>text</i>\nSpecify a separating string for multiple occurrences of <b>-o</b>. The default\nis an empty string. Separating strings are never coloured.\n</P>\n<P>\n<b>-q</b>, <b>--quiet</b>\nWork quietly, that is, display nothing except error messages. The exit\nstatus indicates whether or not any matches were found.\n</P>\n<P>\n<b>-r</b>, <b>--recursive</b>\nIf any given path is a directory, recursively scan the files it contains,\ntaking note of any <b>--include</b> and <b>--exclude</b> settings. By default, a\ndirectory is read as a normal file; in some operating systems this gives an\nimmediate end-of-file. This option is a shorthand for setting the <b>-d</b>\noption to \"recurse\".\n</P>\n<P>\n<b>--recursion-limit</b>=<i>number</i>\nSee <b>--match-limit</b> above.\n</P>\n<P>\n<b>-s</b>, <b>--no-messages</b>\nSuppress error messages about non-existent or unreadable files. Such files are\nquietly skipped. However, the return code is still 2, even if matches were\nfound in other files.\n</P>\n<P>\n<b>-u</b>, <b>--utf-8</b>\nOperate in UTF-8 mode. This option is available only if PCRE has been compiled\nwith UTF-8 support. All patterns (including those for any <b>--exclude</b> and\n<b>--include</b> options) and all subject lines that are scanned must be valid\nstrings of UTF-8 characters.\n</P>\n<P>\n<b>-V</b>, <b>--version</b>\nWrite the version numbers of <b>pcregrep</b> and the PCRE library to the\nstandard output and then exit. Anything else on the command line is\nignored.\n</P>\n<P>\n<b>-v</b>, <b>--invert-match</b>\nInvert the sense of the match, so that lines which do <i>not</i> match any of\nthe patterns are the ones that are found.\n</P>\n<P>\n<b>-w</b>, <b>--word-regex</b>, <b>--word-regexp</b>\nForce the patterns to match only whole words. This is equivalent to having \\b\nat the start and end of the pattern. This option applies only to the patterns\nthat are matched against the contents of files; it does not apply to patterns\nspecified by any of the <b>--include</b> or <b>--exclude</b> options.\n</P>\n<P>\n<b>-x</b>, <b>--line-regex</b>, <b>--line-regexp</b>\nForce the patterns to be anchored (each must start matching at the beginning of\na line) and in addition, require them to match entire lines. This is equivalent\nto having ^ and $ characters at the start and end of each alternative branch in\nevery pattern. This option applies only to the patterns that are matched\nagainst the contents of files; it does not apply to patterns specified by any\nof the <b>--include</b> or <b>--exclude</b> options.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">ENVIRONMENT VARIABLES</a><br>\n<P>\nThe environment variables <b>LC_ALL</b> and <b>LC_CTYPE</b> are examined, in that\norder, for a locale. The first one that is set is used. This can be overridden\nby the <b>--locale</b> option. If no locale is set, the PCRE library's default\n(usually the \"C\" locale) is used.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">NEWLINES</a><br>\n<P>\nThe <b>-N</b> (<b>--newline</b>) option allows <b>pcregrep</b> to scan files with\ndifferent newline conventions from the default. Any parts of the input files\nthat are written to the standard output are copied identically, with whatever\nnewline sequences they have in the input. However, the setting of this option\ndoes not affect the interpretation of files specified by the <b>-f</b>,\n<b>--exclude-from</b>, or <b>--include-from</b> options, which are assumed to use\nthe operating system's standard newline sequence, nor does it affect the way in\nwhich <b>pcregrep</b> writes informational messages to the standard error and\noutput streams. For these it uses the string \"\\n\" to indicate newlines,\nrelying on the C I/O library to convert this to an appropriate sequence.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">OPTIONS COMPATIBILITY</a><br>\n<P>\nMany of the short and long forms of <b>pcregrep</b>'s options are the same\nas in the GNU <b>grep</b> program. Any long option of the form\n<b>--xxx-regexp</b> (GNU terminology) is also available as <b>--xxx-regex</b>\n(PCRE terminology). However, the <b>--file-list</b>, <b>--file-offsets</b>,\n<b>--include-dir</b>, <b>--line-offsets</b>, <b>--locale</b>, <b>--match-limit</b>,\n<b>-M</b>, <b>--multiline</b>, <b>-N</b>, <b>--newline</b>, <b>--om-separator</b>,\n<b>--recursion-limit</b>, <b>-u</b>, and <b>--utf-8</b> options are specific to\n<b>pcregrep</b>, as is the use of the <b>--only-matching</b> option with a\ncapturing parentheses number.\n</P>\n<P>\nAlthough most of the common options work the same way, a few are different in\n<b>pcregrep</b>. For example, the <b>--include</b> option's argument is a glob\nfor GNU <b>grep</b>, but a regular expression for <b>pcregrep</b>. If both the\n<b>-c</b> and <b>-l</b> options are given, GNU grep lists only file names,\nwithout counts, but <b>pcregrep</b> gives the counts.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">OPTIONS WITH DATA</a><br>\n<P>\nThere are four different ways in which an option with data can be specified.\nIf a short form option is used, the data may follow immediately, or (with one\nexception) in the next command line item. For example:\n<pre>\n  -f/some/file\n  -f /some/file\n</pre>\nThe exception is the <b>-o</b> option, which may appear with or without data.\nBecause of this, if data is present, it must follow immediately in the same\nitem, for example -o3.\n</P>\n<P>\nIf a long form option is used, the data may appear in the same command line\nitem, separated by an equals character, or (with two exceptions) it may appear\nin the next command line item. For example:\n<pre>\n  --file=/some/file\n  --file /some/file\n</pre>\nNote, however, that if you want to supply a file name beginning with ~ as data\nin a shell command, and have the shell expand ~ to a home directory, you must\nseparate the file name from the option, because the shell does not treat ~\nspecially unless it is at the start of an item.\n</P>\n<P>\nThe exceptions to the above are the <b>--colour</b> (or <b>--color</b>) and\n<b>--only-matching</b> options, for which the data is optional. If one of these\noptions does have data, it must be given in the first form, using an equals\ncharacter. Otherwise <b>pcregrep</b> will assume that it has no data.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">MATCHING ERRORS</a><br>\n<P>\nIt is possible to supply a regular expression that takes a very long time to\nfail to match certain lines. Such patterns normally involve nested indefinite\nrepeats, for example: (a+)*\\d when matched against a line of a's with no final\ndigit. The PCRE matching function has a resource limit that causes it to abort\nin these circumstances. If this happens, <b>pcregrep</b> outputs an error\nmessage and the line that caused the problem to the standard error stream. If\nthere are more than 20 such errors, <b>pcregrep</b> gives up.\n</P>\n<P>\nThe <b>--match-limit</b> option of <b>pcregrep</b> can be used to set the overall\nresource limit; there is a second option called <b>--recursion-limit</b> that\nsets a limit on the amount of memory (usually stack) that is used (see the\ndiscussion of these options above).\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">DIAGNOSTICS</a><br>\n<P>\nExit status is 0 if any matches were found, 1 if no matches were found, and 2\nfor syntax errors, overlong lines, non-existent or inaccessible files (even if\nmatches were found in other files) or too many matching errors. Using the\n<b>-s</b> option to suppress error messages about inaccessible files does not\naffect the return code.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcrepattern</b>(3), <b>pcresyntax</b>(3), <b>pcretest</b>(1).\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 03 April 2014\n<br>\nCopyright &copy; 1997-2014 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrejit.html",
    "content": "<html>\n<head>\n<title>pcrejit specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrejit man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE JUST-IN-TIME COMPILER SUPPORT</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">8-BIT, 16-BIT AND 32-BIT SUPPORT</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">AVAILABILITY OF JIT SUPPORT</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">SIMPLE USE OF JIT</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">RETURN VALUES FROM JIT EXECUTION</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">SAVING AND RESTORING COMPILED PATTERNS</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">CONTROLLING THE JIT STACK</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">JIT STACK FAQ</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">EXAMPLE CODE</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">JIT FAST PATH API</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">SEE ALSO</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">AUTHOR</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE JUST-IN-TIME COMPILER SUPPORT</a><br>\n<P>\nJust-in-time compiling is a heavyweight optimization that can greatly speed up\npattern matching. However, it comes at the cost of extra processing before the\nmatch is performed. Therefore, it is of most benefit when the same pattern is\ngoing to be matched many times. This does not necessarily mean many calls of a\nmatching function; if the pattern is not anchored, matching attempts may take\nplace many times at various positions in the subject, even for a single call.\nTherefore, if the subject string is very long, it may still pay to use JIT for\none-off matches.\n</P>\n<P>\nJIT support applies only to the traditional Perl-compatible matching function.\nIt does not apply when the DFA matching function is being used. The code for\nthis support was written by Zoltan Herczeg.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">8-BIT, 16-BIT AND 32-BIT SUPPORT</a><br>\n<P>\nJIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE\nlibraries. To keep this documentation simple, only the 8-bit interface is\ndescribed in what follows. If you are using the 16-bit library, substitute the\n16-bit functions and 16-bit structures (for example, <i>pcre16_jit_stack</i>\ninstead of <i>pcre_jit_stack</i>). If you are using the 32-bit library,\nsubstitute the 32-bit functions and 32-bit structures (for example,\n<i>pcre32_jit_stack</i> instead of <i>pcre_jit_stack</i>).\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">AVAILABILITY OF JIT SUPPORT</a><br>\n<P>\nJIT support is an optional feature of PCRE. The \"configure\" option --enable-jit\n(or equivalent CMake option) must be set when PCRE is built if you want to use\nJIT. The support is limited to the following hardware platforms:\n<pre>\n  ARM v5, v7, and Thumb2\n  Intel x86 32-bit and 64-bit\n  MIPS 32-bit\n  Power PC 32-bit and 64-bit\n  SPARC 32-bit (experimental)\n</pre>\nIf --enable-jit is set on an unsupported platform, compilation fails.\n</P>\n<P>\nA program that is linked with PCRE 8.20 or later can tell if JIT support is\navailable by calling <b>pcre_config()</b> with the PCRE_CONFIG_JIT option. The\nresult is 1 when JIT is available, and 0 otherwise. However, a simple program\ndoes not need to check this in order to use JIT. The normal API is implemented\nin a way that falls back to the interpretive code if JIT is not available. For\nprograms that need the best possible performance, there is also a \"fast path\"\nAPI that is JIT-specific.\n</P>\n<P>\nIf your program may sometimes be linked with versions of PCRE that are older\nthan 8.20, but you want to use JIT when it is available, you can test the\nvalues of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as\nPCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the\n<b>pcre_jit_exec()</b> function was not available at all before 8.32,\nand may not be available at all if PCRE isn't compiled with\n--enable-jit. See the \"JIT FAST PATH API\" section below for details.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">SIMPLE USE OF JIT</a><br>\n<P>\nYou have to do two things to make use of the JIT support in the simplest way:\n<pre>\n  (1) Call <b>pcre_study()</b> with the PCRE_STUDY_JIT_COMPILE option for\n      each compiled pattern, and pass the resulting <b>pcre_extra</b> block to\n      <b>pcre_exec()</b>.\n\n  (2) Use <b>pcre_free_study()</b> to free the <b>pcre_extra</b> block when it is\n      no longer needed, instead of just freeing it yourself. This ensures that\n      any JIT data is also freed.\n</pre>\nFor a program that may be linked with pre-8.20 versions of PCRE, you can insert\n<pre>\n  #ifndef PCRE_STUDY_JIT_COMPILE\n  #define PCRE_STUDY_JIT_COMPILE 0\n  #endif\n</pre>\nso that no option is passed to <b>pcre_study()</b>, and then use something like\nthis to free the study data:\n<pre>\n  #ifdef PCRE_CONFIG_JIT\n      pcre_free_study(study_ptr);\n  #else\n      pcre_free(study_ptr);\n  #endif\n</pre>\nPCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete\nmatches. If you want to run partial matches using the PCRE_PARTIAL_HARD or\nPCRE_PARTIAL_SOFT options of <b>pcre_exec()</b>, you should set one or both of\nthe following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE\nwhen you call <b>pcre_study()</b>:\n<pre>\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n</pre>\nIf using <b>pcre_jit_exec()</b> and supporting a pre-8.32 version of\nPCRE, you can insert:\n<pre>\n   #if PCRE_MAJOR &#62;= 8 && PCRE_MINOR &#62;= 32\n   pcre_jit_exec(...);\n   #else\n   pcre_exec(...)\n   #endif\n</pre>\nbut as described in the \"JIT FAST PATH API\" section below this assumes\nversion 8.32 and later are compiled with --enable-jit, which may\nbreak.\n<br>\n<br>\nThe JIT compiler generates different optimized code for each of the three\nmodes (normal, soft partial, hard partial). When <b>pcre_exec()</b> is called,\nthe appropriate code is run if it is available. Otherwise, the pattern is\nmatched using interpretive code.\n</P>\n<P>\nIn some circumstances you may need to call additional functions. These are\ndescribed in the section entitled\n<a href=\"#stackcontrol\">\"Controlling the JIT stack\"</a>\nbelow.\n</P>\n<P>\nIf JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and\nno JIT data is created. Otherwise, the compiled pattern is passed to the JIT\ncompiler, which turns it into machine code that executes much faster than the\nnormal interpretive code. When <b>pcre_exec()</b> is passed a <b>pcre_extra</b>\nblock containing a pointer to JIT code of the appropriate mode (normal or\nhard/soft partial), it obeys that code instead of running the interpreter. The\nresult is identical, but the compiled JIT code runs much faster.\n</P>\n<P>\nThere are some <b>pcre_exec()</b> options that are not supported for JIT\nexecution. There are also some pattern items that JIT cannot handle. Details\nare given below. In both cases, execution automatically falls back to the\ninterpretive code. If you want to know whether JIT was actually used for a\nparticular match, you should arrange for a JIT callback function to be set up\nas described in the section entitled\n<a href=\"#stackcontrol\">\"Controlling the JIT stack\"</a>\nbelow, even if you do not need to supply a non-default JIT stack. Such a\ncallback function is called whenever JIT code is about to be obeyed. If the\nexecution options are not right for JIT execution, the callback function is not\nobeyed.\n</P>\n<P>\nIf the JIT compiler finds an unsupported item, no JIT data is generated. You\ncan find out if JIT execution is available after studying a pattern by calling\n<b>pcre_fullinfo()</b> with the PCRE_INFO_JIT option. A result of 1 means that\nJIT compilation was successful. A result of 0 means that JIT support is not\navailable, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or\nthe JIT compiler was not able to handle the pattern.\n</P>\n<P>\nOnce a pattern has been studied, with or without JIT, it can be used as many\ntimes as you like for matching different subject strings.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a><br>\n<P>\nThe only <b>pcre_exec()</b> options that are supported for JIT execution are\nPCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL,\nPCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and\nPCRE_PARTIAL_SOFT.\n</P>\n<P>\nThe only unsupported pattern items are \\C (match a single data unit) when\nrunning in a UTF mode, and a callout immediately before an assertion condition\nin a conditional group.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">RETURN VALUES FROM JIT EXECUTION</a><br>\n<P>\nWhen a pattern is matched using JIT execution, the return values are the same\nas those given by the interpretive <b>pcre_exec()</b> code, with the addition of\none new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used\nfor the JIT stack was insufficient. See\n<a href=\"#stackcontrol\">\"Controlling the JIT stack\"</a>\nbelow for a discussion of JIT stack usage. For compatibility with the\ninterpretive <b>pcre_exec()</b> code, no more than two-thirds of the\n<i>ovector</i> argument is used for passing back captured substrings.\n</P>\n<P>\nThe error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a\nvery large pattern tree goes on for too long, as it is in the same circumstance\nwhen JIT is not used, but the details of exactly what is counted are not the\nsame. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT\nexecution.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">SAVING AND RESTORING COMPILED PATTERNS</a><br>\n<P>\nThe code that is generated by the JIT compiler is architecture-specific, and is\nalso position dependent. For those reasons it cannot be saved (in a file or\ndatabase) and restored later like the bytecode and other data of a compiled\npattern. Saving and restoring compiled patterns is not something many people\ndo. More detail about this facility is given in the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation. It should be possible to run <b>pcre_study()</b> on a saved and\nrestored pattern, and thereby recreate the JIT data, but because JIT\ncompilation uses significant resources, it is probably not worth doing this;\nyou might as well recompile the original pattern.\n<a name=\"stackcontrol\"></a></P>\n<br><a name=\"SEC8\" href=\"#TOC1\">CONTROLLING THE JIT STACK</a><br>\n<P>\nWhen the compiled JIT code runs, it needs a block of memory to use as a stack.\nBy default, it uses 32K on the machine stack. However, some large or\ncomplicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT\nis given when there is not enough stack. Three functions are provided for\nmanaging blocks of memory for use as JIT stacks. There is further discussion\nabout the use of JIT stacks in the section entitled\n<a href=\"#stackcontrol\">\"JIT stack FAQ\"</a>\nbelow.\n</P>\n<P>\nThe <b>pcre_jit_stack_alloc()</b> function creates a JIT stack. Its arguments\nare a starting size and a maximum size, and it returns a pointer to an opaque\nstructure of type <b>pcre_jit_stack</b>, or NULL if there is an error. The\n<b>pcre_jit_stack_free()</b> function can be used to free a stack that is no\nlonger needed. (For the technically minded: the address space is allocated by\nmmap or VirtualAlloc.)\n</P>\n<P>\nJIT uses far less memory for recursion than the interpretive code,\nand a maximum stack size of 512K to 1M should be more than enough for any\npattern.\n</P>\n<P>\nThe <b>pcre_assign_jit_stack()</b> function specifies which stack JIT code\nshould use. Its arguments are as follows:\n<pre>\n  pcre_extra         *extra\n  pcre_jit_callback  callback\n  void               *data\n</pre>\nThe <i>extra</i> argument must be the result of studying a pattern with\nPCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other\ntwo options:\n<pre>\n  (1) If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block\n      on the machine stack is used.\n\n  (2) If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must be\n      a valid JIT stack, the result of calling <b>pcre_jit_stack_alloc()</b>.\n\n  (3) If <i>callback</i> is not NULL, it must point to a function that is\n      called with <i>data</i> as an argument at the start of matching, in\n      order to set up a JIT stack. If the return from the callback\n      function is NULL, the internal 32K stack is used; otherwise the\n      return value must be a valid JIT stack, the result of calling\n      <b>pcre_jit_stack_alloc()</b>.\n</pre>\nA callback function is obeyed whenever JIT code is about to be run; it is not\nobeyed when <b>pcre_exec()</b> is called with options that are incompatible for\nJIT execution. A callback function can therefore be used to determine whether a\nmatch operation was executed by JIT or by the interpreter.\n</P>\n<P>\nYou may safely use the same JIT stack for more than one pattern (either by\nassigning directly or by callback), as long as the patterns are all matched\nsequentially in the same thread. In a multithread application, if you do not\nspecify a JIT stack, or if you assign or pass back NULL from a callback, that\nis thread-safe, because each thread has its own machine stack. However, if you\nassign or pass back a non-NULL JIT stack, this must be a different stack for\neach thread so that the application is thread-safe.\n</P>\n<P>\nStrictly speaking, even more is allowed. You can assign the same non-NULL stack\nto any number of patterns as long as they are not used for matching by multiple\nthreads at the same time. For example, you can assign the same stack to all\ncompiled patterns, and use a global mutex in the callback to wait until the\nstack is available for use. However, this is an inefficient solution, and not\nrecommended.\n</P>\n<P>\nThis is a suggestion for how a multithreaded program that needs to set up\nnon-default JIT stacks might operate:\n<pre>\n  During thread initalization\n    thread_local_var = pcre_jit_stack_alloc(...)\n\n  During thread exit\n    pcre_jit_stack_free(thread_local_var)\n\n  Use a one-line callback function\n    return thread_local_var\n</pre>\nAll the functions described in this section do nothing if JIT is not available,\nand <b>pcre_assign_jit_stack()</b> does nothing unless the <b>extra</b> argument\nis non-NULL and points to a <b>pcre_extra</b> block that is the result of a\nsuccessful study with PCRE_STUDY_JIT_COMPILE etc.\n<a name=\"stackfaq\"></a></P>\n<br><a name=\"SEC9\" href=\"#TOC1\">JIT STACK FAQ</a><br>\n<P>\n(1) Why do we need JIT stacks?\n<br>\n<br>\nPCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where\nthe local data of the current node is pushed before checking its child nodes.\nAllocating real machine stack on some platforms is difficult. For example, the\nstack chain needs to be updated every time if we extend the stack on PowerPC.\nAlthough it is possible, its updating time overhead decreases performance. So\nwe do the recursion in memory.\n</P>\n<P>\n(2) Why don't we simply allocate blocks of memory with <b>malloc()</b>?\n<br>\n<br>\nModern operating systems have a nice feature: they can reserve an address space\ninstead of allocating memory. We can safely allocate memory pages inside this\naddress space, so the stack could grow without moving memory data (this is\nimportant because of pointers). Thus we can allocate 1M address space, and use\nonly a single memory page (usually 4K) if that is enough. However, we can still\ngrow up to 1M anytime if needed.\n</P>\n<P>\n(3) Who \"owns\" a JIT stack?\n<br>\n<br>\nThe owner of the stack is the user program, not the JIT studied pattern or\nanything else. The user program must ensure that if a stack is used by\n<b>pcre_exec()</b>, (that is, it is assigned to the pattern currently running),\nthat stack must not be used by any other threads (to avoid overwriting the same\nmemory area). The best practice for multithreaded programs is to allocate a\nstack for each thread, and return this stack through the JIT callback function.\n</P>\n<P>\n(4) When should a JIT stack be freed?\n<br>\n<br>\nYou can free a JIT stack at any time, as long as it will not be used by\n<b>pcre_exec()</b> again. When you assign the stack to a pattern, only a pointer\nis set. There is no reference counting or any other magic. You can free the\npatterns and stacks in any order, anytime. Just <i>do not</i> call\n<b>pcre_exec()</b> with a pattern pointing to an already freed stack, as that\nwill cause SEGFAULT. (Also, do not free a stack currently used by\n<b>pcre_exec()</b> in another thread). You can also replace the stack for a\npattern at any time. You can even free the previous stack before assigning a\nreplacement.\n</P>\n<P>\n(5) Should I allocate/free a stack every time before/after calling\n<b>pcre_exec()</b>?\n<br>\n<br>\nNo, because this is too costly in terms of resources. However, you could\nimplement some clever idea which release the stack if it is not used in let's\nsay two minutes. The JIT callback can help to achieve this without keeping a\nlist of the currently JIT studied patterns.\n</P>\n<P>\n(6) OK, the stack is for long term memory allocation. But what happens if a\npattern causes stack overflow with a stack of 1M? Is that 1M kept until the\nstack is freed?\n<br>\n<br>\nEspecially on embedded sytems, it might be a good idea to release memory\nsometimes without freeing the stack. There is no API for this at the moment.\nProbably a function call which returns with the currently allocated memory for\nany stack and another which allows releasing memory (shrinking the stack) would\nbe a good idea if someone needs this.\n</P>\n<P>\n(7) This is too much of a headache. Isn't there any better solution for JIT\nstack handling?\n<br>\n<br>\nNo, thanks to Windows. If POSIX threads were used everywhere, we could throw\nout this complicated API.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">EXAMPLE CODE</a><br>\n<P>\nThis is a single-threaded example that specifies a JIT stack without using a\ncallback.\n<pre>\n  int rc;\n  int ovector[30];\n  pcre *re;\n  pcre_extra *extra;\n  pcre_jit_stack *jit_stack;\n\n  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);\n  /* Check for errors */\n  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);\n  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);\n  /* Check for error (NULL) */\n  pcre_assign_jit_stack(extra, NULL, jit_stack);\n  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);\n  /* Check results */\n  pcre_free(re);\n  pcre_free_study(extra);\n  pcre_jit_stack_free(jit_stack);\n\n</PRE>\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">JIT FAST PATH API</a><br>\n<P>\nBecause the API described above falls back to interpreted execution when JIT is\nnot available, it is convenient for programs that are written for general use\nin many environments. However, calling JIT via <b>pcre_exec()</b> does have a\nperformance impact. Programs that are written for use where JIT is known to be\navailable, and which need the best possible performance, can instead use a\n\"fast path\" API to call JIT execution directly instead of calling\n<b>pcre_exec()</b> (obviously only for patterns that have been successfully\nstudied by JIT).\n</P>\n<P>\nThe fast path function is called <b>pcre_jit_exec()</b>, and it takes exactly\nthe same arguments as <b>pcre_exec()</b>, plus one additional argument that\nmust point to a JIT stack. The JIT stack arrangements described above do not\napply. The return values are the same as for <b>pcre_exec()</b>.\n</P>\n<P>\nWhen you call <b>pcre_exec()</b>, as well as testing for invalid options, a\nnumber of other sanity checks are performed on the arguments. For example, if\nthe subject pointer is NULL, or its length is negative, an immediate error is\ngiven. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested\nfor validity. In the interests of speed, these checks do not happen on the JIT\nfast path, and if invalid data is passed, the result is undefined.\n</P>\n<P>\nBypassing the sanity checks and the <b>pcre_exec()</b> wrapping can give\nspeedups of more than 10%.\n</P>\n<P>\nNote that the <b>pcre_jit_exec()</b> function is not available in versions of\nPCRE before 8.32 (released in November 2012). If you need to support versions\nthat old you must either use the slower <b>pcre_exec()</b>, or switch between\nthe two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR.\n</P>\n<P>\nDue to an unfortunate implementation oversight, even in versions 8.32\nand later there will be no <b>pcre_jit_exec()</b> stub function defined\nwhen PCRE is compiled with --disable-jit, which is the default, and\nthere's no way to detect whether PCRE was compiled with --enable-jit\nvia a macro.\n</P>\n<P>\nIf you need to support versions older than 8.32, or versions that may\nnot build with --enable-jit, you must either use the slower\n<b>pcre_exec()</b>, or switch between the two codepaths by checking the\nvalues of PCRE_MAJOR and PCRE_MINOR.\n</P>\n<P>\nSwitching between the two by checking the version assumes that all the\nversions being targeted are built with --enable-jit. To also support\nbuilds that may use --disable-jit either <b>pcre_exec()</b> must be\nused, or a compile-time check for JIT via <b>pcre_config()</b> (which\nassumes the runtime environment will be the same), or as the Git\nproject decided to do, simply assume that <b>pcre_jit_exec()</b> is\npresent in 8.32 or later unless a compile-time flag is provided, see\nthe \"grep: un-break building with PCRE &#62;= 8.32 without --enable-jit\"\ncommit in git.git for an example of that.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcreapi</b>(3)\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel (FAQ by Zoltan Herczeg)\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 05 July 2017\n<br>\nCopyright &copy; 1997-2017 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrelimits.html",
    "content": "<html>\n<head>\n<title>pcrelimits specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrelimits man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nSIZE AND OTHER LIMITATIONS\n</b><br>\n<P>\nThere are some size limitations in PCRE but it is hoped that they will never in\npractice be relevant.\n</P>\n<P>\nThe maximum length of a compiled pattern is approximately 64K data units (bytes\nfor the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for\nthe 32-bit library) if PCRE is compiled with the default internal linkage size,\nwhich is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit\nlibrary. If you want to process regular expressions that are truly enormous,\nyou can compile PCRE with an internal linkage size of 3 or 4 (when building the\n16-bit or 32-bit library, 3 is rounded up to 4). See the <b>README</b> file in\nthe source distribution and the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation for details. In these cases the limit is substantially larger.\nHowever, the speed of execution is slower.\n</P>\n<P>\nAll values in repeating quantifiers must be less than 65536.\n</P>\n<P>\nThere is no limit to the number of parenthesized subpatterns, but there can be\nno more than 65535 capturing subpatterns. There is, however, a limit to the\ndepth of nesting of parenthesized subpatterns of all kinds. This is imposed in\norder to limit the amount of system stack used at compile time. The limit can\nbe specified when PCRE is built; the default is 250.\n</P>\n<P>\nThere is a limit to the number of forward references to subsequent subpatterns\nof around 200,000. Repeated forward references with fixed upper limits, for\nexample, (?2){0,100} when subpattern number 2 is to the right, are included in\nthe count. There is no limit to the number of backward references.\n</P>\n<P>\nThe maximum length of name for a named subpattern is 32 characters, and the\nmaximum number of named subpatterns is 10000.\n</P>\n<P>\nThe maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb\nis 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.\n</P>\n<P>\nThe maximum length of a subject string is the largest positive number that an\ninteger variable can hold. However, when using the traditional matching\nfunction, PCRE uses recursion to handle subpatterns and indefinite repetition.\nThis means that the available stack space may limit the size of a subject\nstring that can be processed by certain patterns. For a discussion of stack\nissues, see the\n<a href=\"pcrestack.html\"><b>pcrestack</b></a>\ndocumentation.\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 05 November 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrematching.html",
    "content": "<html>\n<head>\n<title>pcrematching specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrematching man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE MATCHING ALGORITHMS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">REGULAR EXPRESSIONS AS TREES</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">THE STANDARD MATCHING ALGORITHM</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">THE ALTERNATIVE MATCHING ALGORITHM</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">ADVANTAGES OF THE ALTERNATIVE ALGORITHM</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">DISADVANTAGES OF THE ALTERNATIVE ALGORITHM</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">AUTHOR</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE MATCHING ALGORITHMS</a><br>\n<P>\nThis document describes the two different algorithms that are available in PCRE\nfor matching a compiled regular expression against a given subject string. The\n\"standard\" algorithm is the one provided by the <b>pcre_exec()</b>,\n<b>pcre16_exec()</b> and <b>pcre32_exec()</b> functions. These work in the same\nas as Perl's matching function, and provide a Perl-compatible matching operation.\nThe just-in-time (JIT) optimization that is described in the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation is compatible with these functions.\n</P>\n<P>\nAn alternative algorithm is provided by the <b>pcre_dfa_exec()</b>,\n<b>pcre16_dfa_exec()</b> and <b>pcre32_dfa_exec()</b> functions; they operate in\na different way, and are not Perl-compatible. This alternative has advantages\nand disadvantages compared with the standard algorithm, and these are described\nbelow.\n</P>\n<P>\nWhen there is only one possible way in which a given subject string can match a\npattern, the two algorithms give the same answer. A difference arises, however,\nwhen there are multiple possibilities. For example, if the pattern\n<pre>\n  ^&#60;.*&#62;\n</pre>\nis matched against the string\n<pre>\n  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;\n</pre>\nthere are three possible answers. The standard algorithm finds only one of\nthem, whereas the alternative algorithm finds all three.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">REGULAR EXPRESSIONS AS TREES</a><br>\n<P>\nThe set of strings that are matched by a regular expression can be represented\nas a tree structure. An unlimited repetition in the pattern makes the tree of\ninfinite size, but it is still a tree. Matching the pattern to a given subject\nstring (from a given starting point) can be thought of as a search of the tree.\nThere are two ways to search a tree: depth-first and breadth-first, and these\ncorrespond to the two matching algorithms provided by PCRE.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">THE STANDARD MATCHING ALGORITHM</a><br>\n<P>\nIn the terminology of Jeffrey Friedl's book \"Mastering Regular\nExpressions\", the standard algorithm is an \"NFA algorithm\". It conducts a\ndepth-first search of the pattern tree. That is, it proceeds along a single\npath through the tree, checking that the subject matches what is required. When\nthere is a mismatch, the algorithm tries any alternatives at the current point,\nand if they all fail, it backs up to the previous branch point in the tree, and\ntries the next alternative branch at that level. This often involves backing up\n(moving to the left) in the subject string as well. The order in which\nrepetition branches are tried is controlled by the greedy or ungreedy nature of\nthe quantifier.\n</P>\n<P>\nIf a leaf node is reached, a matching string has been found, and at that point\nthe algorithm stops. Thus, if there is more than one possible match, this\nalgorithm returns the first one that it finds. Whether this is the shortest,\nthe longest, or some intermediate length depends on the way the greedy and\nungreedy repetition quantifiers are specified in the pattern.\n</P>\n<P>\nBecause it ends up with a single path through the tree, it is relatively\nstraightforward for this algorithm to keep track of the substrings that are\nmatched by portions of the pattern in parentheses. This provides support for\ncapturing parentheses and back references.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">THE ALTERNATIVE MATCHING ALGORITHM</a><br>\n<P>\nThis algorithm conducts a breadth-first search of the tree. Starting from the\nfirst matching point in the subject, it scans the subject string from left to\nright, once, character by character, and as it does this, it remembers all the\npaths through the tree that represent valid matches. In Friedl's terminology,\nthis is a kind of \"DFA algorithm\", though it is not implemented as a\ntraditional finite state machine (it keeps multiple states active\nsimultaneously).\n</P>\n<P>\nAlthough the general principle of this matching algorithm is that it scans the\nsubject string only once, without backtracking, there is one exception: when a\nlookaround assertion is encountered, the characters following or preceding the\ncurrent point have to be independently inspected.\n</P>\n<P>\nThe scan continues until either the end of the subject is reached, or there are\nno more unterminated paths. At this point, terminated paths represent the\ndifferent matching possibilities (if there are none, the match has failed).\nThus, if there is more than one possible match, this algorithm finds all of\nthem, and in particular, it finds the longest. The matches are returned in\ndecreasing order of length. There is an option to stop the algorithm after the\nfirst match (which is necessarily the shortest) is found.\n</P>\n<P>\nNote that all the matches that are found start at the same point in the\nsubject. If the pattern\n<pre>\n  cat(er(pillar)?)?\n</pre>\nis matched against the string \"the caterpillar catchment\", the result will be\nthe three strings \"caterpillar\", \"cater\", and \"cat\" that start at the fifth\ncharacter of the subject. The algorithm does not automatically move on to find\nmatches that start at later positions.\n</P>\n<P>\nPCRE's \"auto-possessification\" optimization usually applies to character\nrepeats at the end of a pattern (as well as internally). For example, the\npattern \"a\\d+\" is compiled as if it were \"a\\d++\" because there is no point\neven considering the possibility of backtracking into the repeated digits. For\nDFA matching, this means that only one possible match is found. If you really\ndo want multiple matches in such cases, either use an ungreedy repeat\n(\"a\\d+?\") or set the PCRE_NO_AUTO_POSSESS option when compiling.\n</P>\n<P>\nThere are a number of features of PCRE regular expressions that are not\nsupported by the alternative matching algorithm. They are as follows:\n</P>\n<P>\n1. Because the algorithm finds all possible matches, the greedy or ungreedy\nnature of repetition quantifiers is not relevant. Greedy and ungreedy\nquantifiers are treated in exactly the same way. However, possessive\nquantifiers can make a difference when what follows could also match what is\nquantified, for example in a pattern like this:\n<pre>\n  ^a++\\w!\n</pre>\nThis pattern matches \"aaab!\" but not \"aaa!\", which would be matched by a\nnon-possessive quantifier. Similarly, if an atomic group is present, it is\nmatched as if it were a standalone pattern at the current point, and the\nlongest match is then \"locked in\" for the rest of the overall pattern.\n</P>\n<P>\n2. When dealing with multiple paths through the tree simultaneously, it is not\nstraightforward to keep track of captured substrings for the different matching\npossibilities, and PCRE's implementation of this algorithm does not attempt to\ndo this. This means that no captured substrings are available.\n</P>\n<P>\n3. Because no substrings are captured, back references within the pattern are\nnot supported, and cause errors if encountered.\n</P>\n<P>\n4. For the same reason, conditional expressions that use a backreference as the\ncondition or test for a specific group recursion are not supported.\n</P>\n<P>\n5. Because many paths through the tree may be active, the \\K escape sequence,\nwhich resets the start of the match when encountered (but may be on some paths\nand not on others), is not supported. It causes an error if encountered.\n</P>\n<P>\n6. Callouts are supported, but the value of the <i>capture_top</i> field is\nalways 1, and the value of the <i>capture_last</i> field is always -1.\n</P>\n<P>\n7. The \\C escape sequence, which (in the standard algorithm) always matches a\nsingle data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in\nthese modes, because the alternative algorithm moves through the subject string\none character (not data unit) at a time, for all active paths through the tree.\n</P>\n<P>\n8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not\nsupported. (*FAIL) is supported, and behaves like a failing negative assertion.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">ADVANTAGES OF THE ALTERNATIVE ALGORITHM</a><br>\n<P>\nUsing the alternative matching algorithm provides the following advantages:\n</P>\n<P>\n1. All possible matches (at a single point in the subject) are automatically\nfound, and in particular, the longest match is found. To find more than one\nmatch using the standard algorithm, you have to do kludgy things with\ncallouts.\n</P>\n<P>\n2. Because the alternative algorithm scans the subject string just once, and\nnever needs to backtrack (except for lookbehinds), it is possible to pass very\nlong subject strings to the matching function in several pieces, checking for\npartial matching each time. Although it is possible to do multi-segment\nmatching using the standard algorithm by retaining partially matched\nsubstrings, it is more complicated. The\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation gives details of partial matching and discusses multi-segment\nmatching.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">DISADVANTAGES OF THE ALTERNATIVE ALGORITHM</a><br>\n<P>\nThe alternative algorithm suffers from a number of disadvantages:\n</P>\n<P>\n1. It is substantially slower than the standard algorithm. This is partly\nbecause it has to search for all possible matches, but is also because it is\nless susceptible to optimization.\n</P>\n<P>\n2. Capturing parentheses and back references are not supported.\n</P>\n<P>\n3. Although atomic groups are supported, their use does not provide the\nperformance advantage that it does for the standard algorithm.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 November 2013\n<br>\nCopyright &copy; 1997-2012 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrepartial.html",
    "content": "<html>\n<head>\n<title>pcrepartial specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrepartial man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PARTIAL MATCHING IN PCRE</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">PARTIAL MATCHING AND WORD BOUNDARIES</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">FORMERLY RESTRICTED PATTERNS</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">ISSUES WITH MULTI-SEGMENT MATCHING</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">AUTHOR</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PARTIAL MATCHING IN PCRE</a><br>\n<P>\nIn normal use of PCRE, if the subject string that is passed to a matching\nfunction matches as far as it goes, but is too short to match the entire\npattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might\nbe helpful to distinguish this case from other cases in which there is no\nmatch.\n</P>\n<P>\nConsider, for example, an application where a human is required to type in data\nfor a field with specific formatting requirements. An example might be a date\nin the form <i>ddmmmyy</i>, defined by this pattern:\n<pre>\n  ^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$\n</pre>\nIf the application sees the user's keystrokes one by one, and can check that\nwhat has been typed so far is potentially valid, it is able to raise an error\nas soon as a mistake is made, by beeping and not reflecting the character that\nhas been typed, for example. This immediate feedback is likely to be a better\nuser interface than a check that is delayed until the entire string has been\nentered. Partial matching can also be useful when the subject string is very\nlong and is not all available at once.\n</P>\n<P>\nPCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and\nPCRE_PARTIAL_HARD options, which can be set when calling any of the matching\nfunctions. For backwards compatibility, PCRE_PARTIAL is a synonym for\nPCRE_PARTIAL_SOFT. The essential difference between the two options is whether\nor not a partial match is preferred to an alternative complete match, though\nthe details differ between the two types of matching function. If both options\nare set, PCRE_PARTIAL_HARD takes precedence.\n</P>\n<P>\nIf you want to use partial matching with just-in-time optimized code, you must\ncall <b>pcre_study()</b>, <b>pcre16_study()</b> or  <b>pcre32_study()</b> with one\nor both of these options:\n<pre>\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n</pre>\nPCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial\nmatches on the same pattern. If the appropriate JIT study mode has not been set\nfor a match, the interpretive matching code is used.\n</P>\n<P>\nSetting a partial matching option disables two of PCRE's standard\noptimizations. PCRE remembers the last literal data unit in a pattern, and\nabandons matching immediately if it is not present in the subject string. This\noptimization cannot be used for a subject string that might match only\npartially. If the pattern was studied, PCRE knows the minimum length of a\nmatching string, and does not bother to run the matching function on shorter\nstrings. This optimization is also disabled for partial matching.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()</a><br>\n<P>\nA partial match occurs during a call to <b>pcre_exec()</b> or\n<b>pcre[16|32]_exec()</b> when the end of the subject string is reached\nsuccessfully, but matching cannot continue because more characters are needed.\nHowever, at least one character in the subject must have been inspected. This\ncharacter need not form part of the final matched string; lookbehind assertions\nand the \\K escape sequence provide ways of inspecting characters before the\nstart of a matched substring. The requirement for inspecting at least one\ncharacter exists because an empty string can always be matched; without such a\nrestriction there would always be a partial match of an empty string at the end\nof the subject.\n</P>\n<P>\nIf there are at least two slots in the offsets vector when a partial match is\nreturned, the first slot is set to the offset of the earliest character that\nwas inspected. For convenience, the second offset points to the end of the\nsubject so that a substring can easily be identified. If there are at least\nthree slots in the offsets vector, the third slot is set to the offset of the\ncharacter where matching started.\n</P>\n<P>\nFor the majority of patterns, the contents of the first and third slots will be\nthe same. However, for patterns that contain lookbehind assertions, or begin\nwith \\b or \\B, characters before the one where matching started may have been\ninspected while carrying out the match. For example, consider this pattern:\n<pre>\n  /(?&#60;=abc)123/\n</pre>\nThis pattern matches \"123\", but only if it is preceded by \"abc\". If the subject\nstring is \"xyzabc12\", the first two offsets after a partial match are for the\nsubstring \"abc12\", because all these characters were inspected. However, the\nthird offset is set to 6, because that is the offset where matching began.\n</P>\n<P>\nWhat happens when a partial match is identified depends on which of the two\npartial matching options are set.\n</P>\n<br><b>\nPCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()\n</b><br>\n<P>\nIf PCRE_PARTIAL_SOFT is set when <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b>\nidentifies a partial match, the partial match is remembered, but matching\ncontinues as normal, and other alternatives in the pattern are tried. If no\ncomplete match can be found, PCRE_ERROR_PARTIAL is returned instead of\nPCRE_ERROR_NOMATCH.\n</P>\n<P>\nThis option is \"soft\" because it prefers a complete match over a partial match.\nAll the various matching items in a pattern behave as if the subject string is\npotentially complete. For example, \\z, \\Z, and $ match at the end of the\nsubject, as normal, and for \\b and \\B the end of the subject is treated as a\nnon-alphanumeric.\n</P>\n<P>\nIf there is more than one partial match, the first one that was found provides\nthe data that is returned. Consider this pattern:\n<pre>\n  /123\\w+X|dogY/\n</pre>\nIf this is matched against the subject string \"abc123dog\", both\nalternatives fail to match, but the end of the subject is reached during\nmatching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,\nidentifying \"123dog\" as the first partial match that was found. (In this\nexample, there are two partial matches, because \"dog\" on its own partially\nmatches the second alternative.)\n</P>\n<br><b>\nPCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()\n</b><br>\n<P>\nIf PCRE_PARTIAL_HARD is set for <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b>,\nPCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without\ncontinuing to search for possible complete matches. This option is \"hard\"\nbecause it prefers an earlier partial match over a later complete match. For\nthis reason, the assumption is made that the end of the supplied subject string\nmay not be the true end of the available data, and so, if \\z, \\Z, \\b, \\B,\nor $ are encountered at the end of the subject, the result is\nPCRE_ERROR_PARTIAL, provided that at least one character in the subject has\nbeen inspected.\n</P>\n<P>\nSetting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16\nsubject strings are checked for validity. Normally, an invalid sequence\ncauses the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the\nspecial case of a truncated character at the end of the subject,\nPCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when\nPCRE_PARTIAL_HARD is set.\n</P>\n<br><b>\nComparing hard and soft partial matching\n</b><br>\n<P>\nThe difference between the two partial matching options can be illustrated by a\npattern such as:\n<pre>\n  /dog(sbody)?/\n</pre>\nThis matches either \"dog\" or \"dogsbody\", greedily (that is, it prefers the\nlonger string if possible). If it is matched against the string \"dog\" with\nPCRE_PARTIAL_SOFT, it yields a complete match for \"dog\". However, if\nPCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,\nif the pattern is made ungreedy the result is different:\n<pre>\n  /dog(sbody)??/\n</pre>\nIn this case the result is always a complete match because that is found first,\nand matching never continues after finding a complete match. It might be easier\nto follow this explanation by thinking of the two patterns like this:\n<pre>\n  /dog(sbody)?/    is the same as  /dogsbody|dog/\n  /dog(sbody)??/   is the same as  /dog|dogsbody/\n</pre>\nThe second pattern will never match \"dogsbody\", because it will always find the\nshorter match first.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a><br>\n<P>\nThe DFA functions move along the subject string character by character, without\nbacktracking, searching for all possible matches simultaneously. If the end of\nthe subject is reached before the end of the pattern, there is the possibility\nof a partial match, again provided that at least one character has been\ninspected.\n</P>\n<P>\nWhen PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there\nhave been no complete matches. Otherwise, the complete matches are returned.\nHowever, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any\ncomplete matches. The portion of the string that was inspected when the longest\npartial match was found is set as the first matching string, provided there are\nat least two slots in the offsets vector.\n</P>\n<P>\nBecause the DFA functions always search for all possible matches, and there is\nno difference between greedy and ungreedy repetition, their behaviour is\ndifferent from the standard functions when PCRE_PARTIAL_HARD is set. Consider\nthe string \"dog\" matched against the ungreedy pattern shown above:\n<pre>\n  /dog(sbody)??/\n</pre>\nWhereas the standard functions stop as soon as they find the complete match for\n\"dog\", the DFA functions also find the partial match for \"dogsbody\", and so\nreturn that when PCRE_PARTIAL_HARD is set.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">PARTIAL MATCHING AND WORD BOUNDARIES</a><br>\n<P>\nIf a pattern ends with one of sequences \\b or \\B, which test for word\nboundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive\nresults. Consider this pattern:\n<pre>\n  /\\bcat\\b/\n</pre>\nThis matches \"cat\", provided there is a word boundary at either end. If the\nsubject string is \"the cat\", the comparison of the final \"t\" with a following\ncharacter cannot take place, so a partial match is found. However, normal\nmatching carries on, and \\b matches at the end of the subject when the last\ncharacter is a letter, so a complete match is found. The result, therefore, is\n<i>not</i> PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield\nPCRE_ERROR_PARTIAL, because then the partial match takes precedence.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">FORMERLY RESTRICTED PATTERNS</a><br>\n<P>\nFor releases of PCRE prior to 8.00, because of the way certain internal\noptimizations were implemented in the <b>pcre_exec()</b> function, the\nPCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with\nall patterns. From release 8.00 onwards, the restrictions no longer apply, and\npartial matching with can be requested for any pattern.\n</P>\n<P>\nItems that were formerly restricted were repeated single characters and\nrepeated metasequences. If PCRE_PARTIAL was set for a pattern that did not\nconform to the restrictions, <b>pcre_exec()</b> returned the error code\nPCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The\nPCRE_INFO_OKPARTIAL call to <b>pcre_fullinfo()</b> to find out if a compiled\npattern can be used for partial matching now always returns 1.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a><br>\n<P>\nIf the escape sequence \\P is present in a <b>pcretest</b> data line, the\nPCRE_PARTIAL_SOFT option is used for the match. Here is a run of <b>pcretest</b>\nthat uses the date example quoted above:\n<pre>\n    re&#62; /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n  data&#62; 25jun04\\P\n   0: 25jun04\n   1: jun\n  data&#62; 25dec3\\P\n  Partial match: 23dec3\n  data&#62; 3ju\\P\n  Partial match: 3ju\n  data&#62; 3juj\\P\n  No match\n  data&#62; j\\P\n  No match\n</pre>\nThe first data string is matched completely, so <b>pcretest</b> shows the\nmatched substrings. The remaining four strings do not match the complete\npattern, but the first two are partial matches. Similar output is obtained\nif DFA matching is used.\n</P>\n<P>\nIf the escape sequence \\P is present more than once in a <b>pcretest</b> data\nline, the PCRE_PARTIAL_HARD option is set for the match.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()</a><br>\n<P>\nWhen a partial match has been found using a DFA matching function, it is\npossible to continue the match by providing additional subject data and calling\nthe function again with the same compiled regular expression, this time setting\nthe PCRE_DFA_RESTART option. You must pass the same working space as before,\nbecause this is where details of the previous partial match are stored. Here is\nan example using <b>pcretest</b>, using the \\R escape sequence to set the\nPCRE_DFA_RESTART option (\\D specifies the use of the DFA matching function):\n<pre>\n    re&#62; /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n  data&#62; 23ja\\P\\D\n  Partial match: 23ja\n  data&#62; n05\\R\\D\n   0: n05\n</pre>\nThe first call has \"23ja\" as the subject, and requests partial matching; the\nsecond call has \"n05\" as the subject for the continued (restarted) match.\nNotice that when the match is complete, only the last part is shown; PCRE does\nnot retain the previously partially-matched string. It is up to the calling\nprogram to do that if it needs to.\n</P>\n<P>\nThat means that, for an unanchored pattern, if a continued match fails, it is\nnot possible to try again at a new starting point. All this facility is capable\nof doing is continuing with the previous match attempt. In the previous\nexample, if the second set of data is \"ug23\" the result is no match, even\nthough there would be a match for \"aug23\" if the entire string were given at\nonce. Depending on the application, this may or may not be what you want.\nThe only way to allow for starting again at the next character is to retain the\nmatched part of the subject and try a new complete match.\n</P>\n<P>\nYou can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with\nPCRE_DFA_RESTART to continue partial matching over multiple segments. This\nfacility can be used to pass very long subject strings to the DFA matching\nfunctions.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()</a><br>\n<P>\nFrom release 8.00, the standard matching functions can also be used to do\nmulti-segment matching. Unlike the DFA functions, it is not possible to\nrestart the previous match with a new segment of data. Instead, new data must\nbe added to the previous subject string, and the entire match re-run, starting\nfrom the point where the partial match occurred. Earlier data can be discarded.\n</P>\n<P>\nIt is best to use PCRE_PARTIAL_HARD in this situation, because it does not\ntreat the end of a segment as the end of the subject when matching \\z, \\Z,\n\\b, \\B, and $. Consider an unanchored pattern that matches dates:\n<pre>\n    re&#62; /\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d/\n  data&#62; The date is 23ja\\P\\P\n  Partial match: 23ja\n</pre>\nAt this stage, an application could discard the text preceding \"23ja\", add on\ntext from the next segment, and call the matching function again. Unlike the\nDFA matching functions, the entire matching string must always be available,\nand the complete matching process occurs for each call, so more memory and more\nprocessing time is needed.\n</P>\n<P>\n<b>Note:</b> If the pattern contains lookbehind assertions, or \\K, or starts\nwith \\b or \\B, the string that is returned for a partial match includes\ncharacters that precede the start of what would be returned for a complete\nmatch, because it contains all the characters that were inspected during the\npartial match.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">ISSUES WITH MULTI-SEGMENT MATCHING</a><br>\n<P>\nCertain types of pattern may give problems with multi-segment matching,\nwhichever matching function is used.\n</P>\n<P>\n1. If the pattern contains a test for the beginning of a line, you need to pass\nthe PCRE_NOTBOL option when the subject string for any call does start at the\nbeginning of a line. There is also a PCRE_NOTEOL option, but in practice when\ndoing multi-segment matching you should be using PCRE_PARTIAL_HARD, which\nincludes the effect of PCRE_NOTEOL.\n</P>\n<P>\n2. Lookbehind assertions that have already been obeyed are catered for in the\noffsets that are returned for a partial match. However a lookbehind assertion\nlater in the pattern could require even earlier characters to be inspected. You\ncan handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the\n<b>pcre_fullinfo()</b> or <b>pcre[16|32]_fullinfo()</b> functions to obtain the\nlength of the longest lookbehind in the pattern. This length is given in\ncharacters, not bytes. If you always retain at least that many characters\nbefore the partially matched string, all should be well. (Of course, near the\nstart of the subject, fewer characters may be present; in that case all\ncharacters should be retained.)\n</P>\n<P>\nFrom release 8.33, there is a more accurate way of deciding which characters to\nretain. Instead of subtracting the length of the longest lookbehind from the\nearliest inspected character (<i>offsets[0]</i>), the match start position\n(<i>offsets[2]</i>) should be used, and the next match attempt started at the\n<i>offsets[2]</i> character by setting the <i>startoffset</i> argument of\n<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>.\n</P>\n<P>\nFor example, if the pattern \"(?&#60;=123)abc\" is partially\nmatched against the string \"xx123a\", the three offset values returned are 2, 6,\nand 5. This indicates that the matching process that gave a partial match\nstarted at offset 5, but the characters \"123a\" were all inspected. The maximum\nlookbehind for that pattern is 3, so taking that away from 5 shows that we need\nonly keep \"123a\", and the next match attempt can be started at offset 3 (that\nis, at \"a\") when further characters have been added. When the match start is\nnot the earliest inspected character, <b>pcretest</b> shows it explicitly:\n<pre>\n    re&#62; \"(?&#60;=123)abc\"\n  data&#62; xx123a\\P\\P\n  Partial match at offset 5: 123a\n</PRE>\n</P>\n<P>\n3. Because a partial match must always contain at least one character, what\nmight be considered a partial match of an empty string actually gives a \"no\nmatch\" result. For example:\n<pre>\n    re&#62; /c(?&#60;=abc)x/\n  data&#62; ab\\P\n  No match\n</pre>\nIf the next segment begins \"cx\", a match should be found, but this will only\nhappen if characters from the previous segment are retained. For this reason, a\n\"no match\" result should be interpreted as \"partial match of an empty string\"\nwhen the pattern contains lookbehinds.\n</P>\n<P>\n4. Matching a subject string that is split into multiple segments may not\nalways produce exactly the same result as matching over one single long string,\nespecially when PCRE_PARTIAL_SOFT is used. The section \"Partial Matching and\nWord Boundaries\" above describes an issue that arises if the pattern ends with\n\\b or \\B. Another kind of difference may occur when there are multiple\nmatching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result\nis given only when there are no completed matches. This means that as soon as\nthe shortest match has been found, continuation to a new subject segment is no\nlonger possible. Consider again this <b>pcretest</b> example:\n<pre>\n    re&#62; /dog(sbody)?/\n  data&#62; dogsb\\P\n   0: dog\n  data&#62; do\\P\\D\n  Partial match: do\n  data&#62; gsb\\R\\P\\D\n   0: g\n  data&#62; dogsbody\\D\n   0: dogsbody\n   1: dog\n</pre>\nThe first data line passes the string \"dogsb\" to a standard matching function,\nsetting the PCRE_PARTIAL_SOFT option. Although the string is a partial match\nfor \"dogsbody\", the result is not PCRE_ERROR_PARTIAL, because the shorter\nstring \"dog\" is a complete match. Similarly, when the subject is presented to\na DFA matching function in several parts (\"do\" and \"gsb\" being the first two)\nthe match stops when \"dog\" has been found, and it is not possible to continue.\nOn the other hand, if \"dogsbody\" is presented as a single string, a DFA\nmatching function finds both matches.\n</P>\n<P>\nBecause of these problems, it is best to use PCRE_PARTIAL_HARD when matching\nmulti-segment data. The example above then behaves differently:\n<pre>\n    re&#62; /dog(sbody)?/\n  data&#62; dogsb\\P\\P\n  Partial match: dogsb\n  data&#62; do\\P\\D\n  Partial match: do\n  data&#62; gsb\\R\\P\\P\\D\n  Partial match: gsb\n</pre>\n5. Patterns that contain alternatives at the top level which do not all start\nwith the same pattern item may not work as expected when PCRE_DFA_RESTART is\nused. For example, consider this pattern:\n<pre>\n  1234|3789\n</pre>\nIf the first part of the subject is \"ABC123\", a partial match of the first\nalternative is found at offset 3. There is no partial match for the second\nalternative, because such a match does not start at the same point in the\nsubject string. Attempting to continue with the string \"7890\" does not yield a\nmatch because only those alternatives that match at one point in the subject\nare remembered. The problem arises because the start of the second alternative\nmatches within the first alternative. There is no problem with anchored\npatterns or patterns such as:\n<pre>\n  1234|ABCD\n</pre>\nwhere no string can be a partial match for both alternatives. This is not a\nproblem if a standard matching function is used, because the entire match has\nto be rerun each time:\n<pre>\n    re&#62; /1234|3789/\n  data&#62; ABC123\\P\\P\n  Partial match: 123\n  data&#62; 1237890\n   0: 3789\n</pre>\nOf course, instead of using PCRE_DFA_RESTART, the same technique of re-running\nthe entire match can also be used with the DFA matching functions. Another\npossibility is to work with two buffers. If a partial match at offset <i>n</i>\nin the first buffer is followed by \"no match\" when PCRE_DFA_RESTART is used on\nthe second buffer, you can then try a new match starting at offset <i>n+1</i> in\nthe first buffer.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 02 July 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrepattern.html",
    "content": "<html>\n<head>\n<title>pcrepattern specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrepattern man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE REGULAR EXPRESSION DETAILS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">SPECIAL START-OF-PATTERN ITEMS</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">EBCDIC CHARACTER CODES</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">CHARACTERS AND METACHARACTERS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">BACKSLASH</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">CIRCUMFLEX AND DOLLAR</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">FULL STOP (PERIOD, DOT) AND \\N</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">MATCHING A SINGLE DATA UNIT</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">SQUARE BRACKETS AND CHARACTER CLASSES</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">POSIX CHARACTER CLASSES</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">COMPATIBILITY FEATURE FOR WORD BOUNDARIES</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">VERTICAL BAR</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">INTERNAL OPTION SETTING</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">SUBPATTERNS</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">DUPLICATE SUBPATTERN NUMBERS</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">NAMED SUBPATTERNS</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">REPETITION</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">BACK REFERENCES</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">ASSERTIONS</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">CONDITIONAL SUBPATTERNS</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">COMMENTS</a>\n<li><a name=\"TOC23\" href=\"#SEC23\">RECURSIVE PATTERNS</a>\n<li><a name=\"TOC24\" href=\"#SEC24\">SUBPATTERNS AS SUBROUTINES</a>\n<li><a name=\"TOC25\" href=\"#SEC25\">ONIGURUMA SUBROUTINE SYNTAX</a>\n<li><a name=\"TOC26\" href=\"#SEC26\">CALLOUTS</a>\n<li><a name=\"TOC27\" href=\"#SEC27\">BACKTRACKING CONTROL</a>\n<li><a name=\"TOC28\" href=\"#SEC28\">SEE ALSO</a>\n<li><a name=\"TOC29\" href=\"#SEC29\">AUTHOR</a>\n<li><a name=\"TOC30\" href=\"#SEC30\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE REGULAR EXPRESSION DETAILS</a><br>\n<P>\nThe syntax and semantics of the regular expressions that are supported by PCRE\nare described in detail below. There is a quick-reference syntax summary in the\n<a href=\"pcresyntax.html\"><b>pcresyntax</b></a>\npage. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE\nalso supports some alternative regular expression syntax (which does not\nconflict with the Perl syntax) in order to provide some compatibility with\nregular expressions in Python, .NET, and Oniguruma.\n</P>\n<P>\nPerl's regular expressions are described in its own documentation, and\nregular expressions in general are covered in a number of books, some of which\nhave copious examples. Jeffrey Friedl's \"Mastering Regular Expressions\",\npublished by O'Reilly, covers regular expressions in great detail. This\ndescription of PCRE's regular expressions is intended as reference material.\n</P>\n<P>\nThis document discusses the patterns that are supported by PCRE when one its\nmain matching functions, <b>pcre_exec()</b> (8-bit) or <b>pcre[16|32]_exec()</b>\n(16- or 32-bit), is used. PCRE also has alternative matching functions,\n<b>pcre_dfa_exec()</b> and <b>pcre[16|32_dfa_exec()</b>, which match using a\ndifferent algorithm that is not Perl-compatible. Some of the features discussed\nbelow are not available when DFA matching is used. The advantages and\ndisadvantages of the alternative functions, and how they differ from the normal\nfunctions, are discussed in the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\npage.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">SPECIAL START-OF-PATTERN ITEMS</a><br>\n<P>\nA number of options that can be passed to <b>pcre_compile()</b> can also be set\nby special items at the start of a pattern. These are not Perl-compatible, but\nare provided to make these options accessible to pattern writers who are not\nable to change the program that processes the pattern. Any number of these\nitems may appear, but they must all be together right at the start of the\npattern string, and the letters must be in upper case.\n</P>\n<br><b>\nUTF support\n</b><br>\n<P>\nThe original operation of PCRE was on strings of one-byte characters. However,\nthere is now also support for UTF-8 strings in the original library, an\nextra library that supports 16-bit and UTF-16 character strings, and a\nthird library that supports 32-bit and UTF-32 character strings. To use these\nfeatures, PCRE must be built to include appropriate support. When using UTF\nstrings you must either call the compiling function with the PCRE_UTF8,\nPCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of\nthese special sequences:\n<pre>\n  (*UTF8)\n  (*UTF16)\n  (*UTF32)\n  (*UTF)\n</pre>\n(*UTF) is a generic sequence that can be used with any of the libraries.\nStarting a pattern with such a sequence is equivalent to setting the relevant\noption. How setting a UTF mode affects pattern matching is mentioned in several\nplaces below. There is also a summary of features in the\n<a href=\"pcreunicode.html\"><b>pcreunicode</b></a>\npage.\n</P>\n<P>\nSome applications that allow their users to supply patterns may wish to\nrestrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF\noption is set at compile time, (*UTF) etc. are not allowed, and their\nappearance causes an error.\n</P>\n<br><b>\nUnicode property support\n</b><br>\n<P>\nAnother special sequence that may appear at the start of a pattern is (*UCP).\nThis has the same effect as setting the PCRE_UCP option: it causes sequences\nsuch as \\d and \\w to use Unicode properties to determine character types,\ninstead of recognizing only characters with codes less than 128 via a lookup\ntable.\n</P>\n<br><b>\nDisabling auto-possessification\n</b><br>\n<P>\nIf a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting\nthe PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making\nquantifiers possessive when what follows cannot match the repeated item. For\nexample, by default a+b is treated as a++b. For more details, see the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<br><b>\nDisabling start-up optimizations\n</b><br>\n<P>\nIf a pattern starts with (*NO_START_OPT), it has the same effect as setting the\nPCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables\nseveral optimizations for quickly reaching \"no match\" results. For more\ndetails, see the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n<a name=\"newlines\"></a></P>\n<br><b>\nNewline conventions\n</b><br>\n<P>\nPCRE supports five different conventions for indicating line breaks in\nstrings: a single CR (carriage return) character, a single LF (linefeed)\ncharacter, the two-character sequence CRLF, any of the three preceding, or any\nUnicode newline sequence. The\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage has\n<a href=\"pcreapi.html#newlines\">further discussion</a>\nabout newlines, and shows how to set the newline convention in the\n<i>options</i> arguments for the compiling and matching functions.\n</P>\n<P>\nIt is also possible to specify a newline convention by starting a pattern\nstring with one of the following five sequences:\n<pre>\n  (*CR)        carriage return\n  (*LF)        linefeed\n  (*CRLF)      carriage return, followed by linefeed\n  (*ANYCRLF)   any of the three above\n  (*ANY)       all Unicode newline sequences\n</pre>\nThese override the default and the options given to the compiling function. For\nexample, on a Unix system where LF is the default newline sequence, the pattern\n<pre>\n  (*CR)a.b\n</pre>\nchanges the convention to CR. That pattern matches \"a\\nb\" because LF is no\nlonger a newline. If more than one of these settings is present, the last one\nis used.\n</P>\n<P>\nThe newline convention affects where the circumflex and dollar assertions are\ntrue. It also affects the interpretation of the dot metacharacter when\nPCRE_DOTALL is not set, and the behaviour of \\N. However, it does not affect\nwhat the \\R escape sequence matches. By default, this is any Unicode newline\nsequence, for Perl compatibility. However, this can be changed; see the\ndescription of \\R in the section entitled\n<a href=\"#newlineseq\">\"Newline sequences\"</a>\nbelow. A change of \\R setting can be combined with a change of newline\nconvention.\n</P>\n<br><b>\nSetting match and recursion limits\n</b><br>\n<P>\nThe caller of <b>pcre_exec()</b> can set a limit on the number of times the\ninternal <b>match()</b> function is called and on the maximum depth of\nrecursive calls. These facilities are provided to catch runaway matches that\nare provoked by patterns with huge matching trees (a typical example is a\npattern with nested unlimited repeats) and to avoid running out of system stack\nby too much recursion. When one of these limits is reached, <b>pcre_exec()</b>\ngives an error return. The limits can also be set by items at the start of the\npattern of the form\n<pre>\n  (*LIMIT_MATCH=d)\n  (*LIMIT_RECURSION=d)\n</pre>\nwhere d is any number of decimal digits. However, the value of the setting must\nbe less than the value set (or defaulted) by the caller of <b>pcre_exec()</b>\nfor it to have any effect. In other words, the pattern writer can lower the\nlimits set by the programmer, but not raise them. If there is more than one\nsetting of one of these limits, the lower value is used.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">EBCDIC CHARACTER CODES</a><br>\n<P>\nPCRE can be compiled to run in an environment that uses EBCDIC as its character\ncode rather than ASCII or Unicode (typically a mainframe system). In the\nsections below, character code values are ASCII or Unicode; in an EBCDIC\nenvironment these characters may have different code values, and there are no\ncode points greater than 255.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">CHARACTERS AND METACHARACTERS</a><br>\n<P>\nA regular expression is a pattern that is matched against a subject string from\nleft to right. Most characters stand for themselves in a pattern, and match the\ncorresponding characters in the subject. As a trivial example, the pattern\n<pre>\n  The quick brown fox\n</pre>\nmatches a portion of a subject string that is identical to itself. When\ncaseless matching is specified (the PCRE_CASELESS option), letters are matched\nindependently of case. In a UTF mode, PCRE always understands the concept of\ncase for characters whose values are less than 128, so caseless matching is\nalways possible. For characters with higher values, the concept of case is\nsupported if PCRE is compiled with Unicode property support, but not otherwise.\nIf you want to use caseless matching for characters 128 and above, you must\nensure that PCRE is compiled with Unicode property support as well as with\nUTF support.\n</P>\n<P>\nThe power of regular expressions comes from the ability to include alternatives\nand repetitions in the pattern. These are encoded in the pattern by the use of\n<i>metacharacters</i>, which do not stand for themselves but instead are\ninterpreted in some special way.\n</P>\n<P>\nThere are two different sets of metacharacters: those that are recognized\nanywhere in the pattern except within square brackets, and those that are\nrecognized within square brackets. Outside square brackets, the metacharacters\nare as follows:\n<pre>\n  \\      general escape character with several uses\n  ^      assert start of string (or line, in multiline mode)\n  $      assert end of string (or line, in multiline mode)\n  .      match any character except newline (by default)\n  [      start character class definition\n  |      start of alternative branch\n  (      start subpattern\n  )      end subpattern\n  ?      extends the meaning of (\n         also 0 or 1 quantifier\n         also quantifier minimizer\n  *      0 or more quantifier\n  +      1 or more quantifier\n         also \"possessive quantifier\"\n  {      start min/max quantifier\n</pre>\nPart of a pattern that is in square brackets is called a \"character class\". In\na character class the only metacharacters are:\n<pre>\n  \\      general escape character\n  ^      negate the class, but only if the first character\n  -      indicates character range\n  [      POSIX character class (only if followed by POSIX syntax)\n  ]      terminates the character class\n</pre>\nThe following sections describe the use of each of the metacharacters.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">BACKSLASH</a><br>\n<P>\nThe backslash character has several uses. Firstly, if it is followed by a\ncharacter that is not a number or a letter, it takes away any special meaning\nthat character may have. This use of backslash as an escape character applies\nboth inside and outside character classes.\n</P>\n<P>\nFor example, if you want to match a * character, you write \\* in the pattern.\nThis escaping action applies whether or not the following character would\notherwise be interpreted as a metacharacter, so it is always safe to precede a\nnon-alphanumeric with backslash to specify that it stands for itself. In\nparticular, if you want to match a backslash, you write \\\\.\n</P>\n<P>\nIn a UTF mode, only ASCII numbers and letters have any special meaning after a\nbackslash. All other characters (in particular, those whose codepoints are\ngreater than 127) are treated as literals.\n</P>\n<P>\nIf a pattern is compiled with the PCRE_EXTENDED option, most white space in the\npattern (other than in a character class), and characters between a # outside a\ncharacter class and the next newline, inclusive, are ignored. An escaping\nbackslash can be used to include a white space or # character as part of the\npattern.\n</P>\n<P>\nIf you want to remove the special meaning from a sequence of characters, you\ncan do so by putting them between \\Q and \\E. This is different from Perl in\nthat $ and @ are handled as literals in \\Q...\\E sequences in PCRE, whereas in\nPerl, $ and @ cause variable interpolation. Note the following examples:\n<pre>\n  Pattern            PCRE matches   Perl matches\n\n  \\Qabc$xyz\\E        abc$xyz        abc followed by the contents of $xyz\n  \\Qabc\\$xyz\\E       abc\\$xyz       abc\\$xyz\n  \\Qabc\\E\\$\\Qxyz\\E   abc$xyz        abc$xyz\n</pre>\nThe \\Q...\\E sequence is recognized both inside and outside character classes.\nAn isolated \\E that is not preceded by \\Q is ignored. If \\Q is not followed\nby \\E later in the pattern, the literal interpretation continues to the end of\nthe pattern (that is, \\E is assumed at the end). If the isolated \\Q is inside\na character class, this causes an error, because the character class is not\nterminated.\n<a name=\"digitsafterbackslash\"></a></P>\n<br><b>\nNon-printing characters\n</b><br>\n<P>\nA second use of backslash provides a way of encoding non-printing characters\nin patterns in a visible manner. There is no restriction on the appearance of\nnon-printing characters, apart from the binary zero that terminates a pattern,\nbut when a pattern is being prepared by text editing, it is often easier to use\none of the following escape sequences than the binary character it represents.\nIn an ASCII or Unicode environment, these escapes are as follows:\n<pre>\n  \\a        alarm, that is, the BEL character (hex 07)\n  \\cx       \"control-x\", where x is any ASCII character\n  \\e        escape (hex 1B)\n  \\f        form feed (hex 0C)\n  \\n        linefeed (hex 0A)\n  \\r        carriage return (hex 0D)\n  \\t        tab (hex 09)\n  \\0dd      character with octal code 0dd\n  \\ddd      character with octal code ddd, or back reference\n  \\o{ddd..} character with octal code ddd..\n  \\xhh      character with hex code hh\n  \\x{hhh..} character with hex code hhh.. (non-JavaScript mode)\n  \\uhhhh    character with hex code hhhh (JavaScript mode only)\n</pre>\nThe precise effect of \\cx on ASCII characters is as follows: if x is a lower\ncase letter, it is converted to upper case. Then bit 6 of the character (hex\n40) is inverted. Thus \\cA to \\cZ become hex 01 to hex 1A (A is 41, Z is 5A),\nbut \\c{ becomes hex 3B ({ is 7B), and \\c; becomes hex 7B (; is 3B). If the\ndata item (byte or 16-bit value) following \\c has a value greater than 127, a\ncompile-time error occurs. This locks out non-ASCII characters in all modes.\n</P>\n<P>\nWhen PCRE is compiled in EBCDIC mode, \\a, \\e, \\f, \\n, \\r, and \\t\ngenerate the appropriate EBCDIC code values. The \\c escape is processed\nas specified for Perl in the <b>perlebcdic</b> document. The only characters\nthat are allowed after \\c are A-Z, a-z, or one of @, [, \\, ], ^, _, or ?. Any\nother character provokes a compile-time error. The sequence \\c@ encodes\ncharacter code 0; after \\c the letters (in either case) encode characters 1-26\n(hex 01 to hex 1A); [, \\, ], ^, and _ encode characters 27-31 (hex 1B to hex\n1F), and \\c? becomes either 255 (hex FF) or 95 (hex 5F).\n</P>\n<P>\nThus, apart from \\c?, these escapes generate the same character code values as\nthey do in an ASCII environment, though the meanings of the values mostly\ndiffer. For example, \\cG always generates code value 7, which is BEL in ASCII\nbut DEL in EBCDIC.\n</P>\n<P>\nThe sequence \\c? generates DEL (127, hex 7F) in an ASCII environment, but\nbecause 127 is not a control character in EBCDIC, Perl makes it generate the\nAPC character. Unfortunately, there are several variants of EBCDIC. In most of\nthem the APC character has the value 255 (hex FF), but in the one Perl calls\nPOSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC\nvalues, PCRE makes \\c? generate 95; otherwise it generates 255.\n</P>\n<P>\nAfter \\0 up to two further octal digits are read. If there are fewer than two\ndigits, just those that are present are used. Thus the sequence \\0\\x\\015\nspecifies two binary zeros followed by a CR character (code value 13). Make\nsure you supply two digits after the initial zero if the pattern character that\nfollows is itself an octal digit.\n</P>\n<P>\nThe escape \\o must be followed by a sequence of octal digits, enclosed in\nbraces. An error occurs if this is not the case. This escape is a recent\naddition to Perl; it provides way of specifying character code points as octal\nnumbers greater than 0777, and it also allows octal numbers and back references\nto be unambiguously specified.\n</P>\n<P>\nFor greater clarity and unambiguity, it is best to avoid following \\ by a\ndigit greater than zero. Instead, use \\o{} or \\x{} to specify character\nnumbers, and \\g{} to specify back references. The following paragraphs\ndescribe the old, ambiguous syntax.\n</P>\n<P>\nThe handling of a backslash followed by a digit other than 0 is complicated,\nand Perl has changed in recent releases, causing PCRE also to change. Outside a\ncharacter class, PCRE reads the digit and any following digits as a decimal\nnumber. If the number is less than 8, or if there have been at least that many\nprevious capturing left parentheses in the expression, the entire sequence is\ntaken as a <i>back reference</i>. A description of how this works is given\n<a href=\"#backreferences\">later,</a>\nfollowing the discussion of\n<a href=\"#subpattern\">parenthesized subpatterns.</a>\n</P>\n<P>\nInside a character class, or if the decimal number following \\ is greater than\n7 and there have not been that many capturing subpatterns, PCRE handles \\8 and\n\\9 as the literal characters \"8\" and \"9\", and otherwise re-reads up to three\noctal digits following the backslash, using them to generate a data character.\nAny subsequent digits stand for themselves. For example:\n<pre>\n  \\040   is another way of writing an ASCII space\n  \\40    is the same, provided there are fewer than 40 previous capturing subpatterns\n  \\7     is always a back reference\n  \\11    might be a back reference, or another way of writing a tab\n  \\011   is always a tab\n  \\0113  is a tab followed by the character \"3\"\n  \\113   might be a back reference, otherwise the character with octal code 113\n  \\377   might be a back reference, otherwise the value 255 (decimal)\n  \\81    is either a back reference, or the two characters \"8\" and \"1\"\n</pre>\nNote that octal values of 100 or greater that are specified using this syntax\nmust not be introduced by a leading zero, because no more than three octal\ndigits are ever read.\n</P>\n<P>\nBy default, after \\x that is not followed by {, from zero to two hexadecimal\ndigits are read (letters can be in upper or lower case). Any number of\nhexadecimal digits may appear between \\x{ and }. If a character other than\na hexadecimal digit appears between \\x{ and }, or if there is no terminating\n}, an error occurs.\n</P>\n<P>\nIf the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \\x is\nas just described only when it is followed by two hexadecimal digits.\nOtherwise, it matches a literal \"x\" character. In JavaScript mode, support for\ncode points greater than 256 is provided by \\u, which must be followed by\nfour hexadecimal digits; otherwise it matches a literal \"u\" character.\n</P>\n<P>\nCharacters whose value is less than 256 can be defined by either of the two\nsyntaxes for \\x (or by \\u in JavaScript mode). There is no difference in the\nway they are handled. For example, \\xdc is exactly the same as \\x{dc} (or\n\\u00dc in JavaScript mode).\n</P>\n<br><b>\nConstraints on character values\n</b><br>\n<P>\nCharacters that are specified using octal or hexadecimal numbers are\nlimited to certain values, as follows:\n<pre>\n  8-bit non-UTF mode    less than 0x100\n  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint\n  16-bit non-UTF mode   less than 0x10000\n  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint\n  32-bit non-UTF mode   less than 0x100000000\n  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint\n</pre>\nInvalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called\n\"surrogate\" codepoints), and 0xffef.\n</P>\n<br><b>\nEscape sequences in character classes\n</b><br>\n<P>\nAll the sequences that define a single character value can be used both inside\nand outside character classes. In addition, inside a character class, \\b is\ninterpreted as the backspace character (hex 08).\n</P>\n<P>\n\\N is not allowed in a character class. \\B, \\R, and \\X are not special\ninside a character class. Like other unrecognized escape sequences, they are\ntreated as the literal characters \"B\", \"R\", and \"X\" by default, but cause an\nerror if the PCRE_EXTRA option is set. Outside a character class, these\nsequences have different meanings.\n</P>\n<br><b>\nUnsupported escape sequences\n</b><br>\n<P>\nIn Perl, the sequences \\l, \\L, \\u, and \\U are recognized by its string\nhandler and used to modify the case of following characters. By default, PCRE\ndoes not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT\noption is set, \\U matches a \"U\" character, and \\u can be used to define a\ncharacter by code point, as described in the previous section.\n</P>\n<br><b>\nAbsolute and relative back references\n</b><br>\n<P>\nThe sequence \\g followed by an unsigned or a negative number, optionally\nenclosed in braces, is an absolute or relative back reference. A named back\nreference can be coded as \\g{name}. Back references are discussed\n<a href=\"#backreferences\">later,</a>\nfollowing the discussion of\n<a href=\"#subpattern\">parenthesized subpatterns.</a>\n</P>\n<br><b>\nAbsolute and relative subroutine calls\n</b><br>\n<P>\nFor compatibility with Oniguruma, the non-Perl syntax \\g followed by a name or\na number enclosed either in angle brackets or single quotes, is an alternative\nsyntax for referencing a subpattern as a \"subroutine\". Details are discussed\n<a href=\"#onigurumasubroutines\">later.</a>\nNote that \\g{...} (Perl syntax) and \\g&#60;...&#62; (Oniguruma syntax) are <i>not</i>\nsynonymous. The former is a back reference; the latter is a\n<a href=\"#subpatternsassubroutines\">subroutine</a>\ncall.\n<a name=\"genericchartypes\"></a></P>\n<br><b>\nGeneric character types\n</b><br>\n<P>\nAnother use of backslash is for specifying generic character types:\n<pre>\n  \\d     any decimal digit\n  \\D     any character that is not a decimal digit\n  \\h     any horizontal white space character\n  \\H     any character that is not a horizontal white space character\n  \\s     any white space character\n  \\S     any character that is not a white space character\n  \\v     any vertical white space character\n  \\V     any character that is not a vertical white space character\n  \\w     any \"word\" character\n  \\W     any \"non-word\" character\n</pre>\nThere is also the single sequence \\N, which matches a non-newline character.\nThis is the same as\n<a href=\"#fullstopdot\">the \".\" metacharacter</a>\nwhen PCRE_DOTALL is not set. Perl also uses \\N to match characters by name;\nPCRE does not support this.\n</P>\n<P>\nEach pair of lower and upper case escape sequences partitions the complete set\nof characters into two disjoint sets. Any given character matches one, and only\none, of each pair. The sequences can appear both inside and outside character\nclasses. They each match one character of the appropriate type. If the current\nmatching point is at the end of the subject string, all of them fail, because\nthere is no character to match.\n</P>\n<P>\nFor compatibility with Perl, \\s did not used to match the VT character (code\n11), which made it different from the the POSIX \"space\" class. However, Perl\nadded VT at release 5.18, and PCRE followed suit at release 8.34. The default\n\\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space\n(32), which are defined as white space in the \"C\" locale. This list may vary if\nlocale-specific matching is taking place. For example, in some locales the\n\"non-breaking space\" character (\\xA0) is recognized as white space, and in\nothers the VT character is not.\n</P>\n<P>\nA \"word\" character is an underscore or any character that is a letter or digit.\nBy default, the definition of letters and digits is controlled by PCRE's\nlow-valued character tables, and may vary if locale-specific matching is taking\nplace (see\n<a href=\"pcreapi.html#localesupport\">\"Locale support\"</a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage). For example, in a French locale such as \"fr_FR\" in Unix-like systems,\nor \"french\" in Windows, some character codes greater than 127 are used for\naccented letters, and these are then matched by \\w. The use of locales with\nUnicode is discouraged.\n</P>\n<P>\nBy default, characters whose code points are greater than 127 never match \\d,\n\\s, or \\w, and always match \\D, \\S, and \\W, although this may vary for\ncharacters in the range 128-255 when locale-specific matching is happening.\nThese escape sequences retain their original meanings from before Unicode\nsupport was available, mainly for efficiency reasons. If PCRE is compiled with\nUnicode property support, and the PCRE_UCP option is set, the behaviour is\nchanged so that Unicode properties are used to determine character types, as\nfollows:\n<pre>\n  \\d  any character that matches \\p{Nd} (decimal digit)\n  \\s  any character that matches \\p{Z} or \\h or \\v\n  \\w  any character that matches \\p{L} or \\p{N}, plus underscore\n</pre>\nThe upper case escapes match the inverse sets of characters. Note that \\d\nmatches only decimal digits, whereas \\w matches any Unicode digit, as well as\nany Unicode letter, and underscore. Note also that PCRE_UCP affects \\b, and\n\\B because they are defined in terms of \\w and \\W. Matching these sequences\nis noticeably slower when PCRE_UCP is set.\n</P>\n<P>\nThe sequences \\h, \\H, \\v, and \\V are features that were added to Perl at\nrelease 5.10. In contrast to the other sequences, which match only ASCII\ncharacters by default, these always match certain high-valued code points,\nwhether or not PCRE_UCP is set. The horizontal space characters are:\n<pre>\n  U+0009     Horizontal tab (HT)\n  U+0020     Space\n  U+00A0     Non-break space\n  U+1680     Ogham space mark\n  U+180E     Mongolian vowel separator\n  U+2000     En quad\n  U+2001     Em quad\n  U+2002     En space\n  U+2003     Em space\n  U+2004     Three-per-em space\n  U+2005     Four-per-em space\n  U+2006     Six-per-em space\n  U+2007     Figure space\n  U+2008     Punctuation space\n  U+2009     Thin space\n  U+200A     Hair space\n  U+202F     Narrow no-break space\n  U+205F     Medium mathematical space\n  U+3000     Ideographic space\n</pre>\nThe vertical space characters are:\n<pre>\n  U+000A     Linefeed (LF)\n  U+000B     Vertical tab (VT)\n  U+000C     Form feed (FF)\n  U+000D     Carriage return (CR)\n  U+0085     Next line (NEL)\n  U+2028     Line separator\n  U+2029     Paragraph separator\n</pre>\nIn 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are\nrelevant.\n<a name=\"newlineseq\"></a></P>\n<br><b>\nNewline sequences\n</b><br>\n<P>\nOutside a character class, by default, the escape sequence \\R matches any\nUnicode newline sequence. In 8-bit non-UTF-8 mode \\R is equivalent to the\nfollowing:\n<pre>\n  (?&#62;\\r\\n|\\n|\\x0b|\\f|\\r|\\x85)\n</pre>\nThis is an example of an \"atomic group\", details of which are given\n<a href=\"#atomicgroup\">below.</a>\nThis particular group matches either the two-character sequence CR followed by\nLF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,\nU+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next\nline, U+0085). The two-character sequence is treated as a single unit that\ncannot be split.\n</P>\n<P>\nIn other modes, two additional characters whose codepoints are greater than 255\nare added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).\nUnicode character property support is not needed for these characters to be\nrecognized.\n</P>\n<P>\nIt is possible to restrict \\R to match only CR, LF, or CRLF (instead of the\ncomplete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF\neither at compile time or when the pattern is matched. (BSR is an abbrevation\nfor \"backslash R\".) This can be made the default when PCRE is built; if this is\nthe case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.\nIt is also possible to specify these settings by starting a pattern string with\none of the following sequences:\n<pre>\n  (*BSR_ANYCRLF)   CR, LF, or CRLF only\n  (*BSR_UNICODE)   any Unicode newline sequence\n</pre>\nThese override the default and the options given to the compiling function, but\nthey can themselves be overridden by options given to a matching function. Note\nthat these special settings, which are not Perl-compatible, are recognized only\nat the very start of a pattern, and that they must be in upper case. If more\nthan one of them is present, the last one is used. They can be combined with a\nchange of newline convention; for example, a pattern can start with:\n<pre>\n  (*ANY)(*BSR_ANYCRLF)\n</pre>\nThey can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or\n(*UCP) special sequences. Inside a character class, \\R is treated as an\nunrecognized escape sequence, and so matches the letter \"R\" by default, but\ncauses an error if PCRE_EXTRA is set.\n<a name=\"uniextseq\"></a></P>\n<br><b>\nUnicode character properties\n</b><br>\n<P>\nWhen PCRE is built with Unicode character property support, three additional\nescape sequences that match characters with specific properties are available.\nWhen in 8-bit non-UTF-8 mode, these sequences are of course limited to testing\ncharacters whose codepoints are less than 256, but they do work in this mode.\nThe extra escape sequences are:\n<pre>\n  \\p{<i>xx</i>}   a character with the <i>xx</i> property\n  \\P{<i>xx</i>}   a character without the <i>xx</i> property\n  \\X       a Unicode extended grapheme cluster\n</pre>\nThe property names represented by <i>xx</i> above are limited to the Unicode\nscript names, the general category properties, \"Any\", which matches any\ncharacter (including newline), and some special PCRE properties (described\nin the\n<a href=\"#extraprops\">next section).</a>\nOther Perl properties such as \"InMusicalSymbols\" are not currently supported by\nPCRE. Note that \\P{Any} does not match any characters, so always causes a\nmatch failure.\n</P>\n<P>\nSets of Unicode characters are defined as belonging to certain scripts. A\ncharacter from one of these sets can be matched using a script name. For\nexample:\n<pre>\n  \\p{Greek}\n  \\P{Han}\n</pre>\nThose that are not part of an identified script are lumped together as\n\"Common\". The current list of scripts is:\n</P>\n<P>\nArabic,\nArmenian,\nAvestan,\nBalinese,\nBamum,\nBassa_Vah,\nBatak,\nBengali,\nBopomofo,\nBrahmi,\nBraille,\nBuginese,\nBuhid,\nCanadian_Aboriginal,\nCarian,\nCaucasian_Albanian,\nChakma,\nCham,\nCherokee,\nCommon,\nCoptic,\nCuneiform,\nCypriot,\nCyrillic,\nDeseret,\nDevanagari,\nDuployan,\nEgyptian_Hieroglyphs,\nElbasan,\nEthiopic,\nGeorgian,\nGlagolitic,\nGothic,\nGrantha,\nGreek,\nGujarati,\nGurmukhi,\nHan,\nHangul,\nHanunoo,\nHebrew,\nHiragana,\nImperial_Aramaic,\nInherited,\nInscriptional_Pahlavi,\nInscriptional_Parthian,\nJavanese,\nKaithi,\nKannada,\nKatakana,\nKayah_Li,\nKharoshthi,\nKhmer,\nKhojki,\nKhudawadi,\nLao,\nLatin,\nLepcha,\nLimbu,\nLinear_A,\nLinear_B,\nLisu,\nLycian,\nLydian,\nMahajani,\nMalayalam,\nMandaic,\nManichaean,\nMeetei_Mayek,\nMende_Kikakui,\nMeroitic_Cursive,\nMeroitic_Hieroglyphs,\nMiao,\nModi,\nMongolian,\nMro,\nMyanmar,\nNabataean,\nNew_Tai_Lue,\nNko,\nOgham,\nOl_Chiki,\nOld_Italic,\nOld_North_Arabian,\nOld_Permic,\nOld_Persian,\nOld_South_Arabian,\nOld_Turkic,\nOriya,\nOsmanya,\nPahawh_Hmong,\nPalmyrene,\nPau_Cin_Hau,\nPhags_Pa,\nPhoenician,\nPsalter_Pahlavi,\nRejang,\nRunic,\nSamaritan,\nSaurashtra,\nSharada,\nShavian,\nSiddham,\nSinhala,\nSora_Sompeng,\nSundanese,\nSyloti_Nagri,\nSyriac,\nTagalog,\nTagbanwa,\nTai_Le,\nTai_Tham,\nTai_Viet,\nTakri,\nTamil,\nTelugu,\nThaana,\nThai,\nTibetan,\nTifinagh,\nTirhuta,\nUgaritic,\nVai,\nWarang_Citi,\nYi.\n</P>\n<P>\nEach character has exactly one Unicode general category property, specified by\na two-letter abbreviation. For compatibility with Perl, negation can be\nspecified by including a circumflex between the opening brace and the property\nname. For example, \\p{^Lu} is the same as \\P{Lu}.\n</P>\n<P>\nIf only one letter is specified with \\p or \\P, it includes all the general\ncategory properties that start with that letter. In this case, in the absence\nof negation, the curly brackets in the escape sequence are optional; these two\nexamples have the same effect:\n<pre>\n  \\p{L}\n  \\pL\n</pre>\nThe following general category property codes are supported:\n<pre>\n  C     Other\n  Cc    Control\n  Cf    Format\n  Cn    Unassigned\n  Co    Private use\n  Cs    Surrogate\n\n  L     Letter\n  Ll    Lower case letter\n  Lm    Modifier letter\n  Lo    Other letter\n  Lt    Title case letter\n  Lu    Upper case letter\n\n  M     Mark\n  Mc    Spacing mark\n  Me    Enclosing mark\n  Mn    Non-spacing mark\n\n  N     Number\n  Nd    Decimal number\n  Nl    Letter number\n  No    Other number\n\n  P     Punctuation\n  Pc    Connector punctuation\n  Pd    Dash punctuation\n  Pe    Close punctuation\n  Pf    Final punctuation\n  Pi    Initial punctuation\n  Po    Other punctuation\n  Ps    Open punctuation\n\n  S     Symbol\n  Sc    Currency symbol\n  Sk    Modifier symbol\n  Sm    Mathematical symbol\n  So    Other symbol\n\n  Z     Separator\n  Zl    Line separator\n  Zp    Paragraph separator\n  Zs    Space separator\n</pre>\nThe special property L& is also supported: it matches a character that has\nthe Lu, Ll, or Lt property, in other words, a letter that is not classified as\na modifier or \"other\".\n</P>\n<P>\nThe Cs (Surrogate) property applies only to characters in the range U+D800 to\nU+DFFF. Such characters are not valid in Unicode strings and so\ncannot be tested by PCRE, unless UTF validity checking has been turned off\n(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and\nPCRE_NO_UTF32_CHECK in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\npage). Perl does not support the Cs property.\n</P>\n<P>\nThe long synonyms for property names that Perl supports (such as \\p{Letter})\nare not supported by PCRE, nor is it permitted to prefix any of these\nproperties with \"Is\".\n</P>\n<P>\nNo character that is in the Unicode table has the Cn (unassigned) property.\nInstead, this property is assumed for any code point that is not in the\nUnicode table.\n</P>\n<P>\nSpecifying caseless matching does not affect these escape sequences. For\nexample, \\p{Lu} always matches only upper case letters. This is different from\nthe behaviour of current versions of Perl.\n</P>\n<P>\nMatching characters by Unicode property is not fast, because PCRE has to do a\nmultistage table lookup in order to find a character's property. That is why\nthe traditional escape sequences such as \\d and \\w do not use Unicode\nproperties in PCRE by default, though you can make them do so by setting the\nPCRE_UCP option or by starting the pattern with (*UCP).\n</P>\n<br><b>\nExtended grapheme clusters\n</b><br>\n<P>\nThe \\X escape matches any number of Unicode characters that form an \"extended\ngrapheme cluster\", and treats the sequence as an atomic group\n<a href=\"#atomicgroup\">(see below).</a>\nUp to and including release 8.31, PCRE matched an earlier, simpler definition\nthat was equivalent to\n<pre>\n  (?&#62;\\PM\\pM*)\n</pre>\nThat is, it matched a character without the \"mark\" property, followed by zero\nor more characters with the \"mark\" property. Characters with the \"mark\"\nproperty are typically non-spacing accents that affect the preceding character.\n</P>\n<P>\nThis simple definition was extended in Unicode to include more complicated\nkinds of composite character by giving each character a grapheme breaking\nproperty, and creating rules that use these properties to define the boundaries\nof extended grapheme clusters. In releases of PCRE later than 8.31, \\X matches\none of these clusters.\n</P>\n<P>\n\\X always matches at least one character. Then it decides whether to add\nadditional characters according to the following rules for ending a cluster:\n</P>\n<P>\n1. End at the end of the subject string.\n</P>\n<P>\n2. Do not end between CR and LF; otherwise end after any control character.\n</P>\n<P>\n3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters\nare of five types: L, V, T, LV, and LVT. An L character may be followed by an\nL, V, LV, or LVT character; an LV or V character may be followed by a V or T\ncharacter; an LVT or T character may be follwed only by a T character.\n</P>\n<P>\n4. Do not end before extending characters or spacing marks. Characters with\nthe \"mark\" property always have the \"extend\" grapheme breaking property.\n</P>\n<P>\n5. Do not end after prepend characters.\n</P>\n<P>\n6. Otherwise, end the cluster.\n<a name=\"extraprops\"></a></P>\n<br><b>\nPCRE's additional properties\n</b><br>\n<P>\nAs well as the standard Unicode properties described above, PCRE supports four\nmore that make it possible to convert traditional escape sequences such as \\w\nand \\s to use Unicode properties. PCRE uses these non-standard, non-Perl\nproperties internally when PCRE_UCP is set. However, they may also be used\nexplicitly. These properties are:\n<pre>\n  Xan   Any alphanumeric character\n  Xps   Any POSIX space character\n  Xsp   Any Perl space character\n  Xwd   Any Perl \"word\" character\n</pre>\nXan matches characters that have either the L (letter) or the N (number)\nproperty. Xps matches the characters tab, linefeed, vertical tab, form feed, or\ncarriage return, and any other character that has the Z (separator) property.\nXsp is the same as Xps; it used to exclude vertical tab, for Perl\ncompatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd\nmatches the same characters as Xan, plus underscore.\n</P>\n<P>\nThere is another non-standard property, Xuc, which matches any character that\ncan be represented by a Universal Character Name in C++ and other programming\nlanguages. These are the characters $, @, ` (grave accent), and all characters\nwith Unicode code points greater than or equal to U+00A0, except for the\nsurrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are\nexcluded. (Universal Character Names are of the form \\uHHHH or \\UHHHHHHHH\nwhere H is a hexadecimal digit. Note that the Xuc property does not match these\nsequences but the characters that they represent.)\n<a name=\"resetmatchstart\"></a></P>\n<br><b>\nResetting the match start\n</b><br>\n<P>\nThe escape sequence \\K causes any previously matched characters not to be\nincluded in the final matched sequence. For example, the pattern:\n<pre>\n  foo\\Kbar\n</pre>\nmatches \"foobar\", but reports that it has matched \"bar\". This feature is\nsimilar to a lookbehind assertion\n<a href=\"#lookbehind\">(described below).</a>\nHowever, in this case, the part of the subject before the real match does not\nhave to be of fixed length, as lookbehind assertions do. The use of \\K does\nnot interfere with the setting of\n<a href=\"#subpattern\">captured substrings.</a>\nFor example, when the pattern\n<pre>\n  (foo)\\Kbar\n</pre>\nmatches \"foobar\", the first substring is still set to \"foo\".\n</P>\n<P>\nPerl documents that the use of \\K within assertions is \"not well defined\". In\nPCRE, \\K is acted upon when it occurs inside positive assertions, but is\nignored in negative assertions. Note that when a pattern such as (?=ab\\K)\nmatches, the reported start of the match can be greater than the end of the\nmatch.\n<a name=\"smallassertions\"></a></P>\n<br><b>\nSimple assertions\n</b><br>\n<P>\nThe final use of backslash is for certain simple assertions. An assertion\nspecifies a condition that has to be met at a particular point in a match,\nwithout consuming any characters from the subject string. The use of\nsubpatterns for more complicated assertions is described\n<a href=\"#bigassertions\">below.</a>\nThe backslashed assertions are:\n<pre>\n  \\b     matches at a word boundary\n  \\B     matches when not at a word boundary\n  \\A     matches at the start of the subject\n  \\Z     matches at the end of the subject\n          also matches before a newline at the end of the subject\n  \\z     matches only at the end of the subject\n  \\G     matches at the first matching position in the subject\n</pre>\nInside a character class, \\b has a different meaning; it matches the backspace\ncharacter. If any other of these assertions appears in a character class, by\ndefault it matches the corresponding literal character (for example, \\B\nmatches the letter B). However, if the PCRE_EXTRA option is set, an \"invalid\nescape sequence\" error is generated instead.\n</P>\n<P>\nA word boundary is a position in the subject string where the current character\nand the previous character do not both match \\w or \\W (i.e. one matches\n\\w and the other matches \\W), or the start or end of the string if the\nfirst or last character matches \\w, respectively. In a UTF mode, the meanings\nof \\w and \\W can be changed by setting the PCRE_UCP option. When this is\ndone, it also affects \\b and \\B. Neither PCRE nor Perl has a separate \"start\nof word\" or \"end of word\" metasequence. However, whatever follows \\b normally\ndetermines which it is. For example, the fragment \\ba matches \"a\" at the start\nof a word.\n</P>\n<P>\nThe \\A, \\Z, and \\z assertions differ from the traditional circumflex and\ndollar (described in the next section) in that they only ever match at the very\nstart and end of the subject string, whatever options are set. Thus, they are\nindependent of multiline mode. These three assertions are not affected by the\nPCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the\ncircumflex and dollar metacharacters. However, if the <i>startoffset</i>\nargument of <b>pcre_exec()</b> is non-zero, indicating that matching is to start\nat a point other than the beginning of the subject, \\A can never match. The\ndifference between \\Z and \\z is that \\Z matches before a newline at the end\nof the string as well as at the very end, whereas \\z matches only at the end.\n</P>\n<P>\nThe \\G assertion is true only when the current matching position is at the\nstart point of the match, as specified by the <i>startoffset</i> argument of\n<b>pcre_exec()</b>. It differs from \\A when the value of <i>startoffset</i> is\nnon-zero. By calling <b>pcre_exec()</b> multiple times with appropriate\narguments, you can mimic Perl's /g option, and it is in this kind of\nimplementation where \\G can be useful.\n</P>\n<P>\nNote, however, that PCRE's interpretation of \\G, as the start of the current\nmatch, is subtly different from Perl's, which defines it as the end of the\nprevious match. In Perl, these can be different when the previously matched\nstring was empty. Because PCRE does just one match at a time, it cannot\nreproduce this behaviour.\n</P>\n<P>\nIf all the alternatives of a pattern begin with \\G, the expression is anchored\nto the starting match position, and the \"anchored\" flag is set in the compiled\nregular expression.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">CIRCUMFLEX AND DOLLAR</a><br>\n<P>\nThe circumflex and dollar metacharacters are zero-width assertions. That is,\nthey test for a particular condition being true without consuming any\ncharacters from the subject string.\n</P>\n<P>\nOutside a character class, in the default matching mode, the circumflex\ncharacter is an assertion that is true only if the current matching point is at\nthe start of the subject string. If the <i>startoffset</i> argument of\n<b>pcre_exec()</b> is non-zero, circumflex can never match if the PCRE_MULTILINE\noption is unset. Inside a character class, circumflex has an entirely different\nmeaning\n<a href=\"#characterclass\">(see below).</a>\n</P>\n<P>\nCircumflex need not be the first character of the pattern if a number of\nalternatives are involved, but it should be the first thing in each alternative\nin which it appears if the pattern is ever to match that branch. If all\npossible alternatives start with a circumflex, that is, if the pattern is\nconstrained to match only at the start of the subject, it is said to be an\n\"anchored\" pattern. (There are also other constructs that can cause a pattern\nto be anchored.)\n</P>\n<P>\nThe dollar character is an assertion that is true only if the current matching\npoint is at the end of the subject string, or immediately before a newline at\nthe end of the string (by default). Note, however, that it does not actually\nmatch the newline. Dollar need not be the last character of the pattern if a\nnumber of alternatives are involved, but it should be the last item in any\nbranch in which it appears. Dollar has no special meaning in a character class.\n</P>\n<P>\nThe meaning of dollar can be changed so that it matches only at the very end of\nthe string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This\ndoes not affect the \\Z assertion.\n</P>\n<P>\nThe meanings of the circumflex and dollar characters are changed if the\nPCRE_MULTILINE option is set. When this is the case, a circumflex matches\nimmediately after internal newlines as well as at the start of the subject\nstring. It does not match after a newline that ends the string. A dollar\nmatches before any newlines in the string, as well as at the very end, when\nPCRE_MULTILINE is set. When newline is specified as the two-character\nsequence CRLF, isolated CR and LF characters do not indicate newlines.\n</P>\n<P>\nFor example, the pattern /^abc$/ matches the subject string \"def\\nabc\" (where\n\\n represents a newline) in multiline mode, but not otherwise. Consequently,\npatterns that are anchored in single line mode because all branches start with\n^ are not anchored in multiline mode, and a match for circumflex is possible\nwhen the <i>startoffset</i> argument of <b>pcre_exec()</b> is non-zero. The\nPCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.\n</P>\n<P>\nNote that the sequences \\A, \\Z, and \\z can be used to match the start and\nend of the subject in both modes, and if all branches of a pattern start with\n\\A it is always anchored, whether or not PCRE_MULTILINE is set.\n<a name=\"fullstopdot\"></a></P>\n<br><a name=\"SEC7\" href=\"#TOC1\">FULL STOP (PERIOD, DOT) AND \\N</a><br>\n<P>\nOutside a character class, a dot in the pattern matches any one character in\nthe subject string except (by default) a character that signifies the end of a\nline.\n</P>\n<P>\nWhen a line ending is defined as a single character, dot never matches that\ncharacter; when the two-character sequence CRLF is used, dot does not match CR\nif it is immediately followed by LF, but otherwise it matches all characters\n(including isolated CRs and LFs). When any Unicode line endings are being\nrecognized, dot does not match CR or LF or any of the other line ending\ncharacters.\n</P>\n<P>\nThe behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL\noption is set, a dot matches any one character, without exception. If the\ntwo-character sequence CRLF is present in the subject string, it takes two dots\nto match it.\n</P>\n<P>\nThe handling of dot is entirely independent of the handling of circumflex and\ndollar, the only relationship being that they both involve newlines. Dot has no\nspecial meaning in a character class.\n</P>\n<P>\nThe escape sequence \\N behaves like a dot, except that it is not affected by\nthe PCRE_DOTALL option. In other words, it matches any character except one\nthat signifies the end of a line. Perl also uses \\N to match characters by\nname; PCRE does not support this.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">MATCHING A SINGLE DATA UNIT</a><br>\n<P>\nOutside a character class, the escape sequence \\C matches any one data unit,\nwhether or not a UTF mode is set. In the 8-bit library, one data unit is one\nbyte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is\na 32-bit unit. Unlike a dot, \\C always\nmatches line-ending characters. The feature is provided in Perl in order to\nmatch individual bytes in UTF-8 mode, but it is unclear how it can usefully be\nused. Because \\C breaks up characters into individual data units, matching one\nunit with \\C in a UTF mode means that the rest of the string may start with a\nmalformed UTF character. This has undefined results, because PCRE assumes that\nit is dealing with valid UTF strings (and by default it checks this at the\nstart of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or\nPCRE_NO_UTF32_CHECK option is used).\n</P>\n<P>\nPCRE does not allow \\C to appear in lookbehind assertions\n<a href=\"#lookbehind\">(described below)</a>\nin a UTF mode, because this would make it impossible to calculate the length of\nthe lookbehind.\n</P>\n<P>\nIn general, the \\C escape sequence is best avoided. However, one\nway of using it that avoids the problem of malformed UTF characters is to use a\nlookahead to check the length of the next character, as in this pattern, which\ncould be used with a UTF-8 string (ignore white space and line breaks):\n<pre>\n  (?| (?=[\\x00-\\x7f])(\\C) |\n      (?=[\\x80-\\x{7ff}])(\\C)(\\C) |\n      (?=[\\x{800}-\\x{ffff}])(\\C)(\\C)(\\C) |\n      (?=[\\x{10000}-\\x{1fffff}])(\\C)(\\C)(\\C)(\\C))\n</pre>\nA group that starts with (?| resets the capturing parentheses numbers in each\nalternative (see\n<a href=\"#dupsubpatternnumber\">\"Duplicate Subpattern Numbers\"</a>\nbelow). The assertions at the start of each branch check the next UTF-8\ncharacter for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The\ncharacter's individual bytes are then captured by the appropriate number of\ngroups.\n<a name=\"characterclass\"></a></P>\n<br><a name=\"SEC9\" href=\"#TOC1\">SQUARE BRACKETS AND CHARACTER CLASSES</a><br>\n<P>\nAn opening square bracket introduces a character class, terminated by a closing\nsquare bracket. A closing square bracket on its own is not special by default.\nHowever, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square\nbracket causes a compile-time error. If a closing square bracket is required as\na member of the class, it should be the first data character in the class\n(after an initial circumflex, if present) or escaped with a backslash.\n</P>\n<P>\nA character class matches a single character in the subject. In a UTF mode, the\ncharacter may be more than one data unit long. A matched character must be in\nthe set of characters defined by the class, unless the first character in the\nclass definition is a circumflex, in which case the subject character must not\nbe in the set defined by the class. If a circumflex is actually required as a\nmember of the class, ensure it is not the first character, or escape it with a\nbackslash.\n</P>\n<P>\nFor example, the character class [aeiou] matches any lower case vowel, while\n[^aeiou] matches any character that is not a lower case vowel. Note that a\ncircumflex is just a convenient notation for specifying the characters that\nare in the class by enumerating those that are not. A class that starts with a\ncircumflex is not an assertion; it still consumes a character from the subject\nstring, and therefore it fails if the current pointer is at the end of the\nstring.\n</P>\n<P>\nIn UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff)\ncan be included in a class as a literal string of data units, or by using the\n\\x{ escaping mechanism.\n</P>\n<P>\nWhen caseless matching is set, any letters in a class represent both their\nupper case and lower case versions, so for example, a caseless [aeiou] matches\n\"A\" as well as \"a\", and a caseless [^aeiou] does not match \"A\", whereas a\ncaseful version would. In a UTF mode, PCRE always understands the concept of\ncase for characters whose values are less than 128, so caseless matching is\nalways possible. For characters with higher values, the concept of case is\nsupported if PCRE is compiled with Unicode property support, but not otherwise.\nIf you want to use caseless matching in a UTF mode for characters 128 and\nabove, you must ensure that PCRE is compiled with Unicode property support as\nwell as with UTF support.\n</P>\n<P>\nCharacters that might indicate line breaks are never treated in any special way\nwhen matching character classes, whatever line-ending sequence is in use, and\nwhatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class\nsuch as [^a] always matches one of these characters.\n</P>\n<P>\nThe minus (hyphen) character can be used to specify a range of characters in a\ncharacter class. For example, [d-m] matches any letter between d and m,\ninclusive. If a minus character is required in a class, it must be escaped with\na backslash or appear in a position where it cannot be interpreted as\nindicating a range, typically as the first or last character in the class, or\nimmediately after a range. For example, [b-d-z] matches letters in the range b\nto d, a hyphen character, or z.\n</P>\n<P>\nIt is not possible to have the literal character \"]\" as the end character of a\nrange. A pattern such as [W-]46] is interpreted as a class of two characters\n(\"W\" and \"-\") followed by a literal string \"46]\", so it would match \"W46]\" or\n\"-46]\". However, if the \"]\" is escaped with a backslash it is interpreted as\nthe end of range, so [W-\\]46] is interpreted as a class containing a range\nfollowed by two other characters. The octal or hexadecimal representation of\n\"]\" can also be used to end a range.\n</P>\n<P>\nAn error is generated if a POSIX character class (see below) or an escape\nsequence other than one that defines a single character appears at a point\nwhere a range ending character is expected. For example, [z-\\xff] is valid,\nbut [A-\\d] and [A-[:digit:]] are not.\n</P>\n<P>\nRanges operate in the collating sequence of character values. They can also be\nused for characters specified numerically, for example [\\000-\\037]. Ranges\ncan include any characters that are valid for the current mode.\n</P>\n<P>\nIf a range that includes letters is used when caseless matching is set, it\nmatches the letters in either case. For example, [W-c] is equivalent to\n[][\\\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character\ntables for a French locale are in use, [\\xc8-\\xcb] matches accented E\ncharacters in both cases. In UTF modes, PCRE supports the concept of case for\ncharacters with values greater than 128 only when it is compiled with Unicode\nproperty support.\n</P>\n<P>\nThe character escape sequences \\d, \\D, \\h, \\H, \\p, \\P, \\s, \\S, \\v,\n\\V, \\w, and \\W may appear in a character class, and add the characters that\nthey match to the class. For example, [\\dABCDEF] matches any hexadecimal\ndigit. In UTF modes, the PCRE_UCP option affects the meanings of \\d, \\s, \\w\nand their upper case partners, just as it does when they appear outside a\ncharacter class, as described in the section entitled\n<a href=\"#genericchartypes\">\"Generic character types\"</a>\nabove. The escape sequence \\b has a different meaning inside a character\nclass; it matches the backspace character. The sequences \\B, \\N, \\R, and \\X\nare not special inside a character class. Like any other unrecognized escape\nsequences, they are treated as the literal characters \"B\", \"N\", \"R\", and \"X\" by\ndefault, but cause an error if the PCRE_EXTRA option is set.\n</P>\n<P>\nA circumflex can conveniently be used with the upper case character types to\nspecify a more restricted set of characters than the matching lower case type.\nFor example, the class [^\\W_] matches any letter or digit, but not underscore,\nwhereas [\\w] includes underscore. A positive character class should be read as\n\"something OR something OR ...\" and a negative class as \"NOT something AND NOT\nsomething AND NOT ...\".\n</P>\n<P>\nThe only metacharacters that are recognized in character classes are backslash,\nhyphen (only where it can be interpreted as specifying a range), circumflex\n(only at the start), opening square bracket (only when it can be interpreted as\nintroducing a POSIX class name, or for a special compatibility feature - see\nthe next two sections), and the terminating closing square bracket. However,\nescaping other non-alphanumeric characters does no harm.\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">POSIX CHARACTER CLASSES</a><br>\n<P>\nPerl supports the POSIX notation for character classes. This uses names\nenclosed by [: and :] within the enclosing square brackets. PCRE also supports\nthis notation. For example,\n<pre>\n  [01[:alpha:]%]\n</pre>\nmatches \"0\", \"1\", any alphabetic character, or \"%\". The supported class names\nare:\n<pre>\n  alnum    letters and digits\n  alpha    letters\n  ascii    character codes 0 - 127\n  blank    space or tab only\n  cntrl    control characters\n  digit    decimal digits (same as \\d)\n  graph    printing characters, excluding space\n  lower    lower case letters\n  print    printing characters, including space\n  punct    printing characters, excluding letters and digits and space\n  space    white space (the same as \\s from PCRE 8.34)\n  upper    upper case letters\n  word     \"word\" characters (same as \\w)\n  xdigit   hexadecimal digits\n</pre>\nThe default \"space\" characters are HT (9), LF (10), VT (11), FF (12), CR (13),\nand space (32). If locale-specific matching is taking place, the list of space\ncharacters may be different; there may be fewer or more of them. \"Space\" used\nto be different to \\s, which did not include VT, for Perl compatibility.\nHowever, Perl changed at release 5.18, and PCRE followed at release 8.34.\n\"Space\" and \\s now match the same set of characters.\n</P>\n<P>\nThe name \"word\" is a Perl extension, and \"blank\" is a GNU extension from Perl\n5.8. Another Perl extension is negation, which is indicated by a ^ character\nafter the colon. For example,\n<pre>\n  [12[:^digit:]]\n</pre>\nmatches \"1\", \"2\", or any non-digit. PCRE (and Perl) also recognize the POSIX\nsyntax [.ch.] and [=ch=] where \"ch\" is a \"collating element\", but these are not\nsupported, and an error is given if they are encountered.\n</P>\n<P>\nBy default, characters with values greater than 128 do not match any of the\nPOSIX character classes. However, if the PCRE_UCP option is passed to\n<b>pcre_compile()</b>, some of the classes are changed so that Unicode character\nproperties are used. This is achieved by replacing certain POSIX classes by\nother sequences, as follows:\n<pre>\n  [:alnum:]  becomes  \\p{Xan}\n  [:alpha:]  becomes  \\p{L}\n  [:blank:]  becomes  \\h\n  [:digit:]  becomes  \\p{Nd}\n  [:lower:]  becomes  \\p{Ll}\n  [:space:]  becomes  \\p{Xps}\n  [:upper:]  becomes  \\p{Lu}\n  [:word:]   becomes  \\p{Xwd}\n</pre>\nNegated versions, such as [:^alpha:] use \\P instead of \\p. Three other POSIX\nclasses are handled specially in UCP mode:\n</P>\n<P>\n[:graph:]\nThis matches characters that have glyphs that mark the page when printed. In\nUnicode property terms, it matches all characters with the L, M, N, P, S, or Cf\nproperties, except for:\n<pre>\n  U+061C           Arabic Letter Mark\n  U+180E           Mongolian Vowel Separator\n  U+2066 - U+2069  Various \"isolate\"s\n\n</PRE>\n</P>\n<P>\n[:print:]\nThis matches the same characters as [:graph:] plus space characters that are\nnot controls, that is, characters with the Zs property.\n</P>\n<P>\n[:punct:]\nThis matches all characters that have the Unicode P (punctuation) property,\nplus those characters whose code points are less than 128 that have the S\n(Symbol) property.\n</P>\n<P>\nThe other POSIX classes are unchanged, and match only characters with code\npoints less than 128.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">COMPATIBILITY FEATURE FOR WORD BOUNDARIES</a><br>\n<P>\nIn the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly\nsyntax [[:&#60;:]] and [[:&#62;:]] is used for matching \"start of word\" and \"end of\nword\". PCRE treats these items as follows:\n<pre>\n  [[:&#60;:]]  is converted to  \\b(?=\\w)\n  [[:&#62;:]]  is converted to  \\b(?&#60;=\\w)\n</pre>\nOnly these exact character sequences are recognized. A sequence such as\n[a[:&#60;:]b] provokes error for an unrecognized POSIX class name. This support is\nnot compatible with Perl. It is provided to help migrations from other\nenvironments, and is best not used in any new patterns. Note that \\b matches\nat the start and the end of a word (see\n<a href=\"#smallassertions\">\"Simple assertions\"</a>\nabove), and in a Perl-style pattern the preceding or following character\nnormally shows which is wanted, without the need for the assertions that are\nused above in order to give exactly the POSIX behaviour.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">VERTICAL BAR</a><br>\n<P>\nVertical bar characters are used to separate alternative patterns. For example,\nthe pattern\n<pre>\n  gilbert|sullivan\n</pre>\nmatches either \"gilbert\" or \"sullivan\". Any number of alternatives may appear,\nand an empty alternative is permitted (matching the empty string). The matching\nprocess tries each alternative in turn, from left to right, and the first one\nthat succeeds is used. If the alternatives are within a subpattern\n<a href=\"#subpattern\">(defined below),</a>\n\"succeeds\" means matching the rest of the main pattern as well as the\nalternative in the subpattern.\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">INTERNAL OPTION SETTING</a><br>\n<P>\nThe settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and\nPCRE_EXTENDED options (which are Perl-compatible) can be changed from within\nthe pattern by a sequence of Perl option letters enclosed between \"(?\" and \")\".\nThe option letters are\n<pre>\n  i  for PCRE_CASELESS\n  m  for PCRE_MULTILINE\n  s  for PCRE_DOTALL\n  x  for PCRE_EXTENDED\n</pre>\nFor example, (?im) sets caseless, multiline matching. It is also possible to\nunset these options by preceding the letter with a hyphen, and a combined\nsetting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\nPCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\npermitted. If a letter appears both before and after the hyphen, the option is\nunset.\n</P>\n<P>\nThe PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be\nchanged in the same way as the Perl-compatible options by using the characters\nJ, U and X respectively.\n</P>\n<P>\nWhen one of these option changes occurs at top level (that is, not inside\nsubpattern parentheses), the change applies to the remainder of the pattern\nthat follows. An option change within a subpattern (see below for a description\nof subpatterns) affects only that part of the subpattern that follows it, so\n<pre>\n  (a(?i)b)c\n</pre>\nmatches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\nBy this means, options can be made to have different settings in different\nparts of the pattern. Any changes made in one alternative do carry on\ninto subsequent branches within the same subpattern. For example,\n<pre>\n  (a(?i)b|c)\n</pre>\nmatches \"ab\", \"aB\", \"c\", and \"C\", even though when matching \"C\" the first\nbranch is abandoned before the option setting. This is because the effects of\noption settings happen at compile time. There would be some very weird\nbehaviour otherwise.\n</P>\n<P>\n<b>Note:</b> There are other PCRE-specific options that can be set by the\napplication when the compiling or matching functions are called. In some cases\nthe pattern can contain special leading sequences such as (*CRLF) to override\nwhat the application has set or what has been defaulted. Details are given in\nthe section entitled\n<a href=\"#newlineseq\">\"Newline sequences\"</a>\nabove. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading\nsequences that can be used to set UTF and Unicode property modes; they are\nequivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP\noptions, respectively. The (*UTF) sequence is a generic version that can be\nused with any of the libraries. However, the application can set the\nPCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences.\n<a name=\"subpattern\"></a></P>\n<br><a name=\"SEC14\" href=\"#TOC1\">SUBPATTERNS</a><br>\n<P>\nSubpatterns are delimited by parentheses (round brackets), which can be nested.\nTurning part of a pattern into a subpattern does two things:\n<br>\n<br>\n1. It localizes a set of alternatives. For example, the pattern\n<pre>\n  cat(aract|erpillar|)\n</pre>\nmatches \"cataract\", \"caterpillar\", or \"cat\". Without the parentheses, it would\nmatch \"cataract\", \"erpillar\" or an empty string.\n<br>\n<br>\n2. It sets up the subpattern as a capturing subpattern. This means that, when\nthe whole pattern matches, that portion of the subject string that matched the\nsubpattern is passed back to the caller via the <i>ovector</i> argument of the\nmatching function. (This applies only to the traditional matching functions;\nthe DFA matching functions do not support capturing.)\n</P>\n<P>\nOpening parentheses are counted from left to right (starting from 1) to obtain\nnumbers for the capturing subpatterns. For example, if the string \"the red\nking\" is matched against the pattern\n<pre>\n  the ((red|white) (king|queen))\n</pre>\nthe captured substrings are \"red king\", \"red\", and \"king\", and are numbered 1,\n2, and 3, respectively.\n</P>\n<P>\nThe fact that plain parentheses fulfil two functions is not always helpful.\nThere are often times when a grouping subpattern is required without a\ncapturing requirement. If an opening parenthesis is followed by a question mark\nand a colon, the subpattern does not do any capturing, and is not counted when\ncomputing the number of any subsequent capturing subpatterns. For example, if\nthe string \"the white queen\" is matched against the pattern\n<pre>\n  the ((?:red|white) (king|queen))\n</pre>\nthe captured substrings are \"white queen\" and \"queen\", and are numbered 1 and\n2. The maximum number of capturing subpatterns is 65535.\n</P>\n<P>\nAs a convenient shorthand, if any option settings are required at the start of\na non-capturing subpattern, the option letters may appear between the \"?\" and\nthe \":\". Thus the two patterns\n<pre>\n  (?i:saturday|sunday)\n  (?:(?i)saturday|sunday)\n</pre>\nmatch exactly the same set of strings. Because alternative branches are tried\nfrom left to right, and options are not reset until the end of the subpattern\nis reached, an option setting in one branch does affect subsequent branches, so\nthe above patterns match \"SUNDAY\" as well as \"Saturday\".\n<a name=\"dupsubpatternnumber\"></a></P>\n<br><a name=\"SEC15\" href=\"#TOC1\">DUPLICATE SUBPATTERN NUMBERS</a><br>\n<P>\nPerl 5.10 introduced a feature whereby each alternative in a subpattern uses\nthe same numbers for its capturing parentheses. Such a subpattern starts with\n(?| and is itself a non-capturing subpattern. For example, consider this\npattern:\n<pre>\n  (?|(Sat)ur|(Sun))day\n</pre>\nBecause the two alternatives are inside a (?| group, both sets of capturing\nparentheses are numbered one. Thus, when the pattern matches, you can look\nat captured substring number one, whichever alternative matched. This construct\nis useful when you want to capture part, but not all, of one of a number of\nalternatives. Inside a (?| group, parentheses are numbered as usual, but the\nnumber is reset at the start of each branch. The numbers of any capturing\nparentheses that follow the subpattern start after the highest number used in\nany branch. The following example is taken from the Perl documentation. The\nnumbers underneath show in which buffer the captured content will be stored.\n<pre>\n  # before  ---------------branch-reset----------- after\n  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x\n  # 1            2         2  3        2     3     4\n</pre>\nA back reference to a numbered subpattern uses the most recent value that is\nset for that number by any subpattern. The following pattern matches \"abcabc\"\nor \"defdef\":\n<pre>\n  /(?|(abc)|(def))\\1/\n</pre>\nIn contrast, a subroutine call to a numbered subpattern always refers to the\nfirst one in the pattern with the given number. The following pattern matches\n\"abcabc\" or \"defabc\":\n<pre>\n  /(?|(abc)|(def))(?1)/\n</pre>\nIf a\n<a href=\"#conditions\">condition test</a>\nfor a subpattern's having matched refers to a non-unique number, the test is\ntrue if any of the subpatterns of that number have matched.\n</P>\n<P>\nAn alternative approach to using this \"branch reset\" feature is to use\nduplicate named subpatterns, as described in the next section.\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">NAMED SUBPATTERNS</a><br>\n<P>\nIdentifying capturing parentheses by number is simple, but it can be very hard\nto keep track of the numbers in complicated regular expressions. Furthermore,\nif an expression is modified, the numbers may change. To help with this\ndifficulty, PCRE supports the naming of subpatterns. This feature was not\nadded to Perl until release 5.10. Python had the feature earlier, and PCRE\nintroduced it at release 4.0, using the Python syntax. PCRE now supports both\nthe Perl and the Python syntax. Perl allows identically numbered subpatterns to\nhave different names, but PCRE does not.\n</P>\n<P>\nIn PCRE, a subpattern can be named in one of three ways: (?&#60;name&#62;...) or\n(?'name'...) as in Perl, or (?P&#60;name&#62;...) as in Python. References to capturing\nparentheses from other parts of the pattern, such as\n<a href=\"#backreferences\">back references,</a>\n<a href=\"#recursion\">recursion,</a>\nand\n<a href=\"#conditions\">conditions,</a>\ncan be made by name as well as by number.\n</P>\n<P>\nNames consist of up to 32 alphanumeric characters and underscores, but must\nstart with a non-digit. Named capturing parentheses are still allocated numbers\nas well as names, exactly as if the names were not present. The PCRE API\nprovides function calls for extracting the name-to-number translation table\nfrom a compiled pattern. There is also a convenience function for extracting a\ncaptured substring by name.\n</P>\n<P>\nBy default, a name must be unique within a pattern, but it is possible to relax\nthis constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate\nnames are also always permitted for subpatterns with the same number, set up as\ndescribed in the previous section.) Duplicate names can be useful for patterns\nwhere only one instance of the named parentheses can match. Suppose you want to\nmatch the name of a weekday, either as a 3-letter abbreviation or as the full\nname, and in both cases you want to extract the abbreviation. This pattern\n(ignoring the line breaks) does the job:\n<pre>\n  (?&#60;DN&#62;Mon|Fri|Sun)(?:day)?|\n  (?&#60;DN&#62;Tue)(?:sday)?|\n  (?&#60;DN&#62;Wed)(?:nesday)?|\n  (?&#60;DN&#62;Thu)(?:rsday)?|\n  (?&#60;DN&#62;Sat)(?:urday)?\n</pre>\nThere are five capturing substrings, but only one is ever set after a match.\n(An alternative way of solving this problem is to use a \"branch reset\"\nsubpattern, as described in the previous section.)\n</P>\n<P>\nThe convenience function for extracting the data by name returns the substring\nfor the first (and in this example, the only) subpattern of that name that\nmatched. This saves searching to find which numbered subpattern it was.\n</P>\n<P>\nIf you make a back reference to a non-unique named subpattern from elsewhere in\nthe pattern, the subpatterns to which the name refers are checked in the order\nin which they appear in the overall pattern. The first one that is set is used\nfor the reference. For example, this pattern matches both \"foofoo\" and\n\"barbar\" but not \"foobar\" or \"barfoo\":\n<pre>\n  (?:(?&#60;n&#62;foo)|(?&#60;n&#62;bar))\\k&#60;n&#62;\n\n</PRE>\n</P>\n<P>\nIf you make a subroutine call to a non-unique named subpattern, the one that\ncorresponds to the first occurrence of the name is used. In the absence of\nduplicate numbers (see the previous section) this is the one with the lowest\nnumber.\n</P>\n<P>\nIf you use a named reference in a condition\ntest (see the\n<a href=\"#conditions\">section about conditions</a>\nbelow), either to check whether a subpattern has matched, or to check for\nrecursion, all subpatterns with the same name are tested. If the condition is\ntrue for any one of them, the overall condition is true. This is the same\nbehaviour as testing by number. For further details of the interfaces for\nhandling named subpatterns, see the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<P>\n<b>Warning:</b> You cannot use different names to distinguish between two\nsubpatterns with the same number because PCRE uses only the numbers when\nmatching. For this reason, an error is given at compile time if different names\nare given to subpatterns with the same number. However, you can always give the\nsame name to subpatterns with the same number, even when PCRE_DUPNAMES is not\nset.\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">REPETITION</a><br>\n<P>\nRepetition is specified by quantifiers, which can follow any of the following\nitems:\n<pre>\n  a literal data character\n  the dot metacharacter\n  the \\C escape sequence\n  the \\X escape sequence\n  the \\R escape sequence\n  an escape such as \\d or \\pL that matches a single character\n  a character class\n  a back reference (see next section)\n  a parenthesized subpattern (including assertions)\n  a subroutine call to a subpattern (recursive or otherwise)\n</pre>\nThe general repetition quantifier specifies a minimum and maximum number of\npermitted matches, by giving the two numbers in curly brackets (braces),\nseparated by a comma. The numbers must be less than 65536, and the first must\nbe less than or equal to the second. For example:\n<pre>\n  z{2,4}\n</pre>\nmatches \"zz\", \"zzz\", or \"zzzz\". A closing brace on its own is not a special\ncharacter. If the second number is omitted, but the comma is present, there is\nno upper limit; if the second number and the comma are both omitted, the\nquantifier specifies an exact number of required matches. Thus\n<pre>\n  [aeiou]{3,}\n</pre>\nmatches at least 3 successive vowels, but may match many more, while\n<pre>\n  \\d{8}\n</pre>\nmatches exactly 8 digits. An opening curly bracket that appears in a position\nwhere a quantifier is not allowed, or one that does not match the syntax of a\nquantifier, is taken as a literal character. For example, {,6} is not a\nquantifier, but a literal string of four characters.\n</P>\n<P>\nIn UTF modes, quantifiers apply to characters rather than to individual data\nunits. Thus, for example, \\x{100}{2} matches two characters, each of\nwhich is represented by a two-byte sequence in a UTF-8 string. Similarly,\n\\X{3} matches three Unicode extended grapheme clusters, each of which may be\nseveral data units long (and they may be of different lengths).\n</P>\n<P>\nThe quantifier {0} is permitted, causing the expression to behave as if the\nprevious item and the quantifier were not present. This may be useful for\nsubpatterns that are referenced as\n<a href=\"#subpatternsassubroutines\">subroutines</a>\nfrom elsewhere in the pattern (but see also the section entitled\n<a href=\"#subdefine\">\"Defining subpatterns for use by reference only\"</a>\nbelow). Items other than subpatterns that have a {0} quantifier are omitted\nfrom the compiled pattern.\n</P>\n<P>\nFor convenience, the three most common quantifiers have single-character\nabbreviations:\n<pre>\n  *    is equivalent to {0,}\n  +    is equivalent to {1,}\n  ?    is equivalent to {0,1}\n</pre>\nIt is possible to construct infinite loops by following a subpattern that can\nmatch no characters with a quantifier that has no upper limit, for example:\n<pre>\n  (a?)*\n</pre>\nEarlier versions of Perl and PCRE used to give an error at compile time for\nsuch patterns. However, because there are cases where this can be useful, such\npatterns are now accepted, but if any repetition of the subpattern does in fact\nmatch no characters, the loop is forcibly broken.\n</P>\n<P>\nBy default, the quantifiers are \"greedy\", that is, they match as much as\npossible (up to the maximum number of permitted times), without causing the\nrest of the pattern to fail. The classic example of where this gives problems\nis in trying to match comments in C programs. These appear between /* and */\nand within the comment, individual * and / characters may appear. An attempt to\nmatch C comments by applying the pattern\n<pre>\n  /\\*.*\\*/\n</pre>\nto the string\n<pre>\n  /* first comment */  not comment  /* second comment */\n</pre>\nfails, because it matches the entire string owing to the greediness of the .*\nitem.\n</P>\n<P>\nHowever, if a quantifier is followed by a question mark, it ceases to be\ngreedy, and instead matches the minimum number of times possible, so the\npattern\n<pre>\n  /\\*.*?\\*/\n</pre>\ndoes the right thing with the C comments. The meaning of the various\nquantifiers is not otherwise changed, just the preferred number of matches.\nDo not confuse this use of question mark with its use as a quantifier in its\nown right. Because it has two uses, it can sometimes appear doubled, as in\n<pre>\n  \\d??\\d\n</pre>\nwhich matches one digit by preference, but can match two if that is the only\nway the rest of the pattern matches.\n</P>\n<P>\nIf the PCRE_UNGREEDY option is set (an option that is not available in Perl),\nthe quantifiers are not greedy by default, but individual ones can be made\ngreedy by following them with a question mark. In other words, it inverts the\ndefault behaviour.\n</P>\n<P>\nWhen a parenthesized subpattern is quantified with a minimum repeat count that\nis greater than 1 or with a limited maximum, more memory is required for the\ncompiled pattern, in proportion to the size of the minimum or maximum.\n</P>\n<P>\nIf a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\nto Perl's /s) is set, thus allowing the dot to match newlines, the pattern is\nimplicitly anchored, because whatever follows will be tried against every\ncharacter position in the subject string, so there is no point in retrying the\noverall match at any position after the first. PCRE normally treats such a\npattern as though it were preceded by \\A.\n</P>\n<P>\nIn cases where it is known that the subject string contains no newlines, it is\nworth setting PCRE_DOTALL in order to obtain this optimization, or\nalternatively using ^ to indicate anchoring explicitly.\n</P>\n<P>\nHowever, there are some cases where the optimization cannot be used. When .*\nis inside capturing parentheses that are the subject of a back reference\nelsewhere in the pattern, a match at the start may fail where a later one\nsucceeds. Consider, for example:\n<pre>\n  (.*)abc\\1\n</pre>\nIf the subject is \"xyz123abc123\" the match point is the fourth character. For\nthis reason, such a pattern is not implicitly anchored.\n</P>\n<P>\nAnother case where implicit anchoring is not applied is when the leading .* is\ninside an atomic group. Once again, a match at the start may fail where a later\none succeeds. Consider this pattern:\n<pre>\n  (?&#62;.*?a)b\n</pre>\nIt matches \"ab\" in the subject \"aab\". The use of the backtracking control verbs\n(*PRUNE) and (*SKIP) also disable this optimization.\n</P>\n<P>\nWhen a capturing subpattern is repeated, the value captured is the substring\nthat matched the final iteration. For example, after\n<pre>\n  (tweedle[dume]{3}\\s*)+\n</pre>\nhas matched \"tweedledum tweedledee\" the value of the captured substring is\n\"tweedledee\". However, if there are nested capturing subpatterns, the\ncorresponding captured values may have been set in previous iterations. For\nexample, after\n<pre>\n  /(a|(b))+/\n</pre>\nmatches \"aba\" the value of the second captured substring is \"b\".\n<a name=\"atomicgroup\"></a></P>\n<br><a name=\"SEC18\" href=\"#TOC1\">ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS</a><br>\n<P>\nWith both maximizing (\"greedy\") and minimizing (\"ungreedy\" or \"lazy\")\nrepetition, failure of what follows normally causes the repeated item to be\nre-evaluated to see if a different number of repeats allows the rest of the\npattern to match. Sometimes it is useful to prevent this, either to change the\nnature of the match, or to cause it fail earlier than it otherwise might, when\nthe author of the pattern knows there is no point in carrying on.\n</P>\n<P>\nConsider, for example, the pattern \\d+foo when applied to the subject line\n<pre>\n  123456bar\n</pre>\nAfter matching all 6 digits and then failing to match \"foo\", the normal\naction of the matcher is to try again with only 5 digits matching the \\d+\nitem, and then with 4, and so on, before ultimately failing. \"Atomic grouping\"\n(a term taken from Jeffrey Friedl's book) provides the means for specifying\nthat once a subpattern has matched, it is not to be re-evaluated in this way.\n</P>\n<P>\nIf we use atomic grouping for the previous example, the matcher gives up\nimmediately on failing to match \"foo\" the first time. The notation is a kind of\nspecial parenthesis, starting with (?&#62; as in this example:\n<pre>\n  (?&#62;\\d+)foo\n</pre>\nThis kind of parenthesis \"locks up\" the  part of the pattern it contains once\nit has matched, and a failure further into the pattern is prevented from\nbacktracking into it. Backtracking past it to previous items, however, works as\nnormal.\n</P>\n<P>\nAn alternative description is that a subpattern of this type matches the string\nof characters that an identical standalone pattern would match, if anchored at\nthe current point in the subject string.\n</P>\n<P>\nAtomic grouping subpatterns are not capturing subpatterns. Simple cases such as\nthe above example can be thought of as a maximizing repeat that must swallow\neverything it can. So, while both \\d+ and \\d+? are prepared to adjust the\nnumber of digits they match in order to make the rest of the pattern match,\n(?&#62;\\d+) can only match an entire sequence of digits.\n</P>\n<P>\nAtomic groups in general can of course contain arbitrarily complicated\nsubpatterns, and can be nested. However, when the subpattern for an atomic\ngroup is just a single repeated item, as in the example above, a simpler\nnotation, called a \"possessive quantifier\" can be used. This consists of an\nadditional + character following a quantifier. Using this notation, the\nprevious example can be rewritten as\n<pre>\n  \\d++foo\n</pre>\nNote that a possessive quantifier can be used with an entire group, for\nexample:\n<pre>\n  (abc|xyz){2,3}+\n</pre>\nPossessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY\noption is ignored. They are a convenient notation for the simpler forms of\natomic group. However, there is no difference in the meaning of a possessive\nquantifier and the equivalent atomic group, though there may be a performance\ndifference; possessive quantifiers should be slightly faster.\n</P>\n<P>\nThe possessive quantifier syntax is an extension to the Perl 5.8 syntax.\nJeffrey Friedl originated the idea (and the name) in the first edition of his\nbook. Mike McCloskey liked it, so implemented it when he built Sun's Java\npackage, and PCRE copied it from there. It ultimately found its way into Perl\nat release 5.10.\n</P>\n<P>\nPCRE has an optimization that automatically \"possessifies\" certain simple\npattern constructs. For example, the sequence A+B is treated as A++B because\nthere is no point in backtracking into a sequence of A's when B must follow.\n</P>\n<P>\nWhen a pattern contains an unlimited repeat inside a subpattern that can itself\nbe repeated an unlimited number of times, the use of an atomic group is the\nonly way to avoid some failing matches taking a very long time indeed. The\npattern\n<pre>\n  (\\D+|&#60;\\d+&#62;)*[!?]\n</pre>\nmatches an unlimited number of substrings that either consist of non-digits, or\ndigits enclosed in &#60;&#62;, followed by either ! or ?. When it matches, it runs\nquickly. However, if it is applied to\n<pre>\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n</pre>\nit takes a long time before reporting failure. This is because the string can\nbe divided between the internal \\D+ repeat and the external * repeat in a\nlarge number of ways, and all have to be tried. (The example uses [!?] rather\nthan a single character at the end, because both PCRE and Perl have an\noptimization that allows for fast failure when a single character is used. They\nremember the last single character that is required for a match, and fail early\nif it is not present in the string.) If the pattern is changed so that it uses\nan atomic group, like this:\n<pre>\n  ((?&#62;\\D+)|&#60;\\d+&#62;)*[!?]\n</pre>\nsequences of non-digits cannot be broken, and failure happens quickly.\n<a name=\"backreferences\"></a></P>\n<br><a name=\"SEC19\" href=\"#TOC1\">BACK REFERENCES</a><br>\n<P>\nOutside a character class, a backslash followed by a digit greater than 0 (and\npossibly further digits) is a back reference to a capturing subpattern earlier\n(that is, to its left) in the pattern, provided there have been that many\nprevious capturing left parentheses.\n</P>\n<P>\nHowever, if the decimal number following the backslash is less than 10, it is\nalways taken as a back reference, and causes an error only if there are not\nthat many capturing left parentheses in the entire pattern. In other words, the\nparentheses that are referenced need not be to the left of the reference for\nnumbers less than 10. A \"forward back reference\" of this type can make sense\nwhen a repetition is involved and the subpattern to the right has participated\nin an earlier iteration.\n</P>\n<P>\nIt is not possible to have a numerical \"forward back reference\" to a subpattern\nwhose number is 10 or more using this syntax because a sequence such as \\50 is\ninterpreted as a character defined in octal. See the subsection entitled\n\"Non-printing characters\"\n<a href=\"#digitsafterbackslash\">above</a>\nfor further details of the handling of digits following a backslash. There is\nno such problem when named parentheses are used. A back reference to any\nsubpattern is possible using named parentheses (see below).\n</P>\n<P>\nAnother way of avoiding the ambiguity inherent in the use of digits following a\nbackslash is to use the \\g escape sequence. This escape must be followed by an\nunsigned number or a negative number, optionally enclosed in braces. These\nexamples are all identical:\n<pre>\n  (ring), \\1\n  (ring), \\g1\n  (ring), \\g{1}\n</pre>\nAn unsigned number specifies an absolute reference without the ambiguity that\nis present in the older syntax. It is also useful when literal digits follow\nthe reference. A negative number is a relative reference. Consider this\nexample:\n<pre>\n  (abc(def)ghi)\\g{-1}\n</pre>\nThe sequence \\g{-1} is a reference to the most recently started capturing\nsubpattern before \\g, that is, is it equivalent to \\2 in this example.\nSimilarly, \\g{-2} would be equivalent to \\1. The use of relative references\ncan be helpful in long patterns, and also in patterns that are created by\njoining together fragments that contain references within themselves.\n</P>\n<P>\nA back reference matches whatever actually matched the capturing subpattern in\nthe current subject string, rather than anything matching the subpattern\nitself (see\n<a href=\"#subpatternsassubroutines\">\"Subpatterns as subroutines\"</a>\nbelow for a way of doing that). So the pattern\n<pre>\n  (sens|respons)e and \\1ibility\n</pre>\nmatches \"sense and sensibility\" and \"response and responsibility\", but not\n\"sense and responsibility\". If caseful matching is in force at the time of the\nback reference, the case of letters is relevant. For example,\n<pre>\n  ((?i)rah)\\s+\\1\n</pre>\nmatches \"rah rah\" and \"RAH RAH\", but not \"RAH rah\", even though the original\ncapturing subpattern is matched caselessly.\n</P>\n<P>\nThere are several different ways of writing back references to named\nsubpatterns. The .NET syntax \\k{name} and the Perl syntax \\k&#60;name&#62; or\n\\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified\nback reference syntax, in which \\g can be used for both numeric and named\nreferences, is also supported. We could rewrite the above example in any of\nthe following ways:\n<pre>\n  (?&#60;p1&#62;(?i)rah)\\s+\\k&#60;p1&#62;\n  (?'p1'(?i)rah)\\s+\\k{p1}\n  (?P&#60;p1&#62;(?i)rah)\\s+(?P=p1)\n  (?&#60;p1&#62;(?i)rah)\\s+\\g{p1}\n</pre>\nA subpattern that is referenced by name may appear in the pattern before or\nafter the reference.\n</P>\n<P>\nThere may be more than one back reference to the same subpattern. If a\nsubpattern has not actually been used in a particular match, any back\nreferences to it always fail by default. For example, the pattern\n<pre>\n  (a|(bc))\\2\n</pre>\nalways fails if it starts to match \"a\" rather than \"bc\". However, if the\nPCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an\nunset value matches an empty string.\n</P>\n<P>\nBecause there may be many capturing parentheses in a pattern, all digits\nfollowing a backslash are taken as part of a potential back reference number.\nIf the pattern continues with a digit character, some delimiter must be used to\nterminate the back reference. If the PCRE_EXTENDED option is set, this can be\nwhite space. Otherwise, the \\g{ syntax or an empty comment (see\n<a href=\"#comments\">\"Comments\"</a>\nbelow) can be used.\n</P>\n<br><b>\nRecursive back references\n</b><br>\n<P>\nA back reference that occurs inside the parentheses to which it refers fails\nwhen the subpattern is first used, so, for example, (a\\1) never matches.\nHowever, such references can be useful inside repeated subpatterns. For\nexample, the pattern\n<pre>\n  (a|b\\1)+\n</pre>\nmatches any number of \"a\"s and also \"aba\", \"ababbaa\" etc. At each iteration of\nthe subpattern, the back reference matches the character string corresponding\nto the previous iteration. In order for this to work, the pattern must be such\nthat the first iteration does not need to match the back reference. This can be\ndone using alternation, as in the example above, or by a quantifier with a\nminimum of zero.\n</P>\n<P>\nBack references of this type cause the group that they reference to be treated\nas an\n<a href=\"#atomicgroup\">atomic group.</a>\nOnce the whole group has been matched, a subsequent matching failure cannot\ncause backtracking into the middle of the group.\n<a name=\"bigassertions\"></a></P>\n<br><a name=\"SEC20\" href=\"#TOC1\">ASSERTIONS</a><br>\n<P>\nAn assertion is a test on the characters following or preceding the current\nmatching point that does not actually consume any characters. The simple\nassertions coded as \\b, \\B, \\A, \\G, \\Z, \\z, ^ and $ are described\n<a href=\"#smallassertions\">above.</a>\n</P>\n<P>\nMore complicated assertions are coded as subpatterns. There are two kinds:\nthose that look ahead of the current position in the subject string, and those\nthat look behind it. An assertion subpattern is matched in the normal way,\nexcept that it does not cause the current matching position to be changed.\n</P>\n<P>\nAssertion subpatterns are not capturing subpatterns. If such an assertion\ncontains capturing subpatterns within it, these are counted for the purposes of\nnumbering the capturing subpatterns in the whole pattern. However, substring\ncapturing is carried out only for positive assertions. (Perl sometimes, but not\nalways, does do capturing in negative assertions.)\n</P>\n<P>\nWARNING: If a positive assertion containing one or more capturing subpatterns\nsucceeds, but failure to match later in the pattern causes backtracking over\nthis assertion, the captures within the assertion are reset only if no higher\nnumbered captures are already set. This is, unfortunately, a fundamental\nlimitation of the current implementation, and as PCRE1 is now in\nmaintenance-only status, it is unlikely ever to change.\n</P>\n<P>\nFor compatibility with Perl, assertion subpatterns may be repeated; though\nit makes no sense to assert the same thing several times, the side effect of\ncapturing parentheses may occasionally be useful. In practice, there only three\ncases:\n<br>\n<br>\n(1) If the quantifier is {0}, the assertion is never obeyed during matching.\nHowever, it may contain internal capturing parenthesized groups that are called\nfrom elsewhere via the\n<a href=\"#subpatternsassubroutines\">subroutine mechanism.</a>\n<br>\n<br>\n(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it\nwere {0,1}. At run time, the rest of the pattern match is tried with and\nwithout the assertion, the order depending on the greediness of the quantifier.\n<br>\n<br>\n(3) If the minimum repetition is greater than zero, the quantifier is ignored.\nThe assertion is obeyed just once when encountered during matching.\n</P>\n<br><b>\nLookahead assertions\n</b><br>\n<P>\nLookahead assertions start with (?= for positive assertions and (?! for\nnegative assertions. For example,\n<pre>\n  \\w+(?=;)\n</pre>\nmatches a word followed by a semicolon, but does not include the semicolon in\nthe match, and\n<pre>\n  foo(?!bar)\n</pre>\nmatches any occurrence of \"foo\" that is not followed by \"bar\". Note that the\napparently similar pattern\n<pre>\n  (?!foo)bar\n</pre>\ndoes not find an occurrence of \"bar\" that is preceded by something other than\n\"foo\"; it finds any occurrence of \"bar\" whatsoever, because the assertion\n(?!foo) is always true when the next three characters are \"bar\". A\nlookbehind assertion is needed to achieve the other effect.\n</P>\n<P>\nIf you want to force a matching failure at some point in a pattern, the most\nconvenient way to do it is with (?!) because an empty string always matches, so\nan assertion that requires there not to be an empty string must always fail.\nThe backtracking control verb (*FAIL) or (*F) is a synonym for (?!).\n<a name=\"lookbehind\"></a></P>\n<br><b>\nLookbehind assertions\n</b><br>\n<P>\nLookbehind assertions start with (?&#60;= for positive assertions and (?&#60;! for\nnegative assertions. For example,\n<pre>\n  (?&#60;!foo)bar\n</pre>\ndoes find an occurrence of \"bar\" that is not preceded by \"foo\". The contents of\na lookbehind assertion are restricted such that all the strings it matches must\nhave a fixed length. However, if there are several top-level alternatives, they\ndo not all have to have the same fixed length. Thus\n<pre>\n  (?&#60;=bullock|donkey)\n</pre>\nis permitted, but\n<pre>\n  (?&#60;!dogs?|cats?)\n</pre>\ncauses an error at compile time. Branches that match different length strings\nare permitted only at the top level of a lookbehind assertion. This is an\nextension compared with Perl, which requires all branches to match the same\nlength of string. An assertion such as\n<pre>\n  (?&#60;=ab(c|de))\n</pre>\nis not permitted, because its single top-level branch can match two different\nlengths, but it is acceptable to PCRE if rewritten to use two top-level\nbranches:\n<pre>\n  (?&#60;=abc|abde)\n</pre>\nIn some cases, the escape sequence \\K\n<a href=\"#resetmatchstart\">(see above)</a>\ncan be used instead of a lookbehind assertion to get round the fixed-length\nrestriction.\n</P>\n<P>\nThe implementation of lookbehind assertions is, for each alternative, to\ntemporarily move the current position back by the fixed length and then try to\nmatch. If there are insufficient characters before the current position, the\nassertion fails.\n</P>\n<P>\nIn a UTF mode, PCRE does not allow the \\C escape (which matches a single data\nunit even in a UTF mode) to appear in lookbehind assertions, because it makes\nit impossible to calculate the length of the lookbehind. The \\X and \\R\nescapes, which can match different numbers of data units, are also not\npermitted.\n</P>\n<P>\n<a href=\"#subpatternsassubroutines\">\"Subroutine\"</a>\ncalls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long\nas the subpattern matches a fixed-length string.\n<a href=\"#recursion\">Recursion,</a>\nhowever, is not supported.\n</P>\n<P>\nPossessive quantifiers can be used in conjunction with lookbehind assertions to\nspecify efficient matching of fixed-length strings at the end of subject\nstrings. Consider a simple pattern such as\n<pre>\n  abcd$\n</pre>\nwhen applied to a long string that does not match. Because matching proceeds\nfrom left to right, PCRE will look for each \"a\" in the subject and then see if\nwhat follows matches the rest of the pattern. If the pattern is specified as\n<pre>\n  ^.*abcd$\n</pre>\nthe initial .* matches the entire string at first, but when this fails (because\nthere is no following \"a\"), it backtracks to match all but the last character,\nthen all but the last two characters, and so on. Once again the search for \"a\"\ncovers the entire string, from right to left, so we are no better off. However,\nif the pattern is written as\n<pre>\n  ^.*+(?&#60;=abcd)\n</pre>\nthere can be no backtracking for the .*+ item; it can match only the entire\nstring. The subsequent lookbehind assertion does a single test on the last four\ncharacters. If it fails, the match fails immediately. For long strings, this\napproach makes a significant difference to the processing time.\n</P>\n<br><b>\nUsing multiple assertions\n</b><br>\n<P>\nSeveral assertions (of any sort) may occur in succession. For example,\n<pre>\n  (?&#60;=\\d{3})(?&#60;!999)foo\n</pre>\nmatches \"foo\" preceded by three digits that are not \"999\". Notice that each of\nthe assertions is applied independently at the same point in the subject\nstring. First there is a check that the previous three characters are all\ndigits, and then there is a check that the same three characters are not \"999\".\nThis pattern does <i>not</i> match \"foo\" preceded by six characters, the first\nof which are digits and the last three of which are not \"999\". For example, it\ndoesn't match \"123abcfoo\". A pattern to do that is\n<pre>\n  (?&#60;=\\d{3}...)(?&#60;!999)foo\n</pre>\nThis time the first assertion looks at the preceding six characters, checking\nthat the first three are digits, and then the second assertion checks that the\npreceding three characters are not \"999\".\n</P>\n<P>\nAssertions can be nested in any combination. For example,\n<pre>\n  (?&#60;=(?&#60;!foo)bar)baz\n</pre>\nmatches an occurrence of \"baz\" that is preceded by \"bar\" which in turn is not\npreceded by \"foo\", while\n<pre>\n  (?&#60;=\\d{3}(?!999)...)foo\n</pre>\nis another pattern that matches \"foo\" preceded by three digits and any three\ncharacters that are not \"999\".\n<a name=\"conditions\"></a></P>\n<br><a name=\"SEC21\" href=\"#TOC1\">CONDITIONAL SUBPATTERNS</a><br>\n<P>\nIt is possible to cause the matching process to obey a subpattern\nconditionally or to choose between two alternative subpatterns, depending on\nthe result of an assertion, or whether a specific capturing subpattern has\nalready been matched. The two possible forms of conditional subpattern are:\n<pre>\n  (?(condition)yes-pattern)\n  (?(condition)yes-pattern|no-pattern)\n</pre>\nIf the condition is satisfied, the yes-pattern is used; otherwise the\nno-pattern (if present) is used. If there are more than two alternatives in the\nsubpattern, a compile-time error occurs. Each of the two alternatives may\nitself contain nested subpatterns of any form, including conditional\nsubpatterns; the restriction to two alternatives applies only at the level of\nthe condition. This pattern fragment is an example where the alternatives are\ncomplex:\n<pre>\n  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )\n\n</PRE>\n</P>\n<P>\nThere are four kinds of condition: references to subpatterns, references to\nrecursion, a pseudo-condition called DEFINE, and assertions.\n</P>\n<br><b>\nChecking for a used subpattern by number\n</b><br>\n<P>\nIf the text between the parentheses consists of a sequence of digits, the\ncondition is true if a capturing subpattern of that number has previously\nmatched. If there is more than one capturing subpattern with the same number\n(see the earlier\n<a href=\"#recursion\">section about duplicate subpattern numbers),</a>\nthe condition is true if any of them have matched. An alternative notation is\nto precede the digits with a plus or minus sign. In this case, the subpattern\nnumber is relative rather than absolute. The most recently opened parentheses\ncan be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside\nloops it can also make sense to refer to subsequent groups. The next\nparentheses to be opened can be referenced as (?(+1), and so on. (The value\nzero in any of these forms is not used; it provokes a compile-time error.)\n</P>\n<P>\nConsider the following pattern, which contains non-significant white space to\nmake it more readable (assume the PCRE_EXTENDED option) and to divide it into\nthree parts for ease of discussion:\n<pre>\n  ( \\( )?    [^()]+    (?(1) \\) )\n</pre>\nThe first part matches an optional opening parenthesis, and if that\ncharacter is present, sets it as the first captured substring. The second part\nmatches one or more characters that are not parentheses. The third part is a\nconditional subpattern that tests whether or not the first set of parentheses\nmatched. If they did, that is, if subject started with an opening parenthesis,\nthe condition is true, and so the yes-pattern is executed and a closing\nparenthesis is required. Otherwise, since no-pattern is not present, the\nsubpattern matches nothing. In other words, this pattern matches a sequence of\nnon-parentheses, optionally enclosed in parentheses.\n</P>\n<P>\nIf you were embedding this pattern in a larger one, you could use a relative\nreference:\n<pre>\n  ...other stuff... ( \\( )?    [^()]+    (?(-1) \\) ) ...\n</pre>\nThis makes the fragment independent of the parentheses in the larger pattern.\n</P>\n<br><b>\nChecking for a used subpattern by name\n</b><br>\n<P>\nPerl uses the syntax (?(&#60;name&#62;)...) or (?('name')...) to test for a used\nsubpattern by name. For compatibility with earlier versions of PCRE, which had\nthis facility before Perl, the syntax (?(name)...) is also recognized.\n</P>\n<P>\nRewriting the above example to use a named subpattern gives this:\n<pre>\n  (?&#60;OPEN&#62; \\( )?    [^()]+    (?(&#60;OPEN&#62;) \\) )\n</pre>\nIf the name used in a condition of this kind is a duplicate, the test is\napplied to all subpatterns of the same name, and is true if any one of them has\nmatched.\n</P>\n<br><b>\nChecking for pattern recursion\n</b><br>\n<P>\nIf the condition is the string (R), and there is no subpattern with the name R,\nthe condition is true if a recursive call to the whole pattern or any\nsubpattern has been made. If digits or a name preceded by ampersand follow the\nletter R, for example:\n<pre>\n  (?(R3)...) or (?(R&name)...)\n</pre>\nthe condition is true if the most recent recursion is into a subpattern whose\nnumber or name is given. This condition does not check the entire recursion\nstack. If the name used in a condition of this kind is a duplicate, the test is\napplied to all subpatterns of the same name, and is true if any one of them is\nthe most recent recursion.\n</P>\n<P>\nAt \"top level\", all these recursion test conditions are false.\n<a href=\"#recursion\">The syntax for recursive patterns</a>\nis described below.\n<a name=\"subdefine\"></a></P>\n<br><b>\nDefining subpatterns for use by reference only\n</b><br>\n<P>\nIf the condition is the string (DEFINE), and there is no subpattern with the\nname DEFINE, the condition is always false. In this case, there may be only one\nalternative in the subpattern. It is always skipped if control reaches this\npoint in the pattern; the idea of DEFINE is that it can be used to define\nsubroutines that can be referenced from elsewhere. (The use of\n<a href=\"#subpatternsassubroutines\">subroutines</a>\nis described below.) For example, a pattern to match an IPv4 address such as\n\"192.168.23.245\" could be written like this (ignore white space and line\nbreaks):\n<pre>\n  (?(DEFINE) (?&#60;byte&#62; 2[0-4]\\d | 25[0-5] | 1\\d\\d | [1-9]?\\d) )\n  \\b (?&byte) (\\.(?&byte)){3} \\b\n</pre>\nThe first part of the pattern is a DEFINE group inside which a another group\nnamed \"byte\" is defined. This matches an individual component of an IPv4\naddress (a number less than 256). When matching takes place, this part of the\npattern is skipped because DEFINE acts like a false condition. The rest of the\npattern uses references to the named group to match the four dot-separated\ncomponents of an IPv4 address, insisting on a word boundary at each end.\n</P>\n<br><b>\nAssertion conditions\n</b><br>\n<P>\nIf the condition is not in any of the above formats, it must be an assertion.\nThis may be a positive or negative lookahead or lookbehind assertion. Consider\nthis pattern, again containing non-significant white space, and with the two\nalternatives on the second line:\n<pre>\n  (?(?=[^a-z]*[a-z])\n  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} )\n</pre>\nThe condition is a positive lookahead assertion that matches an optional\nsequence of non-letters followed by a letter. In other words, it tests for the\npresence of at least one letter in the subject. If a letter is found, the\nsubject is matched against the first alternative; otherwise it is matched\nagainst the second. This pattern matches strings in one of the two forms\ndd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\n<a name=\"comments\"></a></P>\n<br><a name=\"SEC22\" href=\"#TOC1\">COMMENTS</a><br>\n<P>\nThere are two ways of including comments in patterns that are processed by\nPCRE. In both cases, the start of the comment must not be in a character class,\nnor in the middle of any other sequence of related characters such as (?: or a\nsubpattern name or number. The characters that make up a comment play no part\nin the pattern matching.\n</P>\n<P>\nThe sequence (?# marks the start of a comment that continues up to the next\nclosing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED\noption is set, an unescaped # character also introduces a comment, which in\nthis case continues to immediately after the next newline character or\ncharacter sequence in the pattern. Which characters are interpreted as newlines\nis controlled by the options passed to a compiling function or by a special\nsequence at the start of the pattern, as described in the section entitled\n<a href=\"#newlines\">\"Newline conventions\"</a>\nabove. Note that the end of this type of comment is a literal newline sequence\nin the pattern; escape sequences that happen to represent a newline do not\ncount. For example, consider this pattern when PCRE_EXTENDED is set, and the\ndefault newline convention is in force:\n<pre>\n  abc #comment \\n still comment\n</pre>\nOn encountering the # character, <b>pcre_compile()</b> skips along, looking for\na newline in the pattern. The sequence \\n is still literal at this stage, so\nit does not terminate the comment. Only an actual character with the code value\n0x0a (the default newline) does so.\n<a name=\"recursion\"></a></P>\n<br><a name=\"SEC23\" href=\"#TOC1\">RECURSIVE PATTERNS</a><br>\n<P>\nConsider the problem of matching a string in parentheses, allowing for\nunlimited nested parentheses. Without the use of recursion, the best that can\nbe done is to use a pattern that matches up to some fixed depth of nesting. It\nis not possible to handle an arbitrary nesting depth.\n</P>\n<P>\nFor some time, Perl has provided a facility that allows regular expressions to\nrecurse (amongst other things). It does this by interpolating Perl code in the\nexpression at run time, and the code can refer to the expression itself. A Perl\npattern using code interpolation to solve the parentheses problem can be\ncreated like this:\n<pre>\n  $re = qr{\\( (?: (?&#62;[^()]+) | (?p{$re}) )* \\)}x;\n</pre>\nThe (?p{...}) item interpolates Perl code at run time, and in this case refers\nrecursively to the pattern in which it appears.\n</P>\n<P>\nObviously, PCRE cannot support the interpolation of Perl code. Instead, it\nsupports special syntax for recursion of the entire pattern, and also for\nindividual subpattern recursion. After its introduction in PCRE and Python,\nthis kind of recursion was subsequently introduced into Perl at release 5.10.\n</P>\n<P>\nA special item that consists of (? followed by a number greater than zero and a\nclosing parenthesis is a recursive subroutine call of the subpattern of the\ngiven number, provided that it occurs inside that subpattern. (If not, it is a\n<a href=\"#subpatternsassubroutines\">non-recursive subroutine</a>\ncall, which is described in the next section.) The special item (?R) or (?0) is\na recursive call of the entire regular expression.\n</P>\n<P>\nThis PCRE pattern solves the nested parentheses problem (assume the\nPCRE_EXTENDED option is set so that white space is ignored):\n<pre>\n  \\( ( [^()]++ | (?R) )* \\)\n</pre>\nFirst it matches an opening parenthesis. Then it matches any number of\nsubstrings which can either be a sequence of non-parentheses, or a recursive\nmatch of the pattern itself (that is, a correctly parenthesized substring).\nFinally there is a closing parenthesis. Note the use of a possessive quantifier\nto avoid backtracking into sequences of non-parentheses.\n</P>\n<P>\nIf this were part of a larger pattern, you would not want to recurse the entire\npattern, so instead you could use this:\n<pre>\n  ( \\( ( [^()]++ | (?1) )* \\) )\n</pre>\nWe have put the pattern into parentheses, and caused the recursion to refer to\nthem instead of the whole pattern.\n</P>\n<P>\nIn a larger pattern, keeping track of parenthesis numbers can be tricky. This\nis made easier by the use of relative references. Instead of (?1) in the\npattern above you can write (?-2) to refer to the second most recently opened\nparentheses preceding the recursion. In other words, a negative number counts\ncapturing parentheses leftwards from the point at which it is encountered.\n</P>\n<P>\nIt is also possible to refer to subsequently opened parentheses, by writing\nreferences such as (?+2). However, these cannot be recursive because the\nreference is not inside the parentheses that are referenced. They are always\n<a href=\"#subpatternsassubroutines\">non-recursive subroutine</a>\ncalls, as described in the next section.\n</P>\n<P>\nAn alternative approach is to use named parentheses instead. The Perl syntax\nfor this is (?&name); PCRE's earlier syntax (?P&#62;name) is also supported. We\ncould rewrite the above example as follows:\n<pre>\n  (?&#60;pn&#62; \\( ( [^()]++ | (?&pn) )* \\) )\n</pre>\nIf there is more than one subpattern with the same name, the earliest one is\nused.\n</P>\n<P>\nThis particular example pattern that we have been looking at contains nested\nunlimited repeats, and so the use of a possessive quantifier for matching\nstrings of non-parentheses is important when applying the pattern to strings\nthat do not match. For example, when this pattern is applied to\n<pre>\n  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n</pre>\nit yields \"no match\" quickly. However, if a possessive quantifier is not used,\nthe match runs for a very long time indeed because there are so many different\nways the + and * repeats can carve up the subject, and all have to be tested\nbefore failure can be reported.\n</P>\n<P>\nAt the end of a match, the values of capturing parentheses are those from\nthe outermost level. If you want to obtain intermediate values, a callout\nfunction can be used (see below and the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation). If the pattern above is matched against\n<pre>\n  (ab(cd)ef)\n</pre>\nthe value for the inner capturing parentheses (numbered 2) is \"ef\", which is\nthe last value taken on at the top level. If a capturing subpattern is not\nmatched at the top level, its final captured value is unset, even if it was\n(temporarily) set at a deeper level during the matching process.\n</P>\n<P>\nIf there are more than 15 capturing parentheses in a pattern, PCRE has to\nobtain extra memory to store data during a recursion, which it does by using\n<b>pcre_malloc</b>, freeing it via <b>pcre_free</b> afterwards. If no memory can\nbe obtained, the match fails with the PCRE_ERROR_NOMEMORY error.\n</P>\n<P>\nDo not confuse the (?R) item with the condition (R), which tests for recursion.\nConsider this pattern, which matches text in angle brackets, allowing for\narbitrary nesting. Only digits are allowed in nested brackets (that is, when\nrecursing), whereas any characters are permitted at the outer level.\n<pre>\n  &#60; (?: (?(R) \\d++  | [^&#60;&#62;]*+) | (?R)) * &#62;\n</pre>\nIn this pattern, (?(R) is the start of a conditional subpattern, with two\ndifferent alternatives for the recursive and non-recursive cases. The (?R) item\nis the actual recursive call.\n<a name=\"recursiondifference\"></a></P>\n<br><b>\nDifferences in recursion processing between PCRE and Perl\n</b><br>\n<P>\nRecursion processing in PCRE differs from Perl in two important ways. In PCRE\n(like Python, but unlike Perl), a recursive subpattern call is always treated\nas an atomic group. That is, once it has matched some of the subject string, it\nis never re-entered, even if it contains untried alternatives and there is a\nsubsequent matching failure. This can be illustrated by the following pattern,\nwhich purports to match a palindromic string that contains an odd number of\ncharacters (for example, \"a\", \"aba\", \"abcba\", \"abcdcba\"):\n<pre>\n  ^(.|(.)(?1)\\2)$\n</pre>\nThe idea is that it either matches a single character, or two identical\ncharacters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE\nit does not if the pattern is longer than three characters. Consider the\nsubject string \"abcba\":\n</P>\n<P>\nAt the top level, the first character is matched, but as it is not at the end\nof the string, the first alternative fails; the second alternative is taken\nand the recursion kicks in. The recursive call to subpattern 1 successfully\nmatches the next character (\"b\"). (Note that the beginning and end of line\ntests are not part of the recursion).\n</P>\n<P>\nBack at the top level, the next character (\"c\") is compared with what\nsubpattern 2 matched, which was \"a\". This fails. Because the recursion is\ntreated as an atomic group, there are now no backtracking points, and so the\nentire match fails. (Perl is able, at this point, to re-enter the recursion and\ntry the second alternative.) However, if the pattern is written with the\nalternatives in the other order, things are different:\n<pre>\n  ^((.)(?1)\\2|.)$\n</pre>\nThis time, the recursing alternative is tried first, and continues to recurse\nuntil it runs out of characters, at which point the recursion fails. But this\ntime we do have another alternative to try at the higher level. That is the big\ndifference: in the previous case the remaining alternative is at a deeper\nrecursion level, which PCRE cannot use.\n</P>\n<P>\nTo change the pattern so that it matches all palindromic strings, not just\nthose with an odd number of characters, it is tempting to change the pattern to\nthis:\n<pre>\n  ^((.)(?1)\\2|.?)$\n</pre>\nAgain, this works in Perl, but not in PCRE, and for the same reason. When a\ndeeper recursion has matched a single character, it cannot be entered again in\norder to match an empty string. The solution is to separate the two cases, and\nwrite out the odd and even cases as alternatives at the higher level:\n<pre>\n  ^(?:((.)(?1)\\2|)|((.)(?3)\\4|.))\n</pre>\nIf you want to match typical palindromic phrases, the pattern has to ignore all\nnon-word characters, which can be done like this:\n<pre>\n  ^\\W*+(?:((.)\\W*+(?1)\\W*+\\2|)|((.)\\W*+(?3)\\W*+\\4|\\W*+.\\W*+))\\W*+$\n</pre>\nIf run with the PCRE_CASELESS option, this pattern matches phrases such as \"A\nman, a plan, a canal: Panama!\" and it works well in both PCRE and Perl. Note\nthe use of the possessive quantifier *+ to avoid backtracking into sequences of\nnon-word characters. Without this, PCRE takes a great deal longer (ten times or\nmore) to match typical phrases, and Perl takes so long that you think it has\ngone into a loop.\n</P>\n<P>\n<b>WARNING</b>: The palindrome-matching patterns above work only if the subject\nstring does not start with a palindrome that is shorter than the entire string.\nFor example, although \"abcba\" is correctly matched, if the subject is \"ababa\",\nPCRE finds the palindrome \"aba\" at the start, then fails at top level because\nthe end of the string does not follow. Once again, it cannot jump back into the\nrecursion to try other alternatives, so the entire match fails.\n</P>\n<P>\nThe second way in which PCRE and Perl differ in their recursion processing is\nin the handling of captured values. In Perl, when a subpattern is called\nrecursively or as a subpattern (see the next section), it has no access to any\nvalues that were captured outside the recursion, whereas in PCRE these values\ncan be referenced. Consider this pattern:\n<pre>\n  ^(.)(\\1|a(?2))\n</pre>\nIn PCRE, this pattern matches \"bab\". The first capturing parentheses match \"b\",\nthen in the second group, when the back reference \\1 fails to match \"b\", the\nsecond alternative matches \"a\" and then recurses. In the recursion, \\1 does\nnow match \"b\" and so the whole match succeeds. In Perl, the pattern fails to\nmatch because inside the recursive call \\1 cannot access the externally set\nvalue.\n<a name=\"subpatternsassubroutines\"></a></P>\n<br><a name=\"SEC24\" href=\"#TOC1\">SUBPATTERNS AS SUBROUTINES</a><br>\n<P>\nIf the syntax for a recursive subpattern call (either by number or by\nname) is used outside the parentheses to which it refers, it operates like a\nsubroutine in a programming language. The called subpattern may be defined\nbefore or after the reference. A numbered reference can be absolute or\nrelative, as in these examples:\n<pre>\n  (...(absolute)...)...(?2)...\n  (...(relative)...)...(?-1)...\n  (...(?+1)...(relative)...\n</pre>\nAn earlier example pointed out that the pattern\n<pre>\n  (sens|respons)e and \\1ibility\n</pre>\nmatches \"sense and sensibility\" and \"response and responsibility\", but not\n\"sense and responsibility\". If instead the pattern\n<pre>\n  (sens|respons)e and (?1)ibility\n</pre>\nis used, it does match \"sense and responsibility\" as well as the other two\nstrings. Another example is given in the discussion of DEFINE above.\n</P>\n<P>\nAll subroutine calls, whether recursive or not, are always treated as atomic\ngroups. That is, once a subroutine has matched some of the subject string, it\nis never re-entered, even if it contains untried alternatives and there is a\nsubsequent matching failure. Any capturing parentheses that are set during the\nsubroutine call revert to their previous values afterwards.\n</P>\n<P>\nProcessing options such as case-independence are fixed when a subpattern is\ndefined, so if it is used as a subroutine, such options cannot be changed for\ndifferent calls. For example, consider this pattern:\n<pre>\n  (abc)(?i:(?-1))\n</pre>\nIt matches \"abcabc\". It does not match \"abcABC\" because the change of\nprocessing option does not affect the called subpattern.\n<a name=\"onigurumasubroutines\"></a></P>\n<br><a name=\"SEC25\" href=\"#TOC1\">ONIGURUMA SUBROUTINE SYNTAX</a><br>\n<P>\nFor compatibility with Oniguruma, the non-Perl syntax \\g followed by a name or\na number enclosed either in angle brackets or single quotes, is an alternative\nsyntax for referencing a subpattern as a subroutine, possibly recursively. Here\nare two of the examples used above, rewritten using this syntax:\n<pre>\n  (?&#60;pn&#62; \\( ( (?&#62;[^()]+) | \\g&#60;pn&#62; )* \\) )\n  (sens|respons)e and \\g'1'ibility\n</pre>\nPCRE supports an extension to Oniguruma: if a number is preceded by a\nplus or a minus sign it is taken as a relative reference. For example:\n<pre>\n  (abc)(?i:\\g&#60;-1&#62;)\n</pre>\nNote that \\g{...} (Perl syntax) and \\g&#60;...&#62; (Oniguruma syntax) are <i>not</i>\nsynonymous. The former is a back reference; the latter is a subroutine call.\n</P>\n<br><a name=\"SEC26\" href=\"#TOC1\">CALLOUTS</a><br>\n<P>\nPerl has a feature whereby using the sequence (?{...}) causes arbitrary Perl\ncode to be obeyed in the middle of matching a regular expression. This makes it\npossible, amongst other things, to extract different substrings that match the\nsame pair of parentheses when there is a repetition.\n</P>\n<P>\nPCRE provides a similar feature, but of course it cannot obey arbitrary Perl\ncode. The feature is called \"callout\". The caller of PCRE provides an external\nfunction by putting its entry point in the global variable <i>pcre_callout</i>\n(8-bit library) or <i>pcre[16|32]_callout</i> (16-bit or 32-bit library).\nBy default, this variable contains NULL, which disables all calling out.\n</P>\n<P>\nWithin a regular expression, (?C) indicates the points at which the external\nfunction is to be called. If you want to identify different callout points, you\ncan put a number less than 256 after the letter C. The default value is zero.\nFor example, this pattern has two callout points:\n<pre>\n  (?C1)abc(?C2)def\n</pre>\nIf the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are\nautomatically installed before each item in the pattern. They are all numbered\n255. If there is a conditional group in the pattern whose condition is an\nassertion, an additional callout is inserted just before the condition. An\nexplicit callout may also be set at this position, as in this example:\n<pre>\n  (?(?C9)(?=a)abc|def)\n</pre>\nNote that this applies only to assertion conditions, not to other types of\ncondition.\n</P>\n<P>\nDuring matching, when PCRE reaches a callout point, the external function is\ncalled. It is provided with the number of the callout, the position in the\npattern, and, optionally, one item of data originally supplied by the caller of\nthe matching function. The callout function may cause matching to proceed, to\nbacktrack, or to fail altogether.\n</P>\n<P>\nBy default, PCRE implements a number of optimizations at compile time and\nmatching time, and one side-effect is that sometimes callouts are skipped. If\nyou need all possible callouts to happen, you need to set options that disable\nthe relevant optimizations. More details, and a complete description of the\ninterface to the callout function, are given in the\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n<a name=\"backtrackcontrol\"></a></P>\n<br><a name=\"SEC27\" href=\"#TOC1\">BACKTRACKING CONTROL</a><br>\n<P>\nPerl 5.10 introduced a number of \"Special Backtracking Control Verbs\", which\nare still described in the Perl documentation as \"experimental and subject to\nchange or removal in a future version of Perl\". It goes on to say: \"Their usage\nin production code should be noted to avoid problems during upgrades.\" The same\nremarks apply to the PCRE features described in this section.\n</P>\n<P>\nThe new verbs make use of what was previously invalid syntax: an opening\nparenthesis followed by an asterisk. They are generally of the form\n(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving\ndifferently depending on whether or not a name is present. A name is any\nsequence of characters that does not include a closing parenthesis. The maximum\nlength of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit\nlibraries. If the name is empty, that is, if the closing parenthesis\nimmediately follows the colon, the effect is as if the colon were not there.\nAny number of these verbs may occur in a pattern.\n</P>\n<P>\nSince these verbs are specifically related to backtracking, most of them can be\nused only when the pattern is to be matched using one of the traditional\nmatching functions, because these use a backtracking algorithm. With the\nexception of (*FAIL), which behaves like a failing negative assertion, the\nbacktracking control verbs cause an error if encountered by a DFA matching\nfunction.\n</P>\n<P>\nThe behaviour of these verbs in\n<a href=\"#btrepeat\">repeated groups,</a>\n<a href=\"#btassert\">assertions,</a>\nand in\n<a href=\"#btsub\">subpatterns called as subroutines</a>\n(whether or not recursively) is documented below.\n<a name=\"nooptimize\"></a></P>\n<br><b>\nOptimizations that affect backtracking verbs\n</b><br>\n<P>\nPCRE contains some optimizations that are used to speed up matching by running\nsome checks at the start of each match attempt. For example, it may know the\nminimum length of matching subject, or that a particular character must be\npresent. When one of these optimizations bypasses the running of a match, any\nincluded backtracking verbs will not, of course, be processed. You can suppress\nthe start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option\nwhen calling <b>pcre_compile()</b> or <b>pcre_exec()</b>, or by starting the\npattern with (*NO_START_OPT). There is more discussion of this option in the\nsection entitled\n<a href=\"pcreapi.html#execoptions\">\"Option bits for <b>pcre_exec()</b>\"</a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<P>\nExperiments with Perl suggest that it too has similar optimizations, sometimes\nleading to anomalous results.\n</P>\n<br><b>\nVerbs that act immediately\n</b><br>\n<P>\nThe following verbs act as soon as they are encountered. They may not be\nfollowed by a name.\n<pre>\n   (*ACCEPT)\n</pre>\nThis verb causes the match to end successfully, skipping the remainder of the\npattern. However, when it is inside a subpattern that is called as a\nsubroutine, only that subpattern is ended successfully. Matching then continues\nat the outer level. If (*ACCEPT) in triggered in a positive assertion, the\nassertion succeeds; in a negative assertion, the assertion fails.\n</P>\n<P>\nIf (*ACCEPT) is inside capturing parentheses, the data so far is captured. For\nexample:\n<pre>\n  A((?:A|B(*ACCEPT)|C)D)\n</pre>\nThis matches \"AB\", \"AAD\", or \"ACD\"; when it matches \"AB\", \"B\" is captured by\nthe outer parentheses.\n<pre>\n  (*FAIL) or (*F)\n</pre>\nThis verb causes a matching failure, forcing backtracking to occur. It is\nequivalent to (?!) but easier to read. The Perl documentation notes that it is\nprobably useful only when combined with (?{}) or (??{}). Those are, of course,\nPerl features that are not present in PCRE. The nearest equivalent is the\ncallout feature, as for example in this pattern:\n<pre>\n  a+(?C)(*FAIL)\n</pre>\nA match with the string \"aaaa\" always fails, but the callout is taken before\neach backtrack happens (in this example, 10 times).\n</P>\n<br><b>\nRecording which path was taken\n</b><br>\n<P>\nThere is one verb whose main purpose is to track how a match was arrived at,\nthough it also has a secondary use in conjunction with advancing the match\nstarting point (see (*SKIP) below).\n<pre>\n  (*MARK:NAME) or (*:NAME)\n</pre>\nA name is always required with this verb. There may be as many instances of\n(*MARK) as you like in a pattern, and their names do not have to be unique.\n</P>\n<P>\nWhen a match succeeds, the name of the last-encountered (*MARK:NAME),\n(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the\ncaller as described in the section entitled\n<a href=\"pcreapi.html#extradata\">\"Extra data for <b>pcre_exec()</b>\"</a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation. Here is an example of <b>pcretest</b> output, where the /K\nmodifier requests the retrieval and outputting of (*MARK) data:\n<pre>\n    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/K\n  data&#62; XY\n   0: XY\n  MK: A\n  XZ\n   0: XZ\n  MK: B\n</pre>\nThe (*MARK) name is tagged with \"MK:\" in this output, and in this example it\nindicates which of the two alternatives matched. This is a more efficient way\nof obtaining this information than putting each alternative in its own\ncapturing parentheses.\n</P>\n<P>\nIf a verb with a name is encountered in a positive assertion that is true, the\nname is recorded and passed back if it is the last-encountered. This does not\nhappen for negative assertions or failing positive assertions.\n</P>\n<P>\nAfter a partial match or a failed match, the last encountered name in the\nentire match process is returned. For example:\n<pre>\n    re&#62; /X(*MARK:A)Y|X(*MARK:B)Z/K\n  data&#62; XP\n  No match, mark = B\n</pre>\nNote that in this unanchored example the mark is retained from the match\nattempt that started at the letter \"X\" in the subject. Subsequent match\nattempts starting at \"P\" and then with an empty string do not get as far as the\n(*MARK) item, but nevertheless do not reset it.\n</P>\n<P>\nIf you are interested in (*MARK) values after failed matches, you should\nprobably set the PCRE_NO_START_OPTIMIZE option\n<a href=\"#nooptimize\">(see above)</a>\nto ensure that the match is always attempted.\n</P>\n<br><b>\nVerbs that act after backtracking\n</b><br>\n<P>\nThe following verbs do nothing when they are encountered. Matching continues\nwith what follows, but if there is no subsequent match, causing a backtrack to\nthe verb, a failure is forced. That is, backtracking cannot pass to the left of\nthe verb. However, when one of these verbs appears inside an atomic group or an\nassertion that is true, its effect is confined to that group, because once the\ngroup has been matched, there is never any backtracking into it. In this\nsituation, backtracking can \"jump back\" to the left of the entire atomic group\nor assertion. (Remember also, as stated above, that this localization also\napplies in subroutine calls.)\n</P>\n<P>\nThese verbs differ in exactly what kind of failure occurs when backtracking\nreaches them. The behaviour described below is what happens when the verb is\nnot in a subroutine or an assertion. Subsequent sections cover these special\ncases.\n<pre>\n  (*COMMIT)\n</pre>\nThis verb, which may not be followed by a name, causes the whole match to fail\noutright if there is a later matching failure that causes backtracking to reach\nit. Even if the pattern is unanchored, no further attempts to find a match by\nadvancing the starting point take place. If (*COMMIT) is the only backtracking\nverb that is encountered, once it has been passed <b>pcre_exec()</b> is\ncommitted to finding a match at the current starting point, or not at all. For\nexample:\n<pre>\n  a+(*COMMIT)b\n</pre>\nThis matches \"xxaab\" but not \"aacaab\". It can be thought of as a kind of\ndynamic anchor, or \"I've started, so I must finish.\" The name of the most\nrecently passed (*MARK) in the path is passed back when (*COMMIT) forces a\nmatch failure.\n</P>\n<P>\nIf there is more than one backtracking verb in a pattern, a different one that\nfollows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a\nmatch does not always guarantee that a match must be at this starting point.\n</P>\n<P>\nNote that (*COMMIT) at the start of a pattern is not the same as an anchor,\nunless PCRE's start-of-match optimizations are turned off, as shown in this\noutput from <b>pcretest</b>:\n<pre>\n    re&#62; /(*COMMIT)abc/\n  data&#62; xyzabc\n   0: abc\n  data&#62; xyzabc\\Y\n  No match\n</pre>\nFor this pattern, PCRE knows that any match must start with \"a\", so the\noptimization skips along the subject to \"a\" before applying the pattern to the\nfirst set of data. The match attempt then succeeds. In the second set of data,\nthe escape sequence \\Y is interpreted by the <b>pcretest</b> program. It causes\nthe PCRE_NO_START_OPTIMIZE option to be set when <b>pcre_exec()</b> is called.\nThis disables the optimization that skips along to the first character. The\npattern is now applied starting at \"x\", and so the (*COMMIT) causes the match\nto fail without trying any other starting points.\n<pre>\n  (*PRUNE) or (*PRUNE:NAME)\n</pre>\nThis verb causes the match to fail at the current starting position in the\nsubject if there is a later matching failure that causes backtracking to reach\nit. If the pattern is unanchored, the normal \"bumpalong\" advance to the next\nstarting character then happens. Backtracking can occur as usual to the left of\n(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but\nif there is no match to the right, backtracking cannot cross (*PRUNE). In\nsimple cases, the use of (*PRUNE) is just an alternative to an atomic group or\npossessive quantifier, but there are some uses of (*PRUNE) that cannot be\nexpressed in any other way. In an anchored pattern (*PRUNE) has the same effect\nas (*COMMIT).\n</P>\n<P>\nThe behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE).\nIt is like (*MARK:NAME) in that the name is remembered for passing back to the\ncaller. However, (*SKIP:NAME) searches only for names set with (*MARK).\n<pre>\n  (*SKIP)\n</pre>\nThis verb, when given without a name, is like (*PRUNE), except that if the\npattern is unanchored, the \"bumpalong\" advance is not to the next character,\nbut to the position in the subject where (*SKIP) was encountered. (*SKIP)\nsignifies that whatever text was matched leading up to it cannot be part of a\nsuccessful match. Consider:\n<pre>\n  a+(*SKIP)b\n</pre>\nIf the subject is \"aaaac...\", after the first match attempt fails (starting at\nthe first character in the string), the starting point skips on to start the\nnext attempt at \"c\". Note that a possessive quantifer does not have the same\neffect as this example; although it would suppress backtracking during the\nfirst match attempt, the second attempt would start at the second character\ninstead of skipping on to \"c\".\n<pre>\n  (*SKIP:NAME)\n</pre>\nWhen (*SKIP) has an associated name, its behaviour is modified. When it is\ntriggered, the previous path through the pattern is searched for the most\nrecent (*MARK) that has the same name. If one is found, the \"bumpalong\" advance\nis to the subject position that corresponds to that (*MARK) instead of to where\n(*SKIP) was encountered. If no (*MARK) with a matching name is found, the\n(*SKIP) is ignored.\n</P>\n<P>\nNote that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores\nnames that are set by (*PRUNE:NAME) or (*THEN:NAME).\n<pre>\n  (*THEN) or (*THEN:NAME)\n</pre>\nThis verb causes a skip to the next innermost alternative when backtracking\nreaches it. That is, it cancels any further backtracking within the current\nalternative. Its name comes from the observation that it can be used for a\npattern-based if-then-else block:\n<pre>\n  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...\n</pre>\nIf the COND1 pattern matches, FOO is tried (and possibly further items after\nthe end of the group if FOO succeeds); on failure, the matcher skips to the\nsecond alternative and tries COND2, without backtracking into COND1. If that\nsucceeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no\nmore alternatives, so there is a backtrack to whatever came before the entire\ngroup. If (*THEN) is not inside an alternation, it acts like (*PRUNE).\n</P>\n<P>\nThe behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN).\nIt is like (*MARK:NAME) in that the name is remembered for passing back to the\ncaller. However, (*SKIP:NAME) searches only for names set with (*MARK).\n</P>\n<P>\nA subpattern that does not contain a | character is just a part of the\nenclosing alternative; it is not a nested alternation with only one\nalternative. The effect of (*THEN) extends beyond such a subpattern to the\nenclosing alternative. Consider this pattern, where A, B, etc. are complex\npattern fragments that do not contain any | characters at this level:\n<pre>\n  A (B(*THEN)C) | D\n</pre>\nIf A and B are matched, but there is a failure in C, matching does not\nbacktrack into A; instead it moves to the next alternative, that is, D.\nHowever, if the subpattern containing (*THEN) is given an alternative, it\nbehaves differently:\n<pre>\n  A (B(*THEN)C | (*FAIL)) | D\n</pre>\nThe effect of (*THEN) is now confined to the inner subpattern. After a failure\nin C, matching moves to (*FAIL), which causes the whole subpattern to fail\nbecause there are no more alternatives to try. In this case, matching does now\nbacktrack into A.\n</P>\n<P>\nNote that a conditional subpattern is not considered as having two\nalternatives, because only one is ever used. In other words, the | character in\na conditional subpattern has a different meaning. Ignoring white space,\nconsider:\n<pre>\n  ^.*? (?(?=a) a | b(*THEN)c )\n</pre>\nIf the subject is \"ba\", this pattern does not match. Because .*? is ungreedy,\nit initially matches zero characters. The condition (?=a) then fails, the\ncharacter \"b\" is matched, but \"c\" is not. At this point, matching does not\nbacktrack to .*? as might perhaps be expected from the presence of the |\ncharacter. The conditional subpattern is part of the single alternative that\ncomprises the whole pattern, and so the match fails. (If there was a backtrack\ninto .*?, allowing it to match \"b\", the match would succeed.)\n</P>\n<P>\nThe verbs just described provide four different \"strengths\" of control when\nsubsequent matching fails. (*THEN) is the weakest, carrying on the match at the\nnext alternative. (*PRUNE) comes next, failing the match at the current\nstarting position, but allowing an advance to the next character (for an\nunanchored pattern). (*SKIP) is similar, except that the advance may be more\nthan one character. (*COMMIT) is the strongest, causing the entire match to\nfail.\n</P>\n<br><b>\nMore than one backtracking verb\n</b><br>\n<P>\nIf more than one backtracking verb is present in a pattern, the one that is\nbacktracked onto first acts. For example, consider this pattern, where A, B,\netc. are complex pattern fragments:\n<pre>\n  (A(*COMMIT)B(*THEN)C|ABD)\n</pre>\nIf A matches but B fails, the backtrack to (*COMMIT) causes the entire match to\nfail. However, if A and B match, but C fails, the backtrack to (*THEN) causes\nthe next alternative (ABD) to be tried. This behaviour is consistent, but is\nnot always the same as Perl's. It means that if two or more backtracking verbs\nappear in succession, all the the last of them has no effect. Consider this\nexample:\n<pre>\n  ...(*COMMIT)(*PRUNE)...\n</pre>\nIf there is a matching failure to the right, backtracking onto (*PRUNE) causes\nit to be triggered, and its action is taken. There can never be a backtrack\nonto (*COMMIT).\n<a name=\"btrepeat\"></a></P>\n<br><b>\nBacktracking verbs in repeated groups\n</b><br>\n<P>\nPCRE differs from Perl in its handling of backtracking verbs in repeated\ngroups. For example, consider:\n<pre>\n  /(a(*COMMIT)b)+ac/\n</pre>\nIf the subject is \"abac\", Perl matches, but PCRE fails because the (*COMMIT) in\nthe second repeat of the group acts.\n<a name=\"btassert\"></a></P>\n<br><b>\nBacktracking verbs in assertions\n</b><br>\n<P>\n(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack.\n</P>\n<P>\n(*ACCEPT) in a positive assertion causes the assertion to succeed without any\nfurther processing. In a negative assertion, (*ACCEPT) causes the assertion to\nfail without any further processing.\n</P>\n<P>\nThe other backtracking verbs are not treated specially if they appear in a\npositive assertion. In particular, (*THEN) skips to the next alternative in the\ninnermost enclosing group that has alternations, whether or not this is within\nthe assertion.\n</P>\n<P>\nNegative assertions are, however, different, in order to ensure that changing a\npositive assertion into a negative assertion changes its result. Backtracking\ninto (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true,\nwithout considering any further alternative branches in the assertion.\nBacktracking into (*THEN) causes it to skip to the next enclosing alternative\nwithin the assertion (the normal behaviour), but if the assertion does not have\nsuch an alternative, (*THEN) behaves like (*PRUNE).\n<a name=\"btsub\"></a></P>\n<br><b>\nBacktracking verbs in subroutines\n</b><br>\n<P>\nThese behaviours occur whether or not the subpattern is called recursively.\nPerl's treatment of subroutines is different in some cases.\n</P>\n<P>\n(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces\nan immediate backtrack.\n</P>\n<P>\n(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to\nsucceed without any further processing. Matching then continues after the\nsubroutine call.\n</P>\n<P>\n(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause\nthe subroutine match to fail.\n</P>\n<P>\n(*THEN) skips to the next alternative in the innermost enclosing group within\nthe subpattern that has alternatives. If there is no such group within the\nsubpattern, (*THEN) causes the subroutine match to fail.\n</P>\n<br><a name=\"SEC28\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcreapi</b>(3), <b>pcrecallout</b>(3), <b>pcrematching</b>(3),\n<b>pcresyntax</b>(3), <b>pcre</b>(3), <b>pcre16(3)</b>, <b>pcre32(3)</b>.\n</P>\n<br><a name=\"SEC29\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC30\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 23 October 2016\n<br>\nCopyright &copy; 1997-2016 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcreperform.html",
    "content": "<html>\n<head>\n<title>pcreperform specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcreperform man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nPCRE PERFORMANCE\n</b><br>\n<P>\nTwo aspects of performance are discussed below: memory usage and processing\ntime. The way you express your pattern as a regular expression can affect both\nof them.\n</P>\n<br><b>\nCOMPILED PATTERN MEMORY USAGE\n</b><br>\n<P>\nPatterns are compiled by PCRE into a reasonably efficient interpretive code, so\nthat most simple patterns do not use much memory. However, there is one case\nwhere the memory usage of a compiled pattern can be unexpectedly large. If a\nparenthesized subpattern has a quantifier with a minimum greater than 1 and/or\na limited maximum, the whole subpattern is repeated in the compiled code. For\nexample, the pattern\n<pre>\n  (abc|def){2,4}\n</pre>\nis compiled as if it were\n<pre>\n  (abc|def)(abc|def)((abc|def)(abc|def)?)?\n</pre>\n(Technical aside: It is done this way so that backtrack points within each of\nthe repetitions can be independently maintained.)\n</P>\n<P>\nFor regular expressions whose quantifiers use only small numbers, this is not\nusually a problem. However, if the numbers are large, and particularly if such\nrepetitions are nested, the memory usage can become an embarrassment. For\nexample, the very simple pattern\n<pre>\n  ((ab){1,1000}c){1,3}\n</pre>\nuses 51K bytes when compiled using the 8-bit library. When PCRE is compiled\nwith its default internal pointer size of two bytes, the size limit on a\ncompiled pattern is 64K data units, and this is reached with the above pattern\nif the outer repetition is increased from 3 to 4. PCRE can be compiled to use\nlarger internal pointers and thus handle larger compiled patterns, but it is\nbetter to try to rewrite your pattern to use less memory if you can.\n</P>\n<P>\nOne way of reducing the memory usage for such patterns is to make use of PCRE's\n<a href=\"pcrepattern.html#subpatternsassubroutines\">\"subroutine\"</a>\nfacility. Re-writing the above pattern as\n<pre>\n  ((ab)(?2){0,999}c)(?1){0,2}\n</pre>\nreduces the memory requirements to 18K, and indeed it remains under 20K even\nwith the outer repetition increased to 100. However, this pattern is not\nexactly equivalent, because the \"subroutine\" calls are treated as\n<a href=\"pcrepattern.html#atomicgroup\">atomic groups</a>\ninto which there can be no backtracking if there is a subsequent matching\nfailure. Therefore, PCRE cannot do this kind of rewriting automatically.\nFurthermore, there is a noticeable loss of speed when executing the modified\npattern. Nevertheless, if the atomic grouping is not a problem and the loss of\nspeed is acceptable, this kind of rewriting will allow you to process patterns\nthat PCRE cannot otherwise handle.\n</P>\n<br><b>\nSTACK USAGE AT RUN TIME\n</b><br>\n<P>\nWhen <b>pcre_exec()</b> or <b>pcre[16|32]_exec()</b> is used for matching, certain\nkinds of pattern can cause it to use large amounts of the process stack. In\nsome environments the default process stack is quite small, and if it runs out\nthe result is often SIGSEGV. This issue is probably the most frequently raised\nproblem with PCRE. Rewriting your pattern can often help. The\n<a href=\"pcrestack.html\"><b>pcrestack</b></a>\ndocumentation discusses this issue in detail.\n</P>\n<br><b>\nPROCESSING TIME\n</b><br>\n<P>\nCertain items in regular expression patterns are processed more efficiently\nthan others. It is more efficient to use a character class like [aeiou] than a\nset of single-character alternatives such as (a|e|i|o|u). In general, the\nsimplest construction that provides the required behaviour is usually the most\nefficient. Jeffrey Friedl's book contains a lot of useful general discussion\nabout optimizing regular expressions for efficient performance. This document\ncontains a few observations about PCRE.\n</P>\n<P>\nUsing Unicode character properties (the \\p, \\P, and \\X escapes) is slow,\nbecause PCRE has to use a multi-stage table lookup whenever it needs a\ncharacter's property. If you can find an alternative pattern that does not use\ncharacter properties, it will probably be faster.\n</P>\n<P>\nBy default, the escape sequences \\b, \\d, \\s, and \\w, and the POSIX\ncharacter classes such as [:alpha:] do not use Unicode properties, partly for\nbackwards compatibility, and partly for performance reasons. However, you can\nset PCRE_UCP if you want Unicode character properties to be used. This can\ndouble the matching time for items such as \\d, when matched with\na traditional matching function; the performance loss is less with\na DFA matching function, and in both cases there is not much difference for\n\\b.\n</P>\n<P>\nWhen a pattern begins with .* not in parentheses, or in parentheses that are\nnot the subject of a backreference, and the PCRE_DOTALL option is set, the\npattern is implicitly anchored by PCRE, since it can match only at the start of\na subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this\noptimization, because the . metacharacter does not then match a newline, and if\nthe subject string contains newlines, the pattern may match from the character\nimmediately following one of them instead of from the very start. For example,\nthe pattern\n<pre>\n  .*second\n</pre>\nmatches the subject \"first\\nand second\" (where \\n stands for a newline\ncharacter), with the match starting at the seventh character. In order to do\nthis, PCRE has to retry the match starting after every newline in the subject.\n</P>\n<P>\nIf you are using such a pattern with subject strings that do not contain\nnewlines, the best performance is obtained by setting PCRE_DOTALL, or starting\nthe pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE\nfrom having to scan along the subject looking for a newline to restart at.\n</P>\n<P>\nBeware of patterns that contain nested indefinite repeats. These can take a\nlong time to run when applied to a string that does not match. Consider the\npattern fragment\n<pre>\n  ^(a+)*\n</pre>\nThis can match \"aaaa\" in 16 different ways, and this number increases very\nrapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\ntimes, and for each of those cases other than 0 or 4, the + repeats can match\ndifferent numbers of times.) When the remainder of the pattern is such that the\nentire match is going to fail, PCRE has in principle to try every possible\nvariation, and this can take an extremely long time, even for relatively short\nstrings.\n</P>\n<P>\nAn optimization catches some of the more simple cases such as\n<pre>\n  (a+)*b\n</pre>\nwhere a literal character follows. Before embarking on the standard matching\nprocedure, PCRE checks that there is a \"b\" later in the subject string, and if\nthere is not, it fails the match immediately. However, when there is no\nfollowing literal this optimization cannot be used. You can see the difference\nby comparing the behaviour of\n<pre>\n  (a+)*\\d\n</pre>\nwith the pattern above. The former gives a failure almost instantly when\napplied to a whole line of \"a\" characters, whereas the latter takes an\nappreciable time with strings longer than about 20 characters.\n</P>\n<P>\nIn many cases, the solution to this kind of performance issue is to use an\natomic group or a possessive quantifier.\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 25 August 2012\n<br>\nCopyright &copy; 1997-2012 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcreposix.html",
    "content": "<html>\n<head>\n<title>pcreposix specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcreposix man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">DESCRIPTION</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">COMPILING A PATTERN</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">MATCHING NEWLINE CHARACTERS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">MATCHING A PATTERN</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">ERROR MESSAGES</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">MEMORY USAGE</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">AUTHOR</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS</a><br>\n<P>\n<b>#include &#60;pcreposix.h&#62;</b>\n</P>\n<P>\n<b>int regcomp(regex_t *<i>preg</i>, const char *<i>pattern</i>,</b>\n<b>     int <i>cflags</i>);</b>\n<br>\n<br>\n<b>int regexec(regex_t *<i>preg</i>, const char *<i>string</i>,</b>\n<b>     size_t <i>nmatch</i>, regmatch_t <i>pmatch</i>[], int <i>eflags</i>);</b>\n<b>     size_t regerror(int <i>errcode</i>, const regex_t *<i>preg</i>,</b>\n<b>     char *<i>errbuf</i>, size_t <i>errbuf_size</i>);</b>\n<br>\n<br>\n<b>void regfree(regex_t *<i>preg</i>);</b>\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\nThis set of functions provides a POSIX-style API for the PCRE regular\nexpression 8-bit library. See the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation for a description of PCRE's native API, which contains much\nadditional functionality. There is no POSIX-style wrapper for PCRE's 16-bit\nand 32-bit library.\n</P>\n<P>\nThe functions described here are just wrapper functions that ultimately call\nthe PCRE native API. Their prototypes are defined in the <b>pcreposix.h</b>\nheader file, and on Unix systems the library itself is called\n<b>pcreposix.a</b>, so can be accessed by adding <b>-lpcreposix</b> to the\ncommand for linking an application that uses them. Because the POSIX functions\ncall the native ones, it is also necessary to add <b>-lpcre</b>.\n</P>\n<P>\nI have implemented only those POSIX option bits that can be reasonably mapped\nto PCRE native options. In addition, the option REG_EXTENDED is defined with\nthe value zero. This has no effect, but since programs that are written to the\nPOSIX interface often use it, this makes it easier to slot in PCRE as a\nreplacement library. Other POSIX options are not even defined.\n</P>\n<P>\nThere are also some other options that are not defined by POSIX. These have\nbeen added at the request of users who want to make use of certain\nPCRE-specific features via the POSIX calling interface.\n</P>\n<P>\nWhen PCRE is called via these functions, it is only the API that is POSIX-like\nin style. The syntax and semantics of the regular expressions themselves are\nstill those of Perl, subject to the setting of various PCRE options, as\ndescribed below. \"POSIX-like in style\" means that the API approximates to the\nPOSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding\ndomains it is probably even less compatible.\n</P>\n<P>\nThe header for these functions is supplied as <b>pcreposix.h</b> to avoid any\npotential clash with other POSIX libraries. It can, of course, be renamed or\naliased as <b>regex.h</b>, which is the \"correct\" name. It provides two\nstructure types, <i>regex_t</i> for compiled internal forms, and\n<i>regmatch_t</i> for returning captured substrings. It also defines some\nconstants whose names start with \"REG_\"; these are used for setting options and\nidentifying error codes.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">COMPILING A PATTERN</a><br>\n<P>\nThe function <b>regcomp()</b> is called to compile a pattern into an\ninternal form. The pattern is a C string terminated by a binary zero, and\nis passed in the argument <i>pattern</i>. The <i>preg</i> argument is a pointer\nto a <b>regex_t</b> structure that is used as a base for storing information\nabout the compiled regular expression.\n</P>\n<P>\nThe argument <i>cflags</i> is either zero, or contains one or more of the bits\ndefined by the following macros:\n<pre>\n  REG_DOTALL\n</pre>\nThe PCRE_DOTALL option is set when the regular expression is passed for\ncompilation to the native function. Note that REG_DOTALL is not part of the\nPOSIX standard.\n<pre>\n  REG_ICASE\n</pre>\nThe PCRE_CASELESS option is set when the regular expression is passed for\ncompilation to the native function.\n<pre>\n  REG_NEWLINE\n</pre>\nThe PCRE_MULTILINE option is set when the regular expression is passed for\ncompilation to the native function. Note that this does <i>not</i> mimic the\ndefined POSIX behaviour for REG_NEWLINE (see the following section).\n<pre>\n  REG_NOSUB\n</pre>\nThe PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed\nfor compilation to the native function. In addition, when a pattern that is\ncompiled with this flag is passed to <b>regexec()</b> for matching, the\n<i>nmatch</i> and <i>pmatch</i> arguments are ignored, and no captured strings\nare returned.\n<pre>\n  REG_UCP\n</pre>\nThe PCRE_UCP option is set when the regular expression is passed for\ncompilation to the native function. This causes PCRE to use Unicode properties\nwhen matchine \\d, \\w, etc., instead of just recognizing ASCII values. Note\nthat REG_UTF8 is not part of the POSIX standard.\n<pre>\n  REG_UNGREEDY\n</pre>\nThe PCRE_UNGREEDY option is set when the regular expression is passed for\ncompilation to the native function. Note that REG_UNGREEDY is not part of the\nPOSIX standard.\n<pre>\n  REG_UTF8\n</pre>\nThe PCRE_UTF8 option is set when the regular expression is passed for\ncompilation to the native function. This causes the pattern itself and all data\nstrings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8\nis not part of the POSIX standard.\n</P>\n<P>\nIn the absence of these flags, no options are passed to the native function.\nThis means the the regex is compiled with PCRE default semantics. In\nparticular, the way it handles newline characters in the subject string is the\nPerl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\n<i>some</i> of the effects specified for REG_NEWLINE. It does not affect the way\nnewlines are matched by . (they are not) or by a negative class such as [^a]\n(they are).\n</P>\n<P>\nThe yield of <b>regcomp()</b> is zero on success, and non-zero otherwise. The\n<i>preg</i> structure is filled in on success, and one member of the structure\nis public: <i>re_nsub</i> contains the number of capturing subpatterns in\nthe regular expression. Various error codes are defined in the header file.\n</P>\n<P>\nNOTE: If the yield of <b>regcomp()</b> is non-zero, you must not attempt to\nuse the contents of the <i>preg</i> structure. If, for example, you pass it to\n<b>regexec()</b>, the result is undefined and your program is likely to crash.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">MATCHING NEWLINE CHARACTERS</a><br>\n<P>\nThis area is not simple, because POSIX and Perl take different views of things.\nIt is not possible to get PCRE to obey POSIX semantics, but then PCRE was never\nintended to be a POSIX engine. The following table lists the different\npossibilities for matching newline characters in PCRE:\n<pre>\n                          Default   Change with\n\n  . matches newline          no     PCRE_DOTALL\n  newline matches [^a]       yes    not changeable\n  $ matches \\n at end        yes    PCRE_DOLLARENDONLY\n  $ matches \\n in middle     no     PCRE_MULTILINE\n  ^ matches \\n in middle     no     PCRE_MULTILINE\n</pre>\nThis is the equivalent table for POSIX:\n<pre>\n                          Default   Change with\n\n  . matches newline          yes    REG_NEWLINE\n  newline matches [^a]       yes    REG_NEWLINE\n  $ matches \\n at end        no     REG_NEWLINE\n  $ matches \\n in middle     no     REG_NEWLINE\n  ^ matches \\n in middle     no     REG_NEWLINE\n</pre>\nPCRE's behaviour is the same as Perl's, except that there is no equivalent for\nPCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop\nnewline from matching [^a].\n</P>\n<P>\nThe default POSIX newline handling can be obtained by setting PCRE_DOTALL and\nPCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the\nREG_NEWLINE action.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">MATCHING A PATTERN</a><br>\n<P>\nThe function <b>regexec()</b> is called to match a compiled pattern <i>preg</i>\nagainst a given <i>string</i>, which is by default terminated by a zero byte\n(but see REG_STARTEND below), subject to the options in <i>eflags</i>. These can\nbe:\n<pre>\n  REG_NOTBOL\n</pre>\nThe PCRE_NOTBOL option is set when calling the underlying PCRE matching\nfunction.\n<pre>\n  REG_NOTEMPTY\n</pre>\nThe PCRE_NOTEMPTY option is set when calling the underlying PCRE matching\nfunction. Note that REG_NOTEMPTY is not part of the POSIX standard. However,\nsetting this option can give more POSIX-like behaviour in some situations.\n<pre>\n  REG_NOTEOL\n</pre>\nThe PCRE_NOTEOL option is set when calling the underlying PCRE matching\nfunction.\n<pre>\n  REG_STARTEND\n</pre>\nThe string is considered to start at <i>string</i> + <i>pmatch[0].rm_so</i> and\nto have a terminating NUL located at <i>string</i> + <i>pmatch[0].rm_eo</i>\n(there need not actually be a NUL at that location), regardless of the value of\n<i>nmatch</i>. This is a BSD extension, compatible with but not specified by\nIEEE Standard 1003.2 (POSIX.2), and should be used with caution in software\nintended to be portable to other systems. Note that a non-zero <i>rm_so</i> does\nnot imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not\nhow it is matched.\n</P>\n<P>\nIf the pattern was compiled with the REG_NOSUB flag, no data about any matched\nstrings is returned. The <i>nmatch</i> and <i>pmatch</i> arguments of\n<b>regexec()</b> are ignored.\n</P>\n<P>\nIf the value of <i>nmatch</i> is zero, or if the value <i>pmatch</i> is NULL,\nno data about any matched strings is returned.\n</P>\n<P>\nOtherwise,the portion of the string that was matched, and also any captured\nsubstrings, are returned via the <i>pmatch</i> argument, which points to an\narray of <i>nmatch</i> structures of type <i>regmatch_t</i>, containing the\nmembers <i>rm_so</i> and <i>rm_eo</i>. These contain the offset to the first\ncharacter of each substring and the offset to the first character after the end\nof each substring, respectively. The 0th element of the vector relates to the\nentire portion of <i>string</i> that was matched; subsequent elements relate to\nthe capturing subpatterns of the regular expression. Unused entries in the\narray have both structure members set to -1.\n</P>\n<P>\nA successful match yields a zero return; various error codes are defined in the\nheader file, of which REG_NOMATCH is the \"expected\" failure code.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">ERROR MESSAGES</a><br>\n<P>\nThe <b>regerror()</b> function maps a non-zero errorcode from either\n<b>regcomp()</b> or <b>regexec()</b> to a printable message. If <i>preg</i> is not\nNULL, the error should have arisen from the use of that structure. A message\nterminated by a binary zero is placed in <i>errbuf</i>. The length of the\nmessage, including the zero, is limited to <i>errbuf_size</i>. The yield of the\nfunction is the size of buffer needed to hold the whole message.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">MEMORY USAGE</a><br>\n<P>\nCompiling a regular expression causes memory to be allocated and associated\nwith the <i>preg</i> structure. The function <b>regfree()</b> frees all such\nmemory, after which <i>preg</i> may no longer be used as a compiled expression.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 09 January 2012\n<br>\nCopyright &copy; 1997-2012 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcreprecompile.html",
    "content": "<html>\n<head>\n<title>pcreprecompile specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcreprecompile man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">SAVING A COMPILED PATTERN</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">RE-USING A PRECOMPILED PATTERN</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">AUTHOR</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a><br>\n<P>\nIf you are running an application that uses a large number of regular\nexpression patterns, it may be useful to store them in a precompiled form\ninstead of having to compile them every time the application is run.\nIf you are not using any private character tables (see the\n<a href=\"pcre_maketables.html\"><b>pcre_maketables()</b></a>\ndocumentation), this is relatively straightforward. If you are using private\ntables, it is a little bit more complicated. However, if you are using the\njust-in-time optimization feature, it is not possible to save and reload the\nJIT data.\n</P>\n<P>\nIf you save compiled patterns to a file, you can copy them to a different host\nand run them there. If the two hosts have different endianness (byte order),\nyou should run the <b>pcre[16|32]_pattern_to_host_byte_order()</b> function on the\nnew host before trying to match the pattern. The matching functions return\nPCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness.\n</P>\n<P>\nCompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes, and saving and\nrestoring a compiled pattern loses any JIT optimization data.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">SAVING A COMPILED PATTERN</a><br>\n<P>\nThe value returned by <b>pcre[16|32]_compile()</b> points to a single block of\nmemory that holds the compiled pattern and associated data. You can find the\nlength of this block in bytes by calling <b>pcre[16|32]_fullinfo()</b> with an\nargument of PCRE_INFO_SIZE. You can then save the data in any appropriate\nmanner. Here is sample code for the 8-bit library that compiles a pattern and\nwrites it to a file. It assumes that the variable <i>fd</i> refers to a file\nthat is open for output:\n<pre>\n  int erroroffset, rc, size;\n  char *error;\n  pcre *re;\n\n  re = pcre_compile(\"my pattern\", 0, &error, &erroroffset, NULL);\n  if (re == NULL) { ... handle errors ... }\n  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);\n  if (rc &#60; 0) { ... handle errors ... }\n  rc = fwrite(re, 1, size, fd);\n  if (rc != size) { ... handle errors ... }\n</pre>\nIn this example, the bytes that comprise the compiled pattern are copied\nexactly. Note that this is binary data that may contain any of the 256 possible\nbyte values. On systems that make a distinction between binary and non-binary\ndata, be sure that the file is opened for binary output.\n</P>\n<P>\nIf you want to write more than one pattern to a file, you will have to devise a\nway of separating them. For binary data, preceding each pattern with its length\nis probably the most straightforward approach. Another possibility is to write\nout the data in hexadecimal instead of binary, one pattern to a line.\n</P>\n<P>\nSaving compiled patterns in a file is only one possible way of storing them for\nlater use. They could equally well be saved in a database, or in the memory of\nsome daemon process that passes them via sockets to the processes that want\nthem.\n</P>\n<P>\nIf the pattern has been studied, it is also possible to save the normal study\ndata in a similar way to the compiled pattern itself. However, if the\nPCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot\nbe saved because it is too dependent on the current environment. When studying\ngenerates additional information, <b>pcre[16|32]_study()</b> returns a pointer to a\n<b>pcre[16|32]_extra</b> data block. Its format is defined in the\n<a href=\"pcreapi.html#extradata\">section on matching a pattern</a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation. The <i>study_data</i> field points to the binary study data, and\nthis is what you must save (not the <b>pcre[16|32]_extra</b> block itself). The\nlength of the study data can be obtained by calling <b>pcre[16|32]_fullinfo()</b>\nwith an argument of PCRE_INFO_STUDYSIZE. Remember to check that\n<b>pcre[16|32]_study()</b> did return a non-NULL value before trying to save the\nstudy data.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">RE-USING A PRECOMPILED PATTERN</a><br>\n<P>\nRe-using a precompiled pattern is straightforward. Having reloaded it into main\nmemory, called <b>pcre[16|32]_pattern_to_host_byte_order()</b> if necessary, you\npass its pointer to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> in\nthe usual way.\n</P>\n<P>\nHowever, if you passed a pointer to custom character tables when the pattern\nwas compiled (the <i>tableptr</i> argument of <b>pcre[16|32]_compile()</b>), you\nmust now pass a similar pointer to <b>pcre[16|32]_exec()</b> or\n<b>pcre[16|32]_dfa_exec()</b>, because the value saved with the compiled pattern\nwill obviously be nonsense. A field in a <b>pcre[16|32]_extra()</b> block is used\nto pass this data, as described in the\n<a href=\"pcreapi.html#extradata\">section on matching a pattern</a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<P>\n<b>Warning:</b> The tables that <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b> use\nmust be the same as those that were used when the pattern was compiled. If this\nis not the case, the behaviour is undefined.\n</P>\n<P>\nIf you did not provide custom character tables when the pattern was compiled,\nthe pointer in the compiled pattern is NULL, which causes the matching\nfunctions to use PCRE's internal tables. Thus, you do not need to take any\nspecial action at run time in this case.\n</P>\n<P>\nIf you saved study data with the compiled pattern, you need to create your own\n<b>pcre[16|32]_extra</b> data block and set the <i>study_data</i> field to point\nto the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in\nthe <i>flags</i> field to indicate that study data is present. Then pass the\n<b>pcre[16|32]_extra</b> block to the matching function in the usual way. If the\npattern was studied for just-in-time optimization, that data cannot be saved,\nand so is lost by a save/restore cycle.\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a><br>\n<P>\nIn general, it is safest to recompile all saved patterns when you update to a\nnew PCRE release, though not all updates actually require this.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 12 November 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcresample.html",
    "content": "<html>\n<head>\n<title>pcresample specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcresample man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nPCRE SAMPLE PROGRAM\n</b><br>\n<P>\nA simple, complete demonstration program, to get you started with using PCRE,\nis supplied in the file <i>pcredemo.c</i> in the PCRE distribution. A listing of\nthis program is given in the\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\ndocumentation. If you do not have a copy of the PCRE distribution, you can save\nthis listing to re-create <i>pcredemo.c</i>.\n</P>\n<P>\nThe demonstration program, which uses the original PCRE 8-bit library, compiles\nthe regular expression that is its first argument, and matches it against the\nsubject string in its second argument. No PCRE options are set, and default\ncharacter tables are used. If matching succeeds, the program outputs the\nportion of the subject that matched, together with the contents of any captured\nsubstrings.\n</P>\n<P>\nIf the -g option is given on the command line, the program then goes on to\ncheck for further matches of the same regular expression in the same subject\nstring. The logic is a little bit tricky because of the possibility of matching\nan empty string. Comments in the code explain what is going on.\n</P>\n<P>\nIf PCRE is installed in the standard include and library directories for your\noperating system, you should be able to compile the demonstration program using\nthis command:\n<pre>\n  gcc -o pcredemo pcredemo.c -lpcre\n</pre>\nIf PCRE is installed elsewhere, you may need to add additional options to the\ncommand line. For example, on a Unix-like system that has PCRE installed in\n<i>/usr/local</i>, you can compile the demonstration program using a command\nlike this:\n<pre>\n  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre\n</pre>\nIn a Windows environment, if you want to statically link the program against a\nnon-dll <b>pcre.a</b> file, you must uncomment the line that defines PCRE_STATIC\nbefore including <b>pcre.h</b>, because otherwise the <b>pcre_malloc()</b> and\n<b>pcre_free()</b> exported functions will be declared\n<b>__declspec(dllimport)</b>, with unwanted results.\n</P>\n<P>\nOnce you have compiled and linked the demonstration program, you can run simple\ntests like this:\n<pre>\n  ./pcredemo 'cat|dog' 'the cat sat on the mat'\n  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'\n</pre>\nNote that there is a much more comprehensive test program, called\n<a href=\"pcretest.html\"><b>pcretest</b>,</a>\nwhich supports many more facilities for testing regular expressions and both\nPCRE libraries. The\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\nprogram is provided as a simple coding example.\n</P>\n<P>\nIf you try to run\n<a href=\"pcredemo.html\"><b>pcredemo</b></a>\nwhen PCRE is not installed in the standard library directory, you may get an\nerror like this on some operating systems (e.g. Solaris):\n<pre>\n  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory\n</pre>\nThis is caused by the way shared library support works on those systems. You\nneed to add\n<pre>\n  -R/usr/local/lib\n</pre>\n(for example) to the compile command to get round this problem.\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 10 January 2012\n<br>\nCopyright &copy; 1997-2012 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcrestack.html",
    "content": "<html>\n<head>\n<title>pcrestack specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcrestack man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nPCRE DISCUSSION OF STACK USAGE\n</b><br>\n<P>\nWhen you call <b>pcre[16|32]_exec()</b>, it makes use of an internal function\ncalled <b>match()</b>. This calls itself recursively at branch points in the\npattern, in order to remember the state of the match so that it can back up and\ntry a different alternative if the first one fails. As matching proceeds deeper\nand deeper into the tree of possibilities, the recursion depth increases. The\n<b>match()</b> function is also called in other circumstances, for example,\nwhenever a parenthesized sub-pattern is entered, and in certain cases of\nrepetition.\n</P>\n<P>\nNot all calls of <b>match()</b> increase the recursion depth; for an item such\nas a* it may be called several times at the same level, after matching\ndifferent numbers of a's. Furthermore, in a number of cases where the result of\nthe recursive call would immediately be passed back as the result of the\ncurrent call (a \"tail recursion\"), the function is just restarted instead.\n</P>\n<P>\nThe above comments apply when <b>pcre[16|32]_exec()</b> is run in its normal\ninterpretive manner. If the pattern was studied with the\nPCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and\nthe options passed to <b>pcre[16|32]_exec()</b> were not incompatible, the matching\nprocess uses the JIT-compiled code instead of the <b>match()</b> function. In\nthis case, the memory requirements are handled entirely differently. See the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation for details.\n</P>\n<P>\nThe <b>pcre[16|32]_dfa_exec()</b> function operates in an entirely different way,\nand uses recursion only when there is a regular expression recursion or\nsubroutine call in the pattern. This includes the processing of assertion and\n\"once-only\" subpatterns, which are handled like subroutine calls. Normally,\nthese are never very deep, and the limit on the complexity of\n<b>pcre[16|32]_dfa_exec()</b> is controlled by the amount of workspace it is given.\nHowever, it is possible to write patterns with runaway infinite recursions;\nsuch patterns will cause <b>pcre[16|32]_dfa_exec()</b> to run out of stack. At\npresent, there is no protection against this.\n</P>\n<P>\nThe comments that follow do NOT apply to <b>pcre[16|32]_dfa_exec()</b>; they are\nrelevant only for <b>pcre[16|32]_exec()</b> without the JIT optimization.\n</P>\n<br><b>\nReducing <b>pcre[16|32]_exec()</b>'s stack usage\n</b><br>\n<P>\nEach time that <b>match()</b> is actually called recursively, it uses memory\nfrom the process stack. For certain kinds of pattern and data, very large\namounts of stack may be needed, despite the recognition of \"tail recursion\".\nYou can often reduce the amount of recursion, and therefore the amount of stack\nused, by modifying the pattern that is being matched. Consider, for example,\nthis pattern:\n<pre>\n  ([^&#60;]|&#60;(?!inet))+\n</pre>\nIt matches from wherever it starts until it encounters \"&#60;inet\" or the end of\nthe data, and is the kind of pattern that might be used when processing an XML\nfile. Each iteration of the outer parentheses matches either one character that\nis not \"&#60;\" or a \"&#60;\" that is not followed by \"inet\". However, each time a\nparenthesis is processed, a recursion occurs, so this formulation uses a stack\nframe for each matched character. For a long string, a lot of stack is\nrequired. Consider now this rewritten pattern, which matches exactly the same\nstrings:\n<pre>\n  ([^&#60;]++|&#60;(?!inet))+\n</pre>\nThis uses very much less stack, because runs of characters that do not contain\n\"&#60;\" are \"swallowed\" in one item inside the parentheses. Recursion happens only\nwhen a \"&#60;\" character that is not followed by \"inet\" is encountered (and we\nassume this is relatively rare). A possessive quantifier is used to stop any\nbacktracking into the runs of non-\"&#60;\" characters, but that is not related to\nstack usage.\n</P>\n<P>\nThis example shows that one way of avoiding stack problems when matching long\nsubject strings is to write repeated parenthesized subpatterns to match more\nthan one character whenever possible.\n</P>\n<br><b>\nCompiling PCRE to use heap instead of stack for <b>pcre[16|32]_exec()</b>\n</b><br>\n<P>\nIn environments where stack memory is constrained, you might want to compile\nPCRE to use heap memory instead of stack for remembering back-up points when\n<b>pcre[16|32]_exec()</b> is running. This makes it run a lot more slowly, however.\nDetails of how to do this are given in the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation. When built in this way, instead of using the stack, PCRE obtains\nand frees memory by calling the functions that are pointed to by the\n<b>pcre[16|32]_stack_malloc</b> and <b>pcre[16|32]_stack_free</b> variables. By\ndefault, these point to <b>malloc()</b> and <b>free()</b>, but you can replace\nthe pointers to cause PCRE to use your own functions. Since the block sizes are\nalways the same, and are always freed in reverse order, it may be possible to\nimplement customized memory handlers that are more efficient than the standard\nfunctions.\n</P>\n<br><b>\nLimiting <b>pcre[16|32]_exec()</b>'s stack usage\n</b><br>\n<P>\nYou can set limits on the number of times that <b>match()</b> is called, both in\ntotal and recursively. If a limit is exceeded, <b>pcre[16|32]_exec()</b> returns an\nerror code. Setting suitable limits should prevent it from running out of\nstack. The default values of the limits are very large, and unlikely ever to\noperate. They can be changed when PCRE is built, and they can also be set when\n<b>pcre[16|32]_exec()</b> is called. For details of these interfaces, see the\n<a href=\"pcrebuild.html\"><b>pcrebuild</b></a>\ndocumentation and the\n<a href=\"pcreapi.html#extradata\">section on extra data for <b>pcre[16|32]_exec()</b></a>\nin the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<P>\nAs a very rough rule of thumb, you should reckon on about 500 bytes per\nrecursion. Thus, if you want to limit your stack usage to 8Mb, you should set\nthe limit at 16000 recursions. A 64Mb stack, on the other hand, can support\naround 128000 recursions.\n</P>\n<P>\nIn Unix-like environments, the <b>pcretest</b> test program has a command line\noption (<b>-S</b>) that can be used to increase the size of its stack. As long\nas the stack is large enough, another option (<b>-M</b>) can be used to find the\nsmallest limits that allow a particular pattern to match a given subject\nstring. This is done by calling <b>pcre[16|32]_exec()</b> repeatedly with different\nlimits.\n</P>\n<br><b>\nObtaining an estimate of stack usage\n</b><br>\n<P>\nThe actual amount of stack used per recursion can vary quite a lot, depending\non the compiler that was used to build PCRE and the optimization or debugging\noptions that were set for it. The rule of thumb value of 500 bytes mentioned\nabove may be larger or smaller than what is actually needed. A better\napproximation can be obtained by running this command:\n<pre>\n  pcretest -m -C\n</pre>\nThe <b>-C</b> option causes <b>pcretest</b> to output information about the\noptions with which PCRE was compiled. When <b>-m</b> is also given (before\n<b>-C</b>), information about stack use is given in a line like this:\n<pre>\n  Match recursion uses stack: approximate frame size = 640 bytes\n</pre>\nThe value is approximate because some recursions need a bit more (up to perhaps\n16 more bytes).\n</P>\n<P>\nIf the above command is given when PCRE is compiled to use the heap instead of\nthe stack for recursion, the value that is output is the size of each block\nthat is obtained from the heap.\n</P>\n<br><b>\nChanging stack size in Unix-like systems\n</b><br>\n<P>\nIn Unix-like environments, there is not often a problem with the stack unless\nvery long strings are involved, though the default limit on stack size varies\nfrom system to system. Values from 8Mb to 64Mb are common. You can find your\ndefault limit by running the command:\n<pre>\n  ulimit -s\n</pre>\nUnfortunately, the effect of running out of stack is often SIGSEGV, though\nsometimes a more explicit error message is given. You can normally increase the\nlimit on stack size by code such as this:\n<pre>\n  struct rlimit rlim;\n  getrlimit(RLIMIT_STACK, &rlim);\n  rlim.rlim_cur = 100*1024*1024;\n  setrlimit(RLIMIT_STACK, &rlim);\n</pre>\nThis reads the current limits (soft and hard) using <b>getrlimit()</b>, then\nattempts to increase the soft limit to 100Mb using <b>setrlimit()</b>. You must\ndo this before calling <b>pcre[16|32]_exec()</b>.\n</P>\n<br><b>\nChanging stack size in Mac OS X\n</b><br>\n<P>\nUsing <b>setrlimit()</b>, as described above, should also work on Mac OS X. It\nis also possible to set a stack size when linking a program. There is a\ndiscussion about stack sizes in Mac OS X at this web site:\n<a href=\"http://developer.apple.com/qa/qa2005/qa1419.html\">http://developer.apple.com/qa/qa2005/qa1419.html.</a>\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 24 June 2012\n<br>\nCopyright &copy; 1997-2012 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcresyntax.html",
    "content": "<html>\n<head>\n<title>pcresyntax specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcresyntax man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">QUOTING</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">CHARACTERS</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">CHARACTER TYPES</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">GENERAL CATEGORY PROPERTIES FOR \\p and \\P</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">PCRE SPECIAL CATEGORY PROPERTIES FOR \\p and \\P</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">SCRIPT NAMES FOR \\p AND \\P</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">CHARACTER CLASSES</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">QUANTIFIERS</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">ANCHORS AND SIMPLE ASSERTIONS</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">MATCH POINT RESET</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">ALTERNATION</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">CAPTURING</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">ATOMIC GROUPS</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">COMMENT</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">OPTION SETTING</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">NEWLINE CONVENTION</a>\n<li><a name=\"TOC18\" href=\"#SEC18\">WHAT \\R MATCHES</a>\n<li><a name=\"TOC19\" href=\"#SEC19\">LOOKAHEAD AND LOOKBEHIND ASSERTIONS</a>\n<li><a name=\"TOC20\" href=\"#SEC20\">BACKREFERENCES</a>\n<li><a name=\"TOC21\" href=\"#SEC21\">SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)</a>\n<li><a name=\"TOC22\" href=\"#SEC22\">CONDITIONAL PATTERNS</a>\n<li><a name=\"TOC23\" href=\"#SEC23\">BACKTRACKING CONTROL</a>\n<li><a name=\"TOC24\" href=\"#SEC24\">CALLOUTS</a>\n<li><a name=\"TOC25\" href=\"#SEC25\">SEE ALSO</a>\n<li><a name=\"TOC26\" href=\"#SEC26\">AUTHOR</a>\n<li><a name=\"TOC27\" href=\"#SEC27\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a><br>\n<P>\nThe full syntax and semantics of the regular expressions that are supported by\nPCRE are described in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation. This document contains a quick-reference summary of the syntax.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">QUOTING</a><br>\n<P>\n<pre>\n  \\x         where x is non-alphanumeric is a literal x\n  \\Q...\\E    treat enclosed characters as literal\n</PRE>\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">CHARACTERS</a><br>\n<P>\n<pre>\n  \\a         alarm, that is, the BEL character (hex 07)\n  \\cx        \"control-x\", where x is any ASCII character\n  \\e         escape (hex 1B)\n  \\f         form feed (hex 0C)\n  \\n         newline (hex 0A)\n  \\r         carriage return (hex 0D)\n  \\t         tab (hex 09)\n  \\0dd       character with octal code 0dd\n  \\ddd       character with octal code ddd, or backreference\n  \\o{ddd..}  character with octal code ddd..\n  \\xhh       character with hex code hh\n  \\x{hhh..}  character with hex code hhh..\n</pre>\nNote that \\0dd is always an octal code, and that \\8 and \\9 are the literal\ncharacters \"8\" and \"9\".\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">CHARACTER TYPES</a><br>\n<P>\n<pre>\n  .          any character except newline;\n               in dotall mode, any character whatsoever\n  \\C         one data unit, even in UTF mode (best avoided)\n  \\d         a decimal digit\n  \\D         a character that is not a decimal digit\n  \\h         a horizontal white space character\n  \\H         a character that is not a horizontal white space character\n  \\N         a character that is not a newline\n  \\p{<i>xx</i>}     a character with the <i>xx</i> property\n  \\P{<i>xx</i>}     a character without the <i>xx</i> property\n  \\R         a newline sequence\n  \\s         a white space character\n  \\S         a character that is not a white space character\n  \\v         a vertical white space character\n  \\V         a character that is not a vertical white space character\n  \\w         a \"word\" character\n  \\W         a \"non-word\" character\n  \\X         a Unicode extended grapheme cluster\n</pre>\nBy default, \\d, \\s, and \\w match only ASCII characters, even in UTF-8 mode\nor in the 16- bit and 32-bit libraries. However, if locale-specific matching is\nhappening, \\s and \\w may also match characters with code points in the range\n128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences\nis changed to use Unicode properties and they match many more characters.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">GENERAL CATEGORY PROPERTIES FOR \\p and \\P</a><br>\n<P>\n<pre>\n  C          Other\n  Cc         Control\n  Cf         Format\n  Cn         Unassigned\n  Co         Private use\n  Cs         Surrogate\n\n  L          Letter\n  Ll         Lower case letter\n  Lm         Modifier letter\n  Lo         Other letter\n  Lt         Title case letter\n  Lu         Upper case letter\n  L&         Ll, Lu, or Lt\n\n  M          Mark\n  Mc         Spacing mark\n  Me         Enclosing mark\n  Mn         Non-spacing mark\n\n  N          Number\n  Nd         Decimal number\n  Nl         Letter number\n  No         Other number\n\n  P          Punctuation\n  Pc         Connector punctuation\n  Pd         Dash punctuation\n  Pe         Close punctuation\n  Pf         Final punctuation\n  Pi         Initial punctuation\n  Po         Other punctuation\n  Ps         Open punctuation\n\n  S          Symbol\n  Sc         Currency symbol\n  Sk         Modifier symbol\n  Sm         Mathematical symbol\n  So         Other symbol\n\n  Z          Separator\n  Zl         Line separator\n  Zp         Paragraph separator\n  Zs         Space separator\n</PRE>\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">PCRE SPECIAL CATEGORY PROPERTIES FOR \\p and \\P</a><br>\n<P>\n<pre>\n  Xan        Alphanumeric: union of properties L and N\n  Xps        POSIX space: property Z or tab, NL, VT, FF, CR\n  Xsp        Perl space: property Z or tab, NL, VT, FF, CR\n  Xuc        Univerally-named character: one that can be\n               represented by a Universal Character Name\n  Xwd        Perl word: property Xan or underscore\n</pre>\nPerl and POSIX space are now the same. Perl added VT to its space character set\nat release 5.18 and PCRE changed at release 8.34.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">SCRIPT NAMES FOR \\p AND \\P</a><br>\n<P>\nArabic,\nArmenian,\nAvestan,\nBalinese,\nBamum,\nBassa_Vah,\nBatak,\nBengali,\nBopomofo,\nBrahmi,\nBraille,\nBuginese,\nBuhid,\nCanadian_Aboriginal,\nCarian,\nCaucasian_Albanian,\nChakma,\nCham,\nCherokee,\nCommon,\nCoptic,\nCuneiform,\nCypriot,\nCyrillic,\nDeseret,\nDevanagari,\nDuployan,\nEgyptian_Hieroglyphs,\nElbasan,\nEthiopic,\nGeorgian,\nGlagolitic,\nGothic,\nGrantha,\nGreek,\nGujarati,\nGurmukhi,\nHan,\nHangul,\nHanunoo,\nHebrew,\nHiragana,\nImperial_Aramaic,\nInherited,\nInscriptional_Pahlavi,\nInscriptional_Parthian,\nJavanese,\nKaithi,\nKannada,\nKatakana,\nKayah_Li,\nKharoshthi,\nKhmer,\nKhojki,\nKhudawadi,\nLao,\nLatin,\nLepcha,\nLimbu,\nLinear_A,\nLinear_B,\nLisu,\nLycian,\nLydian,\nMahajani,\nMalayalam,\nMandaic,\nManichaean,\nMeetei_Mayek,\nMende_Kikakui,\nMeroitic_Cursive,\nMeroitic_Hieroglyphs,\nMiao,\nModi,\nMongolian,\nMro,\nMyanmar,\nNabataean,\nNew_Tai_Lue,\nNko,\nOgham,\nOl_Chiki,\nOld_Italic,\nOld_North_Arabian,\nOld_Permic,\nOld_Persian,\nOld_South_Arabian,\nOld_Turkic,\nOriya,\nOsmanya,\nPahawh_Hmong,\nPalmyrene,\nPau_Cin_Hau,\nPhags_Pa,\nPhoenician,\nPsalter_Pahlavi,\nRejang,\nRunic,\nSamaritan,\nSaurashtra,\nSharada,\nShavian,\nSiddham,\nSinhala,\nSora_Sompeng,\nSundanese,\nSyloti_Nagri,\nSyriac,\nTagalog,\nTagbanwa,\nTai_Le,\nTai_Tham,\nTai_Viet,\nTakri,\nTamil,\nTelugu,\nThaana,\nThai,\nTibetan,\nTifinagh,\nTirhuta,\nUgaritic,\nVai,\nWarang_Citi,\nYi.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">CHARACTER CLASSES</a><br>\n<P>\n<pre>\n  [...]       positive character class\n  [^...]      negative character class\n  [x-y]       range (can be used for hex characters)\n  [[:xxx:]]   positive POSIX named set\n  [[:^xxx:]]  negative POSIX named set\n\n  alnum       alphanumeric\n  alpha       alphabetic\n  ascii       0-127\n  blank       space or tab\n  cntrl       control character\n  digit       decimal digit\n  graph       printing, excluding space\n  lower       lower case letter\n  print       printing, including space\n  punct       printing, excluding alphanumeric\n  space       white space\n  upper       upper case letter\n  word        same as \\w\n  xdigit      hexadecimal digit\n</pre>\nIn PCRE, POSIX character set names recognize only ASCII characters by default,\nbut some of them use Unicode properties if PCRE_UCP is set. You can use\n\\Q...\\E inside a character class.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">QUANTIFIERS</a><br>\n<P>\n<pre>\n  ?           0 or 1, greedy\n  ?+          0 or 1, possessive\n  ??          0 or 1, lazy\n  *           0 or more, greedy\n  *+          0 or more, possessive\n  *?          0 or more, lazy\n  +           1 or more, greedy\n  ++          1 or more, possessive\n  +?          1 or more, lazy\n  {n}         exactly n\n  {n,m}       at least n, no more than m, greedy\n  {n,m}+      at least n, no more than m, possessive\n  {n,m}?      at least n, no more than m, lazy\n  {n,}        n or more, greedy\n  {n,}+       n or more, possessive\n  {n,}?       n or more, lazy\n</PRE>\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">ANCHORS AND SIMPLE ASSERTIONS</a><br>\n<P>\n<pre>\n  \\b          word boundary\n  \\B          not a word boundary\n  ^           start of subject\n               also after internal newline in multiline mode\n  \\A          start of subject\n  $           end of subject\n               also before newline at end of subject\n               also before internal newline in multiline mode\n  \\Z          end of subject\n               also before newline at end of subject\n  \\z          end of subject\n  \\G          first matching position in subject\n</PRE>\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">MATCH POINT RESET</a><br>\n<P>\n<pre>\n  \\K          reset start of match\n</pre>\n\\K is honoured in positive assertions, but ignored in negative ones.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">ALTERNATION</a><br>\n<P>\n<pre>\n  expr|expr|expr...\n</PRE>\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">CAPTURING</a><br>\n<P>\n<pre>\n  (...)           capturing group\n  (?&#60;name&#62;...)    named capturing group (Perl)\n  (?'name'...)    named capturing group (Perl)\n  (?P&#60;name&#62;...)   named capturing group (Python)\n  (?:...)         non-capturing group\n  (?|...)         non-capturing group; reset group numbers for\n                   capturing groups in each alternative\n</PRE>\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">ATOMIC GROUPS</a><br>\n<P>\n<pre>\n  (?&#62;...)         atomic, non-capturing group\n</PRE>\n</P>\n<br><a name=\"SEC15\" href=\"#TOC1\">COMMENT</a><br>\n<P>\n<pre>\n  (?#....)        comment (not nestable)\n</PRE>\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">OPTION SETTING</a><br>\n<P>\n<pre>\n  (?i)            caseless\n  (?J)            allow duplicate names\n  (?m)            multiline\n  (?s)            single line (dotall)\n  (?U)            default ungreedy (lazy)\n  (?x)            extended (ignore white space)\n  (?-...)         unset option(s)\n</pre>\nThe following are recognized only at the very start of a pattern or after one\nof the newline or \\R options with similar syntax. More than one of them may\nappear.\n<pre>\n  (*LIMIT_MATCH=d) set the match limit to d (decimal number)\n  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)\n  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)\n  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)\n  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)\n  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)\n  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)\n  (*UTF)          set appropriate UTF mode for the library in use\n  (*UCP)          set PCRE_UCP (use Unicode properties for \\d etc)\n</pre>\nNote that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the\nlimits set by the caller of pcre_exec(), not increase them.\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">NEWLINE CONVENTION</a><br>\n<P>\nThese are recognized only at the very start of the pattern or after option\nsettings with a similar syntax.\n<pre>\n  (*CR)           carriage return only\n  (*LF)           linefeed only\n  (*CRLF)         carriage return followed by linefeed\n  (*ANYCRLF)      all three of the above\n  (*ANY)          any Unicode newline sequence\n</PRE>\n</P>\n<br><a name=\"SEC18\" href=\"#TOC1\">WHAT \\R MATCHES</a><br>\n<P>\nThese are recognized only at the very start of the pattern or after option\nsetting with a similar syntax.\n<pre>\n  (*BSR_ANYCRLF)  CR, LF, or CRLF\n  (*BSR_UNICODE)  any Unicode newline sequence\n</PRE>\n</P>\n<br><a name=\"SEC19\" href=\"#TOC1\">LOOKAHEAD AND LOOKBEHIND ASSERTIONS</a><br>\n<P>\n<pre>\n  (?=...)         positive look ahead\n  (?!...)         negative look ahead\n  (?&#60;=...)        positive look behind\n  (?&#60;!...)        negative look behind\n</pre>\nEach top-level branch of a look behind must be of a fixed length.\n</P>\n<br><a name=\"SEC20\" href=\"#TOC1\">BACKREFERENCES</a><br>\n<P>\n<pre>\n  \\n              reference by number (can be ambiguous)\n  \\gn             reference by number\n  \\g{n}           reference by number\n  \\g{-n}          relative reference by number\n  \\k&#60;name&#62;        reference by name (Perl)\n  \\k'name'        reference by name (Perl)\n  \\g{name}        reference by name (Perl)\n  \\k{name}        reference by name (.NET)\n  (?P=name)       reference by name (Python)\n</PRE>\n</P>\n<br><a name=\"SEC21\" href=\"#TOC1\">SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)</a><br>\n<P>\n<pre>\n  (?R)            recurse whole pattern\n  (?n)            call subpattern by absolute number\n  (?+n)           call subpattern by relative number\n  (?-n)           call subpattern by relative number\n  (?&name)        call subpattern by name (Perl)\n  (?P&#62;name)       call subpattern by name (Python)\n  \\g&#60;name&#62;        call subpattern by name (Oniguruma)\n  \\g'name'        call subpattern by name (Oniguruma)\n  \\g&#60;n&#62;           call subpattern by absolute number (Oniguruma)\n  \\g'n'           call subpattern by absolute number (Oniguruma)\n  \\g&#60;+n&#62;          call subpattern by relative number (PCRE extension)\n  \\g'+n'          call subpattern by relative number (PCRE extension)\n  \\g&#60;-n&#62;          call subpattern by relative number (PCRE extension)\n  \\g'-n'          call subpattern by relative number (PCRE extension)\n</PRE>\n</P>\n<br><a name=\"SEC22\" href=\"#TOC1\">CONDITIONAL PATTERNS</a><br>\n<P>\n<pre>\n  (?(condition)yes-pattern)\n  (?(condition)yes-pattern|no-pattern)\n\n  (?(n)...        absolute reference condition\n  (?(+n)...       relative reference condition\n  (?(-n)...       relative reference condition\n  (?(&#60;name&#62;)...   named reference condition (Perl)\n  (?('name')...   named reference condition (Perl)\n  (?(name)...     named reference condition (PCRE)\n  (?(R)...        overall recursion condition\n  (?(Rn)...       specific group recursion condition\n  (?(R&name)...   specific recursion condition\n  (?(DEFINE)...   define subpattern for reference\n  (?(assert)...   assertion condition\n</PRE>\n</P>\n<br><a name=\"SEC23\" href=\"#TOC1\">BACKTRACKING CONTROL</a><br>\n<P>\nThe following act immediately they are reached:\n<pre>\n  (*ACCEPT)       force successful match\n  (*FAIL)         force backtrack; synonym (*F)\n  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)\n</pre>\nThe following act only when a subsequent match failure causes a backtrack to\nreach them. They all force a match failure, but they differ in what happens\nafterwards. Those that advance the start-of-match point do so only if the\npattern is not anchored.\n<pre>\n  (*COMMIT)       overall failure, no advance of starting point\n  (*PRUNE)        advance to next starting character\n  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)\n  (*SKIP)         advance to current matching position\n  (*SKIP:NAME)    advance to position corresponding to an earlier\n                  (*MARK:NAME); if not found, the (*SKIP) is ignored\n  (*THEN)         local failure, backtrack to next alternation\n  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)\n</PRE>\n</P>\n<br><a name=\"SEC24\" href=\"#TOC1\">CALLOUTS</a><br>\n<P>\n<pre>\n  (?C)      callout\n  (?Cn)     callout with data n\n</PRE>\n</P>\n<br><a name=\"SEC25\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcrepattern</b>(3), <b>pcreapi</b>(3), <b>pcrecallout</b>(3),\n<b>pcrematching</b>(3), <b>pcre</b>(3).\n</P>\n<br><a name=\"SEC26\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC27\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 08 January 2014\n<br>\nCopyright &copy; 1997-2014 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcretest.html",
    "content": "<html>\n<head>\n<title>pcretest specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcretest man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<ul>\n<li><a name=\"TOC1\" href=\"#SEC1\">SYNOPSIS</a>\n<li><a name=\"TOC2\" href=\"#SEC2\">INPUT DATA FORMAT</a>\n<li><a name=\"TOC3\" href=\"#SEC3\">PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a>\n<li><a name=\"TOC4\" href=\"#SEC4\">COMMAND LINE OPTIONS</a>\n<li><a name=\"TOC5\" href=\"#SEC5\">DESCRIPTION</a>\n<li><a name=\"TOC6\" href=\"#SEC6\">PATTERN MODIFIERS</a>\n<li><a name=\"TOC7\" href=\"#SEC7\">DATA LINES</a>\n<li><a name=\"TOC8\" href=\"#SEC8\">THE ALTERNATIVE MATCHING FUNCTION</a>\n<li><a name=\"TOC9\" href=\"#SEC9\">DEFAULT OUTPUT FROM PCRETEST</a>\n<li><a name=\"TOC10\" href=\"#SEC10\">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a>\n<li><a name=\"TOC11\" href=\"#SEC11\">RESTARTING AFTER A PARTIAL MATCH</a>\n<li><a name=\"TOC12\" href=\"#SEC12\">CALLOUTS</a>\n<li><a name=\"TOC13\" href=\"#SEC13\">NON-PRINTING CHARACTERS</a>\n<li><a name=\"TOC14\" href=\"#SEC14\">SAVING AND RELOADING COMPILED PATTERNS</a>\n<li><a name=\"TOC15\" href=\"#SEC15\">SEE ALSO</a>\n<li><a name=\"TOC16\" href=\"#SEC16\">AUTHOR</a>\n<li><a name=\"TOC17\" href=\"#SEC17\">REVISION</a>\n</ul>\n<br><a name=\"SEC1\" href=\"#TOC1\">SYNOPSIS</a><br>\n<P>\n<b>pcretest [options] [input file [output file]]</b>\n<br>\n<br>\n<b>pcretest</b> was written as a test program for the PCRE regular expression\nlibrary itself, but it can also be used for experimenting with regular\nexpressions. This document describes the features of the test program; for\ndetails of the regular expressions themselves, see the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation. For details of the PCRE library function calls and their\noptions, see the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\n,\n<a href=\"pcre16.html\"><b>pcre16</b></a>\nand\n<a href=\"pcre32.html\"><b>pcre32</b></a>\ndocumentation.\n</P>\n<P>\nThe input for <b>pcretest</b> is a sequence of regular expression patterns and\nstrings to be matched, as described below. The output shows the result of each\nmatch. Options on the command line and the patterns control PCRE options and\nexactly what is output.\n</P>\n<P>\nAs PCRE has evolved, it has acquired many different features, and as a result,\n<b>pcretest</b> now has rather a lot of obscure options for testing every\npossible feature. Some of these options are specifically designed for use in\nconjunction with the test script and data files that are distributed as part of\nPCRE, and are unlikely to be of use otherwise. They are all documented here,\nbut without much justification.\n</P>\n<br><a name=\"SEC2\" href=\"#TOC1\">INPUT DATA FORMAT</a><br>\n<P>\nInput to <b>pcretest</b> is processed line by line, either by calling the C\nlibrary's <b>fgets()</b> function, or via the <b>libreadline</b> library (see\nbelow). In Unix-like environments, <b>fgets()</b> treats any bytes other than\nnewline as data characters. However, in some Windows environments character 26\n(hex 1A) causes an immediate end of file, and no further data is read. For\nmaximum portability, therefore, it is safest to use only ASCII characters in\n<b>pcretest</b> input files.\n</P>\n<P>\nThe input is processed using using C's string functions, so must not\ncontain binary zeroes, even though in Unix-like environments, <b>fgets()</b>\ntreats any bytes other than newline as data characters.\n</P>\n<br><a name=\"SEC3\" href=\"#TOC1\">PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES</a><br>\n<P>\nFrom release 8.30, two separate PCRE libraries can be built. The original one\nsupports 8-bit character strings, whereas the newer 16-bit library supports\ncharacter strings encoded in 16-bit units. From release 8.32, a third library\ncan be built, supporting character strings encoded in 32-bit units. The\n<b>pcretest</b> program can be used to test all three libraries. However, it is\nitself still an 8-bit program, reading 8-bit input and writing 8-bit output.\nWhen testing the 16-bit or 32-bit library, the patterns and data strings are\nconverted to 16- or 32-bit format before being passed to the PCRE library\nfunctions. Results are converted to 8-bit for output.\n</P>\n<P>\nReferences to functions and structures of the form <b>pcre[16|32]_xx</b> below\nmean \"<b>pcre_xx</b> when using the 8-bit library, <b>pcre16_xx</b> when using\nthe 16-bit library, or <b>pcre32_xx</b> when using the 32-bit library\".\n</P>\n<br><a name=\"SEC4\" href=\"#TOC1\">COMMAND LINE OPTIONS</a><br>\n<P>\n<b>-8</b>\nIf both the 8-bit library has been built, this option causes the 8-bit library\nto be used (which is the default); if the 8-bit library has not been built,\nthis option causes an error.\n</P>\n<P>\n<b>-16</b>\nIf both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this\noption causes the 16-bit library to be used. If only the 16-bit library has been\nbuilt, this is the default (so has no effect). If only the 8-bit or the 32-bit\nlibrary has been built, this option causes an error.\n</P>\n<P>\n<b>-32</b>\nIf both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this\noption causes the 32-bit library to be used. If only the 32-bit library has been\nbuilt, this is the default (so has no effect). If only the 8-bit or the 16-bit\nlibrary has been built, this option causes an error.\n</P>\n<P>\n<b>-b</b>\nBehave as if each pattern has the <b>/B</b> (show byte code) modifier; the\ninternal form is output after compilation.\n</P>\n<P>\n<b>-C</b>\nOutput the version number of the PCRE library, and all available information\nabout the optional features that are included, and then exit with zero exit\ncode. All other options are ignored.\n</P>\n<P>\n<b>-C</b> <i>option</i>\nOutput information about a specific build-time option, then exit. This\nfunctionality is intended for use in scripts such as <b>RunTest</b>. The\nfollowing options output the value and set the exit code as indicated:\n<pre>\n  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:\n               0x15 or 0x25\n               0 if used in an ASCII environment\n               exit code is always 0\n  linksize   the configured internal link size (2, 3, or 4)\n               exit code is set to the link size\n  newline    the default newline setting:\n               CR, LF, CRLF, ANYCRLF, or ANY\n               exit code is always 0\n  bsr        the default setting for what \\R matches:\n               ANYCRLF or ANY\n               exit code is always 0\n</pre>\nThe following options output 1 for true or 0 for false, and set the exit code\nto the same value:\n<pre>\n  ebcdic     compiled for an EBCDIC environment\n  jit        just-in-time support is available\n  pcre16     the 16-bit library was built\n  pcre32     the 32-bit library was built\n  pcre8      the 8-bit library was built\n  ucp        Unicode property support is available\n  utf        UTF-8 and/or UTF-16 and/or UTF-32 support\n               is available\n</pre>\nIf an unknown option is given, an error message is output; the exit code is 0.\n</P>\n<P>\n<b>-d</b>\nBehave as if each pattern has the <b>/D</b> (debug) modifier; the internal\nform and information about the compiled pattern is output after compilation;\n<b>-d</b> is equivalent to <b>-b -i</b>.\n</P>\n<P>\n<b>-dfa</b>\nBehave as if each data line contains the \\D escape sequence; this causes the\nalternative matching function, <b>pcre[16|32]_dfa_exec()</b>, to be used instead\nof the standard <b>pcre[16|32]_exec()</b> function (more detail is given below).\n</P>\n<P>\n<b>-help</b>\nOutput a brief summary these options and then exit.\n</P>\n<P>\n<b>-i</b>\nBehave as if each pattern has the <b>/I</b> modifier; information about the\ncompiled pattern is given after compilation.\n</P>\n<P>\n<b>-M</b>\nBehave as if each data line contains the \\M escape sequence; this causes\nPCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by\ncalling <b>pcre[16|32]_exec()</b> repeatedly with different limits.\n</P>\n<P>\n<b>-m</b>\nOutput the size of each compiled pattern after it has been compiled. This is\nequivalent to adding <b>/M</b> to each regular expression. The size is given in\nbytes for both libraries.\n</P>\n<P>\n<b>-O</b>\nBehave as if each pattern has the <b>/O</b> modifier, that is disable\nauto-possessification for all patterns.\n</P>\n<P>\n<b>-o</b> <i>osize</i>\nSet the number of elements in the output vector that is used when calling\n<b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b> to be <i>osize</i>. The\ndefault value is 45, which is enough for 14 capturing subexpressions for\n<b>pcre[16|32]_exec()</b> or 22 different matches for\n<b>pcre[16|32]_dfa_exec()</b>.\nThe vector size can be changed for individual matching calls by including \\O\nin the data line (see below).\n</P>\n<P>\n<b>-p</b>\nBehave as if each pattern has the <b>/P</b> modifier; the POSIX wrapper API is\nused to call PCRE. None of the other options has any effect when <b>-p</b> is\nset. This option can be used only with the 8-bit library.\n</P>\n<P>\n<b>-q</b>\nDo not output the version number of <b>pcretest</b> at the start of execution.\n</P>\n<P>\n<b>-S</b> <i>size</i>\nOn Unix-like systems, set the size of the run-time stack to <i>size</i>\nmegabytes.\n</P>\n<P>\n<b>-s</b> or <b>-s+</b>\nBehave as if each pattern has the <b>/S</b> modifier; in other words, force each\npattern to be studied. If <b>-s+</b> is used, all the JIT compile options are\npassed to <b>pcre[16|32]_study()</b>, causing just-in-time optimization to be set\nup if it is available, for both full and partial matching. Specific JIT compile\noptions can be selected by following <b>-s+</b> with a digit in the range 1 to\n7, which selects the JIT compile modes as follows:\n<pre>\n  1  normal match only\n  2  soft partial match only\n  3  normal match and soft partial match\n  4  hard partial match only\n  6  soft and hard partial match\n  7  all three modes (default)\n</pre>\nIf <b>-s++</b> is used instead of <b>-s+</b> (with or without a following digit),\nthe text \"(JIT)\" is added to the first output line after a match or no match\nwhen JIT-compiled code was actually used.\n<br>\n<br>\nNote that there are pattern options that can override <b>-s</b>, either\nspecifying no studying at all, or suppressing JIT compilation.\n<br>\n<br>\nIf the <b>/I</b> or <b>/D</b> option is present on a pattern (requesting output\nabout the compiled pattern), information about the result of studying is not\nincluded when studying is caused only by <b>-s</b> and neither <b>-i</b> nor\n<b>-d</b> is present on the command line. This behaviour means that the output\nfrom tests that are run with and without <b>-s</b> should be identical, except\nwhen options that output information about the actual running of a match are\nset.\n<br>\n<br>\nThe <b>-M</b>, <b>-t</b>, and <b>-tm</b> options, which give information about\nresources used, are likely to produce different output with and without\n<b>-s</b>. Output may also differ if the <b>/C</b> option is present on an\nindividual pattern. This uses callouts to trace the the matching process, and\nthis may be different between studied and non-studied patterns. If the pattern\ncontains (*MARK) items there may also be differences, for the same reason. The\n<b>-s</b> command line option can be overridden for specific patterns that\nshould never be studied (see the <b>/S</b> pattern modifier below).\n</P>\n<P>\n<b>-t</b>\nRun each compile, study, and match many times with a timer, and output the\nresulting times per compile, study, or match (in milliseconds). Do not set\n<b>-m</b> with <b>-t</b>, because you will then get the size output a zillion\ntimes, and the timing will be distorted. You can control the number of\niterations that are used for timing by following <b>-t</b> with a number (as a\nseparate item on the command line). For example, \"-t 1000\" iterates 1000 times.\nThe default is to iterate 500000 times.\n</P>\n<P>\n<b>-tm</b>\nThis is like <b>-t</b> except that it times only the matching phase, not the\ncompile or study phases.\n</P>\n<P>\n<b>-T</b> <b>-TM</b>\nThese behave like <b>-t</b> and <b>-tm</b>, but in addition, at the end of a run,\nthe total times for all compiles, studies, and matches are output.\n</P>\n<br><a name=\"SEC5\" href=\"#TOC1\">DESCRIPTION</a><br>\n<P>\nIf <b>pcretest</b> is given two filename arguments, it reads from the first and\nwrites to the second. If it is given only one filename argument, it reads from\nthat file and writes to stdout. Otherwise, it reads from stdin and writes to\nstdout, and prompts for each line of input, using \"re&#62;\" to prompt for regular\nexpressions, and \"data&#62;\" to prompt for data lines.\n</P>\n<P>\nWhen <b>pcretest</b> is built, a configuration option can specify that it should\nbe linked with the <b>libreadline</b> library. When this is done, if the input\nis from a terminal, it is read using the <b>readline()</b> function. This\nprovides line-editing and history facilities. The output from the <b>-help</b>\noption states whether or not <b>readline()</b> will be used.\n</P>\n<P>\nThe program handles any number of sets of input on a single input file. Each\nset starts with a regular expression, and continues with any number of data\nlines to be matched against that pattern.\n</P>\n<P>\nEach data line is matched separately and independently. If you want to do\nmulti-line matches, you have to use the \\n escape sequence (or \\r or \\r\\n,\netc., depending on the newline setting) in a single line of input to encode the\nnewline sequences. There is no limit on the length of data lines; the input\nbuffer is automatically extended if it is too small.\n</P>\n<P>\nAn empty line signals the end of the data lines, at which point a new regular\nexpression is read. The regular expressions are given enclosed in any\nnon-alphanumeric delimiters other than backslash, for example:\n<pre>\n  /(a|bc)x+yz/\n</pre>\nWhite space before the initial delimiter is ignored. A regular expression may\nbe continued over several input lines, in which case the newline characters are\nincluded within it. It is possible to include the delimiter within the pattern\nby escaping it, for example\n<pre>\n  /abc\\/def/\n</pre>\nIf you do so, the escape and the delimiter form part of the pattern, but since\ndelimiters are always non-alphanumeric, this does not affect its interpretation.\nIf the terminating delimiter is immediately followed by a backslash, for\nexample,\n<pre>\n  /abc/\\\n</pre>\nthen a backslash is added to the end of the pattern. This is done to provide a\nway of testing the error condition that arises if a pattern finishes with a\nbackslash, because\n<pre>\n  /abc\\/\n</pre>\nis interpreted as the first line of a pattern that starts with \"abc/\", causing\npcretest to read the next line as a continuation of the regular expression.\n</P>\n<br><a name=\"SEC6\" href=\"#TOC1\">PATTERN MODIFIERS</a><br>\n<P>\nA pattern may be followed by any number of modifiers, which are mostly single\ncharacters, though some of these can be qualified by further characters.\nFollowing Perl usage, these are referred to below as, for example, \"the\n<b>/i</b> modifier\", even though the delimiter of the pattern need not always be\na slash, and no slash is used when writing modifiers. White space may appear\nbetween the final pattern delimiter and the first modifier, and between the\nmodifiers themselves. For reference, here is a complete list of modifiers. They\nfall into several groups that are described in detail in the following\nsections.\n<pre>\n  <b>/8</b>              set UTF mode\n  <b>/9</b>              set PCRE_NEVER_UTF (locks out UTF mode)\n  <b>/?</b>              disable UTF validity check\n  <b>/+</b>              show remainder of subject after match\n  <b>/=</b>              show all captures (not just those that are set)\n\n  <b>/A</b>              set PCRE_ANCHORED\n  <b>/B</b>              show compiled code\n  <b>/C</b>              set PCRE_AUTO_CALLOUT\n  <b>/D</b>              same as <b>/B</b> plus <b>/I</b>\n  <b>/E</b>              set PCRE_DOLLAR_ENDONLY\n  <b>/F</b>              flip byte order in compiled pattern\n  <b>/f</b>              set PCRE_FIRSTLINE\n  <b>/G</b>              find all matches (shorten string)\n  <b>/g</b>              find all matches (use startoffset)\n  <b>/I</b>              show information about pattern\n  <b>/i</b>              set PCRE_CASELESS\n  <b>/J</b>              set PCRE_DUPNAMES\n  <b>/K</b>              show backtracking control names\n  <b>/L</b>              set locale\n  <b>/M</b>              show compiled memory size\n  <b>/m</b>              set PCRE_MULTILINE\n  <b>/N</b>              set PCRE_NO_AUTO_CAPTURE\n  <b>/O</b>              set PCRE_NO_AUTO_POSSESS\n  <b>/P</b>              use the POSIX wrapper\n  <b>/Q</b>              test external stack check function\n  <b>/S</b>              study the pattern after compilation\n  <b>/s</b>              set PCRE_DOTALL\n  <b>/T</b>              select character tables\n  <b>/U</b>              set PCRE_UNGREEDY\n  <b>/W</b>              set PCRE_UCP\n  <b>/X</b>              set PCRE_EXTRA\n  <b>/x</b>              set PCRE_EXTENDED\n  <b>/Y</b>              set PCRE_NO_START_OPTIMIZE\n  <b>/Z</b>              don't show lengths in <b>/B</b> output\n\n  <b>/&#60;any&#62;</b>          set PCRE_NEWLINE_ANY\n  <b>/&#60;anycrlf&#62;</b>      set PCRE_NEWLINE_ANYCRLF\n  <b>/&#60;cr&#62;</b>           set PCRE_NEWLINE_CR\n  <b>/&#60;crlf&#62;</b>         set PCRE_NEWLINE_CRLF\n  <b>/&#60;lf&#62;</b>           set PCRE_NEWLINE_LF\n  <b>/&#60;bsr_anycrlf&#62;</b>  set PCRE_BSR_ANYCRLF\n  <b>/&#60;bsr_unicode&#62;</b>  set PCRE_BSR_UNICODE\n  <b>/&#60;JS&#62;</b>           set PCRE_JAVASCRIPT_COMPAT\n\n</PRE>\n</P>\n<br><b>\nPerl-compatible modifiers\n</b><br>\n<P>\nThe <b>/i</b>, <b>/m</b>, <b>/s</b>, and <b>/x</b> modifiers set the PCRE_CASELESS,\nPCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when\n<b>pcre[16|32]_compile()</b> is called. These four modifier letters have the same\neffect as they do in Perl. For example:\n<pre>\n  /caseless/i\n\n</PRE>\n</P>\n<br><b>\nModifiers for other PCRE options\n</b><br>\n<P>\nThe following table shows additional modifiers for setting PCRE compile-time\noptions that do not correspond to anything in Perl:\n<pre>\n  <b>/8</b>              PCRE_UTF8           ) when using the 8-bit\n  <b>/?</b>              PCRE_NO_UTF8_CHECK  )   library\n\n  <b>/8</b>              PCRE_UTF16          ) when using the 16-bit\n  <b>/?</b>              PCRE_NO_UTF16_CHECK )   library\n\n  <b>/8</b>              PCRE_UTF32          ) when using the 32-bit\n  <b>/?</b>              PCRE_NO_UTF32_CHECK )   library\n\n  <b>/9</b>              PCRE_NEVER_UTF\n  <b>/A</b>              PCRE_ANCHORED\n  <b>/C</b>              PCRE_AUTO_CALLOUT\n  <b>/E</b>              PCRE_DOLLAR_ENDONLY\n  <b>/f</b>              PCRE_FIRSTLINE\n  <b>/J</b>              PCRE_DUPNAMES\n  <b>/N</b>              PCRE_NO_AUTO_CAPTURE\n  <b>/O</b>              PCRE_NO_AUTO_POSSESS\n  <b>/U</b>              PCRE_UNGREEDY\n  <b>/W</b>              PCRE_UCP\n  <b>/X</b>              PCRE_EXTRA\n  <b>/Y</b>              PCRE_NO_START_OPTIMIZE\n  <b>/&#60;any&#62;</b>          PCRE_NEWLINE_ANY\n  <b>/&#60;anycrlf&#62;</b>      PCRE_NEWLINE_ANYCRLF\n  <b>/&#60;cr&#62;</b>           PCRE_NEWLINE_CR\n  <b>/&#60;crlf&#62;</b>         PCRE_NEWLINE_CRLF\n  <b>/&#60;lf&#62;</b>           PCRE_NEWLINE_LF\n  <b>/&#60;bsr_anycrlf&#62;</b>  PCRE_BSR_ANYCRLF\n  <b>/&#60;bsr_unicode&#62;</b>  PCRE_BSR_UNICODE\n  <b>/&#60;JS&#62;</b>           PCRE_JAVASCRIPT_COMPAT\n</pre>\nThe modifiers that are enclosed in angle brackets are literal strings as shown,\nincluding the angle brackets, but the letters within can be in either case.\nThis example sets multiline matching with CRLF as the line ending sequence:\n<pre>\n  /^abc/m&#60;CRLF&#62;\n</pre>\nAs well as turning on the PCRE_UTF8/16/32 option, the <b>/8</b> modifier causes\nall non-printing characters in output strings to be printed using the\n\\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without\nthe curly brackets.\n</P>\n<P>\nFull details of the PCRE options are given in the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation.\n</P>\n<br><b>\nFinding all matches in a string\n</b><br>\n<P>\nSearching for all possible matches within each subject string can be requested\nby the <b>/g</b> or <b>/G</b> modifier. After finding a match, PCRE is called\nagain to search the remainder of the subject string. The difference between\n<b>/g</b> and <b>/G</b> is that the former uses the <i>startoffset</i> argument to\n<b>pcre[16|32]_exec()</b> to start searching at a new point within the entire\nstring (which is in effect what Perl does), whereas the latter passes over a\nshortened substring. This makes a difference to the matching process if the\npattern begins with a lookbehind assertion (including \\b or \\B).\n</P>\n<P>\nIf any call to <b>pcre[16|32]_exec()</b> in a <b>/g</b> or <b>/G</b> sequence matches\nan empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and\nPCRE_ANCHORED flags set in order to search for another, non-empty, match at the\nsame point. If this second match fails, the start offset is advanced, and the\nnormal match is retried. This imitates the way Perl handles such cases when\nusing the <b>/g</b> modifier or the <b>split()</b> function. Normally, the start\noffset is advanced by one character, but if the newline convention recognizes\nCRLF as a newline, and the current character is CR followed by LF, an advance\nof two is used.\n</P>\n<br><b>\nOther modifiers\n</b><br>\n<P>\nThere are yet more modifiers for controlling the way <b>pcretest</b>\noperates.\n</P>\n<P>\nThe <b>/+</b> modifier requests that as well as outputting the substring that\nmatched the entire pattern, <b>pcretest</b> should in addition output the\nremainder of the subject string. This is useful for tests where the subject\ncontains multiple copies of the same substring. If the <b>+</b> modifier appears\ntwice, the same action is taken for captured substrings. In each case the\nremainder is output on the following line with a plus character following the\ncapture number. Note that this modifier must not immediately follow the /S\nmodifier because /S+ and /S++ have other meanings.\n</P>\n<P>\nThe <b>/=</b> modifier requests that the values of all potential captured\nparentheses be output after a match. By default, only those up to the highest\none actually used in the match are output (corresponding to the return code\nfrom <b>pcre[16|32]_exec()</b>). Values in the offsets vector corresponding to\nhigher numbers should be set to -1, and these are output as \"&#60;unset&#62;\". This\nmodifier gives a way of checking that this is happening.\n</P>\n<P>\nThe <b>/B</b> modifier is a debugging feature. It requests that <b>pcretest</b>\noutput a representation of the compiled code after compilation. Normally this\ninformation contains length and offset values; however, if <b>/Z</b> is also\npresent, this data is replaced by spaces. This is a special feature for use in\nthe automatic test scripts; it ensures that the same output is generated for\ndifferent internal link sizes.\n</P>\n<P>\nThe <b>/D</b> modifier is a PCRE debugging feature, and is equivalent to\n<b>/BI</b>, that is, both the <b>/B</b> and the <b>/I</b> modifiers.\n</P>\n<P>\nThe <b>/F</b> modifier causes <b>pcretest</b> to flip the byte order of the\n2-byte and 4-byte fields in the compiled pattern. This facility is for testing\nthe feature in PCRE that allows it to execute patterns that were compiled on a\nhost with a different endianness. This feature is not available when the POSIX\ninterface to PCRE is being used, that is, when the <b>/P</b> pattern modifier is\nspecified. See also the section about saving and reloading compiled patterns\nbelow.\n</P>\n<P>\nThe <b>/I</b> modifier requests that <b>pcretest</b> output information about the\ncompiled pattern (whether it is anchored, has a fixed first character, and\nso on). It does this by calling <b>pcre[16|32]_fullinfo()</b> after compiling a\npattern. If the pattern is studied, the results of that are also output. In\nthis output, the word \"char\" means a non-UTF character, that is, the value of a\nsingle data item (8-bit, 16-bit, or 32-bit, depending on the library that is\nbeing tested).\n</P>\n<P>\nThe <b>/K</b> modifier requests <b>pcretest</b> to show names from backtracking\ncontrol verbs that are returned from calls to <b>pcre[16|32]_exec()</b>. It causes\n<b>pcretest</b> to create a <b>pcre[16|32]_extra</b> block if one has not already\nbeen created by a call to <b>pcre[16|32]_study()</b>, and to set the\nPCRE_EXTRA_MARK flag and the <b>mark</b> field within it, every time that\n<b>pcre[16|32]_exec()</b> is called. If the variable that the <b>mark</b> field\npoints to is non-NULL for a match, non-match, or partial match, <b>pcretest</b>\nprints the string to which it points. For a match, this is shown on a line by\nitself, tagged with \"MK:\". For a non-match it is added to the message.\n</P>\n<P>\nThe <b>/L</b> modifier must be followed directly by the name of a locale, for\nexample,\n<pre>\n  /pattern/Lfr_FR\n</pre>\nFor this reason, it must be the last modifier. The given locale is set,\n<b>pcre[16|32]_maketables()</b> is called to build a set of character tables for\nthe locale, and this is then passed to <b>pcre[16|32]_compile()</b> when compiling\nthe regular expression. Without an <b>/L</b> (or <b>/T</b>) modifier, NULL is\npassed as the tables pointer; that is, <b>/L</b> applies only to the expression\non which it appears.\n</P>\n<P>\nThe <b>/M</b> modifier causes the size in bytes of the memory block used to hold\nthe compiled pattern to be output. This does not include the size of the\n<b>pcre[16|32]</b> block; it is just the actual compiled data. If the pattern is\nsuccessfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the\nJIT compiled code is also output.\n</P>\n<P>\nThe <b>/Q</b> modifier is used to test the use of <b>pcre_stack_guard</b>. It\nmust be followed by '0' or '1', specifying the return code to be given from an\nexternal function that is passed to PCRE and used for stack checking during\ncompilation (see the\n<a href=\"pcreapi.html\"><b>pcreapi</b></a>\ndocumentation for details).\n</P>\n<P>\nThe <b>/S</b> modifier causes <b>pcre[16|32]_study()</b> to be called after the\nexpression has been compiled, and the results used when the expression is\nmatched. There are a number of qualifying characters that may follow <b>/S</b>.\nThey may appear in any order.\n</P>\n<P>\nIf <b>/S</b> is followed by an exclamation mark, <b>pcre[16|32]_study()</b> is\ncalled with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a\n<b>pcre_extra</b> block, even when studying discovers no useful information.\n</P>\n<P>\nIf <b>/S</b> is followed by a second S character, it suppresses studying, even\nif it was requested externally by the <b>-s</b> command line option. This makes\nit possible to specify that certain patterns are always studied, and others are\nnever studied, independently of <b>-s</b>. This feature is used in the test\nfiles in a few cases where the output is different when the pattern is studied.\n</P>\n<P>\nIf the <b>/S</b> modifier is followed by a + character, the call to\n<b>pcre[16|32]_study()</b> is made with all the JIT study options, requesting\njust-in-time optimization support if it is available, for both normal and\npartial matching. If you want to restrict the JIT compiling modes, you can\nfollow <b>/S+</b> with a digit in the range 1 to 7:\n<pre>\n  1  normal match only\n  2  soft partial match only\n  3  normal match and soft partial match\n  4  hard partial match only\n  6  soft and hard partial match\n  7  all three modes (default)\n</pre>\nIf <b>/S++</b> is used instead of <b>/S+</b> (with or without a following digit),\nthe text \"(JIT)\" is added to the first output line after a match or no match\nwhen JIT-compiled code was actually used.\n</P>\n<P>\nNote that there is also an independent <b>/+</b> modifier; it must not be given\nimmediately after <b>/S</b> or <b>/S+</b> because this will be misinterpreted.\n</P>\n<P>\nIf JIT studying is successful, the compiled JIT code will automatically be used\nwhen <b>pcre[16|32]_exec()</b> is run, except when incompatible run-time options\nare specified. For more details, see the\n<a href=\"pcrejit.html\"><b>pcrejit</b></a>\ndocumentation. See also the <b>\\J</b> escape sequence below for a way of\nsetting the size of the JIT stack.\n</P>\n<P>\nFinally, if <b>/S</b> is followed by a minus character, JIT compilation is\nsuppressed, even if it was requested externally by the <b>-s</b> command line\noption. This makes it possible to specify that JIT is never to be used for\ncertain patterns.\n</P>\n<P>\nThe <b>/T</b> modifier must be followed by a single digit. It causes a specific\nset of built-in character tables to be passed to <b>pcre[16|32]_compile()</b>. It\nis used in the standard PCRE tests to check behaviour with different character\ntables. The digit specifies the tables as follows:\n<pre>\n  0   the default ASCII tables, as distributed in\n        pcre_chartables.c.dist\n  1   a set of tables defining ISO 8859 characters\n</pre>\nIn table 1, some characters whose codes are greater than 128 are identified as\nletters, digits, spaces, etc.\n</P>\n<br><b>\nUsing the POSIX wrapper API\n</b><br>\n<P>\nThe <b>/P</b> modifier causes <b>pcretest</b> to call PCRE via the POSIX wrapper\nAPI rather than its native API. This supports only the 8-bit library. When\n<b>/P</b> is set, the following modifiers set options for the <b>regcomp()</b>\nfunction:\n<pre>\n  /i    REG_ICASE\n  /m    REG_NEWLINE\n  /N    REG_NOSUB\n  /s    REG_DOTALL     )\n  /U    REG_UNGREEDY   ) These options are not part of\n  /W    REG_UCP        )   the POSIX standard\n  /8    REG_UTF8       )\n</pre>\nThe <b>/+</b> modifier works as described above. All other modifiers are\nignored.\n</P>\n<br><b>\nLocking out certain modifiers\n</b><br>\n<P>\nPCRE can be compiled with or without support for certain features such as\nUTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up\ninto a number of different files that are selected for running depending on\nwhich features are available. When updating the tests, it is all too easy to\nput a new test into the wrong file by mistake; for example, to put a test that\nrequires UTF support into a file that is used when it is not available. To help\ndetect such mistakes as early as possible, there is a facility for locking out\nspecific modifiers. If an input line for <b>pcretest</b> starts with the string\n\"&#60; forbid \" the following sequence of characters is taken as a list of\nforbidden modifiers. For example, in the test files that must not use UTF or\nUnicode property support, this line appears:\n<pre>\n  &#60; forbid 8W\n</pre>\nThis locks out the /8 and /W modifiers. An immediate error is given if they are\nsubsequently encountered. If the character string contains &#60; but not &#62;, all the\nmulti-character modifiers that begin with &#60; are locked out. Otherwise, such\nmodifiers must be explicitly listed, for example:\n<pre>\n  &#60; forbid &#60;JS&#62;&#60;cr&#62;\n</pre>\nThere must be a single space between &#60; and \"forbid\" for this feature to be\nrecognised. If there is not, the line is interpreted either as a request to\nre-load a pre-compiled pattern (see \"SAVING AND RELOADING COMPILED PATTERNS\"\nbelow) or, if there is a another &#60; character, as a pattern that uses &#60; as its\ndelimiter.\n</P>\n<br><a name=\"SEC7\" href=\"#TOC1\">DATA LINES</a><br>\n<P>\nBefore each data line is passed to <b>pcre[16|32]_exec()</b>, leading and trailing\nwhite space is removed, and it is then scanned for \\ escapes. Some of these\nare pretty esoteric features, intended for checking out some of the more\ncomplicated features of PCRE. If you are just testing \"ordinary\" regular\nexpressions, you probably don't need any of these. The following escapes are\nrecognized:\n<pre>\n  \\a         alarm (BEL, \\x07)\n  \\b         backspace (\\x08)\n  \\e         escape (\\x27)\n  \\f         form feed (\\x0c)\n  \\n         newline (\\x0a)\n  \\qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)\n  \\r         carriage return (\\x0d)\n  \\t         tab (\\x09)\n  \\v         vertical tab (\\x0b)\n  \\nnn       octal character (up to 3 octal digits); always\n               a byte unless &#62; 255 in UTF-8 or 16-bit or 32-bit mode\n  \\o{dd...}  octal character (any number of octal digits}\n  \\xhh       hexadecimal byte (up to 2 hex digits)\n  \\x{hh...}  hexadecimal character (any number of hex digits)\n  \\A         pass the PCRE_ANCHORED option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\B         pass the PCRE_NOTBOL option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)\n  \\Cname     call pcre[16|32]_copy_named_substring() for substring \"name\" after a successful match (name termin-\n               ated by next non alphanumeric character)\n  \\C+        show the current captured substrings at callout time\n  \\C-        do not supply a callout function\n  \\C!n       return 1 instead of 0 when callout number n is reached\n  \\C!n!m     return 1 instead of 0 when callout number n is reached for the nth time\n  \\C*n       pass the number n (may be negative) as callout data; this is used as the callout return value\n  \\D         use the <b>pcre[16|32]_dfa_exec()</b> match function\n  \\F         only shortest match for <b>pcre[16|32]_dfa_exec()</b>\n  \\Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)\n  \\Gname     call pcre[16|32]_get_named_substring() for substring \"name\" after a successful match (name termin-\n               ated by next non-alphanumeric character)\n  \\Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)\n  \\L         call pcre[16|32]_get_substringlist() after a successful match\n  \\M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings\n  \\N         pass the PCRE_NOTEMPTY option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>; if used twice, pass the\n               PCRE_NOTEMPTY_ATSTART option\n  \\Odd       set the size of the output vector passed to <b>pcre[16|32]_exec()</b> to dd (any number of digits)\n  \\P         pass the PCRE_PARTIAL_SOFT option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>; if used twice, pass the\n               PCRE_PARTIAL_HARD option\n  \\Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)\n  \\R         pass the PCRE_DFA_RESTART option to <b>pcre[16|32]_dfa_exec()</b>\n  \\S         output details of memory get/free calls during matching\n  \\Y         pass the PCRE_NO_START_OPTIMIZE option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\Z         pass the PCRE_NOTEOL option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#62;dd       start the match at offset dd (optional \"-\"; then any number of digits); this sets the <i>startoffset</i>\n               argument for <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#60;cr&#62;      pass the PCRE_NEWLINE_CR option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#60;lf&#62;      pass the PCRE_NEWLINE_LF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#60;crlf&#62;    pass the PCRE_NEWLINE_CRLF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#60;anycrlf&#62; pass the PCRE_NEWLINE_ANYCRLF option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n  \\&#60;any&#62;     pass the PCRE_NEWLINE_ANY option to <b>pcre[16|32]_exec()</b> or <b>pcre[16|32]_dfa_exec()</b>\n</pre>\nThe use of \\x{hh...} is not dependent on the use of the <b>/8</b> modifier on\nthe pattern. It is recognized always. There may be any number of hexadecimal\ndigits inside the braces; invalid values provoke error messages.\n</P>\n<P>\nNote that \\xhh specifies one byte rather than one character in UTF-8 mode;\nthis makes it possible to construct invalid UTF-8 sequences for testing\npurposes. On the other hand, \\x{hh} is interpreted as a UTF-8 character in\nUTF-8 mode, generating more than one byte if the value is greater than 127.\nWhen testing the 8-bit library not in UTF-8 mode, \\x{hh} generates one byte\nfor values less than 256, and causes an error for greater values.\n</P>\n<P>\nIn UTF-16 mode, all 4-digit \\x{hhhh} values are accepted. This makes it\npossible to construct invalid UTF-16 sequences for testing purposes.\n</P>\n<P>\nIn UTF-32 mode, all 4- to 8-digit \\x{...} values are accepted. This makes it\npossible to construct invalid UTF-32 sequences for testing purposes.\n</P>\n<P>\nThe escapes that specify line ending sequences are literal strings, exactly as\nshown. No more than one newline setting should be present in any data line.\n</P>\n<P>\nA backslash followed by anything else just escapes the anything else. If\nthe very last character is a backslash, it is ignored. This gives a way of\npassing an empty line as data, since a real empty line terminates the data\ninput.\n</P>\n<P>\nThe <b>\\J</b> escape provides a way of setting the maximum stack size that is\nused by the just-in-time optimization code. It is ignored if JIT optimization\nis not being used. Providing a stack that is larger than the default 32K is\nnecessary only for very complicated patterns.\n</P>\n<P>\nIf \\M is present, <b>pcretest</b> calls <b>pcre[16|32]_exec()</b> several times,\nwith different values in the <i>match_limit</i> and <i>match_limit_recursion</i>\nfields of the <b>pcre[16|32]_extra</b> data structure, until it finds the minimum\nnumbers for each parameter that allow <b>pcre[16|32]_exec()</b> to complete without\nerror. Because this is testing a specific feature of the normal interpretive\n<b>pcre[16|32]_exec()</b> execution, the use of any JIT optimization that might\nhave been set up by the <b>/S+</b> qualifier of <b>-s+</b> option is disabled.\n</P>\n<P>\nThe <i>match_limit</i> number is a measure of the amount of backtracking\nthat takes place, and checking it out can be instructive. For most simple\nmatches, the number is quite small, but for patterns with very large numbers of\nmatching possibilities, it can become large very quickly with increasing length\nof subject string. The <i>match_limit_recursion</i> number is a measure of how\nmuch stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is\nneeded to complete the match attempt.\n</P>\n<P>\nWhen \\O is used, the value specified may be higher or lower than the size set\nby the <b>-O</b> command line option (or defaulted to 45); \\O applies only to\nthe call of <b>pcre[16|32]_exec()</b> for the line in which it appears.\n</P>\n<P>\nIf the <b>/P</b> modifier was present on the pattern, causing the POSIX wrapper\nAPI to be used, the only option-setting sequences that have any effect are \\B,\n\\N, and \\Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively,\nto be passed to <b>regexec()</b>.\n</P>\n<br><a name=\"SEC8\" href=\"#TOC1\">THE ALTERNATIVE MATCHING FUNCTION</a><br>\n<P>\nBy default, <b>pcretest</b> uses the standard PCRE matching function,\n<b>pcre[16|32]_exec()</b> to match each data line. PCRE also supports an\nalternative matching function, <b>pcre[16|32]_dfa_test()</b>, which operates in a\ndifferent way, and has some restrictions. The differences between the two\nfunctions are described in the\n<a href=\"pcrematching.html\"><b>pcrematching</b></a>\ndocumentation.\n</P>\n<P>\nIf a data line contains the \\D escape sequence, or if the command line\ncontains the <b>-dfa</b> option, the alternative matching function is used.\nThis function finds all possible matches at a given point. If, however, the \\F\nescape sequence is present in the data line, it stops after the first match is\nfound. This is always the shortest possible match.\n</P>\n<br><a name=\"SEC9\" href=\"#TOC1\">DEFAULT OUTPUT FROM PCRETEST</a><br>\n<P>\nThis section describes the output when the normal matching function,\n<b>pcre[16|32]_exec()</b>, is being used.\n</P>\n<P>\nWhen a match succeeds, <b>pcretest</b> outputs the list of captured substrings\nthat <b>pcre[16|32]_exec()</b> returns, starting with number 0 for the string that\nmatched the whole pattern. Otherwise, it outputs \"No match\" when the return is\nPCRE_ERROR_NOMATCH, and \"Partial match:\" followed by the partially matching\nsubstring when <b>pcre[16|32]_exec()</b> returns PCRE_ERROR_PARTIAL. (Note that\nthis is the entire substring that was inspected during the partial match; it\nmay include characters before the actual match start if a lookbehind assertion,\n\\K, \\b, or \\B was involved.) For any other return, <b>pcretest</b> outputs\nthe PCRE negative error number and a short descriptive phrase. If the error is\na failed UTF string check, the offset of the start of the failing character and\nthe reason code are also output, provided that the size of the output vector is\nat least two. Here is an example of an interactive <b>pcretest</b> run.\n<pre>\n  $ pcretest\n  PCRE version 8.13 2011-04-30\n\n    re&#62; /^abc(\\d+)/\n  data&#62; abc123\n   0: abc123\n   1: 123\n  data&#62; xyz\n  No match\n</pre>\nUnset capturing substrings that are not followed by one that is set are not\nreturned by <b>pcre[16|32]_exec()</b>, and are not shown by <b>pcretest</b>. In the\nfollowing example, there are two capturing substrings, but when the first data\nline is matched, the second, unset substring is not shown. An \"internal\" unset\nsubstring is shown as \"&#60;unset&#62;\", as for the second data line.\n<pre>\n    re&#62; /(a)|(b)/\n  data&#62; a\n   0: a\n   1: a\n  data&#62; b\n   0: b\n   1: &#60;unset&#62;\n   2: b\n</pre>\nIf the strings contain any non-printing characters, they are output as \\xhh\nescapes if the value is less than 256 and UTF mode is not set. Otherwise they\nare output as \\x{hh...} escapes. See below for the definition of non-printing\ncharacters. If the pattern has the <b>/+</b> modifier, the output for substring\n0 is followed by the the rest of the subject string, identified by \"0+\" like\nthis:\n<pre>\n    re&#62; /cat/+\n  data&#62; cataract\n   0: cat\n   0+ aract\n</pre>\nIf the pattern has the <b>/g</b> or <b>/G</b> modifier, the results of successive\nmatching attempts are output in sequence, like this:\n<pre>\n    re&#62; /\\Bi(\\w\\w)/g\n  data&#62; Mississippi\n   0: iss\n   1: ss\n   0: iss\n   1: ss\n   0: ipp\n   1: pp\n</pre>\n\"No match\" is output only if the first match attempt fails. Here is an example\nof a failure message (the offset 4 that is specified by \\&#62;4 is past the end of\nthe subject string):\n<pre>\n    re&#62; /xyz/\n  data&#62; xyz\\&#62;4\n  Error -24 (bad offset value)\n</PRE>\n</P>\n<P>\nIf any of the sequences <b>\\C</b>, <b>\\G</b>, or <b>\\L</b> are present in a\ndata line that is successfully matched, the substrings extracted by the\nconvenience functions are output with C, G, or L after the string number\ninstead of a colon. This is in addition to the normal full list. The string\nlength (that is, the return from the extraction function) is given in\nparentheses after each string for <b>\\C</b> and <b>\\G</b>.\n</P>\n<P>\nNote that whereas patterns can be continued over several lines (a plain \"&#62;\"\nprompt is used for continuations), data lines may not. However newlines can be\nincluded in data by means of the \\n escape (or \\r, \\r\\n, etc., depending on\nthe newline sequence setting).\n</P>\n<br><a name=\"SEC10\" href=\"#TOC1\">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a><br>\n<P>\nWhen the alternative matching function, <b>pcre[16|32]_dfa_exec()</b>, is used (by\nmeans of the \\D escape sequence or the <b>-dfa</b> command line option), the\noutput consists of a list of all the matches that start at the first point in\nthe subject where there is at least one match. For example:\n<pre>\n    re&#62; /(tang|tangerine|tan)/\n  data&#62; yellow tangerine\\D\n   0: tangerine\n   1: tang\n   2: tan\n</pre>\n(Using the normal matching function on this data finds only \"tang\".) The\nlongest matching string is always given first (and numbered zero). After a\nPCRE_ERROR_PARTIAL return, the output is \"Partial match:\", followed by the\npartially matching substring. (Note that this is the entire substring that was\ninspected during the partial match; it may include characters before the actual\nmatch start if a lookbehind assertion, \\K, \\b, or \\B was involved.)\n</P>\n<P>\nIf <b>/g</b> is present on the pattern, the search for further matches resumes\nat the end of the longest match. For example:\n<pre>\n    re&#62; /(tang|tangerine|tan)/g\n  data&#62; yellow tangerine and tangy sultana\\D\n   0: tangerine\n   1: tang\n   2: tan\n   0: tang\n   1: tan\n   0: tan\n</pre>\nSince the matching function does not support substring capture, the escape\nsequences that are concerned with captured substrings are not relevant.\n</P>\n<br><a name=\"SEC11\" href=\"#TOC1\">RESTARTING AFTER A PARTIAL MATCH</a><br>\n<P>\nWhen the alternative matching function has given the PCRE_ERROR_PARTIAL return,\nindicating that the subject partially matched the pattern, you can restart the\nmatch with additional subject data by means of the \\R escape sequence. For\nexample:\n<pre>\n    re&#62; /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n  data&#62; 23ja\\P\\D\n  Partial match: 23ja\n  data&#62; n05\\R\\D\n   0: n05\n</pre>\nFor further information about partial matching, see the\n<a href=\"pcrepartial.html\"><b>pcrepartial</b></a>\ndocumentation.\n</P>\n<br><a name=\"SEC12\" href=\"#TOC1\">CALLOUTS</a><br>\n<P>\nIf the pattern contains any callout requests, <b>pcretest</b>'s callout function\nis called during matching. This works with both matching functions. By default,\nthe called function displays the callout number, the start and current\npositions in the text at the callout time, and the next pattern item to be\ntested. For example:\n<pre>\n  ---&#62;pqrabcdef\n    0    ^  ^     \\d\n</pre>\nThis output indicates that callout number 0 occurred for a match attempt\nstarting at the fourth character of the subject string, when the pointer was at\nthe seventh character of the data, and when the next pattern item was \\d. Just\none circumflex is output if the start and current positions are the same.\n</P>\n<P>\nCallouts numbered 255 are assumed to be automatic callouts, inserted as a\nresult of the <b>/C</b> pattern modifier. In this case, instead of showing the\ncallout number, the offset in the pattern, preceded by a plus, is output. For\nexample:\n<pre>\n    re&#62; /\\d?[A-E]\\*/C\n  data&#62; E*\n  ---&#62;E*\n   +0 ^      \\d?\n   +3 ^      [A-E]\n   +8 ^^     \\*\n  +10 ^ ^\n   0: E*\n</pre>\nIf a pattern contains (*MARK) items, an additional line is output whenever\na change of latest mark is passed to the callout function. For example:\n<pre>\n    re&#62; /a(*MARK:X)bc/C\n  data&#62; abc\n  ---&#62;abc\n   +0 ^       a\n   +1 ^^      (*MARK:X)\n  +10 ^^      b\n  Latest Mark: X\n  +11 ^ ^     c\n  +12 ^  ^\n   0: abc\n</pre>\nThe mark changes between matching \"a\" and \"b\", but stays the same for the rest\nof the match, so nothing more is output. If, as a result of backtracking, the\nmark reverts to being unset, the text \"&#60;unset&#62;\" is output.\n</P>\n<P>\nThe callout function in <b>pcretest</b> returns zero (carry on matching) by\ndefault, but you can use a \\C item in a data line (as described above) to\nchange this and other parameters of the callout.\n</P>\n<P>\nInserting callouts can be helpful when using <b>pcretest</b> to check\ncomplicated regular expressions. For further information about callouts, see\nthe\n<a href=\"pcrecallout.html\"><b>pcrecallout</b></a>\ndocumentation.\n</P>\n<br><a name=\"SEC13\" href=\"#TOC1\">NON-PRINTING CHARACTERS</a><br>\n<P>\nWhen <b>pcretest</b> is outputting text in the compiled version of a pattern,\nbytes other than 32-126 are always treated as non-printing characters are are\ntherefore shown as hex escapes.\n</P>\n<P>\nWhen <b>pcretest</b> is outputting text that is a matched part of a subject\nstring, it behaves in the same way, unless a different locale has been set for\nthe pattern (using the <b>/L</b> modifier). In this case, the <b>isprint()</b>\nfunction to distinguish printing and non-printing characters.\n</P>\n<br><a name=\"SEC14\" href=\"#TOC1\">SAVING AND RELOADING COMPILED PATTERNS</a><br>\n<P>\nThe facilities described in this section are not available when the POSIX\ninterface to PCRE is being used, that is, when the <b>/P</b> pattern modifier is\nspecified.\n</P>\n<P>\nWhen the POSIX interface is not in use, you can cause <b>pcretest</b> to write a\ncompiled pattern to a file, by following the modifiers with &#62; and a file name.\nFor example:\n<pre>\n  /pattern/im &#62;/some/file\n</pre>\nSee the\n<a href=\"pcreprecompile.html\"><b>pcreprecompile</b></a>\ndocumentation for a discussion about saving and re-using compiled patterns.\nNote that if the pattern was successfully studied with JIT optimization, the\nJIT data cannot be saved.\n</P>\n<P>\nThe data that is written is binary. The first eight bytes are the length of the\ncompiled pattern data followed by the length of the optional study data, each\nwritten as four bytes in big-endian order (most significant byte first). If\nthere is no study data (either the pattern was not studied, or studying did not\nreturn any data), the second length is zero. The lengths are followed by an\nexact copy of the compiled pattern. If there is additional study data, this\n(excluding any JIT data) follows immediately after the compiled pattern. After\nwriting the file, <b>pcretest</b> expects to read a new pattern.\n</P>\n<P>\nA saved pattern can be reloaded into <b>pcretest</b> by specifying &#60; and a file\nname instead of a pattern. There must be no space between &#60; and the file name,\nwhich must not contain a &#60; character, as otherwise <b>pcretest</b> will\ninterpret the line as a pattern delimited by &#60; characters. For example:\n<pre>\n   re&#62; &#60;/some/file\n  Compiled pattern loaded from /some/file\n  No study data\n</pre>\nIf the pattern was previously studied with the JIT optimization, the JIT\ninformation cannot be saved and restored, and so is lost. When the pattern has\nbeen loaded, <b>pcretest</b> proceeds to read data lines in the usual way.\n</P>\n<P>\nYou can copy a file written by <b>pcretest</b> to a different host and reload it\nthere, even if the new host has opposite endianness to the one on which the\npattern was compiled. For example, you can compile on an i86 machine and run on\na SPARC machine. When a pattern is reloaded on a host with different\nendianness, the confirmation message is changed to:\n<pre>\n  Compiled pattern (byte-inverted) loaded from /some/file\n</pre>\nThe test suite contains some saved pre-compiled patterns with different\nendianness. These are reloaded using \"&#60;!\" instead of just \"&#60;\". This suppresses\nthe \"(byte-inverted)\" text so that the output is the same on all hosts. It also\nforces debugging output once the pattern has been reloaded.\n</P>\n<P>\nFile names for saving and reloading can be absolute or relative, but note that\nthe shell facility of expanding a file name that starts with a tilde (~) is not\navailable.\n</P>\n<P>\nThe ability to save and reload files in <b>pcretest</b> is intended for testing\nand experimentation. It is not intended for production use because only a\nsingle pattern can be written to a file. Furthermore, there is no facility for\nsupplying custom character tables for use with a reloaded pattern. If the\noriginal pattern was compiled with custom tables, an attempt to match a subject\nstring using a reloaded pattern is likely to cause <b>pcretest</b> to crash.\nFinally, if you attempt to load a file that is not in the correct format, the\nresult is undefined.\n</P>\n<br><a name=\"SEC15\" href=\"#TOC1\">SEE ALSO</a><br>\n<P>\n<b>pcre</b>(3), <b>pcre16</b>(3), <b>pcre32</b>(3), <b>pcreapi</b>(3),\n<b>pcrecallout</b>(3),\n<b>pcrejit</b>, <b>pcrematching</b>(3), <b>pcrepartial</b>(d),\n<b>pcrepattern</b>(3), <b>pcreprecompile</b>(3).\n</P>\n<br><a name=\"SEC16\" href=\"#TOC1\">AUTHOR</a><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><a name=\"SEC17\" href=\"#TOC1\">REVISION</a><br>\n<P>\nLast updated: 23 February 2017\n<br>\nCopyright &copy; 1997-2017 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/html/pcreunicode.html",
    "content": "<html>\n<head>\n<title>pcreunicode specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>pcreunicode man page</h1>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n<p>\nThis page is part of the PCRE HTML documentation. It was generated automatically\nfrom the original man page. If there is any nonsense in it, please consult the\nman page, in case the conversion went wrong.\n<br>\n<br><b>\nUTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT\n</b><br>\n<P>\nAs well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and\nUTF-32 (from release 8.32), by means of two additional libraries. They can be\nbuilt as well as, or instead of, the 8-bit library.\n</P>\n<br><b>\nUTF-8 SUPPORT\n</b><br>\n<P>\nIn order process UTF-8 strings, you must build PCRE's 8-bit library with UTF\nsupport, and, in addition, you must call\n<a href=\"pcre_compile.html\"><b>pcre_compile()</b></a>\nwith the PCRE_UTF8 option flag, or the pattern must start with the sequence\n(*UTF8) or (*UTF). When either of these is the case, both the pattern and any\nsubject strings that are matched against it are treated as UTF-8 strings\ninstead of strings of individual 1-byte characters.\n</P>\n<br><b>\nUTF-16 AND UTF-32 SUPPORT\n</b><br>\n<P>\nIn order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or\n32-bit library with UTF support, and, in addition, you must call\n<a href=\"pcre16_compile.html\"><b>pcre16_compile()</b></a>\nor\n<a href=\"pcre32_compile.html\"><b>pcre32_compile()</b></a>\nwith the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively,\nthe pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or\n(*UTF), which can be used with either library. When UTF mode is set, both the\npattern and any subject strings that are matched against it are treated as\nUTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit\ncharacters.\n</P>\n<br><b>\nUTF SUPPORT OVERHEAD\n</b><br>\n<P>\nIf you compile PCRE with UTF support, but do not use it at run time, the\nlibrary will be a bit bigger, but the additional run time overhead is limited\nto testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big.\n</P>\n<br><b>\nUNICODE PROPERTY SUPPORT\n</b><br>\n<P>\nIf PCRE is built with Unicode character property support (which implies UTF\nsupport), the escape sequences \\p{..}, \\P{..}, and \\X can be used.\nThe available properties that can be tested are limited to the general\ncategory properties such as Lu for an upper case letter or Nd for a decimal\nnumber, the Unicode script names such as Arabic or Han, and the derived\nproperties Any and L&. Full lists is given in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\nand\n<a href=\"pcresyntax.html\"><b>pcresyntax</b></a>\ndocumentation. Only the short names for properties are supported. For example,\n\\p{L} matches a letter. Its Perl synonym, \\p{Letter}, is not supported.\nFurthermore, in Perl, many properties may optionally be prefixed by \"Is\", for\ncompatibility with Perl 5.6. PCRE does not support this.\n<a name=\"utf8strings\"></a></P>\n<br><b>\nValidity of UTF-8 strings\n</b><br>\n<P>\nWhen you set the PCRE_UTF8 flag, the byte strings passed as patterns and\nsubjects are (by default) checked for validity on entry to the relevant\nfunctions. The entire string is checked before any other processing takes\nplace. From release 7.3 of PCRE, the check is according the rules of RFC 3629,\nwhich are themselves derived from the Unicode specification. Earlier releases\nof PCRE followed the rules of RFC 2279, which allows the full range of 31-bit\nvalues (0 to 0x7FFFFFFF). The current check allows only values in the range U+0\nto U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called\n\"non-character\" code points are no longer excluded because Unicode corrigendum\n#9 makes it clear that they should not be.)\n</P>\n<P>\nCharacters in the \"Surrogate Area\" of Unicode are reserved for use by UTF-16,\nwhere they are used in pairs to encode codepoints with values greater than\n0xFFFF. The code points that are encoded by UTF-16 pairs are available\nindependently in the UTF-8 and UTF-32 encodings. (In other words, the whole\nsurrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and\nUTF-32.)\n</P>\n<P>\nIf an invalid UTF-8 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first byte\nof the failing character. The run-time functions <b>pcre_exec()</b> and\n<b>pcre_dfa_exec()</b> also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n</P>\n<P>\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance, for\nexample in the case of a long subject string that is being scanned repeatedly.\nIf you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE\nassumes that the pattern or subject it is given (respectively) contains only\nvalid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string.\n</P>\n<P>\nNote that passing PCRE_NO_UTF8_CHECK to <b>pcre_compile()</b> just disables the\ncheck for the pattern; it does not also apply to subject strings. If you want\nto disable the check for a subject string you must pass this option to\n<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>.\n</P>\n<P>\nIf you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result\nis undefined and your program may crash.\n<a name=\"utf16strings\"></a></P>\n<br><b>\nValidity of UTF-16 strings\n</b><br>\n<P>\nWhen you set the PCRE_UTF16 flag, the strings of 16-bit data units that are\npassed as patterns and subjects are (by default) checked for validity on entry\nto the relevant functions. Values other than those in the surrogate range\nU+D800 to U+DFFF are independent code points. Values in the surrogate range\nmust be used in pairs in the correct manner.\n</P>\n<P>\nIf an invalid UTF-16 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first data\nunit of the failing character. The run-time functions <b>pcre16_exec()</b> and\n<b>pcre16_dfa_exec()</b> also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n</P>\n<P>\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance. If you set\nthe PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that\nthe pattern or subject it is given (respectively) contains only valid UTF-16\nsequences. In this case, it does not diagnose an invalid UTF-16 string.\nHowever, if an invalid string is passed, the result is undefined.\n<a name=\"utf32strings\"></a></P>\n<br><b>\nValidity of UTF-32 strings\n</b><br>\n<P>\nWhen you set the PCRE_UTF32 flag, the strings of 32-bit data units that are\npassed as patterns and subjects are (by default) checked for validity on entry\nto the relevant functions.  This check allows only values in the range U+0\nto U+10FFFF, excluding the surrogate area U+D800 to U+DFFF.\n</P>\n<P>\nIf an invalid UTF-32 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first data\nunit of the failing character. The run-time functions <b>pcre32_exec()</b> and\n<b>pcre32_dfa_exec()</b> also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n</P>\n<P>\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance. If you set\nthe PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that\nthe pattern or subject it is given (respectively) contains only valid UTF-32\nsequences. In this case, it does not diagnose an invalid UTF-32 string.\nHowever, if an invalid string is passed, the result is undefined.\n</P>\n<br><b>\nGeneral comments about UTF modes\n</b><br>\n<P>\n1. Codepoints less than 256 can be specified in patterns by either braced or\nunbraced hexadecimal escape sequences (for example, \\x{b3} or \\xb3). Larger\nvalues have to use braced sequences.\n</P>\n<P>\n2. Octal numbers up to \\777 are recognized, and in UTF-8 mode they match\ntwo-byte characters for values greater than \\177.\n</P>\n<P>\n3. Repeat quantifiers apply to complete UTF characters, not to individual\ndata units, for example: \\x{100}{3}.\n</P>\n<P>\n4. The dot metacharacter matches one UTF character instead of a single data\nunit.\n</P>\n<P>\n5. The escape sequence \\C can be used to match a single byte in UTF-8 mode, or\na single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in\nUTF-32 mode, but its use can lead to some strange effects because it breaks up\nmulti-unit characters (see the description of \\C in the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation). The use of \\C is not supported in the alternative matching\nfunction <b>pcre[16|32]_dfa_exec()</b>, nor is it supported in UTF mode by the\nJIT optimization of <b>pcre[16|32]_exec()</b>. If JIT optimization is requested\nfor a UTF pattern that contains \\C, it will not succeed, and so the matching\nwill be carried out by the normal interpretive function.\n</P>\n<P>\n6. The character escapes \\b, \\B, \\d, \\D, \\s, \\S, \\w, and \\W correctly\ntest characters of any code value, but, by default, the characters that PCRE\nrecognizes as digits, spaces, or word characters remain the same set as in\nnon-UTF mode, all with values less than 256. This remains true even when PCRE\nis built to include Unicode property support, because to do otherwise would\nslow down PCRE in many common cases. Note in particular that this applies to\n\\b and \\B, because they are defined in terms of \\w and \\W. If you really\nwant to test for a wider sense of, say, \"digit\", you can use explicit Unicode\nproperty tests such as \\p{Nd}. Alternatively, if you set the PCRE_UCP option,\nthe way that the character escapes work is changed so that Unicode properties\nare used to determine which characters match. There are more details in the\nsection on\n<a href=\"pcrepattern.html#genericchartypes\">generic character types</a>\nin the\n<a href=\"pcrepattern.html\"><b>pcrepattern</b></a>\ndocumentation.\n</P>\n<P>\n7. Similarly, characters that match the POSIX named character classes are all\nlow-valued characters, unless the PCRE_UCP option is set.\n</P>\n<P>\n8. However, the horizontal and vertical white space matching escapes (\\h, \\H,\n\\v, and \\V) do match all the appropriate Unicode characters, whether or not\nPCRE_UCP is set.\n</P>\n<P>\n9. Case-insensitive matching applies only to characters whose values are less\nthan 128, unless PCRE is built with Unicode property support. A few Unicode\ncharacters such as Greek sigma have more than two codepoints that are\ncase-equivalent. Up to and including PCRE release 8.31, only one-to-one case\nmappings were supported, but later releases (with Unicode property support) do\ntreat as case-equivalent all versions of characters such as Greek sigma.\n</P>\n<br><b>\nAUTHOR\n</b><br>\n<P>\nPhilip Hazel\n<br>\nUniversity Computing Service\n<br>\nCambridge CB2 3QH, England.\n<br>\n</P>\n<br><b>\nREVISION\n</b><br>\n<P>\nLast updated: 27 February 2013\n<br>\nCopyright &copy; 1997-2013 University of Cambridge.\n<br>\n<p>\nReturn to the <a href=\"index.html\">PCRE index page</a>.\n</p>\n"
  },
  {
    "path": "src/pcre/doc/index.html.src",
    "content": "<html>\n<!-- This is a manually maintained file that is the root of the HTML version of \n     the PCRE documentation. When the HTML documents are built from the man \n     page versions, the entire doc/html directory is emptied, this file is then \n     copied into doc/html/index.html, and the remaining files therein are \n     created by the 132html script.\n-->      \n<head>\n<title>PCRE specification</title>\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#00005A\" link=\"#0066FF\" alink=\"#3399FF\" vlink=\"#2222BB\">\n<h1>Perl-compatible Regular Expressions (PCRE)</h1>\n<p>\nThe HTML documentation for PCRE consists of a number of pages that are listed\nbelow in alphabetical order. If you are new to PCRE, please read the first one\nfirst.\n</p>\n\n<table>\n<tr><td><a href=\"pcre.html\">pcre</a></td>\n    <td>&nbsp;&nbsp;Introductory page</td></tr>\n\n<tr><td><a href=\"pcre-config.html\">pcre-config</a></td>\n    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>\n\n<tr><td><a href=\"pcre16.html\">pcre16</a></td>\n    <td>&nbsp;&nbsp;Discussion of the 16-bit PCRE library</td></tr>\n\n<tr><td><a href=\"pcre32.html\">pcre32</a></td>\n    <td>&nbsp;&nbsp;Discussion of the 32-bit PCRE library</td></tr>\n\n<tr><td><a href=\"pcreapi.html\">pcreapi</a></td>\n    <td>&nbsp;&nbsp;PCRE's native API</td></tr>\n\n<tr><td><a href=\"pcrebuild.html\">pcrebuild</a></td>\n    <td>&nbsp;&nbsp;Building PCRE</td></tr>\n\n<tr><td><a href=\"pcrecallout.html\">pcrecallout</a></td>\n    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>\n\n<tr><td><a href=\"pcrecompat.html\">pcrecompat</a></td>\n    <td>&nbsp;&nbsp;Compability with Perl</td></tr>\n\n<tr><td><a href=\"pcrecpp.html\">pcrecpp</a></td>\n    <td>&nbsp;&nbsp;The C++ wrapper for the PCRE library</td></tr>\n\n<tr><td><a href=\"pcredemo.html\">pcredemo</a></td>\n    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE library</td></tr>\n\n<tr><td><a href=\"pcregrep.html\">pcregrep</a></td>\n    <td>&nbsp;&nbsp;The <b>pcregrep</b> command</td></tr>\n\n<tr><td><a href=\"pcrejit.html\">pcrejit</a></td>\n    <td>&nbsp;&nbsp;Discussion of the just-in-time optimization support</td></tr>\n\n<tr><td><a href=\"pcrelimits.html\">pcrelimits</a></td>\n    <td>&nbsp;&nbsp;Details of size and other limits</td></tr>\n\n<tr><td><a href=\"pcrematching.html\">pcrematching</a></td>\n    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>\n\n<tr><td><a href=\"pcrepartial.html\">pcrepartial</a></td>\n    <td>&nbsp;&nbsp;Using PCRE for partial matching</td></tr>\n\n<tr><td><a href=\"pcrepattern.html\">pcrepattern</a></td>\n    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE</td></tr>\n\n<tr><td><a href=\"pcreperform.html\">pcreperform</a></td>\n    <td>&nbsp;&nbsp;Some comments on performance</td></tr>\n\n<tr><td><a href=\"pcreposix.html\">pcreposix</a></td>\n    <td>&nbsp;&nbsp;The POSIX API to the PCRE 8-bit library</td></tr>\n\n<tr><td><a href=\"pcreprecompile.html\">pcreprecompile</a></td>\n    <td>&nbsp;&nbsp;How to save and re-use compiled patterns</td></tr>\n\n<tr><td><a href=\"pcresample.html\">pcresample</a></td>\n    <td>&nbsp;&nbsp;Discussion of the pcredemo program</td></tr>\n\n<tr><td><a href=\"pcrestack.html\">pcrestack</a></td>\n    <td>&nbsp;&nbsp;Discussion of PCRE's stack usage</td></tr>\n\n<tr><td><a href=\"pcresyntax.html\">pcresyntax</a></td>\n    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>\n\n<tr><td><a href=\"pcretest.html\">pcretest</a></td>\n    <td>&nbsp;&nbsp;The <b>pcretest</b> command for testing PCRE</td></tr>\n\n<tr><td><a href=\"pcreunicode.html\">pcreunicode</a></td>\n    <td>&nbsp;&nbsp;Discussion of Unicode and UTF-8/UTF-16/UTF-32 support</td></tr>\n</table>\n\n<p>\nThere are also individual pages that summarize the interface for each function\nin the library. There is a single page for each triple of 8-bit/16-bit/32-bit\nfunctions.\n</p>\n\n<table>    \n\n<tr><td><a href=\"pcre_assign_jit_stack.html\">pcre_assign_jit_stack</a></td>\n    <td>&nbsp;&nbsp;Assign stack for JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_compile.html\">pcre_compile</a></td>\n    <td>&nbsp;&nbsp;Compile a regular expression</td></tr>\n\n<tr><td><a href=\"pcre_compile2.html\">pcre_compile2</a></td>\n    <td>&nbsp;&nbsp;Compile a regular expression (alternate interface)</td></tr>\n\n<tr><td><a href=\"pcre_config.html\">pcre_config</a></td>\n    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>\n\n<tr><td><a href=\"pcre_copy_named_substring.html\">pcre_copy_named_substring</a></td>\n    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>\n\n<tr><td><a href=\"pcre_copy_substring.html\">pcre_copy_substring</a></td>\n    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>\n\n<tr><td><a href=\"pcre_dfa_exec.html\">pcre_dfa_exec</a></td>\n    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string\n    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>\n\n<tr><td><a href=\"pcre_exec.html\">pcre_exec</a></td>\n    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string\n    (Perl compatible)</td></tr>\n\n<tr><td><a href=\"pcre_free_study.html\">pcre_free_study</a></td>\n    <td>&nbsp;&nbsp;Free study data</td></tr>\n\n<tr><td><a href=\"pcre_free_substring.html\">pcre_free_substring</a></td>\n    <td>&nbsp;&nbsp;Free extracted substring</td></tr>\n\n<tr><td><a href=\"pcre_free_substring_list.html\">pcre_free_substring_list</a></td>\n    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>\n\n<tr><td><a href=\"pcre_fullinfo.html\">pcre_fullinfo</a></td>\n    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>\n\n<tr><td><a href=\"pcre_get_named_substring.html\">pcre_get_named_substring</a></td>\n    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>\n\n<tr><td><a href=\"pcre_get_stringnumber.html\">pcre_get_stringnumber</a></td>\n    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>\n\n<tr><td><a href=\"pcre_get_stringtable_entries.html\">pcre_get_stringtable_entries</a></td>\n    <td>&nbsp;&nbsp;Find table entries for given string name</td></tr>\n\n<tr><td><a href=\"pcre_get_substring.html\">pcre_get_substring</a></td>\n    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>\n\n<tr><td><a href=\"pcre_get_substring_list.html\">pcre_get_substring_list</a></td>\n    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>\n\n<tr><td><a href=\"pcre_jit_exec.html\">pcre_jit_exec</a></td>\n    <td>&nbsp;&nbsp;Fast path interface to JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_jit_stack_alloc.html\">pcre_jit_stack_alloc</a></td>\n    <td>&nbsp;&nbsp;Create a stack for JIT matching</td></tr>\n\n<tr><td><a href=\"pcre_jit_stack_free.html\">pcre_jit_stack_free</a></td>\n    <td>&nbsp;&nbsp;Free a JIT matching stack</td></tr>\n\n<tr><td><a href=\"pcre_maketables.html\">pcre_maketables</a></td>\n    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>\n    \n<tr><td><a href=\"pcre_pattern_to_host_byte_order.html\">pcre_pattern_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert compiled pattern to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_refcount.html\">pcre_refcount</a></td>\n    <td>&nbsp;&nbsp;Maintain reference count in compiled pattern</td></tr>\n\n<tr><td><a href=\"pcre_study.html\">pcre_study</a></td>\n    <td>&nbsp;&nbsp;Study a compiled pattern</td></tr>\n\n<tr><td><a href=\"pcre_utf16_to_host_byte_order.html\">pcre_utf16_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert UTF-16 string to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_utf32_to_host_byte_order.html\">pcre_utf32_to_host_byte_order</a></td>\n    <td>&nbsp;&nbsp;Convert UTF-32 string to host byte order if necessary</td></tr>\n\n<tr><td><a href=\"pcre_version.html\">pcre_version</a></td>\n    <td>&nbsp;&nbsp;Return PCRE version and release date</td></tr>\n</table>\n\n</html>\n"
  },
  {
    "path": "src/pcre/doc/pcre-config.1",
    "content": ".TH PCRE-CONFIG 1 \"01 January 2012\" \"PCRE 8.30\"\n.SH NAME\npcre-config - program to return PCRE configuration\n.SH SYNOPSIS\n.rs\n.sp\n.nf\n.B pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]\n.B \"            [--libs16] [--libs32] [--libs-cpp] [--libs-posix]\"\n.B \"            [--cflags] [--cflags-posix]\"\n.fi\n.\n.\n.SH DESCRIPTION\n.rs\n.sp\n\\fBpcre-config\\fP returns the configuration of the installed PCRE\nlibraries and the options required to compile a program to use them. Some of\nthe options apply only to the 8-bit, or 16-bit, or 32-bit libraries,\nrespectively, and are\nnot available if only one of those libraries has been built. If an unavailable\noption is encountered, the \"usage\" information is output.\n.\n.\n.SH OPTIONS\n.rs\n.TP 10\n\\fB--prefix\\fP\nWrites the directory prefix used in the PCRE installation for architecture\nindependent files (\\fI/usr\\fP on many systems, \\fI/usr/local\\fP on some\nsystems) to the standard output.\n.TP 10\n\\fB--exec-prefix\\fP\nWrites the directory prefix used in the PCRE installation for architecture\ndependent files (normally the same as \\fB--prefix\\fP) to the standard output.\n.TP 10\n\\fB--version\\fP\nWrites the version number of the installed PCRE libraries to the standard\noutput.\n.TP 10\n\\fB--libs\\fP\nWrites to the standard output the command line options required to link\nwith the 8-bit PCRE library (\\fB-lpcre\\fP on many systems).\n.TP 10\n\\fB--libs16\\fP\nWrites to the standard output the command line options required to link\nwith the 16-bit PCRE library (\\fB-lpcre16\\fP on many systems).\n.TP 10\n\\fB--libs32\\fP\nWrites to the standard output the command line options required to link\nwith the 32-bit PCRE library (\\fB-lpcre32\\fP on many systems).\n.TP 10\n\\fB--libs-cpp\\fP\nWrites to the standard output the command line options required to link with\nPCRE's C++ wrapper library (\\fB-lpcrecpp\\fP \\fB-lpcre\\fP on many\nsystems).\n.TP 10\n\\fB--libs-posix\\fP\nWrites to the standard output the command line options required to link with\nPCRE's POSIX API wrapper library (\\fB-lpcreposix\\fP \\fB-lpcre\\fP on many\nsystems).\n.TP 10\n\\fB--cflags\\fP\nWrites to the standard output the command line options required to compile\nfiles that use PCRE (this may include some \\fB-I\\fP options, but is blank on\nmany systems).\n.TP 10\n\\fB--cflags-posix\\fP\nWrites to the standard output the command line options required to compile\nfiles that use PCRE's POSIX API wrapper library (this may include some \\fB-I\\fP\noptions, but is blank on many systems).\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcre(3)\\fP\n.\n.\n.SH AUTHOR\n.rs\n.sp\nThis manual page was originally written by Mark Baker for the Debian GNU/Linux\nsystem. It has been subsequently revised as a generic PCRE man page.\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 24 June 2012\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcre-config.txt",
    "content": "PCRE-CONFIG(1)              General Commands Manual             PCRE-CONFIG(1)\n\n\n\nNAME\n       pcre-config - program to return PCRE configuration\n\nSYNOPSIS\n\n       pcre-config [--prefix] [--exec-prefix] [--version] [--libs]\n                   [--libs16] [--libs32] [--libs-cpp] [--libs-posix]\n                   [--cflags] [--cflags-posix]\n\n\nDESCRIPTION\n\n       pcre-config  returns  the configuration of the installed PCRE libraries\n       and the options required to compile a program to use them. Some of  the\n       options  apply  only  to  the  8-bit,  or  16-bit, or 32-bit libraries,\n       respectively, and are not available if only one of those libraries  has\n       been built. If an unavailable option is encountered, the \"usage\" infor-\n       mation is output.\n\n\nOPTIONS\n\n       --prefix  Writes the directory prefix used in the PCRE installation for\n                 architecture   independent   files  (/usr  on  many  systems,\n                 /usr/local on some systems) to the standard output.\n\n       --exec-prefix\n                 Writes the directory prefix used in the PCRE installation for\n                 architecture  dependent files (normally the same as --prefix)\n                 to the standard output.\n\n       --version Writes the version number of the installed PCRE libraries  to\n                 the standard output.\n\n       --libs    Writes  to  the  standard  output  the  command  line options\n                 required to link with the 8-bit PCRE library (-lpcre on  many\n                 systems).\n\n       --libs16  Writes  to  the  standard  output  the  command  line options\n                 required to link with the 16-bit PCRE  library  (-lpcre16  on\n                 many systems).\n\n       --libs32  Writes  to  the  standard  output  the  command  line options\n                 required to link with the 32-bit PCRE  library  (-lpcre32  on\n                 many systems).\n\n       --libs-cpp\n                 Writes  to  the  standard  output  the  command  line options\n                 required to link with PCRE's C++ wrapper  library  (-lpcrecpp\n                 -lpcre on many systems).\n\n       --libs-posix\n                 Writes  to  the  standard  output  the  command  line options\n                 required to  link  with  PCRE's  POSIX  API  wrapper  library\n                 (-lpcreposix -lpcre on many systems).\n\n       --cflags  Writes  to  the  standard  output  the  command  line options\n                 required to compile files that use  PCRE  (this  may  include\n                 some -I options, but is blank on many systems).\n\n       --cflags-posix\n                 Writes  to  the  standard  output  the  command  line options\n                 required to compile files that use PCRE's POSIX  API  wrapper\n                 library  (this  may  include some -I options, but is blank on\n                 many systems).\n\n\nSEE ALSO\n\n       pcre(3)\n\n\nAUTHOR\n\n       This manual page was originally written by Mark Baker  for  the  Debian\n       GNU/Linux  system.  It  has been subsequently revised as a generic PCRE\n       man page.\n\n\nREVISION\n\n       Last updated: 24 June 2012\n"
  },
  {
    "path": "src/pcre/doc/pcre.3",
    "content": ".TH PCRE 3 \"10 February 2015\" \"PCRE 8.37\"\n.SH NAME\nPCRE - Perl-compatible regular expressions (original API)\n.SH \"PLEASE TAKE NOTE\"\n.rs\n.sp\nThis document relates to PCRE releases that use the original API,\nwith library names libpcre, libpcre16, and libpcre32. January 2015 saw the\nfirst release of a new API, known as PCRE2, with release numbers starting at\n10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old\nlibraries (now called PCRE1) are still being maintained for bug fixes, but\nthere will be no new development. New projects are advised to use the new PCRE2\nlibraries.\n.\n.\n.SH INTRODUCTION\n.rs\n.sp\nThe PCRE library is a set of functions that implement regular expression\npattern matching using the same syntax and semantics as Perl, with just a few\ndifferences. Some features that appeared in Python and PCRE before they\nappeared in Perl are also available using the Python syntax, there is some\nsupport for one or two .NET and Oniguruma syntax items, and there is an option\nfor requesting some minor changes that give better JavaScript compatibility.\n.P\nStarting with release 8.30, it is possible to compile two separate PCRE\nlibraries: the original, which supports 8-bit character strings (including\nUTF-8 strings), and a second library that supports 16-bit character strings\n(including UTF-16 strings). The build process allows either one or both to be\nbuilt. The majority of the work to make this possible was done by Zoltan\nHerczeg.\n.P\nStarting with release 8.32 it is possible to compile a third separate PCRE\nlibrary that supports 32-bit character strings (including UTF-32 strings). The\nbuild process allows any combination of the 8-, 16- and 32-bit libraries. The\nwork to make this possible was done by Christian Persch.\n.P\nThe three libraries contain identical sets of functions, except that the names\nin the 16-bit library start with \\fBpcre16_\\fP instead of \\fBpcre_\\fP, and the\nnames in the 32-bit library start with \\fBpcre32_\\fP instead of \\fBpcre_\\fP. To\navoid over-complication and reduce the documentation maintenance load, most of\nthe documentation describes the 8-bit library, with the differences for the\n16-bit and 32-bit libraries described separately in the\n.\\\" HREF\n\\fBpcre16\\fP\nand\n.\\\" HREF\n\\fBpcre32\\fP\n.\\\"\npages. References to functions or structures of the form \\fIpcre[16|32]_xxx\\fP\nshould be read as meaning \"\\fIpcre_xxx\\fP when using the 8-bit library,\n\\fIpcre16_xxx\\fP when using the 16-bit library, or \\fIpcre32_xxx\\fP when using\nthe 32-bit library\".\n.P\nThe current implementation of PCRE corresponds approximately with Perl 5.12,\nincluding support for UTF-8/16/32 encoded strings and Unicode general category\nproperties. However, UTF-8/16/32 and Unicode support has to be explicitly\nenabled; it is not the default. The Unicode tables correspond to Unicode\nrelease 6.3.0.\n.P\nIn addition to the Perl-compatible matching function, PCRE contains an\nalternative function that matches the same compiled patterns in a different\nway. In certain circumstances, the alternative function has some advantages.\nFor a discussion of the two matching algorithms, see the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\npage.\n.P\nPCRE is written in C and released as a C library. A number of people have\nwritten wrappers and interfaces of various kinds. In particular, Google Inc.\nhave provided a comprehensive C++ wrapper for the 8-bit library. This is now\nincluded as part of the PCRE distribution. The\n.\\\" HREF\n\\fBpcrecpp\\fP\n.\\\"\npage has details of this interface. Other people's contributions can be found\nin the \\fIContrib\\fP directory at the primary FTP site, which is:\n.sp\n.\\\" HTML <a href=\"ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre\">\n.\\\" </a>\nftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre\n.\\\"\n.P\nDetails of exactly which Perl regular expression features are and are not\nsupported by PCRE are given in separate documents. See the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\nand\n.\\\" HREF\n\\fBpcrecompat\\fP\n.\\\"\npages. There is a syntax summary in the\n.\\\" HREF\n\\fBpcresyntax\\fP\n.\\\"\npage.\n.P\nSome features of PCRE can be included, excluded, or changed when the library is\nbuilt. The\n.\\\" HREF\n\\fBpcre_config()\\fP\n.\\\"\nfunction makes it possible for a client to discover which features are\navailable. The features themselves are described in the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\npage. Documentation about building PCRE for various operating systems can be\nfound in the\n.\\\" HTML <a href=\"README.txt\">\n.\\\" </a>\n\\fBREADME\\fP\n.\\\"\nand\n.\\\" HTML <a href=\"NON-AUTOTOOLS-BUILD.txt\">\n.\\\" </a>\n\\fBNON-AUTOTOOLS_BUILD\\fP\n.\\\"\nfiles in the source distribution.\n.P\nThe libraries contains a number of undocumented internal functions and data\ntables that are used by more than one of the exported external functions, but\nwhich are not intended for use by external callers. Their names all begin with\n\"_pcre_\" or \"_pcre16_\" or \"_pcre32_\", which hopefully will not provoke any name\nclashes. In some environments, it is possible to control which external symbols\nare exported when a shared library is built, and in these cases the\nundocumented symbols are not exported.\n.\n.\n.SH \"SECURITY CONSIDERATIONS\"\n.rs\n.sp\nIf you are using PCRE in a non-UTF application that permits users to supply\narbitrary patterns for compilation, you should be aware of a feature that\nallows users to turn on UTF support from within a pattern, provided that PCRE\nwas built with UTF support. For example, an 8-bit pattern that begins with\n\"(*UTF8)\" or \"(*UTF)\" turns on UTF-8 mode, which interprets patterns and\nsubjects as strings of UTF-8 characters instead of individual 8-bit characters.\nThis causes both the pattern and any data against which it is matched to be\nchecked for UTF-8 validity. If the data string is very long, such a check might\nuse sufficiently many resources as to cause your application to lose\nperformance.\n.P\nOne way of guarding against this possibility is to use the\n\\fBpcre_fullinfo()\\fP function to check the compiled pattern's options for UTF.\nAlternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at\ncompile time. This causes an compile time error if a pattern contains a\nUTF-setting sequence.\n.P\nIf your application is one that supports UTF, be aware that validity checking\ncan take time. If the same data string is to be matched many times, you can use\nthe PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to\nsave redundant checks.\n.P\nAnother way that performance can be hit is by running a pattern that has a very\nlarge search tree against a string that will never match. Nested unlimited\nrepeats in a pattern are a common example. PCRE provides some protection\nagainst this: see the PCRE_EXTRA_MATCH_LIMIT feature in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage.\n.\n.\n.SH \"USER DOCUMENTATION\"\n.rs\n.sp\nThe user documentation for PCRE comprises a number of different sections. In\nthe \"man\" format, each of these is a separate \"man page\". In the HTML format,\neach is a separate page, linked from the index page. In the plain text format,\nthe descriptions of the \\fBpcregrep\\fP and \\fBpcretest\\fP programs are in files\ncalled \\fBpcregrep.txt\\fP and \\fBpcretest.txt\\fP, respectively. The remaining\nsections, except for the \\fBpcredemo\\fP section (which is a program listing),\nare concatenated in \\fBpcre.txt\\fP, for ease of searching. The sections are as\nfollows:\n.sp\n  pcre              this document\n  pcre-config       show PCRE installation configuration information\n  pcre16            details of the 16-bit library\n  pcre32            details of the 32-bit library\n  pcreapi           details of PCRE's native C API\n  pcrebuild         building PCRE\n  pcrecallout       details of the callout feature\n  pcrecompat        discussion of Perl compatibility\n  pcrecpp           details of the C++ wrapper for the 8-bit library\n  pcredemo          a demonstration C program that uses PCRE\n  pcregrep          description of the \\fBpcregrep\\fP command (8-bit only)\n  pcrejit           discussion of the just-in-time optimization support\n  pcrelimits        details of size and other limits\n  pcrematching      discussion of the two matching algorithms\n  pcrepartial       details of the partial matching facility\n.\\\" JOIN\n  pcrepattern       syntax and semantics of supported\n                      regular expressions\n  pcreperform       discussion of performance issues\n  pcreposix         the POSIX-compatible C API for the 8-bit library\n  pcreprecompile    details of saving and re-using precompiled patterns\n  pcresample        discussion of the pcredemo program\n  pcrestack         discussion of stack usage\n  pcresyntax        quick syntax reference\n  pcretest          description of the \\fBpcretest\\fP testing command\n  pcreunicode       discussion of Unicode and UTF-8/16/32 support\n.sp\nIn the \"man\" and HTML formats, there is also a short page for each C library\nfunction, listing its arguments and results.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.P\nPutting an actual email address here seems to have been a spam magnet, so I've\ntaken it away. If you want to email me, use my two initials, followed by the\ntwo digits 10, at the domain cam.ac.uk.\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 10 February 2015\nCopyright (c) 1997-2015 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcre.txt",
    "content": "-----------------------------------------------------------------------------\nThis file contains a concatenation of the PCRE man pages, converted to plain\ntext format for ease of searching with a text editor, or for use on systems\nthat do not have a man page processor. The small individual files that give\nsynopses of each function in the library have not been included. Neither has\nthe pcredemo program. There are separate text files for the pcregrep and\npcretest commands.\n-----------------------------------------------------------------------------\n\n\nPCRE(3)                    Library Functions Manual                    PCRE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions (original API)\n\nPLEASE TAKE NOTE\n\n       This  document relates to PCRE releases that use the original API, with\n       library names libpcre, libpcre16, and libpcre32. January 2015  saw  the\n       first release of a new API, known as PCRE2, with release numbers start-\n       ing  at  10.00  and  library   names   libpcre2-8,   libpcre2-16,   and\n       libpcre2-32. The old libraries (now called PCRE1) are still being main-\n       tained for bug fixes,  but  there  will  be  no  new  development.  New\n       projects are advised to use the new PCRE2 libraries.\n\n\nINTRODUCTION\n\n       The  PCRE  library is a set of functions that implement regular expres-\n       sion pattern matching using the same syntax and semantics as Perl, with\n       just  a few differences. Some features that appeared in Python and PCRE\n       before they appeared in Perl are also available using the  Python  syn-\n       tax,  there  is  some  support for one or two .NET and Oniguruma syntax\n       items, and there is an option for requesting some  minor  changes  that\n       give better JavaScript compatibility.\n\n       Starting with release 8.30, it is possible to compile two separate PCRE\n       libraries:  the  original,  which  supports  8-bit  character   strings\n       (including  UTF-8  strings),  and a second library that supports 16-bit\n       character strings (including UTF-16 strings). The build process  allows\n       either  one  or both to be built. The majority of the work to make this\n       possible was done by Zoltan Herczeg.\n\n       Starting with release 8.32 it is possible to compile a  third  separate\n       PCRE  library  that supports 32-bit character strings (including UTF-32\n       strings). The build process allows any combination of the 8-,  16-  and\n       32-bit  libraries. The work to make this possible was done by Christian\n       Persch.\n\n       The three libraries contain identical sets of  functions,  except  that\n       the  names  in  the 16-bit library start with pcre16_ instead of pcre_,\n       and the names in the 32-bit  library  start  with  pcre32_  instead  of\n       pcre_.  To avoid over-complication and reduce the documentation mainte-\n       nance load, most of the documentation describes the 8-bit library, with\n       the  differences  for  the  16-bit and 32-bit libraries described sepa-\n       rately in the pcre16 and  pcre32  pages.  References  to  functions  or\n       structures  of  the  form  pcre[16|32]_xxx  should  be  read as meaning\n       \"pcre_xxx when using the  8-bit  library,  pcre16_xxx  when  using  the\n       16-bit library, or pcre32_xxx when using the 32-bit library\".\n\n       The  current implementation of PCRE corresponds approximately with Perl\n       5.12, including support for UTF-8/16/32  encoded  strings  and  Unicode\n       general  category  properties. However, UTF-8/16/32 and Unicode support\n       has to be explicitly enabled; it is not the default. The Unicode tables\n       correspond to Unicode release 6.3.0.\n\n       In  addition to the Perl-compatible matching function, PCRE contains an\n       alternative function that matches the same compiled patterns in a  dif-\n       ferent way. In certain circumstances, the alternative function has some\n       advantages.  For a discussion of the two matching algorithms,  see  the\n       pcrematching page.\n\n       PCRE  is  written  in C and released as a C library. A number of people\n       have written wrappers and interfaces of various kinds.  In  particular,\n       Google  Inc.   have  provided a comprehensive C++ wrapper for the 8-bit\n       library. This is now included as part of  the  PCRE  distribution.  The\n       pcrecpp  page  has  details of this interface. Other people's contribu-\n       tions can be found in the Contrib directory at the  primary  FTP  site,\n       which is:\n\n       ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre\n\n       Details  of  exactly which Perl regular expression features are and are\n       not supported by PCRE are given in separate documents. See the pcrepat-\n       tern  and pcrecompat pages. There is a syntax summary in the pcresyntax\n       page.\n\n       Some features of PCRE can be included, excluded, or  changed  when  the\n       library  is  built.  The pcre_config() function makes it possible for a\n       client to discover which features are  available.  The  features  them-\n       selves  are described in the pcrebuild page. Documentation about build-\n       ing PCRE for various operating systems can be found in the  README  and\n       NON-AUTOTOOLS_BUILD files in the source distribution.\n\n       The  libraries contains a number of undocumented internal functions and\n       data tables that are used by more than one  of  the  exported  external\n       functions,  but  which  are  not  intended for use by external callers.\n       Their names all begin with \"_pcre_\" or \"_pcre16_\" or \"_pcre32_\",  which\n       hopefully  will  not provoke any name clashes. In some environments, it\n       is possible to control which  external  symbols  are  exported  when  a\n       shared  library  is  built, and in these cases the undocumented symbols\n       are not exported.\n\n\nSECURITY CONSIDERATIONS\n\n       If you are using PCRE in a non-UTF application that  permits  users  to\n       supply  arbitrary  patterns  for  compilation, you should be aware of a\n       feature that allows users to turn on UTF support from within a pattern,\n       provided  that  PCRE  was built with UTF support. For example, an 8-bit\n       pattern that begins with \"(*UTF8)\" or \"(*UTF)\"  turns  on  UTF-8  mode,\n       which  interprets  patterns and subjects as strings of UTF-8 characters\n       instead of individual 8-bit characters.  This causes both  the  pattern\n       and any data against which it is matched to be checked for UTF-8 valid-\n       ity. If the data string is very long, such a  check  might  use  suffi-\n       ciently  many  resources  as  to cause your application to lose perfor-\n       mance.\n\n       One  way  of  guarding  against  this  possibility  is   to   use   the\n       pcre_fullinfo()  function  to  check the compiled pattern's options for\n       UTF.  Alternatively, from release 8.33, you can set the  PCRE_NEVER_UTF\n       option  at compile time. This causes an compile time error if a pattern\n       contains a UTF-setting sequence.\n\n       If your application is one that supports UTF, be  aware  that  validity\n       checking  can  take time. If the same data string is to be matched many\n       times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second\n       and subsequent matches to save redundant checks.\n\n       Another  way  that  performance can be hit is by running a pattern that\n       has a very large search tree against a string that  will  never  match.\n       Nested  unlimited  repeats in a pattern are a common example. PCRE pro-\n       vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea-\n       ture in the pcreapi page.\n\n\nUSER DOCUMENTATION\n\n       The  user  documentation  for PCRE comprises a number of different sec-\n       tions. In the \"man\" format, each of these is a separate \"man page\".  In\n       the  HTML  format, each is a separate page, linked from the index page.\n       In the plain text format, the descriptions of the pcregrep and pcretest\n       programs  are  in  files  called pcregrep.txt and pcretest.txt, respec-\n       tively. The remaining sections, except for the pcredemo section  (which\n       is  a  program  listing),  are  concatenated  in  pcre.txt, for ease of\n       searching. The sections are as follows:\n\n         pcre              this document\n         pcre-config       show PCRE installation configuration information\n         pcre16            details of the 16-bit library\n         pcre32            details of the 32-bit library\n         pcreapi           details of PCRE's native C API\n         pcrebuild         building PCRE\n         pcrecallout       details of the callout feature\n         pcrecompat        discussion of Perl compatibility\n         pcrecpp           details of the C++ wrapper for the 8-bit library\n         pcredemo          a demonstration C program that uses PCRE\n         pcregrep          description of the pcregrep command (8-bit only)\n         pcrejit           discussion of the just-in-time optimization support\n         pcrelimits        details of size and other limits\n         pcrematching      discussion of the two matching algorithms\n         pcrepartial       details of the partial matching facility\n         pcrepattern       syntax and semantics of supported\n                             regular expressions\n         pcreperform       discussion of performance issues\n         pcreposix         the POSIX-compatible C API for the 8-bit library\n         pcreprecompile    details of saving and re-using precompiled patterns\n         pcresample        discussion of the pcredemo program\n         pcrestack         discussion of stack usage\n         pcresyntax        quick syntax reference\n         pcretest          description of the pcretest testing command\n         pcreunicode       discussion of Unicode and UTF-8/16/32 support\n\n       In the \"man\" and HTML formats, there is also a short page  for  each  C\n       library function, listing its arguments and results.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n       Putting  an actual email address here seems to have been a spam magnet,\n       so I've taken it away. If you want to email me, use  my  two  initials,\n       followed by the two digits 10, at the domain cam.ac.uk.\n\n\nREVISION\n\n       Last updated: 10 February 2015\n       Copyright (c) 1997-2015 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRE(3)                    Library Functions Manual                    PCRE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\n       #include <pcre.h>\n\n\nPCRE 16-BIT API BASIC FUNCTIONS\n\n       pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options,\n            int *errorcodeptr,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre16_extra *pcre16_study(const pcre16 *code, int options,\n            const char **errptr);\n\n       void pcre16_free_study(pcre16_extra *extra);\n\n       int pcre16_exec(const pcre16 *code, const pcre16_extra *extra,\n            PCRE_SPTR16 subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize);\n\n       int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra,\n            PCRE_SPTR16 subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize,\n            int *workspace, int wscount);\n\n\nPCRE 16-BIT API STRING EXTRACTION FUNCTIONS\n\n       int pcre16_copy_named_substring(const pcre16 *code,\n            PCRE_SPTR16 subject, int *ovector,\n            int stringcount, PCRE_SPTR16 stringname,\n            PCRE_UCHAR16 *buffer, int buffersize);\n\n       int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector,\n            int stringcount, int stringnumber, PCRE_UCHAR16 *buffer,\n            int buffersize);\n\n       int pcre16_get_named_substring(const pcre16 *code,\n            PCRE_SPTR16 subject, int *ovector,\n            int stringcount, PCRE_SPTR16 stringname,\n            PCRE_SPTR16 *stringptr);\n\n       int pcre16_get_stringnumber(const pcre16 *code,\n            PCRE_SPTR16 name);\n\n       int pcre16_get_stringtable_entries(const pcre16 *code,\n            PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last);\n\n       int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector,\n            int stringcount, int stringnumber,\n            PCRE_SPTR16 *stringptr);\n\n       int pcre16_get_substring_list(PCRE_SPTR16 subject,\n            int *ovector, int stringcount, PCRE_SPTR16 **listptr);\n\n       void pcre16_free_substring(PCRE_SPTR16 stringptr);\n\n       void pcre16_free_substring_list(PCRE_SPTR16 *stringptr);\n\n\nPCRE 16-BIT API AUXILIARY FUNCTIONS\n\n       pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize);\n\n       void pcre16_jit_stack_free(pcre16_jit_stack *stack);\n\n       void pcre16_assign_jit_stack(pcre16_extra *extra,\n            pcre16_jit_callback callback, void *data);\n\n       const unsigned char *pcre16_maketables(void);\n\n       int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra,\n            int what, void *where);\n\n       int pcre16_refcount(pcre16 *code, int adjust);\n\n       int pcre16_config(int what, void *where);\n\n       const char *pcre16_version(void);\n\n       int pcre16_pattern_to_host_byte_order(pcre16 *code,\n            pcre16_extra *extra, const unsigned char *tables);\n\n\nPCRE 16-BIT API INDIRECTED FUNCTIONS\n\n       void *(*pcre16_malloc)(size_t);\n\n       void (*pcre16_free)(void *);\n\n       void *(*pcre16_stack_malloc)(size_t);\n\n       void (*pcre16_stack_free)(void *);\n\n       int (*pcre16_callout)(pcre16_callout_block *);\n\n\nPCRE 16-BIT API 16-BIT-ONLY FUNCTION\n\n       int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output,\n            PCRE_SPTR16 input, int length, int *byte_order,\n            int keep_boms);\n\n\nTHE PCRE 16-BIT LIBRARY\n\n       Starting  with  release  8.30, it is possible to compile a PCRE library\n       that supports 16-bit character strings, including  UTF-16  strings,  as\n       well  as  or instead of the original 8-bit library. The majority of the\n       work to make  this  possible  was  done  by  Zoltan  Herczeg.  The  two\n       libraries contain identical sets of functions, used in exactly the same\n       way. Only the names of the functions and the data types of their  argu-\n       ments  and results are different. To avoid over-complication and reduce\n       the documentation maintenance load,  most  of  the  PCRE  documentation\n       describes  the  8-bit  library,  with only occasional references to the\n       16-bit library. This page describes what is different when you use  the\n       16-bit library.\n\n       WARNING:  A  single  application can be linked with both libraries, but\n       you must take care when processing any particular pattern to use  func-\n       tions  from  just one library. For example, if you want to study a pat-\n       tern that was compiled with  pcre16_compile(),  you  must  do  so  with\n       pcre16_study(), not pcre_study(), and you must free the study data with\n       pcre16_free_study().\n\n\nTHE HEADER FILE\n\n       There is only one header file, pcre.h. It contains prototypes  for  all\n       the functions in all libraries, as well as definitions of flags, struc-\n       tures, error codes, etc.\n\n\nTHE LIBRARY NAME\n\n       In Unix-like systems, the 16-bit library is called libpcre16,  and  can\n       normally  be  accesss  by adding -lpcre16 to the command for linking an\n       application that uses PCRE.\n\n\nSTRING TYPES\n\n       In the 8-bit library, strings are passed to PCRE library  functions  as\n       vectors  of  bytes  with  the  C  type \"char *\". In the 16-bit library,\n       strings are passed as vectors of unsigned 16-bit quantities. The  macro\n       PCRE_UCHAR16  specifies  an  appropriate  data type, and PCRE_SPTR16 is\n       defined as \"const PCRE_UCHAR16 *\". In very  many  environments,  \"short\n       int\" is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16\n       as \"unsigned short int\", but checks that it really  is  a  16-bit  data\n       type.  If  it is not, the build fails with an error message telling the\n       maintainer to modify the definition appropriately.\n\n\nSTRUCTURE TYPES\n\n       The types of the opaque structures that are used  for  compiled  16-bit\n       patterns  and  JIT stacks are pcre16 and pcre16_jit_stack respectively.\n       The  type  of  the  user-accessible  structure  that  is  returned   by\n       pcre16_study()  is  pcre16_extra, and the type of the structure that is\n       used for passing data to a callout  function  is  pcre16_callout_block.\n       These structures contain the same fields, with the same names, as their\n       8-bit counterparts. The only difference is that pointers  to  character\n       strings are 16-bit instead of 8-bit types.\n\n\n16-BIT FUNCTIONS\n\n       For  every function in the 8-bit library there is a corresponding func-\n       tion in the 16-bit library with a name that starts with pcre16_ instead\n       of  pcre_.  The  prototypes are listed above. In addition, there is one\n       extra function, pcre16_utf16_to_host_byte_order(). This  is  a  utility\n       function  that converts a UTF-16 character string to host byte order if\n       necessary. The other 16-bit  functions  expect  the  strings  they  are\n       passed to be in host byte order.\n\n       The input and output arguments of pcre16_utf16_to_host_byte_order() may\n       point to the same address, that is, conversion in place  is  supported.\n       The output buffer must be at least as long as the input.\n\n       The  length  argument  specifies the number of 16-bit data units in the\n       input string; a negative value specifies a zero-terminated string.\n\n       If byte_order is NULL, it is assumed that the string starts off in host\n       byte  order. This may be changed by byte-order marks (BOMs) anywhere in\n       the string (commonly as the first character).\n\n       If byte_order is not NULL, a non-zero value of the integer to which  it\n       points  means  that  the input starts off in host byte order, otherwise\n       the opposite order is assumed. Again, BOMs in  the  string  can  change\n       this. The final byte order is passed back at the end of processing.\n\n       If  keep_boms  is  not  zero,  byte-order  mark characters (0xfeff) are\n       copied into the output string. Otherwise they are discarded.\n\n       The result of the function is the number of 16-bit  units  placed  into\n       the  output  buffer,  including  the  zero terminator if the string was\n       zero-terminated.\n\n\nSUBJECT STRING OFFSETS\n\n       The lengths and starting offsets of subject strings must  be  specified\n       in  16-bit  data units, and the offsets within subject strings that are\n       returned by the matching functions are in also 16-bit units rather than\n       bytes.\n\n\nNAMED SUBPATTERNS\n\n       The  name-to-number translation table that is maintained for named sub-\n       patterns uses 16-bit characters.  The  pcre16_get_stringtable_entries()\n       function returns the length of each entry in the table as the number of\n       16-bit data units.\n\n\nOPTION NAMES\n\n       There   are   two   new   general   option   names,   PCRE_UTF16    and\n       PCRE_NO_UTF16_CHECK,     which     correspond    to    PCRE_UTF8    and\n       PCRE_NO_UTF8_CHECK in the 8-bit library. In  fact,  these  new  options\n       define  the  same bits in the options word. There is a discussion about\n       the validity of UTF-16 strings in the pcreunicode page.\n\n       For the pcre16_config() function there is an  option  PCRE_CONFIG_UTF16\n       that  returns  1  if UTF-16 support is configured, otherwise 0. If this\n       option  is  given  to  pcre_config()  or  pcre32_config(),  or  if  the\n       PCRE_CONFIG_UTF8  or  PCRE_CONFIG_UTF32  option is given to pcre16_con-\n       fig(), the result is the PCRE_ERROR_BADOPTION error.\n\n\nCHARACTER CODES\n\n       In 16-bit mode, when  PCRE_UTF16  is  not  set,  character  values  are\n       treated in the same way as in 8-bit, non UTF-8 mode, except, of course,\n       that they can range from 0 to 0xffff instead of 0  to  0xff.  Character\n       types  for characters less than 0xff can therefore be influenced by the\n       locale in the same way as before.  Characters greater  than  0xff  have\n       only one case, and no \"type\" (such as letter or digit).\n\n       In  UTF-16  mode,  the  character  code  is  Unicode, in the range 0 to\n       0x10ffff, with the exception of values in the range  0xd800  to  0xdfff\n       because  those  are \"surrogate\" values that are used in pairs to encode\n       values greater than 0xffff.\n\n       A UTF-16 string can indicate its endianness by special code knows as  a\n       byte-order mark (BOM). The PCRE functions do not handle this, expecting\n       strings  to  be  in  host  byte  order.  A  utility   function   called\n       pcre16_utf16_to_host_byte_order()  is  provided  to help with this (see\n       above).\n\n\nERROR NAMES\n\n       The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16  corre-\n       spond  to  their  8-bit  counterparts.  The error PCRE_ERROR_BADMODE is\n       given when a compiled pattern is passed to a  function  that  processes\n       patterns  in  the  other  mode, for example, if a pattern compiled with\n       pcre_compile() is passed to pcre16_exec().\n\n       There are new error codes whose names  begin  with  PCRE_UTF16_ERR  for\n       invalid  UTF-16  strings,  corresponding to the PCRE_UTF8_ERR codes for\n       UTF-8 strings that are described in the section entitled \"Reason  codes\n       for  invalid UTF-8 strings\" in the main pcreapi page. The UTF-16 errors\n       are:\n\n         PCRE_UTF16_ERR1  Missing low surrogate at end of string\n         PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate\n         PCRE_UTF16_ERR3  Isolated low surrogate\n         PCRE_UTF16_ERR4  Non-character\n\n\nERROR TEXTS\n\n       If there is an error while compiling a pattern, the error text that  is\n       passed  back by pcre16_compile() or pcre16_compile2() is still an 8-bit\n       character string, zero-terminated.\n\n\nCALLOUTS\n\n       The subject and mark fields in the callout block that is  passed  to  a\n       callout function point to 16-bit vectors.\n\n\nTESTING\n\n       The  pcretest  program continues to operate with 8-bit input and output\n       files, but it can be used for testing the 16-bit library. If it is  run\n       with the command line option -16, patterns and subject strings are con-\n       verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit\n       library  functions  are used instead of the 8-bit ones. Returned 16-bit\n       strings are converted to 8-bit for output. If both the  8-bit  and  the\n       32-bit libraries were not compiled, pcretest defaults to 16-bit and the\n       -16 option is ignored.\n\n       When PCRE is being built, the RunTest script that is  called  by  \"make\n       check\"  uses  the  pcretest  -C  option to discover which of the 8-bit,\n       16-bit and 32-bit libraries has been built, and runs the  tests  appro-\n       priately.\n\n\nNOT SUPPORTED IN 16-BIT MODE\n\n       Not all the features of the 8-bit library are available with the 16-bit\n       library. The C++ and POSIX wrapper functions  support  only  the  8-bit\n       library, and the pcregrep program is at present 8-bit only.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 May 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRE(3)                    Library Functions Manual                    PCRE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\n       #include <pcre.h>\n\n\nPCRE 32-BIT API BASIC FUNCTIONS\n\n       pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options,\n            int *errorcodeptr,\n            const unsigned char *tableptr);\n\n       pcre32_extra *pcre32_study(const pcre32 *code, int options,\n            const char **errptr);\n\n       void pcre32_free_study(pcre32_extra *extra);\n\n       int pcre32_exec(const pcre32 *code, const pcre32_extra *extra,\n            PCRE_SPTR32 subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize);\n\n       int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra,\n            PCRE_SPTR32 subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize,\n            int *workspace, int wscount);\n\n\nPCRE 32-BIT API STRING EXTRACTION FUNCTIONS\n\n       int pcre32_copy_named_substring(const pcre32 *code,\n            PCRE_SPTR32 subject, int *ovector,\n            int stringcount, PCRE_SPTR32 stringname,\n            PCRE_UCHAR32 *buffer, int buffersize);\n\n       int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector,\n            int stringcount, int stringnumber, PCRE_UCHAR32 *buffer,\n            int buffersize);\n\n       int pcre32_get_named_substring(const pcre32 *code,\n            PCRE_SPTR32 subject, int *ovector,\n            int stringcount, PCRE_SPTR32 stringname,\n            PCRE_SPTR32 *stringptr);\n\n       int pcre32_get_stringnumber(const pcre32 *code,\n            PCRE_SPTR32 name);\n\n       int pcre32_get_stringtable_entries(const pcre32 *code,\n            PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last);\n\n       int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector,\n            int stringcount, int stringnumber,\n            PCRE_SPTR32 *stringptr);\n\n       int pcre32_get_substring_list(PCRE_SPTR32 subject,\n            int *ovector, int stringcount, PCRE_SPTR32 **listptr);\n\n       void pcre32_free_substring(PCRE_SPTR32 stringptr);\n\n       void pcre32_free_substring_list(PCRE_SPTR32 *stringptr);\n\n\nPCRE 32-BIT API AUXILIARY FUNCTIONS\n\n       pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize);\n\n       void pcre32_jit_stack_free(pcre32_jit_stack *stack);\n\n       void pcre32_assign_jit_stack(pcre32_extra *extra,\n            pcre32_jit_callback callback, void *data);\n\n       const unsigned char *pcre32_maketables(void);\n\n       int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra,\n            int what, void *where);\n\n       int pcre32_refcount(pcre32 *code, int adjust);\n\n       int pcre32_config(int what, void *where);\n\n       const char *pcre32_version(void);\n\n       int pcre32_pattern_to_host_byte_order(pcre32 *code,\n            pcre32_extra *extra, const unsigned char *tables);\n\n\nPCRE 32-BIT API INDIRECTED FUNCTIONS\n\n       void *(*pcre32_malloc)(size_t);\n\n       void (*pcre32_free)(void *);\n\n       void *(*pcre32_stack_malloc)(size_t);\n\n       void (*pcre32_stack_free)(void *);\n\n       int (*pcre32_callout)(pcre32_callout_block *);\n\n\nPCRE 32-BIT API 32-BIT-ONLY FUNCTION\n\n       int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output,\n            PCRE_SPTR32 input, int length, int *byte_order,\n            int keep_boms);\n\n\nTHE PCRE 32-BIT LIBRARY\n\n       Starting  with  release  8.32, it is possible to compile a PCRE library\n       that supports 32-bit character strings, including  UTF-32  strings,  as\n       well as or instead of the original 8-bit library. This work was done by\n       Christian Persch, based on the work done  by  Zoltan  Herczeg  for  the\n       16-bit  library.  All  three  libraries contain identical sets of func-\n       tions, used in exactly the same way.  Only the names of  the  functions\n       and  the  data  types  of their arguments and results are different. To\n       avoid over-complication and reduce the documentation maintenance  load,\n       most  of  the PCRE documentation describes the 8-bit library, with only\n       occasional references to the 16-bit and  32-bit  libraries.  This  page\n       describes what is different when you use the 32-bit library.\n\n       WARNING:  A  single  application  can  be linked with all or any of the\n       three libraries, but you must take care when processing any  particular\n       pattern  to  use  functions  from just one library. For example, if you\n       want to study a pattern that was compiled  with  pcre32_compile(),  you\n       must do so with pcre32_study(), not pcre_study(), and you must free the\n       study data with pcre32_free_study().\n\n\nTHE HEADER FILE\n\n       There is only one header file, pcre.h. It contains prototypes  for  all\n       the functions in all libraries, as well as definitions of flags, struc-\n       tures, error codes, etc.\n\n\nTHE LIBRARY NAME\n\n       In Unix-like systems, the 32-bit library is called libpcre32,  and  can\n       normally  be  accesss  by adding -lpcre32 to the command for linking an\n       application that uses PCRE.\n\n\nSTRING TYPES\n\n       In the 8-bit library, strings are passed to PCRE library  functions  as\n       vectors  of  bytes  with  the  C  type \"char *\". In the 32-bit library,\n       strings are passed as vectors of unsigned 32-bit quantities. The  macro\n       PCRE_UCHAR32  specifies  an  appropriate  data type, and PCRE_SPTR32 is\n       defined as \"const PCRE_UCHAR32 *\". In very many environments, \"unsigned\n       int\" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32\n       as \"unsigned int\", but checks that it really is a 32-bit data type.  If\n       it is not, the build fails with an error message telling the maintainer\n       to modify the definition appropriately.\n\n\nSTRUCTURE TYPES\n\n       The types of the opaque structures that are used  for  compiled  32-bit\n       patterns  and  JIT stacks are pcre32 and pcre32_jit_stack respectively.\n       The  type  of  the  user-accessible  structure  that  is  returned   by\n       pcre32_study()  is  pcre32_extra, and the type of the structure that is\n       used for passing data to a callout  function  is  pcre32_callout_block.\n       These structures contain the same fields, with the same names, as their\n       8-bit counterparts. The only difference is that pointers  to  character\n       strings are 32-bit instead of 8-bit types.\n\n\n32-BIT FUNCTIONS\n\n       For  every function in the 8-bit library there is a corresponding func-\n       tion in the 32-bit library with a name that starts with pcre32_ instead\n       of  pcre_.  The  prototypes are listed above. In addition, there is one\n       extra function, pcre32_utf32_to_host_byte_order(). This  is  a  utility\n       function  that converts a UTF-32 character string to host byte order if\n       necessary. The other 32-bit  functions  expect  the  strings  they  are\n       passed to be in host byte order.\n\n       The input and output arguments of pcre32_utf32_to_host_byte_order() may\n       point to the same address, that is, conversion in place  is  supported.\n       The output buffer must be at least as long as the input.\n\n       The  length  argument  specifies the number of 32-bit data units in the\n       input string; a negative value specifies a zero-terminated string.\n\n       If byte_order is NULL, it is assumed that the string starts off in host\n       byte  order. This may be changed by byte-order marks (BOMs) anywhere in\n       the string (commonly as the first character).\n\n       If byte_order is not NULL, a non-zero value of the integer to which  it\n       points  means  that  the input starts off in host byte order, otherwise\n       the opposite order is assumed. Again, BOMs in  the  string  can  change\n       this. The final byte order is passed back at the end of processing.\n\n       If  keep_boms  is  not  zero,  byte-order  mark characters (0xfeff) are\n       copied into the output string. Otherwise they are discarded.\n\n       The result of the function is the number of 32-bit  units  placed  into\n       the  output  buffer,  including  the  zero terminator if the string was\n       zero-terminated.\n\n\nSUBJECT STRING OFFSETS\n\n       The lengths and starting offsets of subject strings must  be  specified\n       in  32-bit  data units, and the offsets within subject strings that are\n       returned by the matching functions are in also 32-bit units rather than\n       bytes.\n\n\nNAMED SUBPATTERNS\n\n       The  name-to-number translation table that is maintained for named sub-\n       patterns uses 32-bit characters.  The  pcre32_get_stringtable_entries()\n       function returns the length of each entry in the table as the number of\n       32-bit data units.\n\n\nOPTION NAMES\n\n       There   are   two   new   general   option   names,   PCRE_UTF32    and\n       PCRE_NO_UTF32_CHECK,     which     correspond    to    PCRE_UTF8    and\n       PCRE_NO_UTF8_CHECK in the 8-bit library. In  fact,  these  new  options\n       define  the  same bits in the options word. There is a discussion about\n       the validity of UTF-32 strings in the pcreunicode page.\n\n       For the pcre32_config() function there is an  option  PCRE_CONFIG_UTF32\n       that  returns  1  if UTF-32 support is configured, otherwise 0. If this\n       option  is  given  to  pcre_config()  or  pcre16_config(),  or  if  the\n       PCRE_CONFIG_UTF8  or  PCRE_CONFIG_UTF16  option is given to pcre32_con-\n       fig(), the result is the PCRE_ERROR_BADOPTION error.\n\n\nCHARACTER CODES\n\n       In 32-bit mode, when  PCRE_UTF32  is  not  set,  character  values  are\n       treated in the same way as in 8-bit, non UTF-8 mode, except, of course,\n       that they can range from 0 to 0x7fffffff instead of 0 to 0xff.  Charac-\n       ter  types for characters less than 0xff can therefore be influenced by\n       the locale in the same way as before.   Characters  greater  than  0xff\n       have only one case, and no \"type\" (such as letter or digit).\n\n       In  UTF-32  mode,  the  character  code  is  Unicode, in the range 0 to\n       0x10ffff, with the exception of values in the range  0xd800  to  0xdfff\n       because those are \"surrogate\" values that are ill-formed in UTF-32.\n\n       A  UTF-32 string can indicate its endianness by special code knows as a\n       byte-order mark (BOM). The PCRE functions do not handle this, expecting\n       strings   to   be  in  host  byte  order.  A  utility  function  called\n       pcre32_utf32_to_host_byte_order() is provided to help  with  this  (see\n       above).\n\n\nERROR NAMES\n\n       The  error  PCRE_ERROR_BADUTF32  corresponds  to its 8-bit counterpart.\n       The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed\n       to  a  function that processes patterns in the other mode, for example,\n       if a pattern compiled with pcre_compile() is passed to pcre32_exec().\n\n       There are new error codes whose names  begin  with  PCRE_UTF32_ERR  for\n       invalid  UTF-32  strings,  corresponding to the PCRE_UTF8_ERR codes for\n       UTF-8 strings that are described in the section entitled \"Reason  codes\n       for  invalid UTF-8 strings\" in the main pcreapi page. The UTF-32 errors\n       are:\n\n         PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)\n         PCRE_UTF32_ERR2  Non-character\n         PCRE_UTF32_ERR3  Character > 0x10ffff\n\n\nERROR TEXTS\n\n       If there is an error while compiling a pattern, the error text that  is\n       passed  back by pcre32_compile() or pcre32_compile2() is still an 8-bit\n       character string, zero-terminated.\n\n\nCALLOUTS\n\n       The subject and mark fields in the callout block that is  passed  to  a\n       callout function point to 32-bit vectors.\n\n\nTESTING\n\n       The  pcretest  program continues to operate with 8-bit input and output\n       files, but it can be used for testing the 32-bit library. If it is  run\n       with the command line option -32, patterns and subject strings are con-\n       verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit\n       library  functions  are used instead of the 8-bit ones. Returned 32-bit\n       strings are converted to 8-bit for output. If both the  8-bit  and  the\n       16-bit libraries were not compiled, pcretest defaults to 32-bit and the\n       -32 option is ignored.\n\n       When PCRE is being built, the RunTest script that is  called  by  \"make\n       check\"  uses  the  pcretest  -C  option to discover which of the 8-bit,\n       16-bit and 32-bit libraries has been built, and runs the  tests  appro-\n       priately.\n\n\nNOT SUPPORTED IN 32-BIT MODE\n\n       Not all the features of the 8-bit library are available with the 32-bit\n       library. The C++ and POSIX wrapper functions  support  only  the  8-bit\n       library, and the pcregrep program is at present 8-bit only.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 May 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREBUILD(3)               Library Functions Manual               PCREBUILD(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nBUILDING PCRE\n\n       PCRE  is  distributed with a configure script that can be used to build\n       the library in Unix-like environments using the applications  known  as\n       Autotools.   Also  in  the  distribution  are files to support building\n       using CMake instead of configure. The text file README contains general\n       information  about  building  with Autotools (some of which is repeated\n       below), and also has some comments about building on various  operating\n       systems.  There  is  a lot more information about building PCRE without\n       using Autotools (including information about using CMake  and  building\n       \"by  hand\")  in  the  text file called NON-AUTOTOOLS-BUILD.  You should\n       consult this file as well as the README file if you are building  in  a\n       non-Unix-like environment.\n\n\nPCRE BUILD-TIME OPTIONS\n\n       The  rest of this document describes the optional features of PCRE that\n       can be selected when the library is compiled. It  assumes  use  of  the\n       configure  script,  where  the  optional features are selected or dese-\n       lected by providing options to configure before running the  make  com-\n       mand.  However,  the same options can be selected in both Unix-like and\n       non-Unix-like environments using the GUI facility of cmake-gui  if  you\n       are using CMake instead of configure to build PCRE.\n\n       If  you  are not using Autotools or CMake, option selection can be done\n       by editing the config.h file, or by passing parameter settings  to  the\n       compiler, as described in NON-AUTOTOOLS-BUILD.\n\n       The complete list of options for configure (which includes the standard\n       ones such as the  selection  of  the  installation  directory)  can  be\n       obtained by running\n\n         ./configure --help\n\n       The  following  sections  include  descriptions  of options whose names\n       begin with --enable or --disable. These settings specify changes to the\n       defaults  for  the configure command. Because of the way that configure\n       works, --enable and --disable always come in pairs, so  the  complemen-\n       tary  option always exists as well, but as it specifies the default, it\n       is not described.\n\n\nBUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES\n\n       By default, a library called libpcre  is  built,  containing  functions\n       that  take  string  arguments  contained in vectors of bytes, either as\n       single-byte characters, or interpreted as UTF-8 strings. You  can  also\n       build  a  separate library, called libpcre16, in which strings are con-\n       tained in vectors of 16-bit data units and interpreted either  as  sin-\n       gle-unit characters or UTF-16 strings, by adding\n\n         --enable-pcre16\n\n       to  the  configure  command.  You  can  also build yet another separate\n       library, called libpcre32, in which strings are contained in vectors of\n       32-bit  data  units and interpreted either as single-unit characters or\n       UTF-32 strings, by adding\n\n         --enable-pcre32\n\n       to the configure command. If you do not want the 8-bit library, add\n\n         --disable-pcre8\n\n       as well. At least one of the three libraries must be built.  Note  that\n       the  C++  and  POSIX  wrappers are for the 8-bit library only, and that\n       pcregrep is an 8-bit program. None of these are  built  if  you  select\n       only the 16-bit or 32-bit libraries.\n\n\nBUILDING SHARED AND STATIC LIBRARIES\n\n       The  Autotools  PCRE building process uses libtool to build both shared\n       and static libraries by default. You  can  suppress  one  of  these  by\n       adding one of\n\n         --disable-shared\n         --disable-static\n\n       to the configure command, as required.\n\n\nC++ SUPPORT\n\n       By  default,  if the 8-bit library is being built, the configure script\n       will search for a C++ compiler and C++ header files. If it finds  them,\n       it  automatically  builds  the C++ wrapper library (which supports only\n       8-bit strings). You can disable this by adding\n\n         --disable-cpp\n\n       to the configure command.\n\n\nUTF-8, UTF-16 AND UTF-32 SUPPORT\n\n       To build PCRE with support for UTF Unicode character strings, add\n\n         --enable-utf\n\n       to the configure command. This setting applies to all three  libraries,\n       adding  support  for  UTF-8 to the 8-bit library, support for UTF-16 to\n       the 16-bit library, and  support  for  UTF-32  to  the  to  the  32-bit\n       library.  There  are no separate options for enabling UTF-8, UTF-16 and\n       UTF-32 independently because that would allow ridiculous settings  such\n       as  requesting UTF-16 support while building only the 8-bit library. It\n       is not possible to build one library with UTF support and another with-\n       out  in the same configuration. (For backwards compatibility, --enable-\n       utf8 is a synonym of --enable-utf.)\n\n       Of itself, this setting does not make  PCRE  treat  strings  as  UTF-8,\n       UTF-16  or UTF-32. As well as compiling PCRE with this option, you also\n       have have to set the PCRE_UTF8, PCRE_UTF16  or  PCRE_UTF32  option  (as\n       appropriate) when you call one of the pattern compiling functions.\n\n       If  you  set --enable-utf when compiling in an EBCDIC environment, PCRE\n       expects its input to be either ASCII or UTF-8 (depending  on  the  run-\n       time option). It is not possible to support both EBCDIC and UTF-8 codes\n       in the same version of  the  library.  Consequently,  --enable-utf  and\n       --enable-ebcdic are mutually exclusive.\n\n\nUNICODE CHARACTER PROPERTY SUPPORT\n\n       UTF  support allows the libraries to process character codepoints up to\n       0x10ffff in the strings that they handle. On its own, however, it  does\n       not provide any facilities for accessing the properties of such charac-\n       ters. If you want to be able to use the pattern escapes \\P, \\p, and \\X,\n       which refer to Unicode character properties, you must add\n\n         --enable-unicode-properties\n\n       to  the  configure  command. This implies UTF support, even if you have\n       not explicitly requested it.\n\n       Including Unicode property support adds around 30K  of  tables  to  the\n       PCRE  library.  Only  the general category properties such as Lu and Nd\n       are supported. Details are given in the pcrepattern documentation.\n\n\nJUST-IN-TIME COMPILER SUPPORT\n\n       Just-in-time compiler support is included in the build by specifying\n\n         --enable-jit\n\n       This support is available only for certain hardware  architectures.  If\n       this  option  is  set  for  an unsupported architecture, a compile time\n       error occurs.  See the pcrejit documentation for a  discussion  of  JIT\n       usage. When JIT support is enabled, pcregrep automatically makes use of\n       it, unless you add\n\n         --disable-pcregrep-jit\n\n       to the \"configure\" command.\n\n\nCODE VALUE OF NEWLINE\n\n       By default, PCRE interprets the linefeed (LF) character  as  indicating\n       the  end  of  a line. This is the normal newline character on Unix-like\n       systems. You can compile PCRE to use carriage return (CR)  instead,  by\n       adding\n\n         --enable-newline-is-cr\n\n       to  the  configure  command.  There  is  also  a --enable-newline-is-lf\n       option, which explicitly specifies linefeed as the newline character.\n\n       Alternatively, you can specify that line endings are to be indicated by\n       the two character sequence CRLF. If you want this, add\n\n         --enable-newline-is-crlf\n\n       to the configure command. There is a fourth option, specified by\n\n         --enable-newline-is-anycrlf\n\n       which  causes  PCRE  to recognize any of the three sequences CR, LF, or\n       CRLF as indicating a line ending. Finally, a fifth option, specified by\n\n         --enable-newline-is-any\n\n       causes PCRE to recognize any Unicode newline sequence.\n\n       Whatever line ending convention is selected when PCRE is built  can  be\n       overridden  when  the library functions are called. At build time it is\n       conventional to use the standard for your operating system.\n\n\nWHAT \\R MATCHES\n\n       By default, the sequence \\R in a pattern matches  any  Unicode  newline\n       sequence,  whatever  has  been selected as the line ending sequence. If\n       you specify\n\n         --enable-bsr-anycrlf\n\n       the default is changed so that \\R matches only CR, LF, or  CRLF.  What-\n       ever  is selected when PCRE is built can be overridden when the library\n       functions are called.\n\n\nPOSIX MALLOC USAGE\n\n       When the 8-bit library is called through the POSIX interface  (see  the\n       pcreposix  documentation),  additional  working storage is required for\n       holding the pointers to capturing  substrings,  because  PCRE  requires\n       three integers per substring, whereas the POSIX interface provides only\n       two. If the number of expected substrings is small, the  wrapper  func-\n       tion  uses  space  on the stack, because this is faster than using mal-\n       loc() for each call. The default threshold above which the stack is  no\n       longer used is 10; it can be changed by adding a setting such as\n\n         --with-posix-malloc-threshold=20\n\n       to the configure command.\n\n\nHANDLING VERY LARGE PATTERNS\n\n       Within  a  compiled  pattern,  offset values are used to point from one\n       part to another (for example, from an opening parenthesis to an  alter-\n       nation  metacharacter).  By default, in the 8-bit and 16-bit libraries,\n       two-byte values are used for these offsets, leading to a  maximum  size\n       for  a compiled pattern of around 64K. This is sufficient to handle all\n       but the most gigantic patterns.  Nevertheless, some people do  want  to\n       process  truly  enormous patterns, so it is possible to compile PCRE to\n       use three-byte or four-byte offsets by adding a setting such as\n\n         --with-link-size=3\n\n       to the configure command. The value given must be 2, 3, or 4.  For  the\n       16-bit  library,  a  value of 3 is rounded up to 4. In these libraries,\n       using longer offsets slows down the operation of PCRE because it has to\n       load  additional  data  when  handling them. For the 32-bit library the\n       value is always 4 and cannot be overridden; the value  of  --with-link-\n       size is ignored.\n\n\nAVOIDING EXCESSIVE STACK USAGE\n\n       When matching with the pcre_exec() function, PCRE implements backtrack-\n       ing by making recursive calls to an internal function  called  match().\n       In  environments  where  the size of the stack is limited, this can se-\n       verely limit PCRE's operation. (The Unix environment does  not  usually\n       suffer from this problem, but it may sometimes be necessary to increase\n       the maximum stack size.  There is a discussion in the  pcrestack  docu-\n       mentation.)  An alternative approach to recursion that uses memory from\n       the heap to remember data, instead of using recursive  function  calls,\n       has  been  implemented to work round the problem of limited stack size.\n       If you want to build a version of PCRE that works this way, add\n\n         --disable-stack-for-recursion\n\n       to the configure command. With this configuration, PCRE  will  use  the\n       pcre_stack_malloc  and pcre_stack_free variables to call memory manage-\n       ment functions. By default these point to malloc() and free(), but  you\n       can replace the pointers so that your own functions are used instead.\n\n       Separate  functions  are  provided  rather  than  using pcre_malloc and\n       pcre_free because the  usage  is  very  predictable:  the  block  sizes\n       requested  are  always  the  same,  and  the blocks are always freed in\n       reverse order. A calling program might be able to  implement  optimized\n       functions  that  perform  better  than  malloc()  and free(). PCRE runs\n       noticeably more slowly when built in this way. This option affects only\n       the pcre_exec() function; it is not relevant for pcre_dfa_exec().\n\n\nLIMITING PCRE RESOURCE USAGE\n\n       Internally,  PCRE has a function called match(), which it calls repeat-\n       edly  (sometimes  recursively)  when  matching  a  pattern   with   the\n       pcre_exec()  function.  By controlling the maximum number of times this\n       function may be called during a single matching operation, a limit  can\n       be  placed  on  the resources used by a single call to pcre_exec(). The\n       limit can be changed at run time, as described in the pcreapi  documen-\n       tation.  The default is 10 million, but this can be changed by adding a\n       setting such as\n\n         --with-match-limit=500000\n\n       to  the  configure  command.  This  setting  has  no  effect   on   the\n       pcre_dfa_exec() matching function.\n\n       In  some  environments  it is desirable to limit the depth of recursive\n       calls of match() more strictly than the total number of calls, in order\n       to  restrict  the maximum amount of stack (or heap, if --disable-stack-\n       for-recursion is specified) that is used. A second limit controls this;\n       it  defaults  to  the  value  that is set for --with-match-limit, which\n       imposes no additional constraints. However, you can set a  lower  limit\n       by adding, for example,\n\n         --with-match-limit-recursion=10000\n\n       to  the  configure  command.  This  value can also be overridden at run\n       time.\n\n\nCREATING CHARACTER TABLES AT BUILD TIME\n\n       PCRE uses fixed tables for processing characters whose code values  are\n       less  than 256. By default, PCRE is built with a set of tables that are\n       distributed in the file pcre_chartables.c.dist. These  tables  are  for\n       ASCII codes only. If you add\n\n         --enable-rebuild-chartables\n\n       to  the  configure  command, the distributed tables are no longer used.\n       Instead, a program called dftables is compiled and  run.  This  outputs\n       the source for new set of tables, created in the default locale of your\n       C run-time system. (This method of replacing the tables does  not  work\n       if  you are cross compiling, because dftables is run on the local host.\n       If you need to create alternative tables when cross compiling, you will\n       have to do so \"by hand\".)\n\n\nUSING EBCDIC CODE\n\n       PCRE  assumes  by  default that it will run in an environment where the\n       character code is ASCII (or Unicode, which is  a  superset  of  ASCII).\n       This  is  the  case for most computer operating systems. PCRE can, how-\n       ever, be compiled to run in an EBCDIC environment by adding\n\n         --enable-ebcdic\n\n       to the configure command. This setting implies --enable-rebuild-charta-\n       bles.  You  should  only  use  it if you know that you are in an EBCDIC\n       environment (for example,  an  IBM  mainframe  operating  system).  The\n       --enable-ebcdic option is incompatible with --enable-utf.\n\n       The EBCDIC character that corresponds to an ASCII LF is assumed to have\n       the value 0x15 by default. However, in some EBCDIC  environments,  0x25\n       is used. In such an environment you should use\n\n         --enable-ebcdic-nl25\n\n       as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR\n       has the same value as in ASCII, namely, 0x0d.  Whichever  of  0x15  and\n       0x25 is not chosen as LF is made to correspond to the Unicode NEL char-\n       acter (which, in Unicode, is 0x85).\n\n       The options that select newline behaviour, such as --enable-newline-is-\n       cr, and equivalent run-time options, refer to these character values in\n       an EBCDIC environment.\n\n\nPCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT\n\n       By default, pcregrep reads all files as plain text. You can build it so\n       that it recognizes files whose names end in .gz or .bz2, and reads them\n       with libz or libbz2, respectively, by adding one or both of\n\n         --enable-pcregrep-libz\n         --enable-pcregrep-libbz2\n\n       to the configure command. These options naturally require that the rel-\n       evant  libraries  are installed on your system. Configuration will fail\n       if they are not.\n\n\nPCREGREP BUFFER SIZE\n\n       pcregrep uses an internal buffer to hold a \"window\" on the file  it  is\n       scanning, in order to be able to output \"before\" and \"after\" lines when\n       it finds a match. The size of the buffer is controlled by  a  parameter\n       whose default value is 20K. The buffer itself is three times this size,\n       but because of the way it is used for holding \"before\" lines, the long-\n       est  line  that  is guaranteed to be processable is the parameter size.\n       You can change the default parameter value by adding, for example,\n\n         --with-pcregrep-bufsize=50K\n\n       to the configure command. The caller of pcregrep can, however, override\n       this value by specifying a run-time option.\n\n\nPCRETEST OPTION FOR LIBREADLINE SUPPORT\n\n       If you add\n\n         --enable-pcretest-libreadline\n\n       to  the  configure  command,  pcretest  is  linked with the libreadline\n       library, and when its input is from a terminal, it reads it  using  the\n       readline() function. This provides line-editing and history facilities.\n       Note that libreadline is GPL-licensed, so if you distribute a binary of\n       pcretest linked in this way, there may be licensing issues.\n\n       Setting  this  option  causes  the -lreadline option to be added to the\n       pcretest build. In many operating environments with  a  sytem-installed\n       libreadline this is sufficient. However, in some environments (e.g.  if\n       an unmodified distribution version of readline is in use),  some  extra\n       configuration  may  be necessary. The INSTALL file for libreadline says\n       this:\n\n         \"Readline uses the termcap functions, but does not link with the\n         termcap or curses library itself, allowing applications which link\n         with readline the to choose an appropriate library.\"\n\n       If your environment has not been set up so that an appropriate  library\n       is automatically included, you may need to add something like\n\n         LIBS=\"-ncurses\"\n\n       immediately before the configure command.\n\n\nDEBUGGING WITH VALGRIND SUPPORT\n\n       By adding the\n\n         --enable-valgrind\n\n       option  to to the configure command, PCRE will use valgrind annotations\n       to mark certain memory regions as  unaddressable.  This  allows  it  to\n       detect invalid memory accesses, and is mostly useful for debugging PCRE\n       itself.\n\n\nCODE COVERAGE REPORTING\n\n       If your C compiler is gcc, you can build a version  of  PCRE  that  can\n       generate a code coverage report for its test suite. To enable this, you\n       must install lcov version 1.6 or above. Then specify\n\n         --enable-coverage\n\n       to the configure command and build PCRE in the usual way.\n\n       Note that using ccache (a caching C compiler) is incompatible with code\n       coverage  reporting. If you have configured ccache to run automatically\n       on your system, you must set the environment variable\n\n         CCACHE_DISABLE=1\n\n       before running make to build PCRE, so that ccache is not used.\n\n       When --enable-coverage is used,  the  following  addition  targets  are\n       added to the Makefile:\n\n         make coverage\n\n       This  creates  a  fresh  coverage report for the PCRE test suite. It is\n       equivalent to running \"make coverage-reset\", \"make  coverage-baseline\",\n       \"make check\", and then \"make coverage-report\".\n\n         make coverage-reset\n\n       This zeroes the coverage counters, but does nothing else.\n\n         make coverage-baseline\n\n       This captures baseline coverage information.\n\n         make coverage-report\n\n       This creates the coverage report.\n\n         make coverage-clean-report\n\n       This  removes the generated coverage report without cleaning the cover-\n       age data itself.\n\n         make coverage-clean-data\n\n       This removes the captured coverage data without removing  the  coverage\n       files created at compile time (*.gcno).\n\n         make coverage-clean\n\n       This  cleans all coverage data including the generated coverage report.\n       For more information about code coverage, see the gcov and  lcov  docu-\n       mentation.\n\n\nSEE ALSO\n\n       pcreapi(3), pcre16, pcre32, pcre_config(3).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 May 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREMATCHING(3)            Library Functions Manual            PCREMATCHING(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE MATCHING ALGORITHMS\n\n       This document describes the two different algorithms that are available\n       in PCRE for matching a compiled regular expression against a given sub-\n       ject  string.  The  \"standard\"  algorithm  is  the  one provided by the\n       pcre_exec(), pcre16_exec() and pcre32_exec() functions. These  work  in\n       the  same as as Perl's matching function, and provide a Perl-compatible\n       matching  operation.   The  just-in-time  (JIT)  optimization  that  is\n       described  in  the pcrejit documentation is compatible with these func-\n       tions.\n\n       An  alternative  algorithm  is   provided   by   the   pcre_dfa_exec(),\n       pcre16_dfa_exec()  and  pcre32_dfa_exec()  functions; they operate in a\n       different way, and are not Perl-compatible. This alternative has advan-\n       tages and disadvantages compared with the standard algorithm, and these\n       are described below.\n\n       When there is only one possible way in which a given subject string can\n       match  a pattern, the two algorithms give the same answer. A difference\n       arises, however, when there are multiple possibilities. For example, if\n       the pattern\n\n         ^<.*>\n\n       is matched against the string\n\n         <something> <something else> <something further>\n\n       there are three possible answers. The standard algorithm finds only one\n       of them, whereas the alternative algorithm finds all three.\n\n\nREGULAR EXPRESSIONS AS TREES\n\n       The set of strings that are matched by a regular expression can be rep-\n       resented  as  a  tree structure. An unlimited repetition in the pattern\n       makes the tree of infinite size, but it is still a tree.  Matching  the\n       pattern  to a given subject string (from a given starting point) can be\n       thought of as a search of the tree.  There are two  ways  to  search  a\n       tree:  depth-first  and  breadth-first, and these correspond to the two\n       matching algorithms provided by PCRE.\n\n\nTHE STANDARD MATCHING ALGORITHM\n\n       In the terminology of Jeffrey Friedl's book \"Mastering Regular  Expres-\n       sions\",  the  standard  algorithm  is an \"NFA algorithm\". It conducts a\n       depth-first search of the pattern tree. That is, it  proceeds  along  a\n       single path through the tree, checking that the subject matches what is\n       required. When there is a mismatch, the algorithm  tries  any  alterna-\n       tives  at  the  current point, and if they all fail, it backs up to the\n       previous branch point in the  tree,  and  tries  the  next  alternative\n       branch  at  that  level.  This often involves backing up (moving to the\n       left) in the subject string as well.  The  order  in  which  repetition\n       branches  are  tried  is controlled by the greedy or ungreedy nature of\n       the quantifier.\n\n       If a leaf node is reached, a matching string has  been  found,  and  at\n       that  point the algorithm stops. Thus, if there is more than one possi-\n       ble match, this algorithm returns the first one that it finds.  Whether\n       this  is the shortest, the longest, or some intermediate length depends\n       on the way the greedy and ungreedy repetition quantifiers are specified\n       in the pattern.\n\n       Because  it  ends  up  with a single path through the tree, it is rela-\n       tively straightforward for this algorithm to keep  track  of  the  sub-\n       strings  that  are  matched  by portions of the pattern in parentheses.\n       This provides support for capturing parentheses and back references.\n\n\nTHE ALTERNATIVE MATCHING ALGORITHM\n\n       This algorithm conducts a breadth-first search of  the  tree.  Starting\n       from  the  first  matching  point  in the subject, it scans the subject\n       string from left to right, once, character by character, and as it does\n       this,  it remembers all the paths through the tree that represent valid\n       matches. In Friedl's terminology, this is a kind  of  \"DFA  algorithm\",\n       though  it is not implemented as a traditional finite state machine (it\n       keeps multiple states active simultaneously).\n\n       Although the general principle of this matching algorithm  is  that  it\n       scans  the subject string only once, without backtracking, there is one\n       exception: when a lookaround assertion is encountered,  the  characters\n       following  or  preceding  the  current  point  have to be independently\n       inspected.\n\n       The scan continues until either the end of the subject is  reached,  or\n       there  are  no more unterminated paths. At this point, terminated paths\n       represent the different matching possibilities (if there are none,  the\n       match  has  failed).   Thus,  if there is more than one possible match,\n       this algorithm finds all of them, and in particular, it finds the long-\n       est.  The  matches are returned in decreasing order of length. There is\n       an option to stop the algorithm after the first match (which is  neces-\n       sarily the shortest) is found.\n\n       Note that all the matches that are found start at the same point in the\n       subject. If the pattern\n\n         cat(er(pillar)?)?\n\n       is matched against the string \"the caterpillar catchment\",  the  result\n       will  be the three strings \"caterpillar\", \"cater\", and \"cat\" that start\n       at the fifth character of the subject. The algorithm does not automati-\n       cally move on to find matches that start at later positions.\n\n       PCRE's  \"auto-possessification\" optimization usually applies to charac-\n       ter repeats at the end of a pattern (as well as internally). For  exam-\n       ple, the pattern \"a\\d+\" is compiled as if it were \"a\\d++\" because there\n       is no point even considering the possibility of backtracking  into  the\n       repeated  digits.  For  DFA matching, this means that only one possible\n       match is found. If you really do want multiple matches in  such  cases,\n       either use an ungreedy repeat (\"a\\d+?\") or set the PCRE_NO_AUTO_POSSESS\n       option when compiling.\n\n       There are a number of features of PCRE regular expressions that are not\n       supported by the alternative matching algorithm. They are as follows:\n\n       1.  Because  the  algorithm  finds  all possible matches, the greedy or\n       ungreedy nature of repetition quantifiers is not relevant.  Greedy  and\n       ungreedy quantifiers are treated in exactly the same way. However, pos-\n       sessive quantifiers can make a difference when what follows could  also\n       match what is quantified, for example in a pattern like this:\n\n         ^a++\\w!\n\n       This  pattern matches \"aaab!\" but not \"aaa!\", which would be matched by\n       a non-possessive quantifier. Similarly, if an atomic group is  present,\n       it  is matched as if it were a standalone pattern at the current point,\n       and the longest match is then \"locked in\" for the rest of  the  overall\n       pattern.\n\n       2. When dealing with multiple paths through the tree simultaneously, it\n       is not straightforward to keep track of  captured  substrings  for  the\n       different  matching  possibilities,  and  PCRE's implementation of this\n       algorithm does not attempt to do this. This means that no captured sub-\n       strings are available.\n\n       3.  Because no substrings are captured, back references within the pat-\n       tern are not supported, and cause errors if encountered.\n\n       4. For the same reason, conditional expressions that use  a  backrefer-\n       ence  as  the  condition or test for a specific group recursion are not\n       supported.\n\n       5. Because many paths through the tree may be  active,  the  \\K  escape\n       sequence, which resets the start of the match when encountered (but may\n       be on some paths and not on others), is not  supported.  It  causes  an\n       error if encountered.\n\n       6.  Callouts  are  supported, but the value of the capture_top field is\n       always 1, and the value of the capture_last field is always -1.\n\n       7. The \\C escape sequence, which (in  the  standard  algorithm)  always\n       matches  a  single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is\n       not supported in these modes, because the alternative  algorithm  moves\n       through the subject string one character (not data unit) at a time, for\n       all active paths through the tree.\n\n       8. Except for (*FAIL), the backtracking control verbs such as  (*PRUNE)\n       are  not  supported.  (*FAIL)  is supported, and behaves like a failing\n       negative assertion.\n\n\nADVANTAGES OF THE ALTERNATIVE ALGORITHM\n\n       Using the alternative matching algorithm provides the following  advan-\n       tages:\n\n       1. All possible matches (at a single point in the subject) are automat-\n       ically found, and in particular, the longest match is  found.  To  find\n       more than one match using the standard algorithm, you have to do kludgy\n       things with callouts.\n\n       2. Because the alternative algorithm  scans  the  subject  string  just\n       once, and never needs to backtrack (except for lookbehinds), it is pos-\n       sible to pass very long subject strings to  the  matching  function  in\n       several pieces, checking for partial matching each time. Although it is\n       possible to do multi-segment matching using the standard  algorithm  by\n       retaining  partially  matched  substrings,  it is more complicated. The\n       pcrepartial documentation gives details of partial  matching  and  dis-\n       cusses multi-segment matching.\n\n\nDISADVANTAGES OF THE ALTERNATIVE ALGORITHM\n\n       The alternative algorithm suffers from a number of disadvantages:\n\n       1.  It  is  substantially  slower  than the standard algorithm. This is\n       partly because it has to search for all possible matches, but  is  also\n       because it is less susceptible to optimization.\n\n       2. Capturing parentheses and back references are not supported.\n\n       3. Although atomic groups are supported, their use does not provide the\n       performance advantage that it does for the standard algorithm.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 November 2013\n       Copyright (c) 1997-2012 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREAPI(3)                 Library Functions Manual                 PCREAPI(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\n       #include <pcre.h>\n\n\nPCRE NATIVE API BASIC FUNCTIONS\n\n       pcre *pcre_compile(const char *pattern, int options,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre *pcre_compile2(const char *pattern, int options,\n            int *errorcodeptr,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre_extra *pcre_study(const pcre *code, int options,\n            const char **errptr);\n\n       void pcre_free_study(pcre_extra *extra);\n\n       int pcre_exec(const pcre *code, const pcre_extra *extra,\n            const char *subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize);\n\n       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,\n            const char *subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize,\n            int *workspace, int wscount);\n\n\nPCRE NATIVE API STRING EXTRACTION FUNCTIONS\n\n       int pcre_copy_named_substring(const pcre *code,\n            const char *subject, int *ovector,\n            int stringcount, const char *stringname,\n            char *buffer, int buffersize);\n\n       int pcre_copy_substring(const char *subject, int *ovector,\n            int stringcount, int stringnumber, char *buffer,\n            int buffersize);\n\n       int pcre_get_named_substring(const pcre *code,\n            const char *subject, int *ovector,\n            int stringcount, const char *stringname,\n            const char **stringptr);\n\n       int pcre_get_stringnumber(const pcre *code,\n            const char *name);\n\n       int pcre_get_stringtable_entries(const pcre *code,\n            const char *name, char **first, char **last);\n\n       int pcre_get_substring(const char *subject, int *ovector,\n            int stringcount, int stringnumber,\n            const char **stringptr);\n\n       int pcre_get_substring_list(const char *subject,\n            int *ovector, int stringcount, const char ***listptr);\n\n       void pcre_free_substring(const char *stringptr);\n\n       void pcre_free_substring_list(const char **stringptr);\n\n\nPCRE NATIVE API AUXILIARY FUNCTIONS\n\n       int pcre_jit_exec(const pcre *code, const pcre_extra *extra,\n            const char *subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize,\n            pcre_jit_stack *jstack);\n\n       pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize);\n\n       void pcre_jit_stack_free(pcre_jit_stack *stack);\n\n       void pcre_assign_jit_stack(pcre_extra *extra,\n            pcre_jit_callback callback, void *data);\n\n       const unsigned char *pcre_maketables(void);\n\n       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,\n            int what, void *where);\n\n       int pcre_refcount(pcre *code, int adjust);\n\n       int pcre_config(int what, void *where);\n\n       const char *pcre_version(void);\n\n       int pcre_pattern_to_host_byte_order(pcre *code,\n            pcre_extra *extra, const unsigned char *tables);\n\n\nPCRE NATIVE API INDIRECTED FUNCTIONS\n\n       void *(*pcre_malloc)(size_t);\n\n       void (*pcre_free)(void *);\n\n       void *(*pcre_stack_malloc)(size_t);\n\n       void (*pcre_stack_free)(void *);\n\n       int (*pcre_callout)(pcre_callout_block *);\n\n       int (*pcre_stack_guard)(void);\n\n\nPCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES\n\n       As  well  as  support  for  8-bit character strings, PCRE also supports\n       16-bit strings (from release 8.30) and  32-bit  strings  (from  release\n       8.32),  by means of two additional libraries. They can be built as well\n       as, or instead of, the 8-bit library. To avoid too  much  complication,\n       this  document describes the 8-bit versions of the functions, with only\n       occasional references to the 16-bit and 32-bit libraries.\n\n       The 16-bit and 32-bit functions operate in the same way as their  8-bit\n       counterparts;  they  just  use different data types for their arguments\n       and results, and their names start with pcre16_ or pcre32_  instead  of\n       pcre_.  For  every  option  that  has  UTF8  in  its name (for example,\n       PCRE_UTF8), there are corresponding 16-bit and 32-bit names  with  UTF8\n       replaced by UTF16 or UTF32, respectively. This facility is in fact just\n       cosmetic; the 16-bit and 32-bit option names define the same  bit  val-\n       ues.\n\n       References to bytes and UTF-8 in this document should be read as refer-\n       ences to 16-bit data units and UTF-16 when using the 16-bit library, or\n       32-bit  data  units  and  UTF-32  when using the 32-bit library, unless\n       specified otherwise.  More details of the specific differences for  the\n       16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages.\n\n\nPCRE API OVERVIEW\n\n       PCRE has its own native API, which is described in this document. There\n       are also some wrapper functions (for the 8-bit library only) that  cor-\n       respond  to  the  POSIX  regular  expression  API, but they do not give\n       access to all the functionality. They are described  in  the  pcreposix\n       documentation.  Both  of these APIs define a set of C function calls. A\n       C++ wrapper (again for the 8-bit library only) is also distributed with\n       PCRE. It is documented in the pcrecpp page.\n\n       The  native  API  C  function prototypes are defined in the header file\n       pcre.h, and on Unix-like systems the (8-bit) library itself  is  called\n       libpcre.  It  can  normally be accessed by adding -lpcre to the command\n       for linking an application that uses PCRE. The header file defines  the\n       macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release\n       numbers for the library. Applications can use these to include  support\n       for different releases of PCRE.\n\n       In a Windows environment, if you want to statically link an application\n       program against a non-dll pcre.a  file,  you  must  define  PCRE_STATIC\n       before  including  pcre.h or pcrecpp.h, because otherwise the pcre_mal-\n       loc()   and   pcre_free()   exported   functions   will   be   declared\n       __declspec(dllimport), with unwanted results.\n\n       The   functions   pcre_compile(),  pcre_compile2(),  pcre_study(),  and\n       pcre_exec() are used for compiling and matching regular expressions  in\n       a  Perl-compatible  manner. A sample program that demonstrates the sim-\n       plest way of using them is provided in the file  called  pcredemo.c  in\n       the PCRE source distribution. A listing of this program is given in the\n       pcredemo documentation, and the pcresample documentation describes  how\n       to compile and run it.\n\n       Just-in-time  compiler  support is an optional feature of PCRE that can\n       be built in appropriate hardware environments. It greatly speeds up the\n       matching  performance  of  many  patterns.  Simple  programs can easily\n       request that it be used if available, by  setting  an  option  that  is\n       ignored  when  it is not relevant. More complicated programs might need\n       to    make    use    of    the    functions     pcre_jit_stack_alloc(),\n       pcre_jit_stack_free(),  and pcre_assign_jit_stack() in order to control\n       the JIT code's memory usage.\n\n       From release 8.32 there is also a direct interface for  JIT  execution,\n       which  gives  improved performance. The JIT-specific functions are dis-\n       cussed in the pcrejit documentation.\n\n       A second matching function, pcre_dfa_exec(), which is not Perl-compati-\n       ble,  is  also provided. This uses a different algorithm for the match-\n       ing. The alternative algorithm finds all possible matches (at  a  given\n       point  in  the  subject), and scans the subject just once (unless there\n       are lookbehind assertions). However, this  algorithm  does  not  return\n       captured  substrings.  A description of the two matching algorithms and\n       their advantages and disadvantages is given in the  pcrematching  docu-\n       mentation.\n\n       In  addition  to  the  main compiling and matching functions, there are\n       convenience functions for extracting captured substrings from a subject\n       string that is matched by pcre_exec(). They are:\n\n         pcre_copy_substring()\n         pcre_copy_named_substring()\n         pcre_get_substring()\n         pcre_get_named_substring()\n         pcre_get_substring_list()\n         pcre_get_stringnumber()\n         pcre_get_stringtable_entries()\n\n       pcre_free_substring() and pcre_free_substring_list() are also provided,\n       to free the memory used for extracted strings.\n\n       The function pcre_maketables() is used to  build  a  set  of  character\n       tables   in   the   current   locale  for  passing  to  pcre_compile(),\n       pcre_exec(), or pcre_dfa_exec(). This is an optional facility  that  is\n       provided  for  specialist  use.  Most  commonly,  no special tables are\n       passed, in which case internal tables that are generated when  PCRE  is\n       built are used.\n\n       The  function  pcre_fullinfo()  is used to find out information about a\n       compiled pattern. The function pcre_version() returns a  pointer  to  a\n       string containing the version of PCRE and its date of release.\n\n       The  function  pcre_refcount()  maintains  a  reference count in a data\n       block containing a compiled pattern. This is provided for  the  benefit\n       of object-oriented applications.\n\n       The  global  variables  pcre_malloc and pcre_free initially contain the\n       entry points of the standard malloc()  and  free()  functions,  respec-\n       tively. PCRE calls the memory management functions via these variables,\n       so a calling program can replace them if it  wishes  to  intercept  the\n       calls. This should be done before calling any PCRE functions.\n\n       The  global  variables  pcre_stack_malloc  and pcre_stack_free are also\n       indirections to memory management functions.  These  special  functions\n       are  used  only  when  PCRE is compiled to use the heap for remembering\n       data, instead of recursive function calls, when running the pcre_exec()\n       function.  See  the  pcrebuild  documentation  for details of how to do\n       this. It is a non-standard way of building PCRE, for  use  in  environ-\n       ments  that  have  limited stacks. Because of the greater use of memory\n       management, it runs more slowly. Separate  functions  are  provided  so\n       that  special-purpose  external  code  can  be used for this case. When\n       used, these functions always allocate memory blocks of the  same  size.\n       There  is  a discussion about PCRE's stack usage in the pcrestack docu-\n       mentation.\n\n       The global variable pcre_callout initially contains NULL. It can be set\n       by  the  caller  to  a \"callout\" function, which PCRE will then call at\n       specified points during a matching operation. Details are given in  the\n       pcrecallout documentation.\n\n       The global variable pcre_stack_guard initially contains NULL. It can be\n       set by the caller to a function that is  called  by  PCRE  whenever  it\n       starts  to  compile a parenthesized part of a pattern. When parentheses\n       are nested, PCRE uses recursive function calls, which use up the system\n       stack.  This  function is provided so that applications with restricted\n       stacks can force a compilation error if the stack runs out.  The  func-\n       tion should return zero if all is well, or non-zero to force an error.\n\n\nNEWLINES\n\n       PCRE  supports five different conventions for indicating line breaks in\n       strings: a single CR (carriage return) character, a  single  LF  (line-\n       feed) character, the two-character sequence CRLF, any of the three pre-\n       ceding, or any Unicode newline sequence. The Unicode newline  sequences\n       are  the  three just mentioned, plus the single characters VT (vertical\n       tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line\n       separator, U+2028), and PS (paragraph separator, U+2029).\n\n       Each  of  the first three conventions is used by at least one operating\n       system as its standard newline sequence. When PCRE is built, a  default\n       can  be  specified.  The default default is LF, which is the Unix stan-\n       dard. When PCRE is run, the default can be overridden,  either  when  a\n       pattern is compiled, or when it is matched.\n\n       At compile time, the newline convention can be specified by the options\n       argument of pcre_compile(), or it can be specified by special  text  at\n       the start of the pattern itself; this overrides any other settings. See\n       the pcrepattern page for details of the special character sequences.\n\n       In the PCRE documentation the word \"newline\" is used to mean \"the char-\n       acter  or pair of characters that indicate a line break\". The choice of\n       newline convention affects the handling of  the  dot,  circumflex,  and\n       dollar metacharacters, the handling of #-comments in /x mode, and, when\n       CRLF is a recognized line ending sequence, the match position  advance-\n       ment for a non-anchored pattern. There is more detail about this in the\n       section on pcre_exec() options below.\n\n       The choice of newline convention does not affect the interpretation  of\n       the  \\n  or  \\r  escape  sequences, nor does it affect what \\R matches,\n       which is controlled in a similar way, but by separate options.\n\n\nMULTITHREADING\n\n       The PCRE functions can be used in  multi-threading  applications,  with\n       the  proviso  that  the  memory  management  functions  pointed  to  by\n       pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the\n       callout  and  stack-checking  functions  pointed to by pcre_callout and\n       pcre_stack_guard, are shared by all threads.\n\n       The compiled form of a regular expression is not altered during  match-\n       ing, so the same compiled pattern can safely be used by several threads\n       at once.\n\n       If the just-in-time optimization feature is being used, it needs  sepa-\n       rate  memory stack areas for each thread. See the pcrejit documentation\n       for more details.\n\n\nSAVING PRECOMPILED PATTERNS FOR LATER USE\n\n       The compiled form of a regular expression can be saved and re-used at a\n       later  time,  possibly by a different program, and even on a host other\n       than the one on which  it  was  compiled.  Details  are  given  in  the\n       pcreprecompile  documentation,  which  includes  a  description  of the\n       pcre_pattern_to_host_byte_order() function. However, compiling a  regu-\n       lar  expression  with one version of PCRE for use with a different ver-\n       sion is not guaranteed to work and may cause crashes.\n\n\nCHECKING BUILD-TIME OPTIONS\n\n       int pcre_config(int what, void *where);\n\n       The function pcre_config() makes it possible for a PCRE client to  dis-\n       cover which optional features have been compiled into the PCRE library.\n       The pcrebuild documentation has more details about these optional  fea-\n       tures.\n\n       The  first  argument  for pcre_config() is an integer, specifying which\n       information is required; the second argument is a pointer to a variable\n       into  which  the  information  is placed. The returned value is zero on\n       success, or the negative error code PCRE_ERROR_BADOPTION if  the  value\n       in  the  first argument is not recognized. The following information is\n       available:\n\n         PCRE_CONFIG_UTF8\n\n       The output is an integer that is set to one if UTF-8 support is  avail-\n       able;  otherwise it is set to zero. This value should normally be given\n       to the 8-bit version of this function, pcre_config(). If it is given to\n       the   16-bit  or  32-bit  version  of  this  function,  the  result  is\n       PCRE_ERROR_BADOPTION.\n\n         PCRE_CONFIG_UTF16\n\n       The output is an integer that is set to one if UTF-16 support is avail-\n       able;  otherwise it is set to zero. This value should normally be given\n       to the 16-bit version of this function, pcre16_config(). If it is given\n       to  the  8-bit  or  32-bit  version  of  this  function,  the result is\n       PCRE_ERROR_BADOPTION.\n\n         PCRE_CONFIG_UTF32\n\n       The output is an integer that is set to one if UTF-32 support is avail-\n       able;  otherwise it is set to zero. This value should normally be given\n       to the 32-bit version of this function, pcre32_config(). If it is given\n       to  the  8-bit  or  16-bit  version  of  this  function,  the result is\n       PCRE_ERROR_BADOPTION.\n\n         PCRE_CONFIG_UNICODE_PROPERTIES\n\n       The output is an integer that is set to  one  if  support  for  Unicode\n       character properties is available; otherwise it is set to zero.\n\n         PCRE_CONFIG_JIT\n\n       The output is an integer that is set to one if support for just-in-time\n       compiling is available; otherwise it is set to zero.\n\n         PCRE_CONFIG_JITTARGET\n\n       The output is a pointer to a zero-terminated \"const char *\" string.  If\n       JIT support is available, the string contains the name of the architec-\n       ture for which the JIT compiler is configured, for example  \"x86  32bit\n       (little  endian  +  unaligned)\".  If  JIT support is not available, the\n       result is NULL.\n\n         PCRE_CONFIG_NEWLINE\n\n       The output is an integer whose value specifies  the  default  character\n       sequence  that  is recognized as meaning \"newline\". The values that are\n       supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338\n       for  CRLF,  -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR,\n       ANYCRLF, and ANY yield the same values. However, the value  for  LF  is\n       normally  21, though some EBCDIC environments use 37. The corresponding\n       values for CRLF are 3349 and 3365. The default should  normally  corre-\n       spond to the standard sequence for your operating system.\n\n         PCRE_CONFIG_BSR\n\n       The output is an integer whose value indicates what character sequences\n       the \\R escape sequence matches by default. A value of 0 means  that  \\R\n       matches  any  Unicode  line ending sequence; a value of 1 means that \\R\n       matches only CR, LF, or CRLF. The default can be overridden when a pat-\n       tern is compiled or matched.\n\n         PCRE_CONFIG_LINK_SIZE\n\n       The  output  is  an  integer that contains the number of bytes used for\n       internal  linkage  in  compiled  regular  expressions.  For  the  8-bit\n       library, the value can be 2, 3, or 4. For the 16-bit library, the value\n       is either 2 or 4 and is  still  a  number  of  bytes.  For  the  32-bit\n       library, the value is either 2 or 4 and is still a number of bytes. The\n       default value of 2 is sufficient for all but the most massive patterns,\n       since  it  allows  the compiled pattern to be up to 64K in size. Larger\n       values allow larger regular expressions to be compiled, at the  expense\n       of slower matching.\n\n         PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n\n       The  output  is  an integer that contains the threshold above which the\n       POSIX interface uses malloc() for output vectors. Further  details  are\n       given in the pcreposix documentation.\n\n         PCRE_CONFIG_PARENS_LIMIT\n\n       The output is a long integer that gives the maximum depth of nesting of\n       parentheses (of any kind) in a pattern. This limit is  imposed  to  cap\n       the amount of system stack used when a pattern is compiled. It is spec-\n       ified when PCRE is built; the default is 250. This limit does not  take\n       into account the stack that may already be used by the calling applica-\n       tion. For finer control over compilation stack usage,  you  can  set  a\n       pointer to an external checking function in pcre_stack_guard.\n\n         PCRE_CONFIG_MATCH_LIMIT\n\n       The  output is a long integer that gives the default limit for the num-\n       ber of internal matching function calls  in  a  pcre_exec()  execution.\n       Further details are given with pcre_exec() below.\n\n         PCRE_CONFIG_MATCH_LIMIT_RECURSION\n\n       The output is a long integer that gives the default limit for the depth\n       of  recursion  when  calling  the  internal  matching  function  in   a\n       pcre_exec()  execution.  Further  details  are  given  with pcre_exec()\n       below.\n\n         PCRE_CONFIG_STACKRECURSE\n\n       The output is an integer that is set to one if internal recursion  when\n       running pcre_exec() is implemented by recursive function calls that use\n       the stack to remember their state. This is the usual way that  PCRE  is\n       compiled. The output is zero if PCRE was compiled to use blocks of data\n       on the  heap  instead  of  recursive  function  calls.  In  this  case,\n       pcre_stack_malloc  and  pcre_stack_free  are  called  to  manage memory\n       blocks on the heap, thus avoiding the use of the stack.\n\n\nCOMPILING A PATTERN\n\n       pcre *pcre_compile(const char *pattern, int options,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       pcre *pcre_compile2(const char *pattern, int options,\n            int *errorcodeptr,\n            const char **errptr, int *erroffset,\n            const unsigned char *tableptr);\n\n       Either of the functions pcre_compile() or pcre_compile2() can be called\n       to compile a pattern into an internal form. The only difference between\n       the two interfaces is that pcre_compile2() has an additional  argument,\n       errorcodeptr,  via  which  a  numerical  error code can be returned. To\n       avoid too much repetition, we refer just to pcre_compile()  below,  but\n       the information applies equally to pcre_compile2().\n\n       The pattern is a C string terminated by a binary zero, and is passed in\n       the pattern argument. A pointer to a single block  of  memory  that  is\n       obtained  via  pcre_malloc is returned. This contains the compiled code\n       and related data. The pcre type is defined for the returned block; this\n       is a typedef for a structure whose contents are not externally defined.\n       It is up to the caller to free the memory (via pcre_free) when it is no\n       longer required.\n\n       Although  the compiled code of a PCRE regex is relocatable, that is, it\n       does not depend on memory location, the complete pcre data block is not\n       fully  relocatable, because it may contain a copy of the tableptr argu-\n       ment, which is an address (see below).\n\n       The options argument contains various bit settings that affect the com-\n       pilation.  It  should be zero if no options are required. The available\n       options are described below. Some of them (in  particular,  those  that\n       are  compatible with Perl, but some others as well) can also be set and\n       unset from within the pattern (see  the  detailed  description  in  the\n       pcrepattern  documentation). For those options that can be different in\n       different parts of the pattern, the contents of  the  options  argument\n       specifies their settings at the start of compilation and execution. The\n       PCRE_ANCHORED, PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK,  and\n       PCRE_NO_START_OPTIMIZE  options  can  be set at the time of matching as\n       well as at compile time.\n\n       If errptr is NULL, pcre_compile() returns NULL immediately.  Otherwise,\n       if  compilation  of  a  pattern fails, pcre_compile() returns NULL, and\n       sets the variable pointed to by errptr to point to a textual error mes-\n       sage. This is a static string that is part of the library. You must not\n       try to free it. Normally, the offset from the start of the  pattern  to\n       the data unit that was being processed when the error was discovered is\n       placed in the variable pointed to by erroffset, which must not be  NULL\n       (if  it is, an immediate error is given). However, for an invalid UTF-8\n       or UTF-16 string, the offset is that of the  first  data  unit  of  the\n       failing character.\n\n       Some  errors are not detected until the whole pattern has been scanned;\n       in these cases, the offset passed back is the length  of  the  pattern.\n       Note  that  the  offset is in data units, not characters, even in a UTF\n       mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char-\n       acter.\n\n       If  pcre_compile2()  is  used instead of pcre_compile(), and the error-\n       codeptr argument is not NULL, a non-zero error code number is  returned\n       via  this argument in the event of an error. This is in addition to the\n       textual error message. Error codes and messages are listed below.\n\n       If the final argument, tableptr, is NULL, PCRE uses a  default  set  of\n       character  tables  that  are  built  when  PCRE  is compiled, using the\n       default C locale. Otherwise, tableptr must be an address  that  is  the\n       result  of  a  call to pcre_maketables(). This value is stored with the\n       compiled pattern, and used again  by  pcre_exec()  and  pcre_dfa_exec()\n       when  the  pattern  is matched. For more discussion, see the section on\n       locale support below.\n\n       This code fragment shows a typical straightforward  call  to  pcre_com-\n       pile():\n\n         pcre *re;\n         const char *error;\n         int erroffset;\n         re = pcre_compile(\n           \"^A.*Z\",          /* the pattern */\n           0,                /* default options */\n           &error,           /* for error message */\n           &erroffset,       /* for error offset */\n           NULL);            /* use default character tables */\n\n       The  following  names  for option bits are defined in the pcre.h header\n       file:\n\n         PCRE_ANCHORED\n\n       If this bit is set, the pattern is forced to be \"anchored\", that is, it\n       is  constrained to match only at the first matching point in the string\n       that is being searched (the \"subject string\"). This effect can also  be\n       achieved  by appropriate constructs in the pattern itself, which is the\n       only way to do it in Perl.\n\n         PCRE_AUTO_CALLOUT\n\n       If this bit is set, pcre_compile() automatically inserts callout items,\n       all  with  number  255, before each pattern item. For discussion of the\n       callout facility, see the pcrecallout documentation.\n\n         PCRE_BSR_ANYCRLF\n         PCRE_BSR_UNICODE\n\n       These options (which are mutually exclusive) control what the \\R escape\n       sequence  matches.  The choice is either to match only CR, LF, or CRLF,\n       or to match any Unicode newline sequence. The default is specified when\n       PCRE is built. It can be overridden from within the pattern, or by set-\n       ting an option when a compiled pattern is matched.\n\n         PCRE_CASELESS\n\n       If this bit is set, letters in the pattern match both upper  and  lower\n       case  letters.  It  is  equivalent  to  Perl's /i option, and it can be\n       changed within a pattern by a (?i) option setting. In UTF-8 mode,  PCRE\n       always  understands the concept of case for characters whose values are\n       less than 128, so caseless matching is always possible. For  characters\n       with  higher  values,  the concept of case is supported if PCRE is com-\n       piled with Unicode property support, but not otherwise. If you want  to\n       use  caseless  matching  for  characters 128 and above, you must ensure\n       that PCRE is compiled with Unicode property support  as  well  as  with\n       UTF-8 support.\n\n         PCRE_DOLLAR_ENDONLY\n\n       If  this bit is set, a dollar metacharacter in the pattern matches only\n       at the end of the subject string. Without this option,  a  dollar  also\n       matches  immediately before a newline at the end of the string (but not\n       before any other newlines). The PCRE_DOLLAR_ENDONLY option  is  ignored\n       if  PCRE_MULTILINE  is  set.   There is no equivalent to this option in\n       Perl, and no way to set it within a pattern.\n\n         PCRE_DOTALL\n\n       If this bit is set, a dot metacharacter in the pattern matches a  char-\n       acter of any value, including one that indicates a newline. However, it\n       only ever matches one character, even if newlines are  coded  as  CRLF.\n       Without  this option, a dot does not match when the current position is\n       at a newline. This option is equivalent to Perl's /s option, and it can\n       be  changed within a pattern by a (?s) option setting. A negative class\n       such as [^a] always matches newline characters, independent of the set-\n       ting of this option.\n\n         PCRE_DUPNAMES\n\n       If  this  bit is set, names used to identify capturing subpatterns need\n       not be unique. This can be helpful for certain types of pattern when it\n       is  known  that  only  one instance of the named subpattern can ever be\n       matched. There are more details of named subpatterns  below;  see  also\n       the pcrepattern documentation.\n\n         PCRE_EXTENDED\n\n       If  this  bit  is  set,  most white space characters in the pattern are\n       totally ignored except when escaped or inside a character  class.  How-\n       ever,  white  space  is  not  allowed within sequences such as (?> that\n       introduce various parenthesized subpatterns,  nor  within  a  numerical\n       quantifier  such as {1,3}.  However, ignorable white space is permitted\n       between an item and a following quantifier and between a quantifier and\n       a following + that indicates possessiveness.\n\n       White space did not used to include the VT character (code 11), because\n       Perl did not treat this character as white space. However, Perl changed\n       at  release  5.18,  so  PCRE  followed  at  release 8.34, and VT is now\n       treated as white space.\n\n       PCRE_EXTENDED also causes characters between an unescaped #  outside  a\n       character  class  and  the  next  newline,  inclusive,  to  be ignored.\n       PCRE_EXTENDED is equivalent to Perl's /x option, and it can be  changed\n       within a pattern by a (?x) option setting.\n\n       Which  characters  are  interpreted  as  newlines  is controlled by the\n       options passed to pcre_compile() or by a special sequence at the  start\n       of  the  pattern, as described in the section entitled \"Newline conven-\n       tions\" in the pcrepattern documentation. Note that the end of this type\n       of  comment  is  a  literal  newline  sequence  in  the pattern; escape\n       sequences that happen to represent a newline do not count.\n\n       This option makes it possible to include  comments  inside  complicated\n       patterns.   Note,  however,  that this applies only to data characters.\n       White space  characters  may  never  appear  within  special  character\n       sequences in a pattern, for example within the sequence (?( that intro-\n       duces a conditional subpattern.\n\n         PCRE_EXTRA\n\n       This option was invented in order to turn on  additional  functionality\n       of  PCRE  that  is  incompatible with Perl, but it is currently of very\n       little use. When set, any backslash in a pattern that is followed by  a\n       letter  that  has  no  special  meaning causes an error, thus reserving\n       these combinations for future expansion. By  default,  as  in  Perl,  a\n       backslash  followed by a letter with no special meaning is treated as a\n       literal. (Perl can, however, be persuaded to give an error for this, by\n       running  it with the -w option.) There are at present no other features\n       controlled by this option. It can also be set by a (?X) option  setting\n       within a pattern.\n\n         PCRE_FIRSTLINE\n\n       If  this  option  is  set,  an  unanchored pattern is required to match\n       before or at the first  newline  in  the  subject  string,  though  the\n       matched text may continue over the newline.\n\n         PCRE_JAVASCRIPT_COMPAT\n\n       If this option is set, PCRE's behaviour is changed in some ways so that\n       it is compatible with JavaScript rather than Perl. The changes  are  as\n       follows:\n\n       (1)  A  lone  closing square bracket in a pattern causes a compile-time\n       error, because this is illegal in JavaScript (by default it is  treated\n       as a data character). Thus, the pattern AB]CD becomes illegal when this\n       option is set.\n\n       (2) At run time, a back reference to an unset subpattern group  matches\n       an  empty  string (by default this causes the current matching alterna-\n       tive to fail). A pattern such as (\\1)(a) succeeds when this  option  is\n       set  (assuming  it can find an \"a\" in the subject), whereas it fails by\n       default, for Perl compatibility.\n\n       (3) \\U matches an upper case \"U\" character; by default \\U causes a com-\n       pile time error (Perl uses \\U to upper case subsequent characters).\n\n       (4) \\u matches a lower case \"u\" character unless it is followed by four\n       hexadecimal digits, in which case the hexadecimal  number  defines  the\n       code  point  to match. By default, \\u causes a compile time error (Perl\n       uses it to upper case the following character).\n\n       (5) \\x matches a lower case \"x\" character unless it is followed by  two\n       hexadecimal  digits,  in  which case the hexadecimal number defines the\n       code point to match. By default, as in Perl, a  hexadecimal  number  is\n       always expected after \\x, but it may have zero, one, or two digits (so,\n       for example, \\xz matches a binary zero character followed by z).\n\n         PCRE_MULTILINE\n\n       By default, for the purposes of matching \"start of line\"  and  \"end  of\n       line\", PCRE treats the subject string as consisting of a single line of\n       characters, even if it actually contains newlines. The \"start of  line\"\n       metacharacter (^) matches only at the start of the string, and the \"end\n       of line\" metacharacter ($) matches only at the end of  the  string,  or\n       before  a terminating newline (except when PCRE_DOLLAR_ENDONLY is set).\n       Note, however, that unless PCRE_DOTALL  is  set,  the  \"any  character\"\n       metacharacter  (.)  does not match at a newline. This behaviour (for ^,\n       $, and dot) is the same as Perl.\n\n       When PCRE_MULTILINE it is set, the \"start of line\" and  \"end  of  line\"\n       constructs  match  immediately following or immediately before internal\n       newlines in the subject string, respectively, as well as  at  the  very\n       start  and  end.  This is equivalent to Perl's /m option, and it can be\n       changed within a pattern by a (?m) option setting. If there are no new-\n       lines  in  a  subject string, or no occurrences of ^ or $ in a pattern,\n       setting PCRE_MULTILINE has no effect.\n\n         PCRE_NEVER_UTF\n\n       This option locks out interpretation of the pattern as UTF-8 (or UTF-16\n       or  UTF-32  in the 16-bit and 32-bit libraries). In particular, it pre-\n       vents the creator of the pattern from switching to  UTF  interpretation\n       by starting the pattern with (*UTF). This may be useful in applications\n       that  process  patterns  from  external  sources.  The  combination  of\n       PCRE_UTF8 and PCRE_NEVER_UTF also causes an error.\n\n         PCRE_NEWLINE_CR\n         PCRE_NEWLINE_LF\n         PCRE_NEWLINE_CRLF\n         PCRE_NEWLINE_ANYCRLF\n         PCRE_NEWLINE_ANY\n\n       These  options  override the default newline definition that was chosen\n       when PCRE was built. Setting the first or the second specifies  that  a\n       newline  is  indicated  by a single character (CR or LF, respectively).\n       Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by  the\n       two-character  CRLF  sequence.  Setting  PCRE_NEWLINE_ANYCRLF specifies\n       that any of the three preceding sequences should be recognized. Setting\n       PCRE_NEWLINE_ANY  specifies that any Unicode newline sequence should be\n       recognized.\n\n       In an ASCII/Unicode environment, the Unicode newline sequences are  the\n       three  just  mentioned,  plus  the  single characters VT (vertical tab,\n       U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep-\n       arator,  U+2028),  and  PS (paragraph separator, U+2029). For the 8-bit\n       library, the last two are recognized only in UTF-8 mode.\n\n       When PCRE is compiled to run in an EBCDIC (mainframe) environment,  the\n       code for CR is 0x0d, the same as ASCII. However, the character code for\n       LF is normally 0x15, though in some EBCDIC environments 0x25  is  used.\n       Whichever  of  these  is  not LF is made to correspond to Unicode's NEL\n       character. EBCDIC codes are all less than 256. For  more  details,  see\n       the pcrebuild documentation.\n\n       The  newline  setting  in  the  options  word  uses three bits that are\n       treated as a number, giving eight possibilities. Currently only six are\n       used  (default  plus the five values above). This means that if you set\n       more than one newline option, the combination may or may not be  sensi-\n       ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to\n       PCRE_NEWLINE_CRLF, but other combinations may yield unused numbers  and\n       cause an error.\n\n       The  only  time  that a line break in a pattern is specially recognized\n       when compiling is when PCRE_EXTENDED is set. CR and LF are white  space\n       characters,  and so are ignored in this mode. Also, an unescaped # out-\n       side a character class indicates a comment that lasts until  after  the\n       next  line break sequence. In other circumstances, line break sequences\n       in patterns are treated as literal data.\n\n       The newline option that is set at compile time becomes the default that\n       is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden.\n\n         PCRE_NO_AUTO_CAPTURE\n\n       If this option is set, it disables the use of numbered capturing paren-\n       theses in the pattern. Any opening parenthesis that is not followed  by\n       ?  behaves as if it were followed by ?: but named parentheses can still\n       be used for capturing (and they acquire  numbers  in  the  usual  way).\n       There is no equivalent of this option in Perl.\n\n         PCRE_NO_AUTO_POSSESS\n\n       If  this option is set, it disables \"auto-possessification\". This is an\n       optimization that, for example, turns a+b into a++b in order  to  avoid\n       backtracks  into  a+ that can never be successful. However, if callouts\n       are in use, auto-possessification means that some  of  them  are  never\n       taken. You can set this option if you want the matching functions to do\n       a full unoptimized search and run all the callouts, but  it  is  mainly\n       provided for testing purposes.\n\n         PCRE_NO_START_OPTIMIZE\n\n       This  is an option that acts at matching time; that is, it is really an\n       option for pcre_exec() or pcre_dfa_exec(). If  it  is  set  at  compile\n       time,  it is remembered with the compiled pattern and assumed at match-\n       ing time. This is necessary if you want to use JIT  execution,  because\n       the  JIT  compiler needs to know whether or not this option is set. For\n       details see the discussion of PCRE_NO_START_OPTIMIZE below.\n\n         PCRE_UCP\n\n       This option changes the way PCRE processes \\B, \\b, \\D, \\d, \\S, \\s,  \\W,\n       \\w,  and  some  of  the POSIX character classes. By default, only ASCII\n       characters are recognized, but if PCRE_UCP is set,  Unicode  properties\n       are  used instead to classify characters. More details are given in the\n       section on generic character types in the pcrepattern page. If you  set\n       PCRE_UCP,  matching  one of the items it affects takes much longer. The\n       option is available only if PCRE has been compiled with  Unicode  prop-\n       erty support.\n\n         PCRE_UNGREEDY\n\n       This  option  inverts  the \"greediness\" of the quantifiers so that they\n       are not greedy by default, but become greedy if followed by \"?\". It  is\n       not  compatible  with Perl. It can also be set by a (?U) option setting\n       within the pattern.\n\n         PCRE_UTF8\n\n       This option causes PCRE to regard both the pattern and the  subject  as\n       strings of UTF-8 characters instead of single-byte strings. However, it\n       is available only when PCRE is built to include UTF  support.  If  not,\n       the  use  of  this option provokes an error. Details of how this option\n       changes the behaviour of PCRE are given in the pcreunicode page.\n\n         PCRE_NO_UTF8_CHECK\n\n       When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is\n       automatically  checked.  There  is  a  discussion about the validity of\n       UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence  is\n       found,  pcre_compile()  returns an error. If you already know that your\n       pattern is valid, and you want to skip this check for performance  rea-\n       sons,  you  can set the PCRE_NO_UTF8_CHECK option.  When it is set, the\n       effect of passing an invalid UTF-8 string as a pattern is undefined. It\n       may cause your program to crash or loop. Note that this option can also\n       be passed to pcre_exec() and pcre_dfa_exec(), to suppress the  validity\n       checking  of  subject strings only. If the same string is being matched\n       many times, the option can be safely set for the second and  subsequent\n       matchings to improve performance.\n\n\nCOMPILATION ERROR CODES\n\n       The  following  table  lists  the  error  codes than may be returned by\n       pcre_compile2(), along with the error messages that may be returned  by\n       both  compiling  functions.  Note  that error messages are always 8-bit\n       ASCII strings, even in 16-bit or 32-bit mode. As  PCRE  has  developed,\n       some  error codes have fallen out of use. To avoid confusion, they have\n       not been re-used.\n\n          0  no error\n          1  \\ at end of pattern\n          2  \\c at end of pattern\n          3  unrecognized character follows \\\n          4  numbers out of order in {} quantifier\n          5  number too big in {} quantifier\n          6  missing terminating ] for character class\n          7  invalid escape sequence in character class\n          8  range out of order in character class\n          9  nothing to repeat\n         10  [this code is not in use]\n         11  internal error: unexpected repeat\n         12  unrecognized character after (? or (?-\n         13  POSIX named classes are supported only within a class\n         14  missing )\n         15  reference to non-existent subpattern\n         16  erroffset passed as NULL\n         17  unknown option bit(s) set\n         18  missing ) after comment\n         19  [this code is not in use]\n         20  regular expression is too large\n         21  failed to get memory\n         22  unmatched parentheses\n         23  internal error: code overflow\n         24  unrecognized character after (?<\n         25  lookbehind assertion is not fixed length\n         26  malformed number or name after (?(\n         27  conditional group contains more than two branches\n         28  assertion expected after (?(\n         29  (?R or (?[+-]digits must be followed by )\n         30  unknown POSIX class name\n         31  POSIX collating elements are not supported\n         32  this version of PCRE is compiled without UTF support\n         33  [this code is not in use]\n         34  character value in \\x{} or \\o{} is too large\n         35  invalid condition (?(0)\n         36  \\C not allowed in lookbehind assertion\n         37  PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\n         38  number after (?C is > 255\n         39  closing ) for (?C expected\n         40  recursive call could loop indefinitely\n         41  unrecognized character after (?P\n         42  syntax error in subpattern name (missing terminator)\n         43  two named subpatterns have the same name\n         44  invalid UTF-8 string (specifically UTF-8)\n         45  support for \\P, \\p, and \\X has not been compiled\n         46  malformed \\P or \\p sequence\n         47  unknown property name after \\P or \\p\n         48  subpattern name is too long (maximum 32 characters)\n         49  too many named subpatterns (maximum 10000)\n         50  [this code is not in use]\n         51  octal value is greater than \\377 in 8-bit non-UTF-8 mode\n         52  internal error: overran compiling workspace\n         53  internal error: previously-checked referenced subpattern\n               not found\n         54  DEFINE group contains more than one branch\n         55  repeating a DEFINE group is not allowed\n         56  inconsistent NEWLINE options\n         57  \\g is not followed by a braced, angle-bracketed, or quoted\n               name/number or by a plain number\n         58  a numbered reference must not be zero\n         59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\n         60  (*VERB) not recognized or malformed\n         61  number is too big\n         62  subpattern name expected\n         63  digit expected after (?+\n         64  ] is an invalid data character in JavaScript compatibility mode\n         65  different names for subpatterns of the same number are\n               not allowed\n         66  (*MARK) must have an argument\n         67  this version of PCRE is not compiled with Unicode property\n               support\n         68  \\c must be followed by an ASCII character\n         69  \\k is not followed by a braced, angle-bracketed, or quoted name\n         70  internal error: unknown opcode in find_fixedlength()\n         71  \\N is not supported in a class\n         72  too many forward references\n         73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\n         74  invalid UTF-16 string (specifically UTF-16)\n         75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\n         76  character value in \\u.... sequence is too large\n         77  invalid UTF-32 string (specifically UTF-32)\n         78  setting UTF is disabled by the application\n         79  non-hex character in \\x{} (closing brace missing?)\n         80  non-octal character in \\o{} (closing brace missing?)\n         81  missing opening brace after \\o\n         82  parentheses are too deeply nested\n         83  invalid range in character class\n         84  group name must start with a non-digit\n         85  parentheses are too deeply nested (stack check)\n\n       The numbers 32 and 10000 in errors 48 and 49  are  defaults;  different\n       values may be used if the limits were changed when PCRE was built.\n\n\nSTUDYING A PATTERN\n\n       pcre_extra *pcre_study(const pcre *code, int options,\n            const char **errptr);\n\n       If  a  compiled  pattern is going to be used several times, it is worth\n       spending more time analyzing it in order to speed up the time taken for\n       matching.  The function pcre_study() takes a pointer to a compiled pat-\n       tern as its first argument. If studying the pattern produces additional\n       information  that  will  help speed up matching, pcre_study() returns a\n       pointer to a pcre_extra block, in which the study_data field points  to\n       the results of the study.\n\n       The  returned  value  from  pcre_study()  can  be  passed  directly  to\n       pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block  also  con-\n       tains  other  fields  that can be set by the caller before the block is\n       passed; these are described below in the section on matching a pattern.\n\n       If studying the  pattern  does  not  produce  any  useful  information,\n       pcre_study()  returns  NULL  by  default.  In that circumstance, if the\n       calling program wants to pass any of the other fields to pcre_exec() or\n       pcre_dfa_exec(),  it  must set up its own pcre_extra block. However, if\n       pcre_study() is called  with  the  PCRE_STUDY_EXTRA_NEEDED  option,  it\n       returns a pcre_extra block even if studying did not find any additional\n       information. It may still return NULL, however, if an error  occurs  in\n       pcre_study().\n\n       The  second  argument  of  pcre_study() contains option bits. There are\n       three further options in addition to PCRE_STUDY_EXTRA_NEEDED:\n\n         PCRE_STUDY_JIT_COMPILE\n         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n\n       If any of these are set, and the just-in-time  compiler  is  available,\n       the  pattern  is  further compiled into machine code that executes much\n       faster than the pcre_exec()  interpretive  matching  function.  If  the\n       just-in-time  compiler is not available, these options are ignored. All\n       undefined bits in the options argument must be zero.\n\n       JIT compilation is a heavyweight optimization. It can  take  some  time\n       for  patterns  to  be analyzed, and for one-off matches and simple pat-\n       terns the benefit of faster execution might be offset by a much  slower\n       study time.  Not all patterns can be optimized by the JIT compiler. For\n       those that cannot be handled, matching automatically falls back to  the\n       pcre_exec()  interpreter.  For more details, see the pcrejit documenta-\n       tion.\n\n       The third argument for pcre_study() is a pointer for an error  message.\n       If  studying  succeeds  (even  if no data is returned), the variable it\n       points to is set to NULL. Otherwise it is set to  point  to  a  textual\n       error message. This is a static string that is part of the library. You\n       must not try to free it. You should test the  error  pointer  for  NULL\n       after calling pcre_study(), to be sure that it has run successfully.\n\n       When  you are finished with a pattern, you can free the memory used for\n       the study data by calling pcre_free_study(). This function was added to\n       the  API  for  release  8.20. For earlier versions, the memory could be\n       freed with pcre_free(), just like the pattern itself. This  will  still\n       work  in  cases where JIT optimization is not used, but it is advisable\n       to change to the new function when convenient.\n\n       This is a typical way in which pcre_study() is used (except that  in  a\n       real application there should be tests for errors):\n\n         int rc;\n         pcre *re;\n         pcre_extra *sd;\n         re = pcre_compile(\"pattern\", 0, &error, &erroroffset, NULL);\n         sd = pcre_study(\n           re,             /* result of pcre_compile() */\n           0,              /* no options */\n           &error);        /* set to NULL or points to a message */\n         rc = pcre_exec(   /* see below for details of pcre_exec() options */\n           re, sd, \"subject\", 7, 0, 0, ovector, 30);\n         ...\n         pcre_free_study(sd);\n         pcre_free(re);\n\n       Studying a pattern does two things: first, a lower bound for the length\n       of subject string that is needed to match the pattern is computed. This\n       does not mean that there are any strings of that length that match, but\n       it does guarantee that no shorter strings match. The value is  used  to\n       avoid wasting time by trying to match strings that are shorter than the\n       lower bound. You can find out the value in a calling  program  via  the\n       pcre_fullinfo() function.\n\n       Studying a pattern is also useful for non-anchored patterns that do not\n       have a single fixed starting character. A bitmap of  possible  starting\n       bytes  is  created. This speeds up finding a position in the subject at\n       which to start matching. (In 16-bit mode, the bitmap is used for 16-bit\n       values  less  than  256.  In 32-bit mode, the bitmap is used for 32-bit\n       values less than 256.)\n\n       These two optimizations apply to both pcre_exec() and  pcre_dfa_exec(),\n       and  the  information  is also used by the JIT compiler.  The optimiza-\n       tions can be disabled by  setting  the  PCRE_NO_START_OPTIMIZE  option.\n       You  might want to do this if your pattern contains callouts or (*MARK)\n       and you want to make use of these facilities in  cases  where  matching\n       fails.\n\n       PCRE_NO_START_OPTIMIZE  can be specified at either compile time or exe-\n       cution  time.  However,  if   PCRE_NO_START_OPTIMIZE   is   passed   to\n       pcre_exec(), (that is, after any JIT compilation has happened) JIT exe-\n       cution is disabled. For JIT execution to work with  PCRE_NO_START_OPTI-\n       MIZE, the option must be set at compile time.\n\n       There is a longer discussion of PCRE_NO_START_OPTIMIZE below.\n\n\nLOCALE SUPPORT\n\n       PCRE  handles  caseless matching, and determines whether characters are\n       letters, digits, or whatever, by reference to a set of tables,  indexed\n       by  character  code point. When running in UTF-8 mode, or in the 16- or\n       32-bit libraries, this applies only to characters with code points less\n       than  256.  By  default,  higher-valued code points never match escapes\n       such as \\w or \\d. However, if PCRE is built with Unicode property  sup-\n       port,  all  characters can be tested with \\p and \\P, or, alternatively,\n       the PCRE_UCP option can be set when a pattern is compiled; this  causes\n       \\w  and friends to use Unicode property support instead of the built-in\n       tables.\n\n       The use of locales with Unicode is discouraged.  If  you  are  handling\n       characters  with  code  points  greater than 128, you should either use\n       Unicode support, or use locales, but not try to mix the two.\n\n       PCRE contains an internal set of tables that are used  when  the  final\n       argument  of  pcre_compile()  is  NULL.  These  are sufficient for many\n       applications.  Normally, the internal tables recognize only ASCII char-\n       acters. However, when PCRE is built, it is possible to cause the inter-\n       nal tables to be rebuilt in the default \"C\" locale of the local system,\n       which may cause them to be different.\n\n       The  internal tables can always be overridden by tables supplied by the\n       application that calls PCRE. These may be created in a different locale\n       from  the  default.  As more and more applications change to using Uni-\n       code, the need for this locale support is expected to die away.\n\n       External tables are built by calling  the  pcre_maketables()  function,\n       which  has no arguments, in the relevant locale. The result can then be\n       passed to pcre_compile() as often as necessary. For example,  to  build\n       and  use  tables  that  are  appropriate  for  the French locale (where\n       accented characters with values greater than 128 are  treated  as  let-\n       ters), the following code could be used:\n\n         setlocale(LC_CTYPE, \"fr_FR\");\n         tables = pcre_maketables();\n         re = pcre_compile(..., tables);\n\n       The  locale  name \"fr_FR\" is used on Linux and other Unix-like systems;\n       if you are using Windows, the name for the French locale is \"french\".\n\n       When pcre_maketables() runs, the tables are built  in  memory  that  is\n       obtained  via  pcre_malloc. It is the caller's responsibility to ensure\n       that the memory containing the tables remains available for as long  as\n       it is needed.\n\n       The pointer that is passed to pcre_compile() is saved with the compiled\n       pattern, and the same tables are used via this pointer by  pcre_study()\n       and  also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat-\n       tern, compilation, studying and matching all happen in the same locale,\n       but different patterns can be processed in different locales.\n\n       It  is  possible to pass a table pointer or NULL (indicating the use of\n       the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus-\n       sion below in the section on matching a pattern). This facility is pro-\n       vided for use with pre-compiled  patterns  that  have  been  saved  and\n       reloaded.   Character  tables are not saved with patterns, so if a non-\n       standard table was used at compile time, it must be provided again when\n       the  reloaded  pattern  is  matched. Attempting to use this facility to\n       match a pattern in a different locale from the one in which it was com-\n       piled is likely to lead to anomalous (usually incorrect) results.\n\n\nINFORMATION ABOUT A PATTERN\n\n       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,\n            int what, void *where);\n\n       The  pcre_fullinfo() function returns information about a compiled pat-\n       tern. It replaces the pcre_info() function, which was removed from  the\n       library at version 8.30, after more than 10 years of obsolescence.\n\n       The  first  argument  for  pcre_fullinfo() is a pointer to the compiled\n       pattern. The second argument is the result of pcre_study(), or NULL  if\n       the  pattern  was not studied. The third argument specifies which piece\n       of information is required, and the fourth argument is a pointer  to  a\n       variable  to  receive  the  data. The yield of the function is zero for\n       success, or one of the following negative numbers:\n\n         PCRE_ERROR_NULL           the argument code was NULL\n                                   the argument where was NULL\n         PCRE_ERROR_BADMAGIC       the \"magic number\" was not found\n         PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different\n                                   endianness\n         PCRE_ERROR_BADOPTION      the value of what was invalid\n         PCRE_ERROR_UNSET          the requested field is not set\n\n       The \"magic number\" is placed at the start of each compiled  pattern  as\n       an  simple check against passing an arbitrary memory pointer. The endi-\n       anness error can occur if a compiled pattern is saved and reloaded on a\n       different  host.  Here  is a typical call of pcre_fullinfo(), to obtain\n       the length of the compiled pattern:\n\n         int rc;\n         size_t length;\n         rc = pcre_fullinfo(\n           re,               /* result of pcre_compile() */\n           sd,               /* result of pcre_study(), or NULL */\n           PCRE_INFO_SIZE,   /* what is required */\n           &length);         /* where to put the data */\n\n       The possible values for the third argument are defined in  pcre.h,  and\n       are as follows:\n\n         PCRE_INFO_BACKREFMAX\n\n       Return  the  number  of  the highest back reference in the pattern. The\n       fourth argument should point to an int variable. Zero  is  returned  if\n       there are no back references.\n\n         PCRE_INFO_CAPTURECOUNT\n\n       Return  the  number of capturing subpatterns in the pattern. The fourth\n       argument should point to an int variable.\n\n         PCRE_INFO_DEFAULT_TABLES\n\n       Return a pointer to the internal default character tables within  PCRE.\n       The  fourth  argument should point to an unsigned char * variable. This\n       information call is provided for internal use by the pcre_study() func-\n       tion.  External  callers  can  cause PCRE to use its internal tables by\n       passing a NULL table pointer.\n\n         PCRE_INFO_FIRSTBYTE (deprecated)\n\n       Return information about the first data unit of any matched string, for\n       a  non-anchored  pattern.  The  name of this option refers to the 8-bit\n       library, where data units are bytes. The fourth argument  should  point\n       to  an  int  variable. Negative values are used for special cases. How-\n       ever, this means that when the 32-bit library is  in  non-UTF-32  mode,\n       the  full  32-bit range of characters cannot be returned. For this rea-\n       son, this value is deprecated;  use  PCRE_INFO_FIRSTCHARACTERFLAGS  and\n       PCRE_INFO_FIRSTCHARACTER instead.\n\n       If  there  is  a  fixed first value, for example, the letter \"c\" from a\n       pattern such as (cat|cow|coyote), its value is returned. In  the  8-bit\n       library,  the  value is always less than 256. In the 16-bit library the\n       value can be up to 0xffff. In the 32-bit library the value can be up to\n       0x10ffff.\n\n       If there is no fixed first value, and if either\n\n       (a)  the pattern was compiled with the PCRE_MULTILINE option, and every\n       branch starts with \"^\", or\n\n       (b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not\n       set (if it were set, the pattern would be anchored),\n\n       -1  is  returned, indicating that the pattern matches only at the start\n       of a subject string or after any newline within the  string.  Otherwise\n       -2 is returned. For anchored patterns, -2 is returned.\n\n         PCRE_INFO_FIRSTCHARACTER\n\n       Return  the  value  of  the  first data unit (non-UTF character) of any\n       matched string in  the  situation  where  PCRE_INFO_FIRSTCHARACTERFLAGS\n       returns  1;  otherwise return 0. The fourth argument should point to an\n       uint_t variable.\n\n       In the 8-bit library, the value is always less than 256. In the  16-bit\n       library  the value can be up to 0xffff. In the 32-bit library in UTF-32\n       mode the value can be up to 0x10ffff, and up  to  0xffffffff  when  not\n       using UTF-32 mode.\n\n         PCRE_INFO_FIRSTCHARACTERFLAGS\n\n       Return information about the first data unit of any matched string, for\n       a non-anchored pattern. The fourth argument  should  point  to  an  int\n       variable.\n\n       If  there  is  a  fixed first value, for example, the letter \"c\" from a\n       pattern such as (cat|cow|coyote), 1  is  returned,  and  the  character\n       value  can  be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no\n       fixed first value, and if either\n\n       (a) the pattern was compiled with the PCRE_MULTILINE option, and  every\n       branch starts with \"^\", or\n\n       (b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not\n       set (if it were set, the pattern would be anchored),\n\n       2 is returned, indicating that the pattern matches only at the start of\n       a subject string or after any newline within the string. Otherwise 0 is\n       returned. For anchored patterns, 0 is returned.\n\n         PCRE_INFO_FIRSTTABLE\n\n       If the pattern was studied, and this resulted in the construction of  a\n       256-bit  table indicating a fixed set of values for the first data unit\n       in any matching string, a pointer to the table is  returned.  Otherwise\n       NULL  is returned. The fourth argument should point to an unsigned char\n       * variable.\n\n         PCRE_INFO_HASCRORLF\n\n       Return 1 if the pattern contains any explicit  matches  for  CR  or  LF\n       characters,  otherwise  0.  The  fourth argument should point to an int\n       variable. An explicit match is either a literal CR or LF character,  or\n       \\r or \\n.\n\n         PCRE_INFO_JCHANGED\n\n       Return  1  if  the (?J) or (?-J) option setting is used in the pattern,\n       otherwise 0. The fourth argument should point to an int variable.  (?J)\n       and (?-J) set and unset the local PCRE_DUPNAMES option, respectively.\n\n         PCRE_INFO_JIT\n\n       Return  1  if  the pattern was studied with one of the JIT options, and\n       just-in-time compiling was successful. The fourth argument should point\n       to  an  int variable. A return value of 0 means that JIT support is not\n       available in this version of PCRE, or that the pattern was not  studied\n       with  a JIT option, or that the JIT compiler could not handle this par-\n       ticular pattern. See the pcrejit documentation for details of what  can\n       and cannot be handled.\n\n         PCRE_INFO_JITSIZE\n\n       If  the  pattern was successfully studied with a JIT option, return the\n       size of the JIT compiled code, otherwise return zero. The fourth  argu-\n       ment should point to a size_t variable.\n\n         PCRE_INFO_LASTLITERAL\n\n       Return  the value of the rightmost literal data unit that must exist in\n       any matched string, other than at its start, if such a value  has  been\n       recorded. The fourth argument should point to an int variable. If there\n       is no such value, -1 is returned. For anchored patterns, a last literal\n       value  is recorded only if it follows something of variable length. For\n       example, for the pattern /^a\\d+z\\d+/ the returned value is \"z\", but for\n       /^a\\dz\\d/ the returned value is -1.\n\n       Since  for  the 32-bit library using the non-UTF-32 mode, this function\n       is unable to return the full 32-bit range of characters, this value  is\n       deprecated;     instead     the     PCRE_INFO_REQUIREDCHARFLAGS     and\n       PCRE_INFO_REQUIREDCHAR values should be used.\n\n         PCRE_INFO_MATCH_EMPTY\n\n       Return 1 if the pattern can match an empty  string,  otherwise  0.  The\n       fourth argument should point to an int variable.\n\n         PCRE_INFO_MATCHLIMIT\n\n       If  the  pattern  set  a  match  limit by including an item of the form\n       (*LIMIT_MATCH=nnnn) at the start, the value  is  returned.  The  fourth\n       argument  should  point to an unsigned 32-bit integer. If no such value\n       has  been  set,  the  call  to  pcre_fullinfo()   returns   the   error\n       PCRE_ERROR_UNSET.\n\n         PCRE_INFO_MAXLOOKBEHIND\n\n       Return  the  number  of  characters  (NB not data units) in the longest\n       lookbehind assertion in the pattern. This information  is  useful  when\n       doing  multi-segment  matching  using  the partial matching facilities.\n       Note that the simple assertions \\b and \\B require a one-character look-\n       behind.  \\A  also  registers a one-character lookbehind, though it does\n       not actually inspect the previous character. This is to ensure that  at\n       least one character from the old segment is retained when a new segment\n       is processed. Otherwise, if there are no lookbehinds in the pattern, \\A\n       might match incorrectly at the start of a new segment.\n\n         PCRE_INFO_MINLENGTH\n\n       If  the  pattern  was studied and a minimum length for matching subject\n       strings was computed, its value is  returned.  Otherwise  the  returned\n       value is -1. The value is a number of characters, which in UTF mode may\n       be different from the number of data units. The fourth argument  should\n       point  to an int variable. A non-negative value is a lower bound to the\n       length of any matching string. There may not be  any  strings  of  that\n       length  that  do actually match, but every string that does match is at\n       least that long.\n\n         PCRE_INFO_NAMECOUNT\n         PCRE_INFO_NAMEENTRYSIZE\n         PCRE_INFO_NAMETABLE\n\n       PCRE supports the use of named as well as numbered capturing  parenthe-\n       ses.  The names are just an additional way of identifying the parenthe-\n       ses, which still acquire numbers. Several convenience functions such as\n       pcre_get_named_substring()  are  provided  for extracting captured sub-\n       strings by name. It is also possible to extract the data  directly,  by\n       first  converting  the  name to a number in order to access the correct\n       pointers in the output vector (described with pcre_exec() below). To do\n       the  conversion,  you  need  to  use  the  name-to-number map, which is\n       described by these three values.\n\n       The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT\n       gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size\n       of each entry; both of these  return  an  int  value.  The  entry  size\n       depends  on the length of the longest name. PCRE_INFO_NAMETABLE returns\n       a pointer to the first entry of the table. This is a pointer to char in\n       the 8-bit library, where the first two bytes of each entry are the num-\n       ber of the capturing parenthesis, most significant byte first.  In  the\n       16-bit  library,  the pointer points to 16-bit data units, the first of\n       which contains the parenthesis  number.  In  the  32-bit  library,  the\n       pointer  points  to  32-bit data units, the first of which contains the\n       parenthesis number. The rest of the entry is  the  corresponding  name,\n       zero terminated.\n\n       The  names are in alphabetical order. If (?| is used to create multiple\n       groups with the same number, as described in the section  on  duplicate\n       subpattern numbers in the pcrepattern page, the groups may be given the\n       same name, but there is only one entry in the  table.  Different  names\n       for  groups  of the same number are not permitted.  Duplicate names for\n       subpatterns with different numbers are permitted, but only if PCRE_DUP-\n       NAMES  is set. They appear in the table in the order in which they were\n       found in the pattern. In the absence  of  (?|  this  is  the  order  of\n       increasing  number;  when  (?| is used this is not necessarily the case\n       because later subpatterns may have lower numbers.\n\n       As a simple example of the name/number table,  consider  the  following\n       pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is\n       set, so white space - including newlines - is ignored):\n\n         (?<date> (?<year>(\\d\\d)?\\d\\d) -\n         (?<month>\\d\\d) - (?<day>\\d\\d) )\n\n       There are four named subpatterns, so the table has  four  entries,  and\n       each  entry  in the table is eight bytes long. The table is as follows,\n       with non-printing bytes shows in hexadecimal, and undefined bytes shown\n       as ??:\n\n         00 01 d  a  t  e  00 ??\n         00 05 d  a  y  00 ?? ??\n         00 04 m  o  n  t  h  00\n         00 02 y  e  a  r  00 ??\n\n       When  writing  code  to  extract  data from named subpatterns using the\n       name-to-number map, remember that the length of the entries  is  likely\n       to be different for each compiled pattern.\n\n         PCRE_INFO_OKPARTIAL\n\n       Return  1  if  the  pattern  can  be  used  for  partial  matching with\n       pcre_exec(), otherwise 0. The fourth argument should point  to  an  int\n       variable.  From  release  8.00,  this  always  returns  1,  because the\n       restrictions that previously applied  to  partial  matching  have  been\n       lifted.  The  pcrepartial documentation gives details of partial match-\n       ing.\n\n         PCRE_INFO_OPTIONS\n\n       Return a copy of the options with which the pattern was  compiled.  The\n       fourth  argument  should  point to an unsigned long int variable. These\n       option bits are those specified in the call to pcre_compile(), modified\n       by any top-level option settings at the start of the pattern itself. In\n       other words, they are the options that will be in force  when  matching\n       starts.  For  example, if the pattern /(?im)abc(?-i)d/ is compiled with\n       the PCRE_EXTENDED option, the result is PCRE_CASELESS,  PCRE_MULTILINE,\n       and PCRE_EXTENDED.\n\n       A  pattern  is  automatically  anchored by PCRE if all of its top-level\n       alternatives begin with one of the following:\n\n         ^     unless PCRE_MULTILINE is set\n         \\A    always\n         \\G    always\n         .*    if PCRE_DOTALL is set and there are no back\n                 references to the subpattern in which .* appears\n\n       For such patterns, the PCRE_ANCHORED bit is set in the options returned\n       by pcre_fullinfo().\n\n         PCRE_INFO_RECURSIONLIMIT\n\n       If  the  pattern set a recursion limit by including an item of the form\n       (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth\n       argument  should  point to an unsigned 32-bit integer. If no such value\n       has  been  set,  the  call  to  pcre_fullinfo()   returns   the   error\n       PCRE_ERROR_UNSET.\n\n         PCRE_INFO_SIZE\n\n       Return  the  size  of  the  compiled  pattern  in  bytes (for all three\n       libraries). The fourth argument should point to a size_t variable. This\n       value  does not include the size of the pcre structure that is returned\n       by pcre_compile().  The  value  that  is  passed  as  the  argument  to\n       pcre_malloc()  when  pcre_compile() is getting memory in which to place\n       the compiled data is the value returned by this option plus the size of\n       the  pcre  structure. Studying a compiled pattern, with or without JIT,\n       does not alter the value returned by this option.\n\n         PCRE_INFO_STUDYSIZE\n\n       Return the size in bytes (for all three libraries) of  the  data  block\n       pointed to by the study_data field in a pcre_extra block. If pcre_extra\n       is NULL, or there is no study data, zero is returned. The fourth  argu-\n       ment  should point to a size_t variable. The study_data field is set by\n       pcre_study() to record information that will speed up matching (see the\n       section  entitled  \"Studying  a  pattern\"  above).  The  format  of the\n       study_data block is private, but its length is made available via  this\n       option  so  that  it  can be saved and restored (see the pcreprecompile\n       documentation for details).\n\n         PCRE_INFO_REQUIREDCHARFLAGS\n\n       Returns 1 if there is a rightmost literal data unit that must exist  in\n       any matched string, other than at its start. The fourth argument should\n       point to an int variable. If there is no such value, 0 is returned.  If\n       returning  1,  the  character  value  itself  can  be  retrieved  using\n       PCRE_INFO_REQUIREDCHAR.\n\n       For anchored patterns, a last literal value is recorded only if it fol-\n       lows  something  of  variable  length.  For  example,  for  the pattern\n       /^a\\d+z\\d+/  the   returned   value   1   (with   \"z\"   returned   from\n       PCRE_INFO_REQUIREDCHAR), but for /^a\\dz\\d/ the returned value is 0.\n\n         PCRE_INFO_REQUIREDCHAR\n\n       Return  the value of the rightmost literal data unit that must exist in\n       any matched string, other than at its start, if such a value  has  been\n       recorded.  The fourth argument should point to an uint32_t variable. If\n       there is no such value, 0 is returned.\n\n\nREFERENCE COUNTS\n\n       int pcre_refcount(pcre *code, int adjust);\n\n       The pcre_refcount() function is used to maintain a reference  count  in\n       the data block that contains a compiled pattern. It is provided for the\n       benefit of applications that  operate  in  an  object-oriented  manner,\n       where different parts of the application may be using the same compiled\n       pattern, but you want to free the block when they are all done.\n\n       When a pattern is compiled, the reference count field is initialized to\n       zero.   It is changed only by calling this function, whose action is to\n       add the adjust value (which may be positive or  negative)  to  it.  The\n       yield of the function is the new value. However, the value of the count\n       is constrained to lie between 0 and 65535, inclusive. If the new  value\n       is outside these limits, it is forced to the appropriate limit value.\n\n       Except  when it is zero, the reference count is not correctly preserved\n       if a pattern is compiled on one host and then  transferred  to  a  host\n       whose byte-order is different. (This seems a highly unlikely scenario.)\n\n\nMATCHING A PATTERN: THE TRADITIONAL FUNCTION\n\n       int pcre_exec(const pcre *code, const pcre_extra *extra,\n            const char *subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize);\n\n       The  function pcre_exec() is called to match a subject string against a\n       compiled pattern, which is passed in the code argument. If the  pattern\n       was  studied,  the  result  of  the study should be passed in the extra\n       argument. You can call pcre_exec() with the same code and  extra  argu-\n       ments  as  many  times as you like, in order to match different subject\n       strings with the same pattern.\n\n       This function is the main matching facility  of  the  library,  and  it\n       operates  in  a  Perl-like  manner. For specialist use there is also an\n       alternative matching function, which is described below in the  section\n       about the pcre_dfa_exec() function.\n\n       In  most applications, the pattern will have been compiled (and option-\n       ally studied) in the same process that calls pcre_exec().  However,  it\n       is possible to save compiled patterns and study data, and then use them\n       later in different processes, possibly even on different hosts.  For  a\n       discussion about this, see the pcreprecompile documentation.\n\n       Here is an example of a simple call to pcre_exec():\n\n         int rc;\n         int ovector[30];\n         rc = pcre_exec(\n           re,             /* result of pcre_compile() */\n           NULL,           /* we didn't study the pattern */\n           \"some string\",  /* the subject string */\n           11,             /* the length of the subject string */\n           0,              /* start at offset 0 in the subject */\n           0,              /* default options */\n           ovector,        /* vector of integers for substring information */\n           30);            /* number of elements (NOT size in bytes) */\n\n   Extra data for pcre_exec()\n\n       If  the  extra argument is not NULL, it must point to a pcre_extra data\n       block. The pcre_study() function returns such a block (when it  doesn't\n       return  NULL), but you can also create one for yourself, and pass addi-\n       tional information in it. The pcre_extra block contains  the  following\n       fields (not necessarily in this order):\n\n         unsigned long int flags;\n         void *study_data;\n         void *executable_jit;\n         unsigned long int match_limit;\n         unsigned long int match_limit_recursion;\n         void *callout_data;\n         const unsigned char *tables;\n         unsigned char **mark;\n\n       In  the  16-bit  version  of  this  structure,  the mark field has type\n       \"PCRE_UCHAR16 **\".\n\n       In the 32-bit version of  this  structure,  the  mark  field  has  type\n       \"PCRE_UCHAR32 **\".\n\n       The  flags  field is used to specify which of the other fields are set.\n       The flag bits are:\n\n         PCRE_EXTRA_CALLOUT_DATA\n         PCRE_EXTRA_EXECUTABLE_JIT\n         PCRE_EXTRA_MARK\n         PCRE_EXTRA_MATCH_LIMIT\n         PCRE_EXTRA_MATCH_LIMIT_RECURSION\n         PCRE_EXTRA_STUDY_DATA\n         PCRE_EXTRA_TABLES\n\n       Other flag bits should be set to zero. The study_data field  and  some-\n       times  the executable_jit field are set in the pcre_extra block that is\n       returned by pcre_study(), together with the appropriate flag bits.  You\n       should  not set these yourself, but you may add to the block by setting\n       other fields and their corresponding flag bits.\n\n       The match_limit field provides a means of preventing PCRE from using up\n       a  vast amount of resources when running patterns that are not going to\n       match, but which have a very large number  of  possibilities  in  their\n       search  trees. The classic example is a pattern that uses nested unlim-\n       ited repeats.\n\n       Internally, pcre_exec() uses a function called match(), which it  calls\n       repeatedly  (sometimes  recursively).  The  limit set by match_limit is\n       imposed on the number of times this function is called during a  match,\n       which  has  the  effect of limiting the amount of backtracking that can\n       take place. For patterns that are not anchored, the count restarts from\n       zero for each position in the subject string.\n\n       When pcre_exec() is called with a pattern that was successfully studied\n       with a JIT option, the way that the matching is  executed  is  entirely\n       different.  However, there is still the possibility of runaway matching\n       that goes on for a very long time, and so the match_limit value is also\n       used in this case (but in a different way) to limit how long the match-\n       ing can continue.\n\n       The default value for the limit can be set  when  PCRE  is  built;  the\n       default  default  is 10 million, which handles all but the most extreme\n       cases. You can override the default  by  suppling  pcre_exec()  with  a\n       pcre_extra     block    in    which    match_limit    is    set,    and\n       PCRE_EXTRA_MATCH_LIMIT is set in the  flags  field.  If  the  limit  is\n       exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.\n\n       A  value  for  the  match  limit may also be supplied by an item at the\n       start of a pattern of the form\n\n         (*LIMIT_MATCH=d)\n\n       where d is a decimal number. However, such a setting is ignored  unless\n       d  is  less  than  the limit set by the caller of pcre_exec() or, if no\n       such limit is set, less than the default.\n\n       The match_limit_recursion field is similar to match_limit, but  instead\n       of limiting the total number of times that match() is called, it limits\n       the depth of recursion. The recursion depth is a  smaller  number  than\n       the  total number of calls, because not all calls to match() are recur-\n       sive.  This limit is of use only if it is set smaller than match_limit.\n\n       Limiting the recursion depth limits the amount of  machine  stack  that\n       can  be used, or, when PCRE has been compiled to use memory on the heap\n       instead of the stack, the amount of heap memory that can be used.  This\n       limit  is not relevant, and is ignored, when matching is done using JIT\n       compiled code.\n\n       The default value for match_limit_recursion can be  set  when  PCRE  is\n       built;  the  default  default  is  the  same  value  as the default for\n       match_limit. You can override the default by suppling pcre_exec()  with\n       a   pcre_extra   block  in  which  match_limit_recursion  is  set,  and\n       PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in  the  flags  field.  If  the\n       limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT.\n\n       A  value for the recursion limit may also be supplied by an item at the\n       start of a pattern of the form\n\n         (*LIMIT_RECURSION=d)\n\n       where d is a decimal number. However, such a setting is ignored  unless\n       d  is  less  than  the limit set by the caller of pcre_exec() or, if no\n       such limit is set, less than the default.\n\n       The callout_data field is used in conjunction with the  \"callout\"  fea-\n       ture, and is described in the pcrecallout documentation.\n\n       The  tables field is provided for use with patterns that have been pre-\n       compiled using custom character tables, saved to disc or elsewhere, and\n       then  reloaded,  because the tables that were used to compile a pattern\n       are not saved with it. See the pcreprecompile documentation for a  dis-\n       cussion  of  saving  compiled patterns for later use. If NULL is passed\n       using this mechanism, it forces PCRE's internal tables to be used.\n\n       Warning: The tables that pcre_exec() uses must be  the  same  as  those\n       that  were used when the pattern was compiled. If this is not the case,\n       the behaviour of pcre_exec() is undefined. Therefore, when a pattern is\n       compiled  and  matched  in the same process, this field should never be\n       set. In this (the most common) case, the correct table pointer is auto-\n       matically  passed  with  the  compiled  pattern  from pcre_compile() to\n       pcre_exec().\n\n       If PCRE_EXTRA_MARK is set in the flags field, the mark  field  must  be\n       set  to point to a suitable variable. If the pattern contains any back-\n       tracking control verbs such as (*MARK:NAME), and the execution ends  up\n       with  a  name  to  pass back, a pointer to the name string (zero termi-\n       nated) is placed in the variable pointed to  by  the  mark  field.  The\n       names  are  within  the  compiled pattern; if you wish to retain such a\n       name you must copy it before freeing the memory of a compiled  pattern.\n       If  there  is no name to pass back, the variable pointed to by the mark\n       field is set to NULL. For details of the  backtracking  control  verbs,\n       see the section entitled \"Backtracking control\" in the pcrepattern doc-\n       umentation.\n\n   Option bits for pcre_exec()\n\n       The unused bits of the options argument for pcre_exec() must  be  zero.\n       The  only  bits  that  may  be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx,\n       PCRE_NOTBOL,   PCRE_NOTEOL,    PCRE_NOTEMPTY,    PCRE_NOTEMPTY_ATSTART,\n       PCRE_NO_START_OPTIMIZE,   PCRE_NO_UTF8_CHECK,   PCRE_PARTIAL_HARD,  and\n       PCRE_PARTIAL_SOFT.\n\n       If the pattern was successfully studied with one  of  the  just-in-time\n       (JIT) compile options, the only supported options for JIT execution are\n       PCRE_NO_UTF8_CHECK,    PCRE_NOTBOL,     PCRE_NOTEOL,     PCRE_NOTEMPTY,\n       PCRE_NOTEMPTY_ATSTART,  PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an\n       unsupported option is used, JIT execution is disabled  and  the  normal\n       interpretive code in pcre_exec() is run.\n\n         PCRE_ANCHORED\n\n       The  PCRE_ANCHORED  option  limits pcre_exec() to matching at the first\n       matching position. If a pattern was  compiled  with  PCRE_ANCHORED,  or\n       turned  out to be anchored by virtue of its contents, it cannot be made\n       unachored at matching time.\n\n         PCRE_BSR_ANYCRLF\n         PCRE_BSR_UNICODE\n\n       These options (which are mutually exclusive) control what the \\R escape\n       sequence  matches.  The choice is either to match only CR, LF, or CRLF,\n       or to match any Unicode newline sequence. These  options  override  the\n       choice that was made or defaulted when the pattern was compiled.\n\n         PCRE_NEWLINE_CR\n         PCRE_NEWLINE_LF\n         PCRE_NEWLINE_CRLF\n         PCRE_NEWLINE_ANYCRLF\n         PCRE_NEWLINE_ANY\n\n       These  options  override  the  newline  definition  that  was chosen or\n       defaulted when the pattern was compiled. For details, see the  descrip-\n       tion  of  pcre_compile()  above.  During  matching,  the newline choice\n       affects the behaviour of the dot, circumflex,  and  dollar  metacharac-\n       ters.  It may also alter the way the match position is advanced after a\n       match failure for an unanchored pattern.\n\n       When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF,  or  PCRE_NEWLINE_ANY  is\n       set,  and a match attempt for an unanchored pattern fails when the cur-\n       rent position is at a  CRLF  sequence,  and  the  pattern  contains  no\n       explicit  matches  for  CR  or  LF  characters,  the  match position is\n       advanced by two characters instead of one, in other words, to after the\n       CRLF.\n\n       The above rule is a compromise that makes the most common cases work as\n       expected. For example, if the  pattern  is  .+A  (and  the  PCRE_DOTALL\n       option is not set), it does not match the string \"\\r\\nA\" because, after\n       failing at the start, it skips both the CR and the LF before  retrying.\n       However,  the  pattern  [\\r\\n]A does match that string, because it con-\n       tains an explicit CR or LF reference, and so advances only by one char-\n       acter after the first failure.\n\n       An explicit match for CR of LF is either a literal appearance of one of\n       those characters, or one of the \\r or  \\n  escape  sequences.  Implicit\n       matches  such  as [^X] do not count, nor does \\s (which includes CR and\n       LF in the characters that it matches).\n\n       Notwithstanding the above, anomalous effects may still occur when  CRLF\n       is a valid newline sequence and explicit \\r or \\n escapes appear in the\n       pattern.\n\n         PCRE_NOTBOL\n\n       This option specifies that first character of the subject string is not\n       the  beginning  of  a  line, so the circumflex metacharacter should not\n       match before it. Setting this without PCRE_MULTILINE (at compile  time)\n       causes  circumflex  never to match. This option affects only the behav-\n       iour of the circumflex metacharacter. It does not affect \\A.\n\n         PCRE_NOTEOL\n\n       This option specifies that the end of the subject string is not the end\n       of  a line, so the dollar metacharacter should not match it nor (except\n       in multiline mode) a newline immediately before it. Setting this  with-\n       out PCRE_MULTILINE (at compile time) causes dollar never to match. This\n       option affects only the behaviour of the dollar metacharacter. It  does\n       not affect \\Z or \\z.\n\n         PCRE_NOTEMPTY\n\n       An empty string is not considered to be a valid match if this option is\n       set. If there are alternatives in the pattern, they are tried.  If  all\n       the  alternatives  match  the empty string, the entire match fails. For\n       example, if the pattern\n\n         a?b?\n\n       is applied to a string not beginning with \"a\" or  \"b\",  it  matches  an\n       empty  string at the start of the subject. With PCRE_NOTEMPTY set, this\n       match is not valid, so PCRE searches further into the string for occur-\n       rences of \"a\" or \"b\".\n\n         PCRE_NOTEMPTY_ATSTART\n\n       This  is  like PCRE_NOTEMPTY, except that an empty string match that is\n       not at the start of  the  subject  is  permitted.  If  the  pattern  is\n       anchored, such a match can occur only if the pattern contains \\K.\n\n       Perl     has    no    direct    equivalent    of    PCRE_NOTEMPTY    or\n       PCRE_NOTEMPTY_ATSTART, but it does make a special  case  of  a  pattern\n       match  of  the empty string within its split() function, and when using\n       the /g modifier. It is  possible  to  emulate  Perl's  behaviour  after\n       matching a null string by first trying the match again at the same off-\n       set with PCRE_NOTEMPTY_ATSTART and  PCRE_ANCHORED,  and  then  if  that\n       fails, by advancing the starting offset (see below) and trying an ordi-\n       nary match again. There is some code that demonstrates how to  do  this\n       in  the  pcredemo sample program. In the most general case, you have to\n       check to see if the newline convention recognizes CRLF  as  a  newline,\n       and  if so, and the current character is CR followed by LF, advance the\n       starting offset by two characters instead of one.\n\n         PCRE_NO_START_OPTIMIZE\n\n       There are a number of optimizations that pcre_exec() uses at the  start\n       of  a  match,  in  order to speed up the process. For example, if it is\n       known that an unanchored match must start with a specific character, it\n       searches  the  subject  for that character, and fails immediately if it\n       cannot find it, without actually running the  main  matching  function.\n       This means that a special item such as (*COMMIT) at the start of a pat-\n       tern is not considered until after a suitable starting  point  for  the\n       match  has been found. Also, when callouts or (*MARK) items are in use,\n       these \"start-up\" optimizations can cause them to be skipped if the pat-\n       tern is never actually used. The start-up optimizations are in effect a\n       pre-scan of the subject that takes place before the pattern is run.\n\n       The PCRE_NO_START_OPTIMIZE option disables the start-up  optimizations,\n       possibly  causing  performance  to  suffer,  but ensuring that in cases\n       where the result is \"no match\", the callouts do occur, and  that  items\n       such as (*COMMIT) and (*MARK) are considered at every possible starting\n       position in the subject string. If  PCRE_NO_START_OPTIMIZE  is  set  at\n       compile  time,  it  cannot  be  unset  at  matching  time.  The  use of\n       PCRE_NO_START_OPTIMIZE  at  matching  time  (that  is,  passing  it  to\n       pcre_exec())  disables  JIT  execution;  in this situation, matching is\n       always done using interpretively.\n\n       Setting PCRE_NO_START_OPTIMIZE can change the  outcome  of  a  matching\n       operation.  Consider the pattern\n\n         (*COMMIT)ABC\n\n       When  this  is  compiled, PCRE records the fact that a match must start\n       with the character \"A\". Suppose the subject  string  is  \"DEFABC\".  The\n       start-up  optimization  scans along the subject, finds \"A\" and runs the\n       first match attempt from there. The (*COMMIT) item means that the  pat-\n       tern  must  match the current starting position, which in this case, it\n       does. However, if the same match  is  run  with  PCRE_NO_START_OPTIMIZE\n       set,  the  initial  scan  along the subject string does not happen. The\n       first match attempt is run starting  from  \"D\"  and  when  this  fails,\n       (*COMMIT)  prevents  any  further  matches  being tried, so the overall\n       result is \"no match\". If the pattern is studied,  more  start-up  opti-\n       mizations  may  be  used. For example, a minimum length for the subject\n       may be recorded. Consider the pattern\n\n         (*MARK:A)(X|Y)\n\n       The minimum length for a match is one  character.  If  the  subject  is\n       \"ABC\",  there  will  be  attempts  to  match \"ABC\", \"BC\", \"C\", and then\n       finally an empty string.  If the pattern is studied, the final  attempt\n       does  not take place, because PCRE knows that the subject is too short,\n       and so the (*MARK) is never encountered.  In this  case,  studying  the\n       pattern  does  not  affect the overall match result, which is still \"no\n       match\", but it does affect the auxiliary information that is returned.\n\n         PCRE_NO_UTF8_CHECK\n\n       When PCRE_UTF8 is set at compile time, the validity of the subject as a\n       UTF-8  string is automatically checked when pcre_exec() is subsequently\n       called.  The entire string is checked before any other processing takes\n       place.  The  value  of  startoffset  is  also checked to ensure that it\n       points to the start of a UTF-8 character. There is a  discussion  about\n       the  validity  of  UTF-8 strings in the pcreunicode page. If an invalid\n       sequence  of  bytes   is   found,   pcre_exec()   returns   the   error\n       PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a\n       truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In\n       both  cases, information about the precise nature of the error may also\n       be returned (see the descriptions of these errors in the section  enti-\n       tled  Error return values from pcre_exec() below).  If startoffset con-\n       tains a value that does not point to the start of a UTF-8 character (or\n       to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned.\n\n       If  you  already  know that your subject is valid, and you want to skip\n       these   checks   for   performance   reasons,   you   can    set    the\n       PCRE_NO_UTF8_CHECK  option  when calling pcre_exec(). You might want to\n       do this for the second and subsequent calls to pcre_exec() if  you  are\n       making  repeated  calls  to  find  all  the matches in a single subject\n       string. However, you should be  sure  that  the  value  of  startoffset\n       points  to  the  start of a character (or the end of the subject). When\n       PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a\n       subject  or  an invalid value of startoffset is undefined. Your program\n       may crash or loop.\n\n         PCRE_PARTIAL_HARD\n         PCRE_PARTIAL_SOFT\n\n       These options turn on the partial matching feature. For backwards  com-\n       patibility,  PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial\n       match occurs if the end of the subject string is reached  successfully,\n       but  there  are not enough subject characters to complete the match. If\n       this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set,\n       matching  continues  by  testing any remaining alternatives. Only if no\n       complete match can be found is PCRE_ERROR_PARTIAL returned  instead  of\n       PCRE_ERROR_NOMATCH.  In  other  words,  PCRE_PARTIAL_SOFT says that the\n       caller is prepared to handle a partial match, but only if  no  complete\n       match can be found.\n\n       If  PCRE_PARTIAL_HARD  is  set, it overrides PCRE_PARTIAL_SOFT. In this\n       case, if a partial match  is  found,  pcre_exec()  immediately  returns\n       PCRE_ERROR_PARTIAL,  without  considering  any  other  alternatives. In\n       other words, when PCRE_PARTIAL_HARD is set, a partial match is  consid-\n       ered to be more important that an alternative complete match.\n\n       In  both  cases,  the portion of the string that was inspected when the\n       partial match was found is set as the first matching string. There is a\n       more  detailed  discussion  of partial and multi-segment matching, with\n       examples, in the pcrepartial documentation.\n\n   The string to be matched by pcre_exec()\n\n       The subject string is passed to pcre_exec() as a pointer in subject,  a\n       length  in  length, and a starting offset in startoffset. The units for\n       length and startoffset are bytes for the  8-bit  library,  16-bit  data\n       items  for  the  16-bit  library,  and 32-bit data items for the 32-bit\n       library.\n\n       If startoffset is negative or greater than the length of  the  subject,\n       pcre_exec()  returns  PCRE_ERROR_BADOFFSET. When the starting offset is\n       zero, the search for a match starts at the beginning  of  the  subject,\n       and  this  is by far the most common case. In UTF-8 or UTF-16 mode, the\n       offset must point to the start of a character, or the end of  the  sub-\n       ject  (in  UTF-32 mode, one data unit equals one character, so all off-\n       sets are valid). Unlike the pattern string,  the  subject  may  contain\n       binary zeroes.\n\n       A  non-zero  starting offset is useful when searching for another match\n       in the same subject by calling pcre_exec() again after a previous  suc-\n       cess.   Setting  startoffset differs from just passing over a shortened\n       string and setting PCRE_NOTBOL in the case of  a  pattern  that  begins\n       with any kind of lookbehind. For example, consider the pattern\n\n         \\Biss\\B\n\n       which  finds  occurrences  of \"iss\" in the middle of words. (\\B matches\n       only if the current position in the subject is not  a  word  boundary.)\n       When  applied  to the string \"Mississipi\" the first call to pcre_exec()\n       finds the first occurrence. If pcre_exec() is called  again  with  just\n       the  remainder  of  the  subject,  namely  \"issipi\", it does not match,\n       because \\B is always false at the start of the subject, which is deemed\n       to  be  a  word  boundary. However, if pcre_exec() is passed the entire\n       string again, but with startoffset set to 4, it finds the second occur-\n       rence  of \"iss\" because it is able to look behind the starting point to\n       discover that it is preceded by a letter.\n\n       Finding all the matches in a subject is tricky  when  the  pattern  can\n       match an empty string. It is possible to emulate Perl's /g behaviour by\n       first  trying  the  match  again  at  the   same   offset,   with   the\n       PCRE_NOTEMPTY_ATSTART  and  PCRE_ANCHORED  options,  and  then  if that\n       fails, advancing the starting  offset  and  trying  an  ordinary  match\n       again. There is some code that demonstrates how to do this in the pcre-\n       demo sample program. In the most general case, you have to check to see\n       if  the newline convention recognizes CRLF as a newline, and if so, and\n       the current character is CR followed by LF, advance the starting offset\n       by two characters instead of one.\n\n       If  a  non-zero starting offset is passed when the pattern is anchored,\n       one attempt to match at the given offset is made. This can only succeed\n       if  the  pattern  does  not require the match to be at the start of the\n       subject.\n\n   How pcre_exec() returns captured substrings\n\n       In general, a pattern matches a certain portion of the subject, and  in\n       addition,  further  substrings  from  the  subject may be picked out by\n       parts of the pattern. Following the usage  in  Jeffrey  Friedl's  book,\n       this  is  called \"capturing\" in what follows, and the phrase \"capturing\n       subpattern\" is used for a fragment of a pattern that picks out  a  sub-\n       string.  PCRE  supports several other kinds of parenthesized subpattern\n       that do not cause substrings to be captured.\n\n       Captured substrings are returned to the caller via a vector of integers\n       whose  address is passed in ovector. The number of elements in the vec-\n       tor is passed in ovecsize, which must be a non-negative  number.  Note:\n       this argument is NOT the size of ovector in bytes.\n\n       The  first  two-thirds of the vector is used to pass back captured sub-\n       strings, each substring using a pair of integers. The  remaining  third\n       of  the  vector is used as workspace by pcre_exec() while matching cap-\n       turing subpatterns, and is not available for passing back  information.\n       The  number passed in ovecsize should always be a multiple of three. If\n       it is not, it is rounded down.\n\n       When a match is successful, information about  captured  substrings  is\n       returned  in  pairs  of integers, starting at the beginning of ovector,\n       and continuing up to two-thirds of its length at the  most.  The  first\n       element  of  each pair is set to the offset of the first character in a\n       substring, and the second is set to the offset of the  first  character\n       after  the  end  of a substring. These values are always data unit off-\n       sets, even in UTF mode. They are byte offsets  in  the  8-bit  library,\n       16-bit  data  item  offsets in the 16-bit library, and 32-bit data item\n       offsets in the 32-bit library. Note: they are not character counts.\n\n       The first pair of integers, ovector[0]  and  ovector[1],  identify  the\n       portion  of  the subject string matched by the entire pattern. The next\n       pair is used for the first capturing subpattern, and so on.  The  value\n       returned by pcre_exec() is one more than the highest numbered pair that\n       has been set.  For example, if two substrings have been  captured,  the\n       returned  value is 3. If there are no capturing subpatterns, the return\n       value from a successful match is 1, indicating that just the first pair\n       of offsets has been set.\n\n       If a capturing subpattern is matched repeatedly, it is the last portion\n       of the string that it matched that is returned.\n\n       If the vector is too small to hold all the captured substring  offsets,\n       it is used as far as possible (up to two-thirds of its length), and the\n       function returns a value of zero. If neither the actual string  matched\n       nor  any captured substrings are of interest, pcre_exec() may be called\n       with ovector passed as NULL and ovecsize as zero. However, if the  pat-\n       tern  contains  back  references  and  the ovector is not big enough to\n       remember the related substrings, PCRE has to get additional memory  for\n       use  during matching. Thus it is usually advisable to supply an ovector\n       of reasonable size.\n\n       There are some cases where zero is returned  (indicating  vector  over-\n       flow)  when  in fact the vector is exactly the right size for the final\n       match. For example, consider the pattern\n\n         (a)(?:(b)c|bd)\n\n       If a vector of 6 elements (allowing for only 1 captured  substring)  is\n       given with subject string \"abd\", pcre_exec() will try to set the second\n       captured string, thereby recording a vector overflow, before failing to\n       match  \"c\"  and  backing  up  to  try  the second alternative. The zero\n       return, however, does correctly indicate that  the  maximum  number  of\n       slots (namely 2) have been filled. In similar cases where there is tem-\n       porary overflow, but the final number of used slots  is  actually  less\n       than the maximum, a non-zero value is returned.\n\n       The pcre_fullinfo() function can be used to find out how many capturing\n       subpatterns there are in a compiled  pattern.  The  smallest  size  for\n       ovector  that  will allow for n captured substrings, in addition to the\n       offsets of the substring matched by the whole pattern, is (n+1)*3.\n\n       It is possible for capturing subpattern number n+1 to match  some  part\n       of the subject when subpattern n has not been used at all. For example,\n       if the string \"abc\" is matched  against  the  pattern  (a|(z))(bc)  the\n       return from the function is 4, and subpatterns 1 and 3 are matched, but\n       2 is not. When this happens, both values in  the  offset  pairs  corre-\n       sponding to unused subpatterns are set to -1.\n\n       Offset  values  that correspond to unused subpatterns at the end of the\n       expression are also set to -1. For example,  if  the  string  \"abc\"  is\n       matched  against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not\n       matched. The return from the function is 2, because  the  highest  used\n       capturing  subpattern  number  is 1, and the offsets for for the second\n       and third capturing subpatterns (assuming the vector is  large  enough,\n       of course) are set to -1.\n\n       Note:  Elements  in  the first two-thirds of ovector that do not corre-\n       spond to capturing parentheses in the pattern are never  changed.  That\n       is,  if  a pattern contains n capturing parentheses, no more than ovec-\n       tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements  (in\n       the first two-thirds) retain whatever values they previously had.\n\n       Some  convenience  functions  are  provided for extracting the captured\n       substrings as separate strings. These are described below.\n\n   Error return values from pcre_exec()\n\n       If pcre_exec() fails, it returns a negative number. The  following  are\n       defined in the header file:\n\n         PCRE_ERROR_NOMATCH        (-1)\n\n       The subject string did not match the pattern.\n\n         PCRE_ERROR_NULL           (-2)\n\n       Either  code  or  subject  was  passed as NULL, or ovector was NULL and\n       ovecsize was not zero.\n\n         PCRE_ERROR_BADOPTION      (-3)\n\n       An unrecognized bit was set in the options argument.\n\n         PCRE_ERROR_BADMAGIC       (-4)\n\n       PCRE stores a 4-byte \"magic number\" at the start of the compiled  code,\n       to catch the case when it is passed a junk pointer and to detect when a\n       pattern that was compiled in an environment of one endianness is run in\n       an  environment  with the other endianness. This is the error that PCRE\n       gives when the magic number is not present.\n\n         PCRE_ERROR_UNKNOWN_OPCODE (-5)\n\n       While running the pattern match, an unknown item was encountered in the\n       compiled  pattern.  This  error  could be caused by a bug in PCRE or by\n       overwriting of the compiled pattern.\n\n         PCRE_ERROR_NOMEMORY       (-6)\n\n       If a pattern contains back references, but the ovector that  is  passed\n       to pcre_exec() is not big enough to remember the referenced substrings,\n       PCRE gets a block of memory at the start of matching to  use  for  this\n       purpose.  If the call via pcre_malloc() fails, this error is given. The\n       memory is automatically freed at the end of matching.\n\n       This error is also given if pcre_stack_malloc() fails  in  pcre_exec().\n       This  can happen only when PCRE has been compiled with --disable-stack-\n       for-recursion.\n\n         PCRE_ERROR_NOSUBSTRING    (-7)\n\n       This error is used by the pcre_copy_substring(),  pcre_get_substring(),\n       and  pcre_get_substring_list()  functions  (see  below).  It  is  never\n       returned by pcre_exec().\n\n         PCRE_ERROR_MATCHLIMIT     (-8)\n\n       The backtracking limit, as specified by  the  match_limit  field  in  a\n       pcre_extra  structure  (or  defaulted) was reached. See the description\n       above.\n\n         PCRE_ERROR_CALLOUT        (-9)\n\n       This error is never generated by pcre_exec() itself. It is provided for\n       use  by  callout functions that want to yield a distinctive error code.\n       See the pcrecallout documentation for details.\n\n         PCRE_ERROR_BADUTF8        (-10)\n\n       A string that contains an invalid UTF-8 byte sequence was passed  as  a\n       subject,  and the PCRE_NO_UTF8_CHECK option was not set. If the size of\n       the output vector (ovecsize) is at least 2,  the  byte  offset  to  the\n       start  of  the  the invalid UTF-8 character is placed in the first ele-\n       ment, and a reason code is placed in the  second  element.  The  reason\n       codes are listed in the following section.  For backward compatibility,\n       if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8  char-\n       acter   at   the   end   of   the   subject  (reason  codes  1  to  5),\n       PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.\n\n         PCRE_ERROR_BADUTF8_OFFSET (-11)\n\n       The UTF-8 byte sequence that was passed as a subject  was  checked  and\n       found  to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the\n       value of startoffset did not point to the beginning of a UTF-8  charac-\n       ter or the end of the subject.\n\n         PCRE_ERROR_PARTIAL        (-12)\n\n       The  subject  string did not match, but it did match partially. See the\n       pcrepartial documentation for details of partial matching.\n\n         PCRE_ERROR_BADPARTIAL     (-13)\n\n       This code is no longer in  use.  It  was  formerly  returned  when  the\n       PCRE_PARTIAL  option  was used with a compiled pattern containing items\n       that were  not  supported  for  partial  matching.  From  release  8.00\n       onwards, there are no restrictions on partial matching.\n\n         PCRE_ERROR_INTERNAL       (-14)\n\n       An  unexpected  internal error has occurred. This error could be caused\n       by a bug in PCRE or by overwriting of the compiled pattern.\n\n         PCRE_ERROR_BADCOUNT       (-15)\n\n       This error is given if the value of the ovecsize argument is negative.\n\n         PCRE_ERROR_RECURSIONLIMIT (-21)\n\n       The internal recursion limit, as specified by the match_limit_recursion\n       field  in  a  pcre_extra  structure (or defaulted) was reached. See the\n       description above.\n\n         PCRE_ERROR_BADNEWLINE     (-23)\n\n       An invalid combination of PCRE_NEWLINE_xxx options was given.\n\n         PCRE_ERROR_BADOFFSET      (-24)\n\n       The value of startoffset was negative or greater than the length of the\n       subject, that is, the value in length.\n\n         PCRE_ERROR_SHORTUTF8      (-25)\n\n       This  error  is returned instead of PCRE_ERROR_BADUTF8 when the subject\n       string ends with a truncated UTF-8 character and the  PCRE_PARTIAL_HARD\n       option  is  set.   Information  about  the  failure  is returned as for\n       PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this  case,  but\n       this  special error code for PCRE_PARTIAL_HARD precedes the implementa-\n       tion of returned information; it is retained for backwards  compatibil-\n       ity.\n\n         PCRE_ERROR_RECURSELOOP    (-26)\n\n       This error is returned when pcre_exec() detects a recursion loop within\n       the pattern. Specifically, it means that either the whole pattern or  a\n       subpattern  has been called recursively for the second time at the same\n       position in the subject string. Some simple patterns that might do this\n       are  detected  and faulted at compile time, but more complicated cases,\n       in particular mutual recursions between two different subpatterns, can-\n       not be detected until run time.\n\n         PCRE_ERROR_JIT_STACKLIMIT (-27)\n\n       This  error  is  returned  when a pattern that was successfully studied\n       using a JIT compile option is being matched, but the  memory  available\n       for  the  just-in-time  processing  stack  is not large enough. See the\n       pcrejit documentation for more details.\n\n         PCRE_ERROR_BADMODE        (-28)\n\n       This error is given if a pattern that was compiled by the 8-bit library\n       is passed to a 16-bit or 32-bit library function, or vice versa.\n\n         PCRE_ERROR_BADENDIANNESS  (-29)\n\n       This  error  is  given  if  a  pattern  that  was compiled and saved is\n       reloaded on a host with  different  endianness.  The  utility  function\n       pcre_pattern_to_host_byte_order() can be used to convert such a pattern\n       so that it runs on the new host.\n\n         PCRE_ERROR_JIT_BADOPTION\n\n       This error is returned when a pattern  that  was  successfully  studied\n       using  a  JIT  compile  option  is being matched, but the matching mode\n       (partial or complete match) does not correspond to any JIT  compilation\n       mode.  When  the JIT fast path function is used, this error may be also\n       given for invalid options.  See  the  pcrejit  documentation  for  more\n       details.\n\n         PCRE_ERROR_BADLENGTH      (-32)\n\n       This  error is given if pcre_exec() is called with a negative value for\n       the length argument.\n\n       Error numbers -16 to -20, -22, and 30 are not used by pcre_exec().\n\n   Reason codes for invalid UTF-8 strings\n\n       This section applies only  to  the  8-bit  library.  The  corresponding\n       information  for the 16-bit and 32-bit libraries is given in the pcre16\n       and pcre32 pages.\n\n       When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT-\n       UTF8,  and  the size of the output vector (ovecsize) is at least 2, the\n       offset of the start of the invalid UTF-8 character  is  placed  in  the\n       first output vector element (ovector[0]) and a reason code is placed in\n       the second element (ovector[1]). The reason codes are  given  names  in\n       the pcre.h header file:\n\n         PCRE_UTF8_ERR1\n         PCRE_UTF8_ERR2\n         PCRE_UTF8_ERR3\n         PCRE_UTF8_ERR4\n         PCRE_UTF8_ERR5\n\n       The  string  ends  with a truncated UTF-8 character; the code specifies\n       how many bytes are missing (1 to 5). Although RFC 3629 restricts  UTF-8\n       characters  to  be  no longer than 4 bytes, the encoding scheme (origi-\n       nally defined by RFC 2279) allows for  up  to  6  bytes,  and  this  is\n       checked first; hence the possibility of 4 or 5 missing bytes.\n\n         PCRE_UTF8_ERR6\n         PCRE_UTF8_ERR7\n         PCRE_UTF8_ERR8\n         PCRE_UTF8_ERR9\n         PCRE_UTF8_ERR10\n\n       The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of\n       the character do not have the binary value 0b10 (that  is,  either  the\n       most significant bit is 0, or the next bit is 1).\n\n         PCRE_UTF8_ERR11\n         PCRE_UTF8_ERR12\n\n       A  character that is valid by the RFC 2279 rules is either 5 or 6 bytes\n       long; these code points are excluded by RFC 3629.\n\n         PCRE_UTF8_ERR13\n\n       A 4-byte character has a value greater than 0x10fff; these code  points\n       are excluded by RFC 3629.\n\n         PCRE_UTF8_ERR14\n\n       A  3-byte  character  has  a  value in the range 0xd800 to 0xdfff; this\n       range of code points are reserved by RFC 3629 for use with UTF-16,  and\n       so are excluded from UTF-8.\n\n         PCRE_UTF8_ERR15\n         PCRE_UTF8_ERR16\n         PCRE_UTF8_ERR17\n         PCRE_UTF8_ERR18\n         PCRE_UTF8_ERR19\n\n       A  2-, 3-, 4-, 5-, or 6-byte character is \"overlong\", that is, it codes\n       for a value that can be represented by fewer bytes, which  is  invalid.\n       For  example,  the two bytes 0xc0, 0xae give the value 0x2e, whose cor-\n       rect coding uses just one byte.\n\n         PCRE_UTF8_ERR20\n\n       The two most significant bits of the first byte of a character have the\n       binary  value 0b10 (that is, the most significant bit is 1 and the sec-\n       ond is 0). Such a byte can only validly occur as the second  or  subse-\n       quent byte of a multi-byte character.\n\n         PCRE_UTF8_ERR21\n\n       The  first byte of a character has the value 0xfe or 0xff. These values\n       can never occur in a valid UTF-8 string.\n\n         PCRE_UTF8_ERR22\n\n       This error code was formerly used when  the  presence  of  a  so-called\n       \"non-character\"  caused an error. Unicode corrigendum #9 makes it clear\n       that such characters should not cause a string to be rejected,  and  so\n       this code is no longer in use and is never returned.\n\n\nEXTRACTING CAPTURED SUBSTRINGS BY NUMBER\n\n       int pcre_copy_substring(const char *subject, int *ovector,\n            int stringcount, int stringnumber, char *buffer,\n            int buffersize);\n\n       int pcre_get_substring(const char *subject, int *ovector,\n            int stringcount, int stringnumber,\n            const char **stringptr);\n\n       int pcre_get_substring_list(const char *subject,\n            int *ovector, int stringcount, const char ***listptr);\n\n       Captured  substrings  can  be  accessed  directly  by using the offsets\n       returned by pcre_exec() in  ovector.  For  convenience,  the  functions\n       pcre_copy_substring(),    pcre_get_substring(),    and    pcre_get_sub-\n       string_list() are provided for extracting captured substrings  as  new,\n       separate,  zero-terminated strings. These functions identify substrings\n       by number. The next section describes functions  for  extracting  named\n       substrings.\n\n       A  substring that contains a binary zero is correctly extracted and has\n       a further zero added on the end, but the result is not, of course, a  C\n       string.   However,  you  can  process such a string by referring to the\n       length that is  returned  by  pcre_copy_substring()  and  pcre_get_sub-\n       string().  Unfortunately, the interface to pcre_get_substring_list() is\n       not adequate for handling strings containing binary zeros, because  the\n       end of the final string is not independently indicated.\n\n       The  first  three  arguments  are the same for all three of these func-\n       tions: subject is the subject string that has  just  been  successfully\n       matched, ovector is a pointer to the vector of integer offsets that was\n       passed to pcre_exec(), and stringcount is the number of substrings that\n       were  captured  by  the match, including the substring that matched the\n       entire regular expression. This is the value returned by pcre_exec() if\n       it  is greater than zero. If pcre_exec() returned zero, indicating that\n       it ran out of space in ovector, the value passed as stringcount  should\n       be the number of elements in the vector divided by three.\n\n       The  functions pcre_copy_substring() and pcre_get_substring() extract a\n       single substring, whose number is given as  stringnumber.  A  value  of\n       zero  extracts  the  substring that matched the entire pattern, whereas\n       higher values  extract  the  captured  substrings.  For  pcre_copy_sub-\n       string(),  the  string  is  placed  in buffer, whose length is given by\n       buffersize, while for pcre_get_substring() a new  block  of  memory  is\n       obtained  via  pcre_malloc,  and its address is returned via stringptr.\n       The yield of the function is the length of the  string,  not  including\n       the terminating zero, or one of these error codes:\n\n         PCRE_ERROR_NOMEMORY       (-6)\n\n       The  buffer  was too small for pcre_copy_substring(), or the attempt to\n       get memory failed for pcre_get_substring().\n\n         PCRE_ERROR_NOSUBSTRING    (-7)\n\n       There is no substring whose number is stringnumber.\n\n       The pcre_get_substring_list()  function  extracts  all  available  sub-\n       strings  and  builds  a list of pointers to them. All this is done in a\n       single block of memory that is obtained via pcre_malloc. The address of\n       the  memory  block  is returned via listptr, which is also the start of\n       the list of string pointers. The end of the list is marked  by  a  NULL\n       pointer.  The  yield  of  the function is zero if all went well, or the\n       error code\n\n         PCRE_ERROR_NOMEMORY       (-6)\n\n       if the attempt to get the memory block failed.\n\n       When any of these functions encounter a substring that is unset,  which\n       can  happen  when  capturing subpattern number n+1 matches some part of\n       the subject, but subpattern n has not been used at all, they return  an\n       empty string. This can be distinguished from a genuine zero-length sub-\n       string by inspecting the appropriate offset in ovector, which is  nega-\n       tive for unset substrings.\n\n       The  two convenience functions pcre_free_substring() and pcre_free_sub-\n       string_list() can be used to free the memory  returned  by  a  previous\n       call  of  pcre_get_substring()  or  pcre_get_substring_list(),  respec-\n       tively. They do nothing more than  call  the  function  pointed  to  by\n       pcre_free,  which  of course could be called directly from a C program.\n       However, PCRE is used in some situations where it is linked via a  spe-\n       cial   interface  to  another  programming  language  that  cannot  use\n       pcre_free directly; it is for these cases that the functions  are  pro-\n       vided.\n\n\nEXTRACTING CAPTURED SUBSTRINGS BY NAME\n\n       int pcre_get_stringnumber(const pcre *code,\n            const char *name);\n\n       int pcre_copy_named_substring(const pcre *code,\n            const char *subject, int *ovector,\n            int stringcount, const char *stringname,\n            char *buffer, int buffersize);\n\n       int pcre_get_named_substring(const pcre *code,\n            const char *subject, int *ovector,\n            int stringcount, const char *stringname,\n            const char **stringptr);\n\n       To  extract a substring by name, you first have to find associated num-\n       ber.  For example, for this pattern\n\n         (a+)b(?<xxx>\\d+)...\n\n       the number of the subpattern called \"xxx\" is 2. If the name is known to\n       be unique (PCRE_DUPNAMES was not set), you can find the number from the\n       name by calling pcre_get_stringnumber(). The first argument is the com-\n       piled pattern, and the second is the name. The yield of the function is\n       the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if  there  is  no\n       subpattern of that name.\n\n       Given the number, you can extract the substring directly, or use one of\n       the functions described in the previous section. For convenience, there\n       are also two functions that do the whole job.\n\n       Most    of    the    arguments   of   pcre_copy_named_substring()   and\n       pcre_get_named_substring() are the same  as  those  for  the  similarly\n       named  functions  that extract by number. As these are described in the\n       previous section, they are not re-described here. There  are  just  two\n       differences:\n\n       First,  instead  of a substring number, a substring name is given. Sec-\n       ond, there is an extra argument, given at the start, which is a pointer\n       to  the compiled pattern. This is needed in order to gain access to the\n       name-to-number translation table.\n\n       These functions call pcre_get_stringnumber(), and if it succeeds,  they\n       then  call  pcre_copy_substring() or pcre_get_substring(), as appropri-\n       ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate  names,  the\n       behaviour may not be what you want (see the next section).\n\n       Warning: If the pattern uses the (?| feature to set up multiple subpat-\n       terns with the same number, as described in the  section  on  duplicate\n       subpattern  numbers  in  the  pcrepattern page, you cannot use names to\n       distinguish the different subpatterns, because names are  not  included\n       in  the compiled code. The matching process uses only numbers. For this\n       reason, the use of different names for subpatterns of the  same  number\n       causes an error at compile time.\n\n\nDUPLICATE SUBPATTERN NAMES\n\n       int pcre_get_stringtable_entries(const pcre *code,\n            const char *name, char **first, char **last);\n\n       When  a  pattern  is  compiled with the PCRE_DUPNAMES option, names for\n       subpatterns are not required to be unique. (Duplicate names are  always\n       allowed  for subpatterns with the same number, created by using the (?|\n       feature. Indeed, if such subpatterns are named, they  are  required  to\n       use the same names.)\n\n       Normally, patterns with duplicate names are such that in any one match,\n       only one of the named subpatterns participates. An example is shown  in\n       the pcrepattern documentation.\n\n       When    duplicates   are   present,   pcre_copy_named_substring()   and\n       pcre_get_named_substring() return the first substring corresponding  to\n       the  given  name  that  is set. If none are set, PCRE_ERROR_NOSUBSTRING\n       (-7) is returned; no  data  is  returned.  The  pcre_get_stringnumber()\n       function  returns one of the numbers that are associated with the name,\n       but it is not defined which it is.\n\n       If you want to get full details of all captured substrings for a  given\n       name,  you  must  use  the pcre_get_stringtable_entries() function. The\n       first argument is the compiled pattern, and the second is the name. The\n       third  and  fourth  are  pointers to variables which are updated by the\n       function. After it has run, they point to the first and last entries in\n       the  name-to-number  table  for  the  given  name.  The function itself\n       returns the length of each entry,  or  PCRE_ERROR_NOSUBSTRING  (-7)  if\n       there  are none. The format of the table is described above in the sec-\n       tion entitled Information about a pattern above.  Given all  the  rele-\n       vant  entries  for the name, you can extract each of their numbers, and\n       hence the captured data, if any.\n\n\nFINDING ALL POSSIBLE MATCHES\n\n       The traditional matching function uses a  similar  algorithm  to  Perl,\n       which stops when it finds the first match, starting at a given point in\n       the subject. If you want to find all possible matches, or  the  longest\n       possible  match,  consider using the alternative matching function (see\n       below) instead. If you cannot use the alternative function,  but  still\n       need  to  find all possible matches, you can kludge it up by making use\n       of the callout facility, which is described in the pcrecallout documen-\n       tation.\n\n       What you have to do is to insert a callout right at the end of the pat-\n       tern.  When your callout function is called, extract and save the  cur-\n       rent  matched  substring.  Then  return  1, which forces pcre_exec() to\n       backtrack and try other alternatives. Ultimately, when it runs  out  of\n       matches, pcre_exec() will yield PCRE_ERROR_NOMATCH.\n\n\nOBTAINING AN ESTIMATE OF STACK USAGE\n\n       Matching  certain  patterns  using pcre_exec() can use a lot of process\n       stack, which in certain environments can be  rather  limited  in  size.\n       Some  users  find it helpful to have an estimate of the amount of stack\n       that is used by pcre_exec(), to help  them  set  recursion  limits,  as\n       described  in  the pcrestack documentation. The estimate that is output\n       by pcretest when called with the -m and -C options is obtained by call-\n       ing  pcre_exec with the values NULL, NULL, NULL, -999, and -999 for its\n       first five arguments.\n\n       Normally, if  its  first  argument  is  NULL,  pcre_exec()  immediately\n       returns  the negative error code PCRE_ERROR_NULL, but with this special\n       combination of arguments, it returns instead a  negative  number  whose\n       absolute  value  is the approximate stack frame size in bytes. (A nega-\n       tive number is used so that it is clear that no  match  has  happened.)\n       The  value  is  approximate  because  in some cases, recursive calls to\n       pcre_exec() occur when there are one or two additional variables on the\n       stack.\n\n       If  PCRE  has  been  compiled  to use the heap instead of the stack for\n       recursion, the value returned  is  the  size  of  each  block  that  is\n       obtained from the heap.\n\n\nMATCHING A PATTERN: THE ALTERNATIVE FUNCTION\n\n       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,\n            const char *subject, int length, int startoffset,\n            int options, int *ovector, int ovecsize,\n            int *workspace, int wscount);\n\n       The  function  pcre_dfa_exec()  is  called  to  match  a subject string\n       against a compiled pattern, using a matching algorithm that  scans  the\n       subject  string  just  once, and does not backtrack. This has different\n       characteristics to the normal algorithm, and  is  not  compatible  with\n       Perl.  Some  of the features of PCRE patterns are not supported. Never-\n       theless, there are times when this kind of matching can be useful.  For\n       a  discussion  of  the  two matching algorithms, and a list of features\n       that pcre_dfa_exec() does not support, see the pcrematching  documenta-\n       tion.\n\n       The  arguments  for  the  pcre_dfa_exec()  function are the same as for\n       pcre_exec(), plus two extras. The ovector argument is used in a differ-\n       ent  way,  and  this is described below. The other common arguments are\n       used in the same way as for pcre_exec(), so their  description  is  not\n       repeated here.\n\n       The  two  additional  arguments provide workspace for the function. The\n       workspace vector should contain at least 20 elements. It  is  used  for\n       keeping  track  of  multiple  paths  through  the  pattern  tree.  More\n       workspace will be needed for patterns and subjects where  there  are  a\n       lot of potential matches.\n\n       Here is an example of a simple call to pcre_dfa_exec():\n\n         int rc;\n         int ovector[10];\n         int wspace[20];\n         rc = pcre_dfa_exec(\n           re,             /* result of pcre_compile() */\n           NULL,           /* we didn't study the pattern */\n           \"some string\",  /* the subject string */\n           11,             /* the length of the subject string */\n           0,              /* start at offset 0 in the subject */\n           0,              /* default options */\n           ovector,        /* vector of integers for substring information */\n           10,             /* number of elements (NOT size in bytes) */\n           wspace,         /* working space vector */\n           20);            /* number of elements (NOT size in bytes) */\n\n   Option bits for pcre_dfa_exec()\n\n       The  unused  bits  of  the options argument for pcre_dfa_exec() must be\n       zero. The only bits  that  may  be  set  are  PCRE_ANCHORED,  PCRE_NEW-\n       LINE_xxx,        PCRE_NOTBOL,        PCRE_NOTEOL,        PCRE_NOTEMPTY,\n       PCRE_NOTEMPTY_ATSTART,      PCRE_NO_UTF8_CHECK,       PCRE_BSR_ANYCRLF,\n       PCRE_BSR_UNICODE,  PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD, PCRE_PAR-\n       TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART.  All but  the  last\n       four  of  these  are  exactly  the  same  as  for pcre_exec(), so their\n       description is not repeated here.\n\n         PCRE_PARTIAL_HARD\n         PCRE_PARTIAL_SOFT\n\n       These have the same general effect as they do for pcre_exec(), but  the\n       details  are  slightly  different.  When  PCRE_PARTIAL_HARD  is set for\n       pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of  the  sub-\n       ject  is  reached  and there is still at least one matching possibility\n       that requires additional characters. This happens even if some complete\n       matches have also been found. When PCRE_PARTIAL_SOFT is set, the return\n       code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end\n       of  the  subject  is  reached, there have been no complete matches, but\n       there is still at least one matching possibility. The  portion  of  the\n       string  that  was inspected when the longest partial match was found is\n       set as the first matching string  in  both  cases.   There  is  a  more\n       detailed  discussion  of partial and multi-segment matching, with exam-\n       ples, in the pcrepartial documentation.\n\n         PCRE_DFA_SHORTEST\n\n       Setting the PCRE_DFA_SHORTEST option causes the matching  algorithm  to\n       stop as soon as it has found one match. Because of the way the alterna-\n       tive algorithm works, this is necessarily the shortest  possible  match\n       at the first possible matching point in the subject string.\n\n         PCRE_DFA_RESTART\n\n       When pcre_dfa_exec() returns a partial match, it is possible to call it\n       again, with additional subject characters, and have  it  continue  with\n       the  same match. The PCRE_DFA_RESTART option requests this action; when\n       it is set, the workspace and wscount options must  reference  the  same\n       vector  as  before  because data about the match so far is left in them\n       after a partial match. There is more discussion of this facility in the\n       pcrepartial documentation.\n\n   Successful returns from pcre_dfa_exec()\n\n       When  pcre_dfa_exec()  succeeds, it may have matched more than one sub-\n       string in the subject. Note, however, that all the matches from one run\n       of  the  function  start  at the same point in the subject. The shorter\n       matches are all initial substrings of the longer matches. For  example,\n       if the pattern\n\n         <.*>\n\n       is matched against the string\n\n         This is <something> <something else> <something further> no more\n\n       the three matched strings are\n\n         <something>\n         <something> <something else>\n         <something> <something else> <something further>\n\n       On  success,  the  yield of the function is a number greater than zero,\n       which is the number of matched substrings.  The  substrings  themselves\n       are  returned  in  ovector. Each string uses two elements; the first is\n       the offset to the start, and the second is the offset to  the  end.  In\n       fact,  all  the  strings  have the same start offset. (Space could have\n       been saved by giving this only once, but it was decided to retain  some\n       compatibility  with  the  way pcre_exec() returns data, even though the\n       meaning of the strings is different.)\n\n       The strings are returned in reverse order of length; that is, the long-\n       est  matching  string is given first. If there were too many matches to\n       fit into ovector, the yield of the function is zero, and the vector  is\n       filled  with  the  longest matches. Unlike pcre_exec(), pcre_dfa_exec()\n       can use the entire ovector for returning matched strings.\n\n       NOTE: PCRE's \"auto-possessification\" optimization  usually  applies  to\n       character  repeats at the end of a pattern (as well as internally). For\n       example, the pattern \"a\\d+\" is compiled as if it were  \"a\\d++\"  because\n       there is no point even considering the possibility of backtracking into\n       the repeated digits. For DFA matching, this means that only one  possi-\n       ble  match  is  found.  If  you really do want multiple matches in such\n       cases,  either  use  an  ungreedy   repeat   (\"a\\d+?\")   or   set   the\n       PCRE_NO_AUTO_POSSESS option when compiling.\n\n   Error returns from pcre_dfa_exec()\n\n       The  pcre_dfa_exec()  function returns a negative number when it fails.\n       Many of the errors are the same  as  for  pcre_exec(),  and  these  are\n       described  above.   There are in addition the following errors that are\n       specific to pcre_dfa_exec():\n\n         PCRE_ERROR_DFA_UITEM      (-16)\n\n       This return is given if pcre_dfa_exec() encounters an item in the  pat-\n       tern  that  it  does not support, for instance, the use of \\C or a back\n       reference.\n\n         PCRE_ERROR_DFA_UCOND      (-17)\n\n       This return is given if pcre_dfa_exec()  encounters  a  condition  item\n       that  uses  a back reference for the condition, or a test for recursion\n       in a specific group. These are not supported.\n\n         PCRE_ERROR_DFA_UMLIMIT    (-18)\n\n       This return is given if pcre_dfa_exec() is called with an  extra  block\n       that  contains  a  setting  of the match_limit or match_limit_recursion\n       fields. This is not supported (these fields  are  meaningless  for  DFA\n       matching).\n\n         PCRE_ERROR_DFA_WSSIZE     (-19)\n\n       This  return  is  given  if  pcre_dfa_exec()  runs  out of space in the\n       workspace vector.\n\n         PCRE_ERROR_DFA_RECURSE    (-20)\n\n       When a recursive subpattern is processed, the matching  function  calls\n       itself  recursively,  using  private vectors for ovector and workspace.\n       This error is given if the output vector  is  not  large  enough.  This\n       should be extremely rare, as a vector of size 1000 is used.\n\n         PCRE_ERROR_DFA_BADRESTART (-30)\n\n       When  pcre_dfa_exec()  is called with the PCRE_DFA_RESTART option, some\n       plausibility checks are made on the contents of  the  workspace,  which\n       should  contain  data about the previous partial match. If any of these\n       checks fail, this error is given.\n\n\nSEE ALSO\n\n       pcre16(3),  pcre32(3),  pcrebuild(3),  pcrecallout(3),   pcrecpp(3)(3),\n       pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre-\n       sample(3), pcrestack(3).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 18 December 2015\n       Copyright (c) 1997-2015 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRECALLOUT(3)             Library Functions Manual             PCRECALLOUT(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nSYNOPSIS\n\n       #include <pcre.h>\n\n       int (*pcre_callout)(pcre_callout_block *);\n\n       int (*pcre16_callout)(pcre16_callout_block *);\n\n       int (*pcre32_callout)(pcre32_callout_block *);\n\n\nDESCRIPTION\n\n       PCRE provides a feature called \"callout\", which is a means of temporar-\n       ily passing control to the caller of PCRE  in  the  middle  of  pattern\n       matching.  The  caller of PCRE provides an external function by putting\n       its entry point in the global variable pcre_callout (pcre16_callout for\n       the 16-bit library, pcre32_callout for the 32-bit library). By default,\n       this variable contains NULL, which disables all calling out.\n\n       Within a regular expression, (?C) indicates the  points  at  which  the\n       external  function  is  to  be  called. Different callout points can be\n       identified by putting a number less than 256 after the  letter  C.  The\n       default  value  is  zero.   For  example,  this pattern has two callout\n       points:\n\n         (?C1)abc(?C2)def\n\n       If the PCRE_AUTO_CALLOUT option bit is set when a pattern is  compiled,\n       PCRE  automatically  inserts callouts, all with number 255, before each\n       item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the\n       pattern\n\n         A(\\d{2}|--)\n\n       it is processed as if it were\n\n       (?C255)A(?C255)((?C255)\\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)\n\n       Notice  that  there  is a callout before and after each parenthesis and\n       alternation bar. If the pattern contains a conditional group whose con-\n       dition  is  an  assertion, an automatic callout is inserted immediately\n       before the condition. Such a callout may also be  inserted  explicitly,\n       for example:\n\n         (?(?C9)(?=a)ab|de)\n\n       This  applies only to assertion conditions (because they are themselves\n       independent groups).\n\n       Automatic callouts can be used for tracking  the  progress  of  pattern\n       matching.   The pcretest program has a pattern qualifier (/C) that sets\n       automatic callouts; when it is used, the output indicates how the  pat-\n       tern  is  being matched. This is useful information when you are trying\n       to optimize the performance of a particular pattern.\n\n\nMISSING CALLOUTS\n\n       You should be aware that, because of optimizations in the way PCRE com-\n       piles and matches patterns, callouts sometimes do not happen exactly as\n       you might expect.\n\n       At compile time, PCRE \"auto-possessifies\" repeated items when it  knows\n       that  what follows cannot be part of the repeat. For example, a+[bc] is\n       compiled as if it were a++[bc]. The pcretest output when  this  pattern\n       is  anchored  and  then  applied  with automatic callouts to the string\n       \"aaaa\" is:\n\n         --->aaaa\n          +0 ^        ^\n          +1 ^        a+\n          +3 ^   ^    [bc]\n         No match\n\n       This indicates that when matching [bc] fails, there is no  backtracking\n       into  a+  and  therefore the callouts that would be taken for the back-\n       tracks do not occur.  You can disable the  auto-possessify  feature  by\n       passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern\n       with (*NO_AUTO_POSSESS). If this is done  in  pcretest  (using  the  /O\n       qualifier), the output changes to this:\n\n         --->aaaa\n          +0 ^        ^\n          +1 ^        a+\n          +3 ^   ^    [bc]\n          +3 ^  ^     [bc]\n          +3 ^ ^      [bc]\n          +3 ^^       [bc]\n         No match\n\n       This time, when matching [bc] fails, the matcher backtracks into a+ and\n       tries again, repeatedly, until a+ itself fails.\n\n       Other optimizations that provide fast \"no match\"  results  also  affect\n       callouts.  For example, if the pattern is\n\n         ab(?C4)cd\n\n       PCRE knows that any matching string must contain the letter \"d\". If the\n       subject string is \"abyz\", the lack of \"d\" means that  matching  doesn't\n       ever  start,  and  the  callout is never reached. However, with \"abyd\",\n       though the result is still no match, the callout is obeyed.\n\n       If the pattern is studied, PCRE knows the minimum length of a  matching\n       string,  and will immediately give a \"no match\" return without actually\n       running a match if the subject is not long enough, or,  for  unanchored\n       patterns, if it has been scanned far enough.\n\n       You  can disable these optimizations by passing the PCRE_NO_START_OPTI-\n       MIZE option to the matching function, or by starting the  pattern  with\n       (*NO_START_OPT).  This slows down the matching process, but does ensure\n       that callouts such as the example above are obeyed.\n\n\nTHE CALLOUT INTERFACE\n\n       During matching, when PCRE reaches a callout point, the external  func-\n       tion defined by pcre_callout or pcre[16|32]_callout is called (if it is\n       set). This applies to both normal and DFA matching. The  only  argument\n       to   the   callout   function   is  a  pointer  to  a  pcre_callout  or\n       pcre[16|32]_callout block.  These  structures  contains  the  following\n       fields:\n\n         int           version;\n         int           callout_number;\n         int          *offset_vector;\n         const char   *subject;           (8-bit version)\n         PCRE_SPTR16   subject;           (16-bit version)\n         PCRE_SPTR32   subject;           (32-bit version)\n         int           subject_length;\n         int           start_match;\n         int           current_position;\n         int           capture_top;\n         int           capture_last;\n         void         *callout_data;\n         int           pattern_position;\n         int           next_item_length;\n         const unsigned char *mark;       (8-bit version)\n         const PCRE_UCHAR16  *mark;       (16-bit version)\n         const PCRE_UCHAR32  *mark;       (32-bit version)\n\n       The  version  field  is an integer containing the version number of the\n       block format. The initial version was 0; the current version is 2.  The\n       version  number  will  change  again in future if additional fields are\n       added, but the intention is never to remove any of the existing fields.\n\n       The callout_number field contains the number of the  callout,  as  com-\n       piled  into  the pattern (that is, the number after ?C for manual call-\n       outs, and 255 for automatically generated callouts).\n\n       The offset_vector field is a pointer to the vector of offsets that  was\n       passed  by  the  caller  to  the matching function. When pcre_exec() or\n       pcre[16|32]_exec() is used, the contents can be inspected, in order  to\n       extract  substrings  that  have been matched so far, in the same way as\n       for extracting substrings after a match  has  completed.  For  the  DFA\n       matching functions, this field is not useful.\n\n       The subject and subject_length fields contain copies of the values that\n       were passed to the matching function.\n\n       The start_match field normally contains the offset within  the  subject\n       at  which  the  current  match  attempt started. However, if the escape\n       sequence \\K has been encountered, this value is changed to reflect  the\n       modified  starting  point.  If the pattern is not anchored, the callout\n       function may be called several times from the same point in the pattern\n       for different starting points in the subject.\n\n       The  current_position  field  contains the offset within the subject of\n       the current match pointer.\n\n       When the pcre_exec() or pcre[16|32]_exec()  is  used,  the  capture_top\n       field  contains  one  more than the number of the highest numbered cap-\n       tured substring so far. If no substrings have been captured, the  value\n       of  capture_top  is one. This is always the case when the DFA functions\n       are used, because they do not support captured substrings.\n\n       The capture_last field contains the number of the  most  recently  cap-\n       tured  substring. However, when a recursion exits, the value reverts to\n       what it was outside the recursion, as do the  values  of  all  captured\n       substrings.  If  no  substrings  have  been captured, the value of cap-\n       ture_last is -1. This is always the case for  the  DFA  matching  func-\n       tions.\n\n       The  callout_data  field  contains a value that is passed to a matching\n       function specifically so that it can be passed back in callouts. It  is\n       passed  in  the callout_data field of a pcre_extra or pcre[16|32]_extra\n       data structure. If no such data was passed, the value  of  callout_data\n       in  a  callout  block is NULL. There is a description of the pcre_extra\n       structure in the pcreapi documentation.\n\n       The pattern_position field is present from version  1  of  the  callout\n       structure. It contains the offset to the next item to be matched in the\n       pattern string.\n\n       The next_item_length field is present from version  1  of  the  callout\n       structure. It contains the length of the next item to be matched in the\n       pattern string. When the callout immediately  precedes  an  alternation\n       bar,  a  closing  parenthesis, or the end of the pattern, the length is\n       zero. When the callout precedes an opening parenthesis, the  length  is\n       that of the entire subpattern.\n\n       The  pattern_position  and next_item_length fields are intended to help\n       in distinguishing between different automatic callouts, which all  have\n       the same callout number. However, they are set for all callouts.\n\n       The  mark  field is present from version 2 of the callout structure. In\n       callouts from pcre_exec() or pcre[16|32]_exec() it contains  a  pointer\n       to  the  zero-terminated  name  of  the  most  recently passed (*MARK),\n       (*PRUNE), or (*THEN) item in the match, or NULL if no such  items  have\n       been  passed.  Instances  of  (*PRUNE) or (*THEN) without a name do not\n       obliterate a previous (*MARK). In callouts from the DFA matching  func-\n       tions this field always contains NULL.\n\n\nRETURN VALUES\n\n       The  external callout function returns an integer to PCRE. If the value\n       is zero, matching proceeds as normal. If  the  value  is  greater  than\n       zero,  matching  fails  at  the current point, but the testing of other\n       matching possibilities goes ahead, just as if a lookahead assertion had\n       failed.  If  the  value  is less than zero, the match is abandoned, the\n       matching function returns the negative value.\n\n       Negative  values  should  normally  be   chosen   from   the   set   of\n       PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan-\n       dard \"no  match\"  failure.   The  error  number  PCRE_ERROR_CALLOUT  is\n       reserved  for  use  by callout functions; it will never be used by PCRE\n       itself.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 November 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRECOMPAT(3)              Library Functions Manual              PCRECOMPAT(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nDIFFERENCES BETWEEN PCRE AND PERL\n\n       This  document describes the differences in the ways that PCRE and Perl\n       handle regular expressions. The differences  described  here  are  with\n       respect to Perl versions 5.10 and above.\n\n       1. PCRE has only a subset of Perl's Unicode support. Details of what it\n       does have are given in the pcreunicode page.\n\n       2. PCRE allows repeat quantifiers only on parenthesized assertions, but\n       they  do  not mean what you might think. For example, (?!a){3} does not\n       assert that the next three characters are not \"a\". It just asserts that\n       the next character is not \"a\" three times (in principle: PCRE optimizes\n       this to run the assertion just once). Perl allows repeat quantifiers on\n       other assertions such as \\b, but these do not seem to have any use.\n\n       3.  Capturing  subpatterns  that occur inside negative lookahead asser-\n       tions are counted, but their entries in the offsets  vector  are  never\n       set.  Perl sometimes (but not always) sets its numerical variables from\n       inside negative assertions.\n\n       4. Though binary zero characters are supported in the  subject  string,\n       they are not allowed in a pattern string because it is passed as a nor-\n       mal C string, terminated by zero. The escape sequence \\0 can be used in\n       the pattern to represent a binary zero.\n\n       5.  The  following Perl escape sequences are not supported: \\l, \\u, \\L,\n       \\U, and \\N when followed by a character name or Unicode value.  (\\N  on\n       its own, matching a non-newline character, is supported.) In fact these\n       are implemented by Perl's general string-handling and are not  part  of\n       its  pattern  matching engine. If any of these are encountered by PCRE,\n       an error is generated by default. However, if the  PCRE_JAVASCRIPT_COM-\n       PAT  option  is set, \\U and \\u are interpreted as JavaScript interprets\n       them.\n\n       6. The Perl escape sequences \\p, \\P, and \\X are supported only if  PCRE\n       is  built  with Unicode character property support. The properties that\n       can be tested with \\p and \\P are limited to the general category  prop-\n       erties  such  as  Lu and Nd, script names such as Greek or Han, and the\n       derived properties Any and L&. PCRE does  support  the  Cs  (surrogate)\n       property,  which  Perl  does  not; the Perl documentation says \"Because\n       Perl hides the need for the user to understand the internal representa-\n       tion  of Unicode characters, there is no need to implement the somewhat\n       messy concept of surrogates.\"\n\n       7. PCRE does support the \\Q...\\E escape for quoting substrings. Charac-\n       ters  in  between  are  treated as literals. This is slightly different\n       from Perl in that $ and @ are  also  handled  as  literals  inside  the\n       quotes.  In Perl, they cause variable interpolation (but of course PCRE\n       does not have variables). Note the following examples:\n\n           Pattern            PCRE matches      Perl matches\n\n           \\Qabc$xyz\\E        abc$xyz           abc followed by the\n                                                  contents of $xyz\n           \\Qabc\\$xyz\\E       abc\\$xyz          abc\\$xyz\n           \\Qabc\\E\\$\\Qxyz\\E   abc$xyz           abc$xyz\n\n       The \\Q...\\E sequence is recognized both inside  and  outside  character\n       classes.\n\n       8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})\n       constructions. However, there is support for recursive  patterns.  This\n       is  not  available  in Perl 5.8, but it is in Perl 5.10. Also, the PCRE\n       \"callout\" feature allows an external function to be called during  pat-\n       tern matching. See the pcrecallout documentation for details.\n\n       9.  Subpatterns  that  are called as subroutines (whether or not recur-\n       sively) are always treated as atomic  groups  in  PCRE.  This  is  like\n       Python,  but  unlike Perl.  Captured values that are set outside a sub-\n       routine call can be reference from inside in PCRE,  but  not  in  Perl.\n       There is a discussion that explains these differences in more detail in\n       the section on recursion differences from Perl in the pcrepattern page.\n\n       10. If any of the backtracking control verbs are used in  a  subpattern\n       that  is  called  as  a  subroutine (whether or not recursively), their\n       effect is confined to that subpattern; it does not extend to  the  sur-\n       rounding  pattern.  This is not always the case in Perl. In particular,\n       if (*THEN) is present in a group that is called as  a  subroutine,  its\n       action is limited to that group, even if the group does not contain any\n       | characters. Note that such subpatterns are processed as  anchored  at\n       the point where they are tested.\n\n       11.  If a pattern contains more than one backtracking control verb, the\n       first one that is backtracked onto acts. For example,  in  the  pattern\n       A(*COMMIT)B(*PRUNE)C  a  failure in B triggers (*COMMIT), but a failure\n       in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases\n       it is the same as PCRE, but there are examples where it differs.\n\n       12.  Most  backtracking  verbs in assertions have their normal actions.\n       They are not confined to the assertion.\n\n       13. There are some differences that are concerned with the settings  of\n       captured  strings  when  part  of  a  pattern is repeated. For example,\n       matching \"aba\" against the  pattern  /^(a(b)?)+$/  in  Perl  leaves  $2\n       unset, but in PCRE it is set to \"b\".\n\n       14.  PCRE's handling of duplicate subpattern numbers and duplicate sub-\n       pattern names is not as general as Perl's. This is a consequence of the\n       fact the PCRE works internally just with numbers, using an external ta-\n       ble to translate between numbers and names. In  particular,  a  pattern\n       such  as  (?|(?<a>A)|(?<b>B),  where the two capturing parentheses have\n       the same number but different names, is not supported,  and  causes  an\n       error  at compile time. If it were allowed, it would not be possible to\n       distinguish which parentheses matched, because both names map  to  cap-\n       turing subpattern number 1. To avoid this confusing situation, an error\n       is given at compile time.\n\n       15. Perl recognizes comments in some places that  PCRE  does  not,  for\n       example,  between  the  ( and ? at the start of a subpattern. If the /x\n       modifier is set, Perl allows white space between ( and ?  (though  cur-\n       rent  Perls  warn that this is deprecated) but PCRE never does, even if\n       the PCRE_EXTENDED option is set.\n\n       16. Perl, when in warning mode, gives warnings  for  character  classes\n       such  as  [A-\\d] or [a-[:digit:]]. It then treats the hyphens as liter-\n       als. PCRE has no warning features, so it gives an error in these  cases\n       because they are almost certainly user mistakes.\n\n       17.  In  PCRE,  the upper/lower case character properties Lu and Ll are\n       not affected when case-independent matching is specified. For  example,\n       \\p{Lu} always matches an upper case letter. I think Perl has changed in\n       this respect; in the release at the time of writing (5.16), \\p{Lu}  and\n       \\p{Ll} match all letters, regardless of case, when case independence is\n       specified.\n\n       18. PCRE provides some extensions to the Perl regular expression facil-\n       ities.   Perl  5.10  includes new features that are not in earlier ver-\n       sions of Perl, some of which (such as named parentheses) have  been  in\n       PCRE for some time. This list is with respect to Perl 5.10:\n\n       (a)  Although  lookbehind  assertions  in  PCRE must match fixed length\n       strings, each alternative branch of a lookbehind assertion can match  a\n       different  length  of  string.  Perl requires them all to have the same\n       length.\n\n       (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the  $\n       meta-character matches only at the very end of the string.\n\n       (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe-\n       cial meaning is faulted. Otherwise, like Perl, the backslash is quietly\n       ignored.  (Perl can be made to issue a warning.)\n\n       (d)  If  PCRE_UNGREEDY is set, the greediness of the repetition quanti-\n       fiers is inverted, that is, by default they are not greedy, but if fol-\n       lowed by a question mark they are.\n\n       (e) PCRE_ANCHORED can be used at matching time to force a pattern to be\n       tried only at the first matching position in the subject string.\n\n       (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,\n       and  PCRE_NO_AUTO_CAPTURE  options for pcre_exec() have no Perl equiva-\n       lents.\n\n       (g) The \\R escape sequence can be restricted to match only CR,  LF,  or\n       CRLF by the PCRE_BSR_ANYCRLF option.\n\n       (h) The callout facility is PCRE-specific.\n\n       (i) The partial matching facility is PCRE-specific.\n\n       (j) Patterns compiled by PCRE can be saved and re-used at a later time,\n       even on different hosts that have the other endianness.  However,  this\n       does not apply to optimized data created by the just-in-time compiler.\n\n       (k)    The    alternative    matching    functions    (pcre_dfa_exec(),\n       pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way  and\n       are not Perl-compatible.\n\n       (l)  PCRE  recognizes some special sequences such as (*CR) at the start\n       of a pattern that set overall options that cannot be changed within the\n       pattern.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 10 November 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREPATTERN(3)             Library Functions Manual             PCREPATTERN(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE REGULAR EXPRESSION DETAILS\n\n       The  syntax and semantics of the regular expressions that are supported\n       by PCRE are described in detail below. There is a quick-reference  syn-\n       tax summary in the pcresyntax page. PCRE tries to match Perl syntax and\n       semantics as closely as it can. PCRE  also  supports  some  alternative\n       regular  expression  syntax (which does not conflict with the Perl syn-\n       tax) in order to provide some compatibility with regular expressions in\n       Python, .NET, and Oniguruma.\n\n       Perl's  regular expressions are described in its own documentation, and\n       regular expressions in general are covered in a number of  books,  some\n       of  which  have  copious  examples. Jeffrey Friedl's \"Mastering Regular\n       Expressions\", published by  O'Reilly,  covers  regular  expressions  in\n       great  detail.  This  description  of  PCRE's  regular  expressions  is\n       intended as reference material.\n\n       This document discusses the patterns that are supported  by  PCRE  when\n       one    its    main   matching   functions,   pcre_exec()   (8-bit)   or\n       pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has  alternative\n       matching  functions,  pcre_dfa_exec()  and pcre[16|32_dfa_exec(), which\n       match using a different algorithm that is not Perl-compatible. Some  of\n       the  features  discussed  below  are not available when DFA matching is\n       used. The advantages and disadvantages of  the  alternative  functions,\n       and  how  they  differ  from the normal functions, are discussed in the\n       pcrematching page.\n\n\nSPECIAL START-OF-PATTERN ITEMS\n\n       A number of options that can be passed to pcre_compile()  can  also  be\n       set by special items at the start of a pattern. These are not Perl-com-\n       patible, but are provided to make these options accessible  to  pattern\n       writers  who are not able to change the program that processes the pat-\n       tern. Any number of these items  may  appear,  but  they  must  all  be\n       together right at the start of the pattern string, and the letters must\n       be in upper case.\n\n   UTF support\n\n       The original operation of PCRE was on strings of  one-byte  characters.\n       However,  there  is  now also support for UTF-8 strings in the original\n       library, an extra library that supports  16-bit  and  UTF-16  character\n       strings,  and a third library that supports 32-bit and UTF-32 character\n       strings. To use these features, PCRE must be built to include appropri-\n       ate  support. When using UTF strings you must either call the compiling\n       function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option,  or  the\n       pattern must start with one of these special sequences:\n\n         (*UTF8)\n         (*UTF16)\n         (*UTF32)\n         (*UTF)\n\n       (*UTF)  is  a  generic  sequence  that  can  be  used  with  any of the\n       libraries.  Starting a pattern with such a sequence  is  equivalent  to\n       setting  the  relevant  option.  How setting a UTF mode affects pattern\n       matching is mentioned in several places below. There is also a  summary\n       of features in the pcreunicode page.\n\n       Some applications that allow their users to supply patterns may wish to\n       restrict  them  to  non-UTF  data  for   security   reasons.   If   the\n       PCRE_NEVER_UTF  option  is  set  at  compile  time, (*UTF) etc. are not\n       allowed, and their appearance causes an error.\n\n   Unicode property support\n\n       Another special sequence that may appear at the start of a  pattern  is\n       (*UCP).   This  has  the same effect as setting the PCRE_UCP option: it\n       causes sequences such as \\d and \\w to use Unicode properties to  deter-\n       mine character types, instead of recognizing only characters with codes\n       less than 128 via a lookup table.\n\n   Disabling auto-possessification\n\n       If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect  as\n       setting  the  PCRE_NO_AUTO_POSSESS  option  at compile time. This stops\n       PCRE from making quantifiers possessive when what follows cannot  match\n       the  repeated item. For example, by default a+b is treated as a++b. For\n       more details, see the pcreapi documentation.\n\n   Disabling start-up optimizations\n\n       If a pattern starts with (*NO_START_OPT), it has  the  same  effect  as\n       setting the PCRE_NO_START_OPTIMIZE option either at compile or matching\n       time. This disables several  optimizations  for  quickly  reaching  \"no\n       match\" results. For more details, see the pcreapi documentation.\n\n   Newline conventions\n\n       PCRE  supports five different conventions for indicating line breaks in\n       strings: a single CR (carriage return) character, a  single  LF  (line-\n       feed) character, the two-character sequence CRLF, any of the three pre-\n       ceding, or any Unicode newline sequence. The pcreapi page  has  further\n       discussion  about newlines, and shows how to set the newline convention\n       in the options arguments for the compiling and matching functions.\n\n       It is also possible to specify a newline convention by starting a  pat-\n       tern string with one of the following five sequences:\n\n         (*CR)        carriage return\n         (*LF)        linefeed\n         (*CRLF)      carriage return, followed by linefeed\n         (*ANYCRLF)   any of the three above\n         (*ANY)       all Unicode newline sequences\n\n       These override the default and the options given to the compiling func-\n       tion. For example, on a Unix system where LF  is  the  default  newline\n       sequence, the pattern\n\n         (*CR)a.b\n\n       changes the convention to CR. That pattern matches \"a\\nb\" because LF is\n       no longer a newline. If more than one of these settings is present, the\n       last one is used.\n\n       The  newline  convention affects where the circumflex and dollar asser-\n       tions are true. It also affects the interpretation of the dot metachar-\n       acter when PCRE_DOTALL is not set, and the behaviour of \\N. However, it\n       does not affect what the \\R escape sequence matches. By  default,  this\n       is  any Unicode newline sequence, for Perl compatibility. However, this\n       can be changed; see the description of \\R in the section entitled \"New-\n       line  sequences\"  below.  A change of \\R setting can be combined with a\n       change of newline convention.\n\n   Setting match and recursion limits\n\n       The caller of pcre_exec() can set a limit on the number  of  times  the\n       internal  match() function is called and on the maximum depth of recur-\n       sive calls. These facilities are provided to catch runaway matches that\n       are provoked by patterns with huge matching trees (a typical example is\n       a pattern with nested unlimited repeats) and to avoid  running  out  of\n       system  stack  by  too  much  recursion.  When  one  of these limits is\n       reached, pcre_exec() gives an error return. The limits can also be  set\n       by items at the start of the pattern of the form\n\n         (*LIMIT_MATCH=d)\n         (*LIMIT_RECURSION=d)\n\n       where d is any number of decimal digits. However, the value of the set-\n       ting must be less than the value set (or defaulted) by  the  caller  of\n       pcre_exec()  for  it  to  have  any effect. In other words, the pattern\n       writer can lower the limits set by the programmer, but not raise  them.\n       If  there  is  more  than one setting of one of these limits, the lower\n       value is used.\n\n\nEBCDIC CHARACTER CODES\n\n       PCRE can be compiled to run in an environment that uses EBCDIC  as  its\n       character code rather than ASCII or Unicode (typically a mainframe sys-\n       tem). In the sections below, character code values are  ASCII  or  Uni-\n       code; in an EBCDIC environment these characters may have different code\n       values, and there are no code points greater than 255.\n\n\nCHARACTERS AND METACHARACTERS\n\n       A regular expression is a pattern that is  matched  against  a  subject\n       string  from  left  to right. Most characters stand for themselves in a\n       pattern, and match the corresponding characters in the  subject.  As  a\n       trivial example, the pattern\n\n         The quick brown fox\n\n       matches a portion of a subject string that is identical to itself. When\n       caseless matching is specified (the PCRE_CASELESS option), letters  are\n       matched  independently  of case. In a UTF mode, PCRE always understands\n       the concept of case for characters whose values are less than  128,  so\n       caseless  matching  is always possible. For characters with higher val-\n       ues, the concept of case is supported if PCRE is compiled with  Unicode\n       property  support,  but  not  otherwise.   If  you want to use caseless\n       matching for characters 128 and above, you must  ensure  that  PCRE  is\n       compiled with Unicode property support as well as with UTF support.\n\n       The  power  of  regular  expressions  comes from the ability to include\n       alternatives and repetitions in the pattern. These are encoded  in  the\n       pattern by the use of metacharacters, which do not stand for themselves\n       but instead are interpreted in some special way.\n\n       There are two different sets of metacharacters: those that  are  recog-\n       nized  anywhere in the pattern except within square brackets, and those\n       that are recognized within square brackets.  Outside  square  brackets,\n       the metacharacters are as follows:\n\n         \\      general escape character with several uses\n         ^      assert start of string (or line, in multiline mode)\n         $      assert end of string (or line, in multiline mode)\n         .      match any character except newline (by default)\n         [      start character class definition\n         |      start of alternative branch\n         (      start subpattern\n         )      end subpattern\n         ?      extends the meaning of (\n                also 0 or 1 quantifier\n                also quantifier minimizer\n         *      0 or more quantifier\n         +      1 or more quantifier\n                also \"possessive quantifier\"\n         {      start min/max quantifier\n\n       Part  of  a  pattern  that is in square brackets is called a \"character\n       class\". In a character class the only metacharacters are:\n\n         \\      general escape character\n         ^      negate the class, but only if the first character\n         -      indicates character range\n         [      POSIX character class (only if followed by POSIX\n                  syntax)\n         ]      terminates the character class\n\n       The following sections describe the use of each of the metacharacters.\n\n\nBACKSLASH\n\n       The backslash character has several uses. Firstly, if it is followed by\n       a character that is not a number or a letter, it takes away any special\n       meaning that character may have. This use of  backslash  as  an  escape\n       character applies both inside and outside character classes.\n\n       For  example,  if  you want to match a * character, you write \\* in the\n       pattern.  This escaping action applies whether  or  not  the  following\n       character  would  otherwise be interpreted as a metacharacter, so it is\n       always safe to precede a non-alphanumeric  with  backslash  to  specify\n       that  it stands for itself. In particular, if you want to match a back-\n       slash, you write \\\\.\n\n       In a UTF mode, only ASCII numbers and letters have any special  meaning\n       after  a  backslash.  All  other characters (in particular, those whose\n       codepoints are greater than 127) are treated as literals.\n\n       If a pattern is compiled with  the  PCRE_EXTENDED  option,  most  white\n       space  in the pattern (other than in a character class), and characters\n       between a # outside a character class and the next newline,  inclusive,\n       are ignored. An escaping backslash can be used to include a white space\n       or # character as part of the pattern.\n\n       If you want to remove the special meaning from a  sequence  of  charac-\n       ters,  you can do so by putting them between \\Q and \\E. This is differ-\n       ent from Perl in that $ and  @  are  handled  as  literals  in  \\Q...\\E\n       sequences  in  PCRE, whereas in Perl, $ and @ cause variable interpola-\n       tion. Note the following examples:\n\n         Pattern            PCRE matches   Perl matches\n\n         \\Qabc$xyz\\E        abc$xyz        abc followed by the\n                                             contents of $xyz\n         \\Qabc\\$xyz\\E       abc\\$xyz       abc\\$xyz\n         \\Qabc\\E\\$\\Qxyz\\E   abc$xyz        abc$xyz\n\n       The \\Q...\\E sequence is recognized both inside  and  outside  character\n       classes.   An  isolated \\E that is not preceded by \\Q is ignored. If \\Q\n       is not followed by \\E later in the pattern, the literal  interpretation\n       continues  to  the  end  of  the pattern (that is, \\E is assumed at the\n       end). If the isolated \\Q is inside a character class,  this  causes  an\n       error, because the character class is not terminated.\n\n   Non-printing characters\n\n       A second use of backslash provides a way of encoding non-printing char-\n       acters in patterns in a visible manner. There is no restriction on  the\n       appearance  of non-printing characters, apart from the binary zero that\n       terminates a pattern, but when a pattern  is  being  prepared  by  text\n       editing,  it  is  often  easier  to  use  one  of  the following escape\n       sequences than the binary character it represents.  In an ASCII or Uni-\n       code environment, these escapes are as follows:\n\n         \\a        alarm, that is, the BEL character (hex 07)\n         \\cx       \"control-x\", where x is any ASCII character\n         \\e        escape (hex 1B)\n         \\f        form feed (hex 0C)\n         \\n        linefeed (hex 0A)\n         \\r        carriage return (hex 0D)\n         \\t        tab (hex 09)\n         \\0dd      character with octal code 0dd\n         \\ddd      character with octal code ddd, or back reference\n         \\o{ddd..} character with octal code ddd..\n         \\xhh      character with hex code hh\n         \\x{hhh..} character with hex code hhh.. (non-JavaScript mode)\n         \\uhhhh    character with hex code hhhh (JavaScript mode only)\n\n       The  precise effect of \\cx on ASCII characters is as follows: if x is a\n       lower case letter, it is converted to upper case. Then  bit  6  of  the\n       character (hex 40) is inverted. Thus \\cA to \\cZ become hex 01 to hex 1A\n       (A is 41, Z is 5A), but \\c{ becomes hex 3B ({ is 7B), and  \\c;  becomes\n       hex  7B (; is 3B). If the data item (byte or 16-bit value) following \\c\n       has a value greater than 127, a compile-time error occurs.  This  locks\n       out non-ASCII characters in all modes.\n\n       When PCRE is compiled in EBCDIC mode, \\a, \\e, \\f, \\n, \\r, and \\t gener-\n       ate the appropriate EBCDIC code values. The \\c escape is  processed  as\n       specified for Perl in the perlebcdic document. The only characters that\n       are allowed after \\c are A-Z, a-z, or one of @, [, \\, ], ^,  _,  or  ?.\n       Any  other  character  provokes  a compile-time error. The sequence \\c@\n       encodes character code 0; after \\c the letters (in either case)  encode\n       characters 1-26 (hex 01 to hex 1A); [, \\, ], ^, and _ encode characters\n       27-31 (hex 1B to hex 1F), and \\c? becomes either 255  (hex  FF)  or  95\n       (hex 5F).\n\n       Thus,  apart  from  \\c?, these escapes generate the same character code\n       values as they do in an ASCII environment, though the meanings  of  the\n       values  mostly  differ. For example, \\cG always generates code value 7,\n       which is BEL in ASCII but DEL in EBCDIC.\n\n       The sequence \\c? generates DEL (127, hex 7F) in an  ASCII  environment,\n       but  because  127  is  not a control character in EBCDIC, Perl makes it\n       generate the APC character. Unfortunately, there are  several  variants\n       of  EBCDIC.  In  most  of them the APC character has the value 255 (hex\n       FF), but in the one Perl calls POSIX-BC its value is 95  (hex  5F).  If\n       certain  other characters have POSIX-BC values, PCRE makes \\c? generate\n       95; otherwise it generates 255.\n\n       After \\0 up to two further octal digits are read. If  there  are  fewer\n       than  two  digits,  just  those  that  are  present  are used. Thus the\n       sequence \\0\\x\\015 specifies two binary zeros followed by a CR character\n       (code value 13). Make sure you supply two digits after the initial zero\n       if the pattern character that follows is itself an octal digit.\n\n       The escape \\o must be followed by a sequence of octal digits,  enclosed\n       in  braces.  An  error occurs if this is not the case. This escape is a\n       recent addition to Perl; it provides way of specifying  character  code\n       points  as  octal  numbers  greater than 0777, and it also allows octal\n       numbers and back references to be unambiguously specified.\n\n       For greater clarity and unambiguity, it is best to avoid following \\ by\n       a digit greater than zero. Instead, use \\o{} or \\x{} to specify charac-\n       ter numbers, and \\g{} to specify back references. The  following  para-\n       graphs describe the old, ambiguous syntax.\n\n       The handling of a backslash followed by a digit other than 0 is compli-\n       cated, and Perl has changed in recent releases, causing  PCRE  also  to\n       change. Outside a character class, PCRE reads the digit and any follow-\n       ing digits as a decimal number. If the number is less  than  8,  or  if\n       there  have been at least that many previous capturing left parentheses\n       in the expression, the entire sequence is taken as a back reference.  A\n       description  of how this works is given later, following the discussion\n       of parenthesized subpatterns.\n\n       Inside a character class, or if  the  decimal  number  following  \\  is\n       greater than 7 and there have not been that many capturing subpatterns,\n       PCRE handles \\8 and \\9 as the literal characters \"8\" and \"9\", and  oth-\n       erwise re-reads up to three octal digits following the backslash, using\n       them to generate a data character.  Any  subsequent  digits  stand  for\n       themselves. For example:\n\n         \\040   is another way of writing an ASCII space\n         \\40    is the same, provided there are fewer than 40\n                   previous capturing subpatterns\n         \\7     is always a back reference\n         \\11    might be a back reference, or another way of\n                   writing a tab\n         \\011   is always a tab\n         \\0113  is a tab followed by the character \"3\"\n         \\113   might be a back reference, otherwise the\n                   character with octal code 113\n         \\377   might be a back reference, otherwise\n                   the value 255 (decimal)\n         \\81    is either a back reference, or the two\n                   characters \"8\" and \"1\"\n\n       Note  that octal values of 100 or greater that are specified using this\n       syntax must not be introduced by a leading zero, because no  more  than\n       three octal digits are ever read.\n\n       By  default, after \\x that is not followed by {, from zero to two hexa-\n       decimal digits are read (letters can be in upper or  lower  case).  Any\n       number of hexadecimal digits may appear between \\x{ and }. If a charac-\n       ter other than a hexadecimal digit appears between \\x{  and  },  or  if\n       there is no terminating }, an error occurs.\n\n       If  the  PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \\x\n       is as just described only when it is followed by two  hexadecimal  dig-\n       its.   Otherwise,  it  matches  a  literal \"x\" character. In JavaScript\n       mode, support for code points greater than 256 is provided by \\u, which\n       must  be  followed  by  four hexadecimal digits; otherwise it matches a\n       literal \"u\" character.\n\n       Characters whose value is less than 256 can be defined by either of the\n       two  syntaxes for \\x (or by \\u in JavaScript mode). There is no differ-\n       ence in the way they are handled. For example, \\xdc is exactly the same\n       as \\x{dc} (or \\u00dc in JavaScript mode).\n\n   Constraints on character values\n\n       Characters  that  are  specified using octal or hexadecimal numbers are\n       limited to certain values, as follows:\n\n         8-bit non-UTF mode    less than 0x100\n         8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint\n         16-bit non-UTF mode   less than 0x10000\n         16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint\n         32-bit non-UTF mode   less than 0x100000000\n         32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint\n\n       Invalid Unicode codepoints are the range  0xd800  to  0xdfff  (the  so-\n       called \"surrogate\" codepoints), and 0xffef.\n\n   Escape sequences in character classes\n\n       All the sequences that define a single character value can be used both\n       inside and outside character classes. In addition, inside  a  character\n       class, \\b is interpreted as the backspace character (hex 08).\n\n       \\N  is not allowed in a character class. \\B, \\R, and \\X are not special\n       inside a character class. Like  other  unrecognized  escape  sequences,\n       they  are  treated  as  the  literal  characters  \"B\",  \"R\", and \"X\" by\n       default, but cause an error if the PCRE_EXTRA option is set. Outside  a\n       character class, these sequences have different meanings.\n\n   Unsupported escape sequences\n\n       In  Perl, the sequences \\l, \\L, \\u, and \\U are recognized by its string\n       handler and used  to  modify  the  case  of  following  characters.  By\n       default,  PCRE does not support these escape sequences. However, if the\n       PCRE_JAVASCRIPT_COMPAT option is set, \\U matches a \"U\"  character,  and\n       \\u can be used to define a character by code point, as described in the\n       previous section.\n\n   Absolute and relative back references\n\n       The sequence \\g followed by an unsigned or a negative  number,  option-\n       ally  enclosed  in braces, is an absolute or relative back reference. A\n       named back reference can be coded as \\g{name}. Back references are dis-\n       cussed later, following the discussion of parenthesized subpatterns.\n\n   Absolute and relative subroutine calls\n\n       For  compatibility with Oniguruma, the non-Perl syntax \\g followed by a\n       name or a number enclosed either in angle brackets or single quotes, is\n       an  alternative  syntax for referencing a subpattern as a \"subroutine\".\n       Details are discussed later.   Note  that  \\g{...}  (Perl  syntax)  and\n       \\g<...>  (Oniguruma  syntax)  are  not synonymous. The former is a back\n       reference; the latter is a subroutine call.\n\n   Generic character types\n\n       Another use of backslash is for specifying generic character types:\n\n         \\d     any decimal digit\n         \\D     any character that is not a decimal digit\n         \\h     any horizontal white space character\n         \\H     any character that is not a horizontal white space character\n         \\s     any white space character\n         \\S     any character that is not a white space character\n         \\v     any vertical white space character\n         \\V     any character that is not a vertical white space character\n         \\w     any \"word\" character\n         \\W     any \"non-word\" character\n\n       There is also the single sequence \\N, which matches a non-newline char-\n       acter.   This  is the same as the \".\" metacharacter when PCRE_DOTALL is\n       not set. Perl also uses \\N to match characters by name; PCRE  does  not\n       support this.\n\n       Each  pair of lower and upper case escape sequences partitions the com-\n       plete set of characters into two disjoint  sets.  Any  given  character\n       matches  one, and only one, of each pair. The sequences can appear both\n       inside and outside character classes. They each match one character  of\n       the  appropriate  type.  If the current matching point is at the end of\n       the subject string, all of them fail, because there is no character  to\n       match.\n\n       For  compatibility with Perl, \\s did not used to match the VT character\n       (code 11), which made it different from the the  POSIX  \"space\"  class.\n       However,  Perl  added  VT  at  release  5.18, and PCRE followed suit at\n       release 8.34. The default \\s characters are now HT  (9),  LF  (10),  VT\n       (11),  FF  (12),  CR  (13),  and space (32), which are defined as white\n       space in the \"C\" locale. This list may vary if locale-specific matching\n       is  taking place. For example, in some locales the \"non-breaking space\"\n       character (\\xA0) is recognized as white space, and  in  others  the  VT\n       character is not.\n\n       A  \"word\"  character is an underscore or any character that is a letter\n       or digit.  By default, the definition of letters  and  digits  is  con-\n       trolled  by PCRE's low-valued character tables, and may vary if locale-\n       specific matching is taking place (see \"Locale support\" in the  pcreapi\n       page).  For  example,  in  a French locale such as \"fr_FR\" in Unix-like\n       systems, or \"french\" in Windows, some character codes greater than  127\n       are  used  for  accented letters, and these are then matched by \\w. The\n       use of locales with Unicode is discouraged.\n\n       By default, characters whose code points are  greater  than  127  never\n       match \\d, \\s, or \\w, and always match \\D, \\S, and \\W, although this may\n       vary for characters in the range 128-255 when locale-specific  matching\n       is  happening.   These  escape sequences retain their original meanings\n       from before Unicode support was available, mainly for  efficiency  rea-\n       sons.  If  PCRE  is  compiled  with  Unicode  property support, and the\n       PCRE_UCP option is set, the behaviour is changed so that Unicode  prop-\n       erties are used to determine character types, as follows:\n\n         \\d  any character that matches \\p{Nd} (decimal digit)\n         \\s  any character that matches \\p{Z} or \\h or \\v\n         \\w  any character that matches \\p{L} or \\p{N}, plus underscore\n\n       The  upper case escapes match the inverse sets of characters. Note that\n       \\d matches only decimal digits, whereas \\w matches any  Unicode  digit,\n       as  well as any Unicode letter, and underscore. Note also that PCRE_UCP\n       affects \\b, and \\B because they are defined in  terms  of  \\w  and  \\W.\n       Matching these sequences is noticeably slower when PCRE_UCP is set.\n\n       The  sequences  \\h, \\H, \\v, and \\V are features that were added to Perl\n       at release 5.10. In contrast to the other sequences, which  match  only\n       ASCII  characters  by  default,  these always match certain high-valued\n       code points, whether or not PCRE_UCP is set. The horizontal space char-\n       acters are:\n\n         U+0009     Horizontal tab (HT)\n         U+0020     Space\n         U+00A0     Non-break space\n         U+1680     Ogham space mark\n         U+180E     Mongolian vowel separator\n         U+2000     En quad\n         U+2001     Em quad\n         U+2002     En space\n         U+2003     Em space\n         U+2004     Three-per-em space\n         U+2005     Four-per-em space\n         U+2006     Six-per-em space\n         U+2007     Figure space\n         U+2008     Punctuation space\n         U+2009     Thin space\n         U+200A     Hair space\n         U+202F     Narrow no-break space\n         U+205F     Medium mathematical space\n         U+3000     Ideographic space\n\n       The vertical space characters are:\n\n         U+000A     Linefeed (LF)\n         U+000B     Vertical tab (VT)\n         U+000C     Form feed (FF)\n         U+000D     Carriage return (CR)\n         U+0085     Next line (NEL)\n         U+2028     Line separator\n         U+2029     Paragraph separator\n\n       In 8-bit, non-UTF-8 mode, only the characters with codepoints less than\n       256 are relevant.\n\n   Newline sequences\n\n       Outside a character class, by default, the escape sequence  \\R  matches\n       any  Unicode newline sequence. In 8-bit non-UTF-8 mode \\R is equivalent\n       to the following:\n\n         (?>\\r\\n|\\n|\\x0b|\\f|\\r|\\x85)\n\n       This is an example of an \"atomic group\", details  of  which  are  given\n       below.  This particular group matches either the two-character sequence\n       CR followed by LF, or  one  of  the  single  characters  LF  (linefeed,\n       U+000A),  VT  (vertical  tab, U+000B), FF (form feed, U+000C), CR (car-\n       riage return, U+000D), or NEL (next line,  U+0085).  The  two-character\n       sequence is treated as a single unit that cannot be split.\n\n       In  other modes, two additional characters whose codepoints are greater\n       than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa-\n       rator,  U+2029).   Unicode character property support is not needed for\n       these characters to be recognized.\n\n       It is possible to restrict \\R to match only CR, LF, or CRLF (instead of\n       the  complete  set  of  Unicode  line  endings)  by  setting the option\n       PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched.\n       (BSR is an abbrevation for \"backslash R\".) This can be made the default\n       when PCRE is built; if this is the case, the  other  behaviour  can  be\n       requested  via  the  PCRE_BSR_UNICODE  option.   It is also possible to\n       specify these settings by starting a pattern string  with  one  of  the\n       following sequences:\n\n         (*BSR_ANYCRLF)   CR, LF, or CRLF only\n         (*BSR_UNICODE)   any Unicode newline sequence\n\n       These override the default and the options given to the compiling func-\n       tion, but they can themselves be  overridden  by  options  given  to  a\n       matching  function.  Note  that  these  special settings, which are not\n       Perl-compatible, are recognized only at the very start  of  a  pattern,\n       and  that  they  must  be  in  upper  case. If more than one of them is\n       present, the last one is used. They can be combined with  a  change  of\n       newline convention; for example, a pattern can start with:\n\n         (*ANY)(*BSR_ANYCRLF)\n\n       They  can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF)\n       or (*UCP) special sequences. Inside a character class, \\R is treated as\n       an  unrecognized  escape  sequence,  and  so  matches the letter \"R\" by\n       default, but causes an error if PCRE_EXTRA is set.\n\n   Unicode character properties\n\n       When PCRE is built with Unicode character property support, three addi-\n       tional  escape sequences that match characters with specific properties\n       are available.  When in 8-bit non-UTF-8 mode, these  sequences  are  of\n       course  limited  to  testing  characters whose codepoints are less than\n       256, but they do work in this mode.  The extra escape sequences are:\n\n         \\p{xx}   a character with the xx property\n         \\P{xx}   a character without the xx property\n         \\X       a Unicode extended grapheme cluster\n\n       The property names represented by xx above are limited to  the  Unicode\n       script names, the general category properties, \"Any\", which matches any\n       character  (including  newline),  and  some  special  PCRE   properties\n       (described  in the next section).  Other Perl properties such as \"InMu-\n       sicalSymbols\" are not currently supported by PCRE.  Note  that  \\P{Any}\n       does not match any characters, so always causes a match failure.\n\n       Sets of Unicode characters are defined as belonging to certain scripts.\n       A character from one of these sets can be matched using a script  name.\n       For example:\n\n         \\p{Greek}\n         \\P{Han}\n\n       Those  that are not part of an identified script are lumped together as\n       \"Common\". The current list of scripts is:\n\n       Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak,  Bengali,\n       Bopomofo,  Brahmi,  Braille, Buginese, Buhid, Canadian_Aboriginal, Car-\n       ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei-\n       form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero-\n       glyphs,  Elbasan,  Ethiopic,  Georgian,  Glagolitic,  Gothic,  Grantha,\n       Greek,  Gujarati,  Gurmukhi,  Han,  Hangul,  Hanunoo, Hebrew, Hiragana,\n       Imperial_Aramaic,    Inherited,     Inscriptional_Pahlavi,     Inscrip-\n       tional_Parthian,   Javanese,   Kaithi,   Kannada,  Katakana,  Kayah_Li,\n       Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha,  Limbu,  Lin-\n       ear_A,  Linear_B,  Lisu,  Lycian, Lydian, Mahajani, Malayalam, Mandaic,\n       Manichaean,     Meetei_Mayek,     Mende_Kikakui,      Meroitic_Cursive,\n       Meroitic_Hieroglyphs,  Miao,  Modi, Mongolian, Mro, Myanmar, Nabataean,\n       New_Tai_Lue,  Nko,  Ogham,  Ol_Chiki,  Old_Italic,   Old_North_Arabian,\n       Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya,\n       Pahawh_Hmong,    Palmyrene,    Pau_Cin_Hau,    Phags_Pa,    Phoenician,\n       Psalter_Pahlavi,  Rejang,  Runic,  Samaritan, Saurashtra, Sharada, Sha-\n       vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri,  Syriac,\n       Tagalog,  Tagbanwa,  Tai_Le,  Tai_Tham, Tai_Viet, Takri, Tamil, Telugu,\n       Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic,  Vai,  Warang_Citi,\n       Yi.\n\n       Each character has exactly one Unicode general category property, spec-\n       ified by a two-letter abbreviation. For compatibility with Perl,  nega-\n       tion  can  be  specified  by including a circumflex between the opening\n       brace and the property name.  For  example,  \\p{^Lu}  is  the  same  as\n       \\P{Lu}.\n\n       If only one letter is specified with \\p or \\P, it includes all the gen-\n       eral category properties that start with that letter. In this case,  in\n       the  absence of negation, the curly brackets in the escape sequence are\n       optional; these two examples have the same effect:\n\n         \\p{L}\n         \\pL\n\n       The following general category property codes are supported:\n\n         C     Other\n         Cc    Control\n         Cf    Format\n         Cn    Unassigned\n         Co    Private use\n         Cs    Surrogate\n\n         L     Letter\n         Ll    Lower case letter\n         Lm    Modifier letter\n         Lo    Other letter\n         Lt    Title case letter\n         Lu    Upper case letter\n\n         M     Mark\n         Mc    Spacing mark\n         Me    Enclosing mark\n         Mn    Non-spacing mark\n\n         N     Number\n         Nd    Decimal number\n         Nl    Letter number\n         No    Other number\n\n         P     Punctuation\n         Pc    Connector punctuation\n         Pd    Dash punctuation\n         Pe    Close punctuation\n         Pf    Final punctuation\n         Pi    Initial punctuation\n         Po    Other punctuation\n         Ps    Open punctuation\n\n         S     Symbol\n         Sc    Currency symbol\n         Sk    Modifier symbol\n         Sm    Mathematical symbol\n         So    Other symbol\n\n         Z     Separator\n         Zl    Line separator\n         Zp    Paragraph separator\n         Zs    Space separator\n\n       The special property L& is also supported: it matches a character  that\n       has  the  Lu,  Ll, or Lt property, in other words, a letter that is not\n       classified as a modifier or \"other\".\n\n       The Cs (Surrogate) property applies only to  characters  in  the  range\n       U+D800  to U+DFFF. Such characters are not valid in Unicode strings and\n       so cannot be tested by PCRE, unless  UTF  validity  checking  has  been\n       turned    off    (see    the    discussion    of    PCRE_NO_UTF8_CHECK,\n       PCRE_NO_UTF16_CHECK and PCRE_NO_UTF32_CHECK in the pcreapi page).  Perl\n       does not support the Cs property.\n\n       The  long  synonyms  for  property  names  that  Perl supports (such as\n       \\p{Letter}) are not supported by PCRE, nor is it  permitted  to  prefix\n       any of these properties with \"Is\".\n\n       No character that is in the Unicode table has the Cn (unassigned) prop-\n       erty.  Instead, this property is assumed for any code point that is not\n       in the Unicode table.\n\n       Specifying  caseless  matching  does not affect these escape sequences.\n       For example, \\p{Lu} always matches only upper  case  letters.  This  is\n       different from the behaviour of current versions of Perl.\n\n       Matching  characters  by Unicode property is not fast, because PCRE has\n       to do a multistage table lookup in order to find  a  character's  prop-\n       erty. That is why the traditional escape sequences such as \\d and \\w do\n       not use Unicode properties in PCRE by default, though you can make them\n       do  so  by  setting the PCRE_UCP option or by starting the pattern with\n       (*UCP).\n\n   Extended grapheme clusters\n\n       The \\X escape matches any number of Unicode  characters  that  form  an\n       \"extended grapheme cluster\", and treats the sequence as an atomic group\n       (see below).  Up to and including release 8.31, PCRE  matched  an  ear-\n       lier, simpler definition that was equivalent to\n\n         (?>\\PM\\pM*)\n\n       That  is,  it matched a character without the \"mark\" property, followed\n       by zero or more characters with the \"mark\"  property.  Characters  with\n       the  \"mark\"  property are typically non-spacing accents that affect the\n       preceding character.\n\n       This simple definition was extended in Unicode to include more  compli-\n       cated  kinds of composite character by giving each character a grapheme\n       breaking property, and creating rules  that  use  these  properties  to\n       define  the  boundaries  of  extended grapheme clusters. In releases of\n       PCRE later than 8.31, \\X matches one of these clusters.\n\n       \\X always matches at least one character. Then it  decides  whether  to\n       add additional characters according to the following rules for ending a\n       cluster:\n\n       1. End at the end of the subject string.\n\n       2. Do not end between CR and LF; otherwise end after any control  char-\n       acter.\n\n       3.  Do  not  break  Hangul (a Korean script) syllable sequences. Hangul\n       characters are of five types: L, V, T, LV, and LVT. An L character  may\n       be  followed by an L, V, LV, or LVT character; an LV or V character may\n       be followed by a V or T character; an LVT or T character may be follwed\n       only by a T character.\n\n       4.  Do not end before extending characters or spacing marks. Characters\n       with the \"mark\" property always have  the  \"extend\"  grapheme  breaking\n       property.\n\n       5. Do not end after prepend characters.\n\n       6. Otherwise, end the cluster.\n\n   PCRE's additional properties\n\n       As  well  as the standard Unicode properties described above, PCRE sup-\n       ports four more that make it possible  to  convert  traditional  escape\n       sequences  such as \\w and \\s to use Unicode properties. PCRE uses these\n       non-standard, non-Perl properties internally when PCRE_UCP is set. How-\n       ever, they may also be used explicitly. These properties are:\n\n         Xan   Any alphanumeric character\n         Xps   Any POSIX space character\n         Xsp   Any Perl space character\n         Xwd   Any Perl \"word\" character\n\n       Xan  matches  characters that have either the L (letter) or the N (num-\n       ber) property. Xps matches the characters tab, linefeed, vertical  tab,\n       form  feed,  or carriage return, and any other character that has the Z\n       (separator) property.  Xsp is the same as Xps; it used to exclude  ver-\n       tical  tab,  for Perl compatibility, but Perl changed, and so PCRE fol-\n       lowed at release 8.34. Xwd matches the same  characters  as  Xan,  plus\n       underscore.\n\n       There  is another non-standard property, Xuc, which matches any charac-\n       ter that can be represented by a Universal Character Name  in  C++  and\n       other  programming  languages.  These are the characters $, @, ` (grave\n       accent), and all characters with Unicode code points  greater  than  or\n       equal  to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that\n       most base (ASCII) characters are excluded. (Universal  Character  Names\n       are  of  the  form \\uHHHH or \\UHHHHHHHH where H is a hexadecimal digit.\n       Note that the Xuc property does not match these sequences but the char-\n       acters that they represent.)\n\n   Resetting the match start\n\n       The  escape sequence \\K causes any previously matched characters not to\n       be included in the final matched sequence. For example, the pattern:\n\n         foo\\Kbar\n\n       matches \"foobar\", but reports that it has matched \"bar\".  This  feature\n       is  similar  to  a lookbehind assertion (described below).  However, in\n       this case, the part of the subject before the real match does not  have\n       to  be of fixed length, as lookbehind assertions do. The use of \\K does\n       not interfere with the setting of captured  substrings.   For  example,\n       when the pattern\n\n         (foo)\\Kbar\n\n       matches \"foobar\", the first substring is still set to \"foo\".\n\n       Perl  documents  that  the  use  of  \\K  within assertions is \"not well\n       defined\". In PCRE, \\K is acted upon  when  it  occurs  inside  positive\n       assertions,  but  is  ignored  in negative assertions. Note that when a\n       pattern such as (?=ab\\K) matches, the reported start of the  match  can\n       be greater than the end of the match.\n\n   Simple assertions\n\n       The  final use of backslash is for certain simple assertions. An asser-\n       tion specifies a condition that has to be met at a particular point  in\n       a  match, without consuming any characters from the subject string. The\n       use of subpatterns for more complicated assertions is described  below.\n       The backslashed assertions are:\n\n         \\b     matches at a word boundary\n         \\B     matches when not at a word boundary\n         \\A     matches at the start of the subject\n         \\Z     matches at the end of the subject\n                 also matches before a newline at the end of the subject\n         \\z     matches only at the end of the subject\n         \\G     matches at the first matching position in the subject\n\n       Inside  a  character  class, \\b has a different meaning; it matches the\n       backspace character. If any other of  these  assertions  appears  in  a\n       character  class, by default it matches the corresponding literal char-\n       acter  (for  example,  \\B  matches  the  letter  B).  However,  if  the\n       PCRE_EXTRA  option is set, an \"invalid escape sequence\" error is gener-\n       ated instead.\n\n       A word boundary is a position in the subject string where  the  current\n       character  and  the previous character do not both match \\w or \\W (i.e.\n       one matches \\w and the other matches \\W), or the start or  end  of  the\n       string  if  the  first or last character matches \\w, respectively. In a\n       UTF mode, the meanings of \\w and \\W  can  be  changed  by  setting  the\n       PCRE_UCP  option. When this is done, it also affects \\b and \\B. Neither\n       PCRE nor Perl has a separate \"start of word\" or \"end of  word\"  metase-\n       quence.  However,  whatever follows \\b normally determines which it is.\n       For example, the fragment \\ba matches \"a\" at the start of a word.\n\n       The \\A, \\Z, and \\z assertions differ from  the  traditional  circumflex\n       and dollar (described in the next section) in that they only ever match\n       at the very start and end of the subject string, whatever  options  are\n       set.  Thus,  they are independent of multiline mode. These three asser-\n       tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which\n       affect  only the behaviour of the circumflex and dollar metacharacters.\n       However, if the startoffset argument of pcre_exec() is non-zero,  indi-\n       cating that matching is to start at a point other than the beginning of\n       the subject, \\A can never match. The difference between \\Z  and  \\z  is\n       that \\Z matches before a newline at the end of the string as well as at\n       the very end, whereas \\z matches only at the end.\n\n       The \\G assertion is true only when the current matching position is  at\n       the  start point of the match, as specified by the startoffset argument\n       of pcre_exec(). It differs from \\A when the  value  of  startoffset  is\n       non-zero.  By calling pcre_exec() multiple times with appropriate argu-\n       ments, you can mimic Perl's /g option, and it is in this kind of imple-\n       mentation where \\G can be useful.\n\n       Note,  however,  that  PCRE's interpretation of \\G, as the start of the\n       current match, is subtly different from Perl's, which defines it as the\n       end  of  the  previous  match. In Perl, these can be different when the\n       previously matched string was empty. Because PCRE does just  one  match\n       at a time, it cannot reproduce this behaviour.\n\n       If  all  the alternatives of a pattern begin with \\G, the expression is\n       anchored to the starting match position, and the \"anchored\" flag is set\n       in the compiled regular expression.\n\n\nCIRCUMFLEX AND DOLLAR\n\n       The  circumflex  and  dollar  metacharacters are zero-width assertions.\n       That is, they test for a particular condition being true  without  con-\n       suming any characters from the subject string.\n\n       Outside a character class, in the default matching mode, the circumflex\n       character is an assertion that is true only  if  the  current  matching\n       point  is  at the start of the subject string. If the startoffset argu-\n       ment of pcre_exec() is non-zero, circumflex  can  never  match  if  the\n       PCRE_MULTILINE  option  is  unset. Inside a character class, circumflex\n       has an entirely different meaning (see below).\n\n       Circumflex need not be the first character of the pattern if  a  number\n       of  alternatives are involved, but it should be the first thing in each\n       alternative in which it appears if the pattern is ever  to  match  that\n       branch.  If all possible alternatives start with a circumflex, that is,\n       if the pattern is constrained to match only at the start  of  the  sub-\n       ject,  it  is  said  to be an \"anchored\" pattern. (There are also other\n       constructs that can cause a pattern to be anchored.)\n\n       The dollar character is an assertion that is true only if  the  current\n       matching  point  is  at  the  end of the subject string, or immediately\n       before a newline at the end of the string (by default). Note,  however,\n       that  it  does  not  actually match the newline. Dollar need not be the\n       last character of the pattern if a number of alternatives are involved,\n       but  it should be the last item in any branch in which it appears. Dol-\n       lar has no special meaning in a character class.\n\n       The meaning of dollar can be changed so that it  matches  only  at  the\n       very  end  of  the string, by setting the PCRE_DOLLAR_ENDONLY option at\n       compile time. This does not affect the \\Z assertion.\n\n       The meanings of the circumflex and dollar characters are changed if the\n       PCRE_MULTILINE  option  is  set.  When  this  is the case, a circumflex\n       matches immediately after internal newlines as well as at the start  of\n       the  subject  string.  It  does not match after a newline that ends the\n       string. A dollar matches before any newlines in the string, as well  as\n       at  the very end, when PCRE_MULTILINE is set. When newline is specified\n       as the two-character sequence CRLF, isolated CR and  LF  characters  do\n       not indicate newlines.\n\n       For  example, the pattern /^abc$/ matches the subject string \"def\\nabc\"\n       (where \\n represents a newline) in multiline mode, but  not  otherwise.\n       Consequently,  patterns  that  are anchored in single line mode because\n       all branches start with ^ are not anchored in  multiline  mode,  and  a\n       match  for  circumflex  is  possible  when  the startoffset argument of\n       pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is  ignored  if\n       PCRE_MULTILINE is set.\n\n       Note  that  the sequences \\A, \\Z, and \\z can be used to match the start\n       and end of the subject in both modes, and if all branches of a  pattern\n       start  with  \\A it is always anchored, whether or not PCRE_MULTILINE is\n       set.\n\n\nFULL STOP (PERIOD, DOT) AND \\N\n\n       Outside a character class, a dot in the pattern matches any one charac-\n       ter  in  the subject string except (by default) a character that signi-\n       fies the end of a line.\n\n       When a line ending is defined as a single character, dot never  matches\n       that  character; when the two-character sequence CRLF is used, dot does\n       not match CR if it is immediately followed  by  LF,  but  otherwise  it\n       matches  all characters (including isolated CRs and LFs). When any Uni-\n       code line endings are being recognized, dot does not match CR or LF  or\n       any of the other line ending characters.\n\n       The  behaviour  of  dot  with regard to newlines can be changed. If the\n       PCRE_DOTALL option is set, a dot matches  any  one  character,  without\n       exception. If the two-character sequence CRLF is present in the subject\n       string, it takes two dots to match it.\n\n       The handling of dot is entirely independent of the handling of  circum-\n       flex  and  dollar,  the  only relationship being that they both involve\n       newlines. Dot has no special meaning in a character class.\n\n       The escape sequence \\N behaves like  a  dot,  except  that  it  is  not\n       affected  by  the  PCRE_DOTALL  option.  In other words, it matches any\n       character except one that signifies the end of a line. Perl  also  uses\n       \\N to match characters by name; PCRE does not support this.\n\n\nMATCHING A SINGLE DATA UNIT\n\n       Outside  a character class, the escape sequence \\C matches any one data\n       unit, whether or not a UTF mode is set. In the 8-bit library, one  data\n       unit  is  one  byte;  in the 16-bit library it is a 16-bit unit; in the\n       32-bit library it is a 32-bit unit. Unlike a  dot,  \\C  always  matches\n       line-ending  characters.  The  feature  is provided in Perl in order to\n       match individual bytes in UTF-8 mode, but it is unclear how it can use-\n       fully  be  used.  Because  \\C breaks up characters into individual data\n       units, matching one unit with \\C in a UTF mode means that the  rest  of\n       the string may start with a malformed UTF character. This has undefined\n       results, because PCRE assumes that it is dealing with valid UTF strings\n       (and  by  default  it checks this at the start of processing unless the\n       PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or  PCRE_NO_UTF32_CHECK  option\n       is used).\n\n       PCRE  does  not  allow \\C to appear in lookbehind assertions (described\n       below) in a UTF mode, because this would make it impossible  to  calcu-\n       late the length of the lookbehind.\n\n       In general, the \\C escape sequence is best avoided. However, one way of\n       using it that avoids the problem of malformed UTF characters is to  use\n       a  lookahead to check the length of the next character, as in this pat-\n       tern, which could be used with a UTF-8 string (ignore white  space  and\n       line breaks):\n\n         (?| (?=[\\x00-\\x7f])(\\C) |\n             (?=[\\x80-\\x{7ff}])(\\C)(\\C) |\n             (?=[\\x{800}-\\x{ffff}])(\\C)(\\C)(\\C) |\n             (?=[\\x{10000}-\\x{1fffff}])(\\C)(\\C)(\\C)(\\C))\n\n       A  group  that starts with (?| resets the capturing parentheses numbers\n       in each alternative (see \"Duplicate  Subpattern  Numbers\"  below).  The\n       assertions  at  the start of each branch check the next UTF-8 character\n       for values whose encoding uses 1, 2, 3, or 4 bytes,  respectively.  The\n       character's  individual bytes are then captured by the appropriate num-\n       ber of groups.\n\n\nSQUARE BRACKETS AND CHARACTER CLASSES\n\n       An opening square bracket introduces a character class, terminated by a\n       closing square bracket. A closing square bracket on its own is not spe-\n       cial by default.  However, if the PCRE_JAVASCRIPT_COMPAT option is set,\n       a lone closing square bracket causes a compile-time error. If a closing\n       square bracket is required as a member of the class, it should  be  the\n       first  data  character  in  the  class (after an initial circumflex, if\n       present) or escaped with a backslash.\n\n       A character class matches a single character in the subject. In  a  UTF\n       mode,  the  character  may  be  more than one data unit long. A matched\n       character must be in the set of characters defined by the class, unless\n       the  first  character in the class definition is a circumflex, in which\n       case the subject character must not be in the set defined by the class.\n       If  a  circumflex is actually required as a member of the class, ensure\n       it is not the first character, or escape it with a backslash.\n\n       For example, the character class [aeiou] matches any lower case  vowel,\n       while  [^aeiou]  matches  any character that is not a lower case vowel.\n       Note that a circumflex is just a convenient notation for specifying the\n       characters  that  are in the class by enumerating those that are not. A\n       class that starts with a circumflex is not an assertion; it still  con-\n       sumes  a  character  from the subject string, and therefore it fails if\n       the current pointer is at the end of the string.\n\n       In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255\n       (0xffff)  can be included in a class as a literal string of data units,\n       or by using the \\x{ escaping mechanism.\n\n       When caseless matching is set, any letters in a  class  represent  both\n       their  upper  case  and lower case versions, so for example, a caseless\n       [aeiou] matches \"A\" as well as \"a\", and a caseless  [^aeiou]  does  not\n       match  \"A\", whereas a caseful version would. In a UTF mode, PCRE always\n       understands the concept of case for characters whose  values  are  less\n       than  128, so caseless matching is always possible. For characters with\n       higher values, the concept of case is supported  if  PCRE  is  compiled\n       with  Unicode  property support, but not otherwise.  If you want to use\n       caseless matching in a UTF mode for characters 128 and above, you  must\n       ensure  that  PCRE is compiled with Unicode property support as well as\n       with UTF support.\n\n       Characters that might indicate line breaks are  never  treated  in  any\n       special  way  when  matching  character  classes,  whatever line-ending\n       sequence is in  use,  and  whatever  setting  of  the  PCRE_DOTALL  and\n       PCRE_MULTILINE options is used. A class such as [^a] always matches one\n       of these characters.\n\n       The minus (hyphen) character can be used to specify a range of  charac-\n       ters  in  a  character  class.  For  example,  [d-m] matches any letter\n       between d and m, inclusive. If a  minus  character  is  required  in  a\n       class,  it  must  be  escaped  with a backslash or appear in a position\n       where it cannot be interpreted as indicating a range, typically as  the\n       first or last character in the class, or immediately after a range. For\n       example, [b-d-z] matches letters in the range b to d, a hyphen  charac-\n       ter, or z.\n\n       It is not possible to have the literal character \"]\" as the end charac-\n       ter of a range. A pattern such as [W-]46] is interpreted as a class  of\n       two  characters (\"W\" and \"-\") followed by a literal string \"46]\", so it\n       would match \"W46]\" or \"-46]\". However, if the \"]\"  is  escaped  with  a\n       backslash  it is interpreted as the end of range, so [W-\\]46] is inter-\n       preted as a class containing a range followed by two other  characters.\n       The  octal or hexadecimal representation of \"]\" can also be used to end\n       a range.\n\n       An error is generated if a POSIX character  class  (see  below)  or  an\n       escape  sequence other than one that defines a single character appears\n       at a point where a range ending character  is  expected.  For  example,\n       [z-\\xff] is valid, but [A-\\d] and [A-[:digit:]] are not.\n\n       Ranges  operate in the collating sequence of character values. They can\n       also  be  used  for  characters  specified  numerically,  for   example\n       [\\000-\\037].  Ranges  can include any characters that are valid for the\n       current mode.\n\n       If a range that includes letters is used when caseless matching is set,\n       it matches the letters in either case. For example, [W-c] is equivalent\n       to [][\\\\^_`wxyzabc], matched caselessly, and  in  a  non-UTF  mode,  if\n       character  tables  for  a French locale are in use, [\\xc8-\\xcb] matches\n       accented E characters in both cases. In UTF modes,  PCRE  supports  the\n       concept  of  case for characters with values greater than 128 only when\n       it is compiled with Unicode property support.\n\n       The character escape sequences \\d, \\D, \\h, \\H, \\p, \\P, \\s, \\S, \\v,  \\V,\n       \\w, and \\W may appear in a character class, and add the characters that\n       they match to the class. For example, [\\dABCDEF] matches any  hexadeci-\n       mal  digit.  In  UTF modes, the PCRE_UCP option affects the meanings of\n       \\d, \\s, \\w and their upper case partners, just as  it  does  when  they\n       appear  outside a character class, as described in the section entitled\n       \"Generic character types\" above. The escape sequence \\b has a different\n       meaning  inside  a character class; it matches the backspace character.\n       The sequences \\B, \\N, \\R, and \\X are not  special  inside  a  character\n       class.  Like  any other unrecognized escape sequences, they are treated\n       as the literal characters \"B\", \"N\", \"R\", and \"X\" by default, but  cause\n       an error if the PCRE_EXTRA option is set.\n\n       A  circumflex  can  conveniently  be used with the upper case character\n       types to specify a more restricted set of characters than the  matching\n       lower  case  type.  For example, the class [^\\W_] matches any letter or\n       digit, but not underscore, whereas [\\w] includes underscore. A positive\n       character class should be read as \"something OR something OR ...\" and a\n       negative class as \"NOT something AND NOT something AND NOT ...\".\n\n       The only metacharacters that are recognized in  character  classes  are\n       backslash,  hyphen  (only  where  it can be interpreted as specifying a\n       range), circumflex (only at the start), opening  square  bracket  (only\n       when  it can be interpreted as introducing a POSIX class name, or for a\n       special compatibility feature - see the next  two  sections),  and  the\n       terminating  closing  square  bracket.  However,  escaping  other  non-\n       alphanumeric characters does no harm.\n\n\nPOSIX CHARACTER CLASSES\n\n       Perl supports the POSIX notation for character classes. This uses names\n       enclosed  by  [: and :] within the enclosing square brackets. PCRE also\n       supports this notation. For example,\n\n         [01[:alpha:]%]\n\n       matches \"0\", \"1\", any alphabetic character, or \"%\". The supported class\n       names are:\n\n         alnum    letters and digits\n         alpha    letters\n         ascii    character codes 0 - 127\n         blank    space or tab only\n         cntrl    control characters\n         digit    decimal digits (same as \\d)\n         graph    printing characters, excluding space\n         lower    lower case letters\n         print    printing characters, including space\n         punct    printing characters, excluding letters and digits and space\n         space    white space (the same as \\s from PCRE 8.34)\n         upper    upper case letters\n         word     \"word\" characters (same as \\w)\n         xdigit   hexadecimal digits\n\n       The  default  \"space\" characters are HT (9), LF (10), VT (11), FF (12),\n       CR (13), and space (32). If locale-specific matching is  taking  place,\n       the  list  of  space characters may be different; there may be fewer or\n       more of them. \"Space\" used to be different to \\s, which did not include\n       VT, for Perl compatibility.  However, Perl changed at release 5.18, and\n       PCRE followed at release 8.34.  \"Space\" and \\s now match the  same  set\n       of characters.\n\n       The  name  \"word\"  is  a Perl extension, and \"blank\" is a GNU extension\n       from Perl 5.8. Another Perl extension is negation, which  is  indicated\n       by a ^ character after the colon. For example,\n\n         [12[:^digit:]]\n\n       matches  \"1\", \"2\", or any non-digit. PCRE (and Perl) also recognize the\n       POSIX syntax [.ch.] and [=ch=] where \"ch\" is a \"collating element\", but\n       these are not supported, and an error is given if they are encountered.\n\n       By default, characters with values greater than 128 do not match any of\n       the POSIX character classes. However, if the PCRE_UCP option is  passed\n       to  pcre_compile(),  some  of  the  classes are changed so that Unicode\n       character properties are used. This is achieved  by  replacing  certain\n       POSIX classes by other sequences, as follows:\n\n         [:alnum:]  becomes  \\p{Xan}\n         [:alpha:]  becomes  \\p{L}\n         [:blank:]  becomes  \\h\n         [:digit:]  becomes  \\p{Nd}\n         [:lower:]  becomes  \\p{Ll}\n         [:space:]  becomes  \\p{Xps}\n         [:upper:]  becomes  \\p{Lu}\n         [:word:]   becomes  \\p{Xwd}\n\n       Negated  versions, such as [:^alpha:] use \\P instead of \\p. Three other\n       POSIX classes are handled specially in UCP mode:\n\n       [:graph:] This matches characters that have glyphs that mark  the  page\n                 when printed. In Unicode property terms, it matches all char-\n                 acters with the L, M, N, P, S, or Cf properties, except for:\n\n                   U+061C           Arabic Letter Mark\n                   U+180E           Mongolian Vowel Separator\n                   U+2066 - U+2069  Various \"isolate\"s\n\n\n       [:print:] This matches the same  characters  as  [:graph:]  plus  space\n                 characters  that  are  not controls, that is, characters with\n                 the Zs property.\n\n       [:punct:] This matches all characters that have the Unicode P (punctua-\n                 tion)  property,  plus those characters whose code points are\n                 less than 128 that have the S (Symbol) property.\n\n       The other POSIX classes are unchanged, and match only  characters  with\n       code points less than 128.\n\n\nCOMPATIBILITY FEATURE FOR WORD BOUNDARIES\n\n       In  the POSIX.2 compliant library that was included in 4.4BSD Unix, the\n       ugly syntax [[:<:]] and [[:>:]] is used for matching  \"start  of  word\"\n       and \"end of word\". PCRE treats these items as follows:\n\n         [[:<:]]  is converted to  \\b(?=\\w)\n         [[:>:]]  is converted to  \\b(?<=\\w)\n\n       Only these exact character sequences are recognized. A sequence such as\n       [a[:<:]b] provokes error for an unrecognized  POSIX  class  name.  This\n       support  is not compatible with Perl. It is provided to help migrations\n       from other environments, and is best not used in any new patterns. Note\n       that  \\b matches at the start and the end of a word (see \"Simple asser-\n       tions\" above), and in a Perl-style pattern the preceding  or  following\n       character  normally  shows  which  is  wanted, without the need for the\n       assertions that are used above in order to give exactly the  POSIX  be-\n       haviour.\n\n\nVERTICAL BAR\n\n       Vertical  bar characters are used to separate alternative patterns. For\n       example, the pattern\n\n         gilbert|sullivan\n\n       matches either \"gilbert\" or \"sullivan\". Any number of alternatives  may\n       appear,  and  an  empty  alternative  is  permitted (matching the empty\n       string). The matching process tries each alternative in turn, from left\n       to  right, and the first one that succeeds is used. If the alternatives\n       are within a subpattern (defined below), \"succeeds\" means matching  the\n       rest of the main pattern as well as the alternative in the subpattern.\n\n\nINTERNAL OPTION SETTING\n\n       The  settings  of  the  PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and\n       PCRE_EXTENDED options (which are Perl-compatible) can be  changed  from\n       within  the  pattern  by  a  sequence  of  Perl option letters enclosed\n       between \"(?\" and \")\".  The option letters are\n\n         i  for PCRE_CASELESS\n         m  for PCRE_MULTILINE\n         s  for PCRE_DOTALL\n         x  for PCRE_EXTENDED\n\n       For example, (?im) sets caseless, multiline matching. It is also possi-\n       ble to unset these options by preceding the letter with a hyphen, and a\n       combined setting and unsetting such as (?im-sx), which sets  PCRE_CASE-\n       LESS  and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED,\n       is also permitted. If a  letter  appears  both  before  and  after  the\n       hyphen, the option is unset.\n\n       The  PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA\n       can be changed in the same way as the Perl-compatible options by  using\n       the characters J, U and X respectively.\n\n       When  one  of  these  option  changes occurs at top level (that is, not\n       inside subpattern parentheses), the change applies to the remainder  of\n       the  pattern  that  follows.  An option change within a subpattern (see\n       below for a description of subpatterns) affects only that part  of  the\n       subpattern that follows it, so\n\n         (a(?i)b)c\n\n       matches abc and aBc and no other strings (assuming PCRE_CASELESS is not\n       used).  By this means, options can be made to have  different  settings\n       in  different parts of the pattern. Any changes made in one alternative\n       do carry on into subsequent branches within the  same  subpattern.  For\n       example,\n\n         (a(?i)b|c)\n\n       matches  \"ab\",  \"aB\",  \"c\",  and \"C\", even though when matching \"C\" the\n       first branch is abandoned before the option setting.  This  is  because\n       the  effects  of option settings happen at compile time. There would be\n       some very weird behaviour otherwise.\n\n       Note: There are other PCRE-specific options that  can  be  set  by  the\n       application  when  the  compiling  or matching functions are called. In\n       some cases the pattern can contain special leading  sequences  such  as\n       (*CRLF)  to  override  what  the  application  has set or what has been\n       defaulted.  Details  are  given  in  the  section   entitled   \"Newline\n       sequences\"  above.  There  are also the (*UTF8), (*UTF16),(*UTF32), and\n       (*UCP) leading sequences that can be used to set UTF and Unicode  prop-\n       erty  modes;  they are equivalent to setting the PCRE_UTF8, PCRE_UTF16,\n       PCRE_UTF32 and the PCRE_UCP options, respectively. The (*UTF)  sequence\n       is  a  generic version that can be used with any of the libraries. How-\n       ever, the application can set the PCRE_NEVER_UTF  option,  which  locks\n       out the use of the (*UTF) sequences.\n\n\nSUBPATTERNS\n\n       Subpatterns are delimited by parentheses (round brackets), which can be\n       nested.  Turning part of a pattern into a subpattern does two things:\n\n       1. It localizes a set of alternatives. For example, the pattern\n\n         cat(aract|erpillar|)\n\n       matches \"cataract\", \"caterpillar\", or \"cat\". Without  the  parentheses,\n       it would match \"cataract\", \"erpillar\" or an empty string.\n\n       2.  It  sets  up  the  subpattern as a capturing subpattern. This means\n       that, when the whole pattern  matches,  that  portion  of  the  subject\n       string that matched the subpattern is passed back to the caller via the\n       ovector argument of the matching function. (This applies  only  to  the\n       traditional  matching functions; the DFA matching functions do not sup-\n       port capturing.)\n\n       Opening parentheses are counted from left to right (starting from 1) to\n       obtain  numbers  for  the  capturing  subpatterns.  For example, if the\n       string \"the red king\" is matched against the pattern\n\n         the ((red|white) (king|queen))\n\n       the captured substrings are \"red king\", \"red\", and \"king\", and are num-\n       bered 1, 2, and 3, respectively.\n\n       The  fact  that  plain  parentheses  fulfil two functions is not always\n       helpful.  There are often times when a grouping subpattern is  required\n       without  a capturing requirement. If an opening parenthesis is followed\n       by a question mark and a colon, the subpattern does not do any  captur-\n       ing,  and  is  not  counted when computing the number of any subsequent\n       capturing subpatterns. For example, if the string \"the white queen\"  is\n       matched against the pattern\n\n         the ((?:red|white) (king|queen))\n\n       the captured substrings are \"white queen\" and \"queen\", and are numbered\n       1 and 2. The maximum number of capturing subpatterns is 65535.\n\n       As a convenient shorthand, if any option settings are required  at  the\n       start  of  a  non-capturing  subpattern,  the option letters may appear\n       between the \"?\" and the \":\". Thus the two patterns\n\n         (?i:saturday|sunday)\n         (?:(?i)saturday|sunday)\n\n       match exactly the same set of strings. Because alternative branches are\n       tried  from  left  to right, and options are not reset until the end of\n       the subpattern is reached, an option setting in one branch does  affect\n       subsequent  branches,  so  the above patterns match \"SUNDAY\" as well as\n       \"Saturday\".\n\n\nDUPLICATE SUBPATTERN NUMBERS\n\n       Perl 5.10 introduced a feature whereby each alternative in a subpattern\n       uses  the same numbers for its capturing parentheses. Such a subpattern\n       starts with (?| and is itself a non-capturing subpattern. For  example,\n       consider this pattern:\n\n         (?|(Sat)ur|(Sun))day\n\n       Because  the two alternatives are inside a (?| group, both sets of cap-\n       turing parentheses are numbered one. Thus, when  the  pattern  matches,\n       you  can  look  at captured substring number one, whichever alternative\n       matched. This construct is useful when you want to  capture  part,  but\n       not all, of one of a number of alternatives. Inside a (?| group, paren-\n       theses are numbered as usual, but the number is reset at the  start  of\n       each  branch.  The numbers of any capturing parentheses that follow the\n       subpattern start after the highest number used in any branch. The  fol-\n       lowing example is taken from the Perl documentation. The numbers under-\n       neath show in which buffer the captured content will be stored.\n\n         # before  ---------------branch-reset----------- after\n         / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x\n         # 1            2         2  3        2     3     4\n\n       A back reference to a numbered subpattern uses the  most  recent  value\n       that  is  set  for that number by any subpattern. The following pattern\n       matches \"abcabc\" or \"defdef\":\n\n         /(?|(abc)|(def))\\1/\n\n       In contrast, a subroutine call to a numbered subpattern  always  refers\n       to  the  first  one in the pattern with the given number. The following\n       pattern matches \"abcabc\" or \"defabc\":\n\n         /(?|(abc)|(def))(?1)/\n\n       If a condition test for a subpattern's having matched refers to a  non-\n       unique  number, the test is true if any of the subpatterns of that num-\n       ber have matched.\n\n       An alternative approach to using this \"branch reset\" feature is to  use\n       duplicate named subpatterns, as described in the next section.\n\n\nNAMED SUBPATTERNS\n\n       Identifying  capturing  parentheses  by number is simple, but it can be\n       very hard to keep track of the numbers in complicated  regular  expres-\n       sions.  Furthermore,  if  an  expression  is  modified, the numbers may\n       change. To help with this difficulty, PCRE supports the naming of  sub-\n       patterns. This feature was not added to Perl until release 5.10. Python\n       had the feature earlier, and PCRE introduced it at release  4.0,  using\n       the  Python syntax. PCRE now supports both the Perl and the Python syn-\n       tax. Perl allows identically numbered  subpatterns  to  have  different\n       names, but PCRE does not.\n\n       In  PCRE,  a subpattern can be named in one of three ways: (?<name>...)\n       or (?'name'...) as in Perl, or (?P<name>...) as in  Python.  References\n       to  capturing parentheses from other parts of the pattern, such as back\n       references, recursion, and conditions, can be made by name as  well  as\n       by number.\n\n       Names  consist of up to 32 alphanumeric characters and underscores, but\n       must start with a non-digit.  Named  capturing  parentheses  are  still\n       allocated  numbers  as  well as names, exactly as if the names were not\n       present. The PCRE API provides function calls for extracting the  name-\n       to-number  translation  table  from a compiled pattern. There is also a\n       convenience function for extracting a captured substring by name.\n\n       By default, a name must be unique within a pattern, but it is  possible\n       to relax this constraint by setting the PCRE_DUPNAMES option at compile\n       time. (Duplicate names are also always permitted for  subpatterns  with\n       the  same  number, set up as described in the previous section.) Dupli-\n       cate names can be useful for patterns where only one  instance  of  the\n       named  parentheses  can  match. Suppose you want to match the name of a\n       weekday, either as a 3-letter abbreviation or as the full name, and  in\n       both cases you want to extract the abbreviation. This pattern (ignoring\n       the line breaks) does the job:\n\n         (?<DN>Mon|Fri|Sun)(?:day)?|\n         (?<DN>Tue)(?:sday)?|\n         (?<DN>Wed)(?:nesday)?|\n         (?<DN>Thu)(?:rsday)?|\n         (?<DN>Sat)(?:urday)?\n\n       There are five capturing substrings, but only one is ever set  after  a\n       match.  (An alternative way of solving this problem is to use a \"branch\n       reset\" subpattern, as described in the previous section.)\n\n       The convenience function for extracting the data by  name  returns  the\n       substring  for  the first (and in this example, the only) subpattern of\n       that name that matched. This saves searching  to  find  which  numbered\n       subpattern it was.\n\n       If  you  make  a  back  reference to a non-unique named subpattern from\n       elsewhere in the pattern, the subpatterns to which the name refers  are\n       checked  in  the order in which they appear in the overall pattern. The\n       first one that is set is used for the reference. For example, this pat-\n       tern matches both \"foofoo\" and \"barbar\" but not \"foobar\" or \"barfoo\":\n\n         (?:(?<n>foo)|(?<n>bar))\\k<n>\n\n\n       If you make a subroutine call to a non-unique named subpattern, the one\n       that corresponds to the first occurrence of the name is  used.  In  the\n       absence of duplicate numbers (see the previous section) this is the one\n       with the lowest number.\n\n       If you use a named reference in a condition test (see the section about\n       conditions below), either to check whether a subpattern has matched, or\n       to check for recursion, all subpatterns with the same name are  tested.\n       If  the condition is true for any one of them, the overall condition is\n       true. This is the same behaviour as  testing  by  number.  For  further\n       details  of  the  interfaces  for  handling  named subpatterns, see the\n       pcreapi documentation.\n\n       Warning: You cannot use different names to distinguish between two sub-\n       patterns  with  the same number because PCRE uses only the numbers when\n       matching. For this reason, an error is given at compile time if differ-\n       ent  names  are given to subpatterns with the same number. However, you\n       can always give the same name to subpatterns with the same number, even\n       when PCRE_DUPNAMES is not set.\n\n\nREPETITION\n\n       Repetition  is  specified  by  quantifiers, which can follow any of the\n       following items:\n\n         a literal data character\n         the dot metacharacter\n         the \\C escape sequence\n         the \\X escape sequence\n         the \\R escape sequence\n         an escape such as \\d or \\pL that matches a single character\n         a character class\n         a back reference (see next section)\n         a parenthesized subpattern (including assertions)\n         a subroutine call to a subpattern (recursive or otherwise)\n\n       The general repetition quantifier specifies a minimum and maximum  num-\n       ber  of  permitted matches, by giving the two numbers in curly brackets\n       (braces), separated by a comma. The numbers must be  less  than  65536,\n       and the first must be less than or equal to the second. For example:\n\n         z{2,4}\n\n       matches  \"zz\",  \"zzz\",  or  \"zzzz\". A closing brace on its own is not a\n       special character. If the second number is omitted, but  the  comma  is\n       present,  there  is  no upper limit; if the second number and the comma\n       are both omitted, the quantifier specifies an exact number of  required\n       matches. Thus\n\n         [aeiou]{3,}\n\n       matches at least 3 successive vowels, but may match many more, while\n\n         \\d{8}\n\n       matches  exactly  8  digits. An opening curly bracket that appears in a\n       position where a quantifier is not allowed, or one that does not  match\n       the  syntax of a quantifier, is taken as a literal character. For exam-\n       ple, {,6} is not a quantifier, but a literal string of four characters.\n\n       In UTF modes, quantifiers apply to characters rather than to individual\n       data  units. Thus, for example, \\x{100}{2} matches two characters, each\n       of which is represented by a two-byte sequence in a UTF-8 string. Simi-\n       larly,  \\X{3} matches three Unicode extended grapheme clusters, each of\n       which may be several data units long (and  they  may  be  of  different\n       lengths).\n\n       The quantifier {0} is permitted, causing the expression to behave as if\n       the previous item and the quantifier were not present. This may be use-\n       ful  for  subpatterns that are referenced as subroutines from elsewhere\n       in the pattern (but see also the section entitled \"Defining subpatterns\n       for  use  by  reference only\" below). Items other than subpatterns that\n       have a {0} quantifier are omitted from the compiled pattern.\n\n       For convenience, the three most common quantifiers have  single-charac-\n       ter abbreviations:\n\n         *    is equivalent to {0,}\n         +    is equivalent to {1,}\n         ?    is equivalent to {0,1}\n\n       It  is  possible  to construct infinite loops by following a subpattern\n       that can match no characters with a quantifier that has no upper limit,\n       for example:\n\n         (a?)*\n\n       Earlier versions of Perl and PCRE used to give an error at compile time\n       for such patterns. However, because there are cases where this  can  be\n       useful,  such  patterns  are now accepted, but if any repetition of the\n       subpattern does in fact match no characters, the loop is forcibly  bro-\n       ken.\n\n       By  default,  the quantifiers are \"greedy\", that is, they match as much\n       as possible (up to the maximum  number  of  permitted  times),  without\n       causing  the  rest of the pattern to fail. The classic example of where\n       this gives problems is in trying to match comments in C programs. These\n       appear  between  /*  and  */ and within the comment, individual * and /\n       characters may appear. An attempt to match C comments by  applying  the\n       pattern\n\n         /\\*.*\\*/\n\n       to the string\n\n         /* first comment */  not comment  /* second comment */\n\n       fails,  because it matches the entire string owing to the greediness of\n       the .*  item.\n\n       However, if a quantifier is followed by a question mark, it  ceases  to\n       be greedy, and instead matches the minimum number of times possible, so\n       the pattern\n\n         /\\*.*?\\*/\n\n       does the right thing with the C comments. The meaning  of  the  various\n       quantifiers  is  not  otherwise  changed,  just the preferred number of\n       matches.  Do not confuse this use of question mark with its  use  as  a\n       quantifier  in its own right. Because it has two uses, it can sometimes\n       appear doubled, as in\n\n         \\d??\\d\n\n       which matches one digit by preference, but can match two if that is the\n       only way the rest of the pattern matches.\n\n       If  the PCRE_UNGREEDY option is set (an option that is not available in\n       Perl), the quantifiers are not greedy by default, but  individual  ones\n       can  be  made  greedy  by following them with a question mark. In other\n       words, it inverts the default behaviour.\n\n       When a parenthesized subpattern is quantified  with  a  minimum  repeat\n       count  that is greater than 1 or with a limited maximum, more memory is\n       required for the compiled pattern, in proportion to  the  size  of  the\n       minimum or maximum.\n\n       If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv-\n       alent to Perl's /s) is set, thus allowing the dot  to  match  newlines,\n       the  pattern  is  implicitly anchored, because whatever follows will be\n       tried against every character position in the subject string, so  there\n       is  no  point  in  retrying the overall match at any position after the\n       first. PCRE normally treats such a pattern as though it  were  preceded\n       by \\A.\n\n       In  cases  where  it  is known that the subject string contains no new-\n       lines, it is worth setting PCRE_DOTALL in order to  obtain  this  opti-\n       mization, or alternatively using ^ to indicate anchoring explicitly.\n\n       However,  there  are  some cases where the optimization cannot be used.\n       When .*  is inside capturing parentheses that are the subject of a back\n       reference elsewhere in the pattern, a match at the start may fail where\n       a later one succeeds. Consider, for example:\n\n         (.*)abc\\1\n\n       If the subject is \"xyz123abc123\" the match point is the fourth  charac-\n       ter. For this reason, such a pattern is not implicitly anchored.\n\n       Another  case where implicit anchoring is not applied is when the lead-\n       ing .* is inside an atomic group. Once again, a match at the start  may\n       fail where a later one succeeds. Consider this pattern:\n\n         (?>.*?a)b\n\n       It  matches \"ab\" in the subject \"aab\". The use of the backtracking con-\n       trol verbs (*PRUNE) and (*SKIP) also disable this optimization.\n\n       When a capturing subpattern is repeated, the value captured is the sub-\n       string that matched the final iteration. For example, after\n\n         (tweedle[dume]{3}\\s*)+\n\n       has matched \"tweedledum tweedledee\" the value of the captured substring\n       is \"tweedledee\". However, if there are  nested  capturing  subpatterns,\n       the  corresponding captured values may have been set in previous itera-\n       tions. For example, after\n\n         /(a|(b))+/\n\n       matches \"aba\" the value of the second captured substring is \"b\".\n\n\nATOMIC GROUPING AND POSSESSIVE QUANTIFIERS\n\n       With both maximizing (\"greedy\") and minimizing (\"ungreedy\"  or  \"lazy\")\n       repetition,  failure  of what follows normally causes the repeated item\n       to be re-evaluated to see if a different number of repeats  allows  the\n       rest  of  the pattern to match. Sometimes it is useful to prevent this,\n       either to change the nature of the match, or to cause it  fail  earlier\n       than  it otherwise might, when the author of the pattern knows there is\n       no point in carrying on.\n\n       Consider, for example, the pattern \\d+foo when applied to  the  subject\n       line\n\n         123456bar\n\n       After matching all 6 digits and then failing to match \"foo\", the normal\n       action of the matcher is to try again with only 5 digits  matching  the\n       \\d+  item,  and  then  with  4,  and  so on, before ultimately failing.\n       \"Atomic grouping\" (a term taken from Jeffrey  Friedl's  book)  provides\n       the  means for specifying that once a subpattern has matched, it is not\n       to be re-evaluated in this way.\n\n       If we use atomic grouping for the previous example, the  matcher  gives\n       up  immediately  on failing to match \"foo\" the first time. The notation\n       is a kind of special parenthesis, starting with (?> as in this example:\n\n         (?>\\d+)foo\n\n       This kind of parenthesis \"locks up\" the  part of the  pattern  it  con-\n       tains  once  it  has matched, and a failure further into the pattern is\n       prevented from backtracking into it. Backtracking past it  to  previous\n       items, however, works as normal.\n\n       An  alternative  description  is that a subpattern of this type matches\n       the string of characters that an  identical  standalone  pattern  would\n       match, if anchored at the current point in the subject string.\n\n       Atomic grouping subpatterns are not capturing subpatterns. Simple cases\n       such as the above example can be thought of as a maximizing repeat that\n       must  swallow  everything  it can. So, while both \\d+ and \\d+? are pre-\n       pared to adjust the number of digits they match in order  to  make  the\n       rest of the pattern match, (?>\\d+) can only match an entire sequence of\n       digits.\n\n       Atomic groups in general can of course contain arbitrarily  complicated\n       subpatterns,  and  can  be  nested. However, when the subpattern for an\n       atomic group is just a single repeated item, as in the example above, a\n       simpler  notation,  called  a \"possessive quantifier\" can be used. This\n       consists of an additional + character  following  a  quantifier.  Using\n       this notation, the previous example can be rewritten as\n\n         \\d++foo\n\n       Note that a possessive quantifier can be used with an entire group, for\n       example:\n\n         (abc|xyz){2,3}+\n\n       Possessive  quantifiers  are  always  greedy;  the   setting   of   the\n       PCRE_UNGREEDY option is ignored. They are a convenient notation for the\n       simpler forms of atomic group. However, there is no difference  in  the\n       meaning  of  a  possessive  quantifier and the equivalent atomic group,\n       though there may be a performance  difference;  possessive  quantifiers\n       should be slightly faster.\n\n       The  possessive  quantifier syntax is an extension to the Perl 5.8 syn-\n       tax.  Jeffrey Friedl originated the idea (and the name)  in  the  first\n       edition of his book. Mike McCloskey liked it, so implemented it when he\n       built Sun's Java package, and PCRE copied it from there. It  ultimately\n       found its way into Perl at release 5.10.\n\n       PCRE has an optimization that automatically \"possessifies\" certain sim-\n       ple pattern constructs. For example, the sequence  A+B  is  treated  as\n       A++B  because  there is no point in backtracking into a sequence of A's\n       when B must follow.\n\n       When a pattern contains an unlimited repeat inside  a  subpattern  that\n       can  itself  be  repeated  an  unlimited number of times, the use of an\n       atomic group is the only way to avoid some  failing  matches  taking  a\n       very long time indeed. The pattern\n\n         (\\D+|<\\d+>)*[!?]\n\n       matches  an  unlimited number of substrings that either consist of non-\n       digits, or digits enclosed in <>, followed by either ! or  ?.  When  it\n       matches, it runs quickly. However, if it is applied to\n\n         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n       it  takes  a  long  time  before reporting failure. This is because the\n       string can be divided between the internal \\D+ repeat and the  external\n       *  repeat  in  a  large  number of ways, and all have to be tried. (The\n       example uses [!?] rather than a single character at  the  end,  because\n       both  PCRE  and  Perl have an optimization that allows for fast failure\n       when a single character is used. They remember the last single  charac-\n       ter  that  is required for a match, and fail early if it is not present\n       in the string.) If the pattern is changed so that  it  uses  an  atomic\n       group, like this:\n\n         ((?>\\D+)|<\\d+>)*[!?]\n\n       sequences of non-digits cannot be broken, and failure happens quickly.\n\n\nBACK REFERENCES\n\n       Outside a character class, a backslash followed by a digit greater than\n       0 (and possibly further digits) is a back reference to a capturing sub-\n       pattern  earlier  (that is, to its left) in the pattern, provided there\n       have been that many previous capturing left parentheses.\n\n       However, if the decimal number following the backslash is less than 10,\n       it  is  always  taken  as a back reference, and causes an error only if\n       there are not that many capturing left parentheses in the  entire  pat-\n       tern.  In  other words, the parentheses that are referenced need not be\n       to the left of the reference for numbers less than 10. A \"forward  back\n       reference\"  of  this  type can make sense when a repetition is involved\n       and the subpattern to the right has participated in an  earlier  itera-\n       tion.\n\n       It  is  not  possible to have a numerical \"forward back reference\" to a\n       subpattern whose number is 10 or  more  using  this  syntax  because  a\n       sequence  such  as  \\50 is interpreted as a character defined in octal.\n       See the subsection entitled \"Non-printing characters\" above for further\n       details  of  the  handling of digits following a backslash. There is no\n       such problem when named parentheses are used. A back reference  to  any\n       subpattern is possible using named parentheses (see below).\n\n       Another  way  of  avoiding  the ambiguity inherent in the use of digits\n       following a backslash is to use the \\g  escape  sequence.  This  escape\n       must be followed by an unsigned number or a negative number, optionally\n       enclosed in braces. These examples are all identical:\n\n         (ring), \\1\n         (ring), \\g1\n         (ring), \\g{1}\n\n       An unsigned number specifies an absolute reference without the  ambigu-\n       ity that is present in the older syntax. It is also useful when literal\n       digits follow the reference. A negative number is a relative reference.\n       Consider this example:\n\n         (abc(def)ghi)\\g{-1}\n\n       The sequence \\g{-1} is a reference to the most recently started captur-\n       ing subpattern before \\g, that is, is it equivalent to \\2 in this exam-\n       ple.   Similarly, \\g{-2} would be equivalent to \\1. The use of relative\n       references can be helpful in long patterns, and also in  patterns  that\n       are  created  by  joining  together  fragments  that contain references\n       within themselves.\n\n       A back reference matches whatever actually matched the  capturing  sub-\n       pattern  in  the  current subject string, rather than anything matching\n       the subpattern itself (see \"Subpatterns as subroutines\" below for a way\n       of doing that). So the pattern\n\n         (sens|respons)e and \\1ibility\n\n       matches  \"sense and sensibility\" and \"response and responsibility\", but\n       not \"sense and responsibility\". If caseful matching is in force at  the\n       time  of the back reference, the case of letters is relevant. For exam-\n       ple,\n\n         ((?i)rah)\\s+\\1\n\n       matches \"rah rah\" and \"RAH RAH\", but not \"RAH  rah\",  even  though  the\n       original capturing subpattern is matched caselessly.\n\n       There  are  several  different ways of writing back references to named\n       subpatterns. The .NET syntax \\k{name} and the Perl syntax  \\k<name>  or\n       \\k'name'  are supported, as is the Python syntax (?P=name). Perl 5.10's\n       unified back reference syntax, in which \\g can be used for both numeric\n       and  named  references,  is  also supported. We could rewrite the above\n       example in any of the following ways:\n\n         (?<p1>(?i)rah)\\s+\\k<p1>\n         (?'p1'(?i)rah)\\s+\\k{p1}\n         (?P<p1>(?i)rah)\\s+(?P=p1)\n         (?<p1>(?i)rah)\\s+\\g{p1}\n\n       A subpattern that is referenced by  name  may  appear  in  the  pattern\n       before or after the reference.\n\n       There  may be more than one back reference to the same subpattern. If a\n       subpattern has not actually been used in a particular match,  any  back\n       references to it always fail by default. For example, the pattern\n\n         (a|(bc))\\2\n\n       always  fails  if  it starts to match \"a\" rather than \"bc\". However, if\n       the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer-\n       ence to an unset value matches an empty string.\n\n       Because  there may be many capturing parentheses in a pattern, all dig-\n       its following a backslash are taken as part of a potential back  refer-\n       ence  number.   If  the  pattern continues with a digit character, some\n       delimiter must  be  used  to  terminate  the  back  reference.  If  the\n       PCRE_EXTENDED  option  is  set, this can be white space. Otherwise, the\n       \\g{ syntax or an empty comment (see \"Comments\" below) can be used.\n\n   Recursive back references\n\n       A back reference that occurs inside the parentheses to which it  refers\n       fails  when  the subpattern is first used, so, for example, (a\\1) never\n       matches.  However, such references can be useful inside  repeated  sub-\n       patterns. For example, the pattern\n\n         (a|b\\1)+\n\n       matches any number of \"a\"s and also \"aba\", \"ababbaa\" etc. At each iter-\n       ation of the subpattern,  the  back  reference  matches  the  character\n       string  corresponding  to  the previous iteration. In order for this to\n       work, the pattern must be such that the first iteration does  not  need\n       to  match the back reference. This can be done using alternation, as in\n       the example above, or by a quantifier with a minimum of zero.\n\n       Back references of this type cause the group that they reference to  be\n       treated  as  an atomic group.  Once the whole group has been matched, a\n       subsequent matching failure cannot cause backtracking into  the  middle\n       of the group.\n\n\nASSERTIONS\n\n       An  assertion  is  a  test on the characters following or preceding the\n       current matching point that does not actually consume  any  characters.\n       The  simple  assertions  coded  as  \\b, \\B, \\A, \\G, \\Z, \\z, ^ and $ are\n       described above.\n\n       More complicated assertions are coded as  subpatterns.  There  are  two\n       kinds:  those  that  look  ahead of the current position in the subject\n       string, and those that look  behind  it.  An  assertion  subpattern  is\n       matched  in  the  normal way, except that it does not cause the current\n       matching position to be changed.\n\n       Assertion subpatterns are not capturing subpatterns. If such an  asser-\n       tion  contains  capturing  subpatterns within it, these are counted for\n       the purposes of numbering the capturing subpatterns in the  whole  pat-\n       tern.  However,  substring  capturing  is carried out only for positive\n       assertions. (Perl sometimes, but not always, does do capturing in nega-\n       tive assertions.)\n\n       WARNING:  If a positive assertion containing one or more capturing sub-\n       patterns succeeds, but failure to match later  in  the  pattern  causes\n       backtracking over this assertion, the captures within the assertion are\n       reset only if no higher numbered captures are  already  set.  This  is,\n       unfortunately,  a fundamental limitation of the current implementation,\n       and as PCRE1 is now in maintenance-only status, it is unlikely ever  to\n       change.\n\n       For  compatibility  with  Perl,  assertion subpatterns may be repeated;\n       though it makes no sense to assert the same thing  several  times,  the\n       side  effect  of  capturing  parentheses may occasionally be useful. In\n       practice, there only three cases:\n\n       (1) If the quantifier is {0}, the  assertion  is  never  obeyed  during\n       matching.   However,  it  may  contain internal capturing parenthesized\n       groups that are called from elsewhere via the subroutine mechanism.\n\n       (2) If quantifier is {0,n} where n is greater than zero, it is  treated\n       as  if  it  were  {0,1}.  At run time, the rest of the pattern match is\n       tried with and without the assertion, the order depending on the greed-\n       iness of the quantifier.\n\n       (3)  If  the minimum repetition is greater than zero, the quantifier is\n       ignored.  The assertion is obeyed just  once  when  encountered  during\n       matching.\n\n   Lookahead assertions\n\n       Lookahead assertions start with (?= for positive assertions and (?! for\n       negative assertions. For example,\n\n         \\w+(?=;)\n\n       matches a word followed by a semicolon, but does not include the  semi-\n       colon in the match, and\n\n         foo(?!bar)\n\n       matches  any  occurrence  of  \"foo\" that is not followed by \"bar\". Note\n       that the apparently similar pattern\n\n         (?!foo)bar\n\n       does not find an occurrence of \"bar\"  that  is  preceded  by  something\n       other  than \"foo\"; it finds any occurrence of \"bar\" whatsoever, because\n       the assertion (?!foo) is always true when the next three characters are\n       \"bar\". A lookbehind assertion is needed to achieve the other effect.\n\n       If you want to force a matching failure at some point in a pattern, the\n       most convenient way to do it is  with  (?!)  because  an  empty  string\n       always  matches, so an assertion that requires there not to be an empty\n       string must always fail.  The backtracking control verb (*FAIL) or (*F)\n       is a synonym for (?!).\n\n   Lookbehind assertions\n\n       Lookbehind  assertions start with (?<= for positive assertions and (?<!\n       for negative assertions. For example,\n\n         (?<!foo)bar\n\n       does find an occurrence of \"bar\" that is not  preceded  by  \"foo\".  The\n       contents  of  a  lookbehind  assertion are restricted such that all the\n       strings it matches must have a fixed length. However, if there are sev-\n       eral  top-level  alternatives,  they  do  not all have to have the same\n       fixed length. Thus\n\n         (?<=bullock|donkey)\n\n       is permitted, but\n\n         (?<!dogs?|cats?)\n\n       causes an error at compile time. Branches that match  different  length\n       strings  are permitted only at the top level of a lookbehind assertion.\n       This is an extension compared with Perl, which requires all branches to\n       match the same length of string. An assertion such as\n\n         (?<=ab(c|de))\n\n       is  not  permitted,  because  its single top-level branch can match two\n       different lengths, but it is acceptable to PCRE if rewritten to use two\n       top-level branches:\n\n         (?<=abc|abde)\n\n       In  some  cases, the escape sequence \\K (see above) can be used instead\n       of a lookbehind assertion to get round the fixed-length restriction.\n\n       The implementation of lookbehind assertions is, for  each  alternative,\n       to  temporarily  move the current position back by the fixed length and\n       then try to match. If there are insufficient characters before the cur-\n       rent position, the assertion fails.\n\n       In  a UTF mode, PCRE does not allow the \\C escape (which matches a sin-\n       gle data unit even in a UTF mode) to appear in  lookbehind  assertions,\n       because  it  makes it impossible to calculate the length of the lookbe-\n       hind. The \\X and \\R escapes, which can match different numbers of  data\n       units, are also not permitted.\n\n       \"Subroutine\"  calls  (see below) such as (?2) or (?&X) are permitted in\n       lookbehinds, as long as the subpattern matches a  fixed-length  string.\n       Recursion, however, is not supported.\n\n       Possessive  quantifiers  can  be  used  in  conjunction with lookbehind\n       assertions to specify efficient matching of fixed-length strings at the\n       end of subject strings. Consider a simple pattern such as\n\n         abcd$\n\n       when  applied  to  a  long string that does not match. Because matching\n       proceeds from left to right, PCRE will look for each \"a\" in the subject\n       and  then  see  if what follows matches the rest of the pattern. If the\n       pattern is specified as\n\n         ^.*abcd$\n\n       the initial .* matches the entire string at first, but when this  fails\n       (because there is no following \"a\"), it backtracks to match all but the\n       last character, then all but the last two characters, and so  on.  Once\n       again  the search for \"a\" covers the entire string, from right to left,\n       so we are no better off. However, if the pattern is written as\n\n         ^.*+(?<=abcd)\n\n       there can be no backtracking for the .*+ item; it can  match  only  the\n       entire  string.  The subsequent lookbehind assertion does a single test\n       on the last four characters. If it fails, the match fails  immediately.\n       For  long  strings, this approach makes a significant difference to the\n       processing time.\n\n   Using multiple assertions\n\n       Several assertions (of any sort) may occur in succession. For example,\n\n         (?<=\\d{3})(?<!999)foo\n\n       matches \"foo\" preceded by three digits that are not \"999\". Notice  that\n       each  of  the  assertions is applied independently at the same point in\n       the subject string. First there is a  check  that  the  previous  three\n       characters  are  all  digits,  and  then there is a check that the same\n       three characters are not \"999\".  This pattern does not match \"foo\" pre-\n       ceded  by  six  characters,  the first of which are digits and the last\n       three of which are not \"999\". For example, it  doesn't  match  \"123abc-\n       foo\". A pattern to do that is\n\n         (?<=\\d{3}...)(?<!999)foo\n\n       This  time  the  first assertion looks at the preceding six characters,\n       checking that the first three are digits, and then the second assertion\n       checks that the preceding three characters are not \"999\".\n\n       Assertions can be nested in any combination. For example,\n\n         (?<=(?<!foo)bar)baz\n\n       matches  an occurrence of \"baz\" that is preceded by \"bar\" which in turn\n       is not preceded by \"foo\", while\n\n         (?<=\\d{3}(?!999)...)foo\n\n       is another pattern that matches \"foo\" preceded by three digits and  any\n       three characters that are not \"999\".\n\n\nCONDITIONAL SUBPATTERNS\n\n       It  is possible to cause the matching process to obey a subpattern con-\n       ditionally or to choose between two alternative subpatterns,  depending\n       on  the result of an assertion, or whether a specific capturing subpat-\n       tern has already been matched. The two possible  forms  of  conditional\n       subpattern are:\n\n         (?(condition)yes-pattern)\n         (?(condition)yes-pattern|no-pattern)\n\n       If  the  condition is satisfied, the yes-pattern is used; otherwise the\n       no-pattern (if present) is used. If there are more  than  two  alterna-\n       tives  in  the subpattern, a compile-time error occurs. Each of the two\n       alternatives may itself contain nested subpatterns of any form, includ-\n       ing  conditional  subpatterns;  the  restriction  to  two  alternatives\n       applies only at the level of the condition. This pattern fragment is an\n       example where the alternatives are complex:\n\n         (?(1) (A|B|C) | (D | (?(2)E|F) | E) )\n\n\n       There  are  four  kinds of condition: references to subpatterns, refer-\n       ences to recursion, a pseudo-condition called DEFINE, and assertions.\n\n   Checking for a used subpattern by number\n\n       If the text between the parentheses consists of a sequence  of  digits,\n       the condition is true if a capturing subpattern of that number has pre-\n       viously matched. If there is more than one  capturing  subpattern  with\n       the  same  number  (see  the earlier section about duplicate subpattern\n       numbers), the condition is true if any of them have matched. An  alter-\n       native  notation is to precede the digits with a plus or minus sign. In\n       this case, the subpattern number is relative rather than absolute.  The\n       most  recently opened parentheses can be referenced by (?(-1), the next\n       most recent by (?(-2), and so on. Inside loops it can also  make  sense\n       to refer to subsequent groups. The next parentheses to be opened can be\n       referenced as (?(+1), and so on. (The value zero in any of these  forms\n       is not used; it provokes a compile-time error.)\n\n       Consider  the  following  pattern, which contains non-significant white\n       space to make it more readable (assume the PCRE_EXTENDED option) and to\n       divide it into three parts for ease of discussion:\n\n         ( \\( )?    [^()]+    (?(1) \\) )\n\n       The  first  part  matches  an optional opening parenthesis, and if that\n       character is present, sets it as the first captured substring. The sec-\n       ond  part  matches one or more characters that are not parentheses. The\n       third part is a conditional subpattern that tests whether  or  not  the\n       first  set  of  parentheses  matched.  If they did, that is, if subject\n       started with an opening parenthesis, the condition is true, and so  the\n       yes-pattern  is  executed and a closing parenthesis is required. Other-\n       wise, since no-pattern is not present, the subpattern matches  nothing.\n       In  other  words,  this  pattern matches a sequence of non-parentheses,\n       optionally enclosed in parentheses.\n\n       If you were embedding this pattern in a larger one,  you  could  use  a\n       relative reference:\n\n         ...other stuff... ( \\( )?    [^()]+    (?(-1) \\) ) ...\n\n       This  makes  the  fragment independent of the parentheses in the larger\n       pattern.\n\n   Checking for a used subpattern by name\n\n       Perl uses the syntax (?(<name>)...) or (?('name')...)  to  test  for  a\n       used  subpattern  by  name.  For compatibility with earlier versions of\n       PCRE, which had this facility before Perl, the syntax  (?(name)...)  is\n       also recognized.\n\n       Rewriting the above example to use a named subpattern gives this:\n\n         (?<OPEN> \\( )?    [^()]+    (?(<OPEN>) \\) )\n\n       If  the  name used in a condition of this kind is a duplicate, the test\n       is applied to all subpatterns of the same name, and is true if any  one\n       of them has matched.\n\n   Checking for pattern recursion\n\n       If the condition is the string (R), and there is no subpattern with the\n       name R, the condition is true if a recursive call to the whole  pattern\n       or any subpattern has been made. If digits or a name preceded by amper-\n       sand follow the letter R, for example:\n\n         (?(R3)...) or (?(R&name)...)\n\n       the condition is true if the most recent recursion is into a subpattern\n       whose number or name is given. This condition does not check the entire\n       recursion stack. If the name used in a condition  of  this  kind  is  a\n       duplicate, the test is applied to all subpatterns of the same name, and\n       is true if any one of them is the most recent recursion.\n\n       At \"top level\", all these recursion test  conditions  are  false.   The\n       syntax for recursive patterns is described below.\n\n   Defining subpatterns for use by reference only\n\n       If  the  condition  is  the string (DEFINE), and there is no subpattern\n       with the name DEFINE, the condition is  always  false.  In  this  case,\n       there  may  be  only  one  alternative  in the subpattern. It is always\n       skipped if control reaches this point  in  the  pattern;  the  idea  of\n       DEFINE  is that it can be used to define subroutines that can be refer-\n       enced from elsewhere. (The use of subroutines is described below.)  For\n       example,  a  pattern  to match an IPv4 address such as \"192.168.23.245\"\n       could be written like this (ignore white space and line breaks):\n\n         (?(DEFINE) (?<byte> 2[0-4]\\d | 25[0-5] | 1\\d\\d | [1-9]?\\d) )\n         \\b (?&byte) (\\.(?&byte)){3} \\b\n\n       The first part of the pattern is a DEFINE group inside which a  another\n       group  named \"byte\" is defined. This matches an individual component of\n       an IPv4 address (a number less than 256). When  matching  takes  place,\n       this  part  of  the pattern is skipped because DEFINE acts like a false\n       condition. The rest of the pattern uses references to the  named  group\n       to  match the four dot-separated components of an IPv4 address, insist-\n       ing on a word boundary at each end.\n\n   Assertion conditions\n\n       If the condition is not in any of the above  formats,  it  must  be  an\n       assertion.   This may be a positive or negative lookahead or lookbehind\n       assertion. Consider  this  pattern,  again  containing  non-significant\n       white space, and with the two alternatives on the second line:\n\n         (?(?=[^a-z]*[a-z])\n         \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} )\n\n       The  condition  is  a  positive  lookahead  assertion  that  matches an\n       optional sequence of non-letters followed by a letter. In other  words,\n       it  tests  for the presence of at least one letter in the subject. If a\n       letter is found, the subject is matched against the first  alternative;\n       otherwise  it  is  matched  against  the  second.  This pattern matches\n       strings in one of the two forms dd-aaa-dd or dd-dd-dd,  where  aaa  are\n       letters and dd are digits.\n\n\nCOMMENTS\n\n       There are two ways of including comments in patterns that are processed\n       by PCRE. In both cases, the start of the comment must not be in a char-\n       acter class, nor in the middle of any other sequence of related charac-\n       ters such as (?: or a subpattern name or number.  The  characters  that\n       make up a comment play no part in the pattern matching.\n\n       The  sequence (?# marks the start of a comment that continues up to the\n       next closing parenthesis. Nested parentheses are not permitted. If  the\n       PCRE_EXTENDED option is set, an unescaped # character also introduces a\n       comment, which in this case continues to  immediately  after  the  next\n       newline  character  or character sequence in the pattern. Which charac-\n       ters are interpreted as newlines is controlled by the options passed to\n       a  compiling function or by a special sequence at the start of the pat-\n       tern, as described in the section entitled \"Newline conventions\" above.\n       Note that the end of this type of comment is a literal newline sequence\n       in the pattern; escape sequences that happen to represent a newline  do\n       not  count.  For  example,  consider this pattern when PCRE_EXTENDED is\n       set, and the default newline convention is in force:\n\n         abc #comment \\n still comment\n\n       On encountering the # character, pcre_compile()  skips  along,  looking\n       for  a newline in the pattern. The sequence \\n is still literal at this\n       stage, so it does not terminate the comment. Only an  actual  character\n       with the code value 0x0a (the default newline) does so.\n\n\nRECURSIVE PATTERNS\n\n       Consider  the problem of matching a string in parentheses, allowing for\n       unlimited nested parentheses. Without the use of  recursion,  the  best\n       that  can  be  done  is  to use a pattern that matches up to some fixed\n       depth of nesting. It is not possible to  handle  an  arbitrary  nesting\n       depth.\n\n       For some time, Perl has provided a facility that allows regular expres-\n       sions to recurse (amongst other things). It does this by  interpolating\n       Perl  code in the expression at run time, and the code can refer to the\n       expression itself. A Perl pattern using code interpolation to solve the\n       parentheses problem can be created like this:\n\n         $re = qr{\\( (?: (?>[^()]+) | (?p{$re}) )* \\)}x;\n\n       The (?p{...}) item interpolates Perl code at run time, and in this case\n       refers recursively to the pattern in which it appears.\n\n       Obviously, PCRE cannot support the interpolation of Perl code. Instead,\n       it  supports  special  syntax  for recursion of the entire pattern, and\n       also for individual subpattern recursion.  After  its  introduction  in\n       PCRE  and  Python,  this  kind of recursion was subsequently introduced\n       into Perl at release 5.10.\n\n       A special item that consists of (? followed by a  number  greater  than\n       zero  and  a  closing parenthesis is a recursive subroutine call of the\n       subpattern of the given number, provided that  it  occurs  inside  that\n       subpattern.  (If  not,  it is a non-recursive subroutine call, which is\n       described in the next section.) The special item  (?R)  or  (?0)  is  a\n       recursive call of the entire regular expression.\n\n       This  PCRE  pattern  solves  the nested parentheses problem (assume the\n       PCRE_EXTENDED option is set so that white space is ignored):\n\n         \\( ( [^()]++ | (?R) )* \\)\n\n       First it matches an opening parenthesis. Then it matches any number  of\n       substrings  which  can  either  be  a sequence of non-parentheses, or a\n       recursive match of the pattern itself (that is, a  correctly  parenthe-\n       sized substring).  Finally there is a closing parenthesis. Note the use\n       of a possessive quantifier to avoid backtracking into sequences of non-\n       parentheses.\n\n       If  this  were  part of a larger pattern, you would not want to recurse\n       the entire pattern, so instead you could use this:\n\n         ( \\( ( [^()]++ | (?1) )* \\) )\n\n       We have put the pattern into parentheses, and caused the  recursion  to\n       refer to them instead of the whole pattern.\n\n       In  a  larger  pattern,  keeping  track  of  parenthesis numbers can be\n       tricky. This is made easier by the use of relative references.  Instead\n       of (?1) in the pattern above you can write (?-2) to refer to the second\n       most recently opened parentheses  preceding  the  recursion.  In  other\n       words,  a  negative  number counts capturing parentheses leftwards from\n       the point at which it is encountered.\n\n       It is also possible to refer to  subsequently  opened  parentheses,  by\n       writing  references  such  as (?+2). However, these cannot be recursive\n       because the reference is not inside the  parentheses  that  are  refer-\n       enced.  They are always non-recursive subroutine calls, as described in\n       the next section.\n\n       An alternative approach is to use named parentheses instead.  The  Perl\n       syntax  for  this  is (?&name); PCRE's earlier syntax (?P>name) is also\n       supported. We could rewrite the above example as follows:\n\n         (?<pn> \\( ( [^()]++ | (?&pn) )* \\) )\n\n       If there is more than one subpattern with the same name,  the  earliest\n       one is used.\n\n       This  particular  example pattern that we have been looking at contains\n       nested unlimited repeats, and so the use of a possessive quantifier for\n       matching strings of non-parentheses is important when applying the pat-\n       tern to strings that do not match. For example, when  this  pattern  is\n       applied to\n\n         (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n\n       it  yields  \"no  match\" quickly. However, if a possessive quantifier is\n       not used, the match runs for a very long time indeed because there  are\n       so  many  different  ways the + and * repeats can carve up the subject,\n       and all have to be tested before failure can be reported.\n\n       At the end of a match, the values of capturing  parentheses  are  those\n       from  the outermost level. If you want to obtain intermediate values, a\n       callout function can be used (see below and the pcrecallout  documenta-\n       tion). If the pattern above is matched against\n\n         (ab(cd)ef)\n\n       the  value  for  the  inner capturing parentheses (numbered 2) is \"ef\",\n       which is the last value taken on at the top level. If a capturing  sub-\n       pattern  is  not  matched at the top level, its final captured value is\n       unset, even if it was (temporarily) set at a deeper  level  during  the\n       matching process.\n\n       If  there are more than 15 capturing parentheses in a pattern, PCRE has\n       to obtain extra memory to store data during a recursion, which it  does\n       by using pcre_malloc, freeing it via pcre_free afterwards. If no memory\n       can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.\n\n       Do not confuse the (?R) item with the condition (R),  which  tests  for\n       recursion.   Consider  this pattern, which matches text in angle brack-\n       ets, allowing for arbitrary nesting. Only digits are allowed in  nested\n       brackets  (that is, when recursing), whereas any characters are permit-\n       ted at the outer level.\n\n         < (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >\n\n       In this pattern, (?(R) is the start of a conditional  subpattern,  with\n       two  different  alternatives for the recursive and non-recursive cases.\n       The (?R) item is the actual recursive call.\n\n   Differences in recursion processing between PCRE and Perl\n\n       Recursion processing in PCRE differs from Perl in two  important  ways.\n       In  PCRE (like Python, but unlike Perl), a recursive subpattern call is\n       always treated as an atomic group. That is, once it has matched some of\n       the subject string, it is never re-entered, even if it contains untried\n       alternatives and there is a subsequent matching failure.  This  can  be\n       illustrated  by the following pattern, which purports to match a palin-\n       dromic string that contains an odd number of characters  (for  example,\n       \"a\", \"aba\", \"abcba\", \"abcdcba\"):\n\n         ^(.|(.)(?1)\\2)$\n\n       The idea is that it either matches a single character, or two identical\n       characters surrounding a sub-palindrome. In Perl, this  pattern  works;\n       in  PCRE  it  does  not if the pattern is longer than three characters.\n       Consider the subject string \"abcba\":\n\n       At the top level, the first character is matched, but as it is  not  at\n       the end of the string, the first alternative fails; the second alterna-\n       tive is taken and the recursion kicks in. The recursive call to subpat-\n       tern  1  successfully  matches the next character (\"b\"). (Note that the\n       beginning and end of line tests are not part of the recursion).\n\n       Back at the top level, the next character (\"c\") is compared  with  what\n       subpattern  2 matched, which was \"a\". This fails. Because the recursion\n       is treated as an atomic group, there are now  no  backtracking  points,\n       and  so  the  entire  match fails. (Perl is able, at this point, to re-\n       enter the recursion and try the second alternative.)  However,  if  the\n       pattern is written with the alternatives in the other order, things are\n       different:\n\n         ^((.)(?1)\\2|.)$\n\n       This time, the recursing alternative is tried first, and  continues  to\n       recurse  until  it runs out of characters, at which point the recursion\n       fails. But this time we do have  another  alternative  to  try  at  the\n       higher  level.  That  is  the  big difference: in the previous case the\n       remaining alternative is at a deeper recursion level, which PCRE cannot\n       use.\n\n       To  change  the pattern so that it matches all palindromic strings, not\n       just those with an odd number of characters, it is tempting  to  change\n       the pattern to this:\n\n         ^((.)(?1)\\2|.?)$\n\n       Again,  this  works  in Perl, but not in PCRE, and for the same reason.\n       When a deeper recursion has matched a single character,  it  cannot  be\n       entered  again  in  order  to match an empty string. The solution is to\n       separate the two cases, and write out the odd and even cases as  alter-\n       natives at the higher level:\n\n         ^(?:((.)(?1)\\2|)|((.)(?3)\\4|.))\n\n       If  you  want  to match typical palindromic phrases, the pattern has to\n       ignore all non-word characters, which can be done like this:\n\n         ^\\W*+(?:((.)\\W*+(?1)\\W*+\\2|)|((.)\\W*+(?3)\\W*+\\4|\\W*+.\\W*+))\\W*+$\n\n       If run with the PCRE_CASELESS option, this pattern matches phrases such\n       as \"A man, a plan, a canal: Panama!\" and it works well in both PCRE and\n       Perl. Note the use of the possessive quantifier *+ to avoid  backtrack-\n       ing  into  sequences of non-word characters. Without this, PCRE takes a\n       great deal longer (ten times or more) to  match  typical  phrases,  and\n       Perl takes so long that you think it has gone into a loop.\n\n       WARNING:  The  palindrome-matching patterns above work only if the sub-\n       ject string does not start with a palindrome that is shorter  than  the\n       entire  string.  For example, although \"abcba\" is correctly matched, if\n       the subject is \"ababa\", PCRE finds the palindrome \"aba\" at  the  start,\n       then  fails at top level because the end of the string does not follow.\n       Once again, it cannot jump back into the recursion to try other  alter-\n       natives, so the entire match fails.\n\n       The  second  way  in which PCRE and Perl differ in their recursion pro-\n       cessing is in the handling of captured values. In Perl, when a  subpat-\n       tern  is  called recursively or as a subpattern (see the next section),\n       it has no access to any values that were captured  outside  the  recur-\n       sion,  whereas  in  PCRE  these values can be referenced. Consider this\n       pattern:\n\n         ^(.)(\\1|a(?2))\n\n       In PCRE, this pattern matches \"bab\". The  first  capturing  parentheses\n       match  \"b\",  then in the second group, when the back reference \\1 fails\n       to match \"b\", the second alternative matches \"a\" and then recurses.  In\n       the  recursion,  \\1 does now match \"b\" and so the whole match succeeds.\n       In Perl, the pattern fails to match because inside the  recursive  call\n       \\1 cannot access the externally set value.\n\n\nSUBPATTERNS AS SUBROUTINES\n\n       If  the  syntax for a recursive subpattern call (either by number or by\n       name) is used outside the parentheses to which it refers,  it  operates\n       like  a subroutine in a programming language. The called subpattern may\n       be defined before or after the reference. A numbered reference  can  be\n       absolute or relative, as in these examples:\n\n         (...(absolute)...)...(?2)...\n         (...(relative)...)...(?-1)...\n         (...(?+1)...(relative)...\n\n       An earlier example pointed out that the pattern\n\n         (sens|respons)e and \\1ibility\n\n       matches  \"sense and sensibility\" and \"response and responsibility\", but\n       not \"sense and responsibility\". If instead the pattern\n\n         (sens|respons)e and (?1)ibility\n\n       is used, it does match \"sense and responsibility\" as well as the  other\n       two  strings.  Another  example  is  given  in the discussion of DEFINE\n       above.\n\n       All subroutine calls, whether recursive or not, are always  treated  as\n       atomic  groups. That is, once a subroutine has matched some of the sub-\n       ject string, it is never re-entered, even if it contains untried alter-\n       natives  and  there  is  a  subsequent  matching failure. Any capturing\n       parentheses that are set during the subroutine  call  revert  to  their\n       previous values afterwards.\n\n       Processing  options  such as case-independence are fixed when a subpat-\n       tern is defined, so if it is used as a subroutine, such options  cannot\n       be changed for different calls. For example, consider this pattern:\n\n         (abc)(?i:(?-1))\n\n       It  matches  \"abcabc\". It does not match \"abcABC\" because the change of\n       processing option does not affect the called subpattern.\n\n\nONIGURUMA SUBROUTINE SYNTAX\n\n       For compatibility with Oniguruma, the non-Perl syntax \\g followed by  a\n       name or a number enclosed either in angle brackets or single quotes, is\n       an alternative syntax for referencing a  subpattern  as  a  subroutine,\n       possibly  recursively. Here are two of the examples used above, rewrit-\n       ten using this syntax:\n\n         (?<pn> \\( ( (?>[^()]+) | \\g<pn> )* \\) )\n         (sens|respons)e and \\g'1'ibility\n\n       PCRE supports an extension to Oniguruma: if a number is preceded  by  a\n       plus or a minus sign it is taken as a relative reference. For example:\n\n         (abc)(?i:\\g<-1>)\n\n       Note  that \\g{...} (Perl syntax) and \\g<...> (Oniguruma syntax) are not\n       synonymous. The former is a back reference; the latter is a  subroutine\n       call.\n\n\nCALLOUTS\n\n       Perl has a feature whereby using the sequence (?{...}) causes arbitrary\n       Perl code to be obeyed in the middle of matching a regular  expression.\n       This makes it possible, amongst other things, to extract different sub-\n       strings that match the same pair of parentheses when there is a repeti-\n       tion.\n\n       PCRE provides a similar feature, but of course it cannot obey arbitrary\n       Perl code. The feature is called \"callout\". The caller of PCRE provides\n       an  external function by putting its entry point in the global variable\n       pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit  or  32-bit\n       library).   By default, this variable contains NULL, which disables all\n       calling out.\n\n       Within a regular expression, (?C) indicates the  points  at  which  the\n       external  function  is  to be called. If you want to identify different\n       callout points, you can put a number less than 256 after the letter  C.\n       The  default  value is zero.  For example, this pattern has two callout\n       points:\n\n         (?C1)abc(?C2)def\n\n       If the PCRE_AUTO_CALLOUT flag is passed to a compiling function,  call-\n       outs  are automatically installed before each item in the pattern. They\n       are all numbered 255. If there is a conditional group  in  the  pattern\n       whose condition is an assertion, an additional callout is inserted just\n       before the condition. An explicit callout may also be set at this posi-\n       tion, as in this example:\n\n         (?(?C9)(?=a)abc|def)\n\n       Note that this applies only to assertion conditions, not to other types\n       of condition.\n\n       During matching, when PCRE reaches a callout point, the external  func-\n       tion  is  called.  It  is  provided with the number of the callout, the\n       position in the pattern, and, optionally, one item of  data  originally\n       supplied  by  the caller of the matching function. The callout function\n       may cause matching to proceed, to backtrack, or to fail altogether.\n\n       By default, PCRE implements a number of optimizations at  compile  time\n       and  matching  time, and one side-effect is that sometimes callouts are\n       skipped. If you need all possible callouts to happen, you need  to  set\n       options  that  disable  the relevant optimizations. More details, and a\n       complete description of the interface  to  the  callout  function,  are\n       given in the pcrecallout documentation.\n\n\nBACKTRACKING CONTROL\n\n       Perl  5.10 introduced a number of \"Special Backtracking Control Verbs\",\n       which are still described in the Perl  documentation  as  \"experimental\n       and  subject to change or removal in a future version of Perl\". It goes\n       on to say: \"Their usage in production code should  be  noted  to  avoid\n       problems  during upgrades.\" The same remarks apply to the PCRE features\n       described in this section.\n\n       The new verbs make use of what was previously invalid syntax: an  open-\n       ing parenthesis followed by an asterisk. They are generally of the form\n       (*VERB) or (*VERB:NAME). Some may take either form,  possibly  behaving\n       differently  depending  on  whether or not a name is present. A name is\n       any sequence of characters that does not include a closing parenthesis.\n       The maximum length of name is 255 in the 8-bit library and 65535 in the\n       16-bit and 32-bit libraries. If the name is  empty,  that  is,  if  the\n       closing  parenthesis immediately follows the colon, the effect is as if\n       the colon were not there.  Any number of these verbs  may  occur  in  a\n       pattern.\n\n       Since  these  verbs  are  specifically related to backtracking, most of\n       them can be used only when the pattern is to be matched  using  one  of\n       the  traditional  matching  functions, because these use a backtracking\n       algorithm. With the exception of (*FAIL), which behaves like a  failing\n       negative  assertion,  the  backtracking control verbs cause an error if\n       encountered by a DFA matching function.\n\n       The behaviour of these verbs in repeated  groups,  assertions,  and  in\n       subpatterns called as subroutines (whether or not recursively) is docu-\n       mented below.\n\n   Optimizations that affect backtracking verbs\n\n       PCRE contains some optimizations that are used to speed up matching  by\n       running some checks at the start of each match attempt. For example, it\n       may know the minimum length of matching subject, or that  a  particular\n       character must be present. When one of these optimizations bypasses the\n       running of a match,  any  included  backtracking  verbs  will  not,  of\n       course, be processed. You can suppress the start-of-match optimizations\n       by setting the PCRE_NO_START_OPTIMIZE  option  when  calling  pcre_com-\n       pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT).\n       There is more discussion of this option in the section entitled \"Option\n       bits for pcre_exec()\" in the pcreapi documentation.\n\n       Experiments  with  Perl  suggest that it too has similar optimizations,\n       sometimes leading to anomalous results.\n\n   Verbs that act immediately\n\n       The following verbs act as soon as they are encountered. They  may  not\n       be followed by a name.\n\n          (*ACCEPT)\n\n       This  verb causes the match to end successfully, skipping the remainder\n       of the pattern. However, when it is inside a subpattern that is  called\n       as  a  subroutine, only that subpattern is ended successfully. Matching\n       then continues at the outer level. If (*ACCEPT) in triggered in a posi-\n       tive  assertion,  the  assertion succeeds; in a negative assertion, the\n       assertion fails.\n\n       If (*ACCEPT) is inside capturing parentheses, the data so far  is  cap-\n       tured. For example:\n\n         A((?:A|B(*ACCEPT)|C)D)\n\n       This  matches  \"AB\", \"AAD\", or \"ACD\"; when it matches \"AB\", \"B\" is cap-\n       tured by the outer parentheses.\n\n         (*FAIL) or (*F)\n\n       This verb causes a matching failure, forcing backtracking to occur.  It\n       is  equivalent to (?!) but easier to read. The Perl documentation notes\n       that it is probably useful only when combined  with  (?{})  or  (??{}).\n       Those  are,  of course, Perl features that are not present in PCRE. The\n       nearest equivalent is the callout feature, as for example in this  pat-\n       tern:\n\n         a+(?C)(*FAIL)\n\n       A  match  with the string \"aaaa\" always fails, but the callout is taken\n       before each backtrack happens (in this example, 10 times).\n\n   Recording which path was taken\n\n       There is one verb whose main purpose  is  to  track  how  a  match  was\n       arrived  at,  though  it  also  has a secondary use in conjunction with\n       advancing the match starting point (see (*SKIP) below).\n\n         (*MARK:NAME) or (*:NAME)\n\n       A name is always  required  with  this  verb.  There  may  be  as  many\n       instances  of  (*MARK) as you like in a pattern, and their names do not\n       have to be unique.\n\n       When a match succeeds, the name of the  last-encountered  (*MARK:NAME),\n       (*PRUNE:NAME),  or  (*THEN:NAME) on the matching path is passed back to\n       the caller as  described  in  the  section  entitled  \"Extra  data  for\n       pcre_exec()\"  in  the  pcreapi  documentation.  Here  is  an example of\n       pcretest output, where the /K modifier requests the retrieval and  out-\n       putting of (*MARK) data:\n\n           re> /X(*MARK:A)Y|X(*MARK:B)Z/K\n         data> XY\n          0: XY\n         MK: A\n         XZ\n          0: XZ\n         MK: B\n\n       The (*MARK) name is tagged with \"MK:\" in this output, and in this exam-\n       ple it indicates which of the two alternatives matched. This is a  more\n       efficient  way of obtaining this information than putting each alterna-\n       tive in its own capturing parentheses.\n\n       If a verb with a name is encountered in a positive  assertion  that  is\n       true,  the  name  is recorded and passed back if it is the last-encoun-\n       tered. This does not happen for negative assertions or failing positive\n       assertions.\n\n       After  a  partial match or a failed match, the last encountered name in\n       the entire match process is returned. For example:\n\n           re> /X(*MARK:A)Y|X(*MARK:B)Z/K\n         data> XP\n         No match, mark = B\n\n       Note that in this unanchored example the  mark  is  retained  from  the\n       match attempt that started at the letter \"X\" in the subject. Subsequent\n       match attempts starting at \"P\" and then with an empty string do not get\n       as far as the (*MARK) item, but nevertheless do not reset it.\n\n       If  you  are  interested  in  (*MARK)  values after failed matches, you\n       should probably set the PCRE_NO_START_OPTIMIZE option  (see  above)  to\n       ensure that the match is always attempted.\n\n   Verbs that act after backtracking\n\n       The following verbs do nothing when they are encountered. Matching con-\n       tinues with what follows, but if there is no subsequent match,  causing\n       a  backtrack  to  the  verb, a failure is forced. That is, backtracking\n       cannot pass to the left of the verb. However, when one of  these  verbs\n       appears inside an atomic group or an assertion that is true, its effect\n       is confined to that group, because once the  group  has  been  matched,\n       there  is never any backtracking into it. In this situation, backtrack-\n       ing can \"jump back\" to the left of the entire atomic  group  or  asser-\n       tion.  (Remember  also,  as  stated  above, that this localization also\n       applies in subroutine calls.)\n\n       These verbs differ in exactly what kind of failure  occurs  when  back-\n       tracking  reaches  them.  The behaviour described below is what happens\n       when the verb is not in a subroutine or an assertion.  Subsequent  sec-\n       tions cover these special cases.\n\n         (*COMMIT)\n\n       This  verb, which may not be followed by a name, causes the whole match\n       to fail outright if there is a later matching failure that causes back-\n       tracking  to  reach  it.  Even if the pattern is unanchored, no further\n       attempts to find a match by advancing the starting point take place. If\n       (*COMMIT)  is  the  only backtracking verb that is encountered, once it\n       has been passed pcre_exec() is committed to finding a match at the cur-\n       rent starting point, or not at all. For example:\n\n         a+(*COMMIT)b\n\n       This  matches  \"xxaab\" but not \"aacaab\". It can be thought of as a kind\n       of dynamic anchor, or \"I've started, so I must finish.\" The name of the\n       most  recently passed (*MARK) in the path is passed back when (*COMMIT)\n       forces a match failure.\n\n       If there is more than one backtracking verb in a pattern,  a  different\n       one  that  follows  (*COMMIT) may be triggered first, so merely passing\n       (*COMMIT) during a match does not always guarantee that a match must be\n       at this starting point.\n\n       Note  that  (*COMMIT)  at  the start of a pattern is not the same as an\n       anchor, unless PCRE's start-of-match optimizations are turned  off,  as\n       shown in this output from pcretest:\n\n           re> /(*COMMIT)abc/\n         data> xyzabc\n          0: abc\n         data> xyzabc\\Y\n         No match\n\n       For this pattern, PCRE knows that any match must start with \"a\", so the\n       optimization skips along the subject to \"a\" before applying the pattern\n       to  the first set of data. The match attempt then succeeds. In the sec-\n       ond set of data, the escape sequence \\Y is interpreted by the  pcretest\n       program.  It  causes  the  PCRE_NO_START_OPTIMIZE option to be set when\n       pcre_exec() is called.  This disables the optimization that skips along\n       to the first character. The pattern is now applied starting at \"x\", and\n       so the (*COMMIT) causes the match to  fail  without  trying  any  other\n       starting points.\n\n         (*PRUNE) or (*PRUNE:NAME)\n\n       This  verb causes the match to fail at the current starting position in\n       the subject if there is a later matching failure that causes backtrack-\n       ing  to  reach it. If the pattern is unanchored, the normal \"bumpalong\"\n       advance to the next starting character then happens.  Backtracking  can\n       occur  as  usual to the left of (*PRUNE), before it is reached, or when\n       matching to the right of (*PRUNE), but if there  is  no  match  to  the\n       right,  backtracking cannot cross (*PRUNE). In simple cases, the use of\n       (*PRUNE) is just an alternative to an atomic group or possessive  quan-\n       tifier, but there are some uses of (*PRUNE) that cannot be expressed in\n       any other way. In an anchored pattern (*PRUNE) has the same  effect  as\n       (*COMMIT).\n\n       The   behaviour   of   (*PRUNE:NAME)   is   the   not   the   same   as\n       (*MARK:NAME)(*PRUNE).  It is like (*MARK:NAME)  in  that  the  name  is\n       remembered  for  passing  back  to  the  caller.  However, (*SKIP:NAME)\n       searches only for names set with (*MARK).\n\n         (*SKIP)\n\n       This verb, when given without a name, is like (*PRUNE), except that  if\n       the  pattern  is unanchored, the \"bumpalong\" advance is not to the next\n       character, but to the position in the subject where (*SKIP) was encoun-\n       tered.  (*SKIP)  signifies that whatever text was matched leading up to\n       it cannot be part of a successful match. Consider:\n\n         a+(*SKIP)b\n\n       If the subject is \"aaaac...\",  after  the  first  match  attempt  fails\n       (starting  at  the  first  character in the string), the starting point\n       skips on to start the next attempt at \"c\". Note that a possessive quan-\n       tifer  does not have the same effect as this example; although it would\n       suppress backtracking  during  the  first  match  attempt,  the  second\n       attempt  would  start at the second character instead of skipping on to\n       \"c\".\n\n         (*SKIP:NAME)\n\n       When (*SKIP) has an associated name, its behaviour is modified. When it\n       is triggered, the previous path through the pattern is searched for the\n       most recent (*MARK) that has the  same  name.  If  one  is  found,  the\n       \"bumpalong\" advance is to the subject position that corresponds to that\n       (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with\n       a matching name is found, the (*SKIP) is ignored.\n\n       Note  that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It\n       ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME).\n\n         (*THEN) or (*THEN:NAME)\n\n       This verb causes a skip to the next innermost  alternative  when  back-\n       tracking  reaches  it.  That  is,  it  cancels any further backtracking\n       within the current alternative. Its name  comes  from  the  observation\n       that it can be used for a pattern-based if-then-else block:\n\n         ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...\n\n       If  the COND1 pattern matches, FOO is tried (and possibly further items\n       after the end of the group if FOO succeeds); on  failure,  the  matcher\n       skips  to  the second alternative and tries COND2, without backtracking\n       into COND1. If that succeeds and BAR fails, COND3 is tried.  If  subse-\n       quently  BAZ fails, there are no more alternatives, so there is a back-\n       track to whatever came before the  entire  group.  If  (*THEN)  is  not\n       inside an alternation, it acts like (*PRUNE).\n\n       The    behaviour   of   (*THEN:NAME)   is   the   not   the   same   as\n       (*MARK:NAME)(*THEN).  It is like  (*MARK:NAME)  in  that  the  name  is\n       remembered  for  passing  back  to  the  caller.  However, (*SKIP:NAME)\n       searches only for names set with (*MARK).\n\n       A subpattern that does not contain a | character is just a part of  the\n       enclosing  alternative;  it  is  not a nested alternation with only one\n       alternative. The effect of (*THEN) extends beyond such a subpattern  to\n       the  enclosing alternative. Consider this pattern, where A, B, etc. are\n       complex pattern fragments that do not contain any | characters at  this\n       level:\n\n         A (B(*THEN)C) | D\n\n       If  A and B are matched, but there is a failure in C, matching does not\n       backtrack into A; instead it moves to the next alternative, that is, D.\n       However,  if the subpattern containing (*THEN) is given an alternative,\n       it behaves differently:\n\n         A (B(*THEN)C | (*FAIL)) | D\n\n       The effect of (*THEN) is now confined to the inner subpattern. After  a\n       failure in C, matching moves to (*FAIL), which causes the whole subpat-\n       tern to fail because there are no more alternatives  to  try.  In  this\n       case, matching does now backtrack into A.\n\n       Note  that  a  conditional  subpattern  is not considered as having two\n       alternatives, because only one is ever used.  In  other  words,  the  |\n       character in a conditional subpattern has a different meaning. Ignoring\n       white space, consider:\n\n         ^.*? (?(?=a) a | b(*THEN)c )\n\n       If the subject is \"ba\", this pattern does not  match.  Because  .*?  is\n       ungreedy,  it  initially  matches  zero characters. The condition (?=a)\n       then fails, the character \"b\" is matched,  but  \"c\"  is  not.  At  this\n       point,  matching does not backtrack to .*? as might perhaps be expected\n       from the presence of the | character.  The  conditional  subpattern  is\n       part of the single alternative that comprises the whole pattern, and so\n       the match fails. (If there was a backtrack into  .*?,  allowing  it  to\n       match \"b\", the match would succeed.)\n\n       The  verbs just described provide four different \"strengths\" of control\n       when subsequent matching fails. (*THEN) is the weakest, carrying on the\n       match  at  the next alternative. (*PRUNE) comes next, failing the match\n       at the current starting position, but allowing an advance to  the  next\n       character  (for an unanchored pattern). (*SKIP) is similar, except that\n       the advance may be more than one character. (*COMMIT) is the strongest,\n       causing the entire match to fail.\n\n   More than one backtracking verb\n\n       If  more  than  one  backtracking verb is present in a pattern, the one\n       that is backtracked onto first acts. For example,  consider  this  pat-\n       tern, where A, B, etc. are complex pattern fragments:\n\n         (A(*COMMIT)B(*THEN)C|ABD)\n\n       If  A matches but B fails, the backtrack to (*COMMIT) causes the entire\n       match to fail. However, if A and B match, but C fails, the backtrack to\n       (*THEN)  causes  the next alternative (ABD) to be tried. This behaviour\n       is consistent, but is not always the same as Perl's. It means  that  if\n       two  or  more backtracking verbs appear in succession, all the the last\n       of them has no effect. Consider this example:\n\n         ...(*COMMIT)(*PRUNE)...\n\n       If there is a matching failure to the right, backtracking onto (*PRUNE)\n       causes  it to be triggered, and its action is taken. There can never be\n       a backtrack onto (*COMMIT).\n\n   Backtracking verbs in repeated groups\n\n       PCRE differs from  Perl  in  its  handling  of  backtracking  verbs  in\n       repeated groups. For example, consider:\n\n         /(a(*COMMIT)b)+ac/\n\n       If  the  subject  is  \"abac\",  Perl matches, but PCRE fails because the\n       (*COMMIT) in the second repeat of the group acts.\n\n   Backtracking verbs in assertions\n\n       (*FAIL) in an assertion has its normal effect: it forces  an  immediate\n       backtrack.\n\n       (*ACCEPT) in a positive assertion causes the assertion to succeed with-\n       out any further processing. In a negative assertion,  (*ACCEPT)  causes\n       the assertion to fail without any further processing.\n\n       The  other  backtracking verbs are not treated specially if they appear\n       in a positive assertion. In  particular,  (*THEN)  skips  to  the  next\n       alternative  in  the  innermost  enclosing group that has alternations,\n       whether or not this is within the assertion.\n\n       Negative assertions are, however, different, in order  to  ensure  that\n       changing  a  positive  assertion  into a negative assertion changes its\n       result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg-\n       ative assertion to be true, without considering any further alternative\n       branches in the assertion.  Backtracking into (*THEN) causes it to skip\n       to  the next enclosing alternative within the assertion (the normal be-\n       haviour), but if the assertion  does  not  have  such  an  alternative,\n       (*THEN) behaves like (*PRUNE).\n\n   Backtracking verbs in subroutines\n\n       These  behaviours  occur whether or not the subpattern is called recur-\n       sively.  Perl's treatment of subroutines is different in some cases.\n\n       (*FAIL) in a subpattern called as a subroutine has its  normal  effect:\n       it forces an immediate backtrack.\n\n       (*ACCEPT)  in a subpattern called as a subroutine causes the subroutine\n       match to succeed without any further processing. Matching then  contin-\n       ues after the subroutine call.\n\n       (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine\n       cause the subroutine match to fail.\n\n       (*THEN) skips to the next alternative in the innermost enclosing  group\n       within  the subpattern that has alternatives. If there is no such group\n       within the subpattern, (*THEN) causes the subroutine match to fail.\n\n\nSEE ALSO\n\n       pcreapi(3), pcrecallout(3),  pcrematching(3),  pcresyntax(3),  pcre(3),\n       pcre16(3), pcre32(3).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 23 October 2016\n       Copyright (c) 1997-2016 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRESYNTAX(3)              Library Functions Manual              PCRESYNTAX(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE REGULAR EXPRESSION SYNTAX SUMMARY\n\n       The  full syntax and semantics of the regular expressions that are sup-\n       ported by PCRE are described in  the  pcrepattern  documentation.  This\n       document contains a quick-reference summary of the syntax.\n\n\nQUOTING\n\n         \\x         where x is non-alphanumeric is a literal x\n         \\Q...\\E    treat enclosed characters as literal\n\n\nCHARACTERS\n\n         \\a         alarm, that is, the BEL character (hex 07)\n         \\cx        \"control-x\", where x is any ASCII character\n         \\e         escape (hex 1B)\n         \\f         form feed (hex 0C)\n         \\n         newline (hex 0A)\n         \\r         carriage return (hex 0D)\n         \\t         tab (hex 09)\n         \\0dd       character with octal code 0dd\n         \\ddd       character with octal code ddd, or backreference\n         \\o{ddd..}  character with octal code ddd..\n         \\xhh       character with hex code hh\n         \\x{hhh..}  character with hex code hhh..\n\n       Note that \\0dd is always an octal code, and that \\8 and \\9 are the lit-\n       eral characters \"8\" and \"9\".\n\n\nCHARACTER TYPES\n\n         .          any character except newline;\n                      in dotall mode, any character whatsoever\n         \\C         one data unit, even in UTF mode (best avoided)\n         \\d         a decimal digit\n         \\D         a character that is not a decimal digit\n         \\h         a horizontal white space character\n         \\H         a character that is not a horizontal white space character\n         \\N         a character that is not a newline\n         \\p{xx}     a character with the xx property\n         \\P{xx}     a character without the xx property\n         \\R         a newline sequence\n         \\s         a white space character\n         \\S         a character that is not a white space character\n         \\v         a vertical white space character\n         \\V         a character that is not a vertical white space character\n         \\w         a \"word\" character\n         \\W         a \"non-word\" character\n         \\X         a Unicode extended grapheme cluster\n\n       By default, \\d, \\s, and \\w match only ASCII characters, even  in  UTF-8\n       mode  or  in  the 16- bit and 32-bit libraries. However, if locale-spe-\n       cific matching is happening, \\s and \\w may also match  characters  with\n       code  points  in  the range 128-255. If the PCRE_UCP option is set, the\n       behaviour of these escape sequences is changed to use  Unicode  proper-\n       ties and they match many more characters.\n\n\nGENERAL CATEGORY PROPERTIES FOR \\p and \\P\n\n         C          Other\n         Cc         Control\n         Cf         Format\n         Cn         Unassigned\n         Co         Private use\n         Cs         Surrogate\n\n         L          Letter\n         Ll         Lower case letter\n         Lm         Modifier letter\n         Lo         Other letter\n         Lt         Title case letter\n         Lu         Upper case letter\n         L&         Ll, Lu, or Lt\n\n         M          Mark\n         Mc         Spacing mark\n         Me         Enclosing mark\n         Mn         Non-spacing mark\n\n         N          Number\n         Nd         Decimal number\n         Nl         Letter number\n         No         Other number\n\n         P          Punctuation\n         Pc         Connector punctuation\n         Pd         Dash punctuation\n         Pe         Close punctuation\n         Pf         Final punctuation\n         Pi         Initial punctuation\n         Po         Other punctuation\n         Ps         Open punctuation\n\n         S          Symbol\n         Sc         Currency symbol\n         Sk         Modifier symbol\n         Sm         Mathematical symbol\n         So         Other symbol\n\n         Z          Separator\n         Zl         Line separator\n         Zp         Paragraph separator\n         Zs         Space separator\n\n\nPCRE SPECIAL CATEGORY PROPERTIES FOR \\p and \\P\n\n         Xan        Alphanumeric: union of properties L and N\n         Xps        POSIX space: property Z or tab, NL, VT, FF, CR\n         Xsp        Perl space: property Z or tab, NL, VT, FF, CR\n         Xuc        Univerally-named character: one that can be\n                      represented by a Universal Character Name\n         Xwd        Perl word: property Xan or underscore\n\n       Perl and POSIX space are now the same. Perl added VT to its space char-\n       acter set at release 5.18 and PCRE changed at release 8.34.\n\n\nSCRIPT NAMES FOR \\p AND \\P\n\n       Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak,  Bengali,\n       Bopomofo,  Brahmi,  Braille, Buginese, Buhid, Canadian_Aboriginal, Car-\n       ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei-\n       form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero-\n       glyphs,  Elbasan,  Ethiopic,  Georgian,  Glagolitic,  Gothic,  Grantha,\n       Greek,  Gujarati,  Gurmukhi,  Han,  Hangul,  Hanunoo, Hebrew, Hiragana,\n       Imperial_Aramaic,    Inherited,     Inscriptional_Pahlavi,     Inscrip-\n       tional_Parthian,   Javanese,   Kaithi,   Kannada,  Katakana,  Kayah_Li,\n       Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha,  Limbu,  Lin-\n       ear_A,  Linear_B,  Lisu,  Lycian, Lydian, Mahajani, Malayalam, Mandaic,\n       Manichaean,     Meetei_Mayek,     Mende_Kikakui,      Meroitic_Cursive,\n       Meroitic_Hieroglyphs,  Miao,  Modi, Mongolian, Mro, Myanmar, Nabataean,\n       New_Tai_Lue,  Nko,  Ogham,  Ol_Chiki,  Old_Italic,   Old_North_Arabian,\n       Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya,\n       Pahawh_Hmong,    Palmyrene,    Pau_Cin_Hau,    Phags_Pa,    Phoenician,\n       Psalter_Pahlavi,  Rejang,  Runic,  Samaritan, Saurashtra, Sharada, Sha-\n       vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri,  Syriac,\n       Tagalog,  Tagbanwa,  Tai_Le,  Tai_Tham, Tai_Viet, Takri, Tamil, Telugu,\n       Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic,  Vai,  Warang_Citi,\n       Yi.\n\n\nCHARACTER CLASSES\n\n         [...]       positive character class\n         [^...]      negative character class\n         [x-y]       range (can be used for hex characters)\n         [[:xxx:]]   positive POSIX named set\n         [[:^xxx:]]  negative POSIX named set\n\n         alnum       alphanumeric\n         alpha       alphabetic\n         ascii       0-127\n         blank       space or tab\n         cntrl       control character\n         digit       decimal digit\n         graph       printing, excluding space\n         lower       lower case letter\n         print       printing, including space\n         punct       printing, excluding alphanumeric\n         space       white space\n         upper       upper case letter\n         word        same as \\w\n         xdigit      hexadecimal digit\n\n       In  PCRE,  POSIX character set names recognize only ASCII characters by\n       default, but some of them use Unicode properties if  PCRE_UCP  is  set.\n       You can use \\Q...\\E inside a character class.\n\n\nQUANTIFIERS\n\n         ?           0 or 1, greedy\n         ?+          0 or 1, possessive\n         ??          0 or 1, lazy\n         *           0 or more, greedy\n         *+          0 or more, possessive\n         *?          0 or more, lazy\n         +           1 or more, greedy\n         ++          1 or more, possessive\n         +?          1 or more, lazy\n         {n}         exactly n\n         {n,m}       at least n, no more than m, greedy\n         {n,m}+      at least n, no more than m, possessive\n         {n,m}?      at least n, no more than m, lazy\n         {n,}        n or more, greedy\n         {n,}+       n or more, possessive\n         {n,}?       n or more, lazy\n\n\nANCHORS AND SIMPLE ASSERTIONS\n\n         \\b          word boundary\n         \\B          not a word boundary\n         ^           start of subject\n                      also after internal newline in multiline mode\n         \\A          start of subject\n         $           end of subject\n                      also before newline at end of subject\n                      also before internal newline in multiline mode\n         \\Z          end of subject\n                      also before newline at end of subject\n         \\z          end of subject\n         \\G          first matching position in subject\n\n\nMATCH POINT RESET\n\n         \\K          reset start of match\n\n       \\K is honoured in positive assertions, but ignored in negative ones.\n\n\nALTERNATION\n\n         expr|expr|expr...\n\n\nCAPTURING\n\n         (...)           capturing group\n         (?<name>...)    named capturing group (Perl)\n         (?'name'...)    named capturing group (Perl)\n         (?P<name>...)   named capturing group (Python)\n         (?:...)         non-capturing group\n         (?|...)         non-capturing group; reset group numbers for\n                          capturing groups in each alternative\n\n\nATOMIC GROUPS\n\n         (?>...)         atomic, non-capturing group\n\n\nCOMMENT\n\n         (?#....)        comment (not nestable)\n\n\nOPTION SETTING\n\n         (?i)            caseless\n         (?J)            allow duplicate names\n         (?m)            multiline\n         (?s)            single line (dotall)\n         (?U)            default ungreedy (lazy)\n         (?x)            extended (ignore white space)\n         (?-...)         unset option(s)\n\n       The  following  are  recognized  only at the very start of a pattern or\n       after one of the newline or \\R options with similar syntax.  More  than\n       one of them may appear.\n\n         (*LIMIT_MATCH=d) set the match limit to d (decimal number)\n         (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)\n         (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)\n         (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)\n         (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)\n         (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)\n         (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)\n         (*UTF)          set appropriate UTF mode for the library in use\n         (*UCP)          set PCRE_UCP (use Unicode properties for \\d etc)\n\n       Note  that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of\n       the limits set by the caller of pcre_exec(), not increase them.\n\n\nNEWLINE CONVENTION\n\n       These are recognized only at the very start of  the  pattern  or  after\n       option settings with a similar syntax.\n\n         (*CR)           carriage return only\n         (*LF)           linefeed only\n         (*CRLF)         carriage return followed by linefeed\n         (*ANYCRLF)      all three of the above\n         (*ANY)          any Unicode newline sequence\n\n\nWHAT \\R MATCHES\n\n       These  are  recognized  only  at the very start of the pattern or after\n       option setting with a similar syntax.\n\n         (*BSR_ANYCRLF)  CR, LF, or CRLF\n         (*BSR_UNICODE)  any Unicode newline sequence\n\n\nLOOKAHEAD AND LOOKBEHIND ASSERTIONS\n\n         (?=...)         positive look ahead\n         (?!...)         negative look ahead\n         (?<=...)        positive look behind\n         (?<!...)        negative look behind\n\n       Each top-level branch of a look behind must be of a fixed length.\n\n\nBACKREFERENCES\n\n         \\n              reference by number (can be ambiguous)\n         \\gn             reference by number\n         \\g{n}           reference by number\n         \\g{-n}          relative reference by number\n         \\k<name>        reference by name (Perl)\n         \\k'name'        reference by name (Perl)\n         \\g{name}        reference by name (Perl)\n         \\k{name}        reference by name (.NET)\n         (?P=name)       reference by name (Python)\n\n\nSUBROUTINE REFERENCES (POSSIBLY RECURSIVE)\n\n         (?R)            recurse whole pattern\n         (?n)            call subpattern by absolute number\n         (?+n)           call subpattern by relative number\n         (?-n)           call subpattern by relative number\n         (?&name)        call subpattern by name (Perl)\n         (?P>name)       call subpattern by name (Python)\n         \\g<name>        call subpattern by name (Oniguruma)\n         \\g'name'        call subpattern by name (Oniguruma)\n         \\g<n>           call subpattern by absolute number (Oniguruma)\n         \\g'n'           call subpattern by absolute number (Oniguruma)\n         \\g<+n>          call subpattern by relative number (PCRE extension)\n         \\g'+n'          call subpattern by relative number (PCRE extension)\n         \\g<-n>          call subpattern by relative number (PCRE extension)\n         \\g'-n'          call subpattern by relative number (PCRE extension)\n\n\nCONDITIONAL PATTERNS\n\n         (?(condition)yes-pattern)\n         (?(condition)yes-pattern|no-pattern)\n\n         (?(n)...        absolute reference condition\n         (?(+n)...       relative reference condition\n         (?(-n)...       relative reference condition\n         (?(<name>)...   named reference condition (Perl)\n         (?('name')...   named reference condition (Perl)\n         (?(name)...     named reference condition (PCRE)\n         (?(R)...        overall recursion condition\n         (?(Rn)...       specific group recursion condition\n         (?(R&name)...   specific recursion condition\n         (?(DEFINE)...   define subpattern for reference\n         (?(assert)...   assertion condition\n\n\nBACKTRACKING CONTROL\n\n       The following act immediately they are reached:\n\n         (*ACCEPT)       force successful match\n         (*FAIL)         force backtrack; synonym (*F)\n         (*MARK:NAME)    set name to be passed back; synonym (*:NAME)\n\n       The following act only when a subsequent match failure causes  a  back-\n       track to reach them. They all force a match failure, but they differ in\n       what happens afterwards. Those that advance the start-of-match point do\n       so only if the pattern is not anchored.\n\n         (*COMMIT)       overall failure, no advance of starting point\n         (*PRUNE)        advance to next starting character\n         (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)\n         (*SKIP)         advance to current matching position\n         (*SKIP:NAME)    advance to position corresponding to an earlier\n                         (*MARK:NAME); if not found, the (*SKIP) is ignored\n         (*THEN)         local failure, backtrack to next alternation\n         (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)\n\n\nCALLOUTS\n\n         (?C)      callout\n         (?Cn)     callout with data n\n\n\nSEE ALSO\n\n       pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 08 January 2014\n       Copyright (c) 1997-2014 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREUNICODE(3)             Library Functions Manual             PCREUNICODE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nUTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT\n\n       As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30)\n       and UTF-32 (from release 8.32), by means of two  additional  libraries.\n       They can be built as well as, or instead of, the 8-bit library.\n\n\nUTF-8 SUPPORT\n\n       In  order  process  UTF-8  strings, you must build PCRE's 8-bit library\n       with UTF support, and, in addition, you must call  pcre_compile()  with\n       the  PCRE_UTF8 option flag, or the pattern must start with the sequence\n       (*UTF8) or (*UTF). When either of these is the case, both  the  pattern\n       and  any  subject  strings  that  are matched against it are treated as\n       UTF-8 strings instead of strings of individual 1-byte characters.\n\n\nUTF-16 AND UTF-32 SUPPORT\n\n       In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit\n       or  32-bit  library  with  UTF support, and, in addition, you must call\n       pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or  PCRE_UTF32\n       option flag, as appropriate. Alternatively, the pattern must start with\n       the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF),  which  can\n       be used with either library. When UTF mode is set, both the pattern and\n       any subject strings that are matched against it are treated  as  UTF-16\n       or  UTF-32  strings  instead  of strings of individual 16-bit or 32-bit\n       characters.\n\n\nUTF SUPPORT OVERHEAD\n\n       If you compile PCRE with UTF support, but do not use it  at  run  time,\n       the  library will be a bit bigger, but the additional run time overhead\n       is limited to  testing  the  PCRE_UTF[8|16|32]  flag  occasionally,  so\n       should not be very big.\n\n\nUNICODE PROPERTY SUPPORT\n\n       If PCRE is built with Unicode character property support (which implies\n       UTF support), the escape sequences \\p{..}, \\P{..}, and \\X can be  used.\n       The  available properties that can be tested are limited to the general\n       category properties such as Lu for an upper case letter  or  Nd  for  a\n       decimal number, the Unicode script names such as Arabic or Han, and the\n       derived properties Any and L&. Full lists is given in  the  pcrepattern\n       and  pcresyntax  documentation. Only the short names for properties are\n       supported. For example, \\p{L}  matches  a  letter.  Its  Perl  synonym,\n       \\p{Letter},  is  not  supported.  Furthermore, in Perl, many properties\n       may optionally be prefixed by \"Is\", for compatibility  with  Perl  5.6.\n       PCRE does not support this.\n\n   Validity of UTF-8 strings\n\n       When  you  set  the PCRE_UTF8 flag, the byte strings passed as patterns\n       and subjects are (by default) checked for validity on entry to the rel-\n       evant functions. The entire string is checked before any other process-\n       ing takes place. From release 7.3 of PCRE, the check is  according  the\n       rules of RFC 3629, which are themselves derived from the Unicode speci-\n       fication. Earlier releases of PCRE followed  the  rules  of  RFC  2279,\n       which  allows  the  full  range of 31-bit values (0 to 0x7FFFFFFF). The\n       current check allows only values in the range U+0 to U+10FFFF,  exclud-\n       ing  the  surrogate area. (From release 8.33 the so-called \"non-charac-\n       ter\" code points are no longer excluded because Unicode corrigendum  #9\n       makes it clear that they should not be.)\n\n       Characters  in  the \"Surrogate Area\" of Unicode are reserved for use by\n       UTF-16, where they are used in pairs to encode codepoints  with  values\n       greater  than  0xFFFF. The code points that are encoded by UTF-16 pairs\n       are available independently in the  UTF-8  and  UTF-32  encodings.  (In\n       other  words,  the  whole  surrogate  thing is a fudge for UTF-16 which\n       unfortunately messes up UTF-8 and UTF-32.)\n\n       If an invalid UTF-8 string is passed to PCRE, an error return is given.\n       At  compile  time, the only additional information is the offset to the\n       first byte of the failing character. The run-time functions pcre_exec()\n       and  pcre_dfa_exec() also pass back this information, as well as a more\n       detailed reason code if the caller has provided memory in which  to  do\n       this.\n\n       In  some  situations, you may already know that your strings are valid,\n       and therefore want to skip these checks in  order  to  improve  perfor-\n       mance,  for  example in the case of a long subject string that is being\n       scanned repeatedly.  If you set the PCRE_NO_UTF8_CHECK flag at  compile\n       time  or  at  run  time, PCRE assumes that the pattern or subject it is\n       given (respectively) contains only valid UTF-8 codes. In this case,  it\n       does not diagnose an invalid UTF-8 string.\n\n       Note  that  passing  PCRE_NO_UTF8_CHECK to pcre_compile() just disables\n       the check for the pattern; it does not also apply to  subject  strings.\n       If  you  want  to  disable the check for a subject string you must pass\n       this option to pcre_exec() or pcre_dfa_exec().\n\n       If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the\n       result is undefined and your program may crash.\n\n   Validity of UTF-16 strings\n\n       When you set the PCRE_UTF16 flag, the strings of 16-bit data units that\n       are passed as patterns and subjects are (by default) checked for valid-\n       ity  on entry to the relevant functions. Values other than those in the\n       surrogate range U+D800 to U+DFFF are independent code points. Values in\n       the surrogate range must be used in pairs in the correct manner.\n\n       If  an  invalid  UTF-16  string  is  passed to PCRE, an error return is\n       given. At compile time, the only additional information is  the  offset\n       to the first data unit of the failing character. The run-time functions\n       pcre16_exec() and pcre16_dfa_exec() also pass back this information, as\n       well  as  a more detailed reason code if the caller has provided memory\n       in which to do this.\n\n       In some situations, you may already know that your strings  are  valid,\n       and  therefore  want  to  skip these checks in order to improve perfor-\n       mance. If you set the PCRE_NO_UTF16_CHECK flag at compile  time  or  at\n       run time, PCRE assumes that the pattern or subject it is given (respec-\n       tively) contains only valid UTF-16 sequences. In this case, it does not\n       diagnose  an  invalid  UTF-16 string.  However, if an invalid string is\n       passed, the result is undefined.\n\n   Validity of UTF-32 strings\n\n       When you set the PCRE_UTF32 flag, the strings of 32-bit data units that\n       are passed as patterns and subjects are (by default) checked for valid-\n       ity on entry to the relevant functions.  This check allows only  values\n       in  the  range  U+0 to U+10FFFF, excluding the surrogate area U+D800 to\n       U+DFFF.\n\n       If an invalid UTF-32 string is passed  to  PCRE,  an  error  return  is\n       given.  At  compile time, the only additional information is the offset\n       to the first data unit of the failing character. The run-time functions\n       pcre32_exec() and pcre32_dfa_exec() also pass back this information, as\n       well as a more detailed reason code if the caller has  provided  memory\n       in which to do this.\n\n       In  some  situations, you may already know that your strings are valid,\n       and therefore want to skip these checks in  order  to  improve  perfor-\n       mance.  If  you  set the PCRE_NO_UTF32_CHECK flag at compile time or at\n       run time, PCRE assumes that the pattern or subject it is given (respec-\n       tively) contains only valid UTF-32 sequences. In this case, it does not\n       diagnose an invalid UTF-32 string.  However, if an  invalid  string  is\n       passed, the result is undefined.\n\n   General comments about UTF modes\n\n       1.  Codepoints  less  than  256  can be specified in patterns by either\n       braced or unbraced hexadecimal escape sequences (for example, \\x{b3} or\n       \\xb3). Larger values have to use braced sequences.\n\n       2.  Octal  numbers  up  to  \\777 are recognized, and in UTF-8 mode they\n       match two-byte characters for values greater than \\177.\n\n       3. Repeat quantifiers apply to complete UTF characters, not to individ-\n       ual data units, for example: \\x{100}{3}.\n\n       4.  The dot metacharacter matches one UTF character instead of a single\n       data unit.\n\n       5. The escape sequence \\C can be used to match a single byte  in  UTF-8\n       mode,  or  a single 16-bit data unit in UTF-16 mode, or a single 32-bit\n       data unit in UTF-32 mode, but its use can lead to some strange  effects\n       because  it  breaks up multi-unit characters (see the description of \\C\n       in the pcrepattern documentation). The use of \\C is  not  supported  in\n       the  alternative  matching  function  pcre[16|32]_dfa_exec(), nor is it\n       supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If\n       JIT  optimization  is  requested for a UTF pattern that contains \\C, it\n       will not succeed, and so the matching will be carried out by the normal\n       interpretive function.\n\n       6.  The  character escapes \\b, \\B, \\d, \\D, \\s, \\S, \\w, and \\W correctly\n       test characters of any code value, but, by default, the characters that\n       PCRE  recognizes  as digits, spaces, or word characters remain the same\n       set as in non-UTF mode, all with values less  than  256.  This  remains\n       true  even  when  PCRE  is  built  to include Unicode property support,\n       because to do otherwise would slow down PCRE in many common cases. Note\n       in  particular that this applies to \\b and \\B, because they are defined\n       in terms of \\w and \\W. If you really want to test for a wider sense of,\n       say,  \"digit\",  you  can  use  explicit  Unicode property tests such as\n       \\p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the\n       character  escapes  work is changed so that Unicode properties are used\n       to determine which characters match. There are more details in the sec-\n       tion on generic character types in the pcrepattern documentation.\n\n       7.  Similarly,  characters that match the POSIX named character classes\n       are all low-valued characters, unless the PCRE_UCP option is set.\n\n       8. However, the horizontal and vertical white  space  matching  escapes\n       (\\h,  \\H,  \\v, and \\V) do match all the appropriate Unicode characters,\n       whether or not PCRE_UCP is set.\n\n       9. Case-insensitive matching applies only to  characters  whose  values\n       are  less than 128, unless PCRE is built with Unicode property support.\n       A few Unicode characters such as Greek sigma have more than  two  code-\n       points that are case-equivalent. Up to and including PCRE release 8.31,\n       only one-to-one case mappings were supported, but later releases  (with\n       Unicode  property  support) do treat as case-equivalent all versions of\n       characters such as Greek sigma.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 27 February 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREJIT(3)                 Library Functions Manual                 PCREJIT(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE JUST-IN-TIME COMPILER SUPPORT\n\n       Just-in-time  compiling  is a heavyweight optimization that can greatly\n       speed up pattern matching. However, it comes at the cost of extra  pro-\n       cessing before the match is performed. Therefore, it is of most benefit\n       when the same pattern is going to be matched many times. This does  not\n       necessarily  mean  many calls of a matching function; if the pattern is\n       not anchored, matching attempts may take place many  times  at  various\n       positions  in  the  subject, even for a single call.  Therefore, if the\n       subject string is very long, it may still pay to use  JIT  for  one-off\n       matches.\n\n       JIT  support  applies  only to the traditional Perl-compatible matching\n       function.  It does not apply when the DFA matching  function  is  being\n       used. The code for this support was written by Zoltan Herczeg.\n\n\n8-BIT, 16-BIT AND 32-BIT SUPPORT\n\n       JIT  support  is available for all of the 8-bit, 16-bit and 32-bit PCRE\n       libraries. To keep this documentation simple, only the 8-bit  interface\n       is described in what follows. If you are using the 16-bit library, sub-\n       stitute the  16-bit  functions  and  16-bit  structures  (for  example,\n       pcre16_jit_stack  instead  of  pcre_jit_stack).  If  you  are using the\n       32-bit library, substitute the 32-bit functions and  32-bit  structures\n       (for example, pcre32_jit_stack instead of pcre_jit_stack).\n\n\nAVAILABILITY OF JIT SUPPORT\n\n       JIT  support  is  an  optional  feature of PCRE. The \"configure\" option\n       --enable-jit (or equivalent CMake option) must  be  set  when  PCRE  is\n       built  if  you want to use JIT. The support is limited to the following\n       hardware platforms:\n\n         ARM v5, v7, and Thumb2\n         Intel x86 32-bit and 64-bit\n         MIPS 32-bit\n         Power PC 32-bit and 64-bit\n         SPARC 32-bit (experimental)\n\n       If --enable-jit is set on an unsupported platform, compilation fails.\n\n       A program that is linked with PCRE 8.20 or later can tell if  JIT  sup-\n       port  is  available  by  calling pcre_config() with the PCRE_CONFIG_JIT\n       option. The result is 1 when JIT is available, and  0  otherwise.  How-\n       ever, a simple program does not need to check this in order to use JIT.\n       The normal API is implemented in a way that falls back to the interpre-\n       tive code if JIT is not available. For programs that need the best pos-\n       sible performance, there is also a \"fast path\"  API  that  is  JIT-spe-\n       cific.\n\n       If  your program may sometimes be linked with versions of PCRE that are\n       older than 8.20, but you want to use JIT when it is available, you  can\n       test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT\n       macro such as PCRE_CONFIG_JIT, for compile-time control of  your  code.\n       Also  beware that the pcre_jit_exec() function was not available at all\n       before 8.32, and may not be available at all  if  PCRE  isn't  compiled\n       with  --enable-jit.  See  the  \"JIT  FAST  PATH  API\" section below for\n       details.\n\n\nSIMPLE USE OF JIT\n\n       You have to do two things to make use of the JIT support  in  the  sim-\n       plest way:\n\n         (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for\n             each compiled pattern, and pass the resulting pcre_extra block to\n             pcre_exec().\n\n         (2) Use pcre_free_study() to free the pcre_extra block when it is\n             no  longer  needed,  instead  of  just  freeing it yourself. This\n       ensures that\n             any JIT data is also freed.\n\n       For a program that may be linked with pre-8.20 versions  of  PCRE,  you\n       can insert\n\n         #ifndef PCRE_STUDY_JIT_COMPILE\n         #define PCRE_STUDY_JIT_COMPILE 0\n         #endif\n\n       so  that  no  option  is passed to pcre_study(), and then use something\n       like this to free the study data:\n\n         #ifdef PCRE_CONFIG_JIT\n             pcre_free_study(study_ptr);\n         #else\n             pcre_free(study_ptr);\n         #endif\n\n       PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate  code  for\n       complete  matches.  If  you  want  to  run  partial  matches  using the\n       PCRE_PARTIAL_HARD or  PCRE_PARTIAL_SOFT  options  of  pcre_exec(),  you\n       should  set  one  or  both  of the following options in addition to, or\n       instead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study():\n\n         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n\n       If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you\n       can insert:\n\n          #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32\n          pcre_jit_exec(...);\n          #else\n          pcre_exec(...)\n          #endif\n\n       but  as described in the \"JIT FAST PATH API\" section below this assumes\n       version 8.32 and later are compiled with --enable-jit, which may break.\n\n       The JIT compiler generates different optimized code  for  each  of  the\n       three  modes  (normal, soft partial, hard partial). When pcre_exec() is\n       called, the appropriate code is run if it is available. Otherwise,  the\n       pattern is matched using interpretive code.\n\n       In  some circumstances you may need to call additional functions. These\n       are described in the  section  entitled  \"Controlling  the  JIT  stack\"\n       below.\n\n       If  JIT  support  is  not  available,  PCRE_STUDY_JIT_COMPILE  etc. are\n       ignored, and no JIT data is created. Otherwise, the compiled pattern is\n       passed  to the JIT compiler, which turns it into machine code that exe-\n       cutes much faster than the normal interpretive code.  When  pcre_exec()\n       is  passed  a  pcre_extra block containing a pointer to JIT code of the\n       appropriate mode (normal or hard/soft  partial),  it  obeys  that  code\n       instead  of  running  the interpreter. The result is identical, but the\n       compiled JIT code runs much faster.\n\n       There are some pcre_exec() options that are not supported for JIT  exe-\n       cution.  There  are  also  some  pattern  items that JIT cannot handle.\n       Details are given below. In both cases, execution  automatically  falls\n       back  to  the  interpretive  code.  If you want to know whether JIT was\n       actually used for a particular match, you  should  arrange  for  a  JIT\n       callback  function  to  be  set up as described in the section entitled\n       \"Controlling the JIT stack\" below, even if you do not need to supply  a\n       non-default  JIT stack. Such a callback function is called whenever JIT\n       code is about to be obeyed. If the execution options are not right  for\n       JIT execution, the callback function is not obeyed.\n\n       If  the  JIT  compiler finds an unsupported item, no JIT data is gener-\n       ated. You can find out if JIT execution is available after  studying  a\n       pattern  by  calling  pcre_fullinfo()  with the PCRE_INFO_JIT option. A\n       result of 1 means that JIT compilation was successful. A  result  of  0\n       means that JIT support is not available, or the pattern was not studied\n       with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not  able  to\n       handle the pattern.\n\n       Once a pattern has been studied, with or without JIT, it can be used as\n       many times as you like for matching different subject strings.\n\n\nUNSUPPORTED OPTIONS AND PATTERN ITEMS\n\n       The only pcre_exec() options that are supported for JIT  execution  are\n       PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT-\n       BOL,  PCRE_NOTEOL,  PCRE_NOTEMPTY,   PCRE_NOTEMPTY_ATSTART,   PCRE_PAR-\n       TIAL_HARD, and PCRE_PARTIAL_SOFT.\n\n       The  only  unsupported  pattern items are \\C (match a single data unit)\n       when running in a UTF mode, and a callout immediately before an  asser-\n       tion condition in a conditional group.\n\n\nRETURN VALUES FROM JIT EXECUTION\n\n       When  a  pattern  is matched using JIT execution, the return values are\n       the same as those given by the interpretive pcre_exec() code, with  the\n       addition  of  one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means\n       that the memory used for the JIT stack was insufficient. See  \"Control-\n       ling the JIT stack\" below for a discussion of JIT stack usage. For com-\n       patibility with the interpretive pcre_exec() code, no  more  than  two-\n       thirds  of  the ovector argument is used for passing back captured sub-\n       strings.\n\n       The error code PCRE_ERROR_MATCHLIMIT is returned by  the  JIT  code  if\n       searching  a  very large pattern tree goes on for too long, as it is in\n       the same circumstance when JIT is not used, but the details of  exactly\n       what  is  counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error\n       code is never returned by JIT execution.\n\n\nSAVING AND RESTORING COMPILED PATTERNS\n\n       The code that is generated by the  JIT  compiler  is  architecture-spe-\n       cific,  and  is also position dependent. For those reasons it cannot be\n       saved (in a file or database) and restored later like the bytecode  and\n       other  data  of  a compiled pattern. Saving and restoring compiled pat-\n       terns is not something many people do. More detail about this  facility\n       is  given in the pcreprecompile documentation. It should be possible to\n       run pcre_study() on a saved and restored pattern, and thereby  recreate\n       the  JIT  data, but because JIT compilation uses significant resources,\n       it is probably not worth doing this; you might as  well  recompile  the\n       original pattern.\n\n\nCONTROLLING THE JIT STACK\n\n       When the compiled JIT code runs, it needs a block of memory to use as a\n       stack.  By default, it uses 32K on the  machine  stack.  However,  some\n       large   or   complicated  patterns  need  more  than  this.  The  error\n       PCRE_ERROR_JIT_STACKLIMIT is given when  there  is  not  enough  stack.\n       Three  functions  are provided for managing blocks of memory for use as\n       JIT stacks. There is further discussion about the use of JIT stacks  in\n       the section entitled \"JIT stack FAQ\" below.\n\n       The  pcre_jit_stack_alloc() function creates a JIT stack. Its arguments\n       are a starting size and a maximum size, and it returns a pointer to  an\n       opaque  structure of type pcre_jit_stack, or NULL if there is an error.\n       The pcre_jit_stack_free() function can be used to free a stack that  is\n       no  longer  needed.  (For  the technically minded: the address space is\n       allocated by mmap or VirtualAlloc.)\n\n       JIT uses far less memory for recursion than the interpretive code,  and\n       a  maximum  stack size of 512K to 1M should be more than enough for any\n       pattern.\n\n       The pcre_assign_jit_stack() function specifies  which  stack  JIT  code\n       should use. Its arguments are as follows:\n\n         pcre_extra         *extra\n         pcre_jit_callback  callback\n         void               *data\n\n       The  extra  argument  must  be  the  result  of studying a pattern with\n       PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the\n       other two options:\n\n         (1) If callback is NULL and data is NULL, an internal 32K block\n             on the machine stack is used.\n\n         (2) If callback is NULL and data is not NULL, data must be\n             a valid JIT stack, the result of calling pcre_jit_stack_alloc().\n\n         (3) If callback is not NULL, it must point to a function that is\n             called with data as an argument at the start of matching, in\n             order to set up a JIT stack. If the return from the callback\n             function is NULL, the internal 32K stack is used; otherwise the\n             return value must be a valid JIT stack, the result of calling\n             pcre_jit_stack_alloc().\n\n       A  callback function is obeyed whenever JIT code is about to be run; it\n       is not obeyed when pcre_exec() is called with options that  are  incom-\n       patible for JIT execution. A callback function can therefore be used to\n       determine whether a match operation was  executed  by  JIT  or  by  the\n       interpreter.\n\n       You may safely use the same JIT stack for more than one pattern (either\n       by assigning directly or by callback), as long as the patterns are  all\n       matched  sequentially in the same thread. In a multithread application,\n       if you do not specify a JIT stack, or if you assign or pass  back  NULL\n       from  a  callback, that is thread-safe, because each thread has its own\n       machine stack. However, if you assign  or  pass  back  a  non-NULL  JIT\n       stack,  this  must  be  a  different  stack for each thread so that the\n       application is thread-safe.\n\n       Strictly speaking, even more is allowed. You can assign the  same  non-\n       NULL  stack  to any number of patterns as long as they are not used for\n       matching by multiple threads at the same time.  For  example,  you  can\n       assign  the same stack to all compiled patterns, and use a global mutex\n       in the callback to wait until the stack is available for use.  However,\n       this is an inefficient solution, and not recommended.\n\n       This  is a suggestion for how a multithreaded program that needs to set\n       up non-default JIT stacks might operate:\n\n         During thread initalization\n           thread_local_var = pcre_jit_stack_alloc(...)\n\n         During thread exit\n           pcre_jit_stack_free(thread_local_var)\n\n         Use a one-line callback function\n           return thread_local_var\n\n       All the functions described in this section do nothing if  JIT  is  not\n       available,  and  pcre_assign_jit_stack()  does nothing unless the extra\n       argument is non-NULL and points to  a  pcre_extra  block  that  is  the\n       result of a successful study with PCRE_STUDY_JIT_COMPILE etc.\n\n\nJIT STACK FAQ\n\n       (1) Why do we need JIT stacks?\n\n       PCRE  (and JIT) is a recursive, depth-first engine, so it needs a stack\n       where the local data of the current node is pushed before checking  its\n       child nodes.  Allocating real machine stack on some platforms is diffi-\n       cult. For example, the stack chain needs to be updated every time if we\n       extend  the  stack  on  PowerPC.  Although it is possible, its updating\n       time overhead decreases performance. So we do the recursion in memory.\n\n       (2) Why don't we simply allocate blocks of memory with malloc()?\n\n       Modern operating systems have a  nice  feature:  they  can  reserve  an\n       address space instead of allocating memory. We can safely allocate mem-\n       ory pages inside this address space, so the stack  could  grow  without\n       moving memory data (this is important because of pointers). Thus we can\n       allocate 1M address space, and use only a single memory  page  (usually\n       4K)  if  that is enough. However, we can still grow up to 1M anytime if\n       needed.\n\n       (3) Who \"owns\" a JIT stack?\n\n       The owner of the stack is the user program, not the JIT studied pattern\n       or  anything else. The user program must ensure that if a stack is used\n       by pcre_exec(), (that is, it is assigned to the pattern currently  run-\n       ning), that stack must not be used by any other threads (to avoid over-\n       writing the same memory area). The best practice for multithreaded pro-\n       grams  is  to  allocate  a stack for each thread, and return this stack\n       through the JIT callback function.\n\n       (4) When should a JIT stack be freed?\n\n       You can free a JIT stack at any time, as long as it will not be used by\n       pcre_exec()  again.  When  you  assign  the  stack to a pattern, only a\n       pointer is set. There is no reference counting or any other magic.  You\n       can  free  the  patterns  and stacks in any order, anytime. Just do not\n       call pcre_exec() with a pattern pointing to an already freed stack,  as\n       that  will cause SEGFAULT. (Also, do not free a stack currently used by\n       pcre_exec() in another thread). You can also replace the  stack  for  a\n       pattern  at  any  time.  You  can  even  free the previous stack before\n       assigning a replacement.\n\n       (5) Should I allocate/free a  stack  every  time  before/after  calling\n       pcre_exec()?\n\n       No,  because  this  is  too  costly in terms of resources. However, you\n       could implement some clever idea which release the stack if it  is  not\n       used  in  let's  say  two minutes. The JIT callback can help to achieve\n       this without keeping a list of the currently JIT studied patterns.\n\n       (6) OK, the stack is for long term memory allocation. But what  happens\n       if  a pattern causes stack overflow with a stack of 1M? Is that 1M kept\n       until the stack is freed?\n\n       Especially on embedded sytems, it might be a good idea to release  mem-\n       ory  sometimes  without  freeing the stack. There is no API for this at\n       the moment.  Probably a function call which returns with the  currently\n       allocated  memory for any stack and another which allows releasing mem-\n       ory (shrinking the stack) would be a good idea if someone needs this.\n\n       (7) This is too much of a headache. Isn't there any better solution for\n       JIT stack handling?\n\n       No,  thanks to Windows. If POSIX threads were used everywhere, we could\n       throw out this complicated API.\n\n\nEXAMPLE CODE\n\n       This is a single-threaded example that specifies a  JIT  stack  without\n       using a callback.\n\n         int rc;\n         int ovector[30];\n         pcre *re;\n         pcre_extra *extra;\n         pcre_jit_stack *jit_stack;\n\n         re = pcre_compile(pattern, 0, &error, &erroffset, NULL);\n         /* Check for errors */\n         extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);\n         jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);\n         /* Check for error (NULL) */\n         pcre_assign_jit_stack(extra, NULL, jit_stack);\n         rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);\n         /* Check results */\n         pcre_free(re);\n         pcre_free_study(extra);\n         pcre_jit_stack_free(jit_stack);\n\n\nJIT FAST PATH API\n\n       Because  the  API  described  above falls back to interpreted execution\n       when JIT is not available, it is convenient for programs that are writ-\n       ten  for  general  use  in  many environments. However, calling JIT via\n       pcre_exec() does have a performance impact. Programs that  are  written\n       for  use  where  JIT  is known to be available, and which need the best\n       possible performance, can instead use a \"fast path\"  API  to  call  JIT\n       execution  directly  instead of calling pcre_exec() (obviously only for\n       patterns that have been successfully studied by JIT).\n\n       The fast path function is called pcre_jit_exec(), and it takes  exactly\n       the  same  arguments  as pcre_exec(), plus one additional argument that\n       must point to a JIT stack. The JIT stack arrangements  described  above\n       do not apply. The return values are the same as for pcre_exec().\n\n       When  you  call  pcre_exec(), as well as testing for invalid options, a\n       number of other sanity checks are performed on the arguments. For exam-\n       ple,  if  the  subject  pointer  is NULL, or its length is negative, an\n       immediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is  set,  a\n       UTF  subject  string is tested for validity. In the interests of speed,\n       these checks do not happen on the JIT fast path, and if invalid data is\n       passed, the result is undefined.\n\n       Bypassing  the  sanity  checks  and  the  pcre_exec() wrapping can give\n       speedups of more than 10%.\n\n       Note that the pcre_jit_exec() function is not available in versions  of\n       PCRE  before  8.32  (released in November 2012). If you need to support\n       versions that old you must either use the slower pcre_exec(), or switch\n       between  the  two  codepaths  by  checking the values of PCRE_MAJOR and\n       PCRE_MINOR.\n\n       Due to an unfortunate implementation oversight, even in  versions  8.32\n       and  later  there will be no pcre_jit_exec() stub function defined when\n       PCRE is compiled with --disable-jit, which is the default, and  there's\n       no  way  to  detect  whether  PCRE was compiled with --enable-jit via a\n       macro.\n\n       If you need to support versions older than 8.32, or versions  that  may\n       not   build   with   --enable-jit,  you  must  either  use  the  slower\n       pcre_exec(), or switch between the two codepaths by checking the values\n       of PCRE_MAJOR and PCRE_MINOR.\n\n       Switching  between the two by checking the version assumes that all the\n       versions being targeted are built with --enable-jit.  To  also  support\n       builds that may use --disable-jit either pcre_exec() must be used, or a\n       compile-time check for JIT via pcre_config() (which assumes the runtime\n       environment  will  be  the  same), or as the Git project decided to do,\n       simply assume that pcre_jit_exec() is present in 8.32 or later unless a\n       compile-time  flag  is  provided, see the \"grep: un-break building with\n       PCRE >= 8.32 without --enable-jit\" commit in git.git for an example  of\n       that.\n\n\nSEE ALSO\n\n       pcreapi(3)\n\n\nAUTHOR\n\n       Philip Hazel (FAQ by Zoltan Herczeg)\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 05 July 2017\n       Copyright (c) 1997-2017 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREPARTIAL(3)             Library Functions Manual             PCREPARTIAL(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPARTIAL MATCHING IN PCRE\n\n       In normal use of PCRE, if the subject string that is passed to a match-\n       ing function matches as far as it goes, but is too short to  match  the\n       entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances\n       where it might be helpful to distinguish this case from other cases  in\n       which there is no match.\n\n       Consider, for example, an application where a human is required to type\n       in data for a field with specific formatting requirements.  An  example\n       might be a date in the form ddmmmyy, defined by this pattern:\n\n         ^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$\n\n       If the application sees the user's keystrokes one by one, and can check\n       that what has been typed so far is potentially valid,  it  is  able  to\n       raise  an  error  as  soon  as  a  mistake  is made, by beeping and not\n       reflecting the character that has been typed, for example. This immedi-\n       ate  feedback is likely to be a better user interface than a check that\n       is delayed until the entire string has been entered.  Partial  matching\n       can  also be useful when the subject string is very long and is not all\n       available at once.\n\n       PCRE supports partial matching by means of  the  PCRE_PARTIAL_SOFT  and\n       PCRE_PARTIAL_HARD  options,  which  can  be set when calling any of the\n       matching functions. For backwards compatibility, PCRE_PARTIAL is a syn-\n       onym  for  PCRE_PARTIAL_SOFT.  The essential difference between the two\n       options is whether or not a partial match is preferred to  an  alterna-\n       tive complete match, though the details differ between the two types of\n       matching function. If both options  are  set,  PCRE_PARTIAL_HARD  takes\n       precedence.\n\n       If  you  want to use partial matching with just-in-time optimized code,\n       you must call pcre_study(), pcre16_study() or  pcre32_study() with  one\n       or both of these options:\n\n         PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n         PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n\n       PCRE_STUDY_JIT_COMPILE  should also be set if you are going to run non-\n       partial matches on the same pattern. If the appropriate JIT study  mode\n       has not been set for a match, the interpretive matching code is used.\n\n       Setting a partial matching option disables two of PCRE's standard opti-\n       mizations. PCRE remembers the last literal data unit in a pattern,  and\n       abandons  matching  immediately  if  it  is  not present in the subject\n       string. This optimization cannot be used  for  a  subject  string  that\n       might  match only partially. If the pattern was studied, PCRE knows the\n       minimum length of a matching string, and does not  bother  to  run  the\n       matching  function  on  shorter strings. This optimization is also dis-\n       abled for partial matching.\n\n\nPARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()\n\n       A  partial   match   occurs   during   a   call   to   pcre_exec()   or\n       pcre[16|32]_exec()  when  the end of the subject string is reached suc-\n       cessfully, but matching cannot continue  because  more  characters  are\n       needed.   However, at least one character in the subject must have been\n       inspected. This character need not  form  part  of  the  final  matched\n       string;  lookbehind  assertions and the \\K escape sequence provide ways\n       of inspecting characters before the start of a matched  substring.  The\n       requirement  for  inspecting  at  least one character exists because an\n       empty string can always be matched; without such  a  restriction  there\n       would  always  be  a partial match of an empty string at the end of the\n       subject.\n\n       If there are at least two slots in the offsets vector  when  a  partial\n       match  is returned, the first slot is set to the offset of the earliest\n       character that was inspected. For convenience, the second offset points\n       to the end of the subject so that a substring can easily be identified.\n       If there are at least three slots in the offsets vector, the third slot\n       is set to the offset of the character where matching started.\n\n       For the majority of patterns, the contents of the first and third slots\n       will be the same. However, for patterns that contain lookbehind  asser-\n       tions, or begin with \\b or \\B, characters before the one where matching\n       started may have been inspected while carrying out the match. For exam-\n       ple, consider this pattern:\n\n         /(?<=abc)123/\n\n       This pattern matches \"123\", but only if it is preceded by \"abc\". If the\n       subject string is \"xyzabc12\", the first two  offsets  after  a  partial\n       match  are for the substring \"abc12\", because all these characters were\n       inspected. However, the third offset is set to 6, because that  is  the\n       offset where matching began.\n\n       What happens when a partial match is identified depends on which of the\n       two partial matching options are set.\n\n   PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()\n\n       If PCRE_PARTIAL_SOFT is  set  when  pcre_exec()  or  pcre[16|32]_exec()\n       identifies a partial match, the partial match is remembered, but match-\n       ing continues as normal, and other  alternatives  in  the  pattern  are\n       tried.  If  no  complete  match  can  be  found,  PCRE_ERROR_PARTIAL is\n       returned instead of PCRE_ERROR_NOMATCH.\n\n       This option is \"soft\" because it prefers a complete match over  a  par-\n       tial  match.   All the various matching items in a pattern behave as if\n       the subject string is potentially complete. For example, \\z, \\Z, and  $\n       match  at  the end of the subject, as normal, and for \\b and \\B the end\n       of the subject is treated as a non-alphanumeric.\n\n       If there is more than one partial match, the first one that  was  found\n       provides the data that is returned. Consider this pattern:\n\n         /123\\w+X|dogY/\n\n       If  this is matched against the subject string \"abc123dog\", both alter-\n       natives fail to match, but the end of the  subject  is  reached  during\n       matching,  so  PCRE_ERROR_PARTIAL is returned. The offsets are set to 3\n       and 9, identifying \"123dog\" as the first partial match that was  found.\n       (In  this  example, there are two partial matches, because \"dog\" on its\n       own partially matches the second alternative.)\n\n   PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()\n\n       If PCRE_PARTIAL_HARD is  set  for  pcre_exec()  or  pcre[16|32]_exec(),\n       PCRE_ERROR_PARTIAL  is  returned  as  soon as a partial match is found,\n       without continuing to search for possible complete matches. This option\n       is \"hard\" because it prefers an earlier partial match over a later com-\n       plete match. For this reason, the assumption is made that  the  end  of\n       the  supplied  subject  string may not be the true end of the available\n       data, and so, if \\z, \\Z, \\b, \\B, or $ are encountered at the end of the\n       subject,  the  result is PCRE_ERROR_PARTIAL, provided that at least one\n       character in the subject has been inspected.\n\n       Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject\n       strings  are checked for validity. Normally, an invalid sequence causes\n       the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16.  However,  in  the\n       special  case  of  a  truncated  character  at  the end of the subject,\n       PCRE_ERROR_SHORTUTF8  or   PCRE_ERROR_SHORTUTF16   is   returned   when\n       PCRE_PARTIAL_HARD is set.\n\n   Comparing hard and soft partial matching\n\n       The  difference  between the two partial matching options can be illus-\n       trated by a pattern such as:\n\n         /dog(sbody)?/\n\n       This matches either \"dog\" or \"dogsbody\", greedily (that is, it  prefers\n       the  longer  string  if  possible). If it is matched against the string\n       \"dog\" with PCRE_PARTIAL_SOFT, it yields a  complete  match  for  \"dog\".\n       However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL.\n       On the other hand, if the pattern is made ungreedy the result  is  dif-\n       ferent:\n\n         /dog(sbody)??/\n\n       In  this  case  the  result  is always a complete match because that is\n       found first, and matching never  continues  after  finding  a  complete\n       match. It might be easier to follow this explanation by thinking of the\n       two patterns like this:\n\n         /dog(sbody)?/    is the same as  /dogsbody|dog/\n         /dog(sbody)??/   is the same as  /dog|dogsbody/\n\n       The second pattern will never match \"dogsbody\", because it will  always\n       find the shorter match first.\n\n\nPARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()\n\n       The DFA functions move along the subject string character by character,\n       without backtracking, searching for  all  possible  matches  simultane-\n       ously.  If the end of the subject is reached before the end of the pat-\n       tern, there is the possibility of a partial match, again provided  that\n       at least one character has been inspected.\n\n       When  PCRE_PARTIAL_SOFT  is set, PCRE_ERROR_PARTIAL is returned only if\n       there have been no complete matches. Otherwise,  the  complete  matches\n       are  returned.   However,  if PCRE_PARTIAL_HARD is set, a partial match\n       takes precedence over any complete matches. The portion of  the  string\n       that  was  inspected when the longest partial match was found is set as\n       the first matching string, provided there are at least two slots in the\n       offsets vector.\n\n       Because  the  DFA functions always search for all possible matches, and\n       there is no difference between greedy and  ungreedy  repetition,  their\n       behaviour  is  different  from  the  standard  functions when PCRE_PAR-\n       TIAL_HARD is  set.  Consider  the  string  \"dog\"  matched  against  the\n       ungreedy pattern shown above:\n\n         /dog(sbody)??/\n\n       Whereas  the  standard functions stop as soon as they find the complete\n       match for \"dog\", the DFA functions also  find  the  partial  match  for\n       \"dogsbody\", and so return that when PCRE_PARTIAL_HARD is set.\n\n\nPARTIAL MATCHING AND WORD BOUNDARIES\n\n       If  a  pattern ends with one of sequences \\b or \\B, which test for word\n       boundaries, partial matching with PCRE_PARTIAL_SOFT can  give  counter-\n       intuitive results. Consider this pattern:\n\n         /\\bcat\\b/\n\n       This matches \"cat\", provided there is a word boundary at either end. If\n       the subject string is \"the cat\", the comparison of the final \"t\" with a\n       following  character  cannot  take  place, so a partial match is found.\n       However, normal matching carries on, and \\b matches at the end  of  the\n       subject  when  the  last  character is a letter, so a complete match is\n       found.  The  result,  therefore,  is  not   PCRE_ERROR_PARTIAL.   Using\n       PCRE_PARTIAL_HARD  in  this case does yield PCRE_ERROR_PARTIAL, because\n       then the partial match takes precedence.\n\n\nFORMERLY RESTRICTED PATTERNS\n\n       For releases of PCRE prior to 8.00, because of the way certain internal\n       optimizations   were  implemented  in  the  pcre_exec()  function,  the\n       PCRE_PARTIAL option (predecessor of  PCRE_PARTIAL_SOFT)  could  not  be\n       used  with all patterns. From release 8.00 onwards, the restrictions no\n       longer apply, and partial matching with can be requested for  any  pat-\n       tern.\n\n       Items that were formerly restricted were repeated single characters and\n       repeated metasequences. If PCRE_PARTIAL was set for a pattern that  did\n       not  conform  to  the restrictions, pcre_exec() returned the error code\n       PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in  use.  The\n       PCRE_INFO_OKPARTIAL  call  to pcre_fullinfo() to find out if a compiled\n       pattern can be used for partial matching now always returns 1.\n\n\nEXAMPLE OF PARTIAL MATCHING USING PCRETEST\n\n       If the escape sequence \\P is present  in  a  pcretest  data  line,  the\n       PCRE_PARTIAL_SOFT  option  is  used  for  the  match.  Here is a run of\n       pcretest that uses the date example quoted above:\n\n           re> /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n         data> 25jun04\\P\n          0: 25jun04\n          1: jun\n         data> 25dec3\\P\n         Partial match: 23dec3\n         data> 3ju\\P\n         Partial match: 3ju\n         data> 3juj\\P\n         No match\n         data> j\\P\n         No match\n\n       The first data string is matched  completely,  so  pcretest  shows  the\n       matched  substrings.  The  remaining four strings do not match the com-\n       plete pattern, but the first two are partial matches. Similar output is\n       obtained if DFA matching is used.\n\n       If  the escape sequence \\P is present more than once in a pcretest data\n       line, the PCRE_PARTIAL_HARD option is set for the match.\n\n\nMULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()\n\n       When a partial match has been found using a DFA matching  function,  it\n       is  possible to continue the match by providing additional subject data\n       and calling the function again with the same compiled  regular  expres-\n       sion,  this time setting the PCRE_DFA_RESTART option. You must pass the\n       same working space as before, because this is where details of the pre-\n       vious  partial  match  are  stored.  Here is an example using pcretest,\n       using the \\R escape sequence to set  the  PCRE_DFA_RESTART  option  (\\D\n       specifies the use of the DFA matching function):\n\n           re> /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n         data> 23ja\\P\\D\n         Partial match: 23ja\n         data> n05\\R\\D\n          0: n05\n\n       The  first  call has \"23ja\" as the subject, and requests partial match-\n       ing; the second call  has  \"n05\"  as  the  subject  for  the  continued\n       (restarted)  match.   Notice  that when the match is complete, only the\n       last part is shown; PCRE does  not  retain  the  previously  partially-\n       matched  string. It is up to the calling program to do that if it needs\n       to.\n\n       That means that, for an unanchored pattern, if a continued match fails,\n       it  is  not  possible  to  try  again at a new starting point. All this\n       facility is capable of doing is  continuing  with  the  previous  match\n       attempt.  In  the previous example, if the second set of data is \"ug23\"\n       the result is no match, even though there would be a match for  \"aug23\"\n       if  the entire string were given at once. Depending on the application,\n       this may or may not be what you want.  The only way to allow for start-\n       ing  again  at  the next character is to retain the matched part of the\n       subject and try a new complete match.\n\n       You can set the PCRE_PARTIAL_SOFT  or  PCRE_PARTIAL_HARD  options  with\n       PCRE_DFA_RESTART  to  continue partial matching over multiple segments.\n       This facility can be used to pass very long subject strings to the  DFA\n       matching functions.\n\n\nMULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()\n\n       From  release 8.00, the standard matching functions can also be used to\n       do multi-segment matching. Unlike the DFA functions, it is not possible\n       to  restart the previous match with a new segment of data. Instead, new\n       data must be added to the previous subject string, and the entire match\n       re-run,  starting from the point where the partial match occurred. Ear-\n       lier data can be discarded.\n\n       It is best to use PCRE_PARTIAL_HARD in this situation, because it  does\n       not  treat the end of a segment as the end of the subject when matching\n       \\z, \\Z, \\b, \\B, and $. Consider  an  unanchored  pattern  that  matches\n       dates:\n\n           re> /\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d/\n         data> The date is 23ja\\P\\P\n         Partial match: 23ja\n\n       At  this stage, an application could discard the text preceding \"23ja\",\n       add on text from the next  segment,  and  call  the  matching  function\n       again.  Unlike  the  DFA matching functions, the entire matching string\n       must always be available, and the complete matching process occurs  for\n       each call, so more memory and more processing time is needed.\n\n       Note:  If  the pattern contains lookbehind assertions, or \\K, or starts\n       with \\b or \\B, the string that is returned for a partial match includes\n       characters  that precede the start of what would be returned for a com-\n       plete match, because it contains all the characters that were inspected\n       during the partial match.\n\n\nISSUES WITH MULTI-SEGMENT MATCHING\n\n       Certain types of pattern may give problems with multi-segment matching,\n       whichever matching function is used.\n\n       1. If the pattern contains a test for the beginning of a line, you need\n       to  pass  the  PCRE_NOTBOL  option when the subject string for any call\n       does start at the beginning of a line.  There  is  also  a  PCRE_NOTEOL\n       option, but in practice when doing multi-segment matching you should be\n       using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL.\n\n       2. Lookbehind assertions that have already been obeyed are catered  for\n       in the offsets that are returned for a partial match. However a lookbe-\n       hind assertion later in the pattern could require even earlier  charac-\n       ters   to  be  inspected.  You  can  handle  this  case  by  using  the\n       PCRE_INFO_MAXLOOKBEHIND    option    of    the    pcre_fullinfo()    or\n       pcre[16|32]_fullinfo()  functions  to  obtain the length of the longest\n       lookbehind in the pattern. This length  is  given  in  characters,  not\n       bytes.  If  you  always retain at least that many characters before the\n       partially matched string, all should be  well.  (Of  course,  near  the\n       start of the subject, fewer characters may be present; in that case all\n       characters should be retained.)\n\n       From release 8.33, there is a more accurate way of deciding which char-\n       acters  to  retain.  Instead  of  subtracting the length of the longest\n       lookbehind from the  earliest  inspected  character  (offsets[0]),  the\n       match  start  position  (offsets[2]) should be used, and the next match\n       attempt started at the offsets[2] character by setting the  startoffset\n       argument of pcre_exec() or pcre_dfa_exec().\n\n       For  example, if the pattern \"(?<=123)abc\" is partially matched against\n       the string \"xx123a\", the three offset values returned are 2, 6, and  5.\n       This  indicates  that  the  matching  process that gave a partial match\n       started at offset 5, but the characters \"123a\" were all inspected.  The\n       maximum  lookbehind  for  that pattern is 3, so taking that away from 5\n       shows that we need only keep \"123a\", and the next match attempt can  be\n       started at offset 3 (that is, at \"a\") when further characters have been\n       added. When the match start is not the  earliest  inspected  character,\n       pcretest shows it explicitly:\n\n           re> \"(?<=123)abc\"\n         data> xx123a\\P\\P\n         Partial match at offset 5: 123a\n\n       3.  Because a partial match must always contain at least one character,\n       what might be considered a partial match of an  empty  string  actually\n       gives a \"no match\" result. For example:\n\n           re> /c(?<=abc)x/\n         data> ab\\P\n         No match\n\n       If the next segment begins \"cx\", a match should be found, but this will\n       only happen if characters from the previous segment are  retained.  For\n       this  reason,  a  \"no  match\"  result should be interpreted as \"partial\n       match of an empty string\" when the pattern contains lookbehinds.\n\n       4. Matching a subject string that is split into multiple  segments  may\n       not  always produce exactly the same result as matching over one single\n       long string, especially when PCRE_PARTIAL_SOFT  is  used.  The  section\n       \"Partial  Matching  and  Word Boundaries\" above describes an issue that\n       arises if the pattern ends with \\b or \\B. Another  kind  of  difference\n       may  occur when there are multiple matching possibilities, because (for\n       PCRE_PARTIAL_SOFT) a partial match result is given only when there  are\n       no completed matches. This means that as soon as the shortest match has\n       been found, continuation to a new subject segment is no  longer  possi-\n       ble. Consider again this pcretest example:\n\n           re> /dog(sbody)?/\n         data> dogsb\\P\n          0: dog\n         data> do\\P\\D\n         Partial match: do\n         data> gsb\\R\\P\\D\n          0: g\n         data> dogsbody\\D\n          0: dogsbody\n          1: dog\n\n       The  first  data  line passes the string \"dogsb\" to a standard matching\n       function, setting the PCRE_PARTIAL_SOFT option. Although the string  is\n       a  partial  match for \"dogsbody\", the result is not PCRE_ERROR_PARTIAL,\n       because the shorter string \"dog\" is a complete match.  Similarly,  when\n       the  subject  is  presented to a DFA matching function in several parts\n       (\"do\" and \"gsb\" being the first two) the match  stops  when  \"dog\"  has\n       been  found, and it is not possible to continue.  On the other hand, if\n       \"dogsbody\" is presented as a single string,  a  DFA  matching  function\n       finds both matches.\n\n       Because  of  these  problems,  it is best to use PCRE_PARTIAL_HARD when\n       matching multi-segment data. The example  above  then  behaves  differ-\n       ently:\n\n           re> /dog(sbody)?/\n         data> dogsb\\P\\P\n         Partial match: dogsb\n         data> do\\P\\D\n         Partial match: do\n         data> gsb\\R\\P\\P\\D\n         Partial match: gsb\n\n       5. Patterns that contain alternatives at the top level which do not all\n       start with the  same  pattern  item  may  not  work  as  expected  when\n       PCRE_DFA_RESTART is used. For example, consider this pattern:\n\n         1234|3789\n\n       If  the  first  part of the subject is \"ABC123\", a partial match of the\n       first alternative is found at offset 3. There is no partial  match  for\n       the second alternative, because such a match does not start at the same\n       point in the subject string. Attempting to  continue  with  the  string\n       \"7890\"  does  not  yield  a  match because only those alternatives that\n       match at one point in the subject are remembered.  The  problem  arises\n       because  the  start  of the second alternative matches within the first\n       alternative. There is no problem with  anchored  patterns  or  patterns\n       such as:\n\n         1234|ABCD\n\n       where  no  string can be a partial match for both alternatives. This is\n       not a problem if a standard matching  function  is  used,  because  the\n       entire match has to be rerun each time:\n\n           re> /1234|3789/\n         data> ABC123\\P\\P\n         Partial match: 123\n         data> 1237890\n          0: 3789\n\n       Of course, instead of using PCRE_DFA_RESTART, the same technique of re-\n       running the entire match can also be used with the DFA  matching  func-\n       tions.  Another  possibility  is to work with two buffers. If a partial\n       match at offset n in the first buffer is followed by  \"no  match\"  when\n       PCRE_DFA_RESTART  is  used on the second buffer, you can then try a new\n       match starting at offset n+1 in the first buffer.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 02 July 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREPRECOMPILE(3)          Library Functions Manual          PCREPRECOMPILE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nSAVING AND RE-USING PRECOMPILED PCRE PATTERNS\n\n       If  you  are running an application that uses a large number of regular\n       expression patterns, it may be useful to store them  in  a  precompiled\n       form  instead  of  having to compile them every time the application is\n       run.  If you are not  using  any  private  character  tables  (see  the\n       pcre_maketables()  documentation),  this is relatively straightforward.\n       If you are using private tables, it is a little bit  more  complicated.\n       However,  if you are using the just-in-time optimization feature, it is\n       not possible to save and reload the JIT data.\n\n       If you save compiled patterns to a file, you can copy them to a differ-\n       ent host and run them there. If the two hosts have different endianness\n       (byte    order),    you     should     run     the     pcre[16|32]_pat-\n       tern_to_host_byte_order()  function  on  the  new host before trying to\n       match the pattern. The matching functions return  PCRE_ERROR_BADENDIAN-\n       NESS if they detect a pattern with the wrong endianness.\n\n       Compiling  regular  expressions with one version of PCRE for use with a\n       different version is not guaranteed to work and may cause crashes,  and\n       saving  and  restoring  a  compiled  pattern loses any JIT optimization\n       data.\n\n\nSAVING A COMPILED PATTERN\n\n       The value returned by pcre[16|32]_compile() points to a single block of\n       memory  that  holds  the  compiled pattern and associated data. You can\n       find   the   length   of   this   block    in    bytes    by    calling\n       pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then\n       save the data in any appropriate manner. Here is sample  code  for  the\n       8-bit  library  that  compiles  a  pattern  and writes it to a file. It\n       assumes that the variable fd refers to a file that is open for output:\n\n         int erroroffset, rc, size;\n         char *error;\n         pcre *re;\n\n         re = pcre_compile(\"my pattern\", 0, &error, &erroroffset, NULL);\n         if (re == NULL) { ... handle errors ... }\n         rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);\n         if (rc < 0) { ... handle errors ... }\n         rc = fwrite(re, 1, size, fd);\n         if (rc != size) { ... handle errors ... }\n\n       In this example, the bytes  that  comprise  the  compiled  pattern  are\n       copied  exactly.  Note that this is binary data that may contain any of\n       the 256 possible byte  values.  On  systems  that  make  a  distinction\n       between binary and non-binary data, be sure that the file is opened for\n       binary output.\n\n       If you want to write more than one pattern to a file, you will have  to\n       devise  a  way of separating them. For binary data, preceding each pat-\n       tern with its length is probably  the  most  straightforward  approach.\n       Another  possibility is to write out the data in hexadecimal instead of\n       binary, one pattern to a line.\n\n       Saving compiled patterns in a file is only one possible way of  storing\n       them  for later use. They could equally well be saved in a database, or\n       in the memory of some daemon process that passes them  via  sockets  to\n       the processes that want them.\n\n       If the pattern has been studied, it is also possible to save the normal\n       study data in a similar way to the compiled pattern itself. However, if\n       the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre-\n       ated cannot be saved because it is too dependent on the  current  envi-\n       ronment.    When    studying    generates    additional    information,\n       pcre[16|32]_study() returns  a  pointer  to  a  pcre[16|32]_extra  data\n       block.  Its  format  is defined in the section on matching a pattern in\n       the pcreapi documentation. The study_data field points  to  the  binary\n       study  data,  and this is what you must save (not the pcre[16|32]_extra\n       block itself). The length of the study data can be obtained by  calling\n       pcre[16|32]_fullinfo()  with an argument of PCRE_INFO_STUDYSIZE. Remem-\n       ber to check that  pcre[16|32]_study()  did  return  a  non-NULL  value\n       before trying to save the study data.\n\n\nRE-USING A PRECOMPILED PATTERN\n\n       Re-using  a  precompiled pattern is straightforward. Having reloaded it\n       into main memory,  called  pcre[16|32]_pattern_to_host_byte_order()  if\n       necessary,    you   pass   its   pointer   to   pcre[16|32]_exec()   or\n       pcre[16|32]_dfa_exec() in the usual way.\n\n       However, if you passed a pointer to custom character  tables  when  the\n       pattern  was compiled (the tableptr argument of pcre[16|32]_compile()),\n       you  must  now  pass  a  similar  pointer  to   pcre[16|32]_exec()   or\n       pcre[16|32]_dfa_exec(),  because the value saved with the compiled pat-\n       tern will obviously be nonsense. A field in a pcre[16|32]_extra() block\n       is  used  to  pass this data, as described in the section on matching a\n       pattern in the pcreapi documentation.\n\n       Warning: The tables that pcre_exec() and pcre_dfa_exec()  use  must  be\n       the same as those that were used when the pattern was compiled. If this\n       is not the case, the behaviour is undefined.\n\n       If you did not provide custom character tables  when  the  pattern  was\n       compiled, the pointer in the compiled pattern is NULL, which causes the\n       matching functions to use PCRE's internal tables. Thus, you do not need\n       to take any special action at run time in this case.\n\n       If  you  saved study data with the compiled pattern, you need to create\n       your own pcre[16|32]_extra data block and set the study_data  field  to\n       point   to   the   reloaded   study   data.   You  must  also  set  the\n       PCRE_EXTRA_STUDY_DATA bit in the flags field  to  indicate  that  study\n       data  is present. Then pass the pcre[16|32]_extra block to the matching\n       function in the usual way. If the pattern was studied for  just-in-time\n       optimization,  that  data  cannot  be  saved,  and  so  is  lost  by  a\n       save/restore cycle.\n\n\nCOMPATIBILITY WITH DIFFERENT PCRE RELEASES\n\n       In general, it is safest to  recompile  all  saved  patterns  when  you\n       update  to  a new PCRE release, though not all updates actually require\n       this.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 12 November 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREPERFORM(3)             Library Functions Manual             PCREPERFORM(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE PERFORMANCE\n\n       Two  aspects  of performance are discussed below: memory usage and pro-\n       cessing time. The way you express your pattern as a regular  expression\n       can affect both of them.\n\n\nCOMPILED PATTERN MEMORY USAGE\n\n       Patterns  are compiled by PCRE into a reasonably efficient interpretive\n       code, so that most simple patterns do not  use  much  memory.  However,\n       there  is  one case where the memory usage of a compiled pattern can be\n       unexpectedly large. If a parenthesized subpattern has a quantifier with\n       a minimum greater than 1 and/or a limited maximum, the whole subpattern\n       is repeated in the compiled code. For example, the pattern\n\n         (abc|def){2,4}\n\n       is compiled as if it were\n\n         (abc|def)(abc|def)((abc|def)(abc|def)?)?\n\n       (Technical aside: It is done this way so that backtrack  points  within\n       each of the repetitions can be independently maintained.)\n\n       For  regular expressions whose quantifiers use only small numbers, this\n       is not usually a problem. However, if the numbers are large,  and  par-\n       ticularly  if  such repetitions are nested, the memory usage can become\n       an embarrassment. For example, the very simple pattern\n\n         ((ab){1,1000}c){1,3}\n\n       uses 51K bytes when compiled using the 8-bit library. When PCRE is com-\n       piled  with  its  default  internal pointer size of two bytes, the size\n       limit on a compiled pattern is 64K data units, and this is reached with\n       the  above  pattern  if  the outer repetition is increased from 3 to 4.\n       PCRE can be compiled to use larger internal pointers  and  thus  handle\n       larger  compiled patterns, but it is better to try to rewrite your pat-\n       tern to use less memory if you can.\n\n       One way of reducing the memory usage for such patterns is to  make  use\n       of PCRE's \"subroutine\" facility. Re-writing the above pattern as\n\n         ((ab)(?2){0,999}c)(?1){0,2}\n\n       reduces the memory requirements to 18K, and indeed it remains under 20K\n       even with the outer repetition increased to 100. However, this  pattern\n       is  not  exactly equivalent, because the \"subroutine\" calls are treated\n       as atomic groups into which there can be no backtracking if there is  a\n       subsequent  matching  failure.  Therefore,  PCRE cannot do this kind of\n       rewriting automatically.  Furthermore, there is a  noticeable  loss  of\n       speed  when executing the modified pattern. Nevertheless, if the atomic\n       grouping is not a problem and the loss of  speed  is  acceptable,  this\n       kind  of  rewriting will allow you to process patterns that PCRE cannot\n       otherwise handle.\n\n\nSTACK USAGE AT RUN TIME\n\n       When pcre_exec() or pcre[16|32]_exec() is used  for  matching,  certain\n       kinds  of  pattern  can  cause  it  to use large amounts of the process\n       stack. In some environments the default process stack is  quite  small,\n       and  if it runs out the result is often SIGSEGV. This issue is probably\n       the most frequently raised problem with PCRE.  Rewriting  your  pattern\n       can  often  help.  The  pcrestack documentation discusses this issue in\n       detail.\n\n\nPROCESSING TIME\n\n       Certain items in regular expression patterns are processed  more  effi-\n       ciently than others. It is more efficient to use a character class like\n       [aeiou]  than  a  set  of   single-character   alternatives   such   as\n       (a|e|i|o|u).  In  general,  the simplest construction that provides the\n       required behaviour is usually the most efficient. Jeffrey Friedl's book\n       contains  a  lot  of useful general discussion about optimizing regular\n       expressions for efficient performance. This  document  contains  a  few\n       observations about PCRE.\n\n       Using  Unicode  character  properties  (the  \\p, \\P, and \\X escapes) is\n       slow, because PCRE has to use a multi-stage table  lookup  whenever  it\n       needs  a  character's  property. If you can find an alternative pattern\n       that does not use character properties, it will probably be faster.\n\n       By default, the escape sequences \\b, \\d, \\s,  and  \\w,  and  the  POSIX\n       character  classes  such  as  [:alpha:]  do not use Unicode properties,\n       partly for backwards compatibility, and partly for performance reasons.\n       However,  you can set PCRE_UCP if you want Unicode character properties\n       to be used. This can double the matching time for  items  such  as  \\d,\n       when matched with a traditional matching function; the performance loss\n       is less with a DFA matching function, and in both cases  there  is  not\n       much difference for \\b.\n\n       When  a  pattern  begins  with .* not in parentheses, or in parentheses\n       that are not the subject of a backreference, and the PCRE_DOTALL option\n       is  set, the pattern is implicitly anchored by PCRE, since it can match\n       only at the start of a subject string. However, if PCRE_DOTALL  is  not\n       set,  PCRE  cannot  make this optimization, because the . metacharacter\n       does not then match a newline, and if the subject string contains  new-\n       lines,  the  pattern may match from the character immediately following\n       one of them instead of from the very start. For example, the pattern\n\n         .*second\n\n       matches the subject \"first\\nand second\" (where \\n stands for a  newline\n       character),  with the match starting at the seventh character. In order\n       to do this, PCRE has to retry the match starting after every newline in\n       the subject.\n\n       If  you  are using such a pattern with subject strings that do not con-\n       tain newlines, the best performance is obtained by setting PCRE_DOTALL,\n       or  starting  the pattern with ^.* or ^.*? to indicate explicit anchor-\n       ing. That saves PCRE from having to scan along the subject looking  for\n       a newline to restart at.\n\n       Beware  of  patterns  that contain nested indefinite repeats. These can\n       take a long time to run when applied to a string that does  not  match.\n       Consider the pattern fragment\n\n         ^(a+)*\n\n       This  can  match \"aaaa\" in 16 different ways, and this number increases\n       very rapidly as the string gets longer. (The * repeat can match  0,  1,\n       2,  3, or 4 times, and for each of those cases other than 0 or 4, the +\n       repeats can match different numbers of times.) When  the  remainder  of\n       the pattern is such that the entire match is going to fail, PCRE has in\n       principle to try  every  possible  variation,  and  this  can  take  an\n       extremely long time, even for relatively short strings.\n\n       An optimization catches some of the more simple cases such as\n\n         (a+)*b\n\n       where  a  literal  character  follows. Before embarking on the standard\n       matching procedure, PCRE checks that there is a \"b\" later in  the  sub-\n       ject  string, and if there is not, it fails the match immediately. How-\n       ever, when there is no following literal this  optimization  cannot  be\n       used. You can see the difference by comparing the behaviour of\n\n         (a+)*\\d\n\n       with  the  pattern  above.  The former gives a failure almost instantly\n       when applied to a whole line of  \"a\"  characters,  whereas  the  latter\n       takes an appreciable time with strings longer than about 20 characters.\n\n       In many cases, the solution to this kind of performance issue is to use\n       an atomic group or a possessive quantifier.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 25 August 2012\n       Copyright (c) 1997-2012 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCREPOSIX(3)               Library Functions Manual               PCREPOSIX(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions.\n\nSYNOPSIS\n\n       #include <pcreposix.h>\n\n       int regcomp(regex_t *preg, const char *pattern,\n            int cflags);\n\n       int regexec(regex_t *preg, const char *string,\n            size_t nmatch, regmatch_t pmatch[], int eflags);\n            size_t regerror(int errcode, const regex_t *preg,\n            char *errbuf, size_t errbuf_size);\n\n       void regfree(regex_t *preg);\n\n\nDESCRIPTION\n\n       This  set  of functions provides a POSIX-style API for the PCRE regular\n       expression 8-bit library. See the pcreapi documentation for a  descrip-\n       tion  of  PCRE's native API, which contains much additional functional-\n       ity. There is no POSIX-style  wrapper  for  PCRE's  16-bit  and  32-bit\n       library.\n\n       The functions described here are just wrapper functions that ultimately\n       call  the  PCRE  native  API.  Their  prototypes  are  defined  in  the\n       pcreposix.h  header  file,  and  on  Unix systems the library itself is\n       called pcreposix.a, so can be accessed by  adding  -lpcreposix  to  the\n       command  for  linking  an application that uses them. Because the POSIX\n       functions call the native ones, it is also necessary to add -lpcre.\n\n       I have implemented only those POSIX option bits that can be  reasonably\n       mapped  to PCRE native options. In addition, the option REG_EXTENDED is\n       defined with the value zero. This has no  effect,  but  since  programs\n       that  are  written  to  the POSIX interface often use it, this makes it\n       easier to slot in PCRE as a replacement library.  Other  POSIX  options\n       are not even defined.\n\n       There  are also some other options that are not defined by POSIX. These\n       have been added at the request of users who want to make use of certain\n       PCRE-specific features via the POSIX calling interface.\n\n       When  PCRE  is  called  via these functions, it is only the API that is\n       POSIX-like in style. The syntax and semantics of  the  regular  expres-\n       sions  themselves  are  still  those of Perl, subject to the setting of\n       various PCRE options, as described below. \"POSIX-like in  style\"  means\n       that  the  API  approximates  to  the POSIX definition; it is not fully\n       POSIX-compatible, and in multi-byte encoding  domains  it  is  probably\n       even less compatible.\n\n       The  header for these functions is supplied as pcreposix.h to avoid any\n       potential clash with other POSIX  libraries.  It  can,  of  course,  be\n       renamed or aliased as regex.h, which is the \"correct\" name. It provides\n       two structure types, regex_t for  compiled  internal  forms,  and  reg-\n       match_t  for  returning  captured substrings. It also defines some con-\n       stants whose names start  with  \"REG_\";  these  are  used  for  setting\n       options and identifying error codes.\n\n\nCOMPILING A PATTERN\n\n       The  function regcomp() is called to compile a pattern into an internal\n       form. The pattern is a C string terminated by a  binary  zero,  and  is\n       passed  in  the  argument  pattern. The preg argument is a pointer to a\n       regex_t structure that is used as a base for storing information  about\n       the compiled regular expression.\n\n       The argument cflags is either zero, or contains one or more of the bits\n       defined by the following macros:\n\n         REG_DOTALL\n\n       The PCRE_DOTALL option is set when the regular expression is passed for\n       compilation to the native function. Note that REG_DOTALL is not part of\n       the POSIX standard.\n\n         REG_ICASE\n\n       The PCRE_CASELESS option is set when the regular expression  is  passed\n       for compilation to the native function.\n\n         REG_NEWLINE\n\n       The  PCRE_MULTILINE option is set when the regular expression is passed\n       for compilation to the native function. Note that this does  not  mimic\n       the  defined  POSIX  behaviour  for REG_NEWLINE (see the following sec-\n       tion).\n\n         REG_NOSUB\n\n       The PCRE_NO_AUTO_CAPTURE option is set when the regular  expression  is\n       passed for compilation to the native function. In addition, when a pat-\n       tern that is compiled with this flag is passed to regexec() for  match-\n       ing,  the  nmatch  and  pmatch  arguments  are ignored, and no captured\n       strings are returned.\n\n         REG_UCP\n\n       The PCRE_UCP option is set when the regular expression  is  passed  for\n       compilation  to  the  native  function. This causes PCRE to use Unicode\n       properties when matchine \\d, \\w,  etc.,  instead  of  just  recognizing\n       ASCII values. Note that REG_UTF8 is not part of the POSIX standard.\n\n         REG_UNGREEDY\n\n       The  PCRE_UNGREEDY  option is set when the regular expression is passed\n       for compilation to the native function. Note that REG_UNGREEDY  is  not\n       part of the POSIX standard.\n\n         REG_UTF8\n\n       The  PCRE_UTF8  option is set when the regular expression is passed for\n       compilation to the native function. This causes the pattern itself  and\n       all  data  strings used for matching it to be treated as UTF-8 strings.\n       Note that REG_UTF8 is not part of the POSIX standard.\n\n       In the absence of these flags, no options  are  passed  to  the  native\n       function.   This  means  the  the  regex  is compiled with PCRE default\n       semantics. In particular, the way it handles newline characters in  the\n       subject  string  is  the Perl way, not the POSIX way. Note that setting\n       PCRE_MULTILINE has only some of the effects specified for  REG_NEWLINE.\n       It  does not affect the way newlines are matched by . (they are not) or\n       by a negative class such as [^a] (they are).\n\n       The yield of regcomp() is zero on success, and non-zero otherwise.  The\n       preg structure is filled in on success, and one member of the structure\n       is public: re_nsub contains the number of capturing subpatterns in  the\n       regular expression. Various error codes are defined in the header file.\n\n       NOTE:  If  the  yield of regcomp() is non-zero, you must not attempt to\n       use the contents of the preg structure. If, for example, you pass it to\n       regexec(), the result is undefined and your program is likely to crash.\n\n\nMATCHING NEWLINE CHARACTERS\n\n       This area is not simple, because POSIX and Perl take different views of\n       things.  It is not possible to get PCRE to obey  POSIX  semantics,  but\n       then  PCRE was never intended to be a POSIX engine. The following table\n       lists the different possibilities for matching  newline  characters  in\n       PCRE:\n\n                                 Default   Change with\n\n         . matches newline          no     PCRE_DOTALL\n         newline matches [^a]       yes    not changeable\n         $ matches \\n at end        yes    PCRE_DOLLARENDONLY\n         $ matches \\n in middle     no     PCRE_MULTILINE\n         ^ matches \\n in middle     no     PCRE_MULTILINE\n\n       This is the equivalent table for POSIX:\n\n                                 Default   Change with\n\n         . matches newline          yes    REG_NEWLINE\n         newline matches [^a]       yes    REG_NEWLINE\n         $ matches \\n at end        no     REG_NEWLINE\n         $ matches \\n in middle     no     REG_NEWLINE\n         ^ matches \\n in middle     no     REG_NEWLINE\n\n       PCRE's behaviour is the same as Perl's, except that there is no equiva-\n       lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl,  there  is\n       no way to stop newline from matching [^a].\n\n       The   default  POSIX  newline  handling  can  be  obtained  by  setting\n       PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to  make  PCRE\n       behave exactly as for the REG_NEWLINE action.\n\n\nMATCHING A PATTERN\n\n       The  function  regexec()  is  called  to  match a compiled pattern preg\n       against a given string, which is by default terminated by a  zero  byte\n       (but  see  REG_STARTEND below), subject to the options in eflags. These\n       can be:\n\n         REG_NOTBOL\n\n       The PCRE_NOTBOL option is set when calling the underlying PCRE matching\n       function.\n\n         REG_NOTEMPTY\n\n       The PCRE_NOTEMPTY option is set when calling the underlying PCRE match-\n       ing function. Note that REG_NOTEMPTY is not part of the POSIX standard.\n       However, setting this option can give more POSIX-like behaviour in some\n       situations.\n\n         REG_NOTEOL\n\n       The PCRE_NOTEOL option is set when calling the underlying PCRE matching\n       function.\n\n         REG_STARTEND\n\n       The  string  is  considered to start at string + pmatch[0].rm_so and to\n       have a terminating NUL located at string + pmatch[0].rm_eo (there  need\n       not  actually  be  a  NUL at that location), regardless of the value of\n       nmatch. This is a BSD extension, compatible with but not  specified  by\n       IEEE  Standard  1003.2  (POSIX.2),  and  should be used with caution in\n       software intended to be portable to other systems. Note that a non-zero\n       rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location\n       of the string, not how it is matched.\n\n       If the pattern was compiled with the REG_NOSUB flag, no data about  any\n       matched  strings  is  returned.  The  nmatch  and  pmatch  arguments of\n       regexec() are ignored.\n\n       If the value of nmatch is zero, or if the value pmatch is NULL, no data\n       about any matched strings is returned.\n\n       Otherwise,the portion of the string that was matched, and also any cap-\n       tured substrings, are returned via the pmatch argument, which points to\n       an  array  of nmatch structures of type regmatch_t, containing the mem-\n       bers rm_so and rm_eo. These contain the offset to the  first  character\n       of  each  substring and the offset to the first character after the end\n       of each substring, respectively. The 0th element of the vector  relates\n       to  the  entire portion of string that was matched; subsequent elements\n       relate to the capturing subpatterns of the regular  expression.  Unused\n       entries in the array have both structure members set to -1.\n\n       A  successful  match  yields  a  zero  return;  various error codes are\n       defined in the header file, of  which  REG_NOMATCH  is  the  \"expected\"\n       failure code.\n\n\nERROR MESSAGES\n\n       The regerror() function maps a non-zero errorcode from either regcomp()\n       or regexec() to a printable message. If preg is  not  NULL,  the  error\n       should have arisen from the use of that structure. A message terminated\n       by a binary zero is placed  in  errbuf.  The  length  of  the  message,\n       including  the  zero, is limited to errbuf_size. The yield of the func-\n       tion is the size of buffer needed to hold the whole message.\n\n\nMEMORY USAGE\n\n       Compiling a regular expression causes memory to be allocated and  asso-\n       ciated  with  the preg structure. The function regfree() frees all such\n       memory, after which preg may no longer be used as  a  compiled  expres-\n       sion.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 09 January 2012\n       Copyright (c) 1997-2012 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRECPP(3)                 Library Functions Manual                 PCRECPP(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions.\n\nSYNOPSIS OF C++ WRAPPER\n\n       #include <pcrecpp.h>\n\n\nDESCRIPTION\n\n       The  C++  wrapper  for PCRE was provided by Google Inc. Some additional\n       functionality was added by Giuseppe Maxia. This brief man page was con-\n       structed  from  the  notes  in the pcrecpp.h file, which should be con-\n       sulted for further details. Note that the C++ wrapper supports only the\n       original  8-bit  PCRE  library. There is no 16-bit or 32-bit support at\n       present.\n\n\nMATCHING INTERFACE\n\n       The \"FullMatch\" operation checks that supplied text matches a  supplied\n       pattern  exactly.  If pointer arguments are supplied, it copies matched\n       sub-strings that match sub-patterns into them.\n\n         Example: successful match\n            pcrecpp::RE re(\"h.*o\");\n            re.FullMatch(\"hello\");\n\n         Example: unsuccessful match (requires full match):\n            pcrecpp::RE re(\"e\");\n            !re.FullMatch(\"hello\");\n\n         Example: creating a temporary RE object:\n            pcrecpp::RE(\"h.*o\").FullMatch(\"hello\");\n\n       You can pass in a \"const char*\" or a \"string\" for \"text\". The  examples\n       below  tend to use a const char*. You can, as in the different examples\n       above, store the RE object explicitly in a variable or use a  temporary\n       RE  object.  The  examples below use one mode or the other arbitrarily.\n       Either could correctly be used for any of these examples.\n\n       You must supply extra pointer arguments to extract matched subpieces.\n\n         Example: extracts \"ruby\" into \"s\" and 1234 into \"i\"\n            int i;\n            string s;\n            pcrecpp::RE re(\"(\\\\w+):(\\\\d+)\");\n            re.FullMatch(\"ruby:1234\", &s, &i);\n\n         Example: does not try to extract any extra sub-patterns\n            re.FullMatch(\"ruby:1234\", &s);\n\n         Example: does not try to extract into NULL\n            re.FullMatch(\"ruby:1234\", NULL, &i);\n\n         Example: integer overflow causes failure\n            !re.FullMatch(\"ruby:1234567891234\", NULL, &i);\n\n         Example: fails because there aren't enough sub-patterns:\n            !pcrecpp::RE(\"\\\\w+:\\\\d+\").FullMatch(\"ruby:1234\", &s);\n\n         Example: fails because string cannot be stored in integer\n            !pcrecpp::RE(\"(.*)\").FullMatch(\"ruby\", &i);\n\n       The provided pointer arguments can be pointers to  any  scalar  numeric\n       type, or one of:\n\n          string        (matched piece is copied to string)\n          StringPiece   (StringPiece is mutated to point to matched piece)\n          T             (where \"bool T::ParseFrom(const char*, int)\" exists)\n          NULL          (the corresponding matched sub-pattern is not copied)\n\n       The  function returns true iff all of the following conditions are sat-\n       isfied:\n\n         a. \"text\" matches \"pattern\" exactly;\n\n         b. The number of matched sub-patterns is >= number of supplied\n            pointers;\n\n         c. The \"i\"th argument has a suitable type for holding the\n            string captured as the \"i\"th sub-pattern. If you pass in\n            void * NULL for the \"i\"th argument, or a non-void * NULL\n            of the correct type, or pass fewer arguments than the\n            number of sub-patterns, \"i\"th captured sub-pattern is\n            ignored.\n\n       CAVEAT: An optional sub-pattern that does  not  exist  in  the  matched\n       string  is  assigned  the  empty  string. Therefore, the following will\n       return false (because the empty string is not a valid number):\n\n          int number;\n          pcrecpp::RE::FullMatch(\"abc\", \"[a-z]+(\\\\d+)?\", &number);\n\n       The matching interface supports at most 16 arguments per call.  If  you\n       need    more,    consider    using    the    more   general   interface\n       pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch.\n\n       NOTE: Do not use no_arg, which is used internally to mark the end of  a\n       list  of optional arguments, as a placeholder for missing arguments, as\n       this can lead to segfaults.\n\n\nQUOTING METACHARACTERS\n\n       You can use the \"QuoteMeta\" operation to insert backslashes before  all\n       potentially  meaningful  characters  in  a string. The returned string,\n       used as a regular expression, will exactly match the original string.\n\n         Example:\n            string quoted = RE::QuoteMeta(unquoted);\n\n       Note that it's legal to escape a character even if it  has  no  special\n       meaning  in  a  regular expression -- so this function does that. (This\n       also makes it identical to the perl function  of  the  same  name;  see\n       \"perldoc    -f    quotemeta\".)    For   example,   \"1.5-2.0?\"   becomes\n       \"1\\.5\\-2\\.0\\?\".\n\n\nPARTIAL MATCHES\n\n       You can use the \"PartialMatch\" operation when you want the  pattern  to\n       match any substring of the text.\n\n         Example: simple search for a string:\n            pcrecpp::RE(\"ell\").PartialMatch(\"hello\");\n\n         Example: find first number in a string:\n            int number;\n            pcrecpp::RE re(\"(\\\\d+)\");\n            re.PartialMatch(\"x*100 + 20\", &number);\n            assert(number == 100);\n\n\nUTF-8 AND THE MATCHING INTERFACE\n\n       By  default,  pattern  and text are plain text, one byte per character.\n       The UTF8 flag, passed to  the  constructor,  causes  both  pattern  and\n       string to be treated as UTF-8 text, still a byte stream but potentially\n       multiple bytes per character. In practice, the text is likelier  to  be\n       UTF-8  than  the pattern, but the match returned may depend on the UTF8\n       flag, so always use it when matching UTF8 text. For example,  \".\"  will\n       match  one  byte normally but with UTF8 set may match up to three bytes\n       of a multi-byte character.\n\n         Example:\n            pcrecpp::RE_Options options;\n            options.set_utf8();\n            pcrecpp::RE re(utf8_pattern, options);\n            re.FullMatch(utf8_string);\n\n         Example: using the convenience function UTF8():\n            pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());\n            re.FullMatch(utf8_string);\n\n       NOTE: The UTF8 flag is ignored if pcre was not configured with the\n             --enable-utf8 flag.\n\n\nPASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE\n\n       PCRE defines some modifiers to  change  the  behavior  of  the  regular\n       expression   engine.  The  C++  wrapper  defines  an  auxiliary  class,\n       RE_Options, as a vehicle to pass such modifiers to  a  RE  class.  Cur-\n       rently, the following modifiers are supported:\n\n          modifier              description               Perl corresponding\n\n          PCRE_CASELESS         case insensitive match      /i\n          PCRE_MULTILINE        multiple lines match        /m\n          PCRE_DOTALL           dot matches newlines        /s\n          PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A\n          PCRE_EXTRA            strict escape parsing       N/A\n          PCRE_EXTENDED         ignore white spaces         /x\n          PCRE_UTF8             handles UTF8 chars          built-in\n          PCRE_UNGREEDY         reverses * and *?           N/A\n          PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)\n\n       (*)  Both Perl and PCRE allow non capturing parentheses by means of the\n       \"?:\" modifier within the pattern itself. e.g. (?:ab|cd) does  not  cap-\n       ture, while (ab|cd) does.\n\n       For  a  full  account on how each modifier works, please check the PCRE\n       API reference page.\n\n       For each modifier, there are two member functions whose  name  is  made\n       out  of  the  modifier  in  lowercase,  without the \"PCRE_\" prefix. For\n       instance, PCRE_CASELESS is handled by\n\n         bool caseless()\n\n       which returns true if the modifier is set, and\n\n         RE_Options & set_caseless(bool)\n\n       which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can\n       be  accessed  through  the  set_match_limit()  and match_limit() member\n       functions. Setting match_limit to a non-zero value will limit the  exe-\n       cution  of pcre to keep it from doing bad things like blowing the stack\n       or taking an eternity to return a result.  A  value  of  5000  is  good\n       enough  to stop stack blowup in a 2MB thread stack. Setting match_limit\n       to  zero  disables  match  limiting.  Alternatively,   you   can   call\n       match_limit_recursion()  which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to\n       limit how much  PCRE  recurses.  match_limit()  limits  the  number  of\n       matches PCRE does; match_limit_recursion() limits the depth of internal\n       recursion, and therefore the amount of stack that is used.\n\n       Normally, to pass one or more modifiers to a RE class,  you  declare  a\n       RE_Options object, set the appropriate options, and pass this object to\n       a RE constructor. Example:\n\n          RE_Options opt;\n          opt.set_caseless(true);\n          if (RE(\"HELLO\", opt).PartialMatch(\"hello world\")) ...\n\n       RE_options has two constructors. The default constructor takes no argu-\n       ments  and creates a set of flags that are off by default. The optional\n       parameter option_flags is to facilitate transfer of legacy code from  C\n       programs.  This lets you do\n\n          RE(pattern,\n            RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);\n\n       However, new code is better off doing\n\n          RE(pattern,\n            RE_Options().set_caseless(true).set_multiline(true))\n              .PartialMatch(str);\n\n       If you are going to pass one of the most used modifiers, there are some\n       convenience functions that return a RE_Options class with the appropri-\n       ate  modifier  already  set: CASELESS(), UTF8(), MULTILINE(), DOTALL(),\n       and EXTENDED().\n\n       If you need to set several options at once, and you don't  want  to  go\n       through  the pains of declaring a RE_Options object and setting several\n       options, there is a parallel method that give you such ability  on  the\n       fly.  You  can  concatenate several set_xxxxx() member functions, since\n       each of them returns a reference to its class object. For  example,  to\n       pass  PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one\n       statement, you may write:\n\n          RE(\" ^ xyz \\\\s+ .* blah$\",\n            RE_Options()\n              .set_caseless(true)\n              .set_extended(true)\n              .set_multiline(true)).PartialMatch(sometext);\n\n\nSCANNING TEXT INCREMENTALLY\n\n       The \"Consume\" operation may be useful if you want to  repeatedly  match\n       regular expressions at the front of a string and skip over them as they\n       match. This requires use of the \"StringPiece\" type, which represents  a\n       sub-range  of  a  real  string.  Like RE, StringPiece is defined in the\n       pcrecpp namespace.\n\n         Example: read lines of the form \"var = value\" from a string.\n            string contents = ...;                 // Fill string somehow\n            pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece\n\n            string var;\n            int value;\n            pcrecpp::RE re(\"(\\\\w+) = (\\\\d+)\\n\");\n            while (re.Consume(&input, &var, &value)) {\n              ...;\n            }\n\n       Each successful call  to  \"Consume\"  will  set  \"var/value\",  and  also\n       advance \"input\" so it points past the matched text.\n\n       The  \"FindAndConsume\"  operation  is  similar to \"Consume\" but does not\n       anchor your match at the beginning of  the  string.  For  example,  you\n       could extract all words from a string by repeatedly calling\n\n         pcrecpp::RE(\"(\\\\w+)\").FindAndConsume(&input, &word)\n\n\nPARSING HEX/OCTAL/C-RADIX NUMBERS\n\n       By default, if you pass a pointer to a numeric value, the corresponding\n       text is interpreted as a base-10  number.  You  can  instead  wrap  the\n       pointer with a call to one of the operators Hex(), Octal(), or CRadix()\n       to interpret the text in another base. The CRadix  operator  interprets\n       C-style  \"0\"  (base-8)  and  \"0x\"  (base-16)  prefixes, but defaults to\n       base-10.\n\n         Example:\n           int a, b, c, d;\n           pcrecpp::RE re(\"(.*) (.*) (.*) (.*)\");\n           re.FullMatch(\"100 40 0100 0x40\",\n                        pcrecpp::Octal(&a), pcrecpp::Hex(&b),\n                        pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));\n\n       will leave 64 in a, b, c, and d.\n\n\nREPLACING PARTS OF STRINGS\n\n       You can replace the first match of \"pattern\" in \"str\"  with  \"rewrite\".\n       Within  \"rewrite\",  backslash-escaped  digits (\\1 to \\9) can be used to\n       insert text matching corresponding parenthesized group  from  the  pat-\n       tern. \\0 in \"rewrite\" refers to the entire matching text. For example:\n\n         string s = \"yabba dabba doo\";\n         pcrecpp::RE(\"b+\").Replace(\"d\", &s);\n\n       will  leave  \"s\" containing \"yada dabba doo\". The result is true if the\n       pattern matches and a replacement occurs, false otherwise.\n\n       GlobalReplace is like Replace except that it replaces  all  occurrences\n       of  the  pattern  in  the string with the rewrite. Replacements are not\n       subject to re-matching. For example:\n\n         string s = \"yabba dabba doo\";\n         pcrecpp::RE(\"b+\").GlobalReplace(\"d\", &s);\n\n       will leave \"s\" containing \"yada dada doo\". It  returns  the  number  of\n       replacements made.\n\n       Extract  is like Replace, except that if the pattern matches, \"rewrite\"\n       is copied into \"out\" (an additional argument) with substitutions.   The\n       non-matching  portions  of \"text\" are ignored. Returns true iff a match\n       occurred and the extraction happened successfully;  if no match occurs,\n       the string is left unaffected.\n\n\nAUTHOR\n\n       The C++ wrapper was contributed by Google Inc.\n       Copyright (c) 2007 Google Inc.\n\n\nREVISION\n\n       Last updated: 08 January 2012\n------------------------------------------------------------------------------\n\n\nPCRESAMPLE(3)              Library Functions Manual              PCRESAMPLE(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE SAMPLE PROGRAM\n\n       A simple, complete demonstration program, to get you started with using\n       PCRE, is supplied in the file pcredemo.c in the  PCRE  distribution.  A\n       listing  of this program is given in the pcredemo documentation. If you\n       do not have a copy of the PCRE distribution, you can save this  listing\n       to re-create pcredemo.c.\n\n       The  demonstration program, which uses the original PCRE 8-bit library,\n       compiles the regular expression that is its first argument, and matches\n       it  against  the subject string in its second argument. No PCRE options\n       are set, and default character tables are used. If  matching  succeeds,\n       the  program  outputs the portion of the subject that matched, together\n       with the contents of any captured substrings.\n\n       If the -g option is given on the command line, the program then goes on\n       to check for further matches of the same regular expression in the same\n       subject string. The logic is a little bit tricky because of the  possi-\n       bility  of  matching an empty string. Comments in the code explain what\n       is going on.\n\n       If PCRE is installed in the standard include  and  library  directories\n       for your operating system, you should be able to compile the demonstra-\n       tion program using this command:\n\n         gcc -o pcredemo pcredemo.c -lpcre\n\n       If PCRE is installed elsewhere, you may need to add additional  options\n       to  the  command line. For example, on a Unix-like system that has PCRE\n       installed in /usr/local, you  can  compile  the  demonstration  program\n       using a command like this:\n\n         gcc -o pcredemo -I/usr/local/include pcredemo.c \\\n             -L/usr/local/lib -lpcre\n\n       In  a  Windows  environment, if you want to statically link the program\n       against a non-dll pcre.a file, you must uncomment the line that defines\n       PCRE_STATIC  before  including  pcre.h, because otherwise the pcre_mal-\n       loc()   and   pcre_free()   exported   functions   will   be   declared\n       __declspec(dllimport), with unwanted results.\n\n       Once  you  have  compiled and linked the demonstration program, you can\n       run simple tests like this:\n\n         ./pcredemo 'cat|dog' 'the cat sat on the mat'\n         ./pcredemo -g 'cat|dog' 'the dog sat on the cat'\n\n       Note that there is a  much  more  comprehensive  test  program,  called\n       pcretest,  which  supports  many  more  facilities  for testing regular\n       expressions and both PCRE libraries. The pcredemo program  is  provided\n       as a simple coding example.\n\n       If  you  try to run pcredemo when PCRE is not installed in the standard\n       library directory, you may get an error like  this  on  some  operating\n       systems (e.g. Solaris):\n\n         ld.so.1:  a.out:  fatal:  libpcre.so.0:  open failed: No such file or\n       directory\n\n       This is caused by the way shared library support works  on  those  sys-\n       tems. You need to add\n\n         -R/usr/local/lib\n\n       (for example) to the compile command to get round this problem.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 10 January 2012\n       Copyright (c) 1997-2012 University of Cambridge.\n------------------------------------------------------------------------------\nPCRELIMITS(3)              Library Functions Manual              PCRELIMITS(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nSIZE AND OTHER LIMITATIONS\n\n       There  are some size limitations in PCRE but it is hoped that they will\n       never in practice be relevant.\n\n       The maximum length of a compiled  pattern  is  approximately  64K  data\n       units  (bytes  for  the  8-bit  library,  16-bit  units  for the 16-bit\n       library, and 32-bit units for the 32-bit library) if PCRE  is  compiled\n       with  the default internal linkage size, which is 2 bytes for the 8-bit\n       and 16-bit libraries, and 4 bytes for the 32-bit library. If  you  want\n       to process regular expressions that are truly enormous, you can compile\n       PCRE with an internal linkage size of 3 or 4 (when building the  16-bit\n       or  32-bit  library,  3 is rounded up to 4). See the README file in the\n       source distribution and the pcrebuild  documentation  for  details.  In\n       these  cases  the limit is substantially larger.  However, the speed of\n       execution is slower.\n\n       All values in repeating quantifiers must be less than 65536.\n\n       There is no limit to the number of parenthesized subpatterns, but there\n       can  be  no more than 65535 capturing subpatterns. There is, however, a\n       limit to the depth of  nesting  of  parenthesized  subpatterns  of  all\n       kinds.  This  is  imposed  in order to limit the amount of system stack\n       used at compile time. The limit can be specified when  PCRE  is  built;\n       the default is 250.\n\n       There is a limit to the number of forward references to subsequent sub-\n       patterns of around 200,000.  Repeated  forward  references  with  fixed\n       upper  limits,  for example, (?2){0,100} when subpattern number 2 is to\n       the right, are included in the count. There is no limit to  the  number\n       of backward references.\n\n       The maximum length of name for a named subpattern is 32 characters, and\n       the maximum number of named subpatterns is 10000.\n\n       The maximum length of a  name  in  a  (*MARK),  (*PRUNE),  (*SKIP),  or\n       (*THEN)  verb is 255 for the 8-bit library and 65535 for the 16-bit and\n       32-bit libraries.\n\n       The maximum length of a subject string is the largest  positive  number\n       that  an integer variable can hold. However, when using the traditional\n       matching function, PCRE uses recursion to handle subpatterns and indef-\n       inite  repetition.  This means that the available stack space may limit\n       the size of a subject string that can be processed by certain patterns.\n       For a discussion of stack issues, see the pcrestack documentation.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 05 November 2013\n       Copyright (c) 1997-2013 University of Cambridge.\n------------------------------------------------------------------------------\n\n\nPCRESTACK(3)               Library Functions Manual               PCRESTACK(3)\n\n\n\nNAME\n       PCRE - Perl-compatible regular expressions\n\nPCRE DISCUSSION OF STACK USAGE\n\n       When  you call pcre[16|32]_exec(), it makes use of an internal function\n       called match(). This calls itself recursively at branch points  in  the\n       pattern,  in  order  to  remember the state of the match so that it can\n       back up and try a different alternative if  the  first  one  fails.  As\n       matching proceeds deeper and deeper into the tree of possibilities, the\n       recursion depth increases. The match() function is also called in other\n       circumstances,  for  example,  whenever  a parenthesized sub-pattern is\n       entered, and in certain cases of repetition.\n\n       Not all calls of match() increase the recursion depth; for an item such\n       as  a* it may be called several times at the same level, after matching\n       different numbers of a's. Furthermore, in a number of cases  where  the\n       result  of  the  recursive call would immediately be passed back as the\n       result of the current call (a \"tail recursion\"), the function  is  just\n       restarted instead.\n\n       The  above  comments apply when pcre[16|32]_exec() is run in its normal\n       interpretive  manner.   If   the   pattern   was   studied   with   the\n       PCRE_STUDY_JIT_COMPILE  option, and just-in-time compiling was success-\n       ful, and the options passed to pcre[16|32]_exec() were  not  incompati-\n       ble,  the  matching  process  uses the JIT-compiled code instead of the\n       match() function. In this case, the  memory  requirements  are  handled\n       entirely differently. See the pcrejit documentation for details.\n\n       The  pcre[16|32]_dfa_exec()  function operates in an entirely different\n       way, and uses recursion only when there is a regular expression  recur-\n       sion or subroutine call in the pattern. This includes the processing of\n       assertion and \"once-only\" subpatterns, which are handled  like  subrou-\n       tine  calls.  Normally, these are never very deep, and the limit on the\n       complexity of pcre[16|32]_dfa_exec() is controlled  by  the  amount  of\n       workspace  it is given.  However, it is possible to write patterns with\n       runaway    infinite    recursions;    such    patterns    will    cause\n       pcre[16|32]_dfa_exec()  to  run  out  of stack. At present, there is no\n       protection against this.\n\n       The comments that follow do NOT apply to  pcre[16|32]_dfa_exec();  they\n       are relevant only for pcre[16|32]_exec() without the JIT optimization.\n\n   Reducing pcre[16|32]_exec()'s stack usage\n\n       Each  time  that match() is actually called recursively, it uses memory\n       from the process stack. For certain kinds of  pattern  and  data,  very\n       large  amounts of stack may be needed, despite the recognition of \"tail\n       recursion\".  You can often reduce the amount of recursion,  and  there-\n       fore  the  amount of stack used, by modifying the pattern that is being\n       matched. Consider, for example, this pattern:\n\n         ([^<]|<(?!inet))+\n\n       It matches from wherever it starts until it encounters \"<inet\"  or  the\n       end  of  the  data,  and is the kind of pattern that might be used when\n       processing an XML file. Each iteration of the outer parentheses matches\n       either  one  character that is not \"<\" or a \"<\" that is not followed by\n       \"inet\". However, each time a  parenthesis  is  processed,  a  recursion\n       occurs, so this formulation uses a stack frame for each matched charac-\n       ter. For a long string, a lot of stack is required. Consider  now  this\n       rewritten pattern, which matches exactly the same strings:\n\n         ([^<]++|<(?!inet))+\n\n       This  uses very much less stack, because runs of characters that do not\n       contain \"<\" are \"swallowed\" in one item inside the parentheses.  Recur-\n       sion  happens  only when a \"<\" character that is not followed by \"inet\"\n       is encountered (and we assume this is relatively  rare).  A  possessive\n       quantifier  is  used  to stop any backtracking into the runs of non-\"<\"\n       characters, but that is not related to stack usage.\n\n       This example shows that one way of avoiding stack problems when  match-\n       ing long subject strings is to write repeated parenthesized subpatterns\n       to match more than one character whenever possible.\n\n   Compiling PCRE to use heap instead of stack for pcre[16|32]_exec()\n\n       In environments where stack memory is constrained, you  might  want  to\n       compile  PCRE to use heap memory instead of stack for remembering back-\n       up points when pcre[16|32]_exec() is running. This makes it run  a  lot\n       more slowly, however.  Details of how to do this are given in the pcre-\n       build documentation. When built in  this  way,  instead  of  using  the\n       stack,  PCRE obtains and frees memory by calling the functions that are\n       pointed to by the pcre[16|32]_stack_malloc  and  pcre[16|32]_stack_free\n       variables.  By default, these point to malloc() and free(), but you can\n       replace the pointers to cause PCRE to use your own functions. Since the\n       block sizes are always the same, and are always freed in reverse order,\n       it may be possible to implement customized  memory  handlers  that  are\n       more efficient than the standard functions.\n\n   Limiting pcre[16|32]_exec()'s stack usage\n\n       You  can set limits on the number of times that match() is called, both\n       in total and recursively. If a limit  is  exceeded,  pcre[16|32]_exec()\n       returns  an  error code. Setting suitable limits should prevent it from\n       running out of stack. The default values of the limits are very  large,\n       and  unlikely  ever to operate. They can be changed when PCRE is built,\n       and they can also be set when pcre[16|32]_exec() is called. For details\n       of these interfaces, see the pcrebuild documentation and the section on\n       extra data for pcre[16|32]_exec() in the pcreapi documentation.\n\n       As a very rough rule of thumb, you should reckon on about 500 bytes per\n       recursion.  Thus,  if  you  want  to limit your stack usage to 8Mb, you\n       should set the limit at 16000 recursions. A 64Mb stack,  on  the  other\n       hand, can support around 128000 recursions.\n\n       In Unix-like environments, the pcretest test program has a command line\n       option (-S) that can be used to increase the size of its stack. As long\n       as  the  stack is large enough, another option (-M) can be used to find\n       the smallest limits that allow a particular pattern to  match  a  given\n       subject  string.  This is done by calling pcre[16|32]_exec() repeatedly\n       with different limits.\n\n   Obtaining an estimate of stack usage\n\n       The actual amount of stack used per recursion can  vary  quite  a  lot,\n       depending on the compiler that was used to build PCRE and the optimiza-\n       tion or debugging options that were set for it. The rule of thumb value\n       of  500  bytes  mentioned  above  may be larger or smaller than what is\n       actually needed. A better approximation can be obtained by running this\n       command:\n\n         pcretest -m -C\n\n       The  -C  option causes pcretest to output information about the options\n       with which PCRE was compiled. When -m is also given (before -C), infor-\n       mation about stack use is given in a line like this:\n\n         Match recursion uses stack: approximate frame size = 640 bytes\n\n       The value is approximate because some recursions need a bit more (up to\n       perhaps 16 more bytes).\n\n       If the above command is given when PCRE is compiled  to  use  the  heap\n       instead  of  the  stack  for recursion, the value that is output is the\n       size of each block that is obtained from the heap.\n\n   Changing stack size in Unix-like systems\n\n       In Unix-like environments, there is not often a problem with the  stack\n       unless  very  long  strings  are  involved, though the default limit on\n       stack size varies from system to system. Values from 8Mb  to  64Mb  are\n       common. You can find your default limit by running the command:\n\n         ulimit -s\n\n       Unfortunately,  the  effect  of  running out of stack is often SIGSEGV,\n       though sometimes a more explicit error message is given. You  can  nor-\n       mally increase the limit on stack size by code such as this:\n\n         struct rlimit rlim;\n         getrlimit(RLIMIT_STACK, &rlim);\n         rlim.rlim_cur = 100*1024*1024;\n         setrlimit(RLIMIT_STACK, &rlim);\n\n       This  reads  the current limits (soft and hard) using getrlimit(), then\n       attempts to increase the soft limit to  100Mb  using  setrlimit().  You\n       must do this before calling pcre[16|32]_exec().\n\n   Changing stack size in Mac OS X\n\n       Using setrlimit(), as described above, should also work on Mac OS X. It\n       is also possible to set a stack size when linking a program. There is a\n       discussion   about   stack  sizes  in  Mac  OS  X  at  this  web  site:\n       http://developer.apple.com/qa/qa2005/qa1419.html.\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 24 June 2012\n       Copyright (c) 1997-2012 University of Cambridge.\n------------------------------------------------------------------------------\n\n\n"
  },
  {
    "path": "src/pcre/doc/pcre16.3",
    "content": ".TH PCRE 3 \"12 May 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.sp\n.B #include <pcre.h>\n.\n.\n.SH \"PCRE 16-BIT API BASIC FUNCTIONS\"\n.rs\n.sp\n.nf\n.B pcre16 *pcre16_compile(PCRE_SPTR16 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre16 *pcre16_compile2(PCRE_SPTR16 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre16_extra *pcre16_study(const pcre16 *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.sp\n.B void pcre16_free_study(pcre16_extra *\\fIextra\\fP);\n.sp\n.B int pcre16_exec(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.sp\n.B int pcre16_dfa_exec(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.fi\n.\n.\n.SH \"PCRE 16-BIT API STRING EXTRACTION FUNCTIONS\"\n.rs\n.sp\n.nf\n.B int pcre16_copy_named_substring(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR16 \\fIstringname\\fP,\"\n.B \"     PCRE_UCHAR16 *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre16_copy_substring(PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, PCRE_UCHAR16 *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre16_get_named_substring(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR16 \\fIstringname\\fP,\"\n.B \"     PCRE_SPTR16 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre16_get_stringnumber(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIname\\fP);\n.sp\n.B int pcre16_get_stringtable_entries(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIname\\fP, PCRE_UCHAR16 **\\fIfirst\\fP, PCRE_UCHAR16 **\\fIlast\\fP);\"\n.sp\n.B int pcre16_get_substring(PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     PCRE_SPTR16 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre16_get_substring_list(PCRE_SPTR16 \\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, PCRE_SPTR16 **\\fIlistptr\\fP);\"\n.sp\n.B void pcre16_free_substring(PCRE_SPTR16 \\fIstringptr\\fP);\n.sp\n.B void pcre16_free_substring_list(PCRE_SPTR16 *\\fIstringptr\\fP);\n.fi\n.\n.\n.SH \"PCRE 16-BIT API AUXILIARY FUNCTIONS\"\n.rs\n.sp\n.nf\n.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \\fIstartsize\\fP, int \\fImaxsize\\fP);\n.sp\n.B void pcre16_jit_stack_free(pcre16_jit_stack *\\fIstack\\fP);\n.sp\n.B void pcre16_assign_jit_stack(pcre16_extra *\\fIextra\\fP,\n.B \"     pcre16_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.sp\n.B const unsigned char *pcre16_maketables(void);\n.sp\n.B int pcre16_fullinfo(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.sp\n.B int pcre16_refcount(pcre16 *\\fIcode\\fP, int \\fIadjust\\fP);\n.sp\n.B int pcre16_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.sp\n.B const char *pcre16_version(void);\n.sp\n.B int pcre16_pattern_to_host_byte_order(pcre16 *\\fIcode\\fP,\n.B \"     pcre16_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.fi\n.\n.\n.SH \"PCRE 16-BIT API INDIRECTED FUNCTIONS\"\n.rs\n.sp\n.nf\n.B void *(*pcre16_malloc)(size_t);\n.sp\n.B void (*pcre16_free)(void *);\n.sp\n.B void *(*pcre16_stack_malloc)(size_t);\n.sp\n.B void (*pcre16_stack_free)(void *);\n.sp\n.B int (*pcre16_callout)(pcre16_callout_block *);\n.fi\n.\n.\n.SH \"PCRE 16-BIT API 16-BIT-ONLY FUNCTION\"\n.rs\n.sp\n.nf\n.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\\fIoutput\\fP,\n.B \"     PCRE_SPTR16 \\fIinput\\fP, int \\fIlength\\fP, int *\\fIbyte_order\\fP,\"\n.B \"     int \\fIkeep_boms\\fP);\"\n.fi\n.\n.\n.SH \"THE PCRE 16-BIT LIBRARY\"\n.rs\n.sp\nStarting with release 8.30, it is possible to compile a PCRE library that\nsupports 16-bit character strings, including UTF-16 strings, as well as or\ninstead of the original 8-bit library. The majority of the work to make this\npossible was done by Zoltan Herczeg. The two libraries contain identical sets\nof functions, used in exactly the same way. Only the names of the functions and\nthe data types of their arguments and results are different. To avoid\nover-complication and reduce the documentation maintenance load, most of the\nPCRE documentation describes the 8-bit library, with only occasional references\nto the 16-bit library. This page describes what is different when you use the\n16-bit library.\n.P\nWARNING: A single application can be linked with both libraries, but you must\ntake care when processing any particular pattern to use functions from just one\nlibrary. For example, if you want to study a pattern that was compiled with\n\\fBpcre16_compile()\\fP, you must do so with \\fBpcre16_study()\\fP, not\n\\fBpcre_study()\\fP, and you must free the study data with\n\\fBpcre16_free_study()\\fP.\n.\n.\n.SH \"THE HEADER FILE\"\n.rs\n.sp\nThere is only one header file, \\fBpcre.h\\fP. It contains prototypes for all the\nfunctions in all libraries, as well as definitions of flags, structures, error\ncodes, etc.\n.\n.\n.SH \"THE LIBRARY NAME\"\n.rs\n.sp\nIn Unix-like systems, the 16-bit library is called \\fBlibpcre16\\fP, and can\nnormally be accesss by adding \\fB-lpcre16\\fP to the command for linking an\napplication that uses PCRE.\n.\n.\n.SH \"STRING TYPES\"\n.rs\n.sp\nIn the 8-bit library, strings are passed to PCRE library functions as vectors\nof bytes with the C type \"char *\". In the 16-bit library, strings are passed as\nvectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an\nappropriate data type, and PCRE_SPTR16 is defined as \"const PCRE_UCHAR16 *\". In\nvery many environments, \"short int\" is a 16-bit data type. When PCRE is built,\nit defines PCRE_UCHAR16 as \"unsigned short int\", but checks that it really is a\n16-bit data type. If it is not, the build fails with an error message telling\nthe maintainer to modify the definition appropriately.\n.\n.\n.SH \"STRUCTURE TYPES\"\n.rs\n.sp\nThe types of the opaque structures that are used for compiled 16-bit patterns\nand JIT stacks are \\fBpcre16\\fP and \\fBpcre16_jit_stack\\fP respectively. The\ntype of the user-accessible structure that is returned by \\fBpcre16_study()\\fP\nis \\fBpcre16_extra\\fP, and the type of the structure that is used for passing\ndata to a callout function is \\fBpcre16_callout_block\\fP. These structures\ncontain the same fields, with the same names, as their 8-bit counterparts. The\nonly difference is that pointers to character strings are 16-bit instead of\n8-bit types.\n.\n.\n.SH \"16-BIT FUNCTIONS\"\n.rs\n.sp\nFor every function in the 8-bit library there is a corresponding function in\nthe 16-bit library with a name that starts with \\fBpcre16_\\fP instead of\n\\fBpcre_\\fP. The prototypes are listed above. In addition, there is one extra\nfunction, \\fBpcre16_utf16_to_host_byte_order()\\fP. This is a utility function\nthat converts a UTF-16 character string to host byte order if necessary. The\nother 16-bit functions expect the strings they are passed to be in host byte\norder.\n.P\nThe \\fIinput\\fP and \\fIoutput\\fP arguments of\n\\fBpcre16_utf16_to_host_byte_order()\\fP may point to the same address, that is,\nconversion in place is supported. The output buffer must be at least as long as\nthe input.\n.P\nThe \\fIlength\\fP argument specifies the number of 16-bit data units in the\ninput string; a negative value specifies a zero-terminated string.\n.P\nIf \\fIbyte_order\\fP is NULL, it is assumed that the string starts off in host\nbyte order. This may be changed by byte-order marks (BOMs) anywhere in the\nstring (commonly as the first character).\n.P\nIf \\fIbyte_order\\fP is not NULL, a non-zero value of the integer to which it\npoints means that the input starts off in host byte order, otherwise the\nopposite order is assumed. Again, BOMs in the string can change this. The final\nbyte order is passed back at the end of processing.\n.P\nIf \\fIkeep_boms\\fP is not zero, byte-order mark characters (0xfeff) are copied\ninto the output string. Otherwise they are discarded.\n.P\nThe result of the function is the number of 16-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n.\n.\n.SH \"SUBJECT STRING OFFSETS\"\n.rs\n.sp\nThe lengths and starting offsets of subject strings must be specified in 16-bit\ndata units, and the offsets within subject strings that are returned by the\nmatching functions are in also 16-bit units rather than bytes.\n.\n.\n.SH \"NAMED SUBPATTERNS\"\n.rs\n.sp\nThe name-to-number translation table that is maintained for named subpatterns\nuses 16-bit characters. The \\fBpcre16_get_stringtable_entries()\\fP function\nreturns the length of each entry in the table as the number of 16-bit data\nunits.\n.\n.\n.SH \"OPTION NAMES\"\n.rs\n.sp\nThere are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK,\nwhich correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In\nfact, these new options define the same bits in the options word. There is a\ndiscussion about the\n.\\\" HTML <a href=\"pcreunicode.html#utf16strings\">\n.\\\" </a>\nvalidity of UTF-16 strings\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage.\n.P\nFor the \\fBpcre16_config()\\fP function there is an option PCRE_CONFIG_UTF16\nthat returns 1 if UTF-16 support is configured, otherwise 0. If this option is\ngiven to \\fBpcre_config()\\fP or \\fBpcre32_config()\\fP, or if the\nPCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \\fBpcre16_config()\\fP,\nthe result is the PCRE_ERROR_BADOPTION error.\n.\n.\n.SH \"CHARACTER CODES\"\n.rs\n.sp\nIn 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the\nsame way as in 8-bit, non UTF-8 mode, except, of course, that they can range\nfrom 0 to 0xffff instead of 0 to 0xff. Character types for characters less than\n0xff can therefore be influenced by the locale in the same way as before.\nCharacters greater than 0xff have only one case, and no \"type\" (such as letter\nor digit).\n.P\nIn UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with\nthe exception of values in the range 0xd800 to 0xdfff because those are\n\"surrogate\" values that are used in pairs to encode values greater than 0xffff.\n.P\nA UTF-16 string can indicate its endianness by special code knows as a\nbyte-order mark (BOM). The PCRE functions do not handle this, expecting strings\nto be in host byte order. A utility function called\n\\fBpcre16_utf16_to_host_byte_order()\\fP is provided to help with this (see\nabove).\n.\n.\n.SH \"ERROR NAMES\"\n.rs\n.sp\nThe errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to\ntheir 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled\npattern is passed to a function that processes patterns in the other\nmode, for example, if a pattern compiled with \\fBpcre_compile()\\fP is passed to\n\\fBpcre16_exec()\\fP.\n.P\nThere are new error codes whose names begin with PCRE_UTF16_ERR for invalid\nUTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that\nare described in the section entitled\n.\\\" HTML <a href=\"pcreapi.html#badutf8reasons\">\n.\\\" </a>\n\"Reason codes for invalid UTF-8 strings\"\n.\\\"\nin the main\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage. The UTF-16 errors are:\n.sp\n  PCRE_UTF16_ERR1  Missing low surrogate at end of string\n  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate\n  PCRE_UTF16_ERR3  Isolated low surrogate\n  PCRE_UTF16_ERR4  Non-character\n.\n.\n.SH \"ERROR TEXTS\"\n.rs\n.sp\nIf there is an error while compiling a pattern, the error text that is passed\nback by \\fBpcre16_compile()\\fP or \\fBpcre16_compile2()\\fP is still an 8-bit\ncharacter string, zero-terminated.\n.\n.\n.SH \"CALLOUTS\"\n.rs\n.sp\nThe \\fIsubject\\fP and \\fImark\\fP fields in the callout block that is passed to\na callout function point to 16-bit vectors.\n.\n.\n.SH \"TESTING\"\n.rs\n.sp\nThe \\fBpcretest\\fP program continues to operate with 8-bit input and output\nfiles, but it can be used for testing the 16-bit library. If it is run with the\ncommand line option \\fB-16\\fP, patterns and subject strings are converted from\n8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions\nare used instead of the 8-bit ones. Returned 16-bit strings are converted to\n8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled,\n\\fBpcretest\\fP defaults to 16-bit and the \\fB-16\\fP option is ignored.\n.P\nWhen PCRE is being built, the \\fBRunTest\\fP script that is called by \"make\ncheck\" uses the \\fBpcretest\\fP \\fB-C\\fP option to discover which of the 8-bit,\n16-bit and 32-bit libraries has been built, and runs the tests appropriately.\n.\n.\n.SH \"NOT SUPPORTED IN 16-BIT MODE\"\n.rs\n.sp\nNot all the features of the 8-bit library are available with the 16-bit\nlibrary. The C++ and POSIX wrapper functions support only the 8-bit library,\nand the \\fBpcregrep\\fP program is at present 8-bit only.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 May 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcre32.3",
    "content": ".TH PCRE 3 \"12 May 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.sp\n.B #include <pcre.h>\n.\n.\n.SH \"PCRE 32-BIT API BASIC FUNCTIONS\"\n.rs\n.sp\n.nf\n.B pcre32 *pcre32_compile(PCRE_SPTR32 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre32 *pcre32_compile2(PCRE_SPTR32 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre32_extra *pcre32_study(const pcre32 *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.sp\n.B void pcre32_free_study(pcre32_extra *\\fIextra\\fP);\n.sp\n.B int pcre32_exec(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.sp\n.B int pcre32_dfa_exec(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.fi\n.\n.\n.SH \"PCRE 32-BIT API STRING EXTRACTION FUNCTIONS\"\n.rs\n.sp\n.nf\n.B int pcre32_copy_named_substring(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR32 \\fIstringname\\fP,\"\n.B \"     PCRE_UCHAR32 *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre32_copy_substring(PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, PCRE_UCHAR32 *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre32_get_named_substring(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR32 \\fIstringname\\fP,\"\n.B \"     PCRE_SPTR32 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre32_get_stringnumber(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIname\\fP);\"\n.sp\n.B int pcre32_get_stringtable_entries(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIname\\fP, PCRE_UCHAR32 **\\fIfirst\\fP, PCRE_UCHAR32 **\\fIlast\\fP);\"\n.sp\n.B int pcre32_get_substring(PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     PCRE_SPTR32 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre32_get_substring_list(PCRE_SPTR32 \\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, PCRE_SPTR32 **\\fIlistptr\\fP);\"\n.sp\n.B void pcre32_free_substring(PCRE_SPTR32 \\fIstringptr\\fP);\n.sp\n.B void pcre32_free_substring_list(PCRE_SPTR32 *\\fIstringptr\\fP);\n.fi\n.\n.\n.SH \"PCRE 32-BIT API AUXILIARY FUNCTIONS\"\n.rs\n.sp\n.nf\n.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \\fIstartsize\\fP, int \\fImaxsize\\fP);\n.sp\n.B void pcre32_jit_stack_free(pcre32_jit_stack *\\fIstack\\fP);\n.sp\n.B void pcre32_assign_jit_stack(pcre32_extra *\\fIextra\\fP,\n.B \"     pcre32_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.sp\n.B const unsigned char *pcre32_maketables(void);\n.sp\n.B int pcre32_fullinfo(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.sp\n.B int pcre32_refcount(pcre32 *\\fIcode\\fP, int \\fIadjust\\fP);\n.sp\n.B int pcre32_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.sp\n.B const char *pcre32_version(void);\n.sp\n.B int pcre32_pattern_to_host_byte_order(pcre32 *\\fIcode\\fP,\n.B \"     pcre32_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.fi\n.\n.\n.SH \"PCRE 32-BIT API INDIRECTED FUNCTIONS\"\n.rs\n.sp\n.nf\n.B void *(*pcre32_malloc)(size_t);\n.sp\n.B void (*pcre32_free)(void *);\n.sp\n.B void *(*pcre32_stack_malloc)(size_t);\n.sp\n.B void (*pcre32_stack_free)(void *);\n.sp\n.B int (*pcre32_callout)(pcre32_callout_block *);\n.fi\n.\n.\n.SH \"PCRE 32-BIT API 32-BIT-ONLY FUNCTION\"\n.rs\n.sp\n.nf\n.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\\fIoutput\\fP,\n.B \"     PCRE_SPTR32 \\fIinput\\fP, int \\fIlength\\fP, int *\\fIbyte_order\\fP,\"\n.B \"     int \\fIkeep_boms\\fP);\"\n.fi\n.\n.\n.SH \"THE PCRE 32-BIT LIBRARY\"\n.rs\n.sp\nStarting with release 8.32, it is possible to compile a PCRE library that\nsupports 32-bit character strings, including UTF-32 strings, as well as or\ninstead of the original 8-bit library. This work was done by Christian Persch,\nbased on the work done by Zoltan Herczeg for the 16-bit library. All three\nlibraries contain identical sets of functions, used in exactly the same way.\nOnly the names of the functions and the data types of their arguments and\nresults are different. To avoid over-complication and reduce the documentation\nmaintenance load, most of the PCRE documentation describes the 8-bit library,\nwith only occasional references to the 16-bit and 32-bit libraries. This page\ndescribes what is different when you use the 32-bit library.\n.P\nWARNING: A single application can be linked with all or any of the three\nlibraries, but you must take care when processing any particular pattern\nto use functions from just one library. For example, if you want to study\na pattern that was compiled with \\fBpcre32_compile()\\fP, you must do so\nwith \\fBpcre32_study()\\fP, not \\fBpcre_study()\\fP, and you must free the\nstudy data with \\fBpcre32_free_study()\\fP.\n.\n.\n.SH \"THE HEADER FILE\"\n.rs\n.sp\nThere is only one header file, \\fBpcre.h\\fP. It contains prototypes for all the\nfunctions in all libraries, as well as definitions of flags, structures, error\ncodes, etc.\n.\n.\n.SH \"THE LIBRARY NAME\"\n.rs\n.sp\nIn Unix-like systems, the 32-bit library is called \\fBlibpcre32\\fP, and can\nnormally be accesss by adding \\fB-lpcre32\\fP to the command for linking an\napplication that uses PCRE.\n.\n.\n.SH \"STRING TYPES\"\n.rs\n.sp\nIn the 8-bit library, strings are passed to PCRE library functions as vectors\nof bytes with the C type \"char *\". In the 32-bit library, strings are passed as\nvectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an\nappropriate data type, and PCRE_SPTR32 is defined as \"const PCRE_UCHAR32 *\". In\nvery many environments, \"unsigned int\" is a 32-bit data type. When PCRE is\nbuilt, it defines PCRE_UCHAR32 as \"unsigned int\", but checks that it really is\na 32-bit data type. If it is not, the build fails with an error message telling\nthe maintainer to modify the definition appropriately.\n.\n.\n.SH \"STRUCTURE TYPES\"\n.rs\n.sp\nThe types of the opaque structures that are used for compiled 32-bit patterns\nand JIT stacks are \\fBpcre32\\fP and \\fBpcre32_jit_stack\\fP respectively. The\ntype of the user-accessible structure that is returned by \\fBpcre32_study()\\fP\nis \\fBpcre32_extra\\fP, and the type of the structure that is used for passing\ndata to a callout function is \\fBpcre32_callout_block\\fP. These structures\ncontain the same fields, with the same names, as their 8-bit counterparts. The\nonly difference is that pointers to character strings are 32-bit instead of\n8-bit types.\n.\n.\n.SH \"32-BIT FUNCTIONS\"\n.rs\n.sp\nFor every function in the 8-bit library there is a corresponding function in\nthe 32-bit library with a name that starts with \\fBpcre32_\\fP instead of\n\\fBpcre_\\fP. The prototypes are listed above. In addition, there is one extra\nfunction, \\fBpcre32_utf32_to_host_byte_order()\\fP. This is a utility function\nthat converts a UTF-32 character string to host byte order if necessary. The\nother 32-bit functions expect the strings they are passed to be in host byte\norder.\n.P\nThe \\fIinput\\fP and \\fIoutput\\fP arguments of\n\\fBpcre32_utf32_to_host_byte_order()\\fP may point to the same address, that is,\nconversion in place is supported. The output buffer must be at least as long as\nthe input.\n.P\nThe \\fIlength\\fP argument specifies the number of 32-bit data units in the\ninput string; a negative value specifies a zero-terminated string.\n.P\nIf \\fIbyte_order\\fP is NULL, it is assumed that the string starts off in host\nbyte order. This may be changed by byte-order marks (BOMs) anywhere in the\nstring (commonly as the first character).\n.P\nIf \\fIbyte_order\\fP is not NULL, a non-zero value of the integer to which it\npoints means that the input starts off in host byte order, otherwise the\nopposite order is assumed. Again, BOMs in the string can change this. The final\nbyte order is passed back at the end of processing.\n.P\nIf \\fIkeep_boms\\fP is not zero, byte-order mark characters (0xfeff) are copied\ninto the output string. Otherwise they are discarded.\n.P\nThe result of the function is the number of 32-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n.\n.\n.SH \"SUBJECT STRING OFFSETS\"\n.rs\n.sp\nThe lengths and starting offsets of subject strings must be specified in 32-bit\ndata units, and the offsets within subject strings that are returned by the\nmatching functions are in also 32-bit units rather than bytes.\n.\n.\n.SH \"NAMED SUBPATTERNS\"\n.rs\n.sp\nThe name-to-number translation table that is maintained for named subpatterns\nuses 32-bit characters. The \\fBpcre32_get_stringtable_entries()\\fP function\nreturns the length of each entry in the table as the number of 32-bit data\nunits.\n.\n.\n.SH \"OPTION NAMES\"\n.rs\n.sp\nThere are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK,\nwhich correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In\nfact, these new options define the same bits in the options word. There is a\ndiscussion about the\n.\\\" HTML <a href=\"pcreunicode.html#utf32strings\">\n.\\\" </a>\nvalidity of UTF-32 strings\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage.\n.P\nFor the \\fBpcre32_config()\\fP function there is an option PCRE_CONFIG_UTF32\nthat returns 1 if UTF-32 support is configured, otherwise 0. If this option is\ngiven to \\fBpcre_config()\\fP or \\fBpcre16_config()\\fP, or if the\nPCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \\fBpcre32_config()\\fP,\nthe result is the PCRE_ERROR_BADOPTION error.\n.\n.\n.SH \"CHARACTER CODES\"\n.rs\n.sp\nIn 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the\nsame way as in 8-bit, non UTF-8 mode, except, of course, that they can range\nfrom 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less\nthan 0xff can therefore be influenced by the locale in the same way as before.\nCharacters greater than 0xff have only one case, and no \"type\" (such as letter\nor digit).\n.P\nIn UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with\nthe exception of values in the range 0xd800 to 0xdfff because those are\n\"surrogate\" values that are ill-formed in UTF-32.\n.P\nA UTF-32 string can indicate its endianness by special code knows as a\nbyte-order mark (BOM). The PCRE functions do not handle this, expecting strings\nto be in host byte order. A utility function called\n\\fBpcre32_utf32_to_host_byte_order()\\fP is provided to help with this (see\nabove).\n.\n.\n.SH \"ERROR NAMES\"\n.rs\n.sp\nThe error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart.\nThe error PCRE_ERROR_BADMODE is given when a compiled\npattern is passed to a function that processes patterns in the other\nmode, for example, if a pattern compiled with \\fBpcre_compile()\\fP is passed to\n\\fBpcre32_exec()\\fP.\n.P\nThere are new error codes whose names begin with PCRE_UTF32_ERR for invalid\nUTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that\nare described in the section entitled\n.\\\" HTML <a href=\"pcreapi.html#badutf8reasons\">\n.\\\" </a>\n\"Reason codes for invalid UTF-8 strings\"\n.\\\"\nin the main\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage. The UTF-32 errors are:\n.sp\n  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)\n  PCRE_UTF32_ERR2  Non-character\n  PCRE_UTF32_ERR3  Character > 0x10ffff\n.\n.\n.SH \"ERROR TEXTS\"\n.rs\n.sp\nIf there is an error while compiling a pattern, the error text that is passed\nback by \\fBpcre32_compile()\\fP or \\fBpcre32_compile2()\\fP is still an 8-bit\ncharacter string, zero-terminated.\n.\n.\n.SH \"CALLOUTS\"\n.rs\n.sp\nThe \\fIsubject\\fP and \\fImark\\fP fields in the callout block that is passed to\na callout function point to 32-bit vectors.\n.\n.\n.SH \"TESTING\"\n.rs\n.sp\nThe \\fBpcretest\\fP program continues to operate with 8-bit input and output\nfiles, but it can be used for testing the 32-bit library. If it is run with the\ncommand line option \\fB-32\\fP, patterns and subject strings are converted from\n8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions\nare used instead of the 8-bit ones. Returned 32-bit strings are converted to\n8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled,\n\\fBpcretest\\fP defaults to 32-bit and the \\fB-32\\fP option is ignored.\n.P\nWhen PCRE is being built, the \\fBRunTest\\fP script that is called by \"make\ncheck\" uses the \\fBpcretest\\fP \\fB-C\\fP option to discover which of the 8-bit,\n16-bit and 32-bit libraries has been built, and runs the tests appropriately.\n.\n.\n.SH \"NOT SUPPORTED IN 32-BIT MODE\"\n.rs\n.sp\nNot all the features of the 8-bit library are available with the 32-bit\nlibrary. The C++ and POSIX wrapper functions support only the 8-bit library,\nand the \\fBpcregrep\\fP program is at present 8-bit only.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 May 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcre_assign_jit_stack.3",
    "content": ".TH PCRE_ASSIGN_JIT_STACK 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B void pcre_assign_jit_stack(pcre_extra *\\fIextra\\fP,\n.B \"     pcre_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.sp\n.B void pcre16_assign_jit_stack(pcre16_extra *\\fIextra\\fP,\n.B \"     pcre16_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.sp\n.B void pcre32_assign_jit_stack(pcre32_extra *\\fIextra\\fP,\n.B \"     pcre32_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function provides control over the memory used as a stack at run-time by a\ncall to \\fBpcre[16|32]_exec()\\fP with a pattern that has been successfully\ncompiled with JIT optimization. The arguments are:\n.sp\n  extra     the data pointer returned by \\fBpcre[16|32]_study()\\fP\n  callback  a callback function\n  data      a JIT stack or a value to be passed to the callback\n              function\n.P\nIf \\fIcallback\\fP is NULL and \\fIdata\\fP is NULL, an internal 32K block on\nthe machine stack is used.\n.P\nIf \\fIcallback\\fP is NULL and \\fIdata\\fP is not NULL, \\fIdata\\fP must\nbe a valid JIT stack, the result of calling \\fBpcre[16|32]_jit_stack_alloc()\\fP.\n.P\nIf \\fIcallback\\fP not NULL, it is called with \\fIdata\\fP as an argument at\nthe start of matching, in order to set up a JIT stack. If the result is NULL,\nthe internal 32K stack is used; otherwise the return value must be a valid JIT\nstack, the result of calling \\fBpcre[16|32]_jit_stack_alloc()\\fP.\n.P\nYou may safely assign the same JIT stack to multiple patterns, as long as they\nare all matched in the same thread. In a multithread application, each thread\nmust use its own JIT stack. For more details, see the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\npage.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_compile.3",
    "content": ".TH PCRE_COMPILE 3 \"01 October 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B pcre *pcre_compile(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre16 *pcre16_compile(PCRE_SPTR16 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre32 *pcre32_compile(PCRE_SPTR32 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function compiles a regular expression into an internal form. It is the\nsame as \\fBpcre[16|32]_compile2()\\fP, except for the absence of the\n\\fIerrorcodeptr\\fP argument. Its arguments are:\n.sp\n  \\fIpattern\\fP       A zero-terminated string containing the\n                  regular expression to be compiled\n  \\fIoptions\\fP       Zero or more option bits\n  \\fIerrptr\\fP        Where to put an error message\n  \\fIerroffset\\fP     Offset in pattern where error was found\n  \\fItableptr\\fP      Pointer to character tables, or NULL to\n                  use the built-in default\n.sp\nThe option bits are:\n.sp\n  PCRE_ANCHORED           Force pattern anchoring\n  PCRE_AUTO_CALLOUT       Compile automatic callouts\n  PCRE_BSR_ANYCRLF        \\eR matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE        \\eR matches all Unicode line endings\n  PCRE_CASELESS           Do caseless matching\n  PCRE_DOLLAR_ENDONLY     $ not to match newline at end\n  PCRE_DOTALL             . matches anything including NL\n  PCRE_DUPNAMES           Allow duplicate names for subpatterns\n  PCRE_EXTENDED           Ignore white space and # comments\n  PCRE_EXTRA              PCRE extra features\n                            (not much use currently)\n  PCRE_FIRSTLINE          Force matching to be before newline\n  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility\n  PCRE_MULTILINE          ^ and $ match newlines within data\n  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)\n  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline\n                            sequences\n  PCRE_NEWLINE_CR         Set CR as the newline sequence\n  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence\n  PCRE_NEWLINE_LF         Set LF as the newline sequence\n  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-\n                            theses (named ones available)\n  PCRE_NO_AUTO_POSSESS    Disable auto-possessification\n  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations\n  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16\n                            validity (only relevant if\n                            PCRE_UTF16 is set)\n  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32\n                            validity (only relevant if\n                            PCRE_UTF32 is set)\n  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8\n                            validity (only relevant if\n                            PCRE_UTF8 is set)\n  PCRE_UCP                Use Unicode properties for \\ed, \\ew, etc.\n  PCRE_UNGREEDY           Invert greediness of quantifiers\n  PCRE_UTF16              Run in \\fBpcre16_compile()\\fP UTF-16 mode\n  PCRE_UTF32              Run in \\fBpcre32_compile()\\fP UTF-32 mode\n  PCRE_UTF8               Run in \\fBpcre_compile()\\fP UTF-8 mode\n.sp\nPCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and\nPCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.\n.P\nThe yield of the function is a pointer to a private data structure that\ncontains the compiled pattern, or NULL if an error was detected. Note that\ncompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_compile2.3",
    "content": ".TH PCRE_COMPILE2 3 \"01 October 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B pcre *pcre_compile2(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre16 *pcre16_compile2(PCRE_SPTR16 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre32 *pcre32_compile2(PCRE_SPTR32 \\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,£\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function compiles a regular expression into an internal form. It is the\nsame as \\fBpcre[16|32]_compile()\\fP, except for the addition of the\n\\fIerrorcodeptr\\fP argument. The arguments are:\n.\n.sp\n  \\fIpattern\\fP       A zero-terminated string containing the\n                  regular expression to be compiled\n  \\fIoptions\\fP       Zero or more option bits\n  \\fIerrorcodeptr\\fP  Where to put an error code\n  \\fIerrptr\\fP        Where to put an error message\n  \\fIerroffset\\fP     Offset in pattern where error was found\n  \\fItableptr\\fP      Pointer to character tables, or NULL to\n                  use the built-in default\n.sp\nThe option bits are:\n.sp\n  PCRE_ANCHORED           Force pattern anchoring\n  PCRE_AUTO_CALLOUT       Compile automatic callouts\n  PCRE_BSR_ANYCRLF        \\eR matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE        \\eR matches all Unicode line endings\n  PCRE_CASELESS           Do caseless matching\n  PCRE_DOLLAR_ENDONLY     $ not to match newline at end\n  PCRE_DOTALL             . matches anything including NL\n  PCRE_DUPNAMES           Allow duplicate names for subpatterns\n  PCRE_EXTENDED           Ignore white space and # comments\n  PCRE_EXTRA              PCRE extra features\n                            (not much use currently)\n  PCRE_FIRSTLINE          Force matching to be before newline\n  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility\n  PCRE_MULTILINE          ^ and $ match newlines within data\n  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)\n  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline\n                            sequences\n  PCRE_NEWLINE_CR         Set CR as the newline sequence\n  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence\n  PCRE_NEWLINE_LF         Set LF as the newline sequence\n  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-\n                            theses (named ones available)\n  PCRE_NO_AUTO_POSSESS    Disable auto-possessification\n  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations\n  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16\n                            validity (only relevant if\n                            PCRE_UTF16 is set)\n  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32\n                            validity (only relevant if\n                            PCRE_UTF32 is set)\n  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8\n                            validity (only relevant if\n                            PCRE_UTF8 is set)\n  PCRE_UCP                Use Unicode properties for \\ed, \\ew, etc.\n  PCRE_UNGREEDY           Invert greediness of quantifiers\n  PCRE_UTF16              Run \\fBpcre16_compile()\\fP in UTF-16 mode\n  PCRE_UTF32              Run \\fBpcre32_compile()\\fP in UTF-32 mode\n  PCRE_UTF8               Run \\fBpcre_compile()\\fP in UTF-8 mode\n.sp\nPCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and\nPCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used.\n.P\nThe yield of the function is a pointer to a private data structure that\ncontains the compiled pattern, or NULL if an error was detected. Note that\ncompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_config.3",
    "content": ".TH PCRE_CONFIG 3 \"20 April 2014\" \"PCRE 8.36\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B int pcre_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.PP\n.B int pcre16_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.PP\n.B int pcre32_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function makes it possible for a client program to find out which optional\nfeatures are available in the version of the PCRE library it is using. The\narguments are as follows:\n.sp\n  \\fIwhat\\fP     A code specifying what information is required\n  \\fIwhere\\fP    Points to where to put the data\n.sp\nThe \\fIwhere\\fP argument must point to an integer variable, except for\nPCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and\nPCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer,\nand for PCRE_CONFIG_JITTARGET, when it must point to a const char*.\nThe available codes are:\n.sp\n  PCRE_CONFIG_JIT           Availability of just-in-time compiler\n                              support (1=yes 0=no)\n  PCRE_CONFIG_JITTARGET     String containing information about the\n                              target architecture for the JIT compiler,\n                              or NULL if there is no JIT support\n  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4\n  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit\n  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit\n  PCRE_CONFIG_MATCH_LIMIT_RECURSION\n                            Internal recursion depth limit\n  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:\n                                13 (0x000d)    for CR\n                                10 (0x000a)    for LF\n                              3338 (0x0d0a)    for CRLF\n                                -2             for ANYCRLF\n                                -1             for ANY\n  PCRE_CONFIG_BSR           Indicates what \\eR matches by default:\n                                 0             all Unicode line endings\n                                 1             CR, LF, or CRLF only\n  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n                            Threshold of return slots, above which\n                              \\fBmalloc()\\fP is used by the POSIX API\n  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)\n  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes\n                               0=no); option for \\fBpcre16_config()\\fP\n  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes\n                               0=no); option for \\fBpcre32_config()\\fP\n  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);\n                              option for \\fBpcre_config()\\fP\n  PCRE_CONFIG_UNICODE_PROPERTIES\n                            Availability of Unicode property support\n                              (1=yes 0=no)\n.sp\nThe function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error\nis also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to\n\\fBpcre_config()\\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to\n\\fBpcre16_config()\\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to\n\\fBpcre32_config()\\fP.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_copy_named_substring.3",
    "content": ".TH PCRE_COPY_NAMED_SUBSTRING 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_copy_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     char *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre16_copy_named_substring(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR16 \\fIstringname\\fP,\"\n.B \"     PCRE_UCHAR16 *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre32_copy_named_substring(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR32 \\fIstringname\\fP,\"\n.B \"     PCRE_UCHAR32 *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for extracting a captured substring, identified\nby name, into a given buffer. The arguments are:\n.sp\n  \\fIcode\\fP          Pattern that was successfully matched\n  \\fIsubject\\fP       Subject that has been successfully matched\n  \\fIovector\\fP       Offset vector that \\fBpcre[16|32]_exec()\\fP used\n  \\fIstringcount\\fP   Value returned by \\fBpcre[16|32]_exec()\\fP\n  \\fIstringname\\fP    Name of the required substring\n  \\fIbuffer\\fP        Buffer to receive the string\n  \\fIbuffersize\\fP    Size of buffer\n.sp\nThe yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was\ntoo small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_copy_substring.3",
    "content": ".TH PCRE_COPY_SUBSTRING 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_copy_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, char *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre16_copy_substring(PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, PCRE_UCHAR16 *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre32_copy_substring(PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, PCRE_UCHAR32 *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for extracting a captured substring into a given\nbuffer. The arguments are:\n.sp\n  \\fIsubject\\fP       Subject that has been successfully matched\n  \\fIovector\\fP       Offset vector that \\fBpcre[16|32]_exec()\\fP used\n  \\fIstringcount\\fP   Value returned by \\fBpcre[16|32]_exec()\\fP\n  \\fIstringnumber\\fP  Number of the required substring\n  \\fIbuffer\\fP        Buffer to receive the string\n  \\fIbuffersize\\fP    Size of buffer\n.sp\nThe yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was\ntoo small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_dfa_exec.3",
    "content": ".TH PCRE_DFA_EXEC 3 \"12 May 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_dfa_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.sp\n.B int pcre16_dfa_exec(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.sp\n.B int pcre32_dfa_exec(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function matches a compiled regular expression against a given subject\nstring, using an alternative matching algorithm that scans the subject string\njust once (\\fInot\\fP Perl-compatible). Note that the main, Perl-compatible,\nmatching function is \\fBpcre[16|32]_exec()\\fP. The arguments for this function\nare:\n.sp\n  \\fIcode\\fP         Points to the compiled pattern\n  \\fIextra\\fP        Points to an associated \\fBpcre[16|32]_extra\\fP structure,\n                 or is NULL\n  \\fIsubject\\fP      Points to the subject string\n  \\fIlength\\fP       Length of the subject string\n  \\fIstartoffset\\fP  Offset in the subject at which to start matching\n  \\fIoptions\\fP      Option bits\n  \\fIovector\\fP      Points to a vector of ints for result offsets\n  \\fIovecsize\\fP     Number of elements in the vector\n  \\fIworkspace\\fP    Points to a vector of ints used as working space\n  \\fIwscount\\fP      Number of elements in the vector\n.sp\nThe units for \\fIlength\\fP and \\fIstartoffset\\fP are bytes for\n\\fBpcre_exec()\\fP, 16-bit data items for \\fBpcre16_exec()\\fP, and 32-bit items\nfor \\fBpcre32_exec()\\fP. The options are:\n.sp\n  PCRE_ANCHORED          Match only at the first position\n  PCRE_BSR_ANYCRLF       \\eR matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE       \\eR matches all Unicode line endings\n  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences\n  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence\n  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence\n  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence\n  PCRE_NOTBOL            Subject is not the beginning of a line\n  PCRE_NOTEOL            Subject is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_START_OPTIMIZE Do not do \"start-match\" optimizations\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           even if there is a full match as well\n  PCRE_DFA_SHORTEST      Return only the shortest match\n  PCRE_DFA_RESTART       Restart after a partial match\n.sp\nThere are restrictions on what may appear in a pattern when using this matching\nfunction. Details are given in the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\ndocumentation. For details of partial matching, see the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\npage.\n.P\nA \\fBpcre[16|32]_extra\\fP structure contains the following fields:\n.sp\n  \\fIflags\\fP            Bits indicating which fields are set\n  \\fIstudy_data\\fP       Opaque data from \\fBpcre[16|32]_study()\\fP\n  \\fImatch_limit\\fP      Limit on internal resource use\n  \\fImatch_limit_recursion\\fP  Limit on internal recursion depth\n  \\fIcallout_data\\fP     Opaque data passed back to callouts\n  \\fItables\\fP           Points to character tables or is NULL\n  \\fImark\\fP             For passing back a *MARK pointer\n  \\fIexecutable_jit\\fP   Opaque data from JIT compilation\n.sp\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this\nmatching function, the \\fImatch_limit\\fP and \\fImatch_limit_recursion\\fP fields\nare not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and\nthe corresponding variable are ignored.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_exec.3",
    "content": ".TH PCRE_EXEC 3 \"12 May 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.sp\n.B int pcre16_exec(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.sp\n.B int pcre32_exec(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function matches a compiled regular expression against a given subject\nstring, using a matching algorithm that is similar to Perl's. It returns\noffsets to captured substrings. Its arguments are:\n.sp\n  \\fIcode\\fP         Points to the compiled pattern\n  \\fIextra\\fP        Points to an associated \\fBpcre[16|32]_extra\\fP structure,\n                 or is NULL\n  \\fIsubject\\fP      Points to the subject string\n  \\fIlength\\fP       Length of the subject string\n  \\fIstartoffset\\fP  Offset in the subject at which to start matching\n  \\fIoptions\\fP      Option bits\n  \\fIovector\\fP      Points to a vector of ints for result offsets\n  \\fIovecsize\\fP     Number of elements in the vector (a multiple of 3)\n.sp\nThe units for \\fIlength\\fP and \\fIstartoffset\\fP are bytes for\n\\fBpcre_exec()\\fP, 16-bit data items for \\fBpcre16_exec()\\fP, and 32-bit items\nfor \\fBpcre32_exec()\\fP. The options are:\n.sp\n  PCRE_ANCHORED          Match only at the first position\n  PCRE_BSR_ANYCRLF       \\eR matches only CR, LF, or CRLF\n  PCRE_BSR_UNICODE       \\eR matches all Unicode line endings\n  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence\n  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences\n  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence\n  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence\n  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence\n  PCRE_NOTBOL            Subject string is not the beginning of a line\n  PCRE_NOTEOL            Subject string is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_START_OPTIMIZE Do not do \"start-match\" optimizations\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           if that is found before a full match\n.sp\nFor details of partial matching, see the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\npage. A \\fBpcre_extra\\fP structure contains the following fields:\n.sp\n  \\fIflags\\fP            Bits indicating which fields are set\n  \\fIstudy_data\\fP       Opaque data from \\fBpcre[16|32]_study()\\fP\n  \\fImatch_limit\\fP      Limit on internal resource use\n  \\fImatch_limit_recursion\\fP  Limit on internal recursion depth\n  \\fIcallout_data\\fP     Opaque data passed back to callouts\n  \\fItables\\fP           Points to character tables or is NULL\n  \\fImark\\fP             For passing back a *MARK pointer\n  \\fIexecutable_jit\\fP   Opaque data from JIT compilation\n.sp\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_free_study.3",
    "content": ".TH PCRE_FREE_STUDY 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B void pcre_free_study(pcre_extra *\\fIextra\\fP);\n.PP\n.B void pcre16_free_study(pcre16_extra *\\fIextra\\fP);\n.PP\n.B void pcre32_free_study(pcre32_extra *\\fIextra\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function is used to free the memory used for the data generated by a call\nto \\fBpcre[16|32]_study()\\fP when it is no longer needed. The argument must be the\nresult of such a call.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_free_substring.3",
    "content": ".TH PCRE_FREE_SUBSTRING 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B void pcre_free_substring(const char *\\fIstringptr\\fP);\n.PP\n.B void pcre16_free_substring(PCRE_SPTR16 \\fIstringptr\\fP);\n.PP\n.B void pcre32_free_substring(PCRE_SPTR32 \\fIstringptr\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for freeing the store obtained by a previous\ncall to \\fBpcre[16|32]_get_substring()\\fP or \\fBpcre[16|32]_get_named_substring()\\fP.\nIts only argument is a pointer to the string.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_free_substring_list.3",
    "content": ".TH PCRE_FREE_SUBSTRING_LIST 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B void pcre_free_substring_list(const char **\\fIstringptr\\fP);\n.PP\n.B void pcre16_free_substring_list(PCRE_SPTR16 *\\fIstringptr\\fP);\n.PP\n.B void pcre32_free_substring_list(PCRE_SPTR32 *\\fIstringptr\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for freeing the store obtained by a previous\ncall to \\fBpcre[16|32]_get_substring_list()\\fP. Its only argument is a pointer to\nthe list of string pointers.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_fullinfo.3",
    "content": ".TH PCRE_FULLINFO 3 \"21 April 2014\" \"PCRE 8.36\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_fullinfo(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.sp\n.B int pcre16_fullinfo(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.sp\n.B int pcre32_fullinfo(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function returns information about a compiled pattern. Its arguments are:\n.sp\n  \\fIcode\\fP                      Compiled regular expression\n  \\fIextra\\fP                     Result of \\fBpcre[16|32]_study()\\fP or NULL\n  \\fIwhat\\fP                      What information is required\n  \\fIwhere\\fP                     Where to put the information\n.sp\nThe following information is available:\n.sp\n  PCRE_INFO_BACKREFMAX      Number of highest back reference\n  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns\n  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables\n  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or\n                              -1 for start of string\n                                 or after newline, or\n                              -2 otherwise\n  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)\n  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist\n  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used\n  PCRE_INFO_JIT             Return 1 after successful JIT compilation\n  PCRE_INFO_JITSIZE         Size of JIT compiled code\n  PCRE_INFO_LASTLITERAL     Literal last data unit required\n  PCRE_INFO_MINLENGTH       Lower bound length of matching strings\n  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,\n                               0 otherwise\n  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET\n  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion\n  PCRE_INFO_NAMECOUNT       Number of named subpatterns\n  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry\n  PCRE_INFO_NAMETABLE       Pointer to name table\n  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried\n                              (always returns 1 after release 8.00)\n  PCRE_INFO_OPTIONS         Option bits used for compilation\n  PCRE_INFO_SIZE            Size of compiled pattern\n  PCRE_INFO_STUDYSIZE       Size of study data\n  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match\n  PCRE_INFO_FIRSTCHARACTERFLAGS Returns\n                                  1 if there is a first data character set, which can\n                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,\n                                  2 if the first character is at the start of the data\n                                    string or after a newline, and\n                                  0 otherwise\n  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET\n  PCRE_INFO_REQUIREDCHAR      Literal last data unit required\n  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then\n                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise\n.sp\nThe \\fIwhere\\fP argument must point to an integer variable, except for the\nfollowing \\fIwhat\\fP values:\n.sp\n  PCRE_INFO_DEFAULT_TABLES  const uint8_t *\n  PCRE_INFO_FIRSTCHARACTER  uint32_t\n  PCRE_INFO_FIRSTTABLE      const uint8_t *\n  PCRE_INFO_JITSIZE         size_t\n  PCRE_INFO_MATCHLIMIT      uint32_t\n  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)\n  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)\n  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)\n  PCRE_INFO_OPTIONS         unsigned long int\n  PCRE_INFO_SIZE            size_t\n  PCRE_INFO_STUDYSIZE       size_t\n  PCRE_INFO_RECURSIONLIMIT  uint32_t\n  PCRE_INFO_REQUIREDCHAR    uint32_t\n.sp\nThe yield of the function is zero on success or:\n.sp\n  PCRE_ERROR_NULL           the argument \\fIcode\\fP was NULL\n                            the argument \\fIwhere\\fP was NULL\n  PCRE_ERROR_BADMAGIC       the \"magic number\" was not found\n  PCRE_ERROR_BADOPTION      the value of \\fIwhat\\fP was invalid\n  PCRE_ERROR_UNSET          the option was not set\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_get_named_substring.3",
    "content": ".TH PCRE_GET_NAMED_SUBSTRING 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_get_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.sp\n.B int pcre16_get_named_substring(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR16 \\fIstringname\\fP,\"\n.B \"     PCRE_SPTR16 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre32_get_named_substring(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, PCRE_SPTR32 \\fIstringname\\fP,\"\n.B \"     PCRE_SPTR32 *\\fIstringptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for extracting a captured substring by name. The\narguments are:\n.sp\n  \\fIcode\\fP          Compiled pattern\n  \\fIsubject\\fP       Subject that has been successfully matched\n  \\fIovector\\fP       Offset vector that \\fBpcre[16|32]_exec()\\fP used\n  \\fIstringcount\\fP   Value returned by \\fBpcre[16|32]_exec()\\fP\n  \\fIstringname\\fP    Name of the required substring\n  \\fIstringptr\\fP     Where to put the string pointer\n.sp\nThe memory in which the substring is placed is obtained by calling\n\\fBpcre[16|32]_malloc()\\fP. The convenience function\n\\fBpcre[16|32]_free_substring()\\fP can be used to free it when it is no longer\nneeded. The yield of the function is the length of the extracted substring,\nPCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or\nPCRE_ERROR_NOSUBSTRING if the string name is invalid.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_get_stringnumber.3",
    "content": ".TH PCRE_GET_STRINGNUMBER 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_get_stringnumber(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP);\"\n.sp\n.B int pcre16_get_stringnumber(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIname\\fP);\"\n.sp\n.B int pcre32_get_stringnumber(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIname\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis convenience function finds the number of a named substring capturing\nparenthesis in a compiled pattern. Its arguments are:\n.sp\n  \\fIcode\\fP    Compiled regular expression\n  \\fIname\\fP    Name whose number is required\n.sp\nThe yield of the function is the number of the parenthesis if the name is\nfound, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed\n(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by\n\\fBpcre[16|32]_get_stringnumber()\\fP. You can obtain the complete list by calling\n\\fBpcre[16|32]_get_stringtable_entries()\\fP.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_get_stringtable_entries.3",
    "content": ".TH PCRE_GET_STRINGTABLE_ENTRIES 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_get_stringtable_entries(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP, char **\\fIfirst\\fP, char **\\fIlast\\fP);\"\n.sp\n.B int pcre16_get_stringtable_entries(const pcre16 *\\fIcode\\fP,\n.B \"     PCRE_SPTR16 \\fIname\\fP, PCRE_UCHAR16 **\\fIfirst\\fP, PCRE_UCHAR16 **\\fIlast\\fP);\"\n.sp\n.B int pcre32_get_stringtable_entries(const pcre32 *\\fIcode\\fP,\n.B \"     PCRE_SPTR32 \\fIname\\fP, PCRE_UCHAR32 **\\fIfirst\\fP, PCRE_UCHAR32 **\\fIlast\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis convenience function finds, for a compiled pattern, the first and last\nentries for a given name in the table that translates capturing parenthesis\nnames into numbers. When names are required to be unique (PCRE_DUPNAMES is\n\\fInot\\fP set), it is usually easier to use \\fBpcre[16|32]_get_stringnumber()\\fP\ninstead.\n.sp\n  \\fIcode\\fP    Compiled regular expression\n  \\fIname\\fP    Name whose entries required\n  \\fIfirst\\fP   Where to return a pointer to the first entry\n  \\fIlast\\fP    Where to return a pointer to the last entry\n.sp\nThe yield of the function is the length of each entry, or\nPCRE_ERROR_NOSUBSTRING if none are found.\n.P\nThere is a complete description of the PCRE native API, including the format of\nthe table entries, in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage, and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_get_substring.3",
    "content": ".TH PCRE_GET_SUBSTRING 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_get_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.sp\n.B int pcre16_get_substring(PCRE_SPTR16 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     PCRE_SPTR16 *\\fIstringptr\\fP);\"\n.sp\n.B int pcre32_get_substring(PCRE_SPTR32 \\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     PCRE_SPTR32 *\\fIstringptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for extracting a captured substring. The\narguments are:\n.sp\n  \\fIsubject\\fP       Subject that has been successfully matched\n  \\fIovector\\fP       Offset vector that \\fBpcre[16|32]_exec()\\fP used\n  \\fIstringcount\\fP   Value returned by \\fBpcre[16|32]_exec()\\fP\n  \\fIstringnumber\\fP  Number of the required substring\n  \\fIstringptr\\fP     Where to put the string pointer\n.sp\nThe memory in which the substring is placed is obtained by calling\n\\fBpcre[16|32]_malloc()\\fP. The convenience function\n\\fBpcre[16|32]_free_substring()\\fP can be used to free it when it is no longer\nneeded. The yield of the function is the length of the substring,\nPCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or\nPCRE_ERROR_NOSUBSTRING if the string number is invalid.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_get_substring_list.3",
    "content": ".TH PCRE_GET_SUBSTRING_LIST 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_get_substring_list(const char *\\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, const char ***\\fIlistptr\\fP);\"\n.sp\n.B int pcre16_get_substring_list(PCRE_SPTR16 \\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, PCRE_SPTR16 **\\fIlistptr\\fP);\"\n.sp\n.B int pcre32_get_substring_list(PCRE_SPTR32 \\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, PCRE_SPTR32 **\\fIlistptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis is a convenience function for extracting a list of all the captured\nsubstrings. The arguments are:\n.sp\n  \\fIsubject\\fP       Subject that has been successfully matched\n  \\fIovector\\fP       Offset vector that \\fBpcre[16|32]_exec\\fP used\n  \\fIstringcount\\fP   Value returned by \\fBpcre[16|32]_exec\\fP\n  \\fIlistptr\\fP       Where to put a pointer to the list\n.sp\nThe memory in which the substrings and the list are placed is obtained by\ncalling \\fBpcre[16|32]_malloc()\\fP. The convenience function\n\\fBpcre[16|32]_free_substring_list()\\fP can be used to free it when it is no\nlonger needed. A pointer to a list of pointers is put in the variable whose\naddress is in \\fIlistptr\\fP. The list is terminated by a NULL pointer. The\nyield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient\nmemory could not be obtained.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_jit_exec.3",
    "content": ".TH PCRE_EXEC 3 \"31 October 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_jit_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     pcre_jit_stack *\\fIjstack\\fP);\"\n.sp\n.B int pcre16_jit_exec(const pcre16 *\\fIcode\\fP, \"const pcre16_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR16 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     pcre_jit_stack *\\fIjstack\\fP);\"\n.sp\n.B int pcre32_jit_exec(const pcre32 *\\fIcode\\fP, \"const pcre32_extra *\\fIextra\\fP,\"\n.B \"     PCRE_SPTR32 \\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     pcre_jit_stack *\\fIjstack\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function matches a compiled regular expression that has been successfully\nstudied with one of the JIT options against a given subject string, using a\nmatching algorithm that is similar to Perl's. It is a \"fast path\" interface to\nJIT, and it bypasses some of the sanity checks that \\fBpcre_exec()\\fP applies.\nIt returns offsets to captured substrings. Its arguments are:\n.sp\n  \\fIcode\\fP         Points to the compiled pattern\n  \\fIextra\\fP        Points to an associated \\fBpcre[16|32]_extra\\fP structure,\n                 or is NULL\n  \\fIsubject\\fP      Points to the subject string\n  \\fIlength\\fP       Length of the subject string, in bytes\n  \\fIstartoffset\\fP  Offset in bytes in the subject at which to\n                 start matching\n  \\fIoptions\\fP      Option bits\n  \\fIovector\\fP      Points to a vector of ints for result offsets\n  \\fIovecsize\\fP     Number of elements in the vector (a multiple of 3)\n  \\fIjstack\\fP       Pointer to a JIT stack\n.sp\nThe allowed options are:\n.sp\n  PCRE_NOTBOL            Subject string is not the beginning of a line\n  PCRE_NOTEOL            Subject string is not the end of a line\n  PCRE_NOTEMPTY          An empty string is not a valid match\n  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject\n                           is not a valid match\n  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16\n                           validity (only relevant if PCRE_UTF16\n                           was set at compile time)\n  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32\n                           validity (only relevant if PCRE_UTF32\n                           was set at compile time)\n  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8\n                           validity (only relevant if PCRE_UTF8\n                           was set at compile time)\n  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial\n  PCRE_PARTIAL_SOFT      )   match if no full matches are found\n  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match\n                           if that is found before a full match\n.sp\nHowever, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check\nis never applied. For details of partial matching, see the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\npage. A \\fBpcre_extra\\fP structure contains the following fields:\n.sp\n  \\fIflags\\fP            Bits indicating which fields are set\n  \\fIstudy_data\\fP       Opaque data from \\fBpcre[16|32]_study()\\fP\n  \\fImatch_limit\\fP      Limit on internal resource use\n  \\fImatch_limit_recursion\\fP  Limit on internal recursion depth\n  \\fIcallout_data\\fP     Opaque data passed back to callouts\n  \\fItables\\fP           Points to character tables or is NULL\n  \\fImark\\fP             For passing back a *MARK pointer\n  \\fIexecutable_jit\\fP   Opaque data from JIT compilation\n.sp\nThe flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,\nPCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA,\nPCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the JIT API in the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_jit_stack_alloc.3",
    "content": ".TH PCRE_JIT_STACK_ALLOC 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B pcre_jit_stack *pcre_jit_stack_alloc(int \\fIstartsize\\fP,\n.B \"     int \\fImaxsize\\fP);\"\n.sp\n.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \\fIstartsize\\fP,\n.B \"     int \\fImaxsize\\fP);\"\n.sp\n.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \\fIstartsize\\fP,\n.B \"     int \\fImaxsize\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function is used to create a stack for use by the code compiled by the JIT\noptimization of \\fBpcre[16|32]_study()\\fP. The arguments are a starting size for\nthe stack, and a maximum size to which it is allowed to grow. The result can be\npassed to the JIT run-time code by \\fBpcre[16|32]_assign_jit_stack()\\fP, or that\nfunction can set up a callback for obtaining a stack. A maximum stack size of\n512K to 1M should be more than enough for any pattern. For more details, see\nthe\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\npage.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_jit_stack_free.3",
    "content": ".TH PCRE_JIT_STACK_FREE 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B void pcre_jit_stack_free(pcre_jit_stack *\\fIstack\\fP);\n.PP\n.B void pcre16_jit_stack_free(pcre16_jit_stack *\\fIstack\\fP);\n.PP\n.B void pcre32_jit_stack_free(pcre32_jit_stack *\\fIstack\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function is used to free a JIT stack that was created by\n\\fBpcre[16|32]_jit_stack_alloc()\\fP when it is no longer needed. For more details,\nsee the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\npage.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_maketables.3",
    "content": ".TH PCRE_MAKETABLES 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B const unsigned char *pcre_maketables(void);\n.PP\n.B const unsigned char *pcre16_maketables(void);\n.PP\n.B const unsigned char *pcre32_maketables(void);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function builds a set of character tables for character values less than\n256. These can be passed to \\fBpcre[16|32]_compile()\\fP to override PCRE's\ninternal, built-in tables (which were made by \\fBpcre[16|32]_maketables()\\fP when\nPCRE was compiled). You might want to do this if you are using a non-standard\nlocale. The function yields a pointer to the tables.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_pattern_to_host_byte_order.3",
    "content": ".TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre_pattern_to_host_byte_order(pcre *\\fIcode\\fP,\n.B \"     pcre_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.sp\n.B int pcre16_pattern_to_host_byte_order(pcre16 *\\fIcode\\fP,\n.B \"     pcre16_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.sp\n.B int pcre32_pattern_to_host_byte_order(pcre32 *\\fIcode\\fP,\n.B \"     pcre32_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function ensures that the bytes in 2-byte and 4-byte values in a compiled\npattern are in the correct order for the current host. It is useful when a\npattern that has been compiled on one host is transferred to another that might\nhave different endianness. The arguments are:\n.sp\n  \\fIcode\\fP         A compiled regular expression\n  \\fIextra\\fP        Points to an associated \\fBpcre[16|32]_extra\\fP structure,\n                 or is NULL\n  \\fItables\\fP       Pointer to character tables, or NULL to\n                 set the built-in default\n.sp\nThe result is 0 for success, a negative PCRE_ERROR_xxx value otherwise.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_refcount.3",
    "content": ".TH PCRE_REFCOUNT 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B int pcre_refcount(pcre *\\fIcode\\fP, int \\fIadjust\\fP);\n.PP\n.B int pcre16_refcount(pcre16 *\\fIcode\\fP, int \\fIadjust\\fP);\n.PP\n.B int pcre32_refcount(pcre32 *\\fIcode\\fP, int \\fIadjust\\fP);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function is used to maintain a reference count inside a data block that\ncontains a compiled pattern. Its arguments are:\n.sp\n  \\fIcode\\fP                      Compiled regular expression\n  \\fIadjust\\fP                    Adjustment to reference value\n.sp\nThe yield of the function is the adjusted reference value, which is constrained\nto lie between 0 and 65535.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_study.3",
    "content": ".TH PCRE_STUDY 3 \" 24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B pcre_extra *pcre_study(const pcre *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.sp\n.B pcre16_extra *pcre16_study(const pcre16 *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.sp\n.B pcre32_extra *pcre32_study(const pcre32 *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function studies a compiled pattern, to see if additional information can\nbe extracted that might speed up matching. Its arguments are:\n.sp\n  \\fIcode\\fP       A compiled regular expression\n  \\fIoptions\\fP    Options for \\fBpcre[16|32]_study()\\fP\n  \\fIerrptr\\fP     Where to put an error message\n.sp\nIf the function succeeds, it returns a value that can be passed to\n\\fBpcre[16|32]_exec()\\fP or \\fBpcre[16|32]_dfa_exec()\\fP via their \\fIextra\\fP\narguments.\n.P\nIf the function returns NULL, either it could not find any additional\ninformation, or there was an error. You can tell the difference by looking at\nthe error value. It is NULL in first case.\n.P\nThe only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation\nif possible. If PCRE has been compiled without JIT support, this option is\nignored. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\npage for further details.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_utf16_to_host_byte_order.3",
    "content": ".TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 \"21 January 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\\fIoutput\\fP,\n.B \"     PCRE_SPTR16 \\fIinput\\fP, int \\fIlength\\fP, int *\\fIhost_byte_order\\fP,\"\n.B \"     int \\fIkeep_boms\\fP);\"\n.fi\n.\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function, which exists only in the 16-bit library, converts a UTF-16\nstring to the correct order for the current host, taking account of any byte\norder marks (BOMs) within the string. Its arguments are:\n.sp\n  \\fIoutput\\fP           pointer to output buffer, may be the same as \\fIinput\\fP\n  \\fIinput\\fP            pointer to input buffer\n  \\fIlength\\fP           number of 16-bit units in the input, or negative for\n                     a zero-terminated string\n  \\fIhost_byte_order\\fP  a NULL value or a non-zero value pointed to means\n                     start in host byte order\n  \\fIkeep_boms\\fP        if non-zero, BOMs are copied to the output string\n.sp\nThe result of the function is the number of 16-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n.P\nIf \\fIhost_byte_order\\fP is not NULL, it is set to indicate the byte order that\nis current at the end of the string.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_utf32_to_host_byte_order.3",
    "content": ".TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.nf\n.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\\fIoutput\\fP,\n.B \"     PCRE_SPTR32 \\fIinput\\fP, int \\fIlength\\fP, int *\\fIhost_byte_order\\fP,\"\n.B \"     int \\fIkeep_boms\\fP);\"\n.fi\n.\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function, which exists only in the 32-bit library, converts a UTF-32\nstring to the correct order for the current host, taking account of any byte\norder marks (BOMs) within the string. Its arguments are:\n.sp\n  \\fIoutput\\fP           pointer to output buffer, may be the same as \\fIinput\\fP\n  \\fIinput\\fP            pointer to input buffer\n  \\fIlength\\fP           number of 32-bit units in the input, or negative for\n                     a zero-terminated string\n  \\fIhost_byte_order\\fP  a NULL value or a non-zero value pointed to means\n                     start in host byte order\n  \\fIkeep_boms\\fP        if non-zero, BOMs are copied to the output string\n.sp\nThe result of the function is the number of 32-bit units placed into the output\nbuffer, including the zero terminator if the string was zero-terminated.\n.P\nIf \\fIhost_byte_order\\fP is not NULL, it is set to indicate the byte order that\nis current at the end of the string.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcre_version.3",
    "content": ".TH PCRE_VERSION 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B const char *pcre_version(void);\n.PP\n.B const char *pcre16_version(void);\n.PP\n.B const char *pcre32_version(void);\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis function (even in the 16-bit and 32-bit libraries) returns a\nzero-terminated, 8-bit character string that gives the version number of the\nPCRE library and the date of its release.\n.P\nThere is a complete description of the PCRE native API in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage and a description of the POSIX API in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\npage.\n"
  },
  {
    "path": "src/pcre/doc/pcreapi.3",
    "content": ".TH PCREAPI 3 \"18 December 2015\" \"PCRE 8.39\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.sp\n.B #include <pcre.h>\n.\n.\n.SH \"PCRE NATIVE API BASIC FUNCTIONS\"\n.rs\n.sp\n.nf\n.B pcre *pcre_compile(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre *pcre_compile2(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre_extra *pcre_study(const pcre *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.sp\n.B void pcre_free_study(pcre_extra *\\fIextra\\fP);\n.sp\n.B int pcre_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.sp\n.B int pcre_dfa_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.fi\n.\n.\n.SH \"PCRE NATIVE API STRING EXTRACTION FUNCTIONS\"\n.rs\n.sp\n.nf\n.B int pcre_copy_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     char *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre_copy_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, char *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre_get_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.sp\n.B int pcre_get_stringnumber(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP);\"\n.sp\n.B int pcre_get_stringtable_entries(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP, char **\\fIfirst\\fP, char **\\fIlast\\fP);\"\n.sp\n.B int pcre_get_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.sp\n.B int pcre_get_substring_list(const char *\\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, const char ***\\fIlistptr\\fP);\"\n.sp\n.B void pcre_free_substring(const char *\\fIstringptr\\fP);\n.sp\n.B void pcre_free_substring_list(const char **\\fIstringptr\\fP);\n.fi\n.\n.\n.SH \"PCRE NATIVE API AUXILIARY FUNCTIONS\"\n.rs\n.sp\n.nf\n.B int pcre_jit_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     pcre_jit_stack *\\fIjstack\\fP);\"\n.sp\n.B pcre_jit_stack *pcre_jit_stack_alloc(int \\fIstartsize\\fP, int \\fImaxsize\\fP);\n.sp\n.B void pcre_jit_stack_free(pcre_jit_stack *\\fIstack\\fP);\n.sp\n.B void pcre_assign_jit_stack(pcre_extra *\\fIextra\\fP,\n.B \"     pcre_jit_callback \\fIcallback\\fP, void *\\fIdata\\fP);\"\n.sp\n.B const unsigned char *pcre_maketables(void);\n.sp\n.B int pcre_fullinfo(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.sp\n.B int pcre_refcount(pcre *\\fIcode\\fP, int \\fIadjust\\fP);\n.sp\n.B int pcre_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.sp\n.B const char *pcre_version(void);\n.sp\n.B int pcre_pattern_to_host_byte_order(pcre *\\fIcode\\fP,\n.B \"     pcre_extra *\\fIextra\\fP, const unsigned char *\\fItables\\fP);\"\n.fi\n.\n.\n.SH \"PCRE NATIVE API INDIRECTED FUNCTIONS\"\n.rs\n.sp\n.nf\n.B void *(*pcre_malloc)(size_t);\n.sp\n.B void (*pcre_free)(void *);\n.sp\n.B void *(*pcre_stack_malloc)(size_t);\n.sp\n.B void (*pcre_stack_free)(void *);\n.sp\n.B int (*pcre_callout)(pcre_callout_block *);\n.sp\n.B int (*pcre_stack_guard)(void);\n.fi\n.\n.\n.SH \"PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES\"\n.rs\n.sp\nAs well as support for 8-bit character strings, PCRE also supports 16-bit\nstrings (from release 8.30) and 32-bit strings (from release 8.32), by means of\ntwo additional libraries. They can be built as well as, or instead of, the\n8-bit library. To avoid too much complication, this document describes the\n8-bit versions of the functions, with only occasional references to the 16-bit\nand 32-bit libraries.\n.P\nThe 16-bit and 32-bit functions operate in the same way as their 8-bit\ncounterparts; they just use different data types for their arguments and\nresults, and their names start with \\fBpcre16_\\fP or \\fBpcre32_\\fP instead of\n\\fBpcre_\\fP. For every option that has UTF8 in its name (for example,\nPCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced\nby UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the\n16-bit and 32-bit option names define the same bit values.\n.P\nReferences to bytes and UTF-8 in this document should be read as references to\n16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data\nunits and UTF-32 when using the 32-bit library, unless specified otherwise.\nMore details of the specific differences for the 16-bit and 32-bit libraries\nare given in the\n.\\\" HREF\n\\fBpcre16\\fP\n.\\\"\nand\n.\\\" HREF\n\\fBpcre32\\fP\n.\\\"\npages.\n.\n.\n.SH \"PCRE API OVERVIEW\"\n.rs\n.sp\nPCRE has its own native API, which is described in this document. There are\nalso some wrapper functions (for the 8-bit library only) that correspond to the\nPOSIX regular expression API, but they do not give access to all the\nfunctionality. They are described in the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\ndocumentation. Both of these APIs define a set of C function calls. A C++\nwrapper (again for the 8-bit library only) is also distributed with PCRE. It is\ndocumented in the\n.\\\" HREF\n\\fBpcrecpp\\fP\n.\\\"\npage.\n.P\nThe native API C function prototypes are defined in the header file\n\\fBpcre.h\\fP, and on Unix-like systems the (8-bit) library itself is called\n\\fBlibpcre\\fP. It can normally be accessed by adding \\fB-lpcre\\fP to the\ncommand for linking an application that uses PCRE. The header file defines the\nmacros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers\nfor the library. Applications can use these to include support for different\nreleases of PCRE.\n.P\nIn a Windows environment, if you want to statically link an application program\nagainst a non-dll \\fBpcre.a\\fP file, you must define PCRE_STATIC before\nincluding \\fBpcre.h\\fP or \\fBpcrecpp.h\\fP, because otherwise the\n\\fBpcre_malloc()\\fP and \\fBpcre_free()\\fP exported functions will be declared\n\\fB__declspec(dllimport)\\fP, with unwanted results.\n.P\nThe functions \\fBpcre_compile()\\fP, \\fBpcre_compile2()\\fP, \\fBpcre_study()\\fP,\nand \\fBpcre_exec()\\fP are used for compiling and matching regular expressions\nin a Perl-compatible manner. A sample program that demonstrates the simplest\nway of using them is provided in the file called \\fIpcredemo.c\\fP in the PCRE\nsource distribution. A listing of this program is given in the\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\ndocumentation, and the\n.\\\" HREF\n\\fBpcresample\\fP\n.\\\"\ndocumentation describes how to compile and run it.\n.P\nJust-in-time compiler support is an optional feature of PCRE that can be built\nin appropriate hardware environments. It greatly speeds up the matching\nperformance of many patterns. Simple programs can easily request that it be\nused if available, by setting an option that is ignored when it is not\nrelevant. More complicated programs might need to make use of the functions\n\\fBpcre_jit_stack_alloc()\\fP, \\fBpcre_jit_stack_free()\\fP, and\n\\fBpcre_assign_jit_stack()\\fP in order to control the JIT code's memory usage.\n.P\nFrom release 8.32 there is also a direct interface for JIT execution, which\ngives improved performance. The JIT-specific functions are discussed in the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation.\n.P\nA second matching function, \\fBpcre_dfa_exec()\\fP, which is not\nPerl-compatible, is also provided. This uses a different algorithm for the\nmatching. The alternative algorithm finds all possible matches (at a given\npoint in the subject), and scans the subject just once (unless there are\nlookbehind assertions). However, this algorithm does not return captured\nsubstrings. A description of the two matching algorithms and their advantages\nand disadvantages is given in the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\ndocumentation.\n.P\nIn addition to the main compiling and matching functions, there are convenience\nfunctions for extracting captured substrings from a subject string that is\nmatched by \\fBpcre_exec()\\fP. They are:\n.sp\n  \\fBpcre_copy_substring()\\fP\n  \\fBpcre_copy_named_substring()\\fP\n  \\fBpcre_get_substring()\\fP\n  \\fBpcre_get_named_substring()\\fP\n  \\fBpcre_get_substring_list()\\fP\n  \\fBpcre_get_stringnumber()\\fP\n  \\fBpcre_get_stringtable_entries()\\fP\n.sp\n\\fBpcre_free_substring()\\fP and \\fBpcre_free_substring_list()\\fP are also\nprovided, to free the memory used for extracted strings.\n.P\nThe function \\fBpcre_maketables()\\fP is used to build a set of character tables\nin the current locale for passing to \\fBpcre_compile()\\fP, \\fBpcre_exec()\\fP,\nor \\fBpcre_dfa_exec()\\fP. This is an optional facility that is provided for\nspecialist use. Most commonly, no special tables are passed, in which case\ninternal tables that are generated when PCRE is built are used.\n.P\nThe function \\fBpcre_fullinfo()\\fP is used to find out information about a\ncompiled pattern. The function \\fBpcre_version()\\fP returns a pointer to a\nstring containing the version of PCRE and its date of release.\n.P\nThe function \\fBpcre_refcount()\\fP maintains a reference count in a data block\ncontaining a compiled pattern. This is provided for the benefit of\nobject-oriented applications.\n.P\nThe global variables \\fBpcre_malloc\\fP and \\fBpcre_free\\fP initially contain\nthe entry points of the standard \\fBmalloc()\\fP and \\fBfree()\\fP functions,\nrespectively. PCRE calls the memory management functions via these variables,\nso a calling program can replace them if it wishes to intercept the calls. This\nshould be done before calling any PCRE functions.\n.P\nThe global variables \\fBpcre_stack_malloc\\fP and \\fBpcre_stack_free\\fP are also\nindirections to memory management functions. These special functions are used\nonly when PCRE is compiled to use the heap for remembering data, instead of\nrecursive function calls, when running the \\fBpcre_exec()\\fP function. See the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation for details of how to do this. It is a non-standard way of\nbuilding PCRE, for use in environments that have limited stacks. Because of the\ngreater use of memory management, it runs more slowly. Separate functions are\nprovided so that special-purpose external code can be used for this case. When\nused, these functions always allocate memory blocks of the same size. There is\na discussion about PCRE's stack usage in the\n.\\\" HREF\n\\fBpcrestack\\fP\n.\\\"\ndocumentation.\n.P\nThe global variable \\fBpcre_callout\\fP initially contains NULL. It can be set\nby the caller to a \"callout\" function, which PCRE will then call at specified\npoints during a matching operation. Details are given in the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.P\nThe global variable \\fBpcre_stack_guard\\fP initially contains NULL. It can be\nset by the caller to a function that is called by PCRE whenever it starts\nto compile a parenthesized part of a pattern. When parentheses are nested, PCRE\nuses recursive function calls, which use up the system stack. This function is\nprovided so that applications with restricted stacks can force a compilation\nerror if the stack runs out. The function should return zero if all is well, or\nnon-zero to force an error.\n.\n.\n.\\\" HTML <a name=\"newlines\"></a>\n.SH NEWLINES\n.rs\n.sp\nPCRE supports five different conventions for indicating line breaks in\nstrings: a single CR (carriage return) character, a single LF (linefeed)\ncharacter, the two-character sequence CRLF, any of the three preceding, or any\nUnicode newline sequence. The Unicode newline sequences are the three just\nmentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed,\nU+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS\n(paragraph separator, U+2029).\n.P\nEach of the first three conventions is used by at least one operating system as\nits standard newline sequence. When PCRE is built, a default can be specified.\nThe default default is LF, which is the Unix standard. When PCRE is run, the\ndefault can be overridden, either when a pattern is compiled, or when it is\nmatched.\n.P\nAt compile time, the newline convention can be specified by the \\fIoptions\\fP\nargument of \\fBpcre_compile()\\fP, or it can be specified by special text at the\nstart of the pattern itself; this overrides any other settings. See the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\npage for details of the special character sequences.\n.P\nIn the PCRE documentation the word \"newline\" is used to mean \"the character or\npair of characters that indicate a line break\". The choice of newline\nconvention affects the handling of the dot, circumflex, and dollar\nmetacharacters, the handling of #-comments in /x mode, and, when CRLF is a\nrecognized line ending sequence, the match position advancement for a\nnon-anchored pattern. There is more detail about this in the\n.\\\" HTML <a href=\"#execoptions\">\n.\\\" </a>\nsection on \\fBpcre_exec()\\fP options\n.\\\"\nbelow.\n.P\nThe choice of newline convention does not affect the interpretation of\nthe \\en or \\er escape sequences, nor does it affect what \\eR matches, which is\ncontrolled in a similar way, but by separate options.\n.\n.\n.SH MULTITHREADING\n.rs\n.sp\nThe PCRE functions can be used in multi-threading applications, with the\nproviso that the memory management functions pointed to by \\fBpcre_malloc\\fP,\n\\fBpcre_free\\fP, \\fBpcre_stack_malloc\\fP, and \\fBpcre_stack_free\\fP, and the\ncallout and stack-checking functions pointed to by \\fBpcre_callout\\fP and\n\\fBpcre_stack_guard\\fP, are shared by all threads.\n.P\nThe compiled form of a regular expression is not altered during matching, so\nthe same compiled pattern can safely be used by several threads at once.\n.P\nIf the just-in-time optimization feature is being used, it needs separate\nmemory stack areas for each thread. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for more details.\n.\n.\n.SH \"SAVING PRECOMPILED PATTERNS FOR LATER USE\"\n.rs\n.sp\nThe compiled form of a regular expression can be saved and re-used at a later\ntime, possibly by a different program, and even on a host other than the one on\nwhich it was compiled. Details are given in the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation, which includes a description of the\n\\fBpcre_pattern_to_host_byte_order()\\fP function. However, compiling a regular\nexpression with one version of PCRE for use with a different version is not\nguaranteed to work and may cause crashes.\n.\n.\n.SH \"CHECKING BUILD-TIME OPTIONS\"\n.rs\n.sp\n.B int pcre_config(int \\fIwhat\\fP, void *\\fIwhere\\fP);\n.PP\nThe function \\fBpcre_config()\\fP makes it possible for a PCRE client to\ndiscover which optional features have been compiled into the PCRE library. The\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation has more details about these optional features.\n.P\nThe first argument for \\fBpcre_config()\\fP is an integer, specifying which\ninformation is required; the second argument is a pointer to a variable into\nwhich the information is placed. The returned value is zero on success, or the\nnegative error code PCRE_ERROR_BADOPTION if the value in the first argument is\nnot recognized. The following information is available:\n.sp\n  PCRE_CONFIG_UTF8\n.sp\nThe output is an integer that is set to one if UTF-8 support is available;\notherwise it is set to zero. This value should normally be given to the 8-bit\nversion of this function, \\fBpcre_config()\\fP. If it is given to the 16-bit\nor 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n.sp\n  PCRE_CONFIG_UTF16\n.sp\nThe output is an integer that is set to one if UTF-16 support is available;\notherwise it is set to zero. This value should normally be given to the 16-bit\nversion of this function, \\fBpcre16_config()\\fP. If it is given to the 8-bit\nor 32-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n.sp\n  PCRE_CONFIG_UTF32\n.sp\nThe output is an integer that is set to one if UTF-32 support is available;\notherwise it is set to zero. This value should normally be given to the 32-bit\nversion of this function, \\fBpcre32_config()\\fP. If it is given to the 8-bit\nor 16-bit version of this function, the result is PCRE_ERROR_BADOPTION.\n.sp\n  PCRE_CONFIG_UNICODE_PROPERTIES\n.sp\nThe output is an integer that is set to one if support for Unicode character\nproperties is available; otherwise it is set to zero.\n.sp\n  PCRE_CONFIG_JIT\n.sp\nThe output is an integer that is set to one if support for just-in-time\ncompiling is available; otherwise it is set to zero.\n.sp\n  PCRE_CONFIG_JITTARGET\n.sp\nThe output is a pointer to a zero-terminated \"const char *\" string. If JIT\nsupport is available, the string contains the name of the architecture for\nwhich the JIT compiler is configured, for example \"x86 32bit (little endian +\nunaligned)\". If JIT support is not available, the result is NULL.\n.sp\n  PCRE_CONFIG_NEWLINE\n.sp\nThe output is an integer whose value specifies the default character sequence\nthat is recognized as meaning \"newline\". The values that are supported in\nASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for\nANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the\nsame values. However, the value for LF is normally 21, though some EBCDIC\nenvironments use 37. The corresponding values for CRLF are 3349 and 3365. The\ndefault should normally correspond to the standard sequence for your operating\nsystem.\n.sp\n  PCRE_CONFIG_BSR\n.sp\nThe output is an integer whose value indicates what character sequences the \\eR\nescape sequence matches by default. A value of 0 means that \\eR matches any\nUnicode line ending sequence; a value of 1 means that \\eR matches only CR, LF,\nor CRLF. The default can be overridden when a pattern is compiled or matched.\n.sp\n  PCRE_CONFIG_LINK_SIZE\n.sp\nThe output is an integer that contains the number of bytes used for internal\nlinkage in compiled regular expressions. For the 8-bit library, the value can\nbe 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still\na number of bytes. For the 32-bit library, the value is either 2 or 4 and is\nstill a number of bytes. The default value of 2 is sufficient for all but the\nmost massive patterns, since it allows the compiled pattern to be up to 64K in\nsize. Larger values allow larger regular expressions to be compiled, at the\nexpense of slower matching.\n.sp\n  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD\n.sp\nThe output is an integer that contains the threshold above which the POSIX\ninterface uses \\fBmalloc()\\fP for output vectors. Further details are given in\nthe\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\ndocumentation.\n.sp\n  PCRE_CONFIG_PARENS_LIMIT\n.sp\nThe output is a long integer that gives the maximum depth of nesting of\nparentheses (of any kind) in a pattern. This limit is imposed to cap the amount\nof system stack used when a pattern is compiled. It is specified when PCRE is\nbuilt; the default is 250. This limit does not take into account the stack that\nmay already be used by the calling application. For finer control over\ncompilation stack usage, you can set a pointer to an external checking function\nin \\fBpcre_stack_guard\\fP.\n.sp\n  PCRE_CONFIG_MATCH_LIMIT\n.sp\nThe output is a long integer that gives the default limit for the number of\ninternal matching function calls in a \\fBpcre_exec()\\fP execution. Further\ndetails are given with \\fBpcre_exec()\\fP below.\n.sp\n  PCRE_CONFIG_MATCH_LIMIT_RECURSION\n.sp\nThe output is a long integer that gives the default limit for the depth of\nrecursion when calling the internal matching function in a \\fBpcre_exec()\\fP\nexecution. Further details are given with \\fBpcre_exec()\\fP below.\n.sp\n  PCRE_CONFIG_STACKRECURSE\n.sp\nThe output is an integer that is set to one if internal recursion when running\n\\fBpcre_exec()\\fP is implemented by recursive function calls that use the stack\nto remember their state. This is the usual way that PCRE is compiled. The\noutput is zero if PCRE was compiled to use blocks of data on the heap instead\nof recursive function calls. In this case, \\fBpcre_stack_malloc\\fP and\n\\fBpcre_stack_free\\fP are called to manage memory blocks on the heap, thus\navoiding the use of the stack.\n.\n.\n.SH \"COMPILING A PATTERN\"\n.rs\n.sp\n.nf\n.B pcre *pcre_compile(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.sp\n.B pcre *pcre_compile2(const char *\\fIpattern\\fP, int \\fIoptions\\fP,\n.B \"     int *\\fIerrorcodeptr\\fP,\"\n.B \"     const char **\\fIerrptr\\fP, int *\\fIerroffset\\fP,\"\n.B \"     const unsigned char *\\fItableptr\\fP);\"\n.fi\n.P\nEither of the functions \\fBpcre_compile()\\fP or \\fBpcre_compile2()\\fP can be\ncalled to compile a pattern into an internal form. The only difference between\nthe two interfaces is that \\fBpcre_compile2()\\fP has an additional argument,\n\\fIerrorcodeptr\\fP, via which a numerical error code can be returned. To avoid\ntoo much repetition, we refer just to \\fBpcre_compile()\\fP below, but the\ninformation applies equally to \\fBpcre_compile2()\\fP.\n.P\nThe pattern is a C string terminated by a binary zero, and is passed in the\n\\fIpattern\\fP argument. A pointer to a single block of memory that is obtained\nvia \\fBpcre_malloc\\fP is returned. This contains the compiled code and related\ndata. The \\fBpcre\\fP type is defined for the returned block; this is a typedef\nfor a structure whose contents are not externally defined. It is up to the\ncaller to free the memory (via \\fBpcre_free\\fP) when it is no longer required.\n.P\nAlthough the compiled code of a PCRE regex is relocatable, that is, it does not\ndepend on memory location, the complete \\fBpcre\\fP data block is not\nfully relocatable, because it may contain a copy of the \\fItableptr\\fP\nargument, which is an address (see below).\n.P\nThe \\fIoptions\\fP argument contains various bit settings that affect the\ncompilation. It should be zero if no options are required. The available\noptions are described below. Some of them (in particular, those that are\ncompatible with Perl, but some others as well) can also be set and unset from\nwithin the pattern (see the detailed description in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation). For those options that can be different in different parts of\nthe pattern, the contents of the \\fIoptions\\fP argument specifies their\nsettings at the start of compilation and execution. The PCRE_ANCHORED,\nPCRE_BSR_\\fIxxx\\fP, PCRE_NEWLINE_\\fIxxx\\fP, PCRE_NO_UTF8_CHECK, and\nPCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at\ncompile time.\n.P\nIf \\fIerrptr\\fP is NULL, \\fBpcre_compile()\\fP returns NULL immediately.\nOtherwise, if compilation of a pattern fails, \\fBpcre_compile()\\fP returns\nNULL, and sets the variable pointed to by \\fIerrptr\\fP to point to a textual\nerror message. This is a static string that is part of the library. You must\nnot try to free it. Normally, the offset from the start of the pattern to the\ndata unit that was being processed when the error was discovered is placed in\nthe variable pointed to by \\fIerroffset\\fP, which must not be NULL (if it is,\nan immediate error is given). However, for an invalid UTF-8 or UTF-16 string,\nthe offset is that of the first data unit of the failing character.\n.P\nSome errors are not detected until the whole pattern has been scanned; in these\ncases, the offset passed back is the length of the pattern. Note that the\noffset is in data units, not characters, even in a UTF mode. It may sometimes\npoint into the middle of a UTF-8 or UTF-16 character.\n.P\nIf \\fBpcre_compile2()\\fP is used instead of \\fBpcre_compile()\\fP, and the\n\\fIerrorcodeptr\\fP argument is not NULL, a non-zero error code number is\nreturned via this argument in the event of an error. This is in addition to the\ntextual error message. Error codes and messages are listed below.\n.P\nIf the final argument, \\fItableptr\\fP, is NULL, PCRE uses a default set of\ncharacter tables that are built when PCRE is compiled, using the default C\nlocale. Otherwise, \\fItableptr\\fP must be an address that is the result of a\ncall to \\fBpcre_maketables()\\fP. This value is stored with the compiled\npattern, and used again by \\fBpcre_exec()\\fP and \\fBpcre_dfa_exec()\\fP when the\npattern is matched. For more discussion, see the section on locale support\nbelow.\n.P\nThis code fragment shows a typical straightforward call to \\fBpcre_compile()\\fP:\n.sp\n  pcre *re;\n  const char *error;\n  int erroffset;\n  re = pcre_compile(\n    \"^A.*Z\",          /* the pattern */\n    0,                /* default options */\n    &error,           /* for error message */\n    &erroffset,       /* for error offset */\n    NULL);            /* use default character tables */\n.sp\nThe following names for option bits are defined in the \\fBpcre.h\\fP header\nfile:\n.sp\n  PCRE_ANCHORED\n.sp\nIf this bit is set, the pattern is forced to be \"anchored\", that is, it is\nconstrained to match only at the first matching point in the string that is\nbeing searched (the \"subject string\"). This effect can also be achieved by\nappropriate constructs in the pattern itself, which is the only way to do it in\nPerl.\n.sp\n  PCRE_AUTO_CALLOUT\n.sp\nIf this bit is set, \\fBpcre_compile()\\fP automatically inserts callout items,\nall with number 255, before each pattern item. For discussion of the callout\nfacility, see the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.sp\n  PCRE_BSR_ANYCRLF\n  PCRE_BSR_UNICODE\n.sp\nThese options (which are mutually exclusive) control what the \\eR escape\nsequence matches. The choice is either to match only CR, LF, or CRLF, or to\nmatch any Unicode newline sequence. The default is specified when PCRE is\nbuilt. It can be overridden from within the pattern, or by setting an option\nwhen a compiled pattern is matched.\n.sp\n  PCRE_CASELESS\n.sp\nIf this bit is set, letters in the pattern match both upper and lower case\nletters. It is equivalent to Perl's /i option, and it can be changed within a\npattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the\nconcept of case for characters whose values are less than 128, so caseless\nmatching is always possible. For characters with higher values, the concept of\ncase is supported if PCRE is compiled with Unicode property support, but not\notherwise. If you want to use caseless matching for characters 128 and above,\nyou must ensure that PCRE is compiled with Unicode property support as well as\nwith UTF-8 support.\n.sp\n  PCRE_DOLLAR_ENDONLY\n.sp\nIf this bit is set, a dollar metacharacter in the pattern matches only at the\nend of the subject string. Without this option, a dollar also matches\nimmediately before a newline at the end of the string (but not before any other\nnewlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.\nThere is no equivalent to this option in Perl, and no way to set it within a\npattern.\n.sp\n  PCRE_DOTALL\n.sp\nIf this bit is set, a dot metacharacter in the pattern matches a character of\nany value, including one that indicates a newline. However, it only ever\nmatches one character, even if newlines are coded as CRLF. Without this option,\na dot does not match when the current position is at a newline. This option is\nequivalent to Perl's /s option, and it can be changed within a pattern by a\n(?s) option setting. A negative class such as [^a] always matches newline\ncharacters, independent of the setting of this option.\n.sp\n  PCRE_DUPNAMES\n.sp\nIf this bit is set, names used to identify capturing subpatterns need not be\nunique. This can be helpful for certain types of pattern when it is known that\nonly one instance of the named subpattern can ever be matched. There are more\ndetails of named subpatterns below; see also the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation.\n.sp\n  PCRE_EXTENDED\n.sp\nIf this bit is set, most white space characters in the pattern are totally\nignored except when escaped or inside a character class. However, white space\nis not allowed within sequences such as (?> that introduce various\nparenthesized subpatterns, nor within a numerical quantifier such as {1,3}.\nHowever, ignorable white space is permitted between an item and a following\nquantifier and between a quantifier and a following + that indicates\npossessiveness.\n.P\nWhite space did not used to include the VT character (code 11), because Perl\ndid not treat this character as white space. However, Perl changed at release\n5.18, so PCRE followed at release 8.34, and VT is now treated as white space.\n.P\nPCRE_EXTENDED also causes characters between an unescaped # outside a character\nclass and the next newline, inclusive, to be ignored. PCRE_EXTENDED is\nequivalent to Perl's /x option, and it can be changed within a pattern by a\n(?x) option setting.\n.P\nWhich characters are interpreted as newlines is controlled by the options\npassed to \\fBpcre_compile()\\fP or by a special sequence at the start of the\npattern, as described in the section entitled\n.\\\" HTML <a href=\"pcrepattern.html#newlines\">\n.\\\" </a>\n\"Newline conventions\"\n.\\\"\nin the \\fBpcrepattern\\fP documentation. Note that the end of this type of\ncomment is a literal newline sequence in the pattern; escape sequences that\nhappen to represent a newline do not count.\n.P\nThis option makes it possible to include comments inside complicated patterns.\nNote, however, that this applies only to data characters. White space characters\nmay never appear within special character sequences in a pattern, for example\nwithin the sequence (?( that introduces a conditional subpattern.\n.sp\n  PCRE_EXTRA\n.sp\nThis option was invented in order to turn on additional functionality of PCRE\nthat is incompatible with Perl, but it is currently of very little use. When\nset, any backslash in a pattern that is followed by a letter that has no\nspecial meaning causes an error, thus reserving these combinations for future\nexpansion. By default, as in Perl, a backslash followed by a letter with no\nspecial meaning is treated as a literal. (Perl can, however, be persuaded to\ngive an error for this, by running it with the -w option.) There are at present\nno other features controlled by this option. It can also be set by a (?X)\noption setting within a pattern.\n.sp\n  PCRE_FIRSTLINE\n.sp\nIf this option is set, an unanchored pattern is required to match before or at\nthe first newline in the subject string, though the matched text may continue\nover the newline.\n.sp\n  PCRE_JAVASCRIPT_COMPAT\n.sp\nIf this option is set, PCRE's behaviour is changed in some ways so that it is\ncompatible with JavaScript rather than Perl. The changes are as follows:\n.P\n(1) A lone closing square bracket in a pattern causes a compile-time error,\nbecause this is illegal in JavaScript (by default it is treated as a data\ncharacter). Thus, the pattern AB]CD becomes illegal when this option is set.\n.P\n(2) At run time, a back reference to an unset subpattern group matches an empty\nstring (by default this causes the current matching alternative to fail). A\npattern such as (\\e1)(a) succeeds when this option is set (assuming it can find\nan \"a\" in the subject), whereas it fails by default, for Perl compatibility.\n.P\n(3) \\eU matches an upper case \"U\" character; by default \\eU causes a compile\ntime error (Perl uses \\eU to upper case subsequent characters).\n.P\n(4) \\eu matches a lower case \"u\" character unless it is followed by four\nhexadecimal digits, in which case the hexadecimal number defines the code point\nto match. By default, \\eu causes a compile time error (Perl uses it to upper\ncase the following character).\n.P\n(5) \\ex matches a lower case \"x\" character unless it is followed by two\nhexadecimal digits, in which case the hexadecimal number defines the code point\nto match. By default, as in Perl, a hexadecimal number is always expected after\n\\ex, but it may have zero, one, or two digits (so, for example, \\exz matches a\nbinary zero character followed by z).\n.sp\n  PCRE_MULTILINE\n.sp\nBy default, for the purposes of matching \"start of line\" and \"end of line\",\nPCRE treats the subject string as consisting of a single line of characters,\neven if it actually contains newlines. The \"start of line\" metacharacter (^)\nmatches only at the start of the string, and the \"end of line\" metacharacter\n($) matches only at the end of the string, or before a terminating newline\n(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless\nPCRE_DOTALL is set, the \"any character\" metacharacter (.) does not match at a\nnewline. This behaviour (for ^, $, and dot) is the same as Perl.\n.P\nWhen PCRE_MULTILINE it is set, the \"start of line\" and \"end of line\" constructs\nmatch immediately following or immediately before internal newlines in the\nsubject string, respectively, as well as at the very start and end. This is\nequivalent to Perl's /m option, and it can be changed within a pattern by a\n(?m) option setting. If there are no newlines in a subject string, or no\noccurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.\n.sp\n  PCRE_NEVER_UTF\n.sp\nThis option locks out interpretation of the pattern as UTF-8 (or UTF-16 or\nUTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the\ncreator of the pattern from switching to UTF interpretation by starting the\npattern with (*UTF). This may be useful in applications that process patterns\nfrom external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also\ncauses an error.\n.sp\n  PCRE_NEWLINE_CR\n  PCRE_NEWLINE_LF\n  PCRE_NEWLINE_CRLF\n  PCRE_NEWLINE_ANYCRLF\n  PCRE_NEWLINE_ANY\n.sp\nThese options override the default newline definition that was chosen when PCRE\nwas built. Setting the first or the second specifies that a newline is\nindicated by a single character (CR or LF, respectively). Setting\nPCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character\nCRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three\npreceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies\nthat any Unicode newline sequence should be recognized.\n.P\nIn an ASCII/Unicode environment, the Unicode newline sequences are the three\njust mentioned, plus the single characters VT (vertical tab, U+000B), FF (form\nfeed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS\n(paragraph separator, U+2029). For the 8-bit library, the last two are\nrecognized only in UTF-8 mode.\n.P\nWhen PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for\nCR is 0x0d, the same as ASCII. However, the character code for LF is normally\n0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is\nnot LF is made to correspond to Unicode's NEL character. EBCDIC codes are all\nless than 256. For more details, see the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation.\n.P\nThe newline setting in the options word uses three bits that are treated\nas a number, giving eight possibilities. Currently only six are used (default\nplus the five values above). This means that if you set more than one newline\noption, the combination may or may not be sensible. For example,\nPCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but\nother combinations may yield unused numbers and cause an error.\n.P\nThe only time that a line break in a pattern is specially recognized when\ncompiling is when PCRE_EXTENDED is set. CR and LF are white space characters,\nand so are ignored in this mode. Also, an unescaped # outside a character class\nindicates a comment that lasts until after the next line break sequence. In\nother circumstances, line break sequences in patterns are treated as literal\ndata.\n.P\nThe newline option that is set at compile time becomes the default that is used\nfor \\fBpcre_exec()\\fP and \\fBpcre_dfa_exec()\\fP, but it can be overridden.\n.sp\n  PCRE_NO_AUTO_CAPTURE\n.sp\nIf this option is set, it disables the use of numbered capturing parentheses in\nthe pattern. Any opening parenthesis that is not followed by ? behaves as if it\nwere followed by ?: but named parentheses can still be used for capturing (and\nthey acquire numbers in the usual way). There is no equivalent of this option\nin Perl.\n.sp\n  PCRE_NO_AUTO_POSSESS\n.sp\nIf this option is set, it disables \"auto-possessification\". This is an\noptimization that, for example, turns a+b into a++b in order to avoid\nbacktracks into a+ that can never be successful. However, if callouts are in\nuse, auto-possessification means that some of them are never taken. You can set\nthis option if you want the matching functions to do a full unoptimized search\nand run all the callouts, but it is mainly provided for testing purposes.\n.sp\n  PCRE_NO_START_OPTIMIZE\n.sp\nThis is an option that acts at matching time; that is, it is really an option\nfor \\fBpcre_exec()\\fP or \\fBpcre_dfa_exec()\\fP. If it is set at compile time,\nit is remembered with the compiled pattern and assumed at matching time. This\nis necessary if you want to use JIT execution, because the JIT compiler needs\nto know whether or not this option is set. For details see the discussion of\nPCRE_NO_START_OPTIMIZE\n.\\\" HTML <a href=\"#execoptions\">\n.\\\" </a>\nbelow.\n.\\\"\n.sp\n  PCRE_UCP\n.sp\nThis option changes the way PCRE processes \\eB, \\eb, \\eD, \\ed, \\eS, \\es, \\eW,\n\\ew, and some of the POSIX character classes. By default, only ASCII characters\nare recognized, but if PCRE_UCP is set, Unicode properties are used instead to\nclassify characters. More details are given in the section on\n.\\\" HTML <a href=\"pcre.html#genericchartypes\">\n.\\\" </a>\ngeneric character types\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\npage. If you set PCRE_UCP, matching one of the items it affects takes much\nlonger. The option is available only if PCRE has been compiled with Unicode\nproperty support.\n.sp\n  PCRE_UNGREEDY\n.sp\nThis option inverts the \"greediness\" of the quantifiers so that they are not\ngreedy by default, but become greedy if followed by \"?\". It is not compatible\nwith Perl. It can also be set by a (?U) option setting within the pattern.\n.sp\n  PCRE_UTF8\n.sp\nThis option causes PCRE to regard both the pattern and the subject as strings\nof UTF-8 characters instead of single-byte strings. However, it is available\nonly when PCRE is built to include UTF support. If not, the use of this option\nprovokes an error. Details of how this option changes the behaviour of PCRE are\ngiven in the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage.\n.sp\n  PCRE_NO_UTF8_CHECK\n.sp\nWhen PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is\nautomatically checked. There is a discussion about the\n.\\\" HTML <a href=\"pcreunicode.html#utf8strings\">\n.\\\" </a>\nvalidity of UTF-8 strings\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage. If an invalid UTF-8 sequence is found, \\fBpcre_compile()\\fP returns an\nerror. If you already know that your pattern is valid, and you want to skip\nthis check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option.\nWhen it is set, the effect of passing an invalid UTF-8 string as a pattern is\nundefined. It may cause your program to crash or loop. Note that this option\ncan also be passed to \\fBpcre_exec()\\fP and \\fBpcre_dfa_exec()\\fP, to suppress\nthe validity checking of subject strings only. If the same string is being\nmatched many times, the option can be safely set for the second and subsequent\nmatchings to improve performance.\n.\n.\n.SH \"COMPILATION ERROR CODES\"\n.rs\n.sp\nThe following table lists the error codes than may be returned by\n\\fBpcre_compile2()\\fP, along with the error messages that may be returned by\nboth compiling functions. Note that error messages are always 8-bit ASCII\nstrings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes\nhave fallen out of use. To avoid confusion, they have not been re-used.\n.sp\n   0  no error\n   1  \\e at end of pattern\n   2  \\ec at end of pattern\n   3  unrecognized character follows \\e\n   4  numbers out of order in {} quantifier\n   5  number too big in {} quantifier\n   6  missing terminating ] for character class\n   7  invalid escape sequence in character class\n   8  range out of order in character class\n   9  nothing to repeat\n  10  [this code is not in use]\n  11  internal error: unexpected repeat\n  12  unrecognized character after (? or (?-\n  13  POSIX named classes are supported only within a class\n  14  missing )\n  15  reference to non-existent subpattern\n  16  erroffset passed as NULL\n  17  unknown option bit(s) set\n  18  missing ) after comment\n  19  [this code is not in use]\n  20  regular expression is too large\n  21  failed to get memory\n  22  unmatched parentheses\n  23  internal error: code overflow\n  24  unrecognized character after (?<\n  25  lookbehind assertion is not fixed length\n  26  malformed number or name after (?(\n  27  conditional group contains more than two branches\n  28  assertion expected after (?(\n  29  (?R or (?[+-]digits must be followed by )\n  30  unknown POSIX class name\n  31  POSIX collating elements are not supported\n  32  this version of PCRE is compiled without UTF support\n  33  [this code is not in use]\n  34  character value in \\ex{} or \\eo{} is too large\n  35  invalid condition (?(0)\n  36  \\eC not allowed in lookbehind assertion\n  37  PCRE does not support \\eL, \\el, \\eN{name}, \\eU, or \\eu\n  38  number after (?C is > 255\n  39  closing ) for (?C expected\n  40  recursive call could loop indefinitely\n  41  unrecognized character after (?P\n  42  syntax error in subpattern name (missing terminator)\n  43  two named subpatterns have the same name\n  44  invalid UTF-8 string (specifically UTF-8)\n  45  support for \\eP, \\ep, and \\eX has not been compiled\n  46  malformed \\eP or \\ep sequence\n  47  unknown property name after \\eP or \\ep\n  48  subpattern name is too long (maximum 32 characters)\n  49  too many named subpatterns (maximum 10000)\n  50  [this code is not in use]\n  51  octal value is greater than \\e377 in 8-bit non-UTF-8 mode\n  52  internal error: overran compiling workspace\n  53  internal error: previously-checked referenced subpattern\n        not found\n  54  DEFINE group contains more than one branch\n  55  repeating a DEFINE group is not allowed\n  56  inconsistent NEWLINE options\n  57  \\eg is not followed by a braced, angle-bracketed, or quoted\n        name/number or by a plain number\n  58  a numbered reference must not be zero\n  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\n  60  (*VERB) not recognized or malformed\n  61  number is too big\n  62  subpattern name expected\n  63  digit expected after (?+\n  64  ] is an invalid data character in JavaScript compatibility mode\n  65  different names for subpatterns of the same number are\n        not allowed\n  66  (*MARK) must have an argument\n  67  this version of PCRE is not compiled with Unicode property\n        support\n  68  \\ec must be followed by an ASCII character\n  69  \\ek is not followed by a braced, angle-bracketed, or quoted name\n  70  internal error: unknown opcode in find_fixedlength()\n  71  \\eN is not supported in a class\n  72  too many forward references\n  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\n  74  invalid UTF-16 string (specifically UTF-16)\n  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\n  76  character value in \\eu.... sequence is too large\n  77  invalid UTF-32 string (specifically UTF-32)\n  78  setting UTF is disabled by the application\n  79  non-hex character in \\ex{} (closing brace missing?)\n  80  non-octal character in \\eo{} (closing brace missing?)\n  81  missing opening brace after \\eo\n  82  parentheses are too deeply nested\n  83  invalid range in character class\n  84  group name must start with a non-digit\n  85  parentheses are too deeply nested (stack check)\n.sp\nThe numbers 32 and 10000 in errors 48 and 49 are defaults; different values may\nbe used if the limits were changed when PCRE was built.\n.\n.\n.\\\" HTML <a name=\"studyingapattern\"></a>\n.SH \"STUDYING A PATTERN\"\n.rs\n.sp\n.nf\n.B pcre_extra *pcre_study(const pcre *\\fIcode\\fP, int \\fIoptions\\fP,\n.B \"     const char **\\fIerrptr\\fP);\"\n.fi\n.PP\nIf a compiled pattern is going to be used several times, it is worth spending\nmore time analyzing it in order to speed up the time taken for matching. The\nfunction \\fBpcre_study()\\fP takes a pointer to a compiled pattern as its first\nargument. If studying the pattern produces additional information that will\nhelp speed up matching, \\fBpcre_study()\\fP returns a pointer to a\n\\fBpcre_extra\\fP block, in which the \\fIstudy_data\\fP field points to the\nresults of the study.\n.P\nThe returned value from \\fBpcre_study()\\fP can be passed directly to\n\\fBpcre_exec()\\fP or \\fBpcre_dfa_exec()\\fP. However, a \\fBpcre_extra\\fP block\nalso contains other fields that can be set by the caller before the block is\npassed; these are described\n.\\\" HTML <a href=\"#extradata\">\n.\\\" </a>\nbelow\n.\\\"\nin the section on matching a pattern.\n.P\nIf studying the pattern does not produce any useful information,\n\\fBpcre_study()\\fP returns NULL by default. In that circumstance, if the\ncalling program wants to pass any of the other fields to \\fBpcre_exec()\\fP or\n\\fBpcre_dfa_exec()\\fP, it must set up its own \\fBpcre_extra\\fP block. However,\nif \\fBpcre_study()\\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it\nreturns a \\fBpcre_extra\\fP block even if studying did not find any additional\ninformation. It may still return NULL, however, if an error occurs in\n\\fBpcre_study()\\fP.\n.P\nThe second argument of \\fBpcre_study()\\fP contains option bits. There are three\nfurther options in addition to PCRE_STUDY_EXTRA_NEEDED:\n.sp\n  PCRE_STUDY_JIT_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n.sp\nIf any of these are set, and the just-in-time compiler is available, the\npattern is further compiled into machine code that executes much faster than\nthe \\fBpcre_exec()\\fP interpretive matching function. If the just-in-time\ncompiler is not available, these options are ignored. All undefined bits in the\n\\fIoptions\\fP argument must be zero.\n.P\nJIT compilation is a heavyweight optimization. It can take some time for\npatterns to be analyzed, and for one-off matches and simple patterns the\nbenefit of faster execution might be offset by a much slower study time.\nNot all patterns can be optimized by the JIT compiler. For those that cannot be\nhandled, matching automatically falls back to the \\fBpcre_exec()\\fP\ninterpreter. For more details, see the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation.\n.P\nThe third argument for \\fBpcre_study()\\fP is a pointer for an error message. If\nstudying succeeds (even if no data is returned), the variable it points to is\nset to NULL. Otherwise it is set to point to a textual error message. This is a\nstatic string that is part of the library. You must not try to free it. You\nshould test the error pointer for NULL after calling \\fBpcre_study()\\fP, to be\nsure that it has run successfully.\n.P\nWhen you are finished with a pattern, you can free the memory used for the\nstudy data by calling \\fBpcre_free_study()\\fP. This function was added to the\nAPI for release 8.20. For earlier versions, the memory could be freed with\n\\fBpcre_free()\\fP, just like the pattern itself. This will still work in cases\nwhere JIT optimization is not used, but it is advisable to change to the new\nfunction when convenient.\n.P\nThis is a typical way in which \\fBpcre_study\\fP() is used (except that in a\nreal application there should be tests for errors):\n.sp\n  int rc;\n  pcre *re;\n  pcre_extra *sd;\n  re = pcre_compile(\"pattern\", 0, &error, &erroroffset, NULL);\n  sd = pcre_study(\n    re,             /* result of pcre_compile() */\n    0,              /* no options */\n    &error);        /* set to NULL or points to a message */\n  rc = pcre_exec(   /* see below for details of pcre_exec() options */\n    re, sd, \"subject\", 7, 0, 0, ovector, 30);\n  ...\n  pcre_free_study(sd);\n  pcre_free(re);\n.sp\nStudying a pattern does two things: first, a lower bound for the length of\nsubject string that is needed to match the pattern is computed. This does not\nmean that there are any strings of that length that match, but it does\nguarantee that no shorter strings match. The value is used to avoid wasting\ntime by trying to match strings that are shorter than the lower bound. You can\nfind out the value in a calling program via the \\fBpcre_fullinfo()\\fP function.\n.P\nStudying a pattern is also useful for non-anchored patterns that do not have a\nsingle fixed starting character. A bitmap of possible starting bytes is\ncreated. This speeds up finding a position in the subject at which to start\nmatching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256.\nIn 32-bit mode, the bitmap is used for 32-bit values less than 256.)\n.P\nThese two optimizations apply to both \\fBpcre_exec()\\fP and\n\\fBpcre_dfa_exec()\\fP, and the information is also used by the JIT compiler.\nThe optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option.\nYou might want to do this if your pattern contains callouts or (*MARK) and you\nwant to make use of these facilities in cases where matching fails.\n.P\nPCRE_NO_START_OPTIMIZE can be specified at either compile time or execution\ntime. However, if PCRE_NO_START_OPTIMIZE is passed to \\fBpcre_exec()\\fP, (that\nis, after any JIT compilation has happened) JIT execution is disabled. For JIT\nexecution to work with PCRE_NO_START_OPTIMIZE, the option must be set at\ncompile time.\n.P\nThere is a longer discussion of PCRE_NO_START_OPTIMIZE\n.\\\" HTML <a href=\"#execoptions\">\n.\\\" </a>\nbelow.\n.\\\"\n.\n.\n.\\\" HTML <a name=\"localesupport\"></a>\n.SH \"LOCALE SUPPORT\"\n.rs\n.sp\nPCRE handles caseless matching, and determines whether characters are letters,\ndigits, or whatever, by reference to a set of tables, indexed by character\ncode point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this\napplies only to characters with code points less than 256. By default,\nhigher-valued code points never match escapes such as \\ew or \\ed. However, if\nPCRE is built with Unicode property support, all characters can be tested with\n\\ep and \\eP, or, alternatively, the PCRE_UCP option can be set when a pattern\nis compiled; this causes \\ew and friends to use Unicode property support\ninstead of the built-in tables.\n.P\nThe use of locales with Unicode is discouraged. If you are handling characters\nwith code points greater than 128, you should either use Unicode support, or\nuse locales, but not try to mix the two.\n.P\nPCRE contains an internal set of tables that are used when the final argument\nof \\fBpcre_compile()\\fP is NULL. These are sufficient for many applications.\nNormally, the internal tables recognize only ASCII characters. However, when\nPCRE is built, it is possible to cause the internal tables to be rebuilt in the\ndefault \"C\" locale of the local system, which may cause them to be different.\n.P\nThe internal tables can always be overridden by tables supplied by the\napplication that calls PCRE. These may be created in a different locale from\nthe default. As more and more applications change to using Unicode, the need\nfor this locale support is expected to die away.\n.P\nExternal tables are built by calling the \\fBpcre_maketables()\\fP function,\nwhich has no arguments, in the relevant locale. The result can then be passed\nto \\fBpcre_compile()\\fP as often as necessary. For example, to build and use\ntables that are appropriate for the French locale (where accented characters\nwith values greater than 128 are treated as letters), the following code could\nbe used:\n.sp\n  setlocale(LC_CTYPE, \"fr_FR\");\n  tables = pcre_maketables();\n  re = pcre_compile(..., tables);\n.sp\nThe locale name \"fr_FR\" is used on Linux and other Unix-like systems; if you\nare using Windows, the name for the French locale is \"french\".\n.P\nWhen \\fBpcre_maketables()\\fP runs, the tables are built in memory that is\nobtained via \\fBpcre_malloc\\fP. It is the caller's responsibility to ensure\nthat the memory containing the tables remains available for as long as it is\nneeded.\n.P\nThe pointer that is passed to \\fBpcre_compile()\\fP is saved with the compiled\npattern, and the same tables are used via this pointer by \\fBpcre_study()\\fP\nand also by \\fBpcre_exec()\\fP and \\fBpcre_dfa_exec()\\fP. Thus, for any single\npattern, compilation, studying and matching all happen in the same locale, but\ndifferent patterns can be processed in different locales.\n.P\nIt is possible to pass a table pointer or NULL (indicating the use of the\ninternal tables) to \\fBpcre_exec()\\fP or \\fBpcre_dfa_exec()\\fP (see the\ndiscussion below in the section on matching a pattern). This facility is\nprovided for use with pre-compiled patterns that have been saved and reloaded.\nCharacter tables are not saved with patterns, so if a non-standard table was\nused at compile time, it must be provided again when the reloaded pattern is\nmatched. Attempting to use this facility to match a pattern in a different\nlocale from the one in which it was compiled is likely to lead to anomalous\n(usually incorrect) results.\n.\n.\n.\\\" HTML <a name=\"infoaboutpattern\"></a>\n.SH \"INFORMATION ABOUT A PATTERN\"\n.rs\n.sp\n.nf\n.B int pcre_fullinfo(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     int \\fIwhat\\fP, void *\\fIwhere\\fP);\"\n.fi\n.PP\nThe \\fBpcre_fullinfo()\\fP function returns information about a compiled\npattern. It replaces the \\fBpcre_info()\\fP function, which was removed from the\nlibrary at version 8.30, after more than 10 years of obsolescence.\n.P\nThe first argument for \\fBpcre_fullinfo()\\fP is a pointer to the compiled\npattern. The second argument is the result of \\fBpcre_study()\\fP, or NULL if\nthe pattern was not studied. The third argument specifies which piece of\ninformation is required, and the fourth argument is a pointer to a variable\nto receive the data. The yield of the function is zero for success, or one of\nthe following negative numbers:\n.sp\n  PCRE_ERROR_NULL           the argument \\fIcode\\fP was NULL\n                            the argument \\fIwhere\\fP was NULL\n  PCRE_ERROR_BADMAGIC       the \"magic number\" was not found\n  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different\n                            endianness\n  PCRE_ERROR_BADOPTION      the value of \\fIwhat\\fP was invalid\n  PCRE_ERROR_UNSET          the requested field is not set\n.sp\nThe \"magic number\" is placed at the start of each compiled pattern as an simple\ncheck against passing an arbitrary memory pointer. The endianness error can\noccur if a compiled pattern is saved and reloaded on a different host. Here is\na typical call of \\fBpcre_fullinfo()\\fP, to obtain the length of the compiled\npattern:\n.sp\n  int rc;\n  size_t length;\n  rc = pcre_fullinfo(\n    re,               /* result of pcre_compile() */\n    sd,               /* result of pcre_study(), or NULL */\n    PCRE_INFO_SIZE,   /* what is required */\n    &length);         /* where to put the data */\n.sp\nThe possible values for the third argument are defined in \\fBpcre.h\\fP, and are\nas follows:\n.sp\n  PCRE_INFO_BACKREFMAX\n.sp\nReturn the number of the highest back reference in the pattern. The fourth\nargument should point to an \\fBint\\fP variable. Zero is returned if there are\nno back references.\n.sp\n  PCRE_INFO_CAPTURECOUNT\n.sp\nReturn the number of capturing subpatterns in the pattern. The fourth argument\nshould point to an \\fBint\\fP variable.\n.sp\n  PCRE_INFO_DEFAULT_TABLES\n.sp\nReturn a pointer to the internal default character tables within PCRE. The\nfourth argument should point to an \\fBunsigned char *\\fP variable. This\ninformation call is provided for internal use by the \\fBpcre_study()\\fP\nfunction. External callers can cause PCRE to use its internal tables by passing\na NULL table pointer.\n.sp\n  PCRE_INFO_FIRSTBYTE (deprecated)\n.sp\nReturn information about the first data unit of any matched string, for a\nnon-anchored pattern. The name of this option refers to the 8-bit library,\nwhere data units are bytes. The fourth argument should point to an \\fBint\\fP\nvariable. Negative values are used for special cases. However, this means that\nwhen the 32-bit library is in non-UTF-32 mode, the full 32-bit range of\ncharacters cannot be returned. For this reason, this value is deprecated; use\nPCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead.\n.P\nIf there is a fixed first value, for example, the letter \"c\" from a pattern\nsuch as (cat|cow|coyote), its value is returned. In the 8-bit library, the\nvalue is always less than 256. In the 16-bit library the value can be up to\n0xffff. In the 32-bit library the value can be up to 0x10ffff.\n.P\nIf there is no fixed first value, and if either\n.sp\n(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\nstarts with \"^\", or\n.sp\n(b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not set\n(if it were set, the pattern would be anchored),\n.sp\n-1 is returned, indicating that the pattern matches only at the start of a\nsubject string or after any newline within the string. Otherwise -2 is\nreturned. For anchored patterns, -2 is returned.\n.sp\n  PCRE_INFO_FIRSTCHARACTER\n.sp\nReturn the value of the first data unit (non-UTF character) of any matched\nstring in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;\notherwise return 0. The fourth argument should point to an \\fBuint_t\\fP\nvariable.\n.P\nIn the 8-bit library, the value is always less than 256. In the 16-bit library\nthe value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value\ncan be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode.\n.sp\n  PCRE_INFO_FIRSTCHARACTERFLAGS\n.sp\nReturn information about the first data unit of any matched string, for a\nnon-anchored pattern. The fourth argument should point to an \\fBint\\fP\nvariable.\n.P\nIf there is a fixed first value, for example, the letter \"c\" from a pattern\nsuch as (cat|cow|coyote), 1 is returned, and the character value can be\nretrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and\nif either\n.sp\n(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\nstarts with \"^\", or\n.sp\n(b) every branch of the pattern starts with \".*\" and PCRE_DOTALL is not set\n(if it were set, the pattern would be anchored),\n.sp\n2 is returned, indicating that the pattern matches only at the start of a\nsubject string or after any newline within the string. Otherwise 0 is\nreturned. For anchored patterns, 0 is returned.\n.sp\n  PCRE_INFO_FIRSTTABLE\n.sp\nIf the pattern was studied, and this resulted in the construction of a 256-bit\ntable indicating a fixed set of values for the first data unit in any matching\nstring, a pointer to the table is returned. Otherwise NULL is returned. The\nfourth argument should point to an \\fBunsigned char *\\fP variable.\n.sp\n  PCRE_INFO_HASCRORLF\n.sp\nReturn 1 if the pattern contains any explicit matches for CR or LF characters,\notherwise 0. The fourth argument should point to an \\fBint\\fP variable. An\nexplicit match is either a literal CR or LF character, or \\er or \\en.\n.sp\n  PCRE_INFO_JCHANGED\n.sp\nReturn 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise\n0. The fourth argument should point to an \\fBint\\fP variable. (?J) and\n(?-J) set and unset the local PCRE_DUPNAMES option, respectively.\n.sp\n  PCRE_INFO_JIT\n.sp\nReturn 1 if the pattern was studied with one of the JIT options, and\njust-in-time compiling was successful. The fourth argument should point to an\n\\fBint\\fP variable. A return value of 0 means that JIT support is not available\nin this version of PCRE, or that the pattern was not studied with a JIT option,\nor that the JIT compiler could not handle this particular pattern. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for details of what can and cannot be handled.\n.sp\n  PCRE_INFO_JITSIZE\n.sp\nIf the pattern was successfully studied with a JIT option, return the size of\nthe JIT compiled code, otherwise return zero. The fourth argument should point\nto a \\fBsize_t\\fP variable.\n.sp\n  PCRE_INFO_LASTLITERAL\n.sp\nReturn the value of the rightmost literal data unit that must exist in any\nmatched string, other than at its start, if such a value has been recorded. The\nfourth argument should point to an \\fBint\\fP variable. If there is no such\nvalue, -1 is returned. For anchored patterns, a last literal value is recorded\nonly if it follows something of variable length. For example, for the pattern\n/^a\\ed+z\\ed+/ the returned value is \"z\", but for /^a\\edz\\ed/ the returned value\nis -1.\n.P\nSince for the 32-bit library using the non-UTF-32 mode, this function is unable\nto return the full 32-bit range of characters, this value is deprecated;\ninstead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should\nbe used.\n.sp\n  PCRE_INFO_MATCH_EMPTY\n.sp\nReturn 1 if the pattern can match an empty string, otherwise 0. The fourth\nargument should point to an \\fBint\\fP variable.\n.sp\n  PCRE_INFO_MATCHLIMIT\n.sp\nIf the pattern set a match limit by including an item of the form\n(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument\nshould point to an unsigned 32-bit integer. If no such value has been set, the\ncall to \\fBpcre_fullinfo()\\fP returns the error PCRE_ERROR_UNSET.\n.sp\n  PCRE_INFO_MAXLOOKBEHIND\n.sp\nReturn the number of characters (NB not data units) in the longest lookbehind\nassertion in the pattern. This information is useful when doing multi-segment\nmatching using the partial matching facilities. Note that the simple assertions\n\\eb and \\eB require a one-character lookbehind. \\eA also registers a\none-character lookbehind, though it does not actually inspect the previous\ncharacter. This is to ensure that at least one character from the old segment\nis retained when a new segment is processed. Otherwise, if there are no\nlookbehinds in the pattern, \\eA might match incorrectly at the start of a new\nsegment.\n.sp\n  PCRE_INFO_MINLENGTH\n.sp\nIf the pattern was studied and a minimum length for matching subject strings\nwas computed, its value is returned. Otherwise the returned value is -1. The\nvalue is a number of characters, which in UTF mode may be different from the\nnumber of data units. The fourth argument should point to an \\fBint\\fP\nvariable. A non-negative value is a lower bound to the length of any matching\nstring. There may not be any strings of that length that do actually match, but\nevery string that does match is at least that long.\n.sp\n  PCRE_INFO_NAMECOUNT\n  PCRE_INFO_NAMEENTRYSIZE\n  PCRE_INFO_NAMETABLE\n.sp\nPCRE supports the use of named as well as numbered capturing parentheses. The\nnames are just an additional way of identifying the parentheses, which still\nacquire numbers. Several convenience functions such as\n\\fBpcre_get_named_substring()\\fP are provided for extracting captured\nsubstrings by name. It is also possible to extract the data directly, by first\nconverting the name to a number in order to access the correct pointers in the\noutput vector (described with \\fBpcre_exec()\\fP below). To do the conversion,\nyou need to use the name-to-number map, which is described by these three\nvalues.\n.P\nThe map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives\nthe number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each\nentry; both of these return an \\fBint\\fP value. The entry size depends on the\nlength of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first\nentry of the table. This is a pointer to \\fBchar\\fP in the 8-bit library, where\nthe first two bytes of each entry are the number of the capturing parenthesis,\nmost significant byte first. In the 16-bit library, the pointer points to\n16-bit data units, the first of which contains the parenthesis number. In the\n32-bit library, the pointer points to 32-bit data units, the first of which\ncontains the parenthesis number. The rest of the entry is the corresponding\nname, zero terminated.\n.P\nThe names are in alphabetical order. If (?| is used to create multiple groups\nwith the same number, as described in the\n.\\\" HTML <a href=\"pcrepattern.html#dupsubpatternnumber\">\n.\\\" </a>\nsection on duplicate subpattern numbers\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\npage, the groups may be given the same name, but there is only one entry in the\ntable. Different names for groups of the same number are not permitted.\nDuplicate names for subpatterns with different numbers are permitted,\nbut only if PCRE_DUPNAMES is set. They appear in the table in the order in\nwhich they were found in the pattern. In the absence of (?| this is the order\nof increasing number; when (?| is used this is not necessarily the case because\nlater subpatterns may have lower numbers.\n.P\nAs a simple example of the name/number table, consider the following pattern\nafter compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white\nspace - including newlines - is ignored):\n.sp\n.\\\" JOIN\n  (?<date> (?<year>(\\ed\\ed)?\\ed\\ed) -\n  (?<month>\\ed\\ed) - (?<day>\\ed\\ed) )\n.sp\nThere are four named subpatterns, so the table has four entries, and each entry\nin the table is eight bytes long. The table is as follows, with non-printing\nbytes shows in hexadecimal, and undefined bytes shown as ??:\n.sp\n  00 01 d  a  t  e  00 ??\n  00 05 d  a  y  00 ?? ??\n  00 04 m  o  n  t  h  00\n  00 02 y  e  a  r  00 ??\n.sp\nWhen writing code to extract data from named subpatterns using the\nname-to-number map, remember that the length of the entries is likely to be\ndifferent for each compiled pattern.\n.sp\n  PCRE_INFO_OKPARTIAL\n.sp\nReturn 1 if the pattern can be used for partial matching with\n\\fBpcre_exec()\\fP, otherwise 0. The fourth argument should point to an\n\\fBint\\fP variable. From release 8.00, this always returns 1, because the\nrestrictions that previously applied to partial matching have been lifted. The\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation gives details of partial matching.\n.sp\n  PCRE_INFO_OPTIONS\n.sp\nReturn a copy of the options with which the pattern was compiled. The fourth\nargument should point to an \\fBunsigned long int\\fP variable. These option bits\nare those specified in the call to \\fBpcre_compile()\\fP, modified by any\ntop-level option settings at the start of the pattern itself. In other words,\nthey are the options that will be in force when matching starts. For example,\nif the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the\nresult is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.\n.P\nA pattern is automatically anchored by PCRE if all of its top-level\nalternatives begin with one of the following:\n.sp\n  ^     unless PCRE_MULTILINE is set\n  \\eA    always\n  \\eG    always\n.\\\" JOIN\n  .*    if PCRE_DOTALL is set and there are no back\n          references to the subpattern in which .* appears\n.sp\nFor such patterns, the PCRE_ANCHORED bit is set in the options returned by\n\\fBpcre_fullinfo()\\fP.\n.sp\n  PCRE_INFO_RECURSIONLIMIT\n.sp\nIf the pattern set a recursion limit by including an item of the form\n(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth\nargument should point to an unsigned 32-bit integer. If no such value has been\nset, the call to \\fBpcre_fullinfo()\\fP returns the error PCRE_ERROR_UNSET.\n.sp\n  PCRE_INFO_SIZE\n.sp\nReturn the size of the compiled pattern in bytes (for all three libraries). The\nfourth argument should point to a \\fBsize_t\\fP variable. This value does not\ninclude the size of the \\fBpcre\\fP structure that is returned by\n\\fBpcre_compile()\\fP. The value that is passed as the argument to\n\\fBpcre_malloc()\\fP when \\fBpcre_compile()\\fP is getting memory in which to\nplace the compiled data is the value returned by this option plus the size of\nthe \\fBpcre\\fP structure. Studying a compiled pattern, with or without JIT,\ndoes not alter the value returned by this option.\n.sp\n  PCRE_INFO_STUDYSIZE\n.sp\nReturn the size in bytes (for all three libraries) of the data block pointed to\nby the \\fIstudy_data\\fP field in a \\fBpcre_extra\\fP block. If \\fBpcre_extra\\fP\nis NULL, or there is no study data, zero is returned. The fourth argument\nshould point to a \\fBsize_t\\fP variable. The \\fIstudy_data\\fP field is set by\n\\fBpcre_study()\\fP to record information that will speed up matching (see the\nsection entitled\n.\\\" HTML <a href=\"#studyingapattern\">\n.\\\" </a>\n\"Studying a pattern\"\n.\\\"\nabove). The format of the \\fIstudy_data\\fP block is private, but its length\nis made available via this option so that it can be saved and restored (see the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation for details).\n.sp\n  PCRE_INFO_REQUIREDCHARFLAGS\n.sp\nReturns 1 if there is a rightmost literal data unit that must exist in any\nmatched string, other than at its start. The fourth argument should  point to\nan \\fBint\\fP variable. If there is no such value, 0 is returned. If returning\n1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR.\n.P\nFor anchored patterns, a last literal value is recorded only if it follows\nsomething of variable length. For example, for the pattern /^a\\ed+z\\ed+/ the\nreturned value 1 (with \"z\" returned from PCRE_INFO_REQUIREDCHAR), but for\n/^a\\edz\\ed/ the returned value is 0.\n.sp\n  PCRE_INFO_REQUIREDCHAR\n.sp\nReturn the value of the rightmost literal data unit that must exist in any\nmatched string, other than at its start, if such a value has been recorded. The\nfourth argument should point to an \\fBuint32_t\\fP variable. If there is no such\nvalue, 0 is returned.\n.\n.\n.SH \"REFERENCE COUNTS\"\n.rs\n.sp\n.B int pcre_refcount(pcre *\\fIcode\\fP, int \\fIadjust\\fP);\n.PP\nThe \\fBpcre_refcount()\\fP function is used to maintain a reference count in the\ndata block that contains a compiled pattern. It is provided for the benefit of\napplications that operate in an object-oriented manner, where different parts\nof the application may be using the same compiled pattern, but you want to free\nthe block when they are all done.\n.P\nWhen a pattern is compiled, the reference count field is initialized to zero.\nIt is changed only by calling this function, whose action is to add the\n\\fIadjust\\fP value (which may be positive or negative) to it. The yield of the\nfunction is the new value. However, the value of the count is constrained to\nlie between 0 and 65535, inclusive. If the new value is outside these limits,\nit is forced to the appropriate limit value.\n.P\nExcept when it is zero, the reference count is not correctly preserved if a\npattern is compiled on one host and then transferred to a host whose byte-order\nis different. (This seems a highly unlikely scenario.)\n.\n.\n.SH \"MATCHING A PATTERN: THE TRADITIONAL FUNCTION\"\n.rs\n.sp\n.nf\n.B int pcre_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP,\" int \\fIlength\\fP, int \\fIstartoffset\\fP,\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP);\"\n.fi\n.P\nThe function \\fBpcre_exec()\\fP is called to match a subject string against a\ncompiled pattern, which is passed in the \\fIcode\\fP argument. If the\npattern was studied, the result of the study should be passed in the\n\\fIextra\\fP argument. You can call \\fBpcre_exec()\\fP with the same \\fIcode\\fP\nand \\fIextra\\fP arguments as many times as you like, in order to match\ndifferent subject strings with the same pattern.\n.P\nThis function is the main matching facility of the library, and it operates in\na Perl-like manner. For specialist use there is also an alternative matching\nfunction, which is described\n.\\\" HTML <a href=\"#dfamatch\">\n.\\\" </a>\nbelow\n.\\\"\nin the section about the \\fBpcre_dfa_exec()\\fP function.\n.P\nIn most applications, the pattern will have been compiled (and optionally\nstudied) in the same process that calls \\fBpcre_exec()\\fP. However, it is\npossible to save compiled patterns and study data, and then use them later\nin different processes, possibly even on different hosts. For a discussion\nabout this, see the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation.\n.P\nHere is an example of a simple call to \\fBpcre_exec()\\fP:\n.sp\n  int rc;\n  int ovector[30];\n  rc = pcre_exec(\n    re,             /* result of pcre_compile() */\n    NULL,           /* we didn't study the pattern */\n    \"some string\",  /* the subject string */\n    11,             /* the length of the subject string */\n    0,              /* start at offset 0 in the subject */\n    0,              /* default options */\n    ovector,        /* vector of integers for substring information */\n    30);            /* number of elements (NOT size in bytes) */\n.\n.\n.\\\" HTML <a name=\"extradata\"></a>\n.SS \"Extra data for \\fBpcre_exec()\\fR\"\n.rs\n.sp\nIf the \\fIextra\\fP argument is not NULL, it must point to a \\fBpcre_extra\\fP\ndata block. The \\fBpcre_study()\\fP function returns such a block (when it\ndoesn't return NULL), but you can also create one for yourself, and pass\nadditional information in it. The \\fBpcre_extra\\fP block contains the following\nfields (not necessarily in this order):\n.sp\n  unsigned long int \\fIflags\\fP;\n  void *\\fIstudy_data\\fP;\n  void *\\fIexecutable_jit\\fP;\n  unsigned long int \\fImatch_limit\\fP;\n  unsigned long int \\fImatch_limit_recursion\\fP;\n  void *\\fIcallout_data\\fP;\n  const unsigned char *\\fItables\\fP;\n  unsigned char **\\fImark\\fP;\n.sp\nIn the 16-bit version of this structure, the \\fImark\\fP field has type\n\"PCRE_UCHAR16 **\".\n.sp\nIn the 32-bit version of this structure, the \\fImark\\fP field has type\n\"PCRE_UCHAR32 **\".\n.P\nThe \\fIflags\\fP field is used to specify which of the other fields are set. The\nflag bits are:\n.sp\n  PCRE_EXTRA_CALLOUT_DATA\n  PCRE_EXTRA_EXECUTABLE_JIT\n  PCRE_EXTRA_MARK\n  PCRE_EXTRA_MATCH_LIMIT\n  PCRE_EXTRA_MATCH_LIMIT_RECURSION\n  PCRE_EXTRA_STUDY_DATA\n  PCRE_EXTRA_TABLES\n.sp\nOther flag bits should be set to zero. The \\fIstudy_data\\fP field and sometimes\nthe \\fIexecutable_jit\\fP field are set in the \\fBpcre_extra\\fP block that is\nreturned by \\fBpcre_study()\\fP, together with the appropriate flag bits. You\nshould not set these yourself, but you may add to the block by setting other\nfields and their corresponding flag bits.\n.P\nThe \\fImatch_limit\\fP field provides a means of preventing PCRE from using up a\nvast amount of resources when running patterns that are not going to match,\nbut which have a very large number of possibilities in their search trees. The\nclassic example is a pattern that uses nested unlimited repeats.\n.P\nInternally, \\fBpcre_exec()\\fP uses a function called \\fBmatch()\\fP, which it\ncalls repeatedly (sometimes recursively). The limit set by \\fImatch_limit\\fP is\nimposed on the number of times this function is called during a match, which\nhas the effect of limiting the amount of backtracking that can take place. For\npatterns that are not anchored, the count restarts from zero for each position\nin the subject string.\n.P\nWhen \\fBpcre_exec()\\fP is called with a pattern that was successfully studied\nwith a JIT option, the way that the matching is executed is entirely different.\nHowever, there is still the possibility of runaway matching that goes on for a\nvery long time, and so the \\fImatch_limit\\fP value is also used in this case\n(but in a different way) to limit how long the matching can continue.\n.P\nThe default value for the limit can be set when PCRE is built; the default\ndefault is 10 million, which handles all but the most extreme cases. You can\noverride the default by suppling \\fBpcre_exec()\\fP with a \\fBpcre_extra\\fP\nblock in which \\fImatch_limit\\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in\nthe \\fIflags\\fP field. If the limit is exceeded, \\fBpcre_exec()\\fP returns\nPCRE_ERROR_MATCHLIMIT.\n.P\nA value for the match limit may also be supplied by an item at the start of a\npattern of the form\n.sp\n  (*LIMIT_MATCH=d)\n.sp\nwhere d is a decimal number. However, such a setting is ignored unless d is\nless than the limit set by the caller of \\fBpcre_exec()\\fP or, if no such limit\nis set, less than the default.\n.P\nThe \\fImatch_limit_recursion\\fP field is similar to \\fImatch_limit\\fP, but\ninstead of limiting the total number of times that \\fBmatch()\\fP is called, it\nlimits the depth of recursion. The recursion depth is a smaller number than the\ntotal number of calls, because not all calls to \\fBmatch()\\fP are recursive.\nThis limit is of use only if it is set smaller than \\fImatch_limit\\fP.\n.P\nLimiting the recursion depth limits the amount of machine stack that can be\nused, or, when PCRE has been compiled to use memory on the heap instead of the\nstack, the amount of heap memory that can be used. This limit is not relevant,\nand is ignored, when matching is done using JIT compiled code.\n.P\nThe default value for \\fImatch_limit_recursion\\fP can be set when PCRE is\nbuilt; the default default is the same value as the default for\n\\fImatch_limit\\fP. You can override the default by suppling \\fBpcre_exec()\\fP\nwith a \\fBpcre_extra\\fP block in which \\fImatch_limit_recursion\\fP is set, and\nPCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \\fIflags\\fP field. If the limit\nis exceeded, \\fBpcre_exec()\\fP returns PCRE_ERROR_RECURSIONLIMIT.\n.P\nA value for the recursion limit may also be supplied by an item at the start of\na pattern of the form\n.sp\n  (*LIMIT_RECURSION=d)\n.sp\nwhere d is a decimal number. However, such a setting is ignored unless d is\nless than the limit set by the caller of \\fBpcre_exec()\\fP or, if no such limit\nis set, less than the default.\n.P\nThe \\fIcallout_data\\fP field is used in conjunction with the \"callout\" feature,\nand is described in the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.P\nThe \\fItables\\fP field is provided for use with patterns that have been\npre-compiled using custom character tables, saved to disc or elsewhere, and\nthen reloaded, because the tables that were used to compile a pattern are not\nsaved with it. See the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation for a discussion of saving compiled patterns for later use. If\nNULL is passed using this mechanism, it forces PCRE's internal tables to be\nused.\n.P\n\\fBWarning:\\fP The tables that \\fBpcre_exec()\\fP uses must be the same as those\nthat were used when the pattern was compiled. If this is not the case, the\nbehaviour of \\fBpcre_exec()\\fP is undefined. Therefore, when a pattern is\ncompiled and matched in the same process, this field should never be set. In\nthis (the most common) case, the correct table pointer is automatically passed\nwith the compiled pattern from \\fBpcre_compile()\\fP to \\fBpcre_exec()\\fP.\n.P\nIf PCRE_EXTRA_MARK is set in the \\fIflags\\fP field, the \\fImark\\fP field must\nbe set to point to a suitable variable. If the pattern contains any\nbacktracking control verbs such as (*MARK:NAME), and the execution ends up with\na name to pass back, a pointer to the name string (zero terminated) is placed\nin the variable pointed to by the \\fImark\\fP field. The names are within the\ncompiled pattern; if you wish to retain such a name you must copy it before\nfreeing the memory of a compiled pattern. If there is no name to pass back, the\nvariable pointed to by the \\fImark\\fP field is set to NULL. For details of the\nbacktracking control verbs, see the section entitled\n.\\\" HTML <a href=\"pcrepattern#backtrackcontrol\">\n.\\\" </a>\n\"Backtracking control\"\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation.\n.\n.\n.\\\" HTML <a name=\"execoptions\"></a>\n.SS \"Option bits for \\fBpcre_exec()\\fP\"\n.rs\n.sp\nThe unused bits of the \\fIoptions\\fP argument for \\fBpcre_exec()\\fP must be\nzero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\\fIxxx\\fP,\nPCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,\nPCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and\nPCRE_PARTIAL_SOFT.\n.P\nIf the pattern was successfully studied with one of the just-in-time (JIT)\ncompile options, the only supported options for JIT execution are\nPCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY,\nPCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an\nunsupported option is used, JIT execution is disabled and the normal\ninterpretive code in \\fBpcre_exec()\\fP is run.\n.sp\n  PCRE_ANCHORED\n.sp\nThe PCRE_ANCHORED option limits \\fBpcre_exec()\\fP to matching at the first\nmatching position. If a pattern was compiled with PCRE_ANCHORED, or turned out\nto be anchored by virtue of its contents, it cannot be made unachored at\nmatching time.\n.sp\n  PCRE_BSR_ANYCRLF\n  PCRE_BSR_UNICODE\n.sp\nThese options (which are mutually exclusive) control what the \\eR escape\nsequence matches. The choice is either to match only CR, LF, or CRLF, or to\nmatch any Unicode newline sequence. These options override the choice that was\nmade or defaulted when the pattern was compiled.\n.sp\n  PCRE_NEWLINE_CR\n  PCRE_NEWLINE_LF\n  PCRE_NEWLINE_CRLF\n  PCRE_NEWLINE_ANYCRLF\n  PCRE_NEWLINE_ANY\n.sp\nThese options override the newline definition that was chosen or defaulted when\nthe pattern was compiled. For details, see the description of\n\\fBpcre_compile()\\fP above. During matching, the newline choice affects the\nbehaviour of the dot, circumflex, and dollar metacharacters. It may also alter\nthe way the match position is advanced after a match failure for an unanchored\npattern.\n.P\nWhen PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a\nmatch attempt for an unanchored pattern fails when the current position is at a\nCRLF sequence, and the pattern contains no explicit matches for CR or LF\ncharacters, the match position is advanced by two characters instead of one, in\nother words, to after the CRLF.\n.P\nThe above rule is a compromise that makes the most common cases work as\nexpected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not\nset), it does not match the string \"\\er\\enA\" because, after failing at the\nstart, it skips both the CR and the LF before retrying. However, the pattern\n[\\er\\en]A does match that string, because it contains an explicit CR or LF\nreference, and so advances only by one character after the first failure.\n.P\nAn explicit match for CR of LF is either a literal appearance of one of those\ncharacters, or one of the \\er or \\en escape sequences. Implicit matches such as\n[^X] do not count, nor does \\es (which includes CR and LF in the characters\nthat it matches).\n.P\nNotwithstanding the above, anomalous effects may still occur when CRLF is a\nvalid newline sequence and explicit \\er or \\en escapes appear in the pattern.\n.sp\n  PCRE_NOTBOL\n.sp\nThis option specifies that first character of the subject string is not the\nbeginning of a line, so the circumflex metacharacter should not match before\nit. Setting this without PCRE_MULTILINE (at compile time) causes circumflex\nnever to match. This option affects only the behaviour of the circumflex\nmetacharacter. It does not affect \\eA.\n.sp\n  PCRE_NOTEOL\n.sp\nThis option specifies that the end of the subject string is not the end of a\nline, so the dollar metacharacter should not match it nor (except in multiline\nmode) a newline immediately before it. Setting this without PCRE_MULTILINE (at\ncompile time) causes dollar never to match. This option affects only the\nbehaviour of the dollar metacharacter. It does not affect \\eZ or \\ez.\n.sp\n  PCRE_NOTEMPTY\n.sp\nAn empty string is not considered to be a valid match if this option is set. If\nthere are alternatives in the pattern, they are tried. If all the alternatives\nmatch the empty string, the entire match fails. For example, if the pattern\n.sp\n  a?b?\n.sp\nis applied to a string not beginning with \"a\" or \"b\", it matches an empty\nstring at the start of the subject. With PCRE_NOTEMPTY set, this match is not\nvalid, so PCRE searches further into the string for occurrences of \"a\" or \"b\".\n.sp\n  PCRE_NOTEMPTY_ATSTART\n.sp\nThis is like PCRE_NOTEMPTY, except that an empty string match that is not at\nthe start of the subject is permitted. If the pattern is anchored, such a match\ncan occur only if the pattern contains \\eK.\n.P\nPerl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it\ndoes make a special case of a pattern match of the empty string within its\n\\fBsplit()\\fP function, and when using the /g modifier. It is possible to\nemulate Perl's behaviour after matching a null string by first trying the match\nagain at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then\nif that fails, by advancing the starting offset (see below) and trying an\nordinary match again. There is some code that demonstrates how to do this in\nthe\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\nsample program. In the most general case, you have to check to see if the\nnewline convention recognizes CRLF as a newline, and if so, and the current\ncharacter is CR followed by LF, advance the starting offset by two characters\ninstead of one.\n.sp\n  PCRE_NO_START_OPTIMIZE\n.sp\nThere are a number of optimizations that \\fBpcre_exec()\\fP uses at the start of\na match, in order to speed up the process. For example, if it is known that an\nunanchored match must start with a specific character, it searches the subject\nfor that character, and fails immediately if it cannot find it, without\nactually running the main matching function. This means that a special item\nsuch as (*COMMIT) at the start of a pattern is not considered until after a\nsuitable starting point for the match has been found. Also, when callouts or\n(*MARK) items are in use, these \"start-up\" optimizations can cause them to be\nskipped if the pattern is never actually used. The start-up optimizations are\nin effect a pre-scan of the subject that takes place before the pattern is run.\n.P\nThe PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly\ncausing performance to suffer, but ensuring that in cases where the result is\n\"no match\", the callouts do occur, and that items such as (*COMMIT) and (*MARK)\nare considered at every possible starting position in the subject string. If\nPCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching\ntime. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it\nto \\fBpcre_exec()\\fP) disables JIT execution; in this situation, matching is\nalways done using interpretively.\n.P\nSetting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation.\nConsider the pattern\n.sp\n  (*COMMIT)ABC\n.sp\nWhen this is compiled, PCRE records the fact that a match must start with the\ncharacter \"A\". Suppose the subject string is \"DEFABC\". The start-up\noptimization scans along the subject, finds \"A\" and runs the first match\nattempt from there. The (*COMMIT) item means that the pattern must match the\ncurrent starting position, which in this case, it does. However, if the same\nmatch is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the\nsubject string does not happen. The first match attempt is run starting from\n\"D\" and when this fails, (*COMMIT) prevents any further matches being tried, so\nthe overall result is \"no match\". If the pattern is studied, more start-up\noptimizations may be used. For example, a minimum length for the subject may be\nrecorded. Consider the pattern\n.sp\n  (*MARK:A)(X|Y)\n.sp\nThe minimum length for a match is one character. If the subject is \"ABC\", there\nwill be attempts to match \"ABC\", \"BC\", \"C\", and then finally an empty string.\nIf the pattern is studied, the final attempt does not take place, because PCRE\nknows that the subject is too short, and so the (*MARK) is never encountered.\nIn this case, studying the pattern does not affect the overall match result,\nwhich is still \"no match\", but it does affect the auxiliary information that is\nreturned.\n.sp\n  PCRE_NO_UTF8_CHECK\n.sp\nWhen PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8\nstring is automatically checked when \\fBpcre_exec()\\fP is subsequently called.\nThe entire string is checked before any other processing takes place. The value\nof \\fIstartoffset\\fP is also checked to ensure that it points to the start of a\nUTF-8 character. There is a discussion about the\n.\\\" HTML <a href=\"pcreunicode.html#utf8strings\">\n.\\\" </a>\nvalidity of UTF-8 strings\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage. If an invalid sequence of bytes is found, \\fBpcre_exec()\\fP returns the\nerror PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a\ntruncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both\ncases, information about the precise nature of the error may also be returned\n(see the descriptions of these errors in the section entitled \\fIError return\nvalues from\\fP \\fBpcre_exec()\\fP\n.\\\" HTML <a href=\"#errorlist\">\n.\\\" </a>\nbelow).\n.\\\"\nIf \\fIstartoffset\\fP contains a value that does not point to the start of a\nUTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is\nreturned.\n.P\nIf you already know that your subject is valid, and you want to skip these\nchecks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when\ncalling \\fBpcre_exec()\\fP. You might want to do this for the second and\nsubsequent calls to \\fBpcre_exec()\\fP if you are making repeated calls to find\nall the matches in a single subject string. However, you should be sure that\nthe value of \\fIstartoffset\\fP points to the start of a character (or the end\nof the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an\ninvalid string as a subject or an invalid value of \\fIstartoffset\\fP is\nundefined. Your program may crash or loop.\n.sp\n  PCRE_PARTIAL_HARD\n  PCRE_PARTIAL_SOFT\n.sp\nThese options turn on the partial matching feature. For backwards\ncompatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match\noccurs if the end of the subject string is reached successfully, but there are\nnot enough subject characters to complete the match. If this happens when\nPCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by\ntesting any remaining alternatives. Only if no complete match can be found is\nPCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words,\nPCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match,\nbut only if no complete match can be found.\n.P\nIf PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a\npartial match is found, \\fBpcre_exec()\\fP immediately returns\nPCRE_ERROR_PARTIAL, without considering any other alternatives. In other words,\nwhen PCRE_PARTIAL_HARD is set, a partial match is considered to be more\nimportant that an alternative complete match.\n.P\nIn both cases, the portion of the string that was inspected when the partial\nmatch was found is set as the first matching string. There is a more detailed\ndiscussion of partial and multi-segment matching, with examples, in the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation.\n.\n.\n.SS \"The string to be matched by \\fBpcre_exec()\\fP\"\n.rs\n.sp\nThe subject string is passed to \\fBpcre_exec()\\fP as a pointer in\n\\fIsubject\\fP, a length in \\fIlength\\fP, and a starting offset in\n\\fIstartoffset\\fP. The units for \\fIlength\\fP and \\fIstartoffset\\fP are bytes\nfor the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit\ndata items for the 32-bit library.\n.P\nIf \\fIstartoffset\\fP is negative or greater than the length of the subject,\n\\fBpcre_exec()\\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is\nzero, the search for a match starts at the beginning of the subject, and this\nis by far the most common case. In UTF-8 or UTF-16 mode, the offset must point\nto the start of a character, or the end of the subject (in UTF-32 mode, one\ndata unit equals one character, so all offsets are valid). Unlike the pattern\nstring, the subject may contain binary zeroes.\n.P\nA non-zero starting offset is useful when searching for another match in the\nsame subject by calling \\fBpcre_exec()\\fP again after a previous success.\nSetting \\fIstartoffset\\fP differs from just passing over a shortened string and\nsetting PCRE_NOTBOL in the case of a pattern that begins with any kind of\nlookbehind. For example, consider the pattern\n.sp\n  \\eBiss\\eB\n.sp\nwhich finds occurrences of \"iss\" in the middle of words. (\\eB matches only if\nthe current position in the subject is not a word boundary.) When applied to\nthe string \"Mississipi\" the first call to \\fBpcre_exec()\\fP finds the first\noccurrence. If \\fBpcre_exec()\\fP is called again with just the remainder of the\nsubject, namely \"issipi\", it does not match, because \\eB is always false at the\nstart of the subject, which is deemed to be a word boundary. However, if\n\\fBpcre_exec()\\fP is passed the entire string again, but with \\fIstartoffset\\fP\nset to 4, it finds the second occurrence of \"iss\" because it is able to look\nbehind the starting point to discover that it is preceded by a letter.\n.P\nFinding all the matches in a subject is tricky when the pattern can match an\nempty string. It is possible to emulate Perl's /g behaviour by first trying the\nmatch again at the same offset, with the PCRE_NOTEMPTY_ATSTART and\nPCRE_ANCHORED options, and then if that fails, advancing the starting offset\nand trying an ordinary match again. There is some code that demonstrates how to\ndo this in the\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\nsample program. In the most general case, you have to check to see if the\nnewline convention recognizes CRLF as a newline, and if so, and the current\ncharacter is CR followed by LF, advance the starting offset by two characters\ninstead of one.\n.P\nIf a non-zero starting offset is passed when the pattern is anchored, one\nattempt to match at the given offset is made. This can only succeed if the\npattern does not require the match to be at the start of the subject.\n.\n.\n.SS \"How \\fBpcre_exec()\\fP returns captured substrings\"\n.rs\n.sp\nIn general, a pattern matches a certain portion of the subject, and in\naddition, further substrings from the subject may be picked out by parts of the\npattern. Following the usage in Jeffrey Friedl's book, this is called\n\"capturing\" in what follows, and the phrase \"capturing subpattern\" is used for\na fragment of a pattern that picks out a substring. PCRE supports several other\nkinds of parenthesized subpattern that do not cause substrings to be captured.\n.P\nCaptured substrings are returned to the caller via a vector of integers whose\naddress is passed in \\fIovector\\fP. The number of elements in the vector is\npassed in \\fIovecsize\\fP, which must be a non-negative number. \\fBNote\\fP: this\nargument is NOT the size of \\fIovector\\fP in bytes.\n.P\nThe first two-thirds of the vector is used to pass back captured substrings,\neach substring using a pair of integers. The remaining third of the vector is\nused as workspace by \\fBpcre_exec()\\fP while matching capturing subpatterns,\nand is not available for passing back information. The number passed in\n\\fIovecsize\\fP should always be a multiple of three. If it is not, it is\nrounded down.\n.P\nWhen a match is successful, information about captured substrings is returned\nin pairs of integers, starting at the beginning of \\fIovector\\fP, and\ncontinuing up to two-thirds of its length at the most. The first element of\neach pair is set to the offset of the first character in a substring, and the\nsecond is set to the offset of the first character after the end of a\nsubstring. These values are always data unit offsets, even in UTF mode. They\nare byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit\nlibrary, and 32-bit data item offsets in the 32-bit library. \\fBNote\\fP: they\nare not character counts.\n.P\nThe first pair of integers, \\fIovector[0]\\fP and \\fIovector[1]\\fP, identify the\nportion of the subject string matched by the entire pattern. The next pair is\nused for the first capturing subpattern, and so on. The value returned by\n\\fBpcre_exec()\\fP is one more than the highest numbered pair that has been set.\nFor example, if two substrings have been captured, the returned value is 3. If\nthere are no capturing subpatterns, the return value from a successful match is\n1, indicating that just the first pair of offsets has been set.\n.P\nIf a capturing subpattern is matched repeatedly, it is the last portion of the\nstring that it matched that is returned.\n.P\nIf the vector is too small to hold all the captured substring offsets, it is\nused as far as possible (up to two-thirds of its length), and the function\nreturns a value of zero. If neither the actual string matched nor any captured\nsubstrings are of interest, \\fBpcre_exec()\\fP may be called with \\fIovector\\fP\npassed as NULL and \\fIovecsize\\fP as zero. However, if the pattern contains\nback references and the \\fIovector\\fP is not big enough to remember the related\nsubstrings, PCRE has to get additional memory for use during matching. Thus it\nis usually advisable to supply an \\fIovector\\fP of reasonable size.\n.P\nThere are some cases where zero is returned (indicating vector overflow) when\nin fact the vector is exactly the right size for the final match. For example,\nconsider the pattern\n.sp\n  (a)(?:(b)c|bd)\n.sp\nIf a vector of 6 elements (allowing for only 1 captured substring) is given\nwith subject string \"abd\", \\fBpcre_exec()\\fP will try to set the second\ncaptured string, thereby recording a vector overflow, before failing to match\n\"c\" and backing up to try the second alternative. The zero return, however,\ndoes correctly indicate that the maximum number of slots (namely 2) have been\nfilled. In similar cases where there is temporary overflow, but the final\nnumber of used slots is actually less than the maximum, a non-zero value is\nreturned.\n.P\nThe \\fBpcre_fullinfo()\\fP function can be used to find out how many capturing\nsubpatterns there are in a compiled pattern. The smallest size for\n\\fIovector\\fP that will allow for \\fIn\\fP captured substrings, in addition to\nthe offsets of the substring matched by the whole pattern, is (\\fIn\\fP+1)*3.\n.P\nIt is possible for capturing subpattern number \\fIn+1\\fP to match some part of\nthe subject when subpattern \\fIn\\fP has not been used at all. For example, if\nthe string \"abc\" is matched against the pattern (a|(z))(bc) the return from the\nfunction is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this\nhappens, both values in the offset pairs corresponding to unused subpatterns\nare set to -1.\n.P\nOffset values that correspond to unused subpatterns at the end of the\nexpression are also set to -1. For example, if the string \"abc\" is matched\nagainst the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The\nreturn from the function is 2, because the highest used capturing subpattern\nnumber is 1, and the offsets for for the second and third capturing subpatterns\n(assuming the vector is large enough, of course) are set to -1.\n.P\n\\fBNote\\fP: Elements in the first two-thirds of \\fIovector\\fP that do not\ncorrespond to capturing parentheses in the pattern are never changed. That is,\nif a pattern contains \\fIn\\fP capturing parentheses, no more than\n\\fIovector[0]\\fP to \\fIovector[2n+1]\\fP are set by \\fBpcre_exec()\\fP. The other\nelements (in the first two-thirds) retain whatever values they previously had.\n.P\nSome convenience functions are provided for extracting the captured substrings\nas separate strings. These are described below.\n.\n.\n.\\\" HTML <a name=\"errorlist\"></a>\n.SS \"Error return values from \\fBpcre_exec()\\fP\"\n.rs\n.sp\nIf \\fBpcre_exec()\\fP fails, it returns a negative number. The following are\ndefined in the header file:\n.sp\n  PCRE_ERROR_NOMATCH        (-1)\n.sp\nThe subject string did not match the pattern.\n.sp\n  PCRE_ERROR_NULL           (-2)\n.sp\nEither \\fIcode\\fP or \\fIsubject\\fP was passed as NULL, or \\fIovector\\fP was\nNULL and \\fIovecsize\\fP was not zero.\n.sp\n  PCRE_ERROR_BADOPTION      (-3)\n.sp\nAn unrecognized bit was set in the \\fIoptions\\fP argument.\n.sp\n  PCRE_ERROR_BADMAGIC       (-4)\n.sp\nPCRE stores a 4-byte \"magic number\" at the start of the compiled code, to catch\nthe case when it is passed a junk pointer and to detect when a pattern that was\ncompiled in an environment of one endianness is run in an environment with the\nother endianness. This is the error that PCRE gives when the magic number is\nnot present.\n.sp\n  PCRE_ERROR_UNKNOWN_OPCODE (-5)\n.sp\nWhile running the pattern match, an unknown item was encountered in the\ncompiled pattern. This error could be caused by a bug in PCRE or by overwriting\nof the compiled pattern.\n.sp\n  PCRE_ERROR_NOMEMORY       (-6)\n.sp\nIf a pattern contains back references, but the \\fIovector\\fP that is passed to\n\\fBpcre_exec()\\fP is not big enough to remember the referenced substrings, PCRE\ngets a block of memory at the start of matching to use for this purpose. If the\ncall via \\fBpcre_malloc()\\fP fails, this error is given. The memory is\nautomatically freed at the end of matching.\n.P\nThis error is also given if \\fBpcre_stack_malloc()\\fP fails in\n\\fBpcre_exec()\\fP. This can happen only when PCRE has been compiled with\n\\fB--disable-stack-for-recursion\\fP.\n.sp\n  PCRE_ERROR_NOSUBSTRING    (-7)\n.sp\nThis error is used by the \\fBpcre_copy_substring()\\fP,\n\\fBpcre_get_substring()\\fP, and \\fBpcre_get_substring_list()\\fP functions (see\nbelow). It is never returned by \\fBpcre_exec()\\fP.\n.sp\n  PCRE_ERROR_MATCHLIMIT     (-8)\n.sp\nThe backtracking limit, as specified by the \\fImatch_limit\\fP field in a\n\\fBpcre_extra\\fP structure (or defaulted) was reached. See the description\nabove.\n.sp\n  PCRE_ERROR_CALLOUT        (-9)\n.sp\nThis error is never generated by \\fBpcre_exec()\\fP itself. It is provided for\nuse by callout functions that want to yield a distinctive error code. See the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation for details.\n.sp\n  PCRE_ERROR_BADUTF8        (-10)\n.sp\nA string that contains an invalid UTF-8 byte sequence was passed as a subject,\nand the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector\n(\\fIovecsize\\fP) is at least 2, the byte offset to the start of the the invalid\nUTF-8 character is placed in the first element, and a reason code is placed in\nthe second element. The reason codes are listed in the\n.\\\" HTML <a href=\"#badutf8reasons\">\n.\\\" </a>\nfollowing section.\n.\\\"\nFor backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a\ntruncated UTF-8 character at the end of the subject (reason codes 1 to 5),\nPCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8.\n.sp\n  PCRE_ERROR_BADUTF8_OFFSET (-11)\n.sp\nThe UTF-8 byte sequence that was passed as a subject was checked and found to\nbe valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of\n\\fIstartoffset\\fP did not point to the beginning of a UTF-8 character or the\nend of the subject.\n.sp\n  PCRE_ERROR_PARTIAL        (-12)\n.sp\nThe subject string did not match, but it did match partially. See the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation for details of partial matching.\n.sp\n  PCRE_ERROR_BADPARTIAL     (-13)\n.sp\nThis code is no longer in use. It was formerly returned when the PCRE_PARTIAL\noption was used with a compiled pattern containing items that were not\nsupported for partial matching. From release 8.00 onwards, there are no\nrestrictions on partial matching.\n.sp\n  PCRE_ERROR_INTERNAL       (-14)\n.sp\nAn unexpected internal error has occurred. This error could be caused by a bug\nin PCRE or by overwriting of the compiled pattern.\n.sp\n  PCRE_ERROR_BADCOUNT       (-15)\n.sp\nThis error is given if the value of the \\fIovecsize\\fP argument is negative.\n.sp\n  PCRE_ERROR_RECURSIONLIMIT (-21)\n.sp\nThe internal recursion limit, as specified by the \\fImatch_limit_recursion\\fP\nfield in a \\fBpcre_extra\\fP structure (or defaulted) was reached. See the\ndescription above.\n.sp\n  PCRE_ERROR_BADNEWLINE     (-23)\n.sp\nAn invalid combination of PCRE_NEWLINE_\\fIxxx\\fP options was given.\n.sp\n  PCRE_ERROR_BADOFFSET      (-24)\n.sp\nThe value of \\fIstartoffset\\fP was negative or greater than the length of the\nsubject, that is, the value in \\fIlength\\fP.\n.sp\n  PCRE_ERROR_SHORTUTF8      (-25)\n.sp\nThis error is returned instead of PCRE_ERROR_BADUTF8 when the subject string\nends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set.\nInformation about the failure is returned as for PCRE_ERROR_BADUTF8. It is in\nfact sufficient to detect this case, but this special error code for\nPCRE_PARTIAL_HARD precedes the implementation of returned information; it is\nretained for backwards compatibility.\n.sp\n  PCRE_ERROR_RECURSELOOP    (-26)\n.sp\nThis error is returned when \\fBpcre_exec()\\fP detects a recursion loop within\nthe pattern. Specifically, it means that either the whole pattern or a\nsubpattern has been called recursively for the second time at the same position\nin the subject string. Some simple patterns that might do this are detected and\nfaulted at compile time, but more complicated cases, in particular mutual\nrecursions between two different subpatterns, cannot be detected until run\ntime.\n.sp\n  PCRE_ERROR_JIT_STACKLIMIT (-27)\n.sp\nThis error is returned when a pattern that was successfully studied using a\nJIT compile option is being matched, but the memory available for the\njust-in-time processing stack is not large enough. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for more details.\n.sp\n  PCRE_ERROR_BADMODE        (-28)\n.sp\nThis error is given if a pattern that was compiled by the 8-bit library is\npassed to a 16-bit or 32-bit library function, or vice versa.\n.sp\n  PCRE_ERROR_BADENDIANNESS  (-29)\n.sp\nThis error is given if a pattern that was compiled and saved is reloaded on a\nhost with different endianness. The utility function\n\\fBpcre_pattern_to_host_byte_order()\\fP can be used to convert such a pattern\nso that it runs on the new host.\n.sp\n  PCRE_ERROR_JIT_BADOPTION\n.sp\nThis error is returned when a pattern that was successfully studied using a JIT\ncompile option is being matched, but the matching mode (partial or complete\nmatch) does not correspond to any JIT compilation mode. When the JIT fast path\nfunction is used, this error may be also given for invalid options. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for more details.\n.sp\n  PCRE_ERROR_BADLENGTH      (-32)\n.sp\nThis error is given if \\fBpcre_exec()\\fP is called with a negative value for\nthe \\fIlength\\fP argument.\n.P\nError numbers -16 to -20, -22, and 30 are not used by \\fBpcre_exec()\\fP.\n.\n.\n.\\\" HTML <a name=\"badutf8reasons\"></a>\n.SS \"Reason codes for invalid UTF-8 strings\"\n.rs\n.sp\nThis section applies only to the 8-bit library. The corresponding information\nfor the 16-bit and 32-bit libraries is given in the\n.\\\" HREF\n\\fBpcre16\\fP\n.\\\"\nand\n.\\\" HREF\n\\fBpcre32\\fP\n.\\\"\npages.\n.P\nWhen \\fBpcre_exec()\\fP returns either PCRE_ERROR_BADUTF8 or\nPCRE_ERROR_SHORTUTF8, and the size of the output vector (\\fIovecsize\\fP) is at\nleast 2, the offset of the start of the invalid UTF-8 character is placed in\nthe first output vector element (\\fIovector[0]\\fP) and a reason code is placed\nin the second element (\\fIovector[1]\\fP). The reason codes are given names in\nthe \\fBpcre.h\\fP header file:\n.sp\n  PCRE_UTF8_ERR1\n  PCRE_UTF8_ERR2\n  PCRE_UTF8_ERR3\n  PCRE_UTF8_ERR4\n  PCRE_UTF8_ERR5\n.sp\nThe string ends with a truncated UTF-8 character; the code specifies how many\nbytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be\nno longer than 4 bytes, the encoding scheme (originally defined by RFC 2279)\nallows for up to 6 bytes, and this is checked first; hence the possibility of\n4 or 5 missing bytes.\n.sp\n  PCRE_UTF8_ERR6\n  PCRE_UTF8_ERR7\n  PCRE_UTF8_ERR8\n  PCRE_UTF8_ERR9\n  PCRE_UTF8_ERR10\n.sp\nThe two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the\ncharacter do not have the binary value 0b10 (that is, either the most\nsignificant bit is 0, or the next bit is 1).\n.sp\n  PCRE_UTF8_ERR11\n  PCRE_UTF8_ERR12\n.sp\nA character that is valid by the RFC 2279 rules is either 5 or 6 bytes long;\nthese code points are excluded by RFC 3629.\n.sp\n  PCRE_UTF8_ERR13\n.sp\nA 4-byte character has a value greater than 0x10fff; these code points are\nexcluded by RFC 3629.\n.sp\n  PCRE_UTF8_ERR14\n.sp\nA 3-byte character has a value in the range 0xd800 to 0xdfff; this range of\ncode points are reserved by RFC 3629 for use with UTF-16, and so are excluded\nfrom UTF-8.\n.sp\n  PCRE_UTF8_ERR15\n  PCRE_UTF8_ERR16\n  PCRE_UTF8_ERR17\n  PCRE_UTF8_ERR18\n  PCRE_UTF8_ERR19\n.sp\nA 2-, 3-, 4-, 5-, or 6-byte character is \"overlong\", that is, it codes for a\nvalue that can be represented by fewer bytes, which is invalid. For example,\nthe two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just\none byte.\n.sp\n  PCRE_UTF8_ERR20\n.sp\nThe two most significant bits of the first byte of a character have the binary\nvalue 0b10 (that is, the most significant bit is 1 and the second is 0). Such a\nbyte can only validly occur as the second or subsequent byte of a multi-byte\ncharacter.\n.sp\n  PCRE_UTF8_ERR21\n.sp\nThe first byte of a character has the value 0xfe or 0xff. These values can\nnever occur in a valid UTF-8 string.\n.sp\n  PCRE_UTF8_ERR22\n.sp\nThis error code was formerly used when the presence of a so-called\n\"non-character\" caused an error. Unicode corrigendum #9 makes it clear that\nsuch characters should not cause a string to be rejected, and so this code is\nno longer in use and is never returned.\n.\n.\n.SH \"EXTRACTING CAPTURED SUBSTRINGS BY NUMBER\"\n.rs\n.sp\n.nf\n.B int pcre_copy_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP, char *\\fIbuffer\\fP,\"\n.B \"     int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre_get_substring(const char *\\fIsubject\\fP, int *\\fIovector\\fP,\n.B \"     int \\fIstringcount\\fP, int \\fIstringnumber\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.sp\n.B int pcre_get_substring_list(const char *\\fIsubject\\fP,\n.B \"     int *\\fIovector\\fP, int \\fIstringcount\\fP, const char ***\\fIlistptr\\fP);\"\n.fi\n.PP\nCaptured substrings can be accessed directly by using the offsets returned by\n\\fBpcre_exec()\\fP in \\fIovector\\fP. For convenience, the functions\n\\fBpcre_copy_substring()\\fP, \\fBpcre_get_substring()\\fP, and\n\\fBpcre_get_substring_list()\\fP are provided for extracting captured substrings\nas new, separate, zero-terminated strings. These functions identify substrings\nby number. The next section describes functions for extracting named\nsubstrings.\n.P\nA substring that contains a binary zero is correctly extracted and has a\nfurther zero added on the end, but the result is not, of course, a C string.\nHowever, you can process such a string by referring to the length that is\nreturned by \\fBpcre_copy_substring()\\fP and \\fBpcre_get_substring()\\fP.\nUnfortunately, the interface to \\fBpcre_get_substring_list()\\fP is not adequate\nfor handling strings containing binary zeros, because the end of the final\nstring is not independently indicated.\n.P\nThe first three arguments are the same for all three of these functions:\n\\fIsubject\\fP is the subject string that has just been successfully matched,\n\\fIovector\\fP is a pointer to the vector of integer offsets that was passed to\n\\fBpcre_exec()\\fP, and \\fIstringcount\\fP is the number of substrings that were\ncaptured by the match, including the substring that matched the entire regular\nexpression. This is the value returned by \\fBpcre_exec()\\fP if it is greater\nthan zero. If \\fBpcre_exec()\\fP returned zero, indicating that it ran out of\nspace in \\fIovector\\fP, the value passed as \\fIstringcount\\fP should be the\nnumber of elements in the vector divided by three.\n.P\nThe functions \\fBpcre_copy_substring()\\fP and \\fBpcre_get_substring()\\fP\nextract a single substring, whose number is given as \\fIstringnumber\\fP. A\nvalue of zero extracts the substring that matched the entire pattern, whereas\nhigher values extract the captured substrings. For \\fBpcre_copy_substring()\\fP,\nthe string is placed in \\fIbuffer\\fP, whose length is given by\n\\fIbuffersize\\fP, while for \\fBpcre_get_substring()\\fP a new block of memory is\nobtained via \\fBpcre_malloc\\fP, and its address is returned via\n\\fIstringptr\\fP. The yield of the function is the length of the string, not\nincluding the terminating zero, or one of these error codes:\n.sp\n  PCRE_ERROR_NOMEMORY       (-6)\n.sp\nThe buffer was too small for \\fBpcre_copy_substring()\\fP, or the attempt to get\nmemory failed for \\fBpcre_get_substring()\\fP.\n.sp\n  PCRE_ERROR_NOSUBSTRING    (-7)\n.sp\nThere is no substring whose number is \\fIstringnumber\\fP.\n.P\nThe \\fBpcre_get_substring_list()\\fP function extracts all available substrings\nand builds a list of pointers to them. All this is done in a single block of\nmemory that is obtained via \\fBpcre_malloc\\fP. The address of the memory block\nis returned via \\fIlistptr\\fP, which is also the start of the list of string\npointers. The end of the list is marked by a NULL pointer. The yield of the\nfunction is zero if all went well, or the error code\n.sp\n  PCRE_ERROR_NOMEMORY       (-6)\n.sp\nif the attempt to get the memory block failed.\n.P\nWhen any of these functions encounter a substring that is unset, which can\nhappen when capturing subpattern number \\fIn+1\\fP matches some part of the\nsubject, but subpattern \\fIn\\fP has not been used at all, they return an empty\nstring. This can be distinguished from a genuine zero-length substring by\ninspecting the appropriate offset in \\fIovector\\fP, which is negative for unset\nsubstrings.\n.P\nThe two convenience functions \\fBpcre_free_substring()\\fP and\n\\fBpcre_free_substring_list()\\fP can be used to free the memory returned by\na previous call of \\fBpcre_get_substring()\\fP or\n\\fBpcre_get_substring_list()\\fP, respectively. They do nothing more than call\nthe function pointed to by \\fBpcre_free\\fP, which of course could be called\ndirectly from a C program. However, PCRE is used in some situations where it is\nlinked via a special interface to another programming language that cannot use\n\\fBpcre_free\\fP directly; it is for these cases that the functions are\nprovided.\n.\n.\n.SH \"EXTRACTING CAPTURED SUBSTRINGS BY NAME\"\n.rs\n.sp\n.nf\n.B int pcre_get_stringnumber(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP);\"\n.sp\n.B int pcre_copy_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     char *\\fIbuffer\\fP, int \\fIbuffersize\\fP);\"\n.sp\n.B int pcre_get_named_substring(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIsubject\\fP, int *\\fIovector\\fP,\"\n.B \"     int \\fIstringcount\\fP, const char *\\fIstringname\\fP,\"\n.B \"     const char **\\fIstringptr\\fP);\"\n.fi\n.PP\nTo extract a substring by name, you first have to find associated number.\nFor example, for this pattern\n.sp\n  (a+)b(?<xxx>\\ed+)...\n.sp\nthe number of the subpattern called \"xxx\" is 2. If the name is known to be\nunique (PCRE_DUPNAMES was not set), you can find the number from the name by\ncalling \\fBpcre_get_stringnumber()\\fP. The first argument is the compiled\npattern, and the second is the name. The yield of the function is the\nsubpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of\nthat name.\n.P\nGiven the number, you can extract the substring directly, or use one of the\nfunctions described in the previous section. For convenience, there are also\ntwo functions that do the whole job.\n.P\nMost of the arguments of \\fBpcre_copy_named_substring()\\fP and\n\\fBpcre_get_named_substring()\\fP are the same as those for the similarly named\nfunctions that extract by number. As these are described in the previous\nsection, they are not re-described here. There are just two differences:\n.P\nFirst, instead of a substring number, a substring name is given. Second, there\nis an extra argument, given at the start, which is a pointer to the compiled\npattern. This is needed in order to gain access to the name-to-number\ntranslation table.\n.P\nThese functions call \\fBpcre_get_stringnumber()\\fP, and if it succeeds, they\nthen call \\fBpcre_copy_substring()\\fP or \\fBpcre_get_substring()\\fP, as\nappropriate. \\fBNOTE:\\fP If PCRE_DUPNAMES is set and there are duplicate names,\nthe behaviour may not be what you want (see the next section).\n.P\n\\fBWarning:\\fP If the pattern uses the (?| feature to set up multiple\nsubpatterns with the same number, as described in the\n.\\\" HTML <a href=\"pcrepattern.html#dupsubpatternnumber\">\n.\\\" </a>\nsection on duplicate subpattern numbers\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\npage, you cannot use names to distinguish the different subpatterns, because\nnames are not included in the compiled code. The matching process uses only\nnumbers. For this reason, the use of different names for subpatterns of the\nsame number causes an error at compile time.\n.\n.\n.SH \"DUPLICATE SUBPATTERN NAMES\"\n.rs\n.sp\n.nf\n.B int pcre_get_stringtable_entries(const pcre *\\fIcode\\fP,\n.B \"     const char *\\fIname\\fP, char **\\fIfirst\\fP, char **\\fIlast\\fP);\"\n.fi\n.PP\nWhen a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns\nare not required to be unique. (Duplicate names are always allowed for\nsubpatterns with the same number, created by using the (?| feature. Indeed, if\nsuch subpatterns are named, they are required to use the same names.)\n.P\nNormally, patterns with duplicate names are such that in any one match, only\none of the named subpatterns participates. An example is shown in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation.\n.P\nWhen duplicates are present, \\fBpcre_copy_named_substring()\\fP and\n\\fBpcre_get_named_substring()\\fP return the first substring corresponding to\nthe given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is\nreturned; no data is returned. The \\fBpcre_get_stringnumber()\\fP function\nreturns one of the numbers that are associated with the name, but it is not\ndefined which it is.\n.P\nIf you want to get full details of all captured substrings for a given name,\nyou must use the \\fBpcre_get_stringtable_entries()\\fP function. The first\nargument is the compiled pattern, and the second is the name. The third and\nfourth are pointers to variables which are updated by the function. After it\nhas run, they point to the first and last entries in the name-to-number table\nfor the given name. The function itself returns the length of each entry, or\nPCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is\ndescribed above in the section entitled \\fIInformation about a pattern\\fP\n.\\\" HTML <a href=\"#infoaboutpattern\">\n.\\\" </a>\nabove.\n.\\\"\nGiven all the relevant entries for the name, you can extract each of their\nnumbers, and hence the captured data, if any.\n.\n.\n.SH \"FINDING ALL POSSIBLE MATCHES\"\n.rs\n.sp\nThe traditional matching function uses a similar algorithm to Perl, which stops\nwhen it finds the first match, starting at a given point in the subject. If you\nwant to find all possible matches, or the longest possible match, consider\nusing the alternative matching function (see below) instead. If you cannot use\nthe alternative function, but still need to find all possible matches, you\ncan kludge it up by making use of the callout facility, which is described in\nthe\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.P\nWhat you have to do is to insert a callout right at the end of the pattern.\nWhen your callout function is called, extract and save the current matched\nsubstring. Then return 1, which forces \\fBpcre_exec()\\fP to backtrack and try\nother alternatives. Ultimately, when it runs out of matches, \\fBpcre_exec()\\fP\nwill yield PCRE_ERROR_NOMATCH.\n.\n.\n.SH \"OBTAINING AN ESTIMATE OF STACK USAGE\"\n.rs\n.sp\nMatching certain patterns using \\fBpcre_exec()\\fP can use a lot of process\nstack, which in certain environments can be rather limited in size. Some users\nfind it helpful to have an estimate of the amount of stack that is used by\n\\fBpcre_exec()\\fP, to help them set recursion limits, as described in the\n.\\\" HREF\n\\fBpcrestack\\fP\n.\\\"\ndocumentation. The estimate that is output by \\fBpcretest\\fP when called with\nthe \\fB-m\\fP and \\fB-C\\fP options is obtained by calling \\fBpcre_exec\\fP with\nthe values NULL, NULL, NULL, -999, and -999 for its first five arguments.\n.P\nNormally, if its first argument is NULL, \\fBpcre_exec()\\fP immediately returns\nthe negative error code PCRE_ERROR_NULL, but with this special combination of\narguments, it returns instead a negative number whose absolute value is the\napproximate stack frame size in bytes. (A negative number is used so that it is\nclear that no match has happened.) The value is approximate because in some\ncases, recursive calls to \\fBpcre_exec()\\fP occur when there are one or two\nadditional variables on the stack.\n.P\nIf PCRE has been compiled to use the heap instead of the stack for recursion,\nthe value returned is the size of each block that is obtained from the heap.\n.\n.\n.\\\" HTML <a name=\"dfamatch\"></a>\n.SH \"MATCHING A PATTERN: THE ALTERNATIVE FUNCTION\"\n.rs\n.sp\n.nf\n.B int pcre_dfa_exec(const pcre *\\fIcode\\fP, \"const pcre_extra *\\fIextra\\fP,\"\n.B \"     const char *\\fIsubject\\fP, int \\fIlength\\fP, int \\fIstartoffset\\fP,\"\n.B \"     int \\fIoptions\\fP, int *\\fIovector\\fP, int \\fIovecsize\\fP,\"\n.B \"     int *\\fIworkspace\\fP, int \\fIwscount\\fP);\"\n.fi\n.P\nThe function \\fBpcre_dfa_exec()\\fP is called to match a subject string against\na compiled pattern, using a matching algorithm that scans the subject string\njust once, and does not backtrack. This has different characteristics to the\nnormal algorithm, and is not compatible with Perl. Some of the features of PCRE\npatterns are not supported. Nevertheless, there are times when this kind of\nmatching can be useful. For a discussion of the two matching algorithms, and a\nlist of features that \\fBpcre_dfa_exec()\\fP does not support, see the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\ndocumentation.\n.P\nThe arguments for the \\fBpcre_dfa_exec()\\fP function are the same as for\n\\fBpcre_exec()\\fP, plus two extras. The \\fIovector\\fP argument is used in a\ndifferent way, and this is described below. The other common arguments are used\nin the same way as for \\fBpcre_exec()\\fP, so their description is not repeated\nhere.\n.P\nThe two additional arguments provide workspace for the function. The workspace\nvector should contain at least 20 elements. It is used for keeping track of\nmultiple paths through the pattern tree. More workspace will be needed for\npatterns and subjects where there are a lot of potential matches.\n.P\nHere is an example of a simple call to \\fBpcre_dfa_exec()\\fP:\n.sp\n  int rc;\n  int ovector[10];\n  int wspace[20];\n  rc = pcre_dfa_exec(\n    re,             /* result of pcre_compile() */\n    NULL,           /* we didn't study the pattern */\n    \"some string\",  /* the subject string */\n    11,             /* the length of the subject string */\n    0,              /* start at offset 0 in the subject */\n    0,              /* default options */\n    ovector,        /* vector of integers for substring information */\n    10,             /* number of elements (NOT size in bytes) */\n    wspace,         /* working space vector */\n    20);            /* number of elements (NOT size in bytes) */\n.\n.SS \"Option bits for \\fBpcre_dfa_exec()\\fP\"\n.rs\n.sp\nThe unused bits of the \\fIoptions\\fP argument for \\fBpcre_dfa_exec()\\fP must be\nzero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\\fIxxx\\fP,\nPCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,\nPCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE,\nPCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART.\nAll but the last four of these are exactly the same as for \\fBpcre_exec()\\fP,\nso their description is not repeated here.\n.sp\n  PCRE_PARTIAL_HARD\n  PCRE_PARTIAL_SOFT\n.sp\nThese have the same general effect as they do for \\fBpcre_exec()\\fP, but the\ndetails are slightly different. When PCRE_PARTIAL_HARD is set for\n\\fBpcre_dfa_exec()\\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject\nis reached and there is still at least one matching possibility that requires\nadditional characters. This happens even if some complete matches have also\nbeen found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH\nis converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,\nthere have been no complete matches, but there is still at least one matching\npossibility. The portion of the string that was inspected when the longest\npartial match was found is set as the first matching string in both cases.\nThere is a more detailed discussion of partial and multi-segment matching, with\nexamples, in the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation.\n.sp\n  PCRE_DFA_SHORTEST\n.sp\nSetting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as\nsoon as it has found one match. Because of the way the alternative algorithm\nworks, this is necessarily the shortest possible match at the first possible\nmatching point in the subject string.\n.sp\n  PCRE_DFA_RESTART\n.sp\nWhen \\fBpcre_dfa_exec()\\fP returns a partial match, it is possible to call it\nagain, with additional subject characters, and have it continue with the same\nmatch. The PCRE_DFA_RESTART option requests this action; when it is set, the\n\\fIworkspace\\fP and \\fIwscount\\fP options must reference the same vector as\nbefore because data about the match so far is left in them after a partial\nmatch. There is more discussion of this facility in the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation.\n.\n.\n.SS \"Successful returns from \\fBpcre_dfa_exec()\\fP\"\n.rs\n.sp\nWhen \\fBpcre_dfa_exec()\\fP succeeds, it may have matched more than one\nsubstring in the subject. Note, however, that all the matches from one run of\nthe function start at the same point in the subject. The shorter matches are\nall initial substrings of the longer matches. For example, if the pattern\n.sp\n  <.*>\n.sp\nis matched against the string\n.sp\n  This is <something> <something else> <something further> no more\n.sp\nthe three matched strings are\n.sp\n  <something>\n  <something> <something else>\n  <something> <something else> <something further>\n.sp\nOn success, the yield of the function is a number greater than zero, which is\nthe number of matched substrings. The substrings themselves are returned in\n\\fIovector\\fP. Each string uses two elements; the first is the offset to the\nstart, and the second is the offset to the end. In fact, all the strings have\nthe same start offset. (Space could have been saved by giving this only once,\nbut it was decided to retain some compatibility with the way \\fBpcre_exec()\\fP\nreturns data, even though the meaning of the strings is different.)\n.P\nThe strings are returned in reverse order of length; that is, the longest\nmatching string is given first. If there were too many matches to fit into\n\\fIovector\\fP, the yield of the function is zero, and the vector is filled with\nthe longest matches. Unlike \\fBpcre_exec()\\fP, \\fBpcre_dfa_exec()\\fP can use\nthe entire \\fIovector\\fP for returning matched strings.\n.P\nNOTE: PCRE's \"auto-possessification\" optimization usually applies to character\nrepeats at the end of a pattern (as well as internally). For example, the\npattern \"a\\ed+\" is compiled as if it were \"a\\ed++\" because there is no point\neven considering the possibility of backtracking into the repeated digits. For\nDFA matching, this means that only one possible match is found. If you really\ndo want multiple matches in such cases, either use an ungreedy repeat\n(\"a\\ed+?\") or set the PCRE_NO_AUTO_POSSESS option when compiling.\n.\n.\n.SS \"Error returns from \\fBpcre_dfa_exec()\\fP\"\n.rs\n.sp\nThe \\fBpcre_dfa_exec()\\fP function returns a negative number when it fails.\nMany of the errors are the same as for \\fBpcre_exec()\\fP, and these are\ndescribed\n.\\\" HTML <a href=\"#errorlist\">\n.\\\" </a>\nabove.\n.\\\"\nThere are in addition the following errors that are specific to\n\\fBpcre_dfa_exec()\\fP:\n.sp\n  PCRE_ERROR_DFA_UITEM      (-16)\n.sp\nThis return is given if \\fBpcre_dfa_exec()\\fP encounters an item in the pattern\nthat it does not support, for instance, the use of \\eC or a back reference.\n.sp\n  PCRE_ERROR_DFA_UCOND      (-17)\n.sp\nThis return is given if \\fBpcre_dfa_exec()\\fP encounters a condition item that\nuses a back reference for the condition, or a test for recursion in a specific\ngroup. These are not supported.\n.sp\n  PCRE_ERROR_DFA_UMLIMIT    (-18)\n.sp\nThis return is given if \\fBpcre_dfa_exec()\\fP is called with an \\fIextra\\fP\nblock that contains a setting of the \\fImatch_limit\\fP or\n\\fImatch_limit_recursion\\fP fields. This is not supported (these fields are\nmeaningless for DFA matching).\n.sp\n  PCRE_ERROR_DFA_WSSIZE     (-19)\n.sp\nThis return is given if \\fBpcre_dfa_exec()\\fP runs out of space in the\n\\fIworkspace\\fP vector.\n.sp\n  PCRE_ERROR_DFA_RECURSE    (-20)\n.sp\nWhen a recursive subpattern is processed, the matching function calls itself\nrecursively, using private vectors for \\fIovector\\fP and \\fIworkspace\\fP. This\nerror is given if the output vector is not large enough. This should be\nextremely rare, as a vector of size 1000 is used.\n.sp\n  PCRE_ERROR_DFA_BADRESTART (-30)\n.sp\nWhen \\fBpcre_dfa_exec()\\fP is called with the \\fBPCRE_DFA_RESTART\\fP option,\nsome plausibility checks are made on the contents of the workspace, which\nshould contain data about the previous partial match. If any of these checks\nfail, this error is given.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcre16\\fP(3), \\fBpcre32\\fP(3), \\fBpcrebuild\\fP(3), \\fBpcrecallout\\fP(3),\n\\fBpcrecpp(3)\\fP(3), \\fBpcrematching\\fP(3), \\fBpcrepartial\\fP(3),\n\\fBpcreposix\\fP(3), \\fBpcreprecompile\\fP(3), \\fBpcresample\\fP(3),\n\\fBpcrestack\\fP(3).\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 18 December 2015\nCopyright (c) 1997-2015 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrebuild.3",
    "content": ".TH PCREBUILD 3 \"12 May 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.\n.\n.SH \"BUILDING PCRE\"\n.rs\n.sp\nPCRE is distributed with a \\fBconfigure\\fP script that can be used to build the\nlibrary in Unix-like environments using the applications known as Autotools.\nAlso in the distribution are files to support building using \\fBCMake\\fP\ninstead of \\fBconfigure\\fP. The text file\n.\\\" HTML <a href=\"README.txt\">\n.\\\" </a>\n\\fBREADME\\fP\n.\\\"\ncontains general information about building with Autotools (some of which is\nrepeated below), and also has some comments about building on various operating\nsystems. There is a lot more information about building PCRE without using\nAutotools (including information about using \\fBCMake\\fP and building \"by\nhand\") in the text file called\n.\\\" HTML <a href=\"NON-AUTOTOOLS-BUILD.txt\">\n.\\\" </a>\n\\fBNON-AUTOTOOLS-BUILD\\fP.\n.\\\"\nYou should consult this file as well as the\n.\\\" HTML <a href=\"README.txt\">\n.\\\" </a>\n\\fBREADME\\fP\n.\\\"\nfile if you are building in a non-Unix-like environment.\n.\n.\n.SH \"PCRE BUILD-TIME OPTIONS\"\n.rs\n.sp\nThe rest of this document describes the optional features of PCRE that can be\nselected when the library is compiled. It assumes use of the \\fBconfigure\\fP\nscript, where the optional features are selected or deselected by providing\noptions to \\fBconfigure\\fP before running the \\fBmake\\fP command. However, the\nsame options can be selected in both Unix-like and non-Unix-like environments\nusing the GUI facility of \\fBcmake-gui\\fP if you are using \\fBCMake\\fP instead\nof \\fBconfigure\\fP to build PCRE.\n.P\nIf you are not using Autotools or \\fBCMake\\fP, option selection can be done by\nediting the \\fBconfig.h\\fP file, or by passing parameter settings to the\ncompiler, as described in\n.\\\" HTML <a href=\"NON-AUTOTOOLS-BUILD.txt\">\n.\\\" </a>\n\\fBNON-AUTOTOOLS-BUILD\\fP.\n.\\\"\n.P\nThe complete list of options for \\fBconfigure\\fP (which includes the standard\nones such as the selection of the installation directory) can be obtained by\nrunning\n.sp\n  ./configure --help\n.sp\nThe following sections include descriptions of options whose names begin with\n--enable or --disable. These settings specify changes to the defaults for the\n\\fBconfigure\\fP command. Because of the way that \\fBconfigure\\fP works,\n--enable and --disable always come in pairs, so the complementary option always\nexists as well, but as it specifies the default, it is not described.\n.\n.\n.SH \"BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES\"\n.rs\n.sp\nBy default, a library called \\fBlibpcre\\fP is built, containing functions that\ntake string arguments contained in vectors of bytes, either as single-byte\ncharacters, or interpreted as UTF-8 strings. You can also build a separate\nlibrary, called \\fBlibpcre16\\fP, in which strings are contained in vectors of\n16-bit data units and interpreted either as single-unit characters or UTF-16\nstrings, by adding\n.sp\n  --enable-pcre16\n.sp\nto the \\fBconfigure\\fP command. You can also build yet another separate\nlibrary, called \\fBlibpcre32\\fP, in which strings are contained in vectors of\n32-bit data units and interpreted either as single-unit characters or UTF-32\nstrings, by adding\n.sp\n  --enable-pcre32\n.sp\nto the \\fBconfigure\\fP command. If you do not want the 8-bit library, add\n.sp\n  --disable-pcre8\n.sp\nas well. At least one of the three libraries must be built. Note that the C++\nand POSIX wrappers are for the 8-bit library only, and that \\fBpcregrep\\fP is\nan 8-bit program. None of these are built if you select only the 16-bit or\n32-bit libraries.\n.\n.\n.SH \"BUILDING SHARED AND STATIC LIBRARIES\"\n.rs\n.sp\nThe Autotools PCRE building process uses \\fBlibtool\\fP to build both shared and\nstatic libraries by default. You can suppress one of these by adding one of\n.sp\n  --disable-shared\n  --disable-static\n.sp\nto the \\fBconfigure\\fP command, as required.\n.\n.\n.SH \"C++ SUPPORT\"\n.rs\n.sp\nBy default, if the 8-bit library is being built, the \\fBconfigure\\fP script\nwill search for a C++ compiler and C++ header files. If it finds them, it\nautomatically builds the C++ wrapper library (which supports only 8-bit\nstrings). You can disable this by adding\n.sp\n  --disable-cpp\n.sp\nto the \\fBconfigure\\fP command.\n.\n.\n.SH \"UTF-8, UTF-16 AND UTF-32 SUPPORT\"\n.rs\n.sp\nTo build PCRE with support for UTF Unicode character strings, add\n.sp\n  --enable-utf\n.sp\nto the \\fBconfigure\\fP command. This setting applies to all three libraries,\nadding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit\nlibrary, and support for UTF-32 to the to the 32-bit library. There are no\nseparate options for enabling UTF-8, UTF-16 and UTF-32 independently because\nthat would allow ridiculous settings such as requesting UTF-16 support while\nbuilding only the 8-bit library. It is not possible to build one library with\nUTF support and another without in the same configuration. (For backwards\ncompatibility, --enable-utf8 is a synonym of --enable-utf.)\n.P\nOf itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or\nUTF-32. As well as compiling PCRE with this option, you also have have to set\nthe PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call\none of the pattern compiling functions.\n.P\nIf you set --enable-utf when compiling in an EBCDIC environment, PCRE expects\nits input to be either ASCII or UTF-8 (depending on the run-time option). It is\nnot possible to support both EBCDIC and UTF-8 codes in the same version of the\nlibrary. Consequently, --enable-utf and --enable-ebcdic are mutually\nexclusive.\n.\n.\n.SH \"UNICODE CHARACTER PROPERTY SUPPORT\"\n.rs\n.sp\nUTF support allows the libraries to process character codepoints up to 0x10ffff\nin the strings that they handle. On its own, however, it does not provide any\nfacilities for accessing the properties of such characters. If you want to be\nable to use the pattern escapes \\eP, \\ep, and \\eX, which refer to Unicode\ncharacter properties, you must add\n.sp\n  --enable-unicode-properties\n.sp\nto the \\fBconfigure\\fP command. This implies UTF support, even if you have\nnot explicitly requested it.\n.P\nIncluding Unicode property support adds around 30K of tables to the PCRE\nlibrary. Only the general category properties such as \\fILu\\fP and \\fINd\\fP are\nsupported. Details are given in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation.\n.\n.\n.SH \"JUST-IN-TIME COMPILER SUPPORT\"\n.rs\n.sp\nJust-in-time compiler support is included in the build by specifying\n.sp\n  --enable-jit\n.sp\nThis support is available only for certain hardware architectures. If this\noption is set for an unsupported architecture, a compile time error occurs.\nSee the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for a discussion of JIT usage. When JIT support is enabled,\npcregrep automatically makes use of it, unless you add\n.sp\n  --disable-pcregrep-jit\n.sp\nto the \"configure\" command.\n.\n.\n.SH \"CODE VALUE OF NEWLINE\"\n.rs\n.sp\nBy default, PCRE interprets the linefeed (LF) character as indicating the end\nof a line. This is the normal newline character on Unix-like systems. You can\ncompile PCRE to use carriage return (CR) instead, by adding\n.sp\n  --enable-newline-is-cr\n.sp\nto the \\fBconfigure\\fP command. There is also a --enable-newline-is-lf option,\nwhich explicitly specifies linefeed as the newline character.\n.sp\nAlternatively, you can specify that line endings are to be indicated by the two\ncharacter sequence CRLF. If you want this, add\n.sp\n  --enable-newline-is-crlf\n.sp\nto the \\fBconfigure\\fP command. There is a fourth option, specified by\n.sp\n  --enable-newline-is-anycrlf\n.sp\nwhich causes PCRE to recognize any of the three sequences CR, LF, or CRLF as\nindicating a line ending. Finally, a fifth option, specified by\n.sp\n  --enable-newline-is-any\n.sp\ncauses PCRE to recognize any Unicode newline sequence.\n.P\nWhatever line ending convention is selected when PCRE is built can be\noverridden when the library functions are called. At build time it is\nconventional to use the standard for your operating system.\n.\n.\n.SH \"WHAT \\eR MATCHES\"\n.rs\n.sp\nBy default, the sequence \\eR in a pattern matches any Unicode newline sequence,\nwhatever has been selected as the line ending sequence. If you specify\n.sp\n  --enable-bsr-anycrlf\n.sp\nthe default is changed so that \\eR matches only CR, LF, or CRLF. Whatever is\nselected when PCRE is built can be overridden when the library functions are\ncalled.\n.\n.\n.SH \"POSIX MALLOC USAGE\"\n.rs\n.sp\nWhen the 8-bit library is called through the POSIX interface (see the\n.\\\" HREF\n\\fBpcreposix\\fP\n.\\\"\ndocumentation), additional working storage is required for holding the pointers\nto capturing substrings, because PCRE requires three integers per substring,\nwhereas the POSIX interface provides only two. If the number of expected\nsubstrings is small, the wrapper function uses space on the stack, because this\nis faster than using \\fBmalloc()\\fP for each call. The default threshold above\nwhich the stack is no longer used is 10; it can be changed by adding a setting\nsuch as\n.sp\n  --with-posix-malloc-threshold=20\n.sp\nto the \\fBconfigure\\fP command.\n.\n.\n.SH \"HANDLING VERY LARGE PATTERNS\"\n.rs\n.sp\nWithin a compiled pattern, offset values are used to point from one part to\nanother (for example, from an opening parenthesis to an alternation\nmetacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values\nare used for these offsets, leading to a maximum size for a compiled pattern of\naround 64K. This is sufficient to handle all but the most gigantic patterns.\nNevertheless, some people do want to process truly enormous patterns, so it is\npossible to compile PCRE to use three-byte or four-byte offsets by adding a\nsetting such as\n.sp\n  --with-link-size=3\n.sp\nto the \\fBconfigure\\fP command. The value given must be 2, 3, or 4. For the\n16-bit library, a value of 3 is rounded up to 4. In these libraries, using\nlonger offsets slows down the operation of PCRE because it has to load\nadditional data when handling them. For the 32-bit library the value is always\n4 and cannot be overridden; the value of --with-link-size is ignored.\n.\n.\n.SH \"AVOIDING EXCESSIVE STACK USAGE\"\n.rs\n.sp\nWhen matching with the \\fBpcre_exec()\\fP function, PCRE implements backtracking\nby making recursive calls to an internal function called \\fBmatch()\\fP. In\nenvironments where the size of the stack is limited, this can severely limit\nPCRE's operation. (The Unix environment does not usually suffer from this\nproblem, but it may sometimes be necessary to increase the maximum stack size.\nThere is a discussion in the\n.\\\" HREF\n\\fBpcrestack\\fP\n.\\\"\ndocumentation.) An alternative approach to recursion that uses memory from the\nheap to remember data, instead of using recursive function calls, has been\nimplemented to work round the problem of limited stack size. If you want to\nbuild a version of PCRE that works this way, add\n.sp\n  --disable-stack-for-recursion\n.sp\nto the \\fBconfigure\\fP command. With this configuration, PCRE will use the\n\\fBpcre_stack_malloc\\fP and \\fBpcre_stack_free\\fP variables to call memory\nmanagement functions. By default these point to \\fBmalloc()\\fP and\n\\fBfree()\\fP, but you can replace the pointers so that your own functions are\nused instead.\n.P\nSeparate functions are provided rather than using \\fBpcre_malloc\\fP and\n\\fBpcre_free\\fP because the usage is very predictable: the block sizes\nrequested are always the same, and the blocks are always freed in reverse\norder. A calling program might be able to implement optimized functions that\nperform better than \\fBmalloc()\\fP and \\fBfree()\\fP. PCRE runs noticeably more\nslowly when built in this way. This option affects only the \\fBpcre_exec()\\fP\nfunction; it is not relevant for \\fBpcre_dfa_exec()\\fP.\n.\n.\n.SH \"LIMITING PCRE RESOURCE USAGE\"\n.rs\n.sp\nInternally, PCRE has a function called \\fBmatch()\\fP, which it calls repeatedly\n(sometimes recursively) when matching a pattern with the \\fBpcre_exec()\\fP\nfunction. By controlling the maximum number of times this function may be\ncalled during a single matching operation, a limit can be placed on the\nresources used by a single call to \\fBpcre_exec()\\fP. The limit can be changed\nat run time, as described in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation. The default is 10 million, but this can be changed by adding a\nsetting such as\n.sp\n  --with-match-limit=500000\n.sp\nto the \\fBconfigure\\fP command. This setting has no effect on the\n\\fBpcre_dfa_exec()\\fP matching function.\n.P\nIn some environments it is desirable to limit the depth of recursive calls of\n\\fBmatch()\\fP more strictly than the total number of calls, in order to\nrestrict the maximum amount of stack (or heap, if --disable-stack-for-recursion\nis specified) that is used. A second limit controls this; it defaults to the\nvalue that is set for --with-match-limit, which imposes no additional\nconstraints. However, you can set a lower limit by adding, for example,\n.sp\n  --with-match-limit-recursion=10000\n.sp\nto the \\fBconfigure\\fP command. This value can also be overridden at run time.\n.\n.\n.SH \"CREATING CHARACTER TABLES AT BUILD TIME\"\n.rs\n.sp\nPCRE uses fixed tables for processing characters whose code values are less\nthan 256. By default, PCRE is built with a set of tables that are distributed\nin the file \\fIpcre_chartables.c.dist\\fP. These tables are for ASCII codes\nonly. If you add\n.sp\n  --enable-rebuild-chartables\n.sp\nto the \\fBconfigure\\fP command, the distributed tables are no longer used.\nInstead, a program called \\fBdftables\\fP is compiled and run. This outputs the\nsource for new set of tables, created in the default locale of your C run-time\nsystem. (This method of replacing the tables does not work if you are cross\ncompiling, because \\fBdftables\\fP is run on the local host. If you need to\ncreate alternative tables when cross compiling, you will have to do so \"by\nhand\".)\n.\n.\n.SH \"USING EBCDIC CODE\"\n.rs\n.sp\nPCRE assumes by default that it will run in an environment where the character\ncode is ASCII (or Unicode, which is a superset of ASCII). This is the case for\nmost computer operating systems. PCRE can, however, be compiled to run in an\nEBCDIC environment by adding\n.sp\n  --enable-ebcdic\n.sp\nto the \\fBconfigure\\fP command. This setting implies\n--enable-rebuild-chartables. You should only use it if you know that you are in\nan EBCDIC environment (for example, an IBM mainframe operating system). The\n--enable-ebcdic option is incompatible with --enable-utf.\n.P\nThe EBCDIC character that corresponds to an ASCII LF is assumed to have the\nvalue 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In\nsuch an environment you should use\n.sp\n  --enable-ebcdic-nl25\n.sp\nas well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the\nsame value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \\fInot\\fP\nchosen as LF is made to correspond to the Unicode NEL character (which, in\nUnicode, is 0x85).\n.P\nThe options that select newline behaviour, such as --enable-newline-is-cr,\nand equivalent run-time options, refer to these character values in an EBCDIC\nenvironment.\n.\n.\n.SH \"PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT\"\n.rs\n.sp\nBy default, \\fBpcregrep\\fP reads all files as plain text. You can build it so\nthat it recognizes files whose names end in \\fB.gz\\fP or \\fB.bz2\\fP, and reads\nthem with \\fBlibz\\fP or \\fBlibbz2\\fP, respectively, by adding one or both of\n.sp\n  --enable-pcregrep-libz\n  --enable-pcregrep-libbz2\n.sp\nto the \\fBconfigure\\fP command. These options naturally require that the\nrelevant libraries are installed on your system. Configuration will fail if\nthey are not.\n.\n.\n.SH \"PCREGREP BUFFER SIZE\"\n.rs\n.sp\n\\fBpcregrep\\fP uses an internal buffer to hold a \"window\" on the file it is\nscanning, in order to be able to output \"before\" and \"after\" lines when it\nfinds a match. The size of the buffer is controlled by a parameter whose\ndefault value is 20K. The buffer itself is three times this size, but because\nof the way it is used for holding \"before\" lines, the longest line that is\nguaranteed to be processable is the parameter size. You can change the default\nparameter value by adding, for example,\n.sp\n  --with-pcregrep-bufsize=50K\n.sp\nto the \\fBconfigure\\fP command. The caller of \\fPpcregrep\\fP can, however,\noverride this value by specifying a run-time option.\n.\n.\n.SH \"PCRETEST OPTION FOR LIBREADLINE SUPPORT\"\n.rs\n.sp\nIf you add\n.sp\n  --enable-pcretest-libreadline\n.sp\nto the \\fBconfigure\\fP command, \\fBpcretest\\fP is linked with the\n\\fBlibreadline\\fP library, and when its input is from a terminal, it reads it\nusing the \\fBreadline()\\fP function. This provides line-editing and history\nfacilities. Note that \\fBlibreadline\\fP is GPL-licensed, so if you distribute a\nbinary of \\fBpcretest\\fP linked in this way, there may be licensing issues.\n.P\nSetting this option causes the \\fB-lreadline\\fP option to be added to the\n\\fBpcretest\\fP build. In many operating environments with a sytem-installed\n\\fBlibreadline\\fP this is sufficient. However, in some environments (e.g.\nif an unmodified distribution version of readline is in use), some extra\nconfiguration may be necessary. The INSTALL file for \\fBlibreadline\\fP says\nthis:\n.sp\n  \"Readline uses the termcap functions, but does not link with the\n  termcap or curses library itself, allowing applications which link\n  with readline the to choose an appropriate library.\"\n.sp\nIf your environment has not been set up so that an appropriate library is\nautomatically included, you may need to add something like\n.sp\n  LIBS=\"-ncurses\"\n.sp\nimmediately before the \\fBconfigure\\fP command.\n.\n.\n.SH \"DEBUGGING WITH VALGRIND SUPPORT\"\n.rs\n.sp\nBy adding the\n.sp\n  --enable-valgrind\n.sp\noption to to the \\fBconfigure\\fP command, PCRE will use valgrind annotations\nto mark certain memory regions as unaddressable. This allows it to detect\ninvalid memory accesses, and is mostly useful for debugging PCRE itself.\n.\n.\n.SH \"CODE COVERAGE REPORTING\"\n.rs\n.sp\nIf your C compiler is gcc, you can build a version of PCRE that can generate a\ncode coverage report for its test suite. To enable this, you must install\n\\fBlcov\\fP version 1.6 or above. Then specify\n.sp\n  --enable-coverage\n.sp\nto the \\fBconfigure\\fP command and build PCRE in the usual way.\n.P\nNote that using \\fBccache\\fP (a caching C compiler) is incompatible with code\ncoverage reporting. If you have configured \\fBccache\\fP to run automatically\non your system, you must set the environment variable\n.sp\n  CCACHE_DISABLE=1\n.sp\nbefore running \\fBmake\\fP to build PCRE, so that \\fBccache\\fP is not used.\n.P\nWhen --enable-coverage is used, the following addition targets are added to the\n\\fIMakefile\\fP:\n.sp\n  make coverage\n.sp\nThis creates a fresh coverage report for the PCRE test suite. It is equivalent\nto running \"make coverage-reset\", \"make coverage-baseline\", \"make check\", and\nthen \"make coverage-report\".\n.sp\n  make coverage-reset\n.sp\nThis zeroes the coverage counters, but does nothing else.\n.sp\n  make coverage-baseline\n.sp\nThis captures baseline coverage information.\n.sp\n  make coverage-report\n.sp\nThis creates the coverage report.\n.sp\n  make coverage-clean-report\n.sp\nThis removes the generated coverage report without cleaning the coverage data\nitself.\n.sp\n  make coverage-clean-data\n.sp\nThis removes the captured coverage data without removing the coverage files\ncreated at compile time (*.gcno).\n.sp\n  make coverage-clean\n.sp\nThis cleans all coverage data including the generated coverage report. For more\ninformation about code coverage, see the \\fBgcov\\fP and \\fBlcov\\fP\ndocumentation.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcreapi\\fP(3), \\fBpcre16\\fP, \\fBpcre32\\fP, \\fBpcre_config\\fP(3).\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 May 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrecallout.3",
    "content": ".TH PCRECALLOUT 3 \"12 November 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH SYNOPSIS\n.rs\n.sp\n.B #include <pcre.h>\n.PP\n.SM\n.B int (*pcre_callout)(pcre_callout_block *);\n.PP\n.B int (*pcre16_callout)(pcre16_callout_block *);\n.PP\n.B int (*pcre32_callout)(pcre32_callout_block *);\n.\n.SH DESCRIPTION\n.rs\n.sp\nPCRE provides a feature called \"callout\", which is a means of temporarily\npassing control to the caller of PCRE in the middle of pattern matching. The\ncaller of PCRE provides an external function by putting its entry point in the\nglobal variable \\fIpcre_callout\\fP (\\fIpcre16_callout\\fP for the 16-bit\nlibrary, \\fIpcre32_callout\\fP for the 32-bit library). By default, this\nvariable contains NULL, which disables all calling out.\n.P\nWithin a regular expression, (?C) indicates the points at which the external\nfunction is to be called. Different callout points can be identified by putting\na number less than 256 after the letter C. The default value is zero.\nFor example, this pattern has two callout points:\n.sp\n  (?C1)abc(?C2)def\n.sp\nIf the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE\nautomatically inserts callouts, all with number 255, before each item in the\npattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern\n.sp\n  A(\\ed{2}|--)\n.sp\nit is processed as if it were\n.sp\n(?C255)A(?C255)((?C255)\\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)\n.sp\nNotice that there is a callout before and after each parenthesis and\nalternation bar. If the pattern contains a conditional group whose condition is\nan assertion, an automatic callout is inserted immediately before the\ncondition. Such a callout may also be inserted explicitly, for example:\n.sp\n  (?(?C9)(?=a)ab|de)\n.sp\nThis applies only to assertion conditions (because they are themselves\nindependent groups).\n.P\nAutomatic callouts can be used for tracking the progress of pattern matching.\nThe\n.\\\" HREF\n\\fBpcretest\\fP\n.\\\"\nprogram has a pattern qualifier (/C) that sets automatic callouts; when it is\nused, the output indicates how the pattern is being matched. This is useful\ninformation when you are trying to optimize the performance of a particular\npattern.\n.\n.\n.SH \"MISSING CALLOUTS\"\n.rs\n.sp\nYou should be aware that, because of optimizations in the way PCRE compiles and\nmatches patterns, callouts sometimes do not happen exactly as you might expect.\n.P\nAt compile time, PCRE \"auto-possessifies\" repeated items when it knows that\nwhat follows cannot be part of the repeat. For example, a+[bc] is compiled as\nif it were a++[bc]. The \\fBpcretest\\fP output when this pattern is anchored and\nthen applied with automatic callouts to the string \"aaaa\" is:\n.sp\n  --->aaaa\n   +0 ^        ^\n   +1 ^        a+\n   +3 ^   ^    [bc]\n  No match\n.sp\nThis indicates that when matching [bc] fails, there is no backtracking into a+\nand therefore the callouts that would be taken for the backtracks do not occur.\nYou can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS\nto \\fBpcre_compile()\\fP, or starting the pattern with (*NO_AUTO_POSSESS). If\nthis is done in \\fBpcretest\\fP (using the /O qualifier), the output changes to\nthis:\n.sp\n  --->aaaa\n   +0 ^        ^\n   +1 ^        a+\n   +3 ^   ^    [bc]\n   +3 ^  ^     [bc]\n   +3 ^ ^      [bc]\n   +3 ^^       [bc]\n  No match\n.sp\nThis time, when matching [bc] fails, the matcher backtracks into a+ and tries\nagain, repeatedly, until a+ itself fails.\n.P\nOther optimizations that provide fast \"no match\" results also affect callouts.\nFor example, if the pattern is\n.sp\n  ab(?C4)cd\n.sp\nPCRE knows that any matching string must contain the letter \"d\". If the subject\nstring is \"abyz\", the lack of \"d\" means that matching doesn't ever start, and\nthe callout is never reached. However, with \"abyd\", though the result is still\nno match, the callout is obeyed.\n.P\nIf the pattern is studied, PCRE knows the minimum length of a matching string,\nand will immediately give a \"no match\" return without actually running a match\nif the subject is not long enough, or, for unanchored patterns, if it has\nbeen scanned far enough.\n.P\nYou can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE\noption to the matching function, or by starting the pattern with\n(*NO_START_OPT). This slows down the matching process, but does ensure that\ncallouts such as the example above are obeyed.\n.\n.\n.SH \"THE CALLOUT INTERFACE\"\n.rs\n.sp\nDuring matching, when PCRE reaches a callout point, the external function\ndefined by \\fIpcre_callout\\fP or \\fIpcre[16|32]_callout\\fP is called (if it is\nset). This applies to both normal and DFA matching. The only argument to the\ncallout function is a pointer to a \\fBpcre_callout\\fP or\n\\fBpcre[16|32]_callout\\fP block. These structures contains the following\nfields:\n.sp\n  int           \\fIversion\\fP;\n  int           \\fIcallout_number\\fP;\n  int          *\\fIoffset_vector\\fP;\n  const char   *\\fIsubject\\fP;           (8-bit version)\n  PCRE_SPTR16   \\fIsubject\\fP;           (16-bit version)\n  PCRE_SPTR32   \\fIsubject\\fP;           (32-bit version)\n  int           \\fIsubject_length\\fP;\n  int           \\fIstart_match\\fP;\n  int           \\fIcurrent_position\\fP;\n  int           \\fIcapture_top\\fP;\n  int           \\fIcapture_last\\fP;\n  void         *\\fIcallout_data\\fP;\n  int           \\fIpattern_position\\fP;\n  int           \\fInext_item_length\\fP;\n  const unsigned char *\\fImark\\fP;       (8-bit version)\n  const PCRE_UCHAR16  *\\fImark\\fP;       (16-bit version)\n  const PCRE_UCHAR32  *\\fImark\\fP;       (32-bit version)\n.sp\nThe \\fIversion\\fP field is an integer containing the version number of the\nblock format. The initial version was 0; the current version is 2. The version\nnumber will change again in future if additional fields are added, but the\nintention is never to remove any of the existing fields.\n.P\nThe \\fIcallout_number\\fP field contains the number of the callout, as compiled\ninto the pattern (that is, the number after ?C for manual callouts, and 255 for\nautomatically generated callouts).\n.P\nThe \\fIoffset_vector\\fP field is a pointer to the vector of offsets that was\npassed by the caller to the matching function. When \\fBpcre_exec()\\fP or\n\\fBpcre[16|32]_exec()\\fP is used, the contents can be inspected, in order to\nextract substrings that have been matched so far, in the same way as for\nextracting substrings after a match has completed. For the DFA matching\nfunctions, this field is not useful.\n.P\nThe \\fIsubject\\fP and \\fIsubject_length\\fP fields contain copies of the values\nthat were passed to the matching function.\n.P\nThe \\fIstart_match\\fP field normally contains the offset within the subject at\nwhich the current match attempt started. However, if the escape sequence \\eK\nhas been encountered, this value is changed to reflect the modified starting\npoint. If the pattern is not anchored, the callout function may be called\nseveral times from the same point in the pattern for different starting points\nin the subject.\n.P\nThe \\fIcurrent_position\\fP field contains the offset within the subject of the\ncurrent match pointer.\n.P\nWhen the \\fBpcre_exec()\\fP or \\fBpcre[16|32]_exec()\\fP is used, the\n\\fIcapture_top\\fP field contains one more than the number of the highest\nnumbered captured substring so far. If no substrings have been captured, the\nvalue of \\fIcapture_top\\fP is one. This is always the case when the DFA\nfunctions are used, because they do not support captured substrings.\n.P\nThe \\fIcapture_last\\fP field contains the number of the most recently captured\nsubstring. However, when a recursion exits, the value reverts to what it was\noutside the recursion, as do the values of all captured substrings. If no\nsubstrings have been captured, the value of \\fIcapture_last\\fP is -1. This is\nalways the case for the DFA matching functions.\n.P\nThe \\fIcallout_data\\fP field contains a value that is passed to a matching\nfunction specifically so that it can be passed back in callouts. It is passed\nin the \\fIcallout_data\\fP field of a \\fBpcre_extra\\fP or \\fBpcre[16|32]_extra\\fP\ndata structure. If no such data was passed, the value of \\fIcallout_data\\fP in\na callout block is NULL. There is a description of the \\fBpcre_extra\\fP\nstructure in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.P\nThe \\fIpattern_position\\fP field is present from version 1 of the callout\nstructure. It contains the offset to the next item to be matched in the pattern\nstring.\n.P\nThe \\fInext_item_length\\fP field is present from version 1 of the callout\nstructure. It contains the length of the next item to be matched in the pattern\nstring. When the callout immediately precedes an alternation bar, a closing\nparenthesis, or the end of the pattern, the length is zero. When the callout\nprecedes an opening parenthesis, the length is that of the entire subpattern.\n.P\nThe \\fIpattern_position\\fP and \\fInext_item_length\\fP fields are intended to\nhelp in distinguishing between different automatic callouts, which all have the\nsame callout number. However, they are set for all callouts.\n.P\nThe \\fImark\\fP field is present from version 2 of the callout structure. In\ncallouts from \\fBpcre_exec()\\fP or \\fBpcre[16|32]_exec()\\fP it contains a\npointer to the zero-terminated name of the most recently passed (*MARK),\n(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been\npassed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a\nprevious (*MARK). In callouts from the DFA matching functions this field always\ncontains NULL.\n.\n.\n.SH \"RETURN VALUES\"\n.rs\n.sp\nThe external callout function returns an integer to PCRE. If the value is zero,\nmatching proceeds as normal. If the value is greater than zero, matching fails\nat the current point, but the testing of other matching possibilities goes\nahead, just as if a lookahead assertion had failed. If the value is less than\nzero, the match is abandoned, the matching function returns the negative value.\n.P\nNegative values should normally be chosen from the set of PCRE_ERROR_xxx\nvalues. In particular, PCRE_ERROR_NOMATCH forces a standard \"no match\" failure.\nThe error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;\nit will never be used by PCRE itself.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 November 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrecompat.3",
    "content": ".TH PCRECOMPAT 3 \"10 November 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"DIFFERENCES BETWEEN PCRE AND PERL\"\n.rs\n.sp\nThis document describes the differences in the ways that PCRE and Perl handle\nregular expressions. The differences described here are with respect to Perl\nversions 5.10 and above.\n.P\n1. PCRE has only a subset of Perl's Unicode support. Details of what it does\nhave are given in the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage.\n.P\n2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do\nnot mean what you might think. For example, (?!a){3} does not assert that the\nnext three characters are not \"a\". It just asserts that the next character is\nnot \"a\" three times (in principle: PCRE optimizes this to run the assertion\njust once). Perl allows repeat quantifiers on other assertions such as \\eb, but\nthese do not seem to have any use.\n.P\n3. Capturing subpatterns that occur inside negative lookahead assertions are\ncounted, but their entries in the offsets vector are never set. Perl sometimes\n(but not always) sets its numerical variables from inside negative assertions.\n.P\n4. Though binary zero characters are supported in the subject string, they are\nnot allowed in a pattern string because it is passed as a normal C string,\nterminated by zero. The escape sequence \\e0 can be used in the pattern to\nrepresent a binary zero.\n.P\n5. The following Perl escape sequences are not supported: \\el, \\eu, \\eL,\n\\eU, and \\eN when followed by a character name or Unicode value. (\\eN on its\nown, matching a non-newline character, is supported.) In fact these are\nimplemented by Perl's general string-handling and are not part of its pattern\nmatching engine. If any of these are encountered by PCRE, an error is\ngenerated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set,\n\\eU and \\eu are interpreted as JavaScript interprets them.\n.P\n6. The Perl escape sequences \\ep, \\eP, and \\eX are supported only if PCRE is\nbuilt with Unicode character property support. The properties that can be\ntested with \\ep and \\eP are limited to the general category properties such as\nLu and Nd, script names such as Greek or Han, and the derived properties Any\nand L&. PCRE does support the Cs (surrogate) property, which Perl does not; the\nPerl documentation says \"Because Perl hides the need for the user to understand\nthe internal representation of Unicode characters, there is no need to\nimplement the somewhat messy concept of surrogates.\"\n.P\n7. PCRE does support the \\eQ...\\eE escape for quoting substrings. Characters in\nbetween are treated as literals. This is slightly different from Perl in that $\nand @ are also handled as literals inside the quotes. In Perl, they cause\nvariable interpolation (but of course PCRE does not have variables). Note the\nfollowing examples:\n.sp\n    Pattern            PCRE matches      Perl matches\n.sp\n.\\\" JOIN\n    \\eQabc$xyz\\eE        abc$xyz           abc followed by the\n                                           contents of $xyz\n    \\eQabc\\e$xyz\\eE       abc\\e$xyz          abc\\e$xyz\n    \\eQabc\\eE\\e$\\eQxyz\\eE   abc$xyz           abc$xyz\n.sp\nThe \\eQ...\\eE sequence is recognized both inside and outside character classes.\n.P\n8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})\nconstructions. However, there is support for recursive patterns. This is not\navailable in Perl 5.8, but it is in Perl 5.10. Also, the PCRE \"callout\"\nfeature allows an external function to be called during pattern matching. See\nthe\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation for details.\n.P\n9. Subpatterns that are called as subroutines (whether or not recursively) are\nalways treated as atomic groups in PCRE. This is like Python, but unlike Perl.\nCaptured values that are set outside a subroutine call can be reference from\ninside in PCRE, but not in Perl. There is a discussion that explains these\ndifferences in more detail in the\n.\\\" HTML <a href=\"pcrepattern.html#recursiondifference\">\n.\\\" </a>\nsection on recursion differences from Perl\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\npage.\n.P\n10. If any of the backtracking control verbs are used in a subpattern that is\ncalled as a subroutine (whether or not recursively), their effect is confined\nto that subpattern; it does not extend to the surrounding pattern. This is not\nalways the case in Perl. In particular, if (*THEN) is present in a group that\nis called as a subroutine, its action is limited to that group, even if the\ngroup does not contain any | characters. Note that such subpatterns are\nprocessed as anchored at the point where they are tested.\n.P\n11. If a pattern contains more than one backtracking control verb, the first\none that is backtracked onto acts. For example, in the pattern\nA(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C\ntriggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the\nsame as PCRE, but there are examples where it differs.\n.P\n12. Most backtracking verbs in assertions have their normal actions. They are\nnot confined to the assertion.\n.P\n13. There are some differences that are concerned with the settings of captured\nstrings when part of a pattern is repeated. For example, matching \"aba\" against\nthe pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to \"b\".\n.P\n14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern\nnames is not as general as Perl's. This is a consequence of the fact the PCRE\nworks internally just with numbers, using an external table to translate\nbetween numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B),\nwhere the two capturing parentheses have the same number but different names,\nis not supported, and causes an error at compile time. If it were allowed, it\nwould not be possible to distinguish which parentheses matched, because both\nnames map to capturing subpattern number 1. To avoid this confusing situation,\nan error is given at compile time.\n.P\n15. Perl recognizes comments in some places that PCRE does not, for example,\nbetween the ( and ? at the start of a subpattern. If the /x modifier is set,\nPerl allows white space between ( and ? (though current Perls warn that this is\ndeprecated) but PCRE never does, even if the PCRE_EXTENDED option is set.\n.P\n16. Perl, when in warning mode, gives warnings for character classes such as\n[A-\\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no\nwarning features, so it gives an error in these cases because they are almost\ncertainly user mistakes.\n.P\n17. In PCRE, the upper/lower case character properties Lu and Ll are not\naffected when case-independent matching is specified. For example, \\ep{Lu}\nalways matches an upper case letter. I think Perl has changed in this respect;\nin the release at the time of writing (5.16), \\ep{Lu} and \\ep{Ll} match all\nletters, regardless of case, when case independence is specified.\n.P\n18. PCRE provides some extensions to the Perl regular expression facilities.\nPerl 5.10 includes new features that are not in earlier versions of Perl, some\nof which (such as named parentheses) have been in PCRE for some time. This list\nis with respect to Perl 5.10:\n.sp\n(a) Although lookbehind assertions in PCRE must match fixed length strings,\neach alternative branch of a lookbehind assertion can match a different length\nof string. Perl requires them all to have the same length.\n.sp\n(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $\nmeta-character matches only at the very end of the string.\n.sp\n(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\nmeaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.\n(Perl can be made to issue a warning.)\n.sp\n(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\ninverted, that is, by default they are not greedy, but if followed by a\nquestion mark they are.\n.sp\n(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried\nonly at the first matching position in the subject string.\n.sp\n(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and\nPCRE_NO_AUTO_CAPTURE options for \\fBpcre_exec()\\fP have no Perl equivalents.\n.sp\n(g) The \\eR escape sequence can be restricted to match only CR, LF, or CRLF\nby the PCRE_BSR_ANYCRLF option.\n.sp\n(h) The callout facility is PCRE-specific.\n.sp\n(i) The partial matching facility is PCRE-specific.\n.sp\n(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on\ndifferent hosts that have the other endianness. However, this does not apply to\noptimized data created by the just-in-time compiler.\n.sp\n(k) The alternative matching functions (\\fBpcre_dfa_exec()\\fP,\n\\fBpcre16_dfa_exec()\\fP and \\fBpcre32_dfa_exec()\\fP,) match in a different way\nand are not Perl-compatible.\n.sp\n(l) PCRE recognizes some special sequences such as (*CR) at the start of\na pattern that set overall options that cannot be changed within the pattern.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 10 November 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrecpp.3",
    "content": ".TH PCRECPP 3 \"08 January 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions.\n.SH \"SYNOPSIS OF C++ WRAPPER\"\n.rs\n.sp\n.B #include <pcrecpp.h>\n.\n.SH DESCRIPTION\n.rs\n.sp\nThe C++ wrapper for PCRE was provided by Google Inc. Some additional\nfunctionality was added by Giuseppe Maxia. This brief man page was constructed\nfrom the notes in the \\fIpcrecpp.h\\fP file, which should be consulted for\nfurther details. Note that the C++ wrapper supports only the original 8-bit\nPCRE library. There is no 16-bit or 32-bit support at present.\n.\n.\n.SH \"MATCHING INTERFACE\"\n.rs\n.sp\nThe \"FullMatch\" operation checks that supplied text matches a supplied pattern\nexactly. If pointer arguments are supplied, it copies matched sub-strings that\nmatch sub-patterns into them.\n.sp\n  Example: successful match\n     pcrecpp::RE re(\"h.*o\");\n     re.FullMatch(\"hello\");\n.sp\n  Example: unsuccessful match (requires full match):\n     pcrecpp::RE re(\"e\");\n     !re.FullMatch(\"hello\");\n.sp\n  Example: creating a temporary RE object:\n     pcrecpp::RE(\"h.*o\").FullMatch(\"hello\");\n.sp\nYou can pass in a \"const char*\" or a \"string\" for \"text\". The examples below\ntend to use a const char*. You can, as in the different examples above, store\nthe RE object explicitly in a variable or use a temporary RE object. The\nexamples below use one mode or the other arbitrarily. Either could correctly be\nused for any of these examples.\n.P\nYou must supply extra pointer arguments to extract matched subpieces.\n.sp\n  Example: extracts \"ruby\" into \"s\" and 1234 into \"i\"\n     int i;\n     string s;\n     pcrecpp::RE re(\"(\\e\\ew+):(\\e\\ed+)\");\n     re.FullMatch(\"ruby:1234\", &s, &i);\n.sp\n  Example: does not try to extract any extra sub-patterns\n     re.FullMatch(\"ruby:1234\", &s);\n.sp\n  Example: does not try to extract into NULL\n     re.FullMatch(\"ruby:1234\", NULL, &i);\n.sp\n  Example: integer overflow causes failure\n     !re.FullMatch(\"ruby:1234567891234\", NULL, &i);\n.sp\n  Example: fails because there aren't enough sub-patterns:\n     !pcrecpp::RE(\"\\e\\ew+:\\e\\ed+\").FullMatch(\"ruby:1234\", &s);\n.sp\n  Example: fails because string cannot be stored in integer\n     !pcrecpp::RE(\"(.*)\").FullMatch(\"ruby\", &i);\n.sp\nThe provided pointer arguments can be pointers to any scalar numeric\ntype, or one of:\n.sp\n   string        (matched piece is copied to string)\n   StringPiece   (StringPiece is mutated to point to matched piece)\n   T             (where \"bool T::ParseFrom(const char*, int)\" exists)\n   NULL          (the corresponding matched sub-pattern is not copied)\n.sp\nThe function returns true iff all of the following conditions are satisfied:\n.sp\n  a. \"text\" matches \"pattern\" exactly;\n.sp\n  b. The number of matched sub-patterns is >= number of supplied\n     pointers;\n.sp\n  c. The \"i\"th argument has a suitable type for holding the\n     string captured as the \"i\"th sub-pattern. If you pass in\n     void * NULL for the \"i\"th argument, or a non-void * NULL\n     of the correct type, or pass fewer arguments than the\n     number of sub-patterns, \"i\"th captured sub-pattern is\n     ignored.\n.sp\nCAVEAT: An optional sub-pattern that does not exist in the matched\nstring is assigned the empty string. Therefore, the following will\nreturn false (because the empty string is not a valid number):\n.sp\n   int number;\n   pcrecpp::RE::FullMatch(\"abc\", \"[a-z]+(\\e\\ed+)?\", &number);\n.sp\nThe matching interface supports at most 16 arguments per call.\nIf you need more, consider using the more general interface\n\\fBpcrecpp::RE::DoMatch\\fP. See \\fBpcrecpp.h\\fP for the signature for\n\\fBDoMatch\\fP.\n.P\nNOTE: Do not use \\fBno_arg\\fP, which is used internally to mark the end of a\nlist of optional arguments, as a placeholder for missing arguments, as this can\nlead to segfaults.\n.\n.\n.SH \"QUOTING METACHARACTERS\"\n.rs\n.sp\nYou can use the \"QuoteMeta\" operation to insert backslashes before all\npotentially meaningful characters in a string. The returned string, used as a\nregular expression, will exactly match the original string.\n.sp\n  Example:\n     string quoted = RE::QuoteMeta(unquoted);\n.sp\nNote that it's legal to escape a character even if it has no special meaning in\na regular expression -- so this function does that. (This also makes it\nidentical to the perl function of the same name; see \"perldoc -f quotemeta\".)\nFor example, \"1.5-2.0?\" becomes \"1\\e.5\\e-2\\e.0\\e?\".\n.\n.SH \"PARTIAL MATCHES\"\n.rs\n.sp\nYou can use the \"PartialMatch\" operation when you want the pattern\nto match any substring of the text.\n.sp\n  Example: simple search for a string:\n     pcrecpp::RE(\"ell\").PartialMatch(\"hello\");\n.sp\n  Example: find first number in a string:\n     int number;\n     pcrecpp::RE re(\"(\\e\\ed+)\");\n     re.PartialMatch(\"x*100 + 20\", &number);\n     assert(number == 100);\n.\n.\n.SH \"UTF-8 AND THE MATCHING INTERFACE\"\n.rs\n.sp\nBy default, pattern and text are plain text, one byte per character. The UTF8\nflag, passed to the constructor, causes both pattern and string to be treated\nas UTF-8 text, still a byte stream but potentially multiple bytes per\ncharacter. In practice, the text is likelier to be UTF-8 than the pattern, but\nthe match returned may depend on the UTF8 flag, so always use it when matching\nUTF8 text. For example, \".\" will match one byte normally but with UTF8 set may\nmatch up to three bytes of a multi-byte character.\n.sp\n  Example:\n     pcrecpp::RE_Options options;\n     options.set_utf8();\n     pcrecpp::RE re(utf8_pattern, options);\n     re.FullMatch(utf8_string);\n.sp\n  Example: using the convenience function UTF8():\n     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());\n     re.FullMatch(utf8_string);\n.sp\nNOTE: The UTF8 flag is ignored if pcre was not configured with the\n      --enable-utf8 flag.\n.\n.\n.SH \"PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE\"\n.rs\n.sp\nPCRE defines some modifiers to change the behavior of the regular expression\nengine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to\npass such modifiers to a RE class. Currently, the following modifiers are\nsupported:\n.sp\n   modifier              description               Perl corresponding\n.sp\n   PCRE_CASELESS         case insensitive match      /i\n   PCRE_MULTILINE        multiple lines match        /m\n   PCRE_DOTALL           dot matches newlines        /s\n   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A\n   PCRE_EXTRA            strict escape parsing       N/A\n   PCRE_EXTENDED         ignore white spaces         /x\n   PCRE_UTF8             handles UTF8 chars          built-in\n   PCRE_UNGREEDY         reverses * and *?           N/A\n   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)\n.sp\n(*) Both Perl and PCRE allow non capturing parentheses by means of the\n\"?:\" modifier within the pattern itself. e.g. (?:ab|cd) does not\ncapture, while (ab|cd) does.\n.P\nFor a full account on how each modifier works, please check the\nPCRE API reference page.\n.P\nFor each modifier, there are two member functions whose name is made\nout of the modifier in lowercase, without the \"PCRE_\" prefix. For\ninstance, PCRE_CASELESS is handled by\n.sp\n  bool caseless()\n.sp\nwhich returns true if the modifier is set, and\n.sp\n  RE_Options & set_caseless(bool)\n.sp\nwhich sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be\naccessed through the \\fBset_match_limit()\\fP and \\fBmatch_limit()\\fP member\nfunctions. Setting \\fImatch_limit\\fP to a non-zero value will limit the\nexecution of pcre to keep it from doing bad things like blowing the stack or\ntaking an eternity to return a result. A value of 5000 is good enough to stop\nstack blowup in a 2MB thread stack. Setting \\fImatch_limit\\fP to zero disables\nmatch limiting. Alternatively, you can call \\fBmatch_limit_recursion()\\fP\nwhich uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE\nrecurses. \\fBmatch_limit()\\fP limits the number of matches PCRE does;\n\\fBmatch_limit_recursion()\\fP limits the depth of internal recursion, and\ntherefore the amount of stack that is used.\n.P\nNormally, to pass one or more modifiers to a RE class, you declare\na \\fIRE_Options\\fP object, set the appropriate options, and pass this\nobject to a RE constructor. Example:\n.sp\n   RE_Options opt;\n   opt.set_caseless(true);\n   if (RE(\"HELLO\", opt).PartialMatch(\"hello world\")) ...\n.sp\nRE_options has two constructors. The default constructor takes no arguments and\ncreates a set of flags that are off by default. The optional parameter\n\\fIoption_flags\\fP is to facilitate transfer of legacy code from C programs.\nThis lets you do\n.sp\n   RE(pattern,\n     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);\n.sp\nHowever, new code is better off doing\n.sp\n   RE(pattern,\n     RE_Options().set_caseless(true).set_multiline(true))\n       .PartialMatch(str);\n.sp\nIf you are going to pass one of the most used modifiers, there are some\nconvenience functions that return a RE_Options class with the\nappropriate modifier already set: \\fBCASELESS()\\fP, \\fBUTF8()\\fP,\n\\fBMULTILINE()\\fP, \\fBDOTALL\\fP(), and \\fBEXTENDED()\\fP.\n.P\nIf you need to set several options at once, and you don't want to go through\nthe pains of declaring a RE_Options object and setting several options, there\nis a parallel method that give you such ability on the fly. You can concatenate\nseveral \\fBset_xxxxx()\\fP member functions, since each of them returns a\nreference to its class object. For example, to pass PCRE_CASELESS,\nPCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:\n.sp\n   RE(\" ^ xyz \\e\\es+ .* blah$\",\n     RE_Options()\n       .set_caseless(true)\n       .set_extended(true)\n       .set_multiline(true)).PartialMatch(sometext);\n.sp\n.\n.\n.SH \"SCANNING TEXT INCREMENTALLY\"\n.rs\n.sp\nThe \"Consume\" operation may be useful if you want to repeatedly\nmatch regular expressions at the front of a string and skip over\nthem as they match. This requires use of the \"StringPiece\" type,\nwhich represents a sub-range of a real string. Like RE, StringPiece\nis defined in the pcrecpp namespace.\n.sp\n  Example: read lines of the form \"var = value\" from a string.\n     string contents = ...;                 // Fill string somehow\n     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece\n.sp\n     string var;\n     int value;\n     pcrecpp::RE re(\"(\\e\\ew+) = (\\e\\ed+)\\en\");\n     while (re.Consume(&input, &var, &value)) {\n       ...;\n     }\n.sp\nEach successful call to \"Consume\" will set \"var/value\", and also\nadvance \"input\" so it points past the matched text.\n.P\nThe \"FindAndConsume\" operation is similar to \"Consume\" but does not\nanchor your match at the beginning of the string. For example, you\ncould extract all words from a string by repeatedly calling\n.sp\n  pcrecpp::RE(\"(\\e\\ew+)\").FindAndConsume(&input, &word)\n.\n.\n.SH \"PARSING HEX/OCTAL/C-RADIX NUMBERS\"\n.rs\n.sp\nBy default, if you pass a pointer to a numeric value, the\ncorresponding text is interpreted as a base-10 number. You can\ninstead wrap the pointer with a call to one of the operators Hex(),\nOctal(), or CRadix() to interpret the text in another base. The\nCRadix operator interprets C-style \"0\" (base-8) and \"0x\" (base-16)\nprefixes, but defaults to base-10.\n.sp\n  Example:\n    int a, b, c, d;\n    pcrecpp::RE re(\"(.*) (.*) (.*) (.*)\");\n    re.FullMatch(\"100 40 0100 0x40\",\n                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),\n                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));\n.sp\nwill leave 64 in a, b, c, and d.\n.\n.\n.SH \"REPLACING PARTS OF STRINGS\"\n.rs\n.sp\nYou can replace the first match of \"pattern\" in \"str\" with \"rewrite\".\nWithin \"rewrite\", backslash-escaped digits (\\e1 to \\e9) can be\nused to insert text matching corresponding parenthesized group\nfrom the pattern. \\e0 in \"rewrite\" refers to the entire matching\ntext. For example:\n.sp\n  string s = \"yabba dabba doo\";\n  pcrecpp::RE(\"b+\").Replace(\"d\", &s);\n.sp\nwill leave \"s\" containing \"yada dabba doo\". The result is true if the pattern\nmatches and a replacement occurs, false otherwise.\n.P\n\\fBGlobalReplace\\fP is like \\fBReplace\\fP except that it replaces all\noccurrences of the pattern in the string with the rewrite. Replacements are\nnot subject to re-matching. For example:\n.sp\n  string s = \"yabba dabba doo\";\n  pcrecpp::RE(\"b+\").GlobalReplace(\"d\", &s);\n.sp\nwill leave \"s\" containing \"yada dada doo\". It returns the number of\nreplacements made.\n.P\n\\fBExtract\\fP is like \\fBReplace\\fP, except that if the pattern matches,\n\"rewrite\" is copied into \"out\" (an additional argument) with substitutions.\nThe non-matching portions of \"text\" are ignored. Returns true iff a match\noccurred and the extraction happened successfully;  if no match occurs, the\nstring is left unaffected.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nThe C++ wrapper was contributed by Google Inc.\nCopyright (c) 2007 Google Inc.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 08 January 2012\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcredemo.3",
    "content": ".\\\" Start example.\n.de EX\n.  nr mE \\\\n(.f\n.  nf\n.  nh\n.  ft CW\n..\n.\n.\n.\\\" End example.\n.de EE\n.  ft \\\\n(mE\n.  fi\n.  hy \\\\n(HY\n..\n.\n.EX\n/*************************************************\n*           PCRE DEMONSTRATION PROGRAM           *\n*************************************************/\n\n/* This is a demonstration program to illustrate the most straightforward ways\nof calling the PCRE regular expression library from a C program. See the\npcresample documentation for a short discussion (\"man pcresample\" if you have\nthe PCRE man pages installed).\n\nIn Unix-like environments, if PCRE is installed in your standard system\nlibraries, you should be able to compile this program using this command:\n\ngcc -Wall pcredemo.c -lpcre -o pcredemo\n\nIf PCRE is not installed in a standard place, it is likely to be installed with\nsupport for the pkg-config mechanism. If you have pkg-config, you can compile\nthis program using this command:\n\ngcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo\n\nIf you do not have pkg-config, you may have to use this:\n\ngcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \\e\n  -R/usr/local/lib -lpcre -o pcredemo\n\nReplace \"/usr/local/include\" and \"/usr/local/lib\" with wherever the include and\nlibrary files for PCRE are installed on your system. Only some operating\nsystems (e.g. Solaris) use the -R option.\n\nBuilding under Windows:\n\nIf you want to statically link this program against a non-dll .a file, you must\ndefine PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and\npcre_free() exported functions will be declared __declspec(dllimport), with\nunwanted results. So in this environment, uncomment the following line. */\n\n/* #define PCRE_STATIC */\n\n#include <stdio.h>\n#include <string.h>\n#include <pcre.h>\n\n#define OVECCOUNT 30    /* should be a multiple of 3 */\n\n\nint main(int argc, char **argv)\n{\npcre *re;\nconst char *error;\nchar *pattern;\nchar *subject;\nunsigned char *name_table;\nunsigned int option_bits;\nint erroffset;\nint find_all;\nint crlf_is_newline;\nint namecount;\nint name_entry_size;\nint ovector[OVECCOUNT];\nint subject_length;\nint rc, i;\nint utf8;\n\n\n/**************************************************************************\n* First, sort out the command line. There is only one possible option at  *\n* the moment, \"-g\" to request repeated matching to find all occurrences,  *\n* like Perl's /g option. We set the variable find_all to a non-zero value *\n* if the -g option is present. Apart from that, there must be exactly two *\n* arguments.                                                              *\n**************************************************************************/\n\nfind_all = 0;\nfor (i = 1; i < argc; i++)\n  {\n  if (strcmp(argv[i], \"-g\") == 0) find_all = 1;\n    else break;\n  }\n\n/* After the options, we require exactly two arguments, which are the pattern,\nand the subject string. */\n\nif (argc - i != 2)\n  {\n  printf(\"Two arguments required: a regex and a subject string\\en\");\n  return 1;\n  }\n\npattern = argv[i];\nsubject = argv[i+1];\nsubject_length = (int)strlen(subject);\n\n\n/*************************************************************************\n* Now we are going to compile the regular expression pattern, and handle *\n* and errors that are detected.                                          *\n*************************************************************************/\n\nre = pcre_compile(\n  pattern,              /* the pattern */\n  0,                    /* default options */\n  &error,               /* for error message */\n  &erroffset,           /* for error offset */\n  NULL);                /* use default character tables */\n\n/* Compilation failed: print the error message and exit */\n\nif (re == NULL)\n  {\n  printf(\"PCRE compilation failed at offset %d: %s\\en\", erroffset, error);\n  return 1;\n  }\n\n\n/*************************************************************************\n* If the compilation succeeded, we call PCRE again, in order to do a     *\n* pattern match against the subject string. This does just ONE match. If *\n* further matching is needed, it will be done below.                     *\n*************************************************************************/\n\nrc = pcre_exec(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  subject,              /* the subject string */\n  subject_length,       /* the length of the subject */\n  0,                    /* start at offset 0 in the subject */\n  0,                    /* default options */\n  ovector,              /* output vector for substring information */\n  OVECCOUNT);           /* number of elements in the output vector */\n\n/* Matching failed: handle error cases */\n\nif (rc < 0)\n  {\n  switch(rc)\n    {\n    case PCRE_ERROR_NOMATCH: printf(\"No match\\en\"); break;\n    /*\n    Handle other special cases if you like\n    */\n    default: printf(\"Matching error %d\\en\", rc); break;\n    }\n  pcre_free(re);     /* Release memory used for the compiled pattern */\n  return 1;\n  }\n\n/* Match succeded */\n\nprintf(\"\\enMatch succeeded at offset %d\\en\", ovector[0]);\n\n\n/*************************************************************************\n* We have found the first match within the subject string. If the output *\n* vector wasn't big enough, say so. Then output any substrings that were *\n* captured.                                                              *\n*************************************************************************/\n\n/* The output vector wasn't big enough */\n\nif (rc == 0)\n  {\n  rc = OVECCOUNT/3;\n  printf(\"ovector only has room for %d captured substrings\\en\", rc - 1);\n  }\n\n/* Show substrings stored in the output vector by number. Obviously, in a real\napplication you might want to do things other than print them. */\n\nfor (i = 0; i < rc; i++)\n  {\n  char *substring_start = subject + ovector[2*i];\n  int substring_length = ovector[2*i+1] - ovector[2*i];\n  printf(\"%2d: %.*s\\en\", i, substring_length, substring_start);\n  }\n\n\n/**************************************************************************\n* That concludes the basic part of this demonstration program. We have    *\n* compiled a pattern, and performed a single match. The code that follows *\n* shows first how to access named substrings, and then how to code for    *\n* repeated matches on the same subject.                                   *\n**************************************************************************/\n\n/* See if there are any named substrings, and if so, show them by name. First\nwe have to extract the count of named parentheses from the pattern. */\n\n(void)pcre_fullinfo(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  PCRE_INFO_NAMECOUNT,  /* number of named substrings */\n  &namecount);          /* where to put the answer */\n\nif (namecount <= 0) printf(\"No named substrings\\en\"); else\n  {\n  unsigned char *tabptr;\n  printf(\"Named substrings\\en\");\n\n  /* Before we can access the substrings, we must extract the table for\n  translating names to numbers, and the size of each entry in the table. */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMETABLE,      /* address of the table */\n    &name_table);             /* where to put the answer */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */\n    &name_entry_size);        /* where to put the answer */\n\n  /* Now we can scan the table and, for each entry, print the number, the name,\n  and the substring itself. */\n\n  tabptr = name_table;\n  for (i = 0; i < namecount; i++)\n    {\n    int n = (tabptr[0] << 8) | tabptr[1];\n    printf(\"(%d) %*s: %.*s\\en\", n, name_entry_size - 3, tabptr + 2,\n      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n    tabptr += name_entry_size;\n    }\n  }\n\n\n/*************************************************************************\n* If the \"-g\" option was given on the command line, we want to continue  *\n* to search for additional matches in the subject string, in a similar   *\n* way to the /g option in Perl. This turns out to be trickier than you   *\n* might think because of the possibility of matching an empty string.    *\n* What happens is as follows:                                            *\n*                                                                        *\n* If the previous match was NOT for an empty string, we can just start   *\n* the next match at the end of the previous one.                         *\n*                                                                        *\n* If the previous match WAS for an empty string, we can't do that, as it *\n* would lead to an infinite loop. Instead, a special call of pcre_exec() *\n* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *\n* The first of these tells PCRE that an empty string at the start of the *\n* subject is not a valid match; other possibilities must be tried. The   *\n* second flag restricts PCRE to one match attempt at the initial string  *\n* position. If this match succeeds, an alternative to the empty string   *\n* match has been found, and we can print it and proceed round the loop,  *\n* advancing by the length of whatever was found. If this match does not  *\n* succeed, we still stay in the loop, advancing by just one character.   *\n* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *\n* more than one byte.                                                    *\n*                                                                        *\n* However, there is a complication concerned with newlines. When the     *\n* newline convention is such that CRLF is a valid newline, we must       *\n* advance by two characters rather than one. The newline convention can  *\n* be set in the regex by (*CR), etc.; if not, we must find the default.  *\n*************************************************************************/\n\nif (!find_all)     /* Check for -g */\n  {\n  pcre_free(re);   /* Release the memory used for the compiled pattern */\n  return 0;        /* Finish unless -g was given */\n  }\n\n/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline\nsequence. First, find the options with which the regex was compiled; extract\nthe UTF-8 state, and mask off all but the newline options. */\n\n(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);\nutf8 = option_bits & PCRE_UTF8;\noption_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|\n               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;\n\n/* If no newline options were set, find the default newline convention from the\nbuild configuration. */\n\nif (option_bits == 0)\n  {\n  int d;\n  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);\n  /* Note that these values are always the ASCII ones, even in\n  EBCDIC environments. CR = 13, NL = 10. */\n  option_bits = (d == 13)? PCRE_NEWLINE_CR :\n          (d == 10)? PCRE_NEWLINE_LF :\n          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :\n          (d == -2)? PCRE_NEWLINE_ANYCRLF :\n          (d == -1)? PCRE_NEWLINE_ANY : 0;\n  }\n\n/* See if CRLF is a valid newline sequence. */\n\ncrlf_is_newline =\n     option_bits == PCRE_NEWLINE_ANY ||\n     option_bits == PCRE_NEWLINE_CRLF ||\n     option_bits == PCRE_NEWLINE_ANYCRLF;\n\n/* Loop for second and subsequent matches */\n\nfor (;;)\n  {\n  int options = 0;                 /* Normally no options */\n  int start_offset = ovector[1];   /* Start at end of previous match */\n\n  /* If the previous match was for an empty string, we are finished if we are\n  at the end of the subject. Otherwise, arrange to run another match at the\n  same point to see if a non-empty match can be found. */\n\n  if (ovector[0] == ovector[1])\n    {\n    if (ovector[0] == subject_length) break;\n    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;\n    }\n\n  /* Run the next matching operation */\n\n  rc = pcre_exec(\n    re,                   /* the compiled pattern */\n    NULL,                 /* no extra data - we didn't study the pattern */\n    subject,              /* the subject string */\n    subject_length,       /* the length of the subject */\n    start_offset,         /* starting offset in the subject */\n    options,              /* options */\n    ovector,              /* output vector for substring information */\n    OVECCOUNT);           /* number of elements in the output vector */\n\n  /* This time, a result of NOMATCH isn't an error. If the value in \"options\"\n  is zero, it just means we have found all possible matches, so the loop ends.\n  Otherwise, it means we have failed to find a non-empty-string match at a\n  point where there was a previous empty-string match. In this case, we do what\n  Perl does: advance the matching position by one character, and continue. We\n  do this by setting the \"end of previous match\" offset, because that is picked\n  up at the top of the loop as the point at which to start again.\n\n  There are two complications: (a) When CRLF is a valid newline sequence, and\n  the current position is just before it, advance by an extra byte. (b)\n  Otherwise we must ensure that we skip an entire UTF-8 character if we are in\n  UTF-8 mode. */\n\n  if (rc == PCRE_ERROR_NOMATCH)\n    {\n    if (options == 0) break;                    /* All matches found */\n    ovector[1] = start_offset + 1;              /* Advance one byte */\n    if (crlf_is_newline &&                      /* If CRLF is newline & */\n        start_offset < subject_length - 1 &&    /* we are at CRLF, */\n        subject[start_offset] == '\\er' &&\n        subject[start_offset + 1] == '\\en')\n      ovector[1] += 1;                          /* Advance by one more. */\n    else if (utf8)                              /* Otherwise, ensure we */\n      {                                         /* advance a whole UTF-8 */\n      while (ovector[1] < subject_length)       /* character. */\n        {\n        if ((subject[ovector[1]] & 0xc0) != 0x80) break;\n        ovector[1] += 1;\n        }\n      }\n    continue;    /* Go round the loop again */\n    }\n\n  /* Other matching errors are not recoverable. */\n\n  if (rc < 0)\n    {\n    printf(\"Matching error %d\\en\", rc);\n    pcre_free(re);    /* Release memory used for the compiled pattern */\n    return 1;\n    }\n\n  /* Match succeded */\n\n  printf(\"\\enMatch succeeded again at offset %d\\en\", ovector[0]);\n\n  /* The match succeeded, but the output vector wasn't big enough. */\n\n  if (rc == 0)\n    {\n    rc = OVECCOUNT/3;\n    printf(\"ovector only has room for %d captured substrings\\en\", rc - 1);\n    }\n\n  /* As before, show substrings stored in the output vector by number, and then\n  also any named substrings. */\n\n  for (i = 0; i < rc; i++)\n    {\n    char *substring_start = subject + ovector[2*i];\n    int substring_length = ovector[2*i+1] - ovector[2*i];\n    printf(\"%2d: %.*s\\en\", i, substring_length, substring_start);\n    }\n\n  if (namecount <= 0) printf(\"No named substrings\\en\"); else\n    {\n    unsigned char *tabptr = name_table;\n    printf(\"Named substrings\\en\");\n    for (i = 0; i < namecount; i++)\n      {\n      int n = (tabptr[0] << 8) | tabptr[1];\n      printf(\"(%d) %*s: %.*s\\en\", n, name_entry_size - 3, tabptr + 2,\n        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n      tabptr += name_entry_size;\n      }\n    }\n  }      /* End of loop to find second and subsequent matches */\n\nprintf(\"\\en\");\npcre_free(re);       /* Release memory used for the compiled pattern */\nreturn 0;\n}\n\n/* End of pcredemo.c */\n.EE\n"
  },
  {
    "path": "src/pcre/doc/pcregrep.1",
    "content": ".TH PCREGREP 1 \"03 April 2014\" \"PCRE 8.35\"\n.SH NAME\npcregrep - a grep with Perl-compatible regular expressions.\n.SH SYNOPSIS\n.B pcregrep [options] [long options] [pattern] [path1 path2 ...]\n.\n.SH DESCRIPTION\n.rs\n.sp\n\\fBpcregrep\\fP searches files for character patterns, in the same way as other\ngrep commands do, but it uses the PCRE regular expression library to support\npatterns that are compatible with the regular expressions of Perl 5. See\n.\\\" HREF\n\\fBpcresyntax\\fP(3)\n.\\\"\nfor a quick-reference summary of pattern syntax, or\n.\\\" HREF\n\\fBpcrepattern\\fP(3)\n.\\\"\nfor a full description of the syntax and semantics of the regular expressions\nthat PCRE supports.\n.P\nPatterns, whether supplied on the command line or in a separate file, are given\nwithout delimiters. For example:\n.sp\n  pcregrep Thursday /etc/motd\n.sp\nIf you attempt to use delimiters (for example, by surrounding a pattern with\nslashes, as is common in Perl scripts), they are interpreted as part of the\npattern. Quotes can of course be used to delimit patterns on the command line\nbecause they are interpreted by the shell, and indeed quotes are required if a\npattern contains white space or shell metacharacters.\n.P\nThe first argument that follows any option settings is treated as the single\npattern to be matched when neither \\fB-e\\fP nor \\fB-f\\fP is present.\nConversely, when one or both of these options are used to specify patterns, all\narguments are treated as path names. At least one of \\fB-e\\fP, \\fB-f\\fP, or an\nargument pattern must be provided.\n.P\nIf no files are specified, \\fBpcregrep\\fP reads the standard input. The\nstandard input can also be referenced by a name consisting of a single hyphen.\nFor example:\n.sp\n  pcregrep some-pattern /file1 - /file3\n.sp\nBy default, each line that matches a pattern is copied to the standard\noutput, and if there is more than one file, the file name is output at the\nstart of each line, followed by a colon. However, there are options that can\nchange how \\fBpcregrep\\fP behaves. In particular, the \\fB-M\\fP option makes it\npossible to search for patterns that span line boundaries. What defines a line\nboundary is controlled by the \\fB-N\\fP (\\fB--newline\\fP) option.\n.P\nThe amount of memory used for buffering files that are being scanned is\ncontrolled by a parameter that can be set by the \\fB--buffer-size\\fP option.\nThe default value for this parameter is specified when \\fBpcregrep\\fP is built,\nwith the default default being 20K. A block of memory three times this size is\nused (to allow for buffering \"before\" and \"after\" lines). An error occurs if a\nline overflows the buffer.\n.P\nPatterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater.\nBUFSIZ is defined in \\fB<stdio.h>\\fP. When there is more than one pattern\n(specified by the use of \\fB-e\\fP and/or \\fB-f\\fP), each pattern is applied to\neach line in the order in which they are defined, except that all the \\fB-e\\fP\npatterns are tried before the \\fB-f\\fP patterns.\n.P\nBy default, as soon as one pattern matches a line, no further patterns are\nconsidered. However, if \\fB--colour\\fP (or \\fB--color\\fP) is used to colour the\nmatching substrings, or if \\fB--only-matching\\fP, \\fB--file-offsets\\fP, or\n\\fB--line-offsets\\fP is used to output only the part of the line that matched\n(either shown literally, or as an offset), scanning resumes immediately\nfollowing the match, so that further matches on the same line can be found. If\nthere are multiple patterns, they are all tried on the remainder of the line,\nbut patterns that follow the one that matched are not tried on the earlier part\nof the line.\n.P\nThis behaviour means that the order in which multiple patterns are specified\ncan affect the output when one of the above options is used. This is no longer\nthe same behaviour as GNU grep, which now manages to display earlier matches\nfor later patterns (as long as there is no overlap).\n.P\nPatterns that can match an empty string are accepted, but empty string\nmatches are never recognized. An example is the pattern \"(super)?(man)?\", in\nwhich all components are optional. This pattern finds all occurrences of both\n\"super\" and \"man\"; the output differs from matching with \"super|man\" when only\nthe matching substrings are being shown.\n.P\nIf the \\fBLC_ALL\\fP or \\fBLC_CTYPE\\fP environment variable is set,\n\\fBpcregrep\\fP uses the value to set a locale when calling the PCRE library.\nThe \\fB--locale\\fP option can be used to override this.\n.\n.\n.SH \"SUPPORT FOR COMPRESSED FILES\"\n.rs\n.sp\nIt is possible to compile \\fBpcregrep\\fP so that it uses \\fBlibz\\fP or\n\\fBlibbz2\\fP to read files whose names end in \\fB.gz\\fP or \\fB.bz2\\fP,\nrespectively. You can find out whether your binary has support for one or both\nof these file types by running it with the \\fB--help\\fP option. If the\nappropriate support is not present, files are treated as plain text. The\nstandard input is always so treated.\n.\n.\n.SH \"BINARY FILES\"\n.rs\n.sp\nBy default, a file that contains a binary zero byte within the first 1024 bytes\nis identified as a binary file, and is processed specially. (GNU grep also\nidentifies binary files in this manner.) See the \\fB--binary-files\\fP option\nfor a means of changing the way binary files are handled.\n.\n.\n.SH OPTIONS\n.rs\n.sp\nThe order in which some of the options appear can affect the output. For\nexample, both the \\fB-h\\fP and \\fB-l\\fP options affect the printing of file\nnames. Whichever comes later in the command line will be the one that takes\neffect. Similarly, except where noted below, if an option is given twice, the\nlater setting is used. Numerical values for options may be followed by K or M,\nto signify multiplication by 1024 or 1024*1024 respectively.\n.TP 10\n\\fB--\\fP\nThis terminates the list of options. It is useful if the next item on the\ncommand line starts with a hyphen but is not an option. This allows for the\nprocessing of patterns and filenames that start with hyphens.\n.TP\n\\fB-A\\fP \\fInumber\\fP, \\fB--after-context=\\fP\\fInumber\\fP\nOutput \\fInumber\\fP lines of context after each matching line. If filenames\nand/or line numbers are being output, a hyphen separator is used instead of a\ncolon for the context lines. A line containing \"--\" is output between each\ngroup of lines, unless they are in fact contiguous in the input file. The value\nof \\fInumber\\fP is expected to be relatively small. However, \\fBpcregrep\\fP\nguarantees to have up to 8K of following text available for context output.\n.TP\n\\fB-a\\fP, \\fB--text\\fP\nTreat binary files as text. This is equivalent to\n\\fB--binary-files\\fP=\\fItext\\fP.\n.TP\n\\fB-B\\fP \\fInumber\\fP, \\fB--before-context=\\fP\\fInumber\\fP\nOutput \\fInumber\\fP lines of context before each matching line. If filenames\nand/or line numbers are being output, a hyphen separator is used instead of a\ncolon for the context lines. A line containing \"--\" is output between each\ngroup of lines, unless they are in fact contiguous in the input file. The value\nof \\fInumber\\fP is expected to be relatively small. However, \\fBpcregrep\\fP\nguarantees to have up to 8K of preceding text available for context output.\n.TP\n\\fB--binary-files=\\fP\\fIword\\fP\nSpecify how binary files are to be processed. If the word is \"binary\" (the\ndefault), pattern matching is performed on binary files, but the only output is\n\"Binary file <name> matches\" when a match succeeds. If the word is \"text\",\nwhich is equivalent to the \\fB-a\\fP or \\fB--text\\fP option, binary files are\nprocessed in the same way as any other file. In this case, when a match\nsucceeds, the output may be binary garbage, which can have nasty effects if\nsent to a terminal. If the word is \"without-match\", which is equivalent to the\n\\fB-I\\fP option, binary files are not processed at all; they are assumed not to\nbe of interest.\n.TP\n\\fB--buffer-size=\\fP\\fInumber\\fP\nSet the parameter that controls how much memory is used for buffering files\nthat are being scanned.\n.TP\n\\fB-C\\fP \\fInumber\\fP, \\fB--context=\\fP\\fInumber\\fP\nOutput \\fInumber\\fP lines of context both before and after each matching line.\nThis is equivalent to setting both \\fB-A\\fP and \\fB-B\\fP to the same value.\n.TP\n\\fB-c\\fP, \\fB--count\\fP\nDo not output individual lines from the files that are being scanned; instead\noutput the number of lines that would otherwise have been shown. If no lines\nare selected, the number zero is output. If several files are are being\nscanned, a count is output for each of them. However, if the\n\\fB--files-with-matches\\fP option is also used, only those files whose counts\nare greater than zero are listed. When \\fB-c\\fP is used, the \\fB-A\\fP,\n\\fB-B\\fP, and \\fB-C\\fP options are ignored.\n.TP\n\\fB--colour\\fP, \\fB--color\\fP\nIf this option is given without any data, it is equivalent to \"--colour=auto\".\nIf data is required, it must be given in the same shell item, separated by an\nequals sign.\n.TP\n\\fB--colour=\\fP\\fIvalue\\fP, \\fB--color=\\fP\\fIvalue\\fP\nThis option specifies under what circumstances the parts of a line that matched\na pattern should be coloured in the output. By default, the output is not\ncoloured. The value (which is optional, see above) may be \"never\", \"always\", or\n\"auto\". In the latter case, colouring happens only if the standard output is\nconnected to a terminal. More resources are used when colouring is enabled,\nbecause \\fBpcregrep\\fP has to search for all possible matches in a line, not\njust one, in order to colour them all.\n.sp\nThe colour that is used can be specified by setting the environment variable\nPCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a\nstring of two numbers, separated by a semicolon. They are copied directly into\nthe control string for setting colour on a terminal, so it is your\nresponsibility to ensure that they make sense. If neither of the environment\nvariables is set, the default is \"1;31\", which gives red.\n.TP\n\\fB-D\\fP \\fIaction\\fP, \\fB--devices=\\fP\\fIaction\\fP\nIf an input path is not a regular file or a directory, \"action\" specifies how\nit is to be processed. Valid values are \"read\" (the default) or \"skip\"\n(silently skip the path).\n.TP\n\\fB-d\\fP \\fIaction\\fP, \\fB--directories=\\fP\\fIaction\\fP\nIf an input path is a directory, \"action\" specifies how it is to be processed.\nValid values are \"read\" (the default in non-Windows environments, for\ncompatibility with GNU grep), \"recurse\" (equivalent to the \\fB-r\\fP option), or\n\"skip\" (silently skip the path, the default in Windows environments). In the\n\"read\" case, directories are read as if they were ordinary files. In some\noperating systems the effect of reading a directory like this is an immediate\nend-of-file; in others it may provoke an error.\n.TP\n\\fB-e\\fP \\fIpattern\\fP, \\fB--regex=\\fP\\fIpattern\\fP, \\fB--regexp=\\fP\\fIpattern\\fP\nSpecify a pattern to be matched. This option can be used multiple times in\norder to specify several patterns. It can also be used as a way of specifying a\nsingle pattern that starts with a hyphen. When \\fB-e\\fP is used, no argument\npattern is taken from the command line; all arguments are treated as file\nnames. There is no limit to the number of patterns. They are applied to each\nline in the order in which they are defined until one matches.\n.sp\nIf \\fB-f\\fP is used with \\fB-e\\fP, the command line patterns are matched first,\nfollowed by the patterns from the file(s), independent of the order in which\nthese options are specified. Note that multiple use of \\fB-e\\fP is not the same\nas a single pattern with alternatives. For example, X|Y finds the first\ncharacter in a line that is X or Y, whereas if the two patterns are given\nseparately, with X first, \\fBpcregrep\\fP finds X if it is present, even if it\nfollows Y in the line. It finds Y only if there is no X in the line. This\nmatters only if you are using \\fB-o\\fP or \\fB--colo(u)r\\fP to show the part(s)\nof the line that matched.\n.TP\n\\fB--exclude\\fP=\\fIpattern\\fP\nFiles (but not directories) whose names match the pattern are skipped without\nbeing processed. This applies to all files, whether listed on the command line,\nobtained from \\fB--file-list\\fP, or by scanning a directory. The pattern is a\nPCRE regular expression, and is matched against the final component of the file\nname, not the entire path. The \\fB-F\\fP, \\fB-w\\fP, and \\fB-x\\fP options do not\napply to this pattern. The option may be given any number of times in order to\nspecify multiple patterns. If a file name matches both an \\fB--include\\fP\nand an \\fB--exclude\\fP pattern, it is excluded. There is no short form for this\noption.\n.TP\n\\fB--exclude-from=\\fP\\fIfilename\\fP\nTreat each non-empty line of the file as the data for an \\fB--exclude\\fP\noption. What constitutes a newline when reading the file is the operating\nsystem's default. The \\fB--newline\\fP option has no effect on this option. This\noption may be given more than once in order to specify a number of files to\nread.\n.TP\n\\fB--exclude-dir\\fP=\\fIpattern\\fP\nDirectories whose names match the pattern are skipped without being processed,\nwhatever the setting of the \\fB--recursive\\fP option. This applies to all\ndirectories, whether listed on the command line, obtained from\n\\fB--file-list\\fP, or by scanning a parent directory. The pattern is a PCRE\nregular expression, and is matched against the final component of the directory\nname, not the entire path. The \\fB-F\\fP, \\fB-w\\fP, and \\fB-x\\fP options do not\napply to this pattern. The option may be given any number of times in order to\nspecify more than one pattern. If a directory matches both \\fB--include-dir\\fP\nand \\fB--exclude-dir\\fP, it is excluded. There is no short form for this\noption.\n.TP\n\\fB-F\\fP, \\fB--fixed-strings\\fP\nInterpret each data-matching pattern as a list of fixed strings, separated by\nnewlines, instead of as a regular expression. What constitutes a newline for\nthis purpose is controlled by the \\fB--newline\\fP option. The \\fB-w\\fP (match\nas a word) and \\fB-x\\fP (match whole line) options can be used with \\fB-F\\fP.\nThey apply to each of the fixed strings. A line is selected if any of the fixed\nstrings are found in it (subject to \\fB-w\\fP or \\fB-x\\fP, if present). This\noption applies only to the patterns that are matched against the contents of\nfiles; it does not apply to patterns specified by any of the \\fB--include\\fP or\n\\fB--exclude\\fP options.\n.TP\n\\fB-f\\fP \\fIfilename\\fP, \\fB--file=\\fP\\fIfilename\\fP\nRead patterns from the file, one per line, and match them against\neach line of input. What constitutes a newline when reading the file is the\noperating system's default. The \\fB--newline\\fP option has no effect on this\noption. Trailing white space is removed from each line, and blank lines are\nignored. An empty file contains no patterns and therefore matches nothing. See\nalso the comments about multiple patterns versus a single pattern with\nalternatives in the description of \\fB-e\\fP above.\n.sp\nIf this option is given more than once, all the specified files are\nread. A data line is output if any of the patterns match it. A filename can\nbe given as \"-\" to refer to the standard input. When \\fB-f\\fP is used, patterns\nspecified on the command line using \\fB-e\\fP may also be present; they are\ntested before the file's patterns. However, no other pattern is taken from the\ncommand line; all arguments are treated as the names of paths to be searched.\n.TP\n\\fB--file-list\\fP=\\fIfilename\\fP\nRead a list of files and/or directories that are to be scanned from the given\nfile, one per line. Trailing white space is removed from each line, and blank\nlines are ignored. These paths are processed before any that are listed on the\ncommand line. The filename can be given as \"-\" to refer to the standard input.\nIf \\fB--file\\fP and \\fB--file-list\\fP are both specified as \"-\", patterns are\nread first. This is useful only when the standard input is a terminal, from\nwhich further lines (the list of files) can be read after an end-of-file\nindication. If this option is given more than once, all the specified files are\nread.\n.TP\n\\fB--file-offsets\\fP\nInstead of showing lines or parts of lines that match, show each match as an\noffset from the start of the file and a length, separated by a comma. In this\nmode, no context is shown. That is, the \\fB-A\\fP, \\fB-B\\fP, and \\fB-C\\fP\noptions are ignored. If there is more than one match in a line, each of them is\nshown separately. This option is mutually exclusive with \\fB--line-offsets\\fP\nand \\fB--only-matching\\fP.\n.TP\n\\fB-H\\fP, \\fB--with-filename\\fP\nForce the inclusion of the filename at the start of output lines when searching\na single file. By default, the filename is not shown in this case. For matching\nlines, the filename is followed by a colon; for context lines, a hyphen\nseparator is used. If a line number is also being output, it follows the file\nname.\n.TP\n\\fB-h\\fP, \\fB--no-filename\\fP\nSuppress the output filenames when searching multiple files. By default,\nfilenames are shown when multiple files are searched. For matching lines, the\nfilename is followed by a colon; for context lines, a hyphen separator is used.\nIf a line number is also being output, it follows the file name.\n.TP\n\\fB--help\\fP\nOutput a help message, giving brief details of the command options and file\ntype support, and then exit. Anything else on the command line is\nignored.\n.TP\n\\fB-I\\fP\nTreat binary files as never matching. This is equivalent to\n\\fB--binary-files\\fP=\\fIwithout-match\\fP.\n.TP\n\\fB-i\\fP, \\fB--ignore-case\\fP\nIgnore upper/lower case distinctions during comparisons.\n.TP\n\\fB--include\\fP=\\fIpattern\\fP\nIf any \\fB--include\\fP patterns are specified, the only files that are\nprocessed are those that match one of the patterns (and do not match an\n\\fB--exclude\\fP pattern). This option does not affect directories, but it\napplies to all files, whether listed on the command line, obtained from\n\\fB--file-list\\fP, or by scanning a directory. The pattern is a PCRE regular\nexpression, and is matched against the final component of the file name, not\nthe entire path. The \\fB-F\\fP, \\fB-w\\fP, and \\fB-x\\fP options do not apply to\nthis pattern. The option may be given any number of times. If a file name\nmatches both an \\fB--include\\fP and an \\fB--exclude\\fP pattern, it is excluded.\nThere is no short form for this option.\n.TP\n\\fB--include-from=\\fP\\fIfilename\\fP\nTreat each non-empty line of the file as the data for an \\fB--include\\fP\noption. What constitutes a newline for this purpose is the operating system's\ndefault. The \\fB--newline\\fP option has no effect on this option. This option\nmay be given any number of times; all the files are read.\n.TP\n\\fB--include-dir\\fP=\\fIpattern\\fP\nIf any \\fB--include-dir\\fP patterns are specified, the only directories that\nare processed are those that match one of the patterns (and do not match an\n\\fB--exclude-dir\\fP pattern). This applies to all directories, whether listed\non the command line, obtained from \\fB--file-list\\fP, or by scanning a parent\ndirectory. The pattern is a PCRE regular expression, and is matched against the\nfinal component of the directory name, not the entire path. The \\fB-F\\fP,\n\\fB-w\\fP, and \\fB-x\\fP options do not apply to this pattern. The option may be\ngiven any number of times. If a directory matches both \\fB--include-dir\\fP and\n\\fB--exclude-dir\\fP, it is excluded. There is no short form for this option.\n.TP\n\\fB-L\\fP, \\fB--files-without-match\\fP\nInstead of outputting lines from the files, just output the names of the files\nthat do not contain any lines that would have been output. Each file name is\noutput once, on a separate line.\n.TP\n\\fB-l\\fP, \\fB--files-with-matches\\fP\nInstead of outputting lines from the files, just output the names of the files\ncontaining lines that would have been output. Each file name is output\nonce, on a separate line. Searching normally stops as soon as a matching line\nis found in a file. However, if the \\fB-c\\fP (count) option is also used,\nmatching continues in order to obtain the correct count, and those files that\nhave at least one match are listed along with their counts. Using this option\nwith \\fB-c\\fP is a way of suppressing the listing of files with no matches.\n.TP\n\\fB--label\\fP=\\fIname\\fP\nThis option supplies a name to be used for the standard input when file names\nare being output. If not supplied, \"(standard input)\" is used. There is no\nshort form for this option.\n.TP\n\\fB--line-buffered\\fP\nWhen this option is given, input is read and processed line by line, and the\noutput is flushed after each write. By default, input is read in large chunks,\nunless \\fBpcregrep\\fP can determine that it is reading from a terminal (which\nis currently possible only in Unix-like environments). Output to terminal is\nnormally automatically flushed by the operating system. This option can be\nuseful when the input or output is attached to a pipe and you do not want\n\\fBpcregrep\\fP to buffer up large amounts of data. However, its use will affect\nperformance, and the \\fB-M\\fP (multiline) option ceases to work.\n.TP\n\\fB--line-offsets\\fP\nInstead of showing lines or parts of lines that match, show each match as a\nline number, the offset from the start of the line, and a length. The line\nnumber is terminated by a colon (as usual; see the \\fB-n\\fP option), and the\noffset and length are separated by a comma. In this mode, no context is shown.\nThat is, the \\fB-A\\fP, \\fB-B\\fP, and \\fB-C\\fP options are ignored. If there is\nmore than one match in a line, each of them is shown separately. This option is\nmutually exclusive with \\fB--file-offsets\\fP and \\fB--only-matching\\fP.\n.TP\n\\fB--locale\\fP=\\fIlocale-name\\fP\nThis option specifies a locale to be used for pattern matching. It overrides\nthe value in the \\fBLC_ALL\\fP or \\fBLC_CTYPE\\fP environment variables. If no\nlocale is specified, the PCRE library's default (usually the \"C\" locale) is\nused. There is no short form for this option.\n.TP\n\\fB--match-limit\\fP=\\fInumber\\fP\nProcessing some regular expression patterns can require a very large amount of\nmemory, leading in some cases to a program crash if not enough is available.\nOther patterns may take a very long time to search for all possible matching\nstrings. The \\fBpcre_exec()\\fP function that is called by \\fBpcregrep\\fP to do\nthe matching has two parameters that can limit the resources that it uses.\n.sp\nThe \\fB--match-limit\\fP option provides a means of limiting resource usage\nwhen processing patterns that are not going to match, but which have a very\nlarge number of possibilities in their search trees. The classic example is a\npattern that uses nested unlimited repeats. Internally, PCRE uses a function\ncalled \\fBmatch()\\fP which it calls repeatedly (sometimes recursively). The\nlimit set by \\fB--match-limit\\fP is imposed on the number of times this\nfunction is called during a match, which has the effect of limiting the amount\nof backtracking that can take place.\n.sp\nThe \\fB--recursion-limit\\fP option is similar to \\fB--match-limit\\fP, but\ninstead of limiting the total number of times that \\fBmatch()\\fP is called, it\nlimits the depth of recursive calls, which in turn limits the amount of memory\nthat can be used. The recursion depth is a smaller number than the total number\nof calls, because not all calls to \\fBmatch()\\fP are recursive. This limit is\nof use only if it is set smaller than \\fB--match-limit\\fP.\n.sp\nThere are no short forms for these options. The default settings are specified\nwhen the PCRE library is compiled, with the default default being 10 million.\n.TP\n\\fB-M\\fP, \\fB--multiline\\fP\nAllow patterns to match more than one line. When this option is given, patterns\nmay usefully contain literal newline characters and internal occurrences of ^\nand $ characters. The output for a successful match may consist of more than\none line, the last of which is the one in which the match ended. If the matched\nstring ends with a newline sequence the output ends at the end of that line.\n.sp\nWhen this option is set, the PCRE library is called in \"multiline\" mode.\nThere is a limit to the number of lines that can be matched, imposed by the way\nthat \\fBpcregrep\\fP buffers the input file as it scans it. However,\n\\fBpcregrep\\fP ensures that at least 8K characters or the rest of the document\n(whichever is the shorter) are available for forward matching, and similarly\nthe previous 8K characters (or all the previous characters, if fewer than 8K)\nare guaranteed to be available for lookbehind assertions. This option does not\nwork when input is read line by line (see \\fP--line-buffered\\fP.)\n.TP\n\\fB-N\\fP \\fInewline-type\\fP, \\fB--newline\\fP=\\fInewline-type\\fP\nThe PCRE library supports five different conventions for indicating\nthe ends of lines. They are the single-character sequences CR (carriage return)\nand LF (linefeed), the two-character sequence CRLF, an \"anycrlf\" convention,\nwhich recognizes any of the preceding three types, and an \"any\" convention, in\nwhich any Unicode line ending sequence is assumed to end a line. The Unicode\nsequences are the three just mentioned, plus VT (vertical tab, U+000B), FF\n(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and\nPS (paragraph separator, U+2029).\n.sp\nWhen the PCRE library is built, a default line-ending sequence is specified.\nThis is normally the standard sequence for the operating system. Unless\notherwise specified by this option, \\fBpcregrep\\fP uses the library's default.\nThe possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This\nmakes it possible to use \\fBpcregrep\\fP to scan files that have come from other\nenvironments without having to modify their line endings. If the data that is\nbeing scanned does not agree with the convention set by this option,\n\\fBpcregrep\\fP may behave in strange ways. Note that this option does not\napply to files specified by the \\fB-f\\fP, \\fB--exclude-from\\fP, or\n\\fB--include-from\\fP options, which are expected to use the operating system's\nstandard newline sequence.\n.TP\n\\fB-n\\fP, \\fB--line-number\\fP\nPrecede each output line by its line number in the file, followed by a colon\nfor matching lines or a hyphen for context lines. If the filename is also being\noutput, it precedes the line number. This option is forced if\n\\fB--line-offsets\\fP is used.\n.TP\n\\fB--no-jit\\fP\nIf the PCRE library is built with support for just-in-time compiling (which\nspeeds up matching), \\fBpcregrep\\fP automatically makes use of this, unless it\nwas explicitly disabled at build time. This option can be used to disable the\nuse of JIT at run time. It is provided for testing and working round problems.\nIt should never be needed in normal use.\n.TP\n\\fB-o\\fP, \\fB--only-matching\\fP\nShow only the part of the line that matched a pattern instead of the whole\nline. In this mode, no context is shown. That is, the \\fB-A\\fP, \\fB-B\\fP, and\n\\fB-C\\fP options are ignored. If there is more than one match in a line, each\nof them is shown separately. If \\fB-o\\fP is combined with \\fB-v\\fP (invert the\nsense of the match to find non-matching lines), no output is generated, but the\nreturn code is set appropriately. If the matched portion of the line is empty,\nnothing is output unless the file name or line number are being printed, in\nwhich case they are shown on an otherwise empty line. This option is mutually\nexclusive with \\fB--file-offsets\\fP and \\fB--line-offsets\\fP.\n.TP\n\\fB-o\\fP\\fInumber\\fP, \\fB--only-matching\\fP=\\fInumber\\fP\nShow only the part of the line that matched the capturing parentheses of the\ngiven number. Up to 32 capturing parentheses are supported, and -o0 is\nequivalent to \\fB-o\\fP without a number. Because these options can be given\nwithout an argument (see above), if an argument is present, it must be given in\nthe same shell item, for example, -o3 or --only-matching=2. The comments given\nfor the non-argument case above also apply to this case. If the specified\ncapturing parentheses do not exist in the pattern, or were not set in the\nmatch, nothing is output unless the file name or line number are being printed.\n.sp\nIf this option is given multiple times, multiple substrings are output, in the\norder the options are given. For example, -o3 -o1 -o3 causes the substrings\nmatched by capturing parentheses 3 and 1 and then 3 again to be output. By\ndefault, there is no separator (but see the next option).\n.TP\n\\fB--om-separator\\fP=\\fItext\\fP\nSpecify a separating string for multiple occurrences of \\fB-o\\fP. The default\nis an empty string. Separating strings are never coloured.\n.TP\n\\fB-q\\fP, \\fB--quiet\\fP\nWork quietly, that is, display nothing except error messages. The exit\nstatus indicates whether or not any matches were found.\n.TP\n\\fB-r\\fP, \\fB--recursive\\fP\nIf any given path is a directory, recursively scan the files it contains,\ntaking note of any \\fB--include\\fP and \\fB--exclude\\fP settings. By default, a\ndirectory is read as a normal file; in some operating systems this gives an\nimmediate end-of-file. This option is a shorthand for setting the \\fB-d\\fP\noption to \"recurse\".\n.TP\n\\fB--recursion-limit\\fP=\\fInumber\\fP\nSee \\fB--match-limit\\fP above.\n.TP\n\\fB-s\\fP, \\fB--no-messages\\fP\nSuppress error messages about non-existent or unreadable files. Such files are\nquietly skipped. However, the return code is still 2, even if matches were\nfound in other files.\n.TP\n\\fB-u\\fP, \\fB--utf-8\\fP\nOperate in UTF-8 mode. This option is available only if PCRE has been compiled\nwith UTF-8 support. All patterns (including those for any \\fB--exclude\\fP and\n\\fB--include\\fP options) and all subject lines that are scanned must be valid\nstrings of UTF-8 characters.\n.TP\n\\fB-V\\fP, \\fB--version\\fP\nWrite the version numbers of \\fBpcregrep\\fP and the PCRE library to the\nstandard output and then exit. Anything else on the command line is\nignored.\n.TP\n\\fB-v\\fP, \\fB--invert-match\\fP\nInvert the sense of the match, so that lines which do \\fInot\\fP match any of\nthe patterns are the ones that are found.\n.TP\n\\fB-w\\fP, \\fB--word-regex\\fP, \\fB--word-regexp\\fP\nForce the patterns to match only whole words. This is equivalent to having \\eb\nat the start and end of the pattern. This option applies only to the patterns\nthat are matched against the contents of files; it does not apply to patterns\nspecified by any of the \\fB--include\\fP or \\fB--exclude\\fP options.\n.TP\n\\fB-x\\fP, \\fB--line-regex\\fP, \\fB--line-regexp\\fP\nForce the patterns to be anchored (each must start matching at the beginning of\na line) and in addition, require them to match entire lines. This is equivalent\nto having ^ and $ characters at the start and end of each alternative branch in\nevery pattern. This option applies only to the patterns that are matched\nagainst the contents of files; it does not apply to patterns specified by any\nof the \\fB--include\\fP or \\fB--exclude\\fP options.\n.\n.\n.SH \"ENVIRONMENT VARIABLES\"\n.rs\n.sp\nThe environment variables \\fBLC_ALL\\fP and \\fBLC_CTYPE\\fP are examined, in that\norder, for a locale. The first one that is set is used. This can be overridden\nby the \\fB--locale\\fP option. If no locale is set, the PCRE library's default\n(usually the \"C\" locale) is used.\n.\n.\n.SH \"NEWLINES\"\n.rs\n.sp\nThe \\fB-N\\fP (\\fB--newline\\fP) option allows \\fBpcregrep\\fP to scan files with\ndifferent newline conventions from the default. Any parts of the input files\nthat are written to the standard output are copied identically, with whatever\nnewline sequences they have in the input. However, the setting of this option\ndoes not affect the interpretation of files specified by the \\fB-f\\fP,\n\\fB--exclude-from\\fP, or \\fB--include-from\\fP options, which are assumed to use\nthe operating system's standard newline sequence, nor does it affect the way in\nwhich \\fBpcregrep\\fP writes informational messages to the standard error and\noutput streams. For these it uses the string \"\\en\" to indicate newlines,\nrelying on the C I/O library to convert this to an appropriate sequence.\n.\n.\n.SH \"OPTIONS COMPATIBILITY\"\n.rs\n.sp\nMany of the short and long forms of \\fBpcregrep\\fP's options are the same\nas in the GNU \\fBgrep\\fP program. Any long option of the form\n\\fB--xxx-regexp\\fP (GNU terminology) is also available as \\fB--xxx-regex\\fP\n(PCRE terminology). However, the \\fB--file-list\\fP, \\fB--file-offsets\\fP,\n\\fB--include-dir\\fP, \\fB--line-offsets\\fP, \\fB--locale\\fP, \\fB--match-limit\\fP,\n\\fB-M\\fP, \\fB--multiline\\fP, \\fB-N\\fP, \\fB--newline\\fP, \\fB--om-separator\\fP,\n\\fB--recursion-limit\\fP, \\fB-u\\fP, and \\fB--utf-8\\fP options are specific to\n\\fBpcregrep\\fP, as is the use of the \\fB--only-matching\\fP option with a\ncapturing parentheses number.\n.P\nAlthough most of the common options work the same way, a few are different in\n\\fBpcregrep\\fP. For example, the \\fB--include\\fP option's argument is a glob\nfor GNU \\fBgrep\\fP, but a regular expression for \\fBpcregrep\\fP. If both the\n\\fB-c\\fP and \\fB-l\\fP options are given, GNU grep lists only file names,\nwithout counts, but \\fBpcregrep\\fP gives the counts.\n.\n.\n.SH \"OPTIONS WITH DATA\"\n.rs\n.sp\nThere are four different ways in which an option with data can be specified.\nIf a short form option is used, the data may follow immediately, or (with one\nexception) in the next command line item. For example:\n.sp\n  -f/some/file\n  -f /some/file\n.sp\nThe exception is the \\fB-o\\fP option, which may appear with or without data.\nBecause of this, if data is present, it must follow immediately in the same\nitem, for example -o3.\n.P\nIf a long form option is used, the data may appear in the same command line\nitem, separated by an equals character, or (with two exceptions) it may appear\nin the next command line item. For example:\n.sp\n  --file=/some/file\n  --file /some/file\n.sp\nNote, however, that if you want to supply a file name beginning with ~ as data\nin a shell command, and have the shell expand ~ to a home directory, you must\nseparate the file name from the option, because the shell does not treat ~\nspecially unless it is at the start of an item.\n.P\nThe exceptions to the above are the \\fB--colour\\fP (or \\fB--color\\fP) and\n\\fB--only-matching\\fP options, for which the data is optional. If one of these\noptions does have data, it must be given in the first form, using an equals\ncharacter. Otherwise \\fBpcregrep\\fP will assume that it has no data.\n.\n.\n.SH \"MATCHING ERRORS\"\n.rs\n.sp\nIt is possible to supply a regular expression that takes a very long time to\nfail to match certain lines. Such patterns normally involve nested indefinite\nrepeats, for example: (a+)*\\ed when matched against a line of a's with no final\ndigit. The PCRE matching function has a resource limit that causes it to abort\nin these circumstances. If this happens, \\fBpcregrep\\fP outputs an error\nmessage and the line that caused the problem to the standard error stream. If\nthere are more than 20 such errors, \\fBpcregrep\\fP gives up.\n.P\nThe \\fB--match-limit\\fP option of \\fBpcregrep\\fP can be used to set the overall\nresource limit; there is a second option called \\fB--recursion-limit\\fP that\nsets a limit on the amount of memory (usually stack) that is used (see the\ndiscussion of these options above).\n.\n.\n.SH DIAGNOSTICS\n.rs\n.sp\nExit status is 0 if any matches were found, 1 if no matches were found, and 2\nfor syntax errors, overlong lines, non-existent or inaccessible files (even if\nmatches were found in other files) or too many matching errors. Using the\n\\fB-s\\fP option to suppress error messages about inaccessible files does not\naffect the return code.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcrepattern\\fP(3), \\fBpcresyntax\\fP(3), \\fBpcretest\\fP(1).\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 03 April 2014\nCopyright (c) 1997-2014 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcregrep.txt",
    "content": "PCREGREP(1)                 General Commands Manual                PCREGREP(1)\n\n\n\nNAME\n       pcregrep - a grep with Perl-compatible regular expressions.\n\nSYNOPSIS\n       pcregrep [options] [long options] [pattern] [path1 path2 ...]\n\n\nDESCRIPTION\n\n       pcregrep  searches  files  for  character  patterns, in the same way as\n       other grep commands do, but it uses the PCRE regular expression library\n       to support patterns that are compatible with the regular expressions of\n       Perl 5. See pcresyntax(3) for a quick-reference summary of pattern syn-\n       tax,  or pcrepattern(3) for a full description of the syntax and seman-\n       tics of the regular expressions that PCRE supports.\n\n       Patterns, whether supplied on the command line or in a  separate  file,\n       are given without delimiters. For example:\n\n         pcregrep Thursday /etc/motd\n\n       If you attempt to use delimiters (for example, by surrounding a pattern\n       with slashes, as is common in Perl scripts), they  are  interpreted  as\n       part  of  the pattern. Quotes can of course be used to delimit patterns\n       on the command line because they are  interpreted  by  the  shell,  and\n       indeed  quotes  are required if a pattern contains white space or shell\n       metacharacters.\n\n       The first argument that follows any option settings is treated  as  the\n       single  pattern  to be matched when neither -e nor -f is present.  Con-\n       versely, when one or both of these options are  used  to  specify  pat-\n       terns, all arguments are treated as path names. At least one of -e, -f,\n       or an argument pattern must be provided.\n\n       If no files are specified, pcregrep reads the standard input. The stan-\n       dard  input  can  also  be  referenced by a name consisting of a single\n       hyphen.  For example:\n\n         pcregrep some-pattern /file1 - /file3\n\n       By default, each line that matches a pattern is copied to the  standard\n       output,  and if there is more than one file, the file name is output at\n       the start of each line, followed by a colon. However, there are options\n       that  can  change  how  pcregrep  behaves. In particular, the -M option\n       makes it possible to search for patterns  that  span  line  boundaries.\n       What  defines  a  line  boundary  is  controlled  by the -N (--newline)\n       option.\n\n       The amount of memory used for buffering files that are being scanned is\n       controlled  by a parameter that can be set by the --buffer-size option.\n       The default value for this parameter  is  specified  when  pcregrep  is\n       built,  with  the  default  default  being 20K. A block of memory three\n       times this size is used (to allow for buffering  \"before\"  and  \"after\"\n       lines). An error occurs if a line overflows the buffer.\n\n       Patterns  can  be  no  longer than 8K or BUFSIZ bytes, whichever is the\n       greater.  BUFSIZ is defined in <stdio.h>. When there is more  than  one\n       pattern (specified by the use of -e and/or -f), each pattern is applied\n       to each line in the order in which they are defined,  except  that  all\n       the -e patterns are tried before the -f patterns.\n\n       By  default, as soon as one pattern matches a line, no further patterns\n       are considered. However, if --colour (or --color) is used to colour the\n       matching  substrings, or if --only-matching, --file-offsets, or --line-\n       offsets is used to output only  the  part  of  the  line  that  matched\n       (either shown literally, or as an offset), scanning resumes immediately\n       following the match, so that further matches on the same  line  can  be\n       found.  If  there  are  multiple  patterns,  they  are all tried on the\n       remainder of the line, but patterns that follow the  one  that  matched\n       are not tried on the earlier part of the line.\n\n       This  behaviour  means  that  the  order in which multiple patterns are\n       specified can affect the output when one of the above options is  used.\n       This  is no longer the same behaviour as GNU grep, which now manages to\n       display earlier matches for later patterns (as  long  as  there  is  no\n       overlap).\n\n       Patterns  that can match an empty string are accepted, but empty string\n       matches   are   never   recognized.   An   example   is   the   pattern\n       \"(super)?(man)?\",  in  which  all components are optional. This pattern\n       finds all occurrences of both \"super\" and  \"man\";  the  output  differs\n       from  matching  with  \"super|man\" when only the matching substrings are\n       being shown.\n\n       If the LC_ALL or LC_CTYPE environment variable is  set,  pcregrep  uses\n       the  value to set a locale when calling the PCRE library.  The --locale\n       option can be used to override this.\n\n\nSUPPORT FOR COMPRESSED FILES\n\n       It is possible to compile pcregrep so that it uses libz  or  libbz2  to\n       read  files  whose names end in .gz or .bz2, respectively. You can find\n       out whether your binary has support for one or both of these file types\n       by running it with the --help option. If the appropriate support is not\n       present, files are treated as plain text. The standard input is  always\n       so treated.\n\n\nBINARY FILES\n\n       By  default,  a  file that contains a binary zero byte within the first\n       1024 bytes is identified as a binary file, and is processed  specially.\n       (GNU  grep  also  identifies  binary  files  in  this  manner.) See the\n       --binary-files option for a means of changing the way binary files  are\n       handled.\n\n\nOPTIONS\n\n       The  order  in  which some of the options appear can affect the output.\n       For example, both the -h and -l options affect  the  printing  of  file\n       names.  Whichever  comes later in the command line will be the one that\n       takes effect. Similarly, except where noted  below,  if  an  option  is\n       given  twice,  the  later setting is used. Numerical values for options\n       may be followed by K  or  M,  to  signify  multiplication  by  1024  or\n       1024*1024 respectively.\n\n       --        This terminates the list of options. It is useful if the next\n                 item on the command line starts with a hyphen but is  not  an\n                 option.  This allows for the processing of patterns and file-\n                 names that start with hyphens.\n\n       -A number, --after-context=number\n                 Output number lines of context after each matching  line.  If\n                 filenames and/or line numbers are being output, a hyphen sep-\n                 arator is used instead of a colon for the  context  lines.  A\n                 line  containing  \"--\" is output between each group of lines,\n                 unless they are in fact contiguous in  the  input  file.  The\n                 value  of number is expected to be relatively small. However,\n                 pcregrep guarantees to have up to 8K of following text avail-\n                 able for context output.\n\n       -a, --text\n                 Treat  binary  files as text. This is equivalent to --binary-\n                 files=text.\n\n       -B number, --before-context=number\n                 Output number lines of context before each matching line.  If\n                 filenames and/or line numbers are being output, a hyphen sep-\n                 arator is used instead of a colon for the  context  lines.  A\n                 line  containing  \"--\" is output between each group of lines,\n                 unless they are in fact contiguous in  the  input  file.  The\n                 value  of number is expected to be relatively small. However,\n                 pcregrep guarantees to have up to 8K of preceding text avail-\n                 able for context output.\n\n       --binary-files=word\n                 Specify  how binary files are to be processed. If the word is\n                 \"binary\" (the default),  pattern  matching  is  performed  on\n                 binary  files,  but  the  only  output is \"Binary file <name>\n                 matches\" when a match succeeds. If the word is \"text\",  which\n                 is  equivalent  to  the -a or --text option, binary files are\n                 processed in the same way as any other file.  In  this  case,\n                 when  a  match  succeeds,  the  output may be binary garbage,\n                 which can have nasty effects if sent to a  terminal.  If  the\n                 word  is  \"without-match\",  which  is  equivalent  to  the -I\n                 option, binary files are  not  processed  at  all;  they  are\n                 assumed not to be of interest.\n\n       --buffer-size=number\n                 Set  the  parameter that controls how much memory is used for\n                 buffering files that are being scanned.\n\n       -C number, --context=number\n                 Output number lines of context both  before  and  after  each\n                 matching  line.  This is equivalent to setting both -A and -B\n                 to the same value.\n\n       -c, --count\n                 Do not output individual lines from the files that are  being\n                 scanned; instead output the number of lines that would other-\n                 wise have been shown. If no lines are  selected,  the  number\n                 zero  is  output.  If  several files are are being scanned, a\n                 count is output for each of them. However,  if  the  --files-\n                 with-matches  option  is  also  used,  only those files whose\n                 counts are greater than zero are listed. When -c is used, the\n                 -A, -B, and -C options are ignored.\n\n       --colour, --color\n                 If this option is given without any data, it is equivalent to\n                 \"--colour=auto\".  If data is required, it must  be  given  in\n                 the same shell item, separated by an equals sign.\n\n       --colour=value, --color=value\n                 This option specifies under what circumstances the parts of a\n                 line that matched a pattern should be coloured in the output.\n                 By  default,  the output is not coloured. The value (which is\n                 optional, see above) may be \"never\", \"always\", or \"auto\".  In\n                 the  latter case, colouring happens only if the standard out-\n                 put is connected to a terminal. More resources are used  when\n                 colouring  is enabled, because pcregrep has to search for all\n                 possible matches in a line, not just one, in order to  colour\n                 them all.\n\n                 The colour that is used can be specified by setting the envi-\n                 ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value\n                 of this variable should be a string of two numbers, separated\n                 by a semicolon. They are copied  directly  into  the  control\n                 string  for  setting  colour  on  a  terminal,  so it is your\n                 responsibility to ensure that they make sense. If neither  of\n                 the  environment  variables  is  set,  the default is \"1;31\",\n                 which gives red.\n\n       -D action, --devices=action\n                 If an input path is  not  a  regular  file  or  a  directory,\n                 \"action\"  specifies  how  it is to be processed. Valid values\n                 are \"read\" (the default) or \"skip\" (silently skip the path).\n\n       -d action, --directories=action\n                 If an input path is a directory, \"action\" specifies how it is\n                 to  be  processed.   Valid  values are \"read\" (the default in\n                 non-Windows environments, for compatibility with  GNU  grep),\n                 \"recurse\"  (equivalent to the -r option), or \"skip\" (silently\n                 skip the path, the default in Windows environments).  In  the\n                 \"read\"  case,  directories  are read as if they were ordinary\n                 files. In some operating systems  the  effect  of  reading  a\n                 directory like this is an immediate end-of-file; in others it\n                 may provoke an error.\n\n       -e pattern, --regex=pattern, --regexp=pattern\n                 Specify a pattern to be matched. This option can be used mul-\n                 tiple times in order to specify several patterns. It can also\n                 be used as a way of specifying a single pattern  that  starts\n                 with  a hyphen. When -e is used, no argument pattern is taken\n                 from the command line; all  arguments  are  treated  as  file\n                 names.  There is no limit to the number of patterns. They are\n                 applied to each line in the order in which they  are  defined\n                 until one matches.\n\n                 If  -f is used with -e, the command line patterns are matched\n                 first, followed by the patterns from the file(s), independent\n                 of  the order in which these options are specified. Note that\n                 multiple use of -e is not the same as a single  pattern  with\n                 alternatives. For example, X|Y finds the first character in a\n                 line that is X or Y, whereas if the two  patterns  are  given\n                 separately,  with X first, pcregrep finds X if it is present,\n                 even if it follows Y in the line. It finds Y only if there is\n                 no  X  in  the line. This matters only if you are using -o or\n                 --colo(u)r to show the part(s) of the line that matched.\n\n       --exclude=pattern\n                 Files (but not directories) whose names match the pattern are\n                 skipped  without  being processed. This applies to all files,\n                 whether listed on the command  line,  obtained  from  --file-\n                 list, or by scanning a directory. The pattern is a PCRE regu-\n                 lar expression, and is matched against the final component of\n                 the  file  name,  not  the  entire  path.  The -F, -w, and -x\n                 options do not apply to this pattern. The option may be given\n                 any number of times in order to specify multiple patterns. If\n                 a file name matches both an --include and an  --exclude  pat-\n                 tern, it is excluded. There is no short form for this option.\n\n       --exclude-from=filename\n                 Treat  each  non-empty  line  of  the file as the data for an\n                 --exclude option. What constitutes a newline when reading the\n                 file  is the operating system's default. The --newline option\n                 has no effect on this option. This option may be  given  more\n                 than once in order to specify a number of files to read.\n\n       --exclude-dir=pattern\n                 Directories whose names match the pattern are skipped without\n                 being processed, whatever  the  setting  of  the  --recursive\n                 option.  This  applies  to all directories, whether listed on\n                 the command line, obtained from --file-list, or by scanning a\n                 parent  directory.  The pattern is a PCRE regular expression,\n                 and is matched against the final component of  the  directory\n                 name,  not the entire path. The -F, -w, and -x options do not\n                 apply to this pattern. The option may be given any number  of\n                 times  in order to specify more than one pattern. If a direc-\n                 tory matches both  --include-dir  and  --exclude-dir,  it  is\n                 excluded. There is no short form for this option.\n\n       -F, --fixed-strings\n                 Interpret  each  data-matching  pattern  as  a  list of fixed\n                 strings, separated by  newlines,  instead  of  as  a  regular\n                 expression.  What  constitutes  a newline for this purpose is\n                 controlled by the --newline option. The -w (match as a  word)\n                 and  -x (match whole line) options can be used with -F.  They\n                 apply to each of the fixed strings. A line is selected if any\n                 of the fixed strings are found in it (subject to -w or -x, if\n                 present). This option applies only to the patterns  that  are\n                 matched  against  the contents of files; it does not apply to\n                 patterns specified by  any  of  the  --include  or  --exclude\n                 options.\n\n       -f filename, --file=filename\n                 Read  patterns  from  the  file, one per line, and match them\n                 against each line of input. What constitutes a  newline  when\n                 reading  the  file  is  the  operating  system's default. The\n                 --newline option has no effect on this option. Trailing white\n                 space is removed from each line, and blank lines are ignored.\n                 An empty file contains  no  patterns  and  therefore  matches\n                 nothing. See also the comments about multiple patterns versus\n                 a single pattern with alternatives in the description  of  -e\n                 above.\n\n                 If  this  option  is  given more than once, all the specified\n                 files are read. A data line is output if any of the  patterns\n                 match  it.  A  filename  can  be given as \"-\" to refer to the\n                 standard input. When -f is used, patterns  specified  on  the\n                 command  line  using  -e may also be present; they are tested\n                 before the file's patterns.  However,  no  other  pattern  is\n                 taken from the command line; all arguments are treated as the\n                 names of paths to be searched.\n\n       --file-list=filename\n                 Read a list of  files  and/or  directories  that  are  to  be\n                 scanned  from  the  given  file, one per line. Trailing white\n                 space is removed from each line, and blank lines are ignored.\n                 These  paths  are processed before any that are listed on the\n                 command line. The filename can be given as \"-\"  to  refer  to\n                 the standard input.  If --file and --file-list are both spec-\n                 ified as \"-\", patterns are read first. This  is  useful  only\n                 when  the  standard  input  is a terminal, from which further\n                 lines (the list of files) can be read  after  an  end-of-file\n                 indication.  If  this option is given more than once, all the\n                 specified files are read.\n\n       --file-offsets\n                 Instead of showing lines or parts of lines that  match,  show\n                 each  match  as  an  offset  from the start of the file and a\n                 length, separated by a comma. In this  mode,  no  context  is\n                 shown.  That  is,  the -A, -B, and -C options are ignored. If\n                 there is more than one match in a line, each of them is shown\n                 separately.  This  option  is mutually exclusive with --line-\n                 offsets and --only-matching.\n\n       -H, --with-filename\n                 Force the inclusion of the filename at the  start  of  output\n                 lines  when searching a single file. By default, the filename\n                 is not shown in this case. For matching lines,  the  filename\n                 is followed by a colon; for context lines, a hyphen separator\n                 is used. If a line number is also being  output,  it  follows\n                 the file name.\n\n       -h, --no-filename\n                 Suppress  the output filenames when searching multiple files.\n                 By default, filenames  are  shown  when  multiple  files  are\n                 searched.  For  matching lines, the filename is followed by a\n                 colon; for context lines, a hyphen separator is used.   If  a\n                 line number is also being output, it follows the file name.\n\n       --help    Output  a  help  message, giving brief details of the command\n                 options and file type support, and then exit.  Anything  else\n                 on the command line is ignored.\n\n       -I        Treat  binary  files as never matching. This is equivalent to\n                 --binary-files=without-match.\n\n       -i, --ignore-case\n                 Ignore upper/lower case distinctions during comparisons.\n\n       --include=pattern\n                 If any --include patterns are specified, the only files  that\n                 are  processed  are those that match one of the patterns (and\n                 do not match an --exclude  pattern).  This  option  does  not\n                 affect  directories,  but  it  applies  to all files, whether\n                 listed on the command line, obtained from --file-list, or  by\n                 scanning  a  directory. The pattern is a PCRE regular expres-\n                 sion, and is matched against the final component of the  file\n                 name,  not the entire path. The -F, -w, and -x options do not\n                 apply to this pattern. The option may be given any number  of\n                 times.  If  a  file  name  matches  both  an --include and an\n                 --exclude pattern, it is excluded.  There is  no  short  form\n                 for this option.\n\n       --include-from=filename\n                 Treat  each  non-empty  line  of  the file as the data for an\n                 --include option. What constitutes a newline for this purpose\n                 is  the  operating system's default. The --newline option has\n                 no effect on this option. This option may be given any number\n                 of times; all the files are read.\n\n       --include-dir=pattern\n                 If  any --include-dir patterns are specified, the only direc-\n                 tories that are processed are those that  match  one  of  the\n                 patterns  (and  do  not match an --exclude-dir pattern). This\n                 applies to all directories, whether  listed  on  the  command\n                 line,  obtained  from  --file-list,  or  by scanning a parent\n                 directory. The pattern is a PCRE regular expression,  and  is\n                 matched  against  the  final component of the directory name,\n                 not the entire path. The -F, -w, and -x options do not  apply\n                 to this pattern. The option may be given any number of times.\n                 If a directory matches both --include-dir and  --exclude-dir,\n                 it is excluded. There is no short form for this option.\n\n       -L, --files-without-match\n                 Instead  of  outputting lines from the files, just output the\n                 names of the files that do not contain any lines  that  would\n                 have  been  output. Each file name is output once, on a sepa-\n                 rate line.\n\n       -l, --files-with-matches\n                 Instead of outputting lines from the files, just  output  the\n                 names of the files containing lines that would have been out-\n                 put. Each file name is  output  once,  on  a  separate  line.\n                 Searching  normally stops as soon as a matching line is found\n                 in a file. However, if the -c (count) option  is  also  used,\n                 matching  continues in order to obtain the correct count, and\n                 those files that have at least one  match  are  listed  along\n                 with their counts. Using this option with -c is a way of sup-\n                 pressing the listing of files with no matches.\n\n       --label=name\n                 This option supplies a name to be used for the standard input\n                 when file names are being output. If not supplied, \"(standard\n                 input)\" is used. There is no short form for this option.\n\n       --line-buffered\n                 When this option is given, input is read and  processed  line\n                 by  line,  and  the  output  is  flushed after each write. By\n                 default, input is read in large chunks, unless  pcregrep  can\n                 determine  that  it is reading from a terminal (which is cur-\n                 rently possible only in Unix-like  environments).  Output  to\n                 terminal  is  normally automatically flushed by the operating\n                 system. This option can be useful when the input or output is\n                 attached  to a pipe and you do not want pcregrep to buffer up\n                 large amounts of data. However, its use will  affect  perfor-\n                 mance, and the -M (multiline) option ceases to work.\n\n       --line-offsets\n                 Instead  of  showing lines or parts of lines that match, show\n                 each match as a line number, the offset from the start of the\n                 line,  and a length. The line number is terminated by a colon\n                 (as usual; see the -n option), and the offset and length  are\n                 separated  by  a  comma.  In  this mode, no context is shown.\n                 That is, the -A, -B, and -C options are ignored. If there  is\n                 more  than  one  match in a line, each of them is shown sepa-\n                 rately. This option is mutually exclusive with --file-offsets\n                 and --only-matching.\n\n       --locale=locale-name\n                 This  option specifies a locale to be used for pattern match-\n                 ing. It overrides the value in the LC_ALL or  LC_CTYPE  envi-\n                 ronment  variables.  If  no  locale  is  specified,  the PCRE\n                 library's default (usually the \"C\" locale) is used. There  is\n                 no short form for this option.\n\n       --match-limit=number\n                 Processing  some  regular  expression  patterns can require a\n                 very large amount of memory, leading in some cases to a  pro-\n                 gram  crash  if  not enough is available.  Other patterns may\n                 take a very long time to search  for  all  possible  matching\n                 strings.  The pcre_exec() function that is called by pcregrep\n                 to do the matching has two  parameters  that  can  limit  the\n                 resources that it uses.\n\n                 The   --match-limit  option  provides  a  means  of  limiting\n                 resource usage when processing patterns that are not going to\n                 match, but which have a very large number of possibilities in\n                 their search trees. The classic example  is  a  pattern  that\n                 uses  nested unlimited repeats. Internally, PCRE uses a func-\n                 tion called match()  which  it  calls  repeatedly  (sometimes\n                 recursively).  The  limit  set by --match-limit is imposed on\n                 the number of times this function is called during  a  match,\n                 which  has  the effect of limiting the amount of backtracking\n                 that can take place.\n\n                 The --recursion-limit option is similar to --match-limit, but\n                 instead of limiting the total number of times that match() is\n                 called, it limits the depth of recursive calls, which in turn\n                 limits  the  amount of memory that can be used. The recursion\n                 depth is a smaller number than the  total  number  of  calls,\n                 because not all calls to match() are recursive. This limit is\n                 of use only if it is set smaller than --match-limit.\n\n                 There are no short forms for these options. The default  set-\n                 tings  are  specified when the PCRE library is compiled, with\n                 the default default being 10 million.\n\n       -M, --multiline\n                 Allow patterns to match more than one line. When this  option\n                 is given, patterns may usefully contain literal newline char-\n                 acters and internal occurrences of ^ and  $  characters.  The\n                 output  for  a  successful match may consist of more than one\n                 line, the last of which is the one in which the match  ended.\n                 If the matched string ends with a newline sequence the output\n                 ends at the end of that line.\n\n                 When this option is set, the PCRE library is called in  \"mul-\n                 tiline\"  mode.   There is a limit to the number of lines that\n                 can be matched, imposed by the way that pcregrep buffers  the\n                 input  file as it scans it. However, pcregrep ensures that at\n                 least 8K characters or the rest of the document (whichever is\n                 the  shorter)  are  available for forward matching, and simi-\n                 larly the previous 8K characters (or all the previous charac-\n                 ters,  if  fewer  than 8K) are guaranteed to be available for\n                 lookbehind assertions. This option does not work  when  input\n                 is read line by line (see --line-buffered.)\n\n       -N newline-type, --newline=newline-type\n                 The  PCRE  library  supports  five  different conventions for\n                 indicating the ends of lines. They are  the  single-character\n                 sequences  CR  (carriage  return) and LF (linefeed), the two-\n                 character sequence CRLF, an \"anycrlf\" convention, which  rec-\n                 ognizes  any  of the preceding three types, and an \"any\" con-\n                 vention, in which any Unicode line ending sequence is assumed\n                 to  end a line. The Unicode sequences are the three just men-\n                 tioned, plus  VT  (vertical  tab,  U+000B),  FF  (form  feed,\n                 U+000C),   NEL  (next  line,  U+0085),  LS  (line  separator,\n                 U+2028), and PS (paragraph separator, U+2029).\n\n                 When  the  PCRE  library  is  built,  a  default  line-ending\n                 sequence   is  specified.   This  is  normally  the  standard\n                 sequence for the operating system. Unless otherwise specified\n                 by  this  option,  pcregrep  uses the library's default.  The\n                 possible values for this option are CR, LF, CRLF, ANYCRLF, or\n                 ANY.  This  makes  it  possible to use pcregrep to scan files\n                 that have come from other environments without having to mod-\n                 ify  their  line  endings.  If the data that is being scanned\n                 does not agree with the convention set by this option,  pcre-\n                 grep  may  behave in strange ways. Note that this option does\n                 not apply to files specified by the  -f,  --exclude-from,  or\n                 --include-from options, which are expected to use the operat-\n                 ing system's standard newline sequence.\n\n       -n, --line-number\n                 Precede each output line by its line number in the file, fol-\n                 lowed  by  a colon for matching lines or a hyphen for context\n                 lines. If the filename is also being output, it precedes  the\n                 line number. This option is forced if --line-offsets is used.\n\n       --no-jit  If  the  PCRE  library is built with support for just-in-time\n                 compiling (which speeds up matching), pcregrep  automatically\n                 makes use of this, unless it was explicitly disabled at build\n                 time. This option can be used to disable the use  of  JIT  at\n                 run  time. It is provided for testing and working round prob-\n                 lems.  It should never be needed in normal use.\n\n       -o, --only-matching\n                 Show only the part of the line that matched a pattern instead\n                 of  the  whole  line. In this mode, no context is shown. That\n                 is, the -A, -B, and -C options are ignored. If there is  more\n                 than  one  match in a line, each of them is shown separately.\n                 If -o is combined with -v (invert the sense of the  match  to\n                 find  non-matching  lines),  no  output is generated, but the\n                 return code is set appropriately. If the matched  portion  of\n                 the  line is empty, nothing is output unless the file name or\n                 line number are being printed, in which case they  are  shown\n                 on an otherwise empty line. This option is mutually exclusive\n                 with --file-offsets and --line-offsets.\n\n       -onumber, --only-matching=number\n                 Show only the part of the line  that  matched  the  capturing\n                 parentheses of the given number. Up to 32 capturing parenthe-\n                 ses are supported, and -o0 is equivalent to -o without a num-\n                 ber.  Because  these options can be given without an argument\n                 (see above), if an argument is present, it must be  given  in\n                 the  same  shell item, for example, -o3 or --only-matching=2.\n                 The comments given for the non-argument case above also apply\n                 to  this  case. If the specified capturing parentheses do not\n                 exist in the pattern, or were not set in the  match,  nothing\n                 is  output  unless  the  file  name  or line number are being\n                 printed.\n\n                 If this option is given multiple times,  multiple  substrings\n                 are  output, in the order the options are given. For example,\n                 -o3 -o1 -o3 causes the substrings matched by capturing paren-\n                 theses  3  and  1  and then 3 again to be output. By default,\n                 there is no separator (but see the next option).\n\n       --om-separator=text\n                 Specify a separating string for multiple occurrences  of  -o.\n                 The  default is an empty string. Separating strings are never\n                 coloured.\n\n       -q, --quiet\n                 Work quietly, that is, display nothing except error messages.\n                 The  exit  status  indicates  whether or not any matches were\n                 found.\n\n       -r, --recursive\n                 If any given path is a directory, recursively scan the  files\n                 it  contains, taking note of any --include and --exclude set-\n                 tings. By default, a directory is read as a normal  file;  in\n                 some  operating  systems this gives an immediate end-of-file.\n                 This option is a shorthand  for  setting  the  -d  option  to\n                 \"recurse\".\n\n       --recursion-limit=number\n                 See --match-limit above.\n\n       -s, --no-messages\n                 Suppress  error  messages  about  non-existent  or unreadable\n                 files. Such files are quietly skipped.  However,  the  return\n                 code is still 2, even if matches were found in other files.\n\n       -u, --utf-8\n                 Operate  in UTF-8 mode. This option is available only if PCRE\n                 has been compiled with UTF-8 support. All patterns (including\n                 those  for  any --exclude and --include options) and all sub-\n                 ject lines that are scanned must be valid  strings  of  UTF-8\n                 characters.\n\n       -V, --version\n                 Write the version numbers of pcregrep and the PCRE library to\n                 the standard output and then exit. Anything else on the  com-\n                 mand line is ignored.\n\n       -v, --invert-match\n                 Invert  the  sense  of  the match, so that lines which do not\n                 match any of the patterns are the ones that are found.\n\n       -w, --word-regex, --word-regexp\n                 Force the patterns to match only whole words. This is equiva-\n                 lent  to  having \\b at the start and end of the pattern. This\n                 option applies only to the patterns that are matched  against\n                 the  contents  of files; it does not apply to patterns speci-\n                 fied by any of the --include or --exclude options.\n\n       -x, --line-regex, --line-regexp\n                 Force the patterns to be anchored (each must  start  matching\n                 at  the beginning of a line) and in addition, require them to\n                 match entire lines. This is equivalent  to  having  ^  and  $\n                 characters at the start and end of each alternative branch in\n                 every pattern. This option applies only to the patterns  that\n                 are  matched against the contents of files; it does not apply\n                 to patterns specified by any of the  --include  or  --exclude\n                 options.\n\n\nENVIRONMENT VARIABLES\n\n       The  environment  variables  LC_ALL  and LC_CTYPE are examined, in that\n       order, for a locale. The first one that is set is  used.  This  can  be\n       overridden  by  the  --locale  option.  If  no  locale is set, the PCRE\n       library's default (usually the \"C\" locale) is used.\n\n\nNEWLINES\n\n       The -N (--newline) option allows pcregrep to scan files with  different\n       newline conventions from the default. Any parts of the input files that\n       are written to the standard output are copied identically,  with  what-\n       ever  newline sequences they have in the input. However, the setting of\n       this option does not affect the interpretation of  files  specified  by\n       the -f, --exclude-from, or --include-from options, which are assumed to\n       use the operating system's  standard  newline  sequence,  nor  does  it\n       affect  the  way in which pcregrep writes informational messages to the\n       standard error and output streams. For these it uses the string \"\\n\" to\n       indicate  newlines,  relying on the C I/O library to convert this to an\n       appropriate sequence.\n\n\nOPTIONS COMPATIBILITY\n\n       Many of the short and long forms of pcregrep's options are the same  as\n       in  the GNU grep program. Any long option of the form --xxx-regexp (GNU\n       terminology) is also available as --xxx-regex (PCRE terminology).  How-\n       ever,  the  --file-list, --file-offsets, --include-dir, --line-offsets,\n       --locale, --match-limit, -M, --multiline, -N,  --newline,  --om-separa-\n       tor,  --recursion-limit,  -u, and --utf-8 options are specific to pcre-\n       grep, as is the use of the  --only-matching  option  with  a  capturing\n       parentheses number.\n\n       Although  most  of the common options work the same way, a few are dif-\n       ferent in pcregrep. For example, the --include option's argument  is  a\n       glob  for  GNU grep, but a regular expression for pcregrep. If both the\n       -c and -l options are given, GNU grep lists only  file  names,  without\n       counts, but pcregrep gives the counts.\n\n\nOPTIONS WITH DATA\n\n       There are four different ways in which an option with data can be spec-\n       ified.  If a short form option is used, the  data  may  follow  immedi-\n       ately, or (with one exception) in the next command line item. For exam-\n       ple:\n\n         -f/some/file\n         -f /some/file\n\n       The exception is the -o option, which may appear with or without  data.\n       Because  of this, if data is present, it must follow immediately in the\n       same item, for example -o3.\n\n       If a long form option is used, the data may appear in the same  command\n       line  item,  separated by an equals character, or (with two exceptions)\n       it may appear in the next command line item. For example:\n\n         --file=/some/file\n         --file /some/file\n\n       Note, however, that if you want to supply a file name beginning with  ~\n       as  data  in  a  shell  command,  and have the shell expand ~ to a home\n       directory, you must separate the file name from the option, because the\n       shell does not treat ~ specially unless it is at the start of an item.\n\n       The  exceptions  to the above are the --colour (or --color) and --only-\n       matching options, for which the data  is  optional.  If  one  of  these\n       options  does  have  data, it must be given in the first form, using an\n       equals character. Otherwise pcregrep will assume that it has no data.\n\n\nMATCHING ERRORS\n\n       It is possible to supply a regular expression that takes  a  very  long\n       time  to  fail  to  match certain lines. Such patterns normally involve\n       nested indefinite repeats, for example: (a+)*\\d when matched against  a\n       line  of  a's  with  no  final  digit. The PCRE matching function has a\n       resource limit that causes it to abort in these circumstances. If  this\n       happens, pcregrep outputs an error message and the line that caused the\n       problem to the standard error stream. If there are more  than  20  such\n       errors, pcregrep gives up.\n\n       The  --match-limit  option  of  pcregrep can be used to set the overall\n       resource limit; there is a second option called --recursion-limit  that\n       sets  a limit on the amount of memory (usually stack) that is used (see\n       the discussion of these options above).\n\n\nDIAGNOSTICS\n\n       Exit status is 0 if any matches were found, 1 if no matches were found,\n       and  2  for syntax errors, overlong lines, non-existent or inaccessible\n       files (even if matches were found in other files) or too many  matching\n       errors. Using the -s option to suppress error messages about inaccessi-\n       ble files does not affect the return code.\n\n\nSEE ALSO\n\n       pcrepattern(3), pcresyntax(3), pcretest(1).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 03 April 2014\n       Copyright (c) 1997-2014 University of Cambridge.\n"
  },
  {
    "path": "src/pcre/doc/pcrejit.3",
    "content": ".TH PCREJIT 3 \"05 July 2017\" \"PCRE 8.41\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE JUST-IN-TIME COMPILER SUPPORT\"\n.rs\n.sp\nJust-in-time compiling is a heavyweight optimization that can greatly speed up\npattern matching. However, it comes at the cost of extra processing before the\nmatch is performed. Therefore, it is of most benefit when the same pattern is\ngoing to be matched many times. This does not necessarily mean many calls of a\nmatching function; if the pattern is not anchored, matching attempts may take\nplace many times at various positions in the subject, even for a single call.\nTherefore, if the subject string is very long, it may still pay to use JIT for\none-off matches.\n.P\nJIT support applies only to the traditional Perl-compatible matching function.\nIt does not apply when the DFA matching function is being used. The code for\nthis support was written by Zoltan Herczeg.\n.\n.\n.SH \"8-BIT, 16-BIT AND 32-BIT SUPPORT\"\n.rs\n.sp\nJIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE\nlibraries. To keep this documentation simple, only the 8-bit interface is\ndescribed in what follows. If you are using the 16-bit library, substitute the\n16-bit functions and 16-bit structures (for example, \\fIpcre16_jit_stack\\fP\ninstead of \\fIpcre_jit_stack\\fP). If you are using the 32-bit library,\nsubstitute the 32-bit functions and 32-bit structures (for example,\n\\fIpcre32_jit_stack\\fP instead of \\fIpcre_jit_stack\\fP).\n.\n.\n.SH \"AVAILABILITY OF JIT SUPPORT\"\n.rs\n.sp\nJIT support is an optional feature of PCRE. The \"configure\" option --enable-jit\n(or equivalent CMake option) must be set when PCRE is built if you want to use\nJIT. The support is limited to the following hardware platforms:\n.sp\n  ARM v5, v7, and Thumb2\n  Intel x86 32-bit and 64-bit\n  MIPS 32-bit\n  Power PC 32-bit and 64-bit\n  SPARC 32-bit (experimental)\n.sp\nIf --enable-jit is set on an unsupported platform, compilation fails.\n.P\nA program that is linked with PCRE 8.20 or later can tell if JIT support is\navailable by calling \\fBpcre_config()\\fP with the PCRE_CONFIG_JIT option. The\nresult is 1 when JIT is available, and 0 otherwise. However, a simple program\ndoes not need to check this in order to use JIT. The normal API is implemented\nin a way that falls back to the interpretive code if JIT is not available. For\nprograms that need the best possible performance, there is also a \"fast path\"\nAPI that is JIT-specific.\n.P\nIf your program may sometimes be linked with versions of PCRE that are older\nthan 8.20, but you want to use JIT when it is available, you can test the\nvalues of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as\nPCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the\n\\fBpcre_jit_exec()\\fP function was not available at all before 8.32,\nand may not be available at all if PCRE isn't compiled with\n--enable-jit. See the \"JIT FAST PATH API\" section below for details.\n.\n.\n.SH \"SIMPLE USE OF JIT\"\n.rs\n.sp\nYou have to do two things to make use of the JIT support in the simplest way:\n.sp\n  (1) Call \\fBpcre_study()\\fP with the PCRE_STUDY_JIT_COMPILE option for\n      each compiled pattern, and pass the resulting \\fBpcre_extra\\fP block to\n      \\fBpcre_exec()\\fP.\n.sp\n  (2) Use \\fBpcre_free_study()\\fP to free the \\fBpcre_extra\\fP block when it is\n      no longer needed, instead of just freeing it yourself. This ensures that\n      any JIT data is also freed.\n.sp\nFor a program that may be linked with pre-8.20 versions of PCRE, you can insert\n.sp\n  #ifndef PCRE_STUDY_JIT_COMPILE\n  #define PCRE_STUDY_JIT_COMPILE 0\n  #endif\n.sp\nso that no option is passed to \\fBpcre_study()\\fP, and then use something like\nthis to free the study data:\n.sp\n  #ifdef PCRE_CONFIG_JIT\n      pcre_free_study(study_ptr);\n  #else\n      pcre_free(study_ptr);\n  #endif\n.sp\nPCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete\nmatches. If you want to run partial matches using the PCRE_PARTIAL_HARD or\nPCRE_PARTIAL_SOFT options of \\fBpcre_exec()\\fP, you should set one or both of\nthe following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE\nwhen you call \\fBpcre_study()\\fP:\n.sp\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n.sp\nIf using \\fBpcre_jit_exec()\\fP and supporting a pre-8.32 version of\nPCRE, you can insert:\n.sp\n   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32\n   pcre_jit_exec(...);\n   #else\n   pcre_exec(...)\n   #endif\n.sp\nbut as described in the \"JIT FAST PATH API\" section below this assumes\nversion 8.32 and later are compiled with --enable-jit, which may\nbreak.\n.sp\nThe JIT compiler generates different optimized code for each of the three\nmodes (normal, soft partial, hard partial). When \\fBpcre_exec()\\fP is called,\nthe appropriate code is run if it is available. Otherwise, the pattern is\nmatched using interpretive code.\n.P\nIn some circumstances you may need to call additional functions. These are\ndescribed in the section entitled\n.\\\" HTML <a href=\"#stackcontrol\">\n.\\\" </a>\n\"Controlling the JIT stack\"\n.\\\"\nbelow.\n.P\nIf JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and\nno JIT data is created. Otherwise, the compiled pattern is passed to the JIT\ncompiler, which turns it into machine code that executes much faster than the\nnormal interpretive code. When \\fBpcre_exec()\\fP is passed a \\fBpcre_extra\\fP\nblock containing a pointer to JIT code of the appropriate mode (normal or\nhard/soft partial), it obeys that code instead of running the interpreter. The\nresult is identical, but the compiled JIT code runs much faster.\n.P\nThere are some \\fBpcre_exec()\\fP options that are not supported for JIT\nexecution. There are also some pattern items that JIT cannot handle. Details\nare given below. In both cases, execution automatically falls back to the\ninterpretive code. If you want to know whether JIT was actually used for a\nparticular match, you should arrange for a JIT callback function to be set up\nas described in the section entitled\n.\\\" HTML <a href=\"#stackcontrol\">\n.\\\" </a>\n\"Controlling the JIT stack\"\n.\\\"\nbelow, even if you do not need to supply a non-default JIT stack. Such a\ncallback function is called whenever JIT code is about to be obeyed. If the\nexecution options are not right for JIT execution, the callback function is not\nobeyed.\n.P\nIf the JIT compiler finds an unsupported item, no JIT data is generated. You\ncan find out if JIT execution is available after studying a pattern by calling\n\\fBpcre_fullinfo()\\fP with the PCRE_INFO_JIT option. A result of 1 means that\nJIT compilation was successful. A result of 0 means that JIT support is not\navailable, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or\nthe JIT compiler was not able to handle the pattern.\n.P\nOnce a pattern has been studied, with or without JIT, it can be used as many\ntimes as you like for matching different subject strings.\n.\n.\n.SH \"UNSUPPORTED OPTIONS AND PATTERN ITEMS\"\n.rs\n.sp\nThe only \\fBpcre_exec()\\fP options that are supported for JIT execution are\nPCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL,\nPCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and\nPCRE_PARTIAL_SOFT.\n.P\nThe only unsupported pattern items are \\eC (match a single data unit) when\nrunning in a UTF mode, and a callout immediately before an assertion condition\nin a conditional group.\n.\n.\n.SH \"RETURN VALUES FROM JIT EXECUTION\"\n.rs\n.sp\nWhen a pattern is matched using JIT execution, the return values are the same\nas those given by the interpretive \\fBpcre_exec()\\fP code, with the addition of\none new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used\nfor the JIT stack was insufficient. See\n.\\\" HTML <a href=\"#stackcontrol\">\n.\\\" </a>\n\"Controlling the JIT stack\"\n.\\\"\nbelow for a discussion of JIT stack usage. For compatibility with the\ninterpretive \\fBpcre_exec()\\fP code, no more than two-thirds of the\n\\fIovector\\fP argument is used for passing back captured substrings.\n.P\nThe error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a\nvery large pattern tree goes on for too long, as it is in the same circumstance\nwhen JIT is not used, but the details of exactly what is counted are not the\nsame. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT\nexecution.\n.\n.\n.SH \"SAVING AND RESTORING COMPILED PATTERNS\"\n.rs\n.sp\nThe code that is generated by the JIT compiler is architecture-specific, and is\nalso position dependent. For those reasons it cannot be saved (in a file or\ndatabase) and restored later like the bytecode and other data of a compiled\npattern. Saving and restoring compiled patterns is not something many people\ndo. More detail about this facility is given in the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation. It should be possible to run \\fBpcre_study()\\fP on a saved and\nrestored pattern, and thereby recreate the JIT data, but because JIT\ncompilation uses significant resources, it is probably not worth doing this;\nyou might as well recompile the original pattern.\n.\n.\n.\\\" HTML <a name=\"stackcontrol\"></a>\n.SH \"CONTROLLING THE JIT STACK\"\n.rs\n.sp\nWhen the compiled JIT code runs, it needs a block of memory to use as a stack.\nBy default, it uses 32K on the machine stack. However, some large or\ncomplicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT\nis given when there is not enough stack. Three functions are provided for\nmanaging blocks of memory for use as JIT stacks. There is further discussion\nabout the use of JIT stacks in the section entitled\n.\\\" HTML <a href=\"#stackcontrol\">\n.\\\" </a>\n\"JIT stack FAQ\"\n.\\\"\nbelow.\n.P\nThe \\fBpcre_jit_stack_alloc()\\fP function creates a JIT stack. Its arguments\nare a starting size and a maximum size, and it returns a pointer to an opaque\nstructure of type \\fBpcre_jit_stack\\fP, or NULL if there is an error. The\n\\fBpcre_jit_stack_free()\\fP function can be used to free a stack that is no\nlonger needed. (For the technically minded: the address space is allocated by\nmmap or VirtualAlloc.)\n.P\nJIT uses far less memory for recursion than the interpretive code,\nand a maximum stack size of 512K to 1M should be more than enough for any\npattern.\n.P\nThe \\fBpcre_assign_jit_stack()\\fP function specifies which stack JIT code\nshould use. Its arguments are as follows:\n.sp\n  pcre_extra         *extra\n  pcre_jit_callback  callback\n  void               *data\n.sp\nThe \\fIextra\\fP argument must be the result of studying a pattern with\nPCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other\ntwo options:\n.sp\n  (1) If \\fIcallback\\fP is NULL and \\fIdata\\fP is NULL, an internal 32K block\n      on the machine stack is used.\n.sp\n  (2) If \\fIcallback\\fP is NULL and \\fIdata\\fP is not NULL, \\fIdata\\fP must be\n      a valid JIT stack, the result of calling \\fBpcre_jit_stack_alloc()\\fP.\n.sp\n  (3) If \\fIcallback\\fP is not NULL, it must point to a function that is\n      called with \\fIdata\\fP as an argument at the start of matching, in\n      order to set up a JIT stack. If the return from the callback\n      function is NULL, the internal 32K stack is used; otherwise the\n      return value must be a valid JIT stack, the result of calling\n      \\fBpcre_jit_stack_alloc()\\fP.\n.sp\nA callback function is obeyed whenever JIT code is about to be run; it is not\nobeyed when \\fBpcre_exec()\\fP is called with options that are incompatible for\nJIT execution. A callback function can therefore be used to determine whether a\nmatch operation was executed by JIT or by the interpreter.\n.P\nYou may safely use the same JIT stack for more than one pattern (either by\nassigning directly or by callback), as long as the patterns are all matched\nsequentially in the same thread. In a multithread application, if you do not\nspecify a JIT stack, or if you assign or pass back NULL from a callback, that\nis thread-safe, because each thread has its own machine stack. However, if you\nassign or pass back a non-NULL JIT stack, this must be a different stack for\neach thread so that the application is thread-safe.\n.P\nStrictly speaking, even more is allowed. You can assign the same non-NULL stack\nto any number of patterns as long as they are not used for matching by multiple\nthreads at the same time. For example, you can assign the same stack to all\ncompiled patterns, and use a global mutex in the callback to wait until the\nstack is available for use. However, this is an inefficient solution, and not\nrecommended.\n.P\nThis is a suggestion for how a multithreaded program that needs to set up\nnon-default JIT stacks might operate:\n.sp\n  During thread initalization\n    thread_local_var = pcre_jit_stack_alloc(...)\n.sp\n  During thread exit\n    pcre_jit_stack_free(thread_local_var)\n.sp\n  Use a one-line callback function\n    return thread_local_var\n.sp\nAll the functions described in this section do nothing if JIT is not available,\nand \\fBpcre_assign_jit_stack()\\fP does nothing unless the \\fBextra\\fP argument\nis non-NULL and points to a \\fBpcre_extra\\fP block that is the result of a\nsuccessful study with PCRE_STUDY_JIT_COMPILE etc.\n.\n.\n.\\\" HTML <a name=\"stackfaq\"></a>\n.SH \"JIT STACK FAQ\"\n.rs\n.sp\n(1) Why do we need JIT stacks?\n.sp\nPCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where\nthe local data of the current node is pushed before checking its child nodes.\nAllocating real machine stack on some platforms is difficult. For example, the\nstack chain needs to be updated every time if we extend the stack on PowerPC.\nAlthough it is possible, its updating time overhead decreases performance. So\nwe do the recursion in memory.\n.P\n(2) Why don't we simply allocate blocks of memory with \\fBmalloc()\\fP?\n.sp\nModern operating systems have a nice feature: they can reserve an address space\ninstead of allocating memory. We can safely allocate memory pages inside this\naddress space, so the stack could grow without moving memory data (this is\nimportant because of pointers). Thus we can allocate 1M address space, and use\nonly a single memory page (usually 4K) if that is enough. However, we can still\ngrow up to 1M anytime if needed.\n.P\n(3) Who \"owns\" a JIT stack?\n.sp\nThe owner of the stack is the user program, not the JIT studied pattern or\nanything else. The user program must ensure that if a stack is used by\n\\fBpcre_exec()\\fP, (that is, it is assigned to the pattern currently running),\nthat stack must not be used by any other threads (to avoid overwriting the same\nmemory area). The best practice for multithreaded programs is to allocate a\nstack for each thread, and return this stack through the JIT callback function.\n.P\n(4) When should a JIT stack be freed?\n.sp\nYou can free a JIT stack at any time, as long as it will not be used by\n\\fBpcre_exec()\\fP again. When you assign the stack to a pattern, only a pointer\nis set. There is no reference counting or any other magic. You can free the\npatterns and stacks in any order, anytime. Just \\fIdo not\\fP call\n\\fBpcre_exec()\\fP with a pattern pointing to an already freed stack, as that\nwill cause SEGFAULT. (Also, do not free a stack currently used by\n\\fBpcre_exec()\\fP in another thread). You can also replace the stack for a\npattern at any time. You can even free the previous stack before assigning a\nreplacement.\n.P\n(5) Should I allocate/free a stack every time before/after calling\n\\fBpcre_exec()\\fP?\n.sp\nNo, because this is too costly in terms of resources. However, you could\nimplement some clever idea which release the stack if it is not used in let's\nsay two minutes. The JIT callback can help to achieve this without keeping a\nlist of the currently JIT studied patterns.\n.P\n(6) OK, the stack is for long term memory allocation. But what happens if a\npattern causes stack overflow with a stack of 1M? Is that 1M kept until the\nstack is freed?\n.sp\nEspecially on embedded sytems, it might be a good idea to release memory\nsometimes without freeing the stack. There is no API for this at the moment.\nProbably a function call which returns with the currently allocated memory for\nany stack and another which allows releasing memory (shrinking the stack) would\nbe a good idea if someone needs this.\n.P\n(7) This is too much of a headache. Isn't there any better solution for JIT\nstack handling?\n.sp\nNo, thanks to Windows. If POSIX threads were used everywhere, we could throw\nout this complicated API.\n.\n.\n.SH \"EXAMPLE CODE\"\n.rs\n.sp\nThis is a single-threaded example that specifies a JIT stack without using a\ncallback.\n.sp\n  int rc;\n  int ovector[30];\n  pcre *re;\n  pcre_extra *extra;\n  pcre_jit_stack *jit_stack;\n.sp\n  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);\n  /* Check for errors */\n  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);\n  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);\n  /* Check for error (NULL) */\n  pcre_assign_jit_stack(extra, NULL, jit_stack);\n  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);\n  /* Check results */\n  pcre_free(re);\n  pcre_free_study(extra);\n  pcre_jit_stack_free(jit_stack);\n.sp\n.\n.\n.SH \"JIT FAST PATH API\"\n.rs\n.sp\nBecause the API described above falls back to interpreted execution when JIT is\nnot available, it is convenient for programs that are written for general use\nin many environments. However, calling JIT via \\fBpcre_exec()\\fP does have a\nperformance impact. Programs that are written for use where JIT is known to be\navailable, and which need the best possible performance, can instead use a\n\"fast path\" API to call JIT execution directly instead of calling\n\\fBpcre_exec()\\fP (obviously only for patterns that have been successfully\nstudied by JIT).\n.P\nThe fast path function is called \\fBpcre_jit_exec()\\fP, and it takes exactly\nthe same arguments as \\fBpcre_exec()\\fP, plus one additional argument that\nmust point to a JIT stack. The JIT stack arrangements described above do not\napply. The return values are the same as for \\fBpcre_exec()\\fP.\n.P\nWhen you call \\fBpcre_exec()\\fP, as well as testing for invalid options, a\nnumber of other sanity checks are performed on the arguments. For example, if\nthe subject pointer is NULL, or its length is negative, an immediate error is\ngiven. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested\nfor validity. In the interests of speed, these checks do not happen on the JIT\nfast path, and if invalid data is passed, the result is undefined.\n.P\nBypassing the sanity checks and the \\fBpcre_exec()\\fP wrapping can give\nspeedups of more than 10%.\n.P\nNote that the \\fBpcre_jit_exec()\\fP function is not available in versions of\nPCRE before 8.32 (released in November 2012). If you need to support versions\nthat old you must either use the slower \\fBpcre_exec()\\fP, or switch between\nthe two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR.\n.P\nDue to an unfortunate implementation oversight, even in versions 8.32\nand later there will be no \\fBpcre_jit_exec()\\fP stub function defined\nwhen PCRE is compiled with --disable-jit, which is the default, and\nthere's no way to detect whether PCRE was compiled with --enable-jit\nvia a macro.\n.P\nIf you need to support versions older than 8.32, or versions that may\nnot build with --enable-jit, you must either use the slower\n\\fBpcre_exec()\\fP, or switch between the two codepaths by checking the\nvalues of PCRE_MAJOR and PCRE_MINOR.\n.P\nSwitching between the two by checking the version assumes that all the\nversions being targeted are built with --enable-jit. To also support\nbuilds that may use --disable-jit either \\fBpcre_exec()\\fP must be\nused, or a compile-time check for JIT via \\fBpcre_config()\\fP (which\nassumes the runtime environment will be the same), or as the Git\nproject decided to do, simply assume that \\fBpcre_jit_exec()\\fP is\npresent in 8.32 or later unless a compile-time flag is provided, see\nthe \"grep: un-break building with PCRE >= 8.32 without --enable-jit\"\ncommit in git.git for an example of that.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcreapi\\fP(3)\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel (FAQ by Zoltan Herczeg)\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 05 July 2017\nCopyright (c) 1997-2017 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrelimits.3",
    "content": ".TH PCRELIMITS 3 \"05 November 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"SIZE AND OTHER LIMITATIONS\"\n.rs\n.sp\nThere are some size limitations in PCRE but it is hoped that they will never in\npractice be relevant.\n.P\nThe maximum length of a compiled pattern is approximately 64K data units (bytes\nfor the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for\nthe 32-bit library) if PCRE is compiled with the default internal linkage size,\nwhich is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit\nlibrary. If you want to process regular expressions that are truly enormous,\nyou can compile PCRE with an internal linkage size of 3 or 4 (when building the\n16-bit or 32-bit library, 3 is rounded up to 4). See the \\fBREADME\\fP file in\nthe source distribution and the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation for details. In these cases the limit is substantially larger.\nHowever, the speed of execution is slower.\n.P\nAll values in repeating quantifiers must be less than 65536.\n.P\nThere is no limit to the number of parenthesized subpatterns, but there can be\nno more than 65535 capturing subpatterns. There is, however, a limit to the\ndepth of nesting of parenthesized subpatterns of all kinds. This is imposed in\norder to limit the amount of system stack used at compile time. The limit can\nbe specified when PCRE is built; the default is 250.\n.P\nThere is a limit to the number of forward references to subsequent subpatterns\nof around 200,000. Repeated forward references with fixed upper limits, for\nexample, (?2){0,100} when subpattern number 2 is to the right, are included in\nthe count. There is no limit to the number of backward references.\n.P\nThe maximum length of name for a named subpattern is 32 characters, and the\nmaximum number of named subpatterns is 10000.\n.P\nThe maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb\nis 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries.\n.P\nThe maximum length of a subject string is the largest positive number that an\ninteger variable can hold. However, when using the traditional matching\nfunction, PCRE uses recursion to handle subpatterns and indefinite repetition.\nThis means that the available stack space may limit the size of a subject\nstring that can be processed by certain patterns. For a discussion of stack\nissues, see the\n.\\\" HREF\n\\fBpcrestack\\fP\n.\\\"\ndocumentation.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 05 November 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrematching.3",
    "content": ".TH PCREMATCHING 3 \"12 November 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE MATCHING ALGORITHMS\"\n.rs\n.sp\nThis document describes the two different algorithms that are available in PCRE\nfor matching a compiled regular expression against a given subject string. The\n\"standard\" algorithm is the one provided by the \\fBpcre_exec()\\fP,\n\\fBpcre16_exec()\\fP and \\fBpcre32_exec()\\fP functions. These work in the same\nas as Perl's matching function, and provide a Perl-compatible matching operation.\nThe just-in-time (JIT) optimization that is described in the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation is compatible with these functions.\n.P\nAn alternative algorithm is provided by the \\fBpcre_dfa_exec()\\fP,\n\\fBpcre16_dfa_exec()\\fP and \\fBpcre32_dfa_exec()\\fP functions; they operate in\na different way, and are not Perl-compatible. This alternative has advantages\nand disadvantages compared with the standard algorithm, and these are described\nbelow.\n.P\nWhen there is only one possible way in which a given subject string can match a\npattern, the two algorithms give the same answer. A difference arises, however,\nwhen there are multiple possibilities. For example, if the pattern\n.sp\n  ^<.*>\n.sp\nis matched against the string\n.sp\n  <something> <something else> <something further>\n.sp\nthere are three possible answers. The standard algorithm finds only one of\nthem, whereas the alternative algorithm finds all three.\n.\n.\n.SH \"REGULAR EXPRESSIONS AS TREES\"\n.rs\n.sp\nThe set of strings that are matched by a regular expression can be represented\nas a tree structure. An unlimited repetition in the pattern makes the tree of\ninfinite size, but it is still a tree. Matching the pattern to a given subject\nstring (from a given starting point) can be thought of as a search of the tree.\nThere are two ways to search a tree: depth-first and breadth-first, and these\ncorrespond to the two matching algorithms provided by PCRE.\n.\n.\n.SH \"THE STANDARD MATCHING ALGORITHM\"\n.rs\n.sp\nIn the terminology of Jeffrey Friedl's book \"Mastering Regular\nExpressions\", the standard algorithm is an \"NFA algorithm\". It conducts a\ndepth-first search of the pattern tree. That is, it proceeds along a single\npath through the tree, checking that the subject matches what is required. When\nthere is a mismatch, the algorithm tries any alternatives at the current point,\nand if they all fail, it backs up to the previous branch point in the tree, and\ntries the next alternative branch at that level. This often involves backing up\n(moving to the left) in the subject string as well. The order in which\nrepetition branches are tried is controlled by the greedy or ungreedy nature of\nthe quantifier.\n.P\nIf a leaf node is reached, a matching string has been found, and at that point\nthe algorithm stops. Thus, if there is more than one possible match, this\nalgorithm returns the first one that it finds. Whether this is the shortest,\nthe longest, or some intermediate length depends on the way the greedy and\nungreedy repetition quantifiers are specified in the pattern.\n.P\nBecause it ends up with a single path through the tree, it is relatively\nstraightforward for this algorithm to keep track of the substrings that are\nmatched by portions of the pattern in parentheses. This provides support for\ncapturing parentheses and back references.\n.\n.\n.SH \"THE ALTERNATIVE MATCHING ALGORITHM\"\n.rs\n.sp\nThis algorithm conducts a breadth-first search of the tree. Starting from the\nfirst matching point in the subject, it scans the subject string from left to\nright, once, character by character, and as it does this, it remembers all the\npaths through the tree that represent valid matches. In Friedl's terminology,\nthis is a kind of \"DFA algorithm\", though it is not implemented as a\ntraditional finite state machine (it keeps multiple states active\nsimultaneously).\n.P\nAlthough the general principle of this matching algorithm is that it scans the\nsubject string only once, without backtracking, there is one exception: when a\nlookaround assertion is encountered, the characters following or preceding the\ncurrent point have to be independently inspected.\n.P\nThe scan continues until either the end of the subject is reached, or there are\nno more unterminated paths. At this point, terminated paths represent the\ndifferent matching possibilities (if there are none, the match has failed).\nThus, if there is more than one possible match, this algorithm finds all of\nthem, and in particular, it finds the longest. The matches are returned in\ndecreasing order of length. There is an option to stop the algorithm after the\nfirst match (which is necessarily the shortest) is found.\n.P\nNote that all the matches that are found start at the same point in the\nsubject. If the pattern\n.sp\n  cat(er(pillar)?)?\n.sp\nis matched against the string \"the caterpillar catchment\", the result will be\nthe three strings \"caterpillar\", \"cater\", and \"cat\" that start at the fifth\ncharacter of the subject. The algorithm does not automatically move on to find\nmatches that start at later positions.\n.P\nPCRE's \"auto-possessification\" optimization usually applies to character\nrepeats at the end of a pattern (as well as internally). For example, the\npattern \"a\\ed+\" is compiled as if it were \"a\\ed++\" because there is no point\neven considering the possibility of backtracking into the repeated digits. For\nDFA matching, this means that only one possible match is found. If you really\ndo want multiple matches in such cases, either use an ungreedy repeat\n(\"a\\ed+?\") or set the PCRE_NO_AUTO_POSSESS option when compiling.\n.P\nThere are a number of features of PCRE regular expressions that are not\nsupported by the alternative matching algorithm. They are as follows:\n.P\n1. Because the algorithm finds all possible matches, the greedy or ungreedy\nnature of repetition quantifiers is not relevant. Greedy and ungreedy\nquantifiers are treated in exactly the same way. However, possessive\nquantifiers can make a difference when what follows could also match what is\nquantified, for example in a pattern like this:\n.sp\n  ^a++\\ew!\n.sp\nThis pattern matches \"aaab!\" but not \"aaa!\", which would be matched by a\nnon-possessive quantifier. Similarly, if an atomic group is present, it is\nmatched as if it were a standalone pattern at the current point, and the\nlongest match is then \"locked in\" for the rest of the overall pattern.\n.P\n2. When dealing with multiple paths through the tree simultaneously, it is not\nstraightforward to keep track of captured substrings for the different matching\npossibilities, and PCRE's implementation of this algorithm does not attempt to\ndo this. This means that no captured substrings are available.\n.P\n3. Because no substrings are captured, back references within the pattern are\nnot supported, and cause errors if encountered.\n.P\n4. For the same reason, conditional expressions that use a backreference as the\ncondition or test for a specific group recursion are not supported.\n.P\n5. Because many paths through the tree may be active, the \\eK escape sequence,\nwhich resets the start of the match when encountered (but may be on some paths\nand not on others), is not supported. It causes an error if encountered.\n.P\n6. Callouts are supported, but the value of the \\fIcapture_top\\fP field is\nalways 1, and the value of the \\fIcapture_last\\fP field is always -1.\n.P\n7. The \\eC escape sequence, which (in the standard algorithm) always matches a\nsingle data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in\nthese modes, because the alternative algorithm moves through the subject string\none character (not data unit) at a time, for all active paths through the tree.\n.P\n8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not\nsupported. (*FAIL) is supported, and behaves like a failing negative assertion.\n.\n.\n.SH \"ADVANTAGES OF THE ALTERNATIVE ALGORITHM\"\n.rs\n.sp\nUsing the alternative matching algorithm provides the following advantages:\n.P\n1. All possible matches (at a single point in the subject) are automatically\nfound, and in particular, the longest match is found. To find more than one\nmatch using the standard algorithm, you have to do kludgy things with\ncallouts.\n.P\n2. Because the alternative algorithm scans the subject string just once, and\nnever needs to backtrack (except for lookbehinds), it is possible to pass very\nlong subject strings to the matching function in several pieces, checking for\npartial matching each time. Although it is possible to do multi-segment\nmatching using the standard algorithm by retaining partially matched\nsubstrings, it is more complicated. The\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation gives details of partial matching and discusses multi-segment\nmatching.\n.\n.\n.SH \"DISADVANTAGES OF THE ALTERNATIVE ALGORITHM\"\n.rs\n.sp\nThe alternative algorithm suffers from a number of disadvantages:\n.P\n1. It is substantially slower than the standard algorithm. This is partly\nbecause it has to search for all possible matches, but is also because it is\nless susceptible to optimization.\n.P\n2. Capturing parentheses and back references are not supported.\n.P\n3. Although atomic groups are supported, their use does not provide the\nperformance advantage that it does for the standard algorithm.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 November 2013\nCopyright (c) 1997-2012 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrepartial.3",
    "content": ".TH PCREPARTIAL 3 \"02 July 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PARTIAL MATCHING IN PCRE\"\n.rs\n.sp\nIn normal use of PCRE, if the subject string that is passed to a matching\nfunction matches as far as it goes, but is too short to match the entire\npattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might\nbe helpful to distinguish this case from other cases in which there is no\nmatch.\n.P\nConsider, for example, an application where a human is required to type in data\nfor a field with specific formatting requirements. An example might be a date\nin the form \\fIddmmmyy\\fP, defined by this pattern:\n.sp\n  ^\\ed?\\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\ed\\ed$\n.sp\nIf the application sees the user's keystrokes one by one, and can check that\nwhat has been typed so far is potentially valid, it is able to raise an error\nas soon as a mistake is made, by beeping and not reflecting the character that\nhas been typed, for example. This immediate feedback is likely to be a better\nuser interface than a check that is delayed until the entire string has been\nentered. Partial matching can also be useful when the subject string is very\nlong and is not all available at once.\n.P\nPCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and\nPCRE_PARTIAL_HARD options, which can be set when calling any of the matching\nfunctions. For backwards compatibility, PCRE_PARTIAL is a synonym for\nPCRE_PARTIAL_SOFT. The essential difference between the two options is whether\nor not a partial match is preferred to an alternative complete match, though\nthe details differ between the two types of matching function. If both options\nare set, PCRE_PARTIAL_HARD takes precedence.\n.P\nIf you want to use partial matching with just-in-time optimized code, you must\ncall \\fBpcre_study()\\fP, \\fBpcre16_study()\\fP or  \\fBpcre32_study()\\fP with one\nor both of these options:\n.sp\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n.sp\nPCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial\nmatches on the same pattern. If the appropriate JIT study mode has not been set\nfor a match, the interpretive matching code is used.\n.P\nSetting a partial matching option disables two of PCRE's standard\noptimizations. PCRE remembers the last literal data unit in a pattern, and\nabandons matching immediately if it is not present in the subject string. This\noptimization cannot be used for a subject string that might match only\npartially. If the pattern was studied, PCRE knows the minimum length of a\nmatching string, and does not bother to run the matching function on shorter\nstrings. This optimization is also disabled for partial matching.\n.\n.\n.SH \"PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()\"\n.rs\n.sp\nA partial match occurs during a call to \\fBpcre_exec()\\fP or\n\\fBpcre[16|32]_exec()\\fP when the end of the subject string is reached\nsuccessfully, but matching cannot continue because more characters are needed.\nHowever, at least one character in the subject must have been inspected. This\ncharacter need not form part of the final matched string; lookbehind assertions\nand the \\eK escape sequence provide ways of inspecting characters before the\nstart of a matched substring. The requirement for inspecting at least one\ncharacter exists because an empty string can always be matched; without such a\nrestriction there would always be a partial match of an empty string at the end\nof the subject.\n.P\nIf there are at least two slots in the offsets vector when a partial match is\nreturned, the first slot is set to the offset of the earliest character that\nwas inspected. For convenience, the second offset points to the end of the\nsubject so that a substring can easily be identified. If there are at least\nthree slots in the offsets vector, the third slot is set to the offset of the\ncharacter where matching started.\n.P\nFor the majority of patterns, the contents of the first and third slots will be\nthe same. However, for patterns that contain lookbehind assertions, or begin\nwith \\eb or \\eB, characters before the one where matching started may have been\ninspected while carrying out the match. For example, consider this pattern:\n.sp\n  /(?<=abc)123/\n.sp\nThis pattern matches \"123\", but only if it is preceded by \"abc\". If the subject\nstring is \"xyzabc12\", the first two offsets after a partial match are for the\nsubstring \"abc12\", because all these characters were inspected. However, the\nthird offset is set to 6, because that is the offset where matching began.\n.P\nWhat happens when a partial match is identified depends on which of the two\npartial matching options are set.\n.\n.\n.SS \"PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()\"\n.rs\n.sp\nIf PCRE_PARTIAL_SOFT is set when \\fBpcre_exec()\\fP or \\fBpcre[16|32]_exec()\\fP\nidentifies a partial match, the partial match is remembered, but matching\ncontinues as normal, and other alternatives in the pattern are tried. If no\ncomplete match can be found, PCRE_ERROR_PARTIAL is returned instead of\nPCRE_ERROR_NOMATCH.\n.P\nThis option is \"soft\" because it prefers a complete match over a partial match.\nAll the various matching items in a pattern behave as if the subject string is\npotentially complete. For example, \\ez, \\eZ, and $ match at the end of the\nsubject, as normal, and for \\eb and \\eB the end of the subject is treated as a\nnon-alphanumeric.\n.P\nIf there is more than one partial match, the first one that was found provides\nthe data that is returned. Consider this pattern:\n.sp\n  /123\\ew+X|dogY/\n.sp\nIf this is matched against the subject string \"abc123dog\", both\nalternatives fail to match, but the end of the subject is reached during\nmatching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9,\nidentifying \"123dog\" as the first partial match that was found. (In this\nexample, there are two partial matches, because \"dog\" on its own partially\nmatches the second alternative.)\n.\n.\n.SS \"PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()\"\n.rs\n.sp\nIf PCRE_PARTIAL_HARD is set for \\fBpcre_exec()\\fP or \\fBpcre[16|32]_exec()\\fP,\nPCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without\ncontinuing to search for possible complete matches. This option is \"hard\"\nbecause it prefers an earlier partial match over a later complete match. For\nthis reason, the assumption is made that the end of the supplied subject string\nmay not be the true end of the available data, and so, if \\ez, \\eZ, \\eb, \\eB,\nor $ are encountered at the end of the subject, the result is\nPCRE_ERROR_PARTIAL, provided that at least one character in the subject has\nbeen inspected.\n.P\nSetting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16\nsubject strings are checked for validity. Normally, an invalid sequence\ncauses the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the\nspecial case of a truncated character at the end of the subject,\nPCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when\nPCRE_PARTIAL_HARD is set.\n.\n.\n.SS \"Comparing hard and soft partial matching\"\n.rs\n.sp\nThe difference between the two partial matching options can be illustrated by a\npattern such as:\n.sp\n  /dog(sbody)?/\n.sp\nThis matches either \"dog\" or \"dogsbody\", greedily (that is, it prefers the\nlonger string if possible). If it is matched against the string \"dog\" with\nPCRE_PARTIAL_SOFT, it yields a complete match for \"dog\". However, if\nPCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,\nif the pattern is made ungreedy the result is different:\n.sp\n  /dog(sbody)??/\n.sp\nIn this case the result is always a complete match because that is found first,\nand matching never continues after finding a complete match. It might be easier\nto follow this explanation by thinking of the two patterns like this:\n.sp\n  /dog(sbody)?/    is the same as  /dogsbody|dog/\n  /dog(sbody)??/   is the same as  /dog|dogsbody/\n.sp\nThe second pattern will never match \"dogsbody\", because it will always find the\nshorter match first.\n.\n.\n.SH \"PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()\"\n.rs\n.sp\nThe DFA functions move along the subject string character by character, without\nbacktracking, searching for all possible matches simultaneously. If the end of\nthe subject is reached before the end of the pattern, there is the possibility\nof a partial match, again provided that at least one character has been\ninspected.\n.P\nWhen PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there\nhave been no complete matches. Otherwise, the complete matches are returned.\nHowever, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any\ncomplete matches. The portion of the string that was inspected when the longest\npartial match was found is set as the first matching string, provided there are\nat least two slots in the offsets vector.\n.P\nBecause the DFA functions always search for all possible matches, and there is\nno difference between greedy and ungreedy repetition, their behaviour is\ndifferent from the standard functions when PCRE_PARTIAL_HARD is set. Consider\nthe string \"dog\" matched against the ungreedy pattern shown above:\n.sp\n  /dog(sbody)??/\n.sp\nWhereas the standard functions stop as soon as they find the complete match for\n\"dog\", the DFA functions also find the partial match for \"dogsbody\", and so\nreturn that when PCRE_PARTIAL_HARD is set.\n.\n.\n.SH \"PARTIAL MATCHING AND WORD BOUNDARIES\"\n.rs\n.sp\nIf a pattern ends with one of sequences \\eb or \\eB, which test for word\nboundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive\nresults. Consider this pattern:\n.sp\n  /\\ebcat\\eb/\n.sp\nThis matches \"cat\", provided there is a word boundary at either end. If the\nsubject string is \"the cat\", the comparison of the final \"t\" with a following\ncharacter cannot take place, so a partial match is found. However, normal\nmatching carries on, and \\eb matches at the end of the subject when the last\ncharacter is a letter, so a complete match is found. The result, therefore, is\n\\fInot\\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield\nPCRE_ERROR_PARTIAL, because then the partial match takes precedence.\n.\n.\n.SH \"FORMERLY RESTRICTED PATTERNS\"\n.rs\n.sp\nFor releases of PCRE prior to 8.00, because of the way certain internal\noptimizations were implemented in the \\fBpcre_exec()\\fP function, the\nPCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with\nall patterns. From release 8.00 onwards, the restrictions no longer apply, and\npartial matching with can be requested for any pattern.\n.P\nItems that were formerly restricted were repeated single characters and\nrepeated metasequences. If PCRE_PARTIAL was set for a pattern that did not\nconform to the restrictions, \\fBpcre_exec()\\fP returned the error code\nPCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The\nPCRE_INFO_OKPARTIAL call to \\fBpcre_fullinfo()\\fP to find out if a compiled\npattern can be used for partial matching now always returns 1.\n.\n.\n.SH \"EXAMPLE OF PARTIAL MATCHING USING PCRETEST\"\n.rs\n.sp\nIf the escape sequence \\eP is present in a \\fBpcretest\\fP data line, the\nPCRE_PARTIAL_SOFT option is used for the match. Here is a run of \\fBpcretest\\fP\nthat uses the date example quoted above:\n.sp\n    re> /^\\ed?\\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\ed\\ed$/\n  data> 25jun04\\eP\n   0: 25jun04\n   1: jun\n  data> 25dec3\\eP\n  Partial match: 23dec3\n  data> 3ju\\eP\n  Partial match: 3ju\n  data> 3juj\\eP\n  No match\n  data> j\\eP\n  No match\n.sp\nThe first data string is matched completely, so \\fBpcretest\\fP shows the\nmatched substrings. The remaining four strings do not match the complete\npattern, but the first two are partial matches. Similar output is obtained\nif DFA matching is used.\n.P\nIf the escape sequence \\eP is present more than once in a \\fBpcretest\\fP data\nline, the PCRE_PARTIAL_HARD option is set for the match.\n.\n.\n.SH \"MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()\"\n.rs\n.sp\nWhen a partial match has been found using a DFA matching function, it is\npossible to continue the match by providing additional subject data and calling\nthe function again with the same compiled regular expression, this time setting\nthe PCRE_DFA_RESTART option. You must pass the same working space as before,\nbecause this is where details of the previous partial match are stored. Here is\nan example using \\fBpcretest\\fP, using the \\eR escape sequence to set the\nPCRE_DFA_RESTART option (\\eD specifies the use of the DFA matching function):\n.sp\n    re> /^\\ed?\\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\ed\\ed$/\n  data> 23ja\\eP\\eD\n  Partial match: 23ja\n  data> n05\\eR\\eD\n   0: n05\n.sp\nThe first call has \"23ja\" as the subject, and requests partial matching; the\nsecond call has \"n05\" as the subject for the continued (restarted) match.\nNotice that when the match is complete, only the last part is shown; PCRE does\nnot retain the previously partially-matched string. It is up to the calling\nprogram to do that if it needs to.\n.P\nThat means that, for an unanchored pattern, if a continued match fails, it is\nnot possible to try again at a new starting point. All this facility is capable\nof doing is continuing with the previous match attempt. In the previous\nexample, if the second set of data is \"ug23\" the result is no match, even\nthough there would be a match for \"aug23\" if the entire string were given at\nonce. Depending on the application, this may or may not be what you want.\nThe only way to allow for starting again at the next character is to retain the\nmatched part of the subject and try a new complete match.\n.P\nYou can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with\nPCRE_DFA_RESTART to continue partial matching over multiple segments. This\nfacility can be used to pass very long subject strings to the DFA matching\nfunctions.\n.\n.\n.SH \"MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()\"\n.rs\n.sp\nFrom release 8.00, the standard matching functions can also be used to do\nmulti-segment matching. Unlike the DFA functions, it is not possible to\nrestart the previous match with a new segment of data. Instead, new data must\nbe added to the previous subject string, and the entire match re-run, starting\nfrom the point where the partial match occurred. Earlier data can be discarded.\n.P\nIt is best to use PCRE_PARTIAL_HARD in this situation, because it does not\ntreat the end of a segment as the end of the subject when matching \\ez, \\eZ,\n\\eb, \\eB, and $. Consider an unanchored pattern that matches dates:\n.sp\n    re> /\\ed?\\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\ed\\ed/\n  data> The date is 23ja\\eP\\eP\n  Partial match: 23ja\n.sp\nAt this stage, an application could discard the text preceding \"23ja\", add on\ntext from the next segment, and call the matching function again. Unlike the\nDFA matching functions, the entire matching string must always be available,\nand the complete matching process occurs for each call, so more memory and more\nprocessing time is needed.\n.P\n\\fBNote:\\fP If the pattern contains lookbehind assertions, or \\eK, or starts\nwith \\eb or \\eB, the string that is returned for a partial match includes\ncharacters that precede the start of what would be returned for a complete\nmatch, because it contains all the characters that were inspected during the\npartial match.\n.\n.\n.SH \"ISSUES WITH MULTI-SEGMENT MATCHING\"\n.rs\n.sp\nCertain types of pattern may give problems with multi-segment matching,\nwhichever matching function is used.\n.P\n1. If the pattern contains a test for the beginning of a line, you need to pass\nthe PCRE_NOTBOL option when the subject string for any call does start at the\nbeginning of a line. There is also a PCRE_NOTEOL option, but in practice when\ndoing multi-segment matching you should be using PCRE_PARTIAL_HARD, which\nincludes the effect of PCRE_NOTEOL.\n.P\n2. Lookbehind assertions that have already been obeyed are catered for in the\noffsets that are returned for a partial match. However a lookbehind assertion\nlater in the pattern could require even earlier characters to be inspected. You\ncan handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the\n\\fBpcre_fullinfo()\\fP or \\fBpcre[16|32]_fullinfo()\\fP functions to obtain the\nlength of the longest lookbehind in the pattern. This length is given in\ncharacters, not bytes. If you always retain at least that many characters\nbefore the partially matched string, all should be well. (Of course, near the\nstart of the subject, fewer characters may be present; in that case all\ncharacters should be retained.)\n.P\nFrom release 8.33, there is a more accurate way of deciding which characters to\nretain. Instead of subtracting the length of the longest lookbehind from the\nearliest inspected character (\\fIoffsets[0]\\fP), the match start position\n(\\fIoffsets[2]\\fP) should be used, and the next match attempt started at the\n\\fIoffsets[2]\\fP character by setting the \\fIstartoffset\\fP argument of\n\\fBpcre_exec()\\fP or \\fBpcre_dfa_exec()\\fP.\n.P\nFor example, if the pattern \"(?<=123)abc\" is partially\nmatched against the string \"xx123a\", the three offset values returned are 2, 6,\nand 5. This indicates that the matching process that gave a partial match\nstarted at offset 5, but the characters \"123a\" were all inspected. The maximum\nlookbehind for that pattern is 3, so taking that away from 5 shows that we need\nonly keep \"123a\", and the next match attempt can be started at offset 3 (that\nis, at \"a\") when further characters have been added. When the match start is\nnot the earliest inspected character, \\fBpcretest\\fP shows it explicitly:\n.sp\n    re> \"(?<=123)abc\"\n  data> xx123a\\eP\\eP\n  Partial match at offset 5: 123a\n.P\n3. Because a partial match must always contain at least one character, what\nmight be considered a partial match of an empty string actually gives a \"no\nmatch\" result. For example:\n.sp\n    re> /c(?<=abc)x/\n  data> ab\\eP\n  No match\n.sp\nIf the next segment begins \"cx\", a match should be found, but this will only\nhappen if characters from the previous segment are retained. For this reason, a\n\"no match\" result should be interpreted as \"partial match of an empty string\"\nwhen the pattern contains lookbehinds.\n.P\n4. Matching a subject string that is split into multiple segments may not\nalways produce exactly the same result as matching over one single long string,\nespecially when PCRE_PARTIAL_SOFT is used. The section \"Partial Matching and\nWord Boundaries\" above describes an issue that arises if the pattern ends with\n\\eb or \\eB. Another kind of difference may occur when there are multiple\nmatching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result\nis given only when there are no completed matches. This means that as soon as\nthe shortest match has been found, continuation to a new subject segment is no\nlonger possible. Consider again this \\fBpcretest\\fP example:\n.sp\n    re> /dog(sbody)?/\n  data> dogsb\\eP\n   0: dog\n  data> do\\eP\\eD\n  Partial match: do\n  data> gsb\\eR\\eP\\eD\n   0: g\n  data> dogsbody\\eD\n   0: dogsbody\n   1: dog\n.sp\nThe first data line passes the string \"dogsb\" to a standard matching function,\nsetting the PCRE_PARTIAL_SOFT option. Although the string is a partial match\nfor \"dogsbody\", the result is not PCRE_ERROR_PARTIAL, because the shorter\nstring \"dog\" is a complete match. Similarly, when the subject is presented to\na DFA matching function in several parts (\"do\" and \"gsb\" being the first two)\nthe match stops when \"dog\" has been found, and it is not possible to continue.\nOn the other hand, if \"dogsbody\" is presented as a single string, a DFA\nmatching function finds both matches.\n.P\nBecause of these problems, it is best to use PCRE_PARTIAL_HARD when matching\nmulti-segment data. The example above then behaves differently:\n.sp\n    re> /dog(sbody)?/\n  data> dogsb\\eP\\eP\n  Partial match: dogsb\n  data> do\\eP\\eD\n  Partial match: do\n  data> gsb\\eR\\eP\\eP\\eD\n  Partial match: gsb\n.sp\n5. Patterns that contain alternatives at the top level which do not all start\nwith the same pattern item may not work as expected when PCRE_DFA_RESTART is\nused. For example, consider this pattern:\n.sp\n  1234|3789\n.sp\nIf the first part of the subject is \"ABC123\", a partial match of the first\nalternative is found at offset 3. There is no partial match for the second\nalternative, because such a match does not start at the same point in the\nsubject string. Attempting to continue with the string \"7890\" does not yield a\nmatch because only those alternatives that match at one point in the subject\nare remembered. The problem arises because the start of the second alternative\nmatches within the first alternative. There is no problem with anchored\npatterns or patterns such as:\n.sp\n  1234|ABCD\n.sp\nwhere no string can be a partial match for both alternatives. This is not a\nproblem if a standard matching function is used, because the entire match has\nto be rerun each time:\n.sp\n    re> /1234|3789/\n  data> ABC123\\eP\\eP\n  Partial match: 123\n  data> 1237890\n   0: 3789\n.sp\nOf course, instead of using PCRE_DFA_RESTART, the same technique of re-running\nthe entire match can also be used with the DFA matching functions. Another\npossibility is to work with two buffers. If a partial match at offset \\fIn\\fP\nin the first buffer is followed by \"no match\" when PCRE_DFA_RESTART is used on\nthe second buffer, you can then try a new match starting at offset \\fIn+1\\fP in\nthe first buffer.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 02 July 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrepattern.3",
    "content": ".TH PCREPATTERN 3 \"23 October 2016\" \"PCRE 8.40\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE REGULAR EXPRESSION DETAILS\"\n.rs\n.sp\nThe syntax and semantics of the regular expressions that are supported by PCRE\nare described in detail below. There is a quick-reference syntax summary in the\n.\\\" HREF\n\\fBpcresyntax\\fP\n.\\\"\npage. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE\nalso supports some alternative regular expression syntax (which does not\nconflict with the Perl syntax) in order to provide some compatibility with\nregular expressions in Python, .NET, and Oniguruma.\n.P\nPerl's regular expressions are described in its own documentation, and\nregular expressions in general are covered in a number of books, some of which\nhave copious examples. Jeffrey Friedl's \"Mastering Regular Expressions\",\npublished by O'Reilly, covers regular expressions in great detail. This\ndescription of PCRE's regular expressions is intended as reference material.\n.P\nThis document discusses the patterns that are supported by PCRE when one its\nmain matching functions, \\fBpcre_exec()\\fP (8-bit) or \\fBpcre[16|32]_exec()\\fP\n(16- or 32-bit), is used. PCRE also has alternative matching functions,\n\\fBpcre_dfa_exec()\\fP and \\fBpcre[16|32_dfa_exec()\\fP, which match using a\ndifferent algorithm that is not Perl-compatible. Some of the features discussed\nbelow are not available when DFA matching is used. The advantages and\ndisadvantages of the alternative functions, and how they differ from the normal\nfunctions, are discussed in the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\npage.\n.\n.\n.SH \"SPECIAL START-OF-PATTERN ITEMS\"\n.rs\n.sp\nA number of options that can be passed to \\fBpcre_compile()\\fP can also be set\nby special items at the start of a pattern. These are not Perl-compatible, but\nare provided to make these options accessible to pattern writers who are not\nable to change the program that processes the pattern. Any number of these\nitems may appear, but they must all be together right at the start of the\npattern string, and the letters must be in upper case.\n.\n.\n.SS \"UTF support\"\n.rs\n.sp\nThe original operation of PCRE was on strings of one-byte characters. However,\nthere is now also support for UTF-8 strings in the original library, an\nextra library that supports 16-bit and UTF-16 character strings, and a\nthird library that supports 32-bit and UTF-32 character strings. To use these\nfeatures, PCRE must be built to include appropriate support. When using UTF\nstrings you must either call the compiling function with the PCRE_UTF8,\nPCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of\nthese special sequences:\n.sp\n  (*UTF8)\n  (*UTF16)\n  (*UTF32)\n  (*UTF)\n.sp\n(*UTF) is a generic sequence that can be used with any of the libraries.\nStarting a pattern with such a sequence is equivalent to setting the relevant\noption. How setting a UTF mode affects pattern matching is mentioned in several\nplaces below. There is also a summary of features in the\n.\\\" HREF\n\\fBpcreunicode\\fP\n.\\\"\npage.\n.P\nSome applications that allow their users to supply patterns may wish to\nrestrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF\noption is set at compile time, (*UTF) etc. are not allowed, and their\nappearance causes an error.\n.\n.\n.SS \"Unicode property support\"\n.rs\n.sp\nAnother special sequence that may appear at the start of a pattern is (*UCP).\nThis has the same effect as setting the PCRE_UCP option: it causes sequences\nsuch as \\ed and \\ew to use Unicode properties to determine character types,\ninstead of recognizing only characters with codes less than 128 via a lookup\ntable.\n.\n.\n.SS \"Disabling auto-possessification\"\n.rs\n.sp\nIf a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting\nthe PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making\nquantifiers possessive when what follows cannot match the repeated item. For\nexample, by default a+b is treated as a++b. For more details, see the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.\n.\n.SS \"Disabling start-up optimizations\"\n.rs\n.sp\nIf a pattern starts with (*NO_START_OPT), it has the same effect as setting the\nPCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables\nseveral optimizations for quickly reaching \"no match\" results. For more\ndetails, see the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.\n.\n.\\\" HTML <a name=\"newlines\"></a>\n.SS \"Newline conventions\"\n.rs\n.sp\nPCRE supports five different conventions for indicating line breaks in\nstrings: a single CR (carriage return) character, a single LF (linefeed)\ncharacter, the two-character sequence CRLF, any of the three preceding, or any\nUnicode newline sequence. The\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage has\n.\\\" HTML <a href=\"pcreapi.html#newlines\">\n.\\\" </a>\nfurther discussion\n.\\\"\nabout newlines, and shows how to set the newline convention in the\n\\fIoptions\\fP arguments for the compiling and matching functions.\n.P\nIt is also possible to specify a newline convention by starting a pattern\nstring with one of the following five sequences:\n.sp\n  (*CR)        carriage return\n  (*LF)        linefeed\n  (*CRLF)      carriage return, followed by linefeed\n  (*ANYCRLF)   any of the three above\n  (*ANY)       all Unicode newline sequences\n.sp\nThese override the default and the options given to the compiling function. For\nexample, on a Unix system where LF is the default newline sequence, the pattern\n.sp\n  (*CR)a.b\n.sp\nchanges the convention to CR. That pattern matches \"a\\enb\" because LF is no\nlonger a newline. If more than one of these settings is present, the last one\nis used.\n.P\nThe newline convention affects where the circumflex and dollar assertions are\ntrue. It also affects the interpretation of the dot metacharacter when\nPCRE_DOTALL is not set, and the behaviour of \\eN. However, it does not affect\nwhat the \\eR escape sequence matches. By default, this is any Unicode newline\nsequence, for Perl compatibility. However, this can be changed; see the\ndescription of \\eR in the section entitled\n.\\\" HTML <a href=\"#newlineseq\">\n.\\\" </a>\n\"Newline sequences\"\n.\\\"\nbelow. A change of \\eR setting can be combined with a change of newline\nconvention.\n.\n.\n.SS \"Setting match and recursion limits\"\n.rs\n.sp\nThe caller of \\fBpcre_exec()\\fP can set a limit on the number of times the\ninternal \\fBmatch()\\fP function is called and on the maximum depth of\nrecursive calls. These facilities are provided to catch runaway matches that\nare provoked by patterns with huge matching trees (a typical example is a\npattern with nested unlimited repeats) and to avoid running out of system stack\nby too much recursion. When one of these limits is reached, \\fBpcre_exec()\\fP\ngives an error return. The limits can also be set by items at the start of the\npattern of the form\n.sp\n  (*LIMIT_MATCH=d)\n  (*LIMIT_RECURSION=d)\n.sp\nwhere d is any number of decimal digits. However, the value of the setting must\nbe less than the value set (or defaulted) by the caller of \\fBpcre_exec()\\fP\nfor it to have any effect. In other words, the pattern writer can lower the\nlimits set by the programmer, but not raise them. If there is more than one\nsetting of one of these limits, the lower value is used.\n.\n.\n.SH \"EBCDIC CHARACTER CODES\"\n.rs\n.sp\nPCRE can be compiled to run in an environment that uses EBCDIC as its character\ncode rather than ASCII or Unicode (typically a mainframe system). In the\nsections below, character code values are ASCII or Unicode; in an EBCDIC\nenvironment these characters may have different code values, and there are no\ncode points greater than 255.\n.\n.\n.SH \"CHARACTERS AND METACHARACTERS\"\n.rs\n.sp\nA regular expression is a pattern that is matched against a subject string from\nleft to right. Most characters stand for themselves in a pattern, and match the\ncorresponding characters in the subject. As a trivial example, the pattern\n.sp\n  The quick brown fox\n.sp\nmatches a portion of a subject string that is identical to itself. When\ncaseless matching is specified (the PCRE_CASELESS option), letters are matched\nindependently of case. In a UTF mode, PCRE always understands the concept of\ncase for characters whose values are less than 128, so caseless matching is\nalways possible. For characters with higher values, the concept of case is\nsupported if PCRE is compiled with Unicode property support, but not otherwise.\nIf you want to use caseless matching for characters 128 and above, you must\nensure that PCRE is compiled with Unicode property support as well as with\nUTF support.\n.P\nThe power of regular expressions comes from the ability to include alternatives\nand repetitions in the pattern. These are encoded in the pattern by the use of\n\\fImetacharacters\\fP, which do not stand for themselves but instead are\ninterpreted in some special way.\n.P\nThere are two different sets of metacharacters: those that are recognized\nanywhere in the pattern except within square brackets, and those that are\nrecognized within square brackets. Outside square brackets, the metacharacters\nare as follows:\n.sp\n  \\e      general escape character with several uses\n  ^      assert start of string (or line, in multiline mode)\n  $      assert end of string (or line, in multiline mode)\n  .      match any character except newline (by default)\n  [      start character class definition\n  |      start of alternative branch\n  (      start subpattern\n  )      end subpattern\n  ?      extends the meaning of (\n         also 0 or 1 quantifier\n         also quantifier minimizer\n  *      0 or more quantifier\n  +      1 or more quantifier\n         also \"possessive quantifier\"\n  {      start min/max quantifier\n.sp\nPart of a pattern that is in square brackets is called a \"character class\". In\na character class the only metacharacters are:\n.sp\n  \\e      general escape character\n  ^      negate the class, but only if the first character\n  -      indicates character range\n.\\\" JOIN\n  [      POSIX character class (only if followed by POSIX\n           syntax)\n  ]      terminates the character class\n.sp\nThe following sections describe the use of each of the metacharacters.\n.\n.\n.SH BACKSLASH\n.rs\n.sp\nThe backslash character has several uses. Firstly, if it is followed by a\ncharacter that is not a number or a letter, it takes away any special meaning\nthat character may have. This use of backslash as an escape character applies\nboth inside and outside character classes.\n.P\nFor example, if you want to match a * character, you write \\e* in the pattern.\nThis escaping action applies whether or not the following character would\notherwise be interpreted as a metacharacter, so it is always safe to precede a\nnon-alphanumeric with backslash to specify that it stands for itself. In\nparticular, if you want to match a backslash, you write \\e\\e.\n.P\nIn a UTF mode, only ASCII numbers and letters have any special meaning after a\nbackslash. All other characters (in particular, those whose codepoints are\ngreater than 127) are treated as literals.\n.P\nIf a pattern is compiled with the PCRE_EXTENDED option, most white space in the\npattern (other than in a character class), and characters between a # outside a\ncharacter class and the next newline, inclusive, are ignored. An escaping\nbackslash can be used to include a white space or # character as part of the\npattern.\n.P\nIf you want to remove the special meaning from a sequence of characters, you\ncan do so by putting them between \\eQ and \\eE. This is different from Perl in\nthat $ and @ are handled as literals in \\eQ...\\eE sequences in PCRE, whereas in\nPerl, $ and @ cause variable interpolation. Note the following examples:\n.sp\n  Pattern            PCRE matches   Perl matches\n.sp\n.\\\" JOIN\n  \\eQabc$xyz\\eE        abc$xyz        abc followed by the\n                                      contents of $xyz\n  \\eQabc\\e$xyz\\eE       abc\\e$xyz       abc\\e$xyz\n  \\eQabc\\eE\\e$\\eQxyz\\eE   abc$xyz        abc$xyz\n.sp\nThe \\eQ...\\eE sequence is recognized both inside and outside character classes.\nAn isolated \\eE that is not preceded by \\eQ is ignored. If \\eQ is not followed\nby \\eE later in the pattern, the literal interpretation continues to the end of\nthe pattern (that is, \\eE is assumed at the end). If the isolated \\eQ is inside\na character class, this causes an error, because the character class is not\nterminated.\n.\n.\n.\\\" HTML <a name=\"digitsafterbackslash\"></a>\n.SS \"Non-printing characters\"\n.rs\n.sp\nA second use of backslash provides a way of encoding non-printing characters\nin patterns in a visible manner. There is no restriction on the appearance of\nnon-printing characters, apart from the binary zero that terminates a pattern,\nbut when a pattern is being prepared by text editing, it is often easier to use\none of the following escape sequences than the binary character it represents.\nIn an ASCII or Unicode environment, these escapes are as follows:\n.sp\n  \\ea        alarm, that is, the BEL character (hex 07)\n  \\ecx       \"control-x\", where x is any ASCII character\n  \\ee        escape (hex 1B)\n  \\ef        form feed (hex 0C)\n  \\en        linefeed (hex 0A)\n  \\er        carriage return (hex 0D)\n  \\et        tab (hex 09)\n  \\e0dd      character with octal code 0dd\n  \\eddd      character with octal code ddd, or back reference\n  \\eo{ddd..} character with octal code ddd..\n  \\exhh      character with hex code hh\n  \\ex{hhh..} character with hex code hhh.. (non-JavaScript mode)\n  \\euhhhh    character with hex code hhhh (JavaScript mode only)\n.sp\nThe precise effect of \\ecx on ASCII characters is as follows: if x is a lower\ncase letter, it is converted to upper case. Then bit 6 of the character (hex\n40) is inverted. Thus \\ecA to \\ecZ become hex 01 to hex 1A (A is 41, Z is 5A),\nbut \\ec{ becomes hex 3B ({ is 7B), and \\ec; becomes hex 7B (; is 3B). If the\ndata item (byte or 16-bit value) following \\ec has a value greater than 127, a\ncompile-time error occurs. This locks out non-ASCII characters in all modes.\n.P\nWhen PCRE is compiled in EBCDIC mode, \\ea, \\ee, \\ef, \\en, \\er, and \\et\ngenerate the appropriate EBCDIC code values. The \\ec escape is processed\nas specified for Perl in the \\fBperlebcdic\\fP document. The only characters\nthat are allowed after \\ec are A-Z, a-z, or one of @, [, \\e, ], ^, _, or ?. Any\nother character provokes a compile-time error. The sequence \\ec@ encodes\ncharacter code 0; after \\ec the letters (in either case) encode characters 1-26\n(hex 01 to hex 1A); [, \\e, ], ^, and _ encode characters 27-31 (hex 1B to hex\n1F), and \\ec? becomes either 255 (hex FF) or 95 (hex 5F).\n.P\nThus, apart from \\ec?, these escapes generate the same character code values as\nthey do in an ASCII environment, though the meanings of the values mostly\ndiffer. For example, \\ecG always generates code value 7, which is BEL in ASCII\nbut DEL in EBCDIC.\n.P\nThe sequence \\ec? generates DEL (127, hex 7F) in an ASCII environment, but\nbecause 127 is not a control character in EBCDIC, Perl makes it generate the\nAPC character. Unfortunately, there are several variants of EBCDIC. In most of\nthem the APC character has the value 255 (hex FF), but in the one Perl calls\nPOSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC\nvalues, PCRE makes \\ec? generate 95; otherwise it generates 255.\n.P\nAfter \\e0 up to two further octal digits are read. If there are fewer than two\ndigits, just those that are present are used. Thus the sequence \\e0\\ex\\e015\nspecifies two binary zeros followed by a CR character (code value 13). Make\nsure you supply two digits after the initial zero if the pattern character that\nfollows is itself an octal digit.\n.P\nThe escape \\eo must be followed by a sequence of octal digits, enclosed in\nbraces. An error occurs if this is not the case. This escape is a recent\naddition to Perl; it provides way of specifying character code points as octal\nnumbers greater than 0777, and it also allows octal numbers and back references\nto be unambiguously specified.\n.P\nFor greater clarity and unambiguity, it is best to avoid following \\e by a\ndigit greater than zero. Instead, use \\eo{} or \\ex{} to specify character\nnumbers, and \\eg{} to specify back references. The following paragraphs\ndescribe the old, ambiguous syntax.\n.P\nThe handling of a backslash followed by a digit other than 0 is complicated,\nand Perl has changed in recent releases, causing PCRE also to change. Outside a\ncharacter class, PCRE reads the digit and any following digits as a decimal\nnumber. If the number is less than 8, or if there have been at least that many\nprevious capturing left parentheses in the expression, the entire sequence is\ntaken as a \\fIback reference\\fP. A description of how this works is given\n.\\\" HTML <a href=\"#backreferences\">\n.\\\" </a>\nlater,\n.\\\"\nfollowing the discussion of\n.\\\" HTML <a href=\"#subpattern\">\n.\\\" </a>\nparenthesized subpatterns.\n.\\\"\n.P\nInside a character class, or if the decimal number following \\e is greater than\n7 and there have not been that many capturing subpatterns, PCRE handles \\e8 and\n\\e9 as the literal characters \"8\" and \"9\", and otherwise re-reads up to three\noctal digits following the backslash, using them to generate a data character.\nAny subsequent digits stand for themselves. For example:\n.sp\n  \\e040   is another way of writing an ASCII space\n.\\\" JOIN\n  \\e40    is the same, provided there are fewer than 40\n            previous capturing subpatterns\n  \\e7     is always a back reference\n.\\\" JOIN\n  \\e11    might be a back reference, or another way of\n            writing a tab\n  \\e011   is always a tab\n  \\e0113  is a tab followed by the character \"3\"\n.\\\" JOIN\n  \\e113   might be a back reference, otherwise the\n            character with octal code 113\n.\\\" JOIN\n  \\e377   might be a back reference, otherwise\n            the value 255 (decimal)\n.\\\" JOIN\n  \\e81    is either a back reference, or the two\n            characters \"8\" and \"1\"\n.sp\nNote that octal values of 100 or greater that are specified using this syntax\nmust not be introduced by a leading zero, because no more than three octal\ndigits are ever read.\n.P\nBy default, after \\ex that is not followed by {, from zero to two hexadecimal\ndigits are read (letters can be in upper or lower case). Any number of\nhexadecimal digits may appear between \\ex{ and }. If a character other than\na hexadecimal digit appears between \\ex{ and }, or if there is no terminating\n}, an error occurs.\n.P\nIf the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \\ex is\nas just described only when it is followed by two hexadecimal digits.\nOtherwise, it matches a literal \"x\" character. In JavaScript mode, support for\ncode points greater than 256 is provided by \\eu, which must be followed by\nfour hexadecimal digits; otherwise it matches a literal \"u\" character.\n.P\nCharacters whose value is less than 256 can be defined by either of the two\nsyntaxes for \\ex (or by \\eu in JavaScript mode). There is no difference in the\nway they are handled. For example, \\exdc is exactly the same as \\ex{dc} (or\n\\eu00dc in JavaScript mode).\n.\n.\n.SS \"Constraints on character values\"\n.rs\n.sp\nCharacters that are specified using octal or hexadecimal numbers are\nlimited to certain values, as follows:\n.sp\n  8-bit non-UTF mode    less than 0x100\n  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint\n  16-bit non-UTF mode   less than 0x10000\n  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint\n  32-bit non-UTF mode   less than 0x100000000\n  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint\n.sp\nInvalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called\n\"surrogate\" codepoints), and 0xffef.\n.\n.\n.SS \"Escape sequences in character classes\"\n.rs\n.sp\nAll the sequences that define a single character value can be used both inside\nand outside character classes. In addition, inside a character class, \\eb is\ninterpreted as the backspace character (hex 08).\n.P\n\\eN is not allowed in a character class. \\eB, \\eR, and \\eX are not special\ninside a character class. Like other unrecognized escape sequences, they are\ntreated as the literal characters \"B\", \"R\", and \"X\" by default, but cause an\nerror if the PCRE_EXTRA option is set. Outside a character class, these\nsequences have different meanings.\n.\n.\n.SS \"Unsupported escape sequences\"\n.rs\n.sp\nIn Perl, the sequences \\el, \\eL, \\eu, and \\eU are recognized by its string\nhandler and used to modify the case of following characters. By default, PCRE\ndoes not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT\noption is set, \\eU matches a \"U\" character, and \\eu can be used to define a\ncharacter by code point, as described in the previous section.\n.\n.\n.SS \"Absolute and relative back references\"\n.rs\n.sp\nThe sequence \\eg followed by an unsigned or a negative number, optionally\nenclosed in braces, is an absolute or relative back reference. A named back\nreference can be coded as \\eg{name}. Back references are discussed\n.\\\" HTML <a href=\"#backreferences\">\n.\\\" </a>\nlater,\n.\\\"\nfollowing the discussion of\n.\\\" HTML <a href=\"#subpattern\">\n.\\\" </a>\nparenthesized subpatterns.\n.\\\"\n.\n.\n.SS \"Absolute and relative subroutine calls\"\n.rs\n.sp\nFor compatibility with Oniguruma, the non-Perl syntax \\eg followed by a name or\na number enclosed either in angle brackets or single quotes, is an alternative\nsyntax for referencing a subpattern as a \"subroutine\". Details are discussed\n.\\\" HTML <a href=\"#onigurumasubroutines\">\n.\\\" </a>\nlater.\n.\\\"\nNote that \\eg{...} (Perl syntax) and \\eg<...> (Oniguruma syntax) are \\fInot\\fP\nsynonymous. The former is a back reference; the latter is a\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nsubroutine\n.\\\"\ncall.\n.\n.\n.\\\" HTML <a name=\"genericchartypes\"></a>\n.SS \"Generic character types\"\n.rs\n.sp\nAnother use of backslash is for specifying generic character types:\n.sp\n  \\ed     any decimal digit\n  \\eD     any character that is not a decimal digit\n  \\eh     any horizontal white space character\n  \\eH     any character that is not a horizontal white space character\n  \\es     any white space character\n  \\eS     any character that is not a white space character\n  \\ev     any vertical white space character\n  \\eV     any character that is not a vertical white space character\n  \\ew     any \"word\" character\n  \\eW     any \"non-word\" character\n.sp\nThere is also the single sequence \\eN, which matches a non-newline character.\nThis is the same as\n.\\\" HTML <a href=\"#fullstopdot\">\n.\\\" </a>\nthe \".\" metacharacter\n.\\\"\nwhen PCRE_DOTALL is not set. Perl also uses \\eN to match characters by name;\nPCRE does not support this.\n.P\nEach pair of lower and upper case escape sequences partitions the complete set\nof characters into two disjoint sets. Any given character matches one, and only\none, of each pair. The sequences can appear both inside and outside character\nclasses. They each match one character of the appropriate type. If the current\nmatching point is at the end of the subject string, all of them fail, because\nthere is no character to match.\n.P\nFor compatibility with Perl, \\es did not used to match the VT character (code\n11), which made it different from the the POSIX \"space\" class. However, Perl\nadded VT at release 5.18, and PCRE followed suit at release 8.34. The default\n\\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space\n(32), which are defined as white space in the \"C\" locale. This list may vary if\nlocale-specific matching is taking place. For example, in some locales the\n\"non-breaking space\" character (\\exA0) is recognized as white space, and in\nothers the VT character is not.\n.P\nA \"word\" character is an underscore or any character that is a letter or digit.\nBy default, the definition of letters and digits is controlled by PCRE's\nlow-valued character tables, and may vary if locale-specific matching is taking\nplace (see\n.\\\" HTML <a href=\"pcreapi.html#localesupport\">\n.\\\" </a>\n\"Locale support\"\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage). For example, in a French locale such as \"fr_FR\" in Unix-like systems,\nor \"french\" in Windows, some character codes greater than 127 are used for\naccented letters, and these are then matched by \\ew. The use of locales with\nUnicode is discouraged.\n.P\nBy default, characters whose code points are greater than 127 never match \\ed,\n\\es, or \\ew, and always match \\eD, \\eS, and \\eW, although this may vary for\ncharacters in the range 128-255 when locale-specific matching is happening.\nThese escape sequences retain their original meanings from before Unicode\nsupport was available, mainly for efficiency reasons. If PCRE is compiled with\nUnicode property support, and the PCRE_UCP option is set, the behaviour is\nchanged so that Unicode properties are used to determine character types, as\nfollows:\n.sp\n  \\ed  any character that matches \\ep{Nd} (decimal digit)\n  \\es  any character that matches \\ep{Z} or \\eh or \\ev\n  \\ew  any character that matches \\ep{L} or \\ep{N}, plus underscore\n.sp\nThe upper case escapes match the inverse sets of characters. Note that \\ed\nmatches only decimal digits, whereas \\ew matches any Unicode digit, as well as\nany Unicode letter, and underscore. Note also that PCRE_UCP affects \\eb, and\n\\eB because they are defined in terms of \\ew and \\eW. Matching these sequences\nis noticeably slower when PCRE_UCP is set.\n.P\nThe sequences \\eh, \\eH, \\ev, and \\eV are features that were added to Perl at\nrelease 5.10. In contrast to the other sequences, which match only ASCII\ncharacters by default, these always match certain high-valued code points,\nwhether or not PCRE_UCP is set. The horizontal space characters are:\n.sp\n  U+0009     Horizontal tab (HT)\n  U+0020     Space\n  U+00A0     Non-break space\n  U+1680     Ogham space mark\n  U+180E     Mongolian vowel separator\n  U+2000     En quad\n  U+2001     Em quad\n  U+2002     En space\n  U+2003     Em space\n  U+2004     Three-per-em space\n  U+2005     Four-per-em space\n  U+2006     Six-per-em space\n  U+2007     Figure space\n  U+2008     Punctuation space\n  U+2009     Thin space\n  U+200A     Hair space\n  U+202F     Narrow no-break space\n  U+205F     Medium mathematical space\n  U+3000     Ideographic space\n.sp\nThe vertical space characters are:\n.sp\n  U+000A     Linefeed (LF)\n  U+000B     Vertical tab (VT)\n  U+000C     Form feed (FF)\n  U+000D     Carriage return (CR)\n  U+0085     Next line (NEL)\n  U+2028     Line separator\n  U+2029     Paragraph separator\n.sp\nIn 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are\nrelevant.\n.\n.\n.\\\" HTML <a name=\"newlineseq\"></a>\n.SS \"Newline sequences\"\n.rs\n.sp\nOutside a character class, by default, the escape sequence \\eR matches any\nUnicode newline sequence. In 8-bit non-UTF-8 mode \\eR is equivalent to the\nfollowing:\n.sp\n  (?>\\er\\en|\\en|\\ex0b|\\ef|\\er|\\ex85)\n.sp\nThis is an example of an \"atomic group\", details of which are given\n.\\\" HTML <a href=\"#atomicgroup\">\n.\\\" </a>\nbelow.\n.\\\"\nThis particular group matches either the two-character sequence CR followed by\nLF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,\nU+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next\nline, U+0085). The two-character sequence is treated as a single unit that\ncannot be split.\n.P\nIn other modes, two additional characters whose codepoints are greater than 255\nare added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).\nUnicode character property support is not needed for these characters to be\nrecognized.\n.P\nIt is possible to restrict \\eR to match only CR, LF, or CRLF (instead of the\ncomplete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF\neither at compile time or when the pattern is matched. (BSR is an abbrevation\nfor \"backslash R\".) This can be made the default when PCRE is built; if this is\nthe case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.\nIt is also possible to specify these settings by starting a pattern string with\none of the following sequences:\n.sp\n  (*BSR_ANYCRLF)   CR, LF, or CRLF only\n  (*BSR_UNICODE)   any Unicode newline sequence\n.sp\nThese override the default and the options given to the compiling function, but\nthey can themselves be overridden by options given to a matching function. Note\nthat these special settings, which are not Perl-compatible, are recognized only\nat the very start of a pattern, and that they must be in upper case. If more\nthan one of them is present, the last one is used. They can be combined with a\nchange of newline convention; for example, a pattern can start with:\n.sp\n  (*ANY)(*BSR_ANYCRLF)\n.sp\nThey can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or\n(*UCP) special sequences. Inside a character class, \\eR is treated as an\nunrecognized escape sequence, and so matches the letter \"R\" by default, but\ncauses an error if PCRE_EXTRA is set.\n.\n.\n.\\\" HTML <a name=\"uniextseq\"></a>\n.SS Unicode character properties\n.rs\n.sp\nWhen PCRE is built with Unicode character property support, three additional\nescape sequences that match characters with specific properties are available.\nWhen in 8-bit non-UTF-8 mode, these sequences are of course limited to testing\ncharacters whose codepoints are less than 256, but they do work in this mode.\nThe extra escape sequences are:\n.sp\n  \\ep{\\fIxx\\fP}   a character with the \\fIxx\\fP property\n  \\eP{\\fIxx\\fP}   a character without the \\fIxx\\fP property\n  \\eX       a Unicode extended grapheme cluster\n.sp\nThe property names represented by \\fIxx\\fP above are limited to the Unicode\nscript names, the general category properties, \"Any\", which matches any\ncharacter (including newline), and some special PCRE properties (described\nin the\n.\\\" HTML <a href=\"#extraprops\">\n.\\\" </a>\nnext section).\n.\\\"\nOther Perl properties such as \"InMusicalSymbols\" are not currently supported by\nPCRE. Note that \\eP{Any} does not match any characters, so always causes a\nmatch failure.\n.P\nSets of Unicode characters are defined as belonging to certain scripts. A\ncharacter from one of these sets can be matched using a script name. For\nexample:\n.sp\n  \\ep{Greek}\n  \\eP{Han}\n.sp\nThose that are not part of an identified script are lumped together as\n\"Common\". The current list of scripts is:\n.P\nArabic,\nArmenian,\nAvestan,\nBalinese,\nBamum,\nBassa_Vah,\nBatak,\nBengali,\nBopomofo,\nBrahmi,\nBraille,\nBuginese,\nBuhid,\nCanadian_Aboriginal,\nCarian,\nCaucasian_Albanian,\nChakma,\nCham,\nCherokee,\nCommon,\nCoptic,\nCuneiform,\nCypriot,\nCyrillic,\nDeseret,\nDevanagari,\nDuployan,\nEgyptian_Hieroglyphs,\nElbasan,\nEthiopic,\nGeorgian,\nGlagolitic,\nGothic,\nGrantha,\nGreek,\nGujarati,\nGurmukhi,\nHan,\nHangul,\nHanunoo,\nHebrew,\nHiragana,\nImperial_Aramaic,\nInherited,\nInscriptional_Pahlavi,\nInscriptional_Parthian,\nJavanese,\nKaithi,\nKannada,\nKatakana,\nKayah_Li,\nKharoshthi,\nKhmer,\nKhojki,\nKhudawadi,\nLao,\nLatin,\nLepcha,\nLimbu,\nLinear_A,\nLinear_B,\nLisu,\nLycian,\nLydian,\nMahajani,\nMalayalam,\nMandaic,\nManichaean,\nMeetei_Mayek,\nMende_Kikakui,\nMeroitic_Cursive,\nMeroitic_Hieroglyphs,\nMiao,\nModi,\nMongolian,\nMro,\nMyanmar,\nNabataean,\nNew_Tai_Lue,\nNko,\nOgham,\nOl_Chiki,\nOld_Italic,\nOld_North_Arabian,\nOld_Permic,\nOld_Persian,\nOld_South_Arabian,\nOld_Turkic,\nOriya,\nOsmanya,\nPahawh_Hmong,\nPalmyrene,\nPau_Cin_Hau,\nPhags_Pa,\nPhoenician,\nPsalter_Pahlavi,\nRejang,\nRunic,\nSamaritan,\nSaurashtra,\nSharada,\nShavian,\nSiddham,\nSinhala,\nSora_Sompeng,\nSundanese,\nSyloti_Nagri,\nSyriac,\nTagalog,\nTagbanwa,\nTai_Le,\nTai_Tham,\nTai_Viet,\nTakri,\nTamil,\nTelugu,\nThaana,\nThai,\nTibetan,\nTifinagh,\nTirhuta,\nUgaritic,\nVai,\nWarang_Citi,\nYi.\n.P\nEach character has exactly one Unicode general category property, specified by\na two-letter abbreviation. For compatibility with Perl, negation can be\nspecified by including a circumflex between the opening brace and the property\nname. For example, \\ep{^Lu} is the same as \\eP{Lu}.\n.P\nIf only one letter is specified with \\ep or \\eP, it includes all the general\ncategory properties that start with that letter. In this case, in the absence\nof negation, the curly brackets in the escape sequence are optional; these two\nexamples have the same effect:\n.sp\n  \\ep{L}\n  \\epL\n.sp\nThe following general category property codes are supported:\n.sp\n  C     Other\n  Cc    Control\n  Cf    Format\n  Cn    Unassigned\n  Co    Private use\n  Cs    Surrogate\n.sp\n  L     Letter\n  Ll    Lower case letter\n  Lm    Modifier letter\n  Lo    Other letter\n  Lt    Title case letter\n  Lu    Upper case letter\n.sp\n  M     Mark\n  Mc    Spacing mark\n  Me    Enclosing mark\n  Mn    Non-spacing mark\n.sp\n  N     Number\n  Nd    Decimal number\n  Nl    Letter number\n  No    Other number\n.sp\n  P     Punctuation\n  Pc    Connector punctuation\n  Pd    Dash punctuation\n  Pe    Close punctuation\n  Pf    Final punctuation\n  Pi    Initial punctuation\n  Po    Other punctuation\n  Ps    Open punctuation\n.sp\n  S     Symbol\n  Sc    Currency symbol\n  Sk    Modifier symbol\n  Sm    Mathematical symbol\n  So    Other symbol\n.sp\n  Z     Separator\n  Zl    Line separator\n  Zp    Paragraph separator\n  Zs    Space separator\n.sp\nThe special property L& is also supported: it matches a character that has\nthe Lu, Ll, or Lt property, in other words, a letter that is not classified as\na modifier or \"other\".\n.P\nThe Cs (Surrogate) property applies only to characters in the range U+D800 to\nU+DFFF. Such characters are not valid in Unicode strings and so\ncannot be tested by PCRE, unless UTF validity checking has been turned off\n(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and\nPCRE_NO_UTF32_CHECK in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\npage). Perl does not support the Cs property.\n.P\nThe long synonyms for property names that Perl supports (such as \\ep{Letter})\nare not supported by PCRE, nor is it permitted to prefix any of these\nproperties with \"Is\".\n.P\nNo character that is in the Unicode table has the Cn (unassigned) property.\nInstead, this property is assumed for any code point that is not in the\nUnicode table.\n.P\nSpecifying caseless matching does not affect these escape sequences. For\nexample, \\ep{Lu} always matches only upper case letters. This is different from\nthe behaviour of current versions of Perl.\n.P\nMatching characters by Unicode property is not fast, because PCRE has to do a\nmultistage table lookup in order to find a character's property. That is why\nthe traditional escape sequences such as \\ed and \\ew do not use Unicode\nproperties in PCRE by default, though you can make them do so by setting the\nPCRE_UCP option or by starting the pattern with (*UCP).\n.\n.\n.SS Extended grapheme clusters\n.rs\n.sp\nThe \\eX escape matches any number of Unicode characters that form an \"extended\ngrapheme cluster\", and treats the sequence as an atomic group\n.\\\" HTML <a href=\"#atomicgroup\">\n.\\\" </a>\n(see below).\n.\\\"\nUp to and including release 8.31, PCRE matched an earlier, simpler definition\nthat was equivalent to\n.sp\n  (?>\\ePM\\epM*)\n.sp\nThat is, it matched a character without the \"mark\" property, followed by zero\nor more characters with the \"mark\" property. Characters with the \"mark\"\nproperty are typically non-spacing accents that affect the preceding character.\n.P\nThis simple definition was extended in Unicode to include more complicated\nkinds of composite character by giving each character a grapheme breaking\nproperty, and creating rules that use these properties to define the boundaries\nof extended grapheme clusters. In releases of PCRE later than 8.31, \\eX matches\none of these clusters.\n.P\n\\eX always matches at least one character. Then it decides whether to add\nadditional characters according to the following rules for ending a cluster:\n.P\n1. End at the end of the subject string.\n.P\n2. Do not end between CR and LF; otherwise end after any control character.\n.P\n3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters\nare of five types: L, V, T, LV, and LVT. An L character may be followed by an\nL, V, LV, or LVT character; an LV or V character may be followed by a V or T\ncharacter; an LVT or T character may be follwed only by a T character.\n.P\n4. Do not end before extending characters or spacing marks. Characters with\nthe \"mark\" property always have the \"extend\" grapheme breaking property.\n.P\n5. Do not end after prepend characters.\n.P\n6. Otherwise, end the cluster.\n.\n.\n.\\\" HTML <a name=\"extraprops\"></a>\n.SS PCRE's additional properties\n.rs\n.sp\nAs well as the standard Unicode properties described above, PCRE supports four\nmore that make it possible to convert traditional escape sequences such as \\ew\nand \\es to use Unicode properties. PCRE uses these non-standard, non-Perl\nproperties internally when PCRE_UCP is set. However, they may also be used\nexplicitly. These properties are:\n.sp\n  Xan   Any alphanumeric character\n  Xps   Any POSIX space character\n  Xsp   Any Perl space character\n  Xwd   Any Perl \"word\" character\n.sp\nXan matches characters that have either the L (letter) or the N (number)\nproperty. Xps matches the characters tab, linefeed, vertical tab, form feed, or\ncarriage return, and any other character that has the Z (separator) property.\nXsp is the same as Xps; it used to exclude vertical tab, for Perl\ncompatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd\nmatches the same characters as Xan, plus underscore.\n.P\nThere is another non-standard property, Xuc, which matches any character that\ncan be represented by a Universal Character Name in C++ and other programming\nlanguages. These are the characters $, @, ` (grave accent), and all characters\nwith Unicode code points greater than or equal to U+00A0, except for the\nsurrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are\nexcluded. (Universal Character Names are of the form \\euHHHH or \\eUHHHHHHHH\nwhere H is a hexadecimal digit. Note that the Xuc property does not match these\nsequences but the characters that they represent.)\n.\n.\n.\\\" HTML <a name=\"resetmatchstart\"></a>\n.SS \"Resetting the match start\"\n.rs\n.sp\nThe escape sequence \\eK causes any previously matched characters not to be\nincluded in the final matched sequence. For example, the pattern:\n.sp\n  foo\\eKbar\n.sp\nmatches \"foobar\", but reports that it has matched \"bar\". This feature is\nsimilar to a lookbehind assertion\n.\\\" HTML <a href=\"#lookbehind\">\n.\\\" </a>\n(described below).\n.\\\"\nHowever, in this case, the part of the subject before the real match does not\nhave to be of fixed length, as lookbehind assertions do. The use of \\eK does\nnot interfere with the setting of\n.\\\" HTML <a href=\"#subpattern\">\n.\\\" </a>\ncaptured substrings.\n.\\\"\nFor example, when the pattern\n.sp\n  (foo)\\eKbar\n.sp\nmatches \"foobar\", the first substring is still set to \"foo\".\n.P\nPerl documents that the use of \\eK within assertions is \"not well defined\". In\nPCRE, \\eK is acted upon when it occurs inside positive assertions, but is\nignored in negative assertions. Note that when a pattern such as (?=ab\\eK)\nmatches, the reported start of the match can be greater than the end of the\nmatch.\n.\n.\n.\\\" HTML <a name=\"smallassertions\"></a>\n.SS \"Simple assertions\"\n.rs\n.sp\nThe final use of backslash is for certain simple assertions. An assertion\nspecifies a condition that has to be met at a particular point in a match,\nwithout consuming any characters from the subject string. The use of\nsubpatterns for more complicated assertions is described\n.\\\" HTML <a href=\"#bigassertions\">\n.\\\" </a>\nbelow.\n.\\\"\nThe backslashed assertions are:\n.sp\n  \\eb     matches at a word boundary\n  \\eB     matches when not at a word boundary\n  \\eA     matches at the start of the subject\n  \\eZ     matches at the end of the subject\n          also matches before a newline at the end of the subject\n  \\ez     matches only at the end of the subject\n  \\eG     matches at the first matching position in the subject\n.sp\nInside a character class, \\eb has a different meaning; it matches the backspace\ncharacter. If any other of these assertions appears in a character class, by\ndefault it matches the corresponding literal character (for example, \\eB\nmatches the letter B). However, if the PCRE_EXTRA option is set, an \"invalid\nescape sequence\" error is generated instead.\n.P\nA word boundary is a position in the subject string where the current character\nand the previous character do not both match \\ew or \\eW (i.e. one matches\n\\ew and the other matches \\eW), or the start or end of the string if the\nfirst or last character matches \\ew, respectively. In a UTF mode, the meanings\nof \\ew and \\eW can be changed by setting the PCRE_UCP option. When this is\ndone, it also affects \\eb and \\eB. Neither PCRE nor Perl has a separate \"start\nof word\" or \"end of word\" metasequence. However, whatever follows \\eb normally\ndetermines which it is. For example, the fragment \\eba matches \"a\" at the start\nof a word.\n.P\nThe \\eA, \\eZ, and \\ez assertions differ from the traditional circumflex and\ndollar (described in the next section) in that they only ever match at the very\nstart and end of the subject string, whatever options are set. Thus, they are\nindependent of multiline mode. These three assertions are not affected by the\nPCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the\ncircumflex and dollar metacharacters. However, if the \\fIstartoffset\\fP\nargument of \\fBpcre_exec()\\fP is non-zero, indicating that matching is to start\nat a point other than the beginning of the subject, \\eA can never match. The\ndifference between \\eZ and \\ez is that \\eZ matches before a newline at the end\nof the string as well as at the very end, whereas \\ez matches only at the end.\n.P\nThe \\eG assertion is true only when the current matching position is at the\nstart point of the match, as specified by the \\fIstartoffset\\fP argument of\n\\fBpcre_exec()\\fP. It differs from \\eA when the value of \\fIstartoffset\\fP is\nnon-zero. By calling \\fBpcre_exec()\\fP multiple times with appropriate\narguments, you can mimic Perl's /g option, and it is in this kind of\nimplementation where \\eG can be useful.\n.P\nNote, however, that PCRE's interpretation of \\eG, as the start of the current\nmatch, is subtly different from Perl's, which defines it as the end of the\nprevious match. In Perl, these can be different when the previously matched\nstring was empty. Because PCRE does just one match at a time, it cannot\nreproduce this behaviour.\n.P\nIf all the alternatives of a pattern begin with \\eG, the expression is anchored\nto the starting match position, and the \"anchored\" flag is set in the compiled\nregular expression.\n.\n.\n.SH \"CIRCUMFLEX AND DOLLAR\"\n.rs\n.sp\nThe circumflex and dollar metacharacters are zero-width assertions. That is,\nthey test for a particular condition being true without consuming any\ncharacters from the subject string.\n.P\nOutside a character class, in the default matching mode, the circumflex\ncharacter is an assertion that is true only if the current matching point is at\nthe start of the subject string. If the \\fIstartoffset\\fP argument of\n\\fBpcre_exec()\\fP is non-zero, circumflex can never match if the PCRE_MULTILINE\noption is unset. Inside a character class, circumflex has an entirely different\nmeaning\n.\\\" HTML <a href=\"#characterclass\">\n.\\\" </a>\n(see below).\n.\\\"\n.P\nCircumflex need not be the first character of the pattern if a number of\nalternatives are involved, but it should be the first thing in each alternative\nin which it appears if the pattern is ever to match that branch. If all\npossible alternatives start with a circumflex, that is, if the pattern is\nconstrained to match only at the start of the subject, it is said to be an\n\"anchored\" pattern. (There are also other constructs that can cause a pattern\nto be anchored.)\n.P\nThe dollar character is an assertion that is true only if the current matching\npoint is at the end of the subject string, or immediately before a newline at\nthe end of the string (by default). Note, however, that it does not actually\nmatch the newline. Dollar need not be the last character of the pattern if a\nnumber of alternatives are involved, but it should be the last item in any\nbranch in which it appears. Dollar has no special meaning in a character class.\n.P\nThe meaning of dollar can be changed so that it matches only at the very end of\nthe string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This\ndoes not affect the \\eZ assertion.\n.P\nThe meanings of the circumflex and dollar characters are changed if the\nPCRE_MULTILINE option is set. When this is the case, a circumflex matches\nimmediately after internal newlines as well as at the start of the subject\nstring. It does not match after a newline that ends the string. A dollar\nmatches before any newlines in the string, as well as at the very end, when\nPCRE_MULTILINE is set. When newline is specified as the two-character\nsequence CRLF, isolated CR and LF characters do not indicate newlines.\n.P\nFor example, the pattern /^abc$/ matches the subject string \"def\\enabc\" (where\n\\en represents a newline) in multiline mode, but not otherwise. Consequently,\npatterns that are anchored in single line mode because all branches start with\n^ are not anchored in multiline mode, and a match for circumflex is possible\nwhen the \\fIstartoffset\\fP argument of \\fBpcre_exec()\\fP is non-zero. The\nPCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.\n.P\nNote that the sequences \\eA, \\eZ, and \\ez can be used to match the start and\nend of the subject in both modes, and if all branches of a pattern start with\n\\eA it is always anchored, whether or not PCRE_MULTILINE is set.\n.\n.\n.\\\" HTML <a name=\"fullstopdot\"></a>\n.SH \"FULL STOP (PERIOD, DOT) AND \\eN\"\n.rs\n.sp\nOutside a character class, a dot in the pattern matches any one character in\nthe subject string except (by default) a character that signifies the end of a\nline.\n.P\nWhen a line ending is defined as a single character, dot never matches that\ncharacter; when the two-character sequence CRLF is used, dot does not match CR\nif it is immediately followed by LF, but otherwise it matches all characters\n(including isolated CRs and LFs). When any Unicode line endings are being\nrecognized, dot does not match CR or LF or any of the other line ending\ncharacters.\n.P\nThe behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL\noption is set, a dot matches any one character, without exception. If the\ntwo-character sequence CRLF is present in the subject string, it takes two dots\nto match it.\n.P\nThe handling of dot is entirely independent of the handling of circumflex and\ndollar, the only relationship being that they both involve newlines. Dot has no\nspecial meaning in a character class.\n.P\nThe escape sequence \\eN behaves like a dot, except that it is not affected by\nthe PCRE_DOTALL option. In other words, it matches any character except one\nthat signifies the end of a line. Perl also uses \\eN to match characters by\nname; PCRE does not support this.\n.\n.\n.SH \"MATCHING A SINGLE DATA UNIT\"\n.rs\n.sp\nOutside a character class, the escape sequence \\eC matches any one data unit,\nwhether or not a UTF mode is set. In the 8-bit library, one data unit is one\nbyte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is\na 32-bit unit. Unlike a dot, \\eC always\nmatches line-ending characters. The feature is provided in Perl in order to\nmatch individual bytes in UTF-8 mode, but it is unclear how it can usefully be\nused. Because \\eC breaks up characters into individual data units, matching one\nunit with \\eC in a UTF mode means that the rest of the string may start with a\nmalformed UTF character. This has undefined results, because PCRE assumes that\nit is dealing with valid UTF strings (and by default it checks this at the\nstart of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or\nPCRE_NO_UTF32_CHECK option is used).\n.P\nPCRE does not allow \\eC to appear in lookbehind assertions\n.\\\" HTML <a href=\"#lookbehind\">\n.\\\" </a>\n(described below)\n.\\\"\nin a UTF mode, because this would make it impossible to calculate the length of\nthe lookbehind.\n.P\nIn general, the \\eC escape sequence is best avoided. However, one\nway of using it that avoids the problem of malformed UTF characters is to use a\nlookahead to check the length of the next character, as in this pattern, which\ncould be used with a UTF-8 string (ignore white space and line breaks):\n.sp\n  (?| (?=[\\ex00-\\ex7f])(\\eC) |\n      (?=[\\ex80-\\ex{7ff}])(\\eC)(\\eC) |\n      (?=[\\ex{800}-\\ex{ffff}])(\\eC)(\\eC)(\\eC) |\n      (?=[\\ex{10000}-\\ex{1fffff}])(\\eC)(\\eC)(\\eC)(\\eC))\n.sp\nA group that starts with (?| resets the capturing parentheses numbers in each\nalternative (see\n.\\\" HTML <a href=\"#dupsubpatternnumber\">\n.\\\" </a>\n\"Duplicate Subpattern Numbers\"\n.\\\"\nbelow). The assertions at the start of each branch check the next UTF-8\ncharacter for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The\ncharacter's individual bytes are then captured by the appropriate number of\ngroups.\n.\n.\n.\\\" HTML <a name=\"characterclass\"></a>\n.SH \"SQUARE BRACKETS AND CHARACTER CLASSES\"\n.rs\n.sp\nAn opening square bracket introduces a character class, terminated by a closing\nsquare bracket. A closing square bracket on its own is not special by default.\nHowever, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square\nbracket causes a compile-time error. If a closing square bracket is required as\na member of the class, it should be the first data character in the class\n(after an initial circumflex, if present) or escaped with a backslash.\n.P\nA character class matches a single character in the subject. In a UTF mode, the\ncharacter may be more than one data unit long. A matched character must be in\nthe set of characters defined by the class, unless the first character in the\nclass definition is a circumflex, in which case the subject character must not\nbe in the set defined by the class. If a circumflex is actually required as a\nmember of the class, ensure it is not the first character, or escape it with a\nbackslash.\n.P\nFor example, the character class [aeiou] matches any lower case vowel, while\n[^aeiou] matches any character that is not a lower case vowel. Note that a\ncircumflex is just a convenient notation for specifying the characters that\nare in the class by enumerating those that are not. A class that starts with a\ncircumflex is not an assertion; it still consumes a character from the subject\nstring, and therefore it fails if the current pointer is at the end of the\nstring.\n.P\nIn UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff)\ncan be included in a class as a literal string of data units, or by using the\n\\ex{ escaping mechanism.\n.P\nWhen caseless matching is set, any letters in a class represent both their\nupper case and lower case versions, so for example, a caseless [aeiou] matches\n\"A\" as well as \"a\", and a caseless [^aeiou] does not match \"A\", whereas a\ncaseful version would. In a UTF mode, PCRE always understands the concept of\ncase for characters whose values are less than 128, so caseless matching is\nalways possible. For characters with higher values, the concept of case is\nsupported if PCRE is compiled with Unicode property support, but not otherwise.\nIf you want to use caseless matching in a UTF mode for characters 128 and\nabove, you must ensure that PCRE is compiled with Unicode property support as\nwell as with UTF support.\n.P\nCharacters that might indicate line breaks are never treated in any special way\nwhen matching character classes, whatever line-ending sequence is in use, and\nwhatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class\nsuch as [^a] always matches one of these characters.\n.P\nThe minus (hyphen) character can be used to specify a range of characters in a\ncharacter class. For example, [d-m] matches any letter between d and m,\ninclusive. If a minus character is required in a class, it must be escaped with\na backslash or appear in a position where it cannot be interpreted as\nindicating a range, typically as the first or last character in the class, or\nimmediately after a range. For example, [b-d-z] matches letters in the range b\nto d, a hyphen character, or z.\n.P\nIt is not possible to have the literal character \"]\" as the end character of a\nrange. A pattern such as [W-]46] is interpreted as a class of two characters\n(\"W\" and \"-\") followed by a literal string \"46]\", so it would match \"W46]\" or\n\"-46]\". However, if the \"]\" is escaped with a backslash it is interpreted as\nthe end of range, so [W-\\e]46] is interpreted as a class containing a range\nfollowed by two other characters. The octal or hexadecimal representation of\n\"]\" can also be used to end a range.\n.P\nAn error is generated if a POSIX character class (see below) or an escape\nsequence other than one that defines a single character appears at a point\nwhere a range ending character is expected. For example, [z-\\exff] is valid,\nbut [A-\\ed] and [A-[:digit:]] are not.\n.P\nRanges operate in the collating sequence of character values. They can also be\nused for characters specified numerically, for example [\\e000-\\e037]. Ranges\ncan include any characters that are valid for the current mode.\n.P\nIf a range that includes letters is used when caseless matching is set, it\nmatches the letters in either case. For example, [W-c] is equivalent to\n[][\\e\\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character\ntables for a French locale are in use, [\\exc8-\\excb] matches accented E\ncharacters in both cases. In UTF modes, PCRE supports the concept of case for\ncharacters with values greater than 128 only when it is compiled with Unicode\nproperty support.\n.P\nThe character escape sequences \\ed, \\eD, \\eh, \\eH, \\ep, \\eP, \\es, \\eS, \\ev,\n\\eV, \\ew, and \\eW may appear in a character class, and add the characters that\nthey match to the class. For example, [\\edABCDEF] matches any hexadecimal\ndigit. In UTF modes, the PCRE_UCP option affects the meanings of \\ed, \\es, \\ew\nand their upper case partners, just as it does when they appear outside a\ncharacter class, as described in the section entitled\n.\\\" HTML <a href=\"#genericchartypes\">\n.\\\" </a>\n\"Generic character types\"\n.\\\"\nabove. The escape sequence \\eb has a different meaning inside a character\nclass; it matches the backspace character. The sequences \\eB, \\eN, \\eR, and \\eX\nare not special inside a character class. Like any other unrecognized escape\nsequences, they are treated as the literal characters \"B\", \"N\", \"R\", and \"X\" by\ndefault, but cause an error if the PCRE_EXTRA option is set.\n.P\nA circumflex can conveniently be used with the upper case character types to\nspecify a more restricted set of characters than the matching lower case type.\nFor example, the class [^\\eW_] matches any letter or digit, but not underscore,\nwhereas [\\ew] includes underscore. A positive character class should be read as\n\"something OR something OR ...\" and a negative class as \"NOT something AND NOT\nsomething AND NOT ...\".\n.P\nThe only metacharacters that are recognized in character classes are backslash,\nhyphen (only where it can be interpreted as specifying a range), circumflex\n(only at the start), opening square bracket (only when it can be interpreted as\nintroducing a POSIX class name, or for a special compatibility feature - see\nthe next two sections), and the terminating closing square bracket. However,\nescaping other non-alphanumeric characters does no harm.\n.\n.\n.SH \"POSIX CHARACTER CLASSES\"\n.rs\n.sp\nPerl supports the POSIX notation for character classes. This uses names\nenclosed by [: and :] within the enclosing square brackets. PCRE also supports\nthis notation. For example,\n.sp\n  [01[:alpha:]%]\n.sp\nmatches \"0\", \"1\", any alphabetic character, or \"%\". The supported class names\nare:\n.sp\n  alnum    letters and digits\n  alpha    letters\n  ascii    character codes 0 - 127\n  blank    space or tab only\n  cntrl    control characters\n  digit    decimal digits (same as \\ed)\n  graph    printing characters, excluding space\n  lower    lower case letters\n  print    printing characters, including space\n  punct    printing characters, excluding letters and digits and space\n  space    white space (the same as \\es from PCRE 8.34)\n  upper    upper case letters\n  word     \"word\" characters (same as \\ew)\n  xdigit   hexadecimal digits\n.sp\nThe default \"space\" characters are HT (9), LF (10), VT (11), FF (12), CR (13),\nand space (32). If locale-specific matching is taking place, the list of space\ncharacters may be different; there may be fewer or more of them. \"Space\" used\nto be different to \\es, which did not include VT, for Perl compatibility.\nHowever, Perl changed at release 5.18, and PCRE followed at release 8.34.\n\"Space\" and \\es now match the same set of characters.\n.P\nThe name \"word\" is a Perl extension, and \"blank\" is a GNU extension from Perl\n5.8. Another Perl extension is negation, which is indicated by a ^ character\nafter the colon. For example,\n.sp\n  [12[:^digit:]]\n.sp\nmatches \"1\", \"2\", or any non-digit. PCRE (and Perl) also recognize the POSIX\nsyntax [.ch.] and [=ch=] where \"ch\" is a \"collating element\", but these are not\nsupported, and an error is given if they are encountered.\n.P\nBy default, characters with values greater than 128 do not match any of the\nPOSIX character classes. However, if the PCRE_UCP option is passed to\n\\fBpcre_compile()\\fP, some of the classes are changed so that Unicode character\nproperties are used. This is achieved by replacing certain POSIX classes by\nother sequences, as follows:\n.sp\n  [:alnum:]  becomes  \\ep{Xan}\n  [:alpha:]  becomes  \\ep{L}\n  [:blank:]  becomes  \\eh\n  [:digit:]  becomes  \\ep{Nd}\n  [:lower:]  becomes  \\ep{Ll}\n  [:space:]  becomes  \\ep{Xps}\n  [:upper:]  becomes  \\ep{Lu}\n  [:word:]   becomes  \\ep{Xwd}\n.sp\nNegated versions, such as [:^alpha:] use \\eP instead of \\ep. Three other POSIX\nclasses are handled specially in UCP mode:\n.TP 10\n[:graph:]\nThis matches characters that have glyphs that mark the page when printed. In\nUnicode property terms, it matches all characters with the L, M, N, P, S, or Cf\nproperties, except for:\n.sp\n  U+061C           Arabic Letter Mark\n  U+180E           Mongolian Vowel Separator\n  U+2066 - U+2069  Various \"isolate\"s\n.sp\n.TP 10\n[:print:]\nThis matches the same characters as [:graph:] plus space characters that are\nnot controls, that is, characters with the Zs property.\n.TP 10\n[:punct:]\nThis matches all characters that have the Unicode P (punctuation) property,\nplus those characters whose code points are less than 128 that have the S\n(Symbol) property.\n.P\nThe other POSIX classes are unchanged, and match only characters with code\npoints less than 128.\n.\n.\n.SH \"COMPATIBILITY FEATURE FOR WORD BOUNDARIES\"\n.rs\n.sp\nIn the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly\nsyntax [[:<:]] and [[:>:]] is used for matching \"start of word\" and \"end of\nword\". PCRE treats these items as follows:\n.sp\n  [[:<:]]  is converted to  \\eb(?=\\ew)\n  [[:>:]]  is converted to  \\eb(?<=\\ew)\n.sp\nOnly these exact character sequences are recognized. A sequence such as\n[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is\nnot compatible with Perl. It is provided to help migrations from other\nenvironments, and is best not used in any new patterns. Note that \\eb matches\nat the start and the end of a word (see\n.\\\" HTML <a href=\"#smallassertions\">\n.\\\" </a>\n\"Simple assertions\"\n.\\\"\nabove), and in a Perl-style pattern the preceding or following character\nnormally shows which is wanted, without the need for the assertions that are\nused above in order to give exactly the POSIX behaviour.\n.\n.\n.SH \"VERTICAL BAR\"\n.rs\n.sp\nVertical bar characters are used to separate alternative patterns. For example,\nthe pattern\n.sp\n  gilbert|sullivan\n.sp\nmatches either \"gilbert\" or \"sullivan\". Any number of alternatives may appear,\nand an empty alternative is permitted (matching the empty string). The matching\nprocess tries each alternative in turn, from left to right, and the first one\nthat succeeds is used. If the alternatives are within a subpattern\n.\\\" HTML <a href=\"#subpattern\">\n.\\\" </a>\n(defined below),\n.\\\"\n\"succeeds\" means matching the rest of the main pattern as well as the\nalternative in the subpattern.\n.\n.\n.SH \"INTERNAL OPTION SETTING\"\n.rs\n.sp\nThe settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and\nPCRE_EXTENDED options (which are Perl-compatible) can be changed from within\nthe pattern by a sequence of Perl option letters enclosed between \"(?\" and \")\".\nThe option letters are\n.sp\n  i  for PCRE_CASELESS\n  m  for PCRE_MULTILINE\n  s  for PCRE_DOTALL\n  x  for PCRE_EXTENDED\n.sp\nFor example, (?im) sets caseless, multiline matching. It is also possible to\nunset these options by preceding the letter with a hyphen, and a combined\nsetting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\nPCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\npermitted. If a letter appears both before and after the hyphen, the option is\nunset.\n.P\nThe PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be\nchanged in the same way as the Perl-compatible options by using the characters\nJ, U and X respectively.\n.P\nWhen one of these option changes occurs at top level (that is, not inside\nsubpattern parentheses), the change applies to the remainder of the pattern\nthat follows. An option change within a subpattern (see below for a description\nof subpatterns) affects only that part of the subpattern that follows it, so\n.sp\n  (a(?i)b)c\n.sp\nmatches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\nBy this means, options can be made to have different settings in different\nparts of the pattern. Any changes made in one alternative do carry on\ninto subsequent branches within the same subpattern. For example,\n.sp\n  (a(?i)b|c)\n.sp\nmatches \"ab\", \"aB\", \"c\", and \"C\", even though when matching \"C\" the first\nbranch is abandoned before the option setting. This is because the effects of\noption settings happen at compile time. There would be some very weird\nbehaviour otherwise.\n.P\n\\fBNote:\\fP There are other PCRE-specific options that can be set by the\napplication when the compiling or matching functions are called. In some cases\nthe pattern can contain special leading sequences such as (*CRLF) to override\nwhat the application has set or what has been defaulted. Details are given in\nthe section entitled\n.\\\" HTML <a href=\"#newlineseq\">\n.\\\" </a>\n\"Newline sequences\"\n.\\\"\nabove. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading\nsequences that can be used to set UTF and Unicode property modes; they are\nequivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP\noptions, respectively. The (*UTF) sequence is a generic version that can be\nused with any of the libraries. However, the application can set the\nPCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences.\n.\n.\n.\\\" HTML <a name=\"subpattern\"></a>\n.SH SUBPATTERNS\n.rs\n.sp\nSubpatterns are delimited by parentheses (round brackets), which can be nested.\nTurning part of a pattern into a subpattern does two things:\n.sp\n1. It localizes a set of alternatives. For example, the pattern\n.sp\n  cat(aract|erpillar|)\n.sp\nmatches \"cataract\", \"caterpillar\", or \"cat\". Without the parentheses, it would\nmatch \"cataract\", \"erpillar\" or an empty string.\n.sp\n2. It sets up the subpattern as a capturing subpattern. This means that, when\nthe whole pattern matches, that portion of the subject string that matched the\nsubpattern is passed back to the caller via the \\fIovector\\fP argument of the\nmatching function. (This applies only to the traditional matching functions;\nthe DFA matching functions do not support capturing.)\n.P\nOpening parentheses are counted from left to right (starting from 1) to obtain\nnumbers for the capturing subpatterns. For example, if the string \"the red\nking\" is matched against the pattern\n.sp\n  the ((red|white) (king|queen))\n.sp\nthe captured substrings are \"red king\", \"red\", and \"king\", and are numbered 1,\n2, and 3, respectively.\n.P\nThe fact that plain parentheses fulfil two functions is not always helpful.\nThere are often times when a grouping subpattern is required without a\ncapturing requirement. If an opening parenthesis is followed by a question mark\nand a colon, the subpattern does not do any capturing, and is not counted when\ncomputing the number of any subsequent capturing subpatterns. For example, if\nthe string \"the white queen\" is matched against the pattern\n.sp\n  the ((?:red|white) (king|queen))\n.sp\nthe captured substrings are \"white queen\" and \"queen\", and are numbered 1 and\n2. The maximum number of capturing subpatterns is 65535.\n.P\nAs a convenient shorthand, if any option settings are required at the start of\na non-capturing subpattern, the option letters may appear between the \"?\" and\nthe \":\". Thus the two patterns\n.sp\n  (?i:saturday|sunday)\n  (?:(?i)saturday|sunday)\n.sp\nmatch exactly the same set of strings. Because alternative branches are tried\nfrom left to right, and options are not reset until the end of the subpattern\nis reached, an option setting in one branch does affect subsequent branches, so\nthe above patterns match \"SUNDAY\" as well as \"Saturday\".\n.\n.\n.\\\" HTML <a name=\"dupsubpatternnumber\"></a>\n.SH \"DUPLICATE SUBPATTERN NUMBERS\"\n.rs\n.sp\nPerl 5.10 introduced a feature whereby each alternative in a subpattern uses\nthe same numbers for its capturing parentheses. Such a subpattern starts with\n(?| and is itself a non-capturing subpattern. For example, consider this\npattern:\n.sp\n  (?|(Sat)ur|(Sun))day\n.sp\nBecause the two alternatives are inside a (?| group, both sets of capturing\nparentheses are numbered one. Thus, when the pattern matches, you can look\nat captured substring number one, whichever alternative matched. This construct\nis useful when you want to capture part, but not all, of one of a number of\nalternatives. Inside a (?| group, parentheses are numbered as usual, but the\nnumber is reset at the start of each branch. The numbers of any capturing\nparentheses that follow the subpattern start after the highest number used in\nany branch. The following example is taken from the Perl documentation. The\nnumbers underneath show in which buffer the captured content will be stored.\n.sp\n  # before  ---------------branch-reset----------- after\n  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x\n  # 1            2         2  3        2     3     4\n.sp\nA back reference to a numbered subpattern uses the most recent value that is\nset for that number by any subpattern. The following pattern matches \"abcabc\"\nor \"defdef\":\n.sp\n  /(?|(abc)|(def))\\e1/\n.sp\nIn contrast, a subroutine call to a numbered subpattern always refers to the\nfirst one in the pattern with the given number. The following pattern matches\n\"abcabc\" or \"defabc\":\n.sp\n  /(?|(abc)|(def))(?1)/\n.sp\nIf a\n.\\\" HTML <a href=\"#conditions\">\n.\\\" </a>\ncondition test\n.\\\"\nfor a subpattern's having matched refers to a non-unique number, the test is\ntrue if any of the subpatterns of that number have matched.\n.P\nAn alternative approach to using this \"branch reset\" feature is to use\nduplicate named subpatterns, as described in the next section.\n.\n.\n.SH \"NAMED SUBPATTERNS\"\n.rs\n.sp\nIdentifying capturing parentheses by number is simple, but it can be very hard\nto keep track of the numbers in complicated regular expressions. Furthermore,\nif an expression is modified, the numbers may change. To help with this\ndifficulty, PCRE supports the naming of subpatterns. This feature was not\nadded to Perl until release 5.10. Python had the feature earlier, and PCRE\nintroduced it at release 4.0, using the Python syntax. PCRE now supports both\nthe Perl and the Python syntax. Perl allows identically numbered subpatterns to\nhave different names, but PCRE does not.\n.P\nIn PCRE, a subpattern can be named in one of three ways: (?<name>...) or\n(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing\nparentheses from other parts of the pattern, such as\n.\\\" HTML <a href=\"#backreferences\">\n.\\\" </a>\nback references,\n.\\\"\n.\\\" HTML <a href=\"#recursion\">\n.\\\" </a>\nrecursion,\n.\\\"\nand\n.\\\" HTML <a href=\"#conditions\">\n.\\\" </a>\nconditions,\n.\\\"\ncan be made by name as well as by number.\n.P\nNames consist of up to 32 alphanumeric characters and underscores, but must\nstart with a non-digit. Named capturing parentheses are still allocated numbers\nas well as names, exactly as if the names were not present. The PCRE API\nprovides function calls for extracting the name-to-number translation table\nfrom a compiled pattern. There is also a convenience function for extracting a\ncaptured substring by name.\n.P\nBy default, a name must be unique within a pattern, but it is possible to relax\nthis constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate\nnames are also always permitted for subpatterns with the same number, set up as\ndescribed in the previous section.) Duplicate names can be useful for patterns\nwhere only one instance of the named parentheses can match. Suppose you want to\nmatch the name of a weekday, either as a 3-letter abbreviation or as the full\nname, and in both cases you want to extract the abbreviation. This pattern\n(ignoring the line breaks) does the job:\n.sp\n  (?<DN>Mon|Fri|Sun)(?:day)?|\n  (?<DN>Tue)(?:sday)?|\n  (?<DN>Wed)(?:nesday)?|\n  (?<DN>Thu)(?:rsday)?|\n  (?<DN>Sat)(?:urday)?\n.sp\nThere are five capturing substrings, but only one is ever set after a match.\n(An alternative way of solving this problem is to use a \"branch reset\"\nsubpattern, as described in the previous section.)\n.P\nThe convenience function for extracting the data by name returns the substring\nfor the first (and in this example, the only) subpattern of that name that\nmatched. This saves searching to find which numbered subpattern it was.\n.P\nIf you make a back reference to a non-unique named subpattern from elsewhere in\nthe pattern, the subpatterns to which the name refers are checked in the order\nin which they appear in the overall pattern. The first one that is set is used\nfor the reference. For example, this pattern matches both \"foofoo\" and\n\"barbar\" but not \"foobar\" or \"barfoo\":\n.sp\n  (?:(?<n>foo)|(?<n>bar))\\ek<n>\n.sp\n.P\nIf you make a subroutine call to a non-unique named subpattern, the one that\ncorresponds to the first occurrence of the name is used. In the absence of\nduplicate numbers (see the previous section) this is the one with the lowest\nnumber.\n.P\nIf you use a named reference in a condition\ntest (see the\n.\\\"\n.\\\" HTML <a href=\"#conditions\">\n.\\\" </a>\nsection about conditions\n.\\\"\nbelow), either to check whether a subpattern has matched, or to check for\nrecursion, all subpatterns with the same name are tested. If the condition is\ntrue for any one of them, the overall condition is true. This is the same\nbehaviour as testing by number. For further details of the interfaces for\nhandling named subpatterns, see the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.P\n\\fBWarning:\\fP You cannot use different names to distinguish between two\nsubpatterns with the same number because PCRE uses only the numbers when\nmatching. For this reason, an error is given at compile time if different names\nare given to subpatterns with the same number. However, you can always give the\nsame name to subpatterns with the same number, even when PCRE_DUPNAMES is not\nset.\n.\n.\n.SH REPETITION\n.rs\n.sp\nRepetition is specified by quantifiers, which can follow any of the following\nitems:\n.sp\n  a literal data character\n  the dot metacharacter\n  the \\eC escape sequence\n  the \\eX escape sequence\n  the \\eR escape sequence\n  an escape such as \\ed or \\epL that matches a single character\n  a character class\n  a back reference (see next section)\n  a parenthesized subpattern (including assertions)\n  a subroutine call to a subpattern (recursive or otherwise)\n.sp\nThe general repetition quantifier specifies a minimum and maximum number of\npermitted matches, by giving the two numbers in curly brackets (braces),\nseparated by a comma. The numbers must be less than 65536, and the first must\nbe less than or equal to the second. For example:\n.sp\n  z{2,4}\n.sp\nmatches \"zz\", \"zzz\", or \"zzzz\". A closing brace on its own is not a special\ncharacter. If the second number is omitted, but the comma is present, there is\nno upper limit; if the second number and the comma are both omitted, the\nquantifier specifies an exact number of required matches. Thus\n.sp\n  [aeiou]{3,}\n.sp\nmatches at least 3 successive vowels, but may match many more, while\n.sp\n  \\ed{8}\n.sp\nmatches exactly 8 digits. An opening curly bracket that appears in a position\nwhere a quantifier is not allowed, or one that does not match the syntax of a\nquantifier, is taken as a literal character. For example, {,6} is not a\nquantifier, but a literal string of four characters.\n.P\nIn UTF modes, quantifiers apply to characters rather than to individual data\nunits. Thus, for example, \\ex{100}{2} matches two characters, each of\nwhich is represented by a two-byte sequence in a UTF-8 string. Similarly,\n\\eX{3} matches three Unicode extended grapheme clusters, each of which may be\nseveral data units long (and they may be of different lengths).\n.P\nThe quantifier {0} is permitted, causing the expression to behave as if the\nprevious item and the quantifier were not present. This may be useful for\nsubpatterns that are referenced as\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nsubroutines\n.\\\"\nfrom elsewhere in the pattern (but see also the section entitled\n.\\\" HTML <a href=\"#subdefine\">\n.\\\" </a>\n\"Defining subpatterns for use by reference only\"\n.\\\"\nbelow). Items other than subpatterns that have a {0} quantifier are omitted\nfrom the compiled pattern.\n.P\nFor convenience, the three most common quantifiers have single-character\nabbreviations:\n.sp\n  *    is equivalent to {0,}\n  +    is equivalent to {1,}\n  ?    is equivalent to {0,1}\n.sp\nIt is possible to construct infinite loops by following a subpattern that can\nmatch no characters with a quantifier that has no upper limit, for example:\n.sp\n  (a?)*\n.sp\nEarlier versions of Perl and PCRE used to give an error at compile time for\nsuch patterns. However, because there are cases where this can be useful, such\npatterns are now accepted, but if any repetition of the subpattern does in fact\nmatch no characters, the loop is forcibly broken.\n.P\nBy default, the quantifiers are \"greedy\", that is, they match as much as\npossible (up to the maximum number of permitted times), without causing the\nrest of the pattern to fail. The classic example of where this gives problems\nis in trying to match comments in C programs. These appear between /* and */\nand within the comment, individual * and / characters may appear. An attempt to\nmatch C comments by applying the pattern\n.sp\n  /\\e*.*\\e*/\n.sp\nto the string\n.sp\n  /* first comment */  not comment  /* second comment */\n.sp\nfails, because it matches the entire string owing to the greediness of the .*\nitem.\n.P\nHowever, if a quantifier is followed by a question mark, it ceases to be\ngreedy, and instead matches the minimum number of times possible, so the\npattern\n.sp\n  /\\e*.*?\\e*/\n.sp\ndoes the right thing with the C comments. The meaning of the various\nquantifiers is not otherwise changed, just the preferred number of matches.\nDo not confuse this use of question mark with its use as a quantifier in its\nown right. Because it has two uses, it can sometimes appear doubled, as in\n.sp\n  \\ed??\\ed\n.sp\nwhich matches one digit by preference, but can match two if that is the only\nway the rest of the pattern matches.\n.P\nIf the PCRE_UNGREEDY option is set (an option that is not available in Perl),\nthe quantifiers are not greedy by default, but individual ones can be made\ngreedy by following them with a question mark. In other words, it inverts the\ndefault behaviour.\n.P\nWhen a parenthesized subpattern is quantified with a minimum repeat count that\nis greater than 1 or with a limited maximum, more memory is required for the\ncompiled pattern, in proportion to the size of the minimum or maximum.\n.P\nIf a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\nto Perl's /s) is set, thus allowing the dot to match newlines, the pattern is\nimplicitly anchored, because whatever follows will be tried against every\ncharacter position in the subject string, so there is no point in retrying the\noverall match at any position after the first. PCRE normally treats such a\npattern as though it were preceded by \\eA.\n.P\nIn cases where it is known that the subject string contains no newlines, it is\nworth setting PCRE_DOTALL in order to obtain this optimization, or\nalternatively using ^ to indicate anchoring explicitly.\n.P\nHowever, there are some cases where the optimization cannot be used. When .*\nis inside capturing parentheses that are the subject of a back reference\nelsewhere in the pattern, a match at the start may fail where a later one\nsucceeds. Consider, for example:\n.sp\n  (.*)abc\\e1\n.sp\nIf the subject is \"xyz123abc123\" the match point is the fourth character. For\nthis reason, such a pattern is not implicitly anchored.\n.P\nAnother case where implicit anchoring is not applied is when the leading .* is\ninside an atomic group. Once again, a match at the start may fail where a later\none succeeds. Consider this pattern:\n.sp\n  (?>.*?a)b\n.sp\nIt matches \"ab\" in the subject \"aab\". The use of the backtracking control verbs\n(*PRUNE) and (*SKIP) also disable this optimization.\n.P\nWhen a capturing subpattern is repeated, the value captured is the substring\nthat matched the final iteration. For example, after\n.sp\n  (tweedle[dume]{3}\\es*)+\n.sp\nhas matched \"tweedledum tweedledee\" the value of the captured substring is\n\"tweedledee\". However, if there are nested capturing subpatterns, the\ncorresponding captured values may have been set in previous iterations. For\nexample, after\n.sp\n  /(a|(b))+/\n.sp\nmatches \"aba\" the value of the second captured substring is \"b\".\n.\n.\n.\\\" HTML <a name=\"atomicgroup\"></a>\n.SH \"ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS\"\n.rs\n.sp\nWith both maximizing (\"greedy\") and minimizing (\"ungreedy\" or \"lazy\")\nrepetition, failure of what follows normally causes the repeated item to be\nre-evaluated to see if a different number of repeats allows the rest of the\npattern to match. Sometimes it is useful to prevent this, either to change the\nnature of the match, or to cause it fail earlier than it otherwise might, when\nthe author of the pattern knows there is no point in carrying on.\n.P\nConsider, for example, the pattern \\ed+foo when applied to the subject line\n.sp\n  123456bar\n.sp\nAfter matching all 6 digits and then failing to match \"foo\", the normal\naction of the matcher is to try again with only 5 digits matching the \\ed+\nitem, and then with 4, and so on, before ultimately failing. \"Atomic grouping\"\n(a term taken from Jeffrey Friedl's book) provides the means for specifying\nthat once a subpattern has matched, it is not to be re-evaluated in this way.\n.P\nIf we use atomic grouping for the previous example, the matcher gives up\nimmediately on failing to match \"foo\" the first time. The notation is a kind of\nspecial parenthesis, starting with (?> as in this example:\n.sp\n  (?>\\ed+)foo\n.sp\nThis kind of parenthesis \"locks up\" the  part of the pattern it contains once\nit has matched, and a failure further into the pattern is prevented from\nbacktracking into it. Backtracking past it to previous items, however, works as\nnormal.\n.P\nAn alternative description is that a subpattern of this type matches the string\nof characters that an identical standalone pattern would match, if anchored at\nthe current point in the subject string.\n.P\nAtomic grouping subpatterns are not capturing subpatterns. Simple cases such as\nthe above example can be thought of as a maximizing repeat that must swallow\neverything it can. So, while both \\ed+ and \\ed+? are prepared to adjust the\nnumber of digits they match in order to make the rest of the pattern match,\n(?>\\ed+) can only match an entire sequence of digits.\n.P\nAtomic groups in general can of course contain arbitrarily complicated\nsubpatterns, and can be nested. However, when the subpattern for an atomic\ngroup is just a single repeated item, as in the example above, a simpler\nnotation, called a \"possessive quantifier\" can be used. This consists of an\nadditional + character following a quantifier. Using this notation, the\nprevious example can be rewritten as\n.sp\n  \\ed++foo\n.sp\nNote that a possessive quantifier can be used with an entire group, for\nexample:\n.sp\n  (abc|xyz){2,3}+\n.sp\nPossessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY\noption is ignored. They are a convenient notation for the simpler forms of\natomic group. However, there is no difference in the meaning of a possessive\nquantifier and the equivalent atomic group, though there may be a performance\ndifference; possessive quantifiers should be slightly faster.\n.P\nThe possessive quantifier syntax is an extension to the Perl 5.8 syntax.\nJeffrey Friedl originated the idea (and the name) in the first edition of his\nbook. Mike McCloskey liked it, so implemented it when he built Sun's Java\npackage, and PCRE copied it from there. It ultimately found its way into Perl\nat release 5.10.\n.P\nPCRE has an optimization that automatically \"possessifies\" certain simple\npattern constructs. For example, the sequence A+B is treated as A++B because\nthere is no point in backtracking into a sequence of A's when B must follow.\n.P\nWhen a pattern contains an unlimited repeat inside a subpattern that can itself\nbe repeated an unlimited number of times, the use of an atomic group is the\nonly way to avoid some failing matches taking a very long time indeed. The\npattern\n.sp\n  (\\eD+|<\\ed+>)*[!?]\n.sp\nmatches an unlimited number of substrings that either consist of non-digits, or\ndigits enclosed in <>, followed by either ! or ?. When it matches, it runs\nquickly. However, if it is applied to\n.sp\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n.sp\nit takes a long time before reporting failure. This is because the string can\nbe divided between the internal \\eD+ repeat and the external * repeat in a\nlarge number of ways, and all have to be tried. (The example uses [!?] rather\nthan a single character at the end, because both PCRE and Perl have an\noptimization that allows for fast failure when a single character is used. They\nremember the last single character that is required for a match, and fail early\nif it is not present in the string.) If the pattern is changed so that it uses\nan atomic group, like this:\n.sp\n  ((?>\\eD+)|<\\ed+>)*[!?]\n.sp\nsequences of non-digits cannot be broken, and failure happens quickly.\n.\n.\n.\\\" HTML <a name=\"backreferences\"></a>\n.SH \"BACK REFERENCES\"\n.rs\n.sp\nOutside a character class, a backslash followed by a digit greater than 0 (and\npossibly further digits) is a back reference to a capturing subpattern earlier\n(that is, to its left) in the pattern, provided there have been that many\nprevious capturing left parentheses.\n.P\nHowever, if the decimal number following the backslash is less than 10, it is\nalways taken as a back reference, and causes an error only if there are not\nthat many capturing left parentheses in the entire pattern. In other words, the\nparentheses that are referenced need not be to the left of the reference for\nnumbers less than 10. A \"forward back reference\" of this type can make sense\nwhen a repetition is involved and the subpattern to the right has participated\nin an earlier iteration.\n.P\nIt is not possible to have a numerical \"forward back reference\" to a subpattern\nwhose number is 10 or more using this syntax because a sequence such as \\e50 is\ninterpreted as a character defined in octal. See the subsection entitled\n\"Non-printing characters\"\n.\\\" HTML <a href=\"#digitsafterbackslash\">\n.\\\" </a>\nabove\n.\\\"\nfor further details of the handling of digits following a backslash. There is\nno such problem when named parentheses are used. A back reference to any\nsubpattern is possible using named parentheses (see below).\n.P\nAnother way of avoiding the ambiguity inherent in the use of digits following a\nbackslash is to use the \\eg escape sequence. This escape must be followed by an\nunsigned number or a negative number, optionally enclosed in braces. These\nexamples are all identical:\n.sp\n  (ring), \\e1\n  (ring), \\eg1\n  (ring), \\eg{1}\n.sp\nAn unsigned number specifies an absolute reference without the ambiguity that\nis present in the older syntax. It is also useful when literal digits follow\nthe reference. A negative number is a relative reference. Consider this\nexample:\n.sp\n  (abc(def)ghi)\\eg{-1}\n.sp\nThe sequence \\eg{-1} is a reference to the most recently started capturing\nsubpattern before \\eg, that is, is it equivalent to \\e2 in this example.\nSimilarly, \\eg{-2} would be equivalent to \\e1. The use of relative references\ncan be helpful in long patterns, and also in patterns that are created by\njoining together fragments that contain references within themselves.\n.P\nA back reference matches whatever actually matched the capturing subpattern in\nthe current subject string, rather than anything matching the subpattern\nitself (see\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\n\"Subpatterns as subroutines\"\n.\\\"\nbelow for a way of doing that). So the pattern\n.sp\n  (sens|respons)e and \\e1ibility\n.sp\nmatches \"sense and sensibility\" and \"response and responsibility\", but not\n\"sense and responsibility\". If caseful matching is in force at the time of the\nback reference, the case of letters is relevant. For example,\n.sp\n  ((?i)rah)\\es+\\e1\n.sp\nmatches \"rah rah\" and \"RAH RAH\", but not \"RAH rah\", even though the original\ncapturing subpattern is matched caselessly.\n.P\nThere are several different ways of writing back references to named\nsubpatterns. The .NET syntax \\ek{name} and the Perl syntax \\ek<name> or\n\\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified\nback reference syntax, in which \\eg can be used for both numeric and named\nreferences, is also supported. We could rewrite the above example in any of\nthe following ways:\n.sp\n  (?<p1>(?i)rah)\\es+\\ek<p1>\n  (?'p1'(?i)rah)\\es+\\ek{p1}\n  (?P<p1>(?i)rah)\\es+(?P=p1)\n  (?<p1>(?i)rah)\\es+\\eg{p1}\n.sp\nA subpattern that is referenced by name may appear in the pattern before or\nafter the reference.\n.P\nThere may be more than one back reference to the same subpattern. If a\nsubpattern has not actually been used in a particular match, any back\nreferences to it always fail by default. For example, the pattern\n.sp\n  (a|(bc))\\e2\n.sp\nalways fails if it starts to match \"a\" rather than \"bc\". However, if the\nPCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an\nunset value matches an empty string.\n.P\nBecause there may be many capturing parentheses in a pattern, all digits\nfollowing a backslash are taken as part of a potential back reference number.\nIf the pattern continues with a digit character, some delimiter must be used to\nterminate the back reference. If the PCRE_EXTENDED option is set, this can be\nwhite space. Otherwise, the \\eg{ syntax or an empty comment (see\n.\\\" HTML <a href=\"#comments\">\n.\\\" </a>\n\"Comments\"\n.\\\"\nbelow) can be used.\n.\n.SS \"Recursive back references\"\n.rs\n.sp\nA back reference that occurs inside the parentheses to which it refers fails\nwhen the subpattern is first used, so, for example, (a\\e1) never matches.\nHowever, such references can be useful inside repeated subpatterns. For\nexample, the pattern\n.sp\n  (a|b\\e1)+\n.sp\nmatches any number of \"a\"s and also \"aba\", \"ababbaa\" etc. At each iteration of\nthe subpattern, the back reference matches the character string corresponding\nto the previous iteration. In order for this to work, the pattern must be such\nthat the first iteration does not need to match the back reference. This can be\ndone using alternation, as in the example above, or by a quantifier with a\nminimum of zero.\n.P\nBack references of this type cause the group that they reference to be treated\nas an\n.\\\" HTML <a href=\"#atomicgroup\">\n.\\\" </a>\natomic group.\n.\\\"\nOnce the whole group has been matched, a subsequent matching failure cannot\ncause backtracking into the middle of the group.\n.\n.\n.\\\" HTML <a name=\"bigassertions\"></a>\n.SH ASSERTIONS\n.rs\n.sp\nAn assertion is a test on the characters following or preceding the current\nmatching point that does not actually consume any characters. The simple\nassertions coded as \\eb, \\eB, \\eA, \\eG, \\eZ, \\ez, ^ and $ are described\n.\\\" HTML <a href=\"#smallassertions\">\n.\\\" </a>\nabove.\n.\\\"\n.P\nMore complicated assertions are coded as subpatterns. There are two kinds:\nthose that look ahead of the current position in the subject string, and those\nthat look behind it. An assertion subpattern is matched in the normal way,\nexcept that it does not cause the current matching position to be changed.\n.P\nAssertion subpatterns are not capturing subpatterns. If such an assertion\ncontains capturing subpatterns within it, these are counted for the purposes of\nnumbering the capturing subpatterns in the whole pattern. However, substring\ncapturing is carried out only for positive assertions. (Perl sometimes, but not\nalways, does do capturing in negative assertions.)\n.P\nWARNING: If a positive assertion containing one or more capturing subpatterns\nsucceeds, but failure to match later in the pattern causes backtracking over\nthis assertion, the captures within the assertion are reset only if no higher\nnumbered captures are already set. This is, unfortunately, a fundamental\nlimitation of the current implementation, and as PCRE1 is now in\nmaintenance-only status, it is unlikely ever to change.\n.P\nFor compatibility with Perl, assertion subpatterns may be repeated; though\nit makes no sense to assert the same thing several times, the side effect of\ncapturing parentheses may occasionally be useful. In practice, there only three\ncases:\n.sp\n(1) If the quantifier is {0}, the assertion is never obeyed during matching.\nHowever, it may contain internal capturing parenthesized groups that are called\nfrom elsewhere via the\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nsubroutine mechanism.\n.\\\"\n.sp\n(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it\nwere {0,1}. At run time, the rest of the pattern match is tried with and\nwithout the assertion, the order depending on the greediness of the quantifier.\n.sp\n(3) If the minimum repetition is greater than zero, the quantifier is ignored.\nThe assertion is obeyed just once when encountered during matching.\n.\n.\n.SS \"Lookahead assertions\"\n.rs\n.sp\nLookahead assertions start with (?= for positive assertions and (?! for\nnegative assertions. For example,\n.sp\n  \\ew+(?=;)\n.sp\nmatches a word followed by a semicolon, but does not include the semicolon in\nthe match, and\n.sp\n  foo(?!bar)\n.sp\nmatches any occurrence of \"foo\" that is not followed by \"bar\". Note that the\napparently similar pattern\n.sp\n  (?!foo)bar\n.sp\ndoes not find an occurrence of \"bar\" that is preceded by something other than\n\"foo\"; it finds any occurrence of \"bar\" whatsoever, because the assertion\n(?!foo) is always true when the next three characters are \"bar\". A\nlookbehind assertion is needed to achieve the other effect.\n.P\nIf you want to force a matching failure at some point in a pattern, the most\nconvenient way to do it is with (?!) because an empty string always matches, so\nan assertion that requires there not to be an empty string must always fail.\nThe backtracking control verb (*FAIL) or (*F) is a synonym for (?!).\n.\n.\n.\\\" HTML <a name=\"lookbehind\"></a>\n.SS \"Lookbehind assertions\"\n.rs\n.sp\nLookbehind assertions start with (?<= for positive assertions and (?<! for\nnegative assertions. For example,\n.sp\n  (?<!foo)bar\n.sp\ndoes find an occurrence of \"bar\" that is not preceded by \"foo\". The contents of\na lookbehind assertion are restricted such that all the strings it matches must\nhave a fixed length. However, if there are several top-level alternatives, they\ndo not all have to have the same fixed length. Thus\n.sp\n  (?<=bullock|donkey)\n.sp\nis permitted, but\n.sp\n  (?<!dogs?|cats?)\n.sp\ncauses an error at compile time. Branches that match different length strings\nare permitted only at the top level of a lookbehind assertion. This is an\nextension compared with Perl, which requires all branches to match the same\nlength of string. An assertion such as\n.sp\n  (?<=ab(c|de))\n.sp\nis not permitted, because its single top-level branch can match two different\nlengths, but it is acceptable to PCRE if rewritten to use two top-level\nbranches:\n.sp\n  (?<=abc|abde)\n.sp\nIn some cases, the escape sequence \\eK\n.\\\" HTML <a href=\"#resetmatchstart\">\n.\\\" </a>\n(see above)\n.\\\"\ncan be used instead of a lookbehind assertion to get round the fixed-length\nrestriction.\n.P\nThe implementation of lookbehind assertions is, for each alternative, to\ntemporarily move the current position back by the fixed length and then try to\nmatch. If there are insufficient characters before the current position, the\nassertion fails.\n.P\nIn a UTF mode, PCRE does not allow the \\eC escape (which matches a single data\nunit even in a UTF mode) to appear in lookbehind assertions, because it makes\nit impossible to calculate the length of the lookbehind. The \\eX and \\eR\nescapes, which can match different numbers of data units, are also not\npermitted.\n.P\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\n\"Subroutine\"\n.\\\"\ncalls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long\nas the subpattern matches a fixed-length string.\n.\\\" HTML <a href=\"#recursion\">\n.\\\" </a>\nRecursion,\n.\\\"\nhowever, is not supported.\n.P\nPossessive quantifiers can be used in conjunction with lookbehind assertions to\nspecify efficient matching of fixed-length strings at the end of subject\nstrings. Consider a simple pattern such as\n.sp\n  abcd$\n.sp\nwhen applied to a long string that does not match. Because matching proceeds\nfrom left to right, PCRE will look for each \"a\" in the subject and then see if\nwhat follows matches the rest of the pattern. If the pattern is specified as\n.sp\n  ^.*abcd$\n.sp\nthe initial .* matches the entire string at first, but when this fails (because\nthere is no following \"a\"), it backtracks to match all but the last character,\nthen all but the last two characters, and so on. Once again the search for \"a\"\ncovers the entire string, from right to left, so we are no better off. However,\nif the pattern is written as\n.sp\n  ^.*+(?<=abcd)\n.sp\nthere can be no backtracking for the .*+ item; it can match only the entire\nstring. The subsequent lookbehind assertion does a single test on the last four\ncharacters. If it fails, the match fails immediately. For long strings, this\napproach makes a significant difference to the processing time.\n.\n.\n.SS \"Using multiple assertions\"\n.rs\n.sp\nSeveral assertions (of any sort) may occur in succession. For example,\n.sp\n  (?<=\\ed{3})(?<!999)foo\n.sp\nmatches \"foo\" preceded by three digits that are not \"999\". Notice that each of\nthe assertions is applied independently at the same point in the subject\nstring. First there is a check that the previous three characters are all\ndigits, and then there is a check that the same three characters are not \"999\".\nThis pattern does \\fInot\\fP match \"foo\" preceded by six characters, the first\nof which are digits and the last three of which are not \"999\". For example, it\ndoesn't match \"123abcfoo\". A pattern to do that is\n.sp\n  (?<=\\ed{3}...)(?<!999)foo\n.sp\nThis time the first assertion looks at the preceding six characters, checking\nthat the first three are digits, and then the second assertion checks that the\npreceding three characters are not \"999\".\n.P\nAssertions can be nested in any combination. For example,\n.sp\n  (?<=(?<!foo)bar)baz\n.sp\nmatches an occurrence of \"baz\" that is preceded by \"bar\" which in turn is not\npreceded by \"foo\", while\n.sp\n  (?<=\\ed{3}(?!999)...)foo\n.sp\nis another pattern that matches \"foo\" preceded by three digits and any three\ncharacters that are not \"999\".\n.\n.\n.\\\" HTML <a name=\"conditions\"></a>\n.SH \"CONDITIONAL SUBPATTERNS\"\n.rs\n.sp\nIt is possible to cause the matching process to obey a subpattern\nconditionally or to choose between two alternative subpatterns, depending on\nthe result of an assertion, or whether a specific capturing subpattern has\nalready been matched. The two possible forms of conditional subpattern are:\n.sp\n  (?(condition)yes-pattern)\n  (?(condition)yes-pattern|no-pattern)\n.sp\nIf the condition is satisfied, the yes-pattern is used; otherwise the\nno-pattern (if present) is used. If there are more than two alternatives in the\nsubpattern, a compile-time error occurs. Each of the two alternatives may\nitself contain nested subpatterns of any form, including conditional\nsubpatterns; the restriction to two alternatives applies only at the level of\nthe condition. This pattern fragment is an example where the alternatives are\ncomplex:\n.sp\n  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )\n.sp\n.P\nThere are four kinds of condition: references to subpatterns, references to\nrecursion, a pseudo-condition called DEFINE, and assertions.\n.\n.SS \"Checking for a used subpattern by number\"\n.rs\n.sp\nIf the text between the parentheses consists of a sequence of digits, the\ncondition is true if a capturing subpattern of that number has previously\nmatched. If there is more than one capturing subpattern with the same number\n(see the earlier\n.\\\"\n.\\\" HTML <a href=\"#recursion\">\n.\\\" </a>\nsection about duplicate subpattern numbers),\n.\\\"\nthe condition is true if any of them have matched. An alternative notation is\nto precede the digits with a plus or minus sign. In this case, the subpattern\nnumber is relative rather than absolute. The most recently opened parentheses\ncan be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside\nloops it can also make sense to refer to subsequent groups. The next\nparentheses to be opened can be referenced as (?(+1), and so on. (The value\nzero in any of these forms is not used; it provokes a compile-time error.)\n.P\nConsider the following pattern, which contains non-significant white space to\nmake it more readable (assume the PCRE_EXTENDED option) and to divide it into\nthree parts for ease of discussion:\n.sp\n  ( \\e( )?    [^()]+    (?(1) \\e) )\n.sp\nThe first part matches an optional opening parenthesis, and if that\ncharacter is present, sets it as the first captured substring. The second part\nmatches one or more characters that are not parentheses. The third part is a\nconditional subpattern that tests whether or not the first set of parentheses\nmatched. If they did, that is, if subject started with an opening parenthesis,\nthe condition is true, and so the yes-pattern is executed and a closing\nparenthesis is required. Otherwise, since no-pattern is not present, the\nsubpattern matches nothing. In other words, this pattern matches a sequence of\nnon-parentheses, optionally enclosed in parentheses.\n.P\nIf you were embedding this pattern in a larger one, you could use a relative\nreference:\n.sp\n  ...other stuff... ( \\e( )?    [^()]+    (?(-1) \\e) ) ...\n.sp\nThis makes the fragment independent of the parentheses in the larger pattern.\n.\n.SS \"Checking for a used subpattern by name\"\n.rs\n.sp\nPerl uses the syntax (?(<name>)...) or (?('name')...) to test for a used\nsubpattern by name. For compatibility with earlier versions of PCRE, which had\nthis facility before Perl, the syntax (?(name)...) is also recognized.\n.P\nRewriting the above example to use a named subpattern gives this:\n.sp\n  (?<OPEN> \\e( )?    [^()]+    (?(<OPEN>) \\e) )\n.sp\nIf the name used in a condition of this kind is a duplicate, the test is\napplied to all subpatterns of the same name, and is true if any one of them has\nmatched.\n.\n.SS \"Checking for pattern recursion\"\n.rs\n.sp\nIf the condition is the string (R), and there is no subpattern with the name R,\nthe condition is true if a recursive call to the whole pattern or any\nsubpattern has been made. If digits or a name preceded by ampersand follow the\nletter R, for example:\n.sp\n  (?(R3)...) or (?(R&name)...)\n.sp\nthe condition is true if the most recent recursion is into a subpattern whose\nnumber or name is given. This condition does not check the entire recursion\nstack. If the name used in a condition of this kind is a duplicate, the test is\napplied to all subpatterns of the same name, and is true if any one of them is\nthe most recent recursion.\n.P\nAt \"top level\", all these recursion test conditions are false.\n.\\\" HTML <a href=\"#recursion\">\n.\\\" </a>\nThe syntax for recursive patterns\n.\\\"\nis described below.\n.\n.\\\" HTML <a name=\"subdefine\"></a>\n.SS \"Defining subpatterns for use by reference only\"\n.rs\n.sp\nIf the condition is the string (DEFINE), and there is no subpattern with the\nname DEFINE, the condition is always false. In this case, there may be only one\nalternative in the subpattern. It is always skipped if control reaches this\npoint in the pattern; the idea of DEFINE is that it can be used to define\nsubroutines that can be referenced from elsewhere. (The use of\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nsubroutines\n.\\\"\nis described below.) For example, a pattern to match an IPv4 address such as\n\"192.168.23.245\" could be written like this (ignore white space and line\nbreaks):\n.sp\n  (?(DEFINE) (?<byte> 2[0-4]\\ed | 25[0-5] | 1\\ed\\ed | [1-9]?\\ed) )\n  \\eb (?&byte) (\\e.(?&byte)){3} \\eb\n.sp\nThe first part of the pattern is a DEFINE group inside which a another group\nnamed \"byte\" is defined. This matches an individual component of an IPv4\naddress (a number less than 256). When matching takes place, this part of the\npattern is skipped because DEFINE acts like a false condition. The rest of the\npattern uses references to the named group to match the four dot-separated\ncomponents of an IPv4 address, insisting on a word boundary at each end.\n.\n.SS \"Assertion conditions\"\n.rs\n.sp\nIf the condition is not in any of the above formats, it must be an assertion.\nThis may be a positive or negative lookahead or lookbehind assertion. Consider\nthis pattern, again containing non-significant white space, and with the two\nalternatives on the second line:\n.sp\n  (?(?=[^a-z]*[a-z])\n  \\ed{2}-[a-z]{3}-\\ed{2}  |  \\ed{2}-\\ed{2}-\\ed{2} )\n.sp\nThe condition is a positive lookahead assertion that matches an optional\nsequence of non-letters followed by a letter. In other words, it tests for the\npresence of at least one letter in the subject. If a letter is found, the\nsubject is matched against the first alternative; otherwise it is matched\nagainst the second. This pattern matches strings in one of the two forms\ndd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\n.\n.\n.\\\" HTML <a name=\"comments\"></a>\n.SH COMMENTS\n.rs\n.sp\nThere are two ways of including comments in patterns that are processed by\nPCRE. In both cases, the start of the comment must not be in a character class,\nnor in the middle of any other sequence of related characters such as (?: or a\nsubpattern name or number. The characters that make up a comment play no part\nin the pattern matching.\n.P\nThe sequence (?# marks the start of a comment that continues up to the next\nclosing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED\noption is set, an unescaped # character also introduces a comment, which in\nthis case continues to immediately after the next newline character or\ncharacter sequence in the pattern. Which characters are interpreted as newlines\nis controlled by the options passed to a compiling function or by a special\nsequence at the start of the pattern, as described in the section entitled\n.\\\" HTML <a href=\"#newlines\">\n.\\\" </a>\n\"Newline conventions\"\n.\\\"\nabove. Note that the end of this type of comment is a literal newline sequence\nin the pattern; escape sequences that happen to represent a newline do not\ncount. For example, consider this pattern when PCRE_EXTENDED is set, and the\ndefault newline convention is in force:\n.sp\n  abc #comment \\en still comment\n.sp\nOn encountering the # character, \\fBpcre_compile()\\fP skips along, looking for\na newline in the pattern. The sequence \\en is still literal at this stage, so\nit does not terminate the comment. Only an actual character with the code value\n0x0a (the default newline) does so.\n.\n.\n.\\\" HTML <a name=\"recursion\"></a>\n.SH \"RECURSIVE PATTERNS\"\n.rs\n.sp\nConsider the problem of matching a string in parentheses, allowing for\nunlimited nested parentheses. Without the use of recursion, the best that can\nbe done is to use a pattern that matches up to some fixed depth of nesting. It\nis not possible to handle an arbitrary nesting depth.\n.P\nFor some time, Perl has provided a facility that allows regular expressions to\nrecurse (amongst other things). It does this by interpolating Perl code in the\nexpression at run time, and the code can refer to the expression itself. A Perl\npattern using code interpolation to solve the parentheses problem can be\ncreated like this:\n.sp\n  $re = qr{\\e( (?: (?>[^()]+) | (?p{$re}) )* \\e)}x;\n.sp\nThe (?p{...}) item interpolates Perl code at run time, and in this case refers\nrecursively to the pattern in which it appears.\n.P\nObviously, PCRE cannot support the interpolation of Perl code. Instead, it\nsupports special syntax for recursion of the entire pattern, and also for\nindividual subpattern recursion. After its introduction in PCRE and Python,\nthis kind of recursion was subsequently introduced into Perl at release 5.10.\n.P\nA special item that consists of (? followed by a number greater than zero and a\nclosing parenthesis is a recursive subroutine call of the subpattern of the\ngiven number, provided that it occurs inside that subpattern. (If not, it is a\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nnon-recursive subroutine\n.\\\"\ncall, which is described in the next section.) The special item (?R) or (?0) is\na recursive call of the entire regular expression.\n.P\nThis PCRE pattern solves the nested parentheses problem (assume the\nPCRE_EXTENDED option is set so that white space is ignored):\n.sp\n  \\e( ( [^()]++ | (?R) )* \\e)\n.sp\nFirst it matches an opening parenthesis. Then it matches any number of\nsubstrings which can either be a sequence of non-parentheses, or a recursive\nmatch of the pattern itself (that is, a correctly parenthesized substring).\nFinally there is a closing parenthesis. Note the use of a possessive quantifier\nto avoid backtracking into sequences of non-parentheses.\n.P\nIf this were part of a larger pattern, you would not want to recurse the entire\npattern, so instead you could use this:\n.sp\n  ( \\e( ( [^()]++ | (?1) )* \\e) )\n.sp\nWe have put the pattern into parentheses, and caused the recursion to refer to\nthem instead of the whole pattern.\n.P\nIn a larger pattern, keeping track of parenthesis numbers can be tricky. This\nis made easier by the use of relative references. Instead of (?1) in the\npattern above you can write (?-2) to refer to the second most recently opened\nparentheses preceding the recursion. In other words, a negative number counts\ncapturing parentheses leftwards from the point at which it is encountered.\n.P\nIt is also possible to refer to subsequently opened parentheses, by writing\nreferences such as (?+2). However, these cannot be recursive because the\nreference is not inside the parentheses that are referenced. They are always\n.\\\" HTML <a href=\"#subpatternsassubroutines\">\n.\\\" </a>\nnon-recursive subroutine\n.\\\"\ncalls, as described in the next section.\n.P\nAn alternative approach is to use named parentheses instead. The Perl syntax\nfor this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We\ncould rewrite the above example as follows:\n.sp\n  (?<pn> \\e( ( [^()]++ | (?&pn) )* \\e) )\n.sp\nIf there is more than one subpattern with the same name, the earliest one is\nused.\n.P\nThis particular example pattern that we have been looking at contains nested\nunlimited repeats, and so the use of a possessive quantifier for matching\nstrings of non-parentheses is important when applying the pattern to strings\nthat do not match. For example, when this pattern is applied to\n.sp\n  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n.sp\nit yields \"no match\" quickly. However, if a possessive quantifier is not used,\nthe match runs for a very long time indeed because there are so many different\nways the + and * repeats can carve up the subject, and all have to be tested\nbefore failure can be reported.\n.P\nAt the end of a match, the values of capturing parentheses are those from\nthe outermost level. If you want to obtain intermediate values, a callout\nfunction can be used (see below and the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation). If the pattern above is matched against\n.sp\n  (ab(cd)ef)\n.sp\nthe value for the inner capturing parentheses (numbered 2) is \"ef\", which is\nthe last value taken on at the top level. If a capturing subpattern is not\nmatched at the top level, its final captured value is unset, even if it was\n(temporarily) set at a deeper level during the matching process.\n.P\nIf there are more than 15 capturing parentheses in a pattern, PCRE has to\nobtain extra memory to store data during a recursion, which it does by using\n\\fBpcre_malloc\\fP, freeing it via \\fBpcre_free\\fP afterwards. If no memory can\nbe obtained, the match fails with the PCRE_ERROR_NOMEMORY error.\n.P\nDo not confuse the (?R) item with the condition (R), which tests for recursion.\nConsider this pattern, which matches text in angle brackets, allowing for\narbitrary nesting. Only digits are allowed in nested brackets (that is, when\nrecursing), whereas any characters are permitted at the outer level.\n.sp\n  < (?: (?(R) \\ed++  | [^<>]*+) | (?R)) * >\n.sp\nIn this pattern, (?(R) is the start of a conditional subpattern, with two\ndifferent alternatives for the recursive and non-recursive cases. The (?R) item\nis the actual recursive call.\n.\n.\n.\\\" HTML <a name=\"recursiondifference\"></a>\n.SS \"Differences in recursion processing between PCRE and Perl\"\n.rs\n.sp\nRecursion processing in PCRE differs from Perl in two important ways. In PCRE\n(like Python, but unlike Perl), a recursive subpattern call is always treated\nas an atomic group. That is, once it has matched some of the subject string, it\nis never re-entered, even if it contains untried alternatives and there is a\nsubsequent matching failure. This can be illustrated by the following pattern,\nwhich purports to match a palindromic string that contains an odd number of\ncharacters (for example, \"a\", \"aba\", \"abcba\", \"abcdcba\"):\n.sp\n  ^(.|(.)(?1)\\e2)$\n.sp\nThe idea is that it either matches a single character, or two identical\ncharacters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE\nit does not if the pattern is longer than three characters. Consider the\nsubject string \"abcba\":\n.P\nAt the top level, the first character is matched, but as it is not at the end\nof the string, the first alternative fails; the second alternative is taken\nand the recursion kicks in. The recursive call to subpattern 1 successfully\nmatches the next character (\"b\"). (Note that the beginning and end of line\ntests are not part of the recursion).\n.P\nBack at the top level, the next character (\"c\") is compared with what\nsubpattern 2 matched, which was \"a\". This fails. Because the recursion is\ntreated as an atomic group, there are now no backtracking points, and so the\nentire match fails. (Perl is able, at this point, to re-enter the recursion and\ntry the second alternative.) However, if the pattern is written with the\nalternatives in the other order, things are different:\n.sp\n  ^((.)(?1)\\e2|.)$\n.sp\nThis time, the recursing alternative is tried first, and continues to recurse\nuntil it runs out of characters, at which point the recursion fails. But this\ntime we do have another alternative to try at the higher level. That is the big\ndifference: in the previous case the remaining alternative is at a deeper\nrecursion level, which PCRE cannot use.\n.P\nTo change the pattern so that it matches all palindromic strings, not just\nthose with an odd number of characters, it is tempting to change the pattern to\nthis:\n.sp\n  ^((.)(?1)\\e2|.?)$\n.sp\nAgain, this works in Perl, but not in PCRE, and for the same reason. When a\ndeeper recursion has matched a single character, it cannot be entered again in\norder to match an empty string. The solution is to separate the two cases, and\nwrite out the odd and even cases as alternatives at the higher level:\n.sp\n  ^(?:((.)(?1)\\e2|)|((.)(?3)\\e4|.))\n.sp\nIf you want to match typical palindromic phrases, the pattern has to ignore all\nnon-word characters, which can be done like this:\n.sp\n  ^\\eW*+(?:((.)\\eW*+(?1)\\eW*+\\e2|)|((.)\\eW*+(?3)\\eW*+\\e4|\\eW*+.\\eW*+))\\eW*+$\n.sp\nIf run with the PCRE_CASELESS option, this pattern matches phrases such as \"A\nman, a plan, a canal: Panama!\" and it works well in both PCRE and Perl. Note\nthe use of the possessive quantifier *+ to avoid backtracking into sequences of\nnon-word characters. Without this, PCRE takes a great deal longer (ten times or\nmore) to match typical phrases, and Perl takes so long that you think it has\ngone into a loop.\n.P\n\\fBWARNING\\fP: The palindrome-matching patterns above work only if the subject\nstring does not start with a palindrome that is shorter than the entire string.\nFor example, although \"abcba\" is correctly matched, if the subject is \"ababa\",\nPCRE finds the palindrome \"aba\" at the start, then fails at top level because\nthe end of the string does not follow. Once again, it cannot jump back into the\nrecursion to try other alternatives, so the entire match fails.\n.P\nThe second way in which PCRE and Perl differ in their recursion processing is\nin the handling of captured values. In Perl, when a subpattern is called\nrecursively or as a subpattern (see the next section), it has no access to any\nvalues that were captured outside the recursion, whereas in PCRE these values\ncan be referenced. Consider this pattern:\n.sp\n  ^(.)(\\e1|a(?2))\n.sp\nIn PCRE, this pattern matches \"bab\". The first capturing parentheses match \"b\",\nthen in the second group, when the back reference \\e1 fails to match \"b\", the\nsecond alternative matches \"a\" and then recurses. In the recursion, \\e1 does\nnow match \"b\" and so the whole match succeeds. In Perl, the pattern fails to\nmatch because inside the recursive call \\e1 cannot access the externally set\nvalue.\n.\n.\n.\\\" HTML <a name=\"subpatternsassubroutines\"></a>\n.SH \"SUBPATTERNS AS SUBROUTINES\"\n.rs\n.sp\nIf the syntax for a recursive subpattern call (either by number or by\nname) is used outside the parentheses to which it refers, it operates like a\nsubroutine in a programming language. The called subpattern may be defined\nbefore or after the reference. A numbered reference can be absolute or\nrelative, as in these examples:\n.sp\n  (...(absolute)...)...(?2)...\n  (...(relative)...)...(?-1)...\n  (...(?+1)...(relative)...\n.sp\nAn earlier example pointed out that the pattern\n.sp\n  (sens|respons)e and \\e1ibility\n.sp\nmatches \"sense and sensibility\" and \"response and responsibility\", but not\n\"sense and responsibility\". If instead the pattern\n.sp\n  (sens|respons)e and (?1)ibility\n.sp\nis used, it does match \"sense and responsibility\" as well as the other two\nstrings. Another example is given in the discussion of DEFINE above.\n.P\nAll subroutine calls, whether recursive or not, are always treated as atomic\ngroups. That is, once a subroutine has matched some of the subject string, it\nis never re-entered, even if it contains untried alternatives and there is a\nsubsequent matching failure. Any capturing parentheses that are set during the\nsubroutine call revert to their previous values afterwards.\n.P\nProcessing options such as case-independence are fixed when a subpattern is\ndefined, so if it is used as a subroutine, such options cannot be changed for\ndifferent calls. For example, consider this pattern:\n.sp\n  (abc)(?i:(?-1))\n.sp\nIt matches \"abcabc\". It does not match \"abcABC\" because the change of\nprocessing option does not affect the called subpattern.\n.\n.\n.\\\" HTML <a name=\"onigurumasubroutines\"></a>\n.SH \"ONIGURUMA SUBROUTINE SYNTAX\"\n.rs\n.sp\nFor compatibility with Oniguruma, the non-Perl syntax \\eg followed by a name or\na number enclosed either in angle brackets or single quotes, is an alternative\nsyntax for referencing a subpattern as a subroutine, possibly recursively. Here\nare two of the examples used above, rewritten using this syntax:\n.sp\n  (?<pn> \\e( ( (?>[^()]+) | \\eg<pn> )* \\e) )\n  (sens|respons)e and \\eg'1'ibility\n.sp\nPCRE supports an extension to Oniguruma: if a number is preceded by a\nplus or a minus sign it is taken as a relative reference. For example:\n.sp\n  (abc)(?i:\\eg<-1>)\n.sp\nNote that \\eg{...} (Perl syntax) and \\eg<...> (Oniguruma syntax) are \\fInot\\fP\nsynonymous. The former is a back reference; the latter is a subroutine call.\n.\n.\n.SH CALLOUTS\n.rs\n.sp\nPerl has a feature whereby using the sequence (?{...}) causes arbitrary Perl\ncode to be obeyed in the middle of matching a regular expression. This makes it\npossible, amongst other things, to extract different substrings that match the\nsame pair of parentheses when there is a repetition.\n.P\nPCRE provides a similar feature, but of course it cannot obey arbitrary Perl\ncode. The feature is called \"callout\". The caller of PCRE provides an external\nfunction by putting its entry point in the global variable \\fIpcre_callout\\fP\n(8-bit library) or \\fIpcre[16|32]_callout\\fP (16-bit or 32-bit library).\nBy default, this variable contains NULL, which disables all calling out.\n.P\nWithin a regular expression, (?C) indicates the points at which the external\nfunction is to be called. If you want to identify different callout points, you\ncan put a number less than 256 after the letter C. The default value is zero.\nFor example, this pattern has two callout points:\n.sp\n  (?C1)abc(?C2)def\n.sp\nIf the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are\nautomatically installed before each item in the pattern. They are all numbered\n255. If there is a conditional group in the pattern whose condition is an\nassertion, an additional callout is inserted just before the condition. An\nexplicit callout may also be set at this position, as in this example:\n.sp\n  (?(?C9)(?=a)abc|def)\n.sp\nNote that this applies only to assertion conditions, not to other types of\ncondition.\n.P\nDuring matching, when PCRE reaches a callout point, the external function is\ncalled. It is provided with the number of the callout, the position in the\npattern, and, optionally, one item of data originally supplied by the caller of\nthe matching function. The callout function may cause matching to proceed, to\nbacktrack, or to fail altogether.\n.P\nBy default, PCRE implements a number of optimizations at compile time and\nmatching time, and one side-effect is that sometimes callouts are skipped. If\nyou need all possible callouts to happen, you need to set options that disable\nthe relevant optimizations. More details, and a complete description of the\ninterface to the callout function, are given in the\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.\n.\n.\\\" HTML <a name=\"backtrackcontrol\"></a>\n.SH \"BACKTRACKING CONTROL\"\n.rs\n.sp\nPerl 5.10 introduced a number of \"Special Backtracking Control Verbs\", which\nare still described in the Perl documentation as \"experimental and subject to\nchange or removal in a future version of Perl\". It goes on to say: \"Their usage\nin production code should be noted to avoid problems during upgrades.\" The same\nremarks apply to the PCRE features described in this section.\n.P\nThe new verbs make use of what was previously invalid syntax: an opening\nparenthesis followed by an asterisk. They are generally of the form\n(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving\ndifferently depending on whether or not a name is present. A name is any\nsequence of characters that does not include a closing parenthesis. The maximum\nlength of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit\nlibraries. If the name is empty, that is, if the closing parenthesis\nimmediately follows the colon, the effect is as if the colon were not there.\nAny number of these verbs may occur in a pattern.\n.P\nSince these verbs are specifically related to backtracking, most of them can be\nused only when the pattern is to be matched using one of the traditional\nmatching functions, because these use a backtracking algorithm. With the\nexception of (*FAIL), which behaves like a failing negative assertion, the\nbacktracking control verbs cause an error if encountered by a DFA matching\nfunction.\n.P\nThe behaviour of these verbs in\n.\\\" HTML <a href=\"#btrepeat\">\n.\\\" </a>\nrepeated groups,\n.\\\"\n.\\\" HTML <a href=\"#btassert\">\n.\\\" </a>\nassertions,\n.\\\"\nand in\n.\\\" HTML <a href=\"#btsub\">\n.\\\" </a>\nsubpatterns called as subroutines\n.\\\"\n(whether or not recursively) is documented below.\n.\n.\n.\\\" HTML <a name=\"nooptimize\"></a>\n.SS \"Optimizations that affect backtracking verbs\"\n.rs\n.sp\nPCRE contains some optimizations that are used to speed up matching by running\nsome checks at the start of each match attempt. For example, it may know the\nminimum length of matching subject, or that a particular character must be\npresent. When one of these optimizations bypasses the running of a match, any\nincluded backtracking verbs will not, of course, be processed. You can suppress\nthe start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option\nwhen calling \\fBpcre_compile()\\fP or \\fBpcre_exec()\\fP, or by starting the\npattern with (*NO_START_OPT). There is more discussion of this option in the\nsection entitled\n.\\\" HTML <a href=\"pcreapi.html#execoptions\">\n.\\\" </a>\n\"Option bits for \\fBpcre_exec()\\fP\"\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.P\nExperiments with Perl suggest that it too has similar optimizations, sometimes\nleading to anomalous results.\n.\n.\n.SS \"Verbs that act immediately\"\n.rs\n.sp\nThe following verbs act as soon as they are encountered. They may not be\nfollowed by a name.\n.sp\n   (*ACCEPT)\n.sp\nThis verb causes the match to end successfully, skipping the remainder of the\npattern. However, when it is inside a subpattern that is called as a\nsubroutine, only that subpattern is ended successfully. Matching then continues\nat the outer level. If (*ACCEPT) in triggered in a positive assertion, the\nassertion succeeds; in a negative assertion, the assertion fails.\n.P\nIf (*ACCEPT) is inside capturing parentheses, the data so far is captured. For\nexample:\n.sp\n  A((?:A|B(*ACCEPT)|C)D)\n.sp\nThis matches \"AB\", \"AAD\", or \"ACD\"; when it matches \"AB\", \"B\" is captured by\nthe outer parentheses.\n.sp\n  (*FAIL) or (*F)\n.sp\nThis verb causes a matching failure, forcing backtracking to occur. It is\nequivalent to (?!) but easier to read. The Perl documentation notes that it is\nprobably useful only when combined with (?{}) or (??{}). Those are, of course,\nPerl features that are not present in PCRE. The nearest equivalent is the\ncallout feature, as for example in this pattern:\n.sp\n  a+(?C)(*FAIL)\n.sp\nA match with the string \"aaaa\" always fails, but the callout is taken before\neach backtrack happens (in this example, 10 times).\n.\n.\n.SS \"Recording which path was taken\"\n.rs\n.sp\nThere is one verb whose main purpose is to track how a match was arrived at,\nthough it also has a secondary use in conjunction with advancing the match\nstarting point (see (*SKIP) below).\n.sp\n  (*MARK:NAME) or (*:NAME)\n.sp\nA name is always required with this verb. There may be as many instances of\n(*MARK) as you like in a pattern, and their names do not have to be unique.\n.P\nWhen a match succeeds, the name of the last-encountered (*MARK:NAME),\n(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the\ncaller as described in the section entitled\n.\\\" HTML <a href=\"pcreapi.html#extradata\">\n.\\\" </a>\n\"Extra data for \\fBpcre_exec()\\fP\"\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation. Here is an example of \\fBpcretest\\fP output, where the /K\nmodifier requests the retrieval and outputting of (*MARK) data:\n.sp\n    re> /X(*MARK:A)Y|X(*MARK:B)Z/K\n  data> XY\n   0: XY\n  MK: A\n  XZ\n   0: XZ\n  MK: B\n.sp\nThe (*MARK) name is tagged with \"MK:\" in this output, and in this example it\nindicates which of the two alternatives matched. This is a more efficient way\nof obtaining this information than putting each alternative in its own\ncapturing parentheses.\n.P\nIf a verb with a name is encountered in a positive assertion that is true, the\nname is recorded and passed back if it is the last-encountered. This does not\nhappen for negative assertions or failing positive assertions.\n.P\nAfter a partial match or a failed match, the last encountered name in the\nentire match process is returned. For example:\n.sp\n    re> /X(*MARK:A)Y|X(*MARK:B)Z/K\n  data> XP\n  No match, mark = B\n.sp\nNote that in this unanchored example the mark is retained from the match\nattempt that started at the letter \"X\" in the subject. Subsequent match\nattempts starting at \"P\" and then with an empty string do not get as far as the\n(*MARK) item, but nevertheless do not reset it.\n.P\nIf you are interested in (*MARK) values after failed matches, you should\nprobably set the PCRE_NO_START_OPTIMIZE option\n.\\\" HTML <a href=\"#nooptimize\">\n.\\\" </a>\n(see above)\n.\\\"\nto ensure that the match is always attempted.\n.\n.\n.SS \"Verbs that act after backtracking\"\n.rs\n.sp\nThe following verbs do nothing when they are encountered. Matching continues\nwith what follows, but if there is no subsequent match, causing a backtrack to\nthe verb, a failure is forced. That is, backtracking cannot pass to the left of\nthe verb. However, when one of these verbs appears inside an atomic group or an\nassertion that is true, its effect is confined to that group, because once the\ngroup has been matched, there is never any backtracking into it. In this\nsituation, backtracking can \"jump back\" to the left of the entire atomic group\nor assertion. (Remember also, as stated above, that this localization also\napplies in subroutine calls.)\n.P\nThese verbs differ in exactly what kind of failure occurs when backtracking\nreaches them. The behaviour described below is what happens when the verb is\nnot in a subroutine or an assertion. Subsequent sections cover these special\ncases.\n.sp\n  (*COMMIT)\n.sp\nThis verb, which may not be followed by a name, causes the whole match to fail\noutright if there is a later matching failure that causes backtracking to reach\nit. Even if the pattern is unanchored, no further attempts to find a match by\nadvancing the starting point take place. If (*COMMIT) is the only backtracking\nverb that is encountered, once it has been passed \\fBpcre_exec()\\fP is\ncommitted to finding a match at the current starting point, or not at all. For\nexample:\n.sp\n  a+(*COMMIT)b\n.sp\nThis matches \"xxaab\" but not \"aacaab\". It can be thought of as a kind of\ndynamic anchor, or \"I've started, so I must finish.\" The name of the most\nrecently passed (*MARK) in the path is passed back when (*COMMIT) forces a\nmatch failure.\n.P\nIf there is more than one backtracking verb in a pattern, a different one that\nfollows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a\nmatch does not always guarantee that a match must be at this starting point.\n.P\nNote that (*COMMIT) at the start of a pattern is not the same as an anchor,\nunless PCRE's start-of-match optimizations are turned off, as shown in this\noutput from \\fBpcretest\\fP:\n.sp\n    re> /(*COMMIT)abc/\n  data> xyzabc\n   0: abc\n  data> xyzabc\\eY\n  No match\n.sp\nFor this pattern, PCRE knows that any match must start with \"a\", so the\noptimization skips along the subject to \"a\" before applying the pattern to the\nfirst set of data. The match attempt then succeeds. In the second set of data,\nthe escape sequence \\eY is interpreted by the \\fBpcretest\\fP program. It causes\nthe PCRE_NO_START_OPTIMIZE option to be set when \\fBpcre_exec()\\fP is called.\nThis disables the optimization that skips along to the first character. The\npattern is now applied starting at \"x\", and so the (*COMMIT) causes the match\nto fail without trying any other starting points.\n.sp\n  (*PRUNE) or (*PRUNE:NAME)\n.sp\nThis verb causes the match to fail at the current starting position in the\nsubject if there is a later matching failure that causes backtracking to reach\nit. If the pattern is unanchored, the normal \"bumpalong\" advance to the next\nstarting character then happens. Backtracking can occur as usual to the left of\n(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but\nif there is no match to the right, backtracking cannot cross (*PRUNE). In\nsimple cases, the use of (*PRUNE) is just an alternative to an atomic group or\npossessive quantifier, but there are some uses of (*PRUNE) that cannot be\nexpressed in any other way. In an anchored pattern (*PRUNE) has the same effect\nas (*COMMIT).\n.P\nThe behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE).\nIt is like (*MARK:NAME) in that the name is remembered for passing back to the\ncaller. However, (*SKIP:NAME) searches only for names set with (*MARK).\n.sp\n  (*SKIP)\n.sp\nThis verb, when given without a name, is like (*PRUNE), except that if the\npattern is unanchored, the \"bumpalong\" advance is not to the next character,\nbut to the position in the subject where (*SKIP) was encountered. (*SKIP)\nsignifies that whatever text was matched leading up to it cannot be part of a\nsuccessful match. Consider:\n.sp\n  a+(*SKIP)b\n.sp\nIf the subject is \"aaaac...\", after the first match attempt fails (starting at\nthe first character in the string), the starting point skips on to start the\nnext attempt at \"c\". Note that a possessive quantifer does not have the same\neffect as this example; although it would suppress backtracking during the\nfirst match attempt, the second attempt would start at the second character\ninstead of skipping on to \"c\".\n.sp\n  (*SKIP:NAME)\n.sp\nWhen (*SKIP) has an associated name, its behaviour is modified. When it is\ntriggered, the previous path through the pattern is searched for the most\nrecent (*MARK) that has the same name. If one is found, the \"bumpalong\" advance\nis to the subject position that corresponds to that (*MARK) instead of to where\n(*SKIP) was encountered. If no (*MARK) with a matching name is found, the\n(*SKIP) is ignored.\n.P\nNote that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores\nnames that are set by (*PRUNE:NAME) or (*THEN:NAME).\n.sp\n  (*THEN) or (*THEN:NAME)\n.sp\nThis verb causes a skip to the next innermost alternative when backtracking\nreaches it. That is, it cancels any further backtracking within the current\nalternative. Its name comes from the observation that it can be used for a\npattern-based if-then-else block:\n.sp\n  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...\n.sp\nIf the COND1 pattern matches, FOO is tried (and possibly further items after\nthe end of the group if FOO succeeds); on failure, the matcher skips to the\nsecond alternative and tries COND2, without backtracking into COND1. If that\nsucceeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no\nmore alternatives, so there is a backtrack to whatever came before the entire\ngroup. If (*THEN) is not inside an alternation, it acts like (*PRUNE).\n.P\nThe behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN).\nIt is like (*MARK:NAME) in that the name is remembered for passing back to the\ncaller. However, (*SKIP:NAME) searches only for names set with (*MARK).\n.P\nA subpattern that does not contain a | character is just a part of the\nenclosing alternative; it is not a nested alternation with only one\nalternative. The effect of (*THEN) extends beyond such a subpattern to the\nenclosing alternative. Consider this pattern, where A, B, etc. are complex\npattern fragments that do not contain any | characters at this level:\n.sp\n  A (B(*THEN)C) | D\n.sp\nIf A and B are matched, but there is a failure in C, matching does not\nbacktrack into A; instead it moves to the next alternative, that is, D.\nHowever, if the subpattern containing (*THEN) is given an alternative, it\nbehaves differently:\n.sp\n  A (B(*THEN)C | (*FAIL)) | D\n.sp\nThe effect of (*THEN) is now confined to the inner subpattern. After a failure\nin C, matching moves to (*FAIL), which causes the whole subpattern to fail\nbecause there are no more alternatives to try. In this case, matching does now\nbacktrack into A.\n.P\nNote that a conditional subpattern is not considered as having two\nalternatives, because only one is ever used. In other words, the | character in\na conditional subpattern has a different meaning. Ignoring white space,\nconsider:\n.sp\n  ^.*? (?(?=a) a | b(*THEN)c )\n.sp\nIf the subject is \"ba\", this pattern does not match. Because .*? is ungreedy,\nit initially matches zero characters. The condition (?=a) then fails, the\ncharacter \"b\" is matched, but \"c\" is not. At this point, matching does not\nbacktrack to .*? as might perhaps be expected from the presence of the |\ncharacter. The conditional subpattern is part of the single alternative that\ncomprises the whole pattern, and so the match fails. (If there was a backtrack\ninto .*?, allowing it to match \"b\", the match would succeed.)\n.P\nThe verbs just described provide four different \"strengths\" of control when\nsubsequent matching fails. (*THEN) is the weakest, carrying on the match at the\nnext alternative. (*PRUNE) comes next, failing the match at the current\nstarting position, but allowing an advance to the next character (for an\nunanchored pattern). (*SKIP) is similar, except that the advance may be more\nthan one character. (*COMMIT) is the strongest, causing the entire match to\nfail.\n.\n.\n.SS \"More than one backtracking verb\"\n.rs\n.sp\nIf more than one backtracking verb is present in a pattern, the one that is\nbacktracked onto first acts. For example, consider this pattern, where A, B,\netc. are complex pattern fragments:\n.sp\n  (A(*COMMIT)B(*THEN)C|ABD)\n.sp\nIf A matches but B fails, the backtrack to (*COMMIT) causes the entire match to\nfail. However, if A and B match, but C fails, the backtrack to (*THEN) causes\nthe next alternative (ABD) to be tried. This behaviour is consistent, but is\nnot always the same as Perl's. It means that if two or more backtracking verbs\nappear in succession, all the the last of them has no effect. Consider this\nexample:\n.sp\n  ...(*COMMIT)(*PRUNE)...\n.sp\nIf there is a matching failure to the right, backtracking onto (*PRUNE) causes\nit to be triggered, and its action is taken. There can never be a backtrack\nonto (*COMMIT).\n.\n.\n.\\\" HTML <a name=\"btrepeat\"></a>\n.SS \"Backtracking verbs in repeated groups\"\n.rs\n.sp\nPCRE differs from Perl in its handling of backtracking verbs in repeated\ngroups. For example, consider:\n.sp\n  /(a(*COMMIT)b)+ac/\n.sp\nIf the subject is \"abac\", Perl matches, but PCRE fails because the (*COMMIT) in\nthe second repeat of the group acts.\n.\n.\n.\\\" HTML <a name=\"btassert\"></a>\n.SS \"Backtracking verbs in assertions\"\n.rs\n.sp\n(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack.\n.P\n(*ACCEPT) in a positive assertion causes the assertion to succeed without any\nfurther processing. In a negative assertion, (*ACCEPT) causes the assertion to\nfail without any further processing.\n.P\nThe other backtracking verbs are not treated specially if they appear in a\npositive assertion. In particular, (*THEN) skips to the next alternative in the\ninnermost enclosing group that has alternations, whether or not this is within\nthe assertion.\n.P\nNegative assertions are, however, different, in order to ensure that changing a\npositive assertion into a negative assertion changes its result. Backtracking\ninto (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true,\nwithout considering any further alternative branches in the assertion.\nBacktracking into (*THEN) causes it to skip to the next enclosing alternative\nwithin the assertion (the normal behaviour), but if the assertion does not have\nsuch an alternative, (*THEN) behaves like (*PRUNE).\n.\n.\n.\\\" HTML <a name=\"btsub\"></a>\n.SS \"Backtracking verbs in subroutines\"\n.rs\n.sp\nThese behaviours occur whether or not the subpattern is called recursively.\nPerl's treatment of subroutines is different in some cases.\n.P\n(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces\nan immediate backtrack.\n.P\n(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to\nsucceed without any further processing. Matching then continues after the\nsubroutine call.\n.P\n(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause\nthe subroutine match to fail.\n.P\n(*THEN) skips to the next alternative in the innermost enclosing group within\nthe subpattern that has alternatives. If there is no such group within the\nsubpattern, (*THEN) causes the subroutine match to fail.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcreapi\\fP(3), \\fBpcrecallout\\fP(3), \\fBpcrematching\\fP(3),\n\\fBpcresyntax\\fP(3), \\fBpcre\\fP(3), \\fBpcre16(3)\\fP, \\fBpcre32(3)\\fP.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 23 October 2016\nCopyright (c) 1997-2016 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcreperform.3",
    "content": ".TH PCREPERFORM 3 \"09 January 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE PERFORMANCE\"\n.rs\n.sp\nTwo aspects of performance are discussed below: memory usage and processing\ntime. The way you express your pattern as a regular expression can affect both\nof them.\n.\n.SH \"COMPILED PATTERN MEMORY USAGE\"\n.rs\n.sp\nPatterns are compiled by PCRE into a reasonably efficient interpretive code, so\nthat most simple patterns do not use much memory. However, there is one case\nwhere the memory usage of a compiled pattern can be unexpectedly large. If a\nparenthesized subpattern has a quantifier with a minimum greater than 1 and/or\na limited maximum, the whole subpattern is repeated in the compiled code. For\nexample, the pattern\n.sp\n  (abc|def){2,4}\n.sp\nis compiled as if it were\n.sp\n  (abc|def)(abc|def)((abc|def)(abc|def)?)?\n.sp\n(Technical aside: It is done this way so that backtrack points within each of\nthe repetitions can be independently maintained.)\n.P\nFor regular expressions whose quantifiers use only small numbers, this is not\nusually a problem. However, if the numbers are large, and particularly if such\nrepetitions are nested, the memory usage can become an embarrassment. For\nexample, the very simple pattern\n.sp\n  ((ab){1,1000}c){1,3}\n.sp\nuses 51K bytes when compiled using the 8-bit library. When PCRE is compiled\nwith its default internal pointer size of two bytes, the size limit on a\ncompiled pattern is 64K data units, and this is reached with the above pattern\nif the outer repetition is increased from 3 to 4. PCRE can be compiled to use\nlarger internal pointers and thus handle larger compiled patterns, but it is\nbetter to try to rewrite your pattern to use less memory if you can.\n.P\nOne way of reducing the memory usage for such patterns is to make use of PCRE's\n.\\\" HTML <a href=\"pcrepattern.html#subpatternsassubroutines\">\n.\\\" </a>\n\"subroutine\"\n.\\\"\nfacility. Re-writing the above pattern as\n.sp\n  ((ab)(?2){0,999}c)(?1){0,2}\n.sp\nreduces the memory requirements to 18K, and indeed it remains under 20K even\nwith the outer repetition increased to 100. However, this pattern is not\nexactly equivalent, because the \"subroutine\" calls are treated as\n.\\\" HTML <a href=\"pcrepattern.html#atomicgroup\">\n.\\\" </a>\natomic groups\n.\\\"\ninto which there can be no backtracking if there is a subsequent matching\nfailure. Therefore, PCRE cannot do this kind of rewriting automatically.\nFurthermore, there is a noticeable loss of speed when executing the modified\npattern. Nevertheless, if the atomic grouping is not a problem and the loss of\nspeed is acceptable, this kind of rewriting will allow you to process patterns\nthat PCRE cannot otherwise handle.\n.\n.\n.SH \"STACK USAGE AT RUN TIME\"\n.rs\n.sp\nWhen \\fBpcre_exec()\\fP or \\fBpcre[16|32]_exec()\\fP is used for matching, certain\nkinds of pattern can cause it to use large amounts of the process stack. In\nsome environments the default process stack is quite small, and if it runs out\nthe result is often SIGSEGV. This issue is probably the most frequently raised\nproblem with PCRE. Rewriting your pattern can often help. The\n.\\\" HREF\n\\fBpcrestack\\fP\n.\\\"\ndocumentation discusses this issue in detail.\n.\n.\n.SH \"PROCESSING TIME\"\n.rs\n.sp\nCertain items in regular expression patterns are processed more efficiently\nthan others. It is more efficient to use a character class like [aeiou] than a\nset of single-character alternatives such as (a|e|i|o|u). In general, the\nsimplest construction that provides the required behaviour is usually the most\nefficient. Jeffrey Friedl's book contains a lot of useful general discussion\nabout optimizing regular expressions for efficient performance. This document\ncontains a few observations about PCRE.\n.P\nUsing Unicode character properties (the \\ep, \\eP, and \\eX escapes) is slow,\nbecause PCRE has to use a multi-stage table lookup whenever it needs a\ncharacter's property. If you can find an alternative pattern that does not use\ncharacter properties, it will probably be faster.\n.P\nBy default, the escape sequences \\eb, \\ed, \\es, and \\ew, and the POSIX\ncharacter classes such as [:alpha:] do not use Unicode properties, partly for\nbackwards compatibility, and partly for performance reasons. However, you can\nset PCRE_UCP if you want Unicode character properties to be used. This can\ndouble the matching time for items such as \\ed, when matched with\na traditional matching function; the performance loss is less with\na DFA matching function, and in both cases there is not much difference for\n\\eb.\n.P\nWhen a pattern begins with .* not in parentheses, or in parentheses that are\nnot the subject of a backreference, and the PCRE_DOTALL option is set, the\npattern is implicitly anchored by PCRE, since it can match only at the start of\na subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this\noptimization, because the . metacharacter does not then match a newline, and if\nthe subject string contains newlines, the pattern may match from the character\nimmediately following one of them instead of from the very start. For example,\nthe pattern\n.sp\n  .*second\n.sp\nmatches the subject \"first\\enand second\" (where \\en stands for a newline\ncharacter), with the match starting at the seventh character. In order to do\nthis, PCRE has to retry the match starting after every newline in the subject.\n.P\nIf you are using such a pattern with subject strings that do not contain\nnewlines, the best performance is obtained by setting PCRE_DOTALL, or starting\nthe pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE\nfrom having to scan along the subject looking for a newline to restart at.\n.P\nBeware of patterns that contain nested indefinite repeats. These can take a\nlong time to run when applied to a string that does not match. Consider the\npattern fragment\n.sp\n  ^(a+)*\n.sp\nThis can match \"aaaa\" in 16 different ways, and this number increases very\nrapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\ntimes, and for each of those cases other than 0 or 4, the + repeats can match\ndifferent numbers of times.) When the remainder of the pattern is such that the\nentire match is going to fail, PCRE has in principle to try every possible\nvariation, and this can take an extremely long time, even for relatively short\nstrings.\n.P\nAn optimization catches some of the more simple cases such as\n.sp\n  (a+)*b\n.sp\nwhere a literal character follows. Before embarking on the standard matching\nprocedure, PCRE checks that there is a \"b\" later in the subject string, and if\nthere is not, it fails the match immediately. However, when there is no\nfollowing literal this optimization cannot be used. You can see the difference\nby comparing the behaviour of\n.sp\n  (a+)*\\ed\n.sp\nwith the pattern above. The former gives a failure almost instantly when\napplied to a whole line of \"a\" characters, whereas the latter takes an\nappreciable time with strings longer than about 20 characters.\n.P\nIn many cases, the solution to this kind of performance issue is to use an\natomic group or a possessive quantifier.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 25 August 2012\nCopyright (c) 1997-2012 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcreposix.3",
    "content": ".TH PCREPOSIX 3 \"09 January 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions.\n.SH \"SYNOPSIS\"\n.rs\n.sp\n.B #include <pcreposix.h>\n.PP\n.nf\n.B int regcomp(regex_t *\\fIpreg\\fP, const char *\\fIpattern\\fP,\n.B \"     int \\fIcflags\\fP);\"\n.sp\n.B int regexec(regex_t *\\fIpreg\\fP, const char *\\fIstring\\fP,\n.B \"     size_t \\fInmatch\\fP, regmatch_t \\fIpmatch\\fP[], int \\fIeflags\\fP);\"\n.B \"     size_t regerror(int \\fIerrcode\\fP, const regex_t *\\fIpreg\\fP,\"\n.B \"     char *\\fIerrbuf\\fP, size_t \\fIerrbuf_size\\fP);\"\n.sp\n.B void regfree(regex_t *\\fIpreg\\fP);\n.fi\n.\n.SH DESCRIPTION\n.rs\n.sp\nThis set of functions provides a POSIX-style API for the PCRE regular\nexpression 8-bit library. See the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation for a description of PCRE's native API, which contains much\nadditional functionality. There is no POSIX-style wrapper for PCRE's 16-bit\nand 32-bit library.\n.P\nThe functions described here are just wrapper functions that ultimately call\nthe PCRE native API. Their prototypes are defined in the \\fBpcreposix.h\\fP\nheader file, and on Unix systems the library itself is called\n\\fBpcreposix.a\\fP, so can be accessed by adding \\fB-lpcreposix\\fP to the\ncommand for linking an application that uses them. Because the POSIX functions\ncall the native ones, it is also necessary to add \\fB-lpcre\\fP.\n.P\nI have implemented only those POSIX option bits that can be reasonably mapped\nto PCRE native options. In addition, the option REG_EXTENDED is defined with\nthe value zero. This has no effect, but since programs that are written to the\nPOSIX interface often use it, this makes it easier to slot in PCRE as a\nreplacement library. Other POSIX options are not even defined.\n.P\nThere are also some other options that are not defined by POSIX. These have\nbeen added at the request of users who want to make use of certain\nPCRE-specific features via the POSIX calling interface.\n.P\nWhen PCRE is called via these functions, it is only the API that is POSIX-like\nin style. The syntax and semantics of the regular expressions themselves are\nstill those of Perl, subject to the setting of various PCRE options, as\ndescribed below. \"POSIX-like in style\" means that the API approximates to the\nPOSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding\ndomains it is probably even less compatible.\n.P\nThe header for these functions is supplied as \\fBpcreposix.h\\fP to avoid any\npotential clash with other POSIX libraries. It can, of course, be renamed or\naliased as \\fBregex.h\\fP, which is the \"correct\" name. It provides two\nstructure types, \\fIregex_t\\fP for compiled internal forms, and\n\\fIregmatch_t\\fP for returning captured substrings. It also defines some\nconstants whose names start with \"REG_\"; these are used for setting options and\nidentifying error codes.\n.\n.\n.SH \"COMPILING A PATTERN\"\n.rs\n.sp\nThe function \\fBregcomp()\\fP is called to compile a pattern into an\ninternal form. The pattern is a C string terminated by a binary zero, and\nis passed in the argument \\fIpattern\\fP. The \\fIpreg\\fP argument is a pointer\nto a \\fBregex_t\\fP structure that is used as a base for storing information\nabout the compiled regular expression.\n.P\nThe argument \\fIcflags\\fP is either zero, or contains one or more of the bits\ndefined by the following macros:\n.sp\n  REG_DOTALL\n.sp\nThe PCRE_DOTALL option is set when the regular expression is passed for\ncompilation to the native function. Note that REG_DOTALL is not part of the\nPOSIX standard.\n.sp\n  REG_ICASE\n.sp\nThe PCRE_CASELESS option is set when the regular expression is passed for\ncompilation to the native function.\n.sp\n  REG_NEWLINE\n.sp\nThe PCRE_MULTILINE option is set when the regular expression is passed for\ncompilation to the native function. Note that this does \\fInot\\fP mimic the\ndefined POSIX behaviour for REG_NEWLINE (see the following section).\n.sp\n  REG_NOSUB\n.sp\nThe PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed\nfor compilation to the native function. In addition, when a pattern that is\ncompiled with this flag is passed to \\fBregexec()\\fP for matching, the\n\\fInmatch\\fP and \\fIpmatch\\fP arguments are ignored, and no captured strings\nare returned.\n.sp\n  REG_UCP\n.sp\nThe PCRE_UCP option is set when the regular expression is passed for\ncompilation to the native function. This causes PCRE to use Unicode properties\nwhen matchine \\ed, \\ew, etc., instead of just recognizing ASCII values. Note\nthat REG_UTF8 is not part of the POSIX standard.\n.sp\n  REG_UNGREEDY\n.sp\nThe PCRE_UNGREEDY option is set when the regular expression is passed for\ncompilation to the native function. Note that REG_UNGREEDY is not part of the\nPOSIX standard.\n.sp\n  REG_UTF8\n.sp\nThe PCRE_UTF8 option is set when the regular expression is passed for\ncompilation to the native function. This causes the pattern itself and all data\nstrings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8\nis not part of the POSIX standard.\n.P\nIn the absence of these flags, no options are passed to the native function.\nThis means the the regex is compiled with PCRE default semantics. In\nparticular, the way it handles newline characters in the subject string is the\nPerl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\n\\fIsome\\fP of the effects specified for REG_NEWLINE. It does not affect the way\nnewlines are matched by . (they are not) or by a negative class such as [^a]\n(they are).\n.P\nThe yield of \\fBregcomp()\\fP is zero on success, and non-zero otherwise. The\n\\fIpreg\\fP structure is filled in on success, and one member of the structure\nis public: \\fIre_nsub\\fP contains the number of capturing subpatterns in\nthe regular expression. Various error codes are defined in the header file.\n.P\nNOTE: If the yield of \\fBregcomp()\\fP is non-zero, you must not attempt to\nuse the contents of the \\fIpreg\\fP structure. If, for example, you pass it to\n\\fBregexec()\\fP, the result is undefined and your program is likely to crash.\n.\n.\n.SH \"MATCHING NEWLINE CHARACTERS\"\n.rs\n.sp\nThis area is not simple, because POSIX and Perl take different views of things.\nIt is not possible to get PCRE to obey POSIX semantics, but then PCRE was never\nintended to be a POSIX engine. The following table lists the different\npossibilities for matching newline characters in PCRE:\n.sp\n                          Default   Change with\n.sp\n  . matches newline          no     PCRE_DOTALL\n  newline matches [^a]       yes    not changeable\n  $ matches \\en at end        yes    PCRE_DOLLARENDONLY\n  $ matches \\en in middle     no     PCRE_MULTILINE\n  ^ matches \\en in middle     no     PCRE_MULTILINE\n.sp\nThis is the equivalent table for POSIX:\n.sp\n                          Default   Change with\n.sp\n  . matches newline          yes    REG_NEWLINE\n  newline matches [^a]       yes    REG_NEWLINE\n  $ matches \\en at end        no     REG_NEWLINE\n  $ matches \\en in middle     no     REG_NEWLINE\n  ^ matches \\en in middle     no     REG_NEWLINE\n.sp\nPCRE's behaviour is the same as Perl's, except that there is no equivalent for\nPCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop\nnewline from matching [^a].\n.P\nThe default POSIX newline handling can be obtained by setting PCRE_DOTALL and\nPCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the\nREG_NEWLINE action.\n.\n.\n.SH \"MATCHING A PATTERN\"\n.rs\n.sp\nThe function \\fBregexec()\\fP is called to match a compiled pattern \\fIpreg\\fP\nagainst a given \\fIstring\\fP, which is by default terminated by a zero byte\n(but see REG_STARTEND below), subject to the options in \\fIeflags\\fP. These can\nbe:\n.sp\n  REG_NOTBOL\n.sp\nThe PCRE_NOTBOL option is set when calling the underlying PCRE matching\nfunction.\n.sp\n  REG_NOTEMPTY\n.sp\nThe PCRE_NOTEMPTY option is set when calling the underlying PCRE matching\nfunction. Note that REG_NOTEMPTY is not part of the POSIX standard. However,\nsetting this option can give more POSIX-like behaviour in some situations.\n.sp\n  REG_NOTEOL\n.sp\nThe PCRE_NOTEOL option is set when calling the underlying PCRE matching\nfunction.\n.sp\n  REG_STARTEND\n.sp\nThe string is considered to start at \\fIstring\\fP + \\fIpmatch[0].rm_so\\fP and\nto have a terminating NUL located at \\fIstring\\fP + \\fIpmatch[0].rm_eo\\fP\n(there need not actually be a NUL at that location), regardless of the value of\n\\fInmatch\\fP. This is a BSD extension, compatible with but not specified by\nIEEE Standard 1003.2 (POSIX.2), and should be used with caution in software\nintended to be portable to other systems. Note that a non-zero \\fIrm_so\\fP does\nnot imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not\nhow it is matched.\n.P\nIf the pattern was compiled with the REG_NOSUB flag, no data about any matched\nstrings is returned. The \\fInmatch\\fP and \\fIpmatch\\fP arguments of\n\\fBregexec()\\fP are ignored.\n.P\nIf the value of \\fInmatch\\fP is zero, or if the value \\fIpmatch\\fP is NULL,\nno data about any matched strings is returned.\n.P\nOtherwise,the portion of the string that was matched, and also any captured\nsubstrings, are returned via the \\fIpmatch\\fP argument, which points to an\narray of \\fInmatch\\fP structures of type \\fIregmatch_t\\fP, containing the\nmembers \\fIrm_so\\fP and \\fIrm_eo\\fP. These contain the offset to the first\ncharacter of each substring and the offset to the first character after the end\nof each substring, respectively. The 0th element of the vector relates to the\nentire portion of \\fIstring\\fP that was matched; subsequent elements relate to\nthe capturing subpatterns of the regular expression. Unused entries in the\narray have both structure members set to -1.\n.P\nA successful match yields a zero return; various error codes are defined in the\nheader file, of which REG_NOMATCH is the \"expected\" failure code.\n.\n.\n.SH \"ERROR MESSAGES\"\n.rs\n.sp\nThe \\fBregerror()\\fP function maps a non-zero errorcode from either\n\\fBregcomp()\\fP or \\fBregexec()\\fP to a printable message. If \\fIpreg\\fP is not\nNULL, the error should have arisen from the use of that structure. A message\nterminated by a binary zero is placed in \\fIerrbuf\\fP. The length of the\nmessage, including the zero, is limited to \\fIerrbuf_size\\fP. The yield of the\nfunction is the size of buffer needed to hold the whole message.\n.\n.\n.SH MEMORY USAGE\n.rs\n.sp\nCompiling a regular expression causes memory to be allocated and associated\nwith the \\fIpreg\\fP structure. The function \\fBregfree()\\fP frees all such\nmemory, after which \\fIpreg\\fP may no longer be used as a compiled expression.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 09 January 2012\nCopyright (c) 1997-2012 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcreprecompile.3",
    "content": ".TH PCREPRECOMPILE 3 \"12 November 2013\" \"PCRE 8.34\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"SAVING AND RE-USING PRECOMPILED PCRE PATTERNS\"\n.rs\n.sp\nIf you are running an application that uses a large number of regular\nexpression patterns, it may be useful to store them in a precompiled form\ninstead of having to compile them every time the application is run.\nIf you are not using any private character tables (see the\n.\\\" HREF\n\\fBpcre_maketables()\\fP\n.\\\"\ndocumentation), this is relatively straightforward. If you are using private\ntables, it is a little bit more complicated. However, if you are using the\njust-in-time optimization feature, it is not possible to save and reload the\nJIT data.\n.P\nIf you save compiled patterns to a file, you can copy them to a different host\nand run them there. If the two hosts have different endianness (byte order),\nyou should run the \\fBpcre[16|32]_pattern_to_host_byte_order()\\fP function on the\nnew host before trying to match the pattern. The matching functions return\nPCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness.\n.P\nCompiling regular expressions with one version of PCRE for use with a different\nversion is not guaranteed to work and may cause crashes, and saving and\nrestoring a compiled pattern loses any JIT optimization data.\n.\n.\n.SH \"SAVING A COMPILED PATTERN\"\n.rs\n.sp\nThe value returned by \\fBpcre[16|32]_compile()\\fP points to a single block of\nmemory that holds the compiled pattern and associated data. You can find the\nlength of this block in bytes by calling \\fBpcre[16|32]_fullinfo()\\fP with an\nargument of PCRE_INFO_SIZE. You can then save the data in any appropriate\nmanner. Here is sample code for the 8-bit library that compiles a pattern and\nwrites it to a file. It assumes that the variable \\fIfd\\fP refers to a file\nthat is open for output:\n.sp\n  int erroroffset, rc, size;\n  char *error;\n  pcre *re;\n.sp\n  re = pcre_compile(\"my pattern\", 0, &error, &erroroffset, NULL);\n  if (re == NULL) { ... handle errors ... }\n  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);\n  if (rc < 0) { ... handle errors ... }\n  rc = fwrite(re, 1, size, fd);\n  if (rc != size) { ... handle errors ... }\n.sp\nIn this example, the bytes that comprise the compiled pattern are copied\nexactly. Note that this is binary data that may contain any of the 256 possible\nbyte values. On systems that make a distinction between binary and non-binary\ndata, be sure that the file is opened for binary output.\n.P\nIf you want to write more than one pattern to a file, you will have to devise a\nway of separating them. For binary data, preceding each pattern with its length\nis probably the most straightforward approach. Another possibility is to write\nout the data in hexadecimal instead of binary, one pattern to a line.\n.P\nSaving compiled patterns in a file is only one possible way of storing them for\nlater use. They could equally well be saved in a database, or in the memory of\nsome daemon process that passes them via sockets to the processes that want\nthem.\n.P\nIf the pattern has been studied, it is also possible to save the normal study\ndata in a similar way to the compiled pattern itself. However, if the\nPCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot\nbe saved because it is too dependent on the current environment. When studying\ngenerates additional information, \\fBpcre[16|32]_study()\\fP returns a pointer to a\n\\fBpcre[16|32]_extra\\fP data block. Its format is defined in the\n.\\\" HTML <a href=\"pcreapi.html#extradata\">\n.\\\" </a>\nsection on matching a pattern\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation. The \\fIstudy_data\\fP field points to the binary study data, and\nthis is what you must save (not the \\fBpcre[16|32]_extra\\fP block itself). The\nlength of the study data can be obtained by calling \\fBpcre[16|32]_fullinfo()\\fP\nwith an argument of PCRE_INFO_STUDYSIZE. Remember to check that\n\\fBpcre[16|32]_study()\\fP did return a non-NULL value before trying to save the\nstudy data.\n.\n.\n.SH \"RE-USING A PRECOMPILED PATTERN\"\n.rs\n.sp\nRe-using a precompiled pattern is straightforward. Having reloaded it into main\nmemory, called \\fBpcre[16|32]_pattern_to_host_byte_order()\\fP if necessary, you\npass its pointer to \\fBpcre[16|32]_exec()\\fP or \\fBpcre[16|32]_dfa_exec()\\fP in\nthe usual way.\n.P\nHowever, if you passed a pointer to custom character tables when the pattern\nwas compiled (the \\fItableptr\\fP argument of \\fBpcre[16|32]_compile()\\fP), you\nmust now pass a similar pointer to \\fBpcre[16|32]_exec()\\fP or\n\\fBpcre[16|32]_dfa_exec()\\fP, because the value saved with the compiled pattern\nwill obviously be nonsense. A field in a \\fBpcre[16|32]_extra()\\fP block is used\nto pass this data, as described in the\n.\\\" HTML <a href=\"pcreapi.html#extradata\">\n.\\\" </a>\nsection on matching a pattern\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.P\n\\fBWarning:\\fP The tables that \\fBpcre_exec()\\fP and \\fBpcre_dfa_exec()\\fP use\nmust be the same as those that were used when the pattern was compiled. If this\nis not the case, the behaviour is undefined.\n.P\nIf you did not provide custom character tables when the pattern was compiled,\nthe pointer in the compiled pattern is NULL, which causes the matching\nfunctions to use PCRE's internal tables. Thus, you do not need to take any\nspecial action at run time in this case.\n.P\nIf you saved study data with the compiled pattern, you need to create your own\n\\fBpcre[16|32]_extra\\fP data block and set the \\fIstudy_data\\fP field to point\nto the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in\nthe \\fIflags\\fP field to indicate that study data is present. Then pass the\n\\fBpcre[16|32]_extra\\fP block to the matching function in the usual way. If the\npattern was studied for just-in-time optimization, that data cannot be saved,\nand so is lost by a save/restore cycle.\n.\n.\n.SH \"COMPATIBILITY WITH DIFFERENT PCRE RELEASES\"\n.rs\n.sp\nIn general, it is safest to recompile all saved patterns when you update to a\nnew PCRE release, though not all updates actually require this.\n.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 12 November 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcresample.3",
    "content": ".TH PCRESAMPLE 3 \"10 January 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE SAMPLE PROGRAM\"\n.rs\n.sp\nA simple, complete demonstration program, to get you started with using PCRE,\nis supplied in the file \\fIpcredemo.c\\fP in the PCRE distribution. A listing of\nthis program is given in the\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\ndocumentation. If you do not have a copy of the PCRE distribution, you can save\nthis listing to re-create \\fIpcredemo.c\\fP.\n.P\nThe demonstration program, which uses the original PCRE 8-bit library, compiles\nthe regular expression that is its first argument, and matches it against the\nsubject string in its second argument. No PCRE options are set, and default\ncharacter tables are used. If matching succeeds, the program outputs the\nportion of the subject that matched, together with the contents of any captured\nsubstrings.\n.P\nIf the -g option is given on the command line, the program then goes on to\ncheck for further matches of the same regular expression in the same subject\nstring. The logic is a little bit tricky because of the possibility of matching\nan empty string. Comments in the code explain what is going on.\n.P\nIf PCRE is installed in the standard include and library directories for your\noperating system, you should be able to compile the demonstration program using\nthis command:\n.sp\n  gcc -o pcredemo pcredemo.c -lpcre\n.sp\nIf PCRE is installed elsewhere, you may need to add additional options to the\ncommand line. For example, on a Unix-like system that has PCRE installed in\n\\fI/usr/local\\fP, you can compile the demonstration program using a command\nlike this:\n.sp\n.\\\" JOINSH\n  gcc -o pcredemo -I/usr/local/include pcredemo.c \\e\n      -L/usr/local/lib -lpcre\n.sp\nIn a Windows environment, if you want to statically link the program against a\nnon-dll \\fBpcre.a\\fP file, you must uncomment the line that defines PCRE_STATIC\nbefore including \\fBpcre.h\\fP, because otherwise the \\fBpcre_malloc()\\fP and\n\\fBpcre_free()\\fP exported functions will be declared\n\\fB__declspec(dllimport)\\fP, with unwanted results.\n.P\nOnce you have compiled and linked the demonstration program, you can run simple\ntests like this:\n.sp\n  ./pcredemo 'cat|dog' 'the cat sat on the mat'\n  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'\n.sp\nNote that there is a much more comprehensive test program, called\n.\\\" HREF\n\\fBpcretest\\fP,\n.\\\"\nwhich supports many more facilities for testing regular expressions and both\nPCRE libraries. The\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\nprogram is provided as a simple coding example.\n.P\nIf you try to run\n.\\\" HREF\n\\fBpcredemo\\fP\n.\\\"\nwhen PCRE is not installed in the standard library directory, you may get an\nerror like this on some operating systems (e.g. Solaris):\n.sp\n  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory\n.sp\nThis is caused by the way shared library support works on those systems. You\nneed to add\n.sp\n  -R/usr/local/lib\n.sp\n(for example) to the compile command to get round this problem.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 10 January 2012\nCopyright (c) 1997-2012 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcrestack.3",
    "content": ".TH PCRESTACK 3 \"24 June 2012\" \"PCRE 8.30\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE DISCUSSION OF STACK USAGE\"\n.rs\n.sp\nWhen you call \\fBpcre[16|32]_exec()\\fP, it makes use of an internal function\ncalled \\fBmatch()\\fP. This calls itself recursively at branch points in the\npattern, in order to remember the state of the match so that it can back up and\ntry a different alternative if the first one fails. As matching proceeds deeper\nand deeper into the tree of possibilities, the recursion depth increases. The\n\\fBmatch()\\fP function is also called in other circumstances, for example,\nwhenever a parenthesized sub-pattern is entered, and in certain cases of\nrepetition.\n.P\nNot all calls of \\fBmatch()\\fP increase the recursion depth; for an item such\nas a* it may be called several times at the same level, after matching\ndifferent numbers of a's. Furthermore, in a number of cases where the result of\nthe recursive call would immediately be passed back as the result of the\ncurrent call (a \"tail recursion\"), the function is just restarted instead.\n.P\nThe above comments apply when \\fBpcre[16|32]_exec()\\fP is run in its normal\ninterpretive manner. If the pattern was studied with the\nPCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and\nthe options passed to \\fBpcre[16|32]_exec()\\fP were not incompatible, the matching\nprocess uses the JIT-compiled code instead of the \\fBmatch()\\fP function. In\nthis case, the memory requirements are handled entirely differently. See the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation for details.\n.P\nThe \\fBpcre[16|32]_dfa_exec()\\fP function operates in an entirely different way,\nand uses recursion only when there is a regular expression recursion or\nsubroutine call in the pattern. This includes the processing of assertion and\n\"once-only\" subpatterns, which are handled like subroutine calls. Normally,\nthese are never very deep, and the limit on the complexity of\n\\fBpcre[16|32]_dfa_exec()\\fP is controlled by the amount of workspace it is given.\nHowever, it is possible to write patterns with runaway infinite recursions;\nsuch patterns will cause \\fBpcre[16|32]_dfa_exec()\\fP to run out of stack. At\npresent, there is no protection against this.\n.P\nThe comments that follow do NOT apply to \\fBpcre[16|32]_dfa_exec()\\fP; they are\nrelevant only for \\fBpcre[16|32]_exec()\\fP without the JIT optimization.\n.\n.\n.SS \"Reducing \\fBpcre[16|32]_exec()\\fP's stack usage\"\n.rs\n.sp\nEach time that \\fBmatch()\\fP is actually called recursively, it uses memory\nfrom the process stack. For certain kinds of pattern and data, very large\namounts of stack may be needed, despite the recognition of \"tail recursion\".\nYou can often reduce the amount of recursion, and therefore the amount of stack\nused, by modifying the pattern that is being matched. Consider, for example,\nthis pattern:\n.sp\n  ([^<]|<(?!inet))+\n.sp\nIt matches from wherever it starts until it encounters \"<inet\" or the end of\nthe data, and is the kind of pattern that might be used when processing an XML\nfile. Each iteration of the outer parentheses matches either one character that\nis not \"<\" or a \"<\" that is not followed by \"inet\". However, each time a\nparenthesis is processed, a recursion occurs, so this formulation uses a stack\nframe for each matched character. For a long string, a lot of stack is\nrequired. Consider now this rewritten pattern, which matches exactly the same\nstrings:\n.sp\n  ([^<]++|<(?!inet))+\n.sp\nThis uses very much less stack, because runs of characters that do not contain\n\"<\" are \"swallowed\" in one item inside the parentheses. Recursion happens only\nwhen a \"<\" character that is not followed by \"inet\" is encountered (and we\nassume this is relatively rare). A possessive quantifier is used to stop any\nbacktracking into the runs of non-\"<\" characters, but that is not related to\nstack usage.\n.P\nThis example shows that one way of avoiding stack problems when matching long\nsubject strings is to write repeated parenthesized subpatterns to match more\nthan one character whenever possible.\n.\n.\n.SS \"Compiling PCRE to use heap instead of stack for \\fBpcre[16|32]_exec()\\fP\"\n.rs\n.sp\nIn environments where stack memory is constrained, you might want to compile\nPCRE to use heap memory instead of stack for remembering back-up points when\n\\fBpcre[16|32]_exec()\\fP is running. This makes it run a lot more slowly, however.\nDetails of how to do this are given in the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation. When built in this way, instead of using the stack, PCRE obtains\nand frees memory by calling the functions that are pointed to by the\n\\fBpcre[16|32]_stack_malloc\\fP and \\fBpcre[16|32]_stack_free\\fP variables. By\ndefault, these point to \\fBmalloc()\\fP and \\fBfree()\\fP, but you can replace\nthe pointers to cause PCRE to use your own functions. Since the block sizes are\nalways the same, and are always freed in reverse order, it may be possible to\nimplement customized memory handlers that are more efficient than the standard\nfunctions.\n.\n.\n.SS \"Limiting \\fBpcre[16|32]_exec()\\fP's stack usage\"\n.rs\n.sp\nYou can set limits on the number of times that \\fBmatch()\\fP is called, both in\ntotal and recursively. If a limit is exceeded, \\fBpcre[16|32]_exec()\\fP returns an\nerror code. Setting suitable limits should prevent it from running out of\nstack. The default values of the limits are very large, and unlikely ever to\noperate. They can be changed when PCRE is built, and they can also be set when\n\\fBpcre[16|32]_exec()\\fP is called. For details of these interfaces, see the\n.\\\" HREF\n\\fBpcrebuild\\fP\n.\\\"\ndocumentation and the\n.\\\" HTML <a href=\"pcreapi.html#extradata\">\n.\\\" </a>\nsection on extra data for \\fBpcre[16|32]_exec()\\fP\n.\\\"\nin the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.P\nAs a very rough rule of thumb, you should reckon on about 500 bytes per\nrecursion. Thus, if you want to limit your stack usage to 8Mb, you should set\nthe limit at 16000 recursions. A 64Mb stack, on the other hand, can support\naround 128000 recursions.\n.P\nIn Unix-like environments, the \\fBpcretest\\fP test program has a command line\noption (\\fB-S\\fP) that can be used to increase the size of its stack. As long\nas the stack is large enough, another option (\\fB-M\\fP) can be used to find the\nsmallest limits that allow a particular pattern to match a given subject\nstring. This is done by calling \\fBpcre[16|32]_exec()\\fP repeatedly with different\nlimits.\n.\n.\n.SS \"Obtaining an estimate of stack usage\"\n.rs\n.sp\nThe actual amount of stack used per recursion can vary quite a lot, depending\non the compiler that was used to build PCRE and the optimization or debugging\noptions that were set for it. The rule of thumb value of 500 bytes mentioned\nabove may be larger or smaller than what is actually needed. A better\napproximation can be obtained by running this command:\n.sp\n  pcretest -m -C\n.sp\nThe \\fB-C\\fP option causes \\fBpcretest\\fP to output information about the\noptions with which PCRE was compiled. When \\fB-m\\fP is also given (before\n\\fB-C\\fP), information about stack use is given in a line like this:\n.sp\n  Match recursion uses stack: approximate frame size = 640 bytes\n.sp\nThe value is approximate because some recursions need a bit more (up to perhaps\n16 more bytes).\n.P\nIf the above command is given when PCRE is compiled to use the heap instead of\nthe stack for recursion, the value that is output is the size of each block\nthat is obtained from the heap.\n.\n.\n.SS \"Changing stack size in Unix-like systems\"\n.rs\n.sp\nIn Unix-like environments, there is not often a problem with the stack unless\nvery long strings are involved, though the default limit on stack size varies\nfrom system to system. Values from 8Mb to 64Mb are common. You can find your\ndefault limit by running the command:\n.sp\n  ulimit -s\n.sp\nUnfortunately, the effect of running out of stack is often SIGSEGV, though\nsometimes a more explicit error message is given. You can normally increase the\nlimit on stack size by code such as this:\n.sp\n  struct rlimit rlim;\n  getrlimit(RLIMIT_STACK, &rlim);\n  rlim.rlim_cur = 100*1024*1024;\n  setrlimit(RLIMIT_STACK, &rlim);\n.sp\nThis reads the current limits (soft and hard) using \\fBgetrlimit()\\fP, then\nattempts to increase the soft limit to 100Mb using \\fBsetrlimit()\\fP. You must\ndo this before calling \\fBpcre[16|32]_exec()\\fP.\n.\n.\n.SS \"Changing stack size in Mac OS X\"\n.rs\n.sp\nUsing \\fBsetrlimit()\\fP, as described above, should also work on Mac OS X. It\nis also possible to set a stack size when linking a program. There is a\ndiscussion about stack sizes in Mac OS X at this web site:\n.\\\" HTML <a href=\"http://developer.apple.com/qa/qa2005/qa1419.html\">\n.\\\" </a>\nhttp://developer.apple.com/qa/qa2005/qa1419.html.\n.\\\"\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 24 June 2012\nCopyright (c) 1997-2012 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcresyntax.3",
    "content": ".TH PCRESYNTAX 3 \"08 January 2014\" \"PCRE 8.35\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"PCRE REGULAR EXPRESSION SYNTAX SUMMARY\"\n.rs\n.sp\nThe full syntax and semantics of the regular expressions that are supported by\nPCRE are described in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation. This document contains a quick-reference summary of the syntax.\n.\n.\n.SH \"QUOTING\"\n.rs\n.sp\n  \\ex         where x is non-alphanumeric is a literal x\n  \\eQ...\\eE    treat enclosed characters as literal\n.\n.\n.SH \"CHARACTERS\"\n.rs\n.sp\n  \\ea         alarm, that is, the BEL character (hex 07)\n  \\ecx        \"control-x\", where x is any ASCII character\n  \\ee         escape (hex 1B)\n  \\ef         form feed (hex 0C)\n  \\en         newline (hex 0A)\n  \\er         carriage return (hex 0D)\n  \\et         tab (hex 09)\n  \\e0dd       character with octal code 0dd\n  \\eddd       character with octal code ddd, or backreference\n  \\eo{ddd..}  character with octal code ddd..\n  \\exhh       character with hex code hh\n  \\ex{hhh..}  character with hex code hhh..\n.sp\nNote that \\e0dd is always an octal code, and that \\e8 and \\e9 are the literal\ncharacters \"8\" and \"9\".\n.\n.\n.SH \"CHARACTER TYPES\"\n.rs\n.sp\n  .          any character except newline;\n               in dotall mode, any character whatsoever\n  \\eC         one data unit, even in UTF mode (best avoided)\n  \\ed         a decimal digit\n  \\eD         a character that is not a decimal digit\n  \\eh         a horizontal white space character\n  \\eH         a character that is not a horizontal white space character\n  \\eN         a character that is not a newline\n  \\ep{\\fIxx\\fP}     a character with the \\fIxx\\fP property\n  \\eP{\\fIxx\\fP}     a character without the \\fIxx\\fP property\n  \\eR         a newline sequence\n  \\es         a white space character\n  \\eS         a character that is not a white space character\n  \\ev         a vertical white space character\n  \\eV         a character that is not a vertical white space character\n  \\ew         a \"word\" character\n  \\eW         a \"non-word\" character\n  \\eX         a Unicode extended grapheme cluster\n.sp\nBy default, \\ed, \\es, and \\ew match only ASCII characters, even in UTF-8 mode\nor in the 16- bit and 32-bit libraries. However, if locale-specific matching is\nhappening, \\es and \\ew may also match characters with code points in the range\n128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences\nis changed to use Unicode properties and they match many more characters.\n.\n.\n.SH \"GENERAL CATEGORY PROPERTIES FOR \\ep and \\eP\"\n.rs\n.sp\n  C          Other\n  Cc         Control\n  Cf         Format\n  Cn         Unassigned\n  Co         Private use\n  Cs         Surrogate\n.sp\n  L          Letter\n  Ll         Lower case letter\n  Lm         Modifier letter\n  Lo         Other letter\n  Lt         Title case letter\n  Lu         Upper case letter\n  L&         Ll, Lu, or Lt\n.sp\n  M          Mark\n  Mc         Spacing mark\n  Me         Enclosing mark\n  Mn         Non-spacing mark\n.sp\n  N          Number\n  Nd         Decimal number\n  Nl         Letter number\n  No         Other number\n.sp\n  P          Punctuation\n  Pc         Connector punctuation\n  Pd         Dash punctuation\n  Pe         Close punctuation\n  Pf         Final punctuation\n  Pi         Initial punctuation\n  Po         Other punctuation\n  Ps         Open punctuation\n.sp\n  S          Symbol\n  Sc         Currency symbol\n  Sk         Modifier symbol\n  Sm         Mathematical symbol\n  So         Other symbol\n.sp\n  Z          Separator\n  Zl         Line separator\n  Zp         Paragraph separator\n  Zs         Space separator\n.\n.\n.SH \"PCRE SPECIAL CATEGORY PROPERTIES FOR \\ep and \\eP\"\n.rs\n.sp\n  Xan        Alphanumeric: union of properties L and N\n  Xps        POSIX space: property Z or tab, NL, VT, FF, CR\n  Xsp        Perl space: property Z or tab, NL, VT, FF, CR\n  Xuc        Univerally-named character: one that can be\n               represented by a Universal Character Name\n  Xwd        Perl word: property Xan or underscore\n.sp\nPerl and POSIX space are now the same. Perl added VT to its space character set\nat release 5.18 and PCRE changed at release 8.34.\n.\n.\n.SH \"SCRIPT NAMES FOR \\ep AND \\eP\"\n.rs\n.sp\nArabic,\nArmenian,\nAvestan,\nBalinese,\nBamum,\nBassa_Vah,\nBatak,\nBengali,\nBopomofo,\nBrahmi,\nBraille,\nBuginese,\nBuhid,\nCanadian_Aboriginal,\nCarian,\nCaucasian_Albanian,\nChakma,\nCham,\nCherokee,\nCommon,\nCoptic,\nCuneiform,\nCypriot,\nCyrillic,\nDeseret,\nDevanagari,\nDuployan,\nEgyptian_Hieroglyphs,\nElbasan,\nEthiopic,\nGeorgian,\nGlagolitic,\nGothic,\nGrantha,\nGreek,\nGujarati,\nGurmukhi,\nHan,\nHangul,\nHanunoo,\nHebrew,\nHiragana,\nImperial_Aramaic,\nInherited,\nInscriptional_Pahlavi,\nInscriptional_Parthian,\nJavanese,\nKaithi,\nKannada,\nKatakana,\nKayah_Li,\nKharoshthi,\nKhmer,\nKhojki,\nKhudawadi,\nLao,\nLatin,\nLepcha,\nLimbu,\nLinear_A,\nLinear_B,\nLisu,\nLycian,\nLydian,\nMahajani,\nMalayalam,\nMandaic,\nManichaean,\nMeetei_Mayek,\nMende_Kikakui,\nMeroitic_Cursive,\nMeroitic_Hieroglyphs,\nMiao,\nModi,\nMongolian,\nMro,\nMyanmar,\nNabataean,\nNew_Tai_Lue,\nNko,\nOgham,\nOl_Chiki,\nOld_Italic,\nOld_North_Arabian,\nOld_Permic,\nOld_Persian,\nOld_South_Arabian,\nOld_Turkic,\nOriya,\nOsmanya,\nPahawh_Hmong,\nPalmyrene,\nPau_Cin_Hau,\nPhags_Pa,\nPhoenician,\nPsalter_Pahlavi,\nRejang,\nRunic,\nSamaritan,\nSaurashtra,\nSharada,\nShavian,\nSiddham,\nSinhala,\nSora_Sompeng,\nSundanese,\nSyloti_Nagri,\nSyriac,\nTagalog,\nTagbanwa,\nTai_Le,\nTai_Tham,\nTai_Viet,\nTakri,\nTamil,\nTelugu,\nThaana,\nThai,\nTibetan,\nTifinagh,\nTirhuta,\nUgaritic,\nVai,\nWarang_Citi,\nYi.\n.\n.\n.SH \"CHARACTER CLASSES\"\n.rs\n.sp\n  [...]       positive character class\n  [^...]      negative character class\n  [x-y]       range (can be used for hex characters)\n  [[:xxx:]]   positive POSIX named set\n  [[:^xxx:]]  negative POSIX named set\n.sp\n  alnum       alphanumeric\n  alpha       alphabetic\n  ascii       0-127\n  blank       space or tab\n  cntrl       control character\n  digit       decimal digit\n  graph       printing, excluding space\n  lower       lower case letter\n  print       printing, including space\n  punct       printing, excluding alphanumeric\n  space       white space\n  upper       upper case letter\n  word        same as \\ew\n  xdigit      hexadecimal digit\n.sp\nIn PCRE, POSIX character set names recognize only ASCII characters by default,\nbut some of them use Unicode properties if PCRE_UCP is set. You can use\n\\eQ...\\eE inside a character class.\n.\n.\n.SH \"QUANTIFIERS\"\n.rs\n.sp\n  ?           0 or 1, greedy\n  ?+          0 or 1, possessive\n  ??          0 or 1, lazy\n  *           0 or more, greedy\n  *+          0 or more, possessive\n  *?          0 or more, lazy\n  +           1 or more, greedy\n  ++          1 or more, possessive\n  +?          1 or more, lazy\n  {n}         exactly n\n  {n,m}       at least n, no more than m, greedy\n  {n,m}+      at least n, no more than m, possessive\n  {n,m}?      at least n, no more than m, lazy\n  {n,}        n or more, greedy\n  {n,}+       n or more, possessive\n  {n,}?       n or more, lazy\n.\n.\n.SH \"ANCHORS AND SIMPLE ASSERTIONS\"\n.rs\n.sp\n  \\eb          word boundary\n  \\eB          not a word boundary\n  ^           start of subject\n               also after internal newline in multiline mode\n  \\eA          start of subject\n  $           end of subject\n               also before newline at end of subject\n               also before internal newline in multiline mode\n  \\eZ          end of subject\n               also before newline at end of subject\n  \\ez          end of subject\n  \\eG          first matching position in subject\n.\n.\n.SH \"MATCH POINT RESET\"\n.rs\n.sp\n  \\eK          reset start of match\n.sp\n\\eK is honoured in positive assertions, but ignored in negative ones.\n.\n.\n.SH \"ALTERNATION\"\n.rs\n.sp\n  expr|expr|expr...\n.\n.\n.SH \"CAPTURING\"\n.rs\n.sp\n  (...)           capturing group\n  (?<name>...)    named capturing group (Perl)\n  (?'name'...)    named capturing group (Perl)\n  (?P<name>...)   named capturing group (Python)\n  (?:...)         non-capturing group\n  (?|...)         non-capturing group; reset group numbers for\n                   capturing groups in each alternative\n.\n.\n.SH \"ATOMIC GROUPS\"\n.rs\n.sp\n  (?>...)         atomic, non-capturing group\n.\n.\n.\n.\n.SH \"COMMENT\"\n.rs\n.sp\n  (?#....)        comment (not nestable)\n.\n.\n.SH \"OPTION SETTING\"\n.rs\n.sp\n  (?i)            caseless\n  (?J)            allow duplicate names\n  (?m)            multiline\n  (?s)            single line (dotall)\n  (?U)            default ungreedy (lazy)\n  (?x)            extended (ignore white space)\n  (?-...)         unset option(s)\n.sp\nThe following are recognized only at the very start of a pattern or after one\nof the newline or \\eR options with similar syntax. More than one of them may\nappear.\n.sp\n  (*LIMIT_MATCH=d) set the match limit to d (decimal number)\n  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)\n  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)\n  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)\n  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)\n  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)\n  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)\n  (*UTF)          set appropriate UTF mode for the library in use\n  (*UCP)          set PCRE_UCP (use Unicode properties for \\ed etc)\n.sp\nNote that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the\nlimits set by the caller of pcre_exec(), not increase them.\n.\n.\n.SH \"NEWLINE CONVENTION\"\n.rs\n.sp\nThese are recognized only at the very start of the pattern or after option\nsettings with a similar syntax.\n.sp\n  (*CR)           carriage return only\n  (*LF)           linefeed only\n  (*CRLF)         carriage return followed by linefeed\n  (*ANYCRLF)      all three of the above\n  (*ANY)          any Unicode newline sequence\n.\n.\n.SH \"WHAT \\eR MATCHES\"\n.rs\n.sp\nThese are recognized only at the very start of the pattern or after option\nsetting with a similar syntax.\n.sp\n  (*BSR_ANYCRLF)  CR, LF, or CRLF\n  (*BSR_UNICODE)  any Unicode newline sequence\n.\n.\n.SH \"LOOKAHEAD AND LOOKBEHIND ASSERTIONS\"\n.rs\n.sp\n  (?=...)         positive look ahead\n  (?!...)         negative look ahead\n  (?<=...)        positive look behind\n  (?<!...)        negative look behind\n.sp\nEach top-level branch of a look behind must be of a fixed length.\n.\n.\n.SH \"BACKREFERENCES\"\n.rs\n.sp\n  \\en              reference by number (can be ambiguous)\n  \\egn             reference by number\n  \\eg{n}           reference by number\n  \\eg{-n}          relative reference by number\n  \\ek<name>        reference by name (Perl)\n  \\ek'name'        reference by name (Perl)\n  \\eg{name}        reference by name (Perl)\n  \\ek{name}        reference by name (.NET)\n  (?P=name)       reference by name (Python)\n.\n.\n.SH \"SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)\"\n.rs\n.sp\n  (?R)            recurse whole pattern\n  (?n)            call subpattern by absolute number\n  (?+n)           call subpattern by relative number\n  (?-n)           call subpattern by relative number\n  (?&name)        call subpattern by name (Perl)\n  (?P>name)       call subpattern by name (Python)\n  \\eg<name>        call subpattern by name (Oniguruma)\n  \\eg'name'        call subpattern by name (Oniguruma)\n  \\eg<n>           call subpattern by absolute number (Oniguruma)\n  \\eg'n'           call subpattern by absolute number (Oniguruma)\n  \\eg<+n>          call subpattern by relative number (PCRE extension)\n  \\eg'+n'          call subpattern by relative number (PCRE extension)\n  \\eg<-n>          call subpattern by relative number (PCRE extension)\n  \\eg'-n'          call subpattern by relative number (PCRE extension)\n.\n.\n.SH \"CONDITIONAL PATTERNS\"\n.rs\n.sp\n  (?(condition)yes-pattern)\n  (?(condition)yes-pattern|no-pattern)\n.sp\n  (?(n)...        absolute reference condition\n  (?(+n)...       relative reference condition\n  (?(-n)...       relative reference condition\n  (?(<name>)...   named reference condition (Perl)\n  (?('name')...   named reference condition (Perl)\n  (?(name)...     named reference condition (PCRE)\n  (?(R)...        overall recursion condition\n  (?(Rn)...       specific group recursion condition\n  (?(R&name)...   specific recursion condition\n  (?(DEFINE)...   define subpattern for reference\n  (?(assert)...   assertion condition\n.\n.\n.SH \"BACKTRACKING CONTROL\"\n.rs\n.sp\nThe following act immediately they are reached:\n.sp\n  (*ACCEPT)       force successful match\n  (*FAIL)         force backtrack; synonym (*F)\n  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)\n.sp\nThe following act only when a subsequent match failure causes a backtrack to\nreach them. They all force a match failure, but they differ in what happens\nafterwards. Those that advance the start-of-match point do so only if the\npattern is not anchored.\n.sp\n  (*COMMIT)       overall failure, no advance of starting point\n  (*PRUNE)        advance to next starting character\n  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)\n  (*SKIP)         advance to current matching position\n  (*SKIP:NAME)    advance to position corresponding to an earlier\n                  (*MARK:NAME); if not found, the (*SKIP) is ignored\n  (*THEN)         local failure, backtrack to next alternation\n  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)\n.\n.\n.SH \"CALLOUTS\"\n.rs\n.sp\n  (?C)      callout\n  (?Cn)     callout with data n\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcrepattern\\fP(3), \\fBpcreapi\\fP(3), \\fBpcrecallout\\fP(3),\n\\fBpcrematching\\fP(3), \\fBpcre\\fP(3).\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 08 January 2014\nCopyright (c) 1997-2014 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcretest.1",
    "content": ".TH PCRETEST 1 \"23 February 2017\" \"PCRE 8.41\"\n.SH NAME\npcretest - a program for testing Perl-compatible regular expressions.\n.SH SYNOPSIS\n.rs\n.sp\n.B pcretest \"[options] [input file [output file]]\"\n.sp\n\\fBpcretest\\fP was written as a test program for the PCRE regular expression\nlibrary itself, but it can also be used for experimenting with regular\nexpressions. This document describes the features of the test program; for\ndetails of the regular expressions themselves, see the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation. For details of the PCRE library function calls and their\noptions, see the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\n,\n.\\\" HREF\n\\fBpcre16\\fP\nand\n.\\\" HREF\n\\fBpcre32\\fP\n.\\\"\ndocumentation.\n.P\nThe input for \\fBpcretest\\fP is a sequence of regular expression patterns and\nstrings to be matched, as described below. The output shows the result of each\nmatch. Options on the command line and the patterns control PCRE options and\nexactly what is output.\n.P\nAs PCRE has evolved, it has acquired many different features, and as a result,\n\\fBpcretest\\fP now has rather a lot of obscure options for testing every\npossible feature. Some of these options are specifically designed for use in\nconjunction with the test script and data files that are distributed as part of\nPCRE, and are unlikely to be of use otherwise. They are all documented here,\nbut without much justification.\n.\n.\n.SH \"INPUT DATA FORMAT\"\n.rs\n.sp\nInput to \\fBpcretest\\fP is processed line by line, either by calling the C\nlibrary's \\fBfgets()\\fP function, or via the \\fBlibreadline\\fP library (see\nbelow). In Unix-like environments, \\fBfgets()\\fP treats any bytes other than\nnewline as data characters. However, in some Windows environments character 26\n(hex 1A) causes an immediate end of file, and no further data is read. For\nmaximum portability, therefore, it is safest to use only ASCII characters in\n\\fBpcretest\\fP input files.\n.P\nThe input is processed using using C's string functions, so must not\ncontain binary zeroes, even though in Unix-like environments, \\fBfgets()\\fP\ntreats any bytes other than newline as data characters.\n.\n.\n.SH \"PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES\"\n.rs\n.sp\nFrom release 8.30, two separate PCRE libraries can be built. The original one\nsupports 8-bit character strings, whereas the newer 16-bit library supports\ncharacter strings encoded in 16-bit units. From release 8.32, a third library\ncan be built, supporting character strings encoded in 32-bit units. The\n\\fBpcretest\\fP program can be used to test all three libraries. However, it is\nitself still an 8-bit program, reading 8-bit input and writing 8-bit output.\nWhen testing the 16-bit or 32-bit library, the patterns and data strings are\nconverted to 16- or 32-bit format before being passed to the PCRE library\nfunctions. Results are converted to 8-bit for output.\n.P\nReferences to functions and structures of the form \\fBpcre[16|32]_xx\\fP below\nmean \"\\fBpcre_xx\\fP when using the 8-bit library, \\fBpcre16_xx\\fP when using\nthe 16-bit library, or \\fBpcre32_xx\\fP when using the 32-bit library\".\n.\n.\n.SH \"COMMAND LINE OPTIONS\"\n.rs\n.TP 10\n\\fB-8\\fP\nIf both the 8-bit library has been built, this option causes the 8-bit library\nto be used (which is the default); if the 8-bit library has not been built,\nthis option causes an error.\n.TP 10\n\\fB-16\\fP\nIf both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this\noption causes the 16-bit library to be used. If only the 16-bit library has been\nbuilt, this is the default (so has no effect). If only the 8-bit or the 32-bit\nlibrary has been built, this option causes an error.\n.TP 10\n\\fB-32\\fP\nIf both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this\noption causes the 32-bit library to be used. If only the 32-bit library has been\nbuilt, this is the default (so has no effect). If only the 8-bit or the 16-bit\nlibrary has been built, this option causes an error.\n.TP 10\n\\fB-b\\fP\nBehave as if each pattern has the \\fB/B\\fP (show byte code) modifier; the\ninternal form is output after compilation.\n.TP 10\n\\fB-C\\fP\nOutput the version number of the PCRE library, and all available information\nabout the optional features that are included, and then exit with zero exit\ncode. All other options are ignored.\n.TP 10\n\\fB-C\\fP \\fIoption\\fP\nOutput information about a specific build-time option, then exit. This\nfunctionality is intended for use in scripts such as \\fBRunTest\\fP. The\nfollowing options output the value and set the exit code as indicated:\n.sp\n  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:\n               0x15 or 0x25\n               0 if used in an ASCII environment\n               exit code is always 0\n  linksize   the configured internal link size (2, 3, or 4)\n               exit code is set to the link size\n  newline    the default newline setting:\n               CR, LF, CRLF, ANYCRLF, or ANY\n               exit code is always 0\n  bsr        the default setting for what \\eR matches:\n               ANYCRLF or ANY\n               exit code is always 0\n.sp\nThe following options output 1 for true or 0 for false, and set the exit code\nto the same value:\n.sp\n  ebcdic     compiled for an EBCDIC environment\n  jit        just-in-time support is available\n  pcre16     the 16-bit library was built\n  pcre32     the 32-bit library was built\n  pcre8      the 8-bit library was built\n  ucp        Unicode property support is available\n  utf        UTF-8 and/or UTF-16 and/or UTF-32 support\n               is available\n.sp\nIf an unknown option is given, an error message is output; the exit code is 0.\n.TP 10\n\\fB-d\\fP\nBehave as if each pattern has the \\fB/D\\fP (debug) modifier; the internal\nform and information about the compiled pattern is output after compilation;\n\\fB-d\\fP is equivalent to \\fB-b -i\\fP.\n.TP 10\n\\fB-dfa\\fP\nBehave as if each data line contains the \\eD escape sequence; this causes the\nalternative matching function, \\fBpcre[16|32]_dfa_exec()\\fP, to be used instead\nof the standard \\fBpcre[16|32]_exec()\\fP function (more detail is given below).\n.TP 10\n\\fB-help\\fP\nOutput a brief summary these options and then exit.\n.TP 10\n\\fB-i\\fP\nBehave as if each pattern has the \\fB/I\\fP modifier; information about the\ncompiled pattern is given after compilation.\n.TP 10\n\\fB-M\\fP\nBehave as if each data line contains the \\eM escape sequence; this causes\nPCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by\ncalling \\fBpcre[16|32]_exec()\\fP repeatedly with different limits.\n.TP 10\n\\fB-m\\fP\nOutput the size of each compiled pattern after it has been compiled. This is\nequivalent to adding \\fB/M\\fP to each regular expression. The size is given in\nbytes for both libraries.\n.TP 10\n\\fB-O\\fP\nBehave as if each pattern has the \\fB/O\\fP modifier, that is disable\nauto-possessification for all patterns.\n.TP 10\n\\fB-o\\fP \\fIosize\\fP\nSet the number of elements in the output vector that is used when calling\n\\fBpcre[16|32]_exec()\\fP or \\fBpcre[16|32]_dfa_exec()\\fP to be \\fIosize\\fP. The\ndefault value is 45, which is enough for 14 capturing subexpressions for\n\\fBpcre[16|32]_exec()\\fP or 22 different matches for\n\\fBpcre[16|32]_dfa_exec()\\fP.\nThe vector size can be changed for individual matching calls by including \\eO\nin the data line (see below).\n.TP 10\n\\fB-p\\fP\nBehave as if each pattern has the \\fB/P\\fP modifier; the POSIX wrapper API is\nused to call PCRE. None of the other options has any effect when \\fB-p\\fP is\nset. This option can be used only with the 8-bit library.\n.TP 10\n\\fB-q\\fP\nDo not output the version number of \\fBpcretest\\fP at the start of execution.\n.TP 10\n\\fB-S\\fP \\fIsize\\fP\nOn Unix-like systems, set the size of the run-time stack to \\fIsize\\fP\nmegabytes.\n.TP 10\n\\fB-s\\fP or \\fB-s+\\fP\nBehave as if each pattern has the \\fB/S\\fP modifier; in other words, force each\npattern to be studied. If \\fB-s+\\fP is used, all the JIT compile options are\npassed to \\fBpcre[16|32]_study()\\fP, causing just-in-time optimization to be set\nup if it is available, for both full and partial matching. Specific JIT compile\noptions can be selected by following \\fB-s+\\fP with a digit in the range 1 to\n7, which selects the JIT compile modes as follows:\n.sp\n  1  normal match only\n  2  soft partial match only\n  3  normal match and soft partial match\n  4  hard partial match only\n  6  soft and hard partial match\n  7  all three modes (default)\n.sp\nIf \\fB-s++\\fP is used instead of \\fB-s+\\fP (with or without a following digit),\nthe text \"(JIT)\" is added to the first output line after a match or no match\nwhen JIT-compiled code was actually used.\n.sp\nNote that there are pattern options that can override \\fB-s\\fP, either\nspecifying no studying at all, or suppressing JIT compilation.\n.sp\nIf the \\fB/I\\fP or \\fB/D\\fP option is present on a pattern (requesting output\nabout the compiled pattern), information about the result of studying is not\nincluded when studying is caused only by \\fB-s\\fP and neither \\fB-i\\fP nor\n\\fB-d\\fP is present on the command line. This behaviour means that the output\nfrom tests that are run with and without \\fB-s\\fP should be identical, except\nwhen options that output information about the actual running of a match are\nset.\n.sp\nThe \\fB-M\\fP, \\fB-t\\fP, and \\fB-tm\\fP options, which give information about\nresources used, are likely to produce different output with and without\n\\fB-s\\fP. Output may also differ if the \\fB/C\\fP option is present on an\nindividual pattern. This uses callouts to trace the the matching process, and\nthis may be different between studied and non-studied patterns. If the pattern\ncontains (*MARK) items there may also be differences, for the same reason. The\n\\fB-s\\fP command line option can be overridden for specific patterns that\nshould never be studied (see the \\fB/S\\fP pattern modifier below).\n.TP 10\n\\fB-t\\fP\nRun each compile, study, and match many times with a timer, and output the\nresulting times per compile, study, or match (in milliseconds). Do not set\n\\fB-m\\fP with \\fB-t\\fP, because you will then get the size output a zillion\ntimes, and the timing will be distorted. You can control the number of\niterations that are used for timing by following \\fB-t\\fP with a number (as a\nseparate item on the command line). For example, \"-t 1000\" iterates 1000 times.\nThe default is to iterate 500000 times.\n.TP 10\n\\fB-tm\\fP\nThis is like \\fB-t\\fP except that it times only the matching phase, not the\ncompile or study phases.\n.TP 10\n\\fB-T\\fP \\fB-TM\\fP\nThese behave like \\fB-t\\fP and \\fB-tm\\fP, but in addition, at the end of a run,\nthe total times for all compiles, studies, and matches are output.\n.\n.\n.SH DESCRIPTION\n.rs\n.sp\nIf \\fBpcretest\\fP is given two filename arguments, it reads from the first and\nwrites to the second. If it is given only one filename argument, it reads from\nthat file and writes to stdout. Otherwise, it reads from stdin and writes to\nstdout, and prompts for each line of input, using \"re>\" to prompt for regular\nexpressions, and \"data>\" to prompt for data lines.\n.P\nWhen \\fBpcretest\\fP is built, a configuration option can specify that it should\nbe linked with the \\fBlibreadline\\fP library. When this is done, if the input\nis from a terminal, it is read using the \\fBreadline()\\fP function. This\nprovides line-editing and history facilities. The output from the \\fB-help\\fP\noption states whether or not \\fBreadline()\\fP will be used.\n.P\nThe program handles any number of sets of input on a single input file. Each\nset starts with a regular expression, and continues with any number of data\nlines to be matched against that pattern.\n.P\nEach data line is matched separately and independently. If you want to do\nmulti-line matches, you have to use the \\en escape sequence (or \\er or \\er\\en,\netc., depending on the newline setting) in a single line of input to encode the\nnewline sequences. There is no limit on the length of data lines; the input\nbuffer is automatically extended if it is too small.\n.P\nAn empty line signals the end of the data lines, at which point a new regular\nexpression is read. The regular expressions are given enclosed in any\nnon-alphanumeric delimiters other than backslash, for example:\n.sp\n  /(a|bc)x+yz/\n.sp\nWhite space before the initial delimiter is ignored. A regular expression may\nbe continued over several input lines, in which case the newline characters are\nincluded within it. It is possible to include the delimiter within the pattern\nby escaping it, for example\n.sp\n  /abc\\e/def/\n.sp\nIf you do so, the escape and the delimiter form part of the pattern, but since\ndelimiters are always non-alphanumeric, this does not affect its interpretation.\nIf the terminating delimiter is immediately followed by a backslash, for\nexample,\n.sp\n  /abc/\\e\n.sp\nthen a backslash is added to the end of the pattern. This is done to provide a\nway of testing the error condition that arises if a pattern finishes with a\nbackslash, because\n.sp\n  /abc\\e/\n.sp\nis interpreted as the first line of a pattern that starts with \"abc/\", causing\npcretest to read the next line as a continuation of the regular expression.\n.\n.\n.SH \"PATTERN MODIFIERS\"\n.rs\n.sp\nA pattern may be followed by any number of modifiers, which are mostly single\ncharacters, though some of these can be qualified by further characters.\nFollowing Perl usage, these are referred to below as, for example, \"the\n\\fB/i\\fP modifier\", even though the delimiter of the pattern need not always be\na slash, and no slash is used when writing modifiers. White space may appear\nbetween the final pattern delimiter and the first modifier, and between the\nmodifiers themselves. For reference, here is a complete list of modifiers. They\nfall into several groups that are described in detail in the following\nsections.\n.sp\n  \\fB/8\\fP              set UTF mode\n  \\fB/9\\fP              set PCRE_NEVER_UTF (locks out UTF mode)\n  \\fB/?\\fP              disable UTF validity check\n  \\fB/+\\fP              show remainder of subject after match\n  \\fB/=\\fP              show all captures (not just those that are set)\n.sp\n  \\fB/A\\fP              set PCRE_ANCHORED\n  \\fB/B\\fP              show compiled code\n  \\fB/C\\fP              set PCRE_AUTO_CALLOUT\n  \\fB/D\\fP              same as \\fB/B\\fP plus \\fB/I\\fP\n  \\fB/E\\fP              set PCRE_DOLLAR_ENDONLY\n  \\fB/F\\fP              flip byte order in compiled pattern\n  \\fB/f\\fP              set PCRE_FIRSTLINE\n  \\fB/G\\fP              find all matches (shorten string)\n  \\fB/g\\fP              find all matches (use startoffset)\n  \\fB/I\\fP              show information about pattern\n  \\fB/i\\fP              set PCRE_CASELESS\n  \\fB/J\\fP              set PCRE_DUPNAMES\n  \\fB/K\\fP              show backtracking control names\n  \\fB/L\\fP              set locale\n  \\fB/M\\fP              show compiled memory size\n  \\fB/m\\fP              set PCRE_MULTILINE\n  \\fB/N\\fP              set PCRE_NO_AUTO_CAPTURE\n  \\fB/O\\fP              set PCRE_NO_AUTO_POSSESS\n  \\fB/P\\fP              use the POSIX wrapper\n  \\fB/Q\\fP              test external stack check function\n  \\fB/S\\fP              study the pattern after compilation\n  \\fB/s\\fP              set PCRE_DOTALL\n  \\fB/T\\fP              select character tables\n  \\fB/U\\fP              set PCRE_UNGREEDY\n  \\fB/W\\fP              set PCRE_UCP\n  \\fB/X\\fP              set PCRE_EXTRA\n  \\fB/x\\fP              set PCRE_EXTENDED\n  \\fB/Y\\fP              set PCRE_NO_START_OPTIMIZE\n  \\fB/Z\\fP              don't show lengths in \\fB/B\\fP output\n.sp\n  \\fB/<any>\\fP          set PCRE_NEWLINE_ANY\n  \\fB/<anycrlf>\\fP      set PCRE_NEWLINE_ANYCRLF\n  \\fB/<cr>\\fP           set PCRE_NEWLINE_CR\n  \\fB/<crlf>\\fP         set PCRE_NEWLINE_CRLF\n  \\fB/<lf>\\fP           set PCRE_NEWLINE_LF\n  \\fB/<bsr_anycrlf>\\fP  set PCRE_BSR_ANYCRLF\n  \\fB/<bsr_unicode>\\fP  set PCRE_BSR_UNICODE\n  \\fB/<JS>\\fP           set PCRE_JAVASCRIPT_COMPAT\n.sp\n.\n.\n.SS \"Perl-compatible modifiers\"\n.rs\n.sp\nThe \\fB/i\\fP, \\fB/m\\fP, \\fB/s\\fP, and \\fB/x\\fP modifiers set the PCRE_CASELESS,\nPCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when\n\\fBpcre[16|32]_compile()\\fP is called. These four modifier letters have the same\neffect as they do in Perl. For example:\n.sp\n  /caseless/i\n.sp\n.\n.\n.SS \"Modifiers for other PCRE options\"\n.rs\n.sp\nThe following table shows additional modifiers for setting PCRE compile-time\noptions that do not correspond to anything in Perl:\n.sp\n  \\fB/8\\fP              PCRE_UTF8           ) when using the 8-bit\n  \\fB/?\\fP              PCRE_NO_UTF8_CHECK  )   library\n.sp\n  \\fB/8\\fP              PCRE_UTF16          ) when using the 16-bit\n  \\fB/?\\fP              PCRE_NO_UTF16_CHECK )   library\n.sp\n  \\fB/8\\fP              PCRE_UTF32          ) when using the 32-bit\n  \\fB/?\\fP              PCRE_NO_UTF32_CHECK )   library\n.sp\n  \\fB/9\\fP              PCRE_NEVER_UTF\n  \\fB/A\\fP              PCRE_ANCHORED\n  \\fB/C\\fP              PCRE_AUTO_CALLOUT\n  \\fB/E\\fP              PCRE_DOLLAR_ENDONLY\n  \\fB/f\\fP              PCRE_FIRSTLINE\n  \\fB/J\\fP              PCRE_DUPNAMES\n  \\fB/N\\fP              PCRE_NO_AUTO_CAPTURE\n  \\fB/O\\fP              PCRE_NO_AUTO_POSSESS\n  \\fB/U\\fP              PCRE_UNGREEDY\n  \\fB/W\\fP              PCRE_UCP\n  \\fB/X\\fP              PCRE_EXTRA\n  \\fB/Y\\fP              PCRE_NO_START_OPTIMIZE\n  \\fB/<any>\\fP          PCRE_NEWLINE_ANY\n  \\fB/<anycrlf>\\fP      PCRE_NEWLINE_ANYCRLF\n  \\fB/<cr>\\fP           PCRE_NEWLINE_CR\n  \\fB/<crlf>\\fP         PCRE_NEWLINE_CRLF\n  \\fB/<lf>\\fP           PCRE_NEWLINE_LF\n  \\fB/<bsr_anycrlf>\\fP  PCRE_BSR_ANYCRLF\n  \\fB/<bsr_unicode>\\fP  PCRE_BSR_UNICODE\n  \\fB/<JS>\\fP           PCRE_JAVASCRIPT_COMPAT\n.sp\nThe modifiers that are enclosed in angle brackets are literal strings as shown,\nincluding the angle brackets, but the letters within can be in either case.\nThis example sets multiline matching with CRLF as the line ending sequence:\n.sp\n  /^abc/m<CRLF>\n.sp\nAs well as turning on the PCRE_UTF8/16/32 option, the \\fB/8\\fP modifier causes\nall non-printing characters in output strings to be printed using the\n\\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without\nthe curly brackets.\n.P\nFull details of the PCRE options are given in the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation.\n.\n.\n.SS \"Finding all matches in a string\"\n.rs\n.sp\nSearching for all possible matches within each subject string can be requested\nby the \\fB/g\\fP or \\fB/G\\fP modifier. After finding a match, PCRE is called\nagain to search the remainder of the subject string. The difference between\n\\fB/g\\fP and \\fB/G\\fP is that the former uses the \\fIstartoffset\\fP argument to\n\\fBpcre[16|32]_exec()\\fP to start searching at a new point within the entire\nstring (which is in effect what Perl does), whereas the latter passes over a\nshortened substring. This makes a difference to the matching process if the\npattern begins with a lookbehind assertion (including \\eb or \\eB).\n.P\nIf any call to \\fBpcre[16|32]_exec()\\fP in a \\fB/g\\fP or \\fB/G\\fP sequence matches\nan empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and\nPCRE_ANCHORED flags set in order to search for another, non-empty, match at the\nsame point. If this second match fails, the start offset is advanced, and the\nnormal match is retried. This imitates the way Perl handles such cases when\nusing the \\fB/g\\fP modifier or the \\fBsplit()\\fP function. Normally, the start\noffset is advanced by one character, but if the newline convention recognizes\nCRLF as a newline, and the current character is CR followed by LF, an advance\nof two is used.\n.\n.\n.SS \"Other modifiers\"\n.rs\n.sp\nThere are yet more modifiers for controlling the way \\fBpcretest\\fP\noperates.\n.P\nThe \\fB/+\\fP modifier requests that as well as outputting the substring that\nmatched the entire pattern, \\fBpcretest\\fP should in addition output the\nremainder of the subject string. This is useful for tests where the subject\ncontains multiple copies of the same substring. If the \\fB+\\fP modifier appears\ntwice, the same action is taken for captured substrings. In each case the\nremainder is output on the following line with a plus character following the\ncapture number. Note that this modifier must not immediately follow the /S\nmodifier because /S+ and /S++ have other meanings.\n.P\nThe \\fB/=\\fP modifier requests that the values of all potential captured\nparentheses be output after a match. By default, only those up to the highest\none actually used in the match are output (corresponding to the return code\nfrom \\fBpcre[16|32]_exec()\\fP). Values in the offsets vector corresponding to\nhigher numbers should be set to -1, and these are output as \"<unset>\". This\nmodifier gives a way of checking that this is happening.\n.P\nThe \\fB/B\\fP modifier is a debugging feature. It requests that \\fBpcretest\\fP\noutput a representation of the compiled code after compilation. Normally this\ninformation contains length and offset values; however, if \\fB/Z\\fP is also\npresent, this data is replaced by spaces. This is a special feature for use in\nthe automatic test scripts; it ensures that the same output is generated for\ndifferent internal link sizes.\n.P\nThe \\fB/D\\fP modifier is a PCRE debugging feature, and is equivalent to\n\\fB/BI\\fP, that is, both the \\fB/B\\fP and the \\fB/I\\fP modifiers.\n.P\nThe \\fB/F\\fP modifier causes \\fBpcretest\\fP to flip the byte order of the\n2-byte and 4-byte fields in the compiled pattern. This facility is for testing\nthe feature in PCRE that allows it to execute patterns that were compiled on a\nhost with a different endianness. This feature is not available when the POSIX\ninterface to PCRE is being used, that is, when the \\fB/P\\fP pattern modifier is\nspecified. See also the section about saving and reloading compiled patterns\nbelow.\n.P\nThe \\fB/I\\fP modifier requests that \\fBpcretest\\fP output information about the\ncompiled pattern (whether it is anchored, has a fixed first character, and\nso on). It does this by calling \\fBpcre[16|32]_fullinfo()\\fP after compiling a\npattern. If the pattern is studied, the results of that are also output. In\nthis output, the word \"char\" means a non-UTF character, that is, the value of a\nsingle data item (8-bit, 16-bit, or 32-bit, depending on the library that is\nbeing tested).\n.P\nThe \\fB/K\\fP modifier requests \\fBpcretest\\fP to show names from backtracking\ncontrol verbs that are returned from calls to \\fBpcre[16|32]_exec()\\fP. It causes\n\\fBpcretest\\fP to create a \\fBpcre[16|32]_extra\\fP block if one has not already\nbeen created by a call to \\fBpcre[16|32]_study()\\fP, and to set the\nPCRE_EXTRA_MARK flag and the \\fBmark\\fP field within it, every time that\n\\fBpcre[16|32]_exec()\\fP is called. If the variable that the \\fBmark\\fP field\npoints to is non-NULL for a match, non-match, or partial match, \\fBpcretest\\fP\nprints the string to which it points. For a match, this is shown on a line by\nitself, tagged with \"MK:\". For a non-match it is added to the message.\n.P\nThe \\fB/L\\fP modifier must be followed directly by the name of a locale, for\nexample,\n.sp\n  /pattern/Lfr_FR\n.sp\nFor this reason, it must be the last modifier. The given locale is set,\n\\fBpcre[16|32]_maketables()\\fP is called to build a set of character tables for\nthe locale, and this is then passed to \\fBpcre[16|32]_compile()\\fP when compiling\nthe regular expression. Without an \\fB/L\\fP (or \\fB/T\\fP) modifier, NULL is\npassed as the tables pointer; that is, \\fB/L\\fP applies only to the expression\non which it appears.\n.P\nThe \\fB/M\\fP modifier causes the size in bytes of the memory block used to hold\nthe compiled pattern to be output. This does not include the size of the\n\\fBpcre[16|32]\\fP block; it is just the actual compiled data. If the pattern is\nsuccessfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the\nJIT compiled code is also output.\n.P\nThe \\fB/Q\\fP modifier is used to test the use of \\fBpcre_stack_guard\\fP. It\nmust be followed by '0' or '1', specifying the return code to be given from an\nexternal function that is passed to PCRE and used for stack checking during\ncompilation (see the\n.\\\" HREF\n\\fBpcreapi\\fP\n.\\\"\ndocumentation for details).\n.P\nThe \\fB/S\\fP modifier causes \\fBpcre[16|32]_study()\\fP to be called after the\nexpression has been compiled, and the results used when the expression is\nmatched. There are a number of qualifying characters that may follow \\fB/S\\fP.\nThey may appear in any order.\n.P\nIf \\fB/S\\fP is followed by an exclamation mark, \\fBpcre[16|32]_study()\\fP is\ncalled with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a\n\\fBpcre_extra\\fP block, even when studying discovers no useful information.\n.P\nIf \\fB/S\\fP is followed by a second S character, it suppresses studying, even\nif it was requested externally by the \\fB-s\\fP command line option. This makes\nit possible to specify that certain patterns are always studied, and others are\nnever studied, independently of \\fB-s\\fP. This feature is used in the test\nfiles in a few cases where the output is different when the pattern is studied.\n.P\nIf the \\fB/S\\fP modifier is followed by a + character, the call to\n\\fBpcre[16|32]_study()\\fP is made with all the JIT study options, requesting\njust-in-time optimization support if it is available, for both normal and\npartial matching. If you want to restrict the JIT compiling modes, you can\nfollow \\fB/S+\\fP with a digit in the range 1 to 7:\n.sp\n  1  normal match only\n  2  soft partial match only\n  3  normal match and soft partial match\n  4  hard partial match only\n  6  soft and hard partial match\n  7  all three modes (default)\n.sp\nIf \\fB/S++\\fP is used instead of \\fB/S+\\fP (with or without a following digit),\nthe text \"(JIT)\" is added to the first output line after a match or no match\nwhen JIT-compiled code was actually used.\n.P\nNote that there is also an independent \\fB/+\\fP modifier; it must not be given\nimmediately after \\fB/S\\fP or \\fB/S+\\fP because this will be misinterpreted.\n.P\nIf JIT studying is successful, the compiled JIT code will automatically be used\nwhen \\fBpcre[16|32]_exec()\\fP is run, except when incompatible run-time options\nare specified. For more details, see the\n.\\\" HREF\n\\fBpcrejit\\fP\n.\\\"\ndocumentation. See also the \\fB\\eJ\\fP escape sequence below for a way of\nsetting the size of the JIT stack.\n.P\nFinally, if \\fB/S\\fP is followed by a minus character, JIT compilation is\nsuppressed, even if it was requested externally by the \\fB-s\\fP command line\noption. This makes it possible to specify that JIT is never to be used for\ncertain patterns.\n.P\nThe \\fB/T\\fP modifier must be followed by a single digit. It causes a specific\nset of built-in character tables to be passed to \\fBpcre[16|32]_compile()\\fP. It\nis used in the standard PCRE tests to check behaviour with different character\ntables. The digit specifies the tables as follows:\n.sp\n  0   the default ASCII tables, as distributed in\n        pcre_chartables.c.dist\n  1   a set of tables defining ISO 8859 characters\n.sp\nIn table 1, some characters whose codes are greater than 128 are identified as\nletters, digits, spaces, etc.\n.\n.\n.SS \"Using the POSIX wrapper API\"\n.rs\n.sp\nThe \\fB/P\\fP modifier causes \\fBpcretest\\fP to call PCRE via the POSIX wrapper\nAPI rather than its native API. This supports only the 8-bit library. When\n\\fB/P\\fP is set, the following modifiers set options for the \\fBregcomp()\\fP\nfunction:\n.sp\n  /i    REG_ICASE\n  /m    REG_NEWLINE\n  /N    REG_NOSUB\n  /s    REG_DOTALL     )\n  /U    REG_UNGREEDY   ) These options are not part of\n  /W    REG_UCP        )   the POSIX standard\n  /8    REG_UTF8       )\n.sp\nThe \\fB/+\\fP modifier works as described above. All other modifiers are\nignored.\n.\n.\n.SS \"Locking out certain modifiers\"\n.rs\n.sp\nPCRE can be compiled with or without support for certain features such as\nUTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up\ninto a number of different files that are selected for running depending on\nwhich features are available. When updating the tests, it is all too easy to\nput a new test into the wrong file by mistake; for example, to put a test that\nrequires UTF support into a file that is used when it is not available. To help\ndetect such mistakes as early as possible, there is a facility for locking out\nspecific modifiers. If an input line for \\fBpcretest\\fP starts with the string\n\"< forbid \" the following sequence of characters is taken as a list of\nforbidden modifiers. For example, in the test files that must not use UTF or\nUnicode property support, this line appears:\n.sp\n  < forbid 8W\n.sp\nThis locks out the /8 and /W modifiers. An immediate error is given if they are\nsubsequently encountered. If the character string contains < but not >, all the\nmulti-character modifiers that begin with < are locked out. Otherwise, such\nmodifiers must be explicitly listed, for example:\n.sp\n  < forbid <JS><cr>\n.sp\nThere must be a single space between < and \"forbid\" for this feature to be\nrecognised. If there is not, the line is interpreted either as a request to\nre-load a pre-compiled pattern (see \"SAVING AND RELOADING COMPILED PATTERNS\"\nbelow) or, if there is a another < character, as a pattern that uses < as its\ndelimiter.\n.\n.\n.SH \"DATA LINES\"\n.rs\n.sp\nBefore each data line is passed to \\fBpcre[16|32]_exec()\\fP, leading and trailing\nwhite space is removed, and it is then scanned for \\e escapes. Some of these\nare pretty esoteric features, intended for checking out some of the more\ncomplicated features of PCRE. If you are just testing \"ordinary\" regular\nexpressions, you probably don't need any of these. The following escapes are\nrecognized:\n.sp\n  \\ea         alarm (BEL, \\ex07)\n  \\eb         backspace (\\ex08)\n  \\ee         escape (\\ex27)\n  \\ef         form feed (\\ex0c)\n  \\en         newline (\\ex0a)\n.\\\" JOIN\n  \\eqdd       set the PCRE_MATCH_LIMIT limit to dd\n               (any number of digits)\n  \\er         carriage return (\\ex0d)\n  \\et         tab (\\ex09)\n  \\ev         vertical tab (\\ex0b)\n  \\ennn       octal character (up to 3 octal digits); always\n               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode\n  \\eo{dd...}  octal character (any number of octal digits}\n  \\exhh       hexadecimal byte (up to 2 hex digits)\n  \\ex{hh...}  hexadecimal character (any number of hex digits)\n.\\\" JOIN\n  \\eA         pass the PCRE_ANCHORED option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\eB         pass the PCRE_NOTBOL option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\eCdd       call pcre[16|32]_copy_substring() for substring dd\n               after a successful match (number less than 32)\n.\\\" JOIN\n  \\eCname     call pcre[16|32]_copy_named_substring() for substring\n               \"name\" after a successful match (name termin-\n               ated by next non alphanumeric character)\n.\\\" JOIN\n  \\eC+        show the current captured substrings at callout\n               time\n  \\eC-        do not supply a callout function\n.\\\" JOIN\n  \\eC!n       return 1 instead of 0 when callout number n is\n               reached\n.\\\" JOIN\n  \\eC!n!m     return 1 instead of 0 when callout number n is\n               reached for the nth time\n.\\\" JOIN\n  \\eC*n       pass the number n (may be negative) as callout\n               data; this is used as the callout return value\n  \\eD         use the \\fBpcre[16|32]_dfa_exec()\\fP match function\n  \\eF         only shortest match for \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\eGdd       call pcre[16|32]_get_substring() for substring dd\n               after a successful match (number less than 32)\n.\\\" JOIN\n  \\eGname     call pcre[16|32]_get_named_substring() for substring\n               \"name\" after a successful match (name termin-\n               ated by next non-alphanumeric character)\n.\\\" JOIN\n  \\eJdd       set up a JIT stack of dd kilobytes maximum (any\n               number of digits)\n.\\\" JOIN\n  \\eL         call pcre[16|32]_get_substringlist() after a\n               successful match\n.\\\" JOIN\n  \\eM         discover the minimum MATCH_LIMIT and\n               MATCH_LIMIT_RECURSION settings\n.\\\" JOIN\n  \\eN         pass the PCRE_NOTEMPTY option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP; if used twice, pass the\n               PCRE_NOTEMPTY_ATSTART option\n.\\\" JOIN\n  \\eOdd       set the size of the output vector passed to\n               \\fBpcre[16|32]_exec()\\fP to dd (any number of digits)\n.\\\" JOIN\n  \\eP         pass the PCRE_PARTIAL_SOFT option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP; if used twice, pass the\n               PCRE_PARTIAL_HARD option\n.\\\" JOIN\n  \\eQdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd\n               (any number of digits)\n  \\eR         pass the PCRE_DFA_RESTART option to \\fBpcre[16|32]_dfa_exec()\\fP\n  \\eS         output details of memory get/free calls during matching\n.\\\" JOIN\n  \\eY         pass the PCRE_NO_START_OPTIMIZE option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\eZ         pass the PCRE_NOTEOL option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to\n               \\fBpcre[16|32]_exec()\\fP or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e>dd       start the match at offset dd (optional \"-\"; then\n               any number of digits); this sets the \\fIstartoffset\\fP\n               argument for \\fBpcre[16|32]_exec()\\fP or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e<cr>      pass the PCRE_NEWLINE_CR option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e<lf>      pass the PCRE_NEWLINE_LF option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e<crlf>    pass the PCRE_NEWLINE_CRLF option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.\\\" JOIN\n  \\e<any>     pass the PCRE_NEWLINE_ANY option to \\fBpcre[16|32]_exec()\\fP\n               or \\fBpcre[16|32]_dfa_exec()\\fP\n.sp\nThe use of \\ex{hh...} is not dependent on the use of the \\fB/8\\fP modifier on\nthe pattern. It is recognized always. There may be any number of hexadecimal\ndigits inside the braces; invalid values provoke error messages.\n.P\nNote that \\exhh specifies one byte rather than one character in UTF-8 mode;\nthis makes it possible to construct invalid UTF-8 sequences for testing\npurposes. On the other hand, \\ex{hh} is interpreted as a UTF-8 character in\nUTF-8 mode, generating more than one byte if the value is greater than 127.\nWhen testing the 8-bit library not in UTF-8 mode, \\ex{hh} generates one byte\nfor values less than 256, and causes an error for greater values.\n.P\nIn UTF-16 mode, all 4-digit \\ex{hhhh} values are accepted. This makes it\npossible to construct invalid UTF-16 sequences for testing purposes.\n.P\nIn UTF-32 mode, all 4- to 8-digit \\ex{...} values are accepted. This makes it\npossible to construct invalid UTF-32 sequences for testing purposes.\n.P\nThe escapes that specify line ending sequences are literal strings, exactly as\nshown. No more than one newline setting should be present in any data line.\n.P\nA backslash followed by anything else just escapes the anything else. If\nthe very last character is a backslash, it is ignored. This gives a way of\npassing an empty line as data, since a real empty line terminates the data\ninput.\n.P\nThe \\fB\\eJ\\fP escape provides a way of setting the maximum stack size that is\nused by the just-in-time optimization code. It is ignored if JIT optimization\nis not being used. Providing a stack that is larger than the default 32K is\nnecessary only for very complicated patterns.\n.P\nIf \\eM is present, \\fBpcretest\\fP calls \\fBpcre[16|32]_exec()\\fP several times,\nwith different values in the \\fImatch_limit\\fP and \\fImatch_limit_recursion\\fP\nfields of the \\fBpcre[16|32]_extra\\fP data structure, until it finds the minimum\nnumbers for each parameter that allow \\fBpcre[16|32]_exec()\\fP to complete without\nerror. Because this is testing a specific feature of the normal interpretive\n\\fBpcre[16|32]_exec()\\fP execution, the use of any JIT optimization that might\nhave been set up by the \\fB/S+\\fP qualifier of \\fB-s+\\fP option is disabled.\n.P\nThe \\fImatch_limit\\fP number is a measure of the amount of backtracking\nthat takes place, and checking it out can be instructive. For most simple\nmatches, the number is quite small, but for patterns with very large numbers of\nmatching possibilities, it can become large very quickly with increasing length\nof subject string. The \\fImatch_limit_recursion\\fP number is a measure of how\nmuch stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is\nneeded to complete the match attempt.\n.P\nWhen \\eO is used, the value specified may be higher or lower than the size set\nby the \\fB-O\\fP command line option (or defaulted to 45); \\eO applies only to\nthe call of \\fBpcre[16|32]_exec()\\fP for the line in which it appears.\n.P\nIf the \\fB/P\\fP modifier was present on the pattern, causing the POSIX wrapper\nAPI to be used, the only option-setting sequences that have any effect are \\eB,\n\\eN, and \\eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively,\nto be passed to \\fBregexec()\\fP.\n.\n.\n.SH \"THE ALTERNATIVE MATCHING FUNCTION\"\n.rs\n.sp\nBy default, \\fBpcretest\\fP uses the standard PCRE matching function,\n\\fBpcre[16|32]_exec()\\fP to match each data line. PCRE also supports an\nalternative matching function, \\fBpcre[16|32]_dfa_test()\\fP, which operates in a\ndifferent way, and has some restrictions. The differences between the two\nfunctions are described in the\n.\\\" HREF\n\\fBpcrematching\\fP\n.\\\"\ndocumentation.\n.P\nIf a data line contains the \\eD escape sequence, or if the command line\ncontains the \\fB-dfa\\fP option, the alternative matching function is used.\nThis function finds all possible matches at a given point. If, however, the \\eF\nescape sequence is present in the data line, it stops after the first match is\nfound. This is always the shortest possible match.\n.\n.\n.SH \"DEFAULT OUTPUT FROM PCRETEST\"\n.rs\n.sp\nThis section describes the output when the normal matching function,\n\\fBpcre[16|32]_exec()\\fP, is being used.\n.P\nWhen a match succeeds, \\fBpcretest\\fP outputs the list of captured substrings\nthat \\fBpcre[16|32]_exec()\\fP returns, starting with number 0 for the string that\nmatched the whole pattern. Otherwise, it outputs \"No match\" when the return is\nPCRE_ERROR_NOMATCH, and \"Partial match:\" followed by the partially matching\nsubstring when \\fBpcre[16|32]_exec()\\fP returns PCRE_ERROR_PARTIAL. (Note that\nthis is the entire substring that was inspected during the partial match; it\nmay include characters before the actual match start if a lookbehind assertion,\n\\eK, \\eb, or \\eB was involved.) For any other return, \\fBpcretest\\fP outputs\nthe PCRE negative error number and a short descriptive phrase. If the error is\na failed UTF string check, the offset of the start of the failing character and\nthe reason code are also output, provided that the size of the output vector is\nat least two. Here is an example of an interactive \\fBpcretest\\fP run.\n.sp\n  $ pcretest\n  PCRE version 8.13 2011-04-30\n.sp\n    re> /^abc(\\ed+)/\n  data> abc123\n   0: abc123\n   1: 123\n  data> xyz\n  No match\n.sp\nUnset capturing substrings that are not followed by one that is set are not\nreturned by \\fBpcre[16|32]_exec()\\fP, and are not shown by \\fBpcretest\\fP. In the\nfollowing example, there are two capturing substrings, but when the first data\nline is matched, the second, unset substring is not shown. An \"internal\" unset\nsubstring is shown as \"<unset>\", as for the second data line.\n.sp\n    re> /(a)|(b)/\n  data> a\n   0: a\n   1: a\n  data> b\n   0: b\n   1: <unset>\n   2: b\n.sp\nIf the strings contain any non-printing characters, they are output as \\exhh\nescapes if the value is less than 256 and UTF mode is not set. Otherwise they\nare output as \\ex{hh...} escapes. See below for the definition of non-printing\ncharacters. If the pattern has the \\fB/+\\fP modifier, the output for substring\n0 is followed by the the rest of the subject string, identified by \"0+\" like\nthis:\n.sp\n    re> /cat/+\n  data> cataract\n   0: cat\n   0+ aract\n.sp\nIf the pattern has the \\fB/g\\fP or \\fB/G\\fP modifier, the results of successive\nmatching attempts are output in sequence, like this:\n.sp\n    re> /\\eBi(\\ew\\ew)/g\n  data> Mississippi\n   0: iss\n   1: ss\n   0: iss\n   1: ss\n   0: ipp\n   1: pp\n.sp\n\"No match\" is output only if the first match attempt fails. Here is an example\nof a failure message (the offset 4 that is specified by \\e>4 is past the end of\nthe subject string):\n.sp\n    re> /xyz/\n  data> xyz\\e>4\n  Error -24 (bad offset value)\n.P\nIf any of the sequences \\fB\\eC\\fP, \\fB\\eG\\fP, or \\fB\\eL\\fP are present in a\ndata line that is successfully matched, the substrings extracted by the\nconvenience functions are output with C, G, or L after the string number\ninstead of a colon. This is in addition to the normal full list. The string\nlength (that is, the return from the extraction function) is given in\nparentheses after each string for \\fB\\eC\\fP and \\fB\\eG\\fP.\n.P\nNote that whereas patterns can be continued over several lines (a plain \">\"\nprompt is used for continuations), data lines may not. However newlines can be\nincluded in data by means of the \\en escape (or \\er, \\er\\en, etc., depending on\nthe newline sequence setting).\n.\n.\n.\n.SH \"OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION\"\n.rs\n.sp\nWhen the alternative matching function, \\fBpcre[16|32]_dfa_exec()\\fP, is used (by\nmeans of the \\eD escape sequence or the \\fB-dfa\\fP command line option), the\noutput consists of a list of all the matches that start at the first point in\nthe subject where there is at least one match. For example:\n.sp\n    re> /(tang|tangerine|tan)/\n  data> yellow tangerine\\eD\n   0: tangerine\n   1: tang\n   2: tan\n.sp\n(Using the normal matching function on this data finds only \"tang\".) The\nlongest matching string is always given first (and numbered zero). After a\nPCRE_ERROR_PARTIAL return, the output is \"Partial match:\", followed by the\npartially matching substring. (Note that this is the entire substring that was\ninspected during the partial match; it may include characters before the actual\nmatch start if a lookbehind assertion, \\eK, \\eb, or \\eB was involved.)\n.P\nIf \\fB/g\\fP is present on the pattern, the search for further matches resumes\nat the end of the longest match. For example:\n.sp\n    re> /(tang|tangerine|tan)/g\n  data> yellow tangerine and tangy sultana\\eD\n   0: tangerine\n   1: tang\n   2: tan\n   0: tang\n   1: tan\n   0: tan\n.sp\nSince the matching function does not support substring capture, the escape\nsequences that are concerned with captured substrings are not relevant.\n.\n.\n.SH \"RESTARTING AFTER A PARTIAL MATCH\"\n.rs\n.sp\nWhen the alternative matching function has given the PCRE_ERROR_PARTIAL return,\nindicating that the subject partially matched the pattern, you can restart the\nmatch with additional subject data by means of the \\eR escape sequence. For\nexample:\n.sp\n    re> /^\\ed?\\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\ed\\ed$/\n  data> 23ja\\eP\\eD\n  Partial match: 23ja\n  data> n05\\eR\\eD\n   0: n05\n.sp\nFor further information about partial matching, see the\n.\\\" HREF\n\\fBpcrepartial\\fP\n.\\\"\ndocumentation.\n.\n.\n.SH CALLOUTS\n.rs\n.sp\nIf the pattern contains any callout requests, \\fBpcretest\\fP's callout function\nis called during matching. This works with both matching functions. By default,\nthe called function displays the callout number, the start and current\npositions in the text at the callout time, and the next pattern item to be\ntested. For example:\n.sp\n  --->pqrabcdef\n    0    ^  ^     \\ed\n.sp\nThis output indicates that callout number 0 occurred for a match attempt\nstarting at the fourth character of the subject string, when the pointer was at\nthe seventh character of the data, and when the next pattern item was \\ed. Just\none circumflex is output if the start and current positions are the same.\n.P\nCallouts numbered 255 are assumed to be automatic callouts, inserted as a\nresult of the \\fB/C\\fP pattern modifier. In this case, instead of showing the\ncallout number, the offset in the pattern, preceded by a plus, is output. For\nexample:\n.sp\n    re> /\\ed?[A-E]\\e*/C\n  data> E*\n  --->E*\n   +0 ^      \\ed?\n   +3 ^      [A-E]\n   +8 ^^     \\e*\n  +10 ^ ^\n   0: E*\n.sp\nIf a pattern contains (*MARK) items, an additional line is output whenever\na change of latest mark is passed to the callout function. For example:\n.sp\n    re> /a(*MARK:X)bc/C\n  data> abc\n  --->abc\n   +0 ^       a\n   +1 ^^      (*MARK:X)\n  +10 ^^      b\n  Latest Mark: X\n  +11 ^ ^     c\n  +12 ^  ^\n   0: abc\n.sp\nThe mark changes between matching \"a\" and \"b\", but stays the same for the rest\nof the match, so nothing more is output. If, as a result of backtracking, the\nmark reverts to being unset, the text \"<unset>\" is output.\n.P\nThe callout function in \\fBpcretest\\fP returns zero (carry on matching) by\ndefault, but you can use a \\eC item in a data line (as described above) to\nchange this and other parameters of the callout.\n.P\nInserting callouts can be helpful when using \\fBpcretest\\fP to check\ncomplicated regular expressions. For further information about callouts, see\nthe\n.\\\" HREF\n\\fBpcrecallout\\fP\n.\\\"\ndocumentation.\n.\n.\n.\n.SH \"NON-PRINTING CHARACTERS\"\n.rs\n.sp\nWhen \\fBpcretest\\fP is outputting text in the compiled version of a pattern,\nbytes other than 32-126 are always treated as non-printing characters are are\ntherefore shown as hex escapes.\n.P\nWhen \\fBpcretest\\fP is outputting text that is a matched part of a subject\nstring, it behaves in the same way, unless a different locale has been set for\nthe pattern (using the \\fB/L\\fP modifier). In this case, the \\fBisprint()\\fP\nfunction to distinguish printing and non-printing characters.\n.\n.\n.\n.SH \"SAVING AND RELOADING COMPILED PATTERNS\"\n.rs\n.sp\nThe facilities described in this section are not available when the POSIX\ninterface to PCRE is being used, that is, when the \\fB/P\\fP pattern modifier is\nspecified.\n.P\nWhen the POSIX interface is not in use, you can cause \\fBpcretest\\fP to write a\ncompiled pattern to a file, by following the modifiers with > and a file name.\nFor example:\n.sp\n  /pattern/im >/some/file\n.sp\nSee the\n.\\\" HREF\n\\fBpcreprecompile\\fP\n.\\\"\ndocumentation for a discussion about saving and re-using compiled patterns.\nNote that if the pattern was successfully studied with JIT optimization, the\nJIT data cannot be saved.\n.P\nThe data that is written is binary. The first eight bytes are the length of the\ncompiled pattern data followed by the length of the optional study data, each\nwritten as four bytes in big-endian order (most significant byte first). If\nthere is no study data (either the pattern was not studied, or studying did not\nreturn any data), the second length is zero. The lengths are followed by an\nexact copy of the compiled pattern. If there is additional study data, this\n(excluding any JIT data) follows immediately after the compiled pattern. After\nwriting the file, \\fBpcretest\\fP expects to read a new pattern.\n.P\nA saved pattern can be reloaded into \\fBpcretest\\fP by specifying < and a file\nname instead of a pattern. There must be no space between < and the file name,\nwhich must not contain a < character, as otherwise \\fBpcretest\\fP will\ninterpret the line as a pattern delimited by < characters. For example:\n.sp\n   re> </some/file\n  Compiled pattern loaded from /some/file\n  No study data\n.sp\nIf the pattern was previously studied with the JIT optimization, the JIT\ninformation cannot be saved and restored, and so is lost. When the pattern has\nbeen loaded, \\fBpcretest\\fP proceeds to read data lines in the usual way.\n.P\nYou can copy a file written by \\fBpcretest\\fP to a different host and reload it\nthere, even if the new host has opposite endianness to the one on which the\npattern was compiled. For example, you can compile on an i86 machine and run on\na SPARC machine. When a pattern is reloaded on a host with different\nendianness, the confirmation message is changed to:\n.sp\n  Compiled pattern (byte-inverted) loaded from /some/file\n.sp\nThe test suite contains some saved pre-compiled patterns with different\nendianness. These are reloaded using \"<!\" instead of just \"<\". This suppresses\nthe \"(byte-inverted)\" text so that the output is the same on all hosts. It also\nforces debugging output once the pattern has been reloaded.\n.P\nFile names for saving and reloading can be absolute or relative, but note that\nthe shell facility of expanding a file name that starts with a tilde (~) is not\navailable.\n.P\nThe ability to save and reload files in \\fBpcretest\\fP is intended for testing\nand experimentation. It is not intended for production use because only a\nsingle pattern can be written to a file. Furthermore, there is no facility for\nsupplying custom character tables for use with a reloaded pattern. If the\noriginal pattern was compiled with custom tables, an attempt to match a subject\nstring using a reloaded pattern is likely to cause \\fBpcretest\\fP to crash.\nFinally, if you attempt to load a file that is not in the correct format, the\nresult is undefined.\n.\n.\n.SH \"SEE ALSO\"\n.rs\n.sp\n\\fBpcre\\fP(3), \\fBpcre16\\fP(3), \\fBpcre32\\fP(3), \\fBpcreapi\\fP(3),\n\\fBpcrecallout\\fP(3),\n\\fBpcrejit\\fP, \\fBpcrematching\\fP(3), \\fBpcrepartial\\fP(d),\n\\fBpcrepattern\\fP(3), \\fBpcreprecompile\\fP(3).\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 23 February 2017\nCopyright (c) 1997-2017 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/pcretest.txt",
    "content": "PCRETEST(1)                 General Commands Manual                PCRETEST(1)\n\n\n\nNAME\n       pcretest - a program for testing Perl-compatible regular expressions.\n\nSYNOPSIS\n\n       pcretest [options] [input file [output file]]\n\n       pcretest  was written as a test program for the PCRE regular expression\n       library itself, but it can also be used for experimenting with  regular\n       expressions.  This document describes the features of the test program;\n       for details of the regular expressions themselves, see the  pcrepattern\n       documentation. For details of the PCRE library function calls and their\n       options, see the pcreapi , pcre16 and pcre32 documentation.\n\n       The input for pcretest is a sequence of regular expression patterns and\n       strings  to be matched, as described below. The output shows the result\n       of each match. Options on the command line  and  the  patterns  control\n       PCRE options and exactly what is output.\n\n       As  PCRE has evolved, it has acquired many different features, and as a\n       result, pcretest now has rather a lot of obscure  options  for  testing\n       every possible feature. Some of these options are specifically designed\n       for use in conjunction with the test script and  data  files  that  are\n       distributed  as  part of PCRE, and are unlikely to be of use otherwise.\n       They are all documented here, but without much justification.\n\n\nINPUT DATA FORMAT\n\n       Input to pcretest is processed line by line, either by  calling  the  C\n       library's fgets() function, or via the libreadline library (see below).\n       In Unix-like environments, fgets() treats any bytes other than  newline\n       as  data characters. However, in some Windows environments character 26\n       (hex 1A) causes an immediate end of file, and no further data is  read.\n       For  maximum  portability,  therefore,  it  is safest to use only ASCII\n       characters in pcretest input files.\n\n       The input is processed using using C's string functions,  so  must  not\n       contain  binary  zeroes, even though in Unix-like environments, fgets()\n       treats any bytes other than newline as data characters.\n\n\nPCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES\n\n       From release 8.30, two separate PCRE libraries can be built. The origi-\n       nal  one  supports  8-bit  character  strings, whereas the newer 16-bit\n       library supports  character  strings  encoded  in  16-bit  units.  From\n       release  8.32,  a  third  library  can  be  built, supporting character\n       strings encoded in 32-bit units. The pcretest program can  be  used  to\n       test all three libraries. However, it is itself still an 8-bit program,\n       reading 8-bit input and writing 8-bit output.  When testing the  16-bit\n       or  32-bit  library, the patterns and data strings are converted to 16-\n       or 32-bit format before being passed to  the  PCRE  library  functions.\n       Results are converted to 8-bit for output.\n\n       References to functions and structures of the form pcre[16|32]_xx below\n       mean \"pcre_xx when using the 8-bit library, pcre16_xx  when  using  the\n       16-bit library, or pcre32_xx when using the 32-bit library\".\n\n\nCOMMAND LINE OPTIONS\n\n       -8        If  both the 8-bit library has been built, this option causes\n                 the 8-bit library to be used (which is the default);  if  the\n                 8-bit  library  has  not  been  built,  this option causes an\n                 error.\n\n       -16       If both the 8-bit or the 32-bit,  and  the  16-bit  libraries\n                 have  been built, this option causes the 16-bit library to be\n                 used. If only the 16-bit library has been built, this is  the\n                 default  (so  has no effect). If only the 8-bit or the 32-bit\n                 library has been built, this option causes an error.\n\n       -32       If both the 8-bit or the 16-bit,  and  the  32-bit  libraries\n                 have  been built, this option causes the 32-bit library to be\n                 used. If only the 32-bit library has been built, this is  the\n                 default  (so  has no effect). If only the 8-bit or the 16-bit\n                 library has been built, this option causes an error.\n\n       -b        Behave as if each pattern has the /B (show byte  code)  modi-\n                 fier; the internal form is output after compilation.\n\n       -C        Output the version number of the PCRE library, and all avail-\n                 able  information  about  the  optional  features  that   are\n                 included,  and  then  exit  with  zero  exit  code. All other\n                 options are ignored.\n\n       -C option Output information about a specific build-time  option,  then\n                 exit.  This functionality is intended for use in scripts such\n                 as RunTest. The following options output the  value  and  set\n                 the exit code as indicated:\n\n                   ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:\n                                0x15 or 0x25\n                                0 if used in an ASCII environment\n                                exit code is always 0\n                   linksize   the configured internal link size (2, 3, or 4)\n                                exit code is set to the link size\n                   newline    the default newline setting:\n                                CR, LF, CRLF, ANYCRLF, or ANY\n                                exit code is always 0\n                   bsr        the default setting for what \\R matches:\n                                ANYCRLF or ANY\n                                exit code is always 0\n\n                 The  following  options output 1 for true or 0 for false, and\n                 set the exit code to the same value:\n\n                   ebcdic     compiled for an EBCDIC environment\n                   jit        just-in-time support is available\n                   pcre16     the 16-bit library was built\n                   pcre32     the 32-bit library was built\n                   pcre8      the 8-bit library was built\n                   ucp        Unicode property support is available\n                   utf        UTF-8 and/or UTF-16 and/or UTF-32 support\n                                is available\n\n                 If an unknown option is given, an error  message  is  output;\n                 the exit code is 0.\n\n       -d        Behave  as  if  each pattern has the /D (debug) modifier; the\n                 internal form and information about the compiled  pattern  is\n                 output after compilation; -d is equivalent to -b -i.\n\n       -dfa      Behave  as if each data line contains the \\D escape sequence;\n                 this    causes    the    alternative    matching    function,\n                 pcre[16|32]_dfa_exec(),  to  be  used instead of the standard\n                 pcre[16|32]_exec() function (more detail is given below).\n\n       -help     Output a brief summary these options and then exit.\n\n       -i        Behave as if each pattern has the  /I  modifier;  information\n                 about the compiled pattern is given after compilation.\n\n       -M        Behave  as if each data line contains the \\M escape sequence;\n                 this causes PCRE to  discover  the  minimum  MATCH_LIMIT  and\n                 MATCH_LIMIT_RECURSION  settings by calling pcre[16|32]_exec()\n                 repeatedly with different limits.\n\n       -m        Output the size of each compiled pattern after  it  has  been\n                 compiled.  This  is  equivalent  to adding /M to each regular\n                 expression. The size is given in bytes for both libraries.\n\n       -O        Behave as if each pattern has the /O modifier, that  is  dis-\n                 able auto-possessification for all patterns.\n\n       -o osize  Set  the number of elements in the output vector that is used\n                 when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec()  to\n                 be  osize.  The  default  value is 45, which is enough for 14\n                 capturing subexpressions for pcre[16|32]_exec() or 22 differ-\n                 ent  matches for pcre[16|32]_dfa_exec().  The vector size can\n                 be changed for individual matching calls by including  \\O  in\n                 the data line (see below).\n\n       -p        Behave  as  if  each  pattern  has the /P modifier; the POSIX\n                 wrapper API is used to call PCRE. None of the  other  options\n                 has  any  effect when -p is set. This option can be used only\n                 with the 8-bit library.\n\n       -q        Do not output the version number of pcretest at the start  of\n                 execution.\n\n       -S size   On  Unix-like  systems, set the size of the run-time stack to\n                 size megabytes.\n\n       -s or -s+ Behave as if each pattern  has  the  /S  modifier;  in  other\n                 words,  force each pattern to be studied. If -s+ is used, all\n                 the JIT compile options are  passed  to  pcre[16|32]_study(),\n                 causing  just-in-time  optimization  to  be  set  up if it is\n                 available, for both full and partial matching.  Specific  JIT\n                 compile options can be selected by following -s+ with a digit\n                 in the range 1 to 7, which selects the JIT compile  modes  as\n                 follows:\n\n                   1  normal match only\n                   2  soft partial match only\n                   3  normal match and soft partial match\n                   4  hard partial match only\n                   6  soft and hard partial match\n                   7  all three modes (default)\n\n                 If  -s++  is used instead of -s+ (with or without a following\n                 digit), the text \"(JIT)\" is added to the  first  output  line\n                 after a match or no match when JIT-compiled code was actually\n                 used.\n\n                 Note that there are pattern options  that  can  override  -s,\n                 either specifying no studying at all, or suppressing JIT com-\n                 pilation.\n\n                 If the /I or /D option is present on  a  pattern  (requesting\n                 output  about  the  compiled  pattern), information about the\n                 result of studying is not included when  studying  is  caused\n                 only  by  -s  and neither -i nor -d is present on the command\n                 line. This behaviour means that the output  from  tests  that\n                 are  run with and without -s should be identical, except when\n                 options that output information about the actual running of a\n                 match are set.\n\n                 The  -M,  -t,  and  -tm options, which give information about\n                 resources used, are likely to produce different  output  with\n                 and  without  -s.  Output may also differ if the /C option is\n                 present on an individual pattern. This uses callouts to trace\n                 the  the  matching process, and this may be different between\n                 studied and non-studied patterns.  If  the  pattern  contains\n                 (*MARK)  items  there  may  also be differences, for the same\n                 reason. The -s command line option can be overridden for spe-\n                 cific  patterns that should never be studied (see the /S pat-\n                 tern modifier below).\n\n       -t        Run each compile, study, and match many times with  a  timer,\n                 and  output  the resulting times per compile, study, or match\n                 (in milliseconds). Do not set -m with -t,  because  you  will\n                 then get the size output a zillion times, and the timing will\n                 be distorted. You can control the number of  iterations  that\n                 are used for timing by following -t with a number (as a sepa-\n                 rate item on the command line). For example, \"-t 1000\"  iter-\n                 ates 1000 times.  The default is to iterate 500000 times.\n\n       -tm       This is like -t except that it times only the matching phase,\n                 not the compile or study phases.\n\n       -T -TM    These behave like -t and -tm, but in addition, at the end  of\n                 a run, the total times for all compiles, studies, and matches\n                 are output.\n\n\nDESCRIPTION\n\n       If pcretest is given two filename arguments, it reads  from  the  first\n       and writes to the second. If it is given only one filename argument, it\n       reads from that file and writes to stdout.  Otherwise,  it  reads  from\n       stdin  and  writes to stdout, and prompts for each line of input, using\n       \"re>\" to prompt for regular expressions, and \"data>\" to prompt for data\n       lines.\n\n       When  pcretest  is  built,  a  configuration option can specify that it\n       should be linked with the libreadline library. When this  is  done,  if\n       the input is from a terminal, it is read using the readline() function.\n       This provides line-editing and history facilities. The output from  the\n       -help option states whether or not readline() will be used.\n\n       The program handles any number of sets of input on a single input file.\n       Each set starts with a regular expression, and continues with any  num-\n       ber of data lines to be matched against that pattern.\n\n       Each  data line is matched separately and independently. If you want to\n       do multi-line matches, you have to use the \\n escape sequence (or \\r or\n       \\r\\n, etc., depending on the newline setting) in a single line of input\n       to encode the newline sequences. There is no limit  on  the  length  of\n       data  lines;  the  input  buffer is automatically extended if it is too\n       small.\n\n       An empty line signals the end of the data lines, at which point  a  new\n       regular  expression is read. The regular expressions are given enclosed\n       in any non-alphanumeric delimiters other than backslash, for example:\n\n         /(a|bc)x+yz/\n\n       White space before the initial delimiter is ignored. A regular  expres-\n       sion  may be continued over several input lines, in which case the new-\n       line characters are included within it. It is possible to  include  the\n       delimiter within the pattern by escaping it, for example\n\n         /abc\\/def/\n\n       If  you  do  so, the escape and the delimiter form part of the pattern,\n       but since delimiters are always non-alphanumeric, this does not  affect\n       its  interpretation.   If the terminating delimiter is immediately fol-\n       lowed by a backslash, for example,\n\n         /abc/\\\n\n       then a backslash is added to the end of the pattern. This  is  done  to\n       provide  a  way of testing the error condition that arises if a pattern\n       finishes with a backslash, because\n\n         /abc\\/\n\n       is interpreted as the first line of a pattern that starts with  \"abc/\",\n       causing pcretest to read the next line as a continuation of the regular\n       expression.\n\n\nPATTERN MODIFIERS\n\n       A pattern may be followed by any number of modifiers, which are  mostly\n       single  characters,  though  some  of these can be qualified by further\n       characters.  Following Perl usage, these are referred to below as,  for\n       example,  \"the  /i  modifier\", even though the delimiter of the pattern\n       need not always be a slash, and no slash is  used  when  writing  modi-\n       fiers.  White  space may appear between the final pattern delimiter and\n       the first modifier, and between the modifiers  themselves.  For  refer-\n       ence,  here  is  a  complete  list of modifiers. They fall into several\n       groups that are described in detail in the following sections.\n\n         /8              set UTF mode\n         /9              set PCRE_NEVER_UTF (locks out UTF mode)\n         /?              disable UTF validity check\n         /+              show remainder of subject after match\n         /=              show all captures (not just those that are set)\n\n         /A              set PCRE_ANCHORED\n         /B              show compiled code\n         /C              set PCRE_AUTO_CALLOUT\n         /D              same as /B plus /I\n         /E              set PCRE_DOLLAR_ENDONLY\n         /F              flip byte order in compiled pattern\n         /f              set PCRE_FIRSTLINE\n         /G              find all matches (shorten string)\n         /g              find all matches (use startoffset)\n         /I              show information about pattern\n         /i              set PCRE_CASELESS\n         /J              set PCRE_DUPNAMES\n         /K              show backtracking control names\n         /L              set locale\n         /M              show compiled memory size\n         /m              set PCRE_MULTILINE\n         /N              set PCRE_NO_AUTO_CAPTURE\n         /O              set PCRE_NO_AUTO_POSSESS\n         /P              use the POSIX wrapper\n         /Q              test external stack check function\n         /S              study the pattern after compilation\n         /s              set PCRE_DOTALL\n         /T              select character tables\n         /U              set PCRE_UNGREEDY\n         /W              set PCRE_UCP\n         /X              set PCRE_EXTRA\n         /x              set PCRE_EXTENDED\n         /Y              set PCRE_NO_START_OPTIMIZE\n         /Z              don't show lengths in /B output\n\n         /<any>          set PCRE_NEWLINE_ANY\n         /<anycrlf>      set PCRE_NEWLINE_ANYCRLF\n         /<cr>           set PCRE_NEWLINE_CR\n         /<crlf>         set PCRE_NEWLINE_CRLF\n         /<lf>           set PCRE_NEWLINE_LF\n         /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF\n         /<bsr_unicode>  set PCRE_BSR_UNICODE\n         /<JS>           set PCRE_JAVASCRIPT_COMPAT\n\n\n   Perl-compatible modifiers\n\n       The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE,\n       PCRE_DOTALL,    or    PCRE_EXTENDED    options,    respectively,   when\n       pcre[16|32]_compile() is called. These four modifier letters  have  the\n       same effect as they do in Perl. For example:\n\n         /caseless/i\n\n\n   Modifiers for other PCRE options\n\n       The  following  table  shows additional modifiers for setting PCRE com-\n       pile-time options that do not correspond to anything in Perl:\n\n         /8              PCRE_UTF8           ) when using the 8-bit\n         /?              PCRE_NO_UTF8_CHECK  )   library\n\n         /8              PCRE_UTF16          ) when using the 16-bit\n         /?              PCRE_NO_UTF16_CHECK )   library\n\n         /8              PCRE_UTF32          ) when using the 32-bit\n         /?              PCRE_NO_UTF32_CHECK )   library\n\n         /9              PCRE_NEVER_UTF\n         /A              PCRE_ANCHORED\n         /C              PCRE_AUTO_CALLOUT\n         /E              PCRE_DOLLAR_ENDONLY\n         /f              PCRE_FIRSTLINE\n         /J              PCRE_DUPNAMES\n         /N              PCRE_NO_AUTO_CAPTURE\n         /O              PCRE_NO_AUTO_POSSESS\n         /U              PCRE_UNGREEDY\n         /W              PCRE_UCP\n         /X              PCRE_EXTRA\n         /Y              PCRE_NO_START_OPTIMIZE\n         /<any>          PCRE_NEWLINE_ANY\n         /<anycrlf>      PCRE_NEWLINE_ANYCRLF\n         /<cr>           PCRE_NEWLINE_CR\n         /<crlf>         PCRE_NEWLINE_CRLF\n         /<lf>           PCRE_NEWLINE_LF\n         /<bsr_anycrlf>  PCRE_BSR_ANYCRLF\n         /<bsr_unicode>  PCRE_BSR_UNICODE\n         /<JS>           PCRE_JAVASCRIPT_COMPAT\n\n       The modifiers that are enclosed in angle brackets are  literal  strings\n       as  shown,  including the angle brackets, but the letters within can be\n       in either case.  This example sets multiline matching with CRLF as  the\n       line ending sequence:\n\n         /^abc/m<CRLF>\n\n       As  well  as  turning  on  the  PCRE_UTF8/16/32 option, the /8 modifier\n       causes all non-printing characters in  output  strings  to  be  printed\n       using the \\x{hh...} notation. Otherwise, those less than 0x100 are out-\n       put in hex without the curly brackets.\n\n       Full details of the PCRE options are given in  the  pcreapi  documenta-\n       tion.\n\n   Finding all matches in a string\n\n       Searching  for  all  possible matches within each subject string can be\n       requested by the /g or /G modifier. After  finding  a  match,  PCRE  is\n       called again to search the remainder of the subject string. The differ-\n       ence between /g and /G is that the former uses the startoffset argument\n       to  pcre[16|32]_exec()  to  start  searching  at a new point within the\n       entire string (which is in effect what Perl does), whereas  the  latter\n       passes  over  a  shortened  substring.  This  makes a difference to the\n       matching process if the pattern  begins  with  a  lookbehind  assertion\n       (including \\b or \\B).\n\n       If  any  call  to  pcre[16|32]_exec() in a /g or /G sequence matches an\n       empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART  and\n       PCRE_ANCHORED  flags  set  in  order  to search for another, non-empty,\n       match at the same point. If this second match fails, the  start  offset\n       is  advanced,  and  the  normal match is retried. This imitates the way\n       Perl handles such cases when using the /g modifier or the split() func-\n       tion.  Normally,  the start offset is advanced by one character, but if\n       the newline convention recognizes CRLF as a newline,  and  the  current\n       character is CR followed by LF, an advance of two is used.\n\n   Other modifiers\n\n       There are yet more modifiers for controlling the way pcretest operates.\n\n       The  /+ modifier requests that as well as outputting the substring that\n       matched the entire pattern, pcretest  should  in  addition  output  the\n       remainder  of  the  subject  string. This is useful for tests where the\n       subject contains multiple copies of the same substring. If the +  modi-\n       fier  appears  twice, the same action is taken for captured substrings.\n       In each case the remainder is output on the following line with a  plus\n       character  following  the  capture number. Note that this modifier must\n       not immediately follow the /S modifier because /S+ and /S++ have  other\n       meanings.\n\n       The  /=  modifier  requests  that  the values of all potential captured\n       parentheses be output after a match. By default, only those up  to  the\n       highest one actually used in the match are output (corresponding to the\n       return code from pcre[16|32]_exec()). Values in the offsets vector cor-\n       responding  to higher numbers should be set to -1, and these are output\n       as \"<unset>\". This modifier gives a way of checking that this  is  hap-\n       pening.\n\n       The  /B modifier is a debugging feature. It requests that pcretest out-\n       put a representation of the compiled code after  compilation.  Normally\n       this  information  contains length and offset values; however, if /Z is\n       also present, this data is replaced by spaces. This is a  special  fea-\n       ture  for  use  in the automatic test scripts; it ensures that the same\n       output is generated for different internal link sizes.\n\n       The /D modifier is a PCRE debugging feature, and is equivalent to  /BI,\n       that is, both the /B and the /I modifiers.\n\n       The  /F  modifier  causes pcretest to flip the byte order of the 2-byte\n       and 4-byte fields in the compiled pattern. This facility is for testing\n       the  feature  in PCRE that allows it to execute patterns that were com-\n       piled on a host with a different endianness. This feature is not avail-\n       able  when the POSIX interface to PCRE is being used, that is, when the\n       /P pattern modifier is specified. See also the section about saving and\n       reloading compiled patterns below.\n\n       The  /I  modifier  requests  that pcretest output information about the\n       compiled pattern (whether it is anchored, has a fixed first  character,\n       and  so  on). It does this by calling pcre[16|32]_fullinfo() after com-\n       piling a pattern. If the pattern is studied, the results  of  that  are\n       also output. In this output, the word \"char\" means a non-UTF character,\n       that is, the value of a single data item  (8-bit,  16-bit,  or  32-bit,\n       depending on the library that is being tested).\n\n       The  /K modifier requests pcretest to show names from backtracking con-\n       trol verbs that are  returned  from  calls  to  pcre[16|32]_exec().  It\n       causes  pcretest  to  create  a  pcre[16|32]_extra block if one has not\n       already been created by a call to pcre[16|32]_study(), and to  set  the\n       PCRE_EXTRA_MARK  flag  and  the  mark  field within it, every time that\n       pcre[16|32]_exec() is called. If  the  variable  that  the  mark  field\n       points  to  is  non-NULL  for  a  match,  non-match,  or partial match,\n       pcretest prints the string to which it points. For  a  match,  this  is\n       shown  on  a  line  by itself, tagged with \"MK:\". For a non-match it is\n       added to the message.\n\n       The /L modifier must be followed directly by the name of a locale,  for\n       example,\n\n         /pattern/Lfr_FR\n\n       For this reason, it must be the last modifier. The given locale is set,\n       pcre[16|32]_maketables() is called to build a set of  character  tables\n       for  the  locale, and this is then passed to pcre[16|32]_compile() when\n       compiling the regular expression. Without an /L (or /T) modifier,  NULL\n       is  passed  as  the  tables  pointer;  that  is, /L applies only to the\n       expression on which it appears.\n\n       The /M modifier causes the size in bytes of the memory  block  used  to\n       hold  the compiled pattern to be output. This does not include the size\n       of the pcre[16|32] block; it is just the actual compiled data.  If  the\n       pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option,\n       the size of the JIT compiled code is also output.\n\n       The /Q modifier is used to test the use of pcre_stack_guard. It must be\n       followed  by '0' or '1', specifying the return code to be given from an\n       external function that is passed to PCRE and used  for  stack  checking\n       during compilation (see the pcreapi documentation for details).\n\n       The  /S  modifier  causes  pcre[16|32]_study()  to  be called after the\n       expression has been compiled, and the results used when the  expression\n       is matched. There are a number of qualifying characters that may follow\n       /S.  They may appear in any order.\n\n       If /S is followed by an exclamation mark, pcre[16|32]_study() is called\n       with  the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a\n       pcre_extra block, even when studying discovers no useful information.\n\n       If /S is followed by a second S character, it suppresses studying, even\n       if  it  was  requested  externally  by the -s command line option. This\n       makes it possible to specify that certain patterns are always  studied,\n       and others are never studied, independently of -s. This feature is used\n       in the test files in a few cases where the output is different when the\n       pattern is studied.\n\n       If  the  /S  modifier  is  followed  by  a  +  character,  the  call to\n       pcre[16|32]_study() is made with all the JIT study options,  requesting\n       just-in-time  optimization  support if it is available, for both normal\n       and partial matching. If you want to restrict the JIT compiling  modes,\n       you can follow /S+ with a digit in the range 1 to 7:\n\n         1  normal match only\n         2  soft partial match only\n         3  normal match and soft partial match\n         4  hard partial match only\n         6  soft and hard partial match\n         7  all three modes (default)\n\n       If /S++ is used instead of /S+ (with or without a following digit), the\n       text \"(JIT)\" is added to the first output line  after  a  match  or  no\n       match when JIT-compiled code was actually used.\n\n       Note  that  there  is  also  an independent /+ modifier; it must not be\n       given immediately after /S or /S+ because this will be misinterpreted.\n\n       If JIT studying is successful, the compiled JIT code will automatically\n       be  used  when pcre[16|32]_exec() is run, except when incompatible run-\n       time options are specified. For more details, see the pcrejit  documen-\n       tation.  See also the \\J escape sequence below for a way of setting the\n       size of the JIT stack.\n\n       Finally, if /S is followed by a minus  character,  JIT  compilation  is\n       suppressed,  even if it was requested externally by the -s command line\n       option. This makes it possible to specify that JIT is never to be  used\n       for certain patterns.\n\n       The  /T  modifier  must be followed by a single digit. It causes a spe-\n       cific set of built-in character tables to be passed to pcre[16|32]_com-\n       pile().  It  is used in the standard PCRE tests to check behaviour with\n       different character tables. The digit specifies the tables as follows:\n\n         0   the default ASCII tables, as distributed in\n               pcre_chartables.c.dist\n         1   a set of tables defining ISO 8859 characters\n\n       In table 1, some characters whose codes are greater than 128 are  iden-\n       tified as letters, digits, spaces, etc.\n\n   Using the POSIX wrapper API\n\n       The  /P modifier causes pcretest to call PCRE via the POSIX wrapper API\n       rather than its native API. This supports only the 8-bit library.  When\n       /P  is set, the following modifiers set options for the regcomp() func-\n       tion:\n\n         /i    REG_ICASE\n         /m    REG_NEWLINE\n         /N    REG_NOSUB\n         /s    REG_DOTALL     )\n         /U    REG_UNGREEDY   ) These options are not part of\n         /W    REG_UCP        )   the POSIX standard\n         /8    REG_UTF8       )\n\n       The /+ modifier works as  described  above.  All  other  modifiers  are\n       ignored.\n\n   Locking out certain modifiers\n\n       PCRE  can be compiled with or without support for certain features such\n       as UTF-8/16/32 or Unicode properties. Accordingly, the  standard  tests\n       are  split  up  into  a number of different files that are selected for\n       running depending on which features are available.  When  updating  the\n       tests, it is all too easy to put a new test into the wrong file by mis-\n       take; for example, to put a test that requires UTF support into a  file\n       that  is used when it is not available. To help detect such mistakes as\n       early as possible, there is a facility for locking out  specific  modi-\n       fiers. If an input line for pcretest starts with the string \"< forbid \"\n       the following sequence of characters is taken as a  list  of  forbidden\n       modifiers. For example, in the test files that must not use UTF or Uni-\n       code property support, this line appears:\n\n         < forbid 8W\n\n       This locks out the /8 and /W modifiers. An immediate error is given  if\n       they  are  subsequently encountered. If the character string contains <\n       but not >, all the multi-character modifiers  that  begin  with  <  are\n       locked  out.  Otherwise,  such modifiers must be explicitly listed, for\n       example:\n\n         < forbid <JS><cr>\n\n       There must be a single space between < and \"forbid\" for this feature to\n       be  recognised.  If  there  is not, the line is interpreted either as a\n       request to re-load a pre-compiled pattern (see  \"SAVING  AND  RELOADING\n       COMPILED  PATTERNS\"  below) or, if there is a another < character, as a\n       pattern that uses < as its delimiter.\n\n\nDATA LINES\n\n       Before each data line is  passed  to  pcre[16|32]_exec(),  leading  and\n       trailing  white space is removed, and it is then scanned for \\ escapes.\n       Some of these are pretty esoteric features, intended for  checking  out\n       some  of the more complicated features of PCRE. If you are just testing\n       \"ordinary\" regular expressions, you probably don't need any  of  these.\n       The following escapes are recognized:\n\n         \\a         alarm (BEL, \\x07)\n         \\b         backspace (\\x08)\n         \\e         escape (\\x27)\n         \\f         form feed (\\x0c)\n         \\n         newline (\\x0a)\n         \\qdd       set the PCRE_MATCH_LIMIT limit to dd\n                      (any number of digits)\n         \\r         carriage return (\\x0d)\n         \\t         tab (\\x09)\n         \\v         vertical tab (\\x0b)\n         \\nnn       octal character (up to 3 octal digits); always\n                      a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode\n         \\o{dd...}  octal character (any number of octal digits}\n         \\xhh       hexadecimal byte (up to 2 hex digits)\n         \\x{hh...}  hexadecimal character (any number of hex digits)\n         \\A         pass the PCRE_ANCHORED option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\B         pass the PCRE_NOTBOL option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\Cdd       call pcre[16|32]_copy_substring() for substring dd\n                      after a successful match (number less than 32)\n         \\Cname     call pcre[16|32]_copy_named_substring() for substring\n                      \"name\" after a successful match (name termin-\n                      ated by next non alphanumeric character)\n         \\C+        show the current captured substrings at callout\n                      time\n         \\C-        do not supply a callout function\n         \\C!n       return 1 instead of 0 when callout number n is\n                      reached\n         \\C!n!m     return 1 instead of 0 when callout number n is\n                      reached for the nth time\n         \\C*n       pass the number n (may be negative) as callout\n                      data; this is used as the callout return value\n         \\D         use the pcre[16|32]_dfa_exec() match function\n         \\F         only shortest match for pcre[16|32]_dfa_exec()\n         \\Gdd       call pcre[16|32]_get_substring() for substring dd\n                      after a successful match (number less than 32)\n         \\Gname     call pcre[16|32]_get_named_substring() for substring\n                      \"name\" after a successful match (name termin-\n                      ated by next non-alphanumeric character)\n         \\Jdd       set up a JIT stack of dd kilobytes maximum (any\n                      number of digits)\n         \\L         call pcre[16|32]_get_substringlist() after a\n                      successful match\n         \\M         discover the minimum MATCH_LIMIT and\n                      MATCH_LIMIT_RECURSION settings\n         \\N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec(); if used twice, pass the\n                      PCRE_NOTEMPTY_ATSTART option\n         \\Odd       set the size of the output vector passed to\n                      pcre[16|32]_exec() to dd (any number of digits)\n         \\P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec(); if used twice, pass the\n                      PCRE_PARTIAL_HARD option\n         \\Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd\n                      (any number of digits)\n         \\R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()\n         \\S         output details of memory get/free calls during matching\n         \\Y             pass     the    PCRE_NO_START_OPTIMIZE    option    to\n       pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to\n                      pcre[16|32]_exec() or pcre[16|32]_dfa_exec()\n         \\>dd       start the match at offset dd (optional \"-\"; then\n                      any number of digits); this sets the startoffset\n                      argument        for        pcre[16|32]_exec()         or\n       pcre[16|32]_dfa_exec()\n         \\<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n         \\<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec()\n                      or pcre[16|32]_dfa_exec()\n\n       The  use of \\x{hh...} is not dependent on the use of the /8 modifier on\n       the pattern. It is recognized always. There may be any number of  hexa-\n       decimal  digits  inside  the  braces; invalid values provoke error mes-\n       sages.\n\n       Note that \\xhh specifies one byte rather than one  character  in  UTF-8\n       mode;  this  makes it possible to construct invalid UTF-8 sequences for\n       testing purposes. On the other hand, \\x{hh} is interpreted as  a  UTF-8\n       character  in UTF-8 mode, generating more than one byte if the value is\n       greater than 127.  When testing the 8-bit library not  in  UTF-8  mode,\n       \\x{hh} generates one byte for values less than 256, and causes an error\n       for greater values.\n\n       In UTF-16 mode, all 4-digit \\x{hhhh} values are accepted. This makes it\n       possible to construct invalid UTF-16 sequences for testing purposes.\n\n       In  UTF-32  mode,  all  4- to 8-digit \\x{...} values are accepted. This\n       makes it possible to construct invalid  UTF-32  sequences  for  testing\n       purposes.\n\n       The  escapes  that  specify  line ending sequences are literal strings,\n       exactly as shown. No more than one newline setting should be present in\n       any data line.\n\n       A  backslash  followed by anything else just escapes the anything else.\n       If the very last character is a backslash, it is ignored. This gives  a\n       way  of  passing  an empty line as data, since a real empty line termi-\n       nates the data input.\n\n       The \\J escape provides a way of setting the maximum stack size that  is\n       used  by the just-in-time optimization code. It is ignored if JIT opti-\n       mization is not being used. Providing a stack that is larger  than  the\n       default 32K is necessary only for very complicated patterns.\n\n       If \\M is present, pcretest calls pcre[16|32]_exec() several times, with\n       different values in the match_limit and match_limit_recursion fields of\n       the  pcre[16|32]_extra  data structure, until it finds the minimum num-\n       bers for each parameter that allow pcre[16|32]_exec() to complete with-\n       out  error.  Because  this  is testing a specific feature of the normal\n       interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza-\n       tion  that might have been set up by the /S+ qualifier of -s+ option is\n       disabled.\n\n       The match_limit number is a measure of the amount of backtracking  that\n       takes  place,  and  checking it out can be instructive. For most simple\n       matches, the number is quite small, but for patterns  with  very  large\n       numbers  of  matching  possibilities,  it can become large very quickly\n       with increasing length of  subject  string.  The  match_limit_recursion\n       number  is  a  measure  of how much stack (or, if PCRE is compiled with\n       NO_RECURSE, how much heap) memory  is  needed  to  complete  the  match\n       attempt.\n\n       When  \\O  is  used, the value specified may be higher or lower than the\n       size set by the -O command line option (or defaulted to 45); \\O applies\n       only  to  the  call  of  pcre[16|32]_exec()  for  the  line in which it\n       appears.\n\n       If the /P modifier was present on the pattern, causing the POSIX  wrap-\n       per  API  to  be  used, the only option-setting sequences that have any\n       effect are \\B,  \\N,  and  \\Z,  causing  REG_NOTBOL,  REG_NOTEMPTY,  and\n       REG_NOTEOL, respectively, to be passed to regexec().\n\n\nTHE ALTERNATIVE MATCHING FUNCTION\n\n       By   default,  pcretest  uses  the  standard  PCRE  matching  function,\n       pcre[16|32]_exec() to match each  data  line.  PCRE  also  supports  an\n       alternative  matching  function, pcre[16|32]_dfa_test(), which operates\n       in a different way, and has some restrictions. The differences  between\n       the two functions are described in the pcrematching documentation.\n\n       If  a data line contains the \\D escape sequence, or if the command line\n       contains the -dfa option, the alternative matching  function  is  used.\n       This function finds all possible matches at a given point. If, however,\n       the \\F escape sequence is present in the data line, it stops after  the\n       first match is found. This is always the shortest possible match.\n\n\nDEFAULT OUTPUT FROM PCRETEST\n\n       This  section  describes  the output when the normal matching function,\n       pcre[16|32]_exec(), is being used.\n\n       When a match succeeds, pcretest outputs the list of captured substrings\n       that  pcre[16|32]_exec() returns, starting with number 0 for the string\n       that matched the whole pattern. Otherwise, it outputs \"No  match\"  when\n       the  return is PCRE_ERROR_NOMATCH, and \"Partial match:\" followed by the\n       partially   matching   substring   when   pcre[16|32]_exec()    returns\n       PCRE_ERROR_PARTIAL.  (Note  that  this is the entire substring that was\n       inspected during the partial match; it may  include  characters  before\n       the  actual  match  start  if a lookbehind assertion, \\K, \\b, or \\B was\n       involved.) For any other return, pcretest  outputs  the  PCRE  negative\n       error  number  and a short descriptive phrase. If the error is a failed\n       UTF string check, the offset of the start of the failing character  and\n       the  reason  code are also output, provided that the size of the output\n       vector is at least two. Here is an example of an  interactive  pcretest\n       run.\n\n         $ pcretest\n         PCRE version 8.13 2011-04-30\n\n           re> /^abc(\\d+)/\n         data> abc123\n          0: abc123\n          1: 123\n         data> xyz\n         No match\n\n       Unset capturing substrings that are not followed by one that is set are\n       not returned by pcre[16|32]_exec(), and are not shown by  pcretest.  In\n       the following example, there are two capturing substrings, but when the\n       first data line is matched, the second, unset substring is  not  shown.\n       An  \"internal\" unset substring is shown as \"<unset>\", as for the second\n       data line.\n\n           re> /(a)|(b)/\n         data> a\n          0: a\n          1: a\n         data> b\n          0: b\n          1: <unset>\n          2: b\n\n       If the strings contain any non-printing characters, they are output  as\n       \\xhh  escapes  if  the  value is less than 256 and UTF mode is not set.\n       Otherwise they are output as \\x{hh...} escapes. See below for the defi-\n       nition  of non-printing characters. If the pattern has the /+ modifier,\n       the output for substring 0 is followed by the the rest of  the  subject\n       string, identified by \"0+\" like this:\n\n           re> /cat/+\n         data> cataract\n          0: cat\n          0+ aract\n\n       If  the  pattern  has  the /g or /G modifier, the results of successive\n       matching attempts are output in sequence, like this:\n\n           re> /\\Bi(\\w\\w)/g\n         data> Mississippi\n          0: iss\n          1: ss\n          0: iss\n          1: ss\n          0: ipp\n          1: pp\n\n       \"No match\" is output only if the first match attempt fails. Here is  an\n       example  of a failure message (the offset 4 that is specified by \\>4 is\n       past the end of the subject string):\n\n           re> /xyz/\n         data> xyz\\>4\n         Error -24 (bad offset value)\n\n       If any of the sequences \\C, \\G, or \\L are present in a data  line  that\n       is  successfully  matched,  the substrings extracted by the convenience\n       functions are output with C, G, or L after the string number instead of\n       a colon. This is in addition to the normal full list. The string length\n       (that is, the return from the extraction function) is given  in  paren-\n       theses after each string for \\C and \\G.\n\n       Note that whereas patterns can be continued over several lines (a plain\n       \">\" prompt is used for continuations), data lines may not. However new-\n       lines  can  be included in data by means of the \\n escape (or \\r, \\r\\n,\n       etc., depending on the newline sequence setting).\n\n\nOUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION\n\n       When the alternative matching function, pcre[16|32]_dfa_exec(), is used\n       (by  means  of the \\D escape sequence or the -dfa command line option),\n       the output consists of a list of all the  matches  that  start  at  the\n       first point in the subject where there is at least one match. For exam-\n       ple:\n\n           re> /(tang|tangerine|tan)/\n         data> yellow tangerine\\D\n          0: tangerine\n          1: tang\n          2: tan\n\n       (Using the normal matching function on this data  finds  only  \"tang\".)\n       The  longest matching string is always given first (and numbered zero).\n       After a PCRE_ERROR_PARTIAL return, the output is \"Partial match:\", fol-\n       lowed  by  the  partially  matching  substring.  (Note that this is the\n       entire substring that was inspected during the partial  match;  it  may\n       include characters before the actual match start if a lookbehind asser-\n       tion, \\K, \\b, or \\B was involved.)\n\n       If /g is present on the pattern, the search for further matches resumes\n       at the end of the longest match. For example:\n\n           re> /(tang|tangerine|tan)/g\n         data> yellow tangerine and tangy sultana\\D\n          0: tangerine\n          1: tang\n          2: tan\n          0: tang\n          1: tan\n          0: tan\n\n       Since  the  matching  function  does not support substring capture, the\n       escape sequences that are concerned with captured  substrings  are  not\n       relevant.\n\n\nRESTARTING AFTER A PARTIAL MATCH\n\n       When the alternative matching function has given the PCRE_ERROR_PARTIAL\n       return, indicating that the subject partially matched the pattern,  you\n       can  restart  the match with additional subject data by means of the \\R\n       escape sequence. For example:\n\n           re> /^\\d?\\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\d\\d$/\n         data> 23ja\\P\\D\n         Partial match: 23ja\n         data> n05\\R\\D\n          0: n05\n\n       For further information about partial  matching,  see  the  pcrepartial\n       documentation.\n\n\nCALLOUTS\n\n       If  the pattern contains any callout requests, pcretest's callout func-\n       tion is called during matching. This works  with  both  matching  func-\n       tions. By default, the called function displays the callout number, the\n       start and current positions in the text at the callout  time,  and  the\n       next pattern item to be tested. For example:\n\n         --->pqrabcdef\n           0    ^  ^     \\d\n\n       This  output  indicates  that  callout  number  0  occurred for a match\n       attempt starting at the fourth character of the  subject  string,  when\n       the pointer was at the seventh character of the data, and when the next\n       pattern item was \\d. Just one circumflex is output  if  the  start  and\n       current positions are the same.\n\n       Callouts numbered 255 are assumed to be automatic callouts, inserted as\n       a result of the /C pattern modifier. In this case, instead  of  showing\n       the  callout  number, the offset in the pattern, preceded by a plus, is\n       output. For example:\n\n           re> /\\d?[A-E]\\*/C\n         data> E*\n         --->E*\n          +0 ^      \\d?\n          +3 ^      [A-E]\n          +8 ^^     \\*\n         +10 ^ ^\n          0: E*\n\n       If a pattern contains (*MARK) items, an additional line is output when-\n       ever  a  change  of  latest mark is passed to the callout function. For\n       example:\n\n           re> /a(*MARK:X)bc/C\n         data> abc\n         --->abc\n          +0 ^       a\n          +1 ^^      (*MARK:X)\n         +10 ^^      b\n         Latest Mark: X\n         +11 ^ ^     c\n         +12 ^  ^\n          0: abc\n\n       The mark changes between matching \"a\" and \"b\", but stays the  same  for\n       the  rest  of  the match, so nothing more is output. If, as a result of\n       backtracking, the mark reverts to being unset, the  text  \"<unset>\"  is\n       output.\n\n       The  callout  function  in pcretest returns zero (carry on matching) by\n       default, but you can use a \\C item in a data line (as described  above)\n       to change this and other parameters of the callout.\n\n       Inserting  callouts can be helpful when using pcretest to check compli-\n       cated regular expressions. For further information about callouts,  see\n       the pcrecallout documentation.\n\n\nNON-PRINTING CHARACTERS\n\n       When  pcretest is outputting text in the compiled version of a pattern,\n       bytes other than 32-126 are always treated as  non-printing  characters\n       are are therefore shown as hex escapes.\n\n       When  pcretest  is  outputting text that is a matched part of a subject\n       string, it behaves in the same way, unless a different locale has  been\n       set  for  the  pattern  (using  the  /L  modifier).  In  this case, the\n       isprint() function to distinguish printing and non-printing characters.\n\n\nSAVING AND RELOADING COMPILED PATTERNS\n\n       The facilities described in this section are  not  available  when  the\n       POSIX  interface  to  PCRE  is being used, that is, when the /P pattern\n       modifier is specified.\n\n       When the POSIX interface is not in use, you can cause pcretest to write\n       a  compiled  pattern to a file, by following the modifiers with > and a\n       file name.  For example:\n\n         /pattern/im >/some/file\n\n       See the pcreprecompile documentation for a discussion about saving  and\n       re-using  compiled patterns.  Note that if the pattern was successfully\n       studied with JIT optimization, the JIT data cannot be saved.\n\n       The data that is written is binary.  The  first  eight  bytes  are  the\n       length  of  the  compiled  pattern  data  followed by the length of the\n       optional study data, each written as four  bytes  in  big-endian  order\n       (most  significant  byte  first). If there is no study data (either the\n       pattern was not studied, or studying did not return any data), the sec-\n       ond  length  is  zero. The lengths are followed by an exact copy of the\n       compiled pattern. If there is additional study  data,  this  (excluding\n       any  JIT  data)  follows  immediately after the compiled pattern. After\n       writing the file, pcretest expects to read a new pattern.\n\n       A saved pattern can be reloaded into pcretest by  specifying  <  and  a\n       file  name  instead  of a pattern. There must be no space between < and\n       the file name, which must not  contain  a  <  character,  as  otherwise\n       pcretest  will  interpret  the line as a pattern delimited by < charac-\n       ters. For example:\n\n          re> </some/file\n         Compiled pattern loaded from /some/file\n         No study data\n\n       If the pattern was previously studied with the  JIT  optimization,  the\n       JIT  information cannot be saved and restored, and so is lost. When the\n       pattern has been loaded, pcretest proceeds to read data  lines  in  the\n       usual way.\n\n       You  can copy a file written by pcretest to a different host and reload\n       it there, even if the new host has opposite endianness to  the  one  on\n       which  the pattern was compiled. For example, you can compile on an i86\n       machine and run on a SPARC machine. When a pattern  is  reloaded  on  a\n       host with different endianness, the confirmation message is changed to:\n\n         Compiled pattern (byte-inverted) loaded from /some/file\n\n       The test suite contains some saved pre-compiled patterns with different\n       endianness. These are reloaded using \"<!\" instead  of  just  \"<\".  This\n       suppresses the \"(byte-inverted)\" text so that the output is the same on\n       all hosts. It also forces debugging output once the  pattern  has  been\n       reloaded.\n\n       File  names  for  saving and reloading can be absolute or relative, but\n       note that the shell facility of expanding a file name that starts  with\n       a tilde (~) is not available.\n\n       The  ability to save and reload files in pcretest is intended for test-\n       ing and experimentation. It is not intended for production use  because\n       only  a  single pattern can be written to a file. Furthermore, there is\n       no facility for supplying  custom  character  tables  for  use  with  a\n       reloaded  pattern.  If  the  original  pattern was compiled with custom\n       tables, an attempt to match a subject string using a  reloaded  pattern\n       is  likely to cause pcretest to crash.  Finally, if you attempt to load\n       a file that is not in the correct format, the result is undefined.\n\n\nSEE ALSO\n\n       pcre(3), pcre16(3),  pcre32(3),  pcreapi(3),  pcrecallout(3),  pcrejit,\n       pcrematching(3), pcrepartial(d), pcrepattern(3), pcreprecompile(3).\n\n\nAUTHOR\n\n       Philip Hazel\n       University Computing Service\n       Cambridge CB2 3QH, England.\n\n\nREVISION\n\n       Last updated: 23 February 2017\n       Copyright (c) 1997-2017 University of Cambridge.\n"
  },
  {
    "path": "src/pcre/doc/pcreunicode.3",
    "content": ".TH PCREUNICODE 3 \"27 February 2013\" \"PCRE 8.33\"\n.SH NAME\nPCRE - Perl-compatible regular expressions\n.SH \"UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT\"\n.rs\n.sp\nAs well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and\nUTF-32 (from release 8.32), by means of two additional libraries. They can be\nbuilt as well as, or instead of, the 8-bit library.\n.\n.\n.SH \"UTF-8 SUPPORT\"\n.rs\n.sp\nIn order process UTF-8 strings, you must build PCRE's 8-bit library with UTF\nsupport, and, in addition, you must call\n.\\\" HREF\n\\fBpcre_compile()\\fP\n.\\\"\nwith the PCRE_UTF8 option flag, or the pattern must start with the sequence\n(*UTF8) or (*UTF). When either of these is the case, both the pattern and any\nsubject strings that are matched against it are treated as UTF-8 strings\ninstead of strings of individual 1-byte characters.\n.\n.\n.SH \"UTF-16 AND UTF-32 SUPPORT\"\n.rs\n.sp\nIn order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or\n32-bit library with UTF support, and, in addition, you must call\n.\\\" HREF\n\\fBpcre16_compile()\\fP\n.\\\"\nor\n.\\\" HREF\n\\fBpcre32_compile()\\fP\n.\\\"\nwith the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively,\nthe pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or\n(*UTF), which can be used with either library. When UTF mode is set, both the\npattern and any subject strings that are matched against it are treated as\nUTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit\ncharacters.\n.\n.\n.SH \"UTF SUPPORT OVERHEAD\"\n.rs\n.sp\nIf you compile PCRE with UTF support, but do not use it at run time, the\nlibrary will be a bit bigger, but the additional run time overhead is limited\nto testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big.\n.\n.\n.SH \"UNICODE PROPERTY SUPPORT\"\n.rs\n.sp\nIf PCRE is built with Unicode character property support (which implies UTF\nsupport), the escape sequences \\ep{..}, \\eP{..}, and \\eX can be used.\nThe available properties that can be tested are limited to the general\ncategory properties such as Lu for an upper case letter or Nd for a decimal\nnumber, the Unicode script names such as Arabic or Han, and the derived\nproperties Any and L&. Full lists is given in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\nand\n.\\\" HREF\n\\fBpcresyntax\\fP\n.\\\"\ndocumentation. Only the short names for properties are supported. For example,\n\\ep{L} matches a letter. Its Perl synonym, \\ep{Letter}, is not supported.\nFurthermore, in Perl, many properties may optionally be prefixed by \"Is\", for\ncompatibility with Perl 5.6. PCRE does not support this.\n.\n.\n.\\\" HTML <a name=\"utf8strings\"></a>\n.SS \"Validity of UTF-8 strings\"\n.rs\n.sp\nWhen you set the PCRE_UTF8 flag, the byte strings passed as patterns and\nsubjects are (by default) checked for validity on entry to the relevant\nfunctions. The entire string is checked before any other processing takes\nplace. From release 7.3 of PCRE, the check is according the rules of RFC 3629,\nwhich are themselves derived from the Unicode specification. Earlier releases\nof PCRE followed the rules of RFC 2279, which allows the full range of 31-bit\nvalues (0 to 0x7FFFFFFF). The current check allows only values in the range U+0\nto U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called\n\"non-character\" code points are no longer excluded because Unicode corrigendum\n#9 makes it clear that they should not be.)\n.P\nCharacters in the \"Surrogate Area\" of Unicode are reserved for use by UTF-16,\nwhere they are used in pairs to encode codepoints with values greater than\n0xFFFF. The code points that are encoded by UTF-16 pairs are available\nindependently in the UTF-8 and UTF-32 encodings. (In other words, the whole\nsurrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and\nUTF-32.)\n.P\nIf an invalid UTF-8 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first byte\nof the failing character. The run-time functions \\fBpcre_exec()\\fP and\n\\fBpcre_dfa_exec()\\fP also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n.P\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance, for\nexample in the case of a long subject string that is being scanned repeatedly.\nIf you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE\nassumes that the pattern or subject it is given (respectively) contains only\nvalid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string.\n.P\nNote that passing PCRE_NO_UTF8_CHECK to \\fBpcre_compile()\\fP just disables the\ncheck for the pattern; it does not also apply to subject strings. If you want\nto disable the check for a subject string you must pass this option to\n\\fBpcre_exec()\\fP or \\fBpcre_dfa_exec()\\fP.\n.P\nIf you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result\nis undefined and your program may crash.\n.\n.\n.\\\" HTML <a name=\"utf16strings\"></a>\n.SS \"Validity of UTF-16 strings\"\n.rs\n.sp\nWhen you set the PCRE_UTF16 flag, the strings of 16-bit data units that are\npassed as patterns and subjects are (by default) checked for validity on entry\nto the relevant functions. Values other than those in the surrogate range\nU+D800 to U+DFFF are independent code points. Values in the surrogate range\nmust be used in pairs in the correct manner.\n.P\nIf an invalid UTF-16 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first data\nunit of the failing character. The run-time functions \\fBpcre16_exec()\\fP and\n\\fBpcre16_dfa_exec()\\fP also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n.P\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance. If you set\nthe PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that\nthe pattern or subject it is given (respectively) contains only valid UTF-16\nsequences. In this case, it does not diagnose an invalid UTF-16 string.\nHowever, if an invalid string is passed, the result is undefined.\n.\n.\n.\\\" HTML <a name=\"utf32strings\"></a>\n.SS \"Validity of UTF-32 strings\"\n.rs\n.sp\nWhen you set the PCRE_UTF32 flag, the strings of 32-bit data units that are\npassed as patterns and subjects are (by default) checked for validity on entry\nto the relevant functions.  This check allows only values in the range U+0\nto U+10FFFF, excluding the surrogate area U+D800 to U+DFFF.\n.P\nIf an invalid UTF-32 string is passed to PCRE, an error return is given. At\ncompile time, the only additional information is the offset to the first data\nunit of the failing character. The run-time functions \\fBpcre32_exec()\\fP and\n\\fBpcre32_dfa_exec()\\fP also pass back this information, as well as a more\ndetailed reason code if the caller has provided memory in which to do this.\n.P\nIn some situations, you may already know that your strings are valid, and\ntherefore want to skip these checks in order to improve performance. If you set\nthe PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that\nthe pattern or subject it is given (respectively) contains only valid UTF-32\nsequences. In this case, it does not diagnose an invalid UTF-32 string.\nHowever, if an invalid string is passed, the result is undefined.\n.\n.\n.SS \"General comments about UTF modes\"\n.rs\n.sp\n1. Codepoints less than 256 can be specified in patterns by either braced or\nunbraced hexadecimal escape sequences (for example, \\ex{b3} or \\exb3). Larger\nvalues have to use braced sequences.\n.P\n2. Octal numbers up to \\e777 are recognized, and in UTF-8 mode they match\ntwo-byte characters for values greater than \\e177.\n.P\n3. Repeat quantifiers apply to complete UTF characters, not to individual\ndata units, for example: \\ex{100}{3}.\n.P\n4. The dot metacharacter matches one UTF character instead of a single data\nunit.\n.P\n5. The escape sequence \\eC can be used to match a single byte in UTF-8 mode, or\na single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in\nUTF-32 mode, but its use can lead to some strange effects because it breaks up\nmulti-unit characters (see the description of \\eC in the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation). The use of \\eC is not supported in the alternative matching\nfunction \\fBpcre[16|32]_dfa_exec()\\fP, nor is it supported in UTF mode by the\nJIT optimization of \\fBpcre[16|32]_exec()\\fP. If JIT optimization is requested\nfor a UTF pattern that contains \\eC, it will not succeed, and so the matching\nwill be carried out by the normal interpretive function.\n.P\n6. The character escapes \\eb, \\eB, \\ed, \\eD, \\es, \\eS, \\ew, and \\eW correctly\ntest characters of any code value, but, by default, the characters that PCRE\nrecognizes as digits, spaces, or word characters remain the same set as in\nnon-UTF mode, all with values less than 256. This remains true even when PCRE\nis built to include Unicode property support, because to do otherwise would\nslow down PCRE in many common cases. Note in particular that this applies to\n\\eb and \\eB, because they are defined in terms of \\ew and \\eW. If you really\nwant to test for a wider sense of, say, \"digit\", you can use explicit Unicode\nproperty tests such as \\ep{Nd}. Alternatively, if you set the PCRE_UCP option,\nthe way that the character escapes work is changed so that Unicode properties\nare used to determine which characters match. There are more details in the\nsection on\n.\\\" HTML <a href=\"pcrepattern.html#genericchartypes\">\n.\\\" </a>\ngeneric character types\n.\\\"\nin the\n.\\\" HREF\n\\fBpcrepattern\\fP\n.\\\"\ndocumentation.\n.P\n7. Similarly, characters that match the POSIX named character classes are all\nlow-valued characters, unless the PCRE_UCP option is set.\n.P\n8. However, the horizontal and vertical white space matching escapes (\\eh, \\eH,\n\\ev, and \\eV) do match all the appropriate Unicode characters, whether or not\nPCRE_UCP is set.\n.P\n9. Case-insensitive matching applies only to characters whose values are less\nthan 128, unless PCRE is built with Unicode property support. A few Unicode\ncharacters such as Greek sigma have more than two codepoints that are\ncase-equivalent. Up to and including PCRE release 8.31, only one-to-one case\nmappings were supported, but later releases (with Unicode property support) do\ntreat as case-equivalent all versions of characters such as Greek sigma.\n.\n.\n.SH AUTHOR\n.rs\n.sp\n.nf\nPhilip Hazel\nUniversity Computing Service\nCambridge CB2 3QH, England.\n.fi\n.\n.\n.SH REVISION\n.rs\n.sp\n.nf\nLast updated: 27 February 2013\nCopyright (c) 1997-2013 University of Cambridge.\n.fi\n"
  },
  {
    "path": "src/pcre/doc/perltest.txt",
    "content": "The perltest program\n--------------------\n\nThe perltest.pl script tests Perl's regular expressions; it has the same\nspecification as pcretest, and so can be given identical input, except that\ninput patterns can be followed only by Perl's lower case modifiers and certain\nother pcretest modifiers that are either handled or ignored:\n\n  /+   recognized and handled by perltest\n  /++  the second + is ignored\n  /8   recognized and handled by perltest\n  /J   ignored\n  /K   ignored\n  /W   ignored\n  /S   ignored\n  /SS  ignored\n  /Y   ignored\n\nThe pcretest \\Y escape in data lines is removed before matching. The data lines\nare processed as Perl double-quoted strings, so if they contain \" $ or @\ncharacters, these have to be escaped. For this reason, all such characters in\nthe Perl-compatible testinput1 file are escaped so that they can be used for\nperltest as well as for pcretest. The special upper case pattern modifiers such\nas /A that pcretest recognizes, and its special data line escapes, are not used\nin the Perl-compatible test file. The output should be identical, apart from\nthe initial identifying banner.\n\nThe perltest.pl script can also test UTF-8 features. It recognizes the special\nmodifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput4\nand testinput6 files can be fed to perltest to run compatible UTF-8 tests.\nHowever, it is necessary to add \"use utf8; require Encode\" to the script to\nmake this work correctly. I have not managed to find a way to handle this\nautomatically.\n\nThe other testinput files are not suitable for feeding to perltest.pl, since\nthey make use of the special upper case modifiers and escapes that pcretest\nuses to test certain features of PCRE. Some of these files also contain\nmalformed regular expressions, in order to check that PCRE diagnoses them\ncorrectly.\n\nPhilip Hazel\nJanuary 2012\n"
  },
  {
    "path": "src/pcre/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2018-03-11.20; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# 'make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\ntab='\t'\nnl='\n'\nIFS=\" $tab$nl\"\n\n# Set DOITPROG to \"echo\" to test this script.\n\ndoit=${DOITPROG-}\ndoit_exec=${doit:-exec}\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nis_target_a_directory=possibly\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n        shift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n        case $mode in\n          *' '* | *\"$tab\"* | *\"$nl\"* | *'*'* | *'?'* | *'['*)\n            echo \"$0: invalid mode: $mode\" >&2\n            exit 1;;\n        esac\n        shift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n        shift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t)\n        is_target_a_directory=always\n        dst_arg=$2\n        # Protect names problematic for 'test' and other utilities.\n        case $dst_arg in\n          -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n        esac\n        shift;;\n\n    -T) is_target_a_directory=never;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --) shift\n        break;;\n\n    -*) echo \"$0: invalid option: $1\" >&2\n        exit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\n# We allow the use of options -d and -T together, by making -d\n# take the precedence; this is for compatibility with GNU install.\n\nif test -n \"$dir_arg\"; then\n  if test -n \"$dst_arg\"; then\n    echo \"$0: target directory not allowed when installing a directory.\" >&2\n    exit 1\n  fi\nfi\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for 'test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call 'install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  if test $# -gt 1 || test \"$is_target_a_directory\" = always; then\n    if test ! -d \"$dst_arg\"; then\n      echo \"$0: $dst_arg: Is not a directory.\" >&2\n      exit 1\n    fi\n  fi\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n        u_plus_rw=\n      else\n        u_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n        u_plus_rw=\n      else\n        u_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for 'test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename.\n    if test -d \"$dst\"; then\n      if test \"$is_target_a_directory\" = never; then\n        echo \"$0: $dst_arg: Is a directory\" >&2\n        exit 1\n      fi\n      dstdir=$dst\n      dstbase=`basename \"$src\"`\n      case $dst in\n\t*/) dst=$dst$dstbase;;\n\t*)  dst=$dst/$dstbase;;\n      esac\n      dstdir_status=0\n    else\n      dstdir=`dirname \"$dst\"`\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  case $dstdir in\n    */) dstdirslash=$dstdir;;\n    *)  dstdirslash=$dstdir/;;\n  esac\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n        # Create intermediate dirs using mode 755 as modified by the umask.\n        # This is like FreeBSD 'install' as of 1997-10-28.\n        umask=`umask`\n        case $stripcmd.$umask in\n          # Optimize common cases.\n          *[2367][2367]) mkdir_umask=$umask;;\n          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n          *[0-7])\n            mkdir_umask=`expr $umask + 22 \\\n              - $umask % 100 % 40 + $umask % 20 \\\n              - $umask % 10 % 4 + $umask % 2\n            `;;\n          *) mkdir_umask=$umask,go-w;;\n        esac\n\n        # With -d, create the new directory with the user-specified mode.\n        # Otherwise, rely on $mkdir_umask.\n        if test -n \"$dir_arg\"; then\n          mkdir_mode=-m$mode\n        else\n          mkdir_mode=\n        fi\n\n        posix_mkdir=false\n        case $umask in\n          *[123567][0-7][0-7])\n            # POSIX mkdir -p sets u+wx bits regardless of umask, which\n            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n            ;;\n          *)\n            # Note that $RANDOM variable is not portable (e.g. dash);  Use it\n            # here however when possible just to lower collision chance.\n            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\n            trap 'ret=$?; rmdir \"$tmpdir/a/b\" \"$tmpdir/a\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n            # Because \"mkdir -p\" follows existing symlinks and we likely work\n            # directly in world-writeable /tmp, make sure that the '$tmpdir'\n            # directory is successfully created first before we actually test\n            # 'mkdir -p' feature.\n            if (umask $mkdir_umask &&\n                $mkdirprog $mkdir_mode \"$tmpdir\" &&\n                exec $mkdirprog $mkdir_mode -p -- \"$tmpdir/a/b\") >/dev/null 2>&1\n            then\n              if test -z \"$dir_arg\" || {\n                   # Check for POSIX incompatibilities with -m.\n                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n                   # other-writable bit of parent directory when it shouldn't.\n                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n                   test_tmpdir=\"$tmpdir/a\"\n                   ls_ld_tmpdir=`ls -ld \"$test_tmpdir\"`\n                   case $ls_ld_tmpdir in\n                     d????-?r-*) different_mode=700;;\n                     d????-?--*) different_mode=755;;\n                     *) false;;\n                   esac &&\n                   $mkdirprog -m$different_mode -p -- \"$test_tmpdir\" && {\n                     ls_ld_tmpdir_1=`ls -ld \"$test_tmpdir\"`\n                     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n                   }\n                 }\n              then posix_mkdir=:\n              fi\n              rmdir \"$tmpdir/a/b\" \"$tmpdir/a\" \"$tmpdir\"\n            else\n              # Remove any dirs left behind by ancient mkdir implementations.\n              rmdir ./$mkdir_mode ./-p ./-- \"$tmpdir\" 2>/dev/null\n            fi\n            trap '' 0;;\n        esac;;\n    esac\n\n    if\n      $posix_mkdir && (\n        umask $mkdir_umask &&\n        $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n        /*) prefix='/';;\n        [-=\\(\\)!]*) prefix='./';;\n        *)  prefix='';;\n      esac\n\n      oIFS=$IFS\n      IFS=/\n      set -f\n      set fnord $dstdir\n      shift\n      set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n        test X\"$d\" = X && continue\n\n        prefix=$prefix$d\n        if test -d \"$prefix\"; then\n          prefixes=\n        else\n          if $posix_mkdir; then\n            (umask=$mkdir_umask &&\n             $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n            # Don't fail if two instances are running concurrently.\n            test -d \"$prefix\" || exit 1\n          else\n            case $prefix in\n              *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n              *) qprefix=$prefix;;\n            esac\n            prefixes=\"$prefixes '$qprefix'\"\n          fi\n        fi\n        prefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n        # Don't fail if two instances are running concurrently.\n        (umask $mkdir_umask &&\n         eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n          test -d \"$dstdir\" || exit 1\n        obsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=${dstdirslash}_inst.$$_\n    rmtmp=${dstdirslash}_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"     2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"  2>/dev/null` &&\n       set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       set +f &&\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n        # Now remove or move aside any old file at destination location.\n        # We try this two ways since rm can't unlink itself on some\n        # systems and the destination file might be busy for other\n        # reasons.  In this case, the final cleanup might fail but the new\n        # file should still install successfully.\n        {\n          test ! -f \"$dst\" ||\n          $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n          { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n            { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n          } ||\n          { echo \"$0: cannot unlink or rename $dst\" >&2\n            (exit 1); exit 1\n          }\n        } &&\n\n        # Now rename the file to the real destination.\n        $doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/pcre/libpcre.pc.in",
    "content": "# Package Information for pkg-config\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libpcre\nDescription: PCRE - Perl compatible regular expressions C library with 8 bit character support\nVersion: @PACKAGE_VERSION@\nLibs: -L${libdir} -lpcre\nLibs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\nCflags: -I${includedir} @PCRE_STATIC_CFLAG@\n"
  },
  {
    "path": "src/pcre/libpcre16.pc.in",
    "content": "# Package Information for pkg-config\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libpcre16\nDescription: PCRE - Perl compatible regular expressions C library with 16 bit character support\nVersion: @PACKAGE_VERSION@\nLibs: -L${libdir} -lpcre16\nLibs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\nCflags: -I${includedir} @PCRE_STATIC_CFLAG@\n"
  },
  {
    "path": "src/pcre/libpcre32.pc.in",
    "content": "# Package Information for pkg-config\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libpcre32\nDescription: PCRE - Perl compatible regular expressions C library with 32 bit character support\nVersion: @PACKAGE_VERSION@\nLibs: -L${libdir} -lpcre32\nLibs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\nCflags: -I${includedir} @PCRE_STATIC_CFLAG@\n"
  },
  {
    "path": "src/pcre/libpcrecpp.pc.in",
    "content": "# Package Information for pkg-config\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libpcrecpp\nDescription: PCRECPP - C++ wrapper for PCRE\nVersion: @PACKAGE_VERSION@\nLibs: -L${libdir} -lpcre -lpcrecpp\nCflags: -I${includedir} @PCRE_STATIC_CFLAG@\n"
  },
  {
    "path": "src/pcre/libpcreposix.pc.in",
    "content": "# Package Information for pkg-config\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libpcreposix\nDescription: PCREPosix - Posix compatible interface to libpcre\nVersion: @PACKAGE_VERSION@\nLibs: -L${libdir} -lpcreposix\nCflags: -I${includedir} @PCRE_STATIC_CFLAG@\nRequires.private: libpcre\n"
  },
  {
    "path": "src/pcre/ltmain.sh",
    "content": "#! /bin/sh\n## DO NOT EDIT - This file generated from ./build-aux/ltmain.in\n##               by inline-source v2018-07-24.06\n\n# libtool (GNU libtool) 2.4.6.42-b88ce\n# Provide generalized library-building support services.\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996-2018 Free Software Foundation, Inc.\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\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n\nPROGRAM=libtool\nPACKAGE=libtool\nVERSION=2.4.6.42-b88ce\npackage_revision=2.4.6.42\n\n\n## ------ ##\n## Usage. ##\n## ------ ##\n\n# Run './libtool --help' for help with using this script from the\n# command line.\n\n\n## ------------------------------- ##\n## User overridable command paths. ##\n## ------------------------------- ##\n\n# After configure completes, it has a better idea of some of the\n# shell tools we need than the defaults used by the functions shared\n# with bootstrap, so set those here where they can still be over-\n# ridden by the user, but otherwise take precedence.\n\n: ${AUTOCONF=\"autoconf\"}\n: ${AUTOMAKE=\"automake\"}\n\n\n## -------------------------- ##\n## Source external libraries. ##\n## -------------------------- ##\n\n# Much of our low-level functionality needs to be sourced from external\n# libraries, which are installed to $pkgauxdir.\n\n# Set a version string for this script.\nscriptversion=2018-07-24.06; # UTC\n\n# General shell script boiler plate, and helper functions.\n# Written by Gary V. Vaughan, 2004\n\n# This is free software.  There is NO warranty; not even for\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#\n# Copyright (C) 2004-2018 Bootstrap Authors\n#\n# This file is dual licensed under the terms of the MIT license\n# <https://opensource.org/license/MIT>, and GPL version 3 or later\n# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of\n# these licenses when using or redistributing this software or any of\n# the files within it.  See the URLs above, or the file `LICENSE`\n# included in the Bootstrap distribution for the full license texts.\n\n# Please report bugs or propose patches to:\n# <https://github.com/gnulib-modules/bootstrap/issues>\n\n\n## ------ ##\n## Usage. ##\n## ------ ##\n\n# Evaluate this file near the top of your script to gain access to\n# the functions and variables defined here:\n#\n#   . `echo \"$0\" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh\n#\n# If you need to override any of the default environment variable\n# settings, do that before evaluating this file.\n\n\n## -------------------- ##\n## Shell normalisation. ##\n## -------------------- ##\n\n# Some shells need a little help to be as Bourne compatible as possible.\n# Before doing anything else, make sure all that help has been provided!\n\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac\nfi\n\n# NLS nuisances: We save the old values in case they are required later.\n_G_user_locale=\n_G_safe_locale=\nfor _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test set = \\\"\\${$_G_var+set}\\\"; then\n          save_$_G_var=\\$$_G_var\n          $_G_var=C\n\t  export $_G_var\n\t  _G_user_locale=\\\"$_G_var=\\\\\\$save_\\$_G_var; \\$_G_user_locale\\\"\n\t  _G_safe_locale=\\\"$_G_var=C; \\$_G_safe_locale\\\"\n\tfi\"\ndone\n\n# Make sure IFS has a sensible default\nsp=' '\nnl='\n'\nIFS=\"$sp\t$nl\"\n\n# There are apparently some retarded systems that use ';' as a PATH separator!\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# func_unset VAR\n# --------------\n# Portably unset VAR.\n# In some shells, an 'unset VAR' statement leaves a non-zero return\n# status if VAR is already unset, which might be problematic if the\n# statement is used at the end of a function (thus poisoning its return\n# value) or when 'set -e' is active (causing even a spurious abort of\n# the script in this case).\nfunc_unset ()\n{\n    { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }\n}\n\n\n# Make sure CDPATH doesn't cause `cd` commands to output the target dir.\nfunc_unset CDPATH\n\n# Make sure ${,E,F}GREP behave sanely.\nfunc_unset GREP_OPTIONS\n\n\n## ------------------------- ##\n## Locate command utilities. ##\n## ------------------------- ##\n\n\n# func_executable_p FILE\n# ----------------------\n# Check that FILE is an executable regular file.\nfunc_executable_p ()\n{\n    test -f \"$1\" && test -x \"$1\"\n}\n\n\n# func_path_progs PROGS_LIST CHECK_FUNC [PATH]\n# --------------------------------------------\n# Search for either a program that responds to --version with output\n# containing \"GNU\", or else returned by CHECK_FUNC otherwise, by\n# trying all the directories in PATH with each of the elements of\n# PROGS_LIST.\n#\n# CHECK_FUNC should accept the path to a candidate program, and\n# set $func_check_prog_result if it truncates its output less than\n# $_G_path_prog_max characters.\nfunc_path_progs ()\n{\n    _G_progs_list=$1\n    _G_check_func=$2\n    _G_PATH=${3-\"$PATH\"}\n\n    _G_path_prog_max=0\n    _G_path_prog_found=false\n    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}\n    for _G_dir in $_G_PATH; do\n      IFS=$_G_save_IFS\n      test -z \"$_G_dir\" && _G_dir=.\n      for _G_prog_name in $_G_progs_list; do\n        for _exeext in '' .EXE; do\n          _G_path_prog=$_G_dir/$_G_prog_name$_exeext\n          func_executable_p \"$_G_path_prog\" || continue\n          case `\"$_G_path_prog\" --version 2>&1` in\n            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;\n            *)     $_G_check_func $_G_path_prog\n\t\t   func_path_progs_result=$func_check_prog_result\n\t\t   ;;\n          esac\n          $_G_path_prog_found && break 3\n        done\n      done\n    done\n    IFS=$_G_save_IFS\n    test -z \"$func_path_progs_result\" && {\n      echo \"no acceptable sed could be found in \\$PATH\" >&2\n      exit 1\n    }\n}\n\n\n# We want to be able to use the functions in this file before configure\n# has figured out where the best binaries are kept, which means we have\n# to search for them ourselves - except when the results are already set\n# where we skip the searches.\n\n# Unless the user overrides by setting SED, search the path for either GNU\n# sed, or the sed that truncates its output the least.\ntest -z \"$SED\" && {\n  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n  for _G_i in 1 2 3 4 5 6 7; do\n    _G_sed_script=$_G_sed_script$nl$_G_sed_script\n  done\n  echo \"$_G_sed_script\" 2>/dev/null | sed 99q >conftest.sed\n  _G_sed_script=\n\n  func_check_prog_sed ()\n  {\n    _G_path_prog=$1\n\n    _G_count=0\n    printf 0123456789 >conftest.in\n    while :\n    do\n      cat conftest.in conftest.in >conftest.tmp\n      mv conftest.tmp conftest.in\n      cp conftest.in conftest.nl\n      echo '' >> conftest.nl\n      \"$_G_path_prog\" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break\n      diff conftest.out conftest.nl >/dev/null 2>&1 || break\n      _G_count=`expr $_G_count + 1`\n      if test \"$_G_count\" -gt \"$_G_path_prog_max\"; then\n        # Best one so far, save it but keep looking for a better one\n        func_check_prog_result=$_G_path_prog\n        _G_path_prog_max=$_G_count\n      fi\n      # 10*(2^10) chars as input seems more than enough\n      test 10 -lt \"$_G_count\" && break\n    done\n    rm -f conftest.in conftest.tmp conftest.nl conftest.out\n  }\n\n  func_path_progs \"sed gsed\" func_check_prog_sed \"$PATH:/usr/xpg4/bin\"\n  rm -f conftest.sed\n  SED=$func_path_progs_result\n}\n\n\n# Unless the user overrides by setting GREP, search the path for either GNU\n# grep, or the grep that truncates its output the least.\ntest -z \"$GREP\" && {\n  func_check_prog_grep ()\n  {\n    _G_path_prog=$1\n\n    _G_count=0\n    _G_path_prog_max=0\n    printf 0123456789 >conftest.in\n    while :\n    do\n      cat conftest.in conftest.in >conftest.tmp\n      mv conftest.tmp conftest.in\n      cp conftest.in conftest.nl\n      echo 'GREP' >> conftest.nl\n      \"$_G_path_prog\" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break\n      diff conftest.out conftest.nl >/dev/null 2>&1 || break\n      _G_count=`expr $_G_count + 1`\n      if test \"$_G_count\" -gt \"$_G_path_prog_max\"; then\n        # Best one so far, save it but keep looking for a better one\n        func_check_prog_result=$_G_path_prog\n        _G_path_prog_max=$_G_count\n      fi\n      # 10*(2^10) chars as input seems more than enough\n      test 10 -lt \"$_G_count\" && break\n    done\n    rm -f conftest.in conftest.tmp conftest.nl conftest.out\n  }\n\n  func_path_progs \"grep ggrep\" func_check_prog_grep \"$PATH:/usr/xpg4/bin\"\n  GREP=$func_path_progs_result\n}\n\n\n## ------------------------------- ##\n## User overridable command paths. ##\n## ------------------------------- ##\n\n# All uppercase variable names are used for environment variables.  These\n# variables can be overridden by the user before calling a script that\n# uses them if a suitable command of that name is not already available\n# in the command search PATH.\n\n: ${CP=\"cp -f\"}\n: ${ECHO=\"printf %s\\n\"}\n: ${EGREP=\"$GREP -E\"}\n: ${FGREP=\"$GREP -F\"}\n: ${LN_S=\"ln -s\"}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n\n\n## -------------------- ##\n## Useful sed snippets. ##\n## -------------------- ##\n\nsed_dirname='s|/[^/]*$||'\nsed_basename='s|^.*/||'\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='s|\\([`\"$\\\\]\\)|\\\\\\1|g'\n\n# Same as above, but do not quote variable references.\nsed_double_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution that turns a string into a regex matching for the\n# string literally.\nsed_make_literal_regex='s|[].[^$\\\\*\\/]|\\\\&|g'\n\n# Sed substitution that converts a w32 file name or path\n# that contains forward slashes, into one that contains\n# (escaped) backslashes.  A very naive implementation.\nsed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n\n# Re-'\\' parameter expansions in output of sed_double_quote_subst that\n# were '\\'-ed in input to the same.  If an odd number of '\\' preceded a\n# '$' in input to sed_double_quote_subst, that '$' was protected from\n# expansion.  Since each input '\\' is now two '\\'s, look for any number\n# of runs of four '\\'s followed by two '\\'s and then a '$'.  '\\' that '$'.\n_G_bs='\\\\'\n_G_bs2='\\\\\\\\'\n_G_bs4='\\\\\\\\\\\\\\\\'\n_G_dollar='\\$'\nsed_double_backslash=\"\\\n  s/$_G_bs4/&\\\\\n/g\n  s/^$_G_bs2$_G_dollar/$_G_bs&/\n  s/\\\\([^$_G_bs]\\\\)$_G_bs2$_G_dollar/\\\\1$_G_bs2$_G_bs$_G_dollar/g\n  s/\\n//g\"\n\n\n## ----------------- ##\n## Global variables. ##\n## ----------------- ##\n\n# Except for the global variables explicitly listed below, the following\n# functions in the '^func_' namespace, and the '^require_' namespace\n# variables initialised in the 'Resource management' section, sourcing\n# this file will not pollute your global namespace with anything\n# else. There's no portable way to scope variables in Bourne shell\n# though, so actually running these functions will sometimes place\n# results into a variable named after the function, and often use\n# temporary variables in the '^_G_' namespace. If you are careful to\n# avoid using those namespaces casually in your sourcing script, things\n# should continue to work as you expect. And, of course, you can freely\n# overwrite any of the functions or variables defined here before\n# calling anything to customize them.\n\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\n# Allow overriding, eg assuming that you follow the convention of\n# putting '$debug_cmd' at the start of all your functions, you can get\n# bash to show function call trace with:\n#\n#    debug_cmd='eval echo \"${FUNCNAME[0]} $*\" >&2' bash your-script-name\ndebug_cmd=${debug_cmd-\":\"}\nexit_cmd=:\n\n# By convention, finish your script with:\n#\n#    exit $exit_status\n#\n# so that you can set exit_status to non-zero if you want to indicate\n# something went wrong during execution without actually bailing out at\n# the point of failure.\nexit_status=$EXIT_SUCCESS\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=$0\n\n# The name of this program.\nprogname=`$ECHO \"$progpath\" |$SED \"$sed_basename\"`\n\n# Make sure we have an absolute progpath for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=`$ECHO \"$progpath\" |$SED \"$sed_dirname\"`\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=$progdir/$progname\n     ;;\n  *)\n     _G_IFS=$IFS\n     IFS=${PATH_SEPARATOR-:}\n     for progdir in $PATH; do\n       IFS=$_G_IFS\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=$_G_IFS\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=$progdir/$progname\n     ;;\nesac\n\n\n## ----------------- ##\n## Standard options. ##\n## ----------------- ##\n\n# The following options affect the operation of the functions defined\n# below, and should be set appropriately depending on run-time para-\n# meters passed on the command line.\n\nopt_dry_run=false\nopt_quiet=false\nopt_verbose=false\n\n# Categories 'all' and 'none' are always available.  Append any others\n# you will pass as the first argument to func_warning from your own\n# code.\nwarning_categories=\n\n# By default, display warnings according to 'opt_warning_types'.  Set\n# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to\n# treat the next displayed warning as a fatal error.\nwarning_func=func_warn_and_continue\n\n# Set to 'all' to display all warnings, 'none' to suppress all\n# warnings, or a space delimited list of some subset of\n# 'warning_categories' to display only the listed warnings.\nopt_warning_types=all\n\n\n## -------------------- ##\n## Resource management. ##\n## -------------------- ##\n\n# This section contains definitions for functions that each ensure a\n# particular resource (a file, or a non-empty configuration variable for\n# example) is available, and if appropriate to extract default values\n# from pertinent package files. Call them using their associated\n# 'require_*' variable to ensure that they are executed, at most, once.\n#\n# It's entirely deliberate that calling these functions can set\n# variables that don't obey the namespace limitations obeyed by the rest\n# of this file, in order that that they be as useful as possible to\n# callers.\n\n\n# require_term_colors\n# -------------------\n# Allow display of bold text on terminals that support it.\nrequire_term_colors=func_require_term_colors\nfunc_require_term_colors ()\n{\n    $debug_cmd\n\n    test -t 1 && {\n      # COLORTERM and USE_ANSI_COLORS environment variables take\n      # precedence, because most terminfo databases neglect to describe\n      # whether color sequences are supported.\n      test -n \"${COLORTERM+set}\" && : ${USE_ANSI_COLORS=\"1\"}\n\n      if test 1 = \"$USE_ANSI_COLORS\"; then\n        # Standard ANSI escape sequences\n        tc_reset='\u001b[0m'\n        tc_bold='\u001b[1m';   tc_standout='\u001b[7m'\n        tc_red='\u001b[31m';   tc_green='\u001b[32m'\n        tc_blue='\u001b[34m';  tc_cyan='\u001b[36m'\n      else\n        # Otherwise trust the terminfo database after all.\n        test -n \"`tput sgr0 2>/dev/null`\" && {\n          tc_reset=`tput sgr0`\n          test -n \"`tput bold 2>/dev/null`\" && tc_bold=`tput bold`\n          tc_standout=$tc_bold\n          test -n \"`tput smso 2>/dev/null`\" && tc_standout=`tput smso`\n          test -n \"`tput setaf 1 2>/dev/null`\" && tc_red=`tput setaf 1`\n          test -n \"`tput setaf 2 2>/dev/null`\" && tc_green=`tput setaf 2`\n          test -n \"`tput setaf 4 2>/dev/null`\" && tc_blue=`tput setaf 4`\n          test -n \"`tput setaf 5 2>/dev/null`\" && tc_cyan=`tput setaf 5`\n        }\n      fi\n    }\n\n    require_term_colors=:\n}\n\n\n## ----------------- ##\n## Function library. ##\n## ----------------- ##\n\n# This section contains a variety of useful functions to call in your\n# scripts. Take note of the portable wrappers for features provided by\n# some modern shells, which will fall back to slower equivalents on\n# less featureful shells.\n\n\n# func_append VAR VALUE\n# ---------------------\n# Append VALUE onto the existing contents of VAR.\n\n  # We should try to minimise forks, especially on Windows where they are\n  # unreasonably slow, so skip the feature probes when bash or zsh are\n  # being used:\n  if test set = \"${BASH_VERSION+set}${ZSH_VERSION+set}\"; then\n    : ${_G_HAVE_ARITH_OP=\"yes\"}\n    : ${_G_HAVE_XSI_OPS=\"yes\"}\n    # The += operator was introduced in bash 3.1\n    case $BASH_VERSION in\n      [12].* | 3.0 | 3.0*) ;;\n      *)\n        : ${_G_HAVE_PLUSEQ_OP=\"yes\"}\n        ;;\n    esac\n  fi\n\n  # _G_HAVE_PLUSEQ_OP\n  # Can be empty, in which case the shell is probed, \"yes\" if += is\n  # useable or anything else if it does not work.\n  test -z \"$_G_HAVE_PLUSEQ_OP\" \\\n    && (eval 'x=a; x+=\" b\"; test \"a b\" = \"$x\"') 2>/dev/null \\\n    && _G_HAVE_PLUSEQ_OP=yes\n\nif test yes = \"$_G_HAVE_PLUSEQ_OP\"\nthen\n  # This is an XSI compatible shell, allowing a faster implementation...\n  eval 'func_append ()\n  {\n    $debug_cmd\n\n    eval \"$1+=\\$2\"\n  }'\nelse\n  # ...otherwise fall back to using expr, which is often a shell builtin.\n  func_append ()\n  {\n    $debug_cmd\n\n    eval \"$1=\\$$1\\$2\"\n  }\nfi\n\n\n# func_append_quoted VAR VALUE\n# ----------------------------\n# Quote VALUE and append to the end of shell variable VAR, separated\n# by a space.\nif test yes = \"$_G_HAVE_PLUSEQ_OP\"; then\n  eval 'func_append_quoted ()\n  {\n    $debug_cmd\n\n    func_quote_arg pretty \"$2\"\n    eval \"$1+=\\\\ \\$func_quote_arg_result\"\n  }'\nelse\n  func_append_quoted ()\n  {\n    $debug_cmd\n\n    func_quote_arg pretty \"$2\"\n    eval \"$1=\\$$1\\\\ \\$func_quote_arg_result\"\n  }\nfi\n\n\n# func_append_uniq VAR VALUE\n# --------------------------\n# Append unique VALUE onto the existing contents of VAR, assuming\n# entries are delimited by the first character of VALUE.  For example:\n#\n#   func_append_uniq options \" --another-option option-argument\"\n#\n# will only append to $options if \" --another-option option-argument \"\n# is not already present somewhere in $options already (note spaces at\n# each end implied by leading space in second argument).\nfunc_append_uniq ()\n{\n    $debug_cmd\n\n    eval _G_current_value='`$ECHO $'$1'`'\n    _G_delim=`expr \"$2\" : '\\(.\\)'`\n\n    case $_G_delim$_G_current_value$_G_delim in\n      *\"$2$_G_delim\"*) ;;\n      *) func_append \"$@\" ;;\n    esac\n}\n\n\n# func_arith TERM...\n# ------------------\n# Set func_arith_result to the result of evaluating TERMs.\n  test -z \"$_G_HAVE_ARITH_OP\" \\\n    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \\\n    && _G_HAVE_ARITH_OP=yes\n\nif test yes = \"$_G_HAVE_ARITH_OP\"; then\n  eval 'func_arith ()\n  {\n    $debug_cmd\n\n    func_arith_result=$(( $* ))\n  }'\nelse\n  func_arith ()\n  {\n    $debug_cmd\n\n    func_arith_result=`expr \"$@\"`\n  }\nfi\n\n\n# func_basename FILE\n# ------------------\n# Set func_basename_result to FILE with everything up to and including\n# the last / stripped.\nif test yes = \"$_G_HAVE_XSI_OPS\"; then\n  # If this shell supports suffix pattern removal, then use it to avoid\n  # forking. Hide the definitions single quotes in case the shell chokes\n  # on unsupported syntax...\n  _b='func_basename_result=${1##*/}'\n  _d='case $1 in\n        */*) func_dirname_result=${1%/*}$2 ;;\n        *  ) func_dirname_result=$3        ;;\n      esac'\n\nelse\n  # ...otherwise fall back to using sed.\n  _b='func_basename_result=`$ECHO \"$1\" |$SED \"$sed_basename\"`'\n  _d='func_dirname_result=`$ECHO \"$1\"  |$SED \"$sed_dirname\"`\n      if test \"X$func_dirname_result\" = \"X$1\"; then\n        func_dirname_result=$3\n      else\n        func_append func_dirname_result \"$2\"\n      fi'\nfi\n\neval 'func_basename ()\n{\n    $debug_cmd\n\n    '\"$_b\"'\n}'\n\n\n# func_dirname FILE APPEND NONDIR_REPLACEMENT\n# -------------------------------------------\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\neval 'func_dirname ()\n{\n    $debug_cmd\n\n    '\"$_d\"'\n}'\n\n\n# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT\n# --------------------------------------------------------\n# Perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# For efficiency, we do not delegate to the functions above but instead\n# duplicate the functionality here.\neval 'func_dirname_and_basename ()\n{\n    $debug_cmd\n\n    '\"$_b\"'\n    '\"$_d\"'\n}'\n\n\n# func_echo ARG...\n# ----------------\n# Echo program name prefixed message.\nfunc_echo ()\n{\n    $debug_cmd\n\n    _G_message=$*\n\n    func_echo_IFS=$IFS\n    IFS=$nl\n    for _G_line in $_G_message; do\n      IFS=$func_echo_IFS\n      $ECHO \"$progname: $_G_line\"\n    done\n    IFS=$func_echo_IFS\n}\n\n\n# func_echo_all ARG...\n# --------------------\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\"\n}\n\n\n# func_echo_infix_1 INFIX ARG...\n# ------------------------------\n# Echo program name, followed by INFIX on the first line, with any\n# additional lines not showing INFIX.\nfunc_echo_infix_1 ()\n{\n    $debug_cmd\n\n    $require_term_colors\n\n    _G_infix=$1; shift\n    _G_indent=$_G_infix\n    _G_prefix=\"$progname: $_G_infix: \"\n    _G_message=$*\n\n    # Strip color escape sequences before counting printable length\n    for _G_tc in \"$tc_reset\" \"$tc_bold\" \"$tc_standout\" \"$tc_red\" \"$tc_green\" \"$tc_blue\" \"$tc_cyan\"\n    do\n      test -n \"$_G_tc\" && {\n        _G_esc_tc=`$ECHO \"$_G_tc\" | $SED \"$sed_make_literal_regex\"`\n        _G_indent=`$ECHO \"$_G_indent\" | $SED \"s|$_G_esc_tc||g\"`\n      }\n    done\n    _G_indent=\"$progname: \"`echo \"$_G_indent\" | $SED 's|.| |g'`\"  \" ## exclude from sc_prohibit_nested_quotes\n\n    func_echo_infix_1_IFS=$IFS\n    IFS=$nl\n    for _G_line in $_G_message; do\n      IFS=$func_echo_infix_1_IFS\n      $ECHO \"$_G_prefix$tc_bold$_G_line$tc_reset\" >&2\n      _G_prefix=$_G_indent\n    done\n    IFS=$func_echo_infix_1_IFS\n}\n\n\n# func_error ARG...\n# -----------------\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $debug_cmd\n\n    $require_term_colors\n\n    func_echo_infix_1 \"  $tc_standout${tc_red}error$tc_reset\" \"$*\" >&2\n}\n\n\n# func_fatal_error ARG...\n# -----------------------\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    $debug_cmd\n\n    func_error \"$*\"\n    exit $EXIT_FAILURE\n}\n\n\n# func_grep EXPRESSION FILENAME\n# -----------------------------\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $debug_cmd\n\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_len STRING\n# ---------------\n# Set func_len_result to the length of STRING. STRING may not\n# start with a hyphen.\n  test -z \"$_G_HAVE_XSI_OPS\" \\\n    && (eval 'x=a/b/c;\n      test 5aa/bb/cc = \"${#x}${x%%/*}${x%/*}${x#*/}${x##*/}\"') 2>/dev/null \\\n    && _G_HAVE_XSI_OPS=yes\n\nif test yes = \"$_G_HAVE_XSI_OPS\"; then\n  eval 'func_len ()\n  {\n    $debug_cmd\n\n    func_len_result=${#1}\n  }'\nelse\n  func_len ()\n  {\n    $debug_cmd\n\n    func_len_result=`expr \"$1\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n  }\nfi\n\n\n# func_mkdir_p DIRECTORY-PATH\n# ---------------------------\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    $debug_cmd\n\n    _G_directory_path=$1\n    _G_dir_list=\n\n    if test -n \"$_G_directory_path\" && test : != \"$opt_dry_run\"; then\n\n      # Protect directory names starting with '-'\n      case $_G_directory_path in\n        -*) _G_directory_path=./$_G_directory_path ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$_G_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        _G_dir_list=$_G_directory_path:$_G_dir_list\n\n        # If the last portion added has no slash in it, the list is done\n        case $_G_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        _G_directory_path=`$ECHO \"$_G_directory_path\" | $SED -e \"$sed_dirname\"`\n      done\n      _G_dir_list=`$ECHO \"$_G_dir_list\" | $SED 's|:*$||'`\n\n      func_mkdir_p_IFS=$IFS; IFS=:\n      for _G_dir in $_G_dir_list; do\n\tIFS=$func_mkdir_p_IFS\n        # mkdir can fail with a 'File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$_G_dir\" 2>/dev/null || :\n      done\n      IFS=$func_mkdir_p_IFS\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$_G_directory_path\" || \\\n        func_fatal_error \"Failed to create '$1'\"\n    fi\n}\n\n\n# func_mktempdir [BASENAME]\n# -------------------------\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, BASENAME is the basename for that directory.\nfunc_mktempdir ()\n{\n    $debug_cmd\n\n    _G_template=${TMPDIR-/tmp}/${1-$progname}\n\n    if test : = \"$opt_dry_run\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      _G_tmpdir=$_G_template-$$\n    else\n\n      # If mktemp works, use that first and foremost\n      _G_tmpdir=`mktemp -d \"$_G_template-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$_G_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        _G_tmpdir=$_G_template-${RANDOM-0}$$\n\n        func_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$_G_tmpdir\"\n        umask $func_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$_G_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory '$_G_tmpdir'\"\n    fi\n\n    $ECHO \"$_G_tmpdir\"\n}\n\n\n# func_normal_abspath PATH\n# ------------------------\n# Remove doubled-up and trailing slashes, \".\" path components,\n# and cancel out any \"..\" path components in PATH after making\n# it an absolute path.\nfunc_normal_abspath ()\n{\n    $debug_cmd\n\n    # These SED scripts presuppose an absolute path with a trailing slash.\n    _G_pathcar='s|^/\\([^/]*\\).*$|\\1|'\n    _G_pathcdr='s|^/[^/]*||'\n    _G_removedotparts=':dotsl\n\t\ts|/\\./|/|g\n\t\tt dotsl\n\t\ts|/\\.$|/|'\n    _G_collapseslashes='s|/\\{1,\\}|/|g'\n    _G_finalslash='s|/*$|/|'\n\n    # Start from root dir and reassemble the path.\n    func_normal_abspath_result=\n    func_normal_abspath_tpath=$1\n    func_normal_abspath_altnamespace=\n    case $func_normal_abspath_tpath in\n      \"\")\n        # Empty path, that just means $cwd.\n        func_stripname '' '/' \"`pwd`\"\n        func_normal_abspath_result=$func_stripname_result\n        return\n        ;;\n      # The next three entries are used to spot a run of precisely\n      # two leading slashes without using negated character classes;\n      # we take advantage of case's first-match behaviour.\n      ///*)\n        # Unusual form of absolute path, do nothing.\n        ;;\n      //*)\n        # Not necessarily an ordinary path; POSIX reserves leading '//'\n        # and for example Cygwin uses it to access remote file shares\n        # over CIFS/SMB, so we conserve a leading double slash if found.\n        func_normal_abspath_altnamespace=/\n        ;;\n      /*)\n        # Absolute path, do nothing.\n        ;;\n      *)\n        # Relative path, prepend $cwd.\n        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath\n        ;;\n    esac\n\n    # Cancel out all the simple stuff to save iterations.  We also want\n    # the path to end with a slash for ease of parsing, so make sure\n    # there is one (and only one) here.\n    func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n          -e \"$_G_removedotparts\" -e \"$_G_collapseslashes\" -e \"$_G_finalslash\"`\n    while :; do\n      # Processed it all yet?\n      if test / = \"$func_normal_abspath_tpath\"; then\n        # If we ascended to the root using \"..\" the result may be empty now.\n        if test -z \"$func_normal_abspath_result\"; then\n          func_normal_abspath_result=/\n        fi\n        break\n      fi\n      func_normal_abspath_tcomponent=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n          -e \"$_G_pathcar\"`\n      func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n          -e \"$_G_pathcdr\"`\n      # Figure out what to do with it\n      case $func_normal_abspath_tcomponent in\n        \"\")\n          # Trailing empty path component, ignore it.\n          ;;\n        ..)\n          # Parent dir; strip last assembled component from result.\n          func_dirname \"$func_normal_abspath_result\"\n          func_normal_abspath_result=$func_dirname_result\n          ;;\n        *)\n          # Actual path component, append it.\n          func_append func_normal_abspath_result \"/$func_normal_abspath_tcomponent\"\n          ;;\n      esac\n    done\n    # Restore leading double-slash if one was found on entry.\n    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result\n}\n\n\n# func_notquiet ARG...\n# --------------------\n# Echo program name prefixed message only when not in quiet mode.\nfunc_notquiet ()\n{\n    $debug_cmd\n\n    $opt_quiet || func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n\n# func_relative_path SRCDIR DSTDIR\n# --------------------------------\n# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.\nfunc_relative_path ()\n{\n    $debug_cmd\n\n    func_relative_path_result=\n    func_normal_abspath \"$1\"\n    func_relative_path_tlibdir=$func_normal_abspath_result\n    func_normal_abspath \"$2\"\n    func_relative_path_tbindir=$func_normal_abspath_result\n\n    # Ascend the tree starting from libdir\n    while :; do\n      # check if we have found a prefix of bindir\n      case $func_relative_path_tbindir in\n        $func_relative_path_tlibdir)\n          # found an exact match\n          func_relative_path_tcancelled=\n          break\n          ;;\n        $func_relative_path_tlibdir*)\n          # found a matching prefix\n          func_stripname \"$func_relative_path_tlibdir\" '' \"$func_relative_path_tbindir\"\n          func_relative_path_tcancelled=$func_stripname_result\n          if test -z \"$func_relative_path_result\"; then\n            func_relative_path_result=.\n          fi\n          break\n          ;;\n        *)\n          func_dirname $func_relative_path_tlibdir\n          func_relative_path_tlibdir=$func_dirname_result\n          if test -z \"$func_relative_path_tlibdir\"; then\n            # Have to descend all the way to the root!\n            func_relative_path_result=../$func_relative_path_result\n            func_relative_path_tcancelled=$func_relative_path_tbindir\n            break\n          fi\n          func_relative_path_result=../$func_relative_path_result\n          ;;\n      esac\n    done\n\n    # Now calculate path; take care to avoid doubling-up slashes.\n    func_stripname '' '/' \"$func_relative_path_result\"\n    func_relative_path_result=$func_stripname_result\n    func_stripname '/' '/' \"$func_relative_path_tcancelled\"\n    if test -n \"$func_stripname_result\"; then\n      func_append func_relative_path_result \"/$func_stripname_result\"\n    fi\n\n    # Normalisation. If bindir is libdir, return '.' else relative path.\n    if test -n \"$func_relative_path_result\"; then\n      func_stripname './' '' \"$func_relative_path_result\"\n      func_relative_path_result=$func_stripname_result\n    fi\n\n    test -n \"$func_relative_path_result\" || func_relative_path_result=.\n\n    :\n}\n\n\n# func_quote_portable EVAL ARG\n# ----------------------------\n# Internal function to portably implement func_quote_arg.  Note that we still\n# keep attention to performance here so we as much as possible try to avoid\n# calling sed binary (so far O(N) complexity as long as func_append is O(1)).\nfunc_quote_portable ()\n{\n    $debug_cmd\n\n    func_quote_portable_result=$2\n\n    # one-time-loop (easy break)\n    while true\n    do\n      if $1; then\n        func_quote_portable_result=`$ECHO \"$2\" | $SED \\\n          -e \"$sed_double_quote_subst\" -e \"$sed_double_backslash\"`\n        break\n      fi\n\n      # Quote for eval.\n      case $func_quote_portable_result in\n        *[\\\\\\`\\\"\\$]*)\n          case $func_quote_portable_result in\n            *[\\[\\*\\?]*)\n              func_quote_portable_result=`$ECHO \"$func_quote_portable_result\" \\\n                  | $SED \"$sed_quote_subst\"`\n              break\n              ;;\n          esac\n\n          func_quote_portable_old_IFS=$IFS\n          for _G_char in '\\' '`' '\"' '$'\n          do\n            # STATE($1) PREV($2) SEPARATOR($3)\n            set start \"\" \"\"\n            func_quote_portable_result=dummy\"$_G_char$func_quote_portable_result$_G_char\"dummy\n            IFS=$_G_char\n            for _G_part in $func_quote_portable_result\n            do\n              case $1 in\n              quote)\n                func_append func_quote_portable_result \"$3$2\"\n                set quote \"$_G_part\" \"\\\\$_G_char\"\n                ;;\n              start)\n                set first \"\" \"\"\n                func_quote_portable_result=\n                ;;\n              first)\n                set quote \"$_G_part\" \"\"\n                ;;\n              esac\n            done\n          done\n          IFS=$func_quote_portable_old_IFS\n          ;;\n        *) ;;\n      esac\n      break\n    done\n\n    func_quote_portable_unquoted_result=$func_quote_portable_result\n    case $func_quote_portable_result in\n      # double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and variable expansion\n      # for a subsequent eval.\n      # many bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_portable_result=\\\"$func_quote_portable_result\\\"\n        ;;\n    esac\n}\n\n\n# func_quotefast_eval ARG\n# -----------------------\n# Quote one ARG (internal).  This is equivalent to 'func_quote_arg eval ARG',\n# but optimized for speed.  Result is stored in $func_quotefast_eval.\nif test xyes = `(x=; printf -v x %q yes; echo x\"$x\") 2>/dev/null`; then\n  printf -v _GL_test_printf_tilde %q '~'\n  if test '\\~' = \"$_GL_test_printf_tilde\"; then\n    func_quotefast_eval ()\n    {\n      printf -v func_quotefast_eval_result %q \"$1\"\n    }\n  else\n    # Broken older Bash implementations.  Make those faster too if possible.\n    func_quotefast_eval ()\n    {\n      case $1 in\n        '~'*)\n          func_quote_portable false \"$1\"\n          func_quotefast_eval_result=$func_quote_portable_result\n          ;;\n        *)\n          printf -v func_quotefast_eval_result %q \"$1\"\n          ;;\n      esac\n    }\n  fi\nelse\n  func_quotefast_eval ()\n  {\n    func_quote_portable false \"$1\"\n    func_quotefast_eval_result=$func_quote_portable_result\n  }\nfi\n\n\n# func_quote_arg MODEs ARG\n# ------------------------\n# Quote one ARG to be evaled later.  MODEs argument may contain zero or more\n# specifiers listed below separated by ',' character.  This function returns two\n# values:\n#   i) func_quote_arg_result\n#      double-quoted (when needed), suitable for a subsequent eval\n#  ii) func_quote_arg_unquoted_result\n#      has all characters that are still active within double\n#      quotes backslashified.  Available only if 'unquoted' is specified.\n#\n# Available modes:\n# ----------------\n# 'eval' (default)\n#       - escape shell special characters\n# 'expand'\n#       - the same as 'eval';  but do not quote variable references\n# 'pretty'\n#       - request aesthetic output, i.e. '\"a b\"' instead of 'a\\ b'.  This might\n#         be used later in func_quote to get output like: 'echo \"a b\"' instead\n#         of 'echo a\\ b'.  This is slower than default on some shells.\n# 'unquoted'\n#       - produce also $func_quote_arg_unquoted_result which does not contain\n#         wrapping double-quotes.\n#\n# Examples for 'func_quote_arg pretty,unquoted string':\n#\n#   string      | *_result              | *_unquoted_result\n#   ------------+-----------------------+-------------------\n#   \"           | \\\"                    | \\\"\n#   a b         | \"a b\"                 | a b\n#   \"a b\"       | \"\\\"a b\\\"\"             | \\\"a b\\\"\n#   *           | \"*\"                   | *\n#   z=\"${x-$y}\" | \"z=\\\"\\${x-\\$y}\\\"\"     | z=\\\"\\${x-\\$y}\\\"\n#\n# Examples for 'func_quote_arg pretty,unquoted,expand string':\n#\n#   string        |   *_result          |  *_unquoted_result\n#   --------------+---------------------+--------------------\n#   z=\"${x-$y}\"   | \"z=\\\"${x-$y}\\\"\"     | z=\\\"${x-$y}\\\"\nfunc_quote_arg ()\n{\n    _G_quote_expand=false\n    case ,$1, in\n      *,expand,*)\n        _G_quote_expand=:\n        ;;\n    esac\n\n    case ,$1, in\n      *,pretty,*|*,expand,*|*,unquoted,*)\n        func_quote_portable $_G_quote_expand \"$2\"\n        func_quote_arg_result=$func_quote_portable_result\n        func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result\n        ;;\n      *)\n        # Faster quote-for-eval for some shells.\n        func_quotefast_eval \"$2\"\n        func_quote_arg_result=$func_quotefast_eval_result\n        ;;\n    esac\n}\n\n\n# func_quote MODEs ARGs...\n# ------------------------\n# Quote all ARGs to be evaled later and join them into single command.  See\n# func_quote_arg's description for more info.\nfunc_quote ()\n{\n    $debug_cmd\n    _G_func_quote_mode=$1 ; shift\n    func_quote_result=\n    while test 0 -lt $#; do\n      func_quote_arg \"$_G_func_quote_mode\" \"$1\"\n      if test -n \"$func_quote_result\"; then\n        func_append func_quote_result \" $func_quote_arg_result\"\n      else\n        func_append func_quote_result \"$func_quote_arg_result\"\n      fi\n      shift\n    done\n}\n\n\n# func_stripname PREFIX SUFFIX NAME\n# ---------------------------------\n# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\nif test yes = \"$_G_HAVE_XSI_OPS\"; then\n  eval 'func_stripname ()\n  {\n    $debug_cmd\n\n    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n    # positional parameters, so assign one to ordinary variable first.\n    func_stripname_result=$3\n    func_stripname_result=${func_stripname_result#\"$1\"}\n    func_stripname_result=${func_stripname_result%\"$2\"}\n  }'\nelse\n  func_stripname ()\n  {\n    $debug_cmd\n\n    case $2 in\n      .*) func_stripname_result=`$ECHO \"$3\" | $SED -e \"s%^$1%%\" -e \"s%\\\\\\\\$2\\$%%\"`;;\n      *)  func_stripname_result=`$ECHO \"$3\" | $SED -e \"s%^$1%%\" -e \"s%$2\\$%%\"`;;\n    esac\n  }\nfi\n\n\n# func_show_eval CMD [FAIL_EXP]\n# -----------------------------\n# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    $debug_cmd\n\n    _G_cmd=$1\n    _G_fail_exp=${2-':'}\n\n    func_quote_arg pretty,expand \"$_G_cmd\"\n    eval \"func_notquiet $func_quote_arg_result\"\n\n    $opt_dry_run || {\n      eval \"$_G_cmd\"\n      _G_status=$?\n      if test 0 -ne \"$_G_status\"; then\n\teval \"(exit $_G_status); $_G_fail_exp\"\n      fi\n    }\n}\n\n\n# func_show_eval_locale CMD [FAIL_EXP]\n# ------------------------------------\n# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    $debug_cmd\n\n    _G_cmd=$1\n    _G_fail_exp=${2-':'}\n\n    $opt_quiet || {\n      func_quote_arg expand,pretty \"$_G_cmd\"\n      eval \"func_echo $func_quote_arg_result\"\n    }\n\n    $opt_dry_run || {\n      eval \"$_G_user_locale\n\t    $_G_cmd\"\n      _G_status=$?\n      eval \"$_G_safe_locale\"\n      if test 0 -ne \"$_G_status\"; then\n\teval \"(exit $_G_status); $_G_fail_exp\"\n      fi\n    }\n}\n\n\n# func_tr_sh\n# ----------\n# Turn $1 into a string suitable for a shell variable name.\n# Result is stored in $func_tr_sh_result.  All characters\n# not in the set a-zA-Z0-9_ are replaced with '_'. Further,\n# if $1 begins with a digit, a '_' is prepended as well.\nfunc_tr_sh ()\n{\n    $debug_cmd\n\n    case $1 in\n    [0-9]* | *[!a-zA-Z0-9_]*)\n      func_tr_sh_result=`$ECHO \"$1\" | $SED -e 's/^\\([0-9]\\)/_\\1/' -e 's/[^a-zA-Z0-9_]/_/g'`\n      ;;\n    * )\n      func_tr_sh_result=$1\n      ;;\n    esac\n}\n\n\n# func_verbose ARG...\n# -------------------\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $debug_cmd\n\n    $opt_verbose && func_echo \"$*\"\n\n    :\n}\n\n\n# func_warn_and_continue ARG...\n# -----------------------------\n# Echo program name prefixed warning message to standard error.\nfunc_warn_and_continue ()\n{\n    $debug_cmd\n\n    $require_term_colors\n\n    func_echo_infix_1 \"${tc_red}warning$tc_reset\" \"$*\" >&2\n}\n\n\n# func_warning CATEGORY ARG...\n# ----------------------------\n# Echo program name prefixed warning message to standard error. Warning\n# messages can be filtered according to CATEGORY, where this function\n# elides messages where CATEGORY is not listed in the global variable\n# 'opt_warning_types'.\nfunc_warning ()\n{\n    $debug_cmd\n\n    # CATEGORY must be in the warning_categories list!\n    case \" $warning_categories \" in\n      *\" $1 \"*) ;;\n      *) func_internal_error \"invalid warning category '$1'\" ;;\n    esac\n\n    _G_category=$1\n    shift\n\n    case \" $opt_warning_types \" in\n      *\" $_G_category \"*) $warning_func ${1+\"$@\"} ;;\n    esac\n}\n\n\n# func_sort_ver VER1 VER2\n# -----------------------\n# 'sort -V' is not generally available.\n# Note this deviates from the version comparison in automake\n# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a\n# but this should suffice as we won't be specifying old\n# version formats or redundant trailing .0 in bootstrap.conf.\n# If we did want full compatibility then we should probably\n# use m4_version_compare from autoconf.\nfunc_sort_ver ()\n{\n    $debug_cmd\n\n    printf '%s\\n%s\\n' \"$1\" \"$2\" \\\n      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n\n}\n\n# func_lt_ver PREV CURR\n# ---------------------\n# Return true if PREV and CURR are in the correct order according to\n# func_sort_ver, otherwise false.  Use it like this:\n#\n#  func_lt_ver \"$prev_ver\" \"$proposed_ver\" || func_fatal_error \"...\"\nfunc_lt_ver ()\n{\n    $debug_cmd\n\n    test \"x$1\" = x`func_sort_ver \"$1\" \"$2\" | $SED 1q`\n}\n\n\n# Local variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-pattern: \"10/scriptversion=%:y-%02m-%02d.%02H; # UTC\"\n# time-stamp-time-zone: \"UTC\"\n# End:\n#! /bin/sh\n\n# A portable, pluggable option parser for Bourne shell.\n# Written by Gary V. Vaughan, 2010\n\n# This is free software.  There is NO warranty; not even for\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#\n# Copyright (C) 2010-2018 Bootstrap Authors\n#\n# This file is dual licensed under the terms of the MIT license\n# <https://opensource.org/license/MIT>, and GPL version 3 or later\n# <http://www.gnu.org/licenses/gpl-2.0.html>.  You must apply one of\n# these licenses when using or redistributing this software or any of\n# the files within it.  See the URLs above, or the file `LICENSE`\n# included in the Bootstrap distribution for the full license texts.\n\n# Please report bugs or propose patches to:\n# <https://github.com/gnulib-modules/bootstrap/issues>\n\n# Set a version string for this script.\nscriptversion=2018-07-24.06; # UTC\n\n\n## ------ ##\n## Usage. ##\n## ------ ##\n\n# This file is a library for parsing options in your shell scripts along\n# with assorted other useful supporting features that you can make use\n# of too.\n#\n# For the simplest scripts you might need only:\n#\n#   #!/bin/sh\n#   . relative/path/to/funclib.sh\n#   . relative/path/to/options-parser\n#   scriptversion=1.0\n#   func_options ${1+\"$@\"}\n#   eval set dummy \"$func_options_result\"; shift\n#   ...rest of your script...\n#\n# In order for the '--version' option to work, you will need to have a\n# suitably formatted comment like the one at the top of this file\n# starting with '# Written by ' and ending with '# Copyright'.\n#\n# For '-h' and '--help' to work, you will also need a one line\n# description of your script's purpose in a comment directly above the\n# '# Written by ' line, like the one at the top of this file.\n#\n# The default options also support '--debug', which will turn on shell\n# execution tracing (see the comment above debug_cmd below for another\n# use), and '--verbose' and the func_verbose function to allow your script\n# to display verbose messages only when your user has specified\n# '--verbose'.\n#\n# After sourcing this file, you can plug in processing for additional\n# options by amending the variables from the 'Configuration' section\n# below, and following the instructions in the 'Option parsing'\n# section further down.\n\n## -------------- ##\n## Configuration. ##\n## -------------- ##\n\n# You should override these variables in your script after sourcing this\n# file so that they reflect the customisations you have added to the\n# option parser.\n\n# The usage line for option parsing errors and the start of '-h' and\n# '--help' output messages. You can embed shell variables for delayed\n# expansion at the time the message is displayed, but you will need to\n# quote other shell meta-characters carefully to prevent them being\n# expanded when the contents are evaled.\nusage='$progpath [OPTION]...'\n\n# Short help message in response to '-h' and '--help'.  Add to this or\n# override it after sourcing this library to reflect the full set of\n# options your script accepts.\nusage_message=\"\\\n       --debug        enable verbose shell tracing\n   -W, --warnings=CATEGORY\n                      report the warnings falling in CATEGORY [all]\n   -v, --verbose      verbosely report processing\n       --version      print version information and exit\n   -h, --help         print short or long help message and exit\n\"\n\n# Additional text appended to 'usage_message' in response to '--help'.\nlong_help_message=\"\nWarning categories include:\n       'all'          show all warnings\n       'none'         turn off all the warnings\n       'error'        warnings are treated as fatal errors\"\n\n# Help message printed before fatal option parsing errors.\nfatal_help=\"Try '\\$progname --help' for more information.\"\n\n\n\n## ------------------------- ##\n## Hook function management. ##\n## ------------------------- ##\n\n# This section contains functions for adding, removing, and running hooks\n# in the main code.  A hook is just a list of function names that can be\n# run in order later on.\n\n# func_hookable FUNC_NAME\n# -----------------------\n# Declare that FUNC_NAME will run hooks added with\n# 'func_add_hook FUNC_NAME ...'.\nfunc_hookable ()\n{\n    $debug_cmd\n\n    func_append hookable_fns \" $1\"\n}\n\n\n# func_add_hook FUNC_NAME HOOK_FUNC\n# ---------------------------------\n# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must\n# first have been declared \"hookable\" by a call to 'func_hookable'.\nfunc_add_hook ()\n{\n    $debug_cmd\n\n    case \" $hookable_fns \" in\n      *\" $1 \"*) ;;\n      *) func_fatal_error \"'$1' does not accept hook functions.\" ;;\n    esac\n\n    eval func_append ${1}_hooks '\" $2\"'\n}\n\n\n# func_remove_hook FUNC_NAME HOOK_FUNC\n# ------------------------------------\n# Remove HOOK_FUNC from the list of hook functions to be called by\n# FUNC_NAME.\nfunc_remove_hook ()\n{\n    $debug_cmd\n\n    eval ${1}_hooks='`$ECHO \"\\$'$1'_hooks\" |$SED \"s| '$2'||\"`'\n}\n\n\n# func_propagate_result FUNC_NAME_A FUNC_NAME_B\n# ---------------------------------------------\n# If the *_result variable of FUNC_NAME_A _is set_, assign its value to\n# *_result variable of FUNC_NAME_B.\nfunc_propagate_result ()\n{\n    $debug_cmd\n\n    func_propagate_result_result=:\n    if eval \"test \\\"\\${${1}_result+set}\\\" = set\"\n    then\n      eval \"${2}_result=\\$${1}_result\"\n    else\n      func_propagate_result_result=false\n    fi\n}\n\n\n# func_run_hooks FUNC_NAME [ARG]...\n# ---------------------------------\n# Run all hook functions registered to FUNC_NAME.\n# It's assumed that the list of hook functions contains nothing more\n# than a whitespace-delimited list of legal shell function names, and\n# no effort is wasted trying to catch shell meta-characters or preserve\n# whitespace.\nfunc_run_hooks ()\n{\n    $debug_cmd\n\n    case \" $hookable_fns \" in\n      *\" $1 \"*) ;;\n      *) func_fatal_error \"'$1' does not support hook functions.\" ;;\n    esac\n\n    eval _G_hook_fns=\\$$1_hooks; shift\n\n    for _G_hook in $_G_hook_fns; do\n      func_unset \"${_G_hook}_result\"\n      eval $_G_hook '${1+\"$@\"}'\n      func_propagate_result $_G_hook func_run_hooks\n      if $func_propagate_result_result; then\n        eval set dummy \"$func_run_hooks_result\"; shift\n      fi\n    done\n}\n\n\n\n## --------------- ##\n## Option parsing. ##\n## --------------- ##\n\n# In order to add your own option parsing hooks, you must accept the\n# full positional parameter list from your hook function.  You may remove\n# or edit any options that you action, and then pass back the remaining\n# unprocessed options in '<hooked_function_name>_result', escaped\n# suitably for 'eval'.\n#\n# The '<hooked_function_name>_result' variable is automatically unset\n# before your hook gets called; for best performance, only set the\n# *_result variable when necessary (i.e. don't call the 'func_quote'\n# function unnecessarily because it can be an expensive operation on some\n# machines).\n#\n# Like this:\n#\n#    my_options_prep ()\n#    {\n#        $debug_cmd\n#\n#        # Extend the existing usage message.\n#        usage_message=$usage_message'\n#      -s, --silent       don'\\''t print informational messages\n#    '\n#        # No change in '$@' (ignored completely by this hook).  Leave\n#        # my_options_prep_result variable intact.\n#    }\n#    func_add_hook func_options_prep my_options_prep\n#\n#\n#    my_silent_option ()\n#    {\n#        $debug_cmd\n#\n#        args_changed=false\n#\n#        # Note that, for efficiency, we parse as many options as we can\n#        # recognise in a loop before passing the remainder back to the\n#        # caller on the first unrecognised argument we encounter.\n#        while test $# -gt 0; do\n#          opt=$1; shift\n#          case $opt in\n#            --silent|-s) opt_silent=:\n#                         args_changed=:\n#                         ;;\n#            # Separate non-argument short options:\n#            -s*)         func_split_short_opt \"$_G_opt\"\n#                         set dummy \"$func_split_short_opt_name\" \\\n#                             \"-$func_split_short_opt_arg\" ${1+\"$@\"}\n#                         shift\n#                         args_changed=:\n#                         ;;\n#            *)           # Make sure the first unrecognised option \"$_G_opt\"\n#                         # is added back to \"$@\" in case we need it later,\n#                         # if $args_changed was set to 'true'.\n#                         set dummy \"$_G_opt\" ${1+\"$@\"}; shift; break ;;\n#          esac\n#        done\n#\n#        # Only call 'func_quote' here if we processed at least one argument.\n#        if $args_changed; then\n#          func_quote eval ${1+\"$@\"}\n#          my_silent_option_result=$func_quote_result\n#        fi\n#    }\n#    func_add_hook func_parse_options my_silent_option\n#\n#\n#    my_option_validation ()\n#    {\n#        $debug_cmd\n#\n#        $opt_silent && $opt_verbose && func_fatal_help \"\\\n#    '--silent' and '--verbose' options are mutually exclusive.\"\n#    }\n#    func_add_hook func_validate_options my_option_validation\n#\n# You'll also need to manually amend $usage_message to reflect the extra\n# options you parse.  It's preferable to append if you can, so that\n# multiple option parsing hooks can be added safely.\n\n\n# func_options_finish [ARG]...\n# ----------------------------\n# Finishing the option parse loop (call 'func_options' hooks ATM).\nfunc_options_finish ()\n{\n    $debug_cmd\n\n    func_run_hooks func_options ${1+\"$@\"}\n    func_propagate_result func_run_hooks func_options_finish\n}\n\n\n# func_options [ARG]...\n# ---------------------\n# All the functions called inside func_options are hookable. See the\n# individual implementations for details.\nfunc_hookable func_options\nfunc_options ()\n{\n    $debug_cmd\n\n    _G_options_quoted=false\n\n    for my_func in options_prep parse_options validate_options options_finish\n    do\n      func_unset func_${my_func}_result\n      func_unset func_run_hooks_result\n      eval func_$my_func '${1+\"$@\"}'\n      func_propagate_result func_$my_func func_options\n      if $func_propagate_result_result; then\n        eval set dummy \"$func_options_result\"; shift\n        _G_options_quoted=:\n      fi\n    done\n\n    $_G_options_quoted || {\n      # As we (func_options) are top-level options-parser function and\n      # nobody quoted \"$@\" for us yet, we need to do it explicitly for\n      # caller.\n      func_quote eval ${1+\"$@\"}\n      func_options_result=$func_quote_result\n    }\n}\n\n\n# func_options_prep [ARG]...\n# --------------------------\n# All initialisations required before starting the option parse loop.\n# Note that when calling hook functions, we pass through the list of\n# positional parameters.  If a hook function modifies that list, and\n# needs to propagate that back to rest of this script, then the complete\n# modified list must be put in 'func_run_hooks_result' before returning.\nfunc_hookable func_options_prep\nfunc_options_prep ()\n{\n    $debug_cmd\n\n    # Option defaults:\n    opt_verbose=false\n    opt_warning_types=\n\n    func_run_hooks func_options_prep ${1+\"$@\"}\n    func_propagate_result func_run_hooks func_options_prep\n}\n\n\n# func_parse_options [ARG]...\n# ---------------------------\n# The main option parsing loop.\nfunc_hookable func_parse_options\nfunc_parse_options ()\n{\n    $debug_cmd\n\n    _G_parse_options_requote=false\n    # this just eases exit handling\n    while test $# -gt 0; do\n      # Defer to hook functions for initial option parsing, so they\n      # get priority in the event of reusing an option name.\n      func_run_hooks func_parse_options ${1+\"$@\"}\n      func_propagate_result func_run_hooks func_parse_options\n      if $func_propagate_result_result; then\n        eval set dummy \"$func_parse_options_result\"; shift\n        # Even though we may have changed \"$@\", we passed the \"$@\" array\n        # down into the hook and it quoted it for us (because we are in\n        # this if-branch).  No need to quote it again.\n        _G_parse_options_requote=false\n      fi\n\n      # Break out of the loop if we already parsed every option.\n      test $# -gt 0 || break\n\n      # We expect that one of the options parsed in this function matches\n      # and thus we remove _G_opt from \"$@\" and need to re-quote.\n      _G_match_parse_options=:\n      _G_opt=$1\n      shift\n      case $_G_opt in\n        --debug|-x)   debug_cmd='set -x'\n                      func_echo \"enabling shell trace mode\" >&2\n                      $debug_cmd\n                      ;;\n\n        --no-warnings|--no-warning|--no-warn)\n                      set dummy --warnings none ${1+\"$@\"}\n                      shift\n\t\t      ;;\n\n        --warnings|--warning|-W)\n                      if test $# = 0 && func_missing_arg $_G_opt; then\n                        _G_parse_options_requote=:\n                        break\n                      fi\n                      case \" $warning_categories $1\" in\n                        *\" $1 \"*)\n                          # trailing space prevents matching last $1 above\n                          func_append_uniq opt_warning_types \" $1\"\n                          ;;\n                        *all)\n                          opt_warning_types=$warning_categories\n                          ;;\n                        *none)\n                          opt_warning_types=none\n                          warning_func=:\n                          ;;\n                        *error)\n                          opt_warning_types=$warning_categories\n                          warning_func=func_fatal_error\n                          ;;\n                        *)\n                          func_fatal_error \\\n                             \"unsupported warning category: '$1'\"\n                          ;;\n                      esac\n                      shift\n                      ;;\n\n        --verbose|-v) opt_verbose=: ;;\n        --version)    func_version ;;\n        -\\?|-h)       func_usage ;;\n        --help)       func_help ;;\n\n\t# Separate optargs to long options (plugins may need this):\n\t--*=*)        func_split_equals \"$_G_opt\"\n\t              set dummy \"$func_split_equals_lhs\" \\\n                          \"$func_split_equals_rhs\" ${1+\"$@\"}\n                      shift\n                      ;;\n\n       # Separate optargs to short options:\n        -W*)\n                      func_split_short_opt \"$_G_opt\"\n                      set dummy \"$func_split_short_opt_name\" \\\n                          \"$func_split_short_opt_arg\" ${1+\"$@\"}\n                      shift\n                      ;;\n\n        # Separate non-argument short options:\n        -\\?*|-h*|-v*|-x*)\n                      func_split_short_opt \"$_G_opt\"\n                      set dummy \"$func_split_short_opt_name\" \\\n                          \"-$func_split_short_opt_arg\" ${1+\"$@\"}\n                      shift\n                      ;;\n\n        --)           _G_parse_options_requote=: ; break ;;\n        -*)           func_fatal_help \"unrecognised option: '$_G_opt'\" ;;\n        *)            set dummy \"$_G_opt\" ${1+\"$@\"}; shift\n                      _G_match_parse_options=false\n                      break\n                      ;;\n      esac\n\n      if $_G_match_parse_options; then\n        _G_parse_options_requote=:\n      fi\n    done\n\n    if $_G_parse_options_requote; then\n      # save modified positional parameters for caller\n      func_quote eval ${1+\"$@\"}\n      func_parse_options_result=$func_quote_result\n    fi\n}\n\n\n# func_validate_options [ARG]...\n# ------------------------------\n# Perform any sanity checks on option settings and/or unconsumed\n# arguments.\nfunc_hookable func_validate_options\nfunc_validate_options ()\n{\n    $debug_cmd\n\n    # Display all warnings if -W was not given.\n    test -n \"$opt_warning_types\" || opt_warning_types=\" $warning_categories\"\n\n    func_run_hooks func_validate_options ${1+\"$@\"}\n    func_propagate_result func_run_hooks func_validate_options\n\n    # Bail if the options were screwed!\n    $exit_cmd $EXIT_FAILURE\n}\n\n\n\n## ----------------- ##\n## Helper functions. ##\n## ----------------- ##\n\n# This section contains the helper functions used by the rest of the\n# hookable option parser framework in ascii-betical order.\n\n\n# func_fatal_help ARG...\n# ----------------------\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    $debug_cmd\n\n    eval \\$ECHO \\\"\"Usage: $usage\"\\\"\n    eval \\$ECHO \\\"\"$fatal_help\"\\\"\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n\n# func_help\n# ---------\n# Echo long help message to standard output and exit.\nfunc_help ()\n{\n    $debug_cmd\n\n    func_usage_message\n    $ECHO \"$long_help_message\"\n    exit 0\n}\n\n\n# func_missing_arg ARGNAME\n# ------------------------\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    $debug_cmd\n\n    func_error \"Missing argument for '$1'.\"\n    exit_cmd=exit\n}\n\n\n# func_split_equals STRING\n# ------------------------\n# Set func_split_equals_lhs and func_split_equals_rhs shell variables\n# after splitting STRING at the '=' sign.\ntest -z \"$_G_HAVE_XSI_OPS\" \\\n    && (eval 'x=a/b/c;\n      test 5aa/bb/cc = \"${#x}${x%%/*}${x%/*}${x#*/}${x##*/}\"') 2>/dev/null \\\n    && _G_HAVE_XSI_OPS=yes\n\nif test yes = \"$_G_HAVE_XSI_OPS\"\nthen\n  # This is an XSI compatible shell, allowing a faster implementation...\n  eval 'func_split_equals ()\n  {\n      $debug_cmd\n\n      func_split_equals_lhs=${1%%=*}\n      func_split_equals_rhs=${1#*=}\n      if test \"x$func_split_equals_lhs\" = \"x$1\"; then\n        func_split_equals_rhs=\n      fi\n  }'\nelse\n  # ...otherwise fall back to using expr, which is often a shell builtin.\n  func_split_equals ()\n  {\n      $debug_cmd\n\n      func_split_equals_lhs=`expr \"x$1\" : 'x\\([^=]*\\)'`\n      func_split_equals_rhs=\n      test \"x$func_split_equals_lhs\" = \"x$1\" \\\n        || func_split_equals_rhs=`expr \"x$1\" : 'x[^=]*=\\(.*\\)$'`\n  }\nfi #func_split_equals\n\n\n# func_split_short_opt SHORTOPT\n# -----------------------------\n# Set func_split_short_opt_name and func_split_short_opt_arg shell\n# variables after splitting SHORTOPT after the 2nd character.\nif test yes = \"$_G_HAVE_XSI_OPS\"\nthen\n  # This is an XSI compatible shell, allowing a faster implementation...\n  eval 'func_split_short_opt ()\n  {\n      $debug_cmd\n\n      func_split_short_opt_arg=${1#??}\n      func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}\n  }'\nelse\n  # ...otherwise fall back to using expr, which is often a shell builtin.\n  func_split_short_opt ()\n  {\n      $debug_cmd\n\n      func_split_short_opt_name=`expr \"x$1\" : 'x-\\(.\\)'`\n      func_split_short_opt_arg=`expr \"x$1\" : 'x-.\\(.*\\)$'`\n  }\nfi #func_split_short_opt\n\n\n# func_usage\n# ----------\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $debug_cmd\n\n    func_usage_message\n    $ECHO \"Run '$progname --help |${PAGER-more}' for full usage\"\n    exit 0\n}\n\n\n# func_usage_message\n# ------------------\n# Echo short help message to standard output.\nfunc_usage_message ()\n{\n    $debug_cmd\n\n    eval \\$ECHO \\\"\"Usage: $usage\"\\\"\n    echo\n    $SED -n 's|^# ||\n        /^Written by/{\n          x;p;x\n        }\n\th\n\t/^Written by/q' < \"$progpath\"\n    echo\n    eval \\$ECHO \\\"\"$usage_message\"\\\"\n}\n\n\n# func_version\n# ------------\n# Echo version message to standard output and exit.\n# The version message is extracted from the calling file's header\n# comments, with leading '# ' stripped:\n#   1. First display the progname and version\n#   2. Followed by the header comment line matching  /^# Written by /\n#   3. Then a blank line followed by the first following line matching\n#      /^# Copyright /\n#   4. Immediately followed by any lines between the previous matches,\n#      except lines preceding the intervening completely blank line.\n# For example, see the header comments of this file.\nfunc_version ()\n{\n    $debug_cmd\n\n    printf '%s\\n' \"$progname $scriptversion\"\n    $SED -n '\n        /^# Written by /!b\n        s|^# ||; p; n\n\n        :fwd2blnk\n        /./ {\n          n\n          b fwd2blnk\n        }\n        p; n\n\n        :holdwrnt\n        s|^# ||\n        s|^# *$||\n        /^Copyright /!{\n          /./H\n          n\n          b holdwrnt\n        }\n\n        s|\\((C)\\)[ 0-9,-]*[ ,-]\\([1-9][0-9]* \\)|\\1 \\2|\n        G\n        s|\\(\\n\\)\\n*|\\1|g\n        p; q' < \"$progpath\"\n\n    exit $?\n}\n\n\n# Local variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-pattern: \"30/scriptversion=%:y-%02m-%02d.%02H; # UTC\"\n# time-stamp-time-zone: \"UTC\"\n# End:\n\n# Set a version string.\nscriptversion='(GNU libtool) 2.4.6.42-b88ce'\n\n\n# func_echo ARG...\n# ----------------\n# Libtool also displays the current mode in messages, so override\n# funclib.sh func_echo with this custom definition.\nfunc_echo ()\n{\n    $debug_cmd\n\n    _G_message=$*\n\n    func_echo_IFS=$IFS\n    IFS=$nl\n    for _G_line in $_G_message; do\n      IFS=$func_echo_IFS\n      $ECHO \"$progname${opt_mode+: $opt_mode}: $_G_line\"\n    done\n    IFS=$func_echo_IFS\n}\n\n\n# func_warning ARG...\n# -------------------\n# Libtool warnings are not categorized, so override funclib.sh\n# func_warning with this simpler definition.\nfunc_warning ()\n{\n    $debug_cmd\n\n    $warning_func ${1+\"$@\"}\n}\n\n\n## ---------------- ##\n## Options parsing. ##\n## ---------------- ##\n\n# Hook in the functions to make sure our own options are parsed during\n# the option parsing loop.\n\nusage='$progpath [OPTION]... [MODE-ARG]...'\n\n# Short help message in response to '-h'.\nusage_message=\"Options:\n       --config             show all configuration variables\n       --debug              enable verbose shell tracing\n   -n, --dry-run            display commands without modifying any files\n       --features           display basic configuration information and exit\n       --mode=MODE          use operation mode MODE\n       --no-warnings        equivalent to '-Wnone'\n       --preserve-dup-deps  don't remove duplicate dependency libraries\n       --quiet, --silent    don't print informational messages\n       --tag=TAG            use configuration variables from tag TAG\n   -v, --verbose            print more informational messages than default\n       --version            print version information\n   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]\n   -h, --help, --help-all   print short, long, or detailed help message\n\"\n\n# Additional text appended to 'usage_message' in response to '--help'.\nfunc_help ()\n{\n    $debug_cmd\n\n    func_usage_message\n    $ECHO \"$long_help_message\n\nMODE must be one of the following:\n\n       clean           remove files from the build directory\n       compile         compile a source file into a libtool object\n       execute         automatically set library path, then run a program\n       finish          complete the installation of libtool libraries\n       install         install libraries or executables\n       link            create a library or an executable\n       uninstall       remove libraries from an installed directory\n\nMODE-ARGS vary depending on the MODE.  When passed as first option,\n'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.\nTry '$progname --help --mode=MODE' for a more detailed description of MODE.\n\nWhen reporting a bug, please describe a test case to reproduce it and\ninclude the following information:\n\n       host-triplet:   $host\n       shell:          $SHELL\n       compiler:       $LTCC\n       compiler flags: $LTCFLAGS\n       linker:         $LD (gnu? $with_gnu_ld)\n       version:        $progname (GNU libtool) 2.4.6.42-b88ce\n       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`\n       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`\n\nReport bugs to <bug-libtool@gnu.org>.\nGNU libtool home page: <http://www.gnu.org/s/libtool/>.\nGeneral help using GNU software: <http://www.gnu.org/gethelp/>.\"\n    exit 0\n}\n\n\n# func_lo2o OBJECT-NAME\n# ---------------------\n# Transform OBJECT-NAME from a '.lo' suffix to the platform specific\n# object suffix.\n\nlo2o=s/\\\\.lo\\$/.$objext/\no2lo=s/\\\\.$objext\\$/.lo/\n\nif test yes = \"$_G_HAVE_XSI_OPS\"; then\n  eval 'func_lo2o ()\n  {\n    case $1 in\n      *.lo) func_lo2o_result=${1%.lo}.$objext ;;\n      *   ) func_lo2o_result=$1               ;;\n    esac\n  }'\n\n  # func_xform LIBOBJ-OR-SOURCE\n  # ---------------------------\n  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)\n  # suffix to a '.lo' libtool-object suffix.\n  eval 'func_xform ()\n  {\n    func_xform_result=${1%.*}.lo\n  }'\nelse\n  # ...otherwise fall back to using sed.\n  func_lo2o ()\n  {\n    func_lo2o_result=`$ECHO \"$1\" | $SED \"$lo2o\"`\n  }\n\n  func_xform ()\n  {\n    func_xform_result=`$ECHO \"$1\" | $SED 's|\\.[^.]*$|.lo|'`\n  }\nfi\n\n\n# func_fatal_configuration ARG...\n# -------------------------------\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_fatal_error ${1+\"$@\"} \\\n      \"See the $PACKAGE documentation for more information.\" \\\n      \"Fatal configuration error.\"\n}\n\n\n# func_config\n# -----------\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n\n# func_features\n# -------------\n# Display the features supported by this script.\nfunc_features ()\n{\n    echo \"host: $host\"\n    if test yes = \"$build_libtool_libs\"; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test yes = \"$build_old_libs\"; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n\n# func_enable_tag TAGNAME\n# -----------------------\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n    # Global variable:\n    tagname=$1\n\n    re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n    re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n    sed_extractcf=/$re_begincf/,/$re_endcf/p\n\n    # Validate tagname.\n    case $tagname in\n      *[!-_A-Za-z0-9,/]*)\n        func_fatal_error \"invalid tag name: $tagname\"\n        ;;\n    esac\n\n    # Don't test for the \"default\" C tag, as we know it's\n    # there but not specially marked.\n    case $tagname in\n        CC) ;;\n    *)\n        if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\t  taglist=\"$taglist $tagname\"\n\n\t  # Evaluate the configuration.  Be careful to quote the path\n\t  # and the sed script, to avoid splitting on whitespace, but\n\t  # also don't use non-portable quotes within backquotes within\n\t  # quotes we have to do it in 2 steps:\n\t  extractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\t  eval \"$extractedcf\"\n        else\n\t  func_error \"ignoring unknown tag $tagname\"\n        fi\n        ;;\n    esac\n}\n\n\n# func_check_version_match\n# ------------------------\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n    if test \"$package_revision\" != \"$macro_revision\"; then\n      if test \"$VERSION\" != \"$macro_version\"; then\n        if test -z \"$macro_version\"; then\n          cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n        else\n          cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n        fi\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n      fi\n\n      exit $EXIT_MISMATCH\n    fi\n}\n\n\n# libtool_options_prep [ARG]...\n# -----------------------------\n# Preparation for options parsed by libtool.\nlibtool_options_prep ()\n{\n    $debug_mode\n\n    # Option defaults:\n    opt_config=false\n    opt_dlopen=\n    opt_dry_run=false\n    opt_help=false\n    opt_mode=\n    opt_preserve_dup_deps=false\n    opt_quiet=false\n\n    nonopt=\n    preserve_args=\n\n    _G_rc_lt_options_prep=:\n\n    # Shorthand for --mode=foo, only valid as the first argument\n    case $1 in\n    clean|clea|cle|cl)\n      shift; set dummy --mode clean ${1+\"$@\"}; shift\n      ;;\n    compile|compil|compi|comp|com|co|c)\n      shift; set dummy --mode compile ${1+\"$@\"}; shift\n      ;;\n    execute|execut|execu|exec|exe|ex|e)\n      shift; set dummy --mode execute ${1+\"$@\"}; shift\n      ;;\n    finish|finis|fini|fin|fi|f)\n      shift; set dummy --mode finish ${1+\"$@\"}; shift\n      ;;\n    install|instal|insta|inst|ins|in|i)\n      shift; set dummy --mode install ${1+\"$@\"}; shift\n      ;;\n    link|lin|li|l)\n      shift; set dummy --mode link ${1+\"$@\"}; shift\n      ;;\n    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n      shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n      ;;\n    *)\n      _G_rc_lt_options_prep=false\n      ;;\n    esac\n\n    if $_G_rc_lt_options_prep; then\n      # Pass back the list of options.\n      func_quote eval ${1+\"$@\"}\n      libtool_options_prep_result=$func_quote_result\n    fi\n}\nfunc_add_hook func_options_prep libtool_options_prep\n\n\n# libtool_parse_options [ARG]...\n# ---------------------------------\n# Provide handling for libtool specific options.\nlibtool_parse_options ()\n{\n    $debug_cmd\n\n    _G_rc_lt_parse_options=false\n\n    # Perform our own loop to consume as many options as possible in\n    # each iteration.\n    while test $# -gt 0; do\n      _G_match_lt_parse_options=:\n      _G_opt=$1\n      shift\n      case $_G_opt in\n        --dry-run|--dryrun|-n)\n                        opt_dry_run=:\n                        ;;\n\n        --config)       func_config ;;\n\n        --dlopen|-dlopen)\n                        opt_dlopen=\"${opt_dlopen+$opt_dlopen\n}$1\"\n                        shift\n                        ;;\n\n        --preserve-dup-deps)\n                        opt_preserve_dup_deps=: ;;\n\n        --features)     func_features ;;\n\n        --finish)       set dummy --mode finish ${1+\"$@\"}; shift ;;\n\n        --help)         opt_help=: ;;\n\n        --help-all)     opt_help=': help-all' ;;\n\n        --mode)         test $# = 0 && func_missing_arg $_G_opt && break\n                        opt_mode=$1\n                        case $1 in\n                          # Valid mode arguments:\n                          clean|compile|execute|finish|install|link|relink|uninstall) ;;\n\n                          # Catch anything else as an error\n                          *) func_error \"invalid argument for $_G_opt\"\n                             exit_cmd=exit\n                             break\n                             ;;\n                        esac\n                        shift\n                        ;;\n\n        --no-silent|--no-quiet)\n                        opt_quiet=false\n                        func_append preserve_args \" $_G_opt\"\n                        ;;\n\n        --no-warnings|--no-warning|--no-warn)\n                        opt_warning=false\n                        func_append preserve_args \" $_G_opt\"\n                        ;;\n\n        --no-verbose)\n                        opt_verbose=false\n                        func_append preserve_args \" $_G_opt\"\n                        ;;\n\n        --silent|--quiet)\n                        opt_quiet=:\n                        opt_verbose=false\n                        func_append preserve_args \" $_G_opt\"\n                        ;;\n\n        --tag)          test $# = 0 && func_missing_arg $_G_opt && break\n                        opt_tag=$1\n                        func_append preserve_args \" $_G_opt $1\"\n                        func_enable_tag \"$1\"\n                        shift\n                        ;;\n\n        --verbose|-v)   opt_quiet=false\n                        opt_verbose=:\n                        func_append preserve_args \" $_G_opt\"\n                        ;;\n\n        # An option not handled by this hook function:\n        *)              set dummy \"$_G_opt\" ${1+\"$@\"} ; shift\n                        _G_match_lt_parse_options=false\n                        break\n                        ;;\n      esac\n      $_G_match_lt_parse_options && _G_rc_lt_parse_options=:\n    done\n\n    if $_G_rc_lt_parse_options; then\n      # save modified positional parameters for caller\n      func_quote eval ${1+\"$@\"}\n      libtool_parse_options_result=$func_quote_result\n    fi\n}\nfunc_add_hook func_parse_options libtool_parse_options\n\n\n\n# libtool_validate_options [ARG]...\n# ---------------------------------\n# Perform any sanity checks on option settings and/or unconsumed\n# arguments.\nlibtool_validate_options ()\n{\n    # save first non-option argument\n    if test 0 -lt $#; then\n      nonopt=$1\n      shift\n    fi\n\n    # preserve --debug\n    test : = \"$debug_cmd\" || func_append preserve_args \" --debug\"\n\n    case $host in\n      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452\n      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788\n      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)\n        # don't eliminate duplications in $postdeps and $predeps\n        opt_duplicate_compiler_generated_deps=:\n        ;;\n      *)\n        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps\n        ;;\n    esac\n\n    $opt_help || {\n      # Sanity checks first:\n      func_check_version_match\n\n      test yes != \"$build_libtool_libs\" \\\n        && test yes != \"$build_old_libs\" \\\n        && func_fatal_configuration \"not configured to build any kind of library\"\n\n      # Darwin sucks\n      eval std_shrext=\\\"$shrext_cmds\\\"\n\n      # Only execute mode is allowed to have -dlopen flags.\n      if test -n \"$opt_dlopen\" && test execute != \"$opt_mode\"; then\n        func_error \"unrecognized option '-dlopen'\"\n        $ECHO \"$help\" 1>&2\n        exit $EXIT_FAILURE\n      fi\n\n      # Change the help message to a mode-specific one.\n      generic_help=$help\n      help=\"Try '$progname --help --mode=$opt_mode' for more information.\"\n    }\n\n    # Pass back the unparsed argument list\n    func_quote eval ${1+\"$@\"}\n    libtool_validate_options_result=$func_quote_result\n}\nfunc_add_hook func_validate_options libtool_validate_options\n\n\n# Process options as early as possible so that --help and --version\n# can return quickly.\nfunc_options ${1+\"$@\"}\neval set dummy \"$func_options_result\"; shift\n\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\nmagic='%%%MAGIC variable%%%'\nmagic_exe='%%%MAGIC EXE variable%%%'\n\n# Global variables.\nextracted_archives=\nextracted_serial=0\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n}\n\n# func_generated_by_libtool\n# True iff stdin has been generated by Libtool. This function is only\n# a basic sanity check; it will hardly flush out determined imposters.\nfunc_generated_by_libtool_p ()\n{\n  $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_p file\n# True iff FILE is a libtool '.la' library or '.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null | func_generated_by_libtool_p\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool '.la' library or '.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if 'file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case $lalib_p_line in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test yes = \"$lalib_p\"\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    test -f \"$1\" &&\n      $lt_truncate_bin < \"$1\" 2>/dev/null | func_generated_by_libtool_p\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_dirname_and_basename \"$1\" \"\" \".\"\n    func_stripname '' '.exe' \"$func_basename_result\"\n    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $debug_cmd\n\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$sp$nl\n      eval cmd=\\\"$cmd\\\"\n      IFS=$save_ifs\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# 'FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $debug_cmd\n\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_resolve_sysroot PATH\n# Replace a leading = in PATH with a sysroot.  Store the result into\n# func_resolve_sysroot_result\nfunc_resolve_sysroot ()\n{\n  func_resolve_sysroot_result=$1\n  case $func_resolve_sysroot_result in\n  =*)\n    func_stripname '=' '' \"$func_resolve_sysroot_result\"\n    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result\n    ;;\n  esac\n}\n\n# func_replace_sysroot PATH\n# If PATH begins with the sysroot, replace it with = and\n# store the result into func_replace_sysroot_result.\nfunc_replace_sysroot ()\n{\n  case $lt_sysroot:$1 in\n  ?*:\"$lt_sysroot\"*)\n    func_stripname \"$lt_sysroot\" '' \"$1\"\n    func_replace_sysroot_result='='$func_stripname_result\n    ;;\n  *)\n    # Including no sysroot.\n    func_replace_sysroot_result=$1\n    ;;\n  esac\n}\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $debug_cmd\n\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n\tfunc_append_quoted CC_quoted \"$arg\"\n      done\n      CC_expanded=`func_echo_all $CC`\n      CC_quoted_expanded=`func_echo_all $CC_quoted`\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n      \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_append_quoted CC_quoted \"$arg\"\n\t    done\n\t    CC_expanded=`func_echo_all $CC`\n\t    CC_quoted_expanded=`func_echo_all $CC_quoted`\n\t    case \"$@ \" in\n\t    \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n\t    \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with '--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=$1\n    if test yes = \"$build_libtool_libs\"; then\n      write_lobj=\\'$2\\'\n    else\n      write_lobj=none\n    fi\n\n    if test yes = \"$build_old_libs\"; then\n      write_oldobj=\\'$3\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"$write_libobj\"\n    }\n}\n\n\n##################################################\n# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #\n##################################################\n\n# func_convert_core_file_wine_to_w32 ARG\n# Helper function used by file name conversion functions when $build is *nix,\n# and $host is mingw, cygwin, or some other w32 environment. Relies on a\n# correctly configured wine environment available, with the winepath program\n# in $build's $PATH.\n#\n# ARG is the $build file name to be converted to w32 format.\n# Result is available in $func_convert_core_file_wine_to_w32_result, and will\n# be empty on error (or when ARG is empty)\nfunc_convert_core_file_wine_to_w32 ()\n{\n  $debug_cmd\n\n  func_convert_core_file_wine_to_w32_result=$1\n  if test -n \"$1\"; then\n    # Unfortunately, winepath does not exit with a non-zero error code, so we\n    # are forced to check the contents of stdout. On the other hand, if the\n    # command is not found, the shell will set an exit code of 127 and print\n    # *an error message* to stdout. So we must check for both error code of\n    # zero AND non-empty stdout, which explains the odd construction:\n    func_convert_core_file_wine_to_w32_tmp=`winepath -w \"$1\" 2>/dev/null`\n    if test \"$?\" -eq 0 && test -n \"$func_convert_core_file_wine_to_w32_tmp\"; then\n      func_convert_core_file_wine_to_w32_result=`$ECHO \"$func_convert_core_file_wine_to_w32_tmp\" |\n        $SED -e \"$sed_naive_backslashify\"`\n    else\n      func_convert_core_file_wine_to_w32_result=\n    fi\n  fi\n}\n# end: func_convert_core_file_wine_to_w32\n\n\n# func_convert_core_path_wine_to_w32 ARG\n# Helper function used by path conversion functions when $build is *nix, and\n# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly\n# configured wine environment available, with the winepath program in $build's\n# $PATH. Assumes ARG has no leading or trailing path separator characters.\n#\n# ARG is path to be converted from $build format to win32.\n# Result is available in $func_convert_core_path_wine_to_w32_result.\n# Unconvertible file (directory) names in ARG are skipped; if no directory names\n# are convertible, then the result may be empty.\nfunc_convert_core_path_wine_to_w32 ()\n{\n  $debug_cmd\n\n  # unfortunately, winepath doesn't convert paths, only file names\n  func_convert_core_path_wine_to_w32_result=\n  if test -n \"$1\"; then\n    oldIFS=$IFS\n    IFS=:\n    for func_convert_core_path_wine_to_w32_f in $1; do\n      IFS=$oldIFS\n      func_convert_core_file_wine_to_w32 \"$func_convert_core_path_wine_to_w32_f\"\n      if test -n \"$func_convert_core_file_wine_to_w32_result\"; then\n        if test -z \"$func_convert_core_path_wine_to_w32_result\"; then\n          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result\n        else\n          func_append func_convert_core_path_wine_to_w32_result \";$func_convert_core_file_wine_to_w32_result\"\n        fi\n      fi\n    done\n    IFS=$oldIFS\n  fi\n}\n# end: func_convert_core_path_wine_to_w32\n\n\n# func_cygpath ARGS...\n# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when\n# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)\n# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or\n# (2), returns the Cygwin file name or path in func_cygpath_result (input\n# file name or path is assumed to be in w32 format, as previously converted\n# from $build's *nix or MSYS format). In case (3), returns the w32 file name\n# or path in func_cygpath_result (input file name or path is assumed to be in\n# Cygwin format). Returns an empty string on error.\n#\n# ARGS are passed to cygpath, with the last one being the file name or path to\n# be converted.\n#\n# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH\n# environment variable; do not put it in $PATH.\nfunc_cygpath ()\n{\n  $debug_cmd\n\n  if test -n \"$LT_CYGPATH\" && test -f \"$LT_CYGPATH\"; then\n    func_cygpath_result=`$LT_CYGPATH \"$@\" 2>/dev/null`\n    if test \"$?\" -ne 0; then\n      # on failure, ensure result is empty\n      func_cygpath_result=\n    fi\n  else\n    func_cygpath_result=\n    func_error \"LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'\"\n  fi\n}\n#end: func_cygpath\n\n\n# func_convert_core_msys_to_w32 ARG\n# Convert file name or path ARG from MSYS format to w32 format.  Return\n# result in func_convert_core_msys_to_w32_result.\nfunc_convert_core_msys_to_w32 ()\n{\n  $debug_cmd\n\n  # awkward: cmd appends spaces to result\n  func_convert_core_msys_to_w32_result=`( cmd //c echo \"$1\" ) 2>/dev/null |\n    $SED -e 's/[ ]*$//' -e \"$sed_naive_backslashify\"`\n}\n#end: func_convert_core_msys_to_w32\n\n\n# func_convert_file_check ARG1 ARG2\n# Verify that ARG1 (a file name in $build format) was converted to $host\n# format in ARG2. Otherwise, emit an error message, but continue (resetting\n# func_to_host_file_result to ARG1).\nfunc_convert_file_check ()\n{\n  $debug_cmd\n\n  if test -z \"$2\" && test -n \"$1\"; then\n    func_error \"Could not determine host file name corresponding to\"\n    func_error \"  '$1'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback:\n    func_to_host_file_result=$1\n  fi\n}\n# end func_convert_file_check\n\n\n# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH\n# Verify that FROM_PATH (a path in $build format) was converted to $host\n# format in TO_PATH. Otherwise, emit an error message, but continue, resetting\n# func_to_host_file_result to a simplistic fallback value (see below).\nfunc_convert_path_check ()\n{\n  $debug_cmd\n\n  if test -z \"$4\" && test -n \"$3\"; then\n    func_error \"Could not determine the host path corresponding to\"\n    func_error \"  '$3'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback.  This is a deliberately simplistic \"conversion\" and\n    # should not be \"improved\".  See libtool.info.\n    if test \"x$1\" != \"x$2\"; then\n      lt_replace_pathsep_chars=\"s|$1|$2|g\"\n      func_to_host_path_result=`echo \"$3\" |\n        $SED -e \"$lt_replace_pathsep_chars\"`\n    else\n      func_to_host_path_result=$3\n    fi\n  fi\n}\n# end func_convert_path_check\n\n\n# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG\n# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT\n# and appending REPL if ORIG matches BACKPAT.\nfunc_convert_path_front_back_pathsep ()\n{\n  $debug_cmd\n\n  case $4 in\n  $1 ) func_to_host_path_result=$3$func_to_host_path_result\n    ;;\n  esac\n  case $4 in\n  $2 ) func_append func_to_host_path_result \"$3\"\n    ;;\n  esac\n}\n# end func_convert_path_front_back_pathsep\n\n\n##################################################\n# $build to $host FILE NAME CONVERSION FUNCTIONS #\n##################################################\n# invoked via '$to_host_file_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# Result will be available in $func_to_host_file_result.\n\n\n# func_to_host_file ARG\n# Converts the file name ARG from $build format to $host format. Return result\n# in func_to_host_file_result.\nfunc_to_host_file ()\n{\n  $debug_cmd\n\n  $to_host_file_cmd \"$1\"\n}\n# end func_to_host_file\n\n\n# func_to_tool_file ARG LAZY\n# converts the file name ARG from $build format to toolchain format. Return\n# result in func_to_tool_file_result.  If the conversion in use is listed\n# in (the comma separated) LAZY, no conversion takes place.\nfunc_to_tool_file ()\n{\n  $debug_cmd\n\n  case ,$2, in\n    *,\"$to_tool_file_cmd\",*)\n      func_to_tool_file_result=$1\n      ;;\n    *)\n      $to_tool_file_cmd \"$1\"\n      func_to_tool_file_result=$func_to_host_file_result\n      ;;\n  esac\n}\n# end func_to_tool_file\n\n\n# func_convert_file_noop ARG\n# Copy ARG to func_to_host_file_result.\nfunc_convert_file_noop ()\n{\n  func_to_host_file_result=$1\n}\n# end func_convert_file_noop\n\n\n# func_convert_file_msys_to_w32 ARG\n# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_msys_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_file_result=$1\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_to_host_file_result=$func_convert_core_msys_to_w32_result\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_w32\n\n\n# func_convert_file_cygwin_to_w32 ARG\n# Convert file name ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_cygwin_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_file_result=$1\n  if test -n \"$1\"; then\n    # because $build is cygwin, we call \"the\" cygpath in $PATH; no need to use\n    # LT_CYGPATH in this case.\n    func_to_host_file_result=`cygpath -m \"$1\"`\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_cygwin_to_w32\n\n\n# func_convert_file_nix_to_w32 ARG\n# Convert file name ARG from *nix to w32 format.  Requires a wine environment\n# and a working winepath. Returns result in func_to_host_file_result.\nfunc_convert_file_nix_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_file_result=$1\n  if test -n \"$1\"; then\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_w32\n\n\n# func_convert_file_msys_to_cygwin ARG\n# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_file_msys_to_cygwin ()\n{\n  $debug_cmd\n\n  func_to_host_file_result=$1\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_file_result=$func_cygpath_result\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_cygwin\n\n\n# func_convert_file_nix_to_cygwin ARG\n# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed\n# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result\n# in func_to_host_file_result.\nfunc_convert_file_nix_to_cygwin ()\n{\n  $debug_cmd\n\n  func_to_host_file_result=$1\n  if test -n \"$1\"; then\n    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_file_wine_to_w32_result\"\n    func_to_host_file_result=$func_cygpath_result\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_cygwin\n\n\n#############################################\n# $build to $host PATH CONVERSION FUNCTIONS #\n#############################################\n# invoked via '$to_host_path_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# The result will be available in $func_to_host_path_result.\n#\n# Path separators are also converted from $build format to $host format.  If\n# ARG begins or ends with a path separator character, it is preserved (but\n# converted to $host format) on output.\n#\n# All path conversion functions are named using the following convention:\n#   file name conversion function    : func_convert_file_X_to_Y ()\n#   path conversion function         : func_convert_path_X_to_Y ()\n# where, for any given $build/$host combination the 'X_to_Y' value is the\n# same.  If conversion functions are added for new $build/$host combinations,\n# the two new functions must follow this pattern, or func_init_to_host_path_cmd\n# will break.\n\n\n# func_init_to_host_path_cmd\n# Ensures that function \"pointer\" variable $to_host_path_cmd is set to the\n# appropriate value, based on the value of $to_host_file_cmd.\nto_host_path_cmd=\nfunc_init_to_host_path_cmd ()\n{\n  $debug_cmd\n\n  if test -z \"$to_host_path_cmd\"; then\n    func_stripname 'func_convert_file_' '' \"$to_host_file_cmd\"\n    to_host_path_cmd=func_convert_path_$func_stripname_result\n  fi\n}\n\n\n# func_to_host_path ARG\n# Converts the path ARG from $build format to $host format. Return result\n# in func_to_host_path_result.\nfunc_to_host_path ()\n{\n  $debug_cmd\n\n  func_init_to_host_path_cmd\n  $to_host_path_cmd \"$1\"\n}\n# end func_to_host_path\n\n\n# func_convert_path_noop ARG\n# Copy ARG to func_to_host_path_result.\nfunc_convert_path_noop ()\n{\n  func_to_host_path_result=$1\n}\n# end func_convert_path_noop\n\n\n# func_convert_path_msys_to_w32 ARG\n# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_path_result.\nfunc_convert_path_msys_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_path_result=$1\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from ARG.  MSYS\n    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';\n    # and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=$func_convert_core_msys_to_w32_result\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_w32\n\n\n# func_convert_path_cygwin_to_w32 ARG\n# Convert path ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_cygwin_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_path_result=$1\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_to_host_path_result=`cygpath -m -p \"$func_to_host_path_tmp1\"`\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_cygwin_to_w32\n\n\n# func_convert_path_nix_to_w32 ARG\n# Convert path ARG from *nix to w32 format.  Requires a wine environment and\n# a working winepath.  Returns result in func_to_host_file_result.\nfunc_convert_path_nix_to_w32 ()\n{\n  $debug_cmd\n\n  func_to_host_path_result=$1\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_w32\n\n\n# func_convert_path_msys_to_cygwin ARG\n# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_path_msys_to_cygwin ()\n{\n  $debug_cmd\n\n  func_to_host_path_result=$1\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_path_result=$func_cygpath_result\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_cygwin\n\n\n# func_convert_path_nix_to_cygwin ARG\n# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a\n# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_nix_to_cygwin ()\n{\n  $debug_cmd\n\n  func_to_host_path_result=$1\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from\n    # ARG. msys behavior is inconsistent here, cygpath turns them\n    # into '.;' and ';.', and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_path_wine_to_w32_result\"\n    func_to_host_path_result=$func_cygpath_result\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_cygwin\n\n\n# func_dll_def_p FILE\n# True iff FILE is a Windows DLL '.def' file.\n# Keep in sync with _LT_DLL_DEF_P in libtool.m4\nfunc_dll_def_p ()\n{\n  $debug_cmd\n\n  func_dll_def_p_tmp=`$SED -n \\\n    -e 's/^[\t ]*//' \\\n    -e '/^\\(;.*\\)*$/d' \\\n    -e 's/^\\(EXPORTS\\|LIBRARY\\)\\([\t ].*\\)*$/DEF/p' \\\n    -e q \\\n    \"$1\"`\n  test DEF = \"$func_dll_def_p_tmp\"\n}\n\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $debug_cmd\n\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=$nonopt  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=$arg\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=$arg\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify '-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          func_append pie_flag \" $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  func_append later \" $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=$IFS; IFS=,\n\t  for arg in $args; do\n\t    IFS=$save_ifs\n\t    func_append_quoted lastarg \"$arg\"\n\t  done\n\t  IFS=$save_ifs\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  func_append base_compile \" $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=$srcfile\n\t  srcfile=$arg\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_append_quoted base_compile \"$lastarg\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with '-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=$func_basename_result\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from '$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest yes = \"$build_libtool_libs\" \\\n\t  || func_fatal_configuration \"cannot build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_arg pretty \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_arg_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name '$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=$func_basename_result\n    xdir=$func_dirname_result\n    lobj=$xdir$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test yes = \"$build_old_libs\"; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test no = \"$pic_mode\" && test pass_all != \"$deplibs_check_method\"; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test no = \"$compiler_c_o\"; then\n      output_obj=`$ECHO \"$srcfile\" | $SED 's%^.*/%%; s%\\.[^.]*$%%'`.$objext\n      lockfile=$output_obj.lock\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test yes = \"$need_locks\"; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test warn = \"$need_locks\"; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support '-c' and '-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      func_append removelist \" $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    func_append removelist \" $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    func_to_tool_file \"$srcfile\" func_convert_file_msys_to_w32\n    srcfile=$func_to_tool_file_result\n    func_quote_arg pretty \"$srcfile\"\n    qsrcfile=$func_quote_arg_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test yes = \"$build_libtool_libs\"; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test no != \"$pic_mode\"; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tfunc_append command \" -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test warn = \"$need_locks\" &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support '-c' and '-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test yes = \"$suppress_opt\"; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test yes = \"$build_old_libs\"; then\n      if test yes != \"$pic_mode\"; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test yes = \"$compiler_c_o\"; then\n\tfunc_append command \" -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      func_append command \"$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test warn = \"$need_locks\" &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support '-c' and '-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test no != \"$need_locks\"; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\n  test compile = \"$opt_mode\" && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $opt_mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to build PIC objects only\n  -prefer-non-pic   try to build non-PIC objects only\n  -shared           do not build a '.o' file suitable for static linking\n  -static           only build a '.o' file suitable for static linking\n  -Wc,FLAG          pass FLAG directly to the compiler\n\nCOMPILE-COMMAND is a command to be used in creating a 'standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix '.c' with the\nlibrary object suffix, '.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to '-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe '--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the 'install' or 'cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -bindir BINDIR    specify path to binaries directory (for systems where\n                    libraries must be found in the PATH setting at runtime)\n  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  use a list of object files found in FILE to specify objects\n  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n  -Wc,FLAG\n  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler\n  -Wl,FLAG\n  -Xlinker FLAG     pass linker-specific FLAG directly to the linker\n  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)\n\nAll other options (arguments beginning with '-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in '.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in '.la', then a libtool library is created,\nonly library objects ('.lo' files) may be specified, and '-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created\nusing 'ar' and 'ranlib', or on Windows using 'lib'.\n\nIf OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode '$opt_mode'\"\n        ;;\n    esac\n\n    echo\n    $ECHO \"Try '$progname --help' for more information about other modes.\"\n}\n\n# Now that we've collected a possible --mode arg, show help if necessary\nif $opt_help; then\n  if test : = \"$opt_help\"; then\n    func_mode_help\n  else\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\tfunc_mode_help\n      done\n    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\techo\n\tfunc_mode_help\n      done\n    } |\n    $SED '1d\n      /^When reporting/,/^Report/{\n\tH\n\td\n      }\n      $x\n      /information about other modes/d\n      /more detailed .*MODE/d\n      s/^Usage:.*--mode=\\([^ ]*\\) .*/Description of \\1 mode:/'\n  fi\n  exit $?\nfi\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $debug_cmd\n\n    # The first argument is the command name.\n    cmd=$nonopt\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $opt_dlopen; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"'$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"'$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"'$file' was not linked with '-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=$func_dirname_result\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  func_append dir \"/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find '$dlname' in '$dir' or '$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=$func_dirname_result\n\t;;\n\n      *)\n\tfunc_warning \"'-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=$absdir\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=$magic\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -* | *.la | *.lo ) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=$progdir/$program\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=$progdir/$program\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_append_quoted args \"$file\"\n    done\n\n    if $opt_dry_run; then\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\techo \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    else\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\\$cmd$args\n    fi\n}\n\ntest execute = \"$opt_mode\" && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $debug_cmd\n\n    libs=\n    libdirs=\n    admincmds=\n\n    for opt in \"$nonopt\" ${1+\"$@\"}\n    do\n      if test -d \"$opt\"; then\n\tfunc_append libdirs \" $opt\"\n\n      elif test -f \"$opt\"; then\n\tif func_lalib_unsafe_p \"$opt\"; then\n\t  func_append libs \" $opt\"\n\telse\n\t  func_warning \"'$opt' is not a valid libtool archive\"\n\tfi\n\n      else\n\tfunc_fatal_error \"invalid argument '$opt'\"\n      fi\n    done\n\n    if test -n \"$libs\"; then\n      if test -n \"$lt_sysroot\"; then\n        sysroot_regex=`$ECHO \"$lt_sysroot\" | $SED \"$sed_make_literal_regex\"`\n        sysroot_cmd=\"s/\\([ ']\\)$sysroot_regex/\\1/g;\"\n      else\n        sysroot_cmd=\n      fi\n\n      # Remove sysroot references\n      if $opt_dry_run; then\n        for lib in $libs; do\n          echo \"removing references to $lt_sysroot and '=' prefixes from $lib\"\n        done\n      else\n        tmpdir=`func_mktempdir`\n        for lib in $libs; do\n\t  $SED -e \"$sysroot_cmd s/\\([ ']-[LR]\\)=/\\1/g; s/\\([ ']\\)=/\\1/g\" $lib \\\n\t    > $tmpdir/tmp-la\n\t  mv -f $tmpdir/tmp-la $lib\n\tdone\n        ${RM}r \"$tmpdir\"\n      fi\n    fi\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || func_append admincmds \"\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_quiet && exit $EXIT_SUCCESS\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      echo \"----------------------------------------------------------------------\"\n      echo \"Libraries have been installed in:\"\n      for libdir in $libdirs; do\n\t$ECHO \"   $libdir\"\n      done\n      echo\n      echo \"If you ever happen to want to link against installed libraries\"\n      echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n      echo \"specify the full pathname of the library, or use the '-LLIBDIR'\"\n      echo \"flag during linking and do at least one of the following:\"\n      if test -n \"$shlibpath_var\"; then\n\techo \"   - add LIBDIR to the '$shlibpath_var' environment variable\"\n\techo \"     during execution\"\n      fi\n      if test -n \"$runpath_var\"; then\n\techo \"   - add LIBDIR to the '$runpath_var' environment variable\"\n\techo \"     during linking\"\n      fi\n      if test -n \"$hardcode_libdir_flag_spec\"; then\n\tlibdir=LIBDIR\n\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n\t$ECHO \"   - use the '$flag' linker flag\"\n      fi\n      if test -n \"$admincmds\"; then\n\t$ECHO \"   - have your system administrator run these commands:$admincmds\"\n      fi\n      if test -f /etc/ld.so.conf; then\n\techo \"   - have your system administrator add LIBDIR to '/etc/ld.so.conf'\"\n      fi\n      echo\n\n      echo \"See any operating system documentation about shared libraries for\"\n      case $host in\n\tsolaris2.[6789]|solaris2.1[0-9])\n\t  echo \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t  echo \"pages.\"\n\t  ;;\n\t*)\n\t  echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n\t  ;;\n      esac\n      echo \"----------------------------------------------------------------------\"\n    fi\n    exit $EXIT_SUCCESS\n}\n\ntest finish = \"$opt_mode\" && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $debug_cmd\n\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$SHELL\" = \"$nonopt\" || test /bin/sh = \"$nonopt\" ||\n       # Allow the use of GNU shtool's install command.\n       case $nonopt in *shtool*) :;; *) false;; esac\n    then\n      # Aesthetically quote it.\n      func_quote_arg pretty \"$nonopt\"\n      install_prog=\"$func_quote_arg_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_arg pretty \"$arg\"\n    func_append install_prog \"$func_quote_arg_result\"\n    install_shared_prog=$install_prog\n    case \" $install_prog \" in\n      *[\\\\\\ /]cp\\ *) install_cp=: ;;\n      *) install_cp=false ;;\n    esac\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=false\n    stripme=\n    no_mode=:\n    for arg\n    do\n      arg2=\n      if test -n \"$dest\"; then\n\tfunc_append files \" $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=: ;;\n      -f)\n\tif $install_cp; then :; else\n\t  prev=$arg\n\tfi\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  if test X-m = \"X$prev\" && test -n \"$install_override_mode\"; then\n\t    arg2=$install_override_mode\n\t    no_mode=false\n\t  fi\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_arg pretty \"$arg\"\n      func_append install_prog \" $func_quote_arg_result\"\n      if test -n \"$arg2\"; then\n\tfunc_quote_arg pretty \"$arg2\"\n      fi\n      func_append install_shared_prog \" $func_quote_arg_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the '$prev' option requires an argument\"\n\n    if test -n \"$install_override_mode\" && $no_mode; then\n      if $install_cp; then :; else\n\tfunc_quote_arg pretty \"$install_override_mode\"\n\tfunc_append install_shared_prog \" -m $func_quote_arg_result\"\n      fi\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=:\n    if $isdir; then\n      destdir=$dest\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=$func_dirname_result\n      destname=$func_basename_result\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"'$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"'$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=$magic\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tfunc_append staticlibs \" $file\"\n\t;;\n\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"'$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append current_libdirs \" $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append future_libdirs \" $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=$func_dirname_result\n\tfunc_append dir \"$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"$destdir\" | $SED -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install '$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking '$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink '\\''$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=$1\n\t  shift\n\n\t  srcname=$realname\n\t  test -n \"$relink_command\" && srcname=${realname}T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_shared_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=$stripme\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\n\t      ;;\n\t    esac\n\t    ;;\n\t  os2*)\n\t    case $realname in\n\t    *_dll.a)\n\t      tstripme=\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try 'ln -sf' first, because the 'ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=$destdir/$realname\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=$func_basename_result\n\tinstname=$dir/${name}i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && func_append staticlibs \" $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=$destdir/$destname\n\telse\n\t  func_basename \"$file\"\n\t  destfile=$func_basename_result\n\t  destfile=$destdir/$destfile\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=$destfile\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to '$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test yes = \"$build_old_libs\"; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=$destdir/$destname\n\telse\n\t  func_basename \"$file\"\n\t  destfile=$func_basename_result\n\t  destfile=$destdir/$destfile\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=.exe\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script '$wrapper'\"\n\n\t  finalize=:\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=$libdir/`$ECHO \"$lib\" | $SED 's%^.*/%%g'`\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"'$lib' has not been installed in '$libdir'\"\n\t      finalize=false\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test no = \"$fast_install\" && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if $finalize; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=$func_basename_result\n\t        outputname=$tmpdir/$file\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"$relink_command\" | $SED 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_quiet || {\n\t          func_quote_arg expand,pretty \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_arg_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink '$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=$outputname\n\t      else\n\t        func_warning \"cannot relink '$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"$file$stripped_ext\" | $SED \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=$func_basename_result\n\n      # Set up the ranlib parameters.\n      oldlib=$destdir/$name\n      func_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n      tool_oldlib=$func_to_tool_file_result\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $tool_oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run '$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL \"$progpath\" $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest install = \"$opt_mode\" && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $debug_cmd\n\n    my_outputname=$1\n    my_originator=$2\n    my_pic_p=${3-false}\n    my_prefix=`$ECHO \"$my_originator\" | $SED 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test no != \"$dlself\"; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=${my_outputname}S.c\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=$output_objdir/$my_outputname.nm\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))\n#pragma GCC diagnostic ignored \\\"-Wstrict-prototypes\\\"\n#endif\n\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE\n/* DATA imports from DLLs on WIN32 can't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined __osf__\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test yes = \"$dlself\"; then\n\t  func_verbose \"generating symbol list for '$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"$objs$old_deplibs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_to_tool_file \"$progfile\" func_convert_file_msys_to_w32\n\t    func_verbose \"extracting global C symbols from '$func_to_tool_file_result'\"\n\t    $opt_dry_run || eval \"$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=$output_objdir/$outputname.exp\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"$SED -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin* | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from '$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=$func_basename_result\n          case $host in\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # if an import library, we need to obtain dlname\n\t      if func_win32_import_lib_p \"$dlprefile\"; then\n\t        func_tr_sh \"$dlprefile\"\n\t        eval \"curr_lafile=\\$libfile_$func_tr_sh_result\"\n\t        dlprefile_dlbasename=\n\t        if test -n \"$curr_lafile\" && func_lalib_p \"$curr_lafile\"; then\n\t          # Use subshell, to avoid clobbering current variable values\n\t          dlprefile_dlname=`source \"$curr_lafile\" && echo \"$dlname\"`\n\t          if test -n \"$dlprefile_dlname\"; then\n\t            func_basename \"$dlprefile_dlname\"\n\t            dlprefile_dlbasename=$func_basename_result\n\t          else\n\t            # no lafile. user explicitly requested -dlpreopen <import library>.\n\t            $sharedlib_from_linklib_cmd \"$dlprefile\"\n\t            dlprefile_dlbasename=$sharedlib_from_linklib_result\n\t          fi\n\t        fi\n\t        $opt_dry_run || {\n\t          if test -n \"$dlprefile_dlbasename\"; then\n\t            eval '$ECHO \": $dlprefile_dlbasename\" >> \"$nlist\"'\n\t          else\n\t            func_warning \"Could not compute DLL name from $name\"\n\t            eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          fi\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe |\n\t            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'\"\n\t        }\n\t      else # not an import lib\n\t        $opt_dry_run || {\n\t          eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t        }\n\t      fi\n\t    ;;\n\t    *)\n\t      $opt_dry_run || {\n\t        eval '$ECHO \": $name \" >> \"$nlist\"'\n\t        func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t        eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t      }\n\t    ;;\n          esac\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    echo '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  func_show_eval '$RM \"${nlist}I\"'\n\t  if test -n \"$global_symbol_to_import\"; then\n\t    eval \"$global_symbol_to_import\"' < \"$nlist\"S > \"$nlist\"I'\n\t  fi\n\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\nextern LT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\\\n\"\n\n\t  if test -s \"$nlist\"I; then\n\t    echo >> \"$output_objdir/$my_dlsyms\" \"\\\nstatic void lt_syminit(void)\n{\n  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;\n  for (; symbol->name; ++symbol)\n    {\"\n\t    $SED 's/.*/      if (STREQ (symbol->name, \\\"&\\\")) symbol->address = (void *) \\&&;/' < \"$nlist\"I >> \"$output_objdir/$my_dlsyms\"\n\t    echo >> \"$output_objdir/$my_dlsyms\" \"\\\n    }\n}\"\n\t  fi\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\nLT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{ {\\\"$my_originator\\\", (void *) 0},\"\n\n\t  if test -s \"$nlist\"I; then\n\t    echo >> \"$output_objdir/$my_dlsyms\" \"\\\n  {\\\"@INIT@\\\", (void *) &lt_syminit},\"\n\t  fi\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    $my_pic_p && pic_flag_for_symtable=\" $pic_flag\"\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) func_append symtab_cflags \" $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\" \"${nlist}I\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=$output_objdir/${my_outputname}S.$objext\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for '$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"$compile_command\" | $SED \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"$finalize_command\" | $SED \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_cygming_gnu_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is a GNU/binutils-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_gnu_implib_p ()\n{\n  $debug_cmd\n\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_gnu_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`\n  test -n \"$func_cygming_gnu_implib_tmp\"\n}\n\n# func_cygming_ms_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is an MS-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_ms_implib_p ()\n{\n  $debug_cmd\n\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_ms_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $GREP '_NULL_IMPORT_DESCRIPTOR'`\n  test -n \"$func_cygming_ms_implib_tmp\"\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\n# Despite the name, also deal with 64 bit binaries.\nfunc_win32_libid ()\n{\n  $debug_cmd\n\n  win32_libid_type=unknown\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then\n      case $nm_interface in\n      \"MS dumpbin\")\n\tif func_cygming_ms_implib_p \"$1\" ||\n\t   func_cygming_gnu_implib_p \"$1\"\n\tthen\n\t  win32_nmres=import\n\telse\n\t  win32_nmres=\n\tfi\n\t;;\n      *)\n\tfunc_to_tool_file \"$1\" func_convert_file_msys_to_w32\n\twin32_nmres=`eval $NM -f posix -A \\\"$func_to_tool_file_result\\\" |\n\t  $SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s|.*|import|\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n\t;;\n      esac\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n# func_cygming_dll_for_implib ARG\n#\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib ()\n{\n  $debug_cmd\n\n  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify \"$1\"`\n}\n\n# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs\n#\n# The is the core of a fallback implementation of a\n# platform-specific function to extract the name of the\n# DLL associated with the specified import library LIBNAME.\n#\n# SECTION_NAME is either .idata$6 or .idata$7, depending\n# on the platform and compiler that created the implib.\n#\n# Echos the name of the DLL associated with the\n# specified import library.\nfunc_cygming_dll_for_implib_fallback_core ()\n{\n  $debug_cmd\n\n  match_literal=`$ECHO \"$1\" | $SED \"$sed_make_literal_regex\"`\n  $OBJDUMP -s --section \"$1\" \"$2\" 2>/dev/null |\n    $SED '/^Contents of section '\"$match_literal\"':/{\n      # Place marker at beginning of archive member dllname section\n      s/.*/====MARK====/\n      p\n      d\n    }\n    # These lines can sometimes be longer than 43 characters, but\n    # are always uninteresting\n    /:[\t ]*file format pe[i]\\{,1\\}-/d\n    /^In archive [^:]*:/d\n    # Ensure marker is printed\n    /^====MARK====/p\n    # Remove all lines with less than 43 characters\n    /^.\\{43\\}/!d\n    # From remaining lines, remove first 43 characters\n    s/^.\\{43\\}//' |\n    $SED -n '\n      # Join marker and all lines until next marker into a single line\n      /^====MARK====/ b para\n      H\n      $ b para\n      b\n      :para\n      x\n      s/\\n//g\n      # Remove the marker\n      s/^====MARK====//\n      # Remove trailing dots and whitespace\n      s/[\\. \\t]*$//\n      # Print\n      /./p' |\n    # we now have a list, one entry per line, of the stringified\n    # contents of the appropriate section of all members of the\n    # archive that possess that section. Heuristic: eliminate\n    # all those that have a first or second character that is\n    # a '.' (that is, objdump's representation of an unprintable\n    # character.) This should work for all archives with less than\n    # 0x302f exports -- but will fail for DLLs whose name actually\n    # begins with a literal '.' or a single character followed by\n    # a '.'.\n    #\n    # Of those that remain, print the first one.\n    $SED -e '/^\\./d;/^.\\./d;q'\n}\n\n# func_cygming_dll_for_implib_fallback ARG\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n#\n# This fallback implementation is for use when $DLLTOOL\n# does not support the --identify-strict option.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib_fallback ()\n{\n  $debug_cmd\n\n  if func_cygming_gnu_implib_p \"$1\"; then\n    # binutils import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' \"$1\"`\n  elif func_cygming_ms_implib_p \"$1\"; then\n    # ms-generated import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' \"$1\"`\n  else\n    # unknown\n    sharedlib_from_linklib_result=\n  fi\n}\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $debug_cmd\n\n    f_ex_an_ar_dir=$1; shift\n    f_ex_an_ar_oldlib=$1\n    if test yes = \"$lock_old_archive_extraction\"; then\n      lockfile=$f_ex_an_ar_oldlib.lock\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    fi\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" \\\n\t\t   'stat=$?; rm -f \"$lockfile\"; exit $stat'\n    if test yes = \"$lock_old_archive_extraction\"; then\n      $opt_dry_run || rm -f \"$lockfile\"\n    fi\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $debug_cmd\n\n    my_gentop=$1; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\n    my_xlib=\n    my_xabs=\n    my_xdir=\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=$my_xlib ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=$func_basename_result\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=$my_gentop/$my_xlib_u\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  func_basename \"$darwin_archive\"\n\t  darwin_base_archive=$func_basename_result\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches; do\n\t      func_mkdir_p \"unfat-$$/$darwin_base_archive-$darwin_arch\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive\" \"$darwin_archive\"\n\t      cd \"unfat-$$/$darwin_base_archive-$darwin_arch\"\n\t      func_extract_an_archive \"`pwd`\" \"$darwin_base_archive\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$sed_basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | sort | $NL2SP`\n    done\n\n    func_extract_archives_result=$my_oldobjs\n}\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory where it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=${1-no}\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    file=\\\"\\$0\\\"\"\n\n    func_quote_arg pretty \"$ECHO\"\n    qECHO=$func_quote_arg_result\n    $ECHO \"\\\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n    ECHO=$qECHO\n  fi\n\n# Very basic option parsing. These options are (a) specific to\n# the libtool wrapper, (b) are identical between the wrapper\n# /script/ and the wrapper /executable/ that is used only on\n# windows platforms, and (c) all begin with the string \"--lt-\"\n# (application programs are unlikely to have options that match\n# this pattern).\n#\n# There are only two supported options: --lt-debug and\n# --lt-dump-script. There is, deliberately, no --lt-help.\n#\n# The first argument to this parsing function should be the\n# script's $0 value, followed by \"$@\".\nlt_option_debug=\nfunc_parse_lt_options ()\n{\n  lt_script_arg0=\\$0\n  shift\n  for lt_opt\n  do\n    case \\\"\\$lt_opt\\\" in\n    --lt-debug) lt_option_debug=1 ;;\n    --lt-dump-script)\n        lt_dump_D=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\\`\n        test \\\"X\\$lt_dump_D\\\" = \\\"X\\$lt_script_arg0\\\" && lt_dump_D=.\n        lt_dump_F=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%^.*/%%'\\`\n        cat \\\"\\$lt_dump_D/\\$lt_dump_F\\\"\n        exit 0\n      ;;\n    --lt-*)\n        \\$ECHO \\\"Unrecognized --lt- option: '\\$lt_opt'\\\" 1>&2\n        exit 1\n      ;;\n    esac\n  done\n\n  # Print the debug banner immediately:\n  if test -n \\\"\\$lt_option_debug\\\"; then\n    echo \\\"$outputname:$output:\\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\\\" 1>&2\n  fi\n}\n\n# Used when --lt-debug. Prints its arguments to stdout\n# (redirection is the responsibility of the caller)\nfunc_lt_dump_args ()\n{\n  lt_dump_args_N=1;\n  for lt_arg\n  do\n    \\$ECHO \\\"$outputname:$output:\\$LINENO: newargv[\\$lt_dump_args_N]: \\$lt_arg\\\"\n    lt_dump_args_N=\\`expr \\$lt_dump_args_N + 1\\`\n  done\n}\n\n# Core function for launching the target application\nfunc_exec_program_core ()\n{\n\"\n  case $host in\n  # Backslashes separate directories on plain windows\n  *-*-mingw | *-*-os2* | *-cegcc*)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"$outputname:$output:\\$LINENO: newargv[0]: \\$progdir\\\\\\\\\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n\n  *)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"$outputname:$output:\\$LINENO: newargv[0]: \\$progdir/\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n  esac\n  $ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n}\n\n# A function to encapsulate launching the target application\n# Strips options in the --lt-* namespace from \\$@ and\n# launches target application with the remaining arguments.\nfunc_exec_program ()\n{\n  case \\\" \\$* \\\" in\n  *\\\\ --lt-*)\n    for lt_wr_arg\n    do\n      case \\$lt_wr_arg in\n      --lt-*) ;;\n      *) set x \\\"\\$@\\\" \\\"\\$lt_wr_arg\\\"; shift;;\n      esac\n      shift\n    done ;;\n  esac\n  func_exec_program_core \\${1+\\\"\\$@\\\"}\n}\n\n  # Parse options\n  func_parse_lt_options \\\"\\$0\\\" \\${1+\\\"\\$@\\\"}\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  done\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"\\$thisdir\\\" | $SED 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test yes = \"$fast_install\"; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | $SED 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t\\$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# fixup the dll searchpath if we need to.\n\t#\n\t# Fix the DLL searchpath if we need to.  Do this before prepending\n\t# to shlibpath, because on Windows, both are PATH and uninstalled\n\t# libraries must come first.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t# Export our shlibpath_var if we have one.\n\tif test yes = \"$shlibpath_overrides_runpath\" && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"\\$$shlibpath_var\\\" | $SED 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n      func_exec_program \\${1+\\\"\\$@\\\"}\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: '\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    \\$ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#ifdef _MSC_VER\n# define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)\n\n/* declarations of non-ANSI functions */\n#if defined __MINGW32__\n# ifdef __STRICT_ANSI__\nint _putenv (const char *);\n# endif\n#elif defined __CYGWIN__\n# ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n# endif\n/* #elif defined other_platform || defined ... */\n#endif\n\n/* portability defines, excluding path handling macros */\n#if defined _MSC_VER\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n# define S_IXUSR _S_IEXEC\n#elif defined __MINGW32__\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n#elif defined __CYGWIN__\n# define HAVE_SETENV\n# define FOPEN_WB \"wb\"\n/* #elif defined other platforms ... */\n#endif\n\n#if defined PATH_MAX\n# define LT_PATHMAX PATH_MAX\n#elif defined MAXPATHLEN\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n/* path handling portability macros */\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \\\n  defined __OS2__\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free (stale); stale = 0; } \\\n} while (0)\n\n#if defined LT_DEBUGWRAPPER\nstatic int lt_debug = 1;\n#else\nstatic int lt_debug = 0;\n#endif\n\nconst char *program_name = \"libtool-wrapper\"; /* in case xstrdup fails */\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_debugprintf (const char *file, int line, const char *fmt, ...);\nvoid lt_fatal (const char *file, int line, const char *message, ...);\nstatic const char *nonnull (const char *s);\nstatic const char *nonempty (const char *s);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\nchar **prepare_spawn (char **argv);\nvoid lt_dump_script (FILE *f);\nEOF\n\n\t    cat <<EOF\n#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)\n# define externally_visible volatile\n#else\n# define externally_visible __attribute__((externally_visible)) volatile\n#endif\nexternally_visible const char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test yes = \"$shlibpath_overrides_runpath\" && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_path \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_path \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test yes = \"$fast_install\"; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\nstatic const char *debug_opt            = LTWRAPPER_OPTION_PREFIX \"debug\";\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  int rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  newargz = XMALLOC (char *, (size_t) argc + 1);\n\n  /* very simple arg parsing; don't want to rely on getopt\n   * also, copy all non cwrapper options to newargz, except\n   * argz[0], which is handled differently\n   */\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (STREQ (argv[i], dumpscript_opt))\n\t{\nEOF\n\t    case $host in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  lt_dump_script (stdout);\n\t  return 0;\n\t}\n      if (STREQ (argv[i], debug_opt))\n\t{\n          lt_debug = 1;\n          continue;\n\t}\n      if (STREQ (argv[i], ltwrapper_option_prefix))\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (__FILE__, __LINE__,\n\t\t    \"unrecognized %s option: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\nEOF\n\t    cat <<EOF\n  /* The GNU banner must be the first non-error debug message */\n  lt_debugprintf (__FILE__, __LINE__, \"libtool wrapper (GNU $PACKAGE) $VERSION\\n\");\nEOF\n\t    cat <<\"EOF\"\n  lt_debugprintf (__FILE__, __LINE__, \"(main) argv[0]: %s\\n\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__, \"(main) program_name: %s\\n\", program_name);\n\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (__FILE__, __LINE__, \"couldn't find %s\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (before symlink chase) at: %s\\n\",\n\t\t  tmp_pathspec);\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (after symlink chase) at: %s\\n\",\n\t\t  actual_cwrapper_path);\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(main) libtool target name: %s\\n\",\n\t\t  target_name);\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must\n     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)\n     because on Windows, both *_VARNAMEs are PATH but uninstalled\n     libraries must come first. */\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n\n  lt_debugprintf (__FILE__, __LINE__, \"(main) lt_argv_zero: %s\\n\",\n\t\t  nonnull (lt_argv_zero));\n  for (i = 0; i < newargc; i++)\n    {\n      lt_debugprintf (__FILE__, __LINE__, \"(main) newargz[%d]: %s\\n\",\n\t\t      i, nonnull (newargz[i]));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  newargz = prepare_spawn (newargz);\n  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"(main) failed to launch target \\\"%s\\\": %s\\n\",\n\t\t      lt_argv_zero, nonnull (strerror (errno)));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (__FILE__, __LINE__, \"memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined HAVE_DOS_BASED_FILE_SYSTEM\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(check_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(make_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  size_t tmp_len;\n  char *concat_name;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(find_executable): %s\\n\",\n                  nonempty (wrapper));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined HAVE_DOS_BASED_FILE_SYSTEM\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined HAVE_DOS_BASED_FILE_SYSTEM\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = (size_t) (q - p);\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n                              nonnull (strerror (errno)));\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n              nonnull (strerror (errno)));\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"checking path component for symlinks: %s\\n\",\n\t\t      tmp_pathspec);\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  lt_fatal (__FILE__, __LINE__,\n\t\t    \"error accessing file \\\"%s\\\": %s\",\n\t\t    tmp_pathspec, nonnull (strerror (errno)));\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (__FILE__, __LINE__,\n\t\t\"could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (STREQ (str, pat))\n\t*str = '\\0';\n    }\n  return str;\n}\n\nvoid\nlt_debugprintf (const char *file, int line, const char *fmt, ...)\n{\n  va_list args;\n  if (lt_debug)\n    {\n      (void) fprintf (stderr, \"%s:%s:%d: \", program_name, file, line);\n      va_start (args, fmt);\n      (void) vfprintf (stderr, fmt, args);\n      va_end (args);\n    }\n}\n\nstatic void\nlt_error_core (int exit_status, const char *file,\n\t       int line, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s:%s:%d: %s: \", program_name, file, line, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *file, int line, const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, file, line, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nstatic const char *\nnonnull (const char *s)\n{\n  return s ? s : \"(null)\";\n}\n\nstatic const char *\nnonempty (const char *s)\n{\n  return (s && !*s) ? \"(empty)\" : nonnull (s);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_setenv) setting '%s' to '%s'\\n\",\n                  nonnull (name), nonnull (value));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    size_t len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      size_t orig_value_len = strlen (orig_value);\n      size_t add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      size_t len = strlen (new_value);\n      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[--len] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nEOF\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n\n/* Prepares an argument vector before calling spawn().\n   Note that spawn() does not by itself call the command interpreter\n     (getenv (\"COMSPEC\") != NULL ? getenv (\"COMSPEC\") :\n      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\n         GetVersionEx(&v);\n         v.dwPlatformId == VER_PLATFORM_WIN32_NT;\n      }) ? \"cmd.exe\" : \"command.com\").\n   Instead it simply concatenates the arguments, separated by ' ', and calls\n   CreateProcess().  We must quote the arguments since Win32 CreateProcess()\n   interprets characters like ' ', '\\t', '\\\\', '\"' (but not '<' and '>') in a\n   special way:\n   - Space and tab are interpreted as delimiters. They are not treated as\n     delimiters if they are surrounded by double quotes: \"...\".\n   - Unescaped double quotes are removed from the input. Their only effect is\n     that within double quotes, space and tab are treated like normal\n     characters.\n   - Backslashes not followed by double quotes are not special.\n   - But 2*n+1 backslashes followed by a double quote become\n     n backslashes followed by a double quote (n >= 0):\n       \\\" -> \"\n       \\\\\\\" -> \\\"\n       \\\\\\\\\\\" -> \\\\\"\n */\n#define SHELL_SPECIAL_CHARS \"\\\"\\\\ \\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\"\n#define SHELL_SPACE_CHARS \" \\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\"\nchar **\nprepare_spawn (char **argv)\n{\n  size_t argc;\n  char **new_argv;\n  size_t i;\n\n  /* Count number of arguments.  */\n  for (argc = 0; argv[argc] != NULL; argc++)\n    ;\n\n  /* Allocate new argument vector.  */\n  new_argv = XMALLOC (char *, argc + 1);\n\n  /* Put quoted arguments into the new argument vector.  */\n  for (i = 0; i < argc; i++)\n    {\n      const char *string = argv[i];\n\n      if (string[0] == '\\0')\n\tnew_argv[i] = xstrdup (\"\\\"\\\"\");\n      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)\n\t{\n\t  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);\n\t  size_t length;\n\t  unsigned int backslashes;\n\t  const char *s;\n\t  char *quoted_string;\n\t  char *p;\n\n\t  length = 0;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    length++;\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\tlength += backslashes + 1;\n\t      length++;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    length += backslashes + 1;\n\n\t  quoted_string = XMALLOC (char, length + 1);\n\n\t  p = quoted_string;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    *p++ = '\"';\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\t{\n\t\t  unsigned int j;\n\t\t  for (j = backslashes + 1; j > 0; j--)\n\t\t    *p++ = '\\\\';\n\t\t}\n\t      *p++ = c;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    {\n\t      unsigned int j;\n\t      for (j = backslashes; j > 0; j--)\n\t\t*p++ = '\\\\';\n\t      *p++ = '\"';\n\t    }\n\t  *p = '\\0';\n\n\t  new_argv[i] = quoted_string;\n\t}\n      else\n\tnew_argv[i] = (char *) string;\n    }\n  new_argv[argc] = NULL;\n\n  return new_argv;\n}\nEOF\n\t\t;;\n\t    esac\n\n            cat <<\"EOF\"\nvoid lt_dump_script (FILE* f)\n{\nEOF\n\t    func_emit_wrapper yes |\n\t      $SED -n -e '\ns/^\\(.\\{79\\}\\)\\(..*\\)/\\1\\\n\\2/\nh\ns/\\([\\\\\"]\\)/\\\\\\1/g\ns/$/\\\\n/\ns/\\([^\\n]*\\).*/  fputs (\"\\1\", f);/p\ng\nD'\n            cat <<\"EOF\"\n}\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_win32_import_lib_p ARG\n# True if ARG is an import lib, as indicated by $file_magic_cmd\nfunc_win32_import_lib_p ()\n{\n    $debug_cmd\n\n    case `eval $file_magic_cmd \\\"\\$1\\\" 2>/dev/null | $SED -e 10q` in\n    *import*) : ;;\n    *) false ;;\n    esac\n}\n\n# func_suncc_cstd_abi\n# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!\n# Several compiler flags select an ABI that is incompatible with the\n# Cstd library. Avoid specifying it if any are in CXXFLAGS.\nfunc_suncc_cstd_abi ()\n{\n    $debug_cmd\n\n    case \" $compile_command \" in\n    *\" -compat=g \"*|*\\ -std=c++[0-9][0-9]\\ *|*\" -library=stdcxx4 \"*|*\" -library=stlport4 \"*)\n      suncc_use_cstd_abi=no\n      ;;\n    *)\n      suncc_use_cstd_abi=yes\n      ;;\n    esac\n}\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $debug_cmd\n\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # what system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll that has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    bindir=\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    os2dllname=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=false\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=$wl-single_module\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest yes != \"$build_libtool_libs\" \\\n\t  && func_fatal_configuration \"cannot build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test yes = \"$build_libtool_libs\" && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=$1\n      shift\n      func_quote_arg pretty,unquoted \"$arg\"\n      qarg=$func_quote_arg_unquoted_result\n      func_append libtool_args \" $func_quote_arg_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tbindir)\n\t  bindir=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\tdlfiles|dlprefiles)\n\t  $preload || {\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=:\n\t  }\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test no = \"$dlself\"; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test dlprefiles = \"$prev\"; then\n\t      dlself=yes\n\t    elif test dlfiles = \"$prev\" && test yes != \"$dlopen_self\"; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test dlfiles = \"$prev\"; then\n\t      func_append dlfiles \" $arg\"\n\t    else\n\t      func_append dlprefiles \" $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=$arg\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file '$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) func_append deplibs \" $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\tmllvm)\n\t  # Clang does not use LLVM to link, so we can simply discard any\n\t  # '-mllvm $arg' options when doing the link step.\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      func_append moreargs \" $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test none = \"$pic_object\" &&\n\t\t   test none = \"$non_pic_object\"; then\n\t\t  func_fatal_error \"cannot find name of object for '$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=$func_dirname_result\n\n\t\tif test none != \"$pic_object\"; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=$xdir$pic_object\n\n\t\t  if test dlfiles = \"$prev\"; then\n\t\t    if test yes = \"$build_libtool_libs\" && test yes = \"$dlopen_support\"; then\n\t\t      func_append dlfiles \" $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test dlprefiles = \"$prev\"; then\n\t\t    # Preload the old-style object.\n\t\t    func_append dlprefiles \" $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=$pic_object\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test none != \"$non_pic_object\"; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=$xdir$non_pic_object\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test none = \"$pic_object\"; then\n\t\t    arg=$non_pic_object\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=$pic_object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=$func_dirname_result\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"'$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file '$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tos2dllname)\n\t  os2dllname=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=-$arg\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test rpath = \"$prev\"; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append rpath \" $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append xrpath \" $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=$arg\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  func_append weak_libs \" $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=$arg\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"'-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -bindir)\n\tprev=bindir\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test X-export-symbols = \"X$arg\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname \"-L\" '' \"$arg\"\n\tif test -z \"$func_stripname_result\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between '-L' and '$1'\"\n\t  else\n\t    func_fatal_error \"need path for '-L' option\"\n\t  fi\n\tfi\n\tfunc_resolve_sysroot \"$func_stripname_result\"\n\tdir=$func_resolve_sysroot_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of '$dir'\"\n\t  dir=$absdir\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"* | *\" $arg \"*)\n\t  # Will only happen for absolute or sysroot arguments\n\t  ;;\n\t*)\n\t  # Preserve sysroot, but never include relative directories\n\t  case $dir in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]* | =*) func_append deplibs \" $arg\" ;;\n\t    *) func_append deplibs \" -L$dir\" ;;\n\t  esac\n\t  func_append lib_search_path \" $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"$dir\" | $SED 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) func_append dllsearchpath \":$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test X-lc = \"X$arg\" || test X-lm = \"X$arg\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test X-lc = \"X$arg\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test X-lc = \"X$arg\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test X-lc = \"X$arg\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test X-lc = \"X$arg\" && continue\n\t    ;;\n\t  esac\n\telif test X-lc_r = \"X$arg\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tfunc_append deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      -mllvm)\n\tprev=mllvm\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot|--sysroot)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) func_append new_inherited_linker_flags \" $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=$wl-multi_module\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"'-no-install' is ignored for $host\"\n\t  func_warning \"assuming '-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -os2dllname)\n\tprev=os2dllname\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t=*)\n\t  func_stripname '=' '' \"$dir\"\n\t  dir=$lt_sysroot$func_stripname_result\n\t  ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) func_append xrpath \" $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=$IFS; IFS=,\n\tfor flag in $args; do\n\t  IFS=$save_ifs\n          func_quote_arg pretty \"$flag\"\n\t  func_append arg \" $func_quote_arg_result\"\n\t  func_append compiler_flags \" $func_quote_arg_result\"\n\tdone\n\tIFS=$save_ifs\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=$IFS; IFS=,\n\tfor flag in $args; do\n\t  IFS=$save_ifs\n          func_quote_arg pretty \"$flag\"\n\t  func_append arg \" $wl$func_quote_arg_result\"\n\t  func_append compiler_flags \" $wl$func_quote_arg_result\"\n\t  func_append linker_flags \" $func_quote_arg_result\"\n\tdone\n\tIFS=$save_ifs\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_arg pretty \"$arg\"\n\targ=$func_quote_arg_result\n\t;;\n\n      # Flags to be passed through unchanged, with rationale:\n      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler\n      # -r[0-9][0-9]*        specify processor for the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler\n      # +DA*, +DD*           enable 64-bit mode for the HP compiler\n      # -q*                  compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC\n      # -F/path              path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC\n      # -fstack-protector*   stack protector flags for GCC\n      # @file                GCC response files\n      # -tp=*                Portland pgcc target processor selection\n      # --sysroot=*          for sysroot support\n      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization\n      # -specs=*             GCC specs files\n      # -stdlib=*            select c++ std lib with clang\n      # -fsanitize=*         Clang/GCC memory and address sanitizer\n      # -fuse-ld=*           Linker select flags for GCC\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \\\n      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \\\n      -specs=*|-fsanitize=*|-fuse-ld=*)\n        func_quote_arg pretty \"$arg\"\n\targ=$func_quote_arg_result\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        func_append compiler_flags \" $arg\"\n        continue\n        ;;\n\n      -Z*)\n        if test os2 = \"`expr $host : '.*\\(os2\\)'`\"; then\n          # OS/2 uses -Zxxx to specify OS/2-specific options\n\t  compiler_flags=\"$compiler_flags $arg\"\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  case $arg in\n\t  -Zlinker | -Zstack)\n\t    prev=xcompiler\n\t    ;;\n\t  esac\n\t  continue\n        else\n\t  # Otherwise treat like 'Some other compiler flag' below\n\t  func_quote_arg pretty \"$arg\"\n\t  arg=$func_quote_arg_result\n        fi\n\t;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_arg pretty \"$arg\"\n\targ=$func_quote_arg_result\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tfunc_append objs \" $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test none = \"$pic_object\" &&\n\t     test none = \"$non_pic_object\"; then\n\t    func_fatal_error \"cannot find name of object for '$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=$func_dirname_result\n\n\t  test none = \"$pic_object\" || {\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=$xdir$pic_object\n\n\t    if test dlfiles = \"$prev\"; then\n\t      if test yes = \"$build_libtool_libs\" && test yes = \"$dlopen_support\"; then\n\t\tfunc_append dlfiles \" $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test dlprefiles = \"$prev\"; then\n\t      # Preload the old-style object.\n\t      func_append dlprefiles \" $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=$pic_object\n\t  }\n\n\t  # Non-PIC object.\n\t  if test none != \"$non_pic_object\"; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=$xdir$non_pic_object\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test none = \"$pic_object\"; then\n\t      arg=$non_pic_object\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=$pic_object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=$func_dirname_result\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"'$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tfunc_append deplibs \" $arg\"\n\tfunc_append old_deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tfunc_resolve_sysroot \"$arg\"\n\tif test dlfiles = \"$prev\"; then\n\t  # This library was specified with -dlopen.\n\t  func_append dlfiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telif test dlprefiles = \"$prev\"; then\n\t  # The library was specified with -dlpreopen.\n\t  func_append dlprefiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telse\n\t  func_append deplibs \" $func_resolve_sysroot_result\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_arg pretty \"$arg\"\n\targ=$func_quote_arg_result\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the '$prevarg' option requires an argument\"\n\n    if test yes = \"$export_dynamic\" && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=$func_basename_result\n    libobjs_save=$libobjs\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"\\$$shlibpath_var\\\" \\| \\$SED \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    # Definition is injected by LT_CONFIG during libtool generation.\n    func_munge_path_list sys_lib_dlsearch_path \"$LT_SYS_LIBRARY_PATH\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=$func_dirname_result$objdir\n    func_to_tool_file \"$output_objdir/\"\n    tool_output_objdir=$func_to_tool_file_result\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_preserve_dup_deps; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\tesac\n      fi\n      func_append libs \" $deplib\"\n    done\n\n    if test lib = \"$linkmode\"; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) func_append specialdeplibs \" $pre_post_deps\" ;;\n\t  esac\n\t  func_append pre_post_deps \" $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can '-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=false\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test lib,link = \"$linkmode,$pass\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=$tmp_deplibs\n      fi\n\n      if test lib,link = \"$linkmode,$pass\" ||\n\t test prog,scan = \"$linkmode,$pass\"; then\n\tlibs=$deplibs\n\tdeplibs=\n      fi\n      if test prog = \"$linkmode\"; then\n\tcase $pass in\n\tdlopen) libs=$dlfiles ;;\n\tdlpreopen) libs=$dlprefiles ;;\n\tlink) libs=\"$deplibs %DEPLIBS% $dependency_libs\" ;;\n\tesac\n      fi\n      if test lib,dlpreopen = \"$linkmode,$pass\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  func_resolve_sysroot \"$lib\"\n\t  case $lib in\n\t  *.la)\tfunc_source \"$func_resolve_sysroot_result\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n\t    func_basename \"$deplib\"\n            deplib_base=$func_basename_result\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) func_append deplibs \" $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=$dlprefiles\n      fi\n      if test dlopen = \"$pass\"; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=$deplibs\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=false\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\t  if test prog,link = \"$linkmode,$pass\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    func_append compiler_flags \" $deplib\"\n\t    if test lib = \"$linkmode\"; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test lib != \"$linkmode\" && test prog != \"$linkmode\"; then\n\t    func_warning \"'-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test lib = \"$linkmode\"; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=$searchdir/lib$name$search_ext\n\t      if test -f \"$lib\"; then\n\t\tif test .la = \"$search_ext\"; then\n\t\t  found=:\n\t\telse\n\t\t  found=false\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if $found; then\n\t    # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=$l\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\"; then # only static version available\n\t\t    found=false\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=$func_dirname_result\n\t\t    lib=$ladir/$old_library\n\t\t    if test prog,link = \"$linkmode,$pass\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test lib = \"$linkmode\" && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  else\n\t    # deplib doesn't seem to be a libtool library\n\t    if test prog,link = \"$linkmode,$pass\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test lib = \"$linkmode\" && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test prog,link = \"$linkmode,$pass\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test lib = \"$linkmode\"; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test conv = \"$pass\" && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  prog)\n\t    if test conv = \"$pass\"; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test scan = \"$pass\"; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"'-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test link = \"$pass\"; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    dir=$func_resolve_sysroot_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append xrpath \" $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la)\n\t  func_resolve_sysroot \"$deplib\"\n\t  lib=$func_resolve_sysroot_result\n\t  ;;\n\t*.$libext)\n\t  if test conv = \"$pass\"; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=false\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"$deplib\\\"\" 2>/dev/null | $SED 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=:\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=:\n\t\t;;\n\t      esac\n\t      if $valid_a_lib; then\n\t\techo\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      else\n\t\techo\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\techo \"*** that it is just a static archive that I should not use here.\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test link != \"$pass\"; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test conv = \"$pass\"; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test prog = \"$linkmode\"; then\n\t    if test dlpreopen = \"$pass\" || test yes != \"$dlopen_support\" || test no = \"$build_libtool_libs\"; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      func_append newdlprefiles \" $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      func_append newdlfiles \" $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=:\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\t$found || test -f \"$lib\" \\\n\t  || func_fatal_error \"cannot find the library '$lib' or unhandled argument '$deplib'\"\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"'$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=$func_dirname_result\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"$inherited_linker_flags\" | $SED 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) func_append new_inherited_linker_flags \" $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \" $dependency_libs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test lib,link = \"$linkmode,$pass\" ||\n\t   test prog,scan = \"$linkmode,$pass\" ||\n\t   { test prog != \"$linkmode\" && test lib != \"$linkmode\"; }; then\n\t  test -n \"$dlopen\" && func_append dlfiles \" $dlopen\"\n\t  test -n \"$dlpreopen\" && func_append dlprefiles \" $dlpreopen\"\n\tfi\n\n\tif test conv = \"$pass\"; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for '$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    func_append convenience \" $ladir/$objdir/$old_library\"\n\t    func_append old_convenience \" $ladir/$objdir/$old_library\"\n\t  elif test prog != \"$linkmode\" && test lib != \"$linkmode\"; then\n\t    func_fatal_error \"'$lib' is not a convenience library\"\n\t  fi\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    deplibs=\"$deplib $deplibs\"\n\t    if $opt_preserve_dup_deps; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $deplib\"\n\t  done\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tif test -n \"$old_library\" &&\n\t   { test yes = \"$prefer_static_libs\" ||\n\t     test built,no = \"$prefer_static_libs,$installed\"; }; then\n\t  linklib=$old_library\n\telse\n\t  for l in $old_library $library_names; do\n\t    linklib=$l\n\t  done\n\tfi\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for '$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test dlopen = \"$pass\"; then\n\t  test -z \"$libdir\" \\\n\t    && func_fatal_error \"cannot -dlopen a convenience library: '$lib'\"\n\t  if test -z \"$dlname\" ||\n\t     test yes != \"$dlopen_support\" ||\n\t     test no = \"$build_libtool_libs\"\n\t  then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    func_append dlprefiles \" $lib $dependency_libs\"\n\t  else\n\t    func_append newdlfiles \" $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=$ladir ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of '$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=$ladir\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=$func_basename_result\n\n\t# Find the relevant object directory and library name.\n\tif test yes = \"$installed\"; then\n\t  if test ! -f \"$lt_sysroot$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library '$lib' was moved.\"\n\t    dir=$ladir\n\t    absdir=$abs_ladir\n\t    libdir=$abs_ladir\n\t  else\n\t    dir=$lt_sysroot$libdir\n\t    absdir=$lt_sysroot$libdir\n\t  fi\n\t  test yes = \"$hardcode_automatic\" && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=$ladir\n\t    absdir=$abs_ladir\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  else\n\t    dir=$ladir/$objdir\n\t    absdir=$abs_ladir/$objdir\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test dlpreopen = \"$pass\"; then\n\t  if test -z \"$libdir\" && test prog = \"$linkmode\"; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: '$lib'\"\n\t  fi\n\t  case $host in\n\t    # special handling for platforms with PE-DLLs.\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # Linker will automatically link against shared library if both\n\t      # static and shared are present.  Therefore, ensure we extract\n\t      # symbols from the import library if a shared library is present\n\t      # (otherwise, the dlopen module name will be incorrect).  We do\n\t      # this by putting the import library name into $newdlprefiles.\n\t      # We recover the dlopen module name by 'saving' the la file\n\t      # name in a special purpose variable, and (later) extracting the\n\t      # dlname from the la file.\n\t      if test -n \"$dlname\"; then\n\t        func_tr_sh \"$dir/$linklib\"\n\t        eval \"libfile_$func_tr_sh_result=\\$abs_ladir/\\$laname\"\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      fi\n\t    ;;\n\t    * )\n\t      # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t      # are required to link).\n\t      if test -n \"$old_library\"; then\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t      elif test -n \"$dlname\"; then\n\t        func_append newdlprefiles \" $dir/$dlname\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      fi\n\t    ;;\n\t  esac\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test lib = \"$linkmode\"; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test prog,link = \"$linkmode,$pass\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test prog = \"$linkmode\" && test link != \"$pass\"; then\n\t  func_append newlib_search_path \" $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=false\n\t  if test no != \"$link_all_deplibs\" || test -z \"$library_names\" ||\n\t     test no = \"$build_libtool_libs\"; then\n\t    linkalldeplibs=:\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         func_resolve_sysroot \"$func_stripname_result\"\n\t         func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if $linkalldeplibs; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_preserve_dup_deps; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test prog,link = \"$linkmode,$pass\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test no = \"$prefer_static_libs\" ||\n\t         test built,yes = \"$prefer_static_libs,$installed\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\"; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case $temp_rpath: in\n\t      *\"$absdir:\"*) ;;\n\t      *) func_append temp_rpath \"$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if $alldeplibs &&\n\t     { test pass_all = \"$deplibs_check_method\" ||\n\t       { test yes = \"$build_libtool_libs\" &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test built = \"$use_static_libs\" && test yes = \"$installed\"; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test no = \"$use_static_libs\" || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc* | *os2*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test no = \"$installed\"; then\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=$dlpremoduletest\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test yes = \"$shouldnotlink\" && test link = \"$pass\"; then\n\t    echo\n\t    if test prog = \"$linkmode\"; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test lib = \"$linkmode\" &&\n\t     test yes = \"$hardcode_into_libs\"; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=$1\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=$dlname\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc* | *os2*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=-$major\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=$realname\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=$soname\n\t    func_basename \"$soroot\"\n\t    soname=$func_basename_result\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from '$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for '$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test prog = \"$linkmode\" || test relink != \"$opt_mode\"; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test no = \"$hardcode_direct\"; then\n\t\tadd=$dir/$linklib\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;\n\t\t  *-*-sysv4*uw2*) add_dir=-L$dir ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=-L$dir ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we cannot\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\"; then\n\t\t\t  echo\n\t\t\t  echo \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  echo \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=$dir/$old_library\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=$dir/$old_library\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test no = \"$hardcode_minus_L\"; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=$dir ;;\n\t\tesac\n\t\tadd_dir=-L$dir\n\t\tadd=-l$name\n\t      elif test no = \"$hardcode_shlibpath_var\"; then\n\t\tadd_shlibpath=$dir\n\t\tadd=-l$name\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test yes = \"$hardcode_direct\" &&\n\t         test no = \"$hardcode_direct_absolute\"; then\n\t\tadd=$dir/$linklib\n\t      elif test yes = \"$hardcode_minus_L\"; then\n\t\tadd_dir=-L$absdir\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=-l$name\n\t      elif test yes = \"$hardcode_shlibpath_var\"; then\n\t\tadd_shlibpath=$dir\n\t\tadd=-l$name\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test yes != \"$lib_linked\"; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) func_append compile_shlibpath \"$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test prog = \"$linkmode\"; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test yes != \"$hardcode_direct\" &&\n\t\t test yes != \"$hardcode_minus_L\" &&\n\t\t test yes = \"$hardcode_shlibpath_var\"; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) func_append finalize_shlibpath \"$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test prog = \"$linkmode\" || test relink = \"$opt_mode\"; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test yes = \"$hardcode_direct\" &&\n\t       test no = \"$hardcode_direct_absolute\"; then\n\t      add=$libdir/$linklib\n\t    elif test yes = \"$hardcode_minus_L\"; then\n\t      add_dir=-L$libdir\n\t      add=-l$name\n\t    elif test yes = \"$hardcode_shlibpath_var\"; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) func_append finalize_shlibpath \"$libdir:\" ;;\n\t      esac\n\t      add=-l$name\n\t    elif test yes = \"$hardcode_automatic\"; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\"; then\n\t\tadd=$inst_prefix_dir$libdir/$linklib\n\t      else\n\t\tadd=$libdir/$linklib\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=-L$libdir\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=-l$name\n\t    fi\n\n\t    if test prog = \"$linkmode\"; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test prog = \"$linkmode\"; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test unsupported != \"$hardcode_direct\"; then\n\t    test -n \"$old_library\" && linklib=$old_library\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test yes = \"$build_libtool_libs\"; then\n\t  # Not a shared library\n\t  if test pass_all != \"$deplibs_check_method\"; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    $ECHO \"*** Warning: This system cannot link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test yes = \"$module\"; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using 'nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** 'nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test no = \"$build_old_libs\"; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test lib = \"$linkmode\"; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test yes != \"$hardcode_into_libs\" ||\n\t       test yes = \"$build_old_libs\" ||\n\t       test yes = \"$link_static\"; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) func_append xrpath \" $temp_xrpath\";;\n\t\t   esac;;\n\t      *) func_append temp_deplibs \" $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=$temp_deplibs\n\t  fi\n\n\t  func_append newlib_search_path \" $absdir\"\n\t  # Link against this library\n\t  test no = \"$link_static\" && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    case $deplib in\n              -L*) func_stripname '-L' '' \"$deplib\"\n                   func_resolve_sysroot \"$func_stripname_result\";;\n              *) func_resolve_sysroot \"$deplib\" ;;\n            esac\n\t    if $opt_preserve_dup_deps; then\n\t      case \"$tmp_libs \" in\n\t      *\" $func_resolve_sysroot_result \"*)\n                func_append specialdeplibs \" $func_resolve_sysroot_result\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $func_resolve_sysroot_result\"\n\t  done\n\n\t  if test no != \"$link_all_deplibs\"; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=$deplib ;;\n\t      *.la)\n\t        func_resolve_sysroot \"$deplib\"\n\t        deplib=$func_resolve_sysroot_result\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=$func_dirname_result\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=$dir ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of '$dir'\"\n\t\t    absdir=$dir\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`$SED -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\"; then\n\t\t    for tmp in $deplibrary_names; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\"; then\n\t\t      depdepl=$absdir/$objdir/$depdepl\n\t\t      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      func_append compiler_flags \" $wl-dylib_file $wl$darwin_install_name:$depdepl\"\n\t\t      func_append linker_flags \" -dylib_file $darwin_install_name:$depdepl\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=-L$absdir/$objdir\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`$SED -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"'$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"'$deplib' seems to be moved\"\n\n\t\t  path=-L$absdir\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test link = \"$pass\"; then\n\tif test prog = \"$linkmode\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=$newdependency_libs\n      if test dlpreopen = \"$pass\"; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test dlopen != \"$pass\"; then\n\ttest conv = \"$pass\" || {\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append lib_search_path \" $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\t}\n\n\tif test prog,link = \"$linkmode,$pass\"; then\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\telse\n\t  vars=deplibs\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) func_append tmp_libs \" $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) func_append tmp_libs \" $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n\n      # Add Sun CC postdeps if required:\n      test CXX = \"$tagname\" && {\n        case $host_os in\n        linux*)\n          case `$CC -V 2>&1 | sed 5q` in\n          *Sun\\ C*) # Sun C++ 5.9\n            func_suncc_cstd_abi\n\n            if test no != \"$suncc_use_cstd_abi\"; then\n              func_append postdeps ' -library=Cstd -library=Crun'\n            fi\n            ;;\n          esac\n          ;;\n\n        solaris*)\n          func_cc_basename \"$CC\"\n          case $func_cc_basename_result in\n          CC* | sunCC*)\n            func_suncc_cstd_abi\n\n            if test no != \"$suncc_use_cstd_abi\"; then\n              func_append postdeps ' -library=Cstd -library=Crun'\n            fi\n            ;;\n          esac\n          ;;\n        esac\n      }\n\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\n\t  ;;\n\tesac\n\tif test -n \"$i\"; then\n\t  func_append tmp_libs \" $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test prog = \"$linkmode\"; then\n      dlfiles=$newdlfiles\n    fi\n    if test prog = \"$linkmode\" || test lib = \"$linkmode\"; then\n      dlprefiles=$newdlprefiles\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test no != \"$dlself\"; then\n\tfunc_warning \"'-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"'-l' and '-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"'-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"'-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"'-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"'-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"'-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=$output\n      func_append objs \"$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form 'libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest no = \"$module\" \\\n\t  && func_fatal_help \"libtool library '$output' must begin with 'lib'\"\n\n\tif test no != \"$need_lib_prefix\"; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test pass_all != \"$deplibs_check_method\"; then\n\t  func_fatal_error \"cannot build libtool library '$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  echo\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  func_append libobjs \" $objs\"\n\tfi\n      fi\n\n      test no = \"$dlself\" \\\n\t|| func_warning \"'-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test 1 -lt \"$#\" \\\n\t&& func_warning \"ignoring multiple '-rpath's for a libtool library\"\n\n      install_libdir=$1\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test yes = \"$build_libtool_libs\"; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a '.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"'-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"'-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=$IFS; IFS=:\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=$save_ifs\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to '-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=$1\n\t  number_minor=$2\n\t  number_revision=$3\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # that has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  # correct linux to gnu/linux during the next big refactor\n\t  darwin|freebsd-elf|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=$number_minor\n\t    revision=$number_revision\n\t    ;;\n\t  freebsd-aout|qnx|sunos)\n\t    current=$number_major\n\t    revision=$number_minor\n\t    age=0\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=$number_minor\n\t    revision=$number_minor\n\t    lt_irix_increment=no\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=$1\n\t  revision=$2\n\t  age=$3\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT '$current' must be a nonnegative integer\"\n\t  func_fatal_error \"'$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION '$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"'$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE '$age' must be a nonnegative integer\"\n\t  func_fatal_error \"'$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE '$age' is greater than the current interface number '$current'\"\n\t  func_fatal_error \"'$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=$major.$age.$revision\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n          # On Darwin other compilers\n          case $CC in\n              nagfor*)\n                  verstring=\"$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision\"\n                  ;;\n              *)\n                  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n                  ;;\n          esac\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=.$current\n\t  versuffix=.$current.$revision\n\t  ;;\n\n\tfreebsd-elf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=$major.$age.$revision\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test no = \"$lt_irix_increment\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=$verstring_prefix$major.$revision\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test 0 -ne \"$loop\"; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=$verstring_prefix$major.$iface:$verstring\n\t  done\n\n\t  # Before this point, $major must not contain '.'.\n\t  major=.$major\n\t  versuffix=$major.$revision\n\t  ;;\n\n\tlinux) # correct to gnu/linux during the next big refactor\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=$major.$age.$revision\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=.$current.$age.$revision\n\t  verstring=$current.$age.$revision\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test 0 -ne \"$loop\"; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=$verstring:$iface.0\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  func_append verstring \":$current.0\"\n\t  ;;\n\n\tqnx)\n\t  major=.$current\n\t  versuffix=.$current\n\t  ;;\n\n\tsco)\n\t  major=.$current\n\t  versuffix=.$current\n\t  ;;\n\n\tsunos)\n\t  major=.$current\n\t  versuffix=.$current.$revision\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 file systems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=-$major\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type '$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=0.0\n\t    ;;\n\t  esac\n\t  if test no = \"$need_version\"; then\n\t    versuffix=\n\t  else\n\t    versuffix=.0.0\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test yes,no = \"$avoid_version,$need_version\"; then\n\t  major=\n\t  versuffix=\n\t  verstring=\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test yes = \"$allow_undefined\"; then\n\t  if test unsupported = \"$allow_undefined_flag\"; then\n\t    if test yes = \"$build_old_libs\"; then\n\t      func_warning \"undefined symbols not allowed in $host shared libraries; building static only\"\n\t      build_libtool_libs=no\n\t    else\n\t      func_fatal_error \"can't build $host shared library unless -no-undefined is specified\"\n\t    fi\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=$no_undefined_flag\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" :\n      func_append libobjs \" $symfileobj\"\n      test \" \" = \"$libobjs\" && libobjs=\n\n      if test relink != \"$opt_mode\"; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)\n\t       if test -n \"$precious_files_regex\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       func_append removelist \" $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test yes = \"$build_old_libs\" && test convenience != \"$build_libtool_libs\"; then\n\tfunc_append oldlibs \" $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.$libext$/d; $lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"$lib_search_path \" | $SED \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"$deplibs \" | $SED \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"$dependency_libs \" | $SED \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  func_replace_sysroot \"$libdir\"\n\t  func_append temp_xrpath \" -R$func_replace_sysroot_result\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n\tif test yes != \"$hardcode_into_libs\" || test yes = \"$build_old_libs\"; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=$dlfiles\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlfiles \" $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=$dlprefiles\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlprefiles \" $lib\" ;;\n\tesac\n      done\n\n      if test yes = \"$build_libtool_libs\"; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test yes = \"$build_libtool_need_lc\"; then\n\t      func_append deplibs \" -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\n\tversuffix=\n\tmajor=\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    func_append newdeplibs \" $i\"\n\t\t    i=\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\"; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0; then\n\t\t    func_append newdeplibs \" $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which I believe you do not have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      func_append newdeplibs \" $i\"\n\t\t      i=\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\"; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0; then\n\t\t      func_append newdeplibs \" $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      echo\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t\t      echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"*** make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\"; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tif test -n \"$file_magic_glob\"; then\n\t\t  libnameglob=`func_echo_all \"$libname\" | $SED -e $file_magic_glob`\n\t\telse\n\t\t  libnameglob=$libname\n\t\tfi\n\t\ttest yes = \"$want_nocaseglob\" && nocaseglob=`shopt -p nocaseglob`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  if test yes = \"$want_nocaseglob\"; then\n\t\t    shopt -s nocaseglob\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t    $nocaseglob\n\t\t  else\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t  fi\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=$potent_lib\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | $SED 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=$potliblink;;\n\t\t\t*) potlib=`$ECHO \"$potlib\" | $SED 's|[^/]*$||'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tfunc_append newdeplibs \" $a_deplib\"\n\t\t\ta_deplib=\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\"; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\"; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\"; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=$potent_lib # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"$potent_lib\\\"\" 2>/dev/null | $SED 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      func_append newdeplibs \" $a_deplib\"\n\t\t      a_deplib=\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\"; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\"; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\n\t  tmp_deplibs=`$ECHO \" $deplibs\" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`\n\t  if test yes = \"$allow_libtool_libs_with_static_runtimes\"; then\n\t    for i in $predeps $postdeps; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \" $tmp_deplibs\" | $SED \"s|$i||\"`\n\t    done\n\t  fi\n\t  case $tmp_deplibs in\n\t  *[!\\\t\\ ]*)\n\t    echo\n\t    if test none = \"$deplibs_check_method\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test yes = \"$droppeddeps\"; then\n\t  if test yes = \"$module\"; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using 'nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** 'nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test no = \"$build_old_libs\"; then\n\t      oldlibs=$output_objdir/$libname.$libext\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test no = \"$allow_undefined\"; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test no = \"$build_old_libs\"; then\n\t\toldlibs=$output_objdir/$libname.$libext\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \" $deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      deplibs=$new_libs\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test yes = \"$build_libtool_libs\"; then\n\t# Remove $wl instances when linking with ld.\n\t# FIXME: should test the right _cmds variable.\n\tcase $archive_cmds in\n\t  *\\$LD\\ *) wl= ;;\n        esac\n\tif test yes = \"$hardcode_into_libs\"; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=$finalize_rpath\n\t  test relink = \"$opt_mode\" || rpath=$compile_rpath$rpath\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tfunc_replace_sysroot \"$libdir\"\n\t\tlibdir=$func_replace_sysroot_result\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=$libdir\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    func_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tfunc_append dep_rpath \" $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append perm_rpath \" $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=$hardcode_libdirs\n\t    eval \"dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      func_append rpath \"$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=$finalize_shlibpath\n\ttest relink = \"$opt_mode\" || shlibpath=$compile_shlibpath$shlibpath\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=$1\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=$realname\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=$output_objdir/$realname\n\tlinknames=\n\tfor link\n\tdo\n\t  func_append linknames \" $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"$libobjs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=$output_objdir/$libname.uexp\n\t  func_append delfiles \" $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    func_dll_def_p \"$export_symbols\" || {\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=$export_symbols\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    }\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test yes = \"$always_export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for '$libname.la'\"\n\t    export_symbols=$output_objdir/$libname.exp\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=$IFS; IFS='~'\n\t    for cmd1 in $cmds; do\n\t      IFS=$save_ifs\n\t      # Take the normal branch if the nm_file_list_spec branch\n\t      # doesn't work or if tool conversion is not needed.\n\t      case $nm_file_list_spec~$to_tool_file_cmd in\n\t\t*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)\n\t\t  try_normal_branch=yes\n\t\t  eval cmd=\\\"$cmd1\\\"\n\t\t  func_len \" $cmd\"\n\t\t  len=$func_len_result\n\t\t  ;;\n\t\t*)\n\t\t  try_normal_branch=no\n\t\t  ;;\n\t      esac\n\t      if test yes = \"$try_normal_branch\" \\\n\t\t && { test \"$len\" -lt \"$max_cmd_len\" \\\n\t\t      || test \"$max_cmd_len\" -le -1; }\n\t      then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      elif test -n \"$nm_file_list_spec\"; then\n\t\tfunc_basename \"$output\"\n\t\toutput_la=$func_basename_result\n\t\tsave_libobjs=$libobjs\n\t\tsave_output=$output\n\t\toutput=$output_objdir/$output_la.nm\n\t\tfunc_to_tool_file \"$output\"\n\t\tlibobjs=$nm_file_list_spec$func_to_tool_file_result\n\t\tfunc_append delfiles \" $output\"\n\t\tfunc_verbose \"creating $NM input file list: $output\"\n\t\tfor obj in $save_libobjs; do\n\t\t  func_to_tool_file \"$obj\"\n\t\t  $ECHO \"$func_to_tool_file_result\"\n\t\tdone > \"$output\"\n\t\teval cmd=\\\"$cmd1\\\"\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\toutput=$save_output\n\t\tlibobjs=$save_libobjs\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=$save_ifs\n\t    if test -n \"$export_symbols_regex\" && test : != \"$skipped_export\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=$export_symbols\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=$orig_export_symbols\n\t  $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test : != \"$skipped_export\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for '$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands, which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    func_append tmp_deplibs \" $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=$tmp_deplibs\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test yes = \"$compiler_needs_object\" &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=$output_objdir/${outputname}x\n\t    func_append generated \" $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    func_append libobjs \" $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test yes = \"$thread_safe\" && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  func_append linker_flags \" $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test relink = \"$opt_mode\"; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test yes = \"$module\" && test -n \"$module_cmds\"; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test : != \"$skipped_export\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  func_basename \"$output\"\n\t  output_la=$func_basename_result\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test : != \"$skipped_export\" && test yes = \"$with_gnu_ld\"; then\n\t    output=$output_objdir/$output_la.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    echo 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    echo ')' >> $output\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$func_to_tool_file_result\n\t  elif test -n \"$save_libobjs\" && test : != \"$skipped_export\" && test -n \"$file_list_spec\"; then\n\t    output=$output_objdir/$output_la.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test yes = \"$compiler_needs_object\"; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$firstobj\\\"$file_list_spec$func_to_tool_file_result\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-$k.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test -z \"$objlist\" ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test 1 -eq \"$k\"; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    reload_objs=$objlist\n\t\t    eval concat_cmds=\\\"$reload_cmds\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    reload_objs=\"$objlist $last_robj\"\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-$k.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-$k.$objext\n\t\t  objlist=\" $obj\"\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      reload_objs=\"$objlist $last_robj\"\n\t      eval concat_cmds=\\\"\\$concat_cmds$reload_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t      func_append delfiles \" $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    ${skipped_export-false} && {\n\t      func_verbose \"generating symbol list for '$libname.la'\"\n\t      export_symbols=$output_objdir/$libname.exp\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    }\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=$IFS; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=$save_ifs\n\t      $opt_quiet || {\n\t\t  func_quote_arg expand,pretty \"$cmd\"\n\t\t  eval \"func_echo $func_quote_arg_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test relink = \"$opt_mode\"; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=$save_ifs\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          ${skipped_export-false} && {\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=$export_symbols\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=$orig_export_symbols\n\t      $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for '$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands, which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  }\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test yes = \"$module\" && test -n \"$module_cmds\"; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=$output_objdir/${outputname}x\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append libobjs \" $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=$IFS; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=$sp$nl\n\t  eval cmd=\\\"$cmd\\\"\n\t  IFS=$save_ifs\n\t  $opt_quiet || {\n\t    func_quote_arg expand,pretty \"$cmd\"\n\t    eval \"func_echo $func_quote_arg_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test relink = \"$opt_mode\"; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=$save_ifs\n\n\t# Restore the uninstalled library and exit\n\tif test relink = \"$opt_mode\"; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test yes = \"$module\" || test yes = \"$export_dynamic\"; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=$soname\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test no != \"$dlself\"; then\n\tfunc_warning \"'-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"'-l' and '-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"'-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"'-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"'-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"'-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object '$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=$output\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # if reload_cmds runs $LD directly, get rid of -Wl from\n      # whole_archive_flag_spec and hope we can get by with turning comma\n      # into space.\n      case $reload_cmds in\n        *\\$LD[\\ \\$]*) wl= ;;\n      esac\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  test -n \"$wl\" || tmp_whole_archive_flags=`$ECHO \"$tmp_whole_archive_flags\" | $SED 's|,| |g'`\n\t  reload_conv_objs=$reload_objs\\ $tmp_whole_archive_flags\n\telse\n\t  gentop=$output_objdir/${obj}x\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # If we're not building shared, we need to use non_pic_objs\n      test yes = \"$build_libtool_libs\" || libobjs=$non_pic_objects\n\n      # Create the old-style object.\n      reload_objs=$objs$old_deplibs' '`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.$libext$/d; /\\.lib$/d; $lo2o\" | $NL2SP`' '$reload_conv_objs\n\n      output=$obj\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      test yes = \"$build_libtool_libs\" || {\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      }\n\n      if test -n \"$pic_flag\" || test default != \"$pic_mode\"; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=$libobj\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"'-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"'-release' is ignored for programs\"\n\n      $preload \\\n\t&& test unknown,unknown,unknown = \"$dlopen_support,$dlopen_self,$dlopen_self_static\" \\\n\t&& func_warning \"'LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test CXX = \"$tagname\"; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      func_append compile_command \" $wl-bind_at_load\"\n\t      func_append finalize_command \" $wl-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=$new_libs\n\n\n      func_append compile_command \" $compile_deplibs\"\n      func_append finalize_command \" $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=$libdir\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"$libdir\" | $SED -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) func_append dllsearchpath \":$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=$hardcode_libdirs\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=$rpath\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=$libdir\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=$hardcode_libdirs\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=$rpath\n\n      if test -n \"$libobjs\" && test yes = \"$build_old_libs\"; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"$compile_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"$finalize_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" false\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=:\n      case $host in\n      *cegcc* | *mingw32ce*)\n        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.\n        wrappers_required=false\n        ;;\n      *cygwin* | *mingw* )\n        test yes = \"$build_libtool_libs\" || wrappers_required=false\n        ;;\n      *)\n        if test no = \"$need_relink\" || test yes != \"$build_libtool_libs\"; then\n          wrappers_required=false\n        fi\n        ;;\n      esac\n      $wrappers_required || {\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"$compile_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=$compile_command$compile_rpath\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.$objext\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.$objext\"'\n\tfi\n\n\texit $exit_status\n      }\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test yes = \"$no_install\"; then\n\t# We don't need to create a wrapper script.\n\tlink_command=$compile_var$compile_command$compile_rpath\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      case $hardcode_action,$fast_install in\n        relink,*)\n\t  # Fast installation is not supported\n\t  link_command=$compile_var$compile_command$compile_rpath\n\t  relink_command=$finalize_var$finalize_command$finalize_rpath\n\n\t  func_warning \"this platform does not like uninstalled shared libraries\"\n\t  func_warning \"'$output' will be relinked during installation\"\n\t  ;;\n        *,yes)\n\t  link_command=$finalize_var$compile_command$finalize_rpath\n\t  relink_command=`$ECHO \"$compile_var$compile_command$compile_rpath\" | $SED 's%@OUTPUT@%\\$progdir/\\$file%g'`\n          ;;\n\t*,no)\n\t  link_command=$compile_var$compile_command$compile_rpath\n\t  relink_command=$finalize_var$finalize_command$finalize_rpath\n          ;;\n\t*,needless)\n\t  link_command=$finalize_var$compile_command$finalize_rpath\n\t  relink_command=\n          ;;\n      esac\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      if test -n \"$postlink_cmds\"; then\n\tfunc_to_tool_file \"$output_objdir/$outputname\"\n\tpostlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\tfunc_execute_cmds \"$postlink_cmds\" 'exit $?'\n      fi\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_arg pretty \"$var_value\"\n\t    relink_command=\"$var=$func_quote_arg_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\tfunc_quote eval cd \"`pwd`\"\n\tfunc_quote_arg pretty,unquoted \"($func_quote_result; $relink_command)\"\n\trelink_command=$func_quote_arg_unquoted_result\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=$output_path/$objdir/lt-$output_name.c\n\t    cwrapper=$output_path/$output_name.exe\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\"; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      case $build_libtool_libs in\n        convenience)\n\t  oldobjs=\"$libobjs_save $symfileobj\"\n\t  addlibs=$convenience\n\t  build_libtool_libs=no\n\t  ;;\n\tmodule)\n\t  oldobjs=$libobjs_save\n\t  addlibs=$old_convenience\n\t  build_libtool_libs=no\n          ;;\n\t*)\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  $preload && test -f \"$symfileobj\" \\\n\t    && func_append oldobjs \" $symfileobj\"\n\t  addlibs=$old_convenience\n\t  ;;\n      esac\n\n      if test -n \"$addlibs\"; then\n\tgentop=$output_objdir/${outputname}x\n\tfunc_append generated \" $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\tfunc_append oldobjs \" $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test yes = \"$build_libtool_libs\"; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=$output_objdir/${outputname}x\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append oldobjs \" $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  echo \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=$output_objdir/${outputname}x\n\t  func_append generated \" $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=$func_basename_result\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      func_append oldobjs \" $gentop/$newobj\"\n\t      ;;\n\t    *) func_append oldobjs \" $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\tfunc_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n\ttool_oldlib=$func_to_tool_file_result\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telif test -n \"$archiver_list_spec\"; then\n\t  func_verbose \"using command file archive linking...\"\n\t  for obj in $oldobjs\n\t  do\n\t    func_to_tool_file \"$obj\"\n\t    $ECHO \"$func_to_tool_file_result\"\n\t  done > $output_objdir/$libname.libcmd\n\t  func_to_tool_file \"$output_objdir/$libname.libcmd\"\n\t  oldobjs=\" $archiver_list_spec$func_to_tool_file_result\"\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\"; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test -z \"$oldobjs\"; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test yes = \"$build_old_libs\" && old_library=$libname.$libext\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_arg pretty,unquoted \"$var_value\"\n\t  relink_command=\"$var=$func_quote_arg_unquoted_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      func_quote eval cd \"`pwd`\"\n      relink_command=\"($func_quote_result; $SHELL \\\"$progpath\\\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      func_quote_arg pretty,unquoted \"$relink_command\"\n      relink_command=$func_quote_arg_unquoted_result\n      if test yes = \"$hardcode_automatic\"; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test yes = \"$installed\"; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=$output_objdir/${outputname}i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=$func_basename_result\n\t\tfunc_resolve_sysroot \"$deplib\"\n\t\teval libdir=`$SED -n -e 's/^libdir=\\(.*\\)$/\\1/p' $func_resolve_sysroot_result`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"'$deplib' is not a valid libtool archive\"\n\t\tfunc_append newdependency_libs \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      -L*)\n\t\tfunc_stripname -L '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -L$func_replace_sysroot_result\"\n\t\t;;\n\t      -R*)\n\t\tfunc_stripname -R '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -R$func_replace_sysroot_result\"\n\t\t;;\n\t      *) func_append newdependency_libs \" $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=$newdependency_libs\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=$func_basename_result\n\t\teval libdir=`$SED -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"'$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlfiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      *) func_append newdlfiles \" $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=$newdlfiles\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=$func_basename_result\n\t\teval libdir=`$SED -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"'$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlprefiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=$newdlprefiles\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=$lib ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlfiles \" $abs\"\n\t    done\n\t    dlfiles=$newdlfiles\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=$lib ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlprefiles \" $abs\"\n\t    done\n\t    dlprefiles=$newdlprefiles\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  # In fact, it would be nice if we could use this code for all target\n\t  # systems that can't hard-code library paths into their executables\n\t  # and that have no shared library path variable independent of PATH,\n\t  # but it turns out we can't easily determine that from inspecting\n\t  # libtool variables, so we have to hard-code the OSs to which it\n\t  # applies here; at the moment, that means platforms that use the PE\n\t  # object format with DLL files.  See the long comment at the top of\n\t  # tests/bindir.at for full details.\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)\n\t      # If a -bindir argument was supplied, place the dll there.\n\t      if test -n \"$bindir\"; then\n\t\tfunc_relative_path \"$install_libdir\" \"$bindir\"\n\t\ttdlname=$func_relative_path_result/$dlname\n\t      else\n\t\t# Otherwise fall back on heuristic.\n\t\ttdlname=../bin/$dlname\n\t      fi\n\t      ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that cannot go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test no,yes = \"$installed,$need_relink\"; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\nif test link = \"$opt_mode\" || test relink = \"$opt_mode\"; then\n  func_mode_link ${1+\"$@\"}\nfi\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $debug_cmd\n\n    RM=$nonopt\n    files=\n    rmforce=false\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=$magic\n\n    for arg\n    do\n      case $arg in\n      -f) func_append RM \" $arg\"; rmforce=: ;;\n      -*) func_append RM \" $arg\" ;;\n      *) func_append files \" $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=$func_dirname_result\n      if test . = \"$dir\"; then\n\todir=$objdir\n      else\n\todir=$dir/$objdir\n      fi\n      func_basename \"$file\"\n      name=$func_basename_result\n      test uninstall = \"$opt_mode\" && odir=$dir\n\n      # Remember odir for removal later, being careful to avoid duplicates\n      if test clean = \"$opt_mode\"; then\n\tcase \" $rmdirs \" in\n\t  *\" $odir \"*) ;;\n\t  *) func_append rmdirs \" $odir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif $rmforce; then\n\tcontinue\n      fi\n\n      rmfiles=$file\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    func_append rmfiles \" $odir/$n\"\n\t  done\n\t  test -n \"$old_library\" && func_append rmfiles \" $odir/$old_library\"\n\n\t  case $opt_mode in\n\t  clean)\n\t    case \" $library_names \" in\n\t    *\" $dlname \"*) ;;\n\t    *) test -n \"$dlname\" && func_append rmfiles \" $odir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && func_append rmfiles \" $odir/$name $odir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" '$rmforce || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" '$rmforce || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" && test none != \"$pic_object\"; then\n\t    func_append rmfiles \" $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" && test none != \"$non_pic_object\"; then\n\t    func_append rmfiles \" $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test clean = \"$opt_mode\"; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    func_append rmfiles \" $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      func_append rmfiles \" $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    func_append rmfiles \" $odir/$name $odir/${name}S.$objext\"\n\t    if test yes = \"$fast_install\" && test -n \"$relink_command\"; then\n\t      func_append rmfiles \" $odir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\"; then\n\t      func_append rmfiles \" $odir/lt-$noexename.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n\n    # Try to remove the $objdir's in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\nif test uninstall = \"$opt_mode\" || test clean = \"$opt_mode\"; then\n  func_mode_uninstall ${1+\"$@\"}\nfi\n\ntest -z \"$opt_mode\" && {\n  help=$generic_help\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode '$opt_mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# where we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n"
  },
  {
    "path": "src/pcre/m4/ax_pthread.m4",
    "content": "# ===========================================================================\n#        http://www.gnu.org/software/autoconf-archive/ax_pthread.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\n#\n# DESCRIPTION\n#\n#   This macro figures out how to build C programs using POSIX threads. It\n#   sets the PTHREAD_LIBS output variable to the threads library and linker\n#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler\n#   flags that are needed. (The user can also force certain compiler\n#   flags/libs to be tested by setting these environment variables.)\n#\n#   Also sets PTHREAD_CC to any special C compiler that is needed for\n#   multi-threaded programs (defaults to the value of CC otherwise). (This\n#   is necessary on AIX to use the special cc_r compiler alias.)\n#\n#   NOTE: You are assumed to not only compile your program with these flags,\n#   but also link it with them as well. e.g. you should link with\n#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS\n#\n#   If you are only building threads programs, you may wish to use these\n#   variables in your default LIBS, CFLAGS, and CC:\n#\n#     LIBS=\"$PTHREAD_LIBS $LIBS\"\n#     CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n#     CC=\"$PTHREAD_CC\"\n#\n#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant\n#   has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name\n#   (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\n#\n#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the\n#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with\n#   PTHREAD_CFLAGS.\n#\n#   ACTION-IF-FOUND is a list of shell commands to run if a threads library\n#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it\n#   is not found. If ACTION-IF-FOUND is not specified, the default action\n#   will define HAVE_PTHREAD.\n#\n#   Please let the authors know if this macro fails on any platform, or if\n#   you have any other suggestions or comments. This macro was based on work\n#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help\n#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by\n#   Alejandro Forero Cuervo to the autoconf macro repository. We are also\n#   grateful for the helpful feedback of numerous users.\n#\n#   Updated for Autoconf 2.68 by Daniel Richard G.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>\n#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 18\n\nAU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])\nAC_DEFUN([AX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_PUSH([C])\nax_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)\n        AC_MSG_RESULT($ax_pthread_ok)\n        if test x\"$ax_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nax_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase ${host_os} in\n        solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        ax_pthread_flags=\"-pthreads pthread -mt -pthread $ax_pthread_flags\"\n        ;;\n\n        darwin*)\n        ax_pthread_flags=\"-pthread $ax_pthread_flags\"\n        ;;\nesac\n\nif test x\"$ax_pthread_ok\" = xno; then\nfor flag in $ax_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n                pthread-config)\n                AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)\n                if test x\"$ax_pthread_config\" = xno; then continue; fi\n                PTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n                PTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n                ;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>\n                        static void routine(void *a) { a = 0; }\n                        static void *start_routine(void *a) { return a; }],\n                       [pthread_t th; pthread_attr_t attr;\n                        pthread_create(&th, 0, start_routine, 0);\n                        pthread_join(th, 0);\n                        pthread_attr_init(&attr);\n                        pthread_cleanup_push(routine, 0);\n                        pthread_cleanup_pop(0) /* ; */])],\n                [ax_pthread_ok=yes],\n                [])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT($ax_pthread_ok)\n        if test \"x$ax_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$ax_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n        AC_MSG_CHECKING([for joinable pthread attribute])\n        attr_name=unknown\n        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n            AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],\n                           [int attr = $attr; return attr /* ; */])],\n                [attr_name=$attr; break],\n                [])\n        done\n        AC_MSG_RESULT($attr_name)\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case ${host_os} in\n            aix* | freebsd* | darwin*) flag=\"-D_THREAD_SAFE\";;\n            osf* | hpux*) flag=\"-D_REENTRANT\";;\n            solaris*)\n            if test \"$GCC\" = \"yes\"; then\n                flag=\"-D_REENTRANT\"\n            else\n                flag=\"-mt -D_REENTRANT\"\n            fi\n            ;;\n        esac\n        AC_MSG_RESULT(${flag})\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],\n            ax_cv_PTHREAD_PRIO_INHERIT, [\n                AC_LINK_IFELSE([\n                    AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],\n                    [ax_cv_PTHREAD_PRIO_INHERIT=yes],\n                    [ax_cv_PTHREAD_PRIO_INHERIT=no])\n            ])\n        AS_IF([test \"x$ax_cv_PTHREAD_PRIO_INHERIT\" = \"xyes\"],\n            AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        # More AIX lossage: must compile with xlc_r or cc_r\n        if test x\"$GCC\" != xyes; then\n          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})\n        else\n          PTHREAD_CC=$CC\n        fi\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\nAC_SUBST(PTHREAD_LIBS)\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_CC)\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$ax_pthread_ok\" = xyes; then\n        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])\n        :\nelse\n        ax_pthread_ok=no\n        $2\nfi\nAC_LANG_POP\n])dnl AX_PTHREAD\n"
  },
  {
    "path": "src/pcre/m4/libtool.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996-2001, 2003-2018 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n# Copyright (C) 2014 Free Software Foundation, Inc.\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\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program or library that is built\n# using GNU Libtool, you may include this file under the  same\n# distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n])\n\n# serial 58 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK\nAC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\n_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=$ltmain\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_PREPARE_CC_BASENAME\n# -----------------------\nm4_defun([_LT_PREPARE_CC_BASENAME], [\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nfunc_cc_basename ()\n{\n    for cc_temp in @S|@*\"\"; do\n      case $cc_temp in\n        compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n        distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n        \\-*) ;;\n        *) break;;\n      esac\n    done\n    func_cc_basename_result=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n}\n])# _LT_PREPARE_CC_BASENAME\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,\n# but that macro is also expanded into generated libtool script, which\n# arranges for $SED and $ECHO to be set by different means.\nm4_defun([_LT_CC_BASENAME],\n[m4_require([_LT_PREPARE_CC_BASENAME])dnl\nAC_REQUIRE([_LT_DECL_SED])dnl\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl\nfunc_cc_basename $1\ncc_basename=$func_cc_basename_result\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl\n\n_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl\ndnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_WITH_SYSROOT])dnl\nm4_require([_LT_CMD_TRUNCATE])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options that allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\"; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\"; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test set != \"${COLLECT_NAMES+set}\"; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a '.a' archive for static linking (except MSVC and\n# ICC, which need '.lib').\nlibext=a\n\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\nold_CC=$CC\nold_CFLAGS=$CFLAGS\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PREPARE_SED_QUOTE_VARS\n# --------------------------\n# Define a few sed substitution that help us do robust quoting.\nm4_defun([_LT_PREPARE_SED_QUOTE_VARS],\n[# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n])\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from 'configure', and 'config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# 'config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=$ac_aux_dir/ltmain.sh\n])# _LT_PROG_LTMAIN\n\n\n## ------------------------------------- ##\n## Accumulate code for creating libtool. ##\n## ------------------------------------- ##\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the 'libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n## ------------------------ ##\n## FIXME: Eliminate VARNAME ##\n## ------------------------ ##\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to 'config.status' so that its\n# declaration there will have the same value as in 'configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"$][$1\" | $SED \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"$<var>\" | $SED \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags='_LT_TAGS'dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into 'config.status', and then the shell code to quote escape them in\n# for loops in 'config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$[]1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\" ## exclude from sc_prohibit_nested_quotes\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\" ## exclude from sc_prohibit_nested_quotes\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])\n# ------------------------------------\n# Generate a child script FILE with all initialization necessary to\n# reuse the environment learned by the parent script, and make the\n# file executable.  If COMMENT is supplied, it is inserted after the\n# '#!' sequence but before initialization text begins.  After this\n# macro, additional text can be appended to FILE to form the body of\n# the child script.  The macro ends with non-zero status if the\n# file could not be fully written (such as if the disk is full).\nm4_ifdef([AS_INIT_GENERATED],\n[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],\n[m4_defun([_LT_GENERATED_FILE_INIT],\n[m4_require([AS_PREPARE])]dnl\n[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl\n[lt_write_fail=0\ncat >$1 <<_ASEOF || lt_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n$2\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$1 <<\\_ASEOF || lt_write_fail=1\nAS_SHELL_SANITIZE\n_AS_PREPARE\nexec AS_MESSAGE_FD>&1\n_ASEOF\ntest 0 = \"$lt_write_fail\" && chmod +x $1[]dnl\nm4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\n_LT_GENERATED_FILE_INIT([\"$CONFIG_LT\"],\n[# Run this file to recreate a libtool stub with the current configuration.])\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nlt_cl_silent=false\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n'$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2011 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test 0 != $[#]\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry '$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry '$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nlt_cl_success=:\ntest yes = \"$silent\" &&\n  lt_config_lt_args=\"$lt_config_lt_args --quiet\"\nexec AS_MESSAGE_LOG_FD>/dev/null\n$SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\nexec AS_MESSAGE_LOG_FD>>config.log\n$lt_cl_success || AS_EXIT(1)\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options that allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\"; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=${ofile}T\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n# Generated automatically by $as_me ($PACKAGE) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n\n# Provide generalized library-building support services.\n# Written by Gordon Matzigkeit, 1996\n\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# Configured defaults for sys_lib_dlsearch_path munging.\n: \\${LT_SYS_LIBRARY_PATH=\"$configure_time_lt_sys_library_path\"}\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n    cat <<'_LT_EOF' >> \"$cfgfile\"\n\n# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE\n\n_LT_PREPARE_MUNGE_PATH_LIST\n_LT_PREPARE_CC_BASENAME\n\n# ### END FUNCTIONS SHARED WITH CONFIGURE\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test set != \"${COLLECT_NAMES+set}\"; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Go],\t\t\t[_LT_LANG(GO)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\nm4_ifndef([AC_PROG_GO], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_GO.  When it is available in    #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\nm4_defun([AC_PROG_GO],\n[AC_LANG_PUSH(Go)dnl\nAC_ARG_VAR([GOC],     [Go compiler command])dnl\nAC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl\n_AC_ARG_VAR_LDFLAGS()dnl\nAC_CHECK_TOOL(GOC, gccgo)\nif test -z \"$GOC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])\n  fi\nfi\nif test -z \"$GOC\"; then\n  AC_CHECK_PROG(GOC, gccgo, gccgo, false)\nfi\n])#m4_defun\n])#m4_ifndef\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([AC_PROG_GO],\n  [LT_LANG(GO)],\n  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\nAU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\ndnl AC_DEFUN([AC_LIBTOOL_RC], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"$LT_MULTI_MODULE\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test 0 = \"$_lt_result\"; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=$save_LDFLAGS\n    ])\n\n    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],\n      [lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD\n      echo \"$AR $AR_FLAGS libconftest.a conftest.o\" >&AS_MESSAGE_LOG_FD\n      $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD\n      echo \"$RANLIB libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      elif test -f conftest && test 0 = \"$_lt_result\" && $GREP forced_load conftest >/dev/null 2>&1; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]][[,.]]*)\n\t  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test yes = \"$lt_cv_apple_cc_single_mod\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test yes = \"$lt_cv_ld_exported_symbols_list\"; then\n      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'\n    fi\n    if test : != \"$DSYMUTIL\" && test no = \"$lt_cv_ld_force_load\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES([TAG])\n# ---------------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  if test yes = \"$lt_cv_ld_force_load\"; then\n    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience $wl-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],\n                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])\n  else\n    _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  fi\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined\n  case $cc_basename in\n     ifort*|nagfor*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test yes = \"$_lt_dar_can_shared\"; then\n    output_verbose_link_cmd=func_echo_all\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dsymutil\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dsymutil\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags$_lt_dar_export_syms$_lt_dsymutil\"\n    m4_if([$1], [CXX],\n[   if test yes != \"$lt_cv_apple_cc_single_mod\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\$lib-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$lib-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring$_lt_dsymutil\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's|^|_|' < \\$export_symbols > \\$output_objdir/\\$libname-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\$lib-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$lib-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring$_lt_dar_export_syms$_lt_dsymutil\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX([TAGNAME])\n# ----------------------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\n# Store the results from the different compilers for each TAGNAME.\n# Allow to override them for all tags through lt_cv_aix_libpath.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nif test set = \"${lt_cv_aix_libpath+set}\"; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],\n  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[\n  lt_aix_libpath_sed='[\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }]'\n  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi],[])\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib\n  fi\n  ])\n  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\nfi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[m4_divert_text([M4SH-INIT], [$1\n])])# _LT_SHELL_INIT\n\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Find how we can fake an echo command that does not interpret backslash.\n# In particular, with Autoconf 2.60 or later we add some code to the start\n# of the generated configure script that will find a shell with a builtin\n# printf (that we can use as an echo command).\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\nAC_MSG_CHECKING([how to print strings])\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$[]1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\"\n}\n\ncase $ECHO in\n  printf*) AC_MSG_RESULT([printf]) ;;\n  print*) AC_MSG_RESULT([print -r]) ;;\n  *) AC_MSG_RESULT([cat]) ;;\nesac\n\nm4_ifdef([_AS_DETECT_SUGGESTED],\n[_AS_DETECT_SUGGESTED([\n  test -n \"${ZSH_VERSION+set}${BASH_VERSION+set}\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \"X`printf %s $ECHO`\" = \"X$ECHO\" \\\n      || test \"X`print -r -- $ECHO`\" = \"X$ECHO\" )])])\n\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_WITH_SYSROOT\n# ----------------\nAC_DEFUN([_LT_WITH_SYSROOT],\n[AC_MSG_CHECKING([for sysroot])\nAC_ARG_WITH([sysroot],\n[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],\n  [Search for dependent libraries within DIR (or the compiler's sysroot\n   if not specified).])],\n[], [with_sysroot=no])\n\ndnl lt_sysroot will always be passed unquoted.  We quote it here\ndnl in case the user passed a directory name.\nlt_sysroot=\ncase $with_sysroot in #(\n yes)\n   if test yes = \"$GCC\"; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   AC_MSG_RESULT([$with_sysroot])\n   AC_MSG_ERROR([The sysroot must be an absolute path.])\n   ;;\nesac\n\n AC_MSG_RESULT([${lt_sysroot:-no}])\n_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl\n[dependent libraries, and where our libraries should be installed.])])\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest no = \"$enable_libtool_lock\" || enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out what ABI is being produced by ac_compile, and set mode\n  # options accordingly.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=32\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=64\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo '[#]line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test yes = \"$lt_cv_prog_gnu_ld\"; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nmips64*-*linux*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo '[#]line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    emul=elf\n    case `/usr/bin/file conftest.$ac_objext` in\n      *32-bit*)\n\temul=\"${emul}32\"\n\t;;\n      *64-bit*)\n\temul=\"${emul}64\"\n\t;;\n    esac\n    case `/usr/bin/file conftest.$ac_objext` in\n      *MSB*)\n\temul=\"${emul}btsmip\"\n\t;;\n      *LSB*)\n\temul=\"${emul}ltsmip\"\n\t;;\n    esac\n    case `/usr/bin/file conftest.$ac_objext` in\n      *N32*)\n\temul=\"${emul}n32\"\n\t;;\n    esac\n    LD=\"${LD-ld} -m $emul\"\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.  Note that the listed cases only cover the\n  # situations where additional linker options are needed (such as when\n  # doing 32-bit compilation for a host where ld defaults to 64-bit, or\n  # vice versa); the common cases where no linker options are needed do\n  # not appear in the list.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*linux*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*linux*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=$CFLAGS\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test yes != \"$lt_cv_cc_needs_belf\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=$SAVE_CFLAGS\n  fi\n  ;;\n*-*solaris*)\n  # Find out what ABI is being produced by ac_compile, and set linker\n  # options accordingly.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*|x86_64-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=${LD-ld}_sol2\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=$enable_libtool_lock\n])# _LT_ENABLE_LOCK\n\n\n# _LT_PROG_AR\n# -----------\nm4_defun([_LT_PROG_AR],\n[AC_CHECK_TOOLS(AR, [ar], false)\n: ${AR=ar}\n_LT_DECL([], [AR], [1], [The archiver])\n\n# Use ARFLAGS variable as AR's operation code to sync the variable naming with\n# Automake.  If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have\n# higher priority because thats what people were doing historically (setting\n# ARFLAGS for automake and AR_FLAGS for libtool).  FIXME: Make the AR_FLAGS\n# variable obsoleted/removed.\n\ntest ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr}\nlt_ar_flags=$AR_FLAGS\n_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)])\n\n# Make AR_FLAGS overridable by 'make ARFLAGS='.  Don't try to run-time override\n# by AR_FLAGS because that was never working and AR_FLAGS is about to die.\n_LT_DECL([], [AR_FLAGS], [\\@S|@{ARFLAGS-\"\\@S|@lt_ar_flags\"}],\n         [Flags to create an archive])\n\nAC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],\n  [lt_cv_ar_at_file=no\n   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],\n     [echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([lt_ar_try])\n      if test 0 -eq \"$ac_status\"; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\tAC_TRY_EVAL([lt_ar_try])\n\tif test 0 -ne \"$ac_status\"; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n     ])\n  ])\n\nif test no = \"$lt_cv_ar_at_file\"; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n_LT_DECL([], [archiver_list_spec], [1],\n  [How to feed a file listing to the archiver])\n])# _LT_PROG_AR\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[_LT_PROG_AR\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  bitrig* | openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n_LT_DECL([], [lock_old_archive_extraction], [0],\n    [Whether to use a lock for old archive extraction])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"  ## exclude from sc_useless_quotes_in_assignment\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test yes = \"[$]$2\"; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=$LDFLAGS\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=$save_LDFLAGS\n])\n\nif test yes = \"[$]$2\"; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=ABCD\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n       test undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test X`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test 17 != \"$i\" # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n \"$lt_cv_sys_max_cmd_len\"; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test yes = \"$cross_compiling\"; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisibility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s \"conftest$ac_exeext\" 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test yes != \"$enable_dlopen\"; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=load_add_on\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=LoadLibrary\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=dlopen\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n    # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[\n    lt_cv_dlopen=dyld\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  tpf*)\n    # Don't try to run any link tests for TPF.  We know it's impossible\n    # because TPF is a cross-compiler, and we know how we open DSOs.\n    lt_cv_dlopen=dlopen\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=no\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=shl_load],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=dlopen],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test no = \"$lt_cv_dlopen\"; then\n    enable_dlopen=no\n  else\n    enable_dlopen=yes\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=$CPPFLAGS\n    test yes = \"$ac_cv_header_dlfcn_h\" && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=$LDFLAGS\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=$LIBS\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test yes = \"$lt_cv_dlopen_self\"; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=$save_CPPFLAGS\n    LDFLAGS=$save_LDFLAGS\n    LIBS=$save_LIBS\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=nottested\nif test no = \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" && test no != \"$need_locks\"; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test no = \"$hard_links\"; then\n    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED([LT_OBJDIR], \"$lt_cv_objdir/\",\n  [Define to the sub-directory where libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test yes = \"$_LT_TAGVAR(hardcode_automatic, $1)\"; then\n\n  # We can hardcode non-existent directories.\n  if test no != \"$_LT_TAGVAR(hardcode_direct, $1)\" &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test no != \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" &&\n     test no != \"$_LT_TAGVAR(hardcode_minus_L, $1)\"; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test relink = \"$_LT_TAGVAR(hardcode_action, $1)\" ||\n   test yes = \"$_LT_TAGVAR(inherit_rpath, $1)\"; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test yes = \"$shlibpath_overrides_runpath\" ||\n     test no = \"$enable_shared\"; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -z \"$STRIP\"; then\n  AC_MSG_RESULT([no])\nelse\n  if $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n    old_striplib=\"$STRIP --strip-debug\"\n    striplib=\"$STRIP --strip-unneeded\"\n    AC_MSG_RESULT([yes])\n  else\n    case $host_os in\n    darwin*)\n      # FIXME - insert some real tests, host_os isn't really good enough\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n      ;;\n    freebsd*)\n      if $STRIP -V 2>&1 | $GREP \"elftoolchain\" >/dev/null; then\n        old_striplib=\"$STRIP --strip-debug\"\n        striplib=\"$STRIP --strip-unneeded\"\n        AC_MSG_RESULT([yes])\n      else\n        AC_MSG_RESULT([no])\n      fi\n      ;;\n    *)\n      AC_MSG_RESULT([no])\n      ;;\n    esac\n  fi\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_PREPARE_MUNGE_PATH_LIST\n# ---------------------------\n# Make sure func_munge_path_list() is defined correctly.\nm4_defun([_LT_PREPARE_MUNGE_PATH_LIST],\n[[# func_munge_path_list VARIABLE PATH\n# -----------------------------------\n# VARIABLE is name of variable containing _space_ separated list of\n# directories to be munged by the contents of PATH, which is string\n# having a format:\n# \"DIR[:DIR]:\"\n#       string \"DIR[ DIR]\" will be prepended to VARIABLE\n# \":DIR[:DIR]\"\n#       string \"DIR[ DIR]\" will be appended to VARIABLE\n# \"DIRP[:DIRP]::[DIRA:]DIRA\"\n#       string \"DIRP[ DIRP]\" will be prepended to VARIABLE and string\n#       \"DIRA[ DIRA]\" will be appended to VARIABLE\n# \"DIR[:DIR]\"\n#       VARIABLE will be replaced by \"DIR[ DIR]\"\nfunc_munge_path_list ()\n{\n    case x@S|@2 in\n    x)\n        ;;\n    *:)\n        eval @S|@1=\\\"`$ECHO @S|@2 | $SED 's/:/ /g'` \\@S|@@S|@1\\\"\n        ;;\n    x:*)\n        eval @S|@1=\\\"\\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\\\"\n        ;;\n    *::*)\n        eval @S|@1=\\\"\\@S|@@S|@1\\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\\\"\n        eval @S|@1=\\\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\\ \\@S|@@S|@1\\\"\n        ;;\n    *)\n        eval @S|@1=\\\"`$ECHO @S|@2 | $SED 's/:/ /g'`\\\"\n        ;;\n    esac\n}\n]])# _LT_PREPARE_PATH_LIST\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test yes = \"$GCC\"; then\n  case $host_os in\n    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;\n    *) lt_awk_arg='/^libraries:/' ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq='s|=\\([[A-Za-z]]:\\)|\\1|g' ;;\n    *) lt_sed_strip_eq='s|=/|/|g' ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary...\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  # ...but if some path component already ends with the multilib dir we assume\n  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).\n  case \"$lt_multi_os_dir; $lt_search_path_spec \" in\n  \"/; \"* | \"/.; \"* | \"/./; \"* | *\"$lt_multi_os_dir \"* | *\"$lt_multi_os_dir/ \"*)\n    lt_multi_os_dir=\n    ;;\n  esac\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir\"\n    elif test -n \"$lt_multi_os_dir\"; then\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS = \" \"; FS = \"/|\\n\";} {\n  lt_foo = \"\";\n  lt_count = 0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo = \"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's|/\\([[A-Za-z]]:\\)|\\1|g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=.so\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\nAC_ARG_VAR([LT_SYS_LIBRARY_PATH],\n[User-defined run-time library search path.])\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='$libname$release$shared_ext$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test ia64 = \"$host_cpu\"; then\n    # AIX 5 supports IA64\n    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line '#! .'.  This would cause the generated library to\n    # depend on '.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # Using Import Files as archive members, it is possible to support\n    # filename-based versioning of shared library archives on AIX. While\n    # this would work for both with and without runtime linking, it will\n    # prevent static linking of such archives. So we do filename-based\n    # shared library versioning with .so extension only, which is used\n    # when both runtime linking and shared linking is enabled.\n    # Unfortunately, runtime linking may impact performance, so we do\n    # not want this to be the default eventually. Also, we use the\n    # versioned .so libs for executables only if there is the -brtl\n    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.\n    # To allow for filename-based versioning support, we need to create\n    # libNAME.so.V as an archive file, containing:\n    # *) an Import File, referring to the versioned filename of the\n    #    archive as well as the shared archive member, telling the\n    #    bitwidth (32 or 64) of that shared object, and providing the\n    #    list of exported symbols of that shared object, eventually\n    #    decorated with the 'weak' keyword\n    # *) the shared object with the F_LOADONLY flag set, to really avoid\n    #    it being seen by the linker.\n    # At run time we better use the real file rather than another symlink,\n    # but for link time we create the symlink libNAME.so -> libNAME.so.V\n\n    case $with_aix_soname,$aix_use_runtimelinking in\n    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    aix,yes) # traditional libtool\n      dynamic_linker='AIX unversionable lib.so'\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      ;;\n    aix,no) # traditional AIX only\n      dynamic_linker='AIX lib.a[(]lib.so.V[)]'\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      ;;\n    svr4,*) # full svr4 only\n      dynamic_linker=\"AIX lib.so.V[(]$shared_archive_member_spec.o[)]\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,yes) # both, prefer svr4\n      dynamic_linker=\"AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]\"\n      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'\n      # unpreferred sharedlib libNAME.a needs extra handling\n      postinstall_cmds='test -n \"$linkname\" || linkname=\"$realname\"~func_stripname \"\" \".so\" \"$linkname\"~$install_shared_prog \"$dir/$func_stripname_result.$libext\" \"$destdir/$func_stripname_result.$libext\"~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib \"$destdir/$func_stripname_result.$libext\"'\n      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname \"\" \".so\" \"$n\"~test \"$func_stripname_result\" = \"$n\" || func_append rmfiles \" $odir/$func_stripname_result.$libext\"'\n      # We do not specify a path in Import Files, so LIBPATH fires.\n      shlibpath_overrides_runpath=yes\n      ;;\n    *,no) # both, prefer aix\n      dynamic_linker=\"AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]\"\n      library_names_spec='$libname$release.a $libname.a'\n      soname_spec='$libname$release$shared_ext$major'\n      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling\n      postinstall_cmds='test -z \"$dlname\" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z \"$tstripme\" || test -z \"$striplib\" || $striplib $destdir/$dlname~test -n \"$linkname\" || linkname=$realname~func_stripname \"\" \".a\" \"$linkname\"~(cd \"$destdir\" && $LN_S -f $dlname $func_stripname_result.so)'\n      postuninstall_cmds='test -z \"$dlname\" || func_append rmfiles \" $odir/$dlname\"~for n in $old_library $library_names; do :; done~func_stripname \"\" \".a\" \"$n\"~func_append rmfiles \" $odir/$func_stripname_result.so\"'\n      ;;\n    esac\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='$libname$shared_ext'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'\nm4_if([$1], [],[\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"])\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl* | *,icl*)\n    # Native MSVC or ICC\n    libname_spec='$name'\n    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'\n    library_names_spec='$libname.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([[a-zA-Z]]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=$LIB\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\$file`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC and ICC wrapper\n    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$major$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[23]].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n      soname_spec='$libname$release$shared_ext$major'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    if test 32 = \"$HPUX_IA64_MODE\"; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux32\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n      sys_lib_dlsearch_path_spec=/usr/lib/hpux64\n    fi\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test yes = \"$lt_cv_prog_gnu_ld\"; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib$libsuff /lib$libsuff\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\nlinux*android*)\n  version_type=none # Android doesn't support versioned libraries.\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext'\n  soname_spec='$libname$release$shared_ext'\n  finish_cmds=\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  dynamic_linker='Android linker'\n  # Don't embed -rpath directories since the linker doesn't support them.\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],\n    [lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n\t [lt_cv_shlibpath_overrides_runpath=yes])])\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n    ])\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Ideally, we could use ldconfig to report *all* directores which are\n  # searched for libraries, however this is still not possible.  Aside from not\n  # being certain /sbin/ldconfig is available, command\n  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,\n  # even though it is searched at run-time.  Try to do the best guess by\n  # appending ld.so.conf contents (and includes) to the search path.\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n    soname_spec='$libname$release$shared_ext$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd* | bitrig*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=/usr/lib\n  need_lib_prefix=no\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n    need_version=no\n  else\n    need_version=yes\n  fi\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\nos2*)\n  libname_spec='$name'\n  version_type=windows\n  shrext_cmds=.dll\n  need_version=no\n  need_lib_prefix=no\n  # OS/2 can only load a DLL with a base name of 8 characters or less.\n  soname_spec='`test -n \"$os2dllname\" && libname=\"$os2dllname\";\n    v=$($ECHO $release$versuffix | tr -d .-);\n    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);\n    $ECHO $n$v`$shared_ext'\n  library_names_spec='${libname}_dll.$libext'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=BEGINLIBPATH\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  postinstall_cmds='base_file=`basename \\$file`~\n    dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\$base_file'\\''i; $ECHO \\$dlname'\\''`~\n    dldir=$destdir/`dirname \\$dlpath`~\n    test -d \\$dldir || mkdir -p \\$dldir~\n    $install_prog $dir/$dlname \\$dldir/$dlname~\n    chmod a+x \\$dldir/$dlname~\n    if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n      eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n    fi'\n  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; $ECHO \\$dlname'\\''`~\n    dlpath=$dir/\\$dldll~\n    $RM \\$dlpath'\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='$libname$release$shared_ext$major'\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test yes = \"$with_gnu_ld\"; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec; then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'\n    soname_spec='$libname$shared_ext.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=sco\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test yes = \"$with_gnu_ld\"; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'\n  soname_spec='$libname$release$shared_ext$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest no = \"$dynamic_linker\" && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test yes = \"$GCC\"; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test set = \"${lt_cv_sys_lib_search_path_spec+set}\"; then\n  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec\nfi\n\nif test set = \"${lt_cv_sys_lib_dlsearch_path_spec+set}\"; then\n  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec\nfi\n\n# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...\nconfigure_time_dlsearch_path=$sys_lib_dlsearch_path_spec\n\n# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code\nfunc_munge_path_list sys_lib_dlsearch_path_spec \"$LT_SYS_LIBRARY_PATH\"\n\n# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool\nconfigure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [install_override_mode], [1],\n    [Permission mode override for installation of shared libraries])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],\n    [Detected run-time system search path for libraries])\n_LT_DECL([], [configure_time_lt_sys_library_path], [2],\n    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program that can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=$MAGIC_CMD\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$1\"; then\n      lt_cv_path_MAGIC_CMD=$ac_dir/\"$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=$lt_cv_path_MAGIC_CMD\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=$lt_save_ifs\n  MAGIC_CMD=$lt_save_MAGIC_CMD\n  ;;\nesac])\nMAGIC_CMD=$lt_cv_path_MAGIC_CMD\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program that can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PROG_ECHO_BACKSLASH])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test no = \"$withval\" || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test yes = \"$GCC\"; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return, which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=$ac_prog\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test yes = \"$with_gnu_ld\"; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=$lt_save_ifs\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=$ac_dir/$ac_prog\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest no != \"$with_gnu_ld\" && break\n\t;;\n      *)\n\ttest yes != \"$with_gnu_ld\" && break\n\t;;\n      esac\n    fi\n  done\n  IFS=$lt_save_ifs\nelse\n  lt_cv_path_LD=$LD # Let the user override the test with a path.\nfi])\nLD=$lt_cv_path_LD\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test yes != \"$GCC\"; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test yes = \"$GCC\"; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_TAGDECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_PATH_DD\n# -----------\n# find a working dd\nm4_defun([_LT_PATH_DD],\n[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],\n[printf 0123456789abcdef0123456789abcdef >conftest.i\ncat conftest.i conftest.i >conftest2.i\n: ${lt_DD:=$DD}\nAC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],\n[if \"$ac_path_lt_DD\" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then\n  cmp -s conftest.i conftest.out \\\n  && ac_cv_path_lt_DD=\"$ac_path_lt_DD\" ac_path_lt_DD_found=:\nfi])\nrm -f conftest.i conftest2.i conftest.out])\n])# _LT_PATH_DD\n\n\n# _LT_CMD_TRUNCATE\n# ----------------\n# find command to truncate a binary pipe\nm4_defun([_LT_CMD_TRUNCATE],\n[m4_require([_LT_PATH_DD])\nAC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],\n[printf 0123456789abcdef0123456789abcdef >conftest.i\ncat conftest.i conftest.i >conftest2.i\nlt_cv_truncate_bin=\nif \"$ac_cv_path_lt_DD\" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then\n  cmp -s conftest.i conftest.out \\\n  && lt_cv_truncate_bin=\"$ac_cv_path_lt_DD bs=4096 count=1\"\nfi\nrm -f conftest.i conftest2.i conftest.out\ntest -z \"$lt_cv_truncate_bin\" && lt_cv_truncate_bin=\"$SED -e 4q\"])\n_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],\n  [Command to truncate a binary pipe])\n])# _LT_CMD_TRUNCATE\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# 'unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# that responds to the $file_magic_cmd with a given extended regex.\n# If you have 'file' or equivalent on your system and you're not sure\n# whether 'pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\\.[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd* | bitrig*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nos2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[[\\1]]\\/[[\\1]]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [file_magic_glob], [1],\n    [How to find potential files when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [want_nocaseglob], [1],\n    [Find potential files using nocaseglob when deplibs_check_method = \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=$NM\nelse\n  lt_nm_to_check=${ac_tool_prefix}nm\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=$lt_save_ifs\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=$ac_dir/$lt_tmp_nm\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\"; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the 'sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\t# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty\n\tcase $build_os in\n\tmingw*) lt_bad_file=conftest.nm/nofile ;;\n\t*) lt_bad_file=/dev/null ;;\n\tesac\n\tcase `\"$tmp_nm\" -B $lt_bad_file 2>&1 | sed '1q'` in\n\t*$lt_bad_file* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break 2\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break 2\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=$lt_save_ifs\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test no != \"$lt_cv_path_NM\"; then\n  NM=$lt_cv_path_NM\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    AC_CHECK_TOOLS(DUMPBIN, [dumpbin \"link -dump\"], :)\n    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols -headers\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n  AC_SUBST([DUMPBIN])\n  if test : != \"$DUMPBIN\"; then\n    NM=$DUMPBIN\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n# --------------------------------\n# how to determine the name of the shared library\n# associated with a specific link library.\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nm4_require([_LT_DECL_DLLTOOL])\nAC_CACHE_CHECK([how to associate runtime and link libraries],\nlt_cv_sharedlib_from_linklib_cmd,\n[lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh;\n  # decide which one to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=$ECHO\n  ;;\nesac\n])\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n_LT_DECL([], [sharedlib_from_linklib_cmd], [1],\n    [Command to associate shared and link libraries])\n])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n\n\n# _LT_PATH_MANIFEST_TOOL\n# ----------------------\n# locate the manifest tool\nm4_defun([_LT_PATH_MANIFEST_TOOL],\n[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\nAC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],\n  [lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&AS_MESSAGE_LOG_FD\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*])\nif test yes != \"$lt_cv_path_mainfest_tool\"; then\n  MANIFEST_TOOL=:\nfi\n_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl\n])# _LT_PATH_MANIFEST_TOOL\n\n\n# _LT_DLL_DEF_P([FILE])\n# ---------------------\n# True iff FILE is a Windows DLL '.def' file.\n# Keep in sync with func_dll_def_p in the libtool script\nAC_DEFUN([_LT_DLL_DEF_P],\n[dnl\n  test DEF = \"`$SED -n dnl\n    -e '\\''s/^[[\t ]]*//'\\'' dnl Strip leading whitespace\n    -e '\\''/^\\(;.*\\)*$/d'\\'' dnl      Delete empty lines and comments\n    -e '\\''s/^\\(EXPORTS\\|LIBRARY\\)\\([[\t ]].*\\)*$/DEF/p'\\'' dnl\n    -e q dnl                          Only consider the first \"real\" line\n    $1`\" dnl\n])# _LT_DLL_DEF_P\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=-lm)\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test yes = \"$GCC\"; then\n  case $cc_basename in\n  nvcc*)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;\n  esac\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test ia64 = \"$host_cpu\"; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  # Gets list of data symbols to import.\n  lt_cv_sys_global_symbol_to_import=\"sed -n -e 's/^I .* \\(.*\\)$/\\1/p'\"\n  # Adjust the below global symbol transforms to fixup imported variables.\n  lt_cdecl_hook=\" -e 's/^I .* \\(.*\\)$/extern __declspec(dllimport) char \\1;/p'\"\n  lt_c_name_hook=\" -e 's/^I .* \\(.*\\)$/  {\\\"\\1\\\", (void *) 0},/p'\"\n  lt_c_name_lib_hook=\"\\\n  -e 's/^I .* \\(lib.*\\)$/  {\\\"\\1\\\", (void *) 0},/p'\\\n  -e 's/^I .* \\(.*\\)$/  {\\\"lib\\1\\\", (void *) 0},/p'\"\nelse\n  # Disable hooks by default.\n  lt_cv_sys_global_symbol_to_import=\n  lt_cdecl_hook=\n  lt_c_name_hook=\n  lt_c_name_lib_hook=\nfi\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n\"\\\n$lt_cdecl_hook\\\n\" -e 's/^T .* \\(.*\\)$/extern int \\1();/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n\"\\\n$lt_c_name_hook\\\n\" -e 's/^: \\(.*\\) .*$/  {\\\"\\1\\\", (void *) 0},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/p'\"\n\n# Transform an extracted symbol line into symbol name with lib prefix and\n# symbol address.\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n\"\\\n$lt_c_name_lib_hook\\\n\" -e 's/^: \\(.*\\) .*$/  {\\\"\\1\\\", (void *) 0},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(lib.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/p'\"\\\n\" -e 's/^$symcode$symcode* .* \\(.*\\)$/  {\\\"lib\\1\\\", (void *) \\&\\1},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function,\n    # D for any global variable and I for any imported variable.\n    # Also find C++ and __fastcall symbols from MSVC++ or ICC,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     /^ *Symbol name *: /{split(\\$ 0,sn,\\\":\\\"); si=substr(sn[2],2)};\"\\\n\"     /^ *Type *: code/{print \\\"T\\\",si,substr(si,length(prfx))};\"\\\n\"     /^ *Type *: data/{print \\\"I\\\",si,substr(si,length(prfx))};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=\\\"D\\\"}; \\$ 0~/\\(\\).*\\|/{f=\\\"T\\\"};\"\\\n\"     {split(\\$ 0,a,/\\||\\r/); split(a[2],s)};\"\\\n\"     s[1]~/^[@?]/{print f,s[1],s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print f,t[1],substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE\n/* DATA imports from DLLs on WIN32 can't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT@&t@_DLSYM_CONST\n#elif defined __osf__\n/* This system does not cope well with relocations in const data.  */\n# define LT@&t@_DLSYM_CONST\n#else\n# define LT@&t@_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT@&t@_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* .* \\(.*\\)$/  {\\\"\\1\\\", (void *) \\&\\1},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=conftstm.$ac_objext\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test yes = \"$pipe_works\"; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],\n    [Transform the output of nm into a list of symbols to manually relocate])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],\n    [The name lister interface])\n_LT_DECL([], [nm_file_list_spec], [1],\n    [Specify filename containing input files for $NM])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test yes = \"$GXX\"; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the '-m68020' flag to GCC prevents building anything better,\n            # like '-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      case $host_os in\n      os2*)\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'\n\t;;\n      esac\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test ia64 = \"$host_cpu\"; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tm4_if([$1], [GCJ], [],\n\t  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'\n\t    if test ia64 != \"$host_cpu\"; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64, which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd*)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test yes = \"$GCC\"; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the '-m68020' flag to GCC prevents building anything better,\n            # like '-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      case $host_os in\n      os2*)\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '\n      if test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test ia64 = \"$host_cpu\"; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      case $cc_basename in\n      nagfor*)\n        # NAG Fortran compiler\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      esac\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      case $host_os in\n      os2*)\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'\n\t;;\n      esac\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64, which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t;;\n      tcc*)\n\t# Fabrice Bellard et al's Tiny C Compiler\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [[1-7]].* | *Sun*Fortran*\\ 8.[[0-3]]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n        *Intel*\\ [[CF]]*Compiler*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms that do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\n\nAC_CACHE_CHECK([for $compiler option to produce PIC],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to GNU nm, but means don't demangle to AIX nm.\n    # Without the \"-l\" option, or with the \"-B\" option, AIX nm treats\n    # weak defined symbols like other global defined symbols, whereas\n    # GNU nm marks them as \"W\".\n    # While the 'weak' keyword is ignored in the Export File, we need\n    # it in the Import File for the 'aix-soname' feature, so we have\n    # to replace the \"-B\" option with \"-P\" for AIX nm.\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { if (\\$ 2 == \"W\") { print \\$ 3 \" weak\" } else { print \\$ 3 } } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\\''s/B\\([[^B]]*\\)$/P\\1/'\\''` -PCpgl $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"L\") || (\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) && ([substr](\\$ 1,1,1) != \".\")) { if ((\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) { print \\$ 1 \" weak\" } else { print \\$ 1 } } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl* | icl*)\n      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n      ;;\n    esac\n    ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ' (' and ')$', so one must not match beginning or\n  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',\n  # as well as any symbol that contains 'd'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++ or Intel C++ Compiler.\n    if test yes != \"$GCC\"; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC)\n    with_gnu_ld=yes\n    ;;\n  openbsd* | bitrig*)\n    with_gnu_ld=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test yes = \"$with_gnu_ld\"; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[[2-9]]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [[3-9]]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test yes = \"$lt_use_gnu_ld_interface\"; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='$wl'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v | $SED -e 's/([^)]\\+)\\s\\+//' 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test ia64 != \"$host_cpu\"; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file, use it as\n\t# is; otherwise, prepend EXPORTS...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then\n          cp $export_symbols $output_objdir/$soname.def;\n        else\n          echo EXPORTS > $output_objdir/$soname.def;\n          cat $export_symbols >> $output_objdir/$soname.def;\n        fi~\n        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    haiku*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      shrext_cmds=.dll\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\temxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\tprefix_cmds=\"$SED\"~\n\tif test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t  prefix_cmds=\"$prefix_cmds -e 1d\";\n\tfi~\n\tprefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\tcat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='@'\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s|^|_|\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test linux-dietlibc = \"$host_os\"; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test no = \"$tmp_diet\"\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n        nagfor*)                        # NAGFOR 5.3\n          tmp_sharedflag='-Wl,-shared' ;;\n\txl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\n        if test yes = \"$supports_anon_versioning\"; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n            cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n            echo \"local: *; };\" >> $output_objdir/$libname.ver~\n            $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\ttcc*)\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'\n\t  ;;\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test yes = \"$supports_anon_versioning\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n              cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n              echo \"local: *; };\" >> $output_objdir/$libname.ver~\n              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd*)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test no = \"$_LT_TAGVAR(ld_shlibs, $1)\"; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test yes = \"$GCC\" && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test ia64 = \"$host_cpu\"; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to GNU nm, but means don't demangle to AIX nm.\n\t# Without the \"-l\" option, or with the \"-B\" option, AIX nm treats\n\t# weak defined symbols like other global defined symbols, whereas\n\t# GNU nm marks them as \"W\".\n\t# While the 'weak' keyword is ignored in the Export File, we need\n\t# it in the Import File for the 'aix-soname' feature, so we have\n\t# to replace the \"-B\" option with \"-P\" for AIX nm.\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { if (\\$ 2 == \"W\") { print \\$ 3 \" weak\" } else { print \\$ 3 } } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\\''s/B\\([[^B]]*\\)$/P\\1/'\\''` -PCpgl $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"L\") || (\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) && ([substr](\\$ 1,1,1) != \".\")) { if ((\\$ 2 == \"W\") || (\\$ 2 == \"V\") || (\\$ 2 == \"Z\")) { print \\$ 1 \" weak\" } else { print \\$ 1 } } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# have runtime linking enabled, and use it for executables.\n\t# For shared libraries, we enable/disable runtime linking\n\t# depending on the kind of the shared library created -\n\t# when \"with_aix_soname,aix_use_runtimelinking\" is:\n\t# \"aix,no\"   lib.a(lib.so.V) shared, rtl:no,  for executables\n\t# \"aix,yes\"  lib.so          shared, rtl:yes, for executables\n\t#            lib.a           static archive\n\t# \"both,no\"  lib.so.V(shr.o) shared, rtl:yes\n\t#            lib.a(lib.so.V) shared, rtl:no,  for executables\n\t# \"both,yes\" lib.so.V(shr.o) shared, rtl:yes, for executables\n\t#            lib.a(lib.so.V) shared, rtl:no\n\t# \"svr4,*\"   lib.so.V(shr.o) shared, rtl:yes, for executables\n\t#            lib.a           static archive\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test x-brtl = \"x$ld_flag\" || test x-Wl,-brtl = \"x$ld_flag\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  if test svr4,no = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t    # With aix-soname=svr4, we create the lib.so.V shared archives only,\n\t    # so we don't have lib.a shared libs to link our executables.\n\t    # We have to force runtime linking in this case.\n\t    aix_use_runtimelinking=yes\n\t    LDFLAGS=\"$LDFLAGS -Wl,-brtl\"\n\t  fi\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'\n      case $with_aix_soname,$aix_use_runtimelinking in\n      aix,*) ;; # traditional, no import file\n      svr4,* | *,yes) # use import file\n\t# The Import File defines what to hardcode.\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n\t;;\n      esac\n\n      if test yes = \"$GCC\"; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`$CC -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test yes = \"$aix_use_runtimelinking\"; then\n\t  shared_flag=\"$shared_flag \"'$wl-G'\n\tfi\n\t# Need to ensure runtime linking is disabled for the traditional\n\t# shared library, or the linker may eventually find shared libraries\n\t# /with/ Import File - we do not want to mix them.\n\tshared_flag_aix='-shared'\n\tshared_flag_svr4='-shared $wl-G'\n      else\n\t# not using gcc\n\tif test ia64 = \"$host_cpu\"; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test yes = \"$aix_use_runtimelinking\"; then\n\t    shared_flag='$wl-G'\n\t  else\n\t    shared_flag='$wl-bM:SRE'\n\t  fi\n\t  shared_flag_aix='$wl-bM:SRE'\n\t  shared_flag_svr4='$wl-G'\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test aix,yes = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX([$1])\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n \"$allow_undefined_flag\"; then func_echo_all \"$wl$allow_undefined_flag\"; else :; fi` $wl'$exp_sym_flag:\\$export_symbols' '$shared_flag\n      else\n\tif test ia64 = \"$host_cpu\"; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\$wl$no_entry_flag\"' $compiler_flags $wl$allow_undefined_flag '\"\\$wl$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX([$1])\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'\n\t  if test yes = \"$with_gnu_ld\"; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  fi\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'\n\t  # -brtl affects multiple linker settings, -berok does not and is overridden later\n\t  compiler_flags_filtered='`func_echo_all \"$compiler_flags \" | $SED -e \"s%-brtl\\\\([[, ]]\\\\)%-berok\\\\1%g\"`'\n\t  if test svr4 != \"$with_aix_soname\"; then\n\t    # This is similar to how AIX traditionally builds its shared libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'\n\t  fi\n\t  if test aix != \"$with_aix_soname\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all \"#! $soname($shared_archive_member_spec.o)\"; if test shr_64 = \"$shared_archive_member_spec\"; then func_echo_all \"# 64\"; else func_echo_all \"# 32\"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'\n\t  else\n\t    # used by -dlpreopen to get the symbols\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'\n\t  fi\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$RM -r $output_objdir/$realname.d'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++ or Intel C++ Compiler.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl* | icl*)\n\t# Native MSVC or ICC\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t_LT_TAGVAR(always_export_symbols, $1)=yes\n\t_LT_TAGVAR(file_list_spec, $1)='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=.dll\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~linknames='\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then\n            cp \"$export_symbols\" \"$output_objdir/$soname.def\";\n            echo \"$tool_output_objdir$soname.def\" > \"$output_objdir/$soname.exp\";\n          else\n            $SED -e '\\''s/^/-link -EXPORT:/'\\'' < $export_symbols > $output_objdir/$soname.exp;\n          fi~\n          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n          linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\t_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\t_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n          lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n          case $lt_outputfile in\n            *.exe|*.EXE) ;;\n            *)\n              lt_outputfile=$lt_outputfile.exe\n              lt_tool_outputfile=$lt_tool_outputfile.exe\n              ;;\n          esac~\n          if test : != \"$MANIFEST_TOOL\" && test -f \"$lt_outputfile.manifest\"; then\n            $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n            $RM \"$lt_outputfile.manifest\";\n          fi'\n\t;;\n      *)\n\t# Assume MSVC and ICC wrapper\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=.dll\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\t_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t# FIXME: Should let the user specify the lib program.\n\t_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n      ;;\n\n    hpux10*)\n      if test yes,no = \"$GCC,$with_gnu_ld\"; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test no = \"$with_gnu_ld\"; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test yes,no = \"$GCC,$with_gnu_ld\"; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\tm4_if($1, [], [\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  _LT_LINKER_OPTION([if $CC understands -b],\n\t    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],\n\t  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])\n\t  ;;\n\tesac\n      fi\n      if test no = \"$with_gnu_ld\"; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\tAC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],\n\t  [lt_cv_irix_exported_symbol],\n\t  [save_LDFLAGS=$LDFLAGS\n\t   LDFLAGS=\"$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null\"\n\t   AC_LINK_IFELSE(\n\t     [AC_LANG_SOURCE(\n\t        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],\n\t\t\t      [C++], [[int foo (void) { return 0; }]],\n\t\t\t      [Fortran 77], [[\n      subroutine foo\n      end]],\n\t\t\t      [Fortran], [[\n      subroutine foo\n      end]])])],\n\t      [lt_cv_irix_exported_symbol=yes],\n\t      [lt_cv_irix_exported_symbol=no])\n           LDFLAGS=$save_LDFLAGS])\n\tif test yes = \"$lt_cv_irix_exported_symbol\"; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'\n\tfi\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    linux*)\n      case $cc_basename in\n      tcc*)\n\t# Fabrice Bellard et al's Tiny C Compiler\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t;;\n      esac\n      ;;\n\n    netbsd*)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd* | bitrig*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n\telse\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      shrext_cmds=.dll\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\temxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t$ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t$ECHO EXPORTS >> $output_objdir/$libname.def~\n\tprefix_cmds=\"$SED\"~\n\tif test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t  prefix_cmds=\"$prefix_cmds -e 1d\";\n\tfi~\n\tprefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\tcat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\temximp -o $lib $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='@'\n      ;;\n\n    osf3*)\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test yes = \"$GCC\"; then\n\twlarc='$wl'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='$wl'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands '-z linker_flag'.  GCC discards it without '$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test yes = \"$GCC\"; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test sequent = \"$host_vendor\"; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We CANNOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test yes = \"$GCC\"; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test sni = \"$host_vendor\"; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest no = \"$_LT_TAGVAR(ld_shlibs, $1)\" && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test yes,yes = \"$GCC,$enable_shared\"; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_CACHE_CHECK([whether -lc should be explicitly linked in],\n\t[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),\n\t[$RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\t  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\n\t  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n\t  then\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t  else\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  fi\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\t])\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME$shared_ext during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME$shared_ext during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting $shlibpath_var if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [postlink_cmds], [2],\n    [Commands necessary for finishing linking programs])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=$CC\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report what library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test no = \"$can_build_shared\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test yes = \"$enable_shared\" && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test ia64 != \"$host_cpu\"; then\n      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in\n      yes,aix,yes) ;;\t\t\t# shared object as lib.so file only\n      yes,svr4,*) ;;\t\t\t# shared object as lib.so archive member only\n      yes,*) enable_static=no ;;\t# shared object in lib.a archive as well\n      esac\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test yes = \"$enable_shared\" || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=$lt_save_CC\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nif test -n \"$CXX\" && ( test no != \"$CXX\" &&\n    ( (test g++ = \"$CXX\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test g++ != \"$CXX\"))); then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test yes != \"$_lt_caught_CXX_error\"; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test yes = \"$GXX\"; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test yes = \"$GXX\"; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test yes = \"$with_gnu_ld\"; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='$wl'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test ia64 = \"$host_cpu\"; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # have runtime linking enabled, and use it for executables.\n          # For shared libraries, we enable/disable runtime linking\n          # depending on the kind of the shared library created -\n          # when \"with_aix_soname,aix_use_runtimelinking\" is:\n          # \"aix,no\"   lib.a(lib.so.V) shared, rtl:no,  for executables\n          # \"aix,yes\"  lib.so          shared, rtl:yes, for executables\n          #            lib.a           static archive\n          # \"both,no\"  lib.so.V(shr.o) shared, rtl:yes\n          #            lib.a(lib.so.V) shared, rtl:no,  for executables\n          # \"both,yes\" lib.so.V(shr.o) shared, rtl:yes, for executables\n          #            lib.a(lib.so.V) shared, rtl:no\n          # \"svr4,*\"   lib.so.V(shr.o) shared, rtl:yes, for executables\n          #            lib.a           static archive\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    if test svr4,no = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n\t      # With aix-soname=svr4, we create the lib.so.V shared archives only,\n\t      # so we don't have lib.a shared libs to link our executables.\n\t      # We have to force runtime linking in this case.\n\t      aix_use_runtimelinking=yes\n\t      LDFLAGS=\"$LDFLAGS -Wl,-brtl\"\n\t    fi\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'\n        case $with_aix_soname,$aix_use_runtimelinking in\n        aix,*) ;;\t# no import file\n        svr4,* | *,yes) # use import file\n          # The Import File defines what to hardcode.\n          _LT_TAGVAR(hardcode_direct, $1)=no\n          _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n          ;;\n        esac\n\n        if test yes = \"$GXX\"; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`$CC -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test yes = \"$aix_use_runtimelinking\"; then\n\t    shared_flag=$shared_flag' $wl-G'\n\t  fi\n\t  # Need to ensure runtime linking is disabled for the traditional\n\t  # shared library, or the linker may eventually find shared libraries\n\t  # /with/ Import File - we do not want to mix them.\n\t  shared_flag_aix='-shared'\n\t  shared_flag_svr4='-shared $wl-G'\n        else\n          # not using gcc\n          if test ia64 = \"$host_cpu\"; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test yes = \"$aix_use_runtimelinking\"; then\n\t      shared_flag='$wl-G'\n\t    else\n\t      shared_flag='$wl-bM:SRE'\n\t    fi\n\t    shared_flag_aix='$wl-bM:SRE'\n\t    shared_flag_svr4='$wl-G'\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n\tif test aix,yes = \"$with_aix_soname,$aix_use_runtimelinking\"; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          # The \"-G\" linker flag allows undefined symbols.\n          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX([$1])\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n \"$allow_undefined_flag\"; then func_echo_all \"$wl$allow_undefined_flag\"; else :; fi` $wl'$exp_sym_flag:\\$export_symbols' '$shared_flag\n        else\n          if test ia64 = \"$host_cpu\"; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\$wl$no_entry_flag\"' $compiler_flags $wl$allow_undefined_flag '\"\\$wl$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX([$1])\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'\n\t    if test yes = \"$with_gnu_ld\"; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    fi\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'\n\t    # -brtl affects multiple linker settings, -berok does not and is overridden later\n\t    compiler_flags_filtered='`func_echo_all \"$compiler_flags \" | $SED -e \"s%-brtl\\\\([[, ]]\\\\)%-berok\\\\1%g\"`'\n\t    if test svr4 != \"$with_aix_soname\"; then\n\t      # This is similar to how AIX traditionally builds its shared\n\t      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'\n\t    fi\n\t    if test aix != \"$with_aix_soname\"; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all \"#! $soname($shared_archive_member_spec.o)\"; if test shr_64 = \"$shared_archive_member_spec\"; then func_echo_all \"# 64\"; else func_echo_all \"# 32\"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'\n\t    else\n\t      # used by -dlpreopen to get the symbols\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'\n\t    fi\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"$_LT_TAGVAR(archive_expsym_cmds, $1)\"'~$RM -r $output_objdir/$realname.d'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl* | ,icl* | no,icl*)\n\t  # Native MSVC or ICC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=yes\n\t  _LT_TAGVAR(file_list_spec, $1)='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=.dll\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~linknames='\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then\n              cp \"$export_symbols\" \"$output_objdir/$soname.def\";\n              echo \"$tool_output_objdir$soname.def\" > \"$output_objdir/$soname.exp\";\n            else\n              $SED -e '\\''s/^/-link -EXPORT:/'\\'' < $export_symbols > $output_objdir/$soname.exp;\n            fi~\n            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n            linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t  # Don't use ranlib\n\t  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n            lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n            case $lt_outputfile in\n              *.exe|*.EXE) ;;\n              *)\n                lt_outputfile=$lt_outputfile.exe\n                lt_tool_outputfile=$lt_tool_outputfile.exe\n                ;;\n            esac~\n            func_to_tool_file \"$lt_outputfile\"~\n            if test : != \"$MANIFEST_TOOL\" && test -f \"$lt_outputfile.manifest\"; then\n              $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n              $RM \"$lt_outputfile.manifest\";\n            fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=no\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file, use it as\n\t    # is; otherwise, prepend EXPORTS...\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then\n              cp $export_symbols $output_objdir/$soname.def;\n            else\n              echo EXPORTS > $output_objdir/$soname.def;\n              cat $export_symbols >> $output_objdir/$soname.def;\n            fi~\n            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      os2*)\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\tshrext_cmds=.dll\n\t_LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t  $ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t  $ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t  $ECHO EXPORTS >> $output_objdir/$libname.def~\n\t  emxexp $libobjs | $SED /\"_DLL_InitTerm\"/d >> $output_objdir/$libname.def~\n\t  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\t  emximp -o $lib $output_objdir/$libname.def'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO \"LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE\" > $output_objdir/$libname.def~\n\t  $ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~\n\t  $ECHO \"DATA MULTIPLE NONSHARED\" >> $output_objdir/$libname.def~\n\t  $ECHO EXPORTS >> $output_objdir/$libname.def~\n\t  prefix_cmds=\"$SED\"~\n\t  if test EXPORTS = \"`$SED 1q $export_symbols`\"; then\n\t    prefix_cmds=\"$prefix_cmds -e 1d\";\n\t  fi~\n\t  prefix_cmds=\"$prefix_cmds -e \\\"s/^\\(.*\\)$/_\\1/g\\\"\"~\n\t  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~\n\t  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~\n\t  emximp -o $lib $output_objdir/$libname.def'\n\t_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t_LT_TAGVAR(file_list_spec, $1)='@'\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      haiku*)\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test yes = \"$GXX\"; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test \"x$output_objdir/$soname\" = \"x$lib\" || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test no = \"$with_gnu_ld\"; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test yes = \"$GXX\"; then\n\t      if test no = \"$with_gnu_ld\"; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s|^|_|\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test yes = \"$GXX\"; then\n\t      if test no = \"$with_gnu_ld\"; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib $wl-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]].* | *pgcpp\\ [[1-5]].*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n               rm -rf $tpldir~\n               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n               compile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n                $RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n                rm -rf $tpldir~\n                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'\n\t    if test yes = \"$supports_anon_versioning\"; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n                cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n                echo \"local: *; };\" >> $output_objdir/$libname.ver~\n                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` $wl--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd* | bitrig*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\$tempext\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n                  echo \"-hidden\">> $lib.exp~\n                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry $output_objdir/so_locations -o $lib~\n                  $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list= ; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test yes,no = \"$GXX,$with_gnu_ld\"; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n \"$verstring\" && func_echo_all \"$wl-set_version $wl$verstring\"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands '-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test yes,no = \"$GXX,$with_gnu_ld\"; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require '-G' NOT '-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We CANNOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~\n              '\"$_LT_TAGVAR(old_archive_cmds, $1)\"\n\t    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~\n              '\"$_LT_TAGVAR(reload_cmds, $1)\"\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test no = \"$_LT_TAGVAR(ld_shlibs, $1)\" && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=$GXX\n    _LT_TAGVAR(LD, $1)=$LD\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test yes != \"$_lt_caught_CXX_error\"\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_FUNC_STRIPNAME_CNF\n# ----------------------\n# func_stripname_cnf prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n#\n# This function is identical to the (non-XSI) version of func_stripname,\n# except this one can be used by m4 code that may be executed by configure,\n# rather than the libtool script.\nm4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl\nAC_REQUIRE([_LT_DECL_SED])\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])\nfunc_stripname_cnf ()\n{\n  case @S|@2 in\n  .*) func_stripname_result=`$ECHO \"@S|@3\" | $SED \"s%^@S|@1%%; s%\\\\\\\\@S|@2\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"@S|@3\" | $SED \"s%^@S|@1%%; s%@S|@2\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n])# _LT_FUNC_STRIPNAME_CNF\n\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nAC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF\npackage foo\nfunc foo() {\n}\n_LT_EOF\n])\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case $prev$p in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test x-L = \"$p\" ||\n          test x-R = \"$p\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test no = \"$pre_test_object_deps_done\"; then\n\t case $prev in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=$prev$p\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} $prev$p\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test no = \"$pre_test_object_deps_done\"; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=$p\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=$p\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | $SED -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_LANG_PUSH(Fortran 77)\nif test -z \"$F77\" || test no = \"$F77\"; then\n  _lt_disable_F77=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test yes != \"$_lt_disable_F77\"; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${F77-\"f77\"}\n  CFLAGS=$FFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test no = \"$can_build_shared\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test yes = \"$enable_shared\" && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test ia64 != \"$host_cpu\"; then\n\t  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in\n\t  yes,aix,yes) ;;\t\t# shared object as lib.so file only\n\t  yes,svr4,*) ;;\t\t# shared object as lib.so archive member only\n\t  yes,*) enable_static=no ;;\t# shared object in lib.a archive as well\n\t  esac\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test yes = \"$enable_shared\" || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=$G77\n    _LT_TAGVAR(LD, $1)=$LD\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\nfi # test yes != \"$_lt_disable_F77\"\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_LANG_PUSH(Fortran)\n\nif test -z \"$FC\" || test no = \"$FC\"; then\n  _lt_disable_FC=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test yes != \"$_lt_disable_FC\"; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${FC-\"f95\"}\n  CFLAGS=$FCFLAGS\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test no = \"$can_build_shared\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test yes = \"$enable_shared\" && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test ia64 != \"$host_cpu\"; then\n\t  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in\n\t  yes,aix,yes) ;;\t\t# shared object as lib.so file only\n\t  yes,svr4,*) ;;\t\t# shared object as lib.so archive member only\n\t  yes,*) enable_static=no ;;\t# shared object in lib.a archive as well\n\t  esac\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test yes = \"$enable_shared\" || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu\n    _LT_TAGVAR(LD, $1)=$LD\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\nfi # test yes != \"$_lt_disable_FC\"\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\nCFLAGS=$GCJFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=$LD\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_GO_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Go compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_GO_CONFIG],\n[AC_REQUIRE([LT_PROG_GO])dnl\nAC_LANG_SAVE\n\n# Source file extension for Go test sources.\nac_ext=go\n\n# Object file extension for compiled Go test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"package main; func main() { }\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='package main; func main() { }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GOC-\"gccgo\"}\nCFLAGS=$GOFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=$LD\n_LT_CC_BASENAME([$compiler])\n\n# Go did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GO_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to 'libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=$lt_simple_compile_test_code\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\nCFLAGS=\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test set = \"${GCJFLAGS+set}\" || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_GO\n# ----------\nAC_DEFUN([LT_PROG_GO],\n[AC_CHECK_TOOL(GOC, gccgo,)\n])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n# _LT_DECL_DLLTOOL\n# ----------------\n# Ensure DLLTOOL variable is set.\nm4_defun([_LT_DECL_DLLTOOL],\n[AC_CHECK_TOOL(DLLTOOL, dlltool, false)\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])\nAC_SUBST([DLLTOOL])\n])\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f \"$lt_ac_sed\" && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test 10 -lt \"$lt_ac_count\" && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test \"$lt_ac_count\" -gt \"$lt_ac_max\"; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PATH_CONVERSION_FUNCTIONS\n# -----------------------------\n# Determine what file name conversion functions should be used by\n# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed\n# for certain cross-compile configurations and native mingw.\nm4_defun([_LT_PATH_CONVERSION_FUNCTIONS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_MSG_CHECKING([how to convert $build file names to $host format])\nAC_CACHE_VAL(lt_cv_to_host_file_cmd,\n[case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n])\nto_host_file_cmd=$lt_cv_to_host_file_cmd\nAC_MSG_RESULT([$lt_cv_to_host_file_cmd])\n_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],\n         [0], [convert $build file names to $host format])dnl\n\nAC_MSG_CHECKING([how to convert $build file names to toolchain format])\nAC_CACHE_VAL(lt_cv_to_tool_file_cmd,\n[#assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n])\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\nAC_MSG_RESULT([$lt_cv_to_tool_file_cmd])\n_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],\n         [0], [convert $build files to toolchain format])dnl\n])# _LT_PATH_CONVERSION_FUNCTIONS\n"
  },
  {
    "path": "src/pcre/m4/ltoptions.m4",
    "content": "# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004-2005, 2007-2009, 2011-2018 Free Software\n#   Foundation, Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 8 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option '$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n\t\t   [_LT_ENABLE_FAST_INSTALL])\n  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],\n\t\t   [_LT_WITH_AIX_SONAME([aix])])\n  ])\n])# _LT_SET_OPTIONS\n\n\n## --------------------------------- ##\n## Macros to handle LT_INIT options. ##\n## --------------------------------- ##\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the 'dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [1], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the 'win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the 'shared' and\n# 'disable-shared' LT_INIT options.\n# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the 'static' and\n# 'disable-static' LT_INIT options.\n# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the 'fast-install'\n# and 'disable-fast-install' LT_INIT options.\n# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for pkg in $enableval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe 'fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe 'disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_AIX_SONAME([DEFAULT])\n# ----------------------------------\n# implement the --with-aix-soname flag, and support the `aix-soname=aix'\n# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT\n# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.\nm4_define([_LT_WITH_AIX_SONAME],\n[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl\nshared_archive_member_spec=\ncase $host,$enable_shared in\npower*-*-aix[[5-9]]*,yes)\n  AC_MSG_CHECKING([which variant of shared library versioning to provide])\n  AC_ARG_WITH([aix-soname],\n    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],\n      [shared library versioning (aka \"SONAME\") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],\n    [case $withval in\n    aix|svr4|both)\n      ;;\n    *)\n      AC_MSG_ERROR([Unknown argument to --with-aix-soname])\n      ;;\n    esac\n    lt_cv_with_aix_soname=$with_aix_soname],\n    [AC_CACHE_VAL([lt_cv_with_aix_soname],\n      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)\n    with_aix_soname=$lt_cv_with_aix_soname])\n  AC_MSG_RESULT([$with_aix_soname])\n  if test aix != \"$with_aix_soname\"; then\n    # For the AIX way of multilib, we name the shared archive member\n    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',\n    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.\n    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,\n    # the AIX toolchain works better with OBJECT_MODE set (default 32).\n    if test 64 = \"${OBJECT_MODE-32}\"; then\n      shared_archive_member_spec=shr_64\n    else\n      shared_archive_member_spec=shr\n    fi\n  fi\n  ;;\n*)\n  with_aix_soname=aix\n  ;;\nesac\n\n_LT_DECL([], [shared_archive_member_spec], [0],\n    [Shared archive member basename, for filename based shared library versioning on AIX])dnl\n])# _LT_WITH_AIX_SONAME\n\nLT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])\nLT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])\nLT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'\n# LT_INIT options.\n# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,\n      for lt_pkg in $withval; do\n\tIFS=$lt_save_ifs\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=$lt_save_ifs\n      ;;\n    esac],\n    [pic_mode=m4_default([$1], [default])])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the 'pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n## ----------------- ##\n## LTDL_INIT Options ##\n## ----------------- ##\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n"
  },
  {
    "path": "src/pcre/m4/ltsugar.m4",
    "content": "# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004-2005, 2007-2008, 2011-2018 Free Software\n# Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59, which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n"
  },
  {
    "path": "src/pcre/m4/ltversion.m4",
    "content": "# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2011-2018 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# @configure_input@\n\n# serial 4221 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.4.6.42-b88ce])\nm4_define([LT_PACKAGE_REVISION], [2.4.6.42])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.4.6.42-b88ce'\nmacro_revision='2.4.6.42'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n"
  },
  {
    "path": "src/pcre/m4/lt~obsolete.m4",
    "content": "# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004-2005, 2007, 2009, 2011-2018 Free Software\n#   Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 5 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.\n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\nm4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],\t[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])\nm4_ifndef([_LT_AC_PROG_CXXCPP],\t\t[AC_DEFUN([_LT_AC_PROG_CXXCPP])])\nm4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],\t[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])\nm4_ifndef([_LT_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_PROG_F77],\t\t[AC_DEFUN([_LT_PROG_F77])])\nm4_ifndef([_LT_PROG_FC],\t\t[AC_DEFUN([_LT_PROG_FC])])\nm4_ifndef([_LT_PROG_CXX],\t\t[AC_DEFUN([_LT_PROG_CXX])])\n"
  },
  {
    "path": "src/pcre/m4/pcre_visibility.m4",
    "content": "# visibility.m4 serial 4 (gettext-0.18.2)\ndnl Copyright (C) 2005, 2008, 2010-2011 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Bruno Haible.\n\ndnl Tests whether the compiler supports the command-line option\ndnl -fvisibility=hidden and the function and variable attributes\ndnl __attribute__((__visibility__(\"hidden\"))) and\ndnl __attribute__((__visibility__(\"default\"))).\ndnl Does *not* test for __visibility__(\"protected\") - which has tricky\ndnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on\ndnl MacOS X.\ndnl Does *not* test for __visibility__(\"internal\") - which has processor\ndnl dependent semantics.\ndnl Does *not* test for #pragma GCC visibility push(hidden) - which is\ndnl \"really only recommended for legacy code\".\ndnl Set the variable CFLAG_VISIBILITY.\ndnl Defines and sets the variable HAVE_VISIBILITY.\n\ndnl Modified to fit with PCRE build environment by Cristian Rodríguez.\n\nAC_DEFUN([PCRE_VISIBILITY],\n[\n  AC_REQUIRE([AC_PROG_CC])\n  VISIBILITY_CFLAGS=\n  VISIBILITY_CXXFLAGS=\n  HAVE_VISIBILITY=0\n  if test -n \"$GCC\"; then\n    dnl First, check whether -Werror can be added to the command line, or\n    dnl whether it leads to an error because of some other option that the\n    dnl user has put into $CC $CFLAGS $CPPFLAGS.\n    AC_MSG_CHECKING([whether the -Werror option is usable])\n    AC_CACHE_VAL([pcre_cv_cc_vis_werror], [\n      pcre_save_CFLAGS=\"$CFLAGS\"\n      CFLAGS=\"$CFLAGS -Werror\"\n      AC_COMPILE_IFELSE(\n        [AC_LANG_PROGRAM([[]], [[]])],\n        [pcre_cv_cc_vis_werror=yes],\n        [pcre_cv_cc_vis_werror=no])\n      CFLAGS=\"$pcre_save_CFLAGS\"])\n    AC_MSG_RESULT([$pcre_cv_cc_vis_werror])\n    dnl Now check whether visibility declarations are supported.\n    AC_MSG_CHECKING([for simple visibility declarations])\n    AC_CACHE_VAL([pcre_cv_cc_visibility], [\n      pcre_save_CFLAGS=\"$CFLAGS\"\n      CFLAGS=\"$CFLAGS -fvisibility=hidden\"\n      dnl We use the option -Werror and a function dummyfunc, because on some\n      dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning\n      dnl \"visibility attribute not supported in this configuration; ignored\"\n      dnl at the first function definition in every compilation unit, and we\n      dnl don't want to use the option in this case.\n      if test $pcre_cv_cc_vis_werror = yes; then\n        CFLAGS=\"$CFLAGS -Werror\"\n      fi\n      AC_COMPILE_IFELSE(\n        [AC_LANG_PROGRAM(\n           [[extern __attribute__((__visibility__(\"hidden\"))) int hiddenvar;\n             extern __attribute__((__visibility__(\"default\"))) int exportedvar;\n             extern __attribute__((__visibility__(\"hidden\"))) int hiddenfunc (void);\n             extern __attribute__((__visibility__(\"default\"))) int exportedfunc (void);\n             void dummyfunc (void) {}\n           ]],\n           [[]])],\n        [pcre_cv_cc_visibility=yes],\n        [pcre_cv_cc_visibility=no])\n      CFLAGS=\"$pcre_save_CFLAGS\"])\n    AC_MSG_RESULT([$pcre_cv_cc_visibility])\n    if test $pcre_cv_cc_visibility = yes; then\n      VISIBILITY_CFLAGS=\"-fvisibility=hidden\"\n      VISIBILITY_CXXFLAGS=\"-fvisibility=hidden -fvisibility-inlines-hidden\"\n      HAVE_VISIBILITY=1\n      AC_DEFINE(PCRE_EXP_DECL, [extern __attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCRE_EXP_DEFN, [__attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCRE_EXP_DATA_DEFN, [__attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCREPOSIX_EXP_DECL, [extern __attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCREPOSIX_EXP_DEFN, [extern __attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCRECPP_EXP_DECL, [extern __attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n      AC_DEFINE(PCRECPP_EXP_DEFN, [__attribute__ ((visibility (\"default\")))], [to make a symbol visible])\n    fi\n  fi\n  AC_SUBST([VISIBILITY_CFLAGS])\n  AC_SUBST([VISIBILITY_CXXFLAGS])\n  AC_SUBST([HAVE_VISIBILITY])\n  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],\n    [Define to 1 if the compiler supports simple visibility declarations.])\n])\n"
  },
  {
    "path": "src/pcre/makevp.bat",
    "content": ":: AH 20-12-06 modified for new PCRE-7.0 and VP/BCC\n:: PH 19-03-07 renamed !compile.txt and !linklib.txt as makevp-compile.txt and\n::             makevp-linklib.txt\n:: PH 26-03-07 re-renamed !compile.txt and !linklib.txt as makevp-c.txt and\n::             makevp-l.txt\n:: PH 29-03-07 hopefully the final rename to makevp_c and makevp_l\n:: AH 27.08.08 updated for new PCRE-7.7\n::             required PCRE.H and CONFIG.H will be generated if not existing\n\n@echo off\necho.\necho Compiling PCRE with BORLAND C++ for VIRTUAL PASCAL\necho.\n\nREM This file was contributed by Alexander Tokarev for building PCRE for use\nREM with Virtual Pascal. It has not been tested with the latest PCRE release.\n\nREM This file has been modified and extended to compile with newer PCRE releases\nREM by Stefan Weber (Angels Holocaust).\n\nREM CHANGE THIS FOR YOUR BORLAND C++ COMPILER PATH\nSET BORLAND=f:\\bcc\nREM location of the TASM binaries, if compiling with the -B BCC switch\nSET TASM=f:\\tasm\n\nSET PATH=%PATH%;%BORLAND%\\bin;%TASM%\\bin\nSET PCRE_VER=77\nSET COMPILE_DEFAULTS=-DHAVE_CONFIG_H -DPCRE_STATIC -I%BORLAND%\\include\n\ndel pcre%PCRE_VER%.lib >nul 2>nul\n\n:: sh configure\n\n:: check for needed header files\nif not exist pcre.h copy pcre.h.generic pcre.h\nif not exist config.h copy config.h.generic config.h\n\nbcc32 -DDFTABLES %COMPILE_DEFAULTS% -L%BORLAND%\\lib dftables.c\nIF ERRORLEVEL 1 GOTO ERROR\n\n:: dftables > chartables.c\ndftables pcre_chartables.c\n\nREM compile and link the PCRE library into lib: option -B for ASM compile works too\nbcc32 -a4 -c -RT- -y- -v- -u- -R- -Q- -X -d -fp -ff -P- -O2 -Oc -Ov -3 -w-8004 -w-8064 -w-8065 -w-8012 -UDFTABLES -DVPCOMPAT %COMPILE_DEFAULTS% @makevp_c.txt\nIF ERRORLEVEL 1 GOTO ERROR\n\ntlib %BORLAND%\\lib\\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset *memcmp *strlen\nIF ERRORLEVEL 1 GOTO ERROR\ntlib pcre%PCRE_VER%.lib @makevp_l.txt +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj +memcmp.obj +strlen.obj\nIF ERRORLEVEL 1 GOTO ERROR\n\ndel *.obj *.tds *.bak >nul 2>nul\n\necho ---\necho Now the library should be complete. Please check all messages above.\necho Don't care for warnings, it's OK.\ngoto END\n\n:ERROR\necho ---\necho Error while compiling PCRE. Aborting...\npause\ngoto END\n\n:END\n"
  },
  {
    "path": "src/pcre/makevp_c.txt",
    "content": "pcre_byte_order.c\r\npcre_chartables.c\r\npcre_compile.c\r\npcre_config.c\r\npcre_dfa_exec.c\r\npcre_exec.c\r\npcre_fullinfo.c\r\npcre_get.c\r\npcre_globals.c\r\npcre_jit_compile.c\r\npcre_maketables.c\r\npcre_newline.c\r\npcre_ord2utf8.c\r\npcre_refcount.c\r\npcre_string_utils.c\r\npcre_study.c\r\npcre_tables.c\r\npcre_ucd.c\r\npcre_valid_utf8.c\r\npcre_version.c\r\npcre_xclass.c\r\n"
  },
  {
    "path": "src/pcre/makevp_l.txt",
    "content": "+pcre_byte_order.obj        &\r\n+pcre_chartables.obj        &\r\n+pcre_compile.obj           &\r\n+pcre_config.obj\t    &\r\n+pcre_dfa_exec.obj          &\r\n+pcre_exec.obj\t\t    &\r\n+pcre_fullinfo.obj          &\r\n+pcre_get.obj\t\t    &\r\n+pcre_globals.obj           &\r\n+pcre_jit_compile.obj\t    &\r\n+pcre_maketables.obj        &\r\n+pcre_newline.obj           &\r\n+pcre_ord2utf8.obj          &\r\n+pcre_refcount.obj          &\r\n+pcre_string_utils.obj      &\r\n+pcre_study.obj\t\t    &\r\n+pcre_tables.obj\t    &\r\n+pcre_ucd.obj               &\r\n+pcre_valid_utf8.obj        &\r\n+pcre_version.obj           &\r\n+pcre_xclass.obj\r\n"
  },
  {
    "path": "src/pcre/missing",
    "content": "#! /bin/sh\n# Common wrapper for a few potentially missing GNU programs.\n\nscriptversion=2018-03-07.03; # UTC\n\n# Copyright (C) 1996-2018 Free Software Foundation, Inc.\n# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try '$0 --help' for more information\"\n  exit 1\nfi\n\ncase $1 in\n\n  --is-lightweight)\n    # Used by our autoconf macros to check whether the available missing\n    # script is modern enough.\n    exit 0\n    ;;\n\n  --run)\n    # Back-compat with the calling convention used by older automake.\n    shift\n    ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nRun 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due\nto PROGRAM being missing or too old.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n\nSupported PROGRAM values:\n  aclocal   autoconf  autoheader   autom4te  automake  makeinfo\n  bison     yacc      flex         lex       help2man\n\nVersion suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and\n'g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: unknown '$1' option\"\n    echo 1>&2 \"Try '$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# Run the given program, remember its exit status.\n\"$@\"; st=$?\n\n# If it succeeded, we are done.\ntest $st -eq 0 && exit 0\n\n# Also exit now if we it failed (or wasn't found), and '--version' was\n# passed; such an option is passed most likely to detect whether the\n# program is present and works.\ncase $2 in --version|--help) exit $st;; esac\n\n# Exit code 63 means version mismatch.  This often happens when the user\n# tries to use an ancient version of a tool on a file that requires a\n# minimum version.\nif test $st -eq 63; then\n  msg=\"probably too old\"\nelif test $st -eq 127; then\n  # Program was missing.\n  msg=\"missing on your system\"\nelse\n  # Program was found and executed, but failed.  Give up.\n  exit $st\nfi\n\nperl_URL=https://www.perl.org/\nflex_URL=https://github.com/westes/flex\ngnu_software_URL=https://www.gnu.org/software\n\nprogram_details ()\n{\n  case $1 in\n    aclocal|automake)\n      echo \"The '$1' program is part of the GNU Automake package:\"\n      echo \"<$gnu_software_URL/automake>\"\n      echo \"It also requires GNU Autoconf, GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/autoconf>\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n    autoconf|autom4te|autoheader)\n      echo \"The '$1' program is part of the GNU Autoconf package:\"\n      echo \"<$gnu_software_URL/autoconf/>\"\n      echo \"It also requires GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n  esac\n}\n\ngive_advice ()\n{\n  # Normalize program name to check for.\n  normalized_program=`echo \"$1\" | sed '\n    s/^gnu-//; t\n    s/^gnu//; t\n    s/^g//; t'`\n\n  printf '%s\\n' \"'$1' is $msg.\"\n\n  configure_deps=\"'configure.ac' or m4 files included by 'configure.ac'\"\n  case $normalized_program in\n    autoconf*)\n      echo \"You should only need it if you modified 'configure.ac',\"\n      echo \"or m4 files included by it.\"\n      program_details 'autoconf'\n      ;;\n    autoheader*)\n      echo \"You should only need it if you modified 'acconfig.h' or\"\n      echo \"$configure_deps.\"\n      program_details 'autoheader'\n      ;;\n    automake*)\n      echo \"You should only need it if you modified 'Makefile.am' or\"\n      echo \"$configure_deps.\"\n      program_details 'automake'\n      ;;\n    aclocal*)\n      echo \"You should only need it if you modified 'acinclude.m4' or\"\n      echo \"$configure_deps.\"\n      program_details 'aclocal'\n      ;;\n   autom4te*)\n      echo \"You might have modified some maintainer files that require\"\n      echo \"the 'autom4te' program to be rebuilt.\"\n      program_details 'autom4te'\n      ;;\n    bison*|yacc*)\n      echo \"You should only need it if you modified a '.y' file.\"\n      echo \"You may want to install the GNU Bison package:\"\n      echo \"<$gnu_software_URL/bison/>\"\n      ;;\n    lex*|flex*)\n      echo \"You should only need it if you modified a '.l' file.\"\n      echo \"You may want to install the Fast Lexical Analyzer package:\"\n      echo \"<$flex_URL>\"\n      ;;\n    help2man*)\n      echo \"You should only need it if you modified a dependency\" \\\n           \"of a man page.\"\n      echo \"You may want to install the GNU Help2man package:\"\n      echo \"<$gnu_software_URL/help2man/>\"\n    ;;\n    makeinfo*)\n      echo \"You should only need it if you modified a '.texi' file, or\"\n      echo \"any other file indirectly affecting the aspect of the manual.\"\n      echo \"You might want to install the Texinfo package:\"\n      echo \"<$gnu_software_URL/texinfo/>\"\n      echo \"The spurious makeinfo call might also be the consequence of\"\n      echo \"using a buggy 'make' (AIX, DU, IRIX), in which case you might\"\n      echo \"want to install GNU make:\"\n      echo \"<$gnu_software_URL/make/>\"\n      ;;\n    *)\n      echo \"You might have modified some files without having the proper\"\n      echo \"tools for further handling them.  Check the 'README' file, it\"\n      echo \"often tells you about the needed prerequisites for installing\"\n      echo \"this package.  You may also peek at any GNU archive site, in\"\n      echo \"case some other package contains this missing '$1' program.\"\n      ;;\n  esac\n}\n\ngive_advice \"$1\" | sed -e '1s/^/WARNING: /' \\\n                       -e '2,$s/^/         /' >&2\n\n# Propagate the correct exit status (expected to be 127 for a program\n# not found, 63 for a program that failed due to version mismatch).\nexit $st\n\n# Local variables:\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/pcre/pcre-config.in",
    "content": "#!/bin/sh\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nexec_prefix_set=no\n\ncflags=\"[--cflags]\"\n\nif test @enable_cpp@ = yes ; then\n  libs=\"[--libs-cpp]\"\nelse\n  libs=\nfi\n\nif test @enable_pcre16@ = yes ; then\n  libs=\"[--libs16] $libs\"\nfi\n\nif test @enable_pcre32@ = yes ; then\n  libs=\"[--libs32] $libs\"\nfi\n\nif test @enable_pcre8@ = yes ; then\n  libs=\"[--libs] [--libs-posix] $libs\"\n  cflags=\"$cflags [--cflags-posix]\"\nfi\n\nusage=\"Usage: pcre-config [--prefix] [--exec-prefix] [--version] $libs $cflags\"\n\nif test $# -eq 0; then\n      echo \"${usage}\" 1>&2\n      exit 1\nfi\n\nlibR=\ncase `uname -s` in\n  *SunOS*)\n  libR=\" -R@libdir@\"\n  ;;\n  *BSD*)\n  libR=\" -Wl,-R@libdir@\"\n  ;;\nesac\n\nlibS=\nif test @libdir@ != /usr/lib ; then\n  libS=-L@libdir@\nfi\n\nwhile test $# -gt 0; do\n  case \"$1\" in\n  -*=*) optarg=`echo \"$1\" | sed 's/[-_a-zA-Z0-9]*=//'` ;;\n  *) optarg= ;;\n  esac\n\n  case $1 in\n    --prefix=*)\n      prefix=$optarg\n      if test $exec_prefix_set = no ; then\n        exec_prefix=$optarg\n      fi\n      ;;\n    --prefix)\n      echo $prefix\n      ;;\n    --exec-prefix=*)\n      exec_prefix=$optarg\n      exec_prefix_set=yes\n      ;;\n    --exec-prefix)\n      echo $exec_prefix\n      ;;\n    --version)\n      echo @PACKAGE_VERSION@\n      ;;\n    --cflags)\n      if test @includedir@ != /usr/include ; then\n        includes=-I@includedir@\n      fi\n      echo $includes @PCRE_STATIC_CFLAG@\n      ;;\n    --cflags-posix)\n      if test @enable_pcre8@ = yes ; then\n        if test @includedir@ != /usr/include ; then\n          includes=-I@includedir@\n        fi\n        echo $includes @PCRE_STATIC_CFLAG@\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    --libs-posix)\n      if test @enable_pcre8@ = yes ; then\n        echo $libS$libR -lpcreposix -lpcre\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    --libs)\n      if test @enable_pcre8@ = yes ; then\n        echo $libS$libR -lpcre\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    --libs16)\n      if test @enable_pcre16@ = yes ; then\n        echo $libS$libR -lpcre16\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    --libs32)\n      if test @enable_pcre32@ = yes ; then\n        echo $libS$libR -lpcre32\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    --libs-cpp)\n      if test @enable_cpp@ = yes ; then\n        echo $libS$libR -lpcrecpp -lpcre\n      else\n        echo \"${usage}\" 1>&2\n      fi\n      ;;\n    *)\n      echo \"${usage}\" 1>&2\n      exit 1\n      ;;\n  esac\n  shift\ndone\n"
  },
  {
    "path": "src/pcre/pcre.h.generic",
    "content": "/*************************************************\n*       Perl-Compatible Regular Expressions      *\n*************************************************/\n\n/* This is the public header file for the PCRE library, to be #included by\napplications that call the PCRE functions.\n\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifndef _PCRE_H\n#define _PCRE_H\n\n/* The current PCRE version information. */\n\n#define PCRE_MAJOR          8\n#define PCRE_MINOR          43\n#define PCRE_PRERELEASE     \n#define PCRE_DATE           2019-02-23\n\n/* When an application links to a PCRE DLL in Windows, the symbols that are\nimported have to be identified as such. When building PCRE, the appropriate\nexport setting is defined in pcre_internal.h, which includes this file. So we\ndon't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */\n\n#if defined(_WIN32) && !defined(PCRE_STATIC)\n#  ifndef PCRE_EXP_DECL\n#    define PCRE_EXP_DECL  extern __declspec(dllimport)\n#  endif\n#  ifdef __cplusplus\n#    ifndef PCRECPP_EXP_DECL\n#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)\n#    endif\n#    ifndef PCRECPP_EXP_DEFN\n#      define PCRECPP_EXP_DEFN  __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n/* By default, we use the standard \"extern\" declarations. */\n\n#ifndef PCRE_EXP_DECL\n#  ifdef __cplusplus\n#    define PCRE_EXP_DECL  extern \"C\"\n#  else\n#    define PCRE_EXP_DECL  extern\n#  endif\n#endif\n\n#ifdef __cplusplus\n#  ifndef PCRECPP_EXP_DECL\n#    define PCRECPP_EXP_DECL  extern\n#  endif\n#  ifndef PCRECPP_EXP_DEFN\n#    define PCRECPP_EXP_DEFN\n#  endif\n#endif\n\n/* Have to include stdlib.h in order to ensure that size_t is defined;\nit is needed here for malloc. */\n\n#include <stdlib.h>\n\n/* Allow for C++ users */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Public options. Some are compile-time only, some are run-time only, and some\nare both. Most of the compile-time options are saved with the compiled regex so\nthat they can be inspected during studying (and therefore JIT compiling). Note\nthat pcre_study() has its own set of options. Originally, all the options\ndefined here used distinct bits. However, almost all the bits in a 32-bit word\nare now used, so in order to conserve them, option bits that were previously\nonly recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may\nalso be used for compile-time options that affect only compiling and are not\nrelevant for studying or JIT compiling.\n\nSome options for pcre_compile() change its behaviour but do not affect the\nbehaviour of the execution functions. Other options are passed through to the\nexecution functions and affect their behaviour, with or without affecting the\nbehaviour of pcre_compile().\n\nOptions that can be passed to pcre_compile() are tagged Cx below, with these\nvariants:\n\nC1   Affects compile only\nC2   Does not affect compile; affects exec, dfa_exec\nC3   Affects compile, exec, dfa_exec\nC4   Affects compile, exec, dfa_exec, study\nC5   Affects compile, exec, study\n\nOptions that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with\nE and D, respectively. They take precedence over C3, C4, and C5 settings passed\nfrom pcre_compile(). Those that are compatible with JIT execution are flagged\nwith J. */\n\n#define PCRE_CASELESS           0x00000001  /* C1       */\n#define PCRE_MULTILINE          0x00000002  /* C1       */\n#define PCRE_DOTALL             0x00000004  /* C1       */\n#define PCRE_EXTENDED           0x00000008  /* C1       */\n#define PCRE_ANCHORED           0x00000010  /* C4 E D   */\n#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */\n#define PCRE_EXTRA              0x00000040  /* C1       */\n#define PCRE_NOTBOL             0x00000080  /*    E D J */\n#define PCRE_NOTEOL             0x00000100  /*    E D J */\n#define PCRE_UNGREEDY           0x00000200  /* C1       */\n#define PCRE_NOTEMPTY           0x00000400  /*    E D J */\n#define PCRE_UTF8               0x00000800  /* C4        )          */\n#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */\n#define PCRE_UTF32              0x00000800  /* C4        )          */\n#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */\n#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */\n#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */\n#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */\n#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */\n#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */\n#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */\n\n/* This pair use the same bit. */\n#define PCRE_NEVER_UTF          0x00010000  /* C1        ) Overlaid */\n#define PCRE_DFA_SHORTEST       0x00010000  /*      D    ) Overlaid */\n\n/* This pair use the same bit. */\n#define PCRE_NO_AUTO_POSSESS    0x00020000  /* C1        ) Overlaid */\n#define PCRE_DFA_RESTART        0x00020000  /*      D    ) Overlaid */\n\n#define PCRE_FIRSTLINE          0x00040000  /* C3       */\n#define PCRE_DUPNAMES           0x00080000  /* C1       */\n#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */\n#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */\n#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */\n#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */\n#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */\n#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */\n#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */\n#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */\n#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */\n#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */\n#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */\n#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */\n#define PCRE_UCP                0x20000000  /* C3       */\n\n/* Exec-time and get/set-time error codes */\n\n#define PCRE_ERROR_NOMATCH          (-1)\n#define PCRE_ERROR_NULL             (-2)\n#define PCRE_ERROR_BADOPTION        (-3)\n#define PCRE_ERROR_BADMAGIC         (-4)\n#define PCRE_ERROR_UNKNOWN_OPCODE   (-5)\n#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */\n#define PCRE_ERROR_NOMEMORY         (-6)\n#define PCRE_ERROR_NOSUBSTRING      (-7)\n#define PCRE_ERROR_MATCHLIMIT       (-8)\n#define PCRE_ERROR_CALLOUT          (-9)  /* Never used by PCRE itself */\n#define PCRE_ERROR_BADUTF8         (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_PARTIAL         (-12)\n#define PCRE_ERROR_BADPARTIAL      (-13)\n#define PCRE_ERROR_INTERNAL        (-14)\n#define PCRE_ERROR_BADCOUNT        (-15)\n#define PCRE_ERROR_DFA_UITEM       (-16)\n#define PCRE_ERROR_DFA_UCOND       (-17)\n#define PCRE_ERROR_DFA_UMLIMIT     (-18)\n#define PCRE_ERROR_DFA_WSSIZE      (-19)\n#define PCRE_ERROR_DFA_RECURSE     (-20)\n#define PCRE_ERROR_RECURSIONLIMIT  (-21)\n#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */\n#define PCRE_ERROR_BADNEWLINE      (-23)\n#define PCRE_ERROR_BADOFFSET       (-24)\n#define PCRE_ERROR_SHORTUTF8       (-25)\n#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */\n#define PCRE_ERROR_RECURSELOOP     (-26)\n#define PCRE_ERROR_JIT_STACKLIMIT  (-27)\n#define PCRE_ERROR_BADMODE         (-28)\n#define PCRE_ERROR_BADENDIANNESS   (-29)\n#define PCRE_ERROR_DFA_BADRESTART  (-30)\n#define PCRE_ERROR_JIT_BADOPTION   (-31)\n#define PCRE_ERROR_BADLENGTH       (-32)\n#define PCRE_ERROR_UNSET           (-33)\n\n/* Specific error codes for UTF-8 validity checks */\n\n#define PCRE_UTF8_ERR0               0\n#define PCRE_UTF8_ERR1               1\n#define PCRE_UTF8_ERR2               2\n#define PCRE_UTF8_ERR3               3\n#define PCRE_UTF8_ERR4               4\n#define PCRE_UTF8_ERR5               5\n#define PCRE_UTF8_ERR6               6\n#define PCRE_UTF8_ERR7               7\n#define PCRE_UTF8_ERR8               8\n#define PCRE_UTF8_ERR9               9\n#define PCRE_UTF8_ERR10             10\n#define PCRE_UTF8_ERR11             11\n#define PCRE_UTF8_ERR12             12\n#define PCRE_UTF8_ERR13             13\n#define PCRE_UTF8_ERR14             14\n#define PCRE_UTF8_ERR15             15\n#define PCRE_UTF8_ERR16             16\n#define PCRE_UTF8_ERR17             17\n#define PCRE_UTF8_ERR18             18\n#define PCRE_UTF8_ERR19             19\n#define PCRE_UTF8_ERR20             20\n#define PCRE_UTF8_ERR21             21\n#define PCRE_UTF8_ERR22             22  /* Unused (was non-character) */\n\n/* Specific error codes for UTF-16 validity checks */\n\n#define PCRE_UTF16_ERR0              0\n#define PCRE_UTF16_ERR1              1\n#define PCRE_UTF16_ERR2              2\n#define PCRE_UTF16_ERR3              3\n#define PCRE_UTF16_ERR4              4  /* Unused (was non-character) */\n\n/* Specific error codes for UTF-32 validity checks */\n\n#define PCRE_UTF32_ERR0              0\n#define PCRE_UTF32_ERR1              1\n#define PCRE_UTF32_ERR2              2  /* Unused (was non-character) */\n#define PCRE_UTF32_ERR3              3\n\n/* Request types for pcre_fullinfo() */\n\n#define PCRE_INFO_OPTIONS            0\n#define PCRE_INFO_SIZE               1\n#define PCRE_INFO_CAPTURECOUNT       2\n#define PCRE_INFO_BACKREFMAX         3\n#define PCRE_INFO_FIRSTBYTE          4\n#define PCRE_INFO_FIRSTCHAR          4  /* For backwards compatibility */\n#define PCRE_INFO_FIRSTTABLE         5\n#define PCRE_INFO_LASTLITERAL        6\n#define PCRE_INFO_NAMEENTRYSIZE      7\n#define PCRE_INFO_NAMECOUNT          8\n#define PCRE_INFO_NAMETABLE          9\n#define PCRE_INFO_STUDYSIZE         10\n#define PCRE_INFO_DEFAULT_TABLES    11\n#define PCRE_INFO_OKPARTIAL         12\n#define PCRE_INFO_JCHANGED          13\n#define PCRE_INFO_HASCRORLF         14\n#define PCRE_INFO_MINLENGTH         15\n#define PCRE_INFO_JIT               16\n#define PCRE_INFO_JITSIZE           17\n#define PCRE_INFO_MAXLOOKBEHIND     18\n#define PCRE_INFO_FIRSTCHARACTER    19\n#define PCRE_INFO_FIRSTCHARACTERFLAGS 20\n#define PCRE_INFO_REQUIREDCHAR      21\n#define PCRE_INFO_REQUIREDCHARFLAGS 22\n#define PCRE_INFO_MATCHLIMIT        23\n#define PCRE_INFO_RECURSIONLIMIT    24\n#define PCRE_INFO_MATCH_EMPTY       25\n\n/* Request types for pcre_config(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_CONFIG_UTF8                    0\n#define PCRE_CONFIG_NEWLINE                 1\n#define PCRE_CONFIG_LINK_SIZE               2\n#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD  3\n#define PCRE_CONFIG_MATCH_LIMIT             4\n#define PCRE_CONFIG_STACKRECURSE            5\n#define PCRE_CONFIG_UNICODE_PROPERTIES      6\n#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7\n#define PCRE_CONFIG_BSR                     8\n#define PCRE_CONFIG_JIT                     9\n#define PCRE_CONFIG_UTF16                  10\n#define PCRE_CONFIG_JITTARGET              11\n#define PCRE_CONFIG_UTF32                  12\n#define PCRE_CONFIG_PARENS_LIMIT           13\n\n/* Request types for pcre_study(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_STUDY_JIT_COMPILE                0x0001\n#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002\n#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004\n#define PCRE_STUDY_EXTRA_NEEDED               0x0008\n\n/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine\nthese bits, just add new ones on the end, in order to remain compatible. */\n\n#define PCRE_EXTRA_STUDY_DATA             0x0001\n#define PCRE_EXTRA_MATCH_LIMIT            0x0002\n#define PCRE_EXTRA_CALLOUT_DATA           0x0004\n#define PCRE_EXTRA_TABLES                 0x0008\n#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010\n#define PCRE_EXTRA_MARK                   0x0020\n#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040\n\n/* Types */\n\nstruct real_pcre8_or_16;          /* declaration; the definition is private  */\ntypedef struct real_pcre8_or_16 pcre;\n\nstruct real_pcre8_or_16;          /* declaration; the definition is private  */\ntypedef struct real_pcre8_or_16 pcre16;\n\nstruct real_pcre32;               /* declaration; the definition is private  */\ntypedef struct real_pcre32 pcre32;\n\nstruct real_pcre_jit_stack;       /* declaration; the definition is private  */\ntypedef struct real_pcre_jit_stack pcre_jit_stack;\n\nstruct real_pcre16_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre16_jit_stack pcre16_jit_stack;\n\nstruct real_pcre32_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre32_jit_stack pcre32_jit_stack;\n\n/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain\na 16 bit wide signed data type. Otherwise it can be a dummy data type since\npcre16 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR16\n#define PCRE_UCHAR16 unsigned short\n#endif\n\n#ifndef PCRE_SPTR16\n#define PCRE_SPTR16 const PCRE_UCHAR16 *\n#endif\n\n/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain\na 32 bit wide signed data type. Otherwise it can be a dummy data type since\npcre32 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR32\n#define PCRE_UCHAR32 unsigned int\n#endif\n\n#ifndef PCRE_SPTR32\n#define PCRE_SPTR32 const PCRE_UCHAR32 *\n#endif\n\n/* When PCRE is compiled as a C++ library, the subject pointer type can be\nreplaced with a custom type. For conventional use, the public interface is a\nconst char *. */\n\n#ifndef PCRE_SPTR\n#define PCRE_SPTR const char *\n#endif\n\n/* The structure for passing additional data to pcre_exec(). This is defined in\nsuch as way as to be extensible. Always add new fields at the end, in order to\nremain compatible. */\n\ntypedef struct pcre_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  unsigned char **mark;           /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre_extra;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre16_extra;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre32_extra;\n\n/* The structure for passing out data via the pcre_callout_function. We use a\nstructure so that new fields can be added on the end in future versions,\nwithout changing the API of the function, thereby allowing old clients to work\nwithout modification. */\n\ntypedef struct pcre_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR    subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const unsigned char *mark;      /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre_callout_block;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR16  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre16_callout_block;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR32  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre32_callout_block;\n\n/* Indirection for store get and free functions. These can be set to\nalternative malloc/free functions if required. Special ones are used in the\nnon-recursive case for \"frames\". There is also an optional callout function\nthat is triggered by the (?) regex item. For Virtual Pascal, these definitions\nhave to take another form. */\n\n#ifndef VPCOMPAT\nPCRE_EXP_DECL void *(*pcre_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_free)(void *);\nPCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);\nPCRE_EXP_DECL int   (*pcre_stack_guard)(void);\n\nPCRE_EXP_DECL void *(*pcre16_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_free)(void *);\nPCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);\nPCRE_EXP_DECL int   (*pcre16_stack_guard)(void);\n\nPCRE_EXP_DECL void *(*pcre32_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_free)(void *);\nPCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);\nPCRE_EXP_DECL int   (*pcre32_stack_guard)(void);\n#else   /* VPCOMPAT */\nPCRE_EXP_DECL void *pcre_malloc(size_t);\nPCRE_EXP_DECL void  pcre_free(void *);\nPCRE_EXP_DECL void *pcre_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre_stack_free(void *);\nPCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);\nPCRE_EXP_DECL int   pcre_stack_guard(void);\n\nPCRE_EXP_DECL void *pcre16_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_free(void *);\nPCRE_EXP_DECL void *pcre16_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_stack_free(void *);\nPCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);\nPCRE_EXP_DECL int   pcre16_stack_guard(void);\n\nPCRE_EXP_DECL void *pcre32_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_free(void *);\nPCRE_EXP_DECL void *pcre32_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_stack_free(void *);\nPCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);\nPCRE_EXP_DECL int   pcre32_stack_guard(void);\n#endif  /* VPCOMPAT */\n\n/* User defined callback which provides a stack just before the match starts. */\n\ntypedef pcre_jit_stack *(*pcre_jit_callback)(void *);\ntypedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);\ntypedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);\n\n/* Exported PCRE functions */\n\nPCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL int  pcre_config(int, void *);\nPCRE_EXP_DECL int  pcre16_config(int, void *);\nPCRE_EXP_DECL int  pcre32_config(int, void *);\nPCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,\n                  int *, int, const char *, char *, int);\nPCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,\n                  char *, int);\nPCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,\n                  const char *, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,\n                  PCRE_SPTR16, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,\n                  PCRE_SPTR32, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,\n                   int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,\n                   PCRE_SPTR, int, int, int, int *, int,\n                   pcre_jit_stack *);\nPCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int,\n                   pcre16_jit_stack *);\nPCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int,\n                   pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_free_substring(const char *);\nPCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);\nPCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);\nPCRE_EXP_DECL void pcre_free_substring_list(const char **);\nPCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);\nPCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,\n                  int *, int, const char *, const char **);\nPCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);\nPCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);\nPCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);\nPCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,\n                  char **, char **);\nPCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,\n                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);\nPCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,\n                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);\nPCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,\n                  const char **);\nPCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,\n                  const char ***);\nPCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,\n                  PCRE_SPTR16 **);\nPCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,\n                  PCRE_SPTR32 **);\nPCRE_EXP_DECL const unsigned char *pcre_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre16_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre32_maketables(void);\nPCRE_EXP_DECL int  pcre_refcount(pcre *, int);\nPCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);\nPCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);\nPCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);\nPCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);\nPCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);\nPCRE_EXP_DECL void pcre_free_study(pcre_extra *);\nPCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);\nPCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);\nPCRE_EXP_DECL const char *pcre_version(void);\nPCRE_EXP_DECL const char *pcre16_version(void);\nPCRE_EXP_DECL const char *pcre32_version(void);\n\n/* Utility functions for byte order swaps. */\nPCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,\n                  PCRE_SPTR16, int, int *, int);\nPCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,\n                  PCRE_SPTR32, int, int *, int);\n\n/* JIT compiler related functions. */\n\nPCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);\nPCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);\nPCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);\nPCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,\n                  pcre_jit_callback, void *);\nPCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,\n                  pcre16_jit_callback, void *);\nPCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,\n                  pcre32_jit_callback, void *);\nPCRE_EXP_DECL void pcre_jit_free_unused_memory(void);\nPCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);\nPCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);\n\n#ifdef __cplusplus\n}  /* extern \"C\" */\n#endif\n\n#endif /* End of pcre.h */\n"
  },
  {
    "path": "src/pcre/pcre.h.in",
    "content": "/*************************************************\n*       Perl-Compatible Regular Expressions      *\n*************************************************/\n\n/* This is the public header file for the PCRE library, to be #included by\napplications that call the PCRE functions.\n\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifndef _PCRE_H\n#define _PCRE_H\n\n/* The current PCRE version information. */\n\n#define PCRE_MAJOR          @PCRE_MAJOR@\n#define PCRE_MINOR          @PCRE_MINOR@\n#define PCRE_PRERELEASE     @PCRE_PRERELEASE@\n#define PCRE_DATE           @PCRE_DATE@\n\n/* When an application links to a PCRE DLL in Windows, the symbols that are\nimported have to be identified as such. When building PCRE, the appropriate\nexport setting is defined in pcre_internal.h, which includes this file. So we\ndon't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */\n\n#if defined(_WIN32) && !defined(PCRE_STATIC)\n#  ifndef PCRE_EXP_DECL\n#    define PCRE_EXP_DECL  extern __declspec(dllimport)\n#  endif\n#  ifdef __cplusplus\n#    ifndef PCRECPP_EXP_DECL\n#      define PCRECPP_EXP_DECL  extern __declspec(dllimport)\n#    endif\n#    ifndef PCRECPP_EXP_DEFN\n#      define PCRECPP_EXP_DEFN  __declspec(dllimport)\n#    endif\n#  endif\n#endif\n\n/* By default, we use the standard \"extern\" declarations. */\n\n#ifndef PCRE_EXP_DECL\n#  ifdef __cplusplus\n#    define PCRE_EXP_DECL  extern \"C\"\n#  else\n#    define PCRE_EXP_DECL  extern\n#  endif\n#endif\n\n#ifdef __cplusplus\n#  ifndef PCRECPP_EXP_DECL\n#    define PCRECPP_EXP_DECL  extern\n#  endif\n#  ifndef PCRECPP_EXP_DEFN\n#    define PCRECPP_EXP_DEFN\n#  endif\n#endif\n\n/* Have to include stdlib.h in order to ensure that size_t is defined;\nit is needed here for malloc. */\n\n#include <stdlib.h>\n\n/* Allow for C++ users */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Public options. Some are compile-time only, some are run-time only, and some\nare both. Most of the compile-time options are saved with the compiled regex so\nthat they can be inspected during studying (and therefore JIT compiling). Note\nthat pcre_study() has its own set of options. Originally, all the options\ndefined here used distinct bits. However, almost all the bits in a 32-bit word\nare now used, so in order to conserve them, option bits that were previously\nonly recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may\nalso be used for compile-time options that affect only compiling and are not\nrelevant for studying or JIT compiling.\n\nSome options for pcre_compile() change its behaviour but do not affect the\nbehaviour of the execution functions. Other options are passed through to the\nexecution functions and affect their behaviour, with or without affecting the\nbehaviour of pcre_compile().\n\nOptions that can be passed to pcre_compile() are tagged Cx below, with these\nvariants:\n\nC1   Affects compile only\nC2   Does not affect compile; affects exec, dfa_exec\nC3   Affects compile, exec, dfa_exec\nC4   Affects compile, exec, dfa_exec, study\nC5   Affects compile, exec, study\n\nOptions that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with\nE and D, respectively. They take precedence over C3, C4, and C5 settings passed\nfrom pcre_compile(). Those that are compatible with JIT execution are flagged\nwith J. */\n\n#define PCRE_CASELESS           0x00000001  /* C1       */\n#define PCRE_MULTILINE          0x00000002  /* C1       */\n#define PCRE_DOTALL             0x00000004  /* C1       */\n#define PCRE_EXTENDED           0x00000008  /* C1       */\n#define PCRE_ANCHORED           0x00000010  /* C4 E D   */\n#define PCRE_DOLLAR_ENDONLY     0x00000020  /* C2       */\n#define PCRE_EXTRA              0x00000040  /* C1       */\n#define PCRE_NOTBOL             0x00000080  /*    E D J */\n#define PCRE_NOTEOL             0x00000100  /*    E D J */\n#define PCRE_UNGREEDY           0x00000200  /* C1       */\n#define PCRE_NOTEMPTY           0x00000400  /*    E D J */\n#define PCRE_UTF8               0x00000800  /* C4        )          */\n#define PCRE_UTF16              0x00000800  /* C4        ) Synonyms */\n#define PCRE_UTF32              0x00000800  /* C4        )          */\n#define PCRE_NO_AUTO_CAPTURE    0x00001000  /* C1       */\n#define PCRE_NO_UTF8_CHECK      0x00002000  /* C1 E D J  )          */\n#define PCRE_NO_UTF16_CHECK     0x00002000  /* C1 E D J  ) Synonyms */\n#define PCRE_NO_UTF32_CHECK     0x00002000  /* C1 E D J  )          */\n#define PCRE_AUTO_CALLOUT       0x00004000  /* C1       */\n#define PCRE_PARTIAL_SOFT       0x00008000  /*    E D J  ) Synonyms */\n#define PCRE_PARTIAL            0x00008000  /*    E D J  )          */\n\n/* This pair use the same bit. */\n#define PCRE_NEVER_UTF          0x00010000  /* C1        ) Overlaid */\n#define PCRE_DFA_SHORTEST       0x00010000  /*      D    ) Overlaid */\n\n/* This pair use the same bit. */\n#define PCRE_NO_AUTO_POSSESS    0x00020000  /* C1        ) Overlaid */\n#define PCRE_DFA_RESTART        0x00020000  /*      D    ) Overlaid */\n\n#define PCRE_FIRSTLINE          0x00040000  /* C3       */\n#define PCRE_DUPNAMES           0x00080000  /* C1       */\n#define PCRE_NEWLINE_CR         0x00100000  /* C3 E D   */\n#define PCRE_NEWLINE_LF         0x00200000  /* C3 E D   */\n#define PCRE_NEWLINE_CRLF       0x00300000  /* C3 E D   */\n#define PCRE_NEWLINE_ANY        0x00400000  /* C3 E D   */\n#define PCRE_NEWLINE_ANYCRLF    0x00500000  /* C3 E D   */\n#define PCRE_BSR_ANYCRLF        0x00800000  /* C3 E D   */\n#define PCRE_BSR_UNICODE        0x01000000  /* C3 E D   */\n#define PCRE_JAVASCRIPT_COMPAT  0x02000000  /* C5       */\n#define PCRE_NO_START_OPTIMIZE  0x04000000  /* C2 E D    ) Synonyms */\n#define PCRE_NO_START_OPTIMISE  0x04000000  /* C2 E D    )          */\n#define PCRE_PARTIAL_HARD       0x08000000  /*    E D J */\n#define PCRE_NOTEMPTY_ATSTART   0x10000000  /*    E D J */\n#define PCRE_UCP                0x20000000  /* C3       */\n\n/* Exec-time and get/set-time error codes */\n\n#define PCRE_ERROR_NOMATCH          (-1)\n#define PCRE_ERROR_NULL             (-2)\n#define PCRE_ERROR_BADOPTION        (-3)\n#define PCRE_ERROR_BADMAGIC         (-4)\n#define PCRE_ERROR_UNKNOWN_OPCODE   (-5)\n#define PCRE_ERROR_UNKNOWN_NODE     (-5)  /* For backward compatibility */\n#define PCRE_ERROR_NOMEMORY         (-6)\n#define PCRE_ERROR_NOSUBSTRING      (-7)\n#define PCRE_ERROR_MATCHLIMIT       (-8)\n#define PCRE_ERROR_CALLOUT          (-9)  /* Never used by PCRE itself */\n#define PCRE_ERROR_BADUTF8         (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF16        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF32        (-10)  /* Same for 8/16/32 */\n#define PCRE_ERROR_BADUTF8_OFFSET  (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_BADUTF16_OFFSET (-11)  /* Same for 8/16 */\n#define PCRE_ERROR_PARTIAL         (-12)\n#define PCRE_ERROR_BADPARTIAL      (-13)\n#define PCRE_ERROR_INTERNAL        (-14)\n#define PCRE_ERROR_BADCOUNT        (-15)\n#define PCRE_ERROR_DFA_UITEM       (-16)\n#define PCRE_ERROR_DFA_UCOND       (-17)\n#define PCRE_ERROR_DFA_UMLIMIT     (-18)\n#define PCRE_ERROR_DFA_WSSIZE      (-19)\n#define PCRE_ERROR_DFA_RECURSE     (-20)\n#define PCRE_ERROR_RECURSIONLIMIT  (-21)\n#define PCRE_ERROR_NULLWSLIMIT     (-22)  /* No longer actually used */\n#define PCRE_ERROR_BADNEWLINE      (-23)\n#define PCRE_ERROR_BADOFFSET       (-24)\n#define PCRE_ERROR_SHORTUTF8       (-25)\n#define PCRE_ERROR_SHORTUTF16      (-25)  /* Same for 8/16 */\n#define PCRE_ERROR_RECURSELOOP     (-26)\n#define PCRE_ERROR_JIT_STACKLIMIT  (-27)\n#define PCRE_ERROR_BADMODE         (-28)\n#define PCRE_ERROR_BADENDIANNESS   (-29)\n#define PCRE_ERROR_DFA_BADRESTART  (-30)\n#define PCRE_ERROR_JIT_BADOPTION   (-31)\n#define PCRE_ERROR_BADLENGTH       (-32)\n#define PCRE_ERROR_UNSET           (-33)\n\n/* Specific error codes for UTF-8 validity checks */\n\n#define PCRE_UTF8_ERR0               0\n#define PCRE_UTF8_ERR1               1\n#define PCRE_UTF8_ERR2               2\n#define PCRE_UTF8_ERR3               3\n#define PCRE_UTF8_ERR4               4\n#define PCRE_UTF8_ERR5               5\n#define PCRE_UTF8_ERR6               6\n#define PCRE_UTF8_ERR7               7\n#define PCRE_UTF8_ERR8               8\n#define PCRE_UTF8_ERR9               9\n#define PCRE_UTF8_ERR10             10\n#define PCRE_UTF8_ERR11             11\n#define PCRE_UTF8_ERR12             12\n#define PCRE_UTF8_ERR13             13\n#define PCRE_UTF8_ERR14             14\n#define PCRE_UTF8_ERR15             15\n#define PCRE_UTF8_ERR16             16\n#define PCRE_UTF8_ERR17             17\n#define PCRE_UTF8_ERR18             18\n#define PCRE_UTF8_ERR19             19\n#define PCRE_UTF8_ERR20             20\n#define PCRE_UTF8_ERR21             21\n#define PCRE_UTF8_ERR22             22  /* Unused (was non-character) */\n\n/* Specific error codes for UTF-16 validity checks */\n\n#define PCRE_UTF16_ERR0              0\n#define PCRE_UTF16_ERR1              1\n#define PCRE_UTF16_ERR2              2\n#define PCRE_UTF16_ERR3              3\n#define PCRE_UTF16_ERR4              4  /* Unused (was non-character) */\n\n/* Specific error codes for UTF-32 validity checks */\n\n#define PCRE_UTF32_ERR0              0\n#define PCRE_UTF32_ERR1              1\n#define PCRE_UTF32_ERR2              2  /* Unused (was non-character) */\n#define PCRE_UTF32_ERR3              3\n\n/* Request types for pcre_fullinfo() */\n\n#define PCRE_INFO_OPTIONS            0\n#define PCRE_INFO_SIZE               1\n#define PCRE_INFO_CAPTURECOUNT       2\n#define PCRE_INFO_BACKREFMAX         3\n#define PCRE_INFO_FIRSTBYTE          4\n#define PCRE_INFO_FIRSTCHAR          4  /* For backwards compatibility */\n#define PCRE_INFO_FIRSTTABLE         5\n#define PCRE_INFO_LASTLITERAL        6\n#define PCRE_INFO_NAMEENTRYSIZE      7\n#define PCRE_INFO_NAMECOUNT          8\n#define PCRE_INFO_NAMETABLE          9\n#define PCRE_INFO_STUDYSIZE         10\n#define PCRE_INFO_DEFAULT_TABLES    11\n#define PCRE_INFO_OKPARTIAL         12\n#define PCRE_INFO_JCHANGED          13\n#define PCRE_INFO_HASCRORLF         14\n#define PCRE_INFO_MINLENGTH         15\n#define PCRE_INFO_JIT               16\n#define PCRE_INFO_JITSIZE           17\n#define PCRE_INFO_MAXLOOKBEHIND     18\n#define PCRE_INFO_FIRSTCHARACTER    19\n#define PCRE_INFO_FIRSTCHARACTERFLAGS 20\n#define PCRE_INFO_REQUIREDCHAR      21\n#define PCRE_INFO_REQUIREDCHARFLAGS 22\n#define PCRE_INFO_MATCHLIMIT        23\n#define PCRE_INFO_RECURSIONLIMIT    24\n#define PCRE_INFO_MATCH_EMPTY       25\n\n/* Request types for pcre_config(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_CONFIG_UTF8                    0\n#define PCRE_CONFIG_NEWLINE                 1\n#define PCRE_CONFIG_LINK_SIZE               2\n#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD  3\n#define PCRE_CONFIG_MATCH_LIMIT             4\n#define PCRE_CONFIG_STACKRECURSE            5\n#define PCRE_CONFIG_UNICODE_PROPERTIES      6\n#define PCRE_CONFIG_MATCH_LIMIT_RECURSION   7\n#define PCRE_CONFIG_BSR                     8\n#define PCRE_CONFIG_JIT                     9\n#define PCRE_CONFIG_UTF16                  10\n#define PCRE_CONFIG_JITTARGET              11\n#define PCRE_CONFIG_UTF32                  12\n#define PCRE_CONFIG_PARENS_LIMIT           13\n\n/* Request types for pcre_study(). Do not re-arrange, in order to remain\ncompatible. */\n\n#define PCRE_STUDY_JIT_COMPILE                0x0001\n#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE   0x0002\n#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE   0x0004\n#define PCRE_STUDY_EXTRA_NEEDED               0x0008\n\n/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine\nthese bits, just add new ones on the end, in order to remain compatible. */\n\n#define PCRE_EXTRA_STUDY_DATA             0x0001\n#define PCRE_EXTRA_MATCH_LIMIT            0x0002\n#define PCRE_EXTRA_CALLOUT_DATA           0x0004\n#define PCRE_EXTRA_TABLES                 0x0008\n#define PCRE_EXTRA_MATCH_LIMIT_RECURSION  0x0010\n#define PCRE_EXTRA_MARK                   0x0020\n#define PCRE_EXTRA_EXECUTABLE_JIT         0x0040\n\n/* Types */\n\nstruct real_pcre8_or_16;          /* declaration; the definition is private  */\ntypedef struct real_pcre8_or_16 pcre;\n\nstruct real_pcre8_or_16;          /* declaration; the definition is private  */\ntypedef struct real_pcre8_or_16 pcre16;\n\nstruct real_pcre32;               /* declaration; the definition is private  */\ntypedef struct real_pcre32 pcre32;\n\nstruct real_pcre_jit_stack;       /* declaration; the definition is private  */\ntypedef struct real_pcre_jit_stack pcre_jit_stack;\n\nstruct real_pcre16_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre16_jit_stack pcre16_jit_stack;\n\nstruct real_pcre32_jit_stack;     /* declaration; the definition is private  */\ntypedef struct real_pcre32_jit_stack pcre32_jit_stack;\n\n/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain\na 16 bit wide signed data type. Otherwise it can be a dummy data type since\npcre16 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR16\n#define PCRE_UCHAR16 unsigned short\n#endif\n\n#ifndef PCRE_SPTR16\n#define PCRE_SPTR16 const PCRE_UCHAR16 *\n#endif\n\n/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain\na 32 bit wide signed data type. Otherwise it can be a dummy data type since\npcre32 functions are not implemented. There is a check for this in pcre_internal.h. */\n#ifndef PCRE_UCHAR32\n#define PCRE_UCHAR32 unsigned int\n#endif\n\n#ifndef PCRE_SPTR32\n#define PCRE_SPTR32 const PCRE_UCHAR32 *\n#endif\n\n/* When PCRE is compiled as a C++ library, the subject pointer type can be\nreplaced with a custom type. For conventional use, the public interface is a\nconst char *. */\n\n#ifndef PCRE_SPTR\n#define PCRE_SPTR const char *\n#endif\n\n/* The structure for passing additional data to pcre_exec(). This is defined in\nsuch as way as to be extensible. Always add new fields at the end, in order to\nremain compatible. */\n\ntypedef struct pcre_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  unsigned char **mark;           /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre_extra;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR16 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre16_extra;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_extra {\n  unsigned long int flags;        /* Bits for which fields are set */\n  void *study_data;               /* Opaque data from pcre_study() */\n  unsigned long int match_limit;  /* Maximum number of calls to match() */\n  void *callout_data;             /* Data passed back in callouts */\n  const unsigned char *tables;    /* Pointer to character tables */\n  unsigned long int match_limit_recursion; /* Max recursive calls to match() */\n  PCRE_UCHAR32 **mark;            /* For passing back a mark pointer */\n  void *executable_jit;           /* Contains a pointer to a compiled jit code */\n} pcre32_extra;\n\n/* The structure for passing out data via the pcre_callout_function. We use a\nstructure so that new fields can be added on the end in future versions,\nwithout changing the API of the function, thereby allowing old clients to work\nwithout modification. */\n\ntypedef struct pcre_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR    subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const unsigned char *mark;      /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre_callout_block;\n\n/* Same structure as above, but with 16 bit char pointers. */\n\ntypedef struct pcre16_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR16  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR16 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre16_callout_block;\n\n/* Same structure as above, but with 32 bit char pointers. */\n\ntypedef struct pcre32_callout_block {\n  int          version;           /* Identifies version of block */\n  /* ------------------------ Version 0 ------------------------------- */\n  int          callout_number;    /* Number compiled into pattern */\n  int         *offset_vector;     /* The offset vector */\n  PCRE_SPTR32  subject;           /* The subject being matched */\n  int          subject_length;    /* The length of the subject */\n  int          start_match;       /* Offset to start of this match attempt */\n  int          current_position;  /* Where we currently are in the subject */\n  int          capture_top;       /* Max current capture */\n  int          capture_last;      /* Most recently closed capture */\n  void        *callout_data;      /* Data passed in with the call */\n  /* ------------------- Added for Version 1 -------------------------- */\n  int          pattern_position;  /* Offset to next item in the pattern */\n  int          next_item_length;  /* Length of next item in the pattern */\n  /* ------------------- Added for Version 2 -------------------------- */\n  const PCRE_UCHAR32 *mark;       /* Pointer to current mark or NULL    */\n  /* ------------------------------------------------------------------ */\n} pcre32_callout_block;\n\n/* Indirection for store get and free functions. These can be set to\nalternative malloc/free functions if required. Special ones are used in the\nnon-recursive case for \"frames\". There is also an optional callout function\nthat is triggered by the (?) regex item. For Virtual Pascal, these definitions\nhave to take another form. */\n\n#ifndef VPCOMPAT\nPCRE_EXP_DECL void *(*pcre_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_free)(void *);\nPCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre_callout)(pcre_callout_block *);\nPCRE_EXP_DECL int   (*pcre_stack_guard)(void);\n\nPCRE_EXP_DECL void *(*pcre16_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_free)(void *);\nPCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre16_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre16_callout)(pcre16_callout_block *);\nPCRE_EXP_DECL int   (*pcre16_stack_guard)(void);\n\nPCRE_EXP_DECL void *(*pcre32_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_free)(void *);\nPCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t);\nPCRE_EXP_DECL void  (*pcre32_stack_free)(void *);\nPCRE_EXP_DECL int   (*pcre32_callout)(pcre32_callout_block *);\nPCRE_EXP_DECL int   (*pcre32_stack_guard)(void);\n#else   /* VPCOMPAT */\nPCRE_EXP_DECL void *pcre_malloc(size_t);\nPCRE_EXP_DECL void  pcre_free(void *);\nPCRE_EXP_DECL void *pcre_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre_stack_free(void *);\nPCRE_EXP_DECL int   pcre_callout(pcre_callout_block *);\nPCRE_EXP_DECL int   pcre_stack_guard(void);\n\nPCRE_EXP_DECL void *pcre16_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_free(void *);\nPCRE_EXP_DECL void *pcre16_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre16_stack_free(void *);\nPCRE_EXP_DECL int   pcre16_callout(pcre16_callout_block *);\nPCRE_EXP_DECL int   pcre16_stack_guard(void);\n\nPCRE_EXP_DECL void *pcre32_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_free(void *);\nPCRE_EXP_DECL void *pcre32_stack_malloc(size_t);\nPCRE_EXP_DECL void  pcre32_stack_free(void *);\nPCRE_EXP_DECL int   pcre32_callout(pcre32_callout_block *);\nPCRE_EXP_DECL int   pcre32_stack_guard(void);\n#endif  /* VPCOMPAT */\n\n/* User defined callback which provides a stack just before the match starts. */\n\ntypedef pcre_jit_stack *(*pcre_jit_callback)(void *);\ntypedef pcre16_jit_stack *(*pcre16_jit_callback)(void *);\ntypedef pcre32_jit_stack *(*pcre32_jit_callback)(void *);\n\n/* Exported PCRE functions */\n\nPCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *,\n                  const unsigned char *);\nPCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **,\n                  int *, const unsigned char *);\nPCRE_EXP_DECL int  pcre_config(int, void *);\nPCRE_EXP_DECL int  pcre16_config(int, void *);\nPCRE_EXP_DECL int  pcre32_config(int, void *);\nPCRE_EXP_DECL int  pcre_copy_named_substring(const pcre *, const char *,\n                  int *, int, const char *, char *, int);\nPCRE_EXP_DECL int  pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_copy_substring(const char *, int *, int, int,\n                  char *, int);\nPCRE_EXP_DECL int  pcre16_copy_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_UCHAR16 *, int);\nPCRE_EXP_DECL int  pcre32_copy_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_UCHAR32 *, int);\nPCRE_EXP_DECL int  pcre_dfa_exec(const pcre *, const pcre_extra *,\n                  const char *, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre16_dfa_exec(const pcre16 *, const pcre16_extra *,\n                  PCRE_SPTR16, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre32_dfa_exec(const pcre32 *, const pcre32_extra *,\n                  PCRE_SPTR32, int, int, int, int *, int , int *, int);\nPCRE_EXP_DECL int  pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR,\n                   int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre16_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre32_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int);\nPCRE_EXP_DECL int  pcre_jit_exec(const pcre *, const pcre_extra *,\n                   PCRE_SPTR, int, int, int, int *, int,\n                   pcre_jit_stack *);\nPCRE_EXP_DECL int  pcre16_jit_exec(const pcre16 *, const pcre16_extra *,\n                   PCRE_SPTR16, int, int, int, int *, int,\n                   pcre16_jit_stack *);\nPCRE_EXP_DECL int  pcre32_jit_exec(const pcre32 *, const pcre32_extra *,\n                   PCRE_SPTR32, int, int, int, int *, int,\n                   pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_free_substring(const char *);\nPCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16);\nPCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32);\nPCRE_EXP_DECL void pcre_free_substring_list(const char **);\nPCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *);\nPCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_fullinfo(const pcre *, const pcre_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int,\n                  void *);\nPCRE_EXP_DECL int  pcre_get_named_substring(const pcre *, const char *,\n                  int *, int, const char *, const char **);\nPCRE_EXP_DECL int  pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16,\n                  int *, int, PCRE_SPTR16, PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32,\n                  int *, int, PCRE_SPTR32, PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_stringnumber(const pcre *, const char *);\nPCRE_EXP_DECL int  pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16);\nPCRE_EXP_DECL int  pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32);\nPCRE_EXP_DECL int  pcre_get_stringtable_entries(const pcre *, const char *,\n                  char **, char **);\nPCRE_EXP_DECL int  pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16,\n                  PCRE_UCHAR16 **, PCRE_UCHAR16 **);\nPCRE_EXP_DECL int  pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32,\n                  PCRE_UCHAR32 **, PCRE_UCHAR32 **);\nPCRE_EXP_DECL int  pcre_get_substring(const char *, int *, int, int,\n                  const char **);\nPCRE_EXP_DECL int  pcre16_get_substring(PCRE_SPTR16, int *, int, int,\n                  PCRE_SPTR16 *);\nPCRE_EXP_DECL int  pcre32_get_substring(PCRE_SPTR32, int *, int, int,\n                  PCRE_SPTR32 *);\nPCRE_EXP_DECL int  pcre_get_substring_list(const char *, int *, int,\n                  const char ***);\nPCRE_EXP_DECL int  pcre16_get_substring_list(PCRE_SPTR16, int *, int,\n                  PCRE_SPTR16 **);\nPCRE_EXP_DECL int  pcre32_get_substring_list(PCRE_SPTR32, int *, int,\n                  PCRE_SPTR32 **);\nPCRE_EXP_DECL const unsigned char *pcre_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre16_maketables(void);\nPCRE_EXP_DECL const unsigned char *pcre32_maketables(void);\nPCRE_EXP_DECL int  pcre_refcount(pcre *, int);\nPCRE_EXP_DECL int  pcre16_refcount(pcre16 *, int);\nPCRE_EXP_DECL int  pcre32_refcount(pcre32 *, int);\nPCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **);\nPCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **);\nPCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **);\nPCRE_EXP_DECL void pcre_free_study(pcre_extra *);\nPCRE_EXP_DECL void pcre16_free_study(pcre16_extra *);\nPCRE_EXP_DECL void pcre32_free_study(pcre32_extra *);\nPCRE_EXP_DECL const char *pcre_version(void);\nPCRE_EXP_DECL const char *pcre16_version(void);\nPCRE_EXP_DECL const char *pcre32_version(void);\n\n/* Utility functions for byte order swaps. */\nPCRE_EXP_DECL int  pcre_pattern_to_host_byte_order(pcre *, pcre_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *,\n                  const unsigned char *);\nPCRE_EXP_DECL int  pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *,\n                  PCRE_SPTR16, int, int *, int);\nPCRE_EXP_DECL int  pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *,\n                  PCRE_SPTR32, int, int *, int);\n\n/* JIT compiler related functions. */\n\nPCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int);\nPCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int);\nPCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *);\nPCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *);\nPCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *);\nPCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *,\n                  pcre_jit_callback, void *);\nPCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *,\n                  pcre16_jit_callback, void *);\nPCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *,\n                  pcre32_jit_callback, void *);\nPCRE_EXP_DECL void pcre_jit_free_unused_memory(void);\nPCRE_EXP_DECL void pcre16_jit_free_unused_memory(void);\nPCRE_EXP_DECL void pcre32_jit_free_unused_memory(void);\n\n#ifdef __cplusplus\n}  /* extern \"C\" */\n#endif\n\n#endif /* End of pcre.h */\n"
  },
  {
    "path": "src/pcre/pcre16_byte_order.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_byte_order.c\"\n\n/* End of pcre16_byte_order.c */\n"
  },
  {
    "path": "src/pcre/pcre16_chartables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_chartables.c\"\n\n/* End of pcre16_chartables.c */\n"
  },
  {
    "path": "src/pcre/pcre16_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_compile.c\"\n\n/* End of pcre16_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre16_config.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_config.c\"\n\n/* End of pcre16_config.c */\n"
  },
  {
    "path": "src/pcre/pcre16_dfa_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_dfa_exec.c\"\n\n/* End of pcre16_dfa_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre16_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_exec.c\"\n\n/* End of pcre16_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre16_fullinfo.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_fullinfo.c\"\n\n/* End of pcre16_fullinfo.c */\n"
  },
  {
    "path": "src/pcre/pcre16_get.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_get.c\"\n\n/* End of pcre16_get.c */\n"
  },
  {
    "path": "src/pcre/pcre16_globals.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_globals.c\"\n\n/* End of pcre16_globals.c */\n"
  },
  {
    "path": "src/pcre/pcre16_jit_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_jit_compile.c\"\n\n/* End of pcre16_jit_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre16_maketables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_maketables.c\"\n\n/* End of pcre16_maketables.c */\n"
  },
  {
    "path": "src/pcre/pcre16_newline.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_newline.c\"\n\n/* End of pcre16_newline.c */\n"
  },
  {
    "path": "src/pcre/pcre16_ord2utf16.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This file contains a private PCRE function that converts an ordinal\ncharacter value into a UTF16 string. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_internal.h\"\n\n/*************************************************\n*       Convert character value to UTF-16         *\n*************************************************/\n\n/* This function takes an integer value in the range 0 - 0x10ffff\nand encodes it as a UTF-16 character in 1 to 2 pcre_uchars.\n\nArguments:\n  cvalue     the character value\n  buffer     pointer to buffer for result - at least 2 pcre_uchars long\n\nReturns:     number of characters placed in the buffer\n*/\n\nunsigned int\nPRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)\n{\n#ifdef SUPPORT_UTF\n\nif (cvalue <= 0xffff)\n  {\n  *buffer = (pcre_uchar)cvalue;\n  return 1;\n  }\n\ncvalue -= 0x10000;\n*buffer++ = 0xd800 | (cvalue >> 10);\n*buffer = 0xdc00 | (cvalue & 0x3ff);\nreturn 2;\n\n#else /* SUPPORT_UTF */\n(void)(cvalue);  /* Keep compiler happy; this function won't ever be */\n(void)(buffer);  /* called when SUPPORT_UTF is not defined. */\nreturn 0;\n#endif /* SUPPORT_UTF */\n}\n\n/* End of pcre16_ord2utf16.c */\n"
  },
  {
    "path": "src/pcre/pcre16_printint.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_printint.c\"\n\n/* End of pcre16_printint.c */\n"
  },
  {
    "path": "src/pcre/pcre16_refcount.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_refcount.c\"\n\n/* End of pcre16_refcount.c */\n"
  },
  {
    "path": "src/pcre/pcre16_string_utils.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_string_utils.c\"\n\n/* End of pcre16_string_utils.c */\n"
  },
  {
    "path": "src/pcre/pcre16_study.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_study.c\"\n\n/* End of pcre16_study.c */\n"
  },
  {
    "path": "src/pcre/pcre16_tables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_tables.c\"\n\n/* End of pcre16_tables.c */\n"
  },
  {
    "path": "src/pcre/pcre16_ucd.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_ucd.c\"\n\n/* End of pcre16_ucd.c */\n"
  },
  {
    "path": "src/pcre/pcre16_utf16_utils.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains a function for converting any UTF-16 character\nstrings to host byte order. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_internal.h\"\n\n/*************************************************\n*  Convert any UTF-16 string to host byte order  *\n*************************************************/\n\n/* This function takes an UTF-16 string and converts\nit to host byte order. The length can be explicitly set,\nor automatically detected for zero terminated strings.\nBOMs can be kept or discarded during the conversion.\nConversion can be done in place (output == input).\n\nArguments:\n  output     the output buffer, its size must be greater\n             or equal than the input string\n  input      any UTF-16 string\n  length     the number of 16-bit units in the input string\n             can be less than zero for zero terminated strings\n  host_byte_order\n             A non-zero value means the input is in host byte\n             order, which can be dynamically changed by BOMs later.\n             Initially it contains the starting byte order and returns\n             with the last byte order so it can be used for stream\n             processing. It can be NULL, which set the host byte\n             order mode by default.\n  keep_boms  for a non-zero value, the BOM (0xfeff) characters\n             are copied as well\n\nReturns:     the number of 16-bit units placed into the output buffer,\n             including the zero-terminator\n*/\n\nint\npcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, PCRE_SPTR16 input,\n  int length, int *host_byte_order, int keep_boms)\n{\n#ifdef SUPPORT_UTF\n/* This function converts any UTF-16 string to host byte order and optionally\nremoves any Byte Order Marks (BOMS). Returns with the remainig length. */\nint host_bo = host_byte_order != NULL ? *host_byte_order : 1;\npcre_uchar *optr = (pcre_uchar *)output;\nconst pcre_uchar *iptr = (const pcre_uchar *)input;\nconst pcre_uchar *end;\n/* The c variable must be unsigned. */\nregister pcre_uchar c;\n\nif (length < 0)\n  length = STRLEN_UC(iptr) + 1;\nend = iptr + length;\n\nwhile (iptr < end)\n  {\n  c = *iptr++;\n  if (c == 0xfeff || c == 0xfffe)\n    {\n    /* Detecting the byte order of the machine is unnecessary, it is\n    enough to know that the UTF-16 string has the same byte order or not. */\n    host_bo = c == 0xfeff;\n    if (keep_boms != 0)\n      *optr++ = 0xfeff;\n    else\n      length--;\n    }\n  else\n    *optr++ = host_bo ? c : ((c >> 8) | (c << 8)); /* Flip bytes if needed. */\n  }\nif (host_byte_order != NULL)\n  *host_byte_order = host_bo;\n\n#else /* Not SUPPORT_UTF */\n(void)(output);  /* Keep picky compilers happy */\n(void)(input);\n(void)(keep_boms);\n(void)(host_byte_order);\n#endif /* SUPPORT_UTF */\nreturn length;\n}\n\n/* End of pcre16_utf16_utils.c */\n"
  },
  {
    "path": "src/pcre/pcre16_valid_utf16.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains an internal function for validating UTF-16 character\nstrings. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*         Validate a UTF-16 string                *\n*************************************************/\n\n/* This function is called (optionally) at the start of compile or match, to\ncheck that a supposed UTF-16 string is actually valid. The early check means\nthat subsequent code can assume it is dealing with a valid string. The check\ncan be turned off for maximum performance, but the consequences of supplying an\ninvalid string are then undefined.\n\nFrom release 8.21 more information about the details of the error are passed\nback in the returned value:\n\nPCRE_UTF16_ERR0  No error\nPCRE_UTF16_ERR1  Missing low surrogate at the end of the string\nPCRE_UTF16_ERR2  Invalid low surrogate\nPCRE_UTF16_ERR3  Isolated low surrogate\nPCRE_UTF16_ERR4  Unused (was non-character)\n\nArguments:\n  string       points to the string\n  length       length of string, or -1 if the string is zero-terminated\n  errp         pointer to an error position offset variable\n\nReturns:       = 0    if the string is a valid UTF-16 string\n               > 0    otherwise, setting the offset of the bad character\n*/\n\nint\nPRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)\n{\n#ifdef SUPPORT_UTF\nregister PCRE_PUCHAR p;\nregister pcre_uint32 c;\n\nif (length < 0)\n  {\n  for (p = string; *p != 0; p++);\n  length = p - string;\n  }\n\nfor (p = string; length-- > 0; p++)\n  {\n  c = *p;\n\n  if ((c & 0xf800) != 0xd800)\n    {\n    /* Normal UTF-16 code point. Neither high nor low surrogate. */\n    }\n  else if ((c & 0x0400) == 0)\n    {\n    /* High surrogate. Must be a followed by a low surrogate. */\n    if (length == 0)\n      {\n      *erroroffset = p - string;\n      return PCRE_UTF16_ERR1;\n      }\n    p++;\n    length--;\n    if ((*p & 0xfc00) != 0xdc00)\n      {\n      *erroroffset = p - string;\n      return PCRE_UTF16_ERR2;\n      }\n    }\n  else\n    {\n    /* Isolated low surrogate. Always an error. */\n    *erroroffset = p - string;\n    return PCRE_UTF16_ERR3;\n    }\n  }\n\n#else  /* SUPPORT_UTF */\n(void)(string);  /* Keep picky compilers happy */\n(void)(length);\n(void)(erroroffset);\n#endif /* SUPPORT_UTF */\n\nreturn PCRE_UTF16_ERR0;   /* This indicates success */\n}\n\n/* End of pcre16_valid_utf16.c */\n"
  },
  {
    "path": "src/pcre/pcre16_version.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_version.c\"\n\n/* End of pcre16_version.c */\n"
  },
  {
    "path": "src/pcre/pcre16_xclass.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 16 bit character support. */\n#define COMPILE_PCRE16\n\n#include \"pcre_xclass.c\"\n\n/* End of pcre16_xclass.c */\n"
  },
  {
    "path": "src/pcre/pcre32_byte_order.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_byte_order.c\"\n\n/* End of pcre32_byte_order.c */\n"
  },
  {
    "path": "src/pcre/pcre32_chartables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_chartables.c\"\n\n/* End of pcre32_chartables.c */\n"
  },
  {
    "path": "src/pcre/pcre32_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_compile.c\"\n\n/* End of pcre32_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre32_config.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_config.c\"\n\n/* End of pcre32_config.c */\n"
  },
  {
    "path": "src/pcre/pcre32_dfa_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_dfa_exec.c\"\n\n/* End of pcre32_dfa_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre32_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_exec.c\"\n\n/* End of pcre32_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre32_fullinfo.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_fullinfo.c\"\n\n/* End of pcre32_fullinfo.c */\n"
  },
  {
    "path": "src/pcre/pcre32_get.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_get.c\"\n\n/* End of pcre32_get.c */\n"
  },
  {
    "path": "src/pcre/pcre32_globals.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_globals.c\"\n\n/* End of pcre32_globals.c */\n"
  },
  {
    "path": "src/pcre/pcre32_jit_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_jit_compile.c\"\n\n/* End of pcre32_jit_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre32_maketables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_maketables.c\"\n\n/* End of pcre32_maketables.c */\n"
  },
  {
    "path": "src/pcre/pcre32_newline.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_newline.c\"\n\n/* End of pcre32_newline.c */\n"
  },
  {
    "path": "src/pcre/pcre32_ord2utf32.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This file contains a private PCRE function that converts an ordinal\ncharacter value into a UTF32 string. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_internal.h\"\n\n/*************************************************\n*       Convert character value to UTF-32         *\n*************************************************/\n\n/* This function takes an integer value in the range 0 - 0x10ffff\nand encodes it as a UTF-32 character in 1 pcre_uchars.\n\nArguments:\n  cvalue     the character value\n  buffer     pointer to buffer for result - at least 1 pcre_uchars long\n\nReturns:     number of characters placed in the buffer\n*/\n\nunsigned int\nPRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)\n{\n#ifdef SUPPORT_UTF\n\n*buffer = (pcre_uchar)cvalue;\nreturn 1;\n\n#else /* SUPPORT_UTF */\n(void)(cvalue);  /* Keep compiler happy; this function won't ever be */\n(void)(buffer);  /* called when SUPPORT_UTF is not defined. */\nreturn 0;\n#endif /* SUPPORT_UTF */\n}\n\n/* End of pcre32_ord2utf32.c */\n"
  },
  {
    "path": "src/pcre/pcre32_printint.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_printint.c\"\n\n/* End of pcre32_printint.c */\n"
  },
  {
    "path": "src/pcre/pcre32_refcount.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_refcount.c\"\n\n/* End of pcre32_refcount.c */\n"
  },
  {
    "path": "src/pcre/pcre32_string_utils.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_string_utils.c\"\n\n/* End of pcre32_string_utils.c */\n"
  },
  {
    "path": "src/pcre/pcre32_study.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_study.c\"\n\n/* End of pcre32_study.c */\n"
  },
  {
    "path": "src/pcre/pcre32_tables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_tables.c\"\n\n/* End of pcre32_tables.c */\n"
  },
  {
    "path": "src/pcre/pcre32_ucd.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_ucd.c\"\n\n/* End of pcre32_ucd.c */\n"
  },
  {
    "path": "src/pcre/pcre32_utf32_utils.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains a function for converting any UTF-32 character\nstrings to host byte order. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_internal.h\"\n\n#ifdef SUPPORT_UTF\nstatic pcre_uint32\nswap_uint32(pcre_uint32 value)\n{\nreturn ((value & 0x000000ff) << 24) |\n       ((value & 0x0000ff00) <<  8) |\n       ((value & 0x00ff0000) >>  8) |\n       (value >> 24);\n}\n#endif\n\n\n/*************************************************\n*  Convert any UTF-32 string to host byte order  *\n*************************************************/\n\n/* This function takes an UTF-32 string and converts\nit to host byte order. The length can be explicitly set,\nor automatically detected for zero terminated strings.\nBOMs can be kept or discarded during the conversion.\nConversion can be done in place (output == input).\n\nArguments:\n  output     the output buffer, its size must be greater\n             or equal than the input string\n  input      any UTF-32 string\n  length     the number of 32-bit units in the input string\n             can be less than zero for zero terminated strings\n  host_byte_order\n             A non-zero value means the input is in host byte\n             order, which can be dynamically changed by BOMs later.\n             Initially it contains the starting byte order and returns\n             with the last byte order so it can be used for stream\n             processing. It can be NULL, which set the host byte\n             order mode by default.\n  keep_boms  for a non-zero value, the BOM (0xfeff) characters\n             are copied as well\n\nReturns:     the number of 32-bit units placed into the output buffer,\n             including the zero-terminator\n*/\n\nint\npcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, PCRE_SPTR32 input,\n  int length, int *host_byte_order, int keep_boms)\n{\n#ifdef SUPPORT_UTF\n/* This function converts any UTF-32 string to host byte order and optionally\nremoves any Byte Order Marks (BOMS). Returns with the remainig length. */\nint host_bo = host_byte_order != NULL ? *host_byte_order : 1;\npcre_uchar *optr = (pcre_uchar *)output;\nconst pcre_uchar *iptr = (const pcre_uchar *)input;\nconst pcre_uchar *end;\n/* The c variable must be unsigned. */\nregister pcre_uchar c;\n\nif (length < 0)\n  end = iptr + STRLEN_UC(iptr) + 1;\nelse\n  end = iptr + length;\n\nwhile (iptr < end)\n  {\n  c = *iptr++;\n  if (c == 0x0000feffu || c == 0xfffe0000u)\n    {\n    /* Detecting the byte order of the machine is unnecessary, it is\n    enough to know that the UTF-32 string has the same byte order or not. */\n    host_bo = c == 0x0000feffu;\n    if (keep_boms != 0)\n      *optr++ = 0x0000feffu;\n    }\n  else\n    *optr++ = host_bo ? c : swap_uint32(c);\n  }\nif (host_byte_order != NULL)\n  *host_byte_order = host_bo;\n\n#else /* SUPPORT_UTF */\n(void)(output);  /* Keep picky compilers happy */\n(void)(input);\n(void)(keep_boms);\n(void)(host_byte_order);\n#endif /* SUPPORT_UTF */\nreturn length;\n}\n\n/* End of pcre32_utf32_utils.c */\n"
  },
  {
    "path": "src/pcre/pcre32_valid_utf32.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains an internal function for validating UTF-32 character\nstrings. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_internal.h\"\n\n/*************************************************\n*         Validate a UTF-32 string                *\n*************************************************/\n\n/* This function is called (optionally) at the start of compile or match, to\ncheck that a supposed UTF-32 string is actually valid. The early check means\nthat subsequent code can assume it is dealing with a valid string. The check\ncan be turned off for maximum performance, but the consequences of supplying an\ninvalid string are then undefined.\n\nMore information about the details of the error are passed\nback in the returned value:\n\nPCRE_UTF32_ERR0  No error\nPCRE_UTF32_ERR1  Surrogate character\nPCRE_UTF32_ERR2  Unused (was non-character)\nPCRE_UTF32_ERR3  Character > 0x10ffff\n\nArguments:\n  string       points to the string\n  length       length of string, or -1 if the string is zero-terminated\n  errp         pointer to an error position offset variable\n\nReturns:       = 0    if the string is a valid UTF-32 string\n               > 0    otherwise, setting the offset of the bad character\n*/\n\nint\nPRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)\n{\n#ifdef SUPPORT_UTF\nregister PCRE_PUCHAR p;\nregister pcre_uchar c;\n\nif (length < 0)\n  {\n  for (p = string; *p != 0; p++);\n  length = p - string;\n  }\n\nfor (p = string; length-- > 0; p++)\n  {\n  c = *p;\n\n  if ((c & 0xfffff800u) != 0xd800u)\n    {\n    /* Normal UTF-32 code point. Neither high nor low surrogate. */\n    if (c > 0x10ffffu)\n      {\n      *erroroffset = p - string;\n      return PCRE_UTF32_ERR3;\n      }\n    }\n  else\n    {\n    /* A surrogate */\n    *erroroffset = p - string;\n    return PCRE_UTF32_ERR1;\n    }\n  }\n\n#else  /* SUPPORT_UTF */\n(void)(string);  /* Keep picky compilers happy */\n(void)(length);\n(void)(erroroffset);\n#endif /* SUPPORT_UTF */\n\nreturn PCRE_UTF32_ERR0;   /* This indicates success */\n}\n\n/* End of pcre32_valid_utf32.c */\n"
  },
  {
    "path": "src/pcre/pcre32_version.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_version.c\"\n\n/* End of pcre32_version.c */\n"
  },
  {
    "path": "src/pcre/pcre32_xclass.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Generate code with 32 bit character support. */\n#define COMPILE_PCRE32\n\n#include \"pcre_xclass.c\"\n\n/* End of pcre32_xclass.c */\n"
  },
  {
    "path": "src/pcre/pcre_byte_order.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains an internal function that tests a compiled pattern to\nsee if it was compiled with the opposite endianness. If so, it uses an\nauxiliary local function to flip the appropriate bytes. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*             Swap byte functions                *\n*************************************************/\n\n/* The following functions swap the bytes of a pcre_uint16\nand pcre_uint32 value.\n\nArguments:\n  value        any number\n\nReturns:       the byte swapped value\n*/\n\nstatic pcre_uint32\nswap_uint32(pcre_uint32 value)\n{\nreturn ((value & 0x000000ff) << 24) |\n       ((value & 0x0000ff00) <<  8) |\n       ((value & 0x00ff0000) >>  8) |\n       (value >> 24);\n}\n\nstatic pcre_uint16\nswap_uint16(pcre_uint16 value)\n{\nreturn (value >> 8) | (value << 8);\n}\n\n\n/*************************************************\n*       Test for a byte-flipped compiled regex   *\n*************************************************/\n\n/* This function swaps the bytes of a compiled pattern usually\nloaded form the disk. It also sets the tables pointer, which\nis likely an invalid pointer after reload.\n\nArguments:\n  argument_re     points to the compiled expression\n  extra_data      points to extra data or is NULL\n  tables          points to the character tables or NULL\n\nReturns:          0 if the swap is successful, negative on error\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re,\n  pcre_extra *extra_data, const unsigned char *tables)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *argument_re,\n  pcre16_extra *extra_data, const unsigned char *tables)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *argument_re,\n  pcre32_extra *extra_data, const unsigned char *tables)\n#endif\n{\nREAL_PCRE *re = (REAL_PCRE *)argument_re;\npcre_study_data *study;\n#ifndef COMPILE_PCRE8\npcre_uchar *ptr;\nint length;\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\nBOOL utf;\nBOOL utf16_char;\n#endif /* SUPPORT_UTF && COMPILE_PCRE16 */\n#endif /* !COMPILE_PCRE8 */\n\nif (re == NULL) return PCRE_ERROR_NULL;\nif (re->magic_number == MAGIC_NUMBER)\n  {\n  if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\n  re->tables = tables;\n  return 0;\n  }\n\nif (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;\nif ((swap_uint32(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\n\nre->magic_number = MAGIC_NUMBER;\nre->size = swap_uint32(re->size);\nre->options = swap_uint32(re->options);\nre->flags = swap_uint32(re->flags);\nre->limit_match = swap_uint32(re->limit_match);\nre->limit_recursion = swap_uint32(re->limit_recursion);\n\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\nre->first_char = swap_uint16(re->first_char);\nre->req_char = swap_uint16(re->req_char);\n#elif defined COMPILE_PCRE32\nre->first_char = swap_uint32(re->first_char);\nre->req_char = swap_uint32(re->req_char);\n#endif\n\nre->max_lookbehind = swap_uint16(re->max_lookbehind);\nre->top_bracket = swap_uint16(re->top_bracket);\nre->top_backref = swap_uint16(re->top_backref);\nre->name_table_offset = swap_uint16(re->name_table_offset);\nre->name_entry_size = swap_uint16(re->name_entry_size);\nre->name_count = swap_uint16(re->name_count);\nre->ref_count = swap_uint16(re->ref_count);\nre->tables = tables;\n\nif (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)\n  {\n  study = (pcre_study_data *)extra_data->study_data;\n  study->size = swap_uint32(study->size);\n  study->flags = swap_uint32(study->flags);\n  study->minlength = swap_uint32(study->minlength);\n  }\n\n#ifndef COMPILE_PCRE8\nptr = (pcre_uchar *)re + re->name_table_offset;\nlength = re->name_count * re->name_entry_size;\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\nutf = (re->options & PCRE_UTF16) != 0;\nutf16_char = FALSE;\n#endif /* SUPPORT_UTF && COMPILE_PCRE16 */\n\nwhile(TRUE)\n  {\n  /* Swap previous characters. */\n  while (length-- > 0)\n    {\n#if defined COMPILE_PCRE16\n    *ptr = swap_uint16(*ptr);\n#elif defined COMPILE_PCRE32\n    *ptr = swap_uint32(*ptr);\n#endif\n    ptr++;\n    }\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\n  if (utf16_char)\n    {\n    if (HAS_EXTRALEN(ptr[-1]))\n      {\n      /* We know that there is only one extra character in UTF-16. */\n      *ptr = swap_uint16(*ptr);\n      ptr++;\n      }\n    }\n  utf16_char = FALSE;\n#endif /* SUPPORT_UTF */\n\n  /* Get next opcode. */\n  length = 0;\n#if defined COMPILE_PCRE16\n  *ptr = swap_uint16(*ptr);\n#elif defined COMPILE_PCRE32\n  *ptr = swap_uint32(*ptr);\n#endif\n  switch (*ptr)\n    {\n    case OP_END:\n    return 0;\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n    if (utf) utf16_char = TRUE;\n#endif\n    /* Fall through. */\n\n    default:\n    length = PRIV(OP_lengths)[*ptr] - 1;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    /* Skip the character bit map. */\n    ptr += 32/sizeof(pcre_uchar);\n    length = 0;\n    break;\n\n    case OP_XCLASS:\n    /* Reverse the size of the XCLASS instance. */\n    ptr++;\n#if defined COMPILE_PCRE16\n    *ptr = swap_uint16(*ptr);\n#elif defined COMPILE_PCRE32\n    *ptr = swap_uint32(*ptr);\n#endif\n#ifndef COMPILE_PCRE32\n    if (LINK_SIZE > 1)\n      {\n      /* LINK_SIZE can be 1 or 2 in 16 bit mode. */\n      ptr++;\n      *ptr = swap_uint16(*ptr);\n      }\n#endif\n    ptr++;\n    length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1);\n#if defined COMPILE_PCRE16\n    *ptr = swap_uint16(*ptr);\n#elif defined COMPILE_PCRE32\n    *ptr = swap_uint32(*ptr);\n#endif\n    if ((*ptr & XCL_MAP) != 0)\n      {\n      /* Skip the character bit map. */\n      ptr += 32/sizeof(pcre_uchar);\n      length -= 32/sizeof(pcre_uchar);\n      }\n    break;\n    }\n  ptr++;\n  }\n/* Control should never reach here in 16/32 bit mode. */\n#else  /* In 8-bit mode, the pattern does not need to be processed. */\nreturn 0;\n#endif /* !COMPILE_PCRE8 */\n}\n\n/* End of pcre_byte_order.c */\n"
  },
  {
    "path": "src/pcre/pcre_chartables.c.dist",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* This file contains character tables that are used when no external tables\nare passed to PCRE by the application that calls it. The tables are used only\nfor characters whose code values are less than 256.\n\nThis is a default version of the tables that assumes ASCII encoding. A program\ncalled dftables (which is distributed with PCRE) can be used to build\nalternative versions of this file. This is necessary if you are running in an\nEBCDIC environment, or if you want to default to a different encoding, for\nexample ISO-8859-1. When dftables is run, it creates these tables in the\ncurrent locale. If PCRE is configured with --enable-rebuild-chartables, this\nhappens automatically.\n\nThe following #includes are present because without them gcc 4.x may remove the\narray definition from the final binary if PCRE is built into a static library\nand dead code stripping is activated. This leads to link errors. Pulling in the\nheader ensures that the array gets flagged as \"someone outside this compilation\nunit might reference this\" and so it will always be supplied to the linker. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\nconst pcre_uint8 PRIV(default_tables)[] = {\n\n/* This table is a lower casing table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table is a case flipping table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 65, 66, 67, 68, 69, 70, 71,\n   72, 73, 74, 75, 76, 77, 78, 79,\n   80, 81, 82, 83, 84, 85, 86, 87,\n   88, 89, 90,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table contains bit maps for various character classes. Each map is 32\nbytes long and the bits run from the least significant end of each byte. The\nclasses that have their own maps are: space, xdigit, digit, upper, lower, word,\ngraph, print, punct, and cntrl. Other classes are built from combinations. */\n\n  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,\n  0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n/* This table identifies various classes of character by individual bits:\n  0x01   white space character\n  0x02   letter\n  0x04   decimal digit\n  0x08   hexadecimal digit\n  0x10   alphanumeric or '_'\n  0x80   regular expression metacharacter or binary zero\n*/\n\n  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */\n  0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /*   8- 15 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */\n  0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /*    - '  */\n  0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /*  ( - /  */\n  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */\n  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /*  8 - ?  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  @ - G  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  H - O  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  P - W  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /*  X - _  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  ` - g  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  h - o  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  p - w  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /*  x -127 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */\n\n/* End of pcre_chartables.c */\n"
  },
  {
    "path": "src/pcre/pcre_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2018 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_compile(), along with\nsupporting internal functions that are not used by other modules. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#define NLBLOCK cd             /* Block containing newline information */\n#define PSSTART start_pattern  /* Field containing pattern start */\n#define PSEND   end_pattern    /* Field containing pattern end */\n\n#include \"pcre_internal.h\"\n\n\n/* When PCRE_DEBUG is defined, we need the pcre(16|32)_printint() function, which\nis also used by pcretest. PCRE_DEBUG is not defined when building a production\nlibrary. We do not need to select pcre16_printint.c specially, because the\nCOMPILE_PCREx macro will already be appropriately set. */\n\n#ifdef PCRE_DEBUG\n/* pcre_printint.c should not include any headers */\n#define PCRE_INCLUDED\n#include \"pcre_printint.c\"\n#undef PCRE_INCLUDED\n#endif\n\n\n/* Macro for setting individual bits in class bitmaps. */\n\n#define SETBIT(a,b) a[(b)/8] |= (1 << ((b)&7))\n\n/* Maximum length value to check against when making sure that the integer that\nholds the compiled pattern length does not overflow. We make it a bit less than\nINT_MAX to allow for adding in group terminating bytes, so that we don't have\nto check them every time. */\n\n#define OFLOW_MAX (INT_MAX - 20)\n\n/* Definitions to allow mutual recursion */\n\nstatic int\n  add_list_to_class(pcre_uint8 *, pcre_uchar **, int, compile_data *,\n    const pcre_uint32 *, unsigned int);\n\nstatic BOOL\n  compile_regex(int, pcre_uchar **, const pcre_uchar **, int *, BOOL, BOOL, int, int,\n    pcre_uint32 *, pcre_int32 *, pcre_uint32 *, pcre_int32 *, branch_chain *,\n    compile_data *, int *);\n\n\n\n/*************************************************\n*      Code parameters and static tables         *\n*************************************************/\n\n/* This value specifies the size of stack workspace that is used during the\nfirst pre-compile phase that determines how much memory is required. The regex\nis partly compiled into this space, but the compiled parts are discarded as\nsoon as they can be, so that hopefully there will never be an overrun. The code\ndoes, however, check for an overrun. The largest amount I've seen used is 218,\nso this number is very generous.\n\nThe same workspace is used during the second, actual compile phase for\nremembering forward references to groups so that they can be filled in at the\nend. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE\nis 4 there is plenty of room for most patterns. However, the memory can get\nfilled up by repetitions of forward references, for example patterns like\n/(?1){0,1999}(b)/, and one user did hit the limit. The code has been changed so\nthat the workspace is expanded using malloc() in this situation. The value\nbelow is therefore a minimum, and we put a maximum on it for safety. The\nminimum is now also defined in terms of LINK_SIZE so that the use of malloc()\nkicks in at the same number of forward references in all cases. */\n\n#define COMPILE_WORK_SIZE (2048*LINK_SIZE)\n#define COMPILE_WORK_SIZE_MAX (100*COMPILE_WORK_SIZE)\n\n/* This value determines the size of the initial vector that is used for\nremembering named groups during the pre-compile. It is allocated on the stack,\nbut if it is too small, it is expanded using malloc(), in a similar way to the\nworkspace. The value is the number of slots in the list. */\n\n#define NAMED_GROUP_LIST_SIZE  20\n\n/* The overrun tests check for a slightly smaller size so that they detect the\noverrun before it actually does run off the end of the data block. */\n\n#define WORK_SIZE_SAFETY_MARGIN (100)\n\n/* Private flags added to firstchar and reqchar. */\n\n#define REQ_CASELESS    (1 << 0)        /* Indicates caselessness */\n#define REQ_VARY        (1 << 1)        /* Reqchar followed non-literal item */\n/* Negative values for the firstchar and reqchar flags */\n#define REQ_UNSET       (-2)\n#define REQ_NONE        (-1)\n\n/* Repeated character flags. */\n\n#define UTF_LENGTH     0x10000000l      /* The char contains its length. */\n\n/* Table for handling escaped characters in the range '0'-'z'. Positive returns\nare simple data values; negative values are for special things like \\d and so\non. Zero means further processing is needed (for things like \\x), or the escape\nis invalid. */\n\n#ifndef EBCDIC\n\n/* This is the \"normal\" table for ASCII systems or for EBCDIC systems running\nin UTF-8 mode. */\n\nstatic const short int escapes[] = {\n     0,                       0,\n     0,                       0,\n     0,                       0,\n     0,                       0,\n     0,                       0,\n     CHAR_COLON,              CHAR_SEMICOLON,\n     CHAR_LESS_THAN_SIGN,     CHAR_EQUALS_SIGN,\n     CHAR_GREATER_THAN_SIGN,  CHAR_QUESTION_MARK,\n     CHAR_COMMERCIAL_AT,      -ESC_A,\n     -ESC_B,                  -ESC_C,\n     -ESC_D,                  -ESC_E,\n     0,                       -ESC_G,\n     -ESC_H,                  0,\n     0,                       -ESC_K,\n     0,                       0,\n     -ESC_N,                  0,\n     -ESC_P,                  -ESC_Q,\n     -ESC_R,                  -ESC_S,\n     0,                       0,\n     -ESC_V,                  -ESC_W,\n     -ESC_X,                  0,\n     -ESC_Z,                  CHAR_LEFT_SQUARE_BRACKET,\n     CHAR_BACKSLASH,          CHAR_RIGHT_SQUARE_BRACKET,\n     CHAR_CIRCUMFLEX_ACCENT,  CHAR_UNDERSCORE,\n     CHAR_GRAVE_ACCENT,       ESC_a,\n     -ESC_b,                  0,\n     -ESC_d,                  ESC_e,\n     ESC_f,                   0,\n     -ESC_h,                  0,\n     0,                       -ESC_k,\n     0,                       0,\n     ESC_n,                   0,\n     -ESC_p,                  0,\n     ESC_r,                   -ESC_s,\n     ESC_tee,                 0,\n     -ESC_v,                  -ESC_w,\n     0,                       0,\n     -ESC_z\n};\n\n#else\n\n/* This is the \"abnormal\" table for EBCDIC systems without UTF-8 support. */\n\nstatic const short int escapes[] = {\n/*  48 */     0,     0,      0,     '.',    '<',   '(',    '+',    '|',\n/*  50 */   '&',     0,      0,       0,      0,     0,      0,      0,\n/*  58 */     0,     0,    '!',     '$',    '*',   ')',    ';',    '~',\n/*  60 */   '-',   '/',      0,       0,      0,     0,      0,      0,\n/*  68 */     0,     0,    '|',     ',',    '%',   '_',    '>',    '?',\n/*  70 */     0,     0,      0,       0,      0,     0,      0,      0,\n/*  78 */     0,   '`',    ':',     '#',    '@',  '\\'',    '=',    '\"',\n/*  80 */     0, ESC_a, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,\n/*  88 */-ESC_h,     0,      0,     '{',      0,     0,      0,      0,\n/*  90 */     0,     0, -ESC_k,       0,      0, ESC_n,      0, -ESC_p,\n/*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,\n/*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,-ESC_v, -ESC_w,      0,\n/*  A8 */     0,-ESC_z,      0,       0,      0,   '[',      0,      0,\n/*  B0 */     0,     0,      0,       0,      0,     0,      0,      0,\n/*  B8 */     0,     0,      0,       0,      0,   ']',    '=',    '-',\n/*  C0 */   '{',-ESC_A, -ESC_B,  -ESC_C, -ESC_D,-ESC_E,      0, -ESC_G,\n/*  C8 */-ESC_H,     0,      0,       0,      0,     0,      0,      0,\n/*  D0 */   '}',     0, -ESC_K,       0,      0,-ESC_N,      0, -ESC_P,\n/*  D8 */-ESC_Q,-ESC_R,      0,       0,      0,     0,      0,      0,\n/*  E0 */  '\\\\',     0, -ESC_S,       0,      0,-ESC_V, -ESC_W, -ESC_X,\n/*  E8 */     0,-ESC_Z,      0,       0,      0,     0,      0,      0,\n/*  F0 */     0,     0,      0,       0,      0,     0,      0,      0,\n/*  F8 */     0,     0,      0,       0,      0,     0,      0,      0\n};\n\n/* We also need a table of characters that may follow \\c in an EBCDIC\nenvironment for characters 0-31. */\n\nstatic unsigned char ebcdic_escape_c[] = \"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_\";\n\n#endif\n\n\n/* Table of special \"verbs\" like (*PRUNE). This is a short table, so it is\nsearched linearly. Put all the names into a single string, in order to reduce\nthe number of relocations when a shared library is dynamically linked. The\nstring is built from string macros so that it works in UTF-8 mode on EBCDIC\nplatforms. */\n\ntypedef struct verbitem {\n  int   len;                 /* Length of verb name */\n  int   op;                  /* Op when no arg, or -1 if arg mandatory */\n  int   op_arg;              /* Op when arg present, or -1 if not allowed */\n} verbitem;\n\nstatic const char verbnames[] =\n  \"\\0\"                       /* Empty name is a shorthand for MARK */\n  STRING_MARK0\n  STRING_ACCEPT0\n  STRING_COMMIT0\n  STRING_F0\n  STRING_FAIL0\n  STRING_PRUNE0\n  STRING_SKIP0\n  STRING_THEN;\n\nstatic const verbitem verbs[] = {\n  { 0, -1,        OP_MARK },\n  { 4, -1,        OP_MARK },\n  { 6, OP_ACCEPT, -1 },\n  { 6, OP_COMMIT, -1 },\n  { 1, OP_FAIL,   -1 },\n  { 4, OP_FAIL,   -1 },\n  { 5, OP_PRUNE,  OP_PRUNE_ARG },\n  { 4, OP_SKIP,   OP_SKIP_ARG  },\n  { 4, OP_THEN,   OP_THEN_ARG  }\n};\n\nstatic const int verbcount = sizeof(verbs)/sizeof(verbitem);\n\n\n/* Substitutes for [[:<:]] and [[:>:]], which mean start and end of word in\nanother regex library. */\n\nstatic const pcre_uchar sub_start_of_word[] = {\n  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,\n  CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w, CHAR_RIGHT_PARENTHESIS, '\\0' };\n\nstatic const pcre_uchar sub_end_of_word[] = {\n  CHAR_BACKSLASH, CHAR_b, CHAR_LEFT_PARENTHESIS, CHAR_QUESTION_MARK,\n  CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, CHAR_BACKSLASH, CHAR_w,\n  CHAR_RIGHT_PARENTHESIS, '\\0' };\n\n\n/* Tables of names of POSIX character classes and their lengths. The names are\nnow all in a single string, to reduce the number of relocations when a shared\nlibrary is dynamically loaded. The list of lengths is terminated by a zero\nlength entry. The first three must be alpha, lower, upper, as this is assumed\nfor handling case independence. The indices for graph, print, and punct are\nneeded, so identify them. */\n\nstatic const char posix_names[] =\n  STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0\n  STRING_ascii0 STRING_blank0 STRING_cntrl0 STRING_digit0\n  STRING_graph0 STRING_print0 STRING_punct0 STRING_space0\n  STRING_word0  STRING_xdigit;\n\nstatic const pcre_uint8 posix_name_lengths[] = {\n  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };\n\n#define PC_GRAPH  8\n#define PC_PRINT  9\n#define PC_PUNCT 10\n\n\n/* Table of class bit maps for each POSIX class. Each class is formed from a\nbase map, with an optional addition or removal of another map. Then, for some\nclasses, there is some additional tweaking: for [:blank:] the vertical space\ncharacters are removed, and for [:alpha:] and [:alnum:] the underscore\ncharacter is removed. The triples in the table consist of the base map offset,\nsecond map offset or -1 if no second map, and a non-negative value for map\naddition or a negative value for map subtraction (if there are two maps). The\nabsolute value of the third field has these meanings: 0 => no tweaking, 1 =>\nremove vertical space characters, 2 => remove underscore. */\n\nstatic const int posix_class_maps[] = {\n  cbit_word,  cbit_digit, -2,             /* alpha */\n  cbit_lower, -1,          0,             /* lower */\n  cbit_upper, -1,          0,             /* upper */\n  cbit_word,  -1,          2,             /* alnum - word without underscore */\n  cbit_print, cbit_cntrl,  0,             /* ascii */\n  cbit_space, -1,          1,             /* blank - a GNU extension */\n  cbit_cntrl, -1,          0,             /* cntrl */\n  cbit_digit, -1,          0,             /* digit */\n  cbit_graph, -1,          0,             /* graph */\n  cbit_print, -1,          0,             /* print */\n  cbit_punct, -1,          0,             /* punct */\n  cbit_space, -1,          0,             /* space */\n  cbit_word,  -1,          0,             /* word - a Perl extension */\n  cbit_xdigit,-1,          0              /* xdigit */\n};\n\n/* Table of substitutes for \\d etc when PCRE_UCP is set. They are replaced by\nUnicode property escapes. */\n\n#ifdef SUPPORT_UCP\nstatic const pcre_uchar string_PNd[]  = {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pNd[]  = {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PXsp[] = {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pXsp[] = {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PXwd[] = {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pXwd[] = {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\n\nstatic const pcre_uchar *substitutes[] = {\n  string_PNd,           /* \\D */\n  string_pNd,           /* \\d */\n  string_PXsp,          /* \\S */   /* Xsp is Perl space, but from 8.34, Perl */\n  string_pXsp,          /* \\s */   /* space and POSIX space are the same. */\n  string_PXwd,          /* \\W */\n  string_pXwd           /* \\w */\n};\n\n/* The POSIX class substitutes must be in the order of the POSIX class names,\ndefined above, and there are both positive and negative cases. NULL means no\ngeneral substitute of a Unicode property escape (\\p or \\P). However, for some\nPOSIX classes (e.g. graph, print, punct) a special property code is compiled\ndirectly. */\n\nstatic const pcre_uchar string_pL[] =   {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pLl[] =  {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pLu[] =  {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_pXan[] = {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_h[] =    {\n  CHAR_BACKSLASH, CHAR_h, '\\0' };\nstatic const pcre_uchar string_pXps[] = {\n  CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PL[] =   {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PLl[] =  {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PLu[] =  {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_PXan[] = {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\nstatic const pcre_uchar string_H[] =    {\n  CHAR_BACKSLASH, CHAR_H, '\\0' };\nstatic const pcre_uchar string_PXps[] = {\n  CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET,\n  CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\\0' };\n\nstatic const pcre_uchar *posix_substitutes[] = {\n  string_pL,            /* alpha */\n  string_pLl,           /* lower */\n  string_pLu,           /* upper */\n  string_pXan,          /* alnum */\n  NULL,                 /* ascii */\n  string_h,             /* blank */\n  NULL,                 /* cntrl */\n  string_pNd,           /* digit */\n  NULL,                 /* graph */\n  NULL,                 /* print */\n  NULL,                 /* punct */\n  string_pXps,          /* space */   /* Xps is POSIX space, but from 8.34 */\n  string_pXwd,          /* word  */   /* Perl and POSIX space are the same */\n  NULL,                 /* xdigit */\n  /* Negated cases */\n  string_PL,            /* ^alpha */\n  string_PLl,           /* ^lower */\n  string_PLu,           /* ^upper */\n  string_PXan,          /* ^alnum */\n  NULL,                 /* ^ascii */\n  string_H,             /* ^blank */\n  NULL,                 /* ^cntrl */\n  string_PNd,           /* ^digit */\n  NULL,                 /* ^graph */\n  NULL,                 /* ^print */\n  NULL,                 /* ^punct */\n  string_PXps,          /* ^space */  /* Xps is POSIX space, but from 8.34 */\n  string_PXwd,          /* ^word */   /* Perl and POSIX space are the same */\n  NULL                  /* ^xdigit */\n};\n#define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(pcre_uchar *))\n#endif\n\n#define STRING(a)  # a\n#define XSTRING(s) STRING(s)\n\n/* The texts of compile-time error messages. These are \"char *\" because they\nare passed to the outside world. Do not ever re-use any error number, because\nthey are documented. Always add a new error instead. Messages marked DEAD below\nare no longer used. This used to be a table of strings, but in order to reduce\nthe number of relocations needed when a shared library is loaded dynamically,\nit is now one long string. We cannot use a table of offsets, because the\nlengths of inserts such as XSTRING(MAX_NAME_SIZE) are not known. Instead, we\nsimply count through to the one we want - this isn't a performance issue\nbecause these strings are used only when there is a compilation error.\n\nEach substring ends with \\0 to insert a null character. This includes the final\nsubstring, so that the whole string ends with \\0\\0, which can be detected when\ncounting through. */\n\nstatic const char error_texts[] =\n  \"no error\\0\"\n  \"\\\\ at end of pattern\\0\"\n  \"\\\\c at end of pattern\\0\"\n  \"unrecognized character follows \\\\\\0\"\n  \"numbers out of order in {} quantifier\\0\"\n  /* 5 */\n  \"number too big in {} quantifier\\0\"\n  \"missing terminating ] for character class\\0\"\n  \"invalid escape sequence in character class\\0\"\n  \"range out of order in character class\\0\"\n  \"nothing to repeat\\0\"\n  /* 10 */\n  \"internal error: invalid forward reference offset\\0\"\n  \"internal error: unexpected repeat\\0\"\n  \"unrecognized character after (? or (?-\\0\"\n  \"POSIX named classes are supported only within a class\\0\"\n  \"missing )\\0\"\n  /* 15 */\n  \"reference to non-existent subpattern\\0\"\n  \"erroffset passed as NULL\\0\"\n  \"unknown option bit(s) set\\0\"\n  \"missing ) after comment\\0\"\n  \"parentheses nested too deeply\\0\"  /** DEAD **/\n  /* 20 */\n  \"regular expression is too large\\0\"\n  \"failed to get memory\\0\"\n  \"unmatched parentheses\\0\"\n  \"internal error: code overflow\\0\"\n  \"unrecognized character after (?<\\0\"\n  /* 25 */\n  \"lookbehind assertion is not fixed length\\0\"\n  \"malformed number or name after (?(\\0\"\n  \"conditional group contains more than two branches\\0\"\n  \"assertion expected after (?( or (?(?C)\\0\"\n  \"(?R or (?[+-]digits must be followed by )\\0\"\n  /* 30 */\n  \"unknown POSIX class name\\0\"\n  \"POSIX collating elements are not supported\\0\"\n  \"this version of PCRE is compiled without UTF support\\0\"\n  \"spare error\\0\"  /** DEAD **/\n  \"character value in \\\\x{} or \\\\o{} is too large\\0\"\n  /* 35 */\n  \"invalid condition (?(0)\\0\"\n  \"\\\\C not allowed in lookbehind assertion\\0\"\n  \"PCRE does not support \\\\L, \\\\l, \\\\N{name}, \\\\U, or \\\\u\\0\"\n  \"number after (?C is > 255\\0\"\n  \"closing ) for (?C expected\\0\"\n  /* 40 */\n  \"recursive call could loop indefinitely\\0\"\n  \"unrecognized character after (?P\\0\"\n  \"syntax error in subpattern name (missing terminator)\\0\"\n  \"two named subpatterns have the same name\\0\"\n  \"invalid UTF-8 string\\0\"\n  /* 45 */\n  \"support for \\\\P, \\\\p, and \\\\X has not been compiled\\0\"\n  \"malformed \\\\P or \\\\p sequence\\0\"\n  \"unknown property name after \\\\P or \\\\p\\0\"\n  \"subpattern name is too long (maximum \" XSTRING(MAX_NAME_SIZE) \" characters)\\0\"\n  \"too many named subpatterns (maximum \" XSTRING(MAX_NAME_COUNT) \")\\0\"\n  /* 50 */\n  \"repeated subpattern is too long\\0\"    /** DEAD **/\n  \"octal value is greater than \\\\377 in 8-bit non-UTF-8 mode\\0\"\n  \"internal error: overran compiling workspace\\0\"\n  \"internal error: previously-checked referenced subpattern not found\\0\"\n  \"DEFINE group contains more than one branch\\0\"\n  /* 55 */\n  \"repeating a DEFINE group is not allowed\\0\"  /** DEAD **/\n  \"inconsistent NEWLINE options\\0\"\n  \"\\\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\\0\"\n  \"a numbered reference must not be zero\\0\"\n  \"an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\\0\"\n  /* 60 */\n  \"(*VERB) not recognized or malformed\\0\"\n  \"number is too big\\0\"\n  \"subpattern name expected\\0\"\n  \"digit expected after (?+\\0\"\n  \"] is an invalid data character in JavaScript compatibility mode\\0\"\n  /* 65 */\n  \"different names for subpatterns of the same number are not allowed\\0\"\n  \"(*MARK) must have an argument\\0\"\n  \"this version of PCRE is not compiled with Unicode property support\\0\"\n#ifndef EBCDIC\n  \"\\\\c must be followed by an ASCII character\\0\"\n#else\n  \"\\\\c must be followed by a letter or one of [\\\\]^_?\\0\"\n#endif\n  \"\\\\k is not followed by a braced, angle-bracketed, or quoted name\\0\"\n  /* 70 */\n  \"internal error: unknown opcode in find_fixedlength()\\0\"\n  \"\\\\N is not supported in a class\\0\"\n  \"too many forward references\\0\"\n  \"disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\\0\"\n  \"invalid UTF-16 string\\0\"\n  /* 75 */\n  \"name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\\0\"\n  \"character value in \\\\u.... sequence is too large\\0\"\n  \"invalid UTF-32 string\\0\"\n  \"setting UTF is disabled by the application\\0\"\n  \"non-hex character in \\\\x{} (closing brace missing?)\\0\"\n  /* 80 */\n  \"non-octal character in \\\\o{} (closing brace missing?)\\0\"\n  \"missing opening brace after \\\\o\\0\"\n  \"parentheses are too deeply nested\\0\"\n  \"invalid range in character class\\0\"\n  \"group name must start with a non-digit\\0\"\n  /* 85 */\n  \"parentheses are too deeply nested (stack check)\\0\"\n  \"digits missing in \\\\x{} or \\\\o{}\\0\"\n  \"regular expression is too complicated\\0\"\n  ;\n\n/* Table to identify digits and hex digits. This is used when compiling\npatterns. Note that the tables in chartables are dependent on the locale, and\nmay mark arbitrary characters as digits - but the PCRE compiling code expects\nto handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have\na private table here. It costs 256 bytes, but it is a lot faster than doing\ncharacter value tests (at least in some simple cases I timed), and in some\napplications one wants PCRE to compile efficiently as well as match\nefficiently.\n\nFor convenience, we use the same bit definitions as in chartables:\n\n  0x04   decimal digit\n  0x08   hexadecimal digit\n\nThen we can use ctype_digit and ctype_xdigit in the code. */\n\n/* Using a simple comparison for decimal numbers rather than a memory read\nis much faster, and the resulting code is simpler (the compiler turns it\ninto a subtraction and unsigned comparison). */\n\n#define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9)\n\n#ifndef EBCDIC\n\n/* This is the \"normal\" case, for ASCII systems, and EBCDIC systems running in\nUTF-8 mode. */\n\nstatic const pcre_uint8 digitab[] =\n  {\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   8- 15 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - '  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ( - /  */\n  0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /*  0 - 7  */\n  0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /*  8 - ?  */\n  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  @ - G  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  H - O  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  P - W  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  X - _  */\n  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  ` - g  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  h - o  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  p - w  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  x -127 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */\n\n#else\n\n/* This is the \"abnormal\" case, for EBCDIC systems not running in UTF-8 mode. */\n\nstatic const pcre_uint8 digitab[] =\n  {\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7  0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   8- 15    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 10 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  32- 39 20 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  40- 47    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  48- 55 30 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  56- 63    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - 71 40 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  72- |     */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  & - 87 50 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  88- 95    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  - -103 60 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ?     */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- \"     */\n  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g  80 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  h -143    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p  90 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  q -159    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x  A0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  y -175    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ^ -183 B0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191    */\n  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  { - G  C0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  H -207    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  } - P  D0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  Q -223    */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  \\ - X  E0 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  Y -239    */\n  0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /*  0 - 7  F0 */\n  0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/*  8 -255    */\n\nstatic const pcre_uint8 ebcdic_chartab[] = { /* chartable partial dup */\n  0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*   0-  7 */\n  0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /*   8- 15 */\n  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*  16- 23 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */\n  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*  32- 39 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  40- 47 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  48- 55 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  56- 63 */\n  0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - 71 */\n  0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /*  72- |  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  & - 87 */\n  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /*  88- 95 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  - -103 */\n  0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ?  */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- \"  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  h -143 */\n  0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  q -159 */\n  0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  y -175 */\n  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ^ -183 */\n  0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */\n  0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  { - G  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  H -207 */\n  0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  } - P  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  Q -223 */\n  0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /*  \\ - X  */\n  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  Y -239 */\n  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */\n  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/*  8 -255 */\n#endif\n\n\n/* This table is used to check whether auto-possessification is possible\nbetween adjacent character-type opcodes. The left-hand (repeated) opcode is\nused to select the row, and the right-hand opcode is use to select the column.\nA value of 1 means that auto-possessification is OK. For example, the second\nvalue in the first row means that \\D+\\d can be turned into \\D++\\d.\n\nThe Unicode property types (\\P and \\p) have to be present to fill out the table\nbecause of what their opcode values are, but the table values should always be\nzero because property types are handled separately in the code. The last four\ncolumns apply to items that cannot be repeated, so there is no need to have\nrows for them. Note that OP_DIGIT etc. are generated only when PCRE_UCP is\n*not* set. When it is set, \\d etc. are converted into OP_(NOT_)PROP codes. */\n\n#define APTROWS (LAST_AUTOTAB_LEFT_OP - FIRST_AUTOTAB_OP + 1)\n#define APTCOLS (LAST_AUTOTAB_RIGHT_OP - FIRST_AUTOTAB_OP + 1)\n\nstatic const pcre_uint8 autoposstab[APTROWS][APTCOLS] = {\n/* \\D \\d \\S \\s \\W \\w  . .+ \\C \\P \\p \\R \\H \\h \\V \\v \\X \\Z \\z  $ $M */\n  { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \\D */\n  { 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \\d */\n  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \\S */\n  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \\s */\n  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \\W */\n  { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1 },  /* \\w */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .  */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* .+ */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },  /* \\C */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \\P */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* \\p */\n  { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \\R */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },  /* \\H */\n  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \\h */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0 },  /* \\V */\n  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0 },  /* \\v */\n  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }   /* \\X */\n};\n\n\n/* This table is used to check whether auto-possessification is possible\nbetween adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP). The\nleft-hand (repeated) opcode is used to select the row, and the right-hand\nopcode is used to select the column. The values are as follows:\n\n  0   Always return FALSE (never auto-possessify)\n  1   Character groups are distinct (possessify if both are OP_PROP)\n  2   Check character categories in the same group (general or particular)\n  3   TRUE if the two opcodes are not the same (PROP vs NOTPROP)\n\n  4   Check left general category vs right particular category\n  5   Check right general category vs left particular category\n\n  6   Left alphanum vs right general category\n  7   Left space vs right general category\n  8   Left word vs right general category\n\n  9   Right alphanum vs left general category\n 10   Right space vs left general category\n 11   Right word vs left general category\n\n 12   Left alphanum vs right particular category\n 13   Left space vs right particular category\n 14   Left word vs right particular category\n\n 15   Right alphanum vs left particular category\n 16   Right space vs left particular category\n 17   Right word vs left particular category\n*/\n\nstatic const pcre_uint8 propposstab[PT_TABSIZE][PT_TABSIZE] = {\n/* ANY LAMP GC  PC  SC ALNUM SPACE PXSPACE WORD CLIST UCNC */\n  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_ANY */\n  { 0,  3,  0,  0,  0,    3,    1,      1,   0,    0,   0 },  /* PT_LAMP */\n  { 0,  0,  2,  4,  0,    9,   10,     10,  11,    0,   0 },  /* PT_GC */\n  { 0,  0,  5,  2,  0,   15,   16,     16,  17,    0,   0 },  /* PT_PC */\n  { 0,  0,  0,  0,  2,    0,    0,      0,   0,    0,   0 },  /* PT_SC */\n  { 0,  3,  6, 12,  0,    3,    1,      1,   0,    0,   0 },  /* PT_ALNUM */\n  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_SPACE */\n  { 0,  1,  7, 13,  0,    1,    3,      3,   1,    0,   0 },  /* PT_PXSPACE */\n  { 0,  0,  8, 14,  0,    0,    1,      1,   3,    0,   0 },  /* PT_WORD */\n  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   0 },  /* PT_CLIST */\n  { 0,  0,  0,  0,  0,    0,    0,      0,   0,    0,   3 }   /* PT_UCNC */\n};\n\n/* This table is used to check whether auto-possessification is possible\nbetween adjacent Unicode property opcodes (OP_PROP and OP_NOTPROP) when one\nspecifies a general category and the other specifies a particular category. The\nrow is selected by the general category and the column by the particular\ncategory. The value is 1 if the particular category is not part of the general\ncategory. */\n\nstatic const pcre_uint8 catposstab[7][30] = {\n/* Cc Cf Cn Co Cs Ll Lm Lo Lt Lu Mc Me Mn Nd Nl No Pc Pd Pe Pf Pi Po Ps Sc Sk Sm So Zl Zp Zs */\n  { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* C */\n  { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* L */\n  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* M */\n  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },  /* N */\n  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },  /* P */\n  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1 },  /* S */\n  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }   /* Z */\n};\n\n/* This table is used when checking ALNUM, (PX)SPACE, SPACE, and WORD against\na general or particular category. The properties in each row are those\nthat apply to the character set in question. Duplication means that a little\nunnecessary work is done when checking, but this keeps things much simpler\nbecause they can all use the same code. For more details see the comment where\nthis table is used.\n\nNote: SPACE and PXSPACE used to be different because Perl excluded VT from\n\"space\", but from Perl 5.18 it's included, so both categories are treated the\nsame here. */\n\nstatic const pcre_uint8 posspropstab[3][4] = {\n  { ucp_L, ucp_N, ucp_N, ucp_Nl },  /* ALNUM, 3rd and 4th values redundant */\n  { ucp_Z, ucp_Z, ucp_C, ucp_Cc },  /* SPACE and PXSPACE, 2nd value redundant */\n  { ucp_L, ucp_N, ucp_P, ucp_Po }   /* WORD */\n};\n\n/* This table is used when converting repeating opcodes into possessified\nversions as a result of an explicit possessive quantifier such as ++. A zero\nvalue means there is no possessified version - in those cases the item in\nquestion must be wrapped in ONCE brackets. The table is truncated at OP_CALLOUT\nbecause all relevant opcodes are less than that. */\n\nstatic const pcre_uint8 opcode_possessify[] = {\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 0 - 15  */\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 16 - 31 */\n\n  0,                       /* NOTI */\n  OP_POSSTAR, 0,           /* STAR, MINSTAR */\n  OP_POSPLUS, 0,           /* PLUS, MINPLUS */\n  OP_POSQUERY, 0,          /* QUERY, MINQUERY */\n  OP_POSUPTO, 0,           /* UPTO, MINUPTO */\n  0,                       /* EXACT */\n  0, 0, 0, 0,              /* POS{STAR,PLUS,QUERY,UPTO} */\n\n  OP_POSSTARI, 0,          /* STARI, MINSTARI */\n  OP_POSPLUSI, 0,          /* PLUSI, MINPLUSI */\n  OP_POSQUERYI, 0,         /* QUERYI, MINQUERYI */\n  OP_POSUPTOI, 0,          /* UPTOI, MINUPTOI */\n  0,                       /* EXACTI */\n  0, 0, 0, 0,              /* POS{STARI,PLUSI,QUERYI,UPTOI} */\n\n  OP_NOTPOSSTAR, 0,        /* NOTSTAR, NOTMINSTAR */\n  OP_NOTPOSPLUS, 0,        /* NOTPLUS, NOTMINPLUS */\n  OP_NOTPOSQUERY, 0,       /* NOTQUERY, NOTMINQUERY */\n  OP_NOTPOSUPTO, 0,        /* NOTUPTO, NOTMINUPTO */\n  0,                       /* NOTEXACT */\n  0, 0, 0, 0,              /* NOTPOS{STAR,PLUS,QUERY,UPTO} */\n\n  OP_NOTPOSSTARI, 0,       /* NOTSTARI, NOTMINSTARI */\n  OP_NOTPOSPLUSI, 0,       /* NOTPLUSI, NOTMINPLUSI */\n  OP_NOTPOSQUERYI, 0,      /* NOTQUERYI, NOTMINQUERYI */\n  OP_NOTPOSUPTOI, 0,       /* NOTUPTOI, NOTMINUPTOI */\n  0,                       /* NOTEXACTI */\n  0, 0, 0, 0,              /* NOTPOS{STARI,PLUSI,QUERYI,UPTOI} */\n\n  OP_TYPEPOSSTAR, 0,       /* TYPESTAR, TYPEMINSTAR */\n  OP_TYPEPOSPLUS, 0,       /* TYPEPLUS, TYPEMINPLUS */\n  OP_TYPEPOSQUERY, 0,      /* TYPEQUERY, TYPEMINQUERY */\n  OP_TYPEPOSUPTO, 0,       /* TYPEUPTO, TYPEMINUPTO */\n  0,                       /* TYPEEXACT */\n  0, 0, 0, 0,              /* TYPEPOS{STAR,PLUS,QUERY,UPTO} */\n\n  OP_CRPOSSTAR, 0,         /* CRSTAR, CRMINSTAR */\n  OP_CRPOSPLUS, 0,         /* CRPLUS, CRMINPLUS */\n  OP_CRPOSQUERY, 0,        /* CRQUERY, CRMINQUERY */\n  OP_CRPOSRANGE, 0,        /* CRRANGE, CRMINRANGE */\n  0, 0, 0, 0,              /* CRPOS{STAR,PLUS,QUERY,RANGE} */\n\n  0, 0, 0,                 /* CLASS, NCLASS, XCLASS */\n  0, 0,                    /* REF, REFI */\n  0, 0,                    /* DNREF, DNREFI */\n  0, 0                     /* RECURSE, CALLOUT */\n};\n\n\n\n/*************************************************\n*            Find an error text                  *\n*************************************************/\n\n/* The error texts are now all in one long string, to save on relocations. As\nsome of the text is of unknown length, we can't use a table of offsets.\nInstead, just count through the strings. This is not a performance issue\nbecause it happens only when there has been a compilation error.\n\nArgument:   the error number\nReturns:    pointer to the error string\n*/\n\nstatic const char *\nfind_error_text(int n)\n{\nconst char *s = error_texts;\nfor (; n > 0; n--)\n  {\n  while (*s++ != CHAR_NULL) {};\n  if (*s == CHAR_NULL) return \"Error text not found (please report)\";\n  }\nreturn s;\n}\n\n\n\n/*************************************************\n*           Expand the workspace                 *\n*************************************************/\n\n/* This function is called during the second compiling phase, if the number of\nforward references fills the existing workspace, which is originally a block on\nthe stack. A larger block is obtained from malloc() unless the ultimate limit\nhas been reached or the increase will be rather small.\n\nArgument: pointer to the compile data block\nReturns:  0 if all went well, else an error number\n*/\n\nstatic int\nexpand_workspace(compile_data *cd)\n{\npcre_uchar *newspace;\nint newsize = cd->workspace_size * 2;\n\nif (newsize > COMPILE_WORK_SIZE_MAX) newsize = COMPILE_WORK_SIZE_MAX;\nif (cd->workspace_size >= COMPILE_WORK_SIZE_MAX ||\n    newsize - cd->workspace_size < WORK_SIZE_SAFETY_MARGIN)\n return ERR72;\n\nnewspace = (PUBL(malloc))(IN_UCHARS(newsize));\nif (newspace == NULL) return ERR21;\nmemcpy(newspace, cd->start_workspace, cd->workspace_size * sizeof(pcre_uchar));\ncd->hwm = (pcre_uchar *)newspace + (cd->hwm - cd->start_workspace);\nif (cd->workspace_size > COMPILE_WORK_SIZE)\n  (PUBL(free))((void *)cd->start_workspace);\ncd->start_workspace = newspace;\ncd->workspace_size = newsize;\nreturn 0;\n}\n\n\n\n/*************************************************\n*            Check for counted repeat            *\n*************************************************/\n\n/* This function is called when a '{' is encountered in a place where it might\nstart a quantifier. It looks ahead to see if it really is a quantifier or not.\nIt is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}\nwhere the ddds are digits.\n\nArguments:\n  p         pointer to the first char after '{'\n\nReturns:    TRUE or FALSE\n*/\n\nstatic BOOL\nis_counted_repeat(const pcre_uchar *p)\n{\nif (!IS_DIGIT(*p)) return FALSE;\np++;\nwhile (IS_DIGIT(*p)) p++;\nif (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;\n\nif (*p++ != CHAR_COMMA) return FALSE;\nif (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE;\n\nif (!IS_DIGIT(*p)) return FALSE;\np++;\nwhile (IS_DIGIT(*p)) p++;\n\nreturn (*p == CHAR_RIGHT_CURLY_BRACKET);\n}\n\n\n\n/*************************************************\n*            Handle escapes                      *\n*************************************************/\n\n/* This function is called when a \\ has been encountered. It either returns a\npositive value for a simple escape such as \\n, or 0 for a data character which\nwill be placed in chptr. A backreference to group n is returned as negative n.\nWhen UTF-8 is enabled, a positive value greater than 255 may be returned in\nchptr. On entry, ptr is pointing at the \\. On exit, it is on the final\ncharacter of the escape sequence.\n\nArguments:\n  ptrptr         points to the pattern position pointer\n  chptr          points to a returned data character\n  errorcodeptr   points to the errorcode variable\n  bracount       number of previous extracting brackets\n  options        the options bits\n  isclass        TRUE if inside a character class\n\nReturns:         zero => a data character\n                 positive => a special escape sequence\n                 negative => a back reference\n                 on error, errorcodeptr is set\n*/\n\nstatic int\ncheck_escape(const pcre_uchar **ptrptr, pcre_uint32 *chptr, int *errorcodeptr,\n  int bracount, int options, BOOL isclass)\n{\n/* PCRE_UTF16 has the same value as PCRE_UTF8. */\nBOOL utf = (options & PCRE_UTF8) != 0;\nconst pcre_uchar *ptr = *ptrptr + 1;\npcre_uint32 c;\nint escape = 0;\nint i;\n\nGETCHARINCTEST(c, ptr);           /* Get character value, increment pointer */\nptr--;                            /* Set pointer back to the last byte */\n\n/* If backslash is at the end of the pattern, it's an error. */\n\nif (c == CHAR_NULL) *errorcodeptr = ERR1;\n\n/* Non-alphanumerics are literals. For digits or letters, do an initial lookup\nin a table. A non-zero result is something that can be returned immediately.\nOtherwise further processing may be required. */\n\n#ifndef EBCDIC  /* ASCII/UTF-8 coding */\n/* Not alphanumeric */\nelse if (c < CHAR_0 || c > CHAR_z) {}\nelse if ((i = escapes[c - CHAR_0]) != 0)\n  { if (i > 0) c = (pcre_uint32)i; else escape = -i; }\n\n#else           /* EBCDIC coding */\n/* Not alphanumeric */\nelse if (c < CHAR_a || (!MAX_255(c) || (ebcdic_chartab[c] & 0x0E) == 0)) {}\nelse if ((i = escapes[c - 0x48]) != 0)  { if (i > 0) c = (pcre_uint32)i; else escape = -i; }\n#endif\n\n/* Escapes that need further processing, or are illegal. */\n\nelse\n  {\n  const pcre_uchar *oldptr;\n  BOOL braced, negated, overflow;\n  int s;\n\n  switch (c)\n    {\n    /* A number of Perl escapes are not handled by PCRE. We give an explicit\n    error. */\n\n    case CHAR_l:\n    case CHAR_L:\n    *errorcodeptr = ERR37;\n    break;\n\n    case CHAR_u:\n    if ((options & PCRE_JAVASCRIPT_COMPAT) != 0)\n      {\n      /* In JavaScript, \\u must be followed by four hexadecimal numbers.\n      Otherwise it is a lowercase u letter. */\n      if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0\n        && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0\n        && MAX_255(ptr[3]) && (digitab[ptr[3]] & ctype_xdigit) != 0\n        && MAX_255(ptr[4]) && (digitab[ptr[4]] & ctype_xdigit) != 0)\n        {\n        c = 0;\n        for (i = 0; i < 4; ++i)\n          {\n          register pcre_uint32 cc = *(++ptr);\n#ifndef EBCDIC  /* ASCII/UTF-8 coding */\n          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */\n          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));\n#else           /* EBCDIC coding */\n          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */\n          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));\n#endif\n          }\n\n#if defined COMPILE_PCRE8\n        if (c > (utf ? 0x10ffffU : 0xffU))\n#elif defined COMPILE_PCRE16\n        if (c > (utf ? 0x10ffffU : 0xffffU))\n#elif defined COMPILE_PCRE32\n        if (utf && c > 0x10ffffU)\n#endif\n          {\n          *errorcodeptr = ERR76;\n          }\n        else if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;\n        }\n      }\n    else\n      *errorcodeptr = ERR37;\n    break;\n\n    case CHAR_U:\n    /* In JavaScript, \\U is an uppercase U letter. */\n    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) *errorcodeptr = ERR37;\n    break;\n\n    /* In a character class, \\g is just a literal \"g\". Outside a character\n    class, \\g must be followed by one of a number of specific things:\n\n    (1) A number, either plain or braced. If positive, it is an absolute\n    backreference. If negative, it is a relative backreference. This is a Perl\n    5.10 feature.\n\n    (2) Perl 5.10 also supports \\g{name} as a reference to a named group. This\n    is part of Perl's movement towards a unified syntax for back references. As\n    this is synonymous with \\k{name}, we fudge it up by pretending it really\n    was \\k.\n\n    (3) For Oniguruma compatibility we also support \\g followed by a name or a\n    number either in angle brackets or in single quotes. However, these are\n    (possibly recursive) subroutine calls, _not_ backreferences. Just return\n    the ESC_g code (cf \\k). */\n\n    case CHAR_g:\n    if (isclass) break;\n    if (ptr[1] == CHAR_LESS_THAN_SIGN || ptr[1] == CHAR_APOSTROPHE)\n      {\n      escape = ESC_g;\n      break;\n      }\n\n    /* Handle the Perl-compatible cases */\n\n    if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)\n      {\n      const pcre_uchar *p;\n      for (p = ptr+2; *p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET; p++)\n        if (*p != CHAR_MINUS && !IS_DIGIT(*p)) break;\n      if (*p != CHAR_NULL && *p != CHAR_RIGHT_CURLY_BRACKET)\n        {\n        escape = ESC_k;\n        break;\n        }\n      braced = TRUE;\n      ptr++;\n      }\n    else braced = FALSE;\n\n    if (ptr[1] == CHAR_MINUS)\n      {\n      negated = TRUE;\n      ptr++;\n      }\n    else negated = FALSE;\n\n    /* The integer range is limited by the machine's int representation. */\n    s = 0;\n    overflow = FALSE;\n    while (IS_DIGIT(ptr[1]))\n      {\n      if (s > INT_MAX / 10 - 1) /* Integer overflow */\n        {\n        overflow = TRUE;\n        break;\n        }\n      s = s * 10 + (int)(*(++ptr) - CHAR_0);\n      }\n    if (overflow) /* Integer overflow */\n      {\n      while (IS_DIGIT(ptr[1]))\n        ptr++;\n      *errorcodeptr = ERR61;\n      break;\n      }\n\n    if (braced && *(++ptr) != CHAR_RIGHT_CURLY_BRACKET)\n      {\n      *errorcodeptr = ERR57;\n      break;\n      }\n\n    if (s == 0)\n      {\n      *errorcodeptr = ERR58;\n      break;\n      }\n\n    if (negated)\n      {\n      if (s > bracount)\n        {\n        *errorcodeptr = ERR15;\n        break;\n        }\n      s = bracount - (s - 1);\n      }\n\n    escape = -s;\n    break;\n\n    /* The handling of escape sequences consisting of a string of digits\n    starting with one that is not zero is not straightforward. Perl has changed\n    over the years. Nowadays \\g{} for backreferences and \\o{} for octal are\n    recommended to avoid the ambiguities in the old syntax.\n\n    Outside a character class, the digits are read as a decimal number. If the\n    number is less than 8 (used to be 10), or if there are that many previous\n    extracting left brackets, then it is a back reference. Otherwise, up to\n    three octal digits are read to form an escaped byte. Thus \\123 is likely to\n    be octal 123 (cf \\0123, which is octal 012 followed by the literal 3). If\n    the octal value is greater than 377, the least significant 8 bits are\n    taken. \\8 and \\9 are treated as the literal characters 8 and 9.\n\n    Inside a character class, \\ followed by a digit is always either a literal\n    8 or 9 or an octal number. */\n\n    case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5:\n    case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:\n\n    if (!isclass)\n      {\n      oldptr = ptr;\n      /* The integer range is limited by the machine's int representation. */\n      s = (int)(c -CHAR_0);\n      overflow = FALSE;\n      while (IS_DIGIT(ptr[1]))\n        {\n        if (s > INT_MAX / 10 - 1) /* Integer overflow */\n          {\n          overflow = TRUE;\n          break;\n          }\n        s = s * 10 + (int)(*(++ptr) - CHAR_0);\n        }\n      if (overflow) /* Integer overflow */\n        {\n        while (IS_DIGIT(ptr[1]))\n          ptr++;\n        *errorcodeptr = ERR61;\n        break;\n        }\n      if (s < 8 || s <= bracount)  /* Check for back reference */\n        {\n        escape = -s;\n        break;\n        }\n      ptr = oldptr;      /* Put the pointer back and fall through */\n      }\n\n    /* Handle a digit following \\ when the number is not a back reference. If\n    the first digit is 8 or 9, Perl used to generate a binary zero byte and\n    then treat the digit as a following literal. At least by Perl 5.18 this\n    changed so as not to insert the binary zero. */\n\n    if ((c = *ptr) >= CHAR_8) break;\n\n    /* Fall through with a digit less than 8 */\n\n    /* \\0 always starts an octal number, but we may drop through to here with a\n    larger first octal digit. The original code used just to take the least\n    significant 8 bits of octal numbers (I think this is what early Perls used\n    to do). Nowadays we allow for larger numbers in UTF-8 mode and 16-bit mode,\n    but no more than 3 octal digits. */\n\n    case CHAR_0:\n    c -= CHAR_0;\n    while(i++ < 2 && ptr[1] >= CHAR_0 && ptr[1] <= CHAR_7)\n        c = c * 8 + *(++ptr) - CHAR_0;\n#ifdef COMPILE_PCRE8\n    if (!utf && c > 0xff) *errorcodeptr = ERR51;\n#endif\n    break;\n\n    /* \\o is a relatively new Perl feature, supporting a more general way of\n    specifying character codes in octal. The only supported form is \\o{ddd}. */\n\n    case CHAR_o:\n    if (ptr[1] != CHAR_LEFT_CURLY_BRACKET) *errorcodeptr = ERR81; else\n    if (ptr[2] == CHAR_RIGHT_CURLY_BRACKET) *errorcodeptr = ERR86; else\n      {\n      ptr += 2;\n      c = 0;\n      overflow = FALSE;\n      while (*ptr >= CHAR_0 && *ptr <= CHAR_7)\n        {\n        register pcre_uint32 cc = *ptr++;\n        if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */\n#ifdef COMPILE_PCRE32\n        if (c >= 0x20000000l) { overflow = TRUE; break; }\n#endif\n        c = (c << 3) + cc - CHAR_0 ;\n#if defined COMPILE_PCRE8\n        if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }\n#elif defined COMPILE_PCRE16\n        if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }\n#elif defined COMPILE_PCRE32\n        if (utf && c > 0x10ffffU) { overflow = TRUE; break; }\n#endif\n        }\n      if (overflow)\n        {\n        while (*ptr >= CHAR_0 && *ptr <= CHAR_7) ptr++;\n        *errorcodeptr = ERR34;\n        }\n      else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)\n        {\n        if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;\n        }\n      else *errorcodeptr = ERR80;\n      }\n    break;\n\n    /* \\x is complicated. In JavaScript, \\x must be followed by two hexadecimal\n    numbers. Otherwise it is a lowercase x letter. */\n\n    case CHAR_x:\n    if ((options & PCRE_JAVASCRIPT_COMPAT) != 0)\n      {\n      if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0\n        && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0)\n        {\n        c = 0;\n        for (i = 0; i < 2; ++i)\n          {\n          register pcre_uint32 cc = *(++ptr);\n#ifndef EBCDIC  /* ASCII/UTF-8 coding */\n          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */\n          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));\n#else           /* EBCDIC coding */\n          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */\n          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));\n#endif\n          }\n        }\n      }    /* End JavaScript handling */\n\n    /* Handle \\x in Perl's style. \\x{ddd} is a character number which can be\n    greater than 0xff in utf or non-8bit mode, but only if the ddd are hex\n    digits. If not, { used to be treated as a data character. However, Perl\n    seems to read hex digits up to the first non-such, and ignore the rest, so\n    that, for example \\x{zz} matches a binary zero. This seems crazy, so PCRE\n    now gives an error. */\n\n    else\n      {\n      if (ptr[1] == CHAR_LEFT_CURLY_BRACKET)\n        {\n        ptr += 2;\n        if (*ptr == CHAR_RIGHT_CURLY_BRACKET)\n          {\n          *errorcodeptr = ERR86;\n          break;\n          }\n        c = 0;\n        overflow = FALSE;\n        while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0)\n          {\n          register pcre_uint32 cc = *ptr++;\n          if (c == 0 && cc == CHAR_0) continue;     /* Leading zeroes */\n\n#ifdef COMPILE_PCRE32\n          if (c >= 0x10000000l) { overflow = TRUE; break; }\n#endif\n\n#ifndef EBCDIC  /* ASCII/UTF-8 coding */\n          if (cc >= CHAR_a) cc -= 32;               /* Convert to upper case */\n          c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));\n#else           /* EBCDIC coding */\n          if (cc >= CHAR_a && cc <= CHAR_z) cc += 64;  /* Convert to upper case */\n          c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));\n#endif\n\n#if defined COMPILE_PCRE8\n          if (c > (utf ? 0x10ffffU : 0xffU)) { overflow = TRUE; break; }\n#elif defined COMPILE_PCRE16\n          if (c > (utf ? 0x10ffffU : 0xffffU)) { overflow = TRUE; break; }\n#elif defined COMPILE_PCRE32\n          if (utf && c > 0x10ffffU) { overflow = TRUE; break; }\n#endif\n          }\n\n        if (overflow)\n          {\n          while (MAX_255(*ptr) && (digitab[*ptr] & ctype_xdigit) != 0) ptr++;\n          *errorcodeptr = ERR34;\n          }\n\n        else if (*ptr == CHAR_RIGHT_CURLY_BRACKET)\n          {\n          if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73;\n          }\n\n        /* If the sequence of hex digits does not end with '}', give an error.\n        We used just to recognize this construct and fall through to the normal\n        \\x handling, but nowadays Perl gives an error, which seems much more\n        sensible, so we do too. */\n\n        else *errorcodeptr = ERR79;\n        }   /* End of \\x{} processing */\n\n      /* Read a single-byte hex-defined char (up to two hex digits after \\x) */\n\n      else\n        {\n        c = 0;\n        while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0)\n          {\n          pcre_uint32 cc;                          /* Some compilers don't like */\n          cc = *(++ptr);                           /* ++ in initializers */\n#ifndef EBCDIC  /* ASCII/UTF-8 coding */\n          if (cc >= CHAR_a) cc -= 32;              /* Convert to upper case */\n          c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10));\n#else           /* EBCDIC coding */\n          if (cc <= CHAR_z) cc += 64;              /* Convert to upper case */\n          c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10));\n#endif\n          }\n        }     /* End of \\xdd handling */\n      }       /* End of Perl-style \\x handling */\n    break;\n\n    /* For \\c, a following letter is upper-cased; then the 0x40 bit is flipped.\n    An error is given if the byte following \\c is not an ASCII character. This\n    coding is ASCII-specific, but then the whole concept of \\cx is\n    ASCII-specific. (However, an EBCDIC equivalent has now been added.) */\n\n    case CHAR_c:\n    c = *(++ptr);\n    if (c == CHAR_NULL)\n      {\n      *errorcodeptr = ERR2;\n      break;\n      }\n#ifndef EBCDIC    /* ASCII/UTF-8 coding */\n    if (c > 127)  /* Excludes all non-ASCII in either mode */\n      {\n      *errorcodeptr = ERR68;\n      break;\n      }\n    if (c >= CHAR_a && c <= CHAR_z) c -= 32;\n    c ^= 0x40;\n#else             /* EBCDIC coding */\n    if (c >= CHAR_a && c <= CHAR_z) c += 64;\n    if (c == CHAR_QUESTION_MARK)\n      c = ('\\\\' == 188 && '`' == 74)? 0x5f : 0xff;\n    else\n      {\n      for (i = 0; i < 32; i++)\n        {\n        if (c == ebcdic_escape_c[i]) break;\n        }\n      if (i < 32) c = i; else *errorcodeptr = ERR68;\n      }\n#endif\n    break;\n\n    /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any\n    other alphanumeric following \\ is an error if PCRE_EXTRA was set;\n    otherwise, for Perl compatibility, it is a literal. This code looks a bit\n    odd, but there used to be some cases other than the default, and there may\n    be again in future, so I haven't \"optimized\" it. */\n\n    default:\n    if ((options & PCRE_EXTRA) != 0) switch(c)\n      {\n      default:\n      *errorcodeptr = ERR3;\n      break;\n      }\n    break;\n    }\n  }\n\n/* Perl supports \\N{name} for character names, as well as plain \\N for \"not\nnewline\". PCRE does not support \\N{name}. However, it does support\nquantification such as \\N{2,3}. */\n\nif (escape == ESC_N && ptr[1] == CHAR_LEFT_CURLY_BRACKET &&\n     !is_counted_repeat(ptr+2))\n  *errorcodeptr = ERR37;\n\n/* If PCRE_UCP is set, we change the values for \\d etc. */\n\nif ((options & PCRE_UCP) != 0 && escape >= ESC_D && escape <= ESC_w)\n  escape += (ESC_DU - ESC_D);\n\n/* Set the pointer to the final character before returning. */\n\n*ptrptr = ptr;\n*chptr = c;\nreturn escape;\n}\n\n\n\n#ifdef SUPPORT_UCP\n/*************************************************\n*               Handle \\P and \\p                 *\n*************************************************/\n\n/* This function is called after \\P or \\p has been encountered, provided that\nPCRE is compiled with support for Unicode properties. On entry, ptrptr is\npointing at the P or p. On exit, it is pointing at the final character of the\nescape sequence.\n\nArgument:\n  ptrptr         points to the pattern position pointer\n  negptr         points to a boolean that is set TRUE for negation else FALSE\n  ptypeptr       points to an unsigned int that is set to the type value\n  pdataptr       points to an unsigned int that is set to the detailed property value\n  errorcodeptr   points to the error code variable\n\nReturns:         TRUE if the type value was found, or FALSE for an invalid type\n*/\n\nstatic BOOL\nget_ucp(const pcre_uchar **ptrptr, BOOL *negptr, unsigned int *ptypeptr,\n  unsigned int *pdataptr, int *errorcodeptr)\n{\npcre_uchar c;\nint i, bot, top;\nconst pcre_uchar *ptr = *ptrptr;\npcre_uchar name[32];\n\nc = *(++ptr);\nif (c == CHAR_NULL) goto ERROR_RETURN;\n\n*negptr = FALSE;\n\n/* \\P or \\p can be followed by a name in {}, optionally preceded by ^ for\nnegation. */\n\nif (c == CHAR_LEFT_CURLY_BRACKET)\n  {\n  if (ptr[1] == CHAR_CIRCUMFLEX_ACCENT)\n    {\n    *negptr = TRUE;\n    ptr++;\n    }\n  for (i = 0; i < (int)(sizeof(name) / sizeof(pcre_uchar)) - 1; i++)\n    {\n    c = *(++ptr);\n    if (c == CHAR_NULL) goto ERROR_RETURN;\n    if (c == CHAR_RIGHT_CURLY_BRACKET) break;\n    name[i] = c;\n    }\n  if (c != CHAR_RIGHT_CURLY_BRACKET) goto ERROR_RETURN;\n  name[i] = 0;\n  }\n\n/* Otherwise there is just one following character */\n\nelse\n  {\n  name[0] = c;\n  name[1] = 0;\n  }\n\n*ptrptr = ptr;\n\n/* Search for a recognized property name using binary chop */\n\nbot = 0;\ntop = PRIV(utt_size);\n\nwhile (bot < top)\n  {\n  int r;\n  i = (bot + top) >> 1;\n  r = STRCMP_UC_C8(name, PRIV(utt_names) + PRIV(utt)[i].name_offset);\n  if (r == 0)\n    {\n    *ptypeptr = PRIV(utt)[i].type;\n    *pdataptr = PRIV(utt)[i].value;\n    return TRUE;\n    }\n  if (r > 0) bot = i + 1; else top = i;\n  }\n\n*errorcodeptr = ERR47;\n*ptrptr = ptr;\nreturn FALSE;\n\nERROR_RETURN:\n*errorcodeptr = ERR46;\n*ptrptr = ptr;\nreturn FALSE;\n}\n#endif\n\n\n\n/*************************************************\n*         Read repeat counts                     *\n*************************************************/\n\n/* Read an item of the form {n,m} and return the values. This is called only\nafter is_counted_repeat() has confirmed that a repeat-count quantifier exists,\nso the syntax is guaranteed to be correct, but we need to check the values.\n\nArguments:\n  p              pointer to first char after '{'\n  minp           pointer to int for min\n  maxp           pointer to int for max\n                 returned as -1 if no max\n  errorcodeptr   points to error code variable\n\nReturns:         pointer to '}' on success;\n                 current ptr on error, with errorcodeptr set non-zero\n*/\n\nstatic const pcre_uchar *\nread_repeat_counts(const pcre_uchar *p, int *minp, int *maxp, int *errorcodeptr)\n{\nint min = 0;\nint max = -1;\n\nwhile (IS_DIGIT(*p))\n  {\n  min = min * 10 + (int)(*p++ - CHAR_0);\n  if (min > 65535)\n    {\n    *errorcodeptr = ERR5;\n    return p;\n    }\n  }\n\nif (*p == CHAR_RIGHT_CURLY_BRACKET) max = min; else\n  {\n  if (*(++p) != CHAR_RIGHT_CURLY_BRACKET)\n    {\n    max = 0;\n    while(IS_DIGIT(*p))\n      {\n      max = max * 10 + (int)(*p++ - CHAR_0);\n      if (max > 65535)\n        {\n        *errorcodeptr = ERR5;\n        return p;\n        }\n      }\n    if (max < min)\n      {\n      *errorcodeptr = ERR4;\n      return p;\n      }\n    }\n  }\n\n*minp = min;\n*maxp = max;\nreturn p;\n}\n\n\n\n/*************************************************\n*      Find first significant op code            *\n*************************************************/\n\n/* This is called by several functions that scan a compiled expression looking\nfor a fixed first character, or an anchoring op code etc. It skips over things\nthat do not influence this. For some calls, it makes sense to skip negative\nforward and all backward assertions, and also the \\b assertion; for others it\ndoes not.\n\nArguments:\n  code         pointer to the start of the group\n  skipassert   TRUE if certain assertions are to be skipped\n\nReturns:       pointer to the first significant opcode\n*/\n\nstatic const pcre_uchar*\nfirst_significant_code(const pcre_uchar *code, BOOL skipassert)\n{\nfor (;;)\n  {\n  switch ((int)*code)\n    {\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    if (!skipassert) return code;\n    do code += GET(code, 1); while (*code == OP_ALT);\n    code += PRIV(OP_lengths)[*code];\n    break;\n\n    case OP_WORD_BOUNDARY:\n    case OP_NOT_WORD_BOUNDARY:\n    if (!skipassert) return code;\n    /* Fall through */\n\n    case OP_CALLOUT:\n    case OP_CREF:\n    case OP_DNCREF:\n    case OP_RREF:\n    case OP_DNRREF:\n    case OP_DEF:\n    code += PRIV(OP_lengths)[*code];\n    break;\n\n    default:\n    return code;\n    }\n  }\n/* Control never reaches here */\n}\n\n\n\n/*************************************************\n*        Find the fixed length of a branch       *\n*************************************************/\n\n/* Scan a branch and compute the fixed length of subject that will match it,\nif the length is fixed. This is needed for dealing with backward assertions.\nIn UTF8 mode, the result is in characters rather than bytes. The branch is\ntemporarily terminated with OP_END when this function is called.\n\nThis function is called when a backward assertion is encountered, so that if it\nfails, the error message can point to the correct place in the pattern.\nHowever, we cannot do this when the assertion contains subroutine calls,\nbecause they can be forward references. We solve this by remembering this case\nand doing the check at the end; a flag specifies which mode we are running in.\n\nArguments:\n  code     points to the start of the pattern (the bracket)\n  utf      TRUE in UTF-8 / UTF-16 / UTF-32 mode\n  atend    TRUE if called when the pattern is complete\n  cd       the \"compile data\" structure\n  recurses    chain of recurse_check to catch mutual recursion\n\nReturns:   the fixed length,\n             or -1 if there is no fixed length,\n             or -2 if \\C was encountered (in UTF-8 mode only)\n             or -3 if an OP_RECURSE item was encountered and atend is FALSE\n             or -4 if an unknown opcode was encountered (internal error)\n*/\n\nstatic int\nfind_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd,\n  recurse_check *recurses)\n{\nint length = -1;\nrecurse_check this_recurse;\nregister int branchlength = 0;\nregister pcre_uchar *cc = code + 1 + LINK_SIZE;\n\n/* Scan along the opcodes for this branch. If we get to the end of the\nbranch, check the length against that of the other branches. */\n\nfor (;;)\n  {\n  int d;\n  pcre_uchar *ce, *cs;\n  register pcre_uchar op = *cc;\n\n  switch (op)\n    {\n    /* We only need to continue for OP_CBRA (normal capturing bracket) and\n    OP_BRA (normal non-capturing bracket) because the other variants of these\n    opcodes are all concerned with unlimited repeated groups, which of course\n    are not of fixed length. */\n\n    case OP_CBRA:\n    case OP_BRA:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_COND:\n    d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd,\n      recurses);\n    if (d < 0) return d;\n    branchlength += d;\n    do cc += GET(cc, 1); while (*cc == OP_ALT);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* Reached end of a branch; if it's a ket it is the end of a nested call.\n    If it's ALT it is an alternation in a nested call. An ACCEPT is effectively\n    an ALT. If it is END it's the end of the outer call. All can be handled by\n    the same code. Note that we must not include the OP_KETRxxx opcodes here,\n    because they all imply an unlimited repeat. */\n\n    case OP_ALT:\n    case OP_KET:\n    case OP_END:\n    case OP_ACCEPT:\n    case OP_ASSERT_ACCEPT:\n    if (length < 0) length = branchlength;\n      else if (length != branchlength) return -1;\n    if (*cc != OP_ALT) return length;\n    cc += 1 + LINK_SIZE;\n    branchlength = 0;\n    break;\n\n    /* A true recursion implies not fixed length, but a subroutine call may\n    be OK. If the subroutine is a forward reference, we can't deal with\n    it until the end of the pattern, so return -3. */\n\n    case OP_RECURSE:\n    if (!atend) return -3;\n    cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1);  /* Start subpattern */\n    do ce += GET(ce, 1); while (*ce == OP_ALT);           /* End subpattern */\n    if (cc > cs && cc < ce) return -1;                    /* Recursion */\n    else   /* Check for mutual recursion */\n      {\n      recurse_check *r = recurses;\n      for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;\n      if (r != NULL) return -1;   /* Mutual recursion */\n      }\n    this_recurse.prev = recurses;\n    this_recurse.group = cs;\n    d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd, &this_recurse);\n    if (d < 0) return d;\n    branchlength += d;\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* Skip over assertive subpatterns */\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    do cc += GET(cc, 1); while (*cc == OP_ALT);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* Skip over things that don't match chars */\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_SKIP_ARG:\n    case OP_THEN_ARG:\n    cc += cc[1] + PRIV(OP_lengths)[*cc];\n    break;\n\n    case OP_CALLOUT:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_CLOSE:\n    case OP_COMMIT:\n    case OP_CREF:\n    case OP_DEF:\n    case OP_DNCREF:\n    case OP_DNRREF:\n    case OP_DOLL:\n    case OP_DOLLM:\n    case OP_EOD:\n    case OP_EODN:\n    case OP_FAIL:\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_PRUNE:\n    case OP_REVERSE:\n    case OP_RREF:\n    case OP_SET_SOM:\n    case OP_SKIP:\n    case OP_SOD:\n    case OP_SOM:\n    case OP_THEN:\n    case OP_WORD_BOUNDARY:\n    cc += PRIV(OP_lengths)[*cc];\n    break;\n\n    /* Handle literal characters */\n\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n    branchlength++;\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    /* Handle exact repetitions. The count is already in characters, but we\n    need to skip over a multibyte character in UTF8 mode.  */\n\n    case OP_EXACT:\n    case OP_EXACTI:\n    case OP_NOTEXACT:\n    case OP_NOTEXACTI:\n    branchlength += (int)GET2(cc,1);\n    cc += 2 + IMM2_SIZE;\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    case OP_TYPEEXACT:\n    branchlength += GET2(cc,1);\n    if (cc[1 + IMM2_SIZE] == OP_PROP || cc[1 + IMM2_SIZE] == OP_NOTPROP)\n      cc += 2;\n    cc += 1 + IMM2_SIZE + 1;\n    break;\n\n    /* Handle single-char matchers */\n\n    case OP_PROP:\n    case OP_NOTPROP:\n    cc += 2;\n    /* Fall through */\n\n    case OP_HSPACE:\n    case OP_VSPACE:\n    case OP_NOT_HSPACE:\n    case OP_NOT_VSPACE:\n    case OP_NOT_DIGIT:\n    case OP_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_WORDCHAR:\n    case OP_ANY:\n    case OP_ALLANY:\n    branchlength++;\n    cc++;\n    break;\n\n    /* The single-byte matcher isn't allowed. This only happens in UTF-8 mode;\n    otherwise \\C is coded as OP_ALLANY. */\n\n    case OP_ANYBYTE:\n    return -2;\n\n    /* Check a class for variable quantification */\n\n    case OP_CLASS:\n    case OP_NCLASS:\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n    case OP_XCLASS:\n    /* The original code caused an unsigned overflow in 64 bit systems,\n    so now we use a conditional statement. */\n    if (op == OP_XCLASS)\n      cc += GET(cc, 1);\n    else\n      cc += PRIV(OP_lengths)[OP_CLASS];\n#else\n    cc += PRIV(OP_lengths)[OP_CLASS];\n#endif\n\n    switch (*cc)\n      {\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRPLUS:\n      case OP_CRMINPLUS:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSSTAR:\n      case OP_CRPOSPLUS:\n      case OP_CRPOSQUERY:\n      return -1;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      if (GET2(cc,1) != GET2(cc,1+IMM2_SIZE)) return -1;\n      branchlength += (int)GET2(cc,1);\n      cc += 1 + 2 * IMM2_SIZE;\n      break;\n\n      default:\n      branchlength++;\n      }\n    break;\n\n    /* Anything else is variable length */\n\n    case OP_ANYNL:\n    case OP_BRAMINZERO:\n    case OP_BRAPOS:\n    case OP_BRAPOSZERO:\n    case OP_BRAZERO:\n    case OP_CBRAPOS:\n    case OP_EXTUNI:\n    case OP_KETRMAX:\n    case OP_KETRMIN:\n    case OP_KETRPOS:\n    case OP_MINPLUS:\n    case OP_MINPLUSI:\n    case OP_MINQUERY:\n    case OP_MINQUERYI:\n    case OP_MINSTAR:\n    case OP_MINSTARI:\n    case OP_MINUPTO:\n    case OP_MINUPTOI:\n    case OP_NOTMINPLUS:\n    case OP_NOTMINPLUSI:\n    case OP_NOTMINQUERY:\n    case OP_NOTMINQUERYI:\n    case OP_NOTMINSTAR:\n    case OP_NOTMINSTARI:\n    case OP_NOTMINUPTO:\n    case OP_NOTMINUPTOI:\n    case OP_NOTPLUS:\n    case OP_NOTPLUSI:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSUPTO:\n    case OP_NOTPOSUPTOI:\n    case OP_NOTQUERY:\n    case OP_NOTQUERYI:\n    case OP_NOTSTAR:\n    case OP_NOTSTARI:\n    case OP_NOTUPTO:\n    case OP_NOTUPTOI:\n    case OP_PLUS:\n    case OP_PLUSI:\n    case OP_POSPLUS:\n    case OP_POSPLUSI:\n    case OP_POSQUERY:\n    case OP_POSQUERYI:\n    case OP_POSSTAR:\n    case OP_POSSTARI:\n    case OP_POSUPTO:\n    case OP_POSUPTOI:\n    case OP_QUERY:\n    case OP_QUERYI:\n    case OP_REF:\n    case OP_REFI:\n    case OP_DNREF:\n    case OP_DNREFI:\n    case OP_SBRA:\n    case OP_SBRAPOS:\n    case OP_SCBRA:\n    case OP_SCBRAPOS:\n    case OP_SCOND:\n    case OP_SKIPZERO:\n    case OP_STAR:\n    case OP_STARI:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEPLUS:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEPOSQUERY:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSUPTO:\n    case OP_TYPEQUERY:\n    case OP_TYPESTAR:\n    case OP_TYPEUPTO:\n    case OP_UPTO:\n    case OP_UPTOI:\n    return -1;\n\n    /* Catch unrecognized opcodes so that when new ones are added they\n    are not forgotten, as has happened in the past. */\n\n    default:\n    return -4;\n    }\n  }\n/* Control never gets here */\n}\n\n\n\n/*************************************************\n*    Scan compiled regex for specific bracket    *\n*************************************************/\n\n/* This little function scans through a compiled pattern until it finds a\ncapturing bracket with the given number, or, if the number is negative, an\ninstance of OP_REVERSE for a lookbehind. The function is global in the C sense\nso that it can be called from pcre_study() when finding the minimum matching\nlength.\n\nArguments:\n  code        points to start of expression\n  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode\n  number      the required bracket number or negative to find a lookbehind\n\nReturns:      pointer to the opcode for the bracket, or NULL if not found\n*/\n\nconst pcre_uchar *\nPRIV(find_bracket)(const pcre_uchar *code, BOOL utf, int number)\n{\nfor (;;)\n  {\n  register pcre_uchar c = *code;\n\n  if (c == OP_END) return NULL;\n\n  /* XCLASS is used for classes that cannot be represented just by a bit\n  map. This includes negated single high-valued characters. The length in\n  the table is zero; the actual length is stored in the compiled code. */\n\n  if (c == OP_XCLASS) code += GET(code, 1);\n\n  /* Handle recursion */\n\n  else if (c == OP_REVERSE)\n    {\n    if (number < 0) return (pcre_uchar *)code;\n    code += PRIV(OP_lengths)[c];\n    }\n\n  /* Handle capturing bracket */\n\n  else if (c == OP_CBRA || c == OP_SCBRA ||\n           c == OP_CBRAPOS || c == OP_SCBRAPOS)\n    {\n    int n = (int)GET2(code, 1+LINK_SIZE);\n    if (n == number) return (pcre_uchar *)code;\n    code += PRIV(OP_lengths)[c];\n    }\n\n  /* Otherwise, we can get the item's length from the table, except that for\n  repeated character types, we have to test for \\p and \\P, which have an extra\n  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we\n  must add in its length. */\n\n  else\n    {\n    switch(c)\n      {\n      case OP_TYPESTAR:\n      case OP_TYPEMINSTAR:\n      case OP_TYPEPLUS:\n      case OP_TYPEMINPLUS:\n      case OP_TYPEQUERY:\n      case OP_TYPEMINQUERY:\n      case OP_TYPEPOSSTAR:\n      case OP_TYPEPOSPLUS:\n      case OP_TYPEPOSQUERY:\n      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;\n      break;\n\n      case OP_TYPEUPTO:\n      case OP_TYPEMINUPTO:\n      case OP_TYPEEXACT:\n      case OP_TYPEPOSUPTO:\n      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)\n        code += 2;\n      break;\n\n      case OP_MARK:\n      case OP_PRUNE_ARG:\n      case OP_SKIP_ARG:\n      case OP_THEN_ARG:\n      code += code[1];\n      break;\n      }\n\n    /* Add in the fixed length from the table */\n\n    code += PRIV(OP_lengths)[c];\n\n  /* In UTF-8 mode, opcodes that are followed by a character may be followed by\n  a multi-byte character. The length in the table is a minimum, so we have to\n  arrange to skip the extra bytes. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (utf) switch(c)\n      {\n      case OP_CHAR:\n      case OP_CHARI:\n      case OP_NOT:\n      case OP_NOTI:\n      case OP_EXACT:\n      case OP_EXACTI:\n      case OP_NOTEXACT:\n      case OP_NOTEXACTI:\n      case OP_UPTO:\n      case OP_UPTOI:\n      case OP_NOTUPTO:\n      case OP_NOTUPTOI:\n      case OP_MINUPTO:\n      case OP_MINUPTOI:\n      case OP_NOTMINUPTO:\n      case OP_NOTMINUPTOI:\n      case OP_POSUPTO:\n      case OP_POSUPTOI:\n      case OP_NOTPOSUPTO:\n      case OP_NOTPOSUPTOI:\n      case OP_STAR:\n      case OP_STARI:\n      case OP_NOTSTAR:\n      case OP_NOTSTARI:\n      case OP_MINSTAR:\n      case OP_MINSTARI:\n      case OP_NOTMINSTAR:\n      case OP_NOTMINSTARI:\n      case OP_POSSTAR:\n      case OP_POSSTARI:\n      case OP_NOTPOSSTAR:\n      case OP_NOTPOSSTARI:\n      case OP_PLUS:\n      case OP_PLUSI:\n      case OP_NOTPLUS:\n      case OP_NOTPLUSI:\n      case OP_MINPLUS:\n      case OP_MINPLUSI:\n      case OP_NOTMINPLUS:\n      case OP_NOTMINPLUSI:\n      case OP_POSPLUS:\n      case OP_POSPLUSI:\n      case OP_NOTPOSPLUS:\n      case OP_NOTPOSPLUSI:\n      case OP_QUERY:\n      case OP_QUERYI:\n      case OP_NOTQUERY:\n      case OP_NOTQUERYI:\n      case OP_MINQUERY:\n      case OP_MINQUERYI:\n      case OP_NOTMINQUERY:\n      case OP_NOTMINQUERYI:\n      case OP_POSQUERY:\n      case OP_POSQUERYI:\n      case OP_NOTPOSQUERY:\n      case OP_NOTPOSQUERYI:\n      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);\n      break;\n      }\n#else\n    (void)(utf);  /* Keep compiler happy by referencing function argument */\n#endif\n    }\n  }\n}\n\n\n\n/*************************************************\n*   Scan compiled regex for recursion reference  *\n*************************************************/\n\n/* This little function scans through a compiled pattern until it finds an\ninstance of OP_RECURSE.\n\nArguments:\n  code        points to start of expression\n  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode\n\nReturns:      pointer to the opcode for OP_RECURSE, or NULL if not found\n*/\n\nstatic const pcre_uchar *\nfind_recurse(const pcre_uchar *code, BOOL utf)\n{\nfor (;;)\n  {\n  register pcre_uchar c = *code;\n  if (c == OP_END) return NULL;\n  if (c == OP_RECURSE) return code;\n\n  /* XCLASS is used for classes that cannot be represented just by a bit\n  map. This includes negated single high-valued characters. The length in\n  the table is zero; the actual length is stored in the compiled code. */\n\n  if (c == OP_XCLASS) code += GET(code, 1);\n\n  /* Otherwise, we can get the item's length from the table, except that for\n  repeated character types, we have to test for \\p and \\P, which have an extra\n  two bytes of parameters, and for MARK/PRUNE/SKIP/THEN with an argument, we\n  must add in its length. */\n\n  else\n    {\n    switch(c)\n      {\n      case OP_TYPESTAR:\n      case OP_TYPEMINSTAR:\n      case OP_TYPEPLUS:\n      case OP_TYPEMINPLUS:\n      case OP_TYPEQUERY:\n      case OP_TYPEMINQUERY:\n      case OP_TYPEPOSSTAR:\n      case OP_TYPEPOSPLUS:\n      case OP_TYPEPOSQUERY:\n      if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;\n      break;\n\n      case OP_TYPEPOSUPTO:\n      case OP_TYPEUPTO:\n      case OP_TYPEMINUPTO:\n      case OP_TYPEEXACT:\n      if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)\n        code += 2;\n      break;\n\n      case OP_MARK:\n      case OP_PRUNE_ARG:\n      case OP_SKIP_ARG:\n      case OP_THEN_ARG:\n      code += code[1];\n      break;\n      }\n\n    /* Add in the fixed length from the table */\n\n    code += PRIV(OP_lengths)[c];\n\n    /* In UTF-8 mode, opcodes that are followed by a character may be followed\n    by a multi-byte character. The length in the table is a minimum, so we have\n    to arrange to skip the extra bytes. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (utf) switch(c)\n      {\n      case OP_CHAR:\n      case OP_CHARI:\n      case OP_NOT:\n      case OP_NOTI:\n      case OP_EXACT:\n      case OP_EXACTI:\n      case OP_NOTEXACT:\n      case OP_NOTEXACTI:\n      case OP_UPTO:\n      case OP_UPTOI:\n      case OP_NOTUPTO:\n      case OP_NOTUPTOI:\n      case OP_MINUPTO:\n      case OP_MINUPTOI:\n      case OP_NOTMINUPTO:\n      case OP_NOTMINUPTOI:\n      case OP_POSUPTO:\n      case OP_POSUPTOI:\n      case OP_NOTPOSUPTO:\n      case OP_NOTPOSUPTOI:\n      case OP_STAR:\n      case OP_STARI:\n      case OP_NOTSTAR:\n      case OP_NOTSTARI:\n      case OP_MINSTAR:\n      case OP_MINSTARI:\n      case OP_NOTMINSTAR:\n      case OP_NOTMINSTARI:\n      case OP_POSSTAR:\n      case OP_POSSTARI:\n      case OP_NOTPOSSTAR:\n      case OP_NOTPOSSTARI:\n      case OP_PLUS:\n      case OP_PLUSI:\n      case OP_NOTPLUS:\n      case OP_NOTPLUSI:\n      case OP_MINPLUS:\n      case OP_MINPLUSI:\n      case OP_NOTMINPLUS:\n      case OP_NOTMINPLUSI:\n      case OP_POSPLUS:\n      case OP_POSPLUSI:\n      case OP_NOTPOSPLUS:\n      case OP_NOTPOSPLUSI:\n      case OP_QUERY:\n      case OP_QUERYI:\n      case OP_NOTQUERY:\n      case OP_NOTQUERYI:\n      case OP_MINQUERY:\n      case OP_MINQUERYI:\n      case OP_NOTMINQUERY:\n      case OP_NOTMINQUERYI:\n      case OP_POSQUERY:\n      case OP_POSQUERYI:\n      case OP_NOTPOSQUERY:\n      case OP_NOTPOSQUERYI:\n      if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);\n      break;\n      }\n#else\n    (void)(utf);  /* Keep compiler happy by referencing function argument */\n#endif\n    }\n  }\n}\n\n\n\n/*************************************************\n*    Scan compiled branch for non-emptiness      *\n*************************************************/\n\n/* This function scans through a branch of a compiled pattern to see whether it\ncan match the empty string or not. It is called from could_be_empty()\nbelow and from compile_branch() when checking for an unlimited repeat of a\ngroup that can match nothing. Note that first_significant_code() skips over\nbackward and negative forward assertions when its final argument is TRUE. If we\nhit an unclosed bracket, we return \"empty\" - this means we've struck an inner\nbracket whose current branch will already have been scanned.\n\nArguments:\n  code        points to start of search\n  endcode     points to where to stop\n  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode\n  cd          contains pointers to tables etc.\n  recurses    chain of recurse_check to catch mutual recursion\n\nReturns:      TRUE if what is matched could be empty\n*/\n\nstatic BOOL\ncould_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode,\n  BOOL utf, compile_data *cd, recurse_check *recurses)\n{\nregister pcre_uchar c;\nrecurse_check this_recurse;\n\nfor (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);\n     code < endcode;\n     code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE))\n  {\n  const pcre_uchar *ccode;\n\n  c = *code;\n\n  /* Skip over forward assertions; the other assertions are skipped by\n  first_significant_code() with a TRUE final argument. */\n\n  if (c == OP_ASSERT)\n    {\n    do code += GET(code, 1); while (*code == OP_ALT);\n    c = *code;\n    continue;\n    }\n\n  /* For a recursion/subroutine call, if its end has been reached, which\n  implies a backward reference subroutine call, we can scan it. If it's a\n  forward reference subroutine call, we can't. To detect forward reference\n  we have to scan up the list that is kept in the workspace. This function is\n  called only when doing the real compile, not during the pre-compile that\n  measures the size of the compiled pattern. */\n\n  if (c == OP_RECURSE)\n    {\n    const pcre_uchar *scode = cd->start_code + GET(code, 1);\n    const pcre_uchar *endgroup = scode;\n    BOOL empty_branch;\n\n    /* Test for forward reference or uncompleted reference. This is disabled\n    when called to scan a completed pattern by setting cd->start_workspace to\n    NULL. */\n\n    if (cd->start_workspace != NULL)\n      {\n      const pcre_uchar *tcode;\n      for (tcode = cd->start_workspace; tcode < cd->hwm; tcode += LINK_SIZE)\n        if ((int)GET(tcode, 0) == (int)(code + 1 - cd->start_code)) return TRUE;\n      if (GET(scode, 1) == 0) return TRUE;    /* Unclosed */\n      }\n\n    /* If the reference is to a completed group, we need to detect whether this\n    is a recursive call, as otherwise there will be an infinite loop. If it is\n    a recursion, just skip over it. Simple recursions are easily detected. For\n    mutual recursions we keep a chain on the stack. */\n\n    do endgroup += GET(endgroup, 1); while (*endgroup == OP_ALT);\n    if (code >= scode && code <= endgroup) continue;  /* Simple recursion */\n    else\n      {\n      recurse_check *r = recurses;\n      for (r = recurses; r != NULL; r = r->prev)\n        if (r->group == scode) break;\n      if (r != NULL) continue;   /* Mutual recursion */\n      }\n\n    /* Completed reference; scan the referenced group, remembering it on the\n    stack chain to detect mutual recursions. */\n\n    empty_branch = FALSE;\n    this_recurse.prev = recurses;\n    this_recurse.group = scode;\n\n    do\n      {\n      if (could_be_empty_branch(scode, endcode, utf, cd, &this_recurse))\n        {\n        empty_branch = TRUE;\n        break;\n        }\n      scode += GET(scode, 1);\n      }\n    while (*scode == OP_ALT);\n\n    if (!empty_branch) return FALSE;  /* All branches are non-empty */\n    continue;\n    }\n\n  /* Groups with zero repeats can of course be empty; skip them. */\n\n  if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO ||\n      c == OP_BRAPOSZERO)\n    {\n    code += PRIV(OP_lengths)[c];\n    do code += GET(code, 1); while (*code == OP_ALT);\n    c = *code;\n    continue;\n    }\n\n  /* A nested group that is already marked as \"could be empty\" can just be\n  skipped. */\n\n  if (c == OP_SBRA  || c == OP_SBRAPOS ||\n      c == OP_SCBRA || c == OP_SCBRAPOS)\n    {\n    do code += GET(code, 1); while (*code == OP_ALT);\n    c = *code;\n    continue;\n    }\n\n  /* For other groups, scan the branches. */\n\n  if (c == OP_BRA  || c == OP_BRAPOS ||\n      c == OP_CBRA || c == OP_CBRAPOS ||\n      c == OP_ONCE || c == OP_ONCE_NC ||\n      c == OP_COND || c == OP_SCOND)\n    {\n    BOOL empty_branch;\n    if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */\n\n    /* If a conditional group has only one branch, there is a second, implied,\n    empty branch, so just skip over the conditional, because it could be empty.\n    Otherwise, scan the individual branches of the group. */\n\n    if (c == OP_COND && code[GET(code, 1)] != OP_ALT)\n      code += GET(code, 1);\n    else\n      {\n      empty_branch = FALSE;\n      do\n        {\n        if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd,\n          recurses)) empty_branch = TRUE;\n        code += GET(code, 1);\n        }\n      while (*code == OP_ALT);\n      if (!empty_branch) return FALSE;   /* All branches are non-empty */\n      }\n\n    c = *code;\n    continue;\n    }\n\n  /* Handle the other opcodes */\n\n  switch (c)\n    {\n    /* Check for quantifiers after a class. XCLASS is used for classes that\n    cannot be represented just by a bit map. This includes negated single\n    high-valued characters. The length in PRIV(OP_lengths)[] is zero; the\n    actual length is stored in the compiled code, so we must update \"code\"\n    here. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n    ccode = code += GET(code, 1);\n    goto CHECK_CLASS_REPEAT;\n#endif\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    ccode = code + PRIV(OP_lengths)[OP_CLASS];\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    CHECK_CLASS_REPEAT:\n#endif\n\n    switch (*ccode)\n      {\n      case OP_CRSTAR:            /* These could be empty; continue */\n      case OP_CRMINSTAR:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSSTAR:\n      case OP_CRPOSQUERY:\n      break;\n\n      default:                   /* Non-repeat => class must match */\n      case OP_CRPLUS:            /* These repeats aren't empty */\n      case OP_CRMINPLUS:\n      case OP_CRPOSPLUS:\n      return FALSE;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      if (GET2(ccode, 1) > 0) return FALSE;  /* Minimum > 0 */\n      break;\n      }\n    break;\n\n    /* Opcodes that must match a character */\n\n    case OP_ANY:\n    case OP_ALLANY:\n    case OP_ANYBYTE:\n\n    case OP_PROP:\n    case OP_NOTPROP:\n    case OP_ANYNL:\n\n    case OP_NOT_HSPACE:\n    case OP_HSPACE:\n    case OP_NOT_VSPACE:\n    case OP_VSPACE:\n    case OP_EXTUNI:\n\n    case OP_NOT_DIGIT:\n    case OP_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_WORDCHAR:\n\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n\n    case OP_PLUS:\n    case OP_PLUSI:\n    case OP_MINPLUS:\n    case OP_MINPLUSI:\n\n    case OP_NOTPLUS:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUS:\n    case OP_NOTMINPLUSI:\n\n    case OP_POSPLUS:\n    case OP_POSPLUSI:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSPLUSI:\n\n    case OP_EXACT:\n    case OP_EXACTI:\n    case OP_NOTEXACT:\n    case OP_NOTEXACTI:\n\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEEXACT:\n\n    return FALSE;\n\n    /* These are going to continue, as they may be empty, but we have to\n    fudge the length for the \\p and \\P cases. */\n\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEPOSQUERY:\n    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;\n    break;\n\n    /* Same for these */\n\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEPOSUPTO:\n    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)\n      code += 2;\n    break;\n\n    /* End of branch */\n\n    case OP_KET:\n    case OP_KETRMAX:\n    case OP_KETRMIN:\n    case OP_KETRPOS:\n    case OP_ALT:\n    return TRUE;\n\n    /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO,\n    MINUPTO, and POSUPTO and their caseless and negative versions may be\n    followed by a multibyte character. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    case OP_STAR:\n    case OP_STARI:\n    case OP_NOTSTAR:\n    case OP_NOTSTARI:\n\n    case OP_MINSTAR:\n    case OP_MINSTARI:\n    case OP_NOTMINSTAR:\n    case OP_NOTMINSTARI:\n\n    case OP_POSSTAR:\n    case OP_POSSTARI:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSSTARI:\n\n    case OP_QUERY:\n    case OP_QUERYI:\n    case OP_NOTQUERY:\n    case OP_NOTQUERYI:\n\n    case OP_MINQUERY:\n    case OP_MINQUERYI:\n    case OP_NOTMINQUERY:\n    case OP_NOTMINQUERYI:\n\n    case OP_POSQUERY:\n    case OP_POSQUERYI:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSQUERYI:\n\n    if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]);\n    break;\n\n    case OP_UPTO:\n    case OP_UPTOI:\n    case OP_NOTUPTO:\n    case OP_NOTUPTOI:\n\n    case OP_MINUPTO:\n    case OP_MINUPTOI:\n    case OP_NOTMINUPTO:\n    case OP_NOTMINUPTOI:\n\n    case OP_POSUPTO:\n    case OP_POSUPTOI:\n    case OP_NOTPOSUPTO:\n    case OP_NOTPOSUPTOI:\n\n    if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]);\n    break;\n#endif\n\n    /* MARK, and PRUNE/SKIP/THEN with an argument must skip over the argument\n    string. */\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_SKIP_ARG:\n    case OP_THEN_ARG:\n    code += code[1];\n    break;\n\n    /* None of the remaining opcodes are required to match a character. */\n\n    default:\n    break;\n    }\n  }\n\nreturn TRUE;\n}\n\n\n\n/*************************************************\n*    Scan compiled regex for non-emptiness       *\n*************************************************/\n\n/* This function is called to check for left recursive calls. We want to check\nthe current branch of the current pattern to see if it could match the empty\nstring. If it could, we must look outwards for branches at other levels,\nstopping when we pass beyond the bracket which is the subject of the recursion.\nThis function is called only during the real compile, not during the\npre-compile.\n\nArguments:\n  code        points to start of the recursion\n  endcode     points to where to stop (current RECURSE item)\n  bcptr       points to the chain of current (unclosed) branch starts\n  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode\n  cd          pointers to tables etc\n\nReturns:      TRUE if what is matched could be empty\n*/\n\nstatic BOOL\ncould_be_empty(const pcre_uchar *code, const pcre_uchar *endcode,\n  branch_chain *bcptr, BOOL utf, compile_data *cd)\n{\nwhile (bcptr != NULL && bcptr->current_branch >= code)\n  {\n  if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd, NULL))\n    return FALSE;\n  bcptr = bcptr->outer;\n  }\nreturn TRUE;\n}\n\n\n\n/*************************************************\n*        Base opcode of repeated opcodes         *\n*************************************************/\n\n/* Returns the base opcode for repeated single character type opcodes. If the\nopcode is not a repeated character type, it returns with the original value.\n\nArguments:  c opcode\nReturns:    base opcode for the type\n*/\n\nstatic pcre_uchar\nget_repeat_base(pcre_uchar c)\n{\nreturn (c > OP_TYPEPOSUPTO)? c :\n       (c >= OP_TYPESTAR)?   OP_TYPESTAR :\n       (c >= OP_NOTSTARI)?   OP_NOTSTARI :\n       (c >= OP_NOTSTAR)?    OP_NOTSTAR :\n       (c >= OP_STARI)?      OP_STARI :\n                             OP_STAR;\n}\n\n\n\n#ifdef SUPPORT_UCP\n/*************************************************\n*        Check a character and a property        *\n*************************************************/\n\n/* This function is called by check_auto_possessive() when a property item\nis adjacent to a fixed character.\n\nArguments:\n  c            the character\n  ptype        the property type\n  pdata        the data for the type\n  negated      TRUE if it's a negated property (\\P or \\p{^)\n\nReturns:       TRUE if auto-possessifying is OK\n*/\n\nstatic BOOL\ncheck_char_prop(pcre_uint32 c, unsigned int ptype, unsigned int pdata,\n  BOOL negated)\n{\nconst pcre_uint32 *p;\nconst ucd_record *prop = GET_UCD(c);\n\nswitch(ptype)\n  {\n  case PT_LAMP:\n  return (prop->chartype == ucp_Lu ||\n          prop->chartype == ucp_Ll ||\n          prop->chartype == ucp_Lt) == negated;\n\n  case PT_GC:\n  return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated;\n\n  case PT_PC:\n  return (pdata == prop->chartype) == negated;\n\n  case PT_SC:\n  return (pdata == prop->script) == negated;\n\n  /* These are specials */\n\n  case PT_ALNUM:\n  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n          PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated;\n\n  /* Perl space used to exclude VT, but from Perl 5.18 it is included, which\n  means that Perl space and POSIX space are now identical. PCRE was changed\n  at release 8.34. */\n\n  case PT_SPACE:    /* Perl space */\n  case PT_PXSPACE:  /* POSIX space */\n  switch(c)\n    {\n    HSPACE_CASES:\n    VSPACE_CASES:\n    return negated;\n\n    default:\n    return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == negated;\n    }\n  break;  /* Control never reaches here */\n\n  case PT_WORD:\n  return (PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n          PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n          c == CHAR_UNDERSCORE) == negated;\n\n  case PT_CLIST:\n  p = PRIV(ucd_caseless_sets) + prop->caseset;\n  for (;;)\n    {\n    if (c < *p) return !negated;\n    if (c == *p++) return negated;\n    }\n  break;  /* Control never reaches here */\n  }\n\nreturn FALSE;\n}\n#endif  /* SUPPORT_UCP */\n\n\n\n/*************************************************\n*        Fill the character property list        *\n*************************************************/\n\n/* Checks whether the code points to an opcode that can take part in auto-\npossessification, and if so, fills a list with its properties.\n\nArguments:\n  code        points to start of expression\n  utf         TRUE if in UTF-8 / UTF-16 / UTF-32 mode\n  fcc         points to case-flipping table\n  list        points to output list\n              list[0] will be filled with the opcode\n              list[1] will be non-zero if this opcode\n                can match an empty character string\n              list[2..7] depends on the opcode\n\nReturns:      points to the start of the next opcode if *code is accepted\n              NULL if *code is not accepted\n*/\n\nstatic const pcre_uchar *\nget_chr_property_list(const pcre_uchar *code, BOOL utf,\n  const pcre_uint8 *fcc, pcre_uint32 *list)\n{\npcre_uchar c = *code;\npcre_uchar base;\nconst pcre_uchar *end;\npcre_uint32 chr;\n\n#ifdef SUPPORT_UCP\npcre_uint32 *clist_dest;\nconst pcre_uint32 *clist_src;\n#else\nutf = utf;  /* Suppress \"unused parameter\" compiler warning */\n#endif\n\nlist[0] = c;\nlist[1] = FALSE;\ncode++;\n\nif (c >= OP_STAR && c <= OP_TYPEPOSUPTO)\n  {\n  base = get_repeat_base(c);\n  c -= (base - OP_STAR);\n\n  if (c == OP_UPTO || c == OP_MINUPTO || c == OP_EXACT || c == OP_POSUPTO)\n    code += IMM2_SIZE;\n\n  list[1] = (c != OP_PLUS && c != OP_MINPLUS && c != OP_EXACT && c != OP_POSPLUS);\n\n  switch(base)\n    {\n    case OP_STAR:\n    list[0] = OP_CHAR;\n    break;\n\n    case OP_STARI:\n    list[0] = OP_CHARI;\n    break;\n\n    case OP_NOTSTAR:\n    list[0] = OP_NOT;\n    break;\n\n    case OP_NOTSTARI:\n    list[0] = OP_NOTI;\n    break;\n\n    case OP_TYPESTAR:\n    list[0] = *code;\n    code++;\n    break;\n    }\n  c = list[0];\n  }\n\nswitch(c)\n  {\n  case OP_NOT_DIGIT:\n  case OP_DIGIT:\n  case OP_NOT_WHITESPACE:\n  case OP_WHITESPACE:\n  case OP_NOT_WORDCHAR:\n  case OP_WORDCHAR:\n  case OP_ANY:\n  case OP_ALLANY:\n  case OP_ANYNL:\n  case OP_NOT_HSPACE:\n  case OP_HSPACE:\n  case OP_NOT_VSPACE:\n  case OP_VSPACE:\n  case OP_EXTUNI:\n  case OP_EODN:\n  case OP_EOD:\n  case OP_DOLL:\n  case OP_DOLLM:\n  return code;\n\n  case OP_CHAR:\n  case OP_NOT:\n  GETCHARINCTEST(chr, code);\n  list[2] = chr;\n  list[3] = NOTACHAR;\n  return code;\n\n  case OP_CHARI:\n  case OP_NOTI:\n  list[0] = (c == OP_CHARI) ? OP_CHAR : OP_NOT;\n  GETCHARINCTEST(chr, code);\n  list[2] = chr;\n\n#ifdef SUPPORT_UCP\n  if (chr < 128 || (chr < 256 && !utf))\n    list[3] = fcc[chr];\n  else\n    list[3] = UCD_OTHERCASE(chr);\n#elif defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  list[3] = (chr < 256) ? fcc[chr] : chr;\n#else\n  list[3] = fcc[chr];\n#endif\n\n  /* The othercase might be the same value. */\n\n  if (chr == list[3])\n    list[3] = NOTACHAR;\n  else\n    list[4] = NOTACHAR;\n  return code;\n\n#ifdef SUPPORT_UCP\n  case OP_PROP:\n  case OP_NOTPROP:\n  if (code[0] != PT_CLIST)\n    {\n    list[2] = code[0];\n    list[3] = code[1];\n    return code + 2;\n    }\n\n  /* Convert only if we have enough space. */\n\n  clist_src = PRIV(ucd_caseless_sets) + code[1];\n  clist_dest = list + 2;\n  code += 2;\n\n  do {\n     if (clist_dest >= list + 8)\n       {\n       /* Early return if there is not enough space. This should never\n       happen, since all clists are shorter than 5 character now. */\n       list[2] = code[0];\n       list[3] = code[1];\n       return code;\n       }\n     *clist_dest++ = *clist_src;\n     }\n  while(*clist_src++ != NOTACHAR);\n\n  /* All characters are stored. The terminating NOTACHAR\n  is copied form the clist itself. */\n\n  list[0] = (c == OP_PROP) ? OP_CHAR : OP_NOT;\n  return code;\n#endif\n\n  case OP_NCLASS:\n  case OP_CLASS:\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  case OP_XCLASS:\n  if (c == OP_XCLASS)\n    end = code + GET(code, 0) - 1;\n  else\n#endif\n    end = code + 32 / sizeof(pcre_uchar);\n\n  switch(*end)\n    {\n    case OP_CRSTAR:\n    case OP_CRMINSTAR:\n    case OP_CRQUERY:\n    case OP_CRMINQUERY:\n    case OP_CRPOSSTAR:\n    case OP_CRPOSQUERY:\n    list[1] = TRUE;\n    end++;\n    break;\n\n    case OP_CRPLUS:\n    case OP_CRMINPLUS:\n    case OP_CRPOSPLUS:\n    end++;\n    break;\n\n    case OP_CRRANGE:\n    case OP_CRMINRANGE:\n    case OP_CRPOSRANGE:\n    list[1] = (GET2(end, 1) == 0);\n    end += 1 + 2 * IMM2_SIZE;\n    break;\n    }\n  list[2] = (pcre_uint32)(end - code);\n  return end;\n  }\nreturn NULL;    /* Opcode not accepted */\n}\n\n\n\n/*************************************************\n*    Scan further character sets for match       *\n*************************************************/\n\n/* Checks whether the base and the current opcode have a common character, in\nwhich case the base cannot be possessified.\n\nArguments:\n  code        points to the byte code\n  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode\n  cd          static compile data\n  base_list   the data list of the base opcode\n\nReturns:      TRUE if the auto-possessification is possible\n*/\n\nstatic BOOL\ncompare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd,\n  const pcre_uint32 *base_list, const pcre_uchar *base_end, int *rec_limit)\n{\npcre_uchar c;\npcre_uint32 list[8];\nconst pcre_uint32 *chr_ptr;\nconst pcre_uint32 *ochr_ptr;\nconst pcre_uint32 *list_ptr;\nconst pcre_uchar *next_code;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\nconst pcre_uchar *xclass_flags;\n#endif\nconst pcre_uint8 *class_bitset;\nconst pcre_uint8 *set1, *set2, *set_end;\npcre_uint32 chr;\nBOOL accepted, invert_bits;\nBOOL entered_a_group = FALSE;\n\nif (*rec_limit == 0) return FALSE;\n--(*rec_limit);\n\n/* Note: the base_list[1] contains whether the current opcode has greedy\n(represented by a non-zero value) quantifier. This is a different from\nother character type lists, which stores here that the character iterator\nmatches to an empty string (also represented by a non-zero value). */\n\nfor(;;)\n  {\n  /* All operations move the code pointer forward.\n  Therefore infinite recursions are not possible. */\n\n  c = *code;\n\n  /* Skip over callouts */\n\n  if (c == OP_CALLOUT)\n    {\n    code += PRIV(OP_lengths)[c];\n    continue;\n    }\n\n  if (c == OP_ALT)\n    {\n    do code += GET(code, 1); while (*code == OP_ALT);\n    c = *code;\n    }\n\n  switch(c)\n    {\n    case OP_END:\n    case OP_KETRPOS:\n    /* TRUE only in greedy case. The non-greedy case could be replaced by\n    an OP_EXACT, but it is probably not worth it. (And note that OP_EXACT\n    uses more memory, which we cannot get at this stage.) */\n\n    return base_list[1] != 0;\n\n    case OP_KET:\n    /* If the bracket is capturing, and referenced by an OP_RECURSE, or\n    it is an atomic sub-pattern (assert, once, etc.) the non-greedy case\n    cannot be converted to a possessive form. */\n\n    if (base_list[1] == 0) return FALSE;\n\n    switch(*(code - GET(code, 1)))\n      {\n      case OP_ASSERT:\n      case OP_ASSERT_NOT:\n      case OP_ASSERTBACK:\n      case OP_ASSERTBACK_NOT:\n      case OP_ONCE:\n      case OP_ONCE_NC:\n      /* Atomic sub-patterns and assertions can always auto-possessify their\n      last iterator. However, if the group was entered as a result of checking\n      a previous iterator, this is not possible. */\n\n      return !entered_a_group;\n      }\n\n    code += PRIV(OP_lengths)[c];\n    continue;\n\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRA:\n    case OP_CBRA:\n    next_code = code + GET(code, 1);\n    code += PRIV(OP_lengths)[c];\n\n    while (*next_code == OP_ALT)\n      {\n      if (!compare_opcodes(code, utf, cd, base_list, base_end, rec_limit))\n        return FALSE;\n      code = next_code + 1 + LINK_SIZE;\n      next_code += GET(next_code, 1);\n      }\n\n    entered_a_group = TRUE;\n    continue;\n\n    case OP_BRAZERO:\n    case OP_BRAMINZERO:\n\n    next_code = code + 1;\n    if (*next_code != OP_BRA && *next_code != OP_CBRA\n        && *next_code != OP_ONCE && *next_code != OP_ONCE_NC) return FALSE;\n\n    do next_code += GET(next_code, 1); while (*next_code == OP_ALT);\n\n    /* The bracket content will be checked by the\n    OP_BRA/OP_CBRA case above. */\n    next_code += 1 + LINK_SIZE;\n    if (!compare_opcodes(next_code, utf, cd, base_list, base_end, rec_limit))\n      return FALSE;\n\n    code += PRIV(OP_lengths)[c];\n    continue;\n\n    default:\n    break;\n    }\n\n  /* Check for a supported opcode, and load its properties. */\n\n  code = get_chr_property_list(code, utf, cd->fcc, list);\n  if (code == NULL) return FALSE;    /* Unsupported */\n\n  /* If either opcode is a small character list, set pointers for comparing\n  characters from that list with another list, or with a property. */\n\n  if (base_list[0] == OP_CHAR)\n    {\n    chr_ptr = base_list + 2;\n    list_ptr = list;\n    }\n  else if (list[0] == OP_CHAR)\n    {\n    chr_ptr = list + 2;\n    list_ptr = base_list;\n    }\n\n  /* Character bitsets can also be compared to certain opcodes. */\n\n  else if (base_list[0] == OP_CLASS || list[0] == OP_CLASS\n#ifdef COMPILE_PCRE8\n      /* In 8 bit, non-UTF mode, OP_CLASS and OP_NCLASS are the same. */\n      || (!utf && (base_list[0] == OP_NCLASS || list[0] == OP_NCLASS))\n#endif\n      )\n    {\n#ifdef COMPILE_PCRE8\n    if (base_list[0] == OP_CLASS || (!utf && base_list[0] == OP_NCLASS))\n#else\n    if (base_list[0] == OP_CLASS)\n#endif\n      {\n      set1 = (pcre_uint8 *)(base_end - base_list[2]);\n      list_ptr = list;\n      }\n    else\n      {\n      set1 = (pcre_uint8 *)(code - list[2]);\n      list_ptr = base_list;\n      }\n\n    invert_bits = FALSE;\n    switch(list_ptr[0])\n      {\n      case OP_CLASS:\n      case OP_NCLASS:\n      set2 = (pcre_uint8 *)\n        ((list_ptr == list ? code : base_end) - list_ptr[2]);\n      break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n      case OP_XCLASS:\n      xclass_flags = (list_ptr == list ? code : base_end) - list_ptr[2] + LINK_SIZE;\n      if ((*xclass_flags & XCL_HASPROP) != 0) return FALSE;\n      if ((*xclass_flags & XCL_MAP) == 0)\n        {\n        /* No bits are set for characters < 256. */\n        if (list[1] == 0) return (*xclass_flags & XCL_NOT) == 0;\n        /* Might be an empty repeat. */\n        continue;\n        }\n      set2 = (pcre_uint8 *)(xclass_flags + 1);\n      break;\n#endif\n\n      case OP_NOT_DIGIT:\n      invert_bits = TRUE;\n      /* Fall through */\n      case OP_DIGIT:\n      set2 = (pcre_uint8 *)(cd->cbits + cbit_digit);\n      break;\n\n      case OP_NOT_WHITESPACE:\n      invert_bits = TRUE;\n      /* Fall through */\n      case OP_WHITESPACE:\n      set2 = (pcre_uint8 *)(cd->cbits + cbit_space);\n      break;\n\n      case OP_NOT_WORDCHAR:\n      invert_bits = TRUE;\n      /* Fall through */\n      case OP_WORDCHAR:\n      set2 = (pcre_uint8 *)(cd->cbits + cbit_word);\n      break;\n\n      default:\n      return FALSE;\n      }\n\n    /* Because the sets are unaligned, we need\n    to perform byte comparison here. */\n    set_end = set1 + 32;\n    if (invert_bits)\n      {\n      do\n        {\n        if ((*set1++ & ~(*set2++)) != 0) return FALSE;\n        }\n      while (set1 < set_end);\n      }\n    else\n      {\n      do\n        {\n        if ((*set1++ & *set2++) != 0) return FALSE;\n        }\n      while (set1 < set_end);\n      }\n\n    if (list[1] == 0) return TRUE;\n    /* Might be an empty repeat. */\n    continue;\n    }\n\n  /* Some property combinations also acceptable. Unicode property opcodes are\n  processed specially; the rest can be handled with a lookup table. */\n\n  else\n    {\n    pcre_uint32 leftop, rightop;\n\n    leftop = base_list[0];\n    rightop = list[0];\n\n#ifdef SUPPORT_UCP\n    accepted = FALSE; /* Always set in non-unicode case. */\n    if (leftop == OP_PROP || leftop == OP_NOTPROP)\n      {\n      if (rightop == OP_EOD)\n        accepted = TRUE;\n      else if (rightop == OP_PROP || rightop == OP_NOTPROP)\n        {\n        int n;\n        const pcre_uint8 *p;\n        BOOL same = leftop == rightop;\n        BOOL lisprop = leftop == OP_PROP;\n        BOOL risprop = rightop == OP_PROP;\n        BOOL bothprop = lisprop && risprop;\n\n        /* There's a table that specifies how each combination is to be\n        processed:\n          0   Always return FALSE (never auto-possessify)\n          1   Character groups are distinct (possessify if both are OP_PROP)\n          2   Check character categories in the same group (general or particular)\n          3   Return TRUE if the two opcodes are not the same\n          ... see comments below\n        */\n\n        n = propposstab[base_list[2]][list[2]];\n        switch(n)\n          {\n          case 0: break;\n          case 1: accepted = bothprop; break;\n          case 2: accepted = (base_list[3] == list[3]) != same; break;\n          case 3: accepted = !same; break;\n\n          case 4:  /* Left general category, right particular category */\n          accepted = risprop && catposstab[base_list[3]][list[3]] == same;\n          break;\n\n          case 5:  /* Right general category, left particular category */\n          accepted = lisprop && catposstab[list[3]][base_list[3]] == same;\n          break;\n\n          /* This code is logically tricky. Think hard before fiddling with it.\n          The posspropstab table has four entries per row. Each row relates to\n          one of PCRE's special properties such as ALNUM or SPACE or WORD.\n          Only WORD actually needs all four entries, but using repeats for the\n          others means they can all use the same code below.\n\n          The first two entries in each row are Unicode general categories, and\n          apply always, because all the characters they include are part of the\n          PCRE character set. The third and fourth entries are a general and a\n          particular category, respectively, that include one or more relevant\n          characters. One or the other is used, depending on whether the check\n          is for a general or a particular category. However, in both cases the\n          category contains more characters than the specials that are defined\n          for the property being tested against. Therefore, it cannot be used\n          in a NOTPROP case.\n\n          Example: the row for WORD contains ucp_L, ucp_N, ucp_P, ucp_Po.\n          Underscore is covered by ucp_P or ucp_Po. */\n\n          case 6:  /* Left alphanum vs right general category */\n          case 7:  /* Left space vs right general category */\n          case 8:  /* Left word vs right general category */\n          p = posspropstab[n-6];\n          accepted = risprop && lisprop ==\n            (list[3] != p[0] &&\n             list[3] != p[1] &&\n            (list[3] != p[2] || !lisprop));\n          break;\n\n          case 9:   /* Right alphanum vs left general category */\n          case 10:  /* Right space vs left general category */\n          case 11:  /* Right word vs left general category */\n          p = posspropstab[n-9];\n          accepted = lisprop && risprop ==\n            (base_list[3] != p[0] &&\n             base_list[3] != p[1] &&\n            (base_list[3] != p[2] || !risprop));\n          break;\n\n          case 12:  /* Left alphanum vs right particular category */\n          case 13:  /* Left space vs right particular category */\n          case 14:  /* Left word vs right particular category */\n          p = posspropstab[n-12];\n          accepted = risprop && lisprop ==\n            (catposstab[p[0]][list[3]] &&\n             catposstab[p[1]][list[3]] &&\n            (list[3] != p[3] || !lisprop));\n          break;\n\n          case 15:  /* Right alphanum vs left particular category */\n          case 16:  /* Right space vs left particular category */\n          case 17:  /* Right word vs left particular category */\n          p = posspropstab[n-15];\n          accepted = lisprop && risprop ==\n            (catposstab[p[0]][base_list[3]] &&\n             catposstab[p[1]][base_list[3]] &&\n            (base_list[3] != p[3] || !risprop));\n          break;\n          }\n        }\n      }\n\n    else\n#endif  /* SUPPORT_UCP */\n\n    accepted = leftop >= FIRST_AUTOTAB_OP && leftop <= LAST_AUTOTAB_LEFT_OP &&\n           rightop >= FIRST_AUTOTAB_OP && rightop <= LAST_AUTOTAB_RIGHT_OP &&\n           autoposstab[leftop - FIRST_AUTOTAB_OP][rightop - FIRST_AUTOTAB_OP];\n\n    if (!accepted) return FALSE;\n\n    if (list[1] == 0) return TRUE;\n    /* Might be an empty repeat. */\n    continue;\n    }\n\n  /* Control reaches here only if one of the items is a small character list.\n  All characters are checked against the other side. */\n\n  do\n    {\n    chr = *chr_ptr;\n\n    switch(list_ptr[0])\n      {\n      case OP_CHAR:\n      ochr_ptr = list_ptr + 2;\n      do\n        {\n        if (chr == *ochr_ptr) return FALSE;\n        ochr_ptr++;\n        }\n      while(*ochr_ptr != NOTACHAR);\n      break;\n\n      case OP_NOT:\n      ochr_ptr = list_ptr + 2;\n      do\n        {\n        if (chr == *ochr_ptr)\n          break;\n        ochr_ptr++;\n        }\n      while(*ochr_ptr != NOTACHAR);\n      if (*ochr_ptr == NOTACHAR) return FALSE;   /* Not found */\n      break;\n\n      /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not*\n      set. When it is set, \\d etc. are converted into OP_(NOT_)PROP codes. */\n\n      case OP_DIGIT:\n      if (chr < 256 && (cd->ctypes[chr] & ctype_digit) != 0) return FALSE;\n      break;\n\n      case OP_NOT_DIGIT:\n      if (chr > 255 || (cd->ctypes[chr] & ctype_digit) == 0) return FALSE;\n      break;\n\n      case OP_WHITESPACE:\n      if (chr < 256 && (cd->ctypes[chr] & ctype_space) != 0) return FALSE;\n      break;\n\n      case OP_NOT_WHITESPACE:\n      if (chr > 255 || (cd->ctypes[chr] & ctype_space) == 0) return FALSE;\n      break;\n\n      case OP_WORDCHAR:\n      if (chr < 255 && (cd->ctypes[chr] & ctype_word) != 0) return FALSE;\n      break;\n\n      case OP_NOT_WORDCHAR:\n      if (chr > 255 || (cd->ctypes[chr] & ctype_word) == 0) return FALSE;\n      break;\n\n      case OP_HSPACE:\n      switch(chr)\n        {\n        HSPACE_CASES: return FALSE;\n        default: break;\n        }\n      break;\n\n      case OP_NOT_HSPACE:\n      switch(chr)\n        {\n        HSPACE_CASES: break;\n        default: return FALSE;\n        }\n      break;\n\n      case OP_ANYNL:\n      case OP_VSPACE:\n      switch(chr)\n        {\n        VSPACE_CASES: return FALSE;\n        default: break;\n        }\n      break;\n\n      case OP_NOT_VSPACE:\n      switch(chr)\n        {\n        VSPACE_CASES: break;\n        default: return FALSE;\n        }\n      break;\n\n      case OP_DOLL:\n      case OP_EODN:\n      switch (chr)\n        {\n        case CHAR_CR:\n        case CHAR_LF:\n        case CHAR_VT:\n        case CHAR_FF:\n        case CHAR_NEL:\n#ifndef EBCDIC\n        case 0x2028:\n        case 0x2029:\n#endif  /* Not EBCDIC */\n        return FALSE;\n        }\n      break;\n\n      case OP_EOD:    /* Can always possessify before \\z */\n      break;\n\n#ifdef SUPPORT_UCP\n      case OP_PROP:\n      case OP_NOTPROP:\n      if (!check_char_prop(chr, list_ptr[2], list_ptr[3],\n            list_ptr[0] == OP_NOTPROP))\n        return FALSE;\n      break;\n#endif\n\n      case OP_NCLASS:\n      if (chr > 255) return FALSE;\n      /* Fall through */\n\n      case OP_CLASS:\n      if (chr > 255) break;\n      class_bitset = (pcre_uint8 *)\n        ((list_ptr == list ? code : base_end) - list_ptr[2]);\n      if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE;\n      break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n      case OP_XCLASS:\n      if (PRIV(xclass)(chr, (list_ptr == list ? code : base_end) -\n          list_ptr[2] + LINK_SIZE, utf)) return FALSE;\n      break;\n#endif\n\n      default:\n      return FALSE;\n      }\n\n    chr_ptr++;\n    }\n  while(*chr_ptr != NOTACHAR);\n\n  /* At least one character must be matched from this opcode. */\n\n  if (list[1] == 0) return TRUE;\n  }\n\n/* Control never reaches here. There used to be a fail-save return FALSE; here,\nbut some compilers complain about an unreachable statement. */\n\n}\n\n\n\n/*************************************************\n*    Scan compiled regex for auto-possession     *\n*************************************************/\n\n/* Replaces single character iterations with their possessive alternatives\nif appropriate. This function modifies the compiled opcode!\n\nArguments:\n  code        points to start of the byte code\n  utf         TRUE in UTF-8 / UTF-16 / UTF-32 mode\n  cd          static compile data\n\nReturns:      nothing\n*/\n\nstatic void\nauto_possessify(pcre_uchar *code, BOOL utf, const compile_data *cd)\n{\nregister pcre_uchar c;\nconst pcre_uchar *end;\npcre_uchar *repeat_opcode;\npcre_uint32 list[8];\nint rec_limit;\n\nfor (;;)\n  {\n  c = *code;\n\n  /* When a pattern with bad UTF-8 encoding is compiled with NO_UTF_CHECK,\n  it may compile without complaining, but may get into a loop here if the code\n  pointer points to a bad value. This is, of course a documentated possibility,\n  when NO_UTF_CHECK is set, so it isn't a bug, but we can detect this case and\n  just give up on this optimization. */\n\n  if (c >= OP_TABLE_LENGTH) return;\n\n  if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)\n    {\n    c -= get_repeat_base(c) - OP_STAR;\n    end = (c <= OP_MINUPTO) ?\n      get_chr_property_list(code, utf, cd->fcc, list) : NULL;\n    list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;\n\n    rec_limit = 1000;\n    if (end != NULL && compare_opcodes(end, utf, cd, list, end, &rec_limit))\n      {\n      switch(c)\n        {\n        case OP_STAR:\n        *code += OP_POSSTAR - OP_STAR;\n        break;\n\n        case OP_MINSTAR:\n        *code += OP_POSSTAR - OP_MINSTAR;\n        break;\n\n        case OP_PLUS:\n        *code += OP_POSPLUS - OP_PLUS;\n        break;\n\n        case OP_MINPLUS:\n        *code += OP_POSPLUS - OP_MINPLUS;\n        break;\n\n        case OP_QUERY:\n        *code += OP_POSQUERY - OP_QUERY;\n        break;\n\n        case OP_MINQUERY:\n        *code += OP_POSQUERY - OP_MINQUERY;\n        break;\n\n        case OP_UPTO:\n        *code += OP_POSUPTO - OP_UPTO;\n        break;\n\n        case OP_MINUPTO:\n        *code += OP_POSUPTO - OP_MINUPTO;\n        break;\n        }\n      }\n    c = *code;\n    }\n  else if (c == OP_CLASS || c == OP_NCLASS || c == OP_XCLASS)\n    {\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    if (c == OP_XCLASS)\n      repeat_opcode = code + GET(code, 1);\n    else\n#endif\n      repeat_opcode = code + 1 + (32 / sizeof(pcre_uchar));\n\n    c = *repeat_opcode;\n    if (c >= OP_CRSTAR && c <= OP_CRMINRANGE)\n      {\n      /* end must not be NULL. */\n      end = get_chr_property_list(code, utf, cd->fcc, list);\n\n      list[1] = (c & 1) == 0;\n\n      rec_limit = 1000;\n      if (compare_opcodes(end, utf, cd, list, end, &rec_limit))\n        {\n        switch (c)\n          {\n          case OP_CRSTAR:\n          case OP_CRMINSTAR:\n          *repeat_opcode = OP_CRPOSSTAR;\n          break;\n\n          case OP_CRPLUS:\n          case OP_CRMINPLUS:\n          *repeat_opcode = OP_CRPOSPLUS;\n          break;\n\n          case OP_CRQUERY:\n          case OP_CRMINQUERY:\n          *repeat_opcode = OP_CRPOSQUERY;\n          break;\n\n          case OP_CRRANGE:\n          case OP_CRMINRANGE:\n          *repeat_opcode = OP_CRPOSRANGE;\n          break;\n          }\n        }\n      }\n    c = *code;\n    }\n\n  switch(c)\n    {\n    case OP_END:\n    return;\n\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEPOSQUERY:\n    if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2;\n    break;\n\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEEXACT:\n    case OP_TYPEPOSUPTO:\n    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)\n      code += 2;\n    break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n    code += GET(code, 1);\n    break;\n#endif\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_SKIP_ARG:\n    case OP_THEN_ARG:\n    code += code[1];\n    break;\n    }\n\n  /* Add in the fixed length from the table */\n\n  code += PRIV(OP_lengths)[c];\n\n  /* In UTF-8 mode, opcodes that are followed by a character may be followed by\n  a multi-byte character. The length in the table is a minimum, so we have to\n  arrange to skip the extra bytes. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n  if (utf) switch(c)\n    {\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n    if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);\n    break;\n    }\n#else\n  (void)(utf);  /* Keep compiler happy by referencing function argument */\n#endif\n  }\n}\n\n\n\n/*************************************************\n*           Check for POSIX class syntax         *\n*************************************************/\n\n/* This function is called when the sequence \"[:\" or \"[.\" or \"[=\" is\nencountered in a character class. It checks whether this is followed by a\nsequence of characters terminated by a matching \":]\" or \".]\" or \"=]\". If we\nreach an unescaped ']' without the special preceding character, return FALSE.\n\nOriginally, this function only recognized a sequence of letters between the\nterminators, but it seems that Perl recognizes any sequence of characters,\nthough of course unknown POSIX names are subsequently rejected. Perl gives an\n\"Unknown POSIX class\" error for [:f\\oo:] for example, where previously PCRE\ndidn't consider this to be a POSIX class. Likewise for [:1234:].\n\nThe problem in trying to be exactly like Perl is in the handling of escapes. We\nhave to be sure that [abc[:x\\]pqr] is *not* treated as containing a POSIX\nclass, but [abc[:x\\]pqr:]] is (so that an error can be generated). The code\nbelow handles the special cases \\\\ and \\], but does not try to do any other\nescape processing. This makes it different from Perl for cases such as\n[:l\\ower:] where Perl recognizes it as the POSIX class \"lower\" but PCRE does\nnot recognize \"l\\ower\". This is a lesser evil than not diagnosing bad classes\nwhen Perl does, I think.\n\nA user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not.\nIt seems that the appearance of a nested POSIX class supersedes an apparent\nexternal class. For example, [:a[:digit:]b:] matches \"a\", \"b\", \":\", or\na digit.\n\nIn Perl, unescaped square brackets may also appear as part of class names. For\nexample, [:a[:abc]b:] gives unknown POSIX class \"[:abc]b:]\". However, for\n[:a[:abc]b][b:] it gives unknown POSIX class \"[:abc]b][b:]\", which does not\nseem right at all. PCRE does not allow closing square brackets in POSIX class\nnames.\n\nArguments:\n  ptr      pointer to the initial [\n  endptr   where to return the end pointer\n\nReturns:   TRUE or FALSE\n*/\n\nstatic BOOL\ncheck_posix_syntax(const pcre_uchar *ptr, const pcre_uchar **endptr)\n{\npcre_uchar terminator;          /* Don't combine these lines; the Solaris cc */\nterminator = *(++ptr);   /* compiler warns about \"non-constant\" initializer. */\nfor (++ptr; *ptr != CHAR_NULL; ptr++)\n  {\n  if (*ptr == CHAR_BACKSLASH &&\n      (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET ||\n       ptr[1] == CHAR_BACKSLASH))\n    ptr++;\n  else if ((*ptr == CHAR_LEFT_SQUARE_BRACKET && ptr[1] == terminator) ||\n            *ptr == CHAR_RIGHT_SQUARE_BRACKET) return FALSE;\n  else if (*ptr == terminator && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)\n    {\n    *endptr = ptr;\n    return TRUE;\n    }\n  }\nreturn FALSE;\n}\n\n\n\n\n/*************************************************\n*          Check POSIX class name                *\n*************************************************/\n\n/* This function is called to check the name given in a POSIX-style class entry\nsuch as [:alnum:].\n\nArguments:\n  ptr        points to the first letter\n  len        the length of the name\n\nReturns:     a value representing the name, or -1 if unknown\n*/\n\nstatic int\ncheck_posix_name(const pcre_uchar *ptr, int len)\n{\nconst char *pn = posix_names;\nregister int yield = 0;\nwhile (posix_name_lengths[yield] != 0)\n  {\n  if (len == posix_name_lengths[yield] &&\n    STRNCMP_UC_C8(ptr, pn, (unsigned int)len) == 0) return yield;\n  pn += posix_name_lengths[yield] + 1;\n  yield++;\n  }\nreturn -1;\n}\n\n\n/*************************************************\n*    Adjust OP_RECURSE items in repeated group   *\n*************************************************/\n\n/* OP_RECURSE items contain an offset from the start of the regex to the group\nthat is referenced. This means that groups can be replicated for fixed\nrepetition simply by copying (because the recursion is allowed to refer to\nearlier groups that are outside the current group). However, when a group is\noptional (i.e. the minimum quantifier is zero), OP_BRAZERO or OP_SKIPZERO is\ninserted before it, after it has been compiled. This means that any OP_RECURSE\nitems within it that refer to the group itself or any contained groups have to\nhave their offsets adjusted. That one of the jobs of this function. Before it\nis called, the partially compiled regex must be temporarily terminated with\nOP_END.\n\nThis function has been extended to cope with forward references for recursions\nand subroutine calls. It must check the list of such references for the\ngroup we are dealing with. If it finds that one of the recursions in the\ncurrent group is on this list, it does not adjust the value in the reference\n(which is a group number). After the group has been scanned, all the offsets in\nthe forward reference list for the group are adjusted.\n\nArguments:\n  group      points to the start of the group\n  adjust     the amount by which the group is to be moved\n  utf        TRUE in UTF-8 / UTF-16 / UTF-32 mode\n  cd         contains pointers to tables etc.\n  save_hwm_offset   the hwm forward reference offset at the start of the group\n\nReturns:     nothing\n*/\n\nstatic void\nadjust_recurse(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd,\n  size_t save_hwm_offset)\n{\nint offset;\npcre_uchar *hc;\npcre_uchar *ptr = group;\n\nwhile ((ptr = (pcre_uchar *)find_recurse(ptr, utf)) != NULL)\n  {\n  for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm;\n       hc += LINK_SIZE)\n    {\n    offset = (int)GET(hc, 0);\n    if (cd->start_code + offset == ptr + 1) break;\n    }\n\n  /* If we have not found this recursion on the forward reference list, adjust\n  the recursion's offset if it's after the start of this group. */\n\n  if (hc >= cd->hwm)\n    {\n    offset = (int)GET(ptr, 1);\n    if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust);\n    }\n\n  ptr += 1 + LINK_SIZE;\n  }\n\n/* Now adjust all forward reference offsets for the group. */\n\nfor (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm;\n     hc += LINK_SIZE)\n  {\n  offset = (int)GET(hc, 0);\n  PUT(hc, 0, offset + adjust);\n  }\n}\n\n\n\n/*************************************************\n*        Insert an automatic callout point       *\n*************************************************/\n\n/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert\ncallout points before each pattern item.\n\nArguments:\n  code           current code pointer\n  ptr            current pattern pointer\n  cd             pointers to tables etc\n\nReturns:         new code pointer\n*/\n\nstatic pcre_uchar *\nauto_callout(pcre_uchar *code, const pcre_uchar *ptr, compile_data *cd)\n{\n*code++ = OP_CALLOUT;\n*code++ = 255;\nPUT(code, 0, (int)(ptr - cd->start_pattern));  /* Pattern offset */\nPUT(code, LINK_SIZE, 0);                       /* Default length */\nreturn code + 2 * LINK_SIZE;\n}\n\n\n\n/*************************************************\n*         Complete a callout item                *\n*************************************************/\n\n/* A callout item contains the length of the next item in the pattern, which\nwe can't fill in till after we have reached the relevant point. This is used\nfor both automatic and manual callouts.\n\nArguments:\n  previous_callout   points to previous callout item\n  ptr                current pattern pointer\n  cd                 pointers to tables etc\n\nReturns:             nothing\n*/\n\nstatic void\ncomplete_callout(pcre_uchar *previous_callout, const pcre_uchar *ptr, compile_data *cd)\n{\nint length = (int)(ptr - cd->start_pattern - GET(previous_callout, 2));\nPUT(previous_callout, 2 + LINK_SIZE, length);\n}\n\n\n\n#ifdef SUPPORT_UCP\n/*************************************************\n*           Get othercase range                  *\n*************************************************/\n\n/* This function is passed the start and end of a class range, in UTF-8 mode\nwith UCP support. It searches up the characters, looking for ranges of\ncharacters in the \"other\" case. Each call returns the next one, updating the\nstart address. A character with multiple other cases is returned on its own\nwith a special return value.\n\nArguments:\n  cptr        points to starting character value; updated\n  d           end value\n  ocptr       where to put start of othercase range\n  odptr       where to put end of othercase range\n\nYield:        -1 when no more\n               0 when a range is returned\n              >0 the CASESET offset for char with multiple other cases\n                in this case, ocptr contains the original\n*/\n\nstatic int\nget_othercase_range(pcre_uint32 *cptr, pcre_uint32 d, pcre_uint32 *ocptr,\n  pcre_uint32 *odptr)\n{\npcre_uint32 c, othercase, next;\nunsigned int co;\n\n/* Find the first character that has an other case. If it has multiple other\ncases, return its case offset value. */\n\nfor (c = *cptr; c <= d; c++)\n  {\n  if ((co = UCD_CASESET(c)) != 0)\n    {\n    *ocptr = c++;   /* Character that has the set */\n    *cptr = c;      /* Rest of input range */\n    return (int)co;\n    }\n  if ((othercase = UCD_OTHERCASE(c)) != c) break;\n  }\n\nif (c > d) return -1;  /* Reached end of range */\n\n/* Found a character that has a single other case. Search for the end of the\nrange, which is either the end of the input range, or a character that has zero\nor more than one other cases. */\n\n*ocptr = othercase;\nnext = othercase + 1;\n\nfor (++c; c <= d; c++)\n  {\n  if ((co = UCD_CASESET(c)) != 0 || UCD_OTHERCASE(c) != next) break;\n  next++;\n  }\n\n*odptr = next - 1;     /* End of othercase range */\n*cptr = c;             /* Rest of input range */\nreturn 0;\n}\n#endif  /* SUPPORT_UCP */\n\n\n\n/*************************************************\n*        Add a character or range to a class     *\n*************************************************/\n\n/* This function packages up the logic of adding a character or range of\ncharacters to a class. The character values in the arguments will be within the\nvalid values for the current mode (8-bit, 16-bit, UTF, etc). This function is\nmutually recursive with the function immediately below.\n\nArguments:\n  classbits     the bit map for characters < 256\n  uchardptr     points to the pointer for extra data\n  options       the options word\n  cd            contains pointers to tables etc.\n  start         start of range character\n  end           end of range character\n\nReturns:        the number of < 256 characters added\n                the pointer to extra data is updated\n*/\n\nstatic int\nadd_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options,\n  compile_data *cd, pcre_uint32 start, pcre_uint32 end)\n{\npcre_uint32 c;\npcre_uint32 classbits_end = (end <= 0xff ? end : 0xff);\nint n8 = 0;\n\n/* If caseless matching is required, scan the range and process alternate\ncases. In Unicode, there are 8-bit characters that have alternate cases that\nare greater than 255 and vice-versa. Sometimes we can just extend the original\nrange. */\n\nif ((options & PCRE_CASELESS) != 0)\n  {\n#ifdef SUPPORT_UCP\n  if ((options & PCRE_UTF8) != 0)\n    {\n    int rc;\n    pcre_uint32 oc, od;\n\n    options &= ~PCRE_CASELESS;   /* Remove for recursive calls */\n    c = start;\n\n    while ((rc = get_othercase_range(&c, end, &oc, &od)) >= 0)\n      {\n      /* Handle a single character that has more than one other case. */\n\n      if (rc > 0) n8 += add_list_to_class(classbits, uchardptr, options, cd,\n        PRIV(ucd_caseless_sets) + rc, oc);\n\n      /* Do nothing if the other case range is within the original range. */\n\n      else if (oc >= start && od <= end) continue;\n\n      /* Extend the original range if there is overlap, noting that if oc < c, we\n      can't have od > end because a subrange is always shorter than the basic\n      range. Otherwise, use a recursive call to add the additional range. */\n\n      else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */\n      else if (od > end && oc <= end + 1)\n        {\n        end = od;       /* Extend upwards */\n        if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff);\n        }\n      else n8 += add_to_class(classbits, uchardptr, options, cd, oc, od);\n      }\n    }\n  else\n#endif  /* SUPPORT_UCP */\n\n  /* Not UTF-mode, or no UCP */\n\n  for (c = start; c <= classbits_end; c++)\n    {\n    SETBIT(classbits, cd->fcc[c]);\n    n8++;\n    }\n  }\n\n/* Now handle the original range. Adjust the final value according to the bit\nlength - this means that the same lists of (e.g.) horizontal spaces can be used\nin all cases. */\n\n#if defined COMPILE_PCRE8\n#ifdef SUPPORT_UTF\n  if ((options & PCRE_UTF8) == 0)\n#endif\n  if (end > 0xff) end = 0xff;\n\n#elif defined COMPILE_PCRE16\n#ifdef SUPPORT_UTF\n  if ((options & PCRE_UTF16) == 0)\n#endif\n  if (end > 0xffff) end = 0xffff;\n\n#endif /* COMPILE_PCRE[8|16] */\n\n/* Use the bitmap for characters < 256. Otherwise use extra data.*/\n\nfor (c = start; c <= classbits_end; c++)\n  {\n  /* Regardless of start, c will always be <= 255. */\n  SETBIT(classbits, c);\n  n8++;\n  }\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\nif (start <= 0xff) start = 0xff + 1;\n\nif (end >= start)\n  {\n  pcre_uchar *uchardata = *uchardptr;\n#ifdef SUPPORT_UTF\n  if ((options & PCRE_UTF8) != 0)  /* All UTFs use the same flag bit */\n    {\n    if (start < end)\n      {\n      *uchardata++ = XCL_RANGE;\n      uchardata += PRIV(ord2utf)(start, uchardata);\n      uchardata += PRIV(ord2utf)(end, uchardata);\n      }\n    else if (start == end)\n      {\n      *uchardata++ = XCL_SINGLE;\n      uchardata += PRIV(ord2utf)(start, uchardata);\n      }\n    }\n  else\n#endif  /* SUPPORT_UTF */\n\n  /* Without UTF support, character values are constrained by the bit length,\n  and can only be > 256 for 16-bit and 32-bit libraries. */\n\n#ifdef COMPILE_PCRE8\n    {}\n#else\n  if (start < end)\n    {\n    *uchardata++ = XCL_RANGE;\n    *uchardata++ = start;\n    *uchardata++ = end;\n    }\n  else if (start == end)\n    {\n    *uchardata++ = XCL_SINGLE;\n    *uchardata++ = start;\n    }\n#endif\n\n  *uchardptr = uchardata;   /* Updata extra data pointer */\n  }\n#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */\n\nreturn n8;    /* Number of 8-bit characters */\n}\n\n\n\n\n/*************************************************\n*        Add a list of characters to a class     *\n*************************************************/\n\n/* This function is used for adding a list of case-equivalent characters to a\nclass, and also for adding a list of horizontal or vertical whitespace. If the\nlist is in order (which it should be), ranges of characters are detected and\nhandled appropriately. This function is mutually recursive with the function\nabove.\n\nArguments:\n  classbits     the bit map for characters < 256\n  uchardptr     points to the pointer for extra data\n  options       the options word\n  cd            contains pointers to tables etc.\n  p             points to row of 32-bit values, terminated by NOTACHAR\n  except        character to omit; this is used when adding lists of\n                  case-equivalent characters to avoid including the one we\n                  already know about\n\nReturns:        the number of < 256 characters added\n                the pointer to extra data is updated\n*/\n\nstatic int\nadd_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr, int options,\n  compile_data *cd, const pcre_uint32 *p, unsigned int except)\n{\nint n8 = 0;\nwhile (p[0] < NOTACHAR)\n  {\n  int n = 0;\n  if (p[0] != except)\n    {\n    while(p[n+1] == p[0] + n + 1) n++;\n    n8 += add_to_class(classbits, uchardptr, options, cd, p[0], p[n]);\n    }\n  p += n + 1;\n  }\nreturn n8;\n}\n\n\n\n/*************************************************\n*    Add characters not in a list to a class     *\n*************************************************/\n\n/* This function is used for adding the complement of a list of horizontal or\nvertical whitespace to a class. The list must be in order.\n\nArguments:\n  classbits     the bit map for characters < 256\n  uchardptr     points to the pointer for extra data\n  options       the options word\n  cd            contains pointers to tables etc.\n  p             points to row of 32-bit values, terminated by NOTACHAR\n\nReturns:        the number of < 256 characters added\n                the pointer to extra data is updated\n*/\n\nstatic int\nadd_not_list_to_class(pcre_uint8 *classbits, pcre_uchar **uchardptr,\n  int options, compile_data *cd, const pcre_uint32 *p)\n{\nBOOL utf = (options & PCRE_UTF8) != 0;\nint n8 = 0;\nif (p[0] > 0)\n  n8 += add_to_class(classbits, uchardptr, options, cd, 0, p[0] - 1);\nwhile (p[0] < NOTACHAR)\n  {\n  while (p[1] == p[0] + 1) p++;\n  n8 += add_to_class(classbits, uchardptr, options, cd, p[0] + 1,\n    (p[1] == NOTACHAR) ? (utf ? 0x10ffffu : 0xffffffffu) : p[1] - 1);\n  p++;\n  }\nreturn n8;\n}\n\n\n\n/*************************************************\n*           Compile one branch                   *\n*************************************************/\n\n/* Scan the pattern, compiling it into the a vector. If the options are\nchanged during the branch, the pointer is used to change the external options\nbits. This function is used during the pre-compile phase when we are trying\nto find out the amount of memory needed, as well as during the real compile\nphase. The value of lengthptr distinguishes the two phases.\n\nArguments:\n  optionsptr        pointer to the option bits\n  codeptr           points to the pointer to the current code point\n  ptrptr            points to the current pattern pointer\n  errorcodeptr      points to error code variable\n  firstcharptr      place to put the first required character\n  firstcharflagsptr place to put the first character flags, or a negative number\n  reqcharptr        place to put the last required character\n  reqcharflagsptr   place to put the last required character flags, or a negative number\n  bcptr             points to current branch chain\n  cond_depth        conditional nesting depth\n  cd                contains pointers to tables etc.\n  lengthptr         NULL during the real compile phase\n                    points to length accumulator during pre-compile phase\n\nReturns:            TRUE on success\n                    FALSE, with *errorcodeptr set non-zero on error\n*/\n\nstatic BOOL\ncompile_branch(int *optionsptr, pcre_uchar **codeptr,\n  const pcre_uchar **ptrptr, int *errorcodeptr,\n  pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr,\n  pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr,\n  branch_chain *bcptr, int cond_depth,\n  compile_data *cd, int *lengthptr)\n{\nint repeat_type, op_type;\nint repeat_min = 0, repeat_max = 0;      /* To please picky compilers */\nint bravalue = 0;\nint greedy_default, greedy_non_default;\npcre_uint32 firstchar, reqchar;\npcre_int32 firstcharflags, reqcharflags;\npcre_uint32 zeroreqchar, zerofirstchar;\npcre_int32 zeroreqcharflags, zerofirstcharflags;\npcre_int32 req_caseopt, reqvary, tempreqvary;\nint options = *optionsptr;               /* May change dynamically */\nint after_manual_callout = 0;\nint length_prevgroup = 0;\nregister pcre_uint32 c;\nint escape;\nregister pcre_uchar *code = *codeptr;\npcre_uchar *last_code = code;\npcre_uchar *orig_code = code;\npcre_uchar *tempcode;\nBOOL inescq = FALSE;\nBOOL groupsetfirstchar = FALSE;\nconst pcre_uchar *ptr = *ptrptr;\nconst pcre_uchar *tempptr;\nconst pcre_uchar *nestptr = NULL;\npcre_uchar *previous = NULL;\npcre_uchar *previous_callout = NULL;\nsize_t item_hwm_offset = 0;\npcre_uint8 classbits[32];\n\n/* We can fish out the UTF-8 setting once and for all into a BOOL, but we\nmust not do this for other options (e.g. PCRE_EXTENDED) because they may change\ndynamically as we process the pattern. */\n\n#ifdef SUPPORT_UTF\n/* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */\nBOOL utf = (options & PCRE_UTF8) != 0;\n#ifndef COMPILE_PCRE32\npcre_uchar utf_chars[6];\n#endif\n#else\nBOOL utf = FALSE;\n#endif\n\n/* Helper variables for OP_XCLASS opcode (for characters > 255). We define\nclass_uchardata always so that it can be passed to add_to_class() always,\nthough it will not be used in non-UTF 8-bit cases. This avoids having to supply\nalternative calls for the different cases. */\n\npcre_uchar *class_uchardata;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\nBOOL xclass;\npcre_uchar *class_uchardata_base;\n#endif\n\n#ifdef PCRE_DEBUG\nif (lengthptr != NULL) DPRINTF((\">> start branch\\n\"));\n#endif\n\n/* Set up the default and non-default settings for greediness */\n\ngreedy_default = ((options & PCRE_UNGREEDY) != 0);\ngreedy_non_default = greedy_default ^ 1;\n\n/* Initialize no first byte, no required byte. REQ_UNSET means \"no char\nmatching encountered yet\". It gets changed to REQ_NONE if we hit something that\nmatches a non-fixed char first char; reqchar just remains unset if we never\nfind one.\n\nWhen we hit a repeat whose minimum is zero, we may have to adjust these values\nto take the zero repeat into account. This is implemented by setting them to\nzerofirstbyte and zeroreqchar when such a repeat is encountered. The individual\nitem types that can be repeated set these backoff variables appropriately. */\n\nfirstchar = reqchar = zerofirstchar = zeroreqchar = 0;\nfirstcharflags = reqcharflags = zerofirstcharflags = zeroreqcharflags = REQ_UNSET;\n\n/* The variable req_caseopt contains either the REQ_CASELESS value\nor zero, according to the current setting of the caseless flag. The\nREQ_CASELESS leaves the lower 28 bit empty. It is added into the\nfirstchar or reqchar variables to record the case status of the\nvalue. This is used only for ASCII characters. */\n\nreq_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS:0;\n\n/* Switch on next character until the end of the branch */\n\nfor (;; ptr++)\n  {\n  BOOL negate_class;\n  BOOL should_flip_negation;\n  BOOL possessive_quantifier;\n  BOOL is_quantifier;\n  BOOL is_recurse;\n  BOOL reset_bracount;\n  int class_has_8bitchar;\n  int class_one_char;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  BOOL xclass_has_prop;\n#endif\n  int newoptions;\n  int recno;\n  int refsign;\n  int skipbytes;\n  pcre_uint32 subreqchar, subfirstchar;\n  pcre_int32 subreqcharflags, subfirstcharflags;\n  int terminator;\n  unsigned int mclength;\n  unsigned int tempbracount;\n  pcre_uint32 ec;\n  pcre_uchar mcbuffer[8];\n\n  /* Come here to restart the loop without advancing the pointer. */\n\n  REDO_LOOP:\n\n  /* Get next character in the pattern */\n\n  c = *ptr;\n\n  /* If we are at the end of a nested substitution, revert to the outer level\n  string. Nesting only happens one level deep. */\n\n  if (c == CHAR_NULL && nestptr != NULL)\n    {\n    ptr = nestptr;\n    nestptr = NULL;\n    c = *ptr;\n    }\n\n  /* If we are in the pre-compile phase, accumulate the length used for the\n  previous cycle of this loop. */\n\n  if (lengthptr != NULL)\n    {\n#ifdef PCRE_DEBUG\n    if (code > cd->hwm) cd->hwm = code;                 /* High water info */\n#endif\n    if (code > cd->start_workspace + cd->workspace_size -\n        WORK_SIZE_SAFETY_MARGIN)                       /* Check for overrun */\n      {\n      *errorcodeptr = (code >= cd->start_workspace + cd->workspace_size)?\n        ERR52 : ERR87;\n      goto FAILED;\n      }\n\n    /* There is at least one situation where code goes backwards: this is the\n    case of a zero quantifier after a class (e.g. [ab]{0}). At compile time,\n    the class is simply eliminated. However, it is created first, so we have to\n    allow memory for it. Therefore, don't ever reduce the length at this point.\n    */\n\n    if (code < last_code) code = last_code;\n\n    /* Paranoid check for integer overflow */\n\n    if (OFLOW_MAX - *lengthptr < code - last_code)\n      {\n      *errorcodeptr = ERR20;\n      goto FAILED;\n      }\n\n    *lengthptr += (int)(code - last_code);\n    DPRINTF((\"length=%d added %d c=%c (0x%x)\\n\", *lengthptr,\n      (int)(code - last_code), c, c));\n\n    /* If \"previous\" is set and it is not at the start of the work space, move\n    it back to there, in order to avoid filling up the work space. Otherwise,\n    if \"previous\" is NULL, reset the current code pointer to the start. */\n\n    if (previous != NULL)\n      {\n      if (previous > orig_code)\n        {\n        memmove(orig_code, previous, IN_UCHARS(code - previous));\n        code -= previous - orig_code;\n        previous = orig_code;\n        }\n      }\n    else code = orig_code;\n\n    /* Remember where this code item starts so we can pick up the length\n    next time round. */\n\n    last_code = code;\n    }\n\n  /* In the real compile phase, just check the workspace used by the forward\n  reference list. */\n\n  else if (cd->hwm > cd->start_workspace + cd->workspace_size)\n    {\n    *errorcodeptr = ERR52;\n    goto FAILED;\n    }\n\n  /* If in \\Q...\\E, check for the end; if not, we have a literal. Otherwise an\n  isolated \\E is ignored. */\n\n  if (c != CHAR_NULL)\n    {\n    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)\n      {\n      inescq = FALSE;\n      ptr++;\n      continue;\n      }\n    else if (inescq)\n      {\n      if (previous_callout != NULL)\n        {\n        if (lengthptr == NULL)  /* Don't attempt in pre-compile phase */\n          complete_callout(previous_callout, ptr, cd);\n        previous_callout = NULL;\n        }\n      if ((options & PCRE_AUTO_CALLOUT) != 0)\n        {\n        previous_callout = code;\n        code = auto_callout(code, ptr, cd);\n        }\n      goto NORMAL_CHAR;\n      }\n\n    /* Check for the start of a \\Q...\\E sequence. We must do this here rather\n    than later in case it is immediately followed by \\E, which turns it into a\n    \"do nothing\" sequence. */\n\n    if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q)\n      {\n      inescq = TRUE;\n      ptr++;\n      continue;\n      }\n    }\n\n  /* In extended mode, skip white space and comments. */\n\n  if ((options & PCRE_EXTENDED) != 0)\n    {\n    const pcre_uchar *wscptr = ptr;\n    while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);\n    if (c == CHAR_NUMBER_SIGN)\n      {\n      ptr++;\n      while (*ptr != CHAR_NULL)\n        {\n        if (IS_NEWLINE(ptr))         /* For non-fixed-length newline cases, */\n          {                          /* IS_NEWLINE sets cd->nllen. */\n          ptr += cd->nllen;\n          break;\n          }\n        ptr++;\n#ifdef SUPPORT_UTF\n        if (utf) FORWARDCHAR(ptr);\n#endif\n        }\n      }\n\n    /* If we skipped any characters, restart the loop. Otherwise, we didn't see\n    a comment. */\n\n    if (ptr > wscptr) goto REDO_LOOP;\n    }\n\n  /* Skip over (?# comments. We need to do this here because we want to know if\n  the next thing is a quantifier, and these comments may come between an item\n  and its quantifier. */\n\n  if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK &&\n      ptr[2] == CHAR_NUMBER_SIGN)\n    {\n    ptr += 3;\n    while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;\n    if (*ptr == CHAR_NULL)\n      {\n      *errorcodeptr = ERR18;\n      goto FAILED;\n      }\n    continue;\n    }\n\n  /* See if the next thing is a quantifier. */\n\n  is_quantifier =\n    c == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK ||\n    (c == CHAR_LEFT_CURLY_BRACKET && is_counted_repeat(ptr+1));\n\n  /* Fill in length of a previous callout, except when the next thing is a\n  quantifier or when processing a property substitution string in UCP mode. */\n\n  if (!is_quantifier && previous_callout != NULL && nestptr == NULL &&\n       after_manual_callout-- <= 0)\n    {\n    if (lengthptr == NULL)      /* Don't attempt in pre-compile phase */\n      complete_callout(previous_callout, ptr, cd);\n    previous_callout = NULL;\n    }\n\n  /* Create auto callout, except for quantifiers, or while processing property\n  strings that are substituted for \\w etc in UCP mode. */\n\n  if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier && nestptr == NULL)\n    {\n    previous_callout = code;\n    code = auto_callout(code, ptr, cd);\n    }\n\n  /* Process the next pattern item. */\n\n  switch(c)\n    {\n    /* ===================================================================*/\n    case CHAR_NULL:                /* The branch terminates at string end */\n    case CHAR_VERTICAL_LINE:       /* or | or ) */\n    case CHAR_RIGHT_PARENTHESIS:\n    *firstcharptr = firstchar;\n    *firstcharflagsptr = firstcharflags;\n    *reqcharptr = reqchar;\n    *reqcharflagsptr = reqcharflags;\n    *codeptr = code;\n    *ptrptr = ptr;\n    if (lengthptr != NULL)\n      {\n      if (OFLOW_MAX - *lengthptr < code - last_code)\n        {\n        *errorcodeptr = ERR20;\n        goto FAILED;\n        }\n      *lengthptr += (int)(code - last_code);   /* To include callout length */\n      DPRINTF((\">> end branch\\n\"));\n      }\n    return TRUE;\n\n\n    /* ===================================================================*/\n    /* Handle single-character metacharacters. In multiline mode, ^ disables\n    the setting of any following char as a first character. */\n\n    case CHAR_CIRCUMFLEX_ACCENT:\n    previous = NULL;\n    if ((options & PCRE_MULTILINE) != 0)\n      {\n      if (firstcharflags == REQ_UNSET)\n        zerofirstcharflags = firstcharflags = REQ_NONE;\n      *code++ = OP_CIRCM;\n      }\n    else *code++ = OP_CIRC;\n    break;\n\n    case CHAR_DOLLAR_SIGN:\n    previous = NULL;\n    *code++ = ((options & PCRE_MULTILINE) != 0)? OP_DOLLM : OP_DOLL;\n    break;\n\n    /* There can never be a first char if '.' is first, whatever happens about\n    repeats. The value of reqchar doesn't change either. */\n\n    case CHAR_DOT:\n    if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n    zerofirstchar = firstchar;\n    zerofirstcharflags = firstcharflags;\n    zeroreqchar = reqchar;\n    zeroreqcharflags = reqcharflags;\n    previous = code;\n    item_hwm_offset = cd->hwm - cd->start_workspace;\n    *code++ = ((options & PCRE_DOTALL) != 0)? OP_ALLANY: OP_ANY;\n    break;\n\n\n    /* ===================================================================*/\n    /* Character classes. If the included characters are all < 256, we build a\n    32-byte bitmap of the permitted characters, except in the special case\n    where there is only one such character. For negated classes, we build the\n    map as usual, then invert it at the end. However, we use a different opcode\n    so that data characters > 255 can be handled correctly.\n\n    If the class contains characters outside the 0-255 range, a different\n    opcode is compiled. It may optionally have a bit map for characters < 256,\n    but those above are are explicitly listed afterwards. A flag byte tells\n    whether the bitmap is present, and whether this is a negated class or not.\n\n    In JavaScript compatibility mode, an isolated ']' causes an error. In\n    default (Perl) mode, it is treated as a data character. */\n\n    case CHAR_RIGHT_SQUARE_BRACKET:\n    if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)\n      {\n      *errorcodeptr = ERR64;\n      goto FAILED;\n      }\n    goto NORMAL_CHAR;\n\n    /* In another (POSIX) regex library, the ugly syntax [[:<:]] and [[:>:]] is\n    used for \"start of word\" and \"end of word\". As these are otherwise illegal\n    sequences, we don't break anything by recognizing them. They are replaced\n    by \\b(?=\\w) and \\b(?<=\\w) respectively. Sequences like [a[:<:]] are\n    erroneous and are handled by the normal code below. */\n\n    case CHAR_LEFT_SQUARE_BRACKET:\n    if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)\n      {\n      nestptr = ptr + 7;\n      ptr = sub_start_of_word;\n      goto REDO_LOOP;\n      }\n\n    if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)\n      {\n      nestptr = ptr + 7;\n      ptr = sub_end_of_word;\n      goto REDO_LOOP;\n      }\n\n    /* Handle a real character class. */\n\n    previous = code;\n    item_hwm_offset = cd->hwm - cd->start_workspace;\n\n    /* PCRE supports POSIX class stuff inside a class. Perl gives an error if\n    they are encountered at the top level, so we'll do that too. */\n\n    if ((ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||\n         ptr[1] == CHAR_EQUALS_SIGN) &&\n        check_posix_syntax(ptr, &tempptr))\n      {\n      *errorcodeptr = (ptr[1] == CHAR_COLON)? ERR13 : ERR31;\n      goto FAILED;\n      }\n\n    /* If the first character is '^', set the negation flag and skip it. Also,\n    if the first few characters (either before or after ^) are \\Q\\E or \\E we\n    skip them too. This makes for compatibility with Perl. */\n\n    negate_class = FALSE;\n    for (;;)\n      {\n      c = *(++ptr);\n      if (c == CHAR_BACKSLASH)\n        {\n        if (ptr[1] == CHAR_E)\n          ptr++;\n        else if (STRNCMP_UC_C8(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0)\n          ptr += 3;\n        else\n          break;\n        }\n      else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT)\n        negate_class = TRUE;\n      else break;\n      }\n\n    /* Empty classes are allowed in JavaScript compatibility mode. Otherwise,\n    an initial ']' is taken as a data character -- the code below handles\n    that. In JS mode, [] must always fail, so generate OP_FAIL, whereas\n    [^] must match any character, so generate OP_ALLANY. */\n\n    if (c == CHAR_RIGHT_SQUARE_BRACKET &&\n        (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0)\n      {\n      *code++ = negate_class? OP_ALLANY : OP_FAIL;\n      if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n      zerofirstchar = firstchar;\n      zerofirstcharflags = firstcharflags;\n      break;\n      }\n\n    /* If a class contains a negative special such as \\S, we need to flip the\n    negation flag at the end, so that support for characters > 255 works\n    correctly (they are all included in the class). */\n\n    should_flip_negation = FALSE;\n\n    /* Extended class (xclass) will be used when characters > 255\n    might match. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    xclass = FALSE;\n    class_uchardata = code + LINK_SIZE + 2;   /* For XCLASS items */\n    class_uchardata_base = class_uchardata;   /* Save the start */\n#endif\n\n    /* For optimization purposes, we track some properties of the class:\n    class_has_8bitchar will be non-zero if the class contains at least one <\n    256 character; class_one_char will be 1 if the class contains just one\n    character; xclass_has_prop will be TRUE if unicode property checks\n    are present in the class. */\n\n    class_has_8bitchar = 0;\n    class_one_char = 0;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    xclass_has_prop = FALSE;\n#endif\n\n    /* Initialize the 32-char bit map to all zeros. We build the map in a\n    temporary bit of memory, in case the class contains fewer than two\n    8-bit characters because in that case the compiled code doesn't use the bit\n    map. */\n\n    memset(classbits, 0, 32 * sizeof(pcre_uint8));\n\n    /* Process characters until ] is reached. By writing this as a \"do\" it\n    means that an initial ] is taken as a data character. At the start of the\n    loop, c contains the first byte of the character. */\n\n    if (c != CHAR_NULL) do\n      {\n      const pcre_uchar *oldptr;\n\n#ifdef SUPPORT_UTF\n      if (utf && HAS_EXTRALEN(c))\n        {                           /* Braces are required because the */\n        GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */\n        }\n#endif\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n      /* In the pre-compile phase, accumulate the length of any extra\n      data and reset the pointer. This is so that very large classes that\n      contain a zillion > 255 characters no longer overwrite the work space\n      (which is on the stack). We have to remember that there was XCLASS data,\n      however. */\n\n      if (class_uchardata > class_uchardata_base) xclass = TRUE;\n\n      if (lengthptr != NULL && class_uchardata > class_uchardata_base)\n        {\n        *lengthptr += (int)(class_uchardata - class_uchardata_base);\n        class_uchardata = class_uchardata_base;\n        }\n#endif\n\n      /* Inside \\Q...\\E everything is literal except \\E */\n\n      if (inescq)\n        {\n        if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)  /* If we are at \\E */\n          {\n          inescq = FALSE;                   /* Reset literal state */\n          ptr++;                            /* Skip the 'E' */\n          continue;                         /* Carry on with next */\n          }\n        goto CHECK_RANGE;                   /* Could be range if \\E follows */\n        }\n\n      /* Handle POSIX class names. Perl allows a negation extension of the\n      form [:^name:]. A square bracket that doesn't match the syntax is\n      treated as a literal. We also recognize the POSIX constructions\n      [.ch.] and [=ch=] (\"collating elements\") and fault them, as Perl\n      5.6 and 5.8 do. */\n\n      if (c == CHAR_LEFT_SQUARE_BRACKET &&\n          (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||\n           ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr))\n        {\n        BOOL local_negate = FALSE;\n        int posix_class, taboffset, tabopt;\n        register const pcre_uint8 *cbits = cd->cbits;\n        pcre_uint8 pbits[32];\n\n        if (ptr[1] != CHAR_COLON)\n          {\n          *errorcodeptr = ERR31;\n          goto FAILED;\n          }\n\n        ptr += 2;\n        if (*ptr == CHAR_CIRCUMFLEX_ACCENT)\n          {\n          local_negate = TRUE;\n          should_flip_negation = TRUE;  /* Note negative special */\n          ptr++;\n          }\n\n        posix_class = check_posix_name(ptr, (int)(tempptr - ptr));\n        if (posix_class < 0)\n          {\n          *errorcodeptr = ERR30;\n          goto FAILED;\n          }\n\n        /* If matching is caseless, upper and lower are converted to\n        alpha. This relies on the fact that the class table starts with\n        alpha, lower, upper as the first 3 entries. */\n\n        if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)\n          posix_class = 0;\n\n        /* When PCRE_UCP is set, some of the POSIX classes are converted to\n        different escape sequences that use Unicode properties \\p or \\P. Others\n        that are not available via \\p or \\P generate XCL_PROP/XCL_NOTPROP\n        directly. */\n\n#ifdef SUPPORT_UCP\n        if ((options & PCRE_UCP) != 0)\n          {\n          unsigned int ptype = 0;\n          int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0);\n\n          /* The posix_substitutes table specifies which POSIX classes can be\n          converted to \\p or \\P items. */\n\n          if (posix_substitutes[pc] != NULL)\n            {\n            nestptr = tempptr + 1;\n            ptr = posix_substitutes[pc] - 1;\n            continue;\n            }\n\n          /* There are three other classes that generate special property calls\n          that are recognized only in an XCLASS. */\n\n          else switch(posix_class)\n            {\n            case PC_GRAPH:\n            ptype = PT_PXGRAPH;\n            /* Fall through */\n            case PC_PRINT:\n            if (ptype == 0) ptype = PT_PXPRINT;\n            /* Fall through */\n            case PC_PUNCT:\n            if (ptype == 0) ptype = PT_PXPUNCT;\n            *class_uchardata++ = local_negate? XCL_NOTPROP : XCL_PROP;\n            *class_uchardata++ = ptype;\n            *class_uchardata++ = 0;\n            xclass_has_prop = TRUE;\n            ptr = tempptr + 1;\n            continue;\n\n            /* For the other POSIX classes (ascii, cntrl, xdigit) we are going\n            to fall through to the non-UCP case and build a bit map for\n            characters with code points less than 256. If we are in a negated\n            POSIX class, characters with code points greater than 255 must\n            either all match or all not match. In the special case where we\n            have not yet generated any xclass data, and this is the final item\n            in the overall class, we need do nothing: later on, the opcode\n            OP_NCLASS will be used to indicate that characters greater than 255\n            are acceptable. If we have already seen an xclass item or one may\n            follow (we have to assume that it might if this is not the end of\n            the class), explicitly list all wide codepoints, which will then\n            either not match or match, depending on whether the class is or is\n            not negated. */\n\n            default:\n            if (local_negate &&\n                (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET))\n              {\n              *class_uchardata++ = XCL_RANGE;\n              class_uchardata += PRIV(ord2utf)(0x100, class_uchardata);\n              class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata);\n              }\n            break;\n            }\n          }\n#endif\n        /* In the non-UCP case, or when UCP makes no difference, we build the\n        bit map for the POSIX class in a chunk of local store because we may be\n        adding and subtracting from it, and we don't want to subtract bits that\n        may be in the main map already. At the end we or the result into the\n        bit map that is being built. */\n\n        posix_class *= 3;\n\n        /* Copy in the first table (always present) */\n\n        memcpy(pbits, cbits + posix_class_maps[posix_class],\n          32 * sizeof(pcre_uint8));\n\n        /* If there is a second table, add or remove it as required. */\n\n        taboffset = posix_class_maps[posix_class + 1];\n        tabopt = posix_class_maps[posix_class + 2];\n\n        if (taboffset >= 0)\n          {\n          if (tabopt >= 0)\n            for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset];\n          else\n            for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset];\n          }\n\n        /* Now see if we need to remove any special characters. An option\n        value of 1 removes vertical space and 2 removes underscore. */\n\n        if (tabopt < 0) tabopt = -tabopt;\n        if (tabopt == 1) pbits[1] &= ~0x3c;\n          else if (tabopt == 2) pbits[11] &= 0x7f;\n\n        /* Add the POSIX table or its complement into the main table that is\n        being built and we are done. */\n\n        if (local_negate)\n          for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c];\n        else\n          for (c = 0; c < 32; c++) classbits[c] |= pbits[c];\n\n        ptr = tempptr + 1;\n        /* Every class contains at least one < 256 character. */\n        class_has_8bitchar = 1;\n        /* Every class contains at least two characters. */\n        class_one_char = 2;\n        continue;    /* End of POSIX syntax handling */\n        }\n\n      /* Backslash may introduce a single character, or it may introduce one\n      of the specials, which just set a flag. The sequence \\b is a special\n      case. Inside a class (and only there) it is treated as backspace. We\n      assume that other escapes have more than one character in them, so\n      speculatively set both class_has_8bitchar and class_one_char bigger\n      than one. Unrecognized escapes fall through and are either treated\n      as literal characters (by default), or are faulted if\n      PCRE_EXTRA is set. */\n\n      if (c == CHAR_BACKSLASH)\n        {\n        escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options,\n          TRUE);\n        if (*errorcodeptr != 0) goto FAILED;\n        if (escape == 0) c = ec;\n        else if (escape == ESC_b) c = CHAR_BS; /* \\b is backspace in a class */\n        else if (escape == ESC_N)          /* \\N is not supported in a class */\n          {\n          *errorcodeptr = ERR71;\n          goto FAILED;\n          }\n        else if (escape == ESC_Q)            /* Handle start of quoted string */\n          {\n          if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)\n            {\n            ptr += 2; /* avoid empty string */\n            }\n          else inescq = TRUE;\n          continue;\n          }\n        else if (escape == ESC_E) continue;  /* Ignore orphan \\E */\n\n        else\n          {\n          register const pcre_uint8 *cbits = cd->cbits;\n          /* Every class contains at least two < 256 characters. */\n          class_has_8bitchar++;\n          /* Every class contains at least two characters. */\n          class_one_char += 2;\n\n          switch (escape)\n            {\n#ifdef SUPPORT_UCP\n            case ESC_du:     /* These are the values given for \\d etc */\n            case ESC_DU:     /* when PCRE_UCP is set. We replace the */\n            case ESC_wu:     /* escape sequence with an appropriate \\p */\n            case ESC_WU:     /* or \\P to test Unicode properties instead */\n            case ESC_su:     /* of the default ASCII testing. */\n            case ESC_SU:\n            nestptr = ptr;\n            ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */\n            class_has_8bitchar--;                /* Undo! */\n            continue;\n#endif\n            case ESC_d:\n            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];\n            continue;\n\n            case ESC_D:\n            should_flip_negation = TRUE;\n            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit];\n            continue;\n\n            case ESC_w:\n            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word];\n            continue;\n\n            case ESC_W:\n            should_flip_negation = TRUE;\n            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];\n            continue;\n\n            /* Perl 5.004 onwards omitted VT from \\s, but restored it at Perl\n            5.18. Before PCRE 8.34, we had to preserve the VT bit if it was\n            previously set by something earlier in the character class.\n            Luckily, the value of CHAR_VT is 0x0b in both ASCII and EBCDIC, so\n            we could just adjust the appropriate bit. From PCRE 8.34 we no\n            longer treat \\s and \\S specially. */\n\n            case ESC_s:\n            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];\n            continue;\n\n            case ESC_S:\n            should_flip_negation = TRUE;\n            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];\n            continue;\n\n            /* The rest apply in both UCP and non-UCP cases. */\n\n            case ESC_h:\n            (void)add_list_to_class(classbits, &class_uchardata, options, cd,\n              PRIV(hspace_list), NOTACHAR);\n            continue;\n\n            case ESC_H:\n            (void)add_not_list_to_class(classbits, &class_uchardata, options,\n              cd, PRIV(hspace_list));\n            continue;\n\n            case ESC_v:\n            (void)add_list_to_class(classbits, &class_uchardata, options, cd,\n              PRIV(vspace_list), NOTACHAR);\n            continue;\n\n            case ESC_V:\n            (void)add_not_list_to_class(classbits, &class_uchardata, options,\n              cd, PRIV(vspace_list));\n            continue;\n\n            case ESC_p:\n            case ESC_P:\n#ifdef SUPPORT_UCP\n              {\n              BOOL negated;\n              unsigned int ptype = 0, pdata = 0;\n              if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr))\n                goto FAILED;\n              *class_uchardata++ = ((escape == ESC_p) != negated)?\n                XCL_PROP : XCL_NOTPROP;\n              *class_uchardata++ = ptype;\n              *class_uchardata++ = pdata;\n              xclass_has_prop = TRUE;\n              class_has_8bitchar--;                /* Undo! */\n              continue;\n              }\n#else\n            *errorcodeptr = ERR45;\n            goto FAILED;\n#endif\n            /* Unrecognized escapes are faulted if PCRE is running in its\n            strict mode. By default, for compatibility with Perl, they are\n            treated as literals. */\n\n            default:\n            if ((options & PCRE_EXTRA) != 0)\n              {\n              *errorcodeptr = ERR7;\n              goto FAILED;\n              }\n            class_has_8bitchar--;    /* Undo the speculative increase. */\n            class_one_char -= 2;     /* Undo the speculative increase. */\n            c = *ptr;                /* Get the final character and fall through */\n            break;\n            }\n          }\n\n        /* Fall through if the escape just defined a single character (c >= 0).\n        This may be greater than 256. */\n\n        escape = 0;\n\n        }   /* End of backslash handling */\n\n      /* A character may be followed by '-' to form a range. However, Perl does\n      not permit ']' to be the end of the range. A '-' character at the end is\n      treated as a literal. Perl ignores orphaned \\E sequences entirely. The\n      code for handling \\Q and \\E is messy. */\n\n      CHECK_RANGE:\n      while (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)\n        {\n        inescq = FALSE;\n        ptr += 2;\n        }\n      oldptr = ptr;\n\n      /* Remember if \\r or \\n were explicitly used */\n\n      if (c == CHAR_CR || c == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF;\n\n      /* Check for range */\n\n      if (!inescq && ptr[1] == CHAR_MINUS)\n        {\n        pcre_uint32 d;\n        ptr += 2;\n        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) ptr += 2;\n\n        /* If we hit \\Q (not followed by \\E) at this point, go into escaped\n        mode. */\n\n        while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_Q)\n          {\n          ptr += 2;\n          if (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E)\n            { ptr += 2; continue; }\n          inescq = TRUE;\n          break;\n          }\n\n        /* Minus (hyphen) at the end of a class is treated as a literal, so put\n        back the pointer and jump to handle the character that preceded it. */\n\n        if (*ptr == CHAR_NULL || (!inescq && *ptr == CHAR_RIGHT_SQUARE_BRACKET))\n          {\n          ptr = oldptr;\n          goto CLASS_SINGLE_CHARACTER;\n          }\n\n        /* Otherwise, we have a potential range; pick up the next character */\n\n#ifdef SUPPORT_UTF\n        if (utf)\n          {                           /* Braces are required because the */\n          GETCHARLEN(d, ptr, ptr);    /* macro generates multiple statements */\n          }\n        else\n#endif\n        d = *ptr;  /* Not UTF-8 mode */\n\n        /* The second part of a range can be a single-character escape\n        sequence, but not any of the other escapes. Perl treats a hyphen as a\n        literal in such circumstances. However, in Perl's warning mode, a\n        warning is given, so PCRE now faults it as it is almost certainly a\n        mistake on the user's part. */\n\n        if (!inescq)\n          {\n          if (d == CHAR_BACKSLASH)\n            {\n            int descape;\n            descape = check_escape(&ptr, &d, errorcodeptr, cd->bracount, options, TRUE);\n            if (*errorcodeptr != 0) goto FAILED;\n\n            /* 0 means a character was put into d; \\b is backspace; any other\n            special causes an error. */\n\n            if (descape != 0)\n              {\n              if (descape == ESC_b) d = CHAR_BS; else\n                {\n                *errorcodeptr = ERR83;\n                goto FAILED;\n                }\n              }\n            }\n\n          /* A hyphen followed by a POSIX class is treated in the same way. */\n\n          else if (d == CHAR_LEFT_SQUARE_BRACKET &&\n                   (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT ||\n                    ptr[1] == CHAR_EQUALS_SIGN) &&\n                   check_posix_syntax(ptr, &tempptr))\n            {\n            *errorcodeptr = ERR83;\n            goto FAILED;\n            }\n          }\n\n        /* Check that the two values are in the correct order. Optimize\n        one-character ranges. */\n\n        if (d < c)\n          {\n          *errorcodeptr = ERR8;\n          goto FAILED;\n          }\n        if (d == c) goto CLASS_SINGLE_CHARACTER;  /* A few lines below */\n\n        /* We have found a character range, so single character optimizations\n        cannot be done anymore. Any value greater than 1 indicates that there\n        is more than one character. */\n\n        class_one_char = 2;\n\n        /* Remember an explicit \\r or \\n, and add the range to the class. */\n\n        if (d == CHAR_CR || d == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF;\n\n        class_has_8bitchar +=\n          add_to_class(classbits, &class_uchardata, options, cd, c, d);\n\n        continue;   /* Go get the next char in the class */\n        }\n\n      /* Handle a single character - we can get here for a normal non-escape\n      char, or after \\ that introduces a single character or for an apparent\n      range that isn't. Only the value 1 matters for class_one_char, so don't\n      increase it if it is already 2 or more ... just in case there's a class\n      with a zillion characters in it. */\n\n      CLASS_SINGLE_CHARACTER:\n      if (class_one_char < 2) class_one_char++;\n\n      /* If xclass_has_prop is false and class_one_char is 1, we have the first\n      single character in the class, and there have been no prior ranges, or\n      XCLASS items generated by escapes. If this is the final character in the\n      class, we can optimize by turning the item into a 1-character OP_CHAR[I]\n      if it's positive, or OP_NOT[I] if it's negative. In the positive case, it\n      can cause firstchar to be set. Otherwise, there can be no first char if\n      this item is first, whatever repeat count may follow. In the case of\n      reqchar, save the previous value for reinstating. */\n\n      if (!inescq &&\n#ifdef SUPPORT_UCP\n          !xclass_has_prop &&\n#endif\n          class_one_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET)\n        {\n        ptr++;\n        zeroreqchar = reqchar;\n        zeroreqcharflags = reqcharflags;\n\n        if (negate_class)\n          {\n#ifdef SUPPORT_UCP\n          int d;\n#endif\n          if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n          zerofirstchar = firstchar;\n          zerofirstcharflags = firstcharflags;\n\n          /* For caseless UTF-8 mode when UCP support is available, check\n          whether this character has more than one other case. If so, generate\n          a special OP_NOTPROP item instead of OP_NOTI. */\n\n#ifdef SUPPORT_UCP\n          if (utf && (options & PCRE_CASELESS) != 0 &&\n              (d = UCD_CASESET(c)) != 0)\n            {\n            *code++ = OP_NOTPROP;\n            *code++ = PT_CLIST;\n            *code++ = d;\n            }\n          else\n#endif\n          /* Char has only one other case, or UCP not available */\n\n            {\n            *code++ = ((options & PCRE_CASELESS) != 0)? OP_NOTI: OP_NOT;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n            if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)\n              code += PRIV(ord2utf)(c, code);\n            else\n#endif\n              *code++ = c;\n            }\n\n          /* We are finished with this character class */\n\n          goto END_CLASS;\n          }\n\n        /* For a single, positive character, get the value into mcbuffer, and\n        then we can handle this with the normal one-character code. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n        if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)\n          mclength = PRIV(ord2utf)(c, mcbuffer);\n        else\n#endif\n          {\n          mcbuffer[0] = c;\n          mclength = 1;\n          }\n        goto ONE_CHAR;\n        }       /* End of 1-char optimization */\n\n      /* There is more than one character in the class, or an XCLASS item\n      has been generated. Add this character to the class. */\n\n      class_has_8bitchar +=\n        add_to_class(classbits, &class_uchardata, options, cd, c, c);\n      }\n\n    /* Loop until ']' reached. This \"while\" is the end of the \"do\" far above.\n    If we are at the end of an internal nested string, revert to the outer\n    string. */\n\n    while (((c = *(++ptr)) != CHAR_NULL ||\n           (nestptr != NULL &&\n             (ptr = nestptr, nestptr = NULL, c = *(++ptr)) != CHAR_NULL)) &&\n           (c != CHAR_RIGHT_SQUARE_BRACKET || inescq));\n\n    /* Check for missing terminating ']' */\n\n    if (c == CHAR_NULL)\n      {\n      *errorcodeptr = ERR6;\n      goto FAILED;\n      }\n\n    /* We will need an XCLASS if data has been placed in class_uchardata. In\n    the second phase this is a sufficient test. However, in the pre-compile\n    phase, class_uchardata gets emptied to prevent workspace overflow, so it\n    only if the very last character in the class needs XCLASS will it contain\n    anything at this point. For this reason, xclass gets set TRUE above when\n    uchar_classdata is emptied, and that's why this code is the way it is here\n    instead of just doing a test on class_uchardata below. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    if (class_uchardata > class_uchardata_base) xclass = TRUE;\n#endif\n\n    /* If this is the first thing in the branch, there can be no first char\n    setting, whatever the repeat count. Any reqchar setting must remain\n    unchanged after any kind of repeat. */\n\n    if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n    zerofirstchar = firstchar;\n    zerofirstcharflags = firstcharflags;\n    zeroreqchar = reqchar;\n    zeroreqcharflags = reqcharflags;\n\n    /* If there are characters with values > 255, we have to compile an\n    extended class, with its own opcode, unless there was a negated special\n    such as \\S in the class, and PCRE_UCP is not set, because in that case all\n    characters > 255 are in the class, so any that were explicitly given as\n    well can be ignored. If (when there are explicit characters > 255 that must\n    be listed) there are no characters < 256, we can omit the bitmap in the\n    actual compiled code. */\n\n#ifdef SUPPORT_UTF\n    if (xclass && (xclass_has_prop || !should_flip_negation ||\n        (options & PCRE_UCP) != 0))\n#elif !defined COMPILE_PCRE8\n    if (xclass && (xclass_has_prop || !should_flip_negation))\n#endif\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n      {\n      /* For non-UCP wide characters, in a non-negative class containing \\S or\n      similar (should_flip_negation is set), all characters greater than 255\n      must be in the class. */\n\n      if (\n#if defined COMPILE_PCRE8\n           utf &&\n#endif\n           should_flip_negation && !negate_class && (options & PCRE_UCP) == 0)\n        {\n        *class_uchardata++ = XCL_RANGE;\n        if (utf)   /* Will always be utf in the 8-bit library */\n          {\n          class_uchardata += PRIV(ord2utf)(0x100, class_uchardata);\n          class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata);\n          }\n        else       /* Can only happen for the 16-bit & 32-bit libraries */\n          {\n#if defined COMPILE_PCRE16\n          *class_uchardata++ = 0x100;\n          *class_uchardata++ = 0xffffu;\n#elif defined COMPILE_PCRE32\n          *class_uchardata++ = 0x100;\n          *class_uchardata++ = 0xffffffffu;\n#endif\n          }\n        }\n\n      *class_uchardata++ = XCL_END;    /* Marks the end of extra data */\n      *code++ = OP_XCLASS;\n      code += LINK_SIZE;\n      *code = negate_class? XCL_NOT:0;\n      if (xclass_has_prop) *code |= XCL_HASPROP;\n\n      /* If the map is required, move up the extra data to make room for it;\n      otherwise just move the code pointer to the end of the extra data. */\n\n      if (class_has_8bitchar > 0)\n        {\n        *code++ |= XCL_MAP;\n        memmove(code + (32 / sizeof(pcre_uchar)), code,\n          IN_UCHARS(class_uchardata - code));\n        if (negate_class && !xclass_has_prop)\n          for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];\n        memcpy(code, classbits, 32);\n        code = class_uchardata + (32 / sizeof(pcre_uchar));\n        }\n      else code = class_uchardata;\n\n      /* Now fill in the complete length of the item */\n\n      PUT(previous, 1, (int)(code - previous));\n      break;   /* End of class handling */\n      }\n\n    /* Even though any XCLASS list is now discarded, we must allow for\n    its memory. */\n\n    if (lengthptr != NULL)\n      *lengthptr += (int)(class_uchardata - class_uchardata_base);\n#endif\n\n    /* If there are no characters > 255, or they are all to be included or\n    excluded, set the opcode to OP_CLASS or OP_NCLASS, depending on whether the\n    whole class was negated and whether there were negative specials such as \\S\n    (non-UCP) in the class. Then copy the 32-byte map into the code vector,\n    negating it if necessary. */\n\n    *code++ = (negate_class == should_flip_negation) ? OP_CLASS : OP_NCLASS;\n    if (lengthptr == NULL)    /* Save time in the pre-compile phase */\n      {\n      if (negate_class)\n        for (c = 0; c < 32; c++) classbits[c] = ~classbits[c];\n      memcpy(code, classbits, 32);\n      }\n    code += 32 / sizeof(pcre_uchar);\n\n    END_CLASS:\n    break;\n\n\n    /* ===================================================================*/\n    /* Various kinds of repeat; '{' is not necessarily a quantifier, but this\n    has been tested above. */\n\n    case CHAR_LEFT_CURLY_BRACKET:\n    if (!is_quantifier) goto NORMAL_CHAR;\n    ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr);\n    if (*errorcodeptr != 0) goto FAILED;\n    goto REPEAT;\n\n    case CHAR_ASTERISK:\n    repeat_min = 0;\n    repeat_max = -1;\n    goto REPEAT;\n\n    case CHAR_PLUS:\n    repeat_min = 1;\n    repeat_max = -1;\n    goto REPEAT;\n\n    case CHAR_QUESTION_MARK:\n    repeat_min = 0;\n    repeat_max = 1;\n\n    REPEAT:\n    if (previous == NULL)\n      {\n      *errorcodeptr = ERR9;\n      goto FAILED;\n      }\n\n    if (repeat_min == 0)\n      {\n      firstchar = zerofirstchar;    /* Adjust for zero repeat */\n      firstcharflags = zerofirstcharflags;\n      reqchar = zeroreqchar;        /* Ditto */\n      reqcharflags = zeroreqcharflags;\n      }\n\n    /* Remember whether this is a variable length repeat */\n\n    reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;\n\n    op_type = 0;                    /* Default single-char op codes */\n    possessive_quantifier = FALSE;  /* Default not possessive quantifier */\n\n    /* Save start of previous item, in case we have to move it up in order to\n    insert something before it. */\n\n    tempcode = previous;\n\n    /* Before checking for a possessive quantifier, we must skip over\n    whitespace and comments in extended mode because Perl allows white space at\n    this point. */\n\n    if ((options & PCRE_EXTENDED) != 0)\n      {\n      const pcre_uchar *p = ptr + 1;\n      for (;;)\n        {\n        while (MAX_255(*p) && (cd->ctypes[*p] & ctype_space) != 0) p++;\n        if (*p != CHAR_NUMBER_SIGN) break;\n        p++;\n        while (*p != CHAR_NULL)\n          {\n          if (IS_NEWLINE(p))         /* For non-fixed-length newline cases, */\n            {                        /* IS_NEWLINE sets cd->nllen. */\n            p += cd->nllen;\n            break;\n            }\n          p++;\n#ifdef SUPPORT_UTF\n          if (utf) FORWARDCHAR(p);\n#endif\n          }           /* Loop for comment characters */\n        }             /* Loop for multiple comments */\n      ptr = p - 1;    /* Character before the next significant one. */\n      }\n\n    /* We also need to skip over (?# comments, which are not dependent on\n    extended mode. */\n\n    if (ptr[1] == CHAR_LEFT_PARENTHESIS && ptr[2] == CHAR_QUESTION_MARK &&\n        ptr[3] == CHAR_NUMBER_SIGN)\n      {\n      ptr += 4;\n      while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;\n      if (*ptr == CHAR_NULL)\n        {\n        *errorcodeptr = ERR18;\n        goto FAILED;\n        }\n      }\n\n    /* If the next character is '+', we have a possessive quantifier. This\n    implies greediness, whatever the setting of the PCRE_UNGREEDY option.\n    If the next character is '?' this is a minimizing repeat, by default,\n    but if PCRE_UNGREEDY is set, it works the other way round. We change the\n    repeat type to the non-default. */\n\n    if (ptr[1] == CHAR_PLUS)\n      {\n      repeat_type = 0;                  /* Force greedy */\n      possessive_quantifier = TRUE;\n      ptr++;\n      }\n    else if (ptr[1] == CHAR_QUESTION_MARK)\n      {\n      repeat_type = greedy_non_default;\n      ptr++;\n      }\n    else repeat_type = greedy_default;\n\n    /* If previous was a recursion call, wrap it in atomic brackets so that\n    previous becomes the atomic group. All recursions were so wrapped in the\n    past, but it no longer happens for non-repeated recursions. In fact, the\n    repeated ones could be re-implemented independently so as not to need this,\n    but for the moment we rely on the code for repeating groups. */\n\n    if (*previous == OP_RECURSE)\n      {\n      memmove(previous + 1 + LINK_SIZE, previous, IN_UCHARS(1 + LINK_SIZE));\n      *previous = OP_ONCE;\n      PUT(previous, 1, 2 + 2*LINK_SIZE);\n      previous[2 + 2*LINK_SIZE] = OP_KET;\n      PUT(previous, 3 + 2*LINK_SIZE, 2 + 2*LINK_SIZE);\n      code += 2 + 2 * LINK_SIZE;\n      length_prevgroup = 3 + 3*LINK_SIZE;\n\n      /* When actually compiling, we need to check whether this was a forward\n      reference, and if so, adjust the offset. */\n\n      if (lengthptr == NULL && cd->hwm >= cd->start_workspace + LINK_SIZE)\n        {\n        int offset = GET(cd->hwm, -LINK_SIZE);\n        if (offset == previous + 1 - cd->start_code)\n          PUT(cd->hwm, -LINK_SIZE, offset + 1 + LINK_SIZE);\n        }\n      }\n\n    /* Now handle repetition for the different types of item. */\n\n    /* If previous was a character or negated character match, abolish the item\n    and generate a repeat item instead. If a char item has a minimum of more\n    than one, ensure that it is set in reqchar - it might not be if a sequence\n    such as x{3} is the first thing in a branch because the x will have gone\n    into firstchar instead.  */\n\n    if (*previous == OP_CHAR || *previous == OP_CHARI\n        || *previous == OP_NOT || *previous == OP_NOTI)\n      {\n      switch (*previous)\n        {\n        default: /* Make compiler happy. */\n        case OP_CHAR:  op_type = OP_STAR - OP_STAR; break;\n        case OP_CHARI: op_type = OP_STARI - OP_STAR; break;\n        case OP_NOT:   op_type = OP_NOTSTAR - OP_STAR; break;\n        case OP_NOTI:  op_type = OP_NOTSTARI - OP_STAR; break;\n        }\n\n      /* Deal with UTF characters that take up more than one character. It's\n      easier to write this out separately than try to macrify it. Use c to\n      hold the length of the character in bytes, plus UTF_LENGTH to flag that\n      it's a length rather than a small character. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n      if (utf && NOT_FIRSTCHAR(code[-1]))\n        {\n        pcre_uchar *lastchar = code - 1;\n        BACKCHAR(lastchar);\n        c = (int)(code - lastchar);     /* Length of UTF-8 character */\n        memcpy(utf_chars, lastchar, IN_UCHARS(c)); /* Save the char */\n        c |= UTF_LENGTH;                /* Flag c as a length */\n        }\n      else\n#endif /* SUPPORT_UTF */\n\n      /* Handle the case of a single charater - either with no UTF support, or\n      with UTF disabled, or for a single character UTF character. */\n        {\n        c = code[-1];\n        if (*previous <= OP_CHARI && repeat_min > 1)\n          {\n          reqchar = c;\n          reqcharflags = req_caseopt | cd->req_varyopt;\n          }\n        }\n\n      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */\n      }\n\n    /* If previous was a character type match (\\d or similar), abolish it and\n    create a suitable repeat item. The code is shared with single-character\n    repeats by setting op_type to add a suitable offset into repeat_type. Note\n    the the Unicode property types will be present only when SUPPORT_UCP is\n    defined, but we don't wrap the little bits of code here because it just\n    makes it horribly messy. */\n\n    else if (*previous < OP_EODN)\n      {\n      pcre_uchar *oldcode;\n      int prop_type, prop_value;\n      op_type = OP_TYPESTAR - OP_STAR;  /* Use type opcodes */\n      c = *previous;\n\n      OUTPUT_SINGLE_REPEAT:\n      if (*previous == OP_PROP || *previous == OP_NOTPROP)\n        {\n        prop_type = previous[1];\n        prop_value = previous[2];\n        }\n      else prop_type = prop_value = -1;\n\n      oldcode = code;\n      code = previous;                  /* Usually overwrite previous item */\n\n      /* If the maximum is zero then the minimum must also be zero; Perl allows\n      this case, so we do too - by simply omitting the item altogether. */\n\n      if (repeat_max == 0) goto END_REPEAT;\n\n      /* Combine the op_type with the repeat_type */\n\n      repeat_type += op_type;\n\n      /* A minimum of zero is handled either as the special case * or ?, or as\n      an UPTO, with the maximum given. */\n\n      if (repeat_min == 0)\n        {\n        if (repeat_max == -1) *code++ = OP_STAR + repeat_type;\n          else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;\n        else\n          {\n          *code++ = OP_UPTO + repeat_type;\n          PUT2INC(code, 0, repeat_max);\n          }\n        }\n\n      /* A repeat minimum of 1 is optimized into some special cases. If the\n      maximum is unlimited, we use OP_PLUS. Otherwise, the original item is\n      left in place and, if the maximum is greater than 1, we use OP_UPTO with\n      one less than the maximum. */\n\n      else if (repeat_min == 1)\n        {\n        if (repeat_max == -1)\n          *code++ = OP_PLUS + repeat_type;\n        else\n          {\n          code = oldcode;                 /* leave previous item in place */\n          if (repeat_max == 1) goto END_REPEAT;\n          *code++ = OP_UPTO + repeat_type;\n          PUT2INC(code, 0, repeat_max - 1);\n          }\n        }\n\n      /* The case {n,n} is just an EXACT, while the general case {n,m} is\n      handled as an EXACT followed by an UPTO. */\n\n      else\n        {\n        *code++ = OP_EXACT + op_type;  /* NB EXACT doesn't have repeat_type */\n        PUT2INC(code, 0, repeat_min);\n\n        /* If the maximum is unlimited, insert an OP_STAR. Before doing so,\n        we have to insert the character for the previous code. For a repeated\n        Unicode property match, there are two extra bytes that define the\n        required property. In UTF-8 mode, long characters have their length in\n        c, with the UTF_LENGTH bit as a flag. */\n\n        if (repeat_max < 0)\n          {\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n          if (utf && (c & UTF_LENGTH) != 0)\n            {\n            memcpy(code, utf_chars, IN_UCHARS(c & 7));\n            code += c & 7;\n            }\n          else\n#endif\n            {\n            *code++ = c;\n            if (prop_type >= 0)\n              {\n              *code++ = prop_type;\n              *code++ = prop_value;\n              }\n            }\n          *code++ = OP_STAR + repeat_type;\n          }\n\n        /* Else insert an UPTO if the max is greater than the min, again\n        preceded by the character, for the previously inserted code. If the\n        UPTO is just for 1 instance, we can use QUERY instead. */\n\n        else if (repeat_max != repeat_min)\n          {\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n          if (utf && (c & UTF_LENGTH) != 0)\n            {\n            memcpy(code, utf_chars, IN_UCHARS(c & 7));\n            code += c & 7;\n            }\n          else\n#endif\n          *code++ = c;\n          if (prop_type >= 0)\n            {\n            *code++ = prop_type;\n            *code++ = prop_value;\n            }\n          repeat_max -= repeat_min;\n\n          if (repeat_max == 1)\n            {\n            *code++ = OP_QUERY + repeat_type;\n            }\n          else\n            {\n            *code++ = OP_UPTO + repeat_type;\n            PUT2INC(code, 0, repeat_max);\n            }\n          }\n        }\n\n      /* The character or character type itself comes last in all cases. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n      if (utf && (c & UTF_LENGTH) != 0)\n        {\n        memcpy(code, utf_chars, IN_UCHARS(c & 7));\n        code += c & 7;\n        }\n      else\n#endif\n      *code++ = c;\n\n      /* For a repeated Unicode property match, there are two extra bytes that\n      define the required property. */\n\n#ifdef SUPPORT_UCP\n      if (prop_type >= 0)\n        {\n        *code++ = prop_type;\n        *code++ = prop_value;\n        }\n#endif\n      }\n\n    /* If previous was a character class or a back reference, we put the repeat\n    stuff after it, but just skip the item if the repeat was {0,0}. */\n\n    else if (*previous == OP_CLASS || *previous == OP_NCLASS ||\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n             *previous == OP_XCLASS ||\n#endif\n             *previous == OP_REF   || *previous == OP_REFI ||\n             *previous == OP_DNREF || *previous == OP_DNREFI)\n      {\n      if (repeat_max == 0)\n        {\n        code = previous;\n        goto END_REPEAT;\n        }\n\n      if (repeat_min == 0 && repeat_max == -1)\n        *code++ = OP_CRSTAR + repeat_type;\n      else if (repeat_min == 1 && repeat_max == -1)\n        *code++ = OP_CRPLUS + repeat_type;\n      else if (repeat_min == 0 && repeat_max == 1)\n        *code++ = OP_CRQUERY + repeat_type;\n      else\n        {\n        *code++ = OP_CRRANGE + repeat_type;\n        PUT2INC(code, 0, repeat_min);\n        if (repeat_max == -1) repeat_max = 0;  /* 2-byte encoding for max */\n        PUT2INC(code, 0, repeat_max);\n        }\n      }\n\n    /* If previous was a bracket group, we may have to replicate it in certain\n    cases. Note that at this point we can encounter only the \"basic\" bracket\n    opcodes such as BRA and CBRA, as this is the place where they get converted\n    into the more special varieties such as BRAPOS and SBRA. A test for >=\n    OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK,\n    ASSERTBACK_NOT, ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND.\n    Originally, PCRE did not allow repetition of assertions, but now it does,\n    for Perl compatibility. */\n\n    else if (*previous >= OP_ASSERT && *previous <= OP_COND)\n      {\n      register int i;\n      int len = (int)(code - previous);\n      size_t base_hwm_offset = item_hwm_offset;\n      pcre_uchar *bralink = NULL;\n      pcre_uchar *brazeroptr = NULL;\n\n      /* Repeating a DEFINE group is pointless, but Perl allows the syntax, so\n      we just ignore the repeat. */\n\n      if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF)\n        goto END_REPEAT;\n\n      /* There is no sense in actually repeating assertions. The only potential\n      use of repetition is in cases when the assertion is optional. Therefore,\n      if the minimum is greater than zero, just ignore the repeat. If the\n      maximum is not zero or one, set it to 1. */\n\n      if (*previous < OP_ONCE)    /* Assertion */\n        {\n        if (repeat_min > 0) goto END_REPEAT;\n        if (repeat_max < 0 || repeat_max > 1) repeat_max = 1;\n        }\n\n      /* The case of a zero minimum is special because of the need to stick\n      OP_BRAZERO in front of it, and because the group appears once in the\n      data, whereas in other cases it appears the minimum number of times. For\n      this reason, it is simplest to treat this case separately, as otherwise\n      the code gets far too messy. There are several special subcases when the\n      minimum is zero. */\n\n      if (repeat_min == 0)\n        {\n        /* If the maximum is also zero, we used to just omit the group from the\n        output altogether, like this:\n\n        ** if (repeat_max == 0)\n        **   {\n        **   code = previous;\n        **   goto END_REPEAT;\n        **   }\n\n        However, that fails when a group or a subgroup within it is referenced\n        as a subroutine from elsewhere in the pattern, so now we stick in\n        OP_SKIPZERO in front of it so that it is skipped on execution. As we\n        don't have a list of which groups are referenced, we cannot do this\n        selectively.\n\n        If the maximum is 1 or unlimited, we just have to stick in the BRAZERO\n        and do no more at this point. However, we do need to adjust any\n        OP_RECURSE calls inside the group that refer to the group itself or any\n        internal or forward referenced group, because the offset is from the\n        start of the whole regex. Temporarily terminate the pattern while doing\n        this. */\n\n        if (repeat_max <= 1)    /* Covers 0, 1, and unlimited */\n          {\n          *code = OP_END;\n          adjust_recurse(previous, 1, utf, cd, item_hwm_offset);\n          memmove(previous + 1, previous, IN_UCHARS(len));\n          code++;\n          if (repeat_max == 0)\n            {\n            *previous++ = OP_SKIPZERO;\n            goto END_REPEAT;\n            }\n          brazeroptr = previous;    /* Save for possessive optimizing */\n          *previous++ = OP_BRAZERO + repeat_type;\n          }\n\n        /* If the maximum is greater than 1 and limited, we have to replicate\n        in a nested fashion, sticking OP_BRAZERO before each set of brackets.\n        The first one has to be handled carefully because it's the original\n        copy, which has to be moved up. The remainder can be handled by code\n        that is common with the non-zero minimum case below. We have to\n        adjust the value or repeat_max, since one less copy is required. Once\n        again, we may have to adjust any OP_RECURSE calls inside the group. */\n\n        else\n          {\n          int offset;\n          *code = OP_END;\n          adjust_recurse(previous, 2 + LINK_SIZE, utf, cd, item_hwm_offset);\n          memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(len));\n          code += 2 + LINK_SIZE;\n          *previous++ = OP_BRAZERO + repeat_type;\n          *previous++ = OP_BRA;\n\n          /* We chain together the bracket offset fields that have to be\n          filled in later when the ends of the brackets are reached. */\n\n          offset = (bralink == NULL)? 0 : (int)(previous - bralink);\n          bralink = previous;\n          PUTINC(previous, 0, offset);\n          }\n\n        repeat_max--;\n        }\n\n      /* If the minimum is greater than zero, replicate the group as many\n      times as necessary, and adjust the maximum to the number of subsequent\n      copies that we need. If we set a first char from the group, and didn't\n      set a required char, copy the latter from the former. If there are any\n      forward reference subroutine calls in the group, there will be entries on\n      the workspace list; replicate these with an appropriate increment. */\n\n      else\n        {\n        if (repeat_min > 1)\n          {\n          /* In the pre-compile phase, we don't actually do the replication. We\n          just adjust the length as if we had. Do some paranoid checks for\n          potential integer overflow. The INT64_OR_DOUBLE type is a 64-bit\n          integer type when available, otherwise double. */\n\n          if (lengthptr != NULL)\n            {\n            int delta = (repeat_min - 1)*length_prevgroup;\n            if ((INT64_OR_DOUBLE)(repeat_min - 1)*\n                  (INT64_OR_DOUBLE)length_prevgroup >\n                    (INT64_OR_DOUBLE)INT_MAX ||\n                OFLOW_MAX - *lengthptr < delta)\n              {\n              *errorcodeptr = ERR20;\n              goto FAILED;\n              }\n            *lengthptr += delta;\n            }\n\n          /* This is compiling for real. If there is a set first byte for\n          the group, and we have not yet set a \"required byte\", set it. Make\n          sure there is enough workspace for copying forward references before\n          doing the copy. */\n\n          else\n            {\n            if (groupsetfirstchar && reqcharflags < 0)\n              {\n              reqchar = firstchar;\n              reqcharflags = firstcharflags;\n              }\n\n            for (i = 1; i < repeat_min; i++)\n              {\n              pcre_uchar *hc;\n              size_t this_hwm_offset = cd->hwm - cd->start_workspace;\n              memcpy(code, previous, IN_UCHARS(len));\n\n              while (cd->hwm > cd->start_workspace + cd->workspace_size -\n                     WORK_SIZE_SAFETY_MARGIN -\n                     (this_hwm_offset - base_hwm_offset))\n                {\n                *errorcodeptr = expand_workspace(cd);\n                if (*errorcodeptr != 0) goto FAILED;\n                }\n\n              for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;\n                   hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;\n                   hc += LINK_SIZE)\n                {\n                PUT(cd->hwm, 0, GET(hc, 0) + len);\n                cd->hwm += LINK_SIZE;\n                }\n              base_hwm_offset = this_hwm_offset;\n              code += len;\n              }\n            }\n          }\n\n        if (repeat_max > 0) repeat_max -= repeat_min;\n        }\n\n      /* This code is common to both the zero and non-zero minimum cases. If\n      the maximum is limited, it replicates the group in a nested fashion,\n      remembering the bracket starts on a stack. In the case of a zero minimum,\n      the first one was set up above. In all cases the repeat_max now specifies\n      the number of additional copies needed. Again, we must remember to\n      replicate entries on the forward reference list. */\n\n      if (repeat_max >= 0)\n        {\n        /* In the pre-compile phase, we don't actually do the replication. We\n        just adjust the length as if we had. For each repetition we must add 1\n        to the length for BRAZERO and for all but the last repetition we must\n        add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some\n        paranoid checks to avoid integer overflow. The INT64_OR_DOUBLE type is\n        a 64-bit integer type when available, otherwise double. */\n\n        if (lengthptr != NULL && repeat_max > 0)\n          {\n          int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) -\n                      2 - 2*LINK_SIZE;   /* Last one doesn't nest */\n          if ((INT64_OR_DOUBLE)repeat_max *\n                (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE)\n                  > (INT64_OR_DOUBLE)INT_MAX ||\n              OFLOW_MAX - *lengthptr < delta)\n            {\n            *errorcodeptr = ERR20;\n            goto FAILED;\n            }\n          *lengthptr += delta;\n          }\n\n        /* This is compiling for real */\n\n        else for (i = repeat_max - 1; i >= 0; i--)\n          {\n          pcre_uchar *hc;\n          size_t this_hwm_offset = cd->hwm - cd->start_workspace;\n\n          *code++ = OP_BRAZERO + repeat_type;\n\n          /* All but the final copy start a new nesting, maintaining the\n          chain of brackets outstanding. */\n\n          if (i != 0)\n            {\n            int offset;\n            *code++ = OP_BRA;\n            offset = (bralink == NULL)? 0 : (int)(code - bralink);\n            bralink = code;\n            PUTINC(code, 0, offset);\n            }\n\n          memcpy(code, previous, IN_UCHARS(len));\n\n          /* Ensure there is enough workspace for forward references before\n          copying them. */\n\n          while (cd->hwm > cd->start_workspace + cd->workspace_size -\n                 WORK_SIZE_SAFETY_MARGIN -\n                 (this_hwm_offset - base_hwm_offset))\n            {\n            *errorcodeptr = expand_workspace(cd);\n            if (*errorcodeptr != 0) goto FAILED;\n            }\n\n          for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;\n               hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;\n               hc += LINK_SIZE)\n            {\n            PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1));\n            cd->hwm += LINK_SIZE;\n            }\n          base_hwm_offset = this_hwm_offset;\n          code += len;\n          }\n\n        /* Now chain through the pending brackets, and fill in their length\n        fields (which are holding the chain links pro tem). */\n\n        while (bralink != NULL)\n          {\n          int oldlinkoffset;\n          int offset = (int)(code - bralink + 1);\n          pcre_uchar *bra = code - offset;\n          oldlinkoffset = GET(bra, 1);\n          bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;\n          *code++ = OP_KET;\n          PUTINC(code, 0, offset);\n          PUT(bra, 1, offset);\n          }\n        }\n\n      /* If the maximum is unlimited, set a repeater in the final copy. For\n      ONCE brackets, that's all we need to do. However, possessively repeated\n      ONCE brackets can be converted into non-capturing brackets, as the\n      behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to\n      deal with possessive ONCEs specially.\n\n      Otherwise, when we are doing the actual compile phase, check to see\n      whether this group is one that could match an empty string. If so,\n      convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so\n      that runtime checking can be done. [This check is also applied to ONCE\n      groups at runtime, but in a different way.]\n\n      Then, if the quantifier was possessive and the bracket is not a\n      conditional, we convert the BRA code to the POS form, and the KET code to\n      KETRPOS. (It turns out to be convenient at runtime to detect this kind of\n      subpattern at both the start and at the end.) The use of special opcodes\n      makes it possible to reduce greatly the stack usage in pcre_exec(). If\n      the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO.\n\n      Then, if the minimum number of matches is 1 or 0, cancel the possessive\n      flag so that the default action below, of wrapping everything inside\n      atomic brackets, does not happen. When the minimum is greater than 1,\n      there will be earlier copies of the group, and so we still have to wrap\n      the whole thing. */\n\n      else\n        {\n        pcre_uchar *ketcode = code - 1 - LINK_SIZE;\n        pcre_uchar *bracode = ketcode - GET(ketcode, 1);\n\n        /* Convert possessive ONCE brackets to non-capturing */\n\n        if ((*bracode == OP_ONCE || *bracode == OP_ONCE_NC) &&\n            possessive_quantifier) *bracode = OP_BRA;\n\n        /* For non-possessive ONCE brackets, all we need to do is to\n        set the KET. */\n\n        if (*bracode == OP_ONCE || *bracode == OP_ONCE_NC)\n          *ketcode = OP_KETRMAX + repeat_type;\n\n        /* Handle non-ONCE brackets and possessive ONCEs (which have been\n        converted to non-capturing above). */\n\n        else\n          {\n          /* In the compile phase, check for empty string matching. */\n\n          if (lengthptr == NULL)\n            {\n            pcre_uchar *scode = bracode;\n            do\n              {\n              if (could_be_empty_branch(scode, ketcode, utf, cd, NULL))\n                {\n                *bracode += OP_SBRA - OP_BRA;\n                break;\n                }\n              scode += GET(scode, 1);\n              }\n            while (*scode == OP_ALT);\n            }\n\n          /* A conditional group with only one branch has an implicit empty\n          alternative branch. */\n\n          if (*bracode == OP_COND && bracode[GET(bracode,1)] != OP_ALT)\n            *bracode = OP_SCOND;\n\n          /* Handle possessive quantifiers. */\n\n          if (possessive_quantifier)\n            {\n            /* For COND brackets, we wrap the whole thing in a possessively\n            repeated non-capturing bracket, because we have not invented POS\n            versions of the COND opcodes. Because we are moving code along, we\n            must ensure that any pending recursive references are updated. */\n\n            if (*bracode == OP_COND || *bracode == OP_SCOND)\n              {\n              int nlen = (int)(code - bracode);\n              *code = OP_END;\n              adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);\n              memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen));\n              code += 1 + LINK_SIZE;\n              nlen += 1 + LINK_SIZE;\n              *bracode = (*bracode == OP_COND)? OP_BRAPOS : OP_SBRAPOS;\n              *code++ = OP_KETRPOS;\n              PUTINC(code, 0, nlen);\n              PUT(bracode, 1, nlen);\n              }\n\n            /* For non-COND brackets, we modify the BRA code and use KETRPOS. */\n\n            else\n              {\n              *bracode += 1;              /* Switch to xxxPOS opcodes */\n              *ketcode = OP_KETRPOS;\n              }\n\n            /* If the minimum is zero, mark it as possessive, then unset the\n            possessive flag when the minimum is 0 or 1. */\n\n            if (brazeroptr != NULL) *brazeroptr = OP_BRAPOSZERO;\n            if (repeat_min < 2) possessive_quantifier = FALSE;\n            }\n\n          /* Non-possessive quantifier */\n\n          else *ketcode = OP_KETRMAX + repeat_type;\n          }\n        }\n      }\n\n    /* If previous is OP_FAIL, it was generated by an empty class [] in\n    JavaScript mode. The other ways in which OP_FAIL can be generated, that is\n    by (*FAIL) or (?!) set previous to NULL, which gives a \"nothing to repeat\"\n    error above. We can just ignore the repeat in JS case. */\n\n    else if (*previous == OP_FAIL) goto END_REPEAT;\n\n    /* Else there's some kind of shambles */\n\n    else\n      {\n      *errorcodeptr = ERR11;\n      goto FAILED;\n      }\n\n    /* If the character following a repeat is '+', possessive_quantifier is\n    TRUE. For some opcodes, there are special alternative opcodes for this\n    case. For anything else, we wrap the entire repeated item inside OP_ONCE\n    brackets. Logically, the '+' notation is just syntactic sugar, taken from\n    Sun's Java package, but the special opcodes can optimize it.\n\n    Some (but not all) possessively repeated subpatterns have already been\n    completely handled in the code just above. For them, possessive_quantifier\n    is always FALSE at this stage. Note that the repeated item starts at\n    tempcode, not at previous, which might be the first part of a string whose\n    (former) last char we repeated. */\n\n    if (possessive_quantifier)\n      {\n      int len;\n\n      /* Possessifying an EXACT quantifier has no effect, so we can ignore it.\n      However, QUERY, STAR, or UPTO may follow (for quantifiers such as {5,6},\n      {5,}, or {5,10}). We skip over an EXACT item; if the length of what\n      remains is greater than zero, there's a further opcode that can be\n      handled. If not, do nothing, leaving the EXACT alone. */\n\n      switch(*tempcode)\n        {\n        case OP_TYPEEXACT:\n        tempcode += PRIV(OP_lengths)[*tempcode] +\n          ((tempcode[1 + IMM2_SIZE] == OP_PROP\n          || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);\n        break;\n\n        /* CHAR opcodes are used for exacts whose count is 1. */\n\n        case OP_CHAR:\n        case OP_CHARI:\n        case OP_NOT:\n        case OP_NOTI:\n        case OP_EXACT:\n        case OP_EXACTI:\n        case OP_NOTEXACT:\n        case OP_NOTEXACTI:\n        tempcode += PRIV(OP_lengths)[*tempcode];\n#ifdef SUPPORT_UTF\n        if (utf && HAS_EXTRALEN(tempcode[-1]))\n          tempcode += GET_EXTRALEN(tempcode[-1]);\n#endif\n        break;\n\n        /* For the class opcodes, the repeat operator appears at the end;\n        adjust tempcode to point to it. */\n\n        case OP_CLASS:\n        case OP_NCLASS:\n        tempcode += 1 + 32/sizeof(pcre_uchar);\n        break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n        case OP_XCLASS:\n        tempcode += GET(tempcode, 1);\n        break;\n#endif\n        }\n\n      /* If tempcode is equal to code (which points to the end of the repeated\n      item), it means we have skipped an EXACT item but there is no following\n      QUERY, STAR, or UPTO; the value of len will be 0, and we do nothing. In\n      all other cases, tempcode will be pointing to the repeat opcode, and will\n      be less than code, so the value of len will be greater than 0. */\n\n      len = (int)(code - tempcode);\n      if (len > 0)\n        {\n        unsigned int repcode = *tempcode;\n\n        /* There is a table for possessifying opcodes, all of which are less\n        than OP_CALLOUT. A zero entry means there is no possessified version.\n        */\n\n        if (repcode < OP_CALLOUT && opcode_possessify[repcode] > 0)\n          *tempcode = opcode_possessify[repcode];\n\n        /* For opcode without a special possessified version, wrap the item in\n        ONCE brackets. Because we are moving code along, we must ensure that any\n        pending recursive references are updated. */\n\n        else\n          {\n          *code = OP_END;\n          adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);\n          memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));\n          code += 1 + LINK_SIZE;\n          len += 1 + LINK_SIZE;\n          tempcode[0] = OP_ONCE;\n          *code++ = OP_KET;\n          PUTINC(code, 0, len);\n          PUT(tempcode, 1, len);\n          }\n        }\n\n#ifdef NEVER\n      if (len > 0) switch (*tempcode)\n        {\n        case OP_STAR:  *tempcode = OP_POSSTAR; break;\n        case OP_PLUS:  *tempcode = OP_POSPLUS; break;\n        case OP_QUERY: *tempcode = OP_POSQUERY; break;\n        case OP_UPTO:  *tempcode = OP_POSUPTO; break;\n\n        case OP_STARI:  *tempcode = OP_POSSTARI; break;\n        case OP_PLUSI:  *tempcode = OP_POSPLUSI; break;\n        case OP_QUERYI: *tempcode = OP_POSQUERYI; break;\n        case OP_UPTOI:  *tempcode = OP_POSUPTOI; break;\n\n        case OP_NOTSTAR:  *tempcode = OP_NOTPOSSTAR; break;\n        case OP_NOTPLUS:  *tempcode = OP_NOTPOSPLUS; break;\n        case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break;\n        case OP_NOTUPTO:  *tempcode = OP_NOTPOSUPTO; break;\n\n        case OP_NOTSTARI:  *tempcode = OP_NOTPOSSTARI; break;\n        case OP_NOTPLUSI:  *tempcode = OP_NOTPOSPLUSI; break;\n        case OP_NOTQUERYI: *tempcode = OP_NOTPOSQUERYI; break;\n        case OP_NOTUPTOI:  *tempcode = OP_NOTPOSUPTOI; break;\n\n        case OP_TYPESTAR:  *tempcode = OP_TYPEPOSSTAR; break;\n        case OP_TYPEPLUS:  *tempcode = OP_TYPEPOSPLUS; break;\n        case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break;\n        case OP_TYPEUPTO:  *tempcode = OP_TYPEPOSUPTO; break;\n\n        case OP_CRSTAR:   *tempcode = OP_CRPOSSTAR; break;\n        case OP_CRPLUS:   *tempcode = OP_CRPOSPLUS; break;\n        case OP_CRQUERY:  *tempcode = OP_CRPOSQUERY; break;\n        case OP_CRRANGE:  *tempcode = OP_CRPOSRANGE; break;\n\n        /* Because we are moving code along, we must ensure that any\n        pending recursive references are updated. */\n\n        default:\n        *code = OP_END;\n        adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, item_hwm_offset);\n        memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));\n        code += 1 + LINK_SIZE;\n        len += 1 + LINK_SIZE;\n        tempcode[0] = OP_ONCE;\n        *code++ = OP_KET;\n        PUTINC(code, 0, len);\n        PUT(tempcode, 1, len);\n        break;\n        }\n#endif\n      }\n\n    /* In all case we no longer have a previous item. We also set the\n    \"follows varying string\" flag for subsequently encountered reqchars if\n    it isn't already set and we have just passed a varying length item. */\n\n    END_REPEAT:\n    previous = NULL;\n    cd->req_varyopt |= reqvary;\n    break;\n\n\n    /* ===================================================================*/\n    /* Start of nested parenthesized sub-expression, or comment or lookahead or\n    lookbehind or option setting or condition or all the other extended\n    parenthesis forms.  */\n\n    case CHAR_LEFT_PARENTHESIS:\n    ptr++;\n\n    /* Now deal with various \"verbs\" that can be introduced by '*'. */\n\n    if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'\n         || (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0))))\n      {\n      int i, namelen;\n      int arglen = 0;\n      const char *vn = verbnames;\n      const pcre_uchar *name = ptr + 1;\n      const pcre_uchar *arg = NULL;\n      previous = NULL;\n      ptr++;\n      while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;\n      namelen = (int)(ptr - name);\n\n      /* It appears that Perl allows any characters whatsoever, other than\n      a closing parenthesis, to appear in arguments, so we no longer insist on\n      letters, digits, and underscores. */\n\n      if (*ptr == CHAR_COLON)\n        {\n        arg = ++ptr;\n        while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;\n        arglen = (int)(ptr - arg);\n        if ((unsigned int)arglen > MAX_MARK)\n          {\n          *errorcodeptr = ERR75;\n          goto FAILED;\n          }\n        }\n\n      if (*ptr != CHAR_RIGHT_PARENTHESIS)\n        {\n        *errorcodeptr = ERR60;\n        goto FAILED;\n        }\n\n      /* Scan the table of verb names */\n\n      for (i = 0; i < verbcount; i++)\n        {\n        if (namelen == verbs[i].len &&\n            STRNCMP_UC_C8(name, vn, namelen) == 0)\n          {\n          int setverb;\n\n          /* Check for open captures before ACCEPT and convert it to\n          ASSERT_ACCEPT if in an assertion. */\n\n          if (verbs[i].op == OP_ACCEPT)\n            {\n            open_capitem *oc;\n            if (arglen != 0)\n              {\n              *errorcodeptr = ERR59;\n              goto FAILED;\n              }\n            cd->had_accept = TRUE;\n            for (oc = cd->open_caps; oc != NULL; oc = oc->next)\n              {\n              if (lengthptr != NULL)\n                {\n#ifdef COMPILE_PCRE8\n                *lengthptr += 1 + IMM2_SIZE;\n#elif defined COMPILE_PCRE16\n                *lengthptr += 2 + IMM2_SIZE;\n#elif defined COMPILE_PCRE32\n                *lengthptr += 4 + IMM2_SIZE;\n#endif\n                }\n              else\n                {\n                *code++ = OP_CLOSE;\n                PUT2INC(code, 0, oc->number);\n                }\n              }\n            setverb = *code++ =\n              (cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT;\n\n            /* Do not set firstchar after *ACCEPT */\n            if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n            }\n\n          /* Handle other cases with/without an argument */\n\n          else if (arglen == 0)\n            {\n            if (verbs[i].op < 0)   /* Argument is mandatory */\n              {\n              *errorcodeptr = ERR66;\n              goto FAILED;\n              }\n            setverb = *code++ = verbs[i].op;\n            }\n\n          else\n            {\n            if (verbs[i].op_arg < 0)   /* Argument is forbidden */\n              {\n              *errorcodeptr = ERR59;\n              goto FAILED;\n              }\n            setverb = *code++ = verbs[i].op_arg;\n            if (lengthptr != NULL)    /* In pass 1 just add in the length */\n              {                       /* to avoid potential workspace */\n              *lengthptr += arglen;   /* overflow. */\n              *code++ = 0;\n              }\n            else\n              {\n              *code++ = arglen;\n              memcpy(code, arg, IN_UCHARS(arglen));\n              code += arglen;\n              }\n            *code++ = 0;\n            }\n\n          switch (setverb)\n            {\n            case OP_THEN:\n            case OP_THEN_ARG:\n            cd->external_flags |= PCRE_HASTHEN;\n            break;\n\n            case OP_PRUNE:\n            case OP_PRUNE_ARG:\n            case OP_SKIP:\n            case OP_SKIP_ARG:\n            cd->had_pruneorskip = TRUE;\n            break;\n            }\n\n          break;  /* Found verb, exit loop */\n          }\n\n        vn += verbs[i].len + 1;\n        }\n\n      if (i < verbcount) continue;    /* Successfully handled a verb */\n      *errorcodeptr = ERR60;          /* Verb not recognized */\n      goto FAILED;\n      }\n\n    /* Initialize for \"real\" parentheses */\n\n    newoptions = options;\n    skipbytes = 0;\n    bravalue = OP_CBRA;\n    item_hwm_offset = cd->hwm - cd->start_workspace;\n    reset_bracount = FALSE;\n\n    /* Deal with the extended parentheses; all are introduced by '?', and the\n    appearance of any of them means that this is not a capturing group. */\n\n    if (*ptr == CHAR_QUESTION_MARK)\n      {\n      int i, set, unset, namelen;\n      int *optset;\n      const pcre_uchar *name;\n      pcre_uchar *slot;\n\n      switch (*(++ptr))\n        {\n        /* ------------------------------------------------------------ */\n        case CHAR_VERTICAL_LINE:  /* Reset capture count for each branch */\n        reset_bracount = TRUE;\n        cd->dupgroups = TRUE;     /* Record (?| encountered */\n        /* Fall through */\n\n        /* ------------------------------------------------------------ */\n        case CHAR_COLON:          /* Non-capturing bracket */\n        bravalue = OP_BRA;\n        ptr++;\n        break;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_LEFT_PARENTHESIS:\n        bravalue = OP_COND;       /* Conditional group */\n        tempptr = ptr;\n\n        /* A condition can be an assertion, a number (referring to a numbered\n        group's having been set), a name (referring to a named group), or 'R',\n        referring to recursion. R<digits> and R&name are also permitted for\n        recursion tests.\n\n        There are ways of testing a named group: (?(name)) is used by Python;\n        Perl 5.10 onwards uses (?(<name>) or (?('name')).\n\n        There is one unfortunate ambiguity, caused by history. 'R' can be the\n        recursive thing or the name 'R' (and similarly for 'R' followed by\n        digits). We look for a name first; if not found, we try the other case.\n\n        For compatibility with auto-callouts, we allow a callout to be\n        specified before a condition that is an assertion. First, check for the\n        syntax of a callout; if found, adjust the temporary pointer that is\n        used to check for an assertion condition. That's all that is needed! */\n\n        if (ptr[1] == CHAR_QUESTION_MARK && ptr[2] == CHAR_C)\n          {\n          for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;\n          if (ptr[i] == CHAR_RIGHT_PARENTHESIS)\n            tempptr += i + 1;\n\n          /* tempptr should now be pointing to the opening parenthesis of the\n          assertion condition. */\n\n          if (*tempptr != CHAR_LEFT_PARENTHESIS)\n            {\n            *errorcodeptr = ERR28;\n            goto FAILED;\n            }\n          }\n\n        /* For conditions that are assertions, check the syntax, and then exit\n        the switch. This will take control down to where bracketed groups,\n        including assertions, are processed. */\n\n        if (tempptr[1] == CHAR_QUESTION_MARK &&\n              (tempptr[2] == CHAR_EQUALS_SIGN ||\n               tempptr[2] == CHAR_EXCLAMATION_MARK ||\n                 (tempptr[2] == CHAR_LESS_THAN_SIGN &&\n                   (tempptr[3] == CHAR_EQUALS_SIGN ||\n                    tempptr[3] == CHAR_EXCLAMATION_MARK))))\n          {\n          cd->iscondassert = TRUE;\n          break;\n          }\n\n        /* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all\n        need to skip at least 1+IMM2_SIZE bytes at the start of the group. */\n\n        code[1+LINK_SIZE] = OP_CREF;\n        skipbytes = 1+IMM2_SIZE;\n        refsign = -1;     /* => not a number */\n        namelen = -1;     /* => not a name; must set to avoid warning */\n        name = NULL;      /* Always set to avoid warning */\n        recno = 0;        /* Always set to avoid warning */\n\n        /* Check for a test for recursion in a named group. */\n\n        ptr++;\n        if (*ptr == CHAR_R && ptr[1] == CHAR_AMPERSAND)\n          {\n          terminator = -1;\n          ptr += 2;\n          code[1+LINK_SIZE] = OP_RREF;    /* Change the type of test */\n          }\n\n        /* Check for a test for a named group's having been set, using the Perl\n        syntax (?(<name>) or (?('name'), and also allow for the original PCRE\n        syntax of (?(name) or for (?(+n), (?(-n), and just (?(n). */\n\n        else if (*ptr == CHAR_LESS_THAN_SIGN)\n          {\n          terminator = CHAR_GREATER_THAN_SIGN;\n          ptr++;\n          }\n        else if (*ptr == CHAR_APOSTROPHE)\n          {\n          terminator = CHAR_APOSTROPHE;\n          ptr++;\n          }\n        else\n          {\n          terminator = CHAR_NULL;\n          if (*ptr == CHAR_MINUS || *ptr == CHAR_PLUS) refsign = *ptr++;\n            else if (IS_DIGIT(*ptr)) refsign = 0;\n          }\n\n        /* Handle a number */\n\n        if (refsign >= 0)\n          {\n          while (IS_DIGIT(*ptr))\n            {\n            if (recno > INT_MAX / 10 - 1)  /* Integer overflow */\n              {\n              while (IS_DIGIT(*ptr)) ptr++;\n              *errorcodeptr = ERR61;\n              goto FAILED;\n              }\n            recno = recno * 10 + (int)(*ptr - CHAR_0);\n            ptr++;\n            }\n          }\n\n        /* Otherwise we expect to read a name; anything else is an error. When\n        a name is one of a number of duplicates, a different opcode is used and\n        it needs more memory. Unfortunately we cannot tell whether a name is a\n        duplicate in the first pass, so we have to allow for more memory. */\n\n        else\n          {\n          if (IS_DIGIT(*ptr))\n            {\n            *errorcodeptr = ERR84;\n            goto FAILED;\n            }\n          if (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_word) == 0)\n            {\n            *errorcodeptr = ERR28;   /* Assertion expected */\n            goto FAILED;\n            }\n          name = ptr++;\n          while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0)\n            {\n            ptr++;\n            }\n          namelen = (int)(ptr - name);\n          if (lengthptr != NULL) skipbytes += IMM2_SIZE;\n          }\n\n        /* Check the terminator */\n\n        if ((terminator > 0 && *ptr++ != (pcre_uchar)terminator) ||\n            *ptr++ != CHAR_RIGHT_PARENTHESIS)\n          {\n          ptr--;                  /* Error offset */\n          *errorcodeptr = ERR26;  /* Malformed number or name */\n          goto FAILED;\n          }\n\n        /* Do no further checking in the pre-compile phase. */\n\n        if (lengthptr != NULL) break;\n\n        /* In the real compile we do the work of looking for the actual\n        reference. If refsign is not negative, it means we have a number in\n        recno. */\n\n        if (refsign >= 0)\n          {\n          if (recno <= 0)\n            {\n            *errorcodeptr = ERR35;\n            goto FAILED;\n            }\n          if (refsign != 0) recno = (refsign == CHAR_MINUS)?\n            cd->bracount - recno + 1 : recno + cd->bracount;\n          if (recno <= 0 || recno > cd->final_bracount)\n            {\n            *errorcodeptr = ERR15;\n            goto FAILED;\n            }\n          PUT2(code, 2+LINK_SIZE, recno);\n          if (recno > cd->top_backref) cd->top_backref = recno;\n          break;\n          }\n\n        /* Otherwise look for the name. */\n\n        slot = cd->name_table;\n        for (i = 0; i < cd->names_found; i++)\n          {\n          if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 &&\n            slot[IMM2_SIZE+namelen] == 0) break;\n          slot += cd->name_entry_size;\n          }\n\n        /* Found the named subpattern. If the name is duplicated, add one to\n        the opcode to change CREF/RREF into DNCREF/DNRREF and insert\n        appropriate data values. Otherwise, just insert the unique subpattern\n        number. */\n\n        if (i < cd->names_found)\n          {\n          int offset = i++;\n          int count = 1;\n          recno = GET2(slot, 0);   /* Number from first found */\n          if (recno > cd->top_backref) cd->top_backref = recno;\n          for (; i < cd->names_found; i++)\n            {\n            slot += cd->name_entry_size;\n            if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) != 0 ||\n              (slot+IMM2_SIZE)[namelen] != 0) break;\n            count++;\n            }\n\n          if (count > 1)\n            {\n            PUT2(code, 2+LINK_SIZE, offset);\n            PUT2(code, 2+LINK_SIZE+IMM2_SIZE, count);\n            skipbytes += IMM2_SIZE;\n            code[1+LINK_SIZE]++;\n            }\n          else  /* Not a duplicated name */\n            {\n            PUT2(code, 2+LINK_SIZE, recno);\n            }\n          }\n\n        /* If terminator == CHAR_NULL it means that the name followed directly\n        after the opening parenthesis [e.g. (?(abc)...] and in this case there\n        are some further alternatives to try. For the cases where terminator !=\n        CHAR_NULL [things like (?(<name>... or (?('name')... or (?(R&name)... ]\n        we have now checked all the possibilities, so give an error. */\n\n        else if (terminator != CHAR_NULL)\n          {\n          *errorcodeptr = ERR15;\n          goto FAILED;\n          }\n\n        /* Check for (?(R) for recursion. Allow digits after R to specify a\n        specific group number. */\n\n        else if (*name == CHAR_R)\n          {\n          recno = 0;\n          for (i = 1; i < namelen; i++)\n            {\n            if (!IS_DIGIT(name[i]))\n              {\n              *errorcodeptr = ERR15;\n              goto FAILED;\n              }\n            if (recno > INT_MAX / 10 - 1)   /* Integer overflow */\n              {\n              *errorcodeptr = ERR61;\n              goto FAILED;\n              }\n            recno = recno * 10 + name[i] - CHAR_0;\n            }\n          if (recno == 0) recno = RREF_ANY;\n          code[1+LINK_SIZE] = OP_RREF;      /* Change test type */\n          PUT2(code, 2+LINK_SIZE, recno);\n          }\n\n        /* Similarly, check for the (?(DEFINE) \"condition\", which is always\n        false. */\n\n        else if (namelen == 6 && STRNCMP_UC_C8(name, STRING_DEFINE, 6) == 0)\n          {\n          code[1+LINK_SIZE] = OP_DEF;\n          skipbytes = 1;\n          }\n\n        /* Reference to an unidentified subpattern. */\n\n        else\n          {\n          *errorcodeptr = ERR15;\n          goto FAILED;\n          }\n        break;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_EQUALS_SIGN:                 /* Positive lookahead */\n        bravalue = OP_ASSERT;\n        cd->assert_depth += 1;\n        ptr++;\n        break;\n\n        /* Optimize (?!) to (*FAIL) unless it is quantified - which is a weird\n        thing to do, but Perl allows all assertions to be quantified, and when\n        they contain capturing parentheses there may be a potential use for\n        this feature. Not that that applies to a quantified (?!) but we allow\n        it for uniformity. */\n\n        /* ------------------------------------------------------------ */\n        case CHAR_EXCLAMATION_MARK:            /* Negative lookahead */\n        ptr++;\n        if (*ptr == CHAR_RIGHT_PARENTHESIS && ptr[1] != CHAR_ASTERISK &&\n             ptr[1] != CHAR_PLUS && ptr[1] != CHAR_QUESTION_MARK &&\n            (ptr[1] != CHAR_LEFT_CURLY_BRACKET || !is_counted_repeat(ptr+2)))\n          {\n          *code++ = OP_FAIL;\n          previous = NULL;\n          continue;\n          }\n        bravalue = OP_ASSERT_NOT;\n        cd->assert_depth += 1;\n        break;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_LESS_THAN_SIGN:              /* Lookbehind or named define */\n        switch (ptr[1])\n          {\n          case CHAR_EQUALS_SIGN:               /* Positive lookbehind */\n          bravalue = OP_ASSERTBACK;\n          cd->assert_depth += 1;\n          ptr += 2;\n          break;\n\n          case CHAR_EXCLAMATION_MARK:          /* Negative lookbehind */\n          bravalue = OP_ASSERTBACK_NOT;\n          cd->assert_depth += 1;\n          ptr += 2;\n          break;\n\n          default:                /* Could be name define, else bad */\n          if (MAX_255(ptr[1]) && (cd->ctypes[ptr[1]] & ctype_word) != 0)\n            goto DEFINE_NAME;\n          ptr++;                  /* Correct offset for error */\n          *errorcodeptr = ERR24;\n          goto FAILED;\n          }\n        break;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_GREATER_THAN_SIGN:           /* One-time brackets */\n        bravalue = OP_ONCE;\n        ptr++;\n        break;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_C:                 /* Callout - may be followed by digits; */\n        previous_callout = code;     /* Save for later completion */\n        after_manual_callout = 1;    /* Skip one item before completing */\n        *code++ = OP_CALLOUT;\n          {\n          int n = 0;\n          ptr++;\n          while(IS_DIGIT(*ptr))\n            n = n * 10 + *ptr++ - CHAR_0;\n          if (*ptr != CHAR_RIGHT_PARENTHESIS)\n            {\n            *errorcodeptr = ERR39;\n            goto FAILED;\n            }\n          if (n > 255)\n            {\n            *errorcodeptr = ERR38;\n            goto FAILED;\n            }\n          *code++ = n;\n          PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */\n          PUT(code, LINK_SIZE, 0);                          /* Default length */\n          code += 2 * LINK_SIZE;\n          }\n        previous = NULL;\n        continue;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_P:              /* Python-style named subpattern handling */\n        if (*(++ptr) == CHAR_EQUALS_SIGN ||\n            *ptr == CHAR_GREATER_THAN_SIGN)  /* Reference or recursion */\n          {\n          is_recurse = *ptr == CHAR_GREATER_THAN_SIGN;\n          terminator = CHAR_RIGHT_PARENTHESIS;\n          goto NAMED_REF_OR_RECURSE;\n          }\n        else if (*ptr != CHAR_LESS_THAN_SIGN)  /* Test for Python-style defn */\n          {\n          *errorcodeptr = ERR41;\n          goto FAILED;\n          }\n        /* Fall through to handle (?P< as (?< is handled */\n\n\n        /* ------------------------------------------------------------ */\n        DEFINE_NAME:    /* Come here from (?< handling */\n        case CHAR_APOSTROPHE:\n        terminator = (*ptr == CHAR_LESS_THAN_SIGN)?\n          CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;\n        name = ++ptr;\n        if (IS_DIGIT(*ptr))\n          {\n          *errorcodeptr = ERR84;   /* Group name must start with non-digit */\n          goto FAILED;\n          }\n        while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++;\n        namelen = (int)(ptr - name);\n\n        /* In the pre-compile phase, do a syntax check, remember the longest\n        name, and then remember the group in a vector, expanding it if\n        necessary. Duplicates for the same number are skipped; other duplicates\n        are checked for validity. In the actual compile, there is nothing to\n        do. */\n\n        if (lengthptr != NULL)\n          {\n          named_group *ng;\n          pcre_uint32 number = cd->bracount + 1;\n\n          if (*ptr != (pcre_uchar)terminator)\n            {\n            *errorcodeptr = ERR42;\n            goto FAILED;\n            }\n\n          if (cd->names_found >= MAX_NAME_COUNT)\n            {\n            *errorcodeptr = ERR49;\n            goto FAILED;\n            }\n\n          if (namelen + IMM2_SIZE + 1 > cd->name_entry_size)\n            {\n            cd->name_entry_size = namelen + IMM2_SIZE + 1;\n            if (namelen > MAX_NAME_SIZE)\n              {\n              *errorcodeptr = ERR48;\n              goto FAILED;\n              }\n            }\n\n          /* Scan the list to check for duplicates. For duplicate names, if the\n          number is the same, break the loop, which causes the name to be\n          discarded; otherwise, if DUPNAMES is not set, give an error.\n          If it is set, allow the name with a different number, but continue\n          scanning in case this is a duplicate with the same number. For\n          non-duplicate names, give an error if the number is duplicated. */\n\n          ng = cd->named_groups;\n          for (i = 0; i < cd->names_found; i++, ng++)\n            {\n            if (namelen == ng->length &&\n                STRNCMP_UC_UC(name, ng->name, namelen) == 0)\n              {\n              if (ng->number == number) break;\n              if ((options & PCRE_DUPNAMES) == 0)\n                {\n                *errorcodeptr = ERR43;\n                goto FAILED;\n                }\n              cd->dupnames = TRUE;  /* Duplicate names exist */\n              }\n            else if (ng->number == number)\n              {\n              *errorcodeptr = ERR65;\n              goto FAILED;\n              }\n            }\n\n          if (i >= cd->names_found)     /* Not a duplicate with same number */\n            {\n            /* Increase the list size if necessary */\n\n            if (cd->names_found >= cd->named_group_list_size)\n              {\n              int newsize = cd->named_group_list_size * 2;\n              named_group *newspace = (PUBL(malloc))\n                (newsize * sizeof(named_group));\n\n              if (newspace == NULL)\n                {\n                *errorcodeptr = ERR21;\n                goto FAILED;\n                }\n\n              memcpy(newspace, cd->named_groups,\n                cd->named_group_list_size * sizeof(named_group));\n              if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)\n                (PUBL(free))((void *)cd->named_groups);\n              cd->named_groups = newspace;\n              cd->named_group_list_size = newsize;\n              }\n\n            cd->named_groups[cd->names_found].name = name;\n            cd->named_groups[cd->names_found].length = namelen;\n            cd->named_groups[cd->names_found].number = number;\n            cd->names_found++;\n            }\n          }\n\n        ptr++;                    /* Move past > or ' in both passes. */\n        goto NUMBERED_GROUP;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_AMPERSAND:            /* Perl recursion/subroutine syntax */\n        terminator = CHAR_RIGHT_PARENTHESIS;\n        is_recurse = TRUE;\n        /* Fall through */\n\n        /* We come here from the Python syntax above that handles both\n        references (?P=name) and recursion (?P>name), as well as falling\n        through from the Perl recursion syntax (?&name). We also come here from\n        the Perl \\k<name> or \\k'name' back reference syntax and the \\k{name}\n        .NET syntax, and the Oniguruma \\g<...> and \\g'...' subroutine syntax. */\n\n        NAMED_REF_OR_RECURSE:\n        name = ++ptr;\n        if (IS_DIGIT(*ptr))\n          {\n          *errorcodeptr = ERR84;   /* Group name must start with non-digit */\n          goto FAILED;\n          }\n        while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++;\n        namelen = (int)(ptr - name);\n\n        /* In the pre-compile phase, do a syntax check. We used to just set\n        a dummy reference number, because it was not used in the first pass.\n        However, with the change of recursive back references to be atomic,\n        we have to look for the number so that this state can be identified, as\n        otherwise the incorrect length is computed. If it's not a backwards\n        reference, the dummy number will do. */\n\n        if (lengthptr != NULL)\n          {\n          named_group *ng;\n          recno = 0;\n\n          if (namelen == 0)\n            {\n            *errorcodeptr = ERR62;\n            goto FAILED;\n            }\n          if (*ptr != (pcre_uchar)terminator)\n            {\n            *errorcodeptr = ERR42;\n            goto FAILED;\n            }\n          if (namelen > MAX_NAME_SIZE)\n            {\n            *errorcodeptr = ERR48;\n            goto FAILED;\n            }\n\n          /* Count named back references. */\n\n          if (!is_recurse) cd->namedrefcount++;\n\n          /* We have to allow for a named reference to a duplicated name (this\n          cannot be determined until the second pass). This needs an extra\n          16-bit data item. */\n\n          *lengthptr += IMM2_SIZE;\n\n          /* If this is a forward reference and we are within a (?|...) group,\n          the reference may end up as the number of a group which we are\n          currently inside, that is, it could be a recursive reference. In the\n          real compile this will be picked up and the reference wrapped with\n          OP_ONCE to make it atomic, so we must space in case this occurs. */\n\n          /* In fact, this can happen for a non-forward reference because\n          another group with the same number might be created later. This\n          issue is fixed \"properly\" in PCRE2. As PCRE1 is now in maintenance\n          only mode, we finesse the bug by allowing more memory always. */\n\n          *lengthptr += 4 + 4*LINK_SIZE;\n\n          /* It is even worse than that. The current reference may be to an\n          existing named group with a different number (so apparently not\n          recursive) but which later on is also attached to a group with the\n          current number. This can only happen if $(| has been previous\n          encountered. In that case, we allow yet more memory, just in case.\n          (Again, this is fixed \"properly\" in PCRE2. */\n\n          if (cd->dupgroups) *lengthptr += 4 + 4*LINK_SIZE;\n\n          /* Otherwise, check for recursion here. The name table does not exist\n          in the first pass; instead we must scan the list of names encountered\n          so far in order to get the number. If the name is not found, leave\n          the value of recno as 0 for a forward reference. */\n\n          /* This patch (removing \"else\") fixes a problem when a reference is\n          to multiple identically named nested groups from within the nest.\n          Once again, it is not the \"proper\" fix, and it results in an\n          over-allocation of memory. */\n\n          /* else */\n            {\n            ng = cd->named_groups;\n            for (i = 0; i < cd->names_found; i++, ng++)\n              {\n              if (namelen == ng->length &&\n                  STRNCMP_UC_UC(name, ng->name, namelen) == 0)\n                {\n                open_capitem *oc;\n                recno = ng->number;\n                if (is_recurse) break;\n                for (oc = cd->open_caps; oc != NULL; oc = oc->next)\n                  {\n                  if (oc->number == recno)\n                    {\n                    oc->flag = TRUE;\n                    break;\n                    }\n                  }\n                }\n              }\n            }\n          }\n\n        /* In the real compile, search the name table. We check the name\n        first, and then check that we have reached the end of the name in the\n        table. That way, if the name is longer than any in the table, the\n        comparison will fail without reading beyond the table entry. */\n\n        else\n          {\n          slot = cd->name_table;\n          for (i = 0; i < cd->names_found; i++)\n            {\n            if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 &&\n                slot[IMM2_SIZE+namelen] == 0)\n              break;\n            slot += cd->name_entry_size;\n            }\n\n          if (i < cd->names_found)\n            {\n            recno = GET2(slot, 0);\n            }\n          else\n            {\n            *errorcodeptr = ERR15;\n            goto FAILED;\n            }\n          }\n\n        /* In both phases, for recursions, we can now go to the code than\n        handles numerical recursion. */\n\n        if (is_recurse) goto HANDLE_RECURSION;\n\n        /* In the second pass we must see if the name is duplicated. If so, we\n        generate a different opcode. */\n\n        if (lengthptr == NULL && cd->dupnames)\n          {\n          int count = 1;\n          unsigned int index = i;\n          pcre_uchar *cslot = slot + cd->name_entry_size;\n\n          for (i++; i < cd->names_found; i++)\n            {\n            if (STRCMP_UC_UC(slot + IMM2_SIZE, cslot + IMM2_SIZE) != 0) break;\n            count++;\n            cslot += cd->name_entry_size;\n            }\n\n          if (count > 1)\n            {\n            if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n            previous = code;\n            item_hwm_offset = cd->hwm - cd->start_workspace;\n            *code++ = ((options & PCRE_CASELESS) != 0)? OP_DNREFI : OP_DNREF;\n            PUT2INC(code, 0, index);\n            PUT2INC(code, 0, count);\n\n            /* Process each potentially referenced group. */\n\n            for (; slot < cslot; slot += cd->name_entry_size)\n              {\n              open_capitem *oc;\n              recno = GET2(slot, 0);\n              cd->backref_map |= (recno < 32)? (1 << recno) : 1;\n              if (recno > cd->top_backref) cd->top_backref = recno;\n\n              /* Check to see if this back reference is recursive, that it, it\n              is inside the group that it references. A flag is set so that the\n              group can be made atomic. */\n\n              for (oc = cd->open_caps; oc != NULL; oc = oc->next)\n                {\n                if (oc->number == recno)\n                  {\n                  oc->flag = TRUE;\n                  break;\n                  }\n                }\n              }\n\n            continue;  /* End of back ref handling */\n            }\n          }\n\n        /* First pass, or a non-duplicated name. */\n\n        goto HANDLE_REFERENCE;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_R:              /* Recursion, same as (?0) */\n        recno = 0;\n        if (*(++ptr) != CHAR_RIGHT_PARENTHESIS)\n          {\n          *errorcodeptr = ERR29;\n          goto FAILED;\n          }\n        goto HANDLE_RECURSION;\n\n\n        /* ------------------------------------------------------------ */\n        case CHAR_MINUS: case CHAR_PLUS:  /* Recursion or subroutine */\n        case CHAR_0: case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4:\n        case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9:\n          {\n          const pcre_uchar *called;\n          terminator = CHAR_RIGHT_PARENTHESIS;\n\n          /* Come here from the \\g<...> and \\g'...' code (Oniguruma\n          compatibility). However, the syntax has been checked to ensure that\n          the ... are a (signed) number, so that neither ERR63 nor ERR29 will\n          be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY\n          ever be taken. */\n\n          HANDLE_NUMERICAL_RECURSION:\n\n          if ((refsign = *ptr) == CHAR_PLUS)\n            {\n            ptr++;\n            if (!IS_DIGIT(*ptr))\n              {\n              *errorcodeptr = ERR63;\n              goto FAILED;\n              }\n            }\n          else if (refsign == CHAR_MINUS)\n            {\n            if (!IS_DIGIT(ptr[1]))\n              goto OTHER_CHAR_AFTER_QUERY;\n            ptr++;\n            }\n\n          recno = 0;\n          while(IS_DIGIT(*ptr))\n            {\n            if (recno > INT_MAX / 10 - 1) /* Integer overflow */\n              {\n              while (IS_DIGIT(*ptr)) ptr++;\n              *errorcodeptr = ERR61;\n              goto FAILED;\n              }\n            recno = recno * 10 + *ptr++ - CHAR_0;\n            }\n\n          if (*ptr != (pcre_uchar)terminator)\n            {\n            *errorcodeptr = ERR29;\n            goto FAILED;\n            }\n\n          if (refsign == CHAR_MINUS)\n            {\n            if (recno == 0)\n              {\n              *errorcodeptr = ERR58;\n              goto FAILED;\n              }\n            recno = cd->bracount - recno + 1;\n            if (recno <= 0)\n              {\n              *errorcodeptr = ERR15;\n              goto FAILED;\n              }\n            }\n          else if (refsign == CHAR_PLUS)\n            {\n            if (recno == 0)\n              {\n              *errorcodeptr = ERR58;\n              goto FAILED;\n              }\n            recno += cd->bracount;\n            }\n\n          /* Come here from code above that handles a named recursion */\n\n          HANDLE_RECURSION:\n\n          previous = code;\n          item_hwm_offset = cd->hwm - cd->start_workspace;\n          called = cd->start_code;\n\n          /* When we are actually compiling, find the bracket that is being\n          referenced. Temporarily end the regex in case it doesn't exist before\n          this point. If we end up with a forward reference, first check that\n          the bracket does occur later so we can give the error (and position)\n          now. Then remember this forward reference in the workspace so it can\n          be filled in at the end. */\n\n          if (lengthptr == NULL)\n            {\n            *code = OP_END;\n            if (recno != 0)\n              called = PRIV(find_bracket)(cd->start_code, utf, recno);\n\n            /* Forward reference */\n\n            if (called == NULL)\n              {\n              if (recno > cd->final_bracount)\n                {\n                *errorcodeptr = ERR15;\n                goto FAILED;\n                }\n\n              /* Fudge the value of \"called\" so that when it is inserted as an\n              offset below, what it actually inserted is the reference number\n              of the group. Then remember the forward reference. */\n\n              called = cd->start_code + recno;\n              if (cd->hwm >= cd->start_workspace + cd->workspace_size -\n                  WORK_SIZE_SAFETY_MARGIN)\n                {\n                *errorcodeptr = expand_workspace(cd);\n                if (*errorcodeptr != 0) goto FAILED;\n                }\n              PUTINC(cd->hwm, 0, (int)(code + 1 - cd->start_code));\n              }\n\n            /* If not a forward reference, and the subpattern is still open,\n            this is a recursive call. We check to see if this is a left\n            recursion that could loop for ever, and diagnose that case. We\n            must not, however, do this check if we are in a conditional\n            subpattern because the condition might be testing for recursion in\n            a pattern such as /(?(R)a+|(?R)b)/, which is perfectly valid.\n            Forever loops are also detected at runtime, so those that occur in\n            conditional subpatterns will be picked up then. */\n\n            else if (GET(called, 1) == 0 && cond_depth <= 0 &&\n                     could_be_empty(called, code, bcptr, utf, cd))\n              {\n              *errorcodeptr = ERR40;\n              goto FAILED;\n              }\n            }\n\n          /* Insert the recursion/subroutine item. It does not have a set first\n          character (relevant if it is repeated, because it will then be\n          wrapped with ONCE brackets). */\n\n          *code = OP_RECURSE;\n          PUT(code, 1, (int)(called - cd->start_code));\n          code += 1 + LINK_SIZE;\n          groupsetfirstchar = FALSE;\n          }\n\n        /* Can't determine a first byte now */\n\n        if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE;\n        zerofirstchar = firstchar;\n        zerofirstcharflags = firstcharflags;\n        continue;\n\n\n        /* ------------------------------------------------------------ */\n        default:              /* Other characters: check option setting */\n        OTHER_CHAR_AFTER_QUERY:\n        set = unset = 0;\n        optset = &set;\n\n        while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON)\n          {\n          switch (*ptr++)\n            {\n            case CHAR_MINUS: optset = &unset; break;\n\n            case CHAR_J:    /* Record that it changed in the external options */\n            *optset |= PCRE_DUPNAMES;\n            cd->external_flags |= PCRE_JCHANGED;\n            break;\n\n            case CHAR_i: *optset |= PCRE_CASELESS; break;\n            case CHAR_m: *optset |= PCRE_MULTILINE; break;\n            case CHAR_s: *optset |= PCRE_DOTALL; break;\n            case CHAR_x: *optset |= PCRE_EXTENDED; break;\n            case CHAR_U: *optset |= PCRE_UNGREEDY; break;\n            case CHAR_X: *optset |= PCRE_EXTRA; break;\n\n            default:  *errorcodeptr = ERR12;\n                      ptr--;    /* Correct the offset */\n                      goto FAILED;\n            }\n          }\n\n        /* Set up the changed option bits, but don't change anything yet. */\n\n        newoptions = (options | set) & (~unset);\n\n        /* If the options ended with ')' this is not the start of a nested\n        group with option changes, so the options change at this level.\n        If we are not at the pattern start, reset the greedy defaults and the\n        case value for firstchar and reqchar. */\n\n        if (*ptr == CHAR_RIGHT_PARENTHESIS)\n          {\n          greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);\n          greedy_non_default = greedy_default ^ 1;\n          req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;\n\n          /* Change options at this level, and pass them back for use\n          in subsequent branches. */\n\n          *optionsptr = options = newoptions;\n          previous = NULL;       /* This item can't be repeated */\n          continue;              /* It is complete */\n          }\n\n        /* If the options ended with ':' we are heading into a nested group\n        with possible change of options. Such groups are non-capturing and are\n        not assertions of any kind. All we need to do is skip over the ':';\n        the newoptions value is handled below. */\n\n        bravalue = OP_BRA;\n        ptr++;\n        }     /* End of switch for character following (? */\n      }       /* End of (? handling */\n\n    /* Opening parenthesis not followed by '*' or '?'. If PCRE_NO_AUTO_CAPTURE\n    is set, all unadorned brackets become non-capturing and behave like (?:...)\n    brackets. */\n\n    else if ((options & PCRE_NO_AUTO_CAPTURE) != 0)\n      {\n      bravalue = OP_BRA;\n      }\n\n    /* Else we have a capturing group. */\n\n    else\n      {\n      NUMBERED_GROUP:\n      cd->bracount += 1;\n      PUT2(code, 1+LINK_SIZE, cd->bracount);\n      skipbytes = IMM2_SIZE;\n      }\n\n    /* Process nested bracketed regex. First check for parentheses nested too\n    deeply. */\n\n    if ((cd->parens_depth += 1) > PARENS_NEST_LIMIT)\n      {\n      *errorcodeptr = ERR82;\n      goto FAILED;\n      }\n\n    /* All assertions used not to be repeatable, but this was changed for Perl\n    compatibility. All kinds can now be repeated except for assertions that are\n    conditions (Perl also forbids these to be repeated). We copy code into a\n    non-register variable (tempcode) in order to be able to pass its address\n    because some compilers complain otherwise. At the start of a conditional\n    group whose condition is an assertion, cd->iscondassert is set. We unset it\n    here so as to allow assertions later in the group to be quantified. */\n\n    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT &&\n        cd->iscondassert)\n      {\n      previous = NULL;\n      cd->iscondassert = FALSE;\n      }\n    else\n      {\n      previous = code;\n      item_hwm_offset = cd->hwm - cd->start_workspace;\n      }\n\n    *code = bravalue;\n    tempcode = code;\n    tempreqvary = cd->req_varyopt;        /* Save value before bracket */\n    tempbracount = cd->bracount;          /* Save value before bracket */\n    length_prevgroup = 0;                 /* Initialize for pre-compile phase */\n\n    if (!compile_regex(\n         newoptions,                      /* The complete new option state */\n         &tempcode,                       /* Where to put code (updated) */\n         &ptr,                            /* Input pointer (updated) */\n         errorcodeptr,                    /* Where to put an error message */\n         (bravalue == OP_ASSERTBACK ||\n          bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */\n         reset_bracount,                  /* True if (?| group */\n         skipbytes,                       /* Skip over bracket number */\n         cond_depth +\n           ((bravalue == OP_COND)?1:0),   /* Depth of condition subpatterns */\n         &subfirstchar,                   /* For possible first char */\n         &subfirstcharflags,\n         &subreqchar,                     /* For possible last char */\n         &subreqcharflags,\n         bcptr,                           /* Current branch chain */\n         cd,                              /* Tables block */\n         (lengthptr == NULL)? NULL :      /* Actual compile phase */\n           &length_prevgroup              /* Pre-compile phase */\n         ))\n      goto FAILED;\n\n    cd->parens_depth -= 1;\n\n    /* If this was an atomic group and there are no capturing groups within it,\n    generate OP_ONCE_NC instead of OP_ONCE. */\n\n    if (bravalue == OP_ONCE && cd->bracount <= tempbracount)\n      *code = OP_ONCE_NC;\n\n    if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT)\n      cd->assert_depth -= 1;\n\n    /* At the end of compiling, code is still pointing to the start of the\n    group, while tempcode has been updated to point past the end of the group.\n    The pattern pointer (ptr) is on the bracket.\n\n    If this is a conditional bracket, check that there are no more than\n    two branches in the group, or just one if it's a DEFINE group. We do this\n    in the real compile phase, not in the pre-pass, where the whole group may\n    not be available. */\n\n    if (bravalue == OP_COND && lengthptr == NULL)\n      {\n      pcre_uchar *tc = code;\n      int condcount = 0;\n\n      do {\n         condcount++;\n         tc += GET(tc,1);\n         }\n      while (*tc != OP_KET);\n\n      /* A DEFINE group is never obeyed inline (the \"condition\" is always\n      false). It must have only one branch. */\n\n      if (code[LINK_SIZE+1] == OP_DEF)\n        {\n        if (condcount > 1)\n          {\n          *errorcodeptr = ERR54;\n          goto FAILED;\n          }\n        bravalue = OP_DEF;   /* Just a flag to suppress char handling below */\n        }\n\n      /* A \"normal\" conditional group. If there is just one branch, we must not\n      make use of its firstchar or reqchar, because this is equivalent to an\n      empty second branch. */\n\n      else\n        {\n        if (condcount > 2)\n          {\n          *errorcodeptr = ERR27;\n          goto FAILED;\n          }\n        if (condcount == 1) subfirstcharflags = subreqcharflags = REQ_NONE;\n        }\n      }\n\n    /* Error if hit end of pattern */\n\n    if (*ptr != CHAR_RIGHT_PARENTHESIS)\n      {\n      *errorcodeptr = ERR14;\n      goto FAILED;\n      }\n\n    /* In the pre-compile phase, update the length by the length of the group,\n    less the brackets at either end. Then reduce the compiled code to just a\n    set of non-capturing brackets so that it doesn't use much memory if it is\n    duplicated by a quantifier.*/\n\n    if (lengthptr != NULL)\n      {\n      if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE)\n        {\n        *errorcodeptr = ERR20;\n        goto FAILED;\n        }\n      *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE;\n      code++;   /* This already contains bravalue */\n      PUTINC(code, 0, 1 + LINK_SIZE);\n      *code++ = OP_KET;\n      PUTINC(code, 0, 1 + LINK_SIZE);\n      break;    /* No need to waste time with special character handling */\n      }\n\n    /* Otherwise update the main code pointer to the end of the group. */\n\n    code = tempcode;\n\n    /* For a DEFINE group, required and first character settings are not\n    relevant. */\n\n    if (bravalue == OP_DEF) break;\n\n    /* Handle updating of the required and first characters for other types of\n    group. Update for normal brackets of all kinds, and conditions with two\n    branches (see code above). If the bracket is followed by a quantifier with\n    zero repeat, we have to back off. Hence the definition of zeroreqchar and\n    zerofirstchar outside the main loop so that they can be accessed for the\n    back off. */\n\n    zeroreqchar = reqchar;\n    zeroreqcharflags = reqcharflags;\n    zerofirstchar = firstchar;\n    zerofirstcharflags = firstcharflags;\n    groupsetfirstchar = FALSE;\n\n    if (bravalue >= OP_ONCE)\n      {\n      /* If we have not yet set a firstchar in this branch, take it from the\n      subpattern, remembering that it was set here so that a repeat of more\n      than one can replicate it as reqchar if necessary. If the subpattern has\n      no firstchar, set \"none\" for the whole branch. In both cases, a zero\n      repeat forces firstchar to \"none\". */\n\n      if (firstcharflags == REQ_UNSET)\n        {\n        if (subfirstcharflags >= 0)\n          {\n          firstchar = subfirstchar;\n          firstcharflags = subfirstcharflags;\n          groupsetfirstchar = TRUE;\n          }\n        else firstcharflags = REQ_NONE;\n        zerofirstcharflags = REQ_NONE;\n        }\n\n      /* If firstchar was previously set, convert the subpattern's firstchar\n      into reqchar if there wasn't one, using the vary flag that was in\n      existence beforehand. */\n\n      else if (subfirstcharflags >= 0 && subreqcharflags < 0)\n        {\n        subreqchar = subfirstchar;\n        subreqcharflags = subfirstcharflags | tempreqvary;\n        }\n\n      /* If the subpattern set a required byte (or set a first byte that isn't\n      really the first byte - see above), set it. */\n\n      if (subreqcharflags >= 0)\n        {\n        reqchar = subreqchar;\n        reqcharflags = subreqcharflags;\n        }\n      }\n\n    /* For a forward assertion, we take the reqchar, if set, provided that the\n    group has also set a first char. This can be helpful if the pattern that\n    follows the assertion doesn't set a different char. For example, it's\n    useful for /(?=abcde).+/. We can't set firstchar for an assertion, however\n    because it leads to incorrect effect for patterns such as /(?=a)a.+/ when\n    the \"real\" \"a\" would then become a reqchar instead of a firstchar. This is\n    overcome by a scan at the end if there's no firstchar, looking for an\n    asserted first char. */\n\n    else if (bravalue == OP_ASSERT && subreqcharflags >= 0 &&\n             subfirstcharflags >= 0)\n      {\n      reqchar = subreqchar;\n      reqcharflags = subreqcharflags;\n      }\n    break;     /* End of processing '(' */\n\n\n    /* ===================================================================*/\n    /* Handle metasequences introduced by \\. For ones like \\d, the ESC_ values\n    are arranged to be the negation of the corresponding OP_values in the\n    default case when PCRE_UCP is not set. For the back references, the values\n    are negative the reference number. Only back references and those types\n    that consume a character may be repeated. We can test for values between\n    ESC_b and ESC_Z for the latter; this may have to change if any new ones are\n    ever created. */\n\n    case CHAR_BACKSLASH:\n    tempptr = ptr;\n    escape = check_escape(&ptr, &ec, errorcodeptr, cd->bracount, options, FALSE);\n    if (*errorcodeptr != 0) goto FAILED;\n\n    if (escape == 0)                  /* The escape coded a single character */\n      c = ec;\n    else\n      {\n      /* For metasequences that actually match a character, we disable the\n      setting of a first character if it hasn't already been set. */\n\n      if (firstcharflags == REQ_UNSET && escape > ESC_b && escape < ESC_Z)\n        firstcharflags = REQ_NONE;\n\n      /* Set values to reset to if this is followed by a zero repeat. */\n\n      zerofirstchar = firstchar;\n      zerofirstcharflags = firstcharflags;\n      zeroreqchar = reqchar;\n      zeroreqcharflags = reqcharflags;\n\n      /* \\g<name> or \\g'name' is a subroutine call by name and \\g<n> or \\g'n'\n      is a subroutine call by number (Oniguruma syntax). In fact, the value\n      ESC_g is returned only for these cases. So we don't need to check for <\n      or ' if the value is ESC_g. For the Perl syntax \\g{n} the value is\n      -n, and for the Perl syntax \\g{name} the result is ESC_k (as\n      that is a synonym for a named back reference). */\n\n      if (escape == ESC_g)\n        {\n        const pcre_uchar *p;\n        pcre_uint32 cf;\n\n        item_hwm_offset = cd->hwm - cd->start_workspace;   /* Normally this is set when '(' is read */\n        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?\n          CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;\n\n        /* These two statements stop the compiler for warning about possibly\n        unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In\n        fact, because we do the check for a number below, the paths that\n        would actually be in error are never taken. */\n\n        skipbytes = 0;\n        reset_bracount = FALSE;\n\n        /* If it's not a signed or unsigned number, treat it as a name. */\n\n        cf = ptr[1];\n        if (cf != CHAR_PLUS && cf != CHAR_MINUS && !IS_DIGIT(cf))\n          {\n          is_recurse = TRUE;\n          goto NAMED_REF_OR_RECURSE;\n          }\n\n        /* Signed or unsigned number (cf = ptr[1]) is known to be plus or minus\n        or a digit. */\n\n        p = ptr + 2;\n        while (IS_DIGIT(*p)) p++;\n        if (*p != (pcre_uchar)terminator)\n          {\n          *errorcodeptr = ERR57;\n          goto FAILED;\n          }\n        ptr++;\n        goto HANDLE_NUMERICAL_RECURSION;\n        }\n\n      /* \\k<name> or \\k'name' is a back reference by name (Perl syntax).\n      We also support \\k{name} (.NET syntax).  */\n\n      if (escape == ESC_k)\n        {\n        if ((ptr[1] != CHAR_LESS_THAN_SIGN &&\n          ptr[1] != CHAR_APOSTROPHE && ptr[1] != CHAR_LEFT_CURLY_BRACKET))\n          {\n          *errorcodeptr = ERR69;\n          goto FAILED;\n          }\n        is_recurse = FALSE;\n        terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?\n          CHAR_GREATER_THAN_SIGN : (*ptr == CHAR_APOSTROPHE)?\n          CHAR_APOSTROPHE : CHAR_RIGHT_CURLY_BRACKET;\n        goto NAMED_REF_OR_RECURSE;\n        }\n\n      /* Back references are handled specially; must disable firstchar if\n      not set to cope with cases like (?=(\\w+))\\1: which would otherwise set\n      ':' later. */\n\n      if (escape < 0)\n        {\n        open_capitem *oc;\n        recno = -escape;\n\n        /* Come here from named backref handling when the reference is to a\n        single group (i.e. not to a duplicated name. */\n\n        HANDLE_REFERENCE:\n        if (firstcharflags == REQ_UNSET) zerofirstcharflags = firstcharflags = REQ_NONE;\n        previous = code;\n        item_hwm_offset = cd->hwm - cd->start_workspace;\n        *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;\n        PUT2INC(code, 0, recno);\n        cd->backref_map |= (recno < 32)? (1 << recno) : 1;\n        if (recno > cd->top_backref) cd->top_backref = recno;\n\n        /* Check to see if this back reference is recursive, that it, it\n        is inside the group that it references. A flag is set so that the\n        group can be made atomic. */\n\n        for (oc = cd->open_caps; oc != NULL; oc = oc->next)\n          {\n          if (oc->number == recno)\n            {\n            oc->flag = TRUE;\n            break;\n            }\n          }\n        }\n\n      /* So are Unicode property matches, if supported. */\n\n#ifdef SUPPORT_UCP\n      else if (escape == ESC_P || escape == ESC_p)\n        {\n        BOOL negated;\n        unsigned int ptype = 0, pdata = 0;\n        if (!get_ucp(&ptr, &negated, &ptype, &pdata, errorcodeptr))\n          goto FAILED;\n        previous = code;\n        item_hwm_offset = cd->hwm - cd->start_workspace;\n        *code++ = ((escape == ESC_p) != negated)? OP_PROP : OP_NOTPROP;\n        *code++ = ptype;\n        *code++ = pdata;\n        }\n#else\n\n      /* If Unicode properties are not supported, \\X, \\P, and \\p are not\n      allowed. */\n\n      else if (escape == ESC_X || escape == ESC_P || escape == ESC_p)\n        {\n        *errorcodeptr = ERR45;\n        goto FAILED;\n        }\n#endif\n\n      /* For the rest (including \\X when Unicode properties are supported), we\n      can obtain the OP value by negating the escape value in the default\n      situation when PCRE_UCP is not set. When it *is* set, we substitute\n      Unicode property tests. Note that \\b and \\B do a one-character\n      lookbehind, and \\A also behaves as if it does. */\n\n      else\n        {\n        if ((escape == ESC_b || escape == ESC_B || escape == ESC_A) &&\n             cd->max_lookbehind == 0)\n          cd->max_lookbehind = 1;\n#ifdef SUPPORT_UCP\n        if (escape >= ESC_DU && escape <= ESC_wu)\n          {\n          nestptr = ptr + 1;                   /* Where to resume */\n          ptr = substitutes[escape - ESC_DU] - 1;  /* Just before substitute */\n          }\n        else\n#endif\n        /* In non-UTF-8 mode, we turn \\C into OP_ALLANY instead of OP_ANYBYTE\n        so that it works in DFA mode and in lookbehinds. */\n\n          {\n          previous = (escape > ESC_b && escape < ESC_Z)? code : NULL;\n          item_hwm_offset = cd->hwm - cd->start_workspace;\n          *code++ = (!utf && escape == ESC_C)? OP_ALLANY : escape;\n          }\n        }\n      continue;\n      }\n\n    /* We have a data character whose value is in c. In UTF-8 mode it may have\n    a value > 127. We set its representation in the length/buffer, and then\n    handle it as a data character. */\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR)\n      mclength = PRIV(ord2utf)(c, mcbuffer);\n    else\n#endif\n\n     {\n     mcbuffer[0] = c;\n     mclength = 1;\n     }\n    goto ONE_CHAR;\n\n\n    /* ===================================================================*/\n    /* Handle a literal character. It is guaranteed not to be whitespace or #\n    when the extended flag is set. If we are in a UTF mode, it may be a\n    multi-unit literal character. */\n\n    default:\n    NORMAL_CHAR:\n    mclength = 1;\n    mcbuffer[0] = c;\n\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(c))\n      ACROSSCHAR(TRUE, ptr[1], mcbuffer[mclength++] = *(++ptr));\n#endif\n\n    /* At this point we have the character's bytes in mcbuffer, and the length\n    in mclength. When not in UTF-8 mode, the length is always 1. */\n\n    ONE_CHAR:\n    previous = code;\n    item_hwm_offset = cd->hwm - cd->start_workspace;\n\n    /* For caseless UTF-8 mode when UCP support is available, check whether\n    this character has more than one other case. If so, generate a special\n    OP_PROP item instead of OP_CHARI. */\n\n#ifdef SUPPORT_UCP\n    if (utf && (options & PCRE_CASELESS) != 0)\n      {\n      GETCHAR(c, mcbuffer);\n      if ((c = UCD_CASESET(c)) != 0)\n        {\n        *code++ = OP_PROP;\n        *code++ = PT_CLIST;\n        *code++ = c;\n        if (firstcharflags == REQ_UNSET)\n          firstcharflags = zerofirstcharflags = REQ_NONE;\n        break;\n        }\n      }\n#endif\n\n    /* Caseful matches, or not one of the multicase characters. */\n\n    *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARI : OP_CHAR;\n    for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];\n\n    /* Remember if \\r or \\n were seen */\n\n    if (mcbuffer[0] == CHAR_CR || mcbuffer[0] == CHAR_NL)\n      cd->external_flags |= PCRE_HASCRORLF;\n\n    /* Set the first and required bytes appropriately. If no previous first\n    byte, set it from this character, but revert to none on a zero repeat.\n    Otherwise, leave the firstchar value alone, and don't change it on a zero\n    repeat. */\n\n    if (firstcharflags == REQ_UNSET)\n      {\n      zerofirstcharflags = REQ_NONE;\n      zeroreqchar = reqchar;\n      zeroreqcharflags = reqcharflags;\n\n      /* If the character is more than one byte long, we can set firstchar\n      only if it is not to be matched caselessly. */\n\n      if (mclength == 1 || req_caseopt == 0)\n        {\n        firstchar = mcbuffer[0];\n        firstcharflags = req_caseopt;\n\n        if (mclength != 1)\n          {\n          reqchar = code[-1];\n          reqcharflags = cd->req_varyopt;\n          }\n        }\n      else firstcharflags = reqcharflags = REQ_NONE;\n      }\n\n    /* firstchar was previously set; we can set reqchar only if the length is\n    1 or the matching is caseful. */\n\n    else\n      {\n      zerofirstchar = firstchar;\n      zerofirstcharflags = firstcharflags;\n      zeroreqchar = reqchar;\n      zeroreqcharflags = reqcharflags;\n      if (mclength == 1 || req_caseopt == 0)\n        {\n        reqchar = code[-1];\n        reqcharflags = req_caseopt | cd->req_varyopt;\n        }\n      }\n\n    break;            /* End of literal character handling */\n    }\n  }                   /* end of big loop */\n\n\n/* Control never reaches here by falling through, only by a goto for all the\nerror states. Pass back the position in the pattern so that it can be displayed\nto the user for diagnosing the error. */\n\nFAILED:\n*ptrptr = ptr;\nreturn FALSE;\n}\n\n\n\n/*************************************************\n*     Compile sequence of alternatives           *\n*************************************************/\n\n/* On entry, ptr is pointing past the bracket character, but on return it\npoints to the closing bracket, or vertical bar, or end of string. The code\nvariable is pointing at the byte into which the BRA operator has been stored.\nThis function is used during the pre-compile phase when we are trying to find\nout the amount of memory needed, as well as during the real compile phase. The\nvalue of lengthptr distinguishes the two phases.\n\nArguments:\n  options           option bits, including any changes for this subpattern\n  codeptr           -> the address of the current code pointer\n  ptrptr            -> the address of the current pattern pointer\n  errorcodeptr      -> pointer to error code variable\n  lookbehind        TRUE if this is a lookbehind assertion\n  reset_bracount    TRUE to reset the count for each branch\n  skipbytes         skip this many bytes at start (for brackets and OP_COND)\n  cond_depth        depth of nesting for conditional subpatterns\n  firstcharptr      place to put the first required character\n  firstcharflagsptr place to put the first character flags, or a negative number\n  reqcharptr        place to put the last required character\n  reqcharflagsptr   place to put the last required character flags, or a negative number\n  bcptr             pointer to the chain of currently open branches\n  cd                points to the data block with tables pointers etc.\n  lengthptr         NULL during the real compile phase\n                    points to length accumulator during pre-compile phase\n\nReturns:            TRUE on success\n*/\n\nstatic BOOL\ncompile_regex(int options, pcre_uchar **codeptr, const pcre_uchar **ptrptr,\n  int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes,\n  int cond_depth,\n  pcre_uint32 *firstcharptr, pcre_int32 *firstcharflagsptr,\n  pcre_uint32 *reqcharptr, pcre_int32 *reqcharflagsptr,\n  branch_chain *bcptr, compile_data *cd, int *lengthptr)\n{\nconst pcre_uchar *ptr = *ptrptr;\npcre_uchar *code = *codeptr;\npcre_uchar *last_branch = code;\npcre_uchar *start_bracket = code;\npcre_uchar *reverse_count = NULL;\nopen_capitem capitem;\nint capnumber = 0;\npcre_uint32 firstchar, reqchar;\npcre_int32 firstcharflags, reqcharflags;\npcre_uint32 branchfirstchar, branchreqchar;\npcre_int32 branchfirstcharflags, branchreqcharflags;\nint length;\nunsigned int orig_bracount;\nunsigned int max_bracount;\nbranch_chain bc;\nsize_t save_hwm_offset;\n\n/* If set, call the external function that checks for stack availability. */\n\nif (PUBL(stack_guard) != NULL && PUBL(stack_guard)())\n  {\n  *errorcodeptr= ERR85;\n  return FALSE;\n  }\n\n/* Miscellaneous initialization */\n\nbc.outer = bcptr;\nbc.current_branch = code;\n\nfirstchar = reqchar = 0;\nfirstcharflags = reqcharflags = REQ_UNSET;\n\nsave_hwm_offset = cd->hwm - cd->start_workspace;\n\n/* Accumulate the length for use in the pre-compile phase. Start with the\nlength of the BRA and KET and any extra bytes that are required at the\nbeginning. We accumulate in a local variable to save frequent testing of\nlenthptr for NULL. We cannot do this by looking at the value of code at the\nstart and end of each alternative, because compiled items are discarded during\nthe pre-compile phase so that the work space is not exceeded. */\n\nlength = 2 + 2*LINK_SIZE + skipbytes;\n\n/* WARNING: If the above line is changed for any reason, you must also change\nthe code that abstracts option settings at the start of the pattern and makes\nthem global. It tests the value of length for (2 + 2*LINK_SIZE) in the\npre-compile phase to find out whether anything has yet been compiled or not. */\n\n/* If this is a capturing subpattern, add to the chain of open capturing items\nso that we can detect them if (*ACCEPT) is encountered. This is also used to\ndetect groups that contain recursive back references to themselves. Note that\nonly OP_CBRA need be tested here; changing this opcode to one of its variants,\ne.g. OP_SCBRAPOS, happens later, after the group has been compiled. */\n\nif (*code == OP_CBRA)\n  {\n  capnumber = GET2(code, 1 + LINK_SIZE);\n  capitem.number = capnumber;\n  capitem.next = cd->open_caps;\n  capitem.flag = FALSE;\n  cd->open_caps = &capitem;\n  }\n\n/* Offset is set zero to mark that this bracket is still open */\n\nPUT(code, 1, 0);\ncode += 1 + LINK_SIZE + skipbytes;\n\n/* Loop for each alternative branch */\n\norig_bracount = max_bracount = cd->bracount;\nfor (;;)\n  {\n  /* For a (?| group, reset the capturing bracket count so that each branch\n  uses the same numbers. */\n\n  if (reset_bracount) cd->bracount = orig_bracount;\n\n  /* Set up dummy OP_REVERSE if lookbehind assertion */\n\n  if (lookbehind)\n    {\n    *code++ = OP_REVERSE;\n    reverse_count = code;\n    PUTINC(code, 0, 0);\n    length += 1 + LINK_SIZE;\n    }\n\n  /* Now compile the branch; in the pre-compile phase its length gets added\n  into the length. */\n\n  if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstchar,\n        &branchfirstcharflags, &branchreqchar, &branchreqcharflags, &bc,\n        cond_depth, cd, (lengthptr == NULL)? NULL : &length))\n    {\n    *ptrptr = ptr;\n    return FALSE;\n    }\n\n  /* Keep the highest bracket count in case (?| was used and some branch\n  has fewer than the rest. */\n\n  if (cd->bracount > max_bracount) max_bracount = cd->bracount;\n\n  /* In the real compile phase, there is some post-processing to be done. */\n\n  if (lengthptr == NULL)\n    {\n    /* If this is the first branch, the firstchar and reqchar values for the\n    branch become the values for the regex. */\n\n    if (*last_branch != OP_ALT)\n      {\n      firstchar = branchfirstchar;\n      firstcharflags = branchfirstcharflags;\n      reqchar = branchreqchar;\n      reqcharflags = branchreqcharflags;\n      }\n\n    /* If this is not the first branch, the first char and reqchar have to\n    match the values from all the previous branches, except that if the\n    previous value for reqchar didn't have REQ_VARY set, it can still match,\n    and we set REQ_VARY for the regex. */\n\n    else\n      {\n      /* If we previously had a firstchar, but it doesn't match the new branch,\n      we have to abandon the firstchar for the regex, but if there was\n      previously no reqchar, it takes on the value of the old firstchar. */\n\n      if (firstcharflags >= 0 &&\n          (firstcharflags != branchfirstcharflags || firstchar != branchfirstchar))\n        {\n        if (reqcharflags < 0)\n          {\n          reqchar = firstchar;\n          reqcharflags = firstcharflags;\n          }\n        firstcharflags = REQ_NONE;\n        }\n\n      /* If we (now or from before) have no firstchar, a firstchar from the\n      branch becomes a reqchar if there isn't a branch reqchar. */\n\n      if (firstcharflags < 0 && branchfirstcharflags >= 0 && branchreqcharflags < 0)\n        {\n        branchreqchar = branchfirstchar;\n        branchreqcharflags = branchfirstcharflags;\n        }\n\n      /* Now ensure that the reqchars match */\n\n      if (((reqcharflags & ~REQ_VARY) != (branchreqcharflags & ~REQ_VARY)) ||\n          reqchar != branchreqchar)\n        reqcharflags = REQ_NONE;\n      else\n        {\n        reqchar = branchreqchar;\n        reqcharflags |= branchreqcharflags; /* To \"or\" REQ_VARY */\n        }\n      }\n\n    /* If lookbehind, check that this branch matches a fixed-length string, and\n    put the length into the OP_REVERSE item. Temporarily mark the end of the\n    branch with OP_END. If the branch contains OP_RECURSE, the result is -3\n    because there may be forward references that we can't check here. Set a\n    flag to cause another lookbehind check at the end. Why not do it all at the\n    end? Because common, erroneous checks are picked up here and the offset of\n    the problem can be shown. */\n\n    if (lookbehind)\n      {\n      int fixed_length;\n      *code = OP_END;\n      fixed_length = find_fixedlength(last_branch,  (options & PCRE_UTF8) != 0,\n        FALSE, cd, NULL);\n      DPRINTF((\"fixed length = %d\\n\", fixed_length));\n      if (fixed_length == -3)\n        {\n        cd->check_lookbehind = TRUE;\n        }\n      else if (fixed_length < 0)\n        {\n        *errorcodeptr = (fixed_length == -2)? ERR36 :\n                        (fixed_length == -4)? ERR70: ERR25;\n        *ptrptr = ptr;\n        return FALSE;\n        }\n      else\n        {\n        if (fixed_length > cd->max_lookbehind)\n          cd->max_lookbehind = fixed_length;\n        PUT(reverse_count, 0, fixed_length);\n        }\n      }\n    }\n\n  /* Reached end of expression, either ')' or end of pattern. In the real\n  compile phase, go back through the alternative branches and reverse the chain\n  of offsets, with the field in the BRA item now becoming an offset to the\n  first alternative. If there are no alternatives, it points to the end of the\n  group. The length in the terminating ket is always the length of the whole\n  bracketed item. Return leaving the pointer at the terminating char. */\n\n  if (*ptr != CHAR_VERTICAL_LINE)\n    {\n    if (lengthptr == NULL)\n      {\n      int branch_length = (int)(code - last_branch);\n      do\n        {\n        int prev_length = GET(last_branch, 1);\n        PUT(last_branch, 1, branch_length);\n        branch_length = prev_length;\n        last_branch -= branch_length;\n        }\n      while (branch_length > 0);\n      }\n\n    /* Fill in the ket */\n\n    *code = OP_KET;\n    PUT(code, 1, (int)(code - start_bracket));\n    code += 1 + LINK_SIZE;\n\n    /* If it was a capturing subpattern, check to see if it contained any\n    recursive back references. If so, we must wrap it in atomic brackets.\n    Because we are moving code along, we must ensure that any pending recursive\n    references are updated. In any event, remove the block from the chain. */\n\n    if (capnumber > 0)\n      {\n      if (cd->open_caps->flag)\n        {\n        *code = OP_END;\n        adjust_recurse(start_bracket, 1 + LINK_SIZE,\n          (options & PCRE_UTF8) != 0, cd, save_hwm_offset);\n        memmove(start_bracket + 1 + LINK_SIZE, start_bracket,\n          IN_UCHARS(code - start_bracket));\n        *start_bracket = OP_ONCE;\n        code += 1 + LINK_SIZE;\n        PUT(start_bracket, 1, (int)(code - start_bracket));\n        *code = OP_KET;\n        PUT(code, 1, (int)(code - start_bracket));\n        code += 1 + LINK_SIZE;\n        length += 2 + 2*LINK_SIZE;\n        }\n      cd->open_caps = cd->open_caps->next;\n      }\n\n    /* Retain the highest bracket number, in case resetting was used. */\n\n    cd->bracount = max_bracount;\n\n    /* Set values to pass back */\n\n    *codeptr = code;\n    *ptrptr = ptr;\n    *firstcharptr = firstchar;\n    *firstcharflagsptr = firstcharflags;\n    *reqcharptr = reqchar;\n    *reqcharflagsptr = reqcharflags;\n    if (lengthptr != NULL)\n      {\n      if (OFLOW_MAX - *lengthptr < length)\n        {\n        *errorcodeptr = ERR20;\n        return FALSE;\n        }\n      *lengthptr += length;\n      }\n    return TRUE;\n    }\n\n  /* Another branch follows. In the pre-compile phase, we can move the code\n  pointer back to where it was for the start of the first branch. (That is,\n  pretend that each branch is the only one.)\n\n  In the real compile phase, insert an ALT node. Its length field points back\n  to the previous branch while the bracket remains open. At the end the chain\n  is reversed. It's done like this so that the start of the bracket has a\n  zero offset until it is closed, making it possible to detect recursion. */\n\n  if (lengthptr != NULL)\n    {\n    code = *codeptr + 1 + LINK_SIZE + skipbytes;\n    length += 1 + LINK_SIZE;\n    }\n  else\n    {\n    *code = OP_ALT;\n    PUT(code, 1, (int)(code - last_branch));\n    bc.current_branch = last_branch = code;\n    code += 1 + LINK_SIZE;\n    }\n\n  ptr++;\n  }\n/* Control never reaches here */\n}\n\n\n\n\n/*************************************************\n*          Check for anchored expression         *\n*************************************************/\n\n/* Try to find out if this is an anchored regular expression. Consider each\nalternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket\nall of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then\nit's anchored. However, if this is a multiline pattern, then only OP_SOD will\nbe found, because ^ generates OP_CIRCM in that mode.\n\nWe can also consider a regex to be anchored if OP_SOM starts all its branches.\nThis is the code for \\G, which means \"match at start of match position, taking\ninto account the match offset\".\n\nA branch is also implicitly anchored if it starts with .* and DOTALL is set,\nbecause that will try the rest of the pattern at all possible matching points,\nso there is no point trying again.... er ....\n\n.... except when the .* appears inside capturing parentheses, and there is a\nsubsequent back reference to those parentheses. We haven't enough information\nto catch that case precisely.\n\nAt first, the best we could do was to detect when .* was in capturing brackets\nand the highest back reference was greater than or equal to that level.\nHowever, by keeping a bitmap of the first 31 back references, we can catch some\nof the more common cases more precisely.\n\n... A second exception is when the .* appears inside an atomic group, because\nthis prevents the number of characters it matches from being adjusted.\n\nArguments:\n  code           points to start of expression (the bracket)\n  bracket_map    a bitmap of which brackets we are inside while testing; this\n                  handles up to substring 31; after that we just have to take\n                  the less precise approach\n  cd             points to the compile data block\n  atomcount      atomic group level\n\nReturns:     TRUE or FALSE\n*/\n\nstatic BOOL\nis_anchored(register const pcre_uchar *code, unsigned int bracket_map,\n  compile_data *cd, int atomcount)\n{\ndo {\n   const pcre_uchar *scode = first_significant_code(\n     code + PRIV(OP_lengths)[*code], FALSE);\n   register int op = *scode;\n\n   /* Non-capturing brackets */\n\n   if (op == OP_BRA  || op == OP_BRAPOS ||\n       op == OP_SBRA || op == OP_SBRAPOS)\n     {\n     if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE;\n     }\n\n   /* Capturing brackets */\n\n   else if (op == OP_CBRA  || op == OP_CBRAPOS ||\n            op == OP_SCBRA || op == OP_SCBRAPOS)\n     {\n     int n = GET2(scode, 1+LINK_SIZE);\n     int new_map = bracket_map | ((n < 32)? (1 << n) : 1);\n     if (!is_anchored(scode, new_map, cd, atomcount)) return FALSE;\n     }\n\n   /* Positive forward assertion */\n\n   else if (op == OP_ASSERT)\n     {\n     if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE;\n     }\n\n   /* Condition; not anchored if no second branch */\n\n   else if (op == OP_COND)\n     {\n     if (scode[GET(scode,1)] != OP_ALT) return FALSE;\n     if (!is_anchored(scode, bracket_map, cd, atomcount)) return FALSE;\n     }\n\n   /* Atomic groups */\n\n   else if (op == OP_ONCE || op == OP_ONCE_NC)\n     {\n     if (!is_anchored(scode, bracket_map, cd, atomcount + 1))\n       return FALSE;\n     }\n\n   /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and\n   it isn't in brackets that are or may be referenced or inside an atomic\n   group. */\n\n   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR ||\n             op == OP_TYPEPOSSTAR))\n     {\n     if (scode[1] != OP_ALLANY || (bracket_map & cd->backref_map) != 0 ||\n         atomcount > 0 || cd->had_pruneorskip)\n       return FALSE;\n     }\n\n   /* Check for explicit anchoring */\n\n   else if (op != OP_SOD && op != OP_SOM && op != OP_CIRC) return FALSE;\n\n   code += GET(code, 1);\n   }\nwhile (*code == OP_ALT);   /* Loop for each alternative */\nreturn TRUE;\n}\n\n\n\n/*************************************************\n*         Check for starting with ^ or .*        *\n*************************************************/\n\n/* This is called to find out if every branch starts with ^ or .* so that\n\"first char\" processing can be done to speed things up in multiline\nmatching and for non-DOTALL patterns that start with .* (which must start at\nthe beginning or after \\n). As in the case of is_anchored() (see above), we\nhave to take account of back references to capturing brackets that contain .*\nbecause in that case we can't make the assumption. Also, the appearance of .*\ninside atomic brackets or in an assertion, or in a pattern that contains *PRUNE\nor *SKIP does not count, because once again the assumption no longer holds.\n\nArguments:\n  code           points to start of expression (the bracket)\n  bracket_map    a bitmap of which brackets we are inside while testing; this\n                  handles up to substring 31; after that we just have to take\n                  the less precise approach\n  cd             points to the compile data\n  atomcount      atomic group level\n  inassert       TRUE if in an assertion\n\nReturns:         TRUE or FALSE\n*/\n\nstatic BOOL\nis_startline(const pcre_uchar *code, unsigned int bracket_map,\n  compile_data *cd, int atomcount, BOOL inassert)\n{\ndo {\n   const pcre_uchar *scode = first_significant_code(\n     code + PRIV(OP_lengths)[*code], FALSE);\n   register int op = *scode;\n\n   /* If we are at the start of a conditional assertion group, *both* the\n   conditional assertion *and* what follows the condition must satisfy the test\n   for start of line. Other kinds of condition fail. Note that there may be an\n   auto-callout at the start of a condition. */\n\n   if (op == OP_COND)\n     {\n     scode += 1 + LINK_SIZE;\n     if (*scode == OP_CALLOUT) scode += PRIV(OP_lengths)[OP_CALLOUT];\n     switch (*scode)\n       {\n       case OP_CREF:\n       case OP_DNCREF:\n       case OP_RREF:\n       case OP_DNRREF:\n       case OP_DEF:\n       case OP_FAIL:\n       return FALSE;\n\n       default:     /* Assertion */\n       if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE;\n       do scode += GET(scode, 1); while (*scode == OP_ALT);\n       scode += 1 + LINK_SIZE;\n       break;\n       }\n     scode = first_significant_code(scode, FALSE);\n     op = *scode;\n     }\n\n   /* Non-capturing brackets */\n\n   if (op == OP_BRA  || op == OP_BRAPOS ||\n       op == OP_SBRA || op == OP_SBRAPOS)\n     {\n     if (!is_startline(scode, bracket_map, cd, atomcount, inassert)) return FALSE;\n     }\n\n   /* Capturing brackets */\n\n   else if (op == OP_CBRA  || op == OP_CBRAPOS ||\n            op == OP_SCBRA || op == OP_SCBRAPOS)\n     {\n     int n = GET2(scode, 1+LINK_SIZE);\n     int new_map = bracket_map | ((n < 32)? (1 << n) : 1);\n     if (!is_startline(scode, new_map, cd, atomcount, inassert)) return FALSE;\n     }\n\n   /* Positive forward assertions */\n\n   else if (op == OP_ASSERT)\n     {\n     if (!is_startline(scode, bracket_map, cd, atomcount, TRUE)) return FALSE;\n     }\n\n   /* Atomic brackets */\n\n   else if (op == OP_ONCE || op == OP_ONCE_NC)\n     {\n     if (!is_startline(scode, bracket_map, cd, atomcount + 1, inassert)) return FALSE;\n     }\n\n   /* .* means \"start at start or after \\n\" if it isn't in atomic brackets or\n   brackets that may be referenced or an assertion, as long as the pattern does\n   not contain *PRUNE or *SKIP, because these break the feature. Consider, for\n   example, /.*?a(*PRUNE)b/ with the subject \"aab\", which matches \"ab\", i.e.\n   not at the start of a line. */\n\n   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR)\n     {\n     if (scode[1] != OP_ANY || (bracket_map & cd->backref_map) != 0 ||\n         atomcount > 0 || cd->had_pruneorskip || inassert)\n       return FALSE;\n     }\n\n   /* Check for explicit circumflex; anything else gives a FALSE result. Note\n   in particular that this includes atomic brackets OP_ONCE and OP_ONCE_NC\n   because the number of characters matched by .* cannot be adjusted inside\n   them. */\n\n   else if (op != OP_CIRC && op != OP_CIRCM) return FALSE;\n\n   /* Move on to the next alternative */\n\n   code += GET(code, 1);\n   }\nwhile (*code == OP_ALT);  /* Loop for each alternative */\nreturn TRUE;\n}\n\n\n\n/*************************************************\n*       Check for asserted fixed first char      *\n*************************************************/\n\n/* During compilation, the \"first char\" settings from forward assertions are\ndiscarded, because they can cause conflicts with actual literals that follow.\nHowever, if we end up without a first char setting for an unanchored pattern,\nit is worth scanning the regex to see if there is an initial asserted first\nchar. If all branches start with the same asserted char, or with a\nnon-conditional bracket all of whose alternatives start with the same asserted\nchar (recurse ad lib), then we return that char, with the flags set to zero or\nREQ_CASELESS; otherwise return zero with REQ_NONE in the flags.\n\nArguments:\n  code       points to start of expression (the bracket)\n  flags      points to the first char flags, or to REQ_NONE\n  inassert   TRUE if in an assertion\n\nReturns:     the fixed first char, or 0 with REQ_NONE in flags\n*/\n\nstatic pcre_uint32\nfind_firstassertedchar(const pcre_uchar *code, pcre_int32 *flags,\n  BOOL inassert)\n{\nregister pcre_uint32 c = 0;\nint cflags = REQ_NONE;\n\n*flags = REQ_NONE;\ndo {\n   pcre_uint32 d;\n   int dflags;\n   int xl = (*code == OP_CBRA || *code == OP_SCBRA ||\n             *code == OP_CBRAPOS || *code == OP_SCBRAPOS)? IMM2_SIZE:0;\n   const pcre_uchar *scode = first_significant_code(code + 1+LINK_SIZE + xl,\n     TRUE);\n   register pcre_uchar op = *scode;\n\n   switch(op)\n     {\n     default:\n     return 0;\n\n     case OP_BRA:\n     case OP_BRAPOS:\n     case OP_CBRA:\n     case OP_SCBRA:\n     case OP_CBRAPOS:\n     case OP_SCBRAPOS:\n     case OP_ASSERT:\n     case OP_ONCE:\n     case OP_ONCE_NC:\n     d = find_firstassertedchar(scode, &dflags, op == OP_ASSERT);\n     if (dflags < 0)\n       return 0;\n     if (cflags < 0) { c = d; cflags = dflags; } else if (c != d || cflags != dflags) return 0;\n     break;\n\n     case OP_EXACT:\n     scode += IMM2_SIZE;\n     /* Fall through */\n\n     case OP_CHAR:\n     case OP_PLUS:\n     case OP_MINPLUS:\n     case OP_POSPLUS:\n     if (!inassert) return 0;\n     if (cflags < 0) { c = scode[1]; cflags = 0; }\n       else if (c != scode[1]) return 0;\n     break;\n\n     case OP_EXACTI:\n     scode += IMM2_SIZE;\n     /* Fall through */\n\n     case OP_CHARI:\n     case OP_PLUSI:\n     case OP_MINPLUSI:\n     case OP_POSPLUSI:\n     if (!inassert) return 0;\n     if (cflags < 0) { c = scode[1]; cflags = REQ_CASELESS; }\n       else if (c != scode[1]) return 0;\n     break;\n     }\n\n   code += GET(code, 1);\n   }\nwhile (*code == OP_ALT);\n\n*flags = cflags;\nreturn c;\n}\n\n\n\n/*************************************************\n*     Add an entry to the name/number table      *\n*************************************************/\n\n/* This function is called between compiling passes to add an entry to the\nname/number table, maintaining alphabetical order. Checking for permitted\nand forbidden duplicates has already been done.\n\nArguments:\n  cd           the compile data block\n  name         the name to add\n  length       the length of the name\n  groupno      the group number\n\nReturns:       nothing\n*/\n\nstatic void\nadd_name(compile_data *cd, const pcre_uchar *name, int length,\n  unsigned int groupno)\n{\nint i;\npcre_uchar *slot = cd->name_table;\n\nfor (i = 0; i < cd->names_found; i++)\n  {\n  int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(length));\n  if (crc == 0 && slot[IMM2_SIZE+length] != 0)\n    crc = -1; /* Current name is a substring */\n\n  /* Make space in the table and break the loop for an earlier name. For a\n  duplicate or later name, carry on. We do this for duplicates so that in the\n  simple case (when ?(| is not used) they are in order of their numbers. In all\n  cases they are in the order in which they appear in the pattern. */\n\n  if (crc < 0)\n    {\n    memmove(slot + cd->name_entry_size, slot,\n      IN_UCHARS((cd->names_found - i) * cd->name_entry_size));\n    break;\n    }\n\n  /* Continue the loop for a later or duplicate name */\n\n  slot += cd->name_entry_size;\n  }\n\nPUT2(slot, 0, groupno);\nmemcpy(slot + IMM2_SIZE, name, IN_UCHARS(length));\nslot[IMM2_SIZE + length] = 0;\ncd->names_found++;\n}\n\n\n\n/*************************************************\n*        Compile a Regular Expression            *\n*************************************************/\n\n/* This function takes a string and returns a pointer to a block of store\nholding a compiled version of the expression. The original API for this\nfunction had no error code return variable; it is retained for backwards\ncompatibility. The new function is given a new name.\n\nArguments:\n  pattern       the regular expression\n  options       various option bits\n  errorcodeptr  pointer to error code variable (pcre_compile2() only)\n                  can be NULL if you don't want a code value\n  errorptr      pointer to pointer to error text\n  erroroffset   ptr offset in pattern where error was detected\n  tables        pointer to character tables or NULL\n\nReturns:        pointer to compiled data block, or NULL on error,\n                with errorptr and erroroffset set\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION\npcre_compile(const char *pattern, int options, const char **errorptr,\n  int *erroroffset, const unsigned char *tables)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION\npcre16_compile(PCRE_SPTR16 pattern, int options, const char **errorptr,\n  int *erroroffset, const unsigned char *tables)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION\npcre32_compile(PCRE_SPTR32 pattern, int options, const char **errorptr,\n  int *erroroffset, const unsigned char *tables)\n#endif\n{\n#if defined COMPILE_PCRE8\nreturn pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables);\n#elif defined COMPILE_PCRE16\nreturn pcre16_compile2(pattern, options, NULL, errorptr, erroroffset, tables);\n#elif defined COMPILE_PCRE32\nreturn pcre32_compile2(pattern, options, NULL, errorptr, erroroffset, tables);\n#endif\n}\n\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION\npcre_compile2(const char *pattern, int options, int *errorcodeptr,\n  const char **errorptr, int *erroroffset, const unsigned char *tables)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION\npcre16_compile2(PCRE_SPTR16 pattern, int options, int *errorcodeptr,\n  const char **errorptr, int *erroroffset, const unsigned char *tables)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN pcre32 * PCRE_CALL_CONVENTION\npcre32_compile2(PCRE_SPTR32 pattern, int options, int *errorcodeptr,\n  const char **errorptr, int *erroroffset, const unsigned char *tables)\n#endif\n{\nREAL_PCRE *re;\nint length = 1;  /* For final END opcode */\npcre_int32 firstcharflags, reqcharflags;\npcre_uint32 firstchar, reqchar;\npcre_uint32 limit_match = PCRE_UINT32_MAX;\npcre_uint32 limit_recursion = PCRE_UINT32_MAX;\nint newline;\nint errorcode = 0;\nint skipatstart = 0;\nBOOL utf;\nBOOL never_utf = FALSE;\nsize_t size;\npcre_uchar *code;\nconst pcre_uchar *codestart;\nconst pcre_uchar *ptr;\ncompile_data compile_block;\ncompile_data *cd = &compile_block;\n\n/* This space is used for \"compiling\" into during the first phase, when we are\ncomputing the amount of memory that is needed. Compiled items are thrown away\nas soon as possible, so that a fairly large buffer should be sufficient for\nthis purpose. The same space is used in the second phase for remembering where\nto fill in forward references to subpatterns. That may overflow, in which case\nnew memory is obtained from malloc(). */\n\npcre_uchar cworkspace[COMPILE_WORK_SIZE];\n\n/* This vector is used for remembering name groups during the pre-compile. In a\nsimilar way to cworkspace, it can be expanded using malloc() if necessary. */\n\nnamed_group named_groups[NAMED_GROUP_LIST_SIZE];\n\n/* Set this early so that early errors get offset 0. */\n\nptr = (const pcre_uchar *)pattern;\n\n/* We can't pass back an error message if errorptr is NULL; I guess the best we\ncan do is just return NULL, but we can set a code value if there is a code\npointer. */\n\nif (errorptr == NULL)\n  {\n  if (errorcodeptr != NULL) *errorcodeptr = 99;\n  return NULL;\n  }\n\n*errorptr = NULL;\nif (errorcodeptr != NULL) *errorcodeptr = ERR0;\n\n/* However, we can give a message for this error */\n\nif (erroroffset == NULL)\n  {\n  errorcode = ERR16;\n  goto PCRE_EARLY_ERROR_RETURN2;\n  }\n\n*erroroffset = 0;\n\n/* Set up pointers to the individual character tables */\n\nif (tables == NULL) tables = PRIV(default_tables);\ncd->lcc = tables + lcc_offset;\ncd->fcc = tables + fcc_offset;\ncd->cbits = tables + cbits_offset;\ncd->ctypes = tables + ctypes_offset;\n\n/* Check that all undefined public option bits are zero */\n\nif ((options & ~PUBLIC_COMPILE_OPTIONS) != 0)\n  {\n  errorcode = ERR17;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n\n/* If PCRE_NEVER_UTF is set, remember it. */\n\nif ((options & PCRE_NEVER_UTF) != 0) never_utf = TRUE;\n\n/* Check for global one-time settings at the start of the pattern, and remember\nthe offset for later. */\n\ncd->external_flags = 0;   /* Initialize here for LIMIT_MATCH/RECURSION */\n\nwhile (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS &&\n       ptr[skipatstart+1] == CHAR_ASTERISK)\n  {\n  int newnl = 0;\n  int newbsr = 0;\n\n/* For completeness and backward compatibility, (*UTFn) is supported in the\nrelevant libraries, but (*UTF) is generic and always supported. Note that\nPCRE_UTF8 == PCRE_UTF16 == PCRE_UTF32. */\n\n#ifdef COMPILE_PCRE8\n  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF8_RIGHTPAR, 5) == 0)\n    { skipatstart += 7; options |= PCRE_UTF8; continue; }\n#endif\n#ifdef COMPILE_PCRE16\n  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF16_RIGHTPAR, 6) == 0)\n    { skipatstart += 8; options |= PCRE_UTF16; continue; }\n#endif\n#ifdef COMPILE_PCRE32\n  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF32_RIGHTPAR, 6) == 0)\n    { skipatstart += 8; options |= PCRE_UTF32; continue; }\n#endif\n\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF_RIGHTPAR, 4) == 0)\n    { skipatstart += 6; options |= PCRE_UTF8; continue; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UCP_RIGHTPAR, 4) == 0)\n    { skipatstart += 6; options |= PCRE_UCP; continue; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_AUTO_POSSESS_RIGHTPAR, 16) == 0)\n    { skipatstart += 18; options |= PCRE_NO_AUTO_POSSESS; continue; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_START_OPT_RIGHTPAR, 13) == 0)\n    { skipatstart += 15; options |= PCRE_NO_START_OPTIMIZE; continue; }\n\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_MATCH_EQ, 12) == 0)\n    {\n    pcre_uint32 c = 0;\n    int p = skipatstart + 14;\n    while (isdigit(ptr[p]))\n      {\n      if (c > PCRE_UINT32_MAX / 10 - 1) break;   /* Integer overflow */\n      c = c*10 + ptr[p++] - CHAR_0;\n      }\n    if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break;\n    if (c < limit_match)\n      {\n      limit_match = c;\n      cd->external_flags |= PCRE_MLSET;\n      }\n    skipatstart = p;\n    continue;\n    }\n\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LIMIT_RECURSION_EQ, 16) == 0)\n    {\n    pcre_uint32 c = 0;\n    int p = skipatstart + 18;\n    while (isdigit(ptr[p]))\n      {\n      if (c > PCRE_UINT32_MAX / 10 - 1) break;   /* Integer overflow check */\n      c = c*10 + ptr[p++] - CHAR_0;\n      }\n    if (ptr[p++] != CHAR_RIGHT_PARENTHESIS) break;\n    if (c < limit_recursion)\n      {\n      limit_recursion = c;\n      cd->external_flags |= PCRE_RLSET;\n      }\n    skipatstart = p;\n    continue;\n    }\n\n  if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CR_RIGHTPAR, 3) == 0)\n    { skipatstart += 5; newnl = PCRE_NEWLINE_CR; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LF_RIGHTPAR, 3)  == 0)\n    { skipatstart += 5; newnl = PCRE_NEWLINE_LF; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CRLF_RIGHTPAR, 5)  == 0)\n    { skipatstart += 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANY_RIGHTPAR, 4) == 0)\n    { skipatstart += 6; newnl = PCRE_NEWLINE_ANY; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANYCRLF_RIGHTPAR, 8) == 0)\n    { skipatstart += 10; newnl = PCRE_NEWLINE_ANYCRLF; }\n\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_ANYCRLF_RIGHTPAR, 12) == 0)\n    { skipatstart += 14; newbsr = PCRE_BSR_ANYCRLF; }\n  else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_UNICODE_RIGHTPAR, 12) == 0)\n    { skipatstart += 14; newbsr = PCRE_BSR_UNICODE; }\n\n  if (newnl != 0)\n    options = (options & ~PCRE_NEWLINE_BITS) | newnl;\n  else if (newbsr != 0)\n    options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr;\n  else break;\n  }\n\n/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */\nutf = (options & PCRE_UTF8) != 0;\nif (utf && never_utf)\n  {\n  errorcode = ERR78;\n  goto PCRE_EARLY_ERROR_RETURN2;\n  }\n\n/* Can't support UTF unless PCRE has been compiled to include the code. The\nreturn of an error code from PRIV(valid_utf)() is a new feature, introduced in\nrelease 8.13. It is passed back from pcre_[dfa_]exec(), but at the moment is\nnot used here. */\n\n#ifdef SUPPORT_UTF\nif (utf && (options & PCRE_NO_UTF8_CHECK) == 0 &&\n     (errorcode = PRIV(valid_utf)((PCRE_PUCHAR)pattern, -1, erroroffset)) != 0)\n  {\n#if defined COMPILE_PCRE8\n  errorcode = ERR44;\n#elif defined COMPILE_PCRE16\n  errorcode = ERR74;\n#elif defined COMPILE_PCRE32\n  errorcode = ERR77;\n#endif\n  goto PCRE_EARLY_ERROR_RETURN2;\n  }\n#else\nif (utf)\n  {\n  errorcode = ERR32;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n#endif\n\n/* Can't support UCP unless PCRE has been compiled to include the code. */\n\n#ifndef SUPPORT_UCP\nif ((options & PCRE_UCP) != 0)\n  {\n  errorcode = ERR67;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n#endif\n\n/* Check validity of \\R options. */\n\nif ((options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) ==\n     (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))\n  {\n  errorcode = ERR56;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n\n/* Handle different types of newline. The three bits give seven cases. The\ncurrent code allows for fixed one- or two-byte sequences, plus \"any\" and\n\"anycrlf\". */\n\nswitch (options & PCRE_NEWLINE_BITS)\n  {\n  case 0: newline = NEWLINE; break;   /* Build-time default */\n  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;\n  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;\n  case PCRE_NEWLINE_CR+\n       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;\n  case PCRE_NEWLINE_ANY: newline = -1; break;\n  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;\n  default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;\n  }\n\nif (newline == -2)\n  {\n  cd->nltype = NLTYPE_ANYCRLF;\n  }\nelse if (newline < 0)\n  {\n  cd->nltype = NLTYPE_ANY;\n  }\nelse\n  {\n  cd->nltype = NLTYPE_FIXED;\n  if (newline > 255)\n    {\n    cd->nllen = 2;\n    cd->nl[0] = (newline >> 8) & 255;\n    cd->nl[1] = newline & 255;\n    }\n  else\n    {\n    cd->nllen = 1;\n    cd->nl[0] = newline;\n    }\n  }\n\n/* Maximum back reference and backref bitmap. The bitmap records up to 31 back\nreferences to help in deciding whether (.*) can be treated as anchored or not.\n*/\n\ncd->top_backref = 0;\ncd->backref_map = 0;\n\n/* Reflect pattern for debugging output */\n\nDPRINTF((\"------------------------------------------------------------------\\n\"));\n#ifdef PCRE_DEBUG\nprint_puchar(stdout, (PCRE_PUCHAR)pattern);\n#endif\nDPRINTF((\"\\n\"));\n\n/* Pretend to compile the pattern while actually just accumulating the length\nof memory required. This behaviour is triggered by passing a non-NULL final\nargument to compile_regex(). We pass a block of workspace (cworkspace) for it\nto compile parts of the pattern into; the compiled code is discarded when it is\nno longer needed, so hopefully this workspace will never overflow, though there\nis a test for its doing so. */\n\ncd->bracount = cd->final_bracount = 0;\ncd->names_found = 0;\ncd->name_entry_size = 0;\ncd->name_table = NULL;\ncd->dupnames = FALSE;\ncd->dupgroups = FALSE;\ncd->namedrefcount = 0;\ncd->start_code = cworkspace;\ncd->hwm = cworkspace;\ncd->iscondassert = FALSE;\ncd->start_workspace = cworkspace;\ncd->workspace_size = COMPILE_WORK_SIZE;\ncd->named_groups = named_groups;\ncd->named_group_list_size = NAMED_GROUP_LIST_SIZE;\ncd->start_pattern = (const pcre_uchar *)pattern;\ncd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern));\ncd->req_varyopt = 0;\ncd->parens_depth = 0;\ncd->assert_depth = 0;\ncd->max_lookbehind = 0;\ncd->external_options = options;\ncd->open_caps = NULL;\n\n/* Now do the pre-compile. On error, errorcode will be set non-zero, so we\ndon't need to look at the result of the function here. The initial options have\nbeen put into the cd block so that they can be changed if an option setting is\nfound within the regex right at the beginning. Bringing initial option settings\noutside can help speed up starting point checks. */\n\nptr += skipatstart;\ncode = cworkspace;\n*code = OP_BRA;\n\n(void)compile_regex(cd->external_options, &code, &ptr, &errorcode, FALSE,\n  FALSE, 0, 0, &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL,\n  cd, &length);\nif (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN;\n\nDPRINTF((\"end pre-compile: length=%d workspace=%d\\n\", length,\n  (int)(cd->hwm - cworkspace)));\n\nif (length > MAX_PATTERN_SIZE)\n  {\n  errorcode = ERR20;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n\n/* Compute the size of the data block for storing the compiled pattern. Integer\noverflow should no longer be possible because nowadays we limit the maximum\nvalue of cd->names_found and cd->name_entry_size. */\n\nsize = sizeof(REAL_PCRE) +\n  (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar);\n\n/* Get the memory. */\n\nre = (REAL_PCRE *)(PUBL(malloc))(size);\nif (re == NULL)\n  {\n  errorcode = ERR21;\n  goto PCRE_EARLY_ERROR_RETURN;\n  }\n\n/* Put in the magic number, and save the sizes, initial options, internal\nflags, and character table pointer. NULL is used for the default character\ntables. The nullpad field is at the end; it's there to help in the case when a\nregex compiled on a system with 4-byte pointers is run on another with 8-byte\npointers. */\n\nre->magic_number = MAGIC_NUMBER;\nre->size = (int)size;\nre->options = cd->external_options;\nre->flags = cd->external_flags;\nre->limit_match = limit_match;\nre->limit_recursion = limit_recursion;\nre->first_char = 0;\nre->req_char = 0;\nre->name_table_offset = sizeof(REAL_PCRE) / sizeof(pcre_uchar);\nre->name_entry_size = cd->name_entry_size;\nre->name_count = cd->names_found;\nre->ref_count = 0;\nre->tables = (tables == PRIV(default_tables))? NULL : tables;\nre->nullpad = NULL;\n#ifdef COMPILE_PCRE32\nre->dummy = 0;\n#else\nre->dummy1 = re->dummy2 = re->dummy3 = 0;\n#endif\n\n/* The starting points of the name/number translation table and of the code are\npassed around in the compile data block. The start/end pattern and initial\noptions are already set from the pre-compile phase, as is the name_entry_size\nfield. Reset the bracket count and the names_found field. Also reset the hwm\nfield; this time it's used for remembering forward references to subpatterns.\n*/\n\ncd->final_bracount = cd->bracount;  /* Save for checking forward references */\ncd->parens_depth = 0;\ncd->assert_depth = 0;\ncd->bracount = 0;\ncd->max_lookbehind = 0;\ncd->name_table = (pcre_uchar *)re + re->name_table_offset;\ncodestart = cd->name_table + re->name_entry_size * re->name_count;\ncd->start_code = codestart;\ncd->hwm = (pcre_uchar *)(cd->start_workspace);\ncd->iscondassert = FALSE;\ncd->req_varyopt = 0;\ncd->had_accept = FALSE;\ncd->had_pruneorskip = FALSE;\ncd->check_lookbehind = FALSE;\ncd->open_caps = NULL;\n\n/* If any named groups were found, create the name/number table from the list\ncreated in the first pass. */\n\nif (cd->names_found > 0)\n  {\n  int i = cd->names_found;\n  named_group *ng = cd->named_groups;\n  cd->names_found = 0;\n  for (; i > 0; i--, ng++)\n    add_name(cd, ng->name, ng->length, ng->number);\n  if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)\n    (PUBL(free))((void *)cd->named_groups);\n  }\n\n/* Set up a starting, non-extracting bracket, then compile the expression. On\nerror, errorcode will be set non-zero, so we don't need to look at the result\nof the function here. */\n\nptr = (const pcre_uchar *)pattern + skipatstart;\ncode = (pcre_uchar *)codestart;\n*code = OP_BRA;\n(void)compile_regex(re->options, &code, &ptr, &errorcode, FALSE, FALSE, 0, 0,\n  &firstchar, &firstcharflags, &reqchar, &reqcharflags, NULL, cd, NULL);\nre->top_bracket = cd->bracount;\nre->top_backref = cd->top_backref;\nre->max_lookbehind = cd->max_lookbehind;\nre->flags = cd->external_flags | PCRE_MODE;\n\nif (cd->had_accept)\n  {\n  reqchar = 0;              /* Must disable after (*ACCEPT) */\n  reqcharflags = REQ_NONE;\n  }\n\n/* If not reached end of pattern on success, there's an excess bracket. */\n\nif (errorcode == 0 && *ptr != CHAR_NULL) errorcode = ERR22;\n\n/* Fill in the terminating state and check for disastrous overflow, but\nif debugging, leave the test till after things are printed out. */\n\n*code++ = OP_END;\n\n#ifndef PCRE_DEBUG\nif (code - codestart > length) errorcode = ERR23;\n#endif\n\n#ifdef SUPPORT_VALGRIND\n/* If the estimated length exceeds the really used length, mark the extra\nallocated memory as unaddressable, so that any out-of-bound reads can be\ndetected. */\nVALGRIND_MAKE_MEM_NOACCESS(code, (length - (code - codestart)) * sizeof(pcre_uchar));\n#endif\n\n/* Fill in any forward references that are required. There may be repeated\nreferences; optimize for them, as searching a large regex takes time. */\n\nif (cd->hwm > cd->start_workspace)\n  {\n  int prev_recno = -1;\n  const pcre_uchar *groupptr = NULL;\n  while (errorcode == 0 && cd->hwm > cd->start_workspace)\n    {\n    int offset, recno;\n    cd->hwm -= LINK_SIZE;\n    offset = GET(cd->hwm, 0);\n\n    /* Check that the hwm handling hasn't gone wrong. This whole area is\n    rewritten in PCRE2 because there are some obscure cases. */\n\n    if (offset == 0 || codestart[offset-1] != OP_RECURSE)\n      {\n      errorcode = ERR10;\n      break;\n      }\n\n    recno = GET(codestart, offset);\n    if (recno != prev_recno)\n      {\n      groupptr = PRIV(find_bracket)(codestart, utf, recno);\n      prev_recno = recno;\n      }\n    if (groupptr == NULL) errorcode = ERR53;\n      else PUT(((pcre_uchar *)codestart), offset, (int)(groupptr - codestart));\n    }\n  }\n\n/* If the workspace had to be expanded, free the new memory. Set the pointer to\nNULL to indicate that forward references have been filled in. */\n\nif (cd->workspace_size > COMPILE_WORK_SIZE)\n  (PUBL(free))((void *)cd->start_workspace);\ncd->start_workspace = NULL;\n\n/* Give an error if there's back reference to a non-existent capturing\nsubpattern. */\n\nif (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15;\n\n/* Unless disabled, check whether any single character iterators can be\nauto-possessified. The function overwrites the appropriate opcode values, so\nthe type of the pointer must be cast. NOTE: the intermediate variable \"temp\" is\nused in this code because at least one compiler gives a warning about loss of\n\"const\" attribute if the cast (pcre_uchar *)codestart is used directly in the\nfunction call. */\n\nif (errorcode == 0 && (options & PCRE_NO_AUTO_POSSESS) == 0)\n  {\n  pcre_uchar *temp = (pcre_uchar *)codestart;\n  auto_possessify(temp, utf, cd);\n  }\n\n/* If there were any lookbehind assertions that contained OP_RECURSE\n(recursions or subroutine calls), a flag is set for them to be checked here,\nbecause they may contain forward references. Actual recursions cannot be fixed\nlength, but subroutine calls can. It is done like this so that those without\nOP_RECURSE that are not fixed length get a diagnosic with a useful offset. The\nexceptional ones forgo this. We scan the pattern to check that they are fixed\nlength, and set their lengths. */\n\nif (errorcode == 0 && cd->check_lookbehind)\n  {\n  pcre_uchar *cc = (pcre_uchar *)codestart;\n\n  /* Loop, searching for OP_REVERSE items, and process those that do not have\n  their length set. (Actually, it will also re-process any that have a length\n  of zero, but that is a pathological case, and it does no harm.) When we find\n  one, we temporarily terminate the branch it is in while we scan it. */\n\n  for (cc = (pcre_uchar *)PRIV(find_bracket)(codestart, utf, -1);\n       cc != NULL;\n       cc = (pcre_uchar *)PRIV(find_bracket)(cc, utf, -1))\n    {\n    if (GET(cc, 1) == 0)\n      {\n      int fixed_length;\n      pcre_uchar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE);\n      int end_op = *be;\n      *be = OP_END;\n      fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE,\n        cd, NULL);\n      *be = end_op;\n      DPRINTF((\"fixed length = %d\\n\", fixed_length));\n      if (fixed_length < 0)\n        {\n        errorcode = (fixed_length == -2)? ERR36 :\n                    (fixed_length == -4)? ERR70 : ERR25;\n        break;\n        }\n      if (fixed_length > cd->max_lookbehind) cd->max_lookbehind = fixed_length;\n      PUT(cc, 1, fixed_length);\n      }\n    cc += 1 + LINK_SIZE;\n    }\n  }\n\n/* Failed to compile, or error while post-processing */\n\nif (errorcode != 0)\n  {\n  (PUBL(free))(re);\n  PCRE_EARLY_ERROR_RETURN:\n  *erroroffset = (int)(ptr - (const pcre_uchar *)pattern);\n  PCRE_EARLY_ERROR_RETURN2:\n  *errorptr = find_error_text(errorcode);\n  if (errorcodeptr != NULL) *errorcodeptr = errorcode;\n  return NULL;\n  }\n\n/* If the anchored option was not passed, set the flag if we can determine that\nthe pattern is anchored by virtue of ^ characters or \\A or anything else, such\nas starting with non-atomic .* when DOTALL is set and there are no occurrences\nof *PRUNE or *SKIP.\n\nOtherwise, if we know what the first byte has to be, save it, because that\nspeeds up unanchored matches no end. If not, see if we can set the\nPCRE_STARTLINE flag. This is helpful for multiline matches when all branches\nstart with ^. and also when all branches start with non-atomic .* for\nnon-DOTALL matches when *PRUNE and SKIP are not present. */\n\nif ((re->options & PCRE_ANCHORED) == 0)\n  {\n  if (is_anchored(codestart, 0, cd, 0)) re->options |= PCRE_ANCHORED;\n  else\n    {\n    if (firstcharflags < 0)\n      firstchar = find_firstassertedchar(codestart, &firstcharflags, FALSE);\n    if (firstcharflags >= 0)   /* Remove caseless flag for non-caseable chars */\n      {\n#if defined COMPILE_PCRE8\n      re->first_char = firstchar & 0xff;\n#elif defined COMPILE_PCRE16\n      re->first_char = firstchar & 0xffff;\n#elif defined COMPILE_PCRE32\n      re->first_char = firstchar;\n#endif\n      if ((firstcharflags & REQ_CASELESS) != 0)\n        {\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n        /* We ignore non-ASCII first chars in 8 bit mode. */\n        if (utf)\n          {\n          if (re->first_char < 128)\n            {\n            if (cd->fcc[re->first_char] != re->first_char)\n              re->flags |= PCRE_FCH_CASELESS;\n            }\n          else if (UCD_OTHERCASE(re->first_char) != re->first_char)\n            re->flags |= PCRE_FCH_CASELESS;\n          }\n        else\n#endif\n        if (MAX_255(re->first_char)\n            && cd->fcc[re->first_char] != re->first_char)\n          re->flags |= PCRE_FCH_CASELESS;\n        }\n\n      re->flags |= PCRE_FIRSTSET;\n      }\n\n    else if (is_startline(codestart, 0, cd, 0, FALSE)) re->flags |= PCRE_STARTLINE;\n    }\n  }\n\n/* For an anchored pattern, we use the \"required byte\" only if it follows a\nvariable length item in the regex. Remove the caseless flag for non-caseable\nbytes. */\n\nif (reqcharflags >= 0 &&\n     ((re->options & PCRE_ANCHORED) == 0 || (reqcharflags & REQ_VARY) != 0))\n  {\n#if defined COMPILE_PCRE8\n  re->req_char = reqchar & 0xff;\n#elif defined COMPILE_PCRE16\n  re->req_char = reqchar & 0xffff;\n#elif defined COMPILE_PCRE32\n  re->req_char = reqchar;\n#endif\n  if ((reqcharflags & REQ_CASELESS) != 0)\n    {\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n    /* We ignore non-ASCII first chars in 8 bit mode. */\n    if (utf)\n      {\n      if (re->req_char < 128)\n        {\n        if (cd->fcc[re->req_char] != re->req_char)\n          re->flags |= PCRE_RCH_CASELESS;\n        }\n      else if (UCD_OTHERCASE(re->req_char) != re->req_char)\n        re->flags |= PCRE_RCH_CASELESS;\n      }\n    else\n#endif\n    if (MAX_255(re->req_char) && cd->fcc[re->req_char] != re->req_char)\n      re->flags |= PCRE_RCH_CASELESS;\n    }\n\n  re->flags |= PCRE_REQCHSET;\n  }\n\n/* Print out the compiled data if debugging is enabled. This is never the\ncase when building a production library. */\n\n#ifdef PCRE_DEBUG\nprintf(\"Length = %d top_bracket = %d top_backref = %d\\n\",\n  length, re->top_bracket, re->top_backref);\n\nprintf(\"Options=%08x\\n\", re->options);\n\nif ((re->flags & PCRE_FIRSTSET) != 0)\n  {\n  pcre_uchar ch = re->first_char;\n  const char *caseless =\n    ((re->flags & PCRE_FCH_CASELESS) == 0)? \"\" : \" (caseless)\";\n  if (PRINTABLE(ch)) printf(\"First char = %c%s\\n\", ch, caseless);\n    else printf(\"First char = \\\\x%02x%s\\n\", ch, caseless);\n  }\n\nif ((re->flags & PCRE_REQCHSET) != 0)\n  {\n  pcre_uchar ch = re->req_char;\n  const char *caseless =\n    ((re->flags & PCRE_RCH_CASELESS) == 0)? \"\" : \" (caseless)\";\n  if (PRINTABLE(ch)) printf(\"Req char = %c%s\\n\", ch, caseless);\n    else printf(\"Req char = \\\\x%02x%s\\n\", ch, caseless);\n  }\n\n#if defined COMPILE_PCRE8\npcre_printint((pcre *)re, stdout, TRUE);\n#elif defined COMPILE_PCRE16\npcre16_printint((pcre *)re, stdout, TRUE);\n#elif defined COMPILE_PCRE32\npcre32_printint((pcre *)re, stdout, TRUE);\n#endif\n\n/* This check is done here in the debugging case so that the code that\nwas compiled can be seen. */\n\nif (code - codestart > length)\n  {\n  (PUBL(free))(re);\n  *errorptr = find_error_text(ERR23);\n  *erroroffset = ptr - (pcre_uchar *)pattern;\n  if (errorcodeptr != NULL) *errorcodeptr = ERR23;\n  return NULL;\n  }\n#endif   /* PCRE_DEBUG */\n\n/* Check for a pattern than can match an empty string, so that this information\ncan be provided to applications. */\n\ndo\n  {\n  if (could_be_empty_branch(codestart, code, utf, cd, NULL))\n    {\n    re->flags |= PCRE_MATCH_EMPTY;\n    break;\n    }\n  codestart += GET(codestart, 1);\n  }\nwhile (*codestart == OP_ALT);\n\n#if defined COMPILE_PCRE8\nreturn (pcre *)re;\n#elif defined COMPILE_PCRE16\nreturn (pcre16 *)re;\n#elif defined COMPILE_PCRE32\nreturn (pcre32 *)re;\n#endif\n}\n\n/* End of pcre_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre_config.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_config(). */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* Keep the original link size. */\nstatic int real_link_size = LINK_SIZE;\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n* Return info about what features are configured *\n*************************************************/\n\n/* This function has an extensible interface so that additional items can be\nadded compatibly.\n\nArguments:\n  what             what information is required\n  where            where to put the information\n\nReturns:           0 if data returned, negative on error\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_config(int what, void *where)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_config(int what, void *where)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_config(int what, void *where)\n#endif\n{\nswitch (what)\n  {\n  case PCRE_CONFIG_UTF8:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  *((int *)where) = 0;\n  return PCRE_ERROR_BADOPTION;\n#else\n#if defined SUPPORT_UTF\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n#endif\n\n  case PCRE_CONFIG_UTF16:\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE32\n  *((int *)where) = 0;\n  return PCRE_ERROR_BADOPTION;\n#else\n#if defined SUPPORT_UTF\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n#endif\n\n  case PCRE_CONFIG_UTF32:\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\n  *((int *)where) = 0;\n  return PCRE_ERROR_BADOPTION;\n#else\n#if defined SUPPORT_UTF\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n#endif\n\n  case PCRE_CONFIG_UNICODE_PROPERTIES:\n#ifdef SUPPORT_UCP\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n\n  case PCRE_CONFIG_JIT:\n#ifdef SUPPORT_JIT\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n\n  case PCRE_CONFIG_JITTARGET:\n#ifdef SUPPORT_JIT\n  *((const char **)where) = PRIV(jit_get_target)();\n#else\n  *((const char **)where) = NULL;\n#endif\n  break;\n\n  case PCRE_CONFIG_NEWLINE:\n  *((int *)where) = NEWLINE;\n  break;\n\n  case PCRE_CONFIG_BSR:\n#ifdef BSR_ANYCRLF\n  *((int *)where) = 1;\n#else\n  *((int *)where) = 0;\n#endif\n  break;\n\n  case PCRE_CONFIG_LINK_SIZE:\n  *((int *)where) = real_link_size;\n  break;\n\n  case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:\n  *((int *)where) = POSIX_MALLOC_THRESHOLD;\n  break;\n\n  case PCRE_CONFIG_PARENS_LIMIT:\n  *((unsigned long int *)where) = PARENS_NEST_LIMIT;\n  break;\n\n  case PCRE_CONFIG_MATCH_LIMIT:\n  *((unsigned long int *)where) = MATCH_LIMIT;\n  break;\n\n  case PCRE_CONFIG_MATCH_LIMIT_RECURSION:\n  *((unsigned long int *)where) = MATCH_LIMIT_RECURSION;\n  break;\n\n  case PCRE_CONFIG_STACKRECURSE:\n#ifdef NO_RECURSE\n  *((int *)where) = 0;\n#else\n  *((int *)where) = 1;\n#endif\n  break;\n\n  default: return PCRE_ERROR_BADOPTION;\n  }\n\nreturn 0;\n}\n\n/* End of pcre_config.c */\n"
  },
  {
    "path": "src/pcre/pcre_dfa_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language (but see\nbelow for why this module is different).\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2017 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* This module contains the external function pcre_dfa_exec(), which is an\nalternative matching function that uses a sort of DFA algorithm (not a true\nFSM). This is NOT Perl-compatible, but it has advantages in certain\napplications. */\n\n\n/* NOTE ABOUT PERFORMANCE: A user of this function sent some code that improved\nthe performance of his patterns greatly. I could not use it as it stood, as it\nwas not thread safe, and made assumptions about pattern sizes. Also, it caused\ntest 7 to loop, and test 9 to crash with a segfault.\n\nThe issue is the check for duplicate states, which is done by a simple linear\nsearch up the state list. (Grep for \"duplicate\" below to find the code.) For\nmany patterns, there will never be many states active at one time, so a simple\nlinear search is fine. In patterns that have many active states, it might be a\nbottleneck. The suggested code used an indexing scheme to remember which states\nhad previously been used for each character, and avoided the linear search when\nit knew there was no chance of a duplicate. This was implemented when adding\nstates to the state lists.\n\nI wrote some thread-safe, not-limited code to try something similar at the time\nof checking for duplicates (instead of when adding states), using index vectors\non the stack. It did give a 13% improvement with one specially constructed\npattern for certain subject strings, but on other strings and on many of the\nsimpler patterns in the test suite it did worse. The major problem, I think,\nwas the extra time to initialize the index. This had to be done for each call\nof internal_dfa_exec(). (The supplied patch used a static vector, initialized\nonly once - I suspect this was the cause of the problems with the tests.)\n\nOverall, I concluded that the gains in some cases did not outweigh the losses\nin others, so I abandoned this code. */\n\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#define NLBLOCK md             /* Block containing newline information */\n#define PSSTART start_subject  /* Field containing processed string start */\n#define PSEND   end_subject    /* Field containing processed string end */\n\n#include \"pcre_internal.h\"\n\n\n/* For use to indent debugging output */\n\n#define SP \"                   \"\n\n\n/*************************************************\n*      Code parameters and static tables         *\n*************************************************/\n\n/* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes\ninto others, under special conditions. A gap of 20 between the blocks should be\nenough. The resulting opcodes don't have to be less than 256 because they are\nnever stored, so we push them well clear of the normal opcodes. */\n\n#define OP_PROP_EXTRA       300\n#define OP_EXTUNI_EXTRA     320\n#define OP_ANYNL_EXTRA      340\n#define OP_HSPACE_EXTRA     360\n#define OP_VSPACE_EXTRA     380\n\n\n/* This table identifies those opcodes that are followed immediately by a\ncharacter that is to be tested in some way. This makes it possible to\ncentralize the loading of these characters. In the case of Type * etc, the\n\"character\" is the opcode for \\D, \\d, \\S, \\s, \\W, or \\w, which will always be a\nsmall value. Non-zero values in the table are the offsets from the opcode where\nthe character is to be found. ***NOTE*** If the start of this table is\nmodified, the three tables that follow must also be modified. */\n\nstatic const pcre_uint8 coptable[] = {\n  0,                             /* End                                    */\n  0, 0, 0, 0, 0,                 /* \\A, \\G, \\K, \\B, \\b                     */\n  0, 0, 0, 0, 0, 0,              /* \\D, \\d, \\S, \\s, \\W, \\w                 */\n  0, 0, 0,                       /* Any, AllAny, Anybyte                   */\n  0, 0,                          /* \\P, \\p                                 */\n  0, 0, 0, 0, 0,                 /* \\R, \\H, \\h, \\V, \\v                     */\n  0,                             /* \\X                                     */\n  0, 0, 0, 0, 0, 0,              /* \\Z, \\z, $, $M, ^, ^M                   */\n  1,                             /* Char                                   */\n  1,                             /* Chari                                  */\n  1,                             /* not                                    */\n  1,                             /* noti                                   */\n  /* Positive single-char repeats                                          */\n  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */\n  1+IMM2_SIZE, 1+IMM2_SIZE,      /* upto, minupto                          */\n  1+IMM2_SIZE,                   /* exact                                  */\n  1, 1, 1, 1+IMM2_SIZE,          /* *+, ++, ?+, upto+                      */\n  1, 1, 1, 1, 1, 1,              /* *I, *?I, +I, +?I, ?I, ??I              */\n  1+IMM2_SIZE, 1+IMM2_SIZE,      /* upto I, minupto I                      */\n  1+IMM2_SIZE,                   /* exact I                                */\n  1, 1, 1, 1+IMM2_SIZE,          /* *+I, ++I, ?+I, upto+I                  */\n  /* Negative single-char repeats - only for chars < 256                   */\n  1, 1, 1, 1, 1, 1,              /* NOT *, *?, +, +?, ?, ??                */\n  1+IMM2_SIZE, 1+IMM2_SIZE,      /* NOT upto, minupto                      */\n  1+IMM2_SIZE,                   /* NOT exact                              */\n  1, 1, 1, 1+IMM2_SIZE,          /* NOT *+, ++, ?+, upto+                  */\n  1, 1, 1, 1, 1, 1,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */\n  1+IMM2_SIZE, 1+IMM2_SIZE,      /* NOT upto I, minupto I                  */\n  1+IMM2_SIZE,                   /* NOT exact I                            */\n  1, 1, 1, 1+IMM2_SIZE,          /* NOT *+I, ++I, ?+I, upto+I              */\n  /* Positive type repeats                                                 */\n  1, 1, 1, 1, 1, 1,              /* Type *, *?, +, +?, ?, ??               */\n  1+IMM2_SIZE, 1+IMM2_SIZE,      /* Type upto, minupto                     */\n  1+IMM2_SIZE,                   /* Type exact                             */\n  1, 1, 1, 1+IMM2_SIZE,          /* Type *+, ++, ?+, upto+                 */\n  /* Character class & ref repeats                                         */\n  0, 0, 0, 0, 0, 0,              /* *, *?, +, +?, ?, ??                    */\n  0, 0,                          /* CRRANGE, CRMINRANGE                    */\n  0, 0, 0, 0,                    /* Possessive *+, ++, ?+, CRPOSRANGE      */\n  0,                             /* CLASS                                  */\n  0,                             /* NCLASS                                 */\n  0,                             /* XCLASS - variable length               */\n  0,                             /* REF                                    */\n  0,                             /* REFI                                   */\n  0,                             /* DNREF                                  */\n  0,                             /* DNREFI                                 */\n  0,                             /* RECURSE                                */\n  0,                             /* CALLOUT                                */\n  0,                             /* Alt                                    */\n  0,                             /* Ket                                    */\n  0,                             /* KetRmax                                */\n  0,                             /* KetRmin                                */\n  0,                             /* KetRpos                                */\n  0,                             /* Reverse                                */\n  0,                             /* Assert                                 */\n  0,                             /* Assert not                             */\n  0,                             /* Assert behind                          */\n  0,                             /* Assert behind not                      */\n  0, 0,                          /* ONCE, ONCE_NC                          */\n  0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */\n  0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */\n  0, 0,                          /* CREF, DNCREF                           */\n  0, 0,                          /* RREF, DNRREF                           */\n  0,                             /* DEF                                    */\n  0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */\n  0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */\n  0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */\n  0, 0, 0, 0,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */\n  0, 0                           /* CLOSE, SKIPZERO  */\n};\n\n/* This table identifies those opcodes that inspect a character. It is used to\nremember the fact that a character could have been inspected when the end of\nthe subject is reached. ***NOTE*** If the start of this table is modified, the\ntwo tables that follow must also be modified. */\n\nstatic const pcre_uint8 poptable[] = {\n  0,                             /* End                                    */\n  0, 0, 0, 1, 1,                 /* \\A, \\G, \\K, \\B, \\b                     */\n  1, 1, 1, 1, 1, 1,              /* \\D, \\d, \\S, \\s, \\W, \\w                 */\n  1, 1, 1,                       /* Any, AllAny, Anybyte                   */\n  1, 1,                          /* \\P, \\p                                 */\n  1, 1, 1, 1, 1,                 /* \\R, \\H, \\h, \\V, \\v                     */\n  1,                             /* \\X                                     */\n  0, 0, 0, 0, 0, 0,              /* \\Z, \\z, $, $M, ^, ^M                   */\n  1,                             /* Char                                   */\n  1,                             /* Chari                                  */\n  1,                             /* not                                    */\n  1,                             /* noti                                   */\n  /* Positive single-char repeats                                          */\n  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */\n  1, 1, 1,                       /* upto, minupto, exact                   */\n  1, 1, 1, 1,                    /* *+, ++, ?+, upto+                      */\n  1, 1, 1, 1, 1, 1,              /* *I, *?I, +I, +?I, ?I, ??I              */\n  1, 1, 1,                       /* upto I, minupto I, exact I             */\n  1, 1, 1, 1,                    /* *+I, ++I, ?+I, upto+I                  */\n  /* Negative single-char repeats - only for chars < 256                   */\n  1, 1, 1, 1, 1, 1,              /* NOT *, *?, +, +?, ?, ??                */\n  1, 1, 1,                       /* NOT upto, minupto, exact               */\n  1, 1, 1, 1,                    /* NOT *+, ++, ?+, upto+                  */\n  1, 1, 1, 1, 1, 1,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */\n  1, 1, 1,                       /* NOT upto I, minupto I, exact I         */\n  1, 1, 1, 1,                    /* NOT *+I, ++I, ?+I, upto+I              */\n  /* Positive type repeats                                                 */\n  1, 1, 1, 1, 1, 1,              /* Type *, *?, +, +?, ?, ??               */\n  1, 1, 1,                       /* Type upto, minupto, exact              */\n  1, 1, 1, 1,                    /* Type *+, ++, ?+, upto+                 */\n  /* Character class & ref repeats                                         */\n  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */\n  1, 1,                          /* CRRANGE, CRMINRANGE                    */\n  1, 1, 1, 1,                    /* Possessive *+, ++, ?+, CRPOSRANGE      */\n  1,                             /* CLASS                                  */\n  1,                             /* NCLASS                                 */\n  1,                             /* XCLASS - variable length               */\n  0,                             /* REF                                    */\n  0,                             /* REFI                                   */\n  0,                             /* DNREF                                  */\n  0,                             /* DNREFI                                 */\n  0,                             /* RECURSE                                */\n  0,                             /* CALLOUT                                */\n  0,                             /* Alt                                    */\n  0,                             /* Ket                                    */\n  0,                             /* KetRmax                                */\n  0,                             /* KetRmin                                */\n  0,                             /* KetRpos                                */\n  0,                             /* Reverse                                */\n  0,                             /* Assert                                 */\n  0,                             /* Assert not                             */\n  0,                             /* Assert behind                          */\n  0,                             /* Assert behind not                      */\n  0, 0,                          /* ONCE, ONCE_NC                          */\n  0, 0, 0, 0, 0,                 /* BRA, BRAPOS, CBRA, CBRAPOS, COND       */\n  0, 0, 0, 0, 0,                 /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND  */\n  0, 0,                          /* CREF, DNCREF                           */\n  0, 0,                          /* RREF, DNRREF                           */\n  0,                             /* DEF                                    */\n  0, 0, 0,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */\n  0, 0, 0,                       /* MARK, PRUNE, PRUNE_ARG                 */\n  0, 0, 0, 0,                    /* SKIP, SKIP_ARG, THEN, THEN_ARG         */\n  0, 0, 0, 0,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */\n  0, 0                           /* CLOSE, SKIPZERO                        */\n};\n\n/* These 2 tables allow for compact code for testing for \\D, \\d, \\S, \\s, \\W,\nand \\w */\n\nstatic const pcre_uint8 toptable1[] = {\n  0, 0, 0, 0, 0, 0,\n  ctype_digit, ctype_digit,\n  ctype_space, ctype_space,\n  ctype_word,  ctype_word,\n  0, 0                            /* OP_ANY, OP_ALLANY */\n};\n\nstatic const pcre_uint8 toptable2[] = {\n  0, 0, 0, 0, 0, 0,\n  ctype_digit, 0,\n  ctype_space, 0,\n  ctype_word,  0,\n  1, 1                            /* OP_ANY, OP_ALLANY */\n};\n\n\n/* Structure for holding data about a particular state, which is in effect the\ncurrent data for an active path through the match tree. It must consist\nentirely of ints because the working vector we are passed, and which we put\nthese structures in, is a vector of ints. */\n\ntypedef struct stateblock {\n  int offset;                     /* Offset to opcode */\n  int count;                      /* Count for repeats */\n  int data;                       /* Some use extra data */\n} stateblock;\n\n#define INTS_PER_STATEBLOCK  (int)(sizeof(stateblock)/sizeof(int))\n\n\n#ifdef PCRE_DEBUG\n/*************************************************\n*             Print character string             *\n*************************************************/\n\n/* Character string printing function for debugging.\n\nArguments:\n  p            points to string\n  length       number of bytes\n  f            where to print\n\nReturns:       nothing\n*/\n\nstatic void\npchars(const pcre_uchar *p, int length, FILE *f)\n{\npcre_uint32 c;\nwhile (length-- > 0)\n  {\n  if (isprint(c = *(p++)))\n    fprintf(f, \"%c\", c);\n  else\n    fprintf(f, \"\\\\x{%02x}\", c);\n  }\n}\n#endif\n\n\n\n/*************************************************\n*    Execute a Regular Expression - DFA engine   *\n*************************************************/\n\n/* This internal function applies a compiled pattern to a subject string,\nstarting at a given point, using a DFA engine. This function is called from the\nexternal one, possibly multiple times if the pattern is not anchored. The\nfunction calls itself recursively for some kinds of subpattern.\n\nArguments:\n  md                the match_data block with fixed information\n  this_start_code   the opening bracket of this subexpression's code\n  current_subject   where we currently are in the subject string\n  start_offset      start offset in the subject string\n  offsets           vector to contain the matching string offsets\n  offsetcount       size of same\n  workspace         vector of workspace\n  wscount           size of same\n  rlevel            function call recursion level\n\nReturns:            > 0 => number of match offset pairs placed in offsets\n                    = 0 => offsets overflowed; longest matches are present\n                     -1 => failed to match\n                   < -1 => some kind of unexpected problem\n\nThe following macros are used for adding states to the two state vectors (one\nfor the current character, one for the following character). */\n\n#define ADD_ACTIVE(x,y) \\\n  if (active_count++ < wscount) \\\n    { \\\n    next_active_state->offset = (x); \\\n    next_active_state->count  = (y); \\\n    next_active_state++; \\\n    DPRINTF((\"%.*sADD_ACTIVE(%d,%d)\\n\", rlevel*2-2, SP, (x), (y))); \\\n    } \\\n  else return PCRE_ERROR_DFA_WSSIZE\n\n#define ADD_ACTIVE_DATA(x,y,z) \\\n  if (active_count++ < wscount) \\\n    { \\\n    next_active_state->offset = (x); \\\n    next_active_state->count  = (y); \\\n    next_active_state->data   = (z); \\\n    next_active_state++; \\\n    DPRINTF((\"%.*sADD_ACTIVE_DATA(%d,%d,%d)\\n\", rlevel*2-2, SP, (x), (y), (z))); \\\n    } \\\n  else return PCRE_ERROR_DFA_WSSIZE\n\n#define ADD_NEW(x,y) \\\n  if (new_count++ < wscount) \\\n    { \\\n    next_new_state->offset = (x); \\\n    next_new_state->count  = (y); \\\n    next_new_state++; \\\n    DPRINTF((\"%.*sADD_NEW(%d,%d)\\n\", rlevel*2-2, SP, (x), (y))); \\\n    } \\\n  else return PCRE_ERROR_DFA_WSSIZE\n\n#define ADD_NEW_DATA(x,y,z) \\\n  if (new_count++ < wscount) \\\n    { \\\n    next_new_state->offset = (x); \\\n    next_new_state->count  = (y); \\\n    next_new_state->data   = (z); \\\n    next_new_state++; \\\n    DPRINTF((\"%.*sADD_NEW_DATA(%d,%d,%d) line %d\\n\", rlevel*2-2, SP, \\\n      (x), (y), (z), __LINE__)); \\\n    } \\\n  else return PCRE_ERROR_DFA_WSSIZE\n\n/* And now, here is the code */\n\nstatic int\ninternal_dfa_exec(\n  dfa_match_data *md,\n  const pcre_uchar *this_start_code,\n  const pcre_uchar *current_subject,\n  int start_offset,\n  int *offsets,\n  int offsetcount,\n  int *workspace,\n  int wscount,\n  int  rlevel)\n{\nstateblock *active_states, *new_states, *temp_states;\nstateblock *next_active_state, *next_new_state;\n\nconst pcre_uint8 *ctypes, *lcc, *fcc;\nconst pcre_uchar *ptr;\nconst pcre_uchar *end_code, *first_op;\n\ndfa_recursion_info new_recursive;\n\nint active_count, new_count, match_count;\n\n/* Some fields in the md block are frequently referenced, so we load them into\nindependent variables in the hope that this will perform better. */\n\nconst pcre_uchar *start_subject = md->start_subject;\nconst pcre_uchar *end_subject = md->end_subject;\nconst pcre_uchar *start_code = md->start_code;\n\n#ifdef SUPPORT_UTF\nBOOL utf = (md->poptions & PCRE_UTF8) != 0;\n#else\nBOOL utf = FALSE;\n#endif\n\nBOOL reset_could_continue = FALSE;\n\nrlevel++;\noffsetcount &= (-2);\n\nwscount -= 2;\nwscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) /\n          (2 * INTS_PER_STATEBLOCK);\n\nDPRINTF((\"\\n%.*s---------------------\\n\"\n  \"%.*sCall to internal_dfa_exec f=%d\\n\",\n  rlevel*2-2, SP, rlevel*2-2, SP, rlevel));\n\nctypes = md->tables + ctypes_offset;\nlcc = md->tables + lcc_offset;\nfcc = md->tables + fcc_offset;\n\nmatch_count = PCRE_ERROR_NOMATCH;   /* A negative number */\n\nactive_states = (stateblock *)(workspace + 2);\nnext_new_state = new_states = active_states + wscount;\nnew_count = 0;\n\nfirst_op = this_start_code + 1 + LINK_SIZE +\n  ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA ||\n    *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS)\n    ? IMM2_SIZE:0);\n\n/* The first thing in any (sub) pattern is a bracket of some sort. Push all\nthe alternative states onto the list, and find out where the end is. This\nmakes is possible to use this function recursively, when we want to stop at a\nmatching internal ket rather than at the end.\n\nIf the first opcode in the first alternative is OP_REVERSE, we are dealing with\na backward assertion. In that case, we have to find out the maximum amount to\nmove back, and set up each alternative appropriately. */\n\nif (*first_op == OP_REVERSE)\n  {\n  int max_back = 0;\n  int gone_back;\n\n  end_code = this_start_code;\n  do\n    {\n    int back = GET(end_code, 2+LINK_SIZE);\n    if (back > max_back) max_back = back;\n    end_code += GET(end_code, 1);\n    }\n  while (*end_code == OP_ALT);\n\n  /* If we can't go back the amount required for the longest lookbehind\n  pattern, go back as far as we can; some alternatives may still be viable. */\n\n#ifdef SUPPORT_UTF\n  /* In character mode we have to step back character by character */\n\n  if (utf)\n    {\n    for (gone_back = 0; gone_back < max_back; gone_back++)\n      {\n      if (current_subject <= start_subject) break;\n      current_subject--;\n      ACROSSCHAR(current_subject > start_subject, *current_subject, current_subject--);\n      }\n    }\n  else\n#endif\n\n  /* In byte-mode we can do this quickly. */\n\n    {\n    gone_back = (current_subject - max_back < start_subject)?\n      (int)(current_subject - start_subject) : max_back;\n    current_subject -= gone_back;\n    }\n\n  /* Save the earliest consulted character */\n\n  if (current_subject < md->start_used_ptr)\n    md->start_used_ptr = current_subject;\n\n  /* Now we can process the individual branches. */\n\n  end_code = this_start_code;\n  do\n    {\n    int back = GET(end_code, 2+LINK_SIZE);\n    if (back <= gone_back)\n      {\n      int bstate = (int)(end_code - start_code + 2 + 2*LINK_SIZE);\n      ADD_NEW_DATA(-bstate, 0, gone_back - back);\n      }\n    end_code += GET(end_code, 1);\n    }\n  while (*end_code == OP_ALT);\n }\n\n/* This is the code for a \"normal\" subpattern (not a backward assertion). The\nstart of a whole pattern is always one of these. If we are at the top level,\nwe may be asked to restart matching from the same point that we reached for a\nprevious partial match. We still have to scan through the top-level branches to\nfind the end state. */\n\nelse\n  {\n  end_code = this_start_code;\n\n  /* Restarting */\n\n  if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0)\n    {\n    do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT);\n    new_count = workspace[1];\n    if (!workspace[0])\n      memcpy(new_states, active_states, new_count * sizeof(stateblock));\n    }\n\n  /* Not restarting */\n\n  else\n    {\n    int length = 1 + LINK_SIZE +\n      ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA ||\n        *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS)\n        ? IMM2_SIZE:0);\n    do\n      {\n      ADD_NEW((int)(end_code - start_code + length), 0);\n      end_code += GET(end_code, 1);\n      length = 1 + LINK_SIZE;\n      }\n    while (*end_code == OP_ALT);\n    }\n  }\n\nworkspace[0] = 0;    /* Bit indicating which vector is current */\n\nDPRINTF((\"%.*sEnd state = %d\\n\", rlevel*2-2, SP, (int)(end_code - start_code)));\n\n/* Loop for scanning the subject */\n\nptr = current_subject;\nfor (;;)\n  {\n  int i, j;\n  int clen, dlen;\n  pcre_uint32 c, d;\n  int forced_fail = 0;\n  BOOL partial_newline = FALSE;\n  BOOL could_continue = reset_could_continue;\n  reset_could_continue = FALSE;\n\n  /* Make the new state list into the active state list and empty the\n  new state list. */\n\n  temp_states = active_states;\n  active_states = new_states;\n  new_states = temp_states;\n  active_count = new_count;\n  new_count = 0;\n\n  workspace[0] ^= 1;              /* Remember for the restarting feature */\n  workspace[1] = active_count;\n\n#ifdef PCRE_DEBUG\n  printf(\"%.*sNext character: rest of subject = \\\"\", rlevel*2-2, SP);\n  pchars(ptr, STRLEN_UC(ptr), stdout);\n  printf(\"\\\"\\n\");\n\n  printf(\"%.*sActive states: \", rlevel*2-2, SP);\n  for (i = 0; i < active_count; i++)\n    printf(\"%d/%d \", active_states[i].offset, active_states[i].count);\n  printf(\"\\n\");\n#endif\n\n  /* Set the pointers for adding new states */\n\n  next_active_state = active_states + active_count;\n  next_new_state = new_states;\n\n  /* Load the current character from the subject outside the loop, as many\n  different states may want to look at it, and we assume that at least one\n  will. */\n\n  if (ptr < end_subject)\n    {\n    clen = 1;        /* Number of data items in the character */\n#ifdef SUPPORT_UTF\n    GETCHARLENTEST(c, ptr, clen);\n#else\n    c = *ptr;\n#endif  /* SUPPORT_UTF */\n    }\n  else\n    {\n    clen = 0;        /* This indicates the end of the subject */\n    c = NOTACHAR;    /* This value should never actually be used */\n    }\n\n  /* Scan up the active states and act on each one. The result of an action\n  may be to add more states to the currently active list (e.g. on hitting a\n  parenthesis) or it may be to put states on the new list, for considering\n  when we move the character pointer on. */\n\n  for (i = 0; i < active_count; i++)\n    {\n    stateblock *current_state = active_states + i;\n    BOOL caseless = FALSE;\n    const pcre_uchar *code;\n    int state_offset = current_state->offset;\n    int codevalue, rrc;\n    int count;\n\n#ifdef PCRE_DEBUG\n    printf (\"%.*sProcessing state %d c=\", rlevel*2-2, SP, state_offset);\n    if (clen == 0) printf(\"EOL\\n\");\n      else if (c > 32 && c < 127) printf(\"'%c'\\n\", c);\n        else printf(\"0x%02x\\n\", c);\n#endif\n\n    /* A negative offset is a special case meaning \"hold off going to this\n    (negated) state until the number of characters in the data field have\n    been skipped\". If the could_continue flag was passed over from a previous\n    state, arrange for it to passed on. */\n\n    if (state_offset < 0)\n      {\n      if (current_state->data > 0)\n        {\n        DPRINTF((\"%.*sSkipping this character\\n\", rlevel*2-2, SP));\n        ADD_NEW_DATA(state_offset, current_state->count,\n          current_state->data - 1);\n        if (could_continue) reset_could_continue = TRUE;\n        continue;\n        }\n      else\n        {\n        current_state->offset = state_offset = -state_offset;\n        }\n      }\n\n    /* Check for a duplicate state with the same count, and skip if found.\n    See the note at the head of this module about the possibility of improving\n    performance here. */\n\n    for (j = 0; j < i; j++)\n      {\n      if (active_states[j].offset == state_offset &&\n          active_states[j].count == current_state->count)\n        {\n        DPRINTF((\"%.*sDuplicate state: skipped\\n\", rlevel*2-2, SP));\n        goto NEXT_ACTIVE_STATE;\n        }\n      }\n\n    /* The state offset is the offset to the opcode */\n\n    code = start_code + state_offset;\n    codevalue = *code;\n\n    /* If this opcode inspects a character, but we are at the end of the\n    subject, remember the fact for use when testing for a partial match. */\n\n    if (clen == 0 && poptable[codevalue] != 0)\n      could_continue = TRUE;\n\n    /* If this opcode is followed by an inline character, load it. It is\n    tempting to test for the presence of a subject character here, but that\n    is wrong, because sometimes zero repetitions of the subject are\n    permitted.\n\n    We also use this mechanism for opcodes such as OP_TYPEPLUS that take an\n    argument that is not a data character - but is always one byte long because\n    the values are small. We have to take special action to deal with  \\P, \\p,\n    \\H, \\h, \\V, \\v and \\X in this case. To keep the other cases fast, convert\n    these ones to new opcodes. */\n\n    if (coptable[codevalue] > 0)\n      {\n      dlen = 1;\n#ifdef SUPPORT_UTF\n      if (utf) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else\n#endif  /* SUPPORT_UTF */\n      d = code[coptable[codevalue]];\n      if (codevalue >= OP_TYPESTAR)\n        {\n        switch(d)\n          {\n          case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM;\n          case OP_NOTPROP:\n          case OP_PROP: codevalue += OP_PROP_EXTRA; break;\n          case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break;\n          case OP_EXTUNI: codevalue += OP_EXTUNI_EXTRA; break;\n          case OP_NOT_HSPACE:\n          case OP_HSPACE: codevalue += OP_HSPACE_EXTRA; break;\n          case OP_NOT_VSPACE:\n          case OP_VSPACE: codevalue += OP_VSPACE_EXTRA; break;\n          default: break;\n          }\n        }\n      }\n    else\n      {\n      dlen = 0;         /* Not strictly necessary, but compilers moan */\n      d = NOTACHAR;     /* if these variables are not set. */\n      }\n\n\n    /* Now process the individual opcodes */\n\n    switch (codevalue)\n      {\n/* ========================================================================== */\n      /* These cases are never obeyed. This is a fudge that causes a compile-\n      time error if the vectors coptable or poptable, which are indexed by\n      opcode, are not the correct length. It seems to be the only way to do\n      such a check at compile time, as the sizeof() operator does not work\n      in the C preprocessor. */\n\n      case OP_TABLE_LENGTH:\n      case OP_TABLE_LENGTH +\n        ((sizeof(coptable) == OP_TABLE_LENGTH) &&\n         (sizeof(poptable) == OP_TABLE_LENGTH)):\n      break;\n\n/* ========================================================================== */\n      /* Reached a closing bracket. If not at the end of the pattern, carry\n      on with the next opcode. For repeating opcodes, also add the repeat\n      state. Note that KETRPOS will always be encountered at the end of the\n      subpattern, because the possessive subpattern repeats are always handled\n      using recursive calls. Thus, it never adds any new states.\n\n      At the end of the (sub)pattern, unless we have an empty string and\n      PCRE_NOTEMPTY is set, or PCRE_NOTEMPTY_ATSTART is set and we are at the\n      start of the subject, save the match data, shifting up all previous\n      matches so we always have the longest first. */\n\n      case OP_KET:\n      case OP_KETRMIN:\n      case OP_KETRMAX:\n      case OP_KETRPOS:\n      if (code != end_code)\n        {\n        ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0);\n        if (codevalue != OP_KET)\n          {\n          ADD_ACTIVE(state_offset - GET(code, 1), 0);\n          }\n        }\n      else\n        {\n        if (ptr > current_subject ||\n            ((md->moptions & PCRE_NOTEMPTY) == 0 &&\n              ((md->moptions & PCRE_NOTEMPTY_ATSTART) == 0 ||\n                current_subject > start_subject + md->start_offset)))\n          {\n          if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0;\n            else if (match_count > 0 && ++match_count * 2 > offsetcount)\n              match_count = 0;\n          count = ((match_count == 0)? offsetcount : match_count * 2) - 2;\n          if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int));\n          if (offsetcount >= 2)\n            {\n            offsets[0] = (int)(current_subject - start_subject);\n            offsets[1] = (int)(ptr - start_subject);\n            DPRINTF((\"%.*sSet matched string = \\\"%.*s\\\"\\n\", rlevel*2-2, SP,\n              offsets[1] - offsets[0], (char *)current_subject));\n            }\n          if ((md->moptions & PCRE_DFA_SHORTEST) != 0)\n            {\n            DPRINTF((\"%.*sEnd of internal_dfa_exec %d: returning %d\\n\"\n              \"%.*s---------------------\\n\\n\", rlevel*2-2, SP, rlevel,\n              match_count, rlevel*2-2, SP));\n            return match_count;\n            }\n          }\n        }\n      break;\n\n/* ========================================================================== */\n      /* These opcodes add to the current list of states without looking\n      at the current character. */\n\n      /*-----------------------------------------------------------------*/\n      case OP_ALT:\n      do { code += GET(code, 1); } while (*code == OP_ALT);\n      ADD_ACTIVE((int)(code - start_code), 0);\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_BRA:\n      case OP_SBRA:\n      do\n        {\n        ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);\n        code += GET(code, 1);\n        }\n      while (*code == OP_ALT);\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_CBRA:\n      case OP_SCBRA:\n      ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE + IMM2_SIZE),  0);\n      code += GET(code, 1);\n      while (*code == OP_ALT)\n        {\n        ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE),  0);\n        code += GET(code, 1);\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_BRAZERO:\n      case OP_BRAMINZERO:\n      ADD_ACTIVE(state_offset + 1, 0);\n      code += 1 + GET(code, 2);\n      while (*code == OP_ALT) code += GET(code, 1);\n      ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_SKIPZERO:\n      code += 1 + GET(code, 2);\n      while (*code == OP_ALT) code += GET(code, 1);\n      ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_CIRC:\n      if (ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0)\n        { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_CIRCM:\n      if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) ||\n          (ptr != end_subject && WAS_NEWLINE(ptr)))\n        { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EOD:\n      if (ptr >= end_subject)\n        {\n        if ((md->moptions & PCRE_PARTIAL_HARD) != 0)\n          could_continue = TRUE;\n        else { ADD_ACTIVE(state_offset + 1, 0); }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_SOD:\n      if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_SOM:\n      if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n\n/* ========================================================================== */\n      /* These opcodes inspect the next subject character, and sometimes\n      the previous one as well, but do not have an argument. The variable\n      clen contains the length of the current character and is zero if we are\n      at the end of the subject. */\n\n      /*-----------------------------------------------------------------*/\n      case OP_ANY:\n      if (clen > 0 && !IS_NEWLINE(ptr))\n        {\n        if (ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else\n          {\n          ADD_NEW(state_offset + 1, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_ALLANY:\n      if (clen > 0)\n        { ADD_NEW(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EODN:\n      if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)\n        could_continue = TRUE;\n      else if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen))\n        { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_DOLL:\n      if ((md->moptions & PCRE_NOTEOL) == 0)\n        {\n        if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)\n          could_continue = TRUE;\n        else if (clen == 0 ||\n            ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr) &&\n               (ptr == end_subject - md->nllen)\n            ))\n          { ADD_ACTIVE(state_offset + 1, 0); }\n        else if (ptr + 1 >= md->end_subject &&\n                 (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 &&\n                 NLBLOCK->nltype == NLTYPE_FIXED &&\n                 NLBLOCK->nllen == 2 &&\n                 c == NLBLOCK->nl[0])\n          {\n          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)\n            {\n            reset_could_continue = TRUE;\n            ADD_NEW_DATA(-(state_offset + 1), 0, 1);\n            }\n          else could_continue = partial_newline = TRUE;\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_DOLLM:\n      if ((md->moptions & PCRE_NOTEOL) == 0)\n        {\n        if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0)\n          could_continue = TRUE;\n        else if (clen == 0 ||\n            ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr)))\n          { ADD_ACTIVE(state_offset + 1, 0); }\n        else if (ptr + 1 >= md->end_subject &&\n                 (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 &&\n                 NLBLOCK->nltype == NLTYPE_FIXED &&\n                 NLBLOCK->nllen == 2 &&\n                 c == NLBLOCK->nl[0])\n          {\n          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)\n            {\n            reset_could_continue = TRUE;\n            ADD_NEW_DATA(-(state_offset + 1), 0, 1);\n            }\n          else could_continue = partial_newline = TRUE;\n          }\n        }\n      else if (IS_NEWLINE(ptr))\n        { ADD_ACTIVE(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n\n      case OP_DIGIT:\n      case OP_WHITESPACE:\n      case OP_WORDCHAR:\n      if (clen > 0 && c < 256 &&\n            ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)\n        { ADD_NEW(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_NOT_DIGIT:\n      case OP_NOT_WHITESPACE:\n      case OP_NOT_WORDCHAR:\n      if (clen > 0 && (c >= 256 ||\n            ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0))\n        { ADD_NEW(state_offset + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_WORD_BOUNDARY:\n      case OP_NOT_WORD_BOUNDARY:\n        {\n        int left_word, right_word;\n\n        if (ptr > start_subject)\n          {\n          const pcre_uchar *temp = ptr - 1;\n          if (temp < md->start_used_ptr) md->start_used_ptr = temp;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n          if (utf) { BACKCHAR(temp); }\n#endif\n          GETCHARTEST(d, temp);\n#ifdef SUPPORT_UCP\n          if ((md->poptions & PCRE_UCP) != 0)\n            {\n            if (d == '_') left_word = TRUE; else\n              {\n              int cat = UCD_CATEGORY(d);\n              left_word = (cat == ucp_L || cat == ucp_N);\n              }\n            }\n          else\n#endif\n          left_word = d < 256 && (ctypes[d] & ctype_word) != 0;\n          }\n        else left_word = FALSE;\n\n        if (clen > 0)\n          {\n#ifdef SUPPORT_UCP\n          if ((md->poptions & PCRE_UCP) != 0)\n            {\n            if (c == '_') right_word = TRUE; else\n              {\n              int cat = UCD_CATEGORY(c);\n              right_word = (cat == ucp_L || cat == ucp_N);\n              }\n            }\n          else\n#endif\n          right_word = c < 256 && (ctypes[c] & ctype_word) != 0;\n          }\n        else right_word = FALSE;\n\n        if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY))\n          { ADD_ACTIVE(state_offset + 1, 0); }\n        }\n      break;\n\n\n      /*-----------------------------------------------------------------*/\n      /* Check the next character by Unicode property. We will get here only\n      if the support is in the binary; otherwise a compile-time error occurs.\n      */\n\n#ifdef SUPPORT_UCP\n      case OP_PROP:\n      case OP_NOTPROP:\n      if (clen > 0)\n        {\n        BOOL OK;\n        const pcre_uint32 *cp;\n        const ucd_record * prop = GET_UCD(c);\n        switch(code[1])\n          {\n          case PT_ANY:\n          OK = TRUE;\n          break;\n\n          case PT_LAMP:\n          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||\n               prop->chartype == ucp_Lt;\n          break;\n\n          case PT_GC:\n          OK = PRIV(ucp_gentype)[prop->chartype] == code[2];\n          break;\n\n          case PT_PC:\n          OK = prop->chartype == code[2];\n          break;\n\n          case PT_SC:\n          OK = prop->script == code[2];\n          break;\n\n          /* These are specials for combination cases. */\n\n          case PT_ALNUM:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N;\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          switch(c)\n            {\n            HSPACE_CASES:\n            VSPACE_CASES:\n            OK = TRUE;\n            break;\n\n            default:\n            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;\n            break;\n            }\n          break;\n\n          case PT_WORD:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n               c == CHAR_UNDERSCORE;\n          break;\n\n          case PT_CLIST:\n          cp = PRIV(ucd_caseless_sets) + code[2];\n          for (;;)\n            {\n            if (c < *cp) { OK = FALSE; break; }\n            if (c == *cp++) { OK = TRUE; break; }\n            }\n          break;\n\n          case PT_UCNC:\n          OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n               c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n               c >= 0xe000;\n          break;\n\n          /* Should never occur, but keep compilers from grumbling. */\n\n          default:\n          OK = codevalue != OP_PROP;\n          break;\n          }\n\n        if (OK == (codevalue == OP_PROP)) { ADD_NEW(state_offset + 3, 0); }\n        }\n      break;\n#endif\n\n\n\n/* ========================================================================== */\n      /* These opcodes likewise inspect the subject character, but have an\n      argument that is not a data character. It is one of these opcodes:\n      OP_ANY, OP_ALLANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE,\n      OP_WORDCHAR, OP_NOT_WORDCHAR. The value is loaded into d. */\n\n      case OP_TYPEPLUS:\n      case OP_TYPEMINPLUS:\n      case OP_TYPEPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }\n      if (clen > 0)\n        {\n        if (d == OP_ANY && ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||\n            (c < 256 &&\n              (d != OP_ANY || !IS_NEWLINE(ptr)) &&\n              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))\n          {\n          if (count > 0 && codevalue == OP_TYPEPOSPLUS)\n            {\n            active_count--;            /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW(state_offset, count);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_TYPEQUERY:\n      case OP_TYPEMINQUERY:\n      case OP_TYPEPOSQUERY:\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        if (d == OP_ANY && ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||\n            (c < 256 &&\n              (d != OP_ANY || !IS_NEWLINE(ptr)) &&\n              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))\n          {\n          if (codevalue == OP_TYPEPOSQUERY)\n            {\n            active_count--;            /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW(state_offset + 2, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_TYPESTAR:\n      case OP_TYPEMINSTAR:\n      case OP_TYPEPOSSTAR:\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        if (d == OP_ANY && ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||\n            (c < 256 &&\n              (d != OP_ANY || !IS_NEWLINE(ptr)) &&\n              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))\n          {\n          if (codevalue == OP_TYPEPOSSTAR)\n            {\n            active_count--;            /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW(state_offset, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_TYPEEXACT:\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        if (d == OP_ANY && ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||\n            (c < 256 &&\n              (d != OP_ANY || !IS_NEWLINE(ptr)) &&\n              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))\n          {\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW(state_offset + 1 + IMM2_SIZE + 1, 0); }\n          else\n            { ADD_NEW(state_offset, count); }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_TYPEUPTO:\n      case OP_TYPEMINUPTO:\n      case OP_TYPEPOSUPTO:\n      ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0);\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        if (d == OP_ANY && ptr + 1 >= md->end_subject &&\n            (md->moptions & (PCRE_PARTIAL_HARD)) != 0 &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            c == NLBLOCK->nl[0])\n          {\n          could_continue = partial_newline = TRUE;\n          }\n        else if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||\n            (c < 256 &&\n              (d != OP_ANY || !IS_NEWLINE(ptr)) &&\n              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))\n          {\n          if (codevalue == OP_TYPEPOSUPTO)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW(state_offset + 2 + IMM2_SIZE, 0); }\n          else\n            { ADD_NEW(state_offset, count); }\n          }\n        }\n      break;\n\n/* ========================================================================== */\n      /* These are virtual opcodes that are used when something like\n      OP_TYPEPLUS has OP_PROP, OP_NOTPROP, OP_ANYNL, or OP_EXTUNI as its\n      argument. It keeps the code above fast for the other cases. The argument\n      is in the d variable. */\n\n#ifdef SUPPORT_UCP\n      case OP_PROP_EXTRA + OP_TYPEPLUS:\n      case OP_PROP_EXTRA + OP_TYPEMINPLUS:\n      case OP_PROP_EXTRA + OP_TYPEPOSPLUS:\n      count = current_state->count;           /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 4, 0); }\n      if (clen > 0)\n        {\n        BOOL OK;\n        const pcre_uint32 *cp;\n        const ucd_record * prop = GET_UCD(c);\n        switch(code[2])\n          {\n          case PT_ANY:\n          OK = TRUE;\n          break;\n\n          case PT_LAMP:\n          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||\n            prop->chartype == ucp_Lt;\n          break;\n\n          case PT_GC:\n          OK = PRIV(ucp_gentype)[prop->chartype] == code[3];\n          break;\n\n          case PT_PC:\n          OK = prop->chartype == code[3];\n          break;\n\n          case PT_SC:\n          OK = prop->script == code[3];\n          break;\n\n          /* These are specials for combination cases. */\n\n          case PT_ALNUM:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N;\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          switch(c)\n            {\n            HSPACE_CASES:\n            VSPACE_CASES:\n            OK = TRUE;\n            break;\n\n            default:\n            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;\n            break;\n            }\n          break;\n\n          case PT_WORD:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n               c == CHAR_UNDERSCORE;\n          break;\n\n          case PT_CLIST:\n          cp = PRIV(ucd_caseless_sets) + code[3];\n          for (;;)\n            {\n            if (c < *cp) { OK = FALSE; break; }\n            if (c == *cp++) { OK = TRUE; break; }\n            }\n          break;\n\n          case PT_UCNC:\n          OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n               c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n               c >= 0xe000;\n          break;\n\n          /* Should never occur, but keep compilers from grumbling. */\n\n          default:\n          OK = codevalue != OP_PROP;\n          break;\n          }\n\n        if (OK == (d == OP_PROP))\n          {\n          if (count > 0 && codevalue == OP_PROP_EXTRA + OP_TYPEPOSPLUS)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW(state_offset, count);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EXTUNI_EXTRA + OP_TYPEPLUS:\n      case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS:\n      case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }\n      if (clen > 0)\n        {\n        int lgb, rgb;\n        const pcre_uchar *nptr = ptr + clen;\n        int ncount = 0;\n        if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS)\n          {\n          active_count--;           /* Remove non-match possibility */\n          next_active_state--;\n          }\n        lgb = UCD_GRAPHBREAK(c);\n        while (nptr < end_subject)\n          {\n          dlen = 1;\n          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }\n          rgb = UCD_GRAPHBREAK(d);\n          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n          ncount++;\n          lgb = rgb;\n          nptr += dlen;\n          }\n        count++;\n        ADD_NEW_DATA(-state_offset, count, ncount);\n        }\n      break;\n#endif\n\n      /*-----------------------------------------------------------------*/\n      case OP_ANYNL_EXTRA + OP_TYPEPLUS:\n      case OP_ANYNL_EXTRA + OP_TYPEMINPLUS:\n      case OP_ANYNL_EXTRA + OP_TYPEPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }\n      if (clen > 0)\n        {\n        int ncount = 0;\n        switch (c)\n          {\n          case CHAR_VT:\n          case CHAR_FF:\n          case CHAR_NEL:\n#ifndef EBCDIC\n          case 0x2028:\n          case 0x2029:\n#endif  /* Not EBCDIC */\n          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;\n          goto ANYNL01;\n\n          case CHAR_CR:\n          if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1;\n          /* Fall through */\n\n          ANYNL01:\n          case CHAR_LF:\n          if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW_DATA(-state_offset, count, ncount);\n          break;\n\n          default:\n          break;\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_VSPACE_EXTRA + OP_TYPEPLUS:\n      case OP_VSPACE_EXTRA + OP_TYPEMINPLUS:\n      case OP_VSPACE_EXTRA + OP_TYPEPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          VSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          break;\n          }\n\n        if (OK == (d == OP_VSPACE))\n          {\n          if (count > 0 && codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSPLUS)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW_DATA(-state_offset, count, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_HSPACE_EXTRA + OP_TYPEPLUS:\n      case OP_HSPACE_EXTRA + OP_TYPEMINPLUS:\n      case OP_HSPACE_EXTRA + OP_TYPEPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          HSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          break;\n          }\n\n        if (OK == (d == OP_HSPACE))\n          {\n          if (count > 0 && codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSPLUS)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW_DATA(-state_offset, count, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n#ifdef SUPPORT_UCP\n      case OP_PROP_EXTRA + OP_TYPEQUERY:\n      case OP_PROP_EXTRA + OP_TYPEMINQUERY:\n      case OP_PROP_EXTRA + OP_TYPEPOSQUERY:\n      count = 4;\n      goto QS1;\n\n      case OP_PROP_EXTRA + OP_TYPESTAR:\n      case OP_PROP_EXTRA + OP_TYPEMINSTAR:\n      case OP_PROP_EXTRA + OP_TYPEPOSSTAR:\n      count = 0;\n\n      QS1:\n\n      ADD_ACTIVE(state_offset + 4, 0);\n      if (clen > 0)\n        {\n        BOOL OK;\n        const pcre_uint32 *cp;\n        const ucd_record * prop = GET_UCD(c);\n        switch(code[2])\n          {\n          case PT_ANY:\n          OK = TRUE;\n          break;\n\n          case PT_LAMP:\n          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||\n            prop->chartype == ucp_Lt;\n          break;\n\n          case PT_GC:\n          OK = PRIV(ucp_gentype)[prop->chartype] == code[3];\n          break;\n\n          case PT_PC:\n          OK = prop->chartype == code[3];\n          break;\n\n          case PT_SC:\n          OK = prop->script == code[3];\n          break;\n\n          /* These are specials for combination cases. */\n\n          case PT_ALNUM:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N;\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          switch(c)\n            {\n            HSPACE_CASES:\n            VSPACE_CASES:\n            OK = TRUE;\n            break;\n\n            default:\n            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;\n            break;\n            }\n          break;\n\n          case PT_WORD:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n               c == CHAR_UNDERSCORE;\n          break;\n\n          case PT_CLIST:\n          cp = PRIV(ucd_caseless_sets) + code[3];\n          for (;;)\n            {\n            if (c < *cp) { OK = FALSE; break; }\n            if (c == *cp++) { OK = TRUE; break; }\n            }\n          break;\n\n          case PT_UCNC:\n          OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n               c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n               c >= 0xe000;\n          break;\n\n          /* Should never occur, but keep compilers from grumbling. */\n\n          default:\n          OK = codevalue != OP_PROP;\n          break;\n          }\n\n        if (OK == (d == OP_PROP))\n          {\n          if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSSTAR ||\n              codevalue == OP_PROP_EXTRA + OP_TYPEPOSQUERY)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW(state_offset + count, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EXTUNI_EXTRA + OP_TYPEQUERY:\n      case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY:\n      case OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY:\n      count = 2;\n      goto QS2;\n\n      case OP_EXTUNI_EXTRA + OP_TYPESTAR:\n      case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR:\n      case OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR:\n      count = 0;\n\n      QS2:\n\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        int lgb, rgb;\n        const pcre_uchar *nptr = ptr + clen;\n        int ncount = 0;\n        if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR ||\n            codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY)\n          {\n          active_count--;           /* Remove non-match possibility */\n          next_active_state--;\n          }\n        lgb = UCD_GRAPHBREAK(c);\n        while (nptr < end_subject)\n          {\n          dlen = 1;\n          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }\n          rgb = UCD_GRAPHBREAK(d);\n          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n          ncount++;\n          lgb = rgb;\n          nptr += dlen;\n          }\n        ADD_NEW_DATA(-(state_offset + count), 0, ncount);\n        }\n      break;\n#endif\n\n      /*-----------------------------------------------------------------*/\n      case OP_ANYNL_EXTRA + OP_TYPEQUERY:\n      case OP_ANYNL_EXTRA + OP_TYPEMINQUERY:\n      case OP_ANYNL_EXTRA + OP_TYPEPOSQUERY:\n      count = 2;\n      goto QS3;\n\n      case OP_ANYNL_EXTRA + OP_TYPESTAR:\n      case OP_ANYNL_EXTRA + OP_TYPEMINSTAR:\n      case OP_ANYNL_EXTRA + OP_TYPEPOSSTAR:\n      count = 0;\n\n      QS3:\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        int ncount = 0;\n        switch (c)\n          {\n          case CHAR_VT:\n          case CHAR_FF:\n          case CHAR_NEL:\n#ifndef EBCDIC\n          case 0x2028:\n          case 0x2029:\n#endif  /* Not EBCDIC */\n          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;\n          goto ANYNL02;\n\n          case CHAR_CR:\n          if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1;\n          /* Fall through */\n\n          ANYNL02:\n          case CHAR_LF:\n          if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR ||\n              codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW_DATA(-(state_offset + (int)count), 0, ncount);\n          break;\n\n          default:\n          break;\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_VSPACE_EXTRA + OP_TYPEQUERY:\n      case OP_VSPACE_EXTRA + OP_TYPEMINQUERY:\n      case OP_VSPACE_EXTRA + OP_TYPEPOSQUERY:\n      count = 2;\n      goto QS4;\n\n      case OP_VSPACE_EXTRA + OP_TYPESTAR:\n      case OP_VSPACE_EXTRA + OP_TYPEMINSTAR:\n      case OP_VSPACE_EXTRA + OP_TYPEPOSSTAR:\n      count = 0;\n\n      QS4:\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          VSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          break;\n          }\n        if (OK == (d == OP_VSPACE))\n          {\n          if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSSTAR ||\n              codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSQUERY)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_HSPACE_EXTRA + OP_TYPEQUERY:\n      case OP_HSPACE_EXTRA + OP_TYPEMINQUERY:\n      case OP_HSPACE_EXTRA + OP_TYPEPOSQUERY:\n      count = 2;\n      goto QS5;\n\n      case OP_HSPACE_EXTRA + OP_TYPESTAR:\n      case OP_HSPACE_EXTRA + OP_TYPEMINSTAR:\n      case OP_HSPACE_EXTRA + OP_TYPEPOSSTAR:\n      count = 0;\n\n      QS5:\n      ADD_ACTIVE(state_offset + 2, 0);\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          HSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          break;\n          }\n\n        if (OK == (d == OP_HSPACE))\n          {\n          if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSSTAR ||\n              codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSQUERY)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW_DATA(-(state_offset + (int)count), 0, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n#ifdef SUPPORT_UCP\n      case OP_PROP_EXTRA + OP_TYPEEXACT:\n      case OP_PROP_EXTRA + OP_TYPEUPTO:\n      case OP_PROP_EXTRA + OP_TYPEMINUPTO:\n      case OP_PROP_EXTRA + OP_TYPEPOSUPTO:\n      if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT)\n        { ADD_ACTIVE(state_offset + 1 + IMM2_SIZE + 3, 0); }\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        BOOL OK;\n        const pcre_uint32 *cp;\n        const ucd_record * prop = GET_UCD(c);\n        switch(code[1 + IMM2_SIZE + 1])\n          {\n          case PT_ANY:\n          OK = TRUE;\n          break;\n\n          case PT_LAMP:\n          OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||\n            prop->chartype == ucp_Lt;\n          break;\n\n          case PT_GC:\n          OK = PRIV(ucp_gentype)[prop->chartype] == code[1 + IMM2_SIZE + 2];\n          break;\n\n          case PT_PC:\n          OK = prop->chartype == code[1 + IMM2_SIZE + 2];\n          break;\n\n          case PT_SC:\n          OK = prop->script == code[1 + IMM2_SIZE + 2];\n          break;\n\n          /* These are specials for combination cases. */\n\n          case PT_ALNUM:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N;\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          switch(c)\n            {\n            HSPACE_CASES:\n            VSPACE_CASES:\n            OK = TRUE;\n            break;\n\n            default:\n            OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z;\n            break;\n            }\n          break;\n\n          case PT_WORD:\n          OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n               PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n               c == CHAR_UNDERSCORE;\n          break;\n\n          case PT_CLIST:\n          cp = PRIV(ucd_caseless_sets) + code[1 + IMM2_SIZE + 2];\n          for (;;)\n            {\n            if (c < *cp) { OK = FALSE; break; }\n            if (c == *cp++) { OK = TRUE; break; }\n            }\n          break;\n\n          case PT_UCNC:\n          OK = c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n               c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n               c >= 0xe000;\n          break;\n\n          /* Should never occur, but keep compilers from grumbling. */\n\n          default:\n          OK = codevalue != OP_PROP;\n          break;\n          }\n\n        if (OK == (d == OP_PROP))\n          {\n          if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSUPTO)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW(state_offset + 1 + IMM2_SIZE + 3, 0); }\n          else\n            { ADD_NEW(state_offset, count); }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EXTUNI_EXTRA + OP_TYPEEXACT:\n      case OP_EXTUNI_EXTRA + OP_TYPEUPTO:\n      case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO:\n      case OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO:\n      if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT)\n        { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        int lgb, rgb;\n        const pcre_uchar *nptr = ptr + clen;\n        int ncount = 0;\n        if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO)\n          {\n          active_count--;           /* Remove non-match possibility */\n          next_active_state--;\n          }\n        lgb = UCD_GRAPHBREAK(c);\n        while (nptr < end_subject)\n          {\n          dlen = 1;\n          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }\n          rgb = UCD_GRAPHBREAK(d);\n          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n          ncount++;\n          lgb = rgb;\n          nptr += dlen;\n          }\n        if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)\n            reset_could_continue = TRUE;\n        if (++count >= (int)GET2(code, 1))\n          { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }\n        else\n          { ADD_NEW_DATA(-state_offset, count, ncount); }\n        }\n      break;\n#endif\n\n      /*-----------------------------------------------------------------*/\n      case OP_ANYNL_EXTRA + OP_TYPEEXACT:\n      case OP_ANYNL_EXTRA + OP_TYPEUPTO:\n      case OP_ANYNL_EXTRA + OP_TYPEMINUPTO:\n      case OP_ANYNL_EXTRA + OP_TYPEPOSUPTO:\n      if (codevalue != OP_ANYNL_EXTRA + OP_TYPEEXACT)\n        { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        int ncount = 0;\n        switch (c)\n          {\n          case CHAR_VT:\n          case CHAR_FF:\n          case CHAR_NEL:\n#ifndef EBCDIC\n          case 0x2028:\n          case 0x2029:\n#endif  /* Not EBCDIC */\n          if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;\n          goto ANYNL03;\n\n          case CHAR_CR:\n          if (ptr + 1 < end_subject && UCHAR21TEST(ptr + 1) == CHAR_LF) ncount = 1;\n          /* Fall through */\n\n          ANYNL03:\n          case CHAR_LF:\n          if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, ncount); }\n          else\n            { ADD_NEW_DATA(-state_offset, count, ncount); }\n          break;\n\n          default:\n          break;\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_VSPACE_EXTRA + OP_TYPEEXACT:\n      case OP_VSPACE_EXTRA + OP_TYPEUPTO:\n      case OP_VSPACE_EXTRA + OP_TYPEMINUPTO:\n      case OP_VSPACE_EXTRA + OP_TYPEPOSUPTO:\n      if (codevalue != OP_VSPACE_EXTRA + OP_TYPEEXACT)\n        { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          VSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          }\n\n        if (OK == (d == OP_VSPACE))\n          {\n          if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSUPTO)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }\n          else\n            { ADD_NEW_DATA(-state_offset, count, 0); }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_HSPACE_EXTRA + OP_TYPEEXACT:\n      case OP_HSPACE_EXTRA + OP_TYPEUPTO:\n      case OP_HSPACE_EXTRA + OP_TYPEMINUPTO:\n      case OP_HSPACE_EXTRA + OP_TYPEPOSUPTO:\n      if (codevalue != OP_HSPACE_EXTRA + OP_TYPEEXACT)\n        { ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); }\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        BOOL OK;\n        switch (c)\n          {\n          HSPACE_CASES:\n          OK = TRUE;\n          break;\n\n          default:\n          OK = FALSE;\n          break;\n          }\n\n        if (OK == (d == OP_HSPACE))\n          {\n          if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSUPTO)\n            {\n            active_count--;           /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 0, 0); }\n          else\n            { ADD_NEW_DATA(-state_offset, count, 0); }\n          }\n        }\n      break;\n\n/* ========================================================================== */\n      /* These opcodes are followed by a character that is usually compared\n      to the current subject character; it is loaded into d. We still get\n      here even if there is no subject character, because in some cases zero\n      repetitions are permitted. */\n\n      /*-----------------------------------------------------------------*/\n      case OP_CHAR:\n      if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_CHARI:\n      if (clen == 0) break;\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else\n          {\n          unsigned int othercase;\n          if (c < 128)\n            othercase = fcc[c];\n          else\n            /* If we have Unicode property support, we can use it to test the\n            other case of the character. */\n#ifdef SUPPORT_UCP\n            othercase = UCD_OTHERCASE(c);\n#else\n            othercase = NOTACHAR;\n#endif\n\n          if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); }\n          }\n        }\n      else\n#endif  /* SUPPORT_UTF */\n      /* Not UTF mode */\n        {\n        if (TABLE_GET(c, lcc, c) == TABLE_GET(d, lcc, d))\n          { ADD_NEW(state_offset + 2, 0); }\n        }\n      break;\n\n\n#ifdef SUPPORT_UCP\n      /*-----------------------------------------------------------------*/\n      /* This is a tricky one because it can match more than one character.\n      Find out how many characters to skip, and then set up a negative state\n      to wait for them to pass before continuing. */\n\n      case OP_EXTUNI:\n      if (clen > 0)\n        {\n        int lgb, rgb;\n        const pcre_uchar *nptr = ptr + clen;\n        int ncount = 0;\n        lgb = UCD_GRAPHBREAK(c);\n        while (nptr < end_subject)\n          {\n          dlen = 1;\n          if (!utf) d = *nptr; else { GETCHARLEN(d, nptr, dlen); }\n          rgb = UCD_GRAPHBREAK(d);\n          if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n          ncount++;\n          lgb = rgb;\n          nptr += dlen;\n          }\n        if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0)\n            reset_could_continue = TRUE;\n        ADD_NEW_DATA(-(state_offset + 1), 0, ncount);\n        }\n      break;\n#endif\n\n      /*-----------------------------------------------------------------*/\n      /* This is a tricky like EXTUNI because it too can match more than one\n      character (when CR is followed by LF). In this case, set up a negative\n      state to wait for one character to pass before continuing. */\n\n      case OP_ANYNL:\n      if (clen > 0) switch(c)\n        {\n        case CHAR_VT:\n        case CHAR_FF:\n        case CHAR_NEL:\n#ifndef EBCDIC\n        case 0x2028:\n        case 0x2029:\n#endif  /* Not EBCDIC */\n        if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break;\n\n        case CHAR_LF:\n        ADD_NEW(state_offset + 1, 0);\n        break;\n\n        case CHAR_CR:\n        if (ptr + 1 >= end_subject)\n          {\n          ADD_NEW(state_offset + 1, 0);\n          if ((md->moptions & PCRE_PARTIAL_HARD) != 0)\n            reset_could_continue = TRUE;\n          }\n        else if (UCHAR21TEST(ptr + 1) == CHAR_LF)\n          {\n          ADD_NEW_DATA(-(state_offset + 1), 0, 1);\n          }\n        else\n          {\n          ADD_NEW(state_offset + 1, 0);\n          }\n        break;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_NOT_VSPACE:\n      if (clen > 0) switch(c)\n        {\n        VSPACE_CASES:\n        break;\n\n        default:\n        ADD_NEW(state_offset + 1, 0);\n        break;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_VSPACE:\n      if (clen > 0) switch(c)\n        {\n        VSPACE_CASES:\n        ADD_NEW(state_offset + 1, 0);\n        break;\n\n        default:\n        break;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_NOT_HSPACE:\n      if (clen > 0) switch(c)\n        {\n        HSPACE_CASES:\n        break;\n\n        default:\n        ADD_NEW(state_offset + 1, 0);\n        break;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_HSPACE:\n      if (clen > 0) switch(c)\n        {\n        HSPACE_CASES:\n        ADD_NEW(state_offset + 1, 0);\n        break;\n\n        default:\n        break;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      /* Match a negated single character casefully. */\n\n      case OP_NOT:\n      if (clen > 0 && c != d) { ADD_NEW(state_offset + dlen + 1, 0); }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      /* Match a negated single character caselessly. */\n\n      case OP_NOTI:\n      if (clen > 0)\n        {\n        pcre_uint32 otherd;\n#ifdef SUPPORT_UTF\n        if (utf && d >= 128)\n          {\n#ifdef SUPPORT_UCP\n          otherd = UCD_OTHERCASE(d);\n#else\n          otherd = d;\n#endif  /* SUPPORT_UCP */\n          }\n        else\n#endif  /* SUPPORT_UTF */\n        otherd = TABLE_GET(d, fcc, d);\n        if (c != d && c != otherd)\n          { ADD_NEW(state_offset + dlen + 1, 0); }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_PLUSI:\n      case OP_MINPLUSI:\n      case OP_POSPLUSI:\n      case OP_NOTPLUSI:\n      case OP_NOTMINPLUSI:\n      case OP_NOTPOSPLUSI:\n      caseless = TRUE;\n      codevalue -= OP_STARI - OP_STAR;\n\n      /* Fall through */\n      case OP_PLUS:\n      case OP_MINPLUS:\n      case OP_POSPLUS:\n      case OP_NOTPLUS:\n      case OP_NOTMINPLUS:\n      case OP_NOTPOSPLUS:\n      count = current_state->count;  /* Already matched */\n      if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }\n      if (clen > 0)\n        {\n        pcre_uint32 otherd = NOTACHAR;\n        if (caseless)\n          {\n#ifdef SUPPORT_UTF\n          if (utf && d >= 128)\n            {\n#ifdef SUPPORT_UCP\n            otherd = UCD_OTHERCASE(d);\n#endif  /* SUPPORT_UCP */\n            }\n          else\n#endif  /* SUPPORT_UTF */\n          otherd = TABLE_GET(d, fcc, d);\n          }\n        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))\n          {\n          if (count > 0 &&\n              (codevalue == OP_POSPLUS || codevalue == OP_NOTPOSPLUS))\n            {\n            active_count--;             /* Remove non-match possibility */\n            next_active_state--;\n            }\n          count++;\n          ADD_NEW(state_offset, count);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_QUERYI:\n      case OP_MINQUERYI:\n      case OP_POSQUERYI:\n      case OP_NOTQUERYI:\n      case OP_NOTMINQUERYI:\n      case OP_NOTPOSQUERYI:\n      caseless = TRUE;\n      codevalue -= OP_STARI - OP_STAR;\n      /* Fall through */\n      case OP_QUERY:\n      case OP_MINQUERY:\n      case OP_POSQUERY:\n      case OP_NOTQUERY:\n      case OP_NOTMINQUERY:\n      case OP_NOTPOSQUERY:\n      ADD_ACTIVE(state_offset + dlen + 1, 0);\n      if (clen > 0)\n        {\n        pcre_uint32 otherd = NOTACHAR;\n        if (caseless)\n          {\n#ifdef SUPPORT_UTF\n          if (utf && d >= 128)\n            {\n#ifdef SUPPORT_UCP\n            otherd = UCD_OTHERCASE(d);\n#endif  /* SUPPORT_UCP */\n            }\n          else\n#endif  /* SUPPORT_UTF */\n          otherd = TABLE_GET(d, fcc, d);\n          }\n        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))\n          {\n          if (codevalue == OP_POSQUERY || codevalue == OP_NOTPOSQUERY)\n            {\n            active_count--;            /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW(state_offset + dlen + 1, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_STARI:\n      case OP_MINSTARI:\n      case OP_POSSTARI:\n      case OP_NOTSTARI:\n      case OP_NOTMINSTARI:\n      case OP_NOTPOSSTARI:\n      caseless = TRUE;\n      codevalue -= OP_STARI - OP_STAR;\n      /* Fall through */\n      case OP_STAR:\n      case OP_MINSTAR:\n      case OP_POSSTAR:\n      case OP_NOTSTAR:\n      case OP_NOTMINSTAR:\n      case OP_NOTPOSSTAR:\n      ADD_ACTIVE(state_offset + dlen + 1, 0);\n      if (clen > 0)\n        {\n        pcre_uint32 otherd = NOTACHAR;\n        if (caseless)\n          {\n#ifdef SUPPORT_UTF\n          if (utf && d >= 128)\n            {\n#ifdef SUPPORT_UCP\n            otherd = UCD_OTHERCASE(d);\n#endif  /* SUPPORT_UCP */\n            }\n          else\n#endif  /* SUPPORT_UTF */\n          otherd = TABLE_GET(d, fcc, d);\n          }\n        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))\n          {\n          if (codevalue == OP_POSSTAR || codevalue == OP_NOTPOSSTAR)\n            {\n            active_count--;            /* Remove non-match possibility */\n            next_active_state--;\n            }\n          ADD_NEW(state_offset, 0);\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_EXACTI:\n      case OP_NOTEXACTI:\n      caseless = TRUE;\n      codevalue -= OP_STARI - OP_STAR;\n      /* Fall through */\n      case OP_EXACT:\n      case OP_NOTEXACT:\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        pcre_uint32 otherd = NOTACHAR;\n        if (caseless)\n          {\n#ifdef SUPPORT_UTF\n          if (utf && d >= 128)\n            {\n#ifdef SUPPORT_UCP\n            otherd = UCD_OTHERCASE(d);\n#endif  /* SUPPORT_UCP */\n            }\n          else\n#endif  /* SUPPORT_UTF */\n          otherd = TABLE_GET(d, fcc, d);\n          }\n        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))\n          {\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }\n          else\n            { ADD_NEW(state_offset, count); }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_UPTOI:\n      case OP_MINUPTOI:\n      case OP_POSUPTOI:\n      case OP_NOTUPTOI:\n      case OP_NOTMINUPTOI:\n      case OP_NOTPOSUPTOI:\n      caseless = TRUE;\n      codevalue -= OP_STARI - OP_STAR;\n      /* Fall through */\n      case OP_UPTO:\n      case OP_MINUPTO:\n      case OP_POSUPTO:\n      case OP_NOTUPTO:\n      case OP_NOTMINUPTO:\n      case OP_NOTPOSUPTO:\n      ADD_ACTIVE(state_offset + dlen + 1 + IMM2_SIZE, 0);\n      count = current_state->count;  /* Number already matched */\n      if (clen > 0)\n        {\n        pcre_uint32 otherd = NOTACHAR;\n        if (caseless)\n          {\n#ifdef SUPPORT_UTF\n          if (utf && d >= 128)\n            {\n#ifdef SUPPORT_UCP\n            otherd = UCD_OTHERCASE(d);\n#endif  /* SUPPORT_UCP */\n            }\n          else\n#endif  /* SUPPORT_UTF */\n          otherd = TABLE_GET(d, fcc, d);\n          }\n        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))\n          {\n          if (codevalue == OP_POSUPTO || codevalue == OP_NOTPOSUPTO)\n            {\n            active_count--;             /* Remove non-match possibility */\n            next_active_state--;\n            }\n          if (++count >= (int)GET2(code, 1))\n            { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); }\n          else\n            { ADD_NEW(state_offset, count); }\n          }\n        }\n      break;\n\n\n/* ========================================================================== */\n      /* These are the class-handling opcodes */\n\n      case OP_CLASS:\n      case OP_NCLASS:\n      case OP_XCLASS:\n        {\n        BOOL isinclass = FALSE;\n        int next_state_offset;\n        const pcre_uchar *ecode;\n\n        /* For a simple class, there is always just a 32-byte table, and we\n        can set isinclass from it. */\n\n        if (codevalue != OP_XCLASS)\n          {\n          ecode = code + 1 + (32 / sizeof(pcre_uchar));\n          if (clen > 0)\n            {\n            isinclass = (c > 255)? (codevalue == OP_NCLASS) :\n              ((((pcre_uint8 *)(code + 1))[c/8] & (1 << (c&7))) != 0);\n            }\n          }\n\n        /* An extended class may have a table or a list of single characters,\n        ranges, or both, and it may be positive or negative. There's a\n        function that sorts all this out. */\n\n        else\n         {\n         ecode = code + GET(code, 1);\n         if (clen > 0) isinclass = PRIV(xclass)(c, code + 1 + LINK_SIZE, utf);\n         }\n\n        /* At this point, isinclass is set for all kinds of class, and ecode\n        points to the byte after the end of the class. If there is a\n        quantifier, this is where it will be. */\n\n        next_state_offset = (int)(ecode - start_code);\n\n        switch (*ecode)\n          {\n          case OP_CRSTAR:\n          case OP_CRMINSTAR:\n          case OP_CRPOSSTAR:\n          ADD_ACTIVE(next_state_offset + 1, 0);\n          if (isinclass)\n            {\n            if (*ecode == OP_CRPOSSTAR)\n              {\n              active_count--;           /* Remove non-match possibility */\n              next_active_state--;\n              }\n            ADD_NEW(state_offset, 0);\n            }\n          break;\n\n          case OP_CRPLUS:\n          case OP_CRMINPLUS:\n          case OP_CRPOSPLUS:\n          count = current_state->count;  /* Already matched */\n          if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); }\n          if (isinclass)\n            {\n            if (count > 0 && *ecode == OP_CRPOSPLUS)\n              {\n              active_count--;           /* Remove non-match possibility */\n              next_active_state--;\n              }\n            count++;\n            ADD_NEW(state_offset, count);\n            }\n          break;\n\n          case OP_CRQUERY:\n          case OP_CRMINQUERY:\n          case OP_CRPOSQUERY:\n          ADD_ACTIVE(next_state_offset + 1, 0);\n          if (isinclass)\n            {\n            if (*ecode == OP_CRPOSQUERY)\n              {\n              active_count--;           /* Remove non-match possibility */\n              next_active_state--;\n              }\n            ADD_NEW(next_state_offset + 1, 0);\n            }\n          break;\n\n          case OP_CRRANGE:\n          case OP_CRMINRANGE:\n          case OP_CRPOSRANGE:\n          count = current_state->count;  /* Already matched */\n          if (count >= (int)GET2(ecode, 1))\n            { ADD_ACTIVE(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }\n          if (isinclass)\n            {\n            int max = (int)GET2(ecode, 1 + IMM2_SIZE);\n            if (*ecode == OP_CRPOSRANGE && count >= (int)GET2(ecode, 1))\n              {\n              active_count--;           /* Remove non-match possibility */\n              next_active_state--;\n              }\n            if (++count >= max && max != 0)   /* Max 0 => no limit */\n              { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 0); }\n            else\n              { ADD_NEW(state_offset, count); }\n            }\n          break;\n\n          default:\n          if (isinclass) { ADD_NEW(next_state_offset, 0); }\n          break;\n          }\n        }\n      break;\n\n/* ========================================================================== */\n      /* These are the opcodes for fancy brackets of various kinds. We have\n      to use recursion in order to handle them. The \"always failing\" assertion\n      (?!) is optimised to OP_FAIL when compiling, so we have to support that,\n      though the other \"backtracking verbs\" are not supported. */\n\n      case OP_FAIL:\n      forced_fail++;    /* Count FAILs for multiple states */\n      break;\n\n      case OP_ASSERT:\n      case OP_ASSERT_NOT:\n      case OP_ASSERTBACK:\n      case OP_ASSERTBACK_NOT:\n        {\n        int rc;\n        int local_offsets[2];\n        int local_workspace[1000];\n        const pcre_uchar *endasscode = code + GET(code, 1);\n\n        while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);\n\n        rc = internal_dfa_exec(\n          md,                                   /* static match data */\n          code,                                 /* this subexpression's code */\n          ptr,                                  /* where we currently are */\n          (int)(ptr - start_subject),           /* start offset */\n          local_offsets,                        /* offset vector */\n          sizeof(local_offsets)/sizeof(int),    /* size of same */\n          local_workspace,                      /* workspace vector */\n          sizeof(local_workspace)/sizeof(int),  /* size of same */\n          rlevel);                              /* function recursion level */\n\n        if (rc == PCRE_ERROR_DFA_UITEM) return rc;\n        if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))\n            { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_COND:\n      case OP_SCOND:\n        {\n        int local_offsets[1000];\n        int local_workspace[1000];\n        int codelink = GET(code, 1);\n        int condcode;\n\n        /* Because of the way auto-callout works during compile, a callout item\n        is inserted between OP_COND and an assertion condition. This does not\n        happen for the other conditions. */\n\n        if (code[LINK_SIZE+1] == OP_CALLOUT)\n          {\n          rrc = 0;\n          if (PUBL(callout) != NULL)\n            {\n            PUBL(callout_block) cb;\n            cb.version          = 1;   /* Version 1 of the callout block */\n            cb.callout_number   = code[LINK_SIZE+2];\n            cb.offset_vector    = offsets;\n#if defined COMPILE_PCRE8\n            cb.subject          = (PCRE_SPTR)start_subject;\n#elif defined COMPILE_PCRE16\n            cb.subject          = (PCRE_SPTR16)start_subject;\n#elif defined COMPILE_PCRE32\n            cb.subject          = (PCRE_SPTR32)start_subject;\n#endif\n            cb.subject_length   = (int)(end_subject - start_subject);\n            cb.start_match      = (int)(current_subject - start_subject);\n            cb.current_position = (int)(ptr - start_subject);\n            cb.pattern_position = GET(code, LINK_SIZE + 3);\n            cb.next_item_length = GET(code, 3 + 2*LINK_SIZE);\n            cb.capture_top      = 1;\n            cb.capture_last     = -1;\n            cb.callout_data     = md->callout_data;\n            cb.mark             = NULL;   /* No (*MARK) support */\n            if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc;   /* Abandon */\n            }\n          if (rrc > 0) break;                      /* Fail this thread */\n          code += PRIV(OP_lengths)[OP_CALLOUT];    /* Skip callout data */\n          }\n\n        condcode = code[LINK_SIZE+1];\n\n        /* Back reference conditions and duplicate named recursion conditions\n        are not supported */\n\n        if (condcode == OP_CREF || condcode == OP_DNCREF ||\n            condcode == OP_DNRREF)\n          return PCRE_ERROR_DFA_UCOND;\n\n        /* The DEFINE condition is always false, and the assertion (?!) is\n        converted to OP_FAIL. */\n\n        if (condcode == OP_DEF || condcode == OP_FAIL)\n          { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }\n\n        /* The only supported version of OP_RREF is for the value RREF_ANY,\n        which means \"test if in any recursion\". We can't test for specifically\n        recursed groups. */\n\n        else if (condcode == OP_RREF)\n          {\n          int value = GET2(code, LINK_SIZE + 2);\n          if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND;\n          if (md->recursive != NULL)\n            { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); }\n          else { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }\n          }\n\n        /* Otherwise, the condition is an assertion */\n\n        else\n          {\n          int rc;\n          const pcre_uchar *asscode = code + LINK_SIZE + 1;\n          const pcre_uchar *endasscode = asscode + GET(asscode, 1);\n\n          while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);\n\n          rc = internal_dfa_exec(\n            md,                                   /* fixed match data */\n            asscode,                              /* this subexpression's code */\n            ptr,                                  /* where we currently are */\n            (int)(ptr - start_subject),           /* start offset */\n            local_offsets,                        /* offset vector */\n            sizeof(local_offsets)/sizeof(int),    /* size of same */\n            local_workspace,                      /* workspace vector */\n            sizeof(local_workspace)/sizeof(int),  /* size of same */\n            rlevel);                              /* function recursion level */\n\n          if (rc == PCRE_ERROR_DFA_UITEM) return rc;\n          if ((rc >= 0) ==\n                (condcode == OP_ASSERT || condcode == OP_ASSERTBACK))\n            { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }\n          else\n            { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_RECURSE:\n        {\n        dfa_recursion_info *ri;\n        int local_offsets[1000];\n        int local_workspace[1000];\n        const pcre_uchar *callpat = start_code + GET(code, 1);\n        int recno = (callpat == md->start_code)? 0 :\n          GET2(callpat, 1 + LINK_SIZE);\n        int rc;\n\n        DPRINTF((\"%.*sStarting regex recursion\\n\", rlevel*2-2, SP));\n\n        /* Check for repeating a recursion without advancing the subject\n        pointer. This should catch convoluted mutual recursions. (Some simple\n        cases are caught at compile time.) */\n\n        for (ri = md->recursive; ri != NULL; ri = ri->prevrec)\n          if (recno == ri->group_num && ptr == ri->subject_position)\n            return PCRE_ERROR_RECURSELOOP;\n\n        /* Remember this recursion and where we started it so as to\n        catch infinite loops. */\n\n        new_recursive.group_num = recno;\n        new_recursive.subject_position = ptr;\n        new_recursive.prevrec = md->recursive;\n        md->recursive = &new_recursive;\n\n        rc = internal_dfa_exec(\n          md,                                   /* fixed match data */\n          callpat,                              /* this subexpression's code */\n          ptr,                                  /* where we currently are */\n          (int)(ptr - start_subject),           /* start offset */\n          local_offsets,                        /* offset vector */\n          sizeof(local_offsets)/sizeof(int),    /* size of same */\n          local_workspace,                      /* workspace vector */\n          sizeof(local_workspace)/sizeof(int),  /* size of same */\n          rlevel);                              /* function recursion level */\n\n        md->recursive = new_recursive.prevrec;  /* Done this recursion */\n\n        DPRINTF((\"%.*sReturn from regex recursion: rc=%d\\n\", rlevel*2-2, SP,\n          rc));\n\n        /* Ran out of internal offsets */\n\n        if (rc == 0) return PCRE_ERROR_DFA_RECURSE;\n\n        /* For each successful matched substring, set up the next state with a\n        count of characters to skip before trying it. Note that the count is in\n        characters, not bytes. */\n\n        if (rc > 0)\n          {\n          for (rc = rc*2 - 2; rc >= 0; rc -= 2)\n            {\n            int charcount = local_offsets[rc+1] - local_offsets[rc];\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n            if (utf)\n              {\n              const pcre_uchar *p = start_subject + local_offsets[rc];\n              const pcre_uchar *pp = start_subject + local_offsets[rc+1];\n              while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;\n              }\n#endif\n            if (charcount > 0)\n              {\n              ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1));\n              }\n            else\n              {\n              ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0);\n              }\n            }\n          }\n        else if (rc != PCRE_ERROR_NOMATCH) return rc;\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_BRAPOS:\n      case OP_SBRAPOS:\n      case OP_CBRAPOS:\n      case OP_SCBRAPOS:\n      case OP_BRAPOSZERO:\n        {\n        int charcount, matched_count;\n        const pcre_uchar *local_ptr = ptr;\n        BOOL allow_zero;\n\n        if (codevalue == OP_BRAPOSZERO)\n          {\n          allow_zero = TRUE;\n          codevalue = *(++code);  /* Codevalue will be one of above BRAs */\n          }\n        else allow_zero = FALSE;\n\n        /* Loop to match the subpattern as many times as possible as if it were\n        a complete pattern. */\n\n        for (matched_count = 0;; matched_count++)\n          {\n          int local_offsets[2];\n          int local_workspace[1000];\n\n          int rc = internal_dfa_exec(\n            md,                                   /* fixed match data */\n            code,                                 /* this subexpression's code */\n            local_ptr,                            /* where we currently are */\n            (int)(ptr - start_subject),           /* start offset */\n            local_offsets,                        /* offset vector */\n            sizeof(local_offsets)/sizeof(int),    /* size of same */\n            local_workspace,                      /* workspace vector */\n            sizeof(local_workspace)/sizeof(int),  /* size of same */\n            rlevel);                              /* function recursion level */\n\n          /* Failed to match */\n\n          if (rc < 0)\n            {\n            if (rc != PCRE_ERROR_NOMATCH) return rc;\n            break;\n            }\n\n          /* Matched: break the loop if zero characters matched. */\n\n          charcount = local_offsets[1] - local_offsets[0];\n          if (charcount == 0) break;\n          local_ptr += charcount;    /* Advance temporary position ptr */\n          }\n\n        /* At this point we have matched the subpattern matched_count\n        times, and local_ptr is pointing to the character after the end of the\n        last match. */\n\n        if (matched_count > 0 || allow_zero)\n          {\n          const pcre_uchar *end_subpattern = code;\n          int next_state_offset;\n\n          do { end_subpattern += GET(end_subpattern, 1); }\n            while (*end_subpattern == OP_ALT);\n          next_state_offset =\n            (int)(end_subpattern - start_code + LINK_SIZE + 1);\n\n          /* Optimization: if there are no more active states, and there\n          are no new states yet set up, then skip over the subject string\n          right here, to save looping. Otherwise, set up the new state to swing\n          into action when the end of the matched substring is reached. */\n\n          if (i + 1 >= active_count && new_count == 0)\n            {\n            ptr = local_ptr;\n            clen = 0;\n            ADD_NEW(next_state_offset, 0);\n            }\n          else\n            {\n            const pcre_uchar *p = ptr;\n            const pcre_uchar *pp = local_ptr;\n            charcount = (int)(pp - p);\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n            if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;\n#endif\n            ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));\n            }\n          }\n        }\n      break;\n\n      /*-----------------------------------------------------------------*/\n      case OP_ONCE:\n      case OP_ONCE_NC:\n        {\n        int local_offsets[2];\n        int local_workspace[1000];\n\n        int rc = internal_dfa_exec(\n          md,                                   /* fixed match data */\n          code,                                 /* this subexpression's code */\n          ptr,                                  /* where we currently are */\n          (int)(ptr - start_subject),           /* start offset */\n          local_offsets,                        /* offset vector */\n          sizeof(local_offsets)/sizeof(int),    /* size of same */\n          local_workspace,                      /* workspace vector */\n          sizeof(local_workspace)/sizeof(int),  /* size of same */\n          rlevel);                              /* function recursion level */\n\n        if (rc >= 0)\n          {\n          const pcre_uchar *end_subpattern = code;\n          int charcount = local_offsets[1] - local_offsets[0];\n          int next_state_offset, repeat_state_offset;\n\n          do { end_subpattern += GET(end_subpattern, 1); }\n            while (*end_subpattern == OP_ALT);\n          next_state_offset =\n            (int)(end_subpattern - start_code + LINK_SIZE + 1);\n\n          /* If the end of this subpattern is KETRMAX or KETRMIN, we must\n          arrange for the repeat state also to be added to the relevant list.\n          Calculate the offset, or set -1 for no repeat. */\n\n          repeat_state_offset = (*end_subpattern == OP_KETRMAX ||\n                                 *end_subpattern == OP_KETRMIN)?\n            (int)(end_subpattern - start_code - GET(end_subpattern, 1)) : -1;\n\n          /* If we have matched an empty string, add the next state at the\n          current character pointer. This is important so that the duplicate\n          checking kicks in, which is what breaks infinite loops that match an\n          empty string. */\n\n          if (charcount == 0)\n            {\n            ADD_ACTIVE(next_state_offset, 0);\n            }\n\n          /* Optimization: if there are no more active states, and there\n          are no new states yet set up, then skip over the subject string\n          right here, to save looping. Otherwise, set up the new state to swing\n          into action when the end of the matched substring is reached. */\n\n          else if (i + 1 >= active_count && new_count == 0)\n            {\n            ptr += charcount;\n            clen = 0;\n            ADD_NEW(next_state_offset, 0);\n\n            /* If we are adding a repeat state at the new character position,\n            we must fudge things so that it is the only current state.\n            Otherwise, it might be a duplicate of one we processed before, and\n            that would cause it to be skipped. */\n\n            if (repeat_state_offset >= 0)\n              {\n              next_active_state = active_states;\n              active_count = 0;\n              i = -1;\n              ADD_ACTIVE(repeat_state_offset, 0);\n              }\n            }\n          else\n            {\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n            if (utf)\n              {\n              const pcre_uchar *p = start_subject + local_offsets[0];\n              const pcre_uchar *pp = start_subject + local_offsets[1];\n              while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--;\n              }\n#endif\n            ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));\n            if (repeat_state_offset >= 0)\n              { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); }\n            }\n          }\n        else if (rc != PCRE_ERROR_NOMATCH) return rc;\n        }\n      break;\n\n\n/* ========================================================================== */\n      /* Handle callouts */\n\n      case OP_CALLOUT:\n      rrc = 0;\n      if (PUBL(callout) != NULL)\n        {\n        PUBL(callout_block) cb;\n        cb.version          = 1;   /* Version 1 of the callout block */\n        cb.callout_number   = code[1];\n        cb.offset_vector    = offsets;\n#if defined COMPILE_PCRE8\n        cb.subject          = (PCRE_SPTR)start_subject;\n#elif defined COMPILE_PCRE16\n        cb.subject          = (PCRE_SPTR16)start_subject;\n#elif defined COMPILE_PCRE32\n        cb.subject          = (PCRE_SPTR32)start_subject;\n#endif\n        cb.subject_length   = (int)(end_subject - start_subject);\n        cb.start_match      = (int)(current_subject - start_subject);\n        cb.current_position = (int)(ptr - start_subject);\n        cb.pattern_position = GET(code, 2);\n        cb.next_item_length = GET(code, 2 + LINK_SIZE);\n        cb.capture_top      = 1;\n        cb.capture_last     = -1;\n        cb.callout_data     = md->callout_data;\n        cb.mark             = NULL;   /* No (*MARK) support */\n        if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc;   /* Abandon */\n        }\n      if (rrc == 0)\n        { ADD_ACTIVE(state_offset + PRIV(OP_lengths)[OP_CALLOUT], 0); }\n      break;\n\n\n/* ========================================================================== */\n      default:        /* Unsupported opcode */\n      return PCRE_ERROR_DFA_UITEM;\n      }\n\n    NEXT_ACTIVE_STATE: continue;\n\n    }      /* End of loop scanning active states */\n\n  /* We have finished the processing at the current subject character. If no\n  new states have been set for the next character, we have found all the\n  matches that we are going to find. If we are at the top level and partial\n  matching has been requested, check for appropriate conditions.\n\n  The \"forced_ fail\" variable counts the number of (*F) encountered for the\n  character. If it is equal to the original active_count (saved in\n  workspace[1]) it means that (*F) was found on every active state. In this\n  case we don't want to give a partial match.\n\n  The \"could_continue\" variable is true if a state could have continued but\n  for the fact that the end of the subject was reached. */\n\n  if (new_count <= 0)\n    {\n    if (rlevel == 1 &&                               /* Top level, and */\n        could_continue &&                            /* Some could go on, and */\n        forced_fail != workspace[1] &&               /* Not all forced fail & */\n        (                                            /* either... */\n        (md->moptions & PCRE_PARTIAL_HARD) != 0      /* Hard partial */\n        ||                                           /* or... */\n        ((md->moptions & PCRE_PARTIAL_SOFT) != 0 &&  /* Soft partial and */\n         match_count < 0)                            /* no matches */\n        ) &&                                         /* And... */\n        (\n        partial_newline ||                           /* Either partial NL */\n          (                                          /* or ... */\n          ptr >= end_subject &&                /* End of subject and */\n          ptr > md->start_used_ptr)            /* Inspected non-empty string */\n          )\n        )\n      match_count = PCRE_ERROR_PARTIAL;\n    DPRINTF((\"%.*sEnd of internal_dfa_exec %d: returning %d\\n\"\n      \"%.*s---------------------\\n\\n\", rlevel*2-2, SP, rlevel, match_count,\n      rlevel*2-2, SP));\n    break;        /* In effect, \"return\", but see the comment below */\n    }\n\n  /* One or more states are active for the next character. */\n\n  ptr += clen;    /* Advance to next subject character */\n  }               /* Loop to move along the subject string */\n\n/* Control gets here from \"break\" a few lines above. We do it this way because\nif we use \"return\" above, we have compiler trouble. Some compilers warn if\nthere's nothing here because they think the function doesn't return a value. On\nthe other hand, if we put a dummy statement here, some more clever compilers\ncomplain that it can't be reached. Sigh. */\n\nreturn match_count;\n}\n\n\n\n\n/*************************************************\n*    Execute a Regular Expression - DFA engine   *\n*************************************************/\n\n/* This external function applies a compiled re to a subject string using a DFA\nengine. This function calls the internal function multiple times if the pattern\nis not anchored.\n\nArguments:\n  argument_re     points to the compiled expression\n  extra_data      points to extra data or is NULL\n  subject         points to the subject string\n  length          length of subject string (may contain binary zeros)\n  start_offset    where to start in the subject string\n  options         option bits\n  offsets         vector of match offsets\n  offsetcount     size of same\n  workspace       workspace vector\n  wscount         size of same\n\nReturns:          > 0 => number of match offset pairs placed in offsets\n                  = 0 => offsets overflowed; longest matches are present\n                   -1 => failed to match\n                 < -1 => some kind of unexpected problem\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,\n  const char *subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount, int *workspace, int wscount)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,\n  PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount, int *workspace, int wscount)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_dfa_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,\n  PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount, int *workspace, int wscount)\n#endif\n{\nREAL_PCRE *re = (REAL_PCRE *)argument_re;\ndfa_match_data match_block;\ndfa_match_data *md = &match_block;\nBOOL utf, anchored, startline, firstline;\nconst pcre_uchar *current_subject, *end_subject;\nconst pcre_study_data *study = NULL;\n\nconst pcre_uchar *req_char_ptr;\nconst pcre_uint8 *start_bits = NULL;\nBOOL has_first_char = FALSE;\nBOOL has_req_char = FALSE;\npcre_uchar first_char = 0;\npcre_uchar first_char2 = 0;\npcre_uchar req_char = 0;\npcre_uchar req_char2 = 0;\nint newline;\n\n/* Plausibility checks */\n\nif ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;\nif (re == NULL || subject == NULL || workspace == NULL ||\n   (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;\nif (offsetcount < 0) return PCRE_ERROR_BADCOUNT;\nif (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;\nif (length < 0) return PCRE_ERROR_BADLENGTH;\nif (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;\n\n/* Check that the first field in the block is the magic number. If it is not,\nreturn with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to\nREVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which\nmeans that the pattern is likely compiled with different endianness. */\n\nif (re->magic_number != MAGIC_NUMBER)\n  return re->magic_number == REVERSED_MAGIC_NUMBER?\n    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;\nif ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\n\n/* If restarting after a partial match, do some sanity checks on the contents\nof the workspace. */\n\nif ((options & PCRE_DFA_RESTART) != 0)\n  {\n  if ((workspace[0] & (-2)) != 0 || workspace[1] < 1 ||\n    workspace[1] > (wscount - 2)/INTS_PER_STATEBLOCK)\n      return PCRE_ERROR_DFA_BADRESTART;\n  }\n\n/* Set up study, callout, and table data */\n\nmd->tables = re->tables;\nmd->callout_data = NULL;\n\nif (extra_data != NULL)\n  {\n  unsigned long int flags = extra_data->flags;\n  if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)\n    study = (const pcre_study_data *)extra_data->study_data;\n  if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT;\n  if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0)\n    return PCRE_ERROR_DFA_UMLIMIT;\n  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)\n    md->callout_data = extra_data->callout_data;\n  if ((flags & PCRE_EXTRA_TABLES) != 0)\n    md->tables = extra_data->tables;\n  }\n\n/* Set some local values */\n\ncurrent_subject = (const pcre_uchar *)subject + start_offset;\nend_subject = (const pcre_uchar *)subject + length;\nreq_char_ptr = current_subject - 1;\n\n#ifdef SUPPORT_UTF\n/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */\nutf = (re->options & PCRE_UTF8) != 0;\n#else\nutf = FALSE;\n#endif\n\nanchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 ||\n  (re->options & PCRE_ANCHORED) != 0;\n\n/* The remaining fixed data for passing around. */\n\nmd->start_code = (const pcre_uchar *)argument_re +\n    re->name_table_offset + re->name_count * re->name_entry_size;\nmd->start_subject = (const pcre_uchar *)subject;\nmd->end_subject = end_subject;\nmd->start_offset = start_offset;\nmd->moptions = options;\nmd->poptions = re->options;\n\n/* If the BSR option is not set at match time, copy what was set\nat compile time. */\n\nif ((md->moptions & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == 0)\n  {\n  if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0)\n    md->moptions |= re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE);\n#ifdef BSR_ANYCRLF\n  else md->moptions |= PCRE_BSR_ANYCRLF;\n#endif\n  }\n\n/* Handle different types of newline. The three bits give eight cases. If\nnothing is set at run time, whatever was used at compile time applies. */\n\nswitch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) &\n         PCRE_NEWLINE_BITS)\n  {\n  case 0: newline = NEWLINE; break;   /* Compile-time default */\n  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;\n  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;\n  case PCRE_NEWLINE_CR+\n       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;\n  case PCRE_NEWLINE_ANY: newline = -1; break;\n  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;\n  default: return PCRE_ERROR_BADNEWLINE;\n  }\n\nif (newline == -2)\n  {\n  md->nltype = NLTYPE_ANYCRLF;\n  }\nelse if (newline < 0)\n  {\n  md->nltype = NLTYPE_ANY;\n  }\nelse\n  {\n  md->nltype = NLTYPE_FIXED;\n  if (newline > 255)\n    {\n    md->nllen = 2;\n    md->nl[0] = (newline >> 8) & 255;\n    md->nl[1] = newline & 255;\n    }\n  else\n    {\n    md->nllen = 1;\n    md->nl[0] = newline;\n    }\n  }\n\n/* Check a UTF-8 string if required. Unfortunately there's no way of passing\nback the character offset. */\n\n#ifdef SUPPORT_UTF\nif (utf && (options & PCRE_NO_UTF8_CHECK) == 0)\n  {\n  int erroroffset;\n  int errorcode = PRIV(valid_utf)((pcre_uchar *)subject, length, &erroroffset);\n  if (errorcode != 0)\n    {\n    if (offsetcount >= 2)\n      {\n      offsets[0] = erroroffset;\n      offsets[1] = errorcode;\n      }\n#if defined COMPILE_PCRE8\n    return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0) ?\n      PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;\n#elif defined COMPILE_PCRE16\n    return (errorcode <= PCRE_UTF16_ERR1 && (options & PCRE_PARTIAL_HARD) != 0) ?\n      PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16;\n#elif defined COMPILE_PCRE32\n    return PCRE_ERROR_BADUTF32;\n#endif\n    }\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\n  if (start_offset > 0 && start_offset < length &&\n        NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))\n    return PCRE_ERROR_BADUTF8_OFFSET;\n#endif\n  }\n#endif\n\n/* If the exec call supplied NULL for tables, use the inbuilt ones. This\nis a feature that makes it possible to save compiled regex and re-use them\nin other programs later. */\n\nif (md->tables == NULL) md->tables = PRIV(default_tables);\n\n/* The \"must be at the start of a line\" flags are used in a loop when finding\nwhere to start. */\n\nstartline = (re->flags & PCRE_STARTLINE) != 0;\nfirstline = (re->options & PCRE_FIRSTLINE) != 0;\n\n/* Set up the first character to match, if available. The first_byte value is\nnever set for an anchored regular expression, but the anchoring may be forced\nat run time, so we have to test for anchoring. The first char may be unset for\nan unanchored pattern, of course. If there's no first char and the pattern was\nstudied, there may be a bitmap of possible first characters. */\n\nif (!anchored)\n  {\n  if ((re->flags & PCRE_FIRSTSET) != 0)\n    {\n    has_first_char = TRUE;\n    first_char = first_char2 = (pcre_uchar)(re->first_char);\n    if ((re->flags & PCRE_FCH_CASELESS) != 0)\n      {\n      first_char2 = TABLE_GET(first_char, md->tables + fcc_offset, first_char);\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n      if (utf && first_char > 127)\n        first_char2 = UCD_OTHERCASE(first_char);\n#endif\n      }\n    }\n  else\n    {\n    if (!startline && study != NULL &&\n         (study->flags & PCRE_STUDY_MAPPED) != 0)\n      start_bits = study->start_bits;\n    }\n  }\n\n/* For anchored or unanchored matches, there may be a \"last known required\ncharacter\" set. */\n\nif ((re->flags & PCRE_REQCHSET) != 0)\n  {\n  has_req_char = TRUE;\n  req_char = req_char2 = (pcre_uchar)(re->req_char);\n  if ((re->flags & PCRE_RCH_CASELESS) != 0)\n    {\n    req_char2 = TABLE_GET(req_char, md->tables + fcc_offset, req_char);\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n    if (utf && req_char > 127)\n      req_char2 = UCD_OTHERCASE(req_char);\n#endif\n    }\n  }\n\n/* Call the main matching function, looping for a non-anchored regex after a\nfailed match. If not restarting, perform certain optimizations at the start of\na match. */\n\nfor (;;)\n  {\n  int rc;\n\n  if ((options & PCRE_DFA_RESTART) == 0)\n    {\n    const pcre_uchar *save_end_subject = end_subject;\n\n    /* If firstline is TRUE, the start of the match is constrained to the first\n    line of a multiline string. Implement this by temporarily adjusting\n    end_subject so that we stop scanning at a newline. If the match fails at\n    the newline, later code breaks this loop. */\n\n    if (firstline)\n      {\n      PCRE_PUCHAR t = current_subject;\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        while (t < md->end_subject && !IS_NEWLINE(t))\n          {\n          t++;\n          ACROSSCHAR(t < end_subject, *t, t++);\n          }\n        }\n      else\n#endif\n      while (t < md->end_subject && !IS_NEWLINE(t)) t++;\n      end_subject = t;\n      }\n\n    /* There are some optimizations that avoid running the match if a known\n    starting point is not found. However, there is an option that disables\n    these, for testing and for ensuring that all callouts do actually occur.\n    The option can be set in the regex by (*NO_START_OPT) or passed in\n    match-time options. */\n\n    if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0)\n      {\n      /* Advance to a known first pcre_uchar (i.e. data item) */\n\n      if (has_first_char)\n        {\n        if (first_char != first_char2)\n          {\n          pcre_uchar csc;\n          while (current_subject < end_subject &&\n                 (csc = UCHAR21TEST(current_subject)) != first_char && csc != first_char2)\n            current_subject++;\n          }\n        else\n          while (current_subject < end_subject &&\n                 UCHAR21TEST(current_subject) != first_char)\n            current_subject++;\n        }\n\n      /* Or to just after a linebreak for a multiline match if possible */\n\n      else if (startline)\n        {\n        if (current_subject > md->start_subject + start_offset)\n          {\n#ifdef SUPPORT_UTF\n          if (utf)\n            {\n            while (current_subject < end_subject &&\n                   !WAS_NEWLINE(current_subject))\n              {\n              current_subject++;\n              ACROSSCHAR(current_subject < end_subject, *current_subject,\n                current_subject++);\n              }\n            }\n          else\n#endif\n          while (current_subject < end_subject && !WAS_NEWLINE(current_subject))\n            current_subject++;\n\n          /* If we have just passed a CR and the newline option is ANY or\n          ANYCRLF, and we are now at a LF, advance the match position by one\n          more character. */\n\n          if (UCHAR21TEST(current_subject - 1) == CHAR_CR &&\n               (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&\n               current_subject < end_subject &&\n               UCHAR21TEST(current_subject) == CHAR_NL)\n            current_subject++;\n          }\n        }\n\n      /* Advance to a non-unique first pcre_uchar after study */\n\n      else if (start_bits != NULL)\n        {\n        while (current_subject < end_subject)\n          {\n          register pcre_uint32 c = UCHAR21TEST(current_subject);\n#ifndef COMPILE_PCRE8\n          if (c > 255) c = 255;\n#endif\n          if ((start_bits[c/8] & (1 << (c&7))) != 0) break;\n          current_subject++;\n          }\n        }\n      }\n\n    /* Restore fudged end_subject */\n\n    end_subject = save_end_subject;\n\n    /* The following two optimizations are disabled for partial matching or if\n    disabling is explicitly requested (and of course, by the test above, this\n    code is not obeyed when restarting after a partial match). */\n\n    if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 &&\n        (options & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) == 0)\n      {\n      /* If the pattern was studied, a minimum subject length may be set. This\n      is a lower bound; no actual string of that length may actually match the\n      pattern. Although the value is, strictly, in characters, we treat it as\n      in pcre_uchar units to avoid spending too much time in this optimization.\n      */\n\n      if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&\n          (pcre_uint32)(end_subject - current_subject) < study->minlength)\n        return PCRE_ERROR_NOMATCH;\n\n      /* If req_char is set, we know that that pcre_uchar must appear in the\n      subject for the match to succeed. If the first pcre_uchar is set,\n      req_char must be later in the subject; otherwise the test starts at the\n      match point. This optimization can save a huge amount of work in patterns\n      with nested unlimited repeats that aren't going to match. Writing\n      separate code for cased/caseless versions makes it go faster, as does\n      using an autoincrement and backing off on a match.\n\n      HOWEVER: when the subject string is very, very long, searching to its end\n      can take a long time, and give bad performance on quite ordinary\n      patterns. This showed up when somebody was matching /^C/ on a 32-megabyte\n      string... so we don't do this when the string is sufficiently long. */\n\n      if (has_req_char && end_subject - current_subject < REQ_BYTE_MAX)\n        {\n        register PCRE_PUCHAR p = current_subject + (has_first_char? 1:0);\n\n        /* We don't need to repeat the search if we haven't yet reached the\n        place we found it at last time. */\n\n        if (p > req_char_ptr)\n          {\n          if (req_char != req_char2)\n            {\n            while (p < end_subject)\n              {\n              register pcre_uint32 pp = UCHAR21INCTEST(p);\n              if (pp == req_char || pp == req_char2) { p--; break; }\n              }\n            }\n          else\n            {\n            while (p < end_subject)\n              {\n              if (UCHAR21INCTEST(p) == req_char) { p--; break; }\n              }\n            }\n\n          /* If we can't find the required pcre_uchar, break the matching loop,\n          which will cause a return or PCRE_ERROR_NOMATCH. */\n\n          if (p >= end_subject) break;\n\n          /* If we have found the required pcre_uchar, save the point where we\n          found it, so that we don't search again next time round the loop if\n          the start hasn't passed this point yet. */\n\n          req_char_ptr = p;\n          }\n        }\n      }\n    }   /* End of optimizations that are done when not restarting */\n\n  /* OK, now we can do the business */\n\n  md->start_used_ptr = current_subject;\n  md->recursive = NULL;\n\n  rc = internal_dfa_exec(\n    md,                                /* fixed match data */\n    md->start_code,                    /* this subexpression's code */\n    current_subject,                   /* where we currently are */\n    start_offset,                      /* start offset in subject */\n    offsets,                           /* offset vector */\n    offsetcount,                       /* size of same */\n    workspace,                         /* workspace vector */\n    wscount,                           /* size of same */\n    0);                                /* function recurse level */\n\n  /* Anything other than \"no match\" means we are done, always; otherwise, carry\n  on only if not anchored. */\n\n  if (rc != PCRE_ERROR_NOMATCH || anchored)\n    {\n    if (rc == PCRE_ERROR_PARTIAL && offsetcount >= 2)\n      {\n      offsets[0] = (int)(md->start_used_ptr - (PCRE_PUCHAR)subject);\n      offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);\n      if (offsetcount > 2)\n        offsets[2] = (int)(current_subject - (PCRE_PUCHAR)subject);\n      }\n    return rc;\n    }\n\n  /* Advance to the next subject character unless we are at the end of a line\n  and firstline is set. */\n\n  if (firstline && IS_NEWLINE(current_subject)) break;\n  current_subject++;\n#ifdef SUPPORT_UTF\n  if (utf)\n    {\n    ACROSSCHAR(current_subject < end_subject, *current_subject,\n      current_subject++);\n    }\n#endif\n  if (current_subject > end_subject) break;\n\n  /* If we have just passed a CR and we are now at a LF, and the pattern does\n  not contain any explicit matches for \\r or \\n, and the newline option is CRLF\n  or ANY or ANYCRLF, advance the match position by one more character. */\n\n  if (UCHAR21TEST(current_subject - 1) == CHAR_CR &&\n      current_subject < end_subject &&\n      UCHAR21TEST(current_subject) == CHAR_NL &&\n      (re->flags & PCRE_HASCRORLF) == 0 &&\n        (md->nltype == NLTYPE_ANY ||\n         md->nltype == NLTYPE_ANYCRLF ||\n         md->nllen == 2))\n    current_subject++;\n\n  }   /* \"Bumpalong\" loop */\n\nreturn PCRE_ERROR_NOMATCH;\n}\n\n/* End of pcre_dfa_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre_exec.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2018 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* This module contains pcre_exec(), the externally visible function that does\npattern matching using an NFA algorithm, trying to mimic Perl as closely as\npossible. There are also some static supporting functions. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#define NLBLOCK md             /* Block containing newline information */\n#define PSSTART start_subject  /* Field containing processed string start */\n#define PSEND   end_subject    /* Field containing processed string end */\n\n#include \"pcre_internal.h\"\n\n/* Undefine some potentially clashing cpp symbols */\n\n#undef min\n#undef max\n\n/* The md->capture_last field uses the lower 16 bits for the last captured\nsubstring (which can never be greater than 65535) and a bit in the top half\nto mean \"capture vector overflowed\". This odd way of doing things was\nimplemented when it was realized that preserving and restoring the overflow bit\nwhenever the last capture number was saved/restored made for a neater\ninterface, and doing it this way saved on (a) another variable, which would\nhave increased the stack frame size (a big NO-NO in PCRE) and (b) another\nseparate set of save/restore instructions. The following defines are used in\nimplementing this. */\n\n#define CAPLMASK    0x0000ffff    /* The bits used for last_capture */\n#define OVFLMASK    0xffff0000    /* The bits used for the overflow flag */\n#define OVFLBIT     0x00010000    /* The bit that is set for overflow */\n\n/* Values for setting in md->match_function_type to indicate two special types\nof call to match(). We do it this way to save on using another stack variable,\nas stack usage is to be discouraged. */\n\n#define MATCH_CONDASSERT     1  /* Called to check a condition assertion */\n#define MATCH_CBEGROUP       2  /* Could-be-empty unlimited repeat group */\n\n/* Non-error returns from the match() function. Error returns are externally\ndefined PCRE_ERROR_xxx codes, which are all negative. */\n\n#define MATCH_MATCH        1\n#define MATCH_NOMATCH      0\n\n/* Special internal returns from the match() function. Make them sufficiently\nnegative to avoid the external error codes. */\n\n#define MATCH_ACCEPT       (-999)\n#define MATCH_KETRPOS      (-998)\n#define MATCH_ONCE         (-997)\n/* The next 5 must be kept together and in sequence so that a test that checks\nfor any one of them can use a range. */\n#define MATCH_COMMIT       (-996)\n#define MATCH_PRUNE        (-995)\n#define MATCH_SKIP         (-994)\n#define MATCH_SKIP_ARG     (-993)\n#define MATCH_THEN         (-992)\n#define MATCH_BACKTRACK_MAX MATCH_THEN\n#define MATCH_BACKTRACK_MIN MATCH_COMMIT\n\n/* Maximum number of ints of offset to save on the stack for recursive calls.\nIf the offset vector is bigger, malloc is used. This should be a multiple of 3,\nbecause the offset vector is always a multiple of 3 long. */\n\n#define REC_STACK_SAVE_MAX 30\n\n/* Min and max values for the common repeats; for the maxima, 0 => infinity */\n\nstatic const char rep_min[] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, };\nstatic const char rep_max[] = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, };\n\n#ifdef PCRE_DEBUG\n/*************************************************\n*        Debugging function to print chars       *\n*************************************************/\n\n/* Print a sequence of chars in printable format, stopping at the end of the\nsubject if the requested.\n\nArguments:\n  p           points to characters\n  length      number to print\n  is_subject  TRUE if printing from within md->start_subject\n  md          pointer to matching data block, if is_subject is TRUE\n\nReturns:     nothing\n*/\n\nstatic void\npchars(const pcre_uchar *p, int length, BOOL is_subject, match_data *md)\n{\npcre_uint32 c;\nBOOL utf = md->utf;\nif (is_subject && length > md->end_subject - p) length = md->end_subject - p;\nwhile (length-- > 0)\n  if (isprint(c = UCHAR21INCTEST(p))) printf(\"%c\", (char)c); else printf(\"\\\\x{%02x}\", c);\n}\n#endif\n\n\n\n/*************************************************\n*          Match a back-reference                *\n*************************************************/\n\n/* Normally, if a back reference hasn't been set, the length that is passed is\nnegative, so the match always fails. However, in JavaScript compatibility mode,\nthe length passed is zero. Note that in caseless UTF-8 mode, the number of\nsubject bytes matched may be different to the number of reference bytes.\n\nArguments:\n  offset      index into the offset vector\n  eptr        pointer into the subject\n  length      length of reference to be matched (number of bytes)\n  md          points to match data block\n  caseless    TRUE if caseless\n\nReturns:      >= 0 the number of subject bytes matched\n              -1 no match\n              -2 partial match; always given if at end subject\n*/\n\nstatic int\nmatch_ref(int offset, register PCRE_PUCHAR eptr, int length, match_data *md,\n  BOOL caseless)\n{\nPCRE_PUCHAR eptr_start = eptr;\nregister PCRE_PUCHAR p = md->start_subject + md->offset_vector[offset];\n#if defined SUPPORT_UTF && defined SUPPORT_UCP\nBOOL utf = md->utf;\n#endif\n\n#ifdef PCRE_DEBUG\nif (eptr >= md->end_subject)\n  printf(\"matching subject <null>\");\nelse\n  {\n  printf(\"matching subject \");\n  pchars(eptr, length, TRUE, md);\n  }\nprintf(\" against backref \");\npchars(p, length, FALSE, md);\nprintf(\"\\n\");\n#endif\n\n/* Always fail if reference not set (and not JavaScript compatible - in that\ncase the length is passed as zero). */\n\nif (length < 0) return -1;\n\n/* Separate the caseless case for speed. In UTF-8 mode we can only do this\nproperly if Unicode properties are supported. Otherwise, we can check only\nASCII characters. */\n\nif (caseless)\n  {\n#if defined SUPPORT_UTF && defined SUPPORT_UCP\n  if (utf)\n    {\n    /* Match characters up to the end of the reference. NOTE: the number of\n    data units matched may differ, because in UTF-8 there are some characters\n    whose upper and lower case versions code have different numbers of bytes.\n    For example, U+023A (2 bytes in UTF-8) is the upper case version of U+2C65\n    (3 bytes in UTF-8); a sequence of 3 of the former uses 6 bytes, as does a\n    sequence of two of the latter. It is important, therefore, to check the\n    length along the reference, not along the subject (earlier code did this\n    wrong). */\n\n    PCRE_PUCHAR endptr = p + length;\n    while (p < endptr)\n      {\n      pcre_uint32 c, d;\n      const ucd_record *ur;\n      if (eptr >= md->end_subject) return -2;   /* Partial match */\n      GETCHARINC(c, eptr);\n      GETCHARINC(d, p);\n      ur = GET_UCD(d);\n      if (c != d && c != d + ur->other_case)\n        {\n        const pcre_uint32 *pp = PRIV(ucd_caseless_sets) + ur->caseset;\n        for (;;)\n          {\n          if (c < *pp) return -1;\n          if (c == *pp++) break;\n          }\n        }\n      }\n    }\n  else\n#endif\n\n  /* The same code works when not in UTF-8 mode and in UTF-8 mode when there\n  is no UCP support. */\n    {\n    while (length-- > 0)\n      {\n      pcre_uint32 cc, cp;\n      if (eptr >= md->end_subject) return -2;   /* Partial match */\n      cc = UCHAR21TEST(eptr);\n      cp = UCHAR21TEST(p);\n      if (TABLE_GET(cp, md->lcc, cp) != TABLE_GET(cc, md->lcc, cc)) return -1;\n      p++;\n      eptr++;\n      }\n    }\n  }\n\n/* In the caseful case, we can just compare the bytes, whether or not we\nare in UTF-8 mode. */\n\nelse\n  {\n  while (length-- > 0)\n    {\n    if (eptr >= md->end_subject) return -2;   /* Partial match */\n    if (UCHAR21INCTEST(p) != UCHAR21INCTEST(eptr)) return -1;\n    }\n  }\n\nreturn (int)(eptr - eptr_start);\n}\n\n\n\n/***************************************************************************\n****************************************************************************\n                   RECURSION IN THE match() FUNCTION\n\nThe match() function is highly recursive, though not every recursive call\nincreases the recursive depth. Nevertheless, some regular expressions can cause\nit to recurse to a great depth. I was writing for Unix, so I just let it call\nitself recursively. This uses the stack for saving everything that has to be\nsaved for a recursive call. On Unix, the stack can be large, and this works\nfine.\n\nIt turns out that on some non-Unix-like systems there are problems with\nprograms that use a lot of stack. (This despite the fact that every last chip\nhas oodles of memory these days, and techniques for extending the stack have\nbeen known for decades.) So....\n\nThere is a fudge, triggered by defining NO_RECURSE, which avoids recursive\ncalls by keeping local variables that need to be preserved in blocks of memory\nobtained from malloc() instead instead of on the stack. Macros are used to\nachieve this so that the actual code doesn't look very different to what it\nalways used to.\n\nThe original heap-recursive code used longjmp(). However, it seems that this\ncan be very slow on some operating systems. Following a suggestion from Stan\nSwitzer, the use of longjmp() has been abolished, at the cost of having to\nprovide a unique number for each call to RMATCH. There is no way of generating\na sequence of numbers at compile time in C. I have given them names, to make\nthem stand out more clearly.\n\nCrude tests on x86 Linux show a small speedup of around 5-8%. However, on\nFreeBSD, avoiding longjmp() more than halves the time taken to run the standard\ntests. Furthermore, not using longjmp() means that local dynamic variables\ndon't have indeterminate values; this has meant that the frame size can be\nreduced because the result can be \"passed back\" by straight setting of the\nvariable instead of being passed in the frame.\n****************************************************************************\n***************************************************************************/\n\n/* Numbers for RMATCH calls. When this list is changed, the code at HEAP_RETURN\nbelow must be updated in sync.  */\n\nenum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM6,  RM7,  RM8,  RM9,  RM10,\n       RM11,  RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20,\n       RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,\n       RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,\n       RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,\n       RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60,\n       RM61,  RM62, RM63, RM64, RM65, RM66, RM67 };\n\n/* These versions of the macros use the stack, as normal. There are debugging\nversions and production versions. Note that the \"rw\" argument of RMATCH isn't\nactually used in this definition. */\n\n#ifndef NO_RECURSE\n#define REGISTER register\n\n#ifdef PCRE_DEBUG\n#define RMATCH(ra,rb,rc,rd,re,rw) \\\n  { \\\n  printf(\"match() called in line %d\\n\", __LINE__); \\\n  rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1); \\\n  printf(\"to line %d\\n\", __LINE__); \\\n  }\n#define RRETURN(ra) \\\n  { \\\n  printf(\"match() returned %d from line %d\\n\", ra, __LINE__); \\\n  return ra; \\\n  }\n#else\n#define RMATCH(ra,rb,rc,rd,re,rw) \\\n  rrc = match(ra,rb,mstart,rc,rd,re,rdepth+1)\n#define RRETURN(ra) return ra\n#endif\n\n#else\n\n\n/* These versions of the macros manage a private stack on the heap. Note that\nthe \"rd\" argument of RMATCH isn't actually used in this definition. It's the md\nargument of match(), which never changes. */\n\n#define REGISTER\n\n#define RMATCH(ra,rb,rc,rd,re,rw)\\\n  {\\\n  heapframe *newframe = frame->Xnextframe;\\\n  if (newframe == NULL)\\\n    {\\\n    newframe = (heapframe *)(PUBL(stack_malloc))(sizeof(heapframe));\\\n    if (newframe == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\\\n    newframe->Xnextframe = NULL;\\\n    frame->Xnextframe = newframe;\\\n    }\\\n  frame->Xwhere = rw;\\\n  newframe->Xeptr = ra;\\\n  newframe->Xecode = rb;\\\n  newframe->Xmstart = mstart;\\\n  newframe->Xoffset_top = rc;\\\n  newframe->Xeptrb = re;\\\n  newframe->Xrdepth = frame->Xrdepth + 1;\\\n  newframe->Xprevframe = frame;\\\n  frame = newframe;\\\n  DPRINTF((\"restarting from line %d\\n\", __LINE__));\\\n  goto HEAP_RECURSE;\\\n  L_##rw:\\\n  DPRINTF((\"jumped back to line %d\\n\", __LINE__));\\\n  }\n\n#define RRETURN(ra)\\\n  {\\\n  heapframe *oldframe = frame;\\\n  frame = oldframe->Xprevframe;\\\n  if (frame != NULL)\\\n    {\\\n    rrc = ra;\\\n    goto HEAP_RETURN;\\\n    }\\\n  return ra;\\\n  }\n\n\n/* Structure for remembering the local variables in a private frame */\n\ntypedef struct heapframe {\n  struct heapframe *Xprevframe;\n  struct heapframe *Xnextframe;\n\n  /* Function arguments that may change */\n\n  PCRE_PUCHAR Xeptr;\n  const pcre_uchar *Xecode;\n  PCRE_PUCHAR Xmstart;\n  int Xoffset_top;\n  eptrblock *Xeptrb;\n  unsigned int Xrdepth;\n\n  /* Function local variables */\n\n  PCRE_PUCHAR Xcallpat;\n#ifdef SUPPORT_UTF\n  PCRE_PUCHAR Xcharptr;\n#endif\n  PCRE_PUCHAR Xdata;\n  PCRE_PUCHAR Xnext;\n  PCRE_PUCHAR Xpp;\n  PCRE_PUCHAR Xprev;\n  PCRE_PUCHAR Xsaved_eptr;\n\n  recursion_info Xnew_recursive;\n\n  BOOL Xcur_is_word;\n  BOOL Xcondition;\n  BOOL Xprev_is_word;\n\n#ifdef SUPPORT_UCP\n  int Xprop_type;\n  unsigned int Xprop_value;\n  int Xprop_fail_result;\n  int Xoclength;\n  pcre_uchar Xocchars[6];\n#endif\n\n  int Xcodelink;\n  int Xctype;\n  unsigned int Xfc;\n  int Xfi;\n  int Xlength;\n  int Xmax;\n  int Xmin;\n  unsigned int Xnumber;\n  int Xoffset;\n  unsigned int Xop;\n  pcre_int32 Xsave_capture_last;\n  int Xsave_offset1, Xsave_offset2, Xsave_offset3;\n  int Xstacksave[REC_STACK_SAVE_MAX];\n\n  eptrblock Xnewptrb;\n\n  /* Where to jump back to */\n\n  int Xwhere;\n\n} heapframe;\n\n#endif\n\n\n/***************************************************************************\n***************************************************************************/\n\n\n\n/*************************************************\n*         Match from current position            *\n*************************************************/\n\n/* This function is called recursively in many circumstances. Whenever it\nreturns a negative (error) response, the outer incarnation must also return the\nsame response. */\n\n/* These macros pack up tests that are used for partial matching, and which\nappear several times in the code. We set the \"hit end\" flag if the pointer is\nat the end of the subject and also past the start of the subject (i.e.\nsomething has been matched). For hard partial matching, we then return\nimmediately. The second one is used when we already know we are past the end of\nthe subject. */\n\n#define CHECK_PARTIAL()\\\n  if (md->partial != 0 && eptr >= md->end_subject && \\\n      eptr > md->start_used_ptr) \\\n    { \\\n    md->hitend = TRUE; \\\n    if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \\\n    }\n\n#define SCHECK_PARTIAL()\\\n  if (md->partial != 0 && eptr > md->start_used_ptr) \\\n    { \\\n    md->hitend = TRUE; \\\n    if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \\\n    }\n\n\n/* Performance note: It might be tempting to extract commonly used fields from\nthe md structure (e.g. utf, end_subject) into individual variables to improve\nperformance. Tests using gcc on a SPARC disproved this; in the first case, it\nmade performance worse.\n\nArguments:\n   eptr        pointer to current character in subject\n   ecode       pointer to current position in compiled code\n   mstart      pointer to the current match start position (can be modified\n                 by encountering \\K)\n   offset_top  current top pointer\n   md          pointer to \"static\" info for the match\n   eptrb       pointer to chain of blocks containing eptr at start of\n                 brackets - for testing for empty matches\n   rdepth      the recursion depth\n\nReturns:       MATCH_MATCH if matched            )  these values are >= 0\n               MATCH_NOMATCH if failed to match  )\n               a negative MATCH_xxx value for PRUNE, SKIP, etc\n               a negative PCRE_ERROR_xxx value if aborted by an error condition\n                 (e.g. stopped by repeated call or recursion limit)\n*/\n\nstatic int\nmatch(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode,\n  PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb,\n  unsigned int rdepth)\n{\n/* These variables do not need to be preserved over recursion in this function,\nso they can be ordinary variables in all cases. Mark some of them with\n\"register\" because they are used a lot in loops. */\n\nregister int  rrc;         /* Returns from recursive calls */\nregister int  i;           /* Used for loops not involving calls to RMATCH() */\nregister pcre_uint32 c;    /* Character values not kept over RMATCH() calls */\nregister BOOL utf;         /* Local copy of UTF flag for speed */\n\nBOOL minimize, possessive; /* Quantifier options */\nBOOL caseless;\nint condcode;\n\n/* When recursion is not being used, all \"local\" variables that have to be\npreserved over calls to RMATCH() are part of a \"frame\". We set up the top-level\nframe on the stack here; subsequent instantiations are obtained from the heap\nwhenever RMATCH() does a \"recursion\". See the macro definitions above. Putting\nthe top-level on the stack rather than malloc-ing them all gives a performance\nboost in many cases where there is not much \"recursion\". */\n\n#ifdef NO_RECURSE\nheapframe *frame = (heapframe *)md->match_frames_base;\n\n/* Copy in the original argument variables */\n\nframe->Xeptr = eptr;\nframe->Xecode = ecode;\nframe->Xmstart = mstart;\nframe->Xoffset_top = offset_top;\nframe->Xeptrb = eptrb;\nframe->Xrdepth = rdepth;\n\n/* This is where control jumps back to to effect \"recursion\" */\n\nHEAP_RECURSE:\n\n/* Macros make the argument variables come from the current frame */\n\n#define eptr               frame->Xeptr\n#define ecode              frame->Xecode\n#define mstart             frame->Xmstart\n#define offset_top         frame->Xoffset_top\n#define eptrb              frame->Xeptrb\n#define rdepth             frame->Xrdepth\n\n/* Ditto for the local variables */\n\n#ifdef SUPPORT_UTF\n#define charptr            frame->Xcharptr\n#endif\n#define callpat            frame->Xcallpat\n#define codelink           frame->Xcodelink\n#define data               frame->Xdata\n#define next               frame->Xnext\n#define pp                 frame->Xpp\n#define prev               frame->Xprev\n#define saved_eptr         frame->Xsaved_eptr\n\n#define new_recursive      frame->Xnew_recursive\n\n#define cur_is_word        frame->Xcur_is_word\n#define condition          frame->Xcondition\n#define prev_is_word       frame->Xprev_is_word\n\n#ifdef SUPPORT_UCP\n#define prop_type          frame->Xprop_type\n#define prop_value         frame->Xprop_value\n#define prop_fail_result   frame->Xprop_fail_result\n#define oclength           frame->Xoclength\n#define occhars            frame->Xocchars\n#endif\n\n#define ctype              frame->Xctype\n#define fc                 frame->Xfc\n#define fi                 frame->Xfi\n#define length             frame->Xlength\n#define max                frame->Xmax\n#define min                frame->Xmin\n#define number             frame->Xnumber\n#define offset             frame->Xoffset\n#define op                 frame->Xop\n#define save_capture_last  frame->Xsave_capture_last\n#define save_offset1       frame->Xsave_offset1\n#define save_offset2       frame->Xsave_offset2\n#define save_offset3       frame->Xsave_offset3\n#define stacksave          frame->Xstacksave\n\n#define newptrb            frame->Xnewptrb\n\n/* When recursion is being used, local variables are allocated on the stack and\nget preserved during recursion in the normal way. In this environment, fi and\ni, and fc and c, can be the same variables. */\n\n#else         /* NO_RECURSE not defined */\n#define fi i\n#define fc c\n\n/* Many of the following variables are used only in small blocks of the code.\nMy normal style of coding would have declared them within each of those blocks.\nHowever, in order to accommodate the version of this code that uses an external\n\"stack\" implemented on the heap, it is easier to declare them all here, so the\ndeclarations can be cut out in a block. The only declarations within blocks\nbelow are for variables that do not have to be preserved over a recursive call\nto RMATCH(). */\n\n#ifdef SUPPORT_UTF\nconst pcre_uchar *charptr;\n#endif\nconst pcre_uchar *callpat;\nconst pcre_uchar *data;\nconst pcre_uchar *next;\nPCRE_PUCHAR       pp;\nconst pcre_uchar *prev;\nPCRE_PUCHAR       saved_eptr;\n\nrecursion_info new_recursive;\n\nBOOL cur_is_word;\nBOOL condition;\nBOOL prev_is_word;\n\n#ifdef SUPPORT_UCP\nint prop_type;\nunsigned int prop_value;\nint prop_fail_result;\nint oclength;\npcre_uchar occhars[6];\n#endif\n\nint codelink;\nint ctype;\nint length;\nint max;\nint min;\nunsigned int number;\nint offset;\nunsigned int op;\npcre_int32 save_capture_last;\nint save_offset1, save_offset2, save_offset3;\nint stacksave[REC_STACK_SAVE_MAX];\n\neptrblock newptrb;\n\n/* There is a special fudge for calling match() in a way that causes it to\nmeasure the size of its basic stack frame when the stack is being used for\nrecursion. The second argument (ecode) being NULL triggers this behaviour. It\ncannot normally ever be NULL. The return is the negated value of the frame\nsize. */\n\nif (ecode == NULL)\n  {\n  if (rdepth == 0)\n    return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1);\n  else\n    {\n    int len = (int)((char *)&rdepth - (char *)eptr);\n    return (len > 0)? -len : len;\n    }\n  }\n#endif     /* NO_RECURSE */\n\n/* To save space on the stack and in the heap frame, I have doubled up on some\nof the local variables that are used only in localised parts of the code, but\nstill need to be preserved over recursive calls of match(). These macros define\nthe alternative names that are used. */\n\n#define allow_zero    cur_is_word\n#define cbegroup      condition\n#define code_offset   codelink\n#define condassert    condition\n#define matched_once  prev_is_word\n#define foc           number\n#define save_mark     data\n\n/* These statements are here to stop the compiler complaining about unitialized\nvariables. */\n\n#ifdef SUPPORT_UCP\nprop_value = 0;\nprop_fail_result = 0;\n#endif\n\n\n/* This label is used for tail recursion, which is used in a few cases even\nwhen NO_RECURSE is not defined, in order to reduce the amount of stack that is\nused. Thanks to Ian Taylor for noticing this possibility and sending the\noriginal patch. */\n\nTAIL_RECURSE:\n\n/* OK, now we can get on with the real code of the function. Recursive calls\nare specified by the macro RMATCH and RRETURN is used to return. When\nNO_RECURSE is *not* defined, these just turn into a recursive call to match()\nand a \"return\", respectively (possibly with some debugging if PCRE_DEBUG is\ndefined). However, RMATCH isn't like a function call because it's quite a\ncomplicated macro. It has to be used in one particular way. This shouldn't,\nhowever, impact performance when true recursion is being used. */\n\n#ifdef SUPPORT_UTF\nutf = md->utf;       /* Local copy of the flag */\n#else\nutf = FALSE;\n#endif\n\n/* First check that we haven't called match() too many times, or that we\nhaven't exceeded the recursive call limit. */\n\nif (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);\nif (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT);\n\n/* At the start of a group with an unlimited repeat that may match an empty\nstring, the variable md->match_function_type is set to MATCH_CBEGROUP. It is\ndone this way to save having to use another function argument, which would take\nup space on the stack. See also MATCH_CONDASSERT below.\n\nWhen MATCH_CBEGROUP is set, add the current subject pointer to the chain of\nsuch remembered pointers, to be checked when we hit the closing ket, in order\nto break infinite loops that match no characters. When match() is called in\nother circumstances, don't add to the chain. The MATCH_CBEGROUP feature must\nNOT be used with tail recursion, because the memory block that is used is on\nthe stack, so a new one may be required for each match(). */\n\nif (md->match_function_type == MATCH_CBEGROUP)\n  {\n  newptrb.epb_saved_eptr = eptr;\n  newptrb.epb_prev = eptrb;\n  eptrb = &newptrb;\n  md->match_function_type = 0;\n  }\n\n/* Now start processing the opcodes. */\n\nfor (;;)\n  {\n  minimize = possessive = FALSE;\n  op = *ecode;\n\n  switch(op)\n    {\n    case OP_MARK:\n    md->nomatch_mark = ecode + 2;\n    md->mark = NULL;    /* In case previously set by assertion */\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,\n      eptrb, RM55);\n    if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&\n         md->mark == NULL) md->mark = ecode + 2;\n\n    /* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an\n    argument, and we must check whether that argument matches this MARK's\n    argument. It is passed back in md->start_match_ptr (an overloading of that\n    variable). If it does match, we reset that variable to the current subject\n    position and return MATCH_SKIP. Otherwise, pass back the return code\n    unaltered. */\n\n    else if (rrc == MATCH_SKIP_ARG &&\n        STRCMP_UC_UC_TEST(ecode + 2, md->start_match_ptr) == 0)\n      {\n      md->start_match_ptr = eptr;\n      RRETURN(MATCH_SKIP);\n      }\n    RRETURN(rrc);\n\n    case OP_FAIL:\n    RRETURN(MATCH_NOMATCH);\n\n    case OP_COMMIT:\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n      eptrb, RM52);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    RRETURN(MATCH_COMMIT);\n\n    case OP_PRUNE:\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n      eptrb, RM51);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    RRETURN(MATCH_PRUNE);\n\n    case OP_PRUNE_ARG:\n    md->nomatch_mark = ecode + 2;\n    md->mark = NULL;    /* In case previously set by assertion */\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,\n      eptrb, RM56);\n    if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&\n         md->mark == NULL) md->mark = ecode + 2;\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    RRETURN(MATCH_PRUNE);\n\n    case OP_SKIP:\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n      eptrb, RM53);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    md->start_match_ptr = eptr;   /* Pass back current position */\n    RRETURN(MATCH_SKIP);\n\n    /* Note that, for Perl compatibility, SKIP with an argument does NOT set\n    nomatch_mark. When a pattern match ends with a SKIP_ARG for which there was\n    not a matching mark, we have to re-run the match, ignoring the SKIP_ARG\n    that failed and any that precede it (either they also failed, or were not\n    triggered). To do this, we maintain a count of executed SKIP_ARGs. If a\n    SKIP_ARG gets to top level, the match is re-run with md->ignore_skip_arg\n    set to the count of the one that failed. */\n\n    case OP_SKIP_ARG:\n    md->skip_arg_count++;\n    if (md->skip_arg_count <= md->ignore_skip_arg)\n      {\n      ecode += PRIV(OP_lengths)[*ecode] + ecode[1];\n      break;\n      }\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,\n      eptrb, RM57);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n\n    /* Pass back the current skip name by overloading md->start_match_ptr and\n    returning the special MATCH_SKIP_ARG return code. This will either be\n    caught by a matching MARK, or get to the top, where it causes a rematch\n    with md->ignore_skip_arg set to the value of md->skip_arg_count. */\n\n    md->start_match_ptr = ecode + 2;\n    RRETURN(MATCH_SKIP_ARG);\n\n    /* For THEN (and THEN_ARG) we pass back the address of the opcode, so that\n    the branch in which it occurs can be determined. Overload the start of\n    match pointer to do this. */\n\n    case OP_THEN:\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n      eptrb, RM54);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    md->start_match_ptr = ecode;\n    RRETURN(MATCH_THEN);\n\n    case OP_THEN_ARG:\n    md->nomatch_mark = ecode + 2;\n    md->mark = NULL;    /* In case previously set by assertion */\n    RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top,\n      md, eptrb, RM58);\n    if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&\n         md->mark == NULL) md->mark = ecode + 2;\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    md->start_match_ptr = ecode;\n    RRETURN(MATCH_THEN);\n\n    /* Handle an atomic group that does not contain any capturing parentheses.\n    This can be handled like an assertion. Prior to 8.13, all atomic groups\n    were handled this way. In 8.13, the code was changed as below for ONCE, so\n    that backups pass through the group and thereby reset captured values.\n    However, this uses a lot more stack, so in 8.20, atomic groups that do not\n    contain any captures generate OP_ONCE_NC, which can be handled in the old,\n    less stack intensive way.\n\n    Check the alternative branches in turn - the matching won't pass the KET\n    for this kind of subpattern. If any one branch matches, we carry on as at\n    the end of a normal bracket, leaving the subject pointer, but resetting\n    the start-of-match value in case it was changed by \\K. */\n\n    case OP_ONCE_NC:\n    prev = ecode;\n    saved_eptr = eptr;\n    save_mark = md->mark;\n    do\n      {\n      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64);\n      if (rrc == MATCH_MATCH)  /* Note: _not_ MATCH_ACCEPT */\n        {\n        mstart = md->start_match_ptr;\n        break;\n        }\n      if (rrc == MATCH_THEN)\n        {\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          rrc = MATCH_NOMATCH;\n        }\n\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      ecode += GET(ecode,1);\n      md->mark = save_mark;\n      }\n    while (*ecode == OP_ALT);\n\n    /* If hit the end of the group (which could be repeated), fail */\n\n    if (*ecode != OP_ONCE_NC && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH);\n\n    /* Continue as from after the group, updating the offsets high water\n    mark, since extracts may have been taken. */\n\n    do ecode += GET(ecode, 1); while (*ecode == OP_ALT);\n\n    offset_top = md->end_offset_top;\n    eptr = md->end_match_ptr;\n\n    /* For a non-repeating ket, just continue at this level. This also\n    happens for a repeating ket if no characters were matched in the group.\n    This is the forcible breaking of infinite loops as implemented in Perl\n    5.005. */\n\n    if (*ecode == OP_KET || eptr == saved_eptr)\n      {\n      ecode += 1+LINK_SIZE;\n      break;\n      }\n\n    /* The repeating kets try the rest of the pattern or restart from the\n    preceding bracket, in the appropriate order. The second \"call\" of match()\n    uses tail recursion, to avoid using another stack frame. */\n\n    if (*ecode == OP_KETRMIN)\n      {\n      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM65);\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      ecode = prev;\n      goto TAIL_RECURSE;\n      }\n    else  /* OP_KETRMAX */\n      {\n      RMATCH(eptr, prev, offset_top, md, eptrb, RM66);\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      ecode += 1 + LINK_SIZE;\n      goto TAIL_RECURSE;\n      }\n    /* Control never gets here */\n\n    /* Handle a capturing bracket, other than those that are possessive with an\n    unlimited repeat. If there is space in the offset vector, save the current\n    subject position in the working slot at the top of the vector. We mustn't\n    change the current values of the data slot, because they may be set from a\n    previous iteration of this group, and be referred to by a reference inside\n    the group. A failure to match might occur after the group has succeeded,\n    if something later on doesn't match. For this reason, we need to restore\n    the working value and also the values of the final offsets, in case they\n    were set by a previous iteration of the same bracket.\n\n    If there isn't enough space in the offset vector, treat this as if it were\n    a non-capturing bracket. Don't worry about setting the flag for the error\n    case here; that is handled in the code for KET. */\n\n    case OP_CBRA:\n    case OP_SCBRA:\n    number = GET2(ecode, 1+LINK_SIZE);\n    offset = number << 1;\n\n#ifdef PCRE_DEBUG\n    printf(\"start bracket %d\\n\", number);\n    printf(\"subject=\");\n    pchars(eptr, 16, TRUE, md);\n    printf(\"\\n\");\n#endif\n\n    if (offset < md->offset_max)\n      {\n      save_offset1 = md->offset_vector[offset];\n      save_offset2 = md->offset_vector[offset+1];\n      save_offset3 = md->offset_vector[md->offset_end - number];\n      save_capture_last = md->capture_last;\n      save_mark = md->mark;\n\n      DPRINTF((\"saving %d %d %d\\n\", save_offset1, save_offset2, save_offset3));\n      md->offset_vector[md->offset_end - number] =\n        (int)(eptr - md->start_subject);\n\n      for (;;)\n        {\n        if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;\n        RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n          eptrb, RM1);\n        if (rrc == MATCH_ONCE) break;  /* Backing up through an atomic group */\n\n        /* If we backed up to a THEN, check whether it is within the current\n        branch by comparing the address of the THEN that is passed back with\n        the end of the branch. If it is within the current branch, and the\n        branch is one of two or more alternatives (it either starts or ends\n        with OP_ALT), we have reached the limit of THEN's action, so convert\n        the return code to NOMATCH, which will cause normal backtracking to\n        happen from now on. Otherwise, THEN is passed back to an outer\n        alternative. This implements Perl's treatment of parenthesized groups,\n        where a group not containing | does not affect the current alternative,\n        that is, (X) is NOT the same as (X|(*F)). */\n\n        if (rrc == MATCH_THEN)\n          {\n          next = ecode + GET(ecode,1);\n          if (md->start_match_ptr < next &&\n              (*ecode == OP_ALT || *next == OP_ALT))\n            rrc = MATCH_NOMATCH;\n          }\n\n        /* Anything other than NOMATCH is passed back. */\n\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        md->capture_last = save_capture_last;\n        ecode += GET(ecode, 1);\n        md->mark = save_mark;\n        if (*ecode != OP_ALT) break;\n        }\n\n      DPRINTF((\"bracket %d failed\\n\", number));\n      md->offset_vector[offset] = save_offset1;\n      md->offset_vector[offset+1] = save_offset2;\n      md->offset_vector[md->offset_end - number] = save_offset3;\n\n      /* At this point, rrc will be one of MATCH_ONCE or MATCH_NOMATCH. */\n\n      RRETURN(rrc);\n      }\n\n    /* FALL THROUGH ... Insufficient room for saving captured contents. Treat\n    as a non-capturing bracket. */\n\n    /* VVVVVVVVVVVVVVVVVVVVVVVVV */\n    /* VVVVVVVVVVVVVVVVVVVVVVVVV */\n\n    DPRINTF((\"insufficient capture room: treat as non-capturing\\n\"));\n\n    /* VVVVVVVVVVVVVVVVVVVVVVVVV */\n    /* VVVVVVVVVVVVVVVVVVVVVVVVV */\n\n    /* Non-capturing or atomic group, except for possessive with unlimited\n    repeat and ONCE group with no captures. Loop for all the alternatives.\n\n    When we get to the final alternative within the brackets, we used to return\n    the result of a recursive call to match() whatever happened so it was\n    possible to reduce stack usage by turning this into a tail recursion,\n    except in the case of a possibly empty group. However, now that there is\n    the possiblity of (*THEN) occurring in the final alternative, this\n    optimization is no longer always possible.\n\n    We can optimize if we know there are no (*THEN)s in the pattern; at present\n    this is the best that can be done.\n\n    MATCH_ONCE is returned when the end of an atomic group is successfully\n    reached, but subsequent matching fails. It passes back up the tree (causing\n    captured values to be reset) until the original atomic group level is\n    reached. This is tested by comparing md->once_target with the start of the\n    group. At this point, the return is converted into MATCH_NOMATCH so that\n    previous backup points can be taken. */\n\n    case OP_ONCE:\n    case OP_BRA:\n    case OP_SBRA:\n    DPRINTF((\"start non-capturing bracket\\n\"));\n\n    for (;;)\n      {\n      if (op >= OP_SBRA || op == OP_ONCE)\n        md->match_function_type = MATCH_CBEGROUP;\n\n      /* If this is not a possibly empty group, and there are no (*THEN)s in\n      the pattern, and this is the final alternative, optimize as described\n      above. */\n\n      else if (!md->hasthen && ecode[GET(ecode, 1)] != OP_ALT)\n        {\n        ecode += PRIV(OP_lengths)[*ecode];\n        goto TAIL_RECURSE;\n        }\n\n      /* In all other cases, we have to make another call to match(). */\n\n      save_mark = md->mark;\n      save_capture_last = md->capture_last;\n      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb,\n        RM2);\n\n      /* See comment in the code for capturing groups above about handling\n      THEN. */\n\n      if (rrc == MATCH_THEN)\n        {\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          rrc = MATCH_NOMATCH;\n        }\n\n      if (rrc != MATCH_NOMATCH)\n        {\n        if (rrc == MATCH_ONCE)\n          {\n          const pcre_uchar *scode = ecode;\n          if (*scode != OP_ONCE)           /* If not at start, find it */\n            {\n            while (*scode == OP_ALT) scode += GET(scode, 1);\n            scode -= GET(scode, 1);\n            }\n          if (md->once_target == scode) rrc = MATCH_NOMATCH;\n          }\n        RRETURN(rrc);\n        }\n      ecode += GET(ecode, 1);\n      md->mark = save_mark;\n      if (*ecode != OP_ALT) break;\n      md->capture_last = save_capture_last;\n      }\n\n    RRETURN(MATCH_NOMATCH);\n\n    /* Handle possessive capturing brackets with an unlimited repeat. We come\n    here from BRAZERO with allow_zero set TRUE. The offset_vector values are\n    handled similarly to the normal case above. However, the matching is\n    different. The end of these brackets will always be OP_KETRPOS, which\n    returns MATCH_KETRPOS without going further in the pattern. By this means\n    we can handle the group by iteration rather than recursion, thereby\n    reducing the amount of stack needed. */\n\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    allow_zero = FALSE;\n\n    POSSESSIVE_CAPTURE:\n    number = GET2(ecode, 1+LINK_SIZE);\n    offset = number << 1;\n\n#ifdef PCRE_DEBUG\n    printf(\"start possessive bracket %d\\n\", number);\n    printf(\"subject=\");\n    pchars(eptr, 16, TRUE, md);\n    printf(\"\\n\");\n#endif\n\n    if (offset >= md->offset_max) goto POSSESSIVE_NON_CAPTURE;\n\n    matched_once = FALSE;\n    code_offset = (int)(ecode - md->start_code);\n\n    save_offset1 = md->offset_vector[offset];\n    save_offset2 = md->offset_vector[offset+1];\n    save_offset3 = md->offset_vector[md->offset_end - number];\n    save_capture_last = md->capture_last;\n\n    DPRINTF((\"saving %d %d %d\\n\", save_offset1, save_offset2, save_offset3));\n\n    /* Each time round the loop, save the current subject position for use\n    when the group matches. For MATCH_MATCH, the group has matched, so we\n    restart it with a new subject starting position, remembering that we had\n    at least one match. For MATCH_NOMATCH, carry on with the alternatives, as\n    usual. If we haven't matched any alternatives in any iteration, check to\n    see if a previous iteration matched. If so, the group has matched;\n    continue from afterwards. Otherwise it has failed; restore the previous\n    capture values before returning NOMATCH. */\n\n    for (;;)\n      {\n      md->offset_vector[md->offset_end - number] =\n        (int)(eptr - md->start_subject);\n      if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;\n      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n        eptrb, RM63);\n      if (rrc == MATCH_KETRPOS)\n        {\n        offset_top = md->end_offset_top;\n        ecode = md->start_code + code_offset;\n        save_capture_last = md->capture_last;\n        matched_once = TRUE;\n        mstart = md->start_match_ptr;    /* In case \\K changed it */\n        if (eptr == md->end_match_ptr)   /* Matched an empty string */\n          {\n          do ecode += GET(ecode, 1); while (*ecode == OP_ALT);\n          break;\n          }\n        eptr = md->end_match_ptr;\n        continue;\n        }\n\n      /* See comment in the code for capturing groups above about handling\n      THEN. */\n\n      if (rrc == MATCH_THEN)\n        {\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          rrc = MATCH_NOMATCH;\n        }\n\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      md->capture_last = save_capture_last;\n      ecode += GET(ecode, 1);\n      if (*ecode != OP_ALT) break;\n      }\n\n    if (!matched_once)\n      {\n      md->offset_vector[offset] = save_offset1;\n      md->offset_vector[offset+1] = save_offset2;\n      md->offset_vector[md->offset_end - number] = save_offset3;\n      }\n\n    if (allow_zero || matched_once)\n      {\n      ecode += 1 + LINK_SIZE;\n      break;\n      }\n\n    RRETURN(MATCH_NOMATCH);\n\n    /* Non-capturing possessive bracket with unlimited repeat. We come here\n    from BRAZERO with allow_zero = TRUE. The code is similar to the above,\n    without the capturing complication. It is written out separately for speed\n    and cleanliness. */\n\n    case OP_BRAPOS:\n    case OP_SBRAPOS:\n    allow_zero = FALSE;\n\n    POSSESSIVE_NON_CAPTURE:\n    matched_once = FALSE;\n    code_offset = (int)(ecode - md->start_code);\n    save_capture_last = md->capture_last;\n\n    for (;;)\n      {\n      if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP;\n      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,\n        eptrb, RM48);\n      if (rrc == MATCH_KETRPOS)\n        {\n        offset_top = md->end_offset_top;\n        ecode = md->start_code + code_offset;\n        matched_once = TRUE;\n        mstart = md->start_match_ptr;   /* In case \\K reset it */\n        if (eptr == md->end_match_ptr)  /* Matched an empty string */\n          {\n          do ecode += GET(ecode, 1); while (*ecode == OP_ALT);\n          break;\n          }\n        eptr = md->end_match_ptr;\n        continue;\n        }\n\n      /* See comment in the code for capturing groups above about handling\n      THEN. */\n\n      if (rrc == MATCH_THEN)\n        {\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          rrc = MATCH_NOMATCH;\n        }\n\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      ecode += GET(ecode, 1);\n      if (*ecode != OP_ALT) break;\n      md->capture_last = save_capture_last;\n      }\n\n    if (matched_once || allow_zero)\n      {\n      ecode += 1 + LINK_SIZE;\n      break;\n      }\n    RRETURN(MATCH_NOMATCH);\n\n    /* Control never reaches here. */\n\n    /* Conditional group: compilation checked that there are no more than two\n    branches. If the condition is false, skipping the first branch takes us\n    past the end of the item if there is only one branch, but that's exactly\n    what we want. */\n\n    case OP_COND:\n    case OP_SCOND:\n\n    /* The variable codelink will be added to ecode when the condition is\n    false, to get to the second branch. Setting it to the offset to the ALT\n    or KET, then incrementing ecode achieves this effect. We now have ecode\n    pointing to the condition or callout. */\n\n    codelink = GET(ecode, 1);   /* Offset to the second branch */\n    ecode += 1 + LINK_SIZE;     /* From this opcode */\n\n    /* Because of the way auto-callout works during compile, a callout item is\n    inserted between OP_COND and an assertion condition. */\n\n    if (*ecode == OP_CALLOUT)\n      {\n      if (PUBL(callout) != NULL)\n        {\n        PUBL(callout_block) cb;\n        cb.version          = 2;   /* Version 1 of the callout block */\n        cb.callout_number   = ecode[1];\n        cb.offset_vector    = md->offset_vector;\n#if defined COMPILE_PCRE8\n        cb.subject          = (PCRE_SPTR)md->start_subject;\n#elif defined COMPILE_PCRE16\n        cb.subject          = (PCRE_SPTR16)md->start_subject;\n#elif defined COMPILE_PCRE32\n        cb.subject          = (PCRE_SPTR32)md->start_subject;\n#endif\n        cb.subject_length   = (int)(md->end_subject - md->start_subject);\n        cb.start_match      = (int)(mstart - md->start_subject);\n        cb.current_position = (int)(eptr - md->start_subject);\n        cb.pattern_position = GET(ecode, 2);\n        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);\n        cb.capture_top      = offset_top/2;\n        cb.capture_last     = md->capture_last & CAPLMASK;\n        /* Internal change requires this for API compatibility. */\n        if (cb.capture_last == 0) cb.capture_last = -1;\n        cb.callout_data     = md->callout_data;\n        cb.mark             = md->nomatch_mark;\n        if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);\n        if (rrc < 0) RRETURN(rrc);\n        }\n\n      /* Advance ecode past the callout, so it now points to the condition. We\n      must adjust codelink so that the value of ecode+codelink is unchanged. */\n\n      ecode += PRIV(OP_lengths)[OP_CALLOUT];\n      codelink -= PRIV(OP_lengths)[OP_CALLOUT];\n      }\n\n    /* Test the various possible conditions */\n\n    condition = FALSE;\n    switch(condcode = *ecode)\n      {\n      case OP_RREF:         /* Numbered group recursion test */\n      if (md->recursive != NULL)     /* Not recursing => FALSE */\n        {\n        unsigned int recno = GET2(ecode, 1);   /* Recursion group number*/\n        condition = (recno == RREF_ANY || recno == md->recursive->group_num);\n        }\n      break;\n\n      case OP_DNRREF:       /* Duplicate named group recursion test */\n      if (md->recursive != NULL)\n        {\n        int count = GET2(ecode, 1 + IMM2_SIZE);\n        pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;\n        while (count-- > 0)\n          {\n          unsigned int recno = GET2(slot, 0);\n          condition = recno == md->recursive->group_num;\n          if (condition) break;\n          slot += md->name_entry_size;\n          }\n        }\n      break;\n\n      case OP_CREF:         /* Numbered group used test */\n      offset = GET2(ecode, 1) << 1;  /* Doubled ref number */\n      condition = offset < offset_top && md->offset_vector[offset] >= 0;\n      break;\n\n      case OP_DNCREF:      /* Duplicate named group used test */\n        {\n        int count = GET2(ecode, 1 + IMM2_SIZE);\n        pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;\n        while (count-- > 0)\n          {\n          offset = GET2(slot, 0) << 1;\n          condition = offset < offset_top && md->offset_vector[offset] >= 0;\n          if (condition) break;\n          slot += md->name_entry_size;\n          }\n        }\n      break;\n\n      case OP_DEF:     /* DEFINE - always false */\n      case OP_FAIL:    /* From optimized (?!) condition */\n      break;\n\n      /* The condition is an assertion. Call match() to evaluate it - setting\n      md->match_function_type to MATCH_CONDASSERT causes it to stop at the end\n      of an assertion. */\n\n      default:\n      md->match_function_type = MATCH_CONDASSERT;\n      RMATCH(eptr, ecode, offset_top, md, NULL, RM3);\n      if (rrc == MATCH_MATCH)\n        {\n        if (md->end_offset_top > offset_top)\n          offset_top = md->end_offset_top;  /* Captures may have happened */\n        condition = TRUE;\n\n        /* Advance ecode past the assertion to the start of the first branch,\n        but adjust it so that the general choosing code below works. If the\n        assertion has a quantifier that allows zero repeats we must skip over\n        the BRAZERO. This is a lunatic thing to do, but somebody did! */\n\n        if (*ecode == OP_BRAZERO) ecode++;\n        ecode += GET(ecode, 1);\n        while (*ecode == OP_ALT) ecode += GET(ecode, 1);\n        ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode];\n        }\n\n      /* PCRE doesn't allow the effect of (*THEN) to escape beyond an\n      assertion; it is therefore treated as NOMATCH. Any other return is an\n      error. */\n\n      else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN)\n        {\n        RRETURN(rrc);         /* Need braces because of following else */\n        }\n      break;\n      }\n\n    /* Choose branch according to the condition */\n\n    ecode += condition? PRIV(OP_lengths)[condcode] : codelink;\n\n    /* We are now at the branch that is to be obeyed. As there is only one, we\n    can use tail recursion to avoid using another stack frame, except when\n    there is unlimited repeat of a possibly empty group. In the latter case, a\n    recursive call to match() is always required, unless the second alternative\n    doesn't exist, in which case we can just plough on. Note that, for\n    compatibility with Perl, the | in a conditional group is NOT treated as\n    creating two alternatives. If a THEN is encountered in the branch, it\n    propagates out to the enclosing alternative (unless nested in a deeper set\n    of alternatives, of course). */\n\n    if (condition || ecode[-(1+LINK_SIZE)] == OP_ALT)\n      {\n      if (op != OP_SCOND)\n        {\n        goto TAIL_RECURSE;\n        }\n\n      md->match_function_type = MATCH_CBEGROUP;\n      RMATCH(eptr, ecode, offset_top, md, eptrb, RM49);\n      RRETURN(rrc);\n      }\n\n     /* Condition false & no alternative; continue after the group. */\n\n    else\n      {\n      }\n    break;\n\n\n    /* Before OP_ACCEPT there may be any number of OP_CLOSE opcodes,\n    to close any currently open capturing brackets. */\n\n    case OP_CLOSE:\n    number = GET2(ecode, 1);   /* Must be less than 65536 */\n    offset = number << 1;\n\n#ifdef PCRE_DEBUG\n      printf(\"end bracket %d at *ACCEPT\", number);\n      printf(\"\\n\");\n#endif\n\n    md->capture_last = (md->capture_last & OVFLMASK) | number;\n    if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else\n      {\n      md->offset_vector[offset] =\n        md->offset_vector[md->offset_end - number];\n      md->offset_vector[offset+1] = (int)(eptr - md->start_subject);\n\n      /* If this group is at or above the current highwater mark, ensure that\n      any groups between the current high water mark and this group are marked\n      unset and then update the high water mark. */\n\n      if (offset >= offset_top)\n        {\n        register int *iptr = md->offset_vector + offset_top;\n        register int *iend = md->offset_vector + offset;\n        while (iptr < iend) *iptr++ = -1;\n        offset_top = offset + 2;\n        }\n      }\n    ecode += 1 + IMM2_SIZE;\n    break;\n\n\n    /* End of the pattern, either real or forced. */\n\n    case OP_END:\n    case OP_ACCEPT:\n    case OP_ASSERT_ACCEPT:\n\n    /* If we have matched an empty string, fail if not in an assertion and not\n    in a recursion if either PCRE_NOTEMPTY is set, or if PCRE_NOTEMPTY_ATSTART\n    is set and we have matched at the start of the subject. In both cases,\n    backtracking will then try other alternatives, if any. */\n\n    if (eptr == mstart && op != OP_ASSERT_ACCEPT &&\n         md->recursive == NULL &&\n         (md->notempty ||\n           (md->notempty_atstart &&\n             mstart == md->start_subject + md->start_offset)))\n      RRETURN(MATCH_NOMATCH);\n\n    /* Otherwise, we have a match. */\n\n    md->end_match_ptr = eptr;           /* Record where we ended */\n    md->end_offset_top = offset_top;    /* and how many extracts were taken */\n    md->start_match_ptr = mstart;       /* and the start (\\K can modify) */\n\n    /* For some reason, the macros don't work properly if an expression is\n    given as the argument to RRETURN when the heap is in use. */\n\n    rrc = (op == OP_END)? MATCH_MATCH : MATCH_ACCEPT;\n    RRETURN(rrc);\n\n    /* Assertion brackets. Check the alternative branches in turn - the\n    matching won't pass the KET for an assertion. If any one branch matches,\n    the assertion is true. Lookbehind assertions have an OP_REVERSE item at the\n    start of each branch to move the current point backwards, so the code at\n    this level is identical to the lookahead case. When the assertion is part\n    of a condition, we want to return immediately afterwards. The caller of\n    this incarnation of the match() function will have set MATCH_CONDASSERT in\n    md->match_function type, and one of these opcodes will be the first opcode\n    that is processed. We use a local variable that is preserved over calls to\n    match() to remember this case. */\n\n    case OP_ASSERT:\n    case OP_ASSERTBACK:\n    save_mark = md->mark;\n    if (md->match_function_type == MATCH_CONDASSERT)\n      {\n      condassert = TRUE;\n      md->match_function_type = 0;\n      }\n    else condassert = FALSE;\n\n    /* Loop for each branch */\n\n    do\n      {\n      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4);\n\n      /* A match means that the assertion is true; break out of the loop\n      that matches its alternatives. */\n\n      if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)\n        {\n        mstart = md->start_match_ptr;   /* In case \\K reset it */\n        break;\n        }\n\n      /* If not matched, restore the previous mark setting. */\n\n      md->mark = save_mark;\n\n      /* See comment in the code for capturing groups above about handling\n      THEN. */\n\n      if (rrc == MATCH_THEN)\n        {\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          rrc = MATCH_NOMATCH;\n        }\n\n      /* Anything other than NOMATCH causes the entire assertion to fail,\n      passing back the return code. This includes COMMIT, SKIP, PRUNE and an\n      uncaptured THEN, which means they take their normal effect. This\n      consistent approach does not always have exactly the same effect as in\n      Perl. */\n\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      ecode += GET(ecode, 1);\n      }\n    while (*ecode == OP_ALT);   /* Continue for next alternative */\n\n    /* If we have tried all the alternative branches, the assertion has\n    failed. If not, we broke out after a match. */\n\n    if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);\n\n    /* If checking an assertion for a condition, return MATCH_MATCH. */\n\n    if (condassert) RRETURN(MATCH_MATCH);\n\n    /* Continue from after a successful assertion, updating the offsets high\n    water mark, since extracts may have been taken during the assertion. */\n\n    do ecode += GET(ecode,1); while (*ecode == OP_ALT);\n    ecode += 1 + LINK_SIZE;\n    offset_top = md->end_offset_top;\n    continue;\n\n    /* Negative assertion: all branches must fail to match for the assertion to\n    succeed. */\n\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK_NOT:\n    save_mark = md->mark;\n    if (md->match_function_type == MATCH_CONDASSERT)\n      {\n      condassert = TRUE;\n      md->match_function_type = 0;\n      }\n    else condassert = FALSE;\n\n    /* Loop for each alternative branch. */\n\n    do\n      {\n      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);\n      md->mark = save_mark;   /* Always restore the mark setting */\n\n      switch(rrc)\n        {\n        case MATCH_MATCH:            /* A successful match means */\n        case MATCH_ACCEPT:           /* the assertion has failed. */\n        RRETURN(MATCH_NOMATCH);\n\n        case MATCH_NOMATCH:          /* Carry on with next branch */\n        break;\n\n        /* See comment in the code for capturing groups above about handling\n        THEN. */\n\n        case MATCH_THEN:\n        next = ecode + GET(ecode,1);\n        if (md->start_match_ptr < next &&\n            (*ecode == OP_ALT || *next == OP_ALT))\n          {\n          rrc = MATCH_NOMATCH;\n          break;\n          }\n        /* Otherwise fall through. */\n\n        /* COMMIT, SKIP, PRUNE, and an uncaptured THEN cause the whole\n        assertion to fail to match, without considering any more alternatives.\n        Failing to match means the assertion is true. This is a consistent\n        approach, but does not always have the same effect as in Perl. */\n\n        case MATCH_COMMIT:\n        case MATCH_SKIP:\n        case MATCH_SKIP_ARG:\n        case MATCH_PRUNE:\n        do ecode += GET(ecode,1); while (*ecode == OP_ALT);\n        goto NEG_ASSERT_TRUE;   /* Break out of alternation loop */\n\n        /* Anything else is an error */\n\n        default:\n        RRETURN(rrc);\n        }\n\n      /* Continue with next branch */\n\n      ecode += GET(ecode,1);\n      }\n    while (*ecode == OP_ALT);\n\n    /* All branches in the assertion failed to match. */\n\n    NEG_ASSERT_TRUE:\n    if (condassert) RRETURN(MATCH_MATCH);  /* Condition assertion */\n    ecode += 1 + LINK_SIZE;                /* Continue with current branch */\n    continue;\n\n    /* Move the subject pointer back. This occurs only at the start of\n    each branch of a lookbehind assertion. If we are too close to the start to\n    move back, this match function fails. When working with UTF-8 we move\n    back a number of characters, not bytes. */\n\n    case OP_REVERSE:\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      i = GET(ecode, 1);\n      while (i-- > 0)\n        {\n        eptr--;\n        if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);\n        BACKCHAR(eptr);\n        }\n      }\n    else\n#endif\n\n    /* No UTF-8 support, or not in UTF-8 mode: count is byte count */\n\n      {\n      eptr -= GET(ecode, 1);\n      if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);\n      }\n\n    /* Save the earliest consulted character, then skip to next op code */\n\n    if (eptr < md->start_used_ptr) md->start_used_ptr = eptr;\n    ecode += 1 + LINK_SIZE;\n    break;\n\n    /* The callout item calls an external function, if one is provided, passing\n    details of the match so far. This is mainly for debugging, though the\n    function is able to force a failure. */\n\n    case OP_CALLOUT:\n    if (PUBL(callout) != NULL)\n      {\n      PUBL(callout_block) cb;\n      cb.version          = 2;   /* Version 1 of the callout block */\n      cb.callout_number   = ecode[1];\n      cb.offset_vector    = md->offset_vector;\n#if defined COMPILE_PCRE8\n      cb.subject          = (PCRE_SPTR)md->start_subject;\n#elif defined COMPILE_PCRE16\n      cb.subject          = (PCRE_SPTR16)md->start_subject;\n#elif defined COMPILE_PCRE32\n      cb.subject          = (PCRE_SPTR32)md->start_subject;\n#endif\n      cb.subject_length   = (int)(md->end_subject - md->start_subject);\n      cb.start_match      = (int)(mstart - md->start_subject);\n      cb.current_position = (int)(eptr - md->start_subject);\n      cb.pattern_position = GET(ecode, 2);\n      cb.next_item_length = GET(ecode, 2 + LINK_SIZE);\n      cb.capture_top      = offset_top/2;\n      cb.capture_last     = md->capture_last & CAPLMASK;\n      /* Internal change requires this for API compatibility. */\n      if (cb.capture_last == 0) cb.capture_last = -1;\n      cb.callout_data     = md->callout_data;\n      cb.mark             = md->nomatch_mark;\n      if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);\n      if (rrc < 0) RRETURN(rrc);\n      }\n    ecode += 2 + 2*LINK_SIZE;\n    break;\n\n    /* Recursion either matches the current regex, or some subexpression. The\n    offset data is the offset to the starting bracket from the start of the\n    whole pattern. (This is so that it works from duplicated subpatterns.)\n\n    The state of the capturing groups is preserved over recursion, and\n    re-instated afterwards. We don't know how many are started and not yet\n    finished (offset_top records the completed total) so we just have to save\n    all the potential data. There may be up to 65535 such values, which is too\n    large to put on the stack, but using malloc for small numbers seems\n    expensive. As a compromise, the stack is used when there are no more than\n    REC_STACK_SAVE_MAX values to store; otherwise malloc is used.\n\n    There are also other values that have to be saved. We use a chained\n    sequence of blocks that actually live on the stack. Thanks to Robin Houston\n    for the original version of this logic. It has, however, been hacked around\n    a lot, so he is not to blame for the current way it works. */\n\n    case OP_RECURSE:\n      {\n      recursion_info *ri;\n      unsigned int recno;\n\n      callpat = md->start_code + GET(ecode, 1);\n      recno = (callpat == md->start_code)? 0 :\n        GET2(callpat, 1 + LINK_SIZE);\n\n      /* Check for repeating a recursion without advancing the subject pointer.\n      This should catch convoluted mutual recursions. (Some simple cases are\n      caught at compile time.) */\n\n      for (ri = md->recursive; ri != NULL; ri = ri->prevrec)\n        if (recno == ri->group_num && eptr == ri->subject_position)\n          RRETURN(PCRE_ERROR_RECURSELOOP);\n\n      /* Add to \"recursing stack\" */\n\n      new_recursive.group_num = recno;\n      new_recursive.saved_capture_last = md->capture_last;\n      new_recursive.subject_position = eptr;\n      new_recursive.prevrec = md->recursive;\n      md->recursive = &new_recursive;\n\n      /* Where to continue from afterwards */\n\n      ecode += 1 + LINK_SIZE;\n\n      /* Now save the offset data */\n\n      new_recursive.saved_max = md->offset_end;\n      if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)\n        new_recursive.offset_save = stacksave;\n      else\n        {\n        new_recursive.offset_save =\n          (int *)(PUBL(malloc))(new_recursive.saved_max * sizeof(int));\n        if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\n        }\n      memcpy(new_recursive.offset_save, md->offset_vector,\n            new_recursive.saved_max * sizeof(int));\n\n      /* OK, now we can do the recursion. After processing each alternative,\n      restore the offset data and the last captured value. If there were nested\n      recursions, md->recursive might be changed, so reset it before looping.\n      */\n\n      DPRINTF((\"Recursing into group %d\\n\", new_recursive.group_num));\n      cbegroup = (*callpat >= OP_SBRA);\n      do\n        {\n        if (cbegroup) md->match_function_type = MATCH_CBEGROUP;\n        RMATCH(eptr, callpat + PRIV(OP_lengths)[*callpat], offset_top,\n          md, eptrb, RM6);\n        memcpy(md->offset_vector, new_recursive.offset_save,\n            new_recursive.saved_max * sizeof(int));\n        md->capture_last = new_recursive.saved_capture_last;\n        md->recursive = new_recursive.prevrec;\n        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)\n          {\n          DPRINTF((\"Recursion matched\\n\"));\n          if (new_recursive.offset_save != stacksave)\n            (PUBL(free))(new_recursive.offset_save);\n\n          /* Set where we got to in the subject, and reset the start in case\n          it was changed by \\K. This *is* propagated back out of a recursion,\n          for Perl compatibility. */\n\n          eptr = md->end_match_ptr;\n          mstart = md->start_match_ptr;\n          goto RECURSION_MATCHED;        /* Exit loop; end processing */\n          }\n\n        /* PCRE does not allow THEN, SKIP, PRUNE or COMMIT to escape beyond a\n        recursion; they cause a NOMATCH for the entire recursion. These codes\n        are defined in a range that can be tested for. */\n\n        if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)\n          {\n          if (new_recursive.offset_save != stacksave)\n            (PUBL(free))(new_recursive.offset_save);\n          RRETURN(MATCH_NOMATCH);\n          }\n\n        /* Any return code other than NOMATCH is an error. */\n\n        if (rrc != MATCH_NOMATCH)\n          {\n          DPRINTF((\"Recursion gave error %d\\n\", rrc));\n          if (new_recursive.offset_save != stacksave)\n            (PUBL(free))(new_recursive.offset_save);\n          RRETURN(rrc);\n          }\n\n        md->recursive = &new_recursive;\n        callpat += GET(callpat, 1);\n        }\n      while (*callpat == OP_ALT);\n\n      DPRINTF((\"Recursion didn't match\\n\"));\n      md->recursive = new_recursive.prevrec;\n      if (new_recursive.offset_save != stacksave)\n        (PUBL(free))(new_recursive.offset_save);\n      RRETURN(MATCH_NOMATCH);\n      }\n\n    RECURSION_MATCHED:\n    break;\n\n    /* An alternation is the end of a branch; scan along to find the end of the\n    bracketed group and go to there. */\n\n    case OP_ALT:\n    do ecode += GET(ecode,1); while (*ecode == OP_ALT);\n    break;\n\n    /* BRAZERO, BRAMINZERO and SKIPZERO occur just before a bracket group,\n    indicating that it may occur zero times. It may repeat infinitely, or not\n    at all - i.e. it could be ()* or ()? or even (){0} in the pattern. Brackets\n    with fixed upper repeat limits are compiled as a number of copies, with the\n    optional ones preceded by BRAZERO or BRAMINZERO. */\n\n    case OP_BRAZERO:\n    next = ecode + 1;\n    RMATCH(eptr, next, offset_top, md, eptrb, RM10);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    do next += GET(next, 1); while (*next == OP_ALT);\n    ecode = next + 1 + LINK_SIZE;\n    break;\n\n    case OP_BRAMINZERO:\n    next = ecode + 1;\n    do next += GET(next, 1); while (*next == OP_ALT);\n    RMATCH(eptr, next + 1+LINK_SIZE, offset_top, md, eptrb, RM11);\n    if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n    ecode++;\n    break;\n\n    case OP_SKIPZERO:\n    next = ecode+1;\n    do next += GET(next,1); while (*next == OP_ALT);\n    ecode = next + 1 + LINK_SIZE;\n    break;\n\n    /* BRAPOSZERO occurs before a possessive bracket group. Don't do anything\n    here; just jump to the group, with allow_zero set TRUE. */\n\n    case OP_BRAPOSZERO:\n    op = *(++ecode);\n    allow_zero = TRUE;\n    if (op == OP_CBRAPOS || op == OP_SCBRAPOS) goto POSSESSIVE_CAPTURE;\n      goto POSSESSIVE_NON_CAPTURE;\n\n    /* End of a group, repeated or non-repeating. */\n\n    case OP_KET:\n    case OP_KETRMIN:\n    case OP_KETRMAX:\n    case OP_KETRPOS:\n    prev = ecode - GET(ecode, 1);\n\n    /* If this was a group that remembered the subject start, in order to break\n    infinite repeats of empty string matches, retrieve the subject start from\n    the chain. Otherwise, set it NULL. */\n\n    if (*prev >= OP_SBRA || *prev == OP_ONCE)\n      {\n      saved_eptr = eptrb->epb_saved_eptr;   /* Value at start of group */\n      eptrb = eptrb->epb_prev;              /* Backup to previous group */\n      }\n    else saved_eptr = NULL;\n\n    /* If we are at the end of an assertion group or a non-capturing atomic\n    group, stop matching and return MATCH_MATCH, but record the current high\n    water mark for use by positive assertions. We also need to record the match\n    start in case it was changed by \\K. */\n\n    if ((*prev >= OP_ASSERT && *prev <= OP_ASSERTBACK_NOT) ||\n         *prev == OP_ONCE_NC)\n      {\n      md->end_match_ptr = eptr;      /* For ONCE_NC */\n      md->end_offset_top = offset_top;\n      md->start_match_ptr = mstart;\n      RRETURN(MATCH_MATCH);         /* Sets md->mark */\n      }\n\n    /* For capturing groups we have to check the group number back at the start\n    and if necessary complete handling an extraction by setting the offsets and\n    bumping the high water mark. Whole-pattern recursion is coded as a recurse\n    into group 0, so it won't be picked up here. Instead, we catch it when the\n    OP_END is reached. Other recursion is handled here. We just have to record\n    the current subject position and start match pointer and give a MATCH\n    return. */\n\n    if (*prev == OP_CBRA || *prev == OP_SCBRA ||\n        *prev == OP_CBRAPOS || *prev == OP_SCBRAPOS)\n      {\n      number = GET2(prev, 1+LINK_SIZE);\n      offset = number << 1;\n\n#ifdef PCRE_DEBUG\n      printf(\"end bracket %d\", number);\n      printf(\"\\n\");\n#endif\n\n      /* Handle a recursively called group. */\n\n      if (md->recursive != NULL && md->recursive->group_num == number)\n        {\n        md->end_match_ptr = eptr;\n        md->start_match_ptr = mstart;\n        RRETURN(MATCH_MATCH);\n        }\n\n      /* Deal with capturing */\n\n      md->capture_last = (md->capture_last & OVFLMASK) | number;\n      if (offset >= md->offset_max) md->capture_last |= OVFLBIT; else\n        {\n        /* If offset is greater than offset_top, it means that we are\n        \"skipping\" a capturing group, and that group's offsets must be marked\n        unset. In earlier versions of PCRE, all the offsets were unset at the\n        start of matching, but this doesn't work because atomic groups and\n        assertions can cause a value to be set that should later be unset.\n        Example: matching /(?>(a))b|(a)c/ against \"ac\". This sets group 1 as\n        part of the atomic group, but this is not on the final matching path,\n        so must be unset when 2 is set. (If there is no group 2, there is no\n        problem, because offset_top will then be 2, indicating no capture.) */\n\n        if (offset > offset_top)\n          {\n          register int *iptr = md->offset_vector + offset_top;\n          register int *iend = md->offset_vector + offset;\n          while (iptr < iend) *iptr++ = -1;\n          }\n\n        /* Now make the extraction */\n\n        md->offset_vector[offset] =\n          md->offset_vector[md->offset_end - number];\n        md->offset_vector[offset+1] = (int)(eptr - md->start_subject);\n        if (offset_top <= offset) offset_top = offset + 2;\n        }\n      }\n\n    /* OP_KETRPOS is a possessive repeating ket. Remember the current position,\n    and return the MATCH_KETRPOS. This makes it possible to do the repeats one\n    at a time from the outer level, thus saving stack. This must precede the\n    empty string test - in this case that test is done at the outer level. */\n\n    if (*ecode == OP_KETRPOS)\n      {\n      md->start_match_ptr = mstart;    /* In case \\K reset it */\n      md->end_match_ptr = eptr;\n      md->end_offset_top = offset_top;\n      RRETURN(MATCH_KETRPOS);\n      }\n\n    /* For an ordinary non-repeating ket, just continue at this level. This\n    also happens for a repeating ket if no characters were matched in the\n    group. This is the forcible breaking of infinite loops as implemented in\n    Perl 5.005. For a non-repeating atomic group that includes captures,\n    establish a backup point by processing the rest of the pattern at a lower\n    level. If this results in a NOMATCH return, pass MATCH_ONCE back to the\n    original OP_ONCE level, thereby bypassing intermediate backup points, but\n    resetting any captures that happened along the way. */\n\n    if (*ecode == OP_KET || eptr == saved_eptr)\n      {\n      if (*prev == OP_ONCE)\n        {\n        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM12);\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        md->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */\n        RRETURN(MATCH_ONCE);\n        }\n      ecode += 1 + LINK_SIZE;    /* Carry on at this level */\n      break;\n      }\n\n    /* The normal repeating kets try the rest of the pattern or restart from\n    the preceding bracket, in the appropriate order. In the second case, we can\n    use tail recursion to avoid using another stack frame, unless we have an\n    an atomic group or an unlimited repeat of a group that can match an empty\n    string. */\n\n    if (*ecode == OP_KETRMIN)\n      {\n      RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM7);\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      if (*prev == OP_ONCE)\n        {\n        RMATCH(eptr, prev, offset_top, md, eptrb, RM8);\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        md->once_target = prev;  /* Level at which to change to MATCH_NOMATCH */\n        RRETURN(MATCH_ONCE);\n        }\n      if (*prev >= OP_SBRA)    /* Could match an empty string */\n        {\n        RMATCH(eptr, prev, offset_top, md, eptrb, RM50);\n        RRETURN(rrc);\n        }\n      ecode = prev;\n      goto TAIL_RECURSE;\n      }\n    else  /* OP_KETRMAX */\n      {\n      RMATCH(eptr, prev, offset_top, md, eptrb, RM13);\n      if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH;\n      if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n      if (*prev == OP_ONCE)\n        {\n        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM9);\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        md->once_target = prev;\n        RRETURN(MATCH_ONCE);\n        }\n      ecode += 1 + LINK_SIZE;\n      goto TAIL_RECURSE;\n      }\n    /* Control never gets here */\n\n    /* Not multiline mode: start of subject assertion, unless notbol. */\n\n    case OP_CIRC:\n    if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);\n\n    /* Start of subject assertion */\n\n    case OP_SOD:\n    if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    /* Multiline mode: start of subject unless notbol, or after any newline. */\n\n    case OP_CIRCM:\n    if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);\n    if (eptr != md->start_subject &&\n        (eptr == md->end_subject || !WAS_NEWLINE(eptr)))\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    /* Start of match assertion */\n\n    case OP_SOM:\n    if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    /* Reset the start of match point */\n\n    case OP_SET_SOM:\n    mstart = eptr;\n    ecode++;\n    break;\n\n    /* Multiline mode: assert before any newline, or before end of subject\n    unless noteol is set. */\n\n    case OP_DOLLM:\n    if (eptr < md->end_subject)\n      {\n      if (!IS_NEWLINE(eptr))\n        {\n        if (md->partial != 0 &&\n            eptr + 1 >= md->end_subject &&\n            NLBLOCK->nltype == NLTYPE_FIXED &&\n            NLBLOCK->nllen == 2 &&\n            UCHAR21TEST(eptr) == NLBLOCK->nl[0])\n          {\n          md->hitend = TRUE;\n          if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n          }\n        RRETURN(MATCH_NOMATCH);\n        }\n      }\n    else\n      {\n      if (md->noteol) RRETURN(MATCH_NOMATCH);\n      SCHECK_PARTIAL();\n      }\n    ecode++;\n    break;\n\n    /* Not multiline mode: assert before a terminating newline or before end of\n    subject unless noteol is set. */\n\n    case OP_DOLL:\n    if (md->noteol) RRETURN(MATCH_NOMATCH);\n    if (!md->endonly) goto ASSERT_NL_OR_EOS;\n\n    /* ... else fall through for endonly */\n\n    /* End of subject assertion (\\z) */\n\n    case OP_EOD:\n    if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH);\n    SCHECK_PARTIAL();\n    ecode++;\n    break;\n\n    /* End of subject or ending \\n assertion (\\Z) */\n\n    case OP_EODN:\n    ASSERT_NL_OR_EOS:\n    if (eptr < md->end_subject &&\n        (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen))\n      {\n      if (md->partial != 0 &&\n          eptr + 1 >= md->end_subject &&\n          NLBLOCK->nltype == NLTYPE_FIXED &&\n          NLBLOCK->nllen == 2 &&\n          UCHAR21TEST(eptr) == NLBLOCK->nl[0])\n        {\n        md->hitend = TRUE;\n        if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n        }\n      RRETURN(MATCH_NOMATCH);\n      }\n\n    /* Either at end of string or \\n before end. */\n\n    SCHECK_PARTIAL();\n    ecode++;\n    break;\n\n    /* Word boundary assertions */\n\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n      {\n\n      /* Find out if the previous and current characters are \"word\" characters.\n      It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to\n      be \"non-word\" characters. Remember the earliest consulted character for\n      partial matching. */\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        /* Get status of previous character */\n\n        if (eptr == md->start_subject) prev_is_word = FALSE; else\n          {\n          PCRE_PUCHAR lastptr = eptr - 1;\n          BACKCHAR(lastptr);\n          if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr;\n          GETCHAR(c, lastptr);\n#ifdef SUPPORT_UCP\n          if (md->use_ucp)\n            {\n            if (c == '_') prev_is_word = TRUE; else\n              {\n              int cat = UCD_CATEGORY(c);\n              prev_is_word = (cat == ucp_L || cat == ucp_N);\n              }\n            }\n          else\n#endif\n          prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;\n          }\n\n        /* Get status of next character */\n\n        if (eptr >= md->end_subject)\n          {\n          SCHECK_PARTIAL();\n          cur_is_word = FALSE;\n          }\n        else\n          {\n          GETCHAR(c, eptr);\n#ifdef SUPPORT_UCP\n          if (md->use_ucp)\n            {\n            if (c == '_') cur_is_word = TRUE; else\n              {\n              int cat = UCD_CATEGORY(c);\n              cur_is_word = (cat == ucp_L || cat == ucp_N);\n              }\n            }\n          else\n#endif\n          cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;\n          }\n        }\n      else\n#endif\n\n      /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for\n      consistency with the behaviour of \\w we do use it in this case. */\n\n        {\n        /* Get status of previous character */\n\n        if (eptr == md->start_subject) prev_is_word = FALSE; else\n          {\n          if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1;\n#ifdef SUPPORT_UCP\n          if (md->use_ucp)\n            {\n            c = eptr[-1];\n            if (c == '_') prev_is_word = TRUE; else\n              {\n              int cat = UCD_CATEGORY(c);\n              prev_is_word = (cat == ucp_L || cat == ucp_N);\n              }\n            }\n          else\n#endif\n          prev_is_word = MAX_255(eptr[-1])\n            && ((md->ctypes[eptr[-1]] & ctype_word) != 0);\n          }\n\n        /* Get status of next character */\n\n        if (eptr >= md->end_subject)\n          {\n          SCHECK_PARTIAL();\n          cur_is_word = FALSE;\n          }\n        else\n#ifdef SUPPORT_UCP\n        if (md->use_ucp)\n          {\n          c = *eptr;\n          if (c == '_') cur_is_word = TRUE; else\n            {\n            int cat = UCD_CATEGORY(c);\n            cur_is_word = (cat == ucp_L || cat == ucp_N);\n            }\n          }\n        else\n#endif\n        cur_is_word = MAX_255(*eptr)\n          && ((md->ctypes[*eptr] & ctype_word) != 0);\n        }\n\n      /* Now see if the situation is what we want */\n\n      if ((*ecode++ == OP_WORD_BOUNDARY)?\n           cur_is_word == prev_is_word : cur_is_word != prev_is_word)\n        RRETURN(MATCH_NOMATCH);\n      }\n    break;\n\n    /* Match any single character type except newline; have to take care with\n    CRLF newlines and partial matching. */\n\n    case OP_ANY:\n    if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);\n    if (md->partial != 0 &&\n        eptr == md->end_subject - 1 &&\n        NLBLOCK->nltype == NLTYPE_FIXED &&\n        NLBLOCK->nllen == 2 &&\n        UCHAR21TEST(eptr) == NLBLOCK->nl[0])\n      {\n      md->hitend = TRUE;\n      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n      }\n\n    /* Fall through */\n\n    /* Match any single character whatsoever. */\n\n    case OP_ALLANY:\n    if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */\n      {                            /* not be updated before SCHECK_PARTIAL. */\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    eptr++;\n#ifdef SUPPORT_UTF\n    if (utf) ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n#endif\n    ecode++;\n    break;\n\n    /* Match a single byte, even in UTF-8 mode. This opcode really does match\n    any byte, even newline, independent of the setting of PCRE_DOTALL. */\n\n    case OP_ANYBYTE:\n    if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */\n      {                            /* not be updated before SCHECK_PARTIAL. */\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    eptr++;\n    ecode++;\n    break;\n\n    case OP_NOT_DIGIT:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c < 256 &&\n#endif\n       (md->ctypes[c] & ctype_digit) != 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_DIGIT:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c > 255 ||\n#endif\n       (md->ctypes[c] & ctype_digit) == 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_NOT_WHITESPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c < 256 &&\n#endif\n       (md->ctypes[c] & ctype_space) != 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_WHITESPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c > 255 ||\n#endif\n       (md->ctypes[c] & ctype_space) == 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_NOT_WORDCHAR:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c < 256 &&\n#endif\n       (md->ctypes[c] & ctype_word) != 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_WORDCHAR:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    if (\n#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8)\n       c > 255 ||\n#endif\n       (md->ctypes[c] & ctype_word) == 0\n       )\n      RRETURN(MATCH_NOMATCH);\n    ecode++;\n    break;\n\n    case OP_ANYNL:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    switch(c)\n      {\n      default: RRETURN(MATCH_NOMATCH);\n\n      case CHAR_CR:\n      if (eptr >= md->end_subject)\n        {\n        SCHECK_PARTIAL();\n        }\n      else if (UCHAR21TEST(eptr) == CHAR_LF) eptr++;\n      break;\n\n      case CHAR_LF:\n      break;\n\n      case CHAR_VT:\n      case CHAR_FF:\n      case CHAR_NEL:\n#ifndef EBCDIC\n      case 0x2028:\n      case 0x2029:\n#endif  /* Not EBCDIC */\n      if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);\n      break;\n      }\n    ecode++;\n    break;\n\n    case OP_NOT_HSPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    switch(c)\n      {\n      HSPACE_CASES: RRETURN(MATCH_NOMATCH);  /* Byte and multibyte cases */\n      default: break;\n      }\n    ecode++;\n    break;\n\n    case OP_HSPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    switch(c)\n      {\n      HSPACE_CASES: break;  /* Byte and multibyte cases */\n      default: RRETURN(MATCH_NOMATCH);\n      }\n    ecode++;\n    break;\n\n    case OP_NOT_VSPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    switch(c)\n      {\n      VSPACE_CASES: RRETURN(MATCH_NOMATCH);\n      default: break;\n      }\n    ecode++;\n    break;\n\n    case OP_VSPACE:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n    switch(c)\n      {\n      VSPACE_CASES: break;\n      default: RRETURN(MATCH_NOMATCH);\n      }\n    ecode++;\n    break;\n\n#ifdef SUPPORT_UCP\n    /* Check the next character by Unicode property. We will get here only\n    if the support is in the binary; otherwise a compile-time error occurs. */\n\n    case OP_PROP:\n    case OP_NOTPROP:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    GETCHARINCTEST(c, eptr);\n      {\n      const pcre_uint32 *cp;\n      const ucd_record *prop = GET_UCD(c);\n\n      switch(ecode[1])\n        {\n        case PT_ANY:\n        if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH);\n        break;\n\n        case PT_LAMP:\n        if ((prop->chartype == ucp_Lu ||\n             prop->chartype == ucp_Ll ||\n             prop->chartype == ucp_Lt) == (op == OP_NOTPROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        case PT_GC:\n        if ((ecode[2] != PRIV(ucp_gentype)[prop->chartype]) == (op == OP_PROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        case PT_PC:\n        if ((ecode[2] != prop->chartype) == (op == OP_PROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        case PT_SC:\n        if ((ecode[2] != prop->script) == (op == OP_PROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        /* These are specials */\n\n        case PT_ALNUM:\n        if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n             PRIV(ucp_gentype)[prop->chartype] == ucp_N) == (op == OP_NOTPROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n        which means that Perl space and POSIX space are now identical. PCRE\n        was changed at release 8.34. */\n\n        case PT_SPACE:    /* Perl space */\n        case PT_PXSPACE:  /* POSIX space */\n        switch(c)\n          {\n          HSPACE_CASES:\n          VSPACE_CASES:\n          if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH);\n          break;\n\n          default:\n          if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) ==\n            (op == OP_NOTPROP)) RRETURN(MATCH_NOMATCH);\n          break;\n          }\n        break;\n\n        case PT_WORD:\n        if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n             PRIV(ucp_gentype)[prop->chartype] == ucp_N ||\n             c == CHAR_UNDERSCORE) == (op == OP_NOTPROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        case PT_CLIST:\n        cp = PRIV(ucd_caseless_sets) + ecode[2];\n        for (;;)\n          {\n          if (c < *cp)\n            { if (op == OP_PROP) { RRETURN(MATCH_NOMATCH); } else break; }\n          if (c == *cp++)\n            { if (op == OP_PROP) break; else { RRETURN(MATCH_NOMATCH); } }\n          }\n        break;\n\n        case PT_UCNC:\n        if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n             c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n             c >= 0xe000) == (op == OP_NOTPROP))\n          RRETURN(MATCH_NOMATCH);\n        break;\n\n        /* This should never occur */\n\n        default:\n        RRETURN(PCRE_ERROR_INTERNAL);\n        }\n\n      ecode += 3;\n      }\n    break;\n\n    /* Match an extended Unicode sequence. We will get here only if the support\n    is in the binary; otherwise a compile-time error occurs. */\n\n    case OP_EXTUNI:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n    else\n      {\n      int lgb, rgb;\n      GETCHARINCTEST(c, eptr);\n      lgb = UCD_GRAPHBREAK(c);\n      while (eptr < md->end_subject)\n        {\n        int len = 1;\n        if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }\n        rgb = UCD_GRAPHBREAK(c);\n        if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n        lgb = rgb;\n        eptr += len;\n        }\n      }\n    CHECK_PARTIAL();\n    ecode++;\n    break;\n#endif  /* SUPPORT_UCP */\n\n\n    /* Match a back reference, possibly repeatedly. Look past the end of the\n    item to see if there is repeat information following. The code is similar\n    to that for character classes, but repeated for efficiency. Then obey\n    similar code to character type repeats - written out again for speed.\n    However, if the referenced string is the empty string, always treat\n    it as matched, any number of times (otherwise there could be infinite\n    loops). If the reference is unset, there are two possibilities:\n\n    (a) In the default, Perl-compatible state, set the length negative;\n    this ensures that every attempt at a match fails. We can't just fail\n    here, because of the possibility of quantifiers with zero minima.\n\n    (b) If the JavaScript compatibility flag is set, set the length to zero\n    so that the back reference matches an empty string.\n\n    Otherwise, set the length to the length of what was matched by the\n    referenced subpattern.\n\n    The OP_REF and OP_REFI opcodes are used for a reference to a numbered group\n    or to a non-duplicated named group. For a duplicated named group, OP_DNREF\n    and OP_DNREFI are used. In this case we must scan the list of groups to\n    which the name refers, and use the first one that is set. */\n\n    case OP_DNREF:\n    case OP_DNREFI:\n    caseless = op == OP_DNREFI;\n      {\n      int count = GET2(ecode, 1+IMM2_SIZE);\n      pcre_uchar *slot = md->name_table + GET2(ecode, 1) * md->name_entry_size;\n      ecode += 1 + 2*IMM2_SIZE;\n\n      /* Setting the default length first and initializing 'offset' avoids\n      compiler warnings in the REF_REPEAT code. */\n\n      length = (md->jscript_compat)? 0 : -1;\n      offset = 0;\n\n      while (count-- > 0)\n        {\n        offset = GET2(slot, 0) << 1;\n        if (offset < offset_top && md->offset_vector[offset] >= 0)\n          {\n          length = md->offset_vector[offset+1] - md->offset_vector[offset];\n          break;\n          }\n        slot += md->name_entry_size;\n        }\n      }\n    goto REF_REPEAT;\n\n    case OP_REF:\n    case OP_REFI:\n    caseless = op == OP_REFI;\n    offset = GET2(ecode, 1) << 1;               /* Doubled ref number */\n    ecode += 1 + IMM2_SIZE;\n    if (offset >= offset_top || md->offset_vector[offset] < 0)\n      length = (md->jscript_compat)? 0 : -1;\n    else\n      length = md->offset_vector[offset+1] - md->offset_vector[offset];\n\n    /* Set up for repetition, or handle the non-repeated case */\n\n    REF_REPEAT:\n    switch (*ecode)\n      {\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRPLUS:\n      case OP_CRMINPLUS:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      c = *ecode++ - OP_CRSTAR;\n      minimize = (c & 1) != 0;\n      min = rep_min[c];                 /* Pick up values from tables; */\n      max = rep_max[c];                 /* zero for max => infinity */\n      if (max == 0) max = INT_MAX;\n      break;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      minimize = (*ecode == OP_CRMINRANGE);\n      min = GET2(ecode, 1);\n      max = GET2(ecode, 1 + IMM2_SIZE);\n      if (max == 0) max = INT_MAX;\n      ecode += 1 + 2 * IMM2_SIZE;\n      break;\n\n      default:               /* No repeat follows */\n      if ((length = match_ref(offset, eptr, length, md, caseless)) < 0)\n        {\n        if (length == -2) eptr = md->end_subject;   /* Partial match */\n        CHECK_PARTIAL();\n        RRETURN(MATCH_NOMATCH);\n        }\n      eptr += length;\n      continue;              /* With the main loop */\n      }\n\n    /* Handle repeated back references. If the length of the reference is\n    zero, just continue with the main loop. If the length is negative, it\n    means the reference is unset in non-Java-compatible mode. If the minimum is\n    zero, we can continue at the same level without recursion. For any other\n    minimum, carrying on will result in NOMATCH. */\n\n    if (length == 0) continue;\n    if (length < 0 && min == 0) continue;\n\n    /* First, ensure the minimum number of matches are present. We get back\n    the length of the reference string explicitly rather than passing the\n    address of eptr, so that eptr can be a register variable. */\n\n    for (i = 1; i <= min; i++)\n      {\n      int slength;\n      if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)\n        {\n        if (slength == -2) eptr = md->end_subject;   /* Partial match */\n        CHECK_PARTIAL();\n        RRETURN(MATCH_NOMATCH);\n        }\n      eptr += slength;\n      }\n\n    /* If min = max, continue at the same level without recursion.\n    They are not both allowed to be zero. */\n\n    if (min == max) continue;\n\n    /* If minimizing, keep trying and advancing the pointer */\n\n    if (minimize)\n      {\n      for (fi = min;; fi++)\n        {\n        int slength;\n        RMATCH(eptr, ecode, offset_top, md, eptrb, RM14);\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        if (fi >= max) RRETURN(MATCH_NOMATCH);\n        if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)\n          {\n          if (slength == -2) eptr = md->end_subject;   /* Partial match */\n          CHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        eptr += slength;\n        }\n      /* Control never gets here */\n      }\n\n    /* If maximizing, find the longest string and work backwards */\n\n    else\n      {\n      pp = eptr;\n      for (i = min; i < max; i++)\n        {\n        int slength;\n        if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0)\n          {\n          /* Can't use CHECK_PARTIAL because we don't want to update eptr in\n          the soft partial matching case. */\n\n          if (slength == -2 && md->partial != 0 &&\n              md->end_subject > md->start_used_ptr)\n            {\n            md->hitend = TRUE;\n            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n            }\n          break;\n          }\n        eptr += slength;\n        }\n\n      while (eptr >= pp)\n        {\n        RMATCH(eptr, ecode, offset_top, md, eptrb, RM15);\n        if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n        eptr -= length;\n        }\n      RRETURN(MATCH_NOMATCH);\n      }\n    /* Control never gets here */\n\n    /* Match a bit-mapped character class, possibly repeatedly. This op code is\n    used when all the characters in the class have values in the range 0-255,\n    and either the matching is caseful, or the characters are in the range\n    0-127 when UTF-8 processing is enabled. The only difference between\n    OP_CLASS and OP_NCLASS occurs when a data character outside the range is\n    encountered.\n\n    First, look past the end of the item to see if there is repeat information\n    following. Then obey similar code to character type repeats - written out\n    again for speed. */\n\n    case OP_NCLASS:\n    case OP_CLASS:\n      {\n      /* The data variable is saved across frames, so the byte map needs to\n      be stored there. */\n#define BYTE_MAP ((pcre_uint8 *)data)\n      data = ecode + 1;                /* Save for matching */\n      ecode += 1 + (32 / sizeof(pcre_uchar)); /* Advance past the item */\n\n      switch (*ecode)\n        {\n        case OP_CRSTAR:\n        case OP_CRMINSTAR:\n        case OP_CRPLUS:\n        case OP_CRMINPLUS:\n        case OP_CRQUERY:\n        case OP_CRMINQUERY:\n        case OP_CRPOSSTAR:\n        case OP_CRPOSPLUS:\n        case OP_CRPOSQUERY:\n        c = *ecode++ - OP_CRSTAR;\n        if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0;\n        else possessive = TRUE;\n        min = rep_min[c];                 /* Pick up values from tables; */\n        max = rep_max[c];                 /* zero for max => infinity */\n        if (max == 0) max = INT_MAX;\n        break;\n\n        case OP_CRRANGE:\n        case OP_CRMINRANGE:\n        case OP_CRPOSRANGE:\n        minimize = (*ecode == OP_CRMINRANGE);\n        possessive = (*ecode == OP_CRPOSRANGE);\n        min = GET2(ecode, 1);\n        max = GET2(ecode, 1 + IMM2_SIZE);\n        if (max == 0) max = INT_MAX;\n        ecode += 1 + 2 * IMM2_SIZE;\n        break;\n\n        default:               /* No repeat follows */\n        min = max = 1;\n        break;\n        }\n\n      /* First, ensure the minimum number of matches are present. */\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          if (c > 255)\n            {\n            if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);\n            }\n          else\n            if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);\n          }\n        }\n      else\n#endif\n      /* Not UTF mode */\n        {\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          c = *eptr++;\n#ifndef COMPILE_PCRE8\n          if (c > 255)\n            {\n            if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);\n            }\n          else\n#endif\n            if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);\n          }\n        }\n\n      /* If max == min we can continue with the main loop without the\n      need to recurse. */\n\n      if (min == max) continue;\n\n      /* If minimizing, keep testing the rest of the expression and advancing\n      the pointer while it matches the class. */\n\n      if (minimize)\n        {\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM16);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINC(c, eptr);\n            if (c > 255)\n              {\n              if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);\n              }\n            else\n              if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);\n            }\n          }\n        else\n#endif\n        /* Not UTF mode */\n          {\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM17);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            c = *eptr++;\n#ifndef COMPILE_PCRE8\n            if (c > 255)\n              {\n              if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);\n              }\n            else\n#endif\n              if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);\n            }\n          }\n        /* Control never gets here */\n        }\n\n      /* If maximizing, find the longest possible run, then work backwards. */\n\n      else\n        {\n        pp = eptr;\n\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c > 255)\n              {\n              if (op == OP_CLASS) break;\n              }\n            else\n              if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break;\n            eptr += len;\n            }\n\n          if (possessive) continue;    /* No backtracking */\n\n          for (;;)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM18);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (eptr-- <= pp) break;        /* Stop if tried at original pos */\n            BACKCHAR(eptr);\n            }\n          }\n        else\n#endif\n          /* Not UTF mode */\n          {\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            c = *eptr;\n#ifndef COMPILE_PCRE8\n            if (c > 255)\n              {\n              if (op == OP_CLASS) break;\n              }\n            else\n#endif\n              if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break;\n            eptr++;\n            }\n\n          if (possessive) continue;    /* No backtracking */\n\n          while (eptr >= pp)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM19);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            eptr--;\n            }\n          }\n\n        RRETURN(MATCH_NOMATCH);\n        }\n#undef BYTE_MAP\n      }\n    /* Control never gets here */\n\n\n    /* Match an extended character class. In the 8-bit library, this opcode is\n    encountered only when UTF-8 mode mode is supported. In the 16-bit and\n    32-bit libraries, codepoints greater than 255 may be encountered even when\n    UTF is not supported. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n      {\n      data = ecode + 1 + LINK_SIZE;                /* Save for matching */\n      ecode += GET(ecode, 1);                      /* Advance past the item */\n\n      switch (*ecode)\n        {\n        case OP_CRSTAR:\n        case OP_CRMINSTAR:\n        case OP_CRPLUS:\n        case OP_CRMINPLUS:\n        case OP_CRQUERY:\n        case OP_CRMINQUERY:\n        case OP_CRPOSSTAR:\n        case OP_CRPOSPLUS:\n        case OP_CRPOSQUERY:\n        c = *ecode++ - OP_CRSTAR;\n        if (c < OP_CRPOSSTAR - OP_CRSTAR) minimize = (c & 1) != 0;\n        else possessive = TRUE;\n        min = rep_min[c];                 /* Pick up values from tables; */\n        max = rep_max[c];                 /* zero for max => infinity */\n        if (max == 0) max = INT_MAX;\n        break;\n\n        case OP_CRRANGE:\n        case OP_CRMINRANGE:\n        case OP_CRPOSRANGE:\n        minimize = (*ecode == OP_CRMINRANGE);\n        possessive = (*ecode == OP_CRPOSRANGE);\n        min = GET2(ecode, 1);\n        max = GET2(ecode, 1 + IMM2_SIZE);\n        if (max == 0) max = INT_MAX;\n        ecode += 1 + 2 * IMM2_SIZE;\n        break;\n\n        default:               /* No repeat follows */\n        min = max = 1;\n        break;\n        }\n\n      /* First, ensure the minimum number of matches are present. */\n\n      for (i = 1; i <= min; i++)\n        {\n        if (eptr >= md->end_subject)\n          {\n          SCHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        GETCHARINCTEST(c, eptr);\n        if (!PRIV(xclass)(c, data, utf)) RRETURN(MATCH_NOMATCH);\n        }\n\n      /* If max == min we can continue with the main loop without the\n      need to recurse. */\n\n      if (min == max) continue;\n\n      /* If minimizing, keep testing the rest of the expression and advancing\n      the pointer while it matches the class. */\n\n      if (minimize)\n        {\n        for (fi = min;; fi++)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM20);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINCTEST(c, eptr);\n          if (!PRIV(xclass)(c, data, utf)) RRETURN(MATCH_NOMATCH);\n          }\n        /* Control never gets here */\n        }\n\n      /* If maximizing, find the longest possible run, then work backwards. */\n\n      else\n        {\n        pp = eptr;\n        for (i = min; i < max; i++)\n          {\n          int len = 1;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            break;\n            }\n#ifdef SUPPORT_UTF\n          GETCHARLENTEST(c, eptr, len);\n#else\n          c = *eptr;\n#endif\n          if (!PRIV(xclass)(c, data, utf)) break;\n          eptr += len;\n          }\n\n        if (possessive) continue;    /* No backtracking */\n\n        for(;;)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM21);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (eptr-- <= pp) break;        /* Stop if tried at original pos */\n#ifdef SUPPORT_UTF\n          if (utf) BACKCHAR(eptr);\n#endif\n          }\n        RRETURN(MATCH_NOMATCH);\n        }\n\n      /* Control never gets here */\n      }\n#endif    /* End of XCLASS */\n\n    /* Match a single character, casefully */\n\n    case OP_CHAR:\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      length = 1;\n      ecode++;\n      GETCHARLEN(fc, ecode, length);\n      if (length > md->end_subject - eptr)\n        {\n        CHECK_PARTIAL();             /* Not SCHECK_PARTIAL() */\n        RRETURN(MATCH_NOMATCH);\n        }\n      while (length-- > 0) if (*ecode++ != UCHAR21INC(eptr)) RRETURN(MATCH_NOMATCH);\n      }\n    else\n#endif\n    /* Not UTF mode */\n      {\n      if (md->end_subject - eptr < 1)\n        {\n        SCHECK_PARTIAL();            /* This one can use SCHECK_PARTIAL() */\n        RRETURN(MATCH_NOMATCH);\n        }\n      if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);\n      ecode += 2;\n      }\n    break;\n\n    /* Match a single character, caselessly. If we are at the end of the\n    subject, give up immediately. */\n\n    case OP_CHARI:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      length = 1;\n      ecode++;\n      GETCHARLEN(fc, ecode, length);\n\n      /* If the pattern character's value is < 128, we have only one byte, and\n      we know that its other case must also be one byte long, so we can use the\n      fast lookup table. We know that there is at least one byte left in the\n      subject. */\n\n      if (fc < 128)\n        {\n        pcre_uint32 cc = UCHAR21(eptr);\n        if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH);\n        ecode++;\n        eptr++;\n        }\n\n      /* Otherwise we must pick up the subject character. Note that we cannot\n      use the value of \"length\" to check for sufficient bytes left, because the\n      other case of the character may have more or fewer bytes.  */\n\n      else\n        {\n        pcre_uint32 dc;\n        GETCHARINC(dc, eptr);\n        ecode += length;\n\n        /* If we have Unicode property support, we can use it to test the other\n        case of the character, if there is one. */\n\n        if (fc != dc)\n          {\n#ifdef SUPPORT_UCP\n          if (dc != UCD_OTHERCASE(fc))\n#endif\n            RRETURN(MATCH_NOMATCH);\n          }\n        }\n      }\n    else\n#endif   /* SUPPORT_UTF */\n\n    /* Not UTF mode */\n      {\n      if (TABLE_GET(ecode[1], md->lcc, ecode[1])\n          != TABLE_GET(*eptr, md->lcc, *eptr)) RRETURN(MATCH_NOMATCH);\n      eptr++;\n      ecode += 2;\n      }\n    break;\n\n    /* Match a single character repeatedly. */\n\n    case OP_EXACT:\n    case OP_EXACTI:\n    min = max = GET2(ecode, 1);\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATCHAR;\n\n    case OP_POSUPTO:\n    case OP_POSUPTOI:\n    possessive = TRUE;\n    /* Fall through */\n\n    case OP_UPTO:\n    case OP_UPTOI:\n    case OP_MINUPTO:\n    case OP_MINUPTOI:\n    min = 0;\n    max = GET2(ecode, 1);\n    minimize = *ecode == OP_MINUPTO || *ecode == OP_MINUPTOI;\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATCHAR;\n\n    case OP_POSSTAR:\n    case OP_POSSTARI:\n    possessive = TRUE;\n    min = 0;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATCHAR;\n\n    case OP_POSPLUS:\n    case OP_POSPLUSI:\n    possessive = TRUE;\n    min = 1;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATCHAR;\n\n    case OP_POSQUERY:\n    case OP_POSQUERYI:\n    possessive = TRUE;\n    min = 0;\n    max = 1;\n    ecode++;\n    goto REPEATCHAR;\n\n    case OP_STAR:\n    case OP_STARI:\n    case OP_MINSTAR:\n    case OP_MINSTARI:\n    case OP_PLUS:\n    case OP_PLUSI:\n    case OP_MINPLUS:\n    case OP_MINPLUSI:\n    case OP_QUERY:\n    case OP_QUERYI:\n    case OP_MINQUERY:\n    case OP_MINQUERYI:\n    c = *ecode++ - ((op < OP_STARI)? OP_STAR : OP_STARI);\n    minimize = (c & 1) != 0;\n    min = rep_min[c];                 /* Pick up values from tables; */\n    max = rep_max[c];                 /* zero for max => infinity */\n    if (max == 0) max = INT_MAX;\n\n    /* Common code for all repeated single-character matches. We first check\n    for the minimum number of characters. If the minimum equals the maximum, we\n    are done. Otherwise, if minimizing, check the rest of the pattern for a\n    match; if there isn't one, advance up to the maximum, one character at a\n    time.\n\n    If maximizing, advance up to the maximum number of matching characters,\n    until eptr is past the end of the maximum run. If possessive, we are\n    then done (no backing up). Otherwise, match at this position; anything\n    other than no match is immediately returned. For nomatch, back up one\n    character, unless we are matching \\R and the last thing matched was\n    \\r\\n, in which case, back up two bytes. When we reach the first optional\n    character position, we can save stack by doing a tail recurse.\n\n    The various UTF/non-UTF and caseful/caseless cases are handled separately,\n    for speed. */\n\n    REPEATCHAR:\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      length = 1;\n      charptr = ecode;\n      GETCHARLEN(fc, ecode, length);\n      ecode += length;\n\n      /* Handle multibyte character matching specially here. There is\n      support for caseless matching if UCP support is present. */\n\n      if (length > 1)\n        {\n#ifdef SUPPORT_UCP\n        pcre_uint32 othercase;\n        if (op >= OP_STARI &&     /* Caseless */\n            (othercase = UCD_OTHERCASE(fc)) != fc)\n          oclength = PRIV(ord2utf)(othercase, occhars);\n        else oclength = 0;\n#endif  /* SUPPORT_UCP */\n\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr <= md->end_subject - length &&\n            memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;\n#ifdef SUPPORT_UCP\n          else if (oclength > 0 &&\n                   eptr <= md->end_subject - oclength &&\n                   memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;\n#endif  /* SUPPORT_UCP */\n          else\n            {\n            CHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          }\n\n        if (min == max) continue;\n\n        if (minimize)\n          {\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM22);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr <= md->end_subject - length &&\n              memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;\n#ifdef SUPPORT_UCP\n            else if (oclength > 0 &&\n                     eptr <= md->end_subject - oclength &&\n                     memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;\n#endif  /* SUPPORT_UCP */\n            else\n              {\n              CHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            }\n          /* Control never gets here */\n          }\n\n        else  /* Maximize */\n          {\n          pp = eptr;\n          for (i = min; i < max; i++)\n            {\n            if (eptr <= md->end_subject - length &&\n                memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length;\n#ifdef SUPPORT_UCP\n            else if (oclength > 0 &&\n                     eptr <= md->end_subject - oclength &&\n                     memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength;\n#endif  /* SUPPORT_UCP */\n            else\n              {\n              CHECK_PARTIAL();\n              break;\n              }\n            }\n\n          if (possessive) continue;    /* No backtracking */\n          for(;;)\n            {\n            if (eptr <= pp) goto TAIL_RECURSE;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n#ifdef SUPPORT_UCP\n            eptr--;\n            BACKCHAR(eptr);\n#else   /* without SUPPORT_UCP */\n            eptr -= length;\n#endif  /* SUPPORT_UCP */\n            }\n          }\n        /* Control never gets here */\n        }\n\n      /* If the length of a UTF-8 character is 1, we fall through here, and\n      obey the code as for non-UTF-8 characters below, though in this case the\n      value of fc will always be < 128. */\n      }\n    else\n#endif  /* SUPPORT_UTF */\n      /* When not in UTF-8 mode, load a single-byte character. */\n      fc = *ecode++;\n\n    /* The value of fc at this point is always one character, though we may\n    or may not be in UTF mode. The code is duplicated for the caseless and\n    caseful cases, for speed, since matching characters is likely to be quite\n    common. First, ensure the minimum number of matches are present. If min =\n    max, continue at the same level without recursing. Otherwise, if\n    minimizing, keep trying the rest of the expression and advancing one\n    matching character if failing, up to the maximum. Alternatively, if\n    maximizing, find the maximum number of characters and work backwards. */\n\n    DPRINTF((\"matching %c{%d,%d} against subject %.*s\\n\", fc, min, max,\n      max, (char *)eptr));\n\n    if (op >= OP_STARI)  /* Caseless */\n      {\n#ifdef COMPILE_PCRE8\n      /* fc must be < 128 if UTF is enabled. */\n      foc = md->fcc[fc];\n#else\n#ifdef SUPPORT_UTF\n#ifdef SUPPORT_UCP\n      if (utf && fc > 127)\n        foc = UCD_OTHERCASE(fc);\n#else\n      if (utf && fc > 127)\n        foc = fc;\n#endif /* SUPPORT_UCP */\n      else\n#endif /* SUPPORT_UTF */\n        foc = TABLE_GET(fc, md->fcc, fc);\n#endif /* COMPILE_PCRE8 */\n\n      for (i = 1; i <= min; i++)\n        {\n        pcre_uint32 cc;                 /* Faster than pcre_uchar */\n        if (eptr >= md->end_subject)\n          {\n          SCHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        cc = UCHAR21TEST(eptr);\n        if (fc != cc && foc != cc) RRETURN(MATCH_NOMATCH);\n        eptr++;\n        }\n      if (min == max) continue;\n      if (minimize)\n        {\n        for (fi = min;; fi++)\n          {\n          pcre_uint32 cc;               /* Faster than pcre_uchar */\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM24);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21TEST(eptr);\n          if (fc != cc && foc != cc) RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        /* Control never gets here */\n        }\n      else  /* Maximize */\n        {\n        pp = eptr;\n        for (i = min; i < max; i++)\n          {\n          pcre_uint32 cc;               /* Faster than pcre_uchar */\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            break;\n            }\n          cc = UCHAR21TEST(eptr);\n          if (fc != cc && foc != cc) break;\n          eptr++;\n          }\n        if (possessive) continue;       /* No backtracking */\n        for (;;)\n          {\n          if (eptr == pp) goto TAIL_RECURSE;\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM25);\n          eptr--;\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          }\n        /* Control never gets here */\n        }\n      }\n\n    /* Caseful comparisons (includes all multi-byte characters) */\n\n    else\n      {\n      for (i = 1; i <= min; i++)\n        {\n        if (eptr >= md->end_subject)\n          {\n          SCHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        if (fc != UCHAR21INCTEST(eptr)) RRETURN(MATCH_NOMATCH);\n        }\n\n      if (min == max) continue;\n\n      if (minimize)\n        {\n        for (fi = min;; fi++)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM26);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (fc != UCHAR21INCTEST(eptr)) RRETURN(MATCH_NOMATCH);\n          }\n        /* Control never gets here */\n        }\n      else  /* Maximize */\n        {\n        pp = eptr;\n        for (i = min; i < max; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            break;\n            }\n          if (fc != UCHAR21TEST(eptr)) break;\n          eptr++;\n          }\n        if (possessive) continue;    /* No backtracking */\n        for (;;)\n          {\n          if (eptr == pp) goto TAIL_RECURSE;\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM27);\n          eptr--;\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          }\n        /* Control never gets here */\n        }\n      }\n    /* Control never gets here */\n\n    /* Match a negated single one-byte character. The character we are\n    checking can be multibyte. */\n\n    case OP_NOT:\n    case OP_NOTI:\n    if (eptr >= md->end_subject)\n      {\n      SCHECK_PARTIAL();\n      RRETURN(MATCH_NOMATCH);\n      }\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      register pcre_uint32 ch, och;\n\n      ecode++;\n      GETCHARINC(ch, ecode);\n      GETCHARINC(c, eptr);\n\n      if (op == OP_NOT)\n        {\n        if (ch == c) RRETURN(MATCH_NOMATCH);\n        }\n      else\n        {\n#ifdef SUPPORT_UCP\n        if (ch > 127)\n          och = UCD_OTHERCASE(ch);\n#else\n        if (ch > 127)\n          och = ch;\n#endif /* SUPPORT_UCP */\n        else\n          och = TABLE_GET(ch, md->fcc, ch);\n        if (ch == c || och == c) RRETURN(MATCH_NOMATCH);\n        }\n      }\n    else\n#endif\n      {\n      register pcre_uint32 ch = ecode[1];\n      c = *eptr++;\n      if (ch == c || (op == OP_NOTI && TABLE_GET(ch, md->fcc, ch) == c))\n        RRETURN(MATCH_NOMATCH);\n      ecode += 2;\n      }\n    break;\n\n    /* Match a negated single one-byte character repeatedly. This is almost a\n    repeat of the code for a repeated single character, but I haven't found a\n    nice way of commoning these up that doesn't require a test of the\n    positive/negative option for each character match. Maybe that wouldn't add\n    very much to the time taken, but character matching *is* what this is all\n    about... */\n\n    case OP_NOTEXACT:\n    case OP_NOTEXACTI:\n    min = max = GET2(ecode, 1);\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTUPTO:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTO:\n    case OP_NOTMINUPTOI:\n    min = 0;\n    max = GET2(ecode, 1);\n    minimize = *ecode == OP_NOTMINUPTO || *ecode == OP_NOTMINUPTOI;\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSSTARI:\n    possessive = TRUE;\n    min = 0;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSPLUSI:\n    possessive = TRUE;\n    min = 1;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSQUERYI:\n    possessive = TRUE;\n    min = 0;\n    max = 1;\n    ecode++;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTPOSUPTO:\n    case OP_NOTPOSUPTOI:\n    possessive = TRUE;\n    min = 0;\n    max = GET2(ecode, 1);\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATNOTCHAR;\n\n    case OP_NOTSTAR:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTAR:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUS:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUS:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERY:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERY:\n    case OP_NOTMINQUERYI:\n    c = *ecode++ - ((op >= OP_NOTSTARI)? OP_NOTSTARI: OP_NOTSTAR);\n    minimize = (c & 1) != 0;\n    min = rep_min[c];                 /* Pick up values from tables; */\n    max = rep_max[c];                 /* zero for max => infinity */\n    if (max == 0) max = INT_MAX;\n\n    /* Common code for all repeated single-byte matches. */\n\n    REPEATNOTCHAR:\n    GETCHARINCTEST(fc, ecode);\n\n    /* The code is duplicated for the caseless and caseful cases, for speed,\n    since matching characters is likely to be quite common. First, ensure the\n    minimum number of matches are present. If min = max, continue at the same\n    level without recursing. Otherwise, if minimizing, keep trying the rest of\n    the expression and advancing one matching character if failing, up to the\n    maximum. Alternatively, if maximizing, find the maximum number of\n    characters and work backwards. */\n\n    DPRINTF((\"negative matching %c{%d,%d} against subject %.*s\\n\", fc, min, max,\n      max, (char *)eptr));\n\n    if (op >= OP_NOTSTARI)     /* Caseless */\n      {\n#ifdef SUPPORT_UTF\n#ifdef SUPPORT_UCP\n      if (utf && fc > 127)\n        foc = UCD_OTHERCASE(fc);\n#else\n      if (utf && fc > 127)\n        foc = fc;\n#endif /* SUPPORT_UCP */\n      else\n#endif /* SUPPORT_UTF */\n        foc = TABLE_GET(fc, md->fcc, fc);\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        register pcre_uint32 d;\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(d, eptr);\n          if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH);\n          }\n        }\n      else\n#endif  /* SUPPORT_UTF */\n      /* Not UTF mode */\n        {\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        }\n\n      if (min == max) continue;\n\n      if (minimize)\n        {\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          register pcre_uint32 d;\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM28);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINC(d, eptr);\n            if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH);\n            }\n          }\n        else\n#endif  /*SUPPORT_UTF */\n        /* Not UTF mode */\n          {\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM29);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH);\n            eptr++;\n            }\n          }\n        /* Control never gets here */\n        }\n\n      /* Maximize case */\n\n      else\n        {\n        pp = eptr;\n\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          register pcre_uint32 d;\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(d, eptr, len);\n            if (fc == d || (unsigned int)foc == d) break;\n            eptr += len;\n            }\n          if (possessive) continue;    /* No backtracking */\n          for(;;)\n            {\n            if (eptr <= pp) goto TAIL_RECURSE;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            eptr--;\n            BACKCHAR(eptr);\n            }\n          }\n        else\n#endif  /* SUPPORT_UTF */\n        /* Not UTF mode */\n          {\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (fc == *eptr || foc == *eptr) break;\n            eptr++;\n            }\n          if (possessive) continue;    /* No backtracking */\n          for (;;)\n            {\n            if (eptr == pp) goto TAIL_RECURSE;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM31);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            eptr--;\n            }\n          }\n        /* Control never gets here */\n        }\n      }\n\n    /* Caseful comparisons */\n\n    else\n      {\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        register pcre_uint32 d;\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(d, eptr);\n          if (fc == d) RRETURN(MATCH_NOMATCH);\n          }\n        }\n      else\n#endif\n      /* Not UTF mode */\n        {\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (fc == *eptr++) RRETURN(MATCH_NOMATCH);\n          }\n        }\n\n      if (min == max) continue;\n\n      if (minimize)\n        {\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          register pcre_uint32 d;\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM32);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINC(d, eptr);\n            if (fc == d) RRETURN(MATCH_NOMATCH);\n            }\n          }\n        else\n#endif\n        /* Not UTF mode */\n          {\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM33);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            if (fc == *eptr++) RRETURN(MATCH_NOMATCH);\n            }\n          }\n        /* Control never gets here */\n        }\n\n      /* Maximize case */\n\n      else\n        {\n        pp = eptr;\n\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          register pcre_uint32 d;\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(d, eptr, len);\n            if (fc == d) break;\n            eptr += len;\n            }\n          if (possessive) continue;    /* No backtracking */\n          for(;;)\n            {\n            if (eptr <= pp) goto TAIL_RECURSE;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            eptr--;\n            BACKCHAR(eptr);\n            }\n          }\n        else\n#endif\n        /* Not UTF mode */\n          {\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (fc == *eptr) break;\n            eptr++;\n            }\n          if (possessive) continue;    /* No backtracking */\n          for (;;)\n            {\n            if (eptr == pp) goto TAIL_RECURSE;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM35);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            eptr--;\n            }\n          }\n        /* Control never gets here */\n        }\n      }\n    /* Control never gets here */\n\n    /* Match a single character type repeatedly; several different opcodes\n    share code. This is very similar to the code for single characters, but we\n    repeat it in the interests of efficiency. */\n\n    case OP_TYPEEXACT:\n    min = max = GET2(ecode, 1);\n    minimize = TRUE;\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATTYPE;\n\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    min = 0;\n    max = GET2(ecode, 1);\n    minimize = *ecode == OP_TYPEMINUPTO;\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATTYPE;\n\n    case OP_TYPEPOSSTAR:\n    possessive = TRUE;\n    min = 0;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATTYPE;\n\n    case OP_TYPEPOSPLUS:\n    possessive = TRUE;\n    min = 1;\n    max = INT_MAX;\n    ecode++;\n    goto REPEATTYPE;\n\n    case OP_TYPEPOSQUERY:\n    possessive = TRUE;\n    min = 0;\n    max = 1;\n    ecode++;\n    goto REPEATTYPE;\n\n    case OP_TYPEPOSUPTO:\n    possessive = TRUE;\n    min = 0;\n    max = GET2(ecode, 1);\n    ecode += 1 + IMM2_SIZE;\n    goto REPEATTYPE;\n\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    c = *ecode++ - OP_TYPESTAR;\n    minimize = (c & 1) != 0;\n    min = rep_min[c];                 /* Pick up values from tables; */\n    max = rep_max[c];                 /* zero for max => infinity */\n    if (max == 0) max = INT_MAX;\n\n    /* Common code for all repeated single character type matches. Note that\n    in UTF-8 mode, '.' matches a character of any length, but for the other\n    character types, the valid characters are all one-byte long. */\n\n    REPEATTYPE:\n    ctype = *ecode++;      /* Code for the character type */\n\n#ifdef SUPPORT_UCP\n    if (ctype == OP_PROP || ctype == OP_NOTPROP)\n      {\n      prop_fail_result = ctype == OP_NOTPROP;\n      prop_type = *ecode++;\n      prop_value = *ecode++;\n      }\n    else prop_type = -1;\n#endif\n\n    /* First, ensure the minimum number of matches are present. Use inline\n    code for maximizing the speed, and do the type test once at the start\n    (i.e. keep it out of the loop). Separate the UTF-8 code completely as that\n    is tidier. Also separate the UCP code, which can be the same for both UTF-8\n    and single-bytes. */\n\n    if (min > 0)\n      {\n#ifdef SUPPORT_UCP\n      if (prop_type >= 0)\n        {\n        switch(prop_type)\n          {\n          case PT_ANY:\n          if (prop_fail_result) RRETURN(MATCH_NOMATCH);\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            }\n          break;\n\n          case PT_LAMP:\n          for (i = 1; i <= min; i++)\n            {\n            int chartype;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            chartype = UCD_CHARTYPE(c);\n            if ((chartype == ucp_Lu ||\n                 chartype == ucp_Ll ||\n                 chartype == ucp_Lt) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          case PT_GC:\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          case PT_PC:\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          case PT_SC:\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          case PT_ALNUM:\n          for (i = 1; i <= min; i++)\n            {\n            int category;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L || category == ucp_N) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            switch(c)\n              {\n              HSPACE_CASES:\n              VSPACE_CASES:\n              if (prop_fail_result) RRETURN(MATCH_NOMATCH);\n              break;\n\n              default:\n              if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result)\n                RRETURN(MATCH_NOMATCH);\n              break;\n              }\n            }\n          break;\n\n          case PT_WORD:\n          for (i = 1; i <= min; i++)\n            {\n            int category;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L || category == ucp_N || c == CHAR_UNDERSCORE)\n                   == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          case PT_CLIST:\n          for (i = 1; i <= min; i++)\n            {\n            const pcre_uint32 *cp;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            cp = PRIV(ucd_caseless_sets) + prop_value;\n            for (;;)\n              {\n              if (c < *cp)\n                { if (prop_fail_result) break; else { RRETURN(MATCH_NOMATCH); } }\n              if (c == *cp++)\n                { if (prop_fail_result) { RRETURN(MATCH_NOMATCH); } else break; }\n              }\n            }\n          break;\n\n          case PT_UCNC:\n          for (i = 1; i <= min; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n                 c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n                 c >= 0xe000) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          break;\n\n          /* This should not occur */\n\n          default:\n          RRETURN(PCRE_ERROR_INTERNAL);\n          }\n        }\n\n      /* Match extended Unicode sequences. We will get here only if the\n      support is in the binary; otherwise a compile-time error occurs. */\n\n      else if (ctype == OP_EXTUNI)\n        {\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          else\n            {\n            int lgb, rgb;\n            GETCHARINCTEST(c, eptr);\n            lgb = UCD_GRAPHBREAK(c);\n           while (eptr < md->end_subject)\n              {\n              int len = 1;\n              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }\n              rgb = UCD_GRAPHBREAK(c);\n              if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n              lgb = rgb;\n              eptr += len;\n              }\n            }\n          CHECK_PARTIAL();\n          }\n        }\n\n      else\n#endif     /* SUPPORT_UCP */\n\n/* Handle all other cases when the coding is UTF-8 */\n\n#ifdef SUPPORT_UTF\n      if (utf) switch(ctype)\n        {\n        case OP_ANY:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);\n          if (md->partial != 0 &&\n              eptr + 1 >= md->end_subject &&\n              NLBLOCK->nltype == NLTYPE_FIXED &&\n              NLBLOCK->nllen == 2 &&\n              UCHAR21(eptr) == NLBLOCK->nl[0])\n            {\n            md->hitend = TRUE;\n            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n            }\n          eptr++;\n          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n          }\n        break;\n\n        case OP_ALLANY:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          eptr++;\n          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n          }\n        break;\n\n        case OP_ANYBYTE:\n        if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);\n        eptr += min;\n        break;\n\n        case OP_ANYNL:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          switch(c)\n            {\n            default: RRETURN(MATCH_NOMATCH);\n\n            case CHAR_CR:\n            if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;\n            break;\n\n            case CHAR_LF:\n            break;\n\n            case CHAR_VT:\n            case CHAR_FF:\n            case CHAR_NEL:\n#ifndef EBCDIC\n            case 0x2028:\n            case 0x2029:\n#endif  /* Not EBCDIC */\n            if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);\n            break;\n            }\n          }\n        break;\n\n        case OP_NOT_HSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          switch(c)\n            {\n            HSPACE_CASES: RRETURN(MATCH_NOMATCH);  /* Byte and multibyte cases */\n            default: break;\n            }\n          }\n        break;\n\n        case OP_HSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          switch(c)\n            {\n            HSPACE_CASES: break;  /* Byte and multibyte cases */\n            default: RRETURN(MATCH_NOMATCH);\n            }\n          }\n        break;\n\n        case OP_NOT_VSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          switch(c)\n            {\n            VSPACE_CASES: RRETURN(MATCH_NOMATCH);\n            default: break;\n            }\n          }\n        break;\n\n        case OP_VSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          switch(c)\n            {\n            VSPACE_CASES: break;\n            default: RRETURN(MATCH_NOMATCH);\n            }\n          }\n        break;\n\n        case OP_NOT_DIGIT:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          GETCHARINC(c, eptr);\n          if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)\n            RRETURN(MATCH_NOMATCH);\n          }\n        break;\n\n        case OP_DIGIT:\n        for (i = 1; i <= min; i++)\n          {\n          pcre_uint32 cc;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21(eptr);\n          if (cc >= 128 || (md->ctypes[cc] & ctype_digit) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          /* No need to skip more bytes - we know it's a 1-byte character */\n          }\n        break;\n\n        case OP_NOT_WHITESPACE:\n        for (i = 1; i <= min; i++)\n          {\n          pcre_uint32 cc;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21(eptr);\n          if (cc < 128 && (md->ctypes[cc] & ctype_space) != 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n          }\n        break;\n\n        case OP_WHITESPACE:\n        for (i = 1; i <= min; i++)\n          {\n          pcre_uint32 cc;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21(eptr);\n          if (cc >= 128 || (md->ctypes[cc] & ctype_space) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          /* No need to skip more bytes - we know it's a 1-byte character */\n          }\n        break;\n\n        case OP_NOT_WORDCHAR:\n        for (i = 1; i <= min; i++)\n          {\n          pcre_uint32 cc;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21(eptr);\n          if (cc < 128 && (md->ctypes[cc] & ctype_word) != 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n          }\n        break;\n\n        case OP_WORDCHAR:\n        for (i = 1; i <= min; i++)\n          {\n          pcre_uint32 cc;\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          cc = UCHAR21(eptr);\n          if (cc >= 128 || (md->ctypes[cc] & ctype_word) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          /* No need to skip more bytes - we know it's a 1-byte character */\n          }\n        break;\n\n        default:\n        RRETURN(PCRE_ERROR_INTERNAL);\n        }  /* End switch(ctype) */\n\n      else\n#endif     /* SUPPORT_UTF */\n\n      /* Code for the non-UTF-8 case for minimum matching of operators other\n      than OP_PROP and OP_NOTPROP. */\n\n      switch(ctype)\n        {\n        case OP_ANY:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);\n          if (md->partial != 0 &&\n              eptr + 1 >= md->end_subject &&\n              NLBLOCK->nltype == NLTYPE_FIXED &&\n              NLBLOCK->nllen == 2 &&\n              *eptr == NLBLOCK->nl[0])\n            {\n            md->hitend = TRUE;\n            if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n            }\n          eptr++;\n          }\n        break;\n\n        case OP_ALLANY:\n        if (eptr > md->end_subject - min)\n          {\n          SCHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        eptr += min;\n        break;\n\n        case OP_ANYBYTE:\n        if (eptr > md->end_subject - min)\n          {\n          SCHECK_PARTIAL();\n          RRETURN(MATCH_NOMATCH);\n          }\n        eptr += min;\n        break;\n\n        case OP_ANYNL:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          switch(*eptr++)\n            {\n            default: RRETURN(MATCH_NOMATCH);\n\n            case CHAR_CR:\n            if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;\n            break;\n\n            case CHAR_LF:\n            break;\n\n            case CHAR_VT:\n            case CHAR_FF:\n            case CHAR_NEL:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n            case 0x2028:\n            case 0x2029:\n#endif\n            if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);\n            break;\n            }\n          }\n        break;\n\n        case OP_NOT_HSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          switch(*eptr++)\n            {\n            default: break;\n            HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n            HSPACE_MULTIBYTE_CASES:\n#endif\n            RRETURN(MATCH_NOMATCH);\n            }\n          }\n        break;\n\n        case OP_HSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          switch(*eptr++)\n            {\n            default: RRETURN(MATCH_NOMATCH);\n            HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n            HSPACE_MULTIBYTE_CASES:\n#endif\n            break;\n            }\n          }\n        break;\n\n        case OP_NOT_VSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          switch(*eptr++)\n            {\n            VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n            VSPACE_MULTIBYTE_CASES:\n#endif\n            RRETURN(MATCH_NOMATCH);\n            default: break;\n            }\n          }\n        break;\n\n        case OP_VSPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          switch(*eptr++)\n            {\n            default: RRETURN(MATCH_NOMATCH);\n            VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n            VSPACE_MULTIBYTE_CASES:\n#endif\n            break;\n            }\n          }\n        break;\n\n        case OP_NOT_DIGIT:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        case OP_DIGIT:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        case OP_NOT_WHITESPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        case OP_WHITESPACE:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        case OP_NOT_WORDCHAR:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        case OP_WORDCHAR:\n        for (i = 1; i <= min; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0)\n            RRETURN(MATCH_NOMATCH);\n          eptr++;\n          }\n        break;\n\n        default:\n        RRETURN(PCRE_ERROR_INTERNAL);\n        }\n      }\n\n    /* If min = max, continue at the same level without recursing */\n\n    if (min == max) continue;\n\n    /* If minimizing, we have to test the rest of the pattern before each\n    subsequent match. Again, separate the UTF-8 case for speed, and also\n    separate the UCP cases. */\n\n    if (minimize)\n      {\n#ifdef SUPPORT_UCP\n      if (prop_type >= 0)\n        {\n        switch(prop_type)\n          {\n          case PT_ANY:\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM36);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if (prop_fail_result) RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_LAMP:\n          for (fi = min;; fi++)\n            {\n            int chartype;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM37);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            chartype = UCD_CHARTYPE(c);\n            if ((chartype == ucp_Lu ||\n                 chartype == ucp_Ll ||\n                 chartype == ucp_Lt) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_GC:\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM38);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_PC:\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM39);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_SC:\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM40);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_ALNUM:\n          for (fi = min;; fi++)\n            {\n            int category;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM59);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L || category == ucp_N) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM61);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            switch(c)\n              {\n              HSPACE_CASES:\n              VSPACE_CASES:\n              if (prop_fail_result) RRETURN(MATCH_NOMATCH);\n              break;\n\n              default:\n              if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result)\n                RRETURN(MATCH_NOMATCH);\n              break;\n              }\n            }\n          /* Control never gets here */\n\n          case PT_WORD:\n          for (fi = min;; fi++)\n            {\n            int category;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM62);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L ||\n                 category == ucp_N ||\n                 c == CHAR_UNDERSCORE)\n                   == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          case PT_CLIST:\n          for (fi = min;; fi++)\n            {\n            const pcre_uint32 *cp;\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM67);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            cp = PRIV(ucd_caseless_sets) + prop_value;\n            for (;;)\n              {\n              if (c < *cp)\n                { if (prop_fail_result) break; else { RRETURN(MATCH_NOMATCH); } }\n              if (c == *cp++)\n                { if (prop_fail_result) { RRETURN(MATCH_NOMATCH); } else break; }\n              }\n            }\n          /* Control never gets here */\n\n          case PT_UCNC:\n          for (fi = min;; fi++)\n            {\n            RMATCH(eptr, ecode, offset_top, md, eptrb, RM60);\n            if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n            if (fi >= max) RRETURN(MATCH_NOMATCH);\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              RRETURN(MATCH_NOMATCH);\n              }\n            GETCHARINCTEST(c, eptr);\n            if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n                 c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n                 c >= 0xe000) == prop_fail_result)\n              RRETURN(MATCH_NOMATCH);\n            }\n          /* Control never gets here */\n\n          /* This should never occur */\n          default:\n          RRETURN(PCRE_ERROR_INTERNAL);\n          }\n        }\n\n      /* Match extended Unicode sequences. We will get here only if the\n      support is in the binary; otherwise a compile-time error occurs. */\n\n      else if (ctype == OP_EXTUNI)\n        {\n        for (fi = min;; fi++)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM41);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          else\n            {\n            int lgb, rgb;\n            GETCHARINCTEST(c, eptr);\n            lgb = UCD_GRAPHBREAK(c);\n            while (eptr < md->end_subject)\n              {\n              int len = 1;\n              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }\n              rgb = UCD_GRAPHBREAK(c);\n              if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n              lgb = rgb;\n              eptr += len;\n              }\n            }\n          CHECK_PARTIAL();\n          }\n        }\n      else\n#endif     /* SUPPORT_UCP */\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        for (fi = min;; fi++)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM42);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (ctype == OP_ANY && IS_NEWLINE(eptr))\n            RRETURN(MATCH_NOMATCH);\n          GETCHARINC(c, eptr);\n          switch(ctype)\n            {\n            case OP_ANY:               /* This is the non-NL case */\n            if (md->partial != 0 &&    /* Take care with CRLF partial */\n                eptr >= md->end_subject &&\n                NLBLOCK->nltype == NLTYPE_FIXED &&\n                NLBLOCK->nllen == 2 &&\n                c == NLBLOCK->nl[0])\n              {\n              md->hitend = TRUE;\n              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n              }\n            break;\n\n            case OP_ALLANY:\n            case OP_ANYBYTE:\n            break;\n\n            case OP_ANYNL:\n            switch(c)\n              {\n              default: RRETURN(MATCH_NOMATCH);\n              case CHAR_CR:\n              if (eptr < md->end_subject && UCHAR21(eptr) == CHAR_LF) eptr++;\n              break;\n\n              case CHAR_LF:\n              break;\n\n              case CHAR_VT:\n              case CHAR_FF:\n              case CHAR_NEL:\n#ifndef EBCDIC\n              case 0x2028:\n              case 0x2029:\n#endif  /* Not EBCDIC */\n              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);\n              break;\n              }\n            break;\n\n            case OP_NOT_HSPACE:\n            switch(c)\n              {\n              HSPACE_CASES: RRETURN(MATCH_NOMATCH);\n              default: break;\n              }\n            break;\n\n            case OP_HSPACE:\n            switch(c)\n              {\n              HSPACE_CASES: break;\n              default: RRETURN(MATCH_NOMATCH);\n              }\n            break;\n\n            case OP_NOT_VSPACE:\n            switch(c)\n              {\n              VSPACE_CASES: RRETURN(MATCH_NOMATCH);\n              default: break;\n              }\n            break;\n\n            case OP_VSPACE:\n            switch(c)\n              {\n              VSPACE_CASES: break;\n              default: RRETURN(MATCH_NOMATCH);\n              }\n            break;\n\n            case OP_NOT_DIGIT:\n            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_DIGIT:\n            if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_NOT_WHITESPACE:\n            if (c < 256 && (md->ctypes[c] & ctype_space) != 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_WHITESPACE:\n            if (c >= 256 || (md->ctypes[c] & ctype_space) == 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_NOT_WORDCHAR:\n            if (c < 256 && (md->ctypes[c] & ctype_word) != 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_WORDCHAR:\n            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0)\n              RRETURN(MATCH_NOMATCH);\n            break;\n\n            default:\n            RRETURN(PCRE_ERROR_INTERNAL);\n            }\n          }\n        }\n      else\n#endif\n      /* Not UTF mode */\n        {\n        for (fi = min;; fi++)\n          {\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM43);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          if (fi >= max) RRETURN(MATCH_NOMATCH);\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            RRETURN(MATCH_NOMATCH);\n            }\n          if (ctype == OP_ANY && IS_NEWLINE(eptr))\n            RRETURN(MATCH_NOMATCH);\n          c = *eptr++;\n          switch(ctype)\n            {\n            case OP_ANY:               /* This is the non-NL case */\n            if (md->partial != 0 &&    /* Take care with CRLF partial */\n                eptr >= md->end_subject &&\n                NLBLOCK->nltype == NLTYPE_FIXED &&\n                NLBLOCK->nllen == 2 &&\n                c == NLBLOCK->nl[0])\n              {\n              md->hitend = TRUE;\n              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n              }\n            break;\n\n            case OP_ALLANY:\n            case OP_ANYBYTE:\n            break;\n\n            case OP_ANYNL:\n            switch(c)\n              {\n              default: RRETURN(MATCH_NOMATCH);\n              case CHAR_CR:\n              if (eptr < md->end_subject && *eptr == CHAR_LF) eptr++;\n              break;\n\n              case CHAR_LF:\n              break;\n\n              case CHAR_VT:\n              case CHAR_FF:\n              case CHAR_NEL:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              case 0x2028:\n              case 0x2029:\n#endif\n              if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH);\n              break;\n              }\n            break;\n\n            case OP_NOT_HSPACE:\n            switch(c)\n              {\n              default: break;\n              HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              HSPACE_MULTIBYTE_CASES:\n#endif\n              RRETURN(MATCH_NOMATCH);\n              }\n            break;\n\n            case OP_HSPACE:\n            switch(c)\n              {\n              default: RRETURN(MATCH_NOMATCH);\n              HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              HSPACE_MULTIBYTE_CASES:\n#endif\n              break;\n              }\n            break;\n\n            case OP_NOT_VSPACE:\n            switch(c)\n              {\n              default: break;\n              VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              VSPACE_MULTIBYTE_CASES:\n#endif\n              RRETURN(MATCH_NOMATCH);\n              }\n            break;\n\n            case OP_VSPACE:\n            switch(c)\n              {\n              default: RRETURN(MATCH_NOMATCH);\n              VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              VSPACE_MULTIBYTE_CASES:\n#endif\n              break;\n              }\n            break;\n\n            case OP_NOT_DIGIT:\n            if (MAX_255(c) && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_DIGIT:\n            if (!MAX_255(c) || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_NOT_WHITESPACE:\n            if (MAX_255(c) && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_WHITESPACE:\n            if (!MAX_255(c) || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_NOT_WORDCHAR:\n            if (MAX_255(c) && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            case OP_WORDCHAR:\n            if (!MAX_255(c) || (md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);\n            break;\n\n            default:\n            RRETURN(PCRE_ERROR_INTERNAL);\n            }\n          }\n        }\n      /* Control never gets here */\n      }\n\n    /* If maximizing, it is worth using inline code for speed, doing the type\n    test once at the start (i.e. keep it out of the loop). Again, keep the\n    UTF-8 and UCP stuff separate. */\n\n    else\n      {\n      pp = eptr;  /* Remember where we started */\n\n#ifdef SUPPORT_UCP\n      if (prop_type >= 0)\n        {\n        switch(prop_type)\n          {\n          case PT_ANY:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            if (prop_fail_result) break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_LAMP:\n          for (i = min; i < max; i++)\n            {\n            int chartype;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            chartype = UCD_CHARTYPE(c);\n            if ((chartype == ucp_Lu ||\n                 chartype == ucp_Ll ||\n                 chartype == ucp_Lt) == prop_fail_result)\n              break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_GC:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result) break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_PC:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result) break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_SC:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_ALNUM:\n          for (i = min; i < max; i++)\n            {\n            int category;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L || category == ucp_N) == prop_fail_result)\n              break;\n            eptr+= len;\n            }\n          break;\n\n          /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n          which means that Perl space and POSIX space are now identical. PCRE\n          was changed at release 8.34. */\n\n          case PT_SPACE:    /* Perl space */\n          case PT_PXSPACE:  /* POSIX space */\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            switch(c)\n              {\n              HSPACE_CASES:\n              VSPACE_CASES:\n              if (prop_fail_result) goto ENDLOOP99;  /* Break the loop */\n              break;\n\n              default:\n              if ((UCD_CATEGORY(c) == ucp_Z) == prop_fail_result)\n                goto ENDLOOP99;   /* Break the loop */\n              break;\n              }\n            eptr+= len;\n            }\n          ENDLOOP99:\n          break;\n\n          case PT_WORD:\n          for (i = min; i < max; i++)\n            {\n            int category;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            category = UCD_CATEGORY(c);\n            if ((category == ucp_L || category == ucp_N ||\n                 c == CHAR_UNDERSCORE) == prop_fail_result)\n              break;\n            eptr+= len;\n            }\n          break;\n\n          case PT_CLIST:\n          for (i = min; i < max; i++)\n            {\n            const pcre_uint32 *cp;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            cp = PRIV(ucd_caseless_sets) + prop_value;\n            for (;;)\n              {\n              if (c < *cp)\n                { if (prop_fail_result) break; else goto GOT_MAX; }\n              if (c == *cp++)\n                { if (prop_fail_result) goto GOT_MAX; else break; }\n              }\n            eptr += len;\n            }\n          GOT_MAX:\n          break;\n\n          case PT_UCNC:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLENTEST(c, eptr, len);\n            if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n                 c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||\n                 c >= 0xe000) == prop_fail_result)\n              break;\n            eptr += len;\n            }\n          break;\n\n          default:\n          RRETURN(PCRE_ERROR_INTERNAL);\n          }\n\n        /* eptr is now past the end of the maximum run */\n\n        if (possessive) continue;    /* No backtracking */\n        for(;;)\n          {\n          if (eptr <= pp) goto TAIL_RECURSE;\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          eptr--;\n          if (utf) BACKCHAR(eptr);\n          }\n        }\n\n      /* Match extended Unicode grapheme clusters. We will get here only if the\n      support is in the binary; otherwise a compile-time error occurs. */\n\n      else if (ctype == OP_EXTUNI)\n        {\n        for (i = min; i < max; i++)\n          {\n          if (eptr >= md->end_subject)\n            {\n            SCHECK_PARTIAL();\n            break;\n            }\n          else\n            {\n            int lgb, rgb;\n            GETCHARINCTEST(c, eptr);\n            lgb = UCD_GRAPHBREAK(c);\n            while (eptr < md->end_subject)\n              {\n              int len = 1;\n              if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); }\n              rgb = UCD_GRAPHBREAK(c);\n              if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n              lgb = rgb;\n              eptr += len;\n              }\n            }\n          CHECK_PARTIAL();\n          }\n\n        /* eptr is now past the end of the maximum run */\n\n        if (possessive) continue;    /* No backtracking */\n\n        /* We use <= pp rather than == pp to detect the start of the run while\n        backtracking because the use of \\C in UTF mode can cause BACKCHAR to\n        move back past pp. This is just palliative; the use of \\C in UTF mode\n        is fraught with danger. */\n\n        for(;;)\n          {\n          int lgb, rgb;\n          PCRE_PUCHAR fptr;\n\n          if (eptr <= pp) goto TAIL_RECURSE;   /* At start of char run */\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n\n          /* Backtracking over an extended grapheme cluster involves inspecting\n          the previous two characters (if present) to see if a break is\n          permitted between them. */\n\n          eptr--;\n          if (!utf) c = *eptr; else\n            {\n            BACKCHAR(eptr);\n            GETCHAR(c, eptr);\n            }\n          rgb = UCD_GRAPHBREAK(c);\n\n          for (;;)\n            {\n            if (eptr <= pp) goto TAIL_RECURSE;   /* At start of char run */\n            fptr = eptr - 1;\n            if (!utf) c = *fptr; else\n              {\n              BACKCHAR(fptr);\n              GETCHAR(c, fptr);\n              }\n            lgb = UCD_GRAPHBREAK(c);\n            if ((PRIV(ucp_gbtable)[lgb] & (1 << rgb)) == 0) break;\n            eptr = fptr;\n            rgb = lgb;\n            }\n          }\n        }\n\n      else\n#endif   /* SUPPORT_UCP */\n\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n        switch(ctype)\n          {\n          case OP_ANY:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (IS_NEWLINE(eptr)) break;\n            if (md->partial != 0 &&    /* Take care with CRLF partial */\n                eptr + 1 >= md->end_subject &&\n                NLBLOCK->nltype == NLTYPE_FIXED &&\n                NLBLOCK->nllen == 2 &&\n                UCHAR21(eptr) == NLBLOCK->nl[0])\n              {\n              md->hitend = TRUE;\n              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n              }\n            eptr++;\n            ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n            }\n          break;\n\n          case OP_ALLANY:\n          if (max < INT_MAX)\n            {\n            for (i = min; i < max; i++)\n              {\n              if (eptr >= md->end_subject)\n                {\n                SCHECK_PARTIAL();\n                break;\n                }\n              eptr++;\n              ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++);\n              }\n            }\n          else\n            {\n            eptr = md->end_subject;   /* Unlimited UTF-8 repeat */\n            SCHECK_PARTIAL();\n            }\n          break;\n\n          /* The byte case is the same as non-UTF8 */\n\n          case OP_ANYBYTE:\n          c = max - min;\n          if (c > (unsigned int)(md->end_subject - eptr))\n            {\n            eptr = md->end_subject;\n            SCHECK_PARTIAL();\n            }\n          else eptr += c;\n          break;\n\n          case OP_ANYNL:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c == CHAR_CR)\n              {\n              if (++eptr >= md->end_subject) break;\n              if (UCHAR21(eptr) == CHAR_LF) eptr++;\n              }\n            else\n              {\n              if (c != CHAR_LF &&\n                  (md->bsr_anycrlf ||\n                   (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL\n#ifndef EBCDIC\n                    && c != 0x2028 && c != 0x2029\n#endif  /* Not EBCDIC */\n                    )))\n                break;\n              eptr += len;\n              }\n            }\n          break;\n\n          case OP_NOT_HSPACE:\n          case OP_HSPACE:\n          for (i = min; i < max; i++)\n            {\n            BOOL gotspace;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            switch(c)\n              {\n              HSPACE_CASES: gotspace = TRUE; break;\n              default: gotspace = FALSE; break;\n              }\n            if (gotspace == (ctype == OP_NOT_HSPACE)) break;\n            eptr += len;\n            }\n          break;\n\n          case OP_NOT_VSPACE:\n          case OP_VSPACE:\n          for (i = min; i < max; i++)\n            {\n            BOOL gotspace;\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            switch(c)\n              {\n              VSPACE_CASES: gotspace = TRUE; break;\n              default: gotspace = FALSE; break;\n              }\n            if (gotspace == (ctype == OP_NOT_VSPACE)) break;\n            eptr += len;\n            }\n          break;\n\n          case OP_NOT_DIGIT:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;\n            eptr+= len;\n            }\n          break;\n\n          case OP_DIGIT:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;\n            eptr+= len;\n            }\n          break;\n\n          case OP_NOT_WHITESPACE:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;\n            eptr+= len;\n            }\n          break;\n\n          case OP_WHITESPACE:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;\n            eptr+= len;\n            }\n          break;\n\n          case OP_NOT_WORDCHAR:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;\n            eptr+= len;\n            }\n          break;\n\n          case OP_WORDCHAR:\n          for (i = min; i < max; i++)\n            {\n            int len = 1;\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            GETCHARLEN(c, eptr, len);\n            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;\n            eptr+= len;\n            }\n          break;\n\n          default:\n          RRETURN(PCRE_ERROR_INTERNAL);\n          }\n\n        if (possessive) continue;    /* No backtracking */\n        for(;;)\n          {\n          if (eptr <= pp) goto TAIL_RECURSE;\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          eptr--;\n          BACKCHAR(eptr);\n          if (ctype == OP_ANYNL && eptr > pp  && UCHAR21(eptr) == CHAR_NL &&\n              UCHAR21(eptr - 1) == CHAR_CR) eptr--;\n          }\n        }\n      else\n#endif  /* SUPPORT_UTF */\n      /* Not UTF mode */\n        {\n        switch(ctype)\n          {\n          case OP_ANY:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (IS_NEWLINE(eptr)) break;\n            if (md->partial != 0 &&    /* Take care with CRLF partial */\n                eptr + 1 >= md->end_subject &&\n                NLBLOCK->nltype == NLTYPE_FIXED &&\n                NLBLOCK->nllen == 2 &&\n                *eptr == NLBLOCK->nl[0])\n              {\n              md->hitend = TRUE;\n              if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\n              }\n            eptr++;\n            }\n          break;\n\n          case OP_ALLANY:\n          case OP_ANYBYTE:\n          c = max - min;\n          if (c > (unsigned int)(md->end_subject - eptr))\n            {\n            eptr = md->end_subject;\n            SCHECK_PARTIAL();\n            }\n          else eptr += c;\n          break;\n\n          case OP_ANYNL:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            c = *eptr;\n            if (c == CHAR_CR)\n              {\n              if (++eptr >= md->end_subject) break;\n              if (*eptr == CHAR_LF) eptr++;\n              }\n            else\n              {\n              if (c != CHAR_LF && (md->bsr_anycrlf ||\n                 (c != CHAR_VT && c != CHAR_FF && c != CHAR_NEL\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n                 && c != 0x2028 && c != 0x2029\n#endif\n                 ))) break;\n              eptr++;\n              }\n            }\n          break;\n\n          case OP_NOT_HSPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            switch(*eptr)\n              {\n              default: eptr++; break;\n              HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              HSPACE_MULTIBYTE_CASES:\n#endif\n              goto ENDLOOP00;\n              }\n            }\n          ENDLOOP00:\n          break;\n\n          case OP_HSPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            switch(*eptr)\n              {\n              default: goto ENDLOOP01;\n              HSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              HSPACE_MULTIBYTE_CASES:\n#endif\n              eptr++; break;\n              }\n            }\n          ENDLOOP01:\n          break;\n\n          case OP_NOT_VSPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            switch(*eptr)\n              {\n              default: eptr++; break;\n              VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              VSPACE_MULTIBYTE_CASES:\n#endif\n              goto ENDLOOP02;\n              }\n            }\n          ENDLOOP02:\n          break;\n\n          case OP_VSPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            switch(*eptr)\n              {\n              default: goto ENDLOOP03;\n              VSPACE_BYTE_CASES:\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n              VSPACE_MULTIBYTE_CASES:\n#endif\n              eptr++; break;\n              }\n            }\n          ENDLOOP03:\n          break;\n\n          case OP_NOT_DIGIT:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) break;\n            eptr++;\n            }\n          break;\n\n          case OP_DIGIT:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) break;\n            eptr++;\n            }\n          break;\n\n          case OP_NOT_WHITESPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) break;\n            eptr++;\n            }\n          break;\n\n          case OP_WHITESPACE:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) break;\n            eptr++;\n            }\n          break;\n\n          case OP_NOT_WORDCHAR:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) break;\n            eptr++;\n            }\n          break;\n\n          case OP_WORDCHAR:\n          for (i = min; i < max; i++)\n            {\n            if (eptr >= md->end_subject)\n              {\n              SCHECK_PARTIAL();\n              break;\n              }\n            if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0) break;\n            eptr++;\n            }\n          break;\n\n          default:\n          RRETURN(PCRE_ERROR_INTERNAL);\n          }\n\n        if (possessive) continue;    /* No backtracking */\n        for (;;)\n          {\n          if (eptr == pp) goto TAIL_RECURSE;\n          RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);\n          if (rrc != MATCH_NOMATCH) RRETURN(rrc);\n          eptr--;\n          if (ctype == OP_ANYNL && eptr > pp  && *eptr == CHAR_LF &&\n              eptr[-1] == CHAR_CR) eptr--;\n          }\n        }\n\n      /* Control never gets here */\n      }\n\n    /* There's been some horrible disaster. Arrival here can only mean there is\n    something seriously wrong in the code above or the OP_xxx definitions. */\n\n    default:\n    DPRINTF((\"Unknown opcode %d\\n\", *ecode));\n    RRETURN(PCRE_ERROR_UNKNOWN_OPCODE);\n    }\n\n  /* Do not stick any code in here without much thought; it is assumed\n  that \"continue\" in the code above comes out to here to repeat the main\n  loop. */\n\n  }             /* End of main loop */\n/* Control never reaches here */\n\n\n/* When compiling to use the heap rather than the stack for recursive calls to\nmatch(), the RRETURN() macro jumps here. The number that is saved in\nframe->Xwhere indicates which label we actually want to return to. */\n\n#ifdef NO_RECURSE\n#define LBL(val) case val: goto L_RM##val;\nHEAP_RETURN:\nswitch (frame->Xwhere)\n  {\n  LBL( 1) LBL( 2) LBL( 3) LBL( 4) LBL( 5) LBL( 6) LBL( 7) LBL( 8)\n  LBL( 9) LBL(10) LBL(11) LBL(12) LBL(13) LBL(14) LBL(15) LBL(17)\n  LBL(19) LBL(24) LBL(25) LBL(26) LBL(27) LBL(29) LBL(31) LBL(33)\n  LBL(35) LBL(43) LBL(47) LBL(48) LBL(49) LBL(50) LBL(51) LBL(52)\n  LBL(53) LBL(54) LBL(55) LBL(56) LBL(57) LBL(58) LBL(63) LBL(64)\n  LBL(65) LBL(66)\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  LBL(20) LBL(21)\n#endif\n#ifdef SUPPORT_UTF\n  LBL(16) LBL(18)\n  LBL(22) LBL(23) LBL(28) LBL(30)\n  LBL(32) LBL(34) LBL(42) LBL(46)\n#ifdef SUPPORT_UCP\n  LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)\n  LBL(59) LBL(60) LBL(61) LBL(62) LBL(67)\n#endif  /* SUPPORT_UCP */\n#endif  /* SUPPORT_UTF */\n  default:\n  DPRINTF((\"jump error in pcre match: label %d non-existent\\n\", frame->Xwhere));\n  return PCRE_ERROR_INTERNAL;\n  }\n#undef LBL\n#endif  /* NO_RECURSE */\n}\n\n\n/***************************************************************************\n****************************************************************************\n                   RECURSION IN THE match() FUNCTION\n\nUndefine all the macros that were defined above to handle this. */\n\n#ifdef NO_RECURSE\n#undef eptr\n#undef ecode\n#undef mstart\n#undef offset_top\n#undef eptrb\n#undef flags\n\n#undef callpat\n#undef charptr\n#undef data\n#undef next\n#undef pp\n#undef prev\n#undef saved_eptr\n\n#undef new_recursive\n\n#undef cur_is_word\n#undef condition\n#undef prev_is_word\n\n#undef ctype\n#undef length\n#undef max\n#undef min\n#undef number\n#undef offset\n#undef op\n#undef save_capture_last\n#undef save_offset1\n#undef save_offset2\n#undef save_offset3\n#undef stacksave\n\n#undef newptrb\n\n#endif\n\n/* These two are defined as macros in both cases */\n\n#undef fc\n#undef fi\n\n/***************************************************************************\n***************************************************************************/\n\n\n#ifdef NO_RECURSE\n/*************************************************\n*          Release allocated heap frames         *\n*************************************************/\n\n/* This function releases all the allocated frames. The base frame is on the\nmachine stack, and so must not be freed.\n\nArgument: the address of the base frame\nReturns:  nothing\n*/\n\nstatic void\nrelease_match_heapframes (heapframe *frame_base)\n{\nheapframe *nextframe = frame_base->Xnextframe;\nwhile (nextframe != NULL)\n  {\n  heapframe *oldframe = nextframe;\n  nextframe = nextframe->Xnextframe;\n  (PUBL(stack_free))(oldframe);\n  }\n}\n#endif\n\n\n/*************************************************\n*         Execute a Regular Expression           *\n*************************************************/\n\n/* This function applies a compiled re to a subject string and picks out\nportions of the string if it matches. Two elements in the vector are set for\neach substring: the offsets to the start and end of the substring.\n\nArguments:\n  argument_re     points to the compiled expression\n  extra_data      points to extra data or is NULL\n  subject         points to the subject string\n  length          length of subject string (may contain binary zeros)\n  start_offset    where to start in the subject string\n  options         option bits\n  offsets         points to a vector of ints to be filled in with offsets\n  offsetcount     the number of elements in the vector\n\nReturns:          > 0 => success; value is the number of elements filled in\n                  = 0 => success, but offsets is not big enough\n                   -1 => failed to match\n                 < -1 => some kind of unexpected problem\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_exec(const pcre *argument_re, const pcre_extra *extra_data,\n  PCRE_SPTR subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,\n  PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,\n  PCRE_SPTR32 subject, int length, int start_offset, int options, int *offsets,\n  int offsetcount)\n#endif\n{\nint rc, ocount, arg_offset_max;\nint newline;\nBOOL using_temporary_offsets = FALSE;\nBOOL anchored;\nBOOL startline;\nBOOL firstline;\nBOOL utf;\nBOOL has_first_char = FALSE;\nBOOL has_req_char = FALSE;\npcre_uchar first_char = 0;\npcre_uchar first_char2 = 0;\npcre_uchar req_char = 0;\npcre_uchar req_char2 = 0;\nmatch_data match_block;\nmatch_data *md = &match_block;\nconst pcre_uint8 *tables;\nconst pcre_uint8 *start_bits = NULL;\nPCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset;\nPCRE_PUCHAR end_subject;\nPCRE_PUCHAR start_partial = NULL;\nPCRE_PUCHAR match_partial = NULL;\nPCRE_PUCHAR req_char_ptr = start_match - 1;\n\nconst pcre_study_data *study;\nconst REAL_PCRE *re = (const REAL_PCRE *)argument_re;\n\n#ifdef NO_RECURSE\nheapframe frame_zero;\nframe_zero.Xprevframe = NULL;            /* Marks the top level */\nframe_zero.Xnextframe = NULL;            /* None are allocated yet */\nmd->match_frames_base = &frame_zero;\n#endif\n\n/* Check for the special magic call that measures the size of the stack used\nper recursive call of match(). Without the funny casting for sizeof, a Windows\ncompiler gave this error: \"unary minus operator applied to unsigned type,\nresult still unsigned\". Hopefully the cast fixes that. */\n\nif (re == NULL && extra_data == NULL && subject == NULL && length == -999 &&\n    start_offset == -999)\n#ifdef NO_RECURSE\n  return -((int)sizeof(heapframe));\n#else\n  return match(NULL, NULL, NULL, 0, NULL, NULL, 0);\n#endif\n\n/* Plausibility checks */\n\nif ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;\nif (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0))\n  return PCRE_ERROR_NULL;\nif (offsetcount < 0) return PCRE_ERROR_BADCOUNT;\nif (length < 0) return PCRE_ERROR_BADLENGTH;\nif (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;\n\n/* Check that the first field in the block is the magic number. If it is not,\nreturn with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to\nREVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which\nmeans that the pattern is likely compiled with different endianness. */\n\nif (re->magic_number != MAGIC_NUMBER)\n  return re->magic_number == REVERSED_MAGIC_NUMBER?\n    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;\nif ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\n\n/* These two settings are used in the code for checking a UTF-8 string that\nfollows immediately afterwards. Other values in the md block are used only\nduring \"normal\" pcre_exec() processing, not when the JIT support is in use,\nso they are set up later. */\n\n/* PCRE_UTF16 has the same value as PCRE_UTF8. */\nutf = md->utf = (re->options & PCRE_UTF8) != 0;\nmd->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 :\n              ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0;\n\n/* Check a UTF-8 string if required. Pass back the character offset and error\ncode for an invalid string if a results vector is available. */\n\n#ifdef SUPPORT_UTF\nif (utf && (options & PCRE_NO_UTF8_CHECK) == 0)\n  {\n  int erroroffset;\n  int errorcode = PRIV(valid_utf)((PCRE_PUCHAR)subject, length, &erroroffset);\n  if (errorcode != 0)\n    {\n    if (offsetcount >= 2)\n      {\n      offsets[0] = erroroffset;\n      offsets[1] = errorcode;\n      }\n#if defined COMPILE_PCRE8\n    return (errorcode <= PCRE_UTF8_ERR5 && md->partial > 1)?\n      PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8;\n#elif defined COMPILE_PCRE16\n    return (errorcode <= PCRE_UTF16_ERR1 && md->partial > 1)?\n      PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16;\n#elif defined COMPILE_PCRE32\n    return PCRE_ERROR_BADUTF32;\n#endif\n    }\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\n  /* Check that a start_offset points to the start of a UTF character. */\n  if (start_offset > 0 && start_offset < length &&\n      NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset]))\n    return PCRE_ERROR_BADUTF8_OFFSET;\n#endif\n  }\n#endif\n\n/* If the pattern was successfully studied with JIT support, run the JIT\nexecutable instead of the rest of this function. Most options must be set at\ncompile time for the JIT code to be usable. Fallback to the normal code path if\nan unsupported flag is set. */\n\n#ifdef SUPPORT_JIT\nif (extra_data != NULL\n    && (extra_data->flags & (PCRE_EXTRA_EXECUTABLE_JIT |\n                             PCRE_EXTRA_TABLES)) == PCRE_EXTRA_EXECUTABLE_JIT\n    && extra_data->executable_jit != NULL\n    && (options & ~PUBLIC_JIT_EXEC_OPTIONS) == 0)\n  {\n  rc = PRIV(jit_exec)(extra_data, (const pcre_uchar *)subject, length,\n       start_offset, options, offsets, offsetcount);\n\n  /* PCRE_ERROR_NULL means that the selected normal or partial matching\n  mode is not compiled. In this case we simply fallback to interpreter. */\n\n  if (rc != PCRE_ERROR_JIT_BADOPTION) return rc;\n  }\n#endif\n\n/* Carry on with non-JIT matching. This information is for finding all the\nnumbers associated with a given name, for condition testing. */\n\nmd->name_table = (pcre_uchar *)re + re->name_table_offset;\nmd->name_count = re->name_count;\nmd->name_entry_size = re->name_entry_size;\n\n/* Fish out the optional data from the extra_data structure, first setting\nthe default values. */\n\nstudy = NULL;\nmd->match_limit = MATCH_LIMIT;\nmd->match_limit_recursion = MATCH_LIMIT_RECURSION;\nmd->callout_data = NULL;\n\n/* The table pointer is always in native byte order. */\n\ntables = re->tables;\n\n/* The two limit values override the defaults, whatever their value. */\n\nif (extra_data != NULL)\n  {\n  unsigned long int flags = extra_data->flags;\n  if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)\n    study = (const pcre_study_data *)extra_data->study_data;\n  if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)\n    md->match_limit = extra_data->match_limit;\n  if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0)\n    md->match_limit_recursion = extra_data->match_limit_recursion;\n  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)\n    md->callout_data = extra_data->callout_data;\n  if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;\n  }\n\n/* Limits in the regex override only if they are smaller. */\n\nif ((re->flags & PCRE_MLSET) != 0 && re->limit_match < md->match_limit)\n  md->match_limit = re->limit_match;\n\nif ((re->flags & PCRE_RLSET) != 0 &&\n    re->limit_recursion < md->match_limit_recursion)\n  md->match_limit_recursion = re->limit_recursion;\n\n/* If the exec call supplied NULL for tables, use the inbuilt ones. This\nis a feature that makes it possible to save compiled regex and re-use them\nin other programs later. */\n\nif (tables == NULL) tables = PRIV(default_tables);\n\n/* Set up other data */\n\nanchored = ((re->options | options) & PCRE_ANCHORED) != 0;\nstartline = (re->flags & PCRE_STARTLINE) != 0;\nfirstline = (re->options & PCRE_FIRSTLINE) != 0;\n\n/* The code starts after the real_pcre block and the capture name table. */\n\nmd->start_code = (const pcre_uchar *)re + re->name_table_offset +\n  re->name_count * re->name_entry_size;\n\nmd->start_subject = (PCRE_PUCHAR)subject;\nmd->start_offset = start_offset;\nmd->end_subject = md->start_subject + length;\nend_subject = md->end_subject;\n\nmd->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;\nmd->use_ucp = (re->options & PCRE_UCP) != 0;\nmd->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;\nmd->ignore_skip_arg = 0;\n\n/* Some options are unpacked into BOOL variables in the hope that testing\nthem will be faster than individual option bits. */\n\nmd->notbol = (options & PCRE_NOTBOL) != 0;\nmd->noteol = (options & PCRE_NOTEOL) != 0;\nmd->notempty = (options & PCRE_NOTEMPTY) != 0;\nmd->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;\n\nmd->hitend = FALSE;\nmd->mark = md->nomatch_mark = NULL;     /* In case never set */\n\nmd->recursive = NULL;                   /* No recursion at top level */\nmd->hasthen = (re->flags & PCRE_HASTHEN) != 0;\n\nmd->lcc = tables + lcc_offset;\nmd->fcc = tables + fcc_offset;\nmd->ctypes = tables + ctypes_offset;\n\n/* Handle different \\R options. */\n\nswitch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))\n  {\n  case 0:\n  if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0)\n    md->bsr_anycrlf = (re->options & PCRE_BSR_ANYCRLF) != 0;\n  else\n#ifdef BSR_ANYCRLF\n  md->bsr_anycrlf = TRUE;\n#else\n  md->bsr_anycrlf = FALSE;\n#endif\n  break;\n\n  case PCRE_BSR_ANYCRLF:\n  md->bsr_anycrlf = TRUE;\n  break;\n\n  case PCRE_BSR_UNICODE:\n  md->bsr_anycrlf = FALSE;\n  break;\n\n  default: return PCRE_ERROR_BADNEWLINE;\n  }\n\n/* Handle different types of newline. The three bits give eight cases. If\nnothing is set at run time, whatever was used at compile time applies. */\n\nswitch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options :\n        (pcre_uint32)options) & PCRE_NEWLINE_BITS)\n  {\n  case 0: newline = NEWLINE; break;   /* Compile-time default */\n  case PCRE_NEWLINE_CR: newline = CHAR_CR; break;\n  case PCRE_NEWLINE_LF: newline = CHAR_NL; break;\n  case PCRE_NEWLINE_CR+\n       PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; break;\n  case PCRE_NEWLINE_ANY: newline = -1; break;\n  case PCRE_NEWLINE_ANYCRLF: newline = -2; break;\n  default: return PCRE_ERROR_BADNEWLINE;\n  }\n\nif (newline == -2)\n  {\n  md->nltype = NLTYPE_ANYCRLF;\n  }\nelse if (newline < 0)\n  {\n  md->nltype = NLTYPE_ANY;\n  }\nelse\n  {\n  md->nltype = NLTYPE_FIXED;\n  if (newline > 255)\n    {\n    md->nllen = 2;\n    md->nl[0] = (newline >> 8) & 255;\n    md->nl[1] = newline & 255;\n    }\n  else\n    {\n    md->nllen = 1;\n    md->nl[0] = newline;\n    }\n  }\n\n/* Partial matching was originally supported only for a restricted set of\nregexes; from release 8.00 there are no restrictions, but the bits are still\ndefined (though never set). So there's no harm in leaving this code. */\n\nif (md->partial && (re->flags & PCRE_NOPARTIAL) != 0)\n  return PCRE_ERROR_BADPARTIAL;\n\n/* If the expression has got more back references than the offsets supplied can\nhold, we get a temporary chunk of working store to use during the matching.\nOtherwise, we can use the vector supplied, rounding down its size to a multiple\nof 3. */\n\nocount = offsetcount - (offsetcount % 3);\narg_offset_max = (2*ocount)/3;\n\nif (re->top_backref > 0 && re->top_backref >= ocount/3)\n  {\n  ocount = re->top_backref * 3 + 3;\n  md->offset_vector = (int *)(PUBL(malloc))(ocount * sizeof(int));\n  if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY;\n  using_temporary_offsets = TRUE;\n  DPRINTF((\"Got memory to hold back references\\n\"));\n  }\nelse md->offset_vector = offsets;\nmd->offset_end = ocount;\nmd->offset_max = (2*ocount)/3;\nmd->capture_last = 0;\n\n/* Reset the working variable associated with each extraction. These should\nnever be used unless previously set, but they get saved and restored, and so we\ninitialize them to avoid reading uninitialized locations. Also, unset the\noffsets for the matched string. This is really just for tidiness with callouts,\nin case they inspect these fields. */\n\nif (md->offset_vector != NULL)\n  {\n  register int *iptr = md->offset_vector + ocount;\n  register int *iend = iptr - re->top_bracket;\n  if (iend < md->offset_vector + 2) iend = md->offset_vector + 2;\n  while (--iptr >= iend) *iptr = -1;\n  if (offsetcount > 0) md->offset_vector[0] = -1;\n  if (offsetcount > 1) md->offset_vector[1] = -1;\n  }\n\n/* Set up the first character to match, if available. The first_char value is\nnever set for an anchored regular expression, but the anchoring may be forced\nat run time, so we have to test for anchoring. The first char may be unset for\nan unanchored pattern, of course. If there's no first char and the pattern was\nstudied, there may be a bitmap of possible first characters. */\n\nif (!anchored)\n  {\n  if ((re->flags & PCRE_FIRSTSET) != 0)\n    {\n    has_first_char = TRUE;\n    first_char = first_char2 = (pcre_uchar)(re->first_char);\n    if ((re->flags & PCRE_FCH_CASELESS) != 0)\n      {\n      first_char2 = TABLE_GET(first_char, md->fcc, first_char);\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n      if (utf && first_char > 127)\n        first_char2 = UCD_OTHERCASE(first_char);\n#endif\n      }\n    }\n  else\n    if (!startline && study != NULL &&\n      (study->flags & PCRE_STUDY_MAPPED) != 0)\n        start_bits = study->start_bits;\n  }\n\n/* For anchored or unanchored matches, there may be a \"last known required\ncharacter\" set. */\n\nif ((re->flags & PCRE_REQCHSET) != 0)\n  {\n  has_req_char = TRUE;\n  req_char = req_char2 = (pcre_uchar)(re->req_char);\n  if ((re->flags & PCRE_RCH_CASELESS) != 0)\n    {\n    req_char2 = TABLE_GET(req_char, md->fcc, req_char);\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n    if (utf && req_char > 127)\n      req_char2 = UCD_OTHERCASE(req_char);\n#endif\n    }\n  }\n\n\n/* ==========================================================================*/\n\n/* Loop for handling unanchored repeated matching attempts; for anchored regexs\nthe loop runs just once. */\n\nfor(;;)\n  {\n  PCRE_PUCHAR save_end_subject = end_subject;\n  PCRE_PUCHAR new_start_match;\n\n  /* If firstline is TRUE, the start of the match is constrained to the first\n  line of a multiline string. That is, the match must be before or at the first\n  newline. Implement this by temporarily adjusting end_subject so that we stop\n  scanning at a newline. If the match fails at the newline, later code breaks\n  this loop. */\n\n  if (firstline)\n    {\n    PCRE_PUCHAR t = start_match;\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      while (t < md->end_subject && !IS_NEWLINE(t))\n        {\n        t++;\n        ACROSSCHAR(t < end_subject, *t, t++);\n        }\n      }\n    else\n#endif\n    while (t < md->end_subject && !IS_NEWLINE(t)) t++;\n    end_subject = t;\n    }\n\n  /* There are some optimizations that avoid running the match if a known\n  starting point is not found, or if a known later character is not present.\n  However, there is an option that disables these, for testing and for ensuring\n  that all callouts do actually occur. The option can be set in the regex by\n  (*NO_START_OPT) or passed in match-time options. */\n\n  if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0)\n    {\n    /* Advance to a unique first char if there is one. */\n\n    if (has_first_char)\n      {\n      pcre_uchar smc;\n\n      if (first_char != first_char2)\n        while (start_match < end_subject &&\n          (smc = UCHAR21TEST(start_match)) != first_char && smc != first_char2)\n          start_match++;\n      else\n        while (start_match < end_subject && UCHAR21TEST(start_match) != first_char)\n          start_match++;\n      }\n\n    /* Or to just after a linebreak for a multiline match */\n\n    else if (startline)\n      {\n      if (start_match > md->start_subject + start_offset)\n        {\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n          while (start_match < end_subject && !WAS_NEWLINE(start_match))\n            {\n            start_match++;\n            ACROSSCHAR(start_match < end_subject, *start_match,\n              start_match++);\n            }\n          }\n        else\n#endif\n        while (start_match < end_subject && !WAS_NEWLINE(start_match))\n          start_match++;\n\n        /* If we have just passed a CR and the newline option is ANY or ANYCRLF,\n        and we are now at a LF, advance the match position by one more character.\n        */\n\n        if (start_match[-1] == CHAR_CR &&\n             (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) &&\n             start_match < end_subject &&\n             UCHAR21TEST(start_match) == CHAR_NL)\n          start_match++;\n        }\n      }\n\n    /* Or to a non-unique first byte after study */\n\n    else if (start_bits != NULL)\n      {\n      while (start_match < end_subject)\n        {\n        register pcre_uint32 c = UCHAR21TEST(start_match);\n#ifndef COMPILE_PCRE8\n        if (c > 255) c = 255;\n#endif\n        if ((start_bits[c/8] & (1 << (c&7))) != 0) break;\n        start_match++;\n        }\n      }\n    }   /* Starting optimizations */\n\n  /* Restore fudged end_subject */\n\n  end_subject = save_end_subject;\n\n  /* The following two optimizations are disabled for partial matching or if\n  disabling is explicitly requested. */\n\n  if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && !md->partial)\n    {\n    /* If the pattern was studied, a minimum subject length may be set. This is\n    a lower bound; no actual string of that length may actually match the\n    pattern. Although the value is, strictly, in characters, we treat it as\n    bytes to avoid spending too much time in this optimization. */\n\n    if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 &&\n        (pcre_uint32)(end_subject - start_match) < study->minlength)\n      {\n      rc = MATCH_NOMATCH;\n      break;\n      }\n\n    /* If req_char is set, we know that that character must appear in the\n    subject for the match to succeed. If the first character is set, req_char\n    must be later in the subject; otherwise the test starts at the match point.\n    This optimization can save a huge amount of backtracking in patterns with\n    nested unlimited repeats that aren't going to match. Writing separate code\n    for cased/caseless versions makes it go faster, as does using an\n    autoincrement and backing off on a match.\n\n    HOWEVER: when the subject string is very, very long, searching to its end\n    can take a long time, and give bad performance on quite ordinary patterns.\n    This showed up when somebody was matching something like /^\\d+C/ on a\n    32-megabyte string... so we don't do this when the string is sufficiently\n    long. */\n\n    if (has_req_char && end_subject - start_match < REQ_BYTE_MAX)\n      {\n      register PCRE_PUCHAR p = start_match + (has_first_char? 1:0);\n\n      /* We don't need to repeat the search if we haven't yet reached the\n      place we found it at last time. */\n\n      if (p > req_char_ptr)\n        {\n        if (req_char != req_char2)\n          {\n          while (p < end_subject)\n            {\n            register pcre_uint32 pp = UCHAR21INCTEST(p);\n            if (pp == req_char || pp == req_char2) { p--; break; }\n            }\n          }\n        else\n          {\n          while (p < end_subject)\n            {\n            if (UCHAR21INCTEST(p) == req_char) { p--; break; }\n            }\n          }\n\n        /* If we can't find the required character, break the matching loop,\n        forcing a match failure. */\n\n        if (p >= end_subject)\n          {\n          rc = MATCH_NOMATCH;\n          break;\n          }\n\n        /* If we have found the required character, save the point where we\n        found it, so that we don't search again next time round the loop if\n        the start hasn't passed this character yet. */\n\n        req_char_ptr = p;\n        }\n      }\n    }\n\n#ifdef PCRE_DEBUG  /* Sigh. Some compilers never learn. */\n  printf(\">>>> Match against: \");\n  pchars(start_match, end_subject - start_match, TRUE, md);\n  printf(\"\\n\");\n#endif\n\n  /* OK, we can now run the match. If \"hitend\" is set afterwards, remember the\n  first starting point for which a partial match was found. */\n\n  md->start_match_ptr = start_match;\n  md->start_used_ptr = start_match;\n  md->match_call_count = 0;\n  md->match_function_type = 0;\n  md->end_offset_top = 0;\n  md->skip_arg_count = 0;\n  rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0);\n  if (md->hitend && start_partial == NULL)\n    {\n    start_partial = md->start_used_ptr;\n    match_partial = start_match;\n    }\n\n  switch(rc)\n    {\n    /* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched\n    the SKIP's arg was not found. In this circumstance, Perl ignores the SKIP\n    entirely. The only way we can do that is to re-do the match at the same\n    point, with a flag to force SKIP with an argument to be ignored. Just\n    treating this case as NOMATCH does not work because it does not check other\n    alternatives in patterns such as A(*SKIP:A)B|AC when the subject is AC. */\n\n    case MATCH_SKIP_ARG:\n    new_start_match = start_match;\n    md->ignore_skip_arg = md->skip_arg_count;\n    break;\n\n    /* SKIP passes back the next starting point explicitly, but if it is no\n    greater than the match we have just done, treat it as NOMATCH. */\n\n    case MATCH_SKIP:\n    if (md->start_match_ptr > start_match)\n      {\n      new_start_match = md->start_match_ptr;\n      break;\n      }\n    /* Fall through */\n\n    /* NOMATCH and PRUNE advance by one character. THEN at this level acts\n    exactly like PRUNE. Unset ignore SKIP-with-argument. */\n\n    case MATCH_NOMATCH:\n    case MATCH_PRUNE:\n    case MATCH_THEN:\n    md->ignore_skip_arg = 0;\n    new_start_match = start_match + 1;\n#ifdef SUPPORT_UTF\n    if (utf)\n      ACROSSCHAR(new_start_match < end_subject, *new_start_match,\n        new_start_match++);\n#endif\n    break;\n\n    /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */\n\n    case MATCH_COMMIT:\n    rc = MATCH_NOMATCH;\n    goto ENDLOOP;\n\n    /* Any other return is either a match, or some kind of error. */\n\n    default:\n    goto ENDLOOP;\n    }\n\n  /* Control reaches here for the various types of \"no match at this point\"\n  result. Reset the code to MATCH_NOMATCH for subsequent checking. */\n\n  rc = MATCH_NOMATCH;\n\n  /* If PCRE_FIRSTLINE is set, the match must happen before or at the first\n  newline in the subject (though it may continue over the newline). Therefore,\n  if we have just failed to match, starting at a newline, do not continue. */\n\n  if (firstline && IS_NEWLINE(start_match)) break;\n\n  /* Advance to new matching position */\n\n  start_match = new_start_match;\n\n  /* Break the loop if the pattern is anchored or if we have passed the end of\n  the subject. */\n\n  if (anchored || start_match > end_subject) break;\n\n  /* If we have just passed a CR and we are now at a LF, and the pattern does\n  not contain any explicit matches for \\r or \\n, and the newline option is CRLF\n  or ANY or ANYCRLF, advance the match position by one more character. In\n  normal matching start_match will aways be greater than the first position at\n  this stage, but a failed *SKIP can cause a return at the same point, which is\n  why the first test exists. */\n\n  if (start_match > (PCRE_PUCHAR)subject + start_offset &&\n      start_match[-1] == CHAR_CR &&\n      start_match < end_subject &&\n      *start_match == CHAR_NL &&\n      (re->flags & PCRE_HASCRORLF) == 0 &&\n        (md->nltype == NLTYPE_ANY ||\n         md->nltype == NLTYPE_ANYCRLF ||\n         md->nllen == 2))\n    start_match++;\n\n  md->mark = NULL;   /* Reset for start of next match attempt */\n  }                  /* End of for(;;) \"bumpalong\" loop */\n\n/* ==========================================================================*/\n\n/* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping\nconditions is true:\n\n(1) The pattern is anchored or the match was failed by (*COMMIT);\n\n(2) We are past the end of the subject;\n\n(3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because\n    this option requests that a match occur at or before the first newline in\n    the subject.\n\nWhen we have a match and the offset vector is big enough to deal with any\nbackreferences, captured substring offsets will already be set up. In the case\nwhere we had to get some local store to hold offsets for backreference\nprocessing, copy those that we can. In this case there need not be overflow if\ncertain parts of the pattern were not used, even though there are more\ncapturing parentheses than vector slots. */\n\nENDLOOP:\n\nif (rc == MATCH_MATCH || rc == MATCH_ACCEPT)\n  {\n  if (using_temporary_offsets)\n    {\n    if (arg_offset_max >= 4)\n      {\n      memcpy(offsets + 2, md->offset_vector + 2,\n        (arg_offset_max - 2) * sizeof(int));\n      DPRINTF((\"Copied offsets from temporary memory\\n\"));\n      }\n    if (md->end_offset_top > arg_offset_max) md->capture_last |= OVFLBIT;\n    DPRINTF((\"Freeing temporary memory\\n\"));\n    (PUBL(free))(md->offset_vector);\n    }\n\n  /* Set the return code to the number of captured strings, or 0 if there were\n  too many to fit into the vector. */\n\n  rc = ((md->capture_last & OVFLBIT) != 0 &&\n         md->end_offset_top >= arg_offset_max)?\n    0 : md->end_offset_top/2;\n\n  /* If there is space in the offset vector, set any unused pairs at the end of\n  the pattern to -1 for backwards compatibility. It is documented that this\n  happens. In earlier versions, the whole set of potential capturing offsets\n  was set to -1 each time round the loop, but this is handled differently now.\n  \"Gaps\" are set to -1 dynamically instead (this fixes a bug). Thus, it is only\n  those at the end that need unsetting here. We can't just unset them all at\n  the start of the whole thing because they may get set in one branch that is\n  not the final matching branch. */\n\n  if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL)\n    {\n    register int *iptr, *iend;\n    int resetcount = 2 + re->top_bracket * 2;\n    if (resetcount > offsetcount) resetcount = offsetcount;\n    iptr = offsets + md->end_offset_top;\n    iend = offsets + resetcount;\n    while (iptr < iend) *iptr++ = -1;\n    }\n\n  /* If there is space, set up the whole thing as substring 0. The value of\n  md->start_match_ptr might be modified if \\K was encountered on the success\n  matching path. */\n\n  if (offsetcount < 2) rc = 0; else\n    {\n    offsets[0] = (int)(md->start_match_ptr - md->start_subject);\n    offsets[1] = (int)(md->end_match_ptr - md->start_subject);\n    }\n\n  /* Return MARK data if requested */\n\n  if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0)\n    *(extra_data->mark) = (pcre_uchar *)md->mark;\n  DPRINTF((\">>>> returning %d\\n\", rc));\n#ifdef NO_RECURSE\n  release_match_heapframes(&frame_zero);\n#endif\n  return rc;\n  }\n\n/* Control gets here if there has been an error, or if the overall match\nattempt has failed at all permitted starting positions. */\n\nif (using_temporary_offsets)\n  {\n  DPRINTF((\"Freeing temporary memory\\n\"));\n  (PUBL(free))(md->offset_vector);\n  }\n\n/* For anything other than nomatch or partial match, just return the code. */\n\nif (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL)\n  {\n  DPRINTF((\">>>> error: returning %d\\n\", rc));\n#ifdef NO_RECURSE\n  release_match_heapframes(&frame_zero);\n#endif\n  return rc;\n  }\n\n/* Handle partial matches - disable any mark data */\n\nif (match_partial != NULL)\n  {\n  DPRINTF((\">>>> returning PCRE_ERROR_PARTIAL\\n\"));\n  md->mark = NULL;\n  if (offsetcount > 1)\n    {\n    offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject);\n    offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);\n    if (offsetcount > 2)\n      offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject);\n    }\n  rc = PCRE_ERROR_PARTIAL;\n  }\n\n/* This is the classic nomatch case */\n\nelse\n  {\n  DPRINTF((\">>>> returning PCRE_ERROR_NOMATCH\\n\"));\n  rc = PCRE_ERROR_NOMATCH;\n  }\n\n/* Return the MARK data if it has been requested. */\n\nif (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0)\n  *(extra_data->mark) = (pcre_uchar *)md->nomatch_mark;\n#ifdef NO_RECURSE\n  release_match_heapframes(&frame_zero);\n#endif\nreturn rc;\n}\n\n/* End of pcre_exec.c */\n"
  },
  {
    "path": "src/pcre/pcre_fullinfo.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_fullinfo(), which returns\ninformation about a compiled pattern. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*        Return info about compiled pattern      *\n*************************************************/\n\n/* This is a newer \"info\" function which has an extensible interface so\nthat additional items can be added compatibly.\n\nArguments:\n  argument_re      points to compiled code\n  extra_data       points extra data, or NULL\n  what             what information is required\n  where            where to put the information\n\nReturns:           0 if data returned, negative on error\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data,\n  int what, void *where)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data,\n  int what, void *where)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_fullinfo(const pcre32 *argument_re, const pcre32_extra *extra_data,\n  int what, void *where)\n#endif\n{\nconst REAL_PCRE *re = (const REAL_PCRE *)argument_re;\nconst pcre_study_data *study = NULL;\n\nif (re == NULL || where == NULL) return PCRE_ERROR_NULL;\n\nif (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)\n  study = (const pcre_study_data *)extra_data->study_data;\n\n/* Check that the first field in the block is the magic number. If it is not,\nreturn with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to\nREVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which\nmeans that the pattern is likely compiled with different endianness. */\n\nif (re->magic_number != MAGIC_NUMBER)\n  return re->magic_number == REVERSED_MAGIC_NUMBER?\n    PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;\n\n/* Check that this pattern was compiled in the correct bit mode */\n\nif ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\n\nswitch (what)\n  {\n  case PCRE_INFO_OPTIONS:\n  *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_OPTIONS;\n  break;\n\n  case PCRE_INFO_SIZE:\n  *((size_t *)where) = re->size;\n  break;\n\n  case PCRE_INFO_STUDYSIZE:\n  *((size_t *)where) = (study == NULL)? 0 : study->size;\n  break;\n\n  case PCRE_INFO_JITSIZE:\n#ifdef SUPPORT_JIT\n  *((size_t *)where) =\n      (extra_data != NULL &&\n      (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&\n      extra_data->executable_jit != NULL)?\n    PRIV(jit_get_size)(extra_data->executable_jit) : 0;\n#else\n  *((size_t *)where) = 0;\n#endif\n  break;\n\n  case PCRE_INFO_CAPTURECOUNT:\n  *((int *)where) = re->top_bracket;\n  break;\n\n  case PCRE_INFO_BACKREFMAX:\n  *((int *)where) = re->top_backref;\n  break;\n\n  case PCRE_INFO_FIRSTBYTE:\n  *((int *)where) =\n    ((re->flags & PCRE_FIRSTSET) != 0)? (int)re->first_char :\n    ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;\n  break;\n\n  case PCRE_INFO_FIRSTCHARACTER:\n    *((pcre_uint32 *)where) =\n      (re->flags & PCRE_FIRSTSET) != 0 ? re->first_char : 0;\n    break;\n\n  case PCRE_INFO_FIRSTCHARACTERFLAGS:\n    *((int *)where) =\n      ((re->flags & PCRE_FIRSTSET) != 0) ? 1 :\n      ((re->flags & PCRE_STARTLINE) != 0) ? 2 : 0;\n    break;\n\n  /* Make sure we pass back the pointer to the bit vector in the external\n  block, not the internal copy (with flipped integer fields). */\n\n  case PCRE_INFO_FIRSTTABLE:\n  *((const pcre_uint8 **)where) =\n    (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)?\n      ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;\n  break;\n\n  case PCRE_INFO_MINLENGTH:\n  *((int *)where) =\n    (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)?\n      (int)(study->minlength) : -1;\n  break;\n\n  case PCRE_INFO_JIT:\n  *((int *)where) = extra_data != NULL &&\n                    (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&\n                    extra_data->executable_jit != NULL;\n  break;\n\n  case PCRE_INFO_LASTLITERAL:\n  *((int *)where) =\n    ((re->flags & PCRE_REQCHSET) != 0)? (int)re->req_char : -1;\n  break;\n\n  case PCRE_INFO_REQUIREDCHAR:\n    *((pcre_uint32 *)where) =\n      ((re->flags & PCRE_REQCHSET) != 0) ? re->req_char : 0;\n    break;\n\n  case PCRE_INFO_REQUIREDCHARFLAGS:\n    *((int *)where) =\n      ((re->flags & PCRE_REQCHSET) != 0);\n    break;\n\n  case PCRE_INFO_NAMEENTRYSIZE:\n  *((int *)where) = re->name_entry_size;\n  break;\n\n  case PCRE_INFO_NAMECOUNT:\n  *((int *)where) = re->name_count;\n  break;\n\n  case PCRE_INFO_NAMETABLE:\n  *((const pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset;\n  break;\n\n  case PCRE_INFO_DEFAULT_TABLES:\n  *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables));\n  break;\n\n  /* From release 8.00 this will always return TRUE because NOPARTIAL is\n  no longer ever set (the restrictions have been removed). */\n\n  case PCRE_INFO_OKPARTIAL:\n  *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;\n  break;\n\n  case PCRE_INFO_JCHANGED:\n  *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;\n  break;\n\n  case PCRE_INFO_HASCRORLF:\n  *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;\n  break;\n\n  case PCRE_INFO_MAXLOOKBEHIND:\n  *((int *)where) = re->max_lookbehind;\n  break;\n\n  case PCRE_INFO_MATCHLIMIT:\n  if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET;\n  *((pcre_uint32 *)where) = re->limit_match;\n  break;\n\n  case PCRE_INFO_RECURSIONLIMIT:\n  if ((re->flags & PCRE_RLSET) == 0) return PCRE_ERROR_UNSET;\n  *((pcre_uint32 *)where) = re->limit_recursion;\n  break;\n\n  case PCRE_INFO_MATCH_EMPTY:\n  *((int *)where) = (re->flags & PCRE_MATCH_EMPTY) != 0;\n  break;\n\n  default: return PCRE_ERROR_BADOPTION;\n  }\n\nreturn 0;\n}\n\n/* End of pcre_fullinfo.c */\n"
  },
  {
    "path": "src/pcre/pcre_get.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains some convenience functions for extracting substrings\nfrom the subject string after a regex match has succeeded. The original idea\nfor these functions came from Scott Wimer. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*           Find number for named string         *\n*************************************************/\n\n/* This function is used by the get_first_set() function below, as well\nas being generally available. It assumes that names are unique.\n\nArguments:\n  code        the compiled regex\n  stringname  the name whose number is required\n\nReturns:      the number of the named parentheses, or a negative number\n                (PCRE_ERROR_NOSUBSTRING) if not found\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_get_stringnumber(const pcre *code, const char *stringname)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_get_stringnumber(const pcre32 *code, PCRE_SPTR32 stringname)\n#endif\n{\nint rc;\nint entrysize;\nint top, bot;\npcre_uchar *nametable;\n\n#ifdef COMPILE_PCRE8\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n#ifdef COMPILE_PCRE16\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n#ifdef COMPILE_PCRE32\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n\nbot = 0;\nwhile (top > bot)\n  {\n  int mid = (top + bot) / 2;\n  pcre_uchar *entry = nametable + entrysize*mid;\n  int c = STRCMP_UC_UC((pcre_uchar *)stringname,\n    (pcre_uchar *)(entry + IMM2_SIZE));\n  if (c == 0) return GET2(entry, 0);\n  if (c > 0) bot = mid + 1; else top = mid;\n  }\n\nreturn PCRE_ERROR_NOSUBSTRING;\n}\n\n\n\n/*************************************************\n*     Find (multiple) entries for named string   *\n*************************************************/\n\n/* This is used by the get_first_set() function below, as well as being\ngenerally available. It is used when duplicated names are permitted.\n\nArguments:\n  code        the compiled regex\n  stringname  the name whose entries required\n  firstptr    where to put the pointer to the first entry\n  lastptr     where to put the pointer to the last entry\n\nReturns:      the length of each entry, or a negative number\n                (PCRE_ERROR_NOSUBSTRING) if not found\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_get_stringtable_entries(const pcre *code, const char *stringname,\n  char **firstptr, char **lastptr)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname,\n  PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_get_stringtable_entries(const pcre32 *code, PCRE_SPTR32 stringname,\n  PCRE_UCHAR32 **firstptr, PCRE_UCHAR32 **lastptr)\n#endif\n{\nint rc;\nint entrysize;\nint top, bot;\npcre_uchar *nametable, *lastentry;\n\n#ifdef COMPILE_PCRE8\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n#ifdef COMPILE_PCRE16\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n#ifdef COMPILE_PCRE32\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)\n  return rc;\nif (top <= 0) return PCRE_ERROR_NOSUBSTRING;\n\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)\n  return rc;\nif ((rc = pcre32_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)\n  return rc;\n#endif\n\nlastentry = nametable + entrysize * (top - 1);\nbot = 0;\nwhile (top > bot)\n  {\n  int mid = (top + bot) / 2;\n  pcre_uchar *entry = nametable + entrysize*mid;\n  int c = STRCMP_UC_UC((pcre_uchar *)stringname,\n    (pcre_uchar *)(entry + IMM2_SIZE));\n  if (c == 0)\n    {\n    pcre_uchar *first = entry;\n    pcre_uchar *last = entry;\n    while (first > nametable)\n      {\n      if (STRCMP_UC_UC((pcre_uchar *)stringname,\n        (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break;\n      first -= entrysize;\n      }\n    while (last < lastentry)\n      {\n      if (STRCMP_UC_UC((pcre_uchar *)stringname,\n        (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break;\n      last += entrysize;\n      }\n#if defined COMPILE_PCRE8\n    *firstptr = (char *)first;\n    *lastptr = (char *)last;\n#elif defined COMPILE_PCRE16\n    *firstptr = (PCRE_UCHAR16 *)first;\n    *lastptr = (PCRE_UCHAR16 *)last;\n#elif defined COMPILE_PCRE32\n    *firstptr = (PCRE_UCHAR32 *)first;\n    *lastptr = (PCRE_UCHAR32 *)last;\n#endif\n    return entrysize;\n    }\n  if (c > 0) bot = mid + 1; else top = mid;\n  }\n\nreturn PCRE_ERROR_NOSUBSTRING;\n}\n\n\n\n/*************************************************\n*    Find first set of multiple named strings    *\n*************************************************/\n\n/* This function allows for duplicate names in the table of named substrings.\nIt returns the number of the first one that was set in a pattern match.\n\nArguments:\n  code         the compiled regex\n  stringname   the name of the capturing substring\n  ovector      the vector of matched substrings\n  stringcount  number of captured substrings\n\nReturns:       the number of the first that is set,\n               or the number of the last one if none are set,\n               or a negative number on error\n*/\n\n#if defined COMPILE_PCRE8\nstatic int\nget_first_set(const pcre *code, const char *stringname, int *ovector,\n  int stringcount)\n#elif defined COMPILE_PCRE16\nstatic int\nget_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector,\n  int stringcount)\n#elif defined COMPILE_PCRE32\nstatic int\nget_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector,\n  int stringcount)\n#endif\n{\nconst REAL_PCRE *re = (const REAL_PCRE *)code;\nint entrysize;\npcre_uchar *entry;\n#if defined COMPILE_PCRE8\nchar *first, *last;\n#elif defined COMPILE_PCRE16\nPCRE_UCHAR16 *first, *last;\n#elif defined COMPILE_PCRE32\nPCRE_UCHAR32 *first, *last;\n#endif\n\n#if defined COMPILE_PCRE8\nif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)\n  return pcre_get_stringnumber(code, stringname);\nentrysize = pcre_get_stringtable_entries(code, stringname, &first, &last);\n#elif defined COMPILE_PCRE16\nif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)\n  return pcre16_get_stringnumber(code, stringname);\nentrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last);\n#elif defined COMPILE_PCRE32\nif ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0)\n  return pcre32_get_stringnumber(code, stringname);\nentrysize = pcre32_get_stringtable_entries(code, stringname, &first, &last);\n#endif\nif (entrysize <= 0) return entrysize;\nfor (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)\n  {\n  int n = GET2(entry, 0);\n  if (n < stringcount && ovector[n*2] >= 0) return n;\n  }\nreturn GET2(entry, 0);\n}\n\n\n\n\n/*************************************************\n*      Copy captured string to given buffer      *\n*************************************************/\n\n/* This function copies a single captured substring into a given buffer.\nNote that we use memcpy() rather than strncpy() in case there are binary zeros\nin the string.\n\nArguments:\n  subject        the subject string that was matched\n  ovector        pointer to the offsets table\n  stringcount    the number of substrings that were captured\n                   (i.e. the yield of the pcre_exec call, unless\n                   that was zero, in which case it should be 1/3\n                   of the offset table size)\n  stringnumber   the number of the required substring\n  buffer         where to put the substring\n  size           the size of the buffer\n\nReturns:         if successful:\n                   the length of the copied string, not including the zero\n                   that is put on the end; can be zero\n                 if not successful:\n                   PCRE_ERROR_NOMEMORY (-6) buffer too small\n                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_copy_substring(const char *subject, int *ovector, int stringcount,\n  int stringnumber, char *buffer, int size)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,\n  int stringnumber, PCRE_UCHAR16 *buffer, int size)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,\n  int stringnumber, PCRE_UCHAR32 *buffer, int size)\n#endif\n{\nint yield;\nif (stringnumber < 0 || stringnumber >= stringcount)\n  return PCRE_ERROR_NOSUBSTRING;\nstringnumber *= 2;\nyield = ovector[stringnumber+1] - ovector[stringnumber];\nif (size < yield + 1) return PCRE_ERROR_NOMEMORY;\nmemcpy(buffer, subject + ovector[stringnumber], IN_UCHARS(yield));\nbuffer[yield] = 0;\nreturn yield;\n}\n\n\n\n/*************************************************\n*   Copy named captured string to given buffer   *\n*************************************************/\n\n/* This function copies a single captured substring into a given buffer,\nidentifying it by name. If the regex permits duplicate names, the first\nsubstring that is set is chosen.\n\nArguments:\n  code           the compiled regex\n  subject        the subject string that was matched\n  ovector        pointer to the offsets table\n  stringcount    the number of substrings that were captured\n                   (i.e. the yield of the pcre_exec call, unless\n                   that was zero, in which case it should be 1/3\n                   of the offset table size)\n  stringname     the name of the required substring\n  buffer         where to put the substring\n  size           the size of the buffer\n\nReturns:         if successful:\n                   the length of the copied string, not including the zero\n                   that is put on the end; can be zero\n                 if not successful:\n                   PCRE_ERROR_NOMEMORY (-6) buffer too small\n                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_copy_named_substring(const pcre *code, const char *subject,\n  int *ovector, int stringcount, const char *stringname,\n  char *buffer, int size)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject,\n  int *ovector, int stringcount, PCRE_SPTR16 stringname,\n  PCRE_UCHAR16 *buffer, int size)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,\n  int *ovector, int stringcount, PCRE_SPTR32 stringname,\n  PCRE_UCHAR32 *buffer, int size)\n#endif\n{\nint n = get_first_set(code, stringname, ovector, stringcount);\nif (n <= 0) return n;\n#if defined COMPILE_PCRE8\nreturn pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);\n#elif defined COMPILE_PCRE16\nreturn pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size);\n#elif defined COMPILE_PCRE32\nreturn pcre32_copy_substring(subject, ovector, stringcount, n, buffer, size);\n#endif\n}\n\n\n\n/*************************************************\n*      Copy all captured strings to new store    *\n*************************************************/\n\n/* This function gets one chunk of store and builds a list of pointers and all\nof the captured substrings in it. A NULL pointer is put on the end of the list.\n\nArguments:\n  subject        the subject string that was matched\n  ovector        pointer to the offsets table\n  stringcount    the number of substrings that were captured\n                   (i.e. the yield of the pcre_exec call, unless\n                   that was zero, in which case it should be 1/3\n                   of the offset table size)\n  listptr        set to point to the list of pointers\n\nReturns:         if successful: 0\n                 if not successful:\n                   PCRE_ERROR_NOMEMORY (-6) failed to get store\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_get_substring_list(const char *subject, int *ovector, int stringcount,\n  const char ***listptr)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount,\n  PCRE_SPTR16 **listptr)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_get_substring_list(PCRE_SPTR32 subject, int *ovector, int stringcount,\n  PCRE_SPTR32 **listptr)\n#endif\n{\nint i;\nint size = sizeof(pcre_uchar *);\nint double_count = stringcount * 2;\npcre_uchar **stringlist;\npcre_uchar *p;\n\nfor (i = 0; i < double_count; i += 2)\n  {\n  size += sizeof(pcre_uchar *) + IN_UCHARS(1);\n  if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]);\n  }\n\nstringlist = (pcre_uchar **)(PUBL(malloc))(size);\nif (stringlist == NULL) return PCRE_ERROR_NOMEMORY;\n\n#if defined COMPILE_PCRE8\n*listptr = (const char **)stringlist;\n#elif defined COMPILE_PCRE16\n*listptr = (PCRE_SPTR16 *)stringlist;\n#elif defined COMPILE_PCRE32\n*listptr = (PCRE_SPTR32 *)stringlist;\n#endif\np = (pcre_uchar *)(stringlist + stringcount + 1);\n\nfor (i = 0; i < double_count; i += 2)\n  {\n  int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0;\n  memcpy(p, subject + ovector[i], IN_UCHARS(len));\n  *stringlist++ = p;\n  p += len;\n  *p++ = 0;\n  }\n\n*stringlist = NULL;\nreturn 0;\n}\n\n\n\n/*************************************************\n*   Free store obtained by get_substring_list    *\n*************************************************/\n\n/* This function exists for the benefit of people calling PCRE from non-C\nprograms that can call its functions, but not free() or (PUBL(free))()\ndirectly.\n\nArgument:   the result of a previous pcre_get_substring_list()\nReturns:    nothing\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre_free_substring_list(const char **pointer)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre16_free_substring_list(PCRE_SPTR16 *pointer)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre32_free_substring_list(PCRE_SPTR32 *pointer)\n#endif\n{\n(PUBL(free))((void *)pointer);\n}\n\n\n\n/*************************************************\n*      Copy captured string to new store         *\n*************************************************/\n\n/* This function copies a single captured substring into a piece of new\nstore\n\nArguments:\n  subject        the subject string that was matched\n  ovector        pointer to the offsets table\n  stringcount    the number of substrings that were captured\n                   (i.e. the yield of the pcre_exec call, unless\n                   that was zero, in which case it should be 1/3\n                   of the offset table size)\n  stringnumber   the number of the required substring\n  stringptr      where to put a pointer to the substring\n\nReturns:         if successful:\n                   the length of the string, not including the zero that\n                   is put on the end; can be zero\n                 if not successful:\n                   PCRE_ERROR_NOMEMORY (-6) failed to get store\n                   PCRE_ERROR_NOSUBSTRING (-7) substring not present\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_get_substring(const char *subject, int *ovector, int stringcount,\n  int stringnumber, const char **stringptr)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount,\n  int stringnumber, PCRE_SPTR16 *stringptr)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_get_substring(PCRE_SPTR32 subject, int *ovector, int stringcount,\n  int stringnumber, PCRE_SPTR32 *stringptr)\n#endif\n{\nint yield;\npcre_uchar *substring;\nif (stringnumber < 0 || stringnumber >= stringcount)\n  return PCRE_ERROR_NOSUBSTRING;\nstringnumber *= 2;\nyield = ovector[stringnumber+1] - ovector[stringnumber];\nsubstring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1));\nif (substring == NULL) return PCRE_ERROR_NOMEMORY;\nmemcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield));\nsubstring[yield] = 0;\n#if defined COMPILE_PCRE8\n*stringptr = (const char *)substring;\n#elif defined COMPILE_PCRE16\n*stringptr = (PCRE_SPTR16)substring;\n#elif defined COMPILE_PCRE32\n*stringptr = (PCRE_SPTR32)substring;\n#endif\nreturn yield;\n}\n\n\n\n/*************************************************\n*   Copy named captured string to new store      *\n*************************************************/\n\n/* This function copies a single captured substring, identified by name, into\nnew store. If the regex permits duplicate names, the first substring that is\nset is chosen.\n\nArguments:\n  code           the compiled regex\n  subject        the subject string that was matched\n  ovector        pointer to the offsets table\n  stringcount    the number of substrings that were captured\n                   (i.e. the yield of the pcre_exec call, unless\n                   that was zero, in which case it should be 1/3\n                   of the offset table size)\n  stringname     the name of the required substring\n  stringptr      where to put the pointer\n\nReturns:         if successful:\n                   the length of the copied string, not including the zero\n                   that is put on the end; can be zero\n                 if not successful:\n                   PCRE_ERROR_NOMEMORY (-6) couldn't get memory\n                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_get_named_substring(const pcre *code, const char *subject,\n  int *ovector, int stringcount, const char *stringname,\n  const char **stringptr)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject,\n  int *ovector, int stringcount, PCRE_SPTR16 stringname,\n  PCRE_SPTR16 *stringptr)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,\n  int *ovector, int stringcount, PCRE_SPTR32 stringname,\n  PCRE_SPTR32 *stringptr)\n#endif\n{\nint n = get_first_set(code, stringname, ovector, stringcount);\nif (n <= 0) return n;\n#if defined COMPILE_PCRE8\nreturn pcre_get_substring(subject, ovector, stringcount, n, stringptr);\n#elif defined COMPILE_PCRE16\nreturn pcre16_get_substring(subject, ovector, stringcount, n, stringptr);\n#elif defined COMPILE_PCRE32\nreturn pcre32_get_substring(subject, ovector, stringcount, n, stringptr);\n#endif\n}\n\n\n\n\n/*************************************************\n*       Free store obtained by get_substring     *\n*************************************************/\n\n/* This function exists for the benefit of people calling PCRE from non-C\nprograms that can call its functions, but not free() or (PUBL(free))()\ndirectly.\n\nArgument:   the result of a previous pcre_get_substring()\nReturns:    nothing\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre_free_substring(const char *pointer)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre16_free_substring(PCRE_SPTR16 pointer)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN void PCRE_CALL_CONVENTION\npcre32_free_substring(PCRE_SPTR32 pointer)\n#endif\n{\n(PUBL(free))((void *)pointer);\n}\n\n/* End of pcre_get.c */\n"
  },
  {
    "path": "src/pcre/pcre_globals.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains global variables that are exported by the PCRE library.\nPCRE is thread-clean and doesn't use any global variables in the normal sense.\nHowever, it calls memory allocation and freeing functions via the four\nindirections below, and it can optionally do callouts, using the fifth\nindirection. These values can be changed by the caller, but are shared between\nall threads.\n\nFor MS Visual Studio and Symbian OS, there are problems in initializing these\nvariables to non-local functions. In these cases, therefore, an indirection via\na local function is used.\n\nAlso, when compiling for Virtual Pascal, things are done differently, and\nglobal variables are not used. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#if defined _MSC_VER || defined  __SYMBIAN32__\nstatic void* LocalPcreMalloc(size_t aSize)\n  {\n  return malloc(aSize);\n  }\nstatic void LocalPcreFree(void* aPtr)\n  {\n  free(aPtr);\n  }\nPCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = LocalPcreMalloc;\nPCRE_EXP_DATA_DEFN void  (*PUBL(free))(void *) = LocalPcreFree;\nPCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = LocalPcreMalloc;\nPCRE_EXP_DATA_DEFN void  (*PUBL(stack_free))(void *) = LocalPcreFree;\nPCRE_EXP_DATA_DEFN int   (*PUBL(callout))(PUBL(callout_block) *) = NULL;\nPCRE_EXP_DATA_DEFN int   (*PUBL(stack_guard))(void) = NULL;\n\n#elif !defined VPCOMPAT\nPCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = malloc;\nPCRE_EXP_DATA_DEFN void  (*PUBL(free))(void *) = free;\nPCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = malloc;\nPCRE_EXP_DATA_DEFN void  (*PUBL(stack_free))(void *) = free;\nPCRE_EXP_DATA_DEFN int   (*PUBL(callout))(PUBL(callout_block) *) = NULL;\nPCRE_EXP_DATA_DEFN int   (*PUBL(stack_guard))(void) = NULL;\n#endif\n\n/* End of pcre_globals.c */\n"
  },
  {
    "path": "src/pcre/pcre_internal.h",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2016 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* This header contains definitions that are shared between the different\nmodules, but which are not relevant to the exported API. This includes some\nfunctions whose names all begin with \"_pcre_\", \"_pcre16_\" or \"_pcre32_\"\ndepending on the PRIV macro. */\n\n#ifndef PCRE_INTERNAL_H\n#define PCRE_INTERNAL_H\n\n/* Define PCRE_DEBUG to get debugging output on stdout. */\n\n#if 0\n#define PCRE_DEBUG\n#endif\n\n/* PCRE is compiled as an 8 bit library if it is not requested otherwise. */\n\n#if !defined COMPILE_PCRE16 && !defined COMPILE_PCRE32\n#define COMPILE_PCRE8\n#endif\n\n/* If SUPPORT_UCP is defined, SUPPORT_UTF must also be defined. The\n\"configure\" script ensures this, but not everybody uses \"configure\". */\n\n#if defined SUPPORT_UCP && !(defined SUPPORT_UTF)\n#define SUPPORT_UTF 1\n#endif\n\n/* We define SUPPORT_UTF if SUPPORT_UTF8 is enabled for compatibility\nreasons with existing code. */\n\n#if defined SUPPORT_UTF8 && !(defined SUPPORT_UTF)\n#define SUPPORT_UTF 1\n#endif\n\n/* Fixme: SUPPORT_UTF8 should be eventually disappear from the code.\nUntil then we define it if SUPPORT_UTF is defined. */\n\n#if defined SUPPORT_UTF && !(defined SUPPORT_UTF8)\n#define SUPPORT_UTF8 1\n#endif\n\n/* We do not support both EBCDIC and UTF-8/16/32 at the same time. The \"configure\"\nscript prevents both being selected, but not everybody uses \"configure\". */\n\n#if defined EBCDIC && defined SUPPORT_UTF\n#error The use of both EBCDIC and SUPPORT_UTF is not supported.\n#endif\n\n/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef\ninline, and there are *still* stupid compilers about that don't like indented\npre-processor statements, or at least there were when I first wrote this. After\nall, it had only been about 10 years then...\n\nIt turns out that the Mac Debugging.h header also defines the macro DPRINTF, so\nbe absolutely sure we get our version. */\n\n#undef DPRINTF\n#ifdef PCRE_DEBUG\n#define DPRINTF(p) printf p\n#else\n#define DPRINTF(p) /* Nothing */\n#endif\n\n\n/* Standard C headers plus the external interface definition. The only time\nsetjmp and stdarg are used is when NO_RECURSE is set. */\n\n#include <ctype.h>\n#include <limits.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n/* Valgrind (memcheck) support */\n\n#ifdef SUPPORT_VALGRIND\n#include <valgrind/memcheck.h>\n#endif\n\n/* When compiling a DLL for Windows, the exported symbols have to be declared\nusing some MS magic. I found some useful information on this web page:\nhttp://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the\ninformation there, using __declspec(dllexport) without \"extern\" we have a\ndefinition; with \"extern\" we have a declaration. The settings here override the\nsetting in pcre.h (which is included below); it defines only PCRE_EXP_DECL,\nwhich is all that is needed for applications (they just import the symbols). We\nuse:\n\n  PCRE_EXP_DECL       for declarations\n  PCRE_EXP_DEFN       for definitions of exported functions\n  PCRE_EXP_DATA_DEFN  for definitions of exported variables\n\nThe reason for the two DEFN macros is that in non-Windows environments, one\ndoes not want to have \"extern\" before variable definitions because it leads to\ncompiler warnings. So we distinguish between functions and variables. In\nWindows, the two should always be the same.\n\nThe reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest,\nwhich is an application, but needs to import this file in order to \"peek\" at\ninternals, can #include pcre.h first to get an application's-eye view.\n\nIn principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon,\nspecial-purpose environments) might want to stick other stuff in front of\nexported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and\nPCRE_EXP_DATA_DEFN only if they are not already set. */\n\n#ifndef PCRE_EXP_DECL\n#  ifdef _WIN32\n#    ifndef PCRE_STATIC\n#      define PCRE_EXP_DECL       extern __declspec(dllexport)\n#      define PCRE_EXP_DEFN       __declspec(dllexport)\n#      define PCRE_EXP_DATA_DEFN  __declspec(dllexport)\n#    else\n#      define PCRE_EXP_DECL       extern\n#      define PCRE_EXP_DEFN\n#      define PCRE_EXP_DATA_DEFN\n#    endif\n#  else\n#    ifdef __cplusplus\n#      define PCRE_EXP_DECL       extern \"C\"\n#    else\n#      define PCRE_EXP_DECL       extern\n#    endif\n#    ifndef PCRE_EXP_DEFN\n#      define PCRE_EXP_DEFN       PCRE_EXP_DECL\n#    endif\n#    ifndef PCRE_EXP_DATA_DEFN\n#      define PCRE_EXP_DATA_DEFN\n#    endif\n#  endif\n#endif\n\n/* When compiling with the MSVC compiler, it is sometimes necessary to include\na \"calling convention\" before exported function names. (This is secondhand\ninformation; I know nothing about MSVC myself). For example, something like\n\n  void __cdecl function(....)\n\nmight be needed. In order so make this easy, all the exported functions have\nPCRE_CALL_CONVENTION just before their names. It is rarely needed; if not\nset, we ensure here that it has no effect. */\n\n#ifndef PCRE_CALL_CONVENTION\n#define PCRE_CALL_CONVENTION\n#endif\n\n/* We need to have types that specify unsigned 8, 16 and 32-bit integers. We\ncannot determine these outside the compilation (e.g. by running a program as\npart of \"configure\") because PCRE is often cross-compiled for use on other\nsystems. Instead we make use of the maximum sizes that are available at\npreprocessor time in standard C environments. */\n\ntypedef unsigned char pcre_uint8;\n\n#if USHRT_MAX == 65535\ntypedef unsigned short pcre_uint16;\ntypedef short pcre_int16;\n#define PCRE_UINT16_MAX USHRT_MAX\n#define PCRE_INT16_MAX SHRT_MAX\n#elif UINT_MAX == 65535\ntypedef unsigned int pcre_uint16;\ntypedef int pcre_int16;\n#define PCRE_UINT16_MAX UINT_MAX\n#define PCRE_INT16_MAX INT_MAX\n#else\n#error Cannot determine a type for 16-bit integers\n#endif\n\n#if UINT_MAX == 4294967295U\ntypedef unsigned int pcre_uint32;\ntypedef int pcre_int32;\n#define PCRE_UINT32_MAX UINT_MAX\n#define PCRE_INT32_MAX INT_MAX\n#elif ULONG_MAX == 4294967295UL\ntypedef unsigned long int pcre_uint32;\ntypedef long int pcre_int32;\n#define PCRE_UINT32_MAX ULONG_MAX\n#define PCRE_INT32_MAX LONG_MAX\n#else\n#error Cannot determine a type for 32-bit integers\n#endif\n\n/* When checking for integer overflow in pcre_compile(), we need to handle\nlarge integers. If a 64-bit integer type is available, we can use that.\nOtherwise we have to cast to double, which of course requires floating point\narithmetic. Handle this by defining a macro for the appropriate type. If\nstdint.h is available, include it; it may define INT64_MAX. Systems that do not\nhave stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set\nby \"configure\". */\n\n#if defined HAVE_STDINT_H\n#include <stdint.h>\n#elif defined HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#if defined INT64_MAX || defined int64_t\n#define INT64_OR_DOUBLE int64_t\n#else\n#define INT64_OR_DOUBLE double\n#endif\n\n/* All character handling must be done as unsigned characters. Otherwise there\nare problems with top-bit-set characters and functions such as isspace().\nHowever, we leave the interface to the outside world as char * or short *,\nbecause that should make things easier for callers. This character type is\ncalled pcre_uchar.\n\nThe IN_UCHARS macro multiply its argument with the byte size of the current\npcre_uchar type. Useful for memcpy and such operations, whose require the\nbyte size of their input/output buffers.\n\nThe MAX_255 macro checks whether its pcre_uchar input is less than 256.\n\nThe TABLE_GET macro is designed for accessing elements of tables whose contain\nexactly 256 items. When the character is able to contain more than 256\nitems, some check is needed before accessing these tables.\n*/\n\n#if defined COMPILE_PCRE8\n\ntypedef unsigned char pcre_uchar;\n#define IN_UCHARS(x) (x)\n#define MAX_255(c) 1\n#define TABLE_GET(c, table, default) ((table)[c])\n\n#elif defined COMPILE_PCRE16\n\n#if USHRT_MAX != 65535\n/* This is a warning message. Change PCRE_UCHAR16 to a 16 bit data type in\npcre.h(.in) and disable (comment out) this message. */\n#error Warning: PCRE_UCHAR16 is not a 16 bit data type.\n#endif\n\ntypedef pcre_uint16 pcre_uchar;\n#define UCHAR_SHIFT (1)\n#define IN_UCHARS(x) ((x) * 2)\n#define MAX_255(c) ((c) <= 255u)\n#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))\n\n#elif defined COMPILE_PCRE32\n\ntypedef pcre_uint32 pcre_uchar;\n#define UCHAR_SHIFT (2)\n#define IN_UCHARS(x) ((x) * 4)\n#define MAX_255(c) ((c) <= 255u)\n#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))\n\n#else\n#error Unsupported compiling mode\n#endif /* COMPILE_PCRE[8|16|32] */\n\n/* This is an unsigned int value that no character can ever have. UTF-8\ncharacters only go up to 0x7fffffff (though Unicode doesn't go beyond\n0x0010ffff). */\n\n#define NOTACHAR 0xffffffff\n\n/* PCRE is able to support several different kinds of newline (CR, LF, CRLF,\n\"any\" and \"anycrlf\" at present). The following macros are used to package up\ntesting for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various\nmodules to indicate in which datablock the parameters exist, and what the\nstart/end of string field names are. */\n\n#define NLTYPE_FIXED    0     /* Newline is a fixed length string */\n#define NLTYPE_ANY      1     /* Newline is any Unicode line ending */\n#define NLTYPE_ANYCRLF  2     /* Newline is CR, LF, or CRLF */\n\n/* This macro checks for a newline at the given position */\n\n#define IS_NEWLINE(p) \\\n  ((NLBLOCK->nltype != NLTYPE_FIXED)? \\\n    ((p) < NLBLOCK->PSEND && \\\n     PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \\\n       &(NLBLOCK->nllen), utf)) \\\n    : \\\n    ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \\\n     UCHAR21TEST(p) == NLBLOCK->nl[0] && \\\n     (NLBLOCK->nllen == 1 || UCHAR21TEST(p+1) == NLBLOCK->nl[1])       \\\n    ) \\\n  )\n\n/* This macro checks for a newline immediately preceding the given position */\n\n#define WAS_NEWLINE(p) \\\n  ((NLBLOCK->nltype != NLTYPE_FIXED)? \\\n    ((p) > NLBLOCK->PSSTART && \\\n     PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \\\n       &(NLBLOCK->nllen), utf)) \\\n    : \\\n    ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \\\n     UCHAR21TEST(p - NLBLOCK->nllen) == NLBLOCK->nl[0] &&              \\\n     (NLBLOCK->nllen == 1 || UCHAR21TEST(p - NLBLOCK->nllen + 1) == NLBLOCK->nl[1]) \\\n    ) \\\n  )\n\n/* When PCRE is compiled as a C++ library, the subject pointer can be replaced\nwith a custom type. This makes it possible, for example, to allow pcre_exec()\nto process subject strings that are discontinuous by using a smart pointer\nclass. It must always be possible to inspect all of the subject string in\npcre_exec() because of the way it backtracks. Two macros are required in the\nnormal case, for sign-unspecified and unsigned char pointers. The former is\nused for the external interface and appears in pcre.h, which is why its name\nmust begin with PCRE_. */\n\n#ifdef CUSTOM_SUBJECT_PTR\n#define PCRE_PUCHAR CUSTOM_SUBJECT_PTR\n#else\n#define PCRE_PUCHAR const pcre_uchar *\n#endif\n\n/* Include the public PCRE header and the definitions of UCP character property\nvalues. */\n\n#include \"pcre.h\"\n#include \"ucp.h\"\n\n#ifdef COMPILE_PCRE32\n/* Assert that the public PCRE_UCHAR32 is a 32-bit type */\ntypedef int __assert_pcre_uchar32_size[sizeof(PCRE_UCHAR32) == 4 ? 1 : -1];\n#endif\n\n/* When compiling for use with the Virtual Pascal compiler, these functions\nneed to have their names changed. PCRE must be compiled with the -DVPCOMPAT\noption on the command line. */\n\n#ifdef VPCOMPAT\n#define strlen(s)        _strlen(s)\n#define strncmp(s1,s2,m) _strncmp(s1,s2,m)\n#define memcmp(s,c,n)    _memcmp(s,c,n)\n#define memcpy(d,s,n)    _memcpy(d,s,n)\n#define memmove(d,s,n)   _memmove(d,s,n)\n#define memset(s,c,n)    _memset(s,c,n)\n#else  /* VPCOMPAT */\n\n/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),\ndefine a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY\nis set. Otherwise, include an emulating function for those systems that have\nneither (there some non-Unix environments where this is the case). */\n\n#ifndef HAVE_MEMMOVE\n#undef  memmove        /* some systems may have a macro */\n#ifdef HAVE_BCOPY\n#define memmove(a, b, c) bcopy(b, a, c)\n#else  /* HAVE_BCOPY */\nstatic void *\npcre_memmove(void *d, const void *s, size_t n)\n{\nsize_t i;\nunsigned char *dest = (unsigned char *)d;\nconst unsigned char *src = (const unsigned char *)s;\nif (dest > src)\n  {\n  dest += n;\n  src += n;\n  for (i = 0; i < n; ++i) *(--dest) = *(--src);\n  return (void *)dest;\n  }\nelse\n  {\n  for (i = 0; i < n; ++i) *dest++ = *src++;\n  return (void *)(dest - n);\n  }\n}\n#define memmove(a, b, c) pcre_memmove(a, b, c)\n#endif   /* not HAVE_BCOPY */\n#endif   /* not HAVE_MEMMOVE */\n#endif   /* not VPCOMPAT */\n\n\n/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored\nin big-endian order) by default. These are used, for example, to link from the\nstart of a subpattern to its alternatives and its end. The use of 2 bytes per\noffset limits the size of the compiled regex to around 64K, which is big enough\nfor almost everybody. However, I received a request for an even bigger limit.\nFor this reason, and also to make the code easier to maintain, the storing and\nloading of offsets from the byte string is now handled by the macros that are\ndefined here.\n\nThe macros are controlled by the value of LINK_SIZE. This defaults to 2 in\nthe config.h file, but can be overridden by using -D on the command line. This\nis automated on Unix systems via the \"configure\" command. */\n\n#if defined COMPILE_PCRE8\n\n#if LINK_SIZE == 2\n\n#define PUT(a,n,d)   \\\n  (a[n] = (d) >> 8), \\\n  (a[(n)+1] = (d) & 255)\n\n#define GET(a,n) \\\n  (((a)[n] << 8) | (a)[(n)+1])\n\n#define MAX_PATTERN_SIZE (1 << 16)\n\n\n#elif LINK_SIZE == 3\n\n#define PUT(a,n,d)       \\\n  (a[n] = (d) >> 16),    \\\n  (a[(n)+1] = (d) >> 8), \\\n  (a[(n)+2] = (d) & 255)\n\n#define GET(a,n) \\\n  (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])\n\n#define MAX_PATTERN_SIZE (1 << 24)\n\n\n#elif LINK_SIZE == 4\n\n#define PUT(a,n,d)        \\\n  (a[n] = (d) >> 24),     \\\n  (a[(n)+1] = (d) >> 16), \\\n  (a[(n)+2] = (d) >> 8),  \\\n  (a[(n)+3] = (d) & 255)\n\n#define GET(a,n) \\\n  (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])\n\n/* Keep it positive */\n#define MAX_PATTERN_SIZE (1 << 30)\n\n#else\n#error LINK_SIZE must be either 2, 3, or 4\n#endif\n\n#elif defined COMPILE_PCRE16\n\n#if LINK_SIZE == 2\n\n/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */\n#undef LINK_SIZE\n#define LINK_SIZE 1\n\n#define PUT(a,n,d)   \\\n  (a[n] = (d))\n\n#define GET(a,n) \\\n  (a[n])\n\n#define MAX_PATTERN_SIZE (1 << 16)\n\n#elif LINK_SIZE == 3 || LINK_SIZE == 4\n\n/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */\n#undef LINK_SIZE\n#define LINK_SIZE 2\n\n#define PUT(a,n,d)   \\\n  (a[n] = (d) >> 16), \\\n  (a[(n)+1] = (d) & 65535)\n\n#define GET(a,n) \\\n  (((a)[n] << 16) | (a)[(n)+1])\n\n/* Keep it positive */\n#define MAX_PATTERN_SIZE (1 << 30)\n\n#else\n#error LINK_SIZE must be either 2, 3, or 4\n#endif\n\n#elif defined COMPILE_PCRE32\n\n/* Only supported LINK_SIZE is 4 */\n/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */\n#undef LINK_SIZE\n#define LINK_SIZE 1\n\n#define PUT(a,n,d)   \\\n  (a[n] = (d))\n\n#define GET(a,n) \\\n  (a[n])\n\n/* Keep it positive */\n#define MAX_PATTERN_SIZE (1 << 30)\n\n#else\n#error Unsupported compiling mode\n#endif /* COMPILE_PCRE[8|16|32] */\n\n/* Convenience macro defined in terms of the others */\n\n#define PUTINC(a,n,d)   PUT(a,n,d), a += LINK_SIZE\n\n\n/* PCRE uses some other 2-byte quantities that do not change when the size of\noffsets changes. There are used for repeat counts and for other things such as\ncapturing parenthesis numbers in back references. */\n\n#if defined COMPILE_PCRE8\n\n#define IMM2_SIZE 2\n\n#define PUT2(a,n,d)   \\\n  a[n] = (d) >> 8; \\\n  a[(n)+1] = (d) & 255\n\n/* For reasons that I do not understand, the expression in this GET2 macro is\ntreated by gcc as a signed expression, even when a is declared as unsigned. It\nseems that any kind of arithmetic results in a signed value. */\n\n#define GET2(a,n) \\\n  (unsigned int)(((a)[n] << 8) | (a)[(n)+1])\n\n#elif defined COMPILE_PCRE16\n\n#define IMM2_SIZE 1\n\n#define PUT2(a,n,d)   \\\n   a[n] = d\n\n#define GET2(a,n) \\\n   a[n]\n\n#elif defined COMPILE_PCRE32\n\n#define IMM2_SIZE 1\n\n#define PUT2(a,n,d)   \\\n   a[n] = d\n\n#define GET2(a,n) \\\n   a[n]\n\n#else\n#error Unsupported compiling mode\n#endif /* COMPILE_PCRE[8|16|32] */\n\n#define PUT2INC(a,n,d)  PUT2(a,n,d), a += IMM2_SIZE\n\n/* The maximum length of a MARK name is currently one data unit; it may be\nchanged in future to be a fixed number of bytes or to depend on LINK_SIZE. */\n\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n#define MAX_MARK ((1u << 16) - 1)\n#else\n#define MAX_MARK ((1u << 8) - 1)\n#endif\n\n/* There is a proposed future special \"UTF-21\" mode, in which only the lowest\n21 bits of a 32-bit character are interpreted as UTF, with the remaining 11\nhigh-order bits available to the application for other uses. In preparation for\nthe future implementation of this mode, there are macros that load a data item\nand, if in this special mode, mask it to 21 bits. These macros all have names\nstarting with UCHAR21. In all other modes, including the normal 32-bit\nlibrary, the macros all have the same simple definitions. When the new mode is\nimplemented, it is expected that these definitions will be varied appropriately\nusing #ifdef when compiling the library that supports the special mode. */\n\n#define UCHAR21(eptr)        (*(eptr))\n#define UCHAR21TEST(eptr)    (*(eptr))\n#define UCHAR21INC(eptr)     (*(eptr)++)\n#define UCHAR21INCTEST(eptr) (*(eptr)++)\n\n/* When UTF encoding is being used, a character is no longer just a single\nbyte in 8-bit mode or a single short in 16-bit mode. The macros for character\nhandling generate simple sequences when used in the basic mode, and more\ncomplicated ones for UTF characters. GETCHARLENTEST and other macros are not\nused when UTF is not supported. To make sure they can never even appear when\nUTF support is omitted, we don't even define them. */\n\n#ifndef SUPPORT_UTF\n\n/* #define MAX_VALUE_FOR_SINGLE_CHAR */\n/* #define HAS_EXTRALEN(c) */\n/* #define GET_EXTRALEN(c) */\n/* #define NOT_FIRSTCHAR(c) */\n#define GETCHAR(c, eptr) c = *eptr;\n#define GETCHARTEST(c, eptr) c = *eptr;\n#define GETCHARINC(c, eptr) c = *eptr++;\n#define GETCHARINCTEST(c, eptr) c = *eptr++;\n#define GETCHARLEN(c, eptr, len) c = *eptr;\n/* #define GETCHARLENTEST(c, eptr, len) */\n/* #define BACKCHAR(eptr) */\n/* #define FORWARDCHAR(eptr) */\n/* #define ACROSSCHAR(condition, eptr, action) */\n\n#else   /* SUPPORT_UTF */\n\n/* Tests whether the code point needs extra characters to decode. */\n\n#define HASUTF8EXTRALEN(c) ((c) >= 0xc0)\n\n/* Base macro to pick up the remaining bytes of a UTF-8 character, not\nadvancing the pointer. */\n\n#define GETUTF8(c, eptr) \\\n    { \\\n    if ((c & 0x20) == 0) \\\n      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \\\n    else if ((c & 0x10) == 0) \\\n      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \\\n    else if ((c & 0x08) == 0) \\\n      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \\\n      ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \\\n    else if ((c & 0x04) == 0) \\\n      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \\\n          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \\\n          (eptr[4] & 0x3f); \\\n    else \\\n      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \\\n          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \\\n          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \\\n    }\n\n/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing\nthe pointer. */\n\n#define GETUTF8INC(c, eptr) \\\n    { \\\n    if ((c & 0x20) == 0) \\\n      c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \\\n    else if ((c & 0x10) == 0) \\\n      { \\\n      c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \\\n      eptr += 2; \\\n      } \\\n    else if ((c & 0x08) == 0) \\\n      { \\\n      c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \\\n          ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \\\n      eptr += 3; \\\n      } \\\n    else if ((c & 0x04) == 0) \\\n      { \\\n      c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \\\n          ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \\\n          (eptr[3] & 0x3f); \\\n      eptr += 4; \\\n      } \\\n    else \\\n      { \\\n      c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \\\n          ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \\\n          ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \\\n      eptr += 5; \\\n      } \\\n    }\n\n#if defined COMPILE_PCRE8\n\n/* These macros were originally written in the form of loops that used data\nfrom the tables whose names start with PRIV(utf8_table). They were rewritten by\na user so as not to use loops, because in some environments this gives a\nsignificant performance advantage, and it seems never to do any harm. */\n\n/* Tells the biggest code point which can be encoded as a single character. */\n\n#define MAX_VALUE_FOR_SINGLE_CHAR 127\n\n/* Tests whether the code point needs extra characters to decode. */\n\n#define HAS_EXTRALEN(c) ((c) >= 0xc0)\n\n/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.\nOtherwise it has an undefined behaviour. */\n\n#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f])\n\n/* Returns TRUE, if the given character is not the first character\nof a UTF sequence. */\n\n#define NOT_FIRSTCHAR(c) (((c) & 0xc0) == 0x80)\n\n/* Get the next UTF-8 character, not advancing the pointer. This is called when\nwe know we are in UTF-8 mode. */\n\n#define GETCHAR(c, eptr) \\\n  c = *eptr; \\\n  if (c >= 0xc0) GETUTF8(c, eptr);\n\n/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the\npointer. */\n\n#define GETCHARTEST(c, eptr) \\\n  c = *eptr; \\\n  if (utf && c >= 0xc0) GETUTF8(c, eptr);\n\n/* Get the next UTF-8 character, advancing the pointer. This is called when we\nknow we are in UTF-8 mode. */\n\n#define GETCHARINC(c, eptr) \\\n  c = *eptr++; \\\n  if (c >= 0xc0) GETUTF8INC(c, eptr);\n\n/* Get the next character, testing for UTF-8 mode, and advancing the pointer.\nThis is called when we don't know if we are in UTF-8 mode. */\n\n#define GETCHARINCTEST(c, eptr) \\\n  c = *eptr++; \\\n  if (utf && c >= 0xc0) GETUTF8INC(c, eptr);\n\n/* Base macro to pick up the remaining bytes of a UTF-8 character, not\nadvancing the pointer, incrementing the length. */\n\n#define GETUTF8LEN(c, eptr, len) \\\n    { \\\n    if ((c & 0x20) == 0) \\\n      { \\\n      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \\\n      len++; \\\n      } \\\n    else if ((c & 0x10)  == 0) \\\n      { \\\n      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \\\n      len += 2; \\\n      } \\\n    else if ((c & 0x08)  == 0) \\\n      {\\\n      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \\\n          ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \\\n      len += 3; \\\n      } \\\n    else if ((c & 0x04)  == 0) \\\n      { \\\n      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \\\n          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \\\n          (eptr[4] & 0x3f); \\\n      len += 4; \\\n      } \\\n    else \\\n      {\\\n      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \\\n          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \\\n          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \\\n      len += 5; \\\n      } \\\n    }\n\n/* Get the next UTF-8 character, not advancing the pointer, incrementing length\nif there are extra bytes. This is called when we know we are in UTF-8 mode. */\n\n#define GETCHARLEN(c, eptr, len) \\\n  c = *eptr; \\\n  if (c >= 0xc0) GETUTF8LEN(c, eptr, len);\n\n/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the\npointer, incrementing length if there are extra bytes. This is called when we\ndo not know if we are in UTF-8 mode. */\n\n#define GETCHARLENTEST(c, eptr, len) \\\n  c = *eptr; \\\n  if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len);\n\n/* If the pointer is not at the start of a character, move it back until\nit is. This is called only in UTF-8 mode - we don't put a test within the macro\nbecause almost all calls are already within a block of UTF-8 only code. */\n\n#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--\n\n/* Same as above, just in the other direction. */\n#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++\n\n/* Same as above, but it allows a fully customizable form. */\n#define ACROSSCHAR(condition, eptr, action) \\\n  while((condition) && ((eptr) & 0xc0) == 0x80) action\n\n#elif defined COMPILE_PCRE16\n\n/* Tells the biggest code point which can be encoded as a single character. */\n\n#define MAX_VALUE_FOR_SINGLE_CHAR 65535\n\n/* Tests whether the code point needs extra characters to decode. */\n\n#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800)\n\n/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.\nOtherwise it has an undefined behaviour. */\n\n#define GET_EXTRALEN(c) 1\n\n/* Returns TRUE, if the given character is not the first character\nof a UTF sequence. */\n\n#define NOT_FIRSTCHAR(c) (((c) & 0xfc00) == 0xdc00)\n\n/* Base macro to pick up the low surrogate of a UTF-16 character, not\nadvancing the pointer. */\n\n#define GETUTF16(c, eptr) \\\n   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; }\n\n/* Get the next UTF-16 character, not advancing the pointer. This is called when\nwe know we are in UTF-16 mode. */\n\n#define GETCHAR(c, eptr) \\\n  c = *eptr; \\\n  if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr);\n\n/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the\npointer. */\n\n#define GETCHARTEST(c, eptr) \\\n  c = *eptr; \\\n  if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr);\n\n/* Base macro to pick up the low surrogate of a UTF-16 character, advancing\nthe pointer. */\n\n#define GETUTF16INC(c, eptr) \\\n   { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; }\n\n/* Get the next UTF-16 character, advancing the pointer. This is called when we\nknow we are in UTF-16 mode. */\n\n#define GETCHARINC(c, eptr) \\\n  c = *eptr++; \\\n  if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);\n\n/* Get the next character, testing for UTF-16 mode, and advancing the pointer.\nThis is called when we don't know if we are in UTF-16 mode. */\n\n#define GETCHARINCTEST(c, eptr) \\\n  c = *eptr++; \\\n  if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);\n\n/* Base macro to pick up the low surrogate of a UTF-16 character, not\nadvancing the pointer, incrementing the length. */\n\n#define GETUTF16LEN(c, eptr, len) \\\n   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; }\n\n/* Get the next UTF-16 character, not advancing the pointer, incrementing\nlength if there is a low surrogate. This is called when we know we are in\nUTF-16 mode. */\n\n#define GETCHARLEN(c, eptr, len) \\\n  c = *eptr; \\\n  if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);\n\n/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the\npointer, incrementing length if there is a low surrogate. This is called when\nwe do not know if we are in UTF-16 mode. */\n\n#define GETCHARLENTEST(c, eptr, len) \\\n  c = *eptr; \\\n  if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);\n\n/* If the pointer is not at the start of a character, move it back until\nit is. This is called only in UTF-16 mode - we don't put a test within the\nmacro because almost all calls are already within a block of UTF-16 only\ncode. */\n\n#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr--\n\n/* Same as above, just in the other direction. */\n#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++\n\n/* Same as above, but it allows a fully customizable form. */\n#define ACROSSCHAR(condition, eptr, action) \\\n  if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action\n\n#elif defined COMPILE_PCRE32\n\n/* These are trivial for the 32-bit library, since all UTF-32 characters fit\ninto one pcre_uchar unit. */\n#define MAX_VALUE_FOR_SINGLE_CHAR (0x10ffffu)\n#define HAS_EXTRALEN(c) (0)\n#define GET_EXTRALEN(c) (0)\n#define NOT_FIRSTCHAR(c) (0)\n\n/* Get the next UTF-32 character, not advancing the pointer. This is called when\nwe know we are in UTF-32 mode. */\n\n#define GETCHAR(c, eptr) \\\n  c = *(eptr);\n\n/* Get the next UTF-32 character, testing for UTF-32 mode, and not advancing the\npointer. */\n\n#define GETCHARTEST(c, eptr) \\\n  c = *(eptr);\n\n/* Get the next UTF-32 character, advancing the pointer. This is called when we\nknow we are in UTF-32 mode. */\n\n#define GETCHARINC(c, eptr) \\\n  c = *((eptr)++);\n\n/* Get the next character, testing for UTF-32 mode, and advancing the pointer.\nThis is called when we don't know if we are in UTF-32 mode. */\n\n#define GETCHARINCTEST(c, eptr) \\\n  c = *((eptr)++);\n\n/* Get the next UTF-32 character, not advancing the pointer, not incrementing\nlength (since all UTF-32 is of length 1). This is called when we know we are in\nUTF-32 mode. */\n\n#define GETCHARLEN(c, eptr, len) \\\n  GETCHAR(c, eptr)\n\n/* Get the next UTF-32character, testing for UTF-32 mode, not advancing the\npointer, not incrementing the length (since all UTF-32 is of length 1).\nThis is called when we do not know if we are in UTF-32 mode. */\n\n#define GETCHARLENTEST(c, eptr, len) \\\n  GETCHARTEST(c, eptr)\n\n/* If the pointer is not at the start of a character, move it back until\nit is. This is called only in UTF-32 mode - we don't put a test within the\nmacro because almost all calls are already within a block of UTF-32 only\ncode.\nThese are all no-ops since all UTF-32 characters fit into one pcre_uchar. */\n\n#define BACKCHAR(eptr) do { } while (0)\n\n/* Same as above, just in the other direction. */\n#define FORWARDCHAR(eptr) do { } while (0)\n\n/* Same as above, but it allows a fully customizable form. */\n#define ACROSSCHAR(condition, eptr, action) do { } while (0)\n\n#else\n#error Unsupported compiling mode\n#endif /* COMPILE_PCRE[8|16|32] */\n\n#endif  /* SUPPORT_UTF */\n\n/* Tests for Unicode horizontal and vertical whitespace characters must check a\nnumber of different values. Using a switch statement for this generates the\nfastest code (no loop, no memory access), and there are several places in the\ninterpreter code where this happens. In order to ensure that all the case lists\nremain in step, we use macros so that there is only one place where the lists\nare defined.\n\nThese values are also required as lists in pcre_compile.c when processing \\h,\n\\H, \\v and \\V in a character class. The lists are defined in pcre_tables.c, but\nmacros that define the values are here so that all the definitions are\ntogether. The lists must be in ascending character order, terminated by\nNOTACHAR (which is 0xffffffff).\n\nAny changes should ensure that the various macros are kept in step with each\nother. NOTE: The values also appear in pcre_jit_compile.c. */\n\n/* ------ ASCII/Unicode environments ------ */\n\n#ifndef EBCDIC\n\n#define HSPACE_LIST \\\n  CHAR_HT, CHAR_SPACE, CHAR_NBSP, \\\n  0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, \\\n  0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202f, 0x205f, 0x3000, \\\n  NOTACHAR\n\n#define HSPACE_MULTIBYTE_CASES \\\n  case 0x1680:  /* OGHAM SPACE MARK */ \\\n  case 0x180e:  /* MONGOLIAN VOWEL SEPARATOR */ \\\n  case 0x2000:  /* EN QUAD */ \\\n  case 0x2001:  /* EM QUAD */ \\\n  case 0x2002:  /* EN SPACE */ \\\n  case 0x2003:  /* EM SPACE */ \\\n  case 0x2004:  /* THREE-PER-EM SPACE */ \\\n  case 0x2005:  /* FOUR-PER-EM SPACE */ \\\n  case 0x2006:  /* SIX-PER-EM SPACE */ \\\n  case 0x2007:  /* FIGURE SPACE */ \\\n  case 0x2008:  /* PUNCTUATION SPACE */ \\\n  case 0x2009:  /* THIN SPACE */ \\\n  case 0x200A:  /* HAIR SPACE */ \\\n  case 0x202f:  /* NARROW NO-BREAK SPACE */ \\\n  case 0x205f:  /* MEDIUM MATHEMATICAL SPACE */ \\\n  case 0x3000   /* IDEOGRAPHIC SPACE */\n\n#define HSPACE_BYTE_CASES \\\n  case CHAR_HT: \\\n  case CHAR_SPACE: \\\n  case CHAR_NBSP\n\n#define HSPACE_CASES \\\n  HSPACE_BYTE_CASES: \\\n  HSPACE_MULTIBYTE_CASES\n\n#define VSPACE_LIST \\\n  CHAR_LF, CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, 0x2028, 0x2029, NOTACHAR\n\n#define VSPACE_MULTIBYTE_CASES \\\n  case 0x2028:    /* LINE SEPARATOR */ \\\n  case 0x2029     /* PARAGRAPH SEPARATOR */\n\n#define VSPACE_BYTE_CASES \\\n  case CHAR_LF: \\\n  case CHAR_VT: \\\n  case CHAR_FF: \\\n  case CHAR_CR: \\\n  case CHAR_NEL\n\n#define VSPACE_CASES \\\n  VSPACE_BYTE_CASES: \\\n  VSPACE_MULTIBYTE_CASES\n\n/* ------ EBCDIC environments ------ */\n\n#else\n#define HSPACE_LIST CHAR_HT, CHAR_SPACE, CHAR_NBSP, NOTACHAR\n\n#define HSPACE_BYTE_CASES \\\n  case CHAR_HT: \\\n  case CHAR_SPACE: \\\n  case CHAR_NBSP\n\n#define HSPACE_CASES HSPACE_BYTE_CASES\n\n#ifdef EBCDIC_NL25\n#define VSPACE_LIST \\\n  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, CHAR_LF, NOTACHAR\n#else\n#define VSPACE_LIST \\\n  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_LF, CHAR_NEL, NOTACHAR\n#endif\n\n#define VSPACE_BYTE_CASES \\\n  case CHAR_LF: \\\n  case CHAR_VT: \\\n  case CHAR_FF: \\\n  case CHAR_CR: \\\n  case CHAR_NEL\n\n#define VSPACE_CASES VSPACE_BYTE_CASES\n#endif  /* EBCDIC */\n\n/* ------ End of whitespace macros ------ */\n\n\n\n/* Private flags containing information about the compiled regex. They used to\nlive at the top end of the options word, but that got almost full, so they were\nmoved to a 16-bit flags word - which got almost full, so now they are in a\n32-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as the\nrestrictions on partial matching have been lifted. It remains for backwards\ncompatibility. */\n\n#define PCRE_MODE8         0x00000001  /* compiled in 8 bit mode */\n#define PCRE_MODE16        0x00000002  /* compiled in 16 bit mode */\n#define PCRE_MODE32        0x00000004  /* compiled in 32 bit mode */\n#define PCRE_FIRSTSET      0x00000010  /* first_char is set */\n#define PCRE_FCH_CASELESS  0x00000020  /* caseless first char */\n#define PCRE_REQCHSET      0x00000040  /* req_byte is set */\n#define PCRE_RCH_CASELESS  0x00000080  /* caseless requested char */\n#define PCRE_STARTLINE     0x00000100  /* start after \\n for multiline */\n#define PCRE_NOPARTIAL     0x00000200  /* can't use partial with this regex */\n#define PCRE_JCHANGED      0x00000400  /* j option used in regex */\n#define PCRE_HASCRORLF     0x00000800  /* explicit \\r or \\n in pattern */\n#define PCRE_HASTHEN       0x00001000  /* pattern contains (*THEN) */\n#define PCRE_MLSET         0x00002000  /* match limit set by regex */\n#define PCRE_RLSET         0x00004000  /* recursion limit set by regex */\n#define PCRE_MATCH_EMPTY   0x00008000  /* pattern can match empty string */\n\n#if defined COMPILE_PCRE8\n#define PCRE_MODE          PCRE_MODE8\n#elif defined COMPILE_PCRE16\n#define PCRE_MODE          PCRE_MODE16\n#elif defined COMPILE_PCRE32\n#define PCRE_MODE          PCRE_MODE32\n#endif\n#define PCRE_MODE_MASK     (PCRE_MODE8 | PCRE_MODE16 | PCRE_MODE32)\n\n/* Flags for the \"extra\" block produced by pcre_study(). */\n\n#define PCRE_STUDY_MAPPED  0x0001  /* a map of starting chars exists */\n#define PCRE_STUDY_MINLEN  0x0002  /* a minimum length field exists */\n\n/* Masks for identifying the public options that are permitted at compile\ntime, run time, or study time, respectively. */\n\n#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \\\n                           PCRE_NEWLINE_ANYCRLF)\n\n#define PUBLIC_COMPILE_OPTIONS \\\n  (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \\\n   PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \\\n   PCRE_NO_AUTO_CAPTURE|PCRE_NO_AUTO_POSSESS| \\\n   PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \\\n   PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \\\n   PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE|PCRE_NEVER_UTF)\n\n#define PUBLIC_EXEC_OPTIONS \\\n  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \\\n   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \\\n   PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE)\n\n#define PUBLIC_DFA_EXEC_OPTIONS \\\n  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \\\n   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \\\n   PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \\\n   PCRE_NO_START_OPTIMIZE)\n\n#define PUBLIC_STUDY_OPTIONS \\\n   (PCRE_STUDY_JIT_COMPILE|PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE| \\\n    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE|PCRE_STUDY_EXTRA_NEEDED)\n\n#define PUBLIC_JIT_EXEC_OPTIONS \\\n   (PCRE_NO_UTF8_CHECK|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|\\\n    PCRE_NOTEMPTY_ATSTART|PCRE_PARTIAL_SOFT|PCRE_PARTIAL_HARD)\n\n/* Magic number to provide a small check against being handed junk. */\n\n#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */\n\n/* This variable is used to detect a loaded regular expression\nin different endianness. */\n\n#define REVERSED_MAGIC_NUMBER  0x45524350UL   /* 'ERCP' */\n\n/* The maximum remaining length of subject we are prepared to search for a\nreq_byte match. */\n\n#define REQ_BYTE_MAX 1000\n\n/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in\nenvironments where these macros are defined elsewhere. Unfortunately, there\nis no way to do the same for the typedef. */\n\ntypedef int BOOL;\n\n#ifndef FALSE\n#define FALSE   0\n#define TRUE    1\n#endif\n\n/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal\ncharacter constants like '*' because the compiler would emit their EBCDIC code,\nwhich is different from their ASCII/UTF-8 code. Instead we define macros for\nthe characters so that they always use the ASCII/UTF-8 code when UTF-8 support\nis enabled. When UTF-8 support is not enabled, the definitions use character\nliterals. Both character and string versions of each character are needed, and\nthere are some longer strings as well.\n\nThis means that, on EBCDIC platforms, the PCRE library can handle either\nEBCDIC, or UTF-8, but not both. To support both in the same compiled library\nwould need different lookups depending on whether PCRE_UTF8 was set or not.\nThis would make it impossible to use characters in switch/case statements,\nwhich would reduce performance. For a theoretical use (which nobody has asked\nfor) in a minority area (EBCDIC platforms), this is not sensible. Any\napplication that did need both could compile two versions of the library, using\nmacros to give the functions distinct names. */\n\n#ifndef SUPPORT_UTF\n\n/* UTF-8 support is not enabled; use the platform-dependent character literals\nso that PCRE works in both ASCII and EBCDIC environments, but only in non-UTF\nmode. Newline characters are problematic in EBCDIC. Though it has CR and LF\ncharacters, a common practice has been to use its NL (0x15) character as the\nline terminator in C-like processing environments. However, sometimes the LF\n(0x25) character is used instead, according to this Unicode document:\n\nhttp://unicode.org/standard/reports/tr13/tr13-5.html\n\nPCRE defaults EBCDIC NL to 0x15, but has a build-time option to select 0x25\ninstead. Whichever is *not* chosen is defined as NEL.\n\nIn both ASCII and EBCDIC environments, CHAR_NL and CHAR_LF are synonyms for the\nsame code point. */\n\n#ifdef EBCDIC\n\n#ifndef EBCDIC_NL25\n#define CHAR_NL                     '\\x15'\n#define CHAR_NEL                    '\\x25'\n#define STR_NL                      \"\\x15\"\n#define STR_NEL                     \"\\x25\"\n#else\n#define CHAR_NL                     '\\x25'\n#define CHAR_NEL                    '\\x15'\n#define STR_NL                      \"\\x25\"\n#define STR_NEL                     \"\\x15\"\n#endif\n\n#define CHAR_LF                     CHAR_NL\n#define STR_LF                      STR_NL\n\n#define CHAR_ESC                    '\\047'\n#define CHAR_DEL                    '\\007'\n#define CHAR_NBSP                   '\\x41'\n#define STR_ESC                     \"\\047\"\n#define STR_DEL                     \"\\007\"\n\n#else  /* Not EBCDIC */\n\n/* In ASCII/Unicode, linefeed is '\\n' and we equate this to NL for\ncompatibility. NEL is the Unicode newline character; make sure it is\na positive value. */\n\n#define CHAR_LF                     '\\n'\n#define CHAR_NL                     CHAR_LF\n#define CHAR_NEL                    ((unsigned char)'\\x85')\n#define CHAR_ESC                    '\\033'\n#define CHAR_DEL                    '\\177'\n#define CHAR_NBSP                   ((unsigned char)'\\xa0')\n\n#define STR_LF                      \"\\n\"\n#define STR_NL                      STR_LF\n#define STR_NEL                     \"\\x85\"\n#define STR_ESC                     \"\\033\"\n#define STR_DEL                     \"\\177\"\n\n#endif  /* EBCDIC */\n\n/* The remaining definitions work in both environments. */\n\n#define CHAR_NULL                   '\\0'\n#define CHAR_HT                     '\\t'\n#define CHAR_VT                     '\\v'\n#define CHAR_FF                     '\\f'\n#define CHAR_CR                     '\\r'\n#define CHAR_BS                     '\\b'\n#define CHAR_BEL                    '\\a'\n\n#define CHAR_SPACE                  ' '\n#define CHAR_EXCLAMATION_MARK       '!'\n#define CHAR_QUOTATION_MARK         '\"'\n#define CHAR_NUMBER_SIGN            '#'\n#define CHAR_DOLLAR_SIGN            '$'\n#define CHAR_PERCENT_SIGN           '%'\n#define CHAR_AMPERSAND              '&'\n#define CHAR_APOSTROPHE             '\\''\n#define CHAR_LEFT_PARENTHESIS       '('\n#define CHAR_RIGHT_PARENTHESIS      ')'\n#define CHAR_ASTERISK               '*'\n#define CHAR_PLUS                   '+'\n#define CHAR_COMMA                  ','\n#define CHAR_MINUS                  '-'\n#define CHAR_DOT                    '.'\n#define CHAR_SLASH                  '/'\n#define CHAR_0                      '0'\n#define CHAR_1                      '1'\n#define CHAR_2                      '2'\n#define CHAR_3                      '3'\n#define CHAR_4                      '4'\n#define CHAR_5                      '5'\n#define CHAR_6                      '6'\n#define CHAR_7                      '7'\n#define CHAR_8                      '8'\n#define CHAR_9                      '9'\n#define CHAR_COLON                  ':'\n#define CHAR_SEMICOLON              ';'\n#define CHAR_LESS_THAN_SIGN         '<'\n#define CHAR_EQUALS_SIGN            '='\n#define CHAR_GREATER_THAN_SIGN      '>'\n#define CHAR_QUESTION_MARK          '?'\n#define CHAR_COMMERCIAL_AT          '@'\n#define CHAR_A                      'A'\n#define CHAR_B                      'B'\n#define CHAR_C                      'C'\n#define CHAR_D                      'D'\n#define CHAR_E                      'E'\n#define CHAR_F                      'F'\n#define CHAR_G                      'G'\n#define CHAR_H                      'H'\n#define CHAR_I                      'I'\n#define CHAR_J                      'J'\n#define CHAR_K                      'K'\n#define CHAR_L                      'L'\n#define CHAR_M                      'M'\n#define CHAR_N                      'N'\n#define CHAR_O                      'O'\n#define CHAR_P                      'P'\n#define CHAR_Q                      'Q'\n#define CHAR_R                      'R'\n#define CHAR_S                      'S'\n#define CHAR_T                      'T'\n#define CHAR_U                      'U'\n#define CHAR_V                      'V'\n#define CHAR_W                      'W'\n#define CHAR_X                      'X'\n#define CHAR_Y                      'Y'\n#define CHAR_Z                      'Z'\n#define CHAR_LEFT_SQUARE_BRACKET    '['\n#define CHAR_BACKSLASH              '\\\\'\n#define CHAR_RIGHT_SQUARE_BRACKET   ']'\n#define CHAR_CIRCUMFLEX_ACCENT      '^'\n#define CHAR_UNDERSCORE             '_'\n#define CHAR_GRAVE_ACCENT           '`'\n#define CHAR_a                      'a'\n#define CHAR_b                      'b'\n#define CHAR_c                      'c'\n#define CHAR_d                      'd'\n#define CHAR_e                      'e'\n#define CHAR_f                      'f'\n#define CHAR_g                      'g'\n#define CHAR_h                      'h'\n#define CHAR_i                      'i'\n#define CHAR_j                      'j'\n#define CHAR_k                      'k'\n#define CHAR_l                      'l'\n#define CHAR_m                      'm'\n#define CHAR_n                      'n'\n#define CHAR_o                      'o'\n#define CHAR_p                      'p'\n#define CHAR_q                      'q'\n#define CHAR_r                      'r'\n#define CHAR_s                      's'\n#define CHAR_t                      't'\n#define CHAR_u                      'u'\n#define CHAR_v                      'v'\n#define CHAR_w                      'w'\n#define CHAR_x                      'x'\n#define CHAR_y                      'y'\n#define CHAR_z                      'z'\n#define CHAR_LEFT_CURLY_BRACKET     '{'\n#define CHAR_VERTICAL_LINE          '|'\n#define CHAR_RIGHT_CURLY_BRACKET    '}'\n#define CHAR_TILDE                  '~'\n\n#define STR_HT                      \"\\t\"\n#define STR_VT                      \"\\v\"\n#define STR_FF                      \"\\f\"\n#define STR_CR                      \"\\r\"\n#define STR_BS                      \"\\b\"\n#define STR_BEL                     \"\\a\"\n\n#define STR_SPACE                   \" \"\n#define STR_EXCLAMATION_MARK        \"!\"\n#define STR_QUOTATION_MARK          \"\\\"\"\n#define STR_NUMBER_SIGN             \"#\"\n#define STR_DOLLAR_SIGN             \"$\"\n#define STR_PERCENT_SIGN            \"%\"\n#define STR_AMPERSAND               \"&\"\n#define STR_APOSTROPHE              \"'\"\n#define STR_LEFT_PARENTHESIS        \"(\"\n#define STR_RIGHT_PARENTHESIS       \")\"\n#define STR_ASTERISK                \"*\"\n#define STR_PLUS                    \"+\"\n#define STR_COMMA                   \",\"\n#define STR_MINUS                   \"-\"\n#define STR_DOT                     \".\"\n#define STR_SLASH                   \"/\"\n#define STR_0                       \"0\"\n#define STR_1                       \"1\"\n#define STR_2                       \"2\"\n#define STR_3                       \"3\"\n#define STR_4                       \"4\"\n#define STR_5                       \"5\"\n#define STR_6                       \"6\"\n#define STR_7                       \"7\"\n#define STR_8                       \"8\"\n#define STR_9                       \"9\"\n#define STR_COLON                   \":\"\n#define STR_SEMICOLON               \";\"\n#define STR_LESS_THAN_SIGN          \"<\"\n#define STR_EQUALS_SIGN             \"=\"\n#define STR_GREATER_THAN_SIGN       \">\"\n#define STR_QUESTION_MARK           \"?\"\n#define STR_COMMERCIAL_AT           \"@\"\n#define STR_A                       \"A\"\n#define STR_B                       \"B\"\n#define STR_C                       \"C\"\n#define STR_D                       \"D\"\n#define STR_E                       \"E\"\n#define STR_F                       \"F\"\n#define STR_G                       \"G\"\n#define STR_H                       \"H\"\n#define STR_I                       \"I\"\n#define STR_J                       \"J\"\n#define STR_K                       \"K\"\n#define STR_L                       \"L\"\n#define STR_M                       \"M\"\n#define STR_N                       \"N\"\n#define STR_O                       \"O\"\n#define STR_P                       \"P\"\n#define STR_Q                       \"Q\"\n#define STR_R                       \"R\"\n#define STR_S                       \"S\"\n#define STR_T                       \"T\"\n#define STR_U                       \"U\"\n#define STR_V                       \"V\"\n#define STR_W                       \"W\"\n#define STR_X                       \"X\"\n#define STR_Y                       \"Y\"\n#define STR_Z                       \"Z\"\n#define STR_LEFT_SQUARE_BRACKET     \"[\"\n#define STR_BACKSLASH               \"\\\\\"\n#define STR_RIGHT_SQUARE_BRACKET    \"]\"\n#define STR_CIRCUMFLEX_ACCENT       \"^\"\n#define STR_UNDERSCORE              \"_\"\n#define STR_GRAVE_ACCENT            \"`\"\n#define STR_a                       \"a\"\n#define STR_b                       \"b\"\n#define STR_c                       \"c\"\n#define STR_d                       \"d\"\n#define STR_e                       \"e\"\n#define STR_f                       \"f\"\n#define STR_g                       \"g\"\n#define STR_h                       \"h\"\n#define STR_i                       \"i\"\n#define STR_j                       \"j\"\n#define STR_k                       \"k\"\n#define STR_l                       \"l\"\n#define STR_m                       \"m\"\n#define STR_n                       \"n\"\n#define STR_o                       \"o\"\n#define STR_p                       \"p\"\n#define STR_q                       \"q\"\n#define STR_r                       \"r\"\n#define STR_s                       \"s\"\n#define STR_t                       \"t\"\n#define STR_u                       \"u\"\n#define STR_v                       \"v\"\n#define STR_w                       \"w\"\n#define STR_x                       \"x\"\n#define STR_y                       \"y\"\n#define STR_z                       \"z\"\n#define STR_LEFT_CURLY_BRACKET      \"{\"\n#define STR_VERTICAL_LINE           \"|\"\n#define STR_RIGHT_CURLY_BRACKET     \"}\"\n#define STR_TILDE                   \"~\"\n\n#define STRING_ACCEPT0              \"ACCEPT\\0\"\n#define STRING_COMMIT0              \"COMMIT\\0\"\n#define STRING_F0                   \"F\\0\"\n#define STRING_FAIL0                \"FAIL\\0\"\n#define STRING_MARK0                \"MARK\\0\"\n#define STRING_PRUNE0               \"PRUNE\\0\"\n#define STRING_SKIP0                \"SKIP\\0\"\n#define STRING_THEN                 \"THEN\"\n\n#define STRING_alpha0               \"alpha\\0\"\n#define STRING_lower0               \"lower\\0\"\n#define STRING_upper0               \"upper\\0\"\n#define STRING_alnum0               \"alnum\\0\"\n#define STRING_ascii0               \"ascii\\0\"\n#define STRING_blank0               \"blank\\0\"\n#define STRING_cntrl0               \"cntrl\\0\"\n#define STRING_digit0               \"digit\\0\"\n#define STRING_graph0               \"graph\\0\"\n#define STRING_print0               \"print\\0\"\n#define STRING_punct0               \"punct\\0\"\n#define STRING_space0               \"space\\0\"\n#define STRING_word0                \"word\\0\"\n#define STRING_xdigit               \"xdigit\"\n\n#define STRING_DEFINE               \"DEFINE\"\n#define STRING_WEIRD_STARTWORD      \"[:<:]]\"\n#define STRING_WEIRD_ENDWORD        \"[:>:]]\"\n\n#define STRING_CR_RIGHTPAR              \"CR)\"\n#define STRING_LF_RIGHTPAR              \"LF)\"\n#define STRING_CRLF_RIGHTPAR            \"CRLF)\"\n#define STRING_ANY_RIGHTPAR             \"ANY)\"\n#define STRING_ANYCRLF_RIGHTPAR         \"ANYCRLF)\"\n#define STRING_BSR_ANYCRLF_RIGHTPAR     \"BSR_ANYCRLF)\"\n#define STRING_BSR_UNICODE_RIGHTPAR     \"BSR_UNICODE)\"\n#define STRING_UTF8_RIGHTPAR            \"UTF8)\"\n#define STRING_UTF16_RIGHTPAR           \"UTF16)\"\n#define STRING_UTF32_RIGHTPAR           \"UTF32)\"\n#define STRING_UTF_RIGHTPAR             \"UTF)\"\n#define STRING_UCP_RIGHTPAR             \"UCP)\"\n#define STRING_NO_AUTO_POSSESS_RIGHTPAR \"NO_AUTO_POSSESS)\"\n#define STRING_NO_START_OPT_RIGHTPAR    \"NO_START_OPT)\"\n#define STRING_LIMIT_MATCH_EQ           \"LIMIT_MATCH=\"\n#define STRING_LIMIT_RECURSION_EQ       \"LIMIT_RECURSION=\"\n\n#else  /* SUPPORT_UTF */\n\n/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This\nworks in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode\nonly. */\n\n#define CHAR_HT                     '\\011'\n#define CHAR_VT                     '\\013'\n#define CHAR_FF                     '\\014'\n#define CHAR_CR                     '\\015'\n#define CHAR_LF                     '\\012'\n#define CHAR_NL                     CHAR_LF\n#define CHAR_NEL                    ((unsigned char)'\\x85')\n#define CHAR_BS                     '\\010'\n#define CHAR_BEL                    '\\007'\n#define CHAR_ESC                    '\\033'\n#define CHAR_DEL                    '\\177'\n\n#define CHAR_NULL                   '\\0'\n#define CHAR_SPACE                  '\\040'\n#define CHAR_EXCLAMATION_MARK       '\\041'\n#define CHAR_QUOTATION_MARK         '\\042'\n#define CHAR_NUMBER_SIGN            '\\043'\n#define CHAR_DOLLAR_SIGN            '\\044'\n#define CHAR_PERCENT_SIGN           '\\045'\n#define CHAR_AMPERSAND              '\\046'\n#define CHAR_APOSTROPHE             '\\047'\n#define CHAR_LEFT_PARENTHESIS       '\\050'\n#define CHAR_RIGHT_PARENTHESIS      '\\051'\n#define CHAR_ASTERISK               '\\052'\n#define CHAR_PLUS                   '\\053'\n#define CHAR_COMMA                  '\\054'\n#define CHAR_MINUS                  '\\055'\n#define CHAR_DOT                    '\\056'\n#define CHAR_SLASH                  '\\057'\n#define CHAR_0                      '\\060'\n#define CHAR_1                      '\\061'\n#define CHAR_2                      '\\062'\n#define CHAR_3                      '\\063'\n#define CHAR_4                      '\\064'\n#define CHAR_5                      '\\065'\n#define CHAR_6                      '\\066'\n#define CHAR_7                      '\\067'\n#define CHAR_8                      '\\070'\n#define CHAR_9                      '\\071'\n#define CHAR_COLON                  '\\072'\n#define CHAR_SEMICOLON              '\\073'\n#define CHAR_LESS_THAN_SIGN         '\\074'\n#define CHAR_EQUALS_SIGN            '\\075'\n#define CHAR_GREATER_THAN_SIGN      '\\076'\n#define CHAR_QUESTION_MARK          '\\077'\n#define CHAR_COMMERCIAL_AT          '\\100'\n#define CHAR_A                      '\\101'\n#define CHAR_B                      '\\102'\n#define CHAR_C                      '\\103'\n#define CHAR_D                      '\\104'\n#define CHAR_E                      '\\105'\n#define CHAR_F                      '\\106'\n#define CHAR_G                      '\\107'\n#define CHAR_H                      '\\110'\n#define CHAR_I                      '\\111'\n#define CHAR_J                      '\\112'\n#define CHAR_K                      '\\113'\n#define CHAR_L                      '\\114'\n#define CHAR_M                      '\\115'\n#define CHAR_N                      '\\116'\n#define CHAR_O                      '\\117'\n#define CHAR_P                      '\\120'\n#define CHAR_Q                      '\\121'\n#define CHAR_R                      '\\122'\n#define CHAR_S                      '\\123'\n#define CHAR_T                      '\\124'\n#define CHAR_U                      '\\125'\n#define CHAR_V                      '\\126'\n#define CHAR_W                      '\\127'\n#define CHAR_X                      '\\130'\n#define CHAR_Y                      '\\131'\n#define CHAR_Z                      '\\132'\n#define CHAR_LEFT_SQUARE_BRACKET    '\\133'\n#define CHAR_BACKSLASH              '\\134'\n#define CHAR_RIGHT_SQUARE_BRACKET   '\\135'\n#define CHAR_CIRCUMFLEX_ACCENT      '\\136'\n#define CHAR_UNDERSCORE             '\\137'\n#define CHAR_GRAVE_ACCENT           '\\140'\n#define CHAR_a                      '\\141'\n#define CHAR_b                      '\\142'\n#define CHAR_c                      '\\143'\n#define CHAR_d                      '\\144'\n#define CHAR_e                      '\\145'\n#define CHAR_f                      '\\146'\n#define CHAR_g                      '\\147'\n#define CHAR_h                      '\\150'\n#define CHAR_i                      '\\151'\n#define CHAR_j                      '\\152'\n#define CHAR_k                      '\\153'\n#define CHAR_l                      '\\154'\n#define CHAR_m                      '\\155'\n#define CHAR_n                      '\\156'\n#define CHAR_o                      '\\157'\n#define CHAR_p                      '\\160'\n#define CHAR_q                      '\\161'\n#define CHAR_r                      '\\162'\n#define CHAR_s                      '\\163'\n#define CHAR_t                      '\\164'\n#define CHAR_u                      '\\165'\n#define CHAR_v                      '\\166'\n#define CHAR_w                      '\\167'\n#define CHAR_x                      '\\170'\n#define CHAR_y                      '\\171'\n#define CHAR_z                      '\\172'\n#define CHAR_LEFT_CURLY_BRACKET     '\\173'\n#define CHAR_VERTICAL_LINE          '\\174'\n#define CHAR_RIGHT_CURLY_BRACKET    '\\175'\n#define CHAR_TILDE                  '\\176'\n#define CHAR_NBSP                   ((unsigned char)'\\xa0')\n\n#define STR_HT                      \"\\011\"\n#define STR_VT                      \"\\013\"\n#define STR_FF                      \"\\014\"\n#define STR_CR                      \"\\015\"\n#define STR_NL                      \"\\012\"\n#define STR_BS                      \"\\010\"\n#define STR_BEL                     \"\\007\"\n#define STR_ESC                     \"\\033\"\n#define STR_DEL                     \"\\177\"\n\n#define STR_SPACE                   \"\\040\"\n#define STR_EXCLAMATION_MARK        \"\\041\"\n#define STR_QUOTATION_MARK          \"\\042\"\n#define STR_NUMBER_SIGN             \"\\043\"\n#define STR_DOLLAR_SIGN             \"\\044\"\n#define STR_PERCENT_SIGN            \"\\045\"\n#define STR_AMPERSAND               \"\\046\"\n#define STR_APOSTROPHE              \"\\047\"\n#define STR_LEFT_PARENTHESIS        \"\\050\"\n#define STR_RIGHT_PARENTHESIS       \"\\051\"\n#define STR_ASTERISK                \"\\052\"\n#define STR_PLUS                    \"\\053\"\n#define STR_COMMA                   \"\\054\"\n#define STR_MINUS                   \"\\055\"\n#define STR_DOT                     \"\\056\"\n#define STR_SLASH                   \"\\057\"\n#define STR_0                       \"\\060\"\n#define STR_1                       \"\\061\"\n#define STR_2                       \"\\062\"\n#define STR_3                       \"\\063\"\n#define STR_4                       \"\\064\"\n#define STR_5                       \"\\065\"\n#define STR_6                       \"\\066\"\n#define STR_7                       \"\\067\"\n#define STR_8                       \"\\070\"\n#define STR_9                       \"\\071\"\n#define STR_COLON                   \"\\072\"\n#define STR_SEMICOLON               \"\\073\"\n#define STR_LESS_THAN_SIGN          \"\\074\"\n#define STR_EQUALS_SIGN             \"\\075\"\n#define STR_GREATER_THAN_SIGN       \"\\076\"\n#define STR_QUESTION_MARK           \"\\077\"\n#define STR_COMMERCIAL_AT           \"\\100\"\n#define STR_A                       \"\\101\"\n#define STR_B                       \"\\102\"\n#define STR_C                       \"\\103\"\n#define STR_D                       \"\\104\"\n#define STR_E                       \"\\105\"\n#define STR_F                       \"\\106\"\n#define STR_G                       \"\\107\"\n#define STR_H                       \"\\110\"\n#define STR_I                       \"\\111\"\n#define STR_J                       \"\\112\"\n#define STR_K                       \"\\113\"\n#define STR_L                       \"\\114\"\n#define STR_M                       \"\\115\"\n#define STR_N                       \"\\116\"\n#define STR_O                       \"\\117\"\n#define STR_P                       \"\\120\"\n#define STR_Q                       \"\\121\"\n#define STR_R                       \"\\122\"\n#define STR_S                       \"\\123\"\n#define STR_T                       \"\\124\"\n#define STR_U                       \"\\125\"\n#define STR_V                       \"\\126\"\n#define STR_W                       \"\\127\"\n#define STR_X                       \"\\130\"\n#define STR_Y                       \"\\131\"\n#define STR_Z                       \"\\132\"\n#define STR_LEFT_SQUARE_BRACKET     \"\\133\"\n#define STR_BACKSLASH               \"\\134\"\n#define STR_RIGHT_SQUARE_BRACKET    \"\\135\"\n#define STR_CIRCUMFLEX_ACCENT       \"\\136\"\n#define STR_UNDERSCORE              \"\\137\"\n#define STR_GRAVE_ACCENT            \"\\140\"\n#define STR_a                       \"\\141\"\n#define STR_b                       \"\\142\"\n#define STR_c                       \"\\143\"\n#define STR_d                       \"\\144\"\n#define STR_e                       \"\\145\"\n#define STR_f                       \"\\146\"\n#define STR_g                       \"\\147\"\n#define STR_h                       \"\\150\"\n#define STR_i                       \"\\151\"\n#define STR_j                       \"\\152\"\n#define STR_k                       \"\\153\"\n#define STR_l                       \"\\154\"\n#define STR_m                       \"\\155\"\n#define STR_n                       \"\\156\"\n#define STR_o                       \"\\157\"\n#define STR_p                       \"\\160\"\n#define STR_q                       \"\\161\"\n#define STR_r                       \"\\162\"\n#define STR_s                       \"\\163\"\n#define STR_t                       \"\\164\"\n#define STR_u                       \"\\165\"\n#define STR_v                       \"\\166\"\n#define STR_w                       \"\\167\"\n#define STR_x                       \"\\170\"\n#define STR_y                       \"\\171\"\n#define STR_z                       \"\\172\"\n#define STR_LEFT_CURLY_BRACKET      \"\\173\"\n#define STR_VERTICAL_LINE           \"\\174\"\n#define STR_RIGHT_CURLY_BRACKET     \"\\175\"\n#define STR_TILDE                   \"\\176\"\n\n#define STRING_ACCEPT0              STR_A STR_C STR_C STR_E STR_P STR_T \"\\0\"\n#define STRING_COMMIT0              STR_C STR_O STR_M STR_M STR_I STR_T \"\\0\"\n#define STRING_F0                   STR_F \"\\0\"\n#define STRING_FAIL0                STR_F STR_A STR_I STR_L \"\\0\"\n#define STRING_MARK0                STR_M STR_A STR_R STR_K \"\\0\"\n#define STRING_PRUNE0               STR_P STR_R STR_U STR_N STR_E \"\\0\"\n#define STRING_SKIP0                STR_S STR_K STR_I STR_P \"\\0\"\n#define STRING_THEN                 STR_T STR_H STR_E STR_N\n\n#define STRING_alpha0               STR_a STR_l STR_p STR_h STR_a \"\\0\"\n#define STRING_lower0               STR_l STR_o STR_w STR_e STR_r \"\\0\"\n#define STRING_upper0               STR_u STR_p STR_p STR_e STR_r \"\\0\"\n#define STRING_alnum0               STR_a STR_l STR_n STR_u STR_m \"\\0\"\n#define STRING_ascii0               STR_a STR_s STR_c STR_i STR_i \"\\0\"\n#define STRING_blank0               STR_b STR_l STR_a STR_n STR_k \"\\0\"\n#define STRING_cntrl0               STR_c STR_n STR_t STR_r STR_l \"\\0\"\n#define STRING_digit0               STR_d STR_i STR_g STR_i STR_t \"\\0\"\n#define STRING_graph0               STR_g STR_r STR_a STR_p STR_h \"\\0\"\n#define STRING_print0               STR_p STR_r STR_i STR_n STR_t \"\\0\"\n#define STRING_punct0               STR_p STR_u STR_n STR_c STR_t \"\\0\"\n#define STRING_space0               STR_s STR_p STR_a STR_c STR_e \"\\0\"\n#define STRING_word0                STR_w STR_o STR_r STR_d       \"\\0\"\n#define STRING_xdigit               STR_x STR_d STR_i STR_g STR_i STR_t\n\n#define STRING_DEFINE               STR_D STR_E STR_F STR_I STR_N STR_E\n#define STRING_WEIRD_STARTWORD      STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET\n#define STRING_WEIRD_ENDWORD        STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET\n\n#define STRING_CR_RIGHTPAR              STR_C STR_R STR_RIGHT_PARENTHESIS\n#define STRING_LF_RIGHTPAR              STR_L STR_F STR_RIGHT_PARENTHESIS\n#define STRING_CRLF_RIGHTPAR            STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS\n#define STRING_ANY_RIGHTPAR             STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS\n#define STRING_ANYCRLF_RIGHTPAR         STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS\n#define STRING_BSR_ANYCRLF_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS\n#define STRING_BSR_UNICODE_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS\n#define STRING_UTF8_RIGHTPAR            STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS\n#define STRING_UTF16_RIGHTPAR           STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS\n#define STRING_UTF32_RIGHTPAR           STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS\n#define STRING_UTF_RIGHTPAR             STR_U STR_T STR_F STR_RIGHT_PARENTHESIS\n#define STRING_UCP_RIGHTPAR             STR_U STR_C STR_P STR_RIGHT_PARENTHESIS\n#define STRING_NO_AUTO_POSSESS_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS\n#define STRING_NO_START_OPT_RIGHTPAR    STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS\n#define STRING_LIMIT_MATCH_EQ           STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN\n#define STRING_LIMIT_RECURSION_EQ       STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN\n\n#endif  /* SUPPORT_UTF */\n\n/* Escape items that are just an encoding of a particular data value. */\n\n#ifndef ESC_a\n#define ESC_a CHAR_BEL\n#endif\n\n#ifndef ESC_e\n#define ESC_e CHAR_ESC\n#endif\n\n#ifndef ESC_f\n#define ESC_f CHAR_FF\n#endif\n\n#ifndef ESC_n\n#define ESC_n CHAR_LF\n#endif\n\n#ifndef ESC_r\n#define ESC_r CHAR_CR\n#endif\n\n/* We can't officially use ESC_t because it is a POSIX reserved identifier\n(presumably because of all the others like size_t). */\n\n#ifndef ESC_tee\n#define ESC_tee CHAR_HT\n#endif\n\n/* Codes for different types of Unicode property */\n\n#define PT_ANY        0    /* Any property - matches all chars */\n#define PT_LAMP       1    /* L& - the union of Lu, Ll, Lt */\n#define PT_GC         2    /* Specified general characteristic (e.g. L) */\n#define PT_PC         3    /* Specified particular characteristic (e.g. Lu) */\n#define PT_SC         4    /* Script (e.g. Han) */\n#define PT_ALNUM      5    /* Alphanumeric - the union of L and N */\n#define PT_SPACE      6    /* Perl space - Z plus 9,10,12,13 */\n#define PT_PXSPACE    7    /* POSIX space - Z plus 9,10,11,12,13 */\n#define PT_WORD       8    /* Word - L plus N plus underscore */\n#define PT_CLIST      9    /* Pseudo-property: match character list */\n#define PT_UCNC      10    /* Universal Character nameable character */\n#define PT_TABSIZE   11    /* Size of square table for autopossessify tests */\n\n/* The following special properties are used only in XCLASS items, when POSIX\nclasses are specified and PCRE_UCP is set - in other words, for Unicode\nhandling of these classes. They are not available via the \\p or \\P escapes like\nthose in the above list, and so they do not take part in the autopossessifying\ntable. */\n\n#define PT_PXGRAPH   11    /* [:graph:] - characters that mark the paper */\n#define PT_PXPRINT   12    /* [:print:] - [:graph:] plus non-control spaces */\n#define PT_PXPUNCT   13    /* [:punct:] - punctuation characters */\n\n/* Flag bits and data types for the extended class (OP_XCLASS) for classes that\ncontain characters with values greater than 255. */\n\n#define XCL_NOT       0x01    /* Flag: this is a negative class */\n#define XCL_MAP       0x02    /* Flag: a 32-byte map is present */\n#define XCL_HASPROP   0x04    /* Flag: property checks are present. */\n\n#define XCL_END       0    /* Marks end of individual items */\n#define XCL_SINGLE    1    /* Single item (one multibyte char) follows */\n#define XCL_RANGE     2    /* A range (two multibyte chars) follows */\n#define XCL_PROP      3    /* Unicode property (2-byte property code follows) */\n#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */\n\n/* These are escaped items that aren't just an encoding of a particular data\nvalue such as \\n. They must have non-zero values, as check_escape() returns 0\nfor a data character.  Also, they must appear in the same order as in the\nopcode definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it\ncorresponds to \".\" in DOTALL mode rather than an escape sequence. It is also\nused for [^] in JavaScript compatibility mode, and for \\C in non-utf mode. In\nnon-DOTALL mode, \".\" behaves like \\N.\n\nThe special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc.\nwhen PCRE_UCP is set and replacement of \\d etc by \\p sequences is required.\nThey must be contiguous, and remain in order so that the replacements can be\nlooked up from a table.\n\nNegative numbers are used to encode a backreference (\\1, \\2, \\3, etc.) in\ncheck_escape(). There are two tests in the code for an escape\ngreater than ESC_b and less than ESC_Z to detect the types that may be\nrepeated. These are the types that consume characters. If any new escapes are\nput in between that don't consume a character, that code will have to change.\n*/\n\nenum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,\n       ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,\n       ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,\n       ESC_E, ESC_Q, ESC_g, ESC_k,\n       ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu };\n\n\n/********************** Opcode definitions ******************/\n\n/****** NOTE NOTE NOTE ******\n\nStarting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in\norder to the list of escapes immediately above. Furthermore, values up to\nOP_DOLLM must not be changed without adjusting the table called autoposstab in\npcre_compile.c\n\nWhenever this list is updated, the two macro definitions that follow must be\nupdated to match. The possessification table called \"opcode_possessify\" in\npcre_compile.c must also be updated, and also the tables called \"coptable\"\nand \"poptable\" in pcre_dfa_exec.c.\n\n****** NOTE NOTE NOTE ******/\n\n\n/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive,\nare used in a table for deciding whether a repeated character type can be\nauto-possessified. */\n\n#define FIRST_AUTOTAB_OP       OP_NOT_DIGIT\n#define LAST_AUTOTAB_LEFT_OP   OP_EXTUNI\n#define LAST_AUTOTAB_RIGHT_OP  OP_DOLLM\n\nenum {\n  OP_END,            /* 0 End of pattern */\n\n  /* Values corresponding to backslashed metacharacters */\n\n  OP_SOD,            /* 1 Start of data: \\A */\n  OP_SOM,            /* 2 Start of match (subject + offset): \\G */\n  OP_SET_SOM,        /* 3 Set start of match (\\K) */\n  OP_NOT_WORD_BOUNDARY,  /*  4 \\B */\n  OP_WORD_BOUNDARY,      /*  5 \\b */\n  OP_NOT_DIGIT,          /*  6 \\D */\n  OP_DIGIT,              /*  7 \\d */\n  OP_NOT_WHITESPACE,     /*  8 \\S */\n  OP_WHITESPACE,         /*  9 \\s */\n  OP_NOT_WORDCHAR,       /* 10 \\W */\n  OP_WORDCHAR,           /* 11 \\w */\n\n  OP_ANY,            /* 12 Match any character except newline (\\N) */\n  OP_ALLANY,         /* 13 Match any character */\n  OP_ANYBYTE,        /* 14 Match any byte (\\C); different to OP_ANY for UTF-8 */\n  OP_NOTPROP,        /* 15 \\P (not Unicode property) */\n  OP_PROP,           /* 16 \\p (Unicode property) */\n  OP_ANYNL,          /* 17 \\R (any newline sequence) */\n  OP_NOT_HSPACE,     /* 18 \\H (not horizontal whitespace) */\n  OP_HSPACE,         /* 19 \\h (horizontal whitespace) */\n  OP_NOT_VSPACE,     /* 20 \\V (not vertical whitespace) */\n  OP_VSPACE,         /* 21 \\v (vertical whitespace) */\n  OP_EXTUNI,         /* 22 \\X (extended Unicode sequence */\n  OP_EODN,           /* 23 End of data or \\n at end of data (\\Z) */\n  OP_EOD,            /* 24 End of data (\\z) */\n\n  /* Line end assertions */\n\n  OP_DOLL,           /* 25 End of line - not multiline */\n  OP_DOLLM,          /* 26 End of line - multiline */\n  OP_CIRC,           /* 27 Start of line - not multiline */\n  OP_CIRCM,          /* 28 Start of line - multiline */\n\n  /* Single characters; caseful must precede the caseless ones */\n\n  OP_CHAR,           /* 29 Match one character, casefully */\n  OP_CHARI,          /* 30 Match one character, caselessly */\n  OP_NOT,            /* 31 Match one character, not the given one, casefully */\n  OP_NOTI,           /* 32 Match one character, not the given one, caselessly */\n\n  /* The following sets of 13 opcodes must always be kept in step because\n  the offset from the first one is used to generate the others. */\n\n  /* Repeated characters; caseful must precede the caseless ones */\n\n  OP_STAR,           /* 33 The maximizing and minimizing versions of */\n  OP_MINSTAR,        /* 34 these six opcodes must come in pairs, with */\n  OP_PLUS,           /* 35 the minimizing one second. */\n  OP_MINPLUS,        /* 36 */\n  OP_QUERY,          /* 37 */\n  OP_MINQUERY,       /* 38 */\n\n  OP_UPTO,           /* 39 From 0 to n matches of one character, caseful*/\n  OP_MINUPTO,        /* 40 */\n  OP_EXACT,          /* 41 Exactly n matches */\n\n  OP_POSSTAR,        /* 42 Possessified star, caseful */\n  OP_POSPLUS,        /* 43 Possessified plus, caseful */\n  OP_POSQUERY,       /* 44 Posesssified query, caseful */\n  OP_POSUPTO,        /* 45 Possessified upto, caseful */\n\n  /* Repeated characters; caseless must follow the caseful ones */\n\n  OP_STARI,          /* 46 */\n  OP_MINSTARI,       /* 47 */\n  OP_PLUSI,          /* 48 */\n  OP_MINPLUSI,       /* 49 */\n  OP_QUERYI,         /* 50 */\n  OP_MINQUERYI,      /* 51 */\n\n  OP_UPTOI,          /* 52 From 0 to n matches of one character, caseless */\n  OP_MINUPTOI,       /* 53 */\n  OP_EXACTI,         /* 54 */\n\n  OP_POSSTARI,       /* 55 Possessified star, caseless */\n  OP_POSPLUSI,       /* 56 Possessified plus, caseless */\n  OP_POSQUERYI,      /* 57 Posesssified query, caseless */\n  OP_POSUPTOI,       /* 58 Possessified upto, caseless */\n\n  /* The negated ones must follow the non-negated ones, and match them */\n  /* Negated repeated character, caseful; must precede the caseless ones */\n\n  OP_NOTSTAR,        /* 59 The maximizing and minimizing versions of */\n  OP_NOTMINSTAR,     /* 60 these six opcodes must come in pairs, with */\n  OP_NOTPLUS,        /* 61 the minimizing one second. They must be in */\n  OP_NOTMINPLUS,     /* 62 exactly the same order as those above. */\n  OP_NOTQUERY,       /* 63 */\n  OP_NOTMINQUERY,    /* 64 */\n\n  OP_NOTUPTO,        /* 65 From 0 to n matches, caseful */\n  OP_NOTMINUPTO,     /* 66 */\n  OP_NOTEXACT,       /* 67 Exactly n matches */\n\n  OP_NOTPOSSTAR,     /* 68 Possessified versions, caseful */\n  OP_NOTPOSPLUS,     /* 69 */\n  OP_NOTPOSQUERY,    /* 70 */\n  OP_NOTPOSUPTO,     /* 71 */\n\n  /* Negated repeated character, caseless; must follow the caseful ones */\n\n  OP_NOTSTARI,       /* 72 */\n  OP_NOTMINSTARI,    /* 73 */\n  OP_NOTPLUSI,       /* 74 */\n  OP_NOTMINPLUSI,    /* 75 */\n  OP_NOTQUERYI,      /* 76 */\n  OP_NOTMINQUERYI,   /* 77 */\n\n  OP_NOTUPTOI,       /* 78 From 0 to n matches, caseless */\n  OP_NOTMINUPTOI,    /* 79 */\n  OP_NOTEXACTI,      /* 80 Exactly n matches */\n\n  OP_NOTPOSSTARI,    /* 81 Possessified versions, caseless */\n  OP_NOTPOSPLUSI,    /* 82 */\n  OP_NOTPOSQUERYI,   /* 83 */\n  OP_NOTPOSUPTOI,    /* 84 */\n\n  /* Character types */\n\n  OP_TYPESTAR,       /* 85 The maximizing and minimizing versions of */\n  OP_TYPEMINSTAR,    /* 86 these six opcodes must come in pairs, with */\n  OP_TYPEPLUS,       /* 87 the minimizing one second. These codes must */\n  OP_TYPEMINPLUS,    /* 88 be in exactly the same order as those above. */\n  OP_TYPEQUERY,      /* 89 */\n  OP_TYPEMINQUERY,   /* 90 */\n\n  OP_TYPEUPTO,       /* 91 From 0 to n matches */\n  OP_TYPEMINUPTO,    /* 92 */\n  OP_TYPEEXACT,      /* 93 Exactly n matches */\n\n  OP_TYPEPOSSTAR,    /* 94 Possessified versions */\n  OP_TYPEPOSPLUS,    /* 95 */\n  OP_TYPEPOSQUERY,   /* 96 */\n  OP_TYPEPOSUPTO,    /* 97 */\n\n  /* These are used for character classes and back references; only the\n  first six are the same as the sets above. */\n\n  OP_CRSTAR,         /* 98 The maximizing and minimizing versions of */\n  OP_CRMINSTAR,      /* 99 all these opcodes must come in pairs, with */\n  OP_CRPLUS,         /* 100 the minimizing one second. These codes must */\n  OP_CRMINPLUS,      /* 101 be in exactly the same order as those above. */\n  OP_CRQUERY,        /* 102 */\n  OP_CRMINQUERY,     /* 103 */\n\n  OP_CRRANGE,        /* 104 These are different to the three sets above. */\n  OP_CRMINRANGE,     /* 105 */\n\n  OP_CRPOSSTAR,      /* 106 Possessified versions */\n  OP_CRPOSPLUS,      /* 107 */\n  OP_CRPOSQUERY,     /* 108 */\n  OP_CRPOSRANGE,     /* 109 */\n\n  /* End of quantifier opcodes */\n\n  OP_CLASS,          /* 110 Match a character class, chars < 256 only */\n  OP_NCLASS,         /* 111 Same, but the bitmap was created from a negative\n                              class - the difference is relevant only when a\n                              character > 255 is encountered. */\n  OP_XCLASS,         /* 112 Extended class for handling > 255 chars within the\n                              class. This does both positive and negative. */\n  OP_REF,            /* 113 Match a back reference, casefully */\n  OP_REFI,           /* 114 Match a back reference, caselessly */\n  OP_DNREF,          /* 115 Match a duplicate name backref, casefully */\n  OP_DNREFI,         /* 116 Match a duplicate name backref, caselessly */\n  OP_RECURSE,        /* 117 Match a numbered subpattern (possibly recursive) */\n  OP_CALLOUT,        /* 118 Call out to external function if provided */\n\n  OP_ALT,            /* 119 Start of alternation */\n  OP_KET,            /* 120 End of group that doesn't have an unbounded repeat */\n  OP_KETRMAX,        /* 121 These two must remain together and in this */\n  OP_KETRMIN,        /* 122 order. They are for groups the repeat for ever. */\n  OP_KETRPOS,        /* 123 Possessive unlimited repeat. */\n\n  /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four\n  asserts must remain in order. */\n\n  OP_REVERSE,        /* 124 Move pointer back - used in lookbehind assertions */\n  OP_ASSERT,         /* 125 Positive lookahead */\n  OP_ASSERT_NOT,     /* 126 Negative lookahead */\n  OP_ASSERTBACK,     /* 127 Positive lookbehind */\n  OP_ASSERTBACK_NOT, /* 128 Negative lookbehind */\n\n  /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately\n  after the assertions, with ONCE first, as there's a test for >= ONCE for a\n  subpattern that isn't an assertion. The POS versions must immediately follow\n  the non-POS versions in each case. */\n\n  OP_ONCE,           /* 129 Atomic group, contains captures */\n  OP_ONCE_NC,        /* 130 Atomic group containing no captures */\n  OP_BRA,            /* 131 Start of non-capturing bracket */\n  OP_BRAPOS,         /* 132 Ditto, with unlimited, possessive repeat */\n  OP_CBRA,           /* 133 Start of capturing bracket */\n  OP_CBRAPOS,        /* 134 Ditto, with unlimited, possessive repeat */\n  OP_COND,           /* 135 Conditional group */\n\n  /* These five must follow the previous five, in the same order. There's a\n  check for >= SBRA to distinguish the two sets. */\n\n  OP_SBRA,           /* 136 Start of non-capturing bracket, check empty  */\n  OP_SBRAPOS,        /* 137 Ditto, with unlimited, possessive repeat */\n  OP_SCBRA,          /* 138 Start of capturing bracket, check empty */\n  OP_SCBRAPOS,       /* 139 Ditto, with unlimited, possessive repeat */\n  OP_SCOND,          /* 140 Conditional group, check empty */\n\n  /* The next two pairs must (respectively) be kept together. */\n\n  OP_CREF,           /* 141 Used to hold a capture number as condition */\n  OP_DNCREF,         /* 142 Used to point to duplicate names as a condition */\n  OP_RREF,           /* 143 Used to hold a recursion number as condition */\n  OP_DNRREF,         /* 144 Used to point to duplicate names as a condition */\n  OP_DEF,            /* 145 The DEFINE condition */\n\n  OP_BRAZERO,        /* 146 These two must remain together and in this */\n  OP_BRAMINZERO,     /* 147 order. */\n  OP_BRAPOSZERO,     /* 148 */\n\n  /* These are backtracking control verbs */\n\n  OP_MARK,           /* 149 always has an argument */\n  OP_PRUNE,          /* 150 */\n  OP_PRUNE_ARG,      /* 151 same, but with argument */\n  OP_SKIP,           /* 152 */\n  OP_SKIP_ARG,       /* 153 same, but with argument */\n  OP_THEN,           /* 154 */\n  OP_THEN_ARG,       /* 155 same, but with argument */\n  OP_COMMIT,         /* 156 */\n\n  /* These are forced failure and success verbs */\n\n  OP_FAIL,           /* 157 */\n  OP_ACCEPT,         /* 158 */\n  OP_ASSERT_ACCEPT,  /* 159 Used inside assertions */\n  OP_CLOSE,          /* 160 Used before OP_ACCEPT to close open captures */\n\n  /* This is used to skip a subpattern with a {0} quantifier */\n\n  OP_SKIPZERO,       /* 161 */\n\n  /* This is not an opcode, but is used to check that tables indexed by opcode\n  are the correct length, in order to catch updating errors - there have been\n  some in the past. */\n\n  OP_TABLE_LENGTH\n};\n\n/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro\ndefinitions that follow must also be updated to match. There are also tables\ncalled \"opcode_possessify\" in pcre_compile.c and \"coptable\" and \"poptable\" in\npcre_dfa_exec.c that must be updated. */\n\n\n/* This macro defines textual names for all the opcodes. These are used only\nfor debugging, and some of them are only partial names. The macro is referenced\nonly in pcre_printint.c, which fills out the full names in many cases (and in\nsome cases doesn't actually use these names at all). */\n\n#define OP_NAME_LIST \\\n  \"End\", \"\\\\A\", \"\\\\G\", \"\\\\K\", \"\\\\B\", \"\\\\b\", \"\\\\D\", \"\\\\d\",         \\\n  \"\\\\S\", \"\\\\s\", \"\\\\W\", \"\\\\w\", \"Any\", \"AllAny\", \"Anybyte\",         \\\n  \"notprop\", \"prop\", \"\\\\R\", \"\\\\H\", \"\\\\h\", \"\\\\V\", \"\\\\v\",           \\\n  \"extuni\",  \"\\\\Z\", \"\\\\z\",                                        \\\n  \"$\", \"$\", \"^\", \"^\", \"char\", \"chari\", \"not\", \"noti\",             \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\",                                \\\n  \"{\", \"{\", \"{\",                                                  \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\",                                \\\n  \"{\", \"{\", \"{\",                                                  \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\",                                \\\n  \"{\", \"{\", \"{\",                                                  \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\",                                \\\n  \"{\", \"{\", \"{\",                                                  \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\", \"{\", \"{\", \"{\",                 \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"*\", \"*?\", \"+\", \"+?\", \"?\", \"??\", \"{\", \"{\",                      \\\n  \"*+\",\"++\", \"?+\", \"{\",                                           \\\n  \"class\", \"nclass\", \"xclass\", \"Ref\", \"Refi\", \"DnRef\", \"DnRefi\",  \\\n  \"Recurse\", \"Callout\",                                           \\\n  \"Alt\", \"Ket\", \"KetRmax\", \"KetRmin\", \"KetRpos\",                  \\\n  \"Reverse\", \"Assert\", \"Assert not\", \"AssertB\", \"AssertB not\",    \\\n  \"Once\", \"Once_NC\",                                              \\\n  \"Bra\", \"BraPos\", \"CBra\", \"CBraPos\",                             \\\n  \"Cond\",                                                         \\\n  \"SBra\", \"SBraPos\", \"SCBra\", \"SCBraPos\",                         \\\n  \"SCond\",                                                        \\\n  \"Cond ref\", \"Cond dnref\", \"Cond rec\", \"Cond dnrec\", \"Cond def\", \\\n  \"Brazero\", \"Braminzero\", \"Braposzero\",                          \\\n  \"*MARK\", \"*PRUNE\", \"*PRUNE\", \"*SKIP\", \"*SKIP\",                  \\\n  \"*THEN\", \"*THEN\", \"*COMMIT\", \"*FAIL\",                           \\\n  \"*ACCEPT\", \"*ASSERT_ACCEPT\",                                    \\\n  \"Close\", \"Skip zero\"\n\n\n/* This macro defines the length of fixed length operations in the compiled\nregex. The lengths are used when searching for specific things, and also in the\ndebugging printing of a compiled regex. We use a macro so that it can be\ndefined close to the definitions of the opcodes themselves.\n\nAs things have been extended, some of these are no longer fixed lenths, but are\nminima instead. For example, the length of a single-character repeat may vary\nin UTF-8 mode. The code that uses this table must know about such things. */\n\n#define OP_LENGTHS \\\n  1,                             /* End                                    */ \\\n  1, 1, 1, 1, 1,                 /* \\A, \\G, \\K, \\B, \\b                     */ \\\n  1, 1, 1, 1, 1, 1,              /* \\D, \\d, \\S, \\s, \\W, \\w                 */ \\\n  1, 1, 1,                       /* Any, AllAny, Anybyte                   */ \\\n  3, 3,                          /* \\P, \\p                                 */ \\\n  1, 1, 1, 1, 1,                 /* \\R, \\H, \\h, \\V, \\v                     */ \\\n  1,                             /* \\X                                     */ \\\n  1, 1, 1, 1, 1, 1,              /* \\Z, \\z, $, $M ^, ^M                    */ \\\n  2,                             /* Char  - the minimum length             */ \\\n  2,                             /* Chari  - the minimum length            */ \\\n  2,                             /* not                                    */ \\\n  2,                             /* noti                                   */ \\\n  /* Positive single-char repeats                             ** These are */ \\\n  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??       ** minima in */ \\\n  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto, minupto             ** mode      */ \\\n  2+IMM2_SIZE,                   /* exact                                  */ \\\n  2, 2, 2, 2+IMM2_SIZE,          /* *+, ++, ?+, upto+                      */ \\\n  2, 2, 2, 2, 2, 2,              /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8     */ \\\n  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto I, minupto I                      */ \\\n  2+IMM2_SIZE,                   /* exact I                                */ \\\n  2, 2, 2, 2+IMM2_SIZE,          /* *+I, ++I, ?+I, upto+I                  */ \\\n  /* Negative single-char repeats - only for chars < 256                   */ \\\n  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \\\n  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto, minupto                      */ \\\n  2+IMM2_SIZE,                   /* NOT exact                              */ \\\n  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *, +, ?, upto           */ \\\n  2, 2, 2, 2, 2, 2,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */ \\\n  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto I, minupto I                  */ \\\n  2+IMM2_SIZE,                   /* NOT exact I                            */ \\\n  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *I, +I, ?I, upto I      */ \\\n  /* Positive type repeats                                                 */ \\\n  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \\\n  2+IMM2_SIZE, 2+IMM2_SIZE,      /* Type upto, minupto                     */ \\\n  2+IMM2_SIZE,                   /* Type exact                             */ \\\n  2, 2, 2, 2+IMM2_SIZE,          /* Possessive *+, ++, ?+, upto+           */ \\\n  /* Character class & ref repeats                                         */ \\\n  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \\\n  1+2*IMM2_SIZE, 1+2*IMM2_SIZE,  /* CRRANGE, CRMINRANGE                    */ \\\n  1, 1, 1, 1+2*IMM2_SIZE,        /* Possessive *+, ++, ?+, CRPOSRANGE      */ \\\n  1+(32/sizeof(pcre_uchar)),     /* CLASS                                  */ \\\n  1+(32/sizeof(pcre_uchar)),     /* NCLASS                                 */ \\\n  0,                             /* XCLASS - variable length               */ \\\n  1+IMM2_SIZE,                   /* REF                                    */ \\\n  1+IMM2_SIZE,                   /* REFI                                   */ \\\n  1+2*IMM2_SIZE,                 /* DNREF                                  */ \\\n  1+2*IMM2_SIZE,                 /* DNREFI                                 */ \\\n  1+LINK_SIZE,                   /* RECURSE                                */ \\\n  2+2*LINK_SIZE,                 /* CALLOUT                                */ \\\n  1+LINK_SIZE,                   /* Alt                                    */ \\\n  1+LINK_SIZE,                   /* Ket                                    */ \\\n  1+LINK_SIZE,                   /* KetRmax                                */ \\\n  1+LINK_SIZE,                   /* KetRmin                                */ \\\n  1+LINK_SIZE,                   /* KetRpos                                */ \\\n  1+LINK_SIZE,                   /* Reverse                                */ \\\n  1+LINK_SIZE,                   /* Assert                                 */ \\\n  1+LINK_SIZE,                   /* Assert not                             */ \\\n  1+LINK_SIZE,                   /* Assert behind                          */ \\\n  1+LINK_SIZE,                   /* Assert behind not                      */ \\\n  1+LINK_SIZE,                   /* ONCE                                   */ \\\n  1+LINK_SIZE,                   /* ONCE_NC                                */ \\\n  1+LINK_SIZE,                   /* BRA                                    */ \\\n  1+LINK_SIZE,                   /* BRAPOS                                 */ \\\n  1+LINK_SIZE+IMM2_SIZE,         /* CBRA                                   */ \\\n  1+LINK_SIZE+IMM2_SIZE,         /* CBRAPOS                                */ \\\n  1+LINK_SIZE,                   /* COND                                   */ \\\n  1+LINK_SIZE,                   /* SBRA                                   */ \\\n  1+LINK_SIZE,                   /* SBRAPOS                                */ \\\n  1+LINK_SIZE+IMM2_SIZE,         /* SCBRA                                  */ \\\n  1+LINK_SIZE+IMM2_SIZE,         /* SCBRAPOS                               */ \\\n  1+LINK_SIZE,                   /* SCOND                                  */ \\\n  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* CREF, DNCREF                           */ \\\n  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* RREF, DNRREF                           */ \\\n  1,                             /* DEF                                    */ \\\n  1, 1, 1,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */ \\\n  3, 1, 3,                       /* MARK, PRUNE, PRUNE_ARG                 */ \\\n  1, 3,                          /* SKIP, SKIP_ARG                         */ \\\n  1, 3,                          /* THEN, THEN_ARG                         */ \\\n  1, 1, 1, 1,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */ \\\n  1+IMM2_SIZE, 1                 /* CLOSE, SKIPZERO                        */\n\n/* A magic value for OP_RREF to indicate the \"any recursion\" condition. */\n\n#define RREF_ANY  0xffff\n\n/* Compile time error code numbers. They are given names so that they can more\neasily be tracked. When a new number is added, the table called eint in\npcreposix.c must be updated. */\n\nenum { ERR0,  ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,\n       ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19,\n       ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29,\n       ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,\n       ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49,\n       ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,\n       ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69,\n       ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79,\n       ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERRCOUNT };\n\n/* JIT compiling modes. The function list is indexed by them. */\n\nenum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE,\n       JIT_NUMBER_OF_COMPILE_MODES };\n\n/* The real format of the start of the pcre block; the index of names and the\ncode vector run on as long as necessary after the end. We store an explicit\noffset to the name table so that if a regex is compiled on one host, saved, and\nthen run on another where the size of pointers is different, all might still\nbe well.\n\nThe size of the structure must be a multiple of 8 bytes. For the case of\ncompiled-on-4 and run-on-8, we include an extra pointer that is always NULL so\nthat there are an even number of pointers which therefore are a multiple of 8\nbytes.\n\nIt is necessary to fork the struct for the 32 bit library, since it needs to\nuse pcre_uint32 for first_char and req_char. We can't put an ifdef inside the\ntypedef because pcretest needs access to the struct of the 8-, 16- and 32-bit\nvariants.\n\n*** WARNING ***\nWhen new fields are added to these structures, remember to adjust the code in\npcre_byte_order.c that is concerned with swapping the byte order of the fields\nwhen a compiled regex is reloaded on a host with different endianness.\n*** WARNING ***\nThere is also similar byte-flipping code in pcretest.c, which is used for\ntesting the byte-flipping features. It must also be kept in step.\n*** WARNING ***\n*/\n\ntypedef struct real_pcre8_or_16 {\n  pcre_uint32 magic_number;\n  pcre_uint32 size;               /* Total that was malloced */\n  pcre_uint32 options;            /* Public options */\n  pcre_uint32 flags;              /* Private flags */\n  pcre_uint32 limit_match;        /* Limit set from regex */\n  pcre_uint32 limit_recursion;    /* Limit set from regex */\n  pcre_uint16 first_char;         /* Starting character */\n  pcre_uint16 req_char;           /* This character must be seen */\n  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */\n  pcre_uint16 top_bracket;        /* Highest numbered group */\n  pcre_uint16 top_backref;        /* Highest numbered back reference */\n  pcre_uint16 name_table_offset;  /* Offset to name table that follows */\n  pcre_uint16 name_entry_size;    /* Size of any name items */\n  pcre_uint16 name_count;         /* Number of name items */\n  pcre_uint16 ref_count;          /* Reference count */\n  pcre_uint16 dummy1;             /* To ensure size is a multiple of 8 */\n  pcre_uint16 dummy2;             /* To ensure size is a multiple of 8 */\n  pcre_uint16 dummy3;             /* To ensure size is a multiple of 8 */\n  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */\n  void             *nullpad;      /* NULL padding */\n} real_pcre8_or_16;\n\ntypedef struct real_pcre8_or_16 real_pcre;\ntypedef struct real_pcre8_or_16 real_pcre16;\n\ntypedef struct real_pcre32 {\n  pcre_uint32 magic_number;\n  pcre_uint32 size;               /* Total that was malloced */\n  pcre_uint32 options;            /* Public options */\n  pcre_uint32 flags;              /* Private flags */\n  pcre_uint32 limit_match;        /* Limit set from regex */\n  pcre_uint32 limit_recursion;    /* Limit set from regex */\n  pcre_uint32 first_char;         /* Starting character */\n  pcre_uint32 req_char;           /* This character must be seen */\n  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */\n  pcre_uint16 top_bracket;        /* Highest numbered group */\n  pcre_uint16 top_backref;        /* Highest numbered back reference */\n  pcre_uint16 name_table_offset;  /* Offset to name table that follows */\n  pcre_uint16 name_entry_size;    /* Size of any name items */\n  pcre_uint16 name_count;         /* Number of name items */\n  pcre_uint16 ref_count;          /* Reference count */\n  pcre_uint16 dummy;              /* To ensure size is a multiple of 8 */\n  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */\n  void             *nullpad;      /* NULL padding */\n} real_pcre32;\n\n#if defined COMPILE_PCRE8\n#define REAL_PCRE real_pcre\n#elif defined COMPILE_PCRE16\n#define REAL_PCRE real_pcre16\n#elif defined COMPILE_PCRE32\n#define REAL_PCRE real_pcre32\n#endif\n\n/* Assert that the size of REAL_PCRE is divisible by 8 */\ntypedef int __assert_real_pcre_size_divisible_8[(sizeof(REAL_PCRE) % 8) == 0 ? 1 : -1];\n\n/* Needed in pcretest to access some fields in the real_pcre* structures\n * directly. They're unified for 8/16/32 bits since the structs only differ\n * after these fields; if that ever changes, need to fork those defines into\n * 8/16 and 32 bit versions. */\n#define REAL_PCRE_MAGIC(re)     (((REAL_PCRE*)re)->magic_number)\n#define REAL_PCRE_SIZE(re)      (((REAL_PCRE*)re)->size)\n#define REAL_PCRE_OPTIONS(re)   (((REAL_PCRE*)re)->options)\n#define REAL_PCRE_FLAGS(re)     (((REAL_PCRE*)re)->flags)\n\n/* The format of the block used to store data from pcre_study(). The same\nremark (see NOTE above) about extending this structure applies. */\n\ntypedef struct pcre_study_data {\n  pcre_uint32 size;               /* Total that was malloced */\n  pcre_uint32 flags;              /* Private flags */\n  pcre_uint8 start_bits[32];      /* Starting char bits */\n  pcre_uint32 minlength;          /* Minimum subject length */\n} pcre_study_data;\n\n/* Structure for building a chain of open capturing subpatterns during\ncompiling, so that instructions to close them can be compiled when (*ACCEPT) is\nencountered. This is also used to identify subpatterns that contain recursive\nback references to themselves, so that they can be made atomic. */\n\ntypedef struct open_capitem {\n  struct open_capitem *next;    /* Chain link */\n  pcre_uint16 number;           /* Capture number */\n  pcre_uint16 flag;             /* Set TRUE if recursive back ref */\n} open_capitem;\n\n/* Structure for building a list of named groups during the first pass of\ncompiling. */\n\ntypedef struct named_group {\n  const pcre_uchar  *name;          /* Points to the name in the pattern */\n  int                length;        /* Length of the name */\n  pcre_uint32        number;        /* Group number */\n} named_group;\n\n/* Structure for passing \"static\" information around between the functions\ndoing the compiling, so that they are thread-safe. */\n\ntypedef struct compile_data {\n  const pcre_uint8 *lcc;            /* Points to lower casing table */\n  const pcre_uint8 *fcc;            /* Points to case-flipping table */\n  const pcre_uint8 *cbits;          /* Points to character type table */\n  const pcre_uint8 *ctypes;         /* Points to table of type maps */\n  const pcre_uchar *start_workspace;/* The start of working space */\n  const pcre_uchar *start_code;     /* The start of the compiled code */\n  const pcre_uchar *start_pattern;  /* The start of the pattern */\n  const pcre_uchar *end_pattern;    /* The end of the pattern */\n  pcre_uchar *hwm;                  /* High watermark of workspace */\n  open_capitem *open_caps;          /* Chain of open capture items */\n  named_group *named_groups;        /* Points to vector in pre-compile */\n  pcre_uchar *name_table;           /* The name/number table */\n  int  names_found;                 /* Number of entries so far */\n  int  name_entry_size;             /* Size of each entry */\n  int  named_group_list_size;       /* Number of entries in the list */\n  int  workspace_size;              /* Size of workspace */\n  unsigned int bracount;            /* Count of capturing parens as we compile */\n  int  final_bracount;              /* Saved value after first pass */\n  int  max_lookbehind;              /* Maximum lookbehind (characters) */\n  int  top_backref;                 /* Maximum back reference */\n  unsigned int backref_map;         /* Bitmap of low back refs */\n  unsigned int namedrefcount;       /* Number of backreferences by name */\n  int  parens_depth;                /* Depth of nested parentheses */\n  int  assert_depth;                /* Depth of nested assertions */\n  pcre_uint32 external_options;     /* External (initial) options */\n  pcre_uint32 external_flags;       /* External flag bits to be set */\n  int  req_varyopt;                 /* \"After variable item\" flag for reqbyte */\n  BOOL had_accept;                  /* (*ACCEPT) encountered */\n  BOOL had_pruneorskip;             /* (*PRUNE) or (*SKIP) encountered */\n  BOOL check_lookbehind;            /* Lookbehinds need later checking */\n  BOOL dupnames;                    /* Duplicate names exist */\n  BOOL dupgroups;                   /* Duplicate groups exist: (?| found */\n  BOOL iscondassert;                /* Next assert is a condition */\n  int  nltype;                      /* Newline type */\n  int  nllen;                       /* Newline string length */\n  pcre_uchar nl[4];                 /* Newline string when fixed length */\n} compile_data;\n\n/* Structure for maintaining a chain of pointers to the currently incomplete\nbranches, for testing for left recursion while compiling. */\n\ntypedef struct branch_chain {\n  struct branch_chain *outer;\n  pcre_uchar *current_branch;\n} branch_chain;\n\n/* Structure for mutual recursion detection. */\n\ntypedef struct recurse_check {\n  struct recurse_check *prev;\n  const pcre_uchar *group;\n} recurse_check;\n\n/* Structure for items in a linked list that represents an explicit recursive\ncall within the pattern; used by pcre_exec(). */\n\ntypedef struct recursion_info {\n  struct recursion_info *prevrec; /* Previous recursion record (or NULL) */\n  unsigned int group_num;         /* Number of group that was called */\n  int *offset_save;               /* Pointer to start of saved offsets */\n  int saved_max;                  /* Number of saved offsets */\n  int saved_capture_last;         /* Last capture number */\n  PCRE_PUCHAR subject_position;   /* Position at start of recursion */\n} recursion_info;\n\n/* A similar structure for pcre_dfa_exec(). */\n\ntypedef struct dfa_recursion_info {\n  struct dfa_recursion_info *prevrec;\n  int group_num;\n  PCRE_PUCHAR subject_position;\n} dfa_recursion_info;\n\n/* Structure for building a chain of data for holding the values of the subject\npointer at the start of each subpattern, so as to detect when an empty string\nhas been matched by a subpattern - to break infinite loops; used by\npcre_exec(). */\n\ntypedef struct eptrblock {\n  struct eptrblock *epb_prev;\n  PCRE_PUCHAR epb_saved_eptr;\n} eptrblock;\n\n\n/* Structure for passing \"static\" information around between the functions\ndoing traditional NFA matching, so that they are thread-safe. */\n\ntypedef struct match_data {\n  unsigned long int match_call_count;      /* As it says */\n  unsigned long int match_limit;           /* As it says */\n  unsigned long int match_limit_recursion; /* As it says */\n  int   *offset_vector;           /* Offset vector */\n  int    offset_end;              /* One past the end */\n  int    offset_max;              /* The maximum usable for return data */\n  int    nltype;                  /* Newline type */\n  int    nllen;                   /* Newline string length */\n  int    name_count;              /* Number of names in name table */\n  int    name_entry_size;         /* Size of entry in names table */\n  unsigned int skip_arg_count;    /* For counting SKIP_ARGs */\n  unsigned int ignore_skip_arg;   /* For re-run when SKIP arg name not found */\n  pcre_uchar *name_table;         /* Table of names */\n  pcre_uchar nl[4];               /* Newline string when fixed */\n  const  pcre_uint8 *lcc;         /* Points to lower casing table */\n  const  pcre_uint8 *fcc;         /* Points to case-flipping table */\n  const  pcre_uint8 *ctypes;      /* Points to table of type maps */\n  BOOL   notbol;                  /* NOTBOL flag */\n  BOOL   noteol;                  /* NOTEOL flag */\n  BOOL   utf;                     /* UTF-8 / UTF-16 flag */\n  BOOL   jscript_compat;          /* JAVASCRIPT_COMPAT flag */\n  BOOL   use_ucp;                 /* PCRE_UCP flag */\n  BOOL   endonly;                 /* Dollar not before final \\n */\n  BOOL   notempty;                /* Empty string match not wanted */\n  BOOL   notempty_atstart;        /* Empty string match at start not wanted */\n  BOOL   hitend;                  /* Hit the end of the subject at some point */\n  BOOL   bsr_anycrlf;             /* \\R is just any CRLF, not full Unicode */\n  BOOL   hasthen;                 /* Pattern contains (*THEN) */\n  const  pcre_uchar *start_code;  /* For use when recursing */\n  PCRE_PUCHAR start_subject;      /* Start of the subject string */\n  PCRE_PUCHAR end_subject;        /* End of the subject string */\n  PCRE_PUCHAR start_match_ptr;    /* Start of matched string */\n  PCRE_PUCHAR end_match_ptr;      /* Subject position at end match */\n  PCRE_PUCHAR start_used_ptr;     /* Earliest consulted character */\n  int    partial;                 /* PARTIAL options */\n  int    end_offset_top;          /* Highwater mark at end of match */\n  pcre_int32 capture_last;        /* Most recent capture number + overflow flag */\n  int    start_offset;            /* The start offset value */\n  int    match_function_type;     /* Set for certain special calls of MATCH() */\n  eptrblock *eptrchain;           /* Chain of eptrblocks for tail recursions */\n  int    eptrn;                   /* Next free eptrblock */\n  recursion_info *recursive;      /* Linked list of recursion data */\n  void  *callout_data;            /* To pass back to callouts */\n  const  pcre_uchar *mark;        /* Mark pointer to pass back on success */\n  const  pcre_uchar *nomatch_mark;/* Mark pointer to pass back on failure */\n  const  pcre_uchar *once_target; /* Where to back up to for atomic groups */\n#ifdef NO_RECURSE\n  void  *match_frames_base;       /* For remembering malloc'd frames */\n#endif\n} match_data;\n\n/* A similar structure is used for the same purpose by the DFA matching\nfunctions. */\n\ntypedef struct dfa_match_data {\n  const pcre_uchar *start_code;     /* Start of the compiled pattern */\n  const pcre_uchar *start_subject ; /* Start of the subject string */\n  const pcre_uchar *end_subject;    /* End of subject string */\n  const pcre_uchar *start_used_ptr; /* Earliest consulted character */\n  const pcre_uint8 *tables;         /* Character tables */\n  int   start_offset;               /* The start offset value */\n  int   moptions;                   /* Match options */\n  int   poptions;                   /* Pattern options */\n  int   nltype;                     /* Newline type */\n  int   nllen;                      /* Newline string length */\n  pcre_uchar nl[4];                 /* Newline string when fixed */\n  void *callout_data;               /* To pass back to callouts */\n  dfa_recursion_info *recursive;    /* Linked list of recursion data */\n} dfa_match_data;\n\n/* Bit definitions for entries in the pcre_ctypes table. */\n\n#define ctype_space   0x01\n#define ctype_letter  0x02\n#define ctype_digit   0x04\n#define ctype_xdigit  0x08\n#define ctype_word    0x10   /* alphanumeric or '_' */\n#define ctype_meta    0x80   /* regexp meta char or zero (end pattern) */\n\n/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set\nof bits for a class map. Some classes are built by combining these tables. */\n\n#define cbit_space     0      /* [:space:] or \\s */\n#define cbit_xdigit   32      /* [:xdigit:] */\n#define cbit_digit    64      /* [:digit:] or \\d */\n#define cbit_upper    96      /* [:upper:] */\n#define cbit_lower   128      /* [:lower:] */\n#define cbit_word    160      /* [:word:] or \\w */\n#define cbit_graph   192      /* [:graph:] */\n#define cbit_print   224      /* [:print:] */\n#define cbit_punct   256      /* [:punct:] */\n#define cbit_cntrl   288      /* [:cntrl:] */\n#define cbit_length  320      /* Length of the cbits table */\n\n/* Offsets of the various tables from the base tables pointer, and\ntotal length. */\n\n#define lcc_offset      0\n#define fcc_offset    256\n#define cbits_offset  512\n#define ctypes_offset (cbits_offset + cbit_length)\n#define tables_length (ctypes_offset + 256)\n\n/* Internal function and data prefixes. */\n\n#if defined COMPILE_PCRE8\n#ifndef PUBL\n#define PUBL(name) pcre_##name\n#endif\n#ifndef PRIV\n#define PRIV(name) _pcre_##name\n#endif\n#elif defined COMPILE_PCRE16\n#ifndef PUBL\n#define PUBL(name) pcre16_##name\n#endif\n#ifndef PRIV\n#define PRIV(name) _pcre16_##name\n#endif\n#elif defined COMPILE_PCRE32\n#ifndef PUBL\n#define PUBL(name) pcre32_##name\n#endif\n#ifndef PRIV\n#define PRIV(name) _pcre32_##name\n#endif\n#else\n#error Unsupported compiling mode\n#endif /* COMPILE_PCRE[8|16|32] */\n\n/* Layout of the UCP type table that translates property names into types and\ncodes. Each entry used to point directly to a name, but to reduce the number of\nrelocations in shared libraries, it now has an offset into a single string\ninstead. */\n\ntypedef struct {\n  pcre_uint16 name_offset;\n  pcre_uint16 type;\n  pcre_uint16 value;\n} ucp_type_table;\n\n\n/* Internal shared data tables. These are tables that are used by more than one\nof the exported public functions. They have to be \"external\" in the C sense,\nbut are not part of the PCRE public API. The data for these tables is in the\npcre_tables.c module. */\n\n#ifdef COMPILE_PCRE8\nextern const int            PRIV(utf8_table1)[];\nextern const int            PRIV(utf8_table1_size);\nextern const int            PRIV(utf8_table2)[];\nextern const int            PRIV(utf8_table3)[];\nextern const pcre_uint8     PRIV(utf8_table4)[];\n#endif /* COMPILE_PCRE8 */\n\nextern const char           PRIV(utt_names)[];\nextern const ucp_type_table PRIV(utt)[];\nextern const int            PRIV(utt_size);\n\nextern const pcre_uint8     PRIV(OP_lengths)[];\nextern const pcre_uint8     PRIV(default_tables)[];\n\nextern const pcre_uint32    PRIV(hspace_list)[];\nextern const pcre_uint32    PRIV(vspace_list)[];\n\n\n/* Internal shared functions. These are functions that are used by more than\none of the exported public functions. They have to be \"external\" in the C\nsense, but are not part of the PCRE public API. */\n\n/* String comparison functions. */\n#if defined COMPILE_PCRE8\n\n#define STRCMP_UC_UC(str1, str2) \\\n  strcmp((char *)(str1), (char *)(str2))\n#define STRCMP_UC_C8(str1, str2) \\\n  strcmp((char *)(str1), (str2))\n#define STRNCMP_UC_UC(str1, str2, num) \\\n  strncmp((char *)(str1), (char *)(str2), (num))\n#define STRNCMP_UC_C8(str1, str2, num) \\\n  strncmp((char *)(str1), (str2), (num))\n#define STRLEN_UC(str) strlen((const char *)str)\n\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n\nextern int               PRIV(strcmp_uc_uc)(const pcre_uchar *,\n                           const pcre_uchar *);\nextern int               PRIV(strcmp_uc_c8)(const pcre_uchar *,\n                           const char *);\nextern int               PRIV(strncmp_uc_uc)(const pcre_uchar *,\n                           const pcre_uchar *, unsigned int num);\nextern int               PRIV(strncmp_uc_c8)(const pcre_uchar *,\n                           const char *, unsigned int num);\nextern unsigned int      PRIV(strlen_uc)(const pcre_uchar *str);\n\n#define STRCMP_UC_UC(str1, str2) \\\n  PRIV(strcmp_uc_uc)((str1), (str2))\n#define STRCMP_UC_C8(str1, str2) \\\n  PRIV(strcmp_uc_c8)((str1), (str2))\n#define STRNCMP_UC_UC(str1, str2, num) \\\n  PRIV(strncmp_uc_uc)((str1), (str2), (num))\n#define STRNCMP_UC_C8(str1, str2, num) \\\n  PRIV(strncmp_uc_c8)((str1), (str2), (num))\n#define STRLEN_UC(str) PRIV(strlen_uc)(str)\n\n#endif /* COMPILE_PCRE[8|16|32] */\n\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\n\n#define STRCMP_UC_UC_TEST(str1, str2) STRCMP_UC_UC(str1, str2)\n#define STRCMP_UC_C8_TEST(str1, str2) STRCMP_UC_C8(str1, str2)\n\n#elif defined COMPILE_PCRE32\n\nextern int               PRIV(strcmp_uc_uc_utf)(const pcre_uchar *,\n                           const pcre_uchar *);\nextern int               PRIV(strcmp_uc_c8_utf)(const pcre_uchar *,\n                           const char *);\n\n#define STRCMP_UC_UC_TEST(str1, str2) \\\n  (utf ? PRIV(strcmp_uc_uc_utf)((str1), (str2)) : PRIV(strcmp_uc_uc)((str1), (str2)))\n#define STRCMP_UC_C8_TEST(str1, str2) \\\n  (utf ? PRIV(strcmp_uc_c8_utf)((str1), (str2)) : PRIV(strcmp_uc_c8)((str1), (str2)))\n\n#endif /* COMPILE_PCRE[8|16|32] */\n\nextern const pcre_uchar *PRIV(find_bracket)(const pcre_uchar *, BOOL, int);\nextern BOOL              PRIV(is_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,\n                           int *, BOOL);\nextern unsigned int      PRIV(ord2utf)(pcre_uint32, pcre_uchar *);\nextern int               PRIV(valid_utf)(PCRE_PUCHAR, int, int *);\nextern BOOL              PRIV(was_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,\n                           int *, BOOL);\nextern BOOL              PRIV(xclass)(pcre_uint32, const pcre_uchar *, BOOL);\n\n#ifdef SUPPORT_JIT\nextern void              PRIV(jit_compile)(const REAL_PCRE *,\n                           PUBL(extra) *, int);\nextern int               PRIV(jit_exec)(const PUBL(extra) *,\n                           const pcre_uchar *, int, int, int, int *, int);\nextern void              PRIV(jit_free)(void *);\nextern int               PRIV(jit_get_size)(void *);\nextern const char*       PRIV(jit_get_target)(void);\n#endif\n\n/* Unicode character database (UCD) */\n\ntypedef struct {\n  pcre_uint8 script;     /* ucp_Arabic, etc. */\n  pcre_uint8 chartype;   /* ucp_Cc, etc. (general categories) */\n  pcre_uint8 gbprop;     /* ucp_gbControl, etc. (grapheme break property) */\n  pcre_uint8 caseset;    /* offset to multichar other cases or zero */\n  pcre_int32 other_case; /* offset to other case, or zero if none */\n} ucd_record;\n\nextern const pcre_uint32 PRIV(ucd_caseless_sets)[];\nextern const ucd_record  PRIV(ucd_records)[];\nextern const pcre_uint8  PRIV(ucd_stage1)[];\nextern const pcre_uint16 PRIV(ucd_stage2)[];\nextern const pcre_uint32 PRIV(ucp_gentype)[];\nextern const pcre_uint32 PRIV(ucp_gbtable)[];\n#ifdef COMPILE_PCRE32\nextern const ucd_record  PRIV(dummy_ucd_record)[];\n#endif\n#ifdef SUPPORT_JIT\nextern const int         PRIV(ucp_typerange)[];\n#endif\n\n#ifdef SUPPORT_UCP\n/* UCD access macros */\n\n#define UCD_BLOCK_SIZE 128\n#define REAL_GET_UCD(ch) (PRIV(ucd_records) + \\\n        PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \\\n        UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE])\n\n#ifdef COMPILE_PCRE32\n#define GET_UCD(ch) ((ch > 0x10ffff)? PRIV(dummy_ucd_record) : REAL_GET_UCD(ch))\n#else\n#define GET_UCD(ch) REAL_GET_UCD(ch)\n#endif\n\n#define UCD_CHARTYPE(ch)    GET_UCD(ch)->chartype\n#define UCD_SCRIPT(ch)      GET_UCD(ch)->script\n#define UCD_CATEGORY(ch)    PRIV(ucp_gentype)[UCD_CHARTYPE(ch)]\n#define UCD_GRAPHBREAK(ch)  GET_UCD(ch)->gbprop\n#define UCD_CASESET(ch)     GET_UCD(ch)->caseset\n#define UCD_OTHERCASE(ch)   ((pcre_uint32)((int)ch + (int)(GET_UCD(ch)->other_case)))\n\n#endif /* SUPPORT_UCP */\n\n#endif\n\n/* End of pcre_internal.h */\n"
  },
  {
    "path": "src/pcre/pcre_jit_compile.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n  The machine code generator part (this module) was written by Zoltan Herczeg\n                      Copyright (c) 2010-2013\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#if defined SUPPORT_JIT\n\n/* All-in-one: Since we use the JIT compiler only from here,\nwe just include it. This way we don't need to touch the build\nsystem files. */\n\n#define SLJIT_MALLOC(size, allocator_data) (PUBL(malloc))(size)\n#define SLJIT_FREE(ptr, allocator_data) (PUBL(free))(ptr)\n#define SLJIT_CONFIG_AUTO 1\n#define SLJIT_CONFIG_STATIC 1\n#define SLJIT_VERBOSE 0\n#define SLJIT_DEBUG 0\n\n#include \"sljit/sljitLir.c\"\n\n#if defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED\n#error Unsupported architecture\n#endif\n\n/* Defines for debugging purposes. */\n\n/* 1 - Use unoptimized capturing brackets.\n   2 - Enable capture_last_ptr (includes option 1). */\n/* #define DEBUG_FORCE_UNOPTIMIZED_CBRAS 2 */\n\n/* 1 - Always have a control head. */\n/* #define DEBUG_FORCE_CONTROL_HEAD 1 */\n\n/* Allocate memory for the regex stack on the real machine stack.\nFast, but limited size. */\n#define MACHINE_STACK_SIZE 32768\n\n/* Growth rate for stack allocated by the OS. Should be the multiply\nof page size. */\n#define STACK_GROWTH_RATE 8192\n\n/* Enable to check that the allocation could destroy temporaries. */\n#if defined SLJIT_DEBUG && SLJIT_DEBUG\n#define DESTROY_REGISTERS 1\n#endif\n\n/*\nShort summary about the backtracking mechanism empolyed by the jit code generator:\n\nThe code generator follows the recursive nature of the PERL compatible regular\nexpressions. The basic blocks of regular expressions are condition checkers\nwhose execute different commands depending on the result of the condition check.\nThe relationship between the operators can be horizontal (concatenation) and\nvertical (sub-expression) (See struct backtrack_common for more details).\n\n  'ab' - 'a' and 'b' regexps are concatenated\n  'a+' - 'a' is the sub-expression of the '+' operator\n\nThe condition checkers are boolean (true/false) checkers. Machine code is generated\nfor the checker itself and for the actions depending on the result of the checker.\nThe 'true' case is called as the matching path (expected path), and the other is called as\nthe 'backtrack' path. Branch instructions are expesive for all CPUs, so we avoid taken\nbranches on the matching path.\n\n Greedy star operator (*) :\n   Matching path: match happens.\n   Backtrack path: match failed.\n Non-greedy star operator (*?) :\n   Matching path: no need to perform a match.\n   Backtrack path: match is required.\n\nThe following example shows how the code generated for a capturing bracket\nwith two alternatives. Let A, B, C, D are arbirary regular expressions, and\nwe have the following regular expression:\n\n   A(B|C)D\n\nThe generated code will be the following:\n\n A matching path\n '(' matching path (pushing arguments to the stack)\n B matching path\n ')' matching path (pushing arguments to the stack)\n D matching path\n return with successful match\n\n D backtrack path\n ')' backtrack path (If we arrived from \"C\" jump to the backtrack of \"C\")\n B backtrack path\n C expected path\n jump to D matching path\n C backtrack path\n A backtrack path\n\n Notice, that the order of backtrack code paths are the opposite of the fast\n code paths. In this way the topmost value on the stack is always belong\n to the current backtrack code path. The backtrack path must check\n whether there is a next alternative. If so, it needs to jump back to\n the matching path eventually. Otherwise it needs to clear out its own stack\n frame and continue the execution on the backtrack code paths.\n*/\n\n/*\nSaved stack frames:\n\nAtomic blocks and asserts require reloading the values of private data\nwhen the backtrack mechanism performed. Because of OP_RECURSE, the data\nare not necessarly known in compile time, thus we need a dynamic restore\nmechanism.\n\nThe stack frames are stored in a chain list, and have the following format:\n([ capturing bracket offset ][ start value ][ end value ])+ ... [ 0 ] [ previous head ]\n\nThus we can restore the private data to a particular point in the stack.\n*/\n\ntypedef struct jit_arguments {\n  /* Pointers first. */\n  struct sljit_stack *stack;\n  const pcre_uchar *str;\n  const pcre_uchar *begin;\n  const pcre_uchar *end;\n  int *offsets;\n  pcre_uchar *mark_ptr;\n  void *callout_data;\n  /* Everything else after. */\n  sljit_u32 limit_match;\n  int real_offset_count;\n  int offset_count;\n  sljit_u8 notbol;\n  sljit_u8 noteol;\n  sljit_u8 notempty;\n  sljit_u8 notempty_atstart;\n} jit_arguments;\n\ntypedef struct executable_functions {\n  void *executable_funcs[JIT_NUMBER_OF_COMPILE_MODES];\n  void *read_only_data_heads[JIT_NUMBER_OF_COMPILE_MODES];\n  sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES];\n  PUBL(jit_callback) callback;\n  void *userdata;\n  sljit_u32 top_bracket;\n  sljit_u32 limit_match;\n} executable_functions;\n\ntypedef struct jump_list {\n  struct sljit_jump *jump;\n  struct jump_list *next;\n} jump_list;\n\ntypedef struct stub_list {\n  struct sljit_jump *start;\n  struct sljit_label *quit;\n  struct stub_list *next;\n} stub_list;\n\ntypedef struct label_addr_list {\n  struct sljit_label *label;\n  sljit_uw *update_addr;\n  struct label_addr_list *next;\n} label_addr_list;\n\nenum frame_types {\n  no_frame = -1,\n  no_stack = -2\n};\n\nenum control_types {\n  type_mark = 0,\n  type_then_trap = 1\n};\n\ntypedef int (SLJIT_FUNC *jit_function)(jit_arguments *args);\n\n/* The following structure is the key data type for the recursive\ncode generator. It is allocated by compile_matchingpath, and contains\nthe arguments for compile_backtrackingpath. Must be the first member\nof its descendants. */\ntypedef struct backtrack_common {\n  /* Concatenation stack. */\n  struct backtrack_common *prev;\n  jump_list *nextbacktracks;\n  /* Internal stack (for component operators). */\n  struct backtrack_common *top;\n  jump_list *topbacktracks;\n  /* Opcode pointer. */\n  pcre_uchar *cc;\n} backtrack_common;\n\ntypedef struct assert_backtrack {\n  backtrack_common common;\n  jump_list *condfailed;\n  /* Less than 0 if a frame is not needed. */\n  int framesize;\n  /* Points to our private memory word on the stack. */\n  int private_data_ptr;\n  /* For iterators. */\n  struct sljit_label *matchingpath;\n} assert_backtrack;\n\ntypedef struct bracket_backtrack {\n  backtrack_common common;\n  /* Where to coninue if an alternative is successfully matched. */\n  struct sljit_label *alternative_matchingpath;\n  /* For rmin and rmax iterators. */\n  struct sljit_label *recursive_matchingpath;\n  /* For greedy ? operator. */\n  struct sljit_label *zero_matchingpath;\n  /* Contains the branches of a failed condition. */\n  union {\n    /* Both for OP_COND, OP_SCOND. */\n    jump_list *condfailed;\n    assert_backtrack *assert;\n    /* For OP_ONCE. Less than 0 if not needed. */\n    int framesize;\n  } u;\n  /* Points to our private memory word on the stack. */\n  int private_data_ptr;\n} bracket_backtrack;\n\ntypedef struct bracketpos_backtrack {\n  backtrack_common common;\n  /* Points to our private memory word on the stack. */\n  int private_data_ptr;\n  /* Reverting stack is needed. */\n  int framesize;\n  /* Allocated stack size. */\n  int stacksize;\n} bracketpos_backtrack;\n\ntypedef struct braminzero_backtrack {\n  backtrack_common common;\n  struct sljit_label *matchingpath;\n} braminzero_backtrack;\n\ntypedef struct char_iterator_backtrack {\n  backtrack_common common;\n  /* Next iteration. */\n  struct sljit_label *matchingpath;\n  union {\n    jump_list *backtracks;\n    struct {\n      unsigned int othercasebit;\n      pcre_uchar chr;\n      BOOL enabled;\n    } charpos;\n  } u;\n} char_iterator_backtrack;\n\ntypedef struct ref_iterator_backtrack {\n  backtrack_common common;\n  /* Next iteration. */\n  struct sljit_label *matchingpath;\n} ref_iterator_backtrack;\n\ntypedef struct recurse_entry {\n  struct recurse_entry *next;\n  /* Contains the function entry. */\n  struct sljit_label *entry;\n  /* Collects the calls until the function is not created. */\n  jump_list *calls;\n  /* Points to the starting opcode. */\n  sljit_sw start;\n} recurse_entry;\n\ntypedef struct recurse_backtrack {\n  backtrack_common common;\n  BOOL inlined_pattern;\n} recurse_backtrack;\n\n#define OP_THEN_TRAP OP_TABLE_LENGTH\n\ntypedef struct then_trap_backtrack {\n  backtrack_common common;\n  /* If then_trap is not NULL, this structure contains the real\n  then_trap for the backtracking path. */\n  struct then_trap_backtrack *then_trap;\n  /* Points to the starting opcode. */\n  sljit_sw start;\n  /* Exit point for the then opcodes of this alternative. */\n  jump_list *quit;\n  /* Frame size of the current alternative. */\n  int framesize;\n} then_trap_backtrack;\n\n#define MAX_RANGE_SIZE 4\n\ntypedef struct compiler_common {\n  /* The sljit ceneric compiler. */\n  struct sljit_compiler *compiler;\n  /* First byte code. */\n  pcre_uchar *start;\n  /* Maps private data offset to each opcode. */\n  sljit_s32 *private_data_ptrs;\n  /* Chain list of read-only data ptrs. */\n  void *read_only_data_head;\n  /* Tells whether the capturing bracket is optimized. */\n  sljit_u8 *optimized_cbracket;\n  /* Tells whether the starting offset is a target of then. */\n  sljit_u8 *then_offsets;\n  /* Current position where a THEN must jump. */\n  then_trap_backtrack *then_trap;\n  /* Starting offset of private data for capturing brackets. */\n  sljit_s32 cbra_ptr;\n  /* Output vector starting point. Must be divisible by 2. */\n  sljit_s32 ovector_start;\n  /* Points to the starting character of the current match. */\n  sljit_s32 start_ptr;\n  /* Last known position of the requested byte. */\n  sljit_s32 req_char_ptr;\n  /* Head of the last recursion. */\n  sljit_s32 recursive_head_ptr;\n  /* First inspected character for partial matching.\n     (Needed for avoiding zero length partial matches.) */\n  sljit_s32 start_used_ptr;\n  /* Starting pointer for partial soft matches. */\n  sljit_s32 hit_start;\n  /* Pointer of the match end position. */\n  sljit_s32 match_end_ptr;\n  /* Points to the marked string. */\n  sljit_s32 mark_ptr;\n  /* Recursive control verb management chain. */\n  sljit_s32 control_head_ptr;\n  /* Points to the last matched capture block index. */\n  sljit_s32 capture_last_ptr;\n  /* Fast forward skipping byte code pointer. */\n  pcre_uchar *fast_forward_bc_ptr;\n  /* Locals used by fast fail optimization. */\n  sljit_s32 fast_fail_start_ptr;\n  sljit_s32 fast_fail_end_ptr;\n\n  /* Flipped and lower case tables. */\n  const sljit_u8 *fcc;\n  sljit_sw lcc;\n  /* Mode can be PCRE_STUDY_JIT_COMPILE and others. */\n  int mode;\n  /* TRUE, when minlength is greater than 0. */\n  BOOL might_be_empty;\n  /* \\K is found in the pattern. */\n  BOOL has_set_som;\n  /* (*SKIP:arg) is found in the pattern. */\n  BOOL has_skip_arg;\n  /* (*THEN) is found in the pattern. */\n  BOOL has_then;\n  /* (*SKIP) or (*SKIP:arg) is found in lookbehind assertion. */\n  BOOL has_skip_in_assert_back;\n  /* Currently in recurse or negative assert. */\n  BOOL local_exit;\n  /* Currently in a positive assert. */\n  BOOL positive_assert;\n  /* Newline control. */\n  int nltype;\n  sljit_u32 nlmax;\n  sljit_u32 nlmin;\n  int newline;\n  int bsr_nltype;\n  sljit_u32 bsr_nlmax;\n  sljit_u32 bsr_nlmin;\n  /* Dollar endonly. */\n  int endonly;\n  /* Tables. */\n  sljit_sw ctypes;\n  /* Named capturing brackets. */\n  pcre_uchar *name_table;\n  sljit_sw name_count;\n  sljit_sw name_entry_size;\n\n  /* Labels and jump lists. */\n  struct sljit_label *partialmatchlabel;\n  struct sljit_label *quit_label;\n  struct sljit_label *forced_quit_label;\n  struct sljit_label *accept_label;\n  struct sljit_label *ff_newline_shortcut;\n  stub_list *stubs;\n  label_addr_list *label_addrs;\n  recurse_entry *entries;\n  recurse_entry *currententry;\n  jump_list *partialmatch;\n  jump_list *quit;\n  jump_list *positive_assert_quit;\n  jump_list *forced_quit;\n  jump_list *accept;\n  jump_list *calllimit;\n  jump_list *stackalloc;\n  jump_list *revertframes;\n  jump_list *wordboundary;\n  jump_list *anynewline;\n  jump_list *hspace;\n  jump_list *vspace;\n  jump_list *casefulcmp;\n  jump_list *caselesscmp;\n  jump_list *reset_match;\n  BOOL jscript_compat;\n#ifdef SUPPORT_UTF\n  BOOL utf;\n#ifdef SUPPORT_UCP\n  BOOL use_ucp;\n  jump_list *getucd;\n#endif\n#ifdef COMPILE_PCRE8\n  jump_list *utfreadchar;\n  jump_list *utfreadchar16;\n  jump_list *utfreadtype8;\n#endif\n#endif /* SUPPORT_UTF */\n} compiler_common;\n\n/* For byte_sequence_compare. */\n\ntypedef struct compare_context {\n  int length;\n  int sourcereg;\n#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED\n  int ucharptr;\n  union {\n    sljit_s32 asint;\n    sljit_u16 asushort;\n#if defined COMPILE_PCRE8\n    sljit_u8 asbyte;\n    sljit_u8 asuchars[4];\n#elif defined COMPILE_PCRE16\n    sljit_u16 asuchars[2];\n#elif defined COMPILE_PCRE32\n    sljit_u32 asuchars[1];\n#endif\n  } c;\n  union {\n    sljit_s32 asint;\n    sljit_u16 asushort;\n#if defined COMPILE_PCRE8\n    sljit_u8 asbyte;\n    sljit_u8 asuchars[4];\n#elif defined COMPILE_PCRE16\n    sljit_u16 asuchars[2];\n#elif defined COMPILE_PCRE32\n    sljit_u32 asuchars[1];\n#endif\n  } oc;\n#endif\n} compare_context;\n\n/* Undefine sljit macros. */\n#undef CMP\n\n/* Used for accessing the elements of the stack. */\n#define STACK(i)      ((i) * (int)sizeof(sljit_sw))\n\n#ifdef SLJIT_PREF_SHIFT_REG\n#if SLJIT_PREF_SHIFT_REG == SLJIT_R2\n/* Nothing. */\n#elif SLJIT_PREF_SHIFT_REG == SLJIT_R3\n#define SHIFT_REG_IS_R3\n#else\n#error \"Unsupported shift register\"\n#endif\n#endif\n\n#define TMP1          SLJIT_R0\n#ifdef SHIFT_REG_IS_R3\n#define TMP2          SLJIT_R3\n#define TMP3          SLJIT_R2\n#else\n#define TMP2          SLJIT_R2\n#define TMP3          SLJIT_R3\n#endif\n#define STR_PTR       SLJIT_S0\n#define STR_END       SLJIT_S1\n#define STACK_TOP     SLJIT_R1\n#define STACK_LIMIT   SLJIT_S2\n#define COUNT_MATCH   SLJIT_S3\n#define ARGUMENTS     SLJIT_S4\n#define RETURN_ADDR   SLJIT_R4\n\n/* Local space layout. */\n/* These two locals can be used by the current opcode. */\n#define LOCALS0          (0 * sizeof(sljit_sw))\n#define LOCALS1          (1 * sizeof(sljit_sw))\n/* Two local variables for possessive quantifiers (char1 cannot use them). */\n#define POSSESSIVE0      (2 * sizeof(sljit_sw))\n#define POSSESSIVE1      (3 * sizeof(sljit_sw))\n/* Max limit of recursions. */\n#define LIMIT_MATCH      (4 * sizeof(sljit_sw))\n/* The output vector is stored on the stack, and contains pointers\nto characters. The vector data is divided into two groups: the first\ngroup contains the start / end character pointers, and the second is\nthe start pointers when the end of the capturing group has not yet reached. */\n#define OVECTOR_START    (common->ovector_start)\n#define OVECTOR(i)       (OVECTOR_START + (i) * (sljit_sw)sizeof(sljit_sw))\n#define OVECTOR_PRIV(i)  (common->cbra_ptr + (i) * (sljit_sw)sizeof(sljit_sw))\n#define PRIVATE_DATA(cc) (common->private_data_ptrs[(cc) - common->start])\n\n#if defined COMPILE_PCRE8\n#define MOV_UCHAR  SLJIT_MOV_U8\n#elif defined COMPILE_PCRE16\n#define MOV_UCHAR  SLJIT_MOV_U16\n#elif defined COMPILE_PCRE32\n#define MOV_UCHAR  SLJIT_MOV_U32\n#else\n#error Unsupported compiling mode\n#endif\n\n/* Shortcuts. */\n#define DEFINE_COMPILER \\\n  struct sljit_compiler *compiler = common->compiler\n#define OP1(op, dst, dstw, src, srcw) \\\n  sljit_emit_op1(compiler, (op), (dst), (dstw), (src), (srcw))\n#define OP2(op, dst, dstw, src1, src1w, src2, src2w) \\\n  sljit_emit_op2(compiler, (op), (dst), (dstw), (src1), (src1w), (src2), (src2w))\n#define LABEL() \\\n  sljit_emit_label(compiler)\n#define JUMP(type) \\\n  sljit_emit_jump(compiler, (type))\n#define JUMPTO(type, label) \\\n  sljit_set_label(sljit_emit_jump(compiler, (type)), (label))\n#define JUMPHERE(jump) \\\n  sljit_set_label((jump), sljit_emit_label(compiler))\n#define SET_LABEL(jump, label) \\\n  sljit_set_label((jump), (label))\n#define CMP(type, src1, src1w, src2, src2w) \\\n  sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w))\n#define CMPTO(type, src1, src1w, src2, src2w, label) \\\n  sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label))\n#define OP_FLAGS(op, dst, dstw, type) \\\n  sljit_emit_op_flags(compiler, (op), (dst), (dstw), (type))\n#define GET_LOCAL_BASE(dst, dstw, offset) \\\n  sljit_get_local_base(compiler, (dst), (dstw), (offset))\n\n#define READ_CHAR_MAX 0x7fffffff\n\n#define INVALID_UTF_CHAR 888\n\nstatic pcre_uchar *bracketend(pcre_uchar *cc)\n{\nSLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));\ndo cc += GET(cc, 1); while (*cc == OP_ALT);\nSLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS);\ncc += 1 + LINK_SIZE;\nreturn cc;\n}\n\nstatic int no_alternatives(pcre_uchar *cc)\n{\nint count = 0;\nSLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND));\ndo\n  {\n  cc += GET(cc, 1);\n  count++;\n  }\nwhile (*cc == OP_ALT);\nSLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS);\nreturn count;\n}\n\n/* Functions whose might need modification for all new supported opcodes:\n next_opcode\n check_opcode_types\n set_private_data_ptrs\n get_framesize\n init_frame\n get_private_data_copy_length\n copy_private_data\n compile_matchingpath\n compile_backtrackingpath\n*/\n\nstatic pcre_uchar *next_opcode(compiler_common *common, pcre_uchar *cc)\n{\nSLJIT_UNUSED_ARG(common);\nswitch(*cc)\n  {\n  case OP_SOD:\n  case OP_SOM:\n  case OP_SET_SOM:\n  case OP_NOT_WORD_BOUNDARY:\n  case OP_WORD_BOUNDARY:\n  case OP_NOT_DIGIT:\n  case OP_DIGIT:\n  case OP_NOT_WHITESPACE:\n  case OP_WHITESPACE:\n  case OP_NOT_WORDCHAR:\n  case OP_WORDCHAR:\n  case OP_ANY:\n  case OP_ALLANY:\n  case OP_NOTPROP:\n  case OP_PROP:\n  case OP_ANYNL:\n  case OP_NOT_HSPACE:\n  case OP_HSPACE:\n  case OP_NOT_VSPACE:\n  case OP_VSPACE:\n  case OP_EXTUNI:\n  case OP_EODN:\n  case OP_EOD:\n  case OP_CIRC:\n  case OP_CIRCM:\n  case OP_DOLL:\n  case OP_DOLLM:\n  case OP_CRSTAR:\n  case OP_CRMINSTAR:\n  case OP_CRPLUS:\n  case OP_CRMINPLUS:\n  case OP_CRQUERY:\n  case OP_CRMINQUERY:\n  case OP_CRRANGE:\n  case OP_CRMINRANGE:\n  case OP_CRPOSSTAR:\n  case OP_CRPOSPLUS:\n  case OP_CRPOSQUERY:\n  case OP_CRPOSRANGE:\n  case OP_CLASS:\n  case OP_NCLASS:\n  case OP_REF:\n  case OP_REFI:\n  case OP_DNREF:\n  case OP_DNREFI:\n  case OP_RECURSE:\n  case OP_CALLOUT:\n  case OP_ALT:\n  case OP_KET:\n  case OP_KETRMAX:\n  case OP_KETRMIN:\n  case OP_KETRPOS:\n  case OP_REVERSE:\n  case OP_ASSERT:\n  case OP_ASSERT_NOT:\n  case OP_ASSERTBACK:\n  case OP_ASSERTBACK_NOT:\n  case OP_ONCE:\n  case OP_ONCE_NC:\n  case OP_BRA:\n  case OP_BRAPOS:\n  case OP_CBRA:\n  case OP_CBRAPOS:\n  case OP_COND:\n  case OP_SBRA:\n  case OP_SBRAPOS:\n  case OP_SCBRA:\n  case OP_SCBRAPOS:\n  case OP_SCOND:\n  case OP_CREF:\n  case OP_DNCREF:\n  case OP_RREF:\n  case OP_DNRREF:\n  case OP_DEF:\n  case OP_BRAZERO:\n  case OP_BRAMINZERO:\n  case OP_BRAPOSZERO:\n  case OP_PRUNE:\n  case OP_SKIP:\n  case OP_THEN:\n  case OP_COMMIT:\n  case OP_FAIL:\n  case OP_ACCEPT:\n  case OP_ASSERT_ACCEPT:\n  case OP_CLOSE:\n  case OP_SKIPZERO:\n  return cc + PRIV(OP_lengths)[*cc];\n\n  case OP_CHAR:\n  case OP_CHARI:\n  case OP_NOT:\n  case OP_NOTI:\n  case OP_STAR:\n  case OP_MINSTAR:\n  case OP_PLUS:\n  case OP_MINPLUS:\n  case OP_QUERY:\n  case OP_MINQUERY:\n  case OP_UPTO:\n  case OP_MINUPTO:\n  case OP_EXACT:\n  case OP_POSSTAR:\n  case OP_POSPLUS:\n  case OP_POSQUERY:\n  case OP_POSUPTO:\n  case OP_STARI:\n  case OP_MINSTARI:\n  case OP_PLUSI:\n  case OP_MINPLUSI:\n  case OP_QUERYI:\n  case OP_MINQUERYI:\n  case OP_UPTOI:\n  case OP_MINUPTOI:\n  case OP_EXACTI:\n  case OP_POSSTARI:\n  case OP_POSPLUSI:\n  case OP_POSQUERYI:\n  case OP_POSUPTOI:\n  case OP_NOTSTAR:\n  case OP_NOTMINSTAR:\n  case OP_NOTPLUS:\n  case OP_NOTMINPLUS:\n  case OP_NOTQUERY:\n  case OP_NOTMINQUERY:\n  case OP_NOTUPTO:\n  case OP_NOTMINUPTO:\n  case OP_NOTEXACT:\n  case OP_NOTPOSSTAR:\n  case OP_NOTPOSPLUS:\n  case OP_NOTPOSQUERY:\n  case OP_NOTPOSUPTO:\n  case OP_NOTSTARI:\n  case OP_NOTMINSTARI:\n  case OP_NOTPLUSI:\n  case OP_NOTMINPLUSI:\n  case OP_NOTQUERYI:\n  case OP_NOTMINQUERYI:\n  case OP_NOTUPTOI:\n  case OP_NOTMINUPTOI:\n  case OP_NOTEXACTI:\n  case OP_NOTPOSSTARI:\n  case OP_NOTPOSPLUSI:\n  case OP_NOTPOSQUERYI:\n  case OP_NOTPOSUPTOI:\n  cc += PRIV(OP_lengths)[*cc];\n#ifdef SUPPORT_UTF\n  if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n  return cc;\n\n  /* Special cases. */\n  case OP_TYPESTAR:\n  case OP_TYPEMINSTAR:\n  case OP_TYPEPLUS:\n  case OP_TYPEMINPLUS:\n  case OP_TYPEQUERY:\n  case OP_TYPEMINQUERY:\n  case OP_TYPEUPTO:\n  case OP_TYPEMINUPTO:\n  case OP_TYPEEXACT:\n  case OP_TYPEPOSSTAR:\n  case OP_TYPEPOSPLUS:\n  case OP_TYPEPOSQUERY:\n  case OP_TYPEPOSUPTO:\n  return cc + PRIV(OP_lengths)[*cc] - 1;\n\n  case OP_ANYBYTE:\n#ifdef SUPPORT_UTF\n  if (common->utf) return NULL;\n#endif\n  return cc + 1;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  case OP_XCLASS:\n  return cc + GET(cc, 1);\n#endif\n\n  case OP_MARK:\n  case OP_PRUNE_ARG:\n  case OP_SKIP_ARG:\n  case OP_THEN_ARG:\n  return cc + 1 + 2 + cc[1];\n\n  default:\n  /* All opcodes are supported now! */\n  SLJIT_UNREACHABLE();\n  return NULL;\n  }\n}\n\nstatic BOOL check_opcode_types(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend)\n{\nint count;\npcre_uchar *slot;\npcre_uchar *assert_back_end = cc - 1;\n\n/* Calculate important variables (like stack size) and checks whether all opcodes are supported. */\nwhile (cc < ccend)\n  {\n  switch(*cc)\n    {\n    case OP_SET_SOM:\n    common->has_set_som = TRUE;\n    common->might_be_empty = TRUE;\n    cc += 1;\n    break;\n\n    case OP_REF:\n    case OP_REFI:\n    common->optimized_cbracket[GET2(cc, 1)] = 0;\n    cc += 1 + IMM2_SIZE;\n    break;\n\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] = 0;\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_COND:\n    case OP_SCOND:\n    /* Only AUTO_CALLOUT can insert this opcode. We do\n       not intend to support this case. */\n    if (cc[1 + LINK_SIZE] == OP_CALLOUT)\n      return FALSE;\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CREF:\n    common->optimized_cbracket[GET2(cc, 1)] = 0;\n    cc += 1 + IMM2_SIZE;\n    break;\n\n    case OP_DNREF:\n    case OP_DNREFI:\n    case OP_DNCREF:\n    count = GET2(cc, 1 + IMM2_SIZE);\n    slot = common->name_table + GET2(cc, 1) * common->name_entry_size;\n    while (count-- > 0)\n      {\n      common->optimized_cbracket[GET2(slot, 0)] = 0;\n      slot += common->name_entry_size;\n      }\n    cc += 1 + 2 * IMM2_SIZE;\n    break;\n\n    case OP_RECURSE:\n    /* Set its value only once. */\n    if (common->recursive_head_ptr == 0)\n      {\n      common->recursive_head_ptr = common->ovector_start;\n      common->ovector_start += sizeof(sljit_sw);\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CALLOUT:\n    if (common->capture_last_ptr == 0)\n      {\n      common->capture_last_ptr = common->ovector_start;\n      common->ovector_start += sizeof(sljit_sw);\n      }\n    cc += 2 + 2 * LINK_SIZE;\n    break;\n\n    case OP_ASSERTBACK:\n    slot = bracketend(cc);\n    if (slot > assert_back_end)\n      assert_back_end = slot;\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_THEN_ARG:\n    common->has_then = TRUE;\n    common->control_head_ptr = 1;\n    /* Fall through. */\n\n    case OP_PRUNE_ARG:\n    case OP_MARK:\n    if (common->mark_ptr == 0)\n      {\n      common->mark_ptr = common->ovector_start;\n      common->ovector_start += sizeof(sljit_sw);\n      }\n    cc += 1 + 2 + cc[1];\n    break;\n\n    case OP_THEN:\n    common->has_then = TRUE;\n    common->control_head_ptr = 1;\n    cc += 1;\n    break;\n\n    case OP_SKIP:\n    if (cc < assert_back_end)\n      common->has_skip_in_assert_back = TRUE;\n    cc += 1;\n    break;\n\n    case OP_SKIP_ARG:\n    common->control_head_ptr = 1;\n    common->has_skip_arg = TRUE;\n    if (cc < assert_back_end)\n      common->has_skip_in_assert_back = TRUE;\n    cc += 1 + 2 + cc[1];\n    break;\n\n    default:\n    cc = next_opcode(common, cc);\n    if (cc == NULL)\n      return FALSE;\n    break;\n    }\n  }\nreturn TRUE;\n}\n\nstatic BOOL is_accelerated_repeat(pcre_uchar *cc)\n{\nswitch(*cc)\n  {\n  case OP_TYPESTAR:\n  case OP_TYPEMINSTAR:\n  case OP_TYPEPLUS:\n  case OP_TYPEMINPLUS:\n  case OP_TYPEPOSSTAR:\n  case OP_TYPEPOSPLUS:\n  return (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI);\n\n  case OP_STAR:\n  case OP_MINSTAR:\n  case OP_PLUS:\n  case OP_MINPLUS:\n  case OP_POSSTAR:\n  case OP_POSPLUS:\n\n  case OP_STARI:\n  case OP_MINSTARI:\n  case OP_PLUSI:\n  case OP_MINPLUSI:\n  case OP_POSSTARI:\n  case OP_POSPLUSI:\n\n  case OP_NOTSTAR:\n  case OP_NOTMINSTAR:\n  case OP_NOTPLUS:\n  case OP_NOTMINPLUS:\n  case OP_NOTPOSSTAR:\n  case OP_NOTPOSPLUS:\n\n  case OP_NOTSTARI:\n  case OP_NOTMINSTARI:\n  case OP_NOTPLUSI:\n  case OP_NOTMINPLUSI:\n  case OP_NOTPOSSTARI:\n  case OP_NOTPOSPLUSI:\n  return TRUE;\n\n  case OP_CLASS:\n  case OP_NCLASS:\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  case OP_XCLASS:\n  cc += (*cc == OP_XCLASS) ? GET(cc, 1) : (int)(1 + (32 / sizeof(pcre_uchar)));\n#else\n  cc += (1 + (32 / sizeof(pcre_uchar)));\n#endif\n\n  switch(*cc)\n    {\n    case OP_CRSTAR:\n    case OP_CRMINSTAR:\n    case OP_CRPLUS:\n    case OP_CRMINPLUS:\n    case OP_CRPOSSTAR:\n    case OP_CRPOSPLUS:\n    return TRUE;\n    }\n  break;\n  }\nreturn FALSE;\n}\n\nstatic SLJIT_INLINE BOOL detect_fast_forward_skip(compiler_common *common, int *private_data_start)\n{\npcre_uchar *cc = common->start;\npcre_uchar *end;\n\n/* Skip not repeated brackets. */\nwhile (TRUE)\n  {\n  switch(*cc)\n    {\n    case OP_SOD:\n    case OP_SOM:\n    case OP_SET_SOM:\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    case OP_EODN:\n    case OP_EOD:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_DOLL:\n    case OP_DOLLM:\n    /* Zero width assertions. */\n    cc++;\n    continue;\n    }\n\n  if (*cc != OP_BRA && *cc != OP_CBRA)\n    break;\n\n  end = cc + GET(cc, 1);\n  if (*end != OP_KET || PRIVATE_DATA(end) != 0)\n    return FALSE;\n  if (*cc == OP_CBRA)\n    {\n    if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)\n      return FALSE;\n    cc += IMM2_SIZE;\n    }\n  cc += 1 + LINK_SIZE;\n  }\n\nif (is_accelerated_repeat(cc))\n  {\n  common->fast_forward_bc_ptr = cc;\n  common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;\n  *private_data_start += sizeof(sljit_sw);\n  return TRUE;\n  }\nreturn FALSE;\n}\n\nstatic SLJIT_INLINE void detect_fast_fail(compiler_common *common, pcre_uchar *cc, int *private_data_start, sljit_s32 depth)\n{\n  pcre_uchar *next_alt;\n\n  SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA);\n\n  if (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)\n    return;\n\n  next_alt = bracketend(cc) - (1 + LINK_SIZE);\n  if (*next_alt != OP_KET || PRIVATE_DATA(next_alt) != 0)\n    return;\n\n  do\n    {\n    next_alt = cc + GET(cc, 1);\n\n    cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0);\n\n    while (TRUE)\n      {\n      switch(*cc)\n        {\n        case OP_SOD:\n        case OP_SOM:\n        case OP_SET_SOM:\n        case OP_NOT_WORD_BOUNDARY:\n        case OP_WORD_BOUNDARY:\n        case OP_EODN:\n        case OP_EOD:\n        case OP_CIRC:\n        case OP_CIRCM:\n        case OP_DOLL:\n        case OP_DOLLM:\n        /* Zero width assertions. */\n        cc++;\n        continue;\n        }\n      break;\n      }\n\n    if (depth > 0 && (*cc == OP_BRA || *cc == OP_CBRA))\n      detect_fast_fail(common, cc, private_data_start, depth - 1);\n\n    if (is_accelerated_repeat(cc))\n      {\n      common->private_data_ptrs[(cc + 1) - common->start] = *private_data_start;\n\n      if (common->fast_fail_start_ptr == 0)\n        common->fast_fail_start_ptr = *private_data_start;\n\n      *private_data_start += sizeof(sljit_sw);\n      common->fast_fail_end_ptr = *private_data_start;\n\n      if (*private_data_start > SLJIT_MAX_LOCAL_SIZE)\n        return;\n      }\n\n    cc = next_alt;\n    }\n  while (*cc == OP_ALT);\n}\n\nstatic int get_class_iterator_size(pcre_uchar *cc)\n{\nsljit_u32 min;\nsljit_u32 max;\nswitch(*cc)\n  {\n  case OP_CRSTAR:\n  case OP_CRPLUS:\n  return 2;\n\n  case OP_CRMINSTAR:\n  case OP_CRMINPLUS:\n  case OP_CRQUERY:\n  case OP_CRMINQUERY:\n  return 1;\n\n  case OP_CRRANGE:\n  case OP_CRMINRANGE:\n  min = GET2(cc, 1);\n  max = GET2(cc, 1 + IMM2_SIZE);\n  if (max == 0)\n    return (*cc == OP_CRRANGE) ? 2 : 1;\n  max -= min;\n  if (max > 2)\n    max = 2;\n  return max;\n\n  default:\n  return 0;\n  }\n}\n\nstatic BOOL detect_repeat(compiler_common *common, pcre_uchar *begin)\n{\npcre_uchar *end = bracketend(begin);\npcre_uchar *next;\npcre_uchar *next_end;\npcre_uchar *max_end;\npcre_uchar type;\nsljit_sw length = end - begin;\nint min, max, i;\n\n/* Detect fixed iterations first. */\nif (end[-(1 + LINK_SIZE)] != OP_KET)\n  return FALSE;\n\n/* Already detected repeat. */\nif (common->private_data_ptrs[end - common->start - LINK_SIZE] != 0)\n  return TRUE;\n\nnext = end;\nmin = 1;\nwhile (1)\n  {\n  if (*next != *begin)\n    break;\n  next_end = bracketend(next);\n  if (next_end - next != length || memcmp(begin, next, IN_UCHARS(length)) != 0)\n    break;\n  next = next_end;\n  min++;\n  }\n\nif (min == 2)\n  return FALSE;\n\nmax = 0;\nmax_end = next;\nif (*next == OP_BRAZERO || *next == OP_BRAMINZERO)\n  {\n  type = *next;\n  while (1)\n    {\n    if (next[0] != type || next[1] != OP_BRA || next[2 + LINK_SIZE] != *begin)\n      break;\n    next_end = bracketend(next + 2 + LINK_SIZE);\n    if (next_end - next != (length + 2 + LINK_SIZE) || memcmp(begin, next + 2 + LINK_SIZE, IN_UCHARS(length)) != 0)\n      break;\n    next = next_end;\n    max++;\n    }\n\n  if (next[0] == type && next[1] == *begin && max >= 1)\n    {\n    next_end = bracketend(next + 1);\n    if (next_end - next == (length + 1) && memcmp(begin, next + 1, IN_UCHARS(length)) == 0)\n      {\n      for (i = 0; i < max; i++, next_end += 1 + LINK_SIZE)\n        if (*next_end != OP_KET)\n          break;\n\n      if (i == max)\n        {\n        common->private_data_ptrs[max_end - common->start - LINK_SIZE] = next_end - max_end;\n        common->private_data_ptrs[max_end - common->start - LINK_SIZE + 1] = (type == OP_BRAZERO) ? OP_UPTO : OP_MINUPTO;\n        /* +2 the original and the last. */\n        common->private_data_ptrs[max_end - common->start - LINK_SIZE + 2] = max + 2;\n        if (min == 1)\n          return TRUE;\n        min--;\n        max_end -= (1 + LINK_SIZE) + GET(max_end, -LINK_SIZE);\n        }\n      }\n    }\n  }\n\nif (min >= 3)\n  {\n  common->private_data_ptrs[end - common->start - LINK_SIZE] = max_end - end;\n  common->private_data_ptrs[end - common->start - LINK_SIZE + 1] = OP_EXACT;\n  common->private_data_ptrs[end - common->start - LINK_SIZE + 2] = min;\n  return TRUE;\n  }\n\nreturn FALSE;\n}\n\n#define CASE_ITERATOR_PRIVATE_DATA_1 \\\n    case OP_MINSTAR: \\\n    case OP_MINPLUS: \\\n    case OP_QUERY: \\\n    case OP_MINQUERY: \\\n    case OP_MINSTARI: \\\n    case OP_MINPLUSI: \\\n    case OP_QUERYI: \\\n    case OP_MINQUERYI: \\\n    case OP_NOTMINSTAR: \\\n    case OP_NOTMINPLUS: \\\n    case OP_NOTQUERY: \\\n    case OP_NOTMINQUERY: \\\n    case OP_NOTMINSTARI: \\\n    case OP_NOTMINPLUSI: \\\n    case OP_NOTQUERYI: \\\n    case OP_NOTMINQUERYI:\n\n#define CASE_ITERATOR_PRIVATE_DATA_2A \\\n    case OP_STAR: \\\n    case OP_PLUS: \\\n    case OP_STARI: \\\n    case OP_PLUSI: \\\n    case OP_NOTSTAR: \\\n    case OP_NOTPLUS: \\\n    case OP_NOTSTARI: \\\n    case OP_NOTPLUSI:\n\n#define CASE_ITERATOR_PRIVATE_DATA_2B \\\n    case OP_UPTO: \\\n    case OP_MINUPTO: \\\n    case OP_UPTOI: \\\n    case OP_MINUPTOI: \\\n    case OP_NOTUPTO: \\\n    case OP_NOTMINUPTO: \\\n    case OP_NOTUPTOI: \\\n    case OP_NOTMINUPTOI:\n\n#define CASE_ITERATOR_TYPE_PRIVATE_DATA_1 \\\n    case OP_TYPEMINSTAR: \\\n    case OP_TYPEMINPLUS: \\\n    case OP_TYPEQUERY: \\\n    case OP_TYPEMINQUERY:\n\n#define CASE_ITERATOR_TYPE_PRIVATE_DATA_2A \\\n    case OP_TYPESTAR: \\\n    case OP_TYPEPLUS:\n\n#define CASE_ITERATOR_TYPE_PRIVATE_DATA_2B \\\n    case OP_TYPEUPTO: \\\n    case OP_TYPEMINUPTO:\n\nstatic void set_private_data_ptrs(compiler_common *common, int *private_data_start, pcre_uchar *ccend)\n{\npcre_uchar *cc = common->start;\npcre_uchar *alternative;\npcre_uchar *end = NULL;\nint private_data_ptr = *private_data_start;\nint space, size, bracketlen;\nBOOL repeat_check = TRUE;\n\nwhile (cc < ccend)\n  {\n  space = 0;\n  size = 0;\n  bracketlen = 0;\n  if (private_data_ptr > SLJIT_MAX_LOCAL_SIZE)\n    break;\n\n  if (repeat_check && (*cc == OP_ONCE || *cc == OP_ONCE_NC || *cc == OP_BRA || *cc == OP_CBRA || *cc == OP_COND))\n    {\n    if (detect_repeat(common, cc))\n      {\n      /* These brackets are converted to repeats, so no global\n      based single character repeat is allowed. */\n      if (cc >= end)\n        end = bracketend(cc);\n      }\n    }\n  repeat_check = TRUE;\n\n  switch(*cc)\n    {\n    case OP_KET:\n    if (common->private_data_ptrs[cc + 1 - common->start] != 0)\n      {\n      common->private_data_ptrs[cc - common->start] = private_data_ptr;\n      private_data_ptr += sizeof(sljit_sw);\n      cc += common->private_data_ptrs[cc + 1 - common->start];\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRAPOS:\n    case OP_SBRA:\n    case OP_SBRAPOS:\n    case OP_SCOND:\n    common->private_data_ptrs[cc - common->start] = private_data_ptr;\n    private_data_ptr += sizeof(sljit_sw);\n    bracketlen = 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    common->private_data_ptrs[cc - common->start] = private_data_ptr;\n    private_data_ptr += sizeof(sljit_sw);\n    bracketlen = 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_COND:\n    /* Might be a hidden SCOND. */\n    alternative = cc + GET(cc, 1);\n    if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN)\n      {\n      common->private_data_ptrs[cc - common->start] = private_data_ptr;\n      private_data_ptr += sizeof(sljit_sw);\n      }\n    bracketlen = 1 + LINK_SIZE;\n    break;\n\n    case OP_BRA:\n    bracketlen = 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRA:\n    case OP_SCBRA:\n    bracketlen = 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_BRAZERO:\n    case OP_BRAMINZERO:\n    case OP_BRAPOSZERO:\n    repeat_check = FALSE;\n    size = 1;\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_1\n    space = 1;\n    size = -2;\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2A\n    space = 2;\n    size = -2;\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2B\n    space = 2;\n    size = -(2 + IMM2_SIZE);\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_1\n    space = 1;\n    size = 1;\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_2A\n    if (cc[1] != OP_ANYNL && cc[1] != OP_EXTUNI)\n      space = 2;\n    size = 1;\n    break;\n\n    case OP_TYPEUPTO:\n    if (cc[1 + IMM2_SIZE] != OP_ANYNL && cc[1 + IMM2_SIZE] != OP_EXTUNI)\n      space = 2;\n    size = 1 + IMM2_SIZE;\n    break;\n\n    case OP_TYPEMINUPTO:\n    space = 2;\n    size = 1 + IMM2_SIZE;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    space = get_class_iterator_size(cc + size);\n    size = 1 + 32 / sizeof(pcre_uchar);\n    break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n    space = get_class_iterator_size(cc + size);\n    size = GET(cc, 1);\n    break;\n#endif\n\n    default:\n    cc = next_opcode(common, cc);\n    SLJIT_ASSERT(cc != NULL);\n    break;\n    }\n\n  /* Character iterators, which are not inside a repeated bracket,\n     gets a private slot instead of allocating it on the stack. */\n  if (space > 0 && cc >= end)\n    {\n    common->private_data_ptrs[cc - common->start] = private_data_ptr;\n    private_data_ptr += sizeof(sljit_sw) * space;\n    }\n\n  if (size != 0)\n    {\n    if (size < 0)\n      {\n      cc += -size;\n#ifdef SUPPORT_UTF\n      if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n      }\n    else\n      cc += size;\n    }\n\n  if (bracketlen > 0)\n    {\n    if (cc >= end)\n      {\n      end = bracketend(cc);\n      if (end[-1 - LINK_SIZE] == OP_KET)\n        end = NULL;\n      }\n    cc += bracketlen;\n    }\n  }\n*private_data_start = private_data_ptr;\n}\n\n/* Returns with a frame_types (always < 0) if no need for frame. */\nstatic int get_framesize(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL recursive, BOOL *needs_control_head)\n{\nint length = 0;\nint possessive = 0;\nBOOL stack_restore = FALSE;\nBOOL setsom_found = recursive;\nBOOL setmark_found = recursive;\n/* The last capture is a local variable even for recursions. */\nBOOL capture_last_found = FALSE;\n\n#if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD\nSLJIT_ASSERT(common->control_head_ptr != 0);\n*needs_control_head = TRUE;\n#else\n*needs_control_head = FALSE;\n#endif\n\nif (ccend == NULL)\n  {\n  ccend = bracketend(cc) - (1 + LINK_SIZE);\n  if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS))\n    {\n    possessive = length = (common->capture_last_ptr != 0) ? 5 : 3;\n    /* This is correct regardless of common->capture_last_ptr. */\n    capture_last_found = TRUE;\n    }\n  cc = next_opcode(common, cc);\n  }\n\nSLJIT_ASSERT(cc != NULL);\nwhile (cc < ccend)\n  switch(*cc)\n    {\n    case OP_SET_SOM:\n    SLJIT_ASSERT(common->has_set_som);\n    stack_restore = TRUE;\n    if (!setsom_found)\n      {\n      length += 2;\n      setsom_found = TRUE;\n      }\n    cc += 1;\n    break;\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_THEN_ARG:\n    SLJIT_ASSERT(common->mark_ptr != 0);\n    stack_restore = TRUE;\n    if (!setmark_found)\n      {\n      length += 2;\n      setmark_found = TRUE;\n      }\n    if (common->control_head_ptr != 0)\n      *needs_control_head = TRUE;\n    cc += 1 + 2 + cc[1];\n    break;\n\n    case OP_RECURSE:\n    stack_restore = TRUE;\n    if (common->has_set_som && !setsom_found)\n      {\n      length += 2;\n      setsom_found = TRUE;\n      }\n    if (common->mark_ptr != 0 && !setmark_found)\n      {\n      length += 2;\n      setmark_found = TRUE;\n      }\n    if (common->capture_last_ptr != 0 && !capture_last_found)\n      {\n      length += 2;\n      capture_last_found = TRUE;\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRA:\n    case OP_CBRAPOS:\n    case OP_SCBRA:\n    case OP_SCBRAPOS:\n    stack_restore = TRUE;\n    if (common->capture_last_ptr != 0 && !capture_last_found)\n      {\n      length += 2;\n      capture_last_found = TRUE;\n      }\n    length += 3;\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_THEN:\n    stack_restore = TRUE;\n    if (common->control_head_ptr != 0)\n      *needs_control_head = TRUE;\n    cc ++;\n    break;\n\n    default:\n    stack_restore = TRUE;\n    /* Fall through. */\n\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    case OP_NOT_DIGIT:\n    case OP_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_WORDCHAR:\n    case OP_ANY:\n    case OP_ALLANY:\n    case OP_ANYBYTE:\n    case OP_NOTPROP:\n    case OP_PROP:\n    case OP_ANYNL:\n    case OP_NOT_HSPACE:\n    case OP_HSPACE:\n    case OP_NOT_VSPACE:\n    case OP_VSPACE:\n    case OP_EXTUNI:\n    case OP_EODN:\n    case OP_EOD:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_DOLL:\n    case OP_DOLLM:\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n\n    case OP_TYPEEXACT:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEPOSQUERY:\n    case OP_TYPEPOSUPTO:\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    case OP_XCLASS:\n    case OP_CALLOUT:\n\n    cc = next_opcode(common, cc);\n    SLJIT_ASSERT(cc != NULL);\n    break;\n    }\n\n/* Possessive quantifiers can use a special case. */\nif (SLJIT_UNLIKELY(possessive == length))\n  return stack_restore ? no_frame : no_stack;\n\nif (length > 0)\n  return length + 1;\nreturn stack_restore ? no_frame : no_stack;\n}\n\nstatic void init_frame(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, int stackpos, int stacktop, BOOL recursive)\n{\nDEFINE_COMPILER;\nBOOL setsom_found = recursive;\nBOOL setmark_found = recursive;\n/* The last capture is a local variable even for recursions. */\nBOOL capture_last_found = FALSE;\nint offset;\n\n/* >= 1 + shortest item size (2) */\nSLJIT_UNUSED_ARG(stacktop);\nSLJIT_ASSERT(stackpos >= stacktop + 2);\n\nstackpos = STACK(stackpos);\nif (ccend == NULL)\n  {\n  ccend = bracketend(cc) - (1 + LINK_SIZE);\n  if (recursive || (*cc != OP_CBRAPOS && *cc != OP_SCBRAPOS))\n    cc = next_opcode(common, cc);\n  }\n\nSLJIT_ASSERT(cc != NULL);\nwhile (cc < ccend)\n  switch(*cc)\n    {\n    case OP_SET_SOM:\n    SLJIT_ASSERT(common->has_set_som);\n    if (!setsom_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0));\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      setsom_found = TRUE;\n      }\n    cc += 1;\n    break;\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_THEN_ARG:\n    SLJIT_ASSERT(common->mark_ptr != 0);\n    if (!setmark_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr);\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      setmark_found = TRUE;\n      }\n    cc += 1 + 2 + cc[1];\n    break;\n\n    case OP_RECURSE:\n    if (common->has_set_som && !setsom_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -OVECTOR(0));\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      setsom_found = TRUE;\n      }\n    if (common->mark_ptr != 0 && !setmark_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->mark_ptr);\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      setmark_found = TRUE;\n      }\n    if (common->capture_last_ptr != 0 && !capture_last_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr);\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      capture_last_found = TRUE;\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRA:\n    case OP_CBRAPOS:\n    case OP_SCBRA:\n    case OP_SCBRAPOS:\n    if (common->capture_last_ptr != 0 && !capture_last_found)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, -common->capture_last_ptr);\n      stackpos -= (int)sizeof(sljit_sw);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n      stackpos -= (int)sizeof(sljit_sw);\n      capture_last_found = TRUE;\n      }\n    offset = (GET2(cc, 1 + LINK_SIZE)) << 1;\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset));\n    stackpos -= (int)sizeof(sljit_sw);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0);\n    stackpos -= (int)sizeof(sljit_sw);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP2, 0);\n    stackpos -= (int)sizeof(sljit_sw);\n\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    default:\n    cc = next_opcode(common, cc);\n    SLJIT_ASSERT(cc != NULL);\n    break;\n    }\n\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, 0);\nSLJIT_ASSERT(stackpos == STACK(stacktop));\n}\n\nstatic SLJIT_INLINE int get_private_data_copy_length(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, BOOL needs_control_head)\n{\nint private_data_length = needs_control_head ? 3 : 2;\nint size;\npcre_uchar *alternative;\n/* Calculate the sum of the private machine words. */\nwhile (cc < ccend)\n  {\n  size = 0;\n  switch(*cc)\n    {\n    case OP_KET:\n    if (PRIVATE_DATA(cc) != 0)\n      {\n      private_data_length++;\n      SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0);\n      cc += PRIVATE_DATA(cc + 1);\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRAPOS:\n    case OP_SBRA:\n    case OP_SBRAPOS:\n    case OP_SCOND:\n    private_data_length++;\n    SLJIT_ASSERT(PRIVATE_DATA(cc) != 0);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRA:\n    case OP_SCBRA:\n    if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)\n      private_data_length++;\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    private_data_length += 2;\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_COND:\n    /* Might be a hidden SCOND. */\n    alternative = cc + GET(cc, 1);\n    if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN)\n      private_data_length++;\n    cc += 1 + LINK_SIZE;\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_1\n    if (PRIVATE_DATA(cc))\n      private_data_length++;\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2A\n    if (PRIVATE_DATA(cc))\n      private_data_length += 2;\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2B\n    if (PRIVATE_DATA(cc))\n      private_data_length += 2;\n    cc += 2 + IMM2_SIZE;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_1\n    if (PRIVATE_DATA(cc))\n      private_data_length++;\n    cc += 1;\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_2A\n    if (PRIVATE_DATA(cc))\n      private_data_length += 2;\n    cc += 1;\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_2B\n    if (PRIVATE_DATA(cc))\n      private_data_length += 2;\n    cc += 1 + IMM2_SIZE;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n    size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar);\n#else\n    size = 1 + 32 / (int)sizeof(pcre_uchar);\n#endif\n    if (PRIVATE_DATA(cc))\n      private_data_length += get_class_iterator_size(cc + size);\n    cc += size;\n    break;\n\n    default:\n    cc = next_opcode(common, cc);\n    SLJIT_ASSERT(cc != NULL);\n    break;\n    }\n  }\nSLJIT_ASSERT(cc == ccend);\nreturn private_data_length;\n}\n\nstatic void copy_private_data(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend,\n  BOOL save, int stackptr, int stacktop, BOOL needs_control_head)\n{\nDEFINE_COMPILER;\nint srcw[2];\nint count, size;\nBOOL tmp1next = TRUE;\nBOOL tmp1empty = TRUE;\nBOOL tmp2empty = TRUE;\npcre_uchar *alternative;\nenum {\n  loop,\n  end\n} status;\n\nstatus = loop;\nstackptr = STACK(stackptr);\nstacktop = STACK(stacktop - 1);\n\nif (!save)\n  {\n  stacktop -= (needs_control_head ? 2 : 1) * sizeof(sljit_sw);\n  if (stackptr < stacktop)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr);\n    stackptr += sizeof(sljit_sw);\n    tmp1empty = FALSE;\n    }\n  if (stackptr < stacktop)\n    {\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr);\n    stackptr += sizeof(sljit_sw);\n    tmp2empty = FALSE;\n    }\n  /* The tmp1next must be TRUE in either way. */\n  }\n\nSLJIT_ASSERT(common->recursive_head_ptr != 0);\n\ndo\n  {\n  count = 0;\n  if (cc >= ccend)\n    {\n    if (!save)\n      break;\n\n    count = 1;\n    srcw[0] = common->recursive_head_ptr;\n    if (needs_control_head)\n      {\n      SLJIT_ASSERT(common->control_head_ptr != 0);\n      count = 2;\n      srcw[0] = common->control_head_ptr;\n      srcw[1] = common->recursive_head_ptr;\n      }\n    status = end;\n    }\n  else switch(*cc)\n    {\n    case OP_KET:\n    if (PRIVATE_DATA(cc) != 0)\n      {\n      count = 1;\n      srcw[0] = PRIVATE_DATA(cc);\n      SLJIT_ASSERT(PRIVATE_DATA(cc + 1) != 0);\n      cc += PRIVATE_DATA(cc + 1);\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRAPOS:\n    case OP_SBRA:\n    case OP_SBRAPOS:\n    case OP_SCOND:\n    count = 1;\n    srcw[0] = PRIVATE_DATA(cc);\n    SLJIT_ASSERT(srcw[0] != 0);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    case OP_CBRA:\n    case OP_SCBRA:\n    if (common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)\n      {\n      count = 1;\n      srcw[0] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE));\n      }\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    count = 2;\n    srcw[0] = PRIVATE_DATA(cc);\n    srcw[1] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE));\n    SLJIT_ASSERT(srcw[0] != 0 && srcw[1] != 0);\n    cc += 1 + LINK_SIZE + IMM2_SIZE;\n    break;\n\n    case OP_COND:\n    /* Might be a hidden SCOND. */\n    alternative = cc + GET(cc, 1);\n    if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN)\n      {\n      count = 1;\n      srcw[0] = PRIVATE_DATA(cc);\n      SLJIT_ASSERT(srcw[0] != 0);\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_1\n    if (PRIVATE_DATA(cc))\n      {\n      count = 1;\n      srcw[0] = PRIVATE_DATA(cc);\n      }\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2A\n    if (PRIVATE_DATA(cc))\n      {\n      count = 2;\n      srcw[0] = PRIVATE_DATA(cc);\n      srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw);\n      }\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_PRIVATE_DATA_2B\n    if (PRIVATE_DATA(cc))\n      {\n      count = 2;\n      srcw[0] = PRIVATE_DATA(cc);\n      srcw[1] = PRIVATE_DATA(cc) + sizeof(sljit_sw);\n      }\n    cc += 2 + IMM2_SIZE;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_1\n    if (PRIVATE_DATA(cc))\n      {\n      count = 1;\n      srcw[0] = PRIVATE_DATA(cc);\n      }\n    cc += 1;\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_2A\n    if (PRIVATE_DATA(cc))\n      {\n      count = 2;\n      srcw[0] = PRIVATE_DATA(cc);\n      srcw[1] = srcw[0] + sizeof(sljit_sw);\n      }\n    cc += 1;\n    break;\n\n    CASE_ITERATOR_TYPE_PRIVATE_DATA_2B\n    if (PRIVATE_DATA(cc))\n      {\n      count = 2;\n      srcw[0] = PRIVATE_DATA(cc);\n      srcw[1] = srcw[0] + sizeof(sljit_sw);\n      }\n    cc += 1 + IMM2_SIZE;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n    size = (*cc == OP_XCLASS) ? GET(cc, 1) : 1 + 32 / (int)sizeof(pcre_uchar);\n#else\n    size = 1 + 32 / (int)sizeof(pcre_uchar);\n#endif\n    if (PRIVATE_DATA(cc))\n      switch(get_class_iterator_size(cc + size))\n        {\n        case 1:\n        count = 1;\n        srcw[0] = PRIVATE_DATA(cc);\n        break;\n\n        case 2:\n        count = 2;\n        srcw[0] = PRIVATE_DATA(cc);\n        srcw[1] = srcw[0] + sizeof(sljit_sw);\n        break;\n\n        default:\n        SLJIT_UNREACHABLE();\n        break;\n        }\n    cc += size;\n    break;\n\n    default:\n    cc = next_opcode(common, cc);\n    SLJIT_ASSERT(cc != NULL);\n    break;\n    }\n\n  while (count > 0)\n    {\n    count--;\n    if (save)\n      {\n      if (tmp1next)\n        {\n        if (!tmp1empty)\n          {\n          OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0);\n          stackptr += sizeof(sljit_sw);\n          }\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), srcw[count]);\n        tmp1empty = FALSE;\n        tmp1next = FALSE;\n        }\n      else\n        {\n        if (!tmp2empty)\n          {\n          OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0);\n          stackptr += sizeof(sljit_sw);\n          }\n        OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), srcw[count]);\n        tmp2empty = FALSE;\n        tmp1next = TRUE;\n        }\n      }\n    else\n      {\n      if (tmp1next)\n        {\n        SLJIT_ASSERT(!tmp1empty);\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), srcw[count], TMP1, 0);\n        tmp1empty = stackptr >= stacktop;\n        if (!tmp1empty)\n          {\n          OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr);\n          stackptr += sizeof(sljit_sw);\n          }\n        tmp1next = FALSE;\n        }\n      else\n        {\n        SLJIT_ASSERT(!tmp2empty);\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), srcw[count], TMP2, 0);\n        tmp2empty = stackptr >= stacktop;\n        if (!tmp2empty)\n          {\n          OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr);\n          stackptr += sizeof(sljit_sw);\n          }\n        tmp1next = TRUE;\n        }\n      }\n    }\n  }\nwhile (status != end);\n\nif (save)\n  {\n  if (tmp1next)\n    {\n    if (!tmp1empty)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0);\n      stackptr += sizeof(sljit_sw);\n      }\n    if (!tmp2empty)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0);\n      stackptr += sizeof(sljit_sw);\n      }\n    }\n  else\n    {\n    if (!tmp2empty)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0);\n      stackptr += sizeof(sljit_sw);\n      }\n    if (!tmp1empty)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0);\n      stackptr += sizeof(sljit_sw);\n      }\n    }\n  }\nSLJIT_ASSERT(cc == ccend && stackptr == stacktop && (save || (tmp1empty && tmp2empty)));\n}\n\nstatic SLJIT_INLINE pcre_uchar *set_then_offsets(compiler_common *common, pcre_uchar *cc, sljit_u8 *current_offset)\n{\npcre_uchar *end = bracketend(cc);\nBOOL has_alternatives = cc[GET(cc, 1)] == OP_ALT;\n\n/* Assert captures then. */\nif (*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT)\n  current_offset = NULL;\n/* Conditional block does not. */\nif (*cc == OP_COND || *cc == OP_SCOND)\n  has_alternatives = FALSE;\n\ncc = next_opcode(common, cc);\nif (has_alternatives)\n  current_offset = common->then_offsets + (cc - common->start);\n\nwhile (cc < end)\n  {\n  if ((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND))\n    cc = set_then_offsets(common, cc, current_offset);\n  else\n    {\n    if (*cc == OP_ALT && has_alternatives)\n      current_offset = common->then_offsets + (cc + 1 + LINK_SIZE - common->start);\n    if (*cc >= OP_THEN && *cc <= OP_THEN_ARG && current_offset != NULL)\n      *current_offset = 1;\n    cc = next_opcode(common, cc);\n    }\n  }\n\nreturn end;\n}\n\n#undef CASE_ITERATOR_PRIVATE_DATA_1\n#undef CASE_ITERATOR_PRIVATE_DATA_2A\n#undef CASE_ITERATOR_PRIVATE_DATA_2B\n#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_1\n#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2A\n#undef CASE_ITERATOR_TYPE_PRIVATE_DATA_2B\n\nstatic SLJIT_INLINE BOOL is_powerof2(unsigned int value)\n{\nreturn (value & (value - 1)) == 0;\n}\n\nstatic SLJIT_INLINE void set_jumps(jump_list *list, struct sljit_label *label)\n{\nwhile (list)\n  {\n  /* sljit_set_label is clever enough to do nothing\n  if either the jump or the label is NULL. */\n  SET_LABEL(list->jump, label);\n  list = list->next;\n  }\n}\n\nstatic SLJIT_INLINE void add_jump(struct sljit_compiler *compiler, jump_list **list, struct sljit_jump *jump)\n{\njump_list *list_item = sljit_alloc_memory(compiler, sizeof(jump_list));\nif (list_item)\n  {\n  list_item->next = *list;\n  list_item->jump = jump;\n  *list = list_item;\n  }\n}\n\nstatic void add_stub(compiler_common *common, struct sljit_jump *start)\n{\nDEFINE_COMPILER;\nstub_list *list_item = sljit_alloc_memory(compiler, sizeof(stub_list));\n\nif (list_item)\n  {\n  list_item->start = start;\n  list_item->quit = LABEL();\n  list_item->next = common->stubs;\n  common->stubs = list_item;\n  }\n}\n\nstatic void flush_stubs(compiler_common *common)\n{\nDEFINE_COMPILER;\nstub_list *list_item = common->stubs;\n\nwhile (list_item)\n  {\n  JUMPHERE(list_item->start);\n  add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL));\n  JUMPTO(SLJIT_JUMP, list_item->quit);\n  list_item = list_item->next;\n  }\ncommon->stubs = NULL;\n}\n\nstatic void add_label_addr(compiler_common *common, sljit_uw *update_addr)\n{\nDEFINE_COMPILER;\nlabel_addr_list *label_addr;\n\nlabel_addr = sljit_alloc_memory(compiler, sizeof(label_addr_list));\nif (label_addr == NULL)\n  return;\nlabel_addr->label = LABEL();\nlabel_addr->update_addr = update_addr;\nlabel_addr->next = common->label_addrs;\ncommon->label_addrs = label_addr;\n}\n\nstatic SLJIT_INLINE void count_match(compiler_common *common)\n{\nDEFINE_COMPILER;\n\nOP2(SLJIT_SUB | SLJIT_SET_Z, COUNT_MATCH, 0, COUNT_MATCH, 0, SLJIT_IMM, 1);\nadd_jump(compiler, &common->calllimit, JUMP(SLJIT_ZERO));\n}\n\nstatic SLJIT_INLINE void allocate_stack(compiler_common *common, int size)\n{\n/* May destroy all locals and registers except TMP2. */\nDEFINE_COMPILER;\n\nSLJIT_ASSERT(size > 0);\nOP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));\n#ifdef DESTROY_REGISTERS\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345);\nOP1(SLJIT_MOV, TMP3, 0, TMP1, 0);\nOP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, TMP1, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0);\n#endif\nadd_stub(common, CMP(SLJIT_LESS, STACK_TOP, 0, STACK_LIMIT, 0));\n}\n\nstatic SLJIT_INLINE void free_stack(compiler_common *common, int size)\n{\nDEFINE_COMPILER;\n\nSLJIT_ASSERT(size > 0);\nOP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_sw));\n}\n\nstatic sljit_uw * allocate_read_only_data(compiler_common *common, sljit_uw size)\n{\nDEFINE_COMPILER;\nsljit_uw *result;\n\nif (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n  return NULL;\n\nresult = (sljit_uw *)SLJIT_MALLOC(size + sizeof(sljit_uw), compiler->allocator_data);\nif (SLJIT_UNLIKELY(result == NULL))\n  {\n  sljit_set_compiler_memory_error(compiler);\n  return NULL;\n  }\n\n*(void**)result = common->read_only_data_head;\ncommon->read_only_data_head = (void *)result;\nreturn result + 1;\n}\n\nstatic void free_read_only_data(void *current, void *allocator_data)\n{\nvoid *next;\n\nSLJIT_UNUSED_ARG(allocator_data);\n\nwhile (current != NULL)\n  {\n  next = *(void**)current;\n  SLJIT_FREE(current, allocator_data);\n  current = next;\n  }\n}\n\nstatic SLJIT_INLINE void reset_ovector(compiler_common *common, int length)\n{\nDEFINE_COMPILER;\nstruct sljit_label *loop;\nint i;\n\n/* At this point we can freely use all temporary registers. */\nSLJIT_ASSERT(length > 1);\n/* TMP1 returns with begin - 1. */\nOP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_S0), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, IN_UCHARS(1));\nif (length < 8)\n  {\n  for (i = 1; i < length; i++)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), SLJIT_R0, 0);\n  }\nelse\n  {\n  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == SLJIT_SUCCESS)\n    {\n    GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START);\n    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);\n    loop = LABEL();\n    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw));\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, loop);\n    }\n  else\n    {\n    GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw));\n    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1);\n    loop = LABEL();\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0);\n    OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw));\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, loop);\n    }\n  }\n}\n\nstatic SLJIT_INLINE void reset_fast_fail(compiler_common *common)\n{\nDEFINE_COMPILER;\nsljit_s32 i;\n\nSLJIT_ASSERT(common->fast_fail_start_ptr < common->fast_fail_end_ptr);\n\nOP2(SLJIT_SUB, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nfor (i = common->fast_fail_start_ptr; i < common->fast_fail_end_ptr; i += sizeof(sljit_sw))\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), i, TMP1, 0);\n}\n\nstatic SLJIT_INLINE void do_reset_match(compiler_common *common, int length)\n{\nDEFINE_COMPILER;\nstruct sljit_label *loop;\nint i;\n\nSLJIT_ASSERT(length > 1);\n/* OVECTOR(1) contains the \"string begin - 1\" constant. */\nif (length > 2)\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));\nif (length < 8)\n  {\n  for (i = 2; i < length; i++)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(i), TMP1, 0);\n  }\nelse\n  {\n  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS)\n    {\n    GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw));\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);\n    loop = LABEL();\n    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n    OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, loop);\n    }\n  else\n    {\n    GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw));\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2);\n    loop = LABEL();\n    OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0);\n    OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw));\n    OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, loop);\n    }\n  }\n\nOP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0);\nif (common->mark_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);\nif (common->control_head_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack));\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr);\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end));\n}\n\nstatic sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg)\n{\nwhile (current != NULL)\n  {\n  switch (current[1])\n    {\n    case type_then_trap:\n    break;\n\n    case type_mark:\n    if (STRCMP_UC_UC(skip_arg, (pcre_uchar *)current[2]) == 0)\n      return current[3];\n    break;\n\n    default:\n    SLJIT_UNREACHABLE();\n    break;\n    }\n  SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]);\n  current = (sljit_sw*)current[0];\n  }\nreturn 0;\n}\n\nstatic SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket)\n{\nDEFINE_COMPILER;\nstruct sljit_label *loop;\nstruct sljit_jump *early_quit;\nBOOL has_pre;\n\n/* At this point we can freely use all registers. */\nOP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(1), STR_PTR, 0);\n\nOP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);\nif (common->mark_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);\nOP1(SLJIT_MOV_S32, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offset_count));\nif (common->mark_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0);\nOP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int));\nOP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin));\n\nhas_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS;\nGET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0));\n\n/* Unlikely, but possible */\nearly_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0);\nloop = LABEL();\n\nif (has_pre)\n  sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw));\nelse\n  {\n  OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0);\n  OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw));\n  }\n\nOP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(int));\nOP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0);\n/* Copy the integer value to the output buffer */\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\nOP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\n\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0);\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);\nJUMPTO(SLJIT_NOT_ZERO, loop);\nJUMPHERE(early_quit);\n\n/* Calculate the return value, which is the maximum ovector value. */\nif (topbracket > 1)\n  {\n  if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == SLJIT_SUCCESS)\n    {\n    GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw));\n    OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);\n\n    /* OVECTOR(0) is never equal to SLJIT_S2. */\n    loop = LABEL();\n    sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw)));\n    OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);\n    CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);\n    }\n  else\n    {\n    GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * sizeof(sljit_sw));\n    OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1);\n\n    /* OVECTOR(0) is never equal to SLJIT_S2. */\n    loop = LABEL();\n    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0);\n    OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * (sljit_sw)sizeof(sljit_sw));\n    OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1);\n    CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop);\n    }\n  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0);\n  }\nelse\n  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);\n}\n\nstatic SLJIT_INLINE void return_with_partial_match(compiler_common *common, struct sljit_label *quit)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nSLJIT_COMPILE_ASSERT(STR_END == SLJIT_S1, str_end_must_be_saved_reg2);\nSLJIT_ASSERT(common->start_used_ptr != 0 && common->start_ptr != 0\n  && (common->mode == JIT_PARTIAL_SOFT_COMPILE ? common->hit_start != 0 : common->hit_start == 0));\n\nOP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0);\nOP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_PARTIAL);\nOP1(SLJIT_MOV_S32, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, real_offset_count));\nCMPTO(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 2, quit);\n\n/* Store match begin and end. */\nOP1(SLJIT_MOV, SLJIT_S0, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, begin));\nOP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, offsets));\n\njump = CMP(SLJIT_SIG_LESS, SLJIT_R2, 0, SLJIT_IMM, 3);\nOP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_ptr : (common->hit_start + (int)sizeof(sljit_sw)), SLJIT_S0, 0);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\nOP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), 2 * sizeof(int), SLJIT_R2, 0);\nJUMPHERE(jump);\n\nOP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_used_ptr : common->hit_start);\nOP2(SLJIT_SUB, SLJIT_S1, 0, STR_END, 0, SLJIT_S0, 0);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\nOP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), sizeof(int), SLJIT_S1, 0);\n\nOP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_S0, 0);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\nOP2(SLJIT_ASHR, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R2, 0);\n\nJUMPTO(SLJIT_JUMP, quit);\n}\n\nstatic SLJIT_INLINE void check_start_used_ptr(compiler_common *common)\n{\n/* May destroy TMP1. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nif (common->mode == JIT_PARTIAL_SOFT_COMPILE)\n  {\n  /* The value of -1 must be kept for start_used_ptr! */\n  OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, 1);\n  /* Jumps if start_used_ptr < STR_PTR, or start_used_ptr == -1. Although overwriting\n  is not necessary if start_used_ptr == STR_PTR, it does not hurt as well. */\n  jump = CMP(SLJIT_LESS_EQUAL, TMP1, 0, STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\n  JUMPHERE(jump);\n  }\nelse if (common->mode == JIT_PARTIAL_HARD_COMPILE)\n  {\n  jump = CMP(SLJIT_LESS_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\n  JUMPHERE(jump);\n  }\n}\n\nstatic SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, pcre_uchar *cc)\n{\n/* Detects if the character has an othercase. */\nunsigned int c;\n\n#ifdef SUPPORT_UTF\nif (common->utf)\n  {\n  GETCHAR(c, cc);\n  if (c > 127)\n    {\n#ifdef SUPPORT_UCP\n    return c != UCD_OTHERCASE(c);\n#else\n    return FALSE;\n#endif\n    }\n#ifndef COMPILE_PCRE8\n  return common->fcc[c] != c;\n#endif\n  }\nelse\n#endif\n  c = *cc;\nreturn MAX_255(c) ? common->fcc[c] != c : FALSE;\n}\n\nstatic SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigned int c)\n{\n/* Returns with the othercase. */\n#ifdef SUPPORT_UTF\nif (common->utf && c > 127)\n  {\n#ifdef SUPPORT_UCP\n  return UCD_OTHERCASE(c);\n#else\n  return c;\n#endif\n  }\n#endif\nreturn TABLE_GET(c, common->fcc, c);\n}\n\nstatic unsigned int char_get_othercase_bit(compiler_common *common, pcre_uchar *cc)\n{\n/* Detects if the character and its othercase has only 1 bit difference. */\nunsigned int c, oc, bit;\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nint n;\n#endif\n\n#ifdef SUPPORT_UTF\nif (common->utf)\n  {\n  GETCHAR(c, cc);\n  if (c <= 127)\n    oc = common->fcc[c];\n  else\n    {\n#ifdef SUPPORT_UCP\n    oc = UCD_OTHERCASE(c);\n#else\n    oc = c;\n#endif\n    }\n  }\nelse\n  {\n  c = *cc;\n  oc = TABLE_GET(c, common->fcc, c);\n  }\n#else\nc = *cc;\noc = TABLE_GET(c, common->fcc, c);\n#endif\n\nSLJIT_ASSERT(c != oc);\n\nbit = c ^ oc;\n/* Optimized for English alphabet. */\nif (c <= 127 && bit == 0x20)\n  return (0 << 8) | 0x20;\n\n/* Since c != oc, they must have at least 1 bit difference. */\nif (!is_powerof2(bit))\n  return 0;\n\n#if defined COMPILE_PCRE8\n\n#ifdef SUPPORT_UTF\nif (common->utf && c > 127)\n  {\n  n = GET_EXTRALEN(*cc);\n  while ((bit & 0x3f) == 0)\n    {\n    n--;\n    bit >>= 6;\n    }\n  return (n << 8) | bit;\n  }\n#endif /* SUPPORT_UTF */\nreturn (0 << 8) | bit;\n\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n\n#ifdef SUPPORT_UTF\nif (common->utf && c > 65535)\n  {\n  if (bit >= (1 << 10))\n    bit >>= 10;\n  else\n    return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8));\n  }\n#endif /* SUPPORT_UTF */\nreturn (bit < 256) ? ((0 << 8) | bit) : ((1 << 8) | (bit >> 8));\n\n#endif /* COMPILE_PCRE[8|16|32] */\n}\n\nstatic void check_partial(compiler_common *common, BOOL force)\n{\n/* Checks whether a partial matching is occurred. Does not modify registers. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump = NULL;\n\nSLJIT_ASSERT(!force || common->mode != JIT_COMPILE);\n\nif (common->mode == JIT_COMPILE)\n  return;\n\nif (!force)\n  jump = CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\nelse if (common->mode == JIT_PARTIAL_SOFT_COMPILE)\n  jump = CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);\n\nif (common->mode == JIT_PARTIAL_SOFT_COMPILE)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);\nelse\n  {\n  if (common->partialmatchlabel != NULL)\n    JUMPTO(SLJIT_JUMP, common->partialmatchlabel);\n  else\n    add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));\n  }\n\nif (jump != NULL)\n  JUMPHERE(jump);\n}\n\nstatic void check_str_end(compiler_common *common, jump_list **end_reached)\n{\n/* Does not affect registers. Usually used in a tight spot. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nif (common->mode == JIT_COMPILE)\n  {\n  add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n  return;\n  }\n\njump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);\nif (common->mode == JIT_PARTIAL_SOFT_COMPILE)\n  {\n  add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);\n  add_jump(compiler, end_reached, JUMP(SLJIT_JUMP));\n  }\nelse\n  {\n  add_jump(compiler, end_reached, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));\n  if (common->partialmatchlabel != NULL)\n    JUMPTO(SLJIT_JUMP, common->partialmatchlabel);\n  else\n    add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));\n  }\nJUMPHERE(jump);\n}\n\nstatic void detect_partial_match(compiler_common *common, jump_list **backtracks)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nif (common->mode == JIT_COMPILE)\n  {\n  add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n  return;\n  }\n\n/* Partial matching mode. */\njump = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);\nadd_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0));\nif (common->mode == JIT_PARTIAL_SOFT_COMPILE)\n  {\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);\n  add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n  }\nelse\n  {\n  if (common->partialmatchlabel != NULL)\n    JUMPTO(SLJIT_JUMP, common->partialmatchlabel);\n  else\n    add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP));\n  }\nJUMPHERE(jump);\n}\n\nstatic void peek_char(compiler_common *common, sljit_u32 max)\n{\n/* Reads the character into TMP1, keeps STR_PTR.\nDoes not check STR_END. TMP2 Destroyed. */\nDEFINE_COMPILER;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nstruct sljit_jump *jump;\n#endif\n\nSLJIT_UNUSED_ARG(max);\n\nOP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nif (common->utf)\n  {\n  if (max < 128) return;\n\n  jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL));\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n  JUMPHERE(jump);\n  }\n#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\nif (common->utf)\n  {\n  if (max < 0xd800) return;\n\n  OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n  jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1);\n  /* TMP2 contains the high surrogate. */\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n  OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40);\n  OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff);\n  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n  JUMPHERE(jump);\n  }\n#endif\n}\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n\nstatic BOOL is_char7_bitset(const sljit_u8 *bitset, BOOL nclass)\n{\n/* Tells whether the character codes below 128 are enough\nto determine a match. */\nconst sljit_u8 value = nclass ? 0xff : 0;\nconst sljit_u8 *end = bitset + 32;\n\nbitset += 16;\ndo\n  {\n  if (*bitset++ != value)\n    return FALSE;\n  }\nwhile (bitset < end);\nreturn TRUE;\n}\n\nstatic void read_char7_type(compiler_common *common, BOOL full_read)\n{\n/* Reads the precise character type of a character into TMP1, if the character\nis less than 128. Otherwise it returns with zero. Does not check STR_END. The\nfull_read argument tells whether characters above max are accepted or not. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nSLJIT_ASSERT(common->utf);\n\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0);\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);\n\nif (full_read)\n  {\n  jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n  JUMPHERE(jump);\n  }\n}\n\n#endif /* SUPPORT_UTF && COMPILE_PCRE8 */\n\nstatic void read_char_range(compiler_common *common, sljit_u32 min, sljit_u32 max, BOOL update_str_ptr)\n{\n/* Reads the precise value of a character into TMP1, if the character is\nbetween min and max (c >= min && c <= max). Otherwise it returns with a value\noutside the range. Does not check STR_END. */\nDEFINE_COMPILER;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nstruct sljit_jump *jump;\n#endif\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nstruct sljit_jump *jump2;\n#endif\n\nSLJIT_UNUSED_ARG(update_str_ptr);\nSLJIT_UNUSED_ARG(min);\nSLJIT_UNUSED_ARG(max);\nSLJIT_ASSERT(min <= max);\n\nOP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nif (common->utf)\n  {\n  if (max < 128 && !update_str_ptr) return;\n\n  jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);\n  if (min >= 0x10000)\n    {\n    OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xf0);\n    if (update_str_ptr)\n      OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x7);\n    OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2));\n    if (!update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));\n    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    JUMPHERE(jump2);\n    if (update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);\n    }\n  else if (min >= 0x800 && max <= 0xffff)\n    {\n    OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xe0);\n    if (update_str_ptr)\n      OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xf);\n    OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n    if (!update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\n    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    JUMPHERE(jump2);\n    if (update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);\n    }\n  else if (max >= 0x800)\n    add_jump(compiler, (max < 0x10000) ? &common->utfreadchar16 : &common->utfreadchar, JUMP(SLJIT_FAST_CALL));\n  else if (max < 128)\n    {\n    OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n    }\n  else\n    {\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    if (!update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    else\n      OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    if (update_str_ptr)\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, RETURN_ADDR, 0);\n    }\n  JUMPHERE(jump);\n  }\n#endif\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\nif (common->utf)\n  {\n  if (max >= 0x10000)\n    {\n    OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n    jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1);\n    /* TMP2 contains the high surrogate. */\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x40);\n    OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 10);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n    JUMPHERE(jump);\n    return;\n    }\n\n  if (max < 0xd800 && !update_str_ptr) return;\n\n  /* Skip low surrogate if necessary. */\n  OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n  jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1);\n  if (update_str_ptr)\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  if (max >= 0xd800)\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0x10000);\n  JUMPHERE(jump);\n  }\n#endif\n}\n\nstatic SLJIT_INLINE void read_char(compiler_common *common)\n{\nread_char_range(common, 0, READ_CHAR_MAX, TRUE);\n}\n\nstatic void read_char8_type(compiler_common *common, BOOL update_str_ptr)\n{\n/* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */\nDEFINE_COMPILER;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\nstruct sljit_jump *jump;\n#endif\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nstruct sljit_jump *jump2;\n#endif\n\nSLJIT_UNUSED_ARG(update_str_ptr);\n\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0);\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nif (common->utf)\n  {\n  /* This can be an extra read in some situations, but hopefully\n  it is needed in most cases. */\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);\n  jump = CMP(SLJIT_LESS, TMP2, 0, SLJIT_IMM, 0xc0);\n  if (!update_str_ptr)\n    {\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\n    OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);\n    jump2 = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);\n    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);\n    JUMPHERE(jump2);\n    }\n  else\n    add_jump(compiler, &common->utfreadtype8, JUMP(SLJIT_FAST_CALL));\n  JUMPHERE(jump);\n  return;\n  }\n#endif /* SUPPORT_UTF && COMPILE_PCRE8 */\n\n#if !defined COMPILE_PCRE8\n/* The ctypes array contains only 256 values. */\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);\njump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 255);\n#endif\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);\n#if !defined COMPILE_PCRE8\nJUMPHERE(jump);\n#endif\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE16\nif (common->utf && update_str_ptr)\n  {\n  /* Skip low surrogate if necessary. */\n  OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xd800);\n  jump = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0xdc00 - 0xd800 - 1);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  JUMPHERE(jump);\n  }\n#endif /* SUPPORT_UTF && COMPILE_PCRE16 */\n}\n\nstatic void skip_char_back(compiler_common *common)\n{\n/* Goes one character back. Affects STR_PTR and TMP1. Does not check begin. */\nDEFINE_COMPILER;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n#if defined COMPILE_PCRE8\nstruct sljit_label *label;\n\nif (common->utf)\n  {\n  label = LABEL();\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, label);\n  return;\n  }\n#elif defined COMPILE_PCRE16\nif (common->utf)\n  {\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1));\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  /* Skip low surrogate if necessary. */\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00);\n  OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  return;\n  }\n#endif /* COMPILE_PCRE[8|16] */\n#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */\nOP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n}\n\nstatic void check_newlinechar(compiler_common *common, int nltype, jump_list **backtracks, BOOL jumpifmatch)\n{\n/* Character comes in TMP1. Checks if it is a newline. TMP2 may be destroyed. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nif (nltype == NLTYPE_ANY)\n  {\n  add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL));\n  sljit_set_current_flags(compiler, SLJIT_SET_Z);\n  add_jump(compiler, backtracks, JUMP(jumpifmatch ? SLJIT_NOT_ZERO : SLJIT_ZERO));\n  }\nelse if (nltype == NLTYPE_ANYCRLF)\n  {\n  if (jumpifmatch)\n    {\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR));\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));\n    }\n  else\n    {\n    jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));\n    JUMPHERE(jump);\n    }\n  }\nelse\n  {\n  SLJIT_ASSERT(nltype == NLTYPE_FIXED && common->newline < 256);\n  add_jump(compiler, backtracks, CMP(jumpifmatch ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline));\n  }\n}\n\n#ifdef SUPPORT_UTF\n\n#if defined COMPILE_PCRE8\nstatic void do_utfreadchar(compiler_common *common)\n{\n/* Fast decoding a UTF-8 character. TMP1 contains the first byte\nof the character (>= 0xc0). Return char value in TMP1, length in TMP2. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\nOP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n\n/* Searching for the first zero. */\nOP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800);\njump = JUMP(SLJIT_NOT_ZERO);\n/* Two byte sequence. */\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(2));\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\nJUMPHERE(jump);\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\nOP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800);\nOP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n\nOP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10000);\njump = JUMP(SLJIT_NOT_ZERO);\n/* Three byte sequence. */\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(3));\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\n/* Four byte sequence. */\nJUMPHERE(jump);\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2));\nOP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000);\nOP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3));\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(4));\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\nstatic void do_utfreadchar16(compiler_common *common)\n{\n/* Fast decoding a UTF-8 character. TMP1 contains the first byte\nof the character (>= 0xc0). Return value in TMP1. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\nOP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n\n/* Searching for the first zero. */\nOP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x800);\njump = JUMP(SLJIT_NOT_ZERO);\n/* Two byte sequence. */\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\nJUMPHERE(jump);\nOP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x400);\nOP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_NOT_ZERO);\n/* This code runs only in 8 bit mode. No need to shift the value. */\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\nOP2(SLJIT_XOR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x800);\nOP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6);\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n/* Three byte sequence. */\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\nstatic void do_utfreadtype8(compiler_common *common)\n{\n/* Fast decoding a UTF-8 character type. TMP2 contains the first byte\nof the character (>= 0xc0). Return value in TMP1. */\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\nstruct sljit_jump *compare;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\n\nOP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x20);\njump = JUMP(SLJIT_NOT_ZERO);\n/* Two byte sequence. */\nOP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nOP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x1f);\n/* The upper 5 bits are known at this point. */\ncompare = CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, 0x3);\nOP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6);\nOP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f);\nOP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0);\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\nJUMPHERE(compare);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\n/* We only have types for characters less than 256. */\nJUMPHERE(jump);\nOP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(utf8_table4) - 0xc0);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0);\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\n#endif /* COMPILE_PCRE8 */\n\n#endif /* SUPPORT_UTF */\n\n#ifdef SUPPORT_UCP\n\n/* UCD_BLOCK_SIZE must be 128 (see the assert below). */\n#define UCD_BLOCK_MASK 127\n#define UCD_BLOCK_SHIFT 7\n\nstatic void do_getucd(compiler_common *common)\n{\n/* Search the UCD record for the character comes in TMP1.\nReturns chartype in TMP1 and UCD offset in TMP2. */\nDEFINE_COMPILER;\n#ifdef COMPILE_PCRE32\nstruct sljit_jump *jump;\n#endif\n\n#if defined SLJIT_DEBUG && SLJIT_DEBUG\n/* dummy_ucd_record */\nconst ucd_record *record = GET_UCD(INVALID_UTF_CHAR);\nSLJIT_ASSERT(record->script == ucp_Common && record->chartype == ucp_Cn && record->gbprop == ucp_gbOther);\nSLJIT_ASSERT(record->caseset == 0 && record->other_case == 0);\n#endif\n\nSLJIT_ASSERT(UCD_BLOCK_SIZE == 128 && sizeof(ucd_record) == 8);\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\n\n#ifdef COMPILE_PCRE32\nif (!common->utf)\n  {\n  jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);\n  JUMPHERE(jump);\n  }\n#endif\n\nOP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);\nOP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));\nOP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);\nOP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);\nOP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));\nOP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n#endif\n\nstatic SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common, BOOL hascrorlf)\n{\nDEFINE_COMPILER;\nstruct sljit_label *mainloop;\nstruct sljit_label *newlinelabel = NULL;\nstruct sljit_jump *start;\nstruct sljit_jump *end = NULL;\nstruct sljit_jump *end2 = NULL;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nstruct sljit_jump *singlechar;\n#endif\njump_list *newline = NULL;\nBOOL newlinecheck = FALSE;\nBOOL readuchar = FALSE;\n\nif (!(hascrorlf || (common->match_end_ptr != 0)) &&\n    (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF || common->newline > 255))\n  newlinecheck = TRUE;\n\nif (common->match_end_ptr != 0)\n  {\n  /* Search for the end of the first line. */\n  OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);\n\n  if (common->nltype == NLTYPE_FIXED && common->newline > 255)\n    {\n    mainloop = LABEL();\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, mainloop);\n    CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, mainloop);\n    JUMPHERE(end);\n    OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    }\n  else\n    {\n    end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n    mainloop = LABEL();\n    /* Continual stores does not cause data dependency. */\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);\n    read_char_range(common, common->nlmin, common->nlmax, TRUE);\n    check_newlinechar(common, common->nltype, &newline, TRUE);\n    CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, mainloop);\n    JUMPHERE(end);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, STR_PTR, 0);\n    set_jumps(newline, LABEL());\n    }\n\n  OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);\n  }\n\nstart = JUMP(SLJIT_JUMP);\n\nif (newlinecheck)\n  {\n  newlinelabel = LABEL();\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  end = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff);\n  OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  end2 = JUMP(SLJIT_JUMP);\n  }\n\nmainloop = LABEL();\n\n/* Increasing the STR_PTR here requires one less jump in the most common case. */\n#ifdef SUPPORT_UTF\nif (common->utf) readuchar = TRUE;\n#endif\nif (newlinecheck) readuchar = TRUE;\n\nif (readuchar)\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n\nif (newlinecheck)\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, newlinelabel);\n\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n#if defined COMPILE_PCRE8\nif (common->utf)\n  {\n  singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  JUMPHERE(singlechar);\n  }\n#elif defined COMPILE_PCRE16\nif (common->utf)\n  {\n  singlechar = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n  OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  JUMPHERE(singlechar);\n  }\n#endif /* COMPILE_PCRE[8|16] */\n#endif /* SUPPORT_UTF && !COMPILE_PCRE32 */\nJUMPHERE(start);\n\nif (newlinecheck)\n  {\n  JUMPHERE(end);\n  JUMPHERE(end2);\n  }\n\nreturn mainloop;\n}\n\n#define MAX_N_CHARS 16\n#define MAX_DIFF_CHARS 6\n\nstatic SLJIT_INLINE void add_prefix_char(pcre_uchar chr, pcre_uchar *chars)\n{\npcre_uchar i, len;\n\nlen = chars[0];\nif (len == 255)\n  return;\n\nif (len == 0)\n  {\n  chars[0] = 1;\n  chars[1] = chr;\n  return;\n  }\n\nfor (i = len; i > 0; i--)\n  if (chars[i] == chr)\n    return;\n\nif (len >= MAX_DIFF_CHARS - 1)\n  {\n  chars[0] = 255;\n  return;\n  }\n\nlen++;\nchars[len] = chr;\nchars[0] = len;\n}\n\nstatic int scan_prefix(compiler_common *common, pcre_uchar *cc, pcre_uchar *chars, int max_chars, sljit_u32 *rec_count)\n{\n/* Recursive function, which scans prefix literals. */\nBOOL last, any, class, caseless;\nint len, repeat, len_save, consumed = 0;\nsljit_u32 chr; /* Any unicode character. */\nsljit_u8 *bytes, *bytes_end, byte;\npcre_uchar *alternative, *cc_save, *oc;\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\npcre_uchar othercase[8];\n#elif defined SUPPORT_UTF && defined COMPILE_PCRE16\npcre_uchar othercase[2];\n#else\npcre_uchar othercase[1];\n#endif\n\nrepeat = 1;\nwhile (TRUE)\n  {\n  if (*rec_count == 0)\n    return 0;\n  (*rec_count)--;\n\n  last = TRUE;\n  any = FALSE;\n  class = FALSE;\n  caseless = FALSE;\n\n  switch (*cc)\n    {\n    case OP_CHARI:\n    caseless = TRUE;\n    case OP_CHAR:\n    last = FALSE;\n    cc++;\n    break;\n\n    case OP_SOD:\n    case OP_SOM:\n    case OP_SET_SOM:\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    case OP_EODN:\n    case OP_EOD:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_DOLL:\n    case OP_DOLLM:\n    /* Zero width assertions. */\n    cc++;\n    continue;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    cc = bracketend(cc);\n    continue;\n\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_POSPLUSI:\n    caseless = TRUE;\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_POSPLUS:\n    cc++;\n    break;\n\n    case OP_EXACTI:\n    caseless = TRUE;\n    case OP_EXACT:\n    repeat = GET2(cc, 1);\n    last = FALSE;\n    cc += 1 + IMM2_SIZE;\n    break;\n\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_POSQUERYI:\n    caseless = TRUE;\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_POSQUERY:\n    len = 1;\n    cc++;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);\n#endif\n    max_chars = scan_prefix(common, cc + len, chars, max_chars, rec_count);\n    if (max_chars == 0)\n      return consumed;\n    last = FALSE;\n    break;\n\n    case OP_KET:\n    cc += 1 + LINK_SIZE;\n    continue;\n\n    case OP_ALT:\n    cc += GET(cc, 1);\n    continue;\n\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRA:\n    case OP_BRAPOS:\n    case OP_CBRA:\n    case OP_CBRAPOS:\n    alternative = cc + GET(cc, 1);\n    while (*alternative == OP_ALT)\n      {\n      max_chars = scan_prefix(common, alternative + 1 + LINK_SIZE, chars, max_chars, rec_count);\n      if (max_chars == 0)\n        return consumed;\n      alternative += GET(alternative, 1);\n      }\n\n    if (*cc == OP_CBRA || *cc == OP_CBRAPOS)\n      cc += IMM2_SIZE;\n    cc += 1 + LINK_SIZE;\n    continue;\n\n    case OP_CLASS:\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n    if (common->utf && !is_char7_bitset((const sljit_u8 *)(cc + 1), FALSE))\n      return consumed;\n#endif\n    class = TRUE;\n    break;\n\n    case OP_NCLASS:\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (common->utf) return consumed;\n#endif\n    class = TRUE;\n    break;\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (common->utf) return consumed;\n#endif\n    any = TRUE;\n    cc += GET(cc, 1);\n    break;\n#endif\n\n    case OP_DIGIT:\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n    if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE))\n      return consumed;\n#endif\n    any = TRUE;\n    cc++;\n    break;\n\n    case OP_WHITESPACE:\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n    if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE))\n      return consumed;\n#endif\n    any = TRUE;\n    cc++;\n    break;\n\n    case OP_WORDCHAR:\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n    if (common->utf && !is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE))\n      return consumed;\n#endif\n    any = TRUE;\n    cc++;\n    break;\n\n    case OP_NOT:\n    case OP_NOTI:\n    cc++;\n    /* Fall through. */\n    case OP_NOT_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_ANY:\n    case OP_ALLANY:\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (common->utf) return consumed;\n#endif\n    any = TRUE;\n    cc++;\n    break;\n\n#ifdef SUPPORT_UTF\n    case OP_NOTPROP:\n    case OP_PROP:\n#ifndef COMPILE_PCRE32\n    if (common->utf) return consumed;\n#endif\n    any = TRUE;\n    cc += 1 + 2;\n    break;\n#endif\n\n    case OP_TYPEEXACT:\n    repeat = GET2(cc, 1);\n    cc += 1 + IMM2_SIZE;\n    continue;\n\n    case OP_NOTEXACT:\n    case OP_NOTEXACTI:\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (common->utf) return consumed;\n#endif\n    any = TRUE;\n    repeat = GET2(cc, 1);\n    cc += 1 + IMM2_SIZE + 1;\n    break;\n\n    default:\n    return consumed;\n    }\n\n  if (any)\n    {\n    do\n      {\n      chars[0] = 255;\n\n      consumed++;\n      if (--max_chars == 0)\n        return consumed;\n      chars += MAX_DIFF_CHARS;\n      }\n    while (--repeat > 0);\n\n    repeat = 1;\n    continue;\n    }\n\n  if (class)\n    {\n    bytes = (sljit_u8*) (cc + 1);\n    cc += 1 + 32 / sizeof(pcre_uchar);\n\n    switch (*cc)\n      {\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRPOSSTAR:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSQUERY:\n      max_chars = scan_prefix(common, cc + 1, chars, max_chars, rec_count);\n      if (max_chars == 0)\n        return consumed;\n      break;\n\n      default:\n      case OP_CRPLUS:\n      case OP_CRMINPLUS:\n      case OP_CRPOSPLUS:\n      break;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      repeat = GET2(cc, 1);\n      if (repeat <= 0)\n        return consumed;\n      break;\n      }\n\n    do\n      {\n      if (bytes[31] & 0x80)\n        chars[0] = 255;\n      else if (chars[0] != 255)\n        {\n        bytes_end = bytes + 32;\n        chr = 0;\n        do\n          {\n          byte = *bytes++;\n          SLJIT_ASSERT((chr & 0x7) == 0);\n          if (byte == 0)\n            chr += 8;\n          else\n            {\n            do\n              {\n              if ((byte & 0x1) != 0)\n                add_prefix_char(chr, chars);\n              byte >>= 1;\n              chr++;\n              }\n            while (byte != 0);\n            chr = (chr + 7) & ~7;\n            }\n          }\n        while (chars[0] != 255 && bytes < bytes_end);\n        bytes = bytes_end - 32;\n        }\n\n      consumed++;\n      if (--max_chars == 0)\n        return consumed;\n      chars += MAX_DIFF_CHARS;\n      }\n    while (--repeat > 0);\n\n    switch (*cc)\n      {\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRPOSSTAR:\n      return consumed;\n\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSQUERY:\n      cc++;\n      break;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      if (GET2(cc, 1) != GET2(cc, 1 + IMM2_SIZE))\n        return consumed;\n      cc += 1 + 2 * IMM2_SIZE;\n      break;\n      }\n\n    repeat = 1;\n    continue;\n    }\n\n  len = 1;\n#ifdef SUPPORT_UTF\n  if (common->utf && HAS_EXTRALEN(*cc)) len += GET_EXTRALEN(*cc);\n#endif\n\n  if (caseless && char_has_othercase(common, cc))\n    {\n#ifdef SUPPORT_UTF\n    if (common->utf)\n      {\n      GETCHAR(chr, cc);\n      if ((int)PRIV(ord2utf)(char_othercase(common, chr), othercase) != len)\n        return consumed;\n      }\n    else\n#endif\n      {\n      chr = *cc;\n      othercase[0] = TABLE_GET(chr, common->fcc, chr);\n      }\n    }\n  else\n    {\n    caseless = FALSE;\n    othercase[0] = 0; /* Stops compiler warning - PH */\n    }\n\n  len_save = len;\n  cc_save = cc;\n  while (TRUE)\n    {\n    oc = othercase;\n    do\n      {\n      chr = *cc;\n      add_prefix_char(*cc, chars);\n\n      if (caseless)\n        add_prefix_char(*oc, chars);\n\n      len--;\n      consumed++;\n      if (--max_chars == 0)\n        return consumed;\n      chars += MAX_DIFF_CHARS;\n      cc++;\n      oc++;\n      }\n    while (len > 0);\n\n    if (--repeat == 0)\n      break;\n\n    len = len_save;\n    cc = cc_save;\n    }\n\n  repeat = 1;\n  if (last)\n    return consumed;\n  }\n}\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND)\n\nstatic sljit_s32 character_to_int32(pcre_uchar chr)\n{\nsljit_s32 value = (sljit_s32)chr;\n#if defined COMPILE_PCRE8\n#define SSE2_COMPARE_TYPE_INDEX 0\nreturn (value << 24) | (value << 16) | (value << 8) | value;\n#elif defined COMPILE_PCRE16\n#define SSE2_COMPARE_TYPE_INDEX 1\nreturn (value << 16) | value;\n#elif defined COMPILE_PCRE32\n#define SSE2_COMPARE_TYPE_INDEX 2\nreturn value;\n#else\n#error \"Unsupported unit width\"\n#endif\n}\n\nstatic SLJIT_INLINE void fast_forward_first_char2_sse2(compiler_common *common, pcre_uchar char1, pcre_uchar char2)\n{\nDEFINE_COMPILER;\nstruct sljit_label *start;\nstruct sljit_jump *quit[3];\nstruct sljit_jump *nomatch;\nsljit_u8 instruction[8];\nsljit_s32 tmp1_ind = sljit_get_register_index(TMP1);\nsljit_s32 tmp2_ind = sljit_get_register_index(TMP2);\nsljit_s32 str_ptr_ind = sljit_get_register_index(STR_PTR);\nBOOL load_twice = FALSE;\npcre_uchar bit;\n\nbit = char1 ^ char2;\nif (!is_powerof2(bit))\n  bit = 0;\n\nif ((char1 != char2) && bit == 0)\n  load_twice = TRUE;\n\nquit[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n\n/* First part (unaligned start) */\n\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(char1 | bit));\n\nSLJIT_ASSERT(tmp1_ind < 8 && tmp2_ind == 1);\n\n/* MOVD xmm, r/m32 */\ninstruction[0] = 0x66;\ninstruction[1] = 0x0f;\ninstruction[2] = 0x6e;\ninstruction[3] = 0xc0 | (2 << 3) | tmp1_ind;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (char1 != char2)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, character_to_int32(bit != 0 ? bit : char2));\n\n  /* MOVD xmm, r/m32 */\n  instruction[3] = 0xc0 | (3 << 3) | tmp1_ind;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n/* PSHUFD xmm1, xmm2/m128, imm8 */\ninstruction[2] = 0x70;\ninstruction[3] = 0xc0 | (2 << 3) | 2;\ninstruction[4] = 0;\nsljit_emit_op_custom(compiler, instruction, 5);\n\nif (char1 != char2)\n  {\n  /* PSHUFD xmm1, xmm2/m128, imm8 */\n  instruction[3] = 0xc0 | (3 << 3) | 3;\n  instruction[4] = 0;\n  sljit_emit_op_custom(compiler, instruction, 5);\n  }\n\nOP2(SLJIT_AND, TMP2, 0, STR_PTR, 0, SLJIT_IMM, 0xf);\nOP2(SLJIT_AND, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, ~0xf);\n\n/* MOVDQA xmm1, xmm2/m128 */\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\nif (str_ptr_ind < 8)\n  {\n  instruction[2] = 0x6f;\n  instruction[3] = (0 << 3) | str_ptr_ind;\n  sljit_emit_op_custom(compiler, instruction, 4);\n\n  if (load_twice)\n    {\n    instruction[3] = (1 << 3) | str_ptr_ind;\n    sljit_emit_op_custom(compiler, instruction, 4);\n    }\n  }\nelse\n  {\n  instruction[1] = 0x41;\n  instruction[2] = 0x0f;\n  instruction[3] = 0x6f;\n  instruction[4] = (0 << 3) | (str_ptr_ind & 0x7);\n  sljit_emit_op_custom(compiler, instruction, 5);\n\n  if (load_twice)\n    {\n    instruction[4] = (1 << 3) | str_ptr_ind;\n    sljit_emit_op_custom(compiler, instruction, 5);\n    }\n  instruction[1] = 0x0f;\n  }\n\n#else\n\ninstruction[2] = 0x6f;\ninstruction[3] = (0 << 3) | str_ptr_ind;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  instruction[3] = (1 << 3) | str_ptr_ind;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n#endif\n\nif (bit != 0)\n  {\n  /* POR xmm1, xmm2/m128 */\n  instruction[2] = 0xeb;\n  instruction[3] = 0xc0 | (0 << 3) | 3;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n/* PCMPEQB/W/D xmm1, xmm2/m128 */\ninstruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;\ninstruction[3] = 0xc0 | (0 << 3) | 2;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  instruction[3] = 0xc0 | (1 << 3) | 3;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n/* PMOVMSKB reg, xmm */\ninstruction[2] = 0xd7;\ninstruction[3] = 0xc0 | (tmp1_ind << 3) | 0;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP2, 0);\n  instruction[3] = 0xc0 | (tmp2_ind << 3) | 1;\n  sljit_emit_op_custom(compiler, instruction, 4);\n\n  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n  OP1(SLJIT_MOV, TMP2, 0, RETURN_ADDR, 0);\n  }\n\nOP2(SLJIT_ASHR, TMP1, 0, TMP1, 0, TMP2, 0);\n\n/* BSF r32, r/m32 */\ninstruction[0] = 0x0f;\ninstruction[1] = 0xbc;\ninstruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;\nsljit_emit_op_custom(compiler, instruction, 3);\nsljit_set_current_flags(compiler, SLJIT_SET_Z);\n\nnomatch = JUMP(SLJIT_ZERO);\n\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\nquit[1] = JUMP(SLJIT_JUMP);\n\nJUMPHERE(nomatch);\n\nstart = LABEL();\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, 16);\nquit[2] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n\n/* Second part (aligned) */\n\ninstruction[0] = 0x66;\ninstruction[1] = 0x0f;\n\n/* MOVDQA xmm1, xmm2/m128 */\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\nif (str_ptr_ind < 8)\n  {\n  instruction[2] = 0x6f;\n  instruction[3] = (0 << 3) | str_ptr_ind;\n  sljit_emit_op_custom(compiler, instruction, 4);\n\n  if (load_twice)\n    {\n    instruction[3] = (1 << 3) | str_ptr_ind;\n    sljit_emit_op_custom(compiler, instruction, 4);\n    }\n  }\nelse\n  {\n  instruction[1] = 0x41;\n  instruction[2] = 0x0f;\n  instruction[3] = 0x6f;\n  instruction[4] = (0 << 3) | (str_ptr_ind & 0x7);\n  sljit_emit_op_custom(compiler, instruction, 5);\n\n  if (load_twice)\n    {\n    instruction[4] = (1 << 3) | str_ptr_ind;\n    sljit_emit_op_custom(compiler, instruction, 5);\n    }\n  instruction[1] = 0x0f;\n  }\n\n#else\n\ninstruction[2] = 0x6f;\ninstruction[3] = (0 << 3) | str_ptr_ind;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  instruction[3] = (1 << 3) | str_ptr_ind;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n#endif\n\nif (bit != 0)\n  {\n  /* POR xmm1, xmm2/m128 */\n  instruction[2] = 0xeb;\n  instruction[3] = 0xc0 | (0 << 3) | 3;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n/* PCMPEQB/W/D xmm1, xmm2/m128 */\ninstruction[2] = 0x74 + SSE2_COMPARE_TYPE_INDEX;\ninstruction[3] = 0xc0 | (0 << 3) | 2;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  instruction[3] = 0xc0 | (1 << 3) | 3;\n  sljit_emit_op_custom(compiler, instruction, 4);\n  }\n\n/* PMOVMSKB reg, xmm */\ninstruction[2] = 0xd7;\ninstruction[3] = 0xc0 | (tmp1_ind << 3) | 0;\nsljit_emit_op_custom(compiler, instruction, 4);\n\nif (load_twice)\n  {\n  instruction[3] = 0xc0 | (tmp2_ind << 3) | 1;\n  sljit_emit_op_custom(compiler, instruction, 4);\n\n  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0);\n  }\n\n/* BSF r32, r/m32 */\ninstruction[0] = 0x0f;\ninstruction[1] = 0xbc;\ninstruction[2] = 0xc0 | (tmp1_ind << 3) | tmp1_ind;\nsljit_emit_op_custom(compiler, instruction, 3);\nsljit_set_current_flags(compiler, SLJIT_SET_Z);\n\nJUMPTO(SLJIT_ZERO, start);\n\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n\nstart = LABEL();\nSET_LABEL(quit[0], start);\nSET_LABEL(quit[1], start);\nSET_LABEL(quit[2], start);\n}\n\n#undef SSE2_COMPARE_TYPE_INDEX\n\n#endif\n\nstatic void fast_forward_first_char2(compiler_common *common, pcre_uchar char1, pcre_uchar char2, sljit_s32 offset)\n{\nDEFINE_COMPILER;\nstruct sljit_label *start;\nstruct sljit_jump *quit;\nstruct sljit_jump *found;\npcre_uchar mask;\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nstruct sljit_label *utf_start = NULL;\nstruct sljit_jump *utf_quit = NULL;\n#endif\nBOOL has_match_end = (common->match_end_ptr != 0);\n\nif (offset > 0)\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));\n\nif (has_match_end)\n  {\n  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);\n\n  OP2(SLJIT_ADD, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr, SLJIT_IMM, IN_UCHARS(offset + 1));\n  OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, STR_END, 0, TMP3, 0);\n  sljit_emit_cmov(compiler, SLJIT_GREATER, STR_END, TMP3, 0);\n  }\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nif (common->utf && offset > 0)\n  utf_start = LABEL();\n#endif\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) && !(defined SUPPORT_VALGRIND)\n\n/* SSE2 accelerated first character search. */\n\nif (sljit_has_cpu_feature(SLJIT_HAS_SSE2))\n  {\n  fast_forward_first_char2_sse2(common, char1, char2);\n\n  SLJIT_ASSERT(common->mode == JIT_COMPILE || offset == 0);\n  if (common->mode == JIT_COMPILE)\n    {\n    /* In complete mode, we don't need to run a match when STR_PTR == STR_END. */\n    SLJIT_ASSERT(common->forced_quit_label == NULL);\n    OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);\n    add_jump(compiler, &common->forced_quit, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    if (common->utf && offset > 0)\n      {\n      SLJIT_ASSERT(common->mode == JIT_COMPILE);\n\n      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n#if defined COMPILE_PCRE8\n      OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);\n      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start);\n#elif defined COMPILE_PCRE16\n      OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start);\n#else\n#error \"Unknown code width\"\n#endif\n      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n      }\n#endif\n\n    if (offset > 0)\n      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));\n    }\n  else\n    {\n    OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, STR_END, 0);\n    if (has_match_end)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n      sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, TMP1, 0);\n      }\n    else\n      sljit_emit_cmov(compiler, SLJIT_GREATER_EQUAL, STR_PTR, STR_END, 0);\n    }\n\n  if (has_match_end)\n    OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);\n  return;\n  }\n\n#endif\n\nquit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n\nstart = LABEL();\nOP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n\nif (char1 == char2)\n  found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1);\nelse\n  {\n  mask = char1 ^ char2;\n  if (is_powerof2(mask))\n    {\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);\n    found = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, char1 | mask);\n    }\n  else\n    {\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char1);\n    OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char2);\n    OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\n    found = JUMP(SLJIT_NOT_ZERO);\n    }\n  }\n\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nCMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, start);\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nif (common->utf && offset > 0)\n  utf_quit = JUMP(SLJIT_JUMP);\n#endif\n\nJUMPHERE(found);\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nif (common->utf && offset > 0)\n  {\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-offset));\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n#if defined COMPILE_PCRE8\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, utf_start);\n#elif defined COMPILE_PCRE16\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, utf_start);\n#else\n#error \"Unknown code width\"\n#endif\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  JUMPHERE(utf_quit);\n  }\n#endif\n\nJUMPHERE(quit);\n\nif (has_match_end)\n  {\n  quit = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  if (offset > 0)\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));\n  JUMPHERE(quit);\n  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);\n  }\n\nif (offset > 0)\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(offset));\n}\n\nstatic SLJIT_INLINE BOOL fast_forward_first_n_chars(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_label *start;\nstruct sljit_jump *quit;\nstruct sljit_jump *match;\n/* bytes[0] represent the number of characters between 0\nand MAX_N_BYTES - 1, 255 represents any character. */\npcre_uchar chars[MAX_N_CHARS * MAX_DIFF_CHARS];\nsljit_s32 offset;\npcre_uchar mask;\npcre_uchar *char_set, *char_set_end;\nint i, max, from;\nint range_right = -1, range_len;\nsljit_u8 *update_table = NULL;\nBOOL in_range;\nsljit_u32 rec_count;\n\nfor (i = 0; i < MAX_N_CHARS; i++)\n  chars[i * MAX_DIFF_CHARS] = 0;\n\nrec_count = 10000;\nmax = scan_prefix(common, common->start, chars, MAX_N_CHARS, &rec_count);\n\nif (max < 1)\n  return FALSE;\n\nin_range = FALSE;\n/* Prevent compiler \"uninitialized\" warning */\nfrom = 0;\nrange_len = 4 /* minimum length */ - 1;\nfor (i = 0; i <= max; i++)\n  {\n  if (in_range && (i - from) > range_len && (chars[(i - 1) * MAX_DIFF_CHARS] < 255))\n    {\n    range_len = i - from;\n    range_right = i - 1;\n    }\n\n  if (i < max && chars[i * MAX_DIFF_CHARS] < 255)\n    {\n    SLJIT_ASSERT(chars[i * MAX_DIFF_CHARS] > 0);\n    if (!in_range)\n      {\n      in_range = TRUE;\n      from = i;\n      }\n    }\n  else\n    in_range = FALSE;\n  }\n\nif (range_right >= 0)\n  {\n  update_table = (sljit_u8 *)allocate_read_only_data(common, 256);\n  if (update_table == NULL)\n    return TRUE;\n  memset(update_table, IN_UCHARS(range_len), 256);\n\n  for (i = 0; i < range_len; i++)\n    {\n    char_set = chars + ((range_right - i) * MAX_DIFF_CHARS);\n    SLJIT_ASSERT(char_set[0] > 0 && char_set[0] < 255);\n    char_set_end = char_set + char_set[0];\n    char_set++;\n    while (char_set <= char_set_end)\n      {\n      if (update_table[(*char_set) & 0xff] > IN_UCHARS(i))\n        update_table[(*char_set) & 0xff] = IN_UCHARS(i);\n      char_set++;\n      }\n    }\n  }\n\noffset = -1;\n/* Scan forward. */\nfor (i = 0; i < max; i++)\n  {\n  if (offset == -1)\n    {\n    if (chars[i * MAX_DIFF_CHARS] <= 2)\n      offset = i;\n    }\n  else if (chars[offset * MAX_DIFF_CHARS] == 2 && chars[i * MAX_DIFF_CHARS] <= 2)\n    {\n    if (chars[i * MAX_DIFF_CHARS] == 1)\n      offset = i;\n    else\n      {\n      mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2];\n      if (!is_powerof2(mask))\n        {\n        mask = chars[i * MAX_DIFF_CHARS + 1] ^ chars[i * MAX_DIFF_CHARS + 2];\n        if (is_powerof2(mask))\n          offset = i;\n        }\n      }\n    }\n  }\n\nif (range_right < 0)\n  {\n  if (offset < 0)\n    return FALSE;\n  SLJIT_ASSERT(chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2);\n  /* Works regardless the value is 1 or 2. */\n  mask = chars[offset * MAX_DIFF_CHARS + chars[offset * MAX_DIFF_CHARS]];\n  fast_forward_first_char2(common, chars[offset * MAX_DIFF_CHARS + 1], mask, offset);\n  return TRUE;\n  }\n\nif (range_right == offset)\n  offset = -1;\n\nSLJIT_ASSERT(offset == -1 || (chars[offset * MAX_DIFF_CHARS] >= 1 && chars[offset * MAX_DIFF_CHARS] <= 2));\n\nmax -= 1;\nSLJIT_ASSERT(max > 0);\nif (common->match_end_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);\n  OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));\n  quit = CMP(SLJIT_LESS_EQUAL, STR_END, 0, TMP1, 0);\n  OP1(SLJIT_MOV, STR_END, 0, TMP1, 0);\n  JUMPHERE(quit);\n  }\nelse\n  OP2(SLJIT_SUB, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));\n\nSLJIT_ASSERT(range_right >= 0);\n\n#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\nOP1(SLJIT_MOV, RETURN_ADDR, 0, SLJIT_IMM, (sljit_sw)update_table);\n#endif\n\nstart = LABEL();\nquit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n\n#if defined COMPILE_PCRE8 || (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right));\n#else\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(range_right + 1) - 1);\n#endif\n\n#if !(defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(RETURN_ADDR, TMP1), 0);\n#else\nOP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)update_table);\n#endif\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\nCMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, start);\n\nif (offset >= 0)\n  {\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(offset));\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n  if (chars[offset * MAX_DIFF_CHARS] == 1)\n    CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1], start);\n  else\n    {\n    mask = chars[offset * MAX_DIFF_CHARS + 1] ^ chars[offset * MAX_DIFF_CHARS + 2];\n    if (is_powerof2(mask))\n      {\n      OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, mask);\n      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1] | mask, start);\n      }\n    else\n      {\n      match = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 1]);\n      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, chars[offset * MAX_DIFF_CHARS + 2], start);\n      JUMPHERE(match);\n      }\n    }\n  }\n\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\nif (common->utf && offset != 0)\n  {\n  if (offset < 0)\n    {\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    }\n  else\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));\n#if defined COMPILE_PCRE8\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0);\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, start);\n#elif defined COMPILE_PCRE16\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n  CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0xdc00, start);\n#else\n#error \"Unknown code width\"\n#endif\n  if (offset < 0)\n    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  }\n#endif\n\nif (offset >= 0)\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\nJUMPHERE(quit);\n\nif (common->match_end_ptr != 0)\n  {\n  if (range_right >= 0)\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);\n  if (range_right >= 0)\n    {\n    quit = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP1, 0);\n    OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);\n    JUMPHERE(quit);\n    }\n  }\nelse\n  OP2(SLJIT_ADD, STR_END, 0, STR_END, 0, SLJIT_IMM, IN_UCHARS(max));\nreturn TRUE;\n}\n\n#undef MAX_N_CHARS\n#undef MAX_DIFF_CHARS\n\nstatic SLJIT_INLINE void fast_forward_first_char(compiler_common *common, pcre_uchar first_char, BOOL caseless)\n{\npcre_uchar oc;\n\noc = first_char;\nif (caseless)\n  {\n  oc = TABLE_GET(first_char, common->fcc, first_char);\n#if defined SUPPORT_UCP && !defined COMPILE_PCRE8\n  if (first_char > 127 && common->utf)\n    oc = UCD_OTHERCASE(first_char);\n#endif\n  }\n\nfast_forward_first_char2(common, first_char, oc, 0);\n}\n\nstatic SLJIT_INLINE void fast_forward_newline(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_label *loop;\nstruct sljit_jump *lastchar;\nstruct sljit_jump *firstchar;\nstruct sljit_jump *quit;\nstruct sljit_jump *foundcr = NULL;\nstruct sljit_jump *notfoundnl;\njump_list *newline = NULL;\n\nif (common->match_end_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP3, 0, STR_END, 0);\n  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  }\n\nif (common->nltype == NLTYPE_FIXED && common->newline > 255)\n  {\n  lastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));\n  firstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);\n\n  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2));\n  OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0);\n  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER_EQUAL);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n\n  loop = LABEL();\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  quit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));\n  OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));\n  CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, loop);\n  CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, loop);\n\n  JUMPHERE(quit);\n  JUMPHERE(firstchar);\n  JUMPHERE(lastchar);\n\n  if (common->match_end_ptr != 0)\n    OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);\n  return;\n  }\n\nOP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\nfirstchar = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);\nskip_char_back(common);\n\nloop = LABEL();\ncommon->ff_newline_shortcut = loop;\n\nread_char_range(common, common->nlmin, common->nlmax, TRUE);\nlastchar = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\nif (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF)\n  foundcr = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);\ncheck_newlinechar(common, common->nltype, &newline, FALSE);\nset_jumps(newline, loop);\n\nif (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF)\n  {\n  quit = JUMP(SLJIT_JUMP);\n  JUMPHERE(foundcr);\n  notfoundnl = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL);\n  OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, UCHAR_SHIFT);\n#endif\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  JUMPHERE(notfoundnl);\n  JUMPHERE(quit);\n  }\nJUMPHERE(lastchar);\nJUMPHERE(firstchar);\n\nif (common->match_end_ptr != 0)\n  OP1(SLJIT_MOV, STR_END, 0, TMP3, 0);\n}\n\nstatic BOOL check_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks);\n\nstatic SLJIT_INLINE void fast_forward_start_bits(compiler_common *common, const sljit_u8 *start_bits)\n{\nDEFINE_COMPILER;\nstruct sljit_label *start;\nstruct sljit_jump *quit;\nstruct sljit_jump *found = NULL;\njump_list *matches = NULL;\n#ifndef COMPILE_PCRE8\nstruct sljit_jump *jump;\n#endif\n\nif (common->match_end_ptr != 0)\n  {\n  OP1(SLJIT_MOV, RETURN_ADDR, 0, STR_END, 0);\n  OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  }\n\nstart = LABEL();\nquit = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\nOP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n#ifdef SUPPORT_UTF\nif (common->utf)\n  OP1(SLJIT_MOV, TMP3, 0, TMP1, 0);\n#endif\n\nif (!check_class_ranges(common, start_bits, (start_bits[31] & 0x80) != 0, TRUE, &matches))\n  {\n#ifndef COMPILE_PCRE8\n  jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 255);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 255);\n  JUMPHERE(jump);\n#endif\n  OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);\n  OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)start_bits);\n  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);\n  found = JUMP(SLJIT_NOT_ZERO);\n  }\n\n#ifdef SUPPORT_UTF\nif (common->utf)\n  OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);\n#endif\nOP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n#ifdef SUPPORT_UTF\n#if defined COMPILE_PCRE8\nif (common->utf)\n  {\n  CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0, start);\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  }\n#elif defined COMPILE_PCRE16\nif (common->utf)\n  {\n  CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start);\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n  OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n  }\n#endif /* COMPILE_PCRE[8|16] */\n#endif /* SUPPORT_UTF */\nJUMPTO(SLJIT_JUMP, start);\nif (found != NULL)\n  JUMPHERE(found);\nif (matches != NULL)\n  set_jumps(matches, LABEL());\nJUMPHERE(quit);\n\nif (common->match_end_ptr != 0)\n  OP1(SLJIT_MOV, STR_END, 0, RETURN_ADDR, 0);\n}\n\nstatic SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, pcre_uchar req_char, BOOL caseless, BOOL has_firstchar)\n{\nDEFINE_COMPILER;\nstruct sljit_label *loop;\nstruct sljit_jump *toolong;\nstruct sljit_jump *alreadyfound;\nstruct sljit_jump *found;\nstruct sljit_jump *foundoc = NULL;\nstruct sljit_jump *notfound;\nsljit_u32 oc, bit;\n\nSLJIT_ASSERT(common->req_char_ptr != 0);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr);\nOP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_BYTE_MAX);\ntoolong = CMP(SLJIT_LESS, TMP1, 0, STR_END, 0);\nalreadyfound = CMP(SLJIT_LESS, STR_PTR, 0, TMP2, 0);\n\nif (has_firstchar)\n  OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\nelse\n  OP1(SLJIT_MOV, TMP1, 0, STR_PTR, 0);\n\nloop = LABEL();\nnotfound = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, STR_END, 0);\n\nOP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0);\noc = req_char;\nif (caseless)\n  {\n  oc = TABLE_GET(req_char, common->fcc, req_char);\n#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8)\n  if (req_char > 127 && common->utf)\n    oc = UCD_OTHERCASE(req_char);\n#endif\n  }\nif (req_char == oc)\n  found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);\nelse\n  {\n  bit = req_char ^ oc;\n  if (is_powerof2(bit))\n    {\n    OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit);\n    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit);\n    }\n  else\n    {\n    found = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, req_char);\n    foundoc = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, oc);\n    }\n  }\nOP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));\nJUMPTO(SLJIT_JUMP, loop);\n\nJUMPHERE(found);\nif (foundoc)\n  JUMPHERE(foundoc);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, TMP1, 0);\nJUMPHERE(alreadyfound);\nJUMPHERE(toolong);\nreturn notfound;\n}\n\nstatic void do_revertframes(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\nstruct sljit_label *mainloop;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\nOP1(SLJIT_MOV, TMP3, 0, STACK_TOP, 0);\nGET_LOCAL_BASE(TMP1, 0, 0);\n\n/* Drop frames until we reach STACK_TOP. */\nmainloop = LABEL();\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), -sizeof(sljit_sw));\njump = CMP(SLJIT_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, 0);\n\nOP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw));\nOP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_sw), SLJIT_MEM1(STACK_TOP), -3 * sizeof(sljit_sw));\nOP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 3 * sizeof(sljit_sw));\nJUMPTO(SLJIT_JUMP, mainloop);\n\nJUMPHERE(jump);\njump = CMP(SLJIT_NOT_ZERO /* SIG_LESS */, TMP2, 0, SLJIT_IMM, 0);\n/* End of reverting values. */\nOP1(SLJIT_MOV, STACK_TOP, 0, TMP3, 0);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n\nJUMPHERE(jump);\nOP1(SLJIT_NEG, TMP2, 0, TMP2, 0);\nOP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(STACK_TOP), -2 * sizeof(sljit_sw));\nOP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2 * sizeof(sljit_sw));\nJUMPTO(SLJIT_JUMP, mainloop);\n}\n\nstatic void check_wordboundary(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *skipread;\njump_list *skipread_list = NULL;\n#if !(defined COMPILE_PCRE8) || defined SUPPORT_UTF\nstruct sljit_jump *jump;\n#endif\n\nSLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16);\n\nsljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n/* Get type of the previous char, and put it to LOCALS1. */\nOP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, SLJIT_IMM, 0);\nskipread = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP1, 0);\nskip_char_back(common);\ncheck_start_used_ptr(common);\nread_char(common);\n\n/* Testing char type. */\n#ifdef SUPPORT_UCP\nif (common->use_ucp)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);\n  jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);\n  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);\n  OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);\n  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);\n  OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n  JUMPHERE(jump);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0);\n  }\nelse\n#endif\n  {\n#ifndef COMPILE_PCRE8\n  jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n#elif defined SUPPORT_UTF\n  /* Here LOCALS1 has already been zeroed. */\n  jump = NULL;\n  if (common->utf)\n    jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n#endif /* COMPILE_PCRE8 */\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes);\n  OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */);\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP1, 0);\n#ifndef COMPILE_PCRE8\n  JUMPHERE(jump);\n#elif defined SUPPORT_UTF\n  if (jump != NULL)\n    JUMPHERE(jump);\n#endif /* COMPILE_PCRE8 */\n  }\nJUMPHERE(skipread);\n\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);\ncheck_str_end(common, &skipread_list);\npeek_char(common, READ_CHAR_MAX);\n\n/* Testing char type. This is a code duplication. */\n#ifdef SUPPORT_UCP\nif (common->use_ucp)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1);\n  jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE);\n  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll);\n  OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);\n  OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll);\n  OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n  JUMPHERE(jump);\n  }\nelse\n#endif\n  {\n#ifndef COMPILE_PCRE8\n  /* TMP2 may be destroyed by peek_char. */\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);\n  jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n#elif defined SUPPORT_UTF\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0);\n  jump = NULL;\n  if (common->utf)\n    jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n#endif\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), common->ctypes);\n  OP2(SLJIT_LSHR, TMP2, 0, TMP2, 0, SLJIT_IMM, 4 /* ctype_word */);\n  OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);\n#ifndef COMPILE_PCRE8\n  JUMPHERE(jump);\n#elif defined SUPPORT_UTF\n  if (jump != NULL)\n    JUMPHERE(jump);\n#endif /* COMPILE_PCRE8 */\n  }\nset_jumps(skipread_list, LABEL());\n\nOP2(SLJIT_XOR | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);\nsljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n}\n\nstatic BOOL check_class_ranges(compiler_common *common, const sljit_u8 *bits, BOOL nclass, BOOL invert, jump_list **backtracks)\n{\n/* May destroy TMP1. */\nDEFINE_COMPILER;\nint ranges[MAX_RANGE_SIZE];\nsljit_u8 bit, cbit, all;\nint i, byte, length = 0;\n\nbit = bits[0] & 0x1;\n/* All bits will be zero or one (since bit is zero or one). */\nall = -bit;\n\nfor (i = 0; i < 256; )\n  {\n  byte = i >> 3;\n  if ((i & 0x7) == 0 && bits[byte] == all)\n    i += 8;\n  else\n    {\n    cbit = (bits[byte] >> (i & 0x7)) & 0x1;\n    if (cbit != bit)\n      {\n      if (length >= MAX_RANGE_SIZE)\n        return FALSE;\n      ranges[length] = i;\n      length++;\n      bit = cbit;\n      all = -cbit;\n      }\n    i++;\n    }\n  }\n\nif (((bit == 0) && nclass) || ((bit == 1) && !nclass))\n  {\n  if (length >= MAX_RANGE_SIZE)\n    return FALSE;\n  ranges[length] = 256;\n  length++;\n  }\n\nif (length < 0 || length > 4)\n  return FALSE;\n\nbit = bits[0] & 0x1;\nif (invert) bit ^= 0x1;\n\n/* No character is accepted. */\nif (length == 0 && bit == 0)\n  add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n\nswitch(length)\n  {\n  case 0:\n  /* When bit != 0, all characters are accepted. */\n  return TRUE;\n\n  case 1:\n  add_jump(compiler, backtracks, CMP(bit == 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));\n  return TRUE;\n\n  case 2:\n  if (ranges[0] + 1 != ranges[1])\n    {\n    OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);\n    add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));\n    }\n  else\n    add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));\n  return TRUE;\n\n  case 3:\n  if (bit != 0)\n    {\n    add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2]));\n    if (ranges[0] + 1 != ranges[1])\n      {\n      OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);\n      add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));\n      }\n    else\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));\n    return TRUE;\n    }\n\n  add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[0]));\n  if (ranges[1] + 1 != ranges[2])\n    {\n    OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1]);\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1]));\n    }\n  else\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1]));\n  return TRUE;\n\n  case 4:\n  if ((ranges[1] - ranges[0]) == (ranges[3] - ranges[2])\n      && (ranges[0] | (ranges[2] - ranges[0])) == ranges[2]\n      && (ranges[1] & (ranges[2] - ranges[0])) == 0\n      && is_powerof2(ranges[2] - ranges[0]))\n    {\n    SLJIT_ASSERT((ranges[0] & (ranges[2] - ranges[0])) == 0 && (ranges[2] & ranges[3] & (ranges[2] - ranges[0])) != 0);\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[0]);\n    if (ranges[2] + 1 != ranges[3])\n      {\n      OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2]);\n      add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_LESS : SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2]));\n      }\n    else\n      add_jump(compiler, backtracks, CMP(bit != 0 ? SLJIT_EQUAL : SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2]));\n    return TRUE;\n    }\n\n  if (bit != 0)\n    {\n    i = 0;\n    if (ranges[0] + 1 != ranges[1])\n      {\n      OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);\n      add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));\n      i = ranges[0];\n      }\n    else\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[0]));\n\n    if (ranges[2] + 1 != ranges[3])\n      {\n      OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[2] - i);\n      add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[2]));\n      }\n    else\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[2] - i));\n    return TRUE;\n    }\n\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[0]);\n  add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, ranges[3] - ranges[0]));\n  if (ranges[1] + 1 != ranges[2])\n    {\n    OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]);\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, ranges[2] - ranges[1]));\n    }\n  else\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, ranges[1] - ranges[0]));\n  return TRUE;\n\n  default:\n  SLJIT_UNREACHABLE();\n  return FALSE;\n  }\n}\n\nstatic void check_anynewline(compiler_common *common)\n{\n/* Check whether TMP1 contains a newline character. TMP2 destroyed. */\nDEFINE_COMPILER;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\n\nOP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);\nOP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);\nOP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n#ifdef COMPILE_PCRE8\nif (common->utf)\n  {\n#endif\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);\n#ifdef COMPILE_PCRE8\n  }\n#endif\n#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */\nOP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\nstatic void check_hspace(compiler_common *common)\n{\n/* Check whether TMP1 contains a newline character. TMP2 destroyed. */\nDEFINE_COMPILER;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\n\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x09);\nOP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20);\nOP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0);\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n#ifdef COMPILE_PCRE8\nif (common->utf)\n  {\n#endif\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x1680);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2000);\n  OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000);\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000);\n#ifdef COMPILE_PCRE8\n  }\n#endif\n#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */\nOP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\n\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\nstatic void check_vspace(compiler_common *common)\n{\n/* Check whether TMP1 contains a newline character. TMP2 destroyed. */\nDEFINE_COMPILER;\n\nsljit_emit_fast_enter(compiler, RETURN_ADDR, 0);\n\nOP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a);\nOP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a);\nOP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\nOP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a);\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n#ifdef COMPILE_PCRE8\nif (common->utf)\n  {\n#endif\n  OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n  OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a);\n#ifdef COMPILE_PCRE8\n  }\n#endif\n#endif /* SUPPORT_UTF || COMPILE_PCRE16 || COMPILE_PCRE32 */\nOP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\n\nsljit_emit_fast_return(compiler, RETURN_ADDR, 0);\n}\n\nstatic void do_casefulcmp(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\nstruct sljit_label *label;\nint char1_reg;\nint char2_reg;\n\nif (sljit_get_register_index(TMP3) < 0)\n  {\n  char1_reg = STR_END;\n  char2_reg = STACK_TOP;\n  }\nelse\n  {\n  char1_reg = TMP3;\n  char2_reg = RETURN_ADDR;\n  }\n\nsljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);\nOP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n\nif (char1_reg == STR_END)\n  {\n  OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0);\n  OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0);\n  }\n\nif (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)\n  {\n  label = LABEL();\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));\n  JUMPTO(SLJIT_NOT_ZERO, label);\n\n  JUMPHERE(jump);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n  }\nelse if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)\n  {\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n  label = LABEL();\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));\n  JUMPTO(SLJIT_NOT_ZERO, label);\n\n  JUMPHERE(jump);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  }\nelse\n  {\n  label = LABEL();\n  OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);\n  OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);\n  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));\n  JUMPTO(SLJIT_NOT_ZERO, label);\n\n  JUMPHERE(jump);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n  }\n\nif (char1_reg == STR_END)\n  {\n  OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0);\n  OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0);\n  }\n\nsljit_emit_fast_return(compiler, TMP1, 0);\n}\n\nstatic void do_caselesscmp(compiler_common *common)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\nstruct sljit_label *label;\nint char1_reg = STR_END;\nint char2_reg;\nint lcc_table;\nint opt_type = 0;\n\nif (sljit_get_register_index(TMP3) < 0)\n  {\n  char2_reg = STACK_TOP;\n  lcc_table = STACK_LIMIT;\n  }\nelse\n  {\n  char2_reg = RETURN_ADDR;\n  lcc_table = TMP3;\n  }\n\nif (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)\n  opt_type = 1;\nelse if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS)\n  opt_type = 2;\n\nsljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);\nOP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0);\n\nif (char2_reg == STACK_TOP)\n  {\n  OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0);\n  OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0);\n  }\n\nOP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc);\n\nif (opt_type == 1)\n  {\n  label = LABEL();\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n  }\nelse if (opt_type == 2)\n  {\n  OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n  label = LABEL();\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1));\n  sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n  }\nelse\n  {\n  label = LABEL();\n  OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0);\n  OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0);\n  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1));\n  }\n\n#ifndef COMPILE_PCRE8\njump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255);\n#endif\nOP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0);\n#ifndef COMPILE_PCRE8\nJUMPHERE(jump);\njump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255);\n#endif\nOP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0);\n#ifndef COMPILE_PCRE8\nJUMPHERE(jump);\n#endif\n\nif (opt_type == 0)\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\njump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0);\nOP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1));\nJUMPTO(SLJIT_NOT_ZERO, label);\n\nJUMPHERE(jump);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n\nif (opt_type == 2)\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\nif (char2_reg == STACK_TOP)\n  {\n  OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0);\n  OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0);\n  }\n\nOP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);\nsljit_emit_fast_return(compiler, TMP1, 0);\n}\n\n#if defined SUPPORT_UTF && defined SUPPORT_UCP\n\nstatic const pcre_uchar * SLJIT_FUNC do_utf_caselesscmp(pcre_uchar *src1, pcre_uchar *src2, pcre_uchar *end1, pcre_uchar *end2)\n{\n/* This function would be ineffective to do in JIT level. */\nsljit_u32 c1, c2;\nconst ucd_record *ur;\nconst sljit_u32 *pp;\n\nwhile (src1 < end1)\n  {\n  if (src2 >= end2)\n    return (pcre_uchar*)1;\n  GETCHARINC(c1, src1);\n  GETCHARINC(c2, src2);\n  ur = GET_UCD(c2);\n  if (c1 != c2 && c1 != c2 + ur->other_case)\n    {\n    pp = PRIV(ucd_caseless_sets) + ur->caseset;\n    for (;;)\n      {\n      if (c1 < *pp) return NULL;\n      if (c1 == *pp++) break;\n      }\n    }\n  }\nreturn src2;\n}\n\n#endif /* SUPPORT_UTF && SUPPORT_UCP */\n\nstatic pcre_uchar *byte_sequence_compare(compiler_common *common, BOOL caseless, pcre_uchar *cc,\n    compare_context *context, jump_list **backtracks)\n{\nDEFINE_COMPILER;\nunsigned int othercasebit = 0;\npcre_uchar *othercasechar = NULL;\n#ifdef SUPPORT_UTF\nint utflength;\n#endif\n\nif (caseless && char_has_othercase(common, cc))\n  {\n  othercasebit = char_get_othercase_bit(common, cc);\n  SLJIT_ASSERT(othercasebit);\n  /* Extracting bit difference info. */\n#if defined COMPILE_PCRE8\n  othercasechar = cc + (othercasebit >> 8);\n  othercasebit &= 0xff;\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  /* Note that this code only handles characters in the BMP. If there\n  ever are characters outside the BMP whose othercase differs in only one\n  bit from itself (there currently are none), this code will need to be\n  revised for COMPILE_PCRE32. */\n  othercasechar = cc + (othercasebit >> 9);\n  if ((othercasebit & 0x100) != 0)\n    othercasebit = (othercasebit & 0xff) << 8;\n  else\n    othercasebit &= 0xff;\n#endif /* COMPILE_PCRE[8|16|32] */\n  }\n\nif (context->sourcereg == -1)\n  {\n#if defined COMPILE_PCRE8\n#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED\n  if (context->length >= 4)\n    OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n  else if (context->length >= 2)\n    OP1(SLJIT_MOV_U16, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n  else\n#endif\n    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n#elif defined COMPILE_PCRE16\n#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED\n  if (context->length >= 4)\n    OP1(SLJIT_MOV_S32, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n  else\n#endif\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n#elif defined COMPILE_PCRE32\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length);\n#endif /* COMPILE_PCRE[8|16|32] */\n  context->sourcereg = TMP2;\n  }\n\n#ifdef SUPPORT_UTF\nutflength = 1;\nif (common->utf && HAS_EXTRALEN(*cc))\n  utflength += GET_EXTRALEN(*cc);\n\ndo\n  {\n#endif\n\n  context->length -= IN_UCHARS(1);\n#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED) && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16)\n\n  /* Unaligned read is supported. */\n  if (othercasebit != 0 && othercasechar == cc)\n    {\n    context->c.asuchars[context->ucharptr] = *cc | othercasebit;\n    context->oc.asuchars[context->ucharptr] = othercasebit;\n    }\n  else\n    {\n    context->c.asuchars[context->ucharptr] = *cc;\n    context->oc.asuchars[context->ucharptr] = 0;\n    }\n  context->ucharptr++;\n\n#if defined COMPILE_PCRE8\n  if (context->ucharptr >= 4 || context->length == 0 || (context->ucharptr == 2 && context->length == 1))\n#else\n  if (context->ucharptr >= 2 || context->length == 0)\n#endif\n    {\n    if (context->length >= 4)\n      OP1(SLJIT_MOV_S32, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);\n    else if (context->length >= 2)\n      OP1(SLJIT_MOV_U16, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);\n#if defined COMPILE_PCRE8\n    else if (context->length >= 1)\n      OP1(SLJIT_MOV_U8, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);\n#endif /* COMPILE_PCRE8 */\n    context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1;\n\n    switch(context->ucharptr)\n      {\n      case 4 / sizeof(pcre_uchar):\n      if (context->oc.asint != 0)\n        OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asint);\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asint | context->oc.asint));\n      break;\n\n      case 2 / sizeof(pcre_uchar):\n      if (context->oc.asushort != 0)\n        OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asushort);\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asushort | context->oc.asushort));\n      break;\n\n#ifdef COMPILE_PCRE8\n      case 1:\n      if (context->oc.asbyte != 0)\n        OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asbyte);\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asbyte | context->oc.asbyte));\n      break;\n#endif\n\n      default:\n      SLJIT_UNREACHABLE();\n      break;\n      }\n    context->ucharptr = 0;\n    }\n\n#else\n\n  /* Unaligned read is unsupported or in 32 bit mode. */\n  if (context->length >= 1)\n    OP1(MOV_UCHAR, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length);\n\n  context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1;\n\n  if (othercasebit != 0 && othercasechar == cc)\n    {\n    OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, othercasebit);\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc | othercasebit));\n    }\n  else\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc));\n\n#endif\n\n  cc++;\n#ifdef SUPPORT_UTF\n  utflength--;\n  }\nwhile (utflength > 0);\n#endif\n\nreturn cc;\n}\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n\n#define SET_TYPE_OFFSET(value) \\\n  if ((value) != typeoffset) \\\n    { \\\n    if ((value) < typeoffset) \\\n      OP2(SLJIT_ADD, typereg, 0, typereg, 0, SLJIT_IMM, typeoffset - (value)); \\\n    else \\\n      OP2(SLJIT_SUB, typereg, 0, typereg, 0, SLJIT_IMM, (value) - typeoffset); \\\n    } \\\n  typeoffset = (value);\n\n#define SET_CHAR_OFFSET(value) \\\n  if ((value) != charoffset) \\\n    { \\\n    if ((value) < charoffset) \\\n      OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(charoffset - (value))); \\\n    else \\\n      OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)((value) - charoffset)); \\\n    } \\\n  charoffset = (value);\n\nstatic pcre_uchar *compile_char1_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks, BOOL check_str_ptr);\n\nstatic void compile_xclass_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks)\n{\nDEFINE_COMPILER;\njump_list *found = NULL;\njump_list **list = (cc[0] & XCL_NOT) == 0 ? &found : backtracks;\nsljit_uw c, charoffset, max = 256, min = READ_CHAR_MAX;\nstruct sljit_jump *jump = NULL;\npcre_uchar *ccbegin;\nint compares, invertcmp, numberofcmps;\n#if defined SUPPORT_UTF && (defined COMPILE_PCRE8 || defined COMPILE_PCRE16)\nBOOL utf = common->utf;\n#endif\n\n#ifdef SUPPORT_UCP\nBOOL needstype = FALSE, needsscript = FALSE, needschar = FALSE;\nBOOL charsaved = FALSE;\nint typereg = TMP1;\nconst sljit_u32 *other_cases;\nsljit_uw typeoffset;\n#endif\n\n/* Scanning the necessary info. */\ncc++;\nccbegin = cc;\ncompares = 0;\nif (cc[-1] & XCL_MAP)\n  {\n  min = 0;\n  cc += 32 / sizeof(pcre_uchar);\n  }\n\nwhile (*cc != XCL_END)\n  {\n  compares++;\n  if (*cc == XCL_SINGLE)\n    {\n    cc ++;\n    GETCHARINCTEST(c, cc);\n    if (c > max) max = c;\n    if (c < min) min = c;\n#ifdef SUPPORT_UCP\n    needschar = TRUE;\n#endif\n    }\n  else if (*cc == XCL_RANGE)\n    {\n    cc ++;\n    GETCHARINCTEST(c, cc);\n    if (c < min) min = c;\n    GETCHARINCTEST(c, cc);\n    if (c > max) max = c;\n#ifdef SUPPORT_UCP\n    needschar = TRUE;\n#endif\n    }\n#ifdef SUPPORT_UCP\n  else\n    {\n    SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);\n    cc++;\n    if (*cc == PT_CLIST)\n      {\n      other_cases = PRIV(ucd_caseless_sets) + cc[1];\n      while (*other_cases != NOTACHAR)\n        {\n        if (*other_cases > max) max = *other_cases;\n        if (*other_cases < min) min = *other_cases;\n        other_cases++;\n        }\n      }\n    else\n      {\n      max = READ_CHAR_MAX;\n      min = 0;\n      }\n\n    switch(*cc)\n      {\n      case PT_ANY:\n      /* Any either accepts everything or ignored. */\n      if (cc[-1] == XCL_PROP)\n        {\n        compile_char1_matchingpath(common, OP_ALLANY, cc, backtracks, FALSE);\n        if (list == backtracks)\n          add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n        return;\n        }\n      break;\n\n      case PT_LAMP:\n      case PT_GC:\n      case PT_PC:\n      case PT_ALNUM:\n      needstype = TRUE;\n      break;\n\n      case PT_SC:\n      needsscript = TRUE;\n      break;\n\n      case PT_SPACE:\n      case PT_PXSPACE:\n      case PT_WORD:\n      case PT_PXGRAPH:\n      case PT_PXPRINT:\n      case PT_PXPUNCT:\n      needstype = TRUE;\n      needschar = TRUE;\n      break;\n\n      case PT_CLIST:\n      case PT_UCNC:\n      needschar = TRUE;\n      break;\n\n      default:\n      SLJIT_UNREACHABLE();\n      break;\n      }\n    cc += 2;\n    }\n#endif\n  }\nSLJIT_ASSERT(compares > 0);\n\n/* We are not necessary in utf mode even in 8 bit mode. */\ncc = ccbegin;\nread_char_range(common, min, max, (cc[-1] & XCL_NOT) != 0);\n\nif ((cc[-1] & XCL_HASPROP) == 0)\n  {\n  if ((cc[-1] & XCL_MAP) != 0)\n    {\n    jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n    if (!check_class_ranges(common, (const sljit_u8 *)cc, (((const sljit_u8 *)cc)[31] & 0x80) != 0, TRUE, &found))\n      {\n      OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);\n      OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);\n      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);\n      OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);\n      OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);\n      add_jump(compiler, &found, JUMP(SLJIT_NOT_ZERO));\n      }\n\n    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n    JUMPHERE(jump);\n\n    cc += 32 / sizeof(pcre_uchar);\n    }\n  else\n    {\n    OP2(SLJIT_SUB, TMP2, 0, TMP1, 0, SLJIT_IMM, min);\n    add_jump(compiler, (cc[-1] & XCL_NOT) == 0 ? backtracks : &found, CMP(SLJIT_GREATER, TMP2, 0, SLJIT_IMM, max - min));\n    }\n  }\nelse if ((cc[-1] & XCL_MAP) != 0)\n  {\n  OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);\n#ifdef SUPPORT_UCP\n  charsaved = TRUE;\n#endif\n  if (!check_class_ranges(common, (const sljit_u8 *)cc, FALSE, TRUE, list))\n    {\n#ifdef COMPILE_PCRE8\n    jump = NULL;\n    if (common->utf)\n#endif\n      jump = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n\n    OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);\n    OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);\n    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);\n    OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);\n    OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);\n    add_jump(compiler, list, JUMP(SLJIT_NOT_ZERO));\n\n#ifdef COMPILE_PCRE8\n    if (common->utf)\n#endif\n      JUMPHERE(jump);\n    }\n\n  OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);\n  cc += 32 / sizeof(pcre_uchar);\n  }\n\n#ifdef SUPPORT_UCP\nif (needstype || needsscript)\n  {\n  if (needschar && !charsaved)\n    OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0);\n\n#ifdef COMPILE_PCRE32\n  if (!common->utf)\n    {\n    jump = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0x10ffff + 1);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, INVALID_UTF_CHAR);\n    JUMPHERE(jump);\n    }\n#endif\n\n  OP2(SLJIT_LSHR, TMP2, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_stage1));\n  OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, UCD_BLOCK_MASK);\n  OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, UCD_BLOCK_SHIFT);\n  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_stage2));\n  OP1(SLJIT_MOV_U16, TMP2, 0, SLJIT_MEM2(TMP2, TMP1), 1);\n\n  /* Before anything else, we deal with scripts. */\n  if (needsscript)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, script));\n    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);\n\n    ccbegin = cc;\n\n    while (*cc != XCL_END)\n      {\n      if (*cc == XCL_SINGLE)\n        {\n        cc ++;\n        GETCHARINCTEST(c, cc);\n        }\n      else if (*cc == XCL_RANGE)\n        {\n        cc ++;\n        GETCHARINCTEST(c, cc);\n        GETCHARINCTEST(c, cc);\n        }\n      else\n        {\n        SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);\n        cc++;\n        if (*cc == PT_SC)\n          {\n          compares--;\n          invertcmp = (compares == 0 && list != backtracks);\n          if (cc[-1] == XCL_NOTPROP)\n            invertcmp ^= 0x1;\n          jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (int)cc[1]);\n          add_jump(compiler, compares > 0 ? list : backtracks, jump);\n          }\n        cc += 2;\n        }\n      }\n\n    cc = ccbegin;\n    }\n\n  if (needschar)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);\n    }\n\n  if (needstype)\n    {\n    if (!needschar)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));\n      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM2(TMP1, TMP2), 3);\n      }\n    else\n      {\n      OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);\n      OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));\n      typereg = RETURN_ADDR;\n      }\n    }\n  }\n#endif\n\n/* Generating code. */\ncharoffset = 0;\nnumberofcmps = 0;\n#ifdef SUPPORT_UCP\ntypeoffset = 0;\n#endif\n\nwhile (*cc != XCL_END)\n  {\n  compares--;\n  invertcmp = (compares == 0 && list != backtracks);\n  jump = NULL;\n\n  if (*cc == XCL_SINGLE)\n    {\n    cc ++;\n    GETCHARINCTEST(c, cc);\n\n    if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE))\n      {\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n      numberofcmps++;\n      }\n    else if (numberofcmps > 0)\n      {\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      numberofcmps = 0;\n      }\n    else\n      {\n      jump = CMP(SLJIT_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      numberofcmps = 0;\n      }\n    }\n  else if (*cc == XCL_RANGE)\n    {\n    cc ++;\n    GETCHARINCTEST(c, cc);\n    SET_CHAR_OFFSET(c);\n    GETCHARINCTEST(c, cc);\n\n    if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE))\n      {\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      OP_FLAGS(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n      numberofcmps++;\n      }\n    else if (numberofcmps > 0)\n      {\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      numberofcmps = 0;\n      }\n    else\n      {\n      jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, (sljit_sw)(c - charoffset));\n      numberofcmps = 0;\n      }\n    }\n#ifdef SUPPORT_UCP\n  else\n    {\n    SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP);\n    if (*cc == XCL_NOTPROP)\n      invertcmp ^= 0x1;\n    cc++;\n    switch(*cc)\n      {\n      case PT_ANY:\n      if (!invertcmp)\n        jump = JUMP(SLJIT_JUMP);\n      break;\n\n      case PT_LAMP:\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      case PT_GC:\n      c = PRIV(ucp_typerange)[(int)cc[1] * 2];\n      SET_TYPE_OFFSET(c);\n      jump = CMP(SLJIT_LESS_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, PRIV(ucp_typerange)[(int)cc[1] * 2 + 1] - c);\n      break;\n\n      case PT_PC:\n      jump = CMP(SLJIT_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, (int)cc[1] - typeoffset);\n      break;\n\n      case PT_SC:\n      compares++;\n      /* Do nothing. */\n      break;\n\n      case PT_SPACE:\n      case PT_PXSPACE:\n      SET_CHAR_OFFSET(9);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd - 0x9);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x9);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x9);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      SET_TYPE_OFFSET(ucp_Zl);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      case PT_WORD:\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_UNDERSCORE - charoffset));\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n      /* Fall through. */\n\n      case PT_ALNUM:\n      SET_TYPE_OFFSET(ucp_Ll);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll);\n      OP_FLAGS((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n      SET_TYPE_OFFSET(ucp_Nd);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      case PT_CLIST:\n      other_cases = PRIV(ucd_caseless_sets) + cc[1];\n\n      /* At least three characters are required.\n         Otherwise this case would be handled by the normal code path. */\n      SLJIT_ASSERT(other_cases[0] != NOTACHAR && other_cases[1] != NOTACHAR && other_cases[2] != NOTACHAR);\n      SLJIT_ASSERT(other_cases[0] < other_cases[1] && other_cases[1] < other_cases[2]);\n\n      /* Optimizing character pairs, if their difference is power of 2. */\n      if (is_powerof2(other_cases[1] ^ other_cases[0]))\n        {\n        if (charoffset == 0)\n          OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);\n        else\n          {\n          OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset);\n          OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);\n          }\n        OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[1]);\n        OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n        other_cases += 2;\n        }\n      else if (is_powerof2(other_cases[2] ^ other_cases[1]))\n        {\n        if (charoffset == 0)\n          OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, other_cases[2] ^ other_cases[1]);\n        else\n          {\n          OP2(SLJIT_ADD, TMP2, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)charoffset);\n          OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, other_cases[1] ^ other_cases[0]);\n          }\n        OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, other_cases[2]);\n        OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n\n        OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(other_cases[0] - charoffset));\n        OP_FLAGS(SLJIT_OR | ((other_cases[3] == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL);\n\n        other_cases += 3;\n        }\n      else\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset));\n        OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n        }\n\n      while (*other_cases != NOTACHAR)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(*other_cases++ - charoffset));\n        OP_FLAGS(SLJIT_OR | ((*other_cases == NOTACHAR) ? SLJIT_SET_Z : 0), TMP2, 0, SLJIT_EQUAL);\n        }\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      case PT_UCNC:\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_DOLLAR_SIGN - charoffset));\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_EQUAL);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_COMMERCIAL_AT - charoffset));\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(CHAR_GRAVE_ACCENT - charoffset));\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      SET_CHAR_OFFSET(0xa0);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (sljit_sw)(0xd7ff - charoffset));\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_LESS_EQUAL);\n      SET_CHAR_OFFSET(0);\n      OP2(SLJIT_SUB | SLJIT_SET_GREATER_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xe000 - 0);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_GREATER_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      case PT_PXGRAPH:\n      /* C and Z groups are the farthest two groups. */\n      SET_TYPE_OFFSET(ucp_Ll);\n      OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);\n\n      jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);\n\n      /* In case of ucp_Cf, we overwrite the result. */\n      SET_CHAR_OFFSET(0x2066);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e - 0x2066);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      JUMPHERE(jump);\n      jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);\n      break;\n\n      case PT_PXPRINT:\n      /* C and Z groups are the farthest two groups. */\n      SET_TYPE_OFFSET(ucp_Ll);\n      OP2(SLJIT_SUB | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Ll);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_GREATER);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Ll);\n      OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_NOT_EQUAL);\n\n      jump = CMP(SLJIT_NOT_EQUAL, typereg, 0, SLJIT_IMM, ucp_Cf - ucp_Ll);\n\n      /* In case of ucp_Cf, we overwrite the result. */\n      SET_CHAR_OFFSET(0x2066);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2069 - 0x2066);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x061c - 0x2066);\n      OP_FLAGS(SLJIT_OR, TMP2, 0, SLJIT_EQUAL);\n\n      JUMPHERE(jump);\n      jump = CMP(SLJIT_ZERO ^ invertcmp, TMP2, 0, SLJIT_IMM, 0);\n      break;\n\n      case PT_PXPUNCT:\n      SET_TYPE_OFFSET(ucp_Sc);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_So - ucp_Sc);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS_EQUAL);\n\n      SET_CHAR_OFFSET(0);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x7f);\n      OP_FLAGS(SLJIT_AND, TMP2, 0, SLJIT_LESS_EQUAL);\n\n      SET_TYPE_OFFSET(ucp_Pc);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS_EQUAL, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ps - ucp_Pc);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_LESS_EQUAL);\n      jump = JUMP(SLJIT_NOT_ZERO ^ invertcmp);\n      break;\n\n      default:\n      SLJIT_UNREACHABLE();\n      break;\n      }\n    cc += 2;\n    }\n#endif\n\n  if (jump != NULL)\n    add_jump(compiler, compares > 0 ? list : backtracks, jump);\n  }\n\nif (found != NULL)\n  set_jumps(found, LABEL());\n}\n\n#undef SET_TYPE_OFFSET\n#undef SET_CHAR_OFFSET\n\n#endif\n\nstatic pcre_uchar *compile_simple_assertion_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks)\n{\nDEFINE_COMPILER;\nint length;\nstruct sljit_jump *jump[4];\n#ifdef SUPPORT_UTF\nstruct sljit_label *label;\n#endif /* SUPPORT_UTF */\n\nswitch(type)\n  {\n  case OP_SOD:\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));\n  return cc;\n\n  case OP_SOM:\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, TMP1, 0));\n  return cc;\n\n  case OP_NOT_WORD_BOUNDARY:\n  case OP_WORD_BOUNDARY:\n  add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL));\n  sljit_set_current_flags(compiler, SLJIT_SET_Z);\n  add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_NOT_ZERO : SLJIT_ZERO));\n  return cc;\n\n  case OP_EODN:\n  /* Requires rather complex checks. */\n  jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  if (common->nltype == NLTYPE_FIXED && common->newline > 255)\n    {\n    OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    if (common->mode == JIT_COMPILE)\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0));\n    else\n      {\n      jump[1] = CMP(SLJIT_EQUAL, TMP2, 0, STR_END, 0);\n      OP2(SLJIT_SUB | SLJIT_SET_LESS, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0);\n      OP_FLAGS(SLJIT_MOV, TMP2, 0, SLJIT_LESS);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);\n      OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_NOT_EQUAL);\n      add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL));\n      check_partial(common, TRUE);\n      add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n      JUMPHERE(jump[1]);\n      }\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));\n    }\n  else if (common->nltype == NLTYPE_FIXED)\n    {\n    OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_END, 0));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline));\n    }\n  else\n    {\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);\n    OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\n    OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_GREATER, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0);\n    jump[2] = JUMP(SLJIT_GREATER);\n    add_jump(compiler, backtracks, JUMP(SLJIT_NOT_EQUAL) /* LESS */);\n    /* Equal. */\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n    jump[3] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);\n    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n\n    JUMPHERE(jump[1]);\n    if (common->nltype == NLTYPE_ANYCRLF)\n      {\n      OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n      add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, STR_END, 0));\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL));\n      }\n    else\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STR_PTR, 0);\n      read_char_range(common, common->nlmin, common->nlmax, TRUE);\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, STR_END, 0));\n      add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL));\n      sljit_set_current_flags(compiler, SLJIT_SET_Z);\n      add_jump(compiler, backtracks, JUMP(SLJIT_ZERO));\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);\n      }\n    JUMPHERE(jump[2]);\n    JUMPHERE(jump[3]);\n    }\n  JUMPHERE(jump[0]);\n  check_partial(common, FALSE);\n  return cc;\n\n  case OP_EOD:\n  add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));\n  check_partial(common, FALSE);\n  return cc;\n\n  case OP_DOLL:\n  OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n\n  if (!common->endonly)\n    compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks);\n  else\n    {\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0));\n    check_partial(common, FALSE);\n    }\n  return cc;\n\n  case OP_DOLLM:\n  jump[1] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);\n  OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n  check_partial(common, FALSE);\n  jump[0] = JUMP(SLJIT_JUMP);\n  JUMPHERE(jump[1]);\n\n  if (common->nltype == NLTYPE_FIXED && common->newline > 255)\n    {\n    OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n    if (common->mode == JIT_COMPILE)\n      add_jump(compiler, backtracks, CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0));\n    else\n      {\n      jump[1] = CMP(SLJIT_LESS_EQUAL, TMP2, 0, STR_END, 0);\n      /* STR_PTR = STR_END - IN_UCHARS(1) */\n      add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));\n      check_partial(common, TRUE);\n      add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n      JUMPHERE(jump[1]);\n      }\n\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));\n    }\n  else\n    {\n    peek_char(common, common->nlmax);\n    check_newlinechar(common, common->nltype, backtracks, FALSE);\n    }\n  JUMPHERE(jump[0]);\n  return cc;\n\n  case OP_CIRC:\n  OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));\n  add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0));\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n  return cc;\n\n  case OP_CIRCM:\n  OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin));\n  jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n  jump[0] = JUMP(SLJIT_JUMP);\n  JUMPHERE(jump[1]);\n\n  add_jump(compiler, backtracks, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n  if (common->nltype == NLTYPE_FIXED && common->newline > 255)\n    {\n    OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2));\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS, TMP2, 0, TMP1, 0));\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2));\n    OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff));\n    }\n  else\n    {\n    skip_char_back(common);\n    read_char_range(common, common->nlmin, common->nlmax, TRUE);\n    check_newlinechar(common, common->nltype, backtracks, FALSE);\n    }\n  JUMPHERE(jump[0]);\n  return cc;\n\n  case OP_REVERSE:\n  length = GET(cc, 0);\n  if (length == 0)\n    return cc + LINK_SIZE;\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n#ifdef SUPPORT_UTF\n  if (common->utf)\n    {\n    OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length);\n    label = LABEL();\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP3, 0));\n    skip_char_back(common);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, label);\n    }\n  else\n#endif\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin));\n    OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS, STR_PTR, 0, TMP1, 0));\n    }\n  check_start_used_ptr(common);\n  return cc + LINK_SIZE;\n  }\nSLJIT_UNREACHABLE();\nreturn cc;\n}\n\nstatic pcre_uchar *compile_char1_matchingpath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks, BOOL check_str_ptr)\n{\nDEFINE_COMPILER;\nint length;\nunsigned int c, oc, bit;\ncompare_context context;\nstruct sljit_jump *jump[3];\njump_list *end_list;\n#ifdef SUPPORT_UTF\nstruct sljit_label *label;\n#ifdef SUPPORT_UCP\npcre_uchar propdata[5];\n#endif\n#endif /* SUPPORT_UTF */\n\nswitch(type)\n  {\n  case OP_NOT_DIGIT:\n  case OP_DIGIT:\n  /* Digits are usually 0-9, so it is worth to optimize them. */\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n  if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_digit, FALSE))\n    read_char7_type(common, type == OP_NOT_DIGIT);\n  else\n#endif\n    read_char8_type(common, type == OP_NOT_DIGIT);\n    /* Flip the starting bit in the negative case. */\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit);\n  add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_ZERO : SLJIT_NOT_ZERO));\n  return cc;\n\n  case OP_NOT_WHITESPACE:\n  case OP_WHITESPACE:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n  if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_space, FALSE))\n    read_char7_type(common, type == OP_NOT_WHITESPACE);\n  else\n#endif\n    read_char8_type(common, type == OP_NOT_WHITESPACE);\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space);\n  add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_ZERO : SLJIT_NOT_ZERO));\n  return cc;\n\n  case OP_NOT_WORDCHAR:\n  case OP_WORDCHAR:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n  if (common->utf && is_char7_bitset((const sljit_u8 *)common->ctypes - cbit_length + cbit_word, FALSE))\n    read_char7_type(common, type == OP_NOT_WORDCHAR);\n  else\n#endif\n    read_char8_type(common, type == OP_NOT_WORDCHAR);\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word);\n  add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_ZERO : SLJIT_NOT_ZERO));\n  return cc;\n\n  case OP_ANY:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  read_char_range(common, common->nlmin, common->nlmax, TRUE);\n  if (common->nltype == NLTYPE_FIXED && common->newline > 255)\n    {\n    jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff);\n    end_list = NULL;\n    if (common->mode != JIT_PARTIAL_HARD_COMPILE)\n      add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n    else\n      check_str_end(common, &end_list);\n\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff));\n    set_jumps(end_list, LABEL());\n    JUMPHERE(jump[0]);\n    }\n  else\n    check_newlinechar(common, common->nltype, backtracks, TRUE);\n  return cc;\n\n  case OP_ALLANY:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n#ifdef SUPPORT_UTF\n  if (common->utf)\n    {\n    OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16\n#if defined COMPILE_PCRE8\n    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);\n    OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n#elif defined COMPILE_PCRE16\n    jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xd800);\n    OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800);\n    OP_FLAGS(SLJIT_MOV, TMP1, 0, SLJIT_EQUAL);\n    OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n#endif\n    JUMPHERE(jump[0]);\n#endif /* COMPILE_PCRE[8|16] */\n    return cc;\n    }\n#endif\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  return cc;\n\n  case OP_ANYBYTE:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  return cc;\n\n#ifdef SUPPORT_UTF\n#ifdef SUPPORT_UCP\n  case OP_NOTPROP:\n  case OP_PROP:\n  propdata[0] = XCL_HASPROP;\n  propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP;\n  propdata[2] = cc[0];\n  propdata[3] = cc[1];\n  propdata[4] = XCL_END;\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  compile_xclass_matchingpath(common, propdata, backtracks);\n  return cc + 2;\n#endif\n#endif\n\n  case OP_ANYNL:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  read_char_range(common, common->bsr_nlmin, common->bsr_nlmax, FALSE);\n  jump[0] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR);\n  /* We don't need to handle soft partial matching case. */\n  end_list = NULL;\n  if (common->mode != JIT_PARTIAL_HARD_COMPILE)\n    add_jump(compiler, &end_list, CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0));\n  else\n    check_str_end(common, &end_list);\n  OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n  jump[1] = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  jump[2] = JUMP(SLJIT_JUMP);\n  JUMPHERE(jump[0]);\n  check_newlinechar(common, common->bsr_nltype, backtracks, FALSE);\n  set_jumps(end_list, LABEL());\n  JUMPHERE(jump[1]);\n  JUMPHERE(jump[2]);\n  return cc;\n\n  case OP_NOT_HSPACE:\n  case OP_HSPACE:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  read_char_range(common, 0x9, 0x3000, type == OP_NOT_HSPACE);\n  add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL));\n  sljit_set_current_flags(compiler, SLJIT_SET_Z);\n  add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));\n  return cc;\n\n  case OP_NOT_VSPACE:\n  case OP_VSPACE:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  read_char_range(common, 0xa, 0x2029, type == OP_NOT_VSPACE);\n  add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL));\n  sljit_set_current_flags(compiler, SLJIT_SET_Z);\n  add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_NOT_ZERO : SLJIT_ZERO));\n  return cc;\n\n#ifdef SUPPORT_UCP\n  case OP_EXTUNI:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  read_char(common);\n  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));\n  /* Optimize register allocation: use a real register. */\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);\n  OP1(SLJIT_MOV_U8, STACK_TOP, 0, SLJIT_MEM2(TMP1, TMP2), 3);\n\n  label = LABEL();\n  jump[0] = CMP(SLJIT_GREATER_EQUAL, STR_PTR, 0, STR_END, 0);\n  OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);\n  read_char(common);\n  add_jump(compiler, &common->getucd, JUMP(SLJIT_FAST_CALL));\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, gbprop));\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM2(TMP1, TMP2), 3);\n\n  OP2(SLJIT_SHL, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 2);\n  OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(STACK_TOP), (sljit_sw)PRIV(ucp_gbtable));\n  OP1(SLJIT_MOV, STACK_TOP, 0, TMP2, 0);\n  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);\n  JUMPTO(SLJIT_NOT_ZERO, label);\n\n  OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);\n  JUMPHERE(jump[0]);\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n\n  if (common->mode == JIT_PARTIAL_HARD_COMPILE)\n    {\n    jump[0] = CMP(SLJIT_LESS, STR_PTR, 0, STR_END, 0);\n    /* Since we successfully read a char above, partial matching must occure. */\n    check_partial(common, TRUE);\n    JUMPHERE(jump[0]);\n    }\n  return cc;\n#endif\n\n  case OP_CHAR:\n  case OP_CHARI:\n  length = 1;\n#ifdef SUPPORT_UTF\n  if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc);\n#endif\n  if (common->mode == JIT_COMPILE && check_str_ptr\n      && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0))\n    {\n    OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length));\n    add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));\n\n    context.length = IN_UCHARS(length);\n    context.sourcereg = -1;\n#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED\n    context.ucharptr = 0;\n#endif\n    return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks);\n    }\n\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n#ifdef SUPPORT_UTF\n  if (common->utf)\n    {\n    GETCHAR(c, cc);\n    }\n  else\n#endif\n    c = *cc;\n\n  if (type == OP_CHAR || !char_has_othercase(common, cc))\n    {\n    read_char_range(common, c, c, FALSE);\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c));\n    return cc + length;\n    }\n  oc = char_othercase(common, c);\n  read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, FALSE);\n  bit = c ^ oc;\n  if (is_powerof2(bit))\n    {\n    OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit);\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit));\n    return cc + length;\n    }\n  jump[0] = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c);\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, oc));\n  JUMPHERE(jump[0]);\n  return cc + length;\n\n  case OP_NOT:\n  case OP_NOTI:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  length = 1;\n#ifdef SUPPORT_UTF\n  if (common->utf)\n    {\n#ifdef COMPILE_PCRE8\n    c = *cc;\n    if (c < 128)\n      {\n      OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(STR_PTR), 0);\n      if (type == OP_NOT || !char_has_othercase(common, cc))\n        add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));\n      else\n        {\n        /* Since UTF8 code page is fixed, we know that c is in [a-z] or [A-Z] range. */\n        OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x20);\n        add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, c | 0x20));\n        }\n      /* Skip the variable-length character. */\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n      jump[0] = CMP(SLJIT_LESS, TMP1, 0, SLJIT_IMM, 0xc0);\n      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(utf8_table4) - 0xc0);\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0);\n      JUMPHERE(jump[0]);\n      return cc + 1;\n      }\n    else\n#endif /* COMPILE_PCRE8 */\n      {\n      GETCHARLEN(c, cc, length);\n      }\n    }\n  else\n#endif /* SUPPORT_UTF */\n    c = *cc;\n\n  if (type == OP_NOT || !char_has_othercase(common, cc))\n    {\n    read_char_range(common, c, c, TRUE);\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));\n    }\n  else\n    {\n    oc = char_othercase(common, c);\n    read_char_range(common, c < oc ? c : oc, c > oc ? c : oc, TRUE);\n    bit = c ^ oc;\n    if (is_powerof2(bit))\n      {\n      OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit);\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit));\n      }\n    else\n      {\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, c));\n      add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, oc));\n      }\n    }\n  return cc + length;\n\n  case OP_CLASS:\n  case OP_NCLASS:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n  bit = (common->utf && is_char7_bitset((const sljit_u8 *)cc, type == OP_NCLASS)) ? 127 : 255;\n  read_char_range(common, 0, bit, type == OP_NCLASS);\n#else\n  read_char_range(common, 0, 255, type == OP_NCLASS);\n#endif\n\n  if (check_class_ranges(common, (const sljit_u8 *)cc, type == OP_NCLASS, FALSE, backtracks))\n    return cc + 32 / sizeof(pcre_uchar);\n\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n  jump[0] = NULL;\n  if (common->utf)\n    {\n    jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, bit);\n    if (type == OP_CLASS)\n      {\n      add_jump(compiler, backtracks, jump[0]);\n      jump[0] = NULL;\n      }\n    }\n#elif !defined COMPILE_PCRE8\n  jump[0] = CMP(SLJIT_GREATER, TMP1, 0, SLJIT_IMM, 255);\n  if (type == OP_CLASS)\n    {\n    add_jump(compiler, backtracks, jump[0]);\n    jump[0] = NULL;\n    }\n#endif /* SUPPORT_UTF && COMPILE_PCRE8 */\n\n  OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7);\n  OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3);\n  OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)cc);\n  OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0);\n  OP2(SLJIT_AND | SLJIT_SET_Z, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0);\n  add_jump(compiler, backtracks, JUMP(SLJIT_ZERO));\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n  if (jump[0] != NULL)\n    JUMPHERE(jump[0]);\n#endif\n  return cc + 32 / sizeof(pcre_uchar);\n\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n  case OP_XCLASS:\n  if (check_str_ptr)\n    detect_partial_match(common, backtracks);\n  compile_xclass_matchingpath(common, cc + LINK_SIZE, backtracks);\n  return cc + GET(cc, 0) - 1;\n#endif\n  }\nSLJIT_UNREACHABLE();\nreturn cc;\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_charn_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, jump_list **backtracks)\n{\n/* This function consumes at least one input character. */\n/* To decrease the number of length checks, we try to concatenate the fixed length character sequences. */\nDEFINE_COMPILER;\npcre_uchar *ccbegin = cc;\ncompare_context context;\nint size;\n\ncontext.length = 0;\ndo\n  {\n  if (cc >= ccend)\n    break;\n\n  if (*cc == OP_CHAR)\n    {\n    size = 1;\n#ifdef SUPPORT_UTF\n    if (common->utf && HAS_EXTRALEN(cc[1]))\n      size += GET_EXTRALEN(cc[1]);\n#endif\n    }\n  else if (*cc == OP_CHARI)\n    {\n    size = 1;\n#ifdef SUPPORT_UTF\n    if (common->utf)\n      {\n      if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0)\n        size = 0;\n      else if (HAS_EXTRALEN(cc[1]))\n        size += GET_EXTRALEN(cc[1]);\n      }\n    else\n#endif\n    if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0)\n      size = 0;\n    }\n  else\n    size = 0;\n\n  cc += 1 + size;\n  context.length += IN_UCHARS(size);\n  }\nwhile (size > 0 && context.length <= 128);\n\ncc = ccbegin;\nif (context.length > 0)\n  {\n  /* We have a fixed-length byte sequence. */\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, context.length);\n  add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0));\n\n  context.sourcereg = -1;\n#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED\n  context.ucharptr = 0;\n#endif\n  do cc = byte_sequence_compare(common, *cc == OP_CHARI, cc + 1, &context, backtracks); while (context.length > 0);\n  return cc;\n  }\n\n/* A non-fixed length character will be checked if length == 0. */\nreturn compile_char1_matchingpath(common, *cc, cc + 1, backtracks, TRUE);\n}\n\n/* Forward definitions. */\nstatic void compile_matchingpath(compiler_common *, pcre_uchar *, pcre_uchar *, backtrack_common *);\nstatic void compile_backtrackingpath(compiler_common *, struct backtrack_common *);\n\n#define PUSH_BACKTRACK(size, ccstart, error) \\\n  do \\\n    { \\\n    backtrack = sljit_alloc_memory(compiler, (size)); \\\n    if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \\\n      return error; \\\n    memset(backtrack, 0, size); \\\n    backtrack->prev = parent->top; \\\n    backtrack->cc = (ccstart); \\\n    parent->top = backtrack; \\\n    } \\\n  while (0)\n\n#define PUSH_BACKTRACK_NOVALUE(size, ccstart) \\\n  do \\\n    { \\\n    backtrack = sljit_alloc_memory(compiler, (size)); \\\n    if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \\\n      return; \\\n    memset(backtrack, 0, size); \\\n    backtrack->prev = parent->top; \\\n    backtrack->cc = (ccstart); \\\n    parent->top = backtrack; \\\n    } \\\n  while (0)\n\n#define BACKTRACK_AS(type) ((type *)backtrack)\n\nstatic void compile_dnref_search(compiler_common *common, pcre_uchar *cc, jump_list **backtracks)\n{\n/* The OVECTOR offset goes to TMP2. */\nDEFINE_COMPILER;\nint count = GET2(cc, 1 + IMM2_SIZE);\npcre_uchar *slot = common->name_table + GET2(cc, 1) * common->name_entry_size;\nunsigned int offset;\njump_list *found = NULL;\n\nSLJIT_ASSERT(*cc == OP_DNREF || *cc == OP_DNREFI);\n\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));\n\ncount--;\nwhile (count-- > 0)\n  {\n  offset = GET2(slot, 0) << 1;\n  GET_LOCAL_BASE(TMP2, 0, OVECTOR(offset));\n  add_jump(compiler, &found, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0));\n  slot += common->name_entry_size;\n  }\n\noffset = GET2(slot, 0) << 1;\nGET_LOCAL_BASE(TMP2, 0, OVECTOR(offset));\nif (backtracks != NULL && !common->jscript_compat)\n  add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0));\n\nset_jumps(found, LABEL());\n}\n\nstatic void compile_ref_matchingpath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail)\n{\nDEFINE_COMPILER;\nBOOL ref = (*cc == OP_REF || *cc == OP_REFI);\nint offset = 0;\nstruct sljit_jump *jump = NULL;\nstruct sljit_jump *partial;\nstruct sljit_jump *nopartial;\n\nif (ref)\n  {\n  offset = GET2(cc, 1) << 1;\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n  /* OVECTOR(1) contains the \"string begin - 1\" constant. */\n  if (withchecks && !common->jscript_compat)\n    add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));\n  }\nelse\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);\n\n#if defined SUPPORT_UTF && defined SUPPORT_UCP\nif (common->utf && *cc == OP_REFI)\n  {\n  SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);\n  if (ref)\n    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n  else\n    OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n\n  if (withchecks)\n    jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0);\n\n  /* No free saved registers so save data on stack. */\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);\n  OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0);\n  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp));\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0);\n\n  if (common->mode == JIT_COMPILE)\n    add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1));\n  else\n    {\n    OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1);\n\n    add_jump(compiler, backtracks, JUMP(SLJIT_LESS));\n\n    nopartial = JUMP(SLJIT_NOT_EQUAL);\n    OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);\n    check_partial(common, FALSE);\n    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n    JUMPHERE(nopartial);\n    }\n  }\nelse\n#endif /* SUPPORT_UTF && SUPPORT_UCP */\n  {\n  if (ref)\n    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0);\n  else\n    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0);\n\n  if (withchecks)\n    jump = JUMP(SLJIT_ZERO);\n\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);\n  partial = CMP(SLJIT_GREATER, STR_PTR, 0, STR_END, 0);\n  if (common->mode == JIT_COMPILE)\n    add_jump(compiler, backtracks, partial);\n\n  add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL));\n  add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n\n  if (common->mode != JIT_COMPILE)\n    {\n    nopartial = JUMP(SLJIT_JUMP);\n    JUMPHERE(partial);\n    /* TMP2 -= STR_END - STR_PTR */\n    OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, STR_PTR, 0);\n    OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, STR_END, 0);\n    partial = CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0);\n    OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0);\n    add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL));\n    add_jump(compiler, backtracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\n    JUMPHERE(partial);\n    check_partial(common, FALSE);\n    add_jump(compiler, backtracks, JUMP(SLJIT_JUMP));\n    JUMPHERE(nopartial);\n    }\n  }\n\nif (jump != NULL)\n  {\n  if (emptyfail)\n    add_jump(compiler, backtracks, jump);\n  else\n    JUMPHERE(jump);\n  }\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_ref_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nBOOL ref = (*cc == OP_REF || *cc == OP_REFI);\nbacktrack_common *backtrack;\npcre_uchar type;\nint offset = 0;\nstruct sljit_label *label;\nstruct sljit_jump *zerolength;\nstruct sljit_jump *jump = NULL;\npcre_uchar *ccbegin = cc;\nint min = 0, max = 0;\nBOOL minimize;\n\nPUSH_BACKTRACK(sizeof(ref_iterator_backtrack), cc, NULL);\n\nif (ref)\n  offset = GET2(cc, 1) << 1;\nelse\n  cc += IMM2_SIZE;\ntype = cc[1 + IMM2_SIZE];\n\nSLJIT_COMPILE_ASSERT((OP_CRSTAR & 0x1) == 0, crstar_opcode_must_be_even);\nminimize = (type & 0x1) != 0;\nswitch(type)\n  {\n  case OP_CRSTAR:\n  case OP_CRMINSTAR:\n  min = 0;\n  max = 0;\n  cc += 1 + IMM2_SIZE + 1;\n  break;\n  case OP_CRPLUS:\n  case OP_CRMINPLUS:\n  min = 1;\n  max = 0;\n  cc += 1 + IMM2_SIZE + 1;\n  break;\n  case OP_CRQUERY:\n  case OP_CRMINQUERY:\n  min = 0;\n  max = 1;\n  cc += 1 + IMM2_SIZE + 1;\n  break;\n  case OP_CRRANGE:\n  case OP_CRMINRANGE:\n  min = GET2(cc, 1 + IMM2_SIZE + 1);\n  max = GET2(cc, 1 + IMM2_SIZE + 1 + IMM2_SIZE);\n  cc += 1 + IMM2_SIZE + 1 + 2 * IMM2_SIZE;\n  break;\n  default:\n  SLJIT_UNREACHABLE();\n  break;\n  }\n\nif (!minimize)\n  {\n  if (min == 0)\n    {\n    allocate_stack(common, 2);\n    if (ref)\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);\n    /* Temporary release of STR_PTR. */\n    OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n    /* Handles both invalid and empty cases. Since the minimum repeat,\n    is zero the invalid case is basically the same as an empty case. */\n    if (ref)\n      zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n    else\n      {\n      compile_dnref_search(common, ccbegin, NULL);\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0);\n      zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n      }\n    /* Restore if not zero length. */\n    OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n    }\n  else\n    {\n    allocate_stack(common, 1);\n    if (ref)\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n    if (ref)\n      {\n      add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));\n      zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n      }\n    else\n      {\n      compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, TMP2, 0);\n      zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n      }\n    }\n\n  if (min > 1 || max > 1)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, 0);\n\n  label = LABEL();\n  if (!ref)\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);\n  compile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, FALSE, FALSE);\n\n  if (min > 1 || max > 1)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0);\n    OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);\n    if (min > 1)\n      CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, label);\n    if (max > 1)\n      {\n      jump = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, max);\n      allocate_stack(common, 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n      JUMPTO(SLJIT_JUMP, label);\n      JUMPHERE(jump);\n      }\n    }\n\n  if (max == 0)\n    {\n    /* Includes min > 1 case as well. */\n    allocate_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n    JUMPTO(SLJIT_JUMP, label);\n    }\n\n  JUMPHERE(zerolength);\n  BACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();\n\n  count_match(common);\n  return cc;\n  }\n\nallocate_stack(common, ref ? 2 : 3);\nif (ref)\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\nif (type != OP_CRMINSTAR)\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);\n\nif (min == 0)\n  {\n  /* Handles both invalid and empty cases. Since the minimum repeat,\n  is zero the invalid case is basically the same as an empty case. */\n  if (ref)\n    zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n  else\n    {\n    compile_dnref_search(common, ccbegin, NULL);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0);\n    zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n    }\n  /* Length is non-zero, we can match real repeats. */\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n  jump = JUMP(SLJIT_JUMP);\n  }\nelse\n  {\n  if (ref)\n    {\n    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));\n    zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n    }\n  else\n    {\n    compile_dnref_search(common, ccbegin, &backtrack->topbacktracks);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0);\n    zerolength = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw));\n    }\n  }\n\nBACKTRACK_AS(ref_iterator_backtrack)->matchingpath = LABEL();\nif (max > 0)\n  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max));\n\nif (!ref)\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(2));\ncompile_ref_matchingpath(common, ccbegin, &backtrack->topbacktracks, TRUE, TRUE);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n\nif (min > 1)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n  OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);\n  CMPTO(SLJIT_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(ref_iterator_backtrack)->matchingpath);\n  }\nelse if (max > 0)\n  OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1);\n\nif (jump != NULL)\n  JUMPHERE(jump);\nJUMPHERE(zerolength);\n\ncount_match(common);\nreturn cc;\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_recurse_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\nrecurse_entry *entry = common->entries;\nrecurse_entry *prev = NULL;\nsljit_sw start = GET(cc, 1);\npcre_uchar *start_cc;\nBOOL needs_control_head;\n\nPUSH_BACKTRACK(sizeof(recurse_backtrack), cc, NULL);\n\n/* Inlining simple patterns. */\nif (get_framesize(common, common->start + start, NULL, TRUE, &needs_control_head) == no_stack)\n  {\n  start_cc = common->start + start;\n  compile_matchingpath(common, next_opcode(common, start_cc), bracketend(start_cc) - (1 + LINK_SIZE), backtrack);\n  BACKTRACK_AS(recurse_backtrack)->inlined_pattern = TRUE;\n  return cc + 1 + LINK_SIZE;\n  }\n\nwhile (entry != NULL)\n  {\n  if (entry->start == start)\n    break;\n  prev = entry;\n  entry = entry->next;\n  }\n\nif (entry == NULL)\n  {\n  entry = sljit_alloc_memory(compiler, sizeof(recurse_entry));\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    return NULL;\n  entry->next = NULL;\n  entry->entry = NULL;\n  entry->calls = NULL;\n  entry->start = start;\n\n  if (prev != NULL)\n    prev->next = entry;\n  else\n    common->entries = entry;\n  }\n\nif (common->has_set_som && common->mark_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\n  allocate_stack(common, 2);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);\n  }\nelse if (common->has_set_som || common->mark_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr);\n  allocate_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n  }\n\nif (entry->entry == NULL)\n  add_jump(compiler, &entry->calls, JUMP(SLJIT_FAST_CALL));\nelse\n  JUMPTO(SLJIT_FAST_CALL, entry->entry);\n/* Leave if the match is failed. */\nadd_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0));\nreturn cc + 1 + LINK_SIZE;\n}\n\nstatic sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector)\n{\nconst pcre_uchar *begin = arguments->begin;\nint *offset_vector = arguments->offsets;\nint offset_count = arguments->offset_count;\nint i;\n\nif (PUBL(callout) == NULL)\n  return 0;\n\ncallout_block->version = 2;\ncallout_block->callout_data = arguments->callout_data;\n\n/* Offsets in subject. */\ncallout_block->subject_length = arguments->end - arguments->begin;\ncallout_block->start_match = (pcre_uchar*)callout_block->subject - arguments->begin;\ncallout_block->current_position = (pcre_uchar*)callout_block->offset_vector - arguments->begin;\n#if defined COMPILE_PCRE8\ncallout_block->subject = (PCRE_SPTR)begin;\n#elif defined COMPILE_PCRE16\ncallout_block->subject = (PCRE_SPTR16)begin;\n#elif defined COMPILE_PCRE32\ncallout_block->subject = (PCRE_SPTR32)begin;\n#endif\n\n/* Convert and copy the JIT offset vector to the offset_vector array. */\ncallout_block->capture_top = 0;\ncallout_block->offset_vector = offset_vector;\nfor (i = 2; i < offset_count; i += 2)\n  {\n  offset_vector[i] = jit_ovector[i] - begin;\n  offset_vector[i + 1] = jit_ovector[i + 1] - begin;\n  if (jit_ovector[i] >= begin)\n    callout_block->capture_top = i;\n  }\n\ncallout_block->capture_top = (callout_block->capture_top >> 1) + 1;\nif (offset_count > 0)\n  offset_vector[0] = -1;\nif (offset_count > 1)\n  offset_vector[1] = -1;\nreturn (*PUBL(callout))(callout_block);\n}\n\n/* Aligning to 8 byte. */\n#define CALLOUT_ARG_SIZE \\\n    (((int)sizeof(PUBL(callout_block)) + 7) & ~7)\n\n#define CALLOUT_ARG_OFFSET(arg) \\\n    SLJIT_OFFSETOF(PUBL(callout_block), arg)\n\nstatic SLJIT_INLINE pcre_uchar *compile_callout_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\n\nPUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);\n\nallocate_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw));\n\nSLJIT_ASSERT(common->capture_last_ptr != 0);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);\nOP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(callout_number), SLJIT_IMM, cc[1]);\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(capture_last), TMP2, 0);\n\n/* These pointer sized fields temporarly stores internal variables. */\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(offset_vector), STR_PTR, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(subject), TMP2, 0);\n\nif (common->mark_ptr != 0)\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr));\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(pattern_position), SLJIT_IMM, GET(cc, 2));\nOP1(SLJIT_MOV_S32, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(next_item_length), SLJIT_IMM, GET(cc, 2 + LINK_SIZE));\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), CALLOUT_ARG_OFFSET(mark), (common->mark_ptr != 0) ? TMP2 : SLJIT_IMM, 0);\n\n/* Needed to save important temporary registers. */\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);\n/* SLJIT_R0 = arguments */\nOP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0);\nGET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START);\nsljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(S32) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout));\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\nfree_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw));\n\n/* Check return value. */\nOP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);\nadd_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32));\nif (common->forced_quit_label == NULL)\n  add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */);\nelse\n  JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->forced_quit_label);\nreturn cc + 2 + 2 * LINK_SIZE;\n}\n\n#undef CALLOUT_ARG_SIZE\n#undef CALLOUT_ARG_OFFSET\n\nstatic SLJIT_INLINE BOOL assert_needs_str_ptr_saving(pcre_uchar *cc)\n{\nwhile (TRUE)\n  {\n  switch (*cc)\n    {\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_DOLL:\n    case OP_DOLLM:\n    case OP_CALLOUT:\n    case OP_ALT:\n    cc += PRIV(OP_lengths)[*cc];\n    break;\n\n    case OP_KET:\n    return FALSE;\n\n    default:\n    return TRUE;\n    }\n  }\n}\n\nstatic pcre_uchar *compile_assert_matchingpath(compiler_common *common, pcre_uchar *cc, assert_backtrack *backtrack, BOOL conditional)\n{\nDEFINE_COMPILER;\nint framesize;\nint extrasize;\nBOOL needs_control_head;\nint private_data_ptr;\nbacktrack_common altbacktrack;\npcre_uchar *ccbegin;\npcre_uchar opcode;\npcre_uchar bra = OP_BRA;\njump_list *tmp = NULL;\njump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks;\njump_list **found;\n/* Saving previous accept variables. */\nBOOL save_local_exit = common->local_exit;\nBOOL save_positive_assert = common->positive_assert;\nthen_trap_backtrack *save_then_trap = common->then_trap;\nstruct sljit_label *save_quit_label = common->quit_label;\nstruct sljit_label *save_accept_label = common->accept_label;\njump_list *save_quit = common->quit;\njump_list *save_positive_assert_quit = common->positive_assert_quit;\njump_list *save_accept = common->accept;\nstruct sljit_jump *jump;\nstruct sljit_jump *brajump = NULL;\n\n/* Assert captures then. */\ncommon->then_trap = NULL;\n\nif (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)\n  {\n  SLJIT_ASSERT(!conditional);\n  bra = *cc;\n  cc++;\n  }\nprivate_data_ptr = PRIVATE_DATA(cc);\nSLJIT_ASSERT(private_data_ptr != 0);\nframesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head);\nbacktrack->framesize = framesize;\nbacktrack->private_data_ptr = private_data_ptr;\nopcode = *cc;\nSLJIT_ASSERT(opcode >= OP_ASSERT && opcode <= OP_ASSERTBACK_NOT);\nfound = (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) ? &tmp : target;\nccbegin = cc;\ncc += GET(cc, 1);\n\nif (bra == OP_BRAMINZERO)\n  {\n  /* This is a braminzero backtrack path. */\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n  }\n\nif (framesize < 0)\n  {\n  extrasize = 1;\n  if (bra == OP_BRA && !assert_needs_str_ptr_saving(ccbegin + 1 + LINK_SIZE))\n    extrasize = 0;\n\n  if (needs_control_head)\n    extrasize++;\n\n  if (framesize == no_frame)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);\n\n  if (extrasize > 0)\n    allocate_stack(common, extrasize);\n\n  if (needs_control_head)\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n\n  if (extrasize > 0)\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n\n  if (needs_control_head)\n    {\n    SLJIT_ASSERT(extrasize == 2);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);\n    }\n  }\nelse\n  {\n  extrasize = needs_control_head ? 3 : 2;\n  allocate_stack(common, framesize + extrasize);\n\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n  OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);\n  if (needs_control_head)\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n\n  if (needs_control_head)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);\n    }\n  else\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0);\n\n  init_frame(common, ccbegin, NULL, framesize + extrasize - 1, extrasize, FALSE);\n  }\n\nmemset(&altbacktrack, 0, sizeof(backtrack_common));\nif (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n  {\n  /* Negative assert is stronger than positive assert. */\n  common->local_exit = TRUE;\n  common->quit_label = NULL;\n  common->quit = NULL;\n  common->positive_assert = FALSE;\n  }\nelse\n  common->positive_assert = TRUE;\ncommon->positive_assert_quit = NULL;\n\nwhile (1)\n  {\n  common->accept_label = NULL;\n  common->accept = NULL;\n  altbacktrack.top = NULL;\n  altbacktrack.topbacktracks = NULL;\n\n  if (*ccbegin == OP_ALT && extrasize > 0)\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n\n  altbacktrack.cc = ccbegin;\n  compile_matchingpath(common, ccbegin + 1 + LINK_SIZE, cc, &altbacktrack);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    {\n    if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n      {\n      common->local_exit = save_local_exit;\n      common->quit_label = save_quit_label;\n      common->quit = save_quit;\n      }\n    common->positive_assert = save_positive_assert;\n    common->then_trap = save_then_trap;\n    common->accept_label = save_accept_label;\n    common->positive_assert_quit = save_positive_assert_quit;\n    common->accept = save_accept;\n    return NULL;\n    }\n  common->accept_label = LABEL();\n  if (common->accept != NULL)\n    set_jumps(common->accept, common->accept_label);\n\n  /* Reset stack. */\n  if (framesize < 0)\n    {\n    if (framesize == no_frame)\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    else if (extrasize > 0)\n      free_stack(common, extrasize);\n\n    if (needs_control_head)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));\n    }\n  else\n    {\n    if ((opcode != OP_ASSERT_NOT && opcode != OP_ASSERTBACK_NOT) || conditional)\n      {\n      /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */\n      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw));\n      if (needs_control_head)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));\n      }\n    else\n      {\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      if (needs_control_head)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 2));\n      add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n      }\n    }\n\n  if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n    {\n    /* We know that STR_PTR was stored on the top of the stack. */\n    if (conditional)\n      {\n      if (extrasize > 0)\n        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), needs_control_head ? STACK(-2) : STACK(-1));\n      }\n    else if (bra == OP_BRAZERO)\n      {\n      if (framesize < 0)\n        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize));\n      else\n        {\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1));\n        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-framesize - extrasize));\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);\n        }\n      OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    else if (framesize >= 0)\n      {\n      /* For OP_BRA and OP_BRAMINZERO. */\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1));\n      }\n    }\n  add_jump(compiler, found, JUMP(SLJIT_JUMP));\n\n  compile_backtrackingpath(common, altbacktrack.top);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    {\n    if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n      {\n      common->local_exit = save_local_exit;\n      common->quit_label = save_quit_label;\n      common->quit = save_quit;\n      }\n    common->positive_assert = save_positive_assert;\n    common->then_trap = save_then_trap;\n    common->accept_label = save_accept_label;\n    common->positive_assert_quit = save_positive_assert_quit;\n    common->accept = save_accept;\n    return NULL;\n    }\n  set_jumps(altbacktrack.topbacktracks, LABEL());\n\n  if (*cc != OP_ALT)\n    break;\n\n  ccbegin = cc;\n  cc += GET(cc, 1);\n  }\n\nif (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n  {\n  SLJIT_ASSERT(common->positive_assert_quit == NULL);\n  /* Makes the check less complicated below. */\n  common->positive_assert_quit = common->quit;\n  }\n\n/* None of them matched. */\nif (common->positive_assert_quit != NULL)\n  {\n  jump = JUMP(SLJIT_JUMP);\n  set_jumps(common->positive_assert_quit, LABEL());\n  SLJIT_ASSERT(framesize != no_stack);\n  if (framesize < 0)\n    OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, extrasize * sizeof(sljit_sw));\n  else\n    {\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n    OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + extrasize) * sizeof(sljit_sw));\n    }\n  JUMPHERE(jump);\n  }\n\nif (needs_control_head)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(1));\n\nif (opcode == OP_ASSERT || opcode == OP_ASSERTBACK)\n  {\n  /* Assert is failed. */\n  if ((conditional && extrasize > 0) || bra == OP_BRAZERO)\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n\n  if (framesize < 0)\n    {\n    /* The topmost item should be 0. */\n    if (bra == OP_BRAZERO)\n      {\n      if (extrasize == 2)\n        free_stack(common, 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    else if (extrasize > 0)\n      free_stack(common, extrasize);\n    }\n  else\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1));\n    /* The topmost item should be 0. */\n    if (bra == OP_BRAZERO)\n      {\n      free_stack(common, framesize + extrasize - 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    else\n      free_stack(common, framesize + extrasize);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);\n    }\n  jump = JUMP(SLJIT_JUMP);\n  if (bra != OP_BRAZERO)\n    add_jump(compiler, target, jump);\n\n  /* Assert is successful. */\n  set_jumps(tmp, LABEL());\n  if (framesize < 0)\n    {\n    /* We know that STR_PTR was stored on the top of the stack. */\n    if (extrasize > 0)\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize));\n\n    /* Keep the STR_PTR on the top of the stack. */\n    if (bra == OP_BRAZERO)\n      {\n      OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n      if (extrasize == 2)\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n      }\n    else if (bra == OP_BRAMINZERO)\n      {\n      OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    }\n  else\n    {\n    if (bra == OP_BRA)\n      {\n      /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */\n      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_sw));\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(-extrasize + 1));\n      }\n    else\n      {\n      /* We don't need to keep the STR_PTR, only the previous private_data_ptr. */\n      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_sw));\n      if (extrasize == 2)\n        {\n        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n        if (bra == OP_BRAMINZERO)\n          OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n        }\n      else\n        {\n        OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0);\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0);\n        }\n      }\n    }\n\n  if (bra == OP_BRAZERO)\n    {\n    backtrack->matchingpath = LABEL();\n    SET_LABEL(jump, backtrack->matchingpath);\n    }\n  else if (bra == OP_BRAMINZERO)\n    {\n    JUMPTO(SLJIT_JUMP, backtrack->matchingpath);\n    JUMPHERE(brajump);\n    if (framesize >= 0)\n      {\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-framesize - 1));\n      }\n    set_jumps(backtrack->common.topbacktracks, LABEL());\n    }\n  }\nelse\n  {\n  /* AssertNot is successful. */\n  if (framesize < 0)\n    {\n    if (extrasize > 0)\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n\n    if (bra != OP_BRA)\n      {\n      if (extrasize == 2)\n        free_stack(common, 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    else if (extrasize > 0)\n      free_stack(common, extrasize);\n    }\n  else\n    {\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(extrasize - 1));\n    /* The topmost item should be 0. */\n    if (bra != OP_BRA)\n      {\n      free_stack(common, framesize + extrasize - 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    else\n      free_stack(common, framesize + extrasize);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);\n    }\n\n  if (bra == OP_BRAZERO)\n    backtrack->matchingpath = LABEL();\n  else if (bra == OP_BRAMINZERO)\n    {\n    JUMPTO(SLJIT_JUMP, backtrack->matchingpath);\n    JUMPHERE(brajump);\n    }\n\n  if (bra != OP_BRA)\n    {\n    SLJIT_ASSERT(found == &backtrack->common.topbacktracks);\n    set_jumps(backtrack->common.topbacktracks, LABEL());\n    backtrack->common.topbacktracks = NULL;\n    }\n  }\n\nif (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT)\n  {\n  common->local_exit = save_local_exit;\n  common->quit_label = save_quit_label;\n  common->quit = save_quit;\n  }\ncommon->positive_assert = save_positive_assert;\ncommon->then_trap = save_then_trap;\ncommon->accept_label = save_accept_label;\ncommon->positive_assert_quit = save_positive_assert_quit;\ncommon->accept = save_accept;\nreturn cc + 1 + LINK_SIZE;\n}\n\nstatic SLJIT_INLINE void match_once_common(compiler_common *common, pcre_uchar ket, int framesize, int private_data_ptr, BOOL has_alternatives, BOOL needs_control_head)\n{\nDEFINE_COMPILER;\nint stacksize;\n\nif (framesize < 0)\n  {\n  if (framesize == no_frame)\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n  else\n    {\n    stacksize = needs_control_head ? 1 : 0;\n    if (ket != OP_KET || has_alternatives)\n      stacksize++;\n\n    if (stacksize > 0)\n      free_stack(common, stacksize);\n    }\n\n  if (needs_control_head)\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), (ket != OP_KET || has_alternatives) ? STACK(-2) : STACK(-1));\n\n  /* TMP2 which is set here used by OP_KETRMAX below. */\n  if (ket == OP_KETRMAX)\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));\n  else if (ket == OP_KETRMIN)\n    {\n    /* Move the STR_PTR to the private_data_ptr. */\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-1));\n    }\n  }\nelse\n  {\n  stacksize = (ket != OP_KET || has_alternatives) ? 2 : 1;\n  OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, (framesize + stacksize) * sizeof(sljit_sw));\n  if (needs_control_head)\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-1));\n\n  if (ket == OP_KETRMAX)\n    {\n    /* TMP2 which is set here used by OP_KETRMAX below. */\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    }\n  }\nif (needs_control_head)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0);\n}\n\nstatic SLJIT_INLINE int match_capture_common(compiler_common *common, int stacksize, int offset, int private_data_ptr)\n{\nDEFINE_COMPILER;\n\nif (common->capture_last_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);\n  stacksize++;\n  }\nif (common->optimized_cbracket[offset >> 1] == 0)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n  stacksize += 2;\n  }\nreturn stacksize;\n}\n\n/*\n  Handling bracketed expressions is probably the most complex part.\n\n  Stack layout naming characters:\n    S - Push the current STR_PTR\n    0 - Push a 0 (NULL)\n    A - Push the current STR_PTR. Needed for restoring the STR_PTR\n        before the next alternative. Not pushed if there are no alternatives.\n    M - Any values pushed by the current alternative. Can be empty, or anything.\n    C - Push the previous OVECTOR(i), OVECTOR(i+1) and OVECTOR_PRIV(i) to the stack.\n    L - Push the previous local (pointed by localptr) to the stack\n   () - opional values stored on the stack\n  ()* - optonal, can be stored multiple times\n\n  The following list shows the regular expression templates, their PCRE byte codes\n  and stack layout supported by pcre-sljit.\n\n  (?:)                     OP_BRA     | OP_KET                A M\n  ()                       OP_CBRA    | OP_KET                C M\n  (?:)+                    OP_BRA     | OP_KETRMAX        0   A M S   ( A M S )*\n                           OP_SBRA    | OP_KETRMAX        0   L M S   ( L M S )*\n  (?:)+?                   OP_BRA     | OP_KETRMIN        0   A M S   ( A M S )*\n                           OP_SBRA    | OP_KETRMIN        0   L M S   ( L M S )*\n  ()+                      OP_CBRA    | OP_KETRMAX        0   C M S   ( C M S )*\n                           OP_SCBRA   | OP_KETRMAX        0   C M S   ( C M S )*\n  ()+?                     OP_CBRA    | OP_KETRMIN        0   C M S   ( C M S )*\n                           OP_SCBRA   | OP_KETRMIN        0   C M S   ( C M S )*\n  (?:)?    OP_BRAZERO    | OP_BRA     | OP_KET            S ( A M 0 )\n  (?:)??   OP_BRAMINZERO | OP_BRA     | OP_KET            S ( A M 0 )\n  ()?      OP_BRAZERO    | OP_CBRA    | OP_KET            S ( C M 0 )\n  ()??     OP_BRAMINZERO | OP_CBRA    | OP_KET            S ( C M 0 )\n  (?:)*    OP_BRAZERO    | OP_BRA     | OP_KETRMAX      S 0 ( A M S )*\n           OP_BRAZERO    | OP_SBRA    | OP_KETRMAX      S 0 ( L M S )*\n  (?:)*?   OP_BRAMINZERO | OP_BRA     | OP_KETRMIN      S 0 ( A M S )*\n           OP_BRAMINZERO | OP_SBRA    | OP_KETRMIN      S 0 ( L M S )*\n  ()*      OP_BRAZERO    | OP_CBRA    | OP_KETRMAX      S 0 ( C M S )*\n           OP_BRAZERO    | OP_SCBRA   | OP_KETRMAX      S 0 ( C M S )*\n  ()*?     OP_BRAMINZERO | OP_CBRA    | OP_KETRMIN      S 0 ( C M S )*\n           OP_BRAMINZERO | OP_SCBRA   | OP_KETRMIN      S 0 ( C M S )*\n\n\n  Stack layout naming characters:\n    A - Push the alternative index (starting from 0) on the stack.\n        Not pushed if there is no alternatives.\n    M - Any values pushed by the current alternative. Can be empty, or anything.\n\n  The next list shows the possible content of a bracket:\n  (|)     OP_*BRA    | OP_ALT ...         M A\n  (?()|)  OP_*COND   | OP_ALT             M A\n  (?>|)   OP_ONCE    | OP_ALT ...         [stack trace] M A\n  (?>|)   OP_ONCE_NC | OP_ALT ...         [stack trace] M A\n                                          Or nothing, if trace is unnecessary\n*/\n\nstatic pcre_uchar *compile_bracket_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\npcre_uchar opcode;\nint private_data_ptr = 0;\nint offset = 0;\nint i, stacksize;\nint repeat_ptr = 0, repeat_length = 0;\nint repeat_type = 0, repeat_count = 0;\npcre_uchar *ccbegin;\npcre_uchar *matchingpath;\npcre_uchar *slot;\npcre_uchar bra = OP_BRA;\npcre_uchar ket;\nassert_backtrack *assert;\nBOOL has_alternatives;\nBOOL needs_control_head = FALSE;\nstruct sljit_jump *jump;\nstruct sljit_jump *skip;\nstruct sljit_label *rmax_label = NULL;\nstruct sljit_jump *braminzero = NULL;\n\nPUSH_BACKTRACK(sizeof(bracket_backtrack), cc, NULL);\n\nif (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)\n  {\n  bra = *cc;\n  cc++;\n  opcode = *cc;\n  }\n\nopcode = *cc;\nccbegin = cc;\nmatchingpath = bracketend(cc) - 1 - LINK_SIZE;\nket = *matchingpath;\nif (ket == OP_KET && PRIVATE_DATA(matchingpath) != 0)\n  {\n  repeat_ptr = PRIVATE_DATA(matchingpath);\n  repeat_length = PRIVATE_DATA(matchingpath + 1);\n  repeat_type = PRIVATE_DATA(matchingpath + 2);\n  repeat_count = PRIVATE_DATA(matchingpath + 3);\n  SLJIT_ASSERT(repeat_length != 0 && repeat_type != 0 && repeat_count != 0);\n  if (repeat_type == OP_UPTO)\n    ket = OP_KETRMAX;\n  if (repeat_type == OP_MINUPTO)\n    ket = OP_KETRMIN;\n  }\n\nif ((opcode == OP_COND || opcode == OP_SCOND) && cc[1 + LINK_SIZE] == OP_DEF)\n  {\n  /* Drop this bracket_backtrack. */\n  parent->top = backtrack->prev;\n  return matchingpath + 1 + LINK_SIZE + repeat_length;\n  }\n\nmatchingpath = ccbegin + 1 + LINK_SIZE;\nSLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN);\nSLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX)));\ncc += GET(cc, 1);\n\nhas_alternatives = *cc == OP_ALT;\nif (SLJIT_UNLIKELY(opcode == OP_COND || opcode == OP_SCOND))\n  has_alternatives = (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL) ? FALSE : TRUE;\n\nif (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN))\n  opcode = OP_SCOND;\nif (SLJIT_UNLIKELY(opcode == OP_ONCE_NC))\n  opcode = OP_ONCE;\n\nif (opcode == OP_CBRA || opcode == OP_SCBRA)\n  {\n  /* Capturing brackets has a pre-allocated space. */\n  offset = GET2(ccbegin, 1 + LINK_SIZE);\n  if (common->optimized_cbracket[offset] == 0)\n    {\n    private_data_ptr = OVECTOR_PRIV(offset);\n    offset <<= 1;\n    }\n  else\n    {\n    offset <<= 1;\n    private_data_ptr = OVECTOR(offset);\n    }\n  BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr;\n  matchingpath += IMM2_SIZE;\n  }\nelse if (opcode == OP_ONCE || opcode == OP_SBRA || opcode == OP_SCOND)\n  {\n  /* Other brackets simply allocate the next entry. */\n  private_data_ptr = PRIVATE_DATA(ccbegin);\n  SLJIT_ASSERT(private_data_ptr != 0);\n  BACKTRACK_AS(bracket_backtrack)->private_data_ptr = private_data_ptr;\n  if (opcode == OP_ONCE)\n    BACKTRACK_AS(bracket_backtrack)->u.framesize = get_framesize(common, ccbegin, NULL, FALSE, &needs_control_head);\n  }\n\n/* Instructions before the first alternative. */\nstacksize = 0;\nif (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO))\n  stacksize++;\nif (bra == OP_BRAZERO)\n  stacksize++;\n\nif (stacksize > 0)\n  allocate_stack(common, stacksize);\n\nstacksize = 0;\nif (ket == OP_KETRMAX || (ket == OP_KETRMIN && bra != OP_BRAMINZERO))\n  {\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);\n  stacksize++;\n  }\n\nif (bra == OP_BRAZERO)\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n\nif (bra == OP_BRAMINZERO)\n  {\n  /* This is a backtrack path! (Since the try-path of OP_BRAMINZERO matches to the empty string) */\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  if (ket != OP_KETRMIN)\n    {\n    free_stack(common, 1);\n    braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n    }\n  else\n    {\n    if (opcode == OP_ONCE || opcode >= OP_SBRA)\n      {\n      jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n      /* Nothing stored during the first run. */\n      skip = JUMP(SLJIT_JUMP);\n      JUMPHERE(jump);\n      /* Checking zero-length iteration. */\n      if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0)\n        {\n        /* When we come from outside, private_data_ptr contains the previous STR_PTR. */\n        braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n        }\n      else\n        {\n        /* Except when the whole stack frame must be saved. */\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n        braminzero = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-BACKTRACK_AS(bracket_backtrack)->u.framesize - 2));\n        }\n      JUMPHERE(skip);\n      }\n    else\n      {\n      jump = CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n      JUMPHERE(jump);\n      }\n    }\n  }\n\nif (repeat_type != 0)\n  {\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, repeat_count);\n  if (repeat_type == OP_EXACT)\n    rmax_label = LABEL();\n  }\n\nif (ket == OP_KETRMIN)\n  BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL();\n\nif (ket == OP_KETRMAX)\n  {\n  rmax_label = LABEL();\n  if (has_alternatives && opcode != OP_ONCE && opcode < OP_SBRA && repeat_type == 0)\n    BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = rmax_label;\n  }\n\n/* Handling capturing brackets and alternatives. */\nif (opcode == OP_ONCE)\n  {\n  stacksize = 0;\n  if (needs_control_head)\n    {\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n    stacksize++;\n    }\n\n  if (BACKTRACK_AS(bracket_backtrack)->u.framesize < 0)\n    {\n    /* Neither capturing brackets nor recursions are found in the block. */\n    if (ket == OP_KETRMIN)\n      {\n      stacksize += 2;\n      if (!needs_control_head)\n        OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      }\n    else\n      {\n      if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);\n      if (ket == OP_KETRMAX || has_alternatives)\n        stacksize++;\n      }\n\n    if (stacksize > 0)\n      allocate_stack(common, stacksize);\n\n    stacksize = 0;\n    if (needs_control_head)\n      {\n      stacksize++;\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n      }\n\n    if (ket == OP_KETRMIN)\n      {\n      if (needs_control_head)\n        OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n      if (BACKTRACK_AS(bracket_backtrack)->u.framesize == no_frame)\n        OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, needs_control_head ? (2 * sizeof(sljit_sw)) : sizeof(sljit_sw));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize + 1), TMP2, 0);\n      }\n    else if (ket == OP_KETRMAX || has_alternatives)\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n    }\n  else\n    {\n    if (ket != OP_KET || has_alternatives)\n      stacksize++;\n\n    stacksize += BACKTRACK_AS(bracket_backtrack)->u.framesize + 1;\n    allocate_stack(common, stacksize);\n\n    if (needs_control_head)\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    OP2(SLJIT_ADD, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));\n\n    stacksize = needs_control_head ? 1 : 0;\n    if (ket != OP_KET || has_alternatives)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);\n      stacksize++;\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);\n      }\n    else\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP2, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP1, 0);\n      }\n    init_frame(common, ccbegin, NULL, BACKTRACK_AS(bracket_backtrack)->u.framesize + stacksize, stacksize + 1, FALSE);\n    }\n  }\nelse if (opcode == OP_CBRA || opcode == OP_SCBRA)\n  {\n  /* Saving the previous values. */\n  if (common->optimized_cbracket[offset >> 1] != 0)\n    {\n    SLJIT_ASSERT(private_data_ptr == OVECTOR(offset));\n    allocate_stack(common, 2);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr + sizeof(sljit_sw));\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);\n    }\n  else\n    {\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    allocate_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n    }\n  }\nelse if (opcode == OP_SBRA || opcode == OP_SCOND)\n  {\n  /* Saving the previous value. */\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n  allocate_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n  }\nelse if (has_alternatives)\n  {\n  /* Pushing the starting string pointer. */\n  allocate_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n  }\n\n/* Generating code for the first alternative. */\nif (opcode == OP_COND || opcode == OP_SCOND)\n  {\n  if (*matchingpath == OP_CREF)\n    {\n    SLJIT_ASSERT(has_alternatives);\n    add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed),\n      CMP(SLJIT_EQUAL, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(matchingpath, 1) << 1), SLJIT_MEM1(SLJIT_SP), OVECTOR(1)));\n    matchingpath += 1 + IMM2_SIZE;\n    }\n  else if (*matchingpath == OP_DNCREF)\n    {\n    SLJIT_ASSERT(has_alternatives);\n\n    i = GET2(matchingpath, 1 + IMM2_SIZE);\n    slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size;\n    OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1));\n    OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0);\n    slot += common->name_entry_size;\n    i--;\n    while (i-- > 0)\n      {\n      OP2(SLJIT_SUB, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(GET2(slot, 0) << 1), TMP1, 0);\n      OP2(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, TMP2, 0, STR_PTR, 0);\n      slot += common->name_entry_size;\n      }\n    OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0);\n    add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), JUMP(SLJIT_ZERO));\n    matchingpath += 1 + 2 * IMM2_SIZE;\n    }\n  else if (*matchingpath == OP_RREF || *matchingpath == OP_DNRREF || *matchingpath == OP_FAIL)\n    {\n    /* Never has other case. */\n    BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL;\n    SLJIT_ASSERT(!has_alternatives);\n\n    if (*matchingpath == OP_FAIL)\n      stacksize = 0;\n    else if (*matchingpath == OP_RREF)\n      {\n      stacksize = GET2(matchingpath, 1);\n      if (common->currententry == NULL)\n        stacksize = 0;\n      else if (stacksize == RREF_ANY)\n        stacksize = 1;\n      else if (common->currententry->start == 0)\n        stacksize = stacksize == 0;\n      else\n        stacksize = stacksize == (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE);\n\n      if (stacksize != 0)\n        matchingpath += 1 + IMM2_SIZE;\n      }\n    else\n      {\n      if (common->currententry == NULL || common->currententry->start == 0)\n        stacksize = 0;\n      else\n        {\n        stacksize = GET2(matchingpath, 1 + IMM2_SIZE);\n        slot = common->name_table + GET2(matchingpath, 1) * common->name_entry_size;\n        i = (int)GET2(common->start, common->currententry->start + 1 + LINK_SIZE);\n        while (stacksize > 0)\n          {\n          if ((int)GET2(slot, 0) == i)\n            break;\n          slot += common->name_entry_size;\n          stacksize--;\n          }\n        }\n\n      if (stacksize != 0)\n        matchingpath += 1 + 2 * IMM2_SIZE;\n      }\n\n      /* The stacksize == 0 is a common \"else\" case. */\n      if (stacksize == 0)\n        {\n        if (*cc == OP_ALT)\n          {\n          matchingpath = cc + 1 + LINK_SIZE;\n          cc += GET(cc, 1);\n          }\n        else\n          matchingpath = cc;\n        }\n    }\n  else\n    {\n    SLJIT_ASSERT(has_alternatives && *matchingpath >= OP_ASSERT && *matchingpath <= OP_ASSERTBACK_NOT);\n    /* Similar code as PUSH_BACKTRACK macro. */\n    assert = sljit_alloc_memory(compiler, sizeof(assert_backtrack));\n    if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n      return NULL;\n    memset(assert, 0, sizeof(assert_backtrack));\n    assert->common.cc = matchingpath;\n    BACKTRACK_AS(bracket_backtrack)->u.assert = assert;\n    matchingpath = compile_assert_matchingpath(common, matchingpath, assert, TRUE);\n    }\n  }\n\ncompile_matchingpath(common, matchingpath, cc, backtrack);\nif (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n  return NULL;\n\nif (opcode == OP_ONCE)\n  match_once_common(common, ket, BACKTRACK_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);\n\nstacksize = 0;\nif (repeat_type == OP_MINUPTO)\n  {\n  /* We need to preserve the counter. TMP2 will be used below. */\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);\n  stacksize++;\n  }\nif (ket != OP_KET || bra != OP_BRA)\n  stacksize++;\nif (offset != 0)\n  {\n  if (common->capture_last_ptr != 0)\n    stacksize++;\n  if (common->optimized_cbracket[offset >> 1] == 0)\n    stacksize += 2;\n  }\nif (has_alternatives && opcode != OP_ONCE)\n  stacksize++;\n\nif (stacksize > 0)\n  allocate_stack(common, stacksize);\n\nstacksize = 0;\nif (repeat_type == OP_MINUPTO)\n  {\n  /* TMP2 was set above. */\n  OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1);\n  stacksize++;\n  }\n\nif (ket != OP_KET || bra != OP_BRA)\n  {\n  if (ket != OP_KET)\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n  else\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);\n  stacksize++;\n  }\n\nif (offset != 0)\n  stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);\n\nif (has_alternatives)\n  {\n  if (opcode != OP_ONCE)\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);\n  if (ket != OP_KETRMAX)\n    BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();\n  }\n\n/* Must be after the matchingpath label. */\nif (offset != 0 && common->optimized_cbracket[offset >> 1] != 0)\n  {\n  SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\n  }\n\nif (ket == OP_KETRMAX)\n  {\n  if (repeat_type != 0)\n    {\n    if (has_alternatives)\n      BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();\n    OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, rmax_label);\n    /* Drop STR_PTR for greedy plus quantifier. */\n    if (opcode != OP_ONCE)\n      free_stack(common, 1);\n    }\n  else if (opcode == OP_ONCE || opcode >= OP_SBRA)\n    {\n    if (has_alternatives)\n      BACKTRACK_AS(bracket_backtrack)->alternative_matchingpath = LABEL();\n    /* Checking zero-length iteration. */\n    if (opcode != OP_ONCE)\n      {\n      CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STR_PTR, 0, rmax_label);\n      /* Drop STR_PTR for greedy plus quantifier. */\n      if (bra != OP_BRAZERO)\n        free_stack(common, 1);\n      }\n    else\n      /* TMP2 must contain the starting STR_PTR. */\n      CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, rmax_label);\n    }\n  else\n    JUMPTO(SLJIT_JUMP, rmax_label);\n  BACKTRACK_AS(bracket_backtrack)->recursive_matchingpath = LABEL();\n  }\n\nif (repeat_type == OP_EXACT)\n  {\n  count_match(common);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);\n  JUMPTO(SLJIT_NOT_ZERO, rmax_label);\n  }\nelse if (repeat_type == OP_UPTO)\n  {\n  /* We need to preserve the counter. */\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);\n  allocate_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n  }\n\nif (bra == OP_BRAZERO)\n  BACKTRACK_AS(bracket_backtrack)->zero_matchingpath = LABEL();\n\nif (bra == OP_BRAMINZERO)\n  {\n  /* This is a backtrack path! (From the viewpoint of OP_BRAMINZERO) */\n  JUMPTO(SLJIT_JUMP, ((braminzero_backtrack *)parent)->matchingpath);\n  if (braminzero != NULL)\n    {\n    JUMPHERE(braminzero);\n    /* We need to release the end pointer to perform the\n    backtrack for the zero-length iteration. When\n    framesize is < 0, OP_ONCE will do the release itself. */\n    if (opcode == OP_ONCE && BACKTRACK_AS(bracket_backtrack)->u.framesize >= 0)\n      {\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n      }\n    else if (ket == OP_KETRMIN && opcode != OP_ONCE)\n      free_stack(common, 1);\n    }\n  /* Continue to the normal backtrack. */\n  }\n\nif ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO)\n  count_match(common);\n\n/* Skip the other alternatives. */\nwhile (*cc == OP_ALT)\n  cc += GET(cc, 1);\ncc += 1 + LINK_SIZE;\n\nif (opcode == OP_ONCE)\n  {\n  /* We temporarily encode the needs_control_head in the lowest bit.\n     Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns\n     the same value for small signed numbers (including negative numbers). */\n  BACKTRACK_AS(bracket_backtrack)->u.framesize = (BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0);\n  }\nreturn cc + repeat_length;\n}\n\nstatic pcre_uchar *compile_bracketpos_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\npcre_uchar opcode;\nint private_data_ptr;\nint cbraprivptr = 0;\nBOOL needs_control_head;\nint framesize;\nint stacksize;\nint offset = 0;\nBOOL zero = FALSE;\npcre_uchar *ccbegin = NULL;\nint stack; /* Also contains the offset of control head. */\nstruct sljit_label *loop = NULL;\nstruct jump_list *emptymatch = NULL;\n\nPUSH_BACKTRACK(sizeof(bracketpos_backtrack), cc, NULL);\nif (*cc == OP_BRAPOSZERO)\n  {\n  zero = TRUE;\n  cc++;\n  }\n\nopcode = *cc;\nprivate_data_ptr = PRIVATE_DATA(cc);\nSLJIT_ASSERT(private_data_ptr != 0);\nBACKTRACK_AS(bracketpos_backtrack)->private_data_ptr = private_data_ptr;\nswitch(opcode)\n  {\n  case OP_BRAPOS:\n  case OP_SBRAPOS:\n  ccbegin = cc + 1 + LINK_SIZE;\n  break;\n\n  case OP_CBRAPOS:\n  case OP_SCBRAPOS:\n  offset = GET2(cc, 1 + LINK_SIZE);\n  /* This case cannot be optimized in the same was as\n  normal capturing brackets. */\n  SLJIT_ASSERT(common->optimized_cbracket[offset] == 0);\n  cbraprivptr = OVECTOR_PRIV(offset);\n  offset <<= 1;\n  ccbegin = cc + 1 + LINK_SIZE + IMM2_SIZE;\n  break;\n\n  default:\n  SLJIT_UNREACHABLE();\n  break;\n  }\n\nframesize = get_framesize(common, cc, NULL, FALSE, &needs_control_head);\nBACKTRACK_AS(bracketpos_backtrack)->framesize = framesize;\nif (framesize < 0)\n  {\n  if (offset != 0)\n    {\n    stacksize = 2;\n    if (common->capture_last_ptr != 0)\n      stacksize++;\n    }\n  else\n    stacksize = 1;\n\n  if (needs_control_head)\n    stacksize++;\n  if (!zero)\n    stacksize++;\n\n  BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize;\n  allocate_stack(common, stacksize);\n  if (framesize == no_frame)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0);\n\n  stack = 0;\n  if (offset != 0)\n    {\n    stack = 2;\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1));\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);\n    if (common->capture_last_ptr != 0)\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0);\n    if (needs_control_head)\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n    if (common->capture_last_ptr != 0)\n      {\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0);\n      stack = 3;\n      }\n    }\n  else\n    {\n    if (needs_control_head)\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n    stack = 1;\n    }\n\n  if (needs_control_head)\n    stack++;\n  if (!zero)\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), SLJIT_IMM, 1);\n  if (needs_control_head)\n    {\n    stack--;\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0);\n    }\n  }\nelse\n  {\n  stacksize = framesize + 1;\n  if (!zero)\n    stacksize++;\n  if (needs_control_head)\n    stacksize++;\n  if (offset == 0)\n    stacksize++;\n  BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize;\n\n  allocate_stack(common, stacksize);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n  if (needs_control_head)\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n  OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), private_data_ptr, STACK_TOP, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));\n\n  stack = 0;\n  if (!zero)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 1);\n    stack = 1;\n    }\n  if (needs_control_head)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP2, 0);\n    stack++;\n    }\n  if (offset == 0)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), STR_PTR, 0);\n    stack++;\n    }\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP1, 0);\n  init_frame(common, cc, NULL, stacksize - 1, stacksize - framesize, FALSE);\n  stack -= 1 + (offset == 0);\n  }\n\nif (offset != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);\n\nloop = LABEL();\nwhile (*cc != OP_KETRPOS)\n  {\n  backtrack->top = NULL;\n  backtrack->topbacktracks = NULL;\n  cc += GET(cc, 1);\n\n  compile_matchingpath(common, ccbegin, cc, backtrack);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    return NULL;\n\n  if (framesize < 0)\n    {\n    if (framesize == no_frame)\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n\n    if (offset != 0)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);\n      if (common->capture_last_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n      }\n    else\n      {\n      if (opcode == OP_SBRAPOS)\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n      }\n\n    /* Even if the match is empty, we need to reset the control head. */\n    if (needs_control_head)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack));\n\n    if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS)\n      add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0));\n\n    if (!zero)\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0);\n    }\n  else\n    {\n    if (offset != 0)\n      {\n      OP2(SLJIT_SUB, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_IMM, stacksize * sizeof(sljit_sw));\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), cbraprivptr, STR_PTR, 0);\n      if (common->capture_last_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, offset >> 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n      }\n    else\n      {\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      OP2(SLJIT_SUB, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_sw));\n      if (opcode == OP_SBRAPOS)\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2));\n      OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), STACK(-framesize - 2), STR_PTR, 0);\n      }\n\n    /* Even if the match is empty, we need to reset the control head. */\n    if (needs_control_head)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_MEM1(STACK_TOP), STACK(stack));\n\n    if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS)\n      add_jump(compiler, &emptymatch, CMP(SLJIT_EQUAL, TMP1, 0, STR_PTR, 0));\n\n    if (!zero)\n      {\n      if (framesize < 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0);\n      else\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      }\n    }\n\n  JUMPTO(SLJIT_JUMP, loop);\n  flush_stubs(common);\n\n  compile_backtrackingpath(common, backtrack->top);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    return NULL;\n  set_jumps(backtrack->topbacktracks, LABEL());\n\n  if (framesize < 0)\n    {\n    if (offset != 0)\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);\n    else\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    }\n  else\n    {\n    if (offset != 0)\n      {\n      /* Last alternative. */\n      if (*cc == OP_KETRPOS)\n        OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), cbraprivptr);\n      }\n    else\n      {\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n      OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), STACK(-framesize - 2));\n      }\n    }\n\n  if (*cc == OP_KETRPOS)\n    break;\n  ccbegin = cc + 1 + LINK_SIZE;\n  }\n\n/* We don't have to restore the control head in case of a failed match. */\n\nbacktrack->topbacktracks = NULL;\nif (!zero)\n  {\n  if (framesize < 0)\n    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0));\n  else /* TMP2 is set to [private_data_ptr] above. */\n    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(TMP2), STACK(-stacksize), SLJIT_IMM, 0));\n  }\n\n/* None of them matched. */\nset_jumps(emptymatch, LABEL());\ncount_match(common);\nreturn cc + 1 + LINK_SIZE;\n}\n\nstatic SLJIT_INLINE pcre_uchar *get_iterator_parameters(compiler_common *common, pcre_uchar *cc, pcre_uchar *opcode, pcre_uchar *type, sljit_u32 *max, sljit_u32 *exact, pcre_uchar **end)\n{\nint class_len;\n\n*opcode = *cc;\n*exact = 0;\n\nif (*opcode >= OP_STAR && *opcode <= OP_POSUPTO)\n  {\n  cc++;\n  *type = OP_CHAR;\n  }\nelse if (*opcode >= OP_STARI && *opcode <= OP_POSUPTOI)\n  {\n  cc++;\n  *type = OP_CHARI;\n  *opcode -= OP_STARI - OP_STAR;\n  }\nelse if (*opcode >= OP_NOTSTAR && *opcode <= OP_NOTPOSUPTO)\n  {\n  cc++;\n  *type = OP_NOT;\n  *opcode -= OP_NOTSTAR - OP_STAR;\n  }\nelse if (*opcode >= OP_NOTSTARI && *opcode <= OP_NOTPOSUPTOI)\n  {\n  cc++;\n  *type = OP_NOTI;\n  *opcode -= OP_NOTSTARI - OP_STAR;\n  }\nelse if (*opcode >= OP_TYPESTAR && *opcode <= OP_TYPEPOSUPTO)\n  {\n  cc++;\n  *opcode -= OP_TYPESTAR - OP_STAR;\n  *type = OP_END;\n  }\nelse\n  {\n  SLJIT_ASSERT(*opcode == OP_CLASS || *opcode == OP_NCLASS || *opcode == OP_XCLASS);\n  *type = *opcode;\n  cc++;\n  class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(pcre_uchar))) : GET(cc, 0);\n  *opcode = cc[class_len - 1];\n\n  if (*opcode >= OP_CRSTAR && *opcode <= OP_CRMINQUERY)\n    {\n    *opcode -= OP_CRSTAR - OP_STAR;\n    *end = cc + class_len;\n\n    if (*opcode == OP_PLUS || *opcode == OP_MINPLUS)\n      {\n      *exact = 1;\n      *opcode -= OP_PLUS - OP_STAR;\n      }\n    }\n  else if (*opcode >= OP_CRPOSSTAR && *opcode <= OP_CRPOSQUERY)\n    {\n    *opcode -= OP_CRPOSSTAR - OP_POSSTAR;\n    *end = cc + class_len;\n\n    if (*opcode == OP_POSPLUS)\n      {\n      *exact = 1;\n      *opcode = OP_POSSTAR;\n      }\n    }\n  else\n    {\n    SLJIT_ASSERT(*opcode == OP_CRRANGE || *opcode == OP_CRMINRANGE || *opcode == OP_CRPOSRANGE);\n    *max = GET2(cc, (class_len + IMM2_SIZE));\n    *exact = GET2(cc, class_len);\n\n    if (*max == 0)\n      {\n      if (*opcode == OP_CRPOSRANGE)\n        *opcode = OP_POSSTAR;\n      else\n        *opcode -= OP_CRRANGE - OP_STAR;\n      }\n    else\n      {\n      *max -= *exact;\n      if (*max == 0)\n        *opcode = OP_EXACT;\n      else if (*max == 1)\n        {\n        if (*opcode == OP_CRPOSRANGE)\n          *opcode = OP_POSQUERY;\n        else\n          *opcode -= OP_CRRANGE - OP_QUERY;\n        }\n      else\n        {\n        if (*opcode == OP_CRPOSRANGE)\n          *opcode = OP_POSUPTO;\n        else\n          *opcode -= OP_CRRANGE - OP_UPTO;\n        }\n      }\n    *end = cc + class_len + 2 * IMM2_SIZE;\n    }\n  return cc;\n  }\n\nswitch(*opcode)\n  {\n  case OP_EXACT:\n  *exact = GET2(cc, 0);\n  cc += IMM2_SIZE;\n  break;\n\n  case OP_PLUS:\n  case OP_MINPLUS:\n  *exact = 1;\n  *opcode -= OP_PLUS - OP_STAR;\n  break;\n\n  case OP_POSPLUS:\n  *exact = 1;\n  *opcode = OP_POSSTAR;\n  break;\n\n  case OP_UPTO:\n  case OP_MINUPTO:\n  case OP_POSUPTO:\n  *max = GET2(cc, 0);\n  cc += IMM2_SIZE;\n  break;\n  }\n\nif (*type == OP_END)\n  {\n  *type = *cc;\n  *end = next_opcode(common, cc);\n  cc++;\n  return cc;\n  }\n\n*end = cc + 1;\n#ifdef SUPPORT_UTF\nif (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc);\n#endif\nreturn cc;\n}\n\nstatic pcre_uchar *compile_iterator_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\npcre_uchar opcode;\npcre_uchar type;\nsljit_u32 max = 0, exact;\nBOOL fast_fail;\nsljit_s32 fast_str_ptr;\nBOOL charpos_enabled;\npcre_uchar charpos_char;\nunsigned int charpos_othercasebit;\npcre_uchar *end;\njump_list *no_match = NULL;\njump_list *no_char1_match = NULL;\nstruct sljit_jump *jump = NULL;\nstruct sljit_label *label;\nint private_data_ptr = PRIVATE_DATA(cc);\nint base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP);\nint offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;\nint offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);\nint tmp_base, tmp_offset;\n\nPUSH_BACKTRACK(sizeof(char_iterator_backtrack), cc, NULL);\n\nfast_str_ptr = PRIVATE_DATA(cc + 1);\nfast_fail = TRUE;\n\nSLJIT_ASSERT(common->fast_forward_bc_ptr == NULL || fast_str_ptr == 0 || cc == common->fast_forward_bc_ptr);\n\nif (cc == common->fast_forward_bc_ptr)\n  fast_fail = FALSE;\nelse if (common->fast_fail_start_ptr == 0)\n  fast_str_ptr = 0;\n\nSLJIT_ASSERT(common->fast_forward_bc_ptr != NULL || fast_str_ptr == 0\n  || (fast_str_ptr >= common->fast_fail_start_ptr && fast_str_ptr <= common->fast_fail_end_ptr));\n\ncc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);\n\nif (type != OP_EXTUNI)\n  {\n  tmp_base = TMP3;\n  tmp_offset = 0;\n  }\nelse\n  {\n  tmp_base = SLJIT_MEM1(SLJIT_SP);\n  tmp_offset = POSSESSIVE0;\n  }\n\nif (fast_fail && fast_str_ptr != 0)\n  add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), fast_str_ptr));\n\n/* Handle fixed part first. */\nif (exact > 1)\n  {\n  SLJIT_ASSERT(fast_str_ptr == 0);\n  if (common->mode == JIT_COMPILE\n#ifdef SUPPORT_UTF\n      && !common->utf\n#endif\n      && type != OP_ANYNL && type != OP_EXTUNI)\n    {\n    OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(exact));\n    add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_GREATER, TMP1, 0, STR_END, 0));\n    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);\n    label = LABEL();\n    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, label);\n    }\n  else\n    {\n    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, exact);\n    label = LABEL();\n    compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, label);\n    }\n  }\nelse if (exact == 1)\n  compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, TRUE);\n\nswitch(opcode)\n  {\n  case OP_STAR:\n  case OP_UPTO:\n  SLJIT_ASSERT(fast_str_ptr == 0 || opcode == OP_STAR);\n\n  if (type == OP_ANYNL || type == OP_EXTUNI)\n    {\n    SLJIT_ASSERT(private_data_ptr == 0);\n    SLJIT_ASSERT(fast_str_ptr == 0);\n\n    allocate_stack(common, 2);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0);\n\n    if (opcode == OP_UPTO)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, SLJIT_IMM, max);\n\n    label = LABEL();\n    compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);\n    if (opcode == OP_UPTO)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0);\n      OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n      jump = JUMP(SLJIT_ZERO);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE0, TMP1, 0);\n      }\n\n    /* We cannot use TMP3 because of this allocate_stack. */\n    allocate_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n    JUMPTO(SLJIT_JUMP, label);\n    if (jump != NULL)\n      JUMPHERE(jump);\n    }\n  else\n    {\n    charpos_enabled = FALSE;\n    charpos_char = 0;\n    charpos_othercasebit = 0;\n\n    if ((type != OP_CHAR && type != OP_CHARI) && (*end == OP_CHAR || *end == OP_CHARI))\n      {\n      charpos_enabled = TRUE;\n#ifdef SUPPORT_UTF\n      charpos_enabled = !common->utf || !HAS_EXTRALEN(end[1]);\n#endif\n      if (charpos_enabled && *end == OP_CHARI && char_has_othercase(common, end + 1))\n        {\n        charpos_othercasebit = char_get_othercase_bit(common, end + 1);\n        if (charpos_othercasebit == 0)\n          charpos_enabled = FALSE;\n        }\n\n      if (charpos_enabled)\n        {\n        charpos_char = end[1];\n        /* Consumpe the OP_CHAR opcode. */\n        end += 2;\n#if defined COMPILE_PCRE8\n        SLJIT_ASSERT((charpos_othercasebit >> 8) == 0);\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n        SLJIT_ASSERT((charpos_othercasebit >> 9) == 0);\n        if ((charpos_othercasebit & 0x100) != 0)\n          charpos_othercasebit = (charpos_othercasebit & 0xff) << 8;\n#endif\n        if (charpos_othercasebit != 0)\n          charpos_char |= charpos_othercasebit;\n\n        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.enabled = TRUE;\n        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.chr = charpos_char;\n        BACKTRACK_AS(char_iterator_backtrack)->u.charpos.othercasebit = charpos_othercasebit;\n        }\n      }\n\n    if (charpos_enabled)\n      {\n      if (opcode == OP_UPTO)\n        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max + 1);\n\n      /* Search the first instance of charpos_char. */\n      jump = JUMP(SLJIT_JUMP);\n      label = LABEL();\n      if (opcode == OP_UPTO)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n        add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_ZERO));\n        }\n      compile_char1_matchingpath(common, type, cc, &backtrack->topbacktracks, FALSE);\n      if (fast_str_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n      JUMPHERE(jump);\n\n      detect_partial_match(common, &backtrack->topbacktracks);\n      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n      if (charpos_othercasebit != 0)\n        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);\n      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);\n\n      if (private_data_ptr == 0)\n        allocate_stack(common, 2);\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);\n      if (opcode == OP_UPTO)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n        add_jump(compiler, &no_match, JUMP(SLJIT_ZERO));\n        }\n\n      /* Search the last instance of charpos_char. */\n      label = LABEL();\n      compile_char1_matchingpath(common, type, cc, &no_match, FALSE);\n      if (fast_str_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n      detect_partial_match(common, &no_match);\n      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0));\n      if (charpos_othercasebit != 0)\n        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, charpos_othercasebit);\n      if (opcode == OP_STAR)\n        {\n        CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char, label);\n        OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n        }\n      else\n        {\n        jump = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, charpos_char);\n        OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n        JUMPHERE(jump);\n        }\n\n      if (opcode == OP_UPTO)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n        JUMPTO(SLJIT_NOT_ZERO, label);\n        }\n      else\n        JUMPTO(SLJIT_JUMP, label);\n\n      set_jumps(no_match, LABEL());\n      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n      OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      }\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n    else if (common->utf)\n      {\n      if (private_data_ptr == 0)\n        allocate_stack(common, 2);\n\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);\n\n      if (opcode == OP_UPTO)\n        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);\n\n      label = LABEL();\n      compile_char1_matchingpath(common, type, cc, &no_match, TRUE);\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n\n      if (opcode == OP_UPTO)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n        JUMPTO(SLJIT_NOT_ZERO, label);\n        }\n      else\n        JUMPTO(SLJIT_JUMP, label);\n\n      set_jumps(no_match, LABEL());\n      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n      if (fast_str_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n      }\n#endif\n    else\n      {\n      if (private_data_ptr == 0)\n        allocate_stack(common, 2);\n\n      OP1(SLJIT_MOV, base, offset1, STR_PTR, 0);\n      if (opcode == OP_UPTO)\n        OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);\n\n      label = LABEL();\n      detect_partial_match(common, &no_match);\n      compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);\n      if (opcode == OP_UPTO)\n        {\n        OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n        JUMPTO(SLJIT_NOT_ZERO, label);\n        OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n        }\n      else\n        JUMPTO(SLJIT_JUMP, label);\n\n      set_jumps(no_char1_match, LABEL());\n      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n      set_jumps(no_match, LABEL());\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      if (fast_str_ptr != 0)\n        OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n      }\n    }\n  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();\n  break;\n\n  case OP_MINSTAR:\n  if (private_data_ptr == 0)\n    allocate_stack(common, 1);\n  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();\n  if (fast_str_ptr != 0)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n  break;\n\n  case OP_MINUPTO:\n  SLJIT_ASSERT(fast_str_ptr == 0);\n  if (private_data_ptr == 0)\n    allocate_stack(common, 2);\n  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n  OP1(SLJIT_MOV, base, offset1, SLJIT_IMM, max + 1);\n  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();\n  break;\n\n  case OP_QUERY:\n  case OP_MINQUERY:\n  SLJIT_ASSERT(fast_str_ptr == 0);\n  if (private_data_ptr == 0)\n    allocate_stack(common, 1);\n  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n  if (opcode == OP_QUERY)\n    compile_char1_matchingpath(common, type, cc, &BACKTRACK_AS(char_iterator_backtrack)->u.backtracks, TRUE);\n  BACKTRACK_AS(char_iterator_backtrack)->matchingpath = LABEL();\n  break;\n\n  case OP_EXACT:\n  break;\n\n  case OP_POSSTAR:\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n  if (common->utf)\n    {\n    OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);\n    label = LABEL();\n    compile_char1_matchingpath(common, type, cc, &no_match, TRUE);\n    OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);\n    JUMPTO(SLJIT_JUMP, label);\n    set_jumps(no_match, LABEL());\n    OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);\n    if (fast_str_ptr != 0)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n    break;\n    }\n#endif\n  label = LABEL();\n  detect_partial_match(common, &no_match);\n  compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);\n  JUMPTO(SLJIT_JUMP, label);\n  set_jumps(no_char1_match, LABEL());\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  set_jumps(no_match, LABEL());\n  if (fast_str_ptr != 0)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), fast_str_ptr, STR_PTR, 0);\n  break;\n\n  case OP_POSUPTO:\n  SLJIT_ASSERT(fast_str_ptr == 0);\n#if defined SUPPORT_UTF && !defined COMPILE_PCRE32\n  if (common->utf)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);\n    OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);\n    label = LABEL();\n    compile_char1_matchingpath(common, type, cc, &no_match, TRUE);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1, STR_PTR, 0);\n    OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n    JUMPTO(SLJIT_NOT_ZERO, label);\n    set_jumps(no_match, LABEL());\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), POSSESSIVE1);\n    break;\n    }\n#endif\n  OP1(SLJIT_MOV, tmp_base, tmp_offset, SLJIT_IMM, max);\n  label = LABEL();\n  detect_partial_match(common, &no_match);\n  compile_char1_matchingpath(common, type, cc, &no_char1_match, FALSE);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, tmp_base, tmp_offset, tmp_base, tmp_offset, SLJIT_IMM, 1);\n  JUMPTO(SLJIT_NOT_ZERO, label);\n  OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  set_jumps(no_char1_match, LABEL());\n  OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n  set_jumps(no_match, LABEL());\n  break;\n\n  case OP_POSQUERY:\n  SLJIT_ASSERT(fast_str_ptr == 0);\n  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);\n  compile_char1_matchingpath(common, type, cc, &no_match, TRUE);\n  OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);\n  set_jumps(no_match, LABEL());\n  OP1(SLJIT_MOV, STR_PTR, 0, tmp_base, tmp_offset);\n  break;\n\n  default:\n  SLJIT_UNREACHABLE();\n  break;\n  }\n\ncount_match(common);\nreturn end;\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_fail_accept_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\n\nPUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);\n\nif (*cc == OP_FAIL)\n  {\n  add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));\n  return cc + 1;\n  }\n\nif (*cc == OP_ASSERT_ACCEPT || common->currententry != NULL || !common->might_be_empty)\n  {\n  /* No need to check notempty conditions. */\n  if (common->accept_label == NULL)\n    add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP));\n  else\n    JUMPTO(SLJIT_JUMP, common->accept_label);\n  return cc + 1;\n  }\n\nif (common->accept_label == NULL)\n  add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0)));\nelse\n  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), common->accept_label);\nOP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\nOP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty));\nadd_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\nOP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart));\nif (common->accept_label == NULL)\n  add_jump(compiler, &common->accept, CMP(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0));\nelse\n  CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, common->accept_label);\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\nif (common->accept_label == NULL)\n  add_jump(compiler, &common->accept, CMP(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0));\nelse\n  CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, common->accept_label);\nadd_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP));\nreturn cc + 1;\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_close_matchingpath(compiler_common *common, pcre_uchar *cc)\n{\nDEFINE_COMPILER;\nint offset = GET2(cc, 1);\nBOOL optimized_cbracket = common->optimized_cbracket[offset] != 0;\n\n/* Data will be discarded anyway... */\nif (common->currententry != NULL)\n  return cc + 1 + IMM2_SIZE;\n\nif (!optimized_cbracket)\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR_PRIV(offset));\noffset <<= 1;\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\nif (!optimized_cbracket)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\nreturn cc + 1 + IMM2_SIZE;\n}\n\nstatic SLJIT_INLINE pcre_uchar *compile_control_verb_matchingpath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\npcre_uchar opcode = *cc;\npcre_uchar *ccend = cc + 1;\n\nif (opcode == OP_PRUNE_ARG || opcode == OP_SKIP_ARG || opcode == OP_THEN_ARG)\n  ccend += 2 + cc[1];\n\nPUSH_BACKTRACK(sizeof(backtrack_common), cc, NULL);\n\nif (opcode == OP_SKIP)\n  {\n  allocate_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n  return ccend;\n  }\n\nif (opcode == OP_PRUNE_ARG || opcode == OP_THEN_ARG)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);\n  }\n\nreturn ccend;\n}\n\nstatic pcre_uchar then_trap_opcode[1] = { OP_THEN_TRAP };\n\nstatic SLJIT_INLINE void compile_then_trap_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\nBOOL needs_control_head;\nint size;\n\nPUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc);\ncommon->then_trap = BACKTRACK_AS(then_trap_backtrack);\nBACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode;\nBACKTRACK_AS(then_trap_backtrack)->start = (sljit_sw)(cc - common->start);\nBACKTRACK_AS(then_trap_backtrack)->framesize = get_framesize(common, cc, ccend, FALSE, &needs_control_head);\n\nsize = BACKTRACK_AS(then_trap_backtrack)->framesize;\nsize = 3 + (size < 0 ? 0 : size);\n\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\nallocate_stack(common, size);\nif (size > 3)\n  OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0, SLJIT_IMM, (size - 3) * sizeof(sljit_sw));\nelse\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 1), SLJIT_IMM, BACKTRACK_AS(then_trap_backtrack)->start);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 2), SLJIT_IMM, type_then_trap);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(size - 3), TMP2, 0);\n\nsize = BACKTRACK_AS(then_trap_backtrack)->framesize;\nif (size >= 0)\n  init_frame(common, cc, ccend, size - 1, 0, FALSE);\n}\n\nstatic void compile_matchingpath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent)\n{\nDEFINE_COMPILER;\nbacktrack_common *backtrack;\nBOOL has_then_trap = FALSE;\nthen_trap_backtrack *save_then_trap = NULL;\n\nSLJIT_ASSERT(*ccend == OP_END || (*ccend >= OP_ALT && *ccend <= OP_KETRPOS));\n\nif (common->has_then && common->then_offsets[cc - common->start] != 0)\n  {\n  SLJIT_ASSERT(*ccend != OP_END && common->control_head_ptr != 0);\n  has_then_trap = TRUE;\n  save_then_trap = common->then_trap;\n  /* Tail item on backtrack. */\n  compile_then_trap_matchingpath(common, cc, ccend, parent);\n  }\n\nwhile (cc < ccend)\n  {\n  switch(*cc)\n    {\n    case OP_SOD:\n    case OP_SOM:\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    case OP_EODN:\n    case OP_EOD:\n    case OP_DOLL:\n    case OP_DOLLM:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_REVERSE:\n    cc = compile_simple_assertion_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);\n    break;\n\n    case OP_NOT_DIGIT:\n    case OP_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_WORDCHAR:\n    case OP_ANY:\n    case OP_ALLANY:\n    case OP_ANYBYTE:\n    case OP_NOTPROP:\n    case OP_PROP:\n    case OP_ANYNL:\n    case OP_NOT_HSPACE:\n    case OP_HSPACE:\n    case OP_NOT_VSPACE:\n    case OP_VSPACE:\n    case OP_EXTUNI:\n    case OP_NOT:\n    case OP_NOTI:\n    cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);\n    break;\n\n    case OP_SET_SOM:\n    PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc);\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\n    allocate_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0);\n    cc++;\n    break;\n\n    case OP_CHAR:\n    case OP_CHARI:\n    if (common->mode == JIT_COMPILE)\n      cc = compile_charn_matchingpath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);\n    else\n      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);\n    break;\n\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEEXACT:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEPOSQUERY:\n    case OP_TYPEPOSUPTO:\n    cc = compile_iterator_matchingpath(common, cc, parent);\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    if (cc[1 + (32 / sizeof(pcre_uchar))] >= OP_CRSTAR && cc[1 + (32 / sizeof(pcre_uchar))] <= OP_CRPOSRANGE)\n      cc = compile_iterator_matchingpath(common, cc, parent);\n    else\n      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);\n    break;\n\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n    case OP_XCLASS:\n    if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRPOSRANGE)\n      cc = compile_iterator_matchingpath(common, cc, parent);\n    else\n      cc = compile_char1_matchingpath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE);\n    break;\n#endif\n\n    case OP_REF:\n    case OP_REFI:\n    if (cc[1 + IMM2_SIZE] >= OP_CRSTAR && cc[1 + IMM2_SIZE] <= OP_CRPOSRANGE)\n      cc = compile_ref_iterator_matchingpath(common, cc, parent);\n    else\n      {\n      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);\n      cc += 1 + IMM2_SIZE;\n      }\n    break;\n\n    case OP_DNREF:\n    case OP_DNREFI:\n    if (cc[1 + 2 * IMM2_SIZE] >= OP_CRSTAR && cc[1 + 2 * IMM2_SIZE] <= OP_CRPOSRANGE)\n      cc = compile_ref_iterator_matchingpath(common, cc, parent);\n    else\n      {\n      compile_dnref_search(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks);\n      compile_ref_matchingpath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE);\n      cc += 1 + 2 * IMM2_SIZE;\n      }\n    break;\n\n    case OP_RECURSE:\n    cc = compile_recurse_matchingpath(common, cc, parent);\n    break;\n\n    case OP_CALLOUT:\n    cc = compile_callout_matchingpath(common, cc, parent);\n    break;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc);\n    cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE);\n    break;\n\n    case OP_BRAMINZERO:\n    PUSH_BACKTRACK_NOVALUE(sizeof(braminzero_backtrack), cc);\n    cc = bracketend(cc + 1);\n    if (*(cc - 1 - LINK_SIZE) != OP_KETRMIN)\n      {\n      allocate_stack(common, 1);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n      }\n    else\n      {\n      allocate_stack(common, 2);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), STR_PTR, 0);\n      }\n    BACKTRACK_AS(braminzero_backtrack)->matchingpath = LABEL();\n    count_match(common);\n    break;\n\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRA:\n    case OP_CBRA:\n    case OP_COND:\n    case OP_SBRA:\n    case OP_SCBRA:\n    case OP_SCOND:\n    cc = compile_bracket_matchingpath(common, cc, parent);\n    break;\n\n    case OP_BRAZERO:\n    if (cc[1] > OP_ASSERTBACK_NOT)\n      cc = compile_bracket_matchingpath(common, cc, parent);\n    else\n      {\n      PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc);\n      cc = compile_assert_matchingpath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE);\n      }\n    break;\n\n    case OP_BRAPOS:\n    case OP_CBRAPOS:\n    case OP_SBRAPOS:\n    case OP_SCBRAPOS:\n    case OP_BRAPOSZERO:\n    cc = compile_bracketpos_matchingpath(common, cc, parent);\n    break;\n\n    case OP_MARK:\n    PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc);\n    SLJIT_ASSERT(common->mark_ptr != 0);\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), common->mark_ptr);\n    allocate_stack(common, common->has_skip_arg ? 5 : 1);\n    OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0), TMP2, 0);\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_sw)(cc + 2));\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP2, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0);\n    if (common->has_skip_arg)\n      {\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, STACK_TOP, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, type_mark);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), SLJIT_IMM, (sljit_sw)(cc + 2));\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(3), STR_PTR, 0);\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0);\n      }\n    cc += 1 + 2 + cc[1];\n    break;\n\n    case OP_PRUNE:\n    case OP_PRUNE_ARG:\n    case OP_SKIP:\n    case OP_SKIP_ARG:\n    case OP_THEN:\n    case OP_THEN_ARG:\n    case OP_COMMIT:\n    cc = compile_control_verb_matchingpath(common, cc, parent);\n    break;\n\n    case OP_FAIL:\n    case OP_ACCEPT:\n    case OP_ASSERT_ACCEPT:\n    cc = compile_fail_accept_matchingpath(common, cc, parent);\n    break;\n\n    case OP_CLOSE:\n    cc = compile_close_matchingpath(common, cc);\n    break;\n\n    case OP_SKIPZERO:\n    cc = bracketend(cc + 1);\n    break;\n\n    default:\n    SLJIT_UNREACHABLE();\n    return;\n    }\n  if (cc == NULL)\n    return;\n  }\n\nif (has_then_trap)\n  {\n  /* Head item on backtrack. */\n  PUSH_BACKTRACK_NOVALUE(sizeof(then_trap_backtrack), cc);\n  BACKTRACK_AS(then_trap_backtrack)->common.cc = then_trap_opcode;\n  BACKTRACK_AS(then_trap_backtrack)->then_trap = common->then_trap;\n  common->then_trap = save_then_trap;\n  }\nSLJIT_ASSERT(cc == ccend);\n}\n\n#undef PUSH_BACKTRACK\n#undef PUSH_BACKTRACK_NOVALUE\n#undef BACKTRACK_AS\n\n#define COMPILE_BACKTRACKINGPATH(current) \\\n  do \\\n    { \\\n    compile_backtrackingpath(common, (current)); \\\n    if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \\\n      return; \\\n    } \\\n  while (0)\n\n#define CURRENT_AS(type) ((type *)current)\n\nstatic void compile_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\npcre_uchar *cc = current->cc;\npcre_uchar opcode;\npcre_uchar type;\nsljit_u32 max = 0, exact;\nstruct sljit_label *label = NULL;\nstruct sljit_jump *jump = NULL;\njump_list *jumplist = NULL;\npcre_uchar *end;\nint private_data_ptr = PRIVATE_DATA(cc);\nint base = (private_data_ptr == 0) ? SLJIT_MEM1(STACK_TOP) : SLJIT_MEM1(SLJIT_SP);\nint offset0 = (private_data_ptr == 0) ? STACK(0) : private_data_ptr;\nint offset1 = (private_data_ptr == 0) ? STACK(1) : private_data_ptr + (int)sizeof(sljit_sw);\n\ncc = get_iterator_parameters(common, cc, &opcode, &type, &max, &exact, &end);\n\nswitch(opcode)\n  {\n  case OP_STAR:\n  case OP_UPTO:\n  if (type == OP_ANYNL || type == OP_EXTUNI)\n    {\n    SLJIT_ASSERT(private_data_ptr == 0);\n    set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, 1);\n    CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n    }\n  else\n    {\n    if (CURRENT_AS(char_iterator_backtrack)->u.charpos.enabled)\n      {\n      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n      OP1(SLJIT_MOV, TMP2, 0, base, offset1);\n      OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1));\n\n      jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, TMP2, 0);\n      label = LABEL();\n      OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1));\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      if (CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit != 0)\n        OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.othercasebit);\n      CMPTO(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, CURRENT_AS(char_iterator_backtrack)->u.charpos.chr, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n      skip_char_back(common);\n      CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP2, 0, label);\n      }\n    else\n      {\n      OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n      jump = CMP(SLJIT_LESS_EQUAL, STR_PTR, 0, base, offset1);\n      skip_char_back(common);\n      OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n      JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n      }\n    JUMPHERE(jump);\n    if (private_data_ptr == 0)\n      free_stack(common, 2);\n    }\n  break;\n\n  case OP_MINSTAR:\n  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);\n  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n  set_jumps(jumplist, LABEL());\n  if (private_data_ptr == 0)\n    free_stack(common, 1);\n  break;\n\n  case OP_MINUPTO:\n  OP1(SLJIT_MOV, TMP1, 0, base, offset1);\n  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n  OP2(SLJIT_SUB | SLJIT_SET_Z, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\n  add_jump(compiler, &jumplist, JUMP(SLJIT_ZERO));\n\n  OP1(SLJIT_MOV, base, offset1, TMP1, 0);\n  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);\n  OP1(SLJIT_MOV, base, offset0, STR_PTR, 0);\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n\n  set_jumps(jumplist, LABEL());\n  if (private_data_ptr == 0)\n    free_stack(common, 2);\n  break;\n\n  case OP_QUERY:\n  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n  OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);\n  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n  jump = JUMP(SLJIT_JUMP);\n  set_jumps(CURRENT_AS(char_iterator_backtrack)->u.backtracks, LABEL());\n  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n  OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n  JUMPHERE(jump);\n  if (private_data_ptr == 0)\n    free_stack(common, 1);\n  break;\n\n  case OP_MINQUERY:\n  OP1(SLJIT_MOV, STR_PTR, 0, base, offset0);\n  OP1(SLJIT_MOV, base, offset0, SLJIT_IMM, 0);\n  jump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n  compile_char1_matchingpath(common, type, cc, &jumplist, TRUE);\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(char_iterator_backtrack)->matchingpath);\n  set_jumps(jumplist, LABEL());\n  JUMPHERE(jump);\n  if (private_data_ptr == 0)\n    free_stack(common, 1);\n  break;\n\n  case OP_EXACT:\n  case OP_POSSTAR:\n  case OP_POSQUERY:\n  case OP_POSUPTO:\n  break;\n\n  default:\n  SLJIT_UNREACHABLE();\n  break;\n  }\n\nset_jumps(current->topbacktracks, LABEL());\n}\n\nstatic SLJIT_INLINE void compile_ref_iterator_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\npcre_uchar *cc = current->cc;\nBOOL ref = (*cc == OP_REF || *cc == OP_REFI);\npcre_uchar type;\n\ntype = cc[ref ? 1 + IMM2_SIZE : 1 + 2 * IMM2_SIZE];\n\nif ((type & 0x1) == 0)\n  {\n  /* Maximize case. */\n  set_jumps(current->topbacktracks, LABEL());\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);\n  return;\n  }\n\nOP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\nCMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(ref_iterator_backtrack)->matchingpath);\nset_jumps(current->topbacktracks, LABEL());\nfree_stack(common, ref ? 2 : 3);\n}\n\nstatic SLJIT_INLINE void compile_recurse_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\n\nif (CURRENT_AS(recurse_backtrack)->inlined_pattern)\n  compile_backtrackingpath(common, current->top);\nset_jumps(current->topbacktracks, LABEL());\nif (CURRENT_AS(recurse_backtrack)->inlined_pattern)\n  return;\n\nif (common->has_set_som && common->mark_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n  free_stack(common, 2);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), TMP2, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP1, 0);\n  }\nelse if (common->has_set_som || common->mark_ptr != 0)\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr, TMP2, 0);\n  }\n}\n\nstatic void compile_assert_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\npcre_uchar *cc = current->cc;\npcre_uchar bra = OP_BRA;\nstruct sljit_jump *brajump = NULL;\n\nSLJIT_ASSERT(*cc != OP_BRAMINZERO);\nif (*cc == OP_BRAZERO)\n  {\n  bra = *cc;\n  cc++;\n  }\n\nif (bra == OP_BRAZERO)\n  {\n  SLJIT_ASSERT(current->topbacktracks == NULL);\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  }\n\nif (CURRENT_AS(assert_backtrack)->framesize < 0)\n  {\n  set_jumps(current->topbacktracks, LABEL());\n\n  if (bra == OP_BRAZERO)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n    CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath);\n    free_stack(common, 1);\n    }\n  return;\n  }\n\nif (bra == OP_BRAZERO)\n  {\n  if (*cc == OP_ASSERT_NOT || *cc == OP_ASSERTBACK_NOT)\n    {\n    OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n    CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->matchingpath);\n    free_stack(common, 1);\n    return;\n    }\n  free_stack(common, 1);\n  brajump = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0);\n  }\n\nif (*cc == OP_ASSERT || *cc == OP_ASSERTBACK)\n  {\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr);\n  add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(assert_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(assert_backtrack)->framesize - 1));\n\n  set_jumps(current->topbacktracks, LABEL());\n  }\nelse\n  set_jumps(current->topbacktracks, LABEL());\n\nif (bra == OP_BRAZERO)\n  {\n  /* We know there is enough place on the stack. */\n  OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_sw));\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0);\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(assert_backtrack)->matchingpath);\n  JUMPHERE(brajump);\n  }\n}\n\nstatic void compile_bracket_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\nint opcode, stacksize, alt_count, alt_max;\nint offset = 0;\nint private_data_ptr = CURRENT_AS(bracket_backtrack)->private_data_ptr;\nint repeat_ptr = 0, repeat_type = 0, repeat_count = 0;\npcre_uchar *cc = current->cc;\npcre_uchar *ccbegin;\npcre_uchar *ccprev;\npcre_uchar bra = OP_BRA;\npcre_uchar ket;\nassert_backtrack *assert;\nsljit_uw *next_update_addr = NULL;\nBOOL has_alternatives;\nBOOL needs_control_head = FALSE;\nstruct sljit_jump *brazero = NULL;\nstruct sljit_jump *alt1 = NULL;\nstruct sljit_jump *alt2 = NULL;\nstruct sljit_jump *once = NULL;\nstruct sljit_jump *cond = NULL;\nstruct sljit_label *rmin_label = NULL;\nstruct sljit_label *exact_label = NULL;\n\nif (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO)\n  {\n  bra = *cc;\n  cc++;\n  }\n\nopcode = *cc;\nccbegin = bracketend(cc) - 1 - LINK_SIZE;\nket = *ccbegin;\nif (ket == OP_KET && PRIVATE_DATA(ccbegin) != 0)\n  {\n  repeat_ptr = PRIVATE_DATA(ccbegin);\n  repeat_type = PRIVATE_DATA(ccbegin + 2);\n  repeat_count = PRIVATE_DATA(ccbegin + 3);\n  SLJIT_ASSERT(repeat_type != 0 && repeat_count != 0);\n  if (repeat_type == OP_UPTO)\n    ket = OP_KETRMAX;\n  if (repeat_type == OP_MINUPTO)\n    ket = OP_KETRMIN;\n  }\nccbegin = cc;\ncc += GET(cc, 1);\nhas_alternatives = *cc == OP_ALT;\nif (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))\n  has_alternatives = (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) || CURRENT_AS(bracket_backtrack)->u.condfailed != NULL;\nif (opcode == OP_CBRA || opcode == OP_SCBRA)\n  offset = (GET2(ccbegin, 1 + LINK_SIZE)) << 1;\nif (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN))\n  opcode = OP_SCOND;\nif (SLJIT_UNLIKELY(opcode == OP_ONCE_NC))\n  opcode = OP_ONCE;\n\nalt_max = has_alternatives ? no_alternatives(ccbegin) : 0;\n\n/* Decoding the needs_control_head in framesize. */\nif (opcode == OP_ONCE)\n  {\n  needs_control_head = (CURRENT_AS(bracket_backtrack)->u.framesize & 0x1) != 0;\n  CURRENT_AS(bracket_backtrack)->u.framesize >>= 1;\n  }\n\nif (ket != OP_KET && repeat_type != 0)\n  {\n  /* TMP1 is used in OP_KETRMIN below. */\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  if (repeat_type == OP_UPTO)\n    OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0, SLJIT_IMM, 1);\n  else\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0);\n  }\n\nif (ket == OP_KETRMAX)\n  {\n  if (bra == OP_BRAZERO)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, 1);\n    brazero = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, 0);\n    }\n  }\nelse if (ket == OP_KETRMIN)\n  {\n  if (bra != OP_BRAMINZERO)\n    {\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    if (repeat_type != 0)\n      {\n      /* TMP1 was set a few lines above. */\n      CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);\n      /* Drop STR_PTR for non-greedy plus quantifier. */\n      if (opcode != OP_ONCE)\n        free_stack(common, 1);\n      }\n    else if (opcode >= OP_SBRA || opcode == OP_ONCE)\n      {\n      /* Checking zero-length iteration. */\n      if (opcode != OP_ONCE || CURRENT_AS(bracket_backtrack)->u.framesize < 0)\n        CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);\n      else\n        {\n        OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n        CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 2), CURRENT_AS(bracket_backtrack)->recursive_matchingpath);\n        }\n      /* Drop STR_PTR for non-greedy plus quantifier. */\n      if (opcode != OP_ONCE)\n        free_stack(common, 1);\n      }\n    else\n      JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);\n    }\n  rmin_label = LABEL();\n  if (repeat_type != 0)\n    OP2(SLJIT_ADD, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);\n  }\nelse if (bra == OP_BRAZERO)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  brazero = CMP(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0);\n  }\nelse if (repeat_type == OP_EXACT)\n  {\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);\n  exact_label = LABEL();\n  }\n\nif (offset != 0)\n  {\n  if (common->capture_last_ptr != 0)\n    {\n    SLJIT_ASSERT(common->optimized_cbracket[offset >> 1] == 0);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2));\n    free_stack(common, 3);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP2, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP1, 0);\n    }\n  else if (common->optimized_cbracket[offset >> 1] == 0)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    free_stack(common, 2);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);\n    }\n  }\n\nif (SLJIT_UNLIKELY(opcode == OP_ONCE))\n  {\n  if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)\n    {\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n    add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n    }\n  once = JUMP(SLJIT_JUMP);\n  }\nelse if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))\n  {\n  if (has_alternatives)\n    {\n    /* Always exactly one alternative. */\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, 1);\n\n    alt_max = 2;\n    alt1 = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw));\n    }\n  }\nelse if (has_alternatives)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n\n  if (alt_max > 4)\n    {\n    /* Table jump if alt_max is greater than 4. */\n    next_update_addr = allocate_read_only_data(common, alt_max * sizeof(sljit_uw));\n    if (SLJIT_UNLIKELY(next_update_addr == NULL))\n      return;\n    sljit_emit_ijump(compiler, SLJIT_JUMP, SLJIT_MEM1(TMP1), (sljit_sw)next_update_addr);\n    add_label_addr(common, next_update_addr++);\n    }\n  else\n    {\n    if (alt_max == 4)\n      alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));\n    alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, sizeof(sljit_uw));\n    }\n  }\n\nCOMPILE_BACKTRACKINGPATH(current->top);\nif (current->topbacktracks)\n  set_jumps(current->topbacktracks, LABEL());\n\nif (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND))\n  {\n  /* Conditional block always has at most one alternative. */\n  if (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT)\n    {\n    SLJIT_ASSERT(has_alternatives);\n    assert = CURRENT_AS(bracket_backtrack)->u.assert;\n    if (assert->framesize >= 0 && (ccbegin[1 + LINK_SIZE] == OP_ASSERT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK))\n      {\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr);\n      add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1));\n      }\n    cond = JUMP(SLJIT_JUMP);\n    set_jumps(CURRENT_AS(bracket_backtrack)->u.assert->condfailed, LABEL());\n    }\n  else if (CURRENT_AS(bracket_backtrack)->u.condfailed != NULL)\n    {\n    SLJIT_ASSERT(has_alternatives);\n    cond = JUMP(SLJIT_JUMP);\n    set_jumps(CURRENT_AS(bracket_backtrack)->u.condfailed, LABEL());\n    }\n  else\n    SLJIT_ASSERT(!has_alternatives);\n  }\n\nif (has_alternatives)\n  {\n  alt_count = sizeof(sljit_uw);\n  do\n    {\n    current->top = NULL;\n    current->topbacktracks = NULL;\n    current->nextbacktracks = NULL;\n    /* Conditional blocks always have an additional alternative, even if it is empty. */\n    if (*cc == OP_ALT)\n      {\n      ccprev = cc + 1 + LINK_SIZE;\n      cc += GET(cc, 1);\n      if (opcode != OP_COND && opcode != OP_SCOND)\n        {\n        if (opcode != OP_ONCE)\n          {\n          if (private_data_ptr != 0)\n            OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), private_data_ptr);\n          else\n            OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n          }\n        else\n          OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(needs_control_head ? 1 : 0));\n        }\n      compile_matchingpath(common, ccprev, cc, current);\n      if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n        return;\n      }\n\n    /* Instructions after the current alternative is successfully matched. */\n    /* There is a similar code in compile_bracket_matchingpath. */\n    if (opcode == OP_ONCE)\n      match_once_common(common, ket, CURRENT_AS(bracket_backtrack)->u.framesize, private_data_ptr, has_alternatives, needs_control_head);\n\n    stacksize = 0;\n    if (repeat_type == OP_MINUPTO)\n      {\n      /* We need to preserve the counter. TMP2 will be used below. */\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr);\n      stacksize++;\n      }\n    if (ket != OP_KET || bra != OP_BRA)\n      stacksize++;\n    if (offset != 0)\n      {\n      if (common->capture_last_ptr != 0)\n        stacksize++;\n      if (common->optimized_cbracket[offset >> 1] == 0)\n        stacksize += 2;\n      }\n    if (opcode != OP_ONCE)\n      stacksize++;\n\n    if (stacksize > 0)\n      allocate_stack(common, stacksize);\n\n    stacksize = 0;\n    if (repeat_type == OP_MINUPTO)\n      {\n      /* TMP2 was set above. */\n      OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(stacksize), TMP2, 0, SLJIT_IMM, 1);\n      stacksize++;\n      }\n\n    if (ket != OP_KET || bra != OP_BRA)\n      {\n      if (ket != OP_KET)\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0);\n      else\n        OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0);\n      stacksize++;\n      }\n\n    if (offset != 0)\n      stacksize = match_capture_common(common, stacksize, offset, private_data_ptr);\n\n    if (opcode != OP_ONCE)\n      OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, alt_count);\n\n    if (offset != 0 && ket == OP_KETRMAX && common->optimized_cbracket[offset >> 1] != 0)\n      {\n      /* If ket is not OP_KETRMAX, this code path is executed after the jump to alternative_matchingpath. */\n      SLJIT_ASSERT(private_data_ptr == OVECTOR(offset + 0));\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), STR_PTR, 0);\n      }\n\n    JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->alternative_matchingpath);\n\n    if (opcode != OP_ONCE)\n      {\n      if (alt_max > 4)\n        add_label_addr(common, next_update_addr++);\n      else\n        {\n        if (alt_count != 2 * sizeof(sljit_uw))\n          {\n          JUMPHERE(alt1);\n          if (alt_max == 3 && alt_count == sizeof(sljit_uw))\n            alt2 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_uw));\n          }\n        else\n          {\n          JUMPHERE(alt2);\n          if (alt_max == 4)\n            alt1 = CMP(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_uw));\n          }\n        }\n      alt_count += sizeof(sljit_uw);\n      }\n\n    COMPILE_BACKTRACKINGPATH(current->top);\n    if (current->topbacktracks)\n      set_jumps(current->topbacktracks, LABEL());\n    SLJIT_ASSERT(!current->nextbacktracks);\n    }\n  while (*cc == OP_ALT);\n\n  if (cond != NULL)\n    {\n    SLJIT_ASSERT(opcode == OP_COND || opcode == OP_SCOND);\n    assert = CURRENT_AS(bracket_backtrack)->u.assert;\n    if ((ccbegin[1 + LINK_SIZE] == OP_ASSERT_NOT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK_NOT) && assert->framesize >= 0)\n      {\n      OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr);\n      add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), assert->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-assert->framesize - 1));\n      }\n    JUMPHERE(cond);\n    }\n\n  /* Free the STR_PTR. */\n  if (private_data_ptr == 0)\n    free_stack(common, 1);\n  }\n\nif (offset != 0)\n  {\n  /* Using both tmp register is better for instruction scheduling. */\n  if (common->optimized_cbracket[offset >> 1] != 0)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    free_stack(common, 2);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);\n    }\n  else\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);\n    }\n  }\nelse if (opcode == OP_SBRA || opcode == OP_SCOND)\n  {\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(0));\n  free_stack(common, 1);\n  }\nelse if (opcode == OP_ONCE)\n  {\n  cc = ccbegin + GET(ccbegin, 1);\n  stacksize = needs_control_head ? 1 : 0;\n\n  if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)\n    {\n    /* Reset head and drop saved frame. */\n    stacksize += CURRENT_AS(bracket_backtrack)->u.framesize + ((ket != OP_KET || *cc == OP_ALT) ? 2 : 1);\n    }\n  else if (ket == OP_KETRMAX || (*cc == OP_ALT && ket != OP_KETRMIN))\n    {\n    /* The STR_PTR must be released. */\n    stacksize++;\n    }\n\n  if (stacksize > 0)\n    free_stack(common, stacksize);\n\n  JUMPHERE(once);\n  /* Restore previous private_data_ptr */\n  if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0)\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracket_backtrack)->u.framesize - 1));\n  else if (ket == OP_KETRMIN)\n    {\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    /* See the comment below. */\n    free_stack(common, 2);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), private_data_ptr, TMP1, 0);\n    }\n  }\n\nif (repeat_type == OP_EXACT)\n  {\n  OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_SP), repeat_ptr, SLJIT_IMM, 1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), repeat_ptr, TMP1, 0);\n  CMPTO(SLJIT_LESS_EQUAL, TMP1, 0, SLJIT_IMM, repeat_count, exact_label);\n  }\nelse if (ket == OP_KETRMAX)\n  {\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  if (bra != OP_BRAZERO)\n    free_stack(common, 1);\n\n  CMPTO(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursive_matchingpath);\n  if (bra == OP_BRAZERO)\n    {\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath);\n    JUMPHERE(brazero);\n    free_stack(common, 1);\n    }\n  }\nelse if (ket == OP_KETRMIN)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n\n  /* OP_ONCE removes everything in case of a backtrack, so we don't\n  need to explicitly release the STR_PTR. The extra release would\n  affect badly the free_stack(2) above. */\n  if (opcode != OP_ONCE)\n    free_stack(common, 1);\n  CMPTO(SLJIT_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, rmin_label);\n  if (opcode == OP_ONCE)\n    free_stack(common, bra == OP_BRAMINZERO ? 2 : 1);\n  else if (bra == OP_BRAMINZERO)\n    free_stack(common, 1);\n  }\nelse if (bra == OP_BRAZERO)\n  {\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n  JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zero_matchingpath);\n  JUMPHERE(brazero);\n  }\n}\n\nstatic SLJIT_INLINE void compile_bracketpos_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\nint offset;\nstruct sljit_jump *jump;\n\nif (CURRENT_AS(bracketpos_backtrack)->framesize < 0)\n  {\n  if (*current->cc == OP_CBRAPOS || *current->cc == OP_SCBRAPOS)\n    {\n    offset = (GET2(current->cc, 1 + LINK_SIZE)) << 1;\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1));\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset), TMP1, 0);\n    if (common->capture_last_ptr != 0)\n      OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(2));\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1), TMP2, 0);\n    if (common->capture_last_ptr != 0)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, TMP1, 0);\n    }\n  set_jumps(current->topbacktracks, LABEL());\n  free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);\n  return;\n  }\n\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr);\nadd_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n\nif (current->topbacktracks)\n  {\n  jump = JUMP(SLJIT_JUMP);\n  set_jumps(current->topbacktracks, LABEL());\n  /* Drop the stack frame. */\n  free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize);\n  JUMPHERE(jump);\n  }\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), CURRENT_AS(bracketpos_backtrack)->private_data_ptr, SLJIT_MEM1(STACK_TOP), STACK(-CURRENT_AS(bracketpos_backtrack)->framesize - 1));\n}\n\nstatic SLJIT_INLINE void compile_braminzero_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nassert_backtrack backtrack;\n\ncurrent->top = NULL;\ncurrent->topbacktracks = NULL;\ncurrent->nextbacktracks = NULL;\nif (current->cc[1] > OP_ASSERTBACK_NOT)\n  {\n  /* Manual call of compile_bracket_matchingpath and compile_bracket_backtrackingpath. */\n  compile_bracket_matchingpath(common, current->cc, current);\n  compile_bracket_backtrackingpath(common, current->top);\n  }\nelse\n  {\n  memset(&backtrack, 0, sizeof(backtrack));\n  backtrack.common.cc = current->cc;\n  backtrack.matchingpath = CURRENT_AS(braminzero_backtrack)->matchingpath;\n  /* Manual call of compile_assert_matchingpath. */\n  compile_assert_matchingpath(common, current->cc, &backtrack, FALSE);\n  }\nSLJIT_ASSERT(!current->nextbacktracks && !current->topbacktracks);\n}\n\nstatic SLJIT_INLINE void compile_control_verb_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\npcre_uchar opcode = *current->cc;\nstruct sljit_label *loop;\nstruct sljit_jump *jump;\n\nif (opcode == OP_THEN || opcode == OP_THEN_ARG)\n  {\n  if (common->then_trap != NULL)\n    {\n    SLJIT_ASSERT(common->control_head_ptr != 0);\n\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, type_then_trap);\n    OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, common->then_trap->start);\n    jump = JUMP(SLJIT_JUMP);\n\n    loop = LABEL();\n    OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    JUMPHERE(jump);\n    CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0, loop);\n    CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(2), TMP2, 0, loop);\n    add_jump(compiler, &common->then_trap->quit, JUMP(SLJIT_JUMP));\n    return;\n    }\n  else if (common->positive_assert)\n    {\n    add_jump(compiler, &common->positive_assert_quit, JUMP(SLJIT_JUMP));\n    return;\n    }\n  }\n\nif (common->local_exit)\n  {\n  if (common->quit_label == NULL)\n    add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));\n  else\n    JUMPTO(SLJIT_JUMP, common->quit_label);\n  return;\n  }\n\nif (opcode == OP_SKIP_ARG)\n  {\n  SLJIT_ASSERT(common->control_head_ptr != 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0);\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2));\n  sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark));\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n\n  OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);\n  add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0));\n  return;\n  }\n\nif (opcode == OP_SKIP)\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\nelse\n  OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_IMM, 0);\nadd_jump(compiler, &common->reset_match, JUMP(SLJIT_JUMP));\n}\n\nstatic SLJIT_INLINE void compile_then_trap_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\nstruct sljit_jump *jump;\nint size;\n\nif (CURRENT_AS(then_trap_backtrack)->then_trap)\n  {\n  common->then_trap = CURRENT_AS(then_trap_backtrack)->then_trap;\n  return;\n  }\n\nsize = CURRENT_AS(then_trap_backtrack)->framesize;\nsize = 3 + (size < 0 ? 0 : size);\n\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(size - 3));\nfree_stack(common, size);\njump = JUMP(SLJIT_JUMP);\n\nset_jumps(CURRENT_AS(then_trap_backtrack)->quit, LABEL());\n/* STACK_TOP is set by THEN. */\nif (CURRENT_AS(then_trap_backtrack)->framesize >= 0)\n  add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\nfree_stack(common, 3);\n\nJUMPHERE(jump);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP1, 0);\n}\n\nstatic void compile_backtrackingpath(compiler_common *common, struct backtrack_common *current)\n{\nDEFINE_COMPILER;\nthen_trap_backtrack *save_then_trap = common->then_trap;\n\nwhile (current)\n  {\n  if (current->nextbacktracks != NULL)\n    set_jumps(current->nextbacktracks, LABEL());\n  switch(*current->cc)\n    {\n    case OP_SET_SOM:\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), TMP1, 0);\n    break;\n\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEEXACT:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEPOSQUERY:\n    case OP_TYPEPOSUPTO:\n    case OP_CLASS:\n    case OP_NCLASS:\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n    case OP_XCLASS:\n#endif\n    compile_iterator_backtrackingpath(common, current);\n    break;\n\n    case OP_REF:\n    case OP_REFI:\n    case OP_DNREF:\n    case OP_DNREFI:\n    compile_ref_iterator_backtrackingpath(common, current);\n    break;\n\n    case OP_RECURSE:\n    compile_recurse_backtrackingpath(common, current);\n    break;\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    compile_assert_backtrackingpath(common, current);\n    break;\n\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_BRA:\n    case OP_CBRA:\n    case OP_COND:\n    case OP_SBRA:\n    case OP_SCBRA:\n    case OP_SCOND:\n    compile_bracket_backtrackingpath(common, current);\n    break;\n\n    case OP_BRAZERO:\n    if (current->cc[1] > OP_ASSERTBACK_NOT)\n      compile_bracket_backtrackingpath(common, current);\n    else\n      compile_assert_backtrackingpath(common, current);\n    break;\n\n    case OP_BRAPOS:\n    case OP_CBRAPOS:\n    case OP_SBRAPOS:\n    case OP_SCBRAPOS:\n    case OP_BRAPOSZERO:\n    compile_bracketpos_backtrackingpath(common, current);\n    break;\n\n    case OP_BRAMINZERO:\n    compile_braminzero_backtrackingpath(common, current);\n    break;\n\n    case OP_MARK:\n    OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(common->has_skip_arg ? 4 : 0));\n    if (common->has_skip_arg)\n      OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n    free_stack(common, common->has_skip_arg ? 5 : 1);\n    OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, TMP1, 0);\n    if (common->has_skip_arg)\n      OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0);\n    break;\n\n    case OP_THEN:\n    case OP_THEN_ARG:\n    case OP_PRUNE:\n    case OP_PRUNE_ARG:\n    case OP_SKIP:\n    case OP_SKIP_ARG:\n    compile_control_verb_backtrackingpath(common, current);\n    break;\n\n    case OP_COMMIT:\n    if (!common->local_exit)\n      OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);\n    if (common->quit_label == NULL)\n      add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));\n    else\n      JUMPTO(SLJIT_JUMP, common->quit_label);\n    break;\n\n    case OP_CALLOUT:\n    case OP_FAIL:\n    case OP_ACCEPT:\n    case OP_ASSERT_ACCEPT:\n    set_jumps(current->topbacktracks, LABEL());\n    break;\n\n    case OP_THEN_TRAP:\n    /* A virtual opcode for then traps. */\n    compile_then_trap_backtrackingpath(common, current);\n    break;\n\n    default:\n    SLJIT_UNREACHABLE();\n    break;\n    }\n  current = current->prev;\n  }\ncommon->then_trap = save_then_trap;\n}\n\nstatic SLJIT_INLINE void compile_recurse(compiler_common *common)\n{\nDEFINE_COMPILER;\npcre_uchar *cc = common->start + common->currententry->start;\npcre_uchar *ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE);\npcre_uchar *ccend = bracketend(cc) - (1 + LINK_SIZE);\nBOOL needs_control_head;\nint framesize = get_framesize(common, cc, NULL, TRUE, &needs_control_head);\nint private_data_size = get_private_data_copy_length(common, ccbegin, ccend, needs_control_head);\nint alternativesize;\nBOOL needs_frame;\nbacktrack_common altbacktrack;\nstruct sljit_jump *jump;\n\n/* Recurse captures then. */\ncommon->then_trap = NULL;\n\nSLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA || *cc == OP_CBRAPOS || *cc == OP_SCBRA || *cc == OP_SCBRAPOS);\nneeds_frame = framesize >= 0;\nif (!needs_frame)\n  framesize = 0;\nalternativesize = *(cc + GET(cc, 1)) == OP_ALT ? 1 : 0;\n\nSLJIT_ASSERT(common->currententry->entry == NULL && common->recursive_head_ptr != 0);\ncommon->currententry->entry = LABEL();\nset_jumps(common->currententry->calls, common->currententry->entry);\n\nsljit_emit_fast_enter(compiler, TMP2, 0);\ncount_match(common);\nallocate_stack(common, private_data_size + framesize + alternativesize);\nOP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(private_data_size + framesize + alternativesize - 1), TMP2, 0);\ncopy_private_data(common, ccbegin, ccend, TRUE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head);\nif (needs_control_head)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, STACK_TOP, 0);\nif (needs_frame)\n  init_frame(common, cc, NULL, framesize + alternativesize - 1, alternativesize, TRUE);\n\nif (alternativesize > 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0);\n\nmemset(&altbacktrack, 0, sizeof(backtrack_common));\ncommon->quit_label = NULL;\ncommon->accept_label = NULL;\ncommon->quit = NULL;\ncommon->accept = NULL;\naltbacktrack.cc = ccbegin;\ncc += GET(cc, 1);\nwhile (1)\n  {\n  altbacktrack.top = NULL;\n  altbacktrack.topbacktracks = NULL;\n\n  if (altbacktrack.cc != ccbegin)\n    OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0));\n\n  compile_matchingpath(common, altbacktrack.cc, cc, &altbacktrack);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    return;\n\n  add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP));\n\n  compile_backtrackingpath(common, altbacktrack.top);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    return;\n  set_jumps(altbacktrack.topbacktracks, LABEL());\n\n  if (*cc != OP_ALT)\n    break;\n\n  altbacktrack.cc = cc + 1 + LINK_SIZE;\n  cc += GET(cc, 1);\n  }\n\n/* None of them matched. */\nOP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);\njump = JUMP(SLJIT_JUMP);\n\nif (common->quit != NULL)\n  {\n  set_jumps(common->quit, LABEL());\n  OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);\n  if (needs_frame)\n    {\n    OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw));\n    add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n    OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw));\n    }\n  OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0);\n  common->quit = NULL;\n  add_jump(compiler, &common->quit, JUMP(SLJIT_JUMP));\n  }\n\nset_jumps(common->accept, LABEL());\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr);\nif (needs_frame)\n  {\n  OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw));\n  add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL));\n  OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_sw));\n  }\nOP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1);\n\nJUMPHERE(jump);\nif (common->quit != NULL)\n  set_jumps(common->quit, LABEL());\ncopy_private_data(common, ccbegin, ccend, FALSE, framesize + alternativesize, private_data_size + framesize + alternativesize, needs_control_head);\nfree_stack(common, private_data_size + framesize + alternativesize);\nif (needs_control_head)\n  {\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(-3));\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP1, 0);\n  OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, TMP2, 0);\n  }\nelse\n  {\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(-2));\n  OP1(SLJIT_MOV, TMP1, 0, TMP3, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->recursive_head_ptr, TMP2, 0);\n  }\nsljit_emit_fast_return(compiler, SLJIT_MEM1(STACK_TOP), STACK(-1));\n}\n\n#undef COMPILE_BACKTRACKINGPATH\n#undef CURRENT_AS\n\nvoid\nPRIV(jit_compile)(const REAL_PCRE *re, PUBL(extra) *extra, int mode)\n{\nstruct sljit_compiler *compiler;\nbacktrack_common rootbacktrack;\ncompiler_common common_data;\ncompiler_common *common = &common_data;\nconst sljit_u8 *tables = re->tables;\npcre_study_data *study;\nint private_data_size;\npcre_uchar *ccend;\nexecutable_functions *functions;\nvoid *executable_func;\nsljit_uw executable_size;\nsljit_uw total_length;\nlabel_addr_list *label_addr;\nstruct sljit_label *mainloop_label = NULL;\nstruct sljit_label *continue_match_label;\nstruct sljit_label *empty_match_found_label = NULL;\nstruct sljit_label *empty_match_backtrack_label = NULL;\nstruct sljit_label *reset_match_label;\nstruct sljit_label *quit_label;\nstruct sljit_jump *jump;\nstruct sljit_jump *minlength_check_failed = NULL;\nstruct sljit_jump *reqbyte_notfound = NULL;\nstruct sljit_jump *empty_match = NULL;\n\nSLJIT_ASSERT((extra->flags & PCRE_EXTRA_STUDY_DATA) != 0);\nstudy = extra->study_data;\n\nif (!tables)\n  tables = PRIV(default_tables);\n\nmemset(&rootbacktrack, 0, sizeof(backtrack_common));\nmemset(common, 0, sizeof(compiler_common));\nrootbacktrack.cc = (pcre_uchar *)re + re->name_table_offset + re->name_count * re->name_entry_size;\n\ncommon->start = rootbacktrack.cc;\ncommon->read_only_data_head = NULL;\ncommon->fcc = tables + fcc_offset;\ncommon->lcc = (sljit_sw)(tables + lcc_offset);\ncommon->mode = mode;\ncommon->might_be_empty = study->minlength == 0;\ncommon->nltype = NLTYPE_FIXED;\nswitch(re->options & PCRE_NEWLINE_BITS)\n  {\n  case 0:\n  /* Compile-time default */\n  switch(NEWLINE)\n    {\n    case -1: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;\n    case -2: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;\n    default: common->newline = NEWLINE; break;\n    }\n  break;\n  case PCRE_NEWLINE_CR: common->newline = CHAR_CR; break;\n  case PCRE_NEWLINE_LF: common->newline = CHAR_NL; break;\n  case PCRE_NEWLINE_CR+\n       PCRE_NEWLINE_LF: common->newline = (CHAR_CR << 8) | CHAR_NL; break;\n  case PCRE_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break;\n  case PCRE_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break;\n  default: return;\n  }\ncommon->nlmax = READ_CHAR_MAX;\ncommon->nlmin = 0;\nif ((re->options & PCRE_BSR_ANYCRLF) != 0)\n  common->bsr_nltype = NLTYPE_ANYCRLF;\nelse if ((re->options & PCRE_BSR_UNICODE) != 0)\n  common->bsr_nltype = NLTYPE_ANY;\nelse\n  {\n#ifdef BSR_ANYCRLF\n  common->bsr_nltype = NLTYPE_ANYCRLF;\n#else\n  common->bsr_nltype = NLTYPE_ANY;\n#endif\n  }\ncommon->bsr_nlmax = READ_CHAR_MAX;\ncommon->bsr_nlmin = 0;\ncommon->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;\ncommon->ctypes = (sljit_sw)(tables + ctypes_offset);\ncommon->name_table = ((pcre_uchar *)re) + re->name_table_offset;\ncommon->name_count = re->name_count;\ncommon->name_entry_size = re->name_entry_size;\ncommon->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;\n#ifdef SUPPORT_UTF\n/* PCRE_UTF[16|32] have the same value as PCRE_UTF8. */\ncommon->utf = (re->options & PCRE_UTF8) != 0;\n#ifdef SUPPORT_UCP\ncommon->use_ucp = (re->options & PCRE_UCP) != 0;\n#endif\nif (common->utf)\n  {\n  if (common->nltype == NLTYPE_ANY)\n    common->nlmax = 0x2029;\n  else if (common->nltype == NLTYPE_ANYCRLF)\n    common->nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL;\n  else\n    {\n    /* We only care about the first newline character. */\n    common->nlmax = common->newline & 0xff;\n    }\n\n  if (common->nltype == NLTYPE_FIXED)\n    common->nlmin = common->newline & 0xff;\n  else\n    common->nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL;\n\n  if (common->bsr_nltype == NLTYPE_ANY)\n    common->bsr_nlmax = 0x2029;\n  else\n    common->bsr_nlmax = (CHAR_CR > CHAR_NL) ? CHAR_CR : CHAR_NL;\n  common->bsr_nlmin = (CHAR_CR < CHAR_NL) ? CHAR_CR : CHAR_NL;\n  }\n#endif /* SUPPORT_UTF */\nccend = bracketend(common->start);\n\n/* Calculate the local space size on the stack. */\ncommon->ovector_start = LIMIT_MATCH + sizeof(sljit_sw);\ncommon->optimized_cbracket = (sljit_u8 *)SLJIT_MALLOC(re->top_bracket + 1, compiler->allocator_data);\nif (!common->optimized_cbracket)\n  return;\n#if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 1\nmemset(common->optimized_cbracket, 0, re->top_bracket + 1);\n#else\nmemset(common->optimized_cbracket, 1, re->top_bracket + 1);\n#endif\n\nSLJIT_ASSERT(*common->start == OP_BRA && ccend[-(1 + LINK_SIZE)] == OP_KET);\n#if defined DEBUG_FORCE_UNOPTIMIZED_CBRAS && DEBUG_FORCE_UNOPTIMIZED_CBRAS == 2\ncommon->capture_last_ptr = common->ovector_start;\ncommon->ovector_start += sizeof(sljit_sw);\n#endif\nif (!check_opcode_types(common, common->start, ccend))\n  {\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  return;\n  }\n\n/* Checking flags and updating ovector_start. */\nif (mode == JIT_COMPILE && (re->flags & PCRE_REQCHSET) != 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0)\n  {\n  common->req_char_ptr = common->ovector_start;\n  common->ovector_start += sizeof(sljit_sw);\n  }\nif (mode != JIT_COMPILE)\n  {\n  common->start_used_ptr = common->ovector_start;\n  common->ovector_start += sizeof(sljit_sw);\n  if (mode == JIT_PARTIAL_SOFT_COMPILE)\n    {\n    common->hit_start = common->ovector_start;\n    common->ovector_start += 2 * sizeof(sljit_sw);\n    }\n  }\nif ((re->options & PCRE_FIRSTLINE) != 0)\n  {\n  common->match_end_ptr = common->ovector_start;\n  common->ovector_start += sizeof(sljit_sw);\n  }\n#if defined DEBUG_FORCE_CONTROL_HEAD && DEBUG_FORCE_CONTROL_HEAD\ncommon->control_head_ptr = 1;\n#endif\nif (common->control_head_ptr != 0)\n  {\n  common->control_head_ptr = common->ovector_start;\n  common->ovector_start += sizeof(sljit_sw);\n  }\nif (common->has_set_som)\n  {\n  /* Saving the real start pointer is necessary. */\n  common->start_ptr = common->ovector_start;\n  common->ovector_start += sizeof(sljit_sw);\n  }\n\n/* Aligning ovector to even number of sljit words. */\nif ((common->ovector_start & sizeof(sljit_sw)) != 0)\n  common->ovector_start += sizeof(sljit_sw);\n\nif (common->start_ptr == 0)\n  common->start_ptr = OVECTOR(0);\n\n/* Capturing brackets cannot be optimized if callouts are allowed. */\nif (common->capture_last_ptr != 0)\n  memset(common->optimized_cbracket, 0, re->top_bracket + 1);\n\nSLJIT_ASSERT(!(common->req_char_ptr != 0 && common->start_used_ptr != 0));\ncommon->cbra_ptr = OVECTOR_START + (re->top_bracket + 1) * 2 * sizeof(sljit_sw);\n\ntotal_length = ccend - common->start;\ncommon->private_data_ptrs = (sljit_s32 *)SLJIT_MALLOC(total_length * (sizeof(sljit_s32) + (common->has_then ? 1 : 0)), compiler->allocator_data);\nif (!common->private_data_ptrs)\n  {\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  return;\n  }\nmemset(common->private_data_ptrs, 0, total_length * sizeof(sljit_s32));\n\nprivate_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw);\nset_private_data_ptrs(common, &private_data_size, ccend);\nif ((re->options & PCRE_ANCHORED) == 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0)\n  {\n  if (!detect_fast_forward_skip(common, &private_data_size) && !common->has_skip_in_assert_back)\n    detect_fast_fail(common, common->start, &private_data_size, 4);\n  }\n\nSLJIT_ASSERT(common->fast_fail_start_ptr <= common->fast_fail_end_ptr);\n\nif (private_data_size > SLJIT_MAX_LOCAL_SIZE)\n  {\n  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  return;\n  }\n\nif (common->has_then)\n  {\n  common->then_offsets = (sljit_u8 *)(common->private_data_ptrs + total_length);\n  memset(common->then_offsets, 0, total_length);\n  set_then_offsets(common, common->start, NULL);\n  }\n\ncompiler = sljit_create_compiler(NULL);\nif (!compiler)\n  {\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n  return;\n  }\ncommon->compiler = compiler;\n\n/* Main pcre_jit_exec entry. */\nsljit_emit_enter(compiler, 0, SLJIT_ARG1(SW), 5, 5, 0, 0, private_data_size);\n\n/* Register init. */\nreset_ovector(common, (re->top_bracket + 1) * 2);\nif (common->req_char_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->req_char_ptr, SLJIT_R0, 0);\n\nOP1(SLJIT_MOV, ARGUMENTS, 0, SLJIT_S0, 0);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_S0, 0);\nOP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\nOP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end));\nOP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack));\nOP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, limit_match));\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, end));\nOP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, start));\nOP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1);\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0);\n\nif (common->fast_fail_start_ptr < common->fast_fail_end_ptr)\n  reset_fast_fail(common);\n\nif (mode == JIT_PARTIAL_SOFT_COMPILE)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);\nif (common->mark_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->mark_ptr, SLJIT_IMM, 0);\nif (common->control_head_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0);\n\n/* Main part of the matching */\nif ((re->options & PCRE_ANCHORED) == 0)\n  {\n  mainloop_label = mainloop_entry(common, (re->flags & PCRE_HASCRORLF) != 0);\n  continue_match_label = LABEL();\n  /* Forward search if possible. */\n  if ((re->options & PCRE_NO_START_OPTIMIZE) == 0)\n    {\n    if (mode == JIT_COMPILE && fast_forward_first_n_chars(common))\n      ;\n    else if ((re->flags & PCRE_FIRSTSET) != 0)\n      fast_forward_first_char(common, (pcre_uchar)re->first_char, (re->flags & PCRE_FCH_CASELESS) != 0);\n    else if ((re->flags & PCRE_STARTLINE) != 0)\n      fast_forward_newline(common);\n    else if (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)\n      fast_forward_start_bits(common, study->start_bits);\n    }\n  }\nelse\n  continue_match_label = LABEL();\n\nif (mode == JIT_COMPILE && study->minlength > 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0)\n  {\n  OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);\n  OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(study->minlength));\n  minlength_check_failed = CMP(SLJIT_GREATER, TMP2, 0, STR_END, 0);\n  }\nif (common->req_char_ptr != 0)\n  reqbyte_notfound = search_requested_char(common, (pcre_uchar)re->req_char, (re->flags & PCRE_RCH_CASELESS) != 0, (re->flags & PCRE_FIRSTSET) != 0);\n\n/* Store the current STR_PTR in OVECTOR(0). */\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), OVECTOR(0), STR_PTR, 0);\n/* Copy the limit of allowed recursions. */\nOP1(SLJIT_MOV, COUNT_MATCH, 0, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH);\nif (common->capture_last_ptr != 0)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->capture_last_ptr, SLJIT_IMM, -1);\nif (common->fast_forward_bc_ptr != NULL)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), PRIVATE_DATA(common->fast_forward_bc_ptr + 1), STR_PTR, 0);\n\nif (common->start_ptr != OVECTOR(0))\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_ptr, STR_PTR, 0);\n\n/* Copy the beginning of the string. */\nif (mode == JIT_PARTIAL_SOFT_COMPILE)\n  {\n  jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start + sizeof(sljit_sw), STR_PTR, 0);\n  JUMPHERE(jump);\n  }\nelse if (mode == JIT_PARTIAL_HARD_COMPILE)\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, STR_PTR, 0);\n\ncompile_matchingpath(common, common->start, ccend, &rootbacktrack);\nif (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n  {\n  sljit_free_compiler(compiler);\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n  free_read_only_data(common->read_only_data_head, compiler->allocator_data);\n  return;\n  }\n\nif (common->might_be_empty)\n  {\n  empty_match = CMP(SLJIT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(0));\n  empty_match_found_label = LABEL();\n  }\n\ncommon->accept_label = LABEL();\nif (common->accept != NULL)\n  set_jumps(common->accept, common->accept_label);\n\n/* This means we have a match. Update the ovector. */\ncopy_ovector(common, re->top_bracket + 1);\ncommon->quit_label = common->forced_quit_label = LABEL();\nif (common->quit != NULL)\n  set_jumps(common->quit, common->quit_label);\nif (common->forced_quit != NULL)\n  set_jumps(common->forced_quit, common->forced_quit_label);\nif (minlength_check_failed != NULL)\n  SET_LABEL(minlength_check_failed, common->forced_quit_label);\nsljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0);\n\nif (mode != JIT_COMPILE)\n  {\n  common->partialmatchlabel = LABEL();\n  set_jumps(common->partialmatch, common->partialmatchlabel);\n  return_with_partial_match(common, common->quit_label);\n  }\n\nif (common->might_be_empty)\n  empty_match_backtrack_label = LABEL();\ncompile_backtrackingpath(common, rootbacktrack.top);\nif (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n  {\n  sljit_free_compiler(compiler);\n  SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n  SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n  free_read_only_data(common->read_only_data_head, compiler->allocator_data);\n  return;\n  }\n\nSLJIT_ASSERT(rootbacktrack.prev == NULL);\nreset_match_label = LABEL();\n\nif (mode == JIT_PARTIAL_SOFT_COMPILE)\n  {\n  /* Update hit_start only in the first time. */\n  jump = CMP(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->start_used_ptr, SLJIT_IMM, -1);\n  OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->hit_start, TMP1, 0);\n  JUMPHERE(jump);\n  }\n\n/* Check we have remaining characters. */\nif ((re->options & PCRE_ANCHORED) == 0 && (re->options & PCRE_FIRSTLINE) != 0)\n  {\n  SLJIT_ASSERT(common->match_end_ptr != 0);\n  OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->match_end_ptr);\n  }\n\nOP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_SP),\n    (common->fast_forward_bc_ptr != NULL) ? (PRIVATE_DATA(common->fast_forward_bc_ptr + 1)) : common->start_ptr);\n\nif ((re->options & PCRE_ANCHORED) == 0)\n  {\n  if (common->ff_newline_shortcut != NULL)\n    {\n    if ((re->options & PCRE_FIRSTLINE) == 0)\n      CMPTO(SLJIT_LESS, STR_PTR, 0, STR_END, 0, common->ff_newline_shortcut);\n    /* There cannot be more newlines here. */\n    }\n  else\n    CMPTO(SLJIT_LESS, STR_PTR, 0, ((re->options & PCRE_FIRSTLINE) == 0) ? STR_END : TMP1, 0, mainloop_label);\n  }\n\n/* No more remaining characters. */\nif (reqbyte_notfound != NULL)\n  JUMPHERE(reqbyte_notfound);\n\nif (mode == JIT_PARTIAL_SOFT_COMPILE)\n  CMPTO(SLJIT_NOT_EQUAL, SLJIT_MEM1(SLJIT_SP), common->hit_start, SLJIT_IMM, -1, common->partialmatchlabel);\n\nOP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH);\nJUMPTO(SLJIT_JUMP, common->quit_label);\n\nflush_stubs(common);\n\nif (common->might_be_empty)\n  {\n  JUMPHERE(empty_match);\n  OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty));\n  CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_backtrack_label);\n  OP1(SLJIT_MOV_U8, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart));\n  CMPTO(SLJIT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_found_label);\n  OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str));\n  CMPTO(SLJIT_NOT_EQUAL, TMP2, 0, STR_PTR, 0, empty_match_found_label);\n  JUMPTO(SLJIT_JUMP, empty_match_backtrack_label);\n  }\n\ncommon->fast_forward_bc_ptr = NULL;\ncommon->fast_fail_start_ptr = 0;\ncommon->fast_fail_end_ptr = 0;\ncommon->currententry = common->entries;\ncommon->local_exit = TRUE;\nquit_label = common->quit_label;\nwhile (common->currententry != NULL)\n  {\n  /* Might add new entries. */\n  compile_recurse(common);\n  if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler)))\n    {\n    sljit_free_compiler(compiler);\n    SLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\n    SLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n    free_read_only_data(common->read_only_data_head, compiler->allocator_data);\n    return;\n    }\n  flush_stubs(common);\n  common->currententry = common->currententry->next;\n  }\ncommon->local_exit = FALSE;\ncommon->quit_label = quit_label;\n\n/* Allocating stack, returns with PCRE_ERROR_JIT_STACKLIMIT if fails. */\n/* This is a (really) rare case. */\nset_jumps(common->stackalloc, LABEL());\n/* RETURN_ADDR is not a saved register. */\nsljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0);\n\nSLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1);\n\nOP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STACK_TOP, 0);\nOP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0);\nOP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE);\nOP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, stack));\nOP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0);\n\nsljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize));\njump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);\nOP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0);\nOP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0);\nOP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0);\nOP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1);\nsljit_emit_fast_return(compiler, TMP1, 0);\n\n/* Allocation failed. */\nJUMPHERE(jump);\n/* We break the return address cache here, but this is a really rare case. */\nOP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT);\nJUMPTO(SLJIT_JUMP, common->quit_label);\n\n/* Call limit reached. */\nset_jumps(common->calllimit, LABEL());\nOP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT);\nJUMPTO(SLJIT_JUMP, common->quit_label);\n\nif (common->revertframes != NULL)\n  {\n  set_jumps(common->revertframes, LABEL());\n  do_revertframes(common);\n  }\nif (common->wordboundary != NULL)\n  {\n  set_jumps(common->wordboundary, LABEL());\n  check_wordboundary(common);\n  }\nif (common->anynewline != NULL)\n  {\n  set_jumps(common->anynewline, LABEL());\n  check_anynewline(common);\n  }\nif (common->hspace != NULL)\n  {\n  set_jumps(common->hspace, LABEL());\n  check_hspace(common);\n  }\nif (common->vspace != NULL)\n  {\n  set_jumps(common->vspace, LABEL());\n  check_vspace(common);\n  }\nif (common->casefulcmp != NULL)\n  {\n  set_jumps(common->casefulcmp, LABEL());\n  do_casefulcmp(common);\n  }\nif (common->caselesscmp != NULL)\n  {\n  set_jumps(common->caselesscmp, LABEL());\n  do_caselesscmp(common);\n  }\nif (common->reset_match != NULL)\n  {\n  set_jumps(common->reset_match, LABEL());\n  do_reset_match(common, (re->top_bracket + 1) * 2);\n  CMPTO(SLJIT_GREATER, STR_PTR, 0, TMP1, 0, continue_match_label);\n  OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0);\n  JUMPTO(SLJIT_JUMP, reset_match_label);\n  }\n#ifdef SUPPORT_UTF\n#ifdef COMPILE_PCRE8\nif (common->utfreadchar != NULL)\n  {\n  set_jumps(common->utfreadchar, LABEL());\n  do_utfreadchar(common);\n  }\nif (common->utfreadchar16 != NULL)\n  {\n  set_jumps(common->utfreadchar16, LABEL());\n  do_utfreadchar16(common);\n  }\nif (common->utfreadtype8 != NULL)\n  {\n  set_jumps(common->utfreadtype8, LABEL());\n  do_utfreadtype8(common);\n  }\n#endif /* COMPILE_PCRE8 */\n#endif /* SUPPORT_UTF */\n#ifdef SUPPORT_UCP\nif (common->getucd != NULL)\n  {\n  set_jumps(common->getucd, LABEL());\n  do_getucd(common);\n  }\n#endif\n\nSLJIT_FREE(common->optimized_cbracket, compiler->allocator_data);\nSLJIT_FREE(common->private_data_ptrs, compiler->allocator_data);\n\nexecutable_func = sljit_generate_code(compiler);\nexecutable_size = sljit_get_generated_code_size(compiler);\nlabel_addr = common->label_addrs;\nwhile (label_addr != NULL)\n  {\n  *label_addr->update_addr = sljit_get_label_addr(label_addr->label);\n  label_addr = label_addr->next;\n  }\nsljit_free_compiler(compiler);\nif (executable_func == NULL)\n  {\n  free_read_only_data(common->read_only_data_head, compiler->allocator_data);\n  return;\n  }\n\n/* Reuse the function descriptor if possible. */\nif ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && extra->executable_jit != NULL)\n  functions = (executable_functions *)extra->executable_jit;\nelse\n  {\n  /* Note: If your memory-checker has flagged the allocation below as a\n   * memory leak, it is probably because you either forgot to call\n   * pcre_free_study() (or pcre16_free_study()) on the pcre_extra (or\n   * pcre16_extra) object, or you called said function after having\n   * cleared the PCRE_EXTRA_EXECUTABLE_JIT bit from the \"flags\" field\n   * of the object. (The function will only free the JIT data if the\n   * bit remains set, as the bit indicates that the pointer to the data\n   * is valid.)\n   */\n  functions = SLJIT_MALLOC(sizeof(executable_functions), compiler->allocator_data);\n  if (functions == NULL)\n    {\n    /* This case is highly unlikely since we just recently\n    freed a lot of memory. Not impossible though. */\n    sljit_free_code(executable_func);\n    free_read_only_data(common->read_only_data_head, compiler->allocator_data);\n    return;\n    }\n  memset(functions, 0, sizeof(executable_functions));\n  functions->top_bracket = (re->top_bracket + 1) * 2;\n  functions->limit_match = (re->flags & PCRE_MLSET) != 0 ? re->limit_match : 0;\n  extra->executable_jit = functions;\n  extra->flags |= PCRE_EXTRA_EXECUTABLE_JIT;\n  }\n\nfunctions->executable_funcs[mode] = executable_func;\nfunctions->read_only_data_heads[mode] = common->read_only_data_head;\nfunctions->executable_sizes[mode] = executable_size;\n}\n\nstatic SLJIT_NOINLINE int jit_machine_stack_exec(jit_arguments *arguments, void *executable_func)\n{\nunion {\n   void *executable_func;\n   jit_function call_executable_func;\n} convert_executable_func;\nsljit_u8 local_space[MACHINE_STACK_SIZE];\nstruct sljit_stack local_stack;\n\nlocal_stack.min_start = local_space;\nlocal_stack.start = local_space;\nlocal_stack.end = local_space + MACHINE_STACK_SIZE;\nlocal_stack.top = local_space + MACHINE_STACK_SIZE;\narguments->stack = &local_stack;\nconvert_executable_func.executable_func = executable_func;\nreturn convert_executable_func.call_executable_func(arguments);\n}\n\nint\nPRIV(jit_exec)(const PUBL(extra) *extra_data, const pcre_uchar *subject,\n  int length, int start_offset, int options, int *offsets, int offset_count)\n{\nexecutable_functions *functions = (executable_functions *)extra_data->executable_jit;\nunion {\n   void *executable_func;\n   jit_function call_executable_func;\n} convert_executable_func;\njit_arguments arguments;\nint max_offset_count;\nint retval;\nint mode = JIT_COMPILE;\n\nif ((options & PCRE_PARTIAL_HARD) != 0)\n  mode = JIT_PARTIAL_HARD_COMPILE;\nelse if ((options & PCRE_PARTIAL_SOFT) != 0)\n  mode = JIT_PARTIAL_SOFT_COMPILE;\n\nif (functions->executable_funcs[mode] == NULL)\n  return PCRE_ERROR_JIT_BADOPTION;\n\n/* Sanity checks should be handled by pcre_exec. */\narguments.str = subject + start_offset;\narguments.begin = subject;\narguments.end = subject + length;\narguments.mark_ptr = NULL;\n/* JIT decreases this value less frequently than the interpreter. */\narguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (sljit_u32)(extra_data->match_limit);\nif (functions->limit_match != 0 && functions->limit_match < arguments.limit_match)\n  arguments.limit_match = functions->limit_match;\narguments.notbol = (options & PCRE_NOTBOL) != 0;\narguments.noteol = (options & PCRE_NOTEOL) != 0;\narguments.notempty = (options & PCRE_NOTEMPTY) != 0;\narguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;\narguments.offsets = offsets;\narguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL;\narguments.real_offset_count = offset_count;\n\n/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of\nthe output vector for storing captured strings, with the remainder used as\nworkspace. We don't need the workspace here. For compatibility, we limit the\nnumber of captured strings in the same way as pcre_exec(), so that the user\ngets the same result with and without JIT. */\n\nif (offset_count != 2)\n  offset_count = ((offset_count - (offset_count % 3)) * 2) / 3;\nmax_offset_count = functions->top_bracket;\nif (offset_count > max_offset_count)\n  offset_count = max_offset_count;\narguments.offset_count = offset_count;\n\nif (functions->callback)\n  arguments.stack = (struct sljit_stack *)functions->callback(functions->userdata);\nelse\n  arguments.stack = (struct sljit_stack *)functions->userdata;\n\nif (arguments.stack == NULL)\n  retval = jit_machine_stack_exec(&arguments, functions->executable_funcs[mode]);\nelse\n  {\n  convert_executable_func.executable_func = functions->executable_funcs[mode];\n  retval = convert_executable_func.call_executable_func(&arguments);\n  }\n\nif (retval * 2 > offset_count)\n  retval = 0;\nif ((extra_data->flags & PCRE_EXTRA_MARK) != 0)\n  *(extra_data->mark) = arguments.mark_ptr;\n\nreturn retval;\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_jit_exec(const pcre *argument_re, const pcre_extra *extra_data,\n  PCRE_SPTR subject, int length, int start_offset, int options,\n  int *offsets, int offset_count, pcre_jit_stack *stack)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_jit_exec(const pcre16 *argument_re, const pcre16_extra *extra_data,\n  PCRE_SPTR16 subject, int length, int start_offset, int options,\n  int *offsets, int offset_count, pcre16_jit_stack *stack)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_jit_exec(const pcre32 *argument_re, const pcre32_extra *extra_data,\n  PCRE_SPTR32 subject, int length, int start_offset, int options,\n  int *offsets, int offset_count, pcre32_jit_stack *stack)\n#endif\n{\npcre_uchar *subject_ptr = (pcre_uchar *)subject;\nexecutable_functions *functions = (executable_functions *)extra_data->executable_jit;\nunion {\n   void *executable_func;\n   jit_function call_executable_func;\n} convert_executable_func;\njit_arguments arguments;\nint max_offset_count;\nint retval;\nint mode = JIT_COMPILE;\n\nSLJIT_UNUSED_ARG(argument_re);\n\n/* Plausibility checks */\nif ((options & ~PUBLIC_JIT_EXEC_OPTIONS) != 0) return PCRE_ERROR_JIT_BADOPTION;\n\nif ((options & PCRE_PARTIAL_HARD) != 0)\n  mode = JIT_PARTIAL_HARD_COMPILE;\nelse if ((options & PCRE_PARTIAL_SOFT) != 0)\n  mode = JIT_PARTIAL_SOFT_COMPILE;\n\nif (functions == NULL || functions->executable_funcs[mode] == NULL)\n  return PCRE_ERROR_JIT_BADOPTION;\n\n/* Sanity checks should be handled by pcre_exec. */\narguments.stack = (struct sljit_stack *)stack;\narguments.str = subject_ptr + start_offset;\narguments.begin = subject_ptr;\narguments.end = subject_ptr + length;\narguments.mark_ptr = NULL;\n/* JIT decreases this value less frequently than the interpreter. */\narguments.limit_match = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : (sljit_u32)(extra_data->match_limit);\nif (functions->limit_match != 0 && functions->limit_match < arguments.limit_match)\n  arguments.limit_match = functions->limit_match;\narguments.notbol = (options & PCRE_NOTBOL) != 0;\narguments.noteol = (options & PCRE_NOTEOL) != 0;\narguments.notempty = (options & PCRE_NOTEMPTY) != 0;\narguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0;\narguments.offsets = offsets;\narguments.callout_data = (extra_data->flags & PCRE_EXTRA_CALLOUT_DATA) != 0 ? extra_data->callout_data : NULL;\narguments.real_offset_count = offset_count;\n\n/* pcre_exec() rounds offset_count to a multiple of 3, and then uses only 2/3 of\nthe output vector for storing captured strings, with the remainder used as\nworkspace. We don't need the workspace here. For compatibility, we limit the\nnumber of captured strings in the same way as pcre_exec(), so that the user\ngets the same result with and without JIT. */\n\nif (offset_count != 2)\n  offset_count = ((offset_count - (offset_count % 3)) * 2) / 3;\nmax_offset_count = functions->top_bracket;\nif (offset_count > max_offset_count)\n  offset_count = max_offset_count;\narguments.offset_count = offset_count;\n\nconvert_executable_func.executable_func = functions->executable_funcs[mode];\nretval = convert_executable_func.call_executable_func(&arguments);\n\nif (retval * 2 > offset_count)\n  retval = 0;\nif ((extra_data->flags & PCRE_EXTRA_MARK) != 0)\n  *(extra_data->mark) = arguments.mark_ptr;\n\nreturn retval;\n}\n\nvoid\nPRIV(jit_free)(void *executable_funcs)\n{\nint i;\nexecutable_functions *functions = (executable_functions *)executable_funcs;\nfor (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)\n  {\n  if (functions->executable_funcs[i] != NULL)\n    sljit_free_code(functions->executable_funcs[i]);\n  free_read_only_data(functions->read_only_data_heads[i], NULL);\n  }\nSLJIT_FREE(functions, compiler->allocator_data);\n}\n\nint\nPRIV(jit_get_size)(void *executable_funcs)\n{\nint i;\nsljit_uw size = 0;\nsljit_uw *executable_sizes = ((executable_functions *)executable_funcs)->executable_sizes;\nfor (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++)\n  size += executable_sizes[i];\nreturn (int)size;\n}\n\nconst char*\nPRIV(jit_get_target)(void)\n{\nreturn sljit_get_platform_name();\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL pcre_jit_stack *\npcre_jit_stack_alloc(int startsize, int maxsize)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL pcre16_jit_stack *\npcre16_jit_stack_alloc(int startsize, int maxsize)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL pcre32_jit_stack *\npcre32_jit_stack_alloc(int startsize, int maxsize)\n#endif\n{\nif (startsize < 1 || maxsize < 1)\n  return NULL;\nif (startsize > maxsize)\n  startsize = maxsize;\nstartsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);\nmaxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1);\nreturn (PUBL(jit_stack)*)sljit_allocate_stack(startsize, maxsize, NULL);\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_jit_stack_free(pcre_jit_stack *stack)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_jit_stack_free(pcre16_jit_stack *stack)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_jit_stack_free(pcre32_jit_stack *stack)\n#endif\n{\nsljit_free_stack((struct sljit_stack *)stack, NULL);\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata)\n#endif\n{\nexecutable_functions *functions;\nif (extra != NULL &&\n    (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&\n    extra->executable_jit != NULL)\n  {\n  functions = (executable_functions *)extra->executable_jit;\n  functions->callback = callback;\n  functions->userdata = userdata;\n  }\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_jit_free_unused_memory(void)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_jit_free_unused_memory(void)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_jit_free_unused_memory(void)\n#endif\n{\nsljit_free_unused_memory_exec();\n}\n\n#else  /* SUPPORT_JIT */\n\n/* These are dummy functions to avoid linking errors when JIT support is not\nbeing compiled. */\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL pcre_jit_stack *\npcre_jit_stack_alloc(int startsize, int maxsize)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL pcre16_jit_stack *\npcre16_jit_stack_alloc(int startsize, int maxsize)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL pcre32_jit_stack *\npcre32_jit_stack_alloc(int startsize, int maxsize)\n#endif\n{\n(void)startsize;\n(void)maxsize;\nreturn NULL;\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_jit_stack_free(pcre_jit_stack *stack)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_jit_stack_free(pcre16_jit_stack *stack)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_jit_stack_free(pcre32_jit_stack *stack)\n#endif\n{\n(void)stack;\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_assign_jit_stack(pcre32_extra *extra, pcre32_jit_callback callback, void *userdata)\n#endif\n{\n(void)extra;\n(void)callback;\n(void)userdata;\n}\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DECL void\npcre_jit_free_unused_memory(void)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DECL void\npcre16_jit_free_unused_memory(void)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DECL void\npcre32_jit_free_unused_memory(void)\n#endif\n{\n}\n\n#endif\n\n/* End of pcre_jit_compile.c */\n"
  },
  {
    "path": "src/pcre/pcre_jit_test.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                  Main Library written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n  This JIT compiler regression test program was written by Zoltan Herczeg\n                      Copyright (c) 2010-2012\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>\n#include \"pcre.h\"\n\n\n#include \"pcre_internal.h\"\n\n/*\n Letter characters:\n   \\xe6\\x92\\xad = 0x64ad = 25773 (kanji)\n Non-letter characters:\n   \\xc2\\xa1 = 0xa1 =  (Inverted Exclamation Mark)\n   \\xf3\\xa9\\xb7\\x80 = 0xe9dc0 = 957888\n   \\xed\\xa0\\x80 = 55296 = 0xd800 (Invalid UTF character)\n   \\xed\\xb0\\x80 = 56320 = 0xdc00 (Invalid UTF character)\n Newlines:\n   \\xc2\\x85 = 0x85 = 133 (NExt Line = NEL)\n   \\xe2\\x80\\xa8 = 0x2028 = 8232 (Line Separator)\n Othercase pairs:\n   \\xc3\\xa9 = 0xe9 = 233 (e')\n      \\xc3\\x89 = 0xc9 = 201 (E')\n   \\xc3\\xa1 = 0xe1 = 225 (a')\n      \\xc3\\x81 = 0xc1 = 193 (A')\n   \\x53 = 0x53 = S\n     \\x73 = 0x73 = s\n     \\xc5\\xbf = 0x17f = 383 (long S)\n   \\xc8\\xba = 0x23a = 570\n      \\xe2\\xb1\\xa5 = 0x2c65 = 11365\n   \\xe1\\xbd\\xb8 = 0x1f78 = 8056\n      \\xe1\\xbf\\xb8 = 0x1ff8 = 8184\n   \\xf0\\x90\\x90\\x80 = 0x10400 = 66560\n      \\xf0\\x90\\x90\\xa8 = 0x10428 = 66600\n   \\xc7\\x84 = 0x1c4 = 452\n     \\xc7\\x85 = 0x1c5 = 453\n     \\xc7\\x86 = 0x1c6 = 454\n Caseless sets:\n   ucp_Armenian - \\x{531}-\\x{556} -> \\x{561}-\\x{586}\n   ucp_Coptic - \\x{2c80}-\\x{2ce3} -> caseless: XOR 0x1\n   ucp_Latin - \\x{ff21}-\\x{ff3a} -> \\x{ff41]-\\x{ff5a}\n\n Mark property:\n   \\xcc\\x8d = 0x30d = 781\n Special:\n   \\xc2\\x80 = 0x80 = 128 (lowest 2 byte character)\n   \\xdf\\xbf = 0x7ff = 2047 (highest 2 byte character)\n   \\xe0\\xa0\\x80 = 0x800 = 2048 (lowest 2 byte character)\n   \\xef\\xbf\\xbf = 0xffff = 65535 (highest 3 byte character)\n   \\xf0\\x90\\x80\\x80 = 0x10000 = 65536 (lowest 4 byte character)\n   \\xf4\\x8f\\xbf\\xbf = 0x10ffff = 1114111 (highest allowed utf character)\n*/\n\nstatic int regression_tests(void);\n\nint main(void)\n{\n\tint jit = 0;\n#if defined SUPPORT_PCRE8\n\tpcre_config(PCRE_CONFIG_JIT, &jit);\n#elif defined SUPPORT_PCRE16\n\tpcre16_config(PCRE_CONFIG_JIT, &jit);\n#elif defined SUPPORT_PCRE32\n\tpcre32_config(PCRE_CONFIG_JIT, &jit);\n#endif\n\tif (!jit) {\n\t\tprintf(\"JIT must be enabled to run pcre_jit_test\\n\");\n\t\treturn 1;\n\t}\n\treturn regression_tests();\n}\n\n/* --------------------------------------------------------------------------------------- */\n\n#if !(defined SUPPORT_PCRE8) && !(defined SUPPORT_PCRE16) && !(defined SUPPORT_PCRE32)\n#error SUPPORT_PCRE8 or SUPPORT_PCRE16 or SUPPORT_PCRE32 must be defined\n#endif\n\n#define MUA\t(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)\n#define MUAP\t(PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)\n#define CMUA\t(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)\n#define CMUAP\t(PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)\n#define MA\t(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)\n#define MAP\t(PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)\n#define CMA\t(PCRE_CASELESS | PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)\n\n#define OFFSET_MASK\t0x00ffff\n#define F_NO8\t\t0x010000\n#define F_NO16\t\t0x020000\n#define F_NO32\t\t0x020000\n#define F_NOMATCH\t0x040000\n#define F_DIFF\t\t0x080000\n#define F_FORCECONV\t0x100000\n#define F_PROPERTY\t0x200000\n#define F_STUDY\t\t0x400000\n\nstruct regression_test_case {\n\tint flags;\n\tint start_offset;\n\tconst char *pattern;\n\tconst char *input;\n};\n\nstatic struct regression_test_case regression_test_cases[] = {\n\t/* Constant strings. */\n\t{ MUA, 0, \"AbC\", \"AbAbC\" },\n\t{ MUA, 0, \"ACCEPT\", \"AACACCACCEACCEPACCEPTACCEPTT\" },\n\t{ CMUA, 0, \"aA#\\xc3\\xa9\\xc3\\x81\", \"aA#Aa#\\xc3\\x89\\xc3\\xa1\" },\n\t{ MA, 0, \"[^a]\", \"aAbB\" },\n\t{ CMA, 0, \"[^m]\", \"mMnN\" },\n\t{ MA, 0, \"a[^b][^#]\", \"abacd\" },\n\t{ CMA, 0, \"A[^B][^E]\", \"abacd\" },\n\t{ CMUA, 0, \"[^x][^#]\", \"XxBll\" },\n\t{ MUA, 0, \"[^a]\", \"aaa\\xc3\\xa1#Ab\" },\n\t{ CMUA, 0, \"[^A]\", \"aA\\xe6\\x92\\xad\" },\n\t{ MUA, 0, \"\\\\W(\\\\W)?\\\\w\", \"\\r\\n+bc\" },\n\t{ MUA, 0, \"\\\\W(\\\\W)?\\\\w\", \"\\n\\r+bc\" },\n\t{ MUA, 0, \"\\\\W(\\\\W)?\\\\w\", \"\\r\\r+bc\" },\n\t{ MUA, 0, \"\\\\W(\\\\W)?\\\\w\", \"\\n\\n+bc\" },\n\t{ MUA, 0, \"[axd]\", \"sAXd\" },\n\t{ CMUA, 0, \"[axd]\", \"sAXd\" },\n\t{ CMUA, 0 | F_NOMATCH, \"[^axd]\", \"DxA\" },\n\t{ MUA, 0, \"[a-dA-C]\", \"\\xe6\\x92\\xad\\xc3\\xa9.B\" },\n\t{ MUA, 0, \"[^a-dA-C]\", \"\\xe6\\x92\\xad\\xc3\\xa9\" },\n\t{ CMUA, 0, \"[^\\xc3\\xa9]\", \"\\xc3\\xa9\\xc3\\x89.\" },\n\t{ MUA, 0, \"[^\\xc3\\xa9]\", \"\\xc3\\xa9\\xc3\\x89.\" },\n\t{ MUA, 0, \"[^a]\", \"\\xc2\\x80[]\" },\n\t{ CMUA, 0, \"\\xf0\\x90\\x90\\xa7\", \"\\xf0\\x90\\x91\\x8f\" },\n\t{ CMA, 0, \"1a2b3c4\", \"1a2B3c51A2B3C4\" },\n\t{ PCRE_CASELESS, 0, \"\\xff#a\", \"\\xff#\\xff\\xfe##\\xff#A\" },\n\t{ PCRE_CASELESS, 0, \"\\xfe\", \"\\xff\\xfc#\\xfe\\xfe\" },\n\t{ PCRE_CASELESS, 0, \"a1\", \"Aa1\" },\n\t{ MA, 0, \"\\\\Ca\", \"cda\" },\n\t{ CMA, 0, \"\\\\Ca\", \"CDA\" },\n\t{ MA, 0 | F_NOMATCH, \"\\\\Cx\", \"cda\" },\n\t{ CMA, 0 | F_NOMATCH, \"\\\\Cx\", \"CDA\" },\n\t{ CMUAP, 0, \"\\xf0\\x90\\x90\\x80\\xf0\\x90\\x90\\xa8\", \"\\xf0\\x90\\x90\\xa8\\xf0\\x90\\x90\\x80\" },\n\t{ CMUAP, 0, \"\\xf0\\x90\\x90\\x80{2}\", \"\\xf0\\x90\\x90\\x80#\\xf0\\x90\\x90\\xa8\\xf0\\x90\\x90\\x80\" },\n\t{ CMUAP, 0, \"\\xf0\\x90\\x90\\xa8{2}\", \"\\xf0\\x90\\x90\\x80#\\xf0\\x90\\x90\\xa8\\xf0\\x90\\x90\\x80\" },\n\t{ CMUAP, 0, \"\\xe1\\xbd\\xb8\\xe1\\xbf\\xb8\", \"\\xe1\\xbf\\xb8\\xe1\\xbd\\xb8\" },\n\t{ MA, 0, \"[3-57-9]\", \"5\" },\n\n\t/* Assertions. */\n\t{ MUA, 0, \"\\\\b[^A]\", \"A_B#\" },\n\t{ MA, 0 | F_NOMATCH, \"\\\\b\\\\W\", \"\\n*\" },\n\t{ MUA, 0, \"\\\\B[^,]\\\\b[^s]\\\\b\", \"#X\" },\n\t{ MAP, 0, \"\\\\B\", \"_\\xa1\" },\n\t{ MAP, 0, \"\\\\b_\\\\b[,A]\\\\B\", \"_,\" },\n\t{ MUAP, 0, \"\\\\b\", \"\\xe6\\x92\\xad!\" },\n\t{ MUAP, 0, \"\\\\B\", \"_\\xc2\\xa1\\xc3\\xa1\\xc2\\x85\" },\n\t{ MUAP, 0, \"\\\\b[^A]\\\\B[^c]\\\\b[^_]\\\\B\", \"_\\xc3\\xa1\\xe2\\x80\\xa8\" },\n\t{ MUAP, 0, \"\\\\b\\\\w+\\\\B\", \"\\xc3\\x89\\xc2\\xa1\\xe6\\x92\\xad\\xc3\\x81\\xc3\\xa1\" },\n\t{ MUA, 0 | F_NOMATCH, \"\\\\b.\", \"\\xcd\\xbe\" },\n\t{ CMUAP, 0, \"\\\\By\", \"\\xf0\\x90\\x90\\xa8y\" },\n\t{ MA, 0 | F_NOMATCH, \"\\\\R^\", \"\\n\" },\n\t{ MA, 1 | F_NOMATCH, \"^\", \"\\n\" },\n\t{ 0, 0, \"^ab\", \"ab\" },\n\t{ 0, 0 | F_NOMATCH, \"^ab\", \"aab\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, \"^a\", \"\\r\\raa\\n\\naa\\r\\naa\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, \"^-\", \"\\xe2\\x80\\xa8--\\xc2\\x85-\\r\\n-\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, \"^-\", \"a--b--\\x85--\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, \"^-\", \"a--\\xe2\\x80\\xa8--\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, \"^-\", \"a--\\xc2\\x85--\" },\n\t{ 0, 0, \"ab$\", \"ab\" },\n\t{ 0, 0 | F_NOMATCH, \"ab$\", \"abab\\n\\n\" },\n\t{ PCRE_DOLLAR_ENDONLY, 0 | F_NOMATCH, \"ab$\", \"abab\\r\\n\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, \"a$\", \"\\r\\raa\\n\\naa\\r\\naa\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, \"a$\", \"aaa\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF, 0, \"#$\", \"#\\xc2\\x85###\\r#\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY, 0, \"#$\", \"#\\xe2\\x80\\xa9\" },\n\t{ PCRE_NOTBOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, \"^a\", \"aa\\naa\" },\n\t{ PCRE_NOTBOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, \"^a\", \"aa\\naa\" },\n\t{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, \"a$\", \"aa\\naa\" },\n\t{ PCRE_NOTEOL | PCRE_NEWLINE_ANY, 0 | F_NOMATCH, \"a$\", \"aa\\r\\n\" },\n\t{ PCRE_UTF8 | PCRE_DOLLAR_ENDONLY | PCRE_NEWLINE_ANY, 0 | F_PROPERTY, \"\\\\p{Any}{2,}$\", \"aa\\r\\n\" },\n\t{ PCRE_NOTEOL | PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0, \"a$\", \"aa\\naa\" },\n\t{ PCRE_NEWLINE_CR, 0, \".\\\\Z\", \"aaa\" },\n\t{ PCRE_NEWLINE_CR | PCRE_UTF8, 0, \"a\\\\Z\", \"aaa\\r\" },\n\t{ PCRE_NEWLINE_CR, 0, \".\\\\Z\", \"aaa\\n\" },\n\t{ PCRE_NEWLINE_CRLF, 0, \".\\\\Z\", \"aaa\\r\" },\n\t{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\n\" },\n\t{ PCRE_NEWLINE_CRLF, 0, \".\\\\Z\", \"aaa\\r\\n\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\r\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\n\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\r\\n\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\xe2\\x80\\xa8\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\r\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\n\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\r\\n\" },\n\t{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\xc2\\x85\" },\n\t{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, \".\\\\Z\", \"aaa\\xe2\\x80\\xa8\" },\n\t{ MA, 0, \"\\\\Aa\", \"aaa\" },\n\t{ MA, 1 | F_NOMATCH, \"\\\\Aa\", \"aaa\" },\n\t{ MA, 1, \"\\\\Ga\", \"aaa\" },\n\t{ MA, 1 | F_NOMATCH, \"\\\\Ga\", \"aba\" },\n\t{ MA, 0, \"a\\\\z\", \"aaa\" },\n\t{ MA, 0 | F_NOMATCH, \"a\\\\z\", \"aab\" },\n\n\t/* Brackets and alternatives. */\n\t{ MUA, 0, \"(ab|bb|cd)\", \"bacde\" },\n\t{ MUA, 0, \"(?:ab|a)(bc|c)\", \"ababc\" },\n\t{ MUA, 0, \"((ab|(cc))|(bb)|(?:cd|efg))\", \"abac\" },\n\t{ CMUA, 0, \"((aB|(Cc))|(bB)|(?:cd|EFg))\", \"AcCe\" },\n\t{ MUA, 0, \"((ab|(cc))|(bb)|(?:cd|ebg))\", \"acebebg\" },\n\t{ MUA, 0, \"(?:(a)|(?:b))(cc|(?:d|e))(a|b)k\", \"accabdbbccbk\" },\n\t{ MUA, 0, \"\\xc7\\x82|\\xc6\\x82\", \"\\xf1\\x83\\x82\\x82\\xc7\\x82\\xc7\\x83\" },\n\t{ MUA, 0, \"=\\xc7\\x82|#\\xc6\\x82\", \"\\xf1\\x83\\x82\\x82=\\xc7\\x82\\xc7\\x83\" },\n\t{ MUA, 0, \"\\xc7\\x82\\xc7\\x83|\\xc6\\x82\\xc6\\x82\", \"\\xf1\\x83\\x82\\x82\\xc7\\x82\\xc7\\x83\" },\n\t{ MUA, 0, \"\\xc6\\x82\\xc6\\x82|\\xc7\\x83\\xc7\\x83|\\xc8\\x84\\xc8\\x84\", \"\\xf1\\x83\\x82\\x82\\xc8\\x84\\xc8\\x84\" },\n\n\t/* Greedy and non-greedy ? operators. */\n\t{ MUA, 0, \"(?:a)?a\", \"laab\" },\n\t{ CMUA, 0, \"(A)?A\", \"llaab\" },\n\t{ MUA, 0, \"(a)?\\?a\", \"aab\" }, /* ?? is the prefix of trygraphs in GCC. */\n\t{ MUA, 0, \"(a)?a\", \"manm\" },\n\t{ CMUA, 0, \"(a|b)?\\?d((?:e)?)\", \"ABABdx\" },\n\t{ MUA, 0, \"(a|b)?\\?d((?:e)?)\", \"abcde\" },\n\t{ MUA, 0, \"((?:ab)?\\?g|b(?:g(nn|d)?\\?)?)?\\?(?:n)?m\", \"abgnbgnnbgdnmm\" },\n\n\t/* Greedy and non-greedy + operators */\n\t{ MUA, 0, \"(aa)+aa\", \"aaaaaaa\" },\n\t{ MUA, 0, \"(aa)+?aa\", \"aaaaaaa\" },\n\t{ MUA, 0, \"(?:aba|ab|a)+l\", \"ababamababal\" },\n\t{ MUA, 0, \"(?:aba|ab|a)+?l\", \"ababamababal\" },\n\t{ MUA, 0, \"(a(?:bc|cb|b|c)+?|ss)+e\", \"accssabccbcacbccbbXaccssabccbcacbccbbe\" },\n\t{ MUA, 0, \"(a(?:bc|cb|b|c)+|ss)+?e\", \"accssabccbcacbccbbXaccssabccbcacbccbbe\" },\n\t{ MUA, 0, \"(?:(b(c)+?)+)?\\?(?:(bc)+|(cb)+)+(?:m)+\", \"bccbcccbcbccbcbPbccbcccbcbccbcbmmn\" },\n\n\t/* Greedy and non-greedy * operators */\n\t{ CMUA, 0, \"(?:AA)*AB\", \"aaaaaaamaaaaaaab\" },\n\t{ MUA, 0, \"(?:aa)*?ab\", \"aaaaaaamaaaaaaab\" },\n\t{ MUA, 0, \"(aa|ab)*ab\", \"aaabaaab\" },\n\t{ CMUA, 0, \"(aa|Ab)*?aB\", \"aaabaaab\" },\n\t{ MUA, 0, \"(a|b)*(?:a)*(?:b)*m\", \"abbbaaababanabbbaaababamm\" },\n\t{ MUA, 0, \"(a|b)*?(?:a)*?(?:b)*?m\", \"abbbaaababanabbbaaababamm\" },\n\t{ MA, 0, \"a(a(\\\\1*)a|(b)b+){0}a\", \"aa\" },\n\t{ MA, 0, \"((?:a|)*){0}a\", \"a\" },\n\n\t/* Combining ? + * operators */\n\t{ MUA, 0, \"((bm)+)?\\?(?:a)*(bm)+n|((am)+?)?(?:a)+(am)*n\", \"bmbmabmamaaamambmaman\" },\n\t{ MUA, 0, \"(((ab)?cd)*ef)+g\", \"abcdcdefcdefefmabcdcdefcdefefgg\" },\n\t{ MUA, 0, \"(((ab)?\\?cd)*?ef)+?g\", \"abcdcdefcdefefmabcdcdefcdefefgg\" },\n\t{ MUA, 0, \"(?:(ab)?c|(?:ab)+?d)*g\", \"ababcdccababddg\" },\n\t{ MUA, 0, \"(?:(?:ab)?\\?c|(ab)+d)*?g\", \"ababcdccababddg\" },\n\n\t/* Single character iterators. */\n\t{ MUA, 0, \"(a+aab)+aaaab\", \"aaaabcaaaabaabcaabcaaabaaaab\" },\n\t{ MUA, 0, \"(a*a*aab)+x\", \"aaaaabaabaaabmaabx\" },\n\t{ MUA, 0, \"(a*?(b|ab)a*?)+x\", \"aaaabcxbbaabaacbaaabaabax\" },\n\t{ MUA, 0, \"(a+(ab|ad)a+)+x\", \"aaabaaaadaabaaabaaaadaaax\" },\n\t{ MUA, 0, \"(a?(a)a?)+(aaa)\", \"abaaabaaaaaaaa\" },\n\t{ MUA, 0, \"(a?\\?(a)a?\\?)+(b)\", \"aaaacaaacaacacbaaab\" },\n\t{ MUA, 0, \"(a{0,4}(b))+d\", \"aaaaaabaabcaaaaabaaaaabd\" },\n\t{ MUA, 0, \"(a{0,4}?[^b])+d+(a{0,4}[^b])d+\", \"aaaaadaaaacaadddaaddd\" },\n\t{ MUA, 0, \"(ba{2})+c\", \"baabaaabacbaabaac\" },\n\t{ MUA, 0, \"(a*+bc++)+\", \"aaabbcaaabcccab\" },\n\t{ MUA, 0, \"(a?+[^b])+\", \"babaacacb\" },\n\t{ MUA, 0, \"(a{0,3}+b)(a{0,3}+b)(a{0,3}+)[^c]\", \"abaabaaacbaabaaaac\" },\n\t{ CMUA, 0, \"([a-c]+[d-f]+?)+?g\", \"aBdacdehAbDaFgA\" },\n\t{ CMUA, 0, \"[c-f]+k\", \"DemmFke\" },\n\t{ MUA, 0, \"([DGH]{0,4}M)+\", \"GGDGHDGMMHMDHHGHM\" },\n\t{ MUA, 0, \"([a-c]{4,}s)+\", \"abasabbasbbaabsbba\" },\n\t{ CMUA, 0, \"[ace]{3,7}\", \"AcbDAcEEcEd\" },\n\t{ CMUA, 0, \"[ace]{3,7}?\", \"AcbDAcEEcEd\" },\n\t{ CMUA, 0, \"[ace]{3,}\", \"AcbDAcEEcEd\" },\n\t{ CMUA, 0, \"[ace]{3,}?\", \"AcbDAcEEcEd\" },\n\t{ MUA, 0, \"[ckl]{2,}?g\", \"cdkkmlglglkcg\" },\n\t{ CMUA, 0, \"[ace]{5}?\", \"AcCebDAcEEcEd\" },\n\t{ MUA, 0, \"([AbC]{3,5}?d)+\", \"BACaAbbAEAACCbdCCbdCCAAbb\" },\n\t{ MUA, 0, \"([^ab]{0,}s){2}\", \"abaabcdsABamsDDs\" },\n\t{ MUA, 0, \"\\\\b\\\\w+\\\\B\", \"x,a_cd\" },\n\t{ MUAP, 0, \"\\\\b[^\\xc2\\xa1]+\\\\B\", \"\\xc3\\x89\\xc2\\xa1\\xe6\\x92\\xad\\xc3\\x81\\xc3\\xa1\" },\n\t{ CMUA, 0, \"[^b]+(a*)([^c]?d{3})\", \"aaaaddd\" },\n\t{ CMUAP, 0, \"\\xe1\\xbd\\xb8{2}\", \"\\xe1\\xbf\\xb8#\\xe1\\xbf\\xb8\\xe1\\xbd\\xb8\" },\n\t{ CMUA, 0, \"[^\\xf0\\x90\\x90\\x80]{2,4}@\", \"\\xf0\\x90\\x90\\xa8\\xf0\\x90\\x90\\x80###\\xf0\\x90\\x90\\x80@@@\" },\n\t{ CMUA, 0, \"[^\\xe1\\xbd\\xb8][^\\xc3\\xa9]\", \"\\xe1\\xbd\\xb8\\xe1\\xbf\\xb8\\xc3\\xa9\\xc3\\x89#\" },\n\t{ MUA, 0, \"[^\\xe1\\xbd\\xb8][^\\xc3\\xa9]\", \"\\xe1\\xbd\\xb8\\xe1\\xbf\\xb8\\xc3\\xa9\\xc3\\x89#\" },\n\t{ MUA, 0, \"[^\\xe1\\xbd\\xb8]{3,}?\", \"##\\xe1\\xbd\\xb8#\\xe1\\xbd\\xb8#\\xc3\\x89#\\xe1\\xbd\\xb8\" },\n\t{ MUA, 0, \"\\\\d+123\", \"987654321,01234\" },\n\t{ MUA, 0, \"abcd*|\\\\w+xy\", \"aaaaa,abxyz\" },\n\t{ MUA, 0, \"(?:abc|((?:amc|\\\\b\\\\w*xy)))\", \"aaaaa,abxyz\" },\n\t{ MUA, 0, \"a(?R)|([a-z]++)#\", \".abcd.abcd#.\"},\n\t{ MUA, 0, \"a(?R)|([a-z]++)#\", \".abcd.mbcd#.\"},\n\t{ MUA, 0, \".[ab]*.\", \"xx\" },\n\t{ MUA, 0, \".[ab]*a\", \"xxa\" },\n\t{ MUA, 0, \".[ab]?.\", \"xx\" },\n\n\t/* Bracket repeats with limit. */\n\t{ MUA, 0, \"(?:(ab){2}){5}M\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(?:ab|abab){1,5}M\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(?>ab|abab){1,5}M\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(?:ab|abab){1,5}?M\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(?>ab|abab){1,5}?M\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(?:(ab){1,4}?){1,3}?M\", \"abababababababababababababM\" },\n\t{ MUA, 0, \"(?:(ab){1,4}){1,3}abababababababababababM\", \"ababababababababababababM\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?:(ab){1,4}){1,3}abababababababababababM\", \"abababababababababababM\" },\n\t{ MUA, 0, \"(ab){4,6}?M\", \"abababababababM\" },\n\n\t/* Basic character sets. */\n\t{ MUA, 0, \"(?:\\\\s)+(?:\\\\S)+\", \"ab \\t\\xc3\\xa9\\xe6\\x92\\xad \" },\n\t{ MUA, 0, \"(\\\\w)*(k)(\\\\W)?\\?\", \"abcdef abck11\" },\n\t{ MUA, 0, \"\\\\((\\\\d)+\\\\)\\\\D\", \"a() (83 (8)2 (9)ab\" },\n\t{ MUA, 0, \"\\\\w(\\\\s|(?:\\\\d)*,)+\\\\w\\\\wb\", \"a 5, 4,, bb 5, 4,, aab\" },\n\t{ MUA, 0, \"(\\\\v+)(\\\\V+)\", \"\\x0e\\xc2\\x85\\xe2\\x80\\xa8\\x0b\\x09\\xe2\\x80\\xa9\" },\n\t{ MUA, 0, \"(\\\\h+)(\\\\H+)\", \"\\xe2\\x80\\xa8\\xe2\\x80\\x80\\x20\\xe2\\x80\\x8a\\xe2\\x81\\x9f\\xe3\\x80\\x80\\x09\\x20\\xc2\\xa0\\x0a\" },\n\t{ MUA, 0, \"x[bcef]+\", \"xaxdxecbfg\" },\n\t{ MUA, 0, \"x[bcdghij]+\", \"xaxexfxdgbjk\" },\n\t{ MUA, 0, \"x[^befg]+\", \"xbxexacdhg\" },\n\t{ MUA, 0, \"x[^bcdl]+\", \"xlxbxaekmd\" },\n\t{ MUA, 0, \"x[^bcdghi]+\", \"xbxdxgxaefji\" },\n\t{ MUA, 0, \"x[B-Fb-f]+\", \"xaxAxgxbfBFG\" },\n\t{ CMUA, 0, \"\\\\x{e9}+\", \"#\\xf0\\x90\\x90\\xa8\\xc3\\xa8\\xc3\\xa9\\xc3\\x89\\xc3\\x88\" },\n\t{ CMUA, 0, \"[^\\\\x{e9}]+\", \"\\xc3\\xa9#\\xf0\\x90\\x90\\xa8\\xc3\\xa8\\xc3\\x88\\xc3\\x89\" },\n\t{ MUA, 0, \"[\\\\x02\\\\x7e]+\", \"\\xc3\\x81\\xe1\\xbf\\xb8\\xf0\\x90\\x90\\xa8\\x01\\x02\\x7e\\x7f\" },\n\t{ MUA, 0, \"[^\\\\x02\\\\x7e]+\", \"\\x02\\xc3\\x81\\xe1\\xbf\\xb8\\xf0\\x90\\x90\\xa8\\x01\\x7f\\x7e\" },\n\t{ MUA, 0, \"[\\\\x{81}-\\\\x{7fe}]+\", \"#\\xe1\\xbf\\xb8\\xf0\\x90\\x90\\xa8\\xc2\\x80\\xc2\\x81\\xdf\\xbe\\xdf\\xbf\" },\n\t{ MUA, 0, \"[^\\\\x{81}-\\\\x{7fe}]+\", \"\\xc2\\x81#\\xe1\\xbf\\xb8\\xf0\\x90\\x90\\xa8\\xc2\\x80\\xdf\\xbf\\xdf\\xbe\" },\n\t{ MUA, 0, \"[\\\\x{801}-\\\\x{fffe}]+\", \"#\\xc3\\xa9\\xf0\\x90\\x90\\x80\\xe0\\xa0\\x80\\xe0\\xa0\\x81\\xef\\xbf\\xbe\\xef\\xbf\\xbf\" },\n\t{ MUA, 0, \"[^\\\\x{801}-\\\\x{fffe}]+\", \"\\xe0\\xa0\\x81#\\xc3\\xa9\\xf0\\x90\\x90\\x80\\xe0\\xa0\\x80\\xef\\xbf\\xbf\\xef\\xbf\\xbe\" },\n\t{ MUA, 0, \"[\\\\x{10001}-\\\\x{10fffe}]+\", \"#\\xc3\\xa9\\xe2\\xb1\\xa5\\xf0\\x90\\x80\\x80\\xf0\\x90\\x80\\x81\\xf4\\x8f\\xbf\\xbe\\xf4\\x8f\\xbf\\xbf\" },\n\t{ MUA, 0, \"[^\\\\x{10001}-\\\\x{10fffe}]+\", \"\\xf0\\x90\\x80\\x81#\\xc3\\xa9\\xe2\\xb1\\xa5\\xf0\\x90\\x80\\x80\\xf4\\x8f\\xbf\\xbf\\xf4\\x8f\\xbf\\xbe\" },\n\n\t/* Unicode properties. */\n\t{ MUAP, 0, \"[1-5\\xc3\\xa9\\\\w]\", \"\\xc3\\xa1_\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[\\xc3\\x81\\\\p{Ll}]\", \"A_\\xc3\\x89\\xc3\\xa1\" },\n\t{ MUAP, 0, \"[\\\\Wd-h_x-z]+\", \"a\\xc2\\xa1#_yhzdxi\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[\\\\P{Any}]\", \"abc\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[^\\\\p{Any}]\", \"abc\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[\\\\P{Any}\\xc3\\xa1-\\xc3\\xa8]\", \"abc\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[^\\\\p{Any}\\xc3\\xa1-\\xc3\\xa8]\", \"abc\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[\\xc3\\xa1-\\xc3\\xa8\\\\P{Any}]\", \"abc\" },\n\t{ MUAP, 0 | F_NOMATCH | F_PROPERTY, \"[^\\xc3\\xa1-\\xc3\\xa8\\\\p{Any}]\", \"abc\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[\\xc3\\xa1-\\xc3\\xa8\\\\p{Any}]\", \"abc\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[^\\xc3\\xa1-\\xc3\\xa8\\\\P{Any}]\", \"abc\" },\n\t{ MUAP, 0, \"[b-\\xc3\\xa9\\\\s]\", \"a\\xc\\xe6\\x92\\xad\" },\n\t{ CMUAP, 0, \"[\\xc2\\x85-\\xc2\\x89\\xc3\\x89]\", \"\\xc2\\x84\\xc3\\xa9\" },\n\t{ MUAP, 0, \"[^b-d^&\\\\s]{3,}\", \"db^ !a\\xe2\\x80\\xa8_ae\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[^\\\\S\\\\P{Any}][\\\\sN]{1,3}[\\\\P{N}]{4}\", \"\\xe2\\x80\\xaa\\xa N\\x9\\xc3\\xa9_0\" },\n\t{ MUA, 0 | F_PROPERTY, \"[^\\\\P{L}\\x9!D-F\\xa]{2,3}\", \"\\x9,.DF\\xa.CG\\xc3\\x81\" },\n\t{ CMUAP, 0, \"[\\xc3\\xa1-\\xc3\\xa9_\\xe2\\x80\\xa0-\\xe2\\x80\\xaf]{1,5}[^\\xe2\\x80\\xa0-\\xe2\\x80\\xaf]\", \"\\xc2\\xa1\\xc3\\x89\\xc3\\x89\\xe2\\x80\\xaf_\\xe2\\x80\\xa0\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[\\xc3\\xa2-\\xc3\\xa6\\xc3\\x81-\\xc3\\x84\\xe2\\x80\\xa8-\\xe2\\x80\\xa9\\xe6\\x92\\xad\\\\p{Zs}]{2,}\", \"\\xe2\\x80\\xa7\\xe2\\x80\\xa9\\xe6\\x92\\xad \\xe6\\x92\\xae\" },\n\t{ MUAP, 0 | F_PROPERTY, \"[\\\\P{L&}]{2}[^\\xc2\\x85-\\xc2\\x89\\\\p{Ll}\\\\p{Lu}]{2}\", \"\\xc3\\xa9\\xe6\\x92\\xad.a\\xe6\\x92\\xad|\\xc2\\x8a#\" },\n\t{ PCRE_UCP, 0, \"[a-b\\\\s]{2,5}[^a]\", \"AB  baaa\" },\n\n\t/* Possible empty brackets. */\n\t{ MUA, 0, \"(?:|ab||bc|a)+d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(|ab||bc|a)+d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(?:|ab||bc|a)*d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(|ab||bc|a)*d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(?:|ab||bc|a)+?d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(|ab||bc|a)+?d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(?:|ab||bc|a)*?d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(|ab||bc|a)*?d\", \"abcxabcabd\" },\n\t{ MUA, 0, \"(((a)*?|(?:ba)+)+?|(?:|c|ca)*)*m\", \"abaacaccabacabalabaacaccabacabamm\" },\n\t{ MUA, 0, \"(?:((?:a)*|(ba)+?)+|(|c|ca)*?)*?m\", \"abaacaccabacabalabaacaccabacabamm\" },\n\n\t/* Start offset. */\n\t{ MUA, 3, \"(\\\\d|(?:\\\\w)*\\\\w)+\", \"0ac01Hb\" },\n\t{ MUA, 4 | F_NOMATCH, \"(\\\\w\\\\W\\\\w)+\", \"ab#d\" },\n\t{ MUA, 2 | F_NOMATCH, \"(\\\\w\\\\W\\\\w)+\", \"ab#d\" },\n\t{ MUA, 1, \"(\\\\w\\\\W\\\\w)+\", \"ab#d\" },\n\n\t/* Newline. */\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, \"\\\\W{0,2}[^#]{3}\", \"\\r\\n#.....\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CR, 0, \"\\\\W{0,2}[^#]{3}\", \"\\r\\n#.....\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 0, \"\\\\W{1,3}[^#]\", \"\\r\\n##....\" },\n\t{ MUA | PCRE_NO_UTF8_CHECK, 1, \"^.a\", \"\\n\\x80\\nxa\" },\n\t{ MUA, 1, \"^\", \"\\r\\n\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1 | F_NOMATCH, \"^\", \"\\r\\n\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_CRLF, 1, \"^\", \"\\r\\na\" },\n\n\t/* Any character except newline or any newline. */\n\t{ PCRE_NEWLINE_CRLF, 0, \".\", \"\\r\" },\n\t{ PCRE_NEWLINE_CRLF | PCRE_UTF8, 0, \".(.).\", \"a\\xc3\\xa1\\r\\n\\n\\r\\r\" },\n\t{ PCRE_NEWLINE_ANYCRLF, 0, \".(.)\", \"a\\rb\\nc\\r\\n\\xc2\\x85\\xe2\\x80\\xa8\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0, \".(.)\", \"a\\rb\\nc\\r\\n\\xc2\\x85\\xe2\\x80\\xa8\" },\n\t{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, \"(.).\", \"a\\rb\\nc\\r\\n\\xc2\\x85\\xe2\\x80\\xa9$de\" },\n\t{ PCRE_NEWLINE_ANYCRLF | PCRE_UTF8, 0 | F_NOMATCH, \".(.).\", \"\\xe2\\x80\\xa8\\nb\\r\" },\n\t{ PCRE_NEWLINE_ANY, 0, \"(.)(.)\", \"#\\x85#\\r#\\n#\\r\\n#\\x84\" },\n\t{ PCRE_NEWLINE_ANY | PCRE_UTF8, 0, \"(.+)#\", \"#\\rMn\\xc2\\x85#\\n###\" },\n\t{ PCRE_BSR_ANYCRLF, 0, \"\\\\R\", \"\\r\" },\n\t{ PCRE_BSR_ANYCRLF, 0, \"\\\\R\", \"\\x85#\\r\\n#\" },\n\t{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, \"\\\\R\", \"ab\\xe2\\x80\\xa8#c\" },\n\t{ PCRE_BSR_UNICODE | PCRE_UTF8, 0, \"\\\\R\", \"ab\\r\\nc\" },\n\t{ PCRE_NEWLINE_CRLF | PCRE_BSR_UNICODE | PCRE_UTF8, 0, \"(\\\\R.)+\", \"\\xc2\\x85\\r\\n#\\xe2\\x80\\xa8\\n\\r\\n\\r\" },\n\t{ MUA, 0 | F_NOMATCH, \"\\\\R+\", \"ab\" },\n\t{ MUA, 0, \"\\\\R+\", \"ab\\r\\n\\r\" },\n\t{ MUA, 0, \"\\\\R*\", \"ab\\r\\n\\r\" },\n\t{ MUA, 0, \"\\\\R*\", \"\\r\\n\\r\" },\n\t{ MUA, 0, \"\\\\R{2,4}\", \"\\r\\nab\\r\\r\" },\n\t{ MUA, 0, \"\\\\R{2,4}\", \"\\r\\nab\\n\\n\\n\\r\\r\\r\" },\n\t{ MUA, 0, \"\\\\R{2,}\", \"\\r\\nab\\n\\n\\n\\r\\r\\r\" },\n\t{ MUA, 0, \"\\\\R{0,3}\", \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\" },\n\t{ MUA, 0 | F_NOMATCH, \"\\\\R+\\\\R\\\\R\", \"\\r\\n\\r\\n\" },\n\t{ MUA, 0, \"\\\\R+\\\\R\\\\R\", \"\\r\\r\\r\" },\n\t{ MUA, 0, \"\\\\R*\\\\R\\\\R\", \"\\n\\r\" },\n\t{ MUA, 0 | F_NOMATCH, \"\\\\R{2,4}\\\\R\\\\R\", \"\\r\\r\\r\" },\n\t{ MUA, 0, \"\\\\R{2,4}\\\\R\\\\R\", \"\\r\\r\\r\\r\" },\n\n\t/* Atomic groups (no fallback from \"next\" direction). */\n\t{ MUA, 0 | F_NOMATCH, \"(?>ab)ab\", \"bab\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?>(ab))ab\", \"bab\" },\n\t{ MUA, 0, \"(?>ab)+abc(?>de)*def(?>gh)?ghe(?>ij)+?k(?>lm)*?n(?>op)?\\?op\",\n\t\t\t\"bababcdedefgheijijklmlmnop\" },\n\t{ MUA, 0, \"(?>a(b)+a|(ab)?\\?(b))an\", \"abban\" },\n\t{ MUA, 0, \"(?>ab+a|(?:ab)?\\?b)an\", \"abban\" },\n\t{ MUA, 0, \"((?>ab|ad|)*?)(?>|c)*abad\", \"abababcababad\" },\n\t{ MUA, 0, \"(?>(aa|b|)*+(?>(##)|###)*d|(aa)(?>(baa)?)m)\", \"aabaa#####da\" },\n\t{ MUA, 0, \"((?>a|)+?)b\", \"aaacaaab\" },\n\t{ MUA, 0, \"(?>x|)*$\", \"aaa\" },\n\t{ MUA, 0, \"(?>(x)|)*$\", \"aaa\" },\n\t{ MUA, 0, \"(?>x|())*$\", \"aaa\" },\n\t{ MUA, 0, \"((?>[cxy]a|[a-d])*?)b\", \"aaa+ aaab\" },\n\t{ MUA, 0, \"((?>[cxy](a)|[a-d])*?)b\", \"aaa+ aaab\" },\n\t{ MUA, 0, \"(?>((?>(a+))))bab|(?>((?>(a+))))bb\", \"aaaabaaabaabab\" },\n\t{ MUA, 0, \"(?>(?>a+))bab|(?>(?>a+))bb\", \"aaaabaaabaabab\" },\n\t{ MUA, 0, \"(?>(a)c|(?>(c)|(a))a)b*?bab\", \"aaaabaaabaabab\" },\n\t{ MUA, 0, \"(?>ac|(?>c|a)a)b*?bab\", \"aaaabaaabaabab\" },\n\t{ MUA, 0, \"(?>(b)b|(a))*b(?>(c)|d)?x\", \"ababcaaabdbx\" },\n\t{ MUA, 0, \"(?>bb|a)*b(?>c|d)?x\", \"ababcaaabdbx\" },\n\t{ MUA, 0, \"(?>(bb)|a)*b(?>c|(d))?x\", \"ababcaaabdbx\" },\n\t{ MUA, 0, \"(?>(a))*?(?>(a))+?(?>(a))??x\", \"aaaaaacccaaaaabax\" },\n\t{ MUA, 0, \"(?>a)*?(?>a)+?(?>a)??x\", \"aaaaaacccaaaaabax\" },\n\t{ MUA, 0, \"(?>(a)|)*?(?>(a)|)+?(?>(a)|)??x\", \"aaaaaacccaaaaabax\" },\n\t{ MUA, 0, \"(?>a|)*?(?>a|)+?(?>a|)??x\", \"aaaaaacccaaaaabax\" },\n\t{ MUA, 0, \"(?>a(?>(a{0,2}))*?b|aac)+b\", \"aaaaaaacaaaabaaaaacaaaabaacaaabb\" },\n\t{ CMA, 0, \"(?>((?>a{32}|b+|(a*))?(?>c+|d*)?\\?)+e)+?f\", \"aaccebbdde bbdaaaccebbdee bbdaaaccebbdeef\" },\n\t{ MUA, 0, \"(?>(?:(?>aa|a||x)+?b|(?>aa|a||(x))+?c)?(?>[ad]{0,2})*?d)+d\", \"aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd\" },\n\t{ MUA, 0, \"(?>(?:(?>aa|a||(x))+?b|(?>aa|a||x)+?c)?(?>[ad]{0,2})*?d)+d\", \"aaacdbaabdcabdbaaacd aacaabdbdcdcaaaadaabcbaadd\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X\", \"\\xcc\\x8d\\xcc\\x8d\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X\", \"\\xcc\\x8d\\xcc\\x8d#\\xcc\\x8d\\xcc\\x8d\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X+..\", \"\\xcc\\x8d#\\xcc\\x8d#\\xcc\\x8d\\xcc\\x8d\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X{2,4}\", \"abcdef\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X{2,4}?\", \"abcdef\" },\n\t{ MUA, 0 | F_NOMATCH | F_PROPERTY, \"\\\\X{2,4}..\", \"#\\xcc\\x8d##\" },\n\t{ MUA, 0 | F_PROPERTY, \"\\\\X{2,4}..\", \"#\\xcc\\x8d#\\xcc\\x8d##\" },\n\t{ MUA, 0, \"(c(ab)?+ab)+\", \"cabcababcab\" },\n\t{ MUA, 0, \"(?>(a+)b)+aabab\", \"aaaabaaabaabab\" },\n\n\t/* Possessive quantifiers. */\n\t{ MUA, 0, \"(?:a|b)++m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(?:a|b)*+m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(?:a|b)*+m\", \"ababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|b)++m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|b)*+m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|b)*+m\", \"ababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|b(*ACCEPT))++m\", \"maaxab\" },\n\t{ MUA, 0, \"(?:b*)++m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(?:b*)++m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"(?:b*)*+m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(?:b*)*+m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"(b*)++m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(b*)++m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"(b*)*+m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(b*)*+m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"(?:a|(b))++m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(?:(a)|b)*+m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"(?:(a)|(b))*+m\", \"ababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|(b))++m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"((a)|b)*+m\", \"mababbaaxababbaam\" },\n\t{ MUA, 0, \"((a)|(b))*+m\", \"ababbaaxababbaam\" },\n\t{ MUA, 0, \"(a|(b)(*ACCEPT))++m\", \"maaxab\" },\n\t{ MUA, 0, \"(?:(b*))++m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(?:(b*))++m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"(?:(b*))*+m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"(?:(b*))*+m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"((b*))++m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"((b*))++m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0, \"((b*))*+m\", \"bxbbxbbbxm\" },\n\t{ MUA, 0, \"((b*))*+m\", \"bxbbxbbbxbbm\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?>(b{2,4}))(?:(?:(aa|c))++m|(?:(aa|c))+n)\", \"bbaacaaccaaaacxbbbmbn\" },\n\t{ MUA, 0, \"((?:b)++a)+(cd)*+m\", \"bbababbacdcdnbbababbacdcdm\" },\n\t{ MUA, 0, \"((?:(b))++a)+((c)d)*+m\", \"bbababbacdcdnbbababbacdcdm\" },\n\t{ MUA, 0, \"(?:(?:(?:ab)*+k)++(?:n(?:cd)++)*+)*+m\", \"ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm\" },\n\t{ MUA, 0, \"(?:((ab)*+(k))++(n(?:c(d))++)*+)*+m\", \"ababkkXababkkabkncXababkkabkncdcdncdXababkkabkncdcdncdkkabkncdXababkkabkncdcdncdkkabkncdm\" },\n\n\t/* Back references. */\n\t{ MUA, 0, \"(aa|bb)(\\\\1*)(ll|)(\\\\3*)bbbbbbc\", \"aaaaaabbbbbbbbc\" },\n\t{ CMUA, 0, \"(aa|bb)(\\\\1+)(ll|)(\\\\3+)bbbbbbc\", \"bBbbBbCbBbbbBbbcbbBbbbBBbbC\" },\n\t{ CMA, 0, \"(a{2,4})\\\\1\", \"AaAaaAaA\" },\n\t{ MUA, 0, \"(aa|bb)(\\\\1?)aa(\\\\1?)(ll|)(\\\\4+)bbc\", \"aaaaaaaabbaabbbbaabbbbc\" },\n\t{ MUA, 0, \"(aa|bb)(\\\\1{0,5})(ll|)(\\\\3{0,5})cc\", \"bbxxbbbbxxaaaaaaaaaaaaaaaacc\" },\n\t{ MUA, 0, \"(aa|bb)(\\\\1{3,5})(ll|)(\\\\3{3,5})cc\", \"bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc\" },\n\t{ MUA, 0, \"(aa|bb)(\\\\1{3,})(ll|)(\\\\3{3,})cc\", \"bbbbbbbbbbbbaaaaaaccbbbbbbbbbbbbbbcc\" },\n\t{ MUA, 0, \"(\\\\w+)b(\\\\1+)c\", \"GabGaGaDbGaDGaDc\" },\n\t{ MUA, 0, \"(?:(aa)|b)\\\\1?b\", \"bb\" },\n\t{ CMUA, 0, \"(aa|bb)(\\\\1*?)aa(\\\\1+?)\", \"bBBbaaAAaaAAaa\" },\n\t{ MUA, 0, \"(aa|bb)(\\\\1*?)(dd|)cc(\\\\3+?)\", \"aaaaaccdd\" },\n\t{ CMUA, 0, \"(?:(aa|bb)(\\\\1?\\?)cc){2}(\\\\1?\\?)\", \"aAaABBbbAAaAcCaAcCaA\" },\n\t{ MUA, 0, \"(?:(aa|bb)(\\\\1{3,5}?)){2}(dd|)(\\\\3{3,5}?)\", \"aaaaaabbbbbbbbbbaaaaaaaaaaaaaa\" },\n\t{ CMA, 0, \"(?:(aa|bb)(\\\\1{3,}?)){2}(dd|)(\\\\3{3,}?)\", \"aaaaaabbbbbbbbbbaaaaaaaaaaaaaa\" },\n\t{ MUA, 0, \"(?:(aa|bb)(\\\\1{0,3}?)){2}(dd|)(\\\\3{0,3}?)b(\\\\1{0,3}?)(\\\\1{0,3})\", \"aaaaaaaaaaaaaaabaaaaa\" },\n\t{ MUA, 0, \"(a(?:\\\\1|)a){3}b\", \"aaaaaaaaaaab\" },\n\t{ MA, 0, \"(a?)b(\\\\1\\\\1*\\\\1+\\\\1?\\\\1*?\\\\1+?\\\\1??\\\\1*+\\\\1++\\\\1?+\\\\1{4}\\\\1{3,5}\\\\1{4,}\\\\1{0,5}\\\\1{3,5}?\\\\1{4,}?\\\\1{0,5}?\\\\1{3,5}+\\\\1{4,}+\\\\1{0,5}+#){2}d\", \"bb#b##d\" },\n\t{ MUAP, 0 | F_PROPERTY, \"(\\\\P{N})\\\\1{2,}\", \".www.\" },\n\t{ MUAP, 0 | F_PROPERTY, \"(\\\\P{N})\\\\1{0,2}\", \"wwwww.\" },\n\t{ MUAP, 0 | F_PROPERTY, \"(\\\\P{N})\\\\1{1,2}ww\", \"wwww\" },\n\t{ MUAP, 0 | F_PROPERTY, \"(\\\\P{N})\\\\1{1,2}ww\", \"wwwww\" },\n\t{ PCRE_UCP, 0 | F_PROPERTY, \"(\\\\P{N})\\\\1{2,}\", \".www.\" },\n\t{ CMUAP, 0, \"(\\xf0\\x90\\x90\\x80)\\\\1\", \"\\xf0\\x90\\x90\\xa8\\xf0\\x90\\x90\\xa8\" },\n\t{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, \"\\\\k<A>{1,3}(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, \"\\\\k<A>{1,3}(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, \"\\\\k<A>*(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?<A>aa)(?<A>bb)\\\\k<A>{0,3}aaaaaa\", \"aabbaaaaaa\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?<A>aa)(?<A>bb)\\\\k<A>{2,5}bb\", \"aabbaaaabb\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?:(?<A>aa)|(?<A>bb))\\\\k<A>{0,3}m\", \"aaaaaaaabbbbaabbbbm\" },\n\t{ MUA | PCRE_DUPNAMES, 0 | F_NOMATCH, \"\\\\k<A>{1,3}?(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES | PCRE_JAVASCRIPT_COMPAT, 0, \"\\\\k<A>{1,3}?(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"\\\\k<A>*?(?<A>aa)(?<A>bb)\", \"aabb\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?:(?<A>aa)|(?<A>bb))\\\\k<A>{0,3}?m\", \"aaaaaabbbbbbaabbbbbbbbbbm\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?:(?<A>aa)|(?<A>bb))\\\\k<A>*?m\", \"aaaaaabbbbbbaabbbbbbbbbbm\" },\n\t{ MUA | PCRE_DUPNAMES, 0, \"(?:(?<A>aa)|(?<A>bb))\\\\k<A>{2,3}?\", \"aaaabbbbaaaabbbbbbbbbb\" },\n\t{ CMUA | PCRE_DUPNAMES, 0, \"(?:(?<A>AA)|(?<A>BB))\\\\k<A>{0,3}M\", \"aaaaaaaabbbbaabbbbm\" },\n\t{ CMUA | PCRE_DUPNAMES, 0, \"(?:(?<A>AA)|(?<A>BB))\\\\k<A>{1,3}M\", \"aaaaaaaabbbbaabbbbm\" },\n\t{ CMUA | PCRE_DUPNAMES, 0, \"(?:(?<A>AA)|(?<A>BB))\\\\k<A>{0,3}?M\", \"aaaaaabbbbbbaabbbbbbbbbbm\" },\n\t{ CMUA | PCRE_DUPNAMES, 0, \"(?:(?<A>AA)|(?<A>BB))\\\\k<A>{2,3}?\", \"aaaabbbbaaaabbbbbbbbbb\" },\n\n\t/* Assertions. */\n\t{ MUA, 0, \"(?=xx|yy|zz)\\\\w{4}\", \"abczzdefg\" },\n\t{ MUA, 0, \"(?=((\\\\w+)b){3}|ab)\", \"dbbbb ab\" },\n\t{ MUA, 0, \"(?!ab|bc|cd)[a-z]{2}\", \"Xabcdef\" },\n\t{ MUA, 0, \"(?<=aaa|aa|a)a\", \"aaa\" },\n\t{ MUA, 2, \"(?<=aaa|aa|a)a\", \"aaa\" },\n\t{ MA, 0, \"(?<=aaa|aa|a)a\", \"aaa\" },\n\t{ MA, 2, \"(?<=aaa|aa|a)a\", \"aaa\" },\n\t{ MUA, 0, \"(\\\\d{2})(?!\\\\w+c|(((\\\\w?)m){2}n)+|\\\\1)\", \"x5656\" },\n\t{ MUA, 0, \"((?=((\\\\d{2,6}\\\\w){2,}))\\\\w{5,20}K){2,}\", \"567v09708K12l00M00 567v09708K12l00M00K45K\" },\n\t{ MUA, 0, \"(?=(?:(?=\\\\S+a)\\\\w*(b)){3})\\\\w+\\\\d\", \"bba bbab nbbkba nbbkba0kl\" },\n\t{ MUA, 0, \"(?>a(?>(b+))a(?=(..)))*?k\", \"acabbcabbaabacabaabbakk\" },\n\t{ MUA, 0, \"((?(?=(a))a)+k)\", \"bbak\" },\n\t{ MUA, 0, \"((?(?=a)a)+k)\", \"bbak\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?=(?>(a))m)amk\", \"a k\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?!(?>(a))m)amk\", \"a k\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?>(?=(a))am)amk\", \"a k\" },\n\t{ MUA, 0, \"(?=(?>a|(?=(?>(b+))a|c)[a-c]+)*?m)[a-cm]+k\", \"aaam bbam baaambaam abbabba baaambaamk\" },\n\t{ MUA, 0, \"(?> ?\\?\\\\b(?(?=\\\\w{1,4}(a))m)\\\\w{0,8}bc){2,}?\", \"bca ssbc mabd ssbc mabc\" },\n\t{ MUA, 0, \"(?:(?=ab)?[^n][^n])+m\", \"ababcdabcdcdabnababcdabcdcdabm\" },\n\t{ MUA, 0, \"(?:(?=a(b))?[^n][^n])+m\", \"ababcdabcdcdabnababcdabcdcdabm\" },\n\t{ MUA, 0, \"(?:(?=.(.))??\\\\1.)+m\", \"aabbbcbacccanaabbbcbacccam\" },\n\t{ MUA, 0, \"(?:(?=.)??[a-c])+m\", \"abacdcbacacdcaccam\" },\n\t{ MUA, 0, \"((?!a)?(?!([^a]))?)+$\", \"acbab\" },\n\t{ MUA, 0, \"((?!a)?\\?(?!([^a]))?\\?)+$\", \"acbab\" },\n\t{ MUA, 0, \"a(?=(?C)\\\\B)b\", \"ab\" },\n\t{ MUA, 0, \"a(?!(?C)\\\\B)bb|ab\", \"abb\" },\n\t{ MUA, 0, \"a(?=\\\\b|(?C)\\\\B)b\", \"ab\" },\n\t{ MUA, 0, \"a(?!\\\\b|(?C)\\\\B)bb|ab\", \"abb\" },\n\t{ MUA, 0, \"c(?(?=(?C)\\\\B)ab|a)\", \"cab\" },\n\t{ MUA, 0, \"c(?(?!(?C)\\\\B)ab|a)\", \"cab\" },\n\t{ MUA, 0, \"c(?(?=\\\\b|(?C)\\\\B)ab|a)\", \"cab\" },\n\t{ MUA, 0, \"c(?(?!\\\\b|(?C)\\\\B)ab|a)\", \"cab\" },\n\t{ MUA, 0, \"a(?=)b\", \"ab\" },\n\t{ MUA, 0 | F_NOMATCH, \"a(?!)b\", \"ab\" },\n\n\t/* Not empty, ACCEPT, FAIL */\n\t{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, \"a*\", \"bcx\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"a*\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"a*?\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY_ATSTART, 0, \"a*\", \"bcaad\" },\n\t{ MUA, 0, \"a(*ACCEPT)b\", \"ab\" },\n\t{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, \"a*(*ACCEPT)b\", \"bcx\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"a*(*ACCEPT)b\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"a*?(*ACCEPT)b\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, \"(?:z|a*(*ACCEPT)b)\", \"bcx\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"(?:z|a*(*ACCEPT)b)\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"(?:z|a*?(*ACCEPT)b)\", \"bcaad\" },\n\t{ MUA | PCRE_NOTEMPTY_ATSTART, 0, \"a*(*ACCEPT)b\", \"bcx\" },\n\t{ MUA | PCRE_NOTEMPTY_ATSTART, 0 | F_NOMATCH, \"a*(*ACCEPT)b\", \"\" },\n\t{ MUA, 0, \"((a(*ACCEPT)b))\", \"ab\" },\n\t{ MUA, 0, \"(a(*FAIL)a|a)\", \"aaa\" },\n\t{ MUA, 0, \"(?=ab(*ACCEPT)b)a\", \"ab\" },\n\t{ MUA, 0, \"(?=(?:x|ab(*ACCEPT)b))\", \"ab\" },\n\t{ MUA, 0, \"(?=(a(b(*ACCEPT)b)))a\", \"ab\" },\n\t{ MUA | PCRE_NOTEMPTY, 0, \"(?=a*(*ACCEPT))c\", \"c\" },\n\n\t/* Conditional blocks. */\n\t{ MUA, 0, \"(?(?=(a))a|b)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?!(b))a|b)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?=a)a|b)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?!b)a|b)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?=(a))a*|b*)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?!(b))a*|b*)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak\", \"aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak\" },\n\t{ MUA, 0, \"(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+aaaak\", \"aaaaaaaaaaaaaa bbbbbbbbbbbbbbb aaaaaaak\" },\n\t{ MUA, 0 | F_DIFF, \"(?(?!(b))(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk\", \"aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk\" },\n\t{ MUA, 0, \"(?(?!b)(?:aaaaaa|a)|(?:bbbbbb|b))+bbbbk\", \"aaaaaaaaaaaaaa bbbbbbbbbbbbbbb bbbbbbbk\" },\n\t{ MUA, 0, \"(?(?=a)a*|b*)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?!b)a*|b*)+k\", \"ababbalbbadabak\" },\n\t{ MUA, 0, \"(?(?=a)ab)\", \"a\" },\n\t{ MUA, 0, \"(?(?<!b)c)\", \"b\" },\n\t{ MUA, 0, \"(?(DEFINE)a(b))\", \"a\" },\n\t{ MUA, 0, \"a(?(DEFINE)(?:b|(?:c?)+)*)\", \"a\" },\n\t{ MUA, 0, \"(?(?=.[a-c])[k-l]|[A-D])\", \"kdB\" },\n\t{ MUA, 0, \"(?(?!.{0,4}[cd])(aa|bb)|(cc|dd))+\", \"aabbccddaa\" },\n\t{ MUA, 0, \"(?(?=[^#@]*@)(aaab|aa|aba)|(aba|aab)){3,}\", \"aaabaaaba#aaabaaaba#aaabaaaba@\" },\n\t{ MUA, 0, \"((?=\\\\w{5})\\\\w(?(?=\\\\w*k)\\\\d|[a-f_])*\\\\w\\\\s)+\", \"mol m10kk m088k _f_a_ mbkkl\" },\n\t{ MUA, 0, \"(c)?\\?(?(1)a|b)\", \"cdcaa\" },\n\t{ MUA, 0, \"(c)?\\?(?(1)a|b)\", \"cbb\" },\n\t{ MUA, 0 | F_DIFF, \"(?(?=(a))(aaaa|a?))+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?=a)(aaaa|a?))+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?!(b))(aaaa|a?))+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?!b)(aaaa|a?))+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0 | F_DIFF, \"(?(?=(a))a*)+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?=a)a*)+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?!(b))a*)+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?!b)a*)+aak\", \"aaaaab aaaaak\" },\n\t{ MUA, 0, \"(?(?=(?=(?!(x))a)aa)aaa|(?(?=(?!y)bb)bbb))*k\", \"abaabbaaabbbaaabbb abaabbaaabbbaaabbbk\" },\n\t{ MUA, 0, \"(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)*l\", \"bc ddd abccabccl\" },\n\t{ MUA, 0, \"(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd\", \"bcabcacdb bdddd\" },\n\t{ MUA, 0, \"(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l\", \"ababccddabdbccd abcccl\" },\n\t{ MUA, 0, \"((?:a|aa)(?(1)aaa))x\", \"aax\" },\n\t{ MUA, 0, \"(?(?!)a|b)\", \"ab\" },\n\t{ MUA, 0, \"(?(?!)a)\", \"ab\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?(?!)a|b)\", \"ac\" },\n\n\t/* Set start of match. */\n\t{ MUA, 0, \"(?:\\\\Ka)*aaaab\", \"aaaaaaaa aaaaaaabb\" },\n\t{ MUA, 0, \"(?>\\\\Ka\\\\Ka)*aaaab\", \"aaaaaaaa aaaaaaaaaabb\" },\n\t{ MUA, 0, \"a+\\\\K(?<=\\\\Gaa)a\", \"aaaaaa\" },\n\t{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, \"a\\\\K(*ACCEPT)b\", \"aa\" },\n\t{ MUA | PCRE_NOTEMPTY_ATSTART, 0, \"a\\\\K(*ACCEPT)b\", \"aa\" },\n\n\t/* First line. */\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_PROPERTY, \"\\\\p{Any}a\", \"bb\\naaa\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, \"\\\\p{Any}a\", \"bb\\r\\naaa\" },\n\t{ MUA | PCRE_FIRSTLINE, 0, \"(?<=a)\", \"a\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"[^a][^b]\", \"ab\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"a\", \"\\na\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"[abc]\", \"\\na\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"^a\", \"\\na\" },\n\t{ MUA | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"^(?<=\\n)\", \"\\na\" },\n\t{ MUA | PCRE_FIRSTLINE, 0, \"\\xf0\\x90\\x90\\x80\", \"\\xf0\\x90\\x90\\x80\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"#\", \"\\xc2\\x85#\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"#\", \"\\x85#\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANY | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"^#\", \"\\xe2\\x80\\xa8#\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_PROPERTY, \"\\\\p{Any}\", \"\\r\\na\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, \".\", \"\\r\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0, \"a\", \"\\ra\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH, \"ba\", \"bbb\\r\\nba\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 0 | F_NOMATCH | F_PROPERTY, \"\\\\p{Any}{4}|a\", \"\\r\\na\" },\n\t{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, \".\", \"\\r\\n\" },\n\t{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, \"ab.\", \"ab\" },\n\t{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, \"^[a-d0-9]\", \"\\nxx\\nd\" },\n\t{ PCRE_NEWLINE_ANY | PCRE_FIRSTLINE | PCRE_DOTALL, 0, \"....a\", \"012\\n0a\" },\n\t{ MUA | PCRE_FIRSTLINE, 0, \"[aC]\", \"a\" },\n\n\t/* Recurse. */\n\t{ MUA, 0, \"(a)(?1)\", \"aa\" },\n\t{ MUA, 0, \"((a))(?1)\", \"aa\" },\n\t{ MUA, 0, \"(b|a)(?1)\", \"aa\" },\n\t{ MUA, 0, \"(b|(a))(?1)\", \"aa\" },\n\t{ MUA, 0 | F_NOMATCH, \"((a)(b)(?:a*))(?1)\", \"aba\" },\n\t{ MUA, 0, \"((a)(b)(?:a*))(?1)\", \"abab\" },\n\t{ MUA, 0, \"((a+)c(?2))b(?1)\", \"aacaabaca\" },\n\t{ MUA, 0, \"((?2)b|(a)){2}(?1)\", \"aabab\" },\n\t{ MUA, 0, \"(?1)(a)*+(?2)(b(?1))\", \"aababa\" },\n\t{ MUA, 0, \"(?1)(((a(*ACCEPT)))b)\", \"axaa\" },\n\t{ MUA, 0, \"(?1)(?(DEFINE) (((ac(*ACCEPT)))b) )\", \"akaac\" },\n\t{ MUA, 0, \"(a+)b(?1)b\\\\1\", \"abaaabaaaaa\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?(DEFINE)(aa|a))(?1)ab\", \"aab\" },\n\t{ MUA, 0, \"(?(DEFINE)(a\\\\Kb))(?1)+ababc\", \"abababxabababc\" },\n\t{ MUA, 0, \"(a\\\\Kb)(?1)+ababc\", \"abababxababababc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(a\\\\Kb)(?1)+ababc\", \"abababxababababxc\" },\n\t{ MUA, 0, \"b|<(?R)*>\", \"<<b>\" },\n\t{ MUA, 0, \"(a\\\\K){0}(?:(?1)b|ac)\", \"ac\" },\n\t{ MUA, 0, \"(?(DEFINE)(a(?2)|b)(b(?1)|(a)))(?:(?1)|(?2))m\", \"ababababnababababaam\" },\n\t{ MUA, 0, \"(a)((?(R)a|b))(?2)\", \"aabbabaa\" },\n\t{ MUA, 0, \"(a)((?(R2)a|b))(?2)\", \"aabbabaa\" },\n\t{ MUA, 0, \"(a)((?(R1)a|b))(?2)\", \"ababba\" },\n\t{ MUA, 0, \"(?(R0)aa|bb(?R))\", \"abba aabb bbaa\" },\n\t{ MUA, 0, \"((?(R)(?:aaaa|a)|(?:(aaaa)|(a)))+)(?1)$\", \"aaaaaaaaaa aaaa\" },\n\t{ MUA, 0, \"(?P<Name>a(?(R&Name)a|b))(?1)\", \"aab abb abaa\" },\n\t{ MUA, 0, \"((?(R)a|(?1)){3})\", \"XaaaaaaaaaX\" },\n\t{ MUA, 0, \"((?:(?(R)a|(?1))){3})\", \"XaaaaaaaaaX\" },\n\t{ MUA, 0, \"((?(R)a|(?1)){1,3})aaaaaa\", \"aaaaaaaaXaaaaaaaaa\" },\n\t{ MUA, 0, \"((?(R)a|(?1)){1,3}?)M\", \"aaaM\" },\n\n\t/* 16 bit specific tests. */\n\t{ CMA, 0 | F_FORCECONV, \"\\xc3\\xa1\", \"\\xc3\\x81\\xc3\\xa1\" },\n\t{ CMA, 0 | F_FORCECONV, \"\\xe1\\xbd\\xb8\", \"\\xe1\\xbf\\xb8\\xe1\\xbd\\xb8\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xc3\\xa1]\", \"\\xc3\\x81\\xc3\\xa1\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xe1\\xbd\\xb8]\", \"\\xe1\\xbf\\xb8\\xe1\\xbd\\xb8\" },\n\t{ CMA, 0 | F_FORCECONV, \"[a-\\xed\\xb0\\x80]\", \"A\" },\n\t{ CMA, 0 | F_NO8 | F_FORCECONV, \"[a-\\\\x{dc00}]\", \"B\" },\n\t{ CMA, 0 | F_NO8 | F_NOMATCH | F_FORCECONV, \"[b-\\\\x{dc00}]\", \"a\" },\n\t{ CMA, 0 | F_NO8 | F_FORCECONV, \"\\xed\\xa0\\x80\\\\x{d800}\\xed\\xb0\\x80\\\\x{dc00}\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xb0\\x80\\xed\\xb0\\x80\" },\n\t{ CMA, 0 | F_NO8 | F_FORCECONV, \"[\\xed\\xa0\\x80\\\\x{d800}]{1,2}?[\\xed\\xb0\\x80\\\\x{dc00}]{1,2}?#\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xb0\\x80\\xed\\xb0\\x80#\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xed\\xa0\\x80\\xed\\xb0\\x80#]{0,3}(?<=\\xed\\xb0\\x80.)\", \"\\xed\\xa0\\x80#\\xed\\xa0\\x80##\\xed\\xb0\\x80\\xed\\xa0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xed\\xa0\\x80-\\xed\\xb3\\xbf]\", \"\\xed\\x9f\\xbf\\xed\\xa0\\x83\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xed\\xa0\\x80-\\xed\\xb3\\xbf]\", \"\\xed\\xb4\\x80\\xed\\xb3\\xb0\" },\n\t{ CMA, 0 | F_NO8 | F_FORCECONV, \"[\\\\x{d800}-\\\\x{dcff}]\", \"\\xed\\x9f\\xbf\\xed\\xa0\\x83\" },\n\t{ CMA, 0 | F_NO8 | F_FORCECONV, \"[\\\\x{d800}-\\\\x{dcff}]\", \"\\xed\\xb4\\x80\\xed\\xb3\\xb0\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xed\\xa0\\x80-\\xef\\xbf\\xbf]+[\\x1-\\xed\\xb0\\x80]+#\", \"\\xed\\xa0\\x85\\xc3\\x81\\xed\\xa0\\x85\\xef\\xbf\\xb0\\xc2\\x85\\xed\\xa9\\x89#\" },\n\t{ CMA, 0 | F_FORCECONV, \"[\\xed\\xa0\\x80][\\xed\\xb0\\x80]{2,}\", \"\\xed\\xa0\\x80\\xed\\xb0\\x80\\xed\\xa0\\x80\\xed\\xb0\\x80\\xed\\xb0\\x80\\xed\\xb0\\x80\" },\n\t{ MA, 0 | F_FORCECONV, \"[^\\xed\\xb0\\x80]{3,}?\", \"##\\xed\\xb0\\x80#\\xed\\xb0\\x80#\\xc3\\x89#\\xed\\xb0\\x80\" },\n\t{ MA, 0 | F_NO8 | F_FORCECONV, \"[^\\\\x{dc00}]{3,}?\", \"##\\xed\\xb0\\x80#\\xed\\xb0\\x80#\\xc3\\x89#\\xed\\xb0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV, \".\\\\B.\", \"\\xed\\xa0\\x80\\xed\\xb0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV, \"\\\\D+(?:\\\\d+|.)\\\\S+(?:\\\\s+|.)\\\\W+(?:\\\\w+|.)\\xed\\xa0\\x80\\xed\\xa0\\x80\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV, \"\\\\d*\\\\s*\\\\w*\\xed\\xa0\\x80\\xed\\xa0\\x80\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV | F_NOMATCH, \"\\\\d*?\\\\D*?\\\\s*?\\\\S*?\\\\w*?\\\\W*?##\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80\\xed\\xa0\\x80#\" },\n\t{ CMA | PCRE_EXTENDED, 0 | F_FORCECONV, \"\\xed\\xa0\\x80 \\xed\\xb0\\x80 !\", \"\\xed\\xa0\\x80\\xed\\xb0\\x80!\" },\n\t{ CMA, 0 | F_FORCECONV, \"\\xed\\xa0\\x80+#[^#]+\\xed\\xa0\\x80\", \"\\xed\\xa0\\x80#a\\xed\\xa0\\x80\" },\n\t{ CMA, 0 | F_FORCECONV, \"(\\xed\\xa0\\x80+)#\\\\1\", \"\\xed\\xa0\\x80\\xed\\xa0\\x80#\\xed\\xa0\\x80\\xed\\xa0\\x80\" },\n\t{ PCRE_MULTILINE | PCRE_NEWLINE_ANY, 0 | F_NO8 | F_FORCECONV, \"^-\", \"a--\\xe2\\x80\\xa8--\" },\n\t{ PCRE_BSR_UNICODE, 0 | F_NO8 | F_FORCECONV, \"\\\\R\", \"ab\\xe2\\x80\\xa8\" },\n\t{ 0, 0 | F_NO8 | F_FORCECONV, \"\\\\v\", \"ab\\xe2\\x80\\xa9\" },\n\t{ 0, 0 | F_NO8 | F_FORCECONV, \"\\\\h\", \"ab\\xe1\\xa0\\x8e\" },\n\t{ 0, 0 | F_NO8 | F_FORCECONV, \"\\\\v+?\\\\V+?#\", \"\\xe2\\x80\\xa9\\xe2\\x80\\xa9\\xef\\xbf\\xbf\\xef\\xbf\\xbf#\" },\n\t{ 0, 0 | F_NO8 | F_FORCECONV, \"\\\\h+?\\\\H+?#\", \"\\xe1\\xa0\\x8e\\xe1\\xa0\\x8e\\xef\\xbf\\xbf\\xef\\xbf\\xbf#\" },\n\n\t/* Partial matching. */\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"ab\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"ab|a\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_HARD, 0, \"ab|a\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"\\\\b#\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"(?<=a)b\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"abc|(?<=xxa)bc\", \"xxab\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"a\\\\B\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_HARD, 0, \"a\\\\b\", \"a\" },\n\n\t/* (*MARK) verb. */\n\t{ MUA, 0, \"a(*MARK:aa)a\", \"ababaa\" },\n\t{ MUA, 0 | F_NOMATCH, \"a(*:aa)a\", \"abab\" },\n\t{ MUA, 0, \"a(*:aa)(b(*:bb)b|bc)\", \"abc\" },\n\t{ MUA, 0 | F_NOMATCH, \"a(*:1)x|b(*:2)y\", \"abc\" },\n\t{ MUA, 0, \"(?>a(*:aa))b|ac\", \"ac\" },\n\t{ MUA, 0, \"(?(DEFINE)(a(*:aa)))(?1)\", \"a\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?(DEFINE)((a)(*:aa)))(?1)b\", \"aa\" },\n\t{ MUA, 0, \"(?(DEFINE)(a(*:aa)))a(?1)b|aac\", \"aac\" },\n\t{ MUA, 0, \"(a(*:aa)){0}(?:b(?1)b|c)+c\", \"babbab cc\" },\n\t{ MUA, 0, \"(a(*:aa)){0}(?:b(?1)b)+\", \"babba\" },\n\t{ MUA, 0 | F_NOMATCH | F_STUDY, \"(a(*:aa)){0}(?:b(?1)b)+\", \"ba\" },\n\t{ MUA, 0, \"(a\\\\K(*:aa)){0}(?:b(?1)b|c)+c\", \"babbab cc\" },\n\t{ MUA, 0, \"(a\\\\K(*:aa)){0}(?:b(?1)b)+\", \"babba\" },\n\t{ MUA, 0 | F_NOMATCH | F_STUDY, \"(a\\\\K(*:aa)){0}(?:b(?1)b)+\", \"ba\" },\n\t{ MUA, 0 | F_NOMATCH | F_STUDY, \"(*:mark)m\", \"a\" },\n\n\t/* (*COMMIT) verb. */\n\t{ MUA, 0 | F_NOMATCH, \"a(*COMMIT)b\", \"ac\" },\n\t{ MUA, 0, \"aa(*COMMIT)b\", \"xaxaab\" },\n\t{ MUA, 0 | F_NOMATCH, \"a(*COMMIT)(*:msg)b|ac\", \"ac\" },\n\t{ MUA, 0 | F_NOMATCH, \"(a(*COMMIT)b)++\", \"abac\" },\n\t{ MUA, 0 | F_NOMATCH, \"((a)(*COMMIT)b)++\", \"abac\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?=a(*COMMIT)b)ab|ad\", \"ad\" },\n\n\t/* (*PRUNE) verb. */\n\t{ MUA, 0, \"aa\\\\K(*PRUNE)b\", \"aaab\" },\n\t{ MUA, 0, \"aa(*PRUNE:bb)b|a\", \"aa\" },\n\t{ MUA, 0, \"(a)(a)(*PRUNE)b|(a)\", \"aa\" },\n\t{ MUA, 0, \"(a)(a)(a)(a)(a)(a)(a)(a)(*PRUNE)b|(a)\", \"aaaaaaaa\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"a(*PRUNE)a|\", \"a\" },\n\t{ MUA | PCRE_PARTIAL_SOFT, 0, \"a(*PRUNE)a|m\", \"a\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?=a(*PRUNE)b)ab|ad\", \"ad\" },\n\t{ MUA, 0, \"a(*COMMIT)(*PRUNE)d|bc\", \"abc\" },\n\t{ MUA, 0, \"(?=a(*COMMIT)b)a(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?=a(*COMMIT)b)a(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0, \"(?=(a)(*COMMIT)b)a(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?=(a)(*COMMIT)b)a(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0, \"(a(*COMMIT)b){0}a(?1)(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(a(*COMMIT)b){0}a(*COMMIT)(?1)(*PRUNE)c|bc\", \"abc\" },\n\t{ MUA, 0, \"(a(*COMMIT)b)++(*PRUNE)d|c\", \"ababc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(a(*COMMIT)b)++(*PRUNE)d|c\", \"ababc\" },\n\t{ MUA, 0, \"((a)(*COMMIT)b)++(*PRUNE)d|c\", \"ababc\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)((a)(*COMMIT)b)++(*PRUNE)d|c\", \"ababc\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)*abab(*PRUNE)d|ba\", \"ababab\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)*abab(*PRUNE)d|ba\", \"ababab\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)+abab(*PRUNE)d|ba\", \"ababab\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)+abab(*PRUNE)d|ba\", \"ababab\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)?ab(*PRUNE)d|ba\", \"aba\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)?ab(*PRUNE)d|ba\", \"aba\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)*?n(*PRUNE)d|ba\", \"abababn\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)*?n(*PRUNE)d|ba\", \"abababn\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)+?n(*PRUNE)d|ba\", \"abababn\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)+?n(*PRUNE)d|ba\", \"abababn\" },\n\t{ MUA, 0, \"(?>a(*COMMIT)b)??n(*PRUNE)d|bn\", \"abn\" },\n\t{ MUA, 0 | F_NOMATCH, \"(*COMMIT)(?>a(*COMMIT)b)??n(*PRUNE)d|bn\", \"abn\" },\n\n\t/* (*SKIP) verb. */\n\t{ MUA, 0 | F_NOMATCH, \"(?=a(*SKIP)b)ab|ad\", \"ad\" },\n\t{ MUA, 0, \"(\\\\w+(*SKIP)#)\", \"abcd,xyz#,\" },\n\t{ MUA, 0, \"\\\\w+(*SKIP)#|mm\", \"abcd,xyz#,\" },\n\t{ MUA, 0 | F_NOMATCH, \"b+(?<=(*SKIP)#c)|b+\", \"#bbb\" },\n\n\t/* (*THEN) verb. */\n\t{ MUA, 0, \"((?:a(*THEN)|aab)(*THEN)c|a+)+m\", \"aabcaabcaabcaabcnacm\" },\n\t{ MUA, 0 | F_NOMATCH, \"((?:a(*THEN)|aab)(*THEN)c|a+)+m\", \"aabcm\" },\n\t{ MUA, 0, \"((?:a(*THEN)|aab)c|a+)+m\", \"aabcaabcnmaabcaabcm\" },\n\t{ MUA, 0, \"((?:a|aab)(*THEN)c|a+)+m\", \"aam\" },\n\t{ MUA, 0, \"((?:a(*COMMIT)|aab)(*THEN)c|a+)+m\", \"aam\" },\n\t{ MUA, 0, \"(?(?=a(*THEN)b)ab|ad)\", \"ad\" },\n\t{ MUA, 0, \"(?(?!a(*THEN)b)ad|add)\", \"add\" },\n\t{ MUA, 0 | F_NOMATCH, \"(?(?=a)a(*THEN)b|ad)\", \"ad\" },\n\t{ MUA, 0, \"(?!(?(?=a)ab|b(*THEN)d))bn|bnn\", \"bnn\" },\n\n\t/* Deep recursion. */\n\t{ MUA, 0, \"((((?:(?:(?:\\\\w)+)?)*|(?>\\\\w)+?)+|(?>\\\\w)?\\?)*)?\\\\s\", \"aaaaa+ \" },\n\t{ MUA, 0, \"(?:((?:(?:(?:\\\\w*?)+)??|(?>\\\\w)?|\\\\w*+)*)+)+?\\\\s\", \"aa+ \" },\n\t{ MUA, 0, \"((a?)+)+b\", \"aaaaaaaaaaaa b\" },\n\n\t/* Deep recursion: Stack limit reached. */\n\t{ MA, 0 | F_NOMATCH, \"a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaa\", \"aaaaaaaaaaaaaaaaaaaaaaa\" },\n\t{ MA, 0 | F_NOMATCH, \"(?:a+)+b\", \"aaaaaaaaaaaaaaaaaaaaaaaa b\" },\n\t{ MA, 0 | F_NOMATCH, \"(?:a+?)+?b\", \"aaaaaaaaaaaaaaaaaaaaaaaa b\" },\n\t{ MA, 0 | F_NOMATCH, \"(?:a*)*b\", \"aaaaaaaaaaaaaaaaaaaaaaaa b\" },\n\t{ MA, 0 | F_NOMATCH, \"(?:a*?)*?b\", \"aaaaaaaaaaaaaaaaaaaaaaaa b\" },\n\n\t{ 0, 0, NULL, NULL }\n};\n\nstatic const unsigned char *tables(int mode)\n{\n\t/* The purpose of this function to allow valgrind\n\tfor reporting invalid reads and writes. */\n\tstatic unsigned char *tables_copy;\n\tconst char *errorptr;\n\tint erroroffset;\n\tunsigned char *default_tables;\n#if defined SUPPORT_PCRE8\n\tpcre *regex;\n\tchar null_str[1] = { 0 };\n#elif defined SUPPORT_PCRE16\n\tpcre16 *regex;\n\tPCRE_UCHAR16 null_str[1] = { 0 };\n#elif defined SUPPORT_PCRE32\n\tpcre32 *regex;\n\tPCRE_UCHAR32 null_str[1] = { 0 };\n#endif\n\n\tif (mode) {\n\t\tif (tables_copy)\n\t\t\tfree(tables_copy);\n\t\ttables_copy = NULL;\n\t\treturn NULL;\n\t}\n\n\tif (tables_copy)\n\t\treturn tables_copy;\n\n\tdefault_tables = NULL;\n#if defined SUPPORT_PCRE8\n\tregex = pcre_compile(null_str, 0, &errorptr, &erroroffset, NULL);\n\tif (regex) {\n\t\tpcre_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);\n\t\tpcre_free(regex);\n\t}\n#elif defined SUPPORT_PCRE16\n\tregex = pcre16_compile(null_str, 0, &errorptr, &erroroffset, NULL);\n\tif (regex) {\n\t\tpcre16_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);\n\t\tpcre16_free(regex);\n\t}\n#elif defined SUPPORT_PCRE32\n\tregex = pcre32_compile(null_str, 0, &errorptr, &erroroffset, NULL);\n\tif (regex) {\n\t\tpcre32_fullinfo(regex, NULL, PCRE_INFO_DEFAULT_TABLES, &default_tables);\n\t\tpcre32_free(regex);\n\t}\n#endif\n\t/* Shouldn't ever happen. */\n\tif (!default_tables)\n\t\treturn NULL;\n\n\t/* Unfortunately this value cannot get from pcre_fullinfo.\n\tSince this is a test program, this is acceptable at the moment. */\n\ttables_copy = (unsigned char *)malloc(1088);\n\tif (!tables_copy)\n\t\treturn NULL;\n\n\tmemcpy(tables_copy, default_tables, 1088);\n\treturn tables_copy;\n}\n\n#ifdef SUPPORT_PCRE8\nstatic pcre_jit_stack* callback8(void *arg)\n{\n\treturn (pcre_jit_stack *)arg;\n}\n#endif\n\n#ifdef SUPPORT_PCRE16\nstatic pcre16_jit_stack* callback16(void *arg)\n{\n\treturn (pcre16_jit_stack *)arg;\n}\n#endif\n\n#ifdef SUPPORT_PCRE32\nstatic pcre32_jit_stack* callback32(void *arg)\n{\n\treturn (pcre32_jit_stack *)arg;\n}\n#endif\n\n#ifdef SUPPORT_PCRE8\nstatic pcre_jit_stack *stack8;\n\nstatic pcre_jit_stack *getstack8(void)\n{\n\tif (!stack8)\n\t\tstack8 = pcre_jit_stack_alloc(1, 1024 * 1024);\n\treturn stack8;\n}\n\nstatic void setstack8(pcre_extra *extra)\n{\n\tif (!extra) {\n\t\tif (stack8)\n\t\t\tpcre_jit_stack_free(stack8);\n\t\tstack8 = NULL;\n\t\treturn;\n\t}\n\n\tpcre_assign_jit_stack(extra, callback8, getstack8());\n}\n#endif /* SUPPORT_PCRE8 */\n\n#ifdef SUPPORT_PCRE16\nstatic pcre16_jit_stack *stack16;\n\nstatic pcre16_jit_stack *getstack16(void)\n{\n\tif (!stack16)\n\t\tstack16 = pcre16_jit_stack_alloc(1, 1024 * 1024);\n\treturn stack16;\n}\n\nstatic void setstack16(pcre16_extra *extra)\n{\n\tif (!extra) {\n\t\tif (stack16)\n\t\t\tpcre16_jit_stack_free(stack16);\n\t\tstack16 = NULL;\n\t\treturn;\n\t}\n\n\tpcre16_assign_jit_stack(extra, callback16, getstack16());\n}\n#endif /* SUPPORT_PCRE16 */\n\n#ifdef SUPPORT_PCRE32\nstatic pcre32_jit_stack *stack32;\n\nstatic pcre32_jit_stack *getstack32(void)\n{\n\tif (!stack32)\n\t\tstack32 = pcre32_jit_stack_alloc(1, 1024 * 1024);\n\treturn stack32;\n}\n\nstatic void setstack32(pcre32_extra *extra)\n{\n\tif (!extra) {\n\t\tif (stack32)\n\t\t\tpcre32_jit_stack_free(stack32);\n\t\tstack32 = NULL;\n\t\treturn;\n\t}\n\n\tpcre32_assign_jit_stack(extra, callback32, getstack32());\n}\n#endif /* SUPPORT_PCRE32 */\n\n#ifdef SUPPORT_PCRE16\n\nstatic int convert_utf8_to_utf16(const char *input, PCRE_UCHAR16 *output, int *offsetmap, int max_length)\n{\n\tunsigned char *iptr = (unsigned char*)input;\n\tPCRE_UCHAR16 *optr = output;\n\tunsigned int c;\n\n\tif (max_length == 0)\n\t\treturn 0;\n\n\twhile (*iptr && max_length > 1) {\n\t\tc = 0;\n\t\tif (offsetmap)\n\t\t\t*offsetmap++ = (int)(iptr - (unsigned char*)input);\n\n\t\tif (*iptr < 0xc0)\n\t\t\tc = *iptr++;\n\t\telse if (!(*iptr & 0x20)) {\n\t\t\tc = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);\n\t\t\tiptr += 2;\n\t\t} else if (!(*iptr & 0x10)) {\n\t\t\tc = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);\n\t\t\tiptr += 3;\n\t\t} else if (!(*iptr & 0x08)) {\n\t\t\tc = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);\n\t\t\tiptr += 4;\n\t\t}\n\n\t\tif (c < 65536) {\n\t\t\t*optr++ = c;\n\t\t\tmax_length--;\n\t\t} else if (max_length <= 2) {\n\t\t\t*optr = '\\0';\n\t\t\treturn (int)(optr - output);\n\t\t} else {\n\t\t\tc -= 0x10000;\n\t\t\t*optr++ = 0xd800 | ((c >> 10) & 0x3ff);\n\t\t\t*optr++ = 0xdc00 | (c & 0x3ff);\n\t\t\tmax_length -= 2;\n\t\t\tif (offsetmap)\n\t\t\t\toffsetmap++;\n\t\t}\n\t}\n\tif (offsetmap)\n\t\t*offsetmap = (int)(iptr - (unsigned char*)input);\n\t*optr = '\\0';\n\treturn (int)(optr - output);\n}\n\nstatic int copy_char8_to_char16(const char *input, PCRE_UCHAR16 *output, int max_length)\n{\n\tunsigned char *iptr = (unsigned char*)input;\n\tPCRE_UCHAR16 *optr = output;\n\n\tif (max_length == 0)\n\t\treturn 0;\n\n\twhile (*iptr && max_length > 1) {\n\t\t*optr++ = *iptr++;\n\t\tmax_length--;\n\t}\n\t*optr = '\\0';\n\treturn (int)(optr - output);\n}\n\n#define REGTEST_MAX_LENGTH16 4096\nstatic PCRE_UCHAR16 regtest_buf16[REGTEST_MAX_LENGTH16];\nstatic int regtest_offsetmap16[REGTEST_MAX_LENGTH16];\n\n#endif /* SUPPORT_PCRE16 */\n\n#ifdef SUPPORT_PCRE32\n\nstatic int convert_utf8_to_utf32(const char *input, PCRE_UCHAR32 *output, int *offsetmap, int max_length)\n{\n\tunsigned char *iptr = (unsigned char*)input;\n\tPCRE_UCHAR32 *optr = output;\n\tunsigned int c;\n\n\tif (max_length == 0)\n\t\treturn 0;\n\n\twhile (*iptr && max_length > 1) {\n\t\tc = 0;\n\t\tif (offsetmap)\n\t\t\t*offsetmap++ = (int)(iptr - (unsigned char*)input);\n\n\t\tif (*iptr < 0xc0)\n\t\t\tc = *iptr++;\n\t\telse if (!(*iptr & 0x20)) {\n\t\t\tc = ((iptr[0] & 0x1f) << 6) | (iptr[1] & 0x3f);\n\t\t\tiptr += 2;\n\t\t} else if (!(*iptr & 0x10)) {\n\t\t\tc = ((iptr[0] & 0x0f) << 12) | ((iptr[1] & 0x3f) << 6) | (iptr[2] & 0x3f);\n\t\t\tiptr += 3;\n\t\t} else if (!(*iptr & 0x08)) {\n\t\t\tc = ((iptr[0] & 0x07) << 18) | ((iptr[1] & 0x3f) << 12) | ((iptr[2] & 0x3f) << 6) | (iptr[3] & 0x3f);\n\t\t\tiptr += 4;\n\t\t}\n\n\t\t*optr++ = c;\n\t\tmax_length--;\n\t}\n\tif (offsetmap)\n\t\t*offsetmap = (int)(iptr - (unsigned char*)input);\n\t*optr = 0;\n\treturn (int)(optr - output);\n}\n\nstatic int copy_char8_to_char32(const char *input, PCRE_UCHAR32 *output, int max_length)\n{\n\tunsigned char *iptr = (unsigned char*)input;\n\tPCRE_UCHAR32 *optr = output;\n\n\tif (max_length == 0)\n\t\treturn 0;\n\n\twhile (*iptr && max_length > 1) {\n\t\t*optr++ = *iptr++;\n\t\tmax_length--;\n\t}\n\t*optr = '\\0';\n\treturn (int)(optr - output);\n}\n\n#define REGTEST_MAX_LENGTH32 4096\nstatic PCRE_UCHAR32 regtest_buf32[REGTEST_MAX_LENGTH32];\nstatic int regtest_offsetmap32[REGTEST_MAX_LENGTH32];\n\n#endif /* SUPPORT_PCRE32 */\n\nstatic int check_ascii(const char *input)\n{\n\tconst unsigned char *ptr = (unsigned char *)input;\n\twhile (*ptr) {\n\t\tif (*ptr > 127)\n\t\t\treturn 0;\n\t\tptr++;\n\t}\n\treturn 1;\n}\n\nstatic int regression_tests(void)\n{\n\tstruct regression_test_case *current = regression_test_cases;\n\tconst char *error;\n\tchar *cpu_info;\n\tint i, err_offs;\n\tint is_successful, is_ascii;\n\tint total = 0;\n\tint successful = 0;\n\tint successful_row = 0;\n\tint counter = 0;\n\tint study_mode;\n\tint utf = 0, ucp = 0;\n\tint disabled_flags = 0;\n#ifdef SUPPORT_PCRE8\n\tpcre *re8;\n\tpcre_extra *extra8;\n\tpcre_extra dummy_extra8;\n\tint ovector8_1[32];\n\tint ovector8_2[32];\n\tint return_value8[2];\n\tunsigned char *mark8_1, *mark8_2;\n#endif\n#ifdef SUPPORT_PCRE16\n\tpcre16 *re16;\n\tpcre16_extra *extra16;\n\tpcre16_extra dummy_extra16;\n\tint ovector16_1[32];\n\tint ovector16_2[32];\n\tint return_value16[2];\n\tPCRE_UCHAR16 *mark16_1, *mark16_2;\n\tint length16;\n#endif\n#ifdef SUPPORT_PCRE32\n\tpcre32 *re32;\n\tpcre32_extra *extra32;\n\tpcre32_extra dummy_extra32;\n\tint ovector32_1[32];\n\tint ovector32_2[32];\n\tint return_value32[2];\n\tPCRE_UCHAR32 *mark32_1, *mark32_2;\n\tint length32;\n#endif\n\n\t/* This test compares the behaviour of interpreter and JIT. Although disabling\n\tutf or ucp may make tests fail, if the pcre_exec result is the SAME, it is\n\tstill considered successful from pcre_jit_test point of view. */\n\n#if defined SUPPORT_PCRE8\n\tpcre_config(PCRE_CONFIG_JITTARGET, &cpu_info);\n#elif defined SUPPORT_PCRE16\n\tpcre16_config(PCRE_CONFIG_JITTARGET, &cpu_info);\n#elif defined SUPPORT_PCRE32\n\tpcre32_config(PCRE_CONFIG_JITTARGET, &cpu_info);\n#endif\n\n\tprintf(\"Running JIT regression tests\\n\");\n\tprintf(\"  target CPU of SLJIT compiler: %s\\n\", cpu_info);\n\n#if defined SUPPORT_PCRE8\n\tpcre_config(PCRE_CONFIG_UTF8, &utf);\n\tpcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);\n#elif defined SUPPORT_PCRE16\n\tpcre16_config(PCRE_CONFIG_UTF16, &utf);\n\tpcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);\n#elif defined SUPPORT_PCRE32\n\tpcre32_config(PCRE_CONFIG_UTF32, &utf);\n\tpcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);\n#endif\n\n\tif (!utf)\n\t\tdisabled_flags |= PCRE_UTF8 | PCRE_UTF16 | PCRE_UTF32;\n\tif (!ucp)\n\t\tdisabled_flags |= PCRE_UCP;\n#ifdef SUPPORT_PCRE8\n\tprintf(\"  in  8 bit mode with UTF-8  %s and ucp %s:\\n\", utf ? \"enabled\" : \"disabled\", ucp ? \"enabled\" : \"disabled\");\n#endif\n#ifdef SUPPORT_PCRE16\n\tprintf(\"  in 16 bit mode with UTF-16 %s and ucp %s:\\n\", utf ? \"enabled\" : \"disabled\", ucp ? \"enabled\" : \"disabled\");\n#endif\n#ifdef SUPPORT_PCRE32\n\tprintf(\"  in 32 bit mode with UTF-32 %s and ucp %s:\\n\", utf ? \"enabled\" : \"disabled\", ucp ? \"enabled\" : \"disabled\");\n#endif\n\n\twhile (current->pattern) {\n\t\t/* printf(\"\\nPattern: %s :\\n\", current->pattern); */\n\t\ttotal++;\n\t\tis_ascii = 0;\n\t\tif (!(current->start_offset & F_PROPERTY))\n\t\t\tis_ascii = check_ascii(current->pattern) && check_ascii(current->input);\n\n\t\tif (current->flags & PCRE_PARTIAL_SOFT)\n\t\t\tstudy_mode = PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE;\n\t\telse if (current->flags & PCRE_PARTIAL_HARD)\n\t\t\tstudy_mode = PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE;\n\t\telse\n\t\t\tstudy_mode = PCRE_STUDY_JIT_COMPILE;\n\t\terror = NULL;\n#ifdef SUPPORT_PCRE8\n\t\tre8 = NULL;\n\t\tif (!(current->start_offset & F_NO8))\n\t\t\tre8 = pcre_compile(current->pattern,\n\t\t\t\tcurrent->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),\n\t\t\t\t&error, &err_offs, tables(0));\n\n\t\textra8 = NULL;\n\t\tif (re8) {\n\t\t\terror = NULL;\n\t\t\textra8 = pcre_study(re8, study_mode, &error);\n\t\t\tif (!extra8) {\n\t\t\t\tprintf(\"\\n8 bit: Cannot study pattern: %s\\n\", current->pattern);\n\t\t\t\tpcre_free(re8);\n\t\t\t\tre8 = NULL;\n\t\t\t}\n\t\t\telse if (!(extra8->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {\n\t\t\t\tprintf(\"\\n8 bit: JIT compiler does not support: %s\\n\", current->pattern);\n\t\t\t\tpcre_free_study(extra8);\n\t\t\t\tpcre_free(re8);\n\t\t\t\tre8 = NULL;\n\t\t\t}\n\t\t\textra8->flags |= PCRE_EXTRA_MARK;\n\t\t} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO8))\n\t\t\tprintf(\"\\n8 bit: Cannot compile pattern \\\"%s\\\": %s\\n\", current->pattern, error);\n#endif\n#ifdef SUPPORT_PCRE16\n\t\tif ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))\n\t\t\tconvert_utf8_to_utf16(current->pattern, regtest_buf16, NULL, REGTEST_MAX_LENGTH16);\n\t\telse\n\t\t\tcopy_char8_to_char16(current->pattern, regtest_buf16, REGTEST_MAX_LENGTH16);\n\n\t\tre16 = NULL;\n\t\tif (!(current->start_offset & F_NO16))\n\t\t\tre16 = pcre16_compile(regtest_buf16,\n\t\t\t\tcurrent->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),\n\t\t\t\t&error, &err_offs, tables(0));\n\n\t\textra16 = NULL;\n\t\tif (re16) {\n\t\t\terror = NULL;\n\t\t\textra16 = pcre16_study(re16, study_mode, &error);\n\t\t\tif (!extra16) {\n\t\t\t\tprintf(\"\\n16 bit: Cannot study pattern: %s\\n\", current->pattern);\n\t\t\t\tpcre16_free(re16);\n\t\t\t\tre16 = NULL;\n\t\t\t}\n\t\t\telse if (!(extra16->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {\n\t\t\t\tprintf(\"\\n16 bit: JIT compiler does not support: %s\\n\", current->pattern);\n\t\t\t\tpcre16_free_study(extra16);\n\t\t\t\tpcre16_free(re16);\n\t\t\t\tre16 = NULL;\n\t\t\t}\n\t\t\textra16->flags |= PCRE_EXTRA_MARK;\n\t\t} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO16))\n\t\t\tprintf(\"\\n16 bit: Cannot compile pattern \\\"%s\\\": %s\\n\", current->pattern, error);\n#endif\n#ifdef SUPPORT_PCRE32\n\t\tif ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))\n\t\t\tconvert_utf8_to_utf32(current->pattern, regtest_buf32, NULL, REGTEST_MAX_LENGTH32);\n\t\telse\n\t\t\tcopy_char8_to_char32(current->pattern, regtest_buf32, REGTEST_MAX_LENGTH32);\n\n\t\tre32 = NULL;\n\t\tif (!(current->start_offset & F_NO32))\n\t\t\tre32 = pcre32_compile(regtest_buf32,\n\t\t\t\tcurrent->flags & ~(PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | disabled_flags),\n\t\t\t\t&error, &err_offs, tables(0));\n\n\t\textra32 = NULL;\n\t\tif (re32) {\n\t\t\terror = NULL;\n\t\t\textra32 = pcre32_study(re32, study_mode, &error);\n\t\t\tif (!extra32) {\n\t\t\t\tprintf(\"\\n32 bit: Cannot study pattern: %s\\n\", current->pattern);\n\t\t\t\tpcre32_free(re32);\n\t\t\t\tre32 = NULL;\n\t\t\t}\n\t\t\tif (!(extra32->flags & PCRE_EXTRA_EXECUTABLE_JIT)) {\n\t\t\t\tprintf(\"\\n32 bit: JIT compiler does not support: %s\\n\", current->pattern);\n\t\t\t\tpcre32_free_study(extra32);\n\t\t\t\tpcre32_free(re32);\n\t\t\t\tre32 = NULL;\n\t\t\t}\n\t\t\textra32->flags |= PCRE_EXTRA_MARK;\n\t\t} else if (((utf && ucp) || is_ascii) && !(current->start_offset & F_NO32))\n\t\t\tprintf(\"\\n32 bit: Cannot compile pattern \\\"%s\\\": %s\\n\", current->pattern, error);\n#endif\n\n\t\tcounter++;\n\t\tif ((counter & 0x3) != 0) {\n#ifdef SUPPORT_PCRE8\n\t\t\tsetstack8(NULL);\n#endif\n#ifdef SUPPORT_PCRE16\n\t\t\tsetstack16(NULL);\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\tsetstack32(NULL);\n#endif\n\t\t}\n\n#ifdef SUPPORT_PCRE8\n\t\treturn_value8[0] = -1000;\n\t\treturn_value8[1] = -1000;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector8_1[i] = -2;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector8_2[i] = -2;\n\t\tif (re8) {\n\t\t\tmark8_1 = NULL;\n\t\t\tmark8_2 = NULL;\n\t\t\textra8->mark = &mark8_1;\n\n\t\t\tif ((counter & 0x1) != 0) {\n\t\t\t\tsetstack8(extra8);\n\t\t\t\treturn_value8[0] = pcre_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32);\n\t\t\t} else\n\t\t\t\treturn_value8[0] = pcre_jit_exec(re8, extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_1, 32, getstack8());\n\t\t\tmemset(&dummy_extra8, 0, sizeof(pcre_extra));\n\t\t\tdummy_extra8.flags = PCRE_EXTRA_MARK;\n\t\t\tif (current->start_offset & F_STUDY) {\n\t\t\t\tdummy_extra8.flags |= PCRE_EXTRA_STUDY_DATA;\n\t\t\t\tdummy_extra8.study_data = extra8->study_data;\n\t\t\t}\n\t\t\tdummy_extra8.mark = &mark8_2;\n\t\t\treturn_value8[1] = pcre_exec(re8, &dummy_extra8, current->input, strlen(current->input), current->start_offset & OFFSET_MASK,\n\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector8_2, 32);\n\t\t}\n#endif\n\n#ifdef SUPPORT_PCRE16\n\t\treturn_value16[0] = -1000;\n\t\treturn_value16[1] = -1000;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector16_1[i] = -2;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector16_2[i] = -2;\n\t\tif (re16) {\n\t\t\tmark16_1 = NULL;\n\t\t\tmark16_2 = NULL;\n\t\t\tif ((current->flags & PCRE_UTF16) || (current->start_offset & F_FORCECONV))\n\t\t\t\tlength16 = convert_utf8_to_utf16(current->input, regtest_buf16, regtest_offsetmap16, REGTEST_MAX_LENGTH16);\n\t\t\telse\n\t\t\t\tlength16 = copy_char8_to_char16(current->input, regtest_buf16, REGTEST_MAX_LENGTH16);\n\t\t\textra16->mark = &mark16_1;\n\t\t\tif ((counter & 0x1) != 0) {\n\t\t\t\tsetstack16(extra16);\n\t\t\t\treturn_value16[0] = pcre16_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32);\n\t\t\t} else\n\t\t\t\treturn_value16[0] = pcre16_jit_exec(re16, extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_1, 32, getstack16());\n\t\t\tmemset(&dummy_extra16, 0, sizeof(pcre16_extra));\n\t\t\tdummy_extra16.flags = PCRE_EXTRA_MARK;\n\t\t\tif (current->start_offset & F_STUDY) {\n\t\t\t\tdummy_extra16.flags |= PCRE_EXTRA_STUDY_DATA;\n\t\t\t\tdummy_extra16.study_data = extra16->study_data;\n\t\t\t}\n\t\t\tdummy_extra16.mark = &mark16_2;\n\t\t\treturn_value16[1] = pcre16_exec(re16, &dummy_extra16, regtest_buf16, length16, current->start_offset & OFFSET_MASK,\n\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector16_2, 32);\n\t\t}\n#endif\n\n#ifdef SUPPORT_PCRE32\n\t\treturn_value32[0] = -1000;\n\t\treturn_value32[1] = -1000;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector32_1[i] = -2;\n\t\tfor (i = 0; i < 32; ++i)\n\t\t\tovector32_2[i] = -2;\n\t\tif (re32) {\n\t\t\tmark32_1 = NULL;\n\t\t\tmark32_2 = NULL;\n\t\t\tif ((current->flags & PCRE_UTF32) || (current->start_offset & F_FORCECONV))\n\t\t\t\tlength32 = convert_utf8_to_utf32(current->input, regtest_buf32, regtest_offsetmap32, REGTEST_MAX_LENGTH32);\n\t\t\telse\n\t\t\t\tlength32 = copy_char8_to_char32(current->input, regtest_buf32, REGTEST_MAX_LENGTH32);\n\t\t\textra32->mark = &mark32_1;\n\t\t\tif ((counter & 0x1) != 0) {\n\t\t\t\tsetstack32(extra32);\n\t\t\t\treturn_value32[0] = pcre32_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32);\n\t\t\t} else\n\t\t\t\treturn_value32[0] = pcre32_jit_exec(re32, extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,\n\t\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_1, 32, getstack32());\n\t\t\tmemset(&dummy_extra32, 0, sizeof(pcre32_extra));\n\t\t\tdummy_extra32.flags = PCRE_EXTRA_MARK;\n\t\t\tif (current->start_offset & F_STUDY) {\n\t\t\t\tdummy_extra32.flags |= PCRE_EXTRA_STUDY_DATA;\n\t\t\t\tdummy_extra32.study_data = extra32->study_data;\n\t\t\t}\n\t\t\tdummy_extra32.mark = &mark32_2;\n\t\t\treturn_value32[1] = pcre32_exec(re32, &dummy_extra32, regtest_buf32, length32, current->start_offset & OFFSET_MASK,\n\t\t\t\tcurrent->flags & (PCRE_NOTBOL | PCRE_NOTEOL | PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD | PCRE_NO_UTF8_CHECK), ovector32_2, 32);\n\t\t}\n#endif\n\n\t\t/* printf(\"[%d-%d-%d|%d-%d|%d-%d|%d-%d]%s\",\n\t\t\treturn_value8[0], return_value16[0], return_value32[0],\n\t\t\tovector8_1[0], ovector8_1[1],\n\t\t\tovector16_1[0], ovector16_1[1],\n\t\t\tovector32_1[0], ovector32_1[1],\n\t\t\t(current->flags & PCRE_CASELESS) ? \"C\" : \"\"); */\n\n\t\t/* If F_DIFF is set, just run the test, but do not compare the results.\n\t\tSegfaults can still be captured. */\n\n\t\tis_successful = 1;\n\t\tif (!(current->start_offset & F_DIFF)) {\n#if defined SUPPORT_UTF && ((defined(SUPPORT_PCRE8) + defined(SUPPORT_PCRE16) + defined(SUPPORT_PCRE32)) >= 2)\n\t\t\tif (!(current->start_offset & F_FORCECONV)) {\n\t\t\t\tint return_value;\n\n\t\t\t\t/* All results must be the same. */\n#ifdef SUPPORT_PCRE8\n\t\t\t\tif ((return_value = return_value8[0]) != return_value8[1]) {\n\t\t\t\t\tprintf(\"\\n8 bit: Return value differs(J8:%d,I8:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value8[0], return_value8[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n#ifdef SUPPORT_PCRE16\n\t\t\t\tif ((return_value = return_value16[0]) != return_value16[1]) {\n\t\t\t\t\tprintf(\"\\n16 bit: Return value differs(J16:%d,I16:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value16[0], return_value16[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\t\tif ((return_value = return_value32[0]) != return_value32[1]) {\n\t\t\t\t\tprintf(\"\\n32 bit: Return value differs(J32:%d,I32:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value32[0], return_value32[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16\n\t\t\t\tif (return_value8[0] != return_value16[0]) {\n\t\t\t\t\tprintf(\"\\n8 and 16 bit: Return value differs(J8:%d,J16:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value8[0], return_value16[0],\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32\n\t\t\t\tif (return_value8[0] != return_value32[0]) {\n\t\t\t\t\tprintf(\"\\n8 and 32 bit: Return value differs(J8:%d,J32:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value8[0], return_value32[0],\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32\n\t\t\t\tif (return_value16[0] != return_value32[0]) {\n\t\t\t\t\tprintf(\"\\n16 and 32 bit: Return value differs(J16:%d,J32:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value16[0], return_value32[0],\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else\n#endif\n\t\t\t\tif (return_value >= 0 || return_value == PCRE_ERROR_PARTIAL) {\n\t\t\t\t\tif (return_value == PCRE_ERROR_PARTIAL) {\n\t\t\t\t\t\treturn_value = 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn_value *= 2;\n\t\t\t\t\t}\n#ifdef SUPPORT_PCRE8\n\t\t\t\t\treturn_value8[0] = return_value;\n#endif\n#ifdef SUPPORT_PCRE16\n\t\t\t\t\treturn_value16[0] = return_value;\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\t\t\treturn_value32[0] = return_value;\n#endif\n\t\t\t\t\t/* Transform back the results. */\n\t\t\t\t\tif (current->flags & PCRE_UTF8) {\n#ifdef SUPPORT_PCRE16\n\t\t\t\t\t\tfor (i = 0; i < return_value; ++i) {\n\t\t\t\t\t\t\tif (ovector16_1[i] >= 0)\n\t\t\t\t\t\t\t\tovector16_1[i] = regtest_offsetmap16[ovector16_1[i]];\n\t\t\t\t\t\t\tif (ovector16_2[i] >= 0)\n\t\t\t\t\t\t\t\tovector16_2[i] = regtest_offsetmap16[ovector16_2[i]];\n\t\t\t\t\t\t}\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\t\t\t\tfor (i = 0; i < return_value; ++i) {\n\t\t\t\t\t\t\tif (ovector32_1[i] >= 0)\n\t\t\t\t\t\t\t\tovector32_1[i] = regtest_offsetmap32[ovector32_1[i]];\n\t\t\t\t\t\t\tif (ovector32_2[i] >= 0)\n\t\t\t\t\t\t\t\tovector32_2[i] = regtest_offsetmap32[ovector32_2[i]];\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < return_value; ++i) {\n#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE16\n\t\t\t\t\t\tif (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector16_1[i] || ovector8_1[i] != ovector16_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n8 and 16 bit: Ovector[%d] value differs(J8:%d,I8:%d,J16:%d,I16:%d): [%d] '%s' @ '%s' \\n\",\n\t\t\t\t\t\t\t\ti, ovector8_1[i], ovector8_2[i], ovector16_1[i], ovector16_2[i],\n\t\t\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n#endif\n#if defined SUPPORT_PCRE8 && defined SUPPORT_PCRE32\n\t\t\t\t\t\tif (ovector8_1[i] != ovector8_2[i] || ovector8_1[i] != ovector32_1[i] || ovector8_1[i] != ovector32_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n8 and 32 bit: Ovector[%d] value differs(J8:%d,I8:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \\n\",\n\t\t\t\t\t\t\t\ti, ovector8_1[i], ovector8_2[i], ovector32_1[i], ovector32_2[i],\n\t\t\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n#endif\n#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32\n\t\t\t\t\t\tif (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector32_1[i] || ovector16_1[i] != ovector32_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n16 and 32 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \\n\",\n\t\t\t\t\t\t\t\ti, ovector16_1[i], ovector16_2[i], ovector32_1[i], ovector32_2[i],\n\t\t\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else\n#endif /* more than one of SUPPORT_PCRE8, SUPPORT_PCRE16 and SUPPORT_PCRE32 */\n\t\t\t{\n\t\t\t\t/* Only the 8 bit and 16 bit results must be equal. */\n#ifdef SUPPORT_PCRE8\n\t\t\t\tif (return_value8[0] != return_value8[1]) {\n\t\t\t\t\tprintf(\"\\n8 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value8[0], return_value8[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else if (return_value8[0] >= 0 || return_value8[0] == PCRE_ERROR_PARTIAL) {\n\t\t\t\t\tif (return_value8[0] == PCRE_ERROR_PARTIAL)\n\t\t\t\t\t\treturn_value8[0] = 2;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn_value8[0] *= 2;\n\n\t\t\t\t\tfor (i = 0; i < return_value8[0]; ++i)\n\t\t\t\t\t\tif (ovector8_1[i] != ovector8_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n8 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\t\t\ti, ovector8_1[i], ovector8_2[i], total, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\n#ifdef SUPPORT_PCRE16\n\t\t\t\tif (return_value16[0] != return_value16[1]) {\n\t\t\t\t\tprintf(\"\\n16 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value16[0], return_value16[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else if (return_value16[0] >= 0 || return_value16[0] == PCRE_ERROR_PARTIAL) {\n\t\t\t\t\tif (return_value16[0] == PCRE_ERROR_PARTIAL)\n\t\t\t\t\t\treturn_value16[0] = 2;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn_value16[0] *= 2;\n\n\t\t\t\t\tfor (i = 0; i < return_value16[0]; ++i)\n\t\t\t\t\t\tif (ovector16_1[i] != ovector16_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n16 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\t\t\ti, ovector16_1[i], ovector16_2[i], total, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\n#ifdef SUPPORT_PCRE32\n\t\t\t\tif (return_value32[0] != return_value32[1]) {\n\t\t\t\t\tprintf(\"\\n32 bit: Return value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\treturn_value32[0], return_value32[1], total, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t} else if (return_value32[0] >= 0 || return_value32[0] == PCRE_ERROR_PARTIAL) {\n\t\t\t\t\tif (return_value32[0] == PCRE_ERROR_PARTIAL)\n\t\t\t\t\t\treturn_value32[0] = 2;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn_value32[0] *= 2;\n\n\t\t\t\t\tfor (i = 0; i < return_value32[0]; ++i)\n\t\t\t\t\t\tif (ovector32_1[i] != ovector32_2[i]) {\n\t\t\t\t\t\t\tprintf(\"\\n32 bit: Ovector[%d] value differs(%d:%d): [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\t\t\ti, ovector32_1[i], ovector32_2[i], total, current->pattern, current->input);\n\t\t\t\t\t\t\tis_successful = 0;\n\t\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t}\n\n\t\tif (is_successful) {\n#ifdef SUPPORT_PCRE8\n\t\t\tif (!(current->start_offset & F_NO8) && ((utf && ucp) || is_ascii)) {\n\t\t\t\tif (return_value8[0] < 0 && !(current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"8 bit: Test should match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\n\t\t\t\tif (return_value8[0] >= 0 && (current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"8 bit: Test should not match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\t\t\t}\n#endif\n#ifdef SUPPORT_PCRE16\n\t\t\tif (!(current->start_offset & F_NO16) && ((utf && ucp) || is_ascii)) {\n\t\t\t\tif (return_value16[0] < 0 && !(current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"16 bit: Test should match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\n\t\t\t\tif (return_value16[0] >= 0 && (current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"16 bit: Test should not match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\t\t\t}\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\tif (!(current->start_offset & F_NO32) && ((utf && ucp) || is_ascii)) {\n\t\t\t\tif (return_value32[0] < 0 && !(current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"32 bit: Test should match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\n\t\t\t\tif (return_value32[0] >= 0 && (current->start_offset & F_NOMATCH)) {\n\t\t\t\t\tprintf(\"32 bit: Test should not match: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\t\tis_successful = 0;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\n\t\tif (is_successful) {\n#ifdef SUPPORT_PCRE8\n\t\t\tif (mark8_1 != mark8_2) {\n\t\t\t\tprintf(\"8 bit: Mark value mismatch: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\tis_successful = 0;\n\t\t\t}\n#endif\n#ifdef SUPPORT_PCRE16\n\t\t\tif (mark16_1 != mark16_2) {\n\t\t\t\tprintf(\"16 bit: Mark value mismatch: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\tis_successful = 0;\n\t\t\t}\n#endif\n#ifdef SUPPORT_PCRE32\n\t\t\tif (mark32_1 != mark32_2) {\n\t\t\t\tprintf(\"32 bit: Mark value mismatch: [%d] '%s' @ '%s'\\n\",\n\t\t\t\t\ttotal, current->pattern, current->input);\n\t\t\t\tis_successful = 0;\n\t\t\t}\n#endif\n\t\t}\n\n#ifdef SUPPORT_PCRE8\n\t\tif (re8) {\n\t\t\tpcre_free_study(extra8);\n\t\t\tpcre_free(re8);\n\t\t}\n#endif\n#ifdef SUPPORT_PCRE16\n\t\tif (re16) {\n\t\t\tpcre16_free_study(extra16);\n\t\t\tpcre16_free(re16);\n\t\t}\n#endif\n#ifdef SUPPORT_PCRE32\n\t\tif (re32) {\n\t\t\tpcre32_free_study(extra32);\n\t\t\tpcre32_free(re32);\n\t\t}\n#endif\n\n\t\tif (is_successful) {\n\t\t\tsuccessful++;\n\t\t\tsuccessful_row++;\n\t\t\tprintf(\".\");\n\t\t\tif (successful_row >= 60) {\n\t\t\t\tsuccessful_row = 0;\n\t\t\t\tprintf(\"\\n\");\n\t\t\t}\n\t\t} else\n\t\t\tsuccessful_row = 0;\n\n\t\tfflush(stdout);\n\t\tcurrent++;\n\t}\n\ttables(1);\n#ifdef SUPPORT_PCRE8\n\tsetstack8(NULL);\n#endif\n#ifdef SUPPORT_PCRE16\n\tsetstack16(NULL);\n#endif\n#ifdef SUPPORT_PCRE32\n\tsetstack32(NULL);\n#endif\n\n\tif (total == successful) {\n\t\tprintf(\"\\nAll JIT regression tests are successfully passed.\\n\");\n\t\treturn 0;\n\t} else {\n\t\tprintf(\"\\nSuccessful test ratio: %d%% (%d failed)\\n\", successful * 100 / total, total - successful);\n\t\treturn 1;\n\t}\n}\n\n/* End of pcre_jit_test.c */\n"
  },
  {
    "path": "src/pcre/pcre_maketables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_maketables(), which builds\ncharacter tables for PCRE in the current locale. The file is compiled on its\nown as part of the PCRE library. However, it is also included in the\ncompilation of dftables.c, in which case the macro DFTABLES is defined. */\n\n\n#ifndef DFTABLES\n#  ifdef HAVE_CONFIG_H\n#  include \"config.h\"\n#  endif\n#  include \"pcre_internal.h\"\n#endif\n\n\n/*************************************************\n*           Create PCRE character tables         *\n*************************************************/\n\n/* This function builds a set of character tables for use by PCRE and returns\na pointer to them. They are build using the ctype functions, and consequently\ntheir contents will depend upon the current locale setting. When compiled as\npart of the library, the store is obtained via PUBL(malloc)(), but when\ncompiled inside dftables, use malloc().\n\nArguments:   none\nReturns:     pointer to the contiguous block of data\n*/\n\n#if defined COMPILE_PCRE8\nconst unsigned char *\npcre_maketables(void)\n#elif defined COMPILE_PCRE16\nconst unsigned char *\npcre16_maketables(void)\n#elif defined COMPILE_PCRE32\nconst unsigned char *\npcre32_maketables(void)\n#endif\n{\nunsigned char *yield, *p;\nint i;\n\n#ifndef DFTABLES\nyield = (unsigned char*)(PUBL(malloc))(tables_length);\n#else\nyield = (unsigned char*)malloc(tables_length);\n#endif\n\nif (yield == NULL) return NULL;\np = yield;\n\n/* First comes the lower casing table */\n\nfor (i = 0; i < 256; i++) *p++ = tolower(i);\n\n/* Next the case-flipping table */\n\nfor (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);\n\n/* Then the character class tables. Don't try to be clever and save effort on\nexclusive ones - in some locales things may be different.\n\nNote that the table for \"space\" includes everything \"isspace\" gives, including\nVT in the default locale. This makes it work for the POSIX class [:space:].\nFrom release 8.34 is is also correct for Perl space, because Perl added VT at\nrelease 5.18.\n\nNote also that it is possible for a character to be alnum or alpha without\nbeing lower or upper, such as \"male and female ordinals\" (\\xAA and \\xBA) in the\nfr_FR locale (at least under Debian Linux's locales as of 12/2005). So we must\ntest for alnum specially. */\n\nmemset(p, 0, cbit_length);\nfor (i = 0; i < 256; i++)\n  {\n  if (isdigit(i)) p[cbit_digit  + i/8] |= 1 << (i&7);\n  if (isupper(i)) p[cbit_upper  + i/8] |= 1 << (i&7);\n  if (islower(i)) p[cbit_lower  + i/8] |= 1 << (i&7);\n  if (isalnum(i)) p[cbit_word   + i/8] |= 1 << (i&7);\n  if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);\n  if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);\n  if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);\n  if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);\n  if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);\n  if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);\n  if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);\n  }\np += cbit_length;\n\n/* Finally, the character type table. In this, we used to exclude VT from the\nwhite space chars, because Perl didn't recognize it as such for \\s and for\ncomments within regexes. However, Perl changed at release 5.18, so PCRE changed\nat release 8.34. */\n\nfor (i = 0; i < 256; i++)\n  {\n  int x = 0;\n  if (isspace(i)) x += ctype_space;\n  if (isalpha(i)) x += ctype_letter;\n  if (isdigit(i)) x += ctype_digit;\n  if (isxdigit(i)) x += ctype_xdigit;\n  if (isalnum(i) || i == '_') x += ctype_word;\n\n  /* Note: strchr includes the terminating zero in the characters it considers.\n  In this instance, that is ok because we want binary zero to be flagged as a\n  meta-character, which in this sense is any character that terminates a run\n  of data characters. */\n\n  if (strchr(\"\\\\*+?{^.$|()[\", i) != 0) x += ctype_meta;\n  *p++ = x;\n  }\n\nreturn yield;\n}\n\n/* End of pcre_maketables.c */\n"
  },
  {
    "path": "src/pcre/pcre_newline.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains internal functions for testing newlines when more than\none kind of newline is to be recognized. When a newline is found, its length is\nreturned. In principle, we could implement several newline \"types\", each\nreferring to a different set of newline characters. At present, PCRE supports\nonly NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF,\nand NLTYPE_ANY. The full list of Unicode newline characters is taken from\nhttp://unicode.org/unicode/reports/tr18/. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n\n/*************************************************\n*      Check for newline at given position       *\n*************************************************/\n\n/* It is guaranteed that the initial value of ptr is less than the end of the\nstring that is being processed.\n\nArguments:\n  ptr          pointer to possible newline\n  type         the newline type\n  endptr       pointer to the end of the string\n  lenptr       where to return the length\n  utf          TRUE if in utf mode\n\nReturns:       TRUE or FALSE\n*/\n\nBOOL\nPRIV(is_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR endptr, int *lenptr,\n  BOOL utf)\n{\npcre_uint32 c;\n(void)utf;\n#ifdef SUPPORT_UTF\nif (utf)\n  {\n  GETCHAR(c, ptr);\n  }\nelse\n#endif  /* SUPPORT_UTF */\n  c = *ptr;\n\n/* Note that this function is called only for ANY or ANYCRLF. */\n\nif (type == NLTYPE_ANYCRLF) switch(c)\n  {\n  case CHAR_LF: *lenptr = 1; return TRUE;\n  case CHAR_CR: *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;\n               return TRUE;\n  default: return FALSE;\n  }\n\n/* NLTYPE_ANY */\n\nelse switch(c)\n  {\n#ifdef EBCDIC\n  case CHAR_NEL:\n#endif\n  case CHAR_LF:\n  case CHAR_VT:\n  case CHAR_FF: *lenptr = 1; return TRUE;\n\n  case CHAR_CR:\n  *lenptr = (ptr < endptr - 1 && ptr[1] == CHAR_LF)? 2 : 1;\n  return TRUE;\n\n#ifndef EBCDIC\n#ifdef COMPILE_PCRE8\n  case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;\n  case 0x2028:                                       /* LS */\n  case 0x2029: *lenptr = 3; return TRUE;             /* PS */\n#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */\n  case CHAR_NEL:\n  case 0x2028:                                       /* LS */\n  case 0x2029: *lenptr = 1; return TRUE;             /* PS */\n#endif  /* COMPILE_PCRE8 */\n#endif  /* Not EBCDIC */\n\n  default: return FALSE;\n  }\n}\n\n\n\n/*************************************************\n*     Check for newline at previous position     *\n*************************************************/\n\n/* It is guaranteed that the initial value of ptr is greater than the start of\nthe string that is being processed.\n\nArguments:\n  ptr          pointer to possible newline\n  type         the newline type\n  startptr     pointer to the start of the string\n  lenptr       where to return the length\n  utf          TRUE if in utf mode\n\nReturns:       TRUE or FALSE\n*/\n\nBOOL\nPRIV(was_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR startptr, int *lenptr,\n  BOOL utf)\n{\npcre_uint32 c;\n(void)utf;\nptr--;\n#ifdef SUPPORT_UTF\nif (utf)\n  {\n  BACKCHAR(ptr);\n  GETCHAR(c, ptr);\n  }\nelse\n#endif  /* SUPPORT_UTF */\n  c = *ptr;\n\n/* Note that this function is called only for ANY or ANYCRLF. */\n\nif (type == NLTYPE_ANYCRLF) switch(c)\n  {\n  case CHAR_LF:\n  *lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1;\n  return TRUE;\n\n  case CHAR_CR: *lenptr = 1; return TRUE;\n  default: return FALSE;\n  }\n\n/* NLTYPE_ANY */\n\nelse switch(c)\n  {\n  case CHAR_LF:\n  *lenptr = (ptr > startptr && ptr[-1] == CHAR_CR)? 2 : 1;\n  return TRUE;\n\n#ifdef EBCDIC\n  case CHAR_NEL:\n#endif\n  case CHAR_VT:\n  case CHAR_FF:\n  case CHAR_CR: *lenptr = 1; return TRUE;\n\n#ifndef EBCDIC\n#ifdef COMPILE_PCRE8\n  case CHAR_NEL: *lenptr = utf? 2 : 1; return TRUE;\n  case 0x2028:                                       /* LS */\n  case 0x2029: *lenptr = 3; return TRUE;             /* PS */\n#else /* COMPILE_PCRE16 || COMPILE_PCRE32 */\n  case CHAR_NEL:\n  case 0x2028:                                       /* LS */\n  case 0x2029: *lenptr = 1; return TRUE;             /* PS */\n#endif  /* COMPILE_PCRE8 */\n#endif  /* NotEBCDIC */\n\n  default: return FALSE;\n  }\n}\n\n/* End of pcre_newline.c */\n"
  },
  {
    "path": "src/pcre/pcre_ord2utf8.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This file contains a private PCRE function that converts an ordinal\ncharacter value into a UTF8 string. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#define COMPILE_PCRE8\n\n#include \"pcre_internal.h\"\n\n/*************************************************\n*       Convert character value to UTF-8         *\n*************************************************/\n\n/* This function takes an integer value in the range 0 - 0x10ffff\nand encodes it as a UTF-8 character in 1 to 4 pcre_uchars.\n\nArguments:\n  cvalue     the character value\n  buffer     pointer to buffer for result - at least 6 pcre_uchars long\n\nReturns:     number of characters placed in the buffer\n*/\n\nunsigned\nint\nPRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer)\n{\n#ifdef SUPPORT_UTF\n\nregister int i, j;\n\nfor (i = 0; i < PRIV(utf8_table1_size); i++)\n  if ((int)cvalue <= PRIV(utf8_table1)[i]) break;\nbuffer += i;\nfor (j = i; j > 0; j--)\n {\n *buffer-- = 0x80 | (cvalue & 0x3f);\n cvalue >>= 6;\n }\n*buffer = PRIV(utf8_table2)[i] | cvalue;\nreturn i + 1;\n\n#else\n\n(void)(cvalue);  /* Keep compiler happy; this function won't ever be */\n(void)(buffer);  /* called when SUPPORT_UTF is not defined. */\nreturn 0;\n\n#endif\n}\n\n/* End of pcre_ord2utf8.c */\n"
  },
  {
    "path": "src/pcre/pcre_printint.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains a PCRE private debugging function for printing out the\ninternal form of a compiled regular expression, along with some supporting\nlocal functions. This source file is used in two places:\n\n(1) It is #included by pcre_compile.c when it is compiled in debugging mode\n(PCRE_DEBUG defined in pcre_internal.h). It is not included in production\ncompiles. In this case PCRE_INCLUDED is defined.\n\n(2) It is also compiled separately and linked with pcretest.c, which can be\nasked to print out a compiled regex for debugging purposes. */\n\n#ifndef PCRE_INCLUDED\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n/* For pcretest program. */\n#define PRIV(name) name\n\n/* We have to include pcre_internal.h because we need the internal info for\ndisplaying the results of pcre_study() and we also need to know about the\ninternal macros, structures, and other internal data values; pcretest has\n\"inside information\" compared to a program that strictly follows the PCRE API.\n\nAlthough pcre_internal.h does itself include pcre.h, we explicitly include it\nhere before pcre_internal.h so that the PCRE_EXP_xxx macros get set\nappropriately for an application, not for building PCRE. */\n\n#include \"pcre.h\"\n#include \"pcre_internal.h\"\n\n/* These are the funtions that are contained within. It doesn't seem worth\nhaving a separate .h file just for this. */\n\n#endif /* PCRE_INCLUDED */\n\n#ifdef PCRE_INCLUDED\nstatic /* Keep the following function as private. */\n#endif\n\n#if defined COMPILE_PCRE8\nvoid pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#elif defined COMPILE_PCRE16\nvoid pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#elif defined COMPILE_PCRE32\nvoid pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#endif\n\n/* Macro that decides whether a character should be output as a literal or in\nhexadecimal. We don't use isprint() because that can vary from system to system\n(even without the use of locales) and we want the output always to be the same,\nfor testing purposes. */\n\n#ifdef EBCDIC\n#define PRINTABLE(c) ((c) >= 64 && (c) < 255)\n#else\n#define PRINTABLE(c) ((c) >= 32 && (c) < 127)\n#endif\n\n/* The table of operator names. */\n\nstatic const char *priv_OP_names[] = { OP_NAME_LIST };\n\n/* This table of operator lengths is not actually used by the working code,\nbut its size is needed for a check that ensures it is the correct size for the\nnumber of opcodes (thus catching update omissions). */\n\nstatic const pcre_uint8 priv_OP_lengths[] = { OP_LENGTHS };\n\n\n\n/*************************************************\n*       Print single- or multi-byte character    *\n*************************************************/\n\nstatic unsigned int\nprint_char(FILE *f, pcre_uchar *ptr, BOOL utf)\n{\npcre_uint32 c = *ptr;\n\n#ifndef SUPPORT_UTF\n\n(void)utf;  /* Avoid compiler warning */\nif (PRINTABLE(c)) fprintf(f, \"%c\", (char)c);\nelse if (c <= 0x80) fprintf(f, \"\\\\x%02x\", c);\nelse fprintf(f, \"\\\\x{%x}\", c);\nreturn 0;\n\n#else\n\n#if defined COMPILE_PCRE8\n\nif (!utf || (c & 0xc0) != 0xc0)\n  {\n  if (PRINTABLE(c)) fprintf(f, \"%c\", (char)c);\n  else if (c < 0x80) fprintf(f, \"\\\\x%02x\", c);\n  else fprintf(f, \"\\\\x{%02x}\", c);\n  return 0;\n  }\nelse\n  {\n  int i;\n  int a = PRIV(utf8_table4)[c & 0x3f];  /* Number of additional bytes */\n  int s = 6*a;\n  c = (c & PRIV(utf8_table3)[a]) << s;\n  for (i = 1; i <= a; i++)\n    {\n    /* This is a check for malformed UTF-8; it should only occur if the sanity\n    check has been turned off. Rather than swallow random bytes, just stop if\n    we hit a bad one. Print it with \\X instead of \\x as an indication. */\n\n    if ((ptr[i] & 0xc0) != 0x80)\n      {\n      fprintf(f, \"\\\\X{%x}\", c);\n      return i - 1;\n      }\n\n    /* The byte is OK */\n\n    s -= 6;\n    c |= (ptr[i] & 0x3f) << s;\n    }\n  fprintf(f, \"\\\\x{%x}\", c);\n  return a;\n  }\n\n#elif defined COMPILE_PCRE16\n\nif (!utf || (c & 0xfc00) != 0xd800)\n  {\n  if (PRINTABLE(c)) fprintf(f, \"%c\", (char)c);\n  else if (c <= 0x80) fprintf(f, \"\\\\x%02x\", c);\n  else fprintf(f, \"\\\\x{%02x}\", c);\n  return 0;\n  }\nelse\n  {\n  /* This is a check for malformed UTF-16; it should only occur if the sanity\n  check has been turned off. Rather than swallow a low surrogate, just stop if\n  we hit a bad one. Print it with \\X instead of \\x as an indication. */\n\n  if ((ptr[1] & 0xfc00) != 0xdc00)\n    {\n    fprintf(f, \"\\\\X{%x}\", c);\n    return 0;\n    }\n\n  c = (((c & 0x3ff) << 10) | (ptr[1] & 0x3ff)) + 0x10000;\n  fprintf(f, \"\\\\x{%x}\", c);\n  return 1;\n  }\n\n#elif defined COMPILE_PCRE32\n\nif (!utf || (c & 0xfffff800u) != 0xd800u)\n  {\n  if (PRINTABLE(c)) fprintf(f, \"%c\", (char)c);\n  else if (c <= 0x80) fprintf(f, \"\\\\x%02x\", c);\n  else fprintf(f, \"\\\\x{%x}\", c);\n  return 0;\n  }\nelse\n  {\n  /* This is a check for malformed UTF-32; it should only occur if the sanity\n  check has been turned off. Rather than swallow a surrogate, just stop if\n  we hit one. Print it with \\X instead of \\x as an indication. */\n  fprintf(f, \"\\\\X{%x}\", c);\n  return 0;\n  }\n\n#endif /* COMPILE_PCRE[8|16|32] */\n\n#endif /* SUPPORT_UTF */\n}\n\n/*************************************************\n*  Print uchar string (regardless of utf)        *\n*************************************************/\n\nstatic void\nprint_puchar(FILE *f, PCRE_PUCHAR ptr)\n{\nwhile (*ptr != '\\0')\n  {\n  register pcre_uint32 c = *ptr++;\n  if (PRINTABLE(c)) fprintf(f, \"%c\", c); else fprintf(f, \"\\\\x{%x}\", c);\n  }\n}\n\n/*************************************************\n*          Find Unicode property name            *\n*************************************************/\n\nstatic const char *\nget_ucpname(unsigned int ptype, unsigned int pvalue)\n{\n#ifdef SUPPORT_UCP\nint i;\nfor (i = PRIV(utt_size) - 1; i >= 0; i--)\n  {\n  if (ptype == PRIV(utt)[i].type && pvalue == PRIV(utt)[i].value) break;\n  }\nreturn (i >= 0)? PRIV(utt_names) + PRIV(utt)[i].name_offset : \"??\";\n#else\n/* It gets harder and harder to shut off unwanted compiler warnings. */\nptype = ptype * pvalue;\nreturn (ptype == pvalue)? \"??\" : \"??\";\n#endif\n}\n\n\n/*************************************************\n*       Print Unicode property value             *\n*************************************************/\n\n/* \"Normal\" properties can be printed from tables. The PT_CLIST property is a\npseudo-property that contains a pointer to a list of case-equivalent\ncharacters. This is used only when UCP support is available and UTF mode is\nselected. It should never occur otherwise, but just in case it does, have\nsomething ready to print. */\n\nstatic void\nprint_prop(FILE *f, pcre_uchar *code, const char *before, const char *after)\n{\nif (code[1] != PT_CLIST)\n  {\n  fprintf(f, \"%s%s %s%s\", before, priv_OP_names[*code], get_ucpname(code[1],\n    code[2]), after);\n  }\nelse\n  {\n  const char *not = (*code == OP_PROP)? \"\" : \"not \";\n#ifndef SUPPORT_UCP\n  fprintf(f, \"%s%sclist %d%s\", before, not, code[2], after);\n#else\n  const pcre_uint32 *p = PRIV(ucd_caseless_sets) + code[2];\n  fprintf (f, \"%s%sclist\", before, not);\n  while (*p < NOTACHAR) fprintf(f, \" %04x\", *p++);\n  fprintf(f, \"%s\", after);\n#endif\n  }\n}\n\n\n\n\n/*************************************************\n*         Print compiled regex                   *\n*************************************************/\n\n/* Make this function work for a regex with integers either byte order.\nHowever, we assume that what we are passed is a compiled regex. The\nprint_lengths flag controls whether offsets and lengths of items are printed.\nThey can be turned off from pcretest so that automatic tests on bytecode can be\nwritten that do not depend on the value of LINK_SIZE. */\n\n#ifdef PCRE_INCLUDED\nstatic /* Keep the following function as private. */\n#endif\n#if defined COMPILE_PCRE8\nvoid\npcre_printint(pcre *external_re, FILE *f, BOOL print_lengths)\n#elif defined COMPILE_PCRE16\nvoid\npcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths)\n#elif defined COMPILE_PCRE32\nvoid\npcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths)\n#endif\n{\nREAL_PCRE *re = (REAL_PCRE *)external_re;\npcre_uchar *codestart, *code;\nBOOL utf;\n\nunsigned int options = re->options;\nint offset = re->name_table_offset;\nint count = re->name_count;\nint size = re->name_entry_size;\n\nif (re->magic_number != MAGIC_NUMBER)\n  {\n  offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff);\n  count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff);\n  size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff);\n  options = ((options << 24) & 0xff000000) |\n            ((options <<  8) & 0x00ff0000) |\n            ((options >>  8) & 0x0000ff00) |\n            ((options >> 24) & 0x000000ff);\n  }\n\ncode = codestart = (pcre_uchar *)re + offset + count * size;\n/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */\nutf = (options & PCRE_UTF8) != 0;\n\nfor(;;)\n  {\n  pcre_uchar *ccode;\n  const char *flag = \"  \";\n  pcre_uint32 c;\n  unsigned int extra = 0;\n\n  if (print_lengths)\n    fprintf(f, \"%3d \", (int)(code - codestart));\n  else\n    fprintf(f, \"    \");\n\n  switch(*code)\n    {\n/* ========================================================================== */\n      /* These cases are never obeyed. This is a fudge that causes a compile-\n      time error if the vectors OP_names or OP_lengths, which are indexed\n      by opcode, are not the correct length. It seems to be the only way to do\n      such a check at compile time, as the sizeof() operator does not work in\n      the C preprocessor. */\n\n      case OP_TABLE_LENGTH:\n      case OP_TABLE_LENGTH +\n        ((sizeof(priv_OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) &&\n        (sizeof(priv_OP_lengths) == OP_TABLE_LENGTH)):\n      break;\n/* ========================================================================== */\n\n    case OP_END:\n    fprintf(f, \"    %s\\n\", priv_OP_names[*code]);\n    fprintf(f, \"------------------------------------------------------------------\\n\");\n    return;\n\n    case OP_CHAR:\n    fprintf(f, \"    \");\n    do\n      {\n      code++;\n      code += 1 + print_char(f, code, utf);\n      }\n    while (*code == OP_CHAR);\n    fprintf(f, \"\\n\");\n    continue;\n\n    case OP_CHARI:\n    fprintf(f, \" /i \");\n    do\n      {\n      code++;\n      code += 1 + print_char(f, code, utf);\n      }\n    while (*code == OP_CHARI);\n    fprintf(f, \"\\n\");\n    continue;\n\n    case OP_CBRA:\n    case OP_CBRAPOS:\n    case OP_SCBRA:\n    case OP_SCBRAPOS:\n    if (print_lengths) fprintf(f, \"%3d \", GET(code, 1));\n      else fprintf(f, \"    \");\n    fprintf(f, \"%s %d\", priv_OP_names[*code], GET2(code, 1+LINK_SIZE));\n    break;\n\n    case OP_BRA:\n    case OP_BRAPOS:\n    case OP_SBRA:\n    case OP_SBRAPOS:\n    case OP_KETRMAX:\n    case OP_KETRMIN:\n    case OP_KETRPOS:\n    case OP_ALT:\n    case OP_KET:\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    case OP_COND:\n    case OP_SCOND:\n    case OP_REVERSE:\n    if (print_lengths) fprintf(f, \"%3d \", GET(code, 1));\n      else fprintf(f, \"    \");\n    fprintf(f, \"%s\", priv_OP_names[*code]);\n    break;\n\n    case OP_CLOSE:\n    fprintf(f, \"    %s %d\", priv_OP_names[*code], GET2(code, 1));\n    break;\n\n    case OP_CREF:\n    fprintf(f, \"%3d %s\", GET2(code,1), priv_OP_names[*code]);\n    break;\n\n    case OP_DNCREF:\n      {\n      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +\n        IMM2_SIZE;\n      fprintf(f, \" %s Cond ref <\", flag);\n      print_puchar(f, entry);\n      fprintf(f, \">%d\", GET2(code, 1 + IMM2_SIZE));\n      }\n    break;\n\n    case OP_RREF:\n    c = GET2(code, 1);\n    if (c == RREF_ANY)\n      fprintf(f, \"    Cond recurse any\");\n    else\n      fprintf(f, \"    Cond recurse %d\", c);\n    break;\n\n    case OP_DNRREF:\n      {\n      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +\n        IMM2_SIZE;\n      fprintf(f, \" %s Cond recurse <\", flag);\n      print_puchar(f, entry);\n      fprintf(f, \">%d\", GET2(code, 1 + IMM2_SIZE));\n      }\n    break;\n\n    case OP_DEF:\n    fprintf(f, \"    Cond def\");\n    break;\n\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_POSSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_POSPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_POSQUERYI:\n    flag = \"/i\";\n    /* Fall through */\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_POSSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_POSPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_POSQUERY:\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEPOSPLUS:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEPOSQUERY:\n    fprintf(f, \" %s \", flag);\n    if (*code >= OP_TYPESTAR)\n      {\n      if (code[1] == OP_PROP || code[1] == OP_NOTPROP)\n        {\n        print_prop(f, code + 1, \"\", \" \");\n        extra = 2;\n        }\n      else fprintf(f, \"%s\", priv_OP_names[code[1]]);\n      }\n    else extra = print_char(f, code+1, utf);\n    fprintf(f, \"%s\", priv_OP_names[*code]);\n    break;\n\n    case OP_EXACTI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_POSUPTOI:\n    flag = \"/i\";\n    /* Fall through */\n    case OP_EXACT:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_POSUPTO:\n    fprintf(f, \" %s \", flag);\n    extra = print_char(f, code + 1 + IMM2_SIZE, utf);\n    fprintf(f, \"{\");\n    if (*code != OP_EXACT && *code != OP_EXACTI) fprintf(f, \"0,\");\n    fprintf(f, \"%d}\", GET2(code,1));\n    if (*code == OP_MINUPTO || *code == OP_MINUPTOI) fprintf(f, \"?\");\n      else if (*code == OP_POSUPTO || *code == OP_POSUPTOI) fprintf(f, \"+\");\n    break;\n\n    case OP_TYPEEXACT:\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEPOSUPTO:\n    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)\n      {\n      print_prop(f, code + IMM2_SIZE + 1, \"    \", \" \");\n      extra = 2;\n      }\n    else fprintf(f, \"    %s\", priv_OP_names[code[1 + IMM2_SIZE]]);\n    fprintf(f, \"{\");\n    if (*code != OP_TYPEEXACT) fprintf(f, \"0,\");\n    fprintf(f, \"%d}\", GET2(code,1));\n    if (*code == OP_TYPEMINUPTO) fprintf(f, \"?\");\n      else if (*code == OP_TYPEPOSUPTO) fprintf(f, \"+\");\n    break;\n\n    case OP_NOTI:\n    flag = \"/i\";\n    /* Fall through */\n    case OP_NOT:\n    fprintf(f, \" %s [^\", flag);\n    extra = print_char(f, code + 1, utf);\n    fprintf(f, \"]\");\n    break;\n\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTPOSQUERYI:\n    flag = \"/i\";\n    /* Fall through */\n\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTPOSPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTPOSQUERY:\n    fprintf(f, \" %s [^\", flag);\n    extra = print_char(f, code + 1, utf);\n    fprintf(f, \"]%s\", priv_OP_names[*code]);\n    break;\n\n    case OP_NOTEXACTI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTPOSUPTOI:\n    flag = \"/i\";\n    /* Fall through */\n\n    case OP_NOTEXACT:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTPOSUPTO:\n    fprintf(f, \" %s [^\", flag);\n    extra = print_char(f, code + 1 + IMM2_SIZE, utf);\n    fprintf(f, \"]{\");\n    if (*code != OP_NOTEXACT && *code != OP_NOTEXACTI) fprintf(f, \"0,\");\n    fprintf(f, \"%d}\", GET2(code,1));\n    if (*code == OP_NOTMINUPTO || *code == OP_NOTMINUPTOI) fprintf(f, \"?\");\n      else\n    if (*code == OP_NOTPOSUPTO || *code == OP_NOTPOSUPTOI) fprintf(f, \"+\");\n    break;\n\n    case OP_RECURSE:\n    if (print_lengths) fprintf(f, \"%3d \", GET(code, 1));\n      else fprintf(f, \"    \");\n    fprintf(f, \"%s\", priv_OP_names[*code]);\n    break;\n\n    case OP_REFI:\n    flag = \"/i\";\n    /* Fall through */\n    case OP_REF:\n    fprintf(f, \" %s \\\\%d\", flag, GET2(code,1));\n    ccode = code + priv_OP_lengths[*code];\n    goto CLASS_REF_REPEAT;\n\n    case OP_DNREFI:\n    flag = \"/i\";\n    /* Fall through */\n    case OP_DNREF:\n      {\n      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +\n        IMM2_SIZE;\n      fprintf(f, \" %s \\\\k<\", flag);\n      print_puchar(f, entry);\n      fprintf(f, \">%d\", GET2(code, 1 + IMM2_SIZE));\n      }\n    ccode = code + priv_OP_lengths[*code];\n    goto CLASS_REF_REPEAT;\n\n    case OP_CALLOUT:\n    fprintf(f, \"    %s %d %d %d\", priv_OP_names[*code], code[1], GET(code,2),\n      GET(code, 2 + LINK_SIZE));\n    break;\n\n    case OP_PROP:\n    case OP_NOTPROP:\n    print_prop(f, code, \"    \", \"\");\n    break;\n\n    /* OP_XCLASS cannot occur in 8-bit, non-UTF mode. However, there's no harm\n    in having this code always here, and it makes it less messy without all\n    those #ifdefs. */\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    case OP_XCLASS:\n      {\n      int i;\n      unsigned int min, max;\n      BOOL printmap;\n      BOOL invertmap = FALSE;\n      pcre_uint8 *map;\n      pcre_uint8 inverted_map[32];\n\n      fprintf(f, \"    [\");\n\n      if (*code == OP_XCLASS)\n        {\n        extra = GET(code, 1);\n        ccode = code + LINK_SIZE + 1;\n        printmap = (*ccode & XCL_MAP) != 0;\n        if ((*ccode & XCL_NOT) != 0)\n          {\n          invertmap = (*ccode & XCL_HASPROP) == 0;\n          fprintf(f, \"^\");\n          }\n        ccode++;\n        }\n      else\n        {\n        printmap = TRUE;\n        ccode = code + 1;\n        }\n\n      /* Print a bit map */\n\n      if (printmap)\n        {\n        map = (pcre_uint8 *)ccode;\n        if (invertmap)\n          {\n          for (i = 0; i < 32; i++) inverted_map[i] = ~map[i];\n          map = inverted_map;\n          }\n\n        for (i = 0; i < 256; i++)\n          {\n          if ((map[i/8] & (1 << (i&7))) != 0)\n            {\n            int j;\n            for (j = i+1; j < 256; j++)\n              if ((map[j/8] & (1 << (j&7))) == 0) break;\n            if (i == '-' || i == ']') fprintf(f, \"\\\\\");\n            if (PRINTABLE(i)) fprintf(f, \"%c\", i);\n              else fprintf(f, \"\\\\x%02x\", i);\n            if (--j > i)\n              {\n              if (j != i + 1) fprintf(f, \"-\");\n              if (j == '-' || j == ']') fprintf(f, \"\\\\\");\n              if (PRINTABLE(j)) fprintf(f, \"%c\", j);\n                else fprintf(f, \"\\\\x%02x\", j);\n              }\n            i = j;\n            }\n          }\n        ccode += 32 / sizeof(pcre_uchar);\n        }\n\n      /* For an XCLASS there is always some additional data */\n\n      if (*code == OP_XCLASS)\n        {\n        pcre_uchar ch;\n        while ((ch = *ccode++) != XCL_END)\n          {\n          BOOL not = FALSE;\n          const char *notch = \"\";\n\n          switch(ch)\n            {\n            case XCL_NOTPROP:\n            not = TRUE;\n            notch = \"^\";\n            /* Fall through */\n\n            case XCL_PROP:\n              {\n              unsigned int ptype = *ccode++;\n              unsigned int pvalue = *ccode++;\n\n              switch(ptype)\n                {\n                case PT_PXGRAPH:\n                fprintf(f, \"[:%sgraph:]\", notch);\n                break;\n\n                case PT_PXPRINT:\n                fprintf(f, \"[:%sprint:]\", notch);\n                break;\n\n                case PT_PXPUNCT:\n                fprintf(f, \"[:%spunct:]\", notch);\n                break;\n\n                default:\n                fprintf(f, \"\\\\%c{%s}\", (not? 'P':'p'),\n                  get_ucpname(ptype, pvalue));\n                break;\n                }\n              }\n            break;\n\n            default:\n            ccode += 1 + print_char(f, ccode, utf);\n            if (ch == XCL_RANGE)\n              {\n              fprintf(f, \"-\");\n              ccode += 1 + print_char(f, ccode, utf);\n              }\n            break;\n            }\n          }\n        }\n\n      /* Indicate a non-UTF class which was created by negation */\n\n      fprintf(f, \"]%s\", (*code == OP_NCLASS)? \" (neg)\" : \"\");\n\n      /* Handle repeats after a class or a back reference */\n\n      CLASS_REF_REPEAT:\n      switch(*ccode)\n        {\n        case OP_CRSTAR:\n        case OP_CRMINSTAR:\n        case OP_CRPLUS:\n        case OP_CRMINPLUS:\n        case OP_CRQUERY:\n        case OP_CRMINQUERY:\n        case OP_CRPOSSTAR:\n        case OP_CRPOSPLUS:\n        case OP_CRPOSQUERY:\n        fprintf(f, \"%s\", priv_OP_names[*ccode]);\n        extra += priv_OP_lengths[*ccode];\n        break;\n\n        case OP_CRRANGE:\n        case OP_CRMINRANGE:\n        case OP_CRPOSRANGE:\n        min = GET2(ccode,1);\n        max = GET2(ccode,1 + IMM2_SIZE);\n        if (max == 0) fprintf(f, \"{%u,}\", min);\n        else fprintf(f, \"{%u,%u}\", min, max);\n        if (*ccode == OP_CRMINRANGE) fprintf(f, \"?\");\n        else if (*ccode == OP_CRPOSRANGE) fprintf(f, \"+\");\n        extra += priv_OP_lengths[*ccode];\n        break;\n\n        /* Do nothing if it's not a repeat; this code stops picky compilers\n        warning about the lack of a default code path. */\n\n        default:\n        break;\n        }\n      }\n    break;\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_SKIP_ARG:\n    case OP_THEN_ARG:\n    fprintf(f, \"    %s \", priv_OP_names[*code]);\n    print_puchar(f, code + 2);\n    extra += code[1];\n    break;\n\n    case OP_THEN:\n    fprintf(f, \"    %s\", priv_OP_names[*code]);\n    break;\n\n    case OP_CIRCM:\n    case OP_DOLLM:\n    flag = \"/m\";\n    /* Fall through */\n\n    /* Anything else is just an item with no data, but possibly a flag. */\n\n    default:\n    fprintf(f, \" %s %s\", flag, priv_OP_names[*code]);\n    break;\n    }\n\n  code += priv_OP_lengths[*code] + extra;\n  fprintf(f, \"\\n\");\n  }\n}\n\n/* End of pcre_printint.src */\n"
  },
  {
    "path": "src/pcre/pcre_refcount.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_refcount(), which is an\nauxiliary function that can be used to maintain a reference count in a compiled\npattern data block. This might be helpful in applications where the block is\nshared by different users. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*           Maintain reference count             *\n*************************************************/\n\n/* The reference count is a 16-bit field, initialized to zero. It is not\npossible to transfer a non-zero count from one host to a different host that\nhas a different byte order - though I can't see why anyone in their right mind\nwould ever want to do that!\n\nArguments:\n  argument_re   points to compiled code\n  adjust        value to add to the count\n\nReturns:        the (possibly updated) count value (a non-negative number), or\n                a negative error number\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre_refcount(pcre *argument_re, int adjust)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre16_refcount(pcre16 *argument_re, int adjust)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN int PCRE_CALL_CONVENTION\npcre32_refcount(pcre32 *argument_re, int adjust)\n#endif\n{\nREAL_PCRE *re = (REAL_PCRE *)argument_re;\nif (re == NULL) return PCRE_ERROR_NULL;\nif (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;\nif ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;\nre->ref_count = (-adjust > re->ref_count)? 0 :\n                (adjust + re->ref_count > 65535)? 65535 :\n                re->ref_count + adjust;\nreturn re->ref_count;\n}\n\n/* End of pcre_refcount.c */\n"
  },
  {
    "path": "src/pcre/pcre_scanner.cc",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <vector>\n#include <assert.h>\n\n#include \"pcrecpp_internal.h\"\n#include \"pcre_scanner.h\"\n\nusing std::vector;\n\nnamespace pcrecpp {\n\nScanner::Scanner()\n  : data_(),\n    input_(data_),\n    skip_(NULL),\n    should_skip_(false),\n    skip_repeat_(false),\n    save_comments_(false),\n    comments_(NULL),\n    comments_offset_(0) {\n}\n\nScanner::Scanner(const string& in)\n  : data_(in),\n    input_(data_),\n    skip_(NULL),\n    should_skip_(false),\n    skip_repeat_(false),\n    save_comments_(false),\n    comments_(NULL),\n    comments_offset_(0) {\n}\n\nScanner::~Scanner() {\n  delete skip_;\n  delete comments_;\n}\n\nvoid Scanner::SetSkipExpression(const char* re) {\n  delete skip_;\n  if (re != NULL) {\n    skip_ = new RE(re);\n    should_skip_ = true;\n    skip_repeat_ = true;\n    ConsumeSkip();\n  } else {\n    skip_ = NULL;\n    should_skip_ = false;\n    skip_repeat_ = false;\n  }\n}\n\nvoid Scanner::Skip(const char* re) {\n  delete skip_;\n  if (re != NULL) {\n    skip_ = new RE(re);\n    should_skip_ = true;\n    skip_repeat_ = false;\n    ConsumeSkip();\n  } else {\n    skip_ = NULL;\n    should_skip_ = false;\n    skip_repeat_ = false;\n  }\n}\n\nvoid Scanner::DisableSkip() {\n  assert(skip_ != NULL);\n  should_skip_ = false;\n}\n\nvoid Scanner::EnableSkip() {\n  assert(skip_ != NULL);\n  should_skip_ = true;\n  ConsumeSkip();\n}\n\nint Scanner::LineNumber() const {\n  // TODO: Make it more efficient by keeping track of the last point\n  // where we computed line numbers and counting newlines since then.\n  // We could use std:count, but not all systems have it. :-(\n  int count = 1;\n  for (const char* p = data_.data(); p < input_.data(); ++p)\n    if (*p == '\\n')\n      ++count;\n  return count;\n}\n\nint Scanner::Offset() const {\n  return (int)(input_.data() - data_.c_str());\n}\n\nbool Scanner::LookingAt(const RE& re) const {\n  int consumed;\n  return re.DoMatch(input_, RE::ANCHOR_START, &consumed, 0, 0);\n}\n\n\nbool Scanner::Consume(const RE& re,\n                      const Arg& arg0,\n                      const Arg& arg1,\n                      const Arg& arg2) {\n  const bool result = re.Consume(&input_, arg0, arg1, arg2);\n  if (result && should_skip_) ConsumeSkip();\n  return result;\n}\n\n// helper function to consume *skip_ and honour save_comments_\nvoid Scanner::ConsumeSkip() {\n  const char* start_data = input_.data();\n  while (skip_->Consume(&input_)) {\n    if (!skip_repeat_) {\n      // Only one skip allowed.\n      break;\n    }\n  }\n  if (save_comments_) {\n    if (comments_ == NULL) {\n      comments_ = new vector<StringPiece>;\n    }\n    // already pointing one past end, so no need to +1\n    int length = (int)(input_.data() - start_data);\n    if (length > 0) {\n      comments_->push_back(StringPiece(start_data, length));\n    }\n  }\n}\n\n\nvoid Scanner::GetComments(int start, int end, vector<StringPiece> *ranges) {\n  // short circuit out if we've not yet initialized comments_\n  // (e.g., when save_comments is false)\n  if (!comments_) {\n    return;\n  }\n  // TODO: if we guarantee that comments_ will contain StringPieces\n  // that are ordered by their start, then we can do a binary search\n  // for the first StringPiece at or past start and then scan for the\n  // ones contained in the range, quit early (use equal_range or\n  // lower_bound)\n  for (vector<StringPiece>::const_iterator it = comments_->begin();\n       it != comments_->end(); ++it) {\n    if ((it->data() >= data_.c_str() + start &&\n         it->data() + it->size() <= data_.c_str() + end)) {\n      ranges->push_back(*it);\n    }\n  }\n}\n\n\nvoid Scanner::GetNextComments(vector<StringPiece> *ranges) {\n  // short circuit out if we've not yet initialized comments_\n  // (e.g., when save_comments is false)\n  if (!comments_) {\n    return;\n  }\n  for (vector<StringPiece>::const_iterator it =\n         comments_->begin() + comments_offset_;\n       it != comments_->end(); ++it) {\n    ranges->push_back(*it);\n    ++comments_offset_;\n  }\n}\n\n}   // namespace pcrecpp\n"
  },
  {
    "path": "src/pcre/pcre_scanner.h",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n//\n// Regular-expression based scanner for parsing an input stream.\n//\n// Example 1: parse a sequence of \"var = number\" entries from input:\n//\n//      Scanner scanner(input);\n//      string var;\n//      int number;\n//      scanner.SetSkipExpression(\"\\\\s+\"); // Skip any white space we encounter\n//      while (scanner.Consume(\"(\\\\w+) = (\\\\d+)\", &var, &number)) {\n//        ...;\n//      }\n\n#ifndef _PCRE_SCANNER_H\n#define _PCRE_SCANNER_H\n\n#include <assert.h>\n#include <string>\n#include <vector>\n\n#include <pcrecpp.h>\n#include <pcre_stringpiece.h>\n\nnamespace pcrecpp {\n\nclass PCRECPP_EXP_DEFN Scanner {\n public:\n  Scanner();\n  explicit Scanner(const std::string& input);\n  ~Scanner();\n\n  // Return current line number.  The returned line-number is\n  // one-based.  I.e. it returns 1 + the number of consumed newlines.\n  //\n  // Note: this method may be slow.  It may take time proportional to\n  // the size of the input.\n  int LineNumber() const;\n\n  // Return the byte-offset that the scanner is looking in the\n  // input data;\n  int Offset() const;\n\n  // Return true iff the start of the remaining input matches \"re\"\n  bool LookingAt(const RE& re) const;\n\n  // Return true iff all of the following are true\n  //    a. the start of the remaining input matches \"re\",\n  //    b. if any arguments are supplied, matched sub-patterns can be\n  //       parsed and stored into the arguments.\n  // If it returns true, it skips over the matched input and any\n  // following input that matches the \"skip\" regular expression.\n  bool Consume(const RE& re,\n               const Arg& arg0 = RE::no_arg,\n               const Arg& arg1 = RE::no_arg,\n               const Arg& arg2 = RE::no_arg\n               // TODO: Allow more arguments?\n               );\n\n  // Set the \"skip\" regular expression.  If after consuming some data,\n  // a prefix of the input matches this RE, it is automatically\n  // skipped.  For example, a programming language scanner would use\n  // a skip RE that matches white space and comments.\n  //\n  //    scanner.SetSkipExpression(\"\\\\s+|//.*|/[*](.|\\n)*?[*]/\");\n  //\n  // Skipping repeats as long as it succeeds.  We used to let people do\n  // this by writing \"(...)*\" in the regular expression, but that added\n  // up to lots of recursive calls within the pcre library, so now we\n  // control repetition explicitly via the function call API.\n  //\n  // You can pass NULL for \"re\" if you do not want any data to be skipped.\n  void Skip(const char* re);   // DEPRECATED; does *not* repeat\n  void SetSkipExpression(const char* re);\n\n  // Temporarily pause \"skip\"ing. This\n  //   Skip(\"Foo\"); code ; DisableSkip(); code; EnableSkip()\n  // is similar to\n  //   Skip(\"Foo\"); code ; Skip(NULL); code ; Skip(\"Foo\");\n  // but avoids creating/deleting new RE objects.\n  void DisableSkip();\n\n  // Reenable previously paused skipping.  Any prefix of the input\n  // that matches the skip pattern is immediately dropped.\n  void EnableSkip();\n\n  /***** Special wrappers around SetSkip() for some common idioms *****/\n\n  // Arranges to skip whitespace, C comments, C++ comments.\n  // The overall RE is a disjunction of the following REs:\n  //    \\\\s                     whitespace\n  //    //.*\\n                  C++ comment\n  //    /[*](.|\\n)*?[*]/        C comment (x*? means minimal repetitions of x)\n  // We get repetition via the semantics of SetSkipExpression, not by using *\n  void SkipCXXComments() {\n    SetSkipExpression(\"\\\\s|//.*\\n|/[*](?:\\n|.)*?[*]/\");\n  }\n\n  void set_save_comments(bool comments) {\n    save_comments_ = comments;\n  }\n\n  bool save_comments() {\n    return save_comments_;\n  }\n\n  // Append to vector ranges the comments found in the\n  // byte range [start,end] (inclusive) of the input data.\n  // Only comments that were extracted entirely within that\n  // range are returned: no range splitting of atomically-extracted\n  // comments is performed.\n  void GetComments(int start, int end, std::vector<StringPiece> *ranges);\n\n  // Append to vector ranges the comments added\n  // since the last time this was called. This\n  // functionality is provided for efficiency when\n  // interleaving scanning with parsing.\n  void GetNextComments(std::vector<StringPiece> *ranges);\n\n private:\n  std::string   data_;          // All the input data\n  StringPiece   input_;         // Unprocessed input\n  RE*           skip_;          // If non-NULL, RE for skipping input\n  bool          should_skip_;   // If true, use skip_\n  bool          skip_repeat_;   // If true, repeat skip_ as long as it works\n  bool          save_comments_; // If true, aggregate the skip expression\n\n  // the skipped comments\n  // TODO: later consider requiring that the StringPieces be added\n  // in order by their start position\n  std::vector<StringPiece> *comments_;\n\n  // the offset into comments_ that has been returned by GetNextComments\n  int           comments_offset_;\n\n  // helper function to consume *skip_ and honour\n  // save_comments_\n  void ConsumeSkip();\n};\n\n}   // namespace pcrecpp\n\n#endif /* _PCRE_SCANNER_H */\n"
  },
  {
    "path": "src/pcre/pcre_scanner_unittest.cc",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Greg J. Badros\n//\n// Unittest for scanner, especially GetNextComments and GetComments()\n// functionality.\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>      /* for strchr */\n#include <string>\n#include <vector>\n\n#include \"pcrecpp.h\"\n#include \"pcre_stringpiece.h\"\n#include \"pcre_scanner.h\"\n\n#define FLAGS_unittest_stack_size   49152\n\n// Dies with a fatal error if the two values are not equal.\n#define CHECK_EQ(a, b)  do {                                    \\\n  if ( (a) != (b) ) {                                           \\\n    fprintf(stderr, \"%s:%d: Check failed because %s != %s\\n\",   \\\n            __FILE__, __LINE__, #a, #b);                        \\\n    exit(1);                                                    \\\n  }                                                             \\\n} while (0)\n\nusing std::vector;\nusing std::string;\nusing pcrecpp::StringPiece;\nusing pcrecpp::Scanner;\n\nstatic void TestScanner() {\n  const char input[] = \"\\n\"\n                       \"alpha = 1; // this sets alpha\\n\"\n                       \"bravo = 2; // bravo is set here\\n\"\n                       \"gamma = 33; /* and here is gamma */\\n\";\n\n  const char *re = \"(\\\\w+) = (\\\\d+);\";\n\n  Scanner s(input);\n  string var;\n  int number;\n  s.SkipCXXComments();\n  s.set_save_comments(true);\n  vector<StringPiece> comments;\n\n  s.Consume(re, &var, &number);\n  CHECK_EQ(var, \"alpha\");\n  CHECK_EQ(number, 1);\n  CHECK_EQ(s.LineNumber(), 3);\n  s.GetNextComments(&comments);\n  CHECK_EQ(comments.size(), 1);\n  CHECK_EQ(comments[0].as_string(), \" // this sets alpha\\n\");\n  comments.resize(0);\n\n  s.Consume(re, &var, &number);\n  CHECK_EQ(var, \"bravo\");\n  CHECK_EQ(number, 2);\n  s.GetNextComments(&comments);\n  CHECK_EQ(comments.size(), 1);\n  CHECK_EQ(comments[0].as_string(), \" // bravo is set here\\n\");\n  comments.resize(0);\n\n  s.Consume(re, &var, &number);\n  CHECK_EQ(var, \"gamma\");\n  CHECK_EQ(number, 33);\n  s.GetNextComments(&comments);\n  CHECK_EQ(comments.size(), 1);\n  CHECK_EQ(comments[0].as_string(), \" /* and here is gamma */\\n\");\n  comments.resize(0);\n\n  s.GetComments(0, sizeof(input), &comments);\n  CHECK_EQ(comments.size(), 3);\n  CHECK_EQ(comments[0].as_string(), \" // this sets alpha\\n\");\n  CHECK_EQ(comments[1].as_string(), \" // bravo is set here\\n\");\n  CHECK_EQ(comments[2].as_string(), \" /* and here is gamma */\\n\");\n  comments.resize(0);\n\n  s.GetComments(0, (int)(strchr(input, '/') - input), &comments);\n  CHECK_EQ(comments.size(), 0);\n  comments.resize(0);\n\n  s.GetComments((int)(strchr(input, '/') - input - 1), sizeof(input),\n                &comments);\n  CHECK_EQ(comments.size(), 3);\n  CHECK_EQ(comments[0].as_string(), \" // this sets alpha\\n\");\n  CHECK_EQ(comments[1].as_string(), \" // bravo is set here\\n\");\n  CHECK_EQ(comments[2].as_string(), \" /* and here is gamma */\\n\");\n  comments.resize(0);\n\n  s.GetComments((int)(strchr(input, '/') - input - 1),\n                (int)(strchr(input + 1, '\\n') - input + 1), &comments);\n  CHECK_EQ(comments.size(), 1);\n  CHECK_EQ(comments[0].as_string(), \" // this sets alpha\\n\");\n  comments.resize(0);\n}\n\nstatic void TestBigComment() {\n  string input;\n  for (int i = 0; i < 1024; ++i) {\n    char buf[1024];  // definitely big enough\n    sprintf(buf, \"    # Comment %d\\n\", i);\n    input += buf;\n  }\n  input += \"name = value;\\n\";\n\n  Scanner s(input.c_str());\n  s.SetSkipExpression(\"\\\\s+|#.*\\n\");\n\n  string name;\n  string value;\n  s.Consume(\"(\\\\w+) = (\\\\w+);\", &name, &value);\n  CHECK_EQ(name, \"name\");\n  CHECK_EQ(value, \"value\");\n}\n\n// TODO: also test scanner and big-comment in a thread with a\n//       small stack size\n\nint main(int argc, char** argv) {\n  (void)argc;\n  (void)argv;\n  TestScanner();\n  TestBigComment();\n\n  // Done\n  printf(\"OK\\n\");\n\n  return 0;\n}\n"
  },
  {
    "path": "src/pcre/pcre_string_utils.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains internal functions for comparing and finding the length\nof strings for different data item sizes. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#ifndef COMPILE_PCRE8\n\n/*************************************************\n*           Compare string utilities             *\n*************************************************/\n\n/* The following two functions compares two strings. Basically a strcmp\nfor non 8 bit characters.\n\nArguments:\n  str1        first string\n  str2        second string\n\nReturns:      0 if both string are equal (like strcmp), 1 otherwise\n*/\n\nint\nPRIV(strcmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2)\n{\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (*str1 != '\\0' || *str2 != '\\0')\n  {\n  c1 = *str1++;\n  c2 = *str2++;\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\n#ifdef COMPILE_PCRE32\n\nint\nPRIV(strcmp_uc_uc_utf)(const pcre_uchar *str1, const pcre_uchar *str2)\n{\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (*str1 != '\\0' || *str2 != '\\0')\n  {\n  c1 = UCHAR21INC(str1);\n  c2 = UCHAR21INC(str2);\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\n#endif /* COMPILE_PCRE32 */\n\nint\nPRIV(strcmp_uc_c8)(const pcre_uchar *str1, const char *str2)\n{\nconst pcre_uint8 *ustr2 = (pcre_uint8 *)str2;\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (*str1 != '\\0' || *ustr2 != '\\0')\n  {\n  c1 = *str1++;\n  c2 = (pcre_uchar)*ustr2++;\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\n#ifdef COMPILE_PCRE32\n\nint\nPRIV(strcmp_uc_c8_utf)(const pcre_uchar *str1, const char *str2)\n{\nconst pcre_uint8 *ustr2 = (pcre_uint8 *)str2;\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (*str1 != '\\0' || *ustr2 != '\\0')\n  {\n  c1 = UCHAR21INC(str1);\n  c2 = (pcre_uchar)*ustr2++;\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\n#endif /* COMPILE_PCRE32 */\n\n/* The following two functions compares two, fixed length\nstrings. Basically an strncmp for non 8 bit characters.\n\nArguments:\n  str1        first string\n  str2        second string\n  num         size of the string\n\nReturns:      0 if both string are equal (like strcmp), 1 otherwise\n*/\n\nint\nPRIV(strncmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2, unsigned int num)\n{\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (num-- > 0)\n  {\n  c1 = *str1++;\n  c2 = *str2++;\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\nint\nPRIV(strncmp_uc_c8)(const pcre_uchar *str1, const char *str2, unsigned int num)\n{\nconst pcre_uint8 *ustr2 = (pcre_uint8 *)str2;\npcre_uchar c1;\npcre_uchar c2;\n\nwhile (num-- > 0)\n  {\n  c1 = *str1++;\n  c2 = (pcre_uchar)*ustr2++;\n  if (c1 != c2)\n    return ((c1 > c2) << 1) - 1;\n  }\n/* Both length and characters must be equal. */\nreturn 0;\n}\n\n/* The following function returns with the length of\na zero terminated string. Basically an strlen for non 8 bit characters.\n\nArguments:\n  str         string\n\nReturns:      length of the string\n*/\n\nunsigned int\nPRIV(strlen_uc)(const pcre_uchar *str)\n{\nunsigned int len = 0;\nwhile (*str++ != 0)\n  len++;\nreturn len;\n}\n\n#endif /* !COMPILE_PCRE8 */\n\n/* End of pcre_string_utils.c */\n"
  },
  {
    "path": "src/pcre/pcre_stringpiece.cc",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wilsonh@google.com (Wilson Hsieh)\n//\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <iostream>\n#include \"pcrecpp_internal.h\"\n#include \"pcre_stringpiece.h\"\n\nstd::ostream& operator<<(std::ostream& o, const pcrecpp::StringPiece& piece) {\n  return (o << piece.as_string());\n}\n"
  },
  {
    "path": "src/pcre/pcre_stringpiece.h.in",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n//\n// A string like object that points into another piece of memory.\n// Useful for providing an interface that allows clients to easily\n// pass in either a \"const char*\" or a \"string\".\n//\n// Arghh!  I wish C++ literals were automatically of type \"string\".\n\n#ifndef _PCRE_STRINGPIECE_H\n#define _PCRE_STRINGPIECE_H\n\n#include <cstring>\n#include <string>\n#include <iosfwd>    // for ostream forward-declaration\n\n#if @pcre_have_type_traits@\n#define HAVE_TYPE_TRAITS\n#include <type_traits.h>\n#elif @pcre_have_bits_type_traits@\n#define HAVE_TYPE_TRAITS\n#include <bits/type_traits.h>\n#endif\n\n#include <pcre.h>\n\nnamespace pcrecpp {\n\nusing std::memcmp;\nusing std::strlen;\nusing std::string;\n\nclass PCRECPP_EXP_DEFN StringPiece {\n private:\n  const char*   ptr_;\n  int           length_;\n\n public:\n  // We provide non-explicit singleton constructors so users can pass\n  // in a \"const char*\" or a \"string\" wherever a \"StringPiece\" is\n  // expected.\n  StringPiece()\n    : ptr_(NULL), length_(0) { }\n  StringPiece(const char* str)\n    : ptr_(str), length_(static_cast<int>(strlen(ptr_))) { }\n  StringPiece(const unsigned char* str)\n    : ptr_(reinterpret_cast<const char*>(str)),\n      length_(static_cast<int>(strlen(ptr_))) { }\n  StringPiece(const string& str)\n    : ptr_(str.data()), length_(static_cast<int>(str.size())) { }\n  StringPiece(const char* offset, int len)\n    : ptr_(offset), length_(len) { }\n\n  // data() may return a pointer to a buffer with embedded NULs, and the\n  // returned buffer may or may not be null terminated.  Therefore it is\n  // typically a mistake to pass data() to a routine that expects a NUL\n  // terminated string.  Use \"as_string().c_str()\" if you really need to do\n  // this.  Or better yet, change your routine so it does not rely on NUL\n  // termination.\n  const char* data() const { return ptr_; }\n  int size() const { return length_; }\n  bool empty() const { return length_ == 0; }\n\n  void clear() { ptr_ = NULL; length_ = 0; }\n  void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; }\n  void set(const char* str) {\n    ptr_ = str;\n    length_ = static_cast<int>(strlen(str));\n  }\n  void set(const void* buffer, int len) {\n    ptr_ = reinterpret_cast<const char*>(buffer);\n    length_ = len;\n  }\n\n  char operator[](int i) const { return ptr_[i]; }\n\n  void remove_prefix(int n) {\n    ptr_ += n;\n    length_ -= n;\n  }\n\n  void remove_suffix(int n) {\n    length_ -= n;\n  }\n\n  bool operator==(const StringPiece& x) const {\n    return ((length_ == x.length_) &&\n            (memcmp(ptr_, x.ptr_, length_) == 0));\n  }\n  bool operator!=(const StringPiece& x) const {\n    return !(*this == x);\n  }\n\n#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp)                             \\\n  bool operator cmp (const StringPiece& x) const {                           \\\n    int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \\\n    return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_)));          \\\n  }\n  STRINGPIECE_BINARY_PREDICATE(<,  <);\n  STRINGPIECE_BINARY_PREDICATE(<=, <);\n  STRINGPIECE_BINARY_PREDICATE(>=, >);\n  STRINGPIECE_BINARY_PREDICATE(>,  >);\n#undef STRINGPIECE_BINARY_PREDICATE\n\n  int compare(const StringPiece& x) const {\n    int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_);\n    if (r == 0) {\n      if (length_ < x.length_) r = -1;\n      else if (length_ > x.length_) r = +1;\n    }\n    return r;\n  }\n\n  string as_string() const {\n    return string(data(), size());\n  }\n\n  void CopyToString(string* target) const {\n    target->assign(ptr_, length_);\n  }\n\n  // Does \"this\" start with \"x\"\n  bool starts_with(const StringPiece& x) const {\n    return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0));\n  }\n};\n\n}   // namespace pcrecpp\n\n// ------------------------------------------------------------------\n// Functions used to create STL containers that use StringPiece\n//  Remember that a StringPiece's lifetime had better be less than\n//  that of the underlying string or char*.  If it is not, then you\n//  cannot safely store a StringPiece into an STL container\n// ------------------------------------------------------------------\n\n#ifdef HAVE_TYPE_TRAITS\n// This makes vector<StringPiece> really fast for some STL implementations\ntemplate<> struct __type_traits<pcrecpp::StringPiece> {\n  typedef __true_type    has_trivial_default_constructor;\n  typedef __true_type    has_trivial_copy_constructor;\n  typedef __true_type    has_trivial_assignment_operator;\n  typedef __true_type    has_trivial_destructor;\n  typedef __true_type    is_POD_type;\n};\n#endif\n\n// allow StringPiece to be logged\nPCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o,\n                                          const pcrecpp::StringPiece& piece);\n\n#endif /* _PCRE_STRINGPIECE_H */\n"
  },
  {
    "path": "src/pcre/pcre_stringpiece_unittest.cc",
    "content": "// Copyright 2003 and onwards Google Inc.\n// Author: Sanjay Ghemawat\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <map>\n#include <algorithm>    // for make_pair\n\n#include \"pcrecpp.h\"\n#include \"pcre_stringpiece.h\"\n\n// CHECK dies with a fatal error if condition is not true.  It is *not*\n// controlled by NDEBUG, so the check will be executed regardless of\n// compilation mode.  Therefore, it is safe to do things like:\n//    CHECK(fp->Write(x) == 4)\n#define CHECK(condition) do {                           \\\n  if (!(condition)) {                                   \\\n    fprintf(stderr, \"%s:%d: Check failed: %s\\n\",        \\\n            __FILE__, __LINE__, #condition);            \\\n    exit(1);                                            \\\n  }                                                     \\\n} while (0)\n\nusing std::string;\nusing pcrecpp::StringPiece;\n\nstatic void CheckSTLComparator() {\n  string s1(\"foo\");\n  string s2(\"bar\");\n  string s3(\"baz\");\n\n  StringPiece p1(s1);\n  StringPiece p2(s2);\n  StringPiece p3(s3);\n\n  typedef std::map<StringPiece, int> TestMap;\n  TestMap map;\n\n  map.insert(std::make_pair(p1, 0));\n  map.insert(std::make_pair(p2, 1));\n  map.insert(std::make_pair(p3, 2));\n\n  CHECK(map.size() == 3);\n\n  TestMap::const_iterator iter = map.begin();\n  CHECK(iter->second == 1);\n  ++iter;\n  CHECK(iter->second == 2);\n  ++iter;\n  CHECK(iter->second == 0);\n  ++iter;\n  CHECK(iter == map.end());\n\n  TestMap::iterator new_iter = map.find(\"zot\");\n  CHECK(new_iter == map.end());\n\n  new_iter = map.find(\"bar\");\n  CHECK(new_iter != map.end());\n\n  map.erase(new_iter);\n  CHECK(map.size() == 2);\n\n  iter = map.begin();\n  CHECK(iter->second == 2);\n  ++iter;\n  CHECK(iter->second == 0);\n  ++iter;\n  CHECK(iter == map.end());\n}\n\nstatic void CheckComparisonOperators() {\n#define CMP_Y(op, x, y)                                         \\\n  CHECK( (StringPiece((x)) op StringPiece((y))));               \\\n  CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0))\n\n#define CMP_N(op, x, y)                                         \\\n  CHECK(!(StringPiece((x)) op StringPiece((y))));               \\\n  CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0))\n\n  CMP_Y(==, \"\",   \"\");\n  CMP_Y(==, \"a\",  \"a\");\n  CMP_Y(==, \"aa\", \"aa\");\n  CMP_N(==, \"a\",  \"\");\n  CMP_N(==, \"\",   \"a\");\n  CMP_N(==, \"a\",  \"b\");\n  CMP_N(==, \"a\",  \"aa\");\n  CMP_N(==, \"aa\", \"a\");\n\n  CMP_N(!=, \"\",   \"\");\n  CMP_N(!=, \"a\",  \"a\");\n  CMP_N(!=, \"aa\", \"aa\");\n  CMP_Y(!=, \"a\",  \"\");\n  CMP_Y(!=, \"\",   \"a\");\n  CMP_Y(!=, \"a\",  \"b\");\n  CMP_Y(!=, \"a\",  \"aa\");\n  CMP_Y(!=, \"aa\", \"a\");\n\n  CMP_Y(<, \"a\",  \"b\");\n  CMP_Y(<, \"a\",  \"aa\");\n  CMP_Y(<, \"aa\", \"b\");\n  CMP_Y(<, \"aa\", \"bb\");\n  CMP_N(<, \"a\",  \"a\");\n  CMP_N(<, \"b\",  \"a\");\n  CMP_N(<, \"aa\", \"a\");\n  CMP_N(<, \"b\",  \"aa\");\n  CMP_N(<, \"bb\", \"aa\");\n\n  CMP_Y(<=, \"a\",  \"a\");\n  CMP_Y(<=, \"a\",  \"b\");\n  CMP_Y(<=, \"a\",  \"aa\");\n  CMP_Y(<=, \"aa\", \"b\");\n  CMP_Y(<=, \"aa\", \"bb\");\n  CMP_N(<=, \"b\",  \"a\");\n  CMP_N(<=, \"aa\", \"a\");\n  CMP_N(<=, \"b\",  \"aa\");\n  CMP_N(<=, \"bb\", \"aa\");\n\n  CMP_N(>=, \"a\",  \"b\");\n  CMP_N(>=, \"a\",  \"aa\");\n  CMP_N(>=, \"aa\", \"b\");\n  CMP_N(>=, \"aa\", \"bb\");\n  CMP_Y(>=, \"a\",  \"a\");\n  CMP_Y(>=, \"b\",  \"a\");\n  CMP_Y(>=, \"aa\", \"a\");\n  CMP_Y(>=, \"b\",  \"aa\");\n  CMP_Y(>=, \"bb\", \"aa\");\n\n  CMP_N(>, \"a\",  \"a\");\n  CMP_N(>, \"a\",  \"b\");\n  CMP_N(>, \"a\",  \"aa\");\n  CMP_N(>, \"aa\", \"b\");\n  CMP_N(>, \"aa\", \"bb\");\n  CMP_Y(>, \"b\",  \"a\");\n  CMP_Y(>, \"aa\", \"a\");\n  CMP_Y(>, \"b\",  \"aa\");\n  CMP_Y(>, \"bb\", \"aa\");\n\n#undef CMP_Y\n#undef CMP_N\n}\n\nint main(int argc, char** argv) {\n  (void)argc;\n  (void)argv;\n  CheckComparisonOperators();\n  CheckSTLComparator();\n\n  printf(\"OK\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "src/pcre/pcre_study.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_study(), along with local\nsupporting functions. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7))\n\n/* Returns from set_start_bits() */\n\nenum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN };\n\n\n\n/*************************************************\n*   Find the minimum subject length for a group  *\n*************************************************/\n\n/* Scan a parenthesized group and compute the minimum length of subject that\nis needed to match it. This is a lower bound; it does not mean there is a\nstring of that length that matches. In UTF8 mode, the result is in characters\nrather than bytes.\n\nArguments:\n  re              compiled pattern block\n  code            pointer to start of group (the bracket)\n  startcode       pointer to start of the whole pattern's code\n  options         the compiling options\n  recurses        chain of recurse_check to catch mutual recursion\n  countptr        pointer to call count (to catch over complexity)\n\nReturns:   the minimum length\n           -1 if \\C in UTF-8 mode or (*ACCEPT) was encountered\n           -2 internal error (missing capturing bracket)\n           -3 internal error (opcode not listed)\n*/\n\nstatic int\nfind_minlength(const REAL_PCRE *re, const pcre_uchar *code,\n  const pcre_uchar *startcode, int options, recurse_check *recurses,\n  int *countptr)\n{\nint length = -1;\n/* PCRE_UTF16 has the same value as PCRE_UTF8. */\nBOOL utf = (options & PCRE_UTF8) != 0;\nBOOL had_recurse = FALSE;\nrecurse_check this_recurse;\nregister int branchlength = 0;\nregister pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE;\n\nif ((*countptr)++ > 1000) return -1;   /* too complex */\n\nif (*code == OP_CBRA || *code == OP_SCBRA ||\n    *code == OP_CBRAPOS || *code == OP_SCBRAPOS) cc += IMM2_SIZE;\n\n/* Scan along the opcodes for this branch. If we get to the end of the\nbranch, check the length against that of the other branches. */\n\nfor (;;)\n  {\n  int d, min;\n  pcre_uchar *cs, *ce;\n  register pcre_uchar op = *cc;\n\n  switch (op)\n    {\n    case OP_COND:\n    case OP_SCOND:\n\n    /* If there is only one branch in a condition, the implied branch has zero\n    length, so we don't add anything. This covers the DEFINE \"condition\"\n    automatically. */\n\n    cs = cc + GET(cc, 1);\n    if (*cs != OP_ALT)\n      {\n      cc = cs + 1 + LINK_SIZE;\n      break;\n      }\n\n    /* Otherwise we can fall through and treat it the same as any other\n    subpattern. */\n\n    case OP_CBRA:\n    case OP_SCBRA:\n    case OP_BRA:\n    case OP_SBRA:\n    case OP_CBRAPOS:\n    case OP_SCBRAPOS:\n    case OP_BRAPOS:\n    case OP_SBRAPOS:\n    case OP_ONCE:\n    case OP_ONCE_NC:\n    d = find_minlength(re, cc, startcode, options, recurses, countptr);\n    if (d < 0) return d;\n    branchlength += d;\n    do cc += GET(cc, 1); while (*cc == OP_ALT);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* ACCEPT makes things far too complicated; we have to give up. */\n\n    case OP_ACCEPT:\n    case OP_ASSERT_ACCEPT:\n    return -1;\n\n    /* Reached end of a branch; if it's a ket it is the end of a nested\n    call. If it's ALT it is an alternation in a nested call. If it is END it's\n    the end of the outer call. All can be handled by the same code. If an\n    ACCEPT was previously encountered, use the length that was in force at that\n    time, and pass back the shortest ACCEPT length. */\n\n    case OP_ALT:\n    case OP_KET:\n    case OP_KETRMAX:\n    case OP_KETRMIN:\n    case OP_KETRPOS:\n    case OP_END:\n    if (length < 0 || (!had_recurse && branchlength < length))\n      length = branchlength;\n    if (op != OP_ALT) return length;\n    cc += 1 + LINK_SIZE;\n    branchlength = 0;\n    had_recurse = FALSE;\n    break;\n\n    /* Skip over assertive subpatterns */\n\n    case OP_ASSERT:\n    case OP_ASSERT_NOT:\n    case OP_ASSERTBACK:\n    case OP_ASSERTBACK_NOT:\n    do cc += GET(cc, 1); while (*cc == OP_ALT);\n    /* Fall through */\n\n    /* Skip over things that don't match chars */\n\n    case OP_REVERSE:\n    case OP_CREF:\n    case OP_DNCREF:\n    case OP_RREF:\n    case OP_DNRREF:\n    case OP_DEF:\n    case OP_CALLOUT:\n    case OP_SOD:\n    case OP_SOM:\n    case OP_EOD:\n    case OP_EODN:\n    case OP_CIRC:\n    case OP_CIRCM:\n    case OP_DOLL:\n    case OP_DOLLM:\n    case OP_NOT_WORD_BOUNDARY:\n    case OP_WORD_BOUNDARY:\n    cc += PRIV(OP_lengths)[*cc];\n    break;\n\n    /* Skip over a subpattern that has a {0} or {0,x} quantifier */\n\n    case OP_BRAZERO:\n    case OP_BRAMINZERO:\n    case OP_BRAPOSZERO:\n    case OP_SKIPZERO:\n    cc += PRIV(OP_lengths)[*cc];\n    do cc += GET(cc, 1); while (*cc == OP_ALT);\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* Handle literal characters and + repetitions */\n\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n    case OP_PLUS:\n    case OP_PLUSI:\n    case OP_MINPLUS:\n    case OP_MINPLUSI:\n    case OP_POSPLUS:\n    case OP_POSPLUSI:\n    case OP_NOTPLUS:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUS:\n    case OP_NOTMINPLUSI:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSPLUSI:\n    branchlength++;\n    cc += 2;\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    case OP_TYPEPLUS:\n    case OP_TYPEMINPLUS:\n    case OP_TYPEPOSPLUS:\n    branchlength++;\n    cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2;\n    break;\n\n    /* Handle exact repetitions. The count is already in characters, but we\n    need to skip over a multibyte character in UTF8 mode.  */\n\n    case OP_EXACT:\n    case OP_EXACTI:\n    case OP_NOTEXACT:\n    case OP_NOTEXACTI:\n    branchlength += GET2(cc,1);\n    cc += 2 + IMM2_SIZE;\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    case OP_TYPEEXACT:\n    branchlength += GET2(cc,1);\n    cc += 2 + IMM2_SIZE + ((cc[1 + IMM2_SIZE] == OP_PROP\n      || cc[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0);\n    break;\n\n    /* Handle single-char non-literal matchers */\n\n    case OP_PROP:\n    case OP_NOTPROP:\n    cc += 2;\n    /* Fall through */\n\n    case OP_NOT_DIGIT:\n    case OP_DIGIT:\n    case OP_NOT_WHITESPACE:\n    case OP_WHITESPACE:\n    case OP_NOT_WORDCHAR:\n    case OP_WORDCHAR:\n    case OP_ANY:\n    case OP_ALLANY:\n    case OP_EXTUNI:\n    case OP_HSPACE:\n    case OP_NOT_HSPACE:\n    case OP_VSPACE:\n    case OP_NOT_VSPACE:\n    branchlength++;\n    cc++;\n    break;\n\n    /* \"Any newline\" might match two characters, but it also might match just\n    one. */\n\n    case OP_ANYNL:\n    branchlength += 1;\n    cc++;\n    break;\n\n    /* The single-byte matcher means we can't proceed in UTF-8 mode. (In\n    non-UTF-8 mode \\C will actually be turned into OP_ALLANY, so won't ever\n    appear, but leave the code, just in case.) */\n\n    case OP_ANYBYTE:\n#ifdef SUPPORT_UTF\n    if (utf) return -1;\n#endif\n    branchlength++;\n    cc++;\n    break;\n\n    /* For repeated character types, we have to test for \\p and \\P, which have\n    an extra two bytes of parameters. */\n\n    case OP_TYPESTAR:\n    case OP_TYPEMINSTAR:\n    case OP_TYPEQUERY:\n    case OP_TYPEMINQUERY:\n    case OP_TYPEPOSSTAR:\n    case OP_TYPEPOSQUERY:\n    if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2;\n    cc += PRIV(OP_lengths)[op];\n    break;\n\n    case OP_TYPEUPTO:\n    case OP_TYPEMINUPTO:\n    case OP_TYPEPOSUPTO:\n    if (cc[1 + IMM2_SIZE] == OP_PROP\n      || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2;\n    cc += PRIV(OP_lengths)[op];\n    break;\n\n    /* Check a class for variable quantification */\n\n    case OP_CLASS:\n    case OP_NCLASS:\n#if defined SUPPORT_UTF || defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n    case OP_XCLASS:\n    /* The original code caused an unsigned overflow in 64 bit systems,\n    so now we use a conditional statement. */\n    if (op == OP_XCLASS)\n      cc += GET(cc, 1);\n    else\n      cc += PRIV(OP_lengths)[OP_CLASS];\n#else\n    cc += PRIV(OP_lengths)[OP_CLASS];\n#endif\n\n    switch (*cc)\n      {\n      case OP_CRPLUS:\n      case OP_CRMINPLUS:\n      case OP_CRPOSPLUS:\n      branchlength++;\n      /* Fall through */\n\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSSTAR:\n      case OP_CRPOSQUERY:\n      cc++;\n      break;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      branchlength += GET2(cc,1);\n      cc += 1 + 2 * IMM2_SIZE;\n      break;\n\n      default:\n      branchlength++;\n      break;\n      }\n    break;\n\n    /* Backreferences and subroutine calls are treated in the same way: we find\n    the minimum length for the subpattern. A recursion, however, causes an\n    a flag to be set that causes the length of this branch to be ignored. The\n    logic is that a recursion can only make sense if there is another\n    alternation that stops the recursing. That will provide the minimum length\n    (when no recursion happens). A backreference within the group that it is\n    referencing behaves in the same way.\n\n    If PCRE_JAVASCRIPT_COMPAT is set, a backreference to an unset bracket\n    matches an empty string (by default it causes a matching failure), so in\n    that case we must set the minimum length to zero. */\n\n    case OP_DNREF:     /* Duplicate named pattern back reference */\n    case OP_DNREFI:\n    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0)\n      {\n      int count = GET2(cc, 1+IMM2_SIZE);\n      pcre_uchar *slot = (pcre_uchar *)re +\n        re->name_table_offset + GET2(cc, 1) * re->name_entry_size;\n      d = INT_MAX;\n      while (count-- > 0)\n        {\n        ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0));\n        if (cs == NULL) return -2;\n        do ce += GET(ce, 1); while (*ce == OP_ALT);\n        if (cc > cs && cc < ce)     /* Simple recursion */\n          {\n          d = 0;\n          had_recurse = TRUE;\n          break;\n          }\n        else\n          {\n          recurse_check *r = recurses;\n          for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;\n          if (r != NULL)           /* Mutual recursion */\n            {\n            d = 0;\n            had_recurse = TRUE;\n            break;\n            }\n          else\n            {\n            int dd;\n            this_recurse.prev = recurses;\n            this_recurse.group = cs;\n            dd = find_minlength(re, cs, startcode, options, &this_recurse,\n              countptr);\n            if (dd < d) d = dd;\n            }\n          }\n        slot += re->name_entry_size;\n        }\n      }\n    else d = 0;\n    cc += 1 + 2*IMM2_SIZE;\n    goto REPEAT_BACK_REFERENCE;\n\n    case OP_REF:      /* Single back reference */\n    case OP_REFI:\n    if ((options & PCRE_JAVASCRIPT_COMPAT) == 0)\n      {\n      ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1));\n      if (cs == NULL) return -2;\n      do ce += GET(ce, 1); while (*ce == OP_ALT);\n      if (cc > cs && cc < ce)    /* Simple recursion */\n        {\n        d = 0;\n        had_recurse = TRUE;\n        }\n      else\n        {\n        recurse_check *r = recurses;\n        for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;\n        if (r != NULL)           /* Mutual recursion */\n          {\n          d = 0;\n          had_recurse = TRUE;\n          }\n        else\n          {\n          this_recurse.prev = recurses;\n          this_recurse.group = cs;\n          d = find_minlength(re, cs, startcode, options, &this_recurse,\n            countptr);\n          }\n        }\n      }\n    else d = 0;\n    cc += 1 + IMM2_SIZE;\n\n    /* Handle repeated back references */\n\n    REPEAT_BACK_REFERENCE:\n    switch (*cc)\n      {\n      case OP_CRSTAR:\n      case OP_CRMINSTAR:\n      case OP_CRQUERY:\n      case OP_CRMINQUERY:\n      case OP_CRPOSSTAR:\n      case OP_CRPOSQUERY:\n      min = 0;\n      cc++;\n      break;\n\n      case OP_CRPLUS:\n      case OP_CRMINPLUS:\n      case OP_CRPOSPLUS:\n      min = 1;\n      cc++;\n      break;\n\n      case OP_CRRANGE:\n      case OP_CRMINRANGE:\n      case OP_CRPOSRANGE:\n      min = GET2(cc, 1);\n      cc += 1 + 2 * IMM2_SIZE;\n      break;\n\n      default:\n      min = 1;\n      break;\n      }\n\n    branchlength += min * d;\n    break;\n\n    /* We can easily detect direct recursion, but not mutual recursion. This is\n    caught by a recursion depth count. */\n\n    case OP_RECURSE:\n    cs = ce = (pcre_uchar *)startcode + GET(cc, 1);\n    do ce += GET(ce, 1); while (*ce == OP_ALT);\n    if (cc > cs && cc < ce)    /* Simple recursion */\n      had_recurse = TRUE;\n    else\n      {\n      recurse_check *r = recurses;\n      for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;\n      if (r != NULL)           /* Mutual recursion */\n        had_recurse = TRUE;\n      else\n        {\n        this_recurse.prev = recurses;\n        this_recurse.group = cs;\n        branchlength += find_minlength(re, cs, startcode, options,\n          &this_recurse, countptr);\n        }\n      }\n    cc += 1 + LINK_SIZE;\n    break;\n\n    /* Anything else does not or need not match a character. We can get the\n    item's length from the table, but for those that can match zero occurrences\n    of a character, we must take special action for UTF-8 characters. As it\n    happens, the \"NOT\" versions of these opcodes are used at present only for\n    ASCII characters, so they could be omitted from this list. However, in\n    future that may change, so we include them here so as not to leave a\n    gotcha for a future maintainer. */\n\n    case OP_UPTO:\n    case OP_UPTOI:\n    case OP_NOTUPTO:\n    case OP_NOTUPTOI:\n    case OP_MINUPTO:\n    case OP_MINUPTOI:\n    case OP_NOTMINUPTO:\n    case OP_NOTMINUPTOI:\n    case OP_POSUPTO:\n    case OP_POSUPTOI:\n    case OP_NOTPOSUPTO:\n    case OP_NOTPOSUPTOI:\n\n    case OP_STAR:\n    case OP_STARI:\n    case OP_NOTSTAR:\n    case OP_NOTSTARI:\n    case OP_MINSTAR:\n    case OP_MINSTARI:\n    case OP_NOTMINSTAR:\n    case OP_NOTMINSTARI:\n    case OP_POSSTAR:\n    case OP_POSSTARI:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSSTARI:\n\n    case OP_QUERY:\n    case OP_QUERYI:\n    case OP_NOTQUERY:\n    case OP_NOTQUERYI:\n    case OP_MINQUERY:\n    case OP_MINQUERYI:\n    case OP_NOTMINQUERY:\n    case OP_NOTMINQUERYI:\n    case OP_POSQUERY:\n    case OP_POSQUERYI:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSQUERYI:\n\n    cc += PRIV(OP_lengths)[op];\n#ifdef SUPPORT_UTF\n    if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]);\n#endif\n    break;\n\n    /* Skip these, but we need to add in the name length. */\n\n    case OP_MARK:\n    case OP_PRUNE_ARG:\n    case OP_SKIP_ARG:\n    case OP_THEN_ARG:\n    cc += PRIV(OP_lengths)[op] + cc[1];\n    break;\n\n    /* The remaining opcodes are just skipped over. */\n\n    case OP_CLOSE:\n    case OP_COMMIT:\n    case OP_FAIL:\n    case OP_PRUNE:\n    case OP_SET_SOM:\n    case OP_SKIP:\n    case OP_THEN:\n    cc += PRIV(OP_lengths)[op];\n    break;\n\n    /* This should not occur: we list all opcodes explicitly so that when\n    new ones get added they are properly considered. */\n\n    default:\n    return -3;\n    }\n  }\n/* Control never gets here */\n}\n\n\n\n/*************************************************\n*      Set a bit and maybe its alternate case    *\n*************************************************/\n\n/* Given a character, set its first byte's bit in the table, and also the\ncorresponding bit for the other version of a letter if we are caseless. In\nUTF-8 mode, for characters greater than 127, we can only do the caseless thing\nwhen Unicode property support is available.\n\nArguments:\n  start_bits    points to the bit map\n  p             points to the character\n  caseless      the caseless flag\n  cd            the block with char table pointers\n  utf           TRUE for UTF-8 / UTF-16 / UTF-32 mode\n\nReturns:        pointer after the character\n*/\n\nstatic const pcre_uchar *\nset_table_bit(pcre_uint8 *start_bits, const pcre_uchar *p, BOOL caseless,\n  compile_data *cd, BOOL utf)\n{\npcre_uint32 c = *p;\n\n#ifdef COMPILE_PCRE8\nSET_BIT(c);\n\n#ifdef SUPPORT_UTF\nif (utf && c > 127)\n  {\n  GETCHARINC(c, p);\n#ifdef SUPPORT_UCP\n  if (caseless)\n    {\n    pcre_uchar buff[6];\n    c = UCD_OTHERCASE(c);\n    (void)PRIV(ord2utf)(c, buff);\n    SET_BIT(buff[0]);\n    }\n#endif  /* Not SUPPORT_UCP */\n  return p;\n  }\n#else   /* Not SUPPORT_UTF */\n(void)(utf);   /* Stops warning for unused parameter */\n#endif  /* SUPPORT_UTF */\n\n/* Not UTF-8 mode, or character is less than 127. */\n\nif (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);\nreturn p + 1;\n#endif  /* COMPILE_PCRE8 */\n\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\nif (c > 0xff)\n  {\n  c = 0xff;\n  caseless = FALSE;\n  }\nSET_BIT(c);\n\n#ifdef SUPPORT_UTF\nif (utf && c > 127)\n  {\n  GETCHARINC(c, p);\n#ifdef SUPPORT_UCP\n  if (caseless)\n    {\n    c = UCD_OTHERCASE(c);\n    if (c > 0xff)\n      c = 0xff;\n    SET_BIT(c);\n    }\n#endif  /* SUPPORT_UCP */\n  return p;\n  }\n#else   /* Not SUPPORT_UTF */\n(void)(utf);   /* Stops warning for unused parameter */\n#endif  /* SUPPORT_UTF */\n\nif (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);\nreturn p + 1;\n#endif\n}\n\n\n\n/*************************************************\n*     Set bits for a positive character type     *\n*************************************************/\n\n/* This function sets starting bits for a character type. In UTF-8 mode, we can\nonly do a direct setting for bytes less than 128, as otherwise there can be\nconfusion with bytes in the middle of UTF-8 characters. In a \"traditional\"\nenvironment, the tables will only recognize ASCII characters anyway, but in at\nleast one Windows environment, some higher bytes bits were set in the tables.\nSo we deal with that case by considering the UTF-8 encoding.\n\nArguments:\n  start_bits     the starting bitmap\n  cbit type      the type of character wanted\n  table_limit    32 for non-UTF-8; 16 for UTF-8\n  cd             the block with char table pointers\n\nReturns:         nothing\n*/\n\nstatic void\nset_type_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit,\n  compile_data *cd)\n{\nregister pcre_uint32 c;\nfor (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type];\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nif (table_limit == 32) return;\nfor (c = 128; c < 256; c++)\n  {\n  if ((cd->cbits[c/8] & (1 << (c&7))) != 0)\n    {\n    pcre_uchar buff[6];\n    (void)PRIV(ord2utf)(c, buff);\n    SET_BIT(buff[0]);\n    }\n  }\n#endif\n}\n\n\n/*************************************************\n*     Set bits for a negative character type     *\n*************************************************/\n\n/* This function sets starting bits for a negative character type such as \\D.\nIn UTF-8 mode, we can only do a direct setting for bytes less than 128, as\notherwise there can be confusion with bytes in the middle of UTF-8 characters.\nUnlike in the positive case, where we can set appropriate starting bits for\nspecific high-valued UTF-8 characters, in this case we have to set the bits for\nall high-valued characters. The lowest is 0xc2, but we overkill by starting at\n0xc0 (192) for simplicity.\n\nArguments:\n  start_bits     the starting bitmap\n  cbit type      the type of character wanted\n  table_limit    32 for non-UTF-8; 16 for UTF-8\n  cd             the block with char table pointers\n\nReturns:         nothing\n*/\n\nstatic void\nset_nottype_bits(pcre_uint8 *start_bits, int cbit_type, unsigned int table_limit,\n  compile_data *cd)\n{\nregister pcre_uint32 c;\nfor (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type];\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nif (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff;\n#endif\n}\n\n\n\n/*************************************************\n*          Create bitmap of starting bytes       *\n*************************************************/\n\n/* This function scans a compiled unanchored expression recursively and\nattempts to build a bitmap of the set of possible starting bytes. As time goes\nby, we may be able to get more clever at doing this. The SSB_CONTINUE return is\nuseful for parenthesized groups in patterns such as (a*)b where the group\nprovides some optional starting bytes but scanning must continue at the outer\nlevel to find at least one mandatory byte. At the outermost level, this\nfunction fails unless the result is SSB_DONE.\n\nArguments:\n  code         points to an expression\n  start_bits   points to a 32-byte table, initialized to 0\n  utf          TRUE if in UTF-8 / UTF-16 / UTF-32 mode\n  cd           the block with char table pointers\n\nReturns:       SSB_FAIL     => Failed to find any starting bytes\n               SSB_DONE     => Found mandatory starting bytes\n               SSB_CONTINUE => Found optional starting bytes\n               SSB_UNKNOWN  => Hit an unrecognized opcode\n*/\n\nstatic int\nset_start_bits(const pcre_uchar *code, pcre_uint8 *start_bits, BOOL utf,\n  compile_data *cd)\n{\nregister pcre_uint32 c;\nint yield = SSB_DONE;\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\nint table_limit = utf? 16:32;\n#else\nint table_limit = 32;\n#endif\n\n#if 0\n/* ========================================================================= */\n/* The following comment and code was inserted in January 1999. In May 2006,\nwhen it was observed to cause compiler warnings about unused values, I took it\nout again. If anybody is still using OS/2, they will have to put it back\nmanually. */\n\n/* This next statement and the later reference to dummy are here in order to\ntrick the optimizer of the IBM C compiler for OS/2 into generating correct\ncode. Apparently IBM isn't going to fix the problem, and we would rather not\ndisable optimization (in this module it actually makes a big difference, and\nthe pcre module can use all the optimization it can get). */\n\nvolatile int dummy;\n/* ========================================================================= */\n#endif\n\ndo\n  {\n  BOOL try_next = TRUE;\n  const pcre_uchar *tcode = code + 1 + LINK_SIZE;\n\n  if (*code == OP_CBRA || *code == OP_SCBRA ||\n      *code == OP_CBRAPOS || *code == OP_SCBRAPOS) tcode += IMM2_SIZE;\n\n  while (try_next)    /* Loop for items in this branch */\n    {\n    int rc;\n\n    switch(*tcode)\n      {\n      /* If we reach something we don't understand, it means a new opcode has\n      been created that hasn't been added to this code. Hopefully this problem\n      will be discovered during testing. */\n\n      default:\n      return SSB_UNKNOWN;\n\n      /* Fail for a valid opcode that implies no starting bits. */\n\n      case OP_ACCEPT:\n      case OP_ASSERT_ACCEPT:\n      case OP_ALLANY:\n      case OP_ANY:\n      case OP_ANYBYTE:\n      case OP_CIRC:\n      case OP_CIRCM:\n      case OP_CLOSE:\n      case OP_COMMIT:\n      case OP_COND:\n      case OP_CREF:\n      case OP_DEF:\n      case OP_DNCREF:\n      case OP_DNREF:\n      case OP_DNREFI:\n      case OP_DNRREF:\n      case OP_DOLL:\n      case OP_DOLLM:\n      case OP_END:\n      case OP_EOD:\n      case OP_EODN:\n      case OP_EXTUNI:\n      case OP_FAIL:\n      case OP_MARK:\n      case OP_NOT:\n      case OP_NOTEXACT:\n      case OP_NOTEXACTI:\n      case OP_NOTI:\n      case OP_NOTMINPLUS:\n      case OP_NOTMINPLUSI:\n      case OP_NOTMINQUERY:\n      case OP_NOTMINQUERYI:\n      case OP_NOTMINSTAR:\n      case OP_NOTMINSTARI:\n      case OP_NOTMINUPTO:\n      case OP_NOTMINUPTOI:\n      case OP_NOTPLUS:\n      case OP_NOTPLUSI:\n      case OP_NOTPOSPLUS:\n      case OP_NOTPOSPLUSI:\n      case OP_NOTPOSQUERY:\n      case OP_NOTPOSQUERYI:\n      case OP_NOTPOSSTAR:\n      case OP_NOTPOSSTARI:\n      case OP_NOTPOSUPTO:\n      case OP_NOTPOSUPTOI:\n      case OP_NOTPROP:\n      case OP_NOTQUERY:\n      case OP_NOTQUERYI:\n      case OP_NOTSTAR:\n      case OP_NOTSTARI:\n      case OP_NOTUPTO:\n      case OP_NOTUPTOI:\n      case OP_NOT_HSPACE:\n      case OP_NOT_VSPACE:\n      case OP_PRUNE:\n      case OP_PRUNE_ARG:\n      case OP_RECURSE:\n      case OP_REF:\n      case OP_REFI:\n      case OP_REVERSE:\n      case OP_RREF:\n      case OP_SCOND:\n      case OP_SET_SOM:\n      case OP_SKIP:\n      case OP_SKIP_ARG:\n      case OP_SOD:\n      case OP_SOM:\n      case OP_THEN:\n      case OP_THEN_ARG:\n      return SSB_FAIL;\n\n      /* A \"real\" property test implies no starting bits, but the fake property\n      PT_CLIST identifies a list of characters. These lists are short, as they\n      are used for characters with more than one \"other case\", so there is no\n      point in recognizing them for OP_NOTPROP. */\n\n      case OP_PROP:\n      if (tcode[1] != PT_CLIST) return SSB_FAIL;\n        {\n        const pcre_uint32 *p = PRIV(ucd_caseless_sets) + tcode[2];\n        while ((c = *p++) < NOTACHAR)\n          {\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n          if (utf)\n            {\n            pcre_uchar buff[6];\n            (void)PRIV(ord2utf)(c, buff);\n            c = buff[0];\n            }\n#endif\n          if (c > 0xff) SET_BIT(0xff); else SET_BIT(c);\n          }\n        }\n      try_next = FALSE;\n      break;\n\n      /* We can ignore word boundary tests. */\n\n      case OP_WORD_BOUNDARY:\n      case OP_NOT_WORD_BOUNDARY:\n      tcode++;\n      break;\n\n      /* If we hit a bracket or a positive lookahead assertion, recurse to set\n      bits from within the subpattern. If it can't find anything, we have to\n      give up. If it finds some mandatory character(s), we are done for this\n      branch. Otherwise, carry on scanning after the subpattern. */\n\n      case OP_BRA:\n      case OP_SBRA:\n      case OP_CBRA:\n      case OP_SCBRA:\n      case OP_BRAPOS:\n      case OP_SBRAPOS:\n      case OP_CBRAPOS:\n      case OP_SCBRAPOS:\n      case OP_ONCE:\n      case OP_ONCE_NC:\n      case OP_ASSERT:\n      rc = set_start_bits(tcode, start_bits, utf, cd);\n      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;\n      if (rc == SSB_DONE) try_next = FALSE; else\n        {\n        do tcode += GET(tcode, 1); while (*tcode == OP_ALT);\n        tcode += 1 + LINK_SIZE;\n        }\n      break;\n\n      /* If we hit ALT or KET, it means we haven't found anything mandatory in\n      this branch, though we might have found something optional. For ALT, we\n      continue with the next alternative, but we have to arrange that the final\n      result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET,\n      return SSB_CONTINUE: if this is the top level, that indicates failure,\n      but after a nested subpattern, it causes scanning to continue. */\n\n      case OP_ALT:\n      yield = SSB_CONTINUE;\n      try_next = FALSE;\n      break;\n\n      case OP_KET:\n      case OP_KETRMAX:\n      case OP_KETRMIN:\n      case OP_KETRPOS:\n      return SSB_CONTINUE;\n\n      /* Skip over callout */\n\n      case OP_CALLOUT:\n      tcode += 2 + 2*LINK_SIZE;\n      break;\n\n      /* Skip over lookbehind and negative lookahead assertions */\n\n      case OP_ASSERT_NOT:\n      case OP_ASSERTBACK:\n      case OP_ASSERTBACK_NOT:\n      do tcode += GET(tcode, 1); while (*tcode == OP_ALT);\n      tcode += 1 + LINK_SIZE;\n      break;\n\n      /* BRAZERO does the bracket, but carries on. */\n\n      case OP_BRAZERO:\n      case OP_BRAMINZERO:\n      case OP_BRAPOSZERO:\n      rc = set_start_bits(++tcode, start_bits, utf, cd);\n      if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;\n/* =========================================================================\n      See the comment at the head of this function concerning the next line,\n      which was an old fudge for the benefit of OS/2.\n      dummy = 1;\n  ========================================================================= */\n      do tcode += GET(tcode,1); while (*tcode == OP_ALT);\n      tcode += 1 + LINK_SIZE;\n      break;\n\n      /* SKIPZERO skips the bracket. */\n\n      case OP_SKIPZERO:\n      tcode++;\n      do tcode += GET(tcode,1); while (*tcode == OP_ALT);\n      tcode += 1 + LINK_SIZE;\n      break;\n\n      /* Single-char * or ? sets the bit and tries the next item */\n\n      case OP_STAR:\n      case OP_MINSTAR:\n      case OP_POSSTAR:\n      case OP_QUERY:\n      case OP_MINQUERY:\n      case OP_POSQUERY:\n      tcode = set_table_bit(start_bits, tcode + 1, FALSE, cd, utf);\n      break;\n\n      case OP_STARI:\n      case OP_MINSTARI:\n      case OP_POSSTARI:\n      case OP_QUERYI:\n      case OP_MINQUERYI:\n      case OP_POSQUERYI:\n      tcode = set_table_bit(start_bits, tcode + 1, TRUE, cd, utf);\n      break;\n\n      /* Single-char upto sets the bit and tries the next */\n\n      case OP_UPTO:\n      case OP_MINUPTO:\n      case OP_POSUPTO:\n      tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, FALSE, cd, utf);\n      break;\n\n      case OP_UPTOI:\n      case OP_MINUPTOI:\n      case OP_POSUPTOI:\n      tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, TRUE, cd, utf);\n      break;\n\n      /* At least one single char sets the bit and stops */\n\n      case OP_EXACT:\n      tcode += IMM2_SIZE;\n      /* Fall through */\n      case OP_CHAR:\n      case OP_PLUS:\n      case OP_MINPLUS:\n      case OP_POSPLUS:\n      (void)set_table_bit(start_bits, tcode + 1, FALSE, cd, utf);\n      try_next = FALSE;\n      break;\n\n      case OP_EXACTI:\n      tcode += IMM2_SIZE;\n      /* Fall through */\n      case OP_CHARI:\n      case OP_PLUSI:\n      case OP_MINPLUSI:\n      case OP_POSPLUSI:\n      (void)set_table_bit(start_bits, tcode + 1, TRUE, cd, utf);\n      try_next = FALSE;\n      break;\n\n      /* Special spacing and line-terminating items. These recognize specific\n      lists of characters. The difference between VSPACE and ANYNL is that the\n      latter can match the two-character CRLF sequence, but that is not\n      relevant for finding the first character, so their code here is\n      identical. */\n\n      case OP_HSPACE:\n      SET_BIT(CHAR_HT);\n      SET_BIT(CHAR_SPACE);\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n#ifdef COMPILE_PCRE8\n        SET_BIT(0xC2);  /* For U+00A0 */\n        SET_BIT(0xE1);  /* For U+1680, U+180E */\n        SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */\n        SET_BIT(0xE3);  /* For U+3000 */\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n        SET_BIT(0xA0);\n        SET_BIT(0xFF);  /* For characters > 255 */\n#endif  /* COMPILE_PCRE[8|16|32] */\n        }\n      else\n#endif /* SUPPORT_UTF */\n        {\n#ifndef EBCDIC\n        SET_BIT(0xA0);\n#endif  /* Not EBCDIC */\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n        SET_BIT(0xFF);  /* For characters > 255 */\n#endif  /* COMPILE_PCRE[16|32] */\n        }\n      try_next = FALSE;\n      break;\n\n      case OP_ANYNL:\n      case OP_VSPACE:\n      SET_BIT(CHAR_LF);\n      SET_BIT(CHAR_VT);\n      SET_BIT(CHAR_FF);\n      SET_BIT(CHAR_CR);\n#ifdef SUPPORT_UTF\n      if (utf)\n        {\n#ifdef COMPILE_PCRE8\n        SET_BIT(0xC2);  /* For U+0085 */\n        SET_BIT(0xE2);  /* For U+2028, U+2029 */\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n        SET_BIT(CHAR_NEL);\n        SET_BIT(0xFF);  /* For characters > 255 */\n#endif  /* COMPILE_PCRE[8|16|32] */\n        }\n      else\n#endif /* SUPPORT_UTF */\n        {\n        SET_BIT(CHAR_NEL);\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n        SET_BIT(0xFF);  /* For characters > 255 */\n#endif\n        }\n      try_next = FALSE;\n      break;\n\n      /* Single character types set the bits and stop. Note that if PCRE_UCP\n      is set, we do not see these op codes because \\d etc are converted to\n      properties. Therefore, these apply in the case when only characters less\n      than 256 are recognized to match the types. */\n\n      case OP_NOT_DIGIT:\n      set_nottype_bits(start_bits, cbit_digit, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      case OP_DIGIT:\n      set_type_bits(start_bits, cbit_digit, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      /* The cbit_space table has vertical tab as whitespace; we no longer\n      have to play fancy tricks because Perl added VT to its whitespace at\n      release 5.18. PCRE added it at release 8.34. */\n\n      case OP_NOT_WHITESPACE:\n      set_nottype_bits(start_bits, cbit_space, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      case OP_WHITESPACE:\n      set_type_bits(start_bits, cbit_space, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      case OP_NOT_WORDCHAR:\n      set_nottype_bits(start_bits, cbit_word, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      case OP_WORDCHAR:\n      set_type_bits(start_bits, cbit_word, table_limit, cd);\n      try_next = FALSE;\n      break;\n\n      /* One or more character type fudges the pointer and restarts, knowing\n      it will hit a single character type and stop there. */\n\n      case OP_TYPEPLUS:\n      case OP_TYPEMINPLUS:\n      case OP_TYPEPOSPLUS:\n      tcode++;\n      break;\n\n      case OP_TYPEEXACT:\n      tcode += 1 + IMM2_SIZE;\n      break;\n\n      /* Zero or more repeats of character types set the bits and then\n      try again. */\n\n      case OP_TYPEUPTO:\n      case OP_TYPEMINUPTO:\n      case OP_TYPEPOSUPTO:\n      tcode += IMM2_SIZE;  /* Fall through */\n\n      case OP_TYPESTAR:\n      case OP_TYPEMINSTAR:\n      case OP_TYPEPOSSTAR:\n      case OP_TYPEQUERY:\n      case OP_TYPEMINQUERY:\n      case OP_TYPEPOSQUERY:\n      switch(tcode[1])\n        {\n        default:\n        case OP_ANY:\n        case OP_ALLANY:\n        return SSB_FAIL;\n\n        case OP_HSPACE:\n        SET_BIT(CHAR_HT);\n        SET_BIT(CHAR_SPACE);\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n#ifdef COMPILE_PCRE8\n          SET_BIT(0xC2);  /* For U+00A0 */\n          SET_BIT(0xE1);  /* For U+1680, U+180E */\n          SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */\n          SET_BIT(0xE3);  /* For U+3000 */\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n          SET_BIT(0xA0);\n          SET_BIT(0xFF);  /* For characters > 255 */\n#endif  /* COMPILE_PCRE[8|16|32] */\n          }\n        else\n#endif /* SUPPORT_UTF */\n#ifndef EBCDIC\n          SET_BIT(0xA0);\n#endif  /* Not EBCDIC */\n        break;\n\n        case OP_ANYNL:\n        case OP_VSPACE:\n        SET_BIT(CHAR_LF);\n        SET_BIT(CHAR_VT);\n        SET_BIT(CHAR_FF);\n        SET_BIT(CHAR_CR);\n#ifdef SUPPORT_UTF\n        if (utf)\n          {\n#ifdef COMPILE_PCRE8\n          SET_BIT(0xC2);  /* For U+0085 */\n          SET_BIT(0xE2);  /* For U+2028, U+2029 */\n#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n          SET_BIT(CHAR_NEL);\n          SET_BIT(0xFF);  /* For characters > 255 */\n#endif  /* COMPILE_PCRE16 */\n          }\n        else\n#endif /* SUPPORT_UTF */\n          SET_BIT(CHAR_NEL);\n        break;\n\n        case OP_NOT_DIGIT:\n        set_nottype_bits(start_bits, cbit_digit, table_limit, cd);\n        break;\n\n        case OP_DIGIT:\n        set_type_bits(start_bits, cbit_digit, table_limit, cd);\n        break;\n\n        /* The cbit_space table has vertical tab as whitespace; we no longer\n        have to play fancy tricks because Perl added VT to its whitespace at\n        release 5.18. PCRE added it at release 8.34. */\n\n        case OP_NOT_WHITESPACE:\n        set_nottype_bits(start_bits, cbit_space, table_limit, cd);\n        break;\n\n        case OP_WHITESPACE:\n        set_type_bits(start_bits, cbit_space, table_limit, cd);\n        break;\n\n        case OP_NOT_WORDCHAR:\n        set_nottype_bits(start_bits, cbit_word, table_limit, cd);\n        break;\n\n        case OP_WORDCHAR:\n        set_type_bits(start_bits, cbit_word, table_limit, cd);\n        break;\n        }\n\n      tcode += 2;\n      break;\n\n      /* Character class where all the information is in a bit map: set the\n      bits and either carry on or not, according to the repeat count. If it was\n      a negative class, and we are operating with UTF-8 characters, any byte\n      with a value >= 0xc4 is a potentially valid starter because it starts a\n      character with a value > 255. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n      case OP_XCLASS:\n      if ((tcode[1 + LINK_SIZE] & XCL_HASPROP) != 0)\n        return SSB_FAIL;\n      /* All bits are set. */\n      if ((tcode[1 + LINK_SIZE] & XCL_MAP) == 0 && (tcode[1 + LINK_SIZE] & XCL_NOT) != 0)\n        return SSB_FAIL;\n#endif\n      /* Fall through */\n\n      case OP_NCLASS:\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n      if (utf)\n        {\n        start_bits[24] |= 0xf0;              /* Bits for 0xc4 - 0xc8 */\n        memset(start_bits+25, 0xff, 7);      /* Bits for 0xc9 - 0xff */\n        }\n#endif\n#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32\n      SET_BIT(0xFF);                         /* For characters > 255 */\n#endif\n      /* Fall through */\n\n      case OP_CLASS:\n        {\n        pcre_uint8 *map;\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n        map = NULL;\n        if (*tcode == OP_XCLASS)\n          {\n          if ((tcode[1 + LINK_SIZE] & XCL_MAP) != 0)\n            map = (pcre_uint8 *)(tcode + 1 + LINK_SIZE + 1);\n          tcode += GET(tcode, 1);\n          }\n        else\n#endif\n          {\n          tcode++;\n          map = (pcre_uint8 *)tcode;\n          tcode += 32 / sizeof(pcre_uchar);\n          }\n\n        /* In UTF-8 mode, the bits in a bit map correspond to character\n        values, not to byte values. However, the bit map we are constructing is\n        for byte values. So we have to do a conversion for characters whose\n        value is > 127. In fact, there are only two possible starting bytes for\n        characters in the range 128 - 255. */\n\n#if defined SUPPORT_UTF || !defined COMPILE_PCRE8\n        if (map != NULL)\n#endif\n          {\n#if defined SUPPORT_UTF && defined COMPILE_PCRE8\n          if (utf)\n            {\n            for (c = 0; c < 16; c++) start_bits[c] |= map[c];\n            for (c = 128; c < 256; c++)\n              {\n              if ((map[c/8] & (1 << (c&7))) != 0)\n                {\n                int d = (c >> 6) | 0xc0;            /* Set bit for this starter */\n                start_bits[d/8] |= (1 << (d&7));    /* and then skip on to the */\n                c = (c & 0xc0) + 0x40 - 1;          /* next relevant character. */\n                }\n              }\n            }\n          else\n#endif\n            {\n            /* In non-UTF-8 mode, the two bit maps are completely compatible. */\n            for (c = 0; c < 32; c++) start_bits[c] |= map[c];\n            }\n          }\n\n        /* Advance past the bit map, and act on what follows. For a zero\n        minimum repeat, continue; otherwise stop processing. */\n\n        switch (*tcode)\n          {\n          case OP_CRSTAR:\n          case OP_CRMINSTAR:\n          case OP_CRQUERY:\n          case OP_CRMINQUERY:\n          case OP_CRPOSSTAR:\n          case OP_CRPOSQUERY:\n          tcode++;\n          break;\n\n          case OP_CRRANGE:\n          case OP_CRMINRANGE:\n          case OP_CRPOSRANGE:\n          if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE;\n            else try_next = FALSE;\n          break;\n\n          default:\n          try_next = FALSE;\n          break;\n          }\n        }\n      break; /* End of bitmap class handling */\n\n      }      /* End of switch */\n    }        /* End of try_next loop */\n\n  code += GET(code, 1);   /* Advance to next branch */\n  }\nwhile (*code == OP_ALT);\nreturn yield;\n}\n\n\n\n\n\n/*************************************************\n*          Study a compiled expression           *\n*************************************************/\n\n/* This function is handed a compiled expression that it must study to produce\ninformation that will speed up the matching. It returns a pcre[16]_extra block\nwhich then gets handed back to pcre_exec().\n\nArguments:\n  re        points to the compiled expression\n  options   contains option bits\n  errorptr  points to where to place error messages;\n            set NULL unless error\n\nReturns:    pointer to a pcre[16]_extra block, with study_data filled in and\n              the appropriate flags set;\n            NULL on error or if no optimization possible\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION\npcre_study(const pcre *external_re, int options, const char **errorptr)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN pcre16_extra * PCRE_CALL_CONVENTION\npcre16_study(const pcre16 *external_re, int options, const char **errorptr)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN pcre32_extra * PCRE_CALL_CONVENTION\npcre32_study(const pcre32 *external_re, int options, const char **errorptr)\n#endif\n{\nint min;\nint count = 0;\nBOOL bits_set = FALSE;\npcre_uint8 start_bits[32];\nPUBL(extra) *extra = NULL;\npcre_study_data *study;\nconst pcre_uint8 *tables;\npcre_uchar *code;\ncompile_data compile_block;\nconst REAL_PCRE *re = (const REAL_PCRE *)external_re;\n\n\n*errorptr = NULL;\n\nif (re == NULL || re->magic_number != MAGIC_NUMBER)\n  {\n  *errorptr = \"argument is not a compiled regular expression\";\n  return NULL;\n  }\n\nif ((re->flags & PCRE_MODE) == 0)\n  {\n#if defined COMPILE_PCRE8\n  *errorptr = \"argument not compiled in 8 bit mode\";\n#elif defined COMPILE_PCRE16\n  *errorptr = \"argument not compiled in 16 bit mode\";\n#elif defined COMPILE_PCRE32\n  *errorptr = \"argument not compiled in 32 bit mode\";\n#endif\n  return NULL;\n  }\n\nif ((options & ~PUBLIC_STUDY_OPTIONS) != 0)\n  {\n  *errorptr = \"unknown or incorrect option bit(s) set\";\n  return NULL;\n  }\n\ncode = (pcre_uchar *)re + re->name_table_offset +\n  (re->name_count * re->name_entry_size);\n\n/* For an anchored pattern, or an unanchored pattern that has a first char, or\na multiline pattern that matches only at \"line starts\", there is no point in\nseeking a list of starting bytes. */\n\nif ((re->options & PCRE_ANCHORED) == 0 &&\n    (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) == 0)\n  {\n  int rc;\n\n  /* Set the character tables in the block that is passed around */\n\n  tables = re->tables;\n\n#if defined COMPILE_PCRE8\n  if (tables == NULL)\n    (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,\n    (void *)(&tables));\n#elif defined COMPILE_PCRE16\n  if (tables == NULL)\n    (void)pcre16_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,\n    (void *)(&tables));\n#elif defined COMPILE_PCRE32\n  if (tables == NULL)\n    (void)pcre32_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,\n    (void *)(&tables));\n#endif\n\n  compile_block.lcc = tables + lcc_offset;\n  compile_block.fcc = tables + fcc_offset;\n  compile_block.cbits = tables + cbits_offset;\n  compile_block.ctypes = tables + ctypes_offset;\n\n  /* See if we can find a fixed set of initial characters for the pattern. */\n\n  memset(start_bits, 0, 32 * sizeof(pcre_uint8));\n  rc = set_start_bits(code, start_bits, (re->options & PCRE_UTF8) != 0,\n    &compile_block);\n  bits_set = rc == SSB_DONE;\n  if (rc == SSB_UNKNOWN)\n    {\n    *errorptr = \"internal error: opcode not recognized\";\n    return NULL;\n    }\n  }\n\n/* Find the minimum length of subject string. */\n\nswitch(min = find_minlength(re, code, code, re->options, NULL, &count))\n  {\n  case -2: *errorptr = \"internal error: missing capturing bracket\"; return NULL;\n  case -3: *errorptr = \"internal error: opcode not recognized\"; return NULL;\n  default: break;\n  }\n\n/* If a set of starting bytes has been identified, or if the minimum length is\ngreater than zero, or if JIT optimization has been requested, or if\nPCRE_STUDY_EXTRA_NEEDED is set, get a pcre[16]_extra block and a\npcre_study_data block. The study data is put in the latter, which is pointed to\nby the former, which may also get additional data set later by the calling\nprogram. At the moment, the size of pcre_study_data is fixed. We nevertheless\nsave it in a field for returning via the pcre_fullinfo() function so that if it\nbecomes variable in the future, we don't have to change that code. */\n\nif (bits_set || min > 0 || (options & (\n#ifdef SUPPORT_JIT\n    PCRE_STUDY_JIT_COMPILE | PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE |\n    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE |\n#endif\n    PCRE_STUDY_EXTRA_NEEDED)) != 0)\n  {\n  extra = (PUBL(extra) *)(PUBL(malloc))\n    (sizeof(PUBL(extra)) + sizeof(pcre_study_data));\n  if (extra == NULL)\n    {\n    *errorptr = \"failed to get memory\";\n    return NULL;\n    }\n\n  study = (pcre_study_data *)((char *)extra + sizeof(PUBL(extra)));\n  extra->flags = PCRE_EXTRA_STUDY_DATA;\n  extra->study_data = study;\n\n  study->size = sizeof(pcre_study_data);\n  study->flags = 0;\n\n  /* Set the start bits always, to avoid unset memory errors if the\n  study data is written to a file, but set the flag only if any of the bits\n  are set, to save time looking when none are. */\n\n  if (bits_set)\n    {\n    study->flags |= PCRE_STUDY_MAPPED;\n    memcpy(study->start_bits, start_bits, sizeof(start_bits));\n    }\n  else memset(study->start_bits, 0, 32 * sizeof(pcre_uint8));\n\n#ifdef PCRE_DEBUG\n  if (bits_set)\n    {\n    pcre_uint8 *ptr = start_bits;\n    int i;\n\n    printf(\"Start bits:\\n\");\n    for (i = 0; i < 32; i++)\n      printf(\"%3d: %02x%s\", i * 8, *ptr++, ((i + 1) & 0x7) != 0? \" \" : \"\\n\");\n    }\n#endif\n\n  /* Always set the minlength value in the block, because the JIT compiler\n  makes use of it. However, don't set the bit unless the length is greater than\n  zero - the interpretive pcre_exec() and pcre_dfa_exec() needn't waste time\n  checking the zero case. */\n\n  if (min > 0)\n    {\n    study->flags |= PCRE_STUDY_MINLEN;\n    study->minlength = min;\n    }\n  else study->minlength = 0;\n\n  /* If JIT support was compiled and requested, attempt the JIT compilation.\n  If no starting bytes were found, and the minimum length is zero, and JIT\n  compilation fails, abandon the extra block and return NULL, unless\n  PCRE_STUDY_EXTRA_NEEDED is set. */\n\n#ifdef SUPPORT_JIT\n  extra->executable_jit = NULL;\n  if ((options & PCRE_STUDY_JIT_COMPILE) != 0)\n    PRIV(jit_compile)(re, extra, JIT_COMPILE);\n  if ((options & PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE) != 0)\n    PRIV(jit_compile)(re, extra, JIT_PARTIAL_SOFT_COMPILE);\n  if ((options & PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) != 0)\n    PRIV(jit_compile)(re, extra, JIT_PARTIAL_HARD_COMPILE);\n\n  if (study->flags == 0 && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) == 0 &&\n      (options & PCRE_STUDY_EXTRA_NEEDED) == 0)\n    {\n#if defined COMPILE_PCRE8\n    pcre_free_study(extra);\n#elif defined COMPILE_PCRE16\n    pcre16_free_study(extra);\n#elif defined COMPILE_PCRE32\n    pcre32_free_study(extra);\n#endif\n    extra = NULL;\n    }\n#endif\n  }\n\nreturn extra;\n}\n\n\n/*************************************************\n*          Free the study data                   *\n*************************************************/\n\n/* This function frees the memory that was obtained by pcre_study().\n\nArgument:   a pointer to the pcre[16]_extra block\nReturns:    nothing\n*/\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN void\npcre_free_study(pcre_extra *extra)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN void\npcre16_free_study(pcre16_extra *extra)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN void\npcre32_free_study(pcre32_extra *extra)\n#endif\n{\nif (extra == NULL)\n  return;\n#ifdef SUPPORT_JIT\nif ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 &&\n     extra->executable_jit != NULL)\n  PRIV(jit_free)(extra->executable_jit);\n#endif\nPUBL(free)(extra);\n}\n\n/* End of pcre_study.c */\n"
  },
  {
    "path": "src/pcre/pcre_tables.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2017 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifndef PCRE_INCLUDED\n\n/* This module contains some fixed tables that are used by more than one of the\nPCRE code modules. The tables are also #included by the pcretest program, which\nuses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name\nclashes with the library. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#endif /* PCRE_INCLUDED */\n\n/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that\nthe definition is next to the definition of the opcodes in pcre_internal.h. */\n\nconst pcre_uint8 PRIV(OP_lengths)[] = { OP_LENGTHS };\n\n/* Tables of horizontal and vertical whitespace characters, suitable for\nadding to classes. */\n\nconst pcre_uint32 PRIV(hspace_list)[] = { HSPACE_LIST };\nconst pcre_uint32 PRIV(vspace_list)[] = { VSPACE_LIST };\n\n\n\n/*************************************************\n*           Tables for UTF-8 support             *\n*************************************************/\n\n/* These are the breakpoints for different numbers of bytes in a UTF-8\ncharacter. */\n\n#if (defined SUPPORT_UTF && defined COMPILE_PCRE8) \\\n  || (defined PCRE_INCLUDED && (defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32))\n\n/* These tables are also required by pcretest in 16- or 32-bit mode. */\n\nconst int PRIV(utf8_table1)[] =\n  { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};\n\nconst int PRIV(utf8_table1_size) = sizeof(PRIV(utf8_table1)) / sizeof(int);\n\n/* These are the indicator bits and the mask for the data bits to set in the\nfirst byte of a character, indexed by the number of additional bytes. */\n\nconst int PRIV(utf8_table2)[] = { 0,    0xc0, 0xe0, 0xf0, 0xf8, 0xfc};\nconst int PRIV(utf8_table3)[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};\n\n/* Table of the number of extra bytes, indexed by the first byte masked with\n0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */\n\nconst pcre_uint8 PRIV(utf8_table4)[] = {\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,\n  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };\n\n#endif /* (SUPPORT_UTF && COMPILE_PCRE8) || (PCRE_INCLUDED && SUPPORT_PCRE[16|32])*/\n\n#ifdef SUPPORT_UTF\n\n/* Table to translate from particular type value to the general value. */\n\nconst pcre_uint32 PRIV(ucp_gentype)[] = {\n  ucp_C, ucp_C, ucp_C, ucp_C, ucp_C,  /* Cc, Cf, Cn, Co, Cs */\n  ucp_L, ucp_L, ucp_L, ucp_L, ucp_L,  /* Ll, Lu, Lm, Lo, Lt */\n  ucp_M, ucp_M, ucp_M,                /* Mc, Me, Mn */\n  ucp_N, ucp_N, ucp_N,                /* Nd, Nl, No */\n  ucp_P, ucp_P, ucp_P, ucp_P, ucp_P,  /* Pc, Pd, Pe, Pf, Pi */\n  ucp_P, ucp_P,                       /* Ps, Po */\n  ucp_S, ucp_S, ucp_S, ucp_S,         /* Sc, Sk, Sm, So */\n  ucp_Z, ucp_Z, ucp_Z                 /* Zl, Zp, Zs */\n};\n\n/* This table encodes the rules for finding the end of an extended grapheme\ncluster. Every code point has a grapheme break property which is one of the\nucp_gbXX values defined in ucp.h. The 2-dimensional table is indexed by the\nproperties of two adjacent code points. The left property selects a word from\nthe table, and the right property selects a bit from that word like this:\n\n  ucp_gbtable[left-property] & (1 << right-property)\n\nThe value is non-zero if a grapheme break is NOT permitted between the relevant\ntwo code points. The breaking rules are as follows:\n\n1. Break at the start and end of text (pretty obviously).\n\n2. Do not break between a CR and LF; otherwise, break before and   after\n   controls.\n\n3. Do not break Hangul syllable sequences, the rules for which are:\n\n    L may be followed by L, V, LV or LVT\n    LV or V may be followed by V or T\n    LVT or T may be followed by T\n\n4. Do not break before extending characters.\n\nThe next two rules are only for extended grapheme clusters (but that's what we\nare implementing).\n\n5. Do not break before SpacingMarks.\n\n6. Do not break after Prepend characters.\n\n7. Otherwise, break everywhere.\n*/\n\nconst pcre_uint32 PRIV(ucp_gbtable[]) = {\n   (1<<ucp_gbLF),                                           /*  0 CR */\n   0,                                                       /*  1 LF */\n   0,                                                       /*  2 Control */\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark),                /*  3 Extend */\n   (1<<ucp_gbExtend)|(1<<ucp_gbPrepend)|                    /*  4 Prepend */\n     (1<<ucp_gbSpacingMark)|(1<<ucp_gbL)|\n     (1<<ucp_gbV)|(1<<ucp_gbT)|(1<<ucp_gbLV)|\n     (1<<ucp_gbLVT)|(1<<ucp_gbOther),\n\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark),                /*  5 SpacingMark */\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbL)|   /*  6 L */\n     (1<<ucp_gbV)|(1<<ucp_gbLV)|(1<<ucp_gbLVT),\n\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbV)|   /*  7 V */\n     (1<<ucp_gbT),\n\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbT),   /*  8 T */\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbV)|   /*  9 LV */\n     (1<<ucp_gbT),\n\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)|(1<<ucp_gbT),   /* 10 LVT */\n   (1<<ucp_gbRegionalIndicator),                            /* 11 RegionalIndicator */\n   (1<<ucp_gbExtend)|(1<<ucp_gbSpacingMark)                 /* 12 Other */\n};\n\n#ifdef SUPPORT_JIT\n/* This table reverses PRIV(ucp_gentype). We can save the cost\nof a memory load. */\n\nconst int PRIV(ucp_typerange)[] = {\n  ucp_Cc, ucp_Cs,\n  ucp_Ll, ucp_Lu,\n  ucp_Mc, ucp_Mn,\n  ucp_Nd, ucp_No,\n  ucp_Pc, ucp_Ps,\n  ucp_Sc, ucp_So,\n  ucp_Zl, ucp_Zs,\n};\n#endif /* SUPPORT_JIT */\n\n/* The pcre_utt[] table below translates Unicode property names into type and\ncode values. It is searched by binary chop, so must be in collating sequence of\nname. Originally, the table contained pointers to the name strings in the first\nfield of each entry. However, that leads to a large number of relocations when\na shared library is dynamically loaded. A significant reduction is made by\nputting all the names into a single, large string and then using offsets in the\ntable itself. Maintenance is more error-prone, but frequent changes to this\ndata are unlikely.\n\nJuly 2008: There is now a script called maint/GenerateUtt.py that can be used\nto generate this data automatically instead of maintaining it by hand.\n\nThe script was updated in March 2009 to generate a new EBCDIC-compliant\nversion. Like all other character and string literals that are compared against\nthe regular expression pattern, we must use STR_ macros instead of literal\nstrings to make sure that UTF-8 support works on EBCDIC platforms. */\n\n#define STRING_Any0 STR_A STR_n STR_y \"\\0\"\n#define STRING_Arabic0 STR_A STR_r STR_a STR_b STR_i STR_c \"\\0\"\n#define STRING_Armenian0 STR_A STR_r STR_m STR_e STR_n STR_i STR_a STR_n \"\\0\"\n#define STRING_Avestan0 STR_A STR_v STR_e STR_s STR_t STR_a STR_n \"\\0\"\n#define STRING_Balinese0 STR_B STR_a STR_l STR_i STR_n STR_e STR_s STR_e \"\\0\"\n#define STRING_Bamum0 STR_B STR_a STR_m STR_u STR_m \"\\0\"\n#define STRING_Bassa_Vah0 STR_B STR_a STR_s STR_s STR_a STR_UNDERSCORE STR_V STR_a STR_h \"\\0\"\n#define STRING_Batak0 STR_B STR_a STR_t STR_a STR_k \"\\0\"\n#define STRING_Bengali0 STR_B STR_e STR_n STR_g STR_a STR_l STR_i \"\\0\"\n#define STRING_Bopomofo0 STR_B STR_o STR_p STR_o STR_m STR_o STR_f STR_o \"\\0\"\n#define STRING_Brahmi0 STR_B STR_r STR_a STR_h STR_m STR_i \"\\0\"\n#define STRING_Braille0 STR_B STR_r STR_a STR_i STR_l STR_l STR_e \"\\0\"\n#define STRING_Buginese0 STR_B STR_u STR_g STR_i STR_n STR_e STR_s STR_e \"\\0\"\n#define STRING_Buhid0 STR_B STR_u STR_h STR_i STR_d \"\\0\"\n#define STRING_C0 STR_C \"\\0\"\n#define STRING_Canadian_Aboriginal0 STR_C STR_a STR_n STR_a STR_d STR_i STR_a STR_n STR_UNDERSCORE STR_A STR_b STR_o STR_r STR_i STR_g STR_i STR_n STR_a STR_l \"\\0\"\n#define STRING_Carian0 STR_C STR_a STR_r STR_i STR_a STR_n \"\\0\"\n#define STRING_Caucasian_Albanian0 STR_C STR_a STR_u STR_c STR_a STR_s STR_i STR_a STR_n STR_UNDERSCORE STR_A STR_l STR_b STR_a STR_n STR_i STR_a STR_n \"\\0\"\n#define STRING_Cc0 STR_C STR_c \"\\0\"\n#define STRING_Cf0 STR_C STR_f \"\\0\"\n#define STRING_Chakma0 STR_C STR_h STR_a STR_k STR_m STR_a \"\\0\"\n#define STRING_Cham0 STR_C STR_h STR_a STR_m \"\\0\"\n#define STRING_Cherokee0 STR_C STR_h STR_e STR_r STR_o STR_k STR_e STR_e \"\\0\"\n#define STRING_Cn0 STR_C STR_n \"\\0\"\n#define STRING_Co0 STR_C STR_o \"\\0\"\n#define STRING_Common0 STR_C STR_o STR_m STR_m STR_o STR_n \"\\0\"\n#define STRING_Coptic0 STR_C STR_o STR_p STR_t STR_i STR_c \"\\0\"\n#define STRING_Cs0 STR_C STR_s \"\\0\"\n#define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m \"\\0\"\n#define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t \"\\0\"\n#define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c \"\\0\"\n#define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t \"\\0\"\n#define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i \"\\0\"\n#define STRING_Duployan0 STR_D STR_u STR_p STR_l STR_o STR_y STR_a STR_n \"\\0\"\n#define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s \"\\0\"\n#define STRING_Elbasan0 STR_E STR_l STR_b STR_a STR_s STR_a STR_n \"\\0\"\n#define STRING_Ethiopic0 STR_E STR_t STR_h STR_i STR_o STR_p STR_i STR_c \"\\0\"\n#define STRING_Georgian0 STR_G STR_e STR_o STR_r STR_g STR_i STR_a STR_n \"\\0\"\n#define STRING_Glagolitic0 STR_G STR_l STR_a STR_g STR_o STR_l STR_i STR_t STR_i STR_c \"\\0\"\n#define STRING_Gothic0 STR_G STR_o STR_t STR_h STR_i STR_c \"\\0\"\n#define STRING_Grantha0 STR_G STR_r STR_a STR_n STR_t STR_h STR_a \"\\0\"\n#define STRING_Greek0 STR_G STR_r STR_e STR_e STR_k \"\\0\"\n#define STRING_Gujarati0 STR_G STR_u STR_j STR_a STR_r STR_a STR_t STR_i \"\\0\"\n#define STRING_Gurmukhi0 STR_G STR_u STR_r STR_m STR_u STR_k STR_h STR_i \"\\0\"\n#define STRING_Han0 STR_H STR_a STR_n \"\\0\"\n#define STRING_Hangul0 STR_H STR_a STR_n STR_g STR_u STR_l \"\\0\"\n#define STRING_Hanunoo0 STR_H STR_a STR_n STR_u STR_n STR_o STR_o \"\\0\"\n#define STRING_Hebrew0 STR_H STR_e STR_b STR_r STR_e STR_w \"\\0\"\n#define STRING_Hiragana0 STR_H STR_i STR_r STR_a STR_g STR_a STR_n STR_a \"\\0\"\n#define STRING_Imperial_Aramaic0 STR_I STR_m STR_p STR_e STR_r STR_i STR_a STR_l STR_UNDERSCORE STR_A STR_r STR_a STR_m STR_a STR_i STR_c \"\\0\"\n#define STRING_Inherited0 STR_I STR_n STR_h STR_e STR_r STR_i STR_t STR_e STR_d \"\\0\"\n#define STRING_Inscriptional_Pahlavi0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_h STR_l STR_a STR_v STR_i \"\\0\"\n#define STRING_Inscriptional_Parthian0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_r STR_t STR_h STR_i STR_a STR_n \"\\0\"\n#define STRING_Javanese0 STR_J STR_a STR_v STR_a STR_n STR_e STR_s STR_e \"\\0\"\n#define STRING_Kaithi0 STR_K STR_a STR_i STR_t STR_h STR_i \"\\0\"\n#define STRING_Kannada0 STR_K STR_a STR_n STR_n STR_a STR_d STR_a \"\\0\"\n#define STRING_Katakana0 STR_K STR_a STR_t STR_a STR_k STR_a STR_n STR_a \"\\0\"\n#define STRING_Kayah_Li0 STR_K STR_a STR_y STR_a STR_h STR_UNDERSCORE STR_L STR_i \"\\0\"\n#define STRING_Kharoshthi0 STR_K STR_h STR_a STR_r STR_o STR_s STR_h STR_t STR_h STR_i \"\\0\"\n#define STRING_Khmer0 STR_K STR_h STR_m STR_e STR_r \"\\0\"\n#define STRING_Khojki0 STR_K STR_h STR_o STR_j STR_k STR_i \"\\0\"\n#define STRING_Khudawadi0 STR_K STR_h STR_u STR_d STR_a STR_w STR_a STR_d STR_i \"\\0\"\n#define STRING_L0 STR_L \"\\0\"\n#define STRING_L_AMPERSAND0 STR_L STR_AMPERSAND \"\\0\"\n#define STRING_Lao0 STR_L STR_a STR_o \"\\0\"\n#define STRING_Latin0 STR_L STR_a STR_t STR_i STR_n \"\\0\"\n#define STRING_Lepcha0 STR_L STR_e STR_p STR_c STR_h STR_a \"\\0\"\n#define STRING_Limbu0 STR_L STR_i STR_m STR_b STR_u \"\\0\"\n#define STRING_Linear_A0 STR_L STR_i STR_n STR_e STR_a STR_r STR_UNDERSCORE STR_A \"\\0\"\n#define STRING_Linear_B0 STR_L STR_i STR_n STR_e STR_a STR_r STR_UNDERSCORE STR_B \"\\0\"\n#define STRING_Lisu0 STR_L STR_i STR_s STR_u \"\\0\"\n#define STRING_Ll0 STR_L STR_l \"\\0\"\n#define STRING_Lm0 STR_L STR_m \"\\0\"\n#define STRING_Lo0 STR_L STR_o \"\\0\"\n#define STRING_Lt0 STR_L STR_t \"\\0\"\n#define STRING_Lu0 STR_L STR_u \"\\0\"\n#define STRING_Lycian0 STR_L STR_y STR_c STR_i STR_a STR_n \"\\0\"\n#define STRING_Lydian0 STR_L STR_y STR_d STR_i STR_a STR_n \"\\0\"\n#define STRING_M0 STR_M \"\\0\"\n#define STRING_Mahajani0 STR_M STR_a STR_h STR_a STR_j STR_a STR_n STR_i \"\\0\"\n#define STRING_Malayalam0 STR_M STR_a STR_l STR_a STR_y STR_a STR_l STR_a STR_m \"\\0\"\n#define STRING_Mandaic0 STR_M STR_a STR_n STR_d STR_a STR_i STR_c \"\\0\"\n#define STRING_Manichaean0 STR_M STR_a STR_n STR_i STR_c STR_h STR_a STR_e STR_a STR_n \"\\0\"\n#define STRING_Mc0 STR_M STR_c \"\\0\"\n#define STRING_Me0 STR_M STR_e \"\\0\"\n#define STRING_Meetei_Mayek0 STR_M STR_e STR_e STR_t STR_e STR_i STR_UNDERSCORE STR_M STR_a STR_y STR_e STR_k \"\\0\"\n#define STRING_Mende_Kikakui0 STR_M STR_e STR_n STR_d STR_e STR_UNDERSCORE STR_K STR_i STR_k STR_a STR_k STR_u STR_i \"\\0\"\n#define STRING_Meroitic_Cursive0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_C STR_u STR_r STR_s STR_i STR_v STR_e \"\\0\"\n#define STRING_Meroitic_Hieroglyphs0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s \"\\0\"\n#define STRING_Miao0 STR_M STR_i STR_a STR_o \"\\0\"\n#define STRING_Mn0 STR_M STR_n \"\\0\"\n#define STRING_Modi0 STR_M STR_o STR_d STR_i \"\\0\"\n#define STRING_Mongolian0 STR_M STR_o STR_n STR_g STR_o STR_l STR_i STR_a STR_n \"\\0\"\n#define STRING_Mro0 STR_M STR_r STR_o \"\\0\"\n#define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r \"\\0\"\n#define STRING_N0 STR_N \"\\0\"\n#define STRING_Nabataean0 STR_N STR_a STR_b STR_a STR_t STR_a STR_e STR_a STR_n \"\\0\"\n#define STRING_Nd0 STR_N STR_d \"\\0\"\n#define STRING_New_Tai_Lue0 STR_N STR_e STR_w STR_UNDERSCORE STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_u STR_e \"\\0\"\n#define STRING_Nko0 STR_N STR_k STR_o \"\\0\"\n#define STRING_Nl0 STR_N STR_l \"\\0\"\n#define STRING_No0 STR_N STR_o \"\\0\"\n#define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m \"\\0\"\n#define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i \"\\0\"\n#define STRING_Old_Italic0 STR_O STR_l STR_d STR_UNDERSCORE STR_I STR_t STR_a STR_l STR_i STR_c \"\\0\"\n#define STRING_Old_North_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_N STR_o STR_r STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n \"\\0\"\n#define STRING_Old_Permic0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_m STR_i STR_c \"\\0\"\n#define STRING_Old_Persian0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_s STR_i STR_a STR_n \"\\0\"\n#define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n \"\\0\"\n#define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c \"\\0\"\n#define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a \"\\0\"\n#define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a \"\\0\"\n#define STRING_P0 STR_P \"\\0\"\n#define STRING_Pahawh_Hmong0 STR_P STR_a STR_h STR_a STR_w STR_h STR_UNDERSCORE STR_H STR_m STR_o STR_n STR_g \"\\0\"\n#define STRING_Palmyrene0 STR_P STR_a STR_l STR_m STR_y STR_r STR_e STR_n STR_e \"\\0\"\n#define STRING_Pau_Cin_Hau0 STR_P STR_a STR_u STR_UNDERSCORE STR_C STR_i STR_n STR_UNDERSCORE STR_H STR_a STR_u \"\\0\"\n#define STRING_Pc0 STR_P STR_c \"\\0\"\n#define STRING_Pd0 STR_P STR_d \"\\0\"\n#define STRING_Pe0 STR_P STR_e \"\\0\"\n#define STRING_Pf0 STR_P STR_f \"\\0\"\n#define STRING_Phags_Pa0 STR_P STR_h STR_a STR_g STR_s STR_UNDERSCORE STR_P STR_a \"\\0\"\n#define STRING_Phoenician0 STR_P STR_h STR_o STR_e STR_n STR_i STR_c STR_i STR_a STR_n \"\\0\"\n#define STRING_Pi0 STR_P STR_i \"\\0\"\n#define STRING_Po0 STR_P STR_o \"\\0\"\n#define STRING_Ps0 STR_P STR_s \"\\0\"\n#define STRING_Psalter_Pahlavi0 STR_P STR_s STR_a STR_l STR_t STR_e STR_r STR_UNDERSCORE STR_P STR_a STR_h STR_l STR_a STR_v STR_i \"\\0\"\n#define STRING_Rejang0 STR_R STR_e STR_j STR_a STR_n STR_g \"\\0\"\n#define STRING_Runic0 STR_R STR_u STR_n STR_i STR_c \"\\0\"\n#define STRING_S0 STR_S \"\\0\"\n#define STRING_Samaritan0 STR_S STR_a STR_m STR_a STR_r STR_i STR_t STR_a STR_n \"\\0\"\n#define STRING_Saurashtra0 STR_S STR_a STR_u STR_r STR_a STR_s STR_h STR_t STR_r STR_a \"\\0\"\n#define STRING_Sc0 STR_S STR_c \"\\0\"\n#define STRING_Sharada0 STR_S STR_h STR_a STR_r STR_a STR_d STR_a \"\\0\"\n#define STRING_Shavian0 STR_S STR_h STR_a STR_v STR_i STR_a STR_n \"\\0\"\n#define STRING_Siddham0 STR_S STR_i STR_d STR_d STR_h STR_a STR_m \"\\0\"\n#define STRING_Sinhala0 STR_S STR_i STR_n STR_h STR_a STR_l STR_a \"\\0\"\n#define STRING_Sk0 STR_S STR_k \"\\0\"\n#define STRING_Sm0 STR_S STR_m \"\\0\"\n#define STRING_So0 STR_S STR_o \"\\0\"\n#define STRING_Sora_Sompeng0 STR_S STR_o STR_r STR_a STR_UNDERSCORE STR_S STR_o STR_m STR_p STR_e STR_n STR_g \"\\0\"\n#define STRING_Sundanese0 STR_S STR_u STR_n STR_d STR_a STR_n STR_e STR_s STR_e \"\\0\"\n#define STRING_Syloti_Nagri0 STR_S STR_y STR_l STR_o STR_t STR_i STR_UNDERSCORE STR_N STR_a STR_g STR_r STR_i \"\\0\"\n#define STRING_Syriac0 STR_S STR_y STR_r STR_i STR_a STR_c \"\\0\"\n#define STRING_Tagalog0 STR_T STR_a STR_g STR_a STR_l STR_o STR_g \"\\0\"\n#define STRING_Tagbanwa0 STR_T STR_a STR_g STR_b STR_a STR_n STR_w STR_a \"\\0\"\n#define STRING_Tai_Le0 STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_e \"\\0\"\n#define STRING_Tai_Tham0 STR_T STR_a STR_i STR_UNDERSCORE STR_T STR_h STR_a STR_m \"\\0\"\n#define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t \"\\0\"\n#define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i \"\\0\"\n#define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l \"\\0\"\n#define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u \"\\0\"\n#define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a \"\\0\"\n#define STRING_Thai0 STR_T STR_h STR_a STR_i \"\\0\"\n#define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n \"\\0\"\n#define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h \"\\0\"\n#define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a \"\\0\"\n#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c \"\\0\"\n#define STRING_Vai0 STR_V STR_a STR_i \"\\0\"\n#define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i \"\\0\"\n#define STRING_Xan0 STR_X STR_a STR_n \"\\0\"\n#define STRING_Xps0 STR_X STR_p STR_s \"\\0\"\n#define STRING_Xsp0 STR_X STR_s STR_p \"\\0\"\n#define STRING_Xuc0 STR_X STR_u STR_c \"\\0\"\n#define STRING_Xwd0 STR_X STR_w STR_d \"\\0\"\n#define STRING_Yi0 STR_Y STR_i \"\\0\"\n#define STRING_Z0 STR_Z \"\\0\"\n#define STRING_Zl0 STR_Z STR_l \"\\0\"\n#define STRING_Zp0 STR_Z STR_p \"\\0\"\n#define STRING_Zs0 STR_Z STR_s \"\\0\"\n\nconst char PRIV(utt_names)[] =\n  STRING_Any0\n  STRING_Arabic0\n  STRING_Armenian0\n  STRING_Avestan0\n  STRING_Balinese0\n  STRING_Bamum0\n  STRING_Bassa_Vah0\n  STRING_Batak0\n  STRING_Bengali0\n  STRING_Bopomofo0\n  STRING_Brahmi0\n  STRING_Braille0\n  STRING_Buginese0\n  STRING_Buhid0\n  STRING_C0\n  STRING_Canadian_Aboriginal0\n  STRING_Carian0\n  STRING_Caucasian_Albanian0\n  STRING_Cc0\n  STRING_Cf0\n  STRING_Chakma0\n  STRING_Cham0\n  STRING_Cherokee0\n  STRING_Cn0\n  STRING_Co0\n  STRING_Common0\n  STRING_Coptic0\n  STRING_Cs0\n  STRING_Cuneiform0\n  STRING_Cypriot0\n  STRING_Cyrillic0\n  STRING_Deseret0\n  STRING_Devanagari0\n  STRING_Duployan0\n  STRING_Egyptian_Hieroglyphs0\n  STRING_Elbasan0\n  STRING_Ethiopic0\n  STRING_Georgian0\n  STRING_Glagolitic0\n  STRING_Gothic0\n  STRING_Grantha0\n  STRING_Greek0\n  STRING_Gujarati0\n  STRING_Gurmukhi0\n  STRING_Han0\n  STRING_Hangul0\n  STRING_Hanunoo0\n  STRING_Hebrew0\n  STRING_Hiragana0\n  STRING_Imperial_Aramaic0\n  STRING_Inherited0\n  STRING_Inscriptional_Pahlavi0\n  STRING_Inscriptional_Parthian0\n  STRING_Javanese0\n  STRING_Kaithi0\n  STRING_Kannada0\n  STRING_Katakana0\n  STRING_Kayah_Li0\n  STRING_Kharoshthi0\n  STRING_Khmer0\n  STRING_Khojki0\n  STRING_Khudawadi0\n  STRING_L0\n  STRING_L_AMPERSAND0\n  STRING_Lao0\n  STRING_Latin0\n  STRING_Lepcha0\n  STRING_Limbu0\n  STRING_Linear_A0\n  STRING_Linear_B0\n  STRING_Lisu0\n  STRING_Ll0\n  STRING_Lm0\n  STRING_Lo0\n  STRING_Lt0\n  STRING_Lu0\n  STRING_Lycian0\n  STRING_Lydian0\n  STRING_M0\n  STRING_Mahajani0\n  STRING_Malayalam0\n  STRING_Mandaic0\n  STRING_Manichaean0\n  STRING_Mc0\n  STRING_Me0\n  STRING_Meetei_Mayek0\n  STRING_Mende_Kikakui0\n  STRING_Meroitic_Cursive0\n  STRING_Meroitic_Hieroglyphs0\n  STRING_Miao0\n  STRING_Mn0\n  STRING_Modi0\n  STRING_Mongolian0\n  STRING_Mro0\n  STRING_Myanmar0\n  STRING_N0\n  STRING_Nabataean0\n  STRING_Nd0\n  STRING_New_Tai_Lue0\n  STRING_Nko0\n  STRING_Nl0\n  STRING_No0\n  STRING_Ogham0\n  STRING_Ol_Chiki0\n  STRING_Old_Italic0\n  STRING_Old_North_Arabian0\n  STRING_Old_Permic0\n  STRING_Old_Persian0\n  STRING_Old_South_Arabian0\n  STRING_Old_Turkic0\n  STRING_Oriya0\n  STRING_Osmanya0\n  STRING_P0\n  STRING_Pahawh_Hmong0\n  STRING_Palmyrene0\n  STRING_Pau_Cin_Hau0\n  STRING_Pc0\n  STRING_Pd0\n  STRING_Pe0\n  STRING_Pf0\n  STRING_Phags_Pa0\n  STRING_Phoenician0\n  STRING_Pi0\n  STRING_Po0\n  STRING_Ps0\n  STRING_Psalter_Pahlavi0\n  STRING_Rejang0\n  STRING_Runic0\n  STRING_S0\n  STRING_Samaritan0\n  STRING_Saurashtra0\n  STRING_Sc0\n  STRING_Sharada0\n  STRING_Shavian0\n  STRING_Siddham0\n  STRING_Sinhala0\n  STRING_Sk0\n  STRING_Sm0\n  STRING_So0\n  STRING_Sora_Sompeng0\n  STRING_Sundanese0\n  STRING_Syloti_Nagri0\n  STRING_Syriac0\n  STRING_Tagalog0\n  STRING_Tagbanwa0\n  STRING_Tai_Le0\n  STRING_Tai_Tham0\n  STRING_Tai_Viet0\n  STRING_Takri0\n  STRING_Tamil0\n  STRING_Telugu0\n  STRING_Thaana0\n  STRING_Thai0\n  STRING_Tibetan0\n  STRING_Tifinagh0\n  STRING_Tirhuta0\n  STRING_Ugaritic0\n  STRING_Vai0\n  STRING_Warang_Citi0\n  STRING_Xan0\n  STRING_Xps0\n  STRING_Xsp0\n  STRING_Xuc0\n  STRING_Xwd0\n  STRING_Yi0\n  STRING_Z0\n  STRING_Zl0\n  STRING_Zp0\n  STRING_Zs0;\n\nconst ucp_type_table PRIV(utt)[] = {\n  {   0, PT_ANY, 0 },\n  {   4, PT_SC, ucp_Arabic },\n  {  11, PT_SC, ucp_Armenian },\n  {  20, PT_SC, ucp_Avestan },\n  {  28, PT_SC, ucp_Balinese },\n  {  37, PT_SC, ucp_Bamum },\n  {  43, PT_SC, ucp_Bassa_Vah },\n  {  53, PT_SC, ucp_Batak },\n  {  59, PT_SC, ucp_Bengali },\n  {  67, PT_SC, ucp_Bopomofo },\n  {  76, PT_SC, ucp_Brahmi },\n  {  83, PT_SC, ucp_Braille },\n  {  91, PT_SC, ucp_Buginese },\n  { 100, PT_SC, ucp_Buhid },\n  { 106, PT_GC, ucp_C },\n  { 108, PT_SC, ucp_Canadian_Aboriginal },\n  { 128, PT_SC, ucp_Carian },\n  { 135, PT_SC, ucp_Caucasian_Albanian },\n  { 154, PT_PC, ucp_Cc },\n  { 157, PT_PC, ucp_Cf },\n  { 160, PT_SC, ucp_Chakma },\n  { 167, PT_SC, ucp_Cham },\n  { 172, PT_SC, ucp_Cherokee },\n  { 181, PT_PC, ucp_Cn },\n  { 184, PT_PC, ucp_Co },\n  { 187, PT_SC, ucp_Common },\n  { 194, PT_SC, ucp_Coptic },\n  { 201, PT_PC, ucp_Cs },\n  { 204, PT_SC, ucp_Cuneiform },\n  { 214, PT_SC, ucp_Cypriot },\n  { 222, PT_SC, ucp_Cyrillic },\n  { 231, PT_SC, ucp_Deseret },\n  { 239, PT_SC, ucp_Devanagari },\n  { 250, PT_SC, ucp_Duployan },\n  { 259, PT_SC, ucp_Egyptian_Hieroglyphs },\n  { 280, PT_SC, ucp_Elbasan },\n  { 288, PT_SC, ucp_Ethiopic },\n  { 297, PT_SC, ucp_Georgian },\n  { 306, PT_SC, ucp_Glagolitic },\n  { 317, PT_SC, ucp_Gothic },\n  { 324, PT_SC, ucp_Grantha },\n  { 332, PT_SC, ucp_Greek },\n  { 338, PT_SC, ucp_Gujarati },\n  { 347, PT_SC, ucp_Gurmukhi },\n  { 356, PT_SC, ucp_Han },\n  { 360, PT_SC, ucp_Hangul },\n  { 367, PT_SC, ucp_Hanunoo },\n  { 375, PT_SC, ucp_Hebrew },\n  { 382, PT_SC, ucp_Hiragana },\n  { 391, PT_SC, ucp_Imperial_Aramaic },\n  { 408, PT_SC, ucp_Inherited },\n  { 418, PT_SC, ucp_Inscriptional_Pahlavi },\n  { 440, PT_SC, ucp_Inscriptional_Parthian },\n  { 463, PT_SC, ucp_Javanese },\n  { 472, PT_SC, ucp_Kaithi },\n  { 479, PT_SC, ucp_Kannada },\n  { 487, PT_SC, ucp_Katakana },\n  { 496, PT_SC, ucp_Kayah_Li },\n  { 505, PT_SC, ucp_Kharoshthi },\n  { 516, PT_SC, ucp_Khmer },\n  { 522, PT_SC, ucp_Khojki },\n  { 529, PT_SC, ucp_Khudawadi },\n  { 539, PT_GC, ucp_L },\n  { 541, PT_LAMP, 0 },\n  { 544, PT_SC, ucp_Lao },\n  { 548, PT_SC, ucp_Latin },\n  { 554, PT_SC, ucp_Lepcha },\n  { 561, PT_SC, ucp_Limbu },\n  { 567, PT_SC, ucp_Linear_A },\n  { 576, PT_SC, ucp_Linear_B },\n  { 585, PT_SC, ucp_Lisu },\n  { 590, PT_PC, ucp_Ll },\n  { 593, PT_PC, ucp_Lm },\n  { 596, PT_PC, ucp_Lo },\n  { 599, PT_PC, ucp_Lt },\n  { 602, PT_PC, ucp_Lu },\n  { 605, PT_SC, ucp_Lycian },\n  { 612, PT_SC, ucp_Lydian },\n  { 619, PT_GC, ucp_M },\n  { 621, PT_SC, ucp_Mahajani },\n  { 630, PT_SC, ucp_Malayalam },\n  { 640, PT_SC, ucp_Mandaic },\n  { 648, PT_SC, ucp_Manichaean },\n  { 659, PT_PC, ucp_Mc },\n  { 662, PT_PC, ucp_Me },\n  { 665, PT_SC, ucp_Meetei_Mayek },\n  { 678, PT_SC, ucp_Mende_Kikakui },\n  { 692, PT_SC, ucp_Meroitic_Cursive },\n  { 709, PT_SC, ucp_Meroitic_Hieroglyphs },\n  { 730, PT_SC, ucp_Miao },\n  { 735, PT_PC, ucp_Mn },\n  { 738, PT_SC, ucp_Modi },\n  { 743, PT_SC, ucp_Mongolian },\n  { 753, PT_SC, ucp_Mro },\n  { 757, PT_SC, ucp_Myanmar },\n  { 765, PT_GC, ucp_N },\n  { 767, PT_SC, ucp_Nabataean },\n  { 777, PT_PC, ucp_Nd },\n  { 780, PT_SC, ucp_New_Tai_Lue },\n  { 792, PT_SC, ucp_Nko },\n  { 796, PT_PC, ucp_Nl },\n  { 799, PT_PC, ucp_No },\n  { 802, PT_SC, ucp_Ogham },\n  { 808, PT_SC, ucp_Ol_Chiki },\n  { 817, PT_SC, ucp_Old_Italic },\n  { 828, PT_SC, ucp_Old_North_Arabian },\n  { 846, PT_SC, ucp_Old_Permic },\n  { 857, PT_SC, ucp_Old_Persian },\n  { 869, PT_SC, ucp_Old_South_Arabian },\n  { 887, PT_SC, ucp_Old_Turkic },\n  { 898, PT_SC, ucp_Oriya },\n  { 904, PT_SC, ucp_Osmanya },\n  { 912, PT_GC, ucp_P },\n  { 914, PT_SC, ucp_Pahawh_Hmong },\n  { 927, PT_SC, ucp_Palmyrene },\n  { 937, PT_SC, ucp_Pau_Cin_Hau },\n  { 949, PT_PC, ucp_Pc },\n  { 952, PT_PC, ucp_Pd },\n  { 955, PT_PC, ucp_Pe },\n  { 958, PT_PC, ucp_Pf },\n  { 961, PT_SC, ucp_Phags_Pa },\n  { 970, PT_SC, ucp_Phoenician },\n  { 981, PT_PC, ucp_Pi },\n  { 984, PT_PC, ucp_Po },\n  { 987, PT_PC, ucp_Ps },\n  { 990, PT_SC, ucp_Psalter_Pahlavi },\n  { 1006, PT_SC, ucp_Rejang },\n  { 1013, PT_SC, ucp_Runic },\n  { 1019, PT_GC, ucp_S },\n  { 1021, PT_SC, ucp_Samaritan },\n  { 1031, PT_SC, ucp_Saurashtra },\n  { 1042, PT_PC, ucp_Sc },\n  { 1045, PT_SC, ucp_Sharada },\n  { 1053, PT_SC, ucp_Shavian },\n  { 1061, PT_SC, ucp_Siddham },\n  { 1069, PT_SC, ucp_Sinhala },\n  { 1077, PT_PC, ucp_Sk },\n  { 1080, PT_PC, ucp_Sm },\n  { 1083, PT_PC, ucp_So },\n  { 1086, PT_SC, ucp_Sora_Sompeng },\n  { 1099, PT_SC, ucp_Sundanese },\n  { 1109, PT_SC, ucp_Syloti_Nagri },\n  { 1122, PT_SC, ucp_Syriac },\n  { 1129, PT_SC, ucp_Tagalog },\n  { 1137, PT_SC, ucp_Tagbanwa },\n  { 1146, PT_SC, ucp_Tai_Le },\n  { 1153, PT_SC, ucp_Tai_Tham },\n  { 1162, PT_SC, ucp_Tai_Viet },\n  { 1171, PT_SC, ucp_Takri },\n  { 1177, PT_SC, ucp_Tamil },\n  { 1183, PT_SC, ucp_Telugu },\n  { 1190, PT_SC, ucp_Thaana },\n  { 1197, PT_SC, ucp_Thai },\n  { 1202, PT_SC, ucp_Tibetan },\n  { 1210, PT_SC, ucp_Tifinagh },\n  { 1219, PT_SC, ucp_Tirhuta },\n  { 1227, PT_SC, ucp_Ugaritic },\n  { 1236, PT_SC, ucp_Vai },\n  { 1240, PT_SC, ucp_Warang_Citi },\n  { 1252, PT_ALNUM, 0 },\n  { 1256, PT_PXSPACE, 0 },\n  { 1260, PT_SPACE, 0 },\n  { 1264, PT_UCNC, 0 },\n  { 1268, PT_WORD, 0 },\n  { 1272, PT_SC, ucp_Yi },\n  { 1275, PT_GC, ucp_Z },\n  { 1277, PT_PC, ucp_Zl },\n  { 1280, PT_PC, ucp_Zp },\n  { 1283, PT_PC, ucp_Zs }\n};\n\nconst int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);\n\n#endif /* SUPPORT_UTF */\n\n/* End of pcre_tables.c */\n"
  },
  {
    "path": "src/pcre/pcre_ucd.c",
    "content": "/* This module is generated by the maint/MultiStage2.py script.\nDo not modify it by hand. Instead modify the script and run it\nto regenerate this code.\n\nAs well as being part of the PCRE library, this module is #included\nby the pcretest program, which redefines the PRIV macro to change\ntable names from _pcre_xxx to xxxx, thereby avoiding name clashes\nwith the library. At present, just one of these tables is actually\nneeded. */\n\n#ifndef PCRE_INCLUDED\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n#endif /* PCRE_INCLUDED */\n\n/* Unicode character database. */\n/* This file was autogenerated by the MultiStage2.py script. */\n/* Total size: 72576 bytes, block size: 128. */\n\n/* The tables herein are needed only when UCP support is built\ninto PCRE. This module should not be referenced otherwise, so\nit should not matter whether it is compiled or not. However\na comment was received about space saving - maybe the guy linked\nall the modules rather than using a library - so we include a\ncondition to cut out the tables when not needed. But don't leave\na totally empty module because some compilers barf at that.\nInstead, just supply small dummy tables. */\n\n#ifndef SUPPORT_UCP\nconst ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0 }};\nconst pcre_uint8 PRIV(ucd_stage1)[] = {0};\nconst pcre_uint16 PRIV(ucd_stage2)[] = {0};\nconst pcre_uint32 PRIV(ucd_caseless_sets)[] = {0};\n#else\n\n/* If the 32-bit library is run in non-32-bit mode, character values\ngreater than 0x10ffff may be encountered. For these we set up a\nspecial record. */\n\n#ifdef COMPILE_PCRE32\nconst ucd_record PRIV(dummy_ucd_record)[] = {{\n  ucp_Common,    /* script */\n  ucp_Cn,        /* type unassigned */\n  ucp_gbOther,   /* grapheme break property */\n  0,             /* case set */\n  0,             /* other case */\n  }};\n#endif\n\n/* When recompiling tables with a new Unicode version, please check the\ntypes in this structure definition from pcre_internal.h (the actual\nfield names will be different):\n\ntypedef struct {\npcre_uint8 property_0;\npcre_uint8 property_1;\npcre_uint8 property_2;\npcre_uint8 property_3;\npcre_int32 property_4;\n} ucd_record;\n*/\n\n\nconst pcre_uint32 PRIV(ucd_caseless_sets)[] = {\n  NOTACHAR,\n  0x0053,   0x0073,   0x017f,   NOTACHAR,\n  0x01c4,   0x01c5,   0x01c6,   NOTACHAR,\n  0x01c7,   0x01c8,   0x01c9,   NOTACHAR,\n  0x01ca,   0x01cb,   0x01cc,   NOTACHAR,\n  0x01f1,   0x01f2,   0x01f3,   NOTACHAR,\n  0x0345,   0x0399,   0x03b9,   0x1fbe,   NOTACHAR,\n  0x00b5,   0x039c,   0x03bc,   NOTACHAR,\n  0x03a3,   0x03c2,   0x03c3,   NOTACHAR,\n  0x0392,   0x03b2,   0x03d0,   NOTACHAR,\n  0x0398,   0x03b8,   0x03d1,   0x03f4,   NOTACHAR,\n  0x03a6,   0x03c6,   0x03d5,   NOTACHAR,\n  0x03a0,   0x03c0,   0x03d6,   NOTACHAR,\n  0x039a,   0x03ba,   0x03f0,   NOTACHAR,\n  0x03a1,   0x03c1,   0x03f1,   NOTACHAR,\n  0x0395,   0x03b5,   0x03f5,   NOTACHAR,\n  0x1e60,   0x1e61,   0x1e9b,   NOTACHAR,\n  0x03a9,   0x03c9,   0x2126,   NOTACHAR,\n  0x004b,   0x006b,   0x212a,   NOTACHAR,\n  0x00c5,   0x00e5,   0x212b,   NOTACHAR,\n};\n\n/* When #included in pcretest, we don't need this large table. */\n\n#ifndef PCRE_INCLUDED\n\nconst ucd_record PRIV(ucd_records)[] = { /* 5760 bytes, record size 8 */\n  {     9,      0,      2,      0,      0, }, /*   0 */\n  {     9,      0,      1,      0,      0, }, /*   1 */\n  {     9,      0,      0,      0,      0, }, /*   2 */\n  {     9,     29,     12,      0,      0, }, /*   3 */\n  {     9,     21,     12,      0,      0, }, /*   4 */\n  {     9,     23,     12,      0,      0, }, /*   5 */\n  {     9,     22,     12,      0,      0, }, /*   6 */\n  {     9,     18,     12,      0,      0, }, /*   7 */\n  {     9,     25,     12,      0,      0, }, /*   8 */\n  {     9,     17,     12,      0,      0, }, /*   9 */\n  {     9,     13,     12,      0,      0, }, /*  10 */\n  {    33,      9,     12,      0,     32, }, /*  11 */\n  {    33,      9,     12,     71,     32, }, /*  12 */\n  {    33,      9,     12,      1,     32, }, /*  13 */\n  {     9,     24,     12,      0,      0, }, /*  14 */\n  {     9,     16,     12,      0,      0, }, /*  15 */\n  {    33,      5,     12,      0,    -32, }, /*  16 */\n  {    33,      5,     12,     71,    -32, }, /*  17 */\n  {    33,      5,     12,      1,    -32, }, /*  18 */\n  {     9,     26,     12,      0,      0, }, /*  19 */\n  {    33,      7,     12,      0,      0, }, /*  20 */\n  {     9,     20,     12,      0,      0, }, /*  21 */\n  {     9,      1,      2,      0,      0, }, /*  22 */\n  {     9,     15,     12,      0,      0, }, /*  23 */\n  {     9,      5,     12,     26,    775, }, /*  24 */\n  {     9,     19,     12,      0,      0, }, /*  25 */\n  {    33,      9,     12,     75,     32, }, /*  26 */\n  {    33,      5,     12,      0,   7615, }, /*  27 */\n  {    33,      5,     12,     75,    -32, }, /*  28 */\n  {    33,      5,     12,      0,    121, }, /*  29 */\n  {    33,      9,     12,      0,      1, }, /*  30 */\n  {    33,      5,     12,      0,     -1, }, /*  31 */\n  {    33,      9,     12,      0,      0, }, /*  32 */\n  {    33,      5,     12,      0,      0, }, /*  33 */\n  {    33,      9,     12,      0,   -121, }, /*  34 */\n  {    33,      5,     12,      1,   -268, }, /*  35 */\n  {    33,      5,     12,      0,    195, }, /*  36 */\n  {    33,      9,     12,      0,    210, }, /*  37 */\n  {    33,      9,     12,      0,    206, }, /*  38 */\n  {    33,      9,     12,      0,    205, }, /*  39 */\n  {    33,      9,     12,      0,     79, }, /*  40 */\n  {    33,      9,     12,      0,    202, }, /*  41 */\n  {    33,      9,     12,      0,    203, }, /*  42 */\n  {    33,      9,     12,      0,    207, }, /*  43 */\n  {    33,      5,     12,      0,     97, }, /*  44 */\n  {    33,      9,     12,      0,    211, }, /*  45 */\n  {    33,      9,     12,      0,    209, }, /*  46 */\n  {    33,      5,     12,      0,    163, }, /*  47 */\n  {    33,      9,     12,      0,    213, }, /*  48 */\n  {    33,      5,     12,      0,    130, }, /*  49 */\n  {    33,      9,     12,      0,    214, }, /*  50 */\n  {    33,      9,     12,      0,    218, }, /*  51 */\n  {    33,      9,     12,      0,    217, }, /*  52 */\n  {    33,      9,     12,      0,    219, }, /*  53 */\n  {    33,      5,     12,      0,     56, }, /*  54 */\n  {    33,      9,     12,      5,      2, }, /*  55 */\n  {    33,      8,     12,      5,      1, }, /*  56 */\n  {    33,      5,     12,      5,     -2, }, /*  57 */\n  {    33,      9,     12,      9,      2, }, /*  58 */\n  {    33,      8,     12,      9,      1, }, /*  59 */\n  {    33,      5,     12,      9,     -2, }, /*  60 */\n  {    33,      9,     12,     13,      2, }, /*  61 */\n  {    33,      8,     12,     13,      1, }, /*  62 */\n  {    33,      5,     12,     13,     -2, }, /*  63 */\n  {    33,      5,     12,      0,    -79, }, /*  64 */\n  {    33,      9,     12,     17,      2, }, /*  65 */\n  {    33,      8,     12,     17,      1, }, /*  66 */\n  {    33,      5,     12,     17,     -2, }, /*  67 */\n  {    33,      9,     12,      0,    -97, }, /*  68 */\n  {    33,      9,     12,      0,    -56, }, /*  69 */\n  {    33,      9,     12,      0,   -130, }, /*  70 */\n  {    33,      9,     12,      0,  10795, }, /*  71 */\n  {    33,      9,     12,      0,   -163, }, /*  72 */\n  {    33,      9,     12,      0,  10792, }, /*  73 */\n  {    33,      5,     12,      0,  10815, }, /*  74 */\n  {    33,      9,     12,      0,   -195, }, /*  75 */\n  {    33,      9,     12,      0,     69, }, /*  76 */\n  {    33,      9,     12,      0,     71, }, /*  77 */\n  {    33,      5,     12,      0,  10783, }, /*  78 */\n  {    33,      5,     12,      0,  10780, }, /*  79 */\n  {    33,      5,     12,      0,  10782, }, /*  80 */\n  {    33,      5,     12,      0,   -210, }, /*  81 */\n  {    33,      5,     12,      0,   -206, }, /*  82 */\n  {    33,      5,     12,      0,   -205, }, /*  83 */\n  {    33,      5,     12,      0,   -202, }, /*  84 */\n  {    33,      5,     12,      0,   -203, }, /*  85 */\n  {    33,      5,     12,      0,  42319, }, /*  86 */\n  {    33,      5,     12,      0,  42315, }, /*  87 */\n  {    33,      5,     12,      0,   -207, }, /*  88 */\n  {    33,      5,     12,      0,  42280, }, /*  89 */\n  {    33,      5,     12,      0,  42308, }, /*  90 */\n  {    33,      5,     12,      0,   -209, }, /*  91 */\n  {    33,      5,     12,      0,   -211, }, /*  92 */\n  {    33,      5,     12,      0,  10743, }, /*  93 */\n  {    33,      5,     12,      0,  42305, }, /*  94 */\n  {    33,      5,     12,      0,  10749, }, /*  95 */\n  {    33,      5,     12,      0,   -213, }, /*  96 */\n  {    33,      5,     12,      0,   -214, }, /*  97 */\n  {    33,      5,     12,      0,  10727, }, /*  98 */\n  {    33,      5,     12,      0,   -218, }, /*  99 */\n  {    33,      5,     12,      0,  42282, }, /* 100 */\n  {    33,      5,     12,      0,    -69, }, /* 101 */\n  {    33,      5,     12,      0,   -217, }, /* 102 */\n  {    33,      5,     12,      0,    -71, }, /* 103 */\n  {    33,      5,     12,      0,   -219, }, /* 104 */\n  {    33,      5,     12,      0,  42258, }, /* 105 */\n  {    33,      6,     12,      0,      0, }, /* 106 */\n  {     9,      6,     12,      0,      0, }, /* 107 */\n  {     3,     24,     12,      0,      0, }, /* 108 */\n  {    27,     12,      3,      0,      0, }, /* 109 */\n  {    27,     12,      3,     21,    116, }, /* 110 */\n  {    19,      9,     12,      0,      1, }, /* 111 */\n  {    19,      5,     12,      0,     -1, }, /* 112 */\n  {    19,     24,     12,      0,      0, }, /* 113 */\n  {     9,      2,     12,      0,      0, }, /* 114 */\n  {    19,      6,     12,      0,      0, }, /* 115 */\n  {    19,      5,     12,      0,    130, }, /* 116 */\n  {    19,      9,     12,      0,    116, }, /* 117 */\n  {    19,      9,     12,      0,     38, }, /* 118 */\n  {    19,      9,     12,      0,     37, }, /* 119 */\n  {    19,      9,     12,      0,     64, }, /* 120 */\n  {    19,      9,     12,      0,     63, }, /* 121 */\n  {    19,      5,     12,      0,      0, }, /* 122 */\n  {    19,      9,     12,      0,     32, }, /* 123 */\n  {    19,      9,     12,     34,     32, }, /* 124 */\n  {    19,      9,     12,     59,     32, }, /* 125 */\n  {    19,      9,     12,     38,     32, }, /* 126 */\n  {    19,      9,     12,     21,     32, }, /* 127 */\n  {    19,      9,     12,     51,     32, }, /* 128 */\n  {    19,      9,     12,     26,     32, }, /* 129 */\n  {    19,      9,     12,     47,     32, }, /* 130 */\n  {    19,      9,     12,     55,     32, }, /* 131 */\n  {    19,      9,     12,     30,     32, }, /* 132 */\n  {    19,      9,     12,     43,     32, }, /* 133 */\n  {    19,      9,     12,     67,     32, }, /* 134 */\n  {    19,      5,     12,      0,    -38, }, /* 135 */\n  {    19,      5,     12,      0,    -37, }, /* 136 */\n  {    19,      5,     12,      0,    -32, }, /* 137 */\n  {    19,      5,     12,     34,    -32, }, /* 138 */\n  {    19,      5,     12,     59,    -32, }, /* 139 */\n  {    19,      5,     12,     38,    -32, }, /* 140 */\n  {    19,      5,     12,     21,   -116, }, /* 141 */\n  {    19,      5,     12,     51,    -32, }, /* 142 */\n  {    19,      5,     12,     26,   -775, }, /* 143 */\n  {    19,      5,     12,     47,    -32, }, /* 144 */\n  {    19,      5,     12,     55,    -32, }, /* 145 */\n  {    19,      5,     12,     30,      1, }, /* 146 */\n  {    19,      5,     12,     30,    -32, }, /* 147 */\n  {    19,      5,     12,     43,    -32, }, /* 148 */\n  {    19,      5,     12,     67,    -32, }, /* 149 */\n  {    19,      5,     12,      0,    -64, }, /* 150 */\n  {    19,      5,     12,      0,    -63, }, /* 151 */\n  {    19,      9,     12,      0,      8, }, /* 152 */\n  {    19,      5,     12,     34,    -30, }, /* 153 */\n  {    19,      5,     12,     38,    -25, }, /* 154 */\n  {    19,      9,     12,      0,      0, }, /* 155 */\n  {    19,      5,     12,     43,    -15, }, /* 156 */\n  {    19,      5,     12,     47,    -22, }, /* 157 */\n  {    19,      5,     12,      0,     -8, }, /* 158 */\n  {    10,      9,     12,      0,      1, }, /* 159 */\n  {    10,      5,     12,      0,     -1, }, /* 160 */\n  {    19,      5,     12,     51,    -54, }, /* 161 */\n  {    19,      5,     12,     55,    -48, }, /* 162 */\n  {    19,      5,     12,      0,      7, }, /* 163 */\n  {    19,      5,     12,      0,   -116, }, /* 164 */\n  {    19,      9,     12,     38,    -60, }, /* 165 */\n  {    19,      5,     12,     59,    -64, }, /* 166 */\n  {    19,     25,     12,      0,      0, }, /* 167 */\n  {    19,      9,     12,      0,     -7, }, /* 168 */\n  {    19,      9,     12,      0,   -130, }, /* 169 */\n  {    12,      9,     12,      0,     80, }, /* 170 */\n  {    12,      9,     12,      0,     32, }, /* 171 */\n  {    12,      5,     12,      0,    -32, }, /* 172 */\n  {    12,      5,     12,      0,    -80, }, /* 173 */\n  {    12,      9,     12,      0,      1, }, /* 174 */\n  {    12,      5,     12,      0,     -1, }, /* 175 */\n  {    12,     26,     12,      0,      0, }, /* 176 */\n  {    12,     12,      3,      0,      0, }, /* 177 */\n  {    12,     11,      3,      0,      0, }, /* 178 */\n  {    12,      9,     12,      0,     15, }, /* 179 */\n  {    12,      5,     12,      0,    -15, }, /* 180 */\n  {     1,      9,     12,      0,     48, }, /* 181 */\n  {     1,      6,     12,      0,      0, }, /* 182 */\n  {     1,     21,     12,      0,      0, }, /* 183 */\n  {     1,      5,     12,      0,    -48, }, /* 184 */\n  {     1,      5,     12,      0,      0, }, /* 185 */\n  {     1,     17,     12,      0,      0, }, /* 186 */\n  {     1,     26,     12,      0,      0, }, /* 187 */\n  {     1,     23,     12,      0,      0, }, /* 188 */\n  {    25,     12,      3,      0,      0, }, /* 189 */\n  {    25,     17,     12,      0,      0, }, /* 190 */\n  {    25,     21,     12,      0,      0, }, /* 191 */\n  {    25,      7,     12,      0,      0, }, /* 192 */\n  {     0,      1,      2,      0,      0, }, /* 193 */\n  {     0,     25,     12,      0,      0, }, /* 194 */\n  {     0,     21,     12,      0,      0, }, /* 195 */\n  {     0,     23,     12,      0,      0, }, /* 196 */\n  {     0,     26,     12,      0,      0, }, /* 197 */\n  {     0,     12,      3,      0,      0, }, /* 198 */\n  {     0,      7,     12,      0,      0, }, /* 199 */\n  {     0,      6,     12,      0,      0, }, /* 200 */\n  {     0,     13,     12,      0,      0, }, /* 201 */\n  {    49,     21,     12,      0,      0, }, /* 202 */\n  {    49,      1,      2,      0,      0, }, /* 203 */\n  {    49,      7,     12,      0,      0, }, /* 204 */\n  {    49,     12,      3,      0,      0, }, /* 205 */\n  {    55,      7,     12,      0,      0, }, /* 206 */\n  {    55,     12,      3,      0,      0, }, /* 207 */\n  {    63,     13,     12,      0,      0, }, /* 208 */\n  {    63,      7,     12,      0,      0, }, /* 209 */\n  {    63,     12,      3,      0,      0, }, /* 210 */\n  {    63,      6,     12,      0,      0, }, /* 211 */\n  {    63,     26,     12,      0,      0, }, /* 212 */\n  {    63,     21,     12,      0,      0, }, /* 213 */\n  {    89,      7,     12,      0,      0, }, /* 214 */\n  {    89,     12,      3,      0,      0, }, /* 215 */\n  {    89,      6,     12,      0,      0, }, /* 216 */\n  {    89,     21,     12,      0,      0, }, /* 217 */\n  {    94,      7,     12,      0,      0, }, /* 218 */\n  {    94,     12,      3,      0,      0, }, /* 219 */\n  {    94,     21,     12,      0,      0, }, /* 220 */\n  {    14,     12,      3,      0,      0, }, /* 221 */\n  {    14,     10,      5,      0,      0, }, /* 222 */\n  {    14,      7,     12,      0,      0, }, /* 223 */\n  {    14,     13,     12,      0,      0, }, /* 224 */\n  {    14,     21,     12,      0,      0, }, /* 225 */\n  {    14,      6,     12,      0,      0, }, /* 226 */\n  {     2,      7,     12,      0,      0, }, /* 227 */\n  {     2,     12,      3,      0,      0, }, /* 228 */\n  {     2,     10,      5,      0,      0, }, /* 229 */\n  {     2,     10,      3,      0,      0, }, /* 230 */\n  {     2,     13,     12,      0,      0, }, /* 231 */\n  {     2,     23,     12,      0,      0, }, /* 232 */\n  {     2,     15,     12,      0,      0, }, /* 233 */\n  {     2,     26,     12,      0,      0, }, /* 234 */\n  {    21,     12,      3,      0,      0, }, /* 235 */\n  {    21,     10,      5,      0,      0, }, /* 236 */\n  {    21,      7,     12,      0,      0, }, /* 237 */\n  {    21,     13,     12,      0,      0, }, /* 238 */\n  {    20,     12,      3,      0,      0, }, /* 239 */\n  {    20,     10,      5,      0,      0, }, /* 240 */\n  {    20,      7,     12,      0,      0, }, /* 241 */\n  {    20,     13,     12,      0,      0, }, /* 242 */\n  {    20,     21,     12,      0,      0, }, /* 243 */\n  {    20,     23,     12,      0,      0, }, /* 244 */\n  {    43,     12,      3,      0,      0, }, /* 245 */\n  {    43,     10,      5,      0,      0, }, /* 246 */\n  {    43,      7,     12,      0,      0, }, /* 247 */\n  {    43,     10,      3,      0,      0, }, /* 248 */\n  {    43,     13,     12,      0,      0, }, /* 249 */\n  {    43,     26,     12,      0,      0, }, /* 250 */\n  {    43,     15,     12,      0,      0, }, /* 251 */\n  {    53,     12,      3,      0,      0, }, /* 252 */\n  {    53,      7,     12,      0,      0, }, /* 253 */\n  {    53,     10,      3,      0,      0, }, /* 254 */\n  {    53,     10,      5,      0,      0, }, /* 255 */\n  {    53,     13,     12,      0,      0, }, /* 256 */\n  {    53,     15,     12,      0,      0, }, /* 257 */\n  {    53,     26,     12,      0,      0, }, /* 258 */\n  {    53,     23,     12,      0,      0, }, /* 259 */\n  {    54,     12,      3,      0,      0, }, /* 260 */\n  {    54,     10,      5,      0,      0, }, /* 261 */\n  {    54,      7,     12,      0,      0, }, /* 262 */\n  {    54,     13,     12,      0,      0, }, /* 263 */\n  {    54,     15,     12,      0,      0, }, /* 264 */\n  {    54,     26,     12,      0,      0, }, /* 265 */\n  {    28,     12,      3,      0,      0, }, /* 266 */\n  {    28,     10,      5,      0,      0, }, /* 267 */\n  {    28,      7,     12,      0,      0, }, /* 268 */\n  {    28,     10,      3,      0,      0, }, /* 269 */\n  {    28,     13,     12,      0,      0, }, /* 270 */\n  {    36,     12,      3,      0,      0, }, /* 271 */\n  {    36,     10,      5,      0,      0, }, /* 272 */\n  {    36,      7,     12,      0,      0, }, /* 273 */\n  {    36,     10,      3,      0,      0, }, /* 274 */\n  {    36,     13,     12,      0,      0, }, /* 275 */\n  {    36,     15,     12,      0,      0, }, /* 276 */\n  {    36,     26,     12,      0,      0, }, /* 277 */\n  {    47,     10,      5,      0,      0, }, /* 278 */\n  {    47,      7,     12,      0,      0, }, /* 279 */\n  {    47,     12,      3,      0,      0, }, /* 280 */\n  {    47,     10,      3,      0,      0, }, /* 281 */\n  {    47,     13,     12,      0,      0, }, /* 282 */\n  {    47,     21,     12,      0,      0, }, /* 283 */\n  {    56,      7,     12,      0,      0, }, /* 284 */\n  {    56,     12,      3,      0,      0, }, /* 285 */\n  {    56,      7,      5,      0,      0, }, /* 286 */\n  {    56,      6,     12,      0,      0, }, /* 287 */\n  {    56,     21,     12,      0,      0, }, /* 288 */\n  {    56,     13,     12,      0,      0, }, /* 289 */\n  {    32,      7,     12,      0,      0, }, /* 290 */\n  {    32,     12,      3,      0,      0, }, /* 291 */\n  {    32,      7,      5,      0,      0, }, /* 292 */\n  {    32,      6,     12,      0,      0, }, /* 293 */\n  {    32,     13,     12,      0,      0, }, /* 294 */\n  {    57,      7,     12,      0,      0, }, /* 295 */\n  {    57,     26,     12,      0,      0, }, /* 296 */\n  {    57,     21,     12,      0,      0, }, /* 297 */\n  {    57,     12,      3,      0,      0, }, /* 298 */\n  {    57,     13,     12,      0,      0, }, /* 299 */\n  {    57,     15,     12,      0,      0, }, /* 300 */\n  {    57,     22,     12,      0,      0, }, /* 301 */\n  {    57,     18,     12,      0,      0, }, /* 302 */\n  {    57,     10,      5,      0,      0, }, /* 303 */\n  {    38,      7,     12,      0,      0, }, /* 304 */\n  {    38,     10,     12,      0,      0, }, /* 305 */\n  {    38,     12,      3,      0,      0, }, /* 306 */\n  {    38,     10,      5,      0,      0, }, /* 307 */\n  {    38,     13,     12,      0,      0, }, /* 308 */\n  {    38,     21,     12,      0,      0, }, /* 309 */\n  {    38,     26,     12,      0,      0, }, /* 310 */\n  {    16,      9,     12,      0,   7264, }, /* 311 */\n  {    16,      7,     12,      0,      0, }, /* 312 */\n  {    16,      6,     12,      0,      0, }, /* 313 */\n  {    23,      7,      6,      0,      0, }, /* 314 */\n  {    23,      7,      7,      0,      0, }, /* 315 */\n  {    23,      7,      8,      0,      0, }, /* 316 */\n  {    15,      7,     12,      0,      0, }, /* 317 */\n  {    15,     12,      3,      0,      0, }, /* 318 */\n  {    15,     21,     12,      0,      0, }, /* 319 */\n  {    15,     15,     12,      0,      0, }, /* 320 */\n  {    15,     26,     12,      0,      0, }, /* 321 */\n  {     8,      7,     12,      0,      0, }, /* 322 */\n  {     7,     17,     12,      0,      0, }, /* 323 */\n  {     7,      7,     12,      0,      0, }, /* 324 */\n  {     7,     21,     12,      0,      0, }, /* 325 */\n  {    40,     29,     12,      0,      0, }, /* 326 */\n  {    40,      7,     12,      0,      0, }, /* 327 */\n  {    40,     22,     12,      0,      0, }, /* 328 */\n  {    40,     18,     12,      0,      0, }, /* 329 */\n  {    45,      7,     12,      0,      0, }, /* 330 */\n  {    45,     14,     12,      0,      0, }, /* 331 */\n  {    50,      7,     12,      0,      0, }, /* 332 */\n  {    50,     12,      3,      0,      0, }, /* 333 */\n  {    24,      7,     12,      0,      0, }, /* 334 */\n  {    24,     12,      3,      0,      0, }, /* 335 */\n  {     6,      7,     12,      0,      0, }, /* 336 */\n  {     6,     12,      3,      0,      0, }, /* 337 */\n  {    51,      7,     12,      0,      0, }, /* 338 */\n  {    51,     12,      3,      0,      0, }, /* 339 */\n  {    31,      7,     12,      0,      0, }, /* 340 */\n  {    31,     12,      3,      0,      0, }, /* 341 */\n  {    31,     10,      5,      0,      0, }, /* 342 */\n  {    31,     21,     12,      0,      0, }, /* 343 */\n  {    31,      6,     12,      0,      0, }, /* 344 */\n  {    31,     23,     12,      0,      0, }, /* 345 */\n  {    31,     13,     12,      0,      0, }, /* 346 */\n  {    31,     15,     12,      0,      0, }, /* 347 */\n  {    37,     21,     12,      0,      0, }, /* 348 */\n  {    37,     17,     12,      0,      0, }, /* 349 */\n  {    37,     12,      3,      0,      0, }, /* 350 */\n  {    37,      1,      2,      0,      0, }, /* 351 */\n  {    37,     13,     12,      0,      0, }, /* 352 */\n  {    37,      7,     12,      0,      0, }, /* 353 */\n  {    37,      6,     12,      0,      0, }, /* 354 */\n  {    34,      7,     12,      0,      0, }, /* 355 */\n  {    34,     12,      3,      0,      0, }, /* 356 */\n  {    34,     10,      5,      0,      0, }, /* 357 */\n  {    34,     26,     12,      0,      0, }, /* 358 */\n  {    34,     21,     12,      0,      0, }, /* 359 */\n  {    34,     13,     12,      0,      0, }, /* 360 */\n  {    52,      7,     12,      0,      0, }, /* 361 */\n  {    39,      7,     12,      0,      0, }, /* 362 */\n  {    39,     10,     12,      0,      0, }, /* 363 */\n  {    39,     10,      5,      0,      0, }, /* 364 */\n  {    39,     13,     12,      0,      0, }, /* 365 */\n  {    39,     15,     12,      0,      0, }, /* 366 */\n  {    39,     26,     12,      0,      0, }, /* 367 */\n  {    31,     26,     12,      0,      0, }, /* 368 */\n  {     5,      7,     12,      0,      0, }, /* 369 */\n  {     5,     12,      3,      0,      0, }, /* 370 */\n  {     5,     10,      5,      0,      0, }, /* 371 */\n  {     5,     21,     12,      0,      0, }, /* 372 */\n  {    90,      7,     12,      0,      0, }, /* 373 */\n  {    90,     10,      5,      0,      0, }, /* 374 */\n  {    90,     12,      3,      0,      0, }, /* 375 */\n  {    90,     10,     12,      0,      0, }, /* 376 */\n  {    90,     13,     12,      0,      0, }, /* 377 */\n  {    90,     21,     12,      0,      0, }, /* 378 */\n  {    90,      6,     12,      0,      0, }, /* 379 */\n  {    27,     11,      3,      0,      0, }, /* 380 */\n  {    61,     12,      3,      0,      0, }, /* 381 */\n  {    61,     10,      5,      0,      0, }, /* 382 */\n  {    61,      7,     12,      0,      0, }, /* 383 */\n  {    61,     13,     12,      0,      0, }, /* 384 */\n  {    61,     21,     12,      0,      0, }, /* 385 */\n  {    61,     26,     12,      0,      0, }, /* 386 */\n  {    75,     12,      3,      0,      0, }, /* 387 */\n  {    75,     10,      5,      0,      0, }, /* 388 */\n  {    75,      7,     12,      0,      0, }, /* 389 */\n  {    75,     13,     12,      0,      0, }, /* 390 */\n  {    92,      7,     12,      0,      0, }, /* 391 */\n  {    92,     12,      3,      0,      0, }, /* 392 */\n  {    92,     10,      5,      0,      0, }, /* 393 */\n  {    92,     21,     12,      0,      0, }, /* 394 */\n  {    69,      7,     12,      0,      0, }, /* 395 */\n  {    69,     10,      5,      0,      0, }, /* 396 */\n  {    69,     12,      3,      0,      0, }, /* 397 */\n  {    69,     21,     12,      0,      0, }, /* 398 */\n  {    69,     13,     12,      0,      0, }, /* 399 */\n  {    72,     13,     12,      0,      0, }, /* 400 */\n  {    72,      7,     12,      0,      0, }, /* 401 */\n  {    72,      6,     12,      0,      0, }, /* 402 */\n  {    72,     21,     12,      0,      0, }, /* 403 */\n  {    75,     21,     12,      0,      0, }, /* 404 */\n  {     9,     10,      5,      0,      0, }, /* 405 */\n  {     9,      7,     12,      0,      0, }, /* 406 */\n  {    12,      5,     12,      0,      0, }, /* 407 */\n  {    12,      6,     12,      0,      0, }, /* 408 */\n  {    33,      5,     12,      0,  35332, }, /* 409 */\n  {    33,      5,     12,      0,   3814, }, /* 410 */\n  {    33,      9,     12,     63,      1, }, /* 411 */\n  {    33,      5,     12,     63,     -1, }, /* 412 */\n  {    33,      5,     12,     63,    -58, }, /* 413 */\n  {    33,      9,     12,      0,  -7615, }, /* 414 */\n  {    19,      5,     12,      0,      8, }, /* 415 */\n  {    19,      9,     12,      0,     -8, }, /* 416 */\n  {    19,      5,     12,      0,     74, }, /* 417 */\n  {    19,      5,     12,      0,     86, }, /* 418 */\n  {    19,      5,     12,      0,    100, }, /* 419 */\n  {    19,      5,     12,      0,    128, }, /* 420 */\n  {    19,      5,     12,      0,    112, }, /* 421 */\n  {    19,      5,     12,      0,    126, }, /* 422 */\n  {    19,      8,     12,      0,     -8, }, /* 423 */\n  {    19,      5,     12,      0,      9, }, /* 424 */\n  {    19,      9,     12,      0,    -74, }, /* 425 */\n  {    19,      8,     12,      0,     -9, }, /* 426 */\n  {    19,      5,     12,     21,  -7173, }, /* 427 */\n  {    19,      9,     12,      0,    -86, }, /* 428 */\n  {    19,      9,     12,      0,   -100, }, /* 429 */\n  {    19,      9,     12,      0,   -112, }, /* 430 */\n  {    19,      9,     12,      0,   -128, }, /* 431 */\n  {    19,      9,     12,      0,   -126, }, /* 432 */\n  {    27,      1,      3,      0,      0, }, /* 433 */\n  {     9,     27,      2,      0,      0, }, /* 434 */\n  {     9,     28,      2,      0,      0, }, /* 435 */\n  {     9,      2,      2,      0,      0, }, /* 436 */\n  {     9,      9,     12,      0,      0, }, /* 437 */\n  {     9,      5,     12,      0,      0, }, /* 438 */\n  {    19,      9,     12,     67,  -7517, }, /* 439 */\n  {    33,      9,     12,     71,  -8383, }, /* 440 */\n  {    33,      9,     12,     75,  -8262, }, /* 441 */\n  {    33,      9,     12,      0,     28, }, /* 442 */\n  {    33,      5,     12,      0,    -28, }, /* 443 */\n  {    33,     14,     12,      0,     16, }, /* 444 */\n  {    33,     14,     12,      0,    -16, }, /* 445 */\n  {    33,     14,     12,      0,      0, }, /* 446 */\n  {     9,     26,     12,      0,     26, }, /* 447 */\n  {     9,     26,     12,      0,    -26, }, /* 448 */\n  {     4,     26,     12,      0,      0, }, /* 449 */\n  {    17,      9,     12,      0,     48, }, /* 450 */\n  {    17,      5,     12,      0,    -48, }, /* 451 */\n  {    33,      9,     12,      0, -10743, }, /* 452 */\n  {    33,      9,     12,      0,  -3814, }, /* 453 */\n  {    33,      9,     12,      0, -10727, }, /* 454 */\n  {    33,      5,     12,      0, -10795, }, /* 455 */\n  {    33,      5,     12,      0, -10792, }, /* 456 */\n  {    33,      9,     12,      0, -10780, }, /* 457 */\n  {    33,      9,     12,      0, -10749, }, /* 458 */\n  {    33,      9,     12,      0, -10783, }, /* 459 */\n  {    33,      9,     12,      0, -10782, }, /* 460 */\n  {    33,      9,     12,      0, -10815, }, /* 461 */\n  {    10,      5,     12,      0,      0, }, /* 462 */\n  {    10,     26,     12,      0,      0, }, /* 463 */\n  {    10,     12,      3,      0,      0, }, /* 464 */\n  {    10,     21,     12,      0,      0, }, /* 465 */\n  {    10,     15,     12,      0,      0, }, /* 466 */\n  {    16,      5,     12,      0,  -7264, }, /* 467 */\n  {    58,      7,     12,      0,      0, }, /* 468 */\n  {    58,      6,     12,      0,      0, }, /* 469 */\n  {    58,     21,     12,      0,      0, }, /* 470 */\n  {    58,     12,      3,      0,      0, }, /* 471 */\n  {    22,     26,     12,      0,      0, }, /* 472 */\n  {    22,      6,     12,      0,      0, }, /* 473 */\n  {    22,     14,     12,      0,      0, }, /* 474 */\n  {    23,     10,      3,      0,      0, }, /* 475 */\n  {    26,      7,     12,      0,      0, }, /* 476 */\n  {    26,      6,     12,      0,      0, }, /* 477 */\n  {    29,      7,     12,      0,      0, }, /* 478 */\n  {    29,      6,     12,      0,      0, }, /* 479 */\n  {     3,      7,     12,      0,      0, }, /* 480 */\n  {    23,      7,     12,      0,      0, }, /* 481 */\n  {    23,     26,     12,      0,      0, }, /* 482 */\n  {    29,     26,     12,      0,      0, }, /* 483 */\n  {    22,      7,     12,      0,      0, }, /* 484 */\n  {    60,      7,     12,      0,      0, }, /* 485 */\n  {    60,      6,     12,      0,      0, }, /* 486 */\n  {    60,     26,     12,      0,      0, }, /* 487 */\n  {    85,      7,     12,      0,      0, }, /* 488 */\n  {    85,      6,     12,      0,      0, }, /* 489 */\n  {    85,     21,     12,      0,      0, }, /* 490 */\n  {    76,      7,     12,      0,      0, }, /* 491 */\n  {    76,      6,     12,      0,      0, }, /* 492 */\n  {    76,     21,     12,      0,      0, }, /* 493 */\n  {    76,     13,     12,      0,      0, }, /* 494 */\n  {    12,      7,     12,      0,      0, }, /* 495 */\n  {    12,     21,     12,      0,      0, }, /* 496 */\n  {    78,      7,     12,      0,      0, }, /* 497 */\n  {    78,     14,     12,      0,      0, }, /* 498 */\n  {    78,     12,      3,      0,      0, }, /* 499 */\n  {    78,     21,     12,      0,      0, }, /* 500 */\n  {    33,      9,     12,      0, -35332, }, /* 501 */\n  {    33,      9,     12,      0, -42280, }, /* 502 */\n  {    33,      9,     12,      0, -42308, }, /* 503 */\n  {    33,      9,     12,      0, -42319, }, /* 504 */\n  {    33,      9,     12,      0, -42315, }, /* 505 */\n  {    33,      9,     12,      0, -42305, }, /* 506 */\n  {    33,      9,     12,      0, -42258, }, /* 507 */\n  {    33,      9,     12,      0, -42282, }, /* 508 */\n  {    48,      7,     12,      0,      0, }, /* 509 */\n  {    48,     12,      3,      0,      0, }, /* 510 */\n  {    48,     10,      5,      0,      0, }, /* 511 */\n  {    48,     26,     12,      0,      0, }, /* 512 */\n  {    64,      7,     12,      0,      0, }, /* 513 */\n  {    64,     21,     12,      0,      0, }, /* 514 */\n  {    74,     10,      5,      0,      0, }, /* 515 */\n  {    74,      7,     12,      0,      0, }, /* 516 */\n  {    74,     12,      3,      0,      0, }, /* 517 */\n  {    74,     21,     12,      0,      0, }, /* 518 */\n  {    74,     13,     12,      0,      0, }, /* 519 */\n  {    68,     13,     12,      0,      0, }, /* 520 */\n  {    68,      7,     12,      0,      0, }, /* 521 */\n  {    68,     12,      3,      0,      0, }, /* 522 */\n  {    68,     21,     12,      0,      0, }, /* 523 */\n  {    73,      7,     12,      0,      0, }, /* 524 */\n  {    73,     12,      3,      0,      0, }, /* 525 */\n  {    73,     10,      5,      0,      0, }, /* 526 */\n  {    73,     21,     12,      0,      0, }, /* 527 */\n  {    83,     12,      3,      0,      0, }, /* 528 */\n  {    83,     10,      5,      0,      0, }, /* 529 */\n  {    83,      7,     12,      0,      0, }, /* 530 */\n  {    83,     21,     12,      0,      0, }, /* 531 */\n  {    83,     13,     12,      0,      0, }, /* 532 */\n  {    38,      6,     12,      0,      0, }, /* 533 */\n  {    67,      7,     12,      0,      0, }, /* 534 */\n  {    67,     12,      3,      0,      0, }, /* 535 */\n  {    67,     10,      5,      0,      0, }, /* 536 */\n  {    67,     13,     12,      0,      0, }, /* 537 */\n  {    67,     21,     12,      0,      0, }, /* 538 */\n  {    91,      7,     12,      0,      0, }, /* 539 */\n  {    91,     12,      3,      0,      0, }, /* 540 */\n  {    91,      6,     12,      0,      0, }, /* 541 */\n  {    91,     21,     12,      0,      0, }, /* 542 */\n  {    86,      7,     12,      0,      0, }, /* 543 */\n  {    86,     10,      5,      0,      0, }, /* 544 */\n  {    86,     12,      3,      0,      0, }, /* 545 */\n  {    86,     21,     12,      0,      0, }, /* 546 */\n  {    86,      6,     12,      0,      0, }, /* 547 */\n  {    86,     13,     12,      0,      0, }, /* 548 */\n  {    23,      7,      9,      0,      0, }, /* 549 */\n  {    23,      7,     10,      0,      0, }, /* 550 */\n  {     9,      4,      2,      0,      0, }, /* 551 */\n  {     9,      3,     12,      0,      0, }, /* 552 */\n  {    25,     25,     12,      0,      0, }, /* 553 */\n  {     0,     24,     12,      0,      0, }, /* 554 */\n  {     9,      6,      3,      0,      0, }, /* 555 */\n  {    35,      7,     12,      0,      0, }, /* 556 */\n  {    19,     14,     12,      0,      0, }, /* 557 */\n  {    19,     15,     12,      0,      0, }, /* 558 */\n  {    19,     26,     12,      0,      0, }, /* 559 */\n  {    70,      7,     12,      0,      0, }, /* 560 */\n  {    66,      7,     12,      0,      0, }, /* 561 */\n  {    41,      7,     12,      0,      0, }, /* 562 */\n  {    41,     15,     12,      0,      0, }, /* 563 */\n  {    18,      7,     12,      0,      0, }, /* 564 */\n  {    18,     14,     12,      0,      0, }, /* 565 */\n  {   117,      7,     12,      0,      0, }, /* 566 */\n  {   117,     12,      3,      0,      0, }, /* 567 */\n  {    59,      7,     12,      0,      0, }, /* 568 */\n  {    59,     21,     12,      0,      0, }, /* 569 */\n  {    42,      7,     12,      0,      0, }, /* 570 */\n  {    42,     21,     12,      0,      0, }, /* 571 */\n  {    42,     14,     12,      0,      0, }, /* 572 */\n  {    13,      9,     12,      0,     40, }, /* 573 */\n  {    13,      5,     12,      0,    -40, }, /* 574 */\n  {    46,      7,     12,      0,      0, }, /* 575 */\n  {    44,      7,     12,      0,      0, }, /* 576 */\n  {    44,     13,     12,      0,      0, }, /* 577 */\n  {   105,      7,     12,      0,      0, }, /* 578 */\n  {   103,      7,     12,      0,      0, }, /* 579 */\n  {   103,     21,     12,      0,      0, }, /* 580 */\n  {   109,      7,     12,      0,      0, }, /* 581 */\n  {    11,      7,     12,      0,      0, }, /* 582 */\n  {    80,      7,     12,      0,      0, }, /* 583 */\n  {    80,     21,     12,      0,      0, }, /* 584 */\n  {    80,     15,     12,      0,      0, }, /* 585 */\n  {   119,      7,     12,      0,      0, }, /* 586 */\n  {   119,     26,     12,      0,      0, }, /* 587 */\n  {   119,     15,     12,      0,      0, }, /* 588 */\n  {   115,      7,     12,      0,      0, }, /* 589 */\n  {   115,     15,     12,      0,      0, }, /* 590 */\n  {    65,      7,     12,      0,      0, }, /* 591 */\n  {    65,     15,     12,      0,      0, }, /* 592 */\n  {    65,     21,     12,      0,      0, }, /* 593 */\n  {    71,      7,     12,      0,      0, }, /* 594 */\n  {    71,     21,     12,      0,      0, }, /* 595 */\n  {    97,      7,     12,      0,      0, }, /* 596 */\n  {    96,      7,     12,      0,      0, }, /* 597 */\n  {    30,      7,     12,      0,      0, }, /* 598 */\n  {    30,     12,      3,      0,      0, }, /* 599 */\n  {    30,     15,     12,      0,      0, }, /* 600 */\n  {    30,     21,     12,      0,      0, }, /* 601 */\n  {    87,      7,     12,      0,      0, }, /* 602 */\n  {    87,     15,     12,      0,      0, }, /* 603 */\n  {    87,     21,     12,      0,      0, }, /* 604 */\n  {   116,      7,     12,      0,      0, }, /* 605 */\n  {   116,     15,     12,      0,      0, }, /* 606 */\n  {   111,      7,     12,      0,      0, }, /* 607 */\n  {   111,     26,     12,      0,      0, }, /* 608 */\n  {   111,     12,      3,      0,      0, }, /* 609 */\n  {   111,     15,     12,      0,      0, }, /* 610 */\n  {   111,     21,     12,      0,      0, }, /* 611 */\n  {    77,      7,     12,      0,      0, }, /* 612 */\n  {    77,     21,     12,      0,      0, }, /* 613 */\n  {    82,      7,     12,      0,      0, }, /* 614 */\n  {    82,     15,     12,      0,      0, }, /* 615 */\n  {    81,      7,     12,      0,      0, }, /* 616 */\n  {    81,     15,     12,      0,      0, }, /* 617 */\n  {   120,      7,     12,      0,      0, }, /* 618 */\n  {   120,     21,     12,      0,      0, }, /* 619 */\n  {   120,     15,     12,      0,      0, }, /* 620 */\n  {    88,      7,     12,      0,      0, }, /* 621 */\n  {     0,     15,     12,      0,      0, }, /* 622 */\n  {    93,     10,      5,      0,      0, }, /* 623 */\n  {    93,     12,      3,      0,      0, }, /* 624 */\n  {    93,      7,     12,      0,      0, }, /* 625 */\n  {    93,     21,     12,      0,      0, }, /* 626 */\n  {    93,     15,     12,      0,      0, }, /* 627 */\n  {    93,     13,     12,      0,      0, }, /* 628 */\n  {    84,     12,      3,      0,      0, }, /* 629 */\n  {    84,     10,      5,      0,      0, }, /* 630 */\n  {    84,      7,     12,      0,      0, }, /* 631 */\n  {    84,     21,     12,      0,      0, }, /* 632 */\n  {    84,      1,      2,      0,      0, }, /* 633 */\n  {   100,      7,     12,      0,      0, }, /* 634 */\n  {   100,     13,     12,      0,      0, }, /* 635 */\n  {    95,     12,      3,      0,      0, }, /* 636 */\n  {    95,      7,     12,      0,      0, }, /* 637 */\n  {    95,     10,      5,      0,      0, }, /* 638 */\n  {    95,     13,     12,      0,      0, }, /* 639 */\n  {    95,     21,     12,      0,      0, }, /* 640 */\n  {   110,      7,     12,      0,      0, }, /* 641 */\n  {   110,     12,      3,      0,      0, }, /* 642 */\n  {   110,     21,     12,      0,      0, }, /* 643 */\n  {    99,     12,      3,      0,      0, }, /* 644 */\n  {    99,     10,      5,      0,      0, }, /* 645 */\n  {    99,      7,     12,      0,      0, }, /* 646 */\n  {    99,     21,     12,      0,      0, }, /* 647 */\n  {    99,     13,     12,      0,      0, }, /* 648 */\n  {    47,     15,     12,      0,      0, }, /* 649 */\n  {   107,      7,     12,      0,      0, }, /* 650 */\n  {   107,     10,      5,      0,      0, }, /* 651 */\n  {   107,     12,      3,      0,      0, }, /* 652 */\n  {   107,     21,     12,      0,      0, }, /* 653 */\n  {   108,      7,     12,      0,      0, }, /* 654 */\n  {   108,     12,      3,      0,      0, }, /* 655 */\n  {   108,     10,      5,      0,      0, }, /* 656 */\n  {   108,     13,     12,      0,      0, }, /* 657 */\n  {   106,     12,      3,      0,      0, }, /* 658 */\n  {   106,     10,      5,      0,      0, }, /* 659 */\n  {   106,      7,     12,      0,      0, }, /* 660 */\n  {   106,     10,      3,      0,      0, }, /* 661 */\n  {   123,      7,     12,      0,      0, }, /* 662 */\n  {   123,     10,      3,      0,      0, }, /* 663 */\n  {   123,     10,      5,      0,      0, }, /* 664 */\n  {   123,     12,      3,      0,      0, }, /* 665 */\n  {   123,     21,     12,      0,      0, }, /* 666 */\n  {   123,     13,     12,      0,      0, }, /* 667 */\n  {   122,      7,     12,      0,      0, }, /* 668 */\n  {   122,     10,      3,      0,      0, }, /* 669 */\n  {   122,     10,      5,      0,      0, }, /* 670 */\n  {   122,     12,      3,      0,      0, }, /* 671 */\n  {   122,     21,     12,      0,      0, }, /* 672 */\n  {   113,      7,     12,      0,      0, }, /* 673 */\n  {   113,     10,      5,      0,      0, }, /* 674 */\n  {   113,     12,      3,      0,      0, }, /* 675 */\n  {   113,     21,     12,      0,      0, }, /* 676 */\n  {   113,     13,     12,      0,      0, }, /* 677 */\n  {   101,      7,     12,      0,      0, }, /* 678 */\n  {   101,     12,      3,      0,      0, }, /* 679 */\n  {   101,     10,      5,      0,      0, }, /* 680 */\n  {   101,     13,     12,      0,      0, }, /* 681 */\n  {   124,      9,     12,      0,     32, }, /* 682 */\n  {   124,      5,     12,      0,    -32, }, /* 683 */\n  {   124,     13,     12,      0,      0, }, /* 684 */\n  {   124,     15,     12,      0,      0, }, /* 685 */\n  {   124,      7,     12,      0,      0, }, /* 686 */\n  {   121,      7,     12,      0,      0, }, /* 687 */\n  {    62,      7,     12,      0,      0, }, /* 688 */\n  {    62,     14,     12,      0,      0, }, /* 689 */\n  {    62,     21,     12,      0,      0, }, /* 690 */\n  {    79,      7,     12,      0,      0, }, /* 691 */\n  {   114,      7,     12,      0,      0, }, /* 692 */\n  {   114,     13,     12,      0,      0, }, /* 693 */\n  {   114,     21,     12,      0,      0, }, /* 694 */\n  {   102,      7,     12,      0,      0, }, /* 695 */\n  {   102,     12,      3,      0,      0, }, /* 696 */\n  {   102,     21,     12,      0,      0, }, /* 697 */\n  {   118,      7,     12,      0,      0, }, /* 698 */\n  {   118,     12,      3,      0,      0, }, /* 699 */\n  {   118,     21,     12,      0,      0, }, /* 700 */\n  {   118,     26,     12,      0,      0, }, /* 701 */\n  {   118,      6,     12,      0,      0, }, /* 702 */\n  {   118,     13,     12,      0,      0, }, /* 703 */\n  {   118,     15,     12,      0,      0, }, /* 704 */\n  {    98,      7,     12,      0,      0, }, /* 705 */\n  {    98,     10,      5,      0,      0, }, /* 706 */\n  {    98,     12,      3,      0,      0, }, /* 707 */\n  {    98,      6,     12,      0,      0, }, /* 708 */\n  {   104,      7,     12,      0,      0, }, /* 709 */\n  {   104,     26,     12,      0,      0, }, /* 710 */\n  {   104,     12,      3,      0,      0, }, /* 711 */\n  {   104,     21,     12,      0,      0, }, /* 712 */\n  {     9,     10,      3,      0,      0, }, /* 713 */\n  {    19,     12,      3,      0,      0, }, /* 714 */\n  {   112,      7,     12,      0,      0, }, /* 715 */\n  {   112,     15,     12,      0,      0, }, /* 716 */\n  {   112,     12,      3,      0,      0, }, /* 717 */\n  {     9,     26,     11,      0,      0, }, /* 718 */\n  {    26,     26,     12,      0,      0, }, /* 719 */\n};\n\nconst pcre_uint8 PRIV(ucd_stage1)[] = { /* 8704 bytes */\n  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* U+0000 */\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* U+0800 */\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 42, 43, 44, 45, /* U+1000 */\n 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */\n 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 71, 74, 75, /* U+2000 */\n 76, 76, 66, 77, 66, 66, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, /* U+2800 */\n 88, 89, 90, 91, 92, 93, 94, 71, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+3800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+4000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 95, 95, 95, 95, /* U+4800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+5800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+6800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+7800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+8800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+9000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 97, /* U+9800 */\n 98, 99, 99, 99, 99, 99, 99, 99, 99,100,101,101,102,103,104,105, /* U+A000 */\n106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,114, /* U+A800 */\n115,116,117,118,119,120,114,115,116,117,118,119,120,114,115,116, /* U+B000 */\n117,118,119,120,114,115,116,117,118,119,120,114,115,116,117,118, /* U+B800 */\n119,120,114,115,116,117,118,119,120,114,115,116,117,118,119,120, /* U+C000 */\n114,115,116,117,118,119,120,114,115,116,117,118,119,120,114,115, /* U+C800 */\n116,117,118,119,120,114,115,116,117,118,119,120,114,115,116,121, /* U+D000 */\n122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, /* U+D800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+E800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F000 */\n123,123, 95, 95,124,125,126,127,128,128,129,130,131,132,133,134, /* U+F800 */\n135,136,137,138,139,140,141,142,143,144,145,139,146,146,147,139, /* U+10000 */\n148,149,150,151,152,153,154,155,156,139,139,139,157,139,139,139, /* U+10800 */\n158,159,160,161,162,163,164,139,139,165,139,166,167,168,139,139, /* U+11000 */\n139,169,139,139,139,170,139,139,139,139,139,139,139,139,139,139, /* U+11800 */\n171,171,171,171,171,171,171,172,173,139,139,139,139,139,139,139, /* U+12000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+12800 */\n174,174,174,174,174,174,174,174,175,139,139,139,139,139,139,139, /* U+13000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+13800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+14000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+14800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+15800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+16000 */\n176,176,176,176,177,178,179,180,139,139,139,139,139,139,181,182, /* U+16800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+17800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+18800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+19800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1A800 */\n183,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1B000 */\n139,139,139,139,139,139,139,139,184,185,139,139,139,139,139,139, /* U+1B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1C800 */\n 71,186,187,188,189,139,190,139,191,192,193,194,195,196,197,198, /* U+1D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1E000 */\n199,200,139,139,139,139,139,139,139,139,139,139,201,202,139,139, /* U+1E800 */\n203,204,205,206,207,139,208,209, 71,210,211,212,213,214,215,216, /* U+1F000 */\n217,218,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+1F800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+20800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+21800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+22800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+23800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+24800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+25800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+26800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+27800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+28800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+29800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,219, 95, 95, /* U+2A000 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, /* U+2A800 */\n 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95,220, 95, /* U+2B000 */\n221,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+2F000 */\n 95, 95, 95, 95,221,139,139,139,139,139,139,139,139,139,139,139, /* U+2F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+30800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+31800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+32800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+33800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+34800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+35800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+36800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+37800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+38800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+39800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+3F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+40800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+41800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+42800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+43800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+44800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+45800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+46800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+47800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+48800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+49800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+4F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+50800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+51800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+52800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+53800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+54800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+55800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+56800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+57800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+58800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+59800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+5F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+60800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+61800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+62800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+63800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+64800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+65800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+66800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+67800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+68800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+69800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+6F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+70800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+71800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+72800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+73800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+74800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+75800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+76800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+77800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+78800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+79800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+7F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+80800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+81800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+82800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+83800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+84800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+85800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+86800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+87800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+88800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+89800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+8F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+90800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+91800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+92800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+93800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+94800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+95800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+96800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+97800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+98800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+99800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9A800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9B800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9C800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9D800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9E800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+9F800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A0800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A1800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A2800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A3800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A4800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A5800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A6800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A7800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A8800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+A9800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AA800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AB800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AC800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AD800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AE800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+AF800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B0800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B1800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B2800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B3800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B4800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B5800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B6800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B7800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B8800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+B9800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BA800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BB800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BC800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BD800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BE800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+BF800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C0800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C1800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C2800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C3800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C4800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C5800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C6800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C7800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C8800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+C9800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CA800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CB800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CC800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CD800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CE800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+CF800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D0800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D1800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D2800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D3800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D4800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D5800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D6800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D7800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D8800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+D9800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DA800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DB800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DC800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DD800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DE800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+DF800 */\n222,223,224,225,223,223,223,223,223,223,223,223,223,223,223,223, /* U+E0000 */\n223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223, /* U+E0800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E1800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E2800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E3800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E4800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E5800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E6800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E7800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E8800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+E9800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EA800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EB800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EC800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+ED800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EE800 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF000 */\n139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, /* U+EF800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F0800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F1800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F2800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F3800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F4800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F5800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F6800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F7800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F8800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+F9800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FA800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FB800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FC800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FD800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FE800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+FF000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,226, /* U+FF800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+100800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+101800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+102800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+103800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+104800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+105800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+106800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+107800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+108800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+109800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10A800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10B800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10C800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10D800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10E800 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, /* U+10F000 */\n123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,226, /* U+10F800 */\n};\n\nconst pcre_uint16 PRIV(ucd_stage2)[] = { /* 58112 bytes, block = 128 */\n/* block 0 */\n  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  2,  0,  0,\n  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n  3,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,\n  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11,\n 11, 11, 11, 13, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,\n 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 16, 16, 16, 16,\n 16, 16, 16, 18, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  0,\n\n/* block 1 */\n  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\n  3,  4,  5,  5,  5,  5, 19,  4, 14, 19, 20, 21,  8, 22, 19, 14,\n 19,  8, 23, 23, 14, 24,  4,  4, 14, 23, 20, 25, 23, 23, 23,  4,\n 11, 11, 11, 11, 11, 26, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n 11, 11, 11, 11, 11, 11, 11,  8, 11, 11, 11, 11, 11, 11, 11, 27,\n 16, 16, 16, 16, 16, 28, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16, 16, 16, 16, 16, 29,\n\n/* block 2 */\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 32, 33, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31, 30,\n 31, 30, 31, 30, 31, 30, 31, 30, 31, 33, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 34, 30, 31, 30, 31, 30, 31, 35,\n\n/* block 3 */\n 36, 37, 30, 31, 30, 31, 38, 30, 31, 39, 39, 30, 31, 33, 40, 41,\n 42, 30, 31, 39, 43, 44, 45, 46, 30, 31, 47, 33, 45, 48, 49, 50,\n 30, 31, 30, 31, 30, 31, 51, 30, 31, 51, 33, 33, 30, 31, 51, 30,\n 31, 52, 52, 30, 31, 30, 31, 53, 30, 31, 33, 20, 30, 31, 33, 54,\n 20, 20, 20, 20, 55, 56, 57, 58, 59, 60, 61, 62, 63, 30, 31, 30,\n 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 64, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 33, 65, 66, 67, 30, 31, 68, 69, 30, 31, 30, 31, 30, 31, 30, 31,\n\n/* block 4 */\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 70, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 33, 33, 33, 33, 33, 33, 71, 30, 31, 72, 73, 74,\n 74, 30, 31, 75, 76, 77, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 78, 79, 80, 81, 82, 33, 83, 83, 33, 84, 33, 85, 86, 33, 33, 33,\n 83, 87, 33, 88, 33, 89, 90, 33, 91, 92, 33, 93, 94, 33, 33, 92,\n 33, 95, 96, 33, 33, 97, 33, 33, 33, 33, 33, 33, 33, 98, 33, 33,\n\n/* block 5 */\n 99, 33, 33, 99, 33, 33, 33,100, 99,101,102,102,103, 33, 33, 33,\n 33, 33,104, 33, 20, 33, 33, 33, 33, 33, 33, 33, 33, 33,105, 33,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n106,106,106,106,106,106,106,106,106,107,107,107,107,107,107,107,\n107,107, 14, 14, 14, 14,107,107,107,107,107,107,107,107,107,107,\n107,107, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n106,106,106,106,106, 14, 14, 14, 14, 14,108,108,107, 14,107, 14,\n 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n\n/* block 6 */\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,110,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n111,112,111,112,107,113,111,112,114,114,115,116,116,116,  4,117,\n\n/* block 7 */\n114,114,114,114,113, 14,118,  4,119,119,119,114,120,114,121,121,\n122,123,124,123,123,125,123,123,126,127,128,123,129,123,123,123,\n130,131,114,132,123,123,133,123,123,134,123,123,135,136,136,136,\n122,137,138,137,137,139,137,137,140,141,142,137,143,137,137,137,\n144,145,146,147,137,137,148,137,137,149,137,137,150,151,151,152,\n153,154,155,155,155,156,157,158,111,112,111,112,111,112,111,112,\n111,112,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n161,162,163,164,165,166,167,111,112,168,111,112,122,169,169,169,\n\n/* block 8 */\n170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,\n171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,\n171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,\n172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,\n172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,\n173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n\n/* block 9 */\n174,175,176,177,177,109,109,177,178,178,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n179,174,175,174,175,174,175,174,175,174,175,174,175,174,175,180,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n\n/* block 10 */\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n114,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,\n181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,\n181,181,181,181,181,181,181,114,114,182,183,183,183,183,183,183,\n114,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,\n184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,\n\n/* block 11 */\n184,184,184,184,184,184,184,185,114,  4,186,114,114,187,187,188,\n114,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,\n189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,\n189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,189,\n191,189,189,191,189,189,191,189,114,114,114,114,114,114,114,114,\n192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,\n192,192,192,192,192,192,192,192,192,192,192,114,114,114,114,114,\n192,192,192,191,191,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 12 */\n193,193,193,193,193, 22,194,194,194,195,195,196,  4,195,197,197,\n198,198,198,198,198,198,198,198,198,198,198,  4, 22,114,195,  4,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n107,199,199,199,199,199,199,199,199,199,199,109,109,109,109,109,\n109,109,109,109,109,109,198,198,198,198,198,198,198,198,198,198,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,195,195,195,195,199,199,\n109,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 13 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,195,199,198,198,198,198,198,198,198, 22,197,198,\n198,198,198,198,198,200,200,198,198,197,198,198,198,198,199,199,\n201,201,201,201,201,201,201,201,201,201,199,199,199,197,197,199,\n\n/* block 14 */\n202,202,202,202,202,202,202,202,202,202,202,202,202,202,114,203,\n204,205,204,204,204,204,204,204,204,204,204,204,204,204,204,204,\n204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,\n205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,\n205,205,205,205,205,205,205,205,205,205,205,114,114,204,204,204,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 15 */\n206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,\n206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,206,\n206,206,206,206,206,206,207,207,207,207,207,207,207,207,207,207,\n207,206,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n208,208,208,208,208,208,208,208,208,208,209,209,209,209,209,209,\n209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,\n209,209,209,209,209,209,209,209,209,209,209,210,210,210,210,210,\n210,210,210,210,211,211,212,213,213,213,211,114,114,114,114,114,\n\n/* block 16 */\n214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,\n214,214,214,214,214,214,215,215,215,215,216,215,215,215,215,215,\n215,215,215,215,216,215,215,215,216,215,215,215,215,215,114,114,\n217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,114,\n218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,\n218,218,218,218,218,218,218,218,218,219,219,219,114,114,220,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 17 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,198,198,198,198,198,198,198,198,198,198,198,198,\n198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,\n\n/* block 18 */\n221,221,221,222,223,223,223,223,223,223,223,223,223,223,223,223,\n223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,\n223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,\n223,223,223,223,223,223,223,223,223,223,221,222,221,223,222,222,\n222,221,221,221,221,221,221,221,221,222,222,222,222,221,222,222,\n223,109,109,221,221,221,221,221,223,223,223,223,223,223,223,223,\n223,223,221,221,  4,  4,224,224,224,224,224,224,224,224,224,224,\n225,226,223,223,223,223,223,223,223,223,223,223,223,223,223,223,\n\n/* block 19 */\n227,228,229,229,114,227,227,227,227,227,227,227,227,114,114,227,\n227,114,114,227,227,227,227,227,227,227,227,227,227,227,227,227,\n227,227,227,227,227,227,227,227,227,114,227,227,227,227,227,227,\n227,114,227,114,114,114,227,227,227,227,114,114,228,227,230,229,\n229,228,228,228,228,114,114,229,229,114,114,229,229,228,227,114,\n114,114,114,114,114,114,114,230,114,114,114,114,227,227,114,227,\n227,227,228,228,114,114,231,231,231,231,231,231,231,231,231,231,\n227,227,232,232,233,233,233,233,233,233,234,232,114,114,114,114,\n\n/* block 20 */\n114,235,235,236,114,237,237,237,237,237,237,114,114,114,114,237,\n237,114,114,237,237,237,237,237,237,237,237,237,237,237,237,237,\n237,237,237,237,237,237,237,237,237,114,237,237,237,237,237,237,\n237,114,237,237,114,237,237,114,237,237,114,114,235,114,236,236,\n236,235,235,114,114,114,114,235,235,114,114,235,235,235,114,114,\n114,235,114,114,114,114,114,114,114,237,237,237,237,114,237,114,\n114,114,114,114,114,114,238,238,238,238,238,238,238,238,238,238,\n235,235,237,237,237,235,114,114,114,114,114,114,114,114,114,114,\n\n/* block 21 */\n114,239,239,240,114,241,241,241,241,241,241,241,241,241,114,241,\n241,241,114,241,241,241,241,241,241,241,241,241,241,241,241,241,\n241,241,241,241,241,241,241,241,241,114,241,241,241,241,241,241,\n241,114,241,241,114,241,241,241,241,241,114,114,239,241,240,240,\n240,239,239,239,239,239,114,239,239,240,114,240,240,239,114,114,\n241,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n241,241,239,239,114,114,242,242,242,242,242,242,242,242,242,242,\n243,244,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 22 */\n114,245,246,246,114,247,247,247,247,247,247,247,247,114,114,247,\n247,114,114,247,247,247,247,247,247,247,247,247,247,247,247,247,\n247,247,247,247,247,247,247,247,247,114,247,247,247,247,247,247,\n247,114,247,247,114,247,247,247,247,247,114,114,245,247,248,245,\n246,245,245,245,245,114,114,246,246,114,114,246,246,245,114,114,\n114,114,114,114,114,114,245,248,114,114,114,114,247,247,114,247,\n247,247,245,245,114,114,249,249,249,249,249,249,249,249,249,249,\n250,247,251,251,251,251,251,251,114,114,114,114,114,114,114,114,\n\n/* block 23 */\n114,114,252,253,114,253,253,253,253,253,253,114,114,114,253,253,\n253,114,253,253,253,253,114,114,114,253,253,114,253,114,253,253,\n114,114,114,253,253,114,114,114,253,253,253,114,114,114,253,253,\n253,253,253,253,253,253,253,253,253,253,114,114,114,114,254,255,\n252,255,255,114,114,114,255,255,255,114,255,255,255,252,114,114,\n253,114,114,114,114,114,114,254,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,256,256,256,256,256,256,256,256,256,256,\n257,257,257,258,258,258,258,258,258,259,258,114,114,114,114,114,\n\n/* block 24 */\n260,261,261,261,114,262,262,262,262,262,262,262,262,114,262,262,\n262,114,262,262,262,262,262,262,262,262,262,262,262,262,262,262,\n262,262,262,262,262,262,262,262,262,114,262,262,262,262,262,262,\n262,262,262,262,262,262,262,262,262,262,114,114,114,262,260,260,\n260,261,261,261,261,114,260,260,260,114,260,260,260,260,114,114,\n114,114,114,114,114,260,260,114,262,262,114,114,114,114,114,114,\n262,262,260,260,114,114,263,263,263,263,263,263,263,263,263,263,\n114,114,114,114,114,114,114,114,264,264,264,264,264,264,264,265,\n\n/* block 25 */\n114,266,267,267,114,268,268,268,268,268,268,268,268,114,268,268,\n268,114,268,268,268,268,268,268,268,268,268,268,268,268,268,268,\n268,268,268,268,268,268,268,268,268,114,268,268,268,268,268,268,\n268,268,268,268,114,268,268,268,268,268,114,114,266,268,267,266,\n267,267,269,267,267,114,266,267,267,114,267,267,266,266,114,114,\n114,114,114,114,114,269,269,114,114,114,114,114,114,114,268,114,\n268,268,266,266,114,114,270,270,270,270,270,270,270,270,270,270,\n114,268,268,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 26 */\n114,271,272,272,114,273,273,273,273,273,273,273,273,114,273,273,\n273,114,273,273,273,273,273,273,273,273,273,273,273,273,273,273,\n273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,273,\n273,273,273,273,273,273,273,273,273,273,273,114,114,273,274,272,\n272,271,271,271,271,114,272,272,272,114,272,272,272,271,273,114,\n114,114,114,114,114,114,114,274,114,114,114,114,114,114,114,114,\n273,273,271,271,114,114,275,275,275,275,275,275,275,275,275,275,\n276,276,276,276,276,276,114,114,114,277,273,273,273,273,273,273,\n\n/* block 27 */\n114,114,278,278,114,279,279,279,279,279,279,279,279,279,279,279,\n279,279,279,279,279,279,279,114,114,114,279,279,279,279,279,279,\n279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,\n279,279,114,279,279,279,279,279,279,279,279,279,114,279,114,114,\n279,279,279,279,279,279,279,114,114,114,280,114,114,114,114,281,\n278,278,280,280,280,114,280,114,278,278,278,278,278,278,278,281,\n114,114,114,114,114,114,282,282,282,282,282,282,282,282,282,282,\n114,114,278,278,283,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 28 */\n114,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,\n284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,\n284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,\n284,285,284,286,285,285,285,285,285,285,285,114,114,114,114,  5,\n284,284,284,284,284,284,287,285,285,285,285,285,285,285,285,288,\n289,289,289,289,289,289,289,289,289,289,288,288,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 29 */\n114,290,290,114,290,114,114,290,290,114,290,114,114,290,114,114,\n114,114,114,114,290,290,290,290,114,290,290,290,290,290,290,290,\n114,290,290,290,114,290,114,290,114,114,290,290,114,290,290,290,\n290,291,290,292,291,291,291,291,291,291,114,291,291,290,114,114,\n290,290,290,290,290,114,293,114,291,291,291,291,291,291,114,114,\n294,294,294,294,294,294,294,294,294,294,114,114,290,290,290,290,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 30 */\n295,296,296,296,297,297,297,297,297,297,297,297,297,297,297,297,\n297,297,297,296,297,296,296,296,298,298,296,296,296,296,296,296,\n299,299,299,299,299,299,299,299,299,299,300,300,300,300,300,300,\n300,300,300,300,296,298,296,298,296,298,301,302,301,302,303,303,\n295,295,295,295,295,295,295,295,114,295,295,295,295,295,295,295,\n295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,\n295,295,295,295,295,295,295,295,295,295,295,295,295,114,114,114,\n114,298,298,298,298,298,298,298,298,298,298,298,298,298,298,303,\n\n/* block 31 */\n298,298,298,298,298,297,298,298,295,295,295,295,295,298,298,298,\n298,298,298,298,298,298,298,298,114,298,298,298,298,298,298,298,\n298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,298,\n298,298,298,298,298,298,298,298,298,298,298,298,298,114,296,296,\n296,296,296,296,296,296,298,296,296,296,296,296,296,114,296,296,\n297,297,297,297,297, 19, 19, 19, 19,297,297,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 32 */\n304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,\n304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,\n304,304,304,304,304,304,304,304,304,304,304,305,305,306,306,306,\n306,307,306,306,306,306,306,306,305,306,306,307,307,306,306,304,\n308,308,308,308,308,308,308,308,308,308,309,309,309,309,309,309,\n304,304,304,304,304,304,307,307,306,306,304,304,304,304,306,306,\n306,304,305,305,305,304,304,305,305,305,305,305,305,305,304,304,\n304,306,306,306,306,304,304,304,304,304,304,304,304,304,304,304,\n\n/* block 33 */\n304,304,306,305,307,306,306,305,305,305,305,305,305,306,304,305,\n308,308,308,308,308,308,308,308,308,308,305,305,305,306,310,310,\n311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,\n311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,311,\n311,311,311,311,311,311,114,311,114,114,114,114,114,311,114,114,\n312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,\n312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,\n312,312,312,312,312,312,312,312,312,312,312,  4,313,312,312,312,\n\n/* block 34 */\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,\n315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,\n\n/* block 35 */\n315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,\n315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,\n315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n\n/* block 36 */\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,114,317,317,317,317,114,114,\n317,317,317,317,317,317,317,114,317,114,317,317,317,317,114,114,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n\n/* block 37 */\n317,317,317,317,317,317,317,317,317,114,317,317,317,317,114,114,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,114,\n317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n\n/* block 38 */\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,114,317,317,317,317,114,114,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,317,317,317,317,114,114,318,318,318,\n319,319,319,319,319,319,319,319,319,320,320,320,320,320,320,320,\n320,320,320,320,320,320,320,320,320,320,320,320,320,114,114,114,\n\n/* block 39 */\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n321,321,321,321,321,321,321,321,321,321,114,114,114,114,114,114,\n322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,\n322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,\n322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,\n322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,\n322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,\n322,322,322,322,322,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 40 */\n323,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n\n/* block 41 */\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n\n/* block 42 */\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,325,325,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n\n/* block 43 */\n326,327,327,327,327,327,327,327,327,327,327,327,327,327,327,327,\n327,327,327,327,327,327,327,327,327,327,327,328,329,114,114,114,\n330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,\n330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,\n330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,\n330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,\n330,330,330,330,330,330,330,330,330,330,330,  4,  4,  4,331,331,\n331,330,330,330,330,330,330,330,330,114,114,114,114,114,114,114,\n\n/* block 44 */\n332,332,332,332,332,332,332,332,332,332,332,332,332,114,332,332,\n332,332,333,333,333,114,114,114,114,114,114,114,114,114,114,114,\n334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,334,\n334,334,335,335,335,  4,  4,114,114,114,114,114,114,114,114,114,\n336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,336,\n336,336,337,337,114,114,114,114,114,114,114,114,114,114,114,114,\n338,338,338,338,338,338,338,338,338,338,338,338,338,114,338,338,\n338,114,339,339,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 45 */\n340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,\n340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,\n340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,\n340,340,340,340,341,341,342,341,341,341,341,341,341,341,342,342,\n342,342,342,342,342,342,341,342,342,341,341,341,341,341,341,341,\n341,341,341,341,343,343,343,344,343,343,343,345,340,341,114,114,\n346,346,346,346,346,346,346,346,346,346,114,114,114,114,114,114,\n347,347,347,347,347,347,347,347,347,347,114,114,114,114,114,114,\n\n/* block 46 */\n348,348,  4,  4,348,  4,349,348,348,348,348,350,350,350,351,114,\n352,352,352,352,352,352,352,352,352,352,114,114,114,114,114,114,\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,354,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,114,114,114,114,114,114,114,114,\n\n/* block 47 */\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,\n353,353,353,353,353,353,353,353,353,350,353,114,114,114,114,114,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,\n324,324,324,324,324,324,114,114,114,114,114,114,114,114,114,114,\n\n/* block 48 */\n355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,\n355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,114,\n356,356,356,357,357,357,357,356,356,357,357,357,114,114,114,114,\n357,357,356,357,357,357,357,357,357,356,356,356,114,114,114,114,\n358,114,114,114,359,359,360,360,360,360,360,360,360,360,360,360,\n361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,\n361,361,361,361,361,361,361,361,361,361,361,361,361,361,114,114,\n361,361,361,361,361,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 49 */\n362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,\n362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,362,\n362,362,362,362,362,362,362,362,362,362,362,362,114,114,114,114,\n363,363,363,363,363,364,364,364,363,363,364,363,363,363,363,363,\n363,362,362,362,362,362,362,362,363,363,114,114,114,114,114,114,\n365,365,365,365,365,365,365,365,365,365,366,114,114,114,367,367,\n368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,\n368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,\n\n/* block 50 */\n369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,369,\n369,369,369,369,369,369,369,370,370,371,371,370,114,114,372,372,\n373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,\n373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,\n373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,373,\n373,373,373,373,373,374,375,374,375,375,375,375,375,375,375,114,\n375,376,375,376,376,375,375,375,375,375,375,375,375,374,374,374,\n374,374,374,375,375,375,375,375,375,375,375,375,375,114,114,375,\n\n/* block 51 */\n377,377,377,377,377,377,377,377,377,377,114,114,114,114,114,114,\n377,377,377,377,377,377,377,377,377,377,114,114,114,114,114,114,\n378,378,378,378,378,378,378,379,378,378,378,378,378,378,114,114,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,380,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 52 */\n381,381,381,381,382,383,383,383,383,383,383,383,383,383,383,383,\n383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,\n383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,383,\n383,383,383,383,381,382,381,381,381,381,381,382,381,382,382,382,\n382,382,381,382,382,383,383,383,383,383,383,383,114,114,114,114,\n384,384,384,384,384,384,384,384,384,384,385,385,385,385,385,385,\n385,386,386,386,386,386,386,386,386,386,386,381,381,381,381,381,\n381,381,381,381,386,386,386,386,386,386,386,386,386,114,114,114,\n\n/* block 53 */\n387,387,388,389,389,389,389,389,389,389,389,389,389,389,389,389,\n389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,389,\n389,388,387,387,387,387,388,388,387,387,388,387,387,387,389,389,\n390,390,390,390,390,390,390,390,390,390,389,389,389,389,389,389,\n391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,\n391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,391,\n391,391,391,391,391,391,392,393,392,392,393,393,393,392,393,392,\n392,392,393,393,114,114,114,114,114,114,114,114,394,394,394,394,\n\n/* block 54 */\n395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,\n395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,\n395,395,395,395,396,396,396,396,396,396,396,396,397,397,397,397,\n397,397,397,397,396,396,397,397,114,114,114,398,398,398,398,398,\n399,399,399,399,399,399,399,399,399,399,114,114,114,395,395,395,\n400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,\n401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,401,\n401,401,401,401,401,401,401,401,402,402,402,402,402,402,403,403,\n\n/* block 55 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n404,404,404,404,404,404,404,404,114,114,114,114,114,114,114,114,\n109,109,109,  4,109,109,109,109,109,109,109,109,109,109,109,109,\n109,405,109,109,109,109,109,109,109,406,406,406,406,109,406,406,\n406,406,405,405,109,406,406,114,109,109,114,114,114,114,114,114,\n\n/* block 56 */\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33,122,122,122,122,122,407,106,106,106,106,\n106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,\n106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,\n106,106,106,106,106,106,106,106,106,106,106,106,106,115,115,115,\n115,115,106,106,106,106,115,115,115,115,115, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33, 33, 33,408,409, 33, 33, 33,410, 33, 33,\n\n/* block 57 */\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,106,106,106,106,106,\n106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,\n106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,115,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,114,114,114,114,114,114,109,109,109,109,\n\n/* block 58 */\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n411,412, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n\n/* block 59 */\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 33, 33, 33, 33, 33,413, 33, 33,414, 33,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n\n/* block 60 */\n415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,\n415,415,415,415,415,415,114,114,416,416,416,416,416,416,114,114,\n415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,\n415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,\n415,415,415,415,415,415,114,114,416,416,416,416,416,416,114,114,\n122,415,122,415,122,415,122,415,114,416,114,416,114,416,114,416,\n415,415,415,415,415,415,415,415,416,416,416,416,416,416,416,416,\n417,417,418,418,418,418,419,419,420,420,421,421,422,422,114,114,\n\n/* block 61 */\n415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,\n415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,\n415,415,415,415,415,415,415,415,423,423,423,423,423,423,423,423,\n415,415,122,424,122,114,122,122,416,416,425,425,426,113,427,113,\n113,113,122,424,122,114,122,122,428,428,428,428,426,113,113,113,\n415,415,122,122,114,114,122,122,416,416,429,429,114,113,113,113,\n415,415,122,122,122,163,122,122,416,416,430,430,168,113,113,113,\n114,114,122,424,122,114,122,122,431,431,432,432,426,113,113,114,\n\n/* block 62 */\n  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3, 22,433,433, 22, 22,\n  9,  9,  9,  9,  9,  9,  4,  4, 21, 25,  6, 21, 21, 25,  6, 21,\n  4,  4,  4,  4,  4,  4,  4,  4,434,435, 22, 22, 22, 22, 22,  3,\n  4,  4,  4,  4,  4,  4,  4,  4,  4, 21, 25,  4,  4,  4,  4, 15,\n 15,  4,  4,  4,  8,  6,  7,  4,  4,  4,  4,  4,  4,  4,  4,  4,\n  4,  4,  8,  4, 15,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,\n 22, 22, 22, 22, 22,436, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 23,106,114,114, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,106,\n\n/* block 63 */\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,  8,  8,  8,  6,  7,114,\n106,106,106,106,106,106,106,106,106,106,106,106,106,114,114,114,\n  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,\n  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n109,109,109,109,109,109,109,109,109,109,109,109,109,380,380,380,\n380,109,380,380,380,109,109,109,109,109,109,109,109,109,109,109,\n109,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 64 */\n 19, 19,437, 19, 19, 19, 19,437, 19, 19,438,437,437,437,438,438,\n437,437,437,438, 19,437, 19, 19,  8,437,437,437,437,437, 19, 19,\n 19, 19, 19, 19,437, 19,439, 19,437, 19,440,441,437,437, 19,438,\n437,437,442,437,438,406,406,406,406,438, 19, 19,438,438,437,437,\n  8,  8,  8,  8,  8,437,438,438,438,438, 19,  8, 19, 19,443, 19,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,444,\n445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,\n\n/* block 65 */\n446,446,446, 30, 31,446,446,446,446, 23,114,114,114,114,114,114,\n  8,  8,  8,  8,  8, 19, 19, 19, 19, 19,  8,  8, 19, 19, 19, 19,\n  8, 19, 19,  8, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19,  8, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,\n 19, 19,  8, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n\n/* block 66 */\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n\n/* block 67 */\n 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n  8,  8, 19, 19, 19, 19, 19, 19, 19,  6,  7, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19,\n\n/* block 68 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,\n  8,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,\n\n/* block 69 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\n/* block 70 */\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19,447,447,447,447,447,447,447,447,447,447,\n447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,\n448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,448,\n448,448,448,448,448,448,448,448,448,448, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\n/* block 71 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 72 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19,  8, 19, 19, 19, 19, 19, 19, 19, 19,\n 19,  8, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19,  8,  8,  8,  8,  8,  8,  8,  8,\n\n/* block 73 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,  8,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 74 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,\n  6,  7,  6,  7,  6,  7, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n\n/* block 75 */\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n  8,  8,  8,  8,  8,  6,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n\n/* block 76 */\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,449,\n\n/* block 77 */\n  8,  8,  8,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,\n  7,  6,  7,  6,  7,  6,  7,  6,  7,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  6,  7,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  6,  7,  8,  8,\n\n/* block 78 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,\n  8,  8,  8,  8,  8, 19, 19,  8,  8,  8,  8,  8,  8, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 79 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19,114, 19, 19, 19, 19, 19, 19,\n 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 80 */\n450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,\n450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,\n450,450,450,450,450,450,450,450,450,450,450,450,450,450,450,114,\n451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,\n451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,\n451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,114,\n 30, 31,452,453,454,455,456, 30, 31, 30, 31, 30, 31,457,458,459,\n460, 33, 30, 31, 33, 30, 31, 33, 33, 33, 33, 33,106,106,461,461,\n\n/* block 81 */\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,159,160,159,160,159,160,159,160,159,160,159,160,\n159,160,159,160,462,463,463,463,463,463,463,159,160,159,160,464,\n464,464,159,160,114,114,114,114,114,465,465,465,465,466,465,465,\n\n/* block 82 */\n467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,\n467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,467,\n467,467,467,467,467,467,114,467,114,114,114,114,114,467,114,114,\n468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,\n468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,\n468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,468,\n468,468,468,468,468,468,468,468,114,114,114,114,114,114,114,469,\n470,114,114,114,114,114,114,114,114,114,114,114,114,114,114,471,\n\n/* block 83 */\n317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,317,\n317,317,317,317,317,317,317,114,114,114,114,114,114,114,114,114,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,\n177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,\n177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,\n\n/* block 84 */\n  4,  4, 21, 25, 21, 25,  4,  4,  4, 21, 25,  4, 21, 25,  4,  4,\n  4,  4,  4,  4,  4,  4,  4,  9,  4,  4,  9,  4, 21, 25,  4,  4,\n 21, 25,  6,  7,  6,  7,  6,  7,  6,  7,  4,  4,  4,  4,  4,107,\n  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  9,  9,  4,  4,  4,  4,\n  9,  4,  6,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 85 */\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,114,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 86 */\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n\n/* block 87 */\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,472,\n472,472,472,472,472,472,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,\n\n/* block 88 */\n  3,  4,  4,  4, 19,473,406,474,  6,  7,  6,  7,  6,  7,  6,  7,\n  6,  7, 19, 19,  6,  7,  6,  7,  6,  7,  6,  7,  9,  6,  7,  7,\n 19,474,474,474,474,474,474,474,474,474,109,109,109,109,475,475,\n  9,107,107,107,107,107, 19, 19,474,474,474,473,406,  4, 19, 19,\n114,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,\n476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,\n476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,\n476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,\n\n/* block 89 */\n476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,476,\n476,476,476,476,476,476,476,114,114,109,109, 14, 14,477,477,476,\n  9,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,  4,107,479,479,478,\n\n/* block 90 */\n114,114,114,114,114,480,480,480,480,480,480,480,480,480,480,480,\n480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,\n480,480,480,480,480,480,480,480,480,480,480,480,480,480,114,114,\n114,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n\n/* block 91 */\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,114,\n 19, 19, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,480,\n480,480,480,480,480,480,480,480,480,480,480,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n\n/* block 92 */\n482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,\n482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,114,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 23, 23, 23, 23, 23, 23, 23, 23,\n 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,482,\n482,482,482,482,482,482,482,482,482,482,482,482,482,482,482, 19,\n\n/* block 93 */\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,114,\n\n/* block 94 */\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,483,\n483,483,483,483,483,483,483,483, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 95 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n\n/* block 96 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 97 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 98 */\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,486,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n\n/* block 99 */\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,485,\n\n/* block 100 */\n485,485,485,485,485,485,485,485,485,485,485,485,485,114,114,114,\n487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,\n487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,\n487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,487,\n487,487,487,487,487,487,487,114,114,114,114,114,114,114,114,114,\n488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,\n488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,488,\n488,488,488,488,488,488,488,488,489,489,489,489,489,489,490,490,\n\n/* block 101 */\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n\n/* block 102 */\n491,491,491,491,491,491,491,491,491,491,491,491,492,493,493,493,\n491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,491,\n494,494,494,494,494,494,494,494,494,494,491,491,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,495,177,\n178,178,178,496,177,177,177,177,177,177,177,177,177,177,496,408,\n\n/* block 103 */\n174,175,174,175,174,175,174,175,174,175,174,175,174,175,174,175,\n174,175,174,175,174,175,174,175,174,175,174,175,408,408,114,177,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,498,498,498,498,498,498,498,498,498,498,\n499,499,500,500,500,500,500,500,114,114,114,114,114,114,114,114,\n\n/* block 104 */\n 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\n 14, 14, 14, 14, 14, 14, 14,107,107,107,107,107,107,107,107,107,\n 14, 14, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n106, 33, 33, 33, 33, 33, 33, 33, 33, 30, 31, 30, 31,501, 30, 31,\n\n/* block 105 */\n 30, 31, 30, 31, 30, 31, 30, 31,107, 14, 14, 30, 31,502, 33,114,\n 30, 31, 30, 31, 33, 33, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,\n 30, 31, 30, 31, 30, 31, 30, 31, 30, 31,503,504,505,506,114,114,\n507,508,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114, 20,106,106, 33, 20, 20, 20, 20, 20,\n\n/* block 106 */\n509,509,510,509,509,509,510,509,509,509,509,510,509,509,509,509,\n509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,509,\n509,509,509,511,511,510,510,511,512,512,512,512,114,114,114,114,\n 23, 23, 23, 23, 23, 23, 19, 19,  5, 19,114,114,114,114,114,114,\n513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,\n513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,\n513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,\n513,513,513,513,514,514,514,514,114,114,114,114,114,114,114,114,\n\n/* block 107 */\n515,515,516,516,516,516,516,516,516,516,516,516,516,516,516,516,\n516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,\n516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,\n516,516,516,516,515,515,515,515,515,515,515,515,515,515,515,515,\n515,515,515,515,517,114,114,114,114,114,114,114,114,114,518,518,\n519,519,519,519,519,519,519,519,519,519,114,114,114,114,114,114,\n221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,\n221,221,223,223,223,223,223,223,225,225,225,223,114,114,114,114,\n\n/* block 108 */\n520,520,520,520,520,520,520,520,520,520,521,521,521,521,521,521,\n521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,521,\n521,521,521,521,521,521,522,522,522,522,522,522,522,522,  4,523,\n524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,524,\n524,524,524,524,524,524,524,525,525,525,525,525,525,525,525,525,\n525,525,526,526,114,114,114,114,114,114,114,114,114,114,114,527,\n314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,\n314,314,314,314,314,314,314,314,314,314,314,314,314,114,114,114,\n\n/* block 109 */\n528,528,528,529,530,530,530,530,530,530,530,530,530,530,530,530,\n530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,\n530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,\n530,530,530,528,529,529,528,528,528,528,529,529,528,529,529,529,\n529,531,531,531,531,531,531,531,531,531,531,531,531,531,114,107,\n532,532,532,532,532,532,532,532,532,532,114,114,114,114,531,531,\n304,304,304,304,304,306,533,304,304,304,304,304,304,304,304,304,\n308,308,308,308,308,308,308,308,308,308,304,304,304,304,304,114,\n\n/* block 110 */\n534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,\n534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,\n534,534,534,534,534,534,534,534,534,535,535,535,535,535,535,536,\n536,535,535,536,536,535,535,114,114,114,114,114,114,114,114,114,\n534,534,534,535,534,534,534,534,534,534,534,534,535,536,114,114,\n537,537,537,537,537,537,537,537,537,537,114,114,538,538,538,538,\n304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,304,\n533,304,304,304,304,304,304,310,310,310,304,305,306,305,304,304,\n\n/* block 111 */\n539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,\n539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,\n539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,539,\n540,539,540,540,540,539,539,540,540,539,539,539,539,539,540,540,\n539,540,539,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,539,539,541,542,542,\n543,543,543,543,543,543,543,543,543,543,543,544,545,545,544,544,\n546,546,543,547,547,544,545,114,114,114,114,114,114,114,114,114,\n\n/* block 112 */\n114,317,317,317,317,317,317,114,114,317,317,317,317,317,317,114,\n114,317,317,317,317,317,317,114,114,114,114,114,114,114,114,114,\n317,317,317,317,317,317,317,114,317,317,317,317,317,317,317,114,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,\n 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 14,106,106,106,106,\n114,114,114,114, 33,122,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 113 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,\n543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,543,\n543,543,543,544,544,545,544,544,545,544,544,546,544,545,114,114,\n548,548,548,548,548,548,548,548,548,548,114,114,114,114,114,114,\n\n/* block 114 */\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n\n/* block 115 */\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n\n/* block 116 */\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n\n/* block 117 */\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n\n/* block 118 */\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n\n/* block 119 */\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n\n/* block 120 */\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n549,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,549,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,549,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n\n/* block 121 */\n550,550,550,550,550,550,550,550,549,550,550,550,550,550,550,550,\n550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,\n550,550,550,550,114,114,114,114,114,114,114,114,114,114,114,114,\n315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,315,\n315,315,315,315,315,315,315,114,114,114,114,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,316,\n316,316,316,316,316,316,316,316,316,316,316,316,114,114,114,114,\n\n/* block 122 */\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,551,\n\n/* block 123 */\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n\n/* block 124 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n\n/* block 125 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 126 */\n 33, 33, 33, 33, 33, 33, 33,114,114,114,114,114,114,114,114,114,\n114,114,114,185,185,185,185,185,114,114,114,114,114,192,189,192,\n192,192,192,192,192,192,192,192,192,553,192,192,192,192,192,192,\n192,192,192,192,192,192,192,114,192,192,192,192,192,114,192,114,\n192,192,114,192,192,114,192,192,192,192,192,192,192,192,192,192,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 127 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,554,554,554,554,554,554,554,554,554,554,554,554,554,554,\n554,554,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 128 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 129 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,  7,  6,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n\n/* block 130 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n114,114,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n199,199,199,199,199,199,199,199,199,199,199,199,196,197,114,114,\n\n/* block 131 */\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n  4,  4,  4,  4,  4,  4,  4,  6,  7,  4,114,114,114,114,114,114,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,114,114,\n  4,  9,  9, 15, 15,  6,  7,  6,  7,  6,  7,  6,  7,  6,  7,  6,\n  7,  6,  7,  6,  7,  4,  4,  6,  7,  4,  4,  4,  4, 15, 15, 15,\n  4,  4,  4,114,  4,  4,  4,  4,  9,  6,  7,  6,  7,  6,  7,  4,\n  4,  4,  8,  9,  8,  8,  8,114,  4,  5,  4,  4,114,114,114,114,\n199,199,199,199,199,114,199,199,199,199,199,199,199,199,199,199,\n\n/* block 132 */\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,114,114, 22,\n\n/* block 133 */\n114,  4,  4,  4,  5,  4,  4,  4,  6,  7,  4,  8,  4,  9,  4,  4,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  4,  4,  8,  8,  8,  4,\n  4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,  6,  4,  7, 14, 15,\n 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  6,  8,  7,  8,  6,\n  7,  4,  6,  7,  4,  4,478,478,478,478,478,478,478,478,478,478,\n107,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n\n/* block 134 */\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,478,\n478,478,478,478,478,478,478,478,478,478,478,478,478,478,555,555,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,\n481,481,481,481,481,481,481,481,481,481,481,481,481,481,481,114,\n114,114,481,481,481,481,481,481,114,114,481,481,481,481,481,481,\n114,114,481,481,481,481,481,481,114,114,481,481,481,114,114,114,\n  5,  5,  8, 14, 19,  5,  5,114, 19,  8,  8,  8,  8, 19, 19,114,\n436,436,436,436,436,436,436,436,436, 22, 22, 22, 19, 19,114,114,\n\n/* block 135 */\n556,556,556,556,556,556,556,556,556,556,556,556,114,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,114,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,114,556,556,114,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,114,114,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 136 */\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,556,\n556,556,556,556,556,556,556,556,556,556,556,114,114,114,114,114,\n\n/* block 137 */\n  4,  4,  4,114,114,114,114, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23,114,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,\n557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,\n557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,\n557,557,557,557,557,558,558,558,558,559,559,559,559,559,559,559,\n\n/* block 138 */\n559,559,559,559,559,559,559,559,559,559,558,558,559,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,\n559,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,114,114,\n\n/* block 139 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 140 */\n560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,560,\n560,560,560,560,560,560,560,560,560,560,560,560,560,114,114,114,\n561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,\n561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,\n561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,561,\n561,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n109, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,114,114,114,114,\n\n/* block 141 */\n562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,\n562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,562,\n563,563,563,563,114,114,114,114,114,114,114,114,114,114,114,114,\n564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,564,\n564,565,564,564,564,564,564,564,564,564,565,114,114,114,114,114,\n566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,\n566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,566,\n566,566,566,566,566,566,567,567,567,567,567,114,114,114,114,114,\n\n/* block 142 */\n568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,568,\n568,568,568,568,568,568,568,568,568,568,568,568,568,568,114,569,\n570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,\n570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,570,\n570,570,570,570,114,114,114,114,570,570,570,570,570,570,570,570,\n571,572,572,572,572,572,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 143 */\n573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,\n573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,\n573,573,573,573,573,573,573,573,574,574,574,574,574,574,574,574,\n574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,\n574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,574,\n575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,\n575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,\n575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,\n\n/* block 144 */\n576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,576,\n576,576,576,576,576,576,576,576,576,576,576,576,576,576,114,114,\n577,577,577,577,577,577,577,577,577,577,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 145 */\n578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,\n578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,\n578,578,578,578,578,578,578,578,114,114,114,114,114,114,114,114,\n579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,\n579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,\n579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,579,\n579,579,579,579,114,114,114,114,114,114,114,114,114,114,114,580,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 146 */\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n\n/* block 147 */\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,581,114,114,114,114,114,114,114,114,114,\n581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,\n581,581,581,581,581,581,114,114,114,114,114,114,114,114,114,114,\n581,581,581,581,581,581,581,581,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 148 */\n582,582,582,582,582,582,114,114,582,114,582,582,582,582,582,582,\n582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,\n582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,\n582,582,582,582,582,582,114,582,582,114,114,114,582,114,114,582,\n583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,\n583,583,583,583,583,583,114,584,585,585,585,585,585,585,585,585,\n586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,\n586,586,586,586,586,586,586,587,587,588,588,588,588,588,588,588,\n\n/* block 149 */\n589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,\n589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,114,\n114,114,114,114,114,114,114,590,590,590,590,590,590,590,590,590,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 150 */\n591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,\n591,591,591,591,591,591,592,592,592,592,592,592,114,114,114,593,\n594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,\n594,594,594,594,594,594,594,594,594,594,114,114,114,114,114,595,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 151 */\n596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,\n596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,596,\n597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,597,\n597,597,597,597,597,597,597,597,114,114,114,114,114,114,597,597,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 152 */\n598,599,599,599,114,599,599,114,114,114,114,114,599,599,599,599,\n598,598,598,598,114,598,598,598,114,598,598,598,598,598,598,598,\n598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,\n598,598,598,598,114,114,114,114,599,599,599,114,114,114,114,599,\n600,600,600,600,600,600,600,600,114,114,114,114,114,114,114,114,\n601,601,601,601,601,601,601,601,601,114,114,114,114,114,114,114,\n602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,602,\n602,602,602,602,602,602,602,602,602,602,602,602,602,603,603,604,\n\n/* block 153 */\n605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,605,\n605,605,605,605,605,605,605,605,605,605,605,605,605,606,606,606,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n607,607,607,607,607,607,607,607,608,607,607,607,607,607,607,607,\n607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,607,\n607,607,607,607,607,609,609,114,114,114,114,610,610,610,610,610,\n611,611,611,611,611,611,611,114,114,114,114,114,114,114,114,114,\n\n/* block 154 */\n612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,\n612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,\n612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,612,\n612,612,612,612,612,612,114,114,114,613,613,613,613,613,613,613,\n614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,614,\n614,614,614,614,614,614,114,114,615,615,615,615,615,615,615,615,\n616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,616,\n616,616,616,114,114,114,114,114,617,617,617,617,617,617,617,617,\n\n/* block 155 */\n618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,618,\n618,618,114,114,114,114,114,114,114,619,619,619,619,114,114,114,\n114,114,114,114,114,114,114,114,114,620,620,620,620,620,620,620,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 156 */\n621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,\n621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,\n621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,\n621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,621,\n621,621,621,621,621,621,621,621,621,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 157 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,\n622,622,622,622,622,622,622,622,622,622,622,622,622,622,622,114,\n\n/* block 158 */\n623,624,623,625,625,625,625,625,625,625,625,625,625,625,625,625,\n625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,\n625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,\n625,625,625,625,625,625,625,625,624,624,624,624,624,624,624,624,\n624,624,624,624,624,624,624,626,626,626,626,626,626,626,114,114,\n114,114,627,627,627,627,627,627,627,627,627,627,627,627,627,627,\n627,627,627,627,627,627,628,628,628,628,628,628,628,628,628,628,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,624,\n\n/* block 159 */\n629,629,630,631,631,631,631,631,631,631,631,631,631,631,631,631,\n631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,\n631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,\n630,630,630,629,629,629,629,630,630,629,629,632,632,633,632,632,\n632,632,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,634,\n634,634,634,634,634,634,634,634,634,114,114,114,114,114,114,114,\n635,635,635,635,635,635,635,635,635,635,114,114,114,114,114,114,\n\n/* block 160 */\n636,636,636,637,637,637,637,637,637,637,637,637,637,637,637,637,\n637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,637,\n637,637,637,637,637,637,637,636,636,636,636,636,638,636,636,636,\n636,636,636,636,636,114,639,639,639,639,639,639,639,639,639,639,\n640,640,640,640,114,114,114,114,114,114,114,114,114,114,114,114,\n641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,\n641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,641,\n641,641,641,642,643,643,641,114,114,114,114,114,114,114,114,114,\n\n/* block 161 */\n644,644,645,646,646,646,646,646,646,646,646,646,646,646,646,646,\n646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,\n646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,646,\n646,646,646,645,645,645,644,644,644,644,644,644,644,644,644,645,\n645,646,646,646,646,647,647,647,647,114,114,114,114,647,114,114,\n648,648,648,648,648,648,648,648,648,648,646,114,114,114,114,114,\n114,649,649,649,649,649,649,649,649,649,649,649,649,649,649,649,\n649,649,649,649,649,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 162 */\n650,650,650,650,650,650,650,650,650,650,650,650,650,650,650,650,\n650,650,114,650,650,650,650,650,650,650,650,650,650,650,650,650,\n650,650,650,650,650,650,650,650,650,650,650,650,651,651,651,652,\n652,652,651,651,652,651,652,652,653,653,653,653,653,653,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 163 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,\n654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,\n654,654,654,654,654,654,654,654,654,654,654,654,654,654,654,655,\n656,656,656,655,655,655,655,655,655,655,655,114,114,114,114,114,\n657,657,657,657,657,657,657,657,657,657,114,114,114,114,114,114,\n\n/* block 164 */\n114,658,659,659,114,660,660,660,660,660,660,660,660,114,114,660,\n660,114,114,660,660,660,660,660,660,660,660,660,660,660,660,660,\n660,660,660,660,660,660,660,660,660,114,660,660,660,660,660,660,\n660,114,660,660,114,660,660,660,660,660,114,114,658,660,661,659,\n658,659,659,659,659,114,114,659,659,114,114,659,659,659,114,114,\n114,114,114,114,114,114,114,661,114,114,114,114,114,660,660,660,\n660,660,659,659,114,114,658,658,658,658,658,658,658,114,114,114,\n658,658,658,658,658,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 165 */\n662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,\n662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,\n662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,\n663,664,664,665,665,665,665,665,665,664,665,664,664,663,664,665,\n665,664,665,665,662,662,666,662,114,114,114,114,114,114,114,114,\n667,667,667,667,667,667,667,667,667,667,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 166 */\n668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,\n668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,\n668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,669,\n670,670,671,671,671,671,114,114,670,670,670,670,671,671,670,671,\n671,672,672,672,672,672,672,672,672,672,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 167 */\n673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,\n673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,\n673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,\n674,674,674,675,675,675,675,675,675,675,675,674,674,675,674,675,\n675,676,676,676,673,114,114,114,114,114,114,114,114,114,114,114,\n677,677,677,677,677,677,677,677,677,677,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 168 */\n678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,\n678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,\n678,678,678,678,678,678,678,678,678,678,678,679,680,679,680,680,\n679,679,679,679,679,679,680,679,114,114,114,114,114,114,114,114,\n681,681,681,681,681,681,681,681,681,681,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 169 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,\n682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,682,\n683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,\n683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,\n684,684,684,684,684,684,684,684,684,684,685,685,685,685,685,685,\n685,685,685,114,114,114,114,114,114,114,114,114,114,114,114,686,\n\n/* block 170 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,\n687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,\n687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,\n687,687,687,687,687,687,687,687,687,114,114,114,114,114,114,114,\n\n/* block 171 */\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n\n/* block 172 */\n688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,\n688,688,688,688,688,688,688,688,688,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 173 */\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,\n689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,114,\n690,690,690,690,690,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 174 */\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n\n/* block 175 */\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,\n691,691,691,691,691,691,691,691,691,691,691,691,691,691,691,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 176 */\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n\n/* block 177 */\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,497,\n497,497,497,497,497,497,497,497,497,114,114,114,114,114,114,114,\n692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,\n692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,114,\n693,693,693,693,693,693,693,693,693,693,114,114,114,114,694,694,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 178 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,695,\n695,695,695,695,695,695,695,695,695,695,695,695,695,695,114,114,\n696,696,696,696,696,697,114,114,114,114,114,114,114,114,114,114,\n\n/* block 179 */\n698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,\n698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,\n698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,\n699,699,699,699,699,699,699,700,700,700,700,700,701,701,701,701,\n702,702,702,702,700,701,114,114,114,114,114,114,114,114,114,114,\n703,703,703,703,703,703,703,703,703,703,114,704,704,704,704,704,\n704,704,114,698,698,698,698,698,698,698,698,698,698,698,698,698,\n698,698,698,698,698,698,698,698,114,114,114,114,114,698,698,698,\n\n/* block 180 */\n698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 181 */\n705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,\n705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,\n705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,\n705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,\n705,705,705,705,705,114,114,114,114,114,114,114,114,114,114,114,\n705,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,\n706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,\n706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,114,\n\n/* block 182 */\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,707,\n707,707,707,708,708,708,708,708,708,708,708,708,708,708,708,708,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 183 */\n478,476,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 184 */\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,\n709,709,709,709,709,709,709,709,709,709,709,114,114,114,114,114,\n709,709,709,709,709,709,709,709,709,709,709,709,709,114,114,114,\n\n/* block 185 */\n709,709,709,709,709,709,709,709,709,114,114,114,114,114,114,114,\n709,709,709,709,709,709,709,709,709,709,114,114,710,711,711,712,\n 22, 22, 22, 22,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 186 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,\n\n/* block 187 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19,713,405,109,109,109, 19, 19, 19,405,713,713,\n713,713,713, 22, 22, 22, 22, 22, 22, 22, 22,109,109,109,109,109,\n\n/* block 188 */\n109,109,109, 19, 19,109,109,109,109,109,109,109, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,109,109,109,109, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 189 */\n559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,\n559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,\n559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,\n559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,\n559,559,714,714,714,559,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 190 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\n 23, 23,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 191 */\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,438,438,\n438,438,438,438,438,114,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n\n/* block 192 */\n437,437,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,437,114,437,437,\n114,114,437,114,114,437,437,114,114,437,437,437,437,114,437,437,\n437,437,437,437,437,437,438,438,438,438,114,438,114,438,438,438,\n438,438,438,438,114,438,438,438,438,438,438,438,438,438,438,438,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n\n/* block 193 */\n438,438,438,438,437,437,114,437,437,437,437,114,114,437,437,437,\n437,437,437,437,437,114,437,437,437,437,437,437,437,114,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,437,437,114,437,437,437,437,114,\n437,437,437,437,437,114,437,114,114,114,437,437,437,437,437,437,\n437,114,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n\n/* block 194 */\n437,437,437,437,437,437,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n\n/* block 195 */\n438,438,438,438,438,438,438,438,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n\n/* block 196 */\n437,437,437,437,437,437,437,437,437,437,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,114,114,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,  8,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,  8,438,438,438,438,\n438,438,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,  8,438,438,438,438,\n\n/* block 197 */\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,  8,438,438,438,438,438,438,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,  8,438,438,438,438,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,  8,\n438,438,438,438,438,438,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,  8,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n\n/* block 198 */\n438,438,438,438,438,438,438,438,438,  8,438,438,438,438,438,438,\n437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,\n437,437,437,437,437,437,437,437,437,  8,438,438,438,438,438,438,\n438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,438,\n438,438,438,  8,438,438,438,438,438,438,437,438,114,114, 10, 10,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n\n/* block 199 */\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n\n/* block 200 */\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,\n715,715,715,715,715,114,114,716,716,716,716,716,716,716,716,716,\n717,717,717,717,717,717,717,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 201 */\n199,199,199,199,114,199,199,199,199,199,199,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,199,\n114,199,199,114,199,114,114,199,114,199,199,199,199,199,199,199,\n199,199,199,114,199,199,199,199,114,199,114,199,114,114,114,114,\n114,114,199,114,114,114,114,199,114,199,114,199,114,199,199,199,\n114,199,199,114,199,114,114,199,114,199,114,199,114,199,114,199,\n114,199,199,114,199,114,114,199,199,199,199,114,199,199,199,199,\n199,199,199,114,199,199,199,199,114,199,199,199,199,114,199,114,\n\n/* block 202 */\n199,199,199,199,199,199,199,199,199,199,114,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,114,114,114,114,\n114,199,199,199,114,199,199,199,199,199,114,199,199,199,199,199,\n199,199,199,199,199,199,199,199,199,199,199,199,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n194,194,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 203 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 204 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,\n114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,\n\n/* block 205 */\n 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 206 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,718,718,718,718,718,718,718,718,718,718,\n718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,718,\n\n/* block 207 */\n719, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,\n 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 208 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,\n\n/* block 209 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,\n114,114,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,\n\n/* block 210 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,\n\n/* block 211 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114, 19, 19, 19, 19, 19,\n\n/* block 212 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 213 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19,114,114, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 214 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,\n 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 215 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 216 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 217 */\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n\n/* block 218 */\n 19, 19, 19, 19, 19, 19, 19, 19,114,114,114,114,114,114,114,114,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 219 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 220 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,114,114,114,114,114,114,114,114,114,114,114,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n\n/* block 221 */\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,484,\n484,484,484,484,484,484,484,484,484,484,484,484,484,484,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,\n\n/* block 222 */\n436, 22,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\n\n/* block 223 */\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n\n/* block 224 */\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n\n/* block 225 */\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,\n436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,436,\n\n/* block 226 */\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,\n552,552,552,552,552,552,552,552,552,552,552,552,552,552,114,114,\n\n};\n\n#if UCD_BLOCK_SIZE != 128\n#error Please correct UCD_BLOCK_SIZE in pcre_internal.h\n#endif\n#endif  /* SUPPORT_UCP */\n\n#endif  /* PCRE_INCLUDED */\n"
  },
  {
    "path": "src/pcre/pcre_valid_utf8.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains an internal function for validating UTF-8 character\nstrings. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*         Validate a UTF-8 string                *\n*************************************************/\n\n/* This function is called (optionally) at the start of compile or match, to\ncheck that a supposed UTF-8 string is actually valid. The early check means\nthat subsequent code can assume it is dealing with a valid string. The check\ncan be turned off for maximum performance, but the consequences of supplying an\ninvalid string are then undefined.\n\nOriginally, this function checked according to RFC 2279, allowing for values in\nthe range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were in\nthe canonical format. Once somebody had pointed out RFC 3629 to me (it\nobsoletes 2279), additional restrictions were applied. The values are now\nlimited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the\nsubrange 0xd000 to 0xdfff is excluded. However, the format of 5-byte and 6-byte\ncharacters is still checked.\n\nFrom release 8.13 more information about the details of the error are passed\nback in the returned value:\n\nPCRE_UTF8_ERR0   No error\nPCRE_UTF8_ERR1   Missing 1 byte at the end of the string\nPCRE_UTF8_ERR2   Missing 2 bytes at the end of the string\nPCRE_UTF8_ERR3   Missing 3 bytes at the end of the string\nPCRE_UTF8_ERR4   Missing 4 bytes at the end of the string\nPCRE_UTF8_ERR5   Missing 5 bytes at the end of the string\nPCRE_UTF8_ERR6   2nd-byte's two top bits are not 0x80\nPCRE_UTF8_ERR7   3rd-byte's two top bits are not 0x80\nPCRE_UTF8_ERR8   4th-byte's two top bits are not 0x80\nPCRE_UTF8_ERR9   5th-byte's two top bits are not 0x80\nPCRE_UTF8_ERR10  6th-byte's two top bits are not 0x80\nPCRE_UTF8_ERR11  5-byte character is not permitted by RFC 3629\nPCRE_UTF8_ERR12  6-byte character is not permitted by RFC 3629\nPCRE_UTF8_ERR13  4-byte character with value > 0x10ffff is not permitted\nPCRE_UTF8_ERR14  3-byte character with value 0xd000-0xdfff is not permitted\nPCRE_UTF8_ERR15  Overlong 2-byte sequence\nPCRE_UTF8_ERR16  Overlong 3-byte sequence\nPCRE_UTF8_ERR17  Overlong 4-byte sequence\nPCRE_UTF8_ERR18  Overlong 5-byte sequence (won't ever occur)\nPCRE_UTF8_ERR19  Overlong 6-byte sequence (won't ever occur)\nPCRE_UTF8_ERR20  Isolated 0x80 byte (not within UTF-8 character)\nPCRE_UTF8_ERR21  Byte with the illegal value 0xfe or 0xff\nPCRE_UTF8_ERR22  Unused (was non-character)\n\nArguments:\n  string       points to the string\n  length       length of string, or -1 if the string is zero-terminated\n  errp         pointer to an error position offset variable\n\nReturns:       = 0    if the string is a valid UTF-8 string\n               > 0    otherwise, setting the offset of the bad character\n*/\n\nint\nPRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset)\n{\n#ifdef SUPPORT_UTF\nregister PCRE_PUCHAR p;\n\nif (length < 0)\n  {\n  for (p = string; *p != 0; p++);\n  length = (int)(p - string);\n  }\n\nfor (p = string; length-- > 0; p++)\n  {\n  register pcre_uchar ab, c, d;\n\n  c = *p;\n  if (c < 128) continue;                /* ASCII character */\n\n  if (c < 0xc0)                         /* Isolated 10xx xxxx byte */\n    {\n    *erroroffset = (int)(p - string);\n    return PCRE_UTF8_ERR20;\n    }\n\n  if (c >= 0xfe)                        /* Invalid 0xfe or 0xff bytes */\n    {\n    *erroroffset = (int)(p - string);\n    return PCRE_UTF8_ERR21;\n    }\n\n  ab = PRIV(utf8_table4)[c & 0x3f];     /* Number of additional bytes */\n  if (length < ab)\n    {\n    *erroroffset = (int)(p - string);          /* Missing bytes */\n    return ab - length;                 /* Codes ERR1 to ERR5 */\n    }\n  length -= ab;                         /* Length remaining */\n\n  /* Check top bits in the second byte */\n\n  if (((d = *(++p)) & 0xc0) != 0x80)\n    {\n    *erroroffset = (int)(p - string) - 1;\n    return PCRE_UTF8_ERR6;\n    }\n\n  /* For each length, check that the remaining bytes start with the 0x80 bit\n  set and not the 0x40 bit. Then check for an overlong sequence, and for the\n  excluded range 0xd800 to 0xdfff. */\n\n  switch (ab)\n    {\n    /* 2-byte character. No further bytes to check for 0x80. Check first byte\n    for for xx00 000x (overlong sequence). */\n\n    case 1: if ((c & 0x3e) == 0)\n      {\n      *erroroffset = (int)(p - string) - 1;\n      return PCRE_UTF8_ERR15;\n      }\n    break;\n\n    /* 3-byte character. Check third byte for 0x80. Then check first 2 bytes\n      for 1110 0000, xx0x xxxx (overlong sequence) or\n          1110 1101, 1010 xxxx (0xd800 - 0xdfff) */\n\n    case 2:\n    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR7;\n      }\n    if (c == 0xe0 && (d & 0x20) == 0)\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR16;\n      }\n    if (c == 0xed && d >= 0xa0)\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR14;\n      }\n    break;\n\n    /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2\n       bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a\n       character greater than 0x0010ffff (f4 8f bf bf) */\n\n    case 3:\n    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR7;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */\n      {\n      *erroroffset = (int)(p - string) - 3;\n      return PCRE_UTF8_ERR8;\n      }\n    if (c == 0xf0 && (d & 0x30) == 0)\n      {\n      *erroroffset = (int)(p - string) - 3;\n      return PCRE_UTF8_ERR17;\n      }\n    if (c > 0xf4 || (c == 0xf4 && d > 0x8f))\n      {\n      *erroroffset = (int)(p - string) - 3;\n      return PCRE_UTF8_ERR13;\n      }\n    break;\n\n    /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be\n    rejected by the length test below. However, we do the appropriate tests\n    here so that overlong sequences get diagnosed, and also in case there is\n    ever an option for handling these larger code points. */\n\n    /* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for\n    1111 1000, xx00 0xxx */\n\n    case 4:\n    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR7;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */\n      {\n      *erroroffset = (int)(p - string) - 3;\n      return PCRE_UTF8_ERR8;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */\n      {\n      *erroroffset = (int)(p - string) - 4;\n      return PCRE_UTF8_ERR9;\n      }\n    if (c == 0xf8 && (d & 0x38) == 0)\n      {\n      *erroroffset = (int)(p - string) - 4;\n      return PCRE_UTF8_ERR18;\n      }\n    break;\n\n    /* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for\n    1111 1100, xx00 00xx. */\n\n    case 5:\n    if ((*(++p) & 0xc0) != 0x80)     /* Third byte */\n      {\n      *erroroffset = (int)(p - string) - 2;\n      return PCRE_UTF8_ERR7;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Fourth byte */\n      {\n      *erroroffset = (int)(p - string) - 3;\n      return PCRE_UTF8_ERR8;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Fifth byte */\n      {\n      *erroroffset = (int)(p - string) - 4;\n      return PCRE_UTF8_ERR9;\n      }\n    if ((*(++p) & 0xc0) != 0x80)     /* Sixth byte */\n      {\n      *erroroffset = (int)(p - string) - 5;\n      return PCRE_UTF8_ERR10;\n      }\n    if (c == 0xfc && (d & 0x3c) == 0)\n      {\n      *erroroffset = (int)(p - string) - 5;\n      return PCRE_UTF8_ERR19;\n      }\n    break;\n    }\n\n  /* Character is valid under RFC 2279, but 4-byte and 5-byte characters are\n  excluded by RFC 3629. The pointer p is currently at the last byte of the\n  character. */\n\n  if (ab > 3)\n    {\n    *erroroffset = (int)(p - string) - ab;\n    return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12;\n    }\n  }\n\n#else  /* Not SUPPORT_UTF */\n(void)(string);  /* Keep picky compilers happy */\n(void)(length);\n(void)(erroroffset);\n#endif\n\nreturn PCRE_UTF8_ERR0;   /* This indicates success */\n}\n\n/* End of pcre_valid_utf8.c */\n"
  },
  {
    "path": "src/pcre/pcre_version.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains the external function pcre_version(), which returns a\nstring that identifies the PCRE version that is in use. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*          Return version string                 *\n*************************************************/\n\n/* These macros are the standard way of turning unquoted text into C strings.\nThey allow macros like PCRE_MAJOR to be defined without quotes, which is\nconvenient for user programs that want to test its value. */\n\n#define STRING(a)  # a\n#define XSTRING(s) STRING(s)\n\n/* A problem turned up with PCRE_PRERELEASE, which is defined empty for\nproduction releases. Originally, it was used naively in this code:\n\n  return XSTRING(PCRE_MAJOR)\n         \".\" XSTRING(PCRE_MINOR)\n             XSTRING(PCRE_PRERELEASE)\n         \" \" XSTRING(PCRE_DATE);\n\nHowever, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of\nSTRING(). The C standard states: \"If (before argument substitution) any\nargument consists of no preprocessing tokens, the behavior is undefined.\" It\nturns out the gcc treats this case as a single empty string - which is what we\nreally want - but Visual C grumbles about the lack of an argument for the\nmacro. Unfortunately, both are within their rights. To cope with both ways of\nhandling this, I had resort to some messy hackery that does a test at run time.\nI could find no way of detecting that a macro is defined as an empty string at\npre-processor time. This hack uses a standard trick for avoiding calling\nthe STRING macro with an empty argument when doing the test. */\n\n#if defined COMPILE_PCRE8\nPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION\npcre_version(void)\n#elif defined COMPILE_PCRE16\nPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION\npcre16_version(void)\n#elif defined COMPILE_PCRE32\nPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION\npcre32_version(void)\n#endif\n{\nreturn (XSTRING(Z PCRE_PRERELEASE)[1] == 0)?\n  XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) :\n  XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE);\n}\n\n/* End of pcre_version.c */\n"
  },
  {
    "path": "src/pcre/pcre_xclass.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2013 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module contains an internal function that is used to match an extended\nclass. It is used by both pcre_exec() and pcre_def_exec(). */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"pcre_internal.h\"\n\n\n/*************************************************\n*       Match character against an XCLASS        *\n*************************************************/\n\n/* This function is called to match a character against an extended class that\nmight contain values > 255 and/or Unicode properties.\n\nArguments:\n  c           the character\n  data        points to the flag byte of the XCLASS data\n\nReturns:      TRUE if character matches, else FALSE\n*/\n\nBOOL\nPRIV(xclass)(pcre_uint32 c, const pcre_uchar *data, BOOL utf)\n{\npcre_uchar t;\nBOOL negated = (*data & XCL_NOT) != 0;\n\n(void)utf;\n#ifdef COMPILE_PCRE8\n/* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */\nutf = TRUE;\n#endif\n\n/* Character values < 256 are matched against a bitmap, if one is present. If\nnot, we still carry on, because there may be ranges that start below 256 in the\nadditional data. */\n\nif (c < 256)\n  {\n  if ((*data & XCL_HASPROP) == 0)\n    {\n    if ((*data & XCL_MAP) == 0) return negated;\n    return (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0;\n    }\n  if ((*data & XCL_MAP) != 0 &&\n    (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0)\n    return !negated; /* char found */\n  }\n\n/* First skip the bit map if present. Then match against the list of Unicode\nproperties or large chars or ranges that end with a large char. We won't ever\nencounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */\n\nif ((*data++ & XCL_MAP) != 0) data += 32 / sizeof(pcre_uchar);\n\nwhile ((t = *data++) != XCL_END)\n  {\n  pcre_uint32 x, y;\n  if (t == XCL_SINGLE)\n    {\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      GETCHARINC(x, data); /* macro generates multiple statements */\n      }\n    else\n#endif\n      x = *data++;\n    if (c == x) return !negated;\n    }\n  else if (t == XCL_RANGE)\n    {\n#ifdef SUPPORT_UTF\n    if (utf)\n      {\n      GETCHARINC(x, data); /* macro generates multiple statements */\n      GETCHARINC(y, data); /* macro generates multiple statements */\n      }\n    else\n#endif\n      {\n      x = *data++;\n      y = *data++;\n      }\n    if (c >= x && c <= y) return !negated;\n    }\n\n#ifdef SUPPORT_UCP\n  else  /* XCL_PROP & XCL_NOTPROP */\n    {\n    const ucd_record *prop = GET_UCD(c);\n    BOOL isprop = t == XCL_PROP;\n\n    switch(*data)\n      {\n      case PT_ANY:\n      if (isprop) return !negated;\n      break;\n\n      case PT_LAMP:\n      if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||\n           prop->chartype == ucp_Lt) == isprop) return !negated;\n      break;\n\n      case PT_GC:\n      if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == isprop)\n        return !negated;\n      break;\n\n      case PT_PC:\n      if ((data[1] == prop->chartype) == isprop) return !negated;\n      break;\n\n      case PT_SC:\n      if ((data[1] == prop->script) == isprop) return !negated;\n      break;\n\n      case PT_ALNUM:\n      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n           PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop)\n        return !negated;\n      break;\n\n      /* Perl space used to exclude VT, but from Perl 5.18 it is included,\n      which means that Perl space and POSIX space are now identical. PCRE\n      was changed at release 8.34. */\n\n      case PT_SPACE:    /* Perl space */\n      case PT_PXSPACE:  /* POSIX space */\n      switch(c)\n        {\n        HSPACE_CASES:\n        VSPACE_CASES:\n        if (isprop) return !negated;\n        break;\n\n        default:\n        if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == isprop)\n          return !negated;\n        break;\n        }\n      break;\n\n      case PT_WORD:\n      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L ||\n           PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE)\n             == isprop)\n        return !negated;\n      break;\n\n      case PT_UCNC:\n      if (c < 0xa0)\n        {\n        if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||\n             c == CHAR_GRAVE_ACCENT) == isprop)\n          return !negated;\n        }\n      else\n        {\n        if ((c < 0xd800 || c > 0xdfff) == isprop)\n          return !negated;\n        }\n      break;\n\n      /* The following three properties can occur only in an XCLASS, as there\n      is no \\p or \\P coding for them. */\n\n      /* Graphic character. Implement this as not Z (space or separator) and\n      not C (other), except for Cf (format) with a few exceptions. This seems\n      to be what Perl does. The exceptional characters are:\n\n      U+061C           Arabic Letter Mark\n      U+180E           Mongolian Vowel Separator\n      U+2066 - U+2069  Various \"isolate\"s\n      */\n\n      case PT_PXGRAPH:\n      if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z &&\n            (PRIV(ucp_gentype)[prop->chartype] != ucp_C ||\n              (prop->chartype == ucp_Cf &&\n                c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069))\n         )) == isprop)\n        return !negated;\n      break;\n\n      /* Printable character: same as graphic, with the addition of Zs, i.e.\n      not Zl and not Zp, and U+180E. */\n\n      case PT_PXPRINT:\n      if ((prop->chartype != ucp_Zl &&\n           prop->chartype != ucp_Zp &&\n            (PRIV(ucp_gentype)[prop->chartype] != ucp_C ||\n              (prop->chartype == ucp_Cf &&\n                c != 0x061c && (c < 0x2066 || c > 0x2069))\n         )) == isprop)\n        return !negated;\n      break;\n\n      /* Punctuation: all Unicode punctuation, plus ASCII characters that\n      Unicode treats as symbols rather than punctuation, for Perl\n      compatibility (these are $+<=>^`|~). */\n\n      case PT_PXPUNCT:\n      if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P ||\n            (c < 128 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop)\n        return !negated;\n      break;\n\n      /* This should never occur, but compilers may mutter if there is no\n      default. */\n\n      default:\n      return FALSE;\n      }\n\n    data += 2;\n    }\n#endif  /* SUPPORT_UCP */\n  }\n\nreturn negated;   /* char did not match */\n}\n\n/* End of pcre_xclass.c */\n"
  },
  {
    "path": "src/pcre/pcrecpp.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <limits.h>      /* for SHRT_MIN, USHRT_MAX, etc */\n#include <string.h>      /* for memcpy */\n#include <assert.h>\n#include <errno.h>\n#include <string>\n#include <algorithm>\n\n#include \"pcrecpp_internal.h\"\n#include \"pcre.h\"\n#include \"pcrecpp.h\"\n#include \"pcre_stringpiece.h\"\n\n\nnamespace pcrecpp {\n\n// Maximum number of args we can set\nstatic const int kMaxArgs = 16;\nstatic const int kVecSize = (1 + kMaxArgs) * 3;  // results + PCRE workspace\n\n// Special object that stands-in for no argument\nArg RE::no_arg((void*)NULL);\n\n// This is for ABI compatibility with old versions of pcre (pre-7.6),\n// which defined a global no_arg variable instead of putting it in the\n// RE class.  This works on GCC >= 3, at least.  It definitely works\n// for ELF, but may not for other object formats (Mach-O, for\n// instance, does not support aliases.)  We could probably have a more\n// inclusive test if we ever needed it.  (Note that not only the\n// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are\n// gnu-specific.)\n#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) && !defined(__INTEL_COMPILER)\n# define ULP_AS_STRING(x)            ULP_AS_STRING_INTERNAL(x)\n# define ULP_AS_STRING_INTERNAL(x)   #x\n# define USER_LABEL_PREFIX_STR       ULP_AS_STRING(__USER_LABEL_PREFIX__)\nextern Arg no_arg\n  __attribute__((alias(USER_LABEL_PREFIX_STR \"_ZN7pcrecpp2RE6no_argE\")));\n#endif\n\n// If a regular expression has no error, its error_ field points here\nstatic const string empty_string;\n\n// If the user doesn't ask for any options, we just use this one\nstatic RE_Options default_options;\n\n// Specials for the start of patterns. See comments where start_options is used\n// below. (PH June 2018)\nstatic const char *start_options[] = {\n  \"(*UTF8)\",\n  \"(*UTF)\",\n  \"(*UCP)\",\n  \"(*NO_START_OPT)\",\n  \"(*NO_AUTO_POSSESS)\",\n  \"(*LIMIT_RECURSION=\",\n  \"(*LIMIT_MATCH=\",\n  \"(*CRLF)\",\n  \"(*CR)\",\n  \"(*BSR_UNICODE)\",\n  \"(*BSR_ANYCRLF)\",\n  \"(*ANYCRLF)\",\n  \"(*ANY)\",\n  \"\" };\n\nvoid RE::Init(const string& pat, const RE_Options* options) {\n  pattern_ = pat;\n  if (options == NULL) {\n    options_ = default_options;\n  } else {\n    options_ = *options;\n  }\n  error_ = &empty_string;\n  re_full_ = NULL;\n  re_partial_ = NULL;\n\n  re_partial_ = Compile(UNANCHORED);\n  if (re_partial_ != NULL) {\n    re_full_ = Compile(ANCHOR_BOTH);\n  }\n}\n\nvoid RE::Cleanup() {\n  if (re_full_ != NULL)         (*pcre_free)(re_full_);\n  if (re_partial_ != NULL)      (*pcre_free)(re_partial_);\n  if (error_ != &empty_string)  delete error_;\n}\n\n\nRE::~RE() {\n  Cleanup();\n}\n\n\npcre* RE::Compile(Anchor anchor) {\n  // First, convert RE_Options into pcre options\n  int pcre_options = 0;\n  pcre_options = options_.all_options();\n\n  // Special treatment for anchoring.  This is needed because at\n  // runtime pcre only provides an option for anchoring at the\n  // beginning of a string (unless you use offset).\n  //\n  // There are three types of anchoring we want:\n  //    UNANCHORED      Compile the original pattern, and use\n  //                    a pcre unanchored match.\n  //    ANCHOR_START    Compile the original pattern, and use\n  //                    a pcre anchored match.\n  //    ANCHOR_BOTH     Tack a \"\\z\" to the end of the original pattern\n  //                    and use a pcre anchored match.\n\n  const char* compile_error;\n  int eoffset;\n  pcre* re;\n  if (anchor != ANCHOR_BOTH) {\n    re = pcre_compile(pattern_.c_str(), pcre_options,\n                      &compile_error, &eoffset, NULL);\n  } else {\n    // Tack a '\\z' at the end of RE.  Parenthesize it first so that\n    // the '\\z' applies to all top-level alternatives in the regexp.\n\n    /* When this code was written (for PCRE 6.0) it was enough just to\n    parenthesize the entire pattern. Unfortunately, when the feature of\n    starting patterns with (*UTF8) or (*CR) etc. was added to PCRE patterns,\n    this code was never updated. This bug was not noticed till 2018, long after\n    PCRE became obsolescent and its maintainer no longer around. Since PCRE is\n    frozen, I have added a hack to check for all the existing \"start of\n    pattern\" specials - knowing that no new ones will ever be added. I am not a\n    C++ programmer, so the code style is no doubt crude. It is also\n    inefficient, but is only run when the pattern starts with \"(*\".\n    PH June 2018. */\n\n    string wrapped = \"\";\n\n    if (pattern_.c_str()[0] == '(' && pattern_.c_str()[1] == '*') {\n      int kk, klen, kmat;\n      for (;;) {   // Loop for any number of leading items\n\n        for (kk = 0; start_options[kk][0] != 0; kk++) {\n          klen = strlen(start_options[kk]);\n          kmat = strncmp(pattern_.c_str(), start_options[kk], klen);\n          if (kmat >= 0) break;\n        }\n        if (kmat != 0) break;  // Not found\n\n        // If the item ended in \"=\" we must copy digits up to \")\".\n\n        if (start_options[kk][klen-1] == '=') {\n          while (isdigit(pattern_.c_str()[klen])) klen++;\n          if (pattern_.c_str()[klen] != ')') break;  // Syntax error\n          klen++;\n        }\n\n        // Move the item from the pattern to the start of the wrapped string.\n\n        wrapped += pattern_.substr(0, klen);\n        pattern_.erase(0, klen);\n      }\n    }\n\n    // Wrap the rest of the pattern.\n\n    wrapped += \"(?:\";  // A non-counting grouping operator\n    wrapped += pattern_;\n    wrapped += \")\\\\z\";\n    re = pcre_compile(wrapped.c_str(), pcre_options,\n                      &compile_error, &eoffset, NULL);\n  }\n  if (re == NULL) {\n    if (error_ == &empty_string) error_ = new string(compile_error);\n  }\n  return re;\n}\n\n/***** Matching interfaces *****/\n\nbool RE::FullMatch(const StringPiece& text,\n                   const Arg& ptr1,\n                   const Arg& ptr2,\n                   const Arg& ptr3,\n                   const Arg& ptr4,\n                   const Arg& ptr5,\n                   const Arg& ptr6,\n                   const Arg& ptr7,\n                   const Arg& ptr8,\n                   const Arg& ptr9,\n                   const Arg& ptr10,\n                   const Arg& ptr11,\n                   const Arg& ptr12,\n                   const Arg& ptr13,\n                   const Arg& ptr14,\n                   const Arg& ptr15,\n                   const Arg& ptr16) const {\n  const Arg* args[kMaxArgs];\n  int n = 0;\n  if (&ptr1  == &no_arg) { goto done; } args[n++] = &ptr1;\n  if (&ptr2  == &no_arg) { goto done; } args[n++] = &ptr2;\n  if (&ptr3  == &no_arg) { goto done; } args[n++] = &ptr3;\n  if (&ptr4  == &no_arg) { goto done; } args[n++] = &ptr4;\n  if (&ptr5  == &no_arg) { goto done; } args[n++] = &ptr5;\n  if (&ptr6  == &no_arg) { goto done; } args[n++] = &ptr6;\n  if (&ptr7  == &no_arg) { goto done; } args[n++] = &ptr7;\n  if (&ptr8  == &no_arg) { goto done; } args[n++] = &ptr8;\n  if (&ptr9  == &no_arg) { goto done; } args[n++] = &ptr9;\n  if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;\n  if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;\n  if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;\n  if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;\n  if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;\n  if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;\n  if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;\n done:\n\n  int consumed;\n  int vec[kVecSize];\n  return DoMatchImpl(text, ANCHOR_BOTH, &consumed, args, n, vec, kVecSize);\n}\n\nbool RE::PartialMatch(const StringPiece& text,\n                      const Arg& ptr1,\n                      const Arg& ptr2,\n                      const Arg& ptr3,\n                      const Arg& ptr4,\n                      const Arg& ptr5,\n                      const Arg& ptr6,\n                      const Arg& ptr7,\n                      const Arg& ptr8,\n                      const Arg& ptr9,\n                      const Arg& ptr10,\n                      const Arg& ptr11,\n                      const Arg& ptr12,\n                      const Arg& ptr13,\n                      const Arg& ptr14,\n                      const Arg& ptr15,\n                      const Arg& ptr16) const {\n  const Arg* args[kMaxArgs];\n  int n = 0;\n  if (&ptr1  == &no_arg) { goto done; } args[n++] = &ptr1;\n  if (&ptr2  == &no_arg) { goto done; } args[n++] = &ptr2;\n  if (&ptr3  == &no_arg) { goto done; } args[n++] = &ptr3;\n  if (&ptr4  == &no_arg) { goto done; } args[n++] = &ptr4;\n  if (&ptr5  == &no_arg) { goto done; } args[n++] = &ptr5;\n  if (&ptr6  == &no_arg) { goto done; } args[n++] = &ptr6;\n  if (&ptr7  == &no_arg) { goto done; } args[n++] = &ptr7;\n  if (&ptr8  == &no_arg) { goto done; } args[n++] = &ptr8;\n  if (&ptr9  == &no_arg) { goto done; } args[n++] = &ptr9;\n  if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;\n  if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;\n  if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;\n  if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;\n  if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;\n  if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;\n  if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;\n done:\n\n  int consumed;\n  int vec[kVecSize];\n  return DoMatchImpl(text, UNANCHORED, &consumed, args, n, vec, kVecSize);\n}\n\nbool RE::Consume(StringPiece* input,\n                 const Arg& ptr1,\n                 const Arg& ptr2,\n                 const Arg& ptr3,\n                 const Arg& ptr4,\n                 const Arg& ptr5,\n                 const Arg& ptr6,\n                 const Arg& ptr7,\n                 const Arg& ptr8,\n                 const Arg& ptr9,\n                 const Arg& ptr10,\n                 const Arg& ptr11,\n                 const Arg& ptr12,\n                 const Arg& ptr13,\n                 const Arg& ptr14,\n                 const Arg& ptr15,\n                 const Arg& ptr16) const {\n  const Arg* args[kMaxArgs];\n  int n = 0;\n  if (&ptr1  == &no_arg) { goto done; } args[n++] = &ptr1;\n  if (&ptr2  == &no_arg) { goto done; } args[n++] = &ptr2;\n  if (&ptr3  == &no_arg) { goto done; } args[n++] = &ptr3;\n  if (&ptr4  == &no_arg) { goto done; } args[n++] = &ptr4;\n  if (&ptr5  == &no_arg) { goto done; } args[n++] = &ptr5;\n  if (&ptr6  == &no_arg) { goto done; } args[n++] = &ptr6;\n  if (&ptr7  == &no_arg) { goto done; } args[n++] = &ptr7;\n  if (&ptr8  == &no_arg) { goto done; } args[n++] = &ptr8;\n  if (&ptr9  == &no_arg) { goto done; } args[n++] = &ptr9;\n  if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;\n  if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;\n  if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;\n  if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;\n  if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;\n  if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;\n  if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;\n done:\n\n  int consumed;\n  int vec[kVecSize];\n  if (DoMatchImpl(*input, ANCHOR_START, &consumed,\n                  args, n, vec, kVecSize)) {\n    input->remove_prefix(consumed);\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool RE::FindAndConsume(StringPiece* input,\n                        const Arg& ptr1,\n                        const Arg& ptr2,\n                        const Arg& ptr3,\n                        const Arg& ptr4,\n                        const Arg& ptr5,\n                        const Arg& ptr6,\n                        const Arg& ptr7,\n                        const Arg& ptr8,\n                        const Arg& ptr9,\n                        const Arg& ptr10,\n                        const Arg& ptr11,\n                        const Arg& ptr12,\n                        const Arg& ptr13,\n                        const Arg& ptr14,\n                        const Arg& ptr15,\n                        const Arg& ptr16) const {\n  const Arg* args[kMaxArgs];\n  int n = 0;\n  if (&ptr1  == &no_arg) { goto done; } args[n++] = &ptr1;\n  if (&ptr2  == &no_arg) { goto done; } args[n++] = &ptr2;\n  if (&ptr3  == &no_arg) { goto done; } args[n++] = &ptr3;\n  if (&ptr4  == &no_arg) { goto done; } args[n++] = &ptr4;\n  if (&ptr5  == &no_arg) { goto done; } args[n++] = &ptr5;\n  if (&ptr6  == &no_arg) { goto done; } args[n++] = &ptr6;\n  if (&ptr7  == &no_arg) { goto done; } args[n++] = &ptr7;\n  if (&ptr8  == &no_arg) { goto done; } args[n++] = &ptr8;\n  if (&ptr9  == &no_arg) { goto done; } args[n++] = &ptr9;\n  if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;\n  if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;\n  if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;\n  if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;\n  if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;\n  if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;\n  if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;\n done:\n\n  int consumed;\n  int vec[kVecSize];\n  if (DoMatchImpl(*input, UNANCHORED, &consumed,\n                  args, n, vec, kVecSize)) {\n    input->remove_prefix(consumed);\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool RE::Replace(const StringPiece& rewrite,\n                 string *str) const {\n  int vec[kVecSize];\n  int matches = TryMatch(*str, 0, UNANCHORED, true, vec, kVecSize);\n  if (matches == 0)\n    return false;\n\n  string s;\n  if (!Rewrite(&s, rewrite, *str, vec, matches))\n    return false;\n\n  assert(vec[0] >= 0);\n  assert(vec[1] >= 0);\n  str->replace(vec[0], vec[1] - vec[0], s);\n  return true;\n}\n\n// Returns PCRE_NEWLINE_CRLF, PCRE_NEWLINE_CR, or PCRE_NEWLINE_LF.\n// Note that PCRE_NEWLINE_CRLF is defined to be P_N_CR | P_N_LF.\n// Modified by PH to add PCRE_NEWLINE_ANY and PCRE_NEWLINE_ANYCRLF.\n\nstatic int NewlineMode(int pcre_options) {\n  // TODO: if we can make it threadsafe, cache this var\n  int newline_mode = 0;\n  /* if (newline_mode) return newline_mode; */  // do this once it's cached\n  if (pcre_options & (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|\n                      PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF)) {\n    newline_mode = (pcre_options &\n                    (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|\n                     PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF));\n  } else {\n    int newline;\n    pcre_config(PCRE_CONFIG_NEWLINE, &newline);\n    if (newline == 10)\n      newline_mode = PCRE_NEWLINE_LF;\n    else if (newline == 13)\n      newline_mode = PCRE_NEWLINE_CR;\n    else if (newline == 3338)\n      newline_mode = PCRE_NEWLINE_CRLF;\n    else if (newline == -1)\n      newline_mode = PCRE_NEWLINE_ANY;\n    else if (newline == -2)\n      newline_mode = PCRE_NEWLINE_ANYCRLF;\n    else\n      assert(NULL == \"Unexpected return value from pcre_config(NEWLINE)\");\n  }\n  return newline_mode;\n}\n\nint RE::GlobalReplace(const StringPiece& rewrite,\n                      string *str) const {\n  int count = 0;\n  int vec[kVecSize];\n  string out;\n  int start = 0;\n  bool last_match_was_empty_string = false;\n\n  while (start <= static_cast<int>(str->length())) {\n    // If the previous match was for the empty string, we shouldn't\n    // just match again: we'll match in the same way and get an\n    // infinite loop.  Instead, we do the match in a special way:\n    // anchored -- to force another try at the same position --\n    // and with a flag saying that this time, ignore empty matches.\n    // If this special match returns, that means there's a non-empty\n    // match at this position as well, and we can continue.  If not,\n    // we do what perl does, and just advance by one.\n    // Notice that perl prints '@@@' for this;\n    //    perl -le '$_ = \"aa\"; s/b*|aa/@/g; print'\n    int matches;\n    if (last_match_was_empty_string) {\n      matches = TryMatch(*str, start, ANCHOR_START, false, vec, kVecSize);\n      if (matches <= 0) {\n        int matchend = start + 1;     // advance one character.\n        // If the current char is CR and we're in CRLF mode, skip LF too.\n        // Note it's better to call pcre_fullinfo() than to examine\n        // all_options(), since options_ could have changed bewteen\n        // compile-time and now, but this is simpler and safe enough.\n        // Modified by PH to add ANY and ANYCRLF.\n        if (matchend < static_cast<int>(str->length()) &&\n            (*str)[start] == '\\r' && (*str)[matchend] == '\\n' &&\n            (NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF ||\n             NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANY ||\n             NewlineMode(options_.all_options()) == PCRE_NEWLINE_ANYCRLF)) {\n          matchend++;\n        }\n        // We also need to advance more than one char if we're in utf8 mode.\n#ifdef SUPPORT_UTF\n        if (options_.utf8()) {\n          while (matchend < static_cast<int>(str->length()) &&\n                 ((*str)[matchend] & 0xc0) == 0x80)\n            matchend++;\n        }\n#endif\n        if (start < static_cast<int>(str->length()))\n          out.append(*str, start, matchend - start);\n        start = matchend;\n        last_match_was_empty_string = false;\n        continue;\n      }\n    } else {\n      matches = TryMatch(*str, start, UNANCHORED, true, vec, kVecSize);\n      if (matches <= 0)\n        break;\n    }\n    int matchstart = vec[0], matchend = vec[1];\n    assert(matchstart >= start);\n    assert(matchend >= matchstart);\n    out.append(*str, start, matchstart - start);\n    Rewrite(&out, rewrite, *str, vec, matches);\n    start = matchend;\n    count++;\n    last_match_was_empty_string = (matchstart == matchend);\n  }\n\n  if (count == 0)\n    return 0;\n\n  if (start < static_cast<int>(str->length()))\n    out.append(*str, start, str->length() - start);\n  swap(out, *str);\n  return count;\n}\n\nbool RE::Extract(const StringPiece& rewrite,\n                 const StringPiece& text,\n                 string *out) const {\n  int vec[kVecSize];\n  int matches = TryMatch(text, 0, UNANCHORED, true, vec, kVecSize);\n  if (matches == 0)\n    return false;\n  out->erase();\n  return Rewrite(out, rewrite, text, vec, matches);\n}\n\n/*static*/ string RE::QuoteMeta(const StringPiece& unquoted) {\n  string result;\n\n  // Escape any ascii character not in [A-Za-z_0-9].\n  //\n  // Note that it's legal to escape a character even if it has no\n  // special meaning in a regular expression -- so this function does\n  // that.  (This also makes it identical to the perl function of the\n  // same name; see `perldoc -f quotemeta`.)  The one exception is\n  // escaping NUL: rather than doing backslash + NUL, like perl does,\n  // we do '\\0', because pcre itself doesn't take embedded NUL chars.\n  for (int ii = 0; ii < unquoted.size(); ++ii) {\n    // Note that using 'isalnum' here raises the benchmark time from\n    // 32ns to 58ns:\n    if (unquoted[ii] == '\\0') {\n      result += \"\\\\0\";\n    } else if ((unquoted[ii] < 'a' || unquoted[ii] > 'z') &&\n               (unquoted[ii] < 'A' || unquoted[ii] > 'Z') &&\n               (unquoted[ii] < '0' || unquoted[ii] > '9') &&\n               unquoted[ii] != '_' &&\n               // If this is the part of a UTF8 or Latin1 character, we need\n               // to copy this byte without escaping.  Experimentally this is\n               // what works correctly with the regexp library.\n               !(unquoted[ii] & 128)) {\n      result += '\\\\';\n      result += unquoted[ii];\n    } else {\n      result += unquoted[ii];\n    }\n  }\n\n  return result;\n}\n\n/***** Actual matching and rewriting code *****/\n\nint RE::TryMatch(const StringPiece& text,\n                 int startpos,\n                 Anchor anchor,\n                 bool empty_ok,\n                 int *vec,\n                 int vecsize) const {\n  pcre* re = (anchor == ANCHOR_BOTH) ? re_full_ : re_partial_;\n  if (re == NULL) {\n    //fprintf(stderr, \"Matching against invalid re: %s\\n\", error_->c_str());\n    return 0;\n  }\n\n  pcre_extra extra = { 0, 0, 0, 0, 0, 0, 0, 0 };\n  if (options_.match_limit() > 0) {\n    extra.flags |= PCRE_EXTRA_MATCH_LIMIT;\n    extra.match_limit = options_.match_limit();\n  }\n  if (options_.match_limit_recursion() > 0) {\n    extra.flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;\n    extra.match_limit_recursion = options_.match_limit_recursion();\n  }\n\n  // int options = 0;\n  // Changed by PH as a result of bugzilla #1288\n  int options = (options_.all_options() & PCRE_NO_UTF8_CHECK);\n\n  if (anchor != UNANCHORED)\n    options |= PCRE_ANCHORED;\n  if (!empty_ok)\n    options |= PCRE_NOTEMPTY;\n\n  int rc = pcre_exec(re,              // The regular expression object\n                     &extra,\n                     (text.data() == NULL) ? \"\" : text.data(),\n                     text.size(),\n                     startpos,\n                     options,\n                     vec,\n                     vecsize);\n\n  // Handle errors\n  if (rc == PCRE_ERROR_NOMATCH) {\n    return 0;\n  } else if (rc < 0) {\n    //fprintf(stderr, \"Unexpected return code: %d when matching '%s'\\n\",\n    //        re, pattern_.c_str());\n    return 0;\n  } else if (rc == 0) {\n    // pcre_exec() returns 0 as a special case when the number of\n    // capturing subpatterns exceeds the size of the vector.\n    // When this happens, there is a match and the output vector\n    // is filled, but we miss out on the positions of the extra subpatterns.\n    rc = vecsize / 2;\n  }\n\n  return rc;\n}\n\nbool RE::DoMatchImpl(const StringPiece& text,\n                     Anchor anchor,\n                     int* consumed,\n                     const Arg* const* args,\n                     int n,\n                     int* vec,\n                     int vecsize) const {\n  assert((1 + n) * 3 <= vecsize);  // results + PCRE workspace\n  int matches = TryMatch(text, 0, anchor, true, vec, vecsize);\n  assert(matches >= 0);  // TryMatch never returns negatives\n  if (matches == 0)\n    return false;\n\n  *consumed = vec[1];\n\n  if (n == 0 || args == NULL) {\n    // We are not interested in results\n    return true;\n  }\n\n  if (NumberOfCapturingGroups() < n) {\n    // RE has fewer capturing groups than number of arg pointers passed in\n    return false;\n  }\n\n  // If we got here, we must have matched the whole pattern.\n  // We do not need (can not do) any more checks on the value of 'matches' here\n  // -- see the comment for TryMatch.\n  for (int i = 0; i < n; i++) {\n    const int start = vec[2*(i+1)];\n    const int limit = vec[2*(i+1)+1];\n    if (!args[i]->Parse(text.data() + start, limit-start)) {\n      // TODO: Should we indicate what the error was?\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool RE::DoMatch(const StringPiece& text,\n                 Anchor anchor,\n                 int* consumed,\n                 const Arg* const args[],\n                 int n) const {\n  assert(n >= 0);\n  size_t const vecsize = (1 + n) * 3;  // results + PCRE workspace\n                                       // (as for kVecSize)\n  int space[21];   // use stack allocation for small vecsize (common case)\n  int* vec = vecsize <= 21 ? space : new int[vecsize];\n  bool retval = DoMatchImpl(text, anchor, consumed, args, n, vec, (int)vecsize);\n  if (vec != space) delete [] vec;\n  return retval;\n}\n\nbool RE::Rewrite(string *out, const StringPiece &rewrite,\n                 const StringPiece &text, int *vec, int veclen) const {\n  for (const char *s = rewrite.data(), *end = s + rewrite.size();\n       s < end; s++) {\n    int c = *s;\n    if (c == '\\\\') {\n      c = *++s;\n      if (isdigit(c)) {\n        int n = (c - '0');\n        if (n >= veclen) {\n          //fprintf(stderr, requested group %d in regexp %.*s\\n\",\n          //        n, rewrite.size(), rewrite.data());\n          return false;\n        }\n        int start = vec[2 * n];\n        if (start >= 0)\n          out->append(text.data() + start, vec[2 * n + 1] - start);\n      } else if (c == '\\\\') {\n        *out += '\\\\';\n      } else {\n        //fprintf(stderr, \"invalid rewrite pattern: %.*s\\n\",\n        //        rewrite.size(), rewrite.data());\n        return false;\n      }\n    } else {\n      *out += c;\n    }\n  }\n  return true;\n}\n\n// Return the number of capturing subpatterns, or -1 if the\n// regexp wasn't valid on construction.\nint RE::NumberOfCapturingGroups() const {\n  if (re_partial_ == NULL) return -1;\n\n  int result;\n  int pcre_retval = pcre_fullinfo(re_partial_,  // The regular expression object\n                                  NULL,         // We did not study the pattern\n                                  PCRE_INFO_CAPTURECOUNT,\n                                  &result);\n  assert(pcre_retval == 0);\n  return result;\n}\n\n/***** Parsers for various types *****/\n\nbool Arg::parse_null(const char* str, int n, void* dest) {\n  (void)str;\n  (void)n;\n  // We fail if somebody asked us to store into a non-NULL void* pointer\n  return (dest == NULL);\n}\n\nbool Arg::parse_string(const char* str, int n, void* dest) {\n  if (dest == NULL) return true;\n  reinterpret_cast<string*>(dest)->assign(str, n);\n  return true;\n}\n\nbool Arg::parse_stringpiece(const char* str, int n, void* dest) {\n  if (dest == NULL) return true;\n  reinterpret_cast<StringPiece*>(dest)->set(str, n);\n  return true;\n}\n\nbool Arg::parse_char(const char* str, int n, void* dest) {\n  if (n != 1) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<char*>(dest)) = str[0];\n  return true;\n}\n\nbool Arg::parse_uchar(const char* str, int n, void* dest) {\n  if (n != 1) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<unsigned char*>(dest)) = str[0];\n  return true;\n}\n\n// Largest number spec that we are willing to parse\nstatic const int kMaxNumberLength = 32;\n\n// REQUIRES \"buf\" must have length at least kMaxNumberLength+1\n// REQUIRES \"n > 0\"\n// Copies \"str\" into \"buf\" and null-terminates if necessary.\n// Returns one of:\n//      a. \"str\" if no termination is needed\n//      b. \"buf\" if the string was copied and null-terminated\n//      c. \"\" if the input was invalid and has no hope of being parsed\nstatic const char* TerminateNumber(char* buf, const char* str, int n) {\n  if ((n > 0) && isspace(*str)) {\n    // We are less forgiving than the strtoxxx() routines and do not\n    // allow leading spaces.\n    return \"\";\n  }\n\n  // See if the character right after the input text may potentially\n  // look like a digit.\n  if (isdigit(str[n]) ||\n      ((str[n] >= 'a') && (str[n] <= 'f')) ||\n      ((str[n] >= 'A') && (str[n] <= 'F'))) {\n    if (n > kMaxNumberLength) return \"\"; // Input too big to be a valid number\n    memcpy(buf, str, n);\n    buf[n] = '\\0';\n    return buf;\n  } else {\n    // We can parse right out of the supplied string, so return it.\n    return str;\n  }\n}\n\nbool Arg::parse_long_radix(const char* str,\n                           int n,\n                           void* dest,\n                           int radix) {\n  if (n == 0) return false;\n  char buf[kMaxNumberLength+1];\n  str = TerminateNumber(buf, str, n);\n  char* end;\n  errno = 0;\n  long r = strtol(str, &end, radix);\n  if (end != str + n) return false;   // Leftover junk\n  if (errno) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<long*>(dest)) = r;\n  return true;\n}\n\nbool Arg::parse_ulong_radix(const char* str,\n                            int n,\n                            void* dest,\n                            int radix) {\n  if (n == 0) return false;\n  char buf[kMaxNumberLength+1];\n  str = TerminateNumber(buf, str, n);\n  if (str[0] == '-') return false;    // strtoul() on a negative number?!\n  char* end;\n  errno = 0;\n  unsigned long r = strtoul(str, &end, radix);\n  if (end != str + n) return false;   // Leftover junk\n  if (errno) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<unsigned long*>(dest)) = r;\n  return true;\n}\n\nbool Arg::parse_short_radix(const char* str,\n                            int n,\n                            void* dest,\n                            int radix) {\n  long r;\n  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse\n  if (r < SHRT_MIN || r > SHRT_MAX) return false;       // Out of range\n  if (dest == NULL) return true;\n  *(reinterpret_cast<short*>(dest)) = static_cast<short>(r);\n  return true;\n}\n\nbool Arg::parse_ushort_radix(const char* str,\n                             int n,\n                             void* dest,\n                             int radix) {\n  unsigned long r;\n  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse\n  if (r > USHRT_MAX) return false;                      // Out of range\n  if (dest == NULL) return true;\n  *(reinterpret_cast<unsigned short*>(dest)) = static_cast<unsigned short>(r);\n  return true;\n}\n\nbool Arg::parse_int_radix(const char* str,\n                          int n,\n                          void* dest,\n                          int radix) {\n  long r;\n  if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse\n  if (r < INT_MIN || r > INT_MAX) return false;         // Out of range\n  if (dest == NULL) return true;\n  *(reinterpret_cast<int*>(dest)) = r;\n  return true;\n}\n\nbool Arg::parse_uint_radix(const char* str,\n                           int n,\n                           void* dest,\n                           int radix) {\n  unsigned long r;\n  if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse\n  if (r > UINT_MAX) return false;                       // Out of range\n  if (dest == NULL) return true;\n  *(reinterpret_cast<unsigned int*>(dest)) = r;\n  return true;\n}\n\nbool Arg::parse_longlong_radix(const char* str,\n                               int n,\n                               void* dest,\n                               int radix) {\n#ifndef HAVE_LONG_LONG\n  return false;\n#else\n  if (n == 0) return false;\n  char buf[kMaxNumberLength+1];\n  str = TerminateNumber(buf, str, n);\n  char* end;\n  errno = 0;\n#if defined HAVE_STRTOQ\n  long long r = strtoq(str, &end, radix);\n#elif defined HAVE_STRTOLL\n  long long r = strtoll(str, &end, radix);\n#elif defined HAVE__STRTOI64\n  long long r = _strtoi64(str, &end, radix);\n#elif defined HAVE_STRTOIMAX\n  long long r = strtoimax(str, &end, radix);\n#else\n#error parse_longlong_radix: cannot convert input to a long-long\n#endif\n  if (end != str + n) return false;   // Leftover junk\n  if (errno) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<long long*>(dest)) = r;\n  return true;\n#endif   /* HAVE_LONG_LONG */\n}\n\nbool Arg::parse_ulonglong_radix(const char* str,\n                                int n,\n                                void* dest,\n                                int radix) {\n#ifndef HAVE_UNSIGNED_LONG_LONG\n  return false;\n#else\n  if (n == 0) return false;\n  char buf[kMaxNumberLength+1];\n  str = TerminateNumber(buf, str, n);\n  if (str[0] == '-') return false;    // strtoull() on a negative number?!\n  char* end;\n  errno = 0;\n#if defined HAVE_STRTOQ\n  unsigned long long r = strtouq(str, &end, radix);\n#elif defined HAVE_STRTOLL\n  unsigned long long r = strtoull(str, &end, radix);\n#elif defined HAVE__STRTOI64\n  unsigned long long r = _strtoui64(str, &end, radix);\n#elif defined HAVE_STRTOIMAX\n  unsigned long long r = strtoumax(str, &end, radix);\n#else\n#error parse_ulonglong_radix: cannot convert input to a long-long\n#endif\n  if (end != str + n) return false;   // Leftover junk\n  if (errno) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<unsigned long long*>(dest)) = r;\n  return true;\n#endif   /* HAVE_UNSIGNED_LONG_LONG */\n}\n\nbool Arg::parse_double(const char* str, int n, void* dest) {\n  if (n == 0) return false;\n  static const int kMaxLength = 200;\n  char buf[kMaxLength];\n  if (n >= kMaxLength) return false;\n  memcpy(buf, str, n);\n  buf[n] = '\\0';\n  errno = 0;\n  char* end;\n  double r = strtod(buf, &end);\n  if (end != buf + n) return false;   // Leftover junk\n  if (errno) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<double*>(dest)) = r;\n  return true;\n}\n\nbool Arg::parse_float(const char* str, int n, void* dest) {\n  double r;\n  if (!parse_double(str, n, &r)) return false;\n  if (dest == NULL) return true;\n  *(reinterpret_cast<float*>(dest)) = static_cast<float>(r);\n  return true;\n}\n\n\n#define DEFINE_INTEGER_PARSERS(name)                                    \\\n  bool Arg::parse_##name(const char* str, int n, void* dest) {          \\\n    return parse_##name##_radix(str, n, dest, 10);                      \\\n  }                                                                     \\\n  bool Arg::parse_##name##_hex(const char* str, int n, void* dest) {    \\\n    return parse_##name##_radix(str, n, dest, 16);                      \\\n  }                                                                     \\\n  bool Arg::parse_##name##_octal(const char* str, int n, void* dest) {  \\\n    return parse_##name##_radix(str, n, dest, 8);                       \\\n  }                                                                     \\\n  bool Arg::parse_##name##_cradix(const char* str, int n, void* dest) { \\\n    return parse_##name##_radix(str, n, dest, 0);                       \\\n  }\n\nDEFINE_INTEGER_PARSERS(short)      /*                                   */\nDEFINE_INTEGER_PARSERS(ushort)     /*                                   */\nDEFINE_INTEGER_PARSERS(int)        /* Don't use semicolons after these  */\nDEFINE_INTEGER_PARSERS(uint)       /* statements because they can cause */\nDEFINE_INTEGER_PARSERS(long)       /* compiler warnings if the checking */\nDEFINE_INTEGER_PARSERS(ulong)      /* level is turned up high enough.   */\nDEFINE_INTEGER_PARSERS(longlong)   /*                                   */\nDEFINE_INTEGER_PARSERS(ulonglong)  /*                                   */\n\n#undef DEFINE_INTEGER_PARSERS\n\n}   // namespace pcrecpp\n"
  },
  {
    "path": "src/pcre/pcrecpp.h",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n// Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005\n\n#ifndef _PCRECPP_H\n#define _PCRECPP_H\n\n// C++ interface to the pcre regular-expression library.  RE supports\n// Perl-style regular expressions (with extensions like \\d, \\w, \\s,\n// ...).\n//\n// -----------------------------------------------------------------------\n// REGEXP SYNTAX:\n//\n// This module is part of the pcre library and hence supports its syntax\n// for regular expressions.\n//\n// The syntax is pretty similar to Perl's.  For those not familiar\n// with Perl's regular expressions, here are some examples of the most\n// commonly used extensions:\n//\n//   \"hello (\\\\w+) world\"  -- \\w matches a \"word\" character\n//   \"version (\\\\d+)\"      -- \\d matches a digit\n//   \"hello\\\\s+world\"      -- \\s matches any whitespace character\n//   \"\\\\b(\\\\w+)\\\\b\"        -- \\b matches empty string at a word boundary\n//   \"(?i)hello\"           -- (?i) turns on case-insensitive matching\n//   \"/\\\\*(.*?)\\\\*/\"       -- .*? matches . minimum no. of times possible\n//\n// -----------------------------------------------------------------------\n// MATCHING INTERFACE:\n//\n// The \"FullMatch\" operation checks that supplied text matches a\n// supplied pattern exactly.\n//\n// Example: successful match\n//    pcrecpp::RE re(\"h.*o\");\n//    re.FullMatch(\"hello\");\n//\n// Example: unsuccessful match (requires full match):\n//    pcrecpp::RE re(\"e\");\n//    !re.FullMatch(\"hello\");\n//\n// Example: creating a temporary RE object:\n//    pcrecpp::RE(\"h.*o\").FullMatch(\"hello\");\n//\n// You can pass in a \"const char*\" or a \"string\" for \"text\".  The\n// examples below tend to use a const char*.\n//\n// You can, as in the different examples above, store the RE object\n// explicitly in a variable or use a temporary RE object.  The\n// examples below use one mode or the other arbitrarily.  Either\n// could correctly be used for any of these examples.\n//\n// -----------------------------------------------------------------------\n// MATCHING WITH SUB-STRING EXTRACTION:\n//\n// You can supply extra pointer arguments to extract matched subpieces.\n//\n// Example: extracts \"ruby\" into \"s\" and 1234 into \"i\"\n//    int i;\n//    string s;\n//    pcrecpp::RE re(\"(\\\\w+):(\\\\d+)\");\n//    re.FullMatch(\"ruby:1234\", &s, &i);\n//\n// Example: does not try to extract any extra sub-patterns\n//    re.FullMatch(\"ruby:1234\", &s);\n//\n// Example: does not try to extract into NULL\n//    re.FullMatch(\"ruby:1234\", NULL, &i);\n//\n// Example: integer overflow causes failure\n//    !re.FullMatch(\"ruby:1234567891234\", NULL, &i);\n//\n// Example: fails because there aren't enough sub-patterns:\n//    !pcrecpp::RE(\"\\\\w+:\\\\d+\").FullMatch(\"ruby:1234\", &s);\n//\n// Example: fails because string cannot be stored in integer\n//    !pcrecpp::RE(\"(.*)\").FullMatch(\"ruby\", &i);\n//\n// The provided pointer arguments can be pointers to any scalar numeric\n// type, or one of\n//    string        (matched piece is copied to string)\n//    StringPiece   (StringPiece is mutated to point to matched piece)\n//    T             (where \"bool T::ParseFrom(const char*, int)\" exists)\n//    NULL          (the corresponding matched sub-pattern is not copied)\n//\n// CAVEAT: An optional sub-pattern that does not exist in the matched\n// string is assigned the empty string.  Therefore, the following will\n// return false (because the empty string is not a valid number):\n//    int number;\n//    pcrecpp::RE::FullMatch(\"abc\", \"[a-z]+(\\\\d+)?\", &number);\n//\n// -----------------------------------------------------------------------\n// DO_MATCH\n//\n// The matching interface supports at most 16 arguments per call.\n// If you need more, consider using the more general interface\n// pcrecpp::RE::DoMatch().  See pcrecpp.h for the signature for DoMatch.\n//\n// -----------------------------------------------------------------------\n// PARTIAL MATCHES\n//\n// You can use the \"PartialMatch\" operation when you want the pattern\n// to match any substring of the text.\n//\n// Example: simple search for a string:\n//    pcrecpp::RE(\"ell\").PartialMatch(\"hello\");\n//\n// Example: find first number in a string:\n//    int number;\n//    pcrecpp::RE re(\"(\\\\d+)\");\n//    re.PartialMatch(\"x*100 + 20\", &number);\n//    assert(number == 100);\n//\n// -----------------------------------------------------------------------\n// UTF-8 AND THE MATCHING INTERFACE:\n//\n// By default, pattern and text are plain text, one byte per character.\n// The UTF8 flag, passed to the constructor, causes both pattern\n// and string to be treated as UTF-8 text, still a byte stream but\n// potentially multiple bytes per character. In practice, the text\n// is likelier to be UTF-8 than the pattern, but the match returned\n// may depend on the UTF8 flag, so always use it when matching\n// UTF8 text.  E.g., \".\" will match one byte normally but with UTF8\n// set may match up to three bytes of a multi-byte character.\n//\n// Example:\n//    pcrecpp::RE_Options options;\n//    options.set_utf8();\n//    pcrecpp::RE re(utf8_pattern, options);\n//    re.FullMatch(utf8_string);\n//\n// Example: using the convenience function UTF8():\n//    pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());\n//    re.FullMatch(utf8_string);\n//\n// NOTE: The UTF8 option is ignored if pcre was not configured with the\n//       --enable-utf8 flag.\n//\n// -----------------------------------------------------------------------\n// PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE\n//\n// PCRE defines some modifiers to change the behavior of the regular\n// expression engine.\n// The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle\n// to pass such modifiers to a RE class.\n//\n// Currently, the following modifiers are supported\n//\n//    modifier              description               Perl corresponding\n//\n//    PCRE_CASELESS         case insensitive match    /i\n//    PCRE_MULTILINE        multiple lines match      /m\n//    PCRE_DOTALL           dot matches newlines      /s\n//    PCRE_DOLLAR_ENDONLY   $ matches only at end     N/A\n//    PCRE_EXTRA            strict escape parsing     N/A\n//    PCRE_EXTENDED         ignore whitespaces        /x\n//    PCRE_UTF8             handles UTF8 chars        built-in\n//    PCRE_UNGREEDY         reverses * and *?         N/A\n//    PCRE_NO_AUTO_CAPTURE  disables matching parens  N/A (*)\n//\n// (For a full account on how each modifier works, please check the\n// PCRE API reference manual).\n//\n// (*) Both Perl and PCRE allow non matching parentheses by means of the\n// \"?:\" modifier within the pattern itself. e.g. (?:ab|cd) does not\n// capture, while (ab|cd) does.\n//\n// For each modifier, there are two member functions whose name is made\n// out of the modifier in lowercase, without the \"PCRE_\" prefix. For\n// instance, PCRE_CASELESS is handled by\n//    bool caseless(),\n// which returns true if the modifier is set, and\n//    RE_Options & set_caseless(bool),\n// which sets or unsets the modifier.\n//\n// Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the\n// set_match_limit() and match_limit() member functions.\n// Setting match_limit to a non-zero value will limit the executation of\n// pcre to keep it from doing bad things like blowing the stack or taking\n// an eternity to return a result.  A value of 5000 is good enough to stop\n// stack blowup in a 2MB thread stack.  Setting match_limit to zero will\n// disable match limiting.  Alternately, you can set match_limit_recursion()\n// which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre\n// recurses.  match_limit() caps the number of matches pcre does;\n// match_limit_recrusion() caps the depth of recursion.\n//\n// Normally, to pass one or more modifiers to a RE class, you declare\n// a RE_Options object, set the appropriate options, and pass this\n// object to a RE constructor. Example:\n//\n//    RE_options opt;\n//    opt.set_caseless(true);\n//\n//    if (RE(\"HELLO\", opt).PartialMatch(\"hello world\")) ...\n//\n// RE_options has two constructors. The default constructor takes no\n// arguments and creates a set of flags that are off by default.\n//\n// The optional parameter 'option_flags' is to facilitate transfer\n// of legacy code from C programs.  This lets you do\n//    RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);\n//\n// But new code is better off doing\n//    RE(pattern,\n//      RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str);\n// (See below)\n//\n// If you are going to pass one of the most used modifiers, there are some\n// convenience functions that return a RE_Options class with the\n// appropriate modifier already set:\n// CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED()\n//\n// If you need to set several options at once, and you don't want to go\n// through the pains of declaring a RE_Options object and setting several\n// options, there is a parallel method that give you such ability on the\n// fly. You can concatenate several set_xxxxx member functions, since each\n// of them returns a reference to its class object.  e.g.: to pass\n// PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one\n// statement, you may write\n//\n//    RE(\" ^ xyz \\\\s+ .* blah$\", RE_Options()\n//                            .set_caseless(true)\n//                            .set_extended(true)\n//                            .set_multiline(true)).PartialMatch(sometext);\n//\n// -----------------------------------------------------------------------\n// SCANNING TEXT INCREMENTALLY\n//\n// The \"Consume\" operation may be useful if you want to repeatedly\n// match regular expressions at the front of a string and skip over\n// them as they match.  This requires use of the \"StringPiece\" type,\n// which represents a sub-range of a real string.  Like RE, StringPiece\n// is defined in the pcrecpp namespace.\n//\n// Example: read lines of the form \"var = value\" from a string.\n//    string contents = ...;                 // Fill string somehow\n//    pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece\n//\n//    string var;\n//    int value;\n//    pcrecpp::RE re(\"(\\\\w+) = (\\\\d+)\\n\");\n//    while (re.Consume(&input, &var, &value)) {\n//      ...;\n//    }\n//\n// Each successful call to \"Consume\" will set \"var/value\", and also\n// advance \"input\" so it points past the matched text.\n//\n// The \"FindAndConsume\" operation is similar to \"Consume\" but does not\n// anchor your match at the beginning of the string.  For example, you\n// could extract all words from a string by repeatedly calling\n//     pcrecpp::RE(\"(\\\\w+)\").FindAndConsume(&input, &word)\n//\n// -----------------------------------------------------------------------\n// PARSING HEX/OCTAL/C-RADIX NUMBERS\n//\n// By default, if you pass a pointer to a numeric value, the\n// corresponding text is interpreted as a base-10 number.  You can\n// instead wrap the pointer with a call to one of the operators Hex(),\n// Octal(), or CRadix() to interpret the text in another base.  The\n// CRadix operator interprets C-style \"0\" (base-8) and \"0x\" (base-16)\n// prefixes, but defaults to base-10.\n//\n// Example:\n//   int a, b, c, d;\n//   pcrecpp::RE re(\"(.*) (.*) (.*) (.*)\");\n//   re.FullMatch(\"100 40 0100 0x40\",\n//                pcrecpp::Octal(&a), pcrecpp::Hex(&b),\n//                pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));\n// will leave 64 in a, b, c, and d.\n//\n// -----------------------------------------------------------------------\n// REPLACING PARTS OF STRINGS\n//\n// You can replace the first match of \"pattern\" in \"str\" with\n// \"rewrite\".  Within \"rewrite\", backslash-escaped digits (\\1 to \\9)\n// can be used to insert text matching corresponding parenthesized\n// group from the pattern.  \\0 in \"rewrite\" refers to the entire\n// matching text.  E.g.,\n//\n//   string s = \"yabba dabba doo\";\n//   pcrecpp::RE(\"b+\").Replace(\"d\", &s);\n//\n// will leave \"s\" containing \"yada dabba doo\".  The result is true if\n// the pattern matches and a replacement occurs, or false otherwise.\n//\n// GlobalReplace() is like Replace(), except that it replaces all\n// occurrences of the pattern in the string with the rewrite.\n// Replacements are not subject to re-matching.  E.g.,\n//\n//   string s = \"yabba dabba doo\";\n//   pcrecpp::RE(\"b+\").GlobalReplace(\"d\", &s);\n//\n// will leave \"s\" containing \"yada dada doo\".  It returns the number\n// of replacements made.\n//\n// Extract() is like Replace(), except that if the pattern matches,\n// \"rewrite\" is copied into \"out\" (an additional argument) with\n// substitutions.  The non-matching portions of \"text\" are ignored.\n// Returns true iff a match occurred and the extraction happened\n// successfully.  If no match occurs, the string is left unaffected.\n\n\n#include <string>\n#include <pcre.h>\n#include <pcrecpparg.h>   // defines the Arg class\n// This isn't technically needed here, but we include it\n// anyway so folks who include pcrecpp.h don't have to.\n#include <pcre_stringpiece.h>\n\nnamespace pcrecpp {\n\n#define PCRE_SET_OR_CLEAR(b, o) \\\n    if (b) all_options_ |= (o); else all_options_ &= ~(o); \\\n    return *this\n\n#define PCRE_IS_SET(o)  \\\n        (all_options_ & o) == o\n\n/***** Compiling regular expressions: the RE class *****/\n\n// RE_Options allow you to set options to be passed along to pcre,\n// along with other options we put on top of pcre.\n// Only 9 modifiers, plus match_limit and match_limit_recursion,\n// are supported now.\nclass PCRECPP_EXP_DEFN RE_Options {\n public:\n  // constructor\n  RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {}\n\n  // alternative constructor.\n  // To facilitate transfer of legacy code from C programs\n  //\n  // This lets you do\n  //    RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);\n  // But new code is better off doing\n  //    RE(pattern,\n  //      RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str);\n  RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0),\n                                 all_options_(option_flags) {}\n  // we're fine with the default destructor, copy constructor, etc.\n\n  // accessors and mutators\n  int match_limit() const { return match_limit_; };\n  RE_Options &set_match_limit(int limit) {\n    match_limit_ = limit;\n    return *this;\n  }\n\n  int match_limit_recursion() const { return match_limit_recursion_; };\n  RE_Options &set_match_limit_recursion(int limit) {\n    match_limit_recursion_ = limit;\n    return *this;\n  }\n\n  bool caseless() const {\n    return PCRE_IS_SET(PCRE_CASELESS);\n  }\n  RE_Options &set_caseless(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_CASELESS);\n  }\n\n  bool multiline() const {\n    return PCRE_IS_SET(PCRE_MULTILINE);\n  }\n  RE_Options &set_multiline(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE);\n  }\n\n  bool dotall() const {\n    return PCRE_IS_SET(PCRE_DOTALL);\n  }\n  RE_Options &set_dotall(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_DOTALL);\n  }\n\n  bool extended() const {\n    return PCRE_IS_SET(PCRE_EXTENDED);\n  }\n  RE_Options &set_extended(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED);\n  }\n\n  bool dollar_endonly() const {\n    return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY);\n  }\n  RE_Options &set_dollar_endonly(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY);\n  }\n\n  bool extra() const {\n    return PCRE_IS_SET(PCRE_EXTRA);\n  }\n  RE_Options &set_extra(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_EXTRA);\n  }\n\n  bool ungreedy() const {\n    return PCRE_IS_SET(PCRE_UNGREEDY);\n  }\n  RE_Options &set_ungreedy(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY);\n  }\n\n  bool utf8() const {\n    return PCRE_IS_SET(PCRE_UTF8);\n  }\n  RE_Options &set_utf8(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_UTF8);\n  }\n\n  bool no_auto_capture() const {\n    return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE);\n  }\n  RE_Options &set_no_auto_capture(bool x) {\n    PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE);\n  }\n\n  RE_Options &set_all_options(int opt) {\n    all_options_ = opt;\n    return *this;\n  }\n  int all_options() const {\n    return all_options_ ;\n  }\n\n  // TODO: add other pcre flags\n\n private:\n  int match_limit_;\n  int match_limit_recursion_;\n  int all_options_;\n};\n\n// These functions return some common RE_Options\nstatic inline RE_Options UTF8() {\n  return RE_Options().set_utf8(true);\n}\n\nstatic inline RE_Options CASELESS() {\n  return RE_Options().set_caseless(true);\n}\nstatic inline RE_Options MULTILINE() {\n  return RE_Options().set_multiline(true);\n}\n\nstatic inline RE_Options DOTALL() {\n  return RE_Options().set_dotall(true);\n}\n\nstatic inline RE_Options EXTENDED() {\n  return RE_Options().set_extended(true);\n}\n\n// Interface for regular expression matching.  Also corresponds to a\n// pre-compiled regular expression.  An \"RE\" object is safe for\n// concurrent use by multiple threads.\nclass PCRECPP_EXP_DEFN RE {\n public:\n  // We provide implicit conversions from strings so that users can\n  // pass in a string or a \"const char*\" wherever an \"RE\" is expected.\n  RE(const string& pat) { Init(pat, NULL); }\n  RE(const string& pat, const RE_Options& option) { Init(pat, &option); }\n  RE(const char* pat) { Init(pat, NULL); }\n  RE(const char* pat, const RE_Options& option) { Init(pat, &option); }\n  RE(const unsigned char* pat) {\n    Init(reinterpret_cast<const char*>(pat), NULL);\n  }\n  RE(const unsigned char* pat, const RE_Options& option) {\n    Init(reinterpret_cast<const char*>(pat), &option);\n  }\n\n  // Copy constructor & assignment - note that these are expensive\n  // because they recompile the expression.\n  RE(const RE& re) { Init(re.pattern_, &re.options_); }\n  const RE& operator=(const RE& re) {\n    if (this != &re) {\n      Cleanup();\n\n      // This is the code that originally came from Google\n      // Init(re.pattern_.c_str(), &re.options_);\n\n      // This is the replacement from Ari Pollak\n      Init(re.pattern_, &re.options_);\n    }\n    return *this;\n  }\n\n\n  ~RE();\n\n  // The string specification for this RE.  E.g.\n  //   RE re(\"ab*c?d+\");\n  //   re.pattern();    // \"ab*c?d+\"\n  const string& pattern() const { return pattern_; }\n\n  // If RE could not be created properly, returns an error string.\n  // Else returns the empty string.\n  const string& error() const { return *error_; }\n\n  /***** The useful part: the matching interface *****/\n\n  // This is provided so one can do pattern.ReplaceAll() just as\n  // easily as ReplaceAll(pattern-text, ....)\n\n  bool FullMatch(const StringPiece& text,\n                 const Arg& ptr1 = no_arg,\n                 const Arg& ptr2 = no_arg,\n                 const Arg& ptr3 = no_arg,\n                 const Arg& ptr4 = no_arg,\n                 const Arg& ptr5 = no_arg,\n                 const Arg& ptr6 = no_arg,\n                 const Arg& ptr7 = no_arg,\n                 const Arg& ptr8 = no_arg,\n                 const Arg& ptr9 = no_arg,\n                 const Arg& ptr10 = no_arg,\n                 const Arg& ptr11 = no_arg,\n                 const Arg& ptr12 = no_arg,\n                 const Arg& ptr13 = no_arg,\n                 const Arg& ptr14 = no_arg,\n                 const Arg& ptr15 = no_arg,\n                 const Arg& ptr16 = no_arg) const;\n\n  bool PartialMatch(const StringPiece& text,\n                    const Arg& ptr1 = no_arg,\n                    const Arg& ptr2 = no_arg,\n                    const Arg& ptr3 = no_arg,\n                    const Arg& ptr4 = no_arg,\n                    const Arg& ptr5 = no_arg,\n                    const Arg& ptr6 = no_arg,\n                    const Arg& ptr7 = no_arg,\n                    const Arg& ptr8 = no_arg,\n                    const Arg& ptr9 = no_arg,\n                    const Arg& ptr10 = no_arg,\n                    const Arg& ptr11 = no_arg,\n                    const Arg& ptr12 = no_arg,\n                    const Arg& ptr13 = no_arg,\n                    const Arg& ptr14 = no_arg,\n                    const Arg& ptr15 = no_arg,\n                    const Arg& ptr16 = no_arg) const;\n\n  bool Consume(StringPiece* input,\n               const Arg& ptr1 = no_arg,\n               const Arg& ptr2 = no_arg,\n               const Arg& ptr3 = no_arg,\n               const Arg& ptr4 = no_arg,\n               const Arg& ptr5 = no_arg,\n               const Arg& ptr6 = no_arg,\n               const Arg& ptr7 = no_arg,\n               const Arg& ptr8 = no_arg,\n               const Arg& ptr9 = no_arg,\n               const Arg& ptr10 = no_arg,\n               const Arg& ptr11 = no_arg,\n               const Arg& ptr12 = no_arg,\n               const Arg& ptr13 = no_arg,\n               const Arg& ptr14 = no_arg,\n               const Arg& ptr15 = no_arg,\n               const Arg& ptr16 = no_arg) const;\n\n  bool FindAndConsume(StringPiece* input,\n                      const Arg& ptr1 = no_arg,\n                      const Arg& ptr2 = no_arg,\n                      const Arg& ptr3 = no_arg,\n                      const Arg& ptr4 = no_arg,\n                      const Arg& ptr5 = no_arg,\n                      const Arg& ptr6 = no_arg,\n                      const Arg& ptr7 = no_arg,\n                      const Arg& ptr8 = no_arg,\n                      const Arg& ptr9 = no_arg,\n                      const Arg& ptr10 = no_arg,\n                      const Arg& ptr11 = no_arg,\n                      const Arg& ptr12 = no_arg,\n                      const Arg& ptr13 = no_arg,\n                      const Arg& ptr14 = no_arg,\n                      const Arg& ptr15 = no_arg,\n                      const Arg& ptr16 = no_arg) const;\n\n  bool Replace(const StringPiece& rewrite,\n               string *str) const;\n\n  int GlobalReplace(const StringPiece& rewrite,\n                    string *str) const;\n\n  bool Extract(const StringPiece &rewrite,\n               const StringPiece &text,\n               string *out) const;\n\n  // Escapes all potentially meaningful regexp characters in\n  // 'unquoted'.  The returned string, used as a regular expression,\n  // will exactly match the original string.  For example,\n  //           1.5-2.0?\n  // may become:\n  //           1\\.5\\-2\\.0\\?\n  // Note QuoteMeta behaves the same as perl's QuoteMeta function,\n  // *except* that it escapes the NUL character (\\0) as backslash + 0,\n  // rather than backslash + NUL.\n  static string QuoteMeta(const StringPiece& unquoted);\n\n\n  /***** Generic matching interface *****/\n\n  // Type of match (TODO: Should be restructured as part of RE_Options)\n  enum Anchor {\n    UNANCHORED,         // No anchoring\n    ANCHOR_START,       // Anchor at start only\n    ANCHOR_BOTH         // Anchor at start and end\n  };\n\n  // General matching routine.  Stores the length of the match in\n  // \"*consumed\" if successful.\n  bool DoMatch(const StringPiece& text,\n               Anchor anchor,\n               int* consumed,\n               const Arg* const* args, int n) const;\n\n  // Return the number of capturing subpatterns, or -1 if the\n  // regexp wasn't valid on construction.\n  int NumberOfCapturingGroups() const;\n\n  // The default value for an argument, to indicate the end of the argument\n  // list. This must be used only in optional argument defaults. It should NOT\n  // be passed explicitly. Some people have tried to use it like this:\n  //\n  //   FullMatch(x, y, &z, no_arg, &w);\n  //\n  // This is a mistake, and will not work.\n  static Arg no_arg;\n\n private:\n\n  void Init(const string& pattern, const RE_Options* options);\n  void Cleanup();\n\n  // Match against \"text\", filling in \"vec\" (up to \"vecsize\" * 2/3) with\n  // pairs of integers for the beginning and end positions of matched\n  // text.  The first pair corresponds to the entire matched text;\n  // subsequent pairs correspond, in order, to parentheses-captured\n  // matches.  Returns the number of pairs (one more than the number of\n  // the last subpattern with a match) if matching was successful\n  // and zero if the match failed.\n  // I.e. for RE(\"(foo)|(bar)|(baz)\") it will return 2, 3, and 4 when matching\n  // against \"foo\", \"bar\", and \"baz\" respectively.\n  // When matching RE(\"(foo)|hello\") against \"hello\", it will return 1.\n  // But the values for all subpattern are filled in into \"vec\".\n  int TryMatch(const StringPiece& text,\n               int startpos,\n               Anchor anchor,\n               bool empty_ok,\n               int *vec,\n               int vecsize) const;\n\n  // Append the \"rewrite\" string, with backslash subsitutions from \"text\"\n  // and \"vec\", to string \"out\".\n  bool Rewrite(string *out,\n               const StringPiece& rewrite,\n               const StringPiece& text,\n               int *vec,\n               int veclen) const;\n\n  // internal implementation for DoMatch\n  bool DoMatchImpl(const StringPiece& text,\n                   Anchor anchor,\n                   int* consumed,\n                   const Arg* const args[],\n                   int n,\n                   int* vec,\n                   int vecsize) const;\n\n  // Compile the regexp for the specified anchoring mode\n  pcre* Compile(Anchor anchor);\n\n  string        pattern_;\n  RE_Options    options_;\n  pcre*         re_full_;       // For full matches\n  pcre*         re_partial_;    // For partial matches\n  const string* error_;         // Error indicator (or points to empty string)\n};\n\n}   // namespace pcrecpp\n\n#endif /* _PCRECPP_H */\n"
  },
  {
    "path": "src/pcre/pcrecpp_internal.h",
    "content": "/*************************************************\n*       Perl-Compatible Regular Expressions      *\n*************************************************/\n\n/*\nCopyright (c) 2005, Google Inc.\nAll rights reserved.\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n#ifndef PCRECPP_INTERNAL_H\n#define PCRECPP_INTERNAL_H\n\n/* When compiling a DLL for Windows, the exported symbols have to be declared\nusing some MS magic. I found some useful information on this web page:\nhttp://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the\ninformation there, using __declspec(dllexport) without \"extern\" we have a\ndefinition; with \"extern\" we have a declaration. The settings here override the\nsetting in pcre.h. We use:\n\n  PCRECPP_EXP_DECL       for declarations\n  PCRECPP_EXP_DEFN       for definitions of exported functions\n\n*/\n\n#ifndef PCRECPP_EXP_DECL\n#  ifdef _WIN32\n#    ifndef PCRE_STATIC\n#      define PCRECPP_EXP_DECL       extern __declspec(dllexport)\n#      define PCRECPP_EXP_DEFN       __declspec(dllexport)\n#    else\n#      define PCRECPP_EXP_DECL       extern\n#      define PCRECPP_EXP_DEFN\n#    endif\n#  else\n#    define PCRECPP_EXP_DECL         extern\n#    define PCRECPP_EXP_DEFN\n#  endif\n#endif\n\n#endif  /* PCRECPP_INTERNAL_H */\n\n/* End of pcrecpp_internal.h */\n"
  },
  {
    "path": "src/pcre/pcrecpp_unittest.cc",
    "content": "// -*- coding: utf-8 -*-\n//\n// Copyright (c) 2005 - 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n//\n// TODO: Test extractions for PartialMatch/Consume\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>      /* for memset and strcmp */\n#include <cassert>\n#include <vector>\n#include \"pcrecpp.h\"\n\nusing std::string;\nusing pcrecpp::StringPiece;\nusing pcrecpp::RE;\nusing pcrecpp::RE_Options;\nusing pcrecpp::Hex;\nusing pcrecpp::Octal;\nusing pcrecpp::CRadix;\n\nstatic bool VERBOSE_TEST  = false;\n\n// CHECK dies with a fatal error if condition is not true.  It is *not*\n// controlled by NDEBUG, so the check will be executed regardless of\n// compilation mode.  Therefore, it is safe to do things like:\n//    CHECK_EQ(fp->Write(x), 4)\n#define CHECK(condition) do {                           \\\n  if (!(condition)) {                                   \\\n    fprintf(stderr, \"%s:%d: Check failed: %s\\n\",        \\\n            __FILE__, __LINE__, #condition);            \\\n    exit(1);                                            \\\n  }                                                     \\\n} while (0)\n\n#define CHECK_EQ(a, b)   CHECK(a == b)\n\nstatic void Timing1(int num_iters) {\n  // Same pattern lots of times\n  RE pattern(\"ruby:\\\\d+\");\n  StringPiece p(\"ruby:1234\");\n  for (int j = num_iters; j > 0; j--) {\n    CHECK(pattern.FullMatch(p));\n  }\n}\n\nstatic void Timing2(int num_iters) {\n  // Same pattern lots of times\n  RE pattern(\"ruby:(\\\\d+)\");\n  int i;\n  for (int j = num_iters; j > 0; j--) {\n    CHECK(pattern.FullMatch(\"ruby:1234\", &i));\n    CHECK_EQ(i, 1234);\n  }\n}\n\nstatic void Timing3(int num_iters) {\n  string text_string;\n  for (int j = num_iters; j > 0; j--) {\n    text_string += \"this is another line\\n\";\n  }\n\n  RE line_matcher(\".*\\n\");\n  string line;\n  StringPiece text(text_string);\n  int counter = 0;\n  while (line_matcher.Consume(&text)) {\n    counter++;\n  }\n  printf(\"Matched %d lines\\n\", counter);\n}\n\n#if 0  // uncomment this if you have a way of defining VirtualProcessSize()\n\nstatic void LeakTest() {\n  // Check for memory leaks\n  unsigned long long initial_size = 0;\n  for (int i = 0; i < 100000; i++) {\n    if (i == 50000) {\n      initial_size = VirtualProcessSize();\n      printf(\"Size after 50000: %llu\\n\", initial_size);\n    }\n    char buf[100];  // definitely big enough\n    sprintf(buf, \"pat%09d\", i);\n    RE newre(buf);\n  }\n  uint64 final_size = VirtualProcessSize();\n  printf(\"Size after 100000: %llu\\n\", final_size);\n  const double growth = double(final_size - initial_size) / final_size;\n  printf(\"Growth: %0.2f%%\", growth * 100);\n  CHECK(growth < 0.02);       // Allow < 2% growth\n}\n\n#endif\n\nstatic void RadixTests() {\n  printf(\"Testing hex\\n\");\n\n#define CHECK_HEX(type, value) \\\n  do { \\\n    type v; \\\n    CHECK(RE(\"([0-9a-fA-F]+)[uUlL]*\").FullMatch(#value, Hex(&v))); \\\n    CHECK_EQ(v, 0x ## value); \\\n    CHECK(RE(\"([0-9a-fA-FxX]+)[uUlL]*\").FullMatch(\"0x\" #value, CRadix(&v))); \\\n    CHECK_EQ(v, 0x ## value); \\\n  } while(0)\n\n  CHECK_HEX(short,              2bad);\n  CHECK_HEX(unsigned short,     2badU);\n  CHECK_HEX(int,                dead);\n  CHECK_HEX(unsigned int,       deadU);\n  CHECK_HEX(long,               7eadbeefL);\n  CHECK_HEX(unsigned long,      deadbeefUL);\n#ifdef HAVE_LONG_LONG\n  CHECK_HEX(long long,          12345678deadbeefLL);\n#endif\n#ifdef HAVE_UNSIGNED_LONG_LONG\n  CHECK_HEX(unsigned long long, cafebabedeadbeefULL);\n#endif\n\n#undef CHECK_HEX\n\n  printf(\"Testing octal\\n\");\n\n#define CHECK_OCTAL(type, value) \\\n  do { \\\n    type v; \\\n    CHECK(RE(\"([0-7]+)[uUlL]*\").FullMatch(#value, Octal(&v))); \\\n    CHECK_EQ(v, 0 ## value); \\\n    CHECK(RE(\"([0-9a-fA-FxX]+)[uUlL]*\").FullMatch(\"0\" #value, CRadix(&v))); \\\n    CHECK_EQ(v, 0 ## value); \\\n  } while(0)\n\n  CHECK_OCTAL(short,              77777);\n  CHECK_OCTAL(unsigned short,     177777U);\n  CHECK_OCTAL(int,                17777777777);\n  CHECK_OCTAL(unsigned int,       37777777777U);\n  CHECK_OCTAL(long,               17777777777L);\n  CHECK_OCTAL(unsigned long,      37777777777UL);\n#ifdef HAVE_LONG_LONG\n  CHECK_OCTAL(long long,          777777777777777777777LL);\n#endif\n#ifdef HAVE_UNSIGNED_LONG_LONG\n  CHECK_OCTAL(unsigned long long, 1777777777777777777777ULL);\n#endif\n\n#undef CHECK_OCTAL\n\n  printf(\"Testing decimal\\n\");\n\n#define CHECK_DECIMAL(type, value) \\\n  do { \\\n    type v; \\\n    CHECK(RE(\"(-?[0-9]+)[uUlL]*\").FullMatch(#value, &v)); \\\n    CHECK_EQ(v, value); \\\n    CHECK(RE(\"(-?[0-9a-fA-FxX]+)[uUlL]*\").FullMatch(#value, CRadix(&v))); \\\n    CHECK_EQ(v, value); \\\n  } while(0)\n\n  CHECK_DECIMAL(short,              -1);\n  CHECK_DECIMAL(unsigned short,     9999);\n  CHECK_DECIMAL(int,                -1000);\n  CHECK_DECIMAL(unsigned int,       12345U);\n  CHECK_DECIMAL(long,               -10000000L);\n  CHECK_DECIMAL(unsigned long,      3083324652U);\n#ifdef HAVE_LONG_LONG\n  CHECK_DECIMAL(long long,          -100000000000000LL);\n#endif\n#ifdef HAVE_UNSIGNED_LONG_LONG\n  CHECK_DECIMAL(unsigned long long, 1234567890987654321ULL);\n#endif\n\n#undef CHECK_DECIMAL\n\n}\n\nstatic void TestReplace() {\n  printf(\"Testing Replace\\n\");\n\n  struct ReplaceTest {\n    const char *regexp;\n    const char *rewrite;\n    const char *original;\n    const char *single;\n    const char *global;\n    int global_count;         // the expected return value from ReplaceAll\n  };\n  static const ReplaceTest tests[] = {\n    { \"(qu|[b-df-hj-np-tv-z]*)([a-z]+)\",\n      \"\\\\2\\\\1ay\",\n      \"the quick brown fox jumps over the lazy dogs.\",\n      \"ethay quick brown fox jumps over the lazy dogs.\",\n      \"ethay ickquay ownbray oxfay umpsjay overay ethay azylay ogsday.\",\n      9 },\n    { \"\\\\w+\",\n      \"\\\\0-NOSPAM\",\n      \"paul.haahr@google.com\",\n      \"paul-NOSPAM.haahr@google.com\",\n      \"paul-NOSPAM.haahr-NOSPAM@google-NOSPAM.com-NOSPAM\",\n      4 },\n    { \"^\",\n      \"(START)\",\n      \"foo\",\n      \"(START)foo\",\n      \"(START)foo\",\n      1 },\n    { \"^\",\n      \"(START)\",\n      \"\",\n      \"(START)\",\n      \"(START)\",\n      1 },\n    { \"$\",\n      \"(END)\",\n      \"\",\n      \"(END)\",\n      \"(END)\",\n      1 },\n    { \"b\",\n      \"bb\",\n      \"ababababab\",\n      \"abbabababab\",\n      \"abbabbabbabbabb\",\n       5 },\n    { \"b\",\n      \"bb\",\n      \"bbbbbb\",\n      \"bbbbbbb\",\n      \"bbbbbbbbbbbb\",\n      6 },\n    { \"b+\",\n      \"bb\",\n      \"bbbbbb\",\n      \"bb\",\n      \"bb\",\n      1 },\n    { \"b*\",\n      \"bb\",\n      \"bbbbbb\",\n      \"bb\",\n      \"bbbb\",\n      2 },\n    { \"b*\",\n      \"bb\",\n      \"aaaaa\",\n      \"bbaaaaa\",\n      \"bbabbabbabbabbabb\",\n      6 },\n    { \"b*\",\n      \"bb\",\n      \"aa\\naa\\n\",\n      \"bbaa\\naa\\n\",\n      \"bbabbabb\\nbbabbabb\\nbb\",\n      7 },\n    { \"b*\",\n      \"bb\",\n      \"aa\\raa\\r\",\n      \"bbaa\\raa\\r\",\n      \"bbabbabb\\rbbabbabb\\rbb\",\n      7 },\n    { \"b*\",\n      \"bb\",\n      \"aa\\r\\naa\\r\\n\",\n      \"bbaa\\r\\naa\\r\\n\",\n      \"bbabbabb\\r\\nbbabbabb\\r\\nbb\",\n      7 },\n    // Check empty-string matching (it's tricky!)\n    { \"aa|b*\",\n      \"@\",\n      \"aa\",\n      \"@\",\n      \"@@\",\n      2 },\n    { \"b*|aa\",\n      \"@\",\n      \"aa\",\n      \"@aa\",\n      \"@@@\",\n      3 },\n#ifdef SUPPORT_UTF\n    { \"b*\",\n      \"bb\",\n      \"\\xE3\\x83\\x9B\\xE3\\x83\\xBC\\xE3\\x83\\xA0\\xE3\\x81\\xB8\",   // utf8\n      \"bb\\xE3\\x83\\x9B\\xE3\\x83\\xBC\\xE3\\x83\\xA0\\xE3\\x81\\xB8\",\n      \"bb\\xE3\\x83\\x9B\"\"bb\"\"\\xE3\\x83\\xBC\"\"bb\"\"\\xE3\\x83\\xA0\"\"bb\"\"\\xE3\\x81\\xB8\"\"bb\",\n      5 },\n    { \"b*\",\n      \"bb\",\n      \"\\xE3\\x83\\x9B\\r\\n\\xE3\\x83\\xBC\\r\\xE3\\x83\\xA0\\n\\xE3\\x81\\xB8\\r\\n\",   // utf8\n      \"bb\\xE3\\x83\\x9B\\r\\n\\xE3\\x83\\xBC\\r\\xE3\\x83\\xA0\\n\\xE3\\x81\\xB8\\r\\n\",\n      (\"bb\\xE3\\x83\\x9B\"\"bb\\r\\nbb\"\"\\xE3\\x83\\xBC\"\"bb\\rbb\"\"\\xE3\\x83\\xA0\"\n       \"bb\\nbb\"\"\\xE3\\x81\\xB8\"\"bb\\r\\nbb\"),\n      9 },\n#endif\n    { \"\", NULL, NULL, NULL, NULL, 0 }\n  };\n\n#ifdef SUPPORT_UTF\n  const bool support_utf8 = true;\n#else\n  const bool support_utf8 = false;\n#endif\n\n  for (const ReplaceTest *t = tests; t->original != NULL; ++t) {\n    RE re(t->regexp, RE_Options(PCRE_NEWLINE_CRLF).set_utf8(support_utf8));\n    assert(re.error().empty());\n    string one(t->original);\n    CHECK(re.Replace(t->rewrite, &one));\n    CHECK_EQ(one, t->single);\n    string all(t->original);\n    const int replace_count = re.GlobalReplace(t->rewrite, &all);\n    CHECK_EQ(all, t->global);\n    CHECK_EQ(replace_count, t->global_count);\n  }\n\n  // One final test: test \\r\\n replacement when we're not in CRLF mode\n  {\n    RE re(\"b*\", RE_Options(PCRE_NEWLINE_CR).set_utf8(support_utf8));\n    assert(re.error().empty());\n    string all(\"aa\\r\\naa\\r\\n\");\n    CHECK_EQ(re.GlobalReplace(\"bb\", &all), 9);\n    CHECK_EQ(all, string(\"bbabbabb\\rbb\\nbbabbabb\\rbb\\nbb\"));\n  }\n  {\n    RE re(\"b*\", RE_Options(PCRE_NEWLINE_LF).set_utf8(support_utf8));\n    assert(re.error().empty());\n    string all(\"aa\\r\\naa\\r\\n\");\n    CHECK_EQ(re.GlobalReplace(\"bb\", &all), 9);\n    CHECK_EQ(all, string(\"bbabbabb\\rbb\\nbbabbabb\\rbb\\nbb\"));\n  }\n  // TODO: test what happens when no PCRE_NEWLINE_* flag is set.\n  //       Alas, the answer depends on how pcre was compiled.\n}\n\nstatic void TestExtract() {\n  printf(\"Testing Extract\\n\");\n\n  string s;\n\n  CHECK(RE(\"(.*)@([^.]*)\").Extract(\"\\\\2!\\\\1\", \"boris@kremvax.ru\", &s));\n  CHECK_EQ(s, \"kremvax!boris\");\n\n  // check the RE interface as well\n  CHECK(RE(\".*\").Extract(\"'\\\\0'\", \"foo\", &s));\n  CHECK_EQ(s, \"'foo'\");\n  CHECK(!RE(\"bar\").Extract(\"'\\\\0'\", \"baz\", &s));\n  CHECK_EQ(s, \"'foo'\");\n}\n\nstatic void TestConsume() {\n  printf(\"Testing Consume\\n\");\n\n  string word;\n\n  string s(\"   aaa b!@#$@#$cccc\");\n  StringPiece input(s);\n\n  RE r(\"\\\\s*(\\\\w+)\");    // matches a word, possibly proceeded by whitespace\n  CHECK(r.Consume(&input, &word));\n  CHECK_EQ(word, \"aaa\");\n  CHECK(r.Consume(&input, &word));\n  CHECK_EQ(word, \"b\");\n  CHECK(! r.Consume(&input, &word));\n}\n\nstatic void TestFindAndConsume() {\n  printf(\"Testing FindAndConsume\\n\");\n\n  string word;\n\n  string s(\"   aaa b!@#$@#$cccc\");\n  StringPiece input(s);\n\n  RE r(\"(\\\\w+)\");      // matches a word\n  CHECK(r.FindAndConsume(&input, &word));\n  CHECK_EQ(word, \"aaa\");\n  CHECK(r.FindAndConsume(&input, &word));\n  CHECK_EQ(word, \"b\");\n  CHECK(r.FindAndConsume(&input, &word));\n  CHECK_EQ(word, \"cccc\");\n  CHECK(! r.FindAndConsume(&input, &word));\n}\n\nstatic void TestMatchNumberPeculiarity() {\n  printf(\"Testing match-number peculiarity\\n\");\n\n  string word1;\n  string word2;\n  string word3;\n\n  RE r(\"(foo)|(bar)|(baz)\");\n  CHECK(r.PartialMatch(\"foo\", &word1, &word2, &word3));\n  CHECK_EQ(word1, \"foo\");\n  CHECK_EQ(word2, \"\");\n  CHECK_EQ(word3, \"\");\n  CHECK(r.PartialMatch(\"bar\", &word1, &word2, &word3));\n  CHECK_EQ(word1, \"\");\n  CHECK_EQ(word2, \"bar\");\n  CHECK_EQ(word3, \"\");\n  CHECK(r.PartialMatch(\"baz\", &word1, &word2, &word3));\n  CHECK_EQ(word1, \"\");\n  CHECK_EQ(word2, \"\");\n  CHECK_EQ(word3, \"baz\");\n  CHECK(!r.PartialMatch(\"f\", &word1, &word2, &word3));\n\n  string a;\n  CHECK(RE(\"(foo)|hello\").FullMatch(\"hello\", &a));\n  CHECK_EQ(a, \"\");\n}\n\nstatic void TestRecursion() {\n  printf(\"Testing recursion\\n\");\n\n  // Get one string that passes (sometimes), one that never does.\n  string text_good(\"abcdefghijk\");\n  string text_bad(\"acdefghijkl\");\n\n  // According to pcretest, matching text_good against (\\w+)*b\n  // requires match_limit of at least 8192, and match_recursion_limit\n  // of at least 37.\n\n  RE_Options options_ml;\n  options_ml.set_match_limit(8192);\n  RE re(\"(\\\\w+)*b\", options_ml);\n  CHECK(re.PartialMatch(text_good) == true);\n  CHECK(re.PartialMatch(text_bad) == false);\n  CHECK(re.FullMatch(text_good) == false);\n  CHECK(re.FullMatch(text_bad) == false);\n\n  options_ml.set_match_limit(1024);\n  RE re2(\"(\\\\w+)*b\", options_ml);\n  CHECK(re2.PartialMatch(text_good) == false);   // because of match_limit\n  CHECK(re2.PartialMatch(text_bad) == false);\n  CHECK(re2.FullMatch(text_good) == false);\n  CHECK(re2.FullMatch(text_bad) == false);\n\n  RE_Options options_mlr;\n  options_mlr.set_match_limit_recursion(50);\n  RE re3(\"(\\\\w+)*b\", options_mlr);\n  CHECK(re3.PartialMatch(text_good) == true);\n  CHECK(re3.PartialMatch(text_bad) == false);\n  CHECK(re3.FullMatch(text_good) == false);\n  CHECK(re3.FullMatch(text_bad) == false);\n\n  options_mlr.set_match_limit_recursion(10);\n  RE re4(\"(\\\\w+)*b\", options_mlr);\n  CHECK(re4.PartialMatch(text_good) == false);\n  CHECK(re4.PartialMatch(text_bad) == false);\n  CHECK(re4.FullMatch(text_good) == false);\n  CHECK(re4.FullMatch(text_bad) == false);\n}\n\n// A meta-quoted string, interpreted as a pattern, should always match\n// the original unquoted string.\nstatic void TestQuoteMeta(string unquoted, RE_Options options = RE_Options()) {\n  string quoted = RE::QuoteMeta(unquoted);\n  RE re(quoted, options);\n  CHECK(re.FullMatch(unquoted));\n}\n\n// A string containing meaningful regexp characters, which is then meta-\n// quoted, should not generally match a string the unquoted string does.\nstatic void NegativeTestQuoteMeta(string unquoted, string should_not_match,\n                                  RE_Options options = RE_Options()) {\n  string quoted = RE::QuoteMeta(unquoted);\n  RE re(quoted, options);\n  CHECK(!re.FullMatch(should_not_match));\n}\n\n// Tests that quoted meta characters match their original strings,\n// and that a few things that shouldn't match indeed do not.\nstatic void TestQuotaMetaSimple() {\n  TestQuoteMeta(\"foo\");\n  TestQuoteMeta(\"foo.bar\");\n  TestQuoteMeta(\"foo\\\\.bar\");\n  TestQuoteMeta(\"[1-9]\");\n  TestQuoteMeta(\"1.5-2.0?\");\n  TestQuoteMeta(\"\\\\d\");\n  TestQuoteMeta(\"Who doesn't like ice cream?\");\n  TestQuoteMeta(\"((a|b)c?d*e+[f-h]i)\");\n  TestQuoteMeta(\"((?!)xxx).*yyy\");\n  TestQuoteMeta(\"([\");\n  TestQuoteMeta(string(\"foo\\0bar\", 7));\n}\n\nstatic void TestQuoteMetaSimpleNegative() {\n  NegativeTestQuoteMeta(\"foo\", \"bar\");\n  NegativeTestQuoteMeta(\"...\", \"bar\");\n  NegativeTestQuoteMeta(\"\\\\.\", \".\");\n  NegativeTestQuoteMeta(\"\\\\.\", \"..\");\n  NegativeTestQuoteMeta(\"(a)\", \"a\");\n  NegativeTestQuoteMeta(\"(a|b)\", \"a\");\n  NegativeTestQuoteMeta(\"(a|b)\", \"(a)\");\n  NegativeTestQuoteMeta(\"(a|b)\", \"a|b\");\n  NegativeTestQuoteMeta(\"[0-9]\", \"0\");\n  NegativeTestQuoteMeta(\"[0-9]\", \"0-9\");\n  NegativeTestQuoteMeta(\"[0-9]\", \"[9]\");\n  NegativeTestQuoteMeta(\"((?!)xxx)\", \"xxx\");\n}\n\nstatic void TestQuoteMetaLatin1() {\n  TestQuoteMeta(\"3\\xb2 = 9\");\n}\n\nstatic void TestQuoteMetaUtf8() {\n#ifdef SUPPORT_UTF\n  TestQuoteMeta(\"Pl\\xc3\\xa1\\x63ido Domingo\", pcrecpp::UTF8());\n  TestQuoteMeta(\"xyz\", pcrecpp::UTF8());            // No fancy utf8\n  TestQuoteMeta(\"\\xc2\\xb0\", pcrecpp::UTF8());       // 2-byte utf8 (degree symbol)\n  TestQuoteMeta(\"27\\xc2\\xb0 degrees\", pcrecpp::UTF8());  // As a middle character\n  TestQuoteMeta(\"\\xe2\\x80\\xb3\", pcrecpp::UTF8());   // 3-byte utf8 (double prime)\n  TestQuoteMeta(\"\\xf0\\x9d\\x85\\x9f\", pcrecpp::UTF8()); // 4-byte utf8 (music note)\n  TestQuoteMeta(\"27\\xc2\\xb0\"); // Interpreted as Latin-1, but should still work\n  NegativeTestQuoteMeta(\"27\\xc2\\xb0\",               // 2-byte utf (degree symbol)\n                        \"27\\\\\\xc2\\\\\\xb0\",\n                        pcrecpp::UTF8());\n#endif\n}\n\nstatic void TestQuoteMetaAll() {\n  printf(\"Testing QuoteMeta\\n\");\n  TestQuotaMetaSimple();\n  TestQuoteMetaSimpleNegative();\n  TestQuoteMetaLatin1();\n  TestQuoteMetaUtf8();\n}\n\n//\n// Options tests contributed by\n// Giuseppe Maxia, CTO, Stardata s.r.l.\n// July 2005\n//\nstatic void GetOneOptionResult(\n                const char *option_name,\n                const char *regex,\n                const char *str,\n                RE_Options options,\n                bool full,\n                string expected) {\n\n  printf(\"Testing Option <%s>\\n\", option_name);\n  if(VERBOSE_TEST)\n    printf(\"/%s/ finds \\\"%s\\\" within \\\"%s\\\" \\n\",\n                    regex,\n                    expected.c_str(),\n                    str);\n  string captured(\"\");\n  if (full)\n    RE(regex,options).FullMatch(str, &captured);\n  else\n    RE(regex,options).PartialMatch(str, &captured);\n  CHECK_EQ(captured, expected);\n}\n\nstatic void TestOneOption(\n                const char *option_name,\n                const char *regex,\n                const char *str,\n                RE_Options options,\n                bool full,\n                bool assertive = true) {\n\n  printf(\"Testing Option <%s>\\n\", option_name);\n  if (VERBOSE_TEST)\n    printf(\"'%s' %s /%s/ \\n\",\n                  str,\n                  (assertive? \"matches\" : \"doesn't match\"),\n                  regex);\n  if (assertive) {\n    if (full)\n      CHECK(RE(regex,options).FullMatch(str));\n    else\n      CHECK(RE(regex,options).PartialMatch(str));\n  } else {\n    if (full)\n      CHECK(!RE(regex,options).FullMatch(str));\n    else\n      CHECK(!RE(regex,options).PartialMatch(str));\n  }\n}\n\nstatic void Test_CASELESS() {\n  RE_Options options;\n  RE_Options options2;\n\n  options.set_caseless(true);\n  TestOneOption(\"CASELESS (class)\",  \"HELLO\",    \"hello\", options, false);\n  TestOneOption(\"CASELESS (class2)\", \"HELLO\",    \"hello\", options2.set_caseless(true), false);\n  TestOneOption(\"CASELESS (class)\",  \"^[A-Z]+$\", \"Hello\", options, false);\n\n  TestOneOption(\"CASELESS (function)\", \"HELLO\",    \"hello\", pcrecpp::CASELESS(), false);\n  TestOneOption(\"CASELESS (function)\", \"^[A-Z]+$\", \"Hello\", pcrecpp::CASELESS(), false);\n  options.set_caseless(false);\n  TestOneOption(\"no CASELESS\", \"HELLO\",    \"hello\", options, false, false);\n}\n\nstatic void Test_MULTILINE() {\n  RE_Options options;\n  RE_Options options2;\n  const char *str = \"HELLO\\n\" \"cruel\\n\" \"world\\n\";\n\n  options.set_multiline(true);\n  TestOneOption(\"MULTILINE (class)\",    \"^cruel$\", str, options, false);\n  TestOneOption(\"MULTILINE (class2)\",   \"^cruel$\", str, options2.set_multiline(true), false);\n  TestOneOption(\"MULTILINE (function)\", \"^cruel$\", str, pcrecpp::MULTILINE(), false);\n  options.set_multiline(false);\n  TestOneOption(\"no MULTILINE\", \"^cruel$\", str, options, false, false);\n}\n\nstatic void Test_DOTALL() {\n  RE_Options options;\n  RE_Options options2;\n  const char *str = \"HELLO\\n\" \"cruel\\n\" \"world\";\n\n  options.set_dotall(true);\n  TestOneOption(\"DOTALL (class)\",    \"HELLO.*world\", str, options, true);\n  TestOneOption(\"DOTALL (class2)\",   \"HELLO.*world\", str, options2.set_dotall(true), true);\n  TestOneOption(\"DOTALL (function)\",    \"HELLO.*world\", str, pcrecpp::DOTALL(), true);\n  options.set_dotall(false);\n  TestOneOption(\"no DOTALL\", \"HELLO.*world\", str, options, true, false);\n}\n\nstatic void Test_DOLLAR_ENDONLY() {\n  RE_Options options;\n  RE_Options options2;\n  const char *str = \"HELLO world\\n\";\n\n  TestOneOption(\"no DOLLAR_ENDONLY\", \"world$\", str, options, false);\n  options.set_dollar_endonly(true);\n  TestOneOption(\"DOLLAR_ENDONLY 1\",    \"world$\", str, options, false, false);\n  TestOneOption(\"DOLLAR_ENDONLY 2\",    \"world$\", str, options2.set_dollar_endonly(true), false, false);\n}\n\nstatic void Test_EXTRA() {\n  RE_Options options;\n  const char *str = \"HELLO\";\n\n  options.set_extra(true);\n  TestOneOption(\"EXTRA 1\", \"\\\\HELL\\\\O\", str, options, true, false );\n  TestOneOption(\"EXTRA 2\", \"\\\\HELL\\\\O\", str, RE_Options().set_extra(true), true, false );\n  options.set_extra(false);\n  TestOneOption(\"no EXTRA\", \"\\\\HELL\\\\O\", str, options, true );\n}\n\nstatic void Test_EXTENDED() {\n  RE_Options options;\n  RE_Options options2;\n  const char *str = \"HELLO world\";\n\n  options.set_extended(true);\n  TestOneOption(\"EXTENDED (class)\",    \"HELLO world\", str, options, false, false);\n  TestOneOption(\"EXTENDED (class2)\",   \"HELLO world\", str, options2.set_extended(true), false, false);\n  TestOneOption(\"EXTENDED (class)\",\n                    \"^ HE L{2} O \"\n                    \"\\\\s+        \"\n                    \"\\\\w+ $      \",\n                    str,\n                    options,\n                    false);\n\n  TestOneOption(\"EXTENDED (function)\",    \"HELLO world\", str, pcrecpp::EXTENDED(), false, false);\n  TestOneOption(\"EXTENDED (function)\",\n                    \"^ HE L{2} O \"\n                    \"\\\\s+        \"\n                    \"\\\\w+ $      \",\n                    str,\n                    pcrecpp::EXTENDED(),\n                    false);\n\n  options.set_extended(false);\n  TestOneOption(\"no EXTENDED\", \"HELLO world\", str, options, false);\n}\n\nstatic void Test_NO_AUTO_CAPTURE() {\n  RE_Options options;\n  const char *str = \"HELLO world\";\n  string captured;\n\n  printf(\"Testing Option <no NO_AUTO_CAPTURE>\\n\");\n  if (VERBOSE_TEST)\n    printf(\"parentheses capture text\\n\");\n  RE re(\"(world|universe)$\", options);\n  CHECK(re.Extract(\"\\\\1\", str , &captured));\n  CHECK_EQ(captured, \"world\");\n  options.set_no_auto_capture(true);\n  printf(\"testing Option <NO_AUTO_CAPTURE>\\n\");\n  if (VERBOSE_TEST)\n    printf(\"parentheses do not capture text\\n\");\n  re.Extract(\"\\\\1\",str, &captured );\n  CHECK_EQ(captured, \"world\");\n}\n\nstatic void Test_UNGREEDY() {\n  RE_Options options;\n  const char *str = \"HELLO, 'this' is the 'world'\";\n\n  options.set_ungreedy(true);\n  GetOneOptionResult(\"UNGREEDY 1\", \"('.*')\", str, options, false, \"'this'\" );\n  GetOneOptionResult(\"UNGREEDY 2\", \"('.*')\", str, RE_Options().set_ungreedy(true), false, \"'this'\" );\n  GetOneOptionResult(\"UNGREEDY\", \"('.*?')\", str, options, false, \"'this' is the 'world'\" );\n\n  options.set_ungreedy(false);\n  GetOneOptionResult(\"no UNGREEDY\", \"('.*')\", str, options, false, \"'this' is the 'world'\" );\n  GetOneOptionResult(\"no UNGREEDY\", \"('.*?')\", str, options, false, \"'this'\" );\n}\n\nstatic void Test_all_options() {\n  const char *str = \"HELLO\\n\" \"cruel\\n\" \"world\";\n  RE_Options options;\n  options.set_all_options(PCRE_CASELESS | PCRE_DOTALL);\n\n  TestOneOption(\"all_options (CASELESS|DOTALL)\", \"^hello.*WORLD\", str , options, false);\n  options.set_all_options(0);\n  TestOneOption(\"all_options (0)\", \"^hello.*WORLD\", str , options, false, false);\n  options.set_all_options(PCRE_MULTILINE | PCRE_EXTENDED);\n\n  TestOneOption(\"all_options (MULTILINE|EXTENDED)\", \" ^ c r u e l $ \", str, options, false);\n  TestOneOption(\"all_options (MULTILINE|EXTENDED) with constructor\",\n                  \" ^ c r u e l $ \",\n                  str,\n                  RE_Options(PCRE_MULTILINE | PCRE_EXTENDED),\n                  false);\n\n  TestOneOption(\"all_options (MULTILINE|EXTENDED) with concatenation\",\n                  \" ^ c r u e l $ \",\n                  str,\n                  RE_Options()\n                       .set_multiline(true)\n                       .set_extended(true),\n                  false);\n\n  options.set_all_options(0);\n  TestOneOption(\"all_options (0)\", \"^ c r u e l $\", str, options, false, false);\n\n}\n\nstatic void TestOptions() {\n  printf(\"Testing Options\\n\");\n  Test_CASELESS();\n  Test_MULTILINE();\n  Test_DOTALL();\n  Test_DOLLAR_ENDONLY();\n  Test_EXTENDED();\n  Test_NO_AUTO_CAPTURE();\n  Test_UNGREEDY();\n  Test_EXTRA();\n  Test_all_options();\n}\n\nstatic void TestConstructors() {\n  printf(\"Testing constructors\\n\");\n\n  RE_Options options;\n  options.set_dotall(true);\n  const char *str = \"HELLO\\n\" \"cruel\\n\" \"world\";\n\n  RE orig(\"HELLO.*world\", options);\n  CHECK(orig.FullMatch(str));\n\n  RE copy1(orig);\n  CHECK(copy1.FullMatch(str));\n\n  RE copy2(\"not a match\");\n  CHECK(!copy2.FullMatch(str));\n  copy2 = copy1;\n  CHECK(copy2.FullMatch(str));\n  copy2 = orig;\n  CHECK(copy2.FullMatch(str));\n\n  // Make sure when we assign to ourselves, nothing bad happens\n  orig = orig;\n  copy1 = copy1;\n  copy2 = copy2;\n  CHECK(orig.FullMatch(str));\n  CHECK(copy1.FullMatch(str));\n  CHECK(copy2.FullMatch(str));\n}\n\nint main(int argc, char** argv) {\n  // Treat any flag as --help\n  if (argc > 1 && argv[1][0] == '-') {\n    printf(\"Usage: %s [timing1|timing2|timing3 num-iters]\\n\"\n           \"       If 'timingX ###' is specified, run the given timing test\\n\"\n           \"       with the given number of iterations, rather than running\\n\"\n           \"       the default corectness test.\\n\", argv[0]);\n    return 0;\n  }\n\n  if (argc > 1) {\n    if ( argc == 2 || atoi(argv[2]) == 0) {\n      printf(\"timing mode needs a num-iters argument\\n\");\n      return 1;\n    }\n    if (!strcmp(argv[1], \"timing1\"))\n      Timing1(atoi(argv[2]));\n    else if (!strcmp(argv[1], \"timing2\"))\n      Timing2(atoi(argv[2]));\n    else if (!strcmp(argv[1], \"timing3\"))\n      Timing3(atoi(argv[2]));\n    else\n      printf(\"Unknown argument '%s'\\n\", argv[1]);\n    return 0;\n  }\n\n  printf(\"PCRE C++ wrapper tests\\n\");\n  printf(\"Testing FullMatch\\n\");\n\n  int i;\n  string s;\n\n  /***** FullMatch with no args *****/\n\n  CHECK(RE(\"h.*o\").FullMatch(\"hello\"));\n  CHECK(!RE(\"h.*o\").FullMatch(\"othello\"));     // Must be anchored at front\n  CHECK(!RE(\"h.*o\").FullMatch(\"hello!\"));      // Must be anchored at end\n  CHECK(RE(\"a*\").FullMatch(\"aaaa\"));           // Fullmatch with normal op\n  CHECK(RE(\"a*?\").FullMatch(\"aaaa\"));          // Fullmatch with nongreedy op\n  CHECK(RE(\"a*?\\\\z\").FullMatch(\"aaaa\"));       // Two unusual ops\n\n  /***** FullMatch with args *****/\n\n  // Zero-arg\n  CHECK(RE(\"\\\\d+\").FullMatch(\"1001\"));\n\n  // Single-arg\n  CHECK(RE(\"(\\\\d+)\").FullMatch(\"1001\",   &i));\n  CHECK_EQ(i, 1001);\n  CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-123\", &i));\n  CHECK_EQ(i, -123);\n  CHECK(!RE(\"()\\\\d+\").FullMatch(\"10\", &i));\n  CHECK(!RE(\"(\\\\d+)\").FullMatch(\"1234567890123456789012345678901234567890\",\n                                &i));\n\n  // Digits surrounding integer-arg\n  CHECK(RE(\"1(\\\\d*)4\").FullMatch(\"1234\", &i));\n  CHECK_EQ(i, 23);\n  CHECK(RE(\"(\\\\d)\\\\d+\").FullMatch(\"1234\", &i));\n  CHECK_EQ(i, 1);\n  CHECK(RE(\"(-\\\\d)\\\\d+\").FullMatch(\"-1234\", &i));\n  CHECK_EQ(i, -1);\n  CHECK(RE(\"(\\\\d)\").PartialMatch(\"1234\", &i));\n  CHECK_EQ(i, 1);\n  CHECK(RE(\"(-\\\\d)\").PartialMatch(\"-1234\", &i));\n  CHECK_EQ(i, -1);\n\n  // String-arg\n  CHECK(RE(\"h(.*)o\").FullMatch(\"hello\", &s));\n  CHECK_EQ(s, string(\"ell\"));\n\n  // StringPiece-arg\n  StringPiece sp;\n  CHECK(RE(\"(\\\\w+):(\\\\d+)\").FullMatch(\"ruby:1234\", &sp, &i));\n  CHECK_EQ(sp.size(), 4);\n  CHECK(memcmp(sp.data(), \"ruby\", 4) == 0);\n  CHECK_EQ(i, 1234);\n\n  // Multi-arg\n  CHECK(RE(\"(\\\\w+):(\\\\d+)\").FullMatch(\"ruby:1234\", &s, &i));\n  CHECK_EQ(s, string(\"ruby\"));\n  CHECK_EQ(i, 1234);\n\n  // Ignore non-void* NULL arg\n  CHECK(RE(\"he(.*)lo\").FullMatch(\"hello\", (char*)NULL));\n  CHECK(RE(\"h(.*)o\").FullMatch(\"hello\", (string*)NULL));\n  CHECK(RE(\"h(.*)o\").FullMatch(\"hello\", (StringPiece*)NULL));\n  CHECK(RE(\"(.*)\").FullMatch(\"1234\", (int*)NULL));\n#ifdef HAVE_LONG_LONG\n  CHECK(RE(\"(.*)\").FullMatch(\"1234567890123456\", (long long*)NULL));\n#endif\n  CHECK(RE(\"(.*)\").FullMatch(\"123.4567890123456\", (double*)NULL));\n  CHECK(RE(\"(.*)\").FullMatch(\"123.4567890123456\", (float*)NULL));\n\n  // Fail on non-void* NULL arg if the match doesn't parse for the given type.\n  CHECK(!RE(\"h(.*)lo\").FullMatch(\"hello\", &s, (char*)NULL));\n  CHECK(!RE(\"(.*)\").FullMatch(\"hello\", (int*)NULL));\n  CHECK(!RE(\"(.*)\").FullMatch(\"1234567890123456\", (int*)NULL));\n  CHECK(!RE(\"(.*)\").FullMatch(\"hello\", (double*)NULL));\n  CHECK(!RE(\"(.*)\").FullMatch(\"hello\", (float*)NULL));\n\n  // Ignored arg\n  CHECK(RE(\"(\\\\w+)(:)(\\\\d+)\").FullMatch(\"ruby:1234\", &s, (void*)NULL, &i));\n  CHECK_EQ(s, string(\"ruby\"));\n  CHECK_EQ(i, 1234);\n\n  // Type tests\n  {\n    char c;\n    CHECK(RE(\"(H)ello\").FullMatch(\"Hello\", &c));\n    CHECK_EQ(c, 'H');\n  }\n  {\n    unsigned char c;\n    CHECK(RE(\"(H)ello\").FullMatch(\"Hello\", &c));\n    CHECK_EQ(c, static_cast<unsigned char>('H'));\n  }\n  {\n    short v;\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"100\",     &v));    CHECK_EQ(v, 100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-100\",    &v));    CHECK_EQ(v, -100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"32767\",   &v));    CHECK_EQ(v, 32767);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-32768\",  &v));    CHECK_EQ(v, -32768);\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(\"-32769\", &v));\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(\"32768\",  &v));\n  }\n  {\n    unsigned short v;\n    CHECK(RE(\"(\\\\d+)\").FullMatch(\"100\",     &v));    CHECK_EQ(v, 100);\n    CHECK(RE(\"(\\\\d+)\").FullMatch(\"32767\",   &v));    CHECK_EQ(v, 32767);\n    CHECK(RE(\"(\\\\d+)\").FullMatch(\"65535\",   &v));    CHECK_EQ(v, 65535);\n    CHECK(!RE(\"(\\\\d+)\").FullMatch(\"65536\",  &v));\n  }\n  {\n    int v;\n    static const int max_value = 0x7fffffff;\n    static const int min_value = -max_value - 1;\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"100\",         &v)); CHECK_EQ(v, 100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-100\",        &v)); CHECK_EQ(v, -100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"2147483647\",  &v)); CHECK_EQ(v, max_value);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-2147483648\", &v)); CHECK_EQ(v, min_value);\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(\"-2147483649\", &v));\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(\"2147483648\",  &v));\n  }\n  {\n    unsigned int v;\n    static const unsigned int max_value = 0xfffffffful;\n    CHECK(RE(\"(\\\\d+)\").FullMatch(\"100\",         &v)); CHECK_EQ(v, 100);\n    CHECK(RE(\"(\\\\d+)\").FullMatch(\"4294967295\",  &v)); CHECK_EQ(v, max_value);\n    CHECK(!RE(\"(\\\\d+)\").FullMatch(\"4294967296\", &v));\n  }\n#ifdef HAVE_LONG_LONG\n# if defined(__MINGW__) || defined(__MINGW32__)\n#   define LLD \"%I64d\"\n#   define LLU \"%I64u\"\n# else\n#   define LLD \"%lld\"\n#   define LLU \"%llu\"\n# endif\n  {\n    long long v;\n    static const long long max_value = 0x7fffffffffffffffLL;\n    static const long long min_value = -max_value - 1;\n    char buf[32];  // definitely big enough for a long long\n\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"100\", &v)); CHECK_EQ(v, 100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-100\",&v)); CHECK_EQ(v, -100);\n\n    sprintf(buf, LLD, max_value);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(buf,&v)); CHECK_EQ(v, max_value);\n\n    sprintf(buf, LLD, min_value);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(buf,&v)); CHECK_EQ(v, min_value);\n\n    sprintf(buf, LLD, max_value);\n    assert(buf[strlen(buf)-1] != '9');\n    buf[strlen(buf)-1]++;\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(buf, &v));\n\n    sprintf(buf, LLD, min_value);\n    assert(buf[strlen(buf)-1] != '9');\n    buf[strlen(buf)-1]++;\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(buf, &v));\n  }\n#endif\n#if defined HAVE_UNSIGNED_LONG_LONG && defined HAVE_LONG_LONG\n  {\n    unsigned long long v;\n    long long v2;\n    static const unsigned long long max_value = 0xffffffffffffffffULL;\n    char buf[32];  // definitely big enough for a unsigned long long\n\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"100\",&v)); CHECK_EQ(v, 100);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(\"-100\",&v2)); CHECK_EQ(v2, -100);\n\n    sprintf(buf, LLU, max_value);\n    CHECK(RE(\"(-?\\\\d+)\").FullMatch(buf,&v)); CHECK_EQ(v, max_value);\n\n    assert(buf[strlen(buf)-1] != '9');\n    buf[strlen(buf)-1]++;\n    CHECK(!RE(\"(-?\\\\d+)\").FullMatch(buf, &v));\n  }\n#endif\n  {\n    float v;\n    CHECK(RE(\"(.*)\").FullMatch(\"100\", &v));\n    CHECK(RE(\"(.*)\").FullMatch(\"-100.\", &v));\n    CHECK(RE(\"(.*)\").FullMatch(\"1e23\", &v));\n  }\n  {\n    double v;\n    CHECK(RE(\"(.*)\").FullMatch(\"100\", &v));\n    CHECK(RE(\"(.*)\").FullMatch(\"-100.\", &v));\n    CHECK(RE(\"(.*)\").FullMatch(\"1e23\", &v));\n  }\n\n  // Check that matching is fully anchored\n  CHECK(!RE(\"(\\\\d+)\").FullMatch(\"x1001\",  &i));\n  CHECK(!RE(\"(\\\\d+)\").FullMatch(\"1001x\",  &i));\n  CHECK(RE(\"x(\\\\d+)\").FullMatch(\"x1001\", &i)); CHECK_EQ(i, 1001);\n  CHECK(RE(\"(\\\\d+)x\").FullMatch(\"1001x\", &i)); CHECK_EQ(i, 1001);\n\n  // Braces\n  CHECK(RE(\"[0-9a-f+.-]{5,}\").FullMatch(\"0abcd\"));\n  CHECK(RE(\"[0-9a-f+.-]{5,}\").FullMatch(\"0abcde\"));\n  CHECK(!RE(\"[0-9a-f+.-]{5,}\").FullMatch(\"0abc\"));\n\n  // Complicated RE\n  CHECK(RE(\"foo|bar|[A-Z]\").FullMatch(\"foo\"));\n  CHECK(RE(\"foo|bar|[A-Z]\").FullMatch(\"bar\"));\n  CHECK(RE(\"foo|bar|[A-Z]\").FullMatch(\"X\"));\n  CHECK(!RE(\"foo|bar|[A-Z]\").FullMatch(\"XY\"));\n\n  // Check full-match handling (needs '$' tacked on internally)\n  CHECK(RE(\"fo|foo\").FullMatch(\"fo\"));\n  CHECK(RE(\"fo|foo\").FullMatch(\"foo\"));\n  CHECK(RE(\"fo|foo$\").FullMatch(\"fo\"));\n  CHECK(RE(\"fo|foo$\").FullMatch(\"foo\"));\n  CHECK(RE(\"foo$\").FullMatch(\"foo\"));\n  CHECK(!RE(\"foo\\\\$\").FullMatch(\"foo$bar\"));\n  CHECK(!RE(\"fo|bar\").FullMatch(\"fox\"));\n\n  // Uncomment the following if we change the handling of '$' to\n  // prevent it from matching a trailing newline\n  if (false) {\n    // Check that we don't get bitten by pcre's special handling of a\n    // '\\n' at the end of the string matching '$'\n    CHECK(!RE(\"foo$\").PartialMatch(\"foo\\n\"));\n  }\n\n  // Number of args\n  int a[16];\n  CHECK(RE(\"\").FullMatch(\"\"));\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d){1}\").FullMatch(\"1\",\n                                 &a[0]));\n  CHECK_EQ(a[0], 1);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)\").FullMatch(\"12\",\n                                   &a[0],  &a[1]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\"123\",\n                                        &a[0],  &a[1],  &a[2]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\"1234\",\n                                             &a[0],  &a[1],  &a[2],  &a[3]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n  CHECK_EQ(a[3], 4);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\"12345\",\n                                                  &a[0],  &a[1],  &a[2],\n                                                  &a[3],  &a[4]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n  CHECK_EQ(a[3], 4);\n  CHECK_EQ(a[4], 5);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\"123456\",\n                                                       &a[0],  &a[1],  &a[2],\n                                                       &a[3],  &a[4],  &a[5]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n  CHECK_EQ(a[3], 4);\n  CHECK_EQ(a[4], 5);\n  CHECK_EQ(a[5], 6);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\"1234567\",\n                                                            &a[0],  &a[1],  &a[2],  &a[3],\n                                                            &a[4],  &a[5],  &a[6]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n  CHECK_EQ(a[3], 4);\n  CHECK_EQ(a[4], 5);\n  CHECK_EQ(a[5], 6);\n  CHECK_EQ(a[6], 7);\n\n  memset(a, 0, sizeof(0));\n  CHECK(RE(\"(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)\"\n           \"(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)(\\\\d)\").FullMatch(\n               \"1234567890123456\",\n               &a[0],  &a[1],  &a[2],  &a[3],\n               &a[4],  &a[5],  &a[6],  &a[7],\n               &a[8],  &a[9],  &a[10], &a[11],\n               &a[12], &a[13], &a[14], &a[15]));\n  CHECK_EQ(a[0], 1);\n  CHECK_EQ(a[1], 2);\n  CHECK_EQ(a[2], 3);\n  CHECK_EQ(a[3], 4);\n  CHECK_EQ(a[4], 5);\n  CHECK_EQ(a[5], 6);\n  CHECK_EQ(a[6], 7);\n  CHECK_EQ(a[7], 8);\n  CHECK_EQ(a[8], 9);\n  CHECK_EQ(a[9], 0);\n  CHECK_EQ(a[10], 1);\n  CHECK_EQ(a[11], 2);\n  CHECK_EQ(a[12], 3);\n  CHECK_EQ(a[13], 4);\n  CHECK_EQ(a[14], 5);\n  CHECK_EQ(a[15], 6);\n\n  /***** PartialMatch *****/\n\n  printf(\"Testing PartialMatch\\n\");\n\n  CHECK(RE(\"h.*o\").PartialMatch(\"hello\"));\n  CHECK(RE(\"h.*o\").PartialMatch(\"othello\"));\n  CHECK(RE(\"h.*o\").PartialMatch(\"hello!\"));\n  CHECK(RE(\"((((((((((((((((((((x))))))))))))))))))))\").PartialMatch(\"x\"));\n\n  /***** other tests *****/\n\n  RadixTests();\n  TestReplace();\n  TestExtract();\n  TestConsume();\n  TestFindAndConsume();\n  TestQuoteMetaAll();\n  TestMatchNumberPeculiarity();\n\n  // Check the pattern() accessor\n  {\n    const string kPattern = \"http://([^/]+)/.*\";\n    const RE re(kPattern);\n    CHECK_EQ(kPattern, re.pattern());\n  }\n\n  // Check RE error field.\n  {\n    RE re(\"foo\");\n    CHECK(re.error().empty());  // Must have no error\n  }\n\n#ifdef SUPPORT_UTF\n  // Check UTF-8 handling\n  {\n    printf(\"Testing UTF-8 handling\\n\");\n\n    // Three Japanese characters (nihongo)\n    const unsigned char utf8_string[] = {\n         0xe6, 0x97, 0xa5, // 65e5\n         0xe6, 0x9c, 0xac, // 627c\n         0xe8, 0xaa, 0x9e, // 8a9e\n         0\n    };\n    const unsigned char utf8_pattern[] = {\n         '.',\n         0xe6, 0x9c, 0xac, // 627c\n         '.',\n         0\n    };\n\n    // Both should match in either mode, bytes or UTF-8\n    RE re_test1(\".........\");\n    CHECK(re_test1.FullMatch(utf8_string));\n    RE re_test2(\"...\", pcrecpp::UTF8());\n    CHECK(re_test2.FullMatch(utf8_string));\n\n    // PH added these tests for leading option settings\n\n    RE re_testZ0(\"(*CR)(*NO_START_OPT).........\");\n    CHECK(re_testZ0.FullMatch(utf8_string));\n\n#ifdef SUPPORT_UTF\n    RE re_testZ1(\"(*UTF8)...\");\n    CHECK(re_testZ1.FullMatch(utf8_string));\n\n    RE re_testZ2(\"(*UTF)...\");\n    CHECK(re_testZ2.FullMatch(utf8_string));\n\n#ifdef SUPPORT_UCP\n    RE re_testZ3(\"(*UCP)(*UTF)...\");\n    CHECK(re_testZ3.FullMatch(utf8_string));\n\n    RE re_testZ4(\"(*UCP)(*LIMIT_MATCH=1000)(*UTF)...\");\n    CHECK(re_testZ4.FullMatch(utf8_string));\n\n    RE re_testZ5(\"(*UCP)(*LIMIT_MATCH=1000)(*ANY)(*UTF)...\");\n    CHECK(re_testZ5.FullMatch(utf8_string));\n#endif\n#endif\n\n    // Check that '.' matches one byte or UTF-8 character\n    // according to the mode.\n    string ss;\n    RE re_test3(\"(.)\");\n    CHECK(re_test3.PartialMatch(utf8_string, &ss));\n    CHECK_EQ(ss, string(\"\\xe6\"));\n    RE re_test4(\"(.)\", pcrecpp::UTF8());\n    CHECK(re_test4.PartialMatch(utf8_string, &ss));\n    CHECK_EQ(ss, string(\"\\xe6\\x97\\xa5\"));\n\n    // Check that string matches itself in either mode\n    RE re_test5(utf8_string);\n    CHECK(re_test5.FullMatch(utf8_string));\n    RE re_test6(utf8_string, pcrecpp::UTF8());\n    CHECK(re_test6.FullMatch(utf8_string));\n\n    // Check that pattern matches string only in UTF8 mode\n    RE re_test7(utf8_pattern);\n    CHECK(!re_test7.FullMatch(utf8_string));\n    RE re_test8(utf8_pattern, pcrecpp::UTF8());\n    CHECK(re_test8.FullMatch(utf8_string));\n  }\n\n  // Check that ungreedy, UTF8 regular expressions don't match when they\n  // oughtn't -- see bug 82246.\n  {\n    // This code always worked.\n    const char* pattern = \"\\\\w+X\";\n    const string target = \"a aX\";\n    RE match_sentence(pattern);\n    RE match_sentence_re(pattern, pcrecpp::UTF8());\n\n    CHECK(!match_sentence.FullMatch(target));\n    CHECK(!match_sentence_re.FullMatch(target));\n  }\n\n  {\n    const char* pattern = \"(?U)\\\\w+X\";\n    const string target = \"a aX\";\n    RE match_sentence(pattern);\n    RE match_sentence_re(pattern, pcrecpp::UTF8());\n\n    CHECK(!match_sentence.FullMatch(target));\n    CHECK(!match_sentence_re.FullMatch(target));\n  }\n#endif  /* def SUPPORT_UTF */\n\n  printf(\"Testing error reporting\\n\");\n\n  { RE re(\"a\\\\1\"); CHECK(!re.error().empty()); }\n  {\n    RE re(\"a[x\");\n    CHECK(!re.error().empty());\n  }\n  {\n    RE re(\"a[z-a]\");\n    CHECK(!re.error().empty());\n  }\n  {\n    RE re(\"a[[:foobar:]]\");\n    CHECK(!re.error().empty());\n  }\n  {\n    RE re(\"a(b\");\n    CHECK(!re.error().empty());\n  }\n  {\n    RE re(\"a\\\\\");\n    CHECK(!re.error().empty());\n  }\n\n  // Test that recursion is stopped\n  TestRecursion();\n\n  // Test Options\n  if (getenv(\"VERBOSE_TEST\") != NULL)\n    VERBOSE_TEST  = true;\n  TestOptions();\n\n  // Test the constructors\n  TestConstructors();\n\n  // Done\n  printf(\"OK\\n\");\n\n  return 0;\n}\n"
  },
  {
    "path": "src/pcre/pcrecpparg.h.in",
    "content": "// Copyright (c) 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sanjay Ghemawat\n\n#ifndef _PCRECPPARG_H\n#define _PCRECPPARG_H\n\n#include <stdlib.h>    // for NULL\n#include <string>\n\n#include <pcre.h>\n\nnamespace pcrecpp {\n\nclass StringPiece;\n\n// Hex/Octal/Binary?\n\n// Special class for parsing into objects that define a ParseFrom() method\ntemplate <class T>\nclass _RE_MatchObject {\n public:\n  static inline bool Parse(const char* str, int n, void* dest) {\n    if (dest == NULL) return true;\n    T* object = reinterpret_cast<T*>(dest);\n    return object->ParseFrom(str, n);\n  }\n};\n\nclass PCRECPP_EXP_DEFN Arg {\n public:\n  // Empty constructor so we can declare arrays of Arg\n  Arg();\n\n  // Constructor specially designed for NULL arguments\n  Arg(void*);\n\n  typedef bool (*Parser)(const char* str, int n, void* dest);\n\n// Type-specific parsers\n#define PCRE_MAKE_PARSER(type,name)                             \\\n  Arg(type* p) : arg_(p), parser_(name) { }                     \\\n  Arg(type* p, Parser parser) : arg_(p), parser_(parser) { }\n\n\n  PCRE_MAKE_PARSER(char,               parse_char);\n  PCRE_MAKE_PARSER(unsigned char,      parse_uchar);\n  PCRE_MAKE_PARSER(short,              parse_short);\n  PCRE_MAKE_PARSER(unsigned short,     parse_ushort);\n  PCRE_MAKE_PARSER(int,                parse_int);\n  PCRE_MAKE_PARSER(unsigned int,       parse_uint);\n  PCRE_MAKE_PARSER(long,               parse_long);\n  PCRE_MAKE_PARSER(unsigned long,      parse_ulong);\n#if @pcre_have_long_long@\n  PCRE_MAKE_PARSER(long long,          parse_longlong);\n#endif\n#if @pcre_have_ulong_long@\n  PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong);\n#endif\n  PCRE_MAKE_PARSER(float,              parse_float);\n  PCRE_MAKE_PARSER(double,             parse_double);\n  PCRE_MAKE_PARSER(std::string,        parse_string);\n  PCRE_MAKE_PARSER(StringPiece,        parse_stringpiece);\n\n#undef PCRE_MAKE_PARSER\n\n  // Generic constructor\n  template <class T> Arg(T*, Parser parser);\n  // Generic constructor template\n  template <class T> Arg(T* p)\n    : arg_(p), parser_(_RE_MatchObject<T>::Parse) {\n  }\n\n  // Parse the data\n  bool Parse(const char* str, int n) const;\n\n private:\n  void*         arg_;\n  Parser        parser_;\n\n  static bool parse_null          (const char* str, int n, void* dest);\n  static bool parse_char          (const char* str, int n, void* dest);\n  static bool parse_uchar         (const char* str, int n, void* dest);\n  static bool parse_float         (const char* str, int n, void* dest);\n  static bool parse_double        (const char* str, int n, void* dest);\n  static bool parse_string        (const char* str, int n, void* dest);\n  static bool parse_stringpiece   (const char* str, int n, void* dest);\n\n#define PCRE_DECLARE_INTEGER_PARSER(name)                                   \\\n private:                                                                   \\\n  static bool parse_ ## name(const char* str, int n, void* dest);           \\\n  static bool parse_ ## name ## _radix(                                     \\\n    const char* str, int n, void* dest, int radix);                         \\\n public:                                                                    \\\n  static bool parse_ ## name ## _hex(const char* str, int n, void* dest);   \\\n  static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \\\n  static bool parse_ ## name ## _cradix(const char* str, int n, void* dest)\n\n  PCRE_DECLARE_INTEGER_PARSER(short);\n  PCRE_DECLARE_INTEGER_PARSER(ushort);\n  PCRE_DECLARE_INTEGER_PARSER(int);\n  PCRE_DECLARE_INTEGER_PARSER(uint);\n  PCRE_DECLARE_INTEGER_PARSER(long);\n  PCRE_DECLARE_INTEGER_PARSER(ulong);\n  PCRE_DECLARE_INTEGER_PARSER(longlong);\n  PCRE_DECLARE_INTEGER_PARSER(ulonglong);\n\n#undef PCRE_DECLARE_INTEGER_PARSER\n};\n\ninline Arg::Arg() : arg_(NULL), parser_(parse_null) { }\ninline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { }\n\ninline bool Arg::Parse(const char* str, int n) const {\n  return (*parser_)(str, n, arg_);\n}\n\n// This part of the parser, appropriate only for ints, deals with bases\n#define MAKE_INTEGER_PARSER(type, name) \\\n  inline Arg Hex(type* ptr) { \\\n    return Arg(ptr, Arg::parse_ ## name ## _hex); } \\\n  inline Arg Octal(type* ptr) { \\\n    return Arg(ptr, Arg::parse_ ## name ## _octal); } \\\n  inline Arg CRadix(type* ptr) { \\\n    return Arg(ptr, Arg::parse_ ## name ## _cradix); }\n\nMAKE_INTEGER_PARSER(short,              short)     /*                        */\nMAKE_INTEGER_PARSER(unsigned short,     ushort)    /*                        */\nMAKE_INTEGER_PARSER(int,                int)       /* Don't use semicolons   */\nMAKE_INTEGER_PARSER(unsigned int,       uint)      /* after these statement  */\nMAKE_INTEGER_PARSER(long,               long)      /* because they can cause */\nMAKE_INTEGER_PARSER(unsigned long,      ulong)     /* compiler warnings if   */\n#if @pcre_have_long_long@                          /* the checking level is  */\nMAKE_INTEGER_PARSER(long long,          longlong)  /* turned up high enough. */\n#endif                                             /*                        */\n#if @pcre_have_ulong_long@                         /*                        */\nMAKE_INTEGER_PARSER(unsigned long long, ulonglong) /*                        */\n#endif\n\n#undef PCRE_IS_SET\n#undef PCRE_SET_OR_CLEAR\n#undef MAKE_INTEGER_PARSER\n\n}   // namespace pcrecpp\n\n\n#endif /* _PCRECPPARG_H */\n"
  },
  {
    "path": "src/pcre/pcredemo.c",
    "content": "/*************************************************\n*           PCRE DEMONSTRATION PROGRAM           *\n*************************************************/\n\n/* This is a demonstration program to illustrate the most straightforward ways\nof calling the PCRE regular expression library from a C program. See the\npcresample documentation for a short discussion (\"man pcresample\" if you have\nthe PCRE man pages installed).\n\nIn Unix-like environments, if PCRE is installed in your standard system\nlibraries, you should be able to compile this program using this command:\n\ngcc -Wall pcredemo.c -lpcre -o pcredemo\n\nIf PCRE is not installed in a standard place, it is likely to be installed with\nsupport for the pkg-config mechanism. If you have pkg-config, you can compile\nthis program using this command:\n\ngcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo\n\nIf you do not have pkg-config, you may have to use this:\n\ngcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \\\n  -R/usr/local/lib -lpcre -o pcredemo\n\nReplace \"/usr/local/include\" and \"/usr/local/lib\" with wherever the include and\nlibrary files for PCRE are installed on your system. Only some operating\nsystems (e.g. Solaris) use the -R option.\n\nBuilding under Windows:\n\nIf you want to statically link this program against a non-dll .a file, you must\ndefine PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and\npcre_free() exported functions will be declared __declspec(dllimport), with\nunwanted results. So in this environment, uncomment the following line. */\n\n/* #define PCRE_STATIC */\n\n#include <stdio.h>\n#include <string.h>\n#include <pcre.h>\n\n#define OVECCOUNT 30    /* should be a multiple of 3 */\n\n\nint main(int argc, char **argv)\n{\npcre *re;\nconst char *error;\nchar *pattern;\nchar *subject;\nunsigned char *name_table;\nunsigned int option_bits;\nint erroffset;\nint find_all;\nint crlf_is_newline;\nint namecount;\nint name_entry_size;\nint ovector[OVECCOUNT];\nint subject_length;\nint rc, i;\nint utf8;\n\n\n/**************************************************************************\n* First, sort out the command line. There is only one possible option at  *\n* the moment, \"-g\" to request repeated matching to find all occurrences,  *\n* like Perl's /g option. We set the variable find_all to a non-zero value *\n* if the -g option is present. Apart from that, there must be exactly two *\n* arguments.                                                              *\n**************************************************************************/\n\nfind_all = 0;\nfor (i = 1; i < argc; i++)\n  {\n  if (strcmp(argv[i], \"-g\") == 0) find_all = 1;\n    else break;\n  }\n\n/* After the options, we require exactly two arguments, which are the pattern,\nand the subject string. */\n\nif (argc - i != 2)\n  {\n  printf(\"Two arguments required: a regex and a subject string\\n\");\n  return 1;\n  }\n\npattern = argv[i];\nsubject = argv[i+1];\nsubject_length = (int)strlen(subject);\n\n\n/*************************************************************************\n* Now we are going to compile the regular expression pattern, and handle *\n* and errors that are detected.                                          *\n*************************************************************************/\n\nre = pcre_compile(\n  pattern,              /* the pattern */\n  0,                    /* default options */\n  &error,               /* for error message */\n  &erroffset,           /* for error offset */\n  NULL);                /* use default character tables */\n\n/* Compilation failed: print the error message and exit */\n\nif (re == NULL)\n  {\n  printf(\"PCRE compilation failed at offset %d: %s\\n\", erroffset, error);\n  return 1;\n  }\n\n\n/*************************************************************************\n* If the compilation succeeded, we call PCRE again, in order to do a     *\n* pattern match against the subject string. This does just ONE match. If *\n* further matching is needed, it will be done below.                     *\n*************************************************************************/\n\nrc = pcre_exec(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  subject,              /* the subject string */\n  subject_length,       /* the length of the subject */\n  0,                    /* start at offset 0 in the subject */\n  0,                    /* default options */\n  ovector,              /* output vector for substring information */\n  OVECCOUNT);           /* number of elements in the output vector */\n\n/* Matching failed: handle error cases */\n\nif (rc < 0)\n  {\n  switch(rc)\n    {\n    case PCRE_ERROR_NOMATCH: printf(\"No match\\n\"); break;\n    /*\n    Handle other special cases if you like\n    */\n    default: printf(\"Matching error %d\\n\", rc); break;\n    }\n  pcre_free(re);     /* Release memory used for the compiled pattern */\n  return 1;\n  }\n\n/* Match succeded */\n\nprintf(\"\\nMatch succeeded at offset %d\\n\", ovector[0]);\n\n\n/*************************************************************************\n* We have found the first match within the subject string. If the output *\n* vector wasn't big enough, say so. Then output any substrings that were *\n* captured.                                                              *\n*************************************************************************/\n\n/* The output vector wasn't big enough */\n\nif (rc == 0)\n  {\n  rc = OVECCOUNT/3;\n  printf(\"ovector only has room for %d captured substrings\\n\", rc - 1);\n  }\n\n/* Show substrings stored in the output vector by number. Obviously, in a real\napplication you might want to do things other than print them. */\n\nfor (i = 0; i < rc; i++)\n  {\n  char *substring_start = subject + ovector[2*i];\n  int substring_length = ovector[2*i+1] - ovector[2*i];\n  printf(\"%2d: %.*s\\n\", i, substring_length, substring_start);\n  }\n\n\n/**************************************************************************\n* That concludes the basic part of this demonstration program. We have    *\n* compiled a pattern, and performed a single match. The code that follows *\n* shows first how to access named substrings, and then how to code for    *\n* repeated matches on the same subject.                                   *\n**************************************************************************/\n\n/* See if there are any named substrings, and if so, show them by name. First\nwe have to extract the count of named parentheses from the pattern. */\n\n(void)pcre_fullinfo(\n  re,                   /* the compiled pattern */\n  NULL,                 /* no extra data - we didn't study the pattern */\n  PCRE_INFO_NAMECOUNT,  /* number of named substrings */\n  &namecount);          /* where to put the answer */\n\nif (namecount <= 0) printf(\"No named substrings\\n\"); else\n  {\n  unsigned char *tabptr;\n  printf(\"Named substrings\\n\");\n\n  /* Before we can access the substrings, we must extract the table for\n  translating names to numbers, and the size of each entry in the table. */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMETABLE,      /* address of the table */\n    &name_table);             /* where to put the answer */\n\n  (void)pcre_fullinfo(\n    re,                       /* the compiled pattern */\n    NULL,                     /* no extra data - we didn't study the pattern */\n    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */\n    &name_entry_size);        /* where to put the answer */\n\n  /* Now we can scan the table and, for each entry, print the number, the name,\n  and the substring itself. */\n\n  tabptr = name_table;\n  for (i = 0; i < namecount; i++)\n    {\n    int n = (tabptr[0] << 8) | tabptr[1];\n    printf(\"(%d) %*s: %.*s\\n\", n, name_entry_size - 3, tabptr + 2,\n      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n    tabptr += name_entry_size;\n    }\n  }\n\n\n/*************************************************************************\n* If the \"-g\" option was given on the command line, we want to continue  *\n* to search for additional matches in the subject string, in a similar   *\n* way to the /g option in Perl. This turns out to be trickier than you   *\n* might think because of the possibility of matching an empty string.    *\n* What happens is as follows:                                            *\n*                                                                        *\n* If the previous match was NOT for an empty string, we can just start   *\n* the next match at the end of the previous one.                         *\n*                                                                        *\n* If the previous match WAS for an empty string, we can't do that, as it *\n* would lead to an infinite loop. Instead, a special call of pcre_exec() *\n* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *\n* The first of these tells PCRE that an empty string at the start of the *\n* subject is not a valid match; other possibilities must be tried. The   *\n* second flag restricts PCRE to one match attempt at the initial string  *\n* position. If this match succeeds, an alternative to the empty string   *\n* match has been found, and we can print it and proceed round the loop,  *\n* advancing by the length of whatever was found. If this match does not  *\n* succeed, we still stay in the loop, advancing by just one character.   *\n* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *\n* more than one byte.                                                    *\n*                                                                        *\n* However, there is a complication concerned with newlines. When the     *\n* newline convention is such that CRLF is a valid newline, we must       *\n* advance by two characters rather than one. The newline convention can  *\n* be set in the regex by (*CR), etc.; if not, we must find the default.  *\n*************************************************************************/\n\nif (!find_all)     /* Check for -g */\n  {\n  pcre_free(re);   /* Release the memory used for the compiled pattern */\n  return 0;        /* Finish unless -g was given */\n  }\n\n/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline\nsequence. First, find the options with which the regex was compiled; extract\nthe UTF-8 state, and mask off all but the newline options. */\n\n(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);\nutf8 = option_bits & PCRE_UTF8;\noption_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|\n               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;\n\n/* If no newline options were set, find the default newline convention from the\nbuild configuration. */\n\nif (option_bits == 0)\n  {\n  int d;\n  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);\n  /* Note that these values are always the ASCII ones, even in\n  EBCDIC environments. CR = 13, NL = 10. */\n  option_bits = (d == 13)? PCRE_NEWLINE_CR :\n          (d == 10)? PCRE_NEWLINE_LF :\n          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :\n          (d == -2)? PCRE_NEWLINE_ANYCRLF :\n          (d == -1)? PCRE_NEWLINE_ANY : 0;\n  }\n\n/* See if CRLF is a valid newline sequence. */\n\ncrlf_is_newline =\n     option_bits == PCRE_NEWLINE_ANY ||\n     option_bits == PCRE_NEWLINE_CRLF ||\n     option_bits == PCRE_NEWLINE_ANYCRLF;\n\n/* Loop for second and subsequent matches */\n\nfor (;;)\n  {\n  int options = 0;                 /* Normally no options */\n  int start_offset = ovector[1];   /* Start at end of previous match */\n\n  /* If the previous match was for an empty string, we are finished if we are\n  at the end of the subject. Otherwise, arrange to run another match at the\n  same point to see if a non-empty match can be found. */\n\n  if (ovector[0] == ovector[1])\n    {\n    if (ovector[0] == subject_length) break;\n    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;\n    }\n\n  /* Run the next matching operation */\n\n  rc = pcre_exec(\n    re,                   /* the compiled pattern */\n    NULL,                 /* no extra data - we didn't study the pattern */\n    subject,              /* the subject string */\n    subject_length,       /* the length of the subject */\n    start_offset,         /* starting offset in the subject */\n    options,              /* options */\n    ovector,              /* output vector for substring information */\n    OVECCOUNT);           /* number of elements in the output vector */\n\n  /* This time, a result of NOMATCH isn't an error. If the value in \"options\"\n  is zero, it just means we have found all possible matches, so the loop ends.\n  Otherwise, it means we have failed to find a non-empty-string match at a\n  point where there was a previous empty-string match. In this case, we do what\n  Perl does: advance the matching position by one character, and continue. We\n  do this by setting the \"end of previous match\" offset, because that is picked\n  up at the top of the loop as the point at which to start again.\n\n  There are two complications: (a) When CRLF is a valid newline sequence, and\n  the current position is just before it, advance by an extra byte. (b)\n  Otherwise we must ensure that we skip an entire UTF-8 character if we are in\n  UTF-8 mode. */\n\n  if (rc == PCRE_ERROR_NOMATCH)\n    {\n    if (options == 0) break;                    /* All matches found */\n    ovector[1] = start_offset + 1;              /* Advance one byte */\n    if (crlf_is_newline &&                      /* If CRLF is newline & */\n        start_offset < subject_length - 1 &&    /* we are at CRLF, */\n        subject[start_offset] == '\\r' &&\n        subject[start_offset + 1] == '\\n')\n      ovector[1] += 1;                          /* Advance by one more. */\n    else if (utf8)                              /* Otherwise, ensure we */\n      {                                         /* advance a whole UTF-8 */\n      while (ovector[1] < subject_length)       /* character. */\n        {\n        if ((subject[ovector[1]] & 0xc0) != 0x80) break;\n        ovector[1] += 1;\n        }\n      }\n    continue;    /* Go round the loop again */\n    }\n\n  /* Other matching errors are not recoverable. */\n\n  if (rc < 0)\n    {\n    printf(\"Matching error %d\\n\", rc);\n    pcre_free(re);    /* Release memory used for the compiled pattern */\n    return 1;\n    }\n\n  /* Match succeded */\n\n  printf(\"\\nMatch succeeded again at offset %d\\n\", ovector[0]);\n\n  /* The match succeeded, but the output vector wasn't big enough. */\n\n  if (rc == 0)\n    {\n    rc = OVECCOUNT/3;\n    printf(\"ovector only has room for %d captured substrings\\n\", rc - 1);\n    }\n\n  /* As before, show substrings stored in the output vector by number, and then\n  also any named substrings. */\n\n  for (i = 0; i < rc; i++)\n    {\n    char *substring_start = subject + ovector[2*i];\n    int substring_length = ovector[2*i+1] - ovector[2*i];\n    printf(\"%2d: %.*s\\n\", i, substring_length, substring_start);\n    }\n\n  if (namecount <= 0) printf(\"No named substrings\\n\"); else\n    {\n    unsigned char *tabptr = name_table;\n    printf(\"Named substrings\\n\");\n    for (i = 0; i < namecount; i++)\n      {\n      int n = (tabptr[0] << 8) | tabptr[1];\n      printf(\"(%d) %*s: %.*s\\n\", n, name_entry_size - 3, tabptr + 2,\n        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);\n      tabptr += name_entry_size;\n      }\n    }\n  }      /* End of loop to find second and subsequent matches */\n\nprintf(\"\\n\");\npcre_free(re);       /* Release memory used for the compiled pattern */\nreturn 0;\n}\n\n/* End of pcredemo.c */\n"
  },
  {
    "path": "src/pcre/pcregexp.pas",
    "content": "{\r\n  pcRegExp - Perl compatible regular expressions for Virtual Pascal\r\n  (c) 2001 Peter S. Voronov aka Chem O'Dun <petervrn@yahoo.com>\r\n\r\n  Based on PCRE library interface unit for Virtual Pascal.\r\n  (c) 2001 Alexander Tokarev <dwalin@dwalin.ru>\r\n\r\n  The current PCRE version is: 3.7\r\n\r\n  This software may be distributed under the terms of the modified BSD license\r\n  Copyright (c) 2001, Alexander Tokarev\r\n  All rights reserved.\r\n\r\n  Redistribution and use in source and binary forms, with or without\r\n  modification, are permitted provided that the following conditions are met:\r\n\r\n    * Redistributions of source code must retain the above copyright notice,\r\n      this list of conditions and the following disclaimer.\r\n    * Redistributions in binary form must reproduce the above copyright notice,\r\n      this list of conditions and the following disclaimer in the documentation\r\n      and/or other materials provided with the distribution.\r\n    * Neither the name of the <ORGANIZATION> nor the names of its contributors\r\n      may be used to endorse or promote products derived from this software without\r\n      specific prior written permission.\r\n\r\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n  The PCRE library is written by: Philip Hazel <ph10@cam.ac.uk>\r\n  Copyright (c) 1997-2004 University of Cambridge\r\n\r\n  AngelsHolocaust 4-11-04 updated to use version v5.0\r\n  (INFO: this is regex-directed, NFA)\r\n  AH:  9-11-04 - pcre_free: removed var, pcre already gives the ptr, now\r\n\t\t\t    everything works as it should (no more crashes)\r\n\t\t -> removed CheckRegExp because pcre handles errors perfectly\r\n      10-11-04 - added pcError (errorhandling), pcInit\r\n      13-11-04 - removed the ErrorPos = 0 check -> always print erroroffset\r\n      17-10-05 - support for \\1-\\9 backreferences in TpcRegExp.GetReplStr\r\n      17-02-06 - added RunTimeOptions: caller can set options while searching\r\n      19-02-06 - added SearchOfs(): let PCRE use the complete string and offset\r\n\t\t into the string itself\r\n      20-12-06 - support for version 7.0\r\n      27.08.08 - support for v7.7\r\n}\r\n\r\n{$H+} {$DEFINE PCRE_3_7} {$DEFINE PCRE_5_0} {$DEFINE PCRE_7_0} {$DEFINE PCRE_7_7}\r\n\r\nUnit pcregexp;\r\n\r\nInterface\r\n\r\nuses objects;\r\n\r\nType\r\n PpcRegExp = ^TpcRegExp;\r\n// TpcRegExp = object\r\n TpcRegExp = object(TObject)\r\n  MatchesCount: integer;\r\n  RegExpC, RegExpExt : Pointer;\r\n  Matches:Pointer;\r\n  RegExp: shortstring;\r\n  SourceLen: integer;\r\n  PartialMatch : boolean;\r\n  Error : boolean;\r\n  ErrorMsg : Pchar;\r\n  ErrorPos : integer;\r\n  RunTimeOptions: Integer; // options which can be set by the caller\r\n  constructor Init(const ARegExp : shortstring; AOptions : integer; ALocale : Pointer);\r\n  function Search(AStr: Pchar; ALen : longint) : boolean; virtual;\r\n  function SearchNext( AStr: Pchar; ALen : longint) : boolean; virtual;\r\n  function SearchOfs ( AStr: Pchar; ALen, AOfs : longint) : boolean; virtual;\r\n  function MatchSub(ANom: integer; var Pos, Len : longint) : boolean; virtual;\r\n  function MatchFull(var Pos, Len : longint) : boolean; virtual;\r\n  function GetSubStr(ANom: integer; AStr: Pchar) : string; virtual;\r\n  function GetFullStr(AStr: Pchar) : string; virtual;\r\n  function GetReplStr(AStr: Pchar; const ARepl: string) : string; virtual;\r\n  function GetPreSubStr(AStr: Pchar) : string; virtual;\r\n  function GetPostSubStr(AStr: Pchar) : string; virtual;\r\n  function ErrorStr : string; virtual;\r\n  destructor Done; virtual;\r\n end;\r\n\r\n function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;\r\n function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;\r\n\r\n function pcFastGrepMatch(WildCard, aStr: string): Boolean;\r\n function pcFastGrepSub(WildCard, aStr, aRepl: string): string;\r\n\r\n{$IFDEF PCRE_5_0}\r\n function pcGetVersion : pchar;\r\n{$ENDIF}\r\n\r\n function pcError (var pRegExp : Pointer) : Boolean;\r\n function pcInit  (const Pattern: Shortstring; CaseSens: Boolean) : Pointer;\r\n\r\nConst { Options }\r\n PCRE_CASELESS         = $0001;\r\n PCRE_MULTILINE        = $0002;\r\n PCRE_DOTALL           = $0004;\r\n PCRE_EXTENDED         = $0008;\r\n PCRE_ANCHORED         = $0010;\r\n PCRE_DOLLAR_ENDONLY   = $0020;\r\n PCRE_EXTRA            = $0040;\r\n PCRE_NOTBOL           = $0080;\r\n PCRE_NOTEOL           = $0100;\r\n PCRE_UNGREEDY         = $0200;\r\n PCRE_NOTEMPTY         = $0400;\r\n{$IFDEF PCRE_5_0}\r\n PCRE_UTF8             = $0800;\r\n PCRE_NO_AUTO_CAPTURE  = $1000;\r\n PCRE_NO_UTF8_CHECK    = $2000;\r\n PCRE_AUTO_CALLOUT     = $4000;\r\n PCRE_PARTIAL          = $8000;\r\n{$ENDIF}\r\n{$IFDEF PCRE_7_0}\r\n PCRE_DFA_SHORTEST     = $00010000;\r\n PCRE_DFA_RESTART      = $00020000;\r\n PCRE_FIRSTLINE        = $00040000;\r\n PCRE_DUPNAMES         = $00080000;\r\n PCRE_NEWLINE_CR       = $00100000;\r\n PCRE_NEWLINE_LF       = $00200000;\r\n PCRE_NEWLINE_CRLF     = $00300000;\r\n PCRE_NEWLINE_ANY      = $00400000;\r\n PCRE_NEWLINE_ANYCRLF  = $00500000;\r\n\r\n PCRE_NEWLINE_BITS     = PCRE_NEWLINE_CR or PCRE_NEWLINE_LF or PCRE_NEWLINE_ANY;\r\n\r\n{$ENDIF}\r\n{$IFDEF PCRE_7_7}\r\n PCRE_BSR_ANYCRLF      = $00800000;\r\n PCRE_BSR_UNICODE      = $01000000;\r\n PCRE_JAVASCRIPT_COMPAT= $02000000;\r\n{$ENDIF}\r\n\r\n PCRE_COMPILE_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_AUTO_CALLOUT + PCRE_CASELESS  +\r\n\t\t\t\tPCRE_DOLLAR_ENDONLY + PCRE_DOTALL + PCRE_EXTENDED  +\r\n\t\t\t\tPCRE_EXTRA + PCRE_MULTILINE + PCRE_NO_AUTO_CAPTURE +\r\n\t\t\t\tPCRE_UNGREEDY + PCRE_UTF8 + PCRE_NO_UTF8_CHECK\r\n\t\t\t\t{$IFDEF PCRE_7_0}\r\n\t\t\t\t+ PCRE_DUPNAMES + PCRE_FIRSTLINE + PCRE_NEWLINE_BITS\r\n\t\t\t\t{$ENDIF}\r\n\t\t\t\t{$IFDEF PCRE_7_7}\r\n\t\t\t\t+ PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE + PCRE_JAVASCRIPT_COMPAT\r\n\t\t\t\t{$ENDIF}\r\n\t\t\t\t;\r\n\r\n PCRE_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +\r\n\t\t\t     PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL\r\n\t\t\t     {$IFDEF PCRE_7_0}\r\n\t\t\t     + PCRE_NEWLINE_BITS\r\n\t\t\t     {$ENDIF}\r\n\t\t\t     {$IFDEF PCRE_7_7}\r\n\t\t\t     + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE\r\n\t\t\t     {$ENDIF}\r\n\t\t\t     ;\r\n\r\n{$IFDEF PCRE_7_0}\r\n PCRE_DFA_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL +\r\n\t\t\t\t PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL +\r\n\t\t\t\t PCRE_DFA_SHORTEST + PCRE_DFA_RESTART +\r\n\t\t\t\t PCRE_NEWLINE_BITS\r\n\t\t\t\t {$IFDEF PCRE_7_7}\r\n\t\t\t\t + PCRE_BSR_ANYCRLF + PCRE_BSR_UNICODE\r\n\t\t\t\t {$ENDIF}\r\n\t\t\t\t ;\r\n{$ENDIF}\r\n\r\n{ Exec-time and get/set-time error codes }\r\n PCRE_ERROR_NOMATCH        =  -1;\r\n PCRE_ERROR_NULL\t   =  -2;\r\n PCRE_ERROR_BADOPTION      =  -3;\r\n PCRE_ERROR_BADMAGIC       =  -4;\r\n PCRE_ERROR_UNKNOWN_MODE   =  -5;\r\n PCRE_ERROR_NOMEMORY       =  -6;\r\n PCRE_ERROR_NOSUBSTRING    =  -7;\r\n{$IFDEF PCRE_5_0}\r\n PCRE_ERROR_MATCHLIMIT     =  -8;\r\n PCRE_ERROR_CALLOUT        =  -9;  { Never used by PCRE itself }\r\n PCRE_ERROR_BADUTF8        = -10;\r\n PCRE_ERROR_BADUTF8_OFFSET = -11;\r\n PCRE_ERROR_PARTIAL        = -12;\r\n PCRE_ERROR_BADPARTIAL     = -13;\r\n PCRE_ERROR_INTERNAL       = -14;\r\n PCRE_ERROR_BADCOUNT       = -15;\r\n{$ENDIF}\r\n{$IFDEF PCRE_7_0}\r\n PCRE_ERROR_DFA_UITEM      = -16;\r\n PCRE_ERROR_DFA_UCOND      = -17;\r\n PCRE_ERROR_DFA_UMLIMIT    = -18;\r\n PCRE_ERROR_DFA_WSSIZE     = -19;\r\n PCRE_ERROR_DFA_RECURSE    = -20;\r\n PCRE_ERROR_RECURSIONLIMIT = -21;\r\n PCRE_ERROR_NULLWSLIMIT    = -22;\r\n PCRE_ERROR_BADNEWLINE     = -23;\r\n{$ENDIF}\r\n\r\n{ Request types for pcre_fullinfo() }\r\n\r\n PCRE_INFO_OPTIONS         =  0;\r\n PCRE_INFO_SIZE \t   =  1;\r\n PCRE_INFO_CAPTURECOUNT    =  2;\r\n PCRE_INFO_BACKREFMAX      =  3;\r\n PCRE_INFO_FIRSTBYTE       =  4;\r\n PCRE_INFO_FIRSTCHAR       =  4; { For backwards compatibility }\r\n PCRE_INFO_FIRSTTABLE      =  5;\r\n{$IFDEF PCRE_5_0}\r\n PCRE_INFO_LASTLITERAL     =  6;\r\n PCRE_INFO_NAMEENTRYSIZE   =  7;\r\n PCRE_INFO_NAMECOUNT       =  8;\r\n PCRE_INFO_NAMETABLE       =  9;\r\n PCRE_INFO_STUDYSIZE       = 10;\r\n PCRE_INFO_DEFAULT_TABLES  = 11;\r\n{$ENDIF PCRE_5_0}\r\n{$IFDEF PCRE_7_7}\r\n PCRE_INFO_OKPARTIAL       = 12;\r\n PCRE_INFO_JCHANGED        = 13;\r\n PCRE_INFO_HASCRORLF       = 14;\r\n{$ENDIF}\r\n\r\n{ Request types for pcre_config() }\r\n{$IFDEF PCRE_5_0}\r\n PCRE_CONFIG_UTF8       \t    = 0;\r\n PCRE_CONFIG_NEWLINE    \t    = 1;\r\n PCRE_CONFIG_LINK_SIZE  \t    = 2;\r\n PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3;\r\n PCRE_CONFIG_MATCH_LIMIT\t    = 4;\r\n PCRE_CONFIG_STACKRECURSE           = 5;\r\n PCRE_CONFIG_UNICODE_PROPERTIES     = 6;\r\n{$ENDIF PCRE_5_0}\r\n{$IFDEF PCRE_7_0}\r\n PCRE_CONFIG_MATCH_LIMIT_RECURSION  = 7;\r\n{$ENDIF}\r\n{$IFDEF PCRE_7_7}\r\n PCRE_CONFIG_BSR\t\t    = 8;\r\n{$ENDIF}\r\n\r\n{ Bit flags for the pcre_extra structure }\r\n{$IFDEF PCRE_5_0}\r\n PCRE_EXTRA_STUDY_DATA  \t  = $0001;\r\n PCRE_EXTRA_MATCH_LIMIT \t  = $0002;\r\n PCRE_EXTRA_CALLOUT_DATA\t  = $0004;\r\n PCRE_EXTRA_TABLES      \t  = $0008;\r\n{$ENDIF PCRE_5_0}\r\n{$IFDEF PCRE_7_0}\r\n PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010;\r\n{$ENDIF}\r\n\r\nConst\r\n// DefaultOptions : integer = 0;\r\n DefaultLocaleTable : pointer = nil;\r\n\r\n{$IFDEF PCRE_5_0}\r\n{ The structure for passing additional data to pcre_exec(). This is defined in\r\nsuch as way as to be extensible. Always add new fields at the end, in order to\r\nremain compatible. }\r\n\r\ntype ppcre_extra = ^tpcre_extra;\r\n     tpcre_extra = record\r\n       flags : longint; \t       { Bits for which fields are set }\r\n       study_data : pointer;           { Opaque data from pcre_study() }\r\n       match_limit : longint;          { Maximum number of calls to match() }\r\n       callout_data : pointer;         { Data passed back in callouts }\r\n       tables : pointer;\t       { Pointer to character tables }\r\n       match_limit_recursion: longint; { Max recursive calls to match() }\r\n     end;\r\n\r\ntype ppcre_callout_block = ^pcre_callout_block;\r\n     pcre_callout_block = record\r\n       version,\r\n  (* ------------------------ Version 0 ------------------------------- *)\r\n       callout_number : integer;\r\n       offset_vector : pointer;\r\n       subject : pchar;\r\n       subject_length, start_match, current_position, capture_top,\r\n       capture_last : integer;\r\n       callout_data : pointer;\r\n  (* ------------------- Added for Version 1 -------------------------- *)\r\n       pattern_position, next_item_length : integer;\r\n     end;\r\n{$ENDIF PCRE_5_0}\r\n\r\n{$OrgName+}\r\n{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}\r\n\r\n { local replacement of external pcre memory management functions }\r\n function pcre_malloc( size : integer ) : pointer;\r\n procedure pcre_free( {var} p : pointer );\r\n{$IFDEF PCRE_5_0}\r\n const pcre_stack_malloc: function ( size : integer ): pointer = pcre_malloc;\r\n       pcre_stack_free: procedure ( {var} p : pointer ) = pcre_free;\r\n function pcre_callout(var p : ppcre_callout_block) : integer;\r\n{$ENDIF PCRE_5_0}\r\n{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}\r\n\r\nImplementation\r\n\r\nUses strings, collect, messages, dnapp, commands, advance0, stringsx\r\n    {$IFDEF VIRTUALPASCAL} ,vpsyslow {$ENDIF VIRTUALPASCAL};\r\n\r\nConst\r\n MAGIC_NUMBER = $50435245; { 'PCRE' }\r\n MAX_MATCHES = 90; { changed in 3.5 version; should be divisible by 3, was 64}\r\n\r\nType\r\n PMatchArray = ^TMatchArray;\r\n TMatchArray = array[0..( MAX_MATCHES * 3 )] of integer;\r\n\r\n PRegExpCollection = ^TRegExpCollection;\r\n TRegExpCollection =  object(TSortedCollection)\r\n   MaxRegExp : integer;\r\n   SearchRegExp : shortstring;\r\n   CompareModeInsert : boolean;\r\n   constructor Init(AMaxRegExp:integer);\r\n   procedure FreeItem(P: Pointer); virtual;\r\n   function  Compare(P1, P2: Pointer): Integer; virtual;\r\n   function  Find(ARegExp:shortstring;var P: PpcRegExp):boolean; virtual;\r\n   function CheckNew(ARegExp:shortstring):PpcRegExp;virtual;\r\n end;\r\n\r\nVar\r\n PRegExpCache : PRegExpCollection;\r\n\r\n\r\n{$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL}\r\n\r\n { imported original pcre functions }\r\n\r\n function pcre_compile( const pattern : PChar; options : integer;\r\n\t\t\tvar errorptr : PChar; var erroroffset : integer;\r\n\t\t\tconst tables : PChar ) : pointer {pcre}; external;\r\n{$IFDEF PCRE_7_0}\r\n function pcre_compile2( const pattern : PChar; options : integer;\r\n\t\t\t var errorcodeptr : Integer;\r\n\t\t\t var errorptr : PChar; var erroroffset : integer;\r\n\t\t\t const tables : PChar ) : pointer {pcre}; external;\r\n{$ENDIF}\r\n{$IFDEF PCRE_5_0}\r\n function pcre_config( what : integer; where : pointer) : integer; external;\r\n function pcre_copy_named_substring( const code : pointer {pcre};\r\n\t\t\t\t     const subject : pchar;\r\n\t\t\t\t     var ovector : integer;\r\n\t\t\t\t     stringcount : integer;\r\n\t\t\t\t     const stringname : pchar;\r\n\t\t\t\t     var buffer : pchar;\r\n\t\t\t\t     size : integer) : integer; external;\r\n function pcre_copy_substring( const subject : pchar; var ovector : integer;\r\n\t\t\t       stringcount, stringnumber : integer;\r\n\t\t\t       var buffer : pchar; size : integer )\r\n\t\t\t       : integer; external;\r\n function pcre_exec( const argument_re : pointer {pcre};\r\n\t\t     const extra_data : pointer {pcre_extra};\r\n{$ELSE}\r\n function pcre_exec( const external_re : pointer;\r\n\t\t     const external_extra : pointer;\r\n{$ENDIF}\r\n\t\t     const subject : PChar;\r\n\t\t     length, start_offset, options : integer;\r\n\t\t     offsets : pointer;\r\n\t\t     offsetcount : integer ) : integer; external;\r\n{$IFDEF PCRE_7_0}\r\n function pcre_dfa_exec( const argument_re : pointer {pcre};\r\n\t\t\t const extra_data : pointer {pcre_extra};\r\n\t\t\t const subject : pchar;\r\n\t\t\t length, start_offset, options : integer;\r\n\t\t\t offsets : pointer;\r\n\t\t\t offsetcount : integer;\r\n\t\t\t workspace : pointer;\r\n\t\t\t wscount : integer ) : integer; external;\r\n{$ENDIF}\r\n{$IFDEF PCRE_5_0}\r\n procedure pcre_free_substring( const p : pchar ); external;\r\n procedure pcre_free_substring_list( var p : pchar ); external;\r\n function pcre_fullinfo( const argument_re : pointer {pcre};\r\n\t\t\t const extra_data : pointer {pcre_extra};\r\n\t\t\t what : integer;\r\n\t\t\t where : pointer ) : integer; external;\r\n function pcre_get_named_substring( const code : pointer {pcre};\r\n\t\t\t\t    const subject : pchar;\r\n\t\t\t\t    var ovector : integer;\r\n\t\t\t\t    stringcount : integer;\r\n\t\t\t\t    const stringname : pchar;\r\n\t\t\t\t    var stringptr : pchar ) : integer; external;\r\n function pcre_get_stringnumber( const code : pointer {pcre};\r\n\t\t\t\t const stringname : pchar ) : integer; external;\r\n function pcre_get_stringtable_entries( const code : pointer {pcre};\r\n\t\t\t\t\tconst stringname : pchar;\r\n\t\t\t\t\tvar firstptr,\r\n\t\t\t\t\t    lastptr : pchar ) : integer; external;\r\n function pcre_get_substring( const subject : pchar; var ovector : integer;\r\n\t\t\t      stringcount, stringnumber : integer;\r\n\t\t\t      var stringptr : pchar ) : integer; external;\r\n function pcre_get_substring_list( const subject : pchar; var ovector : integer;\r\n\t\t\t\t   stringcount : integer;\r\n\t\t\t\t   listptr : pointer {const char ***listptr}) : integer; external;\r\n function pcre_info( const argument_re : pointer {pcre};\r\n\t\t     var optptr : integer;\r\n\t\t     var first_byte : integer ) : integer; external;\r\n function pcre_maketables : pchar; external;\r\n{$ENDIF}\r\n{$IFDEF PCRE_7_0}\r\n function pcre_refcount( const argument_re : pointer {pcre};\r\n\t\t\t adjust : integer ) : pchar; external;\r\n{$ENDIF}\r\n function pcre_study( const external_re : pointer {pcre};\r\n\t\t      options : integer;\r\n\t\t      var errorptr : PChar ) : pointer {pcre_extra}; external;\r\n{$IFDEF PCRE_5_0}\r\n function pcre_version : pchar; external;\r\n{$ENDIF}\r\n\r\n function pcre_malloc( size : integer ) : pointer;\r\n begin\r\n  GetMem( result, size );\r\n end;\r\n\r\n procedure pcre_free( {var} p : pointer );\r\n begin\r\n  if (p <> nil) then\r\n    FreeMem( p, 0 );\r\n  {@p := nil;}\r\n end;\r\n\r\n{$IFDEF PCRE_5_0}\r\n(* Called from PCRE as a result of the (?C) item. We print out where we are in\r\nthe match. Yield zero unless more callouts than the fail count, or the callout\r\ndata is not zero. *)\r\n\r\n function pcre_callout;\r\n begin\r\n end;\r\n{$ENDIF}\r\n\r\n{$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL}\r\n\r\n// Always include the newest version of the library\r\n{$IFDEF PCRE_7_7}\r\n  {$L pcre77.lib}\r\n{$ELSE}\r\n  {$IFDEF PCRE_7_0}\r\n    {$L pcre70.lib}\r\n  {$ELSE}\r\n    {$IFDEF PCRE_5_0}\r\n      {$L pcre50.lib}\r\n    {$ELSE}\r\n      {$IFDEF PCRE_3_7}\r\n\t{$L pcre37.lib}\r\n      {$ENDIF PCRE_3_7}\r\n    {$ENDIF PCRE_5_0}\r\n  {$ENDIF PCRE_7_0}\r\n{$ENDIF PCRE_7_7}\r\n\r\n{TpcRegExp}\r\n\r\n constructor TpcRegExp.Init(const ARegExp:shortstring; AOptions:integer; ALocale : Pointer);\r\n var\r\n  pRegExp : PChar;\r\n begin\r\n  RegExp:=ARegExp;\r\n  RegExpC:=nil;\r\n  RegExpExt:=nil;\r\n  Matches:=nil;\r\n  MatchesCount:=0;\r\n  Error:=true;\r\n  ErrorMsg:=nil;\r\n  ErrorPos:=0;\r\n  RunTimeOptions := 0;\r\n  if length(RegExp) < 255 then\r\n   begin\r\n    RegExp[length(RegExp)+1]:=#0;\r\n    pRegExp:=@RegExp[1];\r\n   end\r\n  else\r\n   begin\r\n    GetMem(pRegExp,length(RegExp)+1);\r\n    pRegExp:=strpcopy(pRegExp,RegExp);\r\n   end;\r\n  RegExpC := pcre_compile( pRegExp,\r\n\t\t\t   AOptions and PCRE_COMPILE_ALLOWED_OPTIONS,\r\n\t\t\t   ErrorMsg, ErrorPos, ALocale);\r\n  if length(RegExp) = 255 then\r\n   StrDispose(pRegExp);\r\n  if RegExpC = nil then\r\n   exit;\r\n  ErrorMsg:=nil;\r\n  RegExpExt := pcre_study( RegExpC, 0, ErrorMsg );\r\n  if (RegExpExt = nil) and (ErrorMsg <> nil) then\r\n   begin\r\n    pcre_free(RegExpC);\r\n    exit;\r\n   end;\r\n  GetMem(Matches,SizeOf(TMatchArray));\r\n  Error:=false;\r\n end;\r\n\r\n destructor TpcRegExp.Done;\r\n begin\r\n  if RegExpC <> nil then\r\n    pcre_free(RegExpC);\r\n  if RegExpExt <> nil then\r\n    pcre_free(RegExpExt);\r\n  if Matches <> nil then\r\n    FreeMem(Matches,SizeOf(TMatchArray));\r\n end;\r\n\r\n function TpcRegExp.SearchNext( AStr: Pchar; ALen : longint ) : boolean;\r\n var Options: Integer;\r\n begin // must handle PCRE_ERROR_PARTIAL here\r\n  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and\r\n\t     PCRE_EXEC_ALLOWED_OPTIONS;\r\n  if MatchesCount > 0 then\r\n    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, PMatchArray(Matches)^[1],\r\n\t\t\t     Options, Matches, MAX_MATCHES ) else\r\n    MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, 0,\r\n\t\t\t     Options, Matches, MAX_MATCHES );\r\n{  if MatchesCount = 0 then\r\n    MatchesCount := MatchesCount div 3;}\r\n  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;\r\n  SearchNext := MatchesCount > 0;\r\n end;\r\n\r\n function TpcRegExp.Search( AStr: Pchar; ALen : longint):boolean;\r\n begin\r\n  MatchesCount:=0;\r\n  Search:=SearchNext(AStr,ALen);\r\n  SourceLen:=ALen;\r\n end;\r\n\r\n function TpcRegExp.SearchOfs( AStr: Pchar; ALen, AOfs: longint ) : boolean;\r\n var Options: Integer;\r\n begin\r\n  MatchesCount:=0;\r\n  Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and\r\n\t     PCRE_EXEC_ALLOWED_OPTIONS;\r\n  MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, AOfs,\r\n\t\t\t   Options, Matches, MAX_MATCHES );\r\n  PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL;\r\n  SearchOfs := MatchesCount > 0;\r\n  SourceLen := ALen-AOfs;\r\n end;\r\n\r\n function TpcRegExp.MatchSub(ANom:integer; var Pos,Len:longint):boolean;\r\n begin\r\n  if (MatchesCount > 0) and (ANom <= (MatchesCount-1)) then\r\n   begin\r\n    ANom:=ANom*2;\r\n    Pos:=PMatchArray(Matches)^[ANom];\r\n    Len:=PMatchArray(Matches)^[ANom+1]-Pos;\r\n    MatchSub:=true;\r\n   end\r\n  else\r\n   MatchSub:=false;\r\n end;\r\n\r\n function TpcRegExp.MatchFull(var Pos,Len:longint):boolean;\r\n begin\r\n  MatchFull:=MatchSub(0,Pos,Len);\r\n end;\r\n\r\n function TpcRegExp.GetSubStr(ANom: integer; AStr: Pchar):string;\r\n var\r\n  s: ansistring;\r\n  pos,len: longint;\r\n begin\r\n  s:='';\r\n  if MatchSub(ANom, pos, len) then\r\n   begin\r\n    setlength(s, len);\r\n    Move(AStr[pos], s[1], len);\r\n   end;\r\n  GetSubStr:=s;\r\n end;\r\n\r\n function TpcRegExp.GetPreSubStr(AStr: Pchar):string;\r\n var\r\n  s: ansistring;\r\n  l: longint;\r\n begin\r\n  s:='';\r\n  if (MatchesCount > 0) then\r\n   begin\r\n    l:=PMatchArray(Matches)^[0]-1;\r\n    if l > 0 then\r\n     begin\r\n      setlength(s,l);\r\n      Move(AStr[1],s[1],l);\r\n     end;\r\n   end;\r\n  GetPreSubStr:=s;\r\n end;\r\n\r\n function TpcRegExp.GetPostSubStr(AStr: Pchar):string;\r\n var\r\n  s: ansistring;\r\n  l: longint;\r\n  ANom: integer;\r\n begin\r\n  s:='';\r\n  if (MatchesCount > 0) then\r\n   begin\r\n    ANom:=(MatchesCount-1){*2} shl 1;\r\n    l:=SourceLen-PMatchArray(Matches)^[ANom+1]+1;\r\n    if l > 0 then\r\n     begin\r\n      setlength(s,l);\r\n      Move(AStr[PMatchArray(Matches)^[ANom+1]],s[1],l);\r\n     end;\r\n   end;\r\n  GetPostSubStr:=s;\r\n end;\r\n\r\n\r\n function TpcRegExp.GetFullStr(AStr: Pchar):string;\r\n var\r\n  s: ansistring;\r\n  l: longint;\r\n begin\r\n  GetFullStr:=GetSubStr(0,AStr);\r\n end;\r\n\r\n function TpcRegExp.GetReplStr(AStr: Pchar; const ARepl: string):string;\r\n var\r\n  s: ansistring;\r\n  l,i,lasti: longint;\r\n begin\r\n  l:=length(ARepl);\r\n  i:=1;\r\n  lasti:=1;\r\n  s:='';\r\n  while i <= l do\r\n   begin\r\n    case ARepl[i] of\r\n     '\\' :\r\n      begin\r\n       if i < l then\r\n\tbegin\r\n\t s:=s+copy(ARepl,lasti,i-lasti){+ARepl[i+1]};\r\n\t {AH 17-10-05 support for POSIX \\1-\\9 backreferences}\r\n\t case ARepl[i+1] of\r\n\t  '0' : s:=s+GetFullStr(AStr);\r\n\t  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);\r\n\t  else s:=s+ARepl[i+1]; // copy the escaped character\r\n\t end;\r\n\tend;\r\n       inc(i);\r\n       lasti:=i+1;\r\n      end;\r\n     '$' :\r\n      begin\r\n       if i < l then\r\n\tbegin\r\n\t s:=s+copy(ARepl,lasti,i-lasti);\r\n\t case ARepl[i+1] of\r\n\t  '&' : s:=s+GetFullStr(AStr);\r\n\t  '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr);\r\n\t  '`' : s:=s+GetPreSubStr(AStr);\r\n\t  #39 : s:=s+GetPostSubStr(AStr);\r\n\t end;\r\n\tend;\r\n       inc(i);\r\n       lasti:=i+1;\r\n      end;\r\n    end;\r\n    inc(i);\r\n   end;\r\n  if lasti <= {AH 25-10-2004 added =, else l==1 won't work} l then\r\n    s:=s+copy(ARepl,lasti,l-lasti+1);\r\n  GetReplStr:=s;\r\n end;\r\n\r\n function TpcRegExp.ErrorStr:string;\r\n  begin\r\n   ErrorStr:=StrPas(ErrorMsg);\r\n  end;\r\n\r\n{TRegExpCollection}\r\n\r\nconstructor TRegExpCollection.Init(AMaxRegExp: integer);\r\nbegin\r\n Inherited Init(1,1);\r\n MaxRegExp:=AMaxRegExp;\r\n CompareModeInsert:=true;\r\nend;\r\n\r\nprocedure TRegExpCollection.FreeItem(P: Pointer);\r\nbegin\r\n if P <> nil then\r\n  begin\r\n   Dispose(PpcRegExp(P),Done);\r\n  end;\r\nend;\r\n\r\nfunction  TRegExpCollection.Compare(P1, P2: Pointer): Integer;\r\n//var\r\n// l,l1,l2,i : byte;\r\n//// wPos: pchar;\r\nbegin\r\n if CompareModeInsert then\r\n  begin\r\n//   l1:=length(PpcRegExp(P1)^.RegExp);\r\n//   l2:=length(PpcRegExp(P2)^.RegExp);\r\n//   if l1 > l2 then l:=l2 else\r\n//      \t     l:=l1;\r\n//   for i:=1 to l do\r\n//     if PpcRegExp(P1).RegExp[i] <> PpcRegExp(P2).RegExp[i] then break;\r\n//   if i <=l then\r\n//     Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(PpcRegExp(P2).RegExp[i]) else\r\n//     Compare:=l1-l2;\r\n    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, PpcRegExp(P2).RegExp, False);\r\n  end\r\n else\r\n  begin\r\n//   l1:=length(PpcRegExp(P1)^.RegExp);\r\n//   l2:=length(SearchRegExp);\r\n//   if l1 > l2 then l:=l2 else\r\n//      \t     l:=l1;\r\n//   for i:=1 to l do\r\n//     if PpcRegExp(P1).RegExp[i] <> SearchRegExp[i] then\r\n//     begin\r\n//       Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(SearchRegExp[i]);\r\n//       break;\r\n//     end;\r\n//   if i > l then Compare:=l1-l2;\r\n    Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, SearchRegExp, False);\r\n  end;\r\nend;\r\n\r\nfunction  TRegExpCollection.Find(ARegExp:shortstring;var P: PpcRegExp):boolean;\r\nvar I : integer;\r\nbegin\r\n CompareModeInsert:=false;\r\n SearchRegExp:=ARegExp;\r\n if Search(nil,I) then\r\n  begin\r\n   P:=PpcRegExp(At(I));\r\n   Find:=true;\r\n  end\r\n else\r\n  begin\r\n   P:=nil;\r\n   Find:=false;\r\n  end;\r\n CompareModeInsert:=true;\r\nend;\r\n\r\nfunction TRegExpCollection.CheckNew(ARegExp:shortstring):PpcRegExp;\r\nvar\r\n P : PpcRegExp;\r\nbegin\r\n if not Find(ARegExp,P) then\r\n  begin\r\n   if Count = MaxRegExp then\r\n    AtFree(0);\r\n   P:=New(ppcRegExp,Init(ARegExp,PCRE_CASELESS,nil));\r\n   Insert(P);\r\n  end;\r\n CheckNew:=P;\r\nend;\r\n\r\nfunction pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean;\r\nvar\r\n PpcRE:PpcRegExp;\r\nbegin\r\n PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));\r\n pcGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));\r\n Dispose(PpcRE,Done);\r\nend;\r\n\r\nfunction pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string;\r\nvar\r\n PpcRE:PpcRegExp;\r\nbegin\r\n PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale));\r\n if PpcRE^.Search(pchar(AStr),Length(AStr)) then\r\n  pcGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)\r\n else\r\n  pcGrepSub:='';\r\n Dispose(PpcRE,Done);\r\nend;\r\n\r\nfunction pcFastGrepMatch(WildCard, aStr: string): Boolean;\r\nvar\r\n PpcRE:PpcRegExp;\r\nbegin\r\n PpcRE:=PRegExpCache^.CheckNew(WildCard);\r\n pcFastGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr));\r\nend;\r\n\r\nfunction pcFastGrepSub(WildCard, aStr, aRepl: string): string;\r\nvar\r\n PpcRE:PpcRegExp;\r\nbegin\r\n PpcRE:=PRegExpCache^.CheckNew(WildCard);\r\n if PpcRE^.Search(pchar(AStr),Length(AStr)) then\r\n  pcFastGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl)\r\n else\r\n  pcFastGrepSub:='';\r\nend;\r\n\r\n{$IFDEF PCRE_5_0}\r\nfunction pcGetVersion : pchar; assembler; {$FRAME-}{$USES none}\r\nasm\r\n  call pcre_version\r\nend;\r\n{$ENDIF PCRE_5_0}\r\n\r\nfunction pcError;\r\nvar P: ppcRegExp absolute pRegExp;\r\nbegin\r\n  Result := (P = nil) or P^.Error;\r\n  If Result and (P <> nil) then\r\n  begin\r\n{     if P^.ErrorPos = 0 then\r\n      MessageBox(GetString(erRegExpCompile)+'\"'+P^.ErrorStr+'\"', nil,mfConfirmation+mfOkButton)\r\n    else}\r\n      MessageBox(GetString(erRegExpCompile)+'\"'+P^.ErrorStr+'\"'+GetString(erRegExpCompPos),\r\n\t\t @P^.ErrorPos,mfConfirmation+mfOkButton);\r\n    Dispose(P, Done);\r\n    P:=nil;\r\n  end;\r\nend;\r\n\r\nfunction pcInit;\r\nvar Options : Integer;\r\nbegin\r\n  If CaseSens then Options := 0 else Options := PCRE_CASELESS;\r\n  Result := New( PpcRegExp, Init( Pattern,\r\n\t\t\t\t  {DefaultOptions}\r\n\t\t\t\t  startup.MiscMultiData.cfgRegEx.DefaultOptions or Options,\r\n\t\t\t\t  DefaultLocaleTable) );\r\nend;\r\n\r\nInitialization\r\n PRegExpCache:=New(PRegExpCollection,Init(64));\r\nFinalization\r\n Dispose(PRegExpCache,Done);\r\nEnd.\r\n"
  },
  {
    "path": "src/pcre/pcregrep.c",
    "content": "/*************************************************\n*               pcregrep program                 *\n*************************************************/\n\n/* This is a grep program that uses the PCRE regular expression library to do\nits pattern matching. On Unix-like, Windows, and native z/OS systems it can\nrecurse into directories, and in z/OS it can handle PDS files.\n\nNote that for native z/OS, in addition to defining the NATIVE_ZOS macro, an\nadditional header is required. That header is not included in the main PCRE\ndistribution because other apparatus is needed to compile pcregrep for z/OS.\nThe header can be found in the special z/OS distribution, which is available\nfrom www.zaconsultants.net or from www.cbttape.org.\n\n           Copyright (c) 1997-2014 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <ctype.h>\n#include <locale.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <errno.h>\n\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#ifdef SUPPORT_LIBZ\n#include <zlib.h>\n#endif\n\n#ifdef SUPPORT_LIBBZ2\n#include <bzlib.h>\n#endif\n\n#include \"pcre.h\"\n\n#define FALSE 0\n#define TRUE 1\n\ntypedef int BOOL;\n\n#define OFFSET_SIZE 99\n\n#if BUFSIZ > 8192\n#define MAXPATLEN BUFSIZ\n#else\n#define MAXPATLEN 8192\n#endif\n\n#define PATBUFSIZE (MAXPATLEN + 10)   /* Allows for prefix+suffix */\n\n/* Values for the \"filenames\" variable, which specifies options for file name\noutput. The order is important; it is assumed that a file name is wanted for\nall values greater than FN_DEFAULT. */\n\nenum { FN_NONE, FN_DEFAULT, FN_MATCH_ONLY, FN_NOMATCH_ONLY, FN_FORCE };\n\n/* File reading styles */\n\nenum { FR_PLAIN, FR_LIBZ, FR_LIBBZ2 };\n\n/* Actions for the -d and -D options */\n\nenum { dee_READ, dee_SKIP, dee_RECURSE };\nenum { DEE_READ, DEE_SKIP };\n\n/* Actions for special processing options (flag bits) */\n\n#define PO_WORD_MATCH     0x0001\n#define PO_LINE_MATCH     0x0002\n#define PO_FIXED_STRINGS  0x0004\n\n/* Line ending types */\n\nenum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF };\n\n/* Binary file options */\n\nenum { BIN_BINARY, BIN_NOMATCH, BIN_TEXT };\n\n/* In newer versions of gcc, with FORTIFY_SOURCE set (the default in some\nenvironments), a warning is issued if the value of fwrite() is ignored.\nUnfortunately, casting to (void) does not suppress the warning. To get round\nthis, we use a macro that compiles a fudge. Oddly, this does not also seem to\napply to fprintf(). */\n\n#define FWRITE(a,b,c,d) if (fwrite(a,b,c,d)) {}\n\n\n\n/*************************************************\n*               Global variables                 *\n*************************************************/\n\n/* Jeffrey Friedl has some debugging requirements that are not part of the\nregular code. */\n\n#ifdef JFRIEDL_DEBUG\nstatic int S_arg = -1;\nstatic unsigned int jfriedl_XR = 0; /* repeat regex attempt this many times */\nstatic unsigned int jfriedl_XT = 0; /* replicate text this many times */\nstatic const char *jfriedl_prefix = \"\";\nstatic const char *jfriedl_postfix = \"\";\n#endif\n\nstatic int  endlinetype;\n\nstatic char *colour_string = (char *)\"1;31\";\nstatic char *colour_option = NULL;\nstatic char *dee_option = NULL;\nstatic char *DEE_option = NULL;\nstatic char *locale = NULL;\nstatic char *main_buffer = NULL;\nstatic char *newline = NULL;\nstatic char *om_separator = (char *)\"\";\nstatic char *stdin_name = (char *)\"(standard input)\";\n\nstatic const unsigned char *pcretables = NULL;\n\nstatic int after_context = 0;\nstatic int before_context = 0;\nstatic int binary_files = BIN_BINARY;\nstatic int both_context = 0;\nstatic int bufthird = PCREGREP_BUFSIZE;\nstatic int bufsize = 3*PCREGREP_BUFSIZE;\n\n#if defined HAVE_WINDOWS_H && HAVE_WINDOWS_H\nstatic int dee_action = dee_SKIP;\n#else\nstatic int dee_action = dee_READ;\n#endif\n\nstatic int DEE_action = DEE_READ;\nstatic int error_count = 0;\nstatic int filenames = FN_DEFAULT;\nstatic int pcre_options = 0;\nstatic int process_options = 0;\n\n#ifdef SUPPORT_PCREGREP_JIT\nstatic int study_options = PCRE_STUDY_JIT_COMPILE;\n#else\nstatic int study_options = 0;\n#endif\n\nstatic unsigned long int match_limit = 0;\nstatic unsigned long int match_limit_recursion = 0;\n\nstatic BOOL count_only = FALSE;\nstatic BOOL do_colour = FALSE;\nstatic BOOL file_offsets = FALSE;\nstatic BOOL hyphenpending = FALSE;\nstatic BOOL invert = FALSE;\nstatic BOOL line_buffered = FALSE;\nstatic BOOL line_offsets = FALSE;\nstatic BOOL multiline = FALSE;\nstatic BOOL number = FALSE;\nstatic BOOL omit_zero_count = FALSE;\nstatic BOOL resource_error = FALSE;\nstatic BOOL quiet = FALSE;\nstatic BOOL show_only_matching = FALSE;\nstatic BOOL silent = FALSE;\nstatic BOOL utf8 = FALSE;\n\n/* Structure for list of --only-matching capturing numbers. */\n\ntypedef struct omstr {\n  struct omstr *next;\n  int groupnum;\n} omstr;\n\nstatic omstr *only_matching = NULL;\nstatic omstr *only_matching_last = NULL;\n\n/* Structure for holding the two variables that describe a number chain. */\n\ntypedef struct omdatastr {\n  omstr **anchor;\n  omstr **lastptr;\n} omdatastr;\n\nstatic omdatastr only_matching_data = { &only_matching, &only_matching_last };\n\n/* Structure for list of file names (for -f and --{in,ex}clude-from) */\n\ntypedef struct fnstr {\n  struct fnstr *next;\n  char *name;\n} fnstr;\n\nstatic fnstr *exclude_from = NULL;\nstatic fnstr *exclude_from_last = NULL;\nstatic fnstr *include_from = NULL;\nstatic fnstr *include_from_last = NULL;\n\nstatic fnstr *file_lists = NULL;\nstatic fnstr *file_lists_last = NULL;\nstatic fnstr *pattern_files = NULL;\nstatic fnstr *pattern_files_last = NULL;\n\n/* Structure for holding the two variables that describe a file name chain. */\n\ntypedef struct fndatastr {\n  fnstr **anchor;\n  fnstr **lastptr;\n} fndatastr;\n\nstatic fndatastr exclude_from_data = { &exclude_from, &exclude_from_last };\nstatic fndatastr include_from_data = { &include_from, &include_from_last };\nstatic fndatastr file_lists_data = { &file_lists, &file_lists_last };\nstatic fndatastr pattern_files_data = { &pattern_files, &pattern_files_last };\n\n/* Structure for pattern and its compiled form; used for matching patterns and\nalso for include/exclude patterns. */\n\ntypedef struct patstr {\n  struct patstr *next;\n  char *string;\n  pcre *compiled;\n  pcre_extra *hint;\n} patstr;\n\nstatic patstr *patterns = NULL;\nstatic patstr *patterns_last = NULL;\nstatic patstr *include_patterns = NULL;\nstatic patstr *include_patterns_last = NULL;\nstatic patstr *exclude_patterns = NULL;\nstatic patstr *exclude_patterns_last = NULL;\nstatic patstr *include_dir_patterns = NULL;\nstatic patstr *include_dir_patterns_last = NULL;\nstatic patstr *exclude_dir_patterns = NULL;\nstatic patstr *exclude_dir_patterns_last = NULL;\n\n/* Structure holding the two variables that describe a pattern chain. A pointer\nto such structures is used for each appropriate option. */\n\ntypedef struct patdatastr {\n  patstr **anchor;\n  patstr **lastptr;\n} patdatastr;\n\nstatic patdatastr match_patdata = { &patterns, &patterns_last };\nstatic patdatastr include_patdata = { &include_patterns, &include_patterns_last };\nstatic patdatastr exclude_patdata = { &exclude_patterns, &exclude_patterns_last };\nstatic patdatastr include_dir_patdata = { &include_dir_patterns, &include_dir_patterns_last };\nstatic patdatastr exclude_dir_patdata = { &exclude_dir_patterns, &exclude_dir_patterns_last };\n\nstatic patstr **incexlist[4] = { &include_patterns, &exclude_patterns,\n                                 &include_dir_patterns, &exclude_dir_patterns };\n\nstatic const char *incexname[4] = { \"--include\", \"--exclude\",\n                                    \"--include-dir\", \"--exclude-dir\" };\n\n/* Structure for options and list of them */\n\nenum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_LONGNUMBER,\n       OP_OP_NUMBER, OP_OP_NUMBERS, OP_PATLIST, OP_FILELIST, OP_BINFILES };\n\ntypedef struct option_item {\n  int type;\n  int one_char;\n  void *dataptr;\n  const char *long_name;\n  const char *help_text;\n} option_item;\n\n/* Options without a single-letter equivalent get a negative value. This can be\nused to identify them. */\n\n#define N_COLOUR       (-1)\n#define N_EXCLUDE      (-2)\n#define N_EXCLUDE_DIR  (-3)\n#define N_HELP         (-4)\n#define N_INCLUDE      (-5)\n#define N_INCLUDE_DIR  (-6)\n#define N_LABEL        (-7)\n#define N_LOCALE       (-8)\n#define N_NULL         (-9)\n#define N_LOFFSETS     (-10)\n#define N_FOFFSETS     (-11)\n#define N_LBUFFER      (-12)\n#define N_M_LIMIT      (-13)\n#define N_M_LIMIT_REC  (-14)\n#define N_BUFSIZE      (-15)\n#define N_NOJIT        (-16)\n#define N_FILE_LIST    (-17)\n#define N_BINARY_FILES (-18)\n#define N_EXCLUDE_FROM (-19)\n#define N_INCLUDE_FROM (-20)\n#define N_OM_SEPARATOR (-21)\n\nstatic option_item optionlist[] = {\n  { OP_NODATA,     N_NULL,   NULL,              \"\",              \"terminate options\" },\n  { OP_NODATA,     N_HELP,   NULL,              \"help\",          \"display this help and exit\" },\n  { OP_NUMBER,     'A',      &after_context,    \"after-context=number\", \"set number of following context lines\" },\n  { OP_NODATA,     'a',      NULL,              \"text\",          \"treat binary files as text\" },\n  { OP_NUMBER,     'B',      &before_context,   \"before-context=number\", \"set number of prior context lines\" },\n  { OP_BINFILES,   N_BINARY_FILES, NULL,        \"binary-files=word\", \"set treatment of binary files\" },\n  { OP_NUMBER,     N_BUFSIZE,&bufthird,         \"buffer-size=number\", \"set processing buffer size parameter\" },\n  { OP_OP_STRING,  N_COLOUR, &colour_option,    \"color=option\",  \"matched text color option\" },\n  { OP_OP_STRING,  N_COLOUR, &colour_option,    \"colour=option\", \"matched text colour option\" },\n  { OP_NUMBER,     'C',      &both_context,     \"context=number\", \"set number of context lines, before & after\" },\n  { OP_NODATA,     'c',      NULL,              \"count\",         \"print only a count of matching lines per FILE\" },\n  { OP_STRING,     'D',      &DEE_option,       \"devices=action\",\"how to handle devices, FIFOs, and sockets\" },\n  { OP_STRING,     'd',      &dee_option,       \"directories=action\", \"how to handle directories\" },\n  { OP_PATLIST,    'e',      &match_patdata,    \"regex(p)=pattern\", \"specify pattern (may be used more than once)\" },\n  { OP_NODATA,     'F',      NULL,              \"fixed-strings\", \"patterns are sets of newline-separated strings\" },\n  { OP_FILELIST,   'f',      &pattern_files_data, \"file=path\",   \"read patterns from file\" },\n  { OP_FILELIST,   N_FILE_LIST, &file_lists_data, \"file-list=path\",\"read files to search from file\" },\n  { OP_NODATA,     N_FOFFSETS, NULL,            \"file-offsets\",  \"output file offsets, not text\" },\n  { OP_NODATA,     'H',      NULL,              \"with-filename\", \"force the prefixing filename on output\" },\n  { OP_NODATA,     'h',      NULL,              \"no-filename\",   \"suppress the prefixing filename on output\" },\n  { OP_NODATA,     'I',      NULL,              \"\",              \"treat binary files as not matching (ignore)\" },\n  { OP_NODATA,     'i',      NULL,              \"ignore-case\",   \"ignore case distinctions\" },\n#ifdef SUPPORT_PCREGREP_JIT\n  { OP_NODATA,     N_NOJIT,  NULL,              \"no-jit\",        \"do not use just-in-time compiler optimization\" },\n#else\n  { OP_NODATA,     N_NOJIT,  NULL,              \"no-jit\",        \"ignored: this pcregrep does not support JIT\" },\n#endif\n  { OP_NODATA,     'l',      NULL,              \"files-with-matches\", \"print only FILE names containing matches\" },\n  { OP_NODATA,     'L',      NULL,              \"files-without-match\",\"print only FILE names not containing matches\" },\n  { OP_STRING,     N_LABEL,  &stdin_name,       \"label=name\",    \"set name for standard input\" },\n  { OP_NODATA,     N_LBUFFER, NULL,             \"line-buffered\", \"use line buffering\" },\n  { OP_NODATA,     N_LOFFSETS, NULL,            \"line-offsets\",  \"output line numbers and offsets, not text\" },\n  { OP_STRING,     N_LOCALE, &locale,           \"locale=locale\", \"use the named locale\" },\n  { OP_LONGNUMBER, N_M_LIMIT, &match_limit,     \"match-limit=number\", \"set PCRE match limit option\" },\n  { OP_LONGNUMBER, N_M_LIMIT_REC, &match_limit_recursion, \"recursion-limit=number\", \"set PCRE match recursion limit option\" },\n  { OP_NODATA,     'M',      NULL,              \"multiline\",     \"run in multiline mode\" },\n  { OP_STRING,     'N',      &newline,          \"newline=type\",  \"set newline type (CR, LF, CRLF, ANYCRLF or ANY)\" },\n  { OP_NODATA,     'n',      NULL,              \"line-number\",   \"print line number with output lines\" },\n  { OP_OP_NUMBERS, 'o',      &only_matching_data, \"only-matching=n\", \"show only the part of the line that matched\" },\n  { OP_STRING,     N_OM_SEPARATOR, &om_separator, \"om-separator=text\", \"set separator for multiple -o output\" },\n  { OP_NODATA,     'q',      NULL,              \"quiet\",         \"suppress output, just set return code\" },\n  { OP_NODATA,     'r',      NULL,              \"recursive\",     \"recursively scan sub-directories\" },\n  { OP_PATLIST,    N_EXCLUDE,&exclude_patdata,  \"exclude=pattern\",\"exclude matching files when recursing\" },\n  { OP_PATLIST,    N_INCLUDE,&include_patdata,  \"include=pattern\",\"include matching files when recursing\" },\n  { OP_PATLIST,    N_EXCLUDE_DIR,&exclude_dir_patdata, \"exclude-dir=pattern\",\"exclude matching directories when recursing\" },\n  { OP_PATLIST,    N_INCLUDE_DIR,&include_dir_patdata, \"include-dir=pattern\",\"include matching directories when recursing\" },\n  { OP_FILELIST,   N_EXCLUDE_FROM,&exclude_from_data, \"exclude-from=path\", \"read exclude list from file\" },\n  { OP_FILELIST,   N_INCLUDE_FROM,&include_from_data, \"include-from=path\", \"read include list from file\" },\n\n  /* These two were accidentally implemented with underscores instead of\n  hyphens in the option names. As this was not discovered for several releases,\n  the incorrect versions are left in the table for compatibility. However, the\n  --help function misses out any option that has an underscore in its name. */\n\n  { OP_PATLIST,   N_EXCLUDE_DIR,&exclude_dir_patdata, \"exclude_dir=pattern\",\"exclude matching directories when recursing\" },\n  { OP_PATLIST,   N_INCLUDE_DIR,&include_dir_patdata, \"include_dir=pattern\",\"include matching directories when recursing\" },\n\n#ifdef JFRIEDL_DEBUG\n  { OP_OP_NUMBER, 'S',      &S_arg,            \"jeffS\",         \"replace matched (sub)string with X\" },\n#endif\n  { OP_NODATA,    's',      NULL,              \"no-messages\",   \"suppress error messages\" },\n  { OP_NODATA,    'u',      NULL,              \"utf-8\",         \"use UTF-8 mode\" },\n  { OP_NODATA,    'V',      NULL,              \"version\",       \"print version information and exit\" },\n  { OP_NODATA,    'v',      NULL,              \"invert-match\",  \"select non-matching lines\" },\n  { OP_NODATA,    'w',      NULL,              \"word-regex(p)\", \"force patterns to match only as words\"  },\n  { OP_NODATA,    'x',      NULL,              \"line-regex(p)\", \"force patterns to match only whole lines\" },\n  { OP_NODATA,    0,        NULL,               NULL,            NULL }\n};\n\n/* Tables for prefixing and suffixing patterns, according to the -w, -x, and -F\noptions. These set the 1, 2, and 4 bits in process_options, respectively. Note\nthat the combination of -w and -x has the same effect as -x on its own, so we\ncan treat them as the same. Note that the MAXPATLEN macro assumes the longest\nprefix+suffix is 10 characters; if anything longer is added, it must be\nadjusted. */\n\nstatic const char *prefix[] = {\n  \"\", \"\\\\b\", \"^(?:\", \"^(?:\", \"\\\\Q\", \"\\\\b\\\\Q\", \"^(?:\\\\Q\", \"^(?:\\\\Q\" };\n\nstatic const char *suffix[] = {\n  \"\", \"\\\\b\", \")$\",   \")$\",   \"\\\\E\", \"\\\\E\\\\b\", \"\\\\E)$\",   \"\\\\E)$\" };\n\n/* UTF-8 tables - used only when the newline setting is \"any\". */\n\nconst int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};\n\nconst char utf8_table4[] = {\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,\n  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };\n\n\n\n/*************************************************\n*         Exit from the program                  *\n*************************************************/\n\n/* If there has been a resource error, give a suitable message.\n\nArgument:  the return code\nReturns:   does not return\n*/\n\nstatic void\npcregrep_exit(int rc)\n{\nif (resource_error)\n  {\n  fprintf(stderr, \"pcregrep: Error %d, %d or %d means that a resource limit \"\n    \"was exceeded.\\n\", PCRE_ERROR_MATCHLIMIT, PCRE_ERROR_RECURSIONLIMIT,\n    PCRE_ERROR_JIT_STACKLIMIT);\n  fprintf(stderr, \"pcregrep: Check your regex for nested unlimited loops.\\n\");\n  }\nexit(rc);\n}\n\n\n/*************************************************\n*          Add item to chain of patterns         *\n*************************************************/\n\n/* Used to add an item onto a chain, or just return an unconnected item if the\n\"after\" argument is NULL.\n\nArguments:\n  s          pattern string to add\n  after      if not NULL points to item to insert after\n\nReturns:     new pattern block or NULL on error\n*/\n\nstatic patstr *\nadd_pattern(char *s, patstr *after)\n{\npatstr *p = (patstr *)malloc(sizeof(patstr));\nif (p == NULL)\n  {\n  fprintf(stderr, \"pcregrep: malloc failed\\n\");\n  pcregrep_exit(2);\n  }\nif (strlen(s) > MAXPATLEN)\n  {\n  fprintf(stderr, \"pcregrep: pattern is too long (limit is %d bytes)\\n\",\n    MAXPATLEN);\n  free(p);\n  return NULL;\n  }\np->next = NULL;\np->string = s;\np->compiled = NULL;\np->hint = NULL;\n\nif (after != NULL)\n  {\n  p->next = after->next;\n  after->next = p;\n  }\nreturn p;\n}\n\n\n/*************************************************\n*           Free chain of patterns               *\n*************************************************/\n\n/* Used for several chains of patterns.\n\nArgument: pointer to start of chain\nReturns:  nothing\n*/\n\nstatic void\nfree_pattern_chain(patstr *pc)\n{\nwhile (pc != NULL)\n  {\n  patstr *p = pc;\n  pc = p->next;\n  if (p->hint != NULL) pcre_free_study(p->hint);\n  if (p->compiled != NULL) pcre_free(p->compiled);\n  free(p);\n  }\n}\n\n\n/*************************************************\n*           Free chain of file names             *\n*************************************************/\n\n/*\nArgument: pointer to start of chain\nReturns:  nothing\n*/\n\nstatic void\nfree_file_chain(fnstr *fn)\n{\nwhile (fn != NULL)\n  {\n  fnstr *f = fn;\n  fn = f->next;\n  free(f);\n  }\n}\n\n\n/*************************************************\n*            OS-specific functions               *\n*************************************************/\n\n/* These functions are defined so that they can be made system specific.\nAt present there are versions for Unix-style environments, Windows, native\nz/OS, and \"no support\". */\n\n\n/************* Directory scanning Unix-style and z/OS ***********/\n\n#if (defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H) || defined NATIVE_ZOS\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <dirent.h>\n\n#if defined NATIVE_ZOS\n/************* Directory and PDS/E scanning for z/OS ***********/\n/************* z/OS looks mostly like Unix with USS ************/\n/* However, z/OS needs the #include statements in this header */\n#include \"pcrzosfs.h\"\n/* That header is not included in the main PCRE distribution because\n   other apparatus is needed to compile pcregrep for z/OS. The header\n   can be found in the special z/OS distribution, which is available\n   from www.zaconsultants.net or from www.cbttape.org. */\n#endif\n\ntypedef DIR directory_type;\n#define FILESEP '/'\n\nstatic int\nisdirectory(char *filename)\n{\nstruct stat statbuf;\nif (stat(filename, &statbuf) < 0)\n  return 0;        /* In the expectation that opening as a file will fail */\nreturn (statbuf.st_mode & S_IFMT) == S_IFDIR;\n}\n\nstatic directory_type *\nopendirectory(char *filename)\n{\nreturn opendir(filename);\n}\n\nstatic char *\nreaddirectory(directory_type *dir)\n{\nfor (;;)\n  {\n  struct dirent *dent = readdir(dir);\n  if (dent == NULL) return NULL;\n  if (strcmp(dent->d_name, \".\") != 0 && strcmp(dent->d_name, \"..\") != 0)\n    return dent->d_name;\n  }\n/* Control never reaches here */\n}\n\nstatic void\nclosedirectory(directory_type *dir)\n{\nclosedir(dir);\n}\n\n\n/************* Test for regular file, Unix-style **********/\n\nstatic int\nisregfile(char *filename)\n{\nstruct stat statbuf;\nif (stat(filename, &statbuf) < 0)\n  return 1;        /* In the expectation that opening as a file will fail */\nreturn (statbuf.st_mode & S_IFMT) == S_IFREG;\n}\n\n\n#if defined NATIVE_ZOS\n/************* Test for a terminal in z/OS **********/\n/* isatty() does not work in a TSO environment, so always give FALSE.*/\n\nstatic BOOL\nis_stdout_tty(void)\n{\nreturn FALSE;\n}\n\nstatic BOOL\nis_file_tty(FILE *f)\n{\nreturn FALSE;\n}\n\n\n/************* Test for a terminal, Unix-style **********/\n\n#else\nstatic BOOL\nis_stdout_tty(void)\n{\nreturn isatty(fileno(stdout));\n}\n\nstatic BOOL\nis_file_tty(FILE *f)\n{\nreturn isatty(fileno(f));\n}\n#endif\n\n/* End of Unix-style or native z/OS environment functions. */\n\n\n/************* Directory scanning in Windows ***********/\n\n/* I (Philip Hazel) have no means of testing this code. It was contributed by\nLionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES\nwhen it did not exist. David Byron added a patch that moved the #include of\n<windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after.\nThe double test below stops gcc 4.4.4 grumbling that HAVE_WINDOWS_H is\nundefined when it is indeed undefined. */\n\n#elif defined HAVE_WINDOWS_H && HAVE_WINDOWS_H\n\n#ifndef STRICT\n# define STRICT\n#endif\n#ifndef WIN32_LEAN_AND_MEAN\n# define WIN32_LEAN_AND_MEAN\n#endif\n\n#include <windows.h>\n\n#ifndef INVALID_FILE_ATTRIBUTES\n#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF\n#endif\n\ntypedef struct directory_type\n{\nHANDLE handle;\nBOOL first;\nWIN32_FIND_DATA data;\n} directory_type;\n\n#define FILESEP '/'\n\nint\nisdirectory(char *filename)\n{\nDWORD attr = GetFileAttributes(filename);\nif (attr == INVALID_FILE_ATTRIBUTES)\n  return 0;\nreturn (attr & FILE_ATTRIBUTE_DIRECTORY) != 0;\n}\n\ndirectory_type *\nopendirectory(char *filename)\n{\nsize_t len;\nchar *pattern;\ndirectory_type *dir;\nDWORD err;\nlen = strlen(filename);\npattern = (char *)malloc(len + 3);\ndir = (directory_type *)malloc(sizeof(*dir));\nif ((pattern == NULL) || (dir == NULL))\n  {\n  fprintf(stderr, \"pcregrep: malloc failed\\n\");\n  pcregrep_exit(2);\n  }\nmemcpy(pattern, filename, len);\nmemcpy(&(pattern[len]), \"\\\\*\", 3);\ndir->handle = FindFirstFile(pattern, &(dir->data));\nif (dir->handle != INVALID_HANDLE_VALUE)\n  {\n  free(pattern);\n  dir->first = TRUE;\n  return dir;\n  }\nerr = GetLastError();\nfree(pattern);\nfree(dir);\nerrno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT;\nreturn NULL;\n}\n\nchar *\nreaddirectory(directory_type *dir)\n{\nfor (;;)\n  {\n  if (!dir->first)\n    {\n    if (!FindNextFile(dir->handle, &(dir->data)))\n      return NULL;\n    }\n  else\n    {\n    dir->first = FALSE;\n    }\n  if (strcmp(dir->data.cFileName, \".\") != 0 && strcmp(dir->data.cFileName, \"..\") != 0)\n    return dir->data.cFileName;\n  }\n#ifndef _MSC_VER\nreturn NULL;   /* Keep compiler happy; never executed */\n#endif\n}\n\nvoid\nclosedirectory(directory_type *dir)\n{\nFindClose(dir->handle);\nfree(dir);\n}\n\n\n/************* Test for regular file in Windows **********/\n\n/* I don't know how to do this, or if it can be done; assume all paths are\nregular if they are not directories. */\n\nint isregfile(char *filename)\n{\nreturn !isdirectory(filename);\n}\n\n\n/************* Test for a terminal in Windows **********/\n\n/* I don't know how to do this; assume never */\n\nstatic BOOL\nis_stdout_tty(void)\n{\nreturn FALSE;\n}\n\nstatic BOOL\nis_file_tty(FILE *f)\n{\nreturn FALSE;\n}\n\n/* End of Windows functions */\n\n\n/************* Directory scanning when we can't do it ***********/\n\n/* The type is void, and apart from isdirectory(), the functions do nothing. */\n\n#else\n\n#define FILESEP 0\ntypedef void directory_type;\n\nint isdirectory(char *filename) { return 0; }\ndirectory_type * opendirectory(char *filename) { return (directory_type*)0;}\nchar *readdirectory(directory_type *dir) { return (char*)0;}\nvoid closedirectory(directory_type *dir) {}\n\n\n/************* Test for regular file when we can't do it **********/\n\n/* Assume all files are regular. */\n\nint isregfile(char *filename) { return 1; }\n\n\n/************* Test for a terminal when we can't do it **********/\n\nstatic BOOL\nis_stdout_tty(void)\n{\nreturn FALSE;\n}\n\nstatic BOOL\nis_file_tty(FILE *f)\n{\nreturn FALSE;\n}\n\n#endif  /* End of system-specific functions */\n\n\n\n#ifndef HAVE_STRERROR\n/*************************************************\n*     Provide strerror() for non-ANSI libraries  *\n*************************************************/\n\n/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()\nin their libraries, but can provide the same facility by this simple\nalternative function. */\n\nextern int   sys_nerr;\nextern char *sys_errlist[];\n\nchar *\nstrerror(int n)\n{\nif (n < 0 || n >= sys_nerr) return \"unknown error number\";\nreturn sys_errlist[n];\n}\n#endif /* HAVE_STRERROR */\n\n\n\n/*************************************************\n*                Usage function                  *\n*************************************************/\n\nstatic int\nusage(int rc)\n{\noption_item *op;\nfprintf(stderr, \"Usage: pcregrep [-\");\nfor (op = optionlist; op->one_char != 0; op++)\n  {\n  if (op->one_char > 0) fprintf(stderr, \"%c\", op->one_char);\n  }\nfprintf(stderr, \"] [long options] [pattern] [files]\\n\");\nfprintf(stderr, \"Type `pcregrep --help' for more information and the long \"\n  \"options.\\n\");\nreturn rc;\n}\n\n\n\n/*************************************************\n*                Help function                   *\n*************************************************/\n\nstatic void\nhelp(void)\n{\noption_item *op;\n\nprintf(\"Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\\n\");\nprintf(\"Search for PATTERN in each FILE or standard input.\\n\");\nprintf(\"PATTERN must be present if neither -e nor -f is used.\\n\");\nprintf(\"\\\"-\\\" can be used as a file name to mean STDIN.\\n\");\n\n#ifdef SUPPORT_LIBZ\nprintf(\"Files whose names end in .gz are read using zlib.\\n\");\n#endif\n\n#ifdef SUPPORT_LIBBZ2\nprintf(\"Files whose names end in .bz2 are read using bzlib2.\\n\");\n#endif\n\n#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2\nprintf(\"Other files and the standard input are read as plain files.\\n\\n\");\n#else\nprintf(\"All files are read as plain files, without any interpretation.\\n\\n\");\n#endif\n\nprintf(\"Example: pcregrep -i 'hello.*world' menu.h main.c\\n\\n\");\nprintf(\"Options:\\n\");\n\nfor (op = optionlist; op->one_char != 0; op++)\n  {\n  int n;\n  char s[4];\n\n  /* Two options were accidentally implemented and documented with underscores\n  instead of hyphens in their names, something that was not noticed for quite a\n  few releases. When fixing this, I left the underscored versions in the list\n  in case people were using them. However, we don't want to display them in the\n  help data. There are no other options that contain underscores, and we do not\n  expect ever to implement such options. Therefore, just omit any option that\n  contains an underscore. */\n\n  if (strchr(op->long_name, '_') != NULL) continue;\n\n  if (op->one_char > 0 && (op->long_name)[0] == 0)\n    n = 31 - printf(\"  -%c\", op->one_char);\n  else\n    {\n    if (op->one_char > 0) sprintf(s, \"-%c,\", op->one_char);\n      else strcpy(s, \"   \");\n    n = 31 - printf(\"  %s --%s\", s, op->long_name);\n    }\n\n  if (n < 1) n = 1;\n  printf(\"%.*s%s\\n\", n, \"                           \", op->help_text);\n  }\n\nprintf(\"\\nNumbers may be followed by K or M, e.g. --buffer-size=100K.\\n\");\nprintf(\"The default value for --buffer-size is %d.\\n\", PCREGREP_BUFSIZE);\nprintf(\"When reading patterns or file names from a file, trailing white\\n\");\nprintf(\"space is removed and blank lines are ignored.\\n\");\nprintf(\"The maximum size of any pattern is %d bytes.\\n\", MAXPATLEN);\n\nprintf(\"\\nWith no FILEs, read standard input. If fewer than two FILEs given, assume -h.\\n\");\nprintf(\"Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\\n\");\n}\n\n\n\n/*************************************************\n*            Test exclude/includes               *\n*************************************************/\n\n/* If any exclude pattern matches, the path is excluded. Otherwise, unless\nthere are no includes, the path must match an include pattern.\n\nArguments:\n  path      the path to be matched\n  ip        the chain of include patterns\n  ep        the chain of exclude patterns\n\nReturns:    TRUE if the path is not excluded\n*/\n\nstatic BOOL\ntest_incexc(char *path, patstr *ip, patstr *ep)\n{\nint plen = strlen(path);\n\nfor (; ep != NULL; ep = ep->next)\n  {\n  if (pcre_exec(ep->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0)\n    return FALSE;\n  }\n\nif (ip == NULL) return TRUE;\n\nfor (; ip != NULL; ip = ip->next)\n  {\n  if (pcre_exec(ip->compiled, NULL, path, plen, 0, 0, NULL, 0) >= 0)\n    return TRUE;\n  }\n\nreturn FALSE;\n}\n\n\n\n/*************************************************\n*         Decode integer argument value          *\n*************************************************/\n\n/* Integer arguments can be followed by K or M. Avoid the use of strtoul()\nbecause SunOS4 doesn't have it. This is used only for unpicking arguments, so\njust keep it simple.\n\nArguments:\n  option_data   the option data string\n  op            the option item (for error messages)\n  longop        TRUE if option given in long form\n\nReturns:        a long integer\n*/\n\nstatic long int\ndecode_number(char *option_data, option_item *op, BOOL longop)\n{\nunsigned long int n = 0;\nchar *endptr = option_data;\nwhile (*endptr != 0 && isspace((unsigned char)(*endptr))) endptr++;\nwhile (isdigit((unsigned char)(*endptr)))\n  n = n * 10 + (int)(*endptr++ - '0');\nif (toupper(*endptr) == 'K')\n  {\n  n *= 1024;\n  endptr++;\n  }\nelse if (toupper(*endptr) == 'M')\n  {\n  n *= 1024*1024;\n  endptr++;\n  }\n\nif (*endptr != 0)   /* Error */\n  {\n  if (longop)\n    {\n    char *equals = strchr(op->long_name, '=');\n    int nlen = (equals == NULL)? (int)strlen(op->long_name) :\n      (int)(equals - op->long_name);\n    fprintf(stderr, \"pcregrep: Malformed number \\\"%s\\\" after --%.*s\\n\",\n      option_data, nlen, op->long_name);\n    }\n  else\n    fprintf(stderr, \"pcregrep: Malformed number \\\"%s\\\" after -%c\\n\",\n      option_data, op->one_char);\n  pcregrep_exit(usage(2));\n  }\n\nreturn n;\n}\n\n\n\n/*************************************************\n*       Add item to a chain of numbers           *\n*************************************************/\n\n/* Used to add an item onto a chain, or just return an unconnected item if the\n\"after\" argument is NULL.\n\nArguments:\n  n          the number to add\n  after      if not NULL points to item to insert after\n\nReturns:     new number block\n*/\n\nstatic omstr *\nadd_number(int n, omstr *after)\n{\nomstr *om = (omstr *)malloc(sizeof(omstr));\n\nif (om == NULL)\n  {\n  fprintf(stderr, \"pcregrep: malloc failed\\n\");\n  pcregrep_exit(2);\n  }\nom->next = NULL;\nom->groupnum = n;\n\nif (after != NULL)\n  {\n  om->next = after->next;\n  after->next = om;\n  }\nreturn om;\n}\n\n\n\n/*************************************************\n*            Read one line of input              *\n*************************************************/\n\n/* Normally, input is read using fread() into a large buffer, so many lines may\nbe read at once. However, doing this for tty input means that no output appears\nuntil a lot of input has been typed. Instead, tty input is handled line by\nline. We cannot use fgets() for this, because it does not stop at a binary\nzero, and therefore there is no way of telling how many characters it has read,\nbecause there may be binary zeros embedded in the data.\n\nArguments:\n  buffer     the buffer to read into\n  length     the maximum number of characters to read\n  f          the file\n\nReturns:     the number of characters read, zero at end of file\n*/\n\nstatic unsigned int\nread_one_line(char *buffer, int length, FILE *f)\n{\nint c;\nint yield = 0;\nwhile ((c = fgetc(f)) != EOF)\n  {\n  buffer[yield++] = c;\n  if (c == '\\n' || yield >= length) break;\n  }\nreturn yield;\n}\n\n\n\n/*************************************************\n*             Find end of line                   *\n*************************************************/\n\n/* The length of the endline sequence that is found is set via lenptr. This may\nbe zero at the very end of the file if there is no line-ending sequence there.\n\nArguments:\n  p         current position in line\n  endptr    end of available data\n  lenptr    where to put the length of the eol sequence\n\nReturns:    pointer after the last byte of the line,\n            including the newline byte(s)\n*/\n\nstatic char *\nend_of_line(char *p, char *endptr, int *lenptr)\n{\nswitch(endlinetype)\n  {\n  default:      /* Just in case */\n  case EL_LF:\n  while (p < endptr && *p != '\\n') p++;\n  if (p < endptr)\n    {\n    *lenptr = 1;\n    return p + 1;\n    }\n  *lenptr = 0;\n  return endptr;\n\n  case EL_CR:\n  while (p < endptr && *p != '\\r') p++;\n  if (p < endptr)\n    {\n    *lenptr = 1;\n    return p + 1;\n    }\n  *lenptr = 0;\n  return endptr;\n\n  case EL_CRLF:\n  for (;;)\n    {\n    while (p < endptr && *p != '\\r') p++;\n    if (++p >= endptr)\n      {\n      *lenptr = 0;\n      return endptr;\n      }\n    if (*p == '\\n')\n      {\n      *lenptr = 2;\n      return p + 1;\n      }\n    }\n  break;\n\n  case EL_ANYCRLF:\n  while (p < endptr)\n    {\n    int extra = 0;\n    register int c = *((unsigned char *)p);\n\n    if (utf8 && c >= 0xc0)\n      {\n      int gcii, gcss;\n      extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */\n      gcss = 6*extra;\n      c = (c & utf8_table3[extra]) << gcss;\n      for (gcii = 1; gcii <= extra; gcii++)\n        {\n        gcss -= 6;\n        c |= (p[gcii] & 0x3f) << gcss;\n        }\n      }\n\n    p += 1 + extra;\n\n    switch (c)\n      {\n      case '\\n':\n      *lenptr = 1;\n      return p;\n\n      case '\\r':\n      if (p < endptr && *p == '\\n')\n        {\n        *lenptr = 2;\n        p++;\n        }\n      else *lenptr = 1;\n      return p;\n\n      default:\n      break;\n      }\n    }   /* End of loop for ANYCRLF case */\n\n  *lenptr = 0;  /* Must have hit the end */\n  return endptr;\n\n  case EL_ANY:\n  while (p < endptr)\n    {\n    int extra = 0;\n    register int c = *((unsigned char *)p);\n\n    if (utf8 && c >= 0xc0)\n      {\n      int gcii, gcss;\n      extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */\n      gcss = 6*extra;\n      c = (c & utf8_table3[extra]) << gcss;\n      for (gcii = 1; gcii <= extra; gcii++)\n        {\n        gcss -= 6;\n        c |= (p[gcii] & 0x3f) << gcss;\n        }\n      }\n\n    p += 1 + extra;\n\n    switch (c)\n      {\n      case '\\n':    /* LF */\n      case '\\v':    /* VT */\n      case '\\f':    /* FF */\n      *lenptr = 1;\n      return p;\n\n      case '\\r':    /* CR */\n      if (p < endptr && *p == '\\n')\n        {\n        *lenptr = 2;\n        p++;\n        }\n      else *lenptr = 1;\n      return p;\n\n#ifndef EBCDIC\n      case 0x85:    /* Unicode NEL */\n      *lenptr = utf8? 2 : 1;\n      return p;\n\n      case 0x2028:  /* Unicode LS */\n      case 0x2029:  /* Unicode PS */\n      *lenptr = 3;\n      return p;\n#endif  /* Not EBCDIC */\n\n      default:\n      break;\n      }\n    }   /* End of loop for ANY case */\n\n  *lenptr = 0;  /* Must have hit the end */\n  return endptr;\n  }     /* End of overall switch */\n}\n\n\n\n/*************************************************\n*         Find start of previous line            *\n*************************************************/\n\n/* This is called when looking back for before lines to print.\n\nArguments:\n  p         start of the subsequent line\n  startptr  start of available data\n\nReturns:    pointer to the start of the previous line\n*/\n\nstatic char *\nprevious_line(char *p, char *startptr)\n{\nswitch(endlinetype)\n  {\n  default:      /* Just in case */\n  case EL_LF:\n  p--;\n  while (p > startptr && p[-1] != '\\n') p--;\n  return p;\n\n  case EL_CR:\n  p--;\n  while (p > startptr && p[-1] != '\\n') p--;\n  return p;\n\n  case EL_CRLF:\n  for (;;)\n    {\n    p -= 2;\n    while (p > startptr && p[-1] != '\\n') p--;\n    if (p <= startptr + 1 || p[-2] == '\\r') return p;\n    }\n  /* Control can never get here */\n\n  case EL_ANY:\n  case EL_ANYCRLF:\n  if (*(--p) == '\\n' && p > startptr && p[-1] == '\\r') p--;\n  if (utf8) while ((*p & 0xc0) == 0x80) p--;\n\n  while (p > startptr)\n    {\n    register unsigned int c;\n    char *pp = p - 1;\n\n    if (utf8)\n      {\n      int extra = 0;\n      while ((*pp & 0xc0) == 0x80) pp--;\n      c = *((unsigned char *)pp);\n      if (c >= 0xc0)\n        {\n        int gcii, gcss;\n        extra = utf8_table4[c & 0x3f];  /* Number of additional bytes */\n        gcss = 6*extra;\n        c = (c & utf8_table3[extra]) << gcss;\n        for (gcii = 1; gcii <= extra; gcii++)\n          {\n          gcss -= 6;\n          c |= (pp[gcii] & 0x3f) << gcss;\n          }\n        }\n      }\n    else c = *((unsigned char *)pp);\n\n    if (endlinetype == EL_ANYCRLF) switch (c)\n      {\n      case '\\n':    /* LF */\n      case '\\r':    /* CR */\n      return p;\n\n      default:\n      break;\n      }\n\n    else switch (c)\n      {\n      case '\\n':    /* LF */\n      case '\\v':    /* VT */\n      case '\\f':    /* FF */\n      case '\\r':    /* CR */\n#ifndef EBCDIE\n      case 0x85:    /* Unicode NEL */\n      case 0x2028:  /* Unicode LS */\n      case 0x2029:  /* Unicode PS */\n#endif  /* Not EBCDIC */\n      return p;\n\n      default:\n      break;\n      }\n\n    p = pp;  /* Back one character */\n    }        /* End of loop for ANY case */\n\n  return startptr;  /* Hit start of data */\n  }     /* End of overall switch */\n}\n\n\n\n\n\n/*************************************************\n*       Print the previous \"after\" lines         *\n*************************************************/\n\n/* This is called if we are about to lose said lines because of buffer filling,\nand at the end of the file. The data in the line is written using fwrite() so\nthat a binary zero does not terminate it.\n\nArguments:\n  lastmatchnumber   the number of the last matching line, plus one\n  lastmatchrestart  where we restarted after the last match\n  endptr            end of available data\n  printname         filename for printing\n\nReturns:            nothing\n*/\n\nstatic void\ndo_after_lines(unsigned long int lastmatchnumber, char *lastmatchrestart,\n  char *endptr, char *printname)\n{\nif (after_context > 0 && lastmatchnumber > 0)\n  {\n  int count = 0;\n  while (lastmatchrestart < endptr && count++ < after_context)\n    {\n    int ellength;\n    char *pp = lastmatchrestart;\n    if (printname != NULL) fprintf(stdout, \"%s-\", printname);\n    if (number) fprintf(stdout, \"%lu-\", lastmatchnumber++);\n    pp = end_of_line(pp, endptr, &ellength);\n    FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);\n    lastmatchrestart = pp;\n    }\n  hyphenpending = TRUE;\n  }\n}\n\n\n\n/*************************************************\n*   Apply patterns to subject till one matches   *\n*************************************************/\n\n/* This function is called to run through all patterns, looking for a match. It\nis used multiple times for the same subject when colouring is enabled, in order\nto find all possible matches.\n\nArguments:\n  matchptr     the start of the subject\n  length       the length of the subject to match\n  options      options for pcre_exec\n  startoffset  where to start matching\n  offsets      the offets vector to fill in\n  mrc          address of where to put the result of pcre_exec()\n\nReturns:      TRUE if there was a match\n              FALSE if there was no match\n              invert if there was a non-fatal error\n*/\n\nstatic BOOL\nmatch_patterns(char *matchptr, size_t length, unsigned int options,\n  int startoffset, int *offsets, int *mrc)\n{\nint i;\nsize_t slen = length;\npatstr *p = patterns;\nconst char *msg = \"this text:\\n\\n\";\n\nif (slen > 200)\n  {\n  slen = 200;\n  msg = \"text that starts:\\n\\n\";\n  }\nfor (i = 1; p != NULL; p = p->next, i++)\n  {\n  *mrc = pcre_exec(p->compiled, p->hint, matchptr, (int)length,\n    startoffset, options, offsets, OFFSET_SIZE);\n  if (*mrc >= 0) return TRUE;\n  if (*mrc == PCRE_ERROR_NOMATCH) continue;\n  fprintf(stderr, \"pcregrep: pcre_exec() gave error %d while matching \", *mrc);\n  if (patterns->next != NULL) fprintf(stderr, \"pattern number %d to \", i);\n  fprintf(stderr, \"%s\", msg);\n  FWRITE(matchptr, 1, slen, stderr);   /* In case binary zero included */\n  fprintf(stderr, \"\\n\\n\");\n  if (*mrc == PCRE_ERROR_MATCHLIMIT || *mrc == PCRE_ERROR_RECURSIONLIMIT ||\n      *mrc == PCRE_ERROR_JIT_STACKLIMIT)\n    resource_error = TRUE;\n  if (error_count++ > 20)\n    {\n    fprintf(stderr, \"pcregrep: Too many errors - abandoned.\\n\");\n    pcregrep_exit(2);\n    }\n  return invert;    /* No more matching; don't show the line again */\n  }\n\nreturn FALSE;  /* No match, no errors */\n}\n\n\n\n/*************************************************\n*            Grep an individual file             *\n*************************************************/\n\n/* This is called from grep_or_recurse() below. It uses a buffer that is three\ntimes the value of bufthird. The matching point is never allowed to stray into\nthe top third of the buffer, thus keeping more of the file available for\ncontext printing or for multiline scanning. For large files, the pointer will\nbe in the middle third most of the time, so the bottom third is available for\n\"before\" context printing.\n\nArguments:\n  handle       the fopened FILE stream for a normal file\n               the gzFile pointer when reading is via libz\n               the BZFILE pointer when reading is via libbz2\n  frtype       FR_PLAIN, FR_LIBZ, or FR_LIBBZ2\n  filename     the file name or NULL (for errors)\n  printname    the file name if it is to be printed for each match\n               or NULL if the file name is not to be printed\n               it cannot be NULL if filenames[_nomatch]_only is set\n\nReturns:       0 if there was at least one match\n               1 otherwise (no matches)\n               2 if an overlong line is encountered\n               3 if there is a read error on a .bz2 file\n*/\n\nstatic int\npcregrep(void *handle, int frtype, char *filename, char *printname)\n{\nint rc = 1;\nint filepos = 0;\nint offsets[OFFSET_SIZE];\nunsigned long int linenumber = 1;\nunsigned long int lastmatchnumber = 0;\nunsigned long int count = 0;\nchar *lastmatchrestart = NULL;\nchar *ptr = main_buffer;\nchar *endptr;\nsize_t bufflength;\nBOOL binary = FALSE;\nBOOL endhyphenpending = FALSE;\nBOOL input_line_buffered = line_buffered;\nFILE *in = NULL;                    /* Ensure initialized */\n\n#ifdef SUPPORT_LIBZ\ngzFile ingz = NULL;\n#endif\n\n#ifdef SUPPORT_LIBBZ2\nBZFILE *inbz2 = NULL;\n#endif\n\n\n/* Do the first read into the start of the buffer and set up the pointer to end\nof what we have. In the case of libz, a non-zipped .gz file will be read as a\nplain file. However, if a .bz2 file isn't actually bzipped, the first read will\nfail. */\n\n(void)frtype;\n\n#ifdef SUPPORT_LIBZ\nif (frtype == FR_LIBZ)\n  {\n  ingz = (gzFile)handle;\n  bufflength = gzread (ingz, main_buffer, bufsize);\n  }\nelse\n#endif\n\n#ifdef SUPPORT_LIBBZ2\nif (frtype == FR_LIBBZ2)\n  {\n  inbz2 = (BZFILE *)handle;\n  bufflength = BZ2_bzread(inbz2, main_buffer, bufsize);\n  if ((int)bufflength < 0) return 2;   /* Gotcha: bufflength is size_t; */\n  }                                    /* without the cast it is unsigned. */\nelse\n#endif\n\n  {\n  in = (FILE *)handle;\n  if (is_file_tty(in)) input_line_buffered = TRUE;\n  bufflength = input_line_buffered?\n    read_one_line(main_buffer, bufsize, in) :\n    fread(main_buffer, 1, bufsize, in);\n  }\n\nendptr = main_buffer + bufflength;\n\n/* Unless binary-files=text, see if we have a binary file. This uses the same\nrule as GNU grep, namely, a search for a binary zero byte near the start of the\nfile. */\n\nif (binary_files != BIN_TEXT)\n  {\n  binary =\n    memchr(main_buffer, 0, (bufflength > 1024)? 1024 : bufflength) != NULL;\n  if (binary && binary_files == BIN_NOMATCH) return 1;\n  }\n\n/* Loop while the current pointer is not at the end of the file. For large\nfiles, endptr will be at the end of the buffer when we are in the middle of the\nfile, but ptr will never get there, because as soon as it gets over 2/3 of the\nway, the buffer is shifted left and re-filled. */\n\nwhile (ptr < endptr)\n  {\n  int endlinelength;\n  int mrc = 0;\n  int startoffset = 0;\n  int prevoffsets[2];\n  unsigned int options = 0;\n  BOOL match;\n  char *matchptr = ptr;\n  char *t = ptr;\n  size_t length, linelength;\n\n  prevoffsets[0] = prevoffsets[1] = -1;\n\n  /* At this point, ptr is at the start of a line. We need to find the length\n  of the subject string to pass to pcre_exec(). In multiline mode, it is the\n  length remainder of the data in the buffer. Otherwise, it is the length of\n  the next line, excluding the terminating newline. After matching, we always\n  advance by the length of the next line. In multiline mode the PCRE_FIRSTLINE\n  option is used for compiling, so that any match is constrained to be in the\n  first line. */\n\n  t = end_of_line(t, endptr, &endlinelength);\n  linelength = t - ptr - endlinelength;\n  length = multiline? (size_t)(endptr - ptr) : linelength;\n\n  /* Check to see if the line we are looking at extends right to the very end\n  of the buffer without a line terminator. This means the line is too long to\n  handle. */\n\n  if (endlinelength == 0 && t == main_buffer + bufsize)\n    {\n    fprintf(stderr, \"pcregrep: line %lu%s%s is too long for the internal buffer\\n\"\n                    \"pcregrep: check the --buffer-size option\\n\",\n                    linenumber,\n                    (filename == NULL)? \"\" : \" of file \",\n                    (filename == NULL)? \"\" : filename);\n    return 2;\n    }\n\n  /* Extra processing for Jeffrey Friedl's debugging. */\n\n#ifdef JFRIEDL_DEBUG\n  if (jfriedl_XT || jfriedl_XR)\n  {\n#     include <sys/time.h>\n#     include <time.h>\n      struct timeval start_time, end_time;\n      struct timezone dummy;\n      int i;\n\n      if (jfriedl_XT)\n      {\n          unsigned long newlen = length * jfriedl_XT + strlen(jfriedl_prefix) + strlen(jfriedl_postfix);\n          const char *orig = ptr;\n          ptr = malloc(newlen + 1);\n          if (!ptr) {\n                  printf(\"out of memory\");\n                  pcregrep_exit(2);\n          }\n          endptr = ptr;\n          strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix);\n          for (i = 0; i < jfriedl_XT; i++) {\n                  strncpy(endptr, orig,  length);\n                  endptr += length;\n          }\n          strcpy(endptr, jfriedl_postfix); endptr += strlen(jfriedl_postfix);\n          length = newlen;\n      }\n\n      if (gettimeofday(&start_time, &dummy) != 0)\n              perror(\"bad gettimeofday\");\n\n\n      for (i = 0; i < jfriedl_XR; i++)\n          match = (pcre_exec(patterns->compiled, patterns->hint, ptr, length, 0,\n              PCRE_NOTEMPTY, offsets, OFFSET_SIZE) >= 0);\n\n      if (gettimeofday(&end_time, &dummy) != 0)\n              perror(\"bad gettimeofday\");\n\n      double delta = ((end_time.tv_sec + (end_time.tv_usec / 1000000.0))\n                      -\n                      (start_time.tv_sec + (start_time.tv_usec / 1000000.0)));\n\n      printf(\"%s TIMER[%.4f]\\n\", match ? \"MATCH\" : \"FAIL\", delta);\n      return 0;\n  }\n#endif\n\n  /* We come back here after a match when show_only_matching is set, in order\n  to find any further matches in the same line. This applies to\n  --only-matching, --file-offsets, and --line-offsets. */\n\n  ONLY_MATCHING_RESTART:\n\n  /* Run through all the patterns until one matches or there is an error other\n  than NOMATCH. This code is in a subroutine so that it can be re-used for\n  finding subsequent matches when colouring matched lines. After finding one\n  match, set PCRE_NOTEMPTY to disable any further matches of null strings in\n  this line. */\n\n  match = match_patterns(matchptr, length, options, startoffset, offsets, &mrc);\n  options = PCRE_NOTEMPTY;\n\n  /* If it's a match or a not-match (as required), do what's wanted. */\n\n  if (match != invert)\n    {\n    BOOL hyphenprinted = FALSE;\n\n    /* We've failed if we want a file that doesn't have any matches. */\n\n    if (filenames == FN_NOMATCH_ONLY) return 1;\n\n    /* If all we want is a yes/no answer, stop now. */\n\n    if (quiet) return 0;\n\n    /* Just count if just counting is wanted. */\n\n    else if (count_only) count++;\n\n    /* When handling a binary file and binary-files==binary, the \"binary\"\n    variable will be set true (it's false in all other cases). In this\n    situation we just want to output the file name. No need to scan further. */\n\n    else if (binary)\n      {\n      fprintf(stdout, \"Binary file %s matches\\n\", filename);\n      return 0;\n      }\n\n    /* If all we want is a file name, there is no need to scan any more lines\n    in the file. */\n\n    else if (filenames == FN_MATCH_ONLY)\n      {\n      fprintf(stdout, \"%s\\n\", printname);\n      return 0;\n      }\n\n    /* The --only-matching option prints just the substring that matched,\n    and/or one or more captured portions of it, as long as these strings are\n    not empty. The --file-offsets and --line-offsets options output offsets for\n    the matching substring (all three set show_only_matching). None of these\n    mutually exclusive options prints any context. Afterwards, adjust the start\n    and then jump back to look for further matches in the same line. If we are\n    in invert mode, however, nothing is printed and we do not restart - this\n    could still be useful because the return code is set. */\n\n    else if (show_only_matching)\n      {\n      if (!invert)\n        {\n        int oldstartoffset = startoffset;\n\n        /* It is possible, when a lookbehind assertion contains \\K, for the\n        same string to be found again. The code below advances startoffset, but\n        until it is past the \"bumpalong\" offset that gave the match, the same\n        substring will be returned. The PCRE1 library does not return the\n        bumpalong offset, so all we can do is ignore repeated strings. (PCRE2\n        does this better.) */\n\n        if (prevoffsets[0] != offsets[0] || prevoffsets[1] != offsets[1])\n          {\n          prevoffsets[0] = offsets[0];\n          prevoffsets[1] = offsets[1];\n\n          if (printname != NULL) fprintf(stdout, \"%s:\", printname);\n          if (number) fprintf(stdout, \"%lu:\", linenumber);\n\n          /* Handle --line-offsets */\n\n          if (line_offsets)\n            fprintf(stdout, \"%d,%d\\n\", (int)(matchptr + offsets[0] - ptr),\n              offsets[1] - offsets[0]);\n\n          /* Handle --file-offsets */\n\n          else if (file_offsets)\n            fprintf(stdout, \"%d,%d\\n\",\n              (int)(filepos + matchptr + offsets[0] - ptr),\n              offsets[1] - offsets[0]);\n\n          /* Handle --only-matching, which may occur many times */\n\n          else\n            {\n            BOOL printed = FALSE;\n            omstr *om;\n\n            for (om = only_matching; om != NULL; om = om->next)\n              {\n              int n = om->groupnum;\n              if (n < mrc)\n                {\n                int plen = offsets[2*n + 1] - offsets[2*n];\n                if (plen > 0)\n                  {\n                  if (printed) fprintf(stdout, \"%s\", om_separator);\n                  if (do_colour) fprintf(stdout, \"%c[%sm\", 0x1b, colour_string);\n                  FWRITE(matchptr + offsets[n*2], 1, plen, stdout);\n                  if (do_colour) fprintf(stdout, \"%c[00m\", 0x1b);\n                  printed = TRUE;\n                  }\n                }\n              }\n\n            if (printed || printname != NULL || number) fprintf(stdout, \"\\n\");\n            }\n          }\n\n        /* Prepare to repeat to find the next match. If the patterned contained\n        a lookbehind tht included \\K, it is possible that the end of the match\n        might be at or before the actual strting offset we have just used. We\n        need to start one character further on. Unfortunately, for unanchored\n        patterns, the actual start offset can be greater that the one that was\n        set as a result of \"bumpalong\". PCRE1 does not return the actual start\n        offset, so we have to check against the original start offset. This may\n        lead to duplicates - we we need the fudge above to avoid printing them.\n        (PCRE2 does this better.) */\n\n        match = FALSE;\n        if (line_buffered) fflush(stdout);\n        rc = 0;                      /* Had some success */\n\n        startoffset = offsets[1];    /* Restart after the match */\n        if (startoffset <= oldstartoffset)\n          {\n          if ((size_t)startoffset >= length)\n            goto END_ONE_MATCH;              /* We were at the end */\n          startoffset = oldstartoffset + 1;\n          if (utf8)\n            while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++;\n          }\n\n        /* If the current match ended past the end of the line (only possible\n        in multiline mode), we must move on to the line in which it did end\n        before searching for more matches. */\n\n        while (startoffset > (int)linelength)\n          {\n          matchptr = ptr += linelength + endlinelength;\n          filepos += (int)(linelength + endlinelength);\n          linenumber++;\n          startoffset -= (int)(linelength + endlinelength);\n          t = end_of_line(ptr, endptr, &endlinelength);\n          linelength = t - ptr - endlinelength;\n          length = (size_t)(endptr - ptr);\n          }\n\n        goto ONLY_MATCHING_RESTART;\n        }\n      }\n\n    /* This is the default case when none of the above options is set. We print\n    the matching lines(s), possibly preceded and/or followed by other lines of\n    context. */\n\n    else\n      {\n      /* See if there is a requirement to print some \"after\" lines from a\n      previous match. We never print any overlaps. */\n\n      if (after_context > 0 && lastmatchnumber > 0)\n        {\n        int ellength;\n        int linecount = 0;\n        char *p = lastmatchrestart;\n\n        while (p < ptr && linecount < after_context)\n          {\n          p = end_of_line(p, ptr, &ellength);\n          linecount++;\n          }\n\n        /* It is important to advance lastmatchrestart during this printing so\n        that it interacts correctly with any \"before\" printing below. Print\n        each line's data using fwrite() in case there are binary zeroes. */\n\n        while (lastmatchrestart < p)\n          {\n          char *pp = lastmatchrestart;\n          if (printname != NULL) fprintf(stdout, \"%s-\", printname);\n          if (number) fprintf(stdout, \"%lu-\", lastmatchnumber++);\n          pp = end_of_line(pp, endptr, &ellength);\n          FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout);\n          lastmatchrestart = pp;\n          }\n        if (lastmatchrestart != ptr) hyphenpending = TRUE;\n        }\n\n      /* If there were non-contiguous lines printed above, insert hyphens. */\n\n      if (hyphenpending)\n        {\n        fprintf(stdout, \"--\\n\");\n        hyphenpending = FALSE;\n        hyphenprinted = TRUE;\n        }\n\n      /* See if there is a requirement to print some \"before\" lines for this\n      match. Again, don't print overlaps. */\n\n      if (before_context > 0)\n        {\n        int linecount = 0;\n        char *p = ptr;\n\n        while (p > main_buffer && (lastmatchnumber == 0 || p > lastmatchrestart) &&\n               linecount < before_context)\n          {\n          linecount++;\n          p = previous_line(p, main_buffer);\n          }\n\n        if (lastmatchnumber > 0 && p > lastmatchrestart && !hyphenprinted)\n          fprintf(stdout, \"--\\n\");\n\n        while (p < ptr)\n          {\n          int ellength;\n          char *pp = p;\n          if (printname != NULL) fprintf(stdout, \"%s-\", printname);\n          if (number) fprintf(stdout, \"%lu-\", linenumber - linecount--);\n          pp = end_of_line(pp, endptr, &ellength);\n          FWRITE(p, 1, pp - p, stdout);\n          p = pp;\n          }\n        }\n\n      /* Now print the matching line(s); ensure we set hyphenpending at the end\n      of the file if any context lines are being output. */\n\n      if (after_context > 0 || before_context > 0)\n        endhyphenpending = TRUE;\n\n      if (printname != NULL) fprintf(stdout, \"%s:\", printname);\n      if (number) fprintf(stdout, \"%lu:\", linenumber);\n\n      /* In multiline mode, we want to print to the end of the line in which\n      the end of the matched string is found, so we adjust linelength and the\n      line number appropriately, but only when there actually was a match\n      (invert not set). Because the PCRE_FIRSTLINE option is set, the start of\n      the match will always be before the first newline sequence. */\n\n      if (multiline & !invert)\n        {\n        char *endmatch = ptr + offsets[1];\n        t = ptr;\n        while (t <= endmatch)\n          {\n          t = end_of_line(t, endptr, &endlinelength);\n          if (t < endmatch) linenumber++; else break;\n          }\n        linelength = t - ptr - endlinelength;\n        }\n\n      /*** NOTE: Use only fwrite() to output the data line, so that binary\n      zeroes are treated as just another data character. */\n\n      /* This extra option, for Jeffrey Friedl's debugging requirements,\n      replaces the matched string, or a specific captured string if it exists,\n      with X. When this happens, colouring is ignored. */\n\n#ifdef JFRIEDL_DEBUG\n      if (S_arg >= 0 && S_arg < mrc)\n        {\n        int first = S_arg * 2;\n        int last  = first + 1;\n        FWRITE(ptr, 1, offsets[first], stdout);\n        fprintf(stdout, \"X\");\n        FWRITE(ptr + offsets[last], 1, linelength - offsets[last], stdout);\n        }\n      else\n#endif\n\n      /* We have to split the line(s) up if colouring, and search for further\n      matches, but not of course if the line is a non-match. */\n\n      if (do_colour && !invert)\n        {\n        int plength;\n        FWRITE(ptr, 1, offsets[0], stdout);\n        fprintf(stdout, \"%c[%sm\", 0x1b, colour_string);\n        FWRITE(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout);\n        fprintf(stdout, \"%c[00m\", 0x1b);\n        for (;;)\n          {\n          startoffset = offsets[1];\n          if (startoffset >= (int)linelength + endlinelength ||\n              !match_patterns(matchptr, length, options, startoffset, offsets,\n                &mrc))\n            break;\n          FWRITE(matchptr + startoffset, 1, offsets[0] - startoffset, stdout);\n          fprintf(stdout, \"%c[%sm\", 0x1b, colour_string);\n          FWRITE(matchptr + offsets[0], 1, offsets[1] - offsets[0], stdout);\n          fprintf(stdout, \"%c[00m\", 0x1b);\n          }\n\n        /* In multiline mode, we may have already printed the complete line\n        and its line-ending characters (if they matched the pattern), so there\n        may be no more to print. */\n\n        plength = (int)((linelength + endlinelength) - startoffset);\n        if (plength > 0) FWRITE(ptr + startoffset, 1, plength, stdout);\n        }\n\n      /* Not colouring; no need to search for further matches */\n\n      else FWRITE(ptr, 1, linelength + endlinelength, stdout);\n      }\n\n    /* End of doing what has to be done for a match. If --line-buffered was\n    given, flush the output. */\n\n    if (line_buffered) fflush(stdout);\n    rc = 0;    /* Had some success */\n\n    /* Remember where the last match happened for after_context. We remember\n    where we are about to restart, and that line's number. */\n\n    lastmatchrestart = ptr + linelength + endlinelength;\n    lastmatchnumber = linenumber + 1;\n    }\n\n  /* For a match in multiline inverted mode (which of course did not cause\n  anything to be printed), we have to move on to the end of the match before\n  proceeding. */\n\n  if (multiline && invert && match)\n    {\n    int ellength;\n    char *endmatch = ptr + offsets[1];\n    t = ptr;\n    while (t < endmatch)\n      {\n      t = end_of_line(t, endptr, &ellength);\n      if (t <= endmatch) linenumber++; else break;\n      }\n    endmatch = end_of_line(endmatch, endptr, &ellength);\n    linelength = endmatch - ptr - ellength;\n    }\n\n  /* Advance to after the newline and increment the line number. The file\n  offset to the current line is maintained in filepos. */\n\n  END_ONE_MATCH:\n  ptr += linelength + endlinelength;\n  filepos += (int)(linelength + endlinelength);\n  linenumber++;\n\n  /* If input is line buffered, and the buffer is not yet full, read another\n  line and add it into the buffer. */\n\n  if (input_line_buffered && bufflength < (size_t)bufsize)\n    {\n    int add = read_one_line(ptr, bufsize - (int)(ptr - main_buffer), in);\n    bufflength += add;\n    endptr += add;\n    }\n\n  /* If we haven't yet reached the end of the file (the buffer is full), and\n  the current point is in the top 1/3 of the buffer, slide the buffer down by\n  1/3 and refill it. Before we do this, if some unprinted \"after\" lines are\n  about to be lost, print them. */\n\n  if (bufflength >= (size_t)bufsize && ptr > main_buffer + 2*bufthird)\n    {\n    if (after_context > 0 &&\n        lastmatchnumber > 0 &&\n        lastmatchrestart < main_buffer + bufthird)\n      {\n      do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);\n      lastmatchnumber = 0;\n      }\n\n    /* Now do the shuffle */\n\n    memmove(main_buffer, main_buffer + bufthird, 2*bufthird);\n    ptr -= bufthird;\n\n#ifdef SUPPORT_LIBZ\n    if (frtype == FR_LIBZ)\n      bufflength = 2*bufthird +\n        gzread (ingz, main_buffer + 2*bufthird, bufthird);\n    else\n#endif\n\n#ifdef SUPPORT_LIBBZ2\n    if (frtype == FR_LIBBZ2)\n      bufflength = 2*bufthird +\n        BZ2_bzread(inbz2, main_buffer + 2*bufthird, bufthird);\n    else\n#endif\n\n    bufflength = 2*bufthird +\n      (input_line_buffered?\n       read_one_line(main_buffer + 2*bufthird, bufthird, in) :\n       fread(main_buffer + 2*bufthird, 1, bufthird, in));\n    endptr = main_buffer + bufflength;\n\n    /* Adjust any last match point */\n\n    if (lastmatchnumber > 0) lastmatchrestart -= bufthird;\n    }\n  }     /* Loop through the whole file */\n\n/* End of file; print final \"after\" lines if wanted; do_after_lines sets\nhyphenpending if it prints something. */\n\nif (!show_only_matching && !count_only)\n  {\n  do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);\n  hyphenpending |= endhyphenpending;\n  }\n\n/* Print the file name if we are looking for those without matches and there\nwere none. If we found a match, we won't have got this far. */\n\nif (filenames == FN_NOMATCH_ONLY)\n  {\n  fprintf(stdout, \"%s\\n\", printname);\n  return 0;\n  }\n\n/* Print the match count if wanted */\n\nif (count_only && !quiet)\n  {\n  if (count > 0 || !omit_zero_count)\n    {\n    if (printname != NULL && filenames != FN_NONE)\n      fprintf(stdout, \"%s:\", printname);\n    fprintf(stdout, \"%lu\\n\", count);\n    }\n  }\n\nreturn rc;\n}\n\n\n\n/*************************************************\n*     Grep a file or recurse into a directory    *\n*************************************************/\n\n/* Given a path name, if it's a directory, scan all the files if we are\nrecursing; if it's a file, grep it.\n\nArguments:\n  pathname          the path to investigate\n  dir_recurse       TRUE if recursing is wanted (-r or -drecurse)\n  only_one_at_top   TRUE if the path is the only one at toplevel\n\nReturns:  -1 the file/directory was skipped\n           0 if there was at least one match\n           1 if there were no matches\n           2 there was some kind of error\n\nHowever, file opening failures are suppressed if \"silent\" is set.\n*/\n\nstatic int\ngrep_or_recurse(char *pathname, BOOL dir_recurse, BOOL only_one_at_top)\n{\nint rc = 1;\nint frtype;\nvoid *handle;\nchar *lastcomp;\nFILE *in = NULL;           /* Ensure initialized */\n\n#ifdef SUPPORT_LIBZ\ngzFile ingz = NULL;\n#endif\n\n#ifdef SUPPORT_LIBBZ2\nBZFILE *inbz2 = NULL;\n#endif\n\n#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2\nint pathlen;\n#endif\n\n#if defined NATIVE_ZOS\nint zos_type;\nFILE *zos_test_file;\n#endif\n\n/* If the file name is \"-\" we scan stdin */\n\nif (strcmp(pathname, \"-\") == 0)\n  {\n  return pcregrep(stdin, FR_PLAIN, stdin_name,\n    (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))?\n      stdin_name : NULL);\n  }\n\n/* Inclusion and exclusion: --include-dir and --exclude-dir apply only to\ndirectories, whereas --include and --exclude apply to everything else. The test\nis against the final component of the path. */\n\nlastcomp = strrchr(pathname, FILESEP);\nlastcomp = (lastcomp == NULL)? pathname : lastcomp + 1;\n\n/* If the file is a directory, skip if not recursing or if explicitly excluded.\nOtherwise, scan the directory and recurse for each path within it. The scanning\ncode is localized so it can be made system-specific. */\n\n\n/* For z/OS, determine the file type. */\n\n#if defined NATIVE_ZOS\nzos_test_file =  fopen(pathname,\"rb\");\n\nif (zos_test_file == NULL)\n   {\n   if (!silent) fprintf(stderr, \"pcregrep: failed to test next file %s\\n\",\n     pathname, strerror(errno));\n   return -1;\n   }\nzos_type = identifyzosfiletype (zos_test_file);\nfclose (zos_test_file);\n\n/* Handle a PDS in separate code */\n\nif (zos_type == __ZOS_PDS || zos_type == __ZOS_PDSE)\n   {\n   return travelonpdsdir (pathname, only_one_at_top);\n   }\n\n/* Deal with regular files in the normal way below. These types are:\n   zos_type == __ZOS_PDS_MEMBER\n   zos_type == __ZOS_PS\n   zos_type == __ZOS_VSAM_KSDS\n   zos_type == __ZOS_VSAM_ESDS\n   zos_type == __ZOS_VSAM_RRDS\n*/\n\n/* Handle a z/OS directory using common code. */\n\nelse if (zos_type == __ZOS_HFS)\n {\n#endif  /* NATIVE_ZOS */\n\n\n/* Handle directories: common code for all OS */\n\nif (isdirectory(pathname))\n  {\n  if (dee_action == dee_SKIP ||\n      !test_incexc(lastcomp, include_dir_patterns, exclude_dir_patterns))\n    return -1;\n\n  if (dee_action == dee_RECURSE)\n    {\n    char buffer[2048];\n    char *nextfile;\n    directory_type *dir = opendirectory(pathname);\n\n    if (dir == NULL)\n      {\n      if (!silent)\n        fprintf(stderr, \"pcregrep: Failed to open directory %s: %s\\n\", pathname,\n          strerror(errno));\n      return 2;\n      }\n\n    while ((nextfile = readdirectory(dir)) != NULL)\n      {\n      int frc;\n      int fnlength = strlen(pathname) + strlen(nextfile) + 2;\n      if (fnlength > 2048)\n        {\n        fprintf(stderr, \"pcregrep: recursive filename is too long\\n\");\n        rc = 2;\n        break;\n        }\n      sprintf(buffer, \"%s%c%s\", pathname, FILESEP, nextfile);\n      frc = grep_or_recurse(buffer, dir_recurse, FALSE);\n      if (frc > 1) rc = frc;\n       else if (frc == 0 && rc == 1) rc = 0;\n      }\n\n    closedirectory(dir);\n    return rc;\n    }\n  }\n\n#if defined NATIVE_ZOS\n }\n#endif\n\n/* If the file is not a directory, check for a regular file, and if it is not,\nskip it if that's been requested. Otherwise, check for an explicit inclusion or\nexclusion. */\n\nelse if (\n#if defined NATIVE_ZOS\n        (zos_type == __ZOS_NOFILE && DEE_action == DEE_SKIP) ||\n#else  /* all other OS */\n        (!isregfile(pathname) && DEE_action == DEE_SKIP) ||\n#endif\n        !test_incexc(lastcomp, include_patterns, exclude_patterns))\n  return -1;  /* File skipped */\n\n/* Control reaches here if we have a regular file, or if we have a directory\nand recursion or skipping was not requested, or if we have anything else and\nskipping was not requested. The scan proceeds. If this is the first and only\nargument at top level, we don't show the file name, unless we are only showing\nthe file name, or the filename was forced (-H). */\n\n#if defined SUPPORT_LIBZ || defined SUPPORT_LIBBZ2\npathlen = (int)(strlen(pathname));\n#endif\n\n/* Open using zlib if it is supported and the file name ends with .gz. */\n\n#ifdef SUPPORT_LIBZ\nif (pathlen > 3 && strcmp(pathname + pathlen - 3, \".gz\") == 0)\n  {\n  ingz = gzopen(pathname, \"rb\");\n  if (ingz == NULL)\n    {\n    if (!silent)\n      fprintf(stderr, \"pcregrep: Failed to open %s: %s\\n\", pathname,\n        strerror(errno));\n    return 2;\n    }\n  handle = (void *)ingz;\n  frtype = FR_LIBZ;\n  }\nelse\n#endif\n\n/* Otherwise open with bz2lib if it is supported and the name ends with .bz2. */\n\n#ifdef SUPPORT_LIBBZ2\nif (pathlen > 4 && strcmp(pathname + pathlen - 4, \".bz2\") == 0)\n  {\n  inbz2 = BZ2_bzopen(pathname, \"rb\");\n  handle = (void *)inbz2;\n  frtype = FR_LIBBZ2;\n  }\nelse\n#endif\n\n/* Otherwise use plain fopen(). The label is so that we can come back here if\nan attempt to read a .bz2 file indicates that it really is a plain file. */\n\n#ifdef SUPPORT_LIBBZ2\nPLAIN_FILE:\n#endif\n  {\n  in = fopen(pathname, \"rb\");\n  handle = (void *)in;\n  frtype = FR_PLAIN;\n  }\n\n/* All the opening methods return errno when they fail. */\n\nif (handle == NULL)\n  {\n  if (!silent)\n    fprintf(stderr, \"pcregrep: Failed to open %s: %s\\n\", pathname,\n      strerror(errno));\n  return 2;\n  }\n\n/* Now grep the file */\n\nrc = pcregrep(handle, frtype, pathname, (filenames > FN_DEFAULT ||\n  (filenames == FN_DEFAULT && !only_one_at_top))? pathname : NULL);\n\n/* Close in an appropriate manner. */\n\n#ifdef SUPPORT_LIBZ\nif (frtype == FR_LIBZ)\n  gzclose(ingz);\nelse\n#endif\n\n/* If it is a .bz2 file and the result is 3, it means that the first attempt to\nread failed. If the error indicates that the file isn't in fact bzipped, try\nagain as a normal file. */\n\n#ifdef SUPPORT_LIBBZ2\nif (frtype == FR_LIBBZ2)\n  {\n  if (rc == 3)\n    {\n    int errnum;\n    const char *err = BZ2_bzerror(inbz2, &errnum);\n    if (errnum == BZ_DATA_ERROR_MAGIC)\n      {\n      BZ2_bzclose(inbz2);\n      goto PLAIN_FILE;\n      }\n    else if (!silent)\n      fprintf(stderr, \"pcregrep: Failed to read %s using bzlib: %s\\n\",\n        pathname, err);\n    rc = 2;    /* The normal \"something went wrong\" code */\n    }\n  BZ2_bzclose(inbz2);\n  }\nelse\n#endif\n\n/* Normal file close */\n\nfclose(in);\n\n/* Pass back the yield from pcregrep(). */\n\nreturn rc;\n}\n\n\n\n/*************************************************\n*    Handle a single-letter, no data option      *\n*************************************************/\n\nstatic int\nhandle_option(int letter, int options)\n{\nswitch(letter)\n  {\n  case N_FOFFSETS: file_offsets = TRUE; break;\n  case N_HELP: help(); pcregrep_exit(0);\n  case N_LBUFFER: line_buffered = TRUE; break;\n  case N_LOFFSETS: line_offsets = number = TRUE; break;\n  case N_NOJIT: study_options &= ~PCRE_STUDY_JIT_COMPILE; break;\n  case 'a': binary_files = BIN_TEXT; break;\n  case 'c': count_only = TRUE; break;\n  case 'F': process_options |= PO_FIXED_STRINGS; break;\n  case 'H': filenames = FN_FORCE; break;\n  case 'I': binary_files = BIN_NOMATCH; break;\n  case 'h': filenames = FN_NONE; break;\n  case 'i': options |= PCRE_CASELESS; break;\n  case 'l': omit_zero_count = TRUE; filenames = FN_MATCH_ONLY; break;\n  case 'L': filenames = FN_NOMATCH_ONLY; break;\n  case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break;\n  case 'n': number = TRUE; break;\n\n  case 'o':\n  only_matching_last = add_number(0, only_matching_last);\n  if (only_matching == NULL) only_matching = only_matching_last;\n  break;\n\n  case 'q': quiet = TRUE; break;\n  case 'r': dee_action = dee_RECURSE; break;\n  case 's': silent = TRUE; break;\n  case 'u': options |= PCRE_UTF8; utf8 = TRUE; break;\n  case 'v': invert = TRUE; break;\n  case 'w': process_options |= PO_WORD_MATCH; break;\n  case 'x': process_options |= PO_LINE_MATCH; break;\n\n  case 'V':\n  fprintf(stdout, \"pcregrep version %s\\n\", pcre_version());\n  pcregrep_exit(0);\n  break;\n\n  default:\n  fprintf(stderr, \"pcregrep: Unknown option -%c\\n\", letter);\n  pcregrep_exit(usage(2));\n  }\n\nreturn options;\n}\n\n\n\n\n/*************************************************\n*          Construct printed ordinal             *\n*************************************************/\n\n/* This turns a number into \"1st\", \"3rd\", etc. */\n\nstatic char *\nordin(int n)\n{\nstatic char buffer[14];\nchar *p = buffer;\nsprintf(p, \"%d\", n);\nwhile (*p != 0) p++;\nswitch (n%10)\n  {\n  case 1: strcpy(p, \"st\"); break;\n  case 2: strcpy(p, \"nd\"); break;\n  case 3: strcpy(p, \"rd\"); break;\n  default: strcpy(p, \"th\"); break;\n  }\nreturn buffer;\n}\n\n\n\n/*************************************************\n*          Compile a single pattern              *\n*************************************************/\n\n/* Do nothing if the pattern has already been compiled. This is the case for\ninclude/exclude patterns read from a file.\n\nWhen the -F option has been used, each \"pattern\" may be a list of strings,\nseparated by line breaks. They will be matched literally. We split such a\nstring and compile the first substring, inserting an additional block into the\npattern chain.\n\nArguments:\n  p              points to the pattern block\n  options        the PCRE options\n  popts          the processing options\n  fromfile       TRUE if the pattern was read from a file\n  fromtext       file name or identifying text (e.g. \"include\")\n  count          0 if this is the only command line pattern, or\n                 number of the command line pattern, or\n                 linenumber for a pattern from a file\n\nReturns:         TRUE on success, FALSE after an error\n*/\n\nstatic BOOL\ncompile_pattern(patstr *p, int options, int popts, int fromfile,\n  const char *fromtext, int count)\n{\nchar buffer[PATBUFSIZE];\nconst char *error;\nchar *ps = p->string;\nint patlen = strlen(ps);\nint errptr;\n\nif (p->compiled != NULL) return TRUE;\n\nif ((popts & PO_FIXED_STRINGS) != 0)\n  {\n  int ellength;\n  char *eop = ps + patlen;\n  char *pe = end_of_line(ps, eop, &ellength);\n\n  if (ellength != 0)\n    {\n    if (add_pattern(pe, p) == NULL) return FALSE;\n    patlen = (int)(pe - ps - ellength);\n    }\n  }\n\nif (snprintf(buffer, PATBUFSIZE, \"%s%.*s%s\", prefix[popts], patlen, ps,\n      suffix[popts]) > PATBUFSIZE)\n  {\n  fprintf(stderr, \"pcregrep: Buffer overflow while compiling \\\"%s\\\"\\n\",\n    ps);\n  return FALSE;\n  }\n\np->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables);\nif (p->compiled != NULL) return TRUE;\n\n/* Handle compile errors */\n\nerrptr -= (int)strlen(prefix[popts]);\nif (errptr > patlen) errptr = patlen;\n\nif (fromfile)\n  {\n  fprintf(stderr, \"pcregrep: Error in regex in line %d of %s \"\n    \"at offset %d: %s\\n\", count, fromtext, errptr, error);\n  }\nelse\n  {\n  if (count == 0)\n    fprintf(stderr, \"pcregrep: Error in %s regex at offset %d: %s\\n\",\n      fromtext, errptr, error);\n  else\n    fprintf(stderr, \"pcregrep: Error in %s %s regex at offset %d: %s\\n\",\n      ordin(count), fromtext, errptr, error);\n  }\n\nreturn FALSE;\n}\n\n\n\n/*************************************************\n*     Read and compile a file of patterns        *\n*************************************************/\n\n/* This is used for --filelist, --include-from, and --exclude-from.\n\nArguments:\n  name         the name of the file; \"-\" is stdin\n  patptr       pointer to the pattern chain anchor\n  patlastptr   pointer to the last pattern pointer\n  popts        the process options to pass to pattern_compile()\n\nReturns:       TRUE if all went well\n*/\n\nstatic BOOL\nread_pattern_file(char *name, patstr **patptr, patstr **patlastptr, int popts)\n{\nint linenumber = 0;\nFILE *f;\nchar *filename;\nchar buffer[PATBUFSIZE];\n\nif (strcmp(name, \"-\") == 0)\n  {\n  f = stdin;\n  filename = stdin_name;\n  }\nelse\n  {\n  f = fopen(name, \"r\");\n  if (f == NULL)\n    {\n    fprintf(stderr, \"pcregrep: Failed to open %s: %s\\n\", name, strerror(errno));\n    return FALSE;\n    }\n  filename = name;\n  }\n\nwhile (fgets(buffer, PATBUFSIZE, f) != NULL)\n  {\n  char *s = buffer + (int)strlen(buffer);\n  while (s > buffer && isspace((unsigned char)(s[-1]))) s--;\n  *s = 0;\n  linenumber++;\n  if (buffer[0] == 0) continue;   /* Skip blank lines */\n\n  /* Note: this call to add_pattern() puts a pointer to the local variable\n  \"buffer\" into the pattern chain. However, that pointer is used only when\n  compiling the pattern, which happens immediately below, so we flatten it\n  afterwards, as a precaution against any later code trying to use it. */\n\n  *patlastptr = add_pattern(buffer, *patlastptr);\n  if (*patlastptr == NULL)\n    {\n    if (f != stdin) fclose(f);\n    return FALSE;\n    }\n  if (*patptr == NULL) *patptr = *patlastptr;\n\n  /* This loop is needed because compiling a \"pattern\" when -F is set may add\n  on additional literal patterns if the original contains a newline. In the\n  common case, it never will, because fgets() stops at a newline. However,\n  the -N option can be used to give pcregrep a different newline setting. */\n\n  for(;;)\n    {\n    if (!compile_pattern(*patlastptr, pcre_options, popts, TRUE, filename,\n        linenumber))\n      {\n      if (f != stdin) fclose(f);\n      return FALSE;\n      }\n    (*patlastptr)->string = NULL;            /* Insurance */\n    if ((*patlastptr)->next == NULL) break;\n    *patlastptr = (*patlastptr)->next;\n    }\n  }\n\nif (f != stdin) fclose(f);\nreturn TRUE;\n}\n\n\n\n/*************************************************\n*                Main program                    *\n*************************************************/\n\n/* Returns 0 if something matched, 1 if nothing matched, 2 after an error. */\n\nint\nmain(int argc, char **argv)\n{\nint i, j;\nint rc = 1;\nBOOL only_one_at_top;\npatstr *cp;\nfnstr *fn;\nconst char *locale_from = \"--locale\";\nconst char *error;\n\n#ifdef SUPPORT_PCREGREP_JIT\npcre_jit_stack *jit_stack = NULL;\n#endif\n\n/* Set the default line ending value from the default in the PCRE library;\n\"lf\", \"cr\", \"crlf\", and \"any\" are supported. Anything else is treated as \"lf\".\nNote that the return values from pcre_config(), though derived from the ASCII\ncodes, are the same in EBCDIC environments, so we must use the actual values\nrather than escapes such as as '\\r'. */\n\n(void)pcre_config(PCRE_CONFIG_NEWLINE, &i);\nswitch(i)\n  {\n  default:               newline = (char *)\"lf\"; break;\n  case 13:               newline = (char *)\"cr\"; break;\n  case (13 << 8) | 10:   newline = (char *)\"crlf\"; break;\n  case -1:               newline = (char *)\"any\"; break;\n  case -2:               newline = (char *)\"anycrlf\"; break;\n  }\n\n/* Process the options */\n\nfor (i = 1; i < argc; i++)\n  {\n  option_item *op = NULL;\n  char *option_data = (char *)\"\";    /* default to keep compiler happy */\n  BOOL longop;\n  BOOL longopwasequals = FALSE;\n\n  if (argv[i][0] != '-') break;\n\n  /* If we hit an argument that is just \"-\", it may be a reference to STDIN,\n  but only if we have previously had -e or -f to define the patterns. */\n\n  if (argv[i][1] == 0)\n    {\n    if (pattern_files != NULL || patterns != NULL) break;\n      else pcregrep_exit(usage(2));\n    }\n\n  /* Handle a long name option, or -- to terminate the options */\n\n  if (argv[i][1] == '-')\n    {\n    char *arg = argv[i] + 2;\n    char *argequals = strchr(arg, '=');\n\n    if (*arg == 0)    /* -- terminates options */\n      {\n      i++;\n      break;                /* out of the options-handling loop */\n      }\n\n    longop = TRUE;\n\n    /* Some long options have data that follows after =, for example file=name.\n    Some options have variations in the long name spelling: specifically, we\n    allow \"regexp\" because GNU grep allows it, though I personally go along\n    with Jeffrey Friedl and Larry Wall in preferring \"regex\" without the \"p\".\n    These options are entered in the table as \"regex(p)\". Options can be in\n    both these categories. */\n\n    for (op = optionlist; op->one_char != 0; op++)\n      {\n      char *opbra = strchr(op->long_name, '(');\n      char *equals = strchr(op->long_name, '=');\n\n      /* Handle options with only one spelling of the name */\n\n      if (opbra == NULL)     /* Does not contain '(' */\n        {\n        if (equals == NULL)  /* Not thing=data case */\n          {\n          if (strcmp(arg, op->long_name) == 0) break;\n          }\n        else                 /* Special case xxx=data */\n          {\n          int oplen = (int)(equals - op->long_name);\n          int arglen = (argequals == NULL)?\n            (int)strlen(arg) : (int)(argequals - arg);\n          if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)\n            {\n            option_data = arg + arglen;\n            if (*option_data == '=')\n              {\n              option_data++;\n              longopwasequals = TRUE;\n              }\n            break;\n            }\n          }\n        }\n\n      /* Handle options with an alternate spelling of the name */\n\n      else\n        {\n        char buff1[24];\n        char buff2[24];\n\n        int baselen = (int)(opbra - op->long_name);\n        int fulllen = (int)(strchr(op->long_name, ')') - op->long_name + 1);\n        int arglen = (argequals == NULL || equals == NULL)?\n          (int)strlen(arg) : (int)(argequals - arg);\n\n        if (snprintf(buff1, sizeof(buff1), \"%.*s\", baselen, op->long_name) >\n              (int)sizeof(buff1) ||\n            snprintf(buff2, sizeof(buff2), \"%s%.*s\", buff1,\n              fulllen - baselen - 2, opbra + 1) > (int)sizeof(buff2))\n          {\n          fprintf(stderr, \"pcregrep: Buffer overflow when parsing %s option\\n\",\n            op->long_name);\n          pcregrep_exit(2);\n          }\n\n        if (strncmp(arg, buff1, arglen) == 0 ||\n           strncmp(arg, buff2, arglen) == 0)\n          {\n          if (equals != NULL && argequals != NULL)\n            {\n            option_data = argequals;\n            if (*option_data == '=')\n              {\n              option_data++;\n              longopwasequals = TRUE;\n              }\n            }\n          break;\n          }\n        }\n      }\n\n    if (op->one_char == 0)\n      {\n      fprintf(stderr, \"pcregrep: Unknown option %s\\n\", argv[i]);\n      pcregrep_exit(usage(2));\n      }\n    }\n\n  /* Jeffrey Friedl's debugging harness uses these additional options which\n  are not in the right form for putting in the option table because they use\n  only one hyphen, yet are more than one character long. By putting them\n  separately here, they will not get displayed as part of the help() output,\n  but I don't think Jeffrey will care about that. */\n\n#ifdef JFRIEDL_DEBUG\n  else if (strcmp(argv[i], \"-pre\") == 0) {\n          jfriedl_prefix = argv[++i];\n          continue;\n  } else if (strcmp(argv[i], \"-post\") == 0) {\n          jfriedl_postfix = argv[++i];\n          continue;\n  } else if (strcmp(argv[i], \"-XT\") == 0) {\n          sscanf(argv[++i], \"%d\", &jfriedl_XT);\n          continue;\n  } else if (strcmp(argv[i], \"-XR\") == 0) {\n          sscanf(argv[++i], \"%d\", &jfriedl_XR);\n          continue;\n  }\n#endif\n\n\n  /* One-char options; many that have no data may be in a single argument; we\n  continue till we hit the last one or one that needs data. */\n\n  else\n    {\n    char *s = argv[i] + 1;\n    longop = FALSE;\n\n    while (*s != 0)\n      {\n      for (op = optionlist; op->one_char != 0; op++)\n        {\n        if (*s == op->one_char) break;\n        }\n      if (op->one_char == 0)\n        {\n        fprintf(stderr, \"pcregrep: Unknown option letter '%c' in \\\"%s\\\"\\n\",\n          *s, argv[i]);\n        pcregrep_exit(usage(2));\n        }\n\n      option_data = s+1;\n\n      /* Break out if this is the last character in the string; it's handled\n      below like a single multi-char option. */\n\n      if (*option_data == 0) break;\n\n      /* Check for a single-character option that has data: OP_OP_NUMBER(S)\n      are used for ones that either have a numerical number or defaults, i.e.\n      the data is optional. If a digit follows, there is data; if not, carry on\n      with other single-character options in the same string. */\n\n      if (op->type == OP_OP_NUMBER || op->type == OP_OP_NUMBERS)\n        {\n        if (isdigit((unsigned char)s[1])) break;\n        }\n      else   /* Check for an option with data */\n        {\n        if (op->type != OP_NODATA) break;\n        }\n\n      /* Handle a single-character option with no data, then loop for the\n      next character in the string. */\n\n      pcre_options = handle_option(*s++, pcre_options);\n      }\n    }\n\n  /* At this point we should have op pointing to a matched option. If the type\n  is NO_DATA, it means that there is no data, and the option might set\n  something in the PCRE options. */\n\n  if (op->type == OP_NODATA)\n    {\n    pcre_options = handle_option(op->one_char, pcre_options);\n    continue;\n    }\n\n  /* If the option type is OP_OP_STRING or OP_OP_NUMBER(S), it's an option that\n  either has a value or defaults to something. It cannot have data in a\n  separate item. At the moment, the only such options are \"colo(u)r\",\n  \"only-matching\", and Jeffrey Friedl's special -S debugging option. */\n\n  if (*option_data == 0 &&\n      (op->type == OP_OP_STRING || op->type == OP_OP_NUMBER ||\n       op->type == OP_OP_NUMBERS))\n    {\n    switch (op->one_char)\n      {\n      case N_COLOUR:\n      colour_option = (char *)\"auto\";\n      break;\n\n      case 'o':\n      only_matching_last = add_number(0, only_matching_last);\n      if (only_matching == NULL) only_matching = only_matching_last;\n      break;\n\n#ifdef JFRIEDL_DEBUG\n      case 'S':\n      S_arg = 0;\n      break;\n#endif\n      }\n    continue;\n    }\n\n  /* Otherwise, find the data string for the option. */\n\n  if (*option_data == 0)\n    {\n    if (i >= argc - 1 || longopwasequals)\n      {\n      fprintf(stderr, \"pcregrep: Data missing after %s\\n\", argv[i]);\n      pcregrep_exit(usage(2));\n      }\n    option_data = argv[++i];\n    }\n\n  /* If the option type is OP_OP_NUMBERS, the value is a number that is to be\n  added to a chain of numbers. */\n\n  if (op->type == OP_OP_NUMBERS)\n    {\n    unsigned long int n = decode_number(option_data, op, longop);\n    omdatastr *omd = (omdatastr *)op->dataptr;\n    *(omd->lastptr) = add_number((int)n, *(omd->lastptr));\n    if (*(omd->anchor) == NULL) *(omd->anchor) = *(omd->lastptr);\n    }\n\n  /* If the option type is OP_PATLIST, it's the -e option, or one of the\n  include/exclude options, which can be called multiple times to create lists\n  of patterns. */\n\n  else if (op->type == OP_PATLIST)\n    {\n    patdatastr *pd = (patdatastr *)op->dataptr;\n    *(pd->lastptr) = add_pattern(option_data, *(pd->lastptr));\n    if (*(pd->lastptr) == NULL) goto EXIT2;\n    if (*(pd->anchor) == NULL) *(pd->anchor) = *(pd->lastptr);\n    }\n\n  /* If the option type is OP_FILELIST, it's one of the options that names a\n  file. */\n\n  else if (op->type == OP_FILELIST)\n    {\n    fndatastr *fd = (fndatastr *)op->dataptr;\n    fn = (fnstr *)malloc(sizeof(fnstr));\n    if (fn == NULL)\n      {\n      fprintf(stderr, \"pcregrep: malloc failed\\n\");\n      goto EXIT2;\n      }\n    fn->next = NULL;\n    fn->name = option_data;\n    if (*(fd->anchor) == NULL)\n      *(fd->anchor) = fn;\n    else\n      (*(fd->lastptr))->next = fn;\n    *(fd->lastptr) = fn;\n    }\n\n  /* Handle OP_BINARY_FILES */\n\n  else if (op->type == OP_BINFILES)\n    {\n    if (strcmp(option_data, \"binary\") == 0)\n      binary_files = BIN_BINARY;\n    else if (strcmp(option_data, \"without-match\") == 0)\n      binary_files = BIN_NOMATCH;\n    else if (strcmp(option_data, \"text\") == 0)\n      binary_files = BIN_TEXT;\n    else\n      {\n      fprintf(stderr, \"pcregrep: unknown value \\\"%s\\\" for binary-files\\n\",\n        option_data);\n      pcregrep_exit(usage(2));\n      }\n    }\n\n  /* Otherwise, deal with a single string or numeric data value. */\n\n  else if (op->type != OP_NUMBER && op->type != OP_LONGNUMBER &&\n           op->type != OP_OP_NUMBER)\n    {\n    *((char **)op->dataptr) = option_data;\n    }\n  else\n    {\n    unsigned long int n = decode_number(option_data, op, longop);\n    if (op->type == OP_LONGNUMBER) *((unsigned long int *)op->dataptr) = n;\n      else *((int *)op->dataptr) = n;\n    }\n  }\n\n/* Options have been decoded. If -C was used, its value is used as a default\nfor -A and -B. */\n\nif (both_context > 0)\n  {\n  if (after_context == 0) after_context = both_context;\n  if (before_context == 0) before_context = both_context;\n  }\n\n/* Only one of --only-matching, --file-offsets, or --line-offsets is permitted.\nHowever, all three set show_only_matching because they display, each in their\nown way, only the data that has matched. */\n\nif ((only_matching != NULL && (file_offsets || line_offsets)) ||\n    (file_offsets && line_offsets))\n  {\n  fprintf(stderr, \"pcregrep: Cannot mix --only-matching, --file-offsets \"\n    \"and/or --line-offsets\\n\");\n  pcregrep_exit(usage(2));\n  }\n\nif (only_matching != NULL || file_offsets || line_offsets)\n  show_only_matching = TRUE;\n\n/* If a locale has not been provided as an option, see if the LC_CTYPE or\nLC_ALL environment variable is set, and if so, use it. */\n\nif (locale == NULL)\n  {\n  locale = getenv(\"LC_ALL\");\n  locale_from = \"LC_ALL\";\n  }\n\nif (locale == NULL)\n  {\n  locale = getenv(\"LC_CTYPE\");\n  locale_from = \"LC_CTYPE\";\n  }\n\n/* If a locale is set, use it to generate the tables the PCRE needs. Otherwise,\npcretables==NULL, which causes the use of default tables. */\n\nif (locale != NULL)\n  {\n  if (setlocale(LC_CTYPE, locale) == NULL)\n    {\n    fprintf(stderr, \"pcregrep: Failed to set locale %s (obtained from %s)\\n\",\n      locale, locale_from);\n    goto EXIT2;\n    }\n  pcretables = pcre_maketables();\n  }\n\n/* Sort out colouring */\n\nif (colour_option != NULL && strcmp(colour_option, \"never\") != 0)\n  {\n  if (strcmp(colour_option, \"always\") == 0) do_colour = TRUE;\n  else if (strcmp(colour_option, \"auto\") == 0) do_colour = is_stdout_tty();\n  else\n    {\n    fprintf(stderr, \"pcregrep: Unknown colour setting \\\"%s\\\"\\n\",\n      colour_option);\n    goto EXIT2;\n    }\n  if (do_colour)\n    {\n    char *cs = getenv(\"PCREGREP_COLOUR\");\n    if (cs == NULL) cs = getenv(\"PCREGREP_COLOR\");\n    if (cs != NULL) colour_string = cs;\n    }\n  }\n\n/* Interpret the newline type; the default settings are Unix-like. */\n\nif (strcmp(newline, \"cr\") == 0 || strcmp(newline, \"CR\") == 0)\n  {\n  pcre_options |= PCRE_NEWLINE_CR;\n  endlinetype = EL_CR;\n  }\nelse if (strcmp(newline, \"lf\") == 0 || strcmp(newline, \"LF\") == 0)\n  {\n  pcre_options |= PCRE_NEWLINE_LF;\n  endlinetype = EL_LF;\n  }\nelse if (strcmp(newline, \"crlf\") == 0 || strcmp(newline, \"CRLF\") == 0)\n  {\n  pcre_options |= PCRE_NEWLINE_CRLF;\n  endlinetype = EL_CRLF;\n  }\nelse if (strcmp(newline, \"any\") == 0 || strcmp(newline, \"ANY\") == 0)\n  {\n  pcre_options |= PCRE_NEWLINE_ANY;\n  endlinetype = EL_ANY;\n  }\nelse if (strcmp(newline, \"anycrlf\") == 0 || strcmp(newline, \"ANYCRLF\") == 0)\n  {\n  pcre_options |= PCRE_NEWLINE_ANYCRLF;\n  endlinetype = EL_ANYCRLF;\n  }\nelse\n  {\n  fprintf(stderr, \"pcregrep: Invalid newline specifier \\\"%s\\\"\\n\", newline);\n  goto EXIT2;\n  }\n\n/* Interpret the text values for -d and -D */\n\nif (dee_option != NULL)\n  {\n  if (strcmp(dee_option, \"read\") == 0) dee_action = dee_READ;\n  else if (strcmp(dee_option, \"recurse\") == 0) dee_action = dee_RECURSE;\n  else if (strcmp(dee_option, \"skip\") == 0) dee_action = dee_SKIP;\n  else\n    {\n    fprintf(stderr, \"pcregrep: Invalid value \\\"%s\\\" for -d\\n\", dee_option);\n    goto EXIT2;\n    }\n  }\n\nif (DEE_option != NULL)\n  {\n  if (strcmp(DEE_option, \"read\") == 0) DEE_action = DEE_READ;\n  else if (strcmp(DEE_option, \"skip\") == 0) DEE_action = DEE_SKIP;\n  else\n    {\n    fprintf(stderr, \"pcregrep: Invalid value \\\"%s\\\" for -D\\n\", DEE_option);\n    goto EXIT2;\n    }\n  }\n\n/* Check the values for Jeffrey Friedl's debugging options. */\n\n#ifdef JFRIEDL_DEBUG\nif (S_arg > 9)\n  {\n  fprintf(stderr, \"pcregrep: bad value for -S option\\n\");\n  return 2;\n  }\nif (jfriedl_XT != 0 || jfriedl_XR != 0)\n  {\n  if (jfriedl_XT == 0) jfriedl_XT = 1;\n  if (jfriedl_XR == 0) jfriedl_XR = 1;\n  }\n#endif\n\n/* Get memory for the main buffer. */\n\nbufsize = 3*bufthird;\nmain_buffer = (char *)malloc(bufsize);\n\nif (main_buffer == NULL)\n  {\n  fprintf(stderr, \"pcregrep: malloc failed\\n\");\n  goto EXIT2;\n  }\n\n/* If no patterns were provided by -e, and there are no files provided by -f,\nthe first argument is the one and only pattern, and it must exist. */\n\nif (patterns == NULL && pattern_files == NULL)\n  {\n  if (i >= argc) return usage(2);\n  patterns = patterns_last = add_pattern(argv[i++], NULL);\n  if (patterns == NULL) goto EXIT2;\n  }\n\n/* Compile the patterns that were provided on the command line, either by\nmultiple uses of -e or as a single unkeyed pattern. We cannot do this until\nafter all the command-line options are read so that we know which PCRE options\nto use. When -F is used, compile_pattern() may add another block into the\nchain, so we must not access the next pointer till after the compile. */\n\nfor (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next)\n  {\n  if (!compile_pattern(cp, pcre_options, process_options, FALSE, \"command-line\",\n       (j == 1 && patterns->next == NULL)? 0 : j))\n    goto EXIT2;\n  }\n\n/* Read and compile the regular expressions that are provided in files. */\n\nfor (fn = pattern_files; fn != NULL; fn = fn->next)\n  {\n  if (!read_pattern_file(fn->name, &patterns, &patterns_last, process_options))\n    goto EXIT2;\n  }\n\n/* Study the regular expressions, as we will be running them many times. If an\nextra block is needed for a limit, set PCRE_STUDY_EXTRA_NEEDED so that one is\nreturned, even if studying produces no data. */\n\nif (match_limit > 0 || match_limit_recursion > 0)\n  study_options |= PCRE_STUDY_EXTRA_NEEDED;\n\n/* Unless JIT has been explicitly disabled, arrange a stack for it to use. */\n\n#ifdef SUPPORT_PCREGREP_JIT\nif ((study_options & PCRE_STUDY_JIT_COMPILE) != 0)\n  jit_stack = pcre_jit_stack_alloc(32*1024, 1024*1024);\n#endif\n\nfor (j = 1, cp = patterns; cp != NULL; j++, cp = cp->next)\n  {\n  cp->hint = pcre_study(cp->compiled, study_options, &error);\n  if (error != NULL)\n    {\n    if (patterns->next == NULL)\n      fprintf(stderr, \"pcregrep: Error while studying regex: %s\\n\", error);\n    else\n      fprintf(stderr, \"pcregrep: Error while studying regex number %d: %s\\n\",\n        j, error);\n    goto EXIT2;\n    }\n#ifdef SUPPORT_PCREGREP_JIT\n  if (jit_stack != NULL && cp->hint != NULL)\n    pcre_assign_jit_stack(cp->hint, NULL, jit_stack);\n#endif\n  }\n\n/* If --match-limit or --recursion-limit was set, put the value(s) into the\npcre_extra block for each pattern. There will always be an extra block because\nof the use of PCRE_STUDY_EXTRA_NEEDED above. */\n\nfor (cp = patterns; cp != NULL; cp = cp->next)\n  {\n  if (match_limit > 0)\n    {\n    cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT;\n    cp->hint->match_limit = match_limit;\n    }\n\n  if (match_limit_recursion > 0)\n    {\n    cp->hint->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;\n    cp->hint->match_limit_recursion = match_limit_recursion;\n    }\n  }\n\n/* If there are include or exclude patterns read from the command line, compile\nthem. -F, -w, and -x do not apply, so the third argument of compile_pattern is\n0. */\n\nfor (j = 0; j < 4; j++)\n  {\n  int k;\n  for (k = 1, cp = *(incexlist[j]); cp != NULL; k++, cp = cp->next)\n    {\n    if (!compile_pattern(cp, pcre_options, 0, FALSE, incexname[j],\n         (k == 1 && cp->next == NULL)? 0 : k))\n      goto EXIT2;\n    }\n  }\n\n/* Read and compile include/exclude patterns from files. */\n\nfor (fn = include_from; fn != NULL; fn = fn->next)\n  {\n  if (!read_pattern_file(fn->name, &include_patterns, &include_patterns_last, 0))\n    goto EXIT2;\n  }\n\nfor (fn = exclude_from; fn != NULL; fn = fn->next)\n  {\n  if (!read_pattern_file(fn->name, &exclude_patterns, &exclude_patterns_last, 0))\n    goto EXIT2;\n  }\n\n/* If there are no files that contain lists of files to search, and there are\nno file arguments, search stdin, and then exit. */\n\nif (file_lists == NULL && i >= argc)\n  {\n  rc = pcregrep(stdin, FR_PLAIN, stdin_name,\n    (filenames > FN_DEFAULT)? stdin_name : NULL);\n  goto EXIT;\n  }\n\n/* If any files that contains a list of files to search have been specified,\nread them line by line and search the given files. */\n\nfor (fn = file_lists; fn != NULL; fn = fn->next)\n  {\n  char buffer[PATBUFSIZE];\n  FILE *fl;\n  if (strcmp(fn->name, \"-\") == 0) fl = stdin; else\n    {\n    fl = fopen(fn->name, \"rb\");\n    if (fl == NULL)\n      {\n      fprintf(stderr, \"pcregrep: Failed to open %s: %s\\n\", fn->name,\n        strerror(errno));\n      goto EXIT2;\n      }\n    }\n  while (fgets(buffer, PATBUFSIZE, fl) != NULL)\n    {\n    int frc;\n    char *end = buffer + (int)strlen(buffer);\n    while (end > buffer && isspace(end[-1])) end--;\n    *end = 0;\n    if (*buffer != 0)\n      {\n      frc = grep_or_recurse(buffer, dee_action == dee_RECURSE, FALSE);\n      if (frc > 1) rc = frc;\n        else if (frc == 0 && rc == 1) rc = 0;\n      }\n    }\n  if (fl != stdin) fclose(fl);\n  }\n\n/* After handling file-list, work through remaining arguments. Pass in the fact\nthat there is only one argument at top level - this suppresses the file name if\nthe argument is not a directory and filenames are not otherwise forced. */\n\nonly_one_at_top = i == argc - 1 && file_lists == NULL;\n\nfor (; i < argc; i++)\n  {\n  int frc = grep_or_recurse(argv[i], dee_action == dee_RECURSE,\n    only_one_at_top);\n  if (frc > 1) rc = frc;\n    else if (frc == 0 && rc == 1) rc = 0;\n  }\n\nEXIT:\n#ifdef SUPPORT_PCREGREP_JIT\nif (jit_stack != NULL) pcre_jit_stack_free(jit_stack);\n#endif\n\nfree(main_buffer);\nfree((void *)pcretables);\n\nfree_pattern_chain(patterns);\nfree_pattern_chain(include_patterns);\nfree_pattern_chain(include_dir_patterns);\nfree_pattern_chain(exclude_patterns);\nfree_pattern_chain(exclude_dir_patterns);\n\nfree_file_chain(exclude_from);\nfree_file_chain(include_from);\nfree_file_chain(pattern_files);\nfree_file_chain(file_lists);\n\nwhile (only_matching != NULL)\n  {\n  omstr *this = only_matching;\n  only_matching = this->next;\n  free(this);\n  }\n\npcregrep_exit(rc);\n\nEXIT2:\nrc = 2;\ngoto EXIT;\n}\n\n/* End of pcregrep */\n"
  },
  {
    "path": "src/pcre/pcreposix.c",
    "content": "/*************************************************\n*      Perl-Compatible Regular Expressions       *\n*************************************************/\n\n/* PCRE is a library of functions to support regular expressions whose syntax\nand semantics are as close as possible to those of the Perl 5 language.\n\n                       Written by Philip Hazel\n           Copyright (c) 1997-2018 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n\n/* This module is a wrapper that provides a POSIX API to the underlying PCRE\nfunctions. */\n\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n\n/* Ensure that the PCREPOSIX_EXP_xxx macros are set appropriately for\ncompiling these functions. This must come before including pcreposix.h, where\nthey are set for an application (using these functions) if they have not\npreviously been set. */\n\n#if defined(_WIN32) && !defined(PCRE_STATIC)\n#  define PCREPOSIX_EXP_DECL extern __declspec(dllexport)\n#  define PCREPOSIX_EXP_DEFN __declspec(dllexport)\n#endif\n\n/* We include pcre.h before pcre_internal.h so that the PCRE library functions\nare declared as \"import\" for Windows by defining PCRE_EXP_DECL as \"import\".\nThis is needed even though pcre_internal.h itself includes pcre.h, because it\ndoes so after it has set PCRE_EXP_DECL to \"export\" if it is not already set. */\n\n#include \"pcre.h\"\n#include \"pcre_internal.h\"\n#include \"pcreposix.h\"\n\n\n/* Table to translate PCRE compile time error codes into POSIX error codes. */\n\nstatic const int eint[] = {\n  0,           /* no error */\n  REG_EESCAPE, /* \\ at end of pattern */\n  REG_EESCAPE, /* \\c at end of pattern */\n  REG_EESCAPE, /* unrecognized character follows \\ */\n  REG_BADBR,   /* numbers out of order in {} quantifier */\n  /* 5 */\n  REG_BADBR,   /* number too big in {} quantifier */\n  REG_EBRACK,  /* missing terminating ] for character class */\n  REG_ECTYPE,  /* invalid escape sequence in character class */\n  REG_ERANGE,  /* range out of order in character class */\n  REG_BADRPT,  /* nothing to repeat */\n  /* 10 */\n  REG_BADRPT,  /* operand of unlimited repeat could match the empty string */\n  REG_ASSERT,  /* internal error: unexpected repeat */\n  REG_BADPAT,  /* unrecognized character after (? */\n  REG_BADPAT,  /* POSIX named classes are supported only within a class */\n  REG_EPAREN,  /* missing ) */\n  /* 15 */\n  REG_ESUBREG, /* reference to non-existent subpattern */\n  REG_INVARG,  /* erroffset passed as NULL */\n  REG_INVARG,  /* unknown option bit(s) set */\n  REG_EPAREN,  /* missing ) after comment */\n  REG_ESIZE,   /* parentheses nested too deeply */\n  /* 20 */\n  REG_ESIZE,   /* regular expression too large */\n  REG_ESPACE,  /* failed to get memory */\n  REG_EPAREN,  /* unmatched parentheses */\n  REG_ASSERT,  /* internal error: code overflow */\n  REG_BADPAT,  /* unrecognized character after (?< */\n  /* 25 */\n  REG_BADPAT,  /* lookbehind assertion is not fixed length */\n  REG_BADPAT,  /* malformed number or name after (?( */\n  REG_BADPAT,  /* conditional group contains more than two branches */\n  REG_BADPAT,  /* assertion expected after (?( */\n  REG_BADPAT,  /* (?R or (?[+-]digits must be followed by ) */\n  /* 30 */\n  REG_ECTYPE,  /* unknown POSIX class name */\n  REG_BADPAT,  /* POSIX collating elements are not supported */\n  REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UTF8 support */\n  REG_BADPAT,  /* spare error */\n  REG_BADPAT,  /* character value in \\x{} or \\o{} is too large */\n  /* 35 */\n  REG_BADPAT,  /* invalid condition (?(0) */\n  REG_BADPAT,  /* \\C not allowed in lookbehind assertion */\n  REG_EESCAPE, /* PCRE does not support \\L, \\l, \\N, \\U, or \\u */\n  REG_BADPAT,  /* number after (?C is > 255 */\n  REG_BADPAT,  /* closing ) for (?C expected */\n  /* 40 */\n  REG_BADPAT,  /* recursive call could loop indefinitely */\n  REG_BADPAT,  /* unrecognized character after (?P */\n  REG_BADPAT,  /* syntax error in subpattern name (missing terminator) */\n  REG_BADPAT,  /* two named subpatterns have the same name */\n  REG_BADPAT,  /* invalid UTF-8 string */\n  /* 45 */\n  REG_BADPAT,  /* support for \\P, \\p, and \\X has not been compiled */\n  REG_BADPAT,  /* malformed \\P or \\p sequence */\n  REG_BADPAT,  /* unknown property name after \\P or \\p */\n  REG_BADPAT,  /* subpattern name is too long (maximum 32 characters) */\n  REG_BADPAT,  /* too many named subpatterns (maximum 10,000) */\n  /* 50 */\n  REG_BADPAT,  /* repeated subpattern is too long */\n  REG_BADPAT,  /* octal value is greater than \\377 (not in UTF-8 mode) */\n  REG_BADPAT,  /* internal error: overran compiling workspace */\n  REG_BADPAT,  /* internal error: previously-checked referenced subpattern not found */\n  REG_BADPAT,  /* DEFINE group contains more than one branch */\n  /* 55 */\n  REG_BADPAT,  /* repeating a DEFINE group is not allowed */\n  REG_INVARG,  /* inconsistent NEWLINE options */\n  REG_BADPAT,  /* \\g is not followed followed by an (optionally braced) non-zero number */\n  REG_BADPAT,  /* a numbered reference must not be zero */\n  REG_BADPAT,  /* an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) */\n  /* 60 */\n  REG_BADPAT,  /* (*VERB) not recognized */\n  REG_BADPAT,  /* number is too big */\n  REG_BADPAT,  /* subpattern name expected */\n  REG_BADPAT,  /* digit expected after (?+ */\n  REG_BADPAT,  /* ] is an invalid data character in JavaScript compatibility mode */\n  /* 65 */\n  REG_BADPAT,  /* different names for subpatterns of the same number are not allowed */\n  REG_BADPAT,  /* (*MARK) must have an argument */\n  REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UCP support */\n  REG_BADPAT,  /* \\c must be followed by an ASCII character */\n  REG_BADPAT,  /* \\k is not followed by a braced, angle-bracketed, or quoted name */\n  /* 70 */\n  REG_BADPAT,  /* internal error: unknown opcode in find_fixedlength() */\n  REG_BADPAT,  /* \\N is not supported in a class */\n  REG_BADPAT,  /* too many forward references */\n  REG_BADPAT,  /* disallowed UTF-8/16/32 code point (>= 0xd800 && <= 0xdfff) */\n  REG_BADPAT,  /* invalid UTF-16 string (should not occur) */\n  /* 75 */\n  REG_BADPAT,  /* overlong MARK name */\n  REG_BADPAT,  /* character value in \\u.... sequence is too large */\n  REG_BADPAT,  /* invalid UTF-32 string (should not occur) */\n  REG_BADPAT,  /* setting UTF is disabled by the application */\n  REG_BADPAT,  /* non-hex character in \\\\x{} (closing brace missing?) */\n  /* 80 */\n  REG_BADPAT,  /* non-octal character in \\o{} (closing brace missing?) */\n  REG_BADPAT,  /* missing opening brace after \\o */\n  REG_BADPAT,  /* parentheses too deeply nested */\n  REG_BADPAT,  /* invalid range in character class */\n  REG_BADPAT,  /* group name must start with a non-digit */\n  /* 85 */\n  REG_BADPAT,  /* parentheses too deeply nested (stack check) */\n  REG_BADPAT,  /* missing digits in \\x{} or \\o{} */\n  REG_BADPAT   /* pattern too complicated */\n};\n\n/* Table of texts corresponding to POSIX error codes */\n\nstatic const char *const pstring[] = {\n  \"\",                                /* Dummy for value 0 */\n  \"internal error\",                  /* REG_ASSERT */\n  \"invalid repeat counts in {}\",     /* BADBR      */\n  \"pattern error\",                   /* BADPAT     */\n  \"? * + invalid\",                   /* BADRPT     */\n  \"unbalanced {}\",                   /* EBRACE     */\n  \"unbalanced []\",                   /* EBRACK     */\n  \"collation error - not relevant\",  /* ECOLLATE   */\n  \"bad class\",                       /* ECTYPE     */\n  \"bad escape sequence\",             /* EESCAPE    */\n  \"empty expression\",                /* EMPTY      */\n  \"unbalanced ()\",                   /* EPAREN     */\n  \"bad range inside []\",             /* ERANGE     */\n  \"expression too big\",              /* ESIZE      */\n  \"failed to get memory\",            /* ESPACE     */\n  \"bad back reference\",              /* ESUBREG    */\n  \"bad argument\",                    /* INVARG     */\n  \"match failed\"                     /* NOMATCH    */\n};\n\n\n\n\n/*************************************************\n*          Translate error code to string        *\n*************************************************/\n\nPCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION\nregerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)\n{\nconst char *message, *addmessage;\nsize_t length, addlength;\n\nmessage = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?\n  \"unknown error code\" : pstring[errcode];\nlength = strlen(message) + 1;\n\naddmessage = \" at offset \";\naddlength = (preg != NULL && (int)preg->re_erroffset != -1)?\n  strlen(addmessage) + 6 : 0;\n\nif (errbuf_size > 0)\n  {\n  if (addlength > 0 && errbuf_size >= length + addlength)\n    sprintf(errbuf, \"%s%s%-6d\", message, addmessage, (int)preg->re_erroffset);\n  else\n    {\n    strncpy(errbuf, message, errbuf_size - 1);\n    errbuf[errbuf_size-1] = 0;\n    }\n  }\n\nreturn length + addlength;\n}\n\n\n\n\n/*************************************************\n*           Free store held by a regex           *\n*************************************************/\n\nPCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION\nregfree(regex_t *preg)\n{\n(PUBL(free))(preg->re_pcre);\n}\n\n\n\n\n/*************************************************\n*            Compile a regular expression        *\n*************************************************/\n\n/*\nArguments:\n  preg        points to a structure for recording the compiled expression\n  pattern     the pattern to compile\n  cflags      compilation flags\n\nReturns:      0 on success\n              various non-zero codes on failure\n*/\n\nPCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION\nregcomp(regex_t *preg, const char *pattern, int cflags)\n{\nconst char *errorptr;\nint erroffset;\nint errorcode;\nint options = 0;\nint re_nsub = 0;\n\nif ((cflags & REG_ICASE) != 0)    options |= PCRE_CASELESS;\nif ((cflags & REG_NEWLINE) != 0)  options |= PCRE_MULTILINE;\nif ((cflags & REG_DOTALL) != 0)   options |= PCRE_DOTALL;\nif ((cflags & REG_NOSUB) != 0)    options |= PCRE_NO_AUTO_CAPTURE;\nif ((cflags & REG_UTF8) != 0)     options |= PCRE_UTF8;\nif ((cflags & REG_UCP) != 0)      options |= PCRE_UCP;\nif ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY;\n\npreg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,\n  &erroffset, NULL);\npreg->re_erroffset = erroffset;\n\n/* Safety: if the error code is too big for the translation vector (which\nshould not happen, but we all make mistakes), return REG_BADPAT. */\n\nif (preg->re_pcre == NULL)\n  {\n  return (errorcode < (int)(sizeof(eint)/sizeof(const int)))?\n    eint[errorcode] : REG_BADPAT;\n  }\n\n(void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT,\n  &re_nsub);\npreg->re_nsub = (size_t)re_nsub;\nreturn 0;\n}\n\n\n\n\n/*************************************************\n*              Match a regular expression        *\n*************************************************/\n\n/* Unfortunately, PCRE requires 3 ints of working space for each captured\nsubstring, so we have to get and release working store instead of just using\nthe POSIX structures as was done in earlier releases when PCRE needed only 2\nints. However, if the number of possible capturing brackets is small, use a\nblock of store on the stack, to reduce the use of malloc/free. The threshold is\nin a macro that can be changed at configure time.\n\nIf REG_NOSUB was specified at compile time, the PCRE_NO_AUTO_CAPTURE flag will\nbe set. When this is the case, the nmatch and pmatch arguments are ignored, and\nthe only result is yes/no/error. */\n\nPCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION\nregexec(const regex_t *preg, const char *string, size_t nmatch,\n  regmatch_t pmatch[], int eflags)\n{\nint rc, so, eo;\nint options = 0;\nint *ovector = NULL;\nint small_ovector[POSIX_MALLOC_THRESHOLD * 3];\nBOOL allocated_ovector = FALSE;\nBOOL nosub =\n  (REAL_PCRE_OPTIONS((const pcre *)preg->re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0;\n\nif ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;\nif ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;\nif ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY;\n\n((regex_t *)preg)->re_erroffset = (size_t)(-1);  /* Only has meaning after compile */\n\n/* When no string data is being returned, or no vector has been passed in which\nto put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding\nthe return data is large enough. */\n\nif (nosub || pmatch == NULL) nmatch = 0;\n\nelse if (nmatch > 0)\n  {\n  if (nmatch <= POSIX_MALLOC_THRESHOLD)\n    {\n    ovector = &(small_ovector[0]);\n    }\n  else\n    {\n    if (nmatch > INT_MAX/(sizeof(int) * 3)) return REG_ESPACE;\n    ovector = (int *)malloc(sizeof(int) * nmatch * 3);\n    if (ovector == NULL) return REG_ESPACE;\n    allocated_ovector = TRUE;\n    }\n  }\n\n/* REG_STARTEND is a BSD extension, to allow for non-NUL-terminated strings.\nThe man page from OS X says \"REG_STARTEND affects only the location of the\nstring, not how it is matched\". That is why the \"so\" value is used to bump the\nstart location rather than being passed as a PCRE \"starting offset\". */\n\nif ((eflags & REG_STARTEND) != 0)\n  {\n  if (pmatch == NULL) return REG_INVARG;\n  so = pmatch[0].rm_so;\n  eo = pmatch[0].rm_eo;\n  }\nelse\n  {\n  so = 0;\n  eo = (int)strlen(string);\n  }\n\nrc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so),\n  0, options, ovector, (int)(nmatch * 3));\n\nif (rc == 0) rc = (int)nmatch;    /* All captured slots were filled in */\n\n/* Successful match */\n\nif (rc >= 0)\n  {\n  size_t i;\n  if (!nosub)\n    {\n    for (i = 0; i < (size_t)rc; i++)\n      {\n      pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so;\n      pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so;\n      }\n    if (allocated_ovector) free(ovector);\n    for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;\n    }\n  return 0;\n  }\n\n/* Unsuccessful match */\n\nif (allocated_ovector) free(ovector);\nswitch(rc)\n  {\n/* ========================================================================== */\n  /* These cases are never obeyed. This is a fudge that causes a compile-time\n  error if the vector eint, which is indexed by compile-time error number, is\n  not the correct length. It seems to be the only way to do such a check at\n  compile time, as the sizeof() operator does not work in the C preprocessor.\n  As all the PCRE_ERROR_xxx values are negative, we can use 0 and 1. */\n\n  case 0:\n  case (sizeof(eint)/sizeof(int) == ERRCOUNT):\n  return REG_ASSERT;\n/* ========================================================================== */\n\n  case PCRE_ERROR_NOMATCH: return REG_NOMATCH;\n  case PCRE_ERROR_NULL: return REG_INVARG;\n  case PCRE_ERROR_BADOPTION: return REG_INVARG;\n  case PCRE_ERROR_BADMAGIC: return REG_INVARG;\n  case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;\n  case PCRE_ERROR_NOMEMORY: return REG_ESPACE;\n  case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;\n  case PCRE_ERROR_BADUTF8: return REG_INVARG;\n  case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;\n  case PCRE_ERROR_BADMODE: return REG_INVARG;\n  default: return REG_ASSERT;\n  }\n}\n\n/* End of pcreposix.c */\n"
  },
  {
    "path": "src/pcre/pcreposix.h",
    "content": "/*************************************************\n*       Perl-Compatible Regular Expressions      *\n*************************************************/\n\n#ifndef _PCREPOSIX_H\n#define _PCREPOSIX_H\n\n/* This is the header for the POSIX wrapper interface to the PCRE Perl-\nCompatible Regular Expression library. It defines the things POSIX says should\nbe there. I hope.\n\n            Copyright (c) 1997-2012 University of Cambridge\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* Have to include stdlib.h in order to ensure that size_t is defined. */\n\n#include <stdlib.h>\n\n/* Allow for C++ users */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Options, mostly defined by POSIX, but with some extras. */\n\n#define REG_ICASE     0x0001   /* Maps to PCRE_CASELESS */\n#define REG_NEWLINE   0x0002   /* Maps to PCRE_MULTILINE */\n#define REG_NOTBOL    0x0004   /* Maps to PCRE_NOTBOL */\n#define REG_NOTEOL    0x0008   /* Maps to PCRE_NOTEOL */\n#define REG_DOTALL    0x0010   /* NOT defined by POSIX; maps to PCRE_DOTALL */\n#define REG_NOSUB     0x0020   /* Maps to PCRE_NO_AUTO_CAPTURE */\n#define REG_UTF8      0x0040   /* NOT defined by POSIX; maps to PCRE_UTF8 */\n#define REG_STARTEND  0x0080   /* BSD feature: pass subject string by so,eo */\n#define REG_NOTEMPTY  0x0100   /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */\n#define REG_UNGREEDY  0x0200   /* NOT defined by POSIX; maps to PCRE_UNGREEDY */\n#define REG_UCP       0x0400   /* NOT defined by POSIX; maps to PCRE_UCP */\n\n/* This is not used by PCRE, but by defining it we make it easier\nto slot PCRE into existing programs that make POSIX calls. */\n\n#define REG_EXTENDED  0\n\n/* Error values. Not all these are relevant or used by the wrapper. */\n\nenum {\n  REG_ASSERT = 1,  /* internal error ? */\n  REG_BADBR,       /* invalid repeat counts in {} */\n  REG_BADPAT,      /* pattern error */\n  REG_BADRPT,      /* ? * + invalid */\n  REG_EBRACE,      /* unbalanced {} */\n  REG_EBRACK,      /* unbalanced [] */\n  REG_ECOLLATE,    /* collation error - not relevant */\n  REG_ECTYPE,      /* bad class */\n  REG_EESCAPE,     /* bad escape sequence */\n  REG_EMPTY,       /* empty expression */\n  REG_EPAREN,      /* unbalanced () */\n  REG_ERANGE,      /* bad range inside [] */\n  REG_ESIZE,       /* expression too big */\n  REG_ESPACE,      /* failed to get memory */\n  REG_ESUBREG,     /* bad back reference */\n  REG_INVARG,      /* bad argument */\n  REG_NOMATCH      /* match failed */\n};\n\n\n/* The structure representing a compiled regular expression. */\n\ntypedef struct {\n  void *re_pcre;\n  size_t re_nsub;\n  size_t re_erroffset;\n} regex_t;\n\n/* The structure in which a captured offset is returned. */\n\ntypedef int regoff_t;\n\ntypedef struct {\n  regoff_t rm_so;\n  regoff_t rm_eo;\n} regmatch_t;\n\n/* When an application links to a PCRE DLL in Windows, the symbols that are\nimported have to be identified as such. When building PCRE, the appropriate\nexport settings are needed, and are set in pcreposix.c before including this\nfile. */\n\n#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL)\n#  define PCREPOSIX_EXP_DECL  extern __declspec(dllimport)\n#  define PCREPOSIX_EXP_DEFN  __declspec(dllimport)\n#endif\n\n/* By default, we use the standard \"extern\" declarations. */\n\n#ifndef PCREPOSIX_EXP_DECL\n#  ifdef __cplusplus\n#    define PCREPOSIX_EXP_DECL  extern \"C\"\n#    define PCREPOSIX_EXP_DEFN  extern \"C\"\n#  else\n#    define PCREPOSIX_EXP_DECL  extern\n#    define PCREPOSIX_EXP_DEFN  extern\n#  endif\n#endif\n\n/* The functions */\n\nPCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int);\nPCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t,\n                     regmatch_t *, int);\nPCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t);\nPCREPOSIX_EXP_DECL void regfree(regex_t *);\n\n#ifdef __cplusplus\n}   /* extern \"C\" */\n#endif\n\n#endif /* End of pcreposix.h */\n"
  },
  {
    "path": "src/pcre/pcretest.c",
    "content": "/*************************************************\n*             PCRE testing program               *\n*************************************************/\n\n/* This program was hacked up as a tester for PCRE. I really should have\nwritten it more tidily in the first place. Will I ever learn? It has grown and\nbeen extended and consequently is now rather, er, *very* untidy in places. The\naddition of 16-bit support has made it even worse. :-(\n\n-----------------------------------------------------------------------------\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the name of the University of Cambridge nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n-----------------------------------------------------------------------------\n*/\n\n/* This program now supports the testing of all of the 8-bit, 16-bit, and\n32-bit PCRE libraries in a single program. This is different from the modules\nsuch as pcre_compile.c in the library itself, which are compiled separately for\neach mode. If two modes are enabled, for example, pcre_compile.c is compiled\ntwice. By contrast, pcretest.c is compiled only once. Therefore, it must not\nmake use of any of the macros from pcre_internal.h that depend on\nCOMPILE_PCRE8, COMPILE_PCRE16, or COMPILE_PCRE32. It does, however, make use of\nSUPPORT_PCRE8, SUPPORT_PCRE16, and SUPPORT_PCRE32 to ensure that it calls only\nsupported library functions. */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <ctype.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <time.h>\n#include <locale.h>\n#include <errno.h>\n\n/* Both libreadline and libedit are optionally supported. The user-supplied\noriginal patch uses readline/readline.h for libedit, but in at least one system\nit is installed as editline/readline.h, so the configuration code now looks for\nthat first, falling back to readline/readline.h. */\n\n#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#if defined(SUPPORT_LIBREADLINE)\n#include <readline/readline.h>\n#include <readline/history.h>\n#else\n#if defined(HAVE_EDITLINE_READLINE_H)\n#include <editline/readline.h>\n#else\n#include <readline/readline.h>\n#endif\n#endif\n#endif\n\n/* A number of things vary for Windows builds. Originally, pcretest opened its\ninput and output without \"b\"; then I was told that \"b\" was needed in some\nenvironments, so it was added for release 5.0 to both the input and output. (It\nmakes no difference on Unix-like systems.) Later I was told that it is wrong\nfor the input on Windows. I've now abstracted the modes into two macros that\nare set here, to make it easier to fiddle with them, and removed \"b\" from the\ninput mode under Windows. */\n\n#if defined(_WIN32) || defined(WIN32)\n#include <io.h>                /* For _setmode() */\n#include <fcntl.h>             /* For _O_BINARY */\n#define INPUT_MODE   \"r\"\n#define OUTPUT_MODE  \"wb\"\n\n#ifndef isatty\n#define isatty _isatty         /* This is what Windows calls them, I'm told, */\n#endif                         /* though in some environments they seem to   */\n                               /* be already defined, hence the #ifndefs.    */\n#ifndef fileno\n#define fileno _fileno\n#endif\n\n/* A user sent this fix for Borland Builder 5 under Windows. */\n\n#ifdef __BORLANDC__\n#define _setmode(handle, mode) setmode(handle, mode)\n#endif\n\n/* Not Windows */\n\n#else\n#include <sys/time.h>          /* These two includes are needed */\n#include <sys/resource.h>      /* for setrlimit(). */\n#if defined NATIVE_ZOS         /* z/OS uses non-binary I/O */\n#define INPUT_MODE   \"r\"\n#define OUTPUT_MODE  \"w\"\n#else\n#define INPUT_MODE   \"rb\"\n#define OUTPUT_MODE  \"wb\"\n#endif\n#endif\n\n#ifdef __VMS\n#include <ssdef.h>\nvoid vms_setsymbol( char *, char *, int );\n#endif\n\n\n#define PRIV(name) name\n\n/* We have to include pcre_internal.h because we need the internal info for\ndisplaying the results of pcre_study() and we also need to know about the\ninternal macros, structures, and other internal data values; pcretest has\n\"inside information\" compared to a program that strictly follows the PCRE API.\n\nAlthough pcre_internal.h does itself include pcre.h, we explicitly include it\nhere before pcre_internal.h so that the PCRE_EXP_xxx macros get set\nappropriately for an application, not for building PCRE. */\n\n#include \"pcre.h\"\n#include \"pcre_internal.h\"\n\n/* The pcre_printint() function, which prints the internal form of a compiled\nregex, is held in a separate file so that (a) it can be compiled in either\n8-, 16- or 32-bit mode, and (b) it can be #included directly in pcre_compile.c\nwhen that is compiled in debug mode. */\n\n#ifdef SUPPORT_PCRE8\nvoid pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#endif\n#ifdef SUPPORT_PCRE16\nvoid pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#endif\n#ifdef SUPPORT_PCRE32\nvoid pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths);\n#endif\n\n/* We need access to some of the data tables that PCRE uses. So as not to have\nto keep two copies, we include the source files here, changing the names of the\nexternal symbols to prevent clashes. */\n\n#define PCRE_INCLUDED\n\n#include \"pcre_tables.c\"\n#include \"pcre_ucd.c\"\n\n/* The definition of the macro PRINTABLE, which determines whether to print an\noutput character as-is or as a hex value when showing compiled patterns, is\nthe same as in the printint.src file. We uses it here in cases when the locale\nhas not been explicitly changed, so as to get consistent output from systems\nthat differ in their output from isprint() even in the \"C\" locale. */\n\n#ifdef EBCDIC\n#define PRINTABLE(c) ((c) >= 64 && (c) < 255)\n#else\n#define PRINTABLE(c) ((c) >= 32 && (c) < 127)\n#endif\n\n#define PRINTOK(c) (locale_set? (((c) < 256) && isprint(c)) : PRINTABLE(c))\n\n/* Posix support is disabled in 16 or 32 bit only mode. */\n#if !defined SUPPORT_PCRE8 && !defined NOPOSIX\n#define NOPOSIX\n#endif\n\n/* It is possible to compile this test program without including support for\ntesting the POSIX interface, though this is not available via the standard\nMakefile. */\n\n#if !defined NOPOSIX\n#include \"pcreposix.h\"\n#endif\n\n/* It is also possible, originally for the benefit of a version that was\nimported into Exim, to build pcretest without support for UTF8 or UTF16 (define\nNOUTF), without the interface to the DFA matcher (NODFA). In fact, we\nautomatically cut out the UTF support if PCRE is built without it. */\n\n#ifndef SUPPORT_UTF\n#ifndef NOUTF\n#define NOUTF\n#endif\n#endif\n\n/* To make the code a bit tidier for 8/16/32-bit support, we define macros\nfor all the pcre[16]_xxx functions (except pcre16_fullinfo, which is called\nonly from one place and is handled differently). I couldn't dream up any way of\nusing a single macro to do this in a generic way, because of the many different\nargument requirements. We know that at least one of SUPPORT_PCRE8 and\nSUPPORT_PCRE16 must be set. First define macros for each individual mode; then\nuse these in the definitions of generic macros.\n\n**** Special note about the PCHARSxxx macros: the address of the string to be\nprinted is always given as two arguments: a base address followed by an offset.\nThe base address is cast to the correct data size for 8 or 16 bit data; the\noffset is in units of this size. If the string were given as base+offset in one\nargument, the casting might be incorrectly applied. */\n\n#ifdef SUPPORT_PCRE8\n\n#define PCHARS8(lv, p, offset, len, f) \\\n  lv = pchars((pcre_uint8 *)(p) + offset, len, f)\n\n#define PCHARSV8(p, offset, len, f) \\\n  (void)pchars((pcre_uint8 *)(p) + offset, len, f)\n\n#define READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) \\\n  p = read_capture_name8(p, cn8, re)\n\n#define STRLEN8(p) ((int)strlen((char *)p))\n\n#define SET_PCRE_CALLOUT8(callout) \\\n  pcre_callout = callout\n\n#define SET_PCRE_STACK_GUARD8(stack_guard) \\\n  pcre_stack_guard = stack_guard\n\n#define PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) \\\n   pcre_assign_jit_stack(extra, callback, userdata)\n\n#define PCRE_COMPILE8(re, pat, options, error, erroffset, tables) \\\n  re = pcre_compile((char *)pat, options, error, erroffset, tables)\n\n#define PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \\\n    namesptr, cbuffer, size) \\\n  rc = pcre_copy_named_substring(re, (char *)bptr, offsets, count, \\\n    (char *)namesptr, cbuffer, size)\n\n#define PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) \\\n  rc = pcre_copy_substring((char *)bptr, offsets, count, i, cbuffer, size)\n\n#define PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace) \\\n  count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace)\n\n#define PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets) \\\n  count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options, \\\n    offsets, size_offsets)\n\n#define PCRE_FREE_STUDY8(extra) \\\n  pcre_free_study(extra)\n\n#define PCRE_FREE_SUBSTRING8(substring) \\\n  pcre_free_substring(substring)\n\n#define PCRE_FREE_SUBSTRING_LIST8(listptr) \\\n  pcre_free_substring_list(listptr)\n\n#define PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \\\n    getnamesptr, subsptr) \\\n  rc = pcre_get_named_substring(re, (char *)bptr, offsets, count, \\\n    (char *)getnamesptr, subsptr)\n\n#define PCRE_GET_STRINGNUMBER8(n, rc, ptr) \\\n  n = pcre_get_stringnumber(re, (char *)ptr)\n\n#define PCRE_GET_SUBSTRING8(rc, bptr, offsets, count, i, subsptr) \\\n  rc = pcre_get_substring((char *)bptr, offsets, count, i, subsptr)\n\n#define PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) \\\n  rc = pcre_get_substring_list((const char *)bptr, offsets, count, listptr)\n\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) \\\n  rc = pcre_pattern_to_host_byte_order(re, extra, tables)\n\n#define PCRE_PRINTINT8(re, outfile, debug_lengths) \\\n  pcre_printint(re, outfile, debug_lengths)\n\n#define PCRE_STUDY8(extra, re, options, error) \\\n  extra = pcre_study(re, options, error)\n\n#define PCRE_JIT_STACK_ALLOC8(startsize, maxsize) \\\n  pcre_jit_stack_alloc(startsize, maxsize)\n\n#define PCRE_JIT_STACK_FREE8(stack) \\\n  pcre_jit_stack_free(stack)\n\n#define pcre8_maketables pcre_maketables\n\n#endif /* SUPPORT_PCRE8 */\n\n/* -----------------------------------------------------------*/\n\n#ifdef SUPPORT_PCRE16\n\n#define PCHARS16(lv, p, offset, len, f) \\\n  lv = pchars16((PCRE_SPTR16)(p) + offset, len, f)\n\n#define PCHARSV16(p, offset, len, f) \\\n  (void)pchars16((PCRE_SPTR16)(p) + offset, len, f)\n\n#define READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re) \\\n  p = read_capture_name16(p, cn16, re)\n\n#define STRLEN16(p) ((int)strlen16((PCRE_SPTR16)p))\n\n#define SET_PCRE_CALLOUT16(callout) \\\n  pcre16_callout = (int (*)(pcre16_callout_block *))callout\n\n#define SET_PCRE_STACK_GUARD16(stack_guard) \\\n  pcre16_stack_guard = (int (*)(void))stack_guard\n\n#define PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata) \\\n  pcre16_assign_jit_stack((pcre16_extra *)extra, \\\n    (pcre16_jit_callback)callback, userdata)\n\n#define PCRE_COMPILE16(re, pat, options, error, erroffset, tables) \\\n  re = (pcre *)pcre16_compile((PCRE_SPTR16)pat, options, error, erroffset, \\\n    tables)\n\n#define PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \\\n    namesptr, cbuffer, size) \\\n  rc = pcre16_copy_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \\\n    count, (PCRE_SPTR16)namesptr, (PCRE_UCHAR16 *)cbuffer, size/2)\n\n#define PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size) \\\n  rc = pcre16_copy_substring((PCRE_SPTR16)bptr, offsets, count, i, \\\n    (PCRE_UCHAR16 *)cbuffer, size/2)\n\n#define PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace) \\\n  count = pcre16_dfa_exec((pcre16 *)re, (pcre16_extra *)extra, \\\n    (PCRE_SPTR16)bptr, len, start_offset, options, offsets, size_offsets, \\\n    workspace, size_workspace)\n\n#define PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets) \\\n  count = pcre16_exec((pcre16 *)re, (pcre16_extra *)extra, (PCRE_SPTR16)bptr, \\\n    len, start_offset, options, offsets, size_offsets)\n\n#define PCRE_FREE_STUDY16(extra) \\\n  pcre16_free_study((pcre16_extra *)extra)\n\n#define PCRE_FREE_SUBSTRING16(substring) \\\n  pcre16_free_substring((PCRE_SPTR16)substring)\n\n#define PCRE_FREE_SUBSTRING_LIST16(listptr) \\\n  pcre16_free_substring_list((PCRE_SPTR16 *)listptr)\n\n#define PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \\\n    getnamesptr, subsptr) \\\n  rc = pcre16_get_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \\\n    count, (PCRE_SPTR16)getnamesptr, (PCRE_SPTR16 *)(void*)subsptr)\n\n#define PCRE_GET_STRINGNUMBER16(n, rc, ptr) \\\n  n = pcre16_get_stringnumber(re, (PCRE_SPTR16)ptr)\n\n#define PCRE_GET_SUBSTRING16(rc, bptr, offsets, count, i, subsptr) \\\n  rc = pcre16_get_substring((PCRE_SPTR16)bptr, offsets, count, i, \\\n    (PCRE_SPTR16 *)(void*)subsptr)\n\n#define PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr) \\\n  rc = pcre16_get_substring_list((PCRE_SPTR16)bptr, offsets, count, \\\n    (PCRE_SPTR16 **)(void*)listptr)\n\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables) \\\n  rc = pcre16_pattern_to_host_byte_order((pcre16 *)re, (pcre16_extra *)extra, \\\n    tables)\n\n#define PCRE_PRINTINT16(re, outfile, debug_lengths) \\\n  pcre16_printint(re, outfile, debug_lengths)\n\n#define PCRE_STUDY16(extra, re, options, error) \\\n  extra = (pcre_extra *)pcre16_study((pcre16 *)re, options, error)\n\n#define PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \\\n  (pcre_jit_stack *)pcre16_jit_stack_alloc(startsize, maxsize)\n\n#define PCRE_JIT_STACK_FREE16(stack) \\\n  pcre16_jit_stack_free((pcre16_jit_stack *)stack)\n\n#endif /* SUPPORT_PCRE16 */\n\n/* -----------------------------------------------------------*/\n\n#ifdef SUPPORT_PCRE32\n\n#define PCHARS32(lv, p, offset, len, f) \\\n  lv = pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f)\n\n#define PCHARSV32(p, offset, len, f)                \\\n  (void)pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f)\n\n#define READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re) \\\n  p = read_capture_name32(p, cn32, re)\n\n#define STRLEN32(p) ((int)strlen32((PCRE_SPTR32)p))\n\n#define SET_PCRE_CALLOUT32(callout) \\\n  pcre32_callout = (int (*)(pcre32_callout_block *))callout\n\n#define SET_PCRE_STACK_GUARD32(stack_guard) \\\n  pcre32_stack_guard = (int (*)(void))stack_guard\n\n#define PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata) \\\n  pcre32_assign_jit_stack((pcre32_extra *)extra, \\\n    (pcre32_jit_callback)callback, userdata)\n\n#define PCRE_COMPILE32(re, pat, options, error, erroffset, tables) \\\n  re = (pcre *)pcre32_compile((PCRE_SPTR32)pat, options, error, erroffset, \\\n    tables)\n\n#define PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \\\n    namesptr, cbuffer, size) \\\n  rc = pcre32_copy_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \\\n    count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/4)\n\n#define PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size) \\\n  rc = pcre32_copy_substring((PCRE_SPTR32)bptr, offsets, count, i, \\\n    (PCRE_UCHAR32 *)cbuffer, size/4)\n\n#define PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace) \\\n  count = pcre32_dfa_exec((pcre32 *)re, (pcre32_extra *)extra, \\\n    (PCRE_SPTR32)bptr, len, start_offset, options, offsets, size_offsets, \\\n    workspace, size_workspace)\n\n#define PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets) \\\n  count = pcre32_exec((pcre32 *)re, (pcre32_extra *)extra, (PCRE_SPTR32)bptr, \\\n    len, start_offset, options, offsets, size_offsets)\n\n#define PCRE_FREE_STUDY32(extra) \\\n  pcre32_free_study((pcre32_extra *)extra)\n\n#define PCRE_FREE_SUBSTRING32(substring) \\\n  pcre32_free_substring((PCRE_SPTR32)substring)\n\n#define PCRE_FREE_SUBSTRING_LIST32(listptr) \\\n  pcre32_free_substring_list((PCRE_SPTR32 *)listptr)\n\n#define PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \\\n    getnamesptr, subsptr) \\\n  rc = pcre32_get_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \\\n    count, (PCRE_SPTR32)getnamesptr, (PCRE_SPTR32 *)(void*)subsptr)\n\n#define PCRE_GET_STRINGNUMBER32(n, rc, ptr) \\\n  n = pcre32_get_stringnumber(re, (PCRE_SPTR32)ptr)\n\n#define PCRE_GET_SUBSTRING32(rc, bptr, offsets, count, i, subsptr) \\\n  rc = pcre32_get_substring((PCRE_SPTR32)bptr, offsets, count, i, \\\n    (PCRE_SPTR32 *)(void*)subsptr)\n\n#define PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr) \\\n  rc = pcre32_get_substring_list((PCRE_SPTR32)bptr, offsets, count, \\\n    (PCRE_SPTR32 **)(void*)listptr)\n\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables) \\\n  rc = pcre32_pattern_to_host_byte_order((pcre32 *)re, (pcre32_extra *)extra, \\\n    tables)\n\n#define PCRE_PRINTINT32(re, outfile, debug_lengths) \\\n  pcre32_printint(re, outfile, debug_lengths)\n\n#define PCRE_STUDY32(extra, re, options, error) \\\n  extra = (pcre_extra *)pcre32_study((pcre32 *)re, options, error)\n\n#define PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \\\n  (pcre_jit_stack *)pcre32_jit_stack_alloc(startsize, maxsize)\n\n#define PCRE_JIT_STACK_FREE32(stack) \\\n  pcre32_jit_stack_free((pcre32_jit_stack *)stack)\n\n#endif /* SUPPORT_PCRE32 */\n\n\n/* ----- More than one mode is supported; a runtime test is needed, except for\npcre_config(), and the JIT stack functions, when it doesn't matter which\navailable version is called. ----- */\n\nenum {\n  PCRE8_MODE,\n  PCRE16_MODE,\n  PCRE32_MODE\n};\n\n#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \\\n     defined (SUPPORT_PCRE32)) >= 2\n\n#define CHAR_SIZE (1 << pcre_mode)\n\n/* There doesn't seem to be an easy way of writing these macros that can cope\nwith the 3 pairs of bit sizes plus all three bit sizes. So just handle all the\ncases separately. */\n\n/* ----- All three modes supported ----- */\n\n#if defined(SUPPORT_PCRE8) && defined(SUPPORT_PCRE16) && defined(SUPPORT_PCRE32)\n\n#define PCHARS(lv, p, offset, len, f) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCHARS32(lv, p, offset, len, f); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCHARS16(lv, p, offset, len, f); \\\n  else \\\n    PCHARS8(lv, p, offset, len, f)\n\n#define PCHARSV(p, offset, len, f) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCHARSV32(p, offset, len, f); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCHARSV16(p, offset, len, f); \\\n  else \\\n    PCHARSV8(p, offset, len, f)\n\n#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re); \\\n  else \\\n    READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re)\n\n#define SET_PCRE_CALLOUT(callout) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    SET_PCRE_CALLOUT32(callout); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    SET_PCRE_CALLOUT16(callout); \\\n  else \\\n    SET_PCRE_CALLOUT8(callout)\n\n#define SET_PCRE_STACK_GUARD(stack_guard) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    SET_PCRE_STACK_GUARD32(stack_guard); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    SET_PCRE_STACK_GUARD16(stack_guard); \\\n  else \\\n    SET_PCRE_STACK_GUARD8(stack_guard)\n\n#define STRLEN(p) (pcre_mode == PCRE32_MODE ? STRLEN32(p) : pcre_mode == PCRE16_MODE ? STRLEN16(p) : STRLEN8(p))\n\n#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata); \\\n  else \\\n    PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata)\n\n#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_COMPILE32(re, pat, options, error, erroffset, tables); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_COMPILE16(re, pat, options, error, erroffset, tables); \\\n  else \\\n    PCRE_COMPILE8(re, pat, options, error, erroffset, tables)\n\n#define PCRE_CONFIG pcre_config\n\n#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \\\n    namesptr, cbuffer, size) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \\\n      namesptr, cbuffer, size); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \\\n      namesptr, cbuffer, size); \\\n  else \\\n    PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \\\n      namesptr, cbuffer, size)\n\n#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size); \\\n  else \\\n    PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size)\n\n#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets, workspace, size_workspace); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets, workspace, size_workspace); \\\n  else \\\n    PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets, workspace, size_workspace)\n\n#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets); \\\n  else \\\n    PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets)\n\n#define PCRE_FREE_STUDY(extra) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_FREE_STUDY32(extra); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_FREE_STUDY16(extra); \\\n  else \\\n    PCRE_FREE_STUDY8(extra)\n\n#define PCRE_FREE_SUBSTRING(substring) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_FREE_SUBSTRING32(substring); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_FREE_SUBSTRING16(substring); \\\n  else \\\n    PCRE_FREE_SUBSTRING8(substring)\n\n#define PCRE_FREE_SUBSTRING_LIST(listptr) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_FREE_SUBSTRING_LIST32(listptr); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_FREE_SUBSTRING_LIST16(listptr); \\\n  else \\\n    PCRE_FREE_SUBSTRING_LIST8(listptr)\n\n#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \\\n    getnamesptr, subsptr) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \\\n      getnamesptr, subsptr); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \\\n      getnamesptr, subsptr); \\\n  else \\\n    PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \\\n      getnamesptr, subsptr)\n\n#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_GET_STRINGNUMBER32(n, rc, ptr); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_GET_STRINGNUMBER16(n, rc, ptr); \\\n  else \\\n    PCRE_GET_STRINGNUMBER8(n, rc, ptr)\n\n#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_GET_SUBSTRING32(rc, bptr, use_offsets, count, i, subsptr); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_GET_SUBSTRING16(rc, bptr, use_offsets, count, i, subsptr); \\\n  else \\\n    PCRE_GET_SUBSTRING8(rc, bptr, use_offsets, count, i, subsptr)\n\n#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr); \\\n  else \\\n    PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr)\n\n#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \\\n  (pcre_mode == PCRE32_MODE ? \\\n     PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \\\n    : pcre_mode == PCRE16_MODE ? \\\n      PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \\\n      : PCRE_JIT_STACK_ALLOC8(startsize, maxsize))\n\n#define PCRE_JIT_STACK_FREE(stack) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_JIT_STACK_FREE32(stack); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_JIT_STACK_FREE16(stack); \\\n  else \\\n    PCRE_JIT_STACK_FREE8(stack)\n\n#define PCRE_MAKETABLES \\\n  (pcre_mode == PCRE32_MODE ? pcre32_maketables() : pcre_mode == PCRE16_MODE ? pcre16_maketables() : pcre_maketables())\n\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables); \\\n  else \\\n    PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables)\n\n#define PCRE_PRINTINT(re, outfile, debug_lengths) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_PRINTINT32(re, outfile, debug_lengths); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_PRINTINT16(re, outfile, debug_lengths); \\\n  else \\\n    PCRE_PRINTINT8(re, outfile, debug_lengths)\n\n#define PCRE_STUDY(extra, re, options, error) \\\n  if (pcre_mode == PCRE32_MODE) \\\n    PCRE_STUDY32(extra, re, options, error); \\\n  else if (pcre_mode == PCRE16_MODE) \\\n    PCRE_STUDY16(extra, re, options, error); \\\n  else \\\n    PCRE_STUDY8(extra, re, options, error)\n\n\n/* ----- Two out of three modes are supported ----- */\n\n#else\n\n/* We can use some macro trickery to make a single set of definitions work in\nthe three different cases. */\n\n/* ----- 32-bit and 16-bit but not 8-bit supported ----- */\n\n#if defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE16)\n#define BITONE 32\n#define BITTWO 16\n\n/* ----- 32-bit and 8-bit but not 16-bit supported ----- */\n\n#elif defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE8)\n#define BITONE 32\n#define BITTWO 8\n\n/* ----- 16-bit and 8-bit but not 32-bit supported ----- */\n\n#else\n#define BITONE 16\n#define BITTWO 8\n#endif\n\n#define glue(a,b) a##b\n#define G(a,b) glue(a,b)\n\n\n/* ----- Common macros for two-mode cases ----- */\n\n#define PCHARS(lv, p, offset, len, f) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCHARS,BITONE)(lv, p, offset, len, f); \\\n  else \\\n    G(PCHARS,BITTWO)(lv, p, offset, len, f)\n\n#define PCHARSV(p, offset, len, f) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCHARSV,BITONE)(p, offset, len, f); \\\n  else \\\n    G(PCHARSV,BITTWO)(p, offset, len, f)\n\n#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(READ_CAPTURE_NAME,BITONE)(p, cn8, cn16, cn32, re); \\\n  else \\\n    G(READ_CAPTURE_NAME,BITTWO)(p, cn8, cn16, cn32, re)\n\n#define SET_PCRE_CALLOUT(callout) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(SET_PCRE_CALLOUT,BITONE)(callout); \\\n  else \\\n    G(SET_PCRE_CALLOUT,BITTWO)(callout)\n\n#define SET_PCRE_STACK_GUARD(stack_guard) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(SET_PCRE_STACK_GUARD,BITONE)(stack_guard); \\\n  else \\\n    G(SET_PCRE_STACK_GUARD,BITTWO)(stack_guard)\n\n#define STRLEN(p) ((pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \\\n  G(STRLEN,BITONE)(p) : G(STRLEN,BITTWO)(p))\n\n#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_ASSIGN_JIT_STACK,BITONE)(extra, callback, userdata); \\\n  else \\\n    G(PCRE_ASSIGN_JIT_STACK,BITTWO)(extra, callback, userdata)\n\n#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_COMPILE,BITONE)(re, pat, options, error, erroffset, tables); \\\n  else \\\n    G(PCRE_COMPILE,BITTWO)(re, pat, options, error, erroffset, tables)\n\n#define PCRE_CONFIG G(G(pcre,BITONE),_config)\n\n#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \\\n    namesptr, cbuffer, size) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_COPY_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \\\n      namesptr, cbuffer, size); \\\n  else \\\n    G(PCRE_COPY_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \\\n      namesptr, cbuffer, size)\n\n#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_COPY_SUBSTRING,BITONE)(rc, bptr, offsets, count, i, cbuffer, size); \\\n  else \\\n    G(PCRE_COPY_SUBSTRING,BITTWO)(rc, bptr, offsets, count, i, cbuffer, size)\n\n#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets, workspace, size_workspace) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_DFA_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets, workspace, size_workspace); \\\n  else \\\n    G(PCRE_DFA_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets, workspace, size_workspace)\n\n#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \\\n    offsets, size_offsets) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets); \\\n  else \\\n    G(PCRE_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \\\n      offsets, size_offsets)\n\n#define PCRE_FREE_STUDY(extra) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_FREE_STUDY,BITONE)(extra); \\\n  else \\\n    G(PCRE_FREE_STUDY,BITTWO)(extra)\n\n#define PCRE_FREE_SUBSTRING(substring) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_FREE_SUBSTRING,BITONE)(substring); \\\n  else \\\n    G(PCRE_FREE_SUBSTRING,BITTWO)(substring)\n\n#define PCRE_FREE_SUBSTRING_LIST(listptr) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_FREE_SUBSTRING_LIST,BITONE)(listptr); \\\n  else \\\n    G(PCRE_FREE_SUBSTRING_LIST,BITTWO)(listptr)\n\n#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \\\n    getnamesptr, subsptr) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_GET_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \\\n      getnamesptr, subsptr); \\\n  else \\\n    G(PCRE_GET_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \\\n      getnamesptr, subsptr)\n\n#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_GET_STRINGNUMBER,BITONE)(n, rc, ptr); \\\n  else \\\n    G(PCRE_GET_STRINGNUMBER,BITTWO)(n, rc, ptr)\n\n#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_GET_SUBSTRING,BITONE)(rc, bptr, use_offsets, count, i, subsptr); \\\n  else \\\n    G(PCRE_GET_SUBSTRING,BITTWO)(rc, bptr, use_offsets, count, i, subsptr)\n\n#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_GET_SUBSTRING_LIST,BITONE)(rc, bptr, offsets, count, listptr); \\\n  else \\\n    G(PCRE_GET_SUBSTRING_LIST,BITTWO)(rc, bptr, offsets, count, listptr)\n\n#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \\\n  (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \\\n     G(PCRE_JIT_STACK_ALLOC,BITONE)(startsize, maxsize) \\\n    : G(PCRE_JIT_STACK_ALLOC,BITTWO)(startsize, maxsize)\n\n#define PCRE_JIT_STACK_FREE(stack) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_JIT_STACK_FREE,BITONE)(stack); \\\n  else \\\n    G(PCRE_JIT_STACK_FREE,BITTWO)(stack)\n\n#define PCRE_MAKETABLES \\\n  (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \\\n    G(G(pcre,BITONE),_maketables)() : G(G(pcre,BITTWO),_maketables)()\n\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITONE)(rc, re, extra, tables); \\\n  else \\\n    G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITTWO)(rc, re, extra, tables)\n\n#define PCRE_PRINTINT(re, outfile, debug_lengths) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_PRINTINT,BITONE)(re, outfile, debug_lengths); \\\n  else \\\n    G(PCRE_PRINTINT,BITTWO)(re, outfile, debug_lengths)\n\n#define PCRE_STUDY(extra, re, options, error) \\\n  if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \\\n    G(PCRE_STUDY,BITONE)(extra, re, options, error); \\\n  else \\\n    G(PCRE_STUDY,BITTWO)(extra, re, options, error)\n\n#endif  /* Two out of three modes */\n\n/* ----- End of cases where more than one mode is supported ----- */\n\n\n/* ----- Only 8-bit mode is supported ----- */\n\n#elif defined SUPPORT_PCRE8\n#define CHAR_SIZE                 1\n#define PCHARS                    PCHARS8\n#define PCHARSV                   PCHARSV8\n#define READ_CAPTURE_NAME         READ_CAPTURE_NAME8\n#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT8\n#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD8\n#define STRLEN                    STRLEN8\n#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK8\n#define PCRE_COMPILE              PCRE_COMPILE8\n#define PCRE_CONFIG               pcre_config\n#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING8\n#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING8\n#define PCRE_DFA_EXEC             PCRE_DFA_EXEC8\n#define PCRE_EXEC                 PCRE_EXEC8\n#define PCRE_FREE_STUDY           PCRE_FREE_STUDY8\n#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING8\n#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST8\n#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING8\n#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER8\n#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING8\n#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST8\n#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC8\n#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE8\n#define PCRE_MAKETABLES           pcre_maketables()\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER8\n#define PCRE_PRINTINT             PCRE_PRINTINT8\n#define PCRE_STUDY                PCRE_STUDY8\n\n/* ----- Only 16-bit mode is supported ----- */\n\n#elif defined SUPPORT_PCRE16\n#define CHAR_SIZE                 2\n#define PCHARS                    PCHARS16\n#define PCHARSV                   PCHARSV16\n#define READ_CAPTURE_NAME         READ_CAPTURE_NAME16\n#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT16\n#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD16\n#define STRLEN                    STRLEN16\n#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK16\n#define PCRE_COMPILE              PCRE_COMPILE16\n#define PCRE_CONFIG               pcre16_config\n#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING16\n#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING16\n#define PCRE_DFA_EXEC             PCRE_DFA_EXEC16\n#define PCRE_EXEC                 PCRE_EXEC16\n#define PCRE_FREE_STUDY           PCRE_FREE_STUDY16\n#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING16\n#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST16\n#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING16\n#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER16\n#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING16\n#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST16\n#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC16\n#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE16\n#define PCRE_MAKETABLES           pcre16_maketables()\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER16\n#define PCRE_PRINTINT             PCRE_PRINTINT16\n#define PCRE_STUDY                PCRE_STUDY16\n\n/* ----- Only 32-bit mode is supported ----- */\n\n#elif defined SUPPORT_PCRE32\n#define CHAR_SIZE                 4\n#define PCHARS                    PCHARS32\n#define PCHARSV                   PCHARSV32\n#define READ_CAPTURE_NAME         READ_CAPTURE_NAME32\n#define SET_PCRE_CALLOUT          SET_PCRE_CALLOUT32\n#define SET_PCRE_STACK_GUARD      SET_PCRE_STACK_GUARD32\n#define STRLEN                    STRLEN32\n#define PCRE_ASSIGN_JIT_STACK     PCRE_ASSIGN_JIT_STACK32\n#define PCRE_COMPILE              PCRE_COMPILE32\n#define PCRE_CONFIG               pcre32_config\n#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING32\n#define PCRE_COPY_SUBSTRING       PCRE_COPY_SUBSTRING32\n#define PCRE_DFA_EXEC             PCRE_DFA_EXEC32\n#define PCRE_EXEC                 PCRE_EXEC32\n#define PCRE_FREE_STUDY           PCRE_FREE_STUDY32\n#define PCRE_FREE_SUBSTRING       PCRE_FREE_SUBSTRING32\n#define PCRE_FREE_SUBSTRING_LIST  PCRE_FREE_SUBSTRING_LIST32\n#define PCRE_GET_NAMED_SUBSTRING  PCRE_GET_NAMED_SUBSTRING32\n#define PCRE_GET_STRINGNUMBER     PCRE_GET_STRINGNUMBER32\n#define PCRE_GET_SUBSTRING        PCRE_GET_SUBSTRING32\n#define PCRE_GET_SUBSTRING_LIST   PCRE_GET_SUBSTRING_LIST32\n#define PCRE_JIT_STACK_ALLOC      PCRE_JIT_STACK_ALLOC32\n#define PCRE_JIT_STACK_FREE       PCRE_JIT_STACK_FREE32\n#define PCRE_MAKETABLES           pcre32_maketables()\n#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER32\n#define PCRE_PRINTINT             PCRE_PRINTINT32\n#define PCRE_STUDY                PCRE_STUDY32\n\n#endif\n\n/* ----- End of mode-specific function call macros ----- */\n\n\n/* Other parameters */\n\n#ifndef CLOCKS_PER_SEC\n#ifdef CLK_TCK\n#define CLOCKS_PER_SEC CLK_TCK\n#else\n#define CLOCKS_PER_SEC 100\n#endif\n#endif\n\n#if !defined NODFA\n#define DFA_WS_DIMENSION 1000\n#endif\n\n/* This is the default loop count for timing. */\n\n#define LOOPREPEAT 500000\n\n/* Static variables */\n\nstatic FILE *outfile;\nstatic int log_store = 0;\nstatic int callout_count;\nstatic int callout_extra;\nstatic int callout_fail_count;\nstatic int callout_fail_id;\nstatic int debug_lengths;\nstatic int first_callout;\nstatic int jit_was_used;\nstatic int locale_set = 0;\nstatic int show_malloc;\nstatic int stack_guard_return;\nstatic int use_utf;\nstatic const unsigned char *last_callout_mark = NULL;\n\n/* The buffers grow automatically if very long input lines are encountered. */\n\nstatic int buffer_size = 50000;\nstatic pcre_uint8 *buffer = NULL;\nstatic pcre_uint8 *pbuffer = NULL;\n\n/* Just as a safety check, make sure that COMPILE_PCRE[16|32] are *not* set. */\n\n#ifdef COMPILE_PCRE16\n#error COMPILE_PCRE16 must not be set when compiling pcretest.c\n#endif\n\n#ifdef COMPILE_PCRE32\n#error COMPILE_PCRE32 must not be set when compiling pcretest.c\n#endif\n\n/* We need buffers for building 16/32-bit strings, and the tables of operator\nlengths that are used for 16/32-bit compiling, in order to swap bytes in a\npattern for saving/reloading testing. Luckily, the data for these tables is\ndefined as a macro. However, we must ensure that LINK_SIZE and IMM2_SIZE (which\nare used in the tables) are adjusted appropriately for the 16/32-bit world.\nLINK_SIZE is also used later in this program. */\n\n#ifdef SUPPORT_PCRE16\n#undef IMM2_SIZE\n#define IMM2_SIZE 1\n\n#if LINK_SIZE == 2\n#undef LINK_SIZE\n#define LINK_SIZE 1\n#elif LINK_SIZE == 3 || LINK_SIZE == 4\n#undef LINK_SIZE\n#define LINK_SIZE 2\n#else\n#error LINK_SIZE must be either 2, 3, or 4\n#endif\n\nstatic int buffer16_size = 0;\nstatic pcre_uint16 *buffer16 = NULL;\nstatic const pcre_uint16 OP_lengths16[] = { OP_LENGTHS };\n#endif  /* SUPPORT_PCRE16 */\n\n#ifdef SUPPORT_PCRE32\n#undef IMM2_SIZE\n#define IMM2_SIZE 1\n#undef LINK_SIZE\n#define LINK_SIZE 1\n\nstatic int buffer32_size = 0;\nstatic pcre_uint32 *buffer32 = NULL;\nstatic const pcre_uint32 OP_lengths32[] = { OP_LENGTHS };\n#endif  /* SUPPORT_PCRE32 */\n\n/* If we have 8-bit support, default to it; if there is also 16-or 32-bit\nsupport, it can be changed by an option. If there is no 8-bit support, there\nmust be 16-or 32-bit support, so default it to 1. */\n\n#if defined SUPPORT_PCRE8\nstatic int pcre_mode = PCRE8_MODE;\n#elif defined SUPPORT_PCRE16\nstatic int pcre_mode = PCRE16_MODE;\n#elif defined SUPPORT_PCRE32\nstatic int pcre_mode = PCRE32_MODE;\n#endif\n\n/* JIT study options for -s+n and /S+n where '1' <= n <= '7'. */\n\nstatic int jit_study_bits[] =\n  {\n  PCRE_STUDY_JIT_COMPILE,\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE,\n  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE,\n  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,\n  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE,\n  PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE +\n    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE\n};\n\n#define PCRE_STUDY_ALLJIT (PCRE_STUDY_JIT_COMPILE | \\\n  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE | PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE)\n\n/* Textual explanations for runtime error codes */\n\nstatic const char *errtexts[] = {\n  NULL,  /* 0 is no error */\n  NULL,  /* NOMATCH is handled specially */\n  \"NULL argument passed\",\n  \"bad option value\",\n  \"magic number missing\",\n  \"unknown opcode - pattern overwritten?\",\n  \"no more memory\",\n  NULL,  /* never returned by pcre_exec() or pcre_dfa_exec() */\n  \"match limit exceeded\",\n  \"callout error code\",\n  NULL,  /* BADUTF8/16 is handled specially */\n  NULL,  /* BADUTF8/16 offset is handled specially */\n  NULL,  /* PARTIAL is handled specially */\n  \"not used - internal error\",\n  \"internal error - pattern overwritten?\",\n  \"bad count value\",\n  \"item unsupported for DFA matching\",\n  \"backreference condition or recursion test not supported for DFA matching\",\n  \"match limit not supported for DFA matching\",\n  \"workspace size exceeded in DFA matching\",\n  \"too much recursion for DFA matching\",\n  \"recursion limit exceeded\",\n  \"not used - internal error\",\n  \"invalid combination of newline options\",\n  \"bad offset value\",\n  NULL,  /* SHORTUTF8/16 is handled specially */\n  \"nested recursion at the same subject position\",\n  \"JIT stack limit reached\",\n  \"pattern compiled in wrong mode: 8-bit/16-bit error\",\n  \"pattern compiled with other endianness\",\n  \"invalid data in workspace for DFA restart\",\n  \"bad JIT option\",\n  \"bad length\"\n};\n\n\n/*************************************************\n*         Alternate character tables             *\n*************************************************/\n\n/* By default, the \"tables\" pointer when calling PCRE is set to NULL, thereby\nusing the default tables of the library. However, the T option can be used to\nselect alternate sets of tables, for different kinds of testing. Note also that\nthe L (locale) option also adjusts the tables. */\n\n/* This is the set of tables distributed as default with PCRE. It recognizes\nonly ASCII characters. */\n\nstatic const pcre_uint8 tables0[] = {\n\n/* This table is a lower casing table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table is a case flipping table. */\n\n    0,  1,  2,  3,  4,  5,  6,  7,\n    8,  9, 10, 11, 12, 13, 14, 15,\n   16, 17, 18, 19, 20, 21, 22, 23,\n   24, 25, 26, 27, 28, 29, 30, 31,\n   32, 33, 34, 35, 36, 37, 38, 39,\n   40, 41, 42, 43, 44, 45, 46, 47,\n   48, 49, 50, 51, 52, 53, 54, 55,\n   56, 57, 58, 59, 60, 61, 62, 63,\n   64, 97, 98, 99,100,101,102,103,\n  104,105,106,107,108,109,110,111,\n  112,113,114,115,116,117,118,119,\n  120,121,122, 91, 92, 93, 94, 95,\n   96, 65, 66, 67, 68, 69, 70, 71,\n   72, 73, 74, 75, 76, 77, 78, 79,\n   80, 81, 82, 83, 84, 85, 86, 87,\n   88, 89, 90,123,124,125,126,127,\n  128,129,130,131,132,133,134,135,\n  136,137,138,139,140,141,142,143,\n  144,145,146,147,148,149,150,151,\n  152,153,154,155,156,157,158,159,\n  160,161,162,163,164,165,166,167,\n  168,169,170,171,172,173,174,175,\n  176,177,178,179,180,181,182,183,\n  184,185,186,187,188,189,190,191,\n  192,193,194,195,196,197,198,199,\n  200,201,202,203,204,205,206,207,\n  208,209,210,211,212,213,214,215,\n  216,217,218,219,220,221,222,223,\n  224,225,226,227,228,229,230,231,\n  232,233,234,235,236,237,238,239,\n  240,241,242,243,244,245,246,247,\n  248,249,250,251,252,253,254,255,\n\n/* This table contains bit maps for various character classes. Each map is 32\nbytes long and the bits run from the least significant end of each byte. The\nclasses that have their own maps are: space, xdigit, digit, upper, lower, word,\ngraph, print, punct, and cntrl. Other classes are built from combinations. */\n\n  0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03,\n  0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,\n  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc,\n  0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n  0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\n/* This table identifies various classes of character by individual bits:\n  0x01   white space character\n  0x02   letter\n  0x04   decimal digit\n  0x08   hexadecimal digit\n  0x10   alphanumeric or '_'\n  0x80   regular expression metacharacter or binary zero\n*/\n\n  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */\n  0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /*   8- 15 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */\n  0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /*    - '  */\n  0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /*  ( - /  */\n  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */\n  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /*  8 - ?  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  @ - G  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  H - O  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  P - W  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /*  X - _  */\n  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  ` - g  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  h - o  */\n  0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  p - w  */\n  0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /*  x -127 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */\n\n/* This is a set of tables that came originally from a Windows user. It seems\nto be at least an approximation of ISO 8859. In particular, there are\ncharacters greater than 128 that are marked as spaces, letters, etc. */\n\nstatic const pcre_uint8 tables1[] = {\n0,1,2,3,4,5,6,7,\n8,9,10,11,12,13,14,15,\n16,17,18,19,20,21,22,23,\n24,25,26,27,28,29,30,31,\n32,33,34,35,36,37,38,39,\n40,41,42,43,44,45,46,47,\n48,49,50,51,52,53,54,55,\n56,57,58,59,60,61,62,63,\n64,97,98,99,100,101,102,103,\n104,105,106,107,108,109,110,111,\n112,113,114,115,116,117,118,119,\n120,121,122,91,92,93,94,95,\n96,97,98,99,100,101,102,103,\n104,105,106,107,108,109,110,111,\n112,113,114,115,116,117,118,119,\n120,121,122,123,124,125,126,127,\n128,129,130,131,132,133,134,135,\n136,137,138,139,140,141,142,143,\n144,145,146,147,148,149,150,151,\n152,153,154,155,156,157,158,159,\n160,161,162,163,164,165,166,167,\n168,169,170,171,172,173,174,175,\n176,177,178,179,180,181,182,183,\n184,185,186,187,188,189,190,191,\n224,225,226,227,228,229,230,231,\n232,233,234,235,236,237,238,239,\n240,241,242,243,244,245,246,215,\n248,249,250,251,252,253,254,223,\n224,225,226,227,228,229,230,231,\n232,233,234,235,236,237,238,239,\n240,241,242,243,244,245,246,247,\n248,249,250,251,252,253,254,255,\n0,1,2,3,4,5,6,7,\n8,9,10,11,12,13,14,15,\n16,17,18,19,20,21,22,23,\n24,25,26,27,28,29,30,31,\n32,33,34,35,36,37,38,39,\n40,41,42,43,44,45,46,47,\n48,49,50,51,52,53,54,55,\n56,57,58,59,60,61,62,63,\n64,97,98,99,100,101,102,103,\n104,105,106,107,108,109,110,111,\n112,113,114,115,116,117,118,119,\n120,121,122,91,92,93,94,95,\n96,65,66,67,68,69,70,71,\n72,73,74,75,76,77,78,79,\n80,81,82,83,84,85,86,87,\n88,89,90,123,124,125,126,127,\n128,129,130,131,132,133,134,135,\n136,137,138,139,140,141,142,143,\n144,145,146,147,148,149,150,151,\n152,153,154,155,156,157,158,159,\n160,161,162,163,164,165,166,167,\n168,169,170,171,172,173,174,175,\n176,177,178,179,180,181,182,183,\n184,185,186,187,188,189,190,191,\n224,225,226,227,228,229,230,231,\n232,233,234,235,236,237,238,239,\n240,241,242,243,244,245,246,215,\n248,249,250,251,252,253,254,223,\n192,193,194,195,196,197,198,199,\n200,201,202,203,204,205,206,207,\n208,209,210,211,212,213,214,247,\n216,217,218,219,220,221,222,255,\n0,62,0,0,1,0,0,0,\n0,0,0,0,0,0,0,0,\n32,0,0,0,1,0,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,255,3,\n126,0,0,0,126,0,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,255,3,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,12,2,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,\n254,255,255,7,0,0,0,0,\n0,0,0,0,0,0,0,0,\n255,255,127,127,0,0,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,254,255,255,7,\n0,0,0,0,0,4,32,4,\n0,0,0,128,255,255,127,255,\n0,0,0,0,0,0,255,3,\n254,255,255,135,254,255,255,7,\n0,0,0,0,0,4,44,6,\n255,255,127,255,255,255,127,255,\n0,0,0,0,254,255,255,255,\n255,255,255,255,255,255,255,127,\n0,0,0,0,254,255,255,255,\n255,255,255,255,255,255,255,255,\n0,2,0,0,255,255,255,255,\n255,255,255,255,255,255,255,127,\n0,0,0,0,255,255,255,255,\n255,255,255,255,255,255,255,255,\n0,0,0,0,254,255,0,252,\n1,0,0,248,1,0,0,120,\n0,0,0,0,254,255,255,255,\n0,0,128,0,0,0,128,0,\n255,255,255,255,0,0,0,0,\n0,0,0,0,0,0,0,128,\n255,255,255,255,0,0,0,0,\n0,0,0,0,0,0,0,0,\n128,0,0,0,0,0,0,0,\n0,1,1,0,1,1,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,\n1,0,0,0,128,0,0,0,\n128,128,128,128,0,0,128,0,\n28,28,28,28,28,28,28,28,\n28,28,0,0,0,0,0,128,\n0,26,26,26,26,26,26,18,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,18,\n18,18,18,128,128,0,128,16,\n0,26,26,26,26,26,26,18,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,18,\n18,18,18,128,128,0,0,0,\n0,0,0,0,0,1,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,\n0,0,0,0,0,0,0,0,\n1,0,0,0,0,0,0,0,\n0,0,18,0,0,0,0,0,\n0,0,20,20,0,18,0,0,\n0,20,18,0,0,0,0,0,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,0,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,18,\n18,18,18,18,18,18,18,0,\n18,18,18,18,18,18,18,18\n};\n\n\n\n\n#ifndef HAVE_STRERROR\n/*************************************************\n*     Provide strerror() for non-ANSI libraries  *\n*************************************************/\n\n/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()\nin their libraries, but can provide the same facility by this simple\nalternative function. */\n\nextern int   sys_nerr;\nextern char *sys_errlist[];\n\nchar *\nstrerror(int n)\n{\nif (n < 0 || n >= sys_nerr) return \"unknown error number\";\nreturn sys_errlist[n];\n}\n#endif /* HAVE_STRERROR */\n\n\n\n/*************************************************\n*       Print newline configuration              *\n*************************************************/\n\n/*\nArguments:\n  rc         the return code from PCRE_CONFIG_NEWLINE\n  isc        TRUE if called from \"-C newline\"\nReturns:     nothing\n*/\n\nstatic void\nprint_newline_config(int rc, BOOL isc)\n{\nconst char *s = NULL;\nif (!isc) printf(\"  Newline sequence is \");\nswitch(rc)\n  {\n  case CHAR_CR: s = \"CR\"; break;\n  case CHAR_LF: s = \"LF\"; break;\n  case (CHAR_CR<<8 | CHAR_LF): s = \"CRLF\"; break;\n  case -1: s = \"ANY\"; break;\n  case -2: s = \"ANYCRLF\"; break;\n\n  default:\n  printf(\"a non-standard value: 0x%04x\\n\", rc);\n  return;\n  }\n\nprintf(\"%s\\n\", s);\n}\n\n\n\n/*************************************************\n*         JIT memory callback                    *\n*************************************************/\n\nstatic pcre_jit_stack* jit_callback(void *arg)\n{\njit_was_used = TRUE;\nreturn (pcre_jit_stack *)arg;\n}\n\n\n#if !defined NOUTF || defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32\n/*************************************************\n*            Convert UTF-8 string to value       *\n*************************************************/\n\n/* This function takes one or more bytes that represents a UTF-8 character,\nand returns the value of the character.\n\nArgument:\n  utf8bytes   a pointer to the byte vector\n  vptr        a pointer to an int to receive the value\n\nReturns:      >  0 => the number of bytes consumed\n              -6 to 0 => malformed UTF-8 character at offset = (-return)\n*/\n\nstatic int\nutf82ord(pcre_uint8 *utf8bytes, pcre_uint32 *vptr)\n{\npcre_uint32 c = *utf8bytes++;\npcre_uint32 d = c;\nint i, j, s;\n\nfor (i = -1; i < 6; i++)               /* i is number of additional bytes */\n  {\n  if ((d & 0x80) == 0) break;\n  d <<= 1;\n  }\n\nif (i == -1) { *vptr = c; return 1; }  /* ascii character */\nif (i == 0 || i == 6) return 0;        /* invalid UTF-8 */\n\n/* i now has a value in the range 1-5 */\n\ns = 6*i;\nd = (c & utf8_table3[i]) << s;\n\nfor (j = 0; j < i; j++)\n  {\n  c = *utf8bytes++;\n  if ((c & 0xc0) != 0x80) return -(j+1);\n  s -= 6;\n  d |= (c & 0x3f) << s;\n  }\n\n/* Check that encoding was the correct unique one */\n\nfor (j = 0; j < utf8_table1_size; j++)\n  if (d <= (pcre_uint32)utf8_table1[j]) break;\nif (j != i) return -(i+1);\n\n/* Valid value */\n\n*vptr = d;\nreturn i+1;\n}\n#endif /* NOUTF || SUPPORT_PCRE16 */\n\n\n\n#if defined SUPPORT_PCRE8 && !defined NOUTF\n/*************************************************\n*       Convert character value to UTF-8         *\n*************************************************/\n\n/* This function takes an integer value in the range 0 - 0x7fffffff\nand encodes it as a UTF-8 character in 0 to 6 bytes.\n\nArguments:\n  cvalue     the character value\n  utf8bytes  pointer to buffer for result - at least 6 bytes long\n\nReturns:     number of characters placed in the buffer\n*/\n\nstatic int\nord2utf8(pcre_uint32 cvalue, pcre_uint8 *utf8bytes)\n{\nregister int i, j;\nif (cvalue > 0x7fffffffu)\n  return -1;\nfor (i = 0; i < utf8_table1_size; i++)\n  if (cvalue <= (pcre_uint32)utf8_table1[i]) break;\nutf8bytes += i;\nfor (j = i; j > 0; j--)\n {\n *utf8bytes-- = 0x80 | (cvalue & 0x3f);\n cvalue >>= 6;\n }\n*utf8bytes = utf8_table2[i] | cvalue;\nreturn i + 1;\n}\n#endif\n\n\n#ifdef SUPPORT_PCRE16\n/*************************************************\n*         Convert a string to 16-bit             *\n*************************************************/\n\n/* In non-UTF mode, the space needed for a 16-bit string is exactly double the\n8-bit size. For a UTF-8 string, the size needed for UTF-16 is no more than\ndouble, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4\nin UTF-16. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-16. The\nresult is always left in buffer16.\n\nNote that this function does not object to surrogate values. This is\ndeliberate; it makes it possible to construct UTF-16 strings that are invalid,\nfor the purpose of testing that they are correctly faulted.\n\nPatterns to be converted are either plain ASCII or UTF-8; data lines are always\nin UTF-8 so that values greater than 255 can be handled.\n\nArguments:\n  data       TRUE if converting a data line; FALSE for a regex\n  p          points to a byte string\n  utf        true if UTF-8 (to be converted to UTF-16)\n  len        number of bytes in the string (excluding trailing zero)\n\nReturns:     number of 16-bit data items used (excluding trailing zero)\n             OR -1 if a UTF-8 string is malformed\n             OR -2 if a value > 0x10ffff is encountered\n             OR -3 if a value > 0xffff is encountered when not in UTF mode\n*/\n\nstatic int\nto16(int data, pcre_uint8 *p, int utf, int len)\n{\npcre_uint16 *pp;\n\nif (buffer16_size < 2*len + 2)\n  {\n  if (buffer16 != NULL) free(buffer16);\n  buffer16_size = 2*len + 2;\n  buffer16 = (pcre_uint16 *)malloc(buffer16_size);\n  if (buffer16 == NULL)\n    {\n    fprintf(stderr, \"pcretest: malloc(%d) failed for buffer16\\n\", buffer16_size);\n    exit(1);\n    }\n  }\n\npp = buffer16;\n\nif (!utf && !data)\n  {\n  while (len-- > 0) *pp++ = *p++;\n  }\n\nelse\n  {\n  pcre_uint32 c = 0;\n  while (len > 0)\n    {\n    int chlen = utf82ord(p, &c);\n    if (chlen <= 0) return -1;\n    if (c > 0x10ffff) return -2;\n    p += chlen;\n    len -= chlen;\n    if (c < 0x10000) *pp++ = c; else\n      {\n      if (!utf) return -3;\n      c -= 0x10000;\n      *pp++ = 0xD800 | (c >> 10);\n      *pp++ = 0xDC00 | (c & 0x3ff);\n      }\n    }\n  }\n\n*pp = 0;\nreturn pp - buffer16;\n}\n#endif\n\n#ifdef SUPPORT_PCRE32\n/*************************************************\n*         Convert a string to 32-bit             *\n*************************************************/\n\n/* In non-UTF mode, the space needed for a 32-bit string is exactly four times the\n8-bit size. For a UTF-8 string, the size needed for UTF-32 is no more than four\ntimes, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4\nin UTF-32. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-32. The\nresult is always left in buffer32.\n\nNote that this function does not object to surrogate values. This is\ndeliberate; it makes it possible to construct UTF-32 strings that are invalid,\nfor the purpose of testing that they are correctly faulted.\n\nPatterns to be converted are either plain ASCII or UTF-8; data lines are always\nin UTF-8 so that values greater than 255 can be handled.\n\nArguments:\n  data       TRUE if converting a data line; FALSE for a regex\n  p          points to a byte string\n  utf        true if UTF-8 (to be converted to UTF-32)\n  len        number of bytes in the string (excluding trailing zero)\n\nReturns:     number of 32-bit data items used (excluding trailing zero)\n             OR -1 if a UTF-8 string is malformed\n             OR -2 if a value > 0x10ffff is encountered\n             OR -3 if an ill-formed value is encountered (i.e. a surrogate)\n*/\n\nstatic int\nto32(int data, pcre_uint8 *p, int utf, int len)\n{\npcre_uint32 *pp;\n\nif (buffer32_size < 4*len + 4)\n  {\n  if (buffer32 != NULL) free(buffer32);\n  buffer32_size = 4*len + 4;\n  buffer32 = (pcre_uint32 *)malloc(buffer32_size);\n  if (buffer32 == NULL)\n    {\n    fprintf(stderr, \"pcretest: malloc(%d) failed for buffer32\\n\", buffer32_size);\n    exit(1);\n    }\n  }\n\npp = buffer32;\n\nif (!utf && !data)\n  {\n  while (len-- > 0) *pp++ = *p++;\n  }\n\nelse\n  {\n  pcre_uint32 c = 0;\n  while (len > 0)\n    {\n    int chlen = utf82ord(p, &c);\n    if (chlen <= 0) return -1;\n    if (utf)\n      {\n      if (c > 0x10ffff) return -2;\n      if (!data && (c & 0xfffff800u) == 0xd800u) return -3;\n      }\n\n    p += chlen;\n    len -= chlen;\n    *pp++ = c;\n    }\n  }\n\n*pp = 0;\nreturn pp - buffer32;\n}\n\n/* Check that a 32-bit character string is valid UTF-32.\n\nArguments:\n  string       points to the string\n  length       length of string, or -1 if the string is zero-terminated\n\nReturns:       TRUE  if the string is a valid UTF-32 string\n               FALSE otherwise\n*/\n\n#ifdef NEVER   /* Not used */\n#ifdef SUPPORT_UTF\nstatic BOOL\nvalid_utf32(pcre_uint32 *string, int length)\n{\nregister pcre_uint32 *p;\nregister pcre_uint32 c;\n\nfor (p = string; length-- > 0; p++)\n  {\n  c = *p;\n  if (c > 0x10ffffu) return FALSE;                 /* Too big */\n  if ((c & 0xfffff800u) == 0xd800u) return FALSE;  /* Surrogate */\n  }\n\nreturn TRUE;\n}\n#endif /* SUPPORT_UTF */\n#endif /* NEVER */\n#endif /* SUPPORT_PCRE32 */\n\n\n/*************************************************\n*        Read or extend an input line            *\n*************************************************/\n\n/* Input lines are read into buffer, but both patterns and data lines can be\ncontinued over multiple input lines. In addition, if the buffer fills up, we\nwant to automatically expand it so as to be able to handle extremely large\nlines that are needed for certain stress tests. When the input buffer is\nexpanded, the other two buffers must also be expanded likewise, and the\ncontents of pbuffer, which are a copy of the input for callouts, must be\npreserved (for when expansion happens for a data line). This is not the most\noptimal way of handling this, but hey, this is just a test program!\n\nArguments:\n  f            the file to read\n  start        where in buffer to start (this *must* be within buffer)\n  prompt       for stdin or readline()\n\nReturns:       pointer to the start of new data\n               could be a copy of start, or could be moved\n               NULL if no data read and EOF reached\n*/\n\nstatic pcre_uint8 *\nextend_inputline(FILE *f, pcre_uint8 *start, const char *prompt)\n{\npcre_uint8 *here = start;\n\nfor (;;)\n  {\n  size_t rlen = (size_t)(buffer_size - (here - buffer));\n\n  if (rlen > 1000)\n    {\n    int dlen;\n\n    /* If libreadline or libedit support is required, use readline() to read a\n    line if the input is a terminal. Note that readline() removes the trailing\n    newline, so we must put it back again, to be compatible with fgets(). */\n\n#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)\n    if (isatty(fileno(f)))\n      {\n      size_t len;\n      char *s = readline(prompt);\n      if (s == NULL) return (here == start)? NULL : start;\n      len = strlen(s);\n      if (len > 0) add_history(s);\n      if (len > rlen - 1) len = rlen - 1;\n      memcpy(here, s, len);\n      here[len] = '\\n';\n      here[len+1] = 0;\n      free(s);\n      }\n    else\n#endif\n\n    /* Read the next line by normal means, prompting if the file is stdin. */\n\n      {\n      if (f == stdin) printf(\"%s\", prompt);\n      if (fgets((char *)here, rlen,  f) == NULL)\n        return (here == start)? NULL : start;\n      }\n\n    dlen = (int)strlen((char *)here);\n    if (dlen > 0 && here[dlen - 1] == '\\n') return start;\n    here += dlen;\n    }\n\n  else\n    {\n    int new_buffer_size = 2*buffer_size;\n    pcre_uint8 *new_buffer = (pcre_uint8 *)malloc(new_buffer_size);\n    pcre_uint8 *new_pbuffer = (pcre_uint8 *)malloc(new_buffer_size);\n\n    if (new_buffer == NULL || new_pbuffer == NULL)\n      {\n      fprintf(stderr, \"pcretest: malloc(%d) failed\\n\", new_buffer_size);\n      exit(1);\n      }\n\n    memcpy(new_buffer, buffer, buffer_size);\n    memcpy(new_pbuffer, pbuffer, buffer_size);\n\n    buffer_size = new_buffer_size;\n\n    start = new_buffer + (start - buffer);\n    here = new_buffer + (here - buffer);\n\n    free(buffer);\n    free(pbuffer);\n\n    buffer = new_buffer;\n    pbuffer = new_pbuffer;\n    }\n  }\n\n/* Control never gets here */\n}\n\n\n\n/*************************************************\n*          Read number from string               *\n*************************************************/\n\n/* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess\naround with conditional compilation, just do the job by hand. It is only used\nfor unpicking arguments, so just keep it simple.\n\nArguments:\n  str           string to be converted\n  endptr        where to put the end pointer\n\nReturns:        the unsigned long\n*/\n\nstatic int\nget_value(pcre_uint8 *str, pcre_uint8 **endptr)\n{\nint result = 0;\nwhile(*str != 0 && isspace(*str)) str++;\nwhile (isdigit(*str)) result = result * 10 + (int)(*str++ - '0');\n*endptr = str;\nreturn(result);\n}\n\n\n\n/*************************************************\n*             Print one character                *\n*************************************************/\n\n/* Print a single character either literally, or as a hex escape. */\n\nstatic int pchar(pcre_uint32 c, FILE *f)\n{\nint n = 0;\nchar tempbuffer[16];\nif (PRINTOK(c))\n  {\n  if (f != NULL) fprintf(f, \"%c\", c);\n  return 1;\n  }\n\nif (c < 0x100)\n  {\n  if (use_utf)\n    {\n    if (f != NULL) fprintf(f, \"\\\\x{%02x}\", c);\n    return 6;\n    }\n  else\n    {\n    if (f != NULL) fprintf(f, \"\\\\x%02x\", c);\n    return 4;\n    }\n  }\n\nif (f != NULL) n = fprintf(f, \"\\\\x{%02x}\", c);\n  else n = sprintf(tempbuffer, \"\\\\x{%02x}\", c);\n\nreturn n >= 0 ? n : 0;\n}\n\n\n\n#ifdef SUPPORT_PCRE8\n/*************************************************\n*         Print 8-bit character string           *\n*************************************************/\n\n/* Must handle UTF-8 strings in utf8 mode. Yields number of characters printed.\nIf handed a NULL file, just counts chars without printing. */\n\nstatic int pchars(pcre_uint8 *p, int length, FILE *f)\n{\npcre_uint32 c = 0;\nint yield = 0;\n\nif (length < 0)\n  length = strlen((char *)p);\n\nwhile (length-- > 0)\n  {\n#if !defined NOUTF\n  if (use_utf)\n    {\n    int rc = utf82ord(p, &c);\n    if (rc > 0 && rc <= length + 1)   /* Mustn't run over the end */\n      {\n      length -= rc - 1;\n      p += rc;\n      yield += pchar(c, f);\n      continue;\n      }\n    }\n#endif\n  c = *p++;\n  yield += pchar(c, f);\n  }\n\nreturn yield;\n}\n#endif\n\n\n\n#ifdef SUPPORT_PCRE16\n/*************************************************\n*    Find length of 0-terminated 16-bit string   *\n*************************************************/\n\nstatic int strlen16(PCRE_SPTR16 p)\n{\nPCRE_SPTR16 pp = p;\nwhile (*pp != 0) pp++;\nreturn (int)(pp - p);\n}\n#endif  /* SUPPORT_PCRE16 */\n\n\n\n#ifdef SUPPORT_PCRE32\n/*************************************************\n*    Find length of 0-terminated 32-bit string   *\n*************************************************/\n\nstatic int strlen32(PCRE_SPTR32 p)\n{\nPCRE_SPTR32 pp = p;\nwhile (*pp != 0) pp++;\nreturn (int)(pp - p);\n}\n#endif  /* SUPPORT_PCRE32 */\n\n\n\n#ifdef SUPPORT_PCRE16\n/*************************************************\n*           Print 16-bit character string        *\n*************************************************/\n\n/* Must handle UTF-16 strings in utf mode. Yields number of characters printed.\nIf handed a NULL file, just counts chars without printing. */\n\nstatic int pchars16(PCRE_SPTR16 p, int length, FILE *f)\n{\nint yield = 0;\n\nif (length < 0)\n  length = strlen16(p);\n\nwhile (length-- > 0)\n  {\n  pcre_uint32 c = *p++ & 0xffff;\n#if !defined NOUTF\n  if (use_utf && c >= 0xD800 && c < 0xDC00 && length > 0)\n    {\n    int d = *p & 0xffff;\n    if (d >= 0xDC00 && d <= 0xDFFF)\n      {\n      c = ((c & 0x3ff) << 10) + (d & 0x3ff) + 0x10000;\n      length--;\n      p++;\n      }\n    }\n#endif\n  yield += pchar(c, f);\n  }\n\nreturn yield;\n}\n#endif  /* SUPPORT_PCRE16 */\n\n\n\n#ifdef SUPPORT_PCRE32\n/*************************************************\n*           Print 32-bit character string        *\n*************************************************/\n\n/* Must handle UTF-32 strings in utf mode. Yields number of characters printed.\nIf handed a NULL file, just counts chars without printing. */\n\nstatic int pchars32(PCRE_SPTR32 p, int length, BOOL utf, FILE *f)\n{\nint yield = 0;\n\n(void)(utf);  /* Avoid compiler warning */\n\nif (length < 0)\n  length = strlen32(p);\n\nwhile (length-- > 0)\n  {\n  pcre_uint32 c = *p++;\n  yield += pchar(c, f);\n  }\n\nreturn yield;\n}\n#endif  /* SUPPORT_PCRE32 */\n\n\n\n#ifdef SUPPORT_PCRE8\n/*************************************************\n*     Read a capture name (8-bit) and check it   *\n*************************************************/\n\nstatic pcre_uint8 *\nread_capture_name8(pcre_uint8 *p, pcre_uint8 **pp, pcre *re)\n{\npcre_uint8 *npp = *pp;\nwhile (isalnum(*p)) *npp++ = *p++;\n*npp++ = 0;\n*npp = 0;\nif (pcre_get_stringnumber(re, (char *)(*pp)) < 0)\n  {\n  fprintf(outfile, \"no parentheses with name \\\"\");\n  PCHARSV(*pp, 0, -1, outfile);\n  fprintf(outfile, \"\\\"\\n\");\n  }\n\n*pp = npp;\nreturn p;\n}\n#endif  /* SUPPORT_PCRE8 */\n\n\n\n#ifdef SUPPORT_PCRE16\n/*************************************************\n*     Read a capture name (16-bit) and check it  *\n*************************************************/\n\n/* Note that the text being read is 8-bit. */\n\nstatic pcre_uint8 *\nread_capture_name16(pcre_uint8 *p, pcre_uint16 **pp, pcre *re)\n{\npcre_uint16 *npp = *pp;\nwhile (isalnum(*p)) *npp++ = *p++;\n*npp++ = 0;\n*npp = 0;\nif (pcre16_get_stringnumber((pcre16 *)re, (PCRE_SPTR16)(*pp)) < 0)\n  {\n  fprintf(outfile, \"no parentheses with name \\\"\");\n  PCHARSV(*pp, 0, -1, outfile);\n  fprintf(outfile, \"\\\"\\n\");\n  }\n*pp = npp;\nreturn p;\n}\n#endif  /* SUPPORT_PCRE16 */\n\n\n\n#ifdef SUPPORT_PCRE32\n/*************************************************\n*     Read a capture name (32-bit) and check it  *\n*************************************************/\n\n/* Note that the text being read is 8-bit. */\n\nstatic pcre_uint8 *\nread_capture_name32(pcre_uint8 *p, pcre_uint32 **pp, pcre *re)\n{\npcre_uint32 *npp = *pp;\nwhile (isalnum(*p)) *npp++ = *p++;\n*npp++ = 0;\n*npp = 0;\nif (pcre32_get_stringnumber((pcre32 *)re, (PCRE_SPTR32)(*pp)) < 0)\n  {\n  fprintf(outfile, \"no parentheses with name \\\"\");\n  PCHARSV(*pp, 0, -1, outfile);\n  fprintf(outfile, \"\\\"\\n\");\n  }\n*pp = npp;\nreturn p;\n}\n#endif  /* SUPPORT_PCRE32 */\n\n\n\n/*************************************************\n*            Stack guard function                *\n*************************************************/\n\n/* Called from PCRE when set in pcre_stack_guard. We give an error (non-zero)\nreturn when a count overflows. */\n\nstatic int stack_guard(void)\n{\nreturn stack_guard_return;\n}\n\n/*************************************************\n*              Callout function                  *\n*************************************************/\n\n/* Called from PCRE as a result of the (?C) item. We print out where we are in\nthe match. Yield zero unless more callouts than the fail count, or the callout\ndata is not zero. */\n\nstatic int callout(pcre_callout_block *cb)\n{\nFILE *f = (first_callout | callout_extra)? outfile : NULL;\nint i, current_position, pre_start, post_start, subject_length;\n\nif (callout_extra)\n  {\n  fprintf(f, \"Callout %d: last capture = %d\\n\",\n    cb->callout_number, cb->capture_last);\n\n  if (cb->offset_vector != NULL)\n    {\n    for (i = 0; i < cb->capture_top * 2; i += 2)\n      {\n      if (cb->offset_vector[i] < 0)\n        fprintf(f, \"%2d: <unset>\\n\", i/2);\n      else\n        {\n        fprintf(f, \"%2d: \", i/2);\n        PCHARSV(cb->subject, cb->offset_vector[i],\n          cb->offset_vector[i+1] - cb->offset_vector[i], f);\n        fprintf(f, \"\\n\");\n        }\n      }\n    }\n  }\n\n/* Re-print the subject in canonical form, the first time or if giving full\ndatails. On subsequent calls in the same match, we use pchars just to find the\nprinted lengths of the substrings. */\n\nif (f != NULL) fprintf(f, \"--->\");\n\n/* If a lookbehind is involved, the current position may be earlier than the\nmatch start. If so, use the match start instead. */\n\ncurrent_position = (cb->current_position >= cb->start_match)?\n  cb->current_position : cb->start_match;\n\nPCHARS(pre_start, cb->subject, 0, cb->start_match, f);\nPCHARS(post_start, cb->subject, cb->start_match,\n  current_position - cb->start_match, f);\n\nPCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL);\n\nPCHARSV(cb->subject, current_position, cb->subject_length - current_position, f);\n\nif (f != NULL) fprintf(f, \"\\n\");\n\n/* Always print appropriate indicators, with callout number if not already\nshown. For automatic callouts, show the pattern offset. */\n\nif (cb->callout_number == 255)\n  {\n  fprintf(outfile, \"%+3d \", cb->pattern_position);\n  if (cb->pattern_position > 99) fprintf(outfile, \"\\n    \");\n  }\nelse\n  {\n  if (callout_extra) fprintf(outfile, \"    \");\n    else fprintf(outfile, \"%3d \", cb->callout_number);\n  }\n\nfor (i = 0; i < pre_start; i++) fprintf(outfile, \" \");\nfprintf(outfile, \"^\");\n\nif (post_start > 0)\n  {\n  for (i = 0; i < post_start - 1; i++) fprintf(outfile, \" \");\n  fprintf(outfile, \"^\");\n  }\n\nfor (i = 0; i < subject_length - pre_start - post_start + 4; i++)\n  fprintf(outfile, \" \");\n\nfprintf(outfile, \"%.*s\", (cb->next_item_length == 0)? 1 : cb->next_item_length,\n  pbuffer + cb->pattern_position);\n\nfprintf(outfile, \"\\n\");\nfirst_callout = 0;\n\nif (cb->mark != last_callout_mark)\n  {\n  if (cb->mark == NULL)\n    fprintf(outfile, \"Latest Mark: <unset>\\n\");\n  else\n    {\n    fprintf(outfile, \"Latest Mark: \");\n    PCHARSV(cb->mark, 0, -1, outfile);\n    putc('\\n', outfile);\n    }\n  last_callout_mark = cb->mark;\n  }\n\nif (cb->callout_data != NULL)\n  {\n  int callout_data = *((int *)(cb->callout_data));\n  if (callout_data != 0)\n    {\n    fprintf(outfile, \"Callout data = %d\\n\", callout_data);\n    return callout_data;\n    }\n  }\n\nreturn (cb->callout_number != callout_fail_id)? 0 :\n       (++callout_count >= callout_fail_count)? 1 : 0;\n}\n\n\n/*************************************************\n*            Local malloc functions              *\n*************************************************/\n\n/* Alternative malloc function, to test functionality and save the size of a\ncompiled re, which is the first store request that pcre_compile() makes. The\nshow_malloc variable is set only during matching. */\n\nstatic void *new_malloc(size_t size)\n{\nvoid *block = malloc(size);\nif (show_malloc)\n  fprintf(outfile, \"malloc       %3d %p\\n\", (int)size, block);\nreturn block;\n}\n\nstatic void new_free(void *block)\n{\nif (show_malloc)\n  fprintf(outfile, \"free             %p\\n\", block);\nfree(block);\n}\n\n/* For recursion malloc/free, to test stacking calls */\n\nstatic void *stack_malloc(size_t size)\n{\nvoid *block = malloc(size);\nif (show_malloc)\n  fprintf(outfile, \"stack_malloc %3d %p\\n\", (int)size, block);\nreturn block;\n}\n\nstatic void stack_free(void *block)\n{\nif (show_malloc)\n  fprintf(outfile, \"stack_free       %p\\n\", block);\nfree(block);\n}\n\n\n/*************************************************\n*          Call pcre_fullinfo()                  *\n*************************************************/\n\n/* Get one piece of information from the pcre_fullinfo() function. When only\none of 8-, 16- or 32-bit is supported, pcre_mode should always have the correct\nvalue, but the code is defensive.\n\nArguments:\n  re        compiled regex\n  study     study data\n  option    PCRE_INFO_xxx option\n  ptr       where to put the data\n\nReturns:    0 when OK, < 0 on error\n*/\n\nstatic int\nnew_info(pcre *re, pcre_extra *study, int option, void *ptr)\n{\nint rc;\n\nif (pcre_mode == PCRE32_MODE)\n#ifdef SUPPORT_PCRE32\n  rc = pcre32_fullinfo((pcre32 *)re, (pcre32_extra *)study, option, ptr);\n#else\n  rc = PCRE_ERROR_BADMODE;\n#endif\nelse if (pcre_mode == PCRE16_MODE)\n#ifdef SUPPORT_PCRE16\n  rc = pcre16_fullinfo((pcre16 *)re, (pcre16_extra *)study, option, ptr);\n#else\n  rc = PCRE_ERROR_BADMODE;\n#endif\nelse\n#ifdef SUPPORT_PCRE8\n  rc = pcre_fullinfo(re, study, option, ptr);\n#else\n  rc = PCRE_ERROR_BADMODE;\n#endif\n\nif (rc < 0 && rc != PCRE_ERROR_UNSET)\n  {\n  fprintf(outfile, \"Error %d from pcre%s_fullinfo(%d)\\n\", rc,\n    pcre_mode == PCRE32_MODE ? \"32\" : pcre_mode == PCRE16_MODE ? \"16\" : \"\", option);\n  if (rc == PCRE_ERROR_BADMODE)\n    fprintf(outfile, \"Running in %d-bit mode but pattern was compiled in \"\n      \"%d-bit mode\\n\", 8 * CHAR_SIZE,\n      8 * (REAL_PCRE_FLAGS(re) & PCRE_MODE_MASK));\n  }\n\nreturn rc;\n}\n\n\n\n/*************************************************\n*             Swap byte functions                *\n*************************************************/\n\n/* The following functions swap the bytes of a pcre_uint16 and pcre_uint32\nvalue, respectively.\n\nArguments:\n  value        any number\n\nReturns:       the byte swapped value\n*/\n\nstatic pcre_uint32\nswap_uint32(pcre_uint32 value)\n{\nreturn ((value & 0x000000ff) << 24) |\n       ((value & 0x0000ff00) <<  8) |\n       ((value & 0x00ff0000) >>  8) |\n       (value >> 24);\n}\n\nstatic pcre_uint16\nswap_uint16(pcre_uint16 value)\n{\nreturn (value >> 8) | (value << 8);\n}\n\n\n\n/*************************************************\n*        Flip bytes in a compiled pattern        *\n*************************************************/\n\n/* This function is called if the 'F' option was present on a pattern that is\nto be written to a file. We flip the bytes of all the integer fields in the\nregex data block and the study block. In 16-bit mode this also flips relevant\nbytes in the pattern itself. This is to make it possible to test PCRE's\nability to reload byte-flipped patterns, e.g. those compiled on a different\narchitecture. */\n\n#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16\nstatic void\nregexflip8_or_16(pcre *ere, pcre_extra *extra)\n{\nreal_pcre8_or_16 *re = (real_pcre8_or_16 *)ere;\n#ifdef SUPPORT_PCRE16\nint op;\npcre_uint16 *ptr = (pcre_uint16 *)re + re->name_table_offset;\nint length = re->name_count * re->name_entry_size;\n#ifdef SUPPORT_UTF\nBOOL utf = (re->options & PCRE_UTF16) != 0;\nBOOL utf16_char = FALSE;\n#endif /* SUPPORT_UTF */\n#endif /* SUPPORT_PCRE16 */\n\n/* Always flip the bytes in the main data block and study blocks. */\n\nre->magic_number = REVERSED_MAGIC_NUMBER;\nre->size = swap_uint32(re->size);\nre->options = swap_uint32(re->options);\nre->flags = swap_uint32(re->flags);\nre->limit_match = swap_uint32(re->limit_match);\nre->limit_recursion = swap_uint32(re->limit_recursion);\nre->first_char = swap_uint16(re->first_char);\nre->req_char = swap_uint16(re->req_char);\nre->max_lookbehind = swap_uint16(re->max_lookbehind);\nre->top_bracket = swap_uint16(re->top_bracket);\nre->top_backref = swap_uint16(re->top_backref);\nre->name_table_offset = swap_uint16(re->name_table_offset);\nre->name_entry_size = swap_uint16(re->name_entry_size);\nre->name_count = swap_uint16(re->name_count);\nre->ref_count = swap_uint16(re->ref_count);\n\nif (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)\n  {\n  pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);\n  rsd->size = swap_uint32(rsd->size);\n  rsd->flags = swap_uint32(rsd->flags);\n  rsd->minlength = swap_uint32(rsd->minlength);\n  }\n\n/* In 8-bit mode, that is all we need to do. In 16-bit mode we must swap bytes\nin the name table, if present, and then in the pattern itself. */\n\n#ifdef SUPPORT_PCRE16\nif (pcre_mode != PCRE16_MODE) return;\n\nwhile(TRUE)\n  {\n  /* Swap previous characters. */\n  while (length-- > 0)\n    {\n    *ptr = swap_uint16(*ptr);\n    ptr++;\n    }\n#ifdef SUPPORT_UTF\n  if (utf16_char)\n    {\n    if ((ptr[-1] & 0xfc00) == 0xd800)\n      {\n      /* We know that there is only one extra character in UTF-16. */\n      *ptr = swap_uint16(*ptr);\n      ptr++;\n      }\n    }\n  utf16_char = FALSE;\n#endif /* SUPPORT_UTF */\n\n  /* Get next opcode. */\n\n  length = 0;\n  op = *ptr;\n  *ptr++ = swap_uint16(op);\n\n  switch (op)\n    {\n    case OP_END:\n    return;\n\n#ifdef SUPPORT_UTF\n    case OP_CHAR:\n    case OP_CHARI:\n    case OP_NOT:\n    case OP_NOTI:\n    case OP_STAR:\n    case OP_MINSTAR:\n    case OP_PLUS:\n    case OP_MINPLUS:\n    case OP_QUERY:\n    case OP_MINQUERY:\n    case OP_UPTO:\n    case OP_MINUPTO:\n    case OP_EXACT:\n    case OP_POSSTAR:\n    case OP_POSPLUS:\n    case OP_POSQUERY:\n    case OP_POSUPTO:\n    case OP_STARI:\n    case OP_MINSTARI:\n    case OP_PLUSI:\n    case OP_MINPLUSI:\n    case OP_QUERYI:\n    case OP_MINQUERYI:\n    case OP_UPTOI:\n    case OP_MINUPTOI:\n    case OP_EXACTI:\n    case OP_POSSTARI:\n    case OP_POSPLUSI:\n    case OP_POSQUERYI:\n    case OP_POSUPTOI:\n    case OP_NOTSTAR:\n    case OP_NOTMINSTAR:\n    case OP_NOTPLUS:\n    case OP_NOTMINPLUS:\n    case OP_NOTQUERY:\n    case OP_NOTMINQUERY:\n    case OP_NOTUPTO:\n    case OP_NOTMINUPTO:\n    case OP_NOTEXACT:\n    case OP_NOTPOSSTAR:\n    case OP_NOTPOSPLUS:\n    case OP_NOTPOSQUERY:\n    case OP_NOTPOSUPTO:\n    case OP_NOTSTARI:\n    case OP_NOTMINSTARI:\n    case OP_NOTPLUSI:\n    case OP_NOTMINPLUSI:\n    case OP_NOTQUERYI:\n    case OP_NOTMINQUERYI:\n    case OP_NOTUPTOI:\n    case OP_NOTMINUPTOI:\n    case OP_NOTEXACTI:\n    case OP_NOTPOSSTARI:\n    case OP_NOTPOSPLUSI:\n    case OP_NOTPOSQUERYI:\n    case OP_NOTPOSUPTOI:\n    if (utf) utf16_char = TRUE;\n#endif\n    /* Fall through. */\n\n    default:\n    length = OP_lengths16[op] - 1;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    /* Skip the character bit map. */\n    ptr += 32/sizeof(pcre_uint16);\n    length = 0;\n    break;\n\n    case OP_XCLASS:\n    /* LINK_SIZE can be 1 or 2 in 16 bit mode. */\n    if (LINK_SIZE > 1)\n      length = (int)((((unsigned int)(ptr[0]) << 16) | (unsigned int)(ptr[1]))\n        - (1 + LINK_SIZE + 1));\n    else\n      length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1));\n\n    /* Reverse the size of the XCLASS instance. */\n    *ptr = swap_uint16(*ptr);\n    ptr++;\n    if (LINK_SIZE > 1)\n      {\n      *ptr = swap_uint16(*ptr);\n      ptr++;\n      }\n\n    op = *ptr;\n    *ptr = swap_uint16(op);\n    ptr++;\n    if ((op & XCL_MAP) != 0)\n      {\n      /* Skip the character bit map. */\n      ptr += 32/sizeof(pcre_uint16);\n      length -= 32/sizeof(pcre_uint16);\n      }\n    break;\n    }\n  }\n/* Control should never reach here in 16 bit mode. */\n#endif /* SUPPORT_PCRE16 */\n}\n#endif /* SUPPORT_PCRE[8|16] */\n\n\n\n#if defined SUPPORT_PCRE32\nstatic void\nregexflip_32(pcre *ere, pcre_extra *extra)\n{\nreal_pcre32 *re = (real_pcre32 *)ere;\nint op;\npcre_uint32 *ptr = (pcre_uint32 *)re + re->name_table_offset;\nint length = re->name_count * re->name_entry_size;\n\n/* Always flip the bytes in the main data block and study blocks. */\n\nre->magic_number = REVERSED_MAGIC_NUMBER;\nre->size = swap_uint32(re->size);\nre->options = swap_uint32(re->options);\nre->flags = swap_uint32(re->flags);\nre->limit_match = swap_uint32(re->limit_match);\nre->limit_recursion = swap_uint32(re->limit_recursion);\nre->first_char = swap_uint32(re->first_char);\nre->req_char = swap_uint32(re->req_char);\nre->max_lookbehind = swap_uint16(re->max_lookbehind);\nre->top_bracket = swap_uint16(re->top_bracket);\nre->top_backref = swap_uint16(re->top_backref);\nre->name_table_offset = swap_uint16(re->name_table_offset);\nre->name_entry_size = swap_uint16(re->name_entry_size);\nre->name_count = swap_uint16(re->name_count);\nre->ref_count = swap_uint16(re->ref_count);\n\nif (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)\n  {\n  pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);\n  rsd->size = swap_uint32(rsd->size);\n  rsd->flags = swap_uint32(rsd->flags);\n  rsd->minlength = swap_uint32(rsd->minlength);\n  }\n\n/* In 32-bit mode we must swap bytes in the name table, if present, and then in\nthe pattern itself. */\n\nwhile(TRUE)\n  {\n  /* Swap previous characters. */\n  while (length-- > 0)\n    {\n    *ptr = swap_uint32(*ptr);\n    ptr++;\n    }\n\n  /* Get next opcode. */\n\n  length = 0;\n  op = *ptr;\n  *ptr++ = swap_uint32(op);\n\n  switch (op)\n    {\n    case OP_END:\n    return;\n\n    default:\n    length = OP_lengths32[op] - 1;\n    break;\n\n    case OP_CLASS:\n    case OP_NCLASS:\n    /* Skip the character bit map. */\n    ptr += 32/sizeof(pcre_uint32);\n    length = 0;\n    break;\n\n    case OP_XCLASS:\n    /* LINK_SIZE can only be 1 in 32-bit mode. */\n    length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1));\n\n    /* Reverse the size of the XCLASS instance. */\n    *ptr = swap_uint32(*ptr);\n    ptr++;\n\n    op = *ptr;\n    *ptr = swap_uint32(op);\n    ptr++;\n    if ((op & XCL_MAP) != 0)\n      {\n      /* Skip the character bit map. */\n      ptr += 32/sizeof(pcre_uint32);\n      length -= 32/sizeof(pcre_uint32);\n      }\n    break;\n    }\n  }\n/* Control should never reach here in 32 bit mode. */\n}\n\n#endif /* SUPPORT_PCRE32 */\n\n\n\nstatic void\nregexflip(pcre *ere, pcre_extra *extra)\n{\n#if defined SUPPORT_PCRE32\n  if (REAL_PCRE_FLAGS(ere) & PCRE_MODE32)\n    regexflip_32(ere, extra);\n#endif\n#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16\n  if (REAL_PCRE_FLAGS(ere) & (PCRE_MODE8 | PCRE_MODE16))\n    regexflip8_or_16(ere, extra);\n#endif\n}\n\n\n\n/*************************************************\n*        Check match or recursion limit          *\n*************************************************/\n\nstatic int\ncheck_match_limit(pcre *re, pcre_extra *extra, pcre_uint8 *bptr, int len,\n  int start_offset, int options, int *use_offsets, int use_size_offsets,\n  int flag, unsigned long int *limit, int errnumber, const char *msg)\n{\nint count;\nint min = 0;\nint mid = 64;\nint max = -1;\n\nextra->flags |= flag;\n\nfor (;;)\n  {\n  *limit = mid;\n\n  PCRE_EXEC(count, re, extra, bptr, len, start_offset, options,\n    use_offsets, use_size_offsets);\n\n  if (count == errnumber)\n    {\n    /* fprintf(outfile, \"Testing %s limit = %d\\n\", msg, mid); */\n    min = mid;\n    mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2;\n    }\n\n  else if (count >= 0 || count == PCRE_ERROR_NOMATCH ||\n                         count == PCRE_ERROR_PARTIAL)\n    {\n    if (mid == min + 1)\n      {\n      fprintf(outfile, \"Minimum %s limit = %d\\n\", msg, mid);\n      break;\n      }\n    /* fprintf(outfile, \"Testing %s limit = %d\\n\", msg, mid); */\n    max = mid;\n    mid = (min + mid)/2;\n    }\n  else break;    /* Some other error */\n  }\n\nextra->flags &= ~flag;\nreturn count;\n}\n\n\n\n/*************************************************\n*         Case-independent strncmp() function    *\n*************************************************/\n\n/*\nArguments:\n  s         first string\n  t         second string\n  n         number of characters to compare\n\nReturns:    < 0, = 0, or > 0, according to the comparison\n*/\n\nstatic int\nstrncmpic(pcre_uint8 *s, pcre_uint8 *t, int n)\n{\nwhile (n--)\n  {\n  int c = tolower(*s++) - tolower(*t++);\n  if (c) return c;\n  }\nreturn 0;\n}\n\n\n\n/*************************************************\n*         Check multicharacter option            *\n*************************************************/\n\n/* This is used both at compile and run-time to check for <xxx> escapes. Print\na message and return 0 if there is no match.\n\nArguments:\n  p           points after the leading '<'\n  f           file for error message\n  nl          TRUE to check only for newline settings\n  stype       \"modifier\" or \"escape sequence\"\n\nReturns:      appropriate PCRE_NEWLINE_xxx flags, or 0\n*/\n\nstatic int\ncheck_mc_option(pcre_uint8 *p, FILE *f, BOOL nl, const char *stype)\n{\nif (strncmpic(p, (pcre_uint8 *)\"cr>\", 3) == 0) return PCRE_NEWLINE_CR;\nif (strncmpic(p, (pcre_uint8 *)\"lf>\", 3) == 0) return PCRE_NEWLINE_LF;\nif (strncmpic(p, (pcre_uint8 *)\"crlf>\", 5) == 0) return PCRE_NEWLINE_CRLF;\nif (strncmpic(p, (pcre_uint8 *)\"anycrlf>\", 8) == 0) return PCRE_NEWLINE_ANYCRLF;\nif (strncmpic(p, (pcre_uint8 *)\"any>\", 4) == 0) return PCRE_NEWLINE_ANY;\nif (strncmpic(p, (pcre_uint8 *)\"bsr_anycrlf>\", 12) == 0) return PCRE_BSR_ANYCRLF;\nif (strncmpic(p, (pcre_uint8 *)\"bsr_unicode>\", 12) == 0) return PCRE_BSR_UNICODE;\n\nif (!nl)\n  {\n  if (strncmpic(p, (pcre_uint8 *)\"JS>\", 3) == 0) return PCRE_JAVASCRIPT_COMPAT;\n  }\n\nfprintf(f, \"Unknown %s at: <%s\\n\", stype, p);\nreturn 0;\n}\n\n\n\n/*************************************************\n*             Usage function                     *\n*************************************************/\n\nstatic void\nusage(void)\n{\nprintf(\"Usage:     pcretest [options] [<input file> [<output file>]]\\n\\n\");\nprintf(\"Input and output default to stdin and stdout.\\n\");\n#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)\nprintf(\"If input is a terminal, readline() is used to read from it.\\n\");\n#else\nprintf(\"This version of pcretest is not linked with readline().\\n\");\n#endif\nprintf(\"\\nOptions:\\n\");\n#ifdef SUPPORT_PCRE16\nprintf(\"  -16      use the 16-bit library\\n\");\n#endif\n#ifdef SUPPORT_PCRE32\nprintf(\"  -32      use the 32-bit library\\n\");\n#endif\nprintf(\"  -b       show compiled code\\n\");\nprintf(\"  -C       show PCRE compile-time options and exit\\n\");\nprintf(\"  -C arg   show a specific compile-time option and exit\\n\");\nprintf(\"           with its value if numeric (else 0). The arg can be:\\n\");\nprintf(\"     linksize     internal link size [2, 3, 4]\\n\");\nprintf(\"     pcre8        8 bit library support enabled [0, 1]\\n\");\nprintf(\"     pcre16       16 bit library support enabled [0, 1]\\n\");\nprintf(\"     pcre32       32 bit library support enabled [0, 1]\\n\");\nprintf(\"     utf          Unicode Transformation Format supported [0, 1]\\n\");\nprintf(\"     ucp          Unicode Properties supported [0, 1]\\n\");\nprintf(\"     jit          Just-in-time compiler supported [0, 1]\\n\");\nprintf(\"     newline      Newline type [CR, LF, CRLF, ANYCRLF, ANY]\\n\");\nprintf(\"     bsr          \\\\R type [ANYCRLF, ANY]\\n\");\nprintf(\"  -d       debug: show compiled code and information (-b and -i)\\n\");\n#if !defined NODFA\nprintf(\"  -dfa     force DFA matching for all subjects\\n\");\n#endif\nprintf(\"  -help    show usage information\\n\");\nprintf(\"  -i       show information about compiled patterns\\n\"\n       \"  -M       find MATCH_LIMIT minimum for each subject\\n\"\n       \"  -m       output memory used information\\n\"\n       \"  -O       set PCRE_NO_AUTO_POSSESS on each pattern\\n\"\n       \"  -o <n>   set size of offsets vector to <n>\\n\");\n#if !defined NOPOSIX\nprintf(\"  -p       use POSIX interface\\n\");\n#endif\nprintf(\"  -q       quiet: do not output PCRE version number at start\\n\");\nprintf(\"  -S <n>   set stack size to <n> megabytes\\n\");\nprintf(\"  -s       force each pattern to be studied at basic level\\n\"\n       \"  -s+      force each pattern to be studied, using JIT if available\\n\"\n       \"  -s++     ditto, verifying when JIT was actually used\\n\"\n       \"  -s+n     force each pattern to be studied, using JIT if available,\\n\"\n       \"             where 1 <= n <= 7 selects JIT options\\n\"\n       \"  -s++n    ditto, verifying when JIT was actually used\\n\"\n       \"  -t       time compilation and execution\\n\");\nprintf(\"  -t <n>   time compilation and execution, repeating <n> times\\n\");\nprintf(\"  -tm      time execution (matching) only\\n\");\nprintf(\"  -tm <n>  time execution (matching) only, repeating <n> times\\n\");\nprintf(\"  -T       same as -t, but show total times at the end\\n\");\nprintf(\"  -TM      same as -tm, but show total time at the end\\n\");\n}\n\n\n\n/*************************************************\n*                Main Program                    *\n*************************************************/\n\n/* Read lines from named file or stdin and write to named file or stdout; lines\nconsist of a regular expression, in delimiters and optionally followed by\noptions, followed by a set of test data, terminated by an empty line. */\n\nint main(int argc, char **argv)\n{\nFILE *infile = stdin;\nconst char *version;\nint options = 0;\nint study_options = 0;\nint default_find_match_limit = FALSE;\npcre_uint32 default_options = 0;\nint op = 1;\nint timeit = 0;\nint timeitm = 0;\nint showtotaltimes = 0;\nint showinfo = 0;\nint showstore = 0;\nint force_study = -1;\nint force_study_options = 0;\nint quiet = 0;\nint size_offsets = 45;\nint size_offsets_max;\nint *offsets = NULL;\nint debug = 0;\nint done = 0;\nint all_use_dfa = 0;\nint verify_jit = 0;\nint yield = 0;\nint stack_size;\npcre_uint8 *dbuffer = NULL;\npcre_uint8 lockout[24] = { 0 };\nsize_t dbuffer_size = 1u << 14;\nclock_t total_compile_time = 0;\nclock_t total_study_time = 0;\nclock_t total_match_time = 0;\n\n#if !defined NOPOSIX\nint posix = 0;\n#endif\n#if !defined NODFA\nint *dfa_workspace = NULL;\n#endif\n\npcre_jit_stack *jit_stack = NULL;\n\n/* These vectors store, end-to-end, a list of zero-terminated captured\nsubstring names, each list itself being terminated by an empty name. Assume\nthat 1024 is plenty long enough for the few names we'll be testing. It is\neasiest to keep separate 8-, 16- and 32-bit versions, using the 32-bit version\nfor the actual memory, to ensure alignment. */\n\npcre_uint32 copynames[1024];\npcre_uint32 getnames[1024];\n\n#ifdef SUPPORT_PCRE32\npcre_uint32 *cn32ptr;\npcre_uint32 *gn32ptr;\n#endif\n\n#ifdef SUPPORT_PCRE16\npcre_uint16 *copynames16 = (pcre_uint16 *)copynames;\npcre_uint16 *getnames16 = (pcre_uint16 *)getnames;\npcre_uint16 *cn16ptr;\npcre_uint16 *gn16ptr;\n#endif\n\n#ifdef SUPPORT_PCRE8\npcre_uint8 *copynames8 = (pcre_uint8 *)copynames;\npcre_uint8 *getnames8 = (pcre_uint8 *)getnames;\npcre_uint8 *cn8ptr;\npcre_uint8 *gn8ptr;\n#endif\n\n/* Get buffers from malloc() so that valgrind will check their misuse when\ndebugging. They grow automatically when very long lines are read. The 16-\nand 32-bit buffers (buffer16, buffer32) are obtained only if needed. */\n\nbuffer = (pcre_uint8 *)malloc(buffer_size);\npbuffer = (pcre_uint8 *)malloc(buffer_size);\n\n/* The outfile variable is static so that new_malloc can use it. */\n\noutfile = stdout;\n\n/* The following  _setmode() stuff is some Windows magic that tells its runtime\nlibrary to translate CRLF into a single LF character. At least, that's what\nI've been told: never having used Windows I take this all on trust. Originally\nit set 0x8000, but then I was advised that _O_BINARY was better. */\n\n#if defined(_WIN32) || defined(WIN32)\n_setmode( _fileno( stdout ), _O_BINARY );\n#endif\n\n/* Get the version number: both pcre_version() and pcre16_version() give the\nsame answer. We just need to ensure that we call one that is available. */\n\n#if defined SUPPORT_PCRE8\nversion = pcre_version();\n#elif defined SUPPORT_PCRE16\nversion = pcre16_version();\n#elif defined SUPPORT_PCRE32\nversion = pcre32_version();\n#endif\n\n/* Scan options */\n\nwhile (argc > 1 && argv[op][0] == '-')\n  {\n  pcre_uint8 *endptr;\n  char *arg = argv[op];\n\n  if (strcmp(arg, \"-m\") == 0) showstore = 1;\n  else if (strcmp(arg, \"-s\") == 0) force_study = 0;\n\n  else if (strncmp(arg, \"-s+\", 3) == 0)\n    {\n    arg += 3;\n    if (*arg == '+') { arg++; verify_jit = TRUE; }\n    force_study = 1;\n    if (*arg == 0)\n      force_study_options = jit_study_bits[6];\n    else if (*arg >= '1' && *arg <= '7')\n      force_study_options = jit_study_bits[*arg - '1'];\n    else goto BAD_ARG;\n    }\n  else if (strcmp(arg, \"-8\") == 0)\n    {\n#ifdef SUPPORT_PCRE8\n    pcre_mode = PCRE8_MODE;\n#else\n    printf(\"** This version of PCRE was built without 8-bit support\\n\");\n    exit(1);\n#endif\n    }\n  else if (strcmp(arg, \"-16\") == 0)\n    {\n#ifdef SUPPORT_PCRE16\n    pcre_mode = PCRE16_MODE;\n#else\n    printf(\"** This version of PCRE was built without 16-bit support\\n\");\n    exit(1);\n#endif\n    }\n  else if (strcmp(arg, \"-32\") == 0)\n    {\n#ifdef SUPPORT_PCRE32\n    pcre_mode = PCRE32_MODE;\n#else\n    printf(\"** This version of PCRE was built without 32-bit support\\n\");\n    exit(1);\n#endif\n    }\n  else if (strcmp(arg, \"-q\") == 0) quiet = 1;\n  else if (strcmp(arg, \"-b\") == 0) debug = 1;\n  else if (strcmp(arg, \"-i\") == 0) showinfo = 1;\n  else if (strcmp(arg, \"-d\") == 0) showinfo = debug = 1;\n  else if (strcmp(arg, \"-M\") == 0) default_find_match_limit = TRUE;\n  else if (strcmp(arg, \"-O\") == 0) default_options |= PCRE_NO_AUTO_POSSESS;\n#if !defined NODFA\n  else if (strcmp(arg, \"-dfa\") == 0) all_use_dfa = 1;\n#endif\n  else if (strcmp(arg, \"-o\") == 0 && argc > 2 &&\n      ((size_offsets = get_value((pcre_uint8 *)argv[op+1], &endptr)),\n        *endptr == 0))\n    {\n    op++;\n    argc--;\n    }\n  else if (strcmp(arg, \"-t\") == 0 || strcmp(arg, \"-tm\") == 0 ||\n           strcmp(arg, \"-T\") == 0 || strcmp(arg, \"-TM\") == 0)\n    {\n    int temp;\n    int both = arg[2] == 0;\n    showtotaltimes = arg[1] == 'T';\n    if (argc > 2 && (temp = get_value((pcre_uint8 *)argv[op+1], &endptr),\n                     *endptr == 0))\n      {\n      timeitm = temp;\n      op++;\n      argc--;\n      }\n    else timeitm = LOOPREPEAT;\n    if (both) timeit = timeitm;\n    }\n  else if (strcmp(arg, \"-S\") == 0 && argc > 2 &&\n      ((stack_size = get_value((pcre_uint8 *)argv[op+1], &endptr)),\n        *endptr == 0))\n    {\n#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS)\n    printf(\"PCRE: -S not supported on this OS\\n\");\n    exit(1);\n#else\n    int rc;\n    struct rlimit rlim;\n    getrlimit(RLIMIT_STACK, &rlim);\n    rlim.rlim_cur = stack_size * 1024 * 1024;\n    rc = setrlimit(RLIMIT_STACK, &rlim);\n    if (rc != 0)\n      {\n    printf(\"PCRE: setrlimit() failed with error %d\\n\", rc);\n    exit(1);\n      }\n    op++;\n    argc--;\n#endif\n    }\n#if !defined NOPOSIX\n  else if (strcmp(arg, \"-p\") == 0) posix = 1;\n#endif\n  else if (strcmp(arg, \"-C\") == 0)\n    {\n    int rc;\n    unsigned long int lrc;\n\n    if (argc > 2)\n      {\n      if (strcmp(argv[op + 1], \"linksize\") == 0)\n        {\n        (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc);\n        printf(\"%d\\n\", rc);\n        yield = rc;\n\n#ifdef __VMS\n        vms_setsymbol(\"LINKSIZE\",0,yield );\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"pcre8\") == 0)\n        {\n#ifdef SUPPORT_PCRE8\n        printf(\"1\\n\");\n        yield = 1;\n#else\n        printf(\"0\\n\");\n        yield = 0;\n#endif\n#ifdef __VMS\n        vms_setsymbol(\"PCRE8\",0,yield );\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"pcre16\") == 0)\n        {\n#ifdef SUPPORT_PCRE16\n        printf(\"1\\n\");\n        yield = 1;\n#else\n        printf(\"0\\n\");\n        yield = 0;\n#endif\n#ifdef __VMS\n        vms_setsymbol(\"PCRE16\",0,yield );\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"pcre32\") == 0)\n        {\n#ifdef SUPPORT_PCRE32\n        printf(\"1\\n\");\n        yield = 1;\n#else\n        printf(\"0\\n\");\n        yield = 0;\n#endif\n#ifdef __VMS\n        vms_setsymbol(\"PCRE32\",0,yield );\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"utf\") == 0)\n        {\n#ifdef SUPPORT_PCRE8\n        if (pcre_mode == PCRE8_MODE)\n          (void)pcre_config(PCRE_CONFIG_UTF8, &rc);\n#endif\n#ifdef SUPPORT_PCRE16\n        if (pcre_mode == PCRE16_MODE)\n          (void)pcre16_config(PCRE_CONFIG_UTF16, &rc);\n#endif\n#ifdef SUPPORT_PCRE32\n        if (pcre_mode == PCRE32_MODE)\n          (void)pcre32_config(PCRE_CONFIG_UTF32, &rc);\n#endif\n        printf(\"%d\\n\", rc);\n        yield = rc;\n#ifdef __VMS\n        vms_setsymbol(\"UTF\",0,yield );\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"ucp\") == 0)\n        {\n        (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);\n        printf(\"%d\\n\", rc);\n        yield = rc;\n        }\n      else if (strcmp(argv[op + 1], \"jit\") == 0)\n        {\n        (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc);\n        printf(\"%d\\n\", rc);\n        yield = rc;\n        }\n      else if (strcmp(argv[op + 1], \"newline\") == 0)\n        {\n        (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc);\n        print_newline_config(rc, TRUE);\n        }\n      else if (strcmp(argv[op + 1], \"bsr\") == 0)\n        {\n        (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc);\n        printf(\"%s\\n\", rc? \"ANYCRLF\" : \"ANY\");\n        }\n      else if (strcmp(argv[op + 1], \"ebcdic\") == 0)\n        {\n#ifdef EBCDIC\n        printf(\"1\\n\");\n        yield = 1;\n#else\n        printf(\"0\\n\");\n#endif\n        }\n      else if (strcmp(argv[op + 1], \"ebcdic-nl\") == 0)\n        {\n#ifdef EBCDIC\n        printf(\"0x%02x\\n\", CHAR_LF);\n#else\n        printf(\"0\\n\");\n#endif\n        }\n      else\n        {\n        printf(\"Unknown -C option: %s\\n\", argv[op + 1]);\n        }\n      goto EXIT;\n      }\n\n    /* No argument for -C: output all configuration information. */\n\n    printf(\"PCRE version %s\\n\", version);\n    printf(\"Compiled with\\n\");\n\n#ifdef EBCDIC\n    printf(\"  EBCDIC code support: LF is 0x%02x\\n\", CHAR_LF);\n#endif\n\n/* At least one of SUPPORT_PCRE8 and SUPPORT_PCRE16 will be set. If both\nare set, either both UTFs are supported or both are not supported. */\n\n#ifdef SUPPORT_PCRE8\n    printf(\"  8-bit support\\n\");\n    (void)pcre_config(PCRE_CONFIG_UTF8, &rc);\n      printf (\"  %sUTF-8 support\\n\", rc ? \"\" : \"No \");\n#endif\n#ifdef SUPPORT_PCRE16\n    printf(\"  16-bit support\\n\");\n    (void)pcre16_config(PCRE_CONFIG_UTF16, &rc);\n    printf (\"  %sUTF-16 support\\n\", rc ? \"\" : \"No \");\n#endif\n#ifdef SUPPORT_PCRE32\n    printf(\"  32-bit support\\n\");\n    (void)pcre32_config(PCRE_CONFIG_UTF32, &rc);\n    printf (\"  %sUTF-32 support\\n\", rc ? \"\" : \"No \");\n#endif\n\n    (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);\n    printf(\"  %sUnicode properties support\\n\", rc? \"\" : \"No \");\n    (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc);\n    if (rc)\n      {\n      const char *arch;\n      (void)PCRE_CONFIG(PCRE_CONFIG_JITTARGET, (void *)(&arch));\n      printf(\"  Just-in-time compiler support: %s\\n\", arch);\n      }\n    else\n      printf(\"  No just-in-time compiler support\\n\");\n    (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc);\n    print_newline_config(rc, FALSE);\n    (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc);\n    printf(\"  \\\\R matches %s\\n\", rc? \"CR, LF, or CRLF only\" :\n                                     \"all Unicode newlines\");\n    (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc);\n    printf(\"  Internal link size = %d\\n\", rc);\n    (void)PCRE_CONFIG(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);\n    printf(\"  POSIX malloc threshold = %d\\n\", rc);\n    (void)PCRE_CONFIG(PCRE_CONFIG_PARENS_LIMIT, &lrc);\n    printf(\"  Parentheses nest limit = %ld\\n\", lrc);\n    (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT, &lrc);\n    printf(\"  Default match limit = %ld\\n\", lrc);\n    (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &lrc);\n    printf(\"  Default recursion depth limit = %ld\\n\", lrc);\n    (void)PCRE_CONFIG(PCRE_CONFIG_STACKRECURSE, &rc);\n    printf(\"  Match recursion uses %s\", rc? \"stack\" : \"heap\");\n    if (showstore)\n      {\n      PCRE_EXEC(stack_size, NULL, NULL, NULL, -999, -999, 0, NULL, 0);\n      printf(\": %sframe size = %d bytes\", rc? \"approximate \" : \"\", -stack_size);\n      }\n    printf(\"\\n\");\n    goto EXIT;\n    }\n  else if (strcmp(arg, \"-help\") == 0 ||\n           strcmp(arg, \"--help\") == 0)\n    {\n    usage();\n    goto EXIT;\n    }\n  else\n    {\n    BAD_ARG:\n    printf(\"** Unknown or malformed option %s\\n\", arg);\n    usage();\n    yield = 1;\n    goto EXIT;\n    }\n  op++;\n  argc--;\n  }\n\n/* Get the store for the offsets vector, and remember what it was */\n\nsize_offsets_max = size_offsets;\noffsets = (int *)malloc(size_offsets_max * sizeof(int));\nif (offsets == NULL)\n  {\n  printf(\"** Failed to get %d bytes of memory for offsets vector\\n\",\n    (int)(size_offsets_max * sizeof(int)));\n  yield = 1;\n  goto EXIT;\n  }\n\n/* Sort out the input and output files */\n\nif (argc > 1)\n  {\n  infile = fopen(argv[op], INPUT_MODE);\n  if (infile == NULL)\n    {\n    printf(\"** Failed to open %s\\n\", argv[op]);\n    yield = 1;\n    goto EXIT;\n    }\n  }\n\nif (argc > 2)\n  {\n  outfile = fopen(argv[op+1], OUTPUT_MODE);\n  if (outfile == NULL)\n    {\n    printf(\"** Failed to open %s\\n\", argv[op+1]);\n    yield = 1;\n    goto EXIT;\n    }\n  }\n\n/* Set alternative malloc function */\n\n#ifdef SUPPORT_PCRE8\npcre_malloc = new_malloc;\npcre_free = new_free;\npcre_stack_malloc = stack_malloc;\npcre_stack_free = stack_free;\n#endif\n\n#ifdef SUPPORT_PCRE16\npcre16_malloc = new_malloc;\npcre16_free = new_free;\npcre16_stack_malloc = stack_malloc;\npcre16_stack_free = stack_free;\n#endif\n\n#ifdef SUPPORT_PCRE32\npcre32_malloc = new_malloc;\npcre32_free = new_free;\npcre32_stack_malloc = stack_malloc;\npcre32_stack_free = stack_free;\n#endif\n\n/* Heading line unless quiet */\n\nif (!quiet) fprintf(outfile, \"PCRE version %s\\n\\n\", version);\n\n/* Main loop */\n\nwhile (!done)\n  {\n  pcre *re = NULL;\n  pcre_extra *extra = NULL;\n\n#if !defined NOPOSIX  /* There are still compilers that require no indent */\n  regex_t preg = { NULL, 0, 0} ;\n  int do_posix = 0;\n#endif\n\n  const char *error;\n  pcre_uint8 *markptr;\n  pcre_uint8 *p, *pp, *ppp;\n  pcre_uint8 *to_file = NULL;\n  const pcre_uint8 *tables = NULL;\n  unsigned long int get_options;\n  unsigned long int true_size, true_study_size = 0;\n  size_t size;\n  int do_allcaps = 0;\n  int do_mark = 0;\n  int do_study = 0;\n  int no_force_study = 0;\n  int do_debug = debug;\n  int do_G = 0;\n  int do_g = 0;\n  int do_showinfo = showinfo;\n  int do_showrest = 0;\n  int do_showcaprest = 0;\n  int do_flip = 0;\n  int erroroffset, len, delimiter, poffset;\n\n#if !defined NODFA\n  int dfa_matched = 0;\n#endif\n\n  use_utf = 0;\n  debug_lengths = 1;\n  SET_PCRE_STACK_GUARD(NULL);\n\n  if (extend_inputline(infile, buffer, \"  re> \") == NULL) break;\n  if (infile != stdin) fprintf(outfile, \"%s\", (char *)buffer);\n  fflush(outfile);\n\n  p = buffer;\n  while (isspace(*p)) p++;\n  if (*p == 0) continue;\n\n  /* Handle option lock-out setting */\n\n  if (*p == '<' && p[1] == ' ')\n    {\n    p += 2;\n    while (isspace(*p)) p++;\n    if (strncmp((char *)p, \"forbid \", 7) == 0)\n      {\n      p += 7;\n      while (isspace(*p)) p++;\n      pp = lockout;\n      while (!isspace(*p) && pp < lockout + sizeof(lockout) - 1)\n        *pp++ = *p++;\n      *pp = 0;\n      }\n    else\n      {\n      printf(\"** Unrecognized special command '%s'\\n\", p);\n      yield = 1;\n      goto EXIT;\n      }\n    continue;\n    }\n\n  /* See if the pattern is to be loaded pre-compiled from a file. */\n\n  if (*p == '<' && strchr((char *)(p+1), '<') == NULL)\n    {\n    pcre_uint32 magic;\n    pcre_uint8 sbuf[8];\n    FILE *f;\n\n    p++;\n    if (*p == '!')\n      {\n      do_debug = TRUE;\n      do_showinfo = TRUE;\n      p++;\n      }\n\n    pp = p + (int)strlen((char *)p);\n    while (isspace(pp[-1])) pp--;\n    *pp = 0;\n\n    f = fopen((char *)p, \"rb\");\n    if (f == NULL)\n      {\n      fprintf(outfile, \"Failed to open %s: %s\\n\", p, strerror(errno));\n      continue;\n      }\n    if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ;\n\n    true_size =\n      (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3];\n    true_study_size =\n      (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7];\n\n    re = (pcre *)new_malloc(true_size);\n    if (re == NULL)\n      {\n      printf(\"** Failed to get %d bytes of memory for pcre object\\n\",\n        (int)true_size);\n      yield = 1;\n      goto EXIT;\n      }\n    if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ;\n\n    magic = REAL_PCRE_MAGIC(re);\n    if (magic != MAGIC_NUMBER)\n      {\n      if (swap_uint32(magic) == MAGIC_NUMBER)\n        {\n        do_flip = 1;\n        }\n      else\n        {\n        fprintf(outfile, \"Data in %s is not a compiled PCRE regex\\n\", p);\n        new_free(re);\n        fclose(f);\n        continue;\n        }\n      }\n\n    /* We hide the byte-invert info for little and big endian tests. */\n    fprintf(outfile, \"Compiled pattern%s loaded from %s\\n\",\n      do_flip && (p[-1] == '<') ? \" (byte-inverted)\" : \"\", p);\n\n    /* Now see if there is any following study data. */\n\n    if (true_study_size != 0)\n      {\n      pcre_study_data *psd;\n\n      extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size);\n      extra->flags = PCRE_EXTRA_STUDY_DATA;\n\n      psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra));\n      extra->study_data = psd;\n\n      if (fread(psd, 1, true_study_size, f) != true_study_size)\n        {\n        FAIL_READ:\n        fprintf(outfile, \"Failed to read data from %s\\n\", p);\n        if (extra != NULL)\n          {\n          PCRE_FREE_STUDY(extra);\n          }\n        new_free(re);\n        fclose(f);\n        continue;\n        }\n      fprintf(outfile, \"Study data loaded from %s\\n\", p);\n      do_study = 1;     /* To get the data output if requested */\n      }\n    else fprintf(outfile, \"No study data\\n\");\n\n    /* Flip the necessary bytes. */\n    if (do_flip)\n      {\n      int rc;\n      PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, NULL);\n      if (rc == PCRE_ERROR_BADMODE)\n        {\n        pcre_uint32 flags_in_host_byte_order;\n        if (REAL_PCRE_MAGIC(re) == MAGIC_NUMBER)\n          flags_in_host_byte_order = REAL_PCRE_FLAGS(re);\n        else\n          flags_in_host_byte_order = swap_uint32(REAL_PCRE_FLAGS(re));\n        /* Simulate the result of the function call below. */\n        fprintf(outfile, \"Error %d from pcre%s_fullinfo(%d)\\n\", rc,\n          pcre_mode == PCRE32_MODE ? \"32\" : pcre_mode == PCRE16_MODE ? \"16\" : \"\",\n          PCRE_INFO_OPTIONS);\n        fprintf(outfile, \"Running in %d-bit mode but pattern was compiled in \"\n          \"%d-bit mode\\n\", 8 * CHAR_SIZE, 8 * (flags_in_host_byte_order & PCRE_MODE_MASK));\n        new_free(re);\n        fclose(f);\n        continue;\n        }\n      }\n\n    /* Need to know if UTF-8 for printing data strings. */\n\n    if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0)\n      {\n      new_free(re);\n      fclose(f);\n      continue;\n      }\n    use_utf = (get_options & PCRE_UTF8) != 0;\n\n    fclose(f);\n    goto SHOW_INFO;\n    }\n\n  /* In-line pattern (the usual case). Get the delimiter and seek the end of\n  the pattern; if it isn't complete, read more. */\n\n  delimiter = *p++;\n\n  if (isalnum(delimiter) || delimiter == '\\\\')\n    {\n    fprintf(outfile, \"** Delimiter must not be alphanumeric or \\\\\\n\");\n    goto SKIP_DATA;\n    }\n\n  pp = p;\n  poffset = (int)(p - buffer);\n\n  for(;;)\n    {\n    while (*pp != 0)\n      {\n      if (*pp == '\\\\' && pp[1] != 0) pp++;\n        else if (*pp == delimiter) break;\n      pp++;\n      }\n    if (*pp != 0) break;\n    if ((pp = extend_inputline(infile, pp, \"    > \")) == NULL)\n      {\n      fprintf(outfile, \"** Unexpected EOF\\n\");\n      done = 1;\n      goto CONTINUE;\n      }\n    if (infile != stdin) fprintf(outfile, \"%s\", (char *)pp);\n    }\n\n  /* The buffer may have moved while being extended; reset the start of data\n  pointer to the correct relative point in the buffer. */\n\n  p = buffer + poffset;\n\n  /* If the first character after the delimiter is backslash, make\n  the pattern end with backslash. This is purely to provide a way\n  of testing for the error message when a pattern ends with backslash. */\n\n  if (pp[1] == '\\\\') *pp++ = '\\\\';\n\n  /* Terminate the pattern at the delimiter, and save a copy of the pattern\n  for callouts. */\n\n  *pp++ = 0;\n  strcpy((char *)pbuffer, (char *)p);\n\n  /* Look for modifiers and options after the final delimiter. */\n\n  options = default_options;\n  study_options = force_study_options;\n  log_store = showstore;  /* default from command line */\n\n  while (*pp != 0)\n    {\n    /* Check to see whether this modifier has been locked out for this file.\n    This is complicated for the multi-character options that begin with '<'.\n    If there is no '>' in the lockout string, all multi-character modifiers are\n    locked out. */\n\n    if (strchr((char *)lockout, *pp) != NULL)\n      {\n      if (*pp == '<' && strchr((char *)lockout, '>') != NULL)\n        {\n        int x = check_mc_option(pp+1, outfile, FALSE, \"modifier\");\n        if (x == 0) goto SKIP_DATA;\n\n        for (ppp = lockout; *ppp != 0; ppp++)\n          {\n          if (*ppp == '<')\n            {\n            int y = check_mc_option(ppp+1, outfile, FALSE, \"modifier\");\n            if (y == 0)\n              {\n              printf(\"** Error in modifier forbid data - giving up.\\n\");\n              yield = 1;\n              goto EXIT;\n              }\n            if (x == y)\n              {\n              ppp = pp;\n              while (*ppp != '>') ppp++;\n              printf(\"** The %.*s modifier is locked out - giving up.\\n\",\n                (int)(ppp - pp + 1), pp);\n              yield = 1;\n              goto EXIT;\n              }\n            }\n          }\n        }\n\n      /* The single-character modifiers are straightforward. */\n\n      else\n        {\n        printf(\"** The /%c modifier is locked out - giving up.\\n\", *pp);\n        yield = 1;\n        goto EXIT;\n        }\n      }\n\n    /* The modifier is not locked out; handle it. */\n\n    switch (*pp++)\n      {\n      case 'f': options |= PCRE_FIRSTLINE; break;\n      case 'g': do_g = 1; break;\n      case 'i': options |= PCRE_CASELESS; break;\n      case 'm': options |= PCRE_MULTILINE; break;\n      case 's': options |= PCRE_DOTALL; break;\n      case 'x': options |= PCRE_EXTENDED; break;\n\n      case '+':\n      if (do_showrest) do_showcaprest = 1; else do_showrest = 1;\n      break;\n\n      case '=': do_allcaps = 1; break;\n      case 'A': options |= PCRE_ANCHORED; break;\n      case 'B': do_debug = 1; break;\n      case 'C': options |= PCRE_AUTO_CALLOUT; break;\n      case 'D': do_debug = do_showinfo = 1; break;\n      case 'E': options |= PCRE_DOLLAR_ENDONLY; break;\n      case 'F': do_flip = 1; break;\n      case 'G': do_G = 1; break;\n      case 'I': do_showinfo = 1; break;\n      case 'J': options |= PCRE_DUPNAMES; break;\n      case 'K': do_mark = 1; break;\n      case 'M': log_store = 1; break;\n      case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;\n      case 'O': options |= PCRE_NO_AUTO_POSSESS; break;\n\n#if !defined NOPOSIX\n      case 'P': do_posix = 1; break;\n#endif\n\n      case 'Q':\n      switch (*pp)\n        {\n        case '0':\n        case '1':\n        stack_guard_return = *pp++ - '0';\n        break;\n\n        default:\n        fprintf(outfile, \"** Missing 0 or 1 after /Q\\n\");\n        goto SKIP_DATA;\n        }\n      SET_PCRE_STACK_GUARD(stack_guard);\n      break;\n\n      case 'S':\n      do_study = 1;\n      for (;;)\n        {\n        switch (*pp++)\n          {\n          case 'S':\n          do_study = 0;\n          no_force_study = 1;\n          break;\n\n          case '!':\n          study_options |= PCRE_STUDY_EXTRA_NEEDED;\n          break;\n\n          case '+':\n          if (*pp == '+')\n            {\n            verify_jit = TRUE;\n            pp++;\n            }\n          if (*pp >= '1' && *pp <= '7')\n            study_options |= jit_study_bits[*pp++ - '1'];\n          else\n            study_options |= jit_study_bits[6];\n          break;\n\n          case '-':\n          study_options &= ~PCRE_STUDY_ALLJIT;\n          break;\n\n          default:\n          pp--;\n          goto ENDLOOP;\n          }\n        }\n      ENDLOOP:\n      break;\n\n      case 'U': options |= PCRE_UNGREEDY; break;\n      case 'W': options |= PCRE_UCP; break;\n      case 'X': options |= PCRE_EXTRA; break;\n      case 'Y': options |= PCRE_NO_START_OPTIMISE; break;\n      case 'Z': debug_lengths = 0; break;\n      case '8': options |= PCRE_UTF8; use_utf = 1; break;\n      case '9': options |= PCRE_NEVER_UTF; break;\n      case '?': options |= PCRE_NO_UTF8_CHECK; break;\n\n      case 'T':\n      switch (*pp++)\n        {\n        case '0': tables = tables0; break;\n        case '1': tables = tables1; break;\n\n        case '\\r':\n        case '\\n':\n        case ' ':\n        case 0:\n        fprintf(outfile, \"** Missing table number after /T\\n\");\n        goto SKIP_DATA;\n\n        default:\n        fprintf(outfile, \"** Bad table number \\\"%c\\\" after /T\\n\", pp[-1]);\n        goto SKIP_DATA;\n        }\n      break;\n\n      case 'L':\n      ppp = pp;\n      /* The '\\r' test here is so that it works on Windows. */\n      /* The '0' test is just in case this is an unterminated line. */\n      while (*ppp != 0 && *ppp != '\\n' && *ppp != '\\r' && *ppp != ' ') ppp++;\n      *ppp = 0;\n      if (setlocale(LC_CTYPE, (const char *)pp) == NULL)\n        {\n        fprintf(outfile, \"** Failed to set locale \\\"%s\\\"\\n\", pp);\n        goto SKIP_DATA;\n        }\n      locale_set = 1;\n      tables = PCRE_MAKETABLES;\n      pp = ppp;\n      break;\n\n      case '>':\n      to_file = pp;\n      while (*pp != 0) pp++;\n      while (isspace(pp[-1])) pp--;\n      *pp = 0;\n      break;\n\n      case '<':\n        {\n        int x = check_mc_option(pp, outfile, FALSE, \"modifier\");\n        if (x == 0) goto SKIP_DATA;\n        options |= x;\n        while (*pp++ != '>');\n        }\n      break;\n\n      case '\\r':                      /* So that it works in Windows */\n      case '\\n':\n      case ' ':\n      break;\n\n      default:\n      fprintf(outfile, \"** Unknown modifier '%c'\\n\", pp[-1]);\n      goto SKIP_DATA;\n      }\n    }\n\n  /* Handle compiling via the POSIX interface, which doesn't support the\n  timing, showing, or debugging options, nor the ability to pass over\n  local character tables. Neither does it have 16-bit support. */\n\n#if !defined NOPOSIX\n  if (posix || do_posix)\n    {\n    int rc;\n    int cflags = 0;\n\n    if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE;\n    if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE;\n    if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;\n    if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB;\n    if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8;\n    if ((options & PCRE_UCP) != 0) cflags |= REG_UCP;\n    if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY;\n\n    rc = regcomp(&preg, (char *)p, cflags);\n\n    /* Compilation failed; go back for another re, skipping to blank line\n    if non-interactive. */\n\n    if (rc != 0)\n      {\n      (void)regerror(rc, &preg, (char *)buffer, buffer_size);\n      fprintf(outfile, \"Failed: POSIX code %d: %s\\n\", rc, buffer);\n      goto SKIP_DATA;\n      }\n    }\n\n  /* Handle compiling via the native interface */\n\n  else\n#endif  /* !defined NOPOSIX */\n\n    {\n    /* In 16- or 32-bit mode, convert the input. */\n\n#ifdef SUPPORT_PCRE16\n    if (pcre_mode == PCRE16_MODE)\n      {\n      switch(to16(FALSE, p, options & PCRE_UTF8, (int)strlen((char *)p)))\n        {\n        case -1:\n        fprintf(outfile, \"**Failed: invalid UTF-8 string cannot be \"\n          \"converted to UTF-16\\n\");\n        goto SKIP_DATA;\n\n        case -2:\n        fprintf(outfile, \"**Failed: character value greater than 0x10ffff \"\n          \"cannot be converted to UTF-16\\n\");\n        goto SKIP_DATA;\n\n        case -3: /* \"Impossible error\" when to16 is called arg1 FALSE */\n        fprintf(outfile, \"**Failed: character value greater than 0xffff \"\n          \"cannot be converted to 16-bit in non-UTF mode\\n\");\n        goto SKIP_DATA;\n\n        default:\n        break;\n        }\n      p = (pcre_uint8 *)buffer16;\n      }\n#endif\n\n#ifdef SUPPORT_PCRE32\n    if (pcre_mode == PCRE32_MODE)\n      {\n      switch(to32(FALSE, p, options & PCRE_UTF32, (int)strlen((char *)p)))\n        {\n        case -1:\n        fprintf(outfile, \"**Failed: invalid UTF-8 string cannot be \"\n          \"converted to UTF-32\\n\");\n        goto SKIP_DATA;\n\n        case -2:\n        fprintf(outfile, \"**Failed: character value greater than 0x10ffff \"\n          \"cannot be converted to UTF-32\\n\");\n        goto SKIP_DATA;\n\n        case -3:\n        fprintf(outfile, \"**Failed: character value is ill-formed UTF-32\\n\");\n        goto SKIP_DATA;\n\n        default:\n        break;\n        }\n      p = (pcre_uint8 *)buffer32;\n      }\n#endif\n\n    /* Compile many times when timing */\n\n    if (timeit > 0)\n      {\n      register int i;\n      clock_t time_taken;\n      clock_t start_time = clock();\n      for (i = 0; i < timeit; i++)\n        {\n        PCRE_COMPILE(re, p, options, &error, &erroroffset, tables);\n        if (re != NULL) free(re);\n        }\n      total_compile_time += (time_taken = clock() - start_time);\n      fprintf(outfile, \"Compile time %.4f milliseconds\\n\",\n        (((double)time_taken * 1000.0) / (double)timeit) /\n          (double)CLOCKS_PER_SEC);\n      }\n\n    PCRE_COMPILE(re, p, options, &error, &erroroffset, tables);\n\n    /* Compilation failed; go back for another re, skipping to blank line\n    if non-interactive. */\n\n    if (re == NULL)\n      {\n      fprintf(outfile, \"Failed: %s at offset %d\\n\", error, erroroffset);\n      SKIP_DATA:\n      if (infile != stdin)\n        {\n        for (;;)\n          {\n          if (extend_inputline(infile, buffer, NULL) == NULL)\n            {\n            done = 1;\n            goto CONTINUE;\n            }\n          len = (int)strlen((char *)buffer);\n          while (len > 0 && isspace(buffer[len-1])) len--;\n          if (len == 0) break;\n          }\n        fprintf(outfile, \"\\n\");\n        }\n      goto CONTINUE;\n      }\n\n    /* Compilation succeeded. It is now possible to set the UTF-8 option from\n    within the regex; check for this so that we know how to process the data\n    lines. */\n\n    if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0)\n      goto SKIP_DATA;\n    if ((get_options & PCRE_UTF8) != 0) use_utf = 1;\n\n    /* Extract the size for possible writing before possibly flipping it,\n    and remember the store that was got. */\n\n    true_size = REAL_PCRE_SIZE(re);\n\n    /* Output code size information if requested */\n\n    if (log_store)\n      {\n      int name_count, name_entry_size, real_pcre_size;\n\n      new_info(re, NULL, PCRE_INFO_NAMECOUNT, &name_count);\n      new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &name_entry_size);\n      real_pcre_size = 0;\n#ifdef SUPPORT_PCRE8\n      if (REAL_PCRE_FLAGS(re) & PCRE_MODE8)\n        real_pcre_size = sizeof(real_pcre);\n#endif\n#ifdef SUPPORT_PCRE16\n      if (REAL_PCRE_FLAGS(re) & PCRE_MODE16)\n        real_pcre_size = sizeof(real_pcre16);\n#endif\n#ifdef SUPPORT_PCRE32\n      if (REAL_PCRE_FLAGS(re) & PCRE_MODE32)\n        real_pcre_size = sizeof(real_pcre32);\n#endif\n      new_info(re, NULL, PCRE_INFO_SIZE, &size);\n      fprintf(outfile, \"Memory allocation (code space): %d\\n\",\n        (int)(size - real_pcre_size - name_count * name_entry_size));\n      }\n\n    /* If -s or /S was present, study the regex to generate additional info to\n    help with the matching, unless the pattern has the SS option, which\n    suppresses the effect of /S (used for a few test patterns where studying is\n    never sensible). */\n\n    if (do_study || (force_study >= 0 && !no_force_study))\n      {\n      if (timeit > 0)\n        {\n        register int i;\n        clock_t time_taken;\n        clock_t start_time = clock();\n        for (i = 0; i < timeit; i++)\n          {\n          PCRE_STUDY(extra, re, study_options, &error);\n          }\n        total_study_time = (time_taken = clock() - start_time);\n        if (extra != NULL)\n          {\n          PCRE_FREE_STUDY(extra);\n          }\n        fprintf(outfile, \"  Study time %.4f milliseconds\\n\",\n          (((double)time_taken * 1000.0) / (double)timeit) /\n            (double)CLOCKS_PER_SEC);\n        }\n      PCRE_STUDY(extra, re, study_options, &error);\n      if (error != NULL)\n        fprintf(outfile, \"Failed to study: %s\\n\", error);\n      else if (extra != NULL)\n        {\n        true_study_size = ((pcre_study_data *)(extra->study_data))->size;\n        if (log_store)\n          {\n          size_t jitsize;\n          if (new_info(re, extra, PCRE_INFO_JITSIZE, &jitsize) == 0 &&\n              jitsize != 0)\n            fprintf(outfile, \"Memory allocation (JIT code): %d\\n\", (int)jitsize);\n          }\n        }\n      }\n\n    /* If /K was present, we set up for handling MARK data. */\n\n    if (do_mark)\n      {\n      if (extra == NULL)\n        {\n        extra = (pcre_extra *)malloc(sizeof(pcre_extra));\n        extra->flags = 0;\n        }\n      extra->mark = &markptr;\n      extra->flags |= PCRE_EXTRA_MARK;\n      }\n\n    /* Extract and display information from the compiled data if required. */\n\n    SHOW_INFO:\n\n    if (do_debug)\n      {\n      fprintf(outfile, \"------------------------------------------------------------------\\n\");\n      PCRE_PRINTINT(re, outfile, debug_lengths);\n      }\n\n    /* We already have the options in get_options (see above) */\n\n    if (do_showinfo)\n      {\n      unsigned long int all_options;\n      pcre_uint32 first_char, need_char;\n      pcre_uint32 match_limit, recursion_limit;\n      int count, backrefmax, first_char_set, need_char_set, okpartial, jchanged,\n        hascrorlf, maxlookbehind, match_empty;\n      int nameentrysize, namecount;\n      const pcre_uint8 *nametable;\n\n      if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) +\n          new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax) +\n          new_info(re, NULL, PCRE_INFO_FIRSTCHARACTER, &first_char) +\n          new_info(re, NULL, PCRE_INFO_FIRSTCHARACTERFLAGS, &first_char_set) +\n          new_info(re, NULL, PCRE_INFO_REQUIREDCHAR, &need_char) +\n          new_info(re, NULL, PCRE_INFO_REQUIREDCHARFLAGS, &need_char_set) +\n          new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize) +\n          new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount) +\n          new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable) +\n          new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial) +\n          new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged) +\n          new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf) +\n          new_info(re, NULL, PCRE_INFO_MATCH_EMPTY, &match_empty) +\n          new_info(re, NULL, PCRE_INFO_MAXLOOKBEHIND, &maxlookbehind)\n          != 0)\n        goto SKIP_DATA;\n\n      fprintf(outfile, \"Capturing subpattern count = %d\\n\", count);\n\n      if (backrefmax > 0)\n        fprintf(outfile, \"Max back reference = %d\\n\", backrefmax);\n\n      if (maxlookbehind > 0)\n        fprintf(outfile, \"Max lookbehind = %d\\n\", maxlookbehind);\n\n      if (new_info(re, NULL, PCRE_INFO_MATCHLIMIT, &match_limit) == 0)\n        fprintf(outfile, \"Match limit = %u\\n\", match_limit);\n\n      if (new_info(re, NULL, PCRE_INFO_RECURSIONLIMIT, &recursion_limit) == 0)\n        fprintf(outfile, \"Recursion limit = %u\\n\", recursion_limit);\n\n      if (namecount > 0)\n        {\n        fprintf(outfile, \"Named capturing subpatterns:\\n\");\n        while (namecount-- > 0)\n          {\n          int imm2_size = pcre_mode == PCRE8_MODE ? 2 : 1;\n          int length = (int)STRLEN(nametable + imm2_size);\n          fprintf(outfile, \"  \");\n          PCHARSV(nametable, imm2_size, length, outfile);\n          while (length++ < nameentrysize - imm2_size) putc(' ', outfile);\n#ifdef SUPPORT_PCRE32\n          if (pcre_mode == PCRE32_MODE)\n            fprintf(outfile, \"%3d\\n\", (int)(((PCRE_SPTR32)nametable)[0]));\n#endif\n#ifdef SUPPORT_PCRE16\n          if (pcre_mode == PCRE16_MODE)\n            fprintf(outfile, \"%3d\\n\", (int)(((PCRE_SPTR16)nametable)[0]));\n#endif\n#ifdef SUPPORT_PCRE8\n          if (pcre_mode == PCRE8_MODE)\n            fprintf(outfile, \"%3d\\n\", ((int)nametable[0] << 8) | (int)nametable[1]);\n#endif\n          nametable += nameentrysize * CHAR_SIZE;\n          }\n        }\n\n      if (!okpartial)  fprintf(outfile, \"Partial matching not supported\\n\");\n      if (hascrorlf)   fprintf(outfile, \"Contains explicit CR or LF match\\n\");\n      if (match_empty) fprintf(outfile, \"May match empty string\\n\");\n\n      all_options = REAL_PCRE_OPTIONS(re);\n      if (do_flip) all_options = swap_uint32(all_options);\n\n      if (get_options == 0) fprintf(outfile, \"No options\\n\");\n        else fprintf(outfile, \"Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\\n\",\n          ((get_options & PCRE_ANCHORED) != 0)? \" anchored\" : \"\",\n          ((get_options & PCRE_CASELESS) != 0)? \" caseless\" : \"\",\n          ((get_options & PCRE_EXTENDED) != 0)? \" extended\" : \"\",\n          ((get_options & PCRE_MULTILINE) != 0)? \" multiline\" : \"\",\n          ((get_options & PCRE_FIRSTLINE) != 0)? \" firstline\" : \"\",\n          ((get_options & PCRE_DOTALL) != 0)? \" dotall\" : \"\",\n          ((get_options & PCRE_BSR_ANYCRLF) != 0)? \" bsr_anycrlf\" : \"\",\n          ((get_options & PCRE_BSR_UNICODE) != 0)? \" bsr_unicode\" : \"\",\n          ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? \" dollar_endonly\" : \"\",\n          ((get_options & PCRE_EXTRA) != 0)? \" extra\" : \"\",\n          ((get_options & PCRE_UNGREEDY) != 0)? \" ungreedy\" : \"\",\n          ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? \" no_auto_capture\" : \"\",\n          ((get_options & PCRE_NO_AUTO_POSSESS) != 0)? \" no_auto_possessify\" : \"\",\n          ((get_options & PCRE_UTF8) != 0)? \" utf\" : \"\",\n          ((get_options & PCRE_UCP) != 0)? \" ucp\" : \"\",\n          ((get_options & PCRE_NO_UTF8_CHECK) != 0)? \" no_utf_check\" : \"\",\n          ((get_options & PCRE_NO_START_OPTIMIZE) != 0)? \" no_start_optimize\" : \"\",\n          ((get_options & PCRE_DUPNAMES) != 0)? \" dupnames\" : \"\",\n          ((get_options & PCRE_NEVER_UTF) != 0)? \" never_utf\" : \"\");\n\n      if (jchanged) fprintf(outfile, \"Duplicate name status changes\\n\");\n\n      switch (get_options & PCRE_NEWLINE_BITS)\n        {\n        case PCRE_NEWLINE_CR:\n        fprintf(outfile, \"Forced newline sequence: CR\\n\");\n        break;\n\n        case PCRE_NEWLINE_LF:\n        fprintf(outfile, \"Forced newline sequence: LF\\n\");\n        break;\n\n        case PCRE_NEWLINE_CRLF:\n        fprintf(outfile, \"Forced newline sequence: CRLF\\n\");\n        break;\n\n        case PCRE_NEWLINE_ANYCRLF:\n        fprintf(outfile, \"Forced newline sequence: ANYCRLF\\n\");\n        break;\n\n        case PCRE_NEWLINE_ANY:\n        fprintf(outfile, \"Forced newline sequence: ANY\\n\");\n        break;\n\n        default:\n        break;\n        }\n\n      if (first_char_set == 2)\n        {\n        fprintf(outfile, \"First char at start or follows newline\\n\");\n        }\n      else if (first_char_set == 1)\n        {\n        const char *caseless =\n          ((REAL_PCRE_FLAGS(re) & PCRE_FCH_CASELESS) == 0)?\n          \"\" : \" (caseless)\";\n\n        if (PRINTOK(first_char))\n          fprintf(outfile, \"First char = \\'%c\\'%s\\n\", first_char, caseless);\n        else\n          {\n          fprintf(outfile, \"First char = \");\n          pchar(first_char, outfile);\n          fprintf(outfile, \"%s\\n\", caseless);\n          }\n        }\n      else\n        {\n        fprintf(outfile, \"No first char\\n\");\n        }\n\n      if (need_char_set == 0)\n        {\n        fprintf(outfile, \"No need char\\n\");\n        }\n      else\n        {\n        const char *caseless =\n          ((REAL_PCRE_FLAGS(re) & PCRE_RCH_CASELESS) == 0)?\n          \"\" : \" (caseless)\";\n\n        if (PRINTOK(need_char))\n          fprintf(outfile, \"Need char = \\'%c\\'%s\\n\", need_char, caseless);\n        else\n          {\n          fprintf(outfile, \"Need char = \");\n          pchar(need_char, outfile);\n          fprintf(outfile, \"%s\\n\", caseless);\n          }\n        }\n\n      /* Don't output study size; at present it is in any case a fixed\n      value, but it varies, depending on the computer architecture, and\n      so messes up the test suite. (And with the /F option, it might be\n      flipped.) If study was forced by an external -s, don't show this\n      information unless -i or -d was also present. This means that, except\n      when auto-callouts are involved, the output from runs with and without\n      -s should be identical. */\n\n      if (do_study || (force_study >= 0 && showinfo && !no_force_study))\n        {\n        if (extra == NULL)\n          fprintf(outfile, \"Study returned NULL\\n\");\n        else\n          {\n          pcre_uint8 *start_bits = NULL;\n          int minlength;\n\n          if (new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength) == 0)\n            fprintf(outfile, \"Subject length lower bound = %d\\n\", minlength);\n\n          if (new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits) == 0)\n            {\n            if (start_bits == NULL)\n              fprintf(outfile, \"No starting char list\\n\");\n            else\n              {\n              int i;\n              int c = 24;\n              fprintf(outfile, \"Starting chars: \");\n              for (i = 0; i < 256; i++)\n                {\n                if ((start_bits[i/8] & (1<<(i&7))) != 0)\n                  {\n                  if (c > 75)\n                    {\n                    fprintf(outfile, \"\\n  \");\n                    c = 2;\n                    }\n                  if (PRINTOK(i) && i != ' ')\n                    {\n                    fprintf(outfile, \"%c \", i);\n                    c += 2;\n                    }\n                  else\n                    {\n                    fprintf(outfile, \"\\\\x%02x \", i);\n                    c += 5;\n                    }\n                  }\n                }\n              fprintf(outfile, \"\\n\");\n              }\n            }\n          }\n\n        /* Show this only if the JIT was set by /S, not by -s. */\n\n        if ((study_options & PCRE_STUDY_ALLJIT) != 0 &&\n            (force_study_options & PCRE_STUDY_ALLJIT) == 0)\n          {\n          int jit;\n          if (new_info(re, extra, PCRE_INFO_JIT, &jit) == 0)\n            {\n            if (jit)\n              fprintf(outfile, \"JIT study was successful\\n\");\n            else\n#ifdef SUPPORT_JIT\n              fprintf(outfile, \"JIT study was not successful\\n\");\n#else\n              fprintf(outfile, \"JIT support is not available in this version of PCRE\\n\");\n#endif\n            }\n          }\n        }\n      }\n\n    /* If the '>' option was present, we write out the regex to a file, and\n    that is all. The first 8 bytes of the file are the regex length and then\n    the study length, in big-endian order. */\n\n    if (to_file != NULL)\n      {\n      FILE *f = fopen((char *)to_file, \"wb\");\n      if (f == NULL)\n        {\n        fprintf(outfile, \"Unable to open %s: %s\\n\", to_file, strerror(errno));\n        }\n      else\n        {\n        pcre_uint8 sbuf[8];\n\n        if (do_flip) regexflip(re, extra);\n        sbuf[0] = (pcre_uint8)((true_size >> 24) & 255);\n        sbuf[1] = (pcre_uint8)((true_size >> 16) & 255);\n        sbuf[2] = (pcre_uint8)((true_size >>  8) & 255);\n        sbuf[3] = (pcre_uint8)((true_size) & 255);\n        sbuf[4] = (pcre_uint8)((true_study_size >> 24) & 255);\n        sbuf[5] = (pcre_uint8)((true_study_size >> 16) & 255);\n        sbuf[6] = (pcre_uint8)((true_study_size >>  8) & 255);\n        sbuf[7] = (pcre_uint8)((true_study_size) & 255);\n\n        if (fwrite(sbuf, 1, 8, f) < 8 ||\n            fwrite(re, 1, true_size, f) < true_size)\n          {\n          fprintf(outfile, \"Write error on %s: %s\\n\", to_file, strerror(errno));\n          }\n        else\n          {\n          fprintf(outfile, \"Compiled pattern written to %s\\n\", to_file);\n\n          /* If there is study data, write it. */\n\n          if (extra != NULL)\n            {\n            if (fwrite(extra->study_data, 1, true_study_size, f) <\n                true_study_size)\n              {\n              fprintf(outfile, \"Write error on %s: %s\\n\", to_file,\n                strerror(errno));\n              }\n            else fprintf(outfile, \"Study data written to %s\\n\", to_file);\n            }\n          }\n        fclose(f);\n        }\n\n      new_free(re);\n      if (extra != NULL)\n        {\n        PCRE_FREE_STUDY(extra);\n        }\n      if (locale_set)\n        {\n        new_free((void *)tables);\n        setlocale(LC_CTYPE, \"C\");\n        locale_set = 0;\n        }\n      continue;  /* With next regex */\n      }\n    }        /* End of non-POSIX compile */\n\n  /* Read data lines and test them */\n\n  for (;;)\n    {\n#ifdef SUPPORT_PCRE8\n    pcre_uint8 *q8;\n#endif\n#ifdef SUPPORT_PCRE16\n    pcre_uint16 *q16;\n#endif\n#ifdef SUPPORT_PCRE32\n    pcre_uint32 *q32;\n#endif\n    pcre_uint8 *bptr;\n    int *use_offsets = offsets;\n    int use_size_offsets = size_offsets;\n    int callout_data = 0;\n    int callout_data_set = 0;\n    int count;\n    pcre_uint32 c;\n    int copystrings = 0;\n    int find_match_limit = default_find_match_limit;\n    int getstrings = 0;\n    int getlist = 0;\n    int gmatched = 0;\n    int start_offset = 0;\n    int start_offset_sign = 1;\n    int g_notempty = 0;\n    int use_dfa = 0;\n\n    *copynames = 0;\n    *getnames = 0;\n\n#ifdef SUPPORT_PCRE32\n    cn32ptr = copynames;\n    gn32ptr = getnames;\n#endif\n#ifdef SUPPORT_PCRE16\n    cn16ptr = copynames16;\n    gn16ptr = getnames16;\n#endif\n#ifdef SUPPORT_PCRE8\n    cn8ptr = copynames8;\n    gn8ptr = getnames8;\n#endif\n\n    SET_PCRE_CALLOUT(callout);\n    first_callout = 1;\n    last_callout_mark = NULL;\n    callout_extra = 0;\n    callout_count = 0;\n    callout_fail_count = 999999;\n    callout_fail_id = -1;\n    show_malloc = 0;\n    options = 0;\n\n    if (extra != NULL) extra->flags &=\n      ~(PCRE_EXTRA_MATCH_LIMIT|PCRE_EXTRA_MATCH_LIMIT_RECURSION);\n\n    len = 0;\n    for (;;)\n      {\n      if (extend_inputline(infile, buffer + len, \"data> \") == NULL)\n        {\n        if (len > 0)    /* Reached EOF without hitting a newline */\n          {\n          fprintf(outfile, \"\\n\");\n          break;\n          }\n        done = 1;\n        goto CONTINUE;\n        }\n      if (infile != stdin) fprintf(outfile, \"%s\", (char *)buffer);\n      len = (int)strlen((char *)buffer);\n      if (buffer[len-1] == '\\n') break;\n      }\n\n    while (len > 0 && isspace(buffer[len-1])) len--;\n    buffer[len] = 0;\n    if (len == 0) break;\n\n    p = buffer;\n    while (isspace(*p)) p++;\n\n#ifndef NOUTF\n    /* Check that the data is well-formed UTF-8 if we're in UTF mode. To create\n    invalid input to pcre_exec, you must use \\x?? or \\x{} sequences. */\n\n    if (use_utf)\n      {\n      pcre_uint8 *q;\n      pcre_uint32 cc;\n      int n = 1;\n\n      for (q = p; n > 0 && *q; q += n) n = utf82ord(q, &cc);\n      if (n <= 0)\n        {\n        fprintf(outfile, \"**Failed: invalid UTF-8 string cannot be used as input in UTF mode\\n\");\n        goto NEXT_DATA;\n        }\n      }\n#endif\n\n#ifdef SUPPORT_VALGRIND\n    /* Mark the dbuffer as addressable but undefined again. */\n\n    if (dbuffer != NULL)\n      {\n      VALGRIND_MAKE_MEM_UNDEFINED(dbuffer, dbuffer_size * CHAR_SIZE);\n      }\n#endif\n\n    /* Allocate a buffer to hold the data line; len+1 is an upper bound on\n    the number of pcre_uchar units that will be needed. */\n\n    while (dbuffer == NULL || (size_t)len >= dbuffer_size)\n      {\n      dbuffer_size *= 2;\n      dbuffer = (pcre_uint8 *)realloc(dbuffer, dbuffer_size * CHAR_SIZE);\n      if (dbuffer == NULL)\n        {\n        fprintf(stderr, \"pcretest: realloc(%d) failed\\n\", (int)dbuffer_size);\n        exit(1);\n        }\n      }\n\n#ifdef SUPPORT_PCRE8\n    q8 = (pcre_uint8 *) dbuffer;\n#endif\n#ifdef SUPPORT_PCRE16\n    q16 = (pcre_uint16 *) dbuffer;\n#endif\n#ifdef SUPPORT_PCRE32\n    q32 = (pcre_uint32 *) dbuffer;\n#endif\n\n    while ((c = *p++) != 0)\n      {\n      int i = 0;\n      int n = 0;\n\n      /* In UTF mode, input can be UTF-8, so just copy all non-backslash bytes.\n      In non-UTF mode, allow the value of the byte to fall through to later,\n      where values greater than 127 are turned into UTF-8 when running in\n      16-bit or 32-bit mode. */\n\n      if (c != '\\\\')\n        {\n#ifndef NOUTF\n        if (use_utf && HASUTF8EXTRALEN(c)) { GETUTF8INC(c, p); }\n#endif\n        }\n\n      /* Handle backslash escapes */\n\n      else switch ((c = *p++))\n        {\n        case 'a': c =  CHAR_BEL; break;\n        case 'b': c = '\\b'; break;\n        case 'e': c =  CHAR_ESC; break;\n        case 'f': c = '\\f'; break;\n        case 'n': c = '\\n'; break;\n        case 'r': c = '\\r'; break;\n        case 't': c = '\\t'; break;\n        case 'v': c = '\\v'; break;\n\n        case '0': case '1': case '2': case '3':\n        case '4': case '5': case '6': case '7':\n        c -= '0';\n        while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')\n          c = c * 8 + *p++ - '0';\n        break;\n\n        case 'o':\n        if (*p == '{')\n          {\n          pcre_uint8 *pt = p;\n          c = 0;\n          for (pt++; isdigit(*pt) && *pt != '8' && *pt != '9'; pt++)\n            {\n            if (++i == 12)\n              fprintf(outfile, \"** Too many octal digits in \\\\o{...} item; \"\n                               \"using only the first twelve.\\n\");\n            else c = c * 8 + *pt - '0';\n            }\n          if (*pt == '}') p = pt + 1;\n            else fprintf(outfile, \"** Missing } after \\\\o{ (assumed)\\n\");\n          }\n        break;\n\n        case 'x':\n        if (*p == '{')\n          {\n          pcre_uint8 *pt = p;\n          c = 0;\n\n          /* We used to have \"while (isxdigit(*(++pt)))\" here, but it fails\n          when isxdigit() is a macro that refers to its argument more than\n          once. This is banned by the C Standard, but apparently happens in at\n          least one MacOS environment. */\n\n          for (pt++; isxdigit(*pt); pt++)\n            {\n            if (++i == 9)\n              fprintf(outfile, \"** Too many hex digits in \\\\x{...} item; \"\n                               \"using only the first eight.\\n\");\n            else c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'a' - 10);\n            }\n          if (*pt == '}')\n            {\n            p = pt + 1;\n            break;\n            }\n          /* Not correct form for \\x{...}; fall through */\n          }\n\n        /* \\x without {} always defines just one byte in 8-bit mode. This\n        allows UTF-8 characters to be constructed byte by byte, and also allows\n        invalid UTF-8 sequences to be made. Just copy the byte in UTF mode.\n        Otherwise, pass it down to later code so that it can be turned into\n        UTF-8 when running in 16/32-bit mode. */\n\n        c = 0;\n        while (i++ < 2 && isxdigit(*p))\n          {\n          c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'a' - 10);\n          p++;\n          }\n#if !defined NOUTF && defined SUPPORT_PCRE8\n        if (use_utf && (pcre_mode == PCRE8_MODE))\n          {\n          *q8++ = c;\n          continue;\n          }\n#endif\n        break;\n\n        case 0:   /* \\ followed by EOF allows for an empty line */\n        p--;\n        continue;\n\n        case '>':\n        if (*p == '-')\n          {\n          start_offset_sign = -1;\n          p++;\n          }\n        while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0';\n        start_offset *= start_offset_sign;\n        continue;\n\n        case 'A':  /* Option setting */\n        options |= PCRE_ANCHORED;\n        continue;\n\n        case 'B':\n        options |= PCRE_NOTBOL;\n        continue;\n\n        case 'C':\n        if (isdigit(*p))    /* Set copy string */\n          {\n          while(isdigit(*p)) n = n * 10 + *p++ - '0';\n          copystrings |= 1 << n;\n          }\n        else if (isalnum(*p))\n          {\n          READ_CAPTURE_NAME(p, &cn8ptr, &cn16ptr, &cn32ptr, re);\n          }\n        else if (*p == '+')\n          {\n          callout_extra = 1;\n          p++;\n          }\n        else if (*p == '-')\n          {\n          SET_PCRE_CALLOUT(NULL);\n          p++;\n          }\n        else if (*p == '!')\n          {\n          callout_fail_id = 0;\n          p++;\n          while(isdigit(*p))\n            callout_fail_id = callout_fail_id * 10 + *p++ - '0';\n          callout_fail_count = 0;\n          if (*p == '!')\n            {\n            p++;\n            while(isdigit(*p))\n              callout_fail_count = callout_fail_count * 10 + *p++ - '0';\n            }\n          }\n        else if (*p == '*')\n          {\n          int sign = 1;\n          callout_data = 0;\n          if (*(++p) == '-') { sign = -1; p++; }\n          while(isdigit(*p))\n            callout_data = callout_data * 10 + *p++ - '0';\n          callout_data *= sign;\n          callout_data_set = 1;\n          }\n        continue;\n\n#if !defined NODFA\n        case 'D':\n#if !defined NOPOSIX\n        if (posix || do_posix)\n          printf(\"** Can't use dfa matching in POSIX mode: \\\\D ignored\\n\");\n        else\n#endif\n          use_dfa = 1;\n        continue;\n#endif\n\n#if !defined NODFA\n        case 'F':\n        options |= PCRE_DFA_SHORTEST;\n        continue;\n#endif\n\n        case 'G':\n        if (isdigit(*p))\n          {\n          while(isdigit(*p)) n = n * 10 + *p++ - '0';\n          getstrings |= 1 << n;\n          }\n        else if (isalnum(*p))\n          {\n          READ_CAPTURE_NAME(p, &gn8ptr, &gn16ptr, &gn32ptr, re);\n          }\n        continue;\n\n        case 'J':\n        while(isdigit(*p)) n = n * 10 + *p++ - '0';\n        if (extra != NULL\n            && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0\n            && extra->executable_jit != NULL)\n          {\n          if (jit_stack != NULL) { PCRE_JIT_STACK_FREE(jit_stack); }\n          jit_stack = PCRE_JIT_STACK_ALLOC(1, n * 1024);\n          PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack);\n          }\n        continue;\n\n        case 'L':\n        getlist = 1;\n        continue;\n\n        case 'M':\n        find_match_limit = 1;\n        continue;\n\n        case 'N':\n        if ((options & PCRE_NOTEMPTY) != 0)\n          options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART;\n        else\n          options |= PCRE_NOTEMPTY;\n        continue;\n\n        case 'O':\n        while(isdigit(*p))\n          {\n          if (n > (INT_MAX-10)/10)   /* Hack to stop fuzzers */\n            {\n            printf(\"** \\\\O argument is too big\\n\");\n            yield = 1;\n            goto EXIT;\n            }\n          n = n * 10 + *p++ - '0';\n          }\n        if (n > size_offsets_max)\n          {\n          size_offsets_max = n;\n          free(offsets);\n          use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int));\n          if (offsets == NULL)\n            {\n            printf(\"** Failed to get %d bytes of memory for offsets vector\\n\",\n              (int)(size_offsets_max * sizeof(int)));\n            yield = 1;\n            goto EXIT;\n            }\n          }\n        use_size_offsets = n;\n        if (n == 0) use_offsets = NULL;   /* Ensures it can't write to it */\n          else use_offsets = offsets + size_offsets_max - n;  /* To catch overruns */\n        continue;\n\n        case 'P':\n        options |= ((options & PCRE_PARTIAL_SOFT) == 0)?\n          PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD;\n        continue;\n\n        case 'Q':\n        while(isdigit(*p)) n = n * 10 + *p++ - '0';\n        if (extra == NULL)\n          {\n          extra = (pcre_extra *)malloc(sizeof(pcre_extra));\n          extra->flags = 0;\n          }\n        extra->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION;\n        extra->match_limit_recursion = n;\n        continue;\n\n        case 'q':\n        while(isdigit(*p)) n = n * 10 + *p++ - '0';\n        if (extra == NULL)\n          {\n          extra = (pcre_extra *)malloc(sizeof(pcre_extra));\n          extra->flags = 0;\n          }\n        extra->flags |= PCRE_EXTRA_MATCH_LIMIT;\n        extra->match_limit = n;\n        continue;\n\n#if !defined NODFA\n        case 'R':\n        options |= PCRE_DFA_RESTART;\n        continue;\n#endif\n\n        case 'S':\n        show_malloc = 1;\n        continue;\n\n        case 'Y':\n        options |= PCRE_NO_START_OPTIMIZE;\n        continue;\n\n        case 'Z':\n        options |= PCRE_NOTEOL;\n        continue;\n\n        case '?':\n        options |= PCRE_NO_UTF8_CHECK;\n        continue;\n\n        case '<':\n          {\n          int x = check_mc_option(p, outfile, TRUE, \"escape sequence\");\n          if (x == 0) goto NEXT_DATA;\n          options |= x;\n          while (*p++ != '>');\n          }\n        continue;\n        }\n\n      /* We now have a character value in c that may be greater than 255.\n      In 8-bit mode we convert to UTF-8 if we are in UTF mode. Values greater\n      than 127 in UTF mode must have come from \\x{...} or octal constructs\n      because values from \\x.. get this far only in non-UTF mode. */\n\n#ifdef SUPPORT_PCRE8\n      if (pcre_mode == PCRE8_MODE)\n        {\n#ifndef NOUTF\n        if (use_utf)\n          {\n          if (c > 0x7fffffff)\n            {\n            fprintf(outfile, \"** Character \\\\x{%x} is greater than 0x7fffffff \"\n              \"and so cannot be converted to UTF-8\\n\", c);\n            goto NEXT_DATA;\n            }\n          q8 += ord2utf8(c, q8);\n          }\n        else\n#endif\n          {\n          if (c > 0xffu)\n            {\n            fprintf(outfile, \"** Character \\\\x{%x} is greater than 255 \"\n              \"and UTF-8 mode is not enabled.\\n\", c);\n            fprintf(outfile, \"** Truncation will probably give the wrong \"\n              \"result.\\n\");\n            }\n          *q8++ = c;\n          }\n        }\n#endif\n#ifdef SUPPORT_PCRE16\n      if (pcre_mode == PCRE16_MODE)\n        {\n#ifndef NOUTF\n        if (use_utf)\n          {\n          if (c > 0x10ffffu)\n            {\n            fprintf(outfile, \"** Failed: character \\\\x{%x} is greater than \"\n              \"0x10ffff and so cannot be converted to UTF-16\\n\", c);\n            goto NEXT_DATA;\n            }\n          else if (c >= 0x10000u)\n            {\n            c-= 0x10000u;\n            *q16++ = 0xD800 | (c >> 10);\n            *q16++ = 0xDC00 | (c & 0x3ff);\n            }\n          else\n            *q16++ = c;\n          }\n        else\n#endif\n          {\n          if (c > 0xffffu)\n            {\n            fprintf(outfile, \"** Character \\\\x{%x} is greater than 0xffff \"\n              \"and UTF-16 mode is not enabled.\\n\", c);\n            fprintf(outfile, \"** Truncation will probably give the wrong \"\n              \"result.\\n\");\n            }\n\n          *q16++ = c;\n          }\n        }\n#endif\n#ifdef SUPPORT_PCRE32\n      if (pcre_mode == PCRE32_MODE)\n        {\n        *q32++ = c;\n        }\n#endif\n\n      }\n\n    /* Reached end of subject string */\n\n#ifdef SUPPORT_PCRE8\n    if (pcre_mode == PCRE8_MODE)\n    {\n      *q8 = 0;\n      len = (int)(q8 - (pcre_uint8 *)dbuffer);\n    }\n#endif\n#ifdef SUPPORT_PCRE16\n    if (pcre_mode == PCRE16_MODE)\n    {\n      *q16 = 0;\n      len = (int)(q16 - (pcre_uint16 *)dbuffer);\n    }\n#endif\n#ifdef SUPPORT_PCRE32\n    if (pcre_mode == PCRE32_MODE)\n    {\n      *q32 = 0;\n      len = (int)(q32 - (pcre_uint32 *)dbuffer);\n    }\n#endif\n\n    /* If we're compiling with explicit valgrind support, Mark the data from after\n    its end to the end of the buffer as unaddressable, so that a read over the end\n    of the buffer will be seen by valgrind, even if it doesn't cause a crash.\n    If we're not building with valgrind support, at least move the data to the end\n    of the buffer so that it might at least cause a crash.\n    If we are using the POSIX interface, we must include the terminating zero. */\n\n    bptr = dbuffer;\n\n#if !defined NOPOSIX\n    if (posix || do_posix)\n      {\n#ifdef SUPPORT_VALGRIND\n      VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len + 1, dbuffer_size - (len + 1));\n#else\n      memmove(bptr + dbuffer_size - len - 1, bptr, len + 1);\n      bptr += dbuffer_size - len - 1;\n#endif\n      }\n    else\n#endif\n      {\n#ifdef SUPPORT_VALGRIND\n      VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len * CHAR_SIZE, (dbuffer_size - len) * CHAR_SIZE);\n#else\n      bptr = memmove(bptr + (dbuffer_size - len) * CHAR_SIZE, bptr, len * CHAR_SIZE);\n#endif\n      }\n\n    if ((all_use_dfa || use_dfa) && find_match_limit)\n      {\n      printf(\"** Match limit not relevant for DFA matching: ignored\\n\");\n      find_match_limit = 0;\n      }\n\n    /* Handle matching via the POSIX interface, which does not\n    support timing or playing with the match limit or callout data. */\n\n#if !defined NOPOSIX\n    if (posix || do_posix)\n      {\n      int rc;\n      int eflags = 0;\n      regmatch_t *pmatch = NULL;\n      if (use_size_offsets > 0)\n        pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);\n      if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;\n      if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;\n      if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY;\n\n      rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);\n\n      if (rc != 0)\n        {\n        (void)regerror(rc, &preg, (char *)buffer, buffer_size);\n        fprintf(outfile, \"No match: POSIX code %d: %s\\n\", rc, buffer);\n        }\n      else if ((REAL_PCRE_OPTIONS(preg.re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0)\n        {\n        fprintf(outfile, \"Matched with REG_NOSUB\\n\");\n        }\n      else\n        {\n        size_t i;\n        for (i = 0; i < (size_t)use_size_offsets; i++)\n          {\n          if (pmatch[i].rm_so >= 0)\n            {\n            fprintf(outfile, \"%2d: \", (int)i);\n            PCHARSV(dbuffer, pmatch[i].rm_so,\n              pmatch[i].rm_eo - pmatch[i].rm_so, outfile);\n            fprintf(outfile, \"\\n\");\n            if (do_showcaprest || (i == 0 && do_showrest))\n              {\n              fprintf(outfile, \"%2d+ \", (int)i);\n              PCHARSV(dbuffer, pmatch[i].rm_eo, len - pmatch[i].rm_eo,\n                outfile);\n              fprintf(outfile, \"\\n\");\n              }\n            }\n          }\n        }\n      free(pmatch);\n      goto NEXT_DATA;\n      }\n\n#endif  /* !defined NOPOSIX */\n\n    /* Handle matching via the native interface - repeats for /g and /G */\n\n    /* Ensure that there is a JIT callback if we want to verify that JIT was\n    actually used. If jit_stack == NULL, no stack has yet been assigned. */\n\n    if (verify_jit && jit_stack == NULL && extra != NULL)\n       { PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); }\n\n    for (;; gmatched++)    /* Loop for /g or /G */\n      {\n      markptr = NULL;\n      jit_was_used = FALSE;\n\n      if (timeitm > 0)\n        {\n        register int i;\n        clock_t time_taken;\n        clock_t start_time = clock();\n\n#if !defined NODFA\n        if (all_use_dfa || use_dfa)\n          {\n          if ((options & PCRE_DFA_RESTART) != 0)\n            {\n            fprintf(outfile, \"Timing DFA restarts is not supported\\n\");\n            break;\n            }\n          if (dfa_workspace == NULL)\n            dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));\n          for (i = 0; i < timeitm; i++)\n            {\n            PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset,\n              (options | g_notempty), use_offsets, use_size_offsets,\n              dfa_workspace, DFA_WS_DIMENSION);\n            }\n          }\n        else\n#endif\n\n        for (i = 0; i < timeitm; i++)\n          {\n          PCRE_EXEC(count, re, extra, bptr, len, start_offset,\n            (options | g_notempty), use_offsets, use_size_offsets);\n          }\n        total_match_time += (time_taken = clock() - start_time);\n        fprintf(outfile, \"Execute time %.4f milliseconds\\n\",\n          (((double)time_taken * 1000.0) / (double)timeitm) /\n            (double)CLOCKS_PER_SEC);\n        }\n\n      /* If find_match_limit is set, we want to do repeated matches with\n      varying limits in order to find the minimum value for the match limit and\n      for the recursion limit. The match limits are relevant only to the normal\n      running of pcre_exec(), so disable the JIT optimization. This makes it\n      possible to run the same set of tests with and without JIT externally\n      requested. */\n\n      if (find_match_limit)\n        {\n        if (extra != NULL) { PCRE_FREE_STUDY(extra); }\n        extra = (pcre_extra *)malloc(sizeof(pcre_extra));\n        extra->flags = 0;\n\n        (void)check_match_limit(re, extra, bptr, len, start_offset,\n          options|g_notempty, use_offsets, use_size_offsets,\n          PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit),\n          PCRE_ERROR_MATCHLIMIT, \"match()\");\n\n        count = check_match_limit(re, extra, bptr, len, start_offset,\n          options|g_notempty, use_offsets, use_size_offsets,\n          PCRE_EXTRA_MATCH_LIMIT_RECURSION, &(extra->match_limit_recursion),\n          PCRE_ERROR_RECURSIONLIMIT, \"match() recursion\");\n        }\n\n      /* If callout_data is set, use the interface with additional data */\n\n      else if (callout_data_set)\n        {\n        if (extra == NULL)\n          {\n          extra = (pcre_extra *)malloc(sizeof(pcre_extra));\n          extra->flags = 0;\n          }\n        extra->flags |= PCRE_EXTRA_CALLOUT_DATA;\n        extra->callout_data = &callout_data;\n        PCRE_EXEC(count, re, extra, bptr, len, start_offset,\n          options | g_notempty, use_offsets, use_size_offsets);\n        extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA;\n        }\n\n      /* The normal case is just to do the match once, with the default\n      value of match_limit. */\n\n#if !defined NODFA\n      else if (all_use_dfa || use_dfa)\n        {\n        if (dfa_workspace == NULL)\n          dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int));\n        if (dfa_matched++ == 0)\n          dfa_workspace[0] = -1;  /* To catch bad restart */\n        PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset,\n          (options | g_notempty), use_offsets, use_size_offsets, dfa_workspace,\n          DFA_WS_DIMENSION);\n        if (count == 0)\n          {\n          fprintf(outfile, \"Matched, but offsets vector is too small to show all matches\\n\");\n          count = use_size_offsets/2;\n          }\n        }\n#endif\n\n      else\n        {\n        PCRE_EXEC(count, re, extra, bptr, len, start_offset,\n          options | g_notempty, use_offsets, use_size_offsets);\n        if (count == 0)\n          {\n          fprintf(outfile, \"Matched, but too many substrings\\n\");\n          /* 2 is a special case; match can be returned */\n          count = (use_size_offsets == 2)? 1 : use_size_offsets/3;\n          }\n        }\n\n      /* Matched */\n\n      if (count >= 0)\n        {\n        int i, maxcount;\n        void *cnptr, *gnptr;\n\n#if !defined NODFA\n        if (all_use_dfa || use_dfa) maxcount = use_size_offsets/2; else\n#endif\n          /* 2 is a special case; match can be returned */\n          maxcount = (use_size_offsets == 2)? 1 : use_size_offsets/3;\n\n        /* This is a check against a lunatic return value. */\n\n        if (count > maxcount)\n          {\n          fprintf(outfile,\n            \"** PCRE error: returned count %d is too big for offset size %d\\n\",\n            count, use_size_offsets);\n          count = use_size_offsets/3;\n          if (do_g || do_G)\n            {\n            fprintf(outfile, \"** /%c loop abandoned\\n\", do_g? 'g' : 'G');\n            do_g = do_G = FALSE;        /* Break g/G loop */\n            }\n          }\n\n        /* do_allcaps requests showing of all captures in the pattern, to check\n        unset ones at the end. */\n\n        if (do_allcaps)\n          {\n          if (all_use_dfa || use_dfa)\n            {\n            fprintf(outfile, \"** Show all captures ignored after DFA matching\\n\");\n            }\n          else\n           {\n            if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0)\n              goto SKIP_DATA;\n            count++;   /* Allow for full match */\n            if (count * 2 > use_size_offsets) count = use_size_offsets/2;\n            }\n          }\n\n        /* Output the captured substrings. Note that, for the matched string,\n        the use of \\K in an assertion can make the start later than the end. */\n\n        for (i = 0; i < count * 2; i += 2)\n          {\n          if (use_offsets[i] < 0)\n            {\n            if (use_offsets[i] != -1)\n              fprintf(outfile, \"ERROR: bad negative value %d for offset %d\\n\",\n                use_offsets[i], i);\n            if (use_offsets[i+1] != -1)\n              fprintf(outfile, \"ERROR: bad negative value %d for offset %d\\n\",\n                use_offsets[i+1], i+1);\n            fprintf(outfile, \"%2d: <unset>\\n\", i/2);\n            }\n          else\n            {\n            int start = use_offsets[i];\n            int end = use_offsets[i+1];\n\n            if (start > end)\n              {\n              start = use_offsets[i+1];\n              end = use_offsets[i];\n              fprintf(outfile, \"Start of matched string is beyond its end - \"\n                \"displaying from end to start.\\n\");\n              }\n\n            fprintf(outfile, \"%2d: \", i/2);\n            PCHARSV(bptr, start, end - start, outfile);\n            if (verify_jit && jit_was_used) fprintf(outfile, \" (JIT)\");\n            fprintf(outfile, \"\\n\");\n\n            /* Note: don't use the start/end variables here because we want to\n            show the text from what is reported as the end. */\n\n            if (do_showcaprest || (i == 0 && do_showrest))\n              {\n              fprintf(outfile, \"%2d+ \", i/2);\n              PCHARSV(bptr, use_offsets[i+1], len - use_offsets[i+1],\n                outfile);\n              fprintf(outfile, \"\\n\");\n              }\n            }\n          }\n\n        if (markptr != NULL)\n          {\n          fprintf(outfile, \"MK: \");\n          PCHARSV(markptr, 0, -1, outfile);\n          fprintf(outfile, \"\\n\");\n          }\n\n        for (i = 0; i < 32; i++)\n          {\n          if ((copystrings & (1 << i)) != 0)\n            {\n            int rc;\n            char copybuffer[256];\n            PCRE_COPY_SUBSTRING(rc, bptr, use_offsets, count, i,\n              copybuffer, sizeof(copybuffer));\n            if (rc < 0)\n              fprintf(outfile, \"copy substring %d failed %d\\n\", i, rc);\n            else\n              {\n              fprintf(outfile, \"%2dC \", i);\n              PCHARSV(copybuffer, 0, rc, outfile);\n              fprintf(outfile, \" (%d)\\n\", rc);\n              }\n            }\n          }\n\n        cnptr = copynames;\n        for (;;)\n          {\n          int rc;\n          char copybuffer[256];\n\n#ifdef SUPPORT_PCRE32\n          if (pcre_mode == PCRE32_MODE)\n            {\n            if (*(pcre_uint32 *)cnptr == 0) break;\n            }\n#endif\n#ifdef SUPPORT_PCRE16\n          if (pcre_mode == PCRE16_MODE)\n            {\n            if (*(pcre_uint16 *)cnptr == 0) break;\n            }\n#endif\n#ifdef SUPPORT_PCRE8\n          if (pcre_mode == PCRE8_MODE)\n            {\n            if (*(pcre_uint8 *)cnptr == 0) break;\n            }\n#endif\n\n          PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count,\n            cnptr, copybuffer, sizeof(copybuffer));\n\n          if (rc < 0)\n            {\n            fprintf(outfile, \"copy substring \");\n            PCHARSV(cnptr, 0, -1, outfile);\n            fprintf(outfile, \" failed %d\\n\", rc);\n            }\n          else\n            {\n            fprintf(outfile, \"  C \");\n            PCHARSV(copybuffer, 0, rc, outfile);\n            fprintf(outfile, \" (%d) \", rc);\n            PCHARSV(cnptr, 0, -1, outfile);\n            putc('\\n', outfile);\n            }\n\n          cnptr = (char *)cnptr + (STRLEN(cnptr) + 1) * CHAR_SIZE;\n          }\n\n        for (i = 0; i < 32; i++)\n          {\n          if ((getstrings & (1 << i)) != 0)\n            {\n            int rc;\n            const char *substring;\n            PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, &substring);\n            if (rc < 0)\n              fprintf(outfile, \"get substring %d failed %d\\n\", i, rc);\n            else\n              {\n              fprintf(outfile, \"%2dG \", i);\n              PCHARSV(substring, 0, rc, outfile);\n              fprintf(outfile, \" (%d)\\n\", rc);\n              PCRE_FREE_SUBSTRING(substring);\n              }\n            }\n          }\n\n        gnptr = getnames;\n        for (;;)\n          {\n          int rc;\n          const char *substring;\n\n#ifdef SUPPORT_PCRE32\n          if (pcre_mode == PCRE32_MODE)\n            {\n            if (*(pcre_uint32 *)gnptr == 0) break;\n            }\n#endif\n#ifdef SUPPORT_PCRE16\n          if (pcre_mode == PCRE16_MODE)\n            {\n            if (*(pcre_uint16 *)gnptr == 0) break;\n            }\n#endif\n#ifdef SUPPORT_PCRE8\n          if (pcre_mode == PCRE8_MODE)\n            {\n            if (*(pcre_uint8 *)gnptr == 0) break;\n            }\n#endif\n\n          PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count,\n            gnptr, &substring);\n          if (rc < 0)\n            {\n            fprintf(outfile, \"get substring \");\n            PCHARSV(gnptr, 0, -1, outfile);\n            fprintf(outfile, \" failed %d\\n\", rc);\n            }\n          else\n            {\n            fprintf(outfile, \"  G \");\n            PCHARSV(substring, 0, rc, outfile);\n            fprintf(outfile, \" (%d) \", rc);\n            PCHARSV(gnptr, 0, -1, outfile);\n            PCRE_FREE_SUBSTRING(substring);\n            putc('\\n', outfile);\n            }\n\n          gnptr = (char *)gnptr + (STRLEN(gnptr) + 1) * CHAR_SIZE;\n          }\n\n        if (getlist)\n          {\n          int rc;\n          const char **stringlist;\n          PCRE_GET_SUBSTRING_LIST(rc, bptr, use_offsets, count, &stringlist);\n          if (rc < 0)\n            fprintf(outfile, \"get substring list failed %d\\n\", rc);\n          else\n            {\n            for (i = 0; i < count; i++)\n              {\n              fprintf(outfile, \"%2dL \", i);\n              PCHARSV(stringlist[i], 0, -1, outfile);\n              putc('\\n', outfile);\n              }\n            if (stringlist[i] != NULL)\n              fprintf(outfile, \"string list not terminated by NULL\\n\");\n            PCRE_FREE_SUBSTRING_LIST(stringlist);\n            }\n          }\n        }\n\n      /* There was a partial match. If the bumpalong point is not the same as\n      the first inspected character, show the offset explicitly. */\n\n      else if (count == PCRE_ERROR_PARTIAL)\n        {\n        fprintf(outfile, \"Partial match\");\n        if (use_size_offsets > 2 && use_offsets[0] != use_offsets[2])\n          fprintf(outfile, \" at offset %d\", use_offsets[2]);\n        if (markptr != NULL)\n          {\n          fprintf(outfile, \", mark=\");\n          PCHARSV(markptr, 0, -1, outfile);\n          }\n        if (use_size_offsets > 1)\n          {\n          fprintf(outfile, \": \");\n          PCHARSV(bptr, use_offsets[0], use_offsets[1] - use_offsets[0],\n            outfile);\n          }\n        if (verify_jit && jit_was_used) fprintf(outfile, \" (JIT)\");\n        fprintf(outfile, \"\\n\");\n        break;  /* Out of the /g loop */\n        }\n\n      /* Failed to match. If this is a /g or /G loop and we previously set\n      g_notempty after a null match, this is not necessarily the end. We want\n      to advance the start offset, and continue. We won't be at the end of the\n      string - that was checked before setting g_notempty.\n\n      Complication arises in the case when the newline convention is \"any\",\n      \"crlf\", or \"anycrlf\". If the previous match was at the end of a line\n      terminated by CRLF, an advance of one character just passes the \\r,\n      whereas we should prefer the longer newline sequence, as does the code in\n      pcre_exec(). Fudge the offset value to achieve this. We check for a\n      newline setting in the pattern; if none was set, use PCRE_CONFIG() to\n      find the default.\n\n      Otherwise, in the case of UTF-8 matching, the advance must be one\n      character, not one byte. */\n\n      else\n        {\n        if (g_notempty != 0)\n          {\n          int onechar = 1;\n          unsigned int obits = REAL_PCRE_OPTIONS(re);\n          use_offsets[0] = start_offset;\n          if ((obits & PCRE_NEWLINE_BITS) == 0)\n            {\n            int d;\n            (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &d);\n            /* Note that these values are always the ASCII ones, even in\n            EBCDIC environments. CR = 13, NL = 10. */\n            obits = (d == 13)? PCRE_NEWLINE_CR :\n                    (d == 10)? PCRE_NEWLINE_LF :\n                    (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :\n                    (d == -2)? PCRE_NEWLINE_ANYCRLF :\n                    (d == -1)? PCRE_NEWLINE_ANY : 0;\n            }\n          if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY ||\n               (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_CRLF ||\n               (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF)\n              &&\n              start_offset < len - 1 && (\n#ifdef SUPPORT_PCRE8\n              (pcre_mode == PCRE8_MODE &&\n               bptr[start_offset] == '\\r' &&\n               bptr[start_offset + 1] == '\\n') ||\n#endif\n#ifdef SUPPORT_PCRE16\n              (pcre_mode == PCRE16_MODE &&\n               ((PCRE_SPTR16)bptr)[start_offset] == '\\r' &&\n               ((PCRE_SPTR16)bptr)[start_offset + 1] == '\\n') ||\n#endif\n#ifdef SUPPORT_PCRE32\n              (pcre_mode == PCRE32_MODE &&\n               ((PCRE_SPTR32)bptr)[start_offset] == '\\r' &&\n               ((PCRE_SPTR32)bptr)[start_offset + 1] == '\\n') ||\n#endif\n              0))\n            onechar++;\n          else if (use_utf)\n            {\n            while (start_offset + onechar < len)\n              {\n              if ((bptr[start_offset+onechar] & 0xc0) != 0x80) break;\n              onechar++;\n              }\n            }\n          use_offsets[1] = start_offset + onechar;\n          }\n        else\n          {\n          switch(count)\n            {\n            case PCRE_ERROR_NOMATCH:\n            if (gmatched == 0)\n              {\n              if (markptr == NULL)\n                {\n                fprintf(outfile, \"No match\");\n                }\n              else\n                {\n                fprintf(outfile, \"No match, mark = \");\n                PCHARSV(markptr, 0, -1, outfile);\n                }\n              if (verify_jit && jit_was_used) fprintf(outfile, \" (JIT)\");\n              putc('\\n', outfile);\n              }\n            break;\n\n            case PCRE_ERROR_BADUTF8:\n            case PCRE_ERROR_SHORTUTF8:\n            fprintf(outfile, \"Error %d (%s UTF-%d string)\", count,\n              (count == PCRE_ERROR_BADUTF8)? \"bad\" : \"short\",\n              8 * CHAR_SIZE);\n            if (use_size_offsets >= 2)\n              fprintf(outfile, \" offset=%d reason=%d\", use_offsets[0],\n                use_offsets[1]);\n            fprintf(outfile, \"\\n\");\n            break;\n\n            case PCRE_ERROR_BADUTF8_OFFSET:\n            fprintf(outfile, \"Error %d (bad UTF-%d offset)\\n\", count,\n              8 * CHAR_SIZE);\n            break;\n\n            default:\n            if (count < 0 &&\n                (-count) < (int)(sizeof(errtexts)/sizeof(const char *)))\n              fprintf(outfile, \"Error %d (%s)\\n\", count, errtexts[-count]);\n            else\n              fprintf(outfile, \"Error %d (Unexpected value)\\n\", count);\n            break;\n            }\n\n          break;  /* Out of the /g loop */\n          }\n        }\n\n      /* If not /g or /G we are done */\n\n      if (!do_g && !do_G) break;\n\n      if (use_offsets == NULL)\n        {\n        fprintf(outfile, \"Cannot do global matching without an ovector\\n\");\n        break;\n        }\n\n      if (use_size_offsets < 2)\n        {\n        fprintf(outfile, \"Cannot do global matching with an ovector size < 2\\n\");\n        break;\n        }\n\n      /* If we have matched an empty string, first check to see if we are at\n      the end of the subject. If so, the /g loop is over. Otherwise, mimic what\n      Perl's /g options does. This turns out to be rather cunning. First we set\n      PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the\n      same point. If this fails (picked up above) we advance to the next\n      character. */\n\n      g_notempty = 0;\n\n      if (use_offsets[0] == use_offsets[1])\n        {\n        if (use_offsets[0] == len) break;\n        g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;\n        }\n\n      /* For /g, update the start offset, leaving the rest alone. There is a\n      tricky case when \\K is used in a positive lookbehind assertion. This can\n      cause the end of the match to be less than or equal to the start offset.\n      In this case we restart at one past the start offset. This may return the\n      same match if the original start offset was bumped along during the\n      match, but eventually the new start offset will hit the actual start\n      offset. (In PCRE2 the true start offset is available, and this can be\n      done better. It is not worth doing more than making sure we do not loop\n      at this stage in the life of PCRE1.) */\n\n      if (do_g)\n        {\n        if (g_notempty == 0 && use_offsets[1] <= start_offset)\n          {\n          if (start_offset >= len) break;  /* End of subject */\n          start_offset++;\n          if (use_utf)\n            {\n            while (start_offset < len)\n              {\n              if ((bptr[start_offset] & 0xc0) != 0x80) break;\n              start_offset++;\n              }\n            }\n          }\n        else start_offset = use_offsets[1];\n        }\n\n      /* For /G, update the pointer and length */\n\n      else\n        {\n        bptr += use_offsets[1] * CHAR_SIZE;\n        len -= use_offsets[1];\n        }\n      }  /* End of loop for /g and /G */\n\n    NEXT_DATA: continue;\n    }    /* End of loop for data lines */\n\n  CONTINUE:\n\n#if !defined NOPOSIX\n  if ((posix || do_posix) && preg.re_pcre != 0) regfree(&preg);\n#endif\n\n  if (re != NULL) new_free(re);\n  if (extra != NULL)\n    {\n    PCRE_FREE_STUDY(extra);\n    }\n  if (locale_set)\n    {\n    new_free((void *)tables);\n    setlocale(LC_CTYPE, \"C\");\n    locale_set = 0;\n    }\n  if (jit_stack != NULL)\n    {\n    PCRE_JIT_STACK_FREE(jit_stack);\n    jit_stack = NULL;\n    }\n  }\n\nif (infile == stdin) fprintf(outfile, \"\\n\");\n\nif (showtotaltimes)\n  {\n  fprintf(outfile, \"--------------------------------------\\n\");\n  if (timeit > 0)\n    {\n    fprintf(outfile, \"Total compile time %.4f milliseconds\\n\",\n      (((double)total_compile_time * 1000.0) / (double)timeit) /\n        (double)CLOCKS_PER_SEC);\n    fprintf(outfile, \"Total study time   %.4f milliseconds\\n\",\n      (((double)total_study_time * 1000.0) / (double)timeit) /\n        (double)CLOCKS_PER_SEC);\n    }\n  fprintf(outfile, \"Total execute time %.4f milliseconds\\n\",\n    (((double)total_match_time * 1000.0) / (double)timeitm) /\n      (double)CLOCKS_PER_SEC);\n  }\n\nEXIT:\n\nif (infile != NULL && infile != stdin) fclose(infile);\nif (outfile != NULL && outfile != stdout) fclose(outfile);\n\nfree(buffer);\nfree(dbuffer);\nfree(pbuffer);\nfree(offsets);\n\n#ifdef SUPPORT_PCRE16\nif (buffer16 != NULL) free(buffer16);\n#endif\n#ifdef SUPPORT_PCRE32\nif (buffer32 != NULL) free(buffer32);\n#endif\n\n#if !defined NODFA\nif (dfa_workspace != NULL)\n  free(dfa_workspace);\n#endif\n\n#if defined(__VMS)\n  yield = SS$_NORMAL;  /* Return values via DCL symbols */\n#endif\n\nreturn yield;\n}\n\n/* End of pcretest.c */\n\n"
  },
  {
    "path": "src/pcre/perltest.pl",
    "content": "#! /usr/bin/env perl\n\n# Program for testing regular expressions with perl to check that PCRE handles\n# them the same. This version needs to have \"use utf8\" at the start for running\n# the UTF-8 tests, but *not* for the other tests. The only way I've found for\n# doing this is to cat this line in explicitly in the RunPerlTest script. I've\n# also used this method to supply \"require Encode\" for the UTF-8 tests, so that\n# the main test will still run where Encode is not installed.\n\n#use utf8;\n#require Encode;\n\n# Function for turning a string into a string of printing chars.\n\nsub pchars {\nmy($t) = \"\";\n\nif ($utf8)\n  {\n  @p = unpack('U*', $_[0]);\n  foreach $c (@p)\n    {\n    if ($c >= 32 && $c < 127) { $t .= chr $c; }\n      else { $t .= sprintf(\"\\\\x{%02x}\", $c);\n      }\n    }\n  }\nelse\n  {\n  foreach $c (split(//, $_[0]))\n    {\n    if (ord $c >= 32 && ord $c < 127) { $t .= $c; }\n      else { $t .= sprintf(\"\\\\x%02x\", ord $c); }\n    }\n  }\n\n$t;\n}\n\n\n# Read lines from named file or stdin and write to named file or stdout; lines\n# consist of a regular expression, in delimiters and optionally followed by\n# options, followed by a set of test data, terminated by an empty line.\n\n# Sort out the input and output files\n\nif (@ARGV > 0)\n  {\n  open(INFILE, \"<$ARGV[0]\") || die \"Failed to open $ARGV[0]\\n\";\n  $infile = \"INFILE\";\n  }\nelse { $infile = \"STDIN\"; }\n\nif (@ARGV > 1)\n  {\n  open(OUTFILE, \">$ARGV[1]\") || die \"Failed to open $ARGV[1]\\n\";\n  $outfile = \"OUTFILE\";\n  }\nelse { $outfile = \"STDOUT\"; }\n\nprintf($outfile \"Perl $] Regular Expressions\\n\\n\");\n\n# Main loop\n\nNEXT_RE:\nfor (;;)\n  {\n  printf \"  re> \" if $infile eq \"STDIN\";\n  last if ! ($_ = <$infile>);\n  printf $outfile \"$_\" if $infile ne \"STDIN\";\n  next if ($_ =~ /^\\s*$/ || $_ =~ /^< forbid/);\n\n  $pattern = $_;\n\n  while ($pattern !~ /^\\s*(.).*\\1/s)\n    {\n    printf \"    > \" if $infile eq \"STDIN\";\n    last if ! ($_ = <$infile>);\n    printf $outfile \"$_\" if $infile ne \"STDIN\";\n    $pattern .= $_;\n    }\n\n  chomp($pattern);\n  $pattern =~ s/\\s+$//;\n\n  # The private /+ modifier means \"print $' afterwards\".\n\n  $showrest = ($pattern =~ s/\\+(?=[a-zA-Z]*$)//);\n\n  # A doubled version is used by pcretest to print remainders after captures\n\n  $pattern =~ s/\\+(?=[a-zA-Z]*$)//;\n\n  # Remove /8 from a UTF-8 pattern.\n\n  $utf8 = $pattern =~ s/8(?=[a-zA-Z]*$)//;\n\n  # Remove /J from a pattern with duplicate names.\n\n  $pattern =~ s/J(?=[a-zA-Z]*$)//;\n\n  # Remove /K from a pattern (asks pcretest to check MARK data) */\n\n  $pattern =~ s/K(?=[a-zA-Z]*$)//;\n\n  # /W asks pcretest to set PCRE_UCP; change this to /u for Perl\n\n  $pattern =~ s/W(?=[a-zA-Z]*$)/u/;\n\n  # Remove /S or /SS from a pattern (asks pcretest to study or not to study)\n\n  $pattern =~ s/S(?=[a-zA-Z]*$)//g;\n\n  # Remove /Y and /O from a pattern (disable PCRE optimizations)\n\n  $pattern =~ s/[YO](?=[a-zA-Z]*$)//;\n\n  # Check that the pattern is valid\n\n  eval \"\\$_ =~ ${pattern}\";\n  if ($@)\n    {\n    printf $outfile \"Error: $@\";\n    if ($infile != \"STDIN\")\n      {\n      for (;;)\n        {\n        last if ! ($_ = <$infile>);\n        last if $_ =~ /^\\s*$/;\n        }\n      }\n    next NEXT_RE;\n    }\n\n  # If the /g modifier is present, we want to put a loop round the matching;\n  # otherwise just a single \"if\".\n\n  $cmd = ($pattern =~ /g[a-z]*$/)? \"while\" : \"if\";\n\n  # If the pattern is actually the null string, Perl uses the most recently\n  # executed (and successfully compiled) regex is used instead. This is a\n  # nasty trap for the unwary! The PCRE test suite does contain null strings\n  # in places - if they are allowed through here all sorts of weird and\n  # unexpected effects happen. To avoid this, we replace such patterns with\n  # a non-null pattern that has the same effect.\n\n  $pattern = \"/(?#)/$2\" if ($pattern =~ /^(.)\\1(.*)$/);\n\n  # Read data lines and test them\n\n  for (;;)\n    {\n    printf \"data> \" if $infile eq \"STDIN\";\n    last NEXT_RE if ! ($_ = <$infile>);\n    chomp;\n    printf $outfile \"$_\\n\" if $infile ne \"STDIN\";\n\n    s/\\s+$//;  # Remove trailing space\n    s/^\\s+//;  # Remove leading space\n    s/\\\\Y//g;  # Remove \\Y (pcretest flag to set PCRE_NO_START_OPTIMIZE)\n\n    last if ($_ eq \"\");\n    $x = eval \"\\\"$_\\\"\";   # To get escapes processed\n\n    # Empty array for holding results, ensure $REGERROR and $REGMARK are\n    # unset, then do the matching.\n\n    @subs = ();\n\n    $pushes = \"push \\@subs,\\$&;\" .\n         \"push \\@subs,\\$1;\" .\n         \"push \\@subs,\\$2;\" .\n         \"push \\@subs,\\$3;\" .\n         \"push \\@subs,\\$4;\" .\n         \"push \\@subs,\\$5;\" .\n         \"push \\@subs,\\$6;\" .\n         \"push \\@subs,\\$7;\" .\n         \"push \\@subs,\\$8;\" .\n         \"push \\@subs,\\$9;\" .\n         \"push \\@subs,\\$10;\" .\n         \"push \\@subs,\\$11;\" .\n         \"push \\@subs,\\$12;\" .\n         \"push \\@subs,\\$13;\" .\n         \"push \\@subs,\\$14;\" .\n         \"push \\@subs,\\$15;\" .\n         \"push \\@subs,\\$16;\" .\n         \"push \\@subs,\\$'; }\";\n\n    undef $REGERROR;\n    undef $REGMARK;\n\n    eval \"${cmd} (\\$x =~ ${pattern}) {\" . $pushes;\n\n    if ($@)\n      {\n      printf $outfile \"Error: $@\\n\";\n      next NEXT_RE;\n      }\n    elsif (scalar(@subs) == 0)\n      {\n      printf $outfile \"No match\";\n      if (defined $REGERROR && $REGERROR != 1)\n        { printf $outfile (\", mark = %s\", &pchars($REGERROR)); }\n      printf $outfile \"\\n\";\n      }\n    else\n      {\n      while (scalar(@subs) != 0)\n        {\n        printf $outfile (\" 0: %s\\n\", &pchars($subs[0]));\n        printf $outfile (\" 0+ %s\\n\", &pchars($subs[17])) if $showrest;\n        $last_printed = 0;\n        for ($i = 1; $i <= 16; $i++)\n          {\n          if (defined $subs[$i])\n            {\n            while ($last_printed++ < $i-1)\n              { printf $outfile (\"%2d: <unset>\\n\", $last_printed); }\n            printf $outfile (\"%2d: %s\\n\", $i, &pchars($subs[$i]));\n            $last_printed = $i;\n            }\n          }\n        splice(@subs, 0, 18);\n        }\n\n      # It seems that $REGMARK is not marked as UTF-8 even when use utf8 is\n      # set and the input pattern was a UTF-8 string. We can, however, force\n      # it to be so marked.\n\n      if (defined $REGMARK && $REGMARK != 1)\n        {\n        $xx = $REGMARK;\n        $xx = Encode::decode_utf8($xx) if $utf8;\n        printf $outfile (\"MK: %s\\n\", &pchars($xx));\n        }\n      }\n    }\n  }\n\n# printf $outfile \"\\n\";\n\n# End\n"
  },
  {
    "path": "src/pcre/sljit/sljitConfig.h",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef _SLJIT_CONFIG_H_\n#define _SLJIT_CONFIG_H_\n\n/* --------------------------------------------------------------------- */\n/*  Custom defines                                                       */\n/* --------------------------------------------------------------------- */\n\n/* Put your custom defines here. This empty section will never change\n   which helps maintaining patches (with diff / patch utilities). */\n\n/* --------------------------------------------------------------------- */\n/*  Architecture                                                         */\n/* --------------------------------------------------------------------- */\n\n/* Architecture selection. */\n/* #define SLJIT_CONFIG_X86_32 1 */\n/* #define SLJIT_CONFIG_X86_64 1 */\n/* #define SLJIT_CONFIG_ARM_V5 1 */\n/* #define SLJIT_CONFIG_ARM_V7 1 */\n/* #define SLJIT_CONFIG_ARM_THUMB2 1 */\n/* #define SLJIT_CONFIG_ARM_64 1 */\n/* #define SLJIT_CONFIG_PPC_32 1 */\n/* #define SLJIT_CONFIG_PPC_64 1 */\n/* #define SLJIT_CONFIG_MIPS_32 1 */\n/* #define SLJIT_CONFIG_MIPS_64 1 */\n/* #define SLJIT_CONFIG_SPARC_32 1 */\n/* #define SLJIT_CONFIG_TILEGX 1 */\n\n/* #define SLJIT_CONFIG_AUTO 1 */\n/* #define SLJIT_CONFIG_UNSUPPORTED 1 */\n\n/* --------------------------------------------------------------------- */\n/*  Utilities                                                            */\n/* --------------------------------------------------------------------- */\n\n/* Useful for thread-safe compiling of global functions. */\n#ifndef SLJIT_UTIL_GLOBAL_LOCK\n/* Enabled by default */\n#define SLJIT_UTIL_GLOBAL_LOCK 1\n#endif\n\n/* Implements a stack like data structure (by using mmap / VirtualAlloc). */\n#ifndef SLJIT_UTIL_STACK\n/* Enabled by default */\n#define SLJIT_UTIL_STACK 1\n#endif\n\n/* Single threaded application. Does not require any locks. */\n#ifndef SLJIT_SINGLE_THREADED\n/* Disabled by default. */\n#define SLJIT_SINGLE_THREADED 0\n#endif\n\n/* --------------------------------------------------------------------- */\n/*  Configuration                                                        */\n/* --------------------------------------------------------------------- */\n\n/* If SLJIT_STD_MACROS_DEFINED is not defined, the application should\n   define SLJIT_MALLOC, SLJIT_FREE, SLJIT_MEMCPY, and NULL. */\n#ifndef SLJIT_STD_MACROS_DEFINED\n/* Disabled by default. */\n#define SLJIT_STD_MACROS_DEFINED 0\n#endif\n\n/* Executable code allocation:\n   If SLJIT_EXECUTABLE_ALLOCATOR is not defined, the application should\n   define SLJIT_MALLOC_EXEC, SLJIT_FREE_EXEC, and SLJIT_EXEC_OFFSET. */\n#ifndef SLJIT_EXECUTABLE_ALLOCATOR\n/* Enabled by default. */\n#define SLJIT_EXECUTABLE_ALLOCATOR 1\n\n/* When SLJIT_PROT_EXECUTABLE_ALLOCATOR is enabled SLJIT uses\n   an allocator which does not set writable and executable\n   permission flags at the same time. The trade-of is increased\n   memory consumption and disabled dynamic code modifications. */\n#ifndef SLJIT_PROT_EXECUTABLE_ALLOCATOR\n/* Disabled by default. */\n#define SLJIT_PROT_EXECUTABLE_ALLOCATOR 0\n#endif\n\n#endif\n\n/* Force cdecl calling convention even if a better calling\n   convention (e.g. fastcall) is supported by the C compiler.\n   If this option is disabled (this is the default), functions\n   called from JIT should be defined with SLJIT_FUNC attribute.\n   Standard C functions can still be called by using the\n   SLJIT_CALL_CDECL jump type. */\n#ifndef SLJIT_USE_CDECL_CALLING_CONVENTION\n/* Disabled by default */\n#define SLJIT_USE_CDECL_CALLING_CONVENTION 0\n#endif\n\n/* Return with error when an invalid argument is passed. */\n#ifndef SLJIT_ARGUMENT_CHECKS\n/* Disabled by default */\n#define SLJIT_ARGUMENT_CHECKS 0\n#endif\n\n/* Debug checks (assertions, etc.). */\n#ifndef SLJIT_DEBUG\n/* Enabled by default */\n#define SLJIT_DEBUG 1\n#endif\n\n/* Verbose operations. */\n#ifndef SLJIT_VERBOSE\n/* Enabled by default */\n#define SLJIT_VERBOSE 1\n#endif\n\n/*\n  SLJIT_IS_FPU_AVAILABLE\n    The availability of the FPU can be controlled by SLJIT_IS_FPU_AVAILABLE.\n      zero value - FPU is NOT present.\n      nonzero value - FPU is present.\n*/\n\n/* For further configurations, see the beginning of sljitConfigInternal.h */\n\n#endif\n"
  },
  {
    "path": "src/pcre/sljit/sljitConfigInternal.h",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef _SLJIT_CONFIG_INTERNAL_H_\n#define _SLJIT_CONFIG_INTERNAL_H_\n\n/*\n   SLJIT defines the following architecture dependent types and macros:\n\n   Types:\n     sljit_s8, sljit_u8   : signed and unsigned 8 bit integer type\n     sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type\n     sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type\n     sljit_sw, sljit_uw   : signed and unsigned machine word, enough to store a pointer\n     sljit_p              : unsgined pointer value (usually the same as sljit_uw, but\n                            some 64 bit ABIs may use 32 bit pointers)\n     sljit_f32            : 32 bit single precision floating point value\n     sljit_f64            : 64 bit double precision floating point value\n\n   Macros for feature detection (boolean):\n     SLJIT_32BIT_ARCHITECTURE : 32 bit architecture\n     SLJIT_64BIT_ARCHITECTURE : 64 bit architecture\n     SLJIT_LITTLE_ENDIAN : little endian architecture\n     SLJIT_BIG_ENDIAN : big endian architecture\n     SLJIT_UNALIGNED : allows unaligned memory accesses for non-fpu operations (only!)\n     SLJIT_INDIRECT_CALL : see SLJIT_FUNC_OFFSET() for more information\n\n   Constants:\n     SLJIT_NUMBER_OF_REGISTERS : number of available registers\n     SLJIT_NUMBER_OF_SCRATCH_REGISTERS : number of available scratch registers\n     SLJIT_NUMBER_OF_SAVED_REGISTERS : number of available saved registers\n     SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers\n     SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers\n     SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers\n     SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index\n     SLJIT_F32_SHIFT : the shift required to apply when accessing\n                       a single precision floating point array by index\n     SLJIT_F64_SHIFT : the shift required to apply when accessing\n                       a double precision floating point array by index\n     SLJIT_PREF_SHIFT_REG : x86 systems prefers ecx for shifting by register\n                            the scratch register index of ecx is stored in this variable\n     SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)\n     SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address\n\n   Other macros:\n     SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT\n     SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)\n*/\n\n/*****************/\n/* Sanity check. */\n/*****************/\n\n#if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \\\n\t|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \\\n\t|| (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \\\n\t|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \\\n\t|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \\\n\t|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \\\n\t|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \\\n\t|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \\\n\t|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \\\n\t|| (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \\\n\t|| (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \\\n\t|| (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \\\n\t|| (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED))\n#error \"An architecture must be selected\"\n#endif\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \\\n\t+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \\\n\t+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \\\n\t+ (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \\\n\t+ (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \\\n\t+ (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t+ (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \\\n\t+ (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \\\n\t+ (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) \\\n\t+ (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \\\n\t+ (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \\\n\t+ (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \\\n\t+ (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO) \\\n\t+ (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) >= 2\n#error \"Multiple architectures are selected\"\n#endif\n\n/********************************************************/\n/* Automatic CPU detection (requires compiler support). */\n/********************************************************/\n\n#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)\n\n#ifndef _WIN32\n\n#if defined(__i386__) || defined(__i386)\n#define SLJIT_CONFIG_X86_32 1\n#elif defined(__x86_64__)\n#define SLJIT_CONFIG_X86_64 1\n#elif defined(__arm__) || defined(__ARM__)\n#ifdef __thumb2__\n#define SLJIT_CONFIG_ARM_THUMB2 1\n#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__)\n#define SLJIT_CONFIG_ARM_V7 1\n#else\n#define SLJIT_CONFIG_ARM_V5 1\n#endif\n#elif defined (__aarch64__)\n#define SLJIT_CONFIG_ARM_64 1\n#elif defined(__ppc64__) || defined(__powerpc64__) || defined(_ARCH_PPC64) || (defined(_POWER) && defined(__64BIT__))\n#define SLJIT_CONFIG_PPC_64 1\n#elif defined(__ppc__) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) || defined(_POWER)\n#define SLJIT_CONFIG_PPC_32 1\n#elif defined(__mips__) && !defined(_LP64)\n#define SLJIT_CONFIG_MIPS_32 1\n#elif defined(__mips64)\n#define SLJIT_CONFIG_MIPS_64 1\n#elif defined(__sparc__) || defined(__sparc)\n#define SLJIT_CONFIG_SPARC_32 1\n#elif defined(__tilegx__)\n#define SLJIT_CONFIG_TILEGX 1\n#else\n/* Unsupported architecture */\n#define SLJIT_CONFIG_UNSUPPORTED 1\n#endif\n\n#else /* _WIN32 */\n\n#if defined(_M_X64) || defined(__x86_64__)\n#define SLJIT_CONFIG_X86_64 1\n#elif (defined(_M_ARM) && _M_ARM >= 7 && defined(_M_ARMT)) || defined(__thumb2__)\n#define SLJIT_CONFIG_ARM_THUMB2 1\n#elif (defined(_M_ARM) && _M_ARM >= 7)\n#define SLJIT_CONFIG_ARM_V7 1\n#elif defined(_ARM_)\n#define SLJIT_CONFIG_ARM_V5 1\n#elif defined(_M_ARM64) || defined(__aarch64__)\n#define SLJIT_CONFIG_ARM_64 1\n#else\n#define SLJIT_CONFIG_X86_32 1\n#endif\n\n#endif /* !_WIN32 */\n#endif /* SLJIT_CONFIG_AUTO */\n\n#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n#undef SLJIT_EXECUTABLE_ALLOCATOR\n#endif\n\n/******************************/\n/* CPU family type detection. */\n/******************************/\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \\\n\t|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\n#define SLJIT_CONFIG_ARM_32 1\n#endif\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n#define SLJIT_CONFIG_X86 1\n#elif (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n#define SLJIT_CONFIG_ARM 1\n#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define SLJIT_CONFIG_PPC 1\n#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) || (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n#define SLJIT_CONFIG_MIPS 1\n#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) || (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)\n#define SLJIT_CONFIG_SPARC 1\n#endif\n\n/**********************************/\n/* External function definitions. */\n/**********************************/\n\n/* General macros:\n   Note: SLJIT is designed to be independent from them as possible.\n\n   In release mode (SLJIT_DEBUG is not defined) only the following\n   external functions are needed:\n*/\n\n#ifndef SLJIT_MALLOC\n#define SLJIT_MALLOC(size, allocator_data) malloc(size)\n#endif\n\n#ifndef SLJIT_FREE\n#define SLJIT_FREE(ptr, allocator_data) free(ptr)\n#endif\n\n#ifndef SLJIT_MEMCPY\n#define SLJIT_MEMCPY(dest, src, len) memcpy(dest, src, len)\n#endif\n\n#ifndef SLJIT_ZEROMEM\n#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)\n#endif\n\n/***************************/\n/* Compiler helper macros. */\n/***************************/\n\n#if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)\n\n#if defined(__GNUC__) && (__GNUC__ >= 3)\n#define SLJIT_LIKELY(x)\t\t__builtin_expect((x), 1)\n#define SLJIT_UNLIKELY(x)\t__builtin_expect((x), 0)\n#else\n#define SLJIT_LIKELY(x)\t\t(x)\n#define SLJIT_UNLIKELY(x)\t(x)\n#endif\n\n#endif /* !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY) */\n\n#ifndef SLJIT_INLINE\n/* Inline functions. Some old compilers do not support them. */\n#if defined(__SUNPRO_C) && __SUNPRO_C <= 0x510\n#define SLJIT_INLINE\n#else\n#define SLJIT_INLINE __inline\n#endif\n#endif /* !SLJIT_INLINE */\n\n#ifndef SLJIT_NOINLINE\n/* Not inline functions. */\n#if defined(__GNUC__)\n#define SLJIT_NOINLINE __attribute__ ((noinline))\n#else\n#define SLJIT_NOINLINE\n#endif\n#endif /* !SLJIT_INLINE */\n\n#ifndef SLJIT_UNUSED_ARG\n/* Unused arguments. */\n#define SLJIT_UNUSED_ARG(arg) (void)arg\n#endif\n\n/*********************************/\n/* Type of public API functions. */\n/*********************************/\n\n#if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)\n/* Static ABI functions. For all-in-one programs. */\n\n#if defined(__GNUC__)\n/* Disable unused warnings in gcc. */\n#define SLJIT_API_FUNC_ATTRIBUTE static __attribute__((unused))\n#else\n#define SLJIT_API_FUNC_ATTRIBUTE static\n#endif\n\n#else\n#define SLJIT_API_FUNC_ATTRIBUTE\n#endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */\n\n/****************************/\n/* Instruction cache flush. */\n/****************************/\n\n#if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)\n#if __has_builtin(__builtin___clear_cache)\n\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\t__builtin___clear_cache((char*)from, (char*)to)\n\n#endif /* __has_builtin(__builtin___clear_cache) */\n#endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */\n\n#ifndef SLJIT_CACHE_FLUSH\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n\n/* Not required to implement on archs with unified caches. */\n#define SLJIT_CACHE_FLUSH(from, to)\n\n#elif defined __APPLE__\n\n/* Supported by all macs since Mac OS 10.5.\n   However, it does not work on non-jailbroken iOS devices,\n   although the compilation is successful. */\n\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\tsys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))\n\n#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n\n/* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\tppc_cache_flush((from), (to))\n#define SLJIT_CACHE_FLUSH_OWN_IMPL 1\n\n#elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))\n\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\t__builtin___clear_cache((char*)from, (char*)to)\n\n#elif defined __ANDROID__\n\n/* Android lacks __clear_cache; instead, cacheflush should be used. */\n\n#define SLJIT_CACHE_FLUSH(from, to) \\\n    cacheflush((long)(from), (long)(to), 0)\n\n#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\n/* The __clear_cache() implementation of GCC is a dummy function on Sparc. */\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\tsparc_cache_flush((from), (to))\n#define SLJIT_CACHE_FLUSH_OWN_IMPL 1\n\n#elif defined _WIN32\n\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\tFlushInstructionCache(GetCurrentProcess(), (char*)(from), (char*)(to) - (char*)(from))\n\n#else\n\n/* Calls __ARM_NR_cacheflush on ARM-Linux. */\n#define SLJIT_CACHE_FLUSH(from, to) \\\n\t__clear_cache((char*)(from), (char*)(to))\n\n#endif\n\n#endif /* !SLJIT_CACHE_FLUSH */\n\n/******************************************************/\n/*    Integer and floating point type definitions.    */\n/******************************************************/\n\n/* 8 bit byte type. */\ntypedef unsigned char sljit_u8;\ntypedef signed char sljit_s8;\n\n/* 16 bit half-word type. */\ntypedef unsigned short int sljit_u16;\ntypedef signed short int sljit_s16;\n\n/* 32 bit integer type. */\ntypedef unsigned int sljit_u32;\ntypedef signed int sljit_s32;\n\n/* Machine word type. Enough for storing a pointer.\n     32 bit for 32 bit machines.\n     64 bit for 64 bit machines. */\n#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n/* Just to have something. */\n#define SLJIT_WORD_SHIFT 0\ntypedef unsigned long int sljit_uw;\ntypedef long int sljit_sw;\n#elif !(defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \\\n\t&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t&& !(defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) \\\n\t&& !(defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) \\\n\t&& !(defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)\n#define SLJIT_32BIT_ARCHITECTURE 1\n#define SLJIT_WORD_SHIFT 2\ntypedef unsigned int sljit_uw;\ntypedef int sljit_sw;\n#else\n#define SLJIT_64BIT_ARCHITECTURE 1\n#define SLJIT_WORD_SHIFT 3\n#ifdef _WIN32\n#ifdef __GNUC__\n/* These types do not require windows.h */\ntypedef unsigned long long sljit_uw;\ntypedef long long sljit_sw;\n#else\ntypedef unsigned __int64 sljit_uw;\ntypedef __int64 sljit_sw;\n#endif\n#else /* !_WIN32 */\ntypedef unsigned long int sljit_uw;\ntypedef long int sljit_sw;\n#endif /* _WIN32 */\n#endif\n\ntypedef sljit_uw sljit_p;\n\n/* Floating point types. */\ntypedef float sljit_f32;\ntypedef double sljit_f64;\n\n/* Shift for pointer sized data. */\n#define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT\n\n/* Shift for double precision sized data. */\n#define SLJIT_F32_SHIFT 2\n#define SLJIT_F64_SHIFT 3\n\n#ifndef SLJIT_W\n\n/* Defining long constants. */\n#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n#define SLJIT_W(w)\t(w##l)\n#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n#define SLJIT_W(w)\t(w##ll)\n#else\n#define SLJIT_W(w)\t(w)\n#endif\n\n#endif /* !SLJIT_W */\n\n/*************************/\n/* Endianness detection. */\n/*************************/\n\n#if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)\n\n/* These macros are mostly useful for the applications. */\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \\\n\t|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\n#ifdef __LITTLE_ENDIAN__\n#define SLJIT_LITTLE_ENDIAN 1\n#else\n#define SLJIT_BIG_ENDIAN 1\n#endif\n\n#elif (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) \\\n\t|| (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\n#ifdef __MIPSEL__\n#define SLJIT_LITTLE_ENDIAN 1\n#else\n#define SLJIT_BIG_ENDIAN 1\n#endif\n\n#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\n#define SLJIT_BIG_ENDIAN 1\n\n#else\n#define SLJIT_LITTLE_ENDIAN 1\n#endif\n\n#endif /* !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN) */\n\n/* Sanity check. */\n#if (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)\n#error \"Exactly one endianness must be selected\"\n#endif\n\n#if !(defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN) && !(defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)\n#error \"Exactly one endianness must be selected\"\n#endif\n\n#ifndef SLJIT_UNALIGNED\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \\\n\t|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \\\n\t|| (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) \\\n\t|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) \\\n\t|| (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t|| (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \\\n\t|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define SLJIT_UNALIGNED 1\n#endif\n\n#endif /* !SLJIT_UNALIGNED */\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n/* Auto detect SSE2 support using CPUID.\n   On 64 bit x86 cpus, sse2 must be present. */\n#define SLJIT_DETECT_SSE2 1\n#endif\n\n/*****************************************************************************************/\n/* Calling convention of functions generated by SLJIT or called from the generated code. */\n/*****************************************************************************************/\n\n#ifndef SLJIT_FUNC\n\n#if (defined SLJIT_USE_CDECL_CALLING_CONVENTION && SLJIT_USE_CDECL_CALLING_CONVENTION)\n\n/* Force cdecl. */\n#define SLJIT_FUNC\n\n#elif (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\n#if defined(__GNUC__) && !defined(__APPLE__)\n\n#define SLJIT_FUNC __attribute__ ((fastcall))\n#define SLJIT_X86_32_FASTCALL 1\n\n#elif defined(_MSC_VER)\n\n#define SLJIT_FUNC __fastcall\n#define SLJIT_X86_32_FASTCALL 1\n\n#elif defined(__BORLANDC__)\n\n#define SLJIT_FUNC __msfastcall\n#define SLJIT_X86_32_FASTCALL 1\n\n#else /* Unknown compiler. */\n\n/* The cdecl attribute is the default. */\n#define SLJIT_FUNC\n\n#endif\n\n#else /* Non x86-32 architectures. */\n\n#define SLJIT_FUNC\n\n#endif /* SLJIT_CONFIG_X86_32 */\n\n#endif /* !SLJIT_FUNC */\n\n#ifndef SLJIT_INDIRECT_CALL\n#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (!defined _CALL_ELF || _CALL_ELF == 1)) \\\n\t|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)\n/* It seems certain ppc compilers use an indirect addressing for functions\n   which makes things complicated. */\n#define SLJIT_INDIRECT_CALL 1\n#endif\n#endif /* SLJIT_INDIRECT_CALL */\n\n/* The offset which needs to be substracted from the return address to\ndetermine the next executed instruction after return. */\n#ifndef SLJIT_RETURN_ADDRESS_OFFSET\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n#define SLJIT_RETURN_ADDRESS_OFFSET 8\n#else\n#define SLJIT_RETURN_ADDRESS_OFFSET 0\n#endif\n#endif /* SLJIT_RETURN_ADDRESS_OFFSET */\n\n/***************************************************/\n/* Functions of the built-in executable allocator. */\n/***************************************************/\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);\n#define SLJIT_MALLOC_EXEC(size) sljit_malloc_exec(size)\n#define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)\n\n#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)\nSLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);\n#define SLJIT_EXEC_OFFSET(ptr) sljit_exec_offset(ptr)\n#else\n#define SLJIT_EXEC_OFFSET(ptr) 0\n#endif\n\n#endif\n\n/**********************************************/\n/* Registers and locals offset determination. */\n/**********************************************/\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\n#define SLJIT_NUMBER_OF_REGISTERS 12\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 9\n#define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)\n#define SLJIT_PREF_SHIFT_REG SLJIT_R2\n\n#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\n#define SLJIT_NUMBER_OF_REGISTERS 13\n#ifndef _WIN64\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6\n#define SLJIT_LOCALS_OFFSET_BASE 0\n#else /* _WIN64 */\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8\n#define SLJIT_LOCALS_OFFSET_BASE (compiler->locals_offset)\n#endif /* !_WIN64 */\n#define SLJIT_PREF_SHIFT_REG SLJIT_R3\n\n#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\n#define SLJIT_NUMBER_OF_REGISTERS 12\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8\n#define SLJIT_LOCALS_OFFSET_BASE 0\n\n#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\n\n#define SLJIT_NUMBER_OF_REGISTERS 12\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8\n#define SLJIT_LOCALS_OFFSET_BASE 0\n\n#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n\n#define SLJIT_NUMBER_OF_REGISTERS 26\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10\n#define SLJIT_LOCALS_OFFSET_BASE 0\n\n#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n\n#define SLJIT_NUMBER_OF_REGISTERS 23\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)\n#define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))\n#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n/* Add +1 for double alignment. */\n#define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw))\n#else\n#define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw))\n#endif /* SLJIT_CONFIG_PPC_64 || _AIX */\n\n#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n\n#define SLJIT_NUMBER_OF_REGISTERS 21\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw))\n#else\n#define SLJIT_LOCALS_OFFSET_BASE 0\n#endif\n\n#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)\n\n#define SLJIT_NUMBER_OF_REGISTERS 18\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 14\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n/* saved registers (16), return struct pointer (1), space for 6 argument words (1),\n   4th double arg (2), double alignment (1). */\n#define SLJIT_LOCALS_OFFSET_BASE ((16 + 1 + 6 + 2 + 1) * sizeof(sljit_sw))\n#endif\n\n#elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)\n\n#define SLJIT_NUMBER_OF_REGISTERS 10\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 5\n#define SLJIT_LOCALS_OFFSET_BASE 0\n\n#elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n\n#define SLJIT_NUMBER_OF_REGISTERS 0\n#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0\n#define SLJIT_LOCALS_OFFSET_BASE 0\n\n#endif\n\n#define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)\n\n#define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \\\n\t(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)\n\n#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)\n#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1\n#else\n#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0\n#endif\n\n#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \\\n\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)\n\n/*************************************/\n/* Debug and verbose related macros. */\n/*************************************/\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n#include <stdio.h>\n#endif\n\n#if (defined SLJIT_DEBUG && SLJIT_DEBUG)\n\n#if !defined(SLJIT_ASSERT) || !defined(SLJIT_UNREACHABLE)\n\n/* SLJIT_HALT_PROCESS must halt the process. */\n#ifndef SLJIT_HALT_PROCESS\n#include <stdlib.h>\n\n#define SLJIT_HALT_PROCESS() \\\n\tabort();\n#endif /* !SLJIT_HALT_PROCESS */\n\n#include <stdio.h>\n\n#endif /* !SLJIT_ASSERT || !SLJIT_UNREACHABLE */\n\n/* Feel free to redefine these two macros. */\n#ifndef SLJIT_ASSERT\n\n#define SLJIT_ASSERT(x) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(!(x))) { \\\n\t\t\tprintf(\"Assertion failed at \" __FILE__ \":%d\\n\", __LINE__); \\\n\t\t\tSLJIT_HALT_PROCESS(); \\\n\t\t} \\\n\t} while (0)\n\n#endif /* !SLJIT_ASSERT */\n\n#ifndef SLJIT_UNREACHABLE\n\n#define SLJIT_UNREACHABLE() \\\n\tdo { \\\n\t\tprintf(\"Should never been reached \" __FILE__ \":%d\\n\", __LINE__); \\\n\t\tSLJIT_HALT_PROCESS(); \\\n\t} while (0)\n\n#endif /* !SLJIT_UNREACHABLE */\n\n#else /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */\n\n/* Forcing empty, but valid statements. */\n#undef SLJIT_ASSERT\n#undef SLJIT_UNREACHABLE\n\n#define SLJIT_ASSERT(x) \\\n\tdo { } while (0)\n#define SLJIT_UNREACHABLE() \\\n\tdo { } while (0)\n\n#endif /* (defined SLJIT_DEBUG && SLJIT_DEBUG) */\n\n#ifndef SLJIT_COMPILE_ASSERT\n\n#define SLJIT_COMPILE_ASSERT(x, description) \\\n\tswitch(0) { case 0: case ((x) ? 1 : 0): break; }\n\n#endif /* !SLJIT_COMPILE_ASSERT */\n\n#endif\n"
  },
  {
    "path": "src/pcre/sljit/sljitExecAllocator.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n   This file contains a simple executable memory allocator\n\n   It is assumed, that executable code blocks are usually medium (or sometimes\n   large) memory blocks, and the allocator is not too frequently called (less\n   optimized than other allocators). Thus, using it as a generic allocator is\n   not suggested.\n\n   How does it work:\n     Memory is allocated in continuous memory areas called chunks by alloc_chunk()\n     Chunk format:\n     [ block ][ block ] ... [ block ][ block terminator ]\n\n   All blocks and the block terminator is started with block_header. The block\n   header contains the size of the previous and the next block. These sizes\n   can also contain special values.\n     Block size:\n       0 - The block is a free_block, with a different size member.\n       1 - The block is a block terminator.\n       n - The block is used at the moment, and the value contains its size.\n     Previous block size:\n       0 - This is the first block of the memory chunk.\n       n - The size of the previous block.\n\n   Using these size values we can go forward or backward on the block chain.\n   The unused blocks are stored in a chain list pointed by free_blocks. This\n   list is useful if we need to find a suitable memory area when the allocator\n   is called.\n\n   When a block is freed, the new free block is connected to its adjacent free\n   blocks if possible.\n\n     [ free block ][ used block ][ free block ]\n   and \"used block\" is freed, the three blocks are connected together:\n     [           one big free block           ]\n*/\n\n/* --------------------------------------------------------------------- */\n/*  System (OS) functions                                                */\n/* --------------------------------------------------------------------- */\n\n/* 64 KByte. */\n#define CHUNK_SIZE\t0x10000\n\n/*\n   alloc_chunk / free_chunk :\n     * allocate executable system memory chunks\n     * the size is always divisible by CHUNK_SIZE\n   allocator_grab_lock / allocator_release_lock :\n     * make the allocator thread safe\n     * can be empty if the OS (or the application) does not support threading\n     * only the allocator requires this lock, sljit is fully thread safe\n       as it only uses local variables\n*/\n\n#ifdef _WIN32\n\nstatic SLJIT_INLINE void* alloc_chunk(sljit_uw size)\n{\n\treturn VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n}\n\nstatic SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)\n{\n\tSLJIT_UNUSED_ARG(size);\n\tVirtualFree(chunk, 0, MEM_RELEASE);\n}\n\n#else\n\n#ifdef __APPLE__\n/* Configures TARGET_OS_OSX when appropriate */\n#include <TargetConditionals.h>\n\n#if TARGET_OS_OSX && defined(MAP_JIT)\n#include <sys/utsname.h>\n#endif /* TARGET_OS_OSX && MAP_JIT */\n\n#ifdef MAP_JIT\n\nstatic SLJIT_INLINE int get_map_jit_flag()\n{\n#if TARGET_OS_OSX\n\t/* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version\n\t   of macOS where it's OK to have more than one JIT block. On non-macOS systems, returns\n\t   MAP_JIT if it is defined. */\n\tstatic int map_jit_flag = -1;\n\n\t/* The following code is thread safe because multiple initialization\n\t   sets map_jit_flag to the same value and the code has no side-effects.\n\t   Changing the kernel version witout system restart is (very) unlikely. */\n\tif (map_jit_flag == -1) {\n\t\tstruct utsname name;\n\n\t\tuname(&name);\n\n\t\t/* Kernel version for 10.14.0 (Mojave) */\n\t\tmap_jit_flag = (atoi(name.release) >= 18) ? MAP_JIT : 0;\n\t}\n\n\treturn map_jit_flag;\n#else /* !TARGET_OS_OSX */\n\treturn MAP_JIT;\n#endif /* TARGET_OS_OSX */\n}\n\n#endif /* MAP_JIT */\n\n#endif /* __APPLE__ */\n\nstatic SLJIT_INLINE void* alloc_chunk(sljit_uw size)\n{\n\tvoid *retval;\n\n#ifdef MAP_ANON\n\n\tint flags = MAP_PRIVATE | MAP_ANON;\n\n#ifdef MAP_JIT\n\tflags |= get_map_jit_flag();\n#endif\n\n\tretval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0);\n#else /* !MAP_ANON */\n\tif (dev_zero < 0) {\n\t\tif (open_dev_zero())\n\t\t\treturn NULL;\n\t}\n\tretval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0);\n#endif /* MAP_ANON */\n\n\treturn (retval != MAP_FAILED) ? retval : NULL;\n}\n\nstatic SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)\n{\n\tmunmap(chunk, size);\n}\n\n#endif\n\n/* --------------------------------------------------------------------- */\n/*  Common functions                                                     */\n/* --------------------------------------------------------------------- */\n\n#define CHUNK_MASK\t(~(CHUNK_SIZE - 1))\n\nstruct block_header {\n\tsljit_uw size;\n\tsljit_uw prev_size;\n};\n\nstruct free_block {\n\tstruct block_header header;\n\tstruct free_block *next;\n\tstruct free_block *prev;\n\tsljit_uw size;\n};\n\n#define AS_BLOCK_HEADER(base, offset) \\\n\t((struct block_header*)(((sljit_u8*)base) + offset))\n#define AS_FREE_BLOCK(base, offset) \\\n\t((struct free_block*)(((sljit_u8*)base) + offset))\n#define MEM_START(base)\t\t((void*)(((sljit_u8*)base) + sizeof(struct block_header)))\n#define ALIGN_SIZE(size)\t(((size) + sizeof(struct block_header) + 7) & ~7)\n\nstatic struct free_block* free_blocks;\nstatic sljit_uw allocated_size;\nstatic sljit_uw total_size;\n\nstatic SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block, sljit_uw size)\n{\n\tfree_block->header.size = 0;\n\tfree_block->size = size;\n\n\tfree_block->next = free_blocks;\n\tfree_block->prev = NULL;\n\tif (free_blocks)\n\t\tfree_blocks->prev = free_block;\n\tfree_blocks = free_block;\n}\n\nstatic SLJIT_INLINE void sljit_remove_free_block(struct free_block *free_block)\n{\n\tif (free_block->next)\n\t\tfree_block->next->prev = free_block->prev;\n\n\tif (free_block->prev)\n\t\tfree_block->prev->next = free_block->next;\n\telse {\n\t\tSLJIT_ASSERT(free_blocks == free_block);\n\t\tfree_blocks = free_block->next;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)\n{\n\tstruct block_header *header;\n\tstruct block_header *next_header;\n\tstruct free_block *free_block;\n\tsljit_uw chunk_size;\n\n\tallocator_grab_lock();\n\tif (size < (64 - sizeof(struct block_header)))\n\t\tsize = (64 - sizeof(struct block_header));\n\tsize = ALIGN_SIZE(size);\n\n\tfree_block = free_blocks;\n\twhile (free_block) {\n\t\tif (free_block->size >= size) {\n\t\t\tchunk_size = free_block->size;\n\t\t\tif (chunk_size > size + 64) {\n\t\t\t\t/* We just cut a block from the end of the free block. */\n\t\t\t\tchunk_size -= size;\n\t\t\t\tfree_block->size = chunk_size;\n\t\t\t\theader = AS_BLOCK_HEADER(free_block, chunk_size);\n\t\t\t\theader->prev_size = chunk_size;\n\t\t\t\tAS_BLOCK_HEADER(header, size)->prev_size = size;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsljit_remove_free_block(free_block);\n\t\t\t\theader = (struct block_header*)free_block;\n\t\t\t\tsize = chunk_size;\n\t\t\t}\n\t\t\tallocated_size += size;\n\t\t\theader->size = size;\n\t\t\tallocator_release_lock();\n\t\t\treturn MEM_START(header);\n\t\t}\n\t\tfree_block = free_block->next;\n\t}\n\n\tchunk_size = (size + sizeof(struct block_header) + CHUNK_SIZE - 1) & CHUNK_MASK;\n\theader = (struct block_header*)alloc_chunk(chunk_size);\n\tif (!header) {\n\t\tallocator_release_lock();\n\t\treturn NULL;\n\t}\n\n\tchunk_size -= sizeof(struct block_header);\n\ttotal_size += chunk_size;\n\n\theader->prev_size = 0;\n\tif (chunk_size > size + 64) {\n\t\t/* Cut the allocated space into a free and a used block. */\n\t\tallocated_size += size;\n\t\theader->size = size;\n\t\tchunk_size -= size;\n\n\t\tfree_block = AS_FREE_BLOCK(header, size);\n\t\tfree_block->header.prev_size = size;\n\t\tsljit_insert_free_block(free_block, chunk_size);\n\t\tnext_header = AS_BLOCK_HEADER(free_block, chunk_size);\n\t}\n\telse {\n\t\t/* All space belongs to this allocation. */\n\t\tallocated_size += chunk_size;\n\t\theader->size = chunk_size;\n\t\tnext_header = AS_BLOCK_HEADER(header, chunk_size);\n\t}\n\tnext_header->size = 1;\n\tnext_header->prev_size = chunk_size;\n\tallocator_release_lock();\n\treturn MEM_START(header);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)\n{\n\tstruct block_header *header;\n\tstruct free_block* free_block;\n\n\tallocator_grab_lock();\n\theader = AS_BLOCK_HEADER(ptr, -(sljit_sw)sizeof(struct block_header));\n\tallocated_size -= header->size;\n\n\t/* Connecting free blocks together if possible. */\n\n\t/* If header->prev_size == 0, free_block will equal to header.\n\t   In this case, free_block->header.size will be > 0. */\n\tfree_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size);\n\tif (SLJIT_UNLIKELY(!free_block->header.size)) {\n\t\tfree_block->size += header->size;\n\t\theader = AS_BLOCK_HEADER(free_block, free_block->size);\n\t\theader->prev_size = free_block->size;\n\t}\n\telse {\n\t\tfree_block = (struct free_block*)header;\n\t\tsljit_insert_free_block(free_block, header->size);\n\t}\n\n\theader = AS_BLOCK_HEADER(free_block, free_block->size);\n\tif (SLJIT_UNLIKELY(!header->size)) {\n\t\tfree_block->size += ((struct free_block*)header)->size;\n\t\tsljit_remove_free_block((struct free_block*)header);\n\t\theader = AS_BLOCK_HEADER(free_block, free_block->size);\n\t\theader->prev_size = free_block->size;\n\t}\n\n\t/* The whole chunk is free. */\n\tif (SLJIT_UNLIKELY(!free_block->header.prev_size && header->size == 1)) {\n\t\t/* If this block is freed, we still have (allocated_size / 2) free space. */\n\t\tif (total_size - free_block->size > (allocated_size * 3 / 2)) {\n\t\t\ttotal_size -= free_block->size;\n\t\t\tsljit_remove_free_block(free_block);\n\t\t\tfree_chunk(free_block, free_block->size + sizeof(struct block_header));\n\t\t}\n\t}\n\n\tallocator_release_lock();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)\n{\n\tstruct free_block* free_block;\n\tstruct free_block* next_free_block;\n\n\tallocator_grab_lock();\n\n\tfree_block = free_blocks;\n\twhile (free_block) {\n\t\tnext_free_block = free_block->next;\n\t\tif (!free_block->header.prev_size && \n\t\t\t\tAS_BLOCK_HEADER(free_block, free_block->size)->size == 1) {\n\t\t\ttotal_size -= free_block->size;\n\t\t\tsljit_remove_free_block(free_block);\n\t\t\tfree_chunk(free_block, free_block->size + sizeof(struct block_header));\n\t\t}\n\t\tfree_block = next_free_block;\n\t}\n\n\tSLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks));\n\tallocator_release_lock();\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitLir.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"sljitLir.h\"\n\n#ifdef _WIN32\n\n/* For SLJIT_CACHE_FLUSH, which can expand to FlushInstructionCache. */\n#include <windows.h>\n\n#endif /* _WIN32 */\n\n#if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)\n\n/* These libraries are needed for the macros below. */\n#include <stdlib.h>\n#include <string.h>\n\n#endif /* SLJIT_STD_MACROS_DEFINED */\n\n#define CHECK_ERROR() \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(compiler->error)) \\\n\t\t\treturn compiler->error; \\\n\t} while (0)\n\n#define CHECK_ERROR_PTR() \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(compiler->error)) \\\n\t\t\treturn NULL; \\\n\t} while (0)\n\n#define FAIL_IF(expr) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(expr)) \\\n\t\t\treturn compiler->error; \\\n\t} while (0)\n\n#define PTR_FAIL_IF(expr) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(expr)) \\\n\t\t\treturn NULL; \\\n\t} while (0)\n\n#define FAIL_IF_NULL(ptr) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(!(ptr))) { \\\n\t\t\tcompiler->error = SLJIT_ERR_ALLOC_FAILED; \\\n\t\t\treturn SLJIT_ERR_ALLOC_FAILED; \\\n\t\t} \\\n\t} while (0)\n\n#define PTR_FAIL_IF_NULL(ptr) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(!(ptr))) { \\\n\t\t\tcompiler->error = SLJIT_ERR_ALLOC_FAILED; \\\n\t\t\treturn NULL; \\\n\t\t} \\\n\t} while (0)\n\n#define PTR_FAIL_WITH_EXEC_IF(ptr) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(!(ptr))) { \\\n\t\t\tcompiler->error = SLJIT_ERR_EX_ALLOC_FAILED; \\\n\t\t\treturn NULL; \\\n\t\t} \\\n\t} while (0)\n\n#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n\n#define VARIABLE_FLAG_SHIFT (10)\n#define VARIABLE_FLAG_MASK (0x3f << VARIABLE_FLAG_SHIFT)\n#define GET_FLAG_TYPE(op) ((op) >> VARIABLE_FLAG_SHIFT)\n\n#define GET_OPCODE(op) \\\n\t((op) & ~(SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))\n\n#define HAS_FLAGS(op) \\\n\t((op) & (SLJIT_SET_Z | VARIABLE_FLAG_MASK))\n\n#define GET_ALL_FLAGS(op) \\\n\t((op) & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK))\n\n#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n#define TYPE_CAST_NEEDED(op) \\\n\t((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S32)\n#else\n#define TYPE_CAST_NEEDED(op) \\\n\t((op) >= SLJIT_MOV_U8 && (op) <= SLJIT_MOV_S16)\n#endif\n\n#define BUF_SIZE\t4096\n\n#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)\n#define ABUF_SIZE\t2048\n#else\n#define ABUF_SIZE\t4096\n#endif\n\n/* Parameter parsing. */\n#define REG_MASK\t\t0x3f\n#define OFFS_REG(reg)\t\t(((reg) >> 8) & REG_MASK)\n#define OFFS_REG_MASK\t\t(REG_MASK << 8)\n#define TO_OFFS_REG(reg)\t((reg) << 8)\n/* When reg cannot be unused. */\n#define FAST_IS_REG(reg)\t((reg) <= REG_MASK)\n/* When reg can be unused. */\n#define SLOW_IS_REG(reg)\t((reg) > 0 && (reg) <= REG_MASK)\n\n/* Mask for argument types. */\n#define SLJIT_DEF_MASK ((1 << SLJIT_DEF_SHIFT) - 1)\n\n/* Jump flags. */\n#define JUMP_LABEL\t0x1\n#define JUMP_ADDR\t0x2\n/* SLJIT_REWRITABLE_JUMP is 0x1000. */\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n#\tdefine PATCH_MB\t\t0x4\n#\tdefine PATCH_MW\t\t0x8\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n#\tdefine PATCH_MD\t\t0x10\n#endif\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n#\tdefine IS_BL\t\t0x4\n#\tdefine PATCH_B\t\t0x8\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n#\tdefine CPOOL_SIZE\t512\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\n#\tdefine IS_COND\t\t0x04\n#\tdefine IS_BL\t\t0x08\n\t/* conditional + imm8 */\n#\tdefine PATCH_TYPE1\t0x10\n\t/* conditional + imm20 */\n#\tdefine PATCH_TYPE2\t0x20\n\t/* IT + imm24 */\n#\tdefine PATCH_TYPE3\t0x30\n\t/* imm11 */\n#\tdefine PATCH_TYPE4\t0x40\n\t/* imm24 */\n#\tdefine PATCH_TYPE5\t0x50\n\t/* BL + imm24 */\n#\tdefine PATCH_BL\t\t0x60\n\t/* 0xf00 cc code for branches */\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n#\tdefine IS_COND\t\t0x004\n#\tdefine IS_CBZ\t\t0x008\n#\tdefine IS_BL\t\t0x010\n#\tdefine PATCH_B\t\t0x020\n#\tdefine PATCH_COND\t0x040\n#\tdefine PATCH_ABS48\t0x080\n#\tdefine PATCH_ABS64\t0x100\n#endif\n\n#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n#\tdefine IS_COND\t\t0x004\n#\tdefine IS_CALL\t\t0x008\n#\tdefine PATCH_B\t\t0x010\n#\tdefine PATCH_ABS_B\t0x020\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#\tdefine PATCH_ABS32\t0x040\n#\tdefine PATCH_ABS48\t0x080\n#endif\n#\tdefine REMOVE_COND\t0x100\n#endif\n\n#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n#\tdefine IS_MOVABLE\t0x004\n#\tdefine IS_JAL\t\t0x008\n#\tdefine IS_CALL\t\t0x010\n#\tdefine IS_BIT26_COND\t0x020\n#\tdefine IS_BIT16_COND\t0x040\n\n#\tdefine IS_COND\t\t(IS_BIT26_COND | IS_BIT16_COND)\n\n#\tdefine PATCH_B\t\t0x080\n#\tdefine PATCH_J\t\t0x100\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n#\tdefine PATCH_ABS32\t0x200\n#\tdefine PATCH_ABS48\t0x400\n#endif\n\n\t/* instruction types */\n#\tdefine MOVABLE_INS\t0\n\t/* 1 - 31 last destination register */\n\t/* no destination (i.e: store) */\n#\tdefine UNMOVABLE_INS\t32\n\t/* FPU status register */\n#\tdefine FCSR_FCC\t\t33\n#endif\n\n#if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)\n#\tdefine IS_JAL\t\t0x04\n#\tdefine IS_COND\t\t0x08\n\n#\tdefine PATCH_B\t\t0x10\n#\tdefine PATCH_J\t\t0x20\n#endif\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n#\tdefine IS_MOVABLE\t0x04\n#\tdefine IS_COND\t\t0x08\n#\tdefine IS_CALL\t\t0x10\n\n#\tdefine PATCH_B\t\t0x20\n#\tdefine PATCH_CALL\t0x40\n\n\t/* instruction types */\n#\tdefine MOVABLE_INS\t0\n\t/* 1 - 31 last destination register */\n\t/* no destination (i.e: store) */\n#\tdefine UNMOVABLE_INS\t32\n\n#\tdefine DST_INS_MASK\t0xff\n\n\t/* ICC_SET is the same as SET_FLAGS. */\n#\tdefine ICC_IS_SET\t(1 << 23)\n#\tdefine FCC_IS_SET\t(1 << 24)\n#endif\n\n/* Stack management. */\n\n#define GET_SAVED_REGISTERS_SIZE(scratches, saveds, extra) \\\n\t(((scratches < SLJIT_NUMBER_OF_SCRATCH_REGISTERS ? 0 : (scratches - SLJIT_NUMBER_OF_SCRATCH_REGISTERS)) + \\\n\t\t(saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? saveds : SLJIT_NUMBER_OF_SAVED_REGISTERS) + \\\n\t\textra) * sizeof(sljit_sw))\n\n#define ADJUST_LOCAL_OFFSET(p, i) \\\n\tif ((p) == (SLJIT_MEM1(SLJIT_SP))) \\\n\t\t(i) += SLJIT_LOCALS_OFFSET;\n\n#endif /* !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) */\n\n/* Utils can still be used even if SLJIT_CONFIG_UNSUPPORTED is set. */\n#include \"sljitUtils.c\"\n\n#if !(defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n\n#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)\n#include \"sljitProtExecAllocator.c\"\n#else\n#include \"sljitExecAllocator.c\"\n#endif\n\n#endif\n\n#if (defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR)\n#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr) + (exec_offset))\n#else\n#define SLJIT_ADD_EXEC_OFFSET(ptr, exec_offset) ((sljit_u8 *)(ptr))\n#endif\n\n/* Argument checking features. */\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\n/* Returns with error when an invalid argument is passed. */\n\n#define CHECK_ARGUMENT(x) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(!(x))) \\\n\t\t\treturn 1; \\\n\t} while (0)\n\n#define CHECK_RETURN_TYPE sljit_s32\n#define CHECK_RETURN_OK return 0\n\n#define CHECK(x) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(x)) { \\\n\t\t\tcompiler->error = SLJIT_ERR_BAD_ARGUMENT; \\\n\t\t\treturn SLJIT_ERR_BAD_ARGUMENT; \\\n\t\t} \\\n\t} while (0)\n\n#define CHECK_PTR(x) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(x)) { \\\n\t\t\tcompiler->error = SLJIT_ERR_BAD_ARGUMENT; \\\n\t\t\treturn NULL; \\\n\t\t} \\\n\t} while (0)\n\n#define CHECK_REG_INDEX(x) \\\n\tdo { \\\n\t\tif (SLJIT_UNLIKELY(x)) { \\\n\t\t\treturn -2; \\\n\t\t} \\\n\t} while (0)\n\n#elif (defined SLJIT_DEBUG && SLJIT_DEBUG)\n\n/* Assertion failure occures if an invalid argument is passed. */\n#undef SLJIT_ARGUMENT_CHECKS\n#define SLJIT_ARGUMENT_CHECKS 1\n\n#define CHECK_ARGUMENT(x) SLJIT_ASSERT(x)\n#define CHECK_RETURN_TYPE void\n#define CHECK_RETURN_OK return\n#define CHECK(x) x\n#define CHECK_PTR(x) x\n#define CHECK_REG_INDEX(x) x\n\n#elif (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\n/* Arguments are not checked. */\n#define CHECK_RETURN_TYPE void\n#define CHECK_RETURN_OK return\n#define CHECK(x) x\n#define CHECK_PTR(x) x\n#define CHECK_REG_INDEX(x) x\n\n#else\n\n/* Arguments are not checked. */\n#define CHECK(x)\n#define CHECK_PTR(x)\n#define CHECK_REG_INDEX(x)\n\n#endif /* SLJIT_ARGUMENT_CHECKS */\n\n/* --------------------------------------------------------------------- */\n/*  Public functions                                                     */\n/* --------------------------------------------------------------------- */\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n#define SLJIT_NEEDS_COMPILER_INIT 1\nstatic sljit_s32 compiler_initialized = 0;\n/* A thread safe initialization. */\nstatic void init_compiler(void);\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data)\n{\n\tstruct sljit_compiler *compiler = (struct sljit_compiler*)SLJIT_MALLOC(sizeof(struct sljit_compiler), allocator_data);\n\tif (!compiler)\n\t\treturn NULL;\n\tSLJIT_ZEROMEM(compiler, sizeof(struct sljit_compiler));\n\n\tSLJIT_COMPILE_ASSERT(\n\t\tsizeof(sljit_s8) == 1 && sizeof(sljit_u8) == 1\n\t\t&& sizeof(sljit_s16) == 2 && sizeof(sljit_u16) == 2\n\t\t&& sizeof(sljit_s32) == 4 && sizeof(sljit_u32) == 4\n\t\t&& (sizeof(sljit_p) == 4 || sizeof(sljit_p) == 8)\n\t\t&& sizeof(sljit_p) <= sizeof(sljit_sw)\n\t\t&& (sizeof(sljit_sw) == 4 || sizeof(sljit_sw) == 8)\n\t\t&& (sizeof(sljit_uw) == 4 || sizeof(sljit_uw) == 8),\n\t\tinvalid_integer_types);\n\tSLJIT_COMPILE_ASSERT(SLJIT_I32_OP == SLJIT_F32_OP,\n\t\tint_op_and_single_op_must_be_the_same);\n\tSLJIT_COMPILE_ASSERT(SLJIT_REWRITABLE_JUMP != SLJIT_F32_OP,\n\t\trewritable_jump_and_single_op_must_not_be_the_same);\n\tSLJIT_COMPILE_ASSERT(!(SLJIT_EQUAL & 0x1) && !(SLJIT_LESS & 0x1) && !(SLJIT_EQUAL_F64 & 0x1) && !(SLJIT_JUMP & 0x1),\n\t\tconditional_flags_must_be_even_numbers);\n\n\t/* Only the non-zero members must be set. */\n\tcompiler->error = SLJIT_SUCCESS;\n\n\tcompiler->allocator_data = allocator_data;\n\tcompiler->buf = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, allocator_data);\n\tcompiler->abuf = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, allocator_data);\n\n\tif (!compiler->buf || !compiler->abuf) {\n\t\tif (compiler->buf)\n\t\t\tSLJIT_FREE(compiler->buf, allocator_data);\n\t\tif (compiler->abuf)\n\t\t\tSLJIT_FREE(compiler->abuf, allocator_data);\n\t\tSLJIT_FREE(compiler, allocator_data);\n\t\treturn NULL;\n\t}\n\n\tcompiler->buf->next = NULL;\n\tcompiler->buf->used_size = 0;\n\tcompiler->abuf->next = NULL;\n\tcompiler->abuf->used_size = 0;\n\n\tcompiler->scratches = -1;\n\tcompiler->saveds = -1;\n\tcompiler->fscratches = -1;\n\tcompiler->fsaveds = -1;\n\tcompiler->local_size = -1;\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tcompiler->args = -1;\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tcompiler->cpool = (sljit_uw*)SLJIT_MALLOC(CPOOL_SIZE * sizeof(sljit_uw)\n\t\t+ CPOOL_SIZE * sizeof(sljit_u8), allocator_data);\n\tif (!compiler->cpool) {\n\t\tSLJIT_FREE(compiler->buf, allocator_data);\n\t\tSLJIT_FREE(compiler->abuf, allocator_data);\n\t\tSLJIT_FREE(compiler, allocator_data);\n\t\treturn NULL;\n\t}\n\tcompiler->cpool_unique = (sljit_u8*)(compiler->cpool + CPOOL_SIZE);\n\tcompiler->cpool_diff = 0xffffffff;\n#endif\n\n#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n\tcompiler->delay_slot = UNMOVABLE_INS;\n#endif\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\tcompiler->delay_slot = UNMOVABLE_INS;\n#endif\n\n#if (defined SLJIT_NEEDS_COMPILER_INIT && SLJIT_NEEDS_COMPILER_INIT)\n\tif (!compiler_initialized) {\n\t\tinit_compiler();\n\t\tcompiler_initialized = 1;\n\t}\n#endif\n\n\treturn compiler;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tstruct sljit_memory_fragment *curr;\n\tvoid *allocator_data = compiler->allocator_data;\n\tSLJIT_UNUSED_ARG(allocator_data);\n\n\tbuf = compiler->buf;\n\twhile (buf) {\n\t\tcurr = buf;\n\t\tbuf = buf->next;\n\t\tSLJIT_FREE(curr, allocator_data);\n\t}\n\n\tbuf = compiler->abuf;\n\twhile (buf) {\n\t\tcurr = buf;\n\t\tbuf = buf->next;\n\t\tSLJIT_FREE(curr, allocator_data);\n\t}\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tSLJIT_FREE(compiler->cpool, allocator_data);\n#endif\n\tSLJIT_FREE(compiler, allocator_data);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)\n{\n\tif (compiler->error == SLJIT_SUCCESS)\n\t\tcompiler->error = SLJIT_ERR_ALLOC_FAILED;\n}\n\n#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)\n{\n\t/* Remove thumb mode flag. */\n\tSLJIT_FREE_EXEC((void*)((sljit_uw)code & ~0x1));\n}\n#elif (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)\n{\n\t/* Resolve indirection. */\n\tcode = (void*)(*(sljit_uw*)code);\n\tSLJIT_FREE_EXEC(code);\n}\n#else\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)\n{\n\tSLJIT_FREE_EXEC(code);\n}\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)\n{\n\tif (SLJIT_LIKELY(!!jump) && SLJIT_LIKELY(!!label)) {\n\t\tjump->flags &= ~JUMP_ADDR;\n\t\tjump->flags |= JUMP_LABEL;\n\t\tjump->u.label = label;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)\n{\n\tif (SLJIT_LIKELY(!!jump)) {\n\t\tjump->flags &= ~JUMP_LABEL;\n\t\tjump->flags |= JUMP_ADDR;\n\t\tjump->u.target = target;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(current_flags);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tif ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) {\n\t\tcompiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z));\n\t}\n#endif\n}\n\n/* --------------------------------------------------------------------- */\n/*  Private functions                                                    */\n/* --------------------------------------------------------------------- */\n\nstatic void* ensure_buf(struct sljit_compiler *compiler, sljit_uw size)\n{\n\tsljit_u8 *ret;\n\tstruct sljit_memory_fragment *new_frag;\n\n\tSLJIT_ASSERT(size <= 256);\n\tif (compiler->buf->used_size + size <= (BUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {\n\t\tret = compiler->buf->memory + compiler->buf->used_size;\n\t\tcompiler->buf->used_size += size;\n\t\treturn ret;\n\t}\n\tnew_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(BUF_SIZE, compiler->allocator_data);\n\tPTR_FAIL_IF_NULL(new_frag);\n\tnew_frag->next = compiler->buf;\n\tcompiler->buf = new_frag;\n\tnew_frag->used_size = size;\n\treturn new_frag->memory;\n}\n\nstatic void* ensure_abuf(struct sljit_compiler *compiler, sljit_uw size)\n{\n\tsljit_u8 *ret;\n\tstruct sljit_memory_fragment *new_frag;\n\n\tSLJIT_ASSERT(size <= 256);\n\tif (compiler->abuf->used_size + size <= (ABUF_SIZE - (sljit_uw)SLJIT_OFFSETOF(struct sljit_memory_fragment, memory))) {\n\t\tret = compiler->abuf->memory + compiler->abuf->used_size;\n\t\tcompiler->abuf->used_size += size;\n\t\treturn ret;\n\t}\n\tnew_frag = (struct sljit_memory_fragment*)SLJIT_MALLOC(ABUF_SIZE, compiler->allocator_data);\n\tPTR_FAIL_IF_NULL(new_frag);\n\tnew_frag->next = compiler->abuf;\n\tcompiler->abuf = new_frag;\n\tnew_frag->used_size = size;\n\treturn new_frag->memory;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)\n{\n\tCHECK_ERROR_PTR();\n\n#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n\tif (size <= 0 || size > 128)\n\t\treturn NULL;\n\tsize = (size + 7) & ~7;\n#else\n\tif (size <= 0 || size > 64)\n\t\treturn NULL;\n\tsize = (size + 3) & ~3;\n#endif\n\treturn ensure_abuf(compiler, size);\n}\n\nstatic SLJIT_INLINE void reverse_buf(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf = compiler->buf;\n\tstruct sljit_memory_fragment *prev = NULL;\n\tstruct sljit_memory_fragment *tmp;\n\n\tdo {\n\t\ttmp = buf->next;\n\t\tbuf->next = prev;\n\t\tprev = buf;\n\t\tbuf = tmp;\n\t} while (buf != NULL);\n\n\tcompiler->buf = prev;\n}\n\nstatic SLJIT_INLINE sljit_s32 get_arg_count(sljit_s32 arg_types)\n{\n\tsljit_s32 arg_count = 0;\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\twhile (arg_types) {\n\t\targ_count++;\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn arg_count;\n}\n\nstatic SLJIT_INLINE void set_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tSLJIT_UNUSED_ARG(args);\n\tSLJIT_UNUSED_ARG(local_size);\n\n\tcompiler->options = options;\n\tcompiler->scratches = scratches;\n\tcompiler->saveds = saveds;\n\tcompiler->fscratches = fscratches;\n\tcompiler->fsaveds = fsaveds;\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->logical_local_size = local_size;\n#endif\n}\n\nstatic SLJIT_INLINE void set_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tSLJIT_UNUSED_ARG(args);\n\tSLJIT_UNUSED_ARG(local_size);\n\n\tcompiler->options = options;\n\tcompiler->scratches = scratches;\n\tcompiler->saveds = saveds;\n\tcompiler->fscratches = fscratches;\n\tcompiler->fsaveds = fsaveds;\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->logical_local_size = local_size;\n#endif\n}\n\nstatic SLJIT_INLINE void set_label(struct sljit_label *label, struct sljit_compiler *compiler)\n{\n\tlabel->next = NULL;\n\tlabel->size = compiler->size;\n\tif (compiler->last_label)\n\t\tcompiler->last_label->next = label;\n\telse\n\t\tcompiler->labels = label;\n\tcompiler->last_label = label;\n}\n\nstatic SLJIT_INLINE void set_jump(struct sljit_jump *jump, struct sljit_compiler *compiler, sljit_s32 flags)\n{\n\tjump->next = NULL;\n\tjump->flags = flags;\n\tif (compiler->last_jump)\n\t\tcompiler->last_jump->next = jump;\n\telse\n\t\tcompiler->jumps = jump;\n\tcompiler->last_jump = jump;\n}\n\nstatic SLJIT_INLINE void set_const(struct sljit_const *const_, struct sljit_compiler *compiler)\n{\n\tconst_->next = NULL;\n\tconst_->addr = compiler->size;\n\tif (compiler->last_const)\n\t\tcompiler->last_const->next = const_;\n\telse\n\t\tcompiler->consts = const_;\n\tcompiler->last_const = const_;\n}\n\n#define ADDRESSING_DEPENDS_ON(exp, reg) \\\n\t(((exp) & SLJIT_MEM) && (((exp) & REG_MASK) == reg || OFFS_REG(exp) == reg))\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\n#define FUNCTION_CHECK_IS_REG(r) \\\n\t(((r) >= SLJIT_R0 && (r) < (SLJIT_R0 + compiler->scratches)) \\\n\t|| ((r) > (SLJIT_S0 - compiler->saveds) && (r) <= SLJIT_S0))\n\n#define FUNCTION_CHECK_IS_FREG(fr) \\\n\t(((fr) >= SLJIT_FR0 && (fr) < (SLJIT_FR0 + compiler->fscratches)) \\\n\t|| ((fr) > (SLJIT_FS0 - compiler->fsaveds) && (fr) <= SLJIT_FS0))\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n#define CHECK_IF_VIRTUAL_REGISTER(p) ((p) <= SLJIT_S3 && (p) >= SLJIT_S8)\n#else\n#define CHECK_IF_VIRTUAL_REGISTER(p) 0\n#endif\n\nstatic sljit_s32 function_check_src_mem(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)\n{\n\tif (compiler->scratches == -1 || compiler->saveds == -1)\n\t\treturn 0;\n\n\tif (!(p & SLJIT_MEM))\n\t\treturn 0;\n\n\tif (!((p & REG_MASK) == SLJIT_UNUSED || FUNCTION_CHECK_IS_REG(p & REG_MASK)))\n\t\treturn 0;\n\n\tif (CHECK_IF_VIRTUAL_REGISTER(p & REG_MASK))\n\t\treturn 0;\n\n\tif (p & OFFS_REG_MASK) {\n\t\tif ((p & REG_MASK) == SLJIT_UNUSED)\n\t\t\treturn 0;\n\n\t\tif (!(FUNCTION_CHECK_IS_REG(OFFS_REG(p))))\n\t\t\treturn 0;\n\n\t\tif (CHECK_IF_VIRTUAL_REGISTER(OFFS_REG(p)))\n\t\t\treturn 0;\n\n\t\tif ((i & ~0x3) != 0)\n\t\t\treturn 0;\n\t}\n\n\treturn (p & ~(SLJIT_MEM | REG_MASK | OFFS_REG_MASK)) == 0;\n}\n\n#define FUNCTION_CHECK_SRC_MEM(p, i) \\\n\tCHECK_ARGUMENT(function_check_src_mem(compiler, p, i));\n\nstatic sljit_s32 function_check_src(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)\n{\n\tif (compiler->scratches == -1 || compiler->saveds == -1)\n\t\treturn 0;\n\n\tif (FUNCTION_CHECK_IS_REG(p))\n\t\treturn (i == 0);\n\n\tif (p == SLJIT_IMM)\n\t\treturn 1;\n\n\tif (p == SLJIT_MEM1(SLJIT_SP))\n\t\treturn (i >= 0 && i < compiler->logical_local_size);\n\n\treturn function_check_src_mem(compiler, p, i);\n}\n\n#define FUNCTION_CHECK_SRC(p, i) \\\n\tCHECK_ARGUMENT(function_check_src(compiler, p, i));\n\nstatic sljit_s32 function_check_dst(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i, sljit_s32 unused)\n{\n\tif (compiler->scratches == -1 || compiler->saveds == -1)\n\t\treturn 0;\n\n\tif (FUNCTION_CHECK_IS_REG(p) || ((unused) && (p) == SLJIT_UNUSED))\n\t\treturn (i == 0);\n\n\tif (p == SLJIT_MEM1(SLJIT_SP))\n\t\treturn (i >= 0 && i < compiler->logical_local_size);\n\n\treturn function_check_src_mem(compiler, p, i);\n}\n\n#define FUNCTION_CHECK_DST(p, i, unused) \\\n\tCHECK_ARGUMENT(function_check_dst(compiler, p, i, unused));\n\nstatic sljit_s32 function_fcheck(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)\n{\n\tif (compiler->scratches == -1 || compiler->saveds == -1)\n\t\treturn 0;\n\n\tif (FUNCTION_CHECK_IS_FREG(p))\n\t\treturn (i == 0);\n\n\tif (p == SLJIT_MEM1(SLJIT_SP))\n\t\treturn (i >= 0 && i < compiler->logical_local_size);\n\n\treturn function_check_src_mem(compiler, p, i);\n}\n\n#define FUNCTION_FCHECK(p, i) \\\n\tCHECK_ARGUMENT(function_fcheck(compiler, p, i));\n\n#endif /* SLJIT_ARGUMENT_CHECKS */\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)\n{\n\tcompiler->verbose = verbose;\n}\n\n#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n#ifdef _WIN64\n#\tdefine SLJIT_PRINT_D\t\"I64\"\n#else\n#\tdefine SLJIT_PRINT_D\t\"l\"\n#endif\n#else\n#\tdefine SLJIT_PRINT_D\t\"\"\n#endif\n\nstatic void sljit_verbose_reg(struct sljit_compiler *compiler, sljit_s32 r)\n{\n\tif (r < (SLJIT_R0 + compiler->scratches))\n\t\tfprintf(compiler->verbose, \"r%d\", r - SLJIT_R0);\n\telse if (r != SLJIT_SP)\n\t\tfprintf(compiler->verbose, \"s%d\", SLJIT_NUMBER_OF_REGISTERS - r);\n\telse\n\t\tfprintf(compiler->verbose, \"sp\");\n}\n\nstatic void sljit_verbose_freg(struct sljit_compiler *compiler, sljit_s32 r)\n{\n\tif (r < (SLJIT_FR0 + compiler->fscratches))\n\t\tfprintf(compiler->verbose, \"fr%d\", r - SLJIT_FR0);\n\telse\n\t\tfprintf(compiler->verbose, \"fs%d\", SLJIT_NUMBER_OF_FLOAT_REGISTERS - r);\n}\n\nstatic void sljit_verbose_param(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)\n{\n\tif ((p) & SLJIT_IMM)\n\t\tfprintf(compiler->verbose, \"#%\" SLJIT_PRINT_D \"d\", (i));\n\telse if ((p) & SLJIT_MEM) {\n\t\tif ((p) & REG_MASK) {\n\t\t\tfputc('[', compiler->verbose);\n\t\t\tsljit_verbose_reg(compiler, (p) & REG_MASK);\n\t\t\tif ((p) & OFFS_REG_MASK) {\n\t\t\t\tfprintf(compiler->verbose, \" + \");\n\t\t\t\tsljit_verbose_reg(compiler, OFFS_REG(p));\n\t\t\t\tif (i)\n\t\t\t\t\tfprintf(compiler->verbose, \" * %d\", 1 << (i));\n\t\t\t}\n\t\t\telse if (i)\n\t\t\t\tfprintf(compiler->verbose, \" + %\" SLJIT_PRINT_D \"d\", (i));\n\t\t\tfputc(']', compiler->verbose);\n\t\t}\n\t\telse\n\t\t\tfprintf(compiler->verbose, \"[#%\" SLJIT_PRINT_D \"d]\", (i));\n\t} else if (p)\n\t\tsljit_verbose_reg(compiler, p);\n\telse\n\t\tfprintf(compiler->verbose, \"unused\");\n}\n\nstatic void sljit_verbose_fparam(struct sljit_compiler *compiler, sljit_s32 p, sljit_sw i)\n{\n\tif ((p) & SLJIT_MEM) {\n\t\tif ((p) & REG_MASK) {\n\t\t\tfputc('[', compiler->verbose);\n\t\t\tsljit_verbose_reg(compiler, (p) & REG_MASK);\n\t\t\tif ((p) & OFFS_REG_MASK) {\n\t\t\t\tfprintf(compiler->verbose, \" + \");\n\t\t\t\tsljit_verbose_reg(compiler, OFFS_REG(p));\n\t\t\t\tif (i)\n\t\t\t\t\tfprintf(compiler->verbose, \"%d\", 1 << (i));\n\t\t\t}\n\t\t\telse if (i)\n\t\t\t\tfprintf(compiler->verbose, \" + %\" SLJIT_PRINT_D \"d\", (i));\n\t\t\tfputc(']', compiler->verbose);\n\t\t}\n\t\telse\n\t\t\tfprintf(compiler->verbose, \"[#%\" SLJIT_PRINT_D \"d]\", (i));\n\t}\n\telse\n\t\tsljit_verbose_freg(compiler, p);\n}\n\nstatic const char* op0_names[] = {\n\t(char*)\"breakpoint\", (char*)\"nop\", (char*)\"lmul.uw\", (char*)\"lmul.sw\",\n\t(char*)\"divmod.u\", (char*)\"divmod.s\", (char*)\"div.u\", (char*)\"div.s\"\n};\n\nstatic const char* op1_names[] = {\n\t(char*)\"\", (char*)\".u8\", (char*)\".s8\", (char*)\".u16\",\n\t(char*)\".s16\", (char*)\".u32\", (char*)\".s32\", (char*)\".p\",\n\t(char*)\"\", (char*)\".u8\", (char*)\".s8\", (char*)\".u16\",\n\t(char*)\".s16\", (char*)\".u32\", (char*)\".s32\", (char*)\".p\",\n\t(char*)\"not\", (char*)\"neg\", (char*)\"clz\",\n};\n\nstatic const char* op2_names[] = {\n\t(char*)\"add\", (char*)\"addc\", (char*)\"sub\", (char*)\"subc\",\n\t(char*)\"mul\", (char*)\"and\", (char*)\"or\", (char*)\"xor\",\n\t(char*)\"shl\", (char*)\"lshr\", (char*)\"ashr\",\n};\n\nstatic const char* fop1_names[] = {\n\t(char*)\"mov\", (char*)\"conv\", (char*)\"conv\", (char*)\"conv\",\n\t(char*)\"conv\", (char*)\"conv\", (char*)\"cmp\", (char*)\"neg\",\n\t(char*)\"abs\",\n};\n\nstatic const char* fop2_names[] = {\n\t(char*)\"add\", (char*)\"sub\", (char*)\"mul\", (char*)\"div\"\n};\n\n#define JUMP_POSTFIX(type) \\\n\t((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? \"32\" : \"\") \\\n\t: ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? \".f32\" : \".f64\") : \"\"))\n\nstatic char* jump_names[] = {\n\t(char*)\"equal\", (char*)\"not_equal\",\n\t(char*)\"less\", (char*)\"greater_equal\",\n\t(char*)\"greater\", (char*)\"less_equal\",\n\t(char*)\"sig_less\", (char*)\"sig_greater_equal\",\n\t(char*)\"sig_greater\", (char*)\"sig_less_equal\",\n\t(char*)\"overflow\", (char*)\"not_overflow\",\n\t(char*)\"mul_overflow\", (char*)\"mul_not_overflow\",\n\t(char*)\"carry\", (char*)\"\",\n\t(char*)\"equal\", (char*)\"not_equal\",\n\t(char*)\"less\", (char*)\"greater_equal\",\n\t(char*)\"greater\", (char*)\"less_equal\",\n\t(char*)\"unordered\", (char*)\"ordered\",\n\t(char*)\"jump\", (char*)\"fast_call\",\n\t(char*)\"call\", (char*)\"call.cdecl\"\n};\n\nstatic char* call_arg_names[] = {\n\t(char*)\"void\", (char*)\"sw\", (char*)\"uw\", (char*)\"s32\", (char*)\"u32\", (char*)\"f32\", (char*)\"f64\"\n};\n\n#endif /* SLJIT_VERBOSE */\n\n/* --------------------------------------------------------------------- */\n/*  Arch dependent                                                       */\n/* --------------------------------------------------------------------- */\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \\\n\t|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_generate_code(struct sljit_compiler *compiler)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tstruct sljit_jump *jump;\n#endif\n\n\tSLJIT_UNUSED_ARG(compiler);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(compiler->size > 0);\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\t/* All jumps have target. */\n\t\tCHECK_ARGUMENT(jump->flags & (JUMP_LABEL | JUMP_ADDR));\n\t\tjump = jump->next;\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tsljit_s32 types, arg_count, curr_type;\n#endif\n\n\tSLJIT_UNUSED_ARG(compiler);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));\n\tCHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);\n\tCHECK_ARGUMENT((arg_types & SLJIT_DEF_MASK) == 0);\n\n\ttypes = (arg_types >> SLJIT_DEF_SHIFT);\n\targ_count = 0;\n\twhile (types != 0 && arg_count < 3) {\n\t\tcurr_type = (types & SLJIT_DEF_MASK);\n\t\tCHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW);\n\t\targ_count++;\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\tCHECK_ARGUMENT(arg_count <= saveds && types == 0);\n\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  enter options:%s args[\", (options & SLJIT_F64_ALIGNMENT) ? \"f64_align\" : \"\");\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\twhile (arg_types) {\n\t\t\tfprintf(compiler->verbose, \"%s\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\t\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\t\tif (arg_types)\n\t\t\t\tfprintf(compiler->verbose, \",\");\n\t\t}\n\n\t\tfprintf(compiler->verbose, \"] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\\n\",\n\t\t\tscratches, saveds, fscratches, fsaveds, local_size);\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tsljit_s32 types, arg_count, curr_type;\n#endif\n\n\tSLJIT_UNUSED_ARG(compiler);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(options & ~SLJIT_F64_ALIGNMENT));\n\tCHECK_ARGUMENT(scratches >= 0 && scratches <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(saveds >= 0 && saveds <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS);\n\tCHECK_ARGUMENT(fscratches >= 0 && fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(fsaveds >= 0 && fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n\tCHECK_ARGUMENT(local_size >= 0 && local_size <= SLJIT_MAX_LOCAL_SIZE);\n\n\ttypes = (arg_types >> SLJIT_DEF_SHIFT);\n\targ_count = 0;\n\twhile (types != 0 && arg_count < 3) {\n\t\tcurr_type = (types & SLJIT_DEF_MASK);\n\t\tCHECK_ARGUMENT(curr_type == SLJIT_ARG_TYPE_SW || curr_type == SLJIT_ARG_TYPE_UW);\n\t\targ_count++;\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\tCHECK_ARGUMENT(arg_count <= saveds && types == 0);\n\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  set_context options:%s args[\", (options & SLJIT_F64_ALIGNMENT) ? \"f64_align\" : \"\");\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\twhile (arg_types) {\n\t\t\tfprintf(compiler->verbose, \"%s\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\t\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\t\tif (arg_types)\n\t\t\t\tfprintf(compiler->verbose, \",\");\n\t\t}\n\n\t\tfprintf(compiler->verbose, \"] scratches:%d saveds:%d fscratches:%d fsaveds:%d local_size:%d\\n\",\n\t\t\tscratches, saveds, fscratches, fsaveds, local_size);\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(compiler->scratches >= 0);\n\tif (op != SLJIT_UNUSED) {\n\t\tCHECK_ARGUMENT(op >= SLJIT_MOV && op <= SLJIT_MOV_P);\n\t\tFUNCTION_CHECK_SRC(src, srcw);\n\t}\n\telse\n\t\tCHECK_ARGUMENT(src == 0 && srcw == 0);\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tif (op == SLJIT_UNUSED)\n\t\t\tfprintf(compiler->verbose, \"  return\\n\");\n\t\telse {\n\t\t\tfprintf(compiler->verbose, \"  return%s \", op1_names[op - SLJIT_OP1_BASE]);\n\t\t\tsljit_verbose_param(compiler, src, srcw);\n\t\t\tfprintf(compiler->verbose, \"\\n\");\n\t\t}\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tFUNCTION_CHECK_DST(dst, dstw, 0);\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  fast_enter \");\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tFUNCTION_CHECK_SRC(src, srcw);\n\tCHECK_ARGUMENT(src != SLJIT_IMM);\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  fast_return \");\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT((op >= SLJIT_BREAKPOINT && op <= SLJIT_LMUL_SW)\n\t\t|| ((op & ~SLJIT_I32_OP) >= SLJIT_DIVMOD_UW && (op & ~SLJIT_I32_OP) <= SLJIT_DIV_SW));\n\tCHECK_ARGUMENT(op < SLJIT_LMUL_UW || compiler->scratches >= 2);\n\tif (op >= SLJIT_LMUL_UW)\n\t\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose))\n\t{\n\t\tfprintf(compiler->verbose, \"  %s\", op0_names[GET_OPCODE(op) - SLJIT_OP0_BASE]);\n\t\tif (GET_OPCODE(op) >= SLJIT_DIVMOD_UW) {\n\t\t\tfprintf(compiler->verbose, (op & SLJIT_I32_OP) ? \"32\" : \"w\");\n\t\t}\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV && GET_OPCODE(op) <= SLJIT_CLZ);\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_NOT:\n\t\t/* Only SLJIT_I32_OP and SLJIT_SET_Z are allowed. */\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));\n\t\tbreak;\n\tcase SLJIT_NEG:\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)\n\t\t\t|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);\n\t\tbreak;\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_P:\n\t\t/* Nothing allowed */\n\t\tCHECK_ARGUMENT(!(op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\t\tbreak;\n\tdefault:\n\t\t/* Only SLJIT_I32_OP is allowed. */\n\t\tCHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\t\tbreak;\n\t}\n\n\tFUNCTION_CHECK_DST(dst, dstw, 1);\n\tFUNCTION_CHECK_SRC(src, srcw);\n\n\tif (GET_OPCODE(op) >= SLJIT_NOT) {\n\t\tCHECK_ARGUMENT(src != SLJIT_IMM);\n\t\tcompiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));\n\t}\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tif (GET_OPCODE(op) <= SLJIT_MOV_P)\n\t\t{\n\t\t\tfprintf(compiler->verbose, \"  mov%s%s \", !(op & SLJIT_I32_OP) ? \"\" : \"32\",\n\t\t\t\t(op != SLJIT_MOV32) ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : \"\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfprintf(compiler->verbose, \"  %s%s%s%s%s \", op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE], !(op & SLJIT_I32_OP) ? \"\" : \"32\",\n\t\t\t\t!(op & SLJIT_SET_Z) ? \"\" : \".z\", !(op & VARIABLE_FLAG_MASK) ? \"\" : \".\",\n\t\t\t\t!(op & VARIABLE_FLAG_MASK) ? \"\" : jump_names[GET_FLAG_TYPE(op)]);\n\t\t}\n\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD && GET_OPCODE(op) <= SLJIT_ASHR);\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_AND:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));\n\t\tbreak;\n\tcase SLJIT_MUL:\n\t\tCHECK_ARGUMENT(!(op & SLJIT_SET_Z));\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)\n\t\t\t|| GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW);\n\t\tbreak;\n\tcase SLJIT_ADD:\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)\n\t\t\t|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)\n\t\t\t|| GET_FLAG_TYPE(op) == SLJIT_OVERFLOW);\n\t\tbreak;\n\tcase SLJIT_SUB:\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)\n\t\t\t|| (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_OVERFLOW)\n\t\t\t|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));\n\t\tbreak;\n\tcase SLJIT_ADDC:\n\tcase SLJIT_SUBC:\n\t\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)\n\t\t\t|| GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY));\n\t\tCHECK_ARGUMENT((compiler->last_flags & 0xff) == GET_FLAG_TYPE(SLJIT_SET_CARRY));\n\t\tCHECK_ARGUMENT((op & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP));\n\t\tbreak;\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tbreak;\n\t}\n\n\tFUNCTION_CHECK_DST(dst, dstw, 1);\n\tFUNCTION_CHECK_SRC(src1, src1w);\n\tFUNCTION_CHECK_SRC(src2, src2w);\n\tcompiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s%s%s%s \", op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE], !(op & SLJIT_I32_OP) ? \"\" : \"32\",\n\t\t\t!(op & SLJIT_SET_Z) ? \"\" : \".z\", !(op & VARIABLE_FLAG_MASK) ? \"\" : \".\",\n\t\t\t!(op & VARIABLE_FLAG_MASK) ? \"\" : jump_names[GET_FLAG_TYPE(op)]);\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src1, src1w);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src2, src2w);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_register_index(sljit_s32 reg)\n{\n\tSLJIT_UNUSED_ARG(reg);\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_REGISTERS);\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_float_register_index(sljit_s32 reg)\n{\n\tSLJIT_UNUSED_ARG(reg);\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(reg > 0 && reg <= SLJIT_NUMBER_OF_FLOAT_REGISTERS);\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tint i;\n#endif\n\n\tSLJIT_UNUSED_ARG(compiler);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(instruction);\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n\tCHECK_ARGUMENT(size > 0 && size < 16);\n#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\n\tCHECK_ARGUMENT((size == 2 && (((sljit_sw)instruction) & 0x1) == 0)\n\t\t|| (size == 4 && (((sljit_sw)instruction) & 0x3) == 0));\n#else\n\tCHECK_ARGUMENT(size == 4 && (((sljit_sw)instruction) & 0x3) == 0);\n#endif\n\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  op_custom\");\n\t\tfor (i = 0; i < size; i++)\n\t\t\tfprintf(compiler->verbose, \" 0x%x\", ((sljit_u8*)instruction)[i]);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_MOV_F64 && GET_OPCODE(op) <= SLJIT_ABS_F64);\n\tCHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\tFUNCTION_FCHECK(src, srcw);\n\tFUNCTION_FCHECK(dst, dstw);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)\n\t\t\tfprintf(compiler->verbose, \"  %s%s \", fop1_names[SLJIT_CONV_F64_FROM_F32 - SLJIT_FOP1_BASE],\n\t\t\t\t(op & SLJIT_F32_OP) ? \".f32.from.f64\" : \".f64.from.f32\");\n\t\telse\n\t\t\tfprintf(compiler->verbose, \"  %s%s \", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],\n\t\t\t\t(op & SLJIT_F32_OP) ? \".f32\" : \".f64\");\n\n\t\tsljit_verbose_fparam(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));\n#endif\n\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(GET_OPCODE(op) == SLJIT_CMP_F64);\n\tCHECK_ARGUMENT(!(op & SLJIT_SET_Z));\n\tCHECK_ARGUMENT((op & VARIABLE_FLAG_MASK)\n\t\t|| (GET_FLAG_TYPE(op) >= SLJIT_EQUAL_F64 && GET_FLAG_TYPE(op) <= SLJIT_ORDERED_F64));\n\tFUNCTION_FCHECK(src1, src1w);\n\tFUNCTION_FCHECK(src2, src2w);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s\", fop1_names[SLJIT_CMP_F64 - SLJIT_FOP1_BASE], (op & SLJIT_F32_OP) ? \".f32\" : \".f64\");\n\t\tif (op & VARIABLE_FLAG_MASK) {\n\t\t\tfprintf(compiler->verbose, \".%s_f\", jump_names[GET_FLAG_TYPE(op)]);\n\t\t}\n\t\tfprintf(compiler->verbose, \" \");\n\t\tsljit_verbose_fparam(compiler, src1, src1w);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src2, src2w);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CONV_S32_FROM_F64);\n\tCHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\tFUNCTION_FCHECK(src, srcw);\n\tFUNCTION_CHECK_DST(dst, dstw, 0);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s.from%s \", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],\n\t\t\t(GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? \".s32\" : \".sw\",\n\t\t\t(op & SLJIT_F32_OP) ? \".f32\" : \".f64\");\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_CONV_F64_FROM_SW && GET_OPCODE(op) <= SLJIT_CONV_F64_FROM_S32);\n\tCHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\tFUNCTION_CHECK_SRC(src, srcw);\n\tFUNCTION_FCHECK(dst, dstw);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s.from%s \", fop1_names[GET_OPCODE(op) - SLJIT_FOP1_BASE],\n\t\t\t(op & SLJIT_F32_OP) ? \".f32\" : \".f64\",\n\t\t\t(GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? \".s32\" : \".sw\");\n\t\tsljit_verbose_fparam(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(GET_OPCODE(op) >= SLJIT_ADD_F64 && GET_OPCODE(op) <= SLJIT_DIV_F64);\n\tCHECK_ARGUMENT(!(op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)));\n\tFUNCTION_FCHECK(src1, src1w);\n\tFUNCTION_FCHECK(src2, src2w);\n\tFUNCTION_FCHECK(dst, dstw);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s \", fop2_names[GET_OPCODE(op) - SLJIT_FOP2_BASE], (op & SLJIT_F32_OP) ? \".f32\" : \".f64\");\n\t\tsljit_verbose_fparam(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src1, src1w);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src2, src2w);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->last_flags = 0;\n#endif\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose))\n\t\tfprintf(compiler->verbose, \"label:\\n\");\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));\n\tCHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1));\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_FAST_CALL);\n\tCHECK_ARGUMENT((type & 0xff) < SLJIT_JUMP || !(type & SLJIT_I32_OP));\n\n\tif ((type & 0xff) < SLJIT_JUMP) {\n\t\tif ((type & 0xff) <= SLJIT_NOT_ZERO)\n\t\t\tCHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);\n\t\telse\n\t\t\tCHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)\n\t\t\t\t|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)\n\t\t\t\t|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));\n\t\tCHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP));\n\t}\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose))\n\t\tfprintf(compiler->verbose, \"  jump%s %s%s\\n\", !(type & SLJIT_REWRITABLE_JUMP) ? \"\" : \".r\",\n\t\t\tjump_names[type & 0xff], JUMP_POSTFIX(type));\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tsljit_s32 i, types, curr_type, scratches, fscratches;\n\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP)));\n\tCHECK_ARGUMENT((type & 0xff) == SLJIT_CALL || (type & 0xff) == SLJIT_CALL_CDECL);\n\n\ttypes = arg_types;\n\tscratches = 0;\n\tfscratches = 0;\n\tfor (i = 0; i < 5; i++) {\n\t\tcurr_type = (types & SLJIT_DEF_MASK);\n\t\tCHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);\n\t\tif (i > 0) {\n\t\t\tif (curr_type == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (curr_type >= SLJIT_ARG_TYPE_F32)\n\t\t\t\tfscratches++;\n\t\t\telse\n\t\t\t\tscratches++;\n\t\t} else {\n\t\t\tif (curr_type >= SLJIT_ARG_TYPE_F32) {\n\t\t\t\tCHECK_ARGUMENT(compiler->fscratches > 0);\n\t\t\t} else if (curr_type >= SLJIT_ARG_TYPE_SW) {\n\t\t\t\tCHECK_ARGUMENT(compiler->scratches > 0);\n\t\t\t}\n\t\t}\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\tCHECK_ARGUMENT(compiler->scratches >= scratches);\n\tCHECK_ARGUMENT(compiler->fscratches >= fscratches);\n\tCHECK_ARGUMENT(types == 0);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  %s%s ret[%s\", jump_names[type & 0xff],\n\t\t\t!(type & SLJIT_REWRITABLE_JUMP) ? \"\" : \".r\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\tif (arg_types) {\n\t\t\tfprintf(compiler->verbose, \"], args[\");\n\t\t\tdo {\n\t\t\t\tfprintf(compiler->verbose, \"%s\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\t\t\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\t\t\tif (arg_types)\n\t\t\t\t\tfprintf(compiler->verbose, \",\");\n\t\t\t} while (arg_types);\n\t\t}\n\t\tfprintf(compiler->verbose, \"]\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_SIG_LESS_EQUAL);\n\tFUNCTION_CHECK_SRC(src1, src1w);\n\tFUNCTION_CHECK_SRC(src2, src2w);\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  cmp%s %s%s, \", !(type & SLJIT_REWRITABLE_JUMP) ? \"\" : \".r\",\n\t\t\tjump_names[type & 0xff], (type & SLJIT_I32_OP) ? \"32\" : \"\");\n\t\tsljit_verbose_param(compiler, src1, src1w);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src2, src2w);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(sljit_has_cpu_feature(SLJIT_HAS_FPU));\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_REWRITABLE_JUMP | SLJIT_F32_OP)));\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL_F64 && (type & 0xff) <= SLJIT_ORDERED_F64);\n\tFUNCTION_FCHECK(src1, src1w);\n\tFUNCTION_FCHECK(src2, src2w);\n\tcompiler->last_flags = 0;\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  fcmp%s %s%s, \", !(type & SLJIT_REWRITABLE_JUMP) ? \"\" : \".r\",\n\t\t\tjump_names[type & 0xff], (type & SLJIT_F32_OP) ? \".f32\" : \".f64\");\n\t\tsljit_verbose_fparam(compiler, src1, src1w);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_fparam(compiler, src2, src2w);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (SLJIT_UNLIKELY(compiler->skip_checks)) {\n\t\tcompiler->skip_checks = 0;\n\t\tCHECK_RETURN_OK;\n\t}\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(type >= SLJIT_JUMP && type <= SLJIT_FAST_CALL);\n\tFUNCTION_CHECK_SRC(src, srcw);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  ijump.%s \", jump_names[type]);\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tsljit_s32 i, types, curr_type, scratches, fscratches;\n\n\tCHECK_ARGUMENT(type == SLJIT_CALL || type == SLJIT_CALL_CDECL);\n\tFUNCTION_CHECK_SRC(src, srcw);\n\n\ttypes = arg_types;\n\tscratches = 0;\n\tfscratches = 0;\n\tfor (i = 0; i < 5; i++) {\n\t\tcurr_type = (types & SLJIT_DEF_MASK);\n\t\tCHECK_ARGUMENT(curr_type <= SLJIT_ARG_TYPE_F64);\n\t\tif (i > 0) {\n\t\t\tif (curr_type == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (curr_type >= SLJIT_ARG_TYPE_F32)\n\t\t\t\tfscratches++;\n\t\t\telse\n\t\t\t\tscratches++;\n\t\t} else {\n\t\t\tif (curr_type >= SLJIT_ARG_TYPE_F32) {\n\t\t\t\tCHECK_ARGUMENT(compiler->fscratches > 0);\n\t\t\t} else if (curr_type >= SLJIT_ARG_TYPE_SW) {\n\t\t\t\tCHECK_ARGUMENT(compiler->scratches > 0);\n\t\t\t}\n\t\t}\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\tCHECK_ARGUMENT(compiler->scratches >= scratches);\n\tCHECK_ARGUMENT(compiler->fscratches >= fscratches);\n\tCHECK_ARGUMENT(types == 0);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  i%s%s ret[%s\", jump_names[type & 0xff],\n\t\t\t!(type & SLJIT_REWRITABLE_JUMP) ? \"\" : \".r\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\tif (arg_types) {\n\t\t\tfprintf(compiler->verbose, \"], args[\");\n\t\t\tdo {\n\t\t\t\tfprintf(compiler->verbose, \"%s\", call_arg_names[arg_types & SLJIT_DEF_MASK]);\n\t\t\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\t\t\tif (arg_types)\n\t\t\t\t\tfprintf(compiler->verbose, \",\");\n\t\t\t} while (arg_types);\n\t\t}\n\t\tfprintf(compiler->verbose, \"], \");\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64);\n\tCHECK_ARGUMENT((type & 0xff) != GET_FLAG_TYPE(SLJIT_SET_CARRY) && (type & 0xff) != (GET_FLAG_TYPE(SLJIT_SET_CARRY) + 1));\n\tCHECK_ARGUMENT(op == SLJIT_MOV || op == SLJIT_MOV32\n\t\t|| (GET_OPCODE(op) >= SLJIT_AND && GET_OPCODE(op) <= SLJIT_XOR));\n\tCHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK));\n\n\tif ((type & 0xff) <= SLJIT_NOT_ZERO)\n\t\tCHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);\n\telse\n\t\tCHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)\n\t\t\t|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)\n\t\t\t|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));\n\n\tFUNCTION_CHECK_DST(dst, dstw, 0);\n\n\tif (GET_OPCODE(op) >= SLJIT_ADD)\n\t\tcompiler->last_flags = GET_FLAG_TYPE(op) | (op & (SLJIT_I32_OP | SLJIT_SET_Z));\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  flags%s %s%s, \",\n\t\t\t!(op & SLJIT_SET_Z) ? \"\" : \".z\",\n\t\t\tGET_OPCODE(op) < SLJIT_OP2_BASE ? \"mov\" : op2_names[GET_OPCODE(op) - SLJIT_OP2_BASE],\n\t\t\tGET_OPCODE(op) < SLJIT_OP2_BASE ? op1_names[GET_OPCODE(op) - SLJIT_OP1_BASE] : ((op & SLJIT_I32_OP) ? \"32\" : \"\"));\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", %s%s\\n\", jump_names[type & 0xff], JUMP_POSTFIX(type));\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64);\n\n\tCHECK_ARGUMENT(compiler->scratches != -1 && compiler->saveds != -1);\n\tCHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(dst_reg & ~SLJIT_I32_OP));\n\tif (src != SLJIT_IMM) {\n\t\tCHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(src));\n\t\tCHECK_ARGUMENT(srcw == 0);\n\t}\n\n\tif ((type & 0xff) <= SLJIT_NOT_ZERO)\n\t\tCHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z);\n\telse\n\t\tCHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)\n\t\t\t|| ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)\n\t\t\t|| ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  cmov%s %s%s, \",\n\t\t\t!(dst_reg & SLJIT_I32_OP) ? \"\" : \"32\",\n\t\t\tjump_names[type & 0xff], JUMP_POSTFIX(type));\n\t\tsljit_verbose_reg(compiler, dst_reg & ~SLJIT_I32_OP);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, src, srcw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT((type & 0xff) >= SLJIT_MOV && (type & 0xff) <= SLJIT_MOV_P);\n\tCHECK_ARGUMENT(!(type & SLJIT_I32_OP) || ((type & 0xff) != SLJIT_MOV && (type & 0xff) != SLJIT_MOV_U32 && (type & 0xff) != SLJIT_MOV_P));\n\tCHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));\n\tCHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST));\n\tCHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);\n\n\tFUNCTION_CHECK_SRC_MEM(mem, memw);\n\tCHECK_ARGUMENT(FUNCTION_CHECK_IS_REG(reg));\n\n\tCHECK_ARGUMENT((mem & REG_MASK) != SLJIT_UNUSED && (mem & REG_MASK) != reg);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tif (sljit_emit_mem(compiler, type | SLJIT_MEM_SUPP, reg, mem, memw) == SLJIT_ERR_UNSUPPORTED)\n\t\t\tfprintf(compiler->verbose, \"  //\");\n\n\t\tfprintf(compiler->verbose, \"  mem%s.%s%s%s \",\n\t\t\t!(type & SLJIT_I32_OP) ? \"\" : \"32\",\n\t\t\t(type & SLJIT_MEM_STORE) ? \"st\" : \"ld\",\n\t\t\top1_names[(type & 0xff) - SLJIT_OP1_BASE],\n\t\t\t(type & SLJIT_MEM_PRE) ? \".pre\" : \".post\");\n\t\tsljit_verbose_reg(compiler, reg);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, mem, memw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 freg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tCHECK_ARGUMENT((type & 0xff) == SLJIT_MOV_F64);\n\tCHECK_ARGUMENT((type & SLJIT_MEM_PRE) || (type & SLJIT_MEM_POST));\n\tCHECK_ARGUMENT((type & (SLJIT_MEM_PRE | SLJIT_MEM_POST)) != (SLJIT_MEM_PRE | SLJIT_MEM_POST));\n\tCHECK_ARGUMENT((type & ~(0xff | SLJIT_I32_OP | SLJIT_MEM_STORE | SLJIT_MEM_SUPP | SLJIT_MEM_PRE | SLJIT_MEM_POST)) == 0);\n\n\tFUNCTION_CHECK_SRC_MEM(mem, memw);\n\tCHECK_ARGUMENT(FUNCTION_CHECK_IS_FREG(freg));\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (!(type & SLJIT_MEM_SUPP) && SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tif (sljit_emit_fmem(compiler, type | SLJIT_MEM_SUPP, freg, mem, memw) == SLJIT_ERR_UNSUPPORTED)\n\t\t\tfprintf(compiler->verbose, \"  //\");\n\n\t\tfprintf(compiler->verbose, \"  fmem.%s%s%s \",\n\t\t\t(type & SLJIT_MEM_STORE) ? \"st\" : \"ld\",\n\t\t\t!(type & SLJIT_I32_OP) ? \".f64\" : \".f32\",\n\t\t\t(type & SLJIT_MEM_PRE) ? \".pre\" : \".post\");\n\t\tsljit_verbose_freg(compiler, freg);\n\t\tfprintf(compiler->verbose, \", \");\n\t\tsljit_verbose_param(compiler, mem, memw);\n\t\tfprintf(compiler->verbose, \"\\n\");\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)\n{\n\t/* Any offset is allowed. */\n\tSLJIT_UNUSED_ARG(offset);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tFUNCTION_CHECK_DST(dst, dstw, 0);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  local_base \");\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", #%\" SLJIT_PRINT_D \"d\\n\", offset);\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\nstatic SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tSLJIT_UNUSED_ARG(init_value);\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tFUNCTION_CHECK_DST(dst, dstw, 0);\n#endif\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tif (SLJIT_UNLIKELY(!!compiler->verbose)) {\n\t\tfprintf(compiler->verbose, \"  const \");\n\t\tsljit_verbose_param(compiler, dst, dstw);\n\t\tfprintf(compiler->verbose, \", #%\" SLJIT_PRINT_D \"d\\n\", init_value);\n\t}\n#endif\n\tCHECK_RETURN_OK;\n}\n\n#endif /* SLJIT_ARGUMENT_CHECKS || SLJIT_VERBOSE */\n\n#define SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw) \\\n\tSLJIT_COMPILE_ASSERT(!(SLJIT_CONV_SW_FROM_F64 & 0x1) && !(SLJIT_CONV_F64_FROM_SW & 0x1), \\\n\t\tinvalid_float_opcodes); \\\n\tif (GET_OPCODE(op) >= SLJIT_CONV_SW_FROM_F64 && GET_OPCODE(op) <= SLJIT_CMP_F64) { \\\n\t\tif (GET_OPCODE(op) == SLJIT_CMP_F64) { \\\n\t\t\tCHECK(check_sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw)); \\\n\t\t\tADJUST_LOCAL_OFFSET(dst, dstw); \\\n\t\t\tADJUST_LOCAL_OFFSET(src, srcw); \\\n\t\t\treturn sljit_emit_fop1_cmp(compiler, op, dst, dstw, src, srcw); \\\n\t\t} \\\n\t\tif ((GET_OPCODE(op) | 0x1) == SLJIT_CONV_S32_FROM_F64) { \\\n\t\t\tCHECK(check_sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw)); \\\n\t\t\tADJUST_LOCAL_OFFSET(dst, dstw); \\\n\t\t\tADJUST_LOCAL_OFFSET(src, srcw); \\\n\t\t\treturn sljit_emit_fop1_conv_sw_from_f64(compiler, op, dst, dstw, src, srcw); \\\n\t\t} \\\n\t\tCHECK(check_sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw)); \\\n\t\tADJUST_LOCAL_OFFSET(dst, dstw); \\\n\t\tADJUST_LOCAL_OFFSET(src, srcw); \\\n\t\treturn sljit_emit_fop1_conv_f64_from_sw(compiler, op, dst, dstw, src, srcw); \\\n\t} \\\n\tCHECK(check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw)); \\\n\tADJUST_LOCAL_OFFSET(dst, dstw); \\\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\nstatic SLJIT_INLINE sljit_s32 emit_mov_before_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\t/* Return if don't need to do anything. */\n\tif (op == SLJIT_UNUSED)\n\t\treturn SLJIT_SUCCESS;\n\n#if (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n\t/* At the moment the pointer size is always equal to sljit_sw. May be changed in the future. */\n\tif (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_P))\n\t\treturn SLJIT_SUCCESS;\n#else\n\tif (src == SLJIT_RETURN_REG && (op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P))\n\t\treturn SLJIT_SUCCESS;\n#endif\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \\\n\t\t|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tcompiler->skip_checks = 1;\n#endif\n\treturn sljit_emit_op1(compiler, op, SLJIT_RETURN_REG, 0, src, srcw);\n}\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \\\n\t\t|| (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) \\\n\t\t|| (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) \\\n\t\t|| ((defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) && !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1))\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_cmov_generic(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tsljit_s32 op = (dst_reg & SLJIT_I32_OP) ? SLJIT_MOV32 : SLJIT_MOV;\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tjump = sljit_emit_jump(compiler, type ^ 0x1);\n\tFAIL_IF(!jump);\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tFAIL_IF(sljit_emit_op1(compiler, op, dst_reg & ~SLJIT_I32_OP, 0, src, srcw));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tlabel = sljit_emit_label(compiler);\n\tFAIL_IF(!label);\n\tsljit_set_label(jump, label);\n\treturn SLJIT_SUCCESS;\n}\n\n#endif\n\n/* CPU description section */\n\n#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)\n#define SLJIT_CPUINFO_PART1 \" 32bit (\"\n#elif (defined SLJIT_64BIT_ARCHITECTURE && SLJIT_64BIT_ARCHITECTURE)\n#define SLJIT_CPUINFO_PART1 \" 64bit (\"\n#else\n#error \"Internal error: CPU type info missing\"\n#endif\n\n#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)\n#define SLJIT_CPUINFO_PART2 \"little endian + \"\n#elif (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)\n#define SLJIT_CPUINFO_PART2 \"big endian + \"\n#else\n#error \"Internal error: CPU type info missing\"\n#endif\n\n#if (defined SLJIT_UNALIGNED && SLJIT_UNALIGNED)\n#define SLJIT_CPUINFO_PART3 \"unaligned)\"\n#else\n#define SLJIT_CPUINFO_PART3 \"aligned)\"\n#endif\n\n#define SLJIT_CPUINFO SLJIT_CPUINFO_PART1 SLJIT_CPUINFO_PART2 SLJIT_CPUINFO_PART3\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n#\tinclude \"sljitNativeX86_common.c\"\n#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n#\tinclude \"sljitNativeARM_32.c\"\n#elif (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n#\tinclude \"sljitNativeARM_32.c\"\n#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)\n#\tinclude \"sljitNativeARM_T2_32.c\"\n#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n#\tinclude \"sljitNativeARM_64.c\"\n#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n#\tinclude \"sljitNativePPC_common.c\"\n#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n#\tinclude \"sljitNativeMIPS_common.c\"\n#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)\n#\tinclude \"sljitNativeSPARC_common.c\"\n#elif (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)\n#\tinclude \"sljitNativeTILEGX_64.c\"\n#endif\n\n#if !(defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* Default compare for most architectures. */\n\tsljit_s32 flags, tmp_src, condition;\n\tsljit_sw tmp_srcw;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));\n\n\tcondition = type & 0xff;\n#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n\tif ((condition == SLJIT_EQUAL || condition == SLJIT_NOT_EQUAL)) {\n\t\tif ((src1 & SLJIT_IMM) && !src1w) {\n\t\t\tsrc1 = src2;\n\t\t\tsrc1w = src2w;\n\t\t\tsrc2 = SLJIT_IMM;\n\t\t\tsrc2w = 0;\n\t\t}\n\t\tif ((src2 & SLJIT_IMM) && !src2w)\n\t\t\treturn emit_cmp_to0(compiler, type, src1, src1w);\n\t}\n#endif\n\n\tif (SLJIT_UNLIKELY((src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM))) {\n\t\t/* Immediate is prefered as second argument by most architectures. */\n\t\tswitch (condition) {\n\t\tcase SLJIT_LESS:\n\t\t\tcondition = SLJIT_GREATER;\n\t\t\tbreak;\n\t\tcase SLJIT_GREATER_EQUAL:\n\t\t\tcondition = SLJIT_LESS_EQUAL;\n\t\t\tbreak;\n\t\tcase SLJIT_GREATER:\n\t\t\tcondition = SLJIT_LESS;\n\t\t\tbreak;\n\t\tcase SLJIT_LESS_EQUAL:\n\t\t\tcondition = SLJIT_GREATER_EQUAL;\n\t\t\tbreak;\n\t\tcase SLJIT_SIG_LESS:\n\t\t\tcondition = SLJIT_SIG_GREATER;\n\t\t\tbreak;\n\t\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\t\tcondition = SLJIT_SIG_LESS_EQUAL;\n\t\t\tbreak;\n\t\tcase SLJIT_SIG_GREATER:\n\t\t\tcondition = SLJIT_SIG_LESS;\n\t\t\tbreak;\n\t\tcase SLJIT_SIG_LESS_EQUAL:\n\t\t\tcondition = SLJIT_SIG_GREATER_EQUAL;\n\t\t\tbreak;\n\t\t}\n\n\t\ttype = condition | (type & (SLJIT_I32_OP | SLJIT_REWRITABLE_JUMP));\n\t\ttmp_src = src1;\n\t\tsrc1 = src2;\n\t\tsrc2 = tmp_src;\n\t\ttmp_srcw = src1w;\n\t\tsrc1w = src2w;\n\t\tsrc2w = tmp_srcw;\n\t}\n\n\tif (condition <= SLJIT_NOT_ZERO)\n\t\tflags = SLJIT_SET_Z;\n\telse\n\t\tflags = condition << VARIABLE_FLAG_SHIFT;\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tPTR_FAIL_IF(sljit_emit_op2(compiler, SLJIT_SUB | flags | (type & SLJIT_I32_OP),\n\t\tSLJIT_UNUSED, 0, src1, src1w, src2, src2w));\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\treturn sljit_emit_jump(compiler, condition | (type & (SLJIT_REWRITABLE_JUMP | SLJIT_I32_OP)));\n}\n\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tsljit_emit_fop1(compiler, SLJIT_CMP_F64 | ((type & 0xff) << VARIABLE_FLAG_SHIFT) | (type & SLJIT_I32_OP), src1, src1w, src2, src2w);\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\treturn sljit_emit_jump(compiler, type);\n}\n\n#if !(defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \\\n\t&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(reg);\n\tSLJIT_UNUSED_ARG(mem);\n\tSLJIT_UNUSED_ARG(memw);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));\n\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\n#endif\n\n#if !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \\\n\t&& !(defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 freg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(freg);\n\tSLJIT_UNUSED_ARG(mem);\n\tSLJIT_UNUSED_ARG(memw);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));\n\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\n#endif\n\n#if !(defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) \\\n\t&& !(defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));\n\n\tADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tif (offset != 0)\n\t\treturn sljit_emit_op2(compiler, SLJIT_ADD, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);\n\treturn sljit_emit_op1(compiler, SLJIT_MOV, dst, dstw, SLJIT_SP, 0);\n}\n\n#endif\n\n#else /* SLJIT_CONFIG_UNSUPPORTED */\n\n/* Empty function bodies for those machines, which are not (yet) supported. */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n\treturn \"unsupported\";\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data)\n{\n\tSLJIT_UNUSED_ARG(allocator_data);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(size);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\nSLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(verbose);\n\tSLJIT_UNREACHABLE();\n}\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tSLJIT_UNUSED_ARG(feature_type);\n\tSLJIT_UNREACHABLE();\n\treturn 0;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code)\n{\n\tSLJIT_UNUSED_ARG(code);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(options);\n\tSLJIT_UNUSED_ARG(arg_types);\n\tSLJIT_UNUSED_ARG(scratches);\n\tSLJIT_UNUSED_ARG(saveds);\n\tSLJIT_UNUSED_ARG(fscratches);\n\tSLJIT_UNUSED_ARG(fsaveds);\n\tSLJIT_UNUSED_ARG(local_size);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(options);\n\tSLJIT_UNUSED_ARG(arg_types);\n\tSLJIT_UNUSED_ARG(scratches);\n\tSLJIT_UNUSED_ARG(saveds);\n\tSLJIT_UNUSED_ARG(fscratches);\n\tSLJIT_UNUSED_ARG(fsaveds);\n\tSLJIT_UNUSED_ARG(local_size);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(src1);\n\tSLJIT_UNUSED_ARG(src1w);\n\tSLJIT_UNUSED_ARG(src2);\n\tSLJIT_UNUSED_ARG(src2w);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tSLJIT_UNREACHABLE();\n\treturn reg;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(instruction);\n\tSLJIT_UNUSED_ARG(size);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(current_flags);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(src1);\n\tSLJIT_UNUSED_ARG(src1w);\n\tSLJIT_UNUSED_ARG(src2);\n\tSLJIT_UNUSED_ARG(src2w);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(arg_types);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(src1);\n\tSLJIT_UNUSED_ARG(src1w);\n\tSLJIT_UNUSED_ARG(src2);\n\tSLJIT_UNUSED_ARG(src2w);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(src1);\n\tSLJIT_UNUSED_ARG(src1w);\n\tSLJIT_UNUSED_ARG(src2);\n\tSLJIT_UNUSED_ARG(src2w);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label)\n{\n\tSLJIT_UNUSED_ARG(jump);\n\tSLJIT_UNUSED_ARG(label);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target)\n{\n\tSLJIT_UNUSED_ARG(jump);\n\tSLJIT_UNUSED_ARG(target);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(arg_types);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(op);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(dst_reg);\n\tSLJIT_UNUSED_ARG(src);\n\tSLJIT_UNUSED_ARG(srcw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 reg, sljit_s32 mem, sljit_sw memw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(reg);\n\tSLJIT_UNUSED_ARG(mem);\n\tSLJIT_UNUSED_ARG(memw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 freg, sljit_s32 mem, sljit_sw memw)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(type);\n\tSLJIT_UNUSED_ARG(freg);\n\tSLJIT_UNUSED_ARG(mem);\n\tSLJIT_UNUSED_ARG(memw);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(offset);\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw initval)\n{\n\tSLJIT_UNUSED_ARG(compiler);\n\tSLJIT_UNUSED_ARG(dst);\n\tSLJIT_UNUSED_ARG(dstw);\n\tSLJIT_UNUSED_ARG(initval);\n\tSLJIT_UNREACHABLE();\n\treturn NULL;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tSLJIT_UNUSED_ARG(addr);\n\tSLJIT_UNUSED_ARG(new_target);\n\tSLJIT_UNUSED_ARG(executable_offset);\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tSLJIT_UNUSED_ARG(addr);\n\tSLJIT_UNUSED_ARG(new_constant);\n\tSLJIT_UNUSED_ARG(executable_offset);\n\tSLJIT_UNREACHABLE();\n}\n\n#endif\n"
  },
  {
    "path": "src/pcre/sljit/sljitLir.h",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef _SLJIT_LIR_H_\n#define _SLJIT_LIR_H_\n\n/*\n   ------------------------------------------------------------------------\n    Stack-Less JIT compiler for multiple architectures (x86, ARM, PowerPC)\n   ------------------------------------------------------------------------\n\n   Short description\n    Advantages:\n      - The execution can be continued from any LIR instruction. In other\n        words, it is possible to jump to any label from anywhere, even from\n        a code fragment, which is compiled later, if both compiled code\n        shares the same context. See sljit_emit_enter for more details\n      - Supports self modifying code: target of (conditional) jump and call\n        instructions and some constant values can be dynamically modified\n        during runtime\n        - although it is not suggested to do it frequently\n        - can be used for inline caching: save an important value once\n          in the instruction stream\n        - since this feature limits the optimization possibilities, a\n          special flag must be passed at compile time when these\n          instructions are emitted\n      - A fixed stack space can be allocated for local variables\n      - The compiler is thread-safe\n      - The compiler is highly configurable through preprocessor macros.\n        You can disable unneeded features (multithreading in single\n        threaded applications), and you can use your own system functions\n        (including memory allocators). See sljitConfig.h\n    Disadvantages:\n      - No automatic register allocation, and temporary results are\n        not stored on the stack. (hence the name comes)\n    In practice:\n      - This approach is very effective for interpreters\n        - One of the saved registers typically points to a stack interface\n        - It can jump to any exception handler anytime (even if it belongs\n          to another function)\n        - Hot paths can be modified during runtime reflecting the changes\n          of the fastest execution path of the dynamic language\n        - SLJIT supports complex memory addressing modes\n        - mainly position and context independent code (except some cases)\n\n    For valgrind users:\n      - pass --smc-check=all argument to valgrind, since JIT is a \"self-modifying code\"\n*/\n\n#if !(defined SLJIT_NO_DEFAULT_CONFIG && SLJIT_NO_DEFAULT_CONFIG)\n#include \"sljitConfig.h\"\n#endif\n\n/* The following header file defines useful macros for fine tuning\nsljit based code generators. They are listed in the beginning\nof sljitConfigInternal.h */\n\n#include \"sljitConfigInternal.h\"\n\n/* --------------------------------------------------------------------- */\n/*  Error codes                                                          */\n/* --------------------------------------------------------------------- */\n\n/* Indicates no error. */\n#define SLJIT_SUCCESS\t\t\t0\n/* After the call of sljit_generate_code(), the error code of the compiler\n   is set to this value to avoid future sljit calls (in debug mode at least).\n   The complier should be freed after sljit_generate_code(). */\n#define SLJIT_ERR_COMPILED\t\t1\n/* Cannot allocate non executable memory. */\n#define SLJIT_ERR_ALLOC_FAILED\t\t2\n/* Cannot allocate executable memory.\n   Only for sljit_generate_code() */\n#define SLJIT_ERR_EX_ALLOC_FAILED\t3\n/* Return value for SLJIT_CONFIG_UNSUPPORTED placeholder architecture. */\n#define SLJIT_ERR_UNSUPPORTED\t\t4\n/* An ivalid argument is passed to any SLJIT function. */\n#define SLJIT_ERR_BAD_ARGUMENT\t\t5\n/* Dynamic code modification is not enabled. */\n#define SLJIT_ERR_DYN_CODE_MOD\t\t6\n\n/* --------------------------------------------------------------------- */\n/*  Registers                                                            */\n/* --------------------------------------------------------------------- */\n\n/*\n  Scratch (R) registers: registers whose may not preserve their values\n  across function calls.\n\n  Saved (S) registers: registers whose preserve their values across\n  function calls.\n\n  The scratch and saved register sets are overlap. The last scratch register\n  is the first saved register, the one before the last is the second saved\n  register, and so on.\n\n  If an architecture provides two scratch and three saved registers,\n  its scratch and saved register sets are the following:\n\n     R0   |        |   R0 is always a scratch register\n     R1   |        |   R1 is always a scratch register\n    [R2]  |   S2   |   R2 and S2 represent the same physical register\n    [R3]  |   S1   |   R3 and S1 represent the same physical register\n    [R4]  |   S0   |   R4 and S0 represent the same physical register\n\n  Note: SLJIT_NUMBER_OF_SCRATCH_REGISTERS would be 2 and\n        SLJIT_NUMBER_OF_SAVED_REGISTERS would be 3 for this architecture.\n\n  Note: On all supported architectures SLJIT_NUMBER_OF_REGISTERS >= 12\n        and SLJIT_NUMBER_OF_SAVED_REGISTERS >= 6. However, 6 registers\n        are virtual on x86-32. See below.\n\n  The purpose of this definition is convenience: saved registers can\n  be used as extra scratch registers. For example four registers can\n  be specified as scratch registers and the fifth one as saved register\n  on the CPU above and any user code which requires four scratch\n  registers can run unmodified. The SLJIT compiler automatically saves\n  the content of the two extra scratch register on the stack. Scratch\n  registers can also be preserved by saving their value on the stack\n  but this needs to be done manually.\n\n  Note: To emphasize that registers assigned to R2-R4 are saved\n        registers, they are enclosed by square brackets.\n\n  Note: sljit_emit_enter and sljit_set_context defines whether a register\n        is S or R register. E.g: when 3 scratches and 1 saved is mapped\n        by sljit_emit_enter, the allowed register set will be: R0-R2 and\n        S0. Although S2 is mapped to the same position as R2, it does not\n        available in the current configuration. Furthermore the S1 register\n        is not available at all.\n*/\n\n/* When SLJIT_UNUSED is specified as the destination of sljit_emit_op1\n   or sljit_emit_op2 operations the result is discarded. If no status\n   flags are set, no instructions are emitted for these operations. Data\n   prefetch is a special exception, see SLJIT_MOV operation. Other SLJIT\n   operations do not support SLJIT_UNUSED as a destination operand. */\n#define SLJIT_UNUSED\t\t0\n\n/* Scratch registers. */\n#define SLJIT_R0\t1\n#define SLJIT_R1\t2\n#define SLJIT_R2\t3\n/* Note: on x86-32, R3 - R6 (same as S3 - S6) are emulated (they\n   are allocated on the stack). These registers are called virtual\n   and cannot be used for memory addressing (cannot be part of\n   any SLJIT_MEM1, SLJIT_MEM2 construct). There is no such\n   limitation on other CPUs. See sljit_get_register_index(). */\n#define SLJIT_R3\t4\n#define SLJIT_R4\t5\n#define SLJIT_R5\t6\n#define SLJIT_R6\t7\n#define SLJIT_R7\t8\n#define SLJIT_R8\t9\n#define SLJIT_R9\t10\n/* All R registers provided by the architecture can be accessed by SLJIT_R(i)\n   The i parameter must be >= 0 and < SLJIT_NUMBER_OF_REGISTERS. */\n#define SLJIT_R(i)\t(1 + (i))\n\n/* Saved registers. */\n#define SLJIT_S0\t(SLJIT_NUMBER_OF_REGISTERS)\n#define SLJIT_S1\t(SLJIT_NUMBER_OF_REGISTERS - 1)\n#define SLJIT_S2\t(SLJIT_NUMBER_OF_REGISTERS - 2)\n/* Note: on x86-32, S3 - S6 (same as R3 - R6) are emulated (they\n   are allocated on the stack). These registers are called virtual\n   and cannot be used for memory addressing (cannot be part of\n   any SLJIT_MEM1, SLJIT_MEM2 construct). There is no such\n   limitation on other CPUs. See sljit_get_register_index(). */\n#define SLJIT_S3\t(SLJIT_NUMBER_OF_REGISTERS - 3)\n#define SLJIT_S4\t(SLJIT_NUMBER_OF_REGISTERS - 4)\n#define SLJIT_S5\t(SLJIT_NUMBER_OF_REGISTERS - 5)\n#define SLJIT_S6\t(SLJIT_NUMBER_OF_REGISTERS - 6)\n#define SLJIT_S7\t(SLJIT_NUMBER_OF_REGISTERS - 7)\n#define SLJIT_S8\t(SLJIT_NUMBER_OF_REGISTERS - 8)\n#define SLJIT_S9\t(SLJIT_NUMBER_OF_REGISTERS - 9)\n/* All S registers provided by the architecture can be accessed by SLJIT_S(i)\n   The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_REGISTERS. */\n#define SLJIT_S(i)\t(SLJIT_NUMBER_OF_REGISTERS - (i))\n\n/* Registers >= SLJIT_FIRST_SAVED_REG are saved registers. */\n#define SLJIT_FIRST_SAVED_REG (SLJIT_S0 - SLJIT_NUMBER_OF_SAVED_REGISTERS + 1)\n\n/* The SLJIT_SP provides direct access to the linear stack space allocated by\n   sljit_emit_enter. It can only be used in the following form: SLJIT_MEM1(SLJIT_SP).\n   The immediate offset is extended by the relative stack offset automatically.\n   The sljit_get_local_base can be used to obtain the absolute offset. */\n#define SLJIT_SP\t(SLJIT_NUMBER_OF_REGISTERS + 1)\n\n/* Return with machine word. */\n\n#define SLJIT_RETURN_REG\tSLJIT_R0\n\n/* --------------------------------------------------------------------- */\n/*  Floating point registers                                             */\n/* --------------------------------------------------------------------- */\n\n/* Each floating point register can store a 32 or a 64 bit precision\n   value. The FR and FS register sets are overlap in the same way as R\n   and S register sets. See above. */\n\n/* Note: SLJIT_UNUSED as destination is not valid for floating point\n   operations, since they cannot be used for setting flags. */\n\n/* Floating point scratch registers. */\n#define SLJIT_FR0\t1\n#define SLJIT_FR1\t2\n#define SLJIT_FR2\t3\n#define SLJIT_FR3\t4\n#define SLJIT_FR4\t5\n#define SLJIT_FR5\t6\n/* All FR registers provided by the architecture can be accessed by SLJIT_FR(i)\n   The i parameter must be >= 0 and < SLJIT_NUMBER_OF_FLOAT_REGISTERS. */\n#define SLJIT_FR(i)\t(1 + (i))\n\n/* Floating point saved registers. */\n#define SLJIT_FS0\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS)\n#define SLJIT_FS1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 1)\n#define SLJIT_FS2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 2)\n#define SLJIT_FS3\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 3)\n#define SLJIT_FS4\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 4)\n#define SLJIT_FS5\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - 5)\n/* All S registers provided by the architecture can be accessed by SLJIT_FS(i)\n   The i parameter must be >= 0 and < SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS. */\n#define SLJIT_FS(i)\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS - (i))\n\n/* Float registers >= SLJIT_FIRST_SAVED_FLOAT_REG are saved registers. */\n#define SLJIT_FIRST_SAVED_FLOAT_REG (SLJIT_FS0 - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS + 1)\n\n/* --------------------------------------------------------------------- */\n/*  Argument type definitions                                            */\n/* --------------------------------------------------------------------- */\n\n/* Argument type definitions.\n   Used by SLJIT_[DEF_]ARGx and SLJIT_[DEF]_RET macros. */\n\n#define SLJIT_ARG_TYPE_VOID 0\n#define SLJIT_ARG_TYPE_SW 1\n#define SLJIT_ARG_TYPE_UW 2\n#define SLJIT_ARG_TYPE_S32 3\n#define SLJIT_ARG_TYPE_U32 4\n#define SLJIT_ARG_TYPE_F32 5\n#define SLJIT_ARG_TYPE_F64 6\n\n/* The following argument type definitions are used by sljit_emit_enter,\n   sljit_set_context, sljit_emit_call, and sljit_emit_icall functions.\n   The following return type definitions are used by sljit_emit_call\n   and sljit_emit_icall functions.\n\n   When a function is called, the first integer argument must be placed\n   in SLJIT_R0, the second in SLJIT_R1, and so on. Similarly the first\n   floating point argument must be placed in SLJIT_FR0, the second in\n   SLJIT_FR1, and so on.\n\n   Example function definition:\n     sljit_f32 SLJIT_FUNC example_c_callback(sljit_sw arg_a,\n         sljit_f64 arg_b, sljit_u32 arg_c, sljit_f32 arg_d);\n\n   Argument type definition:\n     SLJIT_DEF_RET(SLJIT_ARG_TYPE_F32)\n        | SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_SW) | SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_F64)\n        | SLJIT_DEF_ARG3(SLJIT_ARG_TYPE_U32) | SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_F32)\n\n   Short form of argument type definition:\n     SLJIT_RET(F32) | SLJIT_ARG1(SW) | SLJIT_ARG2(F64)\n        | SLJIT_ARG3(S32) | SLJIT_ARG4(F32)\n\n   Argument passing:\n     arg_a must be placed in SLJIT_R0\n     arg_c must be placed in SLJIT_R1\n     arg_b must be placed in SLJIT_FR0\n     arg_d must be placed in SLJIT_FR1\n\nNote:\n   The SLJIT_ARG_TYPE_VOID type is only supported by\n   SLJIT_DEF_RET, and SLJIT_ARG_TYPE_VOID is also the\n   default value when SLJIT_DEF_RET is not specified. */\n#define SLJIT_DEF_SHIFT 4\n#define SLJIT_DEF_RET(type) (type)\n#define SLJIT_DEF_ARG1(type) ((type) << SLJIT_DEF_SHIFT)\n#define SLJIT_DEF_ARG2(type) ((type) << (2 * SLJIT_DEF_SHIFT))\n#define SLJIT_DEF_ARG3(type) ((type) << (3 * SLJIT_DEF_SHIFT))\n#define SLJIT_DEF_ARG4(type) ((type) << (4 * SLJIT_DEF_SHIFT))\n\n/* Short form of the macros above.\n\n   For example the following definition:\n   SLJIT_DEF_RET(SLJIT_ARG_TYPE_SW) | SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_F32)\n\n   can be shortened to:\n   SLJIT_RET(SW) | SLJIT_ARG1(F32)\n\nNote:\n   The VOID type is only supported by SLJIT_RET, and\n   VOID is also the default value when SLJIT_RET is\n   not specified. */\n#define SLJIT_RET(type) SLJIT_DEF_RET(SLJIT_ARG_TYPE_ ## type)\n#define SLJIT_ARG1(type) SLJIT_DEF_ARG1(SLJIT_ARG_TYPE_ ## type)\n#define SLJIT_ARG2(type) SLJIT_DEF_ARG2(SLJIT_ARG_TYPE_ ## type)\n#define SLJIT_ARG3(type) SLJIT_DEF_ARG3(SLJIT_ARG_TYPE_ ## type)\n#define SLJIT_ARG4(type) SLJIT_DEF_ARG4(SLJIT_ARG_TYPE_ ## type)\n\n/* --------------------------------------------------------------------- */\n/*  Main structures and functions                                        */\n/* --------------------------------------------------------------------- */\n\n/*\n\tThe following structures are private, and can be changed in the\n\tfuture. Keeping them here allows code inlining.\n*/\n\nstruct sljit_memory_fragment {\n\tstruct sljit_memory_fragment *next;\n\tsljit_uw used_size;\n\t/* Must be aligned to sljit_sw. */\n\tsljit_u8 memory[1];\n};\n\nstruct sljit_label {\n\tstruct sljit_label *next;\n\tsljit_uw addr;\n\t/* The maximum size difference. */\n\tsljit_uw size;\n};\n\nstruct sljit_jump {\n\tstruct sljit_jump *next;\n\tsljit_uw addr;\n\tsljit_sw flags;\n\tunion {\n\t\tsljit_uw target;\n\t\tstruct sljit_label* label;\n\t} u;\n};\n\nstruct sljit_const {\n\tstruct sljit_const *next;\n\tsljit_uw addr;\n};\n\nstruct sljit_compiler {\n\tsljit_s32 error;\n\tsljit_s32 options;\n\n\tstruct sljit_label *labels;\n\tstruct sljit_jump *jumps;\n\tstruct sljit_const *consts;\n\tstruct sljit_label *last_label;\n\tstruct sljit_jump *last_jump;\n\tstruct sljit_const *last_const;\n\n\tvoid *allocator_data;\n\tstruct sljit_memory_fragment *buf;\n\tstruct sljit_memory_fragment *abuf;\n\n\t/* Used scratch registers. */\n\tsljit_s32 scratches;\n\t/* Used saved registers. */\n\tsljit_s32 saveds;\n\t/* Used float scratch registers. */\n\tsljit_s32 fscratches;\n\t/* Used float saved registers. */\n\tsljit_s32 fsaveds;\n\t/* Local stack size. */\n\tsljit_s32 local_size;\n\t/* Code size. */\n\tsljit_uw size;\n\t/* Relative offset of the executable mapping from the writable mapping. */\n\tsljit_uw executable_offset;\n\t/* Executable size for statistical purposes. */\n\tsljit_uw executable_size;\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tsljit_s32 args;\n\tsljit_s32 locals_offset;\n\tsljit_s32 saveds_offset;\n\tsljit_s32 stack_tmp_size;\n#endif\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tsljit_s32 mode32;\n#ifdef _WIN64\n\tsljit_s32 locals_offset;\n#endif\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t/* Constant pool handling. */\n\tsljit_uw *cpool;\n\tsljit_u8 *cpool_unique;\n\tsljit_uw cpool_diff;\n\tsljit_uw cpool_fill;\n\t/* Other members. */\n\t/* Contains pointer, \"ldr pc, [...]\" pairs. */\n\tsljit_uw patches;\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\t/* Temporary fields. */\n\tsljit_uw shift_imm;\n#endif\n\n#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)\n\tsljit_sw imm;\n#endif\n\n#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)\n\tsljit_s32 delay_slot;\n\tsljit_s32 cache_arg;\n\tsljit_sw cache_argw;\n#endif\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\tsljit_s32 delay_slot;\n\tsljit_s32 cache_arg;\n\tsljit_sw cache_argw;\n#endif\n\n#if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)\n\tsljit_s32 cache_arg;\n\tsljit_sw cache_argw;\n#endif\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\tFILE* verbose;\n#endif\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \\\n\t\t|| (defined SLJIT_DEBUG && SLJIT_DEBUG)\n\t/* Flags specified by the last arithmetic instruction.\n\t   It contains the type of the variable flag. */\n\tsljit_s32 last_flags;\n\t/* Local size passed to the functions. */\n\tsljit_s32 logical_local_size;\n#endif\n\n#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \\\n\t\t|| (defined SLJIT_DEBUG && SLJIT_DEBUG) \\\n\t\t|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n\t/* Trust arguments when the API function is called. */\n\tsljit_s32 skip_checks;\n#endif\n};\n\n/* --------------------------------------------------------------------- */\n/*  Main functions                                                       */\n/* --------------------------------------------------------------------- */\n\n/* Creates an sljit compiler. The allocator_data is required by some\n   custom memory managers. This pointer is passed to SLJIT_MALLOC\n   and SLJIT_FREE macros. Most allocators (including the default\n   one) ignores this value, and it is recommended to pass NULL\n   as a dummy value for allocator_data.\n\n   Returns NULL if failed. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data);\n\n/* Frees everything except the compiled machine code. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler);\n\n/* Returns the current error code. If an error is occurred, future sljit\n   calls which uses the same compiler argument returns early with the same\n   error code. Thus there is no need for checking the error after every\n   call, it is enough to do it before the code is compiled. Removing\n   these checks increases the performance of the compiling process. */\nstatic SLJIT_INLINE sljit_s32 sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; }\n\n/* Sets the compiler error code to SLJIT_ERR_ALLOC_FAILED except\n   if an error was detected before. After the error code is set\n   the compiler behaves as if the allocation failure happened\n   during an sljit function call. This can greatly simplify error\n   checking, since only the compiler status needs to be checked\n   after the compilation. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler);\n\n/*\n   Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit,\n   and <= 128 bytes on 64 bit architectures. The memory area is owned by the\n   compiler, and freed by sljit_free_compiler. The returned pointer is\n   sizeof(sljit_sw) aligned. Excellent for allocating small blocks during\n   the compiling, and no need to worry about freeing them. The size is\n   enough to contain at most 16 pointers. If the size is outside of the range,\n   the function will return with NULL. However, this return value does not\n   indicate that there is no more memory (does not set the current error code\n   of the compiler to out-of-memory status).\n*/\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size);\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)\n/* Passing NULL disables verbose. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_compiler_verbose(struct sljit_compiler *compiler, FILE* verbose);\n#endif\n\n/*\n   Create executable code from the sljit instruction stream. This is the final step\n   of the code generation so no more instructions can be added after this call.\n*/\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler);\n\n/* Free executable code. */\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_code(void* code);\n\n/*\n   When the protected executable allocator is used the JIT code is mapped\n   twice. The first mapping has read/write and the second mapping has read/exec\n   permissions. This function returns with the relative offset of the executable\n   mapping using the writable mapping as the base after the machine code is\n   successfully generated. The returned value is always 0 for the normal executable\n   allocator, since it uses only one mapping with read/write/exec permissions.\n   Dynamic code modifications requires this value.\n\n   Before a successful code generation, this function returns with 0.\n*/\nstatic SLJIT_INLINE sljit_sw sljit_get_executable_offset(struct sljit_compiler *compiler) { return compiler->executable_offset; }\n\n/*\n   The executable memory consumption of the generated code can be retrieved by\n   this function. The returned value can be used for statistical purposes.\n\n   Before a successful code generation, this function returns with 0.\n*/\nstatic SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler *compiler) { return compiler->executable_size; }\n\n/* Returns with non-zero if the feature or limitation type passed as its\n   argument is present on the current CPU.\n\n   Some features (e.g. floating point operations) require hardware (CPU)\n   support while others (e.g. move with update) are emulated if not available.\n   However even if a feature is emulated, specialized code paths can be faster\n   than the emulation. Some limitations are emulated as well so their general\n   case is supported but it has extra performance costs. */\n\n/* [Not emulated] Floating-point support is available. */\n#define SLJIT_HAS_FPU\t\t\t0\n/* [Limitation] Some registers are virtual registers. */\n#define SLJIT_HAS_VIRTUAL_REGISTERS\t1\n/* [Emulated] Count leading zero is supported. */\n#define SLJIT_HAS_CLZ\t\t\t2\n/* [Emulated] Conditional move is supported. */\n#define SLJIT_HAS_CMOV\t\t\t3\n\n#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)\n/* [Not emulated] SSE2 support is available on x86. */\n#define SLJIT_HAS_SSE2\t\t\t100\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type);\n\n/* Instruction generation. Returns with any error code. If there is no\n   error, they return with SLJIT_SUCCESS. */\n\n/*\n   The executable code is a function from the viewpoint of the C\n   language. The function calls must obey to the ABI (Application\n   Binary Interface) of the platform, which specify the purpose of\n   machine registers and stack handling among other things. The\n   sljit_emit_enter function emits the necessary instructions for\n   setting up a new context for the executable code and moves function\n   arguments to the saved registers. Furthermore the options argument\n   can be used to pass configuration options to the compiler. The\n   available options are listed before sljit_emit_enter.\n\n   The function argument list is the combination of SLJIT_ARGx\n   (SLJIT_DEF_ARG1) macros. Currently maximum 3 SW / UW\n   (SLJIT_ARG_TYPE_SW / LJIT_ARG_TYPE_UW) arguments are supported.\n   The first argument goes to SLJIT_S0, the second goes to SLJIT_S1\n   and so on. The register set used by the function must be declared\n   as well. The number of scratch and saved registers used by the\n   function must be passed to sljit_emit_enter. Only R registers\n   between R0 and \"scratches\" argument can be used later. E.g. if\n   \"scratches\" is set to 2, the scratch register set will be limited\n   to SLJIT_R0 and SLJIT_R1. The S registers and the floating point\n   registers (\"fscratches\" and \"fsaveds\") are specified in a similar\n   manner. The sljit_emit_enter is also capable of allocating a stack\n   space for local variables. The \"local_size\" argument contains the\n   size in bytes of this local area and its staring address is stored\n   in SLJIT_SP. The memory area between SLJIT_SP (inclusive) and\n   SLJIT_SP + local_size (exclusive) can be modified freely until\n   the function returns. The stack space is not initialized.\n\n   Note: the following conditions must met:\n         0 <= scratches <= SLJIT_NUMBER_OF_REGISTERS\n         0 <= saveds <= SLJIT_NUMBER_OF_REGISTERS\n         scratches + saveds <= SLJIT_NUMBER_OF_REGISTERS\n         0 <= fscratches <= SLJIT_NUMBER_OF_FLOAT_REGISTERS\n         0 <= fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS\n         fscratches + fsaveds <= SLJIT_NUMBER_OF_FLOAT_REGISTERS\n\n   Note: every call of sljit_emit_enter and sljit_set_context\n         overwrites the previous context.\n*/\n\n/* The absolute address returned by sljit_get_local_base with\noffset 0 is aligned to sljit_f64. Otherwise it is aligned to sljit_sw. */\n#define SLJIT_F64_ALIGNMENT 0x00000001\n\n/* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */\n#define SLJIT_MAX_LOCAL_SIZE\t65536\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size);\n\n/* The machine code has a context (which contains the local stack space size,\n   number of used registers, etc.) which initialized by sljit_emit_enter. Several\n   functions (like sljit_emit_return) requres this context to be able to generate\n   the appropriate code. However, some code fragments (like inline cache) may have\n   no normal entry point so their context is unknown for the compiler. Their context\n   can be provided to the compiler by the sljit_set_context function.\n\n   Note: every call of sljit_emit_enter and sljit_set_context overwrites\n         the previous context. */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size);\n\n/* Return from machine code.  The op argument can be SLJIT_UNUSED which means the\n   function does not return with anything or any opcode between SLJIT_MOV and\n   SLJIT_MOV_P (see sljit_emit_op1). As for src and srcw they must be 0 if op\n   is SLJIT_UNUSED, otherwise see below the description about source and\n   destination arguments. */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src, sljit_sw srcw);\n\n/* Generating entry and exit points for fast call functions (see SLJIT_FAST_CALL).\n   Both sljit_emit_fast_enter and sljit_emit_fast_return functions preserve the\n   values of all registers and stack frame. The return address is stored in the\n   dst argument of sljit_emit_fast_enter, and this return address can be passed\n   to sljit_emit_fast_return to continue the execution after the fast call.\n\n   Fast calls are cheap operations (usually only a single call instruction is\n   emitted) but they do not preserve any registers. However the callee function\n   can freely use / update any registers and stack values which can be\n   efficiently exploited by various optimizations. Registers can be saved\n   manually by the callee function if needed.\n\n   Although returning to different address by sljit_emit_fast_return is possible,\n   this address usually cannot be predicted by the return address predictor of\n   modern CPUs which may reduce performance. Furthermore using sljit_emit_ijump\n   to return is also inefficient since return address prediction is usually\n   triggered by a specific form of ijump.\n\n   Flags: - (does not modify flags). */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw);\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw);\n\n/*\n   Source and destination operands for arithmetical instructions\n    imm              - a simple immediate value (cannot be used as a destination)\n    reg              - any of the registers (immediate argument must be 0)\n    [imm]            - absolute immediate memory address\n    [reg+imm]        - indirect memory address\n    [reg+(reg<<imm)] - indirect indexed memory address (shift must be between 0 and 3)\n                       useful for (byte, half, int, sljit_sw) array access\n                       (fully supported by both x86 and ARM architectures, and cheap operation on others)\n*/\n\n/*\n   IMPORATNT NOTE: memory access MUST be naturally aligned except\n                   SLJIT_UNALIGNED macro is defined and its value is 1.\n\n     length | alignment\n   ---------+-----------\n     byte   | 1 byte (any physical_address is accepted)\n     half   | 2 byte (physical_address & 0x1 == 0)\n     int    | 4 byte (physical_address & 0x3 == 0)\n     word   | 4 byte if SLJIT_32BIT_ARCHITECTURE is defined and its value is 1\n            | 8 byte if SLJIT_64BIT_ARCHITECTURE is defined and its value is 1\n    pointer | size of sljit_p type (4 byte on 32 bit machines, 4 or 8 byte\n            | on 64 bit machines)\n\n   Note:   Different architectures have different addressing limitations.\n           A single instruction is enough for the following addressing\n           modes. Other adrressing modes are emulated by instruction\n           sequences. This information could help to improve those code\n           generators which focuses only a few architectures.\n\n   x86:    [reg+imm], -2^32+1 <= imm <= 2^32-1 (full address space on x86-32)\n           [reg+(reg<<imm)] is supported\n           [imm], -2^32+1 <= imm <= 2^32-1 is supported\n           Write-back is not supported\n   arm:    [reg+imm], -4095 <= imm <= 4095 or -255 <= imm <= 255 for signed\n                bytes, any halfs or floating point values)\n           [reg+(reg<<imm)] is supported\n           Write-back is supported\n   arm-t2: [reg+imm], -255 <= imm <= 4095\n           [reg+(reg<<imm)] is supported\n           Write back is supported only for [reg+imm], where -255 <= imm <= 255\n   arm64:  [reg+imm], -256 <= imm <= 255, 0 <= aligned imm <= 4095 * alignment\n           [reg+(reg<<imm)] is supported\n           Write back is supported only for [reg+imm], where -256 <= imm <= 255\n   ppc:    [reg+imm], -65536 <= imm <= 65535. 64 bit loads/stores and 32 bit\n                signed load on 64 bit requires immediates divisible by 4.\n                [reg+imm] is not supported for signed 8 bit values.\n           [reg+reg] is supported\n           Write-back is supported except for one instruction: 32 bit signed\n                load with [reg+imm] addressing mode on 64 bit.\n   mips:   [reg+imm], -65536 <= imm <= 65535\n   sparc:  [reg+imm], -4096 <= imm <= 4095\n           [reg+reg] is supported\n*/\n\n/* Macros for specifying operand types. */\n#define SLJIT_MEM\t\t0x80\n#define SLJIT_MEM0()\t\t(SLJIT_MEM)\n#define SLJIT_MEM1(r1)\t\t(SLJIT_MEM | (r1))\n#define SLJIT_MEM2(r1, r2)\t(SLJIT_MEM | (r1) | ((r2) << 8))\n#define SLJIT_IMM\t\t0x40\n\n/* Set 32 bit operation mode (I) on 64 bit CPUs. This option is ignored on\n   32 bit CPUs. When this option is set for an arithmetic operation, only\n   the lower 32 bit of the input registers are used, and the CPU status\n   flags are set according to the 32 bit result. Although the higher 32 bit\n   of the input and the result registers are not defined by SLJIT, it might\n   be defined by the CPU architecture (e.g. MIPS). To satisfy these CPU\n   requirements all source registers must be the result of those operations\n   where this option was also set. Memory loads read 32 bit values rather\n   than 64 bit ones. In other words 32 bit and 64 bit operations cannot\n   be mixed. The only exception is SLJIT_MOV32 and SLJIT_MOVU32 whose source\n   register can hold any 32 or 64 bit value, and it is converted to a 32 bit\n   compatible format first. This conversion is free (no instructions are\n   emitted) on most CPUs. A 32 bit value can also be converted to a 64 bit\n   value by SLJIT_MOV_S32 (sign extension) or SLJIT_MOV_U32 (zero extension).\n\n   Note: memory addressing always uses 64 bit values on 64 bit systems so\n         the result of a 32 bit operation must not be used with SLJIT_MEMx\n         macros.\n\n   This option is part of the instruction name, so there is no need to\n   manually set it. E.g:\n\n     SLJIT_ADD32 == (SLJIT_ADD | SLJIT_I32_OP) */\n#define SLJIT_I32_OP\t\t0x100\n\n/* Set F32 (single) precision mode for floating-point computation. This\n   option is similar to SLJIT_I32_OP, it just applies to floating point\n   registers. When this option is passed, the CPU performs 32 bit floating\n   point operations, rather than 64 bit one. Similar to SLJIT_I32_OP, all\n   register arguments must be the result of those operations where this\n   option was also set.\n\n   This option is part of the instruction name, so there is no need to\n   manually set it. E.g:\n\n     SLJIT_MOV_F32 = (SLJIT_MOV_F64 | SLJIT_F32_OP)\n */\n#define SLJIT_F32_OP\t\tSLJIT_I32_OP\n\n/* Many CPUs (x86, ARM, PPC) have status flags which can be set according\n   to the result of an operation. Other CPUs (MIPS) do not have status\n   flags, and results must be stored in registers. To cover both architecture\n   types efficiently only two flags are defined by SLJIT:\n\n    * Zero (equal) flag: it is set if the result is zero\n    * Variable flag: its value is defined by the last arithmetic operation\n\n   SLJIT instructions can set any or both of these flags. The value of\n   these flags is undefined if the instruction does not specify their value.\n   The description of each instruction contains the list of allowed flag\n   types.\n\n   Example: SLJIT_ADD can set the Z, OVERFLOW, CARRY flags hence\n\n     sljit_op2(..., SLJIT_ADD, ...)\n       Both the zero and variable flags are undefined so they can\n       have any value after the operation is completed.\n\n     sljit_op2(..., SLJIT_ADD | SLJIT_SET_Z, ...)\n       Sets the zero flag if the result is zero, clears it otherwise.\n       The variable flag is undefined.\n\n     sljit_op2(..., SLJIT_ADD | SLJIT_SET_OVERFLOW, ...)\n       Sets the variable flag if an integer overflow occurs, clears\n       it otherwise. The zero flag is undefined.\n\n     sljit_op2(..., SLJIT_ADD | SLJIT_SET_Z | SLJIT_SET_CARRY, ...)\n       Sets the zero flag if the result is zero, clears it otherwise.\n       Sets the variable flag if unsigned overflow (carry) occurs,\n       clears it otherwise.\n\n   If an instruction (e.g. SLJIT_MOV) does not modify flags the flags are\n   unchanged.\n\n   Using these flags can reduce the number of emitted instructions. E.g. a\n   fast loop can be implemented by decreasing a counter register and set the\n   zero flag to jump back if the counter register has not reached zero.\n\n   Motivation: although CPUs can set a large number of flags, usually their\n   values are ignored or only one of them is used. Emulating a large number\n   of flags on systems without flag register is complicated so SLJIT\n   instructions must specify the flag they want to use and only that flag\n   will be emulated. The last arithmetic instruction can be repeated if\n   multiple flags need to be checked.\n*/\n\n/* Set Zero status flag. */\n#define SLJIT_SET_Z\t\t\t0x0200\n/* Set the variable status flag if condition is true.\n   See comparison types. */\n#define SLJIT_SET(condition)\t\t\t((condition) << 10)\n\n/* Notes:\n     - you cannot postpone conditional jump instructions except if noted that\n       the instruction does not set flags (See: SLJIT_KEEP_FLAGS).\n     - flag combinations: '|' means 'logical or'. */\n\n/* Starting index of opcodes for sljit_emit_op0. */\n#define SLJIT_OP0_BASE\t\t\t0\n\n/* Flags: - (does not modify flags)\n   Note: breakpoint instruction is not supported by all architectures (e.g. ppc)\n         It falls back to SLJIT_NOP in those cases. */\n#define SLJIT_BREAKPOINT\t\t(SLJIT_OP0_BASE + 0)\n/* Flags: - (does not modify flags)\n   Note: may or may not cause an extra cycle wait\n         it can even decrease the runtime in a few cases. */\n#define SLJIT_NOP\t\t\t(SLJIT_OP0_BASE + 1)\n/* Flags: - (may destroy flags)\n   Unsigned multiplication of SLJIT_R0 and SLJIT_R1.\n   Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */\n#define SLJIT_LMUL_UW\t\t\t(SLJIT_OP0_BASE + 2)\n/* Flags: - (may destroy flags)\n   Signed multiplication of SLJIT_R0 and SLJIT_R1.\n   Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */\n#define SLJIT_LMUL_SW\t\t\t(SLJIT_OP0_BASE + 3)\n/* Flags: - (may destroy flags)\n   Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1.\n   The result is placed into SLJIT_R0 and the remainder into SLJIT_R1.\n   Note: if SLJIT_R1 is 0, the behaviour is undefined. */\n#define SLJIT_DIVMOD_UW\t\t\t(SLJIT_OP0_BASE + 4)\n#define SLJIT_DIVMOD_U32\t\t(SLJIT_DIVMOD_UW | SLJIT_I32_OP)\n/* Flags: - (may destroy flags)\n   Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1.\n   The result is placed into SLJIT_R0 and the remainder into SLJIT_R1.\n   Note: if SLJIT_R1 is 0, the behaviour is undefined.\n   Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00),\n         the behaviour is undefined. */\n#define SLJIT_DIVMOD_SW\t\t\t(SLJIT_OP0_BASE + 5)\n#define SLJIT_DIVMOD_S32\t\t(SLJIT_DIVMOD_SW | SLJIT_I32_OP)\n/* Flags: - (may destroy flags)\n   Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1.\n   The result is placed into SLJIT_R0. SLJIT_R1 preserves its value.\n   Note: if SLJIT_R1 is 0, the behaviour is undefined. */\n#define SLJIT_DIV_UW\t\t\t(SLJIT_OP0_BASE + 6)\n#define SLJIT_DIV_U32\t\t\t(SLJIT_DIV_UW | SLJIT_I32_OP)\n/* Flags: - (may destroy flags)\n   Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1.\n   The result is placed into SLJIT_R0. SLJIT_R1 preserves its value.\n   Note: if SLJIT_R1 is 0, the behaviour is undefined.\n   Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00),\n         the behaviour is undefined. */\n#define SLJIT_DIV_SW\t\t\t(SLJIT_OP0_BASE + 7)\n#define SLJIT_DIV_S32\t\t\t(SLJIT_DIV_SW | SLJIT_I32_OP)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op);\n\n/* Starting index of opcodes for sljit_emit_op1. */\n#define SLJIT_OP1_BASE\t\t\t32\n\n/* The MOV instruction transfers data from source to destination.\n\n   MOV instruction suffixes:\n\n   U8  - unsigned 8 bit data transfer\n   S8  - signed 8 bit data transfer\n   U16 - unsigned 16 bit data transfer\n   S16 - signed 16 bit data transfer\n   U32 - unsigned int (32 bit) data transfer\n   S32 - signed int (32 bit) data transfer\n   P   - pointer (sljit_p) data transfer\n\n   If the destination of a MOV instruction is SLJIT_UNUSED and the source\n   operand is a memory address the compiler emits a prefetch instruction\n   if this instruction is supported by the current CPU. Higher data sizes\n   bring the data closer to the core: a MOV with word size loads the data\n   into a higher level cache than a byte size. Otherwise the type does not\n   affect the prefetch instruction. Furthermore a prefetch instruction\n   never fails, so it can be used to prefetch a data from an address and\n   check whether that address is NULL afterwards.\n*/\n\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV\t\t\t(SLJIT_OP1_BASE + 0)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV_U8\t\t\t(SLJIT_OP1_BASE + 1)\n#define SLJIT_MOV32_U8\t\t\t(SLJIT_MOV_U8 | SLJIT_I32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV_S8\t\t\t(SLJIT_OP1_BASE + 2)\n#define SLJIT_MOV32_S8\t\t\t(SLJIT_MOV_S8 | SLJIT_I32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV_U16\t\t\t(SLJIT_OP1_BASE + 3)\n#define SLJIT_MOV32_U16\t\t\t(SLJIT_MOV_U16 | SLJIT_I32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV_S16\t\t\t(SLJIT_OP1_BASE + 4)\n#define SLJIT_MOV32_S16\t\t\t(SLJIT_MOV_S16 | SLJIT_I32_OP)\n/* Flags: - (does not modify flags)\n   Note: no SLJIT_MOV32_U32 form, since it is the same as SLJIT_MOV32 */\n#define SLJIT_MOV_U32\t\t\t(SLJIT_OP1_BASE + 5)\n/* Flags: - (does not modify flags)\n   Note: no SLJIT_MOV32_S32 form, since it is the same as SLJIT_MOV32 */\n#define SLJIT_MOV_S32\t\t\t(SLJIT_OP1_BASE + 6)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV32\t\t\t(SLJIT_MOV_S32 | SLJIT_I32_OP)\n/* Flags: - (does not modify flags)\n   Note: load a pointer sized data, useful on x32 (a 32 bit mode on x86-64\n         where all x64 features are available, e.g. 16 register) or similar\n         compiling modes */\n#define SLJIT_MOV_P\t\t\t(SLJIT_OP1_BASE + 7)\n/* Flags: Z\n   Note: immediate source argument is not supported */\n#define SLJIT_NOT\t\t\t(SLJIT_OP1_BASE + 8)\n#define SLJIT_NOT32\t\t\t(SLJIT_NOT | SLJIT_I32_OP)\n/* Flags: Z | OVERFLOW\n   Note: immediate source argument is not supported */\n#define SLJIT_NEG\t\t\t(SLJIT_OP1_BASE + 9)\n#define SLJIT_NEG32\t\t\t(SLJIT_NEG | SLJIT_I32_OP)\n/* Count leading zeroes\n   Flags: - (may destroy flags)\n   Note: immediate source argument is not supported */\n#define SLJIT_CLZ\t\t\t(SLJIT_OP1_BASE + 10)\n#define SLJIT_CLZ32\t\t\t(SLJIT_CLZ | SLJIT_I32_OP)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw);\n\n/* Starting index of opcodes for sljit_emit_op2. */\n#define SLJIT_OP2_BASE\t\t\t96\n\n/* Flags: Z | OVERFLOW | CARRY */\n#define SLJIT_ADD\t\t\t(SLJIT_OP2_BASE + 0)\n#define SLJIT_ADD32\t\t\t(SLJIT_ADD | SLJIT_I32_OP)\n/* Flags: CARRY */\n#define SLJIT_ADDC\t\t\t(SLJIT_OP2_BASE + 1)\n#define SLJIT_ADDC32\t\t\t(SLJIT_ADDC | SLJIT_I32_OP)\n/* Flags: Z | LESS | GREATER_EQUAL | GREATER | LESS_EQUAL\n          SIG_LESS | SIG_GREATER_EQUAL | SIG_GREATER\n          SIG_LESS_EQUAL | CARRY */\n#define SLJIT_SUB\t\t\t(SLJIT_OP2_BASE + 2)\n#define SLJIT_SUB32\t\t\t(SLJIT_SUB | SLJIT_I32_OP)\n/* Flags: CARRY */\n#define SLJIT_SUBC\t\t\t(SLJIT_OP2_BASE + 3)\n#define SLJIT_SUBC32\t\t\t(SLJIT_SUBC | SLJIT_I32_OP)\n/* Note: integer mul\n   Flags: MUL_OVERFLOW */\n#define SLJIT_MUL\t\t\t(SLJIT_OP2_BASE + 4)\n#define SLJIT_MUL32\t\t\t(SLJIT_MUL | SLJIT_I32_OP)\n/* Flags: Z */\n#define SLJIT_AND\t\t\t(SLJIT_OP2_BASE + 5)\n#define SLJIT_AND32\t\t\t(SLJIT_AND | SLJIT_I32_OP)\n/* Flags: Z */\n#define SLJIT_OR\t\t\t(SLJIT_OP2_BASE + 6)\n#define SLJIT_OR32\t\t\t(SLJIT_OR | SLJIT_I32_OP)\n/* Flags: Z */\n#define SLJIT_XOR\t\t\t(SLJIT_OP2_BASE + 7)\n#define SLJIT_XOR32\t\t\t(SLJIT_XOR | SLJIT_I32_OP)\n/* Flags: Z\n   Let bit_length be the length of the shift operation: 32 or 64.\n   If src2 is immediate, src2w is masked by (bit_length - 1).\n   Otherwise, if the content of src2 is outside the range from 0\n   to bit_length - 1, the result is undefined. */\n#define SLJIT_SHL\t\t\t(SLJIT_OP2_BASE + 8)\n#define SLJIT_SHL32\t\t\t(SLJIT_SHL | SLJIT_I32_OP)\n/* Flags: Z\n   Let bit_length be the length of the shift operation: 32 or 64.\n   If src2 is immediate, src2w is masked by (bit_length - 1).\n   Otherwise, if the content of src2 is outside the range from 0\n   to bit_length - 1, the result is undefined. */\n#define SLJIT_LSHR\t\t\t(SLJIT_OP2_BASE + 9)\n#define SLJIT_LSHR32\t\t\t(SLJIT_LSHR | SLJIT_I32_OP)\n/* Flags: Z\n   Let bit_length be the length of the shift operation: 32 or 64.\n   If src2 is immediate, src2w is masked by (bit_length - 1).\n   Otherwise, if the content of src2 is outside the range from 0\n   to bit_length - 1, the result is undefined. */\n#define SLJIT_ASHR\t\t\t(SLJIT_OP2_BASE + 10)\n#define SLJIT_ASHR32\t\t\t(SLJIT_ASHR | SLJIT_I32_OP)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\n/* Starting index of opcodes for sljit_emit_fop1. */\n#define SLJIT_FOP1_BASE\t\t\t128\n\n/* Flags: - (does not modify flags) */\n#define SLJIT_MOV_F64\t\t\t(SLJIT_FOP1_BASE + 0)\n#define SLJIT_MOV_F32\t\t\t(SLJIT_MOV_F64 | SLJIT_F32_OP)\n/* Convert opcodes: CONV[DST_TYPE].FROM[SRC_TYPE]\n   SRC/DST TYPE can be: D - double, S - single, W - signed word, I - signed int\n   Rounding mode when the destination is W or I: round towards zero. */\n/* Flags: - (does not modify flags) */\n#define SLJIT_CONV_F64_FROM_F32\t\t(SLJIT_FOP1_BASE + 1)\n#define SLJIT_CONV_F32_FROM_F64\t\t(SLJIT_CONV_F64_FROM_F32 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_CONV_SW_FROM_F64\t\t(SLJIT_FOP1_BASE + 2)\n#define SLJIT_CONV_SW_FROM_F32\t\t(SLJIT_CONV_SW_FROM_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_CONV_S32_FROM_F64\t\t(SLJIT_FOP1_BASE + 3)\n#define SLJIT_CONV_S32_FROM_F32\t\t(SLJIT_CONV_S32_FROM_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_CONV_F64_FROM_SW\t\t(SLJIT_FOP1_BASE + 4)\n#define SLJIT_CONV_F32_FROM_SW\t\t(SLJIT_CONV_F64_FROM_SW | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_CONV_F64_FROM_S32\t\t(SLJIT_FOP1_BASE + 5)\n#define SLJIT_CONV_F32_FROM_S32\t\t(SLJIT_CONV_F64_FROM_S32 | SLJIT_F32_OP)\n/* Note: dst is the left and src is the right operand for SLJIT_CMPD.\n   Flags: EQUAL_F | LESS_F | GREATER_EQUAL_F | GREATER_F | LESS_EQUAL_F */\n#define SLJIT_CMP_F64\t\t\t(SLJIT_FOP1_BASE + 6)\n#define SLJIT_CMP_F32\t\t\t(SLJIT_CMP_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_NEG_F64\t\t\t(SLJIT_FOP1_BASE + 7)\n#define SLJIT_NEG_F32\t\t\t(SLJIT_NEG_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_ABS_F64\t\t\t(SLJIT_FOP1_BASE + 8)\n#define SLJIT_ABS_F32\t\t\t(SLJIT_ABS_F64 | SLJIT_F32_OP)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw);\n\n/* Starting index of opcodes for sljit_emit_fop2. */\n#define SLJIT_FOP2_BASE\t\t\t160\n\n/* Flags: - (does not modify flags) */\n#define SLJIT_ADD_F64\t\t\t(SLJIT_FOP2_BASE + 0)\n#define SLJIT_ADD_F32\t\t\t(SLJIT_ADD_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_SUB_F64\t\t\t(SLJIT_FOP2_BASE + 1)\n#define SLJIT_SUB_F32\t\t\t(SLJIT_SUB_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_MUL_F64\t\t\t(SLJIT_FOP2_BASE + 2)\n#define SLJIT_MUL_F32\t\t\t(SLJIT_MUL_F64 | SLJIT_F32_OP)\n/* Flags: - (does not modify flags) */\n#define SLJIT_DIV_F64\t\t\t(SLJIT_FOP2_BASE + 3)\n#define SLJIT_DIV_F32\t\t\t(SLJIT_DIV_F64 | SLJIT_F32_OP)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\n/* Label and jump instructions. */\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);\n\n/* Invert (negate) conditional type: xor (^) with 0x1 */\n\n/* Integer comparison types. */\n#define SLJIT_EQUAL\t\t\t0\n#define SLJIT_EQUAL32\t\t\t(SLJIT_EQUAL | SLJIT_I32_OP)\n#define SLJIT_ZERO\t\t\t0\n#define SLJIT_ZERO32\t\t\t(SLJIT_ZERO | SLJIT_I32_OP)\n#define SLJIT_NOT_EQUAL\t\t\t1\n#define SLJIT_NOT_EQUAL32\t\t(SLJIT_NOT_EQUAL | SLJIT_I32_OP)\n#define SLJIT_NOT_ZERO\t\t\t1\n#define SLJIT_NOT_ZERO32\t\t(SLJIT_NOT_ZERO | SLJIT_I32_OP)\n\n#define SLJIT_LESS\t\t\t2\n#define SLJIT_LESS32\t\t\t(SLJIT_LESS | SLJIT_I32_OP)\n#define SLJIT_SET_LESS\t\t\tSLJIT_SET(SLJIT_LESS)\n#define SLJIT_GREATER_EQUAL\t\t3\n#define SLJIT_GREATER_EQUAL32\t\t(SLJIT_GREATER_EQUAL | SLJIT_I32_OP)\n#define SLJIT_SET_GREATER_EQUAL\t\tSLJIT_SET(SLJIT_GREATER_EQUAL)\n#define SLJIT_GREATER\t\t\t4\n#define SLJIT_GREATER32\t\t\t(SLJIT_GREATER | SLJIT_I32_OP)\n#define SLJIT_SET_GREATER\t\tSLJIT_SET(SLJIT_GREATER)\n#define SLJIT_LESS_EQUAL\t\t5\n#define SLJIT_LESS_EQUAL32\t\t(SLJIT_LESS_EQUAL | SLJIT_I32_OP)\n#define SLJIT_SET_LESS_EQUAL\t\tSLJIT_SET(SLJIT_LESS_EQUAL)\n#define SLJIT_SIG_LESS\t\t\t6\n#define SLJIT_SIG_LESS32\t\t(SLJIT_SIG_LESS | SLJIT_I32_OP)\n#define SLJIT_SET_SIG_LESS\t\tSLJIT_SET(SLJIT_SIG_LESS)\n#define SLJIT_SIG_GREATER_EQUAL\t\t7\n#define SLJIT_SIG_GREATER_EQUAL32\t(SLJIT_SIG_GREATER_EQUAL | SLJIT_I32_OP)\n#define SLJIT_SET_SIG_GREATER_EQUAL\tSLJIT_SET(SLJIT_SIG_GREATER_EQUAL)\n#define SLJIT_SIG_GREATER\t\t8\n#define SLJIT_SIG_GREATER32\t\t(SLJIT_SIG_GREATER | SLJIT_I32_OP)\n#define SLJIT_SET_SIG_GREATER\t\tSLJIT_SET(SLJIT_SIG_GREATER)\n#define SLJIT_SIG_LESS_EQUAL\t\t9\n#define SLJIT_SIG_LESS_EQUAL32\t\t(SLJIT_SIG_LESS_EQUAL | SLJIT_I32_OP)\n#define SLJIT_SET_SIG_LESS_EQUAL\tSLJIT_SET(SLJIT_SIG_LESS_EQUAL)\n\n#define SLJIT_OVERFLOW\t\t\t10\n#define SLJIT_OVERFLOW32\t\t(SLJIT_OVERFLOW | SLJIT_I32_OP)\n#define SLJIT_SET_OVERFLOW\t\tSLJIT_SET(SLJIT_OVERFLOW)\n#define SLJIT_NOT_OVERFLOW\t\t11\n#define SLJIT_NOT_OVERFLOW32\t\t(SLJIT_NOT_OVERFLOW | SLJIT_I32_OP)\n\n#define SLJIT_MUL_OVERFLOW\t\t12\n#define SLJIT_MUL_OVERFLOW32\t\t(SLJIT_MUL_OVERFLOW | SLJIT_I32_OP)\n#define SLJIT_SET_MUL_OVERFLOW\t\tSLJIT_SET(SLJIT_MUL_OVERFLOW)\n#define SLJIT_MUL_NOT_OVERFLOW\t\t13\n#define SLJIT_MUL_NOT_OVERFLOW32\t(SLJIT_MUL_NOT_OVERFLOW | SLJIT_I32_OP)\n\n/* There is no SLJIT_CARRY or SLJIT_NOT_CARRY. */\n#define SLJIT_SET_CARRY\t\t\tSLJIT_SET(14)\n\n/* Floating point comparison types. */\n#define SLJIT_EQUAL_F64\t\t\t16\n#define SLJIT_EQUAL_F32\t\t\t(SLJIT_EQUAL_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_EQUAL_F\t\tSLJIT_SET(SLJIT_EQUAL_F64)\n#define SLJIT_NOT_EQUAL_F64\t\t17\n#define SLJIT_NOT_EQUAL_F32\t\t(SLJIT_NOT_EQUAL_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_NOT_EQUAL_F\t\tSLJIT_SET(SLJIT_NOT_EQUAL_F64)\n#define SLJIT_LESS_F64\t\t\t18\n#define SLJIT_LESS_F32\t\t\t(SLJIT_LESS_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_LESS_F\t\tSLJIT_SET(SLJIT_LESS_F64)\n#define SLJIT_GREATER_EQUAL_F64\t\t19\n#define SLJIT_GREATER_EQUAL_F32\t\t(SLJIT_GREATER_EQUAL_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_GREATER_EQUAL_F\tSLJIT_SET(SLJIT_GREATER_EQUAL_F64)\n#define SLJIT_GREATER_F64\t\t20\n#define SLJIT_GREATER_F32\t\t(SLJIT_GREATER_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_GREATER_F\t\tSLJIT_SET(SLJIT_GREATER_F64)\n#define SLJIT_LESS_EQUAL_F64\t\t21\n#define SLJIT_LESS_EQUAL_F32\t\t(SLJIT_LESS_EQUAL_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_LESS_EQUAL_F\t\tSLJIT_SET(SLJIT_LESS_EQUAL_F64)\n#define SLJIT_UNORDERED_F64\t\t22\n#define SLJIT_UNORDERED_F32\t\t(SLJIT_UNORDERED_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_UNORDERED_F\t\tSLJIT_SET(SLJIT_UNORDERED_F64)\n#define SLJIT_ORDERED_F64\t\t23\n#define SLJIT_ORDERED_F32\t\t(SLJIT_ORDERED_F64 | SLJIT_F32_OP)\n#define SLJIT_SET_ORDERED_F\t\tSLJIT_SET(SLJIT_ORDERED_F64)\n\n/* Unconditional jump types. */\n#define SLJIT_JUMP\t\t\t24\n\t/* Fast calling method. See sljit_emit_fast_enter / sljit_emit_fast_return. */\n#define SLJIT_FAST_CALL\t\t\t25\n\t/* Called function must be declared with the SLJIT_FUNC attribute. */\n#define SLJIT_CALL\t\t\t26\n\t/* Called function must be declared with cdecl attribute.\n\t   This is the default attribute for C functions. */\n#define SLJIT_CALL_CDECL\t\t27\n\n/* The target can be changed during runtime (see: sljit_set_jump_addr). */\n#define SLJIT_REWRITABLE_JUMP\t\t0x1000\n\n/* Emit a jump instruction. The destination is not set, only the type of the jump.\n    type must be between SLJIT_EQUAL and SLJIT_FAST_CALL\n    type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP\n\n   Flags: does not modify flags. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type);\n\n/* Emit a C compiler (ABI) compatible function call.\n    type must be SLJIT_CALL or SLJIT_CALL_CDECL\n    type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP\n    arg_types is the combination of SLJIT_RET / SLJIT_ARGx (SLJIT_DEF_RET / SLJIT_DEF_ARGx) macros\n\n   Flags: destroy all flags. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types);\n\n/* Basic arithmetic comparison. In most architectures it is implemented as\n   an SLJIT_SUB operation (with SLJIT_UNUSED destination and setting\n   appropriate flags) followed by a sljit_emit_jump. However some\n   architectures (i.e: ARM64 or MIPS) may employ special optimizations here.\n   It is suggested to use this comparison form when appropriate.\n    type must be between SLJIT_EQUAL and SLJIT_I_SIG_LESS_EQUAL\n    type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP\n\n   Flags: may destroy flags. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\n/* Basic floating point comparison. In most architectures it is implemented as\n   an SLJIT_FCMP operation (setting appropriate flags) followed by a\n   sljit_emit_jump. However some architectures (i.e: MIPS) may employ\n   special optimizations here. It is suggested to use this comparison form\n   when appropriate.\n    type must be between SLJIT_EQUAL_F64 and SLJIT_ORDERED_F32\n    type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP\n   Flags: destroy flags.\n   Note: if either operand is NaN, the behaviour is undefined for\n         types up to SLJIT_S_LESS_EQUAL. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\n/* Set the destination of the jump to this label. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label);\n/* Set the destination address of the jump to this label. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw target);\n\n/* Emit an indirect jump or fast call.\n   Direct form: set src to SLJIT_IMM() and srcw to the address\n   Indirect form: any other valid addressing mode\n    type must be between SLJIT_JUMP and SLJIT_FAST_CALL\n\n   Flags: does not modify flags. */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw);\n\n/* Emit a C compiler (ABI) compatible function call.\n   Direct form: set src to SLJIT_IMM() and srcw to the address\n   Indirect form: any other valid addressing mode\n    type must be SLJIT_CALL or SLJIT_CALL_CDECL\n    arg_types is the combination of SLJIT_RET / SLJIT_ARGx (SLJIT_DEF_RET / SLJIT_DEF_ARGx) macros\n\n   Flags: destroy all flags. */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 arg_types, sljit_s32 src, sljit_sw srcw);\n\n/* Perform the operation using the conditional flags as the second argument.\n   Type must always be between SLJIT_EQUAL and SLJIT_ORDERED_F64. The value\n   represented by the type is 1, if the condition represented by the type\n   is fulfilled, and 0 otherwise.\n\n   If op == SLJIT_MOV, SLJIT_MOV32:\n     Set dst to the value represented by the type (0 or 1).\n     Flags: - (does not modify flags)\n   If op == SLJIT_OR, op == SLJIT_AND, op == SLJIT_XOR\n     Performs the binary operation using dst as the first, and the value\n     represented by type as the second argument. Result is written into dst.\n     Flags: Z (may destroy flags) */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type);\n\n/* Emit a conditional mov instruction which moves source to destination,\n   if the condition is satisfied. Unlike other arithmetic operations this\n   instruction does not support memory access.\n\n   type must be between SLJIT_EQUAL and SLJIT_ORDERED_F64\n   dst_reg must be a valid register and it can be combined\n      with SLJIT_I32_OP to perform a 32 bit arithmetic operation\n   src must be register or immediate (SLJIT_IMM)\n\n   Flags: - (does not modify flags) */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw);\n\n/* The following flags are used by sljit_emit_mem() and sljit_emit_fmem(). */\n\n/* When SLJIT_MEM_SUPP is passed, no instructions are emitted.\n   Instead the function returns with SLJIT_SUCCESS if the instruction\n   form is supported and SLJIT_ERR_UNSUPPORTED otherwise. This flag\n   allows runtime checking of available instruction forms. */\n#define SLJIT_MEM_SUPP\t\t0x0200\n/* Memory load operation. This is the default. */\n#define SLJIT_MEM_LOAD\t\t0x0000\n/* Memory store operation. */\n#define SLJIT_MEM_STORE\t\t0x0400\n/* Base register is updated before the memory access. */\n#define SLJIT_MEM_PRE\t\t0x0800\n/* Base register is updated after the memory access. */\n#define SLJIT_MEM_POST\t\t0x1000\n\n/* Emit a single memory load or store with update instruction. When the\n   requested instruction form is not supported by the CPU, it returns\n   with SLJIT_ERR_UNSUPPORTED instead of emulating the instruction. This\n   allows specializing tight loops based on the supported instruction\n   forms (see SLJIT_MEM_SUPP flag).\n\n   type must be between SLJIT_MOV and SLJIT_MOV_P and can be\n     combined with SLJIT_MEM_* flags. Either SLJIT_MEM_PRE\n     or SLJIT_MEM_POST must be specified.\n   reg is the source or destination register, and must be\n     different from the base register of the mem operand\n   mem must be a SLJIT_MEM1() or SLJIT_MEM2() operand\n\n   Flags: - (does not modify flags) */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw);\n\n/* Same as sljit_emit_mem except the followings:\n\n   type must be SLJIT_MOV_F64 or SLJIT_MOV_F32 and can be\n     combined with SLJIT_MEM_* flags. Either SLJIT_MEM_PRE\n     or SLJIT_MEM_POST must be specified.\n   freg is the source or destination floating point register */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 freg,\n\tsljit_s32 mem, sljit_sw memw);\n\n/* Copies the base address of SLJIT_SP + offset to dst. The offset can be\n   anything to negate the effect of relative addressing. For example if an\n   array of sljit_sw values is stored on the stack from offset 0x40, and R0\n   contains the offset of an array item plus 0x120, this item can be\n   overwritten by two SLJIT instructions:\n\n   sljit_get_local_base(compiler, SLJIT_R1, 0, 0x40 - 0x120);\n   sljit_emit_op1(compiler, SLJIT_MOV, SLJIT_MEM2(SLJIT_R1, SLJIT_R0), 0, SLJIT_IMM, 0x5);\n\n   Flags: - (may destroy flags) */\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset);\n\n/* The constant can be changed runtime (see: sljit_set_const)\n   Flags: - (does not modify flags) */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value);\n\n/* After the code generation the address for label, jump and const instructions\n   are computed. Since these structures are freed by sljit_free_compiler, the\n   addresses must be preserved by the user program elsewere. */\nstatic SLJIT_INLINE sljit_uw sljit_get_label_addr(struct sljit_label *label) { return label->addr; }\nstatic SLJIT_INLINE sljit_uw sljit_get_jump_addr(struct sljit_jump *jump) { return jump->addr; }\nstatic SLJIT_INLINE sljit_uw sljit_get_const_addr(struct sljit_const *const_) { return const_->addr; }\n\n/* Only the address and executable offset are required to perform dynamic\n   code modifications. See sljit_get_executable_offset function. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset);\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset);\n\n/* --------------------------------------------------------------------- */\n/*  Miscellaneous utility functions                                      */\n/* --------------------------------------------------------------------- */\n\n#define SLJIT_MAJOR_VERSION\t0\n#define SLJIT_MINOR_VERSION\t94\n\n/* Get the human readable name of the platform. Can be useful on platforms\n   like ARM, where ARM and Thumb2 functions can be mixed, and\n   it is useful to know the type of the code generator. */\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void);\n\n/* Portable helper function to get an offset of a member. */\n#define SLJIT_OFFSETOF(base, member) ((sljit_sw)(&((base*)0x10)->member) - 0x10)\n\n#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)\n/* This global lock is useful to compile common functions. */\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void);\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void);\n#endif\n\n#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)\n\n/* The sljit_stack structure and its manipulation functions provides\n   an implementation for a top-down stack. The stack top is stored\n   in the end field of the sljit_stack structure and the stack goes\n   down to the min_start field, so the memory region reserved for\n   this stack is between min_start (inclusive) and end (exclusive)\n   fields. However the application can only use the region between\n   start (inclusive) and end (exclusive) fields. The sljit_stack_resize\n   function can be used to extend this region up to min_start.\n\n   This feature uses the \"address space reserve\" feature of modern\n   operating systems. Instead of allocating a large memory block\n   applications can allocate a small memory region and extend it\n   later without moving the content of the memory area. Therefore\n   after a successful resize by sljit_stack_resize all pointers into\n   this region are still valid.\n\n   Note:\n     this structure may not be supported by all operating systems.\n     end and max_limit fields are aligned to PAGE_SIZE bytes (usually\n         4 Kbyte or more).\n     stack should grow in larger steps, e.g. 4Kbyte, 16Kbyte or more. */\n\nstruct sljit_stack {\n\t/* User data, anything can be stored here.\n\t   Initialized to the same value as the end field. */\n\tsljit_u8 *top;\n/* These members are read only. */\n\t/* End address of the stack */\n\tsljit_u8 *end;\n\t/* Current start address of the stack. */\n\tsljit_u8 *start;\n\t/* Lowest start address of the stack. */\n\tsljit_u8 *min_start;\n};\n\n/* Allocates a new stack. Returns NULL if unsuccessful.\n   Note: see sljit_create_compiler for the explanation of allocator_data. */\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data);\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data);\n\n/* Can be used to increase (extend) or decrease (shrink) the stack\n   memory area. Returns with new_start if successful and NULL otherwise.\n   It always fails if new_start is less than min_start or greater or equal\n   than end fields. The fields of the stack are not changed if the returned\n   value is NULL (the current memory content is never lost). */\nSLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start);\n\n#endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */\n\n#if !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\n\n/* Get the entry address of a given function. */\n#define SLJIT_FUNC_OFFSET(func_name)\t((sljit_sw)func_name)\n\n#else /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */\n\n/* All JIT related code should be placed in the same context (library, binary, etc.). */\n\n#define SLJIT_FUNC_OFFSET(func_name)\t(*(sljit_sw*)(void*)func_name)\n\n/* For powerpc64, the function pointers point to a context descriptor. */\nstruct sljit_function_context {\n\tsljit_sw addr;\n\tsljit_sw r2;\n\tsljit_sw r11;\n};\n\n/* Fill the context arguments using the addr and the function.\n   If func_ptr is NULL, it will not be set to the address of context\n   If addr is NULL, the function address also comes from the func pointer. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func);\n\n#endif /* !(defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL) */\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n/* Free unused executable memory. The allocator keeps some free memory\n   around to reduce the number of OS executable memory allocations.\n   This improves performance since these calls are costly. However\n   it is sometimes desired to free all unused memory regions, e.g.\n   before the application terminates. */\nSLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);\n#endif\n\n/* --------------------------------------------------------------------- */\n/*  CPU specific functions                                               */\n/* --------------------------------------------------------------------- */\n\n/* The following function is a helper function for sljit_emit_op_custom.\n   It returns with the real machine register index ( >=0 ) of any SLJIT_R,\n   SLJIT_S and SLJIT_SP registers.\n\n   Note: it returns with -1 for virtual registers (only on x86-32). */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg);\n\n/* The following function is a helper function for sljit_emit_op_custom.\n   It returns with the real machine register index of any SLJIT_FLOAT register.\n\n   Note: the index is always an even number on ARM (except ARM-64), MIPS, and SPARC. */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg);\n\n/* Any instruction can be inserted into the instruction stream by\n   sljit_emit_op_custom. It has a similar purpose as inline assembly.\n   The size parameter must match to the instruction size of the target\n   architecture:\n\n         x86: 0 < size <= 15. The instruction argument can be byte aligned.\n      Thumb2: if size == 2, the instruction argument must be 2 byte aligned.\n              if size == 4, the instruction argument must be 4 byte aligned.\n   Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size);\n\n/* Define the currently available CPU status flags. It is usually used after an\n   sljit_emit_op_custom call to define which flags are set. */\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler,\n\tsljit_s32 current_flags);\n\n#endif /* _SLJIT_LIR_H_ */\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeARM_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef __SOFTFP__\n#define ARM_ABI_INFO \" ABI:softfp\"\n#else\n#define ARM_ABI_INFO \" ABI:hardfp\"\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\treturn \"ARMv7\" SLJIT_CPUINFO ARM_ABI_INFO;\n#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\treturn \"ARMv5\" SLJIT_CPUINFO ARM_ABI_INFO;\n#else\n#error \"Internal error: Unknown ARM architecture\"\n#endif\n}\n\n/* Last register + 1. */\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_PC\t\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\n/* In ARM instruction words.\n   Cache lines are usually 32 byte aligned. */\n#define CONST_POOL_ALIGNMENT\t8\n#define CONST_POOL_EMPTY\t0xffffffff\n\n#define ALIGN_INSTRUCTION(ptr) \\\n\t(sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1))\n#define MAX_DIFFERENCE(max_diff) \\\n\t(((max_diff) / (sljit_s32)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1))\n\n/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {\n\t0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15\n};\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 1, 2, 3, 4, 5, 6, 7\n};\n\n#define RM(rm) (reg_map[rm])\n#define RD(rd) (reg_map[rd] << 12)\n#define RN(rn) (reg_map[rn] << 16)\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n/* The instruction includes the AL condition.\n   INST_NAME - CONDITIONAL remove this flag. */\n#define COND_MASK\t0xf0000000\n#define CONDITIONAL\t0xe0000000\n#define PUSH_POOL\t0xff000000\n\n#define ADC\t\t0xe0a00000\n#define ADD\t\t0xe0800000\n#define AND\t\t0xe0000000\n#define B\t\t0xea000000\n#define BIC\t\t0xe1c00000\n#define BL\t\t0xeb000000\n#define BLX\t\t0xe12fff30\n#define BX\t\t0xe12fff10\n#define CLZ\t\t0xe16f0f10\n#define CMN\t\t0xe1600000\n#define CMP\t\t0xe1400000\n#define BKPT\t\t0xe1200070\n#define EOR\t\t0xe0200000\n#define MOV\t\t0xe1a00000\n#define MUL\t\t0xe0000090\n#define MVN\t\t0xe1e00000\n#define NOP\t\t0xe1a00000\n#define ORR\t\t0xe1800000\n#define PUSH\t\t0xe92d0000\n#define POP\t\t0xe8bd0000\n#define RSB\t\t0xe0600000\n#define RSC\t\t0xe0e00000\n#define SBC\t\t0xe0c00000\n#define SMULL\t\t0xe0c00090\n#define SUB\t\t0xe0400000\n#define UMULL\t\t0xe0800090\n#define VABS_F32\t0xeeb00ac0\n#define VADD_F32\t0xee300a00\n#define VCMP_F32\t0xeeb40a40\n#define VCVT_F32_S32\t0xeeb80ac0\n#define VCVT_F64_F32\t0xeeb70ac0\n#define VCVT_S32_F32\t0xeebd0ac0\n#define VDIV_F32\t0xee800a00\n#define VMOV_F32\t0xeeb00a40\n#define VMOV\t\t0xee000a10\n#define VMOV2\t\t0xec400a10\n#define VMRS\t\t0xeef1fa10\n#define VMUL_F32\t0xee200a00\n#define VNEG_F32\t0xeeb10a40\n#define VSTR_F32\t0xed000a00\n#define VSUB_F32\t0xee300a40\n\n#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n/* Arm v7 specific instructions. */\n#define MOVW\t\t0xe3000000\n#define MOVT\t\t0xe3400000\n#define SXTB\t\t0xe6af0070\n#define SXTH\t\t0xe6bf0070\n#define UXTB\t\t0xe6ef0070\n#define UXTH\t\t0xe6ff0070\n#endif\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\nstatic sljit_s32 push_cpool(struct sljit_compiler *compiler)\n{\n\t/* Pushing the constant pool into the instruction stream. */\n\tsljit_uw* inst;\n\tsljit_uw* cpool_ptr;\n\tsljit_uw* cpool_end;\n\tsljit_s32 i;\n\n\t/* The label could point the address after the constant pool. */\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\tcompiler->last_label->size += compiler->cpool_fill + (CONST_POOL_ALIGNMENT - 1) + 1;\n\n\tSLJIT_ASSERT(compiler->cpool_fill > 0 && compiler->cpool_fill <= CPOOL_SIZE);\n\tinst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\tFAIL_IF(!inst);\n\tcompiler->size++;\n\t*inst = 0xff000000 | compiler->cpool_fill;\n\n\tfor (i = 0; i < CONST_POOL_ALIGNMENT - 1; i++) {\n\t\tinst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\t\tFAIL_IF(!inst);\n\t\tcompiler->size++;\n\t\t*inst = 0;\n\t}\n\n\tcpool_ptr = compiler->cpool;\n\tcpool_end = cpool_ptr + compiler->cpool_fill;\n\twhile (cpool_ptr < cpool_end) {\n\t\tinst = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\t\tFAIL_IF(!inst);\n\t\tcompiler->size++;\n\t\t*inst = *cpool_ptr++;\n\t}\n\tcompiler->cpool_diff = CONST_POOL_EMPTY;\n\tcompiler->cpool_fill = 0;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)\n{\n\tsljit_uw* ptr;\n\n\tif (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)))\n\t\tFAIL_IF(push_cpool(compiler));\n\n\tptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\tFAIL_IF(!ptr);\n\tcompiler->size++;\n\t*ptr = inst;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)\n{\n\tsljit_uw* ptr;\n\tsljit_uw cpool_index = CPOOL_SIZE;\n\tsljit_uw* cpool_ptr;\n\tsljit_uw* cpool_end;\n\tsljit_u8* cpool_unique_ptr;\n\n\tif (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)))\n\t\tFAIL_IF(push_cpool(compiler));\n\telse if (compiler->cpool_fill > 0) {\n\t\tcpool_ptr = compiler->cpool;\n\t\tcpool_end = cpool_ptr + compiler->cpool_fill;\n\t\tcpool_unique_ptr = compiler->cpool_unique;\n\t\tdo {\n\t\t\tif ((*cpool_ptr == literal) && !(*cpool_unique_ptr)) {\n\t\t\t\tcpool_index = cpool_ptr - compiler->cpool;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcpool_ptr++;\n\t\t\tcpool_unique_ptr++;\n\t\t} while (cpool_ptr < cpool_end);\n\t}\n\n\tif (cpool_index == CPOOL_SIZE) {\n\t\t/* Must allocate a new entry in the literal pool. */\n\t\tif (compiler->cpool_fill < CPOOL_SIZE) {\n\t\t\tcpool_index = compiler->cpool_fill;\n\t\t\tcompiler->cpool_fill++;\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(push_cpool(compiler));\n\t\t\tcpool_index = 0;\n\t\t\tcompiler->cpool_fill = 1;\n\t\t}\n\t}\n\n\tSLJIT_ASSERT((inst & 0xfff) == 0);\n\tptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\tFAIL_IF(!ptr);\n\tcompiler->size++;\n\t*ptr = inst | cpool_index;\n\n\tcompiler->cpool[cpool_index] = literal;\n\tcompiler->cpool_unique[cpool_index] = 0;\n\tif (compiler->cpool_diff == CONST_POOL_EMPTY)\n\t\tcompiler->cpool_diff = compiler->size;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)\n{\n\tsljit_uw* ptr;\n\tif (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE))\n\t\tFAIL_IF(push_cpool(compiler));\n\n\tSLJIT_ASSERT(compiler->cpool_fill < CPOOL_SIZE && (inst & 0xfff) == 0);\n\tptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\tFAIL_IF(!ptr);\n\tcompiler->size++;\n\t*ptr = inst | compiler->cpool_fill;\n\n\tcompiler->cpool[compiler->cpool_fill] = literal;\n\tcompiler->cpool_unique[compiler->cpool_fill] = 1;\n\tcompiler->cpool_fill++;\n\tif (compiler->cpool_diff == CONST_POOL_EMPTY)\n\t\tcompiler->cpool_diff = compiler->size;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 prepare_blx(struct sljit_compiler *compiler)\n{\n\t/* Place for at least two instruction (doesn't matter whether the first has a literal). */\n\tif (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4088)))\n\t\treturn push_cpool(compiler);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_blx(struct sljit_compiler *compiler)\n{\n\t/* Must follow tightly the previous instruction (to be able to convert it to bl instruction). */\n\tSLJIT_ASSERT(compiler->cpool_diff == CONST_POOL_EMPTY || compiler->size - compiler->cpool_diff < MAX_DIFFERENCE(4092));\n\tSLJIT_ASSERT(reg_map[TMP_REG1] != 14);\n\n\treturn push_inst(compiler, BLX | RM(TMP_REG1));\n}\n\nstatic sljit_uw patch_pc_relative_loads(sljit_uw *last_pc_patch, sljit_uw *code_ptr, sljit_uw* const_pool, sljit_uw cpool_size)\n{\n\tsljit_uw diff;\n\tsljit_uw ind;\n\tsljit_uw counter = 0;\n\tsljit_uw* clear_const_pool = const_pool;\n\tsljit_uw* clear_const_pool_end = const_pool + cpool_size;\n\n\tSLJIT_ASSERT(const_pool - code_ptr <= CONST_POOL_ALIGNMENT);\n\t/* Set unused flag for all literals in the constant pool.\n\t   I.e.: unused literals can belong to branches, which can be encoded as B or BL.\n\t   We can \"compress\" the constant pool by discarding these literals. */\n\twhile (clear_const_pool < clear_const_pool_end)\n\t\t*clear_const_pool++ = (sljit_uw)(-1);\n\n\twhile (last_pc_patch < code_ptr) {\n\t\t/* Data transfer instruction with Rn == r15. */\n\t\tif ((*last_pc_patch & 0x0c0f0000) == 0x040f0000) {\n\t\t\tdiff = const_pool - last_pc_patch;\n\t\t\tind = (*last_pc_patch) & 0xfff;\n\n\t\t\t/* Must be a load instruction with immediate offset. */\n\t\t\tSLJIT_ASSERT(ind < cpool_size && !(*last_pc_patch & (1 << 25)) && (*last_pc_patch & (1 << 20)));\n\t\t\tif ((sljit_s32)const_pool[ind] < 0) {\n\t\t\t\tconst_pool[ind] = counter;\n\t\t\t\tind = counter;\n\t\t\t\tcounter++;\n\t\t\t}\n\t\t\telse\n\t\t\t\tind = const_pool[ind];\n\n\t\t\tSLJIT_ASSERT(diff >= 1);\n\t\t\tif (diff >= 2 || ind > 0) {\n\t\t\t\tdiff = (diff + ind - 2) << 2;\n\t\t\t\tSLJIT_ASSERT(diff <= 0xfff);\n\t\t\t\t*last_pc_patch = (*last_pc_patch & ~0xfff) | diff;\n\t\t\t}\n\t\t\telse\n\t\t\t\t*last_pc_patch = (*last_pc_patch & ~(0xfff | (1 << 23))) | 0x004;\n\t\t}\n\t\tlast_pc_patch++;\n\t}\n\treturn counter;\n}\n\n/* In some rare ocasions we may need future patches. The probability is close to 0 in practice. */\nstruct future_patch {\n\tstruct future_patch* next;\n\tsljit_s32 index;\n\tsljit_s32 value;\n};\n\nstatic sljit_s32 resolve_const_pool_index(struct sljit_compiler *compiler, struct future_patch **first_patch, sljit_uw cpool_current_index, sljit_uw *cpool_start_address, sljit_uw *buf_ptr)\n{\n\tsljit_s32 value;\n\tstruct future_patch *curr_patch, *prev_patch;\n\n\tSLJIT_UNUSED_ARG(compiler);\n\n\t/* Using the values generated by patch_pc_relative_loads. */\n\tif (!*first_patch)\n\t\tvalue = (sljit_s32)cpool_start_address[cpool_current_index];\n\telse {\n\t\tcurr_patch = *first_patch;\n\t\tprev_patch = NULL;\n\t\twhile (1) {\n\t\t\tif (!curr_patch) {\n\t\t\t\tvalue = (sljit_s32)cpool_start_address[cpool_current_index];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ((sljit_uw)curr_patch->index == cpool_current_index) {\n\t\t\t\tvalue = curr_patch->value;\n\t\t\t\tif (prev_patch)\n\t\t\t\t\tprev_patch->next = curr_patch->next;\n\t\t\t\telse\n\t\t\t\t\t*first_patch = curr_patch->next;\n\t\t\t\tSLJIT_FREE(curr_patch, compiler->allocator_data);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tprev_patch = curr_patch;\n\t\t\tcurr_patch = curr_patch->next;\n\t\t}\n\t}\n\n\tif (value >= 0) {\n\t\tif ((sljit_uw)value > cpool_current_index) {\n\t\t\tcurr_patch = (struct future_patch*)SLJIT_MALLOC(sizeof(struct future_patch), compiler->allocator_data);\n\t\t\tif (!curr_patch) {\n\t\t\t\twhile (*first_patch) {\n\t\t\t\t\tcurr_patch = *first_patch;\n\t\t\t\t\t*first_patch = (*first_patch)->next;\n\t\t\t\t\tSLJIT_FREE(curr_patch, compiler->allocator_data);\n\t\t\t\t}\n\t\t\t\treturn SLJIT_ERR_ALLOC_FAILED;\n\t\t\t}\n\t\t\tcurr_patch->next = *first_patch;\n\t\t\tcurr_patch->index = value;\n\t\t\tcurr_patch->value = cpool_start_address[value];\n\t\t\t*first_patch = curr_patch;\n\t\t}\n\t\tcpool_start_address[value] = *buf_ptr;\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\n#else\n\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)\n{\n\tsljit_uw* ptr;\n\n\tptr = (sljit_uw*)ensure_buf(compiler, sizeof(sljit_uw));\n\tFAIL_IF(!ptr);\n\tcompiler->size++;\n\t*ptr = inst;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_imm(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)\n{\n\tFAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)));\n\treturn push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff));\n}\n\n#endif\n\nstatic SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw *code_ptr, sljit_uw *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn 0;\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tif (jump->flags & IS_BL)\n\t\tcode_ptr--;\n\n\tif (jump->flags & JUMP_ADDR)\n\t\tdiff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset);\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\tdiff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2));\n\t}\n\n\t/* Branch to Thumb code has not been optimized yet. */\n\tif (diff & 0x3)\n\t\treturn 0;\n\n\tif (jump->flags & IS_BL) {\n\t\tif (diff <= 0x01ffffff && diff >= -0x02000000) {\n\t\t\t*code_ptr = (BL - CONDITIONAL) | (*(code_ptr + 1) & COND_MASK);\n\t\t\tjump->flags |= PATCH_B;\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse {\n\t\tif (diff <= 0x01ffffff && diff >= -0x02000000) {\n\t\t\t*code_ptr = (B - CONDITIONAL) | (*code_ptr & COND_MASK);\n\t\t\tjump->flags |= PATCH_B;\n\t\t}\n\t}\n#else\n\tif (jump->flags & JUMP_ADDR)\n\t\tdiff = ((sljit_sw)jump->u.target - (sljit_sw)code_ptr - executable_offset);\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\tdiff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)code_ptr);\n\t}\n\n\t/* Branch to Thumb code has not been optimized yet. */\n\tif (diff & 0x3)\n\t\treturn 0;\n\n\tif (diff <= 0x01ffffff && diff >= -0x02000000) {\n\t\tcode_ptr -= 2;\n\t\t*code_ptr = ((jump->flags & IS_BL) ? (BL - CONDITIONAL) : (B - CONDITIONAL)) | (code_ptr[2] & COND_MASK);\n\t\tjump->flags |= PATCH_B;\n\t\treturn 1;\n\t}\n#endif\n\treturn 0;\n}\n\nstatic SLJIT_INLINE void inline_set_jump_addr(sljit_uw jump_ptr, sljit_sw executable_offset, sljit_uw new_addr, sljit_s32 flush_cache)\n{\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tsljit_uw *ptr = (sljit_uw *)jump_ptr;\n\tsljit_uw *inst = (sljit_uw *)ptr[0];\n\tsljit_uw mov_pc = ptr[1];\n\tsljit_s32 bl = (mov_pc & 0x0000f000) != RD(TMP_PC);\n\tsljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2) - executable_offset) >> 2);\n\n\tif (diff <= 0x7fffff && diff >= -0x800000) {\n\t\t/* Turn to branch. */\n\t\tif (!bl) {\n\t\t\tinst[0] = (mov_pc & COND_MASK) | (B - CONDITIONAL) | (diff & 0xffffff);\n\t\t\tif (flush_cache) {\n\t\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 1);\n\t\t\t}\n\t\t} else {\n\t\t\tinst[0] = (mov_pc & COND_MASK) | (BL - CONDITIONAL) | (diff & 0xffffff);\n\t\t\tinst[1] = NOP;\n\t\t\tif (flush_cache) {\n\t\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/* Get the position of the constant. */\n\t\tif (mov_pc & (1 << 23))\n\t\t\tptr = inst + ((mov_pc & 0xfff) >> 2) + 2;\n\t\telse\n\t\t\tptr = inst + 1;\n\n\t\tif (*inst != mov_pc) {\n\t\t\tinst[0] = mov_pc;\n\t\t\tif (!bl) {\n\t\t\t\tif (flush_cache) {\n\t\t\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinst[1] = BLX | RM(TMP_REG1);\n\t\t\t\tif (flush_cache) {\n\t\t\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t*ptr = new_addr;\n\t}\n#else\n\tsljit_uw *inst = (sljit_uw*)jump_ptr;\n\tSLJIT_ASSERT((inst[0] & 0xfff00000) == MOVW && (inst[1] & 0xfff00000) == MOVT);\n\tinst[0] = MOVW | (inst[0] & 0xf000) | ((new_addr << 4) & 0xf0000) | (new_addr & 0xfff);\n\tinst[1] = MOVT | (inst[1] & 0xf000) | ((new_addr >> 12) & 0xf0000) | ((new_addr >> 16) & 0xfff);\n\tif (flush_cache) {\n\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n\t}\n#endif\n}\n\nstatic sljit_uw get_imm(sljit_uw imm);\n\nstatic SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw executable_offset, sljit_sw new_constant, sljit_s32 flush_cache)\n{\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tsljit_uw *ptr = (sljit_uw*)addr;\n\tsljit_uw *inst = (sljit_uw*)ptr[0];\n\tsljit_uw ldr_literal = ptr[1];\n\tsljit_uw src2;\n\n\tsrc2 = get_imm(new_constant);\n\tif (src2) {\n\t\t*inst = 0xe3a00000 | (ldr_literal & 0xf000) | src2;\n\t\tif (flush_cache) {\n\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 1);\n\t\t}\n\t\treturn;\n\t}\n\n\tsrc2 = get_imm(~new_constant);\n\tif (src2) {\n\t\t*inst = 0xe3e00000 | (ldr_literal & 0xf000) | src2;\n\t\tif (flush_cache) {\n\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 1);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (ldr_literal & (1 << 23))\n\t\tptr = inst + ((ldr_literal & 0xfff) >> 2) + 2;\n\telse\n\t\tptr = inst + 1;\n\n\tif (*inst != ldr_literal) {\n\t\t*inst = ldr_literal;\n\t\tif (flush_cache) {\n\t\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\t\tSLJIT_CACHE_FLUSH(inst, inst + 1);\n\t\t}\n\t}\n\t*ptr = new_constant;\n#else\n\tsljit_uw *inst = (sljit_uw*)addr;\n\tSLJIT_ASSERT((inst[0] & 0xfff00000) == MOVW && (inst[1] & 0xfff00000) == MOVT);\n\tinst[0] = MOVW | (inst[0] & 0xf000) | ((new_constant << 4) & 0xf0000) | (new_constant & 0xfff);\n\tinst[1] = MOVT | (inst[1] & 0xf000) | ((new_constant >> 12) & 0xf0000) | ((new_constant >> 16) & 0xfff);\n\tif (flush_cache) {\n\t\tinst = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\t\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n\t}\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_uw *code;\n\tsljit_uw *code_ptr;\n\tsljit_uw *buf_ptr;\n\tsljit_uw *buf_end;\n\tsljit_uw size;\n\tsljit_uw word_count;\n\tsljit_sw executable_offset;\n\tsljit_sw jump_addr;\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tsljit_uw cpool_size;\n\tsljit_uw cpool_skip_alignment;\n\tsljit_uw cpool_current_index;\n\tsljit_uw *cpool_start_address;\n\tsljit_uw *last_pc_patch;\n\tstruct future_patch *first_patch;\n#endif\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\t/* Second code generation pass. */\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tsize = compiler->size + (compiler->patches << 1);\n\tif (compiler->cpool_fill > 0)\n\t\tsize += compiler->cpool_fill + CONST_POOL_ALIGNMENT - 1;\n#else\n\tsize = compiler->size;\n#endif\n\tcode = (sljit_uw*)SLJIT_MALLOC_EXEC(size * sizeof(sljit_uw));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tcpool_size = 0;\n\tcpool_skip_alignment = 0;\n\tcpool_current_index = 0;\n\tcpool_start_address = NULL;\n\tfirst_patch = NULL;\n\tlast_pc_patch = code;\n#endif\n\n\tcode_ptr = code;\n\tword_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tif (label && label->size == 0) {\n\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\t\tlabel = label->next;\n\t}\n\n\tdo {\n\t\tbuf_ptr = (sljit_uw*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 2);\n\t\tdo {\n\t\t\tword_count++;\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\tif (cpool_size > 0) {\n\t\t\t\tif (cpool_skip_alignment > 0) {\n\t\t\t\t\tbuf_ptr++;\n\t\t\t\t\tcpool_skip_alignment--;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {\n\t\t\t\t\t\tSLJIT_FREE_EXEC(code);\n\t\t\t\t\t\tcompiler->error = SLJIT_ERR_ALLOC_FAILED;\n\t\t\t\t\t\treturn NULL;\n\t\t\t\t\t}\n\t\t\t\t\tbuf_ptr++;\n\t\t\t\t\tif (++cpool_current_index >= cpool_size) {\n\t\t\t\t\t\tSLJIT_ASSERT(!first_patch);\n\t\t\t\t\t\tcpool_size = 0;\n\t\t\t\t\t\tif (label && label->size == word_count) {\n\t\t\t\t\t\t\t/* Points after the current instruction. */\n\t\t\t\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\t\t\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\t\t\t\tlabel = label->next;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ((*buf_ptr & 0xff000000) != PUSH_POOL) {\n#endif\n\t\t\t\t*code_ptr = *buf_ptr++;\n\t\t\t\t/* These structures are ordered by their address. */\n\t\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\t\tif (jump && jump->addr == word_count) {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\t\t\tif (detect_jump_type(jump, code_ptr, code, executable_offset))\n\t\t\t\t\t\tcode_ptr--;\n\t\t\t\t\tjump->addr = (sljit_uw)code_ptr;\n#else\n\t\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 2);\n\t\t\t\t\tif (detect_jump_type(jump, code_ptr, code, executable_offset))\n\t\t\t\t\t\tcode_ptr -= 2;\n#endif\n\t\t\t\t\tjump = jump->next;\n\t\t\t\t}\n\t\t\t\tif (label && label->size == word_count) {\n\t\t\t\t\t/* code_ptr can be affected above. */\n\t\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr + 1, executable_offset);\n\t\t\t\t\tlabel->size = (code_ptr + 1) - code;\n\t\t\t\t\tlabel = label->next;\n\t\t\t\t}\n\t\t\t\tif (const_ && const_->addr == word_count) {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n#else\n\t\t\t\t\tconst_->addr = (sljit_uw)(code_ptr - 1);\n#endif\n\t\t\t\t\tconst_ = const_->next;\n\t\t\t\t}\n\t\t\t\tcode_ptr++;\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Fortunately, no need to shift. */\n\t\t\t\tcpool_size = *buf_ptr++ & ~PUSH_POOL;\n\t\t\t\tSLJIT_ASSERT(cpool_size > 0);\n\t\t\t\tcpool_start_address = ALIGN_INSTRUCTION(code_ptr + 1);\n\t\t\t\tcpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, cpool_size);\n\t\t\t\tif (cpool_current_index > 0) {\n\t\t\t\t\t/* Unconditional branch. */\n\t\t\t\t\t*code_ptr = B | (((cpool_start_address - code_ptr) + cpool_current_index - 2) & ~PUSH_POOL);\n\t\t\t\t\tcode_ptr = cpool_start_address + cpool_current_index;\n\t\t\t\t}\n\t\t\t\tcpool_skip_alignment = CONST_POOL_ALIGNMENT - 1;\n\t\t\t\tcpool_current_index = 0;\n\t\t\t\tlast_pc_patch = code_ptr;\n\t\t\t}\n#endif\n\t\t} while (buf_ptr < buf_end);\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tSLJIT_ASSERT(cpool_size == 0);\n\tif (compiler->cpool_fill > 0) {\n\t\tcpool_start_address = ALIGN_INSTRUCTION(code_ptr);\n\t\tcpool_current_index = patch_pc_relative_loads(last_pc_patch, code_ptr, cpool_start_address, compiler->cpool_fill);\n\t\tif (cpool_current_index > 0)\n\t\t\tcode_ptr = cpool_start_address + cpool_current_index;\n\n\t\tbuf_ptr = compiler->cpool;\n\t\tbuf_end = buf_ptr + compiler->cpool_fill;\n\t\tcpool_current_index = 0;\n\t\twhile (buf_ptr < buf_end) {\n\t\t\tif (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {\n\t\t\t\tSLJIT_FREE_EXEC(code);\n\t\t\t\tcompiler->error = SLJIT_ERR_ALLOC_FAILED;\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tbuf_ptr++;\n\t\t\tcpool_current_index++;\n\t\t}\n\t\tSLJIT_ASSERT(!first_patch);\n\t}\n#endif\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tbuf_ptr = (sljit_uw *)jump->addr;\n\n\t\tif (jump->flags & PATCH_B) {\n\t\t\tjump_addr = (sljit_sw)SLJIT_ADD_EXEC_OFFSET(buf_ptr + 2, executable_offset);\n\t\t\tif (!(jump->flags & JUMP_ADDR)) {\n\t\t\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\t\t\tSLJIT_ASSERT(((sljit_sw)jump->u.label->addr - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.label->addr - jump_addr) >= -0x02000000);\n\t\t\t\t*buf_ptr |= (((sljit_sw)jump->u.label->addr - jump_addr) >> 2) & 0x00ffffff;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tSLJIT_ASSERT(((sljit_sw)jump->u.target - jump_addr) <= 0x01ffffff && ((sljit_sw)jump->u.target - jump_addr) >= -0x02000000);\n\t\t\t\t*buf_ptr |= (((sljit_sw)jump->u.target - jump_addr) >> 2) & 0x00ffffff;\n\t\t\t}\n\t\t}\n\t\telse if (jump->flags & SLJIT_REWRITABLE_JUMP) {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\tjump->addr = (sljit_uw)code_ptr;\n\t\t\tcode_ptr[0] = (sljit_uw)buf_ptr;\n\t\t\tcode_ptr[1] = *buf_ptr;\n\t\t\tinline_set_jump_addr((sljit_uw)code_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);\n\t\t\tcode_ptr += 2;\n#else\n\t\t\tinline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);\n#endif\n\t\t}\n\t\telse {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\tif (jump->flags & IS_BL)\n\t\t\t\tbuf_ptr--;\n\t\t\tif (*buf_ptr & (1 << 23))\n\t\t\t\tbuf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2;\n\t\t\telse\n\t\t\t\tbuf_ptr += 1;\n\t\t\t*buf_ptr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n#else\n\t\t\tinline_set_jump_addr((sljit_uw)buf_ptr, executable_offset, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target, 0);\n#endif\n\t\t}\n\t\tjump = jump->next;\n\t}\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tconst_ = compiler->consts;\n\twhile (const_) {\n\t\tbuf_ptr = (sljit_uw*)const_->addr;\n\t\tconst_->addr = (sljit_uw)code_ptr;\n\n\t\tcode_ptr[0] = (sljit_uw)buf_ptr;\n\t\tcode_ptr[1] = *buf_ptr;\n\t\tif (*buf_ptr & (1 << 23))\n\t\t\tbuf_ptr += ((*buf_ptr & 0xfff) >> 2) + 2;\n\t\telse\n\t\t\tbuf_ptr += 1;\n\t\t/* Set the value again (can be a simple constant). */\n\t\tinline_set_const((sljit_uw)code_ptr, executable_offset, *buf_ptr, 0);\n\t\tcode_ptr += 2;\n\n\t\tconst_ = const_->next;\n\t}\n#endif\n\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_s32)size);\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_uw);\n\n\tcode = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\tcode_ptr = (sljit_uw *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\treturn code;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#else\n\t\t/* Available by default. */\n\t\treturn 1;\n#endif\n\n\tcase SLJIT_HAS_CLZ:\n\tcase SLJIT_HAS_CMOV:\n\t\treturn 1;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\n/* Creates an index in data_transfer_insts array. */\n#define WORD_SIZE\t0x00\n#define BYTE_SIZE\t0x01\n#define HALF_SIZE\t0x02\n#define PRELOAD\t\t0x03\n#define SIGNED\t\t0x04\n#define LOAD_DATA\t0x08\n\n/* Flag bits for emit_op. */\n#define ALLOW_IMM\t0x10\n#define ALLOW_INV_IMM\t0x20\n#define ALLOW_ANY_IMM\t(ALLOW_IMM | ALLOW_INV_IMM)\n\n/* s/l - store/load (1 bit)\n   u/s - signed/unsigned (1 bit)\n   w/b/h/N - word/byte/half/NOT allowed (2 bit)\n   Storing signed and unsigned values are the same operations. */\n\nstatic const sljit_uw data_transfer_insts[16] = {\n/* s u w */ 0xe5000000 /* str */,\n/* s u b */ 0xe5400000 /* strb */,\n/* s u h */ 0xe10000b0 /* strh */,\n/* s u N */ 0x00000000 /* not allowed */,\n/* s s w */ 0xe5000000 /* str */,\n/* s s b */ 0xe5400000 /* strb */,\n/* s s h */ 0xe10000b0 /* strh */,\n/* s s N */ 0x00000000 /* not allowed */,\n\n/* l u w */ 0xe5100000 /* ldr */,\n/* l u b */ 0xe5500000 /* ldrb */,\n/* l u h */ 0xe11000b0 /* ldrh */,\n/* l u p */ 0xf5500000 /* preload */,\n/* l s w */ 0xe5100000 /* ldr */,\n/* l s b */ 0xe11000d0 /* ldrsb */,\n/* l s h */ 0xe11000f0 /* ldrsh */,\n/* l s N */ 0x00000000 /* not allowed */,\n};\n\n#define EMIT_DATA_TRANSFER(type, add, target_reg, base_reg, arg) \\\n\t(data_transfer_insts[(type) & 0xf] | ((add) << 23) | RD(target_reg) | RN(base_reg) | (arg))\n\n/* Normal ldr/str instruction.\n   Type2: ldrsb, ldrh, ldrsh */\n#define IS_TYPE1_TRANSFER(type) \\\n\t(data_transfer_insts[(type) & 0xf] & 0x04000000)\n#define TYPE2_TRANSFER_IMM(imm) \\\n\t(((imm) & 0xf) | (((imm) & 0xf0) << 4) | (1 << 22))\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, size, i, tmp;\n\tsljit_uw push;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\t/* Push saved registers, temporary registers\n\t   stmdb sp!, {..., lr} */\n\tpush = PUSH | (1 << 14);\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--)\n\t\tpush |= 1 << reg_map[i];\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--)\n\t\tpush |= 1 << reg_map[i];\n\n\tFAIL_IF(push_inst(compiler, push));\n\n\t/* Stack must be aligned to 8 bytes: */\n\tsize = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tlocal_size = ((size + local_size + 7) & ~7) - size;\n\tcompiler->local_size = local_size;\n\tif (local_size > 0)\n\t\tFAIL_IF(emit_op(compiler, SLJIT_SUB, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size));\n\n\targs = get_arg_count(arg_types);\n\n\tif (args >= 1)\n\t\tFAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S0) | RM(SLJIT_R0)));\n\tif (args >= 2)\n\t\tFAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S1) | RM(SLJIT_R1)));\n\tif (args >= 3)\n\t\tFAIL_IF(push_inst(compiler, MOV | RD(SLJIT_S2) | RM(SLJIT_R2)));\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tsize = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tcompiler->local_size = ((size + local_size + 7) & ~7) - size;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 i, tmp;\n\tsljit_uw pop;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tif (compiler->local_size > 0)\n\t\tFAIL_IF(emit_op(compiler, SLJIT_ADD, ALLOW_IMM, SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));\n\n\t/* Push saved registers, temporary registers\n\t   ldmia sp!, {..., pc} */\n\tpop = POP | (1 << 15);\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--)\n\t\tpop |= 1 << reg_map[i];\n\n\tfor (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--)\n\t\tpop |= 1 << reg_map[i];\n\n\treturn push_inst(compiler, pop);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n/* flags: */\n  /* Arguments are swapped. */\n#define ARGS_SWAPPED\t0x01\n  /* Inverted immediate. */\n#define INV_IMM\t\t0x02\n  /* Source and destination is register. */\n#define MOVE_REG_CONV\t0x04\n  /* Unused return value. */\n#define UNUSED_RETURN\t0x08\n/* SET_FLAGS must be (1 << 20) as it is also the value of S bit (can be used for optimization). */\n#define SET_FLAGS\t(1 << 20)\n/* dst: reg\n   src1: reg\n   src2: reg or imm (if allowed)\n   SRC2_IMM must be (1 << 25) as it is also the value of I bit (can be used for optimization). */\n#define SRC2_IMM\t(1 << 25)\n\n#define EMIT_SHIFT_INS_AND_RETURN(opcode) \\\n\tSLJIT_ASSERT(!(flags & INV_IMM) && !(src2 & SRC2_IMM)); \\\n\tif (compiler->shift_imm != 0x20) { \\\n\t\tSLJIT_ASSERT(src1 == TMP_REG1); \\\n\t\tSLJIT_ASSERT(!(flags & ARGS_SWAPPED)); \\\n\t\t\\\n\t\tif (compiler->shift_imm != 0) \\\n\t\t\treturn push_inst(compiler, MOV | (flags & SET_FLAGS) | \\\n\t\t\t\tRD(dst) | (compiler->shift_imm << 7) | (opcode << 5) | RM(src2)); \\\n\t\treturn push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst) | RM(src2)); \\\n\t} \\\n\treturn push_inst(compiler, MOV | (flags & SET_FLAGS) | RD(dst) | \\\n\t\t(reg_map[(flags & ARGS_SWAPPED) ? src1 : src2] << 8) | (opcode << 5) | 0x10 | RM((flags & ARGS_SWAPPED) ? src2 : src1));\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_s32 src2)\n{\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));\n\t\tif (dst != src2) {\n\t\t\tif (src2 & SRC2_IMM) {\n\t\t\t\treturn push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2);\n\t\t\t}\n\t\t\treturn push_inst(compiler, MOV | RD(dst) | RM(src2));\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));\n\t\tif (flags & MOVE_REG_CONV) {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\tif (op == SLJIT_MOV_U8)\n\t\t\t\treturn push_inst(compiler, AND | RD(dst) | RN(src2) | SRC2_IMM | 0xff);\n\t\t\tFAIL_IF(push_inst(compiler, MOV | RD(dst) | (24 << 7) | RM(src2)));\n\t\t\treturn push_inst(compiler, MOV | RD(dst) | (24 << 7) | (op == SLJIT_MOV_U8 ? 0x20 : 0x40) | RM(dst));\n#else\n\t\t\treturn push_inst(compiler, (op == SLJIT_MOV_U8 ? UXTB : SXTB) | RD(dst) | RM(src2));\n#endif\n\t\t}\n\t\telse if (dst != src2) {\n\t\t\tSLJIT_ASSERT(src2 & SRC2_IMM);\n\t\t\treturn push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));\n\t\tif (flags & MOVE_REG_CONV) {\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t\t\tFAIL_IF(push_inst(compiler, MOV | RD(dst) | (16 << 7) | RM(src2)));\n\t\t\treturn push_inst(compiler, MOV | RD(dst) | (16 << 7) | (op == SLJIT_MOV_U16 ? 0x20 : 0x40) | RM(dst));\n#else\n\t\t\treturn push_inst(compiler, (op == SLJIT_MOV_U16 ? UXTH : SXTH) | RD(dst) | RM(src2));\n#endif\n\t\t}\n\t\telse if (dst != src2) {\n\t\t\tSLJIT_ASSERT(src2 & SRC2_IMM);\n\t\t\treturn push_inst(compiler, ((flags & INV_IMM) ? MVN : MOV) | RD(dst) | src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tif (src2 & SRC2_IMM) {\n\t\t\treturn push_inst(compiler, ((flags & INV_IMM) ? MOV : MVN) | (flags & SET_FLAGS) | RD(dst) | src2);\n\t\t}\n\t\treturn push_inst(compiler, MVN | (flags & SET_FLAGS) | RD(dst) | RM(src2));\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\tSLJIT_ASSERT(!(src2 & SRC2_IMM));\n\t\tFAIL_IF(push_inst(compiler, CLZ | RD(dst) | RM(src2)));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ADD:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\tif ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED))\n\t\t\treturn push_inst(compiler, CMN | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\t\treturn push_inst(compiler, ADD | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_ADDC:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\treturn push_inst(compiler, ADC | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_SUB:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\tif ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED))\n\t\t\treturn push_inst(compiler, CMP | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\t\treturn push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SUB : RSB) | (flags & SET_FLAGS)\n\t\t\t| RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_SUBC:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\treturn push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SBC : RSC) | (flags & SET_FLAGS)\n\t\t\t| RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_MUL:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\tSLJIT_ASSERT(!(src2 & SRC2_IMM));\n\n\t\tif (!HAS_FLAGS(op))\n\t\t\treturn push_inst(compiler, MUL | (reg_map[dst] << 16) | (reg_map[src2] << 8) | reg_map[src1]);\n\n\t\tFAIL_IF(push_inst(compiler, SMULL | (reg_map[TMP_REG1] << 16) | (reg_map[dst] << 12) | (reg_map[src2] << 8) | reg_map[src1]));\n\n\t\t/* cmp TMP_REG1, dst asr #31. */\n\t\treturn push_inst(compiler, CMP | SET_FLAGS | RN(TMP_REG1) | RM(dst) | 0xfc0);\n\n\tcase SLJIT_AND:\n\t\treturn push_inst(compiler, (!(flags & INV_IMM) ? AND : BIC) | (flags & SET_FLAGS)\n\t\t\t| RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_OR:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\treturn push_inst(compiler, ORR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_XOR:\n\t\tSLJIT_ASSERT(!(flags & INV_IMM));\n\t\treturn push_inst(compiler, EOR | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));\n\n\tcase SLJIT_SHL:\n\t\tEMIT_SHIFT_INS_AND_RETURN(0);\n\n\tcase SLJIT_LSHR:\n\t\tEMIT_SHIFT_INS_AND_RETURN(1);\n\n\tcase SLJIT_ASHR:\n\t\tEMIT_SHIFT_INS_AND_RETURN(2);\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\n#undef EMIT_SHIFT_INS_AND_RETURN\n\n/* Tests whether the immediate can be stored in the 12 bit imm field.\n   Returns with 0 if not possible. */\nstatic sljit_uw get_imm(sljit_uw imm)\n{\n\tsljit_s32 rol;\n\n\tif (imm <= 0xff)\n\t\treturn SRC2_IMM | imm;\n\n\tif (!(imm & 0xff000000)) {\n\t\timm <<= 8;\n\t\trol = 8;\n\t}\n\telse {\n\t\timm = (imm << 24) | (imm >> 8);\n\t\trol = 0;\n\t}\n\n\tif (!(imm & 0xff000000)) {\n\t\timm <<= 8;\n\t\trol += 4;\n\t}\n\n\tif (!(imm & 0xf0000000)) {\n\t\timm <<= 4;\n\t\trol += 2;\n\t}\n\n\tif (!(imm & 0xc0000000)) {\n\t\timm <<= 2;\n\t\trol += 1;\n\t}\n\n\tif (!(imm & 0x00ffffff))\n\t\treturn SRC2_IMM | (imm >> 24) | (rol << 8);\n\telse\n\t\treturn 0;\n}\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\nstatic sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm, sljit_s32 positive)\n{\n\tsljit_uw mask;\n\tsljit_uw imm1;\n\tsljit_uw imm2;\n\tsljit_s32 rol;\n\n\t/* Step1: Search a zero byte (8 continous zero bit). */\n\tmask = 0xff000000;\n\trol = 8;\n\twhile(1) {\n\t\tif (!(imm & mask)) {\n\t\t\t/* Rol imm by rol. */\n\t\t\timm = (imm << rol) | (imm >> (32 - rol));\n\t\t\t/* Calculate arm rol. */\n\t\t\trol = 4 + (rol >> 1);\n\t\t\tbreak;\n\t\t}\n\t\trol += 2;\n\t\tmask >>= 2;\n\t\tif (mask & 0x3) {\n\t\t\t/* rol by 8. */\n\t\t\timm = (imm << 8) | (imm >> 24);\n\t\t\tmask = 0xff00;\n\t\t\trol = 24;\n\t\t\twhile (1) {\n\t\t\t\tif (!(imm & mask)) {\n\t\t\t\t\t/* Rol imm by rol. */\n\t\t\t\t\timm = (imm << rol) | (imm >> (32 - rol));\n\t\t\t\t\t/* Calculate arm rol. */\n\t\t\t\t\trol = (rol >> 1) - 8;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\trol += 2;\n\t\t\t\tmask >>= 2;\n\t\t\t\tif (mask & 0x3)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* The low 8 bit must be zero. */\n\tSLJIT_ASSERT(!(imm & 0xff));\n\n\tif (!(imm & 0xff000000)) {\n\t\timm1 = SRC2_IMM | ((imm >> 16) & 0xff) | (((rol + 4) & 0xf) << 8);\n\t\timm2 = SRC2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8);\n\t}\n\telse if (imm & 0xc0000000) {\n\t\timm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8);\n\t\timm <<= 8;\n\t\trol += 4;\n\n\t\tif (!(imm & 0xff000000)) {\n\t\t\timm <<= 8;\n\t\t\trol += 4;\n\t\t}\n\n\t\tif (!(imm & 0xf0000000)) {\n\t\t\timm <<= 4;\n\t\t\trol += 2;\n\t\t}\n\n\t\tif (!(imm & 0xc0000000)) {\n\t\t\timm <<= 2;\n\t\t\trol += 1;\n\t\t}\n\n\t\tif (!(imm & 0x00ffffff))\n\t\t\timm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);\n\t\telse\n\t\t\treturn 0;\n\t}\n\telse {\n\t\tif (!(imm & 0xf0000000)) {\n\t\t\timm <<= 4;\n\t\t\trol += 2;\n\t\t}\n\n\t\tif (!(imm & 0xc0000000)) {\n\t\t\timm <<= 2;\n\t\t\trol += 1;\n\t\t}\n\n\t\timm1 = SRC2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8);\n\t\timm <<= 8;\n\t\trol += 4;\n\n\t\tif (!(imm & 0xf0000000)) {\n\t\t\timm <<= 4;\n\t\t\trol += 2;\n\t\t}\n\n\t\tif (!(imm & 0xc0000000)) {\n\t\t\timm <<= 2;\n\t\t\trol += 1;\n\t\t}\n\n\t\tif (!(imm & 0x00ffffff))\n\t\t\timm2 = SRC2_IMM | (imm >> 24) | ((rol & 0xf) << 8);\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\tFAIL_IF(push_inst(compiler, (positive ? MOV : MVN) | RD(reg) | imm1));\n\tFAIL_IF(push_inst(compiler, (positive ? ORR : BIC) | RD(reg) | RN(reg) | imm2));\n\treturn 1;\n}\n#endif\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm)\n{\n\tsljit_uw tmp;\n\n#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\tif (!(imm & ~0xffff))\n\t\treturn push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff));\n#endif\n\n\t/* Create imm by 1 inst. */\n\ttmp = get_imm(imm);\n\tif (tmp)\n\t\treturn push_inst(compiler, MOV | RD(reg) | tmp);\n\n\ttmp = get_imm(~imm);\n\tif (tmp)\n\t\treturn push_inst(compiler, MVN | RD(reg) | tmp);\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\t/* Create imm by 2 inst. */\n\tFAIL_IF(generate_int(compiler, reg, imm, 1));\n\tFAIL_IF(generate_int(compiler, reg, ~imm, 0));\n\n\t/* Load integer. */\n\treturn push_inst_with_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), imm);\n#else\n\tFAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)));\n\tif (imm <= 0xffff)\n\t\treturn SLJIT_SUCCESS;\n\treturn push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff));\n#endif\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,\n\tsljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg)\n{\n\tsljit_uw imm, offset_reg;\n\tsljit_uw is_type1_transfer = IS_TYPE1_TRANSFER(flags);\n\n\tSLJIT_ASSERT (arg & SLJIT_MEM);\n\tSLJIT_ASSERT((arg & REG_MASK) != tmp_reg);\n\n\tif ((arg & REG_MASK) == SLJIT_UNUSED) {\n\t\tif (is_type1_transfer) {\n\t\t\tFAIL_IF(load_immediate(compiler, tmp_reg, argw & ~0xfff));\n\t\t\targw &= 0xfff;\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(load_immediate(compiler, tmp_reg, argw & ~0xff));\n\t\t\targw &= 0xff;\n\t\t}\n\n\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg,\n\t\t\tis_type1_transfer ? argw : TYPE2_TRANSFER_IMM(argw)));\n\t}\n\n\tif (arg & OFFS_REG_MASK) {\n\t\toffset_reg = OFFS_REG(arg);\n\t\targ &= REG_MASK;\n\t\targw &= 0x3;\n\n\t\tif (argw != 0 && !is_type1_transfer) {\n\t\t\tFAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | RM(offset_reg) | (argw << 7)));\n\t\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, tmp_reg, TYPE2_TRANSFER_IMM(0)));\n\t\t}\n\n\t\t/* Bit 25: RM is offset. */\n\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg,\n\t\t\tRM(offset_reg) | (is_type1_transfer ? (1 << 25) : 0) | (argw << 7)));\n\t}\n\n\targ &= REG_MASK;\n\n\tif (is_type1_transfer) {\n\t\tif (argw > 0xfff) {\n\t\t\timm = get_imm(argw & ~0xfff);\n\t\t\tif (imm) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | imm));\n\t\t\t\targw = argw & 0xfff;\n\t\t\t\targ = tmp_reg;\n\t\t\t}\n\t\t}\n\t\telse if (argw < -0xfff) {\n\t\t\timm = get_imm(-argw & ~0xfff);\n\t\t\tif (imm) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SUB | RD(tmp_reg) | RN(arg) | imm));\n\t\t\t\targw = -(-argw & 0xfff);\n\t\t\t\targ = tmp_reg;\n\t\t\t}\n\t\t}\n\n\t\tif (argw >= 0 && argw <= 0xfff)\n\t\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, argw));\n\n\t\tif (argw < 0 && argw >= -0xfff)\n\t\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 0, reg, arg, -argw));\n\t}\n\telse {\n\t\tif (argw > 0xff) {\n\t\t\timm = get_imm(argw & ~0xff);\n\t\t\tif (imm) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg) | imm));\n\t\t\t\targw = argw & 0xff;\n\t\t\t\targ = tmp_reg;\n\t\t\t}\n\t\t}\n\t\telse if (argw < -0xff) {\n\t\t\timm = get_imm(-argw & ~0xff);\n\t\t\tif (imm) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SUB | RD(tmp_reg) | RN(arg) | imm));\n\t\t\t\targw = -(-argw & 0xff);\n\t\t\t\targ = tmp_reg;\n\t\t\t}\n\t\t}\n\n\t\tif (argw >= 0 && argw <= 0xff)\n\t\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg, TYPE2_TRANSFER_IMM(argw)));\n\n\t\tif (argw < 0 && argw >= -0xff) {\n\t\t\targw = -argw;\n\t\t\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 0, reg, arg, TYPE2_TRANSFER_IMM(argw)));\n\t\t}\n\t}\n\n\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\treturn push_inst(compiler, EMIT_DATA_TRANSFER(flags, 1, reg, arg,\n\t\tRM(tmp_reg) | (is_type1_transfer ? (1 << 25) : 0)));\n}\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* src1 is reg or TMP_REG1\n\t   src2 is reg, TMP_REG2, or imm\n\t   result goes to TMP_REG2, so put result can use TMP_REG1. */\n\n\t/* We prefers register and simple consts. */\n\tsljit_s32 dst_reg;\n\tsljit_s32 src1_reg;\n\tsljit_s32 src2_reg;\n\tsljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\n\t/* Destination check. */\n\tif (SLJIT_UNLIKELY(dst == SLJIT_UNUSED))\n\t\tflags |= UNUSED_RETURN;\n\n\tSLJIT_ASSERT(!(inp_flags & ALLOW_INV_IMM) || (inp_flags & ALLOW_IMM));\n\n\tsrc2_reg = 0;\n\n\tdo {\n\t\tif (!(inp_flags & ALLOW_IMM))\n\t\t\tbreak;\n\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tsrc2_reg = get_imm(src2w);\n\t\t\tif (src2_reg)\n\t\t\t\tbreak;\n\t\t\tif (inp_flags & ALLOW_INV_IMM) {\n\t\t\t\tsrc2_reg = get_imm(~src2w);\n\t\t\t\tif (src2_reg) {\n\t\t\t\t\tflags |= INV_IMM;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (GET_OPCODE(op) == SLJIT_ADD) {\n\t\t\t\tsrc2_reg = get_imm(-src2w);\n\t\t\t\tif (src2_reg) {\n\t\t\t\t\top = SLJIT_SUB | GET_ALL_FLAGS(op);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (GET_OPCODE(op) == SLJIT_SUB) {\n\t\t\t\tsrc2_reg = get_imm(-src2w);\n\t\t\t\tif (src2_reg) {\n\t\t\t\t\top = SLJIT_ADD | GET_ALL_FLAGS(op);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (src1 & SLJIT_IMM) {\n\t\t\tsrc2_reg = get_imm(src1w);\n\t\t\tif (src2_reg) {\n\t\t\t\tflags |= ARGS_SWAPPED;\n\t\t\t\tsrc1 = src2;\n\t\t\t\tsrc1w = src2w;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (inp_flags & ALLOW_INV_IMM) {\n\t\t\t\tsrc2_reg = get_imm(~src1w);\n\t\t\t\tif (src2_reg) {\n\t\t\t\t\tflags |= ARGS_SWAPPED | INV_IMM;\n\t\t\t\t\tsrc1 = src2;\n\t\t\t\t\tsrc1w = src2w;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (GET_OPCODE(op) == SLJIT_ADD) {\n\t\t\t\tsrc2_reg = get_imm(-src1w);\n\t\t\t\tif (src2_reg) {\n\t\t\t\t\t/* Note: add is commutative operation. */\n\t\t\t\t\tsrc1 = src2;\n\t\t\t\t\tsrc1w = src2w;\n\t\t\t\t\top = SLJIT_SUB | GET_ALL_FLAGS(op);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} while(0);\n\n\t/* Source 1. */\n\tif (FAST_IS_REG(src1))\n\t\tsrc1_reg = src1;\n\telse if (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1));\n\t\tsrc1_reg = TMP_REG1;\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, src1w));\n\t\tsrc1_reg = TMP_REG1;\n\t}\n\n\t/* Destination. */\n\tdst_reg = SLOW_IS_REG(dst) ? dst : TMP_REG2;\n\n\tif (op <= SLJIT_MOV_P) {\n\t\tif (dst & SLJIT_MEM) {\n\t\t\tif (inp_flags & BYTE_SIZE)\n\t\t\t\tinp_flags &= ~SIGNED;\n\n\t\t\tif (FAST_IS_REG(src2))\n\t\t\t\treturn emit_op_mem(compiler, inp_flags, src2, dst, dstw, TMP_REG2);\n\t\t}\n\n\t\tif (FAST_IS_REG(src2) && dst_reg != TMP_REG2)\n\t\t\tflags |= MOVE_REG_CONV;\n\t}\n\n\t/* Source 2. */\n\tif (src2_reg == 0) {\n\t\tsrc2_reg = (op <= SLJIT_MOV_P) ? dst_reg : TMP_REG2;\n\n\t\tif (FAST_IS_REG(src2))\n\t\t\tsrc2_reg = src2;\n\t\telse if (src2 & SLJIT_MEM)\n\t\t\tFAIL_IF(emit_op_mem(compiler, inp_flags | LOAD_DATA, src2_reg, src2, src2w, TMP_REG2));\n\t\telse\n\t\t\tFAIL_IF(load_immediate(compiler, src2_reg, src2w));\n\t}\n\n\tFAIL_IF(emit_single_op(compiler, op, flags, dst_reg, src1_reg, src2_reg));\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\n\treturn emit_op_mem(compiler, inp_flags, dst_reg, dst, dstw, TMP_REG1);\n}\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(__GNUC__)\nextern unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator);\nextern int __aeabi_idivmod(int numerator, int denominator);\n#else\n#error \"Software divmod functions are needed\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n\tsljit_sw saved_reg_list[3];\n\tsljit_sw saved_reg_count;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\t\tFAIL_IF(push_inst(compiler, BKPT));\n\t\tbreak;\n\tcase SLJIT_NOP:\n\t\tFAIL_IF(push_inst(compiler, NOP));\n\t\tbreak;\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\t\treturn push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL)\n\t\t\t| (reg_map[SLJIT_R1] << 16)\n\t\t\t| (reg_map[SLJIT_R0] << 12)\n\t\t\t| (reg_map[SLJIT_R0] << 8)\n\t\t\t| reg_map[SLJIT_R1]);\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\tSLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);\n\t\tSLJIT_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 3);\n\n\t\tsaved_reg_count = 0;\n\t\tif (compiler->scratches >= 4)\n\t\t\tsaved_reg_list[saved_reg_count++] = 3;\n\t\tif (compiler->scratches >= 3)\n\t\t\tsaved_reg_list[saved_reg_count++] = 2;\n\t\tif (op >= SLJIT_DIV_UW)\n\t\t\tsaved_reg_list[saved_reg_count++] = 1;\n\n\t\tif (saved_reg_count > 0) {\n\t\t\tFAIL_IF(push_inst(compiler, 0xe52d0000 | (saved_reg_count >= 3 ? 16 : 8)\n\t\t\t\t\t\t| (saved_reg_list[0] << 12) /* str rX, [sp, #-8/-16]! */));\n\t\t\tif (saved_reg_count >= 2) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[1] < 8);\n\t\t\t\tFAIL_IF(push_inst(compiler, 0xe58d0004 | (saved_reg_list[1] << 12) /* str rX, [sp, #4] */));\n\t\t\t}\n\t\t\tif (saved_reg_count >= 3) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[2] < 8);\n\t\t\t\tFAIL_IF(push_inst(compiler, 0xe58d0008 | (saved_reg_list[2] << 12) /* str rX, [sp, #8] */));\n\t\t\t}\n\t\t}\n\n#if defined(__GNUC__)\n\t\tFAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM,\n\t\t\t((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));\n#else\n#error \"Software divmod functions are needed\"\n#endif\n\n\t\tif (saved_reg_count > 0) {\n\t\t\tif (saved_reg_count >= 3) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[2] < 8);\n\t\t\t\tFAIL_IF(push_inst(compiler, 0xe59d0008 | (saved_reg_list[2] << 12) /* ldr rX, [sp, #8] */));\n\t\t\t}\n\t\t\tif (saved_reg_count >= 2) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[1] < 8);\n\t\t\t\tFAIL_IF(push_inst(compiler, 0xe59d0004 | (saved_reg_list[1] << 12) /* ldr rX, [sp, #4] */));\n\t\t\t}\n\t\t\treturn push_inst(compiler, 0xe49d0000 | (saved_reg_count >= 3 ? 16 : 8)\n\t\t\t\t\t\t| (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM))\n\t\t\treturn emit_op_mem(compiler, PRELOAD | LOAD_DATA, TMP_PC, src, srcw, TMP_REG1);\n#endif\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\treturn emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U8:\n\t\treturn emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);\n\n\tcase SLJIT_MOV_S8:\n\t\treturn emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED | BYTE_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);\n\n\tcase SLJIT_MOV_U16:\n\t\treturn emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);\n\n\tcase SLJIT_MOV_S16:\n\t\treturn emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED | HALF_SIZE, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);\n\n\tcase SLJIT_NOT:\n\t\treturn emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_NEG:\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\t\tcompiler->skip_checks = 1;\n#endif\n\t\treturn sljit_emit_op2(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), dst, dstw, SLJIT_IMM, 0, src, srcw);\n\n\tcase SLJIT_CLZ:\n\t\treturn emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD:\n\tcase SLJIT_ADDC:\n\tcase SLJIT_SUB:\n\tcase SLJIT_SUBC:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\t\treturn emit_op(compiler, op, ALLOW_IMM, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_MUL:\n\t\treturn emit_op(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_AND:\n\t\treturn emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tcompiler->shift_imm = src2w & 0x1f;\n\t\t\treturn emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src1, src1w);\n\t\t}\n\t\telse {\n\t\t\tcompiler->shift_imm = 0x20;\n\t\t\treturn emit_op(compiler, op, 0, dst, dstw, src1, src1w, src2, src2w);\n\t\t}\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn (freg_map[reg] << 1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\treturn push_inst(compiler, *(sljit_uw*)instruction);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n\n#define FPU_LOAD (1 << 20)\n#define EMIT_FPU_DATA_TRANSFER(inst, add, base, freg, offs) \\\n\t((inst) | ((add) << 23) | (reg_map[base] << 16) | (freg_map[freg] << 12) | (offs))\n#define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \\\n\t((opcode) | (mode) | (freg_map[dst] << 12) | freg_map[src1] | (freg_map[src2] << 16))\n\nstatic sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)\n{\n\tsljit_uw imm;\n\tsljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD));\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\targ &= ~SLJIT_MEM;\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\tFAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | ((argw & 0x3) << 7)));\n\t\targ = TMP_REG2;\n\t\targw = 0;\n\t}\n\n\t/* Fast loads and stores. */\n\tif (arg) {\n\t\tif (!(argw & ~0x3fc))\n\t\t\treturn push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, arg & REG_MASK, reg, argw >> 2));\n\t\tif (!(-argw & ~0x3fc))\n\t\t\treturn push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 0, arg & REG_MASK, reg, (-argw) >> 2));\n\n\t\timm = get_imm(argw & ~0x3fc);\n\t\tif (imm) {\n\t\t\tFAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | imm));\n\t\t\treturn push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG2, reg, (argw & 0x3fc) >> 2));\n\t\t}\n\t\timm = get_imm(-argw & ~0x3fc);\n\t\tif (imm) {\n\t\t\targw = -argw;\n\t\t\tFAIL_IF(push_inst(compiler, SUB | RD(TMP_REG2) | RN(arg & REG_MASK) | imm));\n\t\t\treturn push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 0, TMP_REG2, reg, (argw & 0x3fc) >> 2));\n\t\t}\n\t}\n\n\tif (arg) {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG2, argw));\n\t\tFAIL_IF(push_inst(compiler, ADD | RD(TMP_REG2) | RN(arg & REG_MASK) | RM(TMP_REG2)));\n\t}\n\telse\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG2, argw));\n\n\treturn push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG2, reg, 0));\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\top ^= SLJIT_F32_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw));\n\t\tsrc = TMP_FREG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_S32_F32, op & SLJIT_F32_OP, TMP_FREG1, src, 0)));\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, VMOV | (1 << 20) | RD(dst) | (freg_map[TMP_FREG1] << 16));\n\n\t/* Store the integer value from a VFP register. */\n\treturn emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\top ^= SLJIT_F32_OP;\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, VMOV | RD(src) | (freg_map[TMP_FREG1] << 16)));\n\telse if (src & SLJIT_MEM) {\n\t\t/* Load the integer value into a VFP register. */\n\t\tFAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw));\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tFAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | (freg_map[TMP_FREG1] << 16)));\n\t}\n\n\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_F32_OP, dst_r, TMP_FREG1, 0)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\top ^= SLJIT_F32_OP;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_F32_OP, src1, src2, 0)));\n\treturn push_inst(compiler, VMRS);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\n\tSLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32)\n\t\top ^= SLJIT_F32_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw));\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1)\n\t\t\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, op & SLJIT_F32_OP, dst_r, src, 0)));\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VNEG_F32, op & SLJIT_F32_OP, dst_r, src, 0)));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_F32_OP, dst_r, src, 0)));\n\t\tbreak;\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F64_F32, op & SLJIT_F32_OP, dst_r, src, 0)));\n\t\top ^= SLJIT_F32_OP;\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\top ^= SLJIT_F32_OP;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));\n\t\tbreak;\n\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));\n\t\tbreak;\n\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));\n\t\tbreak;\n\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));\n\t\tbreak;\n\t}\n\n\tif (dst_r == TMP_FREG1)\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw));\n\n\treturn SLJIT_SUCCESS;\n}\n\n#undef FPU_LOAD\n#undef EMIT_FPU_DATA_TRANSFER\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG2] == 14);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, MOV | RD(dst) | RM(TMP_REG2));\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG2] == 14);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, MOV | RD(TMP_REG2) | RM(src)));\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG2, src, srcw, TMP_REG1));\n\n\treturn push_inst(compiler, BX | RM(TMP_REG2));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_uw get_cc(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\tcase SLJIT_EQUAL_F64:\n\t\treturn 0x00000000;\n\n\tcase SLJIT_NOT_EQUAL:\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\treturn 0x10000000;\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_LESS_F64:\n\t\treturn 0x30000000;\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\treturn 0x20000000;\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_GREATER_F64:\n\t\treturn 0x80000000;\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn 0x90000000;\n\n\tcase SLJIT_SIG_LESS:\n\t\treturn 0xb0000000;\n\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn 0xa0000000;\n\n\tcase SLJIT_SIG_GREATER:\n\t\treturn 0xc0000000;\n\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn 0xd0000000;\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn 0x60000000;\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_ORDERED_F64:\n\t\treturn 0x70000000;\n\n\tdefault:\n\t\tSLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL_CDECL);\n\t\treturn 0xe0000000;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\treturn label;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] != 14);\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tif (type >= SLJIT_FAST_CALL)\n\t\tPTR_FAIL_IF(prepare_blx(compiler));\n\tPTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1,\n\t\ttype <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(type), 0));\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP) {\n\t\tjump->addr = compiler->size;\n\t\tcompiler->patches++;\n\t}\n\n\tif (type >= SLJIT_FAST_CALL) {\n\t\tjump->flags |= IS_BL;\n\t\tPTR_FAIL_IF(emit_blx(compiler));\n\t}\n\n\tif (!(jump->flags & SLJIT_REWRITABLE_JUMP))\n\t\tjump->addr = compiler->size;\n#else\n\tif (type >= SLJIT_FAST_CALL)\n\t\tjump->flags |= IS_BL;\n\tPTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0));\n\tPTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(type)));\n\tjump->addr = compiler->size;\n#endif\n\treturn jump;\n}\n\n#ifdef __SOFTFP__\n\nstatic sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src)\n{\n\tsljit_s32 stack_offset = 0;\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 word_arg_offset = 0;\n\tsljit_s32 float_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_s32 src_offset = 4 * sizeof(sljit_sw);\n\tsljit_u8 offsets[4];\n\n\tif (src && FAST_IS_REG(*src))\n\t\tsrc_offset = reg_map[*src] * sizeof(sljit_sw);\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_f32);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_offset & 0x7)\n\t\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_f64);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\targ_count++;\n\t\t\tword_arg_offset += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (stack_offset > 16)\n\t\tFAIL_IF(push_inst(compiler, SUB | RD(SLJIT_SP) | RN(SLJIT_SP) | SRC2_IMM | (((stack_offset - 16) + 0x7) & ~0x7)));\n\n\t/* Process arguments in reversed direction. */\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tif (stack_offset < 16) {\n\t\t\t\tif (src_offset == stack_offset) {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2)));\n\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t}\n\t\t\t\tFAIL_IF(push_inst(compiler, VMOV | 0x100000 | (float_arg_count << 16) | (stack_offset << 10)));\n\t\t\t} else\n\t\t\t\tFAIL_IF(push_inst(compiler, VSTR_F32 | 0x800000 | RN(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2)));\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tSLJIT_ASSERT((stack_offset & 0x7) == 0);\n\n\t\t\tif (stack_offset < 16) {\n\t\t\t\tif (src_offset == stack_offset || src_offset == stack_offset + sizeof(sljit_sw)) {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2)));\n\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t}\n\t\t\t\tFAIL_IF(push_inst(compiler, VMOV2 | 0x100000 | (stack_offset << 10) | ((stack_offset + sizeof(sljit_sw)) << 14) | float_arg_count));\n\t\t\t} else\n\t\t\t\tFAIL_IF(push_inst(compiler, VSTR_F32 | 0x800100 | RN(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2)));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count--;\n\t\t\tword_arg_offset -= sizeof(sljit_sw);\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tSLJIT_ASSERT(stack_offset >= word_arg_offset);\n\n\t\t\tif (stack_offset != word_arg_offset) {\n\t\t\t\tif (stack_offset < 16) {\n\t\t\t\t\tif (src_offset == stack_offset) {\n\t\t\t\t\t\tFAIL_IF(push_inst(compiler, MOV | RD(TMP_REG1) | (src_offset >> 2)));\n\t\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t\t}\n\t\t\t\t\telse if (src_offset == word_arg_offset) {\n\t\t\t\t\t\t*src = 1 + (stack_offset >> 2);\n\t\t\t\t\t\tsrc_offset = stack_offset;\n\t\t\t\t\t}\n\t\t\t\t\tFAIL_IF(push_inst(compiler, MOV | (stack_offset << 10) | (word_arg_offset >> 2)));\n\t\t\t\t} else\n\t\t\t\t\tFAIL_IF(push_inst(compiler, data_transfer_insts[WORD_SIZE] | 0x800000 | RN(SLJIT_SP) | (word_arg_offset << 10) | (stack_offset - 16)));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 softfloat_post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)\n{\n\tsljit_s32 stack_size = 0;\n\n\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32)\n\t\tFAIL_IF(push_inst(compiler, VMOV | (0 << 16) | (0 << 12)));\n\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64)\n\t\tFAIL_IF(push_inst(compiler, VMOV2 | (1 << 16) | (0 << 12) | 0));\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_size & 0x7)\n\t\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (stack_size <= 16)\n\t\treturn SLJIT_SUCCESS;\n\n\treturn push_inst(compiler, ADD | RD(SLJIT_SP) | RN(SLJIT_SP) | SRC2_IMM | (((stack_size - 16) + 0x7) & ~0x7));\n}\n\n#else /* !__SOFTFP__ */\n\nstatic sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)\n{\n\tsljit_u32 remap = 0;\n\tsljit_u32 offset = 0;\n\tsljit_u32 new_offset, mask;\n\n\t/* Remove return value. */\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) {\n\t\t\tnew_offset = 0;\n\t\t\tmask = 1;\n\n\t\t\twhile (remap & mask) {\n\t\t\t\tnew_offset++;\n\t\t\t\tmask <<= 1;\n\t\t\t}\n\t\t\tremap |= mask;\n\n\t\t\tif (offset != new_offset)\n\t\t\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32,\n\t\t\t\t\t0, (new_offset >> 1) + 1, (offset >> 1) + 1, 0) | ((new_offset & 0x1) ? 0x400000 : 0)));\n\n\t\t\toffset += 2;\n\t\t}\n\t\telse if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) {\n\t\t\tnew_offset = 0;\n\t\t\tmask = 3;\n\n\t\t\twhile (remap & mask) {\n\t\t\t\tnew_offset += 2;\n\t\t\t\tmask <<= 2;\n\t\t\t}\n\t\t\tremap |= mask;\n\n\t\t\tif (offset != new_offset)\n\t\t\t\tFAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, SLJIT_F32_OP, (new_offset >> 1) + 1, (offset >> 1) + 1, 0)));\n\n\t\t\toffset += 2;\n\t\t}\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#endif /* __SOFTFP__ */\n\n#undef EMIT_FPU_OPERATION\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n#ifdef __SOFTFP__\n\tstruct sljit_jump *jump;\n#endif\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n#ifdef __SOFTFP__\n\tPTR_FAIL_IF(softfloat_call_with_args(compiler, arg_types, NULL));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\tjump = sljit_emit_jump(compiler, type);\n\tPTR_FAIL_IF(jump == NULL);\n\n\tPTR_FAIL_IF(softfloat_post_call_with_args(compiler, arg_types));\n\treturn jump;\n#else /* !__SOFTFP__ */\n\tPTR_FAIL_IF(hardfloat_call_with_args(compiler, arg_types));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n#endif /* __SOFTFP__ */\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] != 14);\n\n\tif (!(src & SLJIT_IMM)) {\n\t\tif (FAST_IS_REG(src)) {\n\t\t\tSLJIT_ASSERT(reg_map[src] != 14);\n\t\t\treturn push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(src));\n\t\t}\n\n\t\tSLJIT_ASSERT(src & SLJIT_MEM);\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));\n\t\treturn push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1));\n\t}\n\n\t/* These jumps are converted to jump/call instructions when possible. */\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tFAIL_IF(!jump);\n\tset_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0));\n\tjump->u.target = srcw;\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tif (type >= SLJIT_FAST_CALL)\n\t\tFAIL_IF(prepare_blx(compiler));\n\tFAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0), 0));\n\tif (type >= SLJIT_FAST_CALL)\n\t\tFAIL_IF(emit_blx(compiler));\n#else\n\tFAIL_IF(emit_imm(compiler, TMP_REG1, 0));\n\tFAIL_IF(push_inst(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)));\n#endif\n\tjump->addr = compiler->size;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n#ifdef __SOFTFP__\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tFAIL_IF(softfloat_call_with_args(compiler, arg_types, &src));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\tFAIL_IF(sljit_emit_ijump(compiler, type, src, srcw));\n\n\treturn softfloat_post_call_with_args(compiler, arg_types);\n#else /* !__SOFTFP__ */\n\tFAIL_IF(hardfloat_call_with_args(compiler, arg_types));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n#endif /* __SOFTFP__ */\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 dst_reg, flags = GET_ALL_FLAGS(op);\n\tsljit_uw cc, ins;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\top = GET_OPCODE(op);\n\tcc = get_cc(type & 0xff);\n\tdst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (op < SLJIT_ADD) {\n\t\tFAIL_IF(push_inst(compiler, MOV | RD(dst_reg) | SRC2_IMM | 0));\n\t\tFAIL_IF(push_inst(compiler, ((MOV | RD(dst_reg) | SRC2_IMM | 1) & ~COND_MASK) | cc));\n\t\tif (dst & SLJIT_MEM)\n\t\t\treturn emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tins = (op == SLJIT_AND ? AND : (op == SLJIT_OR ? ORR : EOR));\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE | LOAD_DATA, TMP_REG1, dst, dstw, TMP_REG2));\n\n\tFAIL_IF(push_inst(compiler, ((ins | RD(dst_reg) | RN(dst_reg) | SRC2_IMM | 1) & ~COND_MASK) | cc));\n\n\tif (op == SLJIT_AND)\n\t\tFAIL_IF(push_inst(compiler, ((ins | RD(dst_reg) | RN(dst_reg) | SRC2_IMM | 0) & ~COND_MASK) | (cc ^ 0x10000000)));\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2));\n\n\tif (flags & SLJIT_SET_Z)\n\t\treturn push_inst(compiler, MOV | SET_FLAGS | RD(TMP_REG2) | RM(dst_reg));\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_uw cc, tmp;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n\tdst_reg &= ~SLJIT_I32_OP;\n\n\tcc = get_cc(type & 0xff);\n\n\tif (SLJIT_UNLIKELY(src & SLJIT_IMM)) {\n\t\ttmp = get_imm(srcw);\n\t\tif (tmp)\n\t\t\treturn push_inst(compiler, ((MOV | RD(dst_reg) | tmp) & ~COND_MASK) | cc);\n\n\t\ttmp = get_imm(~srcw);\n\t\tif (tmp)\n\t\t\treturn push_inst(compiler, ((MVN | RD(dst_reg) | tmp) & ~COND_MASK) | cc);\n\n#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)\n\t\ttmp = (sljit_uw) srcw;\n\t\tFAIL_IF(push_inst(compiler, (MOVW & ~COND_MASK) | cc | RD(dst_reg) | ((tmp << 4) & 0xf0000) | (tmp & 0xfff)));\n\t\tif (tmp <= 0xffff)\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn push_inst(compiler, (MOVT & ~COND_MASK) | cc | RD(dst_reg) | ((tmp >> 12) & 0xf0000) | ((tmp >> 16) & 0xfff));\n#else\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n#endif\n\t}\n\n\treturn push_inst(compiler, ((MOV | RD(dst_reg) | RM(src)) & ~COND_MASK) | cc);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_s32 flags;\n\tsljit_uw is_type1_transfer, inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));\n\n\tis_type1_transfer = 1;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tflags = WORD_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_U8:\n\t\tflags = BYTE_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_S8:\n\t\tif (!(type & SLJIT_MEM_STORE))\n\t\t\tis_type1_transfer = 0;\n\t\tflags = BYTE_SIZE | SIGNED;\n\t\tbreak;\n\tcase SLJIT_MOV_U16:\n\t\tis_type1_transfer = 0;\n\t\tflags = HALF_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_S16:\n\t\tis_type1_transfer = 0;\n\t\tflags = HALF_SIZE | SIGNED;\n\t\tbreak;\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tflags = WORD_SIZE;\n\t\tbreak;\n\t}\n\n\tif (!(type & SLJIT_MEM_STORE))\n\t\tflags |= LOAD_DATA;\n\n\tSLJIT_ASSERT(is_type1_transfer == !!IS_TYPE1_TRANSFER(flags));\n\n\tif (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {\n\t\tif (!is_type1_transfer && memw != 0)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t}\n\telse {\n\t\tif (is_type1_transfer) {\n\t\t\tif (memw > 4095 && memw < -4095)\n\t\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t\t}\n\t\telse {\n\t\t\tif (memw > 255 && memw < -255)\n\t\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t\t}\n\t}\n\n\tif (type & SLJIT_MEM_SUPP)\n\t\treturn SLJIT_SUCCESS;\n\n\tif (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {\n\t\tmemw &= 0x3;\n\n\t\tinst = EMIT_DATA_TRANSFER(flags, 1, reg, mem & REG_MASK, RM(OFFS_REG(mem)) | (memw << 7));\n\n\t\tif (is_type1_transfer)\n\t\t\tinst |= (1 << 25);\n\n\t\tif (type & SLJIT_MEM_PRE)\n\t\t\tinst |= (1 << 21);\n\t\telse\n\t\t\tinst ^= (1 << 24);\n\n\t\treturn push_inst(compiler, inst);\n\t}\n\n\tinst = EMIT_DATA_TRANSFER(flags, 0, reg, mem & REG_MASK, 0);\n\n\tif (type & SLJIT_MEM_PRE)\n\t\tinst |= (1 << 21);\n\telse\n\t\tinst ^= (1 << 24);\n\n\tif (is_type1_transfer) {\n\t\tif (memw >= 0)\n\t\t\tinst |= (1 << 23);\n\t\telse\n\t\t\tmemw = -memw;\n\n\t\treturn push_inst(compiler, inst | memw);\n\t}\n\n\tif (memw >= 0)\n\t\tinst |= (1 << 23);\n\telse\n\t\tmemw = -memw;\n\n\treturn push_inst(compiler, inst | TYPE2_TRANSFER_IMM(memw));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 reg;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\n\treg = SLOW_IS_REG(dst) ? dst : TMP_REG2;\n\n#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)\n\tPTR_FAIL_IF(push_inst_with_unique_literal(compiler, EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1, reg, TMP_PC, 0), init_value));\n\tcompiler->patches++;\n#else\n\tPTR_FAIL_IF(emit_imm(compiler, reg, init_value));\n#endif\n\tset_const(const_, compiler);\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, dst, dstw, TMP_REG1));\n\treturn const_;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tinline_set_jump_addr(addr, executable_offset, new_target, 1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tinline_set_const(addr, executable_offset, new_constant, 1);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeARM_64.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n\treturn \"ARM-64\" SLJIT_CPUINFO;\n}\n\n/* Length of an instruction word */\ntypedef sljit_u32 sljit_ins;\n\n#define TMP_ZERO\t(0)\n\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_LR\t\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n#define TMP_FP\t\t(SLJIT_NUMBER_OF_REGISTERS + 5)\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\n/* r18 - platform register, currently not used */\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {\n\t31, 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 31, 9, 10, 30, 29\n};\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 1, 2, 3, 4, 5, 6, 7\n};\n\n#define W_OP (1u << 31)\n#define RD(rd) (reg_map[rd])\n#define RT(rt) (reg_map[rt])\n#define RN(rn) (reg_map[rn] << 5)\n#define RT2(rt2) (reg_map[rt2] << 10)\n#define RM(rm) (reg_map[rm] << 16)\n#define VD(vd) (freg_map[vd])\n#define VT(vt) (freg_map[vt])\n#define VN(vn) (freg_map[vn] << 5)\n#define VM(vm) (freg_map[vm] << 16)\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n#define ADC 0x9a000000\n#define ADD 0x8b000000\n#define ADDE 0x8b200000\n#define ADDI 0x91000000\n#define AND 0x8a000000\n#define ANDI 0x92000000\n#define ASRV 0x9ac02800\n#define B 0x14000000\n#define B_CC 0x54000000\n#define BL 0x94000000\n#define BLR 0xd63f0000\n#define BR 0xd61f0000\n#define BRK 0xd4200000\n#define CBZ 0xb4000000\n#define CLZ 0xdac01000\n#define CSEL 0x9a800000\n#define CSINC 0x9a800400\n#define EOR 0xca000000\n#define EORI 0xd2000000\n#define FABS 0x1e60c000\n#define FADD 0x1e602800\n#define FCMP 0x1e602000\n#define FCVT 0x1e224000\n#define FCVTZS 0x9e780000\n#define FDIV 0x1e601800\n#define FMOV 0x1e604000\n#define FMUL 0x1e600800\n#define FNEG 0x1e614000\n#define FSUB 0x1e603800\n#define LDRI 0xf9400000\n#define LDP 0xa9400000\n#define LDP_PRE 0xa9c00000\n#define LDR_PRE 0xf8400c00\n#define LSLV 0x9ac02000\n#define LSRV 0x9ac02400\n#define MADD 0x9b000000\n#define MOVK 0xf2800000\n#define MOVN 0x92800000\n#define MOVZ 0xd2800000\n#define NOP 0xd503201f\n#define ORN 0xaa200000\n#define ORR 0xaa000000\n#define ORRI 0xb2000000\n#define RET 0xd65f0000\n#define SBC 0xda000000\n#define SBFM 0x93000000\n#define SCVTF 0x9e620000\n#define SDIV 0x9ac00c00\n#define SMADDL 0x9b200000\n#define SMULH 0x9b403c00\n#define STP 0xa9000000\n#define STP_PRE 0xa9800000\n#define STRB 0x38206800\n#define STRBI 0x39000000\n#define STRI 0xf9000000\n#define STR_FI 0x3d000000\n#define STR_FR 0x3c206800\n#define STUR_FI 0x3c000000\n#define STURBI 0x38000000\n#define SUB 0xcb000000\n#define SUBI 0xd1000000\n#define SUBS 0xeb000000\n#define UBFM 0xd3000000\n#define UDIV 0x9ac00800\n#define UMULH 0x9bc03c00\n\n/* dest_reg is the absolute name of the register\n   Useful for reordering instructions in the delay slot. */\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)\n{\n\tsljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_imm64_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)\n{\n\tFAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5)));\n\tFAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 16) & 0xffff) << 5) | (1 << 21)));\n\tFAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 32) & 0xffff) << 5) | (2 << 21)));\n\treturn push_inst(compiler, MOVK | RD(dst) | ((imm >> 48) << 5) | (3 << 21));\n}\n\nstatic SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm)\n{\n\tsljit_s32 dst = inst[0] & 0x1f;\n\tSLJIT_ASSERT((inst[0] & 0xffe00000) == MOVZ && (inst[1] & 0xffe00000) == (MOVK | (1 << 21)));\n\tinst[0] = MOVZ | dst | ((new_imm & 0xffff) << 5);\n\tinst[1] = MOVK | dst | (((new_imm >> 16) & 0xffff) << 5) | (1 << 21);\n\tinst[2] = MOVK | dst | (((new_imm >> 32) & 0xffff) << 5) | (2 << 21);\n\tinst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21);\n}\n\nstatic SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\tsljit_uw target_addr;\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP) {\n\t\tjump->flags |= PATCH_ABS64;\n\t\treturn 0;\n\t}\n\n\tif (jump->flags & JUMP_ADDR)\n\t\ttarget_addr = jump->u.target;\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\ttarget_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset;\n\t}\n\n\tdiff = (sljit_sw)target_addr - (sljit_sw)(code_ptr + 4) - executable_offset;\n\n\tif (jump->flags & IS_COND) {\n\t\tdiff += sizeof(sljit_ins);\n\t\tif (diff <= 0xfffff && diff >= -0x100000) {\n\t\t\tcode_ptr[-5] ^= (jump->flags & IS_CBZ) ? (0x1 << 24) : 0x1;\n\t\t\tjump->addr -= sizeof(sljit_ins);\n\t\t\tjump->flags |= PATCH_COND;\n\t\t\treturn 5;\n\t\t}\n\t\tdiff -= sizeof(sljit_ins);\n\t}\n\n\tif (diff <= 0x7ffffff && diff >= -0x8000000) {\n\t\tjump->flags |= PATCH_B;\n\t\treturn 4;\n\t}\n\n\tif (target_addr <= 0xffffffffl) {\n\t\tif (jump->flags & IS_COND)\n\t\t\tcode_ptr[-5] -= (2 << 5);\n\t\tcode_ptr[-2] = code_ptr[0];\n\t\treturn 2;\n\t}\n\n\tif (target_addr <= 0xffffffffffffl) {\n\t\tif (jump->flags & IS_COND)\n\t\t\tcode_ptr[-5] -= (1 << 5);\n\t\tjump->flags |= PATCH_ABS48;\n\t\tcode_ptr[-1] = code_ptr[0];\n\t\treturn 1;\n\t}\n\n\tjump->flags |= PATCH_ABS64;\n\treturn 0;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_ins *code;\n\tsljit_ins *code_ptr;\n\tsljit_ins *buf_ptr;\n\tsljit_ins *buf_end;\n\tsljit_uw word_count;\n\tsljit_sw executable_offset;\n\tsljit_uw addr;\n\tsljit_s32 dst;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\tcode = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tword_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tdo {\n\t\tbuf_ptr = (sljit_ins*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 2);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\tif (label && label->size == word_count) {\n\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\t\t\tif (jump && jump->addr == word_count) {\n\t\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 4);\n\t\t\t\t\tcode_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);\n\t\t\t\t\tjump = jump->next;\n\t\t\t}\n\t\t\tif (const_ && const_->addr == word_count) {\n\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\t\t\tcode_ptr ++;\n\t\t\tword_count ++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == word_count) {\n\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tdo {\n\t\t\taddr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n\t\t\tbuf_ptr = (sljit_ins *)jump->addr;\n\n\t\t\tif (jump->flags & PATCH_B) {\n\t\t\t\taddr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;\n\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= 0x1ffffff && (sljit_sw)addr >= -0x2000000);\n\t\t\t\tbuf_ptr[0] = ((jump->flags & IS_BL) ? BL : B) | (addr & 0x3ffffff);\n\t\t\t\tif (jump->flags & IS_COND)\n\t\t\t\t\tbuf_ptr[-1] -= (4 << 5);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (jump->flags & PATCH_COND) {\n\t\t\t\taddr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;\n\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= 0x3ffff && (sljit_sw)addr >= -0x40000);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & ~0xffffe0) | ((addr & 0x7ffff) << 5);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tSLJIT_ASSERT((jump->flags & (PATCH_ABS48 | PATCH_ABS64)) || addr <= 0xffffffffl);\n\t\t\tSLJIT_ASSERT((jump->flags & PATCH_ABS64) || addr <= 0xffffffffffffl);\n\n\t\t\tdst = buf_ptr[0] & 0x1f;\n\t\t\tbuf_ptr[0] = MOVZ | dst | ((addr & 0xffff) << 5);\n\t\t\tbuf_ptr[1] = MOVK | dst | (((addr >> 16) & 0xffff) << 5) | (1 << 21);\n\t\t\tif (jump->flags & (PATCH_ABS48 | PATCH_ABS64))\n\t\t\t\tbuf_ptr[2] = MOVK | dst | (((addr >> 32) & 0xffff) << 5) | (2 << 21);\n\t\t\tif (jump->flags & PATCH_ABS64)\n\t\t\t\tbuf_ptr[3] = MOVK | dst | (((addr >> 48) & 0xffff) << 5) | (3 << 21);\n\t\t} while (0);\n\t\tjump = jump->next;\n\t}\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);\n\n\tcode = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\tcode_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\treturn code;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#else\n\t\t/* Available by default. */\n\t\treturn 1;\n#endif\n\n\tcase SLJIT_HAS_CLZ:\n\tcase SLJIT_HAS_CMOV:\n\t\treturn 1;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Core code generator functions.                                       */\n/* --------------------------------------------------------------------- */\n\n#define COUNT_TRAILING_ZERO(value, result) \\\n\tresult = 0; \\\n\tif (!(value & 0xffffffff)) { \\\n\t\tresult += 32; \\\n\t\tvalue >>= 32; \\\n\t} \\\n\tif (!(value & 0xffff)) { \\\n\t\tresult += 16; \\\n\t\tvalue >>= 16; \\\n\t} \\\n\tif (!(value & 0xff)) { \\\n\t\tresult += 8; \\\n\t\tvalue >>= 8; \\\n\t} \\\n\tif (!(value & 0xf)) { \\\n\t\tresult += 4; \\\n\t\tvalue >>= 4; \\\n\t} \\\n\tif (!(value & 0x3)) { \\\n\t\tresult += 2; \\\n\t\tvalue >>= 2; \\\n\t} \\\n\tif (!(value & 0x1)) { \\\n\t\tresult += 1; \\\n\t\tvalue >>= 1; \\\n\t}\n\n#define LOGICAL_IMM_CHECK 0x100\n\nstatic sljit_ins logical_imm(sljit_sw imm, sljit_s32 len)\n{\n\tsljit_s32 negated, ones, right;\n\tsljit_uw mask, uimm;\n\tsljit_ins ins;\n\n\tif (len & LOGICAL_IMM_CHECK) {\n\t\tlen &= ~LOGICAL_IMM_CHECK;\n\t\tif (len == 32 && (imm == 0 || imm == -1))\n\t\t\treturn 0;\n\t\tif (len == 16 && ((sljit_s32)imm == 0 || (sljit_s32)imm == -1))\n\t\t\treturn 0;\n\t}\n\n\tSLJIT_ASSERT((len == 32 && imm != 0 && imm != -1)\n\t\t|| (len == 16 && (sljit_s32)imm != 0 && (sljit_s32)imm != -1));\n\n\tuimm = (sljit_uw)imm;\n\twhile (1) {\n\t\tif (len <= 0) {\n\t\t\tSLJIT_UNREACHABLE();\n\t\t\treturn 0;\n\t\t}\n\n\t\tmask = ((sljit_uw)1 << len) - 1;\n\t\tif ((uimm & mask) != ((uimm >> len) & mask))\n\t\t\tbreak;\n\t\tlen >>= 1;\n\t}\n\n\tlen <<= 1;\n\n\tnegated = 0;\n\tif (uimm & 0x1) {\n\t\tnegated = 1;\n\t\tuimm = ~uimm;\n\t}\n\n\tif (len < 64)\n\t\tuimm &= ((sljit_uw)1 << len) - 1;\n\n\t/* Unsigned right shift. */\n\tCOUNT_TRAILING_ZERO(uimm, right);\n\n\t/* Signed shift. We also know that the highest bit is set. */\n\timm = (sljit_sw)~uimm;\n\tSLJIT_ASSERT(imm < 0);\n\n\tCOUNT_TRAILING_ZERO(imm, ones);\n\n\tif (~imm)\n\t\treturn 0;\n\n\tif (len == 64)\n\t\tins = 1 << 22;\n\telse\n\t\tins = (0x3f - ((len << 1) - 1)) << 10;\n\n\tif (negated)\n\t\treturn ins | ((len - ones - 1) << 10) | ((len - ones - right) << 16);\n\n\treturn ins | ((ones - 1) << 10) | ((len - right) << 16);\n}\n\n#undef COUNT_TRAILING_ZERO\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw simm)\n{\n\tsljit_uw imm = (sljit_uw)simm;\n\tsljit_s32 i, zeros, ones, first;\n\tsljit_ins bitmask;\n\n\t/* Handling simple immediates first. */\n\tif (imm <= 0xffff)\n\t\treturn push_inst(compiler, MOVZ | RD(dst) | (imm << 5));\n\n\tif (simm < 0 && simm >= -0x10000)\n\t\treturn push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff) << 5));\n\n\tif (imm <= 0xffffffffl) {\n\t\tif ((imm & 0xffff) == 0)\n\t\t\treturn push_inst(compiler, MOVZ | RD(dst) | ((imm >> 16) << 5) | (1 << 21));\n\t\tif ((imm & 0xffff0000l) == 0xffff0000)\n\t\t\treturn push_inst(compiler, (MOVN ^ W_OP) | RD(dst) | ((~imm & 0xffff) << 5));\n\t\tif ((imm & 0xffff) == 0xffff)\n\t\t\treturn push_inst(compiler, (MOVN ^ W_OP) | RD(dst) | ((~imm & 0xffff0000l) >> (16 - 5)) | (1 << 21));\n\n\t\tbitmask = logical_imm(simm, 16);\n\t\tif (bitmask != 0)\n\t\t\treturn push_inst(compiler, (ORRI ^ W_OP) | RD(dst) | RN(TMP_ZERO) | bitmask);\n\n\t\tFAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5)));\n\t\treturn push_inst(compiler, MOVK | RD(dst) | ((imm & 0xffff0000l) >> (16 - 5)) | (1 << 21));\n\t}\n\n\tbitmask = logical_imm(simm, 32);\n\tif (bitmask != 0)\n\t\treturn push_inst(compiler, ORRI | RD(dst) | RN(TMP_ZERO) | bitmask);\n\n\tif (simm < 0 && simm >= -0x100000000l) {\n\t\tif ((imm & 0xffff) == 0xffff)\n\t\t\treturn push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff0000l) >> (16 - 5)) | (1 << 21));\n\n\t\tFAIL_IF(push_inst(compiler, MOVN | RD(dst) | ((~imm & 0xffff) << 5)));\n\t\treturn push_inst(compiler, MOVK | RD(dst) | ((imm & 0xffff0000l) >> (16 - 5)) | (1 << 21));\n\t}\n\n\t/* A large amount of number can be constructed from ORR and MOVx, but computing them is costly. */\n\n\tzeros = 0;\n\tones = 0;\n\tfor (i = 4; i > 0; i--) {\n\t\tif ((simm & 0xffff) == 0)\n\t\t\tzeros++;\n\t\tif ((simm & 0xffff) == 0xffff)\n\t\t\tones++;\n\t\tsimm >>= 16;\n\t}\n\n\tsimm = (sljit_sw)imm;\n\tfirst = 1;\n\tif (ones > zeros) {\n\t\tsimm = ~simm;\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tif (!(simm & 0xffff)) {\n\t\t\t\tsimm >>= 16;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (first) {\n\t\t\t\tfirst = 0;\n\t\t\t\tFAIL_IF(push_inst(compiler, MOVN | RD(dst) | ((simm & 0xffff) << 5) | (i << 21)));\n\t\t\t}\n\t\t\telse\n\t\t\t\tFAIL_IF(push_inst(compiler, MOVK | RD(dst) | ((~simm & 0xffff) << 5) | (i << 21)));\n\t\t\tsimm >>= 16;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tfor (i = 0; i < 4; i++) {\n\t\tif (!(simm & 0xffff)) {\n\t\t\tsimm >>= 16;\n\t\t\tcontinue;\n\t\t}\n\t\tif (first) {\n\t\t\tfirst = 0;\n\t\t\tFAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((simm & 0xffff) << 5) | (i << 21)));\n\t\t}\n\t\telse\n\t\t\tFAIL_IF(push_inst(compiler, MOVK | RD(dst) | ((simm & 0xffff) << 5) | (i << 21)));\n\t\tsimm >>= 16;\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\n#define ARG1_IMM\t0x0010000\n#define ARG2_IMM\t0x0020000\n#define INT_OP\t\t0x0040000\n#define SET_FLAGS\t0x0080000\n#define UNUSED_RETURN\t0x0100000\n\n#define CHECK_FLAGS(flag_bits) \\\n\tif (flags & SET_FLAGS) { \\\n\t\tinv_bits |= flag_bits; \\\n\t\tif (flags & UNUSED_RETURN) \\\n\t\t\tdst = TMP_ZERO; \\\n\t}\n\nstatic sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_sw arg1, sljit_sw arg2)\n{\n\t/* dst must be register, TMP_REG1\n\t   arg1 must be register, TMP_REG1, imm\n\t   arg2 must be register, TMP_REG2, imm */\n\tsljit_ins inv_bits = (flags & INT_OP) ? W_OP : 0;\n\tsljit_ins inst_bits;\n\tsljit_s32 op = (flags & 0xffff);\n\tsljit_s32 reg;\n\tsljit_sw imm, nimm;\n\n\tif (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) {\n\t\t/* Both are immediates. */\n\t\tflags &= ~ARG1_IMM;\n\t\tif (arg1 == 0 && op != SLJIT_ADD && op != SLJIT_SUB)\n\t\t\targ1 = TMP_ZERO;\n\t\telse {\n\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, arg1));\n\t\t\targ1 = TMP_REG1;\n\t\t}\n\t}\n\n\tif (flags & (ARG1_IMM | ARG2_IMM)) {\n\t\treg = (flags & ARG2_IMM) ? arg1 : arg2;\n\t\timm = (flags & ARG2_IMM) ? arg2 : arg1;\n\n\t\tswitch (op) {\n\t\tcase SLJIT_MUL:\n\t\tcase SLJIT_NEG:\n\t\tcase SLJIT_CLZ:\n\t\tcase SLJIT_ADDC:\n\t\tcase SLJIT_SUBC:\n\t\t\t/* No form with immediate operand (except imm 0, which\n\t\t\tis represented by a ZERO register). */\n\t\t\tbreak;\n\t\tcase SLJIT_MOV:\n\t\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG1);\n\t\t\treturn load_immediate(compiler, dst, imm);\n\t\tcase SLJIT_NOT:\n\t\t\tSLJIT_ASSERT(flags & ARG2_IMM);\n\t\t\tFAIL_IF(load_immediate(compiler, dst, (flags & INT_OP) ? (~imm & 0xffffffff) : ~imm));\n\t\t\tgoto set_flags;\n\t\tcase SLJIT_SUB:\n\t\t\tif (flags & ARG1_IMM)\n\t\t\t\tbreak;\n\t\t\timm = -imm;\n\t\t\t/* Fall through. */\n\t\tcase SLJIT_ADD:\n\t\t\tif (imm == 0) {\n\t\t\t\tCHECK_FLAGS(1 << 29);\n\t\t\t\treturn push_inst(compiler, ((op == SLJIT_ADD ? ADDI : SUBI) ^ inv_bits) | RD(dst) | RN(reg));\n\t\t\t}\n\t\t\tif (imm > 0 && imm <= 0xfff) {\n\t\t\t\tCHECK_FLAGS(1 << 29);\n\t\t\t\treturn push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | (imm << 10));\n\t\t\t}\n\t\t\tnimm = -imm;\n\t\t\tif (nimm > 0 && nimm <= 0xfff) {\n\t\t\t\tCHECK_FLAGS(1 << 29);\n\t\t\t\treturn push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | (nimm << 10));\n\t\t\t}\n\t\t\tif (imm > 0 && imm <= 0xffffff && !(imm & 0xfff)) {\n\t\t\t\tCHECK_FLAGS(1 << 29);\n\t\t\t\treturn push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | ((imm >> 12) << 10) | (1 << 22));\n\t\t\t}\n\t\t\tif (nimm > 0 && nimm <= 0xffffff && !(nimm & 0xfff)) {\n\t\t\t\tCHECK_FLAGS(1 << 29);\n\t\t\t\treturn push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | ((nimm >> 12) << 10) | (1 << 22));\n\t\t\t}\n\t\t\tif (imm > 0 && imm <= 0xffffff && !(flags & SET_FLAGS)) {\n\t\t\t\tFAIL_IF(push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(reg) | ((imm >> 12) << 10) | (1 << 22)));\n\t\t\t\treturn push_inst(compiler, (ADDI ^ inv_bits) | RD(dst) | RN(dst) | ((imm & 0xfff) << 10));\n\t\t\t}\n\t\t\tif (nimm > 0 && nimm <= 0xffffff && !(flags & SET_FLAGS)) {\n\t\t\t\tFAIL_IF(push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(reg) | ((nimm >> 12) << 10) | (1 << 22)));\n\t\t\t\treturn push_inst(compiler, (SUBI ^ inv_bits) | RD(dst) | RN(dst) | ((nimm & 0xfff) << 10));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase SLJIT_AND:\n\t\t\tinst_bits = logical_imm(imm, LOGICAL_IMM_CHECK | ((flags & INT_OP) ? 16 : 32));\n\t\t\tif (!inst_bits)\n\t\t\t\tbreak;\n\t\t\tCHECK_FLAGS(3 << 29);\n\t\t\treturn push_inst(compiler, (ANDI ^ inv_bits) | RD(dst) | RN(reg) | inst_bits);\n\t\tcase SLJIT_OR:\n\t\tcase SLJIT_XOR:\n\t\t\tinst_bits = logical_imm(imm, LOGICAL_IMM_CHECK | ((flags & INT_OP) ? 16 : 32));\n\t\t\tif (!inst_bits)\n\t\t\t\tbreak;\n\t\t\tif (op == SLJIT_OR)\n\t\t\t\tinst_bits |= ORRI;\n\t\t\telse\n\t\t\t\tinst_bits |= EORI;\n\t\t\tFAIL_IF(push_inst(compiler, (inst_bits ^ inv_bits) | RD(dst) | RN(reg)));\n\t\t\tgoto set_flags;\n\t\tcase SLJIT_SHL:\n\t\t\tif (flags & ARG1_IMM)\n\t\t\t\tbreak;\n\t\t\tif (flags & INT_OP) {\n\t\t\t\timm &= 0x1f;\n\t\t\t\tFAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | ((-imm & 0x1f) << 16) | ((31 - imm) << 10)));\n\t\t\t}\n\t\t\telse {\n\t\t\t\timm &= 0x3f;\n\t\t\t\tFAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (1 << 22) | ((-imm & 0x3f) << 16) | ((63 - imm) << 10)));\n\t\t\t}\n\t\t\tgoto set_flags;\n\t\tcase SLJIT_LSHR:\n\t\tcase SLJIT_ASHR:\n\t\t\tif (flags & ARG1_IMM)\n\t\t\t\tbreak;\n\t\t\tif (op == SLJIT_ASHR)\n\t\t\t\tinv_bits |= 1 << 30;\n\t\t\tif (flags & INT_OP) {\n\t\t\t\timm &= 0x1f;\n\t\t\t\tFAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (imm << 16) | (31 << 10)));\n\t\t\t}\n\t\t\telse {\n\t\t\t\timm &= 0x3f;\n\t\t\t\tFAIL_IF(push_inst(compiler, (UBFM ^ inv_bits) | RD(dst) | RN(arg1) | (1 << 22) | (imm << 16) | (63 << 10)));\n\t\t\t}\n\t\t\tgoto set_flags;\n\t\tdefault:\n\t\t\tSLJIT_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\n\t\tif (flags & ARG2_IMM) {\n\t\t\tif (arg2 == 0)\n\t\t\t\targ2 = TMP_ZERO;\n\t\t\telse {\n\t\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG2, arg2));\n\t\t\t\targ2 = TMP_REG2;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (arg1 == 0)\n\t\t\t\targ1 = TMP_ZERO;\n\t\t\telse {\n\t\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, arg1));\n\t\t\t\targ1 = TMP_REG1;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Both arguments are registers. */\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\tif (dst == arg2)\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2));\n\tcase SLJIT_MOV_U8:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\treturn push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (7 << 10));\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\tif (!(flags & INT_OP))\n\t\t\tinv_bits |= 1 << 22;\n\t\treturn push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10));\n\tcase SLJIT_MOV_U16:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\treturn push_inst(compiler, (UBFM ^ W_OP) | RD(dst) | RN(arg2) | (15 << 10));\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\tif (!(flags & INT_OP))\n\t\t\tinv_bits |= 1 << 22;\n\t\treturn push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10));\n\tcase SLJIT_MOV_U32:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\tif ((flags & INT_OP) && dst == arg2)\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn push_inst(compiler, (ORR ^ W_OP) | RD(dst) | RN(TMP_ZERO) | RM(arg2));\n\tcase SLJIT_MOV_S32:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);\n\t\tif ((flags & INT_OP) && dst == arg2)\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn push_inst(compiler, SBFM | (1 << 22) | RD(dst) | RN(arg2) | (31 << 10));\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(arg1 == TMP_REG1);\n\t\tFAIL_IF(push_inst(compiler, (ORN ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tcase SLJIT_NEG:\n\t\tSLJIT_ASSERT(arg1 == TMP_REG1);\n\t\tif (flags & SET_FLAGS)\n\t\t\tinv_bits |= 1 << 29;\n\t\treturn push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2));\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(arg1 == TMP_REG1);\n\t\treturn push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2));\n\tcase SLJIT_ADD:\n\t\tCHECK_FLAGS(1 << 29);\n\t\treturn push_inst(compiler, (ADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));\n\tcase SLJIT_ADDC:\n\t\tCHECK_FLAGS(1 << 29);\n\t\treturn push_inst(compiler, (ADC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));\n\tcase SLJIT_SUB:\n\t\tCHECK_FLAGS(1 << 29);\n\t\treturn push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));\n\tcase SLJIT_SUBC:\n\t\tCHECK_FLAGS(1 << 29);\n\t\treturn push_inst(compiler, (SBC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));\n\tcase SLJIT_MUL:\n\t\tif (!(flags & SET_FLAGS))\n\t\t\treturn push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO));\n\t\tif (flags & INT_OP) {\n\t\t\tFAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10)));\n\t\t\tFAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10)));\n\t\t\treturn push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, SMULH | RD(TMP_LR) | RN(arg1) | RM(arg2)));\n\t\tFAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)));\n\t\treturn push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));\n\tcase SLJIT_AND:\n\t\tCHECK_FLAGS(3 << 29);\n\t\treturn push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));\n\tcase SLJIT_OR:\n\t\tFAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tcase SLJIT_XOR:\n\t\tFAIL_IF(push_inst(compiler, (EOR ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tcase SLJIT_SHL:\n\t\tFAIL_IF(push_inst(compiler, (LSLV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tcase SLJIT_LSHR:\n\t\tFAIL_IF(push_inst(compiler, (LSRV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tcase SLJIT_ASHR:\n\t\tFAIL_IF(push_inst(compiler, (ASRV ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)));\n\t\tbreak; /* Set flags. */\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\treturn SLJIT_SUCCESS;\n\t}\n\nset_flags:\n\tif (flags & SET_FLAGS)\n\t\treturn push_inst(compiler, (SUBS ^ inv_bits) | RD(TMP_ZERO) | RN(dst) | RM(TMP_ZERO));\n\treturn SLJIT_SUCCESS;\n}\n\n#define STORE\t\t0x10\n#define SIGNED\t\t0x20\n\n#define BYTE_SIZE\t0x0\n#define HALF_SIZE\t0x1\n#define INT_SIZE\t0x2\n#define WORD_SIZE\t0x3\n\n#define MEM_SIZE_SHIFT(flags) ((flags) & 0x3)\n\nstatic sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,\n\tsljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg)\n{\n\tsljit_u32 shift = MEM_SIZE_SHIFT(flags);\n\tsljit_u32 type = (shift << 30);\n\n\tif (!(flags & STORE))\n\t\ttype |= (flags & SIGNED) ? 0x00800000 : 0x00400000;\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\n\t\tif (argw == 0 || argw == shift)\n\t\t\treturn push_inst(compiler, STRB | type | RT(reg)\n\t\t\t\t| RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw ? (1 << 12) : 0));\n\n\t\tFAIL_IF(push_inst(compiler, ADD | RD(tmp_reg) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw << 10)));\n\t\treturn push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg));\n\t}\n\n\targ &= REG_MASK;\n\n\tif (arg == SLJIT_UNUSED) {\n\t\tFAIL_IF(load_immediate(compiler, tmp_reg, argw & ~(0xfff << shift)));\n\n\t\targw = (argw >> shift) & 0xfff;\n\n\t\treturn push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg) | (argw << 10));\n\t}\n\n\tif (argw >= 0 && (argw & ((1 << shift) - 1)) == 0) {\n\t\tif ((argw >> shift) <= 0xfff) {\n\t\t\treturn push_inst(compiler, STRBI | type | RT(reg) | RN(arg) | (argw << (10 - shift)));\n\t\t}\n\n\t\tif (argw <= 0xffffff) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDI | (1 << 22) | RD(tmp_reg) | RN(arg) | ((argw >> 12) << 10)));\n\n\t\t\targw = ((argw & 0xfff) >> shift);\n\t\t\treturn push_inst(compiler, STRBI | type | RT(reg) | RN(tmp_reg) | (argw << 10));\n\t\t}\n\t}\n\n\tif (argw <= 255 && argw >= -256)\n\t\treturn push_inst(compiler, STURBI | type | RT(reg) | RN(arg) | ((argw & 0x1ff) << 12));\n\n\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\n\treturn push_inst(compiler, STRB | type | RT(reg) | RN(arg) | RM(tmp_reg));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, i, tmp, offs, prev, saved_regs_size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tsaved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);\n\tif (saved_regs_size & 0x8)\n\t\tsaved_regs_size += sizeof(sljit_sw);\n\n\tlocal_size = (local_size + 15) & ~0xf;\n\tcompiler->local_size = local_size + saved_regs_size;\n\n\tFAIL_IF(push_inst(compiler, STP_PRE | RT(TMP_FP) | RT2(TMP_LR)\n\t\t| RN(SLJIT_SP) | ((-(saved_regs_size >> 3) & 0x7f) << 15)));\n\n#ifdef _WIN32\n\tif (local_size >= 4096)\n\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(SLJIT_SP) | (1 << 10) | (1 << 22)));\n\telse if (local_size > 256)\n\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(SLJIT_SP) | (local_size << 10)));\n#endif\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tprev = -1;\n\toffs = 2 << 15;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\tif (prev == -1) {\n\t\t\tprev = i;\n\t\t\tcontinue;\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, STP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs));\n\t\toffs += 2 << 15;\n\t\tprev = -1;\n\t}\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\tif (prev == -1) {\n\t\t\tprev = i;\n\t\t\tcontinue;\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, STP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs));\n\t\toffs += 2 << 15;\n\t\tprev = -1;\n\t}\n\n\tif (prev != -1)\n\t\tFAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(SLJIT_SP) | (offs >> 5)));\n\n\n\tFAIL_IF(push_inst(compiler, ADDI | RD(TMP_FP) | RN(SLJIT_SP) | (0 << 10)));\n\n\targs = get_arg_count(arg_types);\n\n\tif (args >= 1)\n\t\tFAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0)));\n\tif (args >= 2)\n\t\tFAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S1) | RN(TMP_ZERO) | RM(SLJIT_R1)));\n\tif (args >= 3)\n\t\tFAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S2) | RN(TMP_ZERO) | RM(SLJIT_R2)));\n\n#ifdef _WIN32\n\tif (local_size >= 4096) {\n\t\tif (local_size < 4 * 4096) {\n\t\t\t/* No need for a loop. */\n\t\t\tif (local_size >= 2 * 4096) {\n\t\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\t\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22)));\n\t\t\t\tlocal_size -= 4096;\n\t\t\t}\n\n\t\t\tif (local_size >= 2 * 4096) {\n\t\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\t\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22)));\n\t\t\t\tlocal_size -= 4096;\n\t\t\t}\n\n\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\t\tlocal_size -= 4096;\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(push_inst(compiler, MOVZ | RD(TMP_REG2) | (((local_size >> 12) - 1) << 5)));\n\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (1 << 10) | (1 << 22)));\n\t\t\tFAIL_IF(push_inst(compiler, SUBI | (1 << 29) | RD(TMP_REG2) | RN(TMP_REG2) | (1 << 10)));\n\t\t\tFAIL_IF(push_inst(compiler, B_CC | ((((sljit_ins) -3) & 0x7ffff) << 5) | 0x1 /* not-equal */));\n\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\n\t\t\tlocal_size &= 0xfff;\n\t\t}\n\n\t\tif (local_size > 256) {\n\t\t\tFAIL_IF(push_inst(compiler, SUBI | RD(TMP_REG1) | RN(TMP_REG1) | (local_size << 10)));\n\t\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\t}\n\t\telse if (local_size > 0)\n\t\t\tFAIL_IF(push_inst(compiler, LDR_PRE | RT(TMP_ZERO) | RN(TMP_REG1) | ((-local_size & 0x1ff) << 12)));\n\n\t\tFAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_REG1) | (0 << 10)));\n\t}\n\telse if (local_size > 256) {\n\t\tFAIL_IF(push_inst(compiler, LDRI | RT(TMP_ZERO) | RN(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_REG1) | (0 << 10)));\n\t}\n\telse if (local_size > 0)\n\t\tFAIL_IF(push_inst(compiler, LDR_PRE | RT(TMP_ZERO) | RN(SLJIT_SP) | ((-local_size & 0x1ff) << 12)));\n\n#else /* !_WIN32 */\n\n\t/* The local_size does not include saved registers size. */\n\tif (local_size > 0xfff) {\n\t\tFAIL_IF(push_inst(compiler, SUBI | RD(SLJIT_SP) | RN(SLJIT_SP) | ((local_size >> 12) << 10) | (1 << 22)));\n\t\tlocal_size &= 0xfff;\n\t}\n\tif (local_size != 0)\n\t\tFAIL_IF(push_inst(compiler, SUBI | RD(SLJIT_SP) | RN(SLJIT_SP) | (local_size << 10)));\n\n#endif /* _WIN32 */\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 saved_regs_size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tsaved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);\n\tif (saved_regs_size & 0x8)\n\t\tsaved_regs_size += sizeof(sljit_sw);\n\n\tcompiler->local_size = saved_regs_size + ((local_size + 15) & ~0xf);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 local_size;\n\tsljit_s32 i, tmp, offs, prev, saved_regs_size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tsaved_regs_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 2);\n\tif (saved_regs_size & 0x8)\n\t\tsaved_regs_size += sizeof(sljit_sw);\n\n\tlocal_size = compiler->local_size - saved_regs_size;\n\n\t/* Load LR as early as possible. */\n\tif (local_size == 0)\n\t\tFAIL_IF(push_inst(compiler, LDP | RT(TMP_FP) | RT2(TMP_LR) | RN(SLJIT_SP)));\n\telse if (local_size < 63 * sizeof(sljit_sw)) {\n\t\tFAIL_IF(push_inst(compiler, LDP_PRE | RT(TMP_FP) | RT2(TMP_LR)\n\t\t\t| RN(SLJIT_SP) | (local_size << (15 - 3))));\n\t}\n\telse {\n\t\tif (local_size > 0xfff) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | ((local_size >> 12) << 10) | (1 << 22)));\n\t\t\tlocal_size &= 0xfff;\n\t\t}\n\t\tif (local_size)\n\t\t\tFAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | (local_size << 10)));\n\n\t\tFAIL_IF(push_inst(compiler, LDP | RT(TMP_FP) | RT2(TMP_LR) | RN(SLJIT_SP)));\n\t}\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tprev = -1;\n\toffs = 2 << 15;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\tif (prev == -1) {\n\t\t\tprev = i;\n\t\t\tcontinue;\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, LDP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs));\n\t\toffs += 2 << 15;\n\t\tprev = -1;\n\t}\n\n\tfor (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\tif (prev == -1) {\n\t\t\tprev = i;\n\t\t\tcontinue;\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, LDP | RT(prev) | RT2(i) | RN(SLJIT_SP) | offs));\n\t\toffs += 2 << 15;\n\t\tprev = -1;\n\t}\n\n\tif (prev != -1)\n\t\tFAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(SLJIT_SP) | (offs >> 5)));\n\n\t/* These two can be executed in parallel. */\n\tFAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(SLJIT_SP) | (saved_regs_size << 10)));\n\treturn push_inst(compiler, RET | RN(TMP_LR));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n\tsljit_ins inv_bits = (op & SLJIT_I32_OP) ? W_OP : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\t\treturn push_inst(compiler, BRK);\n\tcase SLJIT_NOP:\n\t\treturn push_inst(compiler, NOP);\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\t\tFAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));\n\t\tFAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));\n\t\treturn push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\t\tFAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));\n\t\tFAIL_IF(push_inst(compiler, ((op == SLJIT_DIVMOD_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));\n\t\tFAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));\n\t\treturn push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\treturn push_inst(compiler, ((op == SLJIT_DIV_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1));\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r, flags, mem_flags;\n\tsljit_s32 op_flags = GET_ALL_FLAGS(op);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM)) {\n\t\t\tSLJIT_ASSERT(reg_map[1] == 0 && reg_map[3] == 2 && reg_map[5] == 4);\n\n\t\t\tif (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8)\n\t\t\t\tdst = 5;\n\t\t\telse if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16)\n\t\t\t\tdst = 3;\n\t\t\telse\n\t\t\t\tdst = 1;\n\n\t\t\t/* Signed word sized load is the prefetch instruction. */\n\t\t\treturn emit_op_mem(compiler, WORD_SIZE | SIGNED, dst, src, srcw, TMP_REG1);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tdst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;\n\n\top = GET_OPCODE(op);\n\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P) {\n\t\t/* Both operands are registers. */\n\t\tif (dst_r != TMP_REG1 && FAST_IS_REG(src))\n\t\t\treturn emit_op_imm(compiler, op | ((op_flags & SLJIT_I32_OP) ? INT_OP : 0), dst_r, TMP_REG1, src);\n\n\t\tswitch (op) {\n\t\tcase SLJIT_MOV:\n\t\tcase SLJIT_MOV_P:\n\t\t\tmem_flags = WORD_SIZE;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U8:\n\t\t\tmem_flags = BYTE_SIZE;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_u8)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S8:\n\t\t\tmem_flags = BYTE_SIZE | SIGNED;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_s8)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U16:\n\t\t\tmem_flags = HALF_SIZE;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_u16)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S16:\n\t\t\tmem_flags = HALF_SIZE | SIGNED;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_s16)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U32:\n\t\t\tmem_flags = INT_SIZE;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_u32)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S32:\n\t\t\tmem_flags = INT_SIZE | SIGNED;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_s32)srcw;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSLJIT_UNREACHABLE();\n\t\t\tmem_flags = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (src & SLJIT_IMM)\n\t\t\tFAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG1, srcw));\n\t\telse if (!(src & SLJIT_MEM))\n\t\t\tdst_r = src;\n\t\telse\n\t\t\tFAIL_IF(emit_op_mem(compiler, mem_flags, dst_r, src, srcw, TMP_REG1));\n\n\t\tif (dst & SLJIT_MEM)\n\t\t\treturn emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tflags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0;\n\tmem_flags = WORD_SIZE;\n\n\tif (op_flags & SLJIT_I32_OP) {\n\t\tflags |= INT_OP;\n\t\tmem_flags = INT_SIZE;\n\t}\n\n\tif (dst == SLJIT_UNUSED)\n\t\tflags |= UNUSED_RETURN;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG2, src, srcw, TMP_REG2));\n\t\tsrc = TMP_REG2;\n\t}\n\n\temit_op_imm(compiler, flags | op, dst_r, TMP_REG1, src);\n\n\tif (SLJIT_UNLIKELY(dst & SLJIT_MEM))\n\t\treturn emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r, flags, mem_flags;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\tdst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;\n\tflags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\tmem_flags = WORD_SIZE;\n\n\tif (op & SLJIT_I32_OP) {\n\t\tflags |= INT_OP;\n\t\tmem_flags = INT_SIZE;\n\t}\n\n\tif (dst == SLJIT_UNUSED)\n\t\tflags |= UNUSED_RETURN;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG1, src1, src1w, TMP_REG1));\n\t\tsrc1 = TMP_REG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG2, src2, src2w, TMP_REG2));\n\t\tsrc2 = TMP_REG2;\n\t}\n\n\tif (src1 & SLJIT_IMM)\n\t\tflags |= ARG1_IMM;\n\telse\n\t\tsrc1w = src1;\n\n\tif (src2 & SLJIT_IMM)\n\t\tflags |= ARG2_IMM;\n\telse\n\t\tsrc2w = src2;\n\n\temit_op_imm(compiler, flags | GET_OPCODE(op), dst_r, src1w, src2w);\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, mem_flags | STORE, dst_r, dst, dstw, TMP_REG2);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn freg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\treturn push_inst(compiler, *(sljit_ins*)instruction);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)\n{\n\tsljit_u32 shift = MEM_SIZE_SHIFT(flags);\n\tsljit_ins type = (shift << 30);\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif (!(flags & STORE))\n\t\ttype |= 0x00400000;\n\n\tif (arg & OFFS_REG_MASK) {\n\t\targw &= 3;\n\t\tif (argw == 0 || argw == shift)\n\t\t\treturn push_inst(compiler, STR_FR | type | VT(reg)\n\t\t\t\t| RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw ? (1 << 12) : 0));\n\n\t\tFAIL_IF(push_inst(compiler, ADD | RD(TMP_REG1) | RN(arg & REG_MASK) | RM(OFFS_REG(arg)) | (argw << 10)));\n\t\treturn push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1));\n\t}\n\n\targ &= REG_MASK;\n\n\tif (arg == SLJIT_UNUSED) {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, argw & ~(0xfff << shift)));\n\n\t\targw = (argw >> shift) & 0xfff;\n\n\t\treturn push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1) | (argw << 10));\n\t}\n\n\tif (argw >= 0 && (argw & ((1 << shift) - 1)) == 0) {\n\t\tif ((argw >> shift) <= 0xfff)\n\t\t\treturn push_inst(compiler, STR_FI | type | VT(reg) | RN(arg) | (argw << (10 - shift)));\n\n\t\tif (argw <= 0xffffff) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDI | (1 << 22) | RD(TMP_REG1) | RN(arg) | ((argw >> 12) << 10)));\n\n\t\t\targw = ((argw & 0xfff) >> shift);\n\t\t\treturn push_inst(compiler, STR_FI | type | VT(reg) | RN(TMP_REG1) | (argw << 10));\n\t\t}\n\t}\n\n\tif (argw <= 255 && argw >= -256)\n\t\treturn push_inst(compiler, STUR_FI | type | VT(reg) | RN(arg) | ((argw & 0x1ff) << 12));\n\n\tFAIL_IF(load_immediate(compiler, TMP_REG1, argw));\n\treturn push_inst(compiler, STR_FR | type | VT(reg) | RN(arg) | RM(TMP_REG1));\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\tsljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64)\n\t\tinv_bits |= W_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw);\n\t\tsrc = TMP_FREG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, (FCVTZS ^ inv_bits) | RD(dst_r) | VN(src)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? INT_SIZE : WORD_SIZE) | STORE, TMP_REG1, dst, dstw, TMP_REG2);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\tsljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\tinv_bits |= W_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\temit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw, TMP_REG1);\n\t\tsrc = TMP_REG1;\n\t} else if (src & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\t\tsrcw = (sljit_s32)srcw;\n#endif\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, ((op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;\n\tsljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;\n\n\tif (src1 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w);\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w);\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\treturn push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;\n\tsljit_ins inv_bits;\n\n\tCHECK_ERROR();\n\n\tSLJIT_COMPILE_ASSERT((INT_SIZE ^ 0x1) == WORD_SIZE, must_be_one_bit_difference);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tinv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x1) : mem_flags, dst_r, src, srcw);\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1)\n\t\t\t\tFAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src)));\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src)));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src)));\n\t\tbreak;\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\tFAIL_IF(push_inst(compiler, FCVT | ((op & SLJIT_F32_OP) ? (1 << 22) : (1 << 15)) | VD(dst_r) | VN(src)));\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, mem_flags | STORE, dst_r, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;\n\tsljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\tif (src1 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w);\n\t\tsrc1 = TMP_FREG1;\n\t}\n\tif (src2 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, mem_flags, TMP_FREG2, src2, src2w);\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));\n\t\tbreak;\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));\n\t\tbreak;\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));\n\t\tbreak;\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));\n\t\tbreak;\n\t}\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\treturn emit_fop_mem(compiler, mem_flags | STORE, TMP_FREG1, dst, dstw);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(TMP_LR));\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw, TMP_REG1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, ORR | RD(TMP_LR) | RN(TMP_ZERO) | RM(src)));\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_LR, src, srcw, TMP_REG1));\n\n\treturn push_inst(compiler, RET | RN(TMP_LR));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_uw get_cc(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\tcase SLJIT_EQUAL_F64:\n\t\treturn 0x1;\n\n\tcase SLJIT_NOT_EQUAL:\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\treturn 0x0;\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_LESS_F64:\n\t\treturn 0x2;\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\treturn 0x3;\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_GREATER_F64:\n\t\treturn 0x9;\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn 0x8;\n\n\tcase SLJIT_SIG_LESS:\n\t\treturn 0xa;\n\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn 0xb;\n\n\tcase SLJIT_SIG_GREATER:\n\t\treturn 0xd;\n\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn 0xc;\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn 0x7;\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_ORDERED_F64:\n\t\treturn 0x6;\n\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\treturn 0xe;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\treturn label;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tif (type < SLJIT_JUMP) {\n\t\tjump->flags |= IS_COND;\n\t\tPTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(type)));\n\t}\n\telse if (type >= SLJIT_FAST_CALL)\n\t\tjump->flags |= IS_BL;\n\n\tPTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1)));\n\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n}\n\nstatic SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins inv_bits = (type & SLJIT_I32_OP) ? W_OP : 0;\n\n\tSLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\tjump->flags |= IS_CBZ | IS_COND;\n\n\tif (src & SLJIT_MEM) {\n\t\tPTR_FAIL_IF(emit_op_mem(compiler, inv_bits ? INT_SIZE : WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\telse if (src & SLJIT_IMM) {\n\t\tPTR_FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tSLJIT_ASSERT(FAST_IS_REG(src));\n\n\tif ((type & 0xff) == SLJIT_EQUAL)\n\t\tinv_bits |= 1 << 24;\n\n\tPTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src)));\n\tPTR_FAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, BR | RN(TMP_REG1)));\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (!(src & SLJIT_IMM)) {\n\t\tif (src & SLJIT_MEM) {\n\t\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));\n\t\t\tsrc = TMP_REG1;\n\t\t}\n\t\treturn push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(src));\n\t}\n\n\t/* These jumps are converted to jump/call instructions when possible. */\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tFAIL_IF(!jump);\n\tset_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0));\n\tjump->u.target = srcw;\n\n\tFAIL_IF(emit_imm64_const(compiler, TMP_REG1, 0));\n\tjump->addr = compiler->size;\n\treturn push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 dst_r, src_r, flags, mem_flags;\n\tsljit_ins cc;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tcc = get_cc(type & 0xff);\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (GET_OPCODE(op) < SLJIT_ADD) {\n\t\tFAIL_IF(push_inst(compiler, CSINC | (cc << 12) | RD(dst_r) | RN(TMP_ZERO) | RM(TMP_ZERO)));\n\n\t\tif (dst_r == TMP_REG1) {\n\t\t\tmem_flags = (GET_OPCODE(op) == SLJIT_MOV ? WORD_SIZE : INT_SIZE) | STORE;\n\t\t\treturn emit_op_mem(compiler, mem_flags, TMP_REG1, dst, dstw, TMP_REG2);\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tflags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\tmem_flags = WORD_SIZE;\n\n\tif (op & SLJIT_I32_OP) {\n\t\tflags |= INT_OP;\n\t\tmem_flags = INT_SIZE;\n\t}\n\n\tsrc_r = dst;\n\n\tif (dst & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, mem_flags, TMP_REG1, dst, dstw, TMP_REG1));\n\t\tsrc_r = TMP_REG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, CSINC | (cc << 12) | RD(TMP_REG2) | RN(TMP_ZERO) | RM(TMP_ZERO)));\n\temit_op_imm(compiler, flags | GET_OPCODE(op), dst_r, src_r, TMP_REG2);\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, mem_flags | STORE, TMP_REG1, dst, dstw, TMP_REG2);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_ins inv_bits = (dst_reg & SLJIT_I32_OP) ? W_OP : 0;\n\tsljit_ins cc;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n\tif (SLJIT_UNLIKELY(src & SLJIT_IMM)) {\n\t\tif (dst_reg & SLJIT_I32_OP)\n\t\t\tsrcw = (sljit_s32)srcw;\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tcc = get_cc(type & 0xff);\n\tdst_reg &= ~SLJIT_I32_OP;\n\n\treturn push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_u32 sign = 0, inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));\n\n\tif ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256))\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tif (type & SLJIT_MEM_SUPP)\n\t\treturn SLJIT_SUCCESS;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\tinst = STURBI | (MEM_SIZE_SHIFT(WORD_SIZE) << 30) | 0x400;\n\t\tbreak;\n\tcase SLJIT_MOV_S8:\n\t\tsign = 1;\n\tcase SLJIT_MOV_U8:\n\t\tinst = STURBI | (MEM_SIZE_SHIFT(BYTE_SIZE) << 30) | 0x400;\n\t\tbreak;\n\tcase SLJIT_MOV_S16:\n\t\tsign = 1;\n\tcase SLJIT_MOV_U16:\n\t\tinst = STURBI | (MEM_SIZE_SHIFT(HALF_SIZE) << 30) | 0x400;\n\t\tbreak;\n\tcase SLJIT_MOV_S32:\n\t\tsign = 1;\n\tcase SLJIT_MOV_U32:\n\t\tinst = STURBI | (MEM_SIZE_SHIFT(INT_SIZE) << 30) | 0x400;\n\t\tbreak;\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tinst = STURBI | (MEM_SIZE_SHIFT(WORD_SIZE) << 30) | 0x400;\n\t\tbreak;\n\t}\n\n\tif (!(type & SLJIT_MEM_STORE))\n\t\tinst |= sign ? 0x00800000 : 0x00400000;\n\n\tif (type & SLJIT_MEM_PRE)\n\t\tinst |= 0x800;\n\n\treturn push_inst(compiler, inst | RT(reg) | RN(mem & REG_MASK) | ((memw & 0x1ff) << 12));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 freg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_u32 inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));\n\n\tif ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -256))\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tif (type & SLJIT_MEM_SUPP)\n\t\treturn SLJIT_SUCCESS;\n\n\tinst = STUR_FI | 0x80000400;\n\n\tif (!(type & SLJIT_F32_OP))\n\t\tinst |= 0x40000000;\n\n\tif (!(type & SLJIT_MEM_STORE))\n\t\tinst |= 0x00400000;\n\n\tif (type & SLJIT_MEM_PRE)\n\t\tinst |= 0x800;\n\n\treturn push_inst(compiler, inst | VT(freg) | RN(mem & REG_MASK) | ((memw & 0x1ff) << 12));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)\n{\n\tsljit_s32 dst_reg;\n\tsljit_ins ins;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));\n\n\tSLJIT_ASSERT (SLJIT_LOCALS_OFFSET_BASE == 0);\n\n\tdst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (offset <= 0xffffff && offset >= -0xffffff) {\n\t\tins = ADDI;\n\t\tif (offset < 0) {\n\t\t\toffset = -offset;\n\t\t\tins = SUBI;\n\t\t}\n\n\t\tif (offset <= 0xfff)\n\t\t\tFAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(SLJIT_SP) | (offset << 10)));\n\t\telse {\n\t\t\tFAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(SLJIT_SP) | ((offset & 0xfff000) >> (12 - 10)) | (1 << 22)));\n\n\t\t\toffset &= 0xfff;\n\t\t\tif (offset != 0)\n\t\t\t\tFAIL_IF(push_inst(compiler, ins | RD(dst_reg) | RN(dst_reg) | (offset << 10)));\n\t\t}\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate (compiler, dst_reg, offset));\n\t\t/* Add extended register form. */\n\t\tFAIL_IF(push_inst(compiler, ADDE | (0x3 << 13) | RD(dst_reg) | RN(SLJIT_SP) | RM(dst_reg)));\n\t}\n\n\tif (SLJIT_UNLIKELY(dst & SLJIT_MEM))\n\t\treturn emit_op_mem(compiler, WORD_SIZE | STORE, dst_reg, dst, dstw, TMP_REG1);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\tPTR_FAIL_IF(emit_imm64_const(compiler, dst_r, init_value));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2));\n\treturn const_;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins* inst = (sljit_ins*)addr;\n\tmodify_imm64_const(inst, new_target);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 4);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins* inst = (sljit_ins*)addr;\n\tmodify_imm64_const(inst, new_constant);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 4);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeARM_T2_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n#ifdef __SOFTFP__\n\treturn \"ARM-Thumb2\" SLJIT_CPUINFO \" ABI:softfp\";\n#else\n\treturn \"ARM-Thumb2\" SLJIT_CPUINFO \" ABI:hardfp\";\n#endif\n}\n\n/* Length of an instruction word. */\ntypedef sljit_u32 sljit_ins;\n\n/* Last register + 1. */\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_PC\t\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\n/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {\n\t0, 0, 1, 2, 3, 11, 10, 9, 8, 7, 6, 5, 4, 13, 12, 14, 15\n};\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 1, 2, 3, 4, 5, 6, 7\n};\n\n#define COPY_BITS(src, from, to, bits) \\\n\t((from >= to ? (src >> (from - to)) : (src << (to - from))) & (((1 << bits) - 1) << to))\n\n/* Thumb16 encodings. */\n#define RD3(rd) (reg_map[rd])\n#define RN3(rn) (reg_map[rn] << 3)\n#define RM3(rm) (reg_map[rm] << 6)\n#define RDN3(rdn) (reg_map[rdn] << 8)\n#define IMM3(imm) (imm << 6)\n#define IMM8(imm) (imm)\n\n/* Thumb16 helpers. */\n#define SET_REGS44(rd, rn) \\\n\t((reg_map[rn] << 3) | (reg_map[rd] & 0x7) | ((reg_map[rd] & 0x8) << 4))\n#define IS_2_LO_REGS(reg1, reg2) \\\n\t(reg_map[reg1] <= 7 && reg_map[reg2] <= 7)\n#define IS_3_LO_REGS(reg1, reg2, reg3) \\\n\t(reg_map[reg1] <= 7 && reg_map[reg2] <= 7 && reg_map[reg3] <= 7)\n\n/* Thumb32 encodings. */\n#define RD4(rd) (reg_map[rd] << 8)\n#define RN4(rn) (reg_map[rn] << 16)\n#define RM4(rm) (reg_map[rm])\n#define RT4(rt) (reg_map[rt] << 12)\n#define DD4(dd) (freg_map[dd] << 12)\n#define DN4(dn) (freg_map[dn] << 16)\n#define DM4(dm) (freg_map[dm])\n#define IMM5(imm) \\\n\t(COPY_BITS(imm, 2, 12, 3) | ((imm & 0x3) << 6))\n#define IMM12(imm) \\\n\t(COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff))\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n/* dot '.' changed to _\n   I immediate form (possibly followed by number of immediate bits). */\n#define ADCI\t\t0xf1400000\n#define ADCS\t\t0x4140\n#define ADC_W\t\t0xeb400000\n#define ADD\t\t0x4400\n#define ADDS\t\t0x1800\n#define ADDSI3\t\t0x1c00\n#define ADDSI8\t\t0x3000\n#define ADD_W\t\t0xeb000000\n#define ADDWI\t\t0xf2000000\n#define ADD_SP\t\t0xb000\n#define ADD_W\t\t0xeb000000\n#define ADD_WI\t\t0xf1000000\n#define ANDI\t\t0xf0000000\n#define ANDS\t\t0x4000\n#define AND_W\t\t0xea000000\n#define ASRS\t\t0x4100\n#define ASRSI\t\t0x1000\n#define ASR_W\t\t0xfa40f000\n#define ASR_WI\t\t0xea4f0020\n#define BCC\t\t0xd000\n#define BICI\t\t0xf0200000\n#define BKPT\t\t0xbe00\n#define BLX\t\t0x4780\n#define BX\t\t0x4700\n#define CLZ\t\t0xfab0f080\n#define CMNI_W\t\t0xf1100f00\n#define CMP\t\t0x4280\n#define CMPI\t\t0x2800\n#define CMPI_W\t\t0xf1b00f00\n#define CMP_X\t\t0x4500\n#define CMP_W\t\t0xebb00f00\n#define EORI\t\t0xf0800000\n#define EORS\t\t0x4040\n#define EOR_W\t\t0xea800000\n#define IT\t\t0xbf00\n#define LDRI\t\t0xf8500800\n#define LSLS\t\t0x4080\n#define LSLSI\t\t0x0000\n#define LSL_W\t\t0xfa00f000\n#define LSL_WI\t\t0xea4f0000\n#define LSRS\t\t0x40c0\n#define LSRSI\t\t0x0800\n#define LSR_W\t\t0xfa20f000\n#define LSR_WI\t\t0xea4f0010\n#define MOV\t\t0x4600\n#define MOVS\t\t0x0000\n#define MOVSI\t\t0x2000\n#define MOVT\t\t0xf2c00000\n#define MOVW\t\t0xf2400000\n#define MOV_W\t\t0xea4f0000\n#define MOV_WI\t\t0xf04f0000\n#define MUL\t\t0xfb00f000\n#define MVNS\t\t0x43c0\n#define MVN_W\t\t0xea6f0000\n#define MVN_WI\t\t0xf06f0000\n#define NOP\t\t0xbf00\n#define ORNI\t\t0xf0600000\n#define ORRI\t\t0xf0400000\n#define ORRS\t\t0x4300\n#define ORR_W\t\t0xea400000\n#define POP\t\t0xbc00\n#define POP_W\t\t0xe8bd0000\n#define PUSH\t\t0xb400\n#define PUSH_W\t\t0xe92d0000\n#define RSB_WI\t\t0xf1c00000\n#define RSBSI\t\t0x4240\n#define SBCI\t\t0xf1600000\n#define SBCS\t\t0x4180\n#define SBC_W\t\t0xeb600000\n#define SDIV\t\t0xfb90f0f0\n#define SMULL\t\t0xfb800000\n#define STR_SP\t\t0x9000\n#define SUBS\t\t0x1a00\n#define SUBSI3\t\t0x1e00\n#define SUBSI8\t\t0x3800\n#define SUB_W\t\t0xeba00000\n#define SUBWI\t\t0xf2a00000\n#define SUB_SP\t\t0xb080\n#define SUB_WI\t\t0xf1a00000\n#define SXTB\t\t0xb240\n#define SXTB_W\t\t0xfa4ff080\n#define SXTH\t\t0xb200\n#define SXTH_W\t\t0xfa0ff080\n#define TST\t\t0x4200\n#define UDIV\t\t0xfbb0f0f0\n#define UMULL\t\t0xfba00000\n#define UXTB\t\t0xb2c0\n#define UXTB_W\t\t0xfa5ff080\n#define UXTH\t\t0xb280\n#define UXTH_W\t\t0xfa1ff080\n#define VABS_F32\t0xeeb00ac0\n#define VADD_F32\t0xee300a00\n#define VCMP_F32\t0xeeb40a40\n#define VCVT_F32_S32\t0xeeb80ac0\n#define VCVT_F64_F32\t0xeeb70ac0\n#define VCVT_S32_F32\t0xeebd0ac0\n#define VDIV_F32\t0xee800a00\n#define VMOV_F32\t0xeeb00a40\n#define VMOV\t\t0xee000a10\n#define VMOV2\t\t0xec400a10\n#define VMRS\t\t0xeef1fa10\n#define VMUL_F32\t0xee200a00\n#define VNEG_F32\t0xeeb10a40\n#define VSTR_F32\t0xed000a00\n#define VSUB_F32\t0xee300a40\n\nstatic sljit_s32 push_inst16(struct sljit_compiler *compiler, sljit_ins inst)\n{\n\tsljit_u16 *ptr;\n\tSLJIT_ASSERT(!(inst & 0xffff0000));\n\n\tptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_u16));\n\tFAIL_IF(!ptr);\n\t*ptr = inst;\n\tcompiler->size++;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_inst32(struct sljit_compiler *compiler, sljit_ins inst)\n{\n\tsljit_u16 *ptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr++ = inst >> 16;\n\t*ptr = inst;\n\tcompiler->size += 2;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)\n{\n\tFAIL_IF(push_inst32(compiler, MOVW | RD4(dst)\n\t\t| COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff)));\n\treturn push_inst32(compiler, MOVT | RD4(dst)\n\t\t| COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16));\n}\n\nstatic SLJIT_INLINE void modify_imm32_const(sljit_u16 *inst, sljit_uw new_imm)\n{\n\tsljit_s32 dst = inst[1] & 0x0f00;\n\tSLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00));\n\tinst[0] = (MOVW >> 16) | COPY_BITS(new_imm, 12, 0, 4) | COPY_BITS(new_imm, 11, 10, 1);\n\tinst[1] = dst | COPY_BITS(new_imm, 8, 12, 3) | (new_imm & 0xff);\n\tinst[2] = (MOVT >> 16) | COPY_BITS(new_imm, 12 + 16, 0, 4) | COPY_BITS(new_imm, 11 + 16, 10, 1);\n\tinst[3] = dst | COPY_BITS(new_imm, 8 + 16, 12, 3) | ((new_imm & 0xff0000) >> 16);\n}\n\nstatic SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn 0;\n\n\tif (jump->flags & JUMP_ADDR) {\n\t\t/* Branch to ARM code is not optimized yet. */\n\t\tif (!(jump->u.target & 0x1))\n\t\t\treturn 0;\n\t\tdiff = ((sljit_sw)jump->u.target - (sljit_sw)(code_ptr + 2) - executable_offset) >> 1;\n\t}\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\tdiff = ((sljit_sw)(code + jump->u.label->size) - (sljit_sw)(code_ptr + 2)) >> 1;\n\t}\n\n\tif (jump->flags & IS_COND) {\n\t\tSLJIT_ASSERT(!(jump->flags & IS_BL));\n\t\tif (diff <= 127 && diff >= -128) {\n\t\t\tjump->flags |= PATCH_TYPE1;\n\t\t\treturn 5;\n\t\t}\n\t\tif (diff <= 524287 && diff >= -524288) {\n\t\t\tjump->flags |= PATCH_TYPE2;\n\t\t\treturn 4;\n\t\t}\n\t\t/* +1 comes from the prefix IT instruction. */\n\t\tdiff--;\n\t\tif (diff <= 8388607 && diff >= -8388608) {\n\t\t\tjump->flags |= PATCH_TYPE3;\n\t\t\treturn 3;\n\t\t}\n\t}\n\telse if (jump->flags & IS_BL) {\n\t\tif (diff <= 8388607 && diff >= -8388608) {\n\t\t\tjump->flags |= PATCH_BL;\n\t\t\treturn 3;\n\t\t}\n\t}\n\telse {\n\t\tif (diff <= 1023 && diff >= -1024) {\n\t\t\tjump->flags |= PATCH_TYPE4;\n\t\t\treturn 4;\n\t\t}\n\t\tif (diff <= 8388607 && diff >= -8388608) {\n\t\t\tjump->flags |= PATCH_TYPE5;\n\t\t\treturn 3;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump, sljit_sw executable_offset)\n{\n\tsljit_s32 type = (jump->flags >> 4) & 0xf;\n\tsljit_sw diff;\n\tsljit_u16 *jump_inst;\n\tsljit_s32 s, j1, j2;\n\n\tif (SLJIT_UNLIKELY(type == 0)) {\n\t\tmodify_imm32_const((sljit_u16*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target);\n\t\treturn;\n\t}\n\n\tif (jump->flags & JUMP_ADDR) {\n\t\tSLJIT_ASSERT(jump->u.target & 0x1);\n\t\tdiff = ((sljit_sw)jump->u.target - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1;\n\t}\n\telse {\n\t\tSLJIT_ASSERT(jump->u.label->addr & 0x1);\n\t\tdiff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + sizeof(sljit_u32)) - executable_offset) >> 1;\n\t}\n\tjump_inst = (sljit_u16*)jump->addr;\n\n\tswitch (type) {\n\tcase 1:\n\t\t/* Encoding T1 of 'B' instruction */\n\t\tSLJIT_ASSERT(diff <= 127 && diff >= -128 && (jump->flags & IS_COND));\n\t\tjump_inst[0] = 0xd000 | (jump->flags & 0xf00) | (diff & 0xff);\n\t\treturn;\n\tcase 2:\n\t\t/* Encoding T3 of 'B' instruction */\n\t\tSLJIT_ASSERT(diff <= 524287 && diff >= -524288 && (jump->flags & IS_COND));\n\t\tjump_inst[0] = 0xf000 | COPY_BITS(jump->flags, 8, 6, 4) | COPY_BITS(diff, 11, 0, 6) | COPY_BITS(diff, 19, 10, 1);\n\t\tjump_inst[1] = 0x8000 | COPY_BITS(diff, 17, 13, 1) | COPY_BITS(diff, 18, 11, 1) | (diff & 0x7ff);\n\t\treturn;\n\tcase 3:\n\t\tSLJIT_ASSERT(jump->flags & IS_COND);\n\t\t*jump_inst++ = IT | ((jump->flags >> 4) & 0xf0) | 0x8;\n\t\tdiff--;\n\t\ttype = 5;\n\t\tbreak;\n\tcase 4:\n\t\t/* Encoding T2 of 'B' instruction */\n\t\tSLJIT_ASSERT(diff <= 1023 && diff >= -1024 && !(jump->flags & IS_COND));\n\t\tjump_inst[0] = 0xe000 | (diff & 0x7ff);\n\t\treturn;\n\t}\n\n\tSLJIT_ASSERT(diff <= 8388607 && diff >= -8388608);\n\n\t/* Really complex instruction form for branches. */\n\ts = (diff >> 23) & 0x1;\n\tj1 = (~(diff >> 22) ^ s) & 0x1;\n\tj2 = (~(diff >> 21) ^ s) & 0x1;\n\tjump_inst[0] = 0xf000 | (s << 10) | COPY_BITS(diff, 11, 0, 10);\n\tjump_inst[1] = (j1 << 13) | (j2 << 11) | (diff & 0x7ff);\n\n\t/* The others have a common form. */\n\tif (type == 5) /* Encoding T4 of 'B' instruction */\n\t\tjump_inst[1] |= 0x9000;\n\telse if (type == 6) /* Encoding T1 of 'BL' instruction */\n\t\tjump_inst[1] |= 0xd000;\n\telse\n\t\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_u16 *code;\n\tsljit_u16 *code_ptr;\n\tsljit_u16 *buf_ptr;\n\tsljit_u16 *buf_end;\n\tsljit_uw half_count;\n\tsljit_sw executable_offset;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\tcode = (sljit_u16*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_u16));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\thalf_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tdo {\n\t\tbuf_ptr = (sljit_u16*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 1);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tSLJIT_ASSERT(!label || label->size >= half_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= half_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= half_count);\n\t\t\tif (label && label->size == half_count) {\n\t\t\t\tlabel->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1;\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\t\t\tif (jump && jump->addr == half_count) {\n\t\t\t\t\tjump->addr = (sljit_uw)code_ptr - ((jump->flags & IS_COND) ? 10 : 8);\n\t\t\t\t\tcode_ptr -= detect_jump_type(jump, code_ptr, code, executable_offset);\n\t\t\t\t\tjump = jump->next;\n\t\t\t}\n\t\t\tif (const_ && const_->addr == half_count) {\n\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\t\t\tcode_ptr ++;\n\t\t\thalf_count ++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == half_count) {\n\t\tlabel->addr = ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset)) | 0x1;\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tset_jump_instruction(jump, executable_offset);\n\t\tjump = jump->next;\n\t}\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_u16);\n\n\tcode = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\tcode_ptr = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\t/* Set thumb mode flag. */\n\treturn (void*)((sljit_uw)code | 0x1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#else\n\t\t/* Available by default. */\n\t\treturn 1;\n#endif\n\n\tcase SLJIT_HAS_CLZ:\n\tcase SLJIT_HAS_CMOV:\n\t\treturn 1;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Core code generator functions.                                       */\n/* --------------------------------------------------------------------- */\n\n#define INVALID_IMM\t0x80000000\nstatic sljit_uw get_imm(sljit_uw imm)\n{\n\t/* Thumb immediate form. */\n\tsljit_s32 counter;\n\n\tif (imm <= 0xff)\n\t\treturn imm;\n\n\tif ((imm & 0xffff) == (imm >> 16)) {\n\t\t/* Some special cases. */\n\t\tif (!(imm & 0xff00))\n\t\t\treturn (1 << 12) | (imm & 0xff);\n\t\tif (!(imm & 0xff))\n\t\t\treturn (2 << 12) | ((imm >> 8) & 0xff);\n\t\tif ((imm & 0xff00) == ((imm & 0xff) << 8))\n\t\t\treturn (3 << 12) | (imm & 0xff);\n\t}\n\n\t/* Assembly optimization: count leading zeroes? */\n\tcounter = 8;\n\tif (!(imm & 0xffff0000)) {\n\t\tcounter += 16;\n\t\timm <<= 16;\n\t}\n\tif (!(imm & 0xff000000)) {\n\t\tcounter += 8;\n\t\timm <<= 8;\n\t}\n\tif (!(imm & 0xf0000000)) {\n\t\tcounter += 4;\n\t\timm <<= 4;\n\t}\n\tif (!(imm & 0xc0000000)) {\n\t\tcounter += 2;\n\t\timm <<= 2;\n\t}\n\tif (!(imm & 0x80000000)) {\n\t\tcounter += 1;\n\t\timm <<= 1;\n\t}\n\t/* Since imm >= 128, this must be true. */\n\tSLJIT_ASSERT(counter <= 31);\n\n\tif (imm & 0x00ffffff)\n\t\treturn INVALID_IMM; /* Cannot be encoded. */\n\n\treturn ((imm >> 24) & 0x7f) | COPY_BITS(counter, 4, 26, 1) | COPY_BITS(counter, 1, 12, 3) | COPY_BITS(counter, 0, 7, 1);\n}\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)\n{\n\tsljit_uw tmp;\n\n\t/* MOVS cannot be used since it destroy flags. */\n\n\tif (imm >= 0x10000) {\n\t\ttmp = get_imm(imm);\n\t\tif (tmp != INVALID_IMM)\n\t\t\treturn push_inst32(compiler, MOV_WI | RD4(dst) | tmp);\n\t\ttmp = get_imm(~imm);\n\t\tif (tmp != INVALID_IMM)\n\t\t\treturn push_inst32(compiler, MVN_WI | RD4(dst) | tmp);\n\t}\n\n\t/* set low 16 bits, set hi 16 bits to 0. */\n\tFAIL_IF(push_inst32(compiler, MOVW | RD4(dst)\n\t\t| COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff)));\n\n\t/* set hi 16 bit if needed. */\n\tif (imm >= 0x10000)\n\t\treturn push_inst32(compiler, MOVT | RD4(dst)\n\t\t\t| COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16));\n\treturn SLJIT_SUCCESS;\n}\n\n#define ARG1_IMM\t0x0010000\n#define ARG2_IMM\t0x0020000\n/* SET_FLAGS must be 0x100000 as it is also the value of S bit (can be used for optimization). */\n#define SET_FLAGS\t0x0100000\n#define UNUSED_RETURN\t0x0200000\n\nstatic sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_uw arg1, sljit_uw arg2)\n{\n\t/* dst must be register, TMP_REG1\n\t   arg1 must be register, imm\n\t   arg2 must be register, imm */\n\tsljit_s32 reg;\n\tsljit_uw imm, nimm;\n\n\tif (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) {\n\t\t/* Both are immediates, no temporaries are used. */\n\t\tflags &= ~ARG1_IMM;\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, arg1));\n\t\targ1 = TMP_REG1;\n\t}\n\n\tif (flags & (ARG1_IMM | ARG2_IMM)) {\n\t\treg = (flags & ARG2_IMM) ? arg1 : arg2;\n\t\timm = (flags & ARG2_IMM) ? arg2 : arg1;\n\n\t\tswitch (flags & 0xffff) {\n\t\tcase SLJIT_CLZ:\n\t\tcase SLJIT_MUL:\n\t\t\t/* No form with immediate operand. */\n\t\t\tbreak;\n\t\tcase SLJIT_MOV:\n\t\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && (flags & ARG2_IMM) && arg1 == TMP_REG2);\n\t\t\treturn load_immediate(compiler, dst, imm);\n\t\tcase SLJIT_NOT:\n\t\t\tif (!(flags & SET_FLAGS))\n\t\t\t\treturn load_immediate(compiler, dst, ~imm);\n\t\t\t/* Since the flags should be set, we just fallback to the register mode.\n\t\t\t   Although some clever things could be done here, \"NOT IMM\" does not worth the efforts. */\n\t\t\tbreak;\n\t\tcase SLJIT_ADD:\n\t\t\tnimm = -imm;\n\t\t\tif (IS_2_LO_REGS(reg, dst)) {\n\t\t\t\tif (imm <= 0x7)\n\t\t\t\t\treturn push_inst16(compiler, ADDSI3 | IMM3(imm) | RD3(dst) | RN3(reg));\n\t\t\t\tif (nimm <= 0x7)\n\t\t\t\t\treturn push_inst16(compiler, SUBSI3 | IMM3(nimm) | RD3(dst) | RN3(reg));\n\t\t\t\tif (reg == dst) {\n\t\t\t\t\tif (imm <= 0xff)\n\t\t\t\t\t\treturn push_inst16(compiler, ADDSI8 | IMM8(imm) | RDN3(dst));\n\t\t\t\t\tif (nimm <= 0xff)\n\t\t\t\t\t\treturn push_inst16(compiler, SUBSI8 | IMM8(nimm) | RDN3(dst));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!(flags & SET_FLAGS)) {\n\t\t\t\tif (imm <= 0xfff)\n\t\t\t\t\treturn push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(imm));\n\t\t\t\tif (nimm <= 0xfff)\n\t\t\t\t\treturn push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(nimm));\n\t\t\t}\n\t\t\tnimm = get_imm(imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ADD_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\tnimm = get_imm(-imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, SUB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\tbreak;\n\t\tcase SLJIT_ADDC:\n\t\t\timm = get_imm(imm);\n\t\t\tif (imm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ADCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\tbreak;\n\t\tcase SLJIT_SUB:\n\t\t\t/* SUB operation can be replaced by ADD because of the negative carry flag. */\n\t\t\tif (flags & ARG1_IMM) {\n\t\t\t\tif (imm == 0 && IS_2_LO_REGS(reg, dst))\n\t\t\t\t\treturn push_inst16(compiler, RSBSI | RD3(dst) | RN3(reg));\n\t\t\t\timm = get_imm(imm);\n\t\t\t\tif (imm != INVALID_IMM)\n\t\t\t\t\treturn push_inst32(compiler, RSB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (flags & UNUSED_RETURN) {\n\t\t\t\tif (imm <= 0xff && reg_map[reg] <= 7)\n\t\t\t\t\treturn push_inst16(compiler, CMPI | IMM8(imm) | RDN3(reg));\n\t\t\t\tnimm = get_imm(imm);\n\t\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\t\treturn push_inst32(compiler, CMPI_W | RN4(reg) | nimm);\n\t\t\t\tnimm = get_imm(-imm);\n\t\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\t\treturn push_inst32(compiler, CMNI_W | RN4(reg) | nimm);\n\t\t\t}\n\t\t\tnimm = -imm;\n\t\t\tif (IS_2_LO_REGS(reg, dst)) {\n\t\t\t\tif (imm <= 0x7)\n\t\t\t\t\treturn push_inst16(compiler, SUBSI3 | IMM3(imm) | RD3(dst) | RN3(reg));\n\t\t\t\tif (nimm <= 0x7)\n\t\t\t\t\treturn push_inst16(compiler, ADDSI3 | IMM3(nimm) | RD3(dst) | RN3(reg));\n\t\t\t\tif (reg == dst) {\n\t\t\t\t\tif (imm <= 0xff)\n\t\t\t\t\t\treturn push_inst16(compiler, SUBSI8 | IMM8(imm) | RDN3(dst));\n\t\t\t\t\tif (nimm <= 0xff)\n\t\t\t\t\t\treturn push_inst16(compiler, ADDSI8 | IMM8(nimm) | RDN3(dst));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!(flags & SET_FLAGS)) {\n\t\t\t\tif (imm <= 0xfff)\n\t\t\t\t\treturn push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(imm));\n\t\t\t\tif (nimm <= 0xfff)\n\t\t\t\t\treturn push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(nimm));\n\t\t\t}\n\t\t\tnimm = get_imm(imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, SUB_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\tnimm = get_imm(-imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ADD_WI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\tbreak;\n\t\tcase SLJIT_SUBC:\n\t\t\tif (flags & ARG1_IMM)\n\t\t\t\tbreak;\n\t\t\timm = get_imm(imm);\n\t\t\tif (imm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, SBCI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\tbreak;\n\t\tcase SLJIT_AND:\n\t\t\tnimm = get_imm(imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ANDI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\timm = get_imm(imm);\n\t\t\tif (imm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, BICI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\tbreak;\n\t\tcase SLJIT_OR:\n\t\t\tnimm = get_imm(imm);\n\t\t\tif (nimm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ORRI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | nimm);\n\t\t\timm = get_imm(imm);\n\t\t\tif (imm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, ORNI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\tbreak;\n\t\tcase SLJIT_XOR:\n\t\t\timm = get_imm(imm);\n\t\t\tif (imm != INVALID_IMM)\n\t\t\t\treturn push_inst32(compiler, EORI | (flags & SET_FLAGS) | RD4(dst) | RN4(reg) | imm);\n\t\t\tbreak;\n\t\tcase SLJIT_SHL:\n\t\tcase SLJIT_LSHR:\n\t\tcase SLJIT_ASHR:\n\t\t\tif (flags & ARG1_IMM)\n\t\t\t\tbreak;\n\t\t\timm &= 0x1f;\n\t\t\tif (imm == 0) {\n\t\t\t\tif (!(flags & SET_FLAGS))\n\t\t\t\t\treturn push_inst16(compiler, MOV | SET_REGS44(dst, reg));\n\t\t\t\tif (IS_2_LO_REGS(dst, reg))\n\t\t\t\t\treturn push_inst16(compiler, MOVS | RD3(dst) | RN3(reg));\n\t\t\t\treturn push_inst32(compiler, MOV_W | SET_FLAGS | RD4(dst) | RM4(reg));\n\t\t\t}\n\t\t\tswitch (flags & 0xffff) {\n\t\t\tcase SLJIT_SHL:\n\t\t\t\tif (IS_2_LO_REGS(dst, reg))\n\t\t\t\t\treturn push_inst16(compiler, LSLSI | RD3(dst) | RN3(reg) | (imm << 6));\n\t\t\t\treturn push_inst32(compiler, LSL_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm));\n\t\t\tcase SLJIT_LSHR:\n\t\t\t\tif (IS_2_LO_REGS(dst, reg))\n\t\t\t\t\treturn push_inst16(compiler, LSRSI | RD3(dst) | RN3(reg) | (imm << 6));\n\t\t\t\treturn push_inst32(compiler, LSR_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm));\n\t\t\tdefault: /* SLJIT_ASHR */\n\t\t\t\tif (IS_2_LO_REGS(dst, reg))\n\t\t\t\t\treturn push_inst16(compiler, ASRSI | RD3(dst) | RN3(reg) | (imm << 6));\n\t\t\t\treturn push_inst32(compiler, ASR_WI | (flags & SET_FLAGS) | RD4(dst) | RM4(reg) | IMM5(imm));\n\t\t\t}\n\t\tdefault:\n\t\t\tSLJIT_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\n\t\tif (flags & ARG2_IMM) {\n\t\t\timm = arg2;\n\t\t\targ2 = (arg1 == TMP_REG1) ? TMP_REG2 : TMP_REG1;\n\t\t\tFAIL_IF(load_immediate(compiler, arg2, imm));\n\t\t}\n\t\telse {\n\t\t\timm = arg1;\n\t\t\targ1 = (arg2 == TMP_REG1) ? TMP_REG2 : TMP_REG1;\n\t\t\tFAIL_IF(load_immediate(compiler, arg1, imm));\n\t\t}\n\n\t\tSLJIT_ASSERT(arg1 != arg2);\n\t}\n\n\t/* Both arguments are registers. */\n\tswitch (flags & 0xffff) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2);\n\t\tif (dst == arg2)\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn push_inst16(compiler, MOV | SET_REGS44(dst, arg2));\n\tcase SLJIT_MOV_U8:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2);\n\t\tif (IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, UXTB | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, UXTB_W | RD4(dst) | RM4(arg2));\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2);\n\t\tif (IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, SXTB | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, SXTB_W | RD4(dst) | RM4(arg2));\n\tcase SLJIT_MOV_U16:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2);\n\t\tif (IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, UXTH | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, UXTH_W | RD4(dst) | RM4(arg2));\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG2);\n\t\tif (IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, SXTH | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, SXTH_W | RD4(dst) | RM4(arg2));\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(arg1 == TMP_REG2);\n\t\tif (IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, MVNS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, MVN_W | (flags & SET_FLAGS) | RD4(dst) | RM4(arg2));\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(arg1 == TMP_REG2);\n\t\tFAIL_IF(push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2)));\n\t\treturn SLJIT_SUCCESS;\n\tcase SLJIT_ADD:\n\t\tif (IS_3_LO_REGS(dst, arg1, arg2))\n\t\t\treturn push_inst16(compiler, ADDS | RD3(dst) | RN3(arg1) | RM3(arg2));\n\t\tif (dst == arg1 && !(flags & SET_FLAGS))\n\t\t\treturn push_inst16(compiler, ADD | SET_REGS44(dst, arg2));\n\t\treturn push_inst32(compiler, ADD_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_ADDC:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, ADCS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, ADC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_SUB:\n\t\tif (flags & UNUSED_RETURN) {\n\t\t\tif (IS_2_LO_REGS(arg1, arg2))\n\t\t\t\treturn push_inst16(compiler, CMP | RD3(arg1) | RN3(arg2));\n\t\t\treturn push_inst16(compiler, CMP_X | SET_REGS44(arg1, arg2));\n\t\t}\n\t\tif (IS_3_LO_REGS(dst, arg1, arg2))\n\t\t\treturn push_inst16(compiler, SUBS | RD3(dst) | RN3(arg1) | RM3(arg2));\n\t\treturn push_inst32(compiler, SUB_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_SUBC:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, SBCS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, SBC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_MUL:\n\t\tif (!(flags & SET_FLAGS))\n\t\t\treturn push_inst32(compiler, MUL | RD4(dst) | RN4(arg1) | RM4(arg2));\n\t\tSLJIT_ASSERT(dst != TMP_REG2);\n\t\tFAIL_IF(push_inst32(compiler, SMULL | RT4(dst) | RD4(TMP_REG2) | RN4(arg1) | RM4(arg2)));\n\t\t/* cmp TMP_REG2, dst asr #31. */\n\t\treturn push_inst32(compiler, CMP_W | RN4(TMP_REG2) | 0x70e0 | RM4(dst));\n\tcase SLJIT_AND:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, ANDS | RD3(dst) | RN3(arg2));\n\t\tif ((flags & UNUSED_RETURN) && IS_2_LO_REGS(arg1, arg2))\n\t\t\treturn push_inst16(compiler, TST | RD3(arg1) | RN3(arg2));\n\t\treturn push_inst32(compiler, AND_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_OR:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, ORRS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, ORR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_XOR:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, EORS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, EOR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_SHL:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, LSLS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, LSL_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_LSHR:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, LSRS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, LSR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\tcase SLJIT_ASHR:\n\t\tif (dst == arg1 && IS_2_LO_REGS(dst, arg2))\n\t\t\treturn push_inst16(compiler, ASRS | RD3(dst) | RN3(arg2));\n\t\treturn push_inst32(compiler, ASR_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2));\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\n#define STORE\t\t0x01\n#define SIGNED\t\t0x02\n\n#define WORD_SIZE\t0x00\n#define BYTE_SIZE\t0x04\n#define HALF_SIZE\t0x08\n#define PRELOAD\t\t0x0c\n\n#define IS_WORD_SIZE(flags)\t\t(!(flags & (BYTE_SIZE | HALF_SIZE)))\n#define OFFSET_CHECK(imm, shift)\t(!(argw & ~(imm << shift)))\n\n/*\n  1st letter:\n  w = word\n  b = byte\n  h = half\n\n  2nd letter:\n  s = signed\n  u = unsigned\n\n  3rd letter:\n  l = load\n  s = store\n*/\n\nstatic const sljit_ins sljit_mem16[12] = {\n/* w u l */ 0x5800 /* ldr */,\n/* w u s */ 0x5000 /* str */,\n/* w s l */ 0x5800 /* ldr */,\n/* w s s */ 0x5000 /* str */,\n\n/* b u l */ 0x5c00 /* ldrb */,\n/* b u s */ 0x5400 /* strb */,\n/* b s l */ 0x5600 /* ldrsb */,\n/* b s s */ 0x5400 /* strb */,\n\n/* h u l */ 0x5a00 /* ldrh */,\n/* h u s */ 0x5200 /* strh */,\n/* h s l */ 0x5e00 /* ldrsh */,\n/* h s s */ 0x5200 /* strh */,\n};\n\nstatic const sljit_ins sljit_mem16_imm5[12] = {\n/* w u l */ 0x6800 /* ldr imm5 */,\n/* w u s */ 0x6000 /* str imm5 */,\n/* w s l */ 0x6800 /* ldr imm5 */,\n/* w s s */ 0x6000 /* str imm5 */,\n\n/* b u l */ 0x7800 /* ldrb imm5 */,\n/* b u s */ 0x7000 /* strb imm5 */,\n/* b s l */ 0x0000 /* not allowed */,\n/* b s s */ 0x7000 /* strb imm5 */,\n\n/* h u l */ 0x8800 /* ldrh imm5 */,\n/* h u s */ 0x8000 /* strh imm5 */,\n/* h s l */ 0x0000 /* not allowed */,\n/* h s s */ 0x8000 /* strh imm5 */,\n};\n\n#define MEM_IMM8\t0xc00\n#define MEM_IMM12\t0x800000\nstatic const sljit_ins sljit_mem32[13] = {\n/* w u l */ 0xf8500000 /* ldr.w */,\n/* w u s */ 0xf8400000 /* str.w */,\n/* w s l */ 0xf8500000 /* ldr.w */,\n/* w s s */ 0xf8400000 /* str.w */,\n\n/* b u l */ 0xf8100000 /* ldrb.w */,\n/* b u s */ 0xf8000000 /* strb.w */,\n/* b s l */ 0xf9100000 /* ldrsb.w */,\n/* b s s */ 0xf8000000 /* strb.w */,\n\n/* h u l */ 0xf8300000 /* ldrh.w */,\n/* h u s */ 0xf8200000 /* strsh.w */,\n/* h s l */ 0xf9300000 /* ldrsh.w */,\n/* h s s */ 0xf8200000 /* strsh.w */,\n\n/* p u l */ 0xf8100000 /* pld */,\n};\n\n/* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */\nstatic sljit_s32 emit_set_delta(struct sljit_compiler *compiler, sljit_s32 dst, sljit_s32 reg, sljit_sw value)\n{\n\tif (value >= 0) {\n\t\tif (value <= 0xfff)\n\t\t\treturn push_inst32(compiler, ADDWI | RD4(dst) | RN4(reg) | IMM12(value));\n\t\tvalue = get_imm(value);\n\t\tif (value != INVALID_IMM)\n\t\t\treturn push_inst32(compiler, ADD_WI | RD4(dst) | RN4(reg) | value);\n\t}\n\telse {\n\t\tvalue = -value;\n\t\tif (value <= 0xfff)\n\t\t\treturn push_inst32(compiler, SUBWI | RD4(dst) | RN4(reg) | IMM12(value));\n\t\tvalue = get_imm(value);\n\t\tif (value != INVALID_IMM)\n\t\t\treturn push_inst32(compiler, SUB_WI | RD4(dst) | RN4(reg) | value);\n\t}\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,\n\tsljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg)\n{\n\tsljit_s32 other_r;\n\tsljit_uw tmp;\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\tSLJIT_ASSERT((arg & REG_MASK) != tmp_reg);\n\targ &= ~SLJIT_MEM;\n\n\tif (SLJIT_UNLIKELY(!(arg & REG_MASK))) {\n\t\ttmp = get_imm(argw & ~0xfff);\n\t\tif (tmp != INVALID_IMM) {\n\t\t\tFAIL_IF(push_inst32(compiler, MOV_WI | RD4(tmp_reg) | tmp));\n\t\t\treturn push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(tmp_reg) | (argw & 0xfff));\n\t\t}\n\n\t\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\t\tif (IS_2_LO_REGS(reg, tmp_reg) && sljit_mem16_imm5[flags])\n\t\t\treturn push_inst16(compiler, sljit_mem16_imm5[flags] | RD3(reg) | RN3(tmp_reg));\n\t\treturn push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(tmp_reg));\n\t}\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\t\tother_r = OFFS_REG(arg);\n\t\targ &= 0xf;\n\n\t\tif (!argw && IS_3_LO_REGS(reg, arg, other_r))\n\t\t\treturn push_inst16(compiler, sljit_mem16[flags] | RD3(reg) | RN3(arg) | RM3(other_r));\n\t\treturn push_inst32(compiler, sljit_mem32[flags] | RT4(reg) | RN4(arg) | RM4(other_r) | (argw << 4));\n\t}\n\n\tif (argw > 0xfff) {\n\t\ttmp = get_imm(argw & ~0xfff);\n\t\tif (tmp != INVALID_IMM) {\n\t\t\tpush_inst32(compiler, ADD_WI | RD4(tmp_reg) | RN4(arg) | tmp);\n\t\t\targ = tmp_reg;\n\t\t\targw = argw & 0xfff;\n\t\t}\n\t}\n\telse if (argw < -0xff) {\n\t\ttmp = get_imm(-argw & ~0xff);\n\t\tif (tmp != INVALID_IMM) {\n\t\t\tpush_inst32(compiler, SUB_WI | RD4(tmp_reg) | RN4(arg) | tmp);\n\t\t\targ = tmp_reg;\n\t\t\targw = -(-argw & 0xff);\n\t\t}\n\t}\n\n\tif (IS_2_LO_REGS(reg, arg) && sljit_mem16_imm5[flags]) {\n\t\ttmp = 3;\n\t\tif (IS_WORD_SIZE(flags)) {\n\t\t\tif (OFFSET_CHECK(0x1f, 2))\n\t\t\t\ttmp = 2;\n\t\t}\n\t\telse if (flags & BYTE_SIZE)\n\t\t{\n\t\t\tif (OFFSET_CHECK(0x1f, 0))\n\t\t\t\ttmp = 0;\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(flags & HALF_SIZE);\n\t\t\tif (OFFSET_CHECK(0x1f, 1))\n\t\t\t\ttmp = 1;\n\t\t}\n\n\t\tif (tmp < 3)\n\t\t\treturn push_inst16(compiler, sljit_mem16_imm5[flags] | RD3(reg) | RN3(arg) | (argw << (6 - tmp)));\n\t}\n\telse if (SLJIT_UNLIKELY(arg == SLJIT_SP) && IS_WORD_SIZE(flags) && OFFSET_CHECK(0xff, 2) && reg_map[reg] <= 7) {\n\t\t/* SP based immediate. */\n\t\treturn push_inst16(compiler, STR_SP | ((flags & STORE) ? 0 : 0x800) | RDN3(reg) | (argw >> 2));\n\t}\n\n\tif (argw >= 0 && argw <= 0xfff)\n\t\treturn push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(arg) | argw);\n\telse if (argw < 0 && argw >= -0xff)\n\t\treturn push_inst32(compiler, sljit_mem32[flags] | MEM_IMM8 | RT4(reg) | RN4(arg) | -argw);\n\n\tSLJIT_ASSERT(arg != tmp_reg);\n\n\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\tif (IS_3_LO_REGS(reg, arg, tmp_reg))\n\t\treturn push_inst16(compiler, sljit_mem16[flags] | RD3(reg) | RN3(arg) | RM3(tmp_reg));\n\treturn push_inst32(compiler, sljit_mem32[flags] | RT4(reg) | RN4(arg) | RM4(tmp_reg));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, size, i, tmp;\n\tsljit_ins push = 0;\n#ifdef _WIN32\n\tsljit_uw imm;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--)\n\t\tpush |= 1 << reg_map[i];\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--)\n\t\tpush |= 1 << reg_map[i];\n\n\tFAIL_IF((push & 0xff00)\n\t\t? push_inst32(compiler, PUSH_W | (1 << 14) | push)\n\t\t: push_inst16(compiler, PUSH | (1 << 8) | push));\n\n\t/* Stack must be aligned to 8 bytes: (LR, R4) */\n\tsize = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tlocal_size = ((size + local_size + 7) & ~7) - size;\n\tcompiler->local_size = local_size;\n\n#ifdef _WIN32\n\tif (local_size >= 256) {\n\t\tif (local_size > 4096)\n\t\t\timm = get_imm(4096);\n\t\telse\n\t\t\timm = get_imm(local_size & ~0xff);\n\n\t\tSLJIT_ASSERT(imm != INVALID_IMM);\n\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(SLJIT_SP) | imm));\n\t}\n#else\n\tif (local_size > 0) {\n\t\tif (local_size <= (127 << 2))\n\t\t\tFAIL_IF(push_inst16(compiler, SUB_SP | (local_size >> 2)));\n\t\telse\n\t\t\tFAIL_IF(emit_op_imm(compiler, SLJIT_SUB | ARG2_IMM, SLJIT_SP, SLJIT_SP, local_size));\n\t}\n#endif\n\n\targs = get_arg_count(arg_types);\n\n\tif (args >= 1)\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S0, SLJIT_R0)));\n\tif (args >= 2)\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S1, SLJIT_R1)));\n\tif (args >= 3)\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_S2, SLJIT_R2)));\n\n#ifdef _WIN32\n\tif (local_size >= 256) {\n\t\tif (local_size > 4096) {\n\t\t\timm = get_imm(4096);\n\t\t\tSLJIT_ASSERT(imm != INVALID_IMM);\n\n\t\t\tif (local_size < 4 * 4096) {\n\t\t\t\tif (local_size > 2 * 4096) {\n\t\t\t\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1)));\n\t\t\t\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm));\n\t\t\t\t\tlocal_size -= 4096;\n\t\t\t\t}\n\n\t\t\t\tif (local_size > 2 * 4096) {\n\t\t\t\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1)));\n\t\t\t\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm));\n\t\t\t\t\tlocal_size -= 4096;\n\t\t\t\t}\n\n\t\t\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1)));\n\t\t\t\tlocal_size -= 4096;\n\n\t\t\t\tSLJIT_ASSERT(local_size > 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tFAIL_IF(load_immediate(compiler, SLJIT_R3, (local_size >> 12) - 1));\n\t\t\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1)));\n\t\t\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm));\n\t\t\t\tSLJIT_ASSERT(reg_map[SLJIT_R3] < 7);\n\t\t\t\tFAIL_IF(push_inst16(compiler, SUBSI8 | RDN3(SLJIT_R3) | 1));\n\t\t\t\tFAIL_IF(push_inst16(compiler, BCC | (0x1 << 8) /* not-equal */ | (-7 & 0xff)));\n\n\t\t\t\tlocal_size &= 0xfff;\n\n\t\t\t\tif (local_size != 0)\n\t\t\t\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | RT4(TMP_REG2) | RN4(TMP_REG1)));\n\t\t\t}\n\n\t\t\tif (local_size >= 256) {\n\t\t\t\timm = get_imm(local_size & ~0xff);\n\t\t\t\tSLJIT_ASSERT(imm != INVALID_IMM);\n\n\t\t\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(TMP_REG1) | imm));\n\t\t\t}\n\t\t}\n\n\t\tlocal_size &= 0xff;\n\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x400 | (local_size > 0 ? 0x100 : 0) | RT4(TMP_REG2) | RN4(TMP_REG1) | local_size));\n\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_SP, TMP_REG1)));\n\t}\n\telse if (local_size > 0)\n\t\tFAIL_IF(push_inst32(compiler, LDRI | 0x500 | RT4(TMP_REG1) | RN4(SLJIT_SP) | local_size));\n#endif\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tsize = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tcompiler->local_size = ((size + local_size + 7) & ~7) - size;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 i, tmp;\n\tsljit_ins pop = 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tif (compiler->local_size > 0) {\n\t\tif (compiler->local_size <= (127 << 2))\n\t\t\tFAIL_IF(push_inst16(compiler, ADD_SP | (compiler->local_size >> 2)));\n\t\telse\n\t\t\tFAIL_IF(emit_op_imm(compiler, SLJIT_ADD | ARG2_IMM, SLJIT_SP, SLJIT_SP, compiler->local_size));\n\t}\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--)\n\t\tpop |= 1 << reg_map[i];\n\n\tfor (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--)\n\t\tpop |= 1 << reg_map[i];\n\n\treturn (pop & 0xff00)\n\t\t? push_inst32(compiler, POP_W | (1 << 15) | pop)\n\t\t: push_inst16(compiler, POP | (1 << 8) | pop);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n#if !(defined __ARM_FEATURE_IDIV) && !(defined __ARM_ARCH_EXT_IDIV__)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _WIN32\nextern unsigned long long __rt_udiv(unsigned int denominator, unsigned int numerator);\nextern long long __rt_sdiv(int denominator, int numerator);\n#elif defined(__GNUC__)\nextern unsigned int __aeabi_uidivmod(unsigned int numerator, int unsigned denominator);\nextern int __aeabi_idivmod(int numerator, int denominator);\n#else\n#error \"Software divmod functions are needed\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !__ARM_FEATURE_IDIV && !__ARM_ARCH_EXT_IDIV__ */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n#if !(defined __ARM_FEATURE_IDIV) && !(defined __ARM_ARCH_EXT_IDIV__)\n\tsljit_sw saved_reg_list[3];\n\tsljit_sw saved_reg_count;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\t\treturn push_inst16(compiler, BKPT);\n\tcase SLJIT_NOP:\n\t\treturn push_inst16(compiler, NOP);\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\t\treturn push_inst32(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL)\n\t\t\t| (reg_map[SLJIT_R1] << 8)\n\t\t\t| (reg_map[SLJIT_R0] << 12)\n\t\t\t| (reg_map[SLJIT_R0] << 16)\n\t\t\t| reg_map[SLJIT_R1]);\n#if (defined __ARM_FEATURE_IDIV) || (defined __ARM_ARCH_EXT_IDIV__)\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG1, SLJIT_R0)));\n\t\tFAIL_IF(push_inst32(compiler, (op == SLJIT_DIVMOD_UW ? UDIV : SDIV) | RD4(SLJIT_R0) | RN4(SLJIT_R0) | RM4(SLJIT_R1)));\n\t\tFAIL_IF(push_inst32(compiler, MUL | RD4(SLJIT_R1) | RN4(SLJIT_R0) | RM4(SLJIT_R1)));\n\t\treturn push_inst32(compiler, SUB_W | RD4(SLJIT_R1) | RN4(TMP_REG1) | RM4(SLJIT_R1));\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\treturn push_inst32(compiler, (op == SLJIT_DIV_UW ? UDIV : SDIV) | RD4(SLJIT_R0) | RN4(SLJIT_R0) | RM4(SLJIT_R1));\n#else /* !__ARM_FEATURE_IDIV && !__ARM_ARCH_EXT_IDIV__ */\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\tSLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);\n\t\tSLJIT_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 3);\n\n\t\tsaved_reg_count = 0;\n\t\tif (compiler->scratches >= 4)\n\t\t\tsaved_reg_list[saved_reg_count++] = 3;\n\t\tif (compiler->scratches >= 3)\n\t\t\tsaved_reg_list[saved_reg_count++] = 2;\n\t\tif (op >= SLJIT_DIV_UW)\n\t\t\tsaved_reg_list[saved_reg_count++] = 1;\n\n\t\tif (saved_reg_count > 0) {\n\t\t\tFAIL_IF(push_inst32(compiler, 0xf84d0d00 | (saved_reg_count >= 3 ? 16 : 8)\n\t\t\t\t\t\t| (saved_reg_list[0] << 12) /* str rX, [sp, #-8/-16]! */));\n\t\t\tif (saved_reg_count >= 2) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[1] < 8);\n\t\t\t\tFAIL_IF(push_inst16(compiler, 0x9001 | (saved_reg_list[1] << 8) /* str rX, [sp, #4] */));\n\t\t\t}\n\t\t\tif (saved_reg_count >= 3) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[2] < 8);\n\t\t\t\tFAIL_IF(push_inst16(compiler, 0x9002 | (saved_reg_list[2] << 8) /* str rX, [sp, #8] */));\n\t\t\t}\n\t\t}\n\n#ifdef _WIN32\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG1, SLJIT_R0)));\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_R0, SLJIT_R1)));\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(SLJIT_R1, TMP_REG1)));\n\t\tFAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM,\n\t\t\t((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__rt_udiv) : SLJIT_FUNC_OFFSET(__rt_sdiv))));\n#elif defined(__GNUC__)\n\t\tFAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM,\n\t\t\t((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));\n#else\n#error \"Software divmod functions are needed\"\n#endif\n\n\t\tif (saved_reg_count > 0) {\n\t\t\tif (saved_reg_count >= 3) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[2] < 8);\n\t\t\t\tFAIL_IF(push_inst16(compiler, 0x9802 | (saved_reg_list[2] << 8) /* ldr rX, [sp, #8] */));\n\t\t\t}\n\t\t\tif (saved_reg_count >= 2) {\n\t\t\t\tSLJIT_ASSERT(saved_reg_list[1] < 8);\n\t\t\t\tFAIL_IF(push_inst16(compiler, 0x9801 | (saved_reg_list[1] << 8) /* ldr rX, [sp, #4] */));\n\t\t\t}\n\t\t\treturn push_inst32(compiler, 0xf85d0b00 | (saved_reg_count >= 3 ? 16 : 8)\n\t\t\t\t\t\t| (saved_reg_list[0] << 12) /* ldr rX, [sp], #8/16 */);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n#endif /* __ARM_FEATURE_IDIV || __ARM_ARCH_EXT_IDIV__ */\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r, flags;\n\tsljit_s32 op_flags = GET_ALL_FLAGS(op);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n\t\t/* Since TMP_PC has index 15, IS_2_LO_REGS and IS_3_LO_REGS checks always fail. */\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM))\n\t\t\treturn emit_op_mem(compiler, PRELOAD, TMP_PC, src, srcw, TMP_REG1);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tdst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;\n\n\top = GET_OPCODE(op);\n\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P) {\n\t\tswitch (op) {\n\t\tcase SLJIT_MOV:\n\t\tcase SLJIT_MOV_U32:\n\t\tcase SLJIT_MOV_S32:\n\t\tcase SLJIT_MOV_P:\n\t\t\tflags = WORD_SIZE;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U8:\n\t\t\tflags = BYTE_SIZE;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_u8)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S8:\n\t\t\tflags = BYTE_SIZE | SIGNED;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_s8)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U16:\n\t\t\tflags = HALF_SIZE;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_u16)srcw;\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S16:\n\t\t\tflags = HALF_SIZE | SIGNED;\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tsrcw = (sljit_s16)srcw;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSLJIT_UNREACHABLE();\n\t\t\tflags = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (src & SLJIT_IMM)\n\t\t\tFAIL_IF(emit_op_imm(compiler, SLJIT_MOV | ARG2_IMM, dst_r, TMP_REG2, srcw));\n\t\telse if (src & SLJIT_MEM) {\n\t\t\tFAIL_IF(emit_op_mem(compiler, flags, dst_r, src, srcw, TMP_REG1));\n\t\t} else {\n\t\t\tif (dst_r != TMP_REG1)\n\t\t\t\treturn emit_op_imm(compiler, op, dst_r, TMP_REG2, src);\n\t\t\tdst_r = src;\n\t\t}\n\n\t\tif (!(dst & SLJIT_MEM))\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\treturn emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2);\n\t}\n\n\tif (op == SLJIT_NEG) {\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\t\tcompiler->skip_checks = 1;\n#endif\n\t\treturn sljit_emit_op2(compiler, SLJIT_SUB | op_flags, dst, dstw, SLJIT_IMM, 0, src, srcw);\n\t}\n\n\tflags = HAS_FLAGS(op_flags) ? SET_FLAGS : 0;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\n\temit_op_imm(compiler, flags | op, dst_r, TMP_REG2, src);\n\n\tif (SLJIT_UNLIKELY(dst & SLJIT_MEM))\n\t\treturn emit_op_mem(compiler, flags | STORE, dst_r, dst, dstw, TMP_REG2);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_reg, flags, src2_reg;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\tdst_reg = SLOW_IS_REG(dst) ? dst : TMP_REG1;\n\tflags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\n\tif (src1 & SLJIT_IMM)\n\t\tflags |= ARG1_IMM;\n\telse if (src1 & SLJIT_MEM) {\n\t\temit_op_mem(compiler, WORD_SIZE, TMP_REG1, src1, src1w, TMP_REG1);\n\t\tsrc1w = TMP_REG1;\n\t}\n\telse\n\t\tsrc1w = src1;\n\n\tif (src2 & SLJIT_IMM)\n\t\tflags |= ARG2_IMM;\n\telse if (src2 & SLJIT_MEM) {\n\t\tsrc2_reg = (!(flags & ARG1_IMM) && (src1w == TMP_REG1)) ? TMP_REG2 : TMP_REG1;\n\t\temit_op_mem(compiler, WORD_SIZE, src2_reg, src2, src2w, src2_reg);\n\t\tsrc2w = src2_reg;\n\t}\n\telse\n\t\tsrc2w = src2;\n\n\tif (dst == SLJIT_UNUSED)\n\t\tflags |= UNUSED_RETURN;\n\n\temit_op_imm(compiler, flags | GET_OPCODE(op), dst_reg, src1w, src2w);\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\treturn emit_op_mem(compiler, WORD_SIZE | STORE, dst_reg, dst, dstw, TMP_REG2);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn (freg_map[reg] << 1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\tif (size == 2)\n\t\treturn push_inst16(compiler, *(sljit_u16*)instruction);\n\treturn push_inst32(compiler, *(sljit_ins*)instruction);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n#define FPU_LOAD (1 << 20)\n\nstatic sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)\n{\n\tsljit_uw imm;\n\tsljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD));\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\t/* Fast loads and stores. */\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\tFAIL_IF(push_inst32(compiler, ADD_W | RD4(TMP_REG1) | RN4(arg & REG_MASK) | RM4(OFFS_REG(arg)) | ((argw & 0x3) << 6)));\n\t\targ = SLJIT_MEM | TMP_REG1;\n\t\targw = 0;\n\t}\n\n\tif ((arg & REG_MASK) && (argw & 0x3) == 0) {\n\t\tif (!(argw & ~0x3fc))\n\t\t\treturn push_inst32(compiler, inst | 0x800000 | RN4(arg & REG_MASK) | DD4(reg) | (argw >> 2));\n\t\tif (!(-argw & ~0x3fc))\n\t\t\treturn push_inst32(compiler, inst | RN4(arg & REG_MASK) | DD4(reg) | (-argw >> 2));\n\t}\n\n\tif (arg & REG_MASK) {\n\t\tif (emit_set_delta(compiler, TMP_REG1, arg & REG_MASK, argw) != SLJIT_ERR_UNSUPPORTED) {\n\t\t\tFAIL_IF(compiler->error);\n\t\t\treturn push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg));\n\t\t}\n\t\timm = get_imm(argw & ~0x3fc);\n\t\tif (imm != INVALID_IMM) {\n\t\t\tFAIL_IF(push_inst32(compiler, ADD_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm));\n\t\t\treturn push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg) | ((argw & 0x3fc) >> 2));\n\t\t}\n\t\timm = get_imm(-argw & ~0x3fc);\n\t\tif (imm != INVALID_IMM) {\n\t\t\targw = -argw;\n\t\t\tFAIL_IF(push_inst32(compiler, SUB_WI | RD4(TMP_REG1) | RN4(arg & REG_MASK) | imm));\n\t\t\treturn push_inst32(compiler, inst | RN4(TMP_REG1) | DD4(reg) | ((argw & 0x3fc) >> 2));\n\t\t}\n\t}\n\n\tFAIL_IF(load_immediate(compiler, TMP_REG1, argw));\n\tif (arg & REG_MASK)\n\t\tFAIL_IF(push_inst16(compiler, ADD | SET_REGS44(TMP_REG1, (arg & REG_MASK))));\n\treturn push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG1) | DD4(reg));\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\top ^= SLJIT_F32_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw));\n\t\tsrc = TMP_FREG1;\n\t}\n\n\tFAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_F32_OP) | DD4(TMP_FREG1) | DM4(src)));\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst32(compiler, VMOV | (1 << 20) | RT4(dst) | DN4(TMP_FREG1));\n\n\t/* Store the integer value from a VFP register. */\n\treturn emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\top ^= SLJIT_F32_OP;\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1)));\n\telse if (src & SLJIT_MEM) {\n\t\t/* Load the integer value into a VFP register. */\n\t\tFAIL_IF(emit_fop_mem(compiler, FPU_LOAD, TMP_FREG1, src, srcw));\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tFAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1)));\n\t}\n\n\tFAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(TMP_FREG1)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\top ^= SLJIT_F32_OP;\n\n\tif (src1 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w);\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w);\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tFAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_F32_OP) | DD4(src1) | DM4(src2)));\n\treturn push_inst32(compiler, VMRS);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\n\tSLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32)\n\t\top ^= SLJIT_F32_OP;\n\n\tif (src & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw);\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1)\n\t\t\t\tFAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));\n\t\tbreak;\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\tFAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));\n\t\top ^= SLJIT_F32_OP;\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\top ^= SLJIT_F32_OP;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\tif (src1 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w);\n\t\tsrc1 = TMP_FREG1;\n\t}\n\tif (src2 & SLJIT_MEM) {\n\t\temit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w);\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));\n\t\tbreak;\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));\n\t\tbreak;\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));\n\t\tbreak;\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));\n\t\tbreak;\n\t}\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\treturn emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);\n}\n\n#undef FPU_LOAD\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG2] == 14);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst16(compiler, MOV | SET_REGS44(dst, TMP_REG2));\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, TMP_REG1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG2] == 14);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst16(compiler, MOV | SET_REGS44(TMP_REG2, src)));\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG2, src, srcw, TMP_REG2));\n\n\treturn push_inst16(compiler, BX | RN3(TMP_REG2));\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_uw get_cc(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\tcase SLJIT_EQUAL_F64:\n\t\treturn 0x0;\n\n\tcase SLJIT_NOT_EQUAL:\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\treturn 0x1;\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_LESS_F64:\n\t\treturn 0x3;\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\treturn 0x2;\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_GREATER_F64:\n\t\treturn 0x8;\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn 0x9;\n\n\tcase SLJIT_SIG_LESS:\n\t\treturn 0xb;\n\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn 0xa;\n\n\tcase SLJIT_SIG_GREATER:\n\t\treturn 0xc;\n\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn 0xd;\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn 0x6;\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_ORDERED_F64:\n\t\treturn 0x7;\n\n\tdefault: /* SLJIT_JUMP */\n\t\tSLJIT_UNREACHABLE();\n\t\treturn 0xe;\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\treturn label;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins cc;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tPTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0));\n\tif (type < SLJIT_JUMP) {\n\t\tjump->flags |= IS_COND;\n\t\tcc = get_cc(type);\n\t\tjump->flags |= cc << 8;\n\t\tPTR_FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t}\n\n\tjump->addr = compiler->size;\n\tif (type <= SLJIT_JUMP)\n\t\tPTR_FAIL_IF(push_inst16(compiler, BX | RN3(TMP_REG1)));\n\telse {\n\t\tjump->flags |= IS_BL;\n\t\tPTR_FAIL_IF(push_inst16(compiler, BLX | RN3(TMP_REG1)));\n\t}\n\n\treturn jump;\n}\n\n#ifdef __SOFTFP__\n\nstatic sljit_s32 softfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src)\n{\n\tsljit_s32 stack_offset = 0;\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 word_arg_offset = 0;\n\tsljit_s32 float_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_s32 src_offset = 4 * sizeof(sljit_sw);\n\tsljit_u8 offsets[4];\n\n\tif (src && FAST_IS_REG(*src))\n\t\tsrc_offset = reg_map[*src] * sizeof(sljit_sw);\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_f32);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_offset & 0x7)\n\t\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_f64);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\targ_count++;\n\t\t\tword_arg_offset += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (stack_offset > 16)\n\t\tFAIL_IF(push_inst16(compiler, SUB_SP | (((stack_offset - 16) + 0x7) & ~0x7) >> 2));\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] == 12);\n\n\t/* Process arguments in reversed direction. */\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tif (stack_offset < 16) {\n\t\t\t\tif (src_offset == stack_offset) {\n\t\t\t\t\tFAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7)));\n\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t}\n\t\t\t\tFAIL_IF(push_inst32(compiler, VMOV | 0x100000 | (float_arg_count << 16) | (stack_offset << 10)));\n\t\t\t} else\n\t\t\t\tFAIL_IF(push_inst32(compiler, VSTR_F32 | 0x800000 | RN4(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2)));\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tSLJIT_ASSERT((stack_offset & 0x7) == 0);\n\n\t\t\tif (stack_offset < 16) {\n\t\t\t\tif (src_offset == stack_offset || src_offset == stack_offset + sizeof(sljit_sw)) {\n\t\t\t\t\tFAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7)));\n\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t}\n\t\t\t\tFAIL_IF(push_inst32(compiler, VMOV2 | 0x100000 | (stack_offset << 10) | ((stack_offset + sizeof(sljit_sw)) << 14) | float_arg_count));\n\t\t\t} else\n\t\t\t\tFAIL_IF(push_inst32(compiler, VSTR_F32 | 0x800100 | RN4(SLJIT_SP) | (float_arg_count << 12) | ((stack_offset - 16) >> 2)));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count--;\n\t\t\tword_arg_offset -= sizeof(sljit_sw);\n\t\t\tstack_offset = offsets[arg_count];\n\n\t\t\tSLJIT_ASSERT(stack_offset >= word_arg_offset);\n\n\t\t\tif (stack_offset != word_arg_offset) {\n\t\t\t\tif (stack_offset < 16) {\n\t\t\t\t\tif (src_offset == stack_offset) {\n\t\t\t\t\t\tFAIL_IF(push_inst16(compiler, MOV | (src_offset << 1) | 4 | (1 << 7)));\n\t\t\t\t\t\t*src = TMP_REG1;\n\t\t\t\t\t}\n\t\t\t\t\telse if (src_offset == word_arg_offset) {\n\t\t\t\t\t\t*src = 1 + (stack_offset >> 2);\n\t\t\t\t\t\tsrc_offset = stack_offset;\n\t\t\t\t\t}\n\t\t\t\t\tFAIL_IF(push_inst16(compiler, MOV | (stack_offset >> 2) | (word_arg_offset << 1)));\n\t\t\t\t} else\n\t\t\t\t\tFAIL_IF(push_inst16(compiler, STR_SP | (word_arg_offset << 6) | ((stack_offset - 16) >> 2)));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 softfloat_post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)\n{\n\tsljit_s32 stack_size = 0;\n\n\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32)\n\t\tFAIL_IF(push_inst32(compiler, VMOV | (0 << 16) | (0 << 12)));\n\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64)\n\t\tFAIL_IF(push_inst32(compiler, VMOV2 | (1 << 16) | (0 << 12) | 0));\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_size & 0x7)\n\t\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (stack_size <= 16)\n\t\treturn SLJIT_SUCCESS;\n\n\treturn push_inst16(compiler, ADD_SP | ((((stack_size - 16) + 0x7) & ~0x7) >> 2));\n}\n\n#else\n\nstatic sljit_s32 hardfloat_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)\n{\n\tsljit_u32 remap = 0;\n\tsljit_u32 offset = 0;\n\tsljit_u32 new_offset, mask;\n\n\t/* Remove return value. */\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tif ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32) {\n\t\t\tnew_offset = 0;\n\t\t\tmask = 1;\n\n\t\t\twhile (remap & mask) {\n\t\t\t\tnew_offset++;\n\t\t\t\tmask <<= 1;\n\t\t\t}\n\t\t\tremap |= mask;\n\n\t\t\tif (offset != new_offset)\n\t\t\t\tFAIL_IF(push_inst32(compiler, VMOV_F32 | DD4((new_offset >> 1) + 1)\n\t\t\t\t\t| ((new_offset & 0x1) ? 0x400000 : 0) | DM4((offset >> 1) + 1)));\n\n\t\t\toffset += 2;\n\t\t}\n\t\telse if ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F64) {\n\t\t\tnew_offset = 0;\n\t\t\tmask = 3;\n\n\t\t\twhile (remap & mask) {\n\t\t\t\tnew_offset += 2;\n\t\t\t\tmask <<= 2;\n\t\t\t}\n\t\t\tremap |= mask;\n\n\t\t\tif (offset != new_offset)\n\t\t\t\tFAIL_IF(push_inst32(compiler, VMOV_F32 | SLJIT_F32_OP | DD4((new_offset >> 1) + 1) | DM4((offset >> 1) + 1)));\n\n\t\t\toffset += 2;\n\t\t}\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n#ifdef __SOFTFP__\n\tstruct sljit_jump *jump;\n#endif\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n#ifdef __SOFTFP__\n\tPTR_FAIL_IF(softfloat_call_with_args(compiler, arg_types, NULL));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\tjump = sljit_emit_jump(compiler, type);\n\tPTR_FAIL_IF(jump == NULL);\n\n\tPTR_FAIL_IF(softfloat_post_call_with_args(compiler, arg_types));\n\treturn jump;\n#else\n\tPTR_FAIL_IF(hardfloat_call_with_args(compiler, arg_types));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] != 14);\n\n\tif (!(src & SLJIT_IMM)) {\n\t\tif (FAST_IS_REG(src)) {\n\t\t\tSLJIT_ASSERT(reg_map[src] != 14);\n\t\t\treturn push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(src));\n\t\t}\n\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, src, srcw, TMP_REG1));\n\t\tif (type >= SLJIT_FAST_CALL)\n\t\t\treturn push_inst16(compiler, BLX | RN3(TMP_REG1));\n\t}\n\n\t/* These jumps are converted to jump/call instructions when possible. */\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tFAIL_IF(!jump);\n\tset_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_BL : 0));\n\tjump->u.target = srcw;\n\n\tFAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0));\n\tjump->addr = compiler->size;\n\treturn push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(TMP_REG1));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n#ifdef __SOFTFP__\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tFAIL_IF(softfloat_call_with_args(compiler, arg_types, &src));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\tFAIL_IF(sljit_emit_ijump(compiler, type, src, srcw));\n\n\treturn softfloat_post_call_with_args(compiler, arg_types);\n#else /* !__SOFTFP__ */\n\tFAIL_IF(hardfloat_call_with_args(compiler, arg_types));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n#endif /* __SOFTFP__ */\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 dst_r, flags = GET_ALL_FLAGS(op);\n\tsljit_ins cc;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\top = GET_OPCODE(op);\n\tcc = get_cc(type & 0xff);\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (op < SLJIT_ADD) {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | (((cc & 0x1) ^ 0x1) << 3) | 0x4));\n\t\tif (reg_map[dst_r] > 7) {\n\t\t\tFAIL_IF(push_inst32(compiler, MOV_WI | RD4(dst_r) | 1));\n\t\t\tFAIL_IF(push_inst32(compiler, MOV_WI | RD4(dst_r) | 0));\n\t\t} else {\n\t\t\t/* The movsi (immediate) instruction does not set flags in IT block. */\n\t\t\tFAIL_IF(push_inst16(compiler, MOVSI | RDN3(dst_r) | 1));\n\t\t\tFAIL_IF(push_inst16(compiler, MOVSI | RDN3(dst_r) | 0));\n\t\t}\n\t\tif (!(dst & SLJIT_MEM))\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG1, dst, dstw, TMP_REG2);\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE, TMP_REG1, dst, dstw, TMP_REG2));\n\n\tif (op == SLJIT_AND) {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | (((cc & 0x1) ^ 0x1) << 3) | 0x4));\n\t\tFAIL_IF(push_inst32(compiler, ANDI | RN4(dst_r) | RD4(dst_r) | 1));\n\t\tFAIL_IF(push_inst32(compiler, ANDI | RN4(dst_r) | RD4(dst_r) | 0));\n\t}\n\telse {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t\tFAIL_IF(push_inst32(compiler, ((op == SLJIT_OR) ? ORRI : EORI) | RN4(dst_r) | RD4(dst_r) | 1));\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, TMP_REG1, dst, dstw, TMP_REG2));\n\n\tif (!(flags & SLJIT_SET_Z))\n\t\treturn SLJIT_SUCCESS;\n\n\t/* The condition must always be set, even if the ORR/EORI is not executed above. */\n\treturn push_inst32(compiler, MOV_W | SET_FLAGS | RD4(TMP_REG1) | RM4(dst_r));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_uw cc, tmp;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n\tdst_reg &= ~SLJIT_I32_OP;\n\n\tcc = get_cc(type & 0xff);\n\n\tif (!(src & SLJIT_IMM)) {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t\treturn push_inst16(compiler, MOV | SET_REGS44(dst_reg, src));\n\t}\n\n\ttmp = (sljit_uw) srcw;\n\n\tif (tmp < 0x10000) {\n\t\t/* set low 16 bits, set hi 16 bits to 0. */\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t\treturn push_inst32(compiler, MOVW | RD4(dst_reg)\n\t\t\t| COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff));\n\t}\n\n\ttmp = get_imm(srcw);\n\tif (tmp != INVALID_IMM) {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t\treturn push_inst32(compiler, MOV_WI | RD4(dst_reg) | tmp);\n\t}\n\n\ttmp = get_imm(~srcw);\n\tif (tmp != INVALID_IMM) {\n\t\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));\n\t\treturn push_inst32(compiler, MVN_WI | RD4(dst_reg) | tmp);\n\t}\n\n\tFAIL_IF(push_inst16(compiler, IT | (cc << 4) | ((cc & 0x1) << 3) | 0x4));\n\n\ttmp = (sljit_uw) srcw;\n\tFAIL_IF(push_inst32(compiler, MOVW | RD4(dst_reg)\n\t\t| COPY_BITS(tmp, 12, 16, 4) | COPY_BITS(tmp, 11, 26, 1) | COPY_BITS(tmp, 8, 12, 3) | (tmp & 0xff)));\n\treturn push_inst32(compiler, MOVT | RD4(dst_reg)\n\t\t| COPY_BITS(tmp, 12 + 16, 16, 4) | COPY_BITS(tmp, 11 + 16, 26, 1) | COPY_BITS(tmp, 8 + 16, 12, 3) | ((tmp & 0xff0000) >> 16));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_s32 flags;\n\tsljit_ins inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));\n\n\tif ((mem & OFFS_REG_MASK) || (memw > 255 && memw < -255))\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tif (type & SLJIT_MEM_SUPP)\n\t\treturn SLJIT_SUCCESS;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tflags = WORD_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_U8:\n\t\tflags = BYTE_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_S8:\n\t\tflags = BYTE_SIZE | SIGNED;\n\t\tbreak;\n\tcase SLJIT_MOV_U16:\n\t\tflags = HALF_SIZE;\n\t\tbreak;\n\tcase SLJIT_MOV_S16:\n\t\tflags = HALF_SIZE | SIGNED;\n\t\tbreak;\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tflags = WORD_SIZE;\n\t\tbreak;\n\t}\n\n\tif (type & SLJIT_MEM_STORE)\n\t\tflags |= STORE;\n\n\tinst = sljit_mem32[flags] | 0x900;\n\n\tif (type & SLJIT_MEM_PRE)\n\t\tinst |= 0x400;\n\n\tif (memw >= 0)\n\t\tinst |= 0x200;\n\telse\n\t\tmemw = -memw;\n\n\treturn push_inst32(compiler, inst | RT4(reg) | RN4(mem & REG_MASK) | memw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\tPTR_FAIL_IF(emit_imm32_const(compiler, dst_r, init_value));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op_mem(compiler, WORD_SIZE | STORE, dst_r, dst, dstw, TMP_REG2));\n\treturn const_;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_u16 *inst = (sljit_u16*)addr;\n\tmodify_imm32_const(inst, new_target);\n\tinst = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 4);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_u16 *inst = (sljit_u16*)addr;\n\tmodify_imm32_const(inst, new_constant);\n\tinst = (sljit_u16 *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 4);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeMIPS_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* mips 32-bit arch dependent functions. */\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)\n{\n\tif (!(imm & ~0xffff))\n\t\treturn push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);\n\n\tif (imm < 0 && imm >= SIMM_MIN)\n\t\treturn push_inst(compiler, ADDIU | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);\n\n\tFAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(imm >> 16), dst_ar));\n\treturn (imm & 0xffff) ? push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar) : SLJIT_SUCCESS;\n}\n\n#define EMIT_LOGICAL(op_imm, op_norm) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | S(src1) | T(dst) | IMM(src2), DR(dst))); \\\n\t} \\\n\telse { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | D(dst), DR(dst))); \\\n\t}\n\n#define EMIT_SHIFT(op_imm, op_v) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \\\n\t} \\\n\telse { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | D(dst), DR(dst))); \\\n\t}\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_sw src2)\n{\n\tsljit_s32 is_overflow, is_carry, is_handled;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (dst != src2)\n\t\t\treturn push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S8) {\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\t\t\treturn push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));\n#else\n\t\t\t\tFAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));\n\t\t\t\treturn push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));\n#endif\n\t\t\t}\n\t\t\treturn push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S16) {\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\t\t\treturn push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));\n#else\n\t\t\t\tFAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));\n\t\t\t\treturn push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));\n#endif\n\t\t\t}\n\t\t\treturn push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tif (!(flags & UNUSED_DEST))\n\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tif (!(flags & UNUSED_DEST))\n\t\t\tFAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst)));\n#else\n\t\tif (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {\n\t\t\tFAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));\n\t\t\treturn push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);\n\t\t}\n\t\t/* Nearly all instructions are unmovable in the following sequence. */\n\t\tFAIL_IF(push_inst(compiler, ADDU | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));\n\t\t/* Check zero. */\n\t\tFAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(32), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(dst) | IMM(-1), DR(dst)));\n\t\t/* Loop for searching the highest bit. */\n\t\tFAIL_IF(push_inst(compiler, ADDIU | S(dst) | T(dst) | IMM(1), DR(dst)));\n\t\tFAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));\n#endif\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ADD:\n\t\tis_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_overflow) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t}\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_overflow)\n\t\t\t\tFAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\t/* a + b >= a | b (otherwise, the carry should be set to 1). */\n\t\tif (is_overflow || is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (!is_overflow)\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SLL | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\treturn push_inst(compiler, SRL | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG);\n\n\tcase SLJIT_ADDC:\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_carry) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\t}\n\t\t\t}\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst)));\n\t\t} else {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\t\tif (is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\tFAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));\n\t\tif (!is_carry)\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\t/* Set ULESS_FLAG (dst == 0) && (OTHER_FLAG == 1). */\n\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t/* Set carry flag. */\n\t\treturn push_inst(compiler, OR | SA(OTHER_FLAG) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);\n\n\tcase SLJIT_SUB:\n\t\tif ((flags & SRC2_IMM) && src2 == SIMM_MIN) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tis_handled = 0;\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\tis_handled = 1;\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\tis_handled = 1;\n\t\t\t}\n\t\t}\n\n\t\tif (!is_handled && GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) {\n\t\t\tis_handled = 1;\n\n\t\t\tif (flags & SRC2_IMM) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\t\tsrc2 = TMP_REG2;\n\t\t\t\tflags &= ~SRC2_IMM;\n\t\t\t}\n\n\t\t\tif (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_GREATER || GET_FLAG_TYPE(op) == SLJIT_LESS_EQUAL)\n\t\t\t{\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER || GET_FLAG_TYPE(op) == SLJIT_SIG_LESS_EQUAL)\n\t\t\t{\n\t\t\t\tFAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t}\n\n\t\tif (is_handled) {\n\t\t\tif (flags & SRC2_IMM) {\n\t\t\t\tif (op & SLJIT_SET_Z)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG));\n\t\t\t\tif (!(flags & UNUSED_DEST))\n\t\t\t\t\treturn push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (op & SLJIT_SET_Z)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\tif (!(flags & UNUSED_DEST))\n\t\t\t\t\treturn push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst));\n\t\t\t}\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tis_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_overflow) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t}\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_overflow)\n\t\t\t\tFAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\tif (!is_overflow)\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SLL | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\treturn push_inst(compiler, SRL | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG);\n\n\tcase SLJIT_SUBC:\n\t\tif ((flags & SRC2_IMM) && src2 == SIMM_MIN) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\tif (is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1)));\n\n\t\tFAIL_IF(push_inst(compiler, SUBU | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));\n\t\treturn (is_carry) ? push_inst(compiler, OR | SA(EQUAL_FLAG) | T(TMP_REG1) | DA(OTHER_FLAG), OTHER_FLAG) : SLJIT_SUCCESS;\n\n\tcase SLJIT_MUL:\n\t\tSLJIT_ASSERT(!(flags & SRC2_IMM));\n\n\t\tif (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\t\treturn push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));\n#else\n\t\t\tFAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));\n\t\t\treturn push_inst(compiler, MFLO | D(dst), DR(dst));\n#endif\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst)));\n\t\tFAIL_IF(push_inst(compiler, SRA | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG));\n\t\treturn push_inst(compiler, SUBU | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);\n\n\tcase SLJIT_AND:\n\t\tEMIT_LOGICAL(ANDI, AND);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_OR:\n\t\tEMIT_LOGICAL(ORI, OR);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_XOR:\n\t\tEMIT_LOGICAL(XORI, XOR);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_SHL:\n\t\tEMIT_SHIFT(SLL, SLLV);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_LSHR:\n\t\tEMIT_SHIFT(SRL, SRLV);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ASHR:\n\t\tEMIT_SHIFT(SRA, SRAV);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)\n{\n\tFAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst)));\n\treturn push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_ins *ins_ptr)\n{\n\tsljit_s32 stack_offset = 0;\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 float_arg_count = 0;\n\tsljit_s32 word_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_s32 arg_count_save, types_save;\n\tsljit_ins prev_ins = NOP;\n\tsljit_ins ins = NOP;\n\tsljit_u8 offsets[4];\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12);\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\n\t\t\tif (word_arg_count == 0 && arg_count <= 1)\n\t\t\t\toffsets[arg_count] = 254 + arg_count;\n\n\t\t\tstack_offset += sizeof(sljit_f32);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_offset & 0x7)\n\t\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\n\t\t\tif (word_arg_count == 0 && arg_count <= 1)\n\t\t\t\toffsets[arg_count] = 254 + arg_count;\n\n\t\t\tstack_offset += sizeof(sljit_f64);\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\toffsets[arg_count] = (sljit_u8)stack_offset;\n\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\targ_count++;\n\t\t\tword_arg_count++;\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\t/* Stack is aligned to 16 bytes, max two doubles can be placed on the stack. */\n\tif (stack_offset > 16)\n\t\tFAIL_IF(push_inst(compiler, ADDIU | S(SLJIT_SP) | T(SLJIT_SP) | IMM(-16), DR(SLJIT_SP)));\n\n\ttypes_save = types;\n\targ_count_save = arg_count;\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\targ_count--;\n\t\t\tif (offsets[arg_count] < 254)\n\t\t\t\tins = SWC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(offsets[arg_count]);\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count--;\n\t\t\tif (offsets[arg_count] < 254)\n\t\t\t\tins = SDC1 | S(SLJIT_SP) | FT(float_arg_count) | IMM(offsets[arg_count]);\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (offsets[arg_count - 1] >= 16)\n\t\t\t\tins = SW | S(SLJIT_SP) | T(word_arg_count) | IMM(offsets[arg_count - 1]);\n\t\t\telse if (arg_count != word_arg_count)\n\t\t\t\tins = ADDU | S(word_arg_count) | TA(0) | DA(4 + (offsets[arg_count - 1] >> 2));\n\t\t\telse if (arg_count == 1)\n\t\t\t\tins = ADDU | S(SLJIT_R0) | TA(0) | DA(4);\n\n\t\t\targ_count--;\n\t\t\tword_arg_count--;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (ins != NOP) {\n\t\t\tif (prev_ins != NOP)\n\t\t\t\tFAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS));\n\t\t\tprev_ins = ins;\n\t\t\tins = NOP;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\ttypes = types_save;\n\targ_count = arg_count_save;\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\targ_count--;\n\t\t\tif (offsets[arg_count] == 254)\n\t\t\t\tins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1);\n\t\t\telse if (offsets[arg_count] < 16)\n\t\t\t\tins = LW | S(SLJIT_SP) | TA(4 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count]);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count--;\n\t\t\tif (offsets[arg_count] == 254)\n\t\t\t\tins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1);\n\t\t\telse if (offsets[arg_count] < 16) {\n\t\t\t\tif (prev_ins != NOP)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS));\n\t\t\t\tprev_ins = LW | S(SLJIT_SP) | TA(4 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count]);\n\t\t\t\tins = LW | S(SLJIT_SP) | TA(5 + (offsets[arg_count] >> 2)) | IMM(offsets[arg_count] + sizeof(sljit_sw));\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count--;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (ins != NOP) {\n\t\t\tif (prev_ins != NOP)\n\t\t\t\tFAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS));\n\t\t\tprev_ins = ins;\n\t\t\tins = NOP;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\t*ins_ptr = prev_ins;\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 post_call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types)\n{\n\tsljit_s32 stack_offset = 0;\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tstack_offset += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (stack_offset & 0x7)\n\t\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\tstack_offset += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstack_offset += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\t/* Stack is aligned to 16 bytes, max two doubles can be placed on the stack. */\n\tif (stack_offset > 16)\n\t\treturn push_inst(compiler, ADDIU | S(SLJIT_SP) | T(SLJIT_SP) | IMM(16), DR(SLJIT_SP));\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins ins;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tPTR_FAIL_IF(call_with_args(compiler, arg_types, &ins));\n\n\tSLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);\n\n\tPTR_FAIL_IF(emit_const(compiler, PIC_ADDR_REG, 0));\n\n\tjump->flags |= IS_JAL | IS_CALL;\n\tPTR_FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS));\n\n\tPTR_FAIL_IF(post_call_with_args(compiler, arg_types));\n\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_ins ins;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n\tSLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);\n\n\tif (src & SLJIT_IMM)\n\t\tFAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw));\n\telse if (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, ADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG)));\n\telse if (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(PIC_ADDR_REG), src, srcw));\n\t}\n\n\tFAIL_IF(call_with_args(compiler, arg_types, &ins));\n\n\t/* Register input. */\n\tFAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\tFAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS));\n\treturn post_call_with_args(compiler, arg_types);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeMIPS_64.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* mips 64-bit arch dependent functions. */\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)\n{\n\tsljit_s32 shift = 32;\n\tsljit_s32 shift2;\n\tsljit_s32 inv = 0;\n\tsljit_ins ins;\n\tsljit_uw uimm;\n\n\tif (!(imm & ~0xffff))\n\t\treturn push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);\n\n\tif (imm < 0 && imm >= SIMM_MIN)\n\t\treturn push_inst(compiler, ADDIU | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);\n\n\tif (imm <= 0x7fffffffl && imm >= -0x80000000l) {\n\t\tFAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(imm >> 16), dst_ar));\n\t\treturn (imm & 0xffff) ? push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar) : SLJIT_SUCCESS;\n\t}\n\n\t/* Zero extended number. */\n\tuimm = imm;\n\tif (imm < 0) {\n\t\tuimm = ~imm;\n\t\tinv = 1;\n\t}\n\n\twhile (!(uimm & 0xff00000000000000l)) {\n\t\tshift -= 8;\n\t\tuimm <<= 8;\n\t}\n\n\tif (!(uimm & 0xf000000000000000l)) {\n\t\tshift -= 4;\n\t\tuimm <<= 4;\n\t}\n\n\tif (!(uimm & 0xc000000000000000l)) {\n\t\tshift -= 2;\n\t\tuimm <<= 2;\n\t}\n\n\tif ((sljit_sw)uimm < 0) {\n\t\tuimm >>= 1;\n\t\tshift += 1;\n\t}\n\tSLJIT_ASSERT(((uimm & 0xc000000000000000l) == 0x4000000000000000l) && (shift > 0) && (shift <= 32));\n\n\tif (inv)\n\t\tuimm = ~uimm;\n\n\tFAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(uimm >> 48), dst_ar));\n\tif (uimm & 0x0000ffff00000000l)\n\t\tFAIL_IF(push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(uimm >> 32), dst_ar));\n\n\timm &= (1l << shift) - 1;\n\tif (!(imm & ~0xffff)) {\n\t\tins = (shift == 32) ? DSLL32 : DSLL;\n\t\tif (shift < 32)\n\t\t\tins |= SH_IMM(shift);\n\t\tFAIL_IF(push_inst(compiler, ins | TA(dst_ar) | DA(dst_ar), dst_ar));\n\t\treturn !(imm & 0xffff) ? SLJIT_SUCCESS : push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar);\n\t}\n\n\t/* Double shifts needs to be performed. */\n\tuimm <<= 32;\n\tshift2 = shift - 16;\n\n\twhile (!(uimm & 0xf000000000000000l)) {\n\t\tshift2 -= 4;\n\t\tuimm <<= 4;\n\t}\n\n\tif (!(uimm & 0xc000000000000000l)) {\n\t\tshift2 -= 2;\n\t\tuimm <<= 2;\n\t}\n\n\tif (!(uimm & 0x8000000000000000l)) {\n\t\tshift2--;\n\t\tuimm <<= 1;\n\t}\n\n\tSLJIT_ASSERT((uimm & 0x8000000000000000l) && (shift2 > 0) && (shift2 <= 16));\n\n\tFAIL_IF(push_inst(compiler, DSLL | TA(dst_ar) | DA(dst_ar) | SH_IMM(shift - shift2), dst_ar));\n\tFAIL_IF(push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(uimm >> 48), dst_ar));\n\tFAIL_IF(push_inst(compiler, DSLL | TA(dst_ar) | DA(dst_ar) | SH_IMM(shift2), dst_ar));\n\n\timm &= (1l << shift2) - 1;\n\treturn !(imm & 0xffff) ? SLJIT_SUCCESS : push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar);\n}\n\n#define SELECT_OP(a, b) \\\n\t(!(op & SLJIT_I32_OP) ? a : b)\n\n#define EMIT_LOGICAL(op_imm, op_norm) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_imm | S(src1) | T(dst) | IMM(src2), DR(dst))); \\\n\t} \\\n\telse { \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | D(dst), DR(dst))); \\\n\t}\n\n#define EMIT_SHIFT(op_dimm, op_dimm32, op_imm, op_dv, op_v) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tif (src2 >= 32) { \\\n\t\t\tSLJIT_ASSERT(!(op & SLJIT_I32_OP)); \\\n\t\t\tins = op_dimm32; \\\n\t\t\tsrc2 -= 32; \\\n\t\t} \\\n\t\telse \\\n\t\t\tins = (op & SLJIT_I32_OP) ? op_imm : op_dimm; \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, ins | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, ins | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \\\n\t} \\\n\telse { \\\n\t\tins = (op & SLJIT_I32_OP) ? op_v : op_dv; \\\n\t\tif (op & SLJIT_SET_Z) \\\n\t\t\tFAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \\\n\t\tif (!(flags & UNUSED_DEST)) \\\n\t\t\tFAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | D(dst), DR(dst))); \\\n\t}\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_sw src2)\n{\n\tsljit_ins ins;\n\tsljit_s32 is_overflow, is_carry, is_handled;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (dst != src2)\n\t\t\treturn push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(dst), DR(dst));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S8) {\n\t\t\t\tFAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst)));\n\t\t\t\treturn push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst));\n\t\t\t}\n\t\t\treturn push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S16) {\n\t\t\t\tFAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst)));\n\t\t\t\treturn push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst));\n\t\t\t}\n\t\t\treturn push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U32:\n\t\tSLJIT_ASSERT(!(op & SLJIT_I32_OP));\n\t\tFAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst)));\n\t\treturn push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst));\n\n\tcase SLJIT_MOV_S32:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\treturn push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(0), DR(dst));\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tif (!(flags & UNUSED_DEST))\n\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tif (!(flags & UNUSED_DEST))\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DCLZ, CLZ) | S(src2) | T(dst) | D(dst), DR(dst)));\n#else\n\t\tif (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSRL32, SRL) | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));\n\t\t\treturn push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);\n\t\t}\n\t\t/* Nearly all instructions are unmovable in the following sequence. */\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));\n\t\t/* Check zero. */\n\t\tFAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM((op & SLJIT_I32_OP) ? 32 : 64), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(dst) | IMM(-1), DR(dst)));\n\t\t/* Loop for searching the highest bit. */\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(dst) | T(dst) | IMM(1), DR(dst)));\n\t\tFAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSLL, SLL) | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));\n#endif\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ADD:\n\t\tis_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_overflow) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t}\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_overflow)\n\t\t\t\tFAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\t/* a + b >= a | b (otherwise, the carry should be set to 1). */\n\t\tif (is_overflow || is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (!is_overflow)\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\treturn push_inst(compiler, SELECT_OP(DSRL32, SRL) | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG);\n\n\tcase SLJIT_ADDC:\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_carry) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\t}\n\t\t\t}\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(src2), DR(dst)));\n\t\t} else {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\t\tif (is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));\n\t\tif (!is_carry)\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\t/* Set ULESS_FLAG (dst == 0) && (OTHER_FLAG == 1). */\n\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t/* Set carry flag. */\n\t\treturn push_inst(compiler, OR | SA(OTHER_FLAG) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);\n\n\tcase SLJIT_SUB:\n\t\tif ((flags & SRC2_IMM) && src2 == SIMM_MIN) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tis_handled = 0;\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\tis_handled = 1;\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTI | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t\tis_handled = 1;\n\t\t\t}\n\t\t}\n\n\t\tif (!is_handled && GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) {\n\t\t\tis_handled = 1;\n\n\t\t\tif (flags & SRC2_IMM) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\t\tsrc2 = TMP_REG2;\n\t\t\t\tflags &= ~SRC2_IMM;\n\t\t\t}\n\n\t\t\tif (GET_FLAG_TYPE(op) == SLJIT_LESS || GET_FLAG_TYPE(op) == SLJIT_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_GREATER || GET_FLAG_TYPE(op) == SLJIT_LESS_EQUAL)\n\t\t\t{\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_LESS || GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER_EQUAL) {\n\t\t\t\tFAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t\telse if (GET_FLAG_TYPE(op) == SLJIT_SIG_GREATER || GET_FLAG_TYPE(op) == SLJIT_SIG_LESS_EQUAL)\n\t\t\t{\n\t\t\t\tFAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t}\n\t\t}\n\n\t\tif (is_handled) {\n\t\t\tif (flags & SRC2_IMM) {\n\t\t\t\tif (op & SLJIT_SET_Z)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG));\n\t\t\t\tif (!(flags & UNUSED_DEST))\n\t\t\t\t\treturn push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (op & SLJIT_SET_Z)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\tif (!(flags & UNUSED_DEST))\n\t\t\t\t\treturn push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst));\n\t\t\t}\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tis_overflow = GET_FLAG_TYPE(op) == SLJIT_OVERFLOW;\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_overflow) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(push_inst(compiler, NOR | S(src1) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t}\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(OTHER_FLAG) | IMM(src2), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_overflow)\n\t\t\t\tFAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\telse if (op & SLJIT_SET_Z)\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\n\t\t\tif (is_overflow || is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (!(flags & UNUSED_DEST) || (op & VARIABLE_FLAG_MASK))\n\t\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\tif (!is_overflow)\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSLL32, SLL) | TA(OTHER_FLAG) | D(TMP_REG1) | SH_IMM(31), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(TMP_REG1) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, XOR | S(dst) | TA(EQUAL_FLAG) | DA(OTHER_FLAG), OTHER_FLAG));\n\t\tif (op & SLJIT_SET_Z)\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\treturn push_inst(compiler, SELECT_OP(DSRL32, SRL) | TA(OTHER_FLAG) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG);\n\n\tcase SLJIT_SUBC:\n\t\tif ((flags & SRC2_IMM) && src2 == SIMM_MIN) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tis_carry = GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY);\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(src1) | T(dst) | IMM(-src2), DR(dst)));\n\t\t}\n\t\telse {\n\t\t\tif (is_carry)\n\t\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(src1) | T(src2) | D(dst), DR(dst)));\n\t\t}\n\n\t\tif (is_carry)\n\t\t\tFAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(OTHER_FLAG) | D(TMP_REG1), DR(TMP_REG1)));\n\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSUBU, SUBU) | S(dst) | TA(OTHER_FLAG) | D(dst), DR(dst)));\n\t\treturn (is_carry) ? push_inst(compiler, OR | SA(EQUAL_FLAG) | T(TMP_REG1) | DA(OTHER_FLAG), OTHER_FLAG) : SLJIT_SUCCESS;\n\n\tcase SLJIT_MUL:\n\t\tSLJIT_ASSERT(!(flags & SRC2_IMM));\n\n\t\tif (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\t\tif (op & SLJIT_I32_OP)\n\t\t\t\treturn push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));\n\t\t\tFAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS));\n\t\t\treturn push_inst(compiler, MFLO | D(dst), DR(dst));\n#else\n\t\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS));\n\t\t\treturn push_inst(compiler, MFLO | D(dst), DR(dst));\n#endif\n\t\t}\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DMULT, MULT) | S(src1) | T(src2), MOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, MFHI | DA(EQUAL_FLAG), EQUAL_FLAG));\n\t\tFAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst)));\n\t\tFAIL_IF(push_inst(compiler, SELECT_OP(DSRA32, SRA) | T(dst) | DA(OTHER_FLAG) | SH_IMM(31), OTHER_FLAG));\n\t\treturn push_inst(compiler, SELECT_OP(DSUBU, SUBU) | SA(EQUAL_FLAG) | TA(OTHER_FLAG) | DA(OTHER_FLAG), OTHER_FLAG);\n\n\tcase SLJIT_AND:\n\t\tEMIT_LOGICAL(ANDI, AND);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_OR:\n\t\tEMIT_LOGICAL(ORI, OR);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_XOR:\n\t\tEMIT_LOGICAL(XORI, XOR);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_SHL:\n\t\tEMIT_SHIFT(DSLL, DSLL32, SLL, DSLLV, SLLV);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_LSHR:\n\t\tEMIT_SHIFT(DSRL, DSRL32, SRL, DSRLV, SRLV);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ASHR:\n\t\tEMIT_SHIFT(DSRA, DSRA32, SRA, DSRAV, SRAV);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)\n{\n\tFAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 48), DR(dst)));\n\tFAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 32), DR(dst)));\n\tFAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(16), DR(dst)));\n\tFAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 16), DR(dst)));\n\tFAIL_IF(push_inst(compiler, DSLL | T(dst) | D(dst) | SH_IMM(16), DR(dst)));\n\treturn push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_target >> 48) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | ((new_target >> 32) & 0xffff);\n\tinst[3] = (inst[3] & 0xffff0000) | ((new_target >> 16) & 0xffff);\n\tinst[5] = (inst[5] & 0xffff0000) | (new_target & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 6);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 48) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | ((new_constant >> 32) & 0xffff);\n\tinst[3] = (inst[3] & 0xffff0000) | ((new_constant >> 16) & 0xffff);\n\tinst[5] = (inst[5] & 0xffff0000) | (new_constant & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 6);\n}\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_ins *ins_ptr)\n{\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 word_arg_count = 0;\n\tsljit_s32 float_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_ins prev_ins = NOP;\n\tsljit_ins ins = NOP;\n\n\tSLJIT_ASSERT(reg_map[TMP_REG1] == 4 && freg_map[TMP_FREG1] == 12);\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count++;\n\t\t\tword_arg_count++;\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tif (arg_count != float_arg_count)\n\t\t\t\tins = MOV_S | FMT_S | FS(float_arg_count) | FD(arg_count);\n\t\t\telse if (arg_count == 1)\n\t\t\t\tins = MOV_S | FMT_S | FS(SLJIT_FR0) | FD(TMP_FREG1);\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (arg_count != float_arg_count)\n\t\t\t\tins = MOV_S | FMT_D | FS(float_arg_count) | FD(arg_count);\n\t\t\telse if (arg_count == 1)\n\t\t\t\tins = MOV_S | FMT_D | FS(SLJIT_FR0) | FD(TMP_FREG1);\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (arg_count != word_arg_count)\n\t\t\t\tins = DADDU | S(word_arg_count) | TA(0) | D(arg_count);\n\t\t\telse if (arg_count == 1)\n\t\t\t\tins = DADDU | S(SLJIT_R0) | TA(0) | DA(4);\n\t\t\targ_count--;\n\t\t\tword_arg_count--;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (ins != NOP) {\n\t\t\tif (prev_ins != NOP)\n\t\t\t\tFAIL_IF(push_inst(compiler, prev_ins, MOVABLE_INS));\n\t\t\tprev_ins = ins;\n\t\t\tins = NOP;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\t*ins_ptr = prev_ins;\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins ins;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tPTR_FAIL_IF(call_with_args(compiler, arg_types, &ins));\n\n\tSLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);\n\n\tPTR_FAIL_IF(emit_const(compiler, PIC_ADDR_REG, 0));\n\n\tjump->flags |= IS_JAL | IS_CALL;\n\tPTR_FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, ins, UNMOVABLE_INS));\n\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_ins ins;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n\tSLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);\n\n\tif (src & SLJIT_IMM)\n\t\tFAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw));\n\telse if (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, DADDU | S(src) | TA(0) | D(PIC_ADDR_REG), DR(PIC_ADDR_REG)));\n\telse if (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(PIC_ADDR_REG), src, srcw));\n\t}\n\n\tFAIL_IF(call_with_args(compiler, arg_types, &ins));\n\n\t/* Register input. */\n\tFAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\treturn push_inst(compiler, ins, UNMOVABLE_INS);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeMIPS_common.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Latest MIPS architecture. */\n/* Automatically detect SLJIT_MIPS_R1 */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\treturn \"MIPS32-R1\" SLJIT_CPUINFO;\n#else\n\treturn \"MIPS64-R1\" SLJIT_CPUINFO;\n#endif\n#else /* SLJIT_MIPS_R1 */\n\treturn \"MIPS III\" SLJIT_CPUINFO;\n#endif\n}\n\n/* Length of an instruction word\n   Both for mips-32 and mips-64 */\ntypedef sljit_u32 sljit_ins;\n\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_REG3\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n\n/* For position independent code, t9 must contain the function address. */\n#define PIC_ADDR_REG\tTMP_REG2\n\n/* Floating point status register. */\n#define FCSR_REG\t31\n/* Return address register. */\n#define RETURN_ADDR_REG\t31\n\n/* Flags are kept in volatile registers. */\n#define EQUAL_FLAG\t3\n#define OTHER_FLAG\t1\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {\n\t0, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 4, 25, 31\n};\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 14, 2, 4, 6, 8, 12, 10\n};\n\n#else\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 13, 14, 15, 16, 17, 12, 18\n};\n\n#endif\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n#define S(s)\t\t(reg_map[s] << 21)\n#define T(t)\t\t(reg_map[t] << 16)\n#define D(d)\t\t(reg_map[d] << 11)\n#define FT(t)\t\t(freg_map[t] << 16)\n#define FS(s)\t\t(freg_map[s] << 11)\n#define FD(d)\t\t(freg_map[d] << 6)\n/* Absolute registers. */\n#define SA(s)\t\t((s) << 21)\n#define TA(t)\t\t((t) << 16)\n#define DA(d)\t\t((d) << 11)\n#define IMM(imm)\t((imm) & 0xffff)\n#define SH_IMM(imm)\t((imm) << 6)\n\n#define DR(dr)\t\t(reg_map[dr])\n#define FR(dr)\t\t(freg_map[dr])\n#define HI(opcode)\t((opcode) << 26)\n#define LO(opcode)\t(opcode)\n/* S = (16 << 21) D = (17 << 21) */\n#define FMT_S\t\t(16 << 21)\n#define FMT_D\t\t(17 << 21)\n\n#define ABS_S\t\t(HI(17) | FMT_S | LO(5))\n#define ADD_S\t\t(HI(17) | FMT_S | LO(0))\n#define ADDIU\t\t(HI(9))\n#define ADDU\t\t(HI(0) | LO(33))\n#define AND\t\t(HI(0) | LO(36))\n#define ANDI\t\t(HI(12))\n#define B\t\t(HI(4))\n#define BAL\t\t(HI(1) | (17 << 16))\n#define BC1F\t\t(HI(17) | (8 << 21))\n#define BC1T\t\t(HI(17) | (8 << 21) | (1 << 16))\n#define BEQ\t\t(HI(4))\n#define BGEZ\t\t(HI(1) | (1 << 16))\n#define BGTZ\t\t(HI(7))\n#define BLEZ\t\t(HI(6))\n#define BLTZ\t\t(HI(1) | (0 << 16))\n#define BNE\t\t(HI(5))\n#define BREAK\t\t(HI(0) | LO(13))\n#define CFC1\t\t(HI(17) | (2 << 21))\n#define C_UN_S\t\t(HI(17) | FMT_S | LO(49))\n#define C_UEQ_S\t\t(HI(17) | FMT_S | LO(51))\n#define C_ULE_S\t\t(HI(17) | FMT_S | LO(55))\n#define C_ULT_S\t\t(HI(17) | FMT_S | LO(53))\n#define CVT_S_S\t\t(HI(17) | FMT_S | LO(32))\n#define DADDIU\t\t(HI(25))\n#define DADDU\t\t(HI(0) | LO(45))\n#define DDIV\t\t(HI(0) | LO(30))\n#define DDIVU\t\t(HI(0) | LO(31))\n#define DIV\t\t(HI(0) | LO(26))\n#define DIVU\t\t(HI(0) | LO(27))\n#define DIV_S\t\t(HI(17) | FMT_S | LO(3))\n#define DMULT\t\t(HI(0) | LO(28))\n#define DMULTU\t\t(HI(0) | LO(29))\n#define DSLL\t\t(HI(0) | LO(56))\n#define DSLL32\t\t(HI(0) | LO(60))\n#define DSLLV\t\t(HI(0) | LO(20))\n#define DSRA\t\t(HI(0) | LO(59))\n#define DSRA32\t\t(HI(0) | LO(63))\n#define DSRAV\t\t(HI(0) | LO(23))\n#define DSRL\t\t(HI(0) | LO(58))\n#define DSRL32\t\t(HI(0) | LO(62))\n#define DSRLV\t\t(HI(0) | LO(22))\n#define DSUBU\t\t(HI(0) | LO(47))\n#define J\t\t(HI(2))\n#define JAL\t\t(HI(3))\n#define JALR\t\t(HI(0) | LO(9))\n#define JR\t\t(HI(0) | LO(8))\n#define LD\t\t(HI(55))\n#define LUI\t\t(HI(15))\n#define LW\t\t(HI(35))\n#define MFC1\t\t(HI(17))\n#define MFHI\t\t(HI(0) | LO(16))\n#define MFLO\t\t(HI(0) | LO(18))\n#define MOV_S\t\t(HI(17) | FMT_S | LO(6))\n#define MTC1\t\t(HI(17) | (4 << 21))\n#define MUL_S\t\t(HI(17) | FMT_S | LO(2))\n#define MULT\t\t(HI(0) | LO(24))\n#define MULTU\t\t(HI(0) | LO(25))\n#define NEG_S\t\t(HI(17) | FMT_S | LO(7))\n#define NOP\t\t(HI(0) | LO(0))\n#define NOR\t\t(HI(0) | LO(39))\n#define OR\t\t(HI(0) | LO(37))\n#define ORI\t\t(HI(13))\n#define SD\t\t(HI(63))\n#define SDC1\t\t(HI(61))\n#define SLT\t\t(HI(0) | LO(42))\n#define SLTI\t\t(HI(10))\n#define SLTIU\t\t(HI(11))\n#define SLTU\t\t(HI(0) | LO(43))\n#define SLL\t\t(HI(0) | LO(0))\n#define SLLV\t\t(HI(0) | LO(4))\n#define SRL\t\t(HI(0) | LO(2))\n#define SRLV\t\t(HI(0) | LO(6))\n#define SRA\t\t(HI(0) | LO(3))\n#define SRAV\t\t(HI(0) | LO(7))\n#define SUB_S\t\t(HI(17) | FMT_S | LO(1))\n#define SUBU\t\t(HI(0) | LO(35))\n#define SW\t\t(HI(43))\n#define SWC1\t\t(HI(57))\n#define TRUNC_W_S\t(HI(17) | FMT_S | LO(13))\n#define XOR\t\t(HI(0) | LO(38))\n#define XORI\t\t(HI(14))\n\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n#define CLZ\t\t(HI(28) | LO(32))\n#define DCLZ\t\t(HI(28) | LO(36))\n#define MOVF\t\t(HI(0) | (0 << 16) | LO(1))\n#define MOVN\t\t(HI(0) | LO(11))\n#define MOVT\t\t(HI(0) | (1 << 16) | LO(1))\n#define MOVZ\t\t(HI(0) | LO(10))\n#define MUL\t\t(HI(28) | LO(2))\n#define PREF\t\t(HI(51))\n#define PREFX\t\t(HI(19) | LO(15))\n#define SEB\t\t(HI(31) | (16 << 6) | LO(32))\n#define SEH\t\t(HI(31) | (24 << 6) | LO(32))\n#endif\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#define ADDU_W\t\tADDU\n#define ADDIU_W\t\tADDIU\n#define SLL_W\t\tSLL\n#define SUBU_W\t\tSUBU\n#else\n#define ADDU_W\t\tDADDU\n#define ADDIU_W\t\tDADDIU\n#define SLL_W\t\tDSLL\n#define SUBU_W\t\tDSUBU\n#endif\n\n#define SIMM_MAX\t(0x7fff)\n#define SIMM_MIN\t(-0x8000)\n#define UIMM_MAX\t(0xffff)\n\n/* dest_reg is the absolute name of the register\n   Useful for reordering instructions in the delay slot. */\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)\n{\n\tSLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS\n\t\t|| delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f));\n\tsljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\tcompiler->delay_slot = delay_slot;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags)\n{\n\treturn (flags & IS_BIT26_COND) ? (1 << 26) : (1 << 16);\n}\n\nstatic SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\tsljit_uw target_addr;\n\tsljit_ins *inst;\n\tsljit_ins saved_inst;\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\tif (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL))\n\t\treturn code_ptr;\n#else\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn code_ptr;\n#endif\n\n\tif (jump->flags & JUMP_ADDR)\n\t\ttarget_addr = jump->u.target;\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\ttarget_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset;\n\t}\n\n\tinst = (sljit_ins *)jump->addr;\n\tif (jump->flags & IS_COND)\n\t\tinst--;\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\tif (jump->flags & IS_CALL)\n\t\tgoto keep_address;\n#endif\n\n\t/* B instructions. */\n\tif (jump->flags & IS_MOVABLE) {\n\t\tdiff = ((sljit_sw)target_addr - (sljit_sw)inst - executable_offset) >> 2;\n\t\tif (diff <= SIMM_MAX && diff >= SIMM_MIN) {\n\t\t\tjump->flags |= PATCH_B;\n\n\t\t\tif (!(jump->flags & IS_COND)) {\n\t\t\t\tinst[0] = inst[-1];\n\t\t\t\tinst[-1] = (jump->flags & IS_JAL) ? BAL : B;\n\t\t\t\tjump->addr -= sizeof(sljit_ins);\n\t\t\t\treturn inst;\n\t\t\t}\n\t\t\tsaved_inst = inst[0];\n\t\t\tinst[0] = inst[-1];\n\t\t\tinst[-1] = saved_inst ^ invert_branch(jump->flags);\n\t\t\tjump->addr -= 2 * sizeof(sljit_ins);\n\t\t\treturn inst;\n\t\t}\n\t}\n\telse {\n\t\tdiff = ((sljit_sw)target_addr - (sljit_sw)(inst + 1) - executable_offset) >> 2;\n\t\tif (diff <= SIMM_MAX && diff >= SIMM_MIN) {\n\t\t\tjump->flags |= PATCH_B;\n\n\t\t\tif (!(jump->flags & IS_COND)) {\n\t\t\t\tinst[0] = (jump->flags & IS_JAL) ? BAL : B;\n\t\t\t\tinst[1] = NOP;\n\t\t\t\treturn inst + 1;\n\t\t\t}\n\t\t\tinst[0] = inst[0] ^ invert_branch(jump->flags);\n\t\t\tinst[1] = NOP;\n\t\t\tjump->addr -= sizeof(sljit_ins);\n\t\t\treturn inst + 1;\n\t\t}\n\t}\n\n\tif (jump->flags & IS_COND) {\n\t\tif ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == ((jump->addr + 2 * sizeof(sljit_ins)) & ~0xfffffff)) {\n\t\t\tjump->flags |= PATCH_J;\n\t\t\tsaved_inst = inst[0];\n\t\t\tinst[0] = inst[-1];\n\t\t\tinst[-1] = (saved_inst & 0xffff0000) | 3;\n\t\t\tinst[1] = J;\n\t\t\tinst[2] = NOP;\n\t\t\treturn inst + 2;\n\t\t}\n\t\telse if ((target_addr & ~0xfffffff) == ((jump->addr + 3 * sizeof(sljit_ins)) & ~0xfffffff)) {\n\t\t\tjump->flags |= PATCH_J;\n\t\t\tinst[0] = (inst[0] & 0xffff0000) | 3;\n\t\t\tinst[1] = NOP;\n\t\t\tinst[2] = J;\n\t\t\tinst[3] = NOP;\n\t\t\tjump->addr += sizeof(sljit_ins);\n\t\t\treturn inst + 3;\n\t\t}\n\t}\n\telse {\n\t\t/* J instuctions. */\n\t\tif ((jump->flags & IS_MOVABLE) && (target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) {\n\t\t\tjump->flags |= PATCH_J;\n\t\t\tinst[0] = inst[-1];\n\t\t\tinst[-1] = (jump->flags & IS_JAL) ? JAL : J;\n\t\t\tjump->addr -= sizeof(sljit_ins);\n\t\t\treturn inst;\n\t\t}\n\n\t\tif ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) {\n\t\t\tjump->flags |= PATCH_J;\n\t\t\tinst[0] = (jump->flags & IS_JAL) ? JAL : J;\n\t\t\tinst[1] = NOP;\n\t\t\treturn inst + 1;\n\t\t}\n\t}\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\nkeep_address:\n\tif (target_addr <= 0x7fffffff) {\n\t\tjump->flags |= PATCH_ABS32;\n\t\tif (jump->flags & IS_COND) {\n\t\t\tinst[0] -= 4;\n\t\t\tinst++;\n\t\t}\n\t\tinst[2] = inst[6];\n\t\tinst[3] = inst[7];\n\t\treturn inst + 3;\n\t}\n\tif (target_addr <= 0x7fffffffffffl) {\n\t\tjump->flags |= PATCH_ABS48;\n\t\tif (jump->flags & IS_COND) {\n\t\t\tinst[0] -= 2;\n\t\t\tinst++;\n\t\t}\n\t\tinst[4] = inst[6];\n\t\tinst[5] = inst[7];\n\t\treturn inst + 5;\n\t}\n#endif\n\n\treturn code_ptr;\n}\n\n#ifdef __GNUC__\nstatic __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_ptr)\n{\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n}\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_ins *code;\n\tsljit_ins *code_ptr;\n\tsljit_ins *buf_ptr;\n\tsljit_ins *buf_end;\n\tsljit_uw word_count;\n\tsljit_sw executable_offset;\n\tsljit_uw addr;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\tcode = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tword_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tdo {\n\t\tbuf_ptr = (sljit_ins*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 2);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tif (label && label->size == word_count) {\n\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\t\t\tif (jump && jump->addr == word_count) {\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 3);\n#else\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 7);\n#endif\n\t\t\t\tcode_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);\n\t\t\t\tjump = jump->next;\n\t\t\t}\n\t\t\tif (const_ && const_->addr == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\t\t\tcode_ptr ++;\n\t\t\tword_count ++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == word_count) {\n\t\tlabel->addr = (sljit_uw)code_ptr;\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tdo {\n\t\t\taddr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n\t\t\tbuf_ptr = (sljit_ins *)jump->addr;\n\n\t\t\tif (jump->flags & PATCH_B) {\n\t\t\t\taddr = (sljit_sw)(addr - ((sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset) + sizeof(sljit_ins))) >> 2;\n\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= SIMM_MAX && (sljit_sw)addr >= SIMM_MIN);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | (addr & 0xffff);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (jump->flags & PATCH_J) {\n\t\t\t\tSLJIT_ASSERT((addr & ~0xfffffff) == (((sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset) + sizeof(sljit_ins)) & ~0xfffffff));\n\t\t\t\tbuf_ptr[0] |= (addr >> 2) & 0x03ffffff;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* Set the fields of immediate loads. */\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);\n#else\n\t\t\tif (jump->flags & PATCH_ABS32) {\n\t\t\t\tSLJIT_ASSERT(addr <= 0x7fffffff);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);\n\t\t\t}\n\t\t\telse if (jump->flags & PATCH_ABS48) {\n\t\t\t\tSLJIT_ASSERT(addr <= 0x7fffffffffffl);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 32) & 0xffff);\n\t\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\t\tbuf_ptr[3] = (buf_ptr[3] & 0xffff0000) | (addr & 0xffff);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 48) & 0xffff);\n\t\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 32) & 0xffff);\n\t\t\t\tbuf_ptr[3] = (buf_ptr[3] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\t\tbuf_ptr[5] = (buf_ptr[5] & 0xffff0000) | (addr & 0xffff);\n\t\t\t}\n#endif\n\t\t} while (0);\n\t\tjump = jump->next;\n\t}\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);\n\n\tcode = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\tcode_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n#ifndef __GNUC__\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n#else\n\t/* GCC workaround for invalid code generation with -O2. */\n\tsljit_cache_flush(code, code_ptr);\n#endif\n\treturn code;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tsljit_sw fir = 0;\n\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#elif defined(__GNUC__)\n\t\tasm (\"cfc1 %0, $0\" : \"=r\"(fir));\n\t\treturn (fir >> 22) & 0x1;\n#else\n#error \"FIR check is not implemented for this architecture\"\n#endif\n\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\tcase SLJIT_HAS_CLZ:\n\tcase SLJIT_HAS_CMOV:\n\t\treturn 1;\n#endif\n\n\tdefault:\n\t\treturn fir;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\n/* Creates an index in data_transfer_insts array. */\n#define LOAD_DATA\t0x01\n#define WORD_DATA\t0x00\n#define BYTE_DATA\t0x02\n#define HALF_DATA\t0x04\n#define INT_DATA\t0x06\n#define SIGNED_DATA\t0x08\n/* Separates integer and floating point registers */\n#define GPR_REG\t\t0x0f\n#define DOUBLE_DATA\t0x10\n#define SINGLE_DATA\t0x12\n\n#define MEM_MASK\t0x1f\n\n#define ARG_TEST\t0x00020\n#define ALT_KEEP_CACHE\t0x00040\n#define CUMULATIVE_OP\t0x00080\n#define LOGICAL_OP\t0x00100\n#define IMM_OP\t\t0x00200\n#define SRC2_IMM\t0x00400\n\n#define UNUSED_DEST\t0x00800\n#define REG_DEST\t0x01000\n#define REG1_SOURCE\t0x02000\n#define REG2_SOURCE\t0x04000\n#define SLOW_SRC1\t0x08000\n#define SLOW_SRC2\t0x10000\n#define SLOW_DEST\t0x20000\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#define STACK_STORE\tSW\n#define STACK_LOAD\tLW\n#else\n#define STACK_STORE\tSD\n#define STACK_LOAD\tLD\n#endif\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw);\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#include \"sljitNativeMIPS_32.c\"\n#else\n#include \"sljitNativeMIPS_64.c\"\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_ins base;\n\tsljit_s32 args, i, tmp, offs;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\tlocal_size = (local_size + 15) & ~0xf;\n#else\n\tlocal_size = (local_size + 31) & ~0x1f;\n#endif\n\tcompiler->local_size = local_size;\n\n\tif (local_size <= SIMM_MAX) {\n\t\t/* Frequent case. */\n\t\tFAIL_IF(push_inst(compiler, ADDIU_W | S(SLJIT_SP) | T(SLJIT_SP) | IMM(-local_size), DR(SLJIT_SP)));\n\t\tbase = S(SLJIT_SP);\n\t\toffs = local_size - (sljit_sw)sizeof(sljit_sw);\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, DR(OTHER_FLAG), local_size));\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SP) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));\n\t\tFAIL_IF(push_inst(compiler, SUBU_W | S(SLJIT_SP) | T(OTHER_FLAG) | D(SLJIT_SP), DR(SLJIT_SP)));\n\t\tbase = S(TMP_REG2);\n\t\tlocal_size = 0;\n\t\toffs = -(sljit_sw)sizeof(sljit_sw);\n\t}\n\n\tFAIL_IF(push_inst(compiler, STACK_STORE | base | TA(RETURN_ADDR_REG) | IMM(offs), MOVABLE_INS));\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\toffs -= (sljit_s32)(sizeof(sljit_sw));\n\t\tFAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS));\n\t}\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\toffs -= (sljit_s32)(sizeof(sljit_sw));\n\t\tFAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS));\n\t}\n\n\targs = get_arg_count(arg_types);\n\n\tif (args >= 1)\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | SA(4) | TA(0) | D(SLJIT_S0), DR(SLJIT_S0)));\n\tif (args >= 2)\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | SA(5) | TA(0) | D(SLJIT_S1), DR(SLJIT_S1)));\n\tif (args >= 3)\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | SA(6) | TA(0) | D(SLJIT_S2), DR(SLJIT_S2)));\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\tcompiler->local_size = (local_size + 15) & ~0xf;\n#else\n\tcompiler->local_size = (local_size + 31) & ~0x1f;\n#endif\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 local_size, i, tmp, offs;\n\tsljit_ins base;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tlocal_size = compiler->local_size;\n\tif (local_size <= SIMM_MAX)\n\t\tbase = S(SLJIT_SP);\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG1), local_size));\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SP) | T(TMP_REG1) | D(TMP_REG1), DR(TMP_REG1)));\n\t\tbase = S(TMP_REG1);\n\t\tlocal_size = 0;\n\t}\n\n\tFAIL_IF(push_inst(compiler, STACK_LOAD | base | TA(RETURN_ADDR_REG) | IMM(local_size - (sljit_s32)sizeof(sljit_sw)), RETURN_ADDR_REG));\n\toffs = local_size - (sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1);\n\n\ttmp = compiler->scratches;\n\tfor (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {\n\t\tFAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i)));\n\t\toffs += (sljit_s32)(sizeof(sljit_sw));\n\t}\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = tmp; i <= SLJIT_S0; i++) {\n\t\tFAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i)));\n\t\toffs += (sljit_s32)(sizeof(sljit_sw));\n\t}\n\n\tSLJIT_ASSERT(offs == local_size - (sljit_sw)(sizeof(sljit_sw)));\n\n\tFAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\tif (compiler->local_size <= SIMM_MAX)\n\t\treturn push_inst(compiler, ADDIU_W | S(SLJIT_SP) | T(SLJIT_SP) | IMM(compiler->local_size), UNMOVABLE_INS);\n\telse\n\t\treturn push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_SP), UNMOVABLE_INS);\n}\n\n#undef STACK_STORE\n#undef STACK_LOAD\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#define ARCH_32_64(a, b)\ta\n#else\n#define ARCH_32_64(a, b)\tb\n#endif\n\nstatic const sljit_ins data_transfer_insts[16 + 4] = {\n/* u w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */),\n/* u w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */),\n/* u b s */ HI(40) /* sb */,\n/* u b l */ HI(36) /* lbu */,\n/* u h s */ HI(41) /* sh */,\n/* u h l */ HI(37) /* lhu */,\n/* u i s */ HI(43) /* sw */,\n/* u i l */ ARCH_32_64(HI(35) /* lw */, HI(39) /* lwu */),\n\n/* s w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */),\n/* s w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */),\n/* s b s */ HI(40) /* sb */,\n/* s b l */ HI(32) /* lb */,\n/* s h s */ HI(41) /* sh */,\n/* s h l */ HI(33) /* lh */,\n/* s i s */ HI(43) /* sw */,\n/* s i l */ HI(35) /* lw */,\n\n/* d   s */ HI(61) /* sdc1 */,\n/* d   l */ HI(53) /* ldc1 */,\n/* s   s */ HI(57) /* swc1 */,\n/* s   l */ HI(49) /* lwc1 */,\n};\n\n#undef ARCH_32_64\n\n/* reg_ar is an absoulute register! */\n\n/* Can perform an operation using at most 1 instruction. */\nstatic sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)\n{\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif (!(arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >= SIMM_MIN) {\n\t\t/* Works for both absoulte and relative addresses. */\n\t\tif (SLJIT_UNLIKELY(flags & ARG_TEST))\n\t\t\treturn 1;\n\t\tFAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(arg & REG_MASK)\n\t\t\t| TA(reg_ar) | IMM(argw), ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? reg_ar : MOVABLE_INS));\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\n/* See getput_arg below.\n   Note: can_cache is called only for binary operators. Those\n   operators always uses word arguments without write back. */\nstatic sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tSLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));\n\n\t/* Simple operation except for updates. */\n\tif (arg & OFFS_REG_MASK) {\n\t\targw &= 0x3;\n\t\tnext_argw &= 0x3;\n\t\tif (argw && argw == next_argw && (arg == next_arg || (arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK)))\n\t\t\treturn 1;\n\t\treturn 0;\n\t}\n\n\tif (arg == next_arg) {\n\t\tif (((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN))\n\t\t\treturn 1;\n\t\treturn 0;\n\t}\n\n\treturn 0;\n}\n\n/* Emit the necessary instructions. See can_cache above. */\nstatic sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tsljit_s32 tmp_ar, base, delay_slot;\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\tif (!(next_arg & SLJIT_MEM)) {\n\t\tnext_arg = 0;\n\t\tnext_argw = 0;\n\t}\n\n\tif ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) {\n\t\ttmp_ar = reg_ar;\n\t\tdelay_slot = reg_ar;\n\t}\n\telse {\n\t\ttmp_ar = DR(TMP_REG1);\n\t\tdelay_slot = MOVABLE_INS;\n\t}\n\tbase = arg & REG_MASK;\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\n\t\t/* Using the cache. */\n\t\tif (argw == compiler->cache_argw) {\n\t\t\tif (arg == compiler->cache_arg)\n\t\t\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);\n\n\t\t\tif ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) {\n\t\t\t\tif (arg == next_arg && argw == (next_argw & 0x3)) {\n\t\t\t\t\tcompiler->cache_arg = arg;\n\t\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(TMP_REG3), DR(TMP_REG3)));\n\t\t\t\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);\n\t\t\t\t}\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | DA(tmp_ar), tmp_ar));\n\t\t\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);\n\t\t\t}\n\t\t}\n\n\t\tif (SLJIT_UNLIKELY(argw)) {\n\t\t\tcompiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK);\n\t\t\tcompiler->cache_argw = argw;\n\t\t\tFAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(arg)) | D(TMP_REG3) | SH_IMM(argw), DR(TMP_REG3)));\n\t\t}\n\n\t\tif (arg == next_arg && argw == (next_argw & 0x3)) {\n\t\t\tcompiler->cache_arg = arg;\n\t\t\tcompiler->cache_argw = argw;\n\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? OFFS_REG(arg) : TMP_REG3) | D(TMP_REG3), DR(TMP_REG3)));\n\t\t\ttmp_ar = DR(TMP_REG3);\n\t\t}\n\t\telse\n\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? OFFS_REG(arg) : TMP_REG3) | DA(tmp_ar), tmp_ar));\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);\n\t}\n\n\tif (compiler->cache_arg == arg && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) {\n\t\tif (argw != compiler->cache_argw) {\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));\n\t\t\tcompiler->cache_argw = argw;\n\t\t}\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);\n\t}\n\n\tif (compiler->cache_arg == SLJIT_MEM && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) {\n\t\tif (argw != compiler->cache_argw)\n\t\t\tFAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));\n\t}\n\telse {\n\t\tcompiler->cache_arg = SLJIT_MEM;\n\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG3), argw));\n\t}\n\tcompiler->cache_argw = argw;\n\n\tif (!base)\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);\n\n\tif (arg == next_arg && next_argw - argw <= SIMM_MAX && next_argw - argw >= SIMM_MIN) {\n\t\tcompiler->cache_arg = arg;\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | D(TMP_REG3), DR(TMP_REG3)));\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);\n\t}\n\n\tFAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | DA(tmp_ar), tmp_ar));\n\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)\n{\n\tsljit_s32 tmp_ar, base, delay_slot;\n\n\tif (getput_arg_fast(compiler, flags, reg_ar, arg, argw))\n\t\treturn compiler->error;\n\n\tif ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) {\n\t\ttmp_ar = reg_ar;\n\t\tdelay_slot = reg_ar;\n\t}\n\telse {\n\t\ttmp_ar = DR(TMP_REG1);\n\t\tdelay_slot = MOVABLE_INS;\n\t}\n\tbase = arg & REG_MASK;\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\n\t\tif (SLJIT_UNLIKELY(argw)) {\n\t\t\tFAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(arg)) | DA(tmp_ar) | SH_IMM(argw), tmp_ar));\n\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | TA(tmp_ar) | DA(tmp_ar), tmp_ar));\n\t\t}\n\t\telse\n\t\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(OFFS_REG(arg)) | DA(tmp_ar), tmp_ar));\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);\n\t}\n\n\tFAIL_IF(load_immediate(compiler, tmp_ar, argw));\n\n\tif (base != 0)\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(base) | TA(tmp_ar) | DA(tmp_ar), tmp_ar));\n\n\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)\n{\n\tif (getput_arg_fast(compiler, flags, reg, arg1, arg1w))\n\t\treturn compiler->error;\n\treturn getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);\n}\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* arg1 goes to TMP_REG1 or src reg\n\t   arg2 goes to TMP_REG2, imm or src reg\n\t   TMP_REG3 can be used for caching\n\t   result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */\n\tsljit_s32 dst_r = TMP_REG2;\n\tsljit_s32 src1_r;\n\tsljit_sw src2_r = 0;\n\tsljit_s32 sugg_src2_r = TMP_REG2;\n\n\tif (!(flags & ALT_KEEP_CACHE)) {\n\t\tcompiler->cache_arg = 0;\n\t\tcompiler->cache_argw = 0;\n\t}\n\n\tif (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {\n\t\tSLJIT_ASSERT(HAS_FLAGS(op));\n\t\tflags |= UNUSED_DEST;\n\t}\n\telse if (FAST_IS_REG(dst)) {\n\t\tdst_r = dst;\n\t\tflags |= REG_DEST;\n\t\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\tsugg_src2_r = dst_r;\n\t}\n\telse if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, DR(TMP_REG1), dst, dstw))\n\t\tflags |= SLOW_DEST;\n\n\tif (flags & IMM_OP) {\n\t\tif ((src2 & SLJIT_IMM) && src2w) {\n\t\t\tif ((!(flags & LOGICAL_OP) && (src2w <= SIMM_MAX && src2w >= SIMM_MIN))\n\t\t\t\t|| ((flags & LOGICAL_OP) && !(src2w & ~UIMM_MAX))) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src2w;\n\t\t\t}\n\t\t}\n\t\tif (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) {\n\t\t\tif ((!(flags & LOGICAL_OP) && (src1w <= SIMM_MAX && src1w >= SIMM_MIN))\n\t\t\t\t|| ((flags & LOGICAL_OP) && !(src1w & ~UIMM_MAX))) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src1w;\n\n\t\t\t\t/* And swap arguments. */\n\t\t\t\tsrc1 = src2;\n\t\t\t\tsrc1w = src2w;\n\t\t\t\tsrc2 = SLJIT_IMM;\n\t\t\t\t/* src2w = src2_r unneeded. */\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Source 1. */\n\tif (FAST_IS_REG(src1)) {\n\t\tsrc1_r = src1;\n\t\tflags |= REG1_SOURCE;\n\t}\n\telse if (src1 & SLJIT_IMM) {\n\t\tif (src1w) {\n\t\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w));\n\t\t\tsrc1_r = TMP_REG1;\n\t\t}\n\t\telse\n\t\t\tsrc1_r = 0;\n\t}\n\telse {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC1;\n\t\tsrc1_r = TMP_REG1;\n\t}\n\n\t/* Source 2. */\n\tif (FAST_IS_REG(src2)) {\n\t\tsrc2_r = src2;\n\t\tflags |= REG2_SOURCE;\n\t\tif (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\tdst_r = src2_r;\n\t}\n\telse if (src2 & SLJIT_IMM) {\n\t\tif (!(flags & SRC2_IMM)) {\n\t\t\tif (src2w) {\n\t\t\t\tFAIL_IF(load_immediate(compiler, DR(sugg_src2_r), src2w));\n\t\t\t\tsrc2_r = sugg_src2_r;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsrc2_r = 0;\n\t\t\t\tif ((op >= SLJIT_MOV && op <= SLJIT_MOV_P) && (dst & SLJIT_MEM))\n\t\t\t\t\tdst_r = 0;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC2;\n\t\tsrc2_r = sugg_src2_r;\n\t}\n\n\tif ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {\n\t\tSLJIT_ASSERT(src2_r == TMP_REG2);\n\t\tif (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, src1, src1w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw));\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, src2, src2w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, dst, dstw));\n\t\t}\n\t}\n\telse if (flags & SLOW_SRC1)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw));\n\telse if (flags & SLOW_SRC2)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w, dst, dstw));\n\n\tFAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r));\n\n\tif (dst & SLJIT_MEM) {\n\t\tif (!(flags & SLOW_DEST)) {\n\t\t\tgetput_arg_fast(compiler, flags, DR(dst_r), dst, dstw);\n\t\t\treturn compiler->error;\n\t\t}\n\t\treturn getput_arg(compiler, flags, DR(dst_r), dst, dstw, 0, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\tsljit_s32 int_op = op & SLJIT_I32_OP;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\t\treturn push_inst(compiler, BREAK, UNMOVABLE_INS);\n\tcase SLJIT_NOP:\n\t\treturn push_inst(compiler, NOP, UNMOVABLE_INS);\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\t\tFAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));\n#else\n\t\tFAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));\n#endif\n\t\tFAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));\n\t\treturn push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\tSLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);\n#if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\tFAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n#endif\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\t\tif (int_op)\n\t\t\tFAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));\n\t\telse\n\t\t\tFAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));\n#else\n\t\tFAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));\n#endif\n\n\t\tFAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));\n\t\treturn (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\nstatic sljit_s32 emit_prefetch(struct sljit_compiler *compiler,\n        sljit_s32 src, sljit_sw srcw)\n{\n\tif (!(src & OFFS_REG_MASK)) {\n\t\tif (srcw <= SIMM_MAX && srcw >= SIMM_MIN)\n\t\t\treturn push_inst(compiler, PREF | S(src & REG_MASK) | IMM(srcw), MOVABLE_INS);\n\n\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));\n\t\treturn push_inst(compiler, PREFX | S(src & REG_MASK) | T(TMP_REG1), MOVABLE_INS);\n\t}\n\n\tsrcw &= 0x3;\n\n\tif (SLJIT_UNLIKELY(srcw != 0)) {\n\t\tFAIL_IF(push_inst(compiler, SLL_W | T(OFFS_REG(src)) | D(TMP_REG1) | SH_IMM(srcw), DR(TMP_REG1)));\n\t\treturn push_inst(compiler, PREFX | S(src & REG_MASK) | T(TMP_REG1), MOVABLE_INS);\n\t}\n\n\treturn push_inst(compiler, PREFX | S(src & REG_MASK) | T(OFFS_REG(src)), MOVABLE_INS);\n}\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tdefine flags 0\n#else\n\tsljit_s32 flags = 0;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM))\n\t\t\treturn emit_prefetch(compiler, src, srcw);\n#endif\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\tif ((op & SLJIT_I32_OP) && GET_OPCODE(op) >= SLJIT_NOT)\n\t\tflags |= INT_DATA | SIGNED_DATA;\n#endif\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\treturn emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U32:\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\t\treturn emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n#else\n\t\treturn emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw);\n#endif\n\n\tcase SLJIT_MOV_S32:\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\t\treturn emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n#else\n\t\treturn emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw);\n#endif\n\n\tcase SLJIT_MOV_U8:\n\t\treturn emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);\n\n\tcase SLJIT_MOV_S8:\n\t\treturn emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);\n\n\tcase SLJIT_MOV_U16:\n\t\treturn emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);\n\n\tcase SLJIT_MOV_S16:\n\t\treturn emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);\n\n\tcase SLJIT_NOT:\n\t\treturn emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_NEG:\n\t\treturn emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw);\n\n\tcase SLJIT_CLZ:\n\t\treturn emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tundef flags\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tdefine flags 0\n#else\n\tsljit_s32 flags = 0;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\tif (op & SLJIT_I32_OP) {\n\t\tflags |= INT_DATA | SIGNED_DATA;\n\t\tif (src1 & SLJIT_IMM)\n\t\t\tsrc1w = (sljit_s32)src1w;\n\t\tif (src2 & SLJIT_IMM)\n\t\t\tsrc2w = (sljit_s32)src2w;\n\t}\n#endif\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD:\n\tcase SLJIT_ADDC:\n\t\treturn emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SUB:\n\tcase SLJIT_SUBC:\n\t\treturn emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_MUL:\n\t\treturn emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_AND:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\t\treturn emit_op(compiler, op, flags | CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\t\tif (src2 & SLJIT_IMM)\n\t\t\tsrc2w &= 0x1f;\n#else\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tif (op & SLJIT_I32_OP)\n\t\t\t\tsrc2w &= 0x1f;\n\t\t\telse\n\t\t\t\tsrc2w &= 0x3f;\n\t\t}\n#endif\n\t\treturn emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tundef flags\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn FR(reg);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\treturn push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7))\n#define FMT(op) (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) << (21 - 8))\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tdefine flags 0\n#else\n\tsljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64) << 21;\n#endif\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw));\n\t\tsrc = TMP_FREG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, (TRUNC_W_S ^ (flags >> 19)) | FMT(op) | FS(src) | FD(TMP_FREG1), MOVABLE_INS));\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, MFC1 | flags | T(dst) | FS(TMP_FREG1), MOVABLE_INS);\n\n\t/* Store the integer value from a VFP register. */\n\treturn emit_op_mem2(compiler, flags ? DOUBLE_DATA : SINGLE_DATA, FR(TMP_FREG1), dst, dstw, 0, 0);\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tundef is_long\n#endif\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tdefine flags 0\n#else\n\tsljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) << 21;\n#endif\n\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS));\n\telse if (src & SLJIT_MEM) {\n\t\t/* Load the integer value into a VFP register. */\n\t\tFAIL_IF(emit_op_mem2(compiler, ((flags) ? DOUBLE_DATA : SINGLE_DATA) | LOAD_DATA, FR(TMP_FREG1), src, srcw, dst, dstw));\n\t}\n\telse {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\t\tsrcw = (sljit_s32)srcw;\n#endif\n\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));\n\t\tFAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS));\n\t}\n\n\tFAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG1), dst, dstw, 0, 0);\n\treturn SLJIT_SUCCESS;\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#\tundef flags\n#endif\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_ins inst;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, src2, src2w));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, 0, 0));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tswitch (GET_FLAG_TYPE(op)) {\n\tcase SLJIT_EQUAL_F64:\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\tinst = C_UEQ_S;\n\t\tbreak;\n\tcase SLJIT_LESS_F64:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\tinst = C_ULT_S;\n\t\tbreak;\n\tcase SLJIT_GREATER_F64:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\tinst = C_ULE_S;\n\t\tbreak;\n\tdefault:\n\t\tSLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_UNORDERED_F64 || GET_FLAG_TYPE(op) == SLJIT_ORDERED_F64);\n\t\tinst = C_UN_S;\n\t\tbreak;\n\t}\n\n\treturn push_inst(compiler, inst | FMT(op) | FT(src2) | FS(src1), UNMOVABLE_INS);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tSLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)\n\t\top ^= SLJIT_F32_OP;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(dst_r), src, srcw, dst, dstw));\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1)\n\t\t\t\tFAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\tFAIL_IF(push_inst(compiler, CVT_S_S | ((op & SLJIT_F32_OP) ? 1 : (1 << 21)) | FS(src) | FD(dst_r), MOVABLE_INS));\n\t\top ^= SLJIT_F32_OP;\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem2(compiler, FLOAT_DATA(op), FR(dst_r), dst, dstw, 0, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r, flags = 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tif (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w)) {\n\t\t\tFAIL_IF(compiler->error);\n\t\t\tsrc1 = TMP_FREG1;\n\t\t} else\n\t\t\tflags |= SLOW_SRC1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tif (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w)) {\n\t\t\tFAIL_IF(compiler->error);\n\t\t\tsrc2 = TMP_FREG2;\n\t\t} else\n\t\t\tflags |= SLOW_SRC2;\n\t}\n\n\tif ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {\n\t\tif (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, src1, src1w));\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, dst, dstw));\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, src2, src2w));\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, dst, dstw));\n\t\t}\n\t}\n\telse if (flags & SLOW_SRC1)\n\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG1), src1, src1w, dst, dstw));\n\telse if (flags & SLOW_SRC2)\n\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, FR(TMP_FREG2), src2, src2w, dst, dstw));\n\n\tif (flags & SLOW_SRC1)\n\t\tsrc1 = TMP_FREG1;\n\tif (flags & SLOW_SRC2)\n\t\tsrc2 = TMP_FREG2;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));\n\t\tbreak;\n\t}\n\n\tif (dst_r == TMP_FREG2)\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), FR(TMP_FREG2), dst, dstw, 0, 0));\n\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), DR(dst));\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG));\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw));\n\n\tFAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\treturn push_inst(compiler, NOP, UNMOVABLE_INS);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\tcompiler->delay_slot = UNMOVABLE_INS;\n\treturn label;\n}\n\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n#define JUMP_LENGTH\t4\n#else\n#define JUMP_LENGTH\t8\n#endif\n\n#define BR_Z(src) \\\n\tinst = BEQ | SA(src) | TA(0) | JUMP_LENGTH; \\\n\tflags = IS_BIT26_COND; \\\n\tdelay_check = src;\n\n#define BR_NZ(src) \\\n\tinst = BNE | SA(src) | TA(0) | JUMP_LENGTH; \\\n\tflags = IS_BIT26_COND; \\\n\tdelay_check = src;\n\n#define BR_T() \\\n\tinst = BC1T | JUMP_LENGTH; \\\n\tflags = IS_BIT16_COND; \\\n\tdelay_check = FCSR_FCC;\n\n#define BR_F() \\\n\tinst = BC1F | JUMP_LENGTH; \\\n\tflags = IS_BIT16_COND; \\\n\tdelay_check = FCSR_FCC;\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins inst;\n\tsljit_s32 flags = 0;\n\tsljit_s32 delay_check = UNMOVABLE_INS;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\t\tBR_NZ(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_NOT_EQUAL:\n\t\tBR_Z(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_LESS:\n\tcase SLJIT_GREATER:\n\tcase SLJIT_SIG_LESS:\n\tcase SLJIT_SIG_GREATER:\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\tBR_Z(OTHER_FLAG);\n\t\tbreak;\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\tcase SLJIT_SIG_LESS_EQUAL:\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tBR_NZ(OTHER_FLAG);\n\t\tbreak;\n\tcase SLJIT_NOT_EQUAL_F64:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\tcase SLJIT_GREATER_F64:\n\tcase SLJIT_ORDERED_F64:\n\t\tBR_T();\n\t\tbreak;\n\tcase SLJIT_EQUAL_F64:\n\tcase SLJIT_LESS_F64:\n\tcase SLJIT_LESS_EQUAL_F64:\n\tcase SLJIT_UNORDERED_F64:\n\t\tBR_F();\n\t\tbreak;\n\tdefault:\n\t\t/* Not conditional branch. */\n\t\tinst = 0;\n\t\tbreak;\n\t}\n\n\tjump->flags |= flags;\n\tif (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != delay_check))\n\t\tjump->flags |= IS_MOVABLE;\n\n\tif (inst)\n\t\tPTR_FAIL_IF(push_inst(compiler, inst, UNMOVABLE_INS));\n\n\tPTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));\n\n\tif (type <= SLJIT_JUMP)\n\t\tPTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS));\n\telse {\n\t\tjump->flags |= IS_JAL;\n\t\tPTR_FAIL_IF(push_inst(compiler, JALR | S(TMP_REG2) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));\n\t}\n\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n\treturn jump;\n}\n\n#define RESOLVE_IMM1() \\\n\tif (src1 & SLJIT_IMM) { \\\n\t\tif (src1w) { \\\n\t\t\tPTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); \\\n\t\t\tsrc1 = TMP_REG1; \\\n\t\t} \\\n\t\telse \\\n\t\t\tsrc1 = 0; \\\n\t}\n\n#define RESOLVE_IMM2() \\\n\tif (src2 & SLJIT_IMM) { \\\n\t\tif (src2w) { \\\n\t\t\tPTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG2), src2w)); \\\n\t\t\tsrc2 = TMP_REG2; \\\n\t\t} \\\n\t\telse \\\n\t\t\tsrc2 = 0; \\\n\t}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tstruct sljit_jump *jump;\n\tsljit_s32 flags;\n\tsljit_ins inst;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\tflags = ((type & SLJIT_I32_OP) ? INT_DATA : WORD_DATA) | LOAD_DATA;\n\tif (src1 & SLJIT_MEM) {\n\t\tPTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG1), src1, src1w, src2, src2w));\n\t\tsrc1 = TMP_REG1;\n\t}\n\tif (src2 & SLJIT_MEM) {\n\t\tPTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG2), src2, src2w, 0, 0));\n\t\tsrc2 = TMP_REG2;\n\t}\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tif (type <= SLJIT_NOT_EQUAL) {\n\t\tRESOLVE_IMM1();\n\t\tRESOLVE_IMM2();\n\t\tjump->flags |= IS_BIT26_COND;\n\t\tif (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))\n\t\t\tjump->flags |= IS_MOVABLE;\n\t\tPTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));\n\t}\n\telse if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {\n\t\tinst = NOP;\n\t\tif ((src1 & SLJIT_IMM) && (src1w == 0)) {\n\t\t\tRESOLVE_IMM2();\n\t\t\tswitch (type) {\n\t\t\tcase SLJIT_SIG_LESS:\n\t\t\t\tinst = BLEZ;\n\t\t\t\tjump->flags |= IS_BIT26_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\t\t\tinst = BGTZ;\n\t\t\t\tjump->flags |= IS_BIT26_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_GREATER:\n\t\t\t\tinst = BGEZ;\n\t\t\t\tjump->flags |= IS_BIT16_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_LESS_EQUAL:\n\t\t\t\tinst = BLTZ;\n\t\t\t\tjump->flags |= IS_BIT16_COND;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsrc1 = src2;\n\t\t}\n\t\telse {\n\t\t\tRESOLVE_IMM1();\n\t\t\tswitch (type) {\n\t\t\tcase SLJIT_SIG_LESS:\n\t\t\t\tinst = BGEZ;\n\t\t\t\tjump->flags |= IS_BIT16_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\t\t\tinst = BLTZ;\n\t\t\t\tjump->flags |= IS_BIT16_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_GREATER:\n\t\t\t\tinst = BLEZ;\n\t\t\t\tjump->flags |= IS_BIT26_COND;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_SIG_LESS_EQUAL:\n\t\t\t\tinst = BGTZ;\n\t\t\t\tjump->flags |= IS_BIT26_COND;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tPTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));\n\t}\n\telse {\n\t\tif (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) {\n\t\t\tRESOLVE_IMM1();\n\t\t\tif ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)\n\t\t\t\tPTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));\n\t\t\telse {\n\t\t\t\tRESOLVE_IMM2();\n\t\t\t\tPTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));\n\t\t\t}\n\t\t\ttype = (type == SLJIT_LESS || type == SLJIT_SIG_LESS) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;\n\t\t}\n\t\telse {\n\t\t\tRESOLVE_IMM2();\n\t\t\tif ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)\n\t\t\t\tPTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));\n\t\t\telse {\n\t\t\t\tRESOLVE_IMM1();\n\t\t\t\tPTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));\n\t\t\t}\n\t\t\ttype = (type == SLJIT_GREATER || type == SLJIT_SIG_GREATER) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;\n\t\t}\n\n\t\tjump->flags |= IS_BIT26_COND;\n\t\tPTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));\n\t}\n\n\tPTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));\n\tPTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n\treturn jump;\n}\n\n#undef RESOLVE_IMM1\n#undef RESOLVE_IMM2\n\n#undef JUMP_LENGTH\n#undef BR_Z\n#undef BR_NZ\n#undef BR_T\n#undef BR_F\n\n#undef FLOAT_DATA\n#undef FMT\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump = NULL;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (src & SLJIT_IMM) {\n\t\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\t\tFAIL_IF(!jump);\n\t\tset_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0));\n\t\tjump->u.target = srcw;\n\n\t\tif (compiler->delay_slot != UNMOVABLE_INS)\n\t\t\tjump->flags |= IS_MOVABLE;\n\n\t\tFAIL_IF(emit_const(compiler, TMP_REG2, 0));\n\t\tsrc = TMP_REG2;\n\t}\n\telse if (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, DR(TMP_REG2), src, srcw));\n\t\tsrc = TMP_REG2;\n\t}\n\n\tFAIL_IF(push_inst(compiler, JR | S(src), UNMOVABLE_INS));\n\tif (jump)\n\t\tjump->addr = compiler->size;\n\tFAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 src_ar, dst_ar;\n\tsljit_s32 saved_op = op;\n#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)\n\tsljit_s32 mem_type = WORD_DATA;\n#else\n\tsljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\top = GET_OPCODE(op);\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\tif (op == SLJIT_MOV_S32)\n\t\tmem_type = INT_DATA | SIGNED_DATA;\n#endif\n\tdst_ar = DR((op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2);\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tif (op >= SLJIT_ADD && (dst & SLJIT_MEM))\n\t\tFAIL_IF(emit_op_mem2(compiler, mem_type | LOAD_DATA, DR(TMP_REG1), dst, dstw, dst, dstw));\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_NOT_EQUAL:\n\t\tFAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(dst_ar) | IMM(1), dst_ar));\n\t\tsrc_ar = dst_ar;\n\t\tbreak;\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tFAIL_IF(push_inst(compiler, SLTIU | SA(OTHER_FLAG) | TA(dst_ar) | IMM(1), dst_ar));\n\t\tsrc_ar = dst_ar;\n\t\ttype ^= 0x1; /* Flip type bit for the XORI below. */\n\t\tbreak;\n\tcase SLJIT_GREATER_F64:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\ttype ^= 0x1; /* Flip type bit for the XORI below. */\n\tcase SLJIT_EQUAL_F64:\n\tcase SLJIT_NOT_EQUAL_F64:\n\tcase SLJIT_LESS_F64:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\tcase SLJIT_UNORDERED_F64:\n\tcase SLJIT_ORDERED_F64:\n\t\tFAIL_IF(push_inst(compiler, CFC1 | TA(dst_ar) | DA(FCSR_REG), dst_ar));\n\t\tFAIL_IF(push_inst(compiler, SRL | TA(dst_ar) | DA(dst_ar) | SH_IMM(23), dst_ar));\n\t\tFAIL_IF(push_inst(compiler, ANDI | SA(dst_ar) | TA(dst_ar) | IMM(1), dst_ar));\n\t\tsrc_ar = dst_ar;\n\t\tbreak;\n\n\tdefault:\n\t\tsrc_ar = OTHER_FLAG;\n\t\tbreak;\n\t}\n\n\tif (type & 0x1) {\n\t\tFAIL_IF(push_inst(compiler, XORI | SA(src_ar) | TA(dst_ar) | IMM(1), dst_ar));\n\t\tsrc_ar = dst_ar;\n\t}\n\n\tif (op < SLJIT_ADD) {\n\t\tif (dst & SLJIT_MEM)\n\t\t\treturn emit_op_mem(compiler, mem_type, src_ar, dst, dstw);\n\n\t\tif (src_ar != dst_ar)\n\t\t\treturn push_inst(compiler, ADDU_W | SA(src_ar) | TA(0) | DA(dst_ar), dst_ar);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* OTHER_FLAG cannot be specified as src2 argument at the moment. */\n\tif (DR(TMP_REG2) != src_ar)\n\t\tFAIL_IF(push_inst(compiler, ADDU_W | SA(src_ar) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));\n\n\tmem_type |= CUMULATIVE_OP | LOGICAL_OP | IMM_OP | ALT_KEEP_CACHE;\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op(compiler, saved_op, mem_type, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);\n\treturn emit_op(compiler, saved_op, mem_type, dst, dstw, dst, dstw, TMP_REG2, 0);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\tsljit_ins ins;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)\n\n\tif (SLJIT_UNLIKELY(src & SLJIT_IMM)) {\n#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)\n\t\tif (dst_reg & SLJIT_I32_OP)\n\t\t\tsrcw = (sljit_s32)srcw;\n#endif\n\t\tFAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tdst_reg &= ~SLJIT_I32_OP;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_EQUAL:\n\t\tins = MOVZ | TA(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_NOT_EQUAL:\n\t\tins = MOVN | TA(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_LESS:\n\tcase SLJIT_GREATER:\n\tcase SLJIT_SIG_LESS:\n\tcase SLJIT_SIG_GREATER:\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\tins = MOVN | TA(OTHER_FLAG);\n\t\tbreak;\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\tcase SLJIT_SIG_LESS_EQUAL:\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tins = MOVZ | TA(OTHER_FLAG);\n\t\tbreak;\n\tcase SLJIT_EQUAL_F64:\n\tcase SLJIT_LESS_F64:\n\tcase SLJIT_LESS_EQUAL_F64:\n\tcase SLJIT_UNORDERED_F64:\n\t\tins = MOVT;\n\t\tbreak;\n\tcase SLJIT_NOT_EQUAL_F64:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\tcase SLJIT_GREATER_F64:\n\tcase SLJIT_ORDERED_F64:\n\t\tins = MOVF;\n\t\tbreak;\n\tdefault:\n\t\tins = MOVZ | TA(OTHER_FLAG);\n\t\tSLJIT_UNREACHABLE();\n\t\tbreak;\n\t}\n\n\treturn push_inst(compiler, ins | S(src) | D(dst_reg), DR(dst_reg));\n\n#else\n\treturn sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 reg;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\treg = FAST_IS_REG(dst) ? dst : TMP_REG2;\n\n\tPTR_FAIL_IF(emit_const(compiler, reg, init_value));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));\n\treturn const_;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativePPC_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* ppc 32-bit arch dependent functions. */\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)\n{\n\tif (imm <= SIMM_MAX && imm >= SIMM_MIN)\n\t\treturn push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));\n\n\tif (!(imm & ~0xffff))\n\t\treturn push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm));\n\n\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 16)));\n\treturn (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS;\n}\n\n#define INS_CLEAR_LEFT(dst, src, from) \\\n\t(RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1))\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_s32 src2)\n{\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif (dst != src2)\n\t\t\treturn push_inst(compiler, OR | S(src2) | A(dst) | B(src2));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S8)\n\t\t\t\treturn push_inst(compiler, EXTSB | S(src2) | A(dst));\n\t\t\treturn push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));\n\t\t}\n\t\telse if ((flags & REG_DEST) && op == SLJIT_MOV_S8)\n\t\t\treturn push_inst(compiler, EXTSB | S(src2) | A(dst));\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S16)\n\t\t\t\treturn push_inst(compiler, EXTSH | S(src2) | A(dst));\n\t\t\treturn push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\treturn push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));\n\n\tcase SLJIT_NEG:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\treturn push_inst(compiler, NEG | OE((flags & ALT_FORM1) ? ALT_SET_FLAGS : 0) | RC(flags) | D(dst) | A(src2));\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\treturn push_inst(compiler, CNTLZW | S(src2) | A(dst));\n\n\tcase SLJIT_ADD:\n\t\tif (flags & ALT_FORM1) {\n\t\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\t\treturn push_inst(compiler, ADD | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));\n\t\t}\n\n\t\tif (flags & ALT_FORM2) {\n\t\t\t/* Flags does not set: BIN_IMM_EXTS unnecessary. */\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\n\t\t\tif (flags & ALT_FORM3)\n\t\t\t\treturn push_inst(compiler, ADDIS | D(dst) | A(src1) | compiler->imm);\n\n\t\t\tif (flags & ALT_FORM4) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIS | D(dst) | A(src1) | (((compiler->imm >> 16) & 0xffff) + ((compiler->imm >> 15) & 0x1))));\n\t\t\t\tsrc1 = dst;\n\t\t\t}\n\n\t\t\treturn push_inst(compiler, ADDI | D(dst) | A(src1) | (compiler->imm & 0xffff));\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\t\tif (!(flags & ALT_SET_FLAGS))\n\t\t\treturn push_inst(compiler, ADD | D(dst) | A(src1) | B(src2));\n\t\tif (flags & ALT_FORM4)\n\t\t\treturn push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));\n\t\treturn push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2));\n\n\tcase SLJIT_ADDC:\n\t\treturn push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2));\n\n\tcase SLJIT_SUB:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tif (flags & ALT_FORM2) {\n\t\t\t\tFAIL_IF(push_inst(compiler, CMPLI | CRD(0) | A(src1) | compiler->imm));\n\t\t\t\tif (!(flags & ALT_FORM3))\n\t\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\t\treturn push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));\n\t\t\t}\n\t\t\tFAIL_IF(push_inst(compiler, CMPL | CRD(0) | A(src1) | B(src2)));\n\t\t\tif (!(flags & ALT_FORM3))\n\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\treturn push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));\n\t\t}\n\n\t\tif (flags & ALT_FORM2) {\n\t\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\t\treturn push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));\n\t\t}\n\n\t\tif (flags & ALT_FORM3) {\n\t\t\t/* Flags does not set: BIN_IMM_EXTS unnecessary. */\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\n\t\tif (flags & ALT_FORM4) {\n\t\t\tif (flags & ALT_FORM5) {\n\t\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\t\treturn push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm);\n\t\t\t}\n\t\t\treturn push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2));\n\t\t}\n\n\t\tif (!(flags & ALT_SET_FLAGS))\n\t\t\treturn push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));\n\t\tif (flags & ALT_FORM5)\n\t\t\treturn push_inst(compiler, SUBFC | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));\n\t\treturn push_inst(compiler, SUBF | RC(flags) | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_SUBC:\n\t\treturn push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_MUL:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, MULLI | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\t\treturn push_inst(compiler, MULLW | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_AND:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ANDI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ANDIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\treturn push_inst(compiler, AND | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_OR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ORI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ORIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | A(dst) | IMM(compiler->imm)));\n\t\t\treturn push_inst(compiler, ORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16));\n\t\t}\n\t\treturn push_inst(compiler, OR | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_XOR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, XORI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, XORIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tFAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(compiler->imm)));\n\t\t\treturn push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16));\n\t\t}\n\t\treturn push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_SHL:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tcompiler->imm &= 0x1f;\n\t\t\treturn push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11) | ((31 - compiler->imm) << 1));\n\t\t}\n\t\treturn push_inst(compiler, SLW | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_LSHR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tcompiler->imm &= 0x1f;\n\t\t\treturn push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (((32 - compiler->imm) & 0x1f) << 11) | (compiler->imm << 6) | (31 << 1));\n\t\t}\n\t\treturn push_inst(compiler, SRW | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_ASHR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tcompiler->imm &= 0x1f;\n\t\t\treturn push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11));\n\t\t}\n\t\treturn push_inst(compiler, SRAW | RC(flags) | S(src1) | A(dst) | B(src2));\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value)\n{\n\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16)));\n\treturn push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_target >> 16) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | (new_target & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativePPC_64.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* ppc 64-bit arch dependent functions. */\n\n#if defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM)\n#define ASM_SLJIT_CLZ(src, dst) \\\n\t__asm__ volatile ( \"cntlzd %0, %1\" : \"=r\"(dst) : \"r\"(src) )\n#elif defined(__xlc__)\n#error \"Please enable GCC syntax for inline assembly statements\"\n#else\n#error \"Must implement count leading zeroes\"\n#endif\n\n#define RLDI(dst, src, sh, mb, type) \\\n\t(HI(30) | S(src) | A(dst) | ((type) << 2) | (((sh) & 0x1f) << 11) | (((sh) & 0x20) >> 4) | (((mb) & 0x1f) << 6) | ((mb) & 0x20))\n\n#define PUSH_RLDICR(reg, shift) \\\n\tpush_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1))\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)\n{\n\tsljit_uw tmp;\n\tsljit_uw shift;\n\tsljit_uw tmp2;\n\tsljit_uw shift2;\n\n\tif (imm <= SIMM_MAX && imm >= SIMM_MIN)\n\t\treturn push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));\n\n\tif (!(imm & ~0xffff))\n\t\treturn push_inst(compiler, ORI | S(TMP_ZERO) | A(reg) | IMM(imm));\n\n\tif (imm <= 0x7fffffffl && imm >= -0x80000000l) {\n\t\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 16)));\n\t\treturn (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm)) : SLJIT_SUCCESS;\n\t}\n\n\t/* Count leading zeroes. */\n\ttmp = (imm >= 0) ? imm : ~imm;\n\tASM_SLJIT_CLZ(tmp, shift);\n\tSLJIT_ASSERT(shift > 0);\n\tshift--;\n\ttmp = (imm << shift);\n\n\tif ((tmp & ~0xffff000000000000ul) == 0) {\n\t\tFAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48)));\n\t\tshift += 15;\n\t\treturn PUSH_RLDICR(reg, shift);\n\t}\n\n\tif ((tmp & ~0xffffffff00000000ul) == 0) {\n\t\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(tmp >> 48)));\n\t\tFAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(tmp >> 32)));\n\t\tshift += 31;\n\t\treturn PUSH_RLDICR(reg, shift);\n\t}\n\n\t/* Cut out the 16 bit from immediate. */\n\tshift += 15;\n\ttmp2 = imm & ((1ul << (63 - shift)) - 1);\n\n\tif (tmp2 <= 0xffff) {\n\t\tFAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48)));\n\t\tFAIL_IF(PUSH_RLDICR(reg, shift));\n\t\treturn push_inst(compiler, ORI | S(reg) | A(reg) | tmp2);\n\t}\n\n\tif (tmp2 <= 0xffffffff) {\n\t\tFAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48)));\n\t\tFAIL_IF(PUSH_RLDICR(reg, shift));\n\t\tFAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | (tmp2 >> 16)));\n\t\treturn (imm & 0xffff) ? push_inst(compiler, ORI | S(reg) | A(reg) | IMM(tmp2)) : SLJIT_SUCCESS;\n\t}\n\n\tASM_SLJIT_CLZ(tmp2, shift2);\n\ttmp2 <<= shift2;\n\n\tif ((tmp2 & ~0xffff000000000000ul) == 0) {\n\t\tFAIL_IF(push_inst(compiler, ADDI | D(reg) | A(0) | IMM(tmp >> 48)));\n\t\tshift2 += 15;\n\t\tshift += (63 - shift2);\n\t\tFAIL_IF(PUSH_RLDICR(reg, shift));\n\t\tFAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | (tmp2 >> 48)));\n\t\treturn PUSH_RLDICR(reg, shift2);\n\t}\n\n\t/* The general version. */\n\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(imm >> 48)));\n\tFAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm >> 32)));\n\tFAIL_IF(PUSH_RLDICR(reg, 31));\n\tFAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | IMM(imm >> 16)));\n\treturn push_inst(compiler, ORI | S(reg) | A(reg) | IMM(imm));\n}\n\n/* Simplified mnemonics: clrldi. */\n#define INS_CLEAR_LEFT(dst, src, from) \\\n\t(RLDICL | S(src) | A(dst) | ((from) << 6) | (1 << 5))\n\n/* Sign extension for integer operations. */\n#define UN_EXTS() \\\n\tif ((flags & (ALT_SIGN_EXT | REG2_SOURCE)) == (ALT_SIGN_EXT | REG2_SOURCE)) { \\\n\t\tFAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \\\n\t\tsrc2 = TMP_REG2; \\\n\t}\n\n#define BIN_EXTS() \\\n\tif (flags & ALT_SIGN_EXT) { \\\n\t\tif (flags & REG1_SOURCE) { \\\n\t\t\tFAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \\\n\t\t\tsrc1 = TMP_REG1; \\\n\t\t} \\\n\t\tif (flags & REG2_SOURCE) { \\\n\t\t\tFAIL_IF(push_inst(compiler, EXTSW | S(src2) | A(TMP_REG2))); \\\n\t\t\tsrc2 = TMP_REG2; \\\n\t\t} \\\n\t}\n\n#define BIN_IMM_EXTS() \\\n\tif ((flags & (ALT_SIGN_EXT | REG1_SOURCE)) == (ALT_SIGN_EXT | REG1_SOURCE)) { \\\n\t\tFAIL_IF(push_inst(compiler, EXTSW | S(src1) | A(TMP_REG1))); \\\n\t\tsrc1 = TMP_REG1; \\\n\t}\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_s32 src2)\n{\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif (dst != src2)\n\t\t\treturn push_inst(compiler, OR | S(src2) | A(dst) | B(src2));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S32)\n\t\t\t\treturn push_inst(compiler, EXTSW | S(src2) | A(dst));\n\t\t\treturn push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 0));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S8)\n\t\t\t\treturn push_inst(compiler, EXTSB | S(src2) | A(dst));\n\t\t\treturn push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));\n\t\t}\n\t\telse if ((flags & REG_DEST) && op == SLJIT_MOV_S8)\n\t\t\treturn push_inst(compiler, EXTSB | S(src2) | A(dst));\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S16)\n\t\t\t\treturn push_inst(compiler, EXTSH | S(src2) | A(dst));\n\t\t\treturn push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));\n\t\t}\n\t\telse {\n\t\t\tSLJIT_ASSERT(dst == src2);\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tUN_EXTS();\n\t\treturn push_inst(compiler, NOR | RC(flags) | S(src2) | A(dst) | B(src2));\n\n\tcase SLJIT_NEG:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\n\t\tif ((flags & (ALT_FORM1 | ALT_SIGN_EXT)) == (ALT_FORM1 | ALT_SIGN_EXT)) {\n\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1)));\n\t\t\tFAIL_IF(push_inst(compiler, NEG | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(TMP_REG2)));\n\t\t\treturn push_inst(compiler, RLDI(dst, dst, 32, 32, 0));\n\t\t}\n\n\t\tUN_EXTS();\n\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\treturn push_inst(compiler, NEG | OE((flags & ALT_FORM1) ? ALT_SET_FLAGS : 0) | RC(flags) | D(dst) | A(src2));\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1);\n\t\tif (flags & ALT_FORM1)\n\t\t\treturn push_inst(compiler, CNTLZW | S(src2) | A(dst));\n\t\treturn push_inst(compiler, CNTLZD | S(src2) | A(dst));\n\n\tcase SLJIT_ADD:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tif (flags & ALT_SIGN_EXT) {\n\t\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1)));\n\t\t\t\tsrc1 = TMP_REG1;\n\t\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1)));\n\t\t\t\tsrc2 = TMP_REG2;\n\t\t\t}\n\t\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\t\tFAIL_IF(push_inst(compiler, ADD | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)));\n\t\t\tif (flags & ALT_SIGN_EXT)\n\t\t\t\treturn push_inst(compiler, RLDI(dst, dst, 32, 32, 0));\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tif (flags & ALT_FORM2) {\n\t\t\t/* Flags does not set: BIN_IMM_EXTS unnecessary. */\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\n\t\t\tif (flags & ALT_FORM3)\n\t\t\t\treturn push_inst(compiler, ADDIS | D(dst) | A(src1) | compiler->imm);\n\n\t\t\tif (flags & ALT_FORM4) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADDIS | D(dst) | A(src1) | (((compiler->imm >> 16) & 0xffff) + ((compiler->imm >> 15) & 0x1))));\n\t\t\t\tsrc1 = dst;\n\t\t\t}\n\n\t\t\treturn push_inst(compiler, ADDI | D(dst) | A(src1) | (compiler->imm & 0xffff));\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tBIN_IMM_EXTS();\n\t\t\treturn push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\t\tif (!(flags & ALT_SET_FLAGS))\n\t\t\treturn push_inst(compiler, ADD | D(dst) | A(src1) | B(src2));\n\t\tBIN_EXTS();\n\t\tif (flags & ALT_FORM4)\n\t\t\treturn push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2));\n\t\treturn push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2));\n\n\tcase SLJIT_ADDC:\n\t\tBIN_EXTS();\n\t\treturn push_inst(compiler, ADDE | D(dst) | A(src1) | B(src2));\n\n\tcase SLJIT_SUB:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tif (flags & ALT_FORM2) {\n\t\t\t\tFAIL_IF(push_inst(compiler, CMPLI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm));\n\t\t\t\tif (!(flags & ALT_FORM3))\n\t\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\t\treturn push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));\n\t\t\t}\n\t\t\tFAIL_IF(push_inst(compiler, CMPL | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)));\n\t\t\tif (!(flags & ALT_FORM3))\n\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\treturn push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));\n\t\t}\n\n\t\tif (flags & ALT_FORM2) {\n\t\t\tif (flags & ALT_SIGN_EXT) {\n\t\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1)));\n\t\t\t\tsrc1 = TMP_REG1;\n\t\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG2, src2, 32, 31, 1)));\n\t\t\t\tsrc2 = TMP_REG2;\n\t\t\t}\n\t\t\t/* Setting XER SO is not enough, CR SO is also needed. */\n\t\t\tFAIL_IF(push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)));\n\t\t\tif (flags & ALT_SIGN_EXT)\n\t\t\t\treturn push_inst(compiler, RLDI(dst, dst, 32, 32, 0));\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tif (flags & ALT_FORM3) {\n\t\t\t/* Flags does not set: BIN_IMM_EXTS unnecessary. */\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\n\t\tif (flags & ALT_FORM4) {\n\t\t\tif (flags & ALT_FORM5) {\n\t\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\t\treturn push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm);\n\t\t\t}\n\t\t\treturn push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2));\n\t\t}\n\n\t\tif (!(flags & ALT_SET_FLAGS))\n\t\t\treturn push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));\n\t\tBIN_EXTS();\n\t\tif (flags & ALT_FORM5)\n\t\t\treturn push_inst(compiler, SUBFC | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1));\n\t\treturn push_inst(compiler, SUBF | RC(flags) | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_SUBC:\n\t\tBIN_EXTS();\n\t\treturn push_inst(compiler, SUBFE | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_MUL:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, MULLI | D(dst) | A(src1) | compiler->imm);\n\t\t}\n\t\tBIN_EXTS();\n\t\tif (flags & ALT_FORM2)\n\t\t\treturn push_inst(compiler, MULLW | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1));\n\t\treturn push_inst(compiler, MULLD | OE(flags) | RC(flags) | D(dst) | A(src2) | B(src1));\n\n\tcase SLJIT_AND:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ANDI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ANDIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\treturn push_inst(compiler, AND | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_OR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ORI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, ORIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tFAIL_IF(push_inst(compiler, ORI | S(src1) | A(dst) | IMM(compiler->imm)));\n\t\t\treturn push_inst(compiler, ORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16));\n\t\t}\n\t\treturn push_inst(compiler, OR | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_XOR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, XORI | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM2) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\treturn push_inst(compiler, XORIS | S(src1) | A(dst) | compiler->imm);\n\t\t}\n\t\tif (flags & ALT_FORM3) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tFAIL_IF(push_inst(compiler, XORI | S(src1) | A(dst) | IMM(compiler->imm)));\n\t\t\treturn push_inst(compiler, XORIS | S(dst) | A(dst) | IMM(compiler->imm >> 16));\n\t\t}\n\t\treturn push_inst(compiler, XOR | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_SHL:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tif (flags & ALT_FORM2) {\n\t\t\t\tcompiler->imm &= 0x1f;\n\t\t\t\treturn push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11) | ((31 - compiler->imm) << 1));\n\t\t\t}\n\t\t\tcompiler->imm &= 0x3f;\n\t\t\treturn push_inst(compiler, RLDI(dst, src1, compiler->imm, 63 - compiler->imm, 1) | RC(flags));\n\t\t}\n\t\treturn push_inst(compiler, ((flags & ALT_FORM2) ? SLW : SLD) | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_LSHR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tif (flags & ALT_FORM2) {\n\t\t\t\tcompiler->imm &= 0x1f;\n\t\t\t\treturn push_inst(compiler, RLWINM | RC(flags) | S(src1) | A(dst) | (((32 - compiler->imm) & 0x1f) << 11) | (compiler->imm << 6) | (31 << 1));\n\t\t\t}\n\t\t\tcompiler->imm &= 0x3f;\n\t\t\treturn push_inst(compiler, RLDI(dst, src1, 64 - compiler->imm, compiler->imm, 0) | RC(flags));\n\t\t}\n\t\treturn push_inst(compiler, ((flags & ALT_FORM2) ? SRW : SRD) | RC(flags) | S(src1) | A(dst) | B(src2));\n\n\tcase SLJIT_ASHR:\n\t\tif (flags & ALT_FORM1) {\n\t\t\tSLJIT_ASSERT(src2 == TMP_REG2);\n\t\t\tif (flags & ALT_FORM2) {\n\t\t\t\tcompiler->imm &= 0x1f;\n\t\t\t\treturn push_inst(compiler, SRAWI | RC(flags) | S(src1) | A(dst) | (compiler->imm << 11));\n\t\t\t}\n\t\t\tcompiler->imm &= 0x3f;\n\t\t\treturn push_inst(compiler, SRADI | RC(flags) | S(src1) | A(dst) | ((compiler->imm & 0x1f) << 11) | ((compiler->imm & 0x20) >> 4));\n\t\t}\n\t\treturn push_inst(compiler, ((flags & ALT_FORM2) ? SRAW : SRAD) | RC(flags) | S(src1) | A(dst) | B(src2));\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src)\n{\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 word_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_s32 reg = 0;\n\n\tif (src)\n\t\treg = *src & REG_MASK;\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count++;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count++;\n\t\t\tword_arg_count++;\n\n\t\t\tif (arg_count != word_arg_count && arg_count == reg) {\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(reg) | A(TMP_CALL_REG) | B(reg)));\n\t\t\t\t*src = TMP_CALL_REG;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count--;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (arg_count != word_arg_count)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | S(word_arg_count) | A(arg_count) | B(word_arg_count)));\n\n\t\t\targ_count--;\n\t\t\tword_arg_count--;\n\t\t\tbreak;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value)\n{\n\tFAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 48)));\n\tFAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value >> 32)));\n\tFAIL_IF(PUSH_RLDICR(reg, 31));\n\tFAIL_IF(push_inst(compiler, ORIS | S(reg) | A(reg) | IMM(init_value >> 16)));\n\treturn push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins*)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_target >> 48) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | ((new_target >> 32) & 0xffff);\n\tinst[3] = (inst[3] & 0xffff0000) | ((new_target >> 16) & 0xffff);\n\tinst[4] = (inst[4] & 0xffff0000) | (new_target & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 5);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins*)addr;\n\n\tinst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 48) & 0xffff);\n\tinst[1] = (inst[1] & 0xffff0000) | ((new_constant >> 32) & 0xffff);\n\tinst[3] = (inst[3] & 0xffff0000) | ((new_constant >> 16) & 0xffff);\n\tinst[4] = (inst[4] & 0xffff0000) | (new_constant & 0xffff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 5);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativePPC_common.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n\treturn \"PowerPC\" SLJIT_CPUINFO;\n}\n\n/* Length of an instruction word.\n   Both for ppc-32 and ppc-64. */\ntypedef sljit_u32 sljit_ins;\n\n#if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \\\n\t|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define SLJIT_PPC_STACK_FRAME_V2 1\n#endif\n\n#ifdef _AIX\n#include <sys/cache.h>\n#endif\n\n#if (defined _CALL_ELF && _CALL_ELF == 2)\n#define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1\n#endif\n\n#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)\n\nstatic void ppc_cache_flush(sljit_ins *from, sljit_ins *to)\n{\n#ifdef _AIX\n\t_sync_cache_range((caddr_t)from, (int)((size_t)to - (size_t)from));\n#elif defined(__GNUC__) || (defined(__IBM_GCC_ASM) && __IBM_GCC_ASM)\n#\tif defined(_ARCH_PWR) || defined(_ARCH_PWR2)\n\t/* Cache flush for POWER architecture. */\n\twhile (from < to) {\n\t\t__asm__ volatile (\n\t\t\t\"clf 0, %0\\n\"\n\t\t\t\"dcs\\n\"\n\t\t\t: : \"r\"(from)\n\t\t);\n\t\tfrom++;\n\t}\n\t__asm__ volatile ( \"ics\" );\n#\telif defined(_ARCH_COM) && !defined(_ARCH_PPC)\n#\terror \"Cache flush is not implemented for PowerPC/POWER common mode.\"\n#\telse\n\t/* Cache flush for PowerPC architecture. */\n\twhile (from < to) {\n\t\t__asm__ volatile (\n\t\t\t\"dcbf 0, %0\\n\"\n\t\t\t\"sync\\n\"\n\t\t\t\"icbi 0, %0\\n\"\n\t\t\t: : \"r\"(from)\n\t\t);\n\t\tfrom++;\n\t}\n\t__asm__ volatile ( \"isync\" );\n#\tendif\n#\tifdef __xlc__\n#\twarning \"This file may fail to compile if -qfuncsect is used\"\n#\tendif\n#elif defined(__xlc__)\n#error \"Please enable GCC syntax for inline assembly statements with -qasm=gcc\"\n#else\n#error \"This platform requires a cache flush implementation.\"\n#endif /* _AIX */\n}\n\n#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */\n\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_ZERO\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)\n#define TMP_CALL_REG\t(SLJIT_NUMBER_OF_REGISTERS + 5)\n#else\n#define TMP_CALL_REG\tTMP_REG2\n#endif\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = {\n\t0, 3, 4, 5, 6, 7, 8, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 9, 10, 31, 12\n};\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 1, 2, 3, 4, 5, 6, 0, 7\n};\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n#define D(d)\t\t(reg_map[d] << 21)\n#define S(s)\t\t(reg_map[s] << 21)\n#define A(a)\t\t(reg_map[a] << 16)\n#define B(b)\t\t(reg_map[b] << 11)\n#define C(c)\t\t(reg_map[c] << 6)\n#define FD(fd)\t\t(freg_map[fd] << 21)\n#define FS(fs)\t\t(freg_map[fs] << 21)\n#define FA(fa)\t\t(freg_map[fa] << 16)\n#define FB(fb)\t\t(freg_map[fb] << 11)\n#define FC(fc)\t\t(freg_map[fc] << 6)\n#define IMM(imm)\t((imm) & 0xffff)\n#define CRD(d)\t\t((d) << 21)\n\n/* Instruction bit sections.\n   OE and Rc flag (see ALT_SET_FLAGS). */\n#define OE(flags)\t((flags) & ALT_SET_FLAGS)\n/* Rc flag (see ALT_SET_FLAGS). */\n#define RC(flags)\t(((flags) & ALT_SET_FLAGS) >> 10)\n#define HI(opcode)\t((opcode) << 26)\n#define LO(opcode)\t((opcode) << 1)\n\n#define ADD\t\t(HI(31) | LO(266))\n#define ADDC\t\t(HI(31) | LO(10))\n#define ADDE\t\t(HI(31) | LO(138))\n#define ADDI\t\t(HI(14))\n#define ADDIC\t\t(HI(13))\n#define ADDIS\t\t(HI(15))\n#define ADDME\t\t(HI(31) | LO(234))\n#define AND\t\t(HI(31) | LO(28))\n#define ANDI\t\t(HI(28))\n#define ANDIS\t\t(HI(29))\n#define Bx\t\t(HI(18))\n#define BCx\t\t(HI(16))\n#define BCCTR\t\t(HI(19) | LO(528) | (3 << 11))\n#define BLR\t\t(HI(19) | LO(16) | (0x14 << 21))\n#define CNTLZD\t\t(HI(31) | LO(58))\n#define CNTLZW\t\t(HI(31) | LO(26))\n#define CMP\t\t(HI(31) | LO(0))\n#define CMPI\t\t(HI(11))\n#define CMPL\t\t(HI(31) | LO(32))\n#define CMPLI\t\t(HI(10))\n#define CROR\t\t(HI(19) | LO(449))\n#define DCBT\t\t(HI(31) | LO(278))\n#define DIVD\t\t(HI(31) | LO(489))\n#define DIVDU\t\t(HI(31) | LO(457))\n#define DIVW\t\t(HI(31) | LO(491))\n#define DIVWU\t\t(HI(31) | LO(459))\n#define EXTSB\t\t(HI(31) | LO(954))\n#define EXTSH\t\t(HI(31) | LO(922))\n#define EXTSW\t\t(HI(31) | LO(986))\n#define FABS\t\t(HI(63) | LO(264))\n#define FADD\t\t(HI(63) | LO(21))\n#define FADDS\t\t(HI(59) | LO(21))\n#define FCFID\t\t(HI(63) | LO(846))\n#define FCMPU\t\t(HI(63) | LO(0))\n#define FCTIDZ\t\t(HI(63) | LO(815))\n#define FCTIWZ\t\t(HI(63) | LO(15))\n#define FDIV\t\t(HI(63) | LO(18))\n#define FDIVS\t\t(HI(59) | LO(18))\n#define FMR\t\t(HI(63) | LO(72))\n#define FMUL\t\t(HI(63) | LO(25))\n#define FMULS\t\t(HI(59) | LO(25))\n#define FNEG\t\t(HI(63) | LO(40))\n#define FRSP\t\t(HI(63) | LO(12))\n#define FSUB\t\t(HI(63) | LO(20))\n#define FSUBS\t\t(HI(59) | LO(20))\n#define LD\t\t(HI(58) | 0)\n#define LWZ\t\t(HI(32))\n#define MFCR\t\t(HI(31) | LO(19))\n#define MFLR\t\t(HI(31) | LO(339) | 0x80000)\n#define MFXER\t\t(HI(31) | LO(339) | 0x10000)\n#define MTCTR\t\t(HI(31) | LO(467) | 0x90000)\n#define MTLR\t\t(HI(31) | LO(467) | 0x80000)\n#define MTXER\t\t(HI(31) | LO(467) | 0x10000)\n#define MULHD\t\t(HI(31) | LO(73))\n#define MULHDU\t\t(HI(31) | LO(9))\n#define MULHW\t\t(HI(31) | LO(75))\n#define MULHWU\t\t(HI(31) | LO(11))\n#define MULLD\t\t(HI(31) | LO(233))\n#define MULLI\t\t(HI(7))\n#define MULLW\t\t(HI(31) | LO(235))\n#define NEG\t\t(HI(31) | LO(104))\n#define NOP\t\t(HI(24))\n#define NOR\t\t(HI(31) | LO(124))\n#define OR\t\t(HI(31) | LO(444))\n#define ORI\t\t(HI(24))\n#define ORIS\t\t(HI(25))\n#define RLDICL\t\t(HI(30))\n#define RLWINM\t\t(HI(21))\n#define SLD\t\t(HI(31) | LO(27))\n#define SLW\t\t(HI(31) | LO(24))\n#define SRAD\t\t(HI(31) | LO(794))\n#define SRADI\t\t(HI(31) | LO(413 << 1))\n#define SRAW\t\t(HI(31) | LO(792))\n#define SRAWI\t\t(HI(31) | LO(824))\n#define SRD\t\t(HI(31) | LO(539))\n#define SRW\t\t(HI(31) | LO(536))\n#define STD\t\t(HI(62) | 0)\n#define STDU\t\t(HI(62) | 1)\n#define STDUX\t\t(HI(31) | LO(181))\n#define STFIWX\t\t(HI(31) | LO(983))\n#define STW\t\t(HI(36))\n#define STWU\t\t(HI(37))\n#define STWUX\t\t(HI(31) | LO(183))\n#define SUBF\t\t(HI(31) | LO(40))\n#define SUBFC\t\t(HI(31) | LO(8))\n#define SUBFE\t\t(HI(31) | LO(136))\n#define SUBFIC\t\t(HI(8))\n#define XOR\t\t(HI(31) | LO(316))\n#define XORI\t\t(HI(26))\n#define XORIS\t\t(HI(27))\n\n#define SIMM_MAX\t(0x7fff)\n#define SIMM_MIN\t(-0x8000)\n#define UIMM_MAX\t(0xffff)\n\n#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct sljit_function_context* context, sljit_sw addr, void* func)\n{\n\tsljit_sw* ptrs;\n\tif (func_ptr)\n\t\t*func_ptr = (void*)context;\n\tptrs = (sljit_sw*)func;\n\tcontext->addr = addr ? addr : ptrs[0];\n\tcontext->r2 = ptrs[1];\n\tcontext->r11 = ptrs[2];\n}\n#endif\n\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)\n{\n\tsljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\tsljit_uw target_addr;\n\tsljit_sw extra_jump_flags;\n\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\tif (jump->flags & (SLJIT_REWRITABLE_JUMP | IS_CALL))\n\t\treturn 0;\n#else\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn 0;\n#endif\n\n\tif (jump->flags & JUMP_ADDR)\n\t\ttarget_addr = jump->u.target;\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\ttarget_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset;\n\t}\n\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL) && (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (jump->flags & IS_CALL)\n\t\tgoto keep_address;\n#endif\n\n\tdiff = ((sljit_sw)target_addr - (sljit_sw)(code_ptr) - executable_offset) & ~0x3l;\n\n\textra_jump_flags = 0;\n\tif (jump->flags & IS_COND) {\n\t\tif (diff <= 0x7fff && diff >= -0x8000) {\n\t\t\tjump->flags |= PATCH_B;\n\t\t\treturn 1;\n\t\t}\n\t\tif (target_addr <= 0xffff) {\n\t\t\tjump->flags |= PATCH_B | PATCH_ABS_B;\n\t\t\treturn 1;\n\t\t}\n\t\textra_jump_flags = REMOVE_COND;\n\n\t\tdiff -= sizeof(sljit_ins);\n\t}\n\n\tif (diff <= 0x01ffffff && diff >= -0x02000000) {\n\t\tjump->flags |= PATCH_B | extra_jump_flags;\n\t\treturn 1;\n\t}\n\n\tif (target_addr <= 0x03ffffff) {\n\t\tjump->flags |= PATCH_B | PATCH_ABS_B | extra_jump_flags;\n\t\treturn 1;\n\t}\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)\nkeep_address:\n#endif\n\tif (target_addr <= 0x7fffffff) {\n\t\tjump->flags |= PATCH_ABS32;\n\t\treturn 1;\n\t}\n\n\tif (target_addr <= 0x7fffffffffffl) {\n\t\tjump->flags |= PATCH_ABS48;\n\t\treturn 1;\n\t}\n#endif\n\n\treturn 0;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_ins *code;\n\tsljit_ins *code_ptr;\n\tsljit_ins *buf_ptr;\n\tsljit_ins *buf_end;\n\tsljit_uw word_count;\n\tsljit_sw executable_offset;\n\tsljit_uw addr;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tcompiler->size += (compiler->size & 0x1) + (sizeof(struct sljit_function_context) / sizeof(sljit_ins));\n#else\n\tcompiler->size += (sizeof(struct sljit_function_context) / sizeof(sljit_ins));\n#endif\n#endif\n\tcode = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tword_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tdo {\n\t\tbuf_ptr = (sljit_ins*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 2);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tif (label && label->size == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\t\t\tif (jump && jump->addr == word_count) {\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 3);\n#else\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 6);\n#endif\n\t\t\t\tif (detect_jump_type(jump, code_ptr, code, executable_offset)) {\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\t\t\t\t\tcode_ptr[-3] = code_ptr[0];\n\t\t\t\t\tcode_ptr -= 3;\n#else\n\t\t\t\t\tif (jump->flags & PATCH_ABS32) {\n\t\t\t\t\t\tcode_ptr -= 3;\n\t\t\t\t\t\tcode_ptr[-1] = code_ptr[2];\n\t\t\t\t\t\tcode_ptr[0] = code_ptr[3];\n\t\t\t\t\t}\n\t\t\t\t\telse if (jump->flags & PATCH_ABS48) {\n\t\t\t\t\t\tcode_ptr--;\n\t\t\t\t\t\tcode_ptr[-1] = code_ptr[0];\n\t\t\t\t\t\tcode_ptr[0] = code_ptr[1];\n\t\t\t\t\t\t/* rldicr rX,rX,32,31 -> rX,rX,16,47 */\n\t\t\t\t\t\tSLJIT_ASSERT((code_ptr[-3] & 0xfc00ffff) == 0x780007c6);\n\t\t\t\t\t\tcode_ptr[-3] ^= 0x8422;\n\t\t\t\t\t\t/* oris -> ori */\n\t\t\t\t\t\tcode_ptr[-2] ^= 0x4000000;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcode_ptr[-6] = code_ptr[0];\n\t\t\t\t\t\tcode_ptr -= 6;\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tif (jump->flags & REMOVE_COND) {\n\t\t\t\t\t\tcode_ptr[0] = BCx | (2 << 2) | ((code_ptr[0] ^ (8 << 21)) & 0x03ff0001);\n\t\t\t\t\t\tcode_ptr++;\n\t\t\t\t\t\tjump->addr += sizeof(sljit_ins);\n\t\t\t\t\t\tcode_ptr[0] = Bx;\n\t\t\t\t\t\tjump->flags -= IS_COND;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tjump = jump->next;\n\t\t\t}\n\t\t\tif (const_ && const_->addr == word_count) {\n\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\t\t\tcode_ptr ++;\n\t\t\tword_count ++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == word_count) {\n\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size - (sizeof(struct sljit_function_context) / sizeof(sljit_ins)));\n#else\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);\n#endif\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tdo {\n\t\t\taddr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n\t\t\tbuf_ptr = (sljit_ins *)jump->addr;\n\n\t\t\tif (jump->flags & PATCH_B) {\n\t\t\t\tif (jump->flags & IS_COND) {\n\t\t\t\t\tif (!(jump->flags & PATCH_ABS_B)) {\n\t\t\t\t\t\taddr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset);\n\t\t\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= 0x7fff && (sljit_sw)addr >= -0x8000);\n\t\t\t\t\t\t*buf_ptr = BCx | (addr & 0xfffc) | ((*buf_ptr) & 0x03ff0001);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tSLJIT_ASSERT(addr <= 0xffff);\n\t\t\t\t\t\t*buf_ptr = BCx | (addr & 0xfffc) | 0x2 | ((*buf_ptr) & 0x03ff0001);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (!(jump->flags & PATCH_ABS_B)) {\n\t\t\t\t\t\taddr -= (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset);\n\t\t\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= 0x01ffffff && (sljit_sw)addr >= -0x02000000);\n\t\t\t\t\t\t*buf_ptr = Bx | (addr & 0x03fffffc) | ((*buf_ptr) & 0x1);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tSLJIT_ASSERT(addr <= 0x03ffffff);\n\t\t\t\t\t\t*buf_ptr = Bx | (addr & 0x03fffffc) | 0x2 | ((*buf_ptr) & 0x1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* Set the fields of immediate loads. */\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);\n#else\n\t\t\tif (jump->flags & PATCH_ABS32) {\n\t\t\t\tSLJIT_ASSERT(addr <= 0x7fffffff);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (jump->flags & PATCH_ABS48) {\n\t\t\t\tSLJIT_ASSERT(addr <= 0x7fffffffffff);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 32) & 0xffff);\n\t\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\t\tbuf_ptr[3] = (buf_ptr[3] & 0xffff0000) | (addr & 0xffff);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 48) & 0xffff);\n\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xffff0000) | ((addr >> 32) & 0xffff);\n\t\t\tbuf_ptr[3] = (buf_ptr[3] & 0xffff0000) | ((addr >> 16) & 0xffff);\n\t\t\tbuf_ptr[4] = (buf_ptr[4] & 0xffff0000) | (addr & 0xffff);\n#endif\n\t\t} while (0);\n\t\tjump = jump->next;\n\t}\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);\n\n\tcode = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\n#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (((sljit_sw)code_ptr) & 0x4)\n\t\tcode_ptr++;\n#endif\n\tsljit_set_function_context(NULL, (struct sljit_function_context*)code_ptr, (sljit_sw)code, (void*)sljit_generate_code);\n#endif\n\n\tcode_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\n#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)\n\treturn code_ptr;\n#else\n\treturn code;\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#else\n\t\t/* Available by default. */\n\t\treturn 1;\n#endif\n\n\tcase SLJIT_HAS_CLZ:\n\t\treturn 1;\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\n/* inp_flags: */\n\n/* Creates an index in data_transfer_insts array. */\n#define LOAD_DATA\t0x01\n#define INDEXED\t\t0x02\n#define SIGNED_DATA\t0x04\n\n#define WORD_DATA\t0x00\n#define BYTE_DATA\t0x08\n#define HALF_DATA\t0x10\n#define INT_DATA\t0x18\n/* Separates integer and floating point registers */\n#define GPR_REG\t\t0x1f\n#define DOUBLE_DATA\t0x20\n\n#define MEM_MASK\t0x7f\n\n/* Other inp_flags. */\n\n/* Integer opertion and set flags -> requires exts on 64 bit systems. */\n#define ALT_SIGN_EXT\t0x000100\n/* This flag affects the RC() and OERC() macros. */\n#define ALT_SET_FLAGS\t0x000400\n#define ALT_FORM1\t0x001000\n#define ALT_FORM2\t0x002000\n#define ALT_FORM3\t0x004000\n#define ALT_FORM4\t0x008000\n#define ALT_FORM5\t0x010000\n\n/* Source and destination is register. */\n#define REG_DEST\t0x000001\n#define REG1_SOURCE\t0x000002\n#define REG2_SOURCE\t0x000004\n/*\nALT_SIGN_EXT\t\t0x000100\nALT_SET_FLAGS\t\t0x000200\nALT_FORM1\t\t0x001000\n...\nALT_FORM5\t\t0x010000 */\n\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n#include \"sljitNativePPC_32.c\"\n#else\n#include \"sljitNativePPC_64.c\"\n#endif\n\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n#define STACK_STORE\tSTW\n#define STACK_LOAD\tLWZ\n#else\n#define STACK_STORE\tSTD\n#define STACK_LOAD\tLD\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, i, tmp, offs;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tFAIL_IF(push_inst(compiler, MFLR | D(0)));\n\toffs = -(sljit_s32)(sizeof(sljit_sw));\n\tFAIL_IF(push_inst(compiler, STACK_STORE | S(TMP_ZERO) | A(SLJIT_SP) | IMM(offs)));\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\toffs -= (sljit_s32)(sizeof(sljit_sw));\n\t\tFAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs)));\n\t}\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\toffs -= (sljit_s32)(sizeof(sljit_sw));\n\t\tFAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs)));\n\t}\n\n\tSLJIT_ASSERT(offs == -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1));\n\n#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)\n\tFAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw))));\n#else\n\tFAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw))));\n#endif\n\n\tFAIL_IF(push_inst(compiler, ADDI | D(TMP_ZERO) | A(0) | 0));\n\n\targs = get_arg_count(arg_types);\n\n\tif (args >= 1)\n\t\tFAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(SLJIT_S0) | B(SLJIT_R0)));\n\tif (args >= 2)\n\t\tFAIL_IF(push_inst(compiler, OR | S(SLJIT_R1) | A(SLJIT_S1) | B(SLJIT_R1)));\n\tif (args >= 3)\n\t\tFAIL_IF(push_inst(compiler, OR | S(SLJIT_R2) | A(SLJIT_S2) | B(SLJIT_R2)));\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;\n\tlocal_size = (local_size + 15) & ~0xf;\n\tcompiler->local_size = local_size;\n\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\tif (local_size <= SIMM_MAX)\n\t\tFAIL_IF(push_inst(compiler, STWU | S(SLJIT_SP) | A(SLJIT_SP) | IMM(-local_size)));\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, 0, -local_size));\n\t\tFAIL_IF(push_inst(compiler, STWUX | S(SLJIT_SP) | A(SLJIT_SP) | B(0)));\n\t}\n#else\n\tif (local_size <= SIMM_MAX)\n\t\tFAIL_IF(push_inst(compiler, STDU | S(SLJIT_SP) | A(SLJIT_SP) | IMM(-local_size)));\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, 0, -local_size));\n\t\tFAIL_IF(push_inst(compiler, STDUX | S(SLJIT_SP) | A(SLJIT_SP) | B(0)));\n\t}\n#endif\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;\n\tcompiler->local_size = (local_size + 15) & ~0xf;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 i, tmp, offs;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tif (compiler->local_size <= SIMM_MAX)\n\t\tFAIL_IF(push_inst(compiler, ADDI | D(SLJIT_SP) | A(SLJIT_SP) | IMM(compiler->local_size)));\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, 0, compiler->local_size));\n\t\tFAIL_IF(push_inst(compiler, ADD | D(SLJIT_SP) | A(SLJIT_SP) | B(0)));\n\t}\n\n#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)\n\tFAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw))));\n#else\n\tFAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw))));\n#endif\n\n\toffs = -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1);\n\n\ttmp = compiler->scratches;\n\tfor (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {\n\t\tFAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs)));\n\t\toffs += (sljit_s32)(sizeof(sljit_sw));\n\t}\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = tmp; i <= SLJIT_S0; i++) {\n\t\tFAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs)));\n\t\toffs += (sljit_s32)(sizeof(sljit_sw));\n\t}\n\n\tFAIL_IF(push_inst(compiler, STACK_LOAD | D(TMP_ZERO) | A(SLJIT_SP) | IMM(offs)));\n\tSLJIT_ASSERT(offs == -(sljit_sw)(sizeof(sljit_sw)));\n\n\tFAIL_IF(push_inst(compiler, MTLR | S(0)));\n\tFAIL_IF(push_inst(compiler, BLR));\n\n\treturn SLJIT_SUCCESS;\n}\n\n#undef STACK_STORE\n#undef STACK_LOAD\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n/* s/l - store/load (1 bit)\n   i/x - immediate/indexed form\n   u/s - signed/unsigned (1 bit)\n   w/b/h/i - word/byte/half/int allowed (2 bit)\n\n   Some opcodes are repeated (e.g. store signed / unsigned byte is the same instruction). */\n\n/* 64 bit only: [reg+imm] must be aligned to 4 bytes. */\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define INT_ALIGNED\t0x10000\n#endif\n\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n#define ARCH_32_64(a, b)\ta\n#define INST_CODE_AND_DST(inst, flags, reg) \\\n\t((inst) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)))\n#else\n#define ARCH_32_64(a, b)\tb\n#define INST_CODE_AND_DST(inst, flags, reg) \\\n\t(((inst) & ~INT_ALIGNED) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)))\n#endif\n\nstatic const sljit_ins data_transfer_insts[64 + 16] = {\n\n/* -------- Integer -------- */\n\n/* Word. */\n\n/* w u i s */ ARCH_32_64(HI(36) /* stw */, HI(62) | INT_ALIGNED | 0x0 /* std */),\n/* w u i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x0 /* ld */),\n/* w u x s */ ARCH_32_64(HI(31) | LO(151) /* stwx */, HI(31) | LO(149) /* stdx */),\n/* w u x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(21) /* ldx */),\n\n/* w s i s */ ARCH_32_64(HI(36) /* stw */, HI(62) | INT_ALIGNED | 0x0 /* std */),\n/* w s i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x0 /* ld */),\n/* w s x s */ ARCH_32_64(HI(31) | LO(151) /* stwx */, HI(31) | LO(149) /* stdx */),\n/* w s x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(21) /* ldx */),\n\n/* Byte. */\n\n/* b u i s */ HI(38) /* stb */,\n/* b u i l */ HI(34) /* lbz */,\n/* b u x s */ HI(31) | LO(215) /* stbx */,\n/* b u x l */ HI(31) | LO(87) /* lbzx */,\n\n/* b s i s */ HI(38) /* stb */,\n/* b s i l */ HI(34) /* lbz */ /* EXTS_REQ */,\n/* b s x s */ HI(31) | LO(215) /* stbx */,\n/* b s x l */ HI(31) | LO(87) /* lbzx */ /* EXTS_REQ */,\n\n/* Half. */\n\n/* h u i s */ HI(44) /* sth */,\n/* h u i l */ HI(40) /* lhz */,\n/* h u x s */ HI(31) | LO(407) /* sthx */,\n/* h u x l */ HI(31) | LO(279) /* lhzx */,\n\n/* h s i s */ HI(44) /* sth */,\n/* h s i l */ HI(42) /* lha */,\n/* h s x s */ HI(31) | LO(407) /* sthx */,\n/* h s x l */ HI(31) | LO(343) /* lhax */,\n\n/* Int. */\n\n/* i u i s */ HI(36) /* stw */,\n/* i u i l */ HI(32) /* lwz */,\n/* i u x s */ HI(31) | LO(151) /* stwx */,\n/* i u x l */ HI(31) | LO(23) /* lwzx */,\n\n/* i s i s */ HI(36) /* stw */,\n/* i s i l */ ARCH_32_64(HI(32) /* lwz */, HI(58) | INT_ALIGNED | 0x2 /* lwa */),\n/* i s x s */ HI(31) | LO(151) /* stwx */,\n/* i s x l */ ARCH_32_64(HI(31) | LO(23) /* lwzx */, HI(31) | LO(341) /* lwax */),\n\n/* -------- Floating point -------- */\n\n/* d   i s */ HI(54) /* stfd */,\n/* d   i l */ HI(50) /* lfd */,\n/* d   x s */ HI(31) | LO(727) /* stfdx */,\n/* d   x l */ HI(31) | LO(599) /* lfdx */,\n\n/* s   i s */ HI(52) /* stfs */,\n/* s   i l */ HI(48) /* lfs */,\n/* s   x s */ HI(31) | LO(663) /* stfsx */,\n/* s   x l */ HI(31) | LO(535) /* lfsx */,\n};\n\nstatic const sljit_ins updated_data_transfer_insts[64] = {\n\n/* -------- Integer -------- */\n\n/* Word. */\n\n/* w u i s */ ARCH_32_64(HI(37) /* stwu */, HI(62) | INT_ALIGNED | 0x1 /* stdu */),\n/* w u i l */ ARCH_32_64(HI(33) /* lwzu */, HI(58) | INT_ALIGNED | 0x1 /* ldu */),\n/* w u x s */ ARCH_32_64(HI(31) | LO(183) /* stwux */, HI(31) | LO(181) /* stdux */),\n/* w u x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(53) /* ldux */),\n\n/* w s i s */ ARCH_32_64(HI(37) /* stwu */, HI(62) | INT_ALIGNED | 0x1 /* stdu */),\n/* w s i l */ ARCH_32_64(HI(33) /* lwzu */, HI(58) | INT_ALIGNED | 0x1 /* ldu */),\n/* w s x s */ ARCH_32_64(HI(31) | LO(183) /* stwux */, HI(31) | LO(181) /* stdux */),\n/* w s x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(53) /* ldux */),\n\n/* Byte. */\n\n/* b u i s */ HI(39) /* stbu */,\n/* b u i l */ HI(35) /* lbzu */,\n/* b u x s */ HI(31) | LO(247) /* stbux */,\n/* b u x l */ HI(31) | LO(119) /* lbzux */,\n\n/* b s i s */ HI(39) /* stbu */,\n/* b s i l */ 0 /* no such instruction */,\n/* b s x s */ HI(31) | LO(247) /* stbux */,\n/* b s x l */ 0 /* no such instruction */,\n\n/* Half. */\n\n/* h u i s */ HI(45) /* sthu */,\n/* h u i l */ HI(41) /* lhzu */,\n/* h u x s */ HI(31) | LO(439) /* sthux */,\n/* h u x l */ HI(31) | LO(311) /* lhzux */,\n\n/* h s i s */ HI(45) /* sthu */,\n/* h s i l */ HI(43) /* lhau */,\n/* h s x s */ HI(31) | LO(439) /* sthux */,\n/* h s x l */ HI(31) | LO(375) /* lhaux */,\n\n/* Int. */\n\n/* i u i s */ HI(37) /* stwu */,\n/* i u i l */ HI(33) /* lwzu */,\n/* i u x s */ HI(31) | LO(183) /* stwux */,\n/* i u x l */ HI(31) | LO(55) /* lwzux */,\n\n/* i s i s */ HI(37) /* stwu */,\n/* i s i l */ ARCH_32_64(HI(33) /* lwzu */, 0 /* no such instruction */),\n/* i s x s */ HI(31) | LO(183) /* stwux */,\n/* i s x l */ ARCH_32_64(HI(31) | LO(55) /* lwzux */, HI(31) | LO(373) /* lwaux */),\n\n/* -------- Floating point -------- */\n\n/* d   i s */ HI(55) /* stfdu */,\n/* d   i l */ HI(51) /* lfdu */,\n/* d   x s */ HI(31) | LO(759) /* stfdux */,\n/* d   x l */ HI(31) | LO(631) /* lfdux */,\n\n/* s   i s */ HI(53) /* stfsu */,\n/* s   i l */ HI(49) /* lfsu */,\n/* s   x s */ HI(31) | LO(695) /* stfsux */,\n/* s   x l */ HI(31) | LO(567) /* lfsux */,\n};\n\n#undef ARCH_32_64\n\n/* Simple cases, (no caching is required). */\nstatic sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg,\n\tsljit_s32 arg, sljit_sw argw, sljit_s32 tmp_reg)\n{\n\tsljit_ins inst;\n\tsljit_s32 offs_reg;\n\tsljit_sw high_short;\n\n\t/* Should work when (arg & REG_MASK) == 0. */\n\tSLJIT_ASSERT(A(0) == 0);\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\t\toffs_reg = OFFS_REG(arg);\n\n\t\tif (argw != 0) {\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\t\t\tFAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(arg)) | A(tmp_reg) | (argw << 11) | ((31 - argw) << 1)));\n#else\n\t\t\tFAIL_IF(push_inst(compiler, RLDI(tmp_reg, OFFS_REG(arg), argw, 63 - argw, 1)));\n#endif\n\t\t\toffs_reg = tmp_reg;\n\t\t}\n\n\t\tinst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK];\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tSLJIT_ASSERT(!(inst & INT_ALIGNED));\n#endif\n\n\t\treturn push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg & REG_MASK) | B(offs_reg));\n\t}\n\n\tinst = data_transfer_insts[inp_flags & MEM_MASK];\n\targ &= REG_MASK;\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif ((inst & INT_ALIGNED) && (argw & 0x3) != 0) {\n\t\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\n\t\tinst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK];\n\t\treturn push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | B(tmp_reg));\n\t}\n#endif\n\n\tif (argw <= SIMM_MAX && argw >= SIMM_MIN)\n\t\treturn push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | IMM(argw));\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (argw <= 0x7fff7fffl && argw >= -0x80000000l) {\n#endif\n\n\t\thigh_short = (sljit_s32)(argw + ((argw & 0x8000) << 1)) & ~0xffff;\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tSLJIT_ASSERT(high_short && high_short <= 0x7fffffffl && high_short >= -0x80000000l);\n#else\n\t\tSLJIT_ASSERT(high_short);\n#endif\n\n\t\tFAIL_IF(push_inst(compiler, ADDIS | D(tmp_reg) | A(arg) | IMM(high_short >> 16)));\n\t\treturn push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(tmp_reg) | IMM(argw));\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t}\n\n\t/* The rest is PPC-64 only. */\n\n\tFAIL_IF(load_immediate(compiler, tmp_reg, argw));\n\n\tinst = data_transfer_insts[(inp_flags | INDEXED) & MEM_MASK];\n\treturn push_inst(compiler, INST_CODE_AND_DST(inst, inp_flags, reg) | A(arg) | B(tmp_reg));\n#endif\n}\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 input_flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* arg1 goes to TMP_REG1 or src reg\n\t   arg2 goes to TMP_REG2, imm or src reg\n\t   result goes to TMP_REG2, so put result can use TMP_REG1. */\n\tsljit_s32 dst_r = TMP_REG2;\n\tsljit_s32 src1_r;\n\tsljit_s32 src2_r;\n\tsljit_s32 sugg_src2_r = TMP_REG2;\n\tsljit_s32 flags = input_flags & (ALT_FORM1 | ALT_FORM2 | ALT_FORM3 | ALT_FORM4 | ALT_FORM5 | ALT_SIGN_EXT | ALT_SET_FLAGS);\n\n\t/* Destination check. */\n\tif (SLOW_IS_REG(dst)) {\n\t\tdst_r = dst;\n\t\tflags |= REG_DEST;\n\n\t\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\tsugg_src2_r = dst_r;\n\t}\n\n\t/* Source 1. */\n\tif (FAST_IS_REG(src1)) {\n\t\tsrc1_r = src1;\n\t\tflags |= REG1_SOURCE;\n\t}\n\telse if (src1 & SLJIT_IMM) {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, src1w));\n\t\tsrc1_r = TMP_REG1;\n\t}\n\telse {\n\t\tFAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, TMP_REG1, src1, src1w, TMP_REG1));\n\t\tsrc1_r = TMP_REG1;\n\t}\n\n\t/* Source 2. */\n\tif (FAST_IS_REG(src2)) {\n\t\tsrc2_r = src2;\n\t\tflags |= REG2_SOURCE;\n\n\t\tif (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\tdst_r = src2_r;\n\t}\n\telse if (src2 & SLJIT_IMM) {\n\t\tFAIL_IF(load_immediate(compiler, sugg_src2_r, src2w));\n\t\tsrc2_r = sugg_src2_r;\n\t}\n\telse {\n\t\tFAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, sugg_src2_r, src2, src2w, TMP_REG2));\n\t\tsrc2_r = sugg_src2_r;\n\t}\n\n\tFAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r));\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\n\treturn emit_op_mem(compiler, input_flags, dst_r, dst, dstw, TMP_REG1);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tsljit_s32 int_op = op & SLJIT_I32_OP;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\tcase SLJIT_NOP:\n\t\treturn push_inst(compiler, NOP);\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\t\tFAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0)));\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tFAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));\n\t\treturn push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHDU : MULHD) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));\n#else\n\t\tFAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));\n\t\treturn push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));\n#endif\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\t\tFAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0)));\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tFAIL_IF(push_inst(compiler, (int_op ? (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) : (op == SLJIT_DIVMOD_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)));\n\t\tFAIL_IF(push_inst(compiler, (int_op ? MULLW : MULLD) | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));\n#else\n\t\tFAIL_IF(push_inst(compiler, (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)));\n\t\tFAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));\n#endif\n\t\treturn push_inst(compiler, SUBF | D(SLJIT_R1) | A(SLJIT_R1) | B(TMP_REG1));\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\treturn push_inst(compiler, (int_op ? (op == SLJIT_DIV_UW ? DIVWU : DIVW) : (op == SLJIT_DIV_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1));\n#else\n\t\treturn push_inst(compiler, (op == SLJIT_DIV_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1));\n#endif\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_prefetch(struct sljit_compiler *compiler,\n        sljit_s32 src, sljit_sw srcw)\n{\n\tif (!(src & OFFS_REG_MASK)) {\n\t\tif (srcw == 0 && (src & REG_MASK) != SLJIT_UNUSED)\n\t\t\treturn push_inst(compiler, DCBT | A(0) | B(src & REG_MASK));\n\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\t/* Works with SLJIT_MEM0() case as well. */\n\t\treturn push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));\n\t}\n\n\tsrcw &= 0x3;\n\n\tif (srcw == 0)\n\t\treturn push_inst(compiler, DCBT | A(src & REG_MASK) | B(OFFS_REG(src)));\n\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\tFAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(src)) | A(TMP_REG1) | (srcw << 11) | ((31 - srcw) << 1)));\n#else\n\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG1, OFFS_REG(src), srcw, 63 - srcw, 1)));\n#endif\n\treturn push_inst(compiler, DCBT | A(src & REG_MASK) | B(TMP_REG1));\n}\n\n#define EMIT_MOV(type, type_flags, type_cast) \\\n\temit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw)\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 flags = HAS_FLAGS(op) ? ALT_SET_FLAGS : 0;\n\tsljit_s32 op_flags = GET_ALL_FLAGS(op);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM))\n\t\t\treturn emit_prefetch(compiler, src, srcw);\n\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\top = GET_OPCODE(op);\n\tif ((src & SLJIT_IMM) && srcw == 0)\n\t\tsrc = TMP_ZERO;\n\n\tif (GET_FLAG_TYPE(op_flags) == SLJIT_OVERFLOW)\n\t\tFAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));\n\n\tif (op < SLJIT_NOT && FAST_IS_REG(src) && src == dst) {\n\t\tif (!TYPE_CAST_NEEDED(op))\n\t\t\treturn SLJIT_SUCCESS;\n\t}\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (op_flags & SLJIT_I32_OP) {\n\t\tif (op < SLJIT_NOT) {\n\t\t\tif (src & SLJIT_MEM) {\n\t\t\t\tif (op == SLJIT_MOV_S32)\n\t\t\t\t\top = SLJIT_MOV_U32;\n\t\t\t}\n\t\t\telse if (src & SLJIT_IMM) {\n\t\t\t\tif (op == SLJIT_MOV_U32)\n\t\t\t\t\top = SLJIT_MOV_S32;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t/* Most operations expect sign extended arguments. */\n\t\t\tflags |= INT_DATA | SIGNED_DATA;\n\t\t\tif (HAS_FLAGS(op_flags))\n\t\t\t\tflags |= ALT_SIGN_EXT;\n\t\t}\n\t}\n#endif\n\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n#endif\n\t\treturn emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tcase SLJIT_MOV_U32:\n\t\treturn EMIT_MOV(SLJIT_MOV_U32, INT_DATA, (sljit_u32));\n\n\tcase SLJIT_MOV_S32:\n\t\treturn EMIT_MOV(SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, (sljit_s32));\n#endif\n\n\tcase SLJIT_MOV_U8:\n\t\treturn EMIT_MOV(SLJIT_MOV_U8, BYTE_DATA, (sljit_u8));\n\n\tcase SLJIT_MOV_S8:\n\t\treturn EMIT_MOV(SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, (sljit_s8));\n\n\tcase SLJIT_MOV_U16:\n\t\treturn EMIT_MOV(SLJIT_MOV_U16, HALF_DATA, (sljit_u16));\n\n\tcase SLJIT_MOV_S16:\n\t\treturn EMIT_MOV(SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, (sljit_s16));\n\n\tcase SLJIT_NOT:\n\t\treturn emit_op(compiler, SLJIT_NOT, flags, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_NEG:\n\t\treturn emit_op(compiler, SLJIT_NEG, flags | (GET_FLAG_TYPE(op_flags) ? ALT_FORM1 : 0), dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_CLZ:\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\treturn emit_op(compiler, SLJIT_CLZ, flags | (!(op_flags & SLJIT_I32_OP) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw);\n#else\n\t\treturn emit_op(compiler, SLJIT_CLZ, flags, dst, dstw, TMP_REG1, 0, src, srcw);\n#endif\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#undef EMIT_MOV\n\n#define TEST_SL_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && (srcw) <= SIMM_MAX && (srcw) >= SIMM_MIN)\n\n#define TEST_UL_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && !((srcw) & ~0xffff))\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define TEST_SH_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && !((srcw) & 0xffff) && (srcw) <= 0x7fffffffl && (srcw) >= -0x80000000l)\n#else\n#define TEST_SH_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && !((srcw) & 0xffff))\n#endif\n\n#define TEST_UH_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && !((srcw) & ~0xffff0000))\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define TEST_ADD_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && (srcw) <= 0x7fff7fffl && (srcw) >= -0x80000000l)\n#else\n#define TEST_ADD_IMM(src, srcw) \\\n\t((src) & SLJIT_IMM)\n#endif\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define TEST_UI_IMM(src, srcw) \\\n\t(((src) & SLJIT_IMM) && !((srcw) & ~0xffffffff))\n#else\n#define TEST_UI_IMM(src, srcw) \\\n\t((src) & SLJIT_IMM)\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 flags = HAS_FLAGS(op) ? ALT_SET_FLAGS : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\tif ((src1 & SLJIT_IMM) && src1w == 0)\n\t\tsrc1 = TMP_ZERO;\n\tif ((src2 & SLJIT_IMM) && src2w == 0)\n\t\tsrc2 = TMP_ZERO;\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (op & SLJIT_I32_OP) {\n\t\t/* Most operations expect sign extended arguments. */\n\t\tflags |= INT_DATA | SIGNED_DATA;\n\t\tif (src1 & SLJIT_IMM)\n\t\t\tsrc1w = (sljit_s32)(src1w);\n\t\tif (src2 & SLJIT_IMM)\n\t\t\tsrc2w = (sljit_s32)(src2w);\n\t\tif (HAS_FLAGS(op))\n\t\t\tflags |= ALT_SIGN_EXT;\n\t}\n#endif\n\tif (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)\n\t\tFAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD:\n\t\tif (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)\n\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w);\n\n\t\tif (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) {\n\t\t\tif (TEST_SL_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SL_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SH_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = (src2w >> 16) & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SH_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = (src1w >> 16) & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t\t/* Range between -1 and -32768 is covered above. */\n\t\t\tif (TEST_ADD_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w & 0xffffffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_ADD_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w & 0xffffffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\t\tif (HAS_FLAGS(op)) {\n\t\t\tif (TEST_SL_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SL_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\t\treturn emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM4 : 0), dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_ADDC:\n\t\treturn emit_op(compiler, SLJIT_ADDC, flags, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SUB:\n\t\tif (GET_FLAG_TYPE(op) >= SLJIT_LESS && GET_FLAG_TYPE(op) <= SLJIT_LESS_EQUAL) {\n\t\t\tif (dst == SLJIT_UNUSED) {\n\t\t\t\tif (TEST_UL_IMM(src2, src2w)) {\n\t\t\t\t\tcompiler->imm = src2w & 0xffff;\n\t\t\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t\t}\n\t\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w);\n\t\t\t}\n\n\t\t\tif ((src2 & SLJIT_IMM) && src2w >= 0 && src2w <= (SIMM_MAX + 1)) {\n\t\t\t\tcompiler->imm = src2w;\n\t\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w);\n\t\t}\n\n\t\tif (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)\n\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, src2, src2w);\n\n\t\tif (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) {\n\t\t\tif (TEST_SL_IMM(src2, -src2w)) {\n\t\t\t\tcompiler->imm = (-src2w) & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SL_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SH_IMM(src2, -src2w)) {\n\t\t\t\tcompiler->imm = ((-src2w) >> 16) & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags |  ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\t/* Range between -1 and -32768 is covered above. */\n\t\t\tif (TEST_ADD_IMM(src2, -src2w)) {\n\t\t\t\tcompiler->imm = -src2w & 0xffffffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\n\t\tif (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) != GET_FLAG_TYPE(SLJIT_SET_CARRY)) {\n\t\t\tif (TEST_SL_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\treturn emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w);\n\t\t}\n\n\t\tif (TEST_SL_IMM(src2, -src2w)) {\n\t\t\tcompiler->imm = (-src2w) & 0xffff;\n\t\t\treturn emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t}\n\t\t/* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */\n\t\treturn emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SUBC:\n\t\treturn emit_op(compiler, SLJIT_SUBC, flags, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_MUL:\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tif (op & SLJIT_I32_OP)\n\t\t\tflags |= ALT_FORM2;\n#endif\n\t\tif (!HAS_FLAGS(op)) {\n\t\t\tif (TEST_SL_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_MUL, flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_SL_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w & 0xffff;\n\t\t\t\treturn emit_op(compiler, SLJIT_MUL, flags | ALT_FORM1, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tFAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));\n\t\treturn emit_op(compiler, SLJIT_MUL, flags, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_AND:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\t\t/* Commutative unsigned operations. */\n\t\tif (!HAS_FLAGS(op) || GET_OPCODE(op) == SLJIT_AND) {\n\t\t\tif (TEST_UL_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_UL_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_UH_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = (src2w >> 16) & 0xffff;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_UH_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = (src1w >> 16) & 0xffff;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM2, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\t\tif (GET_OPCODE(op) != SLJIT_AND && GET_OPCODE(op) != SLJIT_AND) {\n\t\t\t/* Unlike or and xor, and resets unwanted bits as well. */\n\t\t\tif (TEST_UI_IMM(src2, src2w)) {\n\t\t\t\tcompiler->imm = src2w;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t\t}\n\t\t\tif (TEST_UI_IMM(src1, src1w)) {\n\t\t\t\tcompiler->imm = src1w;\n\t\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);\n\t\t\t}\n\t\t}\n\t\treturn emit_op(compiler, GET_OPCODE(op), flags, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tif (op & SLJIT_I32_OP)\n\t\t\tflags |= ALT_FORM2;\n#endif\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tcompiler->imm = src2w;\n\t\t\treturn emit_op(compiler, GET_OPCODE(op), flags | ALT_FORM1, dst, dstw, src1, src1w, TMP_REG2, 0);\n\t\t}\n\t\treturn emit_op(compiler, GET_OPCODE(op), flags, dst, dstw, src1, src1w, src2, src2w);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn freg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\treturn push_inst(compiler, *(sljit_ins*)instruction);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 6))\n#define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double)\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n#define FLOAT_TMP_MEM_OFFSET (6 * sizeof(sljit_sw))\n#else\n#define FLOAT_TMP_MEM_OFFSET (2 * sizeof(sljit_sw))\n\n#if (defined SLJIT_LITTLE_ENDIAN && SLJIT_LITTLE_ENDIAN)\n#define FLOAT_TMP_MEM_OFFSET_LOW (2 * sizeof(sljit_sw))\n#define FLOAT_TMP_MEM_OFFSET_HI (3 * sizeof(sljit_sw))\n#else\n#define FLOAT_TMP_MEM_OFFSET_LOW (3 * sizeof(sljit_sw))\n#define FLOAT_TMP_MEM_OFFSET_HI (2 * sizeof(sljit_sw))\n#endif\n\n#endif /* SLJIT_CONFIG_PPC_64 */\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (src & SLJIT_MEM) {\n\t\t/* We can ignore the temporary data store on the stack from caching point of view. */\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_FREG1;\n\t}\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\top = GET_OPCODE(op);\n\tFAIL_IF(push_inst(compiler, (op == SLJIT_CONV_S32_FROM_F64 ? FCTIWZ : FCTIDZ) | FD(TMP_FREG1) | FB(src)));\n\n\tif (op == SLJIT_CONV_SW_FROM_F64) {\n\t\tif (FAST_IS_REG(dst)) {\n\t\t\tFAIL_IF(emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));\n\t\t\treturn emit_op_mem(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1);\n\t\t}\n\t\treturn emit_op_mem(compiler, DOUBLE_DATA, TMP_FREG1, dst, dstw, TMP_REG1);\n\t}\n#else\n\tFAIL_IF(push_inst(compiler, FCTIWZ | FD(TMP_FREG1) | FB(src)));\n#endif\n\n\tif (FAST_IS_REG(dst)) {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, FLOAT_TMP_MEM_OFFSET));\n\t\tFAIL_IF(push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(SLJIT_SP) | B(TMP_REG1)));\n\t\treturn emit_op_mem(compiler, INT_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1);\n\t}\n\n\tSLJIT_ASSERT(dst & SLJIT_MEM);\n\n\tif (dst & OFFS_REG_MASK) {\n\t\tdstw &= 0x3;\n\t\tif (dstw) {\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\t\t\tFAIL_IF(push_inst(compiler, RLWINM | S(OFFS_REG(dst)) | A(TMP_REG1) | (dstw << 11) | ((31 - dstw) << 1)));\n#else\n\t\t\tFAIL_IF(push_inst(compiler, RLDI(TMP_REG1, OFFS_REG(dst), dstw, 63 - dstw, 1)));\n#endif\n\t\t\tdstw = TMP_REG1;\n\t\t}\n\t\telse\n\t\t\tdstw = OFFS_REG(dst);\n\t}\n\telse {\n\t\tif ((dst & REG_MASK) && !dstw) {\n\t\t\tdstw = dst & REG_MASK;\n\t\t\tdst = 0;\n\t\t}\n\t\telse {\n\t\t\t/* This works regardless we have SLJIT_MEM1 or SLJIT_MEM0. */\n\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, dstw));\n\t\t\tdstw = TMP_REG1;\n\t\t}\n\t}\n\n\treturn push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw));\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_IMM) {\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\t\tsrcw = (sljit_s32)srcw;\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n\t}\n\telse if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) {\n\t\tif (FAST_IS_REG(src))\n\t\t\tFAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1)));\n\t\telse\n\t\t\tFAIL_IF(emit_op_mem(compiler, INT_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tif (FAST_IS_REG(src)) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA, src, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));\n\t\tFAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));\n\t}\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, TMP_REG1));\n\n\tFAIL_IF(push_inst(compiler, FCFID | FD(dst_r) | FB(TMP_FREG1)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);\n\tif (op & SLJIT_F32_OP)\n\t\treturn push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));\n\treturn SLJIT_SUCCESS;\n\n#else\n\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\tsljit_s32 invert_sign = 1;\n\n\tif (src & SLJIT_IMM) {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ 0x80000000));\n\t\tsrc = TMP_REG1;\n\t\tinvert_sign = 0;\n\t}\n\telse if (!FAST_IS_REG(src)) {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | SIGNED_DATA | LOAD_DATA, TMP_REG1, src, srcw, TMP_REG1));\n\t\tsrc = TMP_REG1;\n\t}\n\n\t/* First, a special double floating point value is constructed: (2^53 + (input xor (2^31)))\n\t   The double precision format has exactly 53 bit precision, so the lower 32 bit represents\n\t   the lower 32 bit of such value. The result of xor 2^31 is the same as adding 0x80000000\n\t   to the input, which shifts it into the 0 - 0xffffffff range. To get the converted floating\n\t   point value, we need to substract 2^53 + 2^31 from the constructed value. */\n\tFAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG2) | A(0) | 0x4330));\n\tif (invert_sign)\n\t\tFAIL_IF(push_inst(compiler, XORIS | S(src) | A(TMP_REG1) | 0x8000));\n\tFAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_HI, TMP_REG1));\n\tFAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2));\n\tFAIL_IF(push_inst(compiler, ADDIS | D(TMP_REG1) | A(0) | 0x8000));\n\tFAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));\n\tFAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET_LOW, TMP_REG2));\n\tFAIL_IF(emit_op_mem(compiler, DOUBLE_DATA | LOAD_DATA, TMP_FREG2, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, TMP_REG1));\n\n\tFAIL_IF(push_inst(compiler, FSUB | FD(dst_r) | FA(TMP_FREG1) | FB(TMP_FREG2)));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, TMP_REG1);\n\tif (op & SLJIT_F32_OP)\n\t\treturn push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));\n\treturn SLJIT_SUCCESS;\n\n#endif\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, TMP_REG1));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, TMP_REG2));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\treturn push_inst(compiler, FCMPU | CRD(4) | FA(src1) | FB(src2));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\n\tSLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x4), float_transfer_bit_error);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)\n\t\top ^= SLJIT_F32_OP;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_r, src, srcw, TMP_REG1));\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\top ^= SLJIT_F32_OP;\n\t\tif (op & SLJIT_F32_OP) {\n\t\t\tFAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(src)));\n\t\t\tbreak;\n\t\t}\n\t\t/* Fall through. */\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1)\n\t\t\t\tFAIL_IF(push_inst(compiler, FMR | FD(dst_r) | FB(src)));\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst(compiler, FNEG | FD(dst_r) | FB(src)));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src)));\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op), dst_r, dst, dstw, TMP_REG1));\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, TMP_REG1));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, TMP_REG2));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2)));\n\t\tbreak;\n\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2)));\n\t\tbreak;\n\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */));\n\t\tbreak;\n\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2)));\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, TMP_REG1));\n\n\treturn SLJIT_SUCCESS;\n}\n\n#undef SELECT_FOP\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, MFLR | D(dst));\n\n\t/* Memory. */\n\tFAIL_IF(push_inst(compiler, MFLR | D(TMP_REG2)));\n\treturn emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, MTLR | S(src)));\n\telse {\n\t\tFAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));\n\t\tFAIL_IF(push_inst(compiler, MTLR | S(TMP_REG2)));\n\t}\n\n\treturn push_inst(compiler, BLR);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\treturn label;\n}\n\nstatic sljit_ins get_bo_bi_flags(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\t\treturn (12 << 21) | (2 << 16);\n\n\tcase SLJIT_NOT_EQUAL:\n\t\treturn (4 << 21) | (2 << 16);\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_SIG_LESS:\n\t\treturn (12 << 21) | (0 << 16);\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn (4 << 21) | (0 << 16);\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_SIG_GREATER:\n\t\treturn (12 << 21) | (1 << 16);\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn (4 << 21) | (1 << 16);\n\n\tcase SLJIT_LESS_F64:\n\t\treturn (12 << 21) | ((4 + 0) << 16);\n\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\treturn (4 << 21) | ((4 + 0) << 16);\n\n\tcase SLJIT_GREATER_F64:\n\t\treturn (12 << 21) | ((4 + 1) << 16);\n\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn (4 << 21) | ((4 + 1) << 16);\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\treturn (12 << 21) | (3 << 16);\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\treturn (4 << 21) | (3 << 16);\n\n\tcase SLJIT_EQUAL_F64:\n\t\treturn (12 << 21) | ((4 + 2) << 16);\n\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\treturn (4 << 21) | ((4 + 2) << 16);\n\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn (12 << 21) | ((4 + 3) << 16);\n\n\tcase SLJIT_ORDERED_F64:\n\t\treturn (4 << 21) | ((4 + 3) << 16);\n\n\tdefault:\n\t\tSLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL_CDECL);\n\t\treturn (20 << 21);\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins bo_bi_flags;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tbo_bi_flags = get_bo_bi_flags(type & 0xff);\n\tif (!bo_bi_flags)\n\t\treturn NULL;\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\t/* In PPC, we don't need to touch the arguments. */\n\tif (type < SLJIT_JUMP)\n\t\tjump->flags |= IS_COND;\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)\n\tif (type >= SLJIT_CALL)\n\t\tjump->flags |= IS_CALL;\n#endif\n\n\tPTR_FAIL_IF(emit_const(compiler, TMP_CALL_REG, 0));\n\tPTR_FAIL_IF(push_inst(compiler, MTCTR | S(TMP_CALL_REG)));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, BCCTR | bo_bi_flags | (type >= SLJIT_FAST_CALL ? 1 : 0)));\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tPTR_FAIL_IF(call_with_args(compiler, arg_types, NULL));\n#endif\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump = NULL;\n\tsljit_s32 src_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src)) {\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)\n\t\tif (type >= SLJIT_CALL) {\n\t\t\tFAIL_IF(push_inst(compiler, OR | S(src) | A(TMP_CALL_REG) | B(src)));\n\t\t\tsrc_r = TMP_CALL_REG;\n\t\t}\n\t\telse\n\t\t\tsrc_r = src;\n#else\n\t\tsrc_r = src;\n#endif\n\t} else if (src & SLJIT_IMM) {\n\t\t/* These jumps are converted to jump/call instructions when possible. */\n\t\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\t\tFAIL_IF(!jump);\n\t\tset_jump(jump, compiler, JUMP_ADDR);\n\t\tjump->u.target = srcw;\n#if (defined SLJIT_PASS_ENTRY_ADDR_TO_CALL && SLJIT_PASS_ENTRY_ADDR_TO_CALL)\n\t\tif (type >= SLJIT_CALL)\n\t\t\tjump->flags |= IS_CALL;\n#endif\n\t\tFAIL_IF(emit_const(compiler, TMP_CALL_REG, 0));\n\t\tsrc_r = TMP_CALL_REG;\n\t}\n\telse {\n\t\tFAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_CALL_REG, 0, TMP_REG1, 0, src, srcw));\n\t\tsrc_r = TMP_CALL_REG;\n\t}\n\n\tFAIL_IF(push_inst(compiler, MTCTR | S(src_r)));\n\tif (jump)\n\t\tjump->addr = compiler->size;\n\treturn push_inst(compiler, BCCTR | (20 << 21) | (type >= SLJIT_FAST_CALL ? 1 : 0));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tif (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tFAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_CALL_REG, 0, TMP_REG1, 0, src, srcw));\n\t\tsrc = TMP_CALL_REG;\n\t}\n\n\tFAIL_IF(call_with_args(compiler, arg_types, &src));\n#endif\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 reg, input_flags, cr_bit, invert;\n\tsljit_s32 saved_op = op;\n\tsljit_sw saved_dstw = dstw;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tinput_flags = (op & SLJIT_I32_OP) ? INT_DATA : WORD_DATA;\n#else\n\tinput_flags = WORD_DATA;\n#endif\n\n\top = GET_OPCODE(op);\n\treg = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2;\n\n\tif (op >= SLJIT_ADD && (dst & SLJIT_MEM))\n\t\tFAIL_IF(emit_op_mem(compiler, input_flags | LOAD_DATA, TMP_REG1, dst, dstw, TMP_REG1));\n\n\tinvert = 0;\n\tcr_bit = 0;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_LESS:\n\tcase SLJIT_SIG_LESS:\n\t\tbreak;\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_SIG_GREATER:\n\t\tcr_bit = 1;\n\t\tbreak;\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\tcr_bit = 1;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_EQUAL:\n\t\tcr_bit = 2;\n\t\tbreak;\n\n\tcase SLJIT_NOT_EQUAL:\n\t\tcr_bit = 2;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\tcr_bit = 3;\n\t\tbreak;\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tcr_bit = 3;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_LESS_F64:\n\t\tcr_bit = 4 + 0;\n\t\tbreak;\n\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\tcr_bit = 4 + 0;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_GREATER_F64:\n\t\tcr_bit = 4 + 1;\n\t\tbreak;\n\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\tcr_bit = 4 + 1;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_EQUAL_F64:\n\t\tcr_bit = 4 + 2;\n\t\tbreak;\n\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\tcr_bit = 4 + 2;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tcase SLJIT_UNORDERED_F64:\n\t\tcr_bit = 4 + 3;\n\t\tbreak;\n\n\tcase SLJIT_ORDERED_F64:\n\t\tcr_bit = 4 + 3;\n\t\tinvert = 1;\n\t\tbreak;\n\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tbreak;\n\t}\n\n\tFAIL_IF(push_inst(compiler, MFCR | D(reg)));\n\tFAIL_IF(push_inst(compiler, RLWINM | S(reg) | A(reg) | ((1 + (cr_bit)) << 11) | (31 << 6) | (31 << 1)));\n\n\tif (invert)\n\t\tFAIL_IF(push_inst(compiler, XORI | S(reg) | A(reg) | 0x1));\n\n\tif (op < SLJIT_ADD) {\n\t\tif (!(dst & SLJIT_MEM))\n\t\t\treturn SLJIT_SUCCESS;\n\t\treturn emit_op_mem(compiler, input_flags, reg, dst, dstw, TMP_REG1);\n\t}\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tif (dst & SLJIT_MEM)\n\t\treturn sljit_emit_op2(compiler, saved_op, dst, saved_dstw, TMP_REG1, 0, TMP_REG2, 0);\n\treturn sljit_emit_op2(compiler, saved_op, dst, 0, dst, 0, TMP_REG2, 0);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n\treturn sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_mem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 reg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_s32 mem_flags;\n\tsljit_ins inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_mem(compiler, type, reg, mem, memw));\n\n\tif (type & SLJIT_MEM_POST)\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n#endif\n\t\tmem_flags = WORD_DATA;\n\t\tbreak;\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\tcase SLJIT_MOV_U32:\n\t\tmem_flags = INT_DATA;\n\t\tbreak;\n\n\tcase SLJIT_MOV_S32:\n\t\tmem_flags = INT_DATA;\n\n\t\tif (!(type & SLJIT_MEM_STORE) && !(type & SLJIT_I32_OP)) {\n\t\t\tif (mem & OFFS_REG_MASK)\n\t\t\t\tmem_flags |= SIGNED_DATA;\n\t\t\telse\n\t\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t\t}\n\t\tbreak;\n#endif\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tmem_flags = BYTE_DATA;\n\t\tbreak;\n\n\tcase SLJIT_MOV_U16:\n\t\tmem_flags = HALF_DATA;\n\t\tbreak;\n\n\tcase SLJIT_MOV_S16:\n\t\tmem_flags = HALF_DATA | SIGNED_DATA;\n\t\tbreak;\n\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tmem_flags = WORD_DATA;\n\t\tbreak;\n\t}\n\n\tif (!(type & SLJIT_MEM_STORE))\n\t\tmem_flags |= LOAD_DATA;\n\n\tif (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {\n\t\tif (memw != 0)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\t\tif (type & SLJIT_MEM_SUPP)\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\tinst = updated_data_transfer_insts[mem_flags | INDEXED];\n\t\tFAIL_IF(push_inst(compiler, INST_CODE_AND_DST(inst, 0, reg) | A(mem & REG_MASK) | B(OFFS_REG(mem))));\n\t}\n\telse {\n\t\tif (memw > SIMM_MAX || memw < SIMM_MIN)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\t\tinst = updated_data_transfer_insts[mem_flags];\n\n#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)\n\t\tif ((inst & INT_ALIGNED) && (memw & 0x3) != 0)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n#endif\n\n\t\tif (type & SLJIT_MEM_SUPP)\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\tFAIL_IF(push_inst(compiler, INST_CODE_AND_DST(inst, 0, reg) | A(mem & REG_MASK) | IMM(memw)));\n\t}\n\n\tif ((mem_flags & LOAD_DATA) && (type & 0xff) == SLJIT_MOV_S8)\n\t\treturn push_inst(compiler, EXTSB | S(reg) | A(reg));\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fmem(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 freg,\n\tsljit_s32 mem, sljit_sw memw)\n{\n\tsljit_s32 mem_flags;\n\tsljit_ins inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fmem(compiler, type, freg, mem, memw));\n\n\tif (type & SLJIT_MEM_POST)\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tif (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {\n\t\tif (memw != 0)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t}\n\telse {\n\t\tif (memw > SIMM_MAX || memw < SIMM_MIN)\n\t\t\treturn SLJIT_ERR_UNSUPPORTED;\n\t}\n\n\tif (type & SLJIT_MEM_SUPP)\n\t\treturn SLJIT_SUCCESS;\n\n\tmem_flags = FLOAT_DATA(type);\n\n\tif (!(type & SLJIT_MEM_STORE))\n\t\tmem_flags |= LOAD_DATA;\n\n\tif (SLJIT_UNLIKELY(mem & OFFS_REG_MASK)) {\n\t\tinst = updated_data_transfer_insts[mem_flags | INDEXED];\n\t\treturn push_inst(compiler, INST_CODE_AND_DST(inst, DOUBLE_DATA, freg) | A(mem & REG_MASK) | B(OFFS_REG(mem)));\n\t}\n\n\tinst = updated_data_transfer_insts[mem_flags];\n\treturn push_inst(compiler, INST_CODE_AND_DST(inst, DOUBLE_DATA, freg) | A(mem & REG_MASK) | IMM(memw));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 reg;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\treg = FAST_IS_REG(dst) ? dst : TMP_REG2;\n\n\tPTR_FAIL_IF(emit_const(compiler, reg, init_value));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));\n\treturn const_;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeSPARC_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw imm)\n{\n\tif (imm <= SIMM_MAX && imm >= SIMM_MIN)\n\t\treturn push_inst(compiler, OR | D(dst) | S1(0) | IMM(imm), DR(dst));\n\n\tFAIL_IF(push_inst(compiler, SETHI | D(dst) | ((imm >> 10) & 0x3fffff), DR(dst)));\n\treturn (imm & 0x3ff) ? push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (imm & 0x3ff), DR(dst)) : SLJIT_SUCCESS;\n}\n\n#define ARG2(flags, src2) ((flags & SRC2_IMM) ? IMM(src2) : S2(src2))\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_s32 src1, sljit_sw src2)\n{\n\tSLJIT_COMPILE_ASSERT(ICC_IS_SET == SET_FLAGS, icc_is_set_and_set_flags_must_be_the_same);\n\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (dst != src2)\n\t\t\treturn push_inst(compiler, OR | D(dst) | S1(0) | S2(src2), DR(dst));\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_U8)\n\t\t\t\treturn push_inst(compiler, AND | D(dst) | S1(src2) | IMM(0xff), DR(dst));\n\t\t\tFAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(24), DR(dst)));\n\t\t\treturn push_inst(compiler, SRA | D(dst) | S1(dst) | IMM(24), DR(dst));\n\t\t}\n\t\telse if (dst != src2)\n\t\t\tSLJIT_UNREACHABLE();\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tFAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(16), DR(dst)));\n\t\t\treturn push_inst(compiler, (op == SLJIT_MOV_S16 ? SRA : SRL) | D(dst) | S1(dst) | IMM(16), DR(dst));\n\t\t}\n\t\telse if (dst != src2)\n\t\t\tSLJIT_UNREACHABLE();\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\treturn push_inst(compiler, XNOR | (flags & SET_FLAGS) | D(dst) | S1(0) | S2(src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tFAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(src2) | S2(0), SET_FLAGS));\n\t\tFAIL_IF(push_inst(compiler, OR | D(TMP_REG1) | S1(0) | S2(src2), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, BICC | DA(0x1) | (7 & DISP_MASK), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, OR | D(dst) | S1(0) | IMM(32), UNMOVABLE_INS));\n\t\tFAIL_IF(push_inst(compiler, OR | D(dst) | S1(0) | IMM(-1), DR(dst)));\n\n\t\t/* Loop. */\n\t\tFAIL_IF(push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(0), SET_FLAGS));\n\t\tFAIL_IF(push_inst(compiler, SLL | D(TMP_REG1) | S1(TMP_REG1) | IMM(1), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, BICC | DA(0xe) | (-2 & DISP_MASK), UNMOVABLE_INS));\n\t\treturn push_inst(compiler, ADD | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS);\n\n\tcase SLJIT_ADD:\n\t\treturn push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_ADDC:\n\t\treturn push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_SUB:\n\t\treturn push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_SUBC:\n\t\treturn push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_MUL:\n\t\tFAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst)));\n\t\tif (!(flags & SET_FLAGS))\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(dst) | IMM(31), DR(TMP_REG1)));\n\t\tFAIL_IF(push_inst(compiler, RDY | D(TMP_LINK), DR(TMP_LINK)));\n\t\treturn push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(TMP_REG1) | S2(TMP_LINK), MOVABLE_INS | SET_FLAGS);\n\n\tcase SLJIT_AND:\n\t\treturn push_inst(compiler, AND | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_OR:\n\t\treturn push_inst(compiler, OR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_XOR:\n\t\treturn push_inst(compiler, XOR | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS));\n\n\tcase SLJIT_SHL:\n\t\tFAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst)));\n\t\treturn !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS);\n\n\tcase SLJIT_LSHR:\n\t\tFAIL_IF(push_inst(compiler, SRL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst)));\n\t\treturn !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS);\n\n\tcase SLJIT_ASHR:\n\t\tFAIL_IF(push_inst(compiler, SRA | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst)));\n\t\treturn !(flags & SET_FLAGS) ? SLJIT_SUCCESS : push_inst(compiler, SUB | SET_FLAGS | D(0) | S1(dst) | S2(0), SET_FLAGS);\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src)\n{\n\tsljit_s32 reg_index = 8;\n\tsljit_s32 word_reg_index = 8;\n\tsljit_s32 float_arg_index = 1;\n\tsljit_s32 double_arg_count = 0;\n\tsljit_s32 float_offset = (16 + 6) * sizeof(sljit_sw);\n\tsljit_s32 types = 0;\n\tsljit_s32 reg = 0;\n\tsljit_s32 move_to_tmp2 = 0;\n\n\tif (src)\n\t\treg = reg_map[*src & REG_MASK];\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tfloat_arg_index++;\n\t\t\tif (reg_index == reg)\n\t\t\t\tmove_to_tmp2 = 1;\n\t\t\treg_index++;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tfloat_arg_index++;\n\t\t\tdouble_arg_count++;\n\t\t\tif (reg_index == reg || reg_index + 1 == reg)\n\t\t\t\tmove_to_tmp2 = 1;\n\t\t\treg_index += 2;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (reg_index != word_reg_index && reg_index < 14 && reg_index == reg)\n\t\t\t\tmove_to_tmp2 = 1;\n\t\t\treg_index++;\n\t\t\tword_reg_index++;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (move_to_tmp2) {\n\t\t\tmove_to_tmp2 = 0;\n\t\t\tif (reg < 14)\n\t\t\t\tFAIL_IF(push_inst(compiler, OR | D(TMP_REG1) | S1(0) | S2A(reg), DR(TMP_REG1)));\n\t\t\t*src = TMP_REG1;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\targ_types = types;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tfloat_arg_index--;\n\t\t\tFAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | S1(SLJIT_SP) | IMM(float_offset), MOVABLE_INS));\n\t\t\tfloat_offset -= sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tfloat_arg_index--;\n\t\t\tif (float_arg_index == 4 && double_arg_count == 4) {\n\t\t\t\tFAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | S1(SLJIT_SP) | IMM((16 + 7) * sizeof(sljit_sw)), MOVABLE_INS));\n\t\t\t\tFAIL_IF(push_inst(compiler, STF | FD(float_arg_index) | (1 << 25) | S1(SLJIT_SP) | IMM((16 + 8) * sizeof(sljit_sw)), MOVABLE_INS));\n\t\t\t}\n\t\t\telse\n\t\t\t\tFAIL_IF(push_inst(compiler, STDF | FD(float_arg_index) | S1(SLJIT_SP) | IMM(float_offset), MOVABLE_INS));\n\t\t\tfloat_offset -= sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tfloat_offset = (16 + 6) * sizeof(sljit_sw);\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\treg_index--;\n\t\t\tif (reg_index < 14)\n\t\t\t\tFAIL_IF(push_inst(compiler, LDUW | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index));\n\t\t\tfloat_offset -= sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\treg_index -= 2;\n\t\t\tif (reg_index < 14) {\n\t\t\t\tif ((reg_index & 0x1) != 0) {\n\t\t\t\t\tFAIL_IF(push_inst(compiler, LDUW | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index));\n\t\t\t\t\tif (reg_index < 13)\n\t\t\t\t\t\tFAIL_IF(push_inst(compiler, LDUW | DA(reg_index + 1) | S1(SLJIT_SP) | IMM(float_offset + sizeof(sljit_sw)), reg_index + 1));\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t\tFAIL_IF(push_inst(compiler, LDD | DA(reg_index) | S1(SLJIT_SP) | IMM(float_offset), reg_index));\n\t\t\t}\n\t\t\tfloat_offset -= sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treg_index--;\n\t\t\tword_reg_index--;\n\n\t\t\tif (reg_index != word_reg_index) {\n\t\t\t\tif (reg_index < 14)\n\t\t\t\t\tFAIL_IF(push_inst(compiler, OR | DA(reg_index) | S1(0) | S2A(word_reg_index), reg_index));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(push_inst(compiler, STW | DA(word_reg_index) | S1(SLJIT_SP) | IMM(92), word_reg_index));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)\n{\n\tFAIL_IF(push_inst(compiler, SETHI | D(dst) | ((init_value >> 10) & 0x3fffff), DR(dst)));\n\treturn push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (init_value & 0x3ff), DR(dst));\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffc00000) | ((new_target >> 10) & 0x3fffff);\n\tinst[1] = (inst[1] & 0xfffffc00) | (new_target & 0x3ff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & 0xffc00000) | ((new_constant >> 10) & 0x3fffff);\n\tinst[1] = (inst[1] & 0xfffffc00) | (new_constant & 0x3ff);\n\tinst = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(inst, executable_offset);\n\tSLJIT_CACHE_FLUSH(inst, inst + 2);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeSPARC_common.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n\treturn \"SPARC\" SLJIT_CPUINFO;\n}\n\n/* Length of an instruction word\n   Both for sparc-32 and sparc-64 */\ntypedef sljit_u32 sljit_ins;\n\n#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)\n\nstatic void sparc_cache_flush(sljit_ins *from, sljit_ins *to)\n{\n#if defined(__SUNPRO_C) && __SUNPRO_C < 0x590\n\t__asm (\n\t\t/* if (from == to) return */\n\t\t\"cmp %i0, %i1\\n\"\n\t\t\"be .leave\\n\"\n\t\t\"nop\\n\"\n\n\t\t/* loop until from >= to */\n\t\t\".mainloop:\\n\"\n\t\t\"flush %i0\\n\"\n\t\t\"add %i0, 8, %i0\\n\"\n\t\t\"cmp %i0, %i1\\n\"\n\t\t\"bcs .mainloop\\n\"\n\t\t\"nop\\n\"\n\n\t\t/* The comparison was done above. */\n\t\t\"bne .leave\\n\"\n\t\t/* nop is not necessary here, since the\n\t\t   sub operation has no side effect. */\n\t\t\"sub %i0, 4, %i0\\n\"\n\t\t\"flush %i0\\n\"\n\t\t\".leave:\"\n\t);\n#else\n\tif (SLJIT_UNLIKELY(from == to))\n\t\treturn;\n\n\tdo {\n\t\t__asm__ volatile (\n\t\t\t\"flush %0\\n\"\n\t\t\t: : \"r\"(from)\n\t\t);\n\t\t/* Operates at least on doubleword. */\n\t\tfrom += 2;\n\t} while (from < to);\n\n\tif (from == to) {\n\t\t/* Flush the last word. */\n\t\tfrom --;\n\t\t__asm__ volatile (\n\t\t\t\"flush %0\\n\"\n\t\t\t: : \"r\"(from)\n\t\t);\n\t}\n#endif\n}\n\n#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */\n\n/* TMP_REG2 is not used by getput_arg */\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_REG3\t(SLJIT_NUMBER_OF_REGISTERS + 4)\n/* This register is modified by calls, which affects the instruction\n   in the delay slot if it is used as a source register. */\n#define TMP_LINK\t(SLJIT_NUMBER_OF_REGISTERS + 5)\n\n#define TMP_FREG1\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)\n#define TMP_FREG2\t(SLJIT_NUMBER_OF_FLOAT_REGISTERS + 2)\n\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {\n\t0, 8, 9, 10, 11, 29, 28, 27, 23, 22, 21, 20, 19, 18, 17, 16, 26, 25, 24, 14, 1, 12, 13, 15\n};\n\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 3] = {\n\t0, 0, 2, 4, 6, 8, 10, 12, 14\n};\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n#define D(d)\t\t(reg_map[d] << 25)\n#define FD(d)\t\t(freg_map[d] << 25)\n#define FDN(d)\t\t((freg_map[d] | 0x1) << 25)\n#define DA(d)\t\t((d) << 25)\n#define S1(s1)\t\t(reg_map[s1] << 14)\n#define FS1(s1)\t\t(freg_map[s1] << 14)\n#define S1A(s1)\t\t((s1) << 14)\n#define S2(s2)\t\t(reg_map[s2])\n#define FS2(s2)\t\t(freg_map[s2])\n#define FS2N(s2)\t(freg_map[s2] | 0x1)\n#define S2A(s2)\t\t(s2)\n#define IMM_ARG\t\t0x2000\n#define DOP(op)\t\t((op) << 5)\n#define IMM(imm)\t(((imm) & 0x1fff) | IMM_ARG)\n\n#define DR(dr)\t\t(reg_map[dr])\n#define OPC1(opcode)\t((opcode) << 30)\n#define OPC2(opcode)\t((opcode) << 22)\n#define OPC3(opcode)\t((opcode) << 19)\n#define SET_FLAGS\tOPC3(0x10)\n\n#define ADD\t\t(OPC1(0x2) | OPC3(0x00))\n#define ADDC\t\t(OPC1(0x2) | OPC3(0x08))\n#define AND\t\t(OPC1(0x2) | OPC3(0x01))\n#define ANDN\t\t(OPC1(0x2) | OPC3(0x05))\n#define CALL\t\t(OPC1(0x1))\n#define FABSS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x09))\n#define FADDD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x42))\n#define FADDS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x41))\n#define FCMPD\t\t(OPC1(0x2) | OPC3(0x35) | DOP(0x52))\n#define FCMPS\t\t(OPC1(0x2) | OPC3(0x35) | DOP(0x51))\n#define FDIVD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x4e))\n#define FDIVS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x4d))\n#define FDTOI\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xd2))\n#define FDTOS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xc6))\n#define FITOD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xc8))\n#define FITOS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xc4))\n#define FMOVS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x01))\n#define FMULD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x4a))\n#define FMULS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x49))\n#define FNEGS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x05))\n#define FSTOD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xc9))\n#define FSTOI\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0xd1))\n#define FSUBD\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x46))\n#define FSUBS\t\t(OPC1(0x2) | OPC3(0x34) | DOP(0x45))\n#define JMPL\t\t(OPC1(0x2) | OPC3(0x38))\n#define LDD\t\t(OPC1(0x3) | OPC3(0x03))\n#define LDUW\t\t(OPC1(0x3) | OPC3(0x00))\n#define NOP\t\t(OPC1(0x0) | OPC2(0x04))\n#define OR\t\t(OPC1(0x2) | OPC3(0x02))\n#define ORN\t\t(OPC1(0x2) | OPC3(0x06))\n#define RDY\t\t(OPC1(0x2) | OPC3(0x28) | S1A(0))\n#define RESTORE\t\t(OPC1(0x2) | OPC3(0x3d))\n#define SAVE\t\t(OPC1(0x2) | OPC3(0x3c))\n#define SETHI\t\t(OPC1(0x0) | OPC2(0x04))\n#define SLL\t\t(OPC1(0x2) | OPC3(0x25))\n#define SLLX\t\t(OPC1(0x2) | OPC3(0x25) | (1 << 12))\n#define SRA\t\t(OPC1(0x2) | OPC3(0x27))\n#define SRAX\t\t(OPC1(0x2) | OPC3(0x27) | (1 << 12))\n#define SRL\t\t(OPC1(0x2) | OPC3(0x26))\n#define SRLX\t\t(OPC1(0x2) | OPC3(0x26) | (1 << 12))\n#define STDF\t\t(OPC1(0x3) | OPC3(0x27))\n#define STF\t\t(OPC1(0x3) | OPC3(0x24))\n#define STW\t\t(OPC1(0x3) | OPC3(0x04))\n#define SUB\t\t(OPC1(0x2) | OPC3(0x04))\n#define SUBC\t\t(OPC1(0x2) | OPC3(0x0c))\n#define TA\t\t(OPC1(0x2) | OPC3(0x3a) | (8 << 25))\n#define WRY\t\t(OPC1(0x2) | OPC3(0x30) | DA(0))\n#define XOR\t\t(OPC1(0x2) | OPC3(0x03))\n#define XNOR\t\t(OPC1(0x2) | OPC3(0x07))\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n#define MAX_DISP\t(0x1fffff)\n#define MIN_DISP\t(-0x200000)\n#define DISP_MASK\t(0x3fffff)\n\n#define BICC\t\t(OPC1(0x0) | OPC2(0x2))\n#define FBFCC\t\t(OPC1(0x0) | OPC2(0x6))\n#define SLL_W\t\tSLL\n#define SDIV\t\t(OPC1(0x2) | OPC3(0x0f))\n#define SMUL\t\t(OPC1(0x2) | OPC3(0x0b))\n#define UDIV\t\t(OPC1(0x2) | OPC3(0x0e))\n#define UMUL\t\t(OPC1(0x2) | OPC3(0x0a))\n#else\n#define SLL_W\t\tSLLX\n#endif\n\n#define SIMM_MAX\t(0x0fff)\n#define SIMM_MIN\t(-0x1000)\n\n/* dest_reg is the absolute name of the register\n   Useful for reordering instructions in the delay slot. */\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)\n{\n\tsljit_ins *ptr;\n\tSLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS\n\t\t|| (delay_slot & DST_INS_MASK) == MOVABLE_INS\n\t\t|| (delay_slot & DST_INS_MASK) == ((ins >> 25) & 0x1f));\n\tptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\tcompiler->delay_slot = delay_slot;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_ins* detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code, sljit_sw executable_offset)\n{\n\tsljit_sw diff;\n\tsljit_uw target_addr;\n\tsljit_ins *inst;\n\tsljit_ins saved_inst;\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn code_ptr;\n\n\tif (jump->flags & JUMP_ADDR)\n\t\ttarget_addr = jump->u.target;\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\ttarget_addr = (sljit_uw)(code + jump->u.label->size) + (sljit_uw)executable_offset;\n\t}\n\tinst = (sljit_ins*)jump->addr;\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\tif (jump->flags & IS_CALL) {\n\t\t/* Call is always patchable on sparc 32. */\n\t\tjump->flags |= PATCH_CALL;\n\t\tif (jump->flags & IS_MOVABLE) {\n\t\t\tinst[0] = inst[-1];\n\t\t\tinst[-1] = CALL;\n\t\t\tjump->addr -= sizeof(sljit_ins);\n\t\t\treturn inst;\n\t\t}\n\t\tinst[0] = CALL;\n\t\tinst[1] = NOP;\n\t\treturn inst + 1;\n\t}\n#else\n\t/* Both calls and BPr instructions shall not pass this point. */\n#error \"Implementation required\"\n#endif\n\n\tif (jump->flags & IS_COND)\n\t\tinst--;\n\n\tdiff = ((sljit_sw)target_addr - (sljit_sw)(inst - 1) - executable_offset) >> 2;\n\n\tif (jump->flags & IS_MOVABLE) {\n\t\tif (diff <= MAX_DISP && diff >= MIN_DISP) {\n\t\t\tjump->flags |= PATCH_B;\n\t\t\tinst--;\n\t\t\tif (jump->flags & IS_COND) {\n\t\t\t\tsaved_inst = inst[0];\n\t\t\t\tinst[0] = inst[1] ^ (1 << 28);\n\t\t\t\tinst[1] = saved_inst;\n\t\t\t} else {\n\t\t\t\tinst[1] = inst[0];\n\t\t\t\tinst[0] = BICC | DA(0x8);\n\t\t\t}\n\t\t\tjump->addr = (sljit_uw)inst;\n\t\t\treturn inst + 1;\n\t\t}\n\t}\n\n\tdiff += sizeof(sljit_ins);\n\n\tif (diff <= MAX_DISP && diff >= MIN_DISP) {\n\t\tjump->flags |= PATCH_B;\n\t\tif (jump->flags & IS_COND)\n\t\t\tinst[0] ^= (1 << 28);\n\t\telse\n\t\t\tinst[0] = BICC | DA(0x8);\n\t\tinst[1] = NOP;\n\t\tjump->addr = (sljit_uw)inst;\n\t\treturn inst + 1;\n\t}\n\n\treturn code_ptr;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_ins *code;\n\tsljit_ins *code_ptr;\n\tsljit_ins *buf_ptr;\n\tsljit_ins *buf_end;\n\tsljit_uw word_count;\n\tsljit_sw executable_offset;\n\tsljit_uw addr;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\tcode = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tword_count = 0;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\n\tdo {\n\t\tbuf_ptr = (sljit_ins*)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 2);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tif (label && label->size == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\t\t\tif (jump && jump->addr == word_count) {\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 3);\n#else\n\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 6);\n#endif\n\t\t\t\tcode_ptr = detect_jump_type(jump, code_ptr, code, executable_offset);\n\t\t\t\tjump = jump->next;\n\t\t\t}\n\t\t\tif (const_ && const_->addr == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tconst_->addr = (sljit_uw)code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\t\t\tcode_ptr ++;\n\t\t\tword_count ++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == word_count) {\n\t\tlabel->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tdo {\n\t\t\taddr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n\t\t\tbuf_ptr = (sljit_ins *)jump->addr;\n\n\t\t\tif (jump->flags & PATCH_CALL) {\n\t\t\t\taddr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;\n\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= 0x1fffffff && (sljit_sw)addr >= -0x20000000);\n\t\t\t\tbuf_ptr[0] = CALL | (addr & 0x3fffffff);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (jump->flags & PATCH_B) {\n\t\t\t\taddr = (sljit_sw)(addr - (sljit_uw)SLJIT_ADD_EXEC_OFFSET(buf_ptr, executable_offset)) >> 2;\n\t\t\t\tSLJIT_ASSERT((sljit_sw)addr <= MAX_DISP && (sljit_sw)addr >= MIN_DISP);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & ~DISP_MASK) | (addr & DISP_MASK);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* Set the fields of immediate loads. */\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\t\tbuf_ptr[0] = (buf_ptr[0] & 0xffc00000) | ((addr >> 10) & 0x3fffff);\n\t\t\tbuf_ptr[1] = (buf_ptr[1] & 0xfffffc00) | (addr & 0x3ff);\n#else\n#error \"Implementation required\"\n#endif\n\t\t} while (0);\n\t\tjump = jump->next;\n\t}\n\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);\n\n\tcode = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code, executable_offset);\n\tcode_ptr = (sljit_ins *)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);\n\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\treturn code;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#else\n\t\t/* Available by default. */\n\t\treturn 1;\n#endif\n\n#if (defined SLJIT_CONFIG_SPARC_64 && SLJIT_CONFIG_SPARC_64)\n\tcase SLJIT_HAS_CMOV:\n\t\treturn 1;\n#endif\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Entry, exit                                                          */\n/* --------------------------------------------------------------------- */\n\n/* Creates an index in data_transfer_insts array. */\n#define LOAD_DATA\t0x01\n#define WORD_DATA\t0x00\n#define BYTE_DATA\t0x02\n#define HALF_DATA\t0x04\n#define INT_DATA\t0x06\n#define SIGNED_DATA\t0x08\n/* Separates integer and floating point registers */\n#define GPR_REG\t\t0x0f\n#define DOUBLE_DATA\t0x10\n#define SINGLE_DATA\t0x12\n\n#define MEM_MASK\t0x1f\n\n#define ARG_TEST\t0x00020\n#define ALT_KEEP_CACHE\t0x00040\n#define CUMULATIVE_OP\t0x00080\n#define IMM_OP\t\t0x00100\n#define SRC2_IMM\t0x00200\n\n#define REG_DEST\t0x00400\n#define REG2_SOURCE\t0x00800\n#define SLOW_SRC1\t0x01000\n#define SLOW_SRC2\t0x02000\n#define SLOW_DEST\t0x04000\n\n/* SET_FLAGS (0x10 << 19) also belong here! */\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n#include \"sljitNativeSPARC_32.c\"\n#else\n#include \"sljitNativeSPARC_64.c\"\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7;\n\tcompiler->local_size = local_size;\n\n\tif (local_size <= SIMM_MAX) {\n\t\tFAIL_IF(push_inst(compiler, SAVE | D(SLJIT_SP) | S1(SLJIT_SP) | IMM(-local_size), UNMOVABLE_INS));\n\t}\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, -local_size));\n\t\tFAIL_IF(push_inst(compiler, SAVE | D(SLJIT_SP) | S1(SLJIT_SP) | S2(TMP_REG1), UNMOVABLE_INS));\n\t}\n\n\t/* Arguments are in their appropriate registers. */\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tcompiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tif (op != SLJIT_MOV || !FAST_IS_REG(src)) {\n\t\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\t\tsrc = SLJIT_R0;\n\t}\n\n\tFAIL_IF(push_inst(compiler, JMPL | D(0) | S1A(31) | IMM(8), UNMOVABLE_INS));\n\treturn push_inst(compiler, RESTORE | D(SLJIT_R0) | S1(src) | S2(0), UNMOVABLE_INS);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n#define ARCH_32_64(a, b)\ta\n#else\n#define ARCH_32_64(a, b)\tb\n#endif\n\nstatic const sljit_ins data_transfer_insts[16 + 4] = {\n/* u w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */),\n/* u w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */),\n/* u b s */ OPC1(3) | OPC3(0x05) /* stb */,\n/* u b l */ OPC1(3) | OPC3(0x01) /* ldub */,\n/* u h s */ OPC1(3) | OPC3(0x06) /* sth */,\n/* u h l */ OPC1(3) | OPC3(0x02) /* lduh */,\n/* u i s */ OPC1(3) | OPC3(0x04) /* stw */,\n/* u i l */ OPC1(3) | OPC3(0x00) /* lduw */,\n\n/* s w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */),\n/* s w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */),\n/* s b s */ OPC1(3) | OPC3(0x05) /* stb */,\n/* s b l */ OPC1(3) | OPC3(0x09) /* ldsb */,\n/* s h s */ OPC1(3) | OPC3(0x06) /* sth */,\n/* s h l */ OPC1(3) | OPC3(0x0a) /* ldsh */,\n/* s i s */ OPC1(3) | OPC3(0x04) /* stw */,\n/* s i l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x08) /* ldsw */),\n\n/* d   s */ OPC1(3) | OPC3(0x27),\n/* d   l */ OPC1(3) | OPC3(0x23),\n/* s   s */ OPC1(3) | OPC3(0x24),\n/* s   l */ OPC1(3) | OPC3(0x20),\n};\n\n#undef ARCH_32_64\n\n/* Can perform an operation using at most 1 instruction. */\nstatic sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)\n{\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif ((!(arg & OFFS_REG_MASK) && argw <= SIMM_MAX && argw >= SIMM_MIN)\n\t\t\t|| ((arg & OFFS_REG_MASK) && (argw & 0x3) == 0)) {\n\t\t/* Works for both absoulte and relative addresses (immediate case). */\n\t\tif (SLJIT_UNLIKELY(flags & ARG_TEST))\n\t\t\treturn 1;\n\t\tFAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK]\n\t\t\t| ((flags & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg))\n\t\t\t| S1(arg & REG_MASK) | ((arg & OFFS_REG_MASK) ? S2(OFFS_REG(arg)) : IMM(argw)),\n\t\t\t((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS));\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\n/* See getput_arg below.\n   Note: can_cache is called only for binary operators. Those\n   operators always uses word arguments without write back. */\nstatic sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tSLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));\n\n\t/* Simple operation except for updates. */\n\tif (arg & OFFS_REG_MASK) {\n\t\targw &= 0x3;\n\t\tSLJIT_ASSERT(argw);\n\t\tnext_argw &= 0x3;\n\t\tif ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == next_argw)\n\t\t\treturn 1;\n\t\treturn 0;\n\t}\n\n\tif (((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN))\n\t\treturn 1;\n\treturn 0;\n}\n\n/* Emit the necessary instructions. See can_cache above. */\nstatic sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tsljit_s32 base, arg2, delay_slot;\n\tsljit_ins dest;\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\tif (!(next_arg & SLJIT_MEM)) {\n\t\tnext_arg = 0;\n\t\tnext_argw = 0;\n\t}\n\n\tbase = arg & REG_MASK;\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\n\t\t/* Using the cache. */\n\t\tif (((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) && (argw == compiler->cache_argw))\n\t\t\targ2 = TMP_REG3;\n\t\telse {\n\t\t\tif ((arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK) && argw == (next_argw & 0x3)) {\n\t\t\t\tcompiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK);\n\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\targ2 = TMP_REG3;\n\t\t\t}\n\t\t\telse if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base && reg != OFFS_REG(arg))\n\t\t\t\targ2 = reg;\n\t\t\telse /* It must be a mov operation, so tmp1 must be free to use. */\n\t\t\t\targ2 = TMP_REG1;\n\t\t\tFAIL_IF(push_inst(compiler, SLL_W | D(arg2) | S1(OFFS_REG(arg)) | IMM_ARG | argw, DR(arg2)));\n\t\t}\n\t}\n\telse {\n\t\t/* Using the cache. */\n\t\tif ((compiler->cache_arg == SLJIT_MEM) && (argw - compiler->cache_argw) <= SIMM_MAX && (argw - compiler->cache_argw) >= SIMM_MIN) {\n\t\t\tif (argw != compiler->cache_argw) {\n\t\t\t\tFAIL_IF(push_inst(compiler, ADD | D(TMP_REG3) | S1(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));\n\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t}\n\t\t\targ2 = TMP_REG3;\n\t\t} else {\n\t\t\tif ((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN) {\n\t\t\t\tcompiler->cache_arg = SLJIT_MEM;\n\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\targ2 = TMP_REG3;\n\t\t\t}\n\t\t\telse if ((flags & LOAD_DATA) && ((flags & MEM_MASK) <= GPR_REG) && reg != base)\n\t\t\t\targ2 = reg;\n\t\t\telse /* It must be a mov operation, so tmp1 must be free to use. */\n\t\t\t\targ2 = TMP_REG1;\n\t\t\tFAIL_IF(load_immediate(compiler, arg2, argw));\n\t\t}\n\t}\n\n\tdest = ((flags & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg));\n\tdelay_slot = ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? DR(reg) : MOVABLE_INS;\n\tif (!base)\n\t\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | dest | S1(arg2) | IMM(0), delay_slot);\n\treturn push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | dest | S1(base) | S2(arg2), delay_slot);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)\n{\n\tif (getput_arg_fast(compiler, flags, reg, arg, argw))\n\t\treturn compiler->error;\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\treturn getput_arg(compiler, flags, reg, arg, argw, 0, 0);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)\n{\n\tif (getput_arg_fast(compiler, flags, reg, arg1, arg1w))\n\t\treturn compiler->error;\n\treturn getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);\n}\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* arg1 goes to TMP_REG1 or src reg\n\t   arg2 goes to TMP_REG2, imm or src reg\n\t   TMP_REG3 can be used for caching\n\t   result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */\n\tsljit_s32 dst_r = TMP_REG2;\n\tsljit_s32 src1_r;\n\tsljit_sw src2_r = 0;\n\tsljit_s32 sugg_src2_r = TMP_REG2;\n\n\tif (!(flags & ALT_KEEP_CACHE)) {\n\t\tcompiler->cache_arg = 0;\n\t\tcompiler->cache_argw = 0;\n\t}\n\n\tif (dst != SLJIT_UNUSED) {\n\t\tif (FAST_IS_REG(dst)) {\n\t\t\tdst_r = dst;\n\t\t\tflags |= REG_DEST;\n\t\t\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\t\tsugg_src2_r = dst_r;\n\t\t}\n\t\telse if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw))\n\t\t\tflags |= SLOW_DEST;\n\t}\n\n\tif (flags & IMM_OP) {\n\t\tif ((src2 & SLJIT_IMM) && src2w) {\n\t\t\tif (src2w <= SIMM_MAX && src2w >= SIMM_MIN) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src2w;\n\t\t\t}\n\t\t}\n\t\tif (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) {\n\t\t\tif (src1w <= SIMM_MAX && src1w >= SIMM_MIN) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src1w;\n\n\t\t\t\t/* And swap arguments. */\n\t\t\t\tsrc1 = src2;\n\t\t\t\tsrc1w = src2w;\n\t\t\t\tsrc2 = SLJIT_IMM;\n\t\t\t\t/* src2w = src2_r unneeded. */\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Source 1. */\n\tif (FAST_IS_REG(src1))\n\t\tsrc1_r = src1;\n\telse if (src1 & SLJIT_IMM) {\n\t\tif (src1w) {\n\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, src1w));\n\t\t\tsrc1_r = TMP_REG1;\n\t\t}\n\t\telse\n\t\t\tsrc1_r = 0;\n\t}\n\telse {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC1;\n\t\tsrc1_r = TMP_REG1;\n\t}\n\n\t/* Source 2. */\n\tif (FAST_IS_REG(src2)) {\n\t\tsrc2_r = src2;\n\t\tflags |= REG2_SOURCE;\n\t\tif (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOV_P)\n\t\t\tdst_r = src2_r;\n\t}\n\telse if (src2 & SLJIT_IMM) {\n\t\tif (!(flags & SRC2_IMM)) {\n\t\t\tif (src2w) {\n\t\t\t\tFAIL_IF(load_immediate(compiler, sugg_src2_r, src2w));\n\t\t\t\tsrc2_r = sugg_src2_r;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsrc2_r = 0;\n\t\t\t\tif ((op >= SLJIT_MOV && op <= SLJIT_MOV_P) && (dst & SLJIT_MEM))\n\t\t\t\t\tdst_r = 0;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC2;\n\t\tsrc2_r = sugg_src2_r;\n\t}\n\n\tif ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {\n\t\tSLJIT_ASSERT(src2_r == TMP_REG2);\n\t\tif (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, src1, src1w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw));\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, src2, src2w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2, src2, src2w, dst, dstw));\n\t\t}\n\t}\n\telse if (flags & SLOW_SRC1)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1, src1, src1w, dst, dstw));\n\telse if (flags & SLOW_SRC2)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, sugg_src2_r, src2, src2w, dst, dstw));\n\n\tFAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r));\n\n\tif (dst & SLJIT_MEM) {\n\t\tif (!(flags & SLOW_DEST)) {\n\t\t\tgetput_arg_fast(compiler, flags, dst_r, dst, dstw);\n\t\t\treturn compiler->error;\n\t\t}\n\t\treturn getput_arg(compiler, flags, dst_r, dst, dstw, 0, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_BREAKPOINT:\n\t\treturn push_inst(compiler, TA, UNMOVABLE_INS);\n\tcase SLJIT_NOP:\n\t\treturn push_inst(compiler, NOP, UNMOVABLE_INS);\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\tFAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? UMUL : SMUL) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));\n\t\treturn push_inst(compiler, RDY | D(SLJIT_R1), DR(SLJIT_R1));\n#else\n#error \"Implementation required\"\n#endif\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\tSLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\tif ((op | 0x2) == SLJIT_DIV_UW)\n\t\t\tFAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS));\n\t\telse {\n\t\t\tFAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_R0) | IMM(31), DR(TMP_REG1)));\n\t\t\tFAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS));\n\t\t}\n\t\tif (op <= SLJIT_DIVMOD_SW)\n\t\t\tFAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_R0), DR(TMP_REG2)));\n\t\tFAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));\n\t\tif (op >= SLJIT_DIV_UW)\n\t\t\treturn SLJIT_SUCCESS;\n\t\tFAIL_IF(push_inst(compiler, SMUL | D(SLJIT_R1) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R1)));\n\t\treturn push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1));\n#else\n#error \"Implementation required\"\n#endif\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\treturn emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U32:\n\t\treturn emit_op(compiler, SLJIT_MOV_U32, flags | INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_S32:\n\t\treturn emit_op(compiler, SLJIT_MOV_S32, flags | INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U8:\n\t\treturn emit_op(compiler, SLJIT_MOV_U8, flags | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);\n\n\tcase SLJIT_MOV_S8:\n\t\treturn emit_op(compiler, SLJIT_MOV_S8, flags | BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);\n\n\tcase SLJIT_MOV_U16:\n\t\treturn emit_op(compiler, SLJIT_MOV_U16, flags | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);\n\n\tcase SLJIT_MOV_S16:\n\t\treturn emit_op(compiler, SLJIT_MOV_S16, flags | HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);\n\n\tcase SLJIT_NOT:\n\tcase SLJIT_CLZ:\n\t\treturn emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_NEG:\n\t\treturn emit_op(compiler, SLJIT_SUB, flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 flags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_ADD:\n\tcase SLJIT_ADDC:\n\tcase SLJIT_MUL:\n\tcase SLJIT_AND:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\t\treturn emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SUB:\n\tcase SLJIT_SUBC:\n\t\treturn emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\tif (src2 & SLJIT_IMM)\n\t\t\tsrc2w &= 0x1f;\n#else\n\t\tSLJIT_UNREACHABLE();\n#endif\n\t\treturn emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n\treturn freg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\treturn push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7))\n#define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double)\n#define FLOAT_TMP_MEM_OFFSET (22 * sizeof(sljit_sw))\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw));\n\t\tsrc = TMP_FREG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOI, FDTOI) | FD(TMP_FREG1) | FS2(src), MOVABLE_INS));\n\n\tif (FAST_IS_REG(dst)) {\n\t\tFAIL_IF(emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET));\n\t\treturn emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET);\n\t}\n\n\t/* Store the integer value from a VFP register. */\n\treturn emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, dst, dstw, 0, 0);\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\t\tsrcw = (sljit_s32)srcw;\n#endif\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1, srcw));\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tif (FAST_IS_REG(src)) {\n\t\tFAIL_IF(emit_op_mem2(compiler, WORD_DATA, src, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET));\n\t\tsrc = SLJIT_MEM1(SLJIT_SP);\n\t\tsrcw = FLOAT_TMP_MEM_OFFSET;\n\t}\n\n\tFAIL_IF(emit_op_mem2(compiler, SINGLE_DATA | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw));\n\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FITOS, FITOD) | FD(dst_r) | FS2(TMP_FREG1), MOVABLE_INS));\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tif (src1 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));\n\t\tsrc1 = TMP_FREG1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, 0, 0));\n\t\tsrc2 = TMP_FREG2;\n\t}\n\n\treturn push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | FS1(src1) | FS2(src2), FCC_IS_SET | MOVABLE_INS);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tSLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error);\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)\n\t\top ^= SLJIT_F32_OP;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;\n\n\tif (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_r, src, srcw, dst, dstw));\n\t\tsrc = dst_r;\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV_F64:\n\t\tif (src != dst_r) {\n\t\t\tif (dst_r != TMP_FREG1) {\n\t\t\t\tFAIL_IF(push_inst(compiler, FMOVS | FD(dst_r) | FS2(src), MOVABLE_INS));\n\t\t\t\tif (!(op & SLJIT_F32_OP))\n\t\t\t\t\tFAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS));\n\t\t\t}\n\t\t\telse\n\t\t\t\tdst_r = src;\n\t\t}\n\t\tbreak;\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(push_inst(compiler, FNEGS | FD(dst_r) | FS2(src), MOVABLE_INS));\n\t\tif (dst_r != src && !(op & SLJIT_F32_OP))\n\t\t\tFAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS));\n\t\tbreak;\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(push_inst(compiler, FABSS | FD(dst_r) | FS2(src), MOVABLE_INS));\n\t\tif (dst_r != src && !(op & SLJIT_F32_OP))\n\t\t\tFAIL_IF(push_inst(compiler, FMOVS | FDN(dst_r) | FS2N(src), MOVABLE_INS));\n\t\tbreak;\n\tcase SLJIT_CONV_F64_FROM_F32:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOD, FDTOS) | FD(dst_r) | FS2(src), MOVABLE_INS));\n\t\top ^= SLJIT_F32_OP;\n\t\tbreak;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), dst_r, dst, dstw, 0, 0));\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r, flags = 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG2;\n\n\tif (src1 & SLJIT_MEM) {\n\t\tif (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) {\n\t\t\tFAIL_IF(compiler->error);\n\t\t\tsrc1 = TMP_FREG1;\n\t\t} else\n\t\t\tflags |= SLOW_SRC1;\n\t}\n\n\tif (src2 & SLJIT_MEM) {\n\t\tif (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) {\n\t\t\tFAIL_IF(compiler->error);\n\t\t\tsrc2 = TMP_FREG2;\n\t\t} else\n\t\t\tflags |= SLOW_SRC2;\n\t}\n\n\tif ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {\n\t\tif (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, src1, src1w));\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw));\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));\n\t\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw));\n\t\t}\n\t}\n\telse if (flags & SLOW_SRC1)\n\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw));\n\telse if (flags & SLOW_SRC2)\n\t\tFAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw));\n\n\tif (flags & SLOW_SRC1)\n\t\tsrc1 = TMP_FREG1;\n\tif (flags & SLOW_SRC2)\n\t\tsrc2 = TMP_FREG2;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADDD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUBD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMULD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS));\n\t\tbreak;\n\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIVD) | FD(dst_r) | FS1(src1) | FS2(src2), MOVABLE_INS));\n\t\tbreak;\n\t}\n\n\tif (dst_r == TMP_FREG2)\n\t\tFAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, 0, 0));\n\n\treturn SLJIT_SUCCESS;\n}\n\n#undef FLOAT_DATA\n#undef SELECT_FOP\n\n/* --------------------------------------------------------------------- */\n/*  Other instructions                                                   */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tif (FAST_IS_REG(dst))\n\t\treturn push_inst(compiler, OR | D(dst) | S1(0) | S2(TMP_LINK), DR(dst));\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(push_inst(compiler, OR | D(TMP_LINK) | S1(0) | S2(src), DR(TMP_LINK)));\n\telse\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_LINK, src, srcw));\n\n\tFAIL_IF(push_inst(compiler, JMPL | D(0) | S1(TMP_LINK) | IMM(8), UNMOVABLE_INS));\n\treturn push_inst(compiler, NOP, UNMOVABLE_INS);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\tcompiler->delay_slot = UNMOVABLE_INS;\n\treturn label;\n}\n\nstatic sljit_ins get_cc(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\tcase SLJIT_NOT_EQUAL_F64: /* Unordered. */\n\t\treturn DA(0x1);\n\n\tcase SLJIT_NOT_EQUAL:\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_EQUAL_F64:\n\t\treturn DA(0x9);\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_GREATER_F64: /* Unordered. */\n\t\treturn DA(0x5);\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn DA(0xd);\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_GREATER_EQUAL_F64: /* Unordered. */\n\t\treturn DA(0xc);\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_LESS_F64:\n\t\treturn DA(0x4);\n\n\tcase SLJIT_SIG_LESS:\n\t\treturn DA(0x3);\n\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn DA(0xb);\n\n\tcase SLJIT_SIG_GREATER:\n\t\treturn DA(0xa);\n\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn DA(0x2);\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn DA(0x7);\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_ORDERED_F64:\n\t\treturn DA(0xf);\n\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\treturn DA(0x8);\n\t}\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tif (type < SLJIT_EQUAL_F64) {\n\t\tjump->flags |= IS_COND;\n\t\tif (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET))\n\t\t\tjump->flags |= IS_MOVABLE;\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\tPTR_FAIL_IF(push_inst(compiler, BICC | get_cc(type ^ 1) | 5, UNMOVABLE_INS));\n#else\n#error \"Implementation required\"\n#endif\n\t}\n\telse if (type < SLJIT_JUMP) {\n\t\tjump->flags |= IS_COND;\n\t\tif (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & FCC_IS_SET))\n\t\t\tjump->flags |= IS_MOVABLE;\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\t\tPTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(type ^ 1) | 5, UNMOVABLE_INS));\n#else\n#error \"Implementation required\"\n#endif\n\t}\n\telse {\n\t\tif ((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS)\n\t\t\tjump->flags |= IS_MOVABLE;\n\t\tif (type >= SLJIT_FAST_CALL)\n\t\t\tjump->flags |= IS_CALL;\n\t}\n\n\tPTR_FAIL_IF(emit_const(compiler, TMP_REG1, 0));\n\tPTR_FAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(TMP_REG1) | IMM(0), UNMOVABLE_INS));\n\tjump->addr = compiler->size;\n\tPTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));\n\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n\tPTR_FAIL_IF(call_with_args(compiler, arg_types, NULL));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tstruct sljit_jump *jump = NULL;\n\tsljit_s32 src_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tsrc_r = src;\n\telse if (src & SLJIT_IMM) {\n\t\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\t\tFAIL_IF(!jump);\n\t\tset_jump(jump, compiler, JUMP_ADDR);\n\t\tjump->u.target = srcw;\n\n\t\tif ((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS)\n\t\t\tjump->flags |= IS_MOVABLE;\n\t\tif (type >= SLJIT_FAST_CALL)\n\t\t\tjump->flags |= IS_CALL;\n\n\t\tFAIL_IF(emit_const(compiler, TMP_REG1, 0));\n\t\tsrc_r = TMP_REG1;\n\t}\n\telse {\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw));\n\t\tsrc_r = TMP_REG1;\n\t}\n\n\tFAIL_IF(push_inst(compiler, JMPL | D(type >= SLJIT_FAST_CALL ? TMP_LINK : 0) | S1(src_r) | IMM(0), UNMOVABLE_INS));\n\tif (jump)\n\t\tjump->addr = compiler->size;\n\treturn push_inst(compiler, NOP, UNMOVABLE_INS);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n\tif (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, src, srcw));\n\t\tsrc = TMP_REG1;\n\t}\n\n\tFAIL_IF(call_with_args(compiler, arg_types, &src));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_s32 reg, flags = HAS_FLAGS(op) ? SET_FLAGS : 0;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\top = GET_OPCODE(op);\n\treg = (op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2;\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\n\tif (op >= SLJIT_ADD && (dst & SLJIT_MEM))\n\t\tFAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, TMP_REG1, dst, dstw, dst, dstw));\n\n\ttype &= 0xff;\n\tif (type < SLJIT_EQUAL_F64)\n\t\tFAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS));\n\telse\n\t\tFAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS));\n\n\tFAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS));\n\tFAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS));\n\n\tif (op >= SLJIT_ADD) {\n\t\tflags |= CUMULATIVE_OP | IMM_OP | ALT_KEEP_CACHE;\n\t\tif (dst & SLJIT_MEM)\n\t\t\treturn emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);\n\t\treturn emit_op(compiler, op, flags, dst, 0, dst, 0, TMP_REG2, 0);\n\t}\n\n\tif (!(dst & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS;\n\n\treturn emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw);\n#else\n#error \"Implementation required\"\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)\n\treturn sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);;\n#else\n#error \"Implementation required\"\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tsljit_s32 reg;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\treg = FAST_IS_REG(dst) ? dst : TMP_REG2;\n\n\tPTR_FAIL_IF(emit_const(compiler, reg, init_value));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op_mem(compiler, WORD_DATA, TMP_REG2, dst, dstw));\n\treturn const_;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeTILEGX-encoder.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright 2013-2013 Tilera Corporation(jiwang@tilera.com). All rights reserved.\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* This code is owned by Tilera Corporation, and distributed as part\n   of multiple projects. In sljit, the code is under BSD licence.  */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#define BFD_RELOC(x) R_##x\n\n/* Special registers. */\n#define TREG_LR 55\n#define TREG_SN 56\n#define TREG_ZERO 63\n\n/* Canonical name of each register. */\nconst char *const tilegx_register_names[] =\n{\n  \"r0\",   \"r1\",  \"r2\",  \"r3\",  \"r4\",  \"r5\",  \"r6\",  \"r7\",\n  \"r8\",   \"r9\",  \"r10\", \"r11\", \"r12\", \"r13\", \"r14\", \"r15\",\n  \"r16\",  \"r17\", \"r18\", \"r19\", \"r20\", \"r21\", \"r22\", \"r23\",\n  \"r24\",  \"r25\", \"r26\", \"r27\", \"r28\", \"r29\", \"r30\", \"r31\",\n  \"r32\",  \"r33\", \"r34\", \"r35\", \"r36\", \"r37\", \"r38\", \"r39\",\n  \"r40\",  \"r41\", \"r42\", \"r43\", \"r44\", \"r45\", \"r46\", \"r47\",\n  \"r48\",  \"r49\", \"r50\", \"r51\", \"r52\", \"tp\",  \"sp\",  \"lr\",\n  \"sn\",  \"idn0\", \"idn1\", \"udn0\", \"udn1\", \"udn2\", \"udn3\", \"zero\"\n};\n\nenum\n{\n  R_NONE = 0,\n  R_TILEGX_NONE = 0,\n  R_TILEGX_64 = 1,\n  R_TILEGX_32 = 2,\n  R_TILEGX_16 = 3,\n  R_TILEGX_8 = 4,\n  R_TILEGX_64_PCREL = 5,\n  R_TILEGX_32_PCREL = 6,\n  R_TILEGX_16_PCREL = 7,\n  R_TILEGX_8_PCREL = 8,\n  R_TILEGX_HW0 = 9,\n  R_TILEGX_HW1 = 10,\n  R_TILEGX_HW2 = 11,\n  R_TILEGX_HW3 = 12,\n  R_TILEGX_HW0_LAST = 13,\n  R_TILEGX_HW1_LAST = 14,\n  R_TILEGX_HW2_LAST = 15,\n  R_TILEGX_COPY = 16,\n  R_TILEGX_GLOB_DAT = 17,\n  R_TILEGX_JMP_SLOT = 18,\n  R_TILEGX_RELATIVE = 19,\n  R_TILEGX_BROFF_X1 = 20,\n  R_TILEGX_JUMPOFF_X1 = 21,\n  R_TILEGX_JUMPOFF_X1_PLT = 22,\n  R_TILEGX_IMM8_X0 = 23,\n  R_TILEGX_IMM8_Y0 = 24,\n  R_TILEGX_IMM8_X1 = 25,\n  R_TILEGX_IMM8_Y1 = 26,\n  R_TILEGX_DEST_IMM8_X1 = 27,\n  R_TILEGX_MT_IMM14_X1 = 28,\n  R_TILEGX_MF_IMM14_X1 = 29,\n  R_TILEGX_MMSTART_X0 = 30,\n  R_TILEGX_MMEND_X0 = 31,\n  R_TILEGX_SHAMT_X0 = 32,\n  R_TILEGX_SHAMT_X1 = 33,\n  R_TILEGX_SHAMT_Y0 = 34,\n  R_TILEGX_SHAMT_Y1 = 35,\n  R_TILEGX_IMM16_X0_HW0 = 36,\n  R_TILEGX_IMM16_X1_HW0 = 37,\n  R_TILEGX_IMM16_X0_HW1 = 38,\n  R_TILEGX_IMM16_X1_HW1 = 39,\n  R_TILEGX_IMM16_X0_HW2 = 40,\n  R_TILEGX_IMM16_X1_HW2 = 41,\n  R_TILEGX_IMM16_X0_HW3 = 42,\n  R_TILEGX_IMM16_X1_HW3 = 43,\n  R_TILEGX_IMM16_X0_HW0_LAST = 44,\n  R_TILEGX_IMM16_X1_HW0_LAST = 45,\n  R_TILEGX_IMM16_X0_HW1_LAST = 46,\n  R_TILEGX_IMM16_X1_HW1_LAST = 47,\n  R_TILEGX_IMM16_X0_HW2_LAST = 48,\n  R_TILEGX_IMM16_X1_HW2_LAST = 49,\n  R_TILEGX_IMM16_X0_HW0_PCREL = 50,\n  R_TILEGX_IMM16_X1_HW0_PCREL = 51,\n  R_TILEGX_IMM16_X0_HW1_PCREL = 52,\n  R_TILEGX_IMM16_X1_HW1_PCREL = 53,\n  R_TILEGX_IMM16_X0_HW2_PCREL = 54,\n  R_TILEGX_IMM16_X1_HW2_PCREL = 55,\n  R_TILEGX_IMM16_X0_HW3_PCREL = 56,\n  R_TILEGX_IMM16_X1_HW3_PCREL = 57,\n  R_TILEGX_IMM16_X0_HW0_LAST_PCREL = 58,\n  R_TILEGX_IMM16_X1_HW0_LAST_PCREL = 59,\n  R_TILEGX_IMM16_X0_HW1_LAST_PCREL = 60,\n  R_TILEGX_IMM16_X1_HW1_LAST_PCREL = 61,\n  R_TILEGX_IMM16_X0_HW2_LAST_PCREL = 62,\n  R_TILEGX_IMM16_X1_HW2_LAST_PCREL = 63,\n  R_TILEGX_IMM16_X0_HW0_GOT = 64,\n  R_TILEGX_IMM16_X1_HW0_GOT = 65,\n\n  R_TILEGX_IMM16_X0_HW0_PLT_PCREL = 66,\n  R_TILEGX_IMM16_X1_HW0_PLT_PCREL = 67,\n  R_TILEGX_IMM16_X0_HW1_PLT_PCREL = 68,\n  R_TILEGX_IMM16_X1_HW1_PLT_PCREL = 69,\n  R_TILEGX_IMM16_X0_HW2_PLT_PCREL = 70,\n  R_TILEGX_IMM16_X1_HW2_PLT_PCREL = 71,\n\n  R_TILEGX_IMM16_X0_HW0_LAST_GOT = 72,\n  R_TILEGX_IMM16_X1_HW0_LAST_GOT = 73,\n  R_TILEGX_IMM16_X0_HW1_LAST_GOT = 74,\n  R_TILEGX_IMM16_X1_HW1_LAST_GOT = 75,\n  R_TILEGX_IMM16_X0_HW0_TLS_GD = 78,\n  R_TILEGX_IMM16_X1_HW0_TLS_GD = 79,\n  R_TILEGX_IMM16_X0_HW0_TLS_LE = 80,\n  R_TILEGX_IMM16_X1_HW0_TLS_LE = 81,\n  R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE = 82,\n  R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE = 83,\n  R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE = 84,\n  R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE = 85,\n  R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD = 86,\n  R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD = 87,\n  R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD = 88,\n  R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD = 89,\n  R_TILEGX_IMM16_X0_HW0_TLS_IE = 92,\n  R_TILEGX_IMM16_X1_HW0_TLS_IE = 93,\n\n  R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL = 94,\n  R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL = 95,\n  R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL = 96,\n  R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL = 97,\n  R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL = 98,\n  R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL = 99,\n\n  R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE = 100,\n  R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE = 101,\n  R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE = 102,\n  R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE = 103,\n  R_TILEGX_TLS_DTPMOD64 = 106,\n  R_TILEGX_TLS_DTPOFF64 = 107,\n  R_TILEGX_TLS_TPOFF64 = 108,\n  R_TILEGX_TLS_DTPMOD32 = 109,\n  R_TILEGX_TLS_DTPOFF32 = 110,\n  R_TILEGX_TLS_TPOFF32 = 111,\n  R_TILEGX_TLS_GD_CALL = 112,\n  R_TILEGX_IMM8_X0_TLS_GD_ADD = 113,\n  R_TILEGX_IMM8_X1_TLS_GD_ADD = 114,\n  R_TILEGX_IMM8_Y0_TLS_GD_ADD = 115,\n  R_TILEGX_IMM8_Y1_TLS_GD_ADD = 116,\n  R_TILEGX_TLS_IE_LOAD = 117,\n  R_TILEGX_IMM8_X0_TLS_ADD = 118,\n  R_TILEGX_IMM8_X1_TLS_ADD = 119,\n  R_TILEGX_IMM8_Y0_TLS_ADD = 120,\n  R_TILEGX_IMM8_Y1_TLS_ADD = 121,\n  R_TILEGX_GNU_VTINHERIT = 128,\n  R_TILEGX_GNU_VTENTRY = 129,\n  R_TILEGX_IRELATIVE = 130,\n  R_TILEGX_NUM = 131\n};\n\ntypedef enum\n{\n  TILEGX_PIPELINE_X0,\n  TILEGX_PIPELINE_X1,\n  TILEGX_PIPELINE_Y0,\n  TILEGX_PIPELINE_Y1,\n  TILEGX_PIPELINE_Y2,\n} tilegx_pipeline;\n\ntypedef unsigned long long tilegx_bundle_bits;\n\n/* These are the bits that determine if a bundle is in the X encoding. */\n#define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62)\n\nenum\n{\n  /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */\n  TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3,\n\n  /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */\n  TILEGX_NUM_PIPELINE_ENCODINGS = 5,\n\n  /* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */\n  TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3,\n\n  /* Instructions take this many bytes. */\n  TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES,\n\n  /* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */\n  TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3,\n\n  /* Bundles should be aligned modulo this number of bytes. */\n  TILEGX_BUNDLE_ALIGNMENT_IN_BYTES =\n    (1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES),\n\n  /* Number of registers (some are magic, such as network I/O). */\n  TILEGX_NUM_REGISTERS = 64,\n};\n\n/* Make a few \"tile_\" variables to simplify common code between\n   architectures.  */\n\ntypedef tilegx_bundle_bits tile_bundle_bits;\n#define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES\n#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES\n#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \\\n  TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES\n\n/* 64-bit pattern for a { bpt ; nop } bundle. */\n#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL\n\ntypedef enum\n{\n  TILEGX_OP_TYPE_REGISTER,\n  TILEGX_OP_TYPE_IMMEDIATE,\n  TILEGX_OP_TYPE_ADDRESS,\n  TILEGX_OP_TYPE_SPR\n} tilegx_operand_type;\n\nstruct tilegx_operand\n{\n  /* Is this operand a register, immediate or address? */\n  tilegx_operand_type type;\n\n  /* The default relocation type for this operand.  */\n  signed int default_reloc : 16;\n\n  /* How many bits is this value? (used for range checking) */\n  unsigned int num_bits : 5;\n\n  /* Is the value signed? (used for range checking) */\n  unsigned int is_signed : 1;\n\n  /* Is this operand a source register? */\n  unsigned int is_src_reg : 1;\n\n  /* Is this operand written? (i.e. is it a destination register) */\n  unsigned int is_dest_reg : 1;\n\n  /* Is this operand PC-relative? */\n  unsigned int is_pc_relative : 1;\n\n  /* By how many bits do we right shift the value before inserting? */\n  unsigned int rightshift : 2;\n\n  /* Return the bits for this operand to be ORed into an existing bundle. */\n  tilegx_bundle_bits (*insert) (int op);\n\n  /* Extract this operand and return it. */\n  unsigned int (*extract) (tilegx_bundle_bits bundle);\n};\n\ntypedef enum\n{\n  TILEGX_OPC_BPT,\n  TILEGX_OPC_INFO,\n  TILEGX_OPC_INFOL,\n  TILEGX_OPC_LD4S_TLS,\n  TILEGX_OPC_LD_TLS,\n  TILEGX_OPC_MOVE,\n  TILEGX_OPC_MOVEI,\n  TILEGX_OPC_MOVELI,\n  TILEGX_OPC_PREFETCH,\n  TILEGX_OPC_PREFETCH_ADD_L1,\n  TILEGX_OPC_PREFETCH_ADD_L1_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L2,\n  TILEGX_OPC_PREFETCH_ADD_L2_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L3,\n  TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  TILEGX_OPC_PREFETCH_L1,\n  TILEGX_OPC_PREFETCH_L1_FAULT,\n  TILEGX_OPC_PREFETCH_L2,\n  TILEGX_OPC_PREFETCH_L2_FAULT,\n  TILEGX_OPC_PREFETCH_L3,\n  TILEGX_OPC_PREFETCH_L3_FAULT,\n  TILEGX_OPC_RAISE,\n  TILEGX_OPC_ADD,\n  TILEGX_OPC_ADDI,\n  TILEGX_OPC_ADDLI,\n  TILEGX_OPC_ADDX,\n  TILEGX_OPC_ADDXI,\n  TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXSC,\n  TILEGX_OPC_AND,\n  TILEGX_OPC_ANDI,\n  TILEGX_OPC_BEQZ,\n  TILEGX_OPC_BEQZT,\n  TILEGX_OPC_BFEXTS,\n  TILEGX_OPC_BFEXTU,\n  TILEGX_OPC_BFINS,\n  TILEGX_OPC_BGEZ,\n  TILEGX_OPC_BGEZT,\n  TILEGX_OPC_BGTZ,\n  TILEGX_OPC_BGTZT,\n  TILEGX_OPC_BLBC,\n  TILEGX_OPC_BLBCT,\n  TILEGX_OPC_BLBS,\n  TILEGX_OPC_BLBST,\n  TILEGX_OPC_BLEZ,\n  TILEGX_OPC_BLEZT,\n  TILEGX_OPC_BLTZ,\n  TILEGX_OPC_BLTZT,\n  TILEGX_OPC_BNEZ,\n  TILEGX_OPC_BNEZT,\n  TILEGX_OPC_CLZ,\n  TILEGX_OPC_CMOVEQZ,\n  TILEGX_OPC_CMOVNEZ,\n  TILEGX_OPC_CMPEQ,\n  TILEGX_OPC_CMPEQI,\n  TILEGX_OPC_CMPEXCH,\n  TILEGX_OPC_CMPEXCH4,\n  TILEGX_OPC_CMPLES,\n  TILEGX_OPC_CMPLEU,\n  TILEGX_OPC_CMPLTS,\n  TILEGX_OPC_CMPLTSI,\n  TILEGX_OPC_CMPLTU,\n  TILEGX_OPC_CMPLTUI,\n  TILEGX_OPC_CMPNE,\n  TILEGX_OPC_CMUL,\n  TILEGX_OPC_CMULA,\n  TILEGX_OPC_CMULAF,\n  TILEGX_OPC_CMULF,\n  TILEGX_OPC_CMULFR,\n  TILEGX_OPC_CMULH,\n  TILEGX_OPC_CMULHR,\n  TILEGX_OPC_CRC32_32,\n  TILEGX_OPC_CRC32_8,\n  TILEGX_OPC_CTZ,\n  TILEGX_OPC_DBLALIGN,\n  TILEGX_OPC_DBLALIGN2,\n  TILEGX_OPC_DBLALIGN4,\n  TILEGX_OPC_DBLALIGN6,\n  TILEGX_OPC_DRAIN,\n  TILEGX_OPC_DTLBPR,\n  TILEGX_OPC_EXCH,\n  TILEGX_OPC_EXCH4,\n  TILEGX_OPC_FDOUBLE_ADD_FLAGS,\n  TILEGX_OPC_FDOUBLE_ADDSUB,\n  TILEGX_OPC_FDOUBLE_MUL_FLAGS,\n  TILEGX_OPC_FDOUBLE_PACK1,\n  TILEGX_OPC_FDOUBLE_PACK2,\n  TILEGX_OPC_FDOUBLE_SUB_FLAGS,\n  TILEGX_OPC_FDOUBLE_UNPACK_MAX,\n  TILEGX_OPC_FDOUBLE_UNPACK_MIN,\n  TILEGX_OPC_FETCHADD,\n  TILEGX_OPC_FETCHADD4,\n  TILEGX_OPC_FETCHADDGEZ,\n  TILEGX_OPC_FETCHADDGEZ4,\n  TILEGX_OPC_FETCHAND,\n  TILEGX_OPC_FETCHAND4,\n  TILEGX_OPC_FETCHOR,\n  TILEGX_OPC_FETCHOR4,\n  TILEGX_OPC_FINV,\n  TILEGX_OPC_FLUSH,\n  TILEGX_OPC_FLUSHWB,\n  TILEGX_OPC_FNOP,\n  TILEGX_OPC_FSINGLE_ADD1,\n  TILEGX_OPC_FSINGLE_ADDSUB2,\n  TILEGX_OPC_FSINGLE_MUL1,\n  TILEGX_OPC_FSINGLE_MUL2,\n  TILEGX_OPC_FSINGLE_PACK1,\n  TILEGX_OPC_FSINGLE_PACK2,\n  TILEGX_OPC_FSINGLE_SUB1,\n  TILEGX_OPC_ICOH,\n  TILEGX_OPC_ILL,\n  TILEGX_OPC_INV,\n  TILEGX_OPC_IRET,\n  TILEGX_OPC_J,\n  TILEGX_OPC_JAL,\n  TILEGX_OPC_JALR,\n  TILEGX_OPC_JALRP,\n  TILEGX_OPC_JR,\n  TILEGX_OPC_JRP,\n  TILEGX_OPC_LD,\n  TILEGX_OPC_LD1S,\n  TILEGX_OPC_LD1S_ADD,\n  TILEGX_OPC_LD1U,\n  TILEGX_OPC_LD1U_ADD,\n  TILEGX_OPC_LD2S,\n  TILEGX_OPC_LD2S_ADD,\n  TILEGX_OPC_LD2U,\n  TILEGX_OPC_LD2U_ADD,\n  TILEGX_OPC_LD4S,\n  TILEGX_OPC_LD4S_ADD,\n  TILEGX_OPC_LD4U,\n  TILEGX_OPC_LD4U_ADD,\n  TILEGX_OPC_LD_ADD,\n  TILEGX_OPC_LDNA,\n  TILEGX_OPC_LDNA_ADD,\n  TILEGX_OPC_LDNT,\n  TILEGX_OPC_LDNT1S,\n  TILEGX_OPC_LDNT1S_ADD,\n  TILEGX_OPC_LDNT1U,\n  TILEGX_OPC_LDNT1U_ADD,\n  TILEGX_OPC_LDNT2S,\n  TILEGX_OPC_LDNT2S_ADD,\n  TILEGX_OPC_LDNT2U,\n  TILEGX_OPC_LDNT2U_ADD,\n  TILEGX_OPC_LDNT4S,\n  TILEGX_OPC_LDNT4S_ADD,\n  TILEGX_OPC_LDNT4U,\n  TILEGX_OPC_LDNT4U_ADD,\n  TILEGX_OPC_LDNT_ADD,\n  TILEGX_OPC_LNK,\n  TILEGX_OPC_MF,\n  TILEGX_OPC_MFSPR,\n  TILEGX_OPC_MM,\n  TILEGX_OPC_MNZ,\n  TILEGX_OPC_MTSPR,\n  TILEGX_OPC_MUL_HS_HS,\n  TILEGX_OPC_MUL_HS_HU,\n  TILEGX_OPC_MUL_HS_LS,\n  TILEGX_OPC_MUL_HS_LU,\n  TILEGX_OPC_MUL_HU_HU,\n  TILEGX_OPC_MUL_HU_LS,\n  TILEGX_OPC_MUL_HU_LU,\n  TILEGX_OPC_MUL_LS_LS,\n  TILEGX_OPC_MUL_LS_LU,\n  TILEGX_OPC_MUL_LU_LU,\n  TILEGX_OPC_MULA_HS_HS,\n  TILEGX_OPC_MULA_HS_HU,\n  TILEGX_OPC_MULA_HS_LS,\n  TILEGX_OPC_MULA_HS_LU,\n  TILEGX_OPC_MULA_HU_HU,\n  TILEGX_OPC_MULA_HU_LS,\n  TILEGX_OPC_MULA_HU_LU,\n  TILEGX_OPC_MULA_LS_LS,\n  TILEGX_OPC_MULA_LS_LU,\n  TILEGX_OPC_MULA_LU_LU,\n  TILEGX_OPC_MULAX,\n  TILEGX_OPC_MULX,\n  TILEGX_OPC_MZ,\n  TILEGX_OPC_NAP,\n  TILEGX_OPC_NOP,\n  TILEGX_OPC_NOR,\n  TILEGX_OPC_OR,\n  TILEGX_OPC_ORI,\n  TILEGX_OPC_PCNT,\n  TILEGX_OPC_REVBITS,\n  TILEGX_OPC_REVBYTES,\n  TILEGX_OPC_ROTL,\n  TILEGX_OPC_ROTLI,\n  TILEGX_OPC_SHL,\n  TILEGX_OPC_SHL16INSLI,\n  TILEGX_OPC_SHL1ADD,\n  TILEGX_OPC_SHL1ADDX,\n  TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL2ADDX,\n  TILEGX_OPC_SHL3ADD,\n  TILEGX_OPC_SHL3ADDX,\n  TILEGX_OPC_SHLI,\n  TILEGX_OPC_SHLX,\n  TILEGX_OPC_SHLXI,\n  TILEGX_OPC_SHRS,\n  TILEGX_OPC_SHRSI,\n  TILEGX_OPC_SHRU,\n  TILEGX_OPC_SHRUI,\n  TILEGX_OPC_SHRUX,\n  TILEGX_OPC_SHRUXI,\n  TILEGX_OPC_SHUFFLEBYTES,\n  TILEGX_OPC_ST,\n  TILEGX_OPC_ST1,\n  TILEGX_OPC_ST1_ADD,\n  TILEGX_OPC_ST2,\n  TILEGX_OPC_ST2_ADD,\n  TILEGX_OPC_ST4,\n  TILEGX_OPC_ST4_ADD,\n  TILEGX_OPC_ST_ADD,\n  TILEGX_OPC_STNT,\n  TILEGX_OPC_STNT1,\n  TILEGX_OPC_STNT1_ADD,\n  TILEGX_OPC_STNT2,\n  TILEGX_OPC_STNT2_ADD,\n  TILEGX_OPC_STNT4,\n  TILEGX_OPC_STNT4_ADD,\n  TILEGX_OPC_STNT_ADD,\n  TILEGX_OPC_SUB,\n  TILEGX_OPC_SUBX,\n  TILEGX_OPC_SUBXSC,\n  TILEGX_OPC_SWINT0,\n  TILEGX_OPC_SWINT1,\n  TILEGX_OPC_SWINT2,\n  TILEGX_OPC_SWINT3,\n  TILEGX_OPC_TBLIDXB0,\n  TILEGX_OPC_TBLIDXB1,\n  TILEGX_OPC_TBLIDXB2,\n  TILEGX_OPC_TBLIDXB3,\n  TILEGX_OPC_V1ADD,\n  TILEGX_OPC_V1ADDI,\n  TILEGX_OPC_V1ADDUC,\n  TILEGX_OPC_V1ADIFFU,\n  TILEGX_OPC_V1AVGU,\n  TILEGX_OPC_V1CMPEQ,\n  TILEGX_OPC_V1CMPEQI,\n  TILEGX_OPC_V1CMPLES,\n  TILEGX_OPC_V1CMPLEU,\n  TILEGX_OPC_V1CMPLTS,\n  TILEGX_OPC_V1CMPLTSI,\n  TILEGX_OPC_V1CMPLTU,\n  TILEGX_OPC_V1CMPLTUI,\n  TILEGX_OPC_V1CMPNE,\n  TILEGX_OPC_V1DDOTPU,\n  TILEGX_OPC_V1DDOTPUA,\n  TILEGX_OPC_V1DDOTPUS,\n  TILEGX_OPC_V1DDOTPUSA,\n  TILEGX_OPC_V1DOTP,\n  TILEGX_OPC_V1DOTPA,\n  TILEGX_OPC_V1DOTPU,\n  TILEGX_OPC_V1DOTPUA,\n  TILEGX_OPC_V1DOTPUS,\n  TILEGX_OPC_V1DOTPUSA,\n  TILEGX_OPC_V1INT_H,\n  TILEGX_OPC_V1INT_L,\n  TILEGX_OPC_V1MAXU,\n  TILEGX_OPC_V1MAXUI,\n  TILEGX_OPC_V1MINU,\n  TILEGX_OPC_V1MINUI,\n  TILEGX_OPC_V1MNZ,\n  TILEGX_OPC_V1MULTU,\n  TILEGX_OPC_V1MULU,\n  TILEGX_OPC_V1MULUS,\n  TILEGX_OPC_V1MZ,\n  TILEGX_OPC_V1SADAU,\n  TILEGX_OPC_V1SADU,\n  TILEGX_OPC_V1SHL,\n  TILEGX_OPC_V1SHLI,\n  TILEGX_OPC_V1SHRS,\n  TILEGX_OPC_V1SHRSI,\n  TILEGX_OPC_V1SHRU,\n  TILEGX_OPC_V1SHRUI,\n  TILEGX_OPC_V1SUB,\n  TILEGX_OPC_V1SUBUC,\n  TILEGX_OPC_V2ADD,\n  TILEGX_OPC_V2ADDI,\n  TILEGX_OPC_V2ADDSC,\n  TILEGX_OPC_V2ADIFFS,\n  TILEGX_OPC_V2AVGS,\n  TILEGX_OPC_V2CMPEQ,\n  TILEGX_OPC_V2CMPEQI,\n  TILEGX_OPC_V2CMPLES,\n  TILEGX_OPC_V2CMPLEU,\n  TILEGX_OPC_V2CMPLTS,\n  TILEGX_OPC_V2CMPLTSI,\n  TILEGX_OPC_V2CMPLTU,\n  TILEGX_OPC_V2CMPLTUI,\n  TILEGX_OPC_V2CMPNE,\n  TILEGX_OPC_V2DOTP,\n  TILEGX_OPC_V2DOTPA,\n  TILEGX_OPC_V2INT_H,\n  TILEGX_OPC_V2INT_L,\n  TILEGX_OPC_V2MAXS,\n  TILEGX_OPC_V2MAXSI,\n  TILEGX_OPC_V2MINS,\n  TILEGX_OPC_V2MINSI,\n  TILEGX_OPC_V2MNZ,\n  TILEGX_OPC_V2MULFSC,\n  TILEGX_OPC_V2MULS,\n  TILEGX_OPC_V2MULTS,\n  TILEGX_OPC_V2MZ,\n  TILEGX_OPC_V2PACKH,\n  TILEGX_OPC_V2PACKL,\n  TILEGX_OPC_V2PACKUC,\n  TILEGX_OPC_V2SADAS,\n  TILEGX_OPC_V2SADAU,\n  TILEGX_OPC_V2SADS,\n  TILEGX_OPC_V2SADU,\n  TILEGX_OPC_V2SHL,\n  TILEGX_OPC_V2SHLI,\n  TILEGX_OPC_V2SHLSC,\n  TILEGX_OPC_V2SHRS,\n  TILEGX_OPC_V2SHRSI,\n  TILEGX_OPC_V2SHRU,\n  TILEGX_OPC_V2SHRUI,\n  TILEGX_OPC_V2SUB,\n  TILEGX_OPC_V2SUBSC,\n  TILEGX_OPC_V4ADD,\n  TILEGX_OPC_V4ADDSC,\n  TILEGX_OPC_V4INT_H,\n  TILEGX_OPC_V4INT_L,\n  TILEGX_OPC_V4PACKSC,\n  TILEGX_OPC_V4SHL,\n  TILEGX_OPC_V4SHLSC,\n  TILEGX_OPC_V4SHRS,\n  TILEGX_OPC_V4SHRU,\n  TILEGX_OPC_V4SUB,\n  TILEGX_OPC_V4SUBSC,\n  TILEGX_OPC_WH64,\n  TILEGX_OPC_XOR,\n  TILEGX_OPC_XORI,\n  TILEGX_OPC_NONE\n} tilegx_mnemonic;\n\nenum\n{\n  TILEGX_MAX_OPERANDS = 4 /* bfexts */\n};\n\nstruct tilegx_opcode\n{\n  /* The opcode mnemonic, e.g. \"add\" */\n  const char *name;\n\n  /* The enum value for this mnemonic. */\n  tilegx_mnemonic mnemonic;\n\n  /* A bit mask of which of the five pipes this instruction\n     is compatible with:\n     X0  0x01\n     X1  0x02\n     Y0  0x04\n     Y1  0x08\n     Y2  0x10 */\n  unsigned char pipes;\n\n  /* How many operands are there? */\n  unsigned char num_operands;\n\n  /* Which register does this write implicitly, or TREG_ZERO if none? */\n  unsigned char implicitly_written_register;\n\n  /* Can this be bundled with other instructions (almost always true). */\n  unsigned char can_bundle;\n\n  /* The description of the operands. Each of these is an\n   * index into the tilegx_operands[] table. */\n  unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS];\n\n  /* A mask of which bits have predefined values for each pipeline.\n   * This is useful for disassembly. */\n  tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS];\n\n  /* For each bit set in fixed_bit_masks, what the value is for this\n   * instruction. */\n  tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS];\n};\n\n/* Used for non-textual disassembly into structs. */\nstruct tilegx_decoded_instruction\n{\n  const struct tilegx_opcode *opcode;\n  const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS];\n  long long operand_values[TILEGX_MAX_OPERANDS];\n};\n\nenum\n{\n  ADDI_IMM8_OPCODE_X0 = 1,\n  ADDI_IMM8_OPCODE_X1 = 1,\n  ADDI_OPCODE_Y0 = 0,\n  ADDI_OPCODE_Y1 = 1,\n  ADDLI_OPCODE_X0 = 1,\n  ADDLI_OPCODE_X1 = 0,\n  ADDXI_IMM8_OPCODE_X0 = 2,\n  ADDXI_IMM8_OPCODE_X1 = 2,\n  ADDXI_OPCODE_Y0 = 1,\n  ADDXI_OPCODE_Y1 = 2,\n  ADDXLI_OPCODE_X0 = 2,\n  ADDXLI_OPCODE_X1 = 1,\n  ADDXSC_RRR_0_OPCODE_X0 = 1,\n  ADDXSC_RRR_0_OPCODE_X1 = 1,\n  ADDX_RRR_0_OPCODE_X0 = 2,\n  ADDX_RRR_0_OPCODE_X1 = 2,\n  ADDX_RRR_0_OPCODE_Y0 = 0,\n  ADDX_SPECIAL_0_OPCODE_Y1 = 0,\n  ADD_RRR_0_OPCODE_X0 = 3,\n  ADD_RRR_0_OPCODE_X1 = 3,\n  ADD_RRR_0_OPCODE_Y0 = 1,\n  ADD_SPECIAL_0_OPCODE_Y1 = 1,\n  ANDI_IMM8_OPCODE_X0 = 3,\n  ANDI_IMM8_OPCODE_X1 = 3,\n  ANDI_OPCODE_Y0 = 2,\n  ANDI_OPCODE_Y1 = 3,\n  AND_RRR_0_OPCODE_X0 = 4,\n  AND_RRR_0_OPCODE_X1 = 4,\n  AND_RRR_5_OPCODE_Y0 = 0,\n  AND_RRR_5_OPCODE_Y1 = 0,\n  BEQZT_BRANCH_OPCODE_X1 = 16,\n  BEQZ_BRANCH_OPCODE_X1 = 17,\n  BFEXTS_BF_OPCODE_X0 = 4,\n  BFEXTU_BF_OPCODE_X0 = 5,\n  BFINS_BF_OPCODE_X0 = 6,\n  BF_OPCODE_X0 = 3,\n  BGEZT_BRANCH_OPCODE_X1 = 18,\n  BGEZ_BRANCH_OPCODE_X1 = 19,\n  BGTZT_BRANCH_OPCODE_X1 = 20,\n  BGTZ_BRANCH_OPCODE_X1 = 21,\n  BLBCT_BRANCH_OPCODE_X1 = 22,\n  BLBC_BRANCH_OPCODE_X1 = 23,\n  BLBST_BRANCH_OPCODE_X1 = 24,\n  BLBS_BRANCH_OPCODE_X1 = 25,\n  BLEZT_BRANCH_OPCODE_X1 = 26,\n  BLEZ_BRANCH_OPCODE_X1 = 27,\n  BLTZT_BRANCH_OPCODE_X1 = 28,\n  BLTZ_BRANCH_OPCODE_X1 = 29,\n  BNEZT_BRANCH_OPCODE_X1 = 30,\n  BNEZ_BRANCH_OPCODE_X1 = 31,\n  BRANCH_OPCODE_X1 = 2,\n  CMOVEQZ_RRR_0_OPCODE_X0 = 5,\n  CMOVEQZ_RRR_4_OPCODE_Y0 = 0,\n  CMOVNEZ_RRR_0_OPCODE_X0 = 6,\n  CMOVNEZ_RRR_4_OPCODE_Y0 = 1,\n  CMPEQI_IMM8_OPCODE_X0 = 4,\n  CMPEQI_IMM8_OPCODE_X1 = 4,\n  CMPEQI_OPCODE_Y0 = 3,\n  CMPEQI_OPCODE_Y1 = 4,\n  CMPEQ_RRR_0_OPCODE_X0 = 7,\n  CMPEQ_RRR_0_OPCODE_X1 = 5,\n  CMPEQ_RRR_3_OPCODE_Y0 = 0,\n  CMPEQ_RRR_3_OPCODE_Y1 = 2,\n  CMPEXCH4_RRR_0_OPCODE_X1 = 6,\n  CMPEXCH_RRR_0_OPCODE_X1 = 7,\n  CMPLES_RRR_0_OPCODE_X0 = 8,\n  CMPLES_RRR_0_OPCODE_X1 = 8,\n  CMPLES_RRR_2_OPCODE_Y0 = 0,\n  CMPLES_RRR_2_OPCODE_Y1 = 0,\n  CMPLEU_RRR_0_OPCODE_X0 = 9,\n  CMPLEU_RRR_0_OPCODE_X1 = 9,\n  CMPLEU_RRR_2_OPCODE_Y0 = 1,\n  CMPLEU_RRR_2_OPCODE_Y1 = 1,\n  CMPLTSI_IMM8_OPCODE_X0 = 5,\n  CMPLTSI_IMM8_OPCODE_X1 = 5,\n  CMPLTSI_OPCODE_Y0 = 4,\n  CMPLTSI_OPCODE_Y1 = 5,\n  CMPLTS_RRR_0_OPCODE_X0 = 10,\n  CMPLTS_RRR_0_OPCODE_X1 = 10,\n  CMPLTS_RRR_2_OPCODE_Y0 = 2,\n  CMPLTS_RRR_2_OPCODE_Y1 = 2,\n  CMPLTUI_IMM8_OPCODE_X0 = 6,\n  CMPLTUI_IMM8_OPCODE_X1 = 6,\n  CMPLTU_RRR_0_OPCODE_X0 = 11,\n  CMPLTU_RRR_0_OPCODE_X1 = 11,\n  CMPLTU_RRR_2_OPCODE_Y0 = 3,\n  CMPLTU_RRR_2_OPCODE_Y1 = 3,\n  CMPNE_RRR_0_OPCODE_X0 = 12,\n  CMPNE_RRR_0_OPCODE_X1 = 12,\n  CMPNE_RRR_3_OPCODE_Y0 = 1,\n  CMPNE_RRR_3_OPCODE_Y1 = 3,\n  CMULAF_RRR_0_OPCODE_X0 = 13,\n  CMULA_RRR_0_OPCODE_X0 = 14,\n  CMULFR_RRR_0_OPCODE_X0 = 15,\n  CMULF_RRR_0_OPCODE_X0 = 16,\n  CMULHR_RRR_0_OPCODE_X0 = 17,\n  CMULH_RRR_0_OPCODE_X0 = 18,\n  CMUL_RRR_0_OPCODE_X0 = 19,\n  CNTLZ_UNARY_OPCODE_X0 = 1,\n  CNTLZ_UNARY_OPCODE_Y0 = 1,\n  CNTTZ_UNARY_OPCODE_X0 = 2,\n  CNTTZ_UNARY_OPCODE_Y0 = 2,\n  CRC32_32_RRR_0_OPCODE_X0 = 20,\n  CRC32_8_RRR_0_OPCODE_X0 = 21,\n  DBLALIGN2_RRR_0_OPCODE_X0 = 22,\n  DBLALIGN2_RRR_0_OPCODE_X1 = 13,\n  DBLALIGN4_RRR_0_OPCODE_X0 = 23,\n  DBLALIGN4_RRR_0_OPCODE_X1 = 14,\n  DBLALIGN6_RRR_0_OPCODE_X0 = 24,\n  DBLALIGN6_RRR_0_OPCODE_X1 = 15,\n  DBLALIGN_RRR_0_OPCODE_X0 = 25,\n  DRAIN_UNARY_OPCODE_X1 = 1,\n  DTLBPR_UNARY_OPCODE_X1 = 2,\n  EXCH4_RRR_0_OPCODE_X1 = 16,\n  EXCH_RRR_0_OPCODE_X1 = 17,\n  FDOUBLE_ADDSUB_RRR_0_OPCODE_X0 = 26,\n  FDOUBLE_ADD_FLAGS_RRR_0_OPCODE_X0 = 27,\n  FDOUBLE_MUL_FLAGS_RRR_0_OPCODE_X0 = 28,\n  FDOUBLE_PACK1_RRR_0_OPCODE_X0 = 29,\n  FDOUBLE_PACK2_RRR_0_OPCODE_X0 = 30,\n  FDOUBLE_SUB_FLAGS_RRR_0_OPCODE_X0 = 31,\n  FDOUBLE_UNPACK_MAX_RRR_0_OPCODE_X0 = 32,\n  FDOUBLE_UNPACK_MIN_RRR_0_OPCODE_X0 = 33,\n  FETCHADD4_RRR_0_OPCODE_X1 = 18,\n  FETCHADDGEZ4_RRR_0_OPCODE_X1 = 19,\n  FETCHADDGEZ_RRR_0_OPCODE_X1 = 20,\n  FETCHADD_RRR_0_OPCODE_X1 = 21,\n  FETCHAND4_RRR_0_OPCODE_X1 = 22,\n  FETCHAND_RRR_0_OPCODE_X1 = 23,\n  FETCHOR4_RRR_0_OPCODE_X1 = 24,\n  FETCHOR_RRR_0_OPCODE_X1 = 25,\n  FINV_UNARY_OPCODE_X1 = 3,\n  FLUSHWB_UNARY_OPCODE_X1 = 4,\n  FLUSH_UNARY_OPCODE_X1 = 5,\n  FNOP_UNARY_OPCODE_X0 = 3,\n  FNOP_UNARY_OPCODE_X1 = 6,\n  FNOP_UNARY_OPCODE_Y0 = 3,\n  FNOP_UNARY_OPCODE_Y1 = 8,\n  FSINGLE_ADD1_RRR_0_OPCODE_X0 = 34,\n  FSINGLE_ADDSUB2_RRR_0_OPCODE_X0 = 35,\n  FSINGLE_MUL1_RRR_0_OPCODE_X0 = 36,\n  FSINGLE_MUL2_RRR_0_OPCODE_X0 = 37,\n  FSINGLE_PACK1_UNARY_OPCODE_X0 = 4,\n  FSINGLE_PACK1_UNARY_OPCODE_Y0 = 4,\n  FSINGLE_PACK2_RRR_0_OPCODE_X0 = 38,\n  FSINGLE_SUB1_RRR_0_OPCODE_X0 = 39,\n  ICOH_UNARY_OPCODE_X1 = 7,\n  ILL_UNARY_OPCODE_X1 = 8,\n  ILL_UNARY_OPCODE_Y1 = 9,\n  IMM8_OPCODE_X0 = 4,\n  IMM8_OPCODE_X1 = 3,\n  INV_UNARY_OPCODE_X1 = 9,\n  IRET_UNARY_OPCODE_X1 = 10,\n  JALRP_UNARY_OPCODE_X1 = 11,\n  JALRP_UNARY_OPCODE_Y1 = 10,\n  JALR_UNARY_OPCODE_X1 = 12,\n  JALR_UNARY_OPCODE_Y1 = 11,\n  JAL_JUMP_OPCODE_X1 = 0,\n  JRP_UNARY_OPCODE_X1 = 13,\n  JRP_UNARY_OPCODE_Y1 = 12,\n  JR_UNARY_OPCODE_X1 = 14,\n  JR_UNARY_OPCODE_Y1 = 13,\n  JUMP_OPCODE_X1 = 4,\n  J_JUMP_OPCODE_X1 = 1,\n  LD1S_ADD_IMM8_OPCODE_X1 = 7,\n  LD1S_OPCODE_Y2 = 0,\n  LD1S_UNARY_OPCODE_X1 = 15,\n  LD1U_ADD_IMM8_OPCODE_X1 = 8,\n  LD1U_OPCODE_Y2 = 1,\n  LD1U_UNARY_OPCODE_X1 = 16,\n  LD2S_ADD_IMM8_OPCODE_X1 = 9,\n  LD2S_OPCODE_Y2 = 2,\n  LD2S_UNARY_OPCODE_X1 = 17,\n  LD2U_ADD_IMM8_OPCODE_X1 = 10,\n  LD2U_OPCODE_Y2 = 3,\n  LD2U_UNARY_OPCODE_X1 = 18,\n  LD4S_ADD_IMM8_OPCODE_X1 = 11,\n  LD4S_OPCODE_Y2 = 1,\n  LD4S_UNARY_OPCODE_X1 = 19,\n  LD4U_ADD_IMM8_OPCODE_X1 = 12,\n  LD4U_OPCODE_Y2 = 2,\n  LD4U_UNARY_OPCODE_X1 = 20,\n  LDNA_UNARY_OPCODE_X1 = 21,\n  LDNT1S_ADD_IMM8_OPCODE_X1 = 13,\n  LDNT1S_UNARY_OPCODE_X1 = 22,\n  LDNT1U_ADD_IMM8_OPCODE_X1 = 14,\n  LDNT1U_UNARY_OPCODE_X1 = 23,\n  LDNT2S_ADD_IMM8_OPCODE_X1 = 15,\n  LDNT2S_UNARY_OPCODE_X1 = 24,\n  LDNT2U_ADD_IMM8_OPCODE_X1 = 16,\n  LDNT2U_UNARY_OPCODE_X1 = 25,\n  LDNT4S_ADD_IMM8_OPCODE_X1 = 17,\n  LDNT4S_UNARY_OPCODE_X1 = 26,\n  LDNT4U_ADD_IMM8_OPCODE_X1 = 18,\n  LDNT4U_UNARY_OPCODE_X1 = 27,\n  LDNT_ADD_IMM8_OPCODE_X1 = 19,\n  LDNT_UNARY_OPCODE_X1 = 28,\n  LD_ADD_IMM8_OPCODE_X1 = 20,\n  LD_OPCODE_Y2 = 3,\n  LD_UNARY_OPCODE_X1 = 29,\n  LNK_UNARY_OPCODE_X1 = 30,\n  LNK_UNARY_OPCODE_Y1 = 14,\n  LWNA_ADD_IMM8_OPCODE_X1 = 21,\n  MFSPR_IMM8_OPCODE_X1 = 22,\n  MF_UNARY_OPCODE_X1 = 31,\n  MM_BF_OPCODE_X0 = 7,\n  MNZ_RRR_0_OPCODE_X0 = 40,\n  MNZ_RRR_0_OPCODE_X1 = 26,\n  MNZ_RRR_4_OPCODE_Y0 = 2,\n  MNZ_RRR_4_OPCODE_Y1 = 2,\n  MODE_OPCODE_YA2 = 1,\n  MODE_OPCODE_YB2 = 2,\n  MODE_OPCODE_YC2 = 3,\n  MTSPR_IMM8_OPCODE_X1 = 23,\n  MULAX_RRR_0_OPCODE_X0 = 41,\n  MULAX_RRR_3_OPCODE_Y0 = 2,\n  MULA_HS_HS_RRR_0_OPCODE_X0 = 42,\n  MULA_HS_HS_RRR_9_OPCODE_Y0 = 0,\n  MULA_HS_HU_RRR_0_OPCODE_X0 = 43,\n  MULA_HS_LS_RRR_0_OPCODE_X0 = 44,\n  MULA_HS_LU_RRR_0_OPCODE_X0 = 45,\n  MULA_HU_HU_RRR_0_OPCODE_X0 = 46,\n  MULA_HU_HU_RRR_9_OPCODE_Y0 = 1,\n  MULA_HU_LS_RRR_0_OPCODE_X0 = 47,\n  MULA_HU_LU_RRR_0_OPCODE_X0 = 48,\n  MULA_LS_LS_RRR_0_OPCODE_X0 = 49,\n  MULA_LS_LS_RRR_9_OPCODE_Y0 = 2,\n  MULA_LS_LU_RRR_0_OPCODE_X0 = 50,\n  MULA_LU_LU_RRR_0_OPCODE_X0 = 51,\n  MULA_LU_LU_RRR_9_OPCODE_Y0 = 3,\n  MULX_RRR_0_OPCODE_X0 = 52,\n  MULX_RRR_3_OPCODE_Y0 = 3,\n  MUL_HS_HS_RRR_0_OPCODE_X0 = 53,\n  MUL_HS_HS_RRR_8_OPCODE_Y0 = 0,\n  MUL_HS_HU_RRR_0_OPCODE_X0 = 54,\n  MUL_HS_LS_RRR_0_OPCODE_X0 = 55,\n  MUL_HS_LU_RRR_0_OPCODE_X0 = 56,\n  MUL_HU_HU_RRR_0_OPCODE_X0 = 57,\n  MUL_HU_HU_RRR_8_OPCODE_Y0 = 1,\n  MUL_HU_LS_RRR_0_OPCODE_X0 = 58,\n  MUL_HU_LU_RRR_0_OPCODE_X0 = 59,\n  MUL_LS_LS_RRR_0_OPCODE_X0 = 60,\n  MUL_LS_LS_RRR_8_OPCODE_Y0 = 2,\n  MUL_LS_LU_RRR_0_OPCODE_X0 = 61,\n  MUL_LU_LU_RRR_0_OPCODE_X0 = 62,\n  MUL_LU_LU_RRR_8_OPCODE_Y0 = 3,\n  MZ_RRR_0_OPCODE_X0 = 63,\n  MZ_RRR_0_OPCODE_X1 = 27,\n  MZ_RRR_4_OPCODE_Y0 = 3,\n  MZ_RRR_4_OPCODE_Y1 = 3,\n  NAP_UNARY_OPCODE_X1 = 32,\n  NOP_UNARY_OPCODE_X0 = 5,\n  NOP_UNARY_OPCODE_X1 = 33,\n  NOP_UNARY_OPCODE_Y0 = 5,\n  NOP_UNARY_OPCODE_Y1 = 15,\n  NOR_RRR_0_OPCODE_X0 = 64,\n  NOR_RRR_0_OPCODE_X1 = 28,\n  NOR_RRR_5_OPCODE_Y0 = 1,\n  NOR_RRR_5_OPCODE_Y1 = 1,\n  ORI_IMM8_OPCODE_X0 = 7,\n  ORI_IMM8_OPCODE_X1 = 24,\n  OR_RRR_0_OPCODE_X0 = 65,\n  OR_RRR_0_OPCODE_X1 = 29,\n  OR_RRR_5_OPCODE_Y0 = 2,\n  OR_RRR_5_OPCODE_Y1 = 2,\n  PCNT_UNARY_OPCODE_X0 = 6,\n  PCNT_UNARY_OPCODE_Y0 = 6,\n  REVBITS_UNARY_OPCODE_X0 = 7,\n  REVBITS_UNARY_OPCODE_Y0 = 7,\n  REVBYTES_UNARY_OPCODE_X0 = 8,\n  REVBYTES_UNARY_OPCODE_Y0 = 8,\n  ROTLI_SHIFT_OPCODE_X0 = 1,\n  ROTLI_SHIFT_OPCODE_X1 = 1,\n  ROTLI_SHIFT_OPCODE_Y0 = 0,\n  ROTLI_SHIFT_OPCODE_Y1 = 0,\n  ROTL_RRR_0_OPCODE_X0 = 66,\n  ROTL_RRR_0_OPCODE_X1 = 30,\n  ROTL_RRR_6_OPCODE_Y0 = 0,\n  ROTL_RRR_6_OPCODE_Y1 = 0,\n  RRR_0_OPCODE_X0 = 5,\n  RRR_0_OPCODE_X1 = 5,\n  RRR_0_OPCODE_Y0 = 5,\n  RRR_0_OPCODE_Y1 = 6,\n  RRR_1_OPCODE_Y0 = 6,\n  RRR_1_OPCODE_Y1 = 7,\n  RRR_2_OPCODE_Y0 = 7,\n  RRR_2_OPCODE_Y1 = 8,\n  RRR_3_OPCODE_Y0 = 8,\n  RRR_3_OPCODE_Y1 = 9,\n  RRR_4_OPCODE_Y0 = 9,\n  RRR_4_OPCODE_Y1 = 10,\n  RRR_5_OPCODE_Y0 = 10,\n  RRR_5_OPCODE_Y1 = 11,\n  RRR_6_OPCODE_Y0 = 11,\n  RRR_6_OPCODE_Y1 = 12,\n  RRR_7_OPCODE_Y0 = 12,\n  RRR_7_OPCODE_Y1 = 13,\n  RRR_8_OPCODE_Y0 = 13,\n  RRR_9_OPCODE_Y0 = 14,\n  SHIFT_OPCODE_X0 = 6,\n  SHIFT_OPCODE_X1 = 6,\n  SHIFT_OPCODE_Y0 = 15,\n  SHIFT_OPCODE_Y1 = 14,\n  SHL16INSLI_OPCODE_X0 = 7,\n  SHL16INSLI_OPCODE_X1 = 7,\n  SHL1ADDX_RRR_0_OPCODE_X0 = 67,\n  SHL1ADDX_RRR_0_OPCODE_X1 = 31,\n  SHL1ADDX_RRR_7_OPCODE_Y0 = 1,\n  SHL1ADDX_RRR_7_OPCODE_Y1 = 1,\n  SHL1ADD_RRR_0_OPCODE_X0 = 68,\n  SHL1ADD_RRR_0_OPCODE_X1 = 32,\n  SHL1ADD_RRR_1_OPCODE_Y0 = 0,\n  SHL1ADD_RRR_1_OPCODE_Y1 = 0,\n  SHL2ADDX_RRR_0_OPCODE_X0 = 69,\n  SHL2ADDX_RRR_0_OPCODE_X1 = 33,\n  SHL2ADDX_RRR_7_OPCODE_Y0 = 2,\n  SHL2ADDX_RRR_7_OPCODE_Y1 = 2,\n  SHL2ADD_RRR_0_OPCODE_X0 = 70,\n  SHL2ADD_RRR_0_OPCODE_X1 = 34,\n  SHL2ADD_RRR_1_OPCODE_Y0 = 1,\n  SHL2ADD_RRR_1_OPCODE_Y1 = 1,\n  SHL3ADDX_RRR_0_OPCODE_X0 = 71,\n  SHL3ADDX_RRR_0_OPCODE_X1 = 35,\n  SHL3ADDX_RRR_7_OPCODE_Y0 = 3,\n  SHL3ADDX_RRR_7_OPCODE_Y1 = 3,\n  SHL3ADD_RRR_0_OPCODE_X0 = 72,\n  SHL3ADD_RRR_0_OPCODE_X1 = 36,\n  SHL3ADD_RRR_1_OPCODE_Y0 = 2,\n  SHL3ADD_RRR_1_OPCODE_Y1 = 2,\n  SHLI_SHIFT_OPCODE_X0 = 2,\n  SHLI_SHIFT_OPCODE_X1 = 2,\n  SHLI_SHIFT_OPCODE_Y0 = 1,\n  SHLI_SHIFT_OPCODE_Y1 = 1,\n  SHLXI_SHIFT_OPCODE_X0 = 3,\n  SHLXI_SHIFT_OPCODE_X1 = 3,\n  SHLX_RRR_0_OPCODE_X0 = 73,\n  SHLX_RRR_0_OPCODE_X1 = 37,\n  SHL_RRR_0_OPCODE_X0 = 74,\n  SHL_RRR_0_OPCODE_X1 = 38,\n  SHL_RRR_6_OPCODE_Y0 = 1,\n  SHL_RRR_6_OPCODE_Y1 = 1,\n  SHRSI_SHIFT_OPCODE_X0 = 4,\n  SHRSI_SHIFT_OPCODE_X1 = 4,\n  SHRSI_SHIFT_OPCODE_Y0 = 2,\n  SHRSI_SHIFT_OPCODE_Y1 = 2,\n  SHRS_RRR_0_OPCODE_X0 = 75,\n  SHRS_RRR_0_OPCODE_X1 = 39,\n  SHRS_RRR_6_OPCODE_Y0 = 2,\n  SHRS_RRR_6_OPCODE_Y1 = 2,\n  SHRUI_SHIFT_OPCODE_X0 = 5,\n  SHRUI_SHIFT_OPCODE_X1 = 5,\n  SHRUI_SHIFT_OPCODE_Y0 = 3,\n  SHRUI_SHIFT_OPCODE_Y1 = 3,\n  SHRUXI_SHIFT_OPCODE_X0 = 6,\n  SHRUXI_SHIFT_OPCODE_X1 = 6,\n  SHRUX_RRR_0_OPCODE_X0 = 76,\n  SHRUX_RRR_0_OPCODE_X1 = 40,\n  SHRU_RRR_0_OPCODE_X0 = 77,\n  SHRU_RRR_0_OPCODE_X1 = 41,\n  SHRU_RRR_6_OPCODE_Y0 = 3,\n  SHRU_RRR_6_OPCODE_Y1 = 3,\n  SHUFFLEBYTES_RRR_0_OPCODE_X0 = 78,\n  ST1_ADD_IMM8_OPCODE_X1 = 25,\n  ST1_OPCODE_Y2 = 0,\n  ST1_RRR_0_OPCODE_X1 = 42,\n  ST2_ADD_IMM8_OPCODE_X1 = 26,\n  ST2_OPCODE_Y2 = 1,\n  ST2_RRR_0_OPCODE_X1 = 43,\n  ST4_ADD_IMM8_OPCODE_X1 = 27,\n  ST4_OPCODE_Y2 = 2,\n  ST4_RRR_0_OPCODE_X1 = 44,\n  STNT1_ADD_IMM8_OPCODE_X1 = 28,\n  STNT1_RRR_0_OPCODE_X1 = 45,\n  STNT2_ADD_IMM8_OPCODE_X1 = 29,\n  STNT2_RRR_0_OPCODE_X1 = 46,\n  STNT4_ADD_IMM8_OPCODE_X1 = 30,\n  STNT4_RRR_0_OPCODE_X1 = 47,\n  STNT_ADD_IMM8_OPCODE_X1 = 31,\n  STNT_RRR_0_OPCODE_X1 = 48,\n  ST_ADD_IMM8_OPCODE_X1 = 32,\n  ST_OPCODE_Y2 = 3,\n  ST_RRR_0_OPCODE_X1 = 49,\n  SUBXSC_RRR_0_OPCODE_X0 = 79,\n  SUBXSC_RRR_0_OPCODE_X1 = 50,\n  SUBX_RRR_0_OPCODE_X0 = 80,\n  SUBX_RRR_0_OPCODE_X1 = 51,\n  SUBX_RRR_0_OPCODE_Y0 = 2,\n  SUBX_RRR_0_OPCODE_Y1 = 2,\n  SUB_RRR_0_OPCODE_X0 = 81,\n  SUB_RRR_0_OPCODE_X1 = 52,\n  SUB_RRR_0_OPCODE_Y0 = 3,\n  SUB_RRR_0_OPCODE_Y1 = 3,\n  SWINT0_UNARY_OPCODE_X1 = 34,\n  SWINT1_UNARY_OPCODE_X1 = 35,\n  SWINT2_UNARY_OPCODE_X1 = 36,\n  SWINT3_UNARY_OPCODE_X1 = 37,\n  TBLIDXB0_UNARY_OPCODE_X0 = 9,\n  TBLIDXB0_UNARY_OPCODE_Y0 = 9,\n  TBLIDXB1_UNARY_OPCODE_X0 = 10,\n  TBLIDXB1_UNARY_OPCODE_Y0 = 10,\n  TBLIDXB2_UNARY_OPCODE_X0 = 11,\n  TBLIDXB2_UNARY_OPCODE_Y0 = 11,\n  TBLIDXB3_UNARY_OPCODE_X0 = 12,\n  TBLIDXB3_UNARY_OPCODE_Y0 = 12,\n  UNARY_RRR_0_OPCODE_X0 = 82,\n  UNARY_RRR_0_OPCODE_X1 = 53,\n  UNARY_RRR_1_OPCODE_Y0 = 3,\n  UNARY_RRR_1_OPCODE_Y1 = 3,\n  V1ADDI_IMM8_OPCODE_X0 = 8,\n  V1ADDI_IMM8_OPCODE_X1 = 33,\n  V1ADDUC_RRR_0_OPCODE_X0 = 83,\n  V1ADDUC_RRR_0_OPCODE_X1 = 54,\n  V1ADD_RRR_0_OPCODE_X0 = 84,\n  V1ADD_RRR_0_OPCODE_X1 = 55,\n  V1ADIFFU_RRR_0_OPCODE_X0 = 85,\n  V1AVGU_RRR_0_OPCODE_X0 = 86,\n  V1CMPEQI_IMM8_OPCODE_X0 = 9,\n  V1CMPEQI_IMM8_OPCODE_X1 = 34,\n  V1CMPEQ_RRR_0_OPCODE_X0 = 87,\n  V1CMPEQ_RRR_0_OPCODE_X1 = 56,\n  V1CMPLES_RRR_0_OPCODE_X0 = 88,\n  V1CMPLES_RRR_0_OPCODE_X1 = 57,\n  V1CMPLEU_RRR_0_OPCODE_X0 = 89,\n  V1CMPLEU_RRR_0_OPCODE_X1 = 58,\n  V1CMPLTSI_IMM8_OPCODE_X0 = 10,\n  V1CMPLTSI_IMM8_OPCODE_X1 = 35,\n  V1CMPLTS_RRR_0_OPCODE_X0 = 90,\n  V1CMPLTS_RRR_0_OPCODE_X1 = 59,\n  V1CMPLTUI_IMM8_OPCODE_X0 = 11,\n  V1CMPLTUI_IMM8_OPCODE_X1 = 36,\n  V1CMPLTU_RRR_0_OPCODE_X0 = 91,\n  V1CMPLTU_RRR_0_OPCODE_X1 = 60,\n  V1CMPNE_RRR_0_OPCODE_X0 = 92,\n  V1CMPNE_RRR_0_OPCODE_X1 = 61,\n  V1DDOTPUA_RRR_0_OPCODE_X0 = 161,\n  V1DDOTPUSA_RRR_0_OPCODE_X0 = 93,\n  V1DDOTPUS_RRR_0_OPCODE_X0 = 94,\n  V1DDOTPU_RRR_0_OPCODE_X0 = 162,\n  V1DOTPA_RRR_0_OPCODE_X0 = 95,\n  V1DOTPUA_RRR_0_OPCODE_X0 = 163,\n  V1DOTPUSA_RRR_0_OPCODE_X0 = 96,\n  V1DOTPUS_RRR_0_OPCODE_X0 = 97,\n  V1DOTPU_RRR_0_OPCODE_X0 = 164,\n  V1DOTP_RRR_0_OPCODE_X0 = 98,\n  V1INT_H_RRR_0_OPCODE_X0 = 99,\n  V1INT_H_RRR_0_OPCODE_X1 = 62,\n  V1INT_L_RRR_0_OPCODE_X0 = 100,\n  V1INT_L_RRR_0_OPCODE_X1 = 63,\n  V1MAXUI_IMM8_OPCODE_X0 = 12,\n  V1MAXUI_IMM8_OPCODE_X1 = 37,\n  V1MAXU_RRR_0_OPCODE_X0 = 101,\n  V1MAXU_RRR_0_OPCODE_X1 = 64,\n  V1MINUI_IMM8_OPCODE_X0 = 13,\n  V1MINUI_IMM8_OPCODE_X1 = 38,\n  V1MINU_RRR_0_OPCODE_X0 = 102,\n  V1MINU_RRR_0_OPCODE_X1 = 65,\n  V1MNZ_RRR_0_OPCODE_X0 = 103,\n  V1MNZ_RRR_0_OPCODE_X1 = 66,\n  V1MULTU_RRR_0_OPCODE_X0 = 104,\n  V1MULUS_RRR_0_OPCODE_X0 = 105,\n  V1MULU_RRR_0_OPCODE_X0 = 106,\n  V1MZ_RRR_0_OPCODE_X0 = 107,\n  V1MZ_RRR_0_OPCODE_X1 = 67,\n  V1SADAU_RRR_0_OPCODE_X0 = 108,\n  V1SADU_RRR_0_OPCODE_X0 = 109,\n  V1SHLI_SHIFT_OPCODE_X0 = 7,\n  V1SHLI_SHIFT_OPCODE_X1 = 7,\n  V1SHL_RRR_0_OPCODE_X0 = 110,\n  V1SHL_RRR_0_OPCODE_X1 = 68,\n  V1SHRSI_SHIFT_OPCODE_X0 = 8,\n  V1SHRSI_SHIFT_OPCODE_X1 = 8,\n  V1SHRS_RRR_0_OPCODE_X0 = 111,\n  V1SHRS_RRR_0_OPCODE_X1 = 69,\n  V1SHRUI_SHIFT_OPCODE_X0 = 9,\n  V1SHRUI_SHIFT_OPCODE_X1 = 9,\n  V1SHRU_RRR_0_OPCODE_X0 = 112,\n  V1SHRU_RRR_0_OPCODE_X1 = 70,\n  V1SUBUC_RRR_0_OPCODE_X0 = 113,\n  V1SUBUC_RRR_0_OPCODE_X1 = 71,\n  V1SUB_RRR_0_OPCODE_X0 = 114,\n  V1SUB_RRR_0_OPCODE_X1 = 72,\n  V2ADDI_IMM8_OPCODE_X0 = 14,\n  V2ADDI_IMM8_OPCODE_X1 = 39,\n  V2ADDSC_RRR_0_OPCODE_X0 = 115,\n  V2ADDSC_RRR_0_OPCODE_X1 = 73,\n  V2ADD_RRR_0_OPCODE_X0 = 116,\n  V2ADD_RRR_0_OPCODE_X1 = 74,\n  V2ADIFFS_RRR_0_OPCODE_X0 = 117,\n  V2AVGS_RRR_0_OPCODE_X0 = 118,\n  V2CMPEQI_IMM8_OPCODE_X0 = 15,\n  V2CMPEQI_IMM8_OPCODE_X1 = 40,\n  V2CMPEQ_RRR_0_OPCODE_X0 = 119,\n  V2CMPEQ_RRR_0_OPCODE_X1 = 75,\n  V2CMPLES_RRR_0_OPCODE_X0 = 120,\n  V2CMPLES_RRR_0_OPCODE_X1 = 76,\n  V2CMPLEU_RRR_0_OPCODE_X0 = 121,\n  V2CMPLEU_RRR_0_OPCODE_X1 = 77,\n  V2CMPLTSI_IMM8_OPCODE_X0 = 16,\n  V2CMPLTSI_IMM8_OPCODE_X1 = 41,\n  V2CMPLTS_RRR_0_OPCODE_X0 = 122,\n  V2CMPLTS_RRR_0_OPCODE_X1 = 78,\n  V2CMPLTUI_IMM8_OPCODE_X0 = 17,\n  V2CMPLTUI_IMM8_OPCODE_X1 = 42,\n  V2CMPLTU_RRR_0_OPCODE_X0 = 123,\n  V2CMPLTU_RRR_0_OPCODE_X1 = 79,\n  V2CMPNE_RRR_0_OPCODE_X0 = 124,\n  V2CMPNE_RRR_0_OPCODE_X1 = 80,\n  V2DOTPA_RRR_0_OPCODE_X0 = 125,\n  V2DOTP_RRR_0_OPCODE_X0 = 126,\n  V2INT_H_RRR_0_OPCODE_X0 = 127,\n  V2INT_H_RRR_0_OPCODE_X1 = 81,\n  V2INT_L_RRR_0_OPCODE_X0 = 128,\n  V2INT_L_RRR_0_OPCODE_X1 = 82,\n  V2MAXSI_IMM8_OPCODE_X0 = 18,\n  V2MAXSI_IMM8_OPCODE_X1 = 43,\n  V2MAXS_RRR_0_OPCODE_X0 = 129,\n  V2MAXS_RRR_0_OPCODE_X1 = 83,\n  V2MINSI_IMM8_OPCODE_X0 = 19,\n  V2MINSI_IMM8_OPCODE_X1 = 44,\n  V2MINS_RRR_0_OPCODE_X0 = 130,\n  V2MINS_RRR_0_OPCODE_X1 = 84,\n  V2MNZ_RRR_0_OPCODE_X0 = 131,\n  V2MNZ_RRR_0_OPCODE_X1 = 85,\n  V2MULFSC_RRR_0_OPCODE_X0 = 132,\n  V2MULS_RRR_0_OPCODE_X0 = 133,\n  V2MULTS_RRR_0_OPCODE_X0 = 134,\n  V2MZ_RRR_0_OPCODE_X0 = 135,\n  V2MZ_RRR_0_OPCODE_X1 = 86,\n  V2PACKH_RRR_0_OPCODE_X0 = 136,\n  V2PACKH_RRR_0_OPCODE_X1 = 87,\n  V2PACKL_RRR_0_OPCODE_X0 = 137,\n  V2PACKL_RRR_0_OPCODE_X1 = 88,\n  V2PACKUC_RRR_0_OPCODE_X0 = 138,\n  V2PACKUC_RRR_0_OPCODE_X1 = 89,\n  V2SADAS_RRR_0_OPCODE_X0 = 139,\n  V2SADAU_RRR_0_OPCODE_X0 = 140,\n  V2SADS_RRR_0_OPCODE_X0 = 141,\n  V2SADU_RRR_0_OPCODE_X0 = 142,\n  V2SHLI_SHIFT_OPCODE_X0 = 10,\n  V2SHLI_SHIFT_OPCODE_X1 = 10,\n  V2SHLSC_RRR_0_OPCODE_X0 = 143,\n  V2SHLSC_RRR_0_OPCODE_X1 = 90,\n  V2SHL_RRR_0_OPCODE_X0 = 144,\n  V2SHL_RRR_0_OPCODE_X1 = 91,\n  V2SHRSI_SHIFT_OPCODE_X0 = 11,\n  V2SHRSI_SHIFT_OPCODE_X1 = 11,\n  V2SHRS_RRR_0_OPCODE_X0 = 145,\n  V2SHRS_RRR_0_OPCODE_X1 = 92,\n  V2SHRUI_SHIFT_OPCODE_X0 = 12,\n  V2SHRUI_SHIFT_OPCODE_X1 = 12,\n  V2SHRU_RRR_0_OPCODE_X0 = 146,\n  V2SHRU_RRR_0_OPCODE_X1 = 93,\n  V2SUBSC_RRR_0_OPCODE_X0 = 147,\n  V2SUBSC_RRR_0_OPCODE_X1 = 94,\n  V2SUB_RRR_0_OPCODE_X0 = 148,\n  V2SUB_RRR_0_OPCODE_X1 = 95,\n  V4ADDSC_RRR_0_OPCODE_X0 = 149,\n  V4ADDSC_RRR_0_OPCODE_X1 = 96,\n  V4ADD_RRR_0_OPCODE_X0 = 150,\n  V4ADD_RRR_0_OPCODE_X1 = 97,\n  V4INT_H_RRR_0_OPCODE_X0 = 151,\n  V4INT_H_RRR_0_OPCODE_X1 = 98,\n  V4INT_L_RRR_0_OPCODE_X0 = 152,\n  V4INT_L_RRR_0_OPCODE_X1 = 99,\n  V4PACKSC_RRR_0_OPCODE_X0 = 153,\n  V4PACKSC_RRR_0_OPCODE_X1 = 100,\n  V4SHLSC_RRR_0_OPCODE_X0 = 154,\n  V4SHLSC_RRR_0_OPCODE_X1 = 101,\n  V4SHL_RRR_0_OPCODE_X0 = 155,\n  V4SHL_RRR_0_OPCODE_X1 = 102,\n  V4SHRS_RRR_0_OPCODE_X0 = 156,\n  V4SHRS_RRR_0_OPCODE_X1 = 103,\n  V4SHRU_RRR_0_OPCODE_X0 = 157,\n  V4SHRU_RRR_0_OPCODE_X1 = 104,\n  V4SUBSC_RRR_0_OPCODE_X0 = 158,\n  V4SUBSC_RRR_0_OPCODE_X1 = 105,\n  V4SUB_RRR_0_OPCODE_X0 = 159,\n  V4SUB_RRR_0_OPCODE_X1 = 106,\n  WH64_UNARY_OPCODE_X1 = 38,\n  XORI_IMM8_OPCODE_X0 = 20,\n  XORI_IMM8_OPCODE_X1 = 45,\n  XOR_RRR_0_OPCODE_X0 = 160,\n  XOR_RRR_0_OPCODE_X1 = 107,\n  XOR_RRR_5_OPCODE_Y0 = 3,\n  XOR_RRR_5_OPCODE_Y1 = 3\n};\n\nstatic __inline unsigned int\nget_BFEnd_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_BFOpcodeExtension_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 24)) & 0xf);\n}\n\nstatic __inline unsigned int\nget_BFStart_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 18)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_BrOff_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x0000003f) |\n         (((unsigned int)(n >> 37)) & 0x0001ffc0);\n}\n\nstatic __inline unsigned int\nget_BrType_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 54)) & 0x1f);\n}\n\nstatic __inline unsigned int\nget_Dest_Imm8_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x0000003f) |\n         (((unsigned int)(n >> 43)) & 0x000000c0);\n}\n\nstatic __inline unsigned int\nget_Dest_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 0)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_Dest_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_Dest_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 0)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_Dest_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_Imm16_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0xffff);\n}\n\nstatic __inline unsigned int\nget_Imm16_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0xffff);\n}\n\nstatic __inline unsigned int\nget_Imm8OpcodeExtension_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 20)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_Imm8OpcodeExtension_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 51)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_Imm8_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_Imm8_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_Imm8_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_Imm8_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0xff);\n}\n\nstatic __inline unsigned int\nget_JumpOff_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x7ffffff);\n}\n\nstatic __inline unsigned int\nget_JumpOpcodeExtension_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 58)) & 0x1);\n}\n\nstatic __inline unsigned int\nget_MF_Imm14_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 37)) & 0x3fff);\n}\n\nstatic __inline unsigned int\nget_MT_Imm14_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 31)) & 0x0000003f) |\n         (((unsigned int)(n >> 37)) & 0x00003fc0);\n}\n\nstatic __inline unsigned int\nget_Mode(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 62)) & 0x3);\n}\n\nstatic __inline unsigned int\nget_Opcode_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 28)) & 0x7);\n}\n\nstatic __inline unsigned int\nget_Opcode_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 59)) & 0x7);\n}\n\nstatic __inline unsigned int\nget_Opcode_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 27)) & 0xf);\n}\n\nstatic __inline unsigned int\nget_Opcode_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 58)) & 0xf);\n}\n\nstatic __inline unsigned int\nget_Opcode_Y2(tilegx_bundle_bits n)\n{\n  return (((n >> 26)) & 0x00000001) |\n         (((unsigned int)(n >> 56)) & 0x00000002);\n}\n\nstatic __inline unsigned int\nget_RRROpcodeExtension_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 18)) & 0x3ff);\n}\n\nstatic __inline unsigned int\nget_RRROpcodeExtension_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 49)) & 0x3ff);\n}\n\nstatic __inline unsigned int\nget_RRROpcodeExtension_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 18)) & 0x3);\n}\n\nstatic __inline unsigned int\nget_RRROpcodeExtension_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 49)) & 0x3);\n}\n\nstatic __inline unsigned int\nget_ShAmt_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_ShAmt_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_ShAmt_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_ShAmt_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_ShiftOpcodeExtension_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 18)) & 0x3ff);\n}\n\nstatic __inline unsigned int\nget_ShiftOpcodeExtension_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 49)) & 0x3ff);\n}\n\nstatic __inline unsigned int\nget_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 18)) & 0x3);\n}\n\nstatic __inline unsigned int\nget_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 49)) & 0x3);\n}\n\nstatic __inline unsigned int\nget_SrcA_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 6)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcA_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 37)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcA_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 6)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcA_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 37)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcA_Y2(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 20)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcBDest_Y2(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 51)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcB_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcB_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcB_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_SrcB_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_UnaryOpcodeExtension_X0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_UnaryOpcodeExtension_X1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((n >> 12)) & 0x3f);\n}\n\nstatic __inline unsigned int\nget_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n)\n{\n  return (((unsigned int)(n >> 43)) & 0x3f);\n}\n\nstatic __inline int\nsign_extend(int n, int num_bits)\n{\n  int shift = (int)(sizeof(int) * 8 - num_bits);\n  return (n << shift) >> shift;\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_BFEnd_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_BFOpcodeExtension_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xf) << 24);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_BFStart_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 18);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_BrOff_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |\n         (((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_BrType_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x1f)) << 54);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Dest_Imm8_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |\n         (((tilegx_bundle_bits)(n & 0x000000c0)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Dest_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 0);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Dest_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 31);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Dest_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 0);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Dest_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 31);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm16_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xffff) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm16_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0xffff)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8OpcodeExtension_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xff) << 20);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8OpcodeExtension_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0xff)) << 51);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xff) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0xff)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xff) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Imm8_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0xff)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_JumpOff_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_JumpOpcodeExtension_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x1)) << 58);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_MF_Imm14_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3fff)) << 37);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_MT_Imm14_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |\n         (((tilegx_bundle_bits)(n & 0x00003fc0)) << 37);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Mode(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3)) << 62);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Opcode_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x7) << 28);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Opcode_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x7)) << 59);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Opcode_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0xf) << 27);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Opcode_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0xf)) << 58);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_Opcode_Y2(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x00000001) << 26) |\n         (((tilegx_bundle_bits)(n & 0x00000002)) << 56);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_RRROpcodeExtension_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3ff) << 18);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_RRROpcodeExtension_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_RRROpcodeExtension_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3) << 18);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_RRROpcodeExtension_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3)) << 49);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShAmt_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShAmt_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShAmt_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShAmt_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShiftOpcodeExtension_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3ff) << 18);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShiftOpcodeExtension_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShiftOpcodeExtension_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3) << 18);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_ShiftOpcodeExtension_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3)) << 49);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcA_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 6);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcA_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 37);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcA_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 6);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcA_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 37);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcA_Y2(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 20);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcBDest_Y2(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 51);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcB_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcB_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcB_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_SrcB_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_UnaryOpcodeExtension_X0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_UnaryOpcodeExtension_X1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_UnaryOpcodeExtension_Y0(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return ((n & 0x3f) << 12);\n}\n\nstatic __inline tilegx_bundle_bits\ncreate_UnaryOpcodeExtension_Y1(int num)\n{\n  const unsigned int n = (unsigned int)num;\n  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);\n}\n\nconst struct tilegx_opcode tilegx_opcodes[336] =\n{\n { \"bpt\", TILEGX_OPC_BPT, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffffffff80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a44ae00000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"info\", TILEGX_OPC_INFO, 0xf, 1, TREG_ZERO, 1,\n    { { 0 }, { 1 }, { 2 }, { 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00fffULL,\n      0xfff807ff80000000ULL,\n      0x0000000078000fffULL,\n      0x3c0007ff80000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040300fffULL,\n      0x181807ff80000000ULL,\n      0x0000000010000fffULL,\n      0x0c0007ff80000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"infol\", TILEGX_OPC_INFOL, 0x3, 1, TREG_ZERO, 1,\n    { { 4 }, { 5 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc000000070000fffULL,\n      0xf80007ff80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000070000fffULL,\n      0x380007ff80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld4s_tls\", TILEGX_OPC_LD4S_TLS, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1858000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld_tls\", TILEGX_OPC_LD_TLS, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18a0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"move\", TILEGX_OPC_MOVE, 0xf, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 6, 7 }, { 10, 11 }, { 12, 13 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0xfffff80000000000ULL,\n      0x00000000780ff000ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      0x000000005107f000ULL,\n      0x283bf80000000000ULL,\n      0x00000000500bf000ULL,\n      0x2c05f80000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"movei\", TILEGX_OPC_MOVEI, 0xf, 2, TREG_ZERO, 1,\n    { { 8, 0 }, { 6, 1 }, { 10, 2 }, { 12, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00fc0ULL,\n      0xfff807e000000000ULL,\n      0x0000000078000fc0ULL,\n      0x3c0007e000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040100fc0ULL,\n      0x180807e000000000ULL,\n      0x0000000000000fc0ULL,\n      0x040007e000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"moveli\", TILEGX_OPC_MOVELI, 0x3, 2, TREG_ZERO, 1,\n    { { 8, 4 }, { 6, 5 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc000000070000fc0ULL,\n      0xf80007e000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000010000fc0ULL,\n      0x000007e000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch\", TILEGX_OPC_PREFETCH, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a801f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x41f8000004000000ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l1\", TILEGX_OPC_PREFETCH_ADD_L1, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1840001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l1_fault\", TILEGX_OPC_PREFETCH_ADD_L1_FAULT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1838001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l2\", TILEGX_OPC_PREFETCH_ADD_L2, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1850001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l2_fault\", TILEGX_OPC_PREFETCH_ADD_L2_FAULT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1848001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l3\", TILEGX_OPC_PREFETCH_ADD_L3, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1860001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_add_l3_fault\", TILEGX_OPC_PREFETCH_ADD_L3_FAULT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8001f80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1858001f80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"prefetch_l1\", TILEGX_OPC_PREFETCH_L1, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a801f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x41f8000004000000ULL\n    }\n#endif\n  },\n  { \"prefetch_l1_fault\", TILEGX_OPC_PREFETCH_L1_FAULT, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a781f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x41f8000000000000ULL\n    }\n#endif\n  },\n  { \"prefetch_l2\", TILEGX_OPC_PREFETCH_L2, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a901f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x43f8000004000000ULL\n    }\n#endif\n  },\n  { \"prefetch_l2_fault\", TILEGX_OPC_PREFETCH_L2_FAULT, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a881f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x43f8000000000000ULL\n    }\n#endif\n  },\n  { \"prefetch_l3\", TILEGX_OPC_PREFETCH_L3, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286aa01f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x83f8000000000000ULL\n    }\n#endif\n  },\n  { \"prefetch_l3_fault\", TILEGX_OPC_PREFETCH_L3_FAULT, 0x12, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff81f80000000ULL,\n      0ULL,\n      0ULL,\n      0xc3f8000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a981f80000000ULL,\n      -1ULL,\n      -1ULL,\n      0x81f8000004000000ULL\n    }\n#endif\n  },\n  { \"raise\", TILEGX_OPC_RAISE, 0x2, 0, TREG_ZERO, 1,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffffffff80000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a44ae80000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"add\", TILEGX_OPC_ADD, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000500c0000ULL,\n      0x2806000000000000ULL,\n      0x0000000028040000ULL,\n      0x1802000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addi\", TILEGX_OPC_ADDI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0x0000000078000000ULL,\n      0x3c00000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040100000ULL,\n      0x1808000000000000ULL,\n      0ULL,\n      0x0400000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addli\", TILEGX_OPC_ADDLI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc000000070000000ULL,\n      0xf800000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000010000000ULL,\n      0ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addx\", TILEGX_OPC_ADDX, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050080000ULL,\n      0x2804000000000000ULL,\n      0x0000000028000000ULL,\n      0x1800000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addxi\", TILEGX_OPC_ADDXI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0x0000000078000000ULL,\n      0x3c00000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040200000ULL,\n      0x1810000000000000ULL,\n      0x0000000008000000ULL,\n      0x0800000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addxli\", TILEGX_OPC_ADDXLI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc000000070000000ULL,\n      0xf800000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000020000000ULL,\n      0x0800000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"addxsc\", TILEGX_OPC_ADDXSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050040000ULL,\n      0x2802000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"and\", TILEGX_OPC_AND, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050100000ULL,\n      0x2808000000000000ULL,\n      0x0000000050000000ULL,\n      0x2c00000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"andi\", TILEGX_OPC_ANDI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0x0000000078000000ULL,\n      0x3c00000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040300000ULL,\n      0x1818000000000000ULL,\n      0x0000000010000000ULL,\n      0x0c00000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"beqz\", TILEGX_OPC_BEQZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1440000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"beqzt\", TILEGX_OPC_BEQZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1400000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bfexts\", TILEGX_OPC_BFEXTS, 0x1, 4, TREG_ZERO, 1,\n    { { 8, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007f000000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000034000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bfextu\", TILEGX_OPC_BFEXTU, 0x1, 4, TREG_ZERO, 1,\n    { { 8, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007f000000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000035000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bfins\", TILEGX_OPC_BFINS, 0x1, 4, TREG_ZERO, 1,\n    { { 23, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007f000000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000036000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bgez\", TILEGX_OPC_BGEZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x14c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bgezt\", TILEGX_OPC_BGEZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1480000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bgtz\", TILEGX_OPC_BGTZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1540000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bgtzt\", TILEGX_OPC_BGTZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1500000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blbc\", TILEGX_OPC_BLBC, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x15c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blbct\", TILEGX_OPC_BLBCT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1580000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blbs\", TILEGX_OPC_BLBS, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1640000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blbst\", TILEGX_OPC_BLBST, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1600000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blez\", TILEGX_OPC_BLEZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x16c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"blezt\", TILEGX_OPC_BLEZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1680000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bltz\", TILEGX_OPC_BLTZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1740000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bltzt\", TILEGX_OPC_BLTZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1700000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bnez\", TILEGX_OPC_BNEZ, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x17c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"bnezt\", TILEGX_OPC_BNEZT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 20 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xffc0000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1780000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"clz\", TILEGX_OPC_CLZ, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051481000ULL,\n      -1ULL,\n      0x00000000300c1000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmoveqz\", TILEGX_OPC_CMOVEQZ, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050140000ULL,\n      -1ULL,\n      0x0000000048000000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmovnez\", TILEGX_OPC_CMOVNEZ, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050180000ULL,\n      -1ULL,\n      0x0000000048040000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpeq\", TILEGX_OPC_CMPEQ, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000501c0000ULL,\n      0x280a000000000000ULL,\n      0x0000000040000000ULL,\n      0x2404000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpeqi\", TILEGX_OPC_CMPEQI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0x0000000078000000ULL,\n      0x3c00000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040400000ULL,\n      0x1820000000000000ULL,\n      0x0000000018000000ULL,\n      0x1000000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpexch\", TILEGX_OPC_CMPEXCH, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x280e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpexch4\", TILEGX_OPC_CMPEXCH4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x280c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmples\", TILEGX_OPC_CMPLES, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050200000ULL,\n      0x2810000000000000ULL,\n      0x0000000038000000ULL,\n      0x2000000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpleu\", TILEGX_OPC_CMPLEU, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050240000ULL,\n      0x2812000000000000ULL,\n      0x0000000038040000ULL,\n      0x2002000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmplts\", TILEGX_OPC_CMPLTS, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050280000ULL,\n      0x2814000000000000ULL,\n      0x0000000038080000ULL,\n      0x2004000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpltsi\", TILEGX_OPC_CMPLTSI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 10, 11, 2 }, { 12, 13, 3 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0x0000000078000000ULL,\n      0x3c00000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000040500000ULL,\n      0x1828000000000000ULL,\n      0x0000000020000000ULL,\n      0x1400000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpltu\", TILEGX_OPC_CMPLTU, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000502c0000ULL,\n      0x2816000000000000ULL,\n      0x00000000380c0000ULL,\n      0x2006000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpltui\", TILEGX_OPC_CMPLTUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040600000ULL,\n      0x1830000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmpne\", TILEGX_OPC_CMPNE, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050300000ULL,\n      0x2818000000000000ULL,\n      0x0000000040040000ULL,\n      0x2406000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmul\", TILEGX_OPC_CMUL, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000504c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmula\", TILEGX_OPC_CMULA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050380000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmulaf\", TILEGX_OPC_CMULAF, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050340000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmulf\", TILEGX_OPC_CMULF, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050400000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmulfr\", TILEGX_OPC_CMULFR, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000503c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmulh\", TILEGX_OPC_CMULH, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050480000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"cmulhr\", TILEGX_OPC_CMULHR, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050440000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"crc32_32\", TILEGX_OPC_CRC32_32, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050500000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"crc32_8\", TILEGX_OPC_CRC32_8, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050540000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ctz\", TILEGX_OPC_CTZ, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051482000ULL,\n      -1ULL,\n      0x00000000300c2000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"dblalign\", TILEGX_OPC_DBLALIGN, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050640000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"dblalign2\", TILEGX_OPC_DBLALIGN2, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050580000ULL,\n      0x281a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"dblalign4\", TILEGX_OPC_DBLALIGN4, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000505c0000ULL,\n      0x281c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"dblalign6\", TILEGX_OPC_DBLALIGN6, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050600000ULL,\n      0x281e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"drain\", TILEGX_OPC_DRAIN, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a080000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"dtlbpr\", TILEGX_OPC_DTLBPR, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a100000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"exch\", TILEGX_OPC_EXCH, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2822000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"exch4\", TILEGX_OPC_EXCH4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2820000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_add_flags\", TILEGX_OPC_FDOUBLE_ADD_FLAGS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000506c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_addsub\", TILEGX_OPC_FDOUBLE_ADDSUB, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050680000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_mul_flags\", TILEGX_OPC_FDOUBLE_MUL_FLAGS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050700000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_pack1\", TILEGX_OPC_FDOUBLE_PACK1, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050740000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_pack2\", TILEGX_OPC_FDOUBLE_PACK2, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050780000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_sub_flags\", TILEGX_OPC_FDOUBLE_SUB_FLAGS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000507c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_unpack_max\", TILEGX_OPC_FDOUBLE_UNPACK_MAX, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050800000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fdouble_unpack_min\", TILEGX_OPC_FDOUBLE_UNPACK_MIN, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050840000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchadd\", TILEGX_OPC_FETCHADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x282a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchadd4\", TILEGX_OPC_FETCHADD4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2824000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchaddgez\", TILEGX_OPC_FETCHADDGEZ, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2828000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchaddgez4\", TILEGX_OPC_FETCHADDGEZ4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2826000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchand\", TILEGX_OPC_FETCHAND, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x282e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchand4\", TILEGX_OPC_FETCHAND4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x282c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchor\", TILEGX_OPC_FETCHOR, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2832000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fetchor4\", TILEGX_OPC_FETCHOR4, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2830000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"finv\", TILEGX_OPC_FINV, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a180000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"flush\", TILEGX_OPC_FLUSH, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a280000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"flushwb\", TILEGX_OPC_FLUSHWB, 0x2, 0, TREG_ZERO, 1,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a200000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fnop\", TILEGX_OPC_FNOP, 0xf, 0, TREG_ZERO, 1,\n    { {  }, {  }, {  }, {  }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0xfffff80000000000ULL,\n      0x00000000780ff000ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051483000ULL,\n      0x286a300000000000ULL,\n      0x00000000300c3000ULL,\n      0x1c06400000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_add1\", TILEGX_OPC_FSINGLE_ADD1, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050880000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_addsub2\", TILEGX_OPC_FSINGLE_ADDSUB2, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000508c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_mul1\", TILEGX_OPC_FSINGLE_MUL1, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050900000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_mul2\", TILEGX_OPC_FSINGLE_MUL2, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050940000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_pack1\", TILEGX_OPC_FSINGLE_PACK1, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051484000ULL,\n      -1ULL,\n      0x00000000300c4000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_pack2\", TILEGX_OPC_FSINGLE_PACK2, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050980000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"fsingle_sub1\", TILEGX_OPC_FSINGLE_SUB1, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000509c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"icoh\", TILEGX_OPC_ICOH, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a380000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ill\", TILEGX_OPC_ILL, 0xa, 0, TREG_ZERO, 1,\n    { { 0, }, {  }, { 0, }, {  }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a400000000000ULL,\n      -1ULL,\n      0x1c06480000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"inv\", TILEGX_OPC_INV, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a480000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"iret\", TILEGX_OPC_IRET, 0x2, 0, TREG_ZERO, 1,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a500000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"j\", TILEGX_OPC_J, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 25 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfc00000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2400000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"jal\", TILEGX_OPC_JAL, 0x2, 1, TREG_LR, 1,\n    { { 0, }, { 25 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfc00000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2000000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"jalr\", TILEGX_OPC_JALR, 0xa, 1, TREG_LR, 1,\n    { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a600000000000ULL,\n      -1ULL,\n      0x1c06580000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"jalrp\", TILEGX_OPC_JALRP, 0xa, 1, TREG_LR, 1,\n    { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a580000000000ULL,\n      -1ULL,\n      0x1c06500000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"jr\", TILEGX_OPC_JR, 0xa, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a700000000000ULL,\n      -1ULL,\n      0x1c06680000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"jrp\", TILEGX_OPC_JRP, 0xa, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 13 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286a680000000000ULL,\n      -1ULL,\n      0x1c06600000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld\", TILEGX_OPC_LD, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286ae80000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x8200000004000000ULL\n    }\n#endif\n  },\n  { \"ld1s\", TILEGX_OPC_LD1S, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a780000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x4000000000000000ULL\n    }\n#endif\n  },\n  { \"ld1s_add\", TILEGX_OPC_LD1S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1838000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld1u\", TILEGX_OPC_LD1U, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a800000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x4000000004000000ULL\n    }\n#endif\n  },\n  { \"ld1u_add\", TILEGX_OPC_LD1U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1840000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld2s\", TILEGX_OPC_LD2S, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a880000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x4200000000000000ULL\n    }\n#endif\n  },\n  { \"ld2s_add\", TILEGX_OPC_LD2S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1848000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld2u\", TILEGX_OPC_LD2U, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a900000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x4200000004000000ULL\n    }\n#endif\n  },\n  { \"ld2u_add\", TILEGX_OPC_LD2U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1850000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld4s\", TILEGX_OPC_LD4S, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286a980000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x8000000004000000ULL\n    }\n#endif\n  },\n  { \"ld4s_add\", TILEGX_OPC_LD4S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1858000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld4u\", TILEGX_OPC_LD4U, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 26, 14 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x286aa00000000000ULL,\n      -1ULL,\n      -1ULL,\n      0x8200000000000000ULL\n    }\n#endif\n  },\n  { \"ld4u_add\", TILEGX_OPC_LD4U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1860000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ld_add\", TILEGX_OPC_LD_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18a0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldna\", TILEGX_OPC_LDNA, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286aa80000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldna_add\", TILEGX_OPC_LDNA_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18a8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt\", TILEGX_OPC_LDNT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ae00000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt1s\", TILEGX_OPC_LDNT1S, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ab00000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt1s_add\", TILEGX_OPC_LDNT1S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1868000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt1u\", TILEGX_OPC_LDNT1U, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ab80000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt1u_add\", TILEGX_OPC_LDNT1U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1870000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt2s\", TILEGX_OPC_LDNT2S, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ac00000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt2s_add\", TILEGX_OPC_LDNT2S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1878000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt2u\", TILEGX_OPC_LDNT2U, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ac80000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt2u_add\", TILEGX_OPC_LDNT2U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1880000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt4s\", TILEGX_OPC_LDNT4S, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ad00000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt4s_add\", TILEGX_OPC_LDNT4S_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1888000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt4u\", TILEGX_OPC_LDNT4U, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286ad80000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt4u_add\", TILEGX_OPC_LDNT4U_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1890000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ldnt_add\", TILEGX_OPC_LDNT_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 6, 15, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1898000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"lnk\", TILEGX_OPC_LNK, 0xa, 1, TREG_ZERO, 1,\n    { { 0, }, { 6 }, { 0, }, { 12 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286af00000000000ULL,\n      -1ULL,\n      0x1c06700000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mf\", TILEGX_OPC_MF, 0x2, 0, TREG_ZERO, 1,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286af80000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mfspr\", TILEGX_OPC_MFSPR, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 6, 27 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18b0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mm\", TILEGX_OPC_MM, 0x1, 4, TREG_ZERO, 1,\n    { { 23, 9, 21, 22 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007f000000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000037000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mnz\", TILEGX_OPC_MNZ, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050a00000ULL,\n      0x2834000000000000ULL,\n      0x0000000048080000ULL,\n      0x2804000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mtspr\", TILEGX_OPC_MTSPR, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 28, 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18b8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hs_hs\", TILEGX_OPC_MUL_HS_HS, 0x5, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050d40000ULL,\n      -1ULL,\n      0x0000000068000000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hs_hu\", TILEGX_OPC_MUL_HS_HU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050d80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hs_ls\", TILEGX_OPC_MUL_HS_LS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050dc0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hs_lu\", TILEGX_OPC_MUL_HS_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050e00000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hu_hu\", TILEGX_OPC_MUL_HU_HU, 0x5, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050e40000ULL,\n      -1ULL,\n      0x0000000068040000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hu_ls\", TILEGX_OPC_MUL_HU_LS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050e80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_hu_lu\", TILEGX_OPC_MUL_HU_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050ec0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_ls_ls\", TILEGX_OPC_MUL_LS_LS, 0x5, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050f00000ULL,\n      -1ULL,\n      0x0000000068080000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_ls_lu\", TILEGX_OPC_MUL_LS_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050f40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mul_lu_lu\", TILEGX_OPC_MUL_LU_LU, 0x5, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050f80000ULL,\n      -1ULL,\n      0x00000000680c0000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hs_hs\", TILEGX_OPC_MULA_HS_HS, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050a80000ULL,\n      -1ULL,\n      0x0000000070000000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hs_hu\", TILEGX_OPC_MULA_HS_HU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050ac0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hs_ls\", TILEGX_OPC_MULA_HS_LS, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050b00000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hs_lu\", TILEGX_OPC_MULA_HS_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050b40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hu_hu\", TILEGX_OPC_MULA_HU_HU, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050b80000ULL,\n      -1ULL,\n      0x0000000070040000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hu_ls\", TILEGX_OPC_MULA_HU_LS, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050bc0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_hu_lu\", TILEGX_OPC_MULA_HU_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050c00000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_ls_ls\", TILEGX_OPC_MULA_LS_LS, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050c40000ULL,\n      -1ULL,\n      0x0000000070080000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_ls_lu\", TILEGX_OPC_MULA_LS_LU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050c80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mula_lu_lu\", TILEGX_OPC_MULA_LU_LU, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050cc0000ULL,\n      -1ULL,\n      0x00000000700c0000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mulax\", TILEGX_OPC_MULAX, 0x5, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 24, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050a40000ULL,\n      -1ULL,\n      0x0000000040080000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mulx\", TILEGX_OPC_MULX, 0x5, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 10, 11, 18 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0x00000000780c0000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000050d00000ULL,\n      -1ULL,\n      0x00000000400c0000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"mz\", TILEGX_OPC_MZ, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000050fc0000ULL,\n      0x2836000000000000ULL,\n      0x00000000480c0000ULL,\n      0x2806000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"nap\", TILEGX_OPC_NAP, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"nop\", TILEGX_OPC_NOP, 0xf, 0, TREG_ZERO, 1,\n    { {  }, {  }, {  }, {  }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0xfffff80000000000ULL,\n      0x00000000780ff000ULL,\n      0x3c07f80000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051485000ULL,\n      0x286b080000000000ULL,\n      0x00000000300c5000ULL,\n      0x1c06780000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"nor\", TILEGX_OPC_NOR, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051000000ULL,\n      0x2838000000000000ULL,\n      0x0000000050040000ULL,\n      0x2c02000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"or\", TILEGX_OPC_OR, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051040000ULL,\n      0x283a000000000000ULL,\n      0x0000000050080000ULL,\n      0x2c04000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"ori\", TILEGX_OPC_ORI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040700000ULL,\n      0x18c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"pcnt\", TILEGX_OPC_PCNT, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051486000ULL,\n      -1ULL,\n      0x00000000300c6000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"revbits\", TILEGX_OPC_REVBITS, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051487000ULL,\n      -1ULL,\n      0x00000000300c7000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"revbytes\", TILEGX_OPC_REVBYTES, 0x5, 2, TREG_ZERO, 1,\n    { { 8, 9 }, { 0, }, { 10, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051488000ULL,\n      -1ULL,\n      0x00000000300c8000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"rotl\", TILEGX_OPC_ROTL, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051080000ULL,\n      0x283c000000000000ULL,\n      0x0000000058000000ULL,\n      0x3000000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"rotli\", TILEGX_OPC_ROTLI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000060040000ULL,\n      0x3002000000000000ULL,\n      0x0000000078000000ULL,\n      0x3800000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl\", TILEGX_OPC_SHL, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051280000ULL,\n      0x284c000000000000ULL,\n      0x0000000058040000ULL,\n      0x3002000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl16insli\", TILEGX_OPC_SHL16INSLI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 4 }, { 6, 7, 5 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc000000070000000ULL,\n      0xf800000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000070000000ULL,\n      0x3800000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl1add\", TILEGX_OPC_SHL1ADD, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051100000ULL,\n      0x2840000000000000ULL,\n      0x0000000030000000ULL,\n      0x1c00000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl1addx\", TILEGX_OPC_SHL1ADDX, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000510c0000ULL,\n      0x283e000000000000ULL,\n      0x0000000060040000ULL,\n      0x3402000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl2add\", TILEGX_OPC_SHL2ADD, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051180000ULL,\n      0x2844000000000000ULL,\n      0x0000000030040000ULL,\n      0x1c02000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl2addx\", TILEGX_OPC_SHL2ADDX, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051140000ULL,\n      0x2842000000000000ULL,\n      0x0000000060080000ULL,\n      0x3404000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl3add\", TILEGX_OPC_SHL3ADD, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051200000ULL,\n      0x2848000000000000ULL,\n      0x0000000030080000ULL,\n      0x1c04000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shl3addx\", TILEGX_OPC_SHL3ADDX, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000511c0000ULL,\n      0x2846000000000000ULL,\n      0x00000000600c0000ULL,\n      0x3406000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shli\", TILEGX_OPC_SHLI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000060080000ULL,\n      0x3004000000000000ULL,\n      0x0000000078040000ULL,\n      0x3802000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shlx\", TILEGX_OPC_SHLX, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051240000ULL,\n      0x284a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shlxi\", TILEGX_OPC_SHLXI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000600c0000ULL,\n      0x3006000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shrs\", TILEGX_OPC_SHRS, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x00000000512c0000ULL,\n      0x284e000000000000ULL,\n      0x0000000058080000ULL,\n      0x3004000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shrsi\", TILEGX_OPC_SHRSI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000060100000ULL,\n      0x3008000000000000ULL,\n      0x0000000078080000ULL,\n      0x3804000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shru\", TILEGX_OPC_SHRU, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051340000ULL,\n      0x2852000000000000ULL,\n      0x00000000580c0000ULL,\n      0x3006000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shrui\", TILEGX_OPC_SHRUI, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 10, 11, 31 }, { 12, 13, 32 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000060140000ULL,\n      0x300a000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3806000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shrux\", TILEGX_OPC_SHRUX, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051300000ULL,\n      0x2850000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shruxi\", TILEGX_OPC_SHRUXI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000060180000ULL,\n      0x300c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"shufflebytes\", TILEGX_OPC_SHUFFLEBYTES, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051380000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"st\", TILEGX_OPC_ST, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x2862000000000000ULL,\n      -1ULL,\n      -1ULL,\n      0xc200000004000000ULL\n    }\n#endif\n  },\n  { \"st1\", TILEGX_OPC_ST1, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x2854000000000000ULL,\n      -1ULL,\n      -1ULL,\n      0xc000000000000000ULL\n    }\n#endif\n  },\n  { \"st1_add\", TILEGX_OPC_ST1_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18c8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"st2\", TILEGX_OPC_ST2, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x2856000000000000ULL,\n      -1ULL,\n      -1ULL,\n      0xc000000004000000ULL\n    }\n#endif\n  },\n  { \"st2_add\", TILEGX_OPC_ST2_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18d0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"st4\", TILEGX_OPC_ST4, 0x12, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 14, 33 } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0xc200000004000000ULL\n    },\n    {\n      -1ULL,\n      0x2858000000000000ULL,\n      -1ULL,\n      -1ULL,\n      0xc200000000000000ULL\n    }\n#endif\n  },\n  { \"st4_add\", TILEGX_OPC_ST4_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18d8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"st_add\", TILEGX_OPC_ST_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x1900000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt\", TILEGX_OPC_STNT, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x2860000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt1\", TILEGX_OPC_STNT1, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x285a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt1_add\", TILEGX_OPC_STNT1_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18e0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt2\", TILEGX_OPC_STNT2, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x285c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt2_add\", TILEGX_OPC_STNT2_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18e8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt4\", TILEGX_OPC_STNT4, 0x2, 2, TREG_ZERO, 1,\n    { { 0, }, { 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x285e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt4_add\", TILEGX_OPC_STNT4_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18f0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"stnt_add\", TILEGX_OPC_STNT_ADD, 0x2, 3, TREG_ZERO, 1,\n    { { 0, }, { 15, 17, 34 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x18f8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"sub\", TILEGX_OPC_SUB, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051440000ULL,\n      0x2868000000000000ULL,\n      0x00000000280c0000ULL,\n      0x1806000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"subx\", TILEGX_OPC_SUBX, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000051400000ULL,\n      0x2866000000000000ULL,\n      0x0000000028080000ULL,\n      0x1804000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"subxsc\", TILEGX_OPC_SUBXSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000513c0000ULL,\n      0x2864000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"swint0\", TILEGX_OPC_SWINT0, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b100000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"swint1\", TILEGX_OPC_SWINT1, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b180000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"swint2\", TILEGX_OPC_SWINT2, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b200000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"swint3\", TILEGX_OPC_SWINT3, 0x2, 0, TREG_ZERO, 0,\n    { { 0, }, {  }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b280000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"tblidxb0\", TILEGX_OPC_TBLIDXB0, 0x5, 2, TREG_ZERO, 1,\n    { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051489000ULL,\n      -1ULL,\n      0x00000000300c9000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"tblidxb1\", TILEGX_OPC_TBLIDXB1, 0x5, 2, TREG_ZERO, 1,\n    { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x000000005148a000ULL,\n      -1ULL,\n      0x00000000300ca000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"tblidxb2\", TILEGX_OPC_TBLIDXB2, 0x5, 2, TREG_ZERO, 1,\n    { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x000000005148b000ULL,\n      -1ULL,\n      0x00000000300cb000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"tblidxb3\", TILEGX_OPC_TBLIDXB3, 0x5, 2, TREG_ZERO, 1,\n    { { 23, 9 }, { 0, }, { 24, 11 }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffff000ULL,\n      0ULL,\n      0x00000000780ff000ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x000000005148c000ULL,\n      -1ULL,\n      0x00000000300cc000ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1add\", TILEGX_OPC_V1ADD, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051500000ULL,\n      0x286e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1addi\", TILEGX_OPC_V1ADDI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040800000ULL,\n      0x1908000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1adduc\", TILEGX_OPC_V1ADDUC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000514c0000ULL,\n      0x286c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1adiffu\", TILEGX_OPC_V1ADIFFU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051540000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1avgu\", TILEGX_OPC_V1AVGU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051580000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpeq\", TILEGX_OPC_V1CMPEQ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000515c0000ULL,\n      0x2870000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpeqi\", TILEGX_OPC_V1CMPEQI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040900000ULL,\n      0x1910000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmples\", TILEGX_OPC_V1CMPLES, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051600000ULL,\n      0x2872000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpleu\", TILEGX_OPC_V1CMPLEU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051640000ULL,\n      0x2874000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmplts\", TILEGX_OPC_V1CMPLTS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051680000ULL,\n      0x2876000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpltsi\", TILEGX_OPC_V1CMPLTSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040a00000ULL,\n      0x1918000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpltu\", TILEGX_OPC_V1CMPLTU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000516c0000ULL,\n      0x2878000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpltui\", TILEGX_OPC_V1CMPLTUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040b00000ULL,\n      0x1920000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1cmpne\", TILEGX_OPC_V1CMPNE, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051700000ULL,\n      0x287a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1ddotpu\", TILEGX_OPC_V1DDOTPU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052880000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1ddotpua\", TILEGX_OPC_V1DDOTPUA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052840000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1ddotpus\", TILEGX_OPC_V1DDOTPUS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051780000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1ddotpusa\", TILEGX_OPC_V1DDOTPUSA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051740000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotp\", TILEGX_OPC_V1DOTP, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051880000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotpa\", TILEGX_OPC_V1DOTPA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000517c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotpu\", TILEGX_OPC_V1DOTPU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052900000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotpua\", TILEGX_OPC_V1DOTPUA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000528c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotpus\", TILEGX_OPC_V1DOTPUS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051840000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1dotpusa\", TILEGX_OPC_V1DOTPUSA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051800000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1int_h\", TILEGX_OPC_V1INT_H, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000518c0000ULL,\n      0x287c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1int_l\", TILEGX_OPC_V1INT_L, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051900000ULL,\n      0x287e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1maxu\", TILEGX_OPC_V1MAXU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051940000ULL,\n      0x2880000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1maxui\", TILEGX_OPC_V1MAXUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040c00000ULL,\n      0x1928000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1minu\", TILEGX_OPC_V1MINU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051980000ULL,\n      0x2882000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1minui\", TILEGX_OPC_V1MINUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040d00000ULL,\n      0x1930000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1mnz\", TILEGX_OPC_V1MNZ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000519c0000ULL,\n      0x2884000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1multu\", TILEGX_OPC_V1MULTU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051a00000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1mulu\", TILEGX_OPC_V1MULU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051a80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1mulus\", TILEGX_OPC_V1MULUS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051a40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1mz\", TILEGX_OPC_V1MZ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051ac0000ULL,\n      0x2886000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1sadau\", TILEGX_OPC_V1SADAU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051b00000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1sadu\", TILEGX_OPC_V1SADU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051b40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shl\", TILEGX_OPC_V1SHL, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051b80000ULL,\n      0x2888000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shli\", TILEGX_OPC_V1SHLI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000601c0000ULL,\n      0x300e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shrs\", TILEGX_OPC_V1SHRS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051bc0000ULL,\n      0x288a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shrsi\", TILEGX_OPC_V1SHRSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000060200000ULL,\n      0x3010000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shru\", TILEGX_OPC_V1SHRU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051c00000ULL,\n      0x288c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1shrui\", TILEGX_OPC_V1SHRUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000060240000ULL,\n      0x3012000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1sub\", TILEGX_OPC_V1SUB, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051c80000ULL,\n      0x2890000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v1subuc\", TILEGX_OPC_V1SUBUC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051c40000ULL,\n      0x288e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2add\", TILEGX_OPC_V2ADD, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051d00000ULL,\n      0x2894000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2addi\", TILEGX_OPC_V2ADDI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040e00000ULL,\n      0x1938000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2addsc\", TILEGX_OPC_V2ADDSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051cc0000ULL,\n      0x2892000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2adiffs\", TILEGX_OPC_V2ADIFFS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051d40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2avgs\", TILEGX_OPC_V2AVGS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051d80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpeq\", TILEGX_OPC_V2CMPEQ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051dc0000ULL,\n      0x2896000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpeqi\", TILEGX_OPC_V2CMPEQI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000040f00000ULL,\n      0x1940000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmples\", TILEGX_OPC_V2CMPLES, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051e00000ULL,\n      0x2898000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpleu\", TILEGX_OPC_V2CMPLEU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051e40000ULL,\n      0x289a000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmplts\", TILEGX_OPC_V2CMPLTS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051e80000ULL,\n      0x289c000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpltsi\", TILEGX_OPC_V2CMPLTSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000041000000ULL,\n      0x1948000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpltu\", TILEGX_OPC_V2CMPLTU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051ec0000ULL,\n      0x289e000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpltui\", TILEGX_OPC_V2CMPLTUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000041100000ULL,\n      0x1950000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2cmpne\", TILEGX_OPC_V2CMPNE, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051f00000ULL,\n      0x28a0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2dotp\", TILEGX_OPC_V2DOTP, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051f80000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2dotpa\", TILEGX_OPC_V2DOTPA, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051f40000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2int_h\", TILEGX_OPC_V2INT_H, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000051fc0000ULL,\n      0x28a2000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2int_l\", TILEGX_OPC_V2INT_L, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052000000ULL,\n      0x28a4000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2maxs\", TILEGX_OPC_V2MAXS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052040000ULL,\n      0x28a6000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2maxsi\", TILEGX_OPC_V2MAXSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000041200000ULL,\n      0x1958000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2mins\", TILEGX_OPC_V2MINS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052080000ULL,\n      0x28a8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2minsi\", TILEGX_OPC_V2MINSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000041300000ULL,\n      0x1960000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2mnz\", TILEGX_OPC_V2MNZ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000520c0000ULL,\n      0x28aa000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2mulfsc\", TILEGX_OPC_V2MULFSC, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052100000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2muls\", TILEGX_OPC_V2MULS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052140000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2mults\", TILEGX_OPC_V2MULTS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052180000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2mz\", TILEGX_OPC_V2MZ, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000521c0000ULL,\n      0x28ac000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2packh\", TILEGX_OPC_V2PACKH, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052200000ULL,\n      0x28ae000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2packl\", TILEGX_OPC_V2PACKL, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052240000ULL,\n      0x28b0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2packuc\", TILEGX_OPC_V2PACKUC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052280000ULL,\n      0x28b2000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2sadas\", TILEGX_OPC_V2SADAS, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000522c0000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2sadau\", TILEGX_OPC_V2SADAU, 0x1, 3, TREG_ZERO, 1,\n    { { 23, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052300000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2sads\", TILEGX_OPC_V2SADS, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052340000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2sadu\", TILEGX_OPC_V2SADU, 0x1, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 0, }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052380000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shl\", TILEGX_OPC_V2SHL, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052400000ULL,\n      0x28b6000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shli\", TILEGX_OPC_V2SHLI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000060280000ULL,\n      0x3014000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shlsc\", TILEGX_OPC_V2SHLSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000523c0000ULL,\n      0x28b4000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shrs\", TILEGX_OPC_V2SHRS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052440000ULL,\n      0x28b8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shrsi\", TILEGX_OPC_V2SHRSI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000602c0000ULL,\n      0x3016000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shru\", TILEGX_OPC_V2SHRU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052480000ULL,\n      0x28ba000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2shrui\", TILEGX_OPC_V2SHRUI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 29 }, { 6, 7, 30 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000060300000ULL,\n      0x3018000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2sub\", TILEGX_OPC_V2SUB, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052500000ULL,\n      0x28be000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v2subsc\", TILEGX_OPC_V2SUBSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000524c0000ULL,\n      0x28bc000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4add\", TILEGX_OPC_V4ADD, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052580000ULL,\n      0x28c2000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4addsc\", TILEGX_OPC_V4ADDSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052540000ULL,\n      0x28c0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4int_h\", TILEGX_OPC_V4INT_H, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000525c0000ULL,\n      0x28c4000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4int_l\", TILEGX_OPC_V4INT_L, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052600000ULL,\n      0x28c6000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4packsc\", TILEGX_OPC_V4PACKSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052640000ULL,\n      0x28c8000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4shl\", TILEGX_OPC_V4SHL, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000526c0000ULL,\n      0x28cc000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4shlsc\", TILEGX_OPC_V4SHLSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052680000ULL,\n      0x28ca000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4shrs\", TILEGX_OPC_V4SHRS, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052700000ULL,\n      0x28ce000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4shru\", TILEGX_OPC_V4SHRU, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052740000ULL,\n      0x28d0000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4sub\", TILEGX_OPC_V4SUB, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x00000000527c0000ULL,\n      0x28d4000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"v4subsc\", TILEGX_OPC_V4SUBSC, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000052780000ULL,\n      0x28d2000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"wh64\", TILEGX_OPC_WH64, 0x2, 1, TREG_ZERO, 1,\n    { { 0, }, { 7 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0ULL,\n      0xfffff80000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      -1ULL,\n      0x286b300000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"xor\", TILEGX_OPC_XOR, 0xf, 3, TREG_ZERO, 1,\n    { { 8, 9, 16 }, { 6, 7, 17 }, { 10, 11, 18 }, { 12, 13, 19 }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ffc0000ULL,\n      0xfffe000000000000ULL,\n      0x00000000780c0000ULL,\n      0x3c06000000000000ULL,\n      0ULL\n    },\n    {\n      0x0000000052800000ULL,\n      0x28d6000000000000ULL,\n      0x00000000500c0000ULL,\n      0x2c06000000000000ULL,\n      -1ULL\n    }\n#endif\n  },\n  { \"xori\", TILEGX_OPC_XORI, 0x3, 3, TREG_ZERO, 1,\n    { { 8, 9, 0 }, { 6, 7, 1 }, { 0, }, { 0, }, { 0, } },\n#ifndef DISASM_ONLY\n    {\n      0xc00000007ff00000ULL,\n      0xfff8000000000000ULL,\n      0ULL,\n      0ULL,\n      0ULL\n    },\n    {\n      0x0000000041400000ULL,\n      0x1968000000000000ULL,\n      -1ULL,\n      -1ULL,\n      -1ULL\n    }\n#endif\n  },\n  { NULL, TILEGX_OPC_NONE, 0, 0, TREG_ZERO, 0, { { 0, } },\n#ifndef DISASM_ONLY\n    { 0, }, { 0, }\n#endif\n  }\n};\n\n#define BITFIELD(start, size) ((start) | (((1 << (size)) - 1) << 6))\n#define CHILD(array_index) (TILEGX_OPC_NONE + (array_index))\n\nstatic const unsigned short decode_X0_fsm[936] =\n{\n  BITFIELD(22, 9) /* index 0 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_BFEXTS,\n  TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTS, TILEGX_OPC_BFEXTU,\n  TILEGX_OPC_BFEXTU, TILEGX_OPC_BFEXTU, TILEGX_OPC_BFEXTU, TILEGX_OPC_BFINS,\n  TILEGX_OPC_BFINS, TILEGX_OPC_BFINS, TILEGX_OPC_BFINS, TILEGX_OPC_MM,\n  TILEGX_OPC_MM, TILEGX_OPC_MM, TILEGX_OPC_MM, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(528), CHILD(578),\n  CHILD(583), CHILD(588), CHILD(593), CHILD(598), TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, CHILD(603), CHILD(620), CHILD(637), CHILD(654), CHILD(671),\n  CHILD(703), CHILD(797), CHILD(814), CHILD(831), CHILD(848), CHILD(865),\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, CHILD(889), TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  CHILD(906), CHILD(906), CHILD(906), CHILD(906), CHILD(906),\n  BITFIELD(6, 2) /* index 513 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(518),\n  BITFIELD(8, 2) /* index 518 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(523),\n  BITFIELD(10, 2) /* index 523 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_MOVELI,\n  BITFIELD(20, 2) /* index 528 */,\n  TILEGX_OPC_NONE, CHILD(533), TILEGX_OPC_ADDXI, CHILD(548),\n  BITFIELD(6, 2) /* index 533 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(538),\n  BITFIELD(8, 2) /* index 538 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(543),\n  BITFIELD(10, 2) /* index 543 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI,\n  BITFIELD(0, 2) /* index 548 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(553),\n  BITFIELD(2, 2) /* index 553 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(558),\n  BITFIELD(4, 2) /* index 558 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(563),\n  BITFIELD(6, 2) /* index 563 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(568),\n  BITFIELD(8, 2) /* index 568 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(573),\n  BITFIELD(10, 2) /* index 573 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO,\n  BITFIELD(20, 2) /* index 578 */,\n  TILEGX_OPC_CMPEQI, TILEGX_OPC_CMPLTSI, TILEGX_OPC_CMPLTUI, TILEGX_OPC_ORI,\n  BITFIELD(20, 2) /* index 583 */,\n  TILEGX_OPC_V1ADDI, TILEGX_OPC_V1CMPEQI, TILEGX_OPC_V1CMPLTSI,\n  TILEGX_OPC_V1CMPLTUI,\n  BITFIELD(20, 2) /* index 588 */,\n  TILEGX_OPC_V1MAXUI, TILEGX_OPC_V1MINUI, TILEGX_OPC_V2ADDI,\n  TILEGX_OPC_V2CMPEQI,\n  BITFIELD(20, 2) /* index 593 */,\n  TILEGX_OPC_V2CMPLTSI, TILEGX_OPC_V2CMPLTUI, TILEGX_OPC_V2MAXSI,\n  TILEGX_OPC_V2MINSI,\n  BITFIELD(20, 2) /* index 598 */,\n  TILEGX_OPC_XORI, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(18, 4) /* index 603 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_ADDXSC, TILEGX_OPC_ADDX, TILEGX_OPC_ADD,\n  TILEGX_OPC_AND, TILEGX_OPC_CMOVEQZ, TILEGX_OPC_CMOVNEZ, TILEGX_OPC_CMPEQ,\n  TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU,\n  TILEGX_OPC_CMPNE, TILEGX_OPC_CMULAF, TILEGX_OPC_CMULA, TILEGX_OPC_CMULFR,\n  BITFIELD(18, 4) /* index 620 */,\n  TILEGX_OPC_CMULF, TILEGX_OPC_CMULHR, TILEGX_OPC_CMULH, TILEGX_OPC_CMUL,\n  TILEGX_OPC_CRC32_32, TILEGX_OPC_CRC32_8, TILEGX_OPC_DBLALIGN2,\n  TILEGX_OPC_DBLALIGN4, TILEGX_OPC_DBLALIGN6, TILEGX_OPC_DBLALIGN,\n  TILEGX_OPC_FDOUBLE_ADDSUB, TILEGX_OPC_FDOUBLE_ADD_FLAGS,\n  TILEGX_OPC_FDOUBLE_MUL_FLAGS, TILEGX_OPC_FDOUBLE_PACK1,\n  TILEGX_OPC_FDOUBLE_PACK2, TILEGX_OPC_FDOUBLE_SUB_FLAGS,\n  BITFIELD(18, 4) /* index 637 */,\n  TILEGX_OPC_FDOUBLE_UNPACK_MAX, TILEGX_OPC_FDOUBLE_UNPACK_MIN,\n  TILEGX_OPC_FSINGLE_ADD1, TILEGX_OPC_FSINGLE_ADDSUB2,\n  TILEGX_OPC_FSINGLE_MUL1, TILEGX_OPC_FSINGLE_MUL2, TILEGX_OPC_FSINGLE_PACK2,\n  TILEGX_OPC_FSINGLE_SUB1, TILEGX_OPC_MNZ, TILEGX_OPC_MULAX,\n  TILEGX_OPC_MULA_HS_HS, TILEGX_OPC_MULA_HS_HU, TILEGX_OPC_MULA_HS_LS,\n  TILEGX_OPC_MULA_HS_LU, TILEGX_OPC_MULA_HU_HU, TILEGX_OPC_MULA_HU_LS,\n  BITFIELD(18, 4) /* index 654 */,\n  TILEGX_OPC_MULA_HU_LU, TILEGX_OPC_MULA_LS_LS, TILEGX_OPC_MULA_LS_LU,\n  TILEGX_OPC_MULA_LU_LU, TILEGX_OPC_MULX, TILEGX_OPC_MUL_HS_HS,\n  TILEGX_OPC_MUL_HS_HU, TILEGX_OPC_MUL_HS_LS, TILEGX_OPC_MUL_HS_LU,\n  TILEGX_OPC_MUL_HU_HU, TILEGX_OPC_MUL_HU_LS, TILEGX_OPC_MUL_HU_LU,\n  TILEGX_OPC_MUL_LS_LS, TILEGX_OPC_MUL_LS_LU, TILEGX_OPC_MUL_LU_LU,\n  TILEGX_OPC_MZ,\n  BITFIELD(18, 4) /* index 671 */,\n  TILEGX_OPC_NOR, CHILD(688), TILEGX_OPC_ROTL, TILEGX_OPC_SHL1ADDX,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADDX, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL3ADDX, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHLX, TILEGX_OPC_SHL,\n  TILEGX_OPC_SHRS, TILEGX_OPC_SHRUX, TILEGX_OPC_SHRU, TILEGX_OPC_SHUFFLEBYTES,\n  TILEGX_OPC_SUBXSC,\n  BITFIELD(12, 2) /* index 688 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(693),\n  BITFIELD(14, 2) /* index 693 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(698),\n  BITFIELD(16, 2) /* index 698 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE,\n  BITFIELD(18, 4) /* index 703 */,\n  TILEGX_OPC_SUBX, TILEGX_OPC_SUB, CHILD(720), TILEGX_OPC_V1ADDUC,\n  TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADIFFU, TILEGX_OPC_V1AVGU,\n  TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLEU,\n  TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPNE,\n  TILEGX_OPC_V1DDOTPUSA, TILEGX_OPC_V1DDOTPUS, TILEGX_OPC_V1DOTPA,\n  BITFIELD(12, 4) /* index 720 */,\n  TILEGX_OPC_NONE, CHILD(737), CHILD(742), CHILD(747), CHILD(752), CHILD(757),\n  CHILD(762), CHILD(767), CHILD(772), CHILD(777), CHILD(782), CHILD(787),\n  CHILD(792), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 737 */,\n  TILEGX_OPC_CLZ, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 742 */,\n  TILEGX_OPC_CTZ, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 747 */,\n  TILEGX_OPC_FNOP, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 752 */,\n  TILEGX_OPC_FSINGLE_PACK1, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 757 */,\n  TILEGX_OPC_NOP, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 762 */,\n  TILEGX_OPC_PCNT, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 767 */,\n  TILEGX_OPC_REVBITS, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 772 */,\n  TILEGX_OPC_REVBYTES, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 777 */,\n  TILEGX_OPC_TBLIDXB0, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 782 */,\n  TILEGX_OPC_TBLIDXB1, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 787 */,\n  TILEGX_OPC_TBLIDXB2, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(16, 2) /* index 792 */,\n  TILEGX_OPC_TBLIDXB3, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(18, 4) /* index 797 */,\n  TILEGX_OPC_V1DOTPUSA, TILEGX_OPC_V1DOTPUS, TILEGX_OPC_V1DOTP,\n  TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1MAXU,\n  TILEGX_OPC_V1MINU, TILEGX_OPC_V1MNZ, TILEGX_OPC_V1MULTU, TILEGX_OPC_V1MULUS,\n  TILEGX_OPC_V1MULU, TILEGX_OPC_V1MZ, TILEGX_OPC_V1SADAU, TILEGX_OPC_V1SADU,\n  TILEGX_OPC_V1SHL, TILEGX_OPC_V1SHRS,\n  BITFIELD(18, 4) /* index 814 */,\n  TILEGX_OPC_V1SHRU, TILEGX_OPC_V1SUBUC, TILEGX_OPC_V1SUB, TILEGX_OPC_V2ADDSC,\n  TILEGX_OPC_V2ADD, TILEGX_OPC_V2ADIFFS, TILEGX_OPC_V2AVGS,\n  TILEGX_OPC_V2CMPEQ, TILEGX_OPC_V2CMPLES, TILEGX_OPC_V2CMPLEU,\n  TILEGX_OPC_V2CMPLTS, TILEGX_OPC_V2CMPLTU, TILEGX_OPC_V2CMPNE,\n  TILEGX_OPC_V2DOTPA, TILEGX_OPC_V2DOTP, TILEGX_OPC_V2INT_H,\n  BITFIELD(18, 4) /* index 831 */,\n  TILEGX_OPC_V2INT_L, TILEGX_OPC_V2MAXS, TILEGX_OPC_V2MINS, TILEGX_OPC_V2MNZ,\n  TILEGX_OPC_V2MULFSC, TILEGX_OPC_V2MULS, TILEGX_OPC_V2MULTS, TILEGX_OPC_V2MZ,\n  TILEGX_OPC_V2PACKH, TILEGX_OPC_V2PACKL, TILEGX_OPC_V2PACKUC,\n  TILEGX_OPC_V2SADAS, TILEGX_OPC_V2SADAU, TILEGX_OPC_V2SADS,\n  TILEGX_OPC_V2SADU, TILEGX_OPC_V2SHLSC,\n  BITFIELD(18, 4) /* index 848 */,\n  TILEGX_OPC_V2SHL, TILEGX_OPC_V2SHRS, TILEGX_OPC_V2SHRU, TILEGX_OPC_V2SUBSC,\n  TILEGX_OPC_V2SUB, TILEGX_OPC_V4ADDSC, TILEGX_OPC_V4ADD, TILEGX_OPC_V4INT_H,\n  TILEGX_OPC_V4INT_L, TILEGX_OPC_V4PACKSC, TILEGX_OPC_V4SHLSC,\n  TILEGX_OPC_V4SHL, TILEGX_OPC_V4SHRS, TILEGX_OPC_V4SHRU, TILEGX_OPC_V4SUBSC,\n  TILEGX_OPC_V4SUB,\n  BITFIELD(18, 3) /* index 865 */,\n  CHILD(874), CHILD(877), CHILD(880), CHILD(883), CHILD(886), TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(21, 1) /* index 874 */,\n  TILEGX_OPC_XOR, TILEGX_OPC_NONE,\n  BITFIELD(21, 1) /* index 877 */,\n  TILEGX_OPC_V1DDOTPUA, TILEGX_OPC_NONE,\n  BITFIELD(21, 1) /* index 880 */,\n  TILEGX_OPC_V1DDOTPU, TILEGX_OPC_NONE,\n  BITFIELD(21, 1) /* index 883 */,\n  TILEGX_OPC_V1DOTPUA, TILEGX_OPC_NONE,\n  BITFIELD(21, 1) /* index 886 */,\n  TILEGX_OPC_V1DOTPU, TILEGX_OPC_NONE,\n  BITFIELD(18, 4) /* index 889 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHLXI,\n  TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, TILEGX_OPC_SHRUXI, TILEGX_OPC_V1SHLI,\n  TILEGX_OPC_V1SHRSI, TILEGX_OPC_V1SHRUI, TILEGX_OPC_V2SHLI,\n  TILEGX_OPC_V2SHRSI, TILEGX_OPC_V2SHRUI, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE,\n  BITFIELD(0, 2) /* index 906 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(911),\n  BITFIELD(2, 2) /* index 911 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(916),\n  BITFIELD(4, 2) /* index 916 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(921),\n  BITFIELD(6, 2) /* index 921 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(926),\n  BITFIELD(8, 2) /* index 926 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(931),\n  BITFIELD(10, 2) /* index 931 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  TILEGX_OPC_INFOL,\n};\n\nstatic const unsigned short decode_X1_fsm[1266] =\n{\n  BITFIELD(53, 9) /* index 0 */,\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513), CHILD(513),\n  CHILD(513), CHILD(513), CHILD(513), CHILD(513), TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI,\n  TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_ADDXLI, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_BEQZT,\n  TILEGX_OPC_BEQZT, TILEGX_OPC_BEQZ, TILEGX_OPC_BEQZ, TILEGX_OPC_BGEZT,\n  TILEGX_OPC_BGEZT, TILEGX_OPC_BGEZ, TILEGX_OPC_BGEZ, TILEGX_OPC_BGTZT,\n  TILEGX_OPC_BGTZT, TILEGX_OPC_BGTZ, TILEGX_OPC_BGTZ, TILEGX_OPC_BLBCT,\n  TILEGX_OPC_BLBCT, TILEGX_OPC_BLBC, TILEGX_OPC_BLBC, TILEGX_OPC_BLBST,\n  TILEGX_OPC_BLBST, TILEGX_OPC_BLBS, TILEGX_OPC_BLBS, TILEGX_OPC_BLEZT,\n  TILEGX_OPC_BLEZT, TILEGX_OPC_BLEZ, TILEGX_OPC_BLEZ, TILEGX_OPC_BLTZT,\n  TILEGX_OPC_BLTZT, TILEGX_OPC_BLTZ, TILEGX_OPC_BLTZ, TILEGX_OPC_BNEZT,\n  TILEGX_OPC_BNEZT, TILEGX_OPC_BNEZ, TILEGX_OPC_BNEZ, CHILD(528), CHILD(578),\n  CHILD(598), CHILD(703), CHILD(723), CHILD(728), CHILD(753), CHILD(758),\n  CHILD(763), CHILD(768), CHILD(773), CHILD(778), TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL,\n  TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_JAL, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J, TILEGX_OPC_J,\n  CHILD(783), CHILD(800), CHILD(832), CHILD(849), CHILD(1168), CHILD(1185),\n  CHILD(1202), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(1219), TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236), CHILD(1236),\n  CHILD(1236),\n  BITFIELD(37, 2) /* index 513 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(518),\n  BITFIELD(39, 2) /* index 518 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, CHILD(523),\n  BITFIELD(41, 2) /* index 523 */,\n  TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_ADDLI, TILEGX_OPC_MOVELI,\n  BITFIELD(51, 2) /* index 528 */,\n  TILEGX_OPC_NONE, CHILD(533), TILEGX_OPC_ADDXI, CHILD(548),\n  BITFIELD(37, 2) /* index 533 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(538),\n  BITFIELD(39, 2) /* index 538 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(543),\n  BITFIELD(41, 2) /* index 543 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI,\n  BITFIELD(31, 2) /* index 548 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(553),\n  BITFIELD(33, 2) /* index 553 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(558),\n  BITFIELD(35, 2) /* index 558 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(563),\n  BITFIELD(37, 2) /* index 563 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(568),\n  BITFIELD(39, 2) /* index 568 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(573),\n  BITFIELD(41, 2) /* index 573 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO,\n  BITFIELD(51, 2) /* index 578 */,\n  TILEGX_OPC_CMPEQI, TILEGX_OPC_CMPLTSI, TILEGX_OPC_CMPLTUI, CHILD(583),\n  BITFIELD(31, 2) /* index 583 */,\n  TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, CHILD(588),\n  BITFIELD(33, 2) /* index 588 */,\n  TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, CHILD(593),\n  BITFIELD(35, 2) /* index 593 */,\n  TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD, TILEGX_OPC_LD1S_ADD,\n  TILEGX_OPC_PREFETCH_ADD_L1_FAULT,\n  BITFIELD(51, 2) /* index 598 */,\n  CHILD(603), CHILD(618), CHILD(633), CHILD(648),\n  BITFIELD(31, 2) /* index 603 */,\n  TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, CHILD(608),\n  BITFIELD(33, 2) /* index 608 */,\n  TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, CHILD(613),\n  BITFIELD(35, 2) /* index 613 */,\n  TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD, TILEGX_OPC_LD1U_ADD,\n  TILEGX_OPC_PREFETCH_ADD_L1,\n  BITFIELD(31, 2) /* index 618 */,\n  TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, CHILD(623),\n  BITFIELD(33, 2) /* index 623 */,\n  TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, CHILD(628),\n  BITFIELD(35, 2) /* index 628 */,\n  TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD, TILEGX_OPC_LD2S_ADD,\n  TILEGX_OPC_PREFETCH_ADD_L2_FAULT,\n  BITFIELD(31, 2) /* index 633 */,\n  TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, CHILD(638),\n  BITFIELD(33, 2) /* index 638 */,\n  TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, CHILD(643),\n  BITFIELD(35, 2) /* index 643 */,\n  TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD, TILEGX_OPC_LD2U_ADD,\n  TILEGX_OPC_PREFETCH_ADD_L2,\n  BITFIELD(31, 2) /* index 648 */,\n  CHILD(653), CHILD(653), CHILD(653), CHILD(673),\n  BITFIELD(43, 2) /* index 653 */,\n  CHILD(658), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD,\n  BITFIELD(45, 2) /* index 658 */,\n  CHILD(663), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD,\n  BITFIELD(47, 2) /* index 663 */,\n  CHILD(668), TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD,\n  BITFIELD(49, 2) /* index 668 */,\n  TILEGX_OPC_LD4S_TLS, TILEGX_OPC_LD4S_ADD, TILEGX_OPC_LD4S_ADD,\n  TILEGX_OPC_LD4S_ADD,\n  BITFIELD(33, 2) /* index 673 */,\n  CHILD(653), CHILD(653), CHILD(653), CHILD(678),\n  BITFIELD(35, 2) /* index 678 */,\n  CHILD(653), CHILD(653), CHILD(653), CHILD(683),\n  BITFIELD(43, 2) /* index 683 */,\n  CHILD(688), TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  BITFIELD(45, 2) /* index 688 */,\n  CHILD(693), TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  BITFIELD(47, 2) /* index 693 */,\n  CHILD(698), TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  BITFIELD(49, 2) /* index 698 */,\n  TILEGX_OPC_LD4S_TLS, TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  TILEGX_OPC_PREFETCH_ADD_L3_FAULT, TILEGX_OPC_PREFETCH_ADD_L3_FAULT,\n  BITFIELD(51, 2) /* index 703 */,\n  CHILD(708), TILEGX_OPC_LDNT1S_ADD, TILEGX_OPC_LDNT1U_ADD,\n  TILEGX_OPC_LDNT2S_ADD,\n  BITFIELD(31, 2) /* index 708 */,\n  TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, CHILD(713),\n  BITFIELD(33, 2) /* index 713 */,\n  TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, CHILD(718),\n  BITFIELD(35, 2) /* index 718 */,\n  TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD, TILEGX_OPC_LD4U_ADD,\n  TILEGX_OPC_PREFETCH_ADD_L3,\n  BITFIELD(51, 2) /* index 723 */,\n  TILEGX_OPC_LDNT2U_ADD, TILEGX_OPC_LDNT4S_ADD, TILEGX_OPC_LDNT4U_ADD,\n  TILEGX_OPC_LDNT_ADD,\n  BITFIELD(51, 2) /* index 728 */,\n  CHILD(733), TILEGX_OPC_LDNA_ADD, TILEGX_OPC_MFSPR, TILEGX_OPC_MTSPR,\n  BITFIELD(43, 2) /* index 733 */,\n  CHILD(738), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD,\n  BITFIELD(45, 2) /* index 738 */,\n  CHILD(743), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD,\n  BITFIELD(47, 2) /* index 743 */,\n  CHILD(748), TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD,\n  BITFIELD(49, 2) /* index 748 */,\n  TILEGX_OPC_LD_TLS, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD, TILEGX_OPC_LD_ADD,\n  BITFIELD(51, 2) /* index 753 */,\n  TILEGX_OPC_ORI, TILEGX_OPC_ST1_ADD, TILEGX_OPC_ST2_ADD, TILEGX_OPC_ST4_ADD,\n  BITFIELD(51, 2) /* index 758 */,\n  TILEGX_OPC_STNT1_ADD, TILEGX_OPC_STNT2_ADD, TILEGX_OPC_STNT4_ADD,\n  TILEGX_OPC_STNT_ADD,\n  BITFIELD(51, 2) /* index 763 */,\n  TILEGX_OPC_ST_ADD, TILEGX_OPC_V1ADDI, TILEGX_OPC_V1CMPEQI,\n  TILEGX_OPC_V1CMPLTSI,\n  BITFIELD(51, 2) /* index 768 */,\n  TILEGX_OPC_V1CMPLTUI, TILEGX_OPC_V1MAXUI, TILEGX_OPC_V1MINUI,\n  TILEGX_OPC_V2ADDI,\n  BITFIELD(51, 2) /* index 773 */,\n  TILEGX_OPC_V2CMPEQI, TILEGX_OPC_V2CMPLTSI, TILEGX_OPC_V2CMPLTUI,\n  TILEGX_OPC_V2MAXSI,\n  BITFIELD(51, 2) /* index 778 */,\n  TILEGX_OPC_V2MINSI, TILEGX_OPC_XORI, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(49, 4) /* index 783 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_ADDXSC, TILEGX_OPC_ADDX, TILEGX_OPC_ADD,\n  TILEGX_OPC_AND, TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPEXCH4, TILEGX_OPC_CMPEXCH,\n  TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU,\n  TILEGX_OPC_CMPNE, TILEGX_OPC_DBLALIGN2, TILEGX_OPC_DBLALIGN4,\n  TILEGX_OPC_DBLALIGN6,\n  BITFIELD(49, 4) /* index 800 */,\n  TILEGX_OPC_EXCH4, TILEGX_OPC_EXCH, TILEGX_OPC_FETCHADD4,\n  TILEGX_OPC_FETCHADDGEZ4, TILEGX_OPC_FETCHADDGEZ, TILEGX_OPC_FETCHADD,\n  TILEGX_OPC_FETCHAND4, TILEGX_OPC_FETCHAND, TILEGX_OPC_FETCHOR4,\n  TILEGX_OPC_FETCHOR, TILEGX_OPC_MNZ, TILEGX_OPC_MZ, TILEGX_OPC_NOR,\n  CHILD(817), TILEGX_OPC_ROTL, TILEGX_OPC_SHL1ADDX,\n  BITFIELD(43, 2) /* index 817 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(822),\n  BITFIELD(45, 2) /* index 822 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(827),\n  BITFIELD(47, 2) /* index 827 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE,\n  BITFIELD(49, 4) /* index 832 */,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADDX, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL3ADDX, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHLX, TILEGX_OPC_SHL,\n  TILEGX_OPC_SHRS, TILEGX_OPC_SHRUX, TILEGX_OPC_SHRU, TILEGX_OPC_ST1,\n  TILEGX_OPC_ST2, TILEGX_OPC_ST4, TILEGX_OPC_STNT1, TILEGX_OPC_STNT2,\n  TILEGX_OPC_STNT4,\n  BITFIELD(46, 7) /* index 849 */,\n  TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT,\n  TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT, TILEGX_OPC_STNT,\n  TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST,\n  TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_ST, TILEGX_OPC_SUBXSC,\n  TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC,\n  TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBXSC, TILEGX_OPC_SUBX,\n  TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX,\n  TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUBX, TILEGX_OPC_SUB,\n  TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB,\n  TILEGX_OPC_SUB, TILEGX_OPC_SUB, TILEGX_OPC_SUB, CHILD(978), CHILD(987),\n  CHILD(1066), CHILD(1150), CHILD(1159), TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC,\n  TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC,\n  TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADDUC, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD,\n  TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD,\n  TILEGX_OPC_V1ADD, TILEGX_OPC_V1ADD, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ,\n  TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ,\n  TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ, TILEGX_OPC_V1CMPEQ,\n  TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES,\n  TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES,\n  TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLES, TILEGX_OPC_V1CMPLEU,\n  TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU,\n  TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLEU,\n  TILEGX_OPC_V1CMPLEU, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS,\n  TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS,\n  TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS, TILEGX_OPC_V1CMPLTS,\n  TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU,\n  TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU,\n  TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPLTU, TILEGX_OPC_V1CMPNE,\n  TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE,\n  TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1CMPNE,\n  TILEGX_OPC_V1CMPNE, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H,\n  TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H,\n  TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H, TILEGX_OPC_V1INT_H,\n  TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L,\n  TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L,\n  TILEGX_OPC_V1INT_L, TILEGX_OPC_V1INT_L,\n  BITFIELD(43, 3) /* index 978 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_DRAIN, TILEGX_OPC_DTLBPR, TILEGX_OPC_FINV,\n  TILEGX_OPC_FLUSHWB, TILEGX_OPC_FLUSH, TILEGX_OPC_FNOP, TILEGX_OPC_ICOH,\n  BITFIELD(43, 3) /* index 987 */,\n  CHILD(996), TILEGX_OPC_INV, TILEGX_OPC_IRET, TILEGX_OPC_JALRP,\n  TILEGX_OPC_JALR, TILEGX_OPC_JRP, TILEGX_OPC_JR, CHILD(1051),\n  BITFIELD(31, 2) /* index 996 */,\n  CHILD(1001), CHILD(1026), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(33, 2) /* index 1001 */,\n  TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_ILL, CHILD(1006),\n  BITFIELD(35, 2) /* index 1006 */,\n  TILEGX_OPC_ILL, CHILD(1011), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(37, 2) /* index 1011 */,\n  TILEGX_OPC_ILL, CHILD(1016), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(39, 2) /* index 1016 */,\n  TILEGX_OPC_ILL, CHILD(1021), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(41, 2) /* index 1021 */,\n  TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_BPT, TILEGX_OPC_ILL,\n  BITFIELD(33, 2) /* index 1026 */,\n  TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_ILL, CHILD(1031),\n  BITFIELD(35, 2) /* index 1031 */,\n  TILEGX_OPC_ILL, CHILD(1036), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(37, 2) /* index 1036 */,\n  TILEGX_OPC_ILL, CHILD(1041), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(39, 2) /* index 1041 */,\n  TILEGX_OPC_ILL, CHILD(1046), TILEGX_OPC_ILL, TILEGX_OPC_ILL,\n  BITFIELD(41, 2) /* index 1046 */,\n  TILEGX_OPC_ILL, TILEGX_OPC_ILL, TILEGX_OPC_RAISE, TILEGX_OPC_ILL,\n  BITFIELD(31, 2) /* index 1051 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(1056),\n  BITFIELD(33, 2) /* index 1056 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(1061),\n  BITFIELD(35, 2) /* index 1061 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S,\n  TILEGX_OPC_PREFETCH_L1_FAULT,\n  BITFIELD(43, 3) /* index 1066 */,\n  CHILD(1075), CHILD(1090), CHILD(1105), CHILD(1120), CHILD(1135),\n  TILEGX_OPC_LDNA, TILEGX_OPC_LDNT1S, TILEGX_OPC_LDNT1U,\n  BITFIELD(31, 2) /* index 1075 */,\n  TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(1080),\n  BITFIELD(33, 2) /* index 1080 */,\n  TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(1085),\n  BITFIELD(35, 2) /* index 1085 */,\n  TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_PREFETCH,\n  BITFIELD(31, 2) /* index 1090 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(1095),\n  BITFIELD(33, 2) /* index 1095 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(1100),\n  BITFIELD(35, 2) /* index 1100 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S,\n  TILEGX_OPC_PREFETCH_L2_FAULT,\n  BITFIELD(31, 2) /* index 1105 */,\n  TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(1110),\n  BITFIELD(33, 2) /* index 1110 */,\n  TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(1115),\n  BITFIELD(35, 2) /* index 1115 */,\n  TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_PREFETCH_L2,\n  BITFIELD(31, 2) /* index 1120 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(1125),\n  BITFIELD(33, 2) /* index 1125 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(1130),\n  BITFIELD(35, 2) /* index 1130 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S,\n  TILEGX_OPC_PREFETCH_L3_FAULT,\n  BITFIELD(31, 2) /* index 1135 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(1140),\n  BITFIELD(33, 2) /* index 1140 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(1145),\n  BITFIELD(35, 2) /* index 1145 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_PREFETCH_L3,\n  BITFIELD(43, 3) /* index 1150 */,\n  TILEGX_OPC_LDNT2S, TILEGX_OPC_LDNT2U, TILEGX_OPC_LDNT4S, TILEGX_OPC_LDNT4U,\n  TILEGX_OPC_LDNT, TILEGX_OPC_LD, TILEGX_OPC_LNK, TILEGX_OPC_MF,\n  BITFIELD(43, 3) /* index 1159 */,\n  TILEGX_OPC_NAP, TILEGX_OPC_NOP, TILEGX_OPC_SWINT0, TILEGX_OPC_SWINT1,\n  TILEGX_OPC_SWINT2, TILEGX_OPC_SWINT3, TILEGX_OPC_WH64, TILEGX_OPC_NONE,\n  BITFIELD(49, 4) /* index 1168 */,\n  TILEGX_OPC_V1MAXU, TILEGX_OPC_V1MINU, TILEGX_OPC_V1MNZ, TILEGX_OPC_V1MZ,\n  TILEGX_OPC_V1SHL, TILEGX_OPC_V1SHRS, TILEGX_OPC_V1SHRU, TILEGX_OPC_V1SUBUC,\n  TILEGX_OPC_V1SUB, TILEGX_OPC_V2ADDSC, TILEGX_OPC_V2ADD, TILEGX_OPC_V2CMPEQ,\n  TILEGX_OPC_V2CMPLES, TILEGX_OPC_V2CMPLEU, TILEGX_OPC_V2CMPLTS,\n  TILEGX_OPC_V2CMPLTU,\n  BITFIELD(49, 4) /* index 1185 */,\n  TILEGX_OPC_V2CMPNE, TILEGX_OPC_V2INT_H, TILEGX_OPC_V2INT_L,\n  TILEGX_OPC_V2MAXS, TILEGX_OPC_V2MINS, TILEGX_OPC_V2MNZ, TILEGX_OPC_V2MZ,\n  TILEGX_OPC_V2PACKH, TILEGX_OPC_V2PACKL, TILEGX_OPC_V2PACKUC,\n  TILEGX_OPC_V2SHLSC, TILEGX_OPC_V2SHL, TILEGX_OPC_V2SHRS, TILEGX_OPC_V2SHRU,\n  TILEGX_OPC_V2SUBSC, TILEGX_OPC_V2SUB,\n  BITFIELD(49, 4) /* index 1202 */,\n  TILEGX_OPC_V4ADDSC, TILEGX_OPC_V4ADD, TILEGX_OPC_V4INT_H,\n  TILEGX_OPC_V4INT_L, TILEGX_OPC_V4PACKSC, TILEGX_OPC_V4SHLSC,\n  TILEGX_OPC_V4SHL, TILEGX_OPC_V4SHRS, TILEGX_OPC_V4SHRU, TILEGX_OPC_V4SUBSC,\n  TILEGX_OPC_V4SUB, TILEGX_OPC_XOR, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(49, 4) /* index 1219 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHLXI,\n  TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI, TILEGX_OPC_SHRUXI, TILEGX_OPC_V1SHLI,\n  TILEGX_OPC_V1SHRSI, TILEGX_OPC_V1SHRUI, TILEGX_OPC_V2SHLI,\n  TILEGX_OPC_V2SHRSI, TILEGX_OPC_V2SHRUI, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE,\n  BITFIELD(31, 2) /* index 1236 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(1241),\n  BITFIELD(33, 2) /* index 1241 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(1246),\n  BITFIELD(35, 2) /* index 1246 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(1251),\n  BITFIELD(37, 2) /* index 1251 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(1256),\n  BITFIELD(39, 2) /* index 1256 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  CHILD(1261),\n  BITFIELD(41, 2) /* index 1261 */,\n  TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI, TILEGX_OPC_SHL16INSLI,\n  TILEGX_OPC_INFOL,\n};\n\nstatic const unsigned short decode_Y0_fsm[178] =\n{\n  BITFIELD(27, 4) /* index 0 */,\n  CHILD(17), TILEGX_OPC_ADDXI, CHILD(32), TILEGX_OPC_CMPEQI,\n  TILEGX_OPC_CMPLTSI, CHILD(62), CHILD(67), CHILD(118), CHILD(123),\n  CHILD(128), CHILD(133), CHILD(153), CHILD(158), CHILD(163), CHILD(168),\n  CHILD(173),\n  BITFIELD(6, 2) /* index 17 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(22),\n  BITFIELD(8, 2) /* index 22 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(27),\n  BITFIELD(10, 2) /* index 27 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI,\n  BITFIELD(0, 2) /* index 32 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(37),\n  BITFIELD(2, 2) /* index 37 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(42),\n  BITFIELD(4, 2) /* index 42 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(47),\n  BITFIELD(6, 2) /* index 47 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(52),\n  BITFIELD(8, 2) /* index 52 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(57),\n  BITFIELD(10, 2) /* index 57 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO,\n  BITFIELD(18, 2) /* index 62 */,\n  TILEGX_OPC_ADDX, TILEGX_OPC_ADD, TILEGX_OPC_SUBX, TILEGX_OPC_SUB,\n  BITFIELD(15, 5) /* index 67 */,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD,\n  TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD,\n  TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, CHILD(100),\n  CHILD(109), TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(12, 3) /* index 100 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_CLZ, TILEGX_OPC_CTZ, TILEGX_OPC_FNOP,\n  TILEGX_OPC_FSINGLE_PACK1, TILEGX_OPC_NOP, TILEGX_OPC_PCNT,\n  TILEGX_OPC_REVBITS,\n  BITFIELD(12, 3) /* index 109 */,\n  TILEGX_OPC_REVBYTES, TILEGX_OPC_TBLIDXB0, TILEGX_OPC_TBLIDXB1,\n  TILEGX_OPC_TBLIDXB2, TILEGX_OPC_TBLIDXB3, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  TILEGX_OPC_NONE,\n  BITFIELD(18, 2) /* index 118 */,\n  TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU,\n  BITFIELD(18, 2) /* index 123 */,\n  TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPNE, TILEGX_OPC_MULAX, TILEGX_OPC_MULX,\n  BITFIELD(18, 2) /* index 128 */,\n  TILEGX_OPC_CMOVEQZ, TILEGX_OPC_CMOVNEZ, TILEGX_OPC_MNZ, TILEGX_OPC_MZ,\n  BITFIELD(18, 2) /* index 133 */,\n  TILEGX_OPC_AND, TILEGX_OPC_NOR, CHILD(138), TILEGX_OPC_XOR,\n  BITFIELD(12, 2) /* index 138 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(143),\n  BITFIELD(14, 2) /* index 143 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(148),\n  BITFIELD(16, 2) /* index 148 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE,\n  BITFIELD(18, 2) /* index 153 */,\n  TILEGX_OPC_ROTL, TILEGX_OPC_SHL, TILEGX_OPC_SHRS, TILEGX_OPC_SHRU,\n  BITFIELD(18, 2) /* index 158 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_SHL1ADDX, TILEGX_OPC_SHL2ADDX,\n  TILEGX_OPC_SHL3ADDX,\n  BITFIELD(18, 2) /* index 163 */,\n  TILEGX_OPC_MUL_HS_HS, TILEGX_OPC_MUL_HU_HU, TILEGX_OPC_MUL_LS_LS,\n  TILEGX_OPC_MUL_LU_LU,\n  BITFIELD(18, 2) /* index 168 */,\n  TILEGX_OPC_MULA_HS_HS, TILEGX_OPC_MULA_HU_HU, TILEGX_OPC_MULA_LS_LS,\n  TILEGX_OPC_MULA_LU_LU,\n  BITFIELD(18, 2) /* index 173 */,\n  TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI,\n};\n\nstatic const unsigned short decode_Y1_fsm[167] =\n{\n  BITFIELD(58, 4) /* index 0 */,\n  TILEGX_OPC_NONE, CHILD(17), TILEGX_OPC_ADDXI, CHILD(32), TILEGX_OPC_CMPEQI,\n  TILEGX_OPC_CMPLTSI, CHILD(62), CHILD(67), CHILD(117), CHILD(122),\n  CHILD(127), CHILD(132), CHILD(152), CHILD(157), CHILD(162), TILEGX_OPC_NONE,\n  BITFIELD(37, 2) /* index 17 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(22),\n  BITFIELD(39, 2) /* index 22 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, CHILD(27),\n  BITFIELD(41, 2) /* index 27 */,\n  TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_ADDI, TILEGX_OPC_MOVEI,\n  BITFIELD(31, 2) /* index 32 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(37),\n  BITFIELD(33, 2) /* index 37 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(42),\n  BITFIELD(35, 2) /* index 42 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(47),\n  BITFIELD(37, 2) /* index 47 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(52),\n  BITFIELD(39, 2) /* index 52 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, CHILD(57),\n  BITFIELD(41, 2) /* index 57 */,\n  TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_ANDI, TILEGX_OPC_INFO,\n  BITFIELD(49, 2) /* index 62 */,\n  TILEGX_OPC_ADDX, TILEGX_OPC_ADD, TILEGX_OPC_SUBX, TILEGX_OPC_SUB,\n  BITFIELD(47, 4) /* index 67 */,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL1ADD,\n  TILEGX_OPC_SHL1ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD,\n  TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL2ADD, TILEGX_OPC_SHL3ADD,\n  TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, TILEGX_OPC_SHL3ADD, CHILD(84),\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_NONE,\n  BITFIELD(43, 3) /* index 84 */,\n  CHILD(93), CHILD(96), CHILD(99), CHILD(102), CHILD(105), CHILD(108),\n  CHILD(111), CHILD(114),\n  BITFIELD(46, 1) /* index 93 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_FNOP,\n  BITFIELD(46, 1) /* index 96 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_ILL,\n  BITFIELD(46, 1) /* index 99 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_JALRP,\n  BITFIELD(46, 1) /* index 102 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_JALR,\n  BITFIELD(46, 1) /* index 105 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_JRP,\n  BITFIELD(46, 1) /* index 108 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_JR,\n  BITFIELD(46, 1) /* index 111 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_LNK,\n  BITFIELD(46, 1) /* index 114 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_NOP,\n  BITFIELD(49, 2) /* index 117 */,\n  TILEGX_OPC_CMPLES, TILEGX_OPC_CMPLEU, TILEGX_OPC_CMPLTS, TILEGX_OPC_CMPLTU,\n  BITFIELD(49, 2) /* index 122 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_CMPEQ, TILEGX_OPC_CMPNE,\n  BITFIELD(49, 2) /* index 127 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_NONE, TILEGX_OPC_MNZ, TILEGX_OPC_MZ,\n  BITFIELD(49, 2) /* index 132 */,\n  TILEGX_OPC_AND, TILEGX_OPC_NOR, CHILD(137), TILEGX_OPC_XOR,\n  BITFIELD(43, 2) /* index 137 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(142),\n  BITFIELD(45, 2) /* index 142 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, CHILD(147),\n  BITFIELD(47, 2) /* index 147 */,\n  TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_OR, TILEGX_OPC_MOVE,\n  BITFIELD(49, 2) /* index 152 */,\n  TILEGX_OPC_ROTL, TILEGX_OPC_SHL, TILEGX_OPC_SHRS, TILEGX_OPC_SHRU,\n  BITFIELD(49, 2) /* index 157 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_SHL1ADDX, TILEGX_OPC_SHL2ADDX,\n  TILEGX_OPC_SHL3ADDX,\n  BITFIELD(49, 2) /* index 162 */,\n  TILEGX_OPC_ROTLI, TILEGX_OPC_SHLI, TILEGX_OPC_SHRSI, TILEGX_OPC_SHRUI,\n};\n\nstatic const unsigned short decode_Y2_fsm[118] =\n{\n  BITFIELD(62, 2) /* index 0 */,\n  TILEGX_OPC_NONE, CHILD(5), CHILD(66), CHILD(109),\n  BITFIELD(55, 3) /* index 5 */,\n  CHILD(14), CHILD(14), CHILD(14), CHILD(17), CHILD(40), CHILD(40), CHILD(40),\n  CHILD(43),\n  BITFIELD(26, 1) /* index 14 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1U,\n  BITFIELD(26, 1) /* index 17 */,\n  CHILD(20), CHILD(30),\n  BITFIELD(51, 2) /* index 20 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, CHILD(25),\n  BITFIELD(53, 2) /* index 25 */,\n  TILEGX_OPC_LD1S, TILEGX_OPC_LD1S, TILEGX_OPC_LD1S,\n  TILEGX_OPC_PREFETCH_L1_FAULT,\n  BITFIELD(51, 2) /* index 30 */,\n  TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, CHILD(35),\n  BITFIELD(53, 2) /* index 35 */,\n  TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_LD1U, TILEGX_OPC_PREFETCH,\n  BITFIELD(26, 1) /* index 40 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2U,\n  BITFIELD(26, 1) /* index 43 */,\n  CHILD(46), CHILD(56),\n  BITFIELD(51, 2) /* index 46 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, CHILD(51),\n  BITFIELD(53, 2) /* index 51 */,\n  TILEGX_OPC_LD2S, TILEGX_OPC_LD2S, TILEGX_OPC_LD2S,\n  TILEGX_OPC_PREFETCH_L2_FAULT,\n  BITFIELD(51, 2) /* index 56 */,\n  TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, CHILD(61),\n  BITFIELD(53, 2) /* index 61 */,\n  TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_LD2U, TILEGX_OPC_PREFETCH_L2,\n  BITFIELD(56, 2) /* index 66 */,\n  CHILD(71), CHILD(74), CHILD(90), CHILD(93),\n  BITFIELD(26, 1) /* index 71 */,\n  TILEGX_OPC_NONE, TILEGX_OPC_LD4S,\n  BITFIELD(26, 1) /* index 74 */,\n  TILEGX_OPC_NONE, CHILD(77),\n  BITFIELD(51, 2) /* index 77 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(82),\n  BITFIELD(53, 2) /* index 82 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, TILEGX_OPC_LD4S, CHILD(87),\n  BITFIELD(55, 1) /* index 87 */,\n  TILEGX_OPC_LD4S, TILEGX_OPC_PREFETCH_L3_FAULT,\n  BITFIELD(26, 1) /* index 90 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD,\n  BITFIELD(26, 1) /* index 93 */,\n  CHILD(96), TILEGX_OPC_LD,\n  BITFIELD(51, 2) /* index 96 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(101),\n  BITFIELD(53, 2) /* index 101 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, TILEGX_OPC_LD4U, CHILD(106),\n  BITFIELD(55, 1) /* index 106 */,\n  TILEGX_OPC_LD4U, TILEGX_OPC_PREFETCH_L3,\n  BITFIELD(26, 1) /* index 109 */,\n  CHILD(112), CHILD(115),\n  BITFIELD(57, 1) /* index 112 */,\n  TILEGX_OPC_ST1, TILEGX_OPC_ST4,\n  BITFIELD(57, 1) /* index 115 */,\n  TILEGX_OPC_ST2, TILEGX_OPC_ST,\n};\n\n#undef BITFIELD\n#undef CHILD\n\nconst unsigned short * const\ntilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS] =\n{\n  decode_X0_fsm,\n  decode_X1_fsm,\n  decode_Y0_fsm,\n  decode_Y1_fsm,\n  decode_Y2_fsm\n};\n\nconst struct tilegx_operand tilegx_operands[35] =\n{\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_X0),\n    8, 1, 0, 0, 0, 0,\n    create_Imm8_X0, get_Imm8_X0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_X1),\n    8, 1, 0, 0, 0, 0,\n    create_Imm8_X1, get_Imm8_X1\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_Y0),\n    8, 1, 0, 0, 0, 0,\n    create_Imm8_Y0, get_Imm8_Y0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM8_Y1),\n    8, 1, 0, 0, 0, 0,\n    create_Imm8_Y1, get_Imm8_Y1\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM16_X0_HW0_LAST),\n    16, 1, 0, 0, 0, 0,\n    create_Imm16_X0, get_Imm16_X0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_IMM16_X1_HW0_LAST),\n    16, 1, 0, 0, 0, 0,\n    create_Imm16_X1, get_Imm16_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 0, 1, 0, 0,\n    create_Dest_X1, get_Dest_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcA_X1, get_SrcA_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 0, 1, 0, 0,\n    create_Dest_X0, get_Dest_X0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcA_X0, get_SrcA_X0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 0, 1, 0, 0,\n    create_Dest_Y0, get_Dest_Y0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcA_Y0, get_SrcA_Y0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 0, 1, 0, 0,\n    create_Dest_Y1, get_Dest_Y1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcA_Y1, get_SrcA_Y1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcA_Y2, get_SrcA_Y2\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 1, 0, 0,\n    create_SrcA_X1, get_SrcA_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcB_X0, get_SrcB_X0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcB_X1, get_SrcB_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcB_Y0, get_SrcB_Y0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcB_Y1, get_SrcB_Y1\n  },\n  {\n    TILEGX_OP_TYPE_ADDRESS, BFD_RELOC(TILEGX_BROFF_X1),\n    17, 1, 0, 0, 1, TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES,\n    create_BrOff_X1, get_BrOff_X1\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_MMSTART_X0),\n    6, 0, 0, 0, 0, 0,\n    create_BFStart_X0, get_BFStart_X0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_MMEND_X0),\n    6, 0, 0, 0, 0, 0,\n    create_BFEnd_X0, get_BFEnd_X0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 1, 0, 0,\n    create_Dest_X0, get_Dest_X0\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 1, 0, 0,\n    create_Dest_Y0, get_Dest_Y0\n  },\n  {\n    TILEGX_OP_TYPE_ADDRESS, BFD_RELOC(TILEGX_JUMPOFF_X1),\n    27, 1, 0, 0, 1, TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES,\n    create_JumpOff_X1, get_JumpOff_X1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 0, 1, 0, 0,\n    create_SrcBDest_Y2, get_SrcBDest_Y2\n  },\n  {\n    TILEGX_OP_TYPE_SPR, BFD_RELOC(TILEGX_MF_IMM14_X1),\n    14, 0, 0, 0, 0, 0,\n    create_MF_Imm14_X1, get_MF_Imm14_X1\n  },\n  {\n    TILEGX_OP_TYPE_SPR, BFD_RELOC(TILEGX_MT_IMM14_X1),\n    14, 0, 0, 0, 0, 0,\n    create_MT_Imm14_X1, get_MT_Imm14_X1\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_X0),\n    6, 0, 0, 0, 0, 0,\n    create_ShAmt_X0, get_ShAmt_X0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_X1),\n    6, 0, 0, 0, 0, 0,\n    create_ShAmt_X1, get_ShAmt_X1\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_Y0),\n    6, 0, 0, 0, 0, 0,\n    create_ShAmt_Y0, get_ShAmt_Y0\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_SHAMT_Y1),\n    6, 0, 0, 0, 0, 0,\n    create_ShAmt_Y1, get_ShAmt_Y1\n  },\n  {\n    TILEGX_OP_TYPE_REGISTER, BFD_RELOC(NONE),\n    6, 0, 1, 0, 0, 0,\n    create_SrcBDest_Y2, get_SrcBDest_Y2\n  },\n  {\n    TILEGX_OP_TYPE_IMMEDIATE, BFD_RELOC(TILEGX_DEST_IMM8_X1),\n    8, 1, 0, 0, 0, 0,\n    create_Dest_Imm8_X1, get_Dest_Imm8_X1\n  }\n};\n\n/* Given a set of bundle bits and a specific pipe, returns which\n * instruction the bundle contains in that pipe.\n */\nconst struct tilegx_opcode *\nfind_opcode(tilegx_bundle_bits bits, tilegx_pipeline pipe)\n{\n  const unsigned short *table = tilegx_bundle_decoder_fsms[pipe];\n  int index = 0;\n\n  while (1)\n  {\n    unsigned short bitspec = table[index];\n    unsigned int bitfield =\n      ((unsigned int)(bits >> (bitspec & 63))) & (bitspec >> 6);\n\n    unsigned short next = table[index + 1 + bitfield];\n    if (next <= TILEGX_OPC_NONE)\n      return &tilegx_opcodes[next];\n\n    index = next - TILEGX_OPC_NONE;\n  }\n}\n\nint\nparse_insn_tilegx(tilegx_bundle_bits bits,\n                  unsigned long long pc,\n                  struct tilegx_decoded_instruction\n                  decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE])\n{\n  int num_instructions = 0;\n  int pipe;\n\n  int min_pipe, max_pipe;\n  if ((bits & TILEGX_BUNDLE_MODE_MASK) == 0)\n  {\n    min_pipe = TILEGX_PIPELINE_X0;\n    max_pipe = TILEGX_PIPELINE_X1;\n  }\n  else\n  {\n    min_pipe = TILEGX_PIPELINE_Y0;\n    max_pipe = TILEGX_PIPELINE_Y2;\n  }\n\n  /* For each pipe, find an instruction that fits. */\n  for (pipe = min_pipe; pipe <= max_pipe; pipe++)\n  {\n    const struct tilegx_opcode *opc;\n    struct tilegx_decoded_instruction *d;\n    int i;\n\n    d = &decoded[num_instructions++];\n    opc = find_opcode (bits, (tilegx_pipeline)pipe);\n    d->opcode = opc;\n\n    /* Decode each operand, sign extending, etc. as appropriate. */\n    for (i = 0; i < opc->num_operands; i++)\n    {\n      const struct tilegx_operand *op =\n        &tilegx_operands[opc->operands[pipe][i]];\n      int raw_opval = op->extract (bits);\n      long long opval;\n\n      if (op->is_signed)\n      {\n        /* Sign-extend the operand. */\n        int shift = (int)((sizeof(int) * 8) - op->num_bits);\n        raw_opval = (raw_opval << shift) >> shift;\n      }\n\n      /* Adjust PC-relative scaled branch offsets. */\n      if (op->type == TILEGX_OP_TYPE_ADDRESS)\n        opval = (raw_opval * TILEGX_BUNDLE_SIZE_IN_BYTES) + pc;\n      else\n        opval = raw_opval;\n\n      /* Record the final value. */\n      d->operands[i] = op;\n      d->operand_values[i] = opval;\n    }\n  }\n\n  return num_instructions;\n}\n\nstruct tilegx_spr\n{\n  /* The number */\n  int number;\n\n  /* The name */\n  const char *name;\n};\n\nstatic int\ntilegx_spr_compare (const void *a_ptr, const void *b_ptr)\n{\n  const struct tilegx_spr *a = (const struct tilegx_spr *) a_ptr;\n  const struct tilegx_spr *b = (const struct tilegx_spr *) b_ptr;\n  return (a->number - b->number);\n}\n\nconst struct tilegx_spr tilegx_sprs[] = {\n  { 0, \"MPL_MEM_ERROR_SET_0\" },\n  { 1, \"MPL_MEM_ERROR_SET_1\" },\n  { 2, \"MPL_MEM_ERROR_SET_2\" },\n  { 3, \"MPL_MEM_ERROR_SET_3\" },\n  { 4, \"MPL_MEM_ERROR\" },\n  { 5, \"MEM_ERROR_CBOX_ADDR\" },\n  { 6, \"MEM_ERROR_CBOX_STATUS\" },\n  { 7, \"MEM_ERROR_ENABLE\" },\n  { 8, \"MEM_ERROR_MBOX_ADDR\" },\n  { 9, \"MEM_ERROR_MBOX_STATUS\" },\n  { 10, \"SBOX_ERROR\" },\n  { 11, \"XDN_DEMUX_ERROR\" },\n  { 256, \"MPL_SINGLE_STEP_3_SET_0\" },\n  { 257, \"MPL_SINGLE_STEP_3_SET_1\" },\n  { 258, \"MPL_SINGLE_STEP_3_SET_2\" },\n  { 259, \"MPL_SINGLE_STEP_3_SET_3\" },\n  { 260, \"MPL_SINGLE_STEP_3\" },\n  { 261, \"SINGLE_STEP_CONTROL_3\" },\n  { 512, \"MPL_SINGLE_STEP_2_SET_0\" },\n  { 513, \"MPL_SINGLE_STEP_2_SET_1\" },\n  { 514, \"MPL_SINGLE_STEP_2_SET_2\" },\n  { 515, \"MPL_SINGLE_STEP_2_SET_3\" },\n  { 516, \"MPL_SINGLE_STEP_2\" },\n  { 517, \"SINGLE_STEP_CONTROL_2\" },\n  { 768, \"MPL_SINGLE_STEP_1_SET_0\" },\n  { 769, \"MPL_SINGLE_STEP_1_SET_1\" },\n  { 770, \"MPL_SINGLE_STEP_1_SET_2\" },\n  { 771, \"MPL_SINGLE_STEP_1_SET_3\" },\n  { 772, \"MPL_SINGLE_STEP_1\" },\n  { 773, \"SINGLE_STEP_CONTROL_1\" },\n  { 1024, \"MPL_SINGLE_STEP_0_SET_0\" },\n  { 1025, \"MPL_SINGLE_STEP_0_SET_1\" },\n  { 1026, \"MPL_SINGLE_STEP_0_SET_2\" },\n  { 1027, \"MPL_SINGLE_STEP_0_SET_3\" },\n  { 1028, \"MPL_SINGLE_STEP_0\" },\n  { 1029, \"SINGLE_STEP_CONTROL_0\" },\n  { 1280, \"MPL_IDN_COMPLETE_SET_0\" },\n  { 1281, \"MPL_IDN_COMPLETE_SET_1\" },\n  { 1282, \"MPL_IDN_COMPLETE_SET_2\" },\n  { 1283, \"MPL_IDN_COMPLETE_SET_3\" },\n  { 1284, \"MPL_IDN_COMPLETE\" },\n  { 1285, \"IDN_COMPLETE_PENDING\" },\n  { 1536, \"MPL_UDN_COMPLETE_SET_0\" },\n  { 1537, \"MPL_UDN_COMPLETE_SET_1\" },\n  { 1538, \"MPL_UDN_COMPLETE_SET_2\" },\n  { 1539, \"MPL_UDN_COMPLETE_SET_3\" },\n  { 1540, \"MPL_UDN_COMPLETE\" },\n  { 1541, \"UDN_COMPLETE_PENDING\" },\n  { 1792, \"MPL_ITLB_MISS_SET_0\" },\n  { 1793, \"MPL_ITLB_MISS_SET_1\" },\n  { 1794, \"MPL_ITLB_MISS_SET_2\" },\n  { 1795, \"MPL_ITLB_MISS_SET_3\" },\n  { 1796, \"MPL_ITLB_MISS\" },\n  { 1797, \"ITLB_TSB_BASE_ADDR_0\" },\n  { 1798, \"ITLB_TSB_BASE_ADDR_1\" },\n  { 1920, \"ITLB_CURRENT_ATTR\" },\n  { 1921, \"ITLB_CURRENT_PA\" },\n  { 1922, \"ITLB_CURRENT_VA\" },\n  { 1923, \"ITLB_INDEX\" },\n  { 1924, \"ITLB_MATCH_0\" },\n  { 1925, \"ITLB_PERF\" },\n  { 1926, \"ITLB_PR\" },\n  { 1927, \"ITLB_TSB_ADDR_0\" },\n  { 1928, \"ITLB_TSB_ADDR_1\" },\n  { 1929, \"ITLB_TSB_FILL_CURRENT_ATTR\" },\n  { 1930, \"ITLB_TSB_FILL_MATCH\" },\n  { 1931, \"NUMBER_ITLB\" },\n  { 1932, \"REPLACEMENT_ITLB\" },\n  { 1933, \"WIRED_ITLB\" },\n  { 2048, \"MPL_ILL_SET_0\" },\n  { 2049, \"MPL_ILL_SET_1\" },\n  { 2050, \"MPL_ILL_SET_2\" },\n  { 2051, \"MPL_ILL_SET_3\" },\n  { 2052, \"MPL_ILL\" },\n  { 2304, \"MPL_GPV_SET_0\" },\n  { 2305, \"MPL_GPV_SET_1\" },\n  { 2306, \"MPL_GPV_SET_2\" },\n  { 2307, \"MPL_GPV_SET_3\" },\n  { 2308, \"MPL_GPV\" },\n  { 2309, \"GPV_REASON\" },\n  { 2560, \"MPL_IDN_ACCESS_SET_0\" },\n  { 2561, \"MPL_IDN_ACCESS_SET_1\" },\n  { 2562, \"MPL_IDN_ACCESS_SET_2\" },\n  { 2563, \"MPL_IDN_ACCESS_SET_3\" },\n  { 2564, \"MPL_IDN_ACCESS\" },\n  { 2565, \"IDN_DEMUX_COUNT_0\" },\n  { 2566, \"IDN_DEMUX_COUNT_1\" },\n  { 2567, \"IDN_FLUSH_EGRESS\" },\n  { 2568, \"IDN_PENDING\" },\n  { 2569, \"IDN_ROUTE_ORDER\" },\n  { 2570, \"IDN_SP_FIFO_CNT\" },\n  { 2688, \"IDN_DATA_AVAIL\" },\n  { 2816, \"MPL_UDN_ACCESS_SET_0\" },\n  { 2817, \"MPL_UDN_ACCESS_SET_1\" },\n  { 2818, \"MPL_UDN_ACCESS_SET_2\" },\n  { 2819, \"MPL_UDN_ACCESS_SET_3\" },\n  { 2820, \"MPL_UDN_ACCESS\" },\n  { 2821, \"UDN_DEMUX_COUNT_0\" },\n  { 2822, \"UDN_DEMUX_COUNT_1\" },\n  { 2823, \"UDN_DEMUX_COUNT_2\" },\n  { 2824, \"UDN_DEMUX_COUNT_3\" },\n  { 2825, \"UDN_FLUSH_EGRESS\" },\n  { 2826, \"UDN_PENDING\" },\n  { 2827, \"UDN_ROUTE_ORDER\" },\n  { 2828, \"UDN_SP_FIFO_CNT\" },\n  { 2944, \"UDN_DATA_AVAIL\" },\n  { 3072, \"MPL_SWINT_3_SET_0\" },\n  { 3073, \"MPL_SWINT_3_SET_1\" },\n  { 3074, \"MPL_SWINT_3_SET_2\" },\n  { 3075, \"MPL_SWINT_3_SET_3\" },\n  { 3076, \"MPL_SWINT_3\" },\n  { 3328, \"MPL_SWINT_2_SET_0\" },\n  { 3329, \"MPL_SWINT_2_SET_1\" },\n  { 3330, \"MPL_SWINT_2_SET_2\" },\n  { 3331, \"MPL_SWINT_2_SET_3\" },\n  { 3332, \"MPL_SWINT_2\" },\n  { 3584, \"MPL_SWINT_1_SET_0\" },\n  { 3585, \"MPL_SWINT_1_SET_1\" },\n  { 3586, \"MPL_SWINT_1_SET_2\" },\n  { 3587, \"MPL_SWINT_1_SET_3\" },\n  { 3588, \"MPL_SWINT_1\" },\n  { 3840, \"MPL_SWINT_0_SET_0\" },\n  { 3841, \"MPL_SWINT_0_SET_1\" },\n  { 3842, \"MPL_SWINT_0_SET_2\" },\n  { 3843, \"MPL_SWINT_0_SET_3\" },\n  { 3844, \"MPL_SWINT_0\" },\n  { 4096, \"MPL_ILL_TRANS_SET_0\" },\n  { 4097, \"MPL_ILL_TRANS_SET_1\" },\n  { 4098, \"MPL_ILL_TRANS_SET_2\" },\n  { 4099, \"MPL_ILL_TRANS_SET_3\" },\n  { 4100, \"MPL_ILL_TRANS\" },\n  { 4101, \"ILL_TRANS_REASON\" },\n  { 4102, \"ILL_VA_PC\" },\n  { 4352, \"MPL_UNALIGN_DATA_SET_0\" },\n  { 4353, \"MPL_UNALIGN_DATA_SET_1\" },\n  { 4354, \"MPL_UNALIGN_DATA_SET_2\" },\n  { 4355, \"MPL_UNALIGN_DATA_SET_3\" },\n  { 4356, \"MPL_UNALIGN_DATA\" },\n  { 4608, \"MPL_DTLB_MISS_SET_0\" },\n  { 4609, \"MPL_DTLB_MISS_SET_1\" },\n  { 4610, \"MPL_DTLB_MISS_SET_2\" },\n  { 4611, \"MPL_DTLB_MISS_SET_3\" },\n  { 4612, \"MPL_DTLB_MISS\" },\n  { 4613, \"DTLB_TSB_BASE_ADDR_0\" },\n  { 4614, \"DTLB_TSB_BASE_ADDR_1\" },\n  { 4736, \"AAR\" },\n  { 4737, \"CACHE_PINNED_WAYS\" },\n  { 4738, \"DTLB_BAD_ADDR\" },\n  { 4739, \"DTLB_BAD_ADDR_REASON\" },\n  { 4740, \"DTLB_CURRENT_ATTR\" },\n  { 4741, \"DTLB_CURRENT_PA\" },\n  { 4742, \"DTLB_CURRENT_VA\" },\n  { 4743, \"DTLB_INDEX\" },\n  { 4744, \"DTLB_MATCH_0\" },\n  { 4745, \"DTLB_PERF\" },\n  { 4746, \"DTLB_TSB_ADDR_0\" },\n  { 4747, \"DTLB_TSB_ADDR_1\" },\n  { 4748, \"DTLB_TSB_FILL_CURRENT_ATTR\" },\n  { 4749, \"DTLB_TSB_FILL_MATCH\" },\n  { 4750, \"NUMBER_DTLB\" },\n  { 4751, \"REPLACEMENT_DTLB\" },\n  { 4752, \"WIRED_DTLB\" },\n  { 4864, \"MPL_DTLB_ACCESS_SET_0\" },\n  { 4865, \"MPL_DTLB_ACCESS_SET_1\" },\n  { 4866, \"MPL_DTLB_ACCESS_SET_2\" },\n  { 4867, \"MPL_DTLB_ACCESS_SET_3\" },\n  { 4868, \"MPL_DTLB_ACCESS\" },\n  { 5120, \"MPL_IDN_FIREWALL_SET_0\" },\n  { 5121, \"MPL_IDN_FIREWALL_SET_1\" },\n  { 5122, \"MPL_IDN_FIREWALL_SET_2\" },\n  { 5123, \"MPL_IDN_FIREWALL_SET_3\" },\n  { 5124, \"MPL_IDN_FIREWALL\" },\n  { 5125, \"IDN_DIRECTION_PROTECT\" },\n  { 5376, \"MPL_UDN_FIREWALL_SET_0\" },\n  { 5377, \"MPL_UDN_FIREWALL_SET_1\" },\n  { 5378, \"MPL_UDN_FIREWALL_SET_2\" },\n  { 5379, \"MPL_UDN_FIREWALL_SET_3\" },\n  { 5380, \"MPL_UDN_FIREWALL\" },\n  { 5381, \"UDN_DIRECTION_PROTECT\" },\n  { 5632, \"MPL_TILE_TIMER_SET_0\" },\n  { 5633, \"MPL_TILE_TIMER_SET_1\" },\n  { 5634, \"MPL_TILE_TIMER_SET_2\" },\n  { 5635, \"MPL_TILE_TIMER_SET_3\" },\n  { 5636, \"MPL_TILE_TIMER\" },\n  { 5637, \"TILE_TIMER_CONTROL\" },\n  { 5888, \"MPL_AUX_TILE_TIMER_SET_0\" },\n  { 5889, \"MPL_AUX_TILE_TIMER_SET_1\" },\n  { 5890, \"MPL_AUX_TILE_TIMER_SET_2\" },\n  { 5891, \"MPL_AUX_TILE_TIMER_SET_3\" },\n  { 5892, \"MPL_AUX_TILE_TIMER\" },\n  { 5893, \"AUX_TILE_TIMER_CONTROL\" },\n  { 6144, \"MPL_IDN_TIMER_SET_0\" },\n  { 6145, \"MPL_IDN_TIMER_SET_1\" },\n  { 6146, \"MPL_IDN_TIMER_SET_2\" },\n  { 6147, \"MPL_IDN_TIMER_SET_3\" },\n  { 6148, \"MPL_IDN_TIMER\" },\n  { 6149, \"IDN_DEADLOCK_COUNT\" },\n  { 6150, \"IDN_DEADLOCK_TIMEOUT\" },\n  { 6400, \"MPL_UDN_TIMER_SET_0\" },\n  { 6401, \"MPL_UDN_TIMER_SET_1\" },\n  { 6402, \"MPL_UDN_TIMER_SET_2\" },\n  { 6403, \"MPL_UDN_TIMER_SET_3\" },\n  { 6404, \"MPL_UDN_TIMER\" },\n  { 6405, \"UDN_DEADLOCK_COUNT\" },\n  { 6406, \"UDN_DEADLOCK_TIMEOUT\" },\n  { 6656, \"MPL_IDN_AVAIL_SET_0\" },\n  { 6657, \"MPL_IDN_AVAIL_SET_1\" },\n  { 6658, \"MPL_IDN_AVAIL_SET_2\" },\n  { 6659, \"MPL_IDN_AVAIL_SET_3\" },\n  { 6660, \"MPL_IDN_AVAIL\" },\n  { 6661, \"IDN_AVAIL_EN\" },\n  { 6912, \"MPL_UDN_AVAIL_SET_0\" },\n  { 6913, \"MPL_UDN_AVAIL_SET_1\" },\n  { 6914, \"MPL_UDN_AVAIL_SET_2\" },\n  { 6915, \"MPL_UDN_AVAIL_SET_3\" },\n  { 6916, \"MPL_UDN_AVAIL\" },\n  { 6917, \"UDN_AVAIL_EN\" },\n  { 7168, \"MPL_IPI_3_SET_0\" },\n  { 7169, \"MPL_IPI_3_SET_1\" },\n  { 7170, \"MPL_IPI_3_SET_2\" },\n  { 7171, \"MPL_IPI_3_SET_3\" },\n  { 7172, \"MPL_IPI_3\" },\n  { 7173, \"IPI_EVENT_3\" },\n  { 7174, \"IPI_EVENT_RESET_3\" },\n  { 7175, \"IPI_EVENT_SET_3\" },\n  { 7176, \"IPI_MASK_3\" },\n  { 7177, \"IPI_MASK_RESET_3\" },\n  { 7178, \"IPI_MASK_SET_3\" },\n  { 7424, \"MPL_IPI_2_SET_0\" },\n  { 7425, \"MPL_IPI_2_SET_1\" },\n  { 7426, \"MPL_IPI_2_SET_2\" },\n  { 7427, \"MPL_IPI_2_SET_3\" },\n  { 7428, \"MPL_IPI_2\" },\n  { 7429, \"IPI_EVENT_2\" },\n  { 7430, \"IPI_EVENT_RESET_2\" },\n  { 7431, \"IPI_EVENT_SET_2\" },\n  { 7432, \"IPI_MASK_2\" },\n  { 7433, \"IPI_MASK_RESET_2\" },\n  { 7434, \"IPI_MASK_SET_2\" },\n  { 7680, \"MPL_IPI_1_SET_0\" },\n  { 7681, \"MPL_IPI_1_SET_1\" },\n  { 7682, \"MPL_IPI_1_SET_2\" },\n  { 7683, \"MPL_IPI_1_SET_3\" },\n  { 7684, \"MPL_IPI_1\" },\n  { 7685, \"IPI_EVENT_1\" },\n  { 7686, \"IPI_EVENT_RESET_1\" },\n  { 7687, \"IPI_EVENT_SET_1\" },\n  { 7688, \"IPI_MASK_1\" },\n  { 7689, \"IPI_MASK_RESET_1\" },\n  { 7690, \"IPI_MASK_SET_1\" },\n  { 7936, \"MPL_IPI_0_SET_0\" },\n  { 7937, \"MPL_IPI_0_SET_1\" },\n  { 7938, \"MPL_IPI_0_SET_2\" },\n  { 7939, \"MPL_IPI_0_SET_3\" },\n  { 7940, \"MPL_IPI_0\" },\n  { 7941, \"IPI_EVENT_0\" },\n  { 7942, \"IPI_EVENT_RESET_0\" },\n  { 7943, \"IPI_EVENT_SET_0\" },\n  { 7944, \"IPI_MASK_0\" },\n  { 7945, \"IPI_MASK_RESET_0\" },\n  { 7946, \"IPI_MASK_SET_0\" },\n  { 8192, \"MPL_PERF_COUNT_SET_0\" },\n  { 8193, \"MPL_PERF_COUNT_SET_1\" },\n  { 8194, \"MPL_PERF_COUNT_SET_2\" },\n  { 8195, \"MPL_PERF_COUNT_SET_3\" },\n  { 8196, \"MPL_PERF_COUNT\" },\n  { 8197, \"PERF_COUNT_0\" },\n  { 8198, \"PERF_COUNT_1\" },\n  { 8199, \"PERF_COUNT_CTL\" },\n  { 8200, \"PERF_COUNT_DN_CTL\" },\n  { 8201, \"PERF_COUNT_STS\" },\n  { 8202, \"WATCH_MASK\" },\n  { 8203, \"WATCH_VAL\" },\n  { 8448, \"MPL_AUX_PERF_COUNT_SET_0\" },\n  { 8449, \"MPL_AUX_PERF_COUNT_SET_1\" },\n  { 8450, \"MPL_AUX_PERF_COUNT_SET_2\" },\n  { 8451, \"MPL_AUX_PERF_COUNT_SET_3\" },\n  { 8452, \"MPL_AUX_PERF_COUNT\" },\n  { 8453, \"AUX_PERF_COUNT_0\" },\n  { 8454, \"AUX_PERF_COUNT_1\" },\n  { 8455, \"AUX_PERF_COUNT_CTL\" },\n  { 8456, \"AUX_PERF_COUNT_STS\" },\n  { 8704, \"MPL_INTCTRL_3_SET_0\" },\n  { 8705, \"MPL_INTCTRL_3_SET_1\" },\n  { 8706, \"MPL_INTCTRL_3_SET_2\" },\n  { 8707, \"MPL_INTCTRL_3_SET_3\" },\n  { 8708, \"MPL_INTCTRL_3\" },\n  { 8709, \"INTCTRL_3_STATUS\" },\n  { 8710, \"INTERRUPT_MASK_3\" },\n  { 8711, \"INTERRUPT_MASK_RESET_3\" },\n  { 8712, \"INTERRUPT_MASK_SET_3\" },\n  { 8713, \"INTERRUPT_VECTOR_BASE_3\" },\n  { 8714, \"SINGLE_STEP_EN_0_3\" },\n  { 8715, \"SINGLE_STEP_EN_1_3\" },\n  { 8716, \"SINGLE_STEP_EN_2_3\" },\n  { 8717, \"SINGLE_STEP_EN_3_3\" },\n  { 8832, \"EX_CONTEXT_3_0\" },\n  { 8833, \"EX_CONTEXT_3_1\" },\n  { 8834, \"SYSTEM_SAVE_3_0\" },\n  { 8835, \"SYSTEM_SAVE_3_1\" },\n  { 8836, \"SYSTEM_SAVE_3_2\" },\n  { 8837, \"SYSTEM_SAVE_3_3\" },\n  { 8960, \"MPL_INTCTRL_2_SET_0\" },\n  { 8961, \"MPL_INTCTRL_2_SET_1\" },\n  { 8962, \"MPL_INTCTRL_2_SET_2\" },\n  { 8963, \"MPL_INTCTRL_2_SET_3\" },\n  { 8964, \"MPL_INTCTRL_2\" },\n  { 8965, \"INTCTRL_2_STATUS\" },\n  { 8966, \"INTERRUPT_MASK_2\" },\n  { 8967, \"INTERRUPT_MASK_RESET_2\" },\n  { 8968, \"INTERRUPT_MASK_SET_2\" },\n  { 8969, \"INTERRUPT_VECTOR_BASE_2\" },\n  { 8970, \"SINGLE_STEP_EN_0_2\" },\n  { 8971, \"SINGLE_STEP_EN_1_2\" },\n  { 8972, \"SINGLE_STEP_EN_2_2\" },\n  { 8973, \"SINGLE_STEP_EN_3_2\" },\n  { 9088, \"EX_CONTEXT_2_0\" },\n  { 9089, \"EX_CONTEXT_2_1\" },\n  { 9090, \"SYSTEM_SAVE_2_0\" },\n  { 9091, \"SYSTEM_SAVE_2_1\" },\n  { 9092, \"SYSTEM_SAVE_2_2\" },\n  { 9093, \"SYSTEM_SAVE_2_3\" },\n  { 9216, \"MPL_INTCTRL_1_SET_0\" },\n  { 9217, \"MPL_INTCTRL_1_SET_1\" },\n  { 9218, \"MPL_INTCTRL_1_SET_2\" },\n  { 9219, \"MPL_INTCTRL_1_SET_3\" },\n  { 9220, \"MPL_INTCTRL_1\" },\n  { 9221, \"INTCTRL_1_STATUS\" },\n  { 9222, \"INTERRUPT_MASK_1\" },\n  { 9223, \"INTERRUPT_MASK_RESET_1\" },\n  { 9224, \"INTERRUPT_MASK_SET_1\" },\n  { 9225, \"INTERRUPT_VECTOR_BASE_1\" },\n  { 9226, \"SINGLE_STEP_EN_0_1\" },\n  { 9227, \"SINGLE_STEP_EN_1_1\" },\n  { 9228, \"SINGLE_STEP_EN_2_1\" },\n  { 9229, \"SINGLE_STEP_EN_3_1\" },\n  { 9344, \"EX_CONTEXT_1_0\" },\n  { 9345, \"EX_CONTEXT_1_1\" },\n  { 9346, \"SYSTEM_SAVE_1_0\" },\n  { 9347, \"SYSTEM_SAVE_1_1\" },\n  { 9348, \"SYSTEM_SAVE_1_2\" },\n  { 9349, \"SYSTEM_SAVE_1_3\" },\n  { 9472, \"MPL_INTCTRL_0_SET_0\" },\n  { 9473, \"MPL_INTCTRL_0_SET_1\" },\n  { 9474, \"MPL_INTCTRL_0_SET_2\" },\n  { 9475, \"MPL_INTCTRL_0_SET_3\" },\n  { 9476, \"MPL_INTCTRL_0\" },\n  { 9477, \"INTCTRL_0_STATUS\" },\n  { 9478, \"INTERRUPT_MASK_0\" },\n  { 9479, \"INTERRUPT_MASK_RESET_0\" },\n  { 9480, \"INTERRUPT_MASK_SET_0\" },\n  { 9481, \"INTERRUPT_VECTOR_BASE_0\" },\n  { 9482, \"SINGLE_STEP_EN_0_0\" },\n  { 9483, \"SINGLE_STEP_EN_1_0\" },\n  { 9484, \"SINGLE_STEP_EN_2_0\" },\n  { 9485, \"SINGLE_STEP_EN_3_0\" },\n  { 9600, \"EX_CONTEXT_0_0\" },\n  { 9601, \"EX_CONTEXT_0_1\" },\n  { 9602, \"SYSTEM_SAVE_0_0\" },\n  { 9603, \"SYSTEM_SAVE_0_1\" },\n  { 9604, \"SYSTEM_SAVE_0_2\" },\n  { 9605, \"SYSTEM_SAVE_0_3\" },\n  { 9728, \"MPL_BOOT_ACCESS_SET_0\" },\n  { 9729, \"MPL_BOOT_ACCESS_SET_1\" },\n  { 9730, \"MPL_BOOT_ACCESS_SET_2\" },\n  { 9731, \"MPL_BOOT_ACCESS_SET_3\" },\n  { 9732, \"MPL_BOOT_ACCESS\" },\n  { 9733, \"BIG_ENDIAN_CONFIG\" },\n  { 9734, \"CACHE_INVALIDATION_COMPRESSION_MODE\" },\n  { 9735, \"CACHE_INVALIDATION_MASK_0\" },\n  { 9736, \"CACHE_INVALIDATION_MASK_1\" },\n  { 9737, \"CACHE_INVALIDATION_MASK_2\" },\n  { 9738, \"CBOX_CACHEASRAM_CONFIG\" },\n  { 9739, \"CBOX_CACHE_CONFIG\" },\n  { 9740, \"CBOX_HOME_MAP_ADDR\" },\n  { 9741, \"CBOX_HOME_MAP_DATA\" },\n  { 9742, \"CBOX_MMAP_0\" },\n  { 9743, \"CBOX_MMAP_1\" },\n  { 9744, \"CBOX_MMAP_2\" },\n  { 9745, \"CBOX_MMAP_3\" },\n  { 9746, \"CBOX_MSR\" },\n  { 9747, \"DIAG_BCST_CTL\" },\n  { 9748, \"DIAG_BCST_MASK\" },\n  { 9749, \"DIAG_BCST_TRIGGER\" },\n  { 9750, \"DIAG_MUX_CTL\" },\n  { 9751, \"DIAG_TRACE_CTL\" },\n  { 9752, \"DIAG_TRACE_DATA\" },\n  { 9753, \"DIAG_TRACE_STS\" },\n  { 9754, \"IDN_DEMUX_BUF_THRESH\" },\n  { 9755, \"L1_I_PIN_WAY_0\" },\n  { 9756, \"MEM_ROUTE_ORDER\" },\n  { 9757, \"MEM_STRIPE_CONFIG\" },\n  { 9758, \"PERF_COUNT_PLS\" },\n  { 9759, \"PSEUDO_RANDOM_NUMBER_MODIFY\" },\n  { 9760, \"QUIESCE_CTL\" },\n  { 9761, \"RSHIM_COORD\" },\n  { 9762, \"SBOX_CONFIG\" },\n  { 9763, \"UDN_DEMUX_BUF_THRESH\" },\n  { 9764, \"XDN_CORE_STARVATION_COUNT\" },\n  { 9765, \"XDN_ROUND_ROBIN_ARB_CTL\" },\n  { 9856, \"CYCLE_MODIFY\" },\n  { 9857, \"I_AAR\" },\n  { 9984, \"MPL_WORLD_ACCESS_SET_0\" },\n  { 9985, \"MPL_WORLD_ACCESS_SET_1\" },\n  { 9986, \"MPL_WORLD_ACCESS_SET_2\" },\n  { 9987, \"MPL_WORLD_ACCESS_SET_3\" },\n  { 9988, \"MPL_WORLD_ACCESS\" },\n  { 9989, \"DONE\" },\n  { 9990, \"DSTREAM_PF\" },\n  { 9991, \"FAIL\" },\n  { 9992, \"INTERRUPT_CRITICAL_SECTION\" },\n  { 9993, \"PASS\" },\n  { 9994, \"PSEUDO_RANDOM_NUMBER\" },\n  { 9995, \"TILE_COORD\" },\n  { 9996, \"TILE_RTF_HWM\" },\n  { 10112, \"CMPEXCH_VALUE\" },\n  { 10113, \"CYCLE\" },\n  { 10114, \"EVENT_BEGIN\" },\n  { 10115, \"EVENT_END\" },\n  { 10116, \"PROC_STATUS\" },\n  { 10117, \"SIM_CONTROL\" },\n  { 10118, \"SIM_SOCKET\" },\n  { 10119, \"STATUS_SATURATE\" },\n  { 10240, \"MPL_I_ASID_SET_0\" },\n  { 10241, \"MPL_I_ASID_SET_1\" },\n  { 10242, \"MPL_I_ASID_SET_2\" },\n  { 10243, \"MPL_I_ASID_SET_3\" },\n  { 10244, \"MPL_I_ASID\" },\n  { 10245, \"I_ASID\" },\n  { 10496, \"MPL_D_ASID_SET_0\" },\n  { 10497, \"MPL_D_ASID_SET_1\" },\n  { 10498, \"MPL_D_ASID_SET_2\" },\n  { 10499, \"MPL_D_ASID_SET_3\" },\n  { 10500, \"MPL_D_ASID\" },\n  { 10501, \"D_ASID\" },\n  { 10752, \"MPL_DOUBLE_FAULT_SET_0\" },\n  { 10753, \"MPL_DOUBLE_FAULT_SET_1\" },\n  { 10754, \"MPL_DOUBLE_FAULT_SET_2\" },\n  { 10755, \"MPL_DOUBLE_FAULT_SET_3\" },\n  { 10756, \"MPL_DOUBLE_FAULT\" },\n  { 10757, \"LAST_INTERRUPT_REASON\" },\n};\n\nconst int tilegx_num_sprs = 441;\n\nconst char *\nget_tilegx_spr_name (int num)\n{\n  void *result;\n  struct tilegx_spr key;\n\n  key.number = num;\n  result = bsearch((const void *) &key, (const void *) tilegx_sprs,\n                   tilegx_num_sprs, sizeof (struct tilegx_spr),\n                   tilegx_spr_compare);\n\n  if (result == NULL)\n  {\n    return (NULL);\n  }\n  else\n  {\n    struct tilegx_spr *result_ptr = (struct tilegx_spr *) result;\n    return (result_ptr->name);\n  }\n}\n\nint\nprint_insn_tilegx (unsigned char * memaddr)\n{\n  struct tilegx_decoded_instruction\n    decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];\n  unsigned char opbuf[TILEGX_BUNDLE_SIZE_IN_BYTES];\n  int i, num_instructions, num_printed;\n  tilegx_mnemonic padding_mnemonic;\n\n  memcpy((void *)opbuf, (void *)memaddr, TILEGX_BUNDLE_SIZE_IN_BYTES);\n\n  /* Parse the instructions in the bundle. */\n  num_instructions =\n    parse_insn_tilegx (*(unsigned long long *)opbuf, (unsigned long long)memaddr, decoded);\n\n  /* Print the instructions in the bundle. */\n  printf(\"{ \");\n  num_printed = 0;\n\n  /* Determine which nop opcode is used for padding and should be skipped. */\n  padding_mnemonic = TILEGX_OPC_FNOP;\n  for (i = 0; i < num_instructions; i++)\n  {\n    if (!decoded[i].opcode->can_bundle)\n    {\n      /* Instructions that cannot be bundled are padded out with nops,\n         rather than fnops. Displaying them is always clutter. */\n      padding_mnemonic = TILEGX_OPC_NOP;\n      break;\n    }\n  }\n\n  for (i = 0; i < num_instructions; i++)\n  {\n    const struct tilegx_opcode *opcode = decoded[i].opcode;\n    const char *name;\n    int j;\n\n    /* Do not print out fnops, unless everything is an fnop, in\n       which case we will print out just the last one. */\n    if (opcode->mnemonic == padding_mnemonic\n        && (num_printed > 0 || i + 1 < num_instructions))\n      continue;\n\n    if (num_printed > 0)\n      printf(\" ; \");\n    ++num_printed;\n\n    name = opcode->name;\n    if (name == NULL)\n      name = \"<invalid>\";\n    printf(\"%s\", name);\n\n    for (j = 0; j < opcode->num_operands; j++)\n    {\n      unsigned long long num;\n      const struct tilegx_operand *op;\n      const char *spr_name;\n\n      if (j > 0)\n        printf (\",\");\n      printf (\" \");\n\n      num = decoded[i].operand_values[j];\n\n      op = decoded[i].operands[j];\n      switch (op->type)\n      {\n      case TILEGX_OP_TYPE_REGISTER:\n        printf (\"%s\", tilegx_register_names[(int)num]);\n        break;\n      case TILEGX_OP_TYPE_SPR:\n        spr_name = get_tilegx_spr_name(num);\n        if (spr_name != NULL)\n          printf (\"%s\", spr_name);\n        else\n          printf (\"%d\", (int)num);\n        break;\n      case TILEGX_OP_TYPE_IMMEDIATE:\n        printf (\"%d\", (int)num);\n        break;\n      case TILEGX_OP_TYPE_ADDRESS:\n        printf (\"0x%016llx\", num);\n        break;\n      default:\n        abort ();\n      }\n    }\n  }\n  printf (\" }\\n\");\n\n  return TILEGX_BUNDLE_SIZE_IN_BYTES;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeTILEGX_64.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright 2013-2013 Tilera Corporation(jiwang@tilera.com). All rights reserved.\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* TileGX architecture. */\n/* Contributed by Tilera Corporation. */\n#include \"sljitNativeTILEGX-encoder.c\"\n\n#define SIMM_8BIT_MAX (0x7f)\n#define SIMM_8BIT_MIN (-0x80)\n#define SIMM_16BIT_MAX (0x7fff)\n#define SIMM_16BIT_MIN (-0x8000)\n#define SIMM_17BIT_MAX (0xffff)\n#define SIMM_17BIT_MIN (-0x10000)\n#define SIMM_32BIT_MAX (0x7fffffff)\n#define SIMM_32BIT_MIN (-0x7fffffff - 1)\n#define SIMM_48BIT_MAX (0x7fffffff0000L)\n#define SIMM_48BIT_MIN (-0x800000000000L)\n#define IMM16(imm) ((imm) & 0xffff)\n\n#define UIMM_16BIT_MAX (0xffff)\n\n#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)\n#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4)\n#define ADDR_TMP (SLJIT_NUMBER_OF_REGISTERS + 5)\n#define PIC_ADDR_REG TMP_REG2\n\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {\n\t63, 0, 1, 2, 3, 4, 30, 31, 32, 33, 34, 54, 5, 16, 6, 7\n};\n\n#define SLJIT_LOCALS_REG_mapped 54\n#define TMP_REG1_mapped 5\n#define TMP_REG2_mapped 16\n#define TMP_REG3_mapped 6\n#define ADDR_TMP_mapped 7\n\n/* Flags are keept in volatile registers. */\n#define EQUAL_FLAG 8\n/* And carry flag as well. */\n#define ULESS_FLAG 9\n#define UGREATER_FLAG 10\n#define LESS_FLAG 11\n#define GREATER_FLAG 12\n#define OVERFLOW_FLAG 13\n\n#define ZERO 63\n#define RA 55\n#define TMP_EREG1 14\n#define TMP_EREG2 15\n\n#define LOAD_DATA 0x01\n#define WORD_DATA 0x00\n#define BYTE_DATA 0x02\n#define HALF_DATA 0x04\n#define INT_DATA 0x06\n#define SIGNED_DATA 0x08\n#define DOUBLE_DATA 0x10\n\n/* Separates integer and floating point registers */\n#define GPR_REG 0xf\n\n#define MEM_MASK 0x1f\n\n#define WRITE_BACK 0x00020\n#define ARG_TEST 0x00040\n#define ALT_KEEP_CACHE 0x00080\n#define CUMULATIVE_OP 0x00100\n#define LOGICAL_OP 0x00200\n#define IMM_OP 0x00400\n#define SRC2_IMM 0x00800\n\n#define UNUSED_DEST 0x01000\n#define REG_DEST 0x02000\n#define REG1_SOURCE 0x04000\n#define REG2_SOURCE 0x08000\n#define SLOW_SRC1 0x10000\n#define SLOW_SRC2 0x20000\n#define SLOW_DEST 0x40000\n\n/* Only these flags are set. UNUSED_DEST is not set when no flags should be set.\n */\n#define CHECK_FLAGS(list) (!(flags & UNUSED_DEST) || (op & GET_FLAGS(~(list))))\n\nSLJIT_API_FUNC_ATTRIBUTE const char *sljit_get_platform_name(void)\n{\n\treturn \"TileGX\" SLJIT_CPUINFO;\n}\n\n/* Length of an instruction word */\ntypedef sljit_uw sljit_ins;\n\nstruct jit_instr {\n\tconst struct tilegx_opcode* opcode; \n\ttilegx_pipeline pipe;\n\tunsigned long input_registers;\n\tunsigned long output_registers;\n\tint operand_value[4];\n\tint line;\n};\n\n/* Opcode Helper Macros */\n#define TILEGX_X_MODE 0\n\n#define X_MODE create_Mode(TILEGX_X_MODE)\n\n#define FNOP_X0 \\\n\tcreate_Opcode_X0(RRR_0_OPCODE_X0) | \\\n\tcreate_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \\\n\tcreate_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0)\n\n#define FNOP_X1 \\\n\tcreate_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \\\n\tcreate_UnaryOpcodeExtension_X1(FNOP_UNARY_OPCODE_X1)\n\n#define NOP \\\n\tcreate_Mode(TILEGX_X_MODE) | FNOP_X0 | FNOP_X1\n\n#define ANOP_X0 \\\n\tcreate_Opcode_X0(RRR_0_OPCODE_X0) | \\\n\tcreate_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \\\n\tcreate_UnaryOpcodeExtension_X0(NOP_UNARY_OPCODE_X0)\n\n#define BPT create_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \\\n\tcreate_UnaryOpcodeExtension_X1(ILL_UNARY_OPCODE_X1) | \\\n\tcreate_Dest_X1(0x1C) | create_SrcA_X1(0x25) | ANOP_X0\n\n#define ADD_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(ADD_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define ADDI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \\\n\tcreate_Imm8OpcodeExtension_X1(ADDI_IMM8_OPCODE_X1) | FNOP_X0\n\n#define SUB_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(SUB_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define NOR_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(NOR_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define OR_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(OR_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define AND_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(AND_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define XOR_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(XOR_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define CMOVNEZ_X0 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \\\n\tcreate_RRROpcodeExtension_X0(CMOVNEZ_RRR_0_OPCODE_X0) | FNOP_X1\n\n#define CMOVEQZ_X0 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \\\n\tcreate_RRROpcodeExtension_X0(CMOVEQZ_RRR_0_OPCODE_X0) | FNOP_X1\n\n#define ADDLI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(ADDLI_OPCODE_X1) | FNOP_X0\n\n#define V4INT_L_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(V4INT_L_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define BFEXTU_X0 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X0(BF_OPCODE_X0) | \\\n\tcreate_BFOpcodeExtension_X0(BFEXTU_BF_OPCODE_X0) | FNOP_X1\n\n#define BFEXTS_X0 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X0(BF_OPCODE_X0) | \\\n\tcreate_BFOpcodeExtension_X0(BFEXTS_BF_OPCODE_X0) | FNOP_X1\n\n#define SHL16INSLI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHL16INSLI_OPCODE_X1) | FNOP_X0\n\n#define ST_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(ST_RRR_0_OPCODE_X1) | create_Dest_X1(0x0) | FNOP_X0\n\n#define LD_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \\\n\tcreate_UnaryOpcodeExtension_X1(LD_UNARY_OPCODE_X1) | FNOP_X0\n\n#define JR_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \\\n\tcreate_UnaryOpcodeExtension_X1(JR_UNARY_OPCODE_X1) | FNOP_X0\n\n#define JALR_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | \\\n\tcreate_UnaryOpcodeExtension_X1(JALR_UNARY_OPCODE_X1) | FNOP_X0\n\n#define CLZ_X0 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X0(RRR_0_OPCODE_X0) | \\\n\tcreate_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | \\\n\tcreate_UnaryOpcodeExtension_X0(CNTLZ_UNARY_OPCODE_X0) | FNOP_X1\n\n#define CMPLTUI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \\\n\tcreate_Imm8OpcodeExtension_X1(CMPLTUI_IMM8_OPCODE_X1) | FNOP_X0\n\n#define CMPLTU_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(CMPLTU_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define CMPLTS_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(CMPLTS_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define XORI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \\\n\tcreate_Imm8OpcodeExtension_X1(XORI_IMM8_OPCODE_X1) | FNOP_X0\n\n#define ORI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \\\n\tcreate_Imm8OpcodeExtension_X1(ORI_IMM8_OPCODE_X1) | FNOP_X0\n\n#define ANDI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(IMM8_OPCODE_X1) | \\\n\tcreate_Imm8OpcodeExtension_X1(ANDI_IMM8_OPCODE_X1) | FNOP_X0\n\n#define SHLI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \\\n\tcreate_ShiftOpcodeExtension_X1(SHLI_SHIFT_OPCODE_X1) | FNOP_X0\n\n#define SHL_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(SHL_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define SHRSI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \\\n\tcreate_ShiftOpcodeExtension_X1(SHRSI_SHIFT_OPCODE_X1) | FNOP_X0\n\n#define SHRS_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(SHRS_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define SHRUI_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(SHIFT_OPCODE_X1) | \\\n\tcreate_ShiftOpcodeExtension_X1(SHRUI_SHIFT_OPCODE_X1) | FNOP_X0\n\n#define SHRU_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(RRR_0_OPCODE_X1) | \\\n\tcreate_RRROpcodeExtension_X1(SHRU_RRR_0_OPCODE_X1) | FNOP_X0\n\n#define BEQZ_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(BRANCH_OPCODE_X1) | \\\n\tcreate_BrType_X1(BEQZ_BRANCH_OPCODE_X1) | FNOP_X0\n\n#define BNEZ_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(BRANCH_OPCODE_X1) | \\\n\tcreate_BrType_X1(BNEZ_BRANCH_OPCODE_X1) | FNOP_X0\n\n#define J_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(JUMP_OPCODE_X1) | \\\n\tcreate_JumpOpcodeExtension_X1(J_JUMP_OPCODE_X1) | FNOP_X0\n\n#define JAL_X1 \\\n\tcreate_Mode(TILEGX_X_MODE) | create_Opcode_X1(JUMP_OPCODE_X1) | \\\n\tcreate_JumpOpcodeExtension_X1(JAL_JUMP_OPCODE_X1) | FNOP_X0\n\n#define DEST_X0(x) create_Dest_X0(x)\n#define SRCA_X0(x) create_SrcA_X0(x)\n#define SRCB_X0(x) create_SrcB_X0(x)\n#define DEST_X1(x) create_Dest_X1(x)\n#define SRCA_X1(x) create_SrcA_X1(x)\n#define SRCB_X1(x) create_SrcB_X1(x)\n#define IMM16_X1(x) create_Imm16_X1(x)\n#define IMM8_X1(x) create_Imm8_X1(x)\n#define BFSTART_X0(x) create_BFStart_X0(x)\n#define BFEND_X0(x) create_BFEnd_X0(x)\n#define SHIFTIMM_X1(x) create_ShAmt_X1(x)\n#define JOFF_X1(x) create_JumpOff_X1(x)\n#define BOFF_X1(x) create_BrOff_X1(x)\n\nstatic const tilegx_mnemonic data_transfer_insts[16] = {\n\t/* u w s */ TILEGX_OPC_ST   /* st */,\n\t/* u w l */ TILEGX_OPC_LD   /* ld */,\n\t/* u b s */ TILEGX_OPC_ST1  /* st1 */,\n\t/* u b l */ TILEGX_OPC_LD1U /* ld1u */,\n\t/* u h s */ TILEGX_OPC_ST2  /* st2 */,\n\t/* u h l */ TILEGX_OPC_LD2U /* ld2u */,\n\t/* u i s */ TILEGX_OPC_ST4  /* st4 */,\n\t/* u i l */ TILEGX_OPC_LD4U /* ld4u */,\n\t/* s w s */ TILEGX_OPC_ST   /* st */,\n\t/* s w l */ TILEGX_OPC_LD   /* ld */,\n\t/* s b s */ TILEGX_OPC_ST1  /* st1 */,\n\t/* s b l */ TILEGX_OPC_LD1S /* ld1s */,\n\t/* s h s */ TILEGX_OPC_ST2  /* st2 */,\n\t/* s h l */ TILEGX_OPC_LD2S /* ld2s */,\n\t/* s i s */ TILEGX_OPC_ST4  /* st4 */,\n\t/* s i l */ TILEGX_OPC_LD4S /* ld4s */,\n};\n\n#ifdef TILEGX_JIT_DEBUG\nstatic sljit_s32 push_inst_debug(struct sljit_compiler *compiler, sljit_ins ins, int line)\n{\n\tsljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\tprintf(\"|%04d|S0|:\\t\\t\", line);\n\tprint_insn_tilegx(ptr);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_inst_nodebug(struct sljit_compiler *compiler, sljit_ins ins)\n{\n\tsljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\treturn SLJIT_SUCCESS;\n}\n\n#define push_inst(a, b) push_inst_debug(a, b, __LINE__)\n#else\nstatic sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)\n{\n\tsljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));\n\tFAIL_IF(!ptr);\n\t*ptr = ins;\n\tcompiler->size++;\n\treturn SLJIT_SUCCESS;\n}\n#endif\n\n#define BUNDLE_FORMAT_MASK(p0, p1, p2) \\\n\t((p0) | ((p1) << 8) | ((p2) << 16))\n\n#define BUNDLE_FORMAT(p0, p1, p2) \\\n\t{ \\\n\t\t{ \\\n\t\t\t(tilegx_pipeline)(p0), \\\n\t\t\t(tilegx_pipeline)(p1), \\\n\t\t\t(tilegx_pipeline)(p2) \\\n\t\t}, \\\n\t\tBUNDLE_FORMAT_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \\\n\t}\n\n#define NO_PIPELINE TILEGX_NUM_PIPELINE_ENCODINGS\n\n#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1)\n\n#define PI(encoding) \\\n\tpush_inst(compiler, encoding)\n\n#define PB3(opcode, dst, srca, srcb) \\\n\tpush_3_buffer(compiler, opcode, dst, srca, srcb, __LINE__)\n\n#define PB2(opcode, dst, src) \\\n\tpush_2_buffer(compiler, opcode, dst, src, __LINE__)\n\n#define JR(reg) \\\n\tpush_jr_buffer(compiler, TILEGX_OPC_JR, reg, __LINE__)\n\n#define ADD(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_ADD, dst, srca, srcb, __LINE__)\n\n#define SUB(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_SUB, dst, srca, srcb, __LINE__)\n\n#define MUL(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_MULX, dst, srca, srcb, __LINE__)\n\n#define NOR(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_NOR, dst, srca, srcb, __LINE__)\n\n#define OR(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_OR, dst, srca, srcb, __LINE__)\n\n#define XOR(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_XOR, dst, srca, srcb, __LINE__)\n\n#define AND(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_AND, dst, srca, srcb, __LINE__)\n\n#define CLZ(dst, src) \\\n\tpush_2_buffer(compiler, TILEGX_OPC_CLZ, dst, src, __LINE__)\n\n#define SHLI(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_SHLI, dst, srca, srcb, __LINE__)\n\n#define SHRUI(dst, srca, imm) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_SHRUI, dst, srca, imm, __LINE__)\n\n#define XORI(dst, srca, imm) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_XORI, dst, srca, imm, __LINE__)\n\n#define ORI(dst, srca, imm) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_ORI, dst, srca, imm, __LINE__)\n\n#define CMPLTU(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_CMPLTU, dst, srca, srcb, __LINE__)\n\n#define CMPLTS(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_CMPLTS, dst, srca, srcb, __LINE__)\n\n#define CMPLTUI(dst, srca, imm) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_CMPLTUI, dst, srca, imm, __LINE__)\n\n#define CMOVNEZ(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_CMOVNEZ, dst, srca, srcb, __LINE__)\n\n#define CMOVEQZ(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_CMOVEQZ, dst, srca, srcb, __LINE__)\n\n#define ADDLI(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_ADDLI, dst, srca, srcb, __LINE__)\n\n#define SHL16INSLI(dst, srca, srcb) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_SHL16INSLI, dst, srca, srcb, __LINE__)\n\n#define LD_ADD(dst, addr, adjust) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_LD_ADD, dst, addr, adjust, __LINE__)\n\n#define ST_ADD(src, addr, adjust) \\\n\tpush_3_buffer(compiler, TILEGX_OPC_ST_ADD, src, addr, adjust, __LINE__)\n\n#define LD(dst, addr) \\\n\tpush_2_buffer(compiler, TILEGX_OPC_LD, dst, addr, __LINE__)\n\n#define BFEXTU(dst, src, start, end) \\\n\tpush_4_buffer(compiler, TILEGX_OPC_BFEXTU, dst, src, start, end, __LINE__)\n\n#define BFEXTS(dst, src, start, end) \\\n\tpush_4_buffer(compiler, TILEGX_OPC_BFEXTS, dst, src, start, end, __LINE__)\n\n#define ADD_SOLO(dest, srca, srcb) \\\n\tpush_inst(compiler, ADD_X1 | DEST_X1(dest) | SRCA_X1(srca) | SRCB_X1(srcb))\n\n#define ADDI_SOLO(dest, srca, imm) \\\n\tpush_inst(compiler, ADDI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM8_X1(imm))\n\n#define ADDLI_SOLO(dest, srca, imm) \\\n\tpush_inst(compiler, ADDLI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM16_X1(imm))\n\n#define SHL16INSLI_SOLO(dest, srca, imm) \\\n\tpush_inst(compiler, SHL16INSLI_X1 | DEST_X1(dest) | SRCA_X1(srca) | IMM16_X1(imm))\n\n#define JALR_SOLO(reg) \\\n\tpush_inst(compiler, JALR_X1 | SRCA_X1(reg))\n\n#define JR_SOLO(reg) \\\n\tpush_inst(compiler, JR_X1 | SRCA_X1(reg))\n\nstruct Format {\n\t/* Mapping of bundle issue slot to assigned pipe. */\n\ttilegx_pipeline pipe[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];\n\n\t/* Mask of pipes used by this bundle. */\n\tunsigned int pipe_mask;\n};\n\nconst struct Format formats[] =\n{\n\t/* In Y format we must always have something in Y2, since it has\n\t* no fnop, so this conveys that Y2 must always be used. */\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, NO_PIPELINE),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, NO_PIPELINE),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, NO_PIPELINE),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, NO_PIPELINE),\n\n\t/* Y format has three instructions. */\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y1),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y0),\n\n\t/* X format has only two instructions. */\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_X0, TILEGX_PIPELINE_X1, NO_PIPELINE),\n\tBUNDLE_FORMAT(TILEGX_PIPELINE_X1, TILEGX_PIPELINE_X0, NO_PIPELINE)\n};\n\n\nstruct jit_instr inst_buf[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];\nunsigned long inst_buf_index;\n\ntilegx_pipeline get_any_valid_pipe(const struct tilegx_opcode* opcode)\n{\n\t/* FIXME: tile: we could pregenerate this. */\n\tint pipe;\n\tfor (pipe = 0; ((opcode->pipes & (1 << pipe)) == 0 && pipe < TILEGX_NUM_PIPELINE_ENCODINGS); pipe++)\n\t\t;\n\treturn (tilegx_pipeline)(pipe);\n}\n\nvoid insert_nop(tilegx_mnemonic opc, int line)\n{\n\tconst struct tilegx_opcode* opcode = NULL;\n\n\tmemmove(&inst_buf[1], &inst_buf[0], inst_buf_index * sizeof inst_buf[0]);\n\n\topcode = &tilegx_opcodes[opc];\n\tinst_buf[0].opcode = opcode;\n\tinst_buf[0].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[0].input_registers = 0;\n\tinst_buf[0].output_registers = 0;\n\tinst_buf[0].line = line;\n\t++inst_buf_index;\n}\n\nconst struct Format* compute_format()\n{\n\tunsigned int compatible_pipes = BUNDLE_FORMAT_MASK(\n\t\tinst_buf[0].opcode->pipes,\n\t\tinst_buf[1].opcode->pipes,\n\t\t(inst_buf_index == 3 ? inst_buf[2].opcode->pipes : (1 << NO_PIPELINE)));\n\n\tconst struct Format* match = NULL;\n\tconst struct Format *b = NULL;\n\tunsigned int i;\n\tfor (i = 0; i < sizeof formats / sizeof formats[0]; i++) {\n\t\tb = &formats[i];\n\t\tif ((b->pipe_mask & compatible_pipes) == b->pipe_mask) {\n\t\t\tmatch = b;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn match;\n}\n\nsljit_s32 assign_pipes()\n{\n\tunsigned long output_registers = 0;\n\tunsigned int i = 0;\n\n\tif (inst_buf_index == 1) {\n\t\ttilegx_mnemonic opc = inst_buf[0].opcode->can_bundle\n\t\t\t\t\t? TILEGX_OPC_FNOP : TILEGX_OPC_NOP;\n\t\tinsert_nop(opc, __LINE__);\n\t}\n\n\tconst struct Format* match = compute_format();\n\n\tif (match == NULL)\n\t\treturn -1;\n\n\tfor (i = 0; i < inst_buf_index; i++) {\n\n\t\tif ((i > 0) && ((inst_buf[i].input_registers & output_registers) != 0))\n\t\t\treturn -1;\n\n\t\tif ((i > 0) && ((inst_buf[i].output_registers & output_registers) != 0))\n\t\t\treturn -1;\n\n\t\t/* Don't include Rzero in the match set, to avoid triggering\n\t\t   needlessly on 'prefetch' instrs. */\n\n\t\toutput_registers |= inst_buf[i].output_registers & 0xFFFFFFFFFFFFFFL;\n\n\t\tinst_buf[i].pipe = match->pipe[i];\n\t}\n\n\t/* If only 2 instrs, and in Y-mode, insert a nop. */\n\tif (inst_buf_index == 2 && !tilegx_is_x_pipeline(match->pipe[0])) {\n\t\tinsert_nop(TILEGX_OPC_FNOP, __LINE__);\n\n\t\t/* Select the yet unassigned pipe. */\n\t\ttilegx_pipeline pipe = (tilegx_pipeline)(((TILEGX_PIPELINE_Y0\n\t\t\t\t\t+ TILEGX_PIPELINE_Y1 + TILEGX_PIPELINE_Y2)\n\t\t\t\t\t- (inst_buf[1].pipe + inst_buf[2].pipe)));\n\n\t\tinst_buf[0].pipe = pipe;\n\t}\n\n\treturn 0;\n}\n\ntilegx_bundle_bits get_bundle_bit(struct jit_instr *inst)\n{\n\tint i, val;\n\tconst struct tilegx_opcode* opcode = inst->opcode;\n\ttilegx_bundle_bits bits = opcode->fixed_bit_values[inst->pipe];\n\n\tconst struct tilegx_operand* operand = NULL;\n\tfor (i = 0; i < opcode->num_operands; i++) {\n\t\toperand = &tilegx_operands[opcode->operands[inst->pipe][i]];\n\t\tval = inst->operand_value[i];\n\n\t\tbits |= operand->insert(val);\n\t}\n\n\treturn bits;\n}\n\nstatic sljit_s32 update_buffer(struct sljit_compiler *compiler)\n{\n\tint i;\n\tint orig_index = inst_buf_index;\n\tstruct jit_instr inst0 = inst_buf[0];\n\tstruct jit_instr inst1 = inst_buf[1];\n\tstruct jit_instr inst2 = inst_buf[2];\n\ttilegx_bundle_bits bits = 0;\n\n\t/* If the bundle is valid as is, perform the encoding and return 1. */\n\tif (assign_pipes() == 0) {\n\t\tfor (i = 0; i < inst_buf_index; i++) {\n\t\t\tbits |= get_bundle_bit(inst_buf + i);\n#ifdef TILEGX_JIT_DEBUG\n\t\t\tprintf(\"|%04d\", inst_buf[i].line);\n#endif\n\t\t}\n#ifdef TILEGX_JIT_DEBUG\n\t\tif (inst_buf_index == 3)\n\t\t\tprintf(\"|M0|:\\t\");\n\t\telse\n\t\t\tprintf(\"|M0|:\\t\\t\");\n\t\tprint_insn_tilegx(&bits);\n#endif\n\n\t\tinst_buf_index = 0;\n\n#ifdef TILEGX_JIT_DEBUG\n\t\treturn push_inst_nodebug(compiler, bits);\n#else\n\t\treturn push_inst(compiler, bits);\n#endif\n\t}\n\n\t/* If the bundle is invalid, split it in two. First encode the first two\n\t   (or possibly 1) instructions, and then the last, separately. Note that\n\t   assign_pipes may have re-ordered the instrs (by inserting no-ops in\n\t   lower slots) so we need to reset them. */\n\n\tinst_buf_index = orig_index - 1;\n\tinst_buf[0] = inst0;\n\tinst_buf[1] = inst1;\n\tinst_buf[2] = inst2;\n\tif (assign_pipes() == 0) {\n\t\tfor (i = 0; i < inst_buf_index; i++) {\n\t\t\tbits |= get_bundle_bit(inst_buf + i);\n#ifdef TILEGX_JIT_DEBUG\n\t\t\tprintf(\"|%04d\", inst_buf[i].line);\n#endif\n\t\t}\n\n#ifdef TILEGX_JIT_DEBUG\n\t\tif (inst_buf_index == 3)\n\t\t\tprintf(\"|M1|:\\t\");\n\t\telse\n\t\t\tprintf(\"|M1|:\\t\\t\");\n\t\tprint_insn_tilegx(&bits);\n#endif\n\n\t\tif ((orig_index - 1) == 2) {\n\t\t\tinst_buf[0] = inst2;\n\t\t\tinst_buf_index = 1;\n\t\t} else if ((orig_index - 1) == 1) {\n\t\t\tinst_buf[0] = inst1;\n\t\t\tinst_buf_index = 1;\n\t\t} else\n\t\t\tSLJIT_UNREACHABLE();\n\n#ifdef TILEGX_JIT_DEBUG\n\t\treturn push_inst_nodebug(compiler, bits);\n#else\n\t\treturn push_inst(compiler, bits);\n#endif\n\t} else {\n\t\t/* We had 3 instrs of which the first 2 can't live in the same bundle.\n\t\t   Split those two. Note that we don't try to then combine the second\n\t\t   and third instr into a single bundle.  First instruction: */\n\t\tinst_buf_index = 1;\n\t\tinst_buf[0] = inst0;\n\t\tinst_buf[1] = inst1;\n\t\tinst_buf[2] = inst2;\n\t\tif (assign_pipes() == 0) {\n\t\t\tfor (i = 0; i < inst_buf_index; i++) {\n\t\t\t\tbits |= get_bundle_bit(inst_buf + i);\n#ifdef TILEGX_JIT_DEBUG\n\t\t\t\tprintf(\"|%04d\", inst_buf[i].line);\n#endif\n\t\t\t}\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\tif (inst_buf_index == 3)\n\t\t\t\tprintf(\"|M2|:\\t\");\n\t\t\telse\n\t\t\t\tprintf(\"|M2|:\\t\\t\");\n\t\t\tprint_insn_tilegx(&bits);\n#endif\n\n\t\t\tinst_buf[0] = inst1;\n\t\t\tinst_buf[1] = inst2;\n\t\t\tinst_buf_index = orig_index - 1;\n#ifdef TILEGX_JIT_DEBUG\n\t\t\treturn push_inst_nodebug(compiler, bits);\n#else\n\t\t\treturn push_inst(compiler, bits);\n#endif\n\t\t} else\n\t\t\tSLJIT_UNREACHABLE();\n\t}\n\n\tSLJIT_UNREACHABLE();\n}\n\nstatic sljit_s32 flush_buffer(struct sljit_compiler *compiler)\n{\n\twhile (inst_buf_index != 0) {\n\t\tFAIL_IF(update_buffer(compiler));\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_4_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int op3, int line)\n{\n\tif (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)\n\t\tFAIL_IF(update_buffer(compiler));\n\n\tconst struct tilegx_opcode* opcode = &tilegx_opcodes[opc];\n\tinst_buf[inst_buf_index].opcode = opcode;\n\tinst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[inst_buf_index].operand_value[0] = op0;\n\tinst_buf[inst_buf_index].operand_value[1] = op1;\n\tinst_buf[inst_buf_index].operand_value[2] = op2;\n\tinst_buf[inst_buf_index].operand_value[3] = op3;\n\tinst_buf[inst_buf_index].input_registers = 1L << op1;\n\tinst_buf[inst_buf_index].output_registers = 1L << op0;\n\tinst_buf[inst_buf_index].line = line;\n\tinst_buf_index++;\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_3_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int line)\n{\n\tif (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)\n\t\tFAIL_IF(update_buffer(compiler));\n\n\tconst struct tilegx_opcode* opcode = &tilegx_opcodes[opc];\n\tinst_buf[inst_buf_index].opcode = opcode;\n\tinst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[inst_buf_index].operand_value[0] = op0;\n\tinst_buf[inst_buf_index].operand_value[1] = op1;\n\tinst_buf[inst_buf_index].operand_value[2] = op2;\n\tinst_buf[inst_buf_index].line = line;\n\n\tswitch (opc) {\n\tcase TILEGX_OPC_ST_ADD:\n\t\tinst_buf[inst_buf_index].input_registers = (1L << op0) | (1L << op1);\n\t\tinst_buf[inst_buf_index].output_registers = 1L << op0;\n\t\tbreak;\n\tcase TILEGX_OPC_LD_ADD:\n\t\tinst_buf[inst_buf_index].input_registers = 1L << op1;\n\t\tinst_buf[inst_buf_index].output_registers = (1L << op0) | (1L << op1);\n\t\tbreak;\n\tcase TILEGX_OPC_ADD:\n\tcase TILEGX_OPC_AND:\n\tcase TILEGX_OPC_SUB:\n\tcase TILEGX_OPC_MULX:\n\tcase TILEGX_OPC_OR:\n\tcase TILEGX_OPC_XOR:\n\tcase TILEGX_OPC_NOR:\n\tcase TILEGX_OPC_SHL:\n\tcase TILEGX_OPC_SHRU:\n\tcase TILEGX_OPC_SHRS:\n\tcase TILEGX_OPC_CMPLTU:\n\tcase TILEGX_OPC_CMPLTS:\n\tcase TILEGX_OPC_CMOVEQZ:\n\tcase TILEGX_OPC_CMOVNEZ:\n\t\tinst_buf[inst_buf_index].input_registers = (1L << op1) | (1L << op2);\n\t\tinst_buf[inst_buf_index].output_registers = 1L << op0;\n\t\tbreak;\n\tcase TILEGX_OPC_ADDLI:\n\tcase TILEGX_OPC_XORI:\n\tcase TILEGX_OPC_ORI:\n\tcase TILEGX_OPC_SHLI:\n\tcase TILEGX_OPC_SHRUI:\n\tcase TILEGX_OPC_SHRSI:\n\tcase TILEGX_OPC_SHL16INSLI:\n\tcase TILEGX_OPC_CMPLTUI:\n\tcase TILEGX_OPC_CMPLTSI:\n\t\tinst_buf[inst_buf_index].input_registers = 1L << op1;\n\t\tinst_buf[inst_buf_index].output_registers = 1L << op0;\n\t\tbreak;\n\tdefault:\n\t\tprintf(\"unrecoginzed opc: %s\\n\", opcode->name);\n\t\tSLJIT_UNREACHABLE();\n\t}\n\n\tinst_buf_index++;\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_2_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int line)\n{\n\tif (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)\n\t\tFAIL_IF(update_buffer(compiler));\n\n\tconst struct tilegx_opcode* opcode = &tilegx_opcodes[opc];\n\tinst_buf[inst_buf_index].opcode = opcode;\n\tinst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[inst_buf_index].operand_value[0] = op0;\n\tinst_buf[inst_buf_index].operand_value[1] = op1;\n\tinst_buf[inst_buf_index].line = line;\n\n\tswitch (opc) {\n\tcase TILEGX_OPC_BEQZ:\n\tcase TILEGX_OPC_BNEZ:\n\t\tinst_buf[inst_buf_index].input_registers = 1L << op0;\n\t\tbreak;\n\tcase TILEGX_OPC_ST:\n\tcase TILEGX_OPC_ST1:\n\tcase TILEGX_OPC_ST2:\n\tcase TILEGX_OPC_ST4:\n\t\tinst_buf[inst_buf_index].input_registers = (1L << op0) | (1L << op1);\n\t\tinst_buf[inst_buf_index].output_registers = 0;\n\t\tbreak;\n\tcase TILEGX_OPC_CLZ:\n\tcase TILEGX_OPC_LD:\n\tcase TILEGX_OPC_LD1U:\n\tcase TILEGX_OPC_LD1S:\n\tcase TILEGX_OPC_LD2U:\n\tcase TILEGX_OPC_LD2S:\n\tcase TILEGX_OPC_LD4U:\n\tcase TILEGX_OPC_LD4S:\n\t\tinst_buf[inst_buf_index].input_registers = 1L << op1;\n\t\tinst_buf[inst_buf_index].output_registers = 1L << op0;\n\t\tbreak;\n\tdefault:\n\t\tprintf(\"unrecoginzed opc: %s\\n\", opcode->name);\n\t\tSLJIT_UNREACHABLE();\n\t}\n\n\tinst_buf_index++;\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_0_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int line)\n{\n\tif (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)\n\t\tFAIL_IF(update_buffer(compiler));\n\n\tconst struct tilegx_opcode* opcode = &tilegx_opcodes[opc];\n\tinst_buf[inst_buf_index].opcode = opcode;\n\tinst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[inst_buf_index].input_registers = 0;\n\tinst_buf[inst_buf_index].output_registers = 0;\n\tinst_buf[inst_buf_index].line = line;\n\tinst_buf_index++;\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 push_jr_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int line)\n{\n\tif (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)\n\t\tFAIL_IF(update_buffer(compiler));\n\n\tconst struct tilegx_opcode* opcode = &tilegx_opcodes[opc];\n\tinst_buf[inst_buf_index].opcode = opcode;\n\tinst_buf[inst_buf_index].pipe = get_any_valid_pipe(opcode);\n\tinst_buf[inst_buf_index].operand_value[0] = op0;\n\tinst_buf[inst_buf_index].input_registers = 1L << op0;\n\tinst_buf[inst_buf_index].output_registers = 0;\n\tinst_buf[inst_buf_index].line = line;\n\tinst_buf_index++;\n \n\treturn flush_buffer(compiler);\n}\n\nstatic SLJIT_INLINE sljit_ins * detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)\n{\n\tsljit_sw diff;\n\tsljit_uw target_addr;\n\tsljit_ins *inst;\n\n\tif (jump->flags & SLJIT_REWRITABLE_JUMP)\n\t\treturn code_ptr;\n\n\tif (jump->flags & JUMP_ADDR)\n\t\ttarget_addr = jump->u.target;\n\telse {\n\t\tSLJIT_ASSERT(jump->flags & JUMP_LABEL);\n\t\ttarget_addr = (sljit_uw)(code + jump->u.label->size);\n\t}\n\n\tinst = (sljit_ins *)jump->addr;\n\tif (jump->flags & IS_COND)\n\t\tinst--;\n\n\tdiff = ((sljit_sw) target_addr - (sljit_sw) inst) >> 3;\n\tif (diff <= SIMM_17BIT_MAX && diff >= SIMM_17BIT_MIN) {\n\t\tjump->flags |= PATCH_B;\n\n\t\tif (!(jump->flags & IS_COND)) {\n\t\t\tif (jump->flags & IS_JAL) {\n\t\t\t\tjump->flags &= ~(PATCH_B);\n\t\t\t\tjump->flags |= PATCH_J;\n\t\t\t\tinst[0] = JAL_X1;\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\t\tprint_insn_tilegx(inst);\n#endif\n\t\t\t} else {\n\t\t\t\tinst[0] = BEQZ_X1 | SRCA_X1(ZERO);\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\t\tprint_insn_tilegx(inst);\n#endif\n\t\t\t}\n\n\t\t\treturn inst;\n\t\t}\n\n\t\tinst[0] = inst[0] ^ (0x7L << 55);\n\n#ifdef TILEGX_JIT_DEBUG\n\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\tprint_insn_tilegx(inst);\n#endif\n\t\tjump->addr -= sizeof(sljit_ins);\n\t\treturn inst;\n\t}\n\n\tif (jump->flags & IS_COND) {\n\t\tif ((target_addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL)) {\n\t\t\tjump->flags |= PATCH_J;\n\t\t\tinst[0] = (inst[0] & ~(BOFF_X1(-1))) | BOFF_X1(2);\n\t\t\tinst[1] = J_X1;\n\t\t\treturn inst + 1;\n\t\t}\n\n\t\treturn code_ptr;\n\t}\n\n\tif ((target_addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL)) {\n\t\tjump->flags |= PATCH_J;\n\n\t\tif (jump->flags & IS_JAL) {\n\t\t\tinst[0] = JAL_X1;\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\tprint_insn_tilegx(inst);\n#endif\n\n\t\t} else {\n\t\t\tinst[0] = J_X1;\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\tprint_insn_tilegx(inst);\n#endif\n\t\t}\n\n\t\treturn inst;\n\t}\n\n\treturn code_ptr;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_ins *code;\n\tsljit_ins *code_ptr;\n\tsljit_ins *buf_ptr;\n\tsljit_ins *buf_end;\n\tsljit_uw word_count;\n\tsljit_uw addr;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\tcode = (sljit_ins *)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tword_count = 0;\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\tdo {\n\t\tbuf_ptr = (sljit_ins *)buf->memory;\n\t\tbuf_end = buf_ptr + (buf->used_size >> 3);\n\t\tdo {\n\t\t\t*code_ptr = *buf_ptr++;\n\t\t\tSLJIT_ASSERT(!label || label->size >= word_count);\n\t\t\tSLJIT_ASSERT(!jump || jump->addr >= word_count);\n\t\t\tSLJIT_ASSERT(!const_ || const_->addr >= word_count);\n\t\t\t/* These structures are ordered by their address. */\n\t\t\tif (label && label->size == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tlabel->addr = (sljit_uw) code_ptr;\n\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\tlabel = label->next;\n\t\t\t}\n\n\t\t\tif (jump && jump->addr == word_count) {\n\t\t\t\tif (jump->flags & IS_JAL)\n\t\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 4);\n\t\t\t\telse\n\t\t\t\t\tjump->addr = (sljit_uw)(code_ptr - 3);\n\n\t\t\t\tcode_ptr = detect_jump_type(jump, code_ptr, code);\n\t\t\t\tjump = jump->next;\n\t\t\t}\n\n\t\t\tif (const_ && const_->addr == word_count) {\n\t\t\t\t/* Just recording the address. */\n\t\t\t\tconst_->addr = (sljit_uw) code_ptr;\n\t\t\t\tconst_ = const_->next;\n\t\t\t}\n\n\t\t\tcode_ptr++;\n\t\t\tword_count++;\n\t\t} while (buf_ptr < buf_end);\n\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tif (label && label->size == word_count) {\n\t\tlabel->addr = (sljit_uw) code_ptr;\n\t\tlabel->size = code_ptr - code;\n\t\tlabel = label->next;\n\t}\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\tSLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tdo {\n\t\t\taddr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;\n\t\t\tbuf_ptr = (sljit_ins *)jump->addr;\n\n\t\t\tif (jump->flags & PATCH_B) {\n\t\t\t\taddr = (sljit_sw)(addr - (jump->addr)) >> 3;\n\t\t\t\tSLJIT_ASSERT((sljit_sw) addr <= SIMM_17BIT_MAX && (sljit_sw) addr >= SIMM_17BIT_MIN);\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & ~(BOFF_X1(-1))) | BOFF_X1(addr);\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\t\tprint_insn_tilegx(buf_ptr);\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (jump->flags & PATCH_J) {\n\t\t\t\tSLJIT_ASSERT((addr & ~0x3FFFFFFFL) == ((jump->addr + sizeof(sljit_ins)) & ~0x3FFFFFFFL));\n\t\t\t\taddr = (sljit_sw)(addr - (jump->addr)) >> 3;\n\t\t\t\tbuf_ptr[0] = (buf_ptr[0] & ~(JOFF_X1(-1))) | JOFF_X1(addr);\n\n#ifdef TILEGX_JIT_DEBUG\n\t\t\t\tprintf(\"[runtime relocate]%04d:\\t\", __LINE__);\n\t\t\t\tprint_insn_tilegx(buf_ptr);\n#endif\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tSLJIT_ASSERT(!(jump->flags & IS_JAL));\n\n\t\t\t/* Set the fields of immediate loads. */\n\t\t\tbuf_ptr[0] = (buf_ptr[0] & ~(0xFFFFL << 43)) | (((addr >> 32) & 0xFFFFL) << 43);\n\t\t\tbuf_ptr[1] = (buf_ptr[1] & ~(0xFFFFL << 43)) | (((addr >> 16) & 0xFFFFL) << 43);\n\t\t\tbuf_ptr[2] = (buf_ptr[2] & ~(0xFFFFL << 43)) | ((addr & 0xFFFFL) << 43);\n\t\t} while (0);\n\n\t\tjump = jump->next;\n\t}\n\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_size = (code_ptr - code) * sizeof(sljit_ins);\n\tSLJIT_CACHE_FLUSH(code, code_ptr);\n\treturn code;\n}\n\nstatic sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)\n{\n\n\tif (imm <= SIMM_16BIT_MAX && imm >= SIMM_16BIT_MIN)\n\t\treturn ADDLI(dst_ar, ZERO, imm);\n\n\tif (imm <= SIMM_32BIT_MAX && imm >= SIMM_32BIT_MIN) {\n\t\tFAIL_IF(ADDLI(dst_ar, ZERO, imm >> 16));\n\t\treturn SHL16INSLI(dst_ar, dst_ar, imm);\n\t}\n\n\tif (imm <= SIMM_48BIT_MAX && imm >= SIMM_48BIT_MIN) {\n\t\tFAIL_IF(ADDLI(dst_ar, ZERO, imm >> 32));\n\t\tFAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16));\n\t\treturn SHL16INSLI(dst_ar, dst_ar, imm);\n\t}\n\n\tFAIL_IF(ADDLI(dst_ar, ZERO, imm >> 48));\n\tFAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 32));\n\tFAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16));\n\treturn SHL16INSLI(dst_ar, dst_ar, imm);\n}\n\nstatic sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush)\n{\n\t/* Should *not* be optimized as load_immediate, as pcre relocation\n\t   mechanism will match this fixed 4-instruction pattern. */\n\tif (flush) {\n\t\tFAIL_IF(ADDLI_SOLO(dst_ar, ZERO, imm >> 32));\n\t\tFAIL_IF(SHL16INSLI_SOLO(dst_ar, dst_ar, imm >> 16));\n\t\treturn SHL16INSLI_SOLO(dst_ar, dst_ar, imm);\n\t}\n\n\tFAIL_IF(ADDLI(dst_ar, ZERO, imm >> 32));\n\tFAIL_IF(SHL16INSLI(dst_ar, dst_ar, imm >> 16));\n\treturn SHL16INSLI(dst_ar, dst_ar, imm);\n}\n\nstatic sljit_s32 emit_const_64(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush)\n{\n\t/* Should *not* be optimized as load_immediate, as pcre relocation\n\t   mechanism will match this fixed 4-instruction pattern. */\n\tif (flush) {\n\t\tFAIL_IF(ADDLI_SOLO(reg_map[dst_ar], ZERO, imm >> 48));\n\t\tFAIL_IF(SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm >> 32));\n\t\tFAIL_IF(SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm >> 16));\n\t\treturn SHL16INSLI_SOLO(reg_map[dst_ar], reg_map[dst_ar], imm);\n\t}\n\n\tFAIL_IF(ADDLI(reg_map[dst_ar], ZERO, imm >> 48));\n\tFAIL_IF(SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm >> 32));\n\tFAIL_IF(SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm >> 16));\n\treturn SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_ins base;\n\tsljit_s32 i, tmp;\n \n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tlocal_size = (local_size + 7) & ~7;\n\tcompiler->local_size = local_size;\n\n\tif (local_size <= SIMM_16BIT_MAX) {\n\t\t/* Frequent case. */\n\t\tFAIL_IF(ADDLI(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, -local_size));\n\t\tbase = SLJIT_LOCALS_REG_mapped;\n\t} else {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1_mapped, local_size));\n\t\tFAIL_IF(ADD(TMP_REG2_mapped, SLJIT_LOCALS_REG_mapped, ZERO));\n\t\tFAIL_IF(SUB(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped));\n\t\tbase = TMP_REG2_mapped;\n\t\tlocal_size = 0;\n\t}\n\n\t/* Save the return address. */\n\tFAIL_IF(ADDLI(ADDR_TMP_mapped, base, local_size - 8));\n\tFAIL_IF(ST_ADD(ADDR_TMP_mapped, RA, -8));\n\n\t/* Save the S registers. */\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\tFAIL_IF(ST_ADD(ADDR_TMP_mapped, reg_map[i], -8));\n\t}\n\n\t/* Save the R registers that need to be reserved. */\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\tFAIL_IF(ST_ADD(ADDR_TMP_mapped, reg_map[i], -8));\n\t}\n\n\t/* Move the arguments to S registers. */\n\tfor (i = 0; i < args; i++) {\n\t\tFAIL_IF(ADD(reg_map[SLJIT_S0 - i], i, ZERO));\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tlocal_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tcompiler->local_size = (local_size + 7) & ~7;\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 local_size;\n\tsljit_ins base;\n\tsljit_s32 i, tmp;\n\tsljit_s32 saveds;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tlocal_size = compiler->local_size;\n\tif (local_size <= SIMM_16BIT_MAX)\n\t\tbase = SLJIT_LOCALS_REG_mapped;\n\telse {\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG1_mapped, local_size));\n\t\tFAIL_IF(ADD(TMP_REG1_mapped, SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped));\n\t\tbase = TMP_REG1_mapped;\n\t\tlocal_size = 0;\n\t}\n\n\t/* Restore the return address. */\n\tFAIL_IF(ADDLI(ADDR_TMP_mapped, base, local_size - 8));\n\tFAIL_IF(LD_ADD(RA, ADDR_TMP_mapped, -8));\n\n\t/* Restore the S registers. */\n\tsaveds = compiler->saveds;\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\tFAIL_IF(LD_ADD(reg_map[i], ADDR_TMP_mapped, -8));\n\t}\n\n\t/* Restore the R registers that need to be reserved. */\n\tfor (i = compiler->scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\tFAIL_IF(LD_ADD(reg_map[i], ADDR_TMP_mapped, -8));\n\t}\n\n\tif (compiler->local_size <= SIMM_16BIT_MAX)\n\t\tFAIL_IF(ADDLI(SLJIT_LOCALS_REG_mapped, SLJIT_LOCALS_REG_mapped, compiler->local_size));\n\telse\n\t\tFAIL_IF(ADD(SLJIT_LOCALS_REG_mapped, TMP_REG1_mapped, ZERO));\n\n\treturn JR(RA);\n}\n\n/* reg_ar is an absoulute register! */\n\n/* Can perform an operation using at most 1 instruction. */\nstatic sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)\n{\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\n\tif ((!(flags & WRITE_BACK) || !(arg & REG_MASK))\n\t\t\t&& !(arg & OFFS_REG_MASK) && argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) {\n\t\t/* Works for both absoulte and relative addresses. */\n\t\tif (SLJIT_UNLIKELY(flags & ARG_TEST))\n\t\t\treturn 1;\n\n\t\tFAIL_IF(ADDLI(ADDR_TMP_mapped, reg_map[arg & REG_MASK], argw));\n\n\t\tif (flags & LOAD_DATA)\n\t\t\tFAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, ADDR_TMP_mapped));\n\t\telse\n\t\t\tFAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], ADDR_TMP_mapped, reg_ar));\n\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\n/* See getput_arg below.\n   Note: can_cache is called only for binary operators. Those\n   operators always uses word arguments without write back. */\nstatic sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tSLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));\n\n\t/* Simple operation except for updates. */\n\tif (arg & OFFS_REG_MASK) {\n\t\targw &= 0x3;\n\t\tnext_argw &= 0x3;\n\t\tif (argw && argw == next_argw\n\t\t\t\t&& (arg == next_arg || (arg & OFFS_REG_MASK) == (next_arg & OFFS_REG_MASK)))\n\t\t\treturn 1;\n\t\treturn 0;\n\t}\n\n\tif (arg == next_arg) {\n\t\tif (((next_argw - argw) <= SIMM_16BIT_MAX\n\t\t\t\t&& (next_argw - argw) >= SIMM_16BIT_MIN))\n\t\t\treturn 1;\n\n\t\treturn 0;\n\t}\n\n\treturn 0;\n}\n\n/* Emit the necessary instructions. See can_cache above. */\nstatic sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)\n{\n\tsljit_s32 tmp_ar, base;\n\n\tSLJIT_ASSERT(arg & SLJIT_MEM);\n\tif (!(next_arg & SLJIT_MEM)) {\n\t\tnext_arg = 0;\n\t\tnext_argw = 0;\n\t}\n\n\tif ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA))\n\t\ttmp_ar = reg_ar;\n\telse\n\t\ttmp_ar = TMP_REG1_mapped;\n\n\tbase = arg & REG_MASK;\n\n\tif (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {\n\t\targw &= 0x3;\n\n\t\tif ((flags & WRITE_BACK) && reg_ar == reg_map[base]) {\n\t\t\tSLJIT_ASSERT(!(flags & LOAD_DATA) && reg_map[TMP_REG1] != reg_ar);\n\t\t\tFAIL_IF(ADD(TMP_REG1_mapped, reg_ar, ZERO));\n\t\t\treg_ar = TMP_REG1_mapped;\n\t\t}\n\n\t\t/* Using the cache. */\n\t\tif (argw == compiler->cache_argw) {\n\t\t\tif (!(flags & WRITE_BACK)) {\n\t\t\t\tif (arg == compiler->cache_arg) {\n\t\t\t\t\tif (flags & LOAD_DATA)\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar);\n\t\t\t\t}\n\n\t\t\t\tif ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) {\n\t\t\t\t\tif (arg == next_arg && argw == (next_argw & 0x3)) {\n\t\t\t\t\t\tcompiler->cache_arg = arg;\n\t\t\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\t\t\tFAIL_IF(ADD(TMP_REG3_mapped, reg_map[base], TMP_REG3_mapped));\n\t\t\t\t\t\tif (flags & LOAD_DATA)\n\t\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar);\n\t\t\t\t\t}\n\n\t\t\t\t\tFAIL_IF(ADD(tmp_ar, reg_map[base], TMP_REG3_mapped));\n\t\t\t\t\tif (flags & LOAD_DATA)\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((SLJIT_MEM | (arg & OFFS_REG_MASK)) == compiler->cache_arg) {\n\t\t\t\t\tFAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped));\n\t\t\t\t\tif (flags & LOAD_DATA)\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]);\n\t\t\t\t\telse\n\t\t\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (SLJIT_UNLIKELY(argw)) {\n\t\t\tcompiler->cache_arg = SLJIT_MEM | (arg & OFFS_REG_MASK);\n\t\t\tcompiler->cache_argw = argw;\n\t\t\tFAIL_IF(SHLI(TMP_REG3_mapped, reg_map[OFFS_REG(arg)], argw));\n\t\t}\n\n\t\tif (!(flags & WRITE_BACK)) {\n\t\t\tif (arg == next_arg && argw == (next_argw & 0x3)) {\n\t\t\t\tcompiler->cache_arg = arg;\n\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\tFAIL_IF(ADD(TMP_REG3_mapped, reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3]));\n\t\t\t\ttmp_ar = TMP_REG3_mapped;\n\t\t\t} else\n\t\t\t\tFAIL_IF(ADD(tmp_ar, reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3]));\n\n\t\t\tif (flags & LOAD_DATA)\n\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar);\n\t\t\telse\n\t\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar);\n\t\t}\n\n\t\tFAIL_IF(ADD(reg_map[base], reg_map[base], reg_map[!argw ? OFFS_REG(arg) : TMP_REG3]));\n\n\t\tif (flags & LOAD_DATA)\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]);\n\t\telse\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar);\n\t}\n\n\tif (SLJIT_UNLIKELY(flags & WRITE_BACK) && base) {\n\t\t/* Update only applies if a base register exists. */\n\t\tif (reg_ar == reg_map[base]) {\n\t\t\tSLJIT_ASSERT(!(flags & LOAD_DATA) && TMP_REG1_mapped != reg_ar);\n\t\t\tif (argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) {\n\t\t\t\tFAIL_IF(ADDLI(ADDR_TMP_mapped, reg_map[base], argw));\n\t\t\t\tif (flags & LOAD_DATA)\n\t\t\t\t\tFAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, ADDR_TMP_mapped));\n\t\t\t\telse\n\t\t\t\t\tFAIL_IF(PB2(data_transfer_insts[flags & MEM_MASK], ADDR_TMP_mapped, reg_ar));\n\n\t\t\t\tif (argw)\n\t\t\t\t\treturn ADDLI(reg_map[base], reg_map[base], argw);\n\n\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\t}\n\n\t\t\tFAIL_IF(ADD(TMP_REG1_mapped, reg_ar, ZERO));\n\t\t\treg_ar = TMP_REG1_mapped;\n\t\t}\n\n\t\tif (argw <= SIMM_16BIT_MAX && argw >= SIMM_16BIT_MIN) {\n\t\t\tif (argw)\n\t\t\t\tFAIL_IF(ADDLI(reg_map[base], reg_map[base], argw));\n\t\t} else {\n\t\t\tif (compiler->cache_arg == SLJIT_MEM\n\t\t\t\t\t&& argw - compiler->cache_argw <= SIMM_16BIT_MAX\n\t\t\t\t\t&& argw - compiler->cache_argw >= SIMM_16BIT_MIN) {\n\t\t\t\tif (argw != compiler->cache_argw) {\n\t\t\t\t\tFAIL_IF(ADD(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw));\n\t\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\t}\n\n\t\t\t\tFAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped));\n\t\t\t} else {\n\t\t\t\tcompiler->cache_arg = SLJIT_MEM;\n\t\t\t\tcompiler->cache_argw = argw;\n\t\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG3_mapped, argw));\n\t\t\t\tFAIL_IF(ADD(reg_map[base], reg_map[base], TMP_REG3_mapped));\n\t\t\t}\n\t\t}\n\n\t\tif (flags & LOAD_DATA)\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, reg_map[base]);\n\t\telse\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_map[base], reg_ar);\n\t}\n\n\tif (compiler->cache_arg == arg\n\t\t\t&& argw - compiler->cache_argw <= SIMM_16BIT_MAX\n\t\t\t&& argw - compiler->cache_argw >= SIMM_16BIT_MIN) {\n\t\tif (argw != compiler->cache_argw) {\n\t\t\tFAIL_IF(ADDLI(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw));\n\t\t\tcompiler->cache_argw = argw;\n\t\t}\n\n\t\tif (flags & LOAD_DATA)\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped);\n\t\telse\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar);\n\t}\n\n\tif (compiler->cache_arg == SLJIT_MEM\n\t\t\t&& argw - compiler->cache_argw <= SIMM_16BIT_MAX\n\t\t\t&& argw - compiler->cache_argw >= SIMM_16BIT_MIN) {\n\t\tif (argw != compiler->cache_argw)\n\t\t\tFAIL_IF(ADDLI(TMP_REG3_mapped, TMP_REG3_mapped, argw - compiler->cache_argw));\n\t} else {\n\t\tcompiler->cache_arg = SLJIT_MEM;\n\t\tFAIL_IF(load_immediate(compiler, TMP_REG3_mapped, argw));\n\t}\n\n\tcompiler->cache_argw = argw;\n\n\tif (!base) {\n\t\tif (flags & LOAD_DATA)\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped);\n\t\telse\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar);\n\t}\n\n\tif (arg == next_arg\n\t\t\t&& next_argw - argw <= SIMM_16BIT_MAX\n\t\t\t&& next_argw - argw >= SIMM_16BIT_MIN) {\n\t\tcompiler->cache_arg = arg;\n\t\tFAIL_IF(ADD(TMP_REG3_mapped, TMP_REG3_mapped, reg_map[base]));\n\t\tif (flags & LOAD_DATA)\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, TMP_REG3_mapped);\n\t\telse\n\t\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], TMP_REG3_mapped, reg_ar);\n\t}\n\n\tFAIL_IF(ADD(tmp_ar, TMP_REG3_mapped, reg_map[base]));\n\n\tif (flags & LOAD_DATA)\n\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], reg_ar, tmp_ar);\n\telse\n\t\treturn PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)\n{\n\tif (getput_arg_fast(compiler, flags, reg_ar, arg, argw))\n\t\treturn compiler->error;\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\treturn getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)\n{\n\tif (getput_arg_fast(compiler, flags, reg, arg1, arg1w))\n\t\treturn compiler->error;\n\treturn getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\t/* For UNUSED dst. Uncommon, but possible. */\n\tif (dst == SLJIT_UNUSED)\n\t\treturn SLJIT_SUCCESS;\n\n\tif (FAST_IS_REG(dst))\n\t\treturn ADD(reg_map[dst], RA, ZERO);\n\n\t/* Memory. */\n\treturn emit_op_mem(compiler, WORD_DATA, RA, dst, dstw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src))\n\t\tFAIL_IF(ADD(RA, reg_map[src], ZERO));\n\n\telse if (src & SLJIT_MEM)\n\t\tFAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RA, src, srcw));\n\n\telse if (src & SLJIT_IMM)\n\t\tFAIL_IF(load_immediate(compiler, RA, srcw));\n\n\treturn JR(RA);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_s32 src1, sljit_sw src2)\n{\n\tsljit_s32 overflow_ra = 0;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (dst != src2)\n\t\t\treturn ADD(reg_map[dst], reg_map[src2], ZERO);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U32:\n\tcase SLJIT_MOV_S32:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S32)\n\t\t\t\treturn BFEXTS(reg_map[dst], reg_map[src2], 0, 31);\n\n\t\t\treturn BFEXTU(reg_map[dst], reg_map[src2], 0, 31);\n\t\t} else if (dst != src2) {\n\t\t\tSLJIT_ASSERT(src2 == 0);\n\t\t\treturn ADD(reg_map[dst], reg_map[src2], ZERO);\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U8:\n\tcase SLJIT_MOV_S8:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S8)\n\t\t\t\treturn BFEXTS(reg_map[dst], reg_map[src2], 0, 7);\n\n\t\t\treturn BFEXTU(reg_map[dst], reg_map[src2], 0, 7);\n\t\t} else if (dst != src2) {\n\t\t\tSLJIT_ASSERT(src2 == 0);\n\t\t\treturn ADD(reg_map[dst], reg_map[src2], ZERO);\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MOV_U16:\n\tcase SLJIT_MOV_S16:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {\n\t\t\tif (op == SLJIT_MOV_S16)\n\t\t\t\treturn BFEXTS(reg_map[dst], reg_map[src2], 0, 15);\n\n\t\t\treturn BFEXTU(reg_map[dst], reg_map[src2], 0, 15);\n\t\t} else if (dst != src2) {\n\t\t\tSLJIT_ASSERT(src2 == 0);\n\t\t\treturn ADD(reg_map[dst], reg_map[src2], ZERO);\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_NOT:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (op & SLJIT_SET_E)\n\t\t\tFAIL_IF(NOR(EQUAL_FLAG, reg_map[src2], reg_map[src2]));\n\t\tif (CHECK_FLAGS(SLJIT_SET_E))\n\t\t\tFAIL_IF(NOR(reg_map[dst], reg_map[src2], reg_map[src2]));\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_CLZ:\n\t\tSLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));\n\t\tif (op & SLJIT_SET_E)\n\t\t\tFAIL_IF(CLZ(EQUAL_FLAG, reg_map[src2]));\n\t\tif (CHECK_FLAGS(SLJIT_SET_E))\n\t\t\tFAIL_IF(CLZ(reg_map[dst], reg_map[src2]));\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ADD:\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(SHRUI(TMP_EREG1, reg_map[src1], 63));\n\t\t\t\tif (src2 < 0)\n\t\t\t\t\tFAIL_IF(XORI(TMP_EREG1, TMP_EREG1, 1));\n\t\t\t}\n\n\t\t\tif (op & SLJIT_SET_E)\n\t\t\t\tFAIL_IF(ADDLI(EQUAL_FLAG, reg_map[src1], src2));\n\n\t\t\tif (op & SLJIT_SET_C) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(ORI(ULESS_FLAG ,reg_map[src1], src2));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(ADDLI(ULESS_FLAG ,ZERO, src2));\n\t\t\t\t\tFAIL_IF(OR(ULESS_FLAG,reg_map[src1],ULESS_FLAG));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (CHECK_FLAGS(SLJIT_SET_E))\n\t\t\t\tFAIL_IF(ADDLI(reg_map[dst], reg_map[src1], src2));\n\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(SHRUI(OVERFLOW_FLAG, reg_map[dst], 63));\n\n\t\t\t\tif (src2 < 0)\n\t\t\t\t\tFAIL_IF(XORI(OVERFLOW_FLAG, OVERFLOW_FLAG, 1));\n\t\t\t}\n\t\t} else {\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(XOR(TMP_EREG1, reg_map[src1], reg_map[src2]));\n\t\t\t\tFAIL_IF(SHRUI(TMP_EREG1, TMP_EREG1, 63));\n\n\t\t\t\tif (src1 != dst)\n\t\t\t\t\toverflow_ra = reg_map[src1];\n\t\t\t\telse if (src2 != dst)\n\t\t\t\t\toverflow_ra = reg_map[src2];\n\t\t\t\telse {\n\t\t\t\t\t/* Rare ocasion. */\n\t\t\t\t\tFAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO));\n\t\t\t\t\toverflow_ra = TMP_EREG2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (op & SLJIT_SET_E)\n\t\t\t\tFAIL_IF(ADD(EQUAL_FLAG ,reg_map[src1], reg_map[src2]));\n\n\t\t\tif (op & SLJIT_SET_C)\n\t\t\t\tFAIL_IF(OR(ULESS_FLAG,reg_map[src1], reg_map[src2]));\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (CHECK_FLAGS(SLJIT_SET_E))\n\t\t\t\tFAIL_IF(ADD(reg_map[dst],reg_map[src1], reg_map[src2]));\n\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(XOR(OVERFLOW_FLAG,reg_map[dst], overflow_ra));\n\t\t\t\tFAIL_IF(SHRUI(OVERFLOW_FLAG, OVERFLOW_FLAG, 63));\n\t\t\t}\n\t\t}\n\n\t\t/* a + b >= a | b (otherwise, the carry should be set to 1). */\n\t\tif (op & SLJIT_SET_C)\n\t\t\tFAIL_IF(CMPLTU(ULESS_FLAG ,reg_map[dst] ,ULESS_FLAG));\n\n\t\tif (op & SLJIT_SET_O)\n\t\t\treturn CMOVNEZ(OVERFLOW_FLAG, TMP_EREG1, ZERO);\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ADDC:\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (op & SLJIT_SET_C) {\n\t\t\t\tif (src2 >= 0)\n\t\t\t\t\tFAIL_IF(ORI(TMP_EREG1, reg_map[src1], src2));\n\t\t\t\telse {\n\t\t\t\t\tFAIL_IF(ADDLI(TMP_EREG1, ZERO, src2));\n\t\t\t\t\tFAIL_IF(OR(TMP_EREG1, reg_map[src1], TMP_EREG1));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tFAIL_IF(ADDLI(reg_map[dst], reg_map[src1], src2));\n\n\t\t} else {\n\t\t\tif (op & SLJIT_SET_C)\n\t\t\t\tFAIL_IF(OR(TMP_EREG1, reg_map[src1], reg_map[src2]));\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(ADD(reg_map[dst], reg_map[src1], reg_map[src2]));\n\t\t}\n\n\t\tif (op & SLJIT_SET_C)\n\t\t\tFAIL_IF(CMPLTU(TMP_EREG1, reg_map[dst], TMP_EREG1));\n\n\t\tFAIL_IF(ADD(reg_map[dst], reg_map[dst], ULESS_FLAG));\n\n\t\tif (!(op & SLJIT_SET_C))\n\t\t\treturn SLJIT_SUCCESS;\n\n\t\t/* Set TMP_EREG2 (dst == 0) && (ULESS_FLAG == 1). */\n\t\tFAIL_IF(CMPLTUI(TMP_EREG2, reg_map[dst], 1));\n\t\tFAIL_IF(AND(TMP_EREG2, TMP_EREG2, ULESS_FLAG));\n\t\t/* Set carry flag. */\n\t\treturn OR(ULESS_FLAG, TMP_EREG2, TMP_EREG1);\n\n\tcase SLJIT_SUB:\n\t\tif ((flags & SRC2_IMM) && ((op & (SLJIT_SET_U | SLJIT_SET_S)) || src2 == SIMM_16BIT_MIN)) {\n\t\t\tFAIL_IF(ADDLI(TMP_REG2_mapped, ZERO, src2));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(SHRUI(TMP_EREG1,reg_map[src1], 63));\n\n\t\t\t\tif (src2 < 0)\n\t\t\t\t\tFAIL_IF(XORI(TMP_EREG1, TMP_EREG1, 1));\n\n\t\t\t\tif (src1 != dst)\n\t\t\t\t\toverflow_ra = reg_map[src1];\n\t\t\t\telse {\n\t\t\t\t\t/* Rare ocasion. */\n\t\t\t\t\tFAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO));\n\t\t\t\t\toverflow_ra = TMP_EREG2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (op & SLJIT_SET_E)\n\t\t\t\tFAIL_IF(ADDLI(EQUAL_FLAG, reg_map[src1], -src2));\n\n\t\t\tif (op & SLJIT_SET_C) {\n\t\t\t\tFAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, src2));\n\t\t\t\tFAIL_IF(CMPLTU(ULESS_FLAG, reg_map[src1], ADDR_TMP_mapped));\n\t\t\t}\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (CHECK_FLAGS(SLJIT_SET_E))\n\t\t\t\tFAIL_IF(ADDLI(reg_map[dst], reg_map[src1], -src2));\n\n\t\t} else {\n\n\t\t\tif (op & SLJIT_SET_O) {\n\t\t\t\tFAIL_IF(XOR(TMP_EREG1, reg_map[src1], reg_map[src2]));\n\t\t\t\tFAIL_IF(SHRUI(TMP_EREG1, TMP_EREG1, 63));\n\n\t\t\t\tif (src1 != dst)\n\t\t\t\t\toverflow_ra = reg_map[src1];\n\t\t\t\telse {\n\t\t\t\t\t/* Rare ocasion. */\n\t\t\t\t\tFAIL_IF(ADD(TMP_EREG2, reg_map[src1], ZERO));\n\t\t\t\t\toverflow_ra = TMP_EREG2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (op & SLJIT_SET_E)\n\t\t\t\tFAIL_IF(SUB(EQUAL_FLAG, reg_map[src1], reg_map[src2]));\n\n\t\t\tif (op & (SLJIT_SET_U | SLJIT_SET_C))\n\t\t\t\tFAIL_IF(CMPLTU(ULESS_FLAG, reg_map[src1], reg_map[src2]));\n\n\t\t\tif (op & SLJIT_SET_U)\n\t\t\t\tFAIL_IF(CMPLTU(UGREATER_FLAG, reg_map[src2], reg_map[src1]));\n\n\t\t\tif (op & SLJIT_SET_S) {\n\t\t\t\tFAIL_IF(CMPLTS(LESS_FLAG ,reg_map[src1] ,reg_map[src2]));\n\t\t\t\tFAIL_IF(CMPLTS(GREATER_FLAG ,reg_map[src2] ,reg_map[src1]));\n\t\t\t}\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tif (CHECK_FLAGS(SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S | SLJIT_SET_C))\n\t\t\t\tFAIL_IF(SUB(reg_map[dst], reg_map[src1], reg_map[src2]));\n\t\t}\n\n\t\tif (op & SLJIT_SET_O) {\n\t\t\tFAIL_IF(XOR(OVERFLOW_FLAG, reg_map[dst], overflow_ra));\n\t\t\tFAIL_IF(SHRUI(OVERFLOW_FLAG, OVERFLOW_FLAG, 63));\n\t\t\treturn CMOVEQZ(OVERFLOW_FLAG, TMP_EREG1, ZERO);\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_SUBC:\n\t\tif ((flags & SRC2_IMM) && src2 == SIMM_16BIT_MIN) {\n\t\t\tFAIL_IF(ADDLI(TMP_REG2_mapped, ZERO, src2));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tif (flags & SRC2_IMM) {\n\t\t\tif (op & SLJIT_SET_C) {\n\t\t\t\tFAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, -src2));\n\t\t\t\tFAIL_IF(CMPLTU(TMP_EREG1, reg_map[src1], ADDR_TMP_mapped));\n\t\t\t}\n\n\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(ADDLI(reg_map[dst], reg_map[src1], -src2));\n\n\t\t} else {\n\t\t\tif (op & SLJIT_SET_C)\n\t\t\t\tFAIL_IF(CMPLTU(TMP_EREG1, reg_map[src1], reg_map[src2]));\n\t\t\t\t/* dst may be the same as src1 or src2. */\n\t\t\tFAIL_IF(SUB(reg_map[dst], reg_map[src1], reg_map[src2]));\n\t\t}\n\n\t\tif (op & SLJIT_SET_C)\n\t\t\tFAIL_IF(CMOVEQZ(TMP_EREG1, reg_map[dst], ULESS_FLAG));\n\n\t\tFAIL_IF(SUB(reg_map[dst], reg_map[dst], ULESS_FLAG));\n\n\t\tif (op & SLJIT_SET_C)\n\t\t\tFAIL_IF(ADD(ULESS_FLAG, TMP_EREG1, ZERO));\n\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_MUL:\n\t\tif (flags & SRC2_IMM) {\n\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG2_mapped, src2));\n\t\t\tsrc2 = TMP_REG2;\n\t\t\tflags &= ~SRC2_IMM;\n\t\t}\n\n\t\tFAIL_IF(MUL(reg_map[dst], reg_map[src1], reg_map[src2]));\n\n\t\treturn SLJIT_SUCCESS;\n\n#define EMIT_LOGICAL(op_imm, op_norm) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tFAIL_IF(load_immediate(compiler, ADDR_TMP_mapped, src2)); \\\n\t\tif (op & SLJIT_SET_E) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, EQUAL_FLAG, reg_map[src1], \\\n\t\t\t\tADDR_TMP_mapped, __LINE__)); \\\n\t\tif (CHECK_FLAGS(SLJIT_SET_E)) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, reg_map[dst], reg_map[src1], \\\n\t\t\t\tADDR_TMP_mapped, __LINE__)); \\\n\t} else { \\\n\t\tif (op & SLJIT_SET_E) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, EQUAL_FLAG, reg_map[src1], \\\n\t\t\t\treg_map[src2], __LINE__)); \\\n\t\tif (CHECK_FLAGS(SLJIT_SET_E)) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, reg_map[dst], reg_map[src1], \\\n\t\t\t\treg_map[src2], __LINE__)); \\\n\t}\n\n\tcase SLJIT_AND:\n\t\tEMIT_LOGICAL(TILEGX_OPC_ANDI, TILEGX_OPC_AND);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_OR:\n\t\tEMIT_LOGICAL(TILEGX_OPC_ORI, TILEGX_OPC_OR);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_XOR:\n\t\tEMIT_LOGICAL(TILEGX_OPC_XORI, TILEGX_OPC_XOR);\n\t\treturn SLJIT_SUCCESS;\n\n#define EMIT_SHIFT(op_imm, op_norm) \\\n\tif (flags & SRC2_IMM) { \\\n\t\tif (op & SLJIT_SET_E) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_imm, EQUAL_FLAG, reg_map[src1], \\\n\t\t\t\tsrc2 & 0x3F, __LINE__)); \\\n\t\tif (CHECK_FLAGS(SLJIT_SET_E)) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_imm, reg_map[dst], reg_map[src1], \\\n\t\t\t\tsrc2 & 0x3F, __LINE__)); \\\n\t} else { \\\n\t\tif (op & SLJIT_SET_E) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, EQUAL_FLAG, reg_map[src1], \\\n\t\t\t\treg_map[src2], __LINE__)); \\\n\t\tif (CHECK_FLAGS(SLJIT_SET_E)) \\\n\t\t\tFAIL_IF(push_3_buffer( \\\n\t\t\t\tcompiler, op_norm, reg_map[dst], reg_map[src1], \\\n\t\t\t\treg_map[src2], __LINE__)); \\\n\t}\n\n\tcase SLJIT_SHL:\n\t\tEMIT_SHIFT(TILEGX_OPC_SHLI, TILEGX_OPC_SHL);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_LSHR:\n\t\tEMIT_SHIFT(TILEGX_OPC_SHRUI, TILEGX_OPC_SHRU);\n\t\treturn SLJIT_SUCCESS;\n\n\tcase SLJIT_ASHR:\n\t\tEMIT_SHIFT(TILEGX_OPC_SHRSI, TILEGX_OPC_SHRS);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tSLJIT_UNREACHABLE();\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)\n{\n\t/* arg1 goes to TMP_REG1 or src reg.\n\t   arg2 goes to TMP_REG2, imm or src reg.\n\t   TMP_REG3 can be used for caching.\n\t   result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */\n\tsljit_s32 dst_r = TMP_REG2;\n\tsljit_s32 src1_r;\n\tsljit_sw src2_r = 0;\n\tsljit_s32 sugg_src2_r = TMP_REG2;\n\n\tif (!(flags & ALT_KEEP_CACHE)) {\n\t\tcompiler->cache_arg = 0;\n\t\tcompiler->cache_argw = 0;\n\t}\n\n\tif (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {\n\t\tif (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))\n\t\t\treturn SLJIT_SUCCESS;\n\t\tif (GET_FLAGS(op))\n\t\t\tflags |= UNUSED_DEST;\n\t} else if (FAST_IS_REG(dst)) {\n\t\tdst_r = dst;\n\t\tflags |= REG_DEST;\n\t\tif (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)\n\t\t\tsugg_src2_r = dst_r;\n\t} else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1_mapped, dst, dstw))\n\t\tflags |= SLOW_DEST;\n\n\tif (flags & IMM_OP) {\n\t\tif ((src2 & SLJIT_IMM) && src2w) {\n\t\t\tif ((!(flags & LOGICAL_OP)\n\t\t\t\t\t&& (src2w <= SIMM_16BIT_MAX && src2w >= SIMM_16BIT_MIN))\n\t\t\t\t\t|| ((flags & LOGICAL_OP) && !(src2w & ~UIMM_16BIT_MAX))) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src2w;\n\t\t\t}\n\t\t}\n\n\t\tif (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) {\n\t\t\tif ((!(flags & LOGICAL_OP)\n\t\t\t\t\t&& (src1w <= SIMM_16BIT_MAX && src1w >= SIMM_16BIT_MIN))\n\t\t\t\t\t|| ((flags & LOGICAL_OP) && !(src1w & ~UIMM_16BIT_MAX))) {\n\t\t\t\tflags |= SRC2_IMM;\n\t\t\t\tsrc2_r = src1w;\n\n\t\t\t\t/* And swap arguments. */\n\t\t\t\tsrc1 = src2;\n\t\t\t\tsrc1w = src2w;\n\t\t\t\tsrc2 = SLJIT_IMM;\n\t\t\t\t/* src2w = src2_r unneeded. */\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Source 1. */\n\tif (FAST_IS_REG(src1)) {\n\t\tsrc1_r = src1;\n\t\tflags |= REG1_SOURCE;\n\t} else if (src1 & SLJIT_IMM) {\n\t\tif (src1w) {\n\t\t\tFAIL_IF(load_immediate(compiler, TMP_REG1_mapped, src1w));\n\t\t\tsrc1_r = TMP_REG1;\n\t\t} else\n\t\t\tsrc1_r = 0;\n\t} else {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC1;\n\t\tsrc1_r = TMP_REG1;\n\t}\n\n\t/* Source 2. */\n\tif (FAST_IS_REG(src2)) {\n\t\tsrc2_r = src2;\n\t\tflags |= REG2_SOURCE;\n\t\tif (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)\n\t\t\tdst_r = src2_r;\n\t} else if (src2 & SLJIT_IMM) {\n\t\tif (!(flags & SRC2_IMM)) {\n\t\t\tif (src2w) {\n\t\t\t\tFAIL_IF(load_immediate(compiler, reg_map[sugg_src2_r], src2w));\n\t\t\t\tsrc2_r = sugg_src2_r;\n\t\t\t} else {\n\t\t\t\tsrc2_r = 0;\n\t\t\t\tif ((op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) && (dst & SLJIT_MEM))\n\t\t\t\t\tdst_r = 0;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (getput_arg_fast(compiler, flags | LOAD_DATA, reg_map[sugg_src2_r], src2, src2w))\n\t\t\tFAIL_IF(compiler->error);\n\t\telse\n\t\t\tflags |= SLOW_SRC2;\n\t\tsrc2_r = sugg_src2_r;\n\t}\n\n\tif ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {\n\t\tSLJIT_ASSERT(src2_r == TMP_REG2);\n\t\tif (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2_mapped, src2, src2w, src1, src1w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, dst, dstw));\n\t\t} else {\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, src2, src2w));\n\t\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG2_mapped, src2, src2w, dst, dstw));\n\t\t}\n\t} else if (flags & SLOW_SRC1)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, TMP_REG1_mapped, src1, src1w, dst, dstw));\n\telse if (flags & SLOW_SRC2)\n\t\tFAIL_IF(getput_arg(compiler, flags | LOAD_DATA, reg_map[sugg_src2_r], src2, src2w, dst, dstw));\n\n\tFAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r));\n\n\tif (dst & SLJIT_MEM) {\n\t\tif (!(flags & SLOW_DEST)) {\n\t\t\tgetput_arg_fast(compiler, flags, reg_map[dst_r], dst, dstw);\n\t\t\treturn compiler->error;\n\t\t}\n\n\t\treturn getput_arg(compiler, flags, reg_map[dst_r], dst, dstw, 0, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw, sljit_s32 type)\n{\n\tsljit_s32 sugg_dst_ar, dst_ar;\n\tsljit_s32 flags = GET_ALL_FLAGS(op);\n\tsljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\top = GET_OPCODE(op);\n\tif (op == SLJIT_MOV_S32 || op == SLJIT_MOV_U32)\n\t\tmem_type = INT_DATA | SIGNED_DATA;\n\tsugg_dst_ar = reg_map[(op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2];\n\n\tcompiler->cache_arg = 0;\n\tcompiler->cache_argw = 0;\n\tif (op >= SLJIT_ADD && (src & SLJIT_MEM)) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tFAIL_IF(emit_op_mem2(compiler, mem_type | LOAD_DATA, TMP_REG1_mapped, src, srcw, dst, dstw));\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tswitch (type & 0xff) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_NOT_EQUAL:\n\t\tFAIL_IF(CMPLTUI(sugg_dst_ar, EQUAL_FLAG, 1));\n\t\tdst_ar = sugg_dst_ar;\n\t\tbreak;\n\tcase SLJIT_LESS:\n\tcase SLJIT_GREATER_EQUAL:\n\t\tdst_ar = ULESS_FLAG;\n\t\tbreak;\n\tcase SLJIT_GREATER:\n\tcase SLJIT_LESS_EQUAL:\n\t\tdst_ar = UGREATER_FLAG;\n\t\tbreak;\n\tcase SLJIT_SIG_LESS:\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\tdst_ar = LESS_FLAG;\n\t\tbreak;\n\tcase SLJIT_SIG_GREATER:\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\tdst_ar = GREATER_FLAG;\n\t\tbreak;\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_NOT_OVERFLOW:\n\t\tdst_ar = OVERFLOW_FLAG;\n\t\tbreak;\n\tcase SLJIT_MUL_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tFAIL_IF(CMPLTUI(sugg_dst_ar, OVERFLOW_FLAG, 1));\n\t\tdst_ar = sugg_dst_ar;\n\t\ttype ^= 0x1; /* Flip type bit for the XORI below. */\n\t\tbreak;\n\n\tdefault:\n\t\tSLJIT_UNREACHABLE();\n\t\tdst_ar = sugg_dst_ar;\n\t\tbreak;\n\t}\n\n\tif (type & 0x1) {\n\t\tFAIL_IF(XORI(sugg_dst_ar, dst_ar, 1));\n\t\tdst_ar = sugg_dst_ar;\n\t}\n\n\tif (op >= SLJIT_ADD) {\n\t\tif (TMP_REG2_mapped != dst_ar)\n\t\t\tFAIL_IF(ADD(TMP_REG2_mapped, dst_ar, ZERO));\n\t\treturn emit_op(compiler, op | flags, mem_type | CUMULATIVE_OP | LOGICAL_OP | IMM_OP | ALT_KEEP_CACHE, dst, dstw, src, srcw, TMP_REG2, 0);\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_op_mem(compiler, mem_type, dst_ar, dst, dstw);\n\n\tif (sugg_dst_ar != dst_ar)\n\t\treturn ADD(sugg_dst_ar, dst_ar, ZERO);\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) {\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\top = GET_OPCODE(op);\n\tswitch (op) {\n\tcase SLJIT_NOP:\n\t\treturn push_0_buffer(compiler, TILEGX_OPC_FNOP, __LINE__);\n\n\tcase SLJIT_BREAKPOINT:\n\t\treturn PI(BPT);\n\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n\t\tSLJIT_UNREACHABLE();\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_MOV:\n\tcase SLJIT_MOV_P:\n\t\treturn emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U32:\n\t\treturn emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_S32:\n\t\treturn emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOV_U8:\n\t\treturn emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw);\n\n\tcase SLJIT_MOV_S8:\n\t\treturn emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw);\n\n\tcase SLJIT_MOV_U16:\n\t\treturn emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw);\n\n\tcase SLJIT_MOV_S16:\n\t\treturn emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw);\n\n\tcase SLJIT_MOVU:\n\tcase SLJIT_MOVU_P:\n\t\treturn emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOVU_U32:\n\t\treturn emit_op(compiler, SLJIT_MOV_U32, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOVU_S32:\n\t\treturn emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_MOVU_U8:\n\t\treturn emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw);\n\n\tcase SLJIT_MOVU_S8:\n\t\treturn emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw);\n\n\tcase SLJIT_MOVU_U16:\n\t\treturn emit_op(compiler, SLJIT_MOV_U16, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw);\n\n\tcase SLJIT_MOVU_S16:\n\t\treturn emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw);\n\n\tcase SLJIT_NOT:\n\t\treturn emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw);\n\n\tcase SLJIT_NEG:\n\t\treturn emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw);\n\n\tcase SLJIT_CLZ:\n\t\treturn emit_op(compiler, op, (op & SLJIT_I32_OP) ? INT_DATA : WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD:\n\tcase SLJIT_ADDC:\n\t\treturn emit_op(compiler, op, CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SUB:\n\tcase SLJIT_SUBC:\n\t\treturn emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_MUL:\n\t\treturn emit_op(compiler, op, CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_AND:\n\tcase SLJIT_OR:\n\tcase SLJIT_XOR:\n\t\treturn emit_op(compiler, op, CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\n\tcase SLJIT_SHL:\n\tcase SLJIT_LSHR:\n\tcase SLJIT_ASHR:\n\t\tif (src2 & SLJIT_IMM)\n\t\t\tsrc2w &= 0x3f;\n\t\tif (op & SLJIT_I32_OP)\n\t\t\tsrc2w &= 0x1f;\n\n\t\treturn emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label * sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tstruct sljit_label *label;\n\n\tflush_buffer(compiler);\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label *)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\treturn label;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 src_r = TMP_REG2;\n\tstruct sljit_jump *jump = NULL;\n\n\tflush_buffer(compiler);\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src)) {\n\t\tif (reg_map[src] != 0)\n\t\t\tsrc_r = src;\n\t\telse\n\t\t\tFAIL_IF(ADD_SOLO(TMP_REG2_mapped, reg_map[src], ZERO));\n\t}\n\n\tif (type >= SLJIT_CALL0) {\n\t\tSLJIT_ASSERT(reg_map[PIC_ADDR_REG] == 16 && PIC_ADDR_REG == TMP_REG2);\n\t\tif (src & (SLJIT_IMM | SLJIT_MEM)) {\n\t\t\tif (src & SLJIT_IMM)\n\t\t\t\tFAIL_IF(emit_const(compiler, reg_map[PIC_ADDR_REG], srcw, 1));\n\t\t\telse {\n\t\t\t\tSLJIT_ASSERT(src_r == TMP_REG2 && (src & SLJIT_MEM));\n\t\t\t\tFAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));\n\t\t\t}\n\n\t\t\tFAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO));\n\n\t\t\tFAIL_IF(ADDI_SOLO(54, 54, -16));\n\n\t\t\tFAIL_IF(JALR_SOLO(reg_map[PIC_ADDR_REG]));\n\n\t\t\treturn ADDI_SOLO(54, 54, 16);\n\t\t}\n\n\t\t/* Register input. */\n\t\tif (type >= SLJIT_CALL1)\n\t\t\tFAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO));\n\n\t\tFAIL_IF(ADD_SOLO(reg_map[PIC_ADDR_REG], reg_map[src_r], ZERO));\n\n\t\tFAIL_IF(ADDI_SOLO(54, 54, -16));\n\n\t\tFAIL_IF(JALR_SOLO(reg_map[src_r]));\n\n\t\treturn ADDI_SOLO(54, 54, 16);\n\t}\n\n\tif (src & SLJIT_IMM) {\n\t\tjump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\t\tFAIL_IF(!jump);\n\t\tset_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0));\n\t\tjump->u.target = srcw;\n\t\tFAIL_IF(emit_const(compiler, TMP_REG2_mapped, 0, 1));\n\n\t\tif (type >= SLJIT_FAST_CALL) {\n\t\t\tFAIL_IF(ADD_SOLO(ZERO, ZERO, ZERO));\n\t\t\tjump->addr = compiler->size;\n\t\t\tFAIL_IF(JR_SOLO(reg_map[src_r]));\n\t\t} else {\n\t\t\tjump->addr = compiler->size;\n\t\t\tFAIL_IF(JR_SOLO(reg_map[src_r]));\n\t\t}\n\n\t\treturn SLJIT_SUCCESS;\n\n\t} else if (src & SLJIT_MEM) {\n\t\tFAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));\n\t\tflush_buffer(compiler);\n\t}\n\n\tFAIL_IF(JR_SOLO(reg_map[src_r]));\n\n\tif (jump)\n\t\tjump->addr = compiler->size;\n\n\treturn SLJIT_SUCCESS;\n}\n\n#define BR_Z(src) \\\n\tinst = BEQZ_X1 | SRCA_X1(src); \\\n\tflags = IS_COND;\n\n#define BR_NZ(src) \\\n\tinst = BNEZ_X1 | SRCA_X1(src); \\\n\tflags = IS_COND;\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tstruct sljit_jump *jump;\n\tsljit_ins inst;\n\tsljit_s32 flags = 0;\n\n\tflush_buffer(compiler);\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump *)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF(!jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\t\tBR_NZ(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_NOT_EQUAL:\n\t\tBR_Z(EQUAL_FLAG);\n\t\tbreak;\n\tcase SLJIT_LESS:\n\t\tBR_Z(ULESS_FLAG);\n\t\tbreak;\n\tcase SLJIT_GREATER_EQUAL:\n\t\tBR_NZ(ULESS_FLAG);\n\t\tbreak;\n\tcase SLJIT_GREATER:\n\t\tBR_Z(UGREATER_FLAG);\n\t\tbreak;\n\tcase SLJIT_LESS_EQUAL:\n\t\tBR_NZ(UGREATER_FLAG);\n\t\tbreak;\n\tcase SLJIT_SIG_LESS:\n\t\tBR_Z(LESS_FLAG);\n\t\tbreak;\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\tBR_NZ(LESS_FLAG);\n\t\tbreak;\n\tcase SLJIT_SIG_GREATER:\n\t\tBR_Z(GREATER_FLAG);\n\t\tbreak;\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\tBR_NZ(GREATER_FLAG);\n\t\tbreak;\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\tBR_Z(OVERFLOW_FLAG);\n\t\tbreak;\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\tBR_NZ(OVERFLOW_FLAG);\n\t\tbreak;\n\tdefault:\n\t\t/* Not conditional branch. */\n\t\tinst = 0;\n\t\tbreak;\n\t}\n\n\tjump->flags |= flags;\n\n\tif (inst) {\n\t\tinst = inst | ((type <= SLJIT_JUMP) ? BOFF_X1(5) : BOFF_X1(6));\n\t\tPTR_FAIL_IF(PI(inst));\n\t}\n\n\tPTR_FAIL_IF(emit_const(compiler, TMP_REG2_mapped, 0, 1));\n\tif (type <= SLJIT_JUMP) {\n\t\tjump->addr = compiler->size;\n\t\tPTR_FAIL_IF(JR_SOLO(TMP_REG2_mapped));\n\t} else {\n\t\tSLJIT_ASSERT(reg_map[PIC_ADDR_REG] == 16 && PIC_ADDR_REG == TMP_REG2);\n\t\t/* Cannot be optimized out if type is >= CALL0. */\n\t\tjump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? SLJIT_REWRITABLE_JUMP : 0);\n\t\tPTR_FAIL_IF(ADD_SOLO(0, reg_map[SLJIT_R0], ZERO));\n\t\tjump->addr = compiler->size;\n\t\tPTR_FAIL_IF(JALR_SOLO(TMP_REG2_mapped));\n\t}\n\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)\n{\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)\n{\n\tSLJIT_UNREACHABLE();\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tstruct sljit_const *const_;\n\tsljit_s32 reg;\n\n\tflush_buffer(compiler);\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tconst_ = (struct sljit_const *)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n\treg = FAST_IS_REG(dst) ? dst : TMP_REG2;\n\n\tPTR_FAIL_IF(emit_const_64(compiler, reg, init_value, 1));\n\n\tif (dst & SLJIT_MEM)\n\t\tPTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));\n\treturn const_;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & ~(0xFFFFL << 43)) | (((new_target >> 32) & 0xffff) << 43);\n\tinst[1] = (inst[1] & ~(0xFFFFL << 43)) | (((new_target >> 16) & 0xffff) << 43);\n\tinst[2] = (inst[2] & ~(0xFFFFL << 43)) | ((new_target & 0xffff) << 43);\n\tSLJIT_CACHE_FLUSH(inst, inst + 3);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)\n{\n\tsljit_ins *inst = (sljit_ins *)addr;\n\n\tinst[0] = (inst[0] & ~(0xFFFFL << 43)) | (((new_constant >> 48) & 0xFFFFL) << 43);\n\tinst[1] = (inst[1] & ~(0xFFFFL << 43)) | (((new_constant >> 32) & 0xFFFFL) << 43);\n\tinst[2] = (inst[2] & ~(0xFFFFL << 43)) | (((new_constant >> 16) & 0xFFFFL) << 43);\n\tinst[3] = (inst[3] & ~(0xFFFFL << 43)) | ((new_constant & 0xFFFFL) << 43);\n\tSLJIT_CACHE_FLUSH(inst, inst + 4);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeX86_32.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* x86 32-bit arch dependent functions. */\n\nstatic sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, sljit_sw imm)\n{\n\tsljit_u8 *inst;\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + sizeof(sljit_sw));\n\tFAIL_IF(!inst);\n\tINC_SIZE(1 + sizeof(sljit_sw));\n\t*inst++ = opcode;\n\tsljit_unaligned_store_sw(inst, imm);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset)\n{\n\tif (type == SLJIT_JUMP) {\n\t\t*code_ptr++ = JMP_i32;\n\t\tjump->addr++;\n\t}\n\telse if (type >= SLJIT_FAST_CALL) {\n\t\t*code_ptr++ = CALL_i32;\n\t\tjump->addr++;\n\t}\n\telse {\n\t\t*code_ptr++ = GROUP_0F;\n\t\t*code_ptr++ = get_jump_code(type);\n\t\tjump->addr += 2;\n\t}\n\n\tif (jump->flags & JUMP_LABEL)\n\t\tjump->flags |= PATCH_MW;\n\telse\n\t\tsljit_unaligned_store_sw(code_ptr, jump->u.target - (jump->addr + 4) - (sljit_uw)executable_offset);\n\tcode_ptr += 4;\n\n\treturn code_ptr;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, size;\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\targs = get_arg_count(arg_types);\n\tcompiler->args = args;\n\n\t/* [esp+0] for saving temporaries and function calls. */\n\tcompiler->stack_tmp_size = 2 * sizeof(sljit_sw);\n\n#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (scratches > 3)\n\t\tcompiler->stack_tmp_size = 3 * sizeof(sljit_sw);\n#endif\n\n\tcompiler->saveds_offset = compiler->stack_tmp_size;\n\tif (scratches > 3)\n\t\tcompiler->saveds_offset += ((scratches > (3 + 6)) ? 6 : (scratches - 3)) * sizeof(sljit_sw);\n\n\tcompiler->locals_offset = compiler->saveds_offset;\n\n\tif (saveds > 3)\n\t\tcompiler->locals_offset += (saveds - 3) * sizeof(sljit_sw);\n\n\tif (options & SLJIT_F64_ALIGNMENT)\n\t\tcompiler->locals_offset = (compiler->locals_offset + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1);\n\n\tsize = 1 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3);\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tsize += (args > 0 ? (args * 2) : 0) + (args > 2 ? 2 : 0);\n#else\n\tsize += (args > 0 ? (2 + args * 3) : 0);\n#endif\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\tFAIL_IF(!inst);\n\n\tINC_SIZE(size);\n\tPUSH_REG(reg_map[TMP_REG1]);\n#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (args > 0) {\n\t\t*inst++ = MOV_r_rm;\n\t\t*inst++ = MOD_REG | (reg_map[TMP_REG1] << 3) | 0x4 /* esp */;\n\t}\n#endif\n\tif (saveds > 2 || scratches > 9)\n\t\tPUSH_REG(reg_map[SLJIT_S2]);\n\tif (saveds > 1 || scratches > 10)\n\t\tPUSH_REG(reg_map[SLJIT_S1]);\n\tif (saveds > 0 || scratches > 11)\n\t\tPUSH_REG(reg_map[SLJIT_S0]);\n\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (args > 0) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_REG | (reg_map[SLJIT_S0] << 3) | reg_map[SLJIT_R2];\n\t\tinst += 2;\n\t}\n\tif (args > 1) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_REG | (reg_map[SLJIT_S1] << 3) | reg_map[SLJIT_R1];\n\t\tinst += 2;\n\t}\n\tif (args > 2) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_DISP8 | (reg_map[SLJIT_S2] << 3) | 0x4 /* esp */;\n\t\tinst[2] = 0x24;\n\t\tinst[3] = sizeof(sljit_sw) * (3 + 2); /* saveds >= 3 as well. */\n\t}\n#else\n\tif (args > 0) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_DISP8 | (reg_map[SLJIT_S0] << 3) | reg_map[TMP_REG1];\n\t\tinst[2] = sizeof(sljit_sw) * 2;\n\t\tinst += 3;\n\t}\n\tif (args > 1) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_DISP8 | (reg_map[SLJIT_S1] << 3) | reg_map[TMP_REG1];\n\t\tinst[2] = sizeof(sljit_sw) * 3;\n\t\tinst += 3;\n\t}\n\tif (args > 2) {\n\t\tinst[0] = MOV_r_rm;\n\t\tinst[1] = MOD_DISP8 | (reg_map[SLJIT_S2] << 3) | reg_map[TMP_REG1];\n\t\tinst[2] = sizeof(sljit_sw) * 4;\n\t}\n#endif\n\n\tSLJIT_ASSERT(SLJIT_LOCALS_OFFSET > 0);\n\n#if defined(__APPLE__)\n\t/* Ignore pushed registers and SLJIT_LOCALS_OFFSET when computing the aligned local size. */\n\tsaveds = (2 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);\n\tlocal_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;\n#else\n\tif (options & SLJIT_F64_ALIGNMENT)\n\t\tlocal_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1));\n\telse\n\t\tlocal_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_sw) - 1) & ~(sizeof(sljit_sw) - 1));\n#endif\n\n\tcompiler->local_size = local_size;\n\n#ifdef _WIN32\n\tif (local_size > 0) {\n\t\tif (local_size <= 4 * 4096) {\n\t\t\tif (local_size > 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096);\n\t\t\tif (local_size > 2 * 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 2);\n\t\t\tif (local_size > 3 * 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 3);\n\t\t}\n\t\telse {\n\t\t\tEMIT_MOV(compiler, SLJIT_R0, 0, SLJIT_SP, 0);\n\t\t\tEMIT_MOV(compiler, SLJIT_R1, 0, SLJIT_IMM, (local_size - 1) >> 12);\n\n\t\t\tSLJIT_ASSERT (reg_map[SLJIT_R0] == 0);\n\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_R0), -4096);\n\t\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\t\tSLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 4096));\n\t\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\t\tSLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1));\n\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\t\tFAIL_IF(!inst);\n\n\t\t\tINC_SIZE(2);\n\t\t\tinst[0] = JNE_i8;\n\t\t\tinst[1] = (sljit_s8) -16;\n\t\t}\n\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -local_size);\n\t}\n#endif\n\n\tSLJIT_ASSERT(local_size > 0);\n\n#if !defined(__APPLE__)\n\tif (options & SLJIT_F64_ALIGNMENT) {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_SP, 0);\n\n\t\t/* Some space might allocated during sljit_grow_stack() above on WIN32. */\n\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size + sizeof(sljit_sw)));\n\n#if defined _WIN32 && !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\t\tif (compiler->local_size > 1024)\n\t\t\tFAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD),\n\t\t\t\tTMP_REG1, 0, TMP_REG1, 0, SLJIT_IMM, sizeof(sljit_sw)));\n#endif\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 6);\n\t\tFAIL_IF(!inst);\n\n\t\tINC_SIZE(6);\n\t\tinst[0] = GROUP_BINARY_81;\n\t\tinst[1] = MOD_REG | AND | reg_map[SLJIT_SP];\n\t\tsljit_unaligned_store_sw(inst + 2, ~(sizeof(sljit_f64) - 1));\n\n\t\t/* The real local size must be used. */\n\t\treturn emit_mov(compiler, SLJIT_MEM1(SLJIT_SP), compiler->local_size, TMP_REG1, 0);\n\t}\n#endif\n\treturn emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tcompiler->args = get_arg_count(arg_types);\n\n\t/* [esp+0] for saving temporaries and function calls. */\n\tcompiler->stack_tmp_size = 2 * sizeof(sljit_sw);\n\n#if !(defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (scratches > 3)\n\t\tcompiler->stack_tmp_size = 3 * sizeof(sljit_sw);\n#endif\n\n\tcompiler->saveds_offset = compiler->stack_tmp_size;\n\tif (scratches > 3)\n\t\tcompiler->saveds_offset += ((scratches > (3 + 6)) ? 6 : (scratches - 3)) * sizeof(sljit_sw);\n\n\tcompiler->locals_offset = compiler->saveds_offset;\n\n\tif (saveds > 3)\n\t\tcompiler->locals_offset += (saveds - 3) * sizeof(sljit_sw);\n\n\tif (options & SLJIT_F64_ALIGNMENT)\n\t\tcompiler->locals_offset = (compiler->locals_offset + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1);\n\n#if defined(__APPLE__)\n\tsaveds = (2 + (scratches > 9 ? (scratches - 9) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);\n\tcompiler->local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;\n#else\n\tif (options & SLJIT_F64_ALIGNMENT)\n\t\tcompiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_f64) - 1) & ~(sizeof(sljit_f64) - 1));\n\telse\n\t\tcompiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + sizeof(sljit_sw) - 1) & ~(sizeof(sljit_sw) - 1));\n#endif\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 size;\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\tSLJIT_ASSERT(compiler->args >= 0);\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n\tSLJIT_ASSERT(compiler->local_size > 0);\n\n#if !defined(__APPLE__)\n\tif (compiler->options & SLJIT_F64_ALIGNMENT)\n\t\tEMIT_MOV(compiler, SLJIT_SP, 0, SLJIT_MEM1(SLJIT_SP), compiler->local_size)\n\telse\n\t\tFAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));\n#else\n\tFAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD),\n\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));\n#endif\n\n\tsize = 2 + (compiler->scratches > 7 ? (compiler->scratches - 7) : 0) +\n\t\t(compiler->saveds <= 3 ? compiler->saveds : 3);\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (compiler->args > 2)\n\t\tsize += 2;\n#else\n\tif (compiler->args > 0)\n\t\tsize += 2;\n#endif\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\tFAIL_IF(!inst);\n\n\tINC_SIZE(size);\n\n\tif (compiler->saveds > 0 || compiler->scratches > 11)\n\t\tPOP_REG(reg_map[SLJIT_S0]);\n\tif (compiler->saveds > 1 || compiler->scratches > 10)\n\t\tPOP_REG(reg_map[SLJIT_S1]);\n\tif (compiler->saveds > 2 || compiler->scratches > 9)\n\t\tPOP_REG(reg_map[SLJIT_S2]);\n\tPOP_REG(reg_map[TMP_REG1]);\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif (compiler->args > 2)\n\t\tRET_I16(sizeof(sljit_sw));\n\telse\n\t\tRET();\n#else\n\tRET();\n#endif\n\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n/* Size contains the flags as well. */\nstatic sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size,\n\t/* The register or immediate operand. */\n\tsljit_s32 a, sljit_sw imma,\n\t/* The general operand (not immediate). */\n\tsljit_s32 b, sljit_sw immb)\n{\n\tsljit_u8 *inst;\n\tsljit_u8 *buf_ptr;\n\tsljit_s32 flags = size & ~0xf;\n\tsljit_s32 inst_size;\n\n\t/* Both cannot be switched on. */\n\tSLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS));\n\t/* Size flags not allowed for typed instructions. */\n\tSLJIT_ASSERT(!(flags & (EX86_BIN_INS | EX86_SHIFT_INS)) || (flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) == 0);\n\t/* Both size flags cannot be switched on. */\n\tSLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG));\n\t/* SSE2 and immediate is not possible. */\n\tSLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2));\n\tSLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3)\n\t\t&& (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66)\n\t\t&& (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66));\n\n\tsize &= 0xf;\n\tinst_size = size;\n\n\tif (flags & (EX86_PREF_F2 | EX86_PREF_F3))\n\t\tinst_size++;\n\tif (flags & EX86_PREF_66)\n\t\tinst_size++;\n\n\t/* Calculate size of b. */\n\tinst_size += 1; /* mod r/m byte. */\n\tif (b & SLJIT_MEM) {\n\t\tif ((b & REG_MASK) == SLJIT_UNUSED)\n\t\t\tinst_size += sizeof(sljit_sw);\n\t\telse if (immb != 0 && !(b & OFFS_REG_MASK)) {\n\t\t\t/* Immediate operand. */\n\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\tinst_size += sizeof(sljit_s8);\n\t\t\telse\n\t\t\t\tinst_size += sizeof(sljit_sw);\n\t\t}\n\n\t\tif ((b & REG_MASK) == SLJIT_SP && !(b & OFFS_REG_MASK))\n\t\t\tb |= TO_OFFS_REG(SLJIT_SP);\n\n\t\tif ((b & OFFS_REG_MASK) != SLJIT_UNUSED)\n\t\t\tinst_size += 1; /* SIB byte. */\n\t}\n\n\t/* Calculate size of a. */\n\tif (a & SLJIT_IMM) {\n\t\tif (flags & EX86_BIN_INS) {\n\t\t\tif (imma <= 127 && imma >= -128) {\n\t\t\t\tinst_size += 1;\n\t\t\t\tflags |= EX86_BYTE_ARG;\n\t\t\t} else\n\t\t\t\tinst_size += 4;\n\t\t}\n\t\telse if (flags & EX86_SHIFT_INS) {\n\t\t\timma &= 0x1f;\n\t\t\tif (imma != 1) {\n\t\t\t\tinst_size ++;\n\t\t\t\tflags |= EX86_BYTE_ARG;\n\t\t\t}\n\t\t} else if (flags & EX86_BYTE_ARG)\n\t\t\tinst_size++;\n\t\telse if (flags & EX86_HALF_ARG)\n\t\t\tinst_size += sizeof(short);\n\t\telse\n\t\t\tinst_size += sizeof(sljit_sw);\n\t}\n\telse\n\t\tSLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);\n\tPTR_FAIL_IF(!inst);\n\n\t/* Encoding the byte. */\n\tINC_SIZE(inst_size);\n\tif (flags & EX86_PREF_F2)\n\t\t*inst++ = 0xf2;\n\tif (flags & EX86_PREF_F3)\n\t\t*inst++ = 0xf3;\n\tif (flags & EX86_PREF_66)\n\t\t*inst++ = 0x66;\n\n\tbuf_ptr = inst + size;\n\n\t/* Encode mod/rm byte. */\n\tif (!(flags & EX86_SHIFT_INS)) {\n\t\tif ((flags & EX86_BIN_INS) && (a & SLJIT_IMM))\n\t\t\t*inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81;\n\n\t\tif (a & SLJIT_IMM)\n\t\t\t*buf_ptr = 0;\n\t\telse if (!(flags & EX86_SSE2_OP1))\n\t\t\t*buf_ptr = reg_map[a] << 3;\n\t\telse\n\t\t\t*buf_ptr = a << 3;\n\t}\n\telse {\n\t\tif (a & SLJIT_IMM) {\n\t\t\tif (imma == 1)\n\t\t\t\t*inst = GROUP_SHIFT_1;\n\t\t\telse\n\t\t\t\t*inst = GROUP_SHIFT_N;\n\t\t} else\n\t\t\t*inst = GROUP_SHIFT_CL;\n\t\t*buf_ptr = 0;\n\t}\n\n\tif (!(b & SLJIT_MEM))\n\t\t*buf_ptr++ |= MOD_REG + ((!(flags & EX86_SSE2_OP2)) ? reg_map[b] : b);\n\telse if ((b & REG_MASK) != SLJIT_UNUSED) {\n\t\tif ((b & OFFS_REG_MASK) == SLJIT_UNUSED || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP)) {\n\t\t\tif (immb != 0) {\n\t\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\t\t*buf_ptr |= 0x40;\n\t\t\t\telse\n\t\t\t\t\t*buf_ptr |= 0x80;\n\t\t\t}\n\n\t\t\tif ((b & OFFS_REG_MASK) == SLJIT_UNUSED)\n\t\t\t\t*buf_ptr++ |= reg_map[b & REG_MASK];\n\t\t\telse {\n\t\t\t\t*buf_ptr++ |= 0x04;\n\t\t\t\t*buf_ptr++ = reg_map[b & REG_MASK] | (reg_map[OFFS_REG(b)] << 3);\n\t\t\t}\n\n\t\t\tif (immb != 0) {\n\t\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\t\t*buf_ptr++ = immb; /* 8 bit displacement. */\n\t\t\t\telse {\n\t\t\t\t\tsljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */\n\t\t\t\t\tbuf_ptr += sizeof(sljit_sw);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t*buf_ptr++ |= 0x04;\n\t\t\t*buf_ptr++ = reg_map[b & REG_MASK] | (reg_map[OFFS_REG(b)] << 3) | (immb << 6);\n\t\t}\n\t}\n\telse {\n\t\t*buf_ptr++ |= 0x05;\n\t\tsljit_unaligned_store_sw(buf_ptr, immb); /* 32 bit displacement. */\n\t\tbuf_ptr += sizeof(sljit_sw);\n\t}\n\n\tif (a & SLJIT_IMM) {\n\t\tif (flags & EX86_BYTE_ARG)\n\t\t\t*buf_ptr = imma;\n\t\telse if (flags & EX86_HALF_ARG)\n\t\t\tsljit_unaligned_store_s16(buf_ptr, imma);\n\t\telse if (!(flags & EX86_SHIFT_INS))\n\t\t\tsljit_unaligned_store_sw(buf_ptr, imma);\n\t}\n\n\treturn !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Call / return instructions                                           */\n/* --------------------------------------------------------------------- */\n\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\nstatic sljit_s32 c_fast_call_get_stack_size(sljit_s32 arg_types, sljit_s32 *word_arg_count_ptr)\n{\n\tsljit_s32 stack_size = 0;\n\tsljit_s32 word_arg_count = 0;\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tword_arg_count++;\n\t\t\tif (word_arg_count > 2)\n\t\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (word_arg_count_ptr)\n\t\t*word_arg_count_ptr = word_arg_count;\n\n\treturn stack_size;\n}\n\nstatic sljit_s32 c_fast_call_with_args(struct sljit_compiler *compiler,\n\tsljit_s32 arg_types, sljit_s32 stack_size, sljit_s32 word_arg_count, sljit_s32 swap_args)\n{\n\tsljit_u8 *inst;\n\tsljit_s32 float_arg_count;\n\n\tif (stack_size == sizeof(sljit_sw) && word_arg_count == 3) {\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1);\n\t\tPUSH_REG(reg_map[SLJIT_R2]);\n\t}\n\telse if (stack_size > 0) {\n\t\tif (word_arg_count >= 4)\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), compiler->saveds_offset - sizeof(sljit_sw));\n\n\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size));\n\n\t\tstack_size = 0;\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\tword_arg_count = 0;\n\t\tfloat_arg_count = 0;\n\t\twhile (arg_types) {\n\t\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\t\tfloat_arg_count++;\n\t\t\t\tFAIL_IF(emit_sse2_store(compiler, 1, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count));\n\t\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\t\tfloat_arg_count++;\n\t\t\t\tFAIL_IF(emit_sse2_store(compiler, 0, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count));\n\t\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tword_arg_count++;\n\t\t\t\tif (word_arg_count == 3) {\n\t\t\t\t\tEMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, SLJIT_R2, 0);\n\t\t\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\t\t}\n\t\t\t\telse if (word_arg_count == 4) {\n\t\t\t\t\tEMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, TMP_REG1, 0);\n\t\t\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t\t}\n\t}\n\n\tif (word_arg_count > 0) {\n\t\tif (swap_args) {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1);\n\n\t\t\t*inst++ = XCHG_EAX_r | reg_map[SLJIT_R2];\n\t\t}\n\t\telse {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(2);\n\n\t\t\t*inst++ = MOV_r_rm;\n\t\t\t*inst++ = MOD_REG | (reg_map[SLJIT_R2] << 3) | reg_map[SLJIT_R0];\n\t\t}\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#endif\n\nstatic sljit_s32 cdecl_call_get_stack_size(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *word_arg_count_ptr)\n{\n\tsljit_s32 stack_size = 0;\n\tsljit_s32 word_arg_count = 0;\n\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tword_arg_count++;\n\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (word_arg_count_ptr)\n\t\t*word_arg_count_ptr = word_arg_count;\n\n\tif (stack_size <= compiler->stack_tmp_size)\n\t\treturn 0;\n\n#if defined(__APPLE__)\n\treturn ((stack_size - compiler->stack_tmp_size + 15) & ~15);\n#else\n\treturn stack_size - compiler->stack_tmp_size;\n#endif\n}\n\nstatic sljit_s32 cdecl_call_with_args(struct sljit_compiler *compiler,\n\tsljit_s32 arg_types, sljit_s32 stack_size, sljit_s32 word_arg_count)\n{\n\tsljit_s32 float_arg_count = 0;\n\n\tif (word_arg_count >= 4)\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), compiler->saveds_offset - sizeof(sljit_sw));\n\n\tif (stack_size > 0)\n\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size));\n\n\tstack_size = 0;\n\tword_arg_count = 0;\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tfloat_arg_count++;\n\t\t\tFAIL_IF(emit_sse2_store(compiler, 1, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count));\n\t\t\tstack_size += sizeof(sljit_f32);\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tfloat_arg_count++;\n\t\t\tFAIL_IF(emit_sse2_store(compiler, 0, SLJIT_MEM1(SLJIT_SP), stack_size, float_arg_count));\n\t\t\tstack_size += sizeof(sljit_f64);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tword_arg_count++;\n\t\t\tEMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), stack_size, (word_arg_count >= 4) ? TMP_REG1 : word_arg_count, 0);\n\t\t\tstack_size += sizeof(sljit_sw);\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 post_call_with_args(struct sljit_compiler *compiler,\n\tsljit_s32 arg_types, sljit_s32 stack_size)\n{\n\tsljit_u8 *inst;\n\tsljit_s32 single;\n\n\tif (stack_size > 0)\n\t\tFAIL_IF(emit_cum_binary(compiler, BINARY_OPCODE(ADD),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, stack_size));\n\n\tif ((arg_types & SLJIT_DEF_MASK) < SLJIT_ARG_TYPE_F32)\n\t\treturn SLJIT_SUCCESS;\n\n\tsingle = ((arg_types & SLJIT_DEF_MASK) == SLJIT_ARG_TYPE_F32);\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 3);\n\tFAIL_IF(!inst);\n\tINC_SIZE(3);\n\tinst[0] = single ? FSTPS : FSTPD;\n\tinst[1] = (0x03 << 3) | 0x04;\n\tinst[2] = (0x04 << 3) | reg_map[SLJIT_SP];\n\n\treturn emit_sse2_load(compiler, single, SLJIT_FR0, SLJIT_MEM1(SLJIT_SP), 0);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tstruct sljit_jump *jump;\n\tsljit_s32 stack_size = 0;\n\tsljit_s32 word_arg_count;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tif ((type & 0xff) == SLJIT_CALL) {\n\t\tstack_size = c_fast_call_get_stack_size(arg_types, &word_arg_count);\n\t\tPTR_FAIL_IF(c_fast_call_with_args(compiler, arg_types, stack_size, word_arg_count, 0));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\t\tcompiler->skip_checks = 1;\n#endif\n\n\t\tjump = sljit_emit_jump(compiler, type);\n\t\tPTR_FAIL_IF(jump == NULL);\n\n\t\tPTR_FAIL_IF(post_call_with_args(compiler, arg_types, 0));\n\t\treturn jump;\n\t}\n#endif\n\n\tstack_size = cdecl_call_get_stack_size(compiler, arg_types, &word_arg_count);\n\tPTR_FAIL_IF(cdecl_call_with_args(compiler, arg_types, stack_size, word_arg_count));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\tjump = sljit_emit_jump(compiler, type);\n\tPTR_FAIL_IF(jump == NULL);\n\n\tPTR_FAIL_IF(post_call_with_args(compiler, arg_types, stack_size));\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 stack_size = 0;\n\tsljit_s32 word_arg_count;\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tsljit_s32 swap_args;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\tSLJIT_ASSERT(reg_map[SLJIT_R0] == 0 && reg_map[SLJIT_R2] == 1 && SLJIT_R0 == 1 && SLJIT_R2 == 3);\n\n\tif ((type & 0xff) == SLJIT_CALL) {\n\t\tstack_size = c_fast_call_get_stack_size(arg_types, &word_arg_count);\n\t\tswap_args = 0;\n\n\t\tif (word_arg_count > 0) {\n\t\t\tif ((src & REG_MASK) == SLJIT_R2 || OFFS_REG(src) == SLJIT_R2) {\n\t\t\t\tswap_args = 1;\n\t\t\t\tif (((src & REG_MASK) | 0x2) == SLJIT_R2)\n\t\t\t\t\tsrc ^= 0x2;\n\t\t\t\tif ((OFFS_REG(src) | 0x2) == SLJIT_R2)\n\t\t\t\t\tsrc ^= TO_OFFS_REG(0x2);\n\t\t\t}\n\t\t}\n\n\t\tFAIL_IF(c_fast_call_with_args(compiler, arg_types, stack_size, word_arg_count, swap_args));\n\n\t\tcompiler->saveds_offset += stack_size;\n\t\tcompiler->locals_offset += stack_size;\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\t\tcompiler->skip_checks = 1;\n#endif\n\t\tFAIL_IF(sljit_emit_ijump(compiler, type, src, srcw));\n\n\t\tcompiler->saveds_offset -= stack_size;\n\t\tcompiler->locals_offset -= stack_size;\n\n\t\treturn post_call_with_args(compiler, arg_types, 0);\n\t}\n#endif\n\n\tstack_size = cdecl_call_get_stack_size(compiler, arg_types, &word_arg_count);\n\tFAIL_IF(cdecl_call_with_args(compiler, arg_types, stack_size, word_arg_count));\n\n\tcompiler->saveds_offset += stack_size;\n\tcompiler->locals_offset += stack_size;\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\tFAIL_IF(sljit_emit_ijump(compiler, type, src, srcw));\n\n\tcompiler->saveds_offset -= stack_size;\n\tcompiler->locals_offset -= stack_size;\n\n\treturn post_call_with_args(compiler, arg_types, stack_size);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tCHECK_EXTRA_REGS(dst, dstw, (void)0);\n\n\t/* For UNUSED dst. Uncommon, but possible. */\n\tif (dst == SLJIT_UNUSED)\n\t\tdst = TMP_REG1;\n\n\tif (FAST_IS_REG(dst)) {\n\t\t/* Unused dest is possible here. */\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\n\t\tINC_SIZE(1);\n\t\tPOP_REG(reg_map[dst]);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* Memory. */\n\tinst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);\n\tFAIL_IF(!inst);\n\t*inst++ = POP_rm;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tCHECK_EXTRA_REGS(src, srcw, (void)0);\n\n\tif (FAST_IS_REG(src)) {\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1);\n\t\tFAIL_IF(!inst);\n\n\t\tINC_SIZE(1 + 1);\n\t\tPUSH_REG(reg_map[src]);\n\t}\n\telse {\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_FF;\n\t\t*inst |= PUSH_rm;\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1);\n\t}\n\n\tRET();\n\treturn SLJIT_SUCCESS;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeX86_64.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* x86 64-bit arch dependent functions. */\n\nstatic sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)\n{\n\tsljit_u8 *inst;\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + sizeof(sljit_sw));\n\tFAIL_IF(!inst);\n\tINC_SIZE(2 + sizeof(sljit_sw));\n\t*inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B);\n\t*inst++ = MOV_r_i32 + (reg_map[reg] & 0x7);\n\tsljit_unaligned_store_sw(inst, imm);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type)\n{\n\tint short_addr = !(jump->flags & SLJIT_REWRITABLE_JUMP) && !(jump->flags & JUMP_LABEL) && (jump->u.target <= 0xffffffff);\n\n\t/* The relative jump below specialized for this case. */\n\tSLJIT_ASSERT(reg_map[TMP_REG2] >= 8);\n\n\tif (type < SLJIT_JUMP) {\n\t\t/* Invert type. */\n\t\t*code_ptr++ = get_jump_code(type ^ 0x1) - 0x10;\n\t\t*code_ptr++ = short_addr ? (6 + 3) : (10 + 3);\n\t}\n\n\t*code_ptr++ = short_addr ? REX_B : (REX_W | REX_B);\n\t*code_ptr++ = MOV_r_i32 | reg_lmap[TMP_REG2];\n\tjump->addr = (sljit_uw)code_ptr;\n\n\tif (jump->flags & JUMP_LABEL)\n\t\tjump->flags |= PATCH_MD;\n\telse if (short_addr)\n\t\tsljit_unaligned_store_s32(code_ptr, (sljit_s32)jump->u.target);\n\telse\n\t\tsljit_unaligned_store_sw(code_ptr, jump->u.target);\n\n\tcode_ptr += short_addr ? sizeof(sljit_s32) : sizeof(sljit_sw);\n\n\t*code_ptr++ = REX_B;\n\t*code_ptr++ = GROUP_FF;\n\t*code_ptr++ = MOD_REG | (type >= SLJIT_FAST_CALL ? CALL_rm : JMP_rm) | reg_lmap[TMP_REG2];\n\n\treturn code_ptr;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 args, i, tmp, size, saved_register_size;\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n\tcompiler->mode32 = 0;\n\n#ifdef _WIN64\n\t/* Two/four register slots for parameters plus space for xmm6 register if needed. */\n\tif (fscratches >= 6 || fsaveds >= 1)\n\t\tcompiler->locals_offset = 6 * sizeof(sljit_sw);\n\telse\n\t\tcompiler->locals_offset = ((scratches > 2) ? 4 : 2) * sizeof(sljit_sw);\n#endif\n\n\t/* Including the return address saved by the call instruction. */\n\tsaved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\n\ttmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = SLJIT_S0; i >= tmp; i--) {\n\t\tsize = reg_map[i] >= 8 ? 2 : 1;\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(size);\n\t\tif (reg_map[i] >= 8)\n\t\t\t*inst++ = REX_B;\n\t\tPUSH_REG(reg_lmap[i]);\n\t}\n\n\tfor (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {\n\t\tsize = reg_map[i] >= 8 ? 2 : 1;\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(size);\n\t\tif (reg_map[i] >= 8)\n\t\t\t*inst++ = REX_B;\n\t\tPUSH_REG(reg_lmap[i]);\n\t}\n\n\targs = get_arg_count(arg_types);\n\n\tif (args > 0) {\n\t\tsize = args * 3;\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\n\t\tINC_SIZE(size);\n\n#ifndef _WIN64\n\t\tif (args > 0) {\n\t\t\tinst[0] = REX_W;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_map[SLJIT_S0] << 3) | 0x7 /* rdi */;\n\t\t\tinst += 3;\n\t\t}\n\t\tif (args > 1) {\n\t\t\tinst[0] = REX_W | REX_R;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_lmap[SLJIT_S1] << 3) | 0x6 /* rsi */;\n\t\t\tinst += 3;\n\t\t}\n\t\tif (args > 2) {\n\t\t\tinst[0] = REX_W | REX_R;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_lmap[SLJIT_S2] << 3) | 0x2 /* rdx */;\n\t\t}\n#else\n\t\tif (args > 0) {\n\t\t\tinst[0] = REX_W;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_map[SLJIT_S0] << 3) | 0x1 /* rcx */;\n\t\t\tinst += 3;\n\t\t}\n\t\tif (args > 1) {\n\t\t\tinst[0] = REX_W;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_map[SLJIT_S1] << 3) | 0x2 /* rdx */;\n\t\t\tinst += 3;\n\t\t}\n\t\tif (args > 2) {\n\t\t\tinst[0] = REX_W | REX_B;\n\t\t\tinst[1] = MOV_r_rm;\n\t\t\tinst[2] = MOD_REG | (reg_map[SLJIT_S2] << 3) | 0x0 /* r8 */;\n\t\t}\n#endif\n\t}\n\n\tlocal_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;\n\tcompiler->local_size = local_size;\n\n#ifdef _WIN64\n\tif (local_size > 0) {\n\t\tif (local_size <= 4 * 4096) {\n\t\t\tif (local_size > 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096);\n\t\t\tif (local_size > 2 * 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 2);\n\t\t\tif (local_size > 3 * 4096)\n\t\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -4096 * 3);\n\t\t}\n\t\telse {\n\t\t\tEMIT_MOV(compiler, SLJIT_R0, 0, SLJIT_SP, 0);\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, (local_size - 1) >> 12);\n\n\t\t\tSLJIT_ASSERT (reg_map[SLJIT_R0] == 0);\n\n\t\t\tEMIT_MOV(compiler, TMP_REG2, 0, SLJIT_MEM1(SLJIT_R0), -4096);\n\t\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\t\tSLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 4096));\n\t\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\t\tTMP_REG1, 0, TMP_REG1, 0, SLJIT_IMM, 1));\n\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\t\tFAIL_IF(!inst);\n\n\t\t\tINC_SIZE(2);\n\t\t\tinst[0] = JNE_i8;\n\t\t\tinst[1] = (sljit_s8) -19;\n\t\t}\n\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_MEM1(SLJIT_SP), -local_size);\n\t}\n#endif\n\n\tif (local_size > 0) {\n\t\tFAIL_IF(emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\tSLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size));\n\t}\n\n#ifdef _WIN64\n\t/* Save xmm6 register: movaps [rsp + 0x20], xmm6 */\n\tif (fscratches >= 6 || fsaveds >= 1) {\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 5);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(5);\n\t\t*inst++ = GROUP_0F;\n\t\tsljit_unaligned_store_s32(inst, 0x20247429);\n\t}\n#endif\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,\n\tsljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,\n\tsljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)\n{\n\tsljit_s32 saved_register_size;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));\n\tset_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);\n\n#ifdef _WIN64\n\t/* Two/four register slots for parameters plus space for xmm6 register if needed. */\n\tif (fscratches >= 6 || fsaveds >= 1)\n\t\tcompiler->locals_offset = 6 * sizeof(sljit_sw);\n\telse\n\t\tcompiler->locals_offset = ((scratches > 2) ? 4 : 2) * sizeof(sljit_sw);\n#endif\n\n\t/* Including the return address saved by the call instruction. */\n\tsaved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);\n\tcompiler->local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 i, tmp, size;\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_return(compiler, op, src, srcw));\n\n\tFAIL_IF(emit_mov_before_return(compiler, op, src, srcw));\n\n#ifdef _WIN64\n\t/* Restore xmm6 register: movaps xmm6, [rsp + 0x20] */\n\tif (compiler->fscratches >= 6 || compiler->fsaveds >= 1) {\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 5);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(5);\n\t\t*inst++ = GROUP_0F;\n\t\tsljit_unaligned_store_s32(inst, 0x20247428);\n\t}\n#endif\n\n\tif (compiler->local_size > 0) {\n\t\tif (compiler->local_size <= 127) {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(4);\n\t\t\t*inst++ = REX_W;\n\t\t\t*inst++ = GROUP_BINARY_83;\n\t\t\t*inst++ = MOD_REG | ADD | 4;\n\t\t\t*inst = compiler->local_size;\n\t\t}\n\t\telse {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 7);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(7);\n\t\t\t*inst++ = REX_W;\n\t\t\t*inst++ = GROUP_BINARY_81;\n\t\t\t*inst++ = MOD_REG | ADD | 4;\n\t\t\tsljit_unaligned_store_s32(inst, compiler->local_size);\n\t\t}\n\t}\n\n\ttmp = compiler->scratches;\n\tfor (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {\n\t\tsize = reg_map[i] >= 8 ? 2 : 1;\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(size);\n\t\tif (reg_map[i] >= 8)\n\t\t\t*inst++ = REX_B;\n\t\tPOP_REG(reg_lmap[i]);\n\t}\n\n\ttmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;\n\tfor (i = tmp; i <= SLJIT_S0; i++) {\n\t\tsize = reg_map[i] >= 8 ? 2 : 1;\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(size);\n\t\tif (reg_map[i] >= 8)\n\t\t\t*inst++ = REX_B;\n\t\tPOP_REG(reg_lmap[i]);\n\t}\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\tFAIL_IF(!inst);\n\tINC_SIZE(1);\n\tRET();\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_s32 emit_do_imm32(struct sljit_compiler *compiler, sljit_u8 rex, sljit_u8 opcode, sljit_sw imm)\n{\n\tsljit_u8 *inst;\n\tsljit_s32 length = 1 + (rex ? 1 : 0) + sizeof(sljit_s32);\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + length);\n\tFAIL_IF(!inst);\n\tINC_SIZE(length);\n\tif (rex)\n\t\t*inst++ = rex;\n\t*inst++ = opcode;\n\tsljit_unaligned_store_s32(inst, imm);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size,\n\t/* The register or immediate operand. */\n\tsljit_s32 a, sljit_sw imma,\n\t/* The general operand (not immediate). */\n\tsljit_s32 b, sljit_sw immb)\n{\n\tsljit_u8 *inst;\n\tsljit_u8 *buf_ptr;\n\tsljit_u8 rex = 0;\n\tsljit_s32 flags = size & ~0xf;\n\tsljit_s32 inst_size;\n\n\t/* The immediate operand must be 32 bit. */\n\tSLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma));\n\t/* Both cannot be switched on. */\n\tSLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS));\n\t/* Size flags not allowed for typed instructions. */\n\tSLJIT_ASSERT(!(flags & (EX86_BIN_INS | EX86_SHIFT_INS)) || (flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) == 0);\n\t/* Both size flags cannot be switched on. */\n\tSLJIT_ASSERT((flags & (EX86_BYTE_ARG | EX86_HALF_ARG)) != (EX86_BYTE_ARG | EX86_HALF_ARG));\n\t/* SSE2 and immediate is not possible. */\n\tSLJIT_ASSERT(!(a & SLJIT_IMM) || !(flags & EX86_SSE2));\n\tSLJIT_ASSERT((flags & (EX86_PREF_F2 | EX86_PREF_F3)) != (EX86_PREF_F2 | EX86_PREF_F3)\n\t\t&& (flags & (EX86_PREF_F2 | EX86_PREF_66)) != (EX86_PREF_F2 | EX86_PREF_66)\n\t\t&& (flags & (EX86_PREF_F3 | EX86_PREF_66)) != (EX86_PREF_F3 | EX86_PREF_66));\n\n\tsize &= 0xf;\n\tinst_size = size;\n\n\tif (!compiler->mode32 && !(flags & EX86_NO_REXW))\n\t\trex |= REX_W;\n\telse if (flags & EX86_REX)\n\t\trex |= REX;\n\n\tif (flags & (EX86_PREF_F2 | EX86_PREF_F3))\n\t\tinst_size++;\n\tif (flags & EX86_PREF_66)\n\t\tinst_size++;\n\n\t/* Calculate size of b. */\n\tinst_size += 1; /* mod r/m byte. */\n\tif (b & SLJIT_MEM) {\n\t\tif (!(b & OFFS_REG_MASK)) {\n\t\t\tif (NOT_HALFWORD(immb)) {\n\t\t\t\tPTR_FAIL_IF(emit_load_imm64(compiler, TMP_REG2, immb));\n\t\t\t\timmb = 0;\n\t\t\t\tif (b & REG_MASK)\n\t\t\t\t\tb |= TO_OFFS_REG(TMP_REG2);\n\t\t\t\telse\n\t\t\t\t\tb |= TMP_REG2;\n\t\t\t}\n\t\t\telse if (reg_lmap[b & REG_MASK] == 4)\n\t\t\t\tb |= TO_OFFS_REG(SLJIT_SP);\n\t\t}\n\n\t\tif ((b & REG_MASK) == SLJIT_UNUSED)\n\t\t\tinst_size += 1 + sizeof(sljit_s32); /* SIB byte required to avoid RIP based addressing. */\n\t\telse {\n\t\t\tif (reg_map[b & REG_MASK] >= 8)\n\t\t\t\trex |= REX_B;\n\n\t\t\tif (immb != 0 && (!(b & OFFS_REG_MASK) || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP))) {\n\t\t\t\t/* Immediate operand. */\n\t\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\t\tinst_size += sizeof(sljit_s8);\n\t\t\t\telse\n\t\t\t\t\tinst_size += sizeof(sljit_s32);\n\t\t\t}\n\t\t\telse if (reg_lmap[b & REG_MASK] == 5)\n\t\t\t\tinst_size += sizeof(sljit_s8);\n\n\t\t\tif ((b & OFFS_REG_MASK) != SLJIT_UNUSED) {\n\t\t\t\tinst_size += 1; /* SIB byte. */\n\t\t\t\tif (reg_map[OFFS_REG(b)] >= 8)\n\t\t\t\t\trex |= REX_X;\n\t\t\t}\n\t\t}\n\t}\n\telse if (!(flags & EX86_SSE2_OP2)) {\n\t\tif (reg_map[b] >= 8)\n\t\t\trex |= REX_B;\n\t}\n\telse if (freg_map[b] >= 8)\n\t\trex |= REX_B;\n\n\tif (a & SLJIT_IMM) {\n\t\tif (flags & EX86_BIN_INS) {\n\t\t\tif (imma <= 127 && imma >= -128) {\n\t\t\t\tinst_size += 1;\n\t\t\t\tflags |= EX86_BYTE_ARG;\n\t\t\t} else\n\t\t\t\tinst_size += 4;\n\t\t}\n\t\telse if (flags & EX86_SHIFT_INS) {\n\t\t\timma &= compiler->mode32 ? 0x1f : 0x3f;\n\t\t\tif (imma != 1) {\n\t\t\t\tinst_size ++;\n\t\t\t\tflags |= EX86_BYTE_ARG;\n\t\t\t}\n\t\t} else if (flags & EX86_BYTE_ARG)\n\t\t\tinst_size++;\n\t\telse if (flags & EX86_HALF_ARG)\n\t\t\tinst_size += sizeof(short);\n\t\telse\n\t\t\tinst_size += sizeof(sljit_s32);\n\t}\n\telse {\n\t\tSLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);\n\t\t/* reg_map[SLJIT_PREF_SHIFT_REG] is less than 8. */\n\t\tif (!(flags & EX86_SSE2_OP1)) {\n\t\t\tif (reg_map[a] >= 8)\n\t\t\t\trex |= REX_R;\n\t\t}\n\t\telse if (freg_map[a] >= 8)\n\t\t\trex |= REX_R;\n\t}\n\n\tif (rex)\n\t\tinst_size++;\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);\n\tPTR_FAIL_IF(!inst);\n\n\t/* Encoding the byte. */\n\tINC_SIZE(inst_size);\n\tif (flags & EX86_PREF_F2)\n\t\t*inst++ = 0xf2;\n\tif (flags & EX86_PREF_F3)\n\t\t*inst++ = 0xf3;\n\tif (flags & EX86_PREF_66)\n\t\t*inst++ = 0x66;\n\tif (rex)\n\t\t*inst++ = rex;\n\tbuf_ptr = inst + size;\n\n\t/* Encode mod/rm byte. */\n\tif (!(flags & EX86_SHIFT_INS)) {\n\t\tif ((flags & EX86_BIN_INS) && (a & SLJIT_IMM))\n\t\t\t*inst = (flags & EX86_BYTE_ARG) ? GROUP_BINARY_83 : GROUP_BINARY_81;\n\n\t\tif (a & SLJIT_IMM)\n\t\t\t*buf_ptr = 0;\n\t\telse if (!(flags & EX86_SSE2_OP1))\n\t\t\t*buf_ptr = reg_lmap[a] << 3;\n\t\telse\n\t\t\t*buf_ptr = freg_lmap[a] << 3;\n\t}\n\telse {\n\t\tif (a & SLJIT_IMM) {\n\t\t\tif (imma == 1)\n\t\t\t\t*inst = GROUP_SHIFT_1;\n\t\t\telse\n\t\t\t\t*inst = GROUP_SHIFT_N;\n\t\t} else\n\t\t\t*inst = GROUP_SHIFT_CL;\n\t\t*buf_ptr = 0;\n\t}\n\n\tif (!(b & SLJIT_MEM))\n\t\t*buf_ptr++ |= MOD_REG + ((!(flags & EX86_SSE2_OP2)) ? reg_lmap[b] : freg_lmap[b]);\n\telse if ((b & REG_MASK) != SLJIT_UNUSED) {\n\t\tif ((b & OFFS_REG_MASK) == SLJIT_UNUSED || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP)) {\n\t\t\tif (immb != 0 || reg_lmap[b & REG_MASK] == 5) {\n\t\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\t\t*buf_ptr |= 0x40;\n\t\t\t\telse\n\t\t\t\t\t*buf_ptr |= 0x80;\n\t\t\t}\n\n\t\t\tif ((b & OFFS_REG_MASK) == SLJIT_UNUSED)\n\t\t\t\t*buf_ptr++ |= reg_lmap[b & REG_MASK];\n\t\t\telse {\n\t\t\t\t*buf_ptr++ |= 0x04;\n\t\t\t\t*buf_ptr++ = reg_lmap[b & REG_MASK] | (reg_lmap[OFFS_REG(b)] << 3);\n\t\t\t}\n\n\t\t\tif (immb != 0 || reg_lmap[b & REG_MASK] == 5) {\n\t\t\t\tif (immb <= 127 && immb >= -128)\n\t\t\t\t\t*buf_ptr++ = immb; /* 8 bit displacement. */\n\t\t\t\telse {\n\t\t\t\t\tsljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */\n\t\t\t\t\tbuf_ptr += sizeof(sljit_s32);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (reg_lmap[b & REG_MASK] == 5)\n\t\t\t\t*buf_ptr |= 0x40;\n\t\t\t*buf_ptr++ |= 0x04;\n\t\t\t*buf_ptr++ = reg_lmap[b & REG_MASK] | (reg_lmap[OFFS_REG(b)] << 3) | (immb << 6);\n\t\t\tif (reg_lmap[b & REG_MASK] == 5)\n\t\t\t\t*buf_ptr++ = 0;\n\t\t}\n\t}\n\telse {\n\t\t*buf_ptr++ |= 0x04;\n\t\t*buf_ptr++ = 0x25;\n\t\tsljit_unaligned_store_s32(buf_ptr, immb); /* 32 bit displacement. */\n\t\tbuf_ptr += sizeof(sljit_s32);\n\t}\n\n\tif (a & SLJIT_IMM) {\n\t\tif (flags & EX86_BYTE_ARG)\n\t\t\t*buf_ptr = imma;\n\t\telse if (flags & EX86_HALF_ARG)\n\t\t\tsljit_unaligned_store_s16(buf_ptr, imma);\n\t\telse if (!(flags & EX86_SHIFT_INS))\n\t\t\tsljit_unaligned_store_s32(buf_ptr, imma);\n\t}\n\n\treturn !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);\n}\n\n/* --------------------------------------------------------------------- */\n/*  Call / return instructions                                           */\n/* --------------------------------------------------------------------- */\n\n#ifndef _WIN64\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src_ptr, sljit_sw srcw)\n{\n\tsljit_s32 src = src_ptr ? (*src_ptr) : 0;\n\tsljit_s32 word_arg_count = 0;\n\n\tSLJIT_ASSERT(reg_map[SLJIT_R1] == 6 && reg_map[SLJIT_R3] == 1 && reg_map[TMP_REG1] == 2);\n\n\tcompiler->mode32 = 0;\n\n\t/* Remove return value. */\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\tif ((arg_types & SLJIT_DEF_MASK) < SLJIT_ARG_TYPE_F32)\n\t\t\tword_arg_count++;\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (word_arg_count == 0)\n\t\treturn SLJIT_SUCCESS;\n\n\tif (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tEMIT_MOV(compiler, TMP_REG2, 0, src, srcw);\n\t\t*src_ptr = TMP_REG2;\n\t}\n\telse if (src == SLJIT_R2 && word_arg_count >= SLJIT_R2)\n\t\t*src_ptr = TMP_REG1;\n\n\tif (word_arg_count >= 3)\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R2, 0);\n\treturn emit_mov(compiler, SLJIT_R2, 0, SLJIT_R0, 0);\n}\n\n#else\n\nstatic sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 arg_types, sljit_s32 *src_ptr, sljit_sw srcw)\n{\n\tsljit_s32 src = src_ptr ? (*src_ptr) : 0;\n\tsljit_s32 arg_count = 0;\n\tsljit_s32 word_arg_count = 0;\n\tsljit_s32 float_arg_count = 0;\n\tsljit_s32 types = 0;\n\tsljit_s32 data_trandfer = 0;\n\tstatic sljit_u8 word_arg_regs[5] = { 0, SLJIT_R3, SLJIT_R1, SLJIT_R2, TMP_REG1 };\n\n\tSLJIT_ASSERT(reg_map[SLJIT_R3] == 1 && reg_map[SLJIT_R1] == 2 && reg_map[SLJIT_R2] == 8 && reg_map[TMP_REG1] == 9);\n\n\tcompiler->mode32 = 0;\n\targ_types >>= SLJIT_DEF_SHIFT;\n\n\twhile (arg_types) {\n\t\ttypes = (types << SLJIT_DEF_SHIFT) | (arg_types & SLJIT_DEF_MASK);\n\n\t\tswitch (arg_types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\targ_count++;\n\t\t\tfloat_arg_count++;\n\n\t\t\tif (arg_count != float_arg_count)\n\t\t\t\tdata_trandfer = 1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\targ_count++;\n\t\t\tword_arg_count++;\n\n\t\t\tif (arg_count != word_arg_count || arg_count != word_arg_regs[arg_count]) {\n\t\t\t\tdata_trandfer = 1;\n\n\t\t\t\tif (src == word_arg_regs[arg_count]) {\n\t\t\t\t\tEMIT_MOV(compiler, TMP_REG2, 0, src, 0);\n\t\t\t\t\t*src_ptr = TMP_REG2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\targ_types >>= SLJIT_DEF_SHIFT;\n\t}\n\n\tif (!data_trandfer)\n\t\treturn SLJIT_SUCCESS;\n\n\tif (src & SLJIT_MEM) {\n\t\tADJUST_LOCAL_OFFSET(src, srcw);\n\t\tEMIT_MOV(compiler, TMP_REG2, 0, src, srcw);\n\t\t*src_ptr = TMP_REG2;\n\t}\n\n\twhile (types) {\n\t\tswitch (types & SLJIT_DEF_MASK) {\n\t\tcase SLJIT_ARG_TYPE_F32:\n\t\t\tif (arg_count != float_arg_count)\n\t\t\t\tFAIL_IF(emit_sse2_load(compiler, 1, arg_count, float_arg_count, 0));\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tcase SLJIT_ARG_TYPE_F64:\n\t\t\tif (arg_count != float_arg_count)\n\t\t\t\tFAIL_IF(emit_sse2_load(compiler, 0, arg_count, float_arg_count, 0));\n\t\t\targ_count--;\n\t\t\tfloat_arg_count--;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (arg_count != word_arg_count || arg_count != word_arg_regs[arg_count])\n\t\t\t\tEMIT_MOV(compiler, word_arg_regs[arg_count], 0, word_arg_count, 0);\n\t\t\targ_count--;\n\t\t\tword_arg_count--;\n\t\t\tbreak;\n\t\t}\n\n\t\ttypes >>= SLJIT_DEF_SHIFT;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#endif\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types)\n{\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));\n\n\tPTR_FAIL_IF(call_with_args(compiler, arg_types, NULL, 0));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_jump(compiler, type);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 arg_types,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));\n\n\tFAIL_IF(call_with_args(compiler, arg_types, &src, srcw));\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\n\treturn sljit_emit_ijump(compiler, type, src, srcw);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)\n{\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\t/* For UNUSED dst. Uncommon, but possible. */\n\tif (dst == SLJIT_UNUSED)\n\t\tdst = TMP_REG1;\n\n\tif (FAST_IS_REG(dst)) {\n\t\tif (reg_map[dst] < 8) {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1);\n\t\t\tPOP_REG(reg_lmap[dst]);\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(2);\n\t\t*inst++ = REX_B;\n\t\tPOP_REG(reg_lmap[dst]);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* REX_W is not necessary (src is not immediate). */\n\tcompiler->mode32 = 1;\n\tinst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);\n\tFAIL_IF(!inst);\n\t*inst++ = POP_rm;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fast_return(compiler, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tif (FAST_IS_REG(src)) {\n\t\tif (reg_map[src] < 8) {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\n\t\t\tINC_SIZE(1 + 1);\n\t\t\tPUSH_REG(reg_lmap[src]);\n\t\t}\n\t\telse {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 1);\n\t\t\tFAIL_IF(!inst);\n\n\t\t\tINC_SIZE(2 + 1);\n\t\t\t*inst++ = REX_B;\n\t\t\tPUSH_REG(reg_lmap[src]);\n\t\t}\n\t}\n\telse {\n\t\t/* REX_W is not necessary (src is not immediate). */\n\t\tcompiler->mode32 = 1;\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_FF;\n\t\t*inst |= PUSH_rm;\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1);\n\t}\n\n\tRET();\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Extend input                                                         */\n/* --------------------------------------------------------------------- */\n\nstatic sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r;\n\n\tcompiler->mode32 = 0;\n\n\tif (dst == SLJIT_UNUSED && !(src & SLJIT_MEM))\n\t\treturn SLJIT_SUCCESS; /* Empty instruction. */\n\n\tif (src & SLJIT_IMM) {\n\t\tif (FAST_IS_REG(dst)) {\n\t\t\tif (sign || ((sljit_uw)srcw <= 0x7fffffff)) {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = MOV_rm_i32;\n\t\t\t\treturn SLJIT_SUCCESS;\n\t\t\t}\n\t\t\treturn emit_load_imm64(compiler, dst, srcw);\n\t\t}\n\t\tcompiler->mode32 = 1;\n\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_i32;\n\t\tcompiler->mode32 = 0;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif ((dst & SLJIT_MEM) && FAST_IS_REG(src))\n\t\tdst_r = src;\n\telse {\n\t\tif (sign) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src, srcw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst++ = MOVSXD_r_rm;\n\t\t} else {\n\t\t\tcompiler->mode32 = 1;\n\t\t\tFAIL_IF(emit_mov(compiler, dst_r, 0, src, srcw));\n\t\t\tcompiler->mode32 = 0;\n\t\t}\n\t}\n\n\tif (dst & SLJIT_MEM) {\n\t\tcompiler->mode32 = 1;\n\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_r;\n\t\tcompiler->mode32 = 0;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitNativeX86_common.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nSLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)\n{\n#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)\n\treturn \"x86\" SLJIT_CPUINFO \" ABI:fastcall\";\n#else\n\treturn \"x86\" SLJIT_CPUINFO;\n#endif\n}\n\n/*\n   32b register indexes:\n     0 - EAX\n     1 - ECX\n     2 - EDX\n     3 - EBX\n     4 - ESP\n     5 - EBP\n     6 - ESI\n     7 - EDI\n*/\n\n/*\n   64b register indexes:\n     0 - RAX\n     1 - RCX\n     2 - RDX\n     3 - RBX\n     4 - RSP\n     5 - RBP\n     6 - RSI\n     7 - RDI\n     8 - R8   - From now on REX prefix is required\n     9 - R9\n    10 - R10\n    11 - R11\n    12 - R12\n    13 - R13\n    14 - R14\n    15 - R15\n*/\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\n/* Last register + 1. */\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = {\n\t0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 7, 6, 3, 4, 5\n};\n\n#define CHECK_EXTRA_REGS(p, w, do) \\\n\tif (p >= SLJIT_R3 && p <= SLJIT_S3) { \\\n\t\tif (p <= compiler->scratches) \\\n\t\t\tw = compiler->saveds_offset - ((p) - SLJIT_R2) * (sljit_sw)sizeof(sljit_sw); \\\n\t\telse \\\n\t\t\tw = compiler->locals_offset + ((p) - SLJIT_S2) * (sljit_sw)sizeof(sljit_sw); \\\n\t\tp = SLJIT_MEM1(SLJIT_SP); \\\n\t\tdo; \\\n\t}\n\n#else /* SLJIT_CONFIG_X86_32 */\n\n/* Last register + 1. */\n#define TMP_REG1\t(SLJIT_NUMBER_OF_REGISTERS + 2)\n#define TMP_REG2\t(SLJIT_NUMBER_OF_REGISTERS + 3)\n\n/* Note: r12 & 0x7 == 0b100, which decoded as SIB byte present\n   Note: avoid to use r12 and r13 for memory addessing\n   therefore r12 is better to be a higher saved register. */\n#ifndef _WIN64\n/* Args: rdi(=7), rsi(=6), rdx(=2), rcx(=1), r8, r9. Scratches: rax(=0), r10, r11 */\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = {\n\t0, 0, 6, 7, 1, 8, 11, 10, 12, 5, 13, 14, 15, 3, 4, 2, 9\n};\n/* low-map. reg_map & 0x7. */\nstatic const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = {\n\t0, 0, 6, 7, 1, 0, 3,  2,  4,  5,  5,  6,  7, 3, 4, 2, 1\n};\n#else\n/* Args: rcx(=1), rdx(=2), r8, r9. Scratches: rax(=0), r10, r11 */\nstatic const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = {\n\t0, 0, 2, 8, 1, 11, 12, 5, 13, 14, 15, 7, 6, 3, 4, 9, 10\n};\n/* low-map. reg_map & 0x7. */\nstatic const sljit_u8 reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 4] = {\n\t0, 0, 2, 0, 1,  3,  4, 5,  5,  6,  7, 7, 6, 3, 4, 1,  2\n};\n#endif\n\n/* Args: xmm0-xmm3 */\nstatic const sljit_u8 freg_map[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = {\n\t4, 0, 1, 2, 3, 5, 6\n};\n/* low-map. freg_map & 0x7. */\nstatic const sljit_u8 freg_lmap[SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1] = {\n\t4, 0, 1, 2, 3, 5, 6\n};\n\n#define REX_W\t\t0x48\n#define REX_R\t\t0x44\n#define REX_X\t\t0x42\n#define REX_B\t\t0x41\n#define REX\t\t0x40\n\n#ifndef _WIN64\n#define HALFWORD_MAX 0x7fffffffl\n#define HALFWORD_MIN -0x80000000l\n#else\n#define HALFWORD_MAX 0x7fffffffll\n#define HALFWORD_MIN -0x80000000ll\n#endif\n\n#define IS_HALFWORD(x)\t\t((x) <= HALFWORD_MAX && (x) >= HALFWORD_MIN)\n#define NOT_HALFWORD(x)\t\t((x) > HALFWORD_MAX || (x) < HALFWORD_MIN)\n\n#define CHECK_EXTRA_REGS(p, w, do)\n\n#endif /* SLJIT_CONFIG_X86_32 */\n\n#define TMP_FREG\t(0)\n\n/* Size flags for emit_x86_instruction: */\n#define EX86_BIN_INS\t\t0x0010\n#define EX86_SHIFT_INS\t\t0x0020\n#define EX86_REX\t\t0x0040\n#define EX86_NO_REXW\t\t0x0080\n#define EX86_BYTE_ARG\t\t0x0100\n#define EX86_HALF_ARG\t\t0x0200\n#define EX86_PREF_66\t\t0x0400\n#define EX86_PREF_F2\t\t0x0800\n#define EX86_PREF_F3\t\t0x1000\n#define EX86_SSE2_OP1\t\t0x2000\n#define EX86_SSE2_OP2\t\t0x4000\n#define EX86_SSE2\t\t(EX86_SSE2_OP1 | EX86_SSE2_OP2)\n\n/* --------------------------------------------------------------------- */\n/*  Instrucion forms                                                     */\n/* --------------------------------------------------------------------- */\n\n#define ADD\t\t(/* BINARY */ 0 << 3)\n#define ADD_EAX_i32\t0x05\n#define ADD_r_rm\t0x03\n#define ADD_rm_r\t0x01\n#define ADDSD_x_xm\t0x58\n#define ADC\t\t(/* BINARY */ 2 << 3)\n#define ADC_EAX_i32\t0x15\n#define ADC_r_rm\t0x13\n#define ADC_rm_r\t0x11\n#define AND\t\t(/* BINARY */ 4 << 3)\n#define AND_EAX_i32\t0x25\n#define AND_r_rm\t0x23\n#define AND_rm_r\t0x21\n#define ANDPD_x_xm\t0x54\n#define BSR_r_rm\t(/* GROUP_0F */ 0xbd)\n#define CALL_i32\t0xe8\n#define CALL_rm\t\t(/* GROUP_FF */ 2 << 3)\n#define CDQ\t\t0x99\n#define CMOVE_r_rm\t(/* GROUP_0F */ 0x44)\n#define CMP\t\t(/* BINARY */ 7 << 3)\n#define CMP_EAX_i32\t0x3d\n#define CMP_r_rm\t0x3b\n#define CMP_rm_r\t0x39\n#define CVTPD2PS_x_xm\t0x5a\n#define CVTSI2SD_x_rm\t0x2a\n#define CVTTSD2SI_r_xm\t0x2c\n#define DIV\t\t(/* GROUP_F7 */ 6 << 3)\n#define DIVSD_x_xm\t0x5e\n#define FSTPS\t\t0xd9\n#define FSTPD\t\t0xdd\n#define INT3\t\t0xcc\n#define IDIV\t\t(/* GROUP_F7 */ 7 << 3)\n#define IMUL\t\t(/* GROUP_F7 */ 5 << 3)\n#define IMUL_r_rm\t(/* GROUP_0F */ 0xaf)\n#define IMUL_r_rm_i8\t0x6b\n#define IMUL_r_rm_i32\t0x69\n#define JE_i8\t\t0x74\n#define JNE_i8\t\t0x75\n#define JMP_i8\t\t0xeb\n#define JMP_i32\t\t0xe9\n#define JMP_rm\t\t(/* GROUP_FF */ 4 << 3)\n#define LEA_r_m\t\t0x8d\n#define MOV_r_rm\t0x8b\n#define MOV_r_i32\t0xb8\n#define MOV_rm_r\t0x89\n#define MOV_rm_i32\t0xc7\n#define MOV_rm8_i8\t0xc6\n#define MOV_rm8_r8\t0x88\n#define MOVSD_x_xm\t0x10\n#define MOVSD_xm_x\t0x11\n#define MOVSXD_r_rm\t0x63\n#define MOVSX_r_rm8\t(/* GROUP_0F */ 0xbe)\n#define MOVSX_r_rm16\t(/* GROUP_0F */ 0xbf)\n#define MOVZX_r_rm8\t(/* GROUP_0F */ 0xb6)\n#define MOVZX_r_rm16\t(/* GROUP_0F */ 0xb7)\n#define MUL\t\t(/* GROUP_F7 */ 4 << 3)\n#define MULSD_x_xm\t0x59\n#define NEG_rm\t\t(/* GROUP_F7 */ 3 << 3)\n#define NOP\t\t0x90\n#define NOT_rm\t\t(/* GROUP_F7 */ 2 << 3)\n#define OR\t\t(/* BINARY */ 1 << 3)\n#define OR_r_rm\t\t0x0b\n#define OR_EAX_i32\t0x0d\n#define OR_rm_r\t\t0x09\n#define OR_rm8_r8\t0x08\n#define POP_r\t\t0x58\n#define POP_rm\t\t0x8f\n#define POPF\t\t0x9d\n#define PREFETCH\t0x18\n#define PUSH_i32\t0x68\n#define PUSH_r\t\t0x50\n#define PUSH_rm\t\t(/* GROUP_FF */ 6 << 3)\n#define PUSHF\t\t0x9c\n#define RET_near\t0xc3\n#define RET_i16\t\t0xc2\n#define SBB\t\t(/* BINARY */ 3 << 3)\n#define SBB_EAX_i32\t0x1d\n#define SBB_r_rm\t0x1b\n#define SBB_rm_r\t0x19\n#define SAR\t\t(/* SHIFT */ 7 << 3)\n#define SHL\t\t(/* SHIFT */ 4 << 3)\n#define SHR\t\t(/* SHIFT */ 5 << 3)\n#define SUB\t\t(/* BINARY */ 5 << 3)\n#define SUB_EAX_i32\t0x2d\n#define SUB_r_rm\t0x2b\n#define SUB_rm_r\t0x29\n#define SUBSD_x_xm\t0x5c\n#define TEST_EAX_i32\t0xa9\n#define TEST_rm_r\t0x85\n#define UCOMISD_x_xm\t0x2e\n#define UNPCKLPD_x_xm\t0x14\n#define XCHG_EAX_r\t0x90\n#define XCHG_r_rm\t0x87\n#define XOR\t\t(/* BINARY */ 6 << 3)\n#define XOR_EAX_i32\t0x35\n#define XOR_r_rm\t0x33\n#define XOR_rm_r\t0x31\n#define XORPD_x_xm\t0x57\n\n#define GROUP_0F\t0x0f\n#define GROUP_F7\t0xf7\n#define GROUP_FF\t0xff\n#define GROUP_BINARY_81\t0x81\n#define GROUP_BINARY_83\t0x83\n#define GROUP_SHIFT_1\t0xd1\n#define GROUP_SHIFT_N\t0xc1\n#define GROUP_SHIFT_CL\t0xd3\n\n#define MOD_REG\t\t0xc0\n#define MOD_DISP8\t0x40\n\n#define INC_SIZE(s)\t\t\t(*inst++ = (s), compiler->size += (s))\n\n#define PUSH_REG(r)\t\t\t(*inst++ = (PUSH_r + (r)))\n#define POP_REG(r)\t\t\t(*inst++ = (POP_r + (r)))\n#define RET()\t\t\t\t(*inst++ = (RET_near))\n#define RET_I16(n)\t\t\t(*inst++ = (RET_i16), *inst++ = n, *inst++ = 0)\n/* r32, r/m32 */\n#define MOV_RM(mod, reg, rm)\t\t(*inst++ = (MOV_r_rm), *inst++ = (mod) << 6 | (reg) << 3 | (rm))\n\n/* Multithreading does not affect these static variables, since they store\n   built-in CPU features. Therefore they can be overwritten by different threads\n   if they detect the CPU features in the same time. */\n#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)\nstatic sljit_s32 cpu_has_sse2 = -1;\n#endif\nstatic sljit_s32 cpu_has_cmov = -1;\n\n#ifdef _WIN32_WCE\n#include <cmnintrin.h>\n#elif defined(_MSC_VER) && _MSC_VER >= 1400\n#include <intrin.h>\n#endif\n\n/******************************************************/\n/*    Unaligned-store functions                       */\n/******************************************************/\n\nstatic SLJIT_INLINE void sljit_unaligned_store_s16(void *addr, sljit_s16 value)\n{\n\tSLJIT_MEMCPY(addr, &value, sizeof(value));\n}\n\nstatic SLJIT_INLINE void sljit_unaligned_store_s32(void *addr, sljit_s32 value)\n{\n\tSLJIT_MEMCPY(addr, &value, sizeof(value));\n}\n\nstatic SLJIT_INLINE void sljit_unaligned_store_sw(void *addr, sljit_sw value)\n{\n\tSLJIT_MEMCPY(addr, &value, sizeof(value));\n}\n\n/******************************************************/\n/*    Utility functions                               */\n/******************************************************/\n\nstatic void get_cpu_features(void)\n{\n\tsljit_u32 features;\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n\n\tint CPUInfo[4];\n\t__cpuid(CPUInfo, 1);\n\tfeatures = (sljit_u32)CPUInfo[3];\n\n#elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C)\n\n\t/* AT&T syntax. */\n\t__asm__ (\n\t\t\"movl $0x1, %%eax\\n\"\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t/* On x86-32, there is no red zone, so this\n\t\t   should work (no need for a local variable). */\n\t\t\"push %%ebx\\n\"\n#endif\n\t\t\"cpuid\\n\"\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\"pop %%ebx\\n\"\n#endif\n\t\t\"movl %%edx, %0\\n\"\n\t\t: \"=g\" (features)\n\t\t:\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t: \"%eax\", \"%ecx\", \"%edx\"\n#else\n\t\t: \"%rax\", \"%rbx\", \"%rcx\", \"%rdx\"\n#endif\n\t);\n\n#else /* _MSC_VER && _MSC_VER >= 1400 */\n\n\t/* Intel syntax. */\n\t__asm {\n\t\tmov eax, 1\n\t\tcpuid\n\t\tmov features, edx\n\t}\n\n#endif /* _MSC_VER && _MSC_VER >= 1400 */\n\n#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)\n\tcpu_has_sse2 = (features >> 26) & 0x1;\n#endif\n\tcpu_has_cmov = (features >> 15) & 0x1;\n}\n\nstatic sljit_u8 get_jump_code(sljit_s32 type)\n{\n\tswitch (type) {\n\tcase SLJIT_EQUAL:\n\tcase SLJIT_EQUAL_F64:\n\t\treturn 0x84 /* je */;\n\n\tcase SLJIT_NOT_EQUAL:\n\tcase SLJIT_NOT_EQUAL_F64:\n\t\treturn 0x85 /* jne */;\n\n\tcase SLJIT_LESS:\n\tcase SLJIT_LESS_F64:\n\t\treturn 0x82 /* jc */;\n\n\tcase SLJIT_GREATER_EQUAL:\n\tcase SLJIT_GREATER_EQUAL_F64:\n\t\treturn 0x83 /* jae */;\n\n\tcase SLJIT_GREATER:\n\tcase SLJIT_GREATER_F64:\n\t\treturn 0x87 /* jnbe */;\n\n\tcase SLJIT_LESS_EQUAL:\n\tcase SLJIT_LESS_EQUAL_F64:\n\t\treturn 0x86 /* jbe */;\n\n\tcase SLJIT_SIG_LESS:\n\t\treturn 0x8c /* jl */;\n\n\tcase SLJIT_SIG_GREATER_EQUAL:\n\t\treturn 0x8d /* jnl */;\n\n\tcase SLJIT_SIG_GREATER:\n\t\treturn 0x8f /* jnle */;\n\n\tcase SLJIT_SIG_LESS_EQUAL:\n\t\treturn 0x8e /* jle */;\n\n\tcase SLJIT_OVERFLOW:\n\tcase SLJIT_MUL_OVERFLOW:\n\t\treturn 0x80 /* jo */;\n\n\tcase SLJIT_NOT_OVERFLOW:\n\tcase SLJIT_MUL_NOT_OVERFLOW:\n\t\treturn 0x81 /* jno */;\n\n\tcase SLJIT_UNORDERED_F64:\n\t\treturn 0x8a /* jp */;\n\n\tcase SLJIT_ORDERED_F64:\n\t\treturn 0x8b /* jpo */;\n\t}\n\treturn 0;\n}\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\nstatic sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type, sljit_sw executable_offset);\n#else\nstatic sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type);\n#endif\n\nstatic sljit_u8* generate_near_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_u8 *code, sljit_s32 type, sljit_sw executable_offset)\n{\n\tsljit_s32 short_jump;\n\tsljit_uw label_addr;\n\n\tif (jump->flags & JUMP_LABEL)\n\t\tlabel_addr = (sljit_uw)(code + jump->u.label->size);\n\telse\n\t\tlabel_addr = jump->u.target - executable_offset;\n\n\tshort_jump = (sljit_sw)(label_addr - (jump->addr + 2)) >= -128 && (sljit_sw)(label_addr - (jump->addr + 2)) <= 127;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif ((sljit_sw)(label_addr - (jump->addr + 1)) > HALFWORD_MAX || (sljit_sw)(label_addr - (jump->addr + 1)) < HALFWORD_MIN)\n\t\treturn generate_far_jump_code(jump, code_ptr, type);\n#endif\n\n\tif (type == SLJIT_JUMP) {\n\t\tif (short_jump)\n\t\t\t*code_ptr++ = JMP_i8;\n\t\telse\n\t\t\t*code_ptr++ = JMP_i32;\n\t\tjump->addr++;\n\t}\n\telse if (type >= SLJIT_FAST_CALL) {\n\t\tshort_jump = 0;\n\t\t*code_ptr++ = CALL_i32;\n\t\tjump->addr++;\n\t}\n\telse if (short_jump) {\n\t\t*code_ptr++ = get_jump_code(type) - 0x10;\n\t\tjump->addr++;\n\t}\n\telse {\n\t\t*code_ptr++ = GROUP_0F;\n\t\t*code_ptr++ = get_jump_code(type);\n\t\tjump->addr += 2;\n\t}\n\n\tif (short_jump) {\n\t\tjump->flags |= PATCH_MB;\n\t\tcode_ptr += sizeof(sljit_s8);\n\t} else {\n\t\tjump->flags |= PATCH_MW;\n\t\tcode_ptr += sizeof(sljit_s32);\n\t}\n\n\treturn code_ptr;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)\n{\n\tstruct sljit_memory_fragment *buf;\n\tsljit_u8 *code;\n\tsljit_u8 *code_ptr;\n\tsljit_u8 *buf_ptr;\n\tsljit_u8 *buf_end;\n\tsljit_u8 len;\n\tsljit_sw executable_offset;\n\tsljit_sw jump_addr;\n\n\tstruct sljit_label *label;\n\tstruct sljit_jump *jump;\n\tstruct sljit_const *const_;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_generate_code(compiler));\n\treverse_buf(compiler);\n\n\t/* Second code generation pass. */\n\tcode = (sljit_u8*)SLJIT_MALLOC_EXEC(compiler->size);\n\tPTR_FAIL_WITH_EXEC_IF(code);\n\tbuf = compiler->buf;\n\n\tcode_ptr = code;\n\tlabel = compiler->labels;\n\tjump = compiler->jumps;\n\tconst_ = compiler->consts;\n\texecutable_offset = SLJIT_EXEC_OFFSET(code);\n\n\tdo {\n\t\tbuf_ptr = buf->memory;\n\t\tbuf_end = buf_ptr + buf->used_size;\n\t\tdo {\n\t\t\tlen = *buf_ptr++;\n\t\t\tif (len > 0) {\n\t\t\t\t/* The code is already generated. */\n\t\t\t\tSLJIT_MEMCPY(code_ptr, buf_ptr, len);\n\t\t\t\tcode_ptr += len;\n\t\t\t\tbuf_ptr += len;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (*buf_ptr >= 2) {\n\t\t\t\t\tjump->addr = (sljit_uw)code_ptr;\n\t\t\t\t\tif (!(jump->flags & SLJIT_REWRITABLE_JUMP))\n\t\t\t\t\t\tcode_ptr = generate_near_jump_code(jump, code_ptr, code, *buf_ptr - 2, executable_offset);\n\t\t\t\t\telse {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\t\t\t\tcode_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2, executable_offset);\n#else\n\t\t\t\t\t\tcode_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 2);\n#endif\n\t\t\t\t\t}\n\t\t\t\t\tjump = jump->next;\n\t\t\t\t}\n\t\t\t\telse if (*buf_ptr == 0) {\n\t\t\t\t\tlabel->addr = ((sljit_uw)code_ptr) + executable_offset;\n\t\t\t\t\tlabel->size = code_ptr - code;\n\t\t\t\t\tlabel = label->next;\n\t\t\t\t}\n\t\t\t\telse { /* *buf_ptr is 1 */\n\t\t\t\t\tconst_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw);\n\t\t\t\t\tconst_ = const_->next;\n\t\t\t\t}\n\t\t\t\tbuf_ptr++;\n\t\t\t}\n\t\t} while (buf_ptr < buf_end);\n\t\tSLJIT_ASSERT(buf_ptr == buf_end);\n\t\tbuf = buf->next;\n\t} while (buf);\n\n\tSLJIT_ASSERT(!label);\n\tSLJIT_ASSERT(!jump);\n\tSLJIT_ASSERT(!const_);\n\n\tjump = compiler->jumps;\n\twhile (jump) {\n\t\tjump_addr = jump->addr + executable_offset;\n\n\t\tif (jump->flags & PATCH_MB) {\n\t\t\tSLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8))) >= -128 && (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8))) <= 127);\n\t\t\t*(sljit_u8*)jump->addr = (sljit_u8)(jump->u.label->addr - (jump_addr + sizeof(sljit_s8)));\n\t\t} else if (jump->flags & PATCH_MW) {\n\t\t\tif (jump->flags & JUMP_LABEL) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\t\tsljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_sw))));\n#else\n\t\t\t\tSLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32))) <= HALFWORD_MAX);\n\t\t\t\tsljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.label->addr - (jump_addr + sizeof(sljit_s32))));\n#endif\n\t\t\t}\n\t\t\telse {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\t\tsljit_unaligned_store_sw((void*)jump->addr, (sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_sw))));\n#else\n\t\t\t\tSLJIT_ASSERT((sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_s32))) >= HALFWORD_MIN && (sljit_sw)(jump->u.target - (jump_addr + sizeof(sljit_s32))) <= HALFWORD_MAX);\n\t\t\t\tsljit_unaligned_store_s32((void*)jump->addr, (sljit_s32)(jump->u.target - (jump_addr + sizeof(sljit_s32))));\n#endif\n\t\t\t}\n\t\t}\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\telse if (jump->flags & PATCH_MD)\n\t\t\tsljit_unaligned_store_sw((void*)jump->addr, jump->u.label->addr);\n#endif\n\n\t\tjump = jump->next;\n\t}\n\n\t/* Some space may be wasted because of short jumps. */\n\tSLJIT_ASSERT(code_ptr <= code + compiler->size);\n\tcompiler->error = SLJIT_ERR_COMPILED;\n\tcompiler->executable_offset = executable_offset;\n\tcompiler->executable_size = code_ptr - code;\n\treturn (void*)(code + executable_offset);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)\n{\n\tswitch (feature_type) {\n\tcase SLJIT_HAS_FPU:\n#ifdef SLJIT_IS_FPU_AVAILABLE\n\t\treturn SLJIT_IS_FPU_AVAILABLE;\n#elif (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)\n\t\tif (cpu_has_sse2 == -1)\n\t\t\tget_cpu_features();\n\t\treturn cpu_has_sse2;\n#else /* SLJIT_DETECT_SSE2 */\n\t\treturn 1;\n#endif /* SLJIT_DETECT_SSE2 */\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tcase SLJIT_HAS_VIRTUAL_REGISTERS:\n\t\treturn 1;\n#endif\n\n\tcase SLJIT_HAS_CLZ:\n\tcase SLJIT_HAS_CMOV:\n\t\tif (cpu_has_cmov == -1)\n\t\t\tget_cpu_features();\n\t\treturn cpu_has_cmov;\n\n\tcase SLJIT_HAS_SSE2:\n#if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)\n\t\tif (cpu_has_sse2 == -1)\n\t\t\tget_cpu_features();\n\t\treturn cpu_has_sse2;\n#else\n\t\treturn 1;\n#endif\n\n\tdefault:\n\t\treturn 0;\n\t}\n}\n\n/* --------------------------------------------------------------------- */\n/*  Operators                                                            */\n/* --------------------------------------------------------------------- */\n\n#define BINARY_OPCODE(opcode) (((opcode ## _EAX_i32) << 24) | ((opcode ## _r_rm) << 16) | ((opcode ## _rm_r) << 8) | (opcode))\n\nstatic sljit_s32 emit_cum_binary(struct sljit_compiler *compiler,\n\tsljit_u32 op_types,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\nstatic sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler,\n\tsljit_u32 op_types,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w);\n\nstatic sljit_s32 emit_mov(struct sljit_compiler *compiler,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw);\n\n#define EMIT_MOV(compiler, dst, dstw, src, srcw) \\\n\tFAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));\n\nstatic SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler,\n\tsljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src);\n\nstatic SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler,\n\tsljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw);\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n#include \"sljitNativeX86_32.c\"\n#else\n#include \"sljitNativeX86_64.c\"\n#endif\n\nstatic sljit_s32 emit_mov(struct sljit_compiler *compiler,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\n\tSLJIT_ASSERT(dst != SLJIT_UNUSED);\n\n\tif (FAST_IS_REG(src)) {\n\t\tinst = emit_x86_instruction(compiler, 1, src, 0, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_r;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\tif (src & SLJIT_IMM) {\n\t\tif (FAST_IS_REG(dst)) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\treturn emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);\n#else\n\t\t\tif (!compiler->mode32) {\n\t\t\t\tif (NOT_HALFWORD(srcw))\n\t\t\t\t\treturn emit_load_imm64(compiler, dst, srcw);\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn emit_do_imm32(compiler, (reg_map[dst] >= 8) ? REX_B : 0, MOV_r_i32 + reg_lmap[dst], srcw);\n#endif\n\t\t}\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (!compiler->mode32 && NOT_HALFWORD(srcw)) {\n\t\t\t/* Immediate to memory move. Only SLJIT_MOV operation copies\n\t\t\t   an immediate directly into memory so TMP_REG1 can be used. */\n\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG1, srcw));\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = MOV_rm_r;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n#endif\n\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_i32;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\tif (FAST_IS_REG(dst)) {\n\t\tinst = emit_x86_instruction(compiler, 1, dst, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_r_rm;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* Memory to memory move. Only SLJIT_MOV operation copies\n\t   data from memory to memory so TMP_REG1 can be used. */\n\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst = MOV_r_rm;\n\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw);\n\tFAIL_IF(!inst);\n\t*inst = MOV_rm_r;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)\n{\n\tsljit_u8 *inst;\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tsljit_s32 size;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op0(compiler, op));\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_BREAKPOINT:\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1);\n\t\t*inst = INT3;\n\t\tbreak;\n\tcase SLJIT_NOP:\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1);\n\t\t*inst = NOP;\n\t\tbreak;\n\tcase SLJIT_LMUL_UW:\n\tcase SLJIT_LMUL_SW:\n\tcase SLJIT_DIVMOD_UW:\n\tcase SLJIT_DIVMOD_SW:\n\tcase SLJIT_DIV_UW:\n\tcase SLJIT_DIV_SW:\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n#ifdef _WIN64\n\t\tSLJIT_ASSERT(\n\t\t\treg_map[SLJIT_R0] == 0\n\t\t\t&& reg_map[SLJIT_R1] == 2\n\t\t\t&& reg_map[TMP_REG1] > 7);\n#else\n\t\tSLJIT_ASSERT(\n\t\t\treg_map[SLJIT_R0] == 0\n\t\t\t&& reg_map[SLJIT_R1] < 7\n\t\t\t&& reg_map[TMP_REG1] == 2);\n#endif\n\t\tcompiler->mode32 = op & SLJIT_I32_OP;\n#endif\n\t\tSLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);\n\n\t\top = GET_OPCODE(op);\n\t\tif ((op | 0x2) == SLJIT_DIV_UW) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);\n\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_R1, 0, SLJIT_R1, 0);\n#else\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG1, 0);\n#endif\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = XOR_r_rm;\n\t\t}\n\n\t\tif ((op | 0x2) == SLJIT_DIV_SW) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);\n#endif\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1);\n\t\t\t*inst = CDQ;\n#else\n\t\t\tif (compiler->mode32) {\n\t\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\tINC_SIZE(1);\n\t\t\t\t*inst = CDQ;\n\t\t\t} else {\n\t\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\tINC_SIZE(2);\n\t\t\t\t*inst++ = REX_W;\n\t\t\t\t*inst = CDQ;\n\t\t\t}\n#endif\n\t\t}\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(2);\n\t\t*inst++ = GROUP_F7;\n\t\t*inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]);\n#else\n#ifdef _WIN64\n\t\tsize = (!compiler->mode32 || op >= SLJIT_DIVMOD_UW) ? 3 : 2;\n#else\n\t\tsize = (!compiler->mode32) ? 3 : 2;\n#endif\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(size);\n#ifdef _WIN64\n\t\tif (!compiler->mode32)\n\t\t\t*inst++ = REX_W | ((op >= SLJIT_DIVMOD_UW) ? REX_B : 0);\n\t\telse if (op >= SLJIT_DIVMOD_UW)\n\t\t\t*inst++ = REX_B;\n\t\t*inst++ = GROUP_F7;\n\t\t*inst = MOD_REG | ((op >= SLJIT_DIVMOD_UW) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]);\n#else\n\t\tif (!compiler->mode32)\n\t\t\t*inst++ = REX_W;\n\t\t*inst++ = GROUP_F7;\n\t\t*inst = MOD_REG | reg_map[SLJIT_R1];\n#endif\n#endif\n\t\tswitch (op) {\n\t\tcase SLJIT_LMUL_UW:\n\t\t\t*inst |= MUL;\n\t\t\tbreak;\n\t\tcase SLJIT_LMUL_SW:\n\t\t\t*inst |= IMUL;\n\t\t\tbreak;\n\t\tcase SLJIT_DIVMOD_UW:\n\t\tcase SLJIT_DIV_UW:\n\t\t\t*inst |= DIV;\n\t\t\tbreak;\n\t\tcase SLJIT_DIVMOD_SW:\n\t\tcase SLJIT_DIV_SW:\n\t\t\t*inst |= IDIV;\n\t\t\tbreak;\n\t\t}\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !defined(_WIN64)\n\t\tif (op <= SLJIT_DIVMOD_SW)\n\t\t\tEMIT_MOV(compiler, SLJIT_R1, 0, TMP_REG1, 0);\n#else\n\t\tif (op >= SLJIT_DIV_UW)\n\t\t\tEMIT_MOV(compiler, SLJIT_R1, 0, TMP_REG1, 0);\n#endif\n\t\tbreak;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#define ENCODE_PREFIX(prefix) \\\n\tdo { \\\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1); \\\n\t\tFAIL_IF(!inst); \\\n\t\tINC_SIZE(1); \\\n\t\t*inst = (prefix); \\\n\t} while (0)\n\nstatic sljit_s32 emit_mov_byte(struct sljit_compiler *compiler, sljit_s32 sign,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r;\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tsljit_s32 work_r;\n#endif\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 0;\n#endif\n\n\tif (src & SLJIT_IMM) {\n\t\tif (FAST_IS_REG(dst)) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\treturn emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);\n#else\n\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = MOV_rm_i32;\n\t\t\treturn SLJIT_SUCCESS;\n#endif\n\t\t}\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_BYTE_ARG | EX86_NO_REXW, SLJIT_IMM, srcw, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm8_i8;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif ((dst & SLJIT_MEM) && FAST_IS_REG(src)) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tif (reg_map[src] >= 4) {\n\t\t\tSLJIT_ASSERT(dst_r == TMP_REG1);\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src, 0);\n\t\t} else\n\t\t\tdst_r = src;\n#else\n\t\tdst_r = src;\n#endif\n\t}\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\telse if (FAST_IS_REG(src) && reg_map[src] >= 4) {\n\t\t/* src, dst are registers. */\n\t\tSLJIT_ASSERT(SLOW_IS_REG(dst));\n\t\tif (reg_map[dst] < 4) {\n\t\t\tif (dst != src)\n\t\t\t\tEMIT_MOV(compiler, dst, 0, src, 0);\n\t\t\tinst = emit_x86_instruction(compiler, 2, dst, 0, dst, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;\n\t\t}\n\t\telse {\n\t\t\tif (dst != src)\n\t\t\t\tEMIT_MOV(compiler, dst, 0, src, 0);\n\t\t\tif (sign) {\n\t\t\t\t/* shl reg, 24 */\n\t\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst |= SHL;\n\t\t\t\t/* sar reg, 24 */\n\t\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst |= SAR;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 0xff, dst, 0);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*(inst + 1) |= AND;\n\t\t\t}\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n#endif\n\telse {\n\t\t/* src can be memory addr or reg_map[src] < 4 on x86_32 architectures. */\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;\n\t}\n\n\tif (dst & SLJIT_MEM) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tif (dst_r == TMP_REG1) {\n\t\t\t/* Find a non-used register, whose reg_map[src] < 4. */\n\t\t\tif ((dst & REG_MASK) == SLJIT_R0) {\n\t\t\t\tif ((dst & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_R1))\n\t\t\t\t\twork_r = SLJIT_R2;\n\t\t\t\telse\n\t\t\t\t\twork_r = SLJIT_R1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ((dst & OFFS_REG_MASK) != TO_OFFS_REG(SLJIT_R0))\n\t\t\t\t\twork_r = SLJIT_R0;\n\t\t\t\telse if ((dst & REG_MASK) == SLJIT_R1)\n\t\t\t\t\twork_r = SLJIT_R2;\n\t\t\t\telse\n\t\t\t\t\twork_r = SLJIT_R1;\n\t\t\t}\n\n\t\t\tif (work_r == SLJIT_R0) {\n\t\t\t\tENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REG1]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = XCHG_r_rm;\n\t\t\t}\n\n\t\t\tinst = emit_x86_instruction(compiler, 1, work_r, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = MOV_rm8_r8;\n\n\t\t\tif (work_r == SLJIT_R0) {\n\t\t\t\tENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REG1]);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = XCHG_r_rm;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = MOV_rm8_r8;\n\t\t}\n#else\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_REX | EX86_NO_REXW, dst_r, 0, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm8_r8;\n#endif\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_prefetch(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 1;\n#endif\n\n\tinst = emit_x86_instruction(compiler, 2, 0, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst++ = PREFETCH;\n\n\tif (op >= SLJIT_MOV_U8 && op <= SLJIT_MOV_S8)\n\t\t*inst |= (3 << 3);\n\telse if (op >= SLJIT_MOV_U16 && op <= SLJIT_MOV_S16)\n\t\t*inst |= (2 << 3);\n\telse\n\t\t*inst |= (1 << 3);\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_mov_half(struct sljit_compiler *compiler, sljit_s32 sign,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 0;\n#endif\n\n\tif (src & SLJIT_IMM) {\n\t\tif (FAST_IS_REG(dst)) {\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\treturn emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);\n#else\n\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = MOV_rm_i32;\n\t\t\treturn SLJIT_SUCCESS;\n#endif\n\t\t}\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_HALF_ARG | EX86_NO_REXW | EX86_PREF_66, SLJIT_IMM, srcw, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_i32;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif ((dst & SLJIT_MEM) && FAST_IS_REG(src))\n\t\tdst_r = src;\n\telse {\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = sign ? MOVSX_r_rm16 : MOVZX_r_rm16;\n\t}\n\n\tif (dst & SLJIT_MEM) {\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_NO_REXW | EX86_PREF_66, dst_r, 0, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst = MOV_rm_r;\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_unary(struct sljit_compiler *compiler, sljit_u8 opcode,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\n\tif (dst == src && dstw == srcw) {\n\t\t/* Same input and output */\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_F7;\n\t\t*inst |= opcode;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (SLJIT_UNLIKELY(dst == SLJIT_UNUSED))\n\t\tdst = TMP_REG1;\n\n\tif (FAST_IS_REG(dst)) {\n\t\tEMIT_MOV(compiler, dst, 0, src, srcw);\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_F7;\n\t\t*inst |= opcode;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tEMIT_MOV(compiler, TMP_REG1, 0, src, srcw);\n\tinst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_F7;\n\t*inst |= opcode;\n\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_not_with_flags(struct sljit_compiler *compiler,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\n\tif (dst == SLJIT_UNUSED)\n\t\tdst = TMP_REG1;\n\n\tif (FAST_IS_REG(dst)) {\n\t\tEMIT_MOV(compiler, dst, 0, src, srcw);\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, dst, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_F7;\n\t\t*inst |= NOT_rm;\n\t\tinst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst = OR_r_rm;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tEMIT_MOV(compiler, TMP_REG1, 0, src, srcw);\n\tinst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REG1, 0);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_F7;\n\t*inst |= NOT_rm;\n\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, TMP_REG1, 0);\n\tFAIL_IF(!inst);\n\t*inst = OR_r_rm;\n\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\treturn SLJIT_SUCCESS;\n}\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\nstatic const sljit_sw emit_clz_arg = 32 + 31;\n#endif\n\nstatic sljit_s32 emit_clz(struct sljit_compiler *compiler, sljit_s32 op_flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r;\n\n\tSLJIT_UNUSED_ARG(op_flags);\n\n\tif (cpu_has_cmov == -1)\n\t\tget_cpu_features();\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = BSR_r_rm;\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tif (cpu_has_cmov) {\n\t\tif (dst_r != TMP_REG1) {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 32 + 31);\n\t\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG1, 0);\n\t\t}\n\t\telse\n\t\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, SLJIT_MEM0(), (sljit_sw)&emit_clz_arg);\n\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = CMOVE_r_rm;\n\t}\n\telse\n\t\tFAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, 32 + 31));\n\n\tinst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 31, dst_r, 0);\n#else\n\tif (cpu_has_cmov) {\n\t\tEMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? (64 + 63) : (32 + 31));\n\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = CMOVE_r_rm;\n\t}\n\telse\n\t\tFAIL_IF(sljit_emit_cmov_generic(compiler, SLJIT_EQUAL, dst_r, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? (64 + 63) : (32 + 31)));\n\n\tinst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, !(op_flags & SLJIT_I32_OP) ? 63 : 31, dst_r, 0);\n#endif\n\n\tFAIL_IF(!inst);\n\t*(inst + 1) |= XOR;\n\n\tif (dst & SLJIT_MEM)\n\t\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 op_flags = GET_ALL_FLAGS(op);\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tsljit_s32 dst_is_ereg = 0;\n#endif\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tCHECK_EXTRA_REGS(dst, dstw, dst_is_ereg = 1);\n\tCHECK_EXTRA_REGS(src, srcw, (void)0);\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = op_flags & SLJIT_I32_OP;\n#endif\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op)) {\n\t\tif (op <= SLJIT_MOV_P && (src & SLJIT_MEM))\n\t\t\treturn emit_prefetch(compiler, op, src, srcw);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\top = GET_OPCODE(op);\n\n\tif (op >= SLJIT_MOV && op <= SLJIT_MOV_P) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tcompiler->mode32 = 0;\n#endif\n\n\t\tif (FAST_IS_REG(src) && src == dst) {\n\t\t\tif (!TYPE_CAST_NEEDED(op))\n\t\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tif (op_flags & SLJIT_I32_OP) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif (src & SLJIT_MEM) {\n\t\t\t\tif (op == SLJIT_MOV_S32)\n\t\t\t\t\top = SLJIT_MOV_U32;\n\t\t\t}\n\t\t\telse if (src & SLJIT_IMM) {\n\t\t\t\tif (op == SLJIT_MOV_U32)\n\t\t\t\t\top = SLJIT_MOV_S32;\n\t\t\t}\n#endif\n\t\t}\n\n\t\tif (src & SLJIT_IMM) {\n\t\t\tswitch (op) {\n\t\t\tcase SLJIT_MOV_U8:\n\t\t\t\tsrcw = (sljit_u8)srcw;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_MOV_S8:\n\t\t\t\tsrcw = (sljit_s8)srcw;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_MOV_U16:\n\t\t\t\tsrcw = (sljit_u16)srcw;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_MOV_S16:\n\t\t\t\tsrcw = (sljit_s16)srcw;\n\t\t\t\tbreak;\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tcase SLJIT_MOV_U32:\n\t\t\t\tsrcw = (sljit_u32)srcw;\n\t\t\t\tbreak;\n\t\t\tcase SLJIT_MOV_S32:\n\t\t\t\tsrcw = (sljit_s32)srcw;\n\t\t\t\tbreak;\n#endif\n\t\t\t}\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\t\tif (SLJIT_UNLIKELY(dst_is_ereg))\n\t\t\t\treturn emit_mov(compiler, dst, dstw, src, srcw);\n#endif\n\t\t}\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tif (SLJIT_UNLIKELY(dst_is_ereg) && (!(op == SLJIT_MOV || op == SLJIT_MOV_U32 || op == SLJIT_MOV_S32 || op == SLJIT_MOV_P) || (src & SLJIT_MEM))) {\n\t\t\tSLJIT_ASSERT(dst == SLJIT_MEM1(SLJIT_SP));\n\t\t\tdst = TMP_REG1;\n\t\t}\n#endif\n\n\t\tswitch (op) {\n\t\tcase SLJIT_MOV:\n\t\tcase SLJIT_MOV_P:\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tcase SLJIT_MOV_U32:\n\t\tcase SLJIT_MOV_S32:\n#endif\n\t\t\tFAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U8:\n\t\t\tFAIL_IF(emit_mov_byte(compiler, 0, dst, dstw, src, srcw));\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S8:\n\t\t\tFAIL_IF(emit_mov_byte(compiler, 1, dst, dstw, src, srcw));\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_U16:\n\t\t\tFAIL_IF(emit_mov_half(compiler, 0, dst, dstw, src, srcw));\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S16:\n\t\t\tFAIL_IF(emit_mov_half(compiler, 1, dst, dstw, src, srcw));\n\t\t\tbreak;\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tcase SLJIT_MOV_U32:\n\t\t\tFAIL_IF(emit_mov_int(compiler, 0, dst, dstw, src, srcw));\n\t\t\tbreak;\n\t\tcase SLJIT_MOV_S32:\n\t\t\tFAIL_IF(emit_mov_int(compiler, 1, dst, dstw, src, srcw));\n\t\t\tbreak;\n#endif\n\t\t}\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tif (SLJIT_UNLIKELY(dst_is_ereg) && dst == TMP_REG1)\n\t\t\treturn emit_mov(compiler, SLJIT_MEM1(SLJIT_SP), dstw, TMP_REG1, 0);\n#endif\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tswitch (op) {\n\tcase SLJIT_NOT:\n\t\tif (SLJIT_UNLIKELY(op_flags & SLJIT_SET_Z))\n\t\t\treturn emit_not_with_flags(compiler, dst, dstw, src, srcw);\n\t\treturn emit_unary(compiler, NOT_rm, dst, dstw, src, srcw);\n\n\tcase SLJIT_NEG:\n\t\treturn emit_unary(compiler, NEG_rm, dst, dstw, src, srcw);\n\n\tcase SLJIT_CLZ:\n\t\treturn emit_clz(compiler, op_flags, dst, dstw, src, srcw);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\n#define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \\\n\tif (IS_HALFWORD(immw) || compiler->mode32) { \\\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \\\n\t\tFAIL_IF(!inst); \\\n\t\t*(inst + 1) |= (op_imm); \\\n\t} \\\n\telse { \\\n\t\tFAIL_IF(emit_load_imm64(compiler, (arg == TMP_REG1) ? TMP_REG2 : TMP_REG1, immw)); \\\n\t\tinst = emit_x86_instruction(compiler, 1, (arg == TMP_REG1) ? TMP_REG2 : TMP_REG1, 0, arg, argw); \\\n\t\tFAIL_IF(!inst); \\\n\t\t*inst = (op_mr); \\\n\t}\n\n#define BINARY_EAX_IMM(op_eax_imm, immw) \\\n\tFAIL_IF(emit_do_imm32(compiler, (!compiler->mode32) ? REX_W : 0, (op_eax_imm), immw))\n\n#else\n\n#define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \\\n\tinst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \\\n\tFAIL_IF(!inst); \\\n\t*(inst + 1) |= (op_imm);\n\n#define BINARY_EAX_IMM(op_eax_imm, immw) \\\n\tFAIL_IF(emit_do_imm(compiler, (op_eax_imm), immw))\n\n#endif\n\nstatic sljit_s32 emit_cum_binary(struct sljit_compiler *compiler,\n\tsljit_u32 op_types,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\tsljit_u8 op_eax_imm = (op_types >> 24);\n\tsljit_u8 op_rm = (op_types >> 16) & 0xff;\n\tsljit_u8 op_mr = (op_types >> 8) & 0xff;\n\tsljit_u8 op_imm = op_types & 0xff;\n\n\tif (dst == SLJIT_UNUSED) {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (dst == src1 && dstw == src1w) {\n\t\tif (src2 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {\n#else\n\t\t\tif ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128)) {\n#endif\n\t\t\t\tBINARY_EAX_IMM(op_eax_imm, src2w);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tBINARY_IMM(op_imm, op_mr, src2w, dst, dstw);\n\t\t\t}\n\t\t}\n\t\telse if (FAST_IS_REG(dst)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\telse if (FAST_IS_REG(src2)) {\n\t\t\t/* Special exception for sljit_emit_op_flags. */\n\t\t\tinst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\telse {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src2, src2w);\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* Only for cumulative operations. */\n\tif (dst == src2 && dstw == src2w) {\n\t\tif (src1 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {\n#else\n\t\t\tif ((dst == SLJIT_R0) && (src1w > 127 || src1w < -128)) {\n#endif\n\t\t\t\tBINARY_EAX_IMM(op_eax_imm, src1w);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tBINARY_IMM(op_imm, op_mr, src1w, dst, dstw);\n\t\t\t}\n\t\t}\n\t\telse if (FAST_IS_REG(dst)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst, dstw, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\telse if (FAST_IS_REG(src1)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, src1, src1w, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\telse {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* General version. */\n\tif (FAST_IS_REG(dst)) {\n\t\tEMIT_MOV(compiler, dst, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, dst, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t}\n\telse {\n\t\t/* This version requires less memory writing. */\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_non_cum_binary(struct sljit_compiler *compiler,\n\tsljit_u32 op_types,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\tsljit_u8 op_eax_imm = (op_types >> 24);\n\tsljit_u8 op_rm = (op_types >> 16) & 0xff;\n\tsljit_u8 op_mr = (op_types >> 8) & 0xff;\n\tsljit_u8 op_imm = op_types & 0xff;\n\n\tif (dst == SLJIT_UNUSED) {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (dst == src1 && dstw == src1w) {\n\t\tif (src2 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {\n#else\n\t\t\tif ((dst == SLJIT_R0) && (src2w > 127 || src2w < -128)) {\n#endif\n\t\t\t\tBINARY_EAX_IMM(op_eax_imm, src2w);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tBINARY_IMM(op_imm, op_mr, src2w, dst, dstw);\n\t\t\t}\n\t\t}\n\t\telse if (FAST_IS_REG(dst)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\telse if (FAST_IS_REG(src2)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\telse {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src2, src2w);\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_mr;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* General version. */\n\tif (FAST_IS_REG(dst) && dst != src2) {\n\t\tEMIT_MOV(compiler, dst, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, dst, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t}\n\telse {\n\t\t/* This version requires less memory writing. */\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(op_imm, op_mr, src2w, TMP_REG1, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = op_rm;\n\t\t}\n\t\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_mul(struct sljit_compiler *compiler,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r;\n\n\tdst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;\n\n\t/* Register destination. */\n\tif (dst_r == src1 && !(src2 & SLJIT_IMM)) {\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = IMUL_r_rm;\n\t}\n\telse if (dst_r == src2 && !(src1 & SLJIT_IMM)) {\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src1, src1w);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = IMUL_r_rm;\n\t}\n\telse if (src1 & SLJIT_IMM) {\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tEMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, src2w);\n\t\t\tsrc2 = dst_r;\n\t\t\tsrc2w = 0;\n\t\t}\n\n\t\tif (src1w <= 127 && src1w >= -128) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i8;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1);\n\t\t\t*inst = (sljit_s8)src1w;\n\t\t}\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i32;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(4);\n\t\t\tsljit_unaligned_store_sw(inst, src1w);\n\t\t}\n#else\n\t\telse if (IS_HALFWORD(src1w)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i32;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(4);\n\t\t\tsljit_unaligned_store_s32(inst, (sljit_s32)src1w);\n\t\t}\n\t\telse {\n\t\t\tif (dst_r != src2)\n\t\t\t\tEMIT_MOV(compiler, dst_r, 0, src2, src2w);\n\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG2, src1w));\n\t\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst = IMUL_r_rm;\n\t\t}\n#endif\n\t}\n\telse if (src2 & SLJIT_IMM) {\n\t\t/* Note: src1 is NOT immediate. */\n\n\t\tif (src2w <= 127 && src2w >= -128) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i8;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1);\n\t\t\t*inst = (sljit_s8)src2w;\n\t\t}\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i32;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(4);\n\t\t\tsljit_unaligned_store_sw(inst, src2w);\n\t\t}\n#else\n\t\telse if (IS_HALFWORD(src2w)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = IMUL_r_rm_i32;\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(4);\n\t\t\tsljit_unaligned_store_s32(inst, (sljit_s32)src2w);\n\t\t}\n\t\telse {\n\t\t\tif (dst_r != src1)\n\t\t\t\tEMIT_MOV(compiler, dst_r, 0, src1, src1w);\n\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w));\n\t\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst = IMUL_r_rm;\n\t\t}\n#endif\n\t}\n\telse {\n\t\t/* Neither argument is immediate. */\n\t\tif (ADDRESSING_DEPENDS_ON(src2, dst_r))\n\t\t\tdst_r = TMP_REG1;\n\t\tEMIT_MOV(compiler, dst_r, 0, src1, src1w);\n\t\tinst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_0F;\n\t\t*inst = IMUL_r_rm;\n\t}\n\n\tif (dst & SLJIT_MEM)\n\t\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_lea_binary(struct sljit_compiler *compiler,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\tsljit_s32 dst_r, done = 0;\n\n\t/* These cases better be left to handled by normal way. */\n\tif (dst == src1 && dstw == src1w)\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\tif (dst == src2 && dstw == src2w)\n\t\treturn SLJIT_ERR_UNSUPPORTED;\n\n\tdst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (FAST_IS_REG(src1)) {\n\t\tif (FAST_IS_REG(src2)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM2(src1, src2), 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = LEA_r_m;\n\t\t\tdone = 1;\n\t\t}\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif ((src2 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src2w))) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), (sljit_s32)src2w);\n#else\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), src2w);\n#endif\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = LEA_r_m;\n\t\t\tdone = 1;\n\t\t}\n\t}\n\telse if (FAST_IS_REG(src2)) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif ((src1 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src1w))) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), (sljit_s32)src1w);\n#else\n\t\tif (src1 & SLJIT_IMM) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), src1w);\n#endif\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = LEA_r_m;\n\t\t\tdone = 1;\n\t\t}\n\t}\n\n\tif (done) {\n\t\tif (dst_r == TMP_REG1)\n\t\t\treturn emit_mov(compiler, dst, dstw, TMP_REG1, 0);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\treturn SLJIT_ERR_UNSUPPORTED;\n}\n\nstatic sljit_s32 emit_cmp_binary(struct sljit_compiler *compiler,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {\n#else\n\tif (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {\n#endif\n\t\tBINARY_EAX_IMM(CMP_EAX_i32, src2w);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (FAST_IS_REG(src1)) {\n\t\tif (src2 & SLJIT_IMM) {\n\t\t\tBINARY_IMM(CMP, CMP_rm_r, src2w, src1, 0);\n\t\t}\n\t\telse {\n\t\t\tinst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = CMP_r_rm;\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (FAST_IS_REG(src2) && !(src1 & SLJIT_IMM)) {\n\t\tinst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w);\n\t\tFAIL_IF(!inst);\n\t\t*inst = CMP_rm_r;\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (src2 & SLJIT_IMM) {\n\t\tif (src1 & SLJIT_IMM) {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\t\tsrc1 = TMP_REG1;\n\t\t\tsrc1w = 0;\n\t\t}\n\t\tBINARY_IMM(CMP, CMP_rm_r, src2w, src1, src1w);\n\t}\n\telse {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\tFAIL_IF(!inst);\n\t\t*inst = CMP_r_rm;\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_test_binary(struct sljit_compiler *compiler,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {\n#else\n\tif (src1 == SLJIT_R0 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {\n#endif\n\t\tBINARY_EAX_IMM(TEST_EAX_i32, src2w);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {\n#else\n\tif (src2 == SLJIT_R0 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128)) {\n#endif\n\t\tBINARY_EAX_IMM(TEST_EAX_i32, src1w);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (!(src1 & SLJIT_IMM)) {\n\t\tif (src2 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif (IS_HALFWORD(src2w) || compiler->mode32) {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = GROUP_F7;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG1, src2w));\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src1, src1w);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = TEST_rm_r;\n\t\t\t}\n#else\n\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = GROUP_F7;\n#endif\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t\telse if (FAST_IS_REG(src1)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = TEST_rm_r;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t}\n\n\tif (!(src2 & SLJIT_IMM)) {\n\t\tif (src1 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t\tif (IS_HALFWORD(src1w) || compiler->mode32) {\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src1w, src2, src2w);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = GROUP_F7;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG1, src1w));\n\t\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\t\t\tFAIL_IF(!inst);\n\t\t\t\t*inst = TEST_rm_r;\n\t\t\t}\n#else\n\t\t\tinst = emit_x86_instruction(compiler, 1, src1, src1w, src2, src2w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = GROUP_F7;\n#endif\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t\telse if (FAST_IS_REG(src2)) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = TEST_rm_r;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t}\n\n\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\tif (src2 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (IS_HALFWORD(src2w) || compiler->mode32) {\n\t\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = GROUP_F7;\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w));\n\t\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, TMP_REG1, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst = TEST_rm_r;\n\t\t}\n#else\n\t\tinst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REG1, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst = GROUP_F7;\n#endif\n\t}\n\telse {\n\t\tinst = emit_x86_instruction(compiler, 1, TMP_REG1, 0, src2, src2w);\n\t\tFAIL_IF(!inst);\n\t\t*inst = TEST_rm_r;\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_shift(struct sljit_compiler *compiler,\n\tsljit_u8 mode,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_u8* inst;\n\n\tif ((src2 & SLJIT_IMM) || (src2 == SLJIT_PREF_SHIFT_REG)) {\n\t\tif (dst == src1 && dstw == src1w) {\n\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, dstw);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst |= mode;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t\tif (dst == SLJIT_UNUSED) {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst |= mode;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t\tif (dst == SLJIT_PREF_SHIFT_REG && src2 == SLJIT_PREF_SHIFT_REG) {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst |= mode;\n\t\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\t\tif (FAST_IS_REG(dst)) {\n\t\t\tEMIT_MOV(compiler, dst, 0, src1, src1w);\n\t\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, 0);\n\t\t\tFAIL_IF(!inst);\n\t\t\t*inst |= mode;\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REG1, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst |= mode;\n\t\tEMIT_MOV(compiler, dst, dstw, TMP_REG1, 0);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (dst == SLJIT_PREF_SHIFT_REG) {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst |= mode;\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t}\n\telse if (SLOW_IS_REG(dst) && dst != src2 && !ADDRESSING_DEPENDS_ON(src2, dst)) {\n\t\tif (src1 != dst)\n\t\t\tEMIT_MOV(compiler, dst, 0, src1, src1w);\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_PREF_SHIFT_REG, 0);\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, dst, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst |= mode;\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t}\n\telse {\n\t\t/* This case is complex since ecx itself may be used for\n\t\t   addressing, and this case must be supported as well. */\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src1, src1w);\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tEMIT_MOV(compiler, SLJIT_MEM1(SLJIT_SP), 0, SLJIT_PREF_SHIFT_REG, 0);\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst |= mode;\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, SLJIT_MEM1(SLJIT_SP), 0);\n#else\n\t\tEMIT_MOV(compiler, TMP_REG2, 0, SLJIT_PREF_SHIFT_REG, 0);\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);\n\t\tinst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REG1, 0);\n\t\tFAIL_IF(!inst);\n\t\t*inst |= mode;\n\t\tEMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG2, 0);\n#endif\n\t\tif (dst != SLJIT_UNUSED)\n\t\t\treturn emit_mov(compiler, dst, dstw, TMP_REG1, 0);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_shift_with_flags(struct sljit_compiler *compiler,\n\tsljit_u8 mode, sljit_s32 set_flags,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\t/* The CPU does not set flags if the shift count is 0. */\n\tif (src2 & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif ((src2w & 0x3f) != 0 || (compiler->mode32 && (src2w & 0x1f) != 0))\n\t\t\treturn emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);\n#else\n\t\tif ((src2w & 0x1f) != 0)\n\t\t\treturn emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);\n#endif\n\t\tif (!set_flags)\n\t\t\treturn emit_mov(compiler, dst, dstw, src1, src1w);\n\t\t/* OR dst, src, 0 */\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(OR),\n\t\t\tdst, dstw, src1, src1w, SLJIT_IMM, 0);\n\t}\n\n\tif (!set_flags)\n\t\treturn emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);\n\n\tif (!FAST_IS_REG(dst))\n\t\tFAIL_IF(emit_cmp_binary(compiler, src1, src1w, SLJIT_IMM, 0));\n\n\tFAIL_IF(emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w));\n\n\tif (FAST_IS_REG(dst))\n\t\treturn emit_cmp_binary(compiler, (dst == SLJIT_UNUSED) ? TMP_REG1 : dst, dstw, SLJIT_IMM, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n\tCHECK_EXTRA_REGS(dst, dstw, (void)0);\n\tCHECK_EXTRA_REGS(src1, src1w, (void)0);\n\tCHECK_EXTRA_REGS(src2, src2w, (void)0);\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = op & SLJIT_I32_OP;\n#endif\n\n\tif (dst == SLJIT_UNUSED && !HAS_FLAGS(op))\n\t\treturn SLJIT_SUCCESS;\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD:\n\t\tif (!HAS_FLAGS(op)) {\n\t\t\tif (emit_lea_binary(compiler, dst, dstw, src1, src1w, src2, src2w) != SLJIT_ERR_UNSUPPORTED)\n\t\t\t\treturn compiler->error;\n\t\t}\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(ADD),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_ADDC:\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(ADC),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_SUB:\n\t\tif (!HAS_FLAGS(op)) {\n\t\t\tif ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)\n\t\t\t\treturn compiler->error;\n\t\t}\n\n\t\tif (dst == SLJIT_UNUSED)\n\t\t\treturn emit_cmp_binary(compiler, src1, src1w, src2, src2w);\n\t\treturn emit_non_cum_binary(compiler, BINARY_OPCODE(SUB),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_SUBC:\n\t\treturn emit_non_cum_binary(compiler, BINARY_OPCODE(SBB),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_MUL:\n\t\treturn emit_mul(compiler, dst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_AND:\n\t\tif (dst == SLJIT_UNUSED)\n\t\t\treturn emit_test_binary(compiler, src1, src1w, src2, src2w);\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(AND),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_OR:\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(OR),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_XOR:\n\t\treturn emit_cum_binary(compiler, BINARY_OPCODE(XOR),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_SHL:\n\t\treturn emit_shift_with_flags(compiler, SHL, HAS_FLAGS(op),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_LSHR:\n\t\treturn emit_shift_with_flags(compiler, SHR, HAS_FLAGS(op),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\tcase SLJIT_ASHR:\n\t\treturn emit_shift_with_flags(compiler, SAR, HAS_FLAGS(op),\n\t\t\tdst, dstw, src1, src1w, src2, src2w);\n\t}\n\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_register_index(reg));\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tif (reg >= SLJIT_R3 && reg <= SLJIT_R8)\n\t\treturn -1;\n#endif\n\treturn reg_map[reg];\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)\n{\n\tCHECK_REG_INDEX(check_sljit_get_float_register_index(reg));\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\treturn reg;\n#else\n\treturn freg_map[reg];\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,\n\tvoid *instruction, sljit_s32 size)\n{\n\tsljit_u8 *inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_custom(compiler, instruction, size));\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + size);\n\tFAIL_IF(!inst);\n\tINC_SIZE(size);\n\tSLJIT_MEMCPY(inst, instruction, size);\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Floating point operators                                             */\n/* --------------------------------------------------------------------- */\n\n/* Alignment(3) + 4 * 16 bytes. */\nstatic sljit_s32 sse2_data[3 + (4 * 4)];\nstatic sljit_s32 *sse2_buffer;\n\nstatic void init_compiler(void)\n{\n\t/* Align to 16 bytes. */\n\tsse2_buffer = (sljit_s32*)(((sljit_uw)sse2_data + 15) & ~0xf);\n\n\t/* Single precision constants (each constant is 16 byte long). */\n\tsse2_buffer[0] = 0x80000000;\n\tsse2_buffer[4] = 0x7fffffff;\n\t/* Double precision constants (each constant is 16 byte long). */\n\tsse2_buffer[8] = 0;\n\tsse2_buffer[9] = 0x80000000;\n\tsse2_buffer[12] = 0xffffffff;\n\tsse2_buffer[13] = 0x7fffffff;\n}\n\nstatic sljit_s32 emit_sse2(struct sljit_compiler *compiler, sljit_u8 opcode,\n\tsljit_s32 single, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w)\n{\n\tsljit_u8 *inst;\n\n\tinst = emit_x86_instruction(compiler, 2 | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = opcode;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic sljit_s32 emit_sse2_logic(struct sljit_compiler *compiler, sljit_u8 opcode,\n\tsljit_s32 pref66, sljit_s32 xmm1, sljit_s32 xmm2, sljit_sw xmm2w)\n{\n\tsljit_u8 *inst;\n\n\tinst = emit_x86_instruction(compiler, 2 | (pref66 ? EX86_PREF_66 : 0) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = opcode;\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_sse2_load(struct sljit_compiler *compiler,\n\tsljit_s32 single, sljit_s32 dst, sljit_s32 src, sljit_sw srcw)\n{\n\treturn emit_sse2(compiler, MOVSD_x_xm, single, dst, src, srcw);\n}\n\nstatic SLJIT_INLINE sljit_s32 emit_sse2_store(struct sljit_compiler *compiler,\n\tsljit_s32 single, sljit_s32 dst, sljit_sw dstw, sljit_s32 src)\n{\n\treturn emit_sse2(compiler, MOVSD_xm_x, single, src, dst, dstw);\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\tsljit_u8 *inst;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64)\n\t\tcompiler->mode32 = 0;\n#endif\n\n\tinst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_F32_OP) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP2, dst_r, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = CVTTSD2SI_r_xm;\n\n\tif (dst & SLJIT_MEM)\n\t\treturn emit_mov(compiler, dst, dstw, TMP_REG1, 0);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG;\n\tsljit_u8 *inst;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW)\n\t\tcompiler->mode32 = 0;\n#endif\n\n\tif (src & SLJIT_IMM) {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)\n\t\t\tsrcw = (sljit_s32)srcw;\n#endif\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, src, srcw);\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tinst = emit_x86_instruction(compiler, 2 | ((op & SLJIT_F32_OP) ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2_OP1, dst_r, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = CVTSI2SD_x_rm;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 1;\n#endif\n\tif (dst_r == TMP_FREG)\n\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG);\n\treturn SLJIT_SUCCESS;\n}\n\nstatic SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tif (!FAST_IS_REG(src1)) {\n\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w));\n\t\tsrc1 = TMP_FREG;\n\t}\n\n\treturn emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_F32_OP), src1, src2, src2w);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_s32 dst_r;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 1;\n#endif\n\n\tCHECK_ERROR();\n\tSELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);\n\n\tif (GET_OPCODE(op) == SLJIT_MOV_F64) {\n\t\tif (FAST_IS_REG(dst))\n\t\t\treturn emit_sse2_load(compiler, op & SLJIT_F32_OP, dst, src, srcw);\n\t\tif (FAST_IS_REG(src))\n\t\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, src);\n\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src, srcw));\n\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG);\n\t}\n\n\tif (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) {\n\t\tdst_r = FAST_IS_REG(dst) ? dst : TMP_FREG;\n\t\tif (FAST_IS_REG(src)) {\n\t\t\t/* We overwrite the high bits of source. From SLJIT point of view,\n\t\t\t   this is not an issue.\n\t\t\t   Note: In SSE3, we could also use MOVDDUP and MOVSLDUP. */\n\t\t\tFAIL_IF(emit_sse2_logic(compiler, UNPCKLPD_x_xm, op & SLJIT_F32_OP, src, src, 0));\n\t\t}\n\t\telse {\n\t\t\tFAIL_IF(emit_sse2_load(compiler, !(op & SLJIT_F32_OP), TMP_FREG, src, srcw));\n\t\t\tsrc = TMP_FREG;\n\t\t}\n\n\t\tFAIL_IF(emit_sse2_logic(compiler, CVTPD2PS_x_xm, op & SLJIT_F32_OP, dst_r, src, 0));\n\t\tif (dst_r == TMP_FREG)\n\t\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG);\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (FAST_IS_REG(dst)) {\n\t\tdst_r = dst;\n\t\tif (dst != src)\n\t\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src, srcw));\n\t}\n\telse {\n\t\tdst_r = TMP_FREG;\n\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src, srcw));\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_NEG_F64:\n\t\tFAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_F32_OP ? sse2_buffer : sse2_buffer + 8)));\n\t\tbreak;\n\n\tcase SLJIT_ABS_F64:\n\t\tFAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_F32_OP ? sse2_buffer + 4 : sse2_buffer + 12)));\n\t\tbreak;\n\t}\n\n\tif (dst_r == TMP_FREG)\n\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG);\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 src1, sljit_sw src1w,\n\tsljit_s32 src2, sljit_sw src2w)\n{\n\tsljit_s32 dst_r;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tADJUST_LOCAL_OFFSET(src1, src1w);\n\tADJUST_LOCAL_OFFSET(src2, src2w);\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 1;\n#endif\n\n\tif (FAST_IS_REG(dst)) {\n\t\tdst_r = dst;\n\t\tif (dst == src1)\n\t\t\t; /* Do nothing here. */\n\t\telse if (dst == src2 && (op == SLJIT_ADD_F64 || op == SLJIT_MUL_F64)) {\n\t\t\t/* Swap arguments. */\n\t\t\tsrc2 = src1;\n\t\t\tsrc2w = src1w;\n\t\t}\n\t\telse if (dst != src2)\n\t\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, dst_r, src1, src1w));\n\t\telse {\n\t\t\tdst_r = TMP_FREG;\n\t\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w));\n\t\t}\n\t}\n\telse {\n\t\tdst_r = TMP_FREG;\n\t\tFAIL_IF(emit_sse2_load(compiler, op & SLJIT_F32_OP, TMP_FREG, src1, src1w));\n\t}\n\n\tswitch (GET_OPCODE(op)) {\n\tcase SLJIT_ADD_F64:\n\t\tFAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w));\n\t\tbreak;\n\n\tcase SLJIT_SUB_F64:\n\t\tFAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w));\n\t\tbreak;\n\n\tcase SLJIT_MUL_F64:\n\t\tFAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w));\n\t\tbreak;\n\n\tcase SLJIT_DIV_F64:\n\t\tFAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_F32_OP, dst_r, src2, src2w));\n\t\tbreak;\n\t}\n\n\tif (dst_r == TMP_FREG)\n\t\treturn emit_sse2_store(compiler, op & SLJIT_F32_OP, dst, dstw, TMP_FREG);\n\treturn SLJIT_SUCCESS;\n}\n\n/* --------------------------------------------------------------------- */\n/*  Conditional instructions                                             */\n/* --------------------------------------------------------------------- */\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)\n{\n\tsljit_u8 *inst;\n\tstruct sljit_label *label;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_label(compiler));\n\n\tif (compiler->last_label && compiler->last_label->size == compiler->size)\n\t\treturn compiler->last_label;\n\n\tlabel = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));\n\tPTR_FAIL_IF(!label);\n\tset_label(label, compiler);\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 2);\n\tPTR_FAIL_IF(!inst);\n\n\t*inst++ = 0;\n\t*inst++ = 0;\n\n\treturn label;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)\n{\n\tsljit_u8 *inst;\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_jump(compiler, type));\n\n\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\tPTR_FAIL_IF_NULL(jump);\n\tset_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);\n\ttype &= 0xff;\n\n\t/* Worst case size. */\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tcompiler->size += (type >= SLJIT_JUMP) ? 5 : 6;\n#else\n\tcompiler->size += (type >= SLJIT_JUMP) ? (10 + 3) : (2 + 10 + 3);\n#endif\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 2);\n\tPTR_FAIL_IF_NULL(inst);\n\n\t*inst++ = 0;\n\t*inst++ = type + 2;\n\treturn jump;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8 *inst;\n\tstruct sljit_jump *jump;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_ijump(compiler, type, src, srcw));\n\tADJUST_LOCAL_OFFSET(src, srcw);\n\n\tCHECK_EXTRA_REGS(src, srcw, (void)0);\n\n\tif (src == SLJIT_IMM) {\n\t\tjump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));\n\t\tFAIL_IF_NULL(jump);\n\t\tset_jump(jump, compiler, JUMP_ADDR);\n\t\tjump->u.target = srcw;\n\n\t\t/* Worst case size. */\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\t\tcompiler->size += 5;\n#else\n\t\tcompiler->size += 10 + 3;\n#endif\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 2);\n\t\tFAIL_IF_NULL(inst);\n\n\t\t*inst++ = 0;\n\t\t*inst++ = type + 2;\n\t}\n\telse {\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\t\t/* REX_W is not necessary (src is not immediate). */\n\t\tcompiler->mode32 = 1;\n#endif\n\t\tinst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);\n\t\tFAIL_IF(!inst);\n\t\t*inst++ = GROUP_FF;\n\t\t*inst |= (type >= SLJIT_FAST_CALL) ? CALL_rm : JMP_rm;\n\t}\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,\n\tsljit_s32 dst, sljit_sw dstw,\n\tsljit_s32 type)\n{\n\tsljit_u8 *inst;\n\tsljit_u8 cond_set = 0;\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tsljit_s32 reg;\n#endif\n\t/* ADJUST_LOCAL_OFFSET and CHECK_EXTRA_REGS might overwrite these values. */\n\tsljit_s32 dst_save = dst;\n\tsljit_sw dstw_save = dstw;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));\n\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\tCHECK_EXTRA_REGS(dst, dstw, (void)0);\n\n\ttype &= 0xff;\n\t/* setcc = jcc + 0x10. */\n\tcond_set = get_jump_code(type) + 0x10;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst)) {\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4 + 3);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(4 + 3);\n\t\t/* Set low register to conditional flag. */\n\t\t*inst++ = (reg_map[TMP_REG1] <= 7) ? REX : REX_B;\n\t\t*inst++ = GROUP_0F;\n\t\t*inst++ = cond_set;\n\t\t*inst++ = MOD_REG | reg_lmap[TMP_REG1];\n\t\t*inst++ = REX | (reg_map[TMP_REG1] <= 7 ? 0 : REX_R) | (reg_map[dst] <= 7 ? 0 : REX_B);\n\t\t*inst++ = OR_rm8_r8;\n\t\t*inst++ = MOD_REG | (reg_lmap[TMP_REG1] << 3) | reg_lmap[dst];\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\treg = (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG1;\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 4 + 4);\n\tFAIL_IF(!inst);\n\tINC_SIZE(4 + 4);\n\t/* Set low register to conditional flag. */\n\t*inst++ = (reg_map[reg] <= 7) ? REX : REX_B;\n\t*inst++ = GROUP_0F;\n\t*inst++ = cond_set;\n\t*inst++ = MOD_REG | reg_lmap[reg];\n\t*inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : (REX_B | REX_R));\n\t/* The movzx instruction does not affect flags. */\n\t*inst++ = GROUP_0F;\n\t*inst++ = MOVZX_r_rm8;\n\t*inst = MOD_REG | (reg_lmap[reg] << 3) | reg_lmap[reg];\n\n\tif (reg != TMP_REG1)\n\t\treturn SLJIT_SUCCESS;\n\n\tif (GET_OPCODE(op) < SLJIT_ADD) {\n\t\tcompiler->mode32 = GET_OPCODE(op) != SLJIT_MOV;\n\t\treturn emit_mov(compiler, dst, dstw, TMP_REG1, 0);\n\t}\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\treturn sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);\n\n#else\n\t/* The SLJIT_CONFIG_X86_32 code path starts here. */\n\tif (GET_OPCODE(op) < SLJIT_ADD && FAST_IS_REG(dst)) {\n\t\tif (reg_map[dst] <= 4) {\n\t\t\t/* Low byte is accessible. */\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 3 + 3);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(3 + 3);\n\t\t\t/* Set low byte to conditional flag. */\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst++ = cond_set;\n\t\t\t*inst++ = MOD_REG | reg_map[dst];\n\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst++ = MOVZX_r_rm8;\n\t\t\t*inst = MOD_REG | (reg_map[dst] << 3) | reg_map[dst];\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\t/* Low byte is not accessible. */\n\t\tif (cpu_has_cmov == -1)\n\t\t\tget_cpu_features();\n\n\t\tif (cpu_has_cmov) {\n\t\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, 1);\n\t\t\t/* a xor reg, reg operation would overwrite the flags. */\n\t\t\tEMIT_MOV(compiler, dst, 0, SLJIT_IMM, 0);\n\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 3);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(3);\n\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t/* cmovcc = setcc - 0x50. */\n\t\t\t*inst++ = cond_set - 0x50;\n\t\t\t*inst++ = MOD_REG | (reg_map[dst] << 3) | reg_map[TMP_REG1];\n\t\t\treturn SLJIT_SUCCESS;\n\t\t}\n\n\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);\n\t\tFAIL_IF(!inst);\n\t\tINC_SIZE(1 + 3 + 3 + 1);\n\t\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\t\t/* Set al to conditional flag. */\n\t\t*inst++ = GROUP_0F;\n\t\t*inst++ = cond_set;\n\t\t*inst++ = MOD_REG | 0 /* eax */;\n\n\t\t*inst++ = GROUP_0F;\n\t\t*inst++ = MOVZX_r_rm8;\n\t\t*inst++ = MOD_REG | (reg_map[dst] << 3) | 0 /* eax */;\n\t\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\tif (GET_OPCODE(op) == SLJIT_OR && !GET_ALL_FLAGS(op) && FAST_IS_REG(dst) && reg_map[dst] <= 4) {\n\t\tSLJIT_ASSERT(reg_map[SLJIT_R0] == 0);\n\n\t\tif (dst != SLJIT_R0) {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 2 + 1);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(1 + 3 + 2 + 1);\n\t\t\t/* Set low register to conditional flag. */\n\t\t\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst++ = cond_set;\n\t\t\t*inst++ = MOD_REG | 0 /* eax */;\n\t\t\t*inst++ = OR_rm8_r8;\n\t\t\t*inst++ = MOD_REG | (0 /* eax */ << 3) | reg_map[dst];\n\t\t\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\t\t}\n\t\telse {\n\t\t\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 3 + 2 + 2);\n\t\t\tFAIL_IF(!inst);\n\t\t\tINC_SIZE(2 + 3 + 2 + 2);\n\t\t\t/* Set low register to conditional flag. */\n\t\t\t*inst++ = XCHG_r_rm;\n\t\t\t*inst++ = MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1];\n\t\t\t*inst++ = GROUP_0F;\n\t\t\t*inst++ = cond_set;\n\t\t\t*inst++ = MOD_REG | 1 /* ecx */;\n\t\t\t*inst++ = OR_rm8_r8;\n\t\t\t*inst++ = MOD_REG | (1 /* ecx */ << 3) | 0 /* eax */;\n\t\t\t*inst++ = XCHG_r_rm;\n\t\t\t*inst++ = MOD_REG | (1 /* ecx */ << 3) | reg_map[TMP_REG1];\n\t\t}\n\t\treturn SLJIT_SUCCESS;\n\t}\n\n\t/* Set TMP_REG1 to the bit. */\n\tinst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);\n\tFAIL_IF(!inst);\n\tINC_SIZE(1 + 3 + 3 + 1);\n\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\t/* Set al to conditional flag. */\n\t*inst++ = GROUP_0F;\n\t*inst++ = cond_set;\n\t*inst++ = MOD_REG | 0 /* eax */;\n\n\t*inst++ = GROUP_0F;\n\t*inst++ = MOVZX_r_rm8;\n\t*inst++ = MOD_REG | (0 << 3) /* eax */ | 0 /* eax */;\n\n\t*inst++ = XCHG_EAX_r + reg_map[TMP_REG1];\n\n\tif (GET_OPCODE(op) < SLJIT_ADD)\n\t\treturn emit_mov(compiler, dst, dstw, TMP_REG1, 0);\n\n#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \\\n\t\t|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)\n\tcompiler->skip_checks = 1;\n#endif\n\treturn sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);\n#endif /* SLJIT_CONFIG_X86_64 */\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,\n\tsljit_s32 dst_reg,\n\tsljit_s32 src, sljit_sw srcw)\n{\n\tsljit_u8* inst;\n\n\tCHECK_ERROR();\n\tCHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));\n\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tdst_reg &= ~SLJIT_I32_OP;\n\n\tif (!sljit_has_cpu_feature(SLJIT_HAS_CMOV) || (dst_reg >= SLJIT_R3 && dst_reg <= SLJIT_S3))\n\t\treturn sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);\n#else\n\tif (!sljit_has_cpu_feature(SLJIT_HAS_CMOV))\n\t\treturn sljit_emit_cmov_generic(compiler, type, dst_reg, src, srcw);\n#endif\n\n\t/* ADJUST_LOCAL_OFFSET is not needed. */\n\tCHECK_EXTRA_REGS(src, srcw, (void)0);\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = dst_reg & SLJIT_I32_OP;\n\tdst_reg &= ~SLJIT_I32_OP;\n#endif\n\n\tif (SLJIT_UNLIKELY(src & SLJIT_IMM)) {\n\t\tEMIT_MOV(compiler, TMP_REG1, 0, SLJIT_IMM, srcw);\n\t\tsrc = TMP_REG1;\n\t\tsrcw = 0;\n\t}\n\n\tinst = emit_x86_instruction(compiler, 2, dst_reg, 0, src, srcw);\n\tFAIL_IF(!inst);\n\t*inst++ = GROUP_0F;\n\t*inst = get_jump_code(type & 0xff) - 0x40;\n\treturn SLJIT_SUCCESS;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset)\n{\n\tCHECK_ERROR();\n\tCHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tCHECK_EXTRA_REGS(dst, dstw, (void)0);\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 0;\n#endif\n\n\tADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_SP), offset);\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (NOT_HALFWORD(offset)) {\n\t\tFAIL_IF(emit_load_imm64(compiler, TMP_REG1, offset));\n#if (defined SLJIT_DEBUG && SLJIT_DEBUG)\n\t\tSLJIT_ASSERT(emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, TMP_REG1, 0) != SLJIT_ERR_UNSUPPORTED);\n\t\treturn compiler->error;\n#else\n\t\treturn emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, TMP_REG1, 0);\n#endif\n\t}\n#endif\n\n\tif (offset != 0)\n\t\treturn emit_lea_binary(compiler, dst, dstw, SLJIT_SP, 0, SLJIT_IMM, offset);\n\treturn emit_mov(compiler, dst, dstw, SLJIT_SP, 0);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)\n{\n\tsljit_u8 *inst;\n\tstruct sljit_const *const_;\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tsljit_s32 reg;\n#endif\n\n\tCHECK_ERROR_PTR();\n\tCHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));\n\tADJUST_LOCAL_OFFSET(dst, dstw);\n\n\tCHECK_EXTRA_REGS(dst, dstw, (void)0);\n\n\tconst_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));\n\tPTR_FAIL_IF(!const_);\n\tset_const(const_, compiler);\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tcompiler->mode32 = 0;\n\treg = FAST_IS_REG(dst) ? dst : TMP_REG1;\n\n\tif (emit_load_imm64(compiler, reg, init_value))\n\t\treturn NULL;\n#else\n\tif (emit_mov(compiler, dst, dstw, SLJIT_IMM, init_value))\n\t\treturn NULL;\n#endif\n\n\tinst = (sljit_u8*)ensure_buf(compiler, 2);\n\tPTR_FAIL_IF(!inst);\n\n\t*inst++ = 0;\n\t*inst++ = 1;\n\n#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)\n\tif (dst & SLJIT_MEM)\n\t\tif (emit_mov(compiler, dst, dstw, TMP_REG1, 0))\n\t\t\treturn NULL;\n#endif\n\n\treturn const_;\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)\n{\n\tSLJIT_UNUSED_ARG(executable_offset);\n#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)\n\tsljit_unaligned_store_sw((void*)addr, new_target - (addr + 4) - (sljit_uw)executable_offset);\n#else\n\tsljit_unaligned_store_sw((void*)addr, (sljit_sw) new_target);\n#endif\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)\n{\n\tSLJIT_UNUSED_ARG(executable_offset);\n\tsljit_unaligned_store_sw((void*)addr, new_constant);\n}\n"
  },
  {
    "path": "src/pcre/sljit/sljitUtils.c",
    "content": "/*\n *    Stack-less Just-In-Time compiler\n *\n *    Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n *   1. Redistributions of source code must retain the above copyright notice, this list of\n *      conditions and the following disclaimer.\n *\n *   2. Redistributions in binary form must reproduce the above copyright notice, this list\n *      of conditions and the following disclaimer in the documentation and/or other materials\n *      provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* ------------------------------------------------------------------------ */\n/*  Locks                                                                   */\n/* ------------------------------------------------------------------------ */\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) || (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)\n\n#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n\nstatic SLJIT_INLINE void allocator_grab_lock(void)\n{\n\t/* Always successful. */\n}\n\nstatic SLJIT_INLINE void allocator_release_lock(void)\n{\n\t/* Always successful. */\n}\n\n#endif /* SLJIT_EXECUTABLE_ALLOCATOR */\n\n#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void)\n{\n\t/* Always successful. */\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void)\n{\n\t/* Always successful. */\n}\n\n#endif /* SLJIT_UTIL_GLOBAL_LOCK */\n\n#elif defined(_WIN32) /* SLJIT_SINGLE_THREADED */\n\n#include \"windows.h\"\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n\nstatic HANDLE allocator_mutex = 0;\n\nstatic SLJIT_INLINE void allocator_grab_lock(void)\n{\n\t/* No idea what to do if an error occures. Static mutexes should never fail... */\n\tif (!allocator_mutex)\n\t\tallocator_mutex = CreateMutex(NULL, TRUE, NULL);\n\telse\n\t\tWaitForSingleObject(allocator_mutex, INFINITE);\n}\n\nstatic SLJIT_INLINE void allocator_release_lock(void)\n{\n\tReleaseMutex(allocator_mutex);\n}\n\n#endif /* SLJIT_EXECUTABLE_ALLOCATOR */\n\n#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)\n\nstatic HANDLE global_mutex = 0;\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void)\n{\n\t/* No idea what to do if an error occures. Static mutexes should never fail... */\n\tif (!global_mutex)\n\t\tglobal_mutex = CreateMutex(NULL, TRUE, NULL);\n\telse\n\t\tWaitForSingleObject(global_mutex, INFINITE);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void)\n{\n\tReleaseMutex(global_mutex);\n}\n\n#endif /* SLJIT_UTIL_GLOBAL_LOCK */\n\n#else /* _WIN32 */\n\n#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n\n#include <pthread.h>\n\nstatic pthread_mutex_t allocator_mutex = PTHREAD_MUTEX_INITIALIZER;\n\nstatic SLJIT_INLINE void allocator_grab_lock(void)\n{\n\tpthread_mutex_lock(&allocator_mutex);\n}\n\nstatic SLJIT_INLINE void allocator_release_lock(void)\n{\n\tpthread_mutex_unlock(&allocator_mutex);\n}\n\n#endif /* SLJIT_EXECUTABLE_ALLOCATOR */\n\n#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK)\n\n#include <pthread.h>\n\nstatic pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void)\n{\n\tpthread_mutex_lock(&global_mutex);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_release_lock(void)\n{\n\tpthread_mutex_unlock(&global_mutex);\n}\n\n#endif /* SLJIT_UTIL_GLOBAL_LOCK */\n\n#endif /* _WIN32 */\n\n/* ------------------------------------------------------------------------ */\n/*  Stack                                                                   */\n/* ------------------------------------------------------------------------ */\n\n#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) || (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)\n\n#ifdef _WIN32\n#include \"windows.h\"\n#else\n/* Provides mmap function. */\n#include <sys/mman.h>\n/* For detecting the page size. */\n#include <unistd.h>\n\n#ifndef MAP_ANON\n\n#include <fcntl.h>\n\n/* Some old systems does not have MAP_ANON. */\nstatic sljit_s32 dev_zero = -1;\n\n#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)\n\nstatic SLJIT_INLINE sljit_s32 open_dev_zero(void)\n{\n\tdev_zero = open(\"/dev/zero\", O_RDWR);\n\treturn dev_zero < 0;\n}\n\n#else /* SLJIT_SINGLE_THREADED */\n\n#include <pthread.h>\n\nstatic pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER;\n\nstatic SLJIT_INLINE sljit_s32 open_dev_zero(void)\n{\n\tpthread_mutex_lock(&dev_zero_mutex);\n\t/* The dev_zero might be initialized by another thread during the waiting. */\n\tif (dev_zero < 0) {\n\t\tdev_zero = open(\"/dev/zero\", O_RDWR);\n\t}\n\tpthread_mutex_unlock(&dev_zero_mutex);\n\treturn dev_zero < 0;\n}\n\n#endif /* SLJIT_SINGLE_THREADED */\n\n#endif\n\n#endif\n\n#endif /* SLJIT_UTIL_STACK || SLJIT_EXECUTABLE_ALLOCATOR */\n\n#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)\n\n/* Planning to make it even more clever in the future. */\nstatic sljit_sw sljit_page_align = 0;\n\nSLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)\n{\n\tstruct sljit_stack *stack;\n\tvoid *ptr;\n#ifdef _WIN32\n\tSYSTEM_INFO si;\n#endif\n\n\tSLJIT_UNUSED_ARG(allocator_data);\n\tif (start_size > max_size || start_size < 1)\n\t\treturn NULL;\n\n#ifdef _WIN32\n\tif (!sljit_page_align) {\n\t\tGetSystemInfo(&si);\n\t\tsljit_page_align = si.dwPageSize - 1;\n\t}\n#else\n\tif (!sljit_page_align) {\n\t\tsljit_page_align = sysconf(_SC_PAGESIZE);\n\t\t/* Should never happen. */\n\t\tif (sljit_page_align < 0)\n\t\t\tsljit_page_align = 4096;\n\t\tsljit_page_align--;\n\t}\n#endif\n\n\tstack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);\n\tif (!stack)\n\t\treturn NULL;\n\n\t/* Align max_size. */\n\tmax_size = (max_size + sljit_page_align) & ~sljit_page_align;\n\n#ifdef _WIN32\n\tptr = VirtualAlloc(NULL, max_size, MEM_RESERVE, PAGE_READWRITE);\n\tif (!ptr) {\n\t\tSLJIT_FREE(stack, allocator_data);\n\t\treturn NULL;\n\t}\n\n\tstack->min_start = (sljit_u8 *)ptr;\n\tstack->end = stack->min_start + max_size;\n\tstack->start = stack->end;\n\n\tif (sljit_stack_resize(stack, stack->end - start_size) == NULL) {\n\t\tsljit_free_stack(stack, allocator_data);\n\t\treturn NULL;\n\t}\n#else\n#ifdef MAP_ANON\n\tptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);\n#else\n\tif (dev_zero < 0) {\n\t\tif (open_dev_zero()) {\n\t\t\tSLJIT_FREE(stack, allocator_data);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\tptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);\n#endif\n\tif (ptr == MAP_FAILED) {\n\t\tSLJIT_FREE(stack, allocator_data);\n\t\treturn NULL;\n\t}\n\tstack->min_start = (sljit_u8 *)ptr;\n\tstack->end = stack->min_start + max_size;\n\tstack->start = stack->end - start_size;\n#endif\n\tstack->top = stack->end;\n\treturn stack;\n}\n\n#undef PAGE_ALIGN\n\nSLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)\n{\n\tSLJIT_UNUSED_ARG(allocator_data);\n#ifdef _WIN32\n\tVirtualFree((void*)stack->min_start, 0, MEM_RELEASE);\n#else\n\tmunmap((void*)stack->min_start, stack->end - stack->min_start);\n#endif\n\tSLJIT_FREE(stack, allocator_data);\n}\n\nSLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)\n{\n\tsljit_uw aligned_old_start;\n\tsljit_uw aligned_new_start;\n\n\tif ((new_start < stack->min_start) || (new_start >= stack->end))\n\t\treturn NULL;\n\n#ifdef _WIN32\n\taligned_new_start = (sljit_uw)new_start & ~sljit_page_align;\n\taligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align;\n\tif (aligned_new_start != aligned_old_start) {\n\t\tif (aligned_new_start < aligned_old_start) {\n\t\t\tif (!VirtualAlloc((void*)aligned_new_start, aligned_old_start - aligned_new_start, MEM_COMMIT, PAGE_READWRITE))\n\t\t\t\treturn NULL;\n\t\t}\n\t\telse {\n\t\t\tif (!VirtualFree((void*)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT))\n\t\t\t\treturn NULL;\n\t\t}\n\t}\n#else\n\tif (stack->start < new_start) {\n\t\taligned_new_start = (sljit_uw)new_start & ~sljit_page_align;\n\t\taligned_old_start = ((sljit_uw)stack->start) & ~sljit_page_align;\n\t\t/* If madvise is available, we release the unnecessary space. */\n#if defined(MADV_DONTNEED)\n\t\tif (aligned_new_start > aligned_old_start)\n\t\t\tmadvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_DONTNEED);\n#elif defined(POSIX_MADV_DONTNEED)\n\t\tif (aligned_new_start > aligned_old_start)\n\t\t\tposix_madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED);\n#endif\n\t}\n#endif\n\tstack->start = new_start;\n\treturn new_start;\n}\n\n#endif /* SLJIT_UTIL_STACK */\n\n#endif\n"
  },
  {
    "path": "src/pcre/test-driver",
    "content": "#! /bin/sh\n# test-driver - basic testsuite driver script.\n\nscriptversion=2018-03-07.03; # UTC\n\n# Copyright (C) 2011-2018 Free Software Foundation, Inc.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\n# Make unconditional expansion of undefined variables an error.  This\n# helps a lot in preventing typo-related bugs.\nset -u\n\nusage_error ()\n{\n  echo \"$0: $*\" >&2\n  print_usage >&2\n  exit 2\n}\n\nprint_usage ()\n{\n  cat <<END\nUsage:\n  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH\n              [--expect-failure={yes|no}] [--color-tests={yes|no}]\n              [--enable-hard-errors={yes|no}] [--]\n              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]\nThe '--test-name', '--log-file' and '--trs-file' options are mandatory.\nEND\n}\n\ntest_name= # Used for reporting.\nlog_file=  # Where to save the output of the test script.\ntrs_file=  # Where to save the metadata of the test run.\nexpect_failure=no\ncolor_tests=no\nenable_hard_errors=yes\nwhile test $# -gt 0; do\n  case $1 in\n  --help) print_usage; exit $?;;\n  --version) echo \"test-driver $scriptversion\"; exit $?;;\n  --test-name) test_name=$2; shift;;\n  --log-file) log_file=$2; shift;;\n  --trs-file) trs_file=$2; shift;;\n  --color-tests) color_tests=$2; shift;;\n  --expect-failure) expect_failure=$2; shift;;\n  --enable-hard-errors) enable_hard_errors=$2; shift;;\n  --) shift; break;;\n  -*) usage_error \"invalid option: '$1'\";;\n   *) break;;\n  esac\n  shift\ndone\n\nmissing_opts=\ntest x\"$test_name\" = x && missing_opts=\"$missing_opts --test-name\"\ntest x\"$log_file\"  = x && missing_opts=\"$missing_opts --log-file\"\ntest x\"$trs_file\"  = x && missing_opts=\"$missing_opts --trs-file\"\nif test x\"$missing_opts\" != x; then\n  usage_error \"the following mandatory options are missing:$missing_opts\"\nfi\n\nif test $# -eq 0; then\n  usage_error \"missing argument\"\nfi\n\nif test $color_tests = yes; then\n  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.\n  red='\u001b[0;31m' # Red.\n  grn='\u001b[0;32m' # Green.\n  lgn='\u001b[1;32m' # Light green.\n  blu='\u001b[1;34m' # Blue.\n  mgn='\u001b[0;35m' # Magenta.\n  std='\u001b[m'     # No color.\nelse\n  red= grn= lgn= blu= mgn= std=\nfi\n\ndo_exit='rm -f $log_file $trs_file; (exit $st); exit $st'\ntrap \"st=129; $do_exit\" 1\ntrap \"st=130; $do_exit\" 2\ntrap \"st=141; $do_exit\" 13\ntrap \"st=143; $do_exit\" 15\n\n# Test script is run here.\n\"$@\" >$log_file 2>&1\nestatus=$?\n\nif test $enable_hard_errors = no && test $estatus -eq 99; then\n  tweaked_estatus=1\nelse\n  tweaked_estatus=$estatus\nfi\n\ncase $tweaked_estatus:$expect_failure in\n  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;\n  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;\n  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;\n  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;\n  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;\n  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;\nesac\n\n# Report the test outcome and exit status in the logs, so that one can\n# know whether the test passed or failed simply by looking at the '.log'\n# file, without the need of also peaking into the corresponding '.trs'\n# file (automake bug#11814).\necho \"$res $test_name (exit status: $estatus)\" >>$log_file\n\n# Report outcome to console.\necho \"${col}${res}${std}: $test_name\"\n\n# Register the test result, and other relevant metadata.\necho \":test-result: $res\" > $trs_file\necho \":global-test-result: $res\" >> $trs_file\necho \":recheck: $recheck\" >> $trs_file\necho \":copy-in-global-log: $gcopy\" >> $trs_file\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'before-save-hook 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC0\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/pcre/testdata/grepfilelist",
    "content": "testdata/grepinputv\n\ntestdata/grepinputx\n"
  },
  {
    "path": "src/pcre/testdata/grepinput",
    "content": "This is a file of miscellaneous text that is used as test data for checking\nthat the pcregrep command is working correctly. The file must be more than 24K\nlong so that it needs more than a single read() call to process it. New\nfeatures should be added at the end, because some of the tests involve the\noutput of line numbers, and we don't want these to change.\n\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\n\nThis pattern is in lower case.\n\nHere follows a whole lot of stuff that makes the file over 24K long.\n\n-------------------------------------------------------------------------------\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the\nlazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox\njumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick\nbrown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n-------------------------------------------------------------------------------\n\naaaaa0\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nbbbbbb\ncccccccccccccccccccccccccccccccccccccccccc\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\neeeee\naaaaa2\nffffffffff\n\nThis is a line before the binary zero.\nThis line contains a binary zero here >\u0000< for testing.\nThis is a line after the binary zero.\n\nABOVE the elephant \nABOVE\nABOVE theatre\nAB.VE\nAB.VE the turtle\n\n010203040506\n\nPUT NEW DATA ABOVE THIS LINE.\n=============================\n\nCheck up on PATTERN near the end.\nThis is the last line of this file.\n"
  },
  {
    "path": "src/pcre/testdata/grepinput3",
    "content": "triple:\tt1_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\ntriple:\tt2_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\t\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\ntriple:\tt3_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\ntriple:\tt4_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\ntriple:\tt5_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\t\no_txt\n\ntriple:\tt6_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\ntriple:\tt7_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n"
  },
  {
    "path": "src/pcre/testdata/grepinput8",
    "content": "X one\nX two\u000bX three\fX four\rX five\r\nX six\nX sevenX eight X nine X ten\n\nBefore 111\nBefore 222 Before 333Match\r\nAfter 111\nAfter 222 After 333\nAnd so on and so on\nAnd so on and so on\n"
  },
  {
    "path": "src/pcre/testdata/grepinputv",
    "content": "The quick brown\nfox jumps\nover the lazy dog.\nThis time it jumps and jumps and jumps.\n"
  },
  {
    "path": "src/pcre/testdata/grepinputx",
    "content": "This is a second file of input for the pcregrep tests.\n\nHere is the pattern again.\n\nPattern\nThat time it was on a line by itself.\n\nTo pat or not to pat, that is the question.\n\ncomplete pair\nof lines\n\nThat was a complete pair\nof lines all by themselves.\n\ncomplete pair\nof lines\n\nAnd there they were again, to check line numbers.\n\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty\n\nThis line contains pattern not on a line by itself.\nThis is the last line of this file.\n"
  },
  {
    "path": "src/pcre/testdata/greplist",
    "content": "This is a file of patterns for testing the -f option. Don't include any blank\nlines because they will match everything! This is no longer true, so have one.\n\npattern\nline by itself\n\nEnd of the list of patterns.\n"
  },
  {
    "path": "src/pcre/testdata/grepoutput",
    "content": "---------------------------- Test 1 ------------------------------\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\nCheck up on PATTERN near the end.\nRC=0\n---------------------------- Test 2 ------------------------------\nPATTERN at the start of a line.\nRC=0\n---------------------------- Test 3 ------------------------------\n7:PATTERN at the start of a line.\n8:In the middle of a line, PATTERN appears.\n10:This pattern is in lower case.\n610:Check up on PATTERN near the end.\nRC=0\n---------------------------- Test 4 ------------------------------\n4\nRC=0\n---------------------------- Test 5 ------------------------------\n./testdata/grepinput:7:PATTERN at the start of a line.\n./testdata/grepinput:8:In the middle of a line, PATTERN appears.\n./testdata/grepinput:10:This pattern is in lower case.\n./testdata/grepinput:610:Check up on PATTERN near the end.\n./testdata/grepinputx:3:Here is the pattern again.\n./testdata/grepinputx:5:Pattern\n./testdata/grepinputx:42:This line contains pattern not on a line by itself.\nRC=0\n---------------------------- Test 6 ------------------------------\n7:PATTERN at the start of a line.\n8:In the middle of a line, PATTERN appears.\n10:This pattern is in lower case.\n610:Check up on PATTERN near the end.\n3:Here is the pattern again.\n5:Pattern\n42:This line contains pattern not on a line by itself.\nRC=0\n---------------------------- Test 7 ------------------------------\n./testdata/grepinput\n./testdata/grepinputx\nRC=0\n---------------------------- Test 8 ------------------------------\n./testdata/grepinput\nRC=0\n---------------------------- Test 9 ------------------------------\nRC=0\n---------------------------- Test 10 -----------------------------\nRC=1\n---------------------------- Test 11 -----------------------------\n1:This is a second file of input for the pcregrep tests.\n2:\n4:\n5:Pattern\n6:That time it was on a line by itself.\n7:\n8:To pat or not to pat, that is the question.\n9:\n10:complete pair\n11:of lines\n12:\n13:That was a complete pair\n14:of lines all by themselves.\n15:\n16:complete pair\n17:of lines\n18:\n19:And there they were again, to check line numbers.\n20:\n21:one\n22:two\n23:three\n24:four\n25:five\n26:six\n27:seven\n28:eight\n29:nine\n30:ten\n31:eleven\n32:twelve\n33:thirteen\n34:fourteen\n35:fifteen\n36:sixteen\n37:seventeen\n38:eighteen\n39:nineteen\n40:twenty\n41:\n43:This is the last line of this file.\nRC=0\n---------------------------- Test 12 -----------------------------\nPattern\nRC=0\n---------------------------- Test 13 -----------------------------\nHere is the pattern again.\nThat time it was on a line by itself.\nseventeen\nThis line contains pattern not on a line by itself.\nRC=0\n---------------------------- Test 14 -----------------------------\n./testdata/grepinputx:To pat or not to pat, that is the question.\nRC=0\n---------------------------- Test 15 -----------------------------\npcregrep: Error in command-line regex at offset 4: nothing to repeat\nRC=2\n---------------------------- Test 16 -----------------------------\npcregrep: Failed to open ./testdata/nonexistfile: No such file or directory\nRC=2\n---------------------------- Test 17 -----------------------------\nfeatures should be added at the end, because some of the tests involve the\noutput of line numbers, and we don't want these to change.\nRC=0\n---------------------------- Test 18 -----------------------------\n4:features should be added at the end, because some of the tests involve the\noutput of line numbers, and we don't want these to change.\n583:brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.\n-------------------------------------------------------------------------------\nRC=0\n---------------------------- Test 19 -----------------------------\nPattern\nRC=0\n---------------------------- Test 20 -----------------------------\n10:complete pair\nof lines\n16:complete pair\nof lines\nRC=0\n---------------------------- Test 21 -----------------------------\n24:four\n25-five\n26-six\n27-seven\n--\n34:fourteen\n35-fifteen\n36-sixteen\n37-seventeen\nRC=0\n---------------------------- Test 22 -----------------------------\n21-one\n22-two\n23-three\n24:four\n--\n31-eleven\n32-twelve\n33-thirteen\n34:fourteen\nRC=0\n---------------------------- Test 23 -----------------------------\none\ntwo\nthree\nfour\nfive\nsix\nseven\n--\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\nRC=0\n---------------------------- Test 24 -----------------------------\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty\n\nThis line contains pattern not on a line by itself.\nThis is the last line of this file.\nRC=0\n---------------------------- Test 25 -----------------------------\n15-\n16-complete pair\n17-of lines\n18-\n19-And there they were again, to check line numbers.\n20-\n21-one\n22-two\n23-three\n24:four\n25-five\n26-six\n27-seven\n28-eight\n29-nine\n30-ten\n31-eleven\n32-twelve\n33-thirteen\n34:fourteen\nRC=0\n---------------------------- Test 26 -----------------------------\n\ncomplete pair\nof lines\n\nAnd there they were again, to check line numbers.\n\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty\n\nThis line contains pattern not on a line by itself.\nThis is the last line of this file.\nRC=0\n---------------------------- Test 27 -----------------------------\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty\n\nThis line contains pattern not on a line by itself.\nThis is the last line of this file.\nRC=0\n---------------------------- Test 28 -----------------------------\n14-of lines all by themselves.\n15-\n16-complete pair\n17-of lines\n18-\n19-And there they were again, to check line numbers.\n20-\n21-one\n22-two\n23-three\n24:four\n25-five\n26-six\n27-seven\n28-eight\n29-nine\n30-ten\n31-eleven\n32-twelve\n33-thirteen\n34:fourteen\nRC=0\n---------------------------- Test 29 -----------------------------\nof lines all by themselves.\n\ncomplete pair\nof lines\n\nAnd there they were again, to check line numbers.\n\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\ntwelve\nthirteen\nfourteen\nfifteen\nsixteen\nseventeen\neighteen\nnineteen\ntwenty\n\nThis line contains pattern not on a line by itself.\nThis is the last line of this file.\nRC=0\n---------------------------- Test 30 -----------------------------\n./testdata/grepinput-4-features should be added at the end, because some of the tests involve the\n./testdata/grepinput-5-output of line numbers, and we don't want these to change.\n./testdata/grepinput-6-\n./testdata/grepinput:7:PATTERN at the start of a line.\n./testdata/grepinput:8:In the middle of a line, PATTERN appears.\n./testdata/grepinput-9-\n./testdata/grepinput:10:This pattern is in lower case.\n--\n./testdata/grepinput-607-PUT NEW DATA ABOVE THIS LINE.\n./testdata/grepinput-608-=============================\n./testdata/grepinput-609-\n./testdata/grepinput:610:Check up on PATTERN near the end.\n--\n./testdata/grepinputx-1-This is a second file of input for the pcregrep tests.\n./testdata/grepinputx-2-\n./testdata/grepinputx:3:Here is the pattern again.\n./testdata/grepinputx-4-\n./testdata/grepinputx:5:Pattern\n--\n./testdata/grepinputx-39-nineteen\n./testdata/grepinputx-40-twenty\n./testdata/grepinputx-41-\n./testdata/grepinputx:42:This line contains pattern not on a line by itself.\nRC=0\n---------------------------- Test 31 -----------------------------\n./testdata/grepinput:7:PATTERN at the start of a line.\n./testdata/grepinput:8:In the middle of a line, PATTERN appears.\n./testdata/grepinput-9-\n./testdata/grepinput:10:This pattern is in lower case.\n./testdata/grepinput-11-\n./testdata/grepinput-12-Here follows a whole lot of stuff that makes the file over 24K long.\n./testdata/grepinput-13-\n--\n./testdata/grepinput:610:Check up on PATTERN near the end.\n./testdata/grepinput-611-This is the last line of this file.\n--\n./testdata/grepinputx:3:Here is the pattern again.\n./testdata/grepinputx-4-\n./testdata/grepinputx:5:Pattern\n./testdata/grepinputx-6-That time it was on a line by itself.\n./testdata/grepinputx-7-\n./testdata/grepinputx-8-To pat or not to pat, that is the question.\n--\n./testdata/grepinputx:42:This line contains pattern not on a line by itself.\n./testdata/grepinputx-43-This is the last line of this file.\nRC=0\n---------------------------- Test 32 -----------------------------\n./testdata/grepinputx\nRC=0\n---------------------------- Test 33 -----------------------------\npcregrep: Failed to open ./testdata/grepnonexist: No such file or directory\nRC=2\n---------------------------- Test 34 -----------------------------\nRC=2\n---------------------------- Test 35 -----------------------------\n./testdata/grepinput8\n./testdata/grepinputx\nRC=0\n---------------------------- Test 36 -----------------------------\n./testdata/grepinput3\n./testdata/grepinputx\nRC=0\n---------------------------- Test 37 -----------------------------\naaaaa0\naaaaa2\n010203040506\nRC=0\n======== STDERR ========\npcregrep: pcre_exec() gave error -8 while matching this text:\n\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\npcregrep: pcre_exec() gave error -8 while matching this text:\n\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\npcregrep: Error -8, -21 or -27 means that a resource limit was exceeded.\npcregrep: Check your regex for nested unlimited loops.\n---------------------------- Test 38 ------------------------------\nThis line contains a binary zero here >\u0000< for testing.\nRC=0\n---------------------------- Test 39 ------------------------------\nThis is a line before the binary zero.\nThis line contains a binary zero here >\u0000< for testing.\nRC=0\n---------------------------- Test 40 ------------------------------\nThis line contains a binary zero here >\u0000< for testing.\nThis is a line after the binary zero.\nRC=0\n---------------------------- Test 41 ------------------------------\nbefore the binary zero\nafter the binary zero\nRC=0\n---------------------------- Test 42 ------------------------------\n./testdata/grepinput:595:before the binary zero\n./testdata/grepinput:597:after the binary zero\nRC=0\n---------------------------- Test 43 ------------------------------\n595:before\n595:zero\n596:zero\n597:after\n597:zero\nRC=0\n---------------------------- Test 44 ------------------------------\n595:before\n595:zero\n596:zero\n597:zero\nRC=0\n---------------------------- Test 45 ------------------------------\n10:pattern\n595:binary\n596:binary\n597:binary\nRC=0\n---------------------------- Test 46 ------------------------------\npcregrep: Error in 2nd command-line regex at offset 9: missing )\nRC=2\n---------------------------- Test 47 ------------------------------\nAB.VE\nRC=0\n---------------------------- Test 48 ------------------------------\nABOVE the elephant \nAB.VE\nAB.VE the turtle\nRC=0\n---------------------------- Test 49 ------------------------------\nABOVE the elephant \nAB.VE\nAB.VE the turtle\nPUT NEW DATA ABOVE THIS LINE.\nRC=0\n---------------------------- Test 50 ------------------------------\nRC=1\n---------------------------- Test 51 ------------------------------\nover the lazy dog.\nThis time it jumps and jumps and jumps.\nRC=0\n---------------------------- Test 52 ------------------------------\nfox \u001b[1;31mjumps\u001b[00m\nThis time it \u001b[1;31mjumps\u001b[00m and \u001b[1;31mjumps\u001b[00m and \u001b[1;31mjumps\u001b[00m.\nRC=0\n---------------------------- Test 53 ------------------------------\n36972,6\n36990,4\n37024,4\n37066,5\n37083,4\nRC=0\n---------------------------- Test 54 ------------------------------\n595:15,6\n595:33,4\n596:28,4\n597:15,5\n597:32,4\nRC=0\n---------------------------- Test 55 -----------------------------\nHere is the \u001b[1;31mpattern\u001b[00m again.\nThat time it was on a \u001b[1;31mline by itself\u001b[00m.\nThis line contains \u001b[1;31mpattern\u001b[00m not on a \u001b[1;31mline by itself\u001b[00m.\nRC=0\n---------------------------- Test 56 -----------------------------\n./testdata/grepinput:456\n./testdata/grepinput3:0\n./testdata/grepinput8:0\n./testdata/grepinputv:1\n./testdata/grepinputx:0\nRC=0\n---------------------------- Test 57 -----------------------------\n./testdata/grepinput:456\n./testdata/grepinputv:1\nRC=0\n---------------------------- Test 58 -----------------------------\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\nCheck up on PATTERN near the end.\nRC=0\n---------------------------- Test 59 -----------------------------\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\nCheck up on PATTERN near the end.\nRC=0\n---------------------------- Test 60 -----------------------------\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\nCheck up on PATTERN near the end.\nRC=0\n---------------------------- Test 61 -----------------------------\nPATTERN at the start of a line.\nIn the middle of a line, PATTERN appears.\nCheck up on PATTERN near the end.\nRC=0\n---------------------------- Test 62 -----------------------------\npcregrep: pcre_exec() gave error -8 while matching text that starts:\n\nThis is a file of miscellaneous text that is used as test data for checking\nthat the pcregrep command is working correctly. The file must be more than 24K\nlong so that it needs more than a single read\n\npcregrep: Error -8, -21 or -27 means that a resource limit was exceeded.\npcregrep: Check your regex for nested unlimited loops.\nRC=1\n---------------------------- Test 63 -----------------------------\npcregrep: pcre_exec() gave error -21 while matching text that starts:\n\nThis is a file of miscellaneous text that is used as test data for checking\nthat the pcregrep command is working correctly. The file must be more than 24K\nlong so that it needs more than a single read\n\npcregrep: Error -8, -21 or -27 means that a resource limit was exceeded.\npcregrep: Check your regex for nested unlimited loops.\nRC=1\n---------------------------- Test 64 ------------------------------\nappears\nRC=0\n---------------------------- Test 65 ------------------------------\npear\nRC=0\n---------------------------- Test 66 ------------------------------\nRC=0\n---------------------------- Test 67 ------------------------------\nRC=0\n---------------------------- Test 68 ------------------------------\npear\nRC=0\n---------------------------- Test 69 -----------------------------\n1:This is a second file of input for the pcregrep tests.\n2:\n4:\n5:Pattern\n6:That time it was on a line by itself.\n7:\n8:To pat or not to pat, that is the question.\n9:\n10:complete pair\n11:of lines\n12:\n13:That was a complete pair\n14:of lines all by themselves.\n15:\n16:complete pair\n17:of lines\n18:\n19:And there they were again, to check line numbers.\n20:\n21:one\n22:two\n23:three\n24:four\n25:five\n26:six\n27:seven\n28:eight\n29:nine\n30:ten\n31:eleven\n32:twelve\n33:thirteen\n34:fourteen\n35:fifteen\n36:sixteen\n37:seventeen\n38:eighteen\n39:nineteen\n40:twenty\n41:\n43:This is the last line of this file.\nRC=0\n---------------------------- Test 70 -----------------------------\n\u001b[1;31mtriple:\tt1_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\n\u001b[00m\u001b[1;31mtriple:\tt3_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\n\u001b[00m\u001b[1;31mtriple:\tt4_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\n\u001b[00m\u001b[1;31mtriple:\tt6_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\n\u001b[00mRC=0\n---------------------------- Test 71 -----------------------------\n01\nRC=0\n---------------------------- Test 72 -----------------------------\n\u001b[1;31m01\u001b[00m0203040506\nRC=0\n---------------------------- Test 73 -----------------------------\n\u001b[1;31m01\u001b[00m\nRC=0\n---------------------------- Test 74 -----------------------------\n01\n02\nRC=0\n---------------------------- Test 75 -----------------------------\n\u001b[1;31m01\u001b[00m\u001b[1;31m02\u001b[00m03040506\nRC=0\n---------------------------- Test 76 -----------------------------\n\u001b[1;31m01\u001b[00m\n\u001b[1;31m02\u001b[00m\nRC=0\n---------------------------- Test 77 -----------------------------\n01\n03\nRC=0\n---------------------------- Test 78 -----------------------------\n\u001b[1;31m01\u001b[00m02\u001b[1;31m03\u001b[00m040506\nRC=0\n---------------------------- Test 79 -----------------------------\n\u001b[1;31m01\u001b[00m\n\u001b[1;31m03\u001b[00m\nRC=0\n---------------------------- Test 80 -----------------------------\n01\nRC=0\n---------------------------- Test 81 -----------------------------\n\u001b[1;31m01\u001b[00m0203040506\nRC=0\n---------------------------- Test 82 -----------------------------\n\u001b[1;31m01\u001b[00m\nRC=0\n---------------------------- Test 83 -----------------------------\npcregrep: line 4 of file ./testdata/grepinput3 is too long for the internal buffer\npcregrep: check the --buffer-size option\nRC=2\n---------------------------- Test 84 -----------------------------\ntestdata/grepinputv:fox jumps\ntestdata/grepinputx:complete pair\ntestdata/grepinputx:That was a complete pair\ntestdata/grepinputx:complete pair\ntestdata/grepinput3:triple:\tt7_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\nRC=0\n---------------------------- Test 85 -----------------------------\n./testdata/grepinput3:Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\nRC=0\n---------------------------- Test 86 -----------------------------\nBinary file ./testdata/grepbinary matches\nRC=0\n---------------------------- Test 87 -----------------------------\nRC=1\n---------------------------- Test 88 -----------------------------\nBinary file ./testdata/grepbinary matches\nRC=0\n---------------------------- Test 89 -----------------------------\nRC=1\n---------------------------- Test 90 -----------------------------\nRC=1\n---------------------------- Test 91 -----------------------------\nThe quick brown f\u0000x jumps over the lazy dog.\nRC=0\n---------------------------- Test 92 -----------------------------\nThe quick brown f\u0000x jumps over the lazy dog.\nRC=0\n---------------------------- Test 93 -----------------------------\nThe quick brown f\u0000x jumps over the lazy dog.\nRC=0\n---------------------------- Test 94 -----------------------------\n./testdata/grepinput8\n./testdata/grepinputx\nRC=0\n---------------------------- Test 95 -----------------------------\ntestdata/grepinputx:complete pair\ntestdata/grepinputx:That was a complete pair\ntestdata/grepinputx:complete pair\nRC=0\n---------------------------- Test 96 -----------------------------\n./testdata/grepinput3\n./testdata/grepinput8\n./testdata/grepinputx\nRC=0\n---------------------------- Test 97 -----------------------------\n./testdata/grepinput3\n./testdata/grepinputx\nRC=0\n---------------------------- Test 98 -----------------------------\n./testdata/grepinputx\nRC=0\n---------------------------- Test 99 -----------------------------\n./testdata/grepinput3\n./testdata/grepinputx\nRC=0\n---------------------------- Test 100 ------------------------------\n./testdata/grepinput:zerothe.\n./testdata/grepinput:zeroa\n./testdata/grepinput:zerothe.\nRC=0\n---------------------------- Test 101 ------------------------------\n./testdata/grepinput:\u001b[1;31m.\u001b[00m|\u001b[1;31mzero\u001b[00m|\u001b[1;31mthe\u001b[00m|\u001b[1;31m.\u001b[00m\n./testdata/grepinput:\u001b[1;31mzero\u001b[00m|\u001b[1;31ma\u001b[00m\n./testdata/grepinput:\u001b[1;31m.\u001b[00m|\u001b[1;31mzero\u001b[00m|\u001b[1;31mthe\u001b[00m|\u001b[1;31m.\u001b[00m\nRC=0\n---------------------------- Test 102 -----------------------------\n2:\n5:\n7:\n9:\n12:\n14:\nRC=0\n---------------------------- Test 103 -----------------------------\nRC=0\n---------------------------- Test 104 -----------------------------\n2:\n5:\n7:\n9:\n12:\n14:\nRC=0\n---------------------------- Test 105 -----------------------------\n\u001b[1;31m\u001b[00mtriple:\tt1_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt2_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\t\n\u001b[1;31m\u001b[00mLorem \u001b[1;31mipsum\u001b[00m dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt3_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt4_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt5_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\t\n\u001b[1;31m\u001b[00mo_txt\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt6_txt\ts2_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\n\u001b[1;31m\u001b[00m\n\u001b[1;31m\u001b[00mtriple:\tt7_txt\ts1_tag\ts_txt\tp_tag\tp_txt\to_tag\to_txt\nRC=0\n---------------------------- Test 106 -----------------------------\na\nRC=0\n---------------------------- Test 107 -----------------------------\n1:0,1\n2:0,1\n2:1,1\n2:2,1\n2:3,1\n2:4,1\nRC=0\n---------------------------- Test 108 ------------------------------\nRC=0\n---------------------------- Test 109 -----------------------------\nRC=0\n"
  },
  {
    "path": "src/pcre/testdata/grepoutput8",
    "content": "---------------------------- Test U1 ------------------------------\n1:X one\n2:X two\u000b3:X three\f4:X four\r5:X five\r\n6:X six\n7:X seven8:X eight 9:X nine 10:X ten\nRC=0\n---------------------------- Test U2 ------------------------------\n12-Before 111\n13-Before 222 14-Before 33315:Match\r\n16-After 111\n17-After 222 18-After 333\nRC=0\n"
  },
  {
    "path": "src/pcre/testdata/grepoutputN",
    "content": "---------------------------- Test N1 ------------------------------\r\n1:abc\r2:def\r---------------------------- Test N2 ------------------------------\r\n1:abc\rdef\r\n2:ghi\njkl---------------------------- Test N3 ------------------------------\r\n2:def\r3:\nghi\njkl---------------------------- Test N4 ------------------------------\r\n2:ghi\njkl---------------------------- Test N5 ------------------------------\r\n1:abc\r2:def\r\n3:ghi\n4:jkl---------------------------- Test N6 ------------------------------\r\n1:abc\r2:def\r\n3:ghi\n4:jkl"
  },
  {
    "path": "src/pcre/testdata/greppatN4",
    "content": "xxx\r\njkl"
  },
  {
    "path": "src/pcre/testdata/testinput1",
    "content": "/-- This set of tests is for features that are compatible with all versions of\n    Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit,\n    and 32-bit PCRE libraries. --/\n    \n< forbid 89?=ABCDEFfGILMNPTUWXZ<\n\n/the quick brown fox/\n    the quick brown fox\n    The quick brown FOX\n    What do you know about the quick brown fox?\n    What do you know about THE QUICK BROWN FOX?\n\n/The quick brown fox/i\n    the quick brown fox\n    The quick brown FOX\n    What do you know about the quick brown fox?\n    What do you know about THE QUICK BROWN FOX?\n\n/abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/\n    abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\n\n/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/\n    abxyzpqrrrabbxyyyypqAzz\n    abxyzpqrrrabbxyyyypqAzz\n    aabxyzpqrrrabbxyyyypqAzz\n    aaabxyzpqrrrabbxyyyypqAzz\n    aaaabxyzpqrrrabbxyyyypqAzz\n    abcxyzpqrrrabbxyyyypqAzz\n    aabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypAzz\n    aaabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n    aaaabcxyzpqrrrabbxyyyypqAzz\n    abxyzzpqrrrabbxyyyypqAzz\n    aabxyzzzpqrrrabbxyyyypqAzz\n    aaabxyzzzzpqrrrabbxyyyypqAzz\n    aaaabxyzzzzpqrrrabbxyyyypqAzz\n    abcxyzzpqrrrabbxyyyypqAzz\n    aabcxyzzzpqrrrabbxyyyypqAzz\n    aaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypABzz\n    aaabcxyzpqrrrabbxyyyypABBzz\n    >>>aaabxyzpqrrrabbxyyyypqAzz\n    >aaaabxyzpqrrrabbxyyyypqAzz\n    >>>>abcxyzpqrrrabbxyyyypqAzz\n    *** Failers\n    abxyzpqrrabbxyyyypqAzz\n    abxyzpqrrrrabbxyyyypqAzz\n    abxyzpqrrrabxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\n\n/^(abc){1,2}zz/\n    abczz\n    abcabczz\n    *** Failers\n    zz\n    abcabcabczz\n    >>abczz\n\n/^(b+?|a){1,2}?c/\n    bc\n    bbc\n    bbbc\n    bac\n    bbac\n    aac\n    abbbbbbbbbbbc\n    bbbbbbbbbbbac\n    *** Failers\n    aaac\n    abbbbbbbbbbbac\n\n/^(b+|a){1,2}c/\n    bc\n    bbc\n    bbbc\n    bac\n    bbac\n    aac\n    abbbbbbbbbbbc\n    bbbbbbbbbbbac\n    *** Failers\n    aaac\n    abbbbbbbbbbbac\n\n/^(b+|a){1,2}?bc/\n    bbc\n\n/^(b*|ba){1,2}?bc/\n    babc\n    bbabc\n    bababc\n    *** Failers\n    bababbc\n    babababc\n\n/^(ba|b*){1,2}?bc/\n    babc\n    bbabc\n    bababc\n    *** Failers\n    bababbc\n    babababc\n\n/^\\ca\\cA\\c[;\\c:/\n    \\x01\\x01\\e;z\n\n/^[ab\\]cde]/\n    athing\n    bthing\n    ]thing\n    cthing\n    dthing\n    ething\n    *** Failers\n    fthing\n    [thing\n    \\\\thing\n\n/^[]cde]/\n    ]thing\n    cthing\n    dthing\n    ething\n    *** Failers\n    athing\n    fthing\n\n/^[^ab\\]cde]/\n    fthing\n    [thing\n    \\\\thing\n    *** Failers\n    athing\n    bthing\n    ]thing\n    cthing\n    dthing\n    ething\n\n/^[^]cde]/\n    athing\n    fthing\n    *** Failers\n    ]thing\n    cthing\n    dthing\n    ething\n\n/^\\/\n    \n\n/^/\n    \n\n/^[0-9]+$/\n    0\n    1\n    2\n    3\n    4\n    5\n    6\n    7\n    8\n    9\n    10\n    100\n    *** Failers\n    abc\n\n/^.*nter/\n    enter\n    inter\n    uponter\n\n/^xxx[0-9]+$/\n    xxx0\n    xxx1234\n    *** Failers\n    xxx\n\n/^.+[0-9][0-9][0-9]$/\n    x123\n    xx123\n    123456\n    *** Failers\n    123\n    x1234\n\n/^.+?[0-9][0-9][0-9]$/\n    x123\n    xx123\n    123456\n    *** Failers\n    123\n    x1234\n\n/^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/\n    abc!pqr=apquxz.ixr.zzz.ac.uk\n    *** Failers\n    !pqr=apquxz.ixr.zzz.ac.uk\n    abc!=apquxz.ixr.zzz.ac.uk\n    abc!pqr=apquxz:ixr.zzz.ac.uk\n    abc!pqr=apquxz.ixr.zzz.ac.ukk\n\n/:/\n    Well, we need a colon: somewhere\n    *** Fail if we don't\n\n/([\\da-f:]+)$/i\n    0abc\n    abc\n    fed\n    E\n    ::\n    5f03:12C0::932e\n    fed def\n    Any old stuff\n    *** Failers\n    0zzz\n    gzzz\n    fed\\x20\n    Any old rubbish\n\n/^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/\n    .1.2.3\n    A.12.123.0\n    *** Failers\n    .1.2.3333\n    1.2.3\n    1234.2.3\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n    1    IN    SOA    non-sp1    non-sp2   (\n    *** Failers\n    1IN SOA non-sp1 non-sp2(\n\n/^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/\n    a.\n    Z.\n    2.\n    ab-c.pq-r.\n    sxk.zzz.ac.uk.\n    x-.y-.\n    *** Failers\n    -abc.peq.\n\n/^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/\n    *.a\n    *.b0-a\n    *.c3-b.c\n    *.c-a.b-c\n    *** Failers\n    *.0\n    *.a-\n    *.a-b.c-\n    *.c-a.0-c\n\n/^(?=ab(de))(abd)(e)/\n    abde\n\n/^(?!(ab)de|x)(abd)(f)/\n    abdf\n\n/^(?=(ab(cd)))(ab)/\n    abcd\n\n/^[\\da-f](\\.[\\da-f])*$/i\n    a.b.c.d\n    A.B.C.D\n    a.b.c.1.2.3.C\n\n/^\\\".*\\\"\\s*(;.*)?$/\n    \\\"1234\\\"\n    \\\"abcd\\\" ;\n    \\\"\\\" ; rhubarb\n    *** Failers\n    \\\"1234\\\" : things\n\n/^$/\n    \\\n    *** Failers\n\n/   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/x\n    ab c\n    *** Failers\n    abc\n    ab cde\n\n/(?x)   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/\n    ab c\n    *** Failers\n    abc\n    ab cde\n\n/^   a\\ b[c ]d       $/x\n    a bcd\n    a b d\n    *** Failers\n    abcd\n    ab d\n\n/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/\n    abcdefhijklm\n\n/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/\n    abcdefhijklm\n\n/^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/\n    a+ Z0+\\x08\\n\\x1d\\x12\n\n/^[.^$|()*+?{,}]+/\n    .^\\$(*+)|{?,?}\n\n/^a*\\w/\n    z\n    az\n    aaaz\n    a\n    aa\n    aaaa\n    a+\n    aa+\n\n/^a*?\\w/\n    z\n    az\n    aaaz\n    a\n    aa\n    aaaa\n    a+\n    aa+\n\n/^a+\\w/\n    az\n    aaaz\n    aa\n    aaaa\n    aa+\n\n/^a+?\\w/\n    az\n    aaaz\n    aa\n    aaaa\n    aa+\n\n/^\\d{8}\\w{2,}/\n    1234567890\n    12345678ab\n    12345678__\n    *** Failers\n    1234567\n\n/^[aeiou\\d]{4,5}$/\n    uoie\n    1234\n    12345\n    aaaaa\n    *** Failers\n    123456\n\n/^[aeiou\\d]{4,5}?/\n    uoie\n    1234\n    12345\n    aaaaa\n    123456\n\n/\\A(abc|def)=(\\1){2,3}\\Z/\n    abc=abcabc\n    def=defdefdef\n    *** Failers\n    abc=defdef\n\n/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/\n    abcdefghijkcda2\n    abcdefghijkkkkcda2\n\n/(cat(a(ract|tonic)|erpillar)) \\1()2(3)/\n    cataract cataract23\n    catatonic catatonic23\n    caterpillar caterpillar23\n\n\n/^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]/\n    From abcd  Mon Sep 01 12:33:02 1997\n\n/^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/\n    From abcd  Mon Sep 01 12:33:02 1997\n    From abcd  Mon Sep  1 12:33:02 1997\n    *** Failers\n    From abcd  Sep 01 12:33:02 1997\n\n/^12.34/s\n    12\\n34\n    12\\r34\n\n/\\w+(?=\\t)/\n    the quick brown\\t fox\n\n/foo(?!bar)(.*)/\n    foobar is foolish see?\n\n/(?:(?!foo)...|^.{0,2})bar(.*)/\n    foobar crowbar etc\n    barrel\n    2barrel\n    A barrel\n\n/^(\\D*)(?=\\d)(?!123)/\n    abc456\n    *** Failers\n    abc123\n\n/^1234(?# test newlines\n  inside)/\n    1234\n\n/^1234 #comment in extended re\n  /x\n    1234\n\n/#rhubarb\n  abcd/x\n    abcd\n\n/^abcd#rhubarb/x\n    abcd\n\n/^(a)\\1{2,3}(.)/\n    aaab\n    aaaab\n    aaaaab\n    aaaaaab\n\n/(?!^)abc/\n    the abc\n    *** Failers\n    abc\n\n/(?=^)abc/\n    abc\n    *** Failers\n    the abc\n\n/^[ab]{1,3}(ab*|b)/\n    aabbbbb\n\n/^[ab]{1,3}?(ab*|b)/\n    aabbbbb\n\n/^[ab]{1,3}?(ab*?|b)/\n    aabbbbb\n\n/^[ab]{1,3}(ab*?|b)/\n    aabbbbb\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/x\n    Alan Other <user\\@dom.ain>\n    <user\\@dom.ain>\n    user\\@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n    A. Other <user.1234\\@dom.ain> (a comment)\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n    A missing angle <user\\@some.where\n    *** Failers\n    The quick brown fox\n\n/[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional leading comment\n(?:\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n# address\n|                             #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n# leading word\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *               # \"normal\" atoms and or spaces\n(?:\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n|\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n) # \"special\" comment or quoted string\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *            #  more \"normal\"\n)*\n<\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# <\n(?:\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n(?: ,\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n)*  # additional domains\n:\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)?     #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n#       address spec\n>                    #                 >\n# name and address\n)\n/x\n    Alan Other <user\\@dom.ain>\n    <user\\@dom.ain>\n    user\\@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n    A. Other <user.1234\\@dom.ain> (a comment)\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n    A missing angle <user\\@some.where\n    *** Failers\n    The quick brown fox\n\n/abc\\0def\\00pqr\\000xyz\\0000AB/\n    abc\\0def\\00pqr\\000xyz\\0000AB\n    abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\n\n/abc\\x0def\\x00pqr\\x000xyz\\x0000AB/\n    abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n    abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\n\n/^[\\000-\\037]/\n    \\0A\n    \\01B\n    \\037C\n\n/\\0*/\n    \\0\\0\\0\\0\n\n/A\\x0{2,3}Z/\n    The A\\x0\\x0Z\n    An A\\0\\x0\\0Z\n    *** Failers\n    A\\0Z\n    A\\0\\x0\\0\\x0Z\n\n/^(cow|)\\1(bell)/\n    cowcowbell\n    bell\n    *** Failers\n    cowbell\n\n/^\\s/\n    \\040abc\n    \\x0cabc\n    \\nabc\n    \\rabc\n    \\tabc\n    *** Failers\n    abc\n\n/^a\tb\n    \f  c/x\n    abc\n\n/^(a|)\\1*b/\n    ab\n    aaaab\n    b\n    *** Failers\n    acb\n\n/^(a|)\\1+b/\n    aab\n    aaaab\n    b\n    *** Failers\n    ab\n\n/^(a|)\\1?b/\n    ab\n    aab\n    b\n    *** Failers\n    acb\n\n/^(a|)\\1{2}b/\n    aaab\n    b\n    *** Failers\n    ab\n    aab\n    aaaab\n\n/^(a|)\\1{2,3}b/\n    aaab\n    aaaab\n    b\n    *** Failers\n    ab\n    aab\n    aaaaab\n\n/ab{1,3}bc/\n    abbbbc\n    abbbc\n    abbc\n    *** Failers\n    abc\n    abbbbbc\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/\n    track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/i\n    track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[t ]+(.*)/i\n    track1.title:TBlah blah blah\n\n/^[W-c]+$/\n    WXY_^abc\n    *** Failers\n    wxy\n\n/^[W-c]+$/i\n    WXY_^abc\n    wxy_^ABC\n\n/^[\\x3f-\\x5F]+$/i\n    WXY_^abc\n    wxy_^ABC\n\n/^abc$/m\n    abc\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n/^abc$/\n    abc\n    *** Failers\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n/\\Aabc\\Z/m\n    abc\n    abc\\n \n    *** Failers\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n    \n/\\A(.)*\\Z/s\n    abc\\ndef\n\n/\\A(.)*\\Z/m\n    *** Failers\n    abc\\ndef\n\n/(?:b)|(?::+)/\n    b::c\n    c::b\n\n/[-az]+/\n    az-\n    *** Failers\n    b\n\n/[az-]+/\n    za-\n    *** Failers\n    b\n\n/[a\\-z]+/\n    a-z\n    *** Failers\n    b\n\n/[a-z]+/\n    abcdxyz\n\n/[\\d-]+/\n    12-34\n    *** Failers\n    aaa\n\n/[\\d-z]+/\n    12-34z\n    *** Failers\n    aaa\n\n/\\x5c/\n    \\\\\n\n/\\x20Z/\n    the Zoo\n    *** Failers\n    Zulu\n\n/(abc)\\1/i\n    abcabc\n    ABCabc\n    abcABC\n\n/ab{3cd/\n    ab{3cd\n\n/ab{3,cd/\n    ab{3,cd\n\n/ab{3,4a}cd/\n    ab{3,4a}cd\n\n/{4,5a}bc/\n    {4,5a}bc\n\n/abc$/\n    abc\n    abc\\n\n    *** Failers\n    abc\\ndef\n\n/(abc)\\123/\n    abc\\x53\n\n/(abc)\\223/\n    abc\\x93\n\n/(abc)\\323/\n    abc\\xd3\n\n/(abc)\\100/\n    abc\\x40\n    abc\\100\n\n/(abc)\\1000/\n    abc\\x400\n    abc\\x40\\x30\n    abc\\1000\n    abc\\100\\x30\n    abc\\100\\060\n    abc\\100\\60\n    \n/^A\\8B\\9C$/\n    A8B9C\n    *** Failers\n    A\\08B\\09C  \n    \n/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\\8\\9$/\n    ABCDEFGHIHI \n\n/^[A\\8B\\9C]+$/\n    A8B9C\n    *** Failers \n    A8B9C\\x00\n\n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/\n    abcdefghijkllS\n\n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/\n    abcdefghijk\\12S\n\n/ab\\idef/\n    abidef\n\n/a{0}bc/\n    bc\n\n/(a|(bc)){0,0}?xyz/\n    xyz\n\n/abc[\\10]de/\n    abc\\010de\n\n/abc[\\1]de/\n    abc\\1de\n\n/(abc)[\\1]de/\n    abc\\1de\n\n/(?s)a.b/\n    a\\nb\n\n/^([^a])([^\\b])([^c]*)([^d]{3,4})/\n    baNOTccccd\n    baNOTcccd\n    baNOTccd\n    bacccd\n    *** Failers\n    anything\n    b\\bc   \n    baccd\n\n/[^a]/\n    Abc\n  \n/[^a]/i\n    Abc \n\n/[^a]+/\n    AAAaAbc\n  \n/[^a]+/i\n    AAAaAbc \n\n/[^a]+/\n    bbb\\nccc\n   \n/[^k]$/\n    abc\n    *** Failers\n    abk   \n   \n/[^k]{2,3}$/\n    abc\n    kbc\n    kabc \n    *** Failers\n    abk\n    akb\n    akk \n\n/^\\d{8,}\\@.+[^k]$/\n    12345678\\@a.b.c.d\n    123456789\\@x.y.z\n    *** Failers\n    12345678\\@x.y.uk\n    1234567\\@a.b.c.d       \n\n/(a)\\1{8,}/\n    aaaaaaaaa\n    aaaaaaaaaa\n    *** Failers\n    aaaaaaa   \n\n/[^a]/\n    aaaabcd\n    aaAabcd \n\n/[^a]/i\n    aaaabcd\n    aaAabcd \n\n/[^az]/\n    aaaabcd\n    aaAabcd \n\n/[^az]/i\n    aaaabcd\n    aaAabcd \n\n/\\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/\n \\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\n\n/P[^*]TAIRE[^*]{1,6}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n\n/P[^*]TAIRE[^*]{1,}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n\n/(\\.\\d\\d[1-9]?)\\d+/\n    1.230003938\n    1.875000282   \n    1.235  \n                  \n/(\\.\\d\\d((?=0)|\\d(?=\\d)))/\n    1.230003938      \n    1.875000282\n    *** Failers \n    1.235 \n    \n/a(?)b/\n    ab \n \n/\\b(foo)\\s+(\\w+)/i\n    Food is on the foo table\n    \n/foo(.*)bar/\n    The food is under the bar in the barn.\n    \n/foo(.*?)bar/  \n    The food is under the bar in the barn.\n\n/(.*)(\\d*)/\n    I have 2 numbers: 53147\n    \n/(.*)(\\d+)/\n    I have 2 numbers: 53147\n \n/(.*?)(\\d*)/\n    I have 2 numbers: 53147\n\n/(.*?)(\\d+)/\n    I have 2 numbers: 53147\n\n/(.*)(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*?)(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*)\\b(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*\\D)(\\d+)$/\n    I have 2 numbers: 53147\n\n/^\\D*(?!123)/\n    ABC123\n     \n/^(\\D*)(?=\\d)(?!123)/\n    ABC445\n    *** Failers\n    ABC123\n    \n/^[W-]46]/\n    W46]789 \n    -46]789\n    *** Failers\n    Wall\n    Zebra\n    42\n    [abcd] \n    ]abcd[\n       \n/^[W-\\]46]/\n    W46]789 \n    Wall\n    Zebra\n    Xylophone  \n    42\n    [abcd] \n    ]abcd[\n    \\\\backslash \n    *** Failers\n    -46]789\n    well\n    \n/\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/\n    01/01/2000\n\n/word (?:[a-zA-Z0-9]+ ){0,10}otherword/\n  word cat dog elephant mussel cow horse canary baboon snake shark otherword\n  word cat dog elephant mussel cow horse canary baboon snake shark\n\n/word (?:[a-zA-Z0-9]+ ){0,300}otherword/\n  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\n\n/^(a){0,0}/\n    bcd\n    abc\n    aab     \n\n/^(a){0,1}/\n    bcd\n    abc\n    aab  \n\n/^(a){0,2}/\n    bcd\n    abc\n    aab  \n\n/^(a){0,3}/\n    bcd\n    abc\n    aab\n    aaa   \n\n/^(a){0,}/\n    bcd\n    abc\n    aab\n    aaa\n    aaaaaaaa    \n\n/^(a){1,1}/\n    bcd\n    abc\n    aab  \n\n/^(a){1,2}/\n    bcd\n    abc\n    aab  \n\n/^(a){1,3}/\n    bcd\n    abc\n    aab\n    aaa   \n\n/^(a){1,}/\n    bcd\n    abc\n    aab\n    aaa\n    aaaaaaaa    \n\n/.*\\.gif/\n    borfle\\nbib.gif\\nno\n\n/.{0,}\\.gif/\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/m\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/s\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/ms\n    borfle\\nbib.gif\\nno\n    \n/.*$/\n    borfle\\nbib.gif\\nno\n\n/.*$/m\n    borfle\\nbib.gif\\nno\n\n/.*$/s\n    borfle\\nbib.gif\\nno\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\n    \n/.*$/\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/m\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/s\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\\n\n    \n/(.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers\n    abcde\\nBar  \n\n/(.*X|^B)/m\n    abcde\\n1234Xyz\n    BarFoo \n    abcde\\nBar  \n\n/(.*X|^B)/s\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers\n    abcde\\nBar  \n\n/(.*X|^B)/ms\n    abcde\\n1234Xyz\n    BarFoo \n    abcde\\nBar  \n\n/(?s)(.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers \n    abcde\\nBar  \n\n/(?s:.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers \n    abcde\\nBar  \n\n/^.*B/\n    **** Failers\n    abc\\nB\n     \n/(?s)^.*B/\n    abc\\nB\n\n/(?m)^.*B/\n    abc\\nB\n     \n/(?ms)^.*B/\n    abc\\nB\n\n/(?ms)^B/\n    abc\\nB\n\n/(?s)B$/\n    B\\n\n\n/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n    123456654321\n  \n/^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/\n    123456654321 \n\n/^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/\n    123456654321\n  \n/^[abc]{12}/\n    abcabcabcabc\n    \n/^[a-c]{12}/\n    abcabcabcabc\n    \n/^(a|b|c){12}/\n    abcabcabcabc \n\n/^[abcdefghijklmnopqrstuvwxy0123456789]/\n    n\n    *** Failers \n    z \n\n/abcde{0,0}/\n    abcd\n    *** Failers\n    abce  \n\n/ab[cd]{0,0}e/\n    abe\n    *** Failers\n    abcde \n    \n/ab(c){0,0}d/\n    abd\n    *** Failers\n    abcd   \n\n/a(b*)/\n    a\n    ab\n    abbbb\n    *** Failers\n    bbbbb    \n    \n/ab\\d{0}e/\n    abe\n    *** Failers\n    ab1e   \n    \n/\"([^\\\\\"]+|\\\\.)*\"/\n    the \\\"quick\\\" brown fox\n    \\\"the \\\\\\\"quick\\\\\\\" brown fox\\\" \n\n/.*?/g+\n    abc\n  \n/\\b/g+\n    abc \n\n/\\b/+g\n    abc \n\n//g\n    abc\n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is\n  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n\n/a[^a]b/\n    acb\n    a\\nb\n    \n/a.b/\n    acb\n    *** Failers \n    a\\nb   \n    \n/a[^a]b/s\n    acb\n    a\\nb  \n    \n/a.b/s\n    acb\n    a\\nb  \n\n/^(b+?|a){1,2}?c/\n    bac\n    bbac\n    bbbac\n    bbbbac\n    bbbbbac \n\n/^(b+|a){1,2}?c/\n    bac\n    bbac\n    bbbac\n    bbbbac\n    bbbbbac \n    \n/(?!\\A)x/m\n    x\\nb\\n\n    a\\bx\\n  \n    \n/\\x0{ab}/\n    \\0{ab} \n\n/(A|B)*?CD/\n    CD \n    \n/(A|B)*CD/\n    CD \n\n/(AB)*?\\1/\n    ABABAB\n\n/(AB)*\\1/\n    ABABAB\n    \n/(?<!bar)foo/\n    foo\n    catfood\n    arfootle\n    rfoosh\n    *** Failers\n    barfoo\n    towbarfoo\n\n/\\w{3}(?<!bar)foo/\n    catfood\n    *** Failers\n    foo\n    barfoo\n    towbarfoo\n\n/(?<=(foo)a)bar/\n    fooabar\n    *** Failers\n    bar\n    foobbar\n      \n/\\Aabc\\z/m\n    abc\n    *** Failers\n    abc\\n   \n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n\n/(?>(\\.\\d\\d[1-9]?))\\d+/\n    1.230003938\n    1.875000282\n    *** Failers \n    1.235 \n\n/^((?>\\w+)|(?>\\s+))*$/\n    now is the time for all good men to come to the aid of the party\n    *** Failers\n    this is not a line with only words and spaces!\n    \n/(\\d+)(\\w)/\n    12345a\n    12345+ \n\n/((?>\\d+))(\\w)/\n    12345a\n    *** Failers\n    12345+ \n\n/(?>a+)b/\n    aaab\n\n/((?>a+)b)/\n    aaab\n\n/(?>(a+))b/\n    aaab\n\n/(?>b)+/\n    aaabbbccc\n\n/(?>a+|b+|c+)*c/\n    aaabbbbccccd\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n    \n/\\(((?>[^()]+)|\\([^()]+\\))+\\)/ \n    (abc)\n    (abc(def)xyz)\n    *** Failers\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   \n\n/a(?-i)b/i\n    ab\n    Ab\n    *** Failers \n    aB\n    AB\n        \n/(a (?x)b c)d e/\n    a bcd e\n    *** Failers\n    a b cd e\n    abcd e   \n    a bcde \n \n/(a b(?x)c d (?-x)e f)/\n    a bcde f\n    *** Failers\n    abcdef  \n\n/(a(?i)b)c/\n    abc\n    aBc\n    *** Failers\n    abC\n    aBC  \n    Abc\n    ABc\n    ABC\n    AbC\n    \n/a(?i:b)c/\n    abc\n    aBc\n    *** Failers \n    ABC\n    abC\n    aBC\n    \n/a(?i:b)*c/\n    aBc\n    aBBc\n    *** Failers \n    aBC\n    aBBC\n    \n/a(?=b(?i)c)\\w\\wd/\n    abcd\n    abCd\n    *** Failers\n    aBCd\n    abcD     \n    \n/(?s-i:more.*than).*million/i\n    more than million\n    more than MILLION\n    more \\n than Million \n    *** Failers\n    MORE THAN MILLION    \n    more \\n than \\n million \n\n/(?:(?s-i)more.*than).*million/i\n    more than million\n    more than MILLION\n    more \\n than Million \n    *** Failers\n    MORE THAN MILLION    \n    more \\n than \\n million \n    \n/(?>a(?i)b+)+c/ \n    abc\n    aBbc\n    aBBc \n    *** Failers\n    Abc\n    abAb    \n    abbC \n    \n/(?=a(?i)b)\\w\\wc/\n    abc\n    aBc\n    *** Failers\n    Ab \n    abC\n    aBC     \n    \n/(?<=a(?i)b)(\\w\\w)c/\n    abxxc\n    aBxxc\n    *** Failers\n    Abxxc\n    ABxxc\n    abxxC      \n\n/(?:(a)|b)(?(1)A|B)/\n    aA\n    bB\n    *** Failers\n    aB\n    bA    \n\n/^(a)?(?(1)a|b)+$/\n    aa\n    b\n    bb  \n    *** Failers\n    ab   \n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/\n    abc:\n    12\n    *** Failers\n    123\n    xyz    \n\n/^(?(?!abc)\\d\\d|\\w{3}:)$/\n    abc:\n    12\n    *** Failers\n    123\n    xyz    \n    \n/(?(?<=foo)bar|cat)/\n    foobar\n    cat\n    fcat\n    focat   \n    *** Failers\n    foocat  \n\n/(?(?<!foo)cat|bar)/\n    foobar\n    cat\n    fcat\n    focat   \n    *** Failers\n    foocat  \n\n/( \\( )? [^()]+ (?(1) \\) |) /x\n    abcd\n    (abcd)\n    the quick (abcd) fox\n    (abcd   \n\n/( \\( )? [^()]+ (?(1) \\) ) /x\n    abcd\n    (abcd)\n    the quick (abcd) fox\n    (abcd   \n\n/^(?(2)a|(1)(2))+$/\n    12\n    12a\n    12aa\n    *** Failers\n    1234    \n\n/((?i)blah)\\s+\\1/\n    blah blah\n    BLAH BLAH\n    Blah Blah\n    blaH blaH\n    *** Failers\n    blah BLAH\n    Blah blah      \n    blaH blah \n\n/((?i)blah)\\s+(?i:\\1)/\n    blah blah\n    BLAH BLAH\n    Blah Blah\n    blaH blaH\n    blah BLAH\n    Blah blah      \n    blaH blah \n\n/(?>a*)*/\n    a\n    aa\n    aaaa\n    \n/(abc|)+/\n    abc\n    abcabc\n    abcabcabc\n    xyz      \n\n/([a]*)*/\n    a\n    aaaaa \n \n/([ab]*)*/\n    a\n    b\n    ababab\n    aaaabcde\n    bbbb    \n \n/([^a]*)*/\n    b\n    bbbb\n    aaa   \n \n/([^ab]*)*/\n    cccc\n    abab  \n \n/([a]*?)*/\n    a\n    aaaa \n \n/([ab]*?)*/\n    a\n    b\n    abab\n    baba   \n \n/([^a]*?)*/\n    b\n    bbbb\n    aaa   \n \n/([^ab]*?)*/\n    c\n    cccc\n    baba   \n \n/(?>a*)*/\n    a\n    aaabcde \n \n/((?>a*))*/\n    aaaaa\n    aabbaa \n \n/((?>a*?))*/\n    aaaaa\n    aabbaa \n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /x\n    12-sep-98\n    12-09-98\n    *** Failers\n    sep-12-98\n        \n/(?<=(foo))bar\\1/\n    foobarfoo\n    foobarfootling \n    *** Failers\n    foobar\n    barfoo   \n\n/(?i:saturday|sunday)/\n    saturday\n    sunday\n    Saturday\n    Sunday\n    SATURDAY\n    SUNDAY\n    SunDay\n    \n/(a(?i)bc|BB)x/\n    abcx\n    aBCx\n    bbx\n    BBx\n    *** Failers\n    abcX\n    aBCX\n    bbX\n    BBX               \n\n/^([ab](?i)[cd]|[ef])/\n    ac\n    aC\n    bD\n    elephant\n    Europe \n    frog\n    France\n    *** Failers\n    Africa     \n\n/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/\n    ab\n    aBd\n    xy\n    xY\n    zebra\n    Zambesi\n    *** Failers\n    aCD  \n    XY  \n\n/(?<=foo\\n)^bar/m\n    foo\\nbar\n    *** Failers\n    bar\n    baz\\nbar   \n\n/(?<=(?<!foo)bar)baz/\n    barbaz\n    barbarbaz \n    koobarbaz \n    *** Failers\n    baz\n    foobarbaz \n\n/The cases of aaaa and aaaaaa are missed out below because Perl does things/\n/differently. We know that odd, and maybe incorrect, things happen with/\n/recursive references in Perl, as far as 5.11.3 - see some stuff in test #2./\n\n/^(a\\1?){4}$/\n    a\n    aa\n    aaa\n    aaaaa\n    aaaaaaa\n    aaaaaaaa\n    aaaaaaaaa\n    aaaaaaaaaa\n    aaaaaaaaaaa\n    aaaaaaaaaaaa\n    aaaaaaaaaaaaa\n    aaaaaaaaaaaaaa\n    aaaaaaaaaaaaaaa\n    aaaaaaaaaaaaaaaa               \n\n/^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/\n    a\n    aa\n    aaa\n    aaaa\n    aaaaa\n    aaaaaa\n    aaaaaaa\n    aaaaaaaa\n    aaaaaaaaa\n    aaaaaaaaaa\n    aaaaaaaaaaa\n    aaaaaaaaaaaa\n    aaaaaaaaaaaaa\n    aaaaaaaaaaaaaa\n    aaaaaaaaaaaaaaa\n    aaaaaaaaaaaaaaaa               \n\n/The following tests are taken from the Perl 5.005 test suite; some of them/\n/are compatible with 5.004, but I'd rather not have to sort them out./\n\n/abc/\n    abc\n    xabcy\n    ababc\n    *** Failers\n    xbc\n    axc\n    abx\n\n/ab*c/\n    abc\n\n/ab*bc/\n    abc\n    abbc\n    abbbbc\n\n/.{1}/\n    abbbbc\n\n/.{3,4}/\n    abbbbc\n\n/ab{0,}bc/\n    abbbbc\n\n/ab+bc/\n    abbc\n    *** Failers\n    abc\n    abq\n\n/ab{1,}bc/\n\n/ab+bc/\n    abbbbc\n\n/ab{1,}bc/\n    abbbbc\n\n/ab{1,3}bc/\n    abbbbc\n\n/ab{3,4}bc/\n    abbbbc\n\n/ab{4,5}bc/\n    *** Failers\n    abq\n    abbbbc\n\n/ab?bc/\n    abbc\n    abc\n\n/ab{0,1}bc/\n    abc\n\n/ab?bc/\n\n/ab?c/\n    abc\n\n/ab{0,1}c/\n    abc\n\n/^abc$/\n    abc\n    *** Failers\n    abbbbc\n    abcc\n\n/^abc/\n    abcc\n\n/^abc$/\n\n/abc$/\n    aabc\n    *** Failers\n    aabc\n    aabcd\n\n/^/\n    abc\n\n/$/\n    abc\n\n/a.c/\n    abc\n    axc\n\n/a.*c/\n    axyzc\n\n/a[bc]d/\n    abd\n    *** Failers\n    axyzd\n    abc\n\n/a[b-d]e/\n    ace\n\n/a[b-d]/\n    aac\n\n/a[-b]/\n    a-\n\n/a[b-]/\n    a-\n\n/a]/\n    a]\n\n/a[]]b/\n    a]b\n\n/a[^bc]d/\n    aed\n    *** Failers\n    abd\n    abd\n\n/a[^-b]c/\n    adc\n\n/a[^]b]c/\n    adc\n    *** Failers\n    a-c\n    a]c\n\n/\\ba\\b/\n    a-\n    -a\n    -a-\n\n/\\by\\b/\n    *** Failers\n    xy\n    yz\n    xyz\n\n/\\Ba\\B/\n    *** Failers\n    a-\n    -a\n    -a-\n\n/\\By\\b/\n    xy\n\n/\\by\\B/\n    yz\n\n/\\By\\B/\n    xyz\n\n/\\w/\n    a\n\n/\\W/\n    -\n    *** Failers\n    -\n    a\n\n/a\\sb/\n    a b\n\n/a\\Sb/\n    a-b\n    *** Failers\n    a-b\n    a b\n\n/\\d/\n    1\n\n/\\D/\n    -\n    *** Failers\n    -\n    1\n\n/[\\w]/\n    a\n\n/[\\W]/\n    -\n    *** Failers\n    -\n    a\n\n/a[\\s]b/\n    a b\n\n/a[\\S]b/\n    a-b\n    *** Failers\n    a-b\n    a b\n\n/[\\d]/\n    1\n\n/[\\D]/\n    -\n    *** Failers\n    -\n    1\n\n/ab|cd/\n    abc\n    abcd\n\n/()ef/\n    def\n\n/$b/\n\n/a\\(b/\n    a(b\n\n/a\\(*b/\n    ab\n    a((b\n\n/a\\\\b/\n    a\\b\n\n/((a))/\n    abc\n\n/(a)b(c)/\n    abc\n\n/a+b+c/\n    aabbabc\n\n/a{1,}b{1,}c/\n    aabbabc\n\n/a.+?c/\n    abcabc\n\n/(a+|b)*/\n    ab\n\n/(a+|b){0,}/\n    ab\n\n/(a+|b)+/\n    ab\n\n/(a+|b){1,}/\n    ab\n\n/(a+|b)?/\n    ab\n\n/(a+|b){0,1}/\n    ab\n\n/[^ab]*/\n    cde\n\n/abc/\n    *** Failers\n    b\n    \n\n/a*/\n    \n\n/([abc])*d/\n    abbbcd\n\n/([abc])*bcd/\n    abcd\n\n/a|b|c|d|e/\n    e\n\n/(a|b|c|d|e)f/\n    ef\n\n/abcd*efg/\n    abcdefg\n\n/ab*/\n    xabyabbbz\n    xayabbbz\n\n/(ab|cd)e/\n    abcde\n\n/[abhgefdc]ij/\n    hij\n\n/^(ab|cd)e/\n\n/(abc|)ef/\n    abcdef\n\n/(a|b)c*d/\n    abcd\n\n/(ab|ab*)bc/\n    abc\n\n/a([bc]*)c*/\n    abc\n\n/a([bc]*)(c*d)/\n    abcd\n\n/a([bc]+)(c*d)/\n    abcd\n\n/a([bc]*)(c+d)/\n    abcd\n\n/a[bcd]*dcdcde/\n    adcdcde\n\n/a[bcd]+dcdcde/\n    *** Failers\n    abcde\n    adcdcde\n\n/(ab|a)b*c/\n    abc\n\n/((a)(b)c)(d)/\n    abcd\n\n/[a-zA-Z_][a-zA-Z0-9_]*/\n    alpha\n\n/^a(bc+|b[eh])g|.h$/\n    abh\n\n/(bc+d$|ef*g.|h?i(j|k))/\n    effgz\n    ij\n    reffgz\n    *** Failers\n    effg\n    bcdd\n\n/((((((((((a))))))))))/\n    a\n\n/((((((((((a))))))))))\\10/\n    aa\n\n/(((((((((a)))))))))/\n    a\n\n/multiple words of text/\n    *** Failers\n    aa\n    uh-uh\n\n/multiple words/\n    multiple words, yeah\n\n/(.*)c(.*)/\n    abcde\n\n/\\((.*), (.*)\\)/\n    (a, b)\n\n/[k]/\n\n/abcd/\n    abcd\n\n/a(bc)d/\n    abcd\n\n/a[-]?c/\n    ac\n\n/(abc)\\1/\n    abcabc\n\n/([a-c]*)\\1/\n    abcabc\n\n/(a)|\\1/\n    a\n    *** Failers\n    ab\n    x\n\n/(([a-c])b*?\\2)*/\n    ababbbcbc\n\n/(([a-c])b*?\\2){3}/\n    ababbbcbc\n\n/((\\3|b)\\2(a)x)+/\n    aaaxabaxbaaxbbax\n\n/((\\3|b)\\2(a)){2,}/\n    bbaababbabaaaaabbaaaabba\n\n/abc/i\n    ABC\n    XABCY\n    ABABC\n    *** Failers\n    aaxabxbaxbbx\n    XBC\n    AXC\n    ABX\n\n/ab*c/i\n    ABC\n\n/ab*bc/i\n    ABC\n    ABBC\n\n/ab*?bc/i\n    ABBBBC\n\n/ab{0,}?bc/i\n    ABBBBC\n\n/ab+?bc/i\n    ABBC\n\n/ab+bc/i\n    *** Failers\n    ABC\n    ABQ\n\n/ab{1,}bc/i\n\n/ab+bc/i\n    ABBBBC\n\n/ab{1,}?bc/i\n    ABBBBC\n\n/ab{1,3}?bc/i\n    ABBBBC\n\n/ab{3,4}?bc/i\n    ABBBBC\n\n/ab{4,5}?bc/i\n    *** Failers\n    ABQ\n    ABBBBC\n\n/ab??bc/i\n    ABBC\n    ABC\n\n/ab{0,1}?bc/i\n    ABC\n\n/ab??bc/i\n\n/ab??c/i\n    ABC\n\n/ab{0,1}?c/i\n    ABC\n\n/^abc$/i\n    ABC\n    *** Failers\n    ABBBBC\n    ABCC\n\n/^abc/i\n    ABCC\n\n/^abc$/i\n\n/abc$/i\n    AABC\n\n/^/i\n    ABC\n\n/$/i\n    ABC\n\n/a.c/i\n    ABC\n    AXC\n\n/a.*?c/i\n    AXYZC\n\n/a.*c/i\n    *** Failers\n    AABC\n    AXYZD\n\n/a[bc]d/i\n    ABD\n\n/a[b-d]e/i\n    ACE\n    *** Failers\n    ABC\n    ABD\n\n/a[b-d]/i\n    AAC\n\n/a[-b]/i\n    A-\n\n/a[b-]/i\n    A-\n\n/a]/i\n    A]\n\n/a[]]b/i\n    A]B\n\n/a[^bc]d/i\n    AED\n\n/a[^-b]c/i\n    ADC\n    *** Failers\n    ABD\n    A-C\n\n/a[^]b]c/i\n    ADC\n\n/ab|cd/i\n    ABC\n    ABCD\n\n/()ef/i\n    DEF\n\n/$b/i\n    *** Failers\n    A]C\n    B\n\n/a\\(b/i\n    A(B\n\n/a\\(*b/i\n    AB\n    A((B\n\n/a\\\\b/i\n    A\\B\n\n/((a))/i\n    ABC\n\n/(a)b(c)/i\n    ABC\n\n/a+b+c/i\n    AABBABC\n\n/a{1,}b{1,}c/i\n    AABBABC\n\n/a.+?c/i\n    ABCABC\n\n/a.*?c/i\n    ABCABC\n\n/a.{0,5}?c/i\n    ABCABC\n\n/(a+|b)*/i\n    AB\n\n/(a+|b){0,}/i\n    AB\n\n/(a+|b)+/i\n    AB\n\n/(a+|b){1,}/i\n    AB\n\n/(a+|b)?/i\n    AB\n\n/(a+|b){0,1}/i\n    AB\n\n/(a+|b){0,1}?/i\n    AB\n\n/[^ab]*/i\n    CDE\n\n/abc/i\n\n/a*/i\n    \n\n/([abc])*d/i\n    ABBBCD\n\n/([abc])*bcd/i\n    ABCD\n\n/a|b|c|d|e/i\n    E\n\n/(a|b|c|d|e)f/i\n    EF\n\n/abcd*efg/i\n    ABCDEFG\n\n/ab*/i\n    XABYABBBZ\n    XAYABBBZ\n\n/(ab|cd)e/i\n    ABCDE\n\n/[abhgefdc]ij/i\n    HIJ\n\n/^(ab|cd)e/i\n    ABCDE\n\n/(abc|)ef/i\n    ABCDEF\n\n/(a|b)c*d/i\n    ABCD\n\n/(ab|ab*)bc/i\n    ABC\n\n/a([bc]*)c*/i\n    ABC\n\n/a([bc]*)(c*d)/i\n    ABCD\n\n/a([bc]+)(c*d)/i\n    ABCD\n\n/a([bc]*)(c+d)/i\n    ABCD\n\n/a[bcd]*dcdcde/i\n    ADCDCDE\n\n/a[bcd]+dcdcde/i\n\n/(ab|a)b*c/i\n    ABC\n\n/((a)(b)c)(d)/i\n    ABCD\n\n/[a-zA-Z_][a-zA-Z0-9_]*/i\n    ALPHA\n\n/^a(bc+|b[eh])g|.h$/i\n    ABH\n\n/(bc+d$|ef*g.|h?i(j|k))/i\n    EFFGZ\n    IJ\n    REFFGZ\n    *** Failers\n    ADCDCDE\n    EFFG\n    BCDD\n\n/((((((((((a))))))))))/i\n    A\n\n/((((((((((a))))))))))\\10/i\n    AA\n\n/(((((((((a)))))))))/i\n    A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i\n    A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i\n    C\n\n/multiple words of text/i\n    *** Failers\n    AA\n    UH-UH\n\n/multiple words/i\n    MULTIPLE WORDS, YEAH\n\n/(.*)c(.*)/i\n    ABCDE\n\n/\\((.*), (.*)\\)/i\n    (A, B)\n\n/[k]/i\n\n/abcd/i\n    ABCD\n\n/a(bc)d/i\n    ABCD\n\n/a[-]?c/i\n    AC\n\n/(abc)\\1/i\n    ABCABC\n\n/([a-c]*)\\1/i\n    ABCABC\n\n/a(?!b)./\n    abad\n\n/a(?=d)./\n    abad\n\n/a(?=c|d)./\n    abad\n\n/a(?:b|c|d)(.)/\n    ace\n\n/a(?:b|c|d)*(.)/\n    ace\n\n/a(?:b|c|d)+?(.)/\n    ace\n    acdbcdbe\n\n/a(?:b|c|d)+(.)/\n    acdbcdbe\n\n/a(?:b|c|d){2}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){4,5}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){4,5}?(.)/\n    acdbcdbe\n\n/((foo)|(bar))*/\n    foobar\n\n/a(?:b|c|d){6,7}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){6,7}?(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,6}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,6}?(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,7}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,7}?(.)/\n    acdbcdbe\n\n/a(?:b|(c|e){1,2}?|d)+?(.)/\n    ace\n\n/^(.+)?B/\n    AB\n\n/^([^a-z])|(\\^)$/\n    .\n\n/^[<>]&/\n    <&OUT\n\n/^(a\\1?){4}$/\n    aaaaaaaaaa\n    *** Failers\n    AB\n    aaaaaaaaa\n    aaaaaaaaaaa\n\n/^(a(?(1)\\1)){4}$/\n    aaaaaaaaaa\n    *** Failers\n    aaaaaaaaa\n    aaaaaaaaaaa\n\n/(?:(f)(o)(o)|(b)(a)(r))*/\n    foobar\n\n/(?<=a)b/\n    ab\n    *** Failers\n    cb\n    b\n\n/(?<!c)b/\n    ab\n    b\n    b\n\n/(?:..)*a/\n    aba\n\n/(?:..)*?a/\n    aba\n\n/^(?:b|a(?=(.)))*\\1/\n    abc\n\n/^(){3,5}/\n    abc\n\n/^(a+)*ax/\n    aax\n\n/^((a|b)+)*ax/\n    aax\n\n/^((a|bc)+)*ax/\n    aax\n\n/(a|x)*ab/\n    cab\n\n/(a)*ab/\n    cab\n\n/(?:(?i)a)b/\n    ab\n\n/((?i)a)b/\n    ab\n\n/(?:(?i)a)b/\n    Ab\n\n/((?i)a)b/\n    Ab\n\n/(?:(?i)a)b/\n    *** Failers\n    cb\n    aB\n\n/((?i)a)b/\n\n/(?i:a)b/\n    ab\n\n/((?i:a))b/\n    ab\n\n/(?i:a)b/\n    Ab\n\n/((?i:a))b/\n    Ab\n\n/(?i:a)b/\n    *** Failers\n    aB\n    aB\n\n/((?i:a))b/\n\n/(?:(?-i)a)b/i\n    ab\n\n/((?-i)a)b/i\n    ab\n\n/(?:(?-i)a)b/i\n    aB\n\n/((?-i)a)b/i\n    aB\n\n/(?:(?-i)a)b/i\n    *** Failers\n    aB\n    Ab\n\n/((?-i)a)b/i\n\n/(?:(?-i)a)b/i\n    aB\n\n/((?-i)a)b/i\n    aB\n\n/(?:(?-i)a)b/i\n    *** Failers\n    Ab\n    AB\n\n/((?-i)a)b/i\n\n/(?-i:a)b/i\n    ab\n\n/((?-i:a))b/i\n    ab\n\n/(?-i:a)b/i\n    aB\n\n/((?-i:a))b/i\n    aB\n\n/(?-i:a)b/i\n    *** Failers\n    AB\n    Ab\n\n/((?-i:a))b/i\n\n/(?-i:a)b/i\n    aB\n\n/((?-i:a))b/i\n    aB\n\n/(?-i:a)b/i\n    *** Failers\n    Ab\n    AB\n\n/((?-i:a))b/i\n\n/((?-i:a.))b/i\n    *** Failers\n    AB\n    a\\nB\n\n/((?s-i:a.))b/i\n    a\\nB\n\n/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/\n    cabbbb\n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/\n    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n\n/(ab)\\d\\1/i\n    Ab4ab\n    ab4Ab\n\n/foo\\w*\\d{4}baz/\n    foobar1234baz\n\n/x(~~)*(?:(?:F)?)?/\n    x~~\n\n/^a(?#xxx){3}c/\n    aaac\n\n/^a (?#xxx) (?#yyy) {3}c/x\n    aaac\n\n/(?<![cd])b/\n    *** Failers\n    B\\nB\n    dbcb\n\n/(?<![cd])[ab]/\n    dbaacb\n\n/(?<!(c|d))b/\n\n/(?<!(c|d))[ab]/\n    dbaacb\n\n/(?<!cd)[ab]/\n    cdaccb\n\n/^(?:a?b?)*$/\n    \\\n    a\n    ab\n    aaa   \n    *** Failers\n    dbcb\n    a--\n    aa-- \n\n/((?s)^a(.))((?m)^b$)/\n    a\\nb\\nc\\n\n\n/((?m)^b$)/\n    a\\nb\\nc\\n\n\n/(?m)^b/\n    a\\nb\\n\n\n/(?m)^(b)/\n    a\\nb\\n\n\n/((?m)^b)/\n    a\\nb\\n\n\n/\\n((?m)^b)/\n    a\\nb\\n\n\n/((?s).)c(?!.)/\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/((?s)b.)c(?!.)/\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/^b/\n\n/()^b/\n    *** Failers\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/((?m)^b)/\n    a\\nb\\nc\\n\n\n/(x)?(?(1)a|b)/\n    *** Failers\n    a\n    a\n\n/(x)?(?(1)b|a)/\n    a\n\n/()?(?(1)b|a)/\n    a\n\n/()(?(1)b|a)/\n\n/()?(?(1)a|b)/\n    a\n\n/^(\\()?blah(?(1)(\\)))$/\n    (blah)\n    blah\n    *** Failers\n    a\n    blah)\n    (blah\n\n/^(\\(+)?blah(?(1)(\\)))$/\n    (blah)\n    blah\n    *** Failers\n    blah)\n    (blah\n\n/(?(?!a)a|b)/\n\n/(?(?!a)b|a)/\n    a\n\n/(?(?=a)b|a)/\n    *** Failers\n    a\n    a\n\n/(?(?=a)a|b)/\n    a\n\n/(?=(a+?))(\\1ab)/\n    aaab\n\n/^(?=(a+?))\\1ab/\n\n/(\\w+:)+/\n    one:\n\n/$(?<=^(a))/\n    a\n\n/(?=(a+?))(\\1ab)/\n    aaab\n\n/^(?=(a+?))\\1ab/\n    *** Failers\n    aaab\n    aaab\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n    xy:z:::abcd\n\n/^[^bcd]*(c+)/\n    aexycd\n\n/(a*)b+/\n    caab\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n    xy:z:::abcd\n    *** Failers\n    abcd:\n    abcd:\n\n/^[^bcd]*(c+)/\n    aexycd\n\n/(>a+)ab/\n\n/(?>a+)b/\n    aaab\n\n/([[:]+)/\n    a:[b]:\n\n/([[=]+)/\n    a=[b]=\n\n/([[.]+)/\n    a.[b].\n\n/((?>a+)b)/\n    aaab\n\n/(?>(a+))b/\n    aaab\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n\n/a\\Z/\n    *** Failers\n    aaab\n    a\\nb\\n\n\n/b\\Z/\n    a\\nb\\n\n\n/b\\z/\n\n/b\\Z/\n    a\\nb\n\n/b\\z/\n    a\\nb\n    *** Failers\n    \n/^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/\n    a\n    abc\n    a-b\n    0-9 \n    a.b\n    5.6.7  \n    the.quick.brown.fox\n    a100.b200.300c  \n    12-ab.1245 \n    *** Failers\n    \\\n    .a\n    -a\n    a-\n    a.  \n    a_b \n    a.-\n    a..  \n    ab..bc \n    the.quick.brown.fox-\n    the.quick.brown.fox.\n    the.quick.brown.fox_\n    the.quick.brown.fox+       \n\n/(?>.*)(?<=(abcd|wxyz))/\n    alphabetabcd\n    endingwxyz\n    *** Failers\n    a rather long string that doesn't end with one of them\n\n/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/\n    word cat dog elephant mussel cow horse canary baboon snake shark otherword\n    word cat dog elephant mussel cow horse canary baboon snake shark\n  \n/word (?>[a-zA-Z0-9]+ ){0,30}otherword/\n    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\n\n/(?<=\\d{3}(?!999))foo/\n    999foo\n    123999foo \n    *** Failers\n    123abcfoo\n    \n/(?<=(?!...999)\\d{3})foo/\n    999foo\n    123999foo \n    *** Failers\n    123abcfoo\n\n/(?<=\\d{3}(?!999)...)foo/\n    123abcfoo\n    123456foo \n    *** Failers\n    123999foo  \n    \n/(?<=\\d{3}...)(?<!999)foo/\n    123abcfoo   \n    123456foo \n    *** Failers\n    123999foo  \n\n/<a[\\s]+href[\\s]*=[\\s]*          # find <a href=\n ([\\\"\\'])?                       # find single or double quote\n (?(1) (.*?)\\1 | ([^\\s]+))       # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n    <a href=\\\"abcd xyz pqr\\\" cats\n    <a href=\\'abcd xyz pqr\\' cats\n\n/<a\\s+href\\s*=\\s*                # find <a href=\n ([\"'])?                         # find single or double quote\n (?(1) (.*?)\\1 | (\\S+))          # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n    <a href=\\\"abcd xyz pqr\\\" cats\n    <a href       =       \\'abcd xyz pqr\\' cats\n\n/<a\\s+href(?>\\s*)=(?>\\s*)        # find <a href=\n ([\"'])?                         # find single or double quote\n (?(1) (.*?)\\1 | (\\S+))          # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n    <a href=\\\"abcd xyz pqr\\\" cats\n    <a href       =       \\'abcd xyz pqr\\' cats\n\n/((Z)+|A)*/\n    ZABCDEFG\n\n/(Z()|A)*/\n    ZABCDEFG\n\n/(Z(())|A)*/\n    ZABCDEFG\n\n/((?>Z)+|A)*/\n    ZABCDEFG\n\n/((?>)+|A)*/\n    ZABCDEFG\n\n/a*/g\n    abbab\n\n/^[\\d-a]/\n    abcde\n    -things\n    0digit\n    *** Failers\n    bcdef    \n    \n/[[:space:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/[[:blank:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/[\\s]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/\\s+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/a\u000bb/x\n    ab\n\n/(?!\\A)x/m\n  a\\nxb\\n\n\n/(?!^)x/m\n  a\\nxb\\n\n\n/abc\\Qabc\\Eabc/\n    abcabcabc\n    \n/abc\\Q(*+|\\Eabc/\n    abc(*+|abc \n\n/   abc\\Q abc\\Eabc/x\n    abc abcabc\n    *** Failers\n    abcabcabc  \n    \n/abc#comment\n    \\Q#not comment\n    literal\\E/x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal/x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment\n    /x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment/x\n    abc#not comment\\n    literal     \n\n/\\Qabc\\$xyz\\E/\n    abc\\\\\\$xyz\n\n/\\Qabc\\E\\$\\Qxyz\\E/\n    abc\\$xyz\n\n/\\Gabc/\n    abc\n    *** Failers\n    xyzabc  \n\n/\\Gabc./g\n    abc1abc2xyzabc3\n\n/abc./g\n    abc1abc2xyzabc3 \n\n/a(?x: b c )d/\n    XabcdY\n    *** Failers \n    Xa b c d Y \n\n/((?x)x y z | a b c)/\n    XabcY\n    AxyzB \n\n/(?i)AB(?-i)C/\n    XabCY\n    *** Failers\n    XabcY  \n\n/((?i)AB(?-i)C|D)E/\n    abCE\n    DE\n    *** Failers\n    abcE\n    abCe  \n    dE\n    De    \n\n/(.*)\\d+\\1/\n    abc123abc\n    abc123bc \n\n/(.*)\\d+\\1/s\n    abc123abc\n    abc123bc \n    \n/((.*))\\d+\\1/\n    abc123abc\n    abc123bc  \n\n/-- This tests for an IPv6 address in the form where it can have up to\n    eight components, one and only one of which is empty. This must be\n    an internal component. --/\n\n/^(?!:)                       # colon disallowed at start\n  (?:                         # start of item\n    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or\n    (?(1)0 | () ) )           # if null previously matched, fail; else null\n    :                         # followed by colon\n  ){1,7}                      # end item; 1-7 of them required               \n  [0-9a-f]{1,4} $             # final hex number at end of string\n  (?(1)|.)                    # check that there was an empty component\n  /xi\n    a123::a123\n    a123:b342::abcd\n    a123:b342::324e:abcd\n    a123:ddde:b342::324e:abcd\n    a123:ddde:b342::324e:dcba:abcd\n    a123:ddde:9999:b342::324e:dcba:abcd\n    *** Failers\n    1:2:3:4:5:6:7:8\n    a123:bce:ddde:9999:b342::324e:dcba:abcd\n    a123::9999:b342::324e:dcba:abcd\n    abcde:2:3:4:5:6:7:8\n    ::1\n    abcd:fee0:123::   \n    :1\n    1:  \n\n/[z\\Qa-d]\\E]/\n    z\n    a\n    -\n    d\n    ] \n    *** Failers\n    b     \n\n/[\\z\\C]/\n    z\n    C \n    \n/\\M/\n    M \n    \n/(a+)*b/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \n    \n/(?i)reg(?:ul(?:[a]|ae)r|ex)/\n    REGular\n    regulaer\n    Regex  \n    regulr \n\n/[--]+/\n    \n    \n    \n    \n\n/(?<=Z)X./\n  \\x84XAZXB\n\n/ab cd (?x) de fg/\n    ab cd defg\n\n/ab cd(?x) de fg/\n    ab cddefg\n    ** Failers \n    abcddefg\n\n/(?<![^f]oo)(bar)/\n    foobarX \n    ** Failers \n    boobarX\n\n/(?<![^f])X/\n    offX\n    ** Failers\n    onyX  \n\n/(?<=[^f])X/\n    onyX\n    ** Failers\n    offX \n\n/^/mg\n    a\\nb\\nc\\n\n    \\ \n    \n/(?<=C\\n)^/mg\n    A\\nC\\nC\\n \n\n/(?:(?(1)a|b)(X))+/\n    bXaX\n\n/(?:(?(1)\\1a|b)(X|Y))+/\n    bXXaYYaY\n    bXYaXXaX  \n\n/()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+/\n    bXXaYYaY\n\n/[[,abc,]+]/\n    abc]\n    a,b]\n    [a,b,c]  \n\n/(?-x: )/x\n    A\\x20B\n    \n\"(?x)(?-x: \\s*#\\s*)\"\n    A # B\n    ** Failers\n    #  \n\n\"(?x-is)(?:(?-ixs) \\s*#\\s*) include\"\n    A #include\n    ** Failers\n    A#include  \n    A #Include\n\n/a*b*\\w/\n    aaabbbb\n    aaaa\n    a\n\n/a*b?\\w/\n    aaabbbb\n    aaaa\n    a\n\n/a*b{0,4}\\w/\n    aaabbbb\n    aaaa\n    a\n\n/a*b{0,}\\w/\n    aaabbbb\n    aaaa\n    a\n    \n/a*\\d*\\w/\n    0a\n    a \n    \n/a*b *\\w/x\n    a \n\n/a*b#comment\n  *\\w/x\n    a \n\n/a* b *\\w/x\n    a \n\n/^\\w+=.*(\\\\\\n.*)*/\n    abc=xyz\\\\\\npqr\n\n/(?=(\\w+))\\1:/\n    abcd:\n\n/^(?=(\\w+))\\1:/\n    abcd:\n\n/^\\Eabc/\n    abc\n    \n/^[\\Eabc]/\n    a\n    ** Failers \n    E \n    \n/^[a-\\Ec]/\n    b\n    ** Failers\n    -\n    E    \n\n/^[a\\E\\E-\\Ec]/\n    b\n    ** Failers\n    -\n    E    \n\n/^[\\E\\Qa\\E-\\Qz\\E]+/\n    b\n    ** Failers\n    -  \n    \n/^[a\\Q]bc\\E]/\n    a\n    ]\n    c\n    \n/^[a-\\Q\\E]/\n    a\n    -     \n\n/^(a()*)*/\n    aaaa\n\n/^(?:a(?:(?:))*)*/\n    aaaa\n\n/^(a()+)+/\n    aaaa\n\n/^(?:a(?:(?:))+)+/\n    aaaa\n\n/(a){0,3}(?(1)b|(c|))*D/\n    abbD\n    ccccD\n    D  \n\n/(a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?>a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?:a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/\\Z/g\n  abc\\n\n  \n/^(?s)(?>.*)(?<!\\n)/\n  abc\n  abc\\n  \n\n/^(?![^\\n]*\\n\\z)/\n  abc\n  abc\\n \n  \n/\\z(?<!\\n)/\n  abc\n  abc\\n  \n\n/(.*(.)?)*/\n    abcd\n\n/( (A | (?(1)0|) )*   )/x\n    abcd\n\n/( ( (?(1)0|) )*   )/x\n    abcd\n\n/(  (?(1)0|)*   )/x\n    abcd\n\n/[[:abcd:xyz]]/\n    a]\n    :] \n    \n/[abc[:x\\]pqr]/\n    a\n    [\n    :\n    ]\n    p    \n\n/.*[op][xyz]/\n    fooabcfoo\n\n/(?(?=.*b)b|^)/\n   adc\n   abc \n\n/(?(?=^.*b)b|^)/\n   adc\n   abc \n\n/(?(?=.*b)b|^)*/\n   adc\n   abc \n\n/(?(?=.*b)b|^)+/\n   adc\n   abc \n\n/(?(?=b).*b|^d)/\n    abc\n\n/(?(?=.*b).*b|^d)/\n    abc\n\n/^%((?(?=[a])[^%])|b)*%$/\n    %ab%\n\n/(?i)a(?-i)b|c/\n    XabX\n    XAbX\n    CcC \n    ** Failers\n    XABX   \n\n/[\\x00-\\xff\\s]+/\n    \\x0a\\x0b\\x0c\\x0d\n\n/^\\c/\n    ?\n\n/(abc)\\1/i\n   abc\n\n/(abc)\\1/\n   abc\n\n/[^a]*/i\n    12abc\n    12ABC\n\n/[^a]*+/i\n    12abc\n    12ABC\n\n/[^a]*?X/i\n    ** Failers\n    12abc\n    12ABC\n    \n/[^a]+?X/i   \n    ** Failers\n    12abc\n    12ABC\n\n/[^a]?X/i\n    12aXbcX\n    12AXBCX\n    BCX \n\n/[^a]??X/i\n    12aXbcX\n    12AXBCX\n    BCX\n    \n/[^a]?+X/i\n    12aXbcX\n    12AXBCX\n    BCX \n\n/[^a]{2,3}/i\n    abcdef\n    ABCDEF  \n\n/[^a]{2,3}?/i\n    abcdef\n    ABCDEF  \n\n/[^a]{2,3}+/i\n    abcdef\n    ABCDEF  \n\n/((a|)+)+Z/\n    Z\n\n/(a)b|(a)c/\n    ac\n\n/(?>(a))b|(a)c/\n    ac\n\n/(?=(a))ab|(a)c/\n    ac\n\n/((?>(a))b|(a)c)/\n    ac\n\n/((?>(a))b|(a)c)++/\n    ac\n\n/(?:(?>(a))b|(a)c)++/\n    ac\n\n/(?=(?>(a))b|(a)c)(..)/\n    ac\n\n/(?>(?>(a))b|(a)c)/\n    ac\n\n/(?:(?>([ab])))+a=/+\n    =ba=\n\n/(?>([ab]))+a=/+\n    =ba=\n\n/((?>(a+)b)+(aabab))/\n    aaaabaaabaabab\n\n/(?>a+|ab)+?c/\n    aabc\n\n/(?>a+|ab)+c/\n    aabc\n\n/(?:a+|ab)+c/\n    aabc\n\n/(?(?=(a))a)/\n    a\n\n/(?(?=(a))a)(b)/\n    ab\n\n/^(?:a|ab)++c/\n    aaaabc\n\n/^(?>a|ab)++c/\n    aaaabc\n\n/^(?:a|ab)+c/\n    aaaabc\n\n/(?=abc){3}abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc)+abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc)++abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc){0}xyz/\n    xyz \n\n/(?=abc){1}xyz/\n    ** Failers\n    xyz \n    \n/(?=(a))?./\n    ab\n    bc\n      \n/(?=(a))??./\n    ab\n    bc\n\n/^(?=(?1))?[az]([abc])d/\n    abd \n    zcdxx \n\n/^(?!a){0}\\w+/\n    aaaaa\n\n/(?<=(abc))?xyz/\n    abcxyz\n    pqrxyz \n\n/^[\\g<a>]+/\n    ggg<<<aaa>>>\n    ** Failers\n    \\\\ga  \n    \n/^[\\ga]+/\n    gggagagaxyz \n    \n/^[:a[:digit:]]+/\n    aaaa444:::Z \n\n/^[:a[:digit:]:b]+/\n    aaaa444:::bbbZ \n\n/[:a]xxx[b:]/\n     :xxx:\n     \n/(?<=a{2})b/i\n    xaabc\n    ** Failers\n    xabc  \n\n/(?<!a{2})b/i\n    xabc\n    ** Failers\n    xaabc  \n\n/(?<=a\\h)c/\n    xa c\n    \n/(?<=[^a]{2})b/\n    axxbc\n    aAAbc \n    ** Failers\n    xaabc    \n\n/(?<=[^a]{2})b/i\n    axxbc  \n    ** Failers\n    aAAbc \n    xaabc    \n\n/(?<=a\\H)c/\n    abc\n\n/(?<=a\\V)c/\n    abc\n    \n/(?<=a\\v)c/\n    a\\nc\n\n/(?(?=c)c|d)++Y/\n    XcccddYX\n\n/(?(?=c)c|d)*+Y/\n    XcccddYX\n\n/^(a{2,3}){2,}+a/\n    aaaaaaa\n    ** Failers\n    aaaaaa\n    aaaaaaaaa \n\n/^(a{2,3})++a/\n    ** Failers\n    aaaaaa\n\n/^(a{2,3})*+a/\n    ** Failers\n    aaaaaa\n\n/ab\\Cde/\n    abXde\n    \n/(?<=ab\\Cde)X/\n    abZdeX\n\n/a[\\CD]b/\n    aCb\n    aDb \n\n/a[\\C-X]b/\n    aJb\n\n/\\H\\h\\V\\v/\n    X X\\x0a\n    X\\x09X\\x0b\n    ** Failers\n    \\xa0 X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/ \n    \\x09\\x20\\xa0X\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x20\\xa0\\x0a\\x0b\n     \n/\\H{3,4}/\n    XY  ABCDE\n    XY  PQR ST \n    \n/.\\h{3,4}./\n    XY  AB    PQRS\n\n/\\h*X\\h?\\H+Y\\H?Z/\n    >XNNNYZ\n    >  X NYQZ\n    ** Failers\n    >XYZ   \n    >  X NY Z\n\n/\\v*X\\v?Y\\v+Z\\V*\\x0a\\V+\\x0b\\V{2,3}\\x0c/\n    >XY\\x0aZ\\x0aA\\x0bNN\\x0c\n    >\\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n\n/(foo)\\Kbar/\n    foobar\n   \n/(foo)(\\Kbar|baz)/\n    foobar\n    foobaz \n\n/(foo\\Kbar)baz/\n    foobarbaz\n\n/abc\\K|def\\K/g+\n    Xabcdefghi\n\n/ab\\Kc|de\\Kf/g+\n    Xabcdefghi\n    \n/(?=C)/g+\n    ABCDECBA\n    \n/^abc\\K/+\n    abcdef\n    ** Failers\n    defabcxyz   \n\n/^(a(b))\\1\\g1\\g{1}\\g-1\\g{-1}\\g{-02}Z/\n    ababababbbabZXXXX\n\n/(?<A>tom|bon)-\\g{A}/\n    tom-tom\n    bon-bon \n    \n/(^(a|b\\g{-1}))/\n    bacxxx\n\n/(?|(abc)|(xyz))\\1/\n    abcabc\n    xyzxyz \n    ** Failers\n    abcxyz\n    xyzabc   \n    \n/(?|(abc)|(xyz))(?1)/\n    abcabc\n    xyzabc \n    ** Failers \n    xyzxyz \n \n/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/\n    XYabcdY\n\n/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/\n    XYabcdY\n\n/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/\n    XYabcdY\n\n/(?'abc'\\w+):\\k<abc>{2}/\n    a:aaxyz\n    ab:ababxyz\n    ** Failers\n    a:axyz\n    ab:abxyz\n\n/(?'abc'\\w+):\\g{abc}{2}/\n    a:aaxyz\n    ab:ababxyz\n    ** Failers\n    a:axyz\n    ab:abxyz\n\n/^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x\n    abd\n    ce\n\n/^(a.)\\g-1Z/\n    aXaXZ\n\n/^(a.)\\g{-1}Z/\n    aXaXZ\n\n/^(?(DEFINE) (?<A> a) (?<B> b) )  (?&A) (?&B) /x\n    abcd\n\n/(?<NAME>(?&NAME_PAT))\\s+(?<ADDR>(?&ADDRESS_PAT))\n  (?(DEFINE)\n  (?<NAME_PAT>[a-z]+)\n  (?<ADDRESS_PAT>\\d+)\n  )/x\n    metcalfe 33\n\n/(?(DEFINE)(?<byte>2[0-4]\\d|25[0-5]|1\\d\\d|[1-9]?\\d))\\b(?&byte)(\\.(?&byte)){3}/\n    1.2.3.4\n    131.111.10.206\n    10.0.0.0\n    ** Failers\n    10.6\n    455.3.4.5\n\n/\\b(?&byte)(\\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\\d|25[0-5]|1\\d\\d|[1-9]?\\d))/\n    1.2.3.4\n    131.111.10.206\n    10.0.0.0\n    ** Failers\n    10.6\n    455.3.4.5\n\n/^(\\w++|\\s++)*$/\n    now is the time for all good men to come to the aid of the party\n    *** Failers\n    this is not a line with only words and spaces!\n\n/(\\d++)(\\w)/\n    12345a\n    *** Failers\n    12345+\n\n/a++b/\n    aaab\n\n/(a++b)/\n    aaab\n\n/(a++)b/\n    aaab\n\n/([^()]++|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n\n/\\(([^()]++|\\([^()]+\\))+\\)/\n    (abc)\n    (abc(def)xyz)\n    *** Failers\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/^([^()]|\\((?1)*\\))*$/\n    abc\n    a(b)c\n    a(b(c))d\n    *** Failers)\n    a(b(c)d\n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/\n   >abc>123<xyz<\n   >abc>1(2)3<xyz<\n   >abc>(1(2)3)<xyz<\n\n/^(?:((.)(?1)\\2|)|((.)(?3)\\4|.))$/i\n    1221\n    Satanoscillatemymetallicsonatas\n    AmanaplanacanalPanama\n    AblewasIereIsawElba\n    *** Failers\n    Thequickbrownfox\n\n/^(\\d+|\\((?1)([+*-])(?1)\\)|-(?1))$/\n    12\n    (((2+2)*-3)-7)\n    -12\n    *** Failers\n    ((2+2)*-3)-7)\n\n/^(x(y|(?1){2})z)/\n    xyz\n    xxyzxyzz\n    *** Failers\n    xxyzz\n    xxyzxyzxyzz\n\n/((< (?: (?(R) \\d++  | [^<>]*+) | (?2)) * >))/x\n    <>\n    <abcd>\n    <abc <123> hij>\n    <abc <def> hij>\n    <abc<>def>\n    <abc<>\n    *** Failers\n    <abc\n\n/^a+(*FAIL)/\n    aaaaaa\n    \n/a+b?c+(*FAIL)/\n    aaabccc\n\n/a+b?(*PRUNE)c+(*FAIL)/\n    aaabccc\n\n/a+b?(*COMMIT)c+(*FAIL)/\n    aaabccc\n    \n/a+b?(*SKIP)c+(*FAIL)/\n    aaabcccaaabccc\n\n/^(?:aaa(*THEN)\\w{6}|bbb(*THEN)\\w{5}|ccc(*THEN)\\w{4}|\\w{3})/\n    aaaxxxxxx\n    aaa++++++ \n    bbbxxxxx\n    bbb+++++ \n    cccxxxx\n    ccc++++ \n    dddddddd   \n\n/^(aaa(*THEN)\\w{6}|bbb(*THEN)\\w{5}|ccc(*THEN)\\w{4}|\\w{3})/\n    aaaxxxxxx\n    aaa++++++ \n    bbbxxxxx\n    bbb+++++ \n    cccxxxx\n    ccc++++ \n    dddddddd   \n\n/a+b?(*THEN)c+(*FAIL)/\n    aaabccc\n\n/(A (A|B(*ACCEPT)|C) D)(E)/x\n    AB\n    ABX\n    AADE\n    ACDE\n    ** Failers\n    AD \n        \n/^\\W*+(?:((.)\\W*+(?1)\\W*+\\2|)|((.)\\W*+(?3)\\W*+\\4|\\W*+.\\W*+))\\W*+$/i\n    1221\n    Satan, oscillate my metallic sonatas!\n    A man, a plan, a canal: Panama!\n    Able was I ere I saw Elba.\n    *** Failers\n    The quick brown fox\n\n/^((.)(?1)\\2|.)$/\n    a\n    aba\n    aabaa  \n    abcdcba \n    pqaabaaqp  \n    ablewasiereisawelba\n    rhubarb\n    the quick brown fox  \n\n/(a)(?<=b(?1))/\n    baz\n    ** Failers\n    caz  \n    \n/(?<=b(?1))(a)/\n    zbaaz\n    ** Failers\n    aaa  \n    \n/(?<X>a)(?<=b(?&X))/\n    baz\n\n/^(?|(abc)|(def))\\1/\n    abcabc\n    defdef \n    ** Failers\n    abcdef\n    defabc   \n    \n/^(?|(abc)|(def))(?1)/\n    abcabc\n    defabc\n    ** Failers\n    defdef\n    abcdef    \n\n/(?:a(?<quote> (?<apostrophe>')|(?<realquote>\")) |b(?<quote> (?<apostrophe>')|(?<realquote>\")) ) (?('quote')[a-z]+|[0-9]+)/xJ\n    a\\\"aaaaa\n    b\\\"aaaaa \n    ** Failers \n    b\\\"11111\n\n/(?:(?1)|B)(A(*F)|C)/\n    ABCD\n    CCD\n    ** Failers\n    CAD   \n\n/^(?:(?1)|B)(A(*F)|C)/\n    CCD\n    BCD \n    ** Failers\n    ABCD\n    CAD\n    BAD    \n\n/(?:(?1)|B)(A(*ACCEPT)XX|C)D/\n    AAD\n    ACD\n    BAD\n    BCD\n    BAX  \n    ** Failers\n    ACX\n    ABC   \n\n/(?(DEFINE)(A))B(?1)C/\n    BAC\n\n/(?(DEFINE)((A)\\2))B(?1)C/\n    BAAC\n\n/(?<pn> \\( ( [^()]++ | (?&pn) )* \\) )/x\n    (ab(cd)ef)\n\n/^(?=a(*SKIP)b|ac)/\n    ** Failers\n    ac\n    \n/^(?=a(*PRUNE)b)/\n    ab  \n    ** Failers \n    ac\n\n/^(?=a(*ACCEPT)b)/\n    ac\n\n/(?>a\\Kb)/\n    ab\n\n/((?>a\\Kb))/\n    ab\n\n/(a\\Kb)/\n    ab\n    \n/^a\\Kcz|ac/\n    ac\n    \n/(?>a\\Kbz|ab)/\n    ab \n\n/^(?&t)(?(DEFINE)(?<t>a\\Kb))$/\n    ab\n\n/^([^()]|\\((?1)*\\))*$/\n    a(b)c\n    a(b(c)d)e \n\n/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/\n    0\n    00\n    0000  \n\n/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/\n    0\n    00\n    0000  \n\n/--- This one does fail, as expected, in Perl. It needs the complex item at the\n     end of the pattern. A single letter instead of (B|D) makes it not fail,\n     which I think is a Perl bug. --- /\n\n/A(*COMMIT)(B|D)/\n    ACABX\n\n/--- Check the use of names for failure ---/\n\n/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K\n    ** Failers\n    AC\n    CB    \n    \n/--- Force no study, otherwise mark is not seen. The studied version is in\n     test 2 because it isn't Perl-compatible. ---/\n\n/(*MARK:A)(*SKIP:B)(C|X)/KSS\n    C\n    D\n     \n/^(A(*THEN:A)B|C(*THEN:B)D)/K\n    ** Failers\n    CB    \n\n/^(?:A(*THEN:A)B|C(*THEN:B)D)/K\n    CB    \n    \n/^(?>A(*THEN:A)B|C(*THEN:B)D)/K\n    CB    \n    \n/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note\nthat we have to have something complicated such as (B|Z) at the end because,\nfor Perl, a simple character somehow causes an unwanted optimization to mess\nwith the handling of backtracking verbs. ---/\n\n/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n    \n/--- Test skipping over a non-matching mark. ---/\n\n/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n    \n/--- Check shorthand for MARK ---/\n\n/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n\n/--- Don't loop! Force no study, otherwise mark is not seen. ---/\n\n/(*:A)A+(*SKIP:A)(B|Z)/KSS\n    AAAC\n\n/--- This should succeed, as a non-existent skip name disables the skip ---/ \n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK\n    AAAC\n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK\n    AAAC\n\n/--- COMMIT at the start of a pattern should act like an anchor. Again, \nhowever, we need the complication for Perl. ---/\n\n/(*COMMIT)(A|P)(B|P)(C|P)/\n    ABCDEFG\n    ** Failers\n    DEFGABC  \n\n/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/\n\n/(\\w+)(?>b(*COMMIT))\\w{2}/\n    abbb\n\n/(\\w+)b(*COMMIT)\\w{2}/\n    abbb\n\n/--- Check opening parens in comment when seeking forward reference. ---/ \n\n/(?&t)(?#()(?(DEFINE)(?<t>a))/\n    bac\n\n/--- COMMIT should override THEN ---/\n\n/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/\n  yes\n\n/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/\n  yes\n\n/b?(*SKIP)c/\n    bc\n    abc\n   \n/(*SKIP)bc/\n    a\n\n/(*SKIP)b/\n    a \n\n/(?P<abn>(?P=abn)xxx|)+/\n    xxx\n\n/(?i:([^b]))(?1)/\n    aa\n    aA     \n    ** Failers\n    ab\n    aB\n    Ba\n    ba\n\n/^(?&t)*+(?(DEFINE)(?<t>a))\\w$/\n    aaaaaaX\n    ** Failers \n    aaaaaa \n\n/^(?&t)*(?(DEFINE)(?<t>a))\\w$/\n    aaaaaaX\n    aaaaaa \n\n/^(a)*+(\\w)/\n    aaaaX\n    YZ \n    ** Failers \n    aaaa\n\n/^(?:a)*+(\\w)/\n    aaaaX\n    YZ \n    ** Failers \n    aaaa\n\n/^(a)++(\\w)/\n    aaaaX\n    ** Failers \n    aaaa\n    YZ \n\n/^(?:a)++(\\w)/\n    aaaaX\n    ** Failers \n    aaaa\n    YZ \n\n/^(a)?+(\\w)/\n    aaaaX\n    YZ \n\n/^(?:a)?+(\\w)/\n    aaaaX\n    YZ \n\n/^(a){2,}+(\\w)/\n    aaaaX\n    ** Failers\n    aaa\n    YZ \n\n/^(?:a){2,}+(\\w)/\n    aaaaX\n    ** Failers\n    aaa\n    YZ \n\n/(a|)*(?1)b/\n    b\n    ab\n    aab  \n\n/(a)++(?1)b/\n    ** Failers\n    ab \n    aab\n\n/(a)*+(?1)b/\n    ** Failers\n    ab\n    aab  \n\n/(?1)(?:(b)){0}/\n    b\n\n/(foo ( \\( ((?:(?> [^()]+ )|(?2))*) \\) ) )/x\n    foo(bar(baz)+baz(bop))\n\n/(A (A|B(*ACCEPT)|C) D)(E)/x\n    AB\n\n/\\A.*?(a|bc)/\n    ba\n\n/\\A.*?(?:a|bc)++/\n    ba\n\n/\\A.*?(a|bc)++/\n    ba\n\n/\\A.*?(?:a|bc|d)/\n    ba\n\n/(?:(b))++/\n    beetle\n\n/(?(?=(a(*ACCEPT)z))a)/\n    a\n\n/^(a)(?1)+ab/\n    aaaab\n    \n/^(a)(?1)++ab/\n    aaaab\n\n/^(?=a(*:M))aZ/K\n    aZbc\n\n/^(?!(*:M)b)aZ/K\n    aZbc\n\n/(?(DEFINE)(a))?b(?1)/\n    backgammon\n\n/^\\N+/\n    abc\\ndef\n    \n/^\\N{1,}/\n    abc\\ndef \n\n/(?(R)a+|(?R)b)/\n    aaaabcde\n\n/(?(R)a+|((?R))b)/\n    aaaabcde\n\n/((?(R)a+|(?1)b))/\n    aaaabcde\n\n/((?(R1)a+|(?1)b))/\n    aaaabcde\n    \n/((?(R)a|(?1)))*/\n    aaa\n\n/((?(R)a|(?1)))+/\n    aaa\n\n/a(*:any \nname)/K\n    abc\n    \n/(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/\n    a\n    ba\n    bba \n    \n/--- Checking revised (*THEN) handling ---/ \n\n/--- Capture ---/\n\n/^.*? (a(*THEN)b) c/x\n    aabc\n\n/^.*? (a(*THEN)b|(*F)) c/x\n    aabc\n\n/^.*? ( (a(*THEN)b) | (*F) ) c/x\n    aabc\n\n/^.*? ( (a(*THEN)b) ) c/x\n    aabc\n\n/--- Non-capture ---/\n\n/^.*? (?:a(*THEN)b) c/x\n    aabc\n\n/^.*? (?:a(*THEN)b|(*F)) c/x\n    aabc\n\n/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x\n    aabc\n\n/^.*? (?: (?:a(*THEN)b) ) c/x\n    aabc\n\n/--- Atomic ---/\n\n/^.*? (?>a(*THEN)b) c/x\n    aabc\n\n/^.*? (?>a(*THEN)b|(*F)) c/x\n    aabc\n\n/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x\n    aabc\n\n/^.*? (?> (?>a(*THEN)b) ) c/x\n    aabc\n\n/--- Possessive capture ---/\n\n/^.*? (a(*THEN)b)++ c/x\n    aabc\n\n/^.*? (a(*THEN)b|(*F))++ c/x\n    aabc\n\n/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x\n    aabc\n\n/^.*? ( (a(*THEN)b)++ )++ c/x\n    aabc\n\n/--- Possessive non-capture ---/\n\n/^.*? (?:a(*THEN)b)++ c/x\n    aabc\n\n/^.*? (?:a(*THEN)b|(*F))++ c/x\n    aabc\n\n/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x\n    aabc\n\n/^.*? (?: (?:a(*THEN)b)++ )++ c/x\n    aabc\n    \n/--- Condition assertion ---/\n\n/^(?(?=a(*THEN)b)ab|ac)/\n    ac\n \n/--- Condition ---/\n\n/^.*?(?(?=a)a|b(*THEN)c)/\n    ba\n\n/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/\n    ba\n\n/^.*?(?(?=a)a(*THEN)b|c)/\n    ac\n\n/--- Assertion ---/\n\n/^.*(?=a(*THEN)b)/ \n    aabc\n\n/------------------------------/\n\n/(?>a(*:m))/imsxSK \n    a\n\n/(?>(a)(*:m))/imsxSK \n    a\n\n/(?<=a(*ACCEPT)b)c/\n    xacd\n\n/(?<=(a(*ACCEPT)b))c/\n    xacd\n\n/(?<=(a(*COMMIT)b))c/\n    xabcd\n    ** Failers \n    xacd\n    \n/(?<!a(*FAIL)b)c/\n    xcd\n    acd \n\n/(?<=a(*:N)b)c/K\n    xabcd\n    \n/(?<=a(*PRUNE)b)c/\n    xabcd \n\n/(?<=a(*SKIP)b)c/\n    xabcd \n\n/(?<=a(*THEN)b)c/\n    xabcd \n\n/(a)(?2){2}(.)/\n    abcd\n\n/(*MARK:A)(*PRUNE:B)(C|X)/KS\n    C\n    D \n\n/(*MARK:A)(*PRUNE:B)(C|X)/KSS\n    C\n    D \n\n/(*MARK:A)(*THEN:B)(C|X)/KS\n    C\n    D \n\n/(*MARK:A)(*THEN:B)(C|X)/KSY\n    C\n    D \n\n/(*MARK:A)(*THEN:B)(C|X)/KSS\n    C\n    D \n\n/--- This should fail, as the skip causes a bump to offset 3 (the skip) ---/\n\n/A(*MARK:A)A+(*SKIP)(B|Z) | AC/xK\n    AAAC\n\n/--- Same --/\n\n/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/xK\n    AAAC\n\n/A(*:A)A+(*SKIP)(B|Z) | AC/xK\n    AAAC\n\n/--- This should fail, as a null name is the same as no name ---/\n\n/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/xK\n    AAAC\n\n/--- A check on what happens after hitting a mark and them bumping along to\nsomething that does not even start. Perl reports tags after the failures here, \nthough it does not when the individual letters are made into something \nmore complicated. ---/\n\n/A(*:A)B|XX(*:B)Y/K\n    AABC\n    XXYZ \n    ** Failers\n    XAQQ  \n    XAQQXZZ  \n    AXQQQ \n    AXXQQQ \n    \n/^(A(*THEN:A)B|C(*THEN:B)D)/K\n    AB\n    CD\n    ** Failers\n    AC\n    CB    \n    \n/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K\n    AB\n    CD\n    ** Failers\n    AC\n    CB    \n    \n/--- An empty name does not pass back an empty string. It is the same as if no\nname were given. ---/ \n\n/^(A(*PRUNE:)B|C(*PRUNE:B)D)/K\n    AB\n    CD \n\n/--- PRUNE goes to next bumpalong; COMMIT does not. ---/\n    \n/A(*PRUNE:A)B/K\n    ACAB\n\n/--- Mark names can be duplicated ---/\n\n/A(*:A)B|X(*:A)Y/K\n    AABC\n    XXYZ \n    \n/b(*:m)f|a(*:n)w/K\n    aw \n    ** Failers \n    abc\n\n/b(*:m)f|aw/K\n    abaw\n    ** Failers \n    abc\n    abax \n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/xK\n    AAAC\n\n/a(*PRUNE:X)bc|qq/KY\n    ** Failers\n    axy\n\n/a(*THEN:X)bc|qq/KY\n    ** Failers\n    axy\n\n/(?=a(*MARK:A)b)..x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(?=a(*MARK:A)b)..(*:Y)x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(?=a(*PRUNE:A)b)..x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(?=a(*PRUNE:A)b)..(*:Y)x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(?=a(*THEN:A)b)..x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(?=a(*THEN:A)b)..(*:Y)x/K\n    abxy\n    ** Failers\n    abpq  \n\n/(another)?(\\1?)test/\n    hello world test\n\n/(another)?(\\1+)test/\n    hello world test\n\n/(a(*COMMIT)b){0}a(?1)|aac/\n    aac\n\n/((?:a?)*)*c/\n  aac   \n\n/((?>a?)*)*c/\n  aac   \n\n/(?>.*?a)(?<=ba)/\n    aba\n\n/(?:.*?a)(?<=ba)/\n    aba\n\n/.*?a(*PRUNE)b/\n    aab\n\n/.*?a(*PRUNE)b/s\n    aab\n\n/^a(*PRUNE)b/s\n    aab\n\n/.*?a(*SKIP)b/\n    aab\n\n/(?>.*?a)b/s\n    aab\n\n/(?>.*?a)b/\n    aab\n\n/(?>^a)b/s\n    aab\n\n/(?>.*?)(?<=(abcd)|(wxyz))/\n    alphabetabcd\n    endingwxyz \n\n/(?>.*)(?<=(abcd)|(wxyz))/\n    alphabetabcd\n    endingwxyz \n\n\"(?>.*)foo\"\n    abcdfooxyz\n    \n\"(?>.*?)foo\"\n    abcdfooxyz\n\n/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/\n    ac\n    \n/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/\n    ac \n\n/(?<=(*SKIP)ac)a/\n    aa\n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK\n    AAAC\n\n/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K\n    acacd\n\n/A(*SKIP:m)x|A(*SKIP:n)x|AB/K\n    AB\n\n/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K\n    acacd\n\n/-- Tests that try to figure out how Perl works. My hypothesis is that the\n    first verb that is backtracked onto is the one that acts. This seems to be\n    the case almost all the time, but there is one exception that is perhaps a \n    bug. --/\n\n/-- This matches \"aaaac\"; each PRUNE advances one character until the subject\n    no longer starts with 5 'a's. --/\n\n/aaaaa(*PRUNE)b|a+c/\n    aaaaaac\n\n/-- Putting SKIP in front of PRUNE makes no difference, as it is never \nbacktracked onto, whether or not it has a label. --/\n\n/aaaaa(*SKIP)(*PRUNE)b|a+c/\n    aaaaaac\n\n/aaaaa(*SKIP:N)(*PRUNE)b|a+c/\n    aaaaaac\n\n/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/\n    aaaaaac\n\n/-- Putting THEN in front makes no difference. */\n    \n/aaaaa(*THEN)(*PRUNE)b|a+c/\n    aaaaaac\n \n/-- However, putting COMMIT in front of the prune changes it to \"no match\". I \n    think this is inconsistent and possibly a bug. For the moment, running this\n    test is moved out of the Perl-compatible file. --/\n\n/aaaaa(*COMMIT)(*PRUNE)b|a+c/\n    \n\n/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/\n\n/-- This matches \"ac\" because SKIP forces the next match to start on the\n    sixth \"a\". --/\n\n/aaaaa(*SKIP)b|a+c/\n    aaaaaac\n \n/-- Putting PRUNE in front makes no difference. --/\n\n/aaaaa(*PRUNE)(*SKIP)b|a+c/\n    aaaaaac\n\n/-- Putting THEN in front makes no difference. --/\n\n/aaaaa(*THEN)(*SKIP)b|a+c/\n    aaaaaac\n\n/-- In this case, neither does COMMIT. This still matches \"ac\". --/\n\n/aaaaa(*COMMIT)(*SKIP)b|a+c/\n    aaaaaac\n    \n/-- This gives \"no match\", as expected. --/\n\n/aaaaa(*COMMIT)b|a+c/\n    aaaaaac\n    \n\n/------ Tests using THEN ------/\n\n/-- This matches \"aaaaaac\", as expected. --/\n\n/aaaaa(*THEN)b|a+c/\n    aaaaaac\n\n/-- Putting SKIP in front makes no difference. --/\n\n/aaaaa(*SKIP)(*THEN)b|a+c/\n    aaaaaac\n    \n/-- Putting PRUNE in front makes no difference. --/\n\n/aaaaa(*PRUNE)(*THEN)b|a+c/\n    aaaaaac\n    \n/-- Putting COMMIT in front makes no difference. --/\n\n/aaaaa(*COMMIT)(*THEN)b|a+c/\n    aaaaaac\n    \n/-- End of \"priority\" tests --/ \n\n/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/\n    aaaaaa\n\n/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/\n    aaaaaa\n\n/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/\n    aaaaaa\n\n/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/\n    aaaaaa\n\n/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/\n    aaaac\n\n/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/\n    aaaac\n\n/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/\n    aaaac\n\n/aaa(*MARK:A)a(*SKIP:A)b|a+c/\n    aaaac\n\n/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K\n    aaaaaac\n\n/.?(a|b(*THEN)c)/\n    ba\n\n/(a(*COMMIT)b)c|abd/\n    abc\n    abd\n\n/(?=a(*COMMIT)b)abc|abd/\n    abc\n    abd\n\n/(?>a(*COMMIT)b)c|abd/\n    abc\n    abd\n\n/a(?=b(*COMMIT)c)[^d]|abd/\n    abd\n    abc \n\n/a(?=bc).|abd/\n    abd\n    abc \n    \n/a(?>b(*COMMIT)c)d|abd/\n    abceabd \n\n/a(?>bc)d|abd/\n    abceabd \n\n/(?>a(*COMMIT)b)c|abd/\n    abd\n\n/(?>a(*COMMIT)c)d|abd/\n    abd\n\n/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/\n    ac \n    \n/-- These tests were formerly in test 2, but changes in PCRE and Perl have\n    made them compatible. --/\n    \n/^(a)?(?(1)a|b)+$/\n    *** Failers\n    a\n\n/(?=a\\Kb)ab/\n    ab \n\n/(?!a\\Kb)ac/\n    ac \n    \n/^abc(?<=b\\Kc)d/\n    abcd\n\n/^abc(?<!b\\Kq)d/\n    abcd\n\n\n/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n\n/^((abc|abcx)(*THEN)y|abcd)/\n    abcd\n    *** Failers \n    abcxy \n    \n/^((yes|no)(*THEN)(*F))?/\n  yes\n\n/(A (.*)   C? (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   C? (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   C? (*THEN)  | A D) \\s* (*FAIL)/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   C? (*THEN)  | A D) \\s* z/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   (?:C|) (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   (?:C|) (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   C{0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   C{0,6} (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   (CE){0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCEBefgBhiBqz\n\n/(A (.*)   (CE){0,6} (*THEN)  | A D) z/x\nAbcdCEBefgBhiBqz\n\n/(A (.*)   (CE*){0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\n\n/(A (.*)   (CE*){0,6} (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\n\n/(?=a(*COMMIT)b|ac)ac|ac/\n    ac\n\n/(?=a(*COMMIT)b|(ac)) ac | (a)c/x\n    ac\n\n/--------/\n\n/(?(?!b(*THEN)a)bn|bnn)/\n   bnn \n\n/(?!b(*SKIP)a)bn|bnn/\n    bnn\n    \n/(?(?!b(*SKIP)a)bn|bnn)/\n   bnn \n\n/(?!b(*PRUNE)a)bn|bnn/\n    bnn\n    \n/(?(?!b(*PRUNE)a)bn|bnn)/\n   bnn \n   \n/(?!b(*COMMIT)a)bn|bnn/\n    bnn\n    \n/(?(?!b(*COMMIT)a)bn|bnn)/\n   bnn \n\n/(?=b(*SKIP)a)bn|bnn/\n    bnn\n\n/(?=b(*THEN)a)bn|bnn/\n    bnn\n    \n /^(?!a(*SKIP)b)/\n     ac\n\n /^(?!a(*SKIP)b)../\n     acd\n\n/(?!a(*SKIP)b)../\n     acd\n\n/^(?(?!a(*SKIP)b))/\n     ac\n\n/^(?!a(*PRUNE)b)../\n     acd\n\n/(?!a(*PRUNE)b)../\n     acd\n\n /(?!a(*COMMIT)b)ac|cd/\n     ac\n\n/\\A.*?(?:a|bc)/\n    ba\n\n/^(A(*THEN)B|C(*THEN)D)/\n    CD           \n\n/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n\n/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n\n/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n\n/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n\n/^\\d*\\w{4}/\n    1234\n    123 \n\n/^[^b]*\\w{4}/\n    aaaa\n    aaa     \n\n/^[^b]*\\w{4}/i\n    aaaa\n    aaa     \n\n/^a*\\w{4}/\n    aaaa\n    aaa     \n\n/^a*\\w{4}/i\n    aaaa\n    aaa     \n\n/(?(?=ab)ab)/+\n    ca\n    cd \n\n/(?:(?<n>foo)|(?<n>bar))\\k<n>/J\n    foofoo\n    barbar\n\n/(?<n>A)(?:(?<n>foo)|(?<n>bar))\\k<n>/J\n    AfooA\n    AbarA  \n    ** Failers \n    Afoofoo\n    Abarbar\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n\n/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ\n    Ax\n    BAxy \n    \n/^A\\xZ/\n    A\\0Z \n\n/^A\\o{123}B/\n    A\\123B\n\n/ ^ a + + b $ /x\n    aaaab\n    \n/ ^ a + #comment\n  + b $ /x\n    aaaab\n    \n/ ^ a + #comment\n  #comment\n  + b $ /x\n    aaaab\n    \n/ ^ (?> a + ) b $ /x\n    aaaab \n\n/ ^ ( a + ) + + \\w $ /x\n    aaaab \n\n/(?:a\\Kb)*+/+\n    ababc\n\n/(?>a\\Kb)*/+\n    ababc\n\n/(?:a\\Kb)*/+\n    ababc\n\n/(a\\Kb)*+/+\n    ababc\n\n/(a\\Kb)*/+\n    ababc\n\n/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/\n    acb\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]*+|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")++\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n'\\A([^\\\"1]++|[\\\"2]([^\\\"3]*+|[\\\"4][\\\"5])*+[\\\"6])++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n/^\\w+(?>\\s*)(?<=\\w)/\n  test test\n\n/(?P<same>a)(?P<same>b)/gJ\n    abbaba\n\n/(?P<same>a)(?P<same>b)(?P=same)/gJ\n    abbaba\n\n/(?P=same)?(?P<same>a)(?P<same>b)/gJ\n    abbaba\n\n/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/gJ\n    bbbaaabaabb\n\n/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/gJ\n    bbbaaaccccaaabbbcc\n\n/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/\n    acl\n    bdl\n    adl\n    bcl    \n\n/\\sabc/\n    \\x{0b}abc\n\n/[\\Qa]\\E]+/\n    aa]]\n\n/[\\Q]a\\E]+/\n    aa]]\n\n/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/\n    1234abcd\n\n/(\\2)(\\1)/\n\n\"Z*(|d*){216}\"\n\n\"(?1)(?#?'){8}(a)\"\n    baaaaaaaaac\n\n\"(?|(\\k'Pm')|(?'Pm'))\"\n    abcd\n\n/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\\s])/\n    \\  Fred:099\n\n/(?=.*X)X$/ \n    \\  X\n     \n/X+(?#comment)?/\n    >XXX<\n\n/   (?<word> \\w+ )*    \\.   /xi\n    pokus.\n    \n/(?(DEFINE) (?<word> \\w+ ) ) (?&word)*   \\./xi\n    pokus.\n\n/(?(DEFINE) (?<word> \\w+ ) ) ( (?&word)* )   \\./xi \n    pokus.\n\n/(?&word)*  (?(DEFINE) (?<word> \\w+ ) )  \\./xi\n    pokus.\n\n/(?&word)*  \\. (?<word> \\w+ )/xi\n    pokus.hokus\n\n/-- End of testinput1 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput10",
    "content": "/-- This set of tests check Unicode property support with the DFA matching \n    functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest\n    when running it. --/\n\n/\\pL\\P{Nd}/8\n    AB\n    *** Failers\n    A0\n    00   \n\n/\\X./8\n    AB\n    A\\x{300}BC \n    A\\x{300}\\x{301}\\x{302}BC \n    *** Failers\n    \\x{300}  \n\n/\\X\\X/8\n    ABC\n    A\\x{300}B\\x{300}\\x{301}C \n    A\\x{300}\\x{301}\\x{302}BC \n    *** Failers\n    \\x{300}  \n\n/^\\pL+/8\n    abcd\n    a \n    *** Failers \n\n/^\\PL+/8\n    1234\n    = \n    *** Failers \n    abcd \n\n/^\\X+/8\n    abcdA\\x{300}\\x{301}\\x{302}\n    A\\x{300}\\x{301}\\x{302}\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}\n    a \n    *** Failers \n    \\x{300}\\x{301}\\x{302}\n\n/\\X?abc/8\n    abc\n    A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n    \\x{300}abc  \n    *** Failers\n\n/^\\X?abc/8\n    abc\n    A\\x{300}abc\n    *** Failers\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n    \\x{300}abc  \n\n/\\X*abc/8\n    abc\n    A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n    \\x{300}abc  \n    *** Failers\n\n/^\\X*abc/8\n    abc\n    A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n    *** Failers\n    \\x{300}abc  \n\n/^\\pL?=./8\n    A=b\n    =c \n    *** Failers\n    1=2 \n    AAAA=b  \n\n/^\\pL*=./8\n    AAAA=b\n    =c \n    *** Failers\n    1=2  \n\n/^\\X{2,3}X/8\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X \n    *** Failers\n    X\n    A\\x{300}\\x{301}\\x{302}X\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\n\n/^\\pC\\pL\\pM\\pN\\pP\\pS\\pZ</8\n    \\x7f\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n    \\np\\x{300}9!\\$ < \n    ** Failers \n    ap\\x{300}9!\\$ < \n  \n/^\\PC/8\n    X\n    ** Failers \n    \\x7f\n  \n/^\\PL/8\n    9\n    ** Failers \n    \\x{c0}\n  \n/^\\PM/8\n    X\n    ** Failers \n    \\x{30f}\n  \n/^\\PN/8\n    X\n    ** Failers \n    \\x{660}\n  \n/^\\PP/8\n    X\n    ** Failers \n    \\x{66c}\n  \n/^\\PS/8\n    X\n    ** Failers \n    \\x{f01}\n  \n/^\\PZ/8\n    X\n    ** Failers \n    \\x{1680}\n    \n/^\\p{Cc}/8\n    \\x{017}\n    \\x{09f} \n    ** Failers\n    \\x{0600} \n  \n/^\\p{Cf}/8\n    \\x{601}\n    \\x{180e}\n    \\x{061c}\n    \\x{2066}\n    \\x{2067}\n    \\x{2068}\n    \\x{2069}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Cn}/8\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Co}/8\n    \\x{f8ff}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Cs}/8\n    \\?\\x{dfff}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Ll}/8\n    a\n    ** Failers \n    Z\n    \\x{e000}  \n  \n/^\\p{Lm}/8\n    \\x{2b0}\n    ** Failers\n    a \n  \n/^\\p{Lo}/8\n    \\x{1bb}\n    ** Failers\n    a \n    \\x{2b0}\n  \n/^\\p{Lt}/8\n    \\x{1c5}\n    ** Failers\n    a \n    \\x{2b0}\n  \n/^\\p{Lu}/8\n    A\n    ** Failers\n    \\x{2b0}\n  \n/^\\p{Mc}/8\n    \\x{903}\n    ** Failers\n    X\n    \\x{300}\n       \n/^\\p{Me}/8\n    \\x{488}\n    ** Failers\n    X\n    \\x{903}\n    \\x{300}\n  \n/^\\p{Mn}/8\n    \\x{300}\n    \\x{1a1b}\n    ** Failers\n    X\n    \\x{903}\n  \n/^\\p{Nd}+/8O\n    0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\\x{66a}\n    \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\\x{6fa}\n    \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\\x{970}\n    ** Failers\n    X\n  \n/^\\p{Nl}/8\n    \\x{16ee}\n    ** Failers\n    X\n    \\x{966}\n  \n/^\\p{No}/8\n    \\x{b2}\n    \\x{b3}\n    ** Failers\n    X\n    \\x{16ee}\n  \n/^\\p{Pc}/8\n    \\x5f\n    \\x{203f}\n    ** Failers\n    X\n    -\n    \\x{58a}\n  \n/^\\p{Pd}/8\n    -\n    \\x{58a}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Pe}/8\n    )\n    ]\n    }\n    \\x{f3b}\n    \\x{2309}\n    \\x{230b}\n    ** Failers\n    X\n    \\x{203f}\n    (\n    [\n    {\n    \\x{f3c}\n\n/^\\p{Pf}/8\n    \\x{bb}\n    \\x{2019}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Pi}/8\n    \\x{ab}\n    \\x{2018}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Po}/8\n    !\n    \\x{37e}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Ps}/8\n    (\n    [\n    {\n    \\x{f3c}\n    \\x{2308}\n    \\x{230a}\n    ** Failers\n    X\n    )\n    ]\n    }\n    \\x{f3b}\n  \n/^\\p{Sc}+/8\n    $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\\x{a6}\n    \\x{9f2}\n    ** Failers\n    X\n    \\x{2c2}\n  \n/^\\p{Sk}/8\n    \\x{2c2}\n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{Sm}+/8\n    +<|~\\x{ac}\\x{2044}\n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{So}/8\n    \\x{a6}\n    \\x{482} \n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{Zl}/8\n    \\x{2028}\n    ** Failers\n    X\n    \\x{2029}\n  \n/^\\p{Zp}/8\n    \\x{2029}\n    ** Failers\n    X\n    \\x{2028}\n  \n/^\\p{Zs}/8\n    \\ \\\n    \\x{a0}\n    \\x{1680}\n    \\x{2000}\n    \\x{2001}     \n    ** Failers\n    \\x{2028}\n    \\x{200d} \n  \n/\\p{Nd}+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}+?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,3}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,3}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}??(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(...)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(....)/8\n      ** Failers\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Lu}/8i\n    A\n    a\\x{10a0}B \n    ** Failers \n    a\n    \\x{1d00}  \n\n/\\p{^Lu}/8i\n    1234\n    ** Failers\n    ABC \n\n/\\P{Lu}/8i\n    1234\n    ** Failers\n    ABC \n\n/(?<=A\\p{Nd})XYZ/8\n    A2XYZ\n    123A5XYZPQR\n    ABA\\x{660}XYZpqr\n    ** Failers\n    AXYZ\n    XYZ     \n    \n/(?<!\\pL)XYZ/8\n    1XYZ\n    AB=XYZ.. \n    XYZ \n    ** Failers\n    WXYZ \n\n/[\\p{Nd}]/8\n    1234\n\n/[\\p{Nd}+-]+/8\n    1234\n    12-34\n    12+\\x{661}-34  \n    ** Failers\n    abcd  \n\n/[\\P{Nd}]+/8\n    abcd\n    ** Failers\n    1234\n\n/\\D+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n     \n/\\P{Nd}+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\P{Nd}]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D\\P{Nd}]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\pL/8\n    a\n    A \n\n/\\pL/8i\n    a\n    A \n    \n/\\p{Lu}/8 \n    A\n    aZ\n    ** Failers\n    abc   \n\n/\\p{Lu}/8i\n    A\n    aZ\n    ** Failers\n    abc   \n\n/\\p{Ll}/8 \n    a\n    Az\n    ** Failers\n    ABC   \n\n/\\p{Ll}/8i \n    a\n    Az\n    ** Failers\n    ABC   \n\n/^\\x{c0}$/8i\n    \\x{c0}\n    \\x{e0} \n\n/^\\x{e0}$/8i\n    \\x{c0}\n    \\x{e0} \n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    ** Failers\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8i\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/\\x{391}+/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n\n/\\x{391}{3,5}(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n\n/\\x{391}{3,5}?(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n\n/[\\x{391}\\x{ff3a}]/8i\n    \\x{391}\n    \\x{ff3a}\n    \\x{3b1}\n    \\x{ff5a}   \n    \n/[\\x{c0}\\x{391}]/8i\n    \\x{c0}\n    \\x{e0} \n\n/[\\x{105}-\\x{109}]/8i\n    \\x{104}\n    \\x{105}\n    \\x{109}  \n    ** Failers\n    \\x{100}\n    \\x{10a} \n    \n/[z-\\x{100}]/8i \n    Z\n    z\n    \\x{39c}\n    \\x{178}\n    |\n    \\x{80}\n    \\x{ff}\n    \\x{100}\n    \\x{101} \n    ** Failers\n    \\x{102}\n    Y\n    y           \n\n/[z-\\x{100}]/8i\n\n/^\\X/8\n    A\n    A\\x{300}BC \n    A\\x{300}\\x{301}\\x{302}BC \n    *** Failers\n    \\x{300}  \n\n/^[\\X]/8\n    X123\n    *** Failers\n    AXYZ\n\n/^(\\X*)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*?)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*?)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^\\X(.)/8\n    *** Failers\n    A\\x{300}\\x{301}\\x{302}\n\n/^\\X{2,3}(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n    \n/^\\X{2,3}?(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n\n/^\\pN{2,3}X/\n    12X\n    123X\n    *** Failers\n    X\n    1X\n    1234X     \n\n/\\x{100}/i8\n    \\x{100}   \n    \\x{101} \n    \n/^\\p{Han}+/8\n    \\x{2e81}\\x{3007}\\x{2f804}\\x{31a0}\n    ** Failers\n    \\x{2e7f}  \n\n/^\\P{Katakana}+/8\n    \\x{3105}\n    ** Failers\n    \\x{30ff}  \n\n/^[\\p{Arabic}]/8\n    \\x{06e9}\n    \\x{060b}\n    ** Failers\n    X\\x{06e9}   \n\n/^[\\P{Yi}]/8\n    \\x{2f800}\n    ** Failers\n    \\x{a014}\n    \\x{a4c6}   \n\n/^\\p{Any}X/8\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    X  \n    \n/^\\P{Any}X/8\n    ** Failers\n    AX\n    \n/^\\p{Any}?X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    ABXYZ   \n\n/^\\P{Any}?X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ \n    ABXYZ   \n\n/^\\p{Any}+X/8\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n    XYZ\n\n/^\\P{Any}+X/8\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    XYZ\n\n/^\\p{Any}*X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n\n/^\\P{Any}*X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n\n/^[\\p{Any}]X/8\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    X  \n    \n/^[\\P{Any}]X/8\n    ** Failers\n    AX\n    \n/^[\\p{Any}]?X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    ABXYZ   \n\n/^[\\P{Any}]?X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ \n    ABXYZ   \n\n/^[\\p{Any}]+X/8\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n    XYZ\n\n/^[\\P{Any}]+X/8\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    XYZ\n\n/^[\\p{Any}]*X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n\n/^[\\P{Any}]*X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n\n/^\\p{Any}{3,5}?/8\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\p{Any}{3,5}/8\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\P{Any}{3,5}?/8\n    ** Failers\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\p{L&}X/8\n     AXY\n     aXY\n     \\x{1c5}XY\n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]X/8\n     AXY\n     aXY\n     \\x{1c5}XY\n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\p{L&}+X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]+X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\p{L&}+?X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]+?X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\P{L&}X/8\n     !XY\n     \\x{1bb}XY\n     \\x{2b0}XY\n     ** Failers\n     \\x{1c5}XY\n     AXY      \n\n/^[\\P{L&}]X/8\n     !XY\n     \\x{1bb}XY\n     \\x{2b0}XY\n     ** Failers\n     \\x{1c5}XY\n     AXY      \n\n/^\\x{023a}+?(\\x{0130}+)/8i\n  \\x{023a}\\x{2c65}\\x{0130}\n  \n/^\\x{023a}+([^X])/8i\n  \\x{023a}\\x{2c65}X\n \n/\\x{c0}+\\x{116}+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/[\\x{c0}\\x{116}]+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/Check property support in non-UTF-8 mode/\n \n/\\p{L}{4}/\n    123abcdefg\n    123abc\\xc4\\xc5zz\n\n/\\p{Carian}\\p{Cham}\\p{Kayah_Li}\\p{Lepcha}\\p{Lycian}\\p{Lydian}\\p{Ol_Chiki}\\p{Rejang}\\p{Saurashtra}\\p{Sundanese}\\p{Vai}/8\n    \\x{102A4}\\x{AA52}\\x{A91D}\\x{1C46}\\x{10283}\\x{1092E}\\x{1C6B}\\x{A93B}\\x{A8BF}\\x{1BA0}\\x{A50A}====\n\n/\\x{a77d}\\x{1d79}/8i\n    \\x{a77d}\\x{1d79}\n    \\x{1d79}\\x{a77d} \n\n/\\x{a77d}\\x{1d79}/8\n    \\x{a77d}\\x{1d79}\n    ** Failers \n    \\x{1d79}\\x{a77d} \n\n/^\\p{Xan}/8\n    ABCD\n    1234\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    ** Failers\n    _ABC   \n\n/^\\p{Xan}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    ** Failers\n    _ABC   \n\n/^\\p{Xan}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xan}{2,9}/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^[\\p{Xan}]/8\n    ABCD1234_\n    1234abcd_\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    ** Failers\n    _ABC   \n \n/^[\\p{Xan}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    ** Failers\n    _ABC   \n\n/^>\\p{Xsp}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n    ** Failers\n    \\x{0b} \n\n/^>\\p{Xsp}+/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xsp}*/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xsp}{2,9}/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>[\\p{Xsp}]/8O\n    >\\x{2028}\\x{0b}\n \n/^>[\\p{Xsp}]+/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n    >\\x{a0} \n    ** Failers\n    \\x{0b} \n\n/^>\\p{Xps}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>[\\p{Xps}]/8\n    >\\x{2028}\\x{0b}\n \n/^>[\\p{Xps}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^\\p{Xwd}/8\n    ABCD\n    1234\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}\n    _ABC    \n    ** Failers\n    [] \n\n/^\\p{Xwd}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xwd}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xwd}{2,9}/8\n    A_12\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^[\\p{Xwd}]/8\n    ABCD1234_\n    1234abcd_\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    _ABC \n    ** Failers\n    []   \n \n/^[\\p{Xwd}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/-- Unicode properties for \\b abd \\B --/\n\n/\\b...\\B/8W\n    abc_\n    \\x{37e}abc\\x{376} \n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n\n/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/\n\n/\\b...\\B/8\n    abc_\n    ** Failers \n    \\x{37e}abc\\x{376} \n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n\n/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/\n\n/\\b...\\B/W\n    abc_\n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n    \n/-- Caseless single negated characters > 127 need UCP support --/\n\n/[^\\x{100}]/8i\n    \\x{100}\\x{101}X\n\n/[^\\x{100}]+/8i\n    \\x{100}\\x{101}XX\n\n/^\\X/8\n    A\\P\n    A\\P\\P \n    A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}\\P\\P  \n    A\\x{301}\\P\n    A\\x{301}\\P\\P  \n    \n/^\\X{2,3}/8\n    A\\P\n    A\\P\\P \n    AA\\P\n    AA\\P\\P  \n    A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}\\P\\P  \n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \n\n/^\\X{2}/8\n    AA\\P\n    AA\\P\\P  \n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \n    \n/^\\X+/8\n    AA\\P\n    AA\\P\\P  \n\n/^\\X+?Z/8\n    AA\\P\n    AA\\P\\P \n\n/-- These are tests for extended grapheme clusters --/ \n\n/^\\X/8+\n    G\\x{34e}\\x{34e}X\n    \\x{34e}\\x{34e}X\n    \\x04X\n    \\x{1100}X\n    \\x{1100}\\x{34e}X\n    \\x{1b04}\\x{1b04}X \n    *These match up to the roman letters\n    \\x{1111}\\x{1111}L,L\n    \\x{1111}\\x{1111}\\x{1169}L,L,V\n    \\x{1111}\\x{ae4c}L, LV\n    \\x{1111}\\x{ad89}L, LVT\n    \\x{1111}\\x{ae4c}\\x{1169}L, LV, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}L, LV, V, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}L, LV, V, T\n    \\x{1111}\\x{ad89}\\x{11fe}L, LVT, T\n    \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}L, LVT, T, T\n    \\x{ad89}\\x{11fe}\\x{11fe}LVT, T, T\n    *These match just the first codepoint (invalid sequence)\n    \\x{1111}\\x{11fe}L, T\n    \\x{ae4c}\\x{1111}LV, L\n    \\x{ae4c}\\x{ae4c}LV, LV\n    \\x{ae4c}\\x{ad89}LV, LVT\n    \\x{1169}\\x{1111}V, L\n    \\x{1169}\\x{ae4c}V, LV\n    \\x{1169}\\x{ad89}V, LVT\n    \\x{ad89}\\x{1111}LVT, L\n    \\x{ad89}\\x{1169}LVT, V\n    \\x{ad89}\\x{ae4c}LVT, LV\n    \\x{ad89}\\x{ad89}LVT, LVT\n    \\x{11fe}\\x{1111}T, L\n    \\x{11fe}\\x{1169}T, V\n    \\x{11fe}\\x{ae4c}T, LV\n    \\x{11fe}\\x{ad89}T, LVT\n    *Test extend and spacing mark\n    \\x{1111}\\x{ae4c}\\x{0711}L, LV, extend\n    \\x{1111}\\x{ae4c}\\x{1b04}L, LV, spacing mark\n    \\x{1111}\\x{ae4c}\\x{1b04}\\x{0711}\\x{1b04}L, LV, spacing mark, extend, spacing mark\n    *Test CR, LF, and control\n    \\x0d\\x{0711}CR, extend\n    \\x0d\\x{1b04}CR, spacingmark\n    \\x0a\\x{0711}LF, extend\n    \\x0a\\x{1b04}LF, spacingmark\n    \\x0b\\x{0711}Control, extend\n    \\x09\\x{1b04}Control, spacingmark\n    *There are no Prepend characters, so we can't test Prepend, CR\n    \n/^(?>\\X{2})X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \n/^\\X{2,4}X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n\n/^\\X{2,4}?X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n\n/-- --/\n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n\n/[z\\x{1e9e}]+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n\n/[z\\x{00df}]+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n\n/[z\\x{1f88}]+/8i\n    \\x{1f88}\\x{1f80} \n\n/-- Perl matches these --/\n\n/\\x{00b5}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/\\x{039c}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/\\x{03bc}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n\n/\\x{00c5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/\\x{00e5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/\\x{212b}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n\n/\\x{01c4}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/\\x{01c5}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/\\x{01c6}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n\n/\\x{01c7}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/\\x{01c8}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/\\x{01c9}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n\n/\\x{01ca}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/\\x{01cb}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/\\x{01cc}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n\n/\\x{01f1}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/\\x{01f2}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/\\x{01f3}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n\n/\\x{0345}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{0399}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{03b9}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{1fbe}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n\n/\\x{0392}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/\\x{03b2}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/\\x{03d0}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n    \n\n/\\x{0395}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/\\x{03b5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/\\x{03f5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n\n/\\x{0398}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03b8}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03d1}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03f4}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n    \n\n/\\x{039a}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/\\x{03ba}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/\\x{03f0}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n    \n\n/\\x{03a0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/\\x{03c0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/\\x{03d6}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n\n/\\x{03a1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/\\x{03c1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/\\x{03f1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n\n/\\x{03a3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/\\x{03c2}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/\\x{03c3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n    \n\n/\\x{03a6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/\\x{03c6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/\\x{03d5}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n\n/\\x{03c9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/\\x{03a9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/\\x{2126}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n    \n\n/\\x{1e60}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e61}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e9b}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n    \n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n    \n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n\n/\\x{1f80}+/8i\n    \\x{1f88}\\x{1f80} \n\n/\\x{004b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/\\x{006b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/\\x{212a}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n\n/\\x{0053}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/\\x{0073}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/\\x{017f}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/ist/8i\n    ikt\n\n/is+t/8i\n    iSs\\x{17f}t\n    ikt\n\n/is+?t/8i\n    ikt\n\n/is?t/8i\n    ikt\n\n/is{2}t/8i\n    iskt\n\n/^\\p{Xuc}/8\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n    ** Failers\n    abc     \n\n/^\\p{Xuc}+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}+?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}+?\\*/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}++/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}{3,5}/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}{3,5}?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^[\\p{Xuc}]/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^[\\p{Xuc}]+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\P{Xuc}/8\n    abc\n    ** Failers\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n\n/^[\\P{Xuc}]/8\n    abc\n    ** Failers\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n\n/^A\\s+Z/8W\n    A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n\n/^A[\\s]+Z/8W\n    A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n\n/-- End of testinput10 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testinput11",
    "content": "/-- These are a few representative patterns whose lengths and offsets are to be \nshown when the link size is 2. This is just a doublecheck test to ensure the \nsizes don't go horribly wrong when something is changed. The pattern contents \nare all themselves checked in other tests. Unicode, including property support, \nis required for these tests. --/\n\n/((?i)b)/BM\n\n/(?s)(.*X|^B)/BM\n\n/(?s:.*X|^B)/BM\n\n/^[[:alnum:]]/BM\n\n/#/IxMD\n\n/a#/IxMD\n\n/x?+/BM\n\n/x++/BM\n\n/x{1,3}+/BM \n\n/(x)*+/BM\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/BM\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\n\n/(a(?1)b)/BM\n\n/(a(?1)+b)/BM\n\n/a(?P<name1>b|c)d(?P<longername2>e)/BM\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/BM\n\n/abc(?C255)de(?C)f/BM\n\n/abcde/CBM\n\n/\\x{100}/8BM\n\n/\\x{1000}/8BM\n\n/\\x{10000}/8BM\n\n/\\x{100000}/8BM\n\n/\\x{10ffff}/8BM\n\n/\\x{110000}/8BM\n\n/[\\x{ff}]/8BM\n\n/[\\x{100}]/8BM\n\n/\\x80/8BM\n\n/\\xff/8BM\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/D8M\n    \n/\\x{D55c}\\x{ad6d}\\x{C5B4}/D8M \n\n/\\x{65e5}\\x{672c}\\x{8a9e}/D8M\n\n/[\\x{100}]/8BM\n\n/[Z\\x{100}]/8BM\n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/B8M\n\n/^[\\QĀ\\E-\\QŐ\\E]/B8M\n\n/^[\\QĀ\\E-\\QŐ\\E/B8M\n\n/[\\p{L}]/BM\n\n/[\\p{^L}]/BM\n\n/[\\P{L}]/BM\n\n/[\\P{^L}]/BM\n\n/[abc\\p{L}\\x{0660}]/8BM\n\n/[\\p{Nd}]/8BM\n\n/[\\p{Nd}+-]+/8BM\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iBM\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8BM\n\n/[\\x{105}-\\x{109}]/8iBM\n\n/( ( (?(1)0|) )*   )/xBM\n\n/(  (?(1)0|)*   )/xBM\n\n/[a]/BM\n\n/[a]/8BM\n\n/[\\xaa]/BM\n\n/[\\xaa]/8BM\n\n/[^a]/BM\n\n/[^a]/8BM\n\n/[^\\xaa]/BM\n\n/[^\\xaa]/8BM\n\n/[^\\d]/8WB\n\n/[[:^alpha:][:^cntrl:]]+/8WB\n\n/[[:^cntrl:][:^alpha:]]+/8WB\n\n/[[:alpha:]]+/8WB\n\n/[[:^alpha:]\\S]+/8WB\n\n/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B\n\n/(((a\\2)|(a*)\\g<-1>))*a?/B\n\n/((?+1)(\\1))/B\n\n/.((?2)(?R)\\1)()/B\n\n/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/\n\n/-- End of testinput11 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput12",
    "content": "/-- This test is run only when JIT support is available. It checks for a\nsuccessful and an unsuccessful JIT compile and save and restore behaviour,\nand a couple of things that are different with JIT. --/\n\n/abc/S+I\n\n/(?(?C1)(?=a)a)/S+I\n\n/(?(?C1)(?=a)a)/S!+I\n\n/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I\n\n/abc/S+I>testsavedregex\n\n<testsavedregex\n    abc\n\n/a*/SI\n\n/(?(R)a*(?1)|((?R))b)/S+\n    aaaabcde\n    \n/-- Test various compile modes --/ \n    \n/abcd/S++\n    abcd\n    xyz  \n\n/abcd/S+\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++1\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n    xyz\\P\n\n/abcd/S++2\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++3\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++4\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++5\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++6\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n\n/abcd/S++7\n    abcd\n    ab\\P\n    ab\\P\\P\n    xyz\n    \n/abcd/S++2I \n\n/(*NO_START_OPT)a(*:m)b/KS++\n    a\n\n/^12345678abcd/mS++\n    12345678abcd\n\n/-- Test pattern compilation --/ \n\n/(?:a|b|c|d|e)(?R)/S++\n\n/(?:a|b|c|d|e)(?R)(?R)/S++\n\n/(a(?:a|b|c|d|e)b){8,16}/S++\n\n/(?:|a|){100}x/S++\n\n/(x(?1)){4}/S++\n\n/(.|.)*?bx/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax\n\n/((?(?!))x)(?'name')(?1)/S++\n\n/-- End of testinput12 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput13",
    "content": "/-- This test is run only when JIT support is not available. It checks that an \nattempt to use it has the expected behaviour. It also tests things that\nare different without JIT. --/\n   \n/abc/S+I\n\n/a*/SI\n\n/-- End of testinput13 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput14",
    "content": "/-- This set of tests is run only with the 8-bit library. They do not require \n    UTF-8 or Unicode property support. The file starts with all the tests of\n    the POSIX interface, because that is supported only with the 8-bit library.\n    --/\n    \n< forbid 8W \n\n/abc/P\n    abc\n    *** Failers\n\n/^abc|def/P\n    abcdef\n    abcdef\\B\n\n/.*((abc)$|(def))/P\n    defabc\n    \\Zdefabc\n\n/the quick brown fox/P\n    the quick brown fox\n    *** Failers\n    The Quick Brown Fox\n\n/the quick brown fox/Pi\n    the quick brown fox\n    The Quick Brown Fox\n\n/abc.def/P\n    *** Failers\n    abc\\ndef\n\n/abc$/P\n    abc\n    abc\\n\n\n/(abc)\\2/P\n\n/(abc\\1)/P\n    abc\n\n/a*(b+)(z)(z)/P\n    aaaabbbbzzzz\n    aaaabbbbzzzz\\O0\n    aaaabbbbzzzz\\O1\n    aaaabbbbzzzz\\O2\n    aaaabbbbzzzz\\O3\n    aaaabbbbzzzz\\O4\n    aaaabbbbzzzz\\O5\n\n/ab.cd/P\n    ab-cd\n    ab=cd\n    ** Failers\n    ab\\ncd\n\n/ab.cd/Ps\n    ab-cd\n    ab=cd\n    ab\\ncd\n\n/a(b)c/PN\n    abc\n\n/a(?P<name>b)c/PN\n    abc\n\n/a?|b?/P\n    abc\n    ** Failers\n    ddd\\N   \n\n/\\w+A/P\n   CDAAAAB \n\n/\\w+A/PU\n   CDAAAAB \n   \n/\\Biss\\B/I+P\n    Mississippi\n\n/abc/\\P\n\n/-- End of POSIX tests --/ \n\n/a\\Cb/\n    aXb\n    a\\nb\n    ** Failers (too big char) \n    A\\x{123}B \n    A\\o{443}B \n  \n/\\x{100}/I\n\n/\\o{400}/I\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/xSI\n\n/-- Although this saved pattern was compiled with link-size=2, it does no harm\nto run this test with other link sizes because it is going to generated a\n\"compiled in wrong mode\" error as soon as it is loaded, so the link size does \nnot matter. --/\n\n<!testsaved16\n\n<!testsaved32\n\n/\\h/SI\n\n/\\H/SI\n\n/\\v/SI\n\n/\\V/SI\n\n/\\R/SI\n\n/[\\h]/BZ\n    >\\x09<\n\n/[\\h]+/BZ\n    >\\x09\\x20\\xa0<\n\n/[\\v]/BZ\n\n/[\\H]/BZ\n\n/[^\\h]/BZ\n\n/[\\V]/BZ\n\n/[\\x0a\\V]/BZ\n\n/\\777/I\n\n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K\n    XX\n     \n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K\n    XX\n\n/\\u0100/<JS>\n\n/[\\u0100-\\u0200]/<JS>\n\n/[^\\x00-a]{12,}[^b-\\xff]*/BZ\n\n/[^\\s]*\\s* [^\\W]+\\W+ [^\\d]*?\\d0 [^\\d\\w]{4,6}?\\w*A/BZ\n\n/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/\n\n/-- End of testinput14 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput15",
    "content": "/-- This set of tests is for UTF-8 support but not Unicode property support,\n    and is relevant only to the 8-bit library. --/\n\n< forbid W\n\n/X(\\C{3})/8\n    X\\x{1234}\n\n/X(\\C{4})/8\n    X\\x{1234}YZ\n    \n/X\\C*/8\n    XYZabcdce\n    \n/X\\C*?/8\n    XYZabcde\n    \n/X\\C{3,5}/8\n    Xabcdefg   \n    X\\x{1234} \n    X\\x{1234}YZ\n    X\\x{1234}\\x{512}  \n    X\\x{1234}\\x{512}YZ\n\n/X\\C{3,5}?/8\n    Xabcdefg   \n    X\\x{1234} \n    X\\x{1234}YZ\n    X\\x{1234}\\x{512}  \n\n/a\\Cb/8\n    aXb\n    a\\nb\n    \n/a\\C\\Cb/8 \n    a\\x{100}b \n\n/ab\\Cde/8\n    abXde\n\n/a\\C\\Cb/8 \n    a\\x{100}b\n    ** Failers \n    a\\x{12257}b\n\n/[]/8\n\n//8\n\n/xxx/8\n\n/xxx/8?DZSSO\n\n/badutf/8\n    \\xdf\n    \\xef\n    \\xef\\x80\n    \\xf7\n    \\xf7\\x80\n    \\xf7\\x80\\x80\n    \\xfb\n    \\xfb\\x80\n    \\xfb\\x80\\x80\n    \\xfb\\x80\\x80\\x80\n    \\xfd\n    \\xfd\\x80\n    \\xfd\\x80\\x80\n    \\xfd\\x80\\x80\\x80\n    \\xfd\\x80\\x80\\x80\\x80\n    \\xdf\\x7f\n    \\xef\\x7f\\x80\n    \\xef\\x80\\x7f\n    \\xf7\\x7f\\x80\\x80\n    \\xf7\\x80\\x7f\\x80\n    \\xf7\\x80\\x80\\x7f\n    \\xfb\\x7f\\x80\\x80\\x80\n    \\xfb\\x80\\x7f\\x80\\x80\n    \\xfb\\x80\\x80\\x7f\\x80\n    \\xfb\\x80\\x80\\x80\\x7f\n    \\xfd\\x7f\\x80\\x80\\x80\\x80\n    \\xfd\\x80\\x7f\\x80\\x80\\x80\n    \\xfd\\x80\\x80\\x7f\\x80\\x80\n    \\xfd\\x80\\x80\\x80\\x7f\\x80\n    \\xfd\\x80\\x80\\x80\\x80\\x7f\n    \\xed\\xa0\\x80\n    \\xc0\\x8f\n    \\xe0\\x80\\x8f\n    \\xf0\\x80\\x80\\x8f\n    \\xf8\\x80\\x80\\x80\\x8f\n    \\xfc\\x80\\x80\\x80\\x80\\x8f\n    \\x80\n    \\xfe\n    \\xff\n\n/badutf/8\n    \\xfb\\x80\\x80\\x80\\x80\n    \\xfd\\x80\\x80\\x80\\x80\\x80\n    \\xf7\\xbf\\xbf\\xbf\n\n/shortutf/8\n    \\P\\P\\xdf\n    \\P\\P\\xef\n    \\P\\P\\xef\\x80\n    \\P\\P\\xf7\n    \\P\\P\\xf7\\x80\n    \\P\\P\\xf7\\x80\\x80\n    \\P\\P\\xfb\n    \\P\\P\\xfb\\x80\n    \\P\\P\\xfb\\x80\\x80\n    \\P\\P\\xfb\\x80\\x80\\x80\n    \\P\\P\\xfd\n    \\P\\P\\xfd\\x80\n    \\P\\P\\xfd\\x80\\x80\n    \\P\\P\\xfd\\x80\\x80\\x80\n    \\P\\P\\xfd\\x80\\x80\\x80\\x80\n\n/anything/8\n    \\xc0\\x80\n    \\xc1\\x8f \n    \\xe0\\x9f\\x80\n    \\xf0\\x8f\\x80\\x80 \n    \\xf8\\x87\\x80\\x80\\x80  \n    \\xfc\\x83\\x80\\x80\\x80\\x80\n    \\xfe\\x80\\x80\\x80\\x80\\x80  \n    \\xff\\x80\\x80\\x80\\x80\\x80  \n    \\xc3\\x8f\n    \\xe0\\xaf\\x80\n    \\xe1\\x80\\x80\n    \\xf0\\x9f\\x80\\x80 \n    \\xf1\\x8f\\x80\\x80 \n    \\xf8\\x88\\x80\\x80\\x80  \n    \\xf9\\x87\\x80\\x80\\x80  \n    \\xfc\\x84\\x80\\x80\\x80\\x80\n    \\xfd\\x83\\x80\\x80\\x80\\x80\n    \\?\\xf8\\x88\\x80\\x80\\x80  \n    \\?\\xf9\\x87\\x80\\x80\\x80  \n    \\?\\xfc\\x84\\x80\\x80\\x80\\x80\n    \\?\\xfd\\x83\\x80\\x80\\x80\\x80\n\n/\\x{100}/8DZ\n\n/\\x{1000}/8DZ\n\n/\\x{10000}/8DZ\n\n/\\x{100000}/8DZ\n\n/\\x{10ffff}/8DZ\n\n/[\\x{ff}]/8DZ\n\n/[\\x{100}]/8DZ\n\n/\\x80/8DZ\n\n/\\xff/8DZ\n\n/\\x{D55c}\\x{ad6d}\\x{C5B4}/DZ8 \n    \\x{D55c}\\x{ad6d}\\x{C5B4} \n\n/\\x{65e5}\\x{672c}\\x{8a9e}/DZ8\n    \\x{65e5}\\x{672c}\\x{8a9e}\n\n/\\x{80}/DZ8\n\n/\\x{084}/DZ8\n\n/\\x{104}/DZ8\n\n/\\x{861}/DZ8\n\n/\\x{212ab}/DZ8\n\n/-- This one is here not because it's different to Perl, but because the way\nthe captured single-byte is displayed. (In Perl it becomes a character, and you\ncan't tell the difference.) --/\n    \n/X(\\C)(.*)/8\n    X\\x{1234}\n    X\\nabc \n\n/-- This one is here because Perl gives out a grumbly error message (quite \ncorrectly, but that messes up comparisons). --/\n    \n/a\\Cb/8\n    *** Failers \n    a\\x{100}b \n    \n/[^ab\\xC0-\\xF0]/8SDZ\n    \\x{f1}\n    \\x{bf}\n    \\x{100}\n    \\x{1000}   \n    *** Failers\n    \\x{c0} \n    \\x{f0} \n\n/Ā{3,4}/8SDZ\n  \\x{100}\\x{100}\\x{100}\\x{100\\x{100}\n\n/(\\x{100}+|x)/8SDZ\n\n/(\\x{100}*a|x)/8SDZ\n\n/(\\x{100}{0,2}a|x)/8SDZ\n\n/(\\x{100}{1,2}a|x)/8SDZ\n\n/\\x{100}/8DZ\n\n/a\\x{100}\\x{101}*/8DZ\n\n/a\\x{100}\\x{101}+/8DZ\n\n/[^\\x{c4}]/DZ\n\n/[\\x{100}]/8DZ\n    \\x{100}\n    Z\\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[\\xff]/DZ8\n    >\\x{ff}<\n\n/[^\\xff]/8DZ\n\n/\\x{100}abc(xyz(?1))/8DZ\n\n/a\\x{1234}b/P8\n    a\\x{1234}b\n\n/\\777/8I\n  \\x{1ff}\n  \\777 \n  \n/\\x{100}+\\x{200}/8DZ\n\n/\\x{100}+X/8DZ\n\n/^[\\QĀ\\E-\\QŐ\\E/BZ8\n\n/-- This tests the stricter UTF-8 check according to RFC 3629. --/ \n    \n/X/8\n    \\x{d800}\n    \\x{d800}\\?\n    \\x{da00}\n    \\x{da00}\\?\n    \\x{dfff}\n    \\x{dfff}\\?\n    \\x{110000}    \n    \\x{110000}\\?    \n    \\x{2000000} \n    \\x{2000000}\\? \n    \\x{7fffffff} \n    \\x{7fffffff}\\? \n\n/(*UTF8)\\x{1234}/\n  abcd\\x{1234}pqr\n\n/(*CRLF)(*UTF)(*BSR_UNICODE)a\\Rb/I\n\n/\\h/SI8\n    ABC\\x{09}\n    ABC\\x{20}\n    ABC\\x{a0}\n    ABC\\x{1680}\n    ABC\\x{180e}\n    ABC\\x{2000}\n    ABC\\x{202f} \n    ABC\\x{205f} \n    ABC\\x{3000} \n\n/\\v/SI8\n    ABC\\x{0a}\n    ABC\\x{0b}\n    ABC\\x{0c}\n    ABC\\x{0d}\n    ABC\\x{85}\n    ABC\\x{2028}\n\n/\\h*A/SI8\n    CDBABC\n    \n/\\v+A/SI8\n\n/\\s?xxx\\s/8SI\n\n/\\sxxx\\s/I8ST1\n    AB\\x{85}xxx\\x{a0}XYZ\n    AB\\x{a0}xxx\\x{85}XYZ\n\n/\\S \\S/I8ST1\n    \\x{a2} \\x{84} \n    A Z \n\n/a+/8\n    a\\x{123}aa\\>1\n    a\\x{123}aa\\>2\n    a\\x{123}aa\\>3\n    a\\x{123}aa\\>4\n    a\\x{123}aa\\>5\n    a\\x{123}aa\\>6\n\n/\\x{1234}+/iS8I\n\n/\\x{1234}+?/iS8I\n\n/\\x{1234}++/iS8I\n\n/\\x{1234}{2}/iS8I\n\n/[^\\x{c4}]/8DZ\n\n/X+\\x{200}/8DZ\n\n/\\R/SI8\n\n/\\777/8DZ\n\n/\\w+\\x{C4}/8BZ\n    a\\x{C4}\\x{C4}\n\n/\\w+\\x{C4}/8BZT1\n    a\\x{C4}\\x{C4}\n    \n/\\W+\\x{C4}/8BZ\n    !\\x{C4}\n \n/\\W+\\x{C4}/8BZT1\n    !\\x{C4}\n\n/\\W+\\x{A1}/8BZ\n    !\\x{A1}\n \n/\\W+\\x{A1}/8BZT1\n    !\\x{A1}\n\n/X\\s+\\x{A0}/8BZ\n    X\\x20\\x{A0}\\x{A0}\n\n/X\\s+\\x{A0}/8BZT1\n    X\\x20\\x{A0}\\x{A0}\n\n/\\S+\\x{A0}/8BZ\n    X\\x{A0}\\x{A0}\n\n/\\S+\\x{A0}/8BZT1\n    X\\x{A0}\\x{A0}\n\n/\\x{a0}+\\s!/8BZ\n    \\x{a0}\\x20!\n\n/\\x{a0}+\\s!/8BZT1\n    \\x{a0}\\x20!\n\n/A/8\n  \\x{ff000041}\n  \\x{7f000041} \n\n/(*UTF8)abc/9\n\n/abc/89\n\n//8+L\n    \\xf1\\xad\\xae\\xae\n\n/-- End of testinput15 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput16",
    "content": "/-- This set of tests is run only with the 8-bit library when Unicode property \n    support is available. It starts with tests of the POSIX interface, because\n    that is supported only with the 8-bit library. --/\n\n/\\w/P\n    +++\\x{c2}\n\n/\\w/WP\n    +++\\x{c2}\n    \n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iDZ\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8DZ\n\n/AB\\x{1fb0}/8DZ\n\n/AB\\x{1fb0}/8DZi\n\n/\\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}/8iSI\n    \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n    \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n\n/[ⱥ]/8iBZ\n\n/[^ⱥ]/8iBZ\n\n/\\h/SI\n\n/\\v/SI\n\n/\\R/SI\n\n/[[:blank:]]/WBZ\n\n/\\x{212a}+/i8SI\n    KKkk\\x{212a}\n\n/s+/i8SI\n    SSss\\x{17f}\n\n/[\\W\\p{Any}]/BZ\n    abc\n    123 \n\n/[\\W\\pL]/BZ\n    abc\n    ** Failers \n    123\n    \n/[\\D]/8\n    \\x{1d7cf}\n\n/[\\D\\P{Nd}]/8\n    \\x{1d7cf}\n\n/[^\\D]/8\n    a9b\n    ** Failers\n    \\x{1d7cf}\n\n/[^\\D\\P{Nd}]/8\n    a9b\n    \\x{1d7cf}\n    ** Failers\n    \\x{10000}\n\n/-- End of testinput16 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput17",
    "content": "/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 \n    or -32) features that are not compatible with the 8-bit library, or which \n    give different output in 16- or 32-bit mode. --/\n    \n< forbid 8W \n\n/a\\Cb/\n    aXb\n    a\\nb\n  \n/[^\\x{c4}]/DZ\n  \n/\\x{100}/I\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/xSI\n\n/[\\h]/BZ\n    >\\x09<\n\n/[\\h]+/BZ\n    >\\x09\\x20\\xa0<\n\n/[\\v]/BZ\n\n/[^\\h]/BZ\n\n/\\h+/SI\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\xa0\\x{2000}\n\n/[\\h\\x{dc00}]+/BZSI\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\xa0\\x{2000}\n\n/\\H+/SI\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\xa0\\x{3000}\\x9f\\xa1\\x{2fff}\\x{3001}\n\n/[\\H\\x{d800}]+/\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\xa0\\x{3000}\\x9f\\xa1\\x{2fff}\\x{3001}\n\n/\\v+/SI\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n\n/[\\v\\x{dc00}]+/BZSI\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n\n/\\V+/SI\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n    \\x85\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x84\\x86\n\n/[\\V\\x{d800}]+/\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n    \\x85\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x84\\x86\n\n/\\R+/SI<bsr_unicode>\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n\n/\\x{d800}\\x{d7ff}\\x{dc00}\\x{dc00}\\x{dcff}\\x{dd00}/I\n    \\x{d800}\\x{d7ff}\\x{dc00}\\x{dc00}\\x{dcff}\\x{dd00}\n\n/[^\\x{80}][^\\x{ff}][^\\x{100}][^\\x{1000}][^\\x{ffff}]/BZ\n\n/[^\\x{80}][^\\x{ff}][^\\x{100}][^\\x{1000}][^\\x{ffff}]/BZi\n\n/[^\\x{100}]*[^\\x{1000}]+[^\\x{ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{100}]{5,6}+/BZ\n\n/[^\\x{100}]*[^\\x{1000}]+[^\\x{ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{100}]{5,6}+/BZi\n\n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K\n    XX\n     \n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K\n    XX\n\n/\\u0100/<JS>BZ\n\n/[\\u0100-\\u0200]/<JS>BZ\n\n/\\ud800/<JS>BZ\n\n/^\\x{ffff}+/i\n    \\x{ffff}\n\n/^\\x{ffff}?/i\n    \\x{ffff}\n\n/^\\x{ffff}*/i\n    \\x{ffff}\n\n/^\\x{ffff}{3}/i\n    \\x{ffff}\\x{ffff}\\x{ffff}\n\n/^\\x{ffff}{0,3}/i\n    \\x{ffff}\n\n/[^\\x00-a]{12,}[^b-\\xff]*/BZ\n\n/[^\\s]*\\s* [^\\W]+\\W+ [^\\d]*?\\d0 [^\\d\\w]{4,6}?\\w*A/BZ\n\n/a*[b-\\x{200}]?a#a*[b-\\x{200}]?b#[a-f]*[g-\\x{200}]*#[g-\\x{200}]*[a-c]*#[g-\\x{200}]*[a-h]*/BZ\n\n/^[\\x{1234}\\x{4321}]{2,4}?/\n    \\x{1234}\\x{1234}\\x{1234}\n\n/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/\n\n/-- End of testinput17 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput18",
    "content": "/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to\n    the 16- and 32-bit libraries. --/\n    \n< forbid W \n\n/xxx/8?DZSS\n\n/abc/8\n    ]\n\n/X(\\C{3})/8\n    X\\x{11234}Y\n    X\\x{11234}YZ\n\n/X(\\C{4})/8\n    X\\x{11234}YZ\n    X\\x{11234}YZW\n\n/X\\C*/8\n    XYZabcdce\n\n/X\\C*?/8\n    XYZabcde\n\n/X\\C{3,5}/8\n    Xabcdefg\n    X\\x{11234}Y\n    X\\x{11234}YZ\n    X\\x{11234}\\x{512}\n    X\\x{11234}\\x{512}YZ\n    X\\x{11234}\\x{512}\\x{11234}Z\n\n/X\\C{3,5}?/8\n    Xabcdefg\n    X\\x{11234}Y\n    X\\x{11234}YZ\n    X\\x{11234}\\x{512}YZ\n    *** Failers\n    X\\x{11234}\n\n/a\\Cb/8\n    aXb\n    a\\nb\n\n/a\\C\\Cb/8\n    a\\x{12257}b\n    a\\x{12257}\\x{11234}b\n    ** Failers\n    a\\x{100}b\n\n/ab\\Cde/8\n    abXde\n\n/-- Check maximum character size --/\n\n/\\x{ffff}/8DZ\n\n/\\x{10000}/8DZ\n\n/\\x{100}/8DZ\n\n/\\x{1000}/8DZ\n\n/\\x{10000}/8DZ\n\n/\\x{100000}/8DZ\n\n/\\x{10ffff}/8DZ\n\n/[\\x{ff}]/8DZ\n\n/[\\x{100}]/8DZ\n\n/\\x80/8DZ\n\n/\\xff/8DZ\n\n/\\x{D55c}\\x{ad6d}\\x{C5B4}/DZ8\n    \\x{D55c}\\x{ad6d}\\x{C5B4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/DZ8\n    \\x{65e5}\\x{672c}\\x{8a9e}\n\n/\\x{80}/DZ8\n\n/\\x{084}/DZ8\n\n/\\x{104}/DZ8\n\n/\\x{861}/DZ8\n\n/\\x{212ab}/DZ8\n\n/-- This one is here not because it's different to Perl, but because the way\nthe captured single-byte is displayed. (In Perl it becomes a character, and you\ncan't tell the difference.) --/\n\n/X(\\C)(.*)/8\n    X\\x{1234}\n    X\\nabc\n\n/-- This one is here because Perl gives out a grumbly error message (quite\ncorrectly, but that messes up comparisons). --/\n\n/a\\Cb/8\n    *** Failers\n    a\\x{100}b\n\n/[^ab\\xC0-\\xF0]/8SDZ\n    \\x{f1}\n    \\x{bf}\n    \\x{100}\n    \\x{1000}\n    *** Failers\n    \\x{c0}\n    \\x{f0}\n\n/Ā{3,4}/8SDZ\n  \\x{100}\\x{100}\\x{100}\\x{100\\x{100}\n\n/(\\x{100}+|x)/8SDZ\n\n/(\\x{100}*a|x)/8SDZ\n\n/(\\x{100}{0,2}a|x)/8SDZ\n\n/(\\x{100}{1,2}a|x)/8SDZ\n\n/\\x{100}/8DZ\n\n/a\\x{100}\\x{101}*/8DZ\n\n/a\\x{100}\\x{101}+/8DZ\n\n/[^\\x{c4}]/DZ\n\n/[\\x{100}]/8DZ\n    \\x{100}\n    Z\\x{100}\n    \\x{100}Z\n    *** Failers\n\n/[\\xff]/DZ8\n    >\\x{ff}<\n\n/[^\\xff]/8DZ\n\n/\\x{100}abc(xyz(?1))/8DZ\n\n/\\777/8I\n  \\x{1ff}\n  \\777\n\n/\\x{100}+\\x{200}/8DZ\n\n/\\x{100}+X/8DZ\n\n/^[\\QĀ\\E-\\QŐ\\E/BZ8\n\n/X/8\n    \\x{d800}\n    \\x{d800}\\?\n    \\x{da00}\n    \\x{da00}\\?\n    \\x{dc00}\n    \\x{dc00}\\?\n    \\x{de00}\n    \\x{de00}\\?\n    \\x{dfff}\n    \\x{dfff}\\?\n    \\x{110000}\n    \\x{d800}\\x{1234}\n\n/(*UTF16)\\x{11234}/\n  abcd\\x{11234}pqr\n\n/(*UTF)\\x{11234}/I\n  abcd\\x{11234}pqr\n\n/(*UTF-32)\\x{11234}/\n  abcd\\x{11234}pqr\n\n/(*CRLF)(*UTF16)(*BSR_UNICODE)a\\Rb/I\n\n/(*CRLF)(*UTF32)(*BSR_UNICODE)a\\Rb/I\n\n/\\h/SI8\n    ABC\\x{09}\n    ABC\\x{20}\n    ABC\\x{a0}\n    ABC\\x{1680}\n    ABC\\x{180e}\n    ABC\\x{2000}\n    ABC\\x{202f}\n    ABC\\x{205f}\n    ABC\\x{3000}\n\n/\\v/SI8\n    ABC\\x{0a}\n    ABC\\x{0b}\n    ABC\\x{0c}\n    ABC\\x{0d}\n    ABC\\x{85}\n    ABC\\x{2028}\n\n/\\h*A/SI8\n    CDBABC\n    \\x{2000}ABC \n\n/\\R*A/SI8<bsr_unicode>\n    CDBABC\n    \\x{2028}A  \n\n/\\v+A/SI8\n\n/\\s?xxx\\s/8SI\n\n/\\sxxx\\s/I8ST1\n    AB\\x{85}xxx\\x{a0}XYZ\n    AB\\x{a0}xxx\\x{85}XYZ\n\n/\\S \\S/I8ST1\n    \\x{a2} \\x{84}\n    A Z\n\n/a+/8\n    a\\x{123}aa\\>1\n    a\\x{123}aa\\>2\n    a\\x{123}aa\\>3\n    a\\x{123}aa\\>4\n    a\\x{123}aa\\>5\n    a\\x{123}aa\\>6\n\n/\\x{1234}+/iS8I\n\n/\\x{1234}+?/iS8I\n\n/\\x{1234}++/iS8I\n\n/\\x{1234}{2}/iS8I\n\n/[^\\x{c4}]/8DZ\n\n/X+\\x{200}/8DZ\n\n/\\R/SI8\n\n/-- Check bad offset --/\n\n/a/8\n    \\x{10000}\\>1\n    \\x{10000}ab\\>1\n    \\x{10000}ab\\>2\n    \\x{10000}ab\\>3\n    \\x{10000}ab\\>4\n    \\x{10000}ab\\>5\n\n//8\n\n/\\w+\\x{C4}/8BZ\n    a\\x{C4}\\x{C4}\n\n/\\w+\\x{C4}/8BZT1\n    a\\x{C4}\\x{C4}\n    \n/\\W+\\x{C4}/8BZ\n    !\\x{C4}\n \n/\\W+\\x{C4}/8BZT1\n    !\\x{C4}\n\n/\\W+\\x{A1}/8BZ\n    !\\x{A1}\n \n/\\W+\\x{A1}/8BZT1\n    !\\x{A1}\n\n/X\\s+\\x{A0}/8BZ\n    X\\x20\\x{A0}\\x{A0}\n\n/X\\s+\\x{A0}/8BZT1\n    X\\x20\\x{A0}\\x{A0}\n\n/\\S+\\x{A0}/8BZ\n    X\\x{A0}\\x{A0}\n\n/\\S+\\x{A0}/8BZT1\n    X\\x{A0}\\x{A0}\n\n/\\x{a0}+\\s!/8BZ\n    \\x{a0}\\x20!\n\n/\\x{a0}+\\s!/8BZT1\n    \\x{a0}\\x20!\n\n/(*UTF)abc/9\n\n/abc/89\n\n/-- End of testinput18 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput19",
    "content": "/-- This set of tests is for Unicode property support, relevant only to the\n    16- and 32-bit library. --/\n    \n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iDZ\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8DZ\n\n/AB\\x{1fb0}/8DZ\n\n/AB\\x{1fb0}/8DZi\n\n/\\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}/8iSI\n    \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n    \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n\n/[ⱥ]/8iBZ\n\n/[^ⱥ]/8iBZ\n\n/[[:blank:]]/WBZ\n\n/\\x{212a}+/i8SI\n    KKkk\\x{212a}\n\n/s+/i8SI\n    SSss\\x{17f}\n\n/[\\D]/8\n    \\x{1d7cf}\n\n/[\\D\\P{Nd}]/8\n    \\x{1d7cf}\n\n/[^\\D]/8\n    a9b\n    ** Failers\n    \\x{1d7cf}\n\n/[^\\D\\P{Nd}]/8\n    a9b\n    \\x{1d7cf}\n    ** Failers\n    \\x{10000}\n\n/-- End of testinput19 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testinput2",
    "content": "/-- This set of tests is not Perl-compatible. It checks on special features\n    of PCRE's API, error diagnostics, and the compiled code of some patterns.\n    It also checks the non-Perl syntax the PCRE supports (Python, .NET, \n    Oniguruma). Finally, there are some tests where PCRE and Perl differ, \n    either because PCRE can't be compatible, or there is a possible Perl \n    bug.\n    \n    NOTE: This is a non-UTF set of tests. When UTF support is needed, use\n    test 5, and if Unicode Property Support is needed, use test 7. --/\n    \n< forbid 8W \n  \n/(a)b|/I\n\n/abc/I\n    abc\n    defabc\n    \\Aabc\n    *** Failers\n    \\Adefabc\n    ABC\n\n/^abc/I\n    abc\n    \\Aabc\n    *** Failers\n    defabc\n    \\Adefabc\n\n/a+bc/I\n\n/a*bc/I\n\n/a{3}bc/I\n\n/(abc|a+z)/I\n\n/^abc$/I\n    abc\n    *** Failers\n    def\\nabc\n\n/ab\\idef/X\n\n/(?X)ab\\idef/X\n\n/x{5,4}/\n\n/z{65536}/\n\n/[abcd/\n\n/(?X)[\\B]/\n\n/(?X)[\\R]/\n\n/(?X)[\\X]/\n\n/[\\B]/BZ\n\n/[\\R]/BZ\n\n/[\\X]/BZ\n\n/[z-a]/\n\n/^*/\n\n/(abc/\n\n/(?# abc/\n\n/(?z)abc/\n\n/.*b/I\n\n/.*?b/I\n\n/cat|dog|elephant/I\n    this sentence eventually mentions a cat\n    this sentences rambles on and on for a while and then reaches elephant\n\n/cat|dog|elephant/IS\n    this sentence eventually mentions a cat\n    this sentences rambles on and on for a while and then reaches elephant\n\n/cat|dog|elephant/IiS\n    this sentence eventually mentions a CAT cat\n    this sentences rambles on and on for a while to elephant ElePhant\n\n/a|[bcd]/IS\n\n/(a|[^\\dZ])/IS\n\n/(a|b)*[\\s]/IS\n\n/(ab\\2)/\n\n/{4,5}abc/\n\n/(a)(b)(c)\\2/I\n    abcb\n    \\O0abcb\n    \\O3abcb\n    \\O6abcb\n    \\O9abcb\n    \\O12abcb\n\n/(a)bc|(a)(b)\\2/I\n    abc\n    \\O0abc\n    \\O3abc\n    \\O6abc\n    aba\n    \\O0aba\n    \\O3aba\n    \\O6aba\n    \\O9aba\n    \\O12aba\n\n/abc$/IE\n    abc\n    *** Failers\n    abc\\n\n    abc\\ndef\n\n/(a)(b)(c)(d)(e)\\6/\n\n/the quick brown fox/I\n    the quick brown fox\n    this is a line with the quick brown fox\n\n/the quick brown fox/IA\n    the quick brown fox\n    *** Failers\n    this is a line with the quick brown fox\n\n/ab(?z)cd/\n\n/^abc|def/I\n    abcdef\n    abcdef\\B\n\n/.*((abc)$|(def))/I\n    defabc\n    \\Zdefabc\n\n/)/\n\n/a[]b/\n\n/[^aeiou ]{3,}/I\n    co-processors, and for\n\n/<.*>/I\n    abc<def>ghi<klm>nop\n\n/<.*?>/I\n    abc<def>ghi<klm>nop\n\n/<.*>/IU\n    abc<def>ghi<klm>nop\n\n/(?U)<.*>/I\n    abc<def>ghi<klm>nop\n\n/<.*?>/IU\n    abc<def>ghi<klm>nop\n\n/={3,}/IU\n    abc========def\n\n/(?U)={3,}?/I\n    abc========def\n\n/(?<!bar|cattle)foo/I\n    foo\n    catfoo\n    *** Failers\n    the barfoo\n    and cattlefoo\n\n/(?<=a+)b/\n\n/(?<=aaa|b{0,3})b/\n\n/(?<!(foo)a\\1)bar/\n\n/(?i)abc/I\n\n/(a|(?m)a)/I\n\n/(?i)^1234/I\n\n/(^b|(?i)^d)/I\n\n/(?s).*/I\n\n/[abcd]/IS\n\n/(?i)[abcd]/IS\n\n/(?m)[xy]|(b|c)/IS\n\n/(^a|^b)/Im\n\n/(?i)(^a|^b)/Im\n\n/(a)(?(1)a|b|c)/\n\n/(?(?=a)a|b|c)/\n\n/(?(1a)/\n\n/(?(1a))/\n\n/(?(?i))/\n\n/(?(abc))/\n\n/(?(?<ab))/\n\n/((?s)blah)\\s+\\1/I\n\n/((?i)blah)\\s+\\1/I\n\n/((?i)b)/IDZS\n\n/(a*b|(?i:c*(?-i)d))/IS\n\n/a$/I\n    a\n    a\\n\n    *** Failers\n    \\Za\n    \\Za\\n\n\n/a$/Im\n    a\n    a\\n\n    \\Za\\n\n    *** Failers\n    \\Za\n\n/\\Aabc/Im\n\n/^abc/Im\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/I\n  aaaaabbbbbcccccdef\n\n/(?<=foo)[ab]/IS\n\n/(?<!foo)(alpha|omega)/IS\n\n/(?!alphabet)[ab]/IS\n\n/(?<=foo\\n)^bar/Im\n    foo\\nbarbar\n    ***Failers\n    rhubarb\n    barbell\n    abc\\nbarton\n\n/^(?<=foo\\n)bar/Im\n    foo\\nbarbar\n    ***Failers\n    rhubarb\n    barbell\n    abc\\nbarton\n\n/(?>^abc)/Im\n    abc\n    def\\nabc\n    *** Failers\n    defabc\n\n/(?<=ab(c+)d)ef/\n\n/(?<=ab(?<=c+)d)ef/\n\n/(?<=ab(c|de)f)g/\n\n/The next three are in testinput2 because they have variable length branches/\n\n/(?<=bullock|donkey)-cart/I\n    the bullock-cart\n    a donkey-cart race\n    *** Failers\n    cart\n    horse-and-cart\n\n/(?<=ab(?i)x|y|z)/I\n\n/(?>.*)(?<=(abcd)|(xyz))/I\n    alphabetabcd\n    endingxyz\n\n/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I\n    abxyZZ\n    abXyZZ\n    ZZZ\n    zZZ\n    bZZ\n    BZZ\n    *** Failers\n    ZZ\n    abXYZZ\n    zzz\n    bzz\n\n/(?<!(foo)a)bar/I\n    bar\n    foobbar\n    *** Failers\n    fooabar\n\n/This one is here because Perl behaves differently; see also the following/I\n\n/^(a\\1?){4}$/I\n    aaaa\n    aaaaaa\n    \n/Perl does not fail these two for the final subjects. Neither did PCRE until/\n/release 8.01. The problem is in backtracking into a subpattern that contains/\n/a recursive reference to itself. PCRE has now made these into atomic patterns./\n\n/^(xa|=?\\1a){2}$/\n    xa=xaa\n    ** Failers\n    xa=xaaa\n\n/^(xa|=?\\1a)+$/\n    xa=xaa\n    ** Failers\n    xa=xaaa\n\n/These are syntax tests from Perl 5.005/I\n\n/a[b-a]/\n\n/a[]b/\n\n/a[/\n\n/*a/\n\n/(*)b/\n\n/abc)/\n\n/(abc/\n\n/a**/\n\n/)(/\n\n/\\1/\n\n/\\2/\n\n/(a)|\\2/\n\n/a[b-a]/Ii\n\n/a[]b/Ii\n\n/a[/Ii\n\n/*a/Ii\n\n/(*)b/Ii\n\n/abc)/Ii\n\n/(abc/Ii\n\n/a**/Ii\n\n/)(/Ii\n\n/:(?:/\n\n/(?<%)b/\n\n/a(?{)b/\n\n/a(?{{})b/\n\n/a(?{}})b/\n\n/a(?{\"{\"})b/\n\n/a(?{\"{\"}})b/\n\n/(?(1?)a|b)/\n\n/[a[:xyz:/\n\n/(?<=x+)y/\n\n/a{37,17}/\n\n/abc/\\\n\n/abc/\\i\n\n/(a)bc(d)/I\n    abcd\n    abcd\\C2\n    abcd\\C5\n\n/(.{20})/I\n    abcdefghijklmnopqrstuvwxyz\n    abcdefghijklmnopqrstuvwxyz\\C1\n    abcdefghijklmnopqrstuvwxyz\\G1\n\n/(.{15})/I\n    abcdefghijklmnopqrstuvwxyz\n    abcdefghijklmnopqrstuvwxyz\\C1\\G1\n\n/(.{16})/I\n    abcdefghijklmnopqrstuvwxyz\n    abcdefghijklmnopqrstuvwxyz\\C1\\G1\\L\n\n/^(a|(bc))de(f)/I\n    adef\\G1\\G2\\G3\\G4\\L\n    bcdef\\G1\\G2\\G3\\G4\\L\n    adefghijk\\C0\n\n/^abc\\00def/I\n    abc\\00def\\L\\C0\n\n/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)?)?)?)?)?)?)?)?)?otherword/I\n\n/.*X/IDZ\n\n/.*X/IDZs\n\n/(.*X|^B)/IDZ\n\n/(.*X|^B)/IDZs\n\n/(?s)(.*X|^B)/IDZ\n\n/(?s:.*X|^B)/IDZ\n\n/\\Biss\\B/I+\n    Mississippi\n\n/iss/IG+\n    Mississippi\n\n/\\Biss\\B/IG+\n    Mississippi\n\n/\\Biss\\B/Ig+\n    Mississippi\n    *** Failers\n    Mississippi\\A\n\n/(?<=[Ms])iss/Ig+\n    Mississippi\n\n/(?<=[Ms])iss/IG+\n    Mississippi\n\n/^iss/Ig+\n    ississippi\n\n/.*iss/Ig+\n    abciss\\nxyzisspqr\n\n/.i./I+g\n    Mississippi\n    Mississippi\\A\n    Missouri river\n    Missouri river\\A\n\n/^.is/I+g\n    Mississippi\n\n/^ab\\n/Ig+\n    ab\\nab\\ncd\n\n/^ab\\n/Img+\n    ab\\nab\\ncd\n\n/abc/I\n\n/abc|bac/I\n\n/(abc|bac)/I\n\n/(abc|(c|dc))/I\n\n/(abc|(d|de)c)/I\n\n/a*/I\n\n/a+/I\n\n/(baa|a+)/I\n\n/a{0,3}/I\n\n/baa{3,}/I\n\n/\"([^\\\\\"]+|\\\\.)*\"/I\n\n/(abc|ab[cd])/I\n\n/(a|.)/I\n\n/a|ba|\\w/I\n\n/abc(?=pqr)/I\n\n/...(?<=abc)/I\n\n/abc(?!pqr)/I\n\n/ab./I\n\n/ab[xyz]/I\n\n/abc*/I\n\n/ab.c*/I\n\n/a.c*/I\n\n/.c*/I\n\n/ac*/I\n\n/(a.c*|b.c*)/I\n\n/a.c*|aba/I\n\n/.+a/I\n\n/(?=abcda)a.*/I\n\n/(?=a)a.*/I\n\n/a(b)*/I\n\n/a\\d*/I\n\n/ab\\d*/I\n\n/a(\\d)*/I\n\n/abcde{0,0}/I\n\n/ab\\d+/I\n\n/a(?(1)b)(.)/I\n\n/a(?(1)bag|big)(.)/I\n\n/a(?(1)bag|big)*(.)/I\n\n/a(?(1)bag|big)+(.)/I\n\n/a(?(1)b..|b..)(.)/I\n\n/ab\\d{0}e/I\n\n/a?b?/I\n    a\n    b\n    ab\n    \\\n    *** Failers\n    \\N\n\n/|-/I\n    abcd\n    -abc\n    \\Nab-c\n    *** Failers\n    \\Nabc\n\n/^.?abcd/IS\n\n/\\(             # ( at start\n  (?:           # Non-capturing bracket\n  (?>[^()]+)    # Either a sequence of non-brackets (no backtracking)\n  |             # Or\n  (?R)          # Recurse - i.e. nested bracketed string\n  )*            # Zero or more contents\n  \\)            # Closing )\n  /Ix\n    (abcd)\n    (abcd)xyz\n    xyz(abcd)\n    (ab(xy)cd)pqr\n    (ab(xycd)pqr\n    () abc ()\n    12(abcde(fsh)xyz(foo(bar))lmno)89\n    *** Failers\n    abcd\n    abcd)\n    (abcd\n\n/\\(  ( (?>[^()]+) | (?R) )* \\) /Ixg\n    (ab(xy)cd)pqr\n    1(abcd)(x(y)z)pqr\n\n/\\(  (?: (?>[^()]+) | (?R) ) \\) /Ix\n    (abcd)\n    (ab(xy)cd)\n    (a(b(c)d)e)\n    ((ab))\n    *** Failers\n    ()\n\n/\\(  (?: (?>[^()]+) | (?R) )? \\) /Ix\n    ()\n    12(abcde(fsh)xyz(foo(bar))lmno)89\n\n/\\(  ( (?>[^()]+) | (?R) )* \\) /Ix\n    (ab(xy)cd)\n\n/\\( ( ( (?>[^()]+) | (?R) )* ) \\) /Ix\n    (ab(xy)cd)\n\n/\\( (123)? ( ( (?>[^()]+) | (?R) )* ) \\) /Ix\n    (ab(xy)cd)\n    (123ab(xy)cd)\n\n/\\( ( (123)? ( (?>[^()]+) | (?R) )* ) \\) /Ix\n    (ab(xy)cd)\n    (123ab(xy)cd)\n\n/\\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \\) /Ix\n    (ab(xy)cd)\n\n/\\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \\) /Ix\n    (abcd(xyz<p>qrs)123)\n\n/\\( ( ( (?>[^()]+) | ((?R)) )* ) \\) /Ix\n    (ab(cd)ef)\n    (ab(cd(ef)gh)ij)\n\n/^[[:alnum:]]/DZ\n\n/^[[:^alnum:]]/DZ\n\n/^[[:alpha:]]/DZ\n\n/^[[:^alpha:]]/DZ\n\n/[_[:alpha:]]/IS\n\n/^[[:ascii:]]/DZ\n\n/^[[:^ascii:]]/DZ\n\n/^[[:blank:]]/DZ\n\n/^[[:^blank:]]/DZ\n\n/[\\n\\x0b\\x0c\\x0d[:blank:]]/IS\n\n/^[[:cntrl:]]/DZ\n\n/^[[:digit:]]/DZ\n\n/^[[:graph:]]/DZ\n\n/^[[:lower:]]/DZ\n\n/^[[:print:]]/DZ\n\n/^[[:punct:]]/DZ\n\n/^[[:space:]]/DZ\n\n/^[[:upper:]]/DZ\n\n/^[[:xdigit:]]/DZ\n\n/^[[:word:]]/DZ\n\n/^[[:^cntrl:]]/DZ\n\n/^[12[:^digit:]]/DZ\n\n/^[[:^blank:]]/DZ\n\n/[01[:alpha:]%]/DZ\n\n/[[.ch.]]/I\n\n/[[=ch=]]/I\n\n/[[:rhubarb:]]/I\n\n/[[:upper:]]/Ii\n    A\n    a\n\n/[[:lower:]]/Ii\n    A\n    a\n\n/((?-i)[[:lower:]])[[:lower:]]/Ii\n    ab\n    aB\n    *** Failers\n    Ab\n    AB\n\n/[\\200-\\110]/I\n\n/^(?(0)f|b)oo/I\n\n/This one's here because of the large output vector needed/I\n\n/(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\w+)\\s+(\\270)/I\n    \\O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\n\n/This one's here because Perl does this differently and PCRE can't at present/I\n\n/(main(O)?)+/I\n    mainmain\n    mainOmain\n\n/These are all cases where Perl does it differently (nested captures)/I\n\n/^(a(b)?)+$/I\n    aba\n\n/^(aa(bb)?)+$/I\n    aabbaa\n\n/^(aa|aa(bb))+$/I\n    aabbaa\n\n/^(aa(bb)??)+$/I\n    aabbaa\n\n/^(?:aa(bb)?)+$/I\n    aabbaa\n\n/^(aa(b(b))?)+$/I\n    aabbaa\n\n/^(?:aa(b(b))?)+$/I\n    aabbaa\n\n/^(?:aa(b(?:b))?)+$/I\n    aabbaa\n\n/^(?:aa(bb(?:b))?)+$/I\n    aabbbaa\n\n/^(?:aa(b(?:bb))?)+$/I\n    aabbbaa\n\n/^(?:aa(?:b(b))?)+$/I\n    aabbaa\n\n/^(?:aa(?:b(bb))?)+$/I\n    aabbbaa\n\n/^(aa(b(bb))?)+$/I\n    aabbbaa\n\n/^(aa(bb(bb))?)+$/I\n    aabbbbaa\n\n/--------------------------------------------------------------------/I\n\n/#/IxDZ\n\n/a#/IxDZ\n\n/[\\s]/DZ\n\n/[\\S]/DZ\n\n/a(?i)b/DZ\n    ab\n    aB\n    *** Failers\n    AB\n\n/(a(?i)b)/DZ\n    ab\n    aB\n    *** Failers\n    AB\n\n/   (?i)abc/IxDZ\n\n/#this is a comment\n  (?i)abc/IxDZ\n\n/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ\n\n/\\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ\n\n/\\Q\\E/DZ\n    \\\n\n/\\Q\\Ex/DZ\n\n/ \\Q\\E/DZ\n\n/a\\Q\\E/DZ\n  abc\n  bca\n  bac\n\n/a\\Q\\Eb/DZ\n  abc\n\n/\\Q\\Eabc/DZ\n\n/x*+\\w/DZ\n    *** Failers\n    xxxxx\n\n/x?+/DZ\n\n/x++/DZ\n\n/x{1,3}+/BZO\n\n/x{1,3}+/BZOi\n\n/[^x]{1,3}+/BZO\n\n/[^x]{1,3}+/BZOi\n\n/(x)*+/DZ\n\n/^(\\w++|\\s++)*$/I\n    now is the time for all good men to come to the aid of the party\n    *** Failers\n    this is not a line with only words and spaces!\n\n/(\\d++)(\\w)/I\n    12345a\n    *** Failers\n    12345+\n\n/a++b/I\n    aaab\n\n/(a++b)/I\n    aaab\n\n/(a++)b/I\n    aaab\n\n/([^()]++|\\([^()]*\\))+/I\n    ((abc(ade)ufh()()x\n\n/\\(([^()]++|\\([^()]+\\))+\\)/I\n    (abc)\n    (abc(def)xyz)\n    *** Failers\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/(abc){1,3}+/DZ\n\n/a+?+/I\n\n/a{2,3}?+b/I\n\n/(?U)a+?+/I\n\n/a{2,3}?+b/IU\n\n/x(?U)a++b/DZ\n    xaaaab\n\n/(?U)xa++b/DZ\n    xaaaab\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/DZ\n\n/^x(?U)a+b/DZ\n\n/^x(?U)(a+)b/DZ\n\n/[.x.]/I\n\n/[=x=]/I\n\n/[:x:]/I\n\n/\\l/I\n\n/\\L/I\n\n/\\N{name}/I\n\n/\\u/I\n\n/\\U/I\n\n/a{1,3}b/U\n    ab\n\n/[/I\n\n/[a-/I\n\n/[[:space:]/I\n\n/[\\s]/IDZ\n\n/[[:space:]]/IDZ\n\n/[[:space:]abcde]/IDZ\n\n/< (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >/Ix\n    <>\n    <abcd>\n    <abc <123> hij>\n    <abc <def> hij>\n    <abc<>def>\n    <abc<>\n    *** Failers\n    <abc\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|IDZ\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|IDZ\n\n/(.*)\\d+\\1/I\n\n/(.*)\\d+/I\n\n/(.*)\\d+\\1/Is\n\n/(.*)\\d+/Is\n\n/(.*(xyz))\\d+\\2/I\n\n/((.*))\\d+\\1/I\n    abc123bc\n\n/a[b]/I\n\n/(?=a).*/I\n\n/(?=abc).xyz/IiI\n\n/(?=abc)(?i).xyz/I\n\n/(?=a)(?=b)/I\n\n/(?=.)a/I\n\n/((?=abcda)a)/I\n\n/((?=abcda)ab)/I\n\n/()a/I\n\n/(?(1)ab|ac)(.)/I\n\n/(?(1)abz|acz)(.)/I\n\n/(?(1)abz)(.)/I\n\n/(?(1)abz)(1)23/I\n\n/(a)+/I\n\n/(a){2,3}/I\n\n/(a)*/I\n\n/[a]/I\n\n/[ab]/I\n\n/[ab]/IS\n\n/[^a]/I\n\n/\\d456/I\n\n/\\d456/IS\n\n/a^b/I\n\n/^a/Im\n  abcde\n  xy\\nabc\n  *** Failers\n  xyabc\n\n/c|abc/I\n\n/(?i)[ab]/IS\n\n/[ab](?i)cd/IS\n\n/abc(?C)def/I\n    abcdef\n    1234abcdef\n    *** Failers\n    abcxyz\n    abcxyzf\n\n/abc(?C)de(?C1)f/I\n    123abcdef\n\n/(?C1)\\dabc(?C2)def/IS\n    1234abcdef\n    *** Failers\n    abcdef\n\n/(?C1)\\dabc(?C2)def/ISS\n    1234abcdef\n    *** Failers\n    abcdef\n\n/(?C255)ab/I\n\n/(?C256)ab/I\n\n/(?Cab)xx/I\n\n/(?C12vr)x/I\n\n/abc(?C)def/I\n    *** Failers\n    \\x83\\x0\\x61bcdef\n\n/(abc)(?C)de(?C1)f/I\n    123abcdef\n    123abcdef\\C+\n    123abcdef\\C-\n    *** Failers\n    123abcdef\\C!1\n\n/(?C0)(abc(?C1))*/I\n    abcabcabc\n    abcabc\\C!1!3\n    *** Failers\n    abcabcabc\\C!1!3\n\n/(\\d{3}(?C))*/I\n    123\\C+\n    123456\\C+\n    123456789\\C+\n\n/((xyz)(?C)p|(?C1)xyzabc)/I\n    xyzabc\\C+\n\n/(X)((xyz)(?C)p|(?C1)xyzabc)/I\n    Xxyzabc\\C+\n\n/(?=(abc))(?C)abcdef/I\n    abcdef\\C+\n\n/(?!(abc)(?C1)d)(?C2)abcxyz/I\n    abcxyz\\C+\n\n/(?<=(abc)(?C))xyz/I\n   abcxyz\\C+\n\n/a(b+)(c*)(?C1)/I\n    abbbbbccc\\C*1\n\n/a(b+?)(c*?)(?C1)/I\n    abbbbbccc\\C*1\n\n/(?C)abc/I\n\n/(?C)^abc/I\n\n/(?C)a|b/IS\n\n/(?R)/I\n\n/(a|(?R))/I\n\n/(ab|(bc|(de|(?R))))/I\n\n/x(ab|(bc|(de|(?R))))/I\n    xab\n    xbc\n    xde\n    xxab\n    xxxab\n    *** Failers\n    xyab\n\n/(ab|(bc|(de|(?1))))/I\n\n/x(ab|(bc|(de|(?1)x)x)x)/I\n\n/^([^()]|\\((?1)*\\))*$/I\n    abc\n    a(b)c\n    a(b(c))d\n    *** Failers)\n    a(b(c)d\n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/I\n   >abc>123<xyz<\n   >abc>1(2)3<xyz<\n   >abc>(1(2)3)<xyz<\n\n/(a(?1)b)/DZ\n\n/(a(?1)+b)/DZ\n\n/^(\\d+|\\((?1)([+*-])(?1)\\)|-(?1))$/I\n    12\n    (((2+2)*-3)-7)\n    -12\n    *** Failers\n    ((2+2)*-3)-7)\n\n/^(x(y|(?1){2})z)/I\n    xyz\n    xxyzxyzz\n    *** Failers\n    xxyzz\n    xxyzxyzxyzz\n\n/((< (?: (?(R) \\d++  | [^<>]*+) | (?2)) * >))/Ix\n    <>\n    <abcd>\n    <abc <123> hij>\n    <abc <def> hij>\n    <abc<>def>\n    <abc<>\n    *** Failers\n    <abc\n\n/(?1)/I\n\n/((?2)(abc)/I\n\n/^(abc)def(?1)/I\n    abcdefabc\n\n/^(a|b|c)=(?1)+/I\n    a=a\n    a=b\n    a=bc\n\n/^(a|b|c)=((?1))+/I\n    a=a\n    a=b\n    a=bc\n\n/a(?P<name1>b|c)d(?P<longername2>e)/DZ\n    abde\n    acde\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/DZ\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/DZ\n\n/^\\W*(?:(?P<one>(?P<two>.)\\W*(?P>one)\\W*(?P=two)|)|(?P<three>(?P<four>.)\\W*(?P>three)\\W*(?P=four)|\\W*.\\W*))\\W*$/Ii\n    1221\n    Satan, oscillate my metallic sonatas!\n    A man, a plan, a canal: Panama!\n    Able was I ere I saw Elba.\n    *** Failers\n    The quick brown fox\n\n/((?(R)a|b))\\1(?1)?/I\n  bb\n  bbaa\n\n/(.*)a/Is\n\n/(.*)a\\1/Is\n\n/(.*)a(b)\\2/Is\n\n/((.*)a|(.*)b)z/Is\n\n/((.*)a|(.*)b)z\\1/Is\n\n/((.*)a|(.*)b)z\\2/Is\n\n/((.*)a|(.*)b)z\\3/Is\n\n/((.*)a|^(.*)b)z\\3/Is\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\\31/Is\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\\32/Is\n\n/(a)(bc)/INDZ\n  abc\n\n/(?P<one>a)(bc)/INDZ\n  abc\n\n/(a)(?P<named>bc)/INDZ\n\n/(a+)*zz/I\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\\M\n  aaaaaaaaaaaaaz\\M\n\n/(aaa(?C1)bbb|ab)/I\n   aaabbb\n   aaabbb\\C*0\n   aaabbb\\C*1\n   aaabbb\\C*-1\n\n/ab(?P<one>cd)ef(?P<two>gh)/I\n    abcdefgh\n    abcdefgh\\C1\\Gtwo\n    abcdefgh\\Cone\\Ctwo\n    abcdefgh\\Cthree\n\n/(?P<Tes>)(?P<Test>)/DZ\n\n/(?P<Test>)(?P<Tes>)/DZ\n\n/(?P<Z>zz)(?P<A>aa)/I\n    zzaa\\CZ\n    zzaa\\CA\n\n/(?P<x>eks)(?P<x>eccs)/I\n\n/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I\n\n\"\\[((?P<elem>\\d+)(,(?P>elem))*)\\]\"I\n    [10,20,30,5,5,4,4,2,43,23,4234]\n    *** Failers\n    []\n\n\"\\[((?P<elem>\\d+)(,(?P>elem))*)?\\]\"I\n    [10,20,30,5,5,4,4,2,43,23,4234]\n    []\n\n/(a(b(?2)c))?/DZ\n\n/(a(b(?2)c))*/DZ\n\n/(a(b(?2)c)){0,2}/DZ\n\n/[ab]{1}+/DZ\n\n/((w\\/|-|with)*(free|immediate)*.*?shipping\\s*[!.-]*)/Ii\n     Baby Bjorn Active Carrier - With free SHIPPING!!\n\n/((w\\/|-|with)*(free|immediate)*.*?shipping\\s*[!.-]*)/IiS\n     Baby Bjorn Active Carrier - With free SHIPPING!!\n\n/a*.*b/ISDZ\n\n/(a|b)*.?c/ISDZ\n\n/abc(?C255)de(?C)f/DZ\n\n/abcde/ICDZ\n  abcde\n  abcdfe\n\n/a*b/ICDZS\n  ab\n  aaaab\n  aaaacb\n\n/a*b/ICDZSS\n  ab\n  aaaab\n  aaaacb\n\n/a+b/ICDZ\n  ab\n  aaaab\n  aaaacb\n\n/(abc|def)x/ICDZS\n  abcx\n  defx\n  ** Failers \n  abcdefzx\n\n/(abc|def)x/ICDZSS\n  abcx\n  defx\n  ** Failers \n  abcdefzx\n\n/(ab|cd){3,4}/IC\n  ababab\n  abcdabcd\n  abcdcdcdcdcd\n\n/([ab]{,4}c|xy)/ICDZS\n    Note: that { does NOT introduce a quantifier\n\n/([ab]{,4}c|xy)/ICDZSS\n    Note: that { does NOT introduce a quantifier\n\n/([ab]{1,4}c|xy){4,5}?123/ICDZ\n    aacaacaacaacaac123\n\n/\\b.*/I\n  ab cd\\>1\n\n/\\b.*/Is\n  ab cd\\>1\n\n/(?!.bcd).*/I\n  Xbcd12345\n\n/abcde/I\n    ab\\P\n    abc\\P\n    abcd\\P\n    abcde\\P\n    the quick brown abc\\P\n    ** Failers\\P\n    the quick brown abxyz fox\\P\n\n\"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\\d\\d$\"I\n    13/05/04\\P\n    13/5/2004\\P\n    02/05/09\\P\n    1\\P\n    1/2\\P\n    1/2/0\\P\n    1/2/04\\P\n    0\\P\n    02/\\P\n    02/0\\P\n    02/1\\P\n    ** Failers\\P\n    \\P\n    123\\P\n    33/4/04\\P\n    3/13/04\\P\n    0/1/2003\\P\n    0/\\P\n    02/0/\\P\n    02/13\\P\n\n/0{0,2}ABC/I\n\n/\\d{3,}ABC/I\n\n/\\d*ABC/I\n\n/[abc]+DE/I\n\n/[abc]?123/I\n    123\\P\n    a\\P\n    b\\P\n    c\\P\n    c12\\P\n    c123\\P\n\n/^(?:\\d){3,5}X/I\n    1\\P\n    123\\P\n    123X\n    1234\\P\n    1234X\n    12345\\P\n    12345X\n    *** Failers\n    1X\n    123456\\P\n\n//KF>testsavedregex\n\n/abc/IS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    bca\n\n/abc/ISS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    bca\n\n/abc/IFS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    bca\n\n/abc/IFSS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    bca\n\n/(a|b)/IS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    def\n\n/(a|b)/ISS>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    def\n\n/(a|b)/ISF>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    def\n\n/(a|b)/ISSF>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    def\n\n~<(\\w+)/?>(.)*</(\\1)>~smgI\n    \\J1024<!DOCTYPE seite SYSTEM \"http://www.lco.lineas.de/xmlCms.dtd\">\\n<seite>\\n<dokumenteninformation>\\n<seitentitel>Partner der LCO</seitentitel>\\n<sprache>de</sprache>\\n<seitenbeschreibung>Partner der LINEAS Consulting\\nGmbH</seitenbeschreibung>\\n<schluesselworte>LINEAS Consulting GmbH Hamburg\\nPartnerfirmen</schluesselworte>\\n<revisit>30 days</revisit>\\n<robots>index,follow</robots>\\n<menueinformation>\\n<aktiv>ja</aktiv>\\n<menueposition>3</menueposition>\\n<menuetext>Partner</menuetext>\\n</menueinformation>\\n<lastedited>\\n<autor>LCO</autor>\\n<firma>LINEAS Consulting</firma>\\n<datum>15.10.2003</datum>\\n</lastedited>\\n</dokumenteninformation>\\n<inhalt>\\n\\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\\nGmbH</absatzueberschrift>\\n\\n<absatz><link ziel=\"http://www.ca.com/\" zielfenster=\"_blank\">\\n<bild name=\"logo_ca.gif\" rahmen=\"no\"/></link> <link\\nziel=\"http://www.ey.com/\" zielfenster=\"_blank\"><bild\\nname=\"logo_euy.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><link ziel=\"http://www.cisco.de/\" zielfenster=\"_blank\">\\n<bild name=\"logo_cisco.gif\" rahmen=\"ja\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.atelion.de/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_atelion.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><link ziel=\"http://www.line-information.de/\"\\nzielfenster=\"_blank\">\\n<bild name=\"logo_line_information.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><bild name=\"logo_aw.gif\" rahmen=\"no\"/></absatz>\\n\\n<absatz><link ziel=\"http://www.incognis.de/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_incognis.gif\" rahmen=\"no\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.addcraft.com/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_addcraft.gif\" rahmen=\"no\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.comendo.com/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_comendo.gif\" rahmen=\"no\"/></link></absatz>\\n\\n</inhalt>\\n</seite>\n\n/^a/IF\n\n/line\\nbreak/I\n    this is a line\\nbreak\n    line one\\nthis is a line\\nbreak in the second line\n\n/line\\nbreak/If\n    this is a line\\nbreak\n    ** Failers\n    line one\\nthis is a line\\nbreak in the second line\n\n/line\\nbreak/Imf\n    this is a line\\nbreak\n    ** Failers\n    line one\\nthis is a line\\nbreak in the second line\n\n/(?i)(?-i)AbCd/I\n    AbCd\n    ** Failers\n    abcd\n\n/a{11111111111111111111}/I\n\n/(){64294967295}/I\n\n/(){2,4294967295}/I\n\n\"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\\1B\"I\n    abcdefghijklAkB\n\n\"(?P<n0>a)(?P<n1>b)(?P<n2>c)(?P<n3>d)(?P<n4>e)(?P<n5>f)(?P<n6>g)(?P<n7>h)(?P<n8>i)(?P<n9>j)(?P<n10>k)(?P<n11>l)A\\11B\"I\n    abcdefghijklAkB\n\n\"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\\11B\"I\n    abcdefghijklAkB\n\n\"(?P<name0>a)(?P<name1>a)(?P<name2>a)(?P<name3>a)(?P<name4>a)(?P<name5>a)(?P<name6>a)(?P<name7>a)(?P<name8>a)(?P<name9>a)(?P<name10>a)(?P<name11>a)(?P<name12>a)(?P<name13>a)(?P<name14>a)(?P<name15>a)(?P<name16>a)(?P<name17>a)(?P<name18>a)(?P<name19>a)(?P<name20>a)(?P<name21>a)(?P<name22>a)(?P<name23>a)(?P<name24>a)(?P<name25>a)(?P<name26>a)(?P<name27>a)(?P<name28>a)(?P<name29>a)(?P<name30>a)(?P<name31>a)(?P<name32>a)(?P<name33>a)(?P<name34>a)(?P<name35>a)(?P<name36>a)(?P<name37>a)(?P<name38>a)(?P<name39>a)(?P<name40>a)(?P<name41>a)(?P<name42>a)(?P<name43>a)(?P<name44>a)(?P<name45>a)(?P<name46>a)(?P<name47>a)(?P<name48>a)(?P<name49>a)(?P<name50>a)(?P<name51>a)(?P<name52>a)(?P<name53>a)(?P<name54>a)(?P<name55>a)(?P<name56>a)(?P<name57>a)(?P<name58>a)(?P<name59>a)(?P<name60>a)(?P<name61>a)(?P<name62>a)(?P<name63>a)(?P<name64>a)(?P<name65>a)(?P<name66>a)(?P<name67>a)(?P<name68>a)(?P<name69>a)(?P<name70>a)(?P<name71>a)(?P<name72>a)(?P<name73>a)(?P<name74>a)(?P<name75>a)(?P<name76>a)(?P<name77>a)(?P<name78>a)(?P<name79>a)(?P<name80>a)(?P<name81>a)(?P<name82>a)(?P<name83>a)(?P<name84>a)(?P<name85>a)(?P<name86>a)(?P<name87>a)(?P<name88>a)(?P<name89>a)(?P<name90>a)(?P<name91>a)(?P<name92>a)(?P<name93>a)(?P<name94>a)(?P<name95>a)(?P<name96>a)(?P<name97>a)(?P<name98>a)(?P<name99>a)(?P<name100>a)\"I\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n\"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\"I\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[^()]*(?:\\((?R)\\)[^()]*)*/I\n    (this(and)that\n    (this(and)that)\n    (this(and)that)stuff\n\n/[^()]*(?:\\((?>(?R))\\)[^()]*)*/I\n    (this(and)that\n    (this(and)that)\n\n/[^()]*(?:\\((?R)\\))*[^()]*/I\n    (this(and)that\n    (this(and)that)\n\n/(?:\\((?R)\\))*[^()]*/I\n    (this(and)that\n    (this(and)that)\n    ((this))\n\n/(?:\\((?R)\\))|[^()]*/I\n    (this(and)that\n    (this(and)that)\n    (this)\n    ((this))\n\n/\\x{0000ff}/I\n\n/^((?P<A>a1)|(?P<A>a2)b)/I\n\n/^((?P<A>a1)|(?P<A>a2)b)/IJ\n    a1b\\CA\n    a2b\\CA\n    ** Failers\n    a1b\\CZ\\CA\n    \n/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ\n\n/^(?P<A>a)(?P<A>b)/IJ\n    ab\\CA\n\n/^(?P<A>a)(?P<A>b)|cd/IJ\n    ab\\CA\n    cd\\CA\n\n/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ\n    cdefgh\\CA\n\n/^((?P<A>a1)|(?P<A>a2)b)/IJ\n    a1b\\GA\n    a2b\\GA\n    ** Failers\n    a1b\\GZ\\GA\n\n/^(?P<A>a)(?P<A>b)/IJ\n    ab\\GA\n\n/^(?P<A>a)(?P<A>b)|cd/IJ\n    ab\\GA\n    cd\\GA\n\n/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ\n    cdefgh\\GA\n\n/(?J)^((?P<A>a1)|(?P<A>a2)b)/I\n    a1b\\CA\n    a2b\\CA\n\n/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I\n\n/ In this next test, J is not set at the outer level; consequently it isn't\nset in the pattern's options; consequently pcre_get_named_substring() produces\na random value. /Ix\n\n/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I\n    a bc d\\CA\\CB\\CC\n\n/^(?P<A>a)?(?(A)a|b)/I\n    aabc\n    bc\n    ** Failers\n    abc\n\n/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I\n    bXaX\n\n/(?:(?(2y)a|b)(X))+/I\n\n/(?:(?(ZA)a|b)(?P<ZZ>X))+/I\n\n/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I\n    bbXaaX\n\n/(?:(?(ZZ)a|\\(b\\))\\\\(?P<ZZ>X))+/I\n    (b)\\\\Xa\\\\X\n\n/(?P<ABC/I\n\n/(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I\n    bXXaYYaY\n    bXYaXXaX\n\n/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I\n    bXXaYYaY\n\n/\\s*,\\s*/IS\n    \\x0b,\\x0b\n    \\x0c,\\x0d\n\n/^abc/Im\n    xyz\\nabc\n    xyz\\nabc\\<lf>\n    xyz\\r\\nabc\\<lf>\n    xyz\\rabc\\<cr>\n    xyz\\r\\nabc\\<crlf>\n    ** Failers\n    xyz\\nabc\\<cr>\n    xyz\\r\\nabc\\<cr>\n    xyz\\nabc\\<crlf>\n    xyz\\rabc\\<crlf>\n    xyz\\rabc\\<lf>\n\n/abc$/Im<lf>\n    xyzabc\n    xyzabc\\n\n    xyzabc\\npqr\n    xyzabc\\r\\<cr>\n    xyzabc\\rpqr\\<cr>\n    xyzabc\\r\\n\\<crlf>\n    xyzabc\\r\\npqr\\<crlf>\n    ** Failers\n    xyzabc\\r\n    xyzabc\\rpqr\n    xyzabc\\r\\n\n    xyzabc\\r\\npqr\n\n/^abc/Im<cr>\n    xyz\\rabcdef\n    xyz\\nabcdef\\<lf>\n    ** Failers\n    xyz\\nabcdef\n\n/^abc/Im<lf>\n    xyz\\nabcdef\n    xyz\\rabcdef\\<cr>\n    ** Failers\n    xyz\\rabcdef\n\n/^abc/Im<crlf>\n    xyz\\r\\nabcdef\n    xyz\\rabcdef\\<cr>\n    ** Failers\n    xyz\\rabcdef\n\n/^abc/Im<bad>\n\n/abc/I\n    xyz\\rabc\\<bad>\n    abc\n\n/.*/I<lf>\n    abc\\ndef\n    abc\\rdef\n    abc\\r\\ndef\n    \\<cr>abc\\ndef\n    \\<cr>abc\\rdef\n    \\<cr>abc\\r\\ndef\n    \\<crlf>abc\\ndef\n    \\<crlf>abc\\rdef\n    \\<crlf>abc\\r\\ndef\n\n/\\w+(.)(.)?def/Is\n    abc\\ndef\n    abc\\rdef\n    abc\\r\\ndef\n\n+((?:\\s|//.*\\\\n|/[*](?:\\\\n|.)*?[*]/)*)+I\n   /* this is a C style comment */\\M\n\n/(?P<B>25[0-5]|2[0-4]\\d|[01]?\\d?\\d)(?:\\.(?P>B)){3}/I\n\n/()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n (.(.))/Ix\n    XY\\O400\n\n/(a*b|(?i:c*(?-i)d))/IS\n\n/()[ab]xyz/IS\n\n/(|)[ab]xyz/IS\n\n/(|c)[ab]xyz/IS\n\n/(|c?)[ab]xyz/IS\n\n/(d?|c?)[ab]xyz/IS\n\n/(d?|c)[ab]xyz/IS\n\n/^a*b\\d/DZ\n\n/^a*+b\\d/DZ\n\n/^a*?b\\d/DZ\n\n/^a+A\\d/DZ\n    aaaA5\n    ** Failers\n    aaaa5\n\n/^a*A\\d/IiDZ\n    aaaA5\n    aaaa5\n\n/(a*|b*)[cd]/IS\n\n/(a+|b*)[cd]/IS\n\n/(a*|b+)[cd]/IS\n\n/(a+|b+)[cd]/IS\n\n/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n (((\n a\n ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n )))\n/Ix\n  large nest\n\n/a*\\d/BZ\n\n/a*\\D/BZ\n\n/0*\\d/BZ\n\n/0*\\D/BZ\n\n/a*\\s/BZ\n\n/a*\\S/BZ\n\n/ *\\s/BZ\n\n/ *\\S/BZ\n\n/a*\\w/BZ\n\n/a*\\W/BZ\n\n/=*\\w/BZ\n\n/=*\\W/BZ\n\n/\\d*a/BZ\n\n/\\d*2/BZ\n\n/\\d*\\d/BZ\n\n/\\d*\\D/BZ\n\n/\\d*\\s/BZ\n\n/\\d*\\S/BZ\n\n/\\d*\\w/BZ\n\n/\\d*\\W/BZ\n\n/\\D*a/BZ\n\n/\\D*2/BZ\n\n/\\D*\\d/BZ\n\n/\\D*\\D/BZ\n\n/\\D*\\s/BZ\n\n/\\D*\\S/BZ\n\n/\\D*\\w/BZ\n\n/\\D*\\W/BZ\n\n/\\s*a/BZ\n\n/\\s*2/BZ\n\n/\\s*\\d/BZ\n\n/\\s*\\D/BZ\n\n/\\s*\\s/BZ\n\n/\\s*\\S/BZ\n\n/\\s*\\w/BZ\n\n/\\s*\\W/BZ\n\n/\\S*a/BZ\n\n/\\S*2/BZ\n\n/\\S*\\d/BZ\n\n/\\S*\\D/BZ\n\n/\\S*\\s/BZ\n\n/\\S*\\S/BZ\n\n/\\S*\\w/BZ\n\n/\\S*\\W/BZ\n\n/\\w*a/BZ\n\n/\\w*2/BZ\n\n/\\w*\\d/BZ\n\n/\\w*\\D/BZ\n\n/\\w*\\s/BZ\n\n/\\w*\\S/BZ\n\n/\\w*\\w/BZ\n\n/\\w*\\W/BZ\n\n/\\W*a/BZ\n\n/\\W*2/BZ\n\n/\\W*\\d/BZ\n\n/\\W*\\D/BZ\n\n/\\W*\\s/BZ\n\n/\\W*\\S/BZ\n\n/\\W*\\w/BZ\n\n/\\W*\\W/BZ\n\n/[^a]+a/BZ\n\n/[^a]+a/BZi\n\n/[^a]+A/BZi\n\n/[^a]+b/BZ\n\n/[^a]+\\d/BZ\n\n/a*[^a]/BZ\n\n/(?P<abc>x)(?P<xyz>y)/I\n    xy\\Cabc\\Cxyz\n\n/(?<abc>x)(?'xyz'y)/I\n    xy\\Cabc\\Cxyz\n\n/(?<abc'x)(?'xyz'y)/I\n\n/(?<abc>x)(?'xyz>y)/I\n\n/(?P'abc'x)(?P<xyz>y)/I\n\n/^(?:(?(ZZ)a|b)(?<ZZ>X))+/\n    bXaX\n    bXbX\n    ** Failers\n    aXaX\n    aXbX\n\n/^(?P>abc)(?<abcd>xxx)/\n\n/^(?P>abc)(?<abc>x|y)/\n    xx\n    xy\n    yy\n    yx\n\n/^(?P>abc)(?P<abc>x|y)/\n    xx\n    xy\n    yy\n    yx\n\n/^((?(abc)a|b)(?<abc>x|y))+/\n    bxay\n    bxby\n    ** Failers\n    axby\n\n/^(((?P=abc)|X)(?<abc>x|y))+/\n    XxXxxx\n    XxXyyx\n    XxXyxx\n    ** Failers\n    x\n\n/^(?1)(abc)/\n    abcabc\n\n/^(?:(?:\\1|X)(a|b))+/\n    Xaaa\n    Xaba\n\n/^[\\E\\Qa\\E-\\Qz\\E]+/BZ\n\n/^[a\\Q]bc\\E]/BZ\n\n/^[a-\\Q\\E]/BZ\n\n/^(?P>abc)[()](?<abc>)/BZ\n\n/^((?(abc)y)[()](?P<abc>x))+/BZ\n    (xy)x\n\n/^(?P>abc)\\Q()\\E(?<abc>)/BZ\n\n/^(?P>abc)[a\\Q(]\\E(](?<abc>)/BZ\n\n/^(?P>abc) # this is (a comment)\n  (?<abc>)/BZx\n\n/^\\W*(?:(?<one>(?<two>.)\\W*(?&one)\\W*\\k<two>|)|(?<three>(?<four>.)\\W*(?&three)\\W*\\k'four'|\\W*.\\W*))\\W*$/Ii\n    1221\n    Satan, oscillate my metallic sonatas!\n    A man, a plan, a canal: Panama!\n    Able was I ere I saw Elba.\n    *** Failers\n    The quick brown fox\n\n/(?=(\\w+))\\1:/I\n    abcd:\n\n/(?=(?'abc'\\w+))\\k<abc>:/I\n    abcd:\n\n/(?'abc'a|b)(?<abc>d|e)\\k<abc>{2}/J\n    adaa\n    ** Failers\n    addd\n    adbb\n\n/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/J\n    bdaa\n    bdab\n    ** Failers\n    bddd\n\n/(?(<bc))/\n\n/(?(''))/\n\n/(?('R')stuff)/\n\n/((abc (?(R) (?(R1)1) (?(R2)2) X  |  (?1)  (?2)   (?R) ))) /x\n    abcabc1Xabc2XabcXabcabc\n\n/(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x\n    abcabc1Xabc2XabcXabcabc\n\n/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x\n\n/^(?(DEFINE) abc | xyz ) /x\n\n/(?(DEFINE) abc) xyz/xI\n\n/(a|)*\\d/\n  \\O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  \\O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/^a.b/<lf>\n    a\\rb\n    a\\nb\\<cr>\n    a\\x85b\\<anycrlf> \n    ** Failers\n    a\\nb\n    a\\nb\\<any>\n    a\\rb\\<cr>\n    a\\rb\\<any>\n    a\\x85b\\<any> \n    a\\rb\\<anycrlf>\n\n/^abc./mgx<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x85abc7 JUNK\n\n/abc.$/mgx<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc7 abc9\n\n/a/<cr><any>\n\n/a/<any><crlf>\n\n/^a\\Rb/<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b\n    ** Failers\n    a\\n\\rb\n\n/^a\\R*b/<bsr_unicode>\n    ab\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b\n    a\\n\\rb\n    a\\n\\r\\x85\\x0cb\n\n/^a\\R+b/<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b\n    a\\n\\rb\n    a\\n\\r\\x85\\x0cb\n    ** Failers\n    ab\n\n/^a\\R{1,3}b/<bsr_unicode>\n    a\\nb\n    a\\n\\rb\n    a\\n\\r\\x85b\n    a\\r\\n\\r\\nb\n    a\\r\\n\\r\\n\\r\\nb\n    a\\n\\r\\n\\rb\n    a\\n\\n\\r\\nb\n    ** Failers\n    a\\n\\n\\n\\rb\n    a\\r\n\n/^a[\\R]b/<bsr_unicode>\n    aRb\n    ** Failers\n    a\\nb\n\n/(?&abc)X(?<abc>P)/I\n    abcPXP123\n\n/(?1)X(?<abc>P)/I\n    abcPXP123\n\n/(?:a(?&abc)b)*(?<abc>x)/\n    123axbaxbaxbx456\n    123axbaxbaxb456\n\n/(?:a(?&abc)b){1,5}(?<abc>x)/\n    123axbaxbaxbx456\n\n/(?:a(?&abc)b){2,5}(?<abc>x)/\n    123axbaxbaxbx456\n\n/(?:a(?&abc)b){2,}(?<abc>x)/\n    123axbaxbaxbx456\n\n/(abc)(?i:(?1))/\n   defabcabcxyz\n   DEFabcABCXYZ\n\n/(abc)(?:(?i)(?1))/\n   defabcabcxyz\n   DEFabcABCXYZ\n\n/^(a)\\g-2/\n\n/^(a)\\g/\n\n/^(a)\\g{0}/\n\n/^(a)\\g{3/\n\n/^(a)\\g{aa}/\n\n/^a.b/<lf>\n    a\\rb\n    *** Failers\n    a\\nb\n\n/.+foo/\n    afoo\n    ** Failers\n    \\r\\nfoo\n    \\nfoo\n\n/.+foo/<crlf>\n    afoo\n    \\nfoo\n    ** Failers\n    \\r\\nfoo\n\n/.+foo/<any>\n    afoo\n    ** Failers\n    \\nfoo\n    \\r\\nfoo\n\n/.+foo/s\n    afoo\n    \\r\\nfoo\n    \\nfoo\n    \n/^$/mg<any>\n    abc\\r\\rxyz\n    abc\\n\\rxyz  \n    ** Failers \n    abc\\r\\nxyz\n\n/(?m)^$/<any>g+\n    abc\\r\\n\\r\\n\n\n/(?m)^$|^\\r\\n/<any>g+ \n    abc\\r\\n\\r\\n\n    \n/(?m)$/<any>g+ \n    abc\\r\\n\\r\\n\n\n/abc.$/mgx<anycrlf>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc9\n\n/^X/m\n    XABC\n    ** Failers \n    XABC\\B\n\n/(ab|c)(?-1)/BZ\n    abc\n\n/xy(?+1)(abc)/BZ\n    xyabcabc\n    ** Failers\n    xyabc  \n    \n/x(?-0)y/\n\n/x(?-1)y/\n\n/x(?+0)y/ \n\n/x(?+1)y/\n\n/^(abc)?(?(-1)X|Y)/BZ\n    abcX\n    Y\n    ** Failers\n    abcY   \n    \n/^((?(+1)X|Y)(abc))+/BZ \n    YabcXabc\n    YabcXabcXabc\n    ** Failers\n    XabcXabc  \n\n/(?(-1)a)/BZ\n\n/((?(-1)a))/BZ\n\n/((?(-2)a))/BZ\n\n/^(?(+1)X|Y)(.)/BZ\n    Y!\n\n/(?<A>tom|bon)-\\k{A}/\n    tom-tom\n    bon-bon \n    ** Failers\n    tom-bon  \n\n/\\g{A/ \n\n/(?|(abc)|(xyz))/BZ\n   >abc<\n   >xyz< \n\n/(x)(?|(abc)|(xyz))(x)/BZ\n    xabcx\n    xxyzx \n\n/(x)(?|(abc)(pqr)|(xyz))(x)/BZ\n    xabcpqrx\n    xxyzx \n\n/\\H++X/BZ\n    ** Failers\n    XXXX\n    \n/\\H+\\hY/BZ\n    XXXX Y \n\n/\\H+ Y/BZ\n\n/\\h+A/BZ\n\n/\\v*B/BZ\n\n/\\V+\\x0a/BZ\n\n/A+\\h/BZ\n\n/ *\\H/BZ\n\n/A*\\v/BZ\n\n/\\x0b*\\V/BZ\n\n/\\d+\\h/BZ\n\n/\\d*\\v/BZ\n\n/S+\\h\\S+\\v/BZ\n\n/\\w{3,}\\h\\w+\\v/BZ\n\n/\\h+\\d\\h+\\w\\h+\\S\\h+\\H/BZ\n\n/\\v+\\d\\v+\\w\\v+\\S\\v+\\V/BZ\n\n/\\H+\\h\\H+\\d/BZ\n\n/\\V+\\v\\V+\\w/BZ\n\n/\\( (?: [^()]* | (?R) )* \\)/x\n\\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\n\n/[\\E]AAA/\n\n/[\\Q\\E]AAA/\n\n/[^\\E]AAA/\n\n/[^\\Q\\E]AAA/\n\n/[\\E^]AAA/\n\n/[\\Q\\E^]AAA/\n\n/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ\n\n/^a+(*FAIL)/C\n    aaaaaa\n    \n/a+b?c+(*FAIL)/C\n    aaabccc\n\n/a+b?(*PRUNE)c+(*FAIL)/C\n    aaabccc\n\n/a+b?(*COMMIT)c+(*FAIL)/C\n    aaabccc\n    \n/a+b?(*SKIP)c+(*FAIL)/C\n    aaabcccaaabccc\n\n/a+b?(*THEN)c+(*FAIL)/C\n    aaabccc\n    \n/a(*MARK)b/ \n\n/(?i:A{1,}\\6666666666)/\n\n/\\g6666666666/\n\n/[\\g6666666666]/BZ\n\n/(?1)\\c[/\n\n/.+A/<crlf>\n    \\r\\nA\n    \n/\\nA/<crlf>\n    \\r\\nA \n\n/[\\r\\n]A/<crlf>\n    \\r\\nA \n\n/(\\r|\\n)A/<crlf>\n    \\r\\nA \n\n/a(*CR)b/\n\n/(*CR)a.b/\n    a\\nb\n    ** Failers\n    a\\rb  \n\n/(*CR)a.b/<lf>\n    a\\nb\n    ** Failers\n    a\\rb  \n\n/(*LF)a.b/<CRLF>\n    a\\rb\n    ** Failers\n    a\\nb  \n\n/(*CRLF)a.b/\n    a\\rb\n    a\\nb  \n    ** Failers\n    a\\r\\nb  \n\n/(*ANYCRLF)a.b/<CR>\n    ** Failers\n    a\\rb\n    a\\nb  \n    a\\r\\nb  \n\n/(*ANY)a.b/<cr>\n    ** Failers\n    a\\rb\n    a\\nb  \n    a\\r\\nb  \n    a\\x85b \n    \n/(*ANY).*/g\n    abc\\r\\ndef\n\n/(*ANYCRLF).*/g\n    abc\\r\\ndef\n\n/(*CRLF).*/g\n    abc\\r\\ndef\n\n/a\\Rb/I<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x85b\n    a\\x0bb     \n\n/a\\Rb/I<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x85b\n    a\\x0bb     \n    ** Failers \n    a\\x85b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R?b/I<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x85b\n    a\\x0bb     \n\n/a\\R?b/I<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x85b\n    a\\x0bb     \n    ** Failers \n    a\\x85b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R{2,4}b/I<bsr_anycrlf>\n    a\\r\\n\\nb\n    a\\n\\r\\rb\n    a\\r\\n\\r\\n\\r\\n\\r\\nb\n    ** Failers\n    a\\x85\\85b\n    a\\x0b\\0bb     \n\n/a\\R{2,4}b/I<bsr_unicode>\n    a\\r\\rb\n    a\\n\\n\\nb\n    a\\r\\n\\n\\r\\rb\n    a\\x85\\85b\n    a\\x0b\\0bb     \n    ** Failers \n    a\\r\\r\\r\\r\\rb \n    a\\x85\\85b\\<bsr_anycrlf>\n    a\\x0b\\0bb\\<bsr_anycrlf>\n \n/(*BSR_ANYCRLF)a\\Rb/I\n    a\\nb\n    a\\rb \n\n/(*BSR_UNICODE)a\\Rb/I\n    a\\x85b\n\n/(*BSR_ANYCRLF)(*CRLF)a\\Rb/I\n    a\\nb\n    a\\rb \n\n/(*CRLF)(*BSR_UNICODE)a\\Rb/I\n    a\\x85b\n\n/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I\n\n/(?<a>)(?&)/\n\n/(?<abc>)(?&a)/\n\n/(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/\n\n/(?+-a)/\n\n/(?-+a)/\n\n/(?(-1))/\n\n/(?(+10))/\n\n/(?(10))/\n\n/(?(+2))()()/\n\n/(?(2))()()/\n\n/\\k''/\n\n/\\k<>/\n\n/\\k{}/\n\n/\\k/\n\n/\\kabc/\n\n/(?P=)/\n\n/(?P>)/\n\n/(?!\\w)(?R)/\n\n/(?=\\w)(?R)/\n\n/(?<!\\w)(?R)/\n\n/(?<=\\w)(?R)/\n\n/[[:foo:]]/\n\n/[[:1234:]]/\n\n/[[:f\\oo:]]/\n\n/[[: :]]/\n\n/[[:...:]]/\n\n/[[:l\\ower:]]/\n\n/[[:abc\\:]]/\n\n/[abc[:x\\]pqr:]]/\n\n/[[:a\\dz:]]/\n\n/(^(a|b\\g<-1'c))/\n\n/^(?+1)(?<a>x|y){0}z/\n    xzxx\n    yzyy \n    ** Failers\n    xxz  \n\n/(\\3)(\\1)(a)/\n    cat\n\n/(\\3)(\\1)(a)/<JS>\n    cat\n    \n/TA]/\n    The ACTA] comes \n\n/TA]/<JS>\n    The ACTA] comes \n\n/(?2)[]a()b](abc)/\n    abcbabc\n\n/(?2)[^]a()b](abc)/\n    abcbabc\n\n/(?1)[]a()b](abc)/\n    abcbabc\n    ** Failers \n    abcXabc\n\n/(?1)[^]a()b](abc)/\n    abcXabc\n    ** Failers \n    abcbabc\n\n/(?2)[]a()b](abc)(xyz)/\n    xyzbabcxyz\n\n/(?&N)[]a(?<N>)](?<M>abc)/\n   abc<abc\n\n/(?&N)[]a(?<N>)](abc)/\n   abc<abc\n\n/a[]b/\n\n/a[^]b/\n\n/a[]b/<JS>\n    ** Failers\n    ab\n\n/a[]+b/<JS>\n    ** Failers\n    ab \n\n/a[]*+b/<JS>\n    ** Failers\n    ab \n\n/a[^]b/<JS>\n    aXb\n    a\\nb \n    ** Failers\n    ab  \n    \n/a[^]+b/<JS> \n    aXb\n    a\\nX\\nXb \n    ** Failers\n    ab  \n\n/a(?!)b/BZ\n\n/(?!)?a/BZ\n    ab\n\n/a(*FAIL)+b/\n\n/(abc|pqr|123){0}[xyz]/SI\n\n/(?(?=.*b)b|^)/CI\n   adc\n   abc \n   \n/(?(?=b).*b|^d)/I\n\n/(?(?=.*b).*b|^d)/I\n\n/xyz/C\n  xyz \n  abcxyz \n  abcxyz\\Y\n  ** Failers \n  abc\n  abc\\Y\n  abcxypqr  \n  abcxypqr\\Y  \n  \n/(*NO_START_OPT)xyz/C\n  abcxyz\n  \n/(*NO_AUTO_POSSESS)a+b/BZ  \n\n/xyz/CY\n  abcxyz \n\n/^\"((?(?=[a])[^\"])|b)*\"$/C\n    \"ab\"\n\n/^\"((?(?=[a])[^\"])|b)*\"$/\n    \"ab\"\n\n/^X(?5)(a)(?|(b)|(q))(c)(d)Y/\n    XYabcdY\n\n/^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/\n    XYabcdY\n \n/Xa{2,4}b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/Xa{2,4}?b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/Xa{2,4}+b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\d{2,4}b/\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n    \n/X\\d{2,4}?b/\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n    \n/X\\d{2,4}+b/\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n    \n/X\\D{2,4}b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\D{2,4}?b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\D{2,4}+b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[abc]{2,4}b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[abc]{2,4}?b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[abc]{2,4}+b/\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[^a]{2,4}b/\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n    \n/X[^a]{2,4}?b/\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n    \n/X[^a]{2,4}+b/\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n    \n/(Y)X\\1{2,4}b/\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n    \n/(Y)X\\1{2,4}?b/\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n    \n/(Y)X\\1{2,4}+b/\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n    \n/\\++\\KZ|\\d+X|9+Y/\n    ++++123999\\P\n    ++++123999Y\\P\n    ++++Z1234\\P \n\n/Z(*F)/\n    Z\\P\n    ZA\\P \n    \n/Z(?!)/\n    Z\\P \n    ZA\\P \n\n/dog(sbody)?/\n    dogs\\P\n    dogs\\P\\P \n    \n/dog(sbody)??/\n    dogs\\P\n    dogs\\P\\P \n\n/dog|dogsbody/\n    dogs\\P\n    dogs\\P\\P \n \n/dogsbody|dog/\n    dogs\\P\n    dogs\\P\\P \n\n/\\bthe cat\\b/\n    the cat\\P\n    the cat\\P\\P\n\n/abc/\n   abc\\P\n   abc\\P\\P\n   \n/abc\\K123/\n    xyzabc123pqr\n    xyzabc12\\P\n    xyzabc12\\P\\P\n    \n/(?<=abc)123/\n    xyzabc123pqr \n    xyzabc12\\P\n    xyzabc12\\P\\P\n\n/\\babc\\b/\n    +++abc+++\n    +++ab\\P\n    +++ab\\P\\P  \n\n/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\\w*+))/BZ\n\n/(?&word)(?&element)(?(DEFINE)(?<element><[^\\d][^>]>[^<])(?<word>\\w*+))/BZ\n\n/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ\n\n/abc\\K/+\n    abcdef\n    abcdef\\N\\N\n    xyzabcdef\\N\\N\n    ** Failers\n    abcdef\\N \n    xyzabcdef\\N\n    \n/^(?:(?=abc)|abc\\K)/+\n    abcdef\n    abcdef\\N\\N \n    ** Failers \n    abcdef\\N \n\n/a?b?/+\n    xyz\n    xyzabc\n    xyzabc\\N\n    xyzabc\\N\\N\n    xyz\\N\\N    \n    ** Failers \n    xyz\\N \n\n/^a?b?/+\n    xyz\n    xyzabc\n    ** Failers \n    xyzabc\\N\n    xyzabc\\N\\N\n    xyz\\N\\N    \n    xyz\\N \n    \n/^(?<name>a|b\\g<name>c)/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/^(?<name>a|b\\g'name'c)/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/^(a|b\\g<1>c)/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/^(a|b\\g'1'c)/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/^(a|b\\g'-1'c)/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/(^(a|b\\g<-1>c))/\n    aaaa\n    bacxxx\n    bbaccxxx \n    bbbacccxx\n\n/(?-i:\\g<name>)(?i:(?<name>a))/\n    XaaX\n    XAAX \n\n/(?i:\\g<name>)(?-i:(?<name>a))/\n    XaaX\n    ** Failers \n    XAAX \n\n/(?-i:\\g<+1>)(?i:(a))/\n    XaaX\n    XAAX \n\n/(?=(?<regex>(?#simplesyntax)\\$(?<name>[a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*)(?:\\[(?<index>[a-zA-Z0-9_\\x{7f}-\\x{ff}]+|\\$\\g<name>)\\]|->\\g<name>(\\(.*?\\))?)?|(?#simple syntax withbraces)\\$\\{(?:\\g<name>(?<indices>\\[(?:\\g<index>|'(?:\\\\.|[^'\\\\])*'|\"(?:\\g<regex>|\\\\.|[^\"\\\\])*\")\\])?|\\g<complex>|\\$\\{\\g<complex>\\})\\}|(?#complexsyntax)\\{(?<complex>\\$(?<segment>\\g<name>(\\g<indices>*|\\(.*?\\))?)(?:->\\g<segment>)*|\\$\\g<complex>|\\$\\{\\g<complex>\\})\\}))\\{/\n\n/(?<n>a|b|c)\\g<n>*/\n   abc\n   accccbbb \n\n/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/\n    XYabcdY\n\n/(?<=b(?1)|zzz)(a)/\n    xbaax\n    xzzzax \n\n/(a)(?<=b\\1)/\n\n/(a)(?<=b+(?1))/\n\n/(a+)(?<=b(?1))/\n\n/(a(?<=b(?1)))/\n\n/(?<=b(?1))xyz/\n\n/(?<=b(?1))xyz(b+)pqrstuvew/\n\n/(a|bc)\\1/SI\n\n/(a|bc)\\1{2,3}/SI\n\n/(a|bc)(?1)/SI\n\n/(a|b\\1)(a|b\\1)/SI\n\n/(a|b\\1){2}/SI\n\n/(a|bbbb\\1)(a|bbbb\\1)/SI\n\n/(a|bbbb\\1){2}/SI\n\n/^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]/SI\n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/isIS\n\n\"(?>.*/)foo\"SI\n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /xSI\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI\n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI\n\n/<a[\\s]+href[\\s]*=[\\s]*          # find <a href=\n ([\\\"\\'])?                       # find single or double quote\n (?(1) (.*?)\\1 | ([^\\s]+))       # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isxSI\n\n/^(?!:)                       # colon disallowed at start\n  (?:                         # start of item\n    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or\n    (?(1)0 | () ) )           # if null previously matched, fail; else null\n    :                         # followed by colon\n  ){1,7}                      # end item; 1-7 of them required               \n  [0-9a-f]{1,4} $             # final hex number at end of string\n  (?(1)|.)                    # check that there was an empty component\n  /xiIS\n\n/(?|(?<a>A)|(?<a>B))/I\n    AB\\Ca\n    BA\\Ca\n\n/(?|(?<a>A)|(?<b>B))/ \n\n/(?:a(?<quote> (?<apostrophe>')|(?<realquote>\")) |\n    b(?<quote> (?<apostrophe>')|(?<realquote>\")) ) \n    (?('quote')[a-z]+|[0-9]+)/JIx\n    a\"aaaaa\n    b\"aaaaa \n    ** Failers \n    b\"11111\n    a\"11111 \n    \n/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/JDZx\n    abcdX\n    eX\n    ** Failers\n    abcdY\n    ey     \n    \n/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/JDZx\n    abcdd\n    ** Failers\n    abcdde  \n\n/abcd*/\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n\n/abcd*/i\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n    XXXXABCD\\P\n    XXXXABCD\\P\\P\n\n/abc\\d*/\n    xxxxabc1\\P\n    xxxxabc1\\P\\P\n\n/(a)bc\\1*/\n    xxxxabca\\P\n    xxxxabca\\P\\P\n\n/abc[de]*/\n    xxxxabcde\\P\n    xxxxabcde\\P\\P\n\n/-- This is not in the Perl-compatible test because Perl seems currently to be\n    broken and not behaving as specified in that it *does* bumpalong after\n    hitting (*COMMIT). --/\n\n/(?1)(A(*COMMIT)|B)D/\n    ABD\n    XABD\n    BAD\n    ABXABD  \n    ** Failers \n    ABX \n    BAXBAD  \n\n/(\\3)(\\1)(a)/<JS>\n    cat\n\n/(\\3)(\\1)(a)/SI<JS>\n    cat\n\n/(\\3)(\\1)(a)/SI\n    cat\n\n/i(?(DEFINE)(?<s>a))/SI\n    i\n    \n/()i(?(1)a)/SI \n    ia\n\n/(?i)a(?-i)b|c/BZ\n    XabX\n    XAbX\n    CcC \n    ** Failers\n    XABX   \n\n/(?i)a(?s)b|c/BZ\n\n/(?i)a(?s-i)b|c/BZ\n\n/^(ab(c\\1)d|x){2}$/BZ\n    xabcxd\n    \n/^(?&t)*+(?(DEFINE)(?<t>.))$/BZ\n\n/^(?&t)*(?(DEFINE)(?<t>.))$/BZ\n\n/ -- This one is here because Perl gives the match as \"b\" rather than \"ab\". I\n     believe this to be a Perl bug. --/  \n      \n/(?>a\\Kb)z|(ab)/\n    ab \n\n/(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/\n\n/abc(*MARK:)pqr/\n\n/abc(*:)pqr/\n\n/abc(*FAIL:123)xyz/\n\n/--- This should, and does, fail. In Perl, it does not, which I think is a \n     bug because replacing the B in the pattern by (B|D) does make it fail. ---/\n\n/A(*COMMIT)B/+K\n    ACABX\n\n/--- These should be different, but in Perl they are not, which I think\n     is a bug in Perl. ---/\n\n/A(*THEN)B|A(*THEN)C/K\n    AC\n\n/A(*PRUNE)B|A(*PRUNE)C/K\n    AC\n    \n/--- Mark names can be duplicated. Perl doesn't give a mark for this one,\nthough PCRE does. ---/\n\n/^A(*:A)B|^X(*:A)Y/K\n    ** Failers\n    XAQQ\n    \n/--- COMMIT at the start of a pattern should be the same as an anchor. Perl \noptimizations defeat this. So does the PCRE optimization unless we disable it \nwith \\Y. ---/\n\n/(*COMMIT)ABC/\n    ABCDEFG\n    ** Failers\n    DEFGABC\\Y  \n    \n/^(ab (c+(*THEN)cd) | xyz)/x\n    abcccd  \n\n/^(ab (c+(*PRUNE)cd) | xyz)/x\n    abcccd  \n\n/^(ab (c+(*FAIL)cd) | xyz)/x\n    abcccd  \n    \n/--- Perl gets some of these wrong ---/ \n\n/(?>.(*ACCEPT))*?5/\n    abcde\n\n/(.(*ACCEPT))*?5/\n    abcde\n\n/(.(*ACCEPT))5/\n    abcde\n\n/(.(*ACCEPT))*5/\n    abcde\n\n/A\\NB./BZ\n    ACBD\n    *** Failers\n    A\\nB\n    ACB\\n   \n\n/A\\NB./sBZ\n    ACBD\n    ACB\\n \n    *** Failers\n    A\\nB  \n  \n/A\\NB/<crlf>\n    A\\nB\n    A\\rB\n    ** Failers\n    A\\r\\nB    \n\n/\\R+b/BZ\n\n/\\R+\\n/BZ\n\n/\\R+\\d/BZ\n\n/\\d*\\R/BZ\n\n/\\s*\\R/BZ\n    \\x20\\x0a\n    \\x20\\x0d\n    \\x20\\x0d\\x0a\n\n/\\S*\\R/BZ\n    a\\x0a\n\n/X\\h*\\R/BZ\n    X\\x20\\x0a\n\n/X\\H*\\R/BZ\n    X\\x0d\\x0a\n\n/X\\H+\\R/BZ\n    X\\x0d\\x0a\n\n/X\\H++\\R/BZ\n    X\\x0d\\x0a\n\n/(?<=abc)def/\n    abc\\P\\P\n\n/abc$/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc$/m\n    abc\n    abc\\n\n    abc\\P\\P\n    abc\\n\\P\\P \n    abc\\P\n    abc\\n\\P\n\n/abc\\z/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\Z/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\b/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\B/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/.+/\n    abc\\>0\n    abc\\>1\n    abc\\>2\n    abc\\>3\n    abc\\>4\n    abc\\>-4 \n\n/^\\cģ/\n\n/(?P<abn>(?P=abn)xxx)/BZ\n\n/(a\\1z)/BZ\n\n/(?P<abn>(?P=abn)(?<badstufxxx)/BZ\n\n/(?P<abn>(?P=axn)xxx)/BZ\n\n/(?P<abn>(?P=axn)xxx)(?<axn>yy)/BZ\n\n/-- These tests are here because Perl gets the first one wrong. --/\n\n/(\\R*)(.)/s\n    \\r\\n\n    \\r\\r\\n\\n\\r \n    \\r\\r\\n\\n\\r\\n \n\n/(\\R)*(.)/s\n    \\r\\n\n    \\r\\r\\n\\n\\r \n    \\r\\r\\n\\n\\r\\n \n\n/((?>\\r\\n|\\n|\\x0b|\\f|\\r|\\x85)*)(.)/s\n    \\r\\n\n    \\r\\r\\n\\n\\r \n    \\r\\r\\n\\n\\r\\n \n\n/-- --/\n\n/^abc$/BZ\n\n/^abc$/BZm\n\n/^(a)*+(\\w)/S\n    aaaaX\n    ** Failers \n    aaaa\n\n/^(?:a)*+(\\w)/S\n    aaaaX\n    ** Failers \n    aaaa\n\n/(a)++1234/SDZ\n\n/([abc])++1234/SI\n\n/(?<=(abc)+)X/\n\n/(^ab)/I\n\n/(^ab)++/I\n\n/(^ab|^)+/I\n\n/(^ab|^)++/I\n\n/(?:^ab)/I\n\n/(?:^ab)++/I\n\n/(?:^ab|^)+/I\n\n/(?:^ab|^)++/I\n\n/(.*ab)/I\n\n/(.*ab)++/I\n\n/(.*ab|.*)+/I\n\n/(.*ab|.*)++/I\n\n/(?:.*ab)/I\n\n/(?:.*ab)++/I\n\n/(?:.*ab|.*)+/I\n\n/(?:.*ab|.*)++/I\n\n/(?=a)[bcd]/I\n\n/((?=a))[bcd]/I\n\n/((?=a))+[bcd]/I\n\n/((?=a))++[bcd]/I\n\n/(?=a+)[bcd]/iI\n\n/(?=a+?)[bcd]/iI\n\n/(?=a++)[bcd]/iI\n\n/(?=a{3})[bcd]/iI\n\n/(abc)\\1+/S\n\n/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/\n\n/(?1)(?:(b(*ACCEPT))){0}/\n    b\n\n/(?1)(?:(b(*ACCEPT))){0}c/\n    bc\n    ** Failers \n    b \n\n/(?1)(?:((*ACCEPT))){0}c/\n    c\n    c\\N \n\n/^.*?(?(?=a)a|b(*THEN)c)/\n    ba\n\n/^.*?(?(?=a)a|bc)/\n    ba\n\n/^.*?(?(?=a)a(*THEN)b|c)/\n    ac\n\n/^.*?(?(?=a)a(*THEN)b)c/\n    ac\n\n/^.*?(a(*THEN)b)c/\n    aabc\n    \n/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x\n    aabc\n\n/^.*?(a(*THEN)b|z)c/\n    aabc\n\n/^.*?(z|a(*THEN)b)c/\n    aabc\n\n/-- --/\n\n/-- These studied versions are here because they are not Perl-compatible; the\n    studying means the mark is not seen. --/\n\n/(*MARK:A)(*SKIP:B)(C|X)/KS\n    C\n    D\n     \n/(*:A)A+(*SKIP:A)(B|Z)/KS\n    AAAC\n\n/-- --/\n\n\"(?=a*(*ACCEPT)b)c\"\n    c\n    c\\N \n    \n/(?1)c(?(DEFINE)((*ACCEPT)b))/\n    c\n    c\\N  \n    \n/(?>(*ACCEPT)b)c/\n    c\n    c\\N  \n\n/(?:(?>(a)))+a%/++\n    %aa%\n\n/(a)b|ac/++SS\n    ac\\O3\n    \n/(a)(b)x|abc/++\n     abc\\O6\n\n/(a)bc|(a)(b)\\2/\n    \\O3abc\n    \\O4abc \n\n/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI\n\n/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI\n\n/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI\n\n/(abc)(?1)/SI\n\n/^(?>a)++/\n    aa\\M\n    aaaaaaaaa\\M \n    \n/(a)(?1)++/\n    aa\\M\n    aaaaaaaaa\\M  \n\n/(?:(foo)|(bar)|(baz))X/SS=\n    bazfooX\n    foobazbarX\n    barfooX\n    bazX\n    foobarbazX    \n    bazfooX\\O0\n    bazfooX\\O2\n    bazfooX\\O4\n    bazfooX\\O6\n    bazfooX\\O8\n    bazfooX\\O10\n\n/(?=abc){3}abc/BZ\n\n/(?=abc)+abc/BZ\n\n/(?=abc)++abc/BZ\n\n/(?=abc){0}xyz/BZ\n\n/(?=(a))?./BZ\n\n/(?=(a))??./BZ\n\n/^(?=(a)){0}b(?1)/BZ\n\n/(?(DEFINE)(a))?b(?1)/BZ\n\n/^(?=(?1))?[az]([abc])d/BZ\n\n/^(?!a){0}\\w+/BZ\n\n/(?<=(abc))?xyz/BZ\n\n/[:a[:abc]b:]/BZ\n\n/((?2))((?1))/SS\n    abc\n\n/((?(R2)a+|(?1)b))/SS\n    aaaabcde\n\n/(?(R)a*(?1)|((?R))b)/SS\n    aaaabcde\n\n/(a+|(?R)b)/\n\n/^(a(*:A)(d|e(*:B))z|aeq)/C\n    adz\n    aez\n    aeqwerty\n\n/.(*F)/\n    \\P\\Pabc\n\n/\\btype\\b\\W*?\\btext\\b\\W*?\\bjavascript\\b/IS\n\n/\\btype\\b\\W*?\\btext\\b\\W*?\\bjavascript\\b|\\burl\\b\\W*?\\bshell:|<input\\b.*?\\btype\\b\\W*?\\bimage\\b|\\bonkeyup\\b\\W*?\\=/IS\n\n/a(*SKIP)c|b(*ACCEPT)|/+S!I\n    a\n\n/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/SI\n    ax\n\n'a*(*ACCEPT)b'+\n    \\N\\N\n    abc\\N\\N\n    bbb\\N\\N \n\n/(*ACCEPT)a/+I\n    bax\n\n/z(*ACCEPT)a/+I\n    baxzbx\n\n/a(?:.)*?a/ims                                                                  \n    \\Mabbbbbbbbbbbbbbbbbbbbba\n    \n/a(?:.(*THEN))*?a/ims\n    \\Mabbbbbbbbbbbbbbbbbbbbba\n\n/a(?:.(*THEN:ABC))*?a/ims\n    \\Mabbbbbbbbbbbbbbbbbbbbba\n\n/^(?>a+)(?>(z+))\\w/BZ\n    aaaazzzzb\n    ** Failers\n    aazz  \n\n/(.)(\\1|a(?2))/\n    bab\n    \n/\\1|(.)(?R)\\1/\n    cbbbc\n    \n/(.)((?(1)c|a)|a(?2))/\n    baa  \n\n/(?P<abn>(?P=abn)xxx)/BZ\n\n/(a\\1z)/BZ\n\n/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/\n     \\Maabbccddee\n\n/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/\n     \\Maabbccddee\n\n/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/\n     \\Maabbccddee\n\n/^a\\x41z/<JS>\n    aAz\n    *** Failers\n    ax41z\n\n/^a[m\\x41]z/<JS>\n    aAz\n\n/^a\\x1z/<JS>\n    ax1z\n\n/^a\\u0041z/<JS>\n    aAz\n    *** Failers\n    au0041z\n\n/^a[m\\u0041]z/<JS>\n    aAz\n\n/^a\\u041z/<JS>\n    au041z\n    *** Failers\n    aAz\n\n/^a\\U0041z/<JS>\n    aU0041z\n    *** Failers\n    aAz\n\n/(?(?=c)c|d)++Y/BZ\n\n/(?(?=c)c|d)*+Y/BZ\n\n/a[\\NB]c/\n    aNc\n    \n/a[B-\\Nc]/ \n\n/a[B\\Nc]/ \n\n/(a)(?2){0,1999}?(b)/\n\n/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/\n\n/--- This test, with something more complicated than individual letters, causes\ndifferent behaviour in Perl. Perhaps it disables some optimization; no tag is\npassed back for the failures, whereas in PCRE there is a tag. ---/\n    \n/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK\n    AABC\n    XXYZ \n    ** Failers\n    XAQQ  \n    XAQQXZZ  \n    AXQQQ \n    AXXQQQ \n\n/-- Perl doesn't give marks for these, though it does if the alternatives are\nreplaced by single letters. --/\n    \n/(b|q)(*:m)f|a(*:n)w/K\n    aw \n    ** Failers \n    abc\n\n/(q|b)(*:m)f|a(*:n)w/K\n    aw \n    ** Failers \n    abc\n\n/-- After a partial match, the behaviour is as for a failure. --/\n\n/^a(*:X)bcde/K\n   abc\\P\n   \n/-- These are here because Perl doesn't return a mark, except for the first --/\n\n/(?=(*:x))(q|)/K+\n    abc\n\n/(?=(*:x))((*:y)q|)/K+\n    abc\n\n/(?=(*:x))(?:(*:y)q|)/K+\n    abc\n\n/(?=(*:x))(?>(*:y)q|)/K+\n    abc\n\n/(?=a(*:x))(?!a(*:y)c)/K+\n    ab\n\n/(?=a(*:x))(?=a(*:y)c|)/K+\n    ab\n\n/(..)\\1/\n    ab\\P\n    aba\\P\n    abab\\P\n\n/(..)\\1/i\n    ab\\P\n    abA\\P\n    aBAb\\P\n\n/(..)\\1{2,}/\n    ab\\P\n    aba\\P\n    abab\\P\n    ababa\\P\n    ababab\\P\n    ababab\\P\\P\n    abababa\\P\n    abababa\\P\\P\n\n/(..)\\1{2,}/i\n    ab\\P\n    aBa\\P\n    aBAb\\P\n    AbaBA\\P\n    abABAb\\P\n    aBAbaB\\P\\P\n    abABabA\\P\n    abaBABa\\P\\P\n\n/(..)\\1{2,}?x/i\n    ab\\P\n    abA\\P\n    aBAb\\P\n    abaBA\\P\n    abAbaB\\P\n    abaBabA\\P\n    abAbABaBx\\P\n\n/^(..)\\1/\n    aba\\P\n\n/^(..)\\1{2,3}x/\n    aba\\P\n    ababa\\P\n    ababa\\P\\P\n    abababx\n    ababababx  \n\n/^(..)\\1{2,3}?x/\n    aba\\P\n    ababa\\P\n    ababa\\P\\P\n    abababx\n    ababababx  \n    \n/^(..)(\\1{2,3})ab/\n    abababab\n\n/^\\R/\n    \\r\\P\n    \\r\\P\\P\n    \n/^\\R{2,3}x/\n    \\r\\P\n    \\r\\P\\P\n    \\r\\r\\P \n    \\r\\r\\P\\P\n    \\r\\r\\r\\P  \n    \\r\\r\\r\\P\\P\n    \\r\\rx\n    \\r\\r\\rx    \n\n/^\\R{2,3}?x/\n    \\r\\P\n    \\r\\P\\P\n    \\r\\r\\P \n    \\r\\r\\P\\P\n    \\r\\r\\r\\P  \n    \\r\\r\\r\\P\\P\n    \\r\\rx\n    \\r\\r\\rx    \n    \n/^\\R?x/\n    \\r\\P\n    \\r\\P\\P \n    x\n    \\rx  \n\n/^\\R+x/\n    \\r\\P\n    \\r\\P\\P \n    \\r\\n\\P\n    \\r\\n\\P\\P  \n    \\rx  \n\n/^a$/<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^a$/m<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^(a$|a\\r)/<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^(a$|a\\r)/m<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/./<CRLF>\n    \\r\\P\n    \\r\\P\\P \n  \n/.{2,3}/<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/.{2,3}?/<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n\"AB(C(D))(E(F))?(?(?=\\2)(?=\\4))\"\n    ABCDGHI\\O03\n    \n/-- These are all run as real matches in test 1; here we are just checking the\nsettings of the anchored and startline bits. --/ \n\n/(?>.*?a)(?<=ba)/I\n\n/(?:.*?a)(?<=ba)/I\n\n/.*?a(*PRUNE)b/I\n\n/.*?a(*PRUNE)b/sI\n\n/^a(*PRUNE)b/sI\n\n/.*?a(*SKIP)b/I\n\n/(?>.*?a)b/sI\n\n/(?>.*?a)b/I\n\n/(?>^a)b/sI\n\n/(?>.*?)(?<=(abcd)|(wxyz))/I\n\n/(?>.*)(?<=(abcd)|(wxyz))/I\n\n\"(?>.*)foo\"I\n\n\"(?>.*?)foo\"I\n\n/(?>^abc)/mI\n\n/(?>.*abc)/mI\n\n/(?:.*abc)/mI\n\n/-- Check PCRE_STUDY_EXTRA_NEEDED --/\n\n/.?/S-I\n\n/.?/S!I\n\n/(?:(a)+(?C1)bb|aa(?C2)b)/\n    aab\\C+\n   \n/(?:(a)++(?C1)bb|aa(?C2)b)/\n    aab\\C+ \n    \n/(?:(?>(a))(?C1)bb|aa(?C2)b)/\n    aab\\C+ \n\n/(?:(?1)(?C1)x|ab(?C2))((a)){0}/                                                \n    aab\\C+ \n\n/(?1)(?C1)((a)(?C2)){0}/   \n    aab\\C+ \n\n/(?:(a)+(?C1)bb|aa(?C2)b)++/\n    aab\\C+\n    aab\\C+\\O2\n\n/(ab)x|ab/\n    ab\\O3\n    ab\\O2 \n  \n/(ab)/\n    ab\\O3\n    ab\\O2 \n    \n/(?<=123)(*MARK:xx)abc/K\n    xxxx123a\\P\\P\n    xxxx123a\\P\n    \n/123\\Kabc/\n    xxxx123a\\P\\P\n    xxxx123a\\P\n\n/^(?(?=a)aa|bb)/C\n    bb\n\n/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/\n    bb\n\n/-- Perl seems to have a bug with this one --/\n\n/aaaaa(*COMMIT)(*PRUNE)b|a+c/\n    aaaaaac\n    \n/-- Here are some that Perl treats differently because of the way it handles\nbacktracking verbs. --/\n\n /(?!a(*COMMIT)b)ac|ad/\n     ac\n     ad \n\n/^(?!a(*THEN)b|ac)../\n     ac\n     ad \n\n/^(?=a(*THEN)b|ac)/\n    ac\n    \n/\\A.*?(?:a|b(*THEN)c)/\n    ba\n\n/\\A.*?(?:a|b(*THEN)c)++/\n    ba\n\n/\\A.*?(?:a|b(*THEN)c|d)/\n    ba\n\n/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/\n    aac \n\n/\\A.*?(a|b(*THEN)c)/\n    ba\n\n/^(A(*THEN)B|A(*THEN)D)/\n    AD           \n    \n/(?!b(*THEN)a)bn|bnn/\n    bnn\n\n/(?(?=b(*SKIP)a)bn|bnn)/\n    bnn\n\n/(?=b(*THEN)a|)bn|bnn/\n    bnn\n\n/-------------------------/ \n\n/(*LIMIT_MATCH=12bc)abc/\n\n/(*LIMIT_MATCH=4294967290)abc/\n\n/(*LIMIT_RECURSION=4294967280)abc/I\n\n/(a+)*zz/\n    aaaaaaaaaaaaaz\n    aaaaaaaaaaaaaz\\q3000\n\n/(a+)*zz/S-\n    aaaaaaaaaaaaaz\\Q10 \n\n/(*LIMIT_MATCH=3000)(a+)*zz/I\n    aaaaaaaaaaaaaz\n    aaaaaaaaaaaaaz\\q60000\n\n/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I\n    aaaaaaaaaaaaaz\n\n/(*LIMIT_MATCH=60000)(a+)*zz/I\n    aaaaaaaaaaaaaz\n    aaaaaaaaaaaaaz\\q3000\n\n/(*LIMIT_RECURSION=10)(a+)*zz/IS-\n    aaaaaaaaaaaaaz\n    aaaaaaaaaaaaaz\\Q1000\n\n/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS-\n    aaaaaaaaaaaaaz\n\n/(*LIMIT_RECURSION=1000)(a+)*zz/IS-\n    aaaaaaaaaaaaaz\n    aaaaaaaaaaaaaz\\Q10\n\n/-- This test causes a segfault with Perl 5.18.0 --/\n\n/^(?=(a)){0}b(?1)/\n    backgammon\n\n/(?|(?<n>f)|(?<n>b))/JI\n\n/(?<a>abc)(?<a>z)\\k<a>()/JDZS\n\n/a*[bcd]/BZ\n\n/[bcd]*a/BZ\n\n/-- A complete set of tests for auto-possessification of character types --/\n\n/\\D+\\D \\D+\\d \\D+\\S \\D+\\s \\D+\\W \\D+\\w \\D+. \\D+\\C \\D+\\R \\D+\\H \\D+\\h \\D+\\V \\D+\\v \\D+\\Z \\D+\\z \\D+$/BZx\n\n/\\d+\\D \\d+\\d \\d+\\S \\d+\\s \\d+\\W \\d+\\w \\d+. \\d+\\C \\d+\\R \\d+\\H \\d+\\h \\d+\\V \\d+\\v \\d+\\Z \\d+\\z \\d+$/BZx\n\n/\\S+\\D \\S+\\d \\S+\\S \\S+\\s \\S+\\W \\S+\\w \\S+. \\S+\\C \\S+\\R \\S+\\H \\S+\\h \\S+\\V \\S+\\v \\S+\\Z \\S+\\z \\S+$/BZx\n\n/\\s+\\D \\s+\\d \\s+\\S \\s+\\s \\s+\\W \\s+\\w \\s+. \\s+\\C \\s+\\R \\s+\\H \\s+\\h \\s+\\V \\s+\\v \\s+\\Z \\s+\\z \\s+$/BZx\n\n/\\W+\\D \\W+\\d \\W+\\S \\W+\\s \\W+\\W \\W+\\w \\W+. \\W+\\C \\W+\\R \\W+\\H \\W+\\h \\W+\\V \\W+\\v \\W+\\Z \\W+\\z \\W+$/BZx\n\n/\\w+\\D \\w+\\d \\w+\\S \\w+\\s \\w+\\W \\w+\\w \\w+. \\w+\\C \\w+\\R \\w+\\H \\w+\\h \\w+\\V \\w+\\v \\w+\\Z \\w+\\z \\w+$/BZx\n\n/\\C+\\D \\C+\\d \\C+\\S \\C+\\s \\C+\\W \\C+\\w \\C+. \\C+\\C \\C+\\R \\C+\\H \\C+\\h \\C+\\V \\C+\\v \\C+\\Z \\C+\\z \\C+$/BZx\n\n/\\R+\\D \\R+\\d \\R+\\S \\R+\\s \\R+\\W \\R+\\w \\R+. \\R+\\C \\R+\\R \\R+\\H \\R+\\h \\R+\\V \\R+\\v \\R+\\Z \\R+\\z \\R+$/BZx\n\n/\\H+\\D \\H+\\d \\H+\\S \\H+\\s \\H+\\W \\H+\\w \\H+. \\H+\\C \\H+\\R \\H+\\H \\H+\\h \\H+\\V \\H+\\v \\H+\\Z \\H+\\z \\H+$/BZx\n\n/\\h+\\D \\h+\\d \\h+\\S \\h+\\s \\h+\\W \\h+\\w \\h+. \\h+\\C \\h+\\R \\h+\\H \\h+\\h \\h+\\V \\h+\\v \\h+\\Z \\h+\\z \\h+$/BZx\n\n/\\V+\\D \\V+\\d \\V+\\S \\V+\\s \\V+\\W \\V+\\w \\V+. \\V+\\C \\V+\\R \\V+\\H \\V+\\h \\V+\\V \\V+\\v \\V+\\Z \\V+\\z \\V+$/BZx\n\n/\\v+\\D \\v+\\d \\v+\\S \\v+\\s \\v+\\W \\v+\\w \\v+. \\v+\\C \\v+\\R \\v+\\H \\v+\\h \\v+\\V \\v+\\v \\v+\\Z \\v+\\z \\v+$/BZx\n\n/ a+\\D  a+\\d  a+\\S  a+\\s  a+\\W  a+\\w  a+.  a+\\C  a+\\R  a+\\H  a+\\h  a+\\V  a+\\v  a+\\Z  a+\\z  a+$/BZx\n\n/\\n+\\D \\n+\\d \\n+\\S \\n+\\s \\n+\\W \\n+\\w \\n+. \\n+\\C \\n+\\R \\n+\\H \\n+\\h \\n+\\V \\n+\\v \\n+\\Z \\n+\\z \\n+$/BZx\n\n/ .+\\D  .+\\d  .+\\S  .+\\s  .+\\W  .+\\w  .+.  .+\\C  .+\\R  .+\\H  .+\\h  .+\\V  .+\\v  .+\\Z  .+\\z  .+$/BZx\n\n/ .+\\D  .+\\d  .+\\S  .+\\s  .+\\W  .+\\w  .+.  .+\\C  .+\\R  .+\\H  .+\\h  .+\\V  .+\\v  .+\\Z  .+\\z  .+$/BZxs\n\n/\\D+$  \\d+$  \\S+$  \\s+$  \\W+$  \\w+$  \\C+$  \\R+$  \\H+$  \\h+$  \\V+$  \\v+$   a+$  \\n+$   .+$  .+$/BZxm\n\n/(?=a+)a(a+)++a/BZ\n\n/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ\n\n/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ\n\n/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ\n\n/[ab]*/BZ\n    aaaa\n\n/[ab]*?/BZ\n    aaaa\n\n/[ab]?/BZ\n    aaaa\n\n/[ab]??/BZ\n    aaaa\n\n/[ab]+/BZ\n    aaaa\n\n/[ab]+?/BZ\n    aaaa\n\n/[ab]{2,3}/BZ\n    aaaa\n\n/[ab]{2,3}?/BZ\n    aaaa\n\n/[ab]{2,}/BZ\n    aaaa\n\n/[ab]{2,}?/BZ\n    aaaa\n\n/\\d+\\s{0,5}=\\s*\\S?=\\w{0,4}\\W*/BZ\n\n/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ\n\n/[a-z]*\\s#[ \\t]?\\S#[a-c]*\\S#[C-G]+?\\d#[4-8]*\\D#[4-9,]*\\D#[!$]{0,5}\\w#[M-Xf-l]+\\W#[a-c,]?\\W/BZ\n\n/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ\n\n/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ\n\n/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ\n\n/[a-c]*d/DZS\n\n/[a-c]+d/DZS\n\n/[a-c]?d/DZS\n\n/[a-c]{4,6}d/DZS\n\n/[a-c]{0,6}d/DZS\n\n/-- End of special auto-possessive tests --/\n\n/^A\\o{1239}B/\n    A\\123B\n\n/^A\\oB/\n    \n/^A\\x{zz}B/ \n\n/^A\\x{12Z/\n\n/^A\\x{/\n\n/[ab]++/BZO\n\n/[^ab]*+/BZO\n\n/a{4}+/BZO\n\n/a{4}+/BZOi\n\n/[a-[:digit:]]+/\n\n/[A-[:digit:]]+/\n\n/[a-[.xxx.]]+/\n\n/[a-[=xxx=]]+/\n\n/[a-[!xxx!]]+/\n\n/[A-[!xxx!]]+/\n    A]]]\n\n/[a-\\d]+/\n\n/(?<0abc>xx)/\n\n/(?&1abc)xx(?<1abc>y)/\n\n/(?<ab-cd>xx)/\n\n/(?'0abc'xx)/\n\n/(?P<0abc>xx)/\n\n/\\k<5ghj>/\n\n/\\k'5ghj'/\n\n/\\k{2fgh}/\n\n/(?P=8yuki)/\n\n/\\g{4df}/\n\n/(?&1abc)xx(?<1abc>y)/\n\n/(?P>1abc)xx(?<1abc>y)/\n\n/\\g'3gh'/\n\n/\\g<5fg>/\n\n/(?(<4gh>)abc)/\n\n/(?('4gh')abc)/\n\n/(?(4gh)abc)/\n\n/(?(R&6yh)abc)/\n\n/(((a\\2)|(a*)\\g<-1>))*a?/BZ\n\n/-- Test the ugly \"start or end of word\" compatibility syntax --/\n\n/[[:<:]]red[[:>:]]/BZ\n    little red riding hood\n    a /red/ thing \n    red is a colour\n    put it all on red  \n    ** Failers\n    no reduction\n    Alfred Winifred\n    \n/[a[:<:]] should give error/ \n\n/(?=ab\\K)/+\n    abcd\n\n/abcd/f<lf>\n    xx\\nxabcd\n    \n/ -- Test stack check external calls --/ \n\n/(((((a)))))/Q0\n\n/(((((a)))))/Q1\n\n/(((((a)))))/Q\n\n/^\\w+(?>\\s*)(?<=\\w)/BZ\n\n/\\othing/\n\n/\\o{}/\n\n/\\o{whatever}/\n\n/\\xthing/\n\n/\\x{}/\n\n/\\x{whatever}/\n\n\"((?=(?(?=(?(?=(?(?=()))))))))\"\n    a\n\n\"(?(?=)==)(((((((((?=)))))))))\"\n    a\n\n/^(?:(a)|b)(?(1)A|B)/I\n    aA123\\O3\n    aA123\\O6\n\n'^(?:(?<AA>a)|b)(?(<AA>)A|B)'\n    aA123\\O3\n    aA123\\O6\n\n'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J\n    aA123\\O3\n    aA123\\O6\n\n'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\\k{AA}'J\n    aa123\\O3\n    aa123\\O6\n\n/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/\n\n/(?(?=0)?)+/\n\n/(?(?=0)(?=00)?00765)/\n     00765\n\n/(?(?=0)(?=00)?00765|(?!3).56)/\n     00765\n     456\n     ** Failers\n     356   \n\n'^(a)*+(\\w)'\n    g\n    g\\O3\n\n'^(?:a)*+(\\w)'\n    g\n    g\\O3\n\n//C\n    \\O\\C+\n\n\"((?2){0,1999}())?\"\n\n/((?+1)(\\1))/BZ\n\n/(?(?!)a|b)/\n    bbb\n    aaa \n\n\"((?2)+)((?1))\"\n\n\"(?(?<E>.*!.*)?)\"\n\n\"X((?2)()*+){2}+\"BZ\n\n\"X((?2)()*+){2}\"BZ\n\n\"(?<=((?2))((?1)))\"\n\n/(?<=\\Ka)/g+\n    aaaaa\n\n/(?<=\\Ka)/G+\n    aaaaa\n\n/((?2){73}(?2))((?1))/\n\n/.((?2)(?R)\\1)()/BZ\n\n/(?1)()((((((\\1++))\\x85)+)|))/\n\n/(\\9*+(?2);\\3++()2|)++{/\n\n/\\V\\x85\\9*+((?2)\\3++()2)*:2/\n\n/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J\n\n/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J\n\n/(((?(R)){0,2}) (?''((?'X')((?'R')))))/\n\n\"(?J)(?'d'(?'d'\\g{d}))\"\n\n\".*?\\h.+.\\.+\\R*?\\xd(?i)(?=!(?=b`b`b`\\`b\\xa9b!)`\\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\\x85bbbbbbb\\C?{((?2)(?))((\n\\H){8(?<=(?1){29}\\xa8bbbb\\x16\\xd\\xc6^($(?<! )(\\xa9H4){4}h}1)B))\\x15')\"\n\n\"(?J:(?|(?'R')(\\k'R')|((?'R'))))\"\n\n/(?<=|(\\,\\$(?73591620449005828816)\\xa8.{7}){6}\\x09)/\n\n//\n\\O1\n\n/^(?:(?(1)x|)+)+$()/BZ\n\n/(?=di(?<=(?1))|(?=(.))))/\n\n/(?(R))*+/BZ\n\n/[[:\\\\](?'abc')[a:]/\n\n\"[[[.\\xe8Nq\\xffq\\xff\\xe0\\x2|||::Nq\\xffq\\xff\\xe0\\x6\\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\\xe8Nq\\xffq\\xff\\xe0\\x2|||::Nq\\xffq\\xff\\xe0\\x6\\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~\"\n\n/()(?(R)0)*+/BZ\n\n/(?R-:(?</\n\n/(?1){3918}(((((0(\\k'R'))))(?J)(?'R'(?'R'\\3){99})))/I\n\n/(?J:(?|(:(?|(?'R')(\\k'R')|((?'R')))H'Rk'Rf)|s(?'R')))/\n\n/0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/\n    01\n\n/((?(R8000000000)))/ \n\n/(?(8000000000/\n\n/(?:ab)?(?:ab)(?:ab)/\n    abab\n    ababab\n    aba\n\n/((*MARK:A))++a(*SKIP:B)b/\n    aacb\n\n/(?J:(?|(:(?|(?'R')(\\z(?|(?'R')(\\k'R')|((?'R')))k'R')|((?'R')))H'Ak'Rf)|s(?'R')))/\n\n/(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?<a>1)/\n\n/a[[:punct:]b]/BZ\n\n/L(?#(|++<!(2)?/BZ\n\n/L(?#(|++<!(2)?/BOZ\n\n/L(?#(|++<!(2)?/BCZ\n\n/L(?#(|++<!(2)?/BCOZ\n\n/(A*)\\E+/CBZ\n\n/()\\Q\\E*]/BCZ\n\n/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/\n    \\O\\CC\n\n/(?=a\\K)/ \n    ring bpattingbobnd $ 1,oern cou \\rb\\L\n\n/(?<=((?C)0))/\n    9010\n    abcd\n     \n/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\\k'R'))))))))/\n\n/\\N(?(?C)0?!.)*/\n\n/(?<RA>abc)(?(R)xyz)/BZ\n\n/(?<R>abc)(?(R)xyz)/BZ\n\n/(?=.*[A-Z])/I\n\n\"(?<=(a))\\1?b\"\n    ab\n    aaab \n\n\"(?=(a))\\1?b\"\n    ab\n    aaab \n\n/(?(?=^))b/\n    abc\n\n/-- End of testinput2 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput20",
    "content": "/-- These DFA tests are for the handling of characters greater than 255 in\n    16- or 32-bit, non-UTF mode. --/\n\n/^\\x{ffff}+/i\n    \\x{ffff}\n\n/^\\x{ffff}?/i\n    \\x{ffff}\n\n/^\\x{ffff}*/i\n    \\x{ffff}\n\n/^\\x{ffff}{3}/i\n    \\x{ffff}\\x{ffff}\\x{ffff}\n\n/^\\x{ffff}{0,3}/i\n    \\x{ffff}\n\n/-- End of testinput20 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput21",
    "content": "/-- Tests for reloading pre-compiled patterns. The first one gives an error\nright away, and can be any old pattern compiled in 8-bit mode (\"abc\" is\ntypical). The others require the link size to be 2. */x\n\n<!testsaved8\n\n%-- Generated from: \n    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\\x{150}-\\x{250}\\x{300}]|\n      [^\\x{800}aAs-uS-U\\x{d800}-\\x{dfff}])++[^#\\b\\x{500}\\x{1000}]{3,5}$\n      /x\n\n    In 16-bit mode with options:  S>testdata/saved16LE-1\n                                 FS>testdata/saved16BE-1\n    In 32-bit mode with options:  S>testdata/saved32LE-1\n                                 FS>testdata/saved32BE-1\n--%x\n\n<!testsaved16LE-1\n\n<!testsaved16BE-1\n\n<!testsaved32LE-1\n\n<!testsaved32BE-1\n\n/-- End of testinput21 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput22",
    "content": "/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */\n\n%-- Generated from: \n    /(?P<cbra1>[aZ\\x{400}-\\x{10ffff}]{4,}\n      [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?|\n      [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}])\n      (?<cb2>[^az])/x \n       \n    In 16-bit mode with options:  S8>testdata/saved16LE-2\n                                 FS8>testdata/saved16BE-2\n    In 32-bit mode with options:  S8>testdata/saved32LE-2\n                                 FS8>testdata/saved32BE-2\n--%8x\n\n<!testsaved16LE-2\n\n<!testsaved16BE-2\n\n<!testsaved32LE-2\n\n<!testsaved32BE-2\n\n/-- End of testinput22 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput23",
    "content": "/-- Tests for the 16-bit library only */\n\n< forbid 8W\n\n/-- Check maximum non-UTF character size --/\n\n/\\x{ffff}/\n    A\\x{ffff}B\n\n/\\x{10000}/\n\n/\\o{20000}/\n\n/-- Check character ranges --/\n\n/[\\H]/BZSI\n\n/[\\V]/BZSI\n\n/-- End of testinput23 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput24",
    "content": "/-- Tests for the 16-bit library with UTF-16 support only */\n\n< forbid W\n\n/bad/8\n    \\x{d800}\n\n/short/8\n    \\P\\P\\x{d800}\n\n/-- End of testinput24 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput25",
    "content": "/-- Tests for the 32-bit library only */\n\n< forbid 8W\n\n/-- Check maximum character size --/\n\n/\\x{110000}/\n\n/\\x{7fffffff}/\n\n/\\x{80000000}/\n\n/\\x{ffffffff}/\n\n/\\x{100000000}/\n\n/\\o{17777777777}/\n\n/\\o{20000000000}/\n\n/\\o{37777777777}/\n\n/\\o{40000000000}/\n\n/\\x{7fffffff}\\x{7fffffff}/I\n\n/\\x{80000000}\\x{80000000}/I\n\n/\\x{ffffffff}\\x{ffffffff}/I\n\n/-- Non-UTF characters --/\n\n/\\C{2,3}/\n    \\x{400000}\\x{400001}\\x{400002}\\x{400003}\n\n/\\x{400000}\\x{800000}/iDZ\n\n/-- Check character ranges --/\n\n/[\\H]/BZSI\n\n/[\\V]/BZSI\n\n/-- End of testinput25 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput26",
    "content": "/-- Tests for the 32-bit library with UTF-32 support only */\n\n< forbid W\n\n/-- Non-UTF characters --/\n\n/\\x{110000}/8\n\n/\\o{4200000}/8\n\n/\\C/8\n    \\x{110000}\n\n/-- End of testinput26 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput3",
    "content": "/-- This set of tests checks local-specific features, using the \"fr_FR\" locale. \n    It is not Perl-compatible. When run via RunTest, the locale is edited to\n    be whichever of \"fr_FR\", \"french\", or \"fr\" is found to exist. There is\n    different version of this file called wintestinput3 for use on Windows,\n    where the locale is called \"french\" and the tests are run using\n    RunTest.bat. --/\n\n< forbid 8W \n\n/^[\\w]+/\n    *** Failers\n    cole\n\n/^[\\w]+/Lfr_FR\n    cole\n\n/^[\\w]+/\n    *** Failers\n    cole\n\n/^[\\W]+/\n    cole\n\n/^[\\W]+/Lfr_FR\n    *** Failers\n    cole\n\n/[\\b]/\n    \\b\n    *** Failers\n    a\n\n/[\\b]/Lfr_FR\n    \\b\n    *** Failers\n    a\n\n/^\\w+/\n    *** Failers\n    cole\n\n/^\\w+/Lfr_FR\n    cole\n\n/(.+)\\b(.+)/\n    cole\n\n/(.+)\\b(.+)/Lfr_FR\n    *** Failers\n    cole\n\n/cole/i\n    cole\n    *** Failers\n    cole\n\n/cole/iLfr_FR\n    cole\n    cole\n\n/\\w/IS\n\n/\\w/ISLfr_FR\n\n/^[\\xc8-\\xc9]/iLfr_FR\n    cole\n    cole\n\n/^[\\xc8-\\xc9]/Lfr_FR\n    cole\n    *** Failers \n    cole\n\n/\\W+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[\\W]+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[^[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/\\w+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[\\w]+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n    >>>\\xba<<< \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR \n\n/-- End of testinput3 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput4",
    "content": "/-- This set of tests is for UTF support, excluding Unicode properties. It is\n    compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit\n    PCRE libraries. --/\n    \n< forbid 9?=ABCDEFfGILMNPTUWXZ<\n   \n/a.b/8\n    acb\n    a\\x7fb\n    a\\x{100}b \n    *** Failers\n    a\\nb  \n\n/a(.{3})b/8\n    a\\x{4000}xyb \n    a\\x{4000}\\x7fyb \n    a\\x{4000}\\x{100}yb \n    *** Failers\n    a\\x{4000}b \n    ac\\ncb \n\n/a(.*?)(.)/\n    a\\xc0\\x88b\n\n/a(.*?)(.)/8\n    a\\x{100}b\n\n/a(.*)(.)/\n    a\\xc0\\x88b\n\n/a(.*)(.)/8\n    a\\x{100}b\n\n/a(.)(.)/\n    a\\xc0\\x92bcd\n\n/a(.)(.)/8\n    a\\x{240}bcd\n\n/a(.?)(.)/\n    a\\xc0\\x92bcd\n\n/a(.?)(.)/8\n    a\\x{240}bcd\n\n/a(.??)(.)/\n    a\\xc0\\x92bcd\n\n/a(.??)(.)/8\n    a\\x{240}bcd\n\n/a(.{3})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    *** Failers\n    a\\x{1234}b \n    ac\\ncb \n\n/a(.{3,})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    *** Failers\n    a\\x{1234}b \n\n/a(.{3,}?)b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    *** Failers\n    a\\x{1234}b \n\n/a(.{3,5})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    axbxxbcdefghijb \n    axxxxxbcdefghijb \n    *** Failers\n    a\\x{1234}b \n    axxxxxxbcdefghijb \n\n/a(.{3,5}?)b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    axbxxbcdefghijb \n    axxxxxbcdefghijb \n    *** Failers\n    a\\x{1234}b \n    axxxxxxbcdefghijb \n\n/^[a\\x{c0}]/8\n    *** Failers\n    \\x{100}\n\n/(?<=aXb)cd/8\n    aXbcd\n\n/(?<=a\\x{100}b)cd/8\n    a\\x{100}bcd\n\n/(?<=a\\x{100000}b)cd/8\n    a\\x{100000}bcd\n    \n/(?:\\x{100}){3}b/8\n    \\x{100}\\x{100}\\x{100}b\n    *** Failers \n    \\x{100}\\x{100}b\n\n/\\x{ab}/8\n    \\x{ab} \n    \\xc2\\xab\n    *** Failers \n    \\x00{ab}\n\n/(?<=(.))X/8\n    WXYZ\n    \\x{256}XYZ \n    *** Failers\n    XYZ \n\n/[^a]+/8g\n    bcd\n    \\x{100}aY\\x{256}Z \n    \n/^[^a]{2}/8\n    \\x{100}bc\n \n/^[^a]{2,}/8\n    \\x{100}bcAa\n\n/^[^a]{2,}?/8\n    \\x{100}bca\n\n/[^a]+/8ig\n    bcd\n    \\x{100}aY\\x{256}Z \n    \n/^[^a]{2}/8i\n    \\x{100}bc\n \n/^[^a]{2,}/8i\n    \\x{100}bcAa\n\n/^[^a]{2,}?/8i\n    \\x{100}bca\n\n/\\x{100}{0,0}/8\n    abcd\n \n/\\x{100}?/8\n    abcd\n    \\x{100}\\x{100} \n\n/\\x{100}{0,3}/8 \n    \\x{100}\\x{100} \n    \\x{100}\\x{100}\\x{100}\\x{100} \n    \n/\\x{100}*/8\n    abce\n    \\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{1,1}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{1,3}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}+/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{3}/8\n    abcd\\x{100}\\x{100}\\x{100}XX\n\n/\\x{100}{3,5}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n\n/\\x{100}{3,}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n\n/(?<=a\\x{100}{2}b)X/8+\n    Xyyya\\x{100}\\x{100}bXzzz\n\n/\\D*/8\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\D*/8\n  \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\D/8\n    1X2\n    1\\x{100}2 \n  \n/>\\S/8\n    > >X Y\n    > >\\x{100} Y\n  \n/\\d/8\n    \\x{100}3\n    \n/\\s/8\n    \\x{100} X\n    \n/\\D+/8\n    12abcd34\n    *** Failers\n    1234  \n\n/\\D{2,3}/8\n    12abcd34\n    12ab34\n    *** Failers  \n    1234\n    12a34  \n\n/\\D{2,3}?/8\n    12abcd34\n    12ab34\n    *** Failers  \n    1234\n    12a34  \n\n/\\d+/8\n    12abcd34\n    *** Failers\n\n/\\d{2,3}/8\n    12abcd34\n    1234abcd\n    *** Failers  \n    1.4 \n\n/\\d{2,3}?/8\n    12abcd34\n    1234abcd\n    *** Failers  \n    1.4 \n\n/\\S+/8\n    12abcd34\n    *** Failers\n    \\    \\ \n\n/\\S{2,3}/8\n    12abcd34\n    1234abcd\n    *** Failers\n    \\     \\  \n\n/\\S{2,3}?/8\n    12abcd34\n    1234abcd\n    *** Failers\n    \\     \\  \n\n/>\\s+</8+\n    12>      <34\n    *** Failers\n\n/>\\s{2,3}</8+\n    ab>  <cd\n    ab>   <ce\n    *** Failers\n    ab>    <cd \n\n/>\\s{2,3}?</8+\n    ab>  <cd\n    ab>   <ce\n    *** Failers\n    ab>    <cd \n\n/\\w+/8\n    12      34\n    *** Failers\n    +++=*! \n\n/\\w{2,3}/8\n    ab  cd\n    abcd ce\n    *** Failers\n    a.b.c\n\n/\\w{2,3}?/8\n    ab  cd\n    abcd ce\n    *** Failers\n    a.b.c\n\n/\\W+/8\n    12====34\n    *** Failers\n    abcd \n\n/\\W{2,3}/8\n    ab====cd\n    ab==cd\n    *** Failers\n    a.b.c\n\n/\\W{2,3}?/8\n    ab====cd\n    ab==cd\n    *** Failers\n    a.b.c\n\n/[\\x{100}]/8\n    \\x{100}\n    Z\\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[Z\\x{100}]/8\n    Z\\x{100}\n    \\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   *** Failers  \n\n/[\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   *** Failers  \n\n/[z-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   abzcd\n   ab|cd  \n   *** Failers  \n\n/[Q\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   Q? \n   *** Failers  \n\n/[Q\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   Q? \n   *** Failers  \n\n/[Qz-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   abzcd\n   ab|cd  \n   Q? \n   *** Failers  \n\n/[\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[Q\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[Q\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/(?<=[\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n    abc\\x{100}X \n    *** Failers\n    X  \n\n/(?<=[Q\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n    abc\\x{100}X \n    abQX \n    *** Failers\n    X  \n\n/(?<=[\\x{100}\\x{200}]{3})X/8\n    abc\\x{100}\\x{200}\\x{100}X\n    *** Failers\n    abc\\x{200}X\n    X  \n\n/[^\\x{100}\\x{200}]X/8\n    AX\n    \\x{150}X\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{200}X   \n\n/[^Q\\x{100}\\x{200}]X/8\n    AX\n    \\x{150}X\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{200}X   \n    QX \n\n/[^\\x{100}-\\x{200}]X/8\n    AX\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{150}X\n    \\x{200}X   \n\n/[z-\\x{100}]/8i\n    z\n    Z \n    \\x{100}\n    *** Failers\n    \\x{102}\n    y    \n\n/[\\xFF]/\n    >\\xff<\n\n/[\\xff]/8\n    >\\x{ff}<\n\n/[^\\xFF]/\n    XYZ\n\n/[^\\xff]/8\n    XYZ\n    \\x{123} \n\n/^[ac]*b/8\n  xb\n\n/^[ac\\x{100}]*b/8\n  xb\n\n/^[^x]*b/8i\n  xb\n\n/^[^x]*b/8\n  xb\n  \n/^\\d*b/8\n  xb \n\n/(|a)/g8\n    catac\n    a\\x{256}a \n\n/^\\x{85}$/8i\n    \\x{85}\n\n/^ሴ/8\n    ሴ \n\n/^\\ሴ/8\n    ሴ \n\n\"(?s)(.{1,5})\"8\n    abcdefg\n    ab\n\n/a*\\x{100}*\\w/8\n    a \n\n/\\S\\S/8g\n    A\\x{a3}BC\n    \n/\\S{2}/8g\n    A\\x{a3}BC\n    \n/\\W\\W/8g\n    +\\x{a3}== \n\n/\\W{2}/8g\n    +\\x{a3}== \n\n/\\S/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n\n/[\\S]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n\n/\\D/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n\n/[\\D]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n\n/\\W/8g\n    \\x{2442}\\x{2435}\\x{2441}\\x{2442}\n\n/[\\W]/8g\n    \\x{2442}\\x{2435}\\x{2441}\\x{2442}\n    \n/[\\S\\s]*/8\n    abc\\n\\r\\x{442}\\x{435}\\x{441}\\x{442}xyz \n\n/[\\x{41f}\\S]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n\n/.[^\\S]./8g\n    abc def\\x{442}\\x{443}xyz\\npqr\n\n/.[^\\S\\n]./8g\n    abc def\\x{442}\\x{443}xyz\\npqr\n\n/[[:^alnum:]]/8g  \n    +\\x{2442}\n    \n/[[:^alpha:]]/8g \n    +\\x{2442}\n    \n/[[:^ascii:]]/8g \n    A\\x{442}\n    \n/[[:^blank:]]/8g \n    A\\x{442}\n    \n/[[:^cntrl:]]/8g \n    A\\x{442}\n    \n/[[:^digit:]]/8g \n    A\\x{442}\n    \n/[[:^graph:]]/8g \n    \\x19\\x{e01ff}\n    \n/[[:^lower:]]/8g \n    A\\x{422}\n    \n/[[:^print:]]/8g \n    \\x{19}\\x{e01ff}\n    \n/[[:^punct:]]/8g \n    A\\x{442}\n    \n/[[:^space:]]/8g \n    A\\x{442}\n    \n/[[:^upper:]]/8g \n    a\\x{442}\n    \n/[[:^word:]]/8g  \n    +\\x{2442}\n    \n/[[:^xdigit:]]/8g\n    M\\x{442}\n\n/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİĲĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼǄǇǊǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮǱǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĳĵķĸĺļľŀłńņňŉŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿǆǉǌǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰǳǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥﬀﬁﬂﬃﬄﬅﬆﬓﬔﬕﬖﬗ\\d-_^]/8\n\n/^[^d]*?$/\n    abc\n\n/^[^d]*?$/8\n    abc\n\n/^[^d]*?$/i\n    abc\n\n/^[^d]*?$/8i\n    abc\n\n/(?i)[\\xc3\\xa9\\xc3\\xbd]|[\\xc3\\xa9\\xc3\\xbdA]/8\n\n/^[a\\x{c0}]b/8\n    \\x{c0}b\n    \n/^([a\\x{c0}]*?)aa/8\n    a\\x{c0}aaaa/ \n\n/^([a\\x{c0}]*?)aa/8\n    a\\x{c0}aaaa/ \n    a\\x{c0}a\\x{c0}aaa/ \n\n/^([a\\x{c0}]*)aa/8\n    a\\x{c0}aaaa/ \n    a\\x{c0}a\\x{c0}aaa/ \n\n/^([a\\x{c0}]*)a\\x{c0}/8\n    a\\x{c0}aaaa/ \n    a\\x{c0}a\\x{c0}aaa/ \n\n/A*/g8\n    AAB\\x{123}BAA\n\n/(abc)\\1/8i\n   abc\n\n/(abc)\\1/8\n   abc\n\n/a(*:a\\x{1234}b)/8K\n    abc\n\n/a(*:a£b)/8K \n    abc\n\n/-- Noncharacters --/\n\n/./8\n    \\x{fffe}\n    \\x{ffff}\n    \\x{1fffe}\n    \\x{1ffff}\n    \\x{2fffe}\n    \\x{2ffff}\n    \\x{3fffe}\n    \\x{3ffff}\n    \\x{4fffe}\n    \\x{4ffff}\n    \\x{5fffe}\n    \\x{5ffff}\n    \\x{6fffe}\n    \\x{6ffff}\n    \\x{7fffe}\n    \\x{7ffff}\n    \\x{8fffe}\n    \\x{8ffff}\n    \\x{9fffe}\n    \\x{9ffff}\n    \\x{afffe}\n    \\x{affff}\n    \\x{bfffe}\n    \\x{bffff}\n    \\x{cfffe}\n    \\x{cffff}\n    \\x{dfffe}\n    \\x{dffff}\n    \\x{efffe}\n    \\x{effff}\n    \\x{ffffe}\n    \\x{fffff}\n    \\x{10fffe}\n    \\x{10ffff}\n    \\x{fdd0}\n    \\x{fdd1}\n    \\x{fdd2}\n    \\x{fdd3}\n    \\x{fdd4}\n    \\x{fdd5}\n    \\x{fdd6}\n    \\x{fdd7}\n    \\x{fdd8}\n    \\x{fdd9}\n    \\x{fdda}\n    \\x{fddb}\n    \\x{fddc}\n    \\x{fddd}\n    \\x{fdde}\n    \\x{fddf}\n    \\x{fde0}\n    \\x{fde1}\n    \\x{fde2}\n    \\x{fde3}\n    \\x{fde4}\n    \\x{fde5}\n    \\x{fde6}\n    \\x{fde7}\n    \\x{fde8}\n    \\x{fde9}\n    \\x{fdea}\n    \\x{fdeb}\n    \\x{fdec}\n    \\x{fded}\n    \\x{fdee}\n    \\x{fdef}\n\n/^\\d*\\w{4}/8\n    1234\n    123 \n    \n/^[^b]*\\w{4}/8\n    aaaa\n    aaa  \n \n/^[^b]*\\w{4}/8i\n    aaaa\n    aaa  \n \n/^\\x{100}*.{4}/8\n    \\x{100}\\x{100}\\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\n\n/^\\x{100}*.{4}/8i\n    \\x{100}\\x{100}\\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\n\n/^a+[a\\x{200}]/8\n    aa\n\n/^.\\B.\\B./8\n    \\x{10123}\\x{10124}\\x{10125}\n\n/^#[^\\x{ffff}]#[^\\x{ffff}]#[^\\x{ffff}]#/8\n    #\\x{10000}#\\x{100}#\\x{10ffff}#\n\n\"[\\S\\V\\H]\"8\n\n/\\C(\\W?ſ)'?{{/8\n    \\\\C(\\\\W?ſ)'?{{\n\n/[^\\x{100}-\\x{ffff}]*[\\x80-\\xff]/8\n    \\x{99}\\x{99}\\x{99}\n\n/-- End of testinput4 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput5",
    "content": "/-- This set of tests checks the API, internals, and non-Perl stuff for UTF\n    support, excluding Unicode properties. However, tests that give different\n    results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/\n    \n< forbid W \n\n/\\x{110000}/8DZ\n\n/\\o{4200000}/8DZ\n\n/\\x{ffffffff}/8\n\n/\\o{37777777777}/8\n\n/\\x{100000000}/8\n\n/\\o{77777777777}/8\n\n/\\x{d800}/8\n\n/\\o{154000}/8\n\n/\\x{dfff}/8\n\n/\\o{157777}/8\n\n/\\x{d7ff}/8\n\n/\\o{153777}/8\n\n/\\x{e000}/8\n\n/\\o{170000}/8\n\n/^\\x{100}a\\x{1234}/8\n    \\x{100}a\\x{1234}bcd\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/DZ8\n    \\x{0041}\\x{2262}\\x{0391}\\x{002e}\n    \n/.{3,5}X/DZ8\n    \\x{212ab}\\x{212ab}\\x{212ab}\\x{861}X\n\n/.{3,5}?/DZ8\n    \\x{212ab}\\x{212ab}\\x{212ab}\\x{861}\n\n/(?<=\\C)X/8\n    Should produce an error diagnostic\n    \n/^[ab]/8DZ\n    bar\n    *** Failers\n    c\n    \\x{ff}\n    \\x{100}  \n\n/^[^ab]/8DZ\n    c\n    \\x{ff}\n    \\x{100}  \n    *** Failers \n    aaa\n  \n/\\x{100}*(\\d+|\"(?1)\")/8\n    1234\n    \"1234\" \n    \\x{100}1234\n    \"\\x{100}1234\"  \n    \\x{100}\\x{100}12ab \n    \\x{100}\\x{100}\"12\" \n    *** Failers \n    \\x{100}\\x{100}abcd\n\n/\\x{100}*/8DZ\n\n/a\\x{100}*/8DZ\n\n/ab\\x{100}*/8DZ\n\n/\\x{100}*A/8DZ\n    A\n\n/\\x{100}*\\d(?R)/8DZ\n\n/[Z\\x{100}]/8DZ\n    Z\\x{100}\n    \\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[\\x{200}-\\x{100}]/8\n\n/[Ā-Ą]/8\n    \\x{100}\n    \\x{104}\n    *** Failers\n    \\x{105}\n    \\x{ff}    \n\n/[z-\\x{100}]/8DZ\n\n/[z\\Qa-d]Ā\\E]/8DZ\n    \\x{100}\n    Ā \n\n/[\\xFF]/DZ\n    >\\xff<\n\n/[^\\xFF]/DZ\n\n/[Ä-Ü]/8\n    Ö # Matches without Study\n    \\x{d6}\n    \n/[Ä-Ü]/8S\n    Ö <-- Same with Study\n    \\x{d6}\n    \n/[\\x{c4}-\\x{dc}]/8 \n    Ö # Matches without Study\n    \\x{d6} \n\n/[\\x{c4}-\\x{dc}]/8S\n    Ö <-- Same with Study\n    \\x{d6} \n\n/[^\\x{100}]abc(xyz(?1))/8DZ\n\n/[ab\\x{100}]abc(xyz(?1))/8DZ\n\n/(\\x{100}(b(?2)c))?/DZ8\n\n/(\\x{100}(b(?2)c)){0,2}/DZ8\n\n/(\\x{100}(b(?1)c))?/DZ8\n\n/(\\x{100}(b(?1)c)){0,2}/DZ8\n\n/\\W/8\n    A.B\n    A\\x{100}B \n  \n/\\w/8\n    \\x{100}X   \n\n/^\\ሴ/8DZ\n\n/\\x{100}*\\d/8DZ\n\n/\\x{100}*\\s/8DZ\n\n/\\x{100}*\\w/8DZ\n\n/\\x{100}*\\D/8DZ\n\n/\\x{100}*\\S/8DZ\n\n/\\x{100}*\\W/8DZ\n\n/()()()()()()()()()()\n ()()()()()()()()()()\n ()()()()()()()()()()\n ()()()()()()()()()()\n A (x) (?41) B/8x\n    AxxB     \n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/BZ8\n\n/^[\\QĀ\\E-\\QŐ\\E]/BZ8\n\n/^abc./mgx8<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x{0085}abc7 \\x{2028}abc8 \\x{2029}abc9 JUNK\n\n/abc.$/mgx8<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x{0085} abc7\\x{2028} abc8\\x{2029} abc9\n\n/^a\\Rb/8<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x{85}b   \n    a\\x{2028}b \n    a\\x{2029}b \n    ** Failers\n    a\\n\\rb    \n\n/^a\\R*b/8<bsr_unicode>\n    ab\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0c\\x{2028}\\x{2029}b\n    a\\x{85}b   \n    a\\n\\rb    \n    a\\n\\r\\x{85}\\x0cb \n\n/^a\\R+b/8<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0c\\x{2028}\\x{2029}b\n    a\\x{85}b   \n    a\\n\\rb    \n    a\\n\\r\\x{85}\\x0cb \n    ** Failers\n    ab  \n\n/^a\\R{1,3}b/8<bsr_unicode>\n    a\\nb\n    a\\n\\rb\n    a\\n\\r\\x{85}b\n    a\\r\\n\\r\\nb \n    a\\r\\n\\r\\n\\r\\nb \n    a\\n\\r\\n\\rb\n    a\\n\\n\\r\\nb \n    ** Failers\n    a\\n\\n\\n\\rb\n    a\\r\n\n/\\H\\h\\V\\v/8\n    X X\\x0a\n    X\\x09X\\x0b\n    ** Failers\n    \\x{a0} X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/8 \n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x20\\x{a0}\\x0a\\x0b\n     \n/\\H\\h\\V\\v/8\n    \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n    X\\x{180e}X\\x{85}\n    ** Failers\n    \\x{2009} X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/8 \n    \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x0c\\x0d\\x0a\n    \\x09\\x{205f}\\x{a0}\\x0a\\x{2029}\\x0c\\x{2028}\\x0a\n    \\x09\\x20\\x{202f}\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x{200a}\\x{a0}\\x{2028}\\x0b\n     \n/[\\h]/8BZ\n    >\\x{1680}\n\n/[\\h]{3,}/8BZ\n    >\\x{1680}\\x{180e}\\x{2000}\\x{2003}\\x{200a}\\x{202f}\\x{205f}\\x{3000}<\n\n/[\\v]/8BZ\n\n/[\\H]/8BZ\n\n/[\\V]/8BZ\n\n/.*$/8<any>\n    \\x{1ec5} \n    \n/a\\Rb/I8<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x{85}b\n    a\\x0bb     \n\n/a\\Rb/I8<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x{85}b\n    a\\x0bb     \n    ** Failers \n    a\\x{85}b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R?b/I8<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x{85}b\n    a\\x0bb     \n\n/a\\R?b/I8<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x{85}b\n    a\\x0bb     \n    ** Failers \n    a\\x{85}b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n \n/.*a.*=.b.*/8<ANY>\n    QQQ\\x{2029}ABCaXYZ=!bPQR\n    ** Failers\n    a\\x{2029}b\n    \\x61\\xe2\\x80\\xa9\\x62 \n\n/[[:a\\x{100}b:]]/8\n\n/a[^]b/<JS>8\n    a\\x{1234}b\n    a\\nb \n    ** Failers\n    ab  \n    \n/a[^]+b/<JS>8\n    aXb\n    a\\nX\\nX\\x{1234}b \n    ** Failers\n    ab  \n\n/(\\x{de})\\1/\n    \\x{de}\\x{de}\n\n/X/8f<any> \n    A\\x{1ec5}ABCXYZ\n\n/Xa{2,4}b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/Xa{2,4}?b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/Xa{2,4}+b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\x{123}{2,4}b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X\\x{123}{2,4}?b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X\\x{123}{2,4}+b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X\\x{123}{2,4}b/8\n    Xx\\P\n    X\\x{123}x\\P\n    X\\x{123}\\x{123}x\\P \n    X\\x{123}\\x{123}\\x{123}x\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \n    \n/X\\x{123}{2,4}?b/8\n    Xx\\P\n    X\\x{123}x\\P\n    X\\x{123}\\x{123}x\\P \n    X\\x{123}\\x{123}\\x{123}x\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \n    \n/X\\x{123}{2,4}+b/8\n    Xx\\P\n    X\\x{123}x\\P\n    X\\x{123}\\x{123}x\\P \n    X\\x{123}\\x{123}\\x{123}x\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \n    \n/X\\d{2,4}b/8\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n    \n/X\\d{2,4}?b/8\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n    \n/X\\d{2,4}+b/8\n    X\\P\n    X3\\P\n    X33\\P \n    X333\\P\n    X3333\\P \n\n/X\\D{2,4}b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\D{2,4}?b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X\\D{2,4}+b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n\n/X\\D{2,4}b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X\\D{2,4}?b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X\\D{2,4}+b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n\n/X[abc]{2,4}b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[abc]{2,4}?b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n    \n/X[abc]{2,4}+b/8\n    X\\P\n    Xa\\P\n    Xaa\\P \n    Xaaa\\P\n    Xaaaa\\P \n\n/X[abc\\x{123}]{2,4}b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X[abc\\x{123}]{2,4}?b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X[abc\\x{123}]{2,4}+b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n\n/X[^a]{2,4}b/8\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n    \n/X[^a]{2,4}?b/8\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n    \n/X[^a]{2,4}+b/8\n    X\\P\n    Xz\\P\n    Xzz\\P \n    Xzzz\\P\n    Xzzzz\\P \n\n/X[^a]{2,4}b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X[^a]{2,4}?b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/X[^a]{2,4}+b/8\n    X\\P\n    X\\x{123}\\P\n    X\\x{123}\\x{123}\\P \n    X\\x{123}\\x{123}\\x{123}\\P\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n\n/(Y)X\\1{2,4}b/8\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n    \n/(Y)X\\1{2,4}?b/8\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n    \n/(Y)X\\1{2,4}+b/8\n    YX\\P\n    YXY\\P\n    YXYY\\P \n    YXYYY\\P\n    YXYYYY\\P \n\n/(\\x{123})X\\1{2,4}b/8\n    \\x{123}X\\P\n    \\x{123}X\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\P \n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/(\\x{123})X\\1{2,4}?b/8\n    \\x{123}X\\P\n    \\x{123}X\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\P \n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n    \n/(\\x{123})X\\1{2,4}+b/8\n    \\x{123}X\\P\n    \\x{123}X\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\P \n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \n\n/\\bthe cat\\b/8\n    the cat\\P\n    the cat\\P\\P\n\n/abcd*/8\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n\n/abcd*/i8\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n    XXXXABCD\\P\n    XXXXABCD\\P\\P\n\n/abc\\d*/8\n    xxxxabc1\\P\n    xxxxabc1\\P\\P\n\n/(a)bc\\1*/8\n    xxxxabca\\P\n    xxxxabca\\P\\P\n\n/abc[de]*/8\n    xxxxabcde\\P\n    xxxxabcde\\P\\P\n\n/X\\W{3}X/8\n    \\PX\n\n/\\sxxx\\s/8T1\n    AB\\x{85}xxx\\x{a0}XYZ\n    AB\\x{a0}xxx\\x{85}XYZ\n\n/\\S \\S/8T1\n    \\x{a2} \\x{84} \n\n'A#хц'8x<any>BZ\n\n'A#хц\n  PQ'8x<any>BZ\n  \n/a+#хaa\n  z#XX?/8x<any>BZ \n\n/a+#хaa\n  z#х?/8x<any>BZ \n\n/\\g{A}xxx#bXX(?'A'123)\r(?'A'456)/8x<any>BZ\n\n/\\g{A}xxx#bх(?'A'123)\r(?'A'456)/8x<any>BZ\n\n/^\\cģ/8\n\n/(\\R*)(.)/s8\n    \\r\\n\n    \\r\\r\\n\\n\\r \n    \\r\\r\\n\\n\\r\\n \n\n/(\\R)*(.)/s8\n    \\r\\n\n    \\r\\r\\n\\n\\r \n    \\r\\r\\n\\n\\r\\n \n\n/[^\\x{1234}]+/iS8I   \n\n/[^\\x{1234}]+?/iS8I   \n\n/[^\\x{1234}]++/iS8I   \n\n/[^\\x{1234}]{2}/iS8I\n\n//<bsr_anycrlf><bsr_unicode>\n\n/f.*/\n    \\P\\Pfor\n\n/f.*/s\n    \\P\\Pfor\n\n/f.*/8\n    \\P\\Pfor\n\n/f.*/8s\n    \\P\\Pfor\n    \n/\\x{d7ff}\\x{e000}/8\n\n/\\x{d800}/8\n\n/\\x{dfff}/8 \n\n/\\h+/8\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\x{a0}\\x{2000}\n\n/[\\h\\x{e000}]+/8BZ\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\x{a0}\\x{2000}\n\n/\\H+/8\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\x{a0}\\x{3000}\\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n\n/[\\H\\x{d7ff}]+/8BZ\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\x{a0}\\x{3000}\\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n\n/\\v+/8\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n\n/[\\v\\x{e000}]+/8BZ\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n\n/\\V+/8\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n    \\x{85}\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x{84}\\x{86}\n\n/[\\V\\x{d7ff}]+/8BZ\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n    \\x{85}\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x{84}\\x{86}\n\n/\\R+/8<bsr_unicode>\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n\n/(..)\\1/8\n    ab\\P\n    aba\\P\n    abab\\P\n\n/(..)\\1/8i\n    ab\\P\n    abA\\P\n    aBAb\\P\n\n/(..)\\1{2,}/8\n    ab\\P\n    aba\\P\n    abab\\P\n    ababa\\P\n    ababab\\P\n    ababab\\P\\P\n    abababa\\P\n    abababa\\P\\P\n\n/(..)\\1{2,}/8i\n    ab\\P\n    aBa\\P\n    aBAb\\P\n    AbaBA\\P\n    abABAb\\P\n    aBAbaB\\P\\P\n    abABabA\\P\n    abaBABa\\P\\P\n\n/(..)\\1{2,}?x/8i\n    ab\\P\n    abA\\P\n    aBAb\\P\n    abaBA\\P\n    abAbaB\\P\n    abaBabA\\P\n    abAbABaBx\\P\n\n/./8<CRLF>\n    \\r\\P\n    \\r\\P\\P \n  \n/.{2,3}/8<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/.{2,3}?/8<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/[^\\x{100}][^\\x{1234}][^\\x{ffff}][^\\x{10000}][^\\x{10ffff}]/8BZ\n\n/[^\\x{100}][^\\x{1234}][^\\x{ffff}][^\\x{10000}][^\\x{10ffff}]/8BZi\n\n/[^\\x{100}]*[^\\x{10000}]+[^\\x{10ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{fffff}]{5,6}+/8BZ\n\n/[^\\x{100}]*[^\\x{10000}]+[^\\x{10ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{fffff}]{5,6}+/8BZi\n\n/(?<=\\x{1234}\\x{1234})\\bxy/I8\n\n/(?<!^)ETA/8\n    ETA\n\n/\\u0100/<JS>8BZ\n\n/[\\u0100-\\u0200]/<JS>8BZ\n\n/\\ud800/<JS>8\n\n/^a+[a\\x{200}]/8BZ\n    aa\n\n/[b-d\\x{200}-\\x{250}]*[ae-h]?#[\\x{200}-\\x{250}]{0,8}[\\x00-\\xff]*#[\\x{200}-\\x{250}]+[a-z]/8BZ\n\n/[^\\xff]*PRUNE:\\x{100}abc(xyz(?1))/8DZ\n\n/(?<=\\K\\x{17f})/8g+\n    \\x{17f}\\x{17f}\\x{17f}\\x{17f}\\x{17f}\n\n/(?<=\\K\\x{17f})/8G+\n    \\x{17f}\\x{17f}\\x{17f}\\x{17f}\\x{17f}\n\n/\\C[^\\v]+\\x80/8\n    [AΏBŀC]\n\n/\\C[^\\d]+\\x80/8\n    [AΏBŀC]\n\n/-- End of testinput5 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput6",
    "content": "/-- This set of tests is for Unicode property support. It is compatible with\n    Perl >= 5.15. --/\n    \n< forbid 9?=ABCDEFfGILMNPTUXZ<\n\n/^\\pC\\pL\\pM\\pN\\pP\\pS\\pZ</8\n    \\x7f\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n    \\np\\x{300}9!\\$ < \n    ** Failers \n    ap\\x{300}9!\\$ < \n  \n/^\\PC/8\n    X\n    ** Failers \n    \\x7f\n  \n/^\\PL/8\n    9\n    ** Failers \n    \\x{c0}\n  \n/^\\PM/8\n    X\n    ** Failers \n    \\x{30f}\n  \n/^\\PN/8\n    X\n    ** Failers \n    \\x{660}\n  \n/^\\PP/8\n    X\n    ** Failers \n    \\x{66c}\n  \n/^\\PS/8\n    X\n    ** Failers \n    \\x{f01}\n  \n/^\\PZ/8\n    X\n    ** Failers \n    \\x{1680}\n    \n/^\\p{Cc}/8\n    \\x{017}\n    \\x{09f} \n    ** Failers\n    \\x{0600} \n  \n/^\\p{Cf}/8\n    \\x{601}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Cn}/8\n    \\x{e0000}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Co}/8\n    \\x{f8ff}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Ll}/8\n    a\n    ** Failers \n    Z\n    \\x{e000}  \n  \n/^\\p{Lm}/8\n    \\x{2b0}\n    ** Failers\n    a \n  \n/^\\p{Lo}/8\n    \\x{1bb}\n    \\x{3400}\n    \\x{3401}\n    \\x{4d00}\n    \\x{4db4}\n    \\x{4db5}     \n    ** Failers\n    a \n    \\x{2b0}\n    \\x{4db6} \n  \n/^\\p{Lt}/8\n    \\x{1c5}\n    ** Failers\n    a \n    \\x{2b0}\n  \n/^\\p{Lu}/8\n    A\n    ** Failers\n    \\x{2b0}\n  \n/^\\p{Mc}/8\n    \\x{903}\n    ** Failers\n    X\n    \\x{300}\n       \n/^\\p{Me}/8\n    \\x{488}\n    ** Failers\n    X\n    \\x{903}\n    \\x{300}\n  \n/^\\p{Mn}/8\n    \\x{300}\n    ** Failers\n    X\n    \\x{903}\n  \n/^\\p{Nd}+/8\n    0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\\x{66a}\n    \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\\x{6fa}\n    \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\\x{970}\n    ** Failers\n    X\n  \n/^\\p{Nl}/8\n    \\x{16ee}\n    ** Failers\n    X\n    \\x{966}\n  \n/^\\p{No}/8\n    \\x{b2}\n    \\x{b3}\n    ** Failers\n    X\n    \\x{16ee}\n  \n/^\\p{Pc}/8\n    \\x5f\n    \\x{203f}\n    ** Failers\n    X\n    -\n    \\x{58a}\n  \n/^\\p{Pd}/8\n    -\n    \\x{58a}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Pe}/8\n    )\n    ]\n    }\n    \\x{f3b}\n    ** Failers\n    X\n    \\x{203f}\n    (\n    [\n    {\n    \\x{f3c}\n  \n/^\\p{Pf}/8\n    \\x{bb}\n    \\x{2019}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Pi}/8\n    \\x{ab}\n    \\x{2018}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Po}/8\n    !\n    \\x{37e}\n    ** Failers\n    X\n    \\x{203f}\n  \n/^\\p{Ps}/8\n    (\n    [\n    {\n    \\x{f3c}\n    ** Failers\n    X\n    )\n    ]\n    }\n    \\x{f3b}\n  \n/^\\p{Sk}/8\n    \\x{2c2}\n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{Sm}+/8\n    +<|~\\x{ac}\\x{2044}\n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{So}/8\n    \\x{a6}\n    \\x{482} \n    ** Failers\n    X\n    \\x{9f2}\n  \n/^\\p{Zl}/8\n    \\x{2028}\n    ** Failers\n    X\n    \\x{2029}\n  \n/^\\p{Zp}/8\n    \\x{2029}\n    ** Failers\n    X\n    \\x{2028}\n  \n/\\p{Nd}+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}+?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,3}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}{2,3}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}??(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(...)/8\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(....)/8\n      ** Failers\n      \\x{660}\\x{661}\\x{662}ABC\n  \n/(?<=A\\p{Nd})XYZ/8\n    A2XYZ\n    123A5XYZPQR\n    ABA\\x{660}XYZpqr\n    ** Failers\n    AXYZ\n    XYZ     \n    \n/(?<!\\pL)XYZ/8\n    1XYZ\n    AB=XYZ.. \n    XYZ \n    ** Failers\n    WXYZ \n\n/[\\P{Nd}]+/8\n    abcd\n    ** Failers\n    1234\n\n/\\D+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n     \n/\\P{Nd}+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\P{Nd}]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D\\P{Nd}]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\pL/8\n    a\n    A \n\n/\\pL/8i\n    a\n    A \n    \n/\\p{Lu}/8 \n    A\n    aZ\n    ** Failers\n    abc   \n\n/\\p{Ll}/8 \n    a\n    Az\n    ** Failers\n    ABC   \n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    ** Failers\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8i\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/\\x{391}+/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n\n/\\x{391}{3,5}(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n\n/\\x{391}{3,5}?(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n\n/[\\x{391}\\x{ff3a}]/8i\n    \\x{391}\n    \\x{ff3a}\n    \\x{3b1}\n    \\x{ff5a}   \n    \n/^[\\X]/8\n    X123\n    *** Failers\n    AXYZ\n\n/^(\\X*)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*?)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^(\\X*?)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n\n/^\\X(.)/8\n    *** Failers\n    A\\x{300}\\x{301}\\x{302}\n\n/^\\X{2,3}(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n    \n/^\\X{2,3}?(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n\n/^\\X/8\n    A\n    A\\x{300}BC \n    A\\x{300}\\x{301}\\x{302}BC \n    \\x{300}  \n\n/^\\p{Han}+/8\n    \\x{2e81}\\x{3007}\\x{2f804}\\x{31a0}\n    ** Failers\n    \\x{2e7f}  \n\n/^\\P{Katakana}+/8\n    \\x{3105}\n    ** Failers\n    \\x{30ff}  \n\n/^[\\p{Arabic}]/8\n    \\x{06e9}\n    \\x{060b}\n    ** Failers\n    \\x{061c}\n    X\\x{06e9}   \n\n/^[\\P{Yi}]/8\n    \\x{2f800}\n    ** Failers\n    \\x{a014}\n    \\x{a4c6}   \n    \n/^\\p{Any}X/8\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    X  \n    \n/^\\P{Any}X/8\n    ** Failers\n    AX\n    \n/^\\p{Any}?X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    ABXYZ   \n\n/^\\P{Any}?X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ \n    ABXYZ   \n\n/^\\p{Any}+X/8\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n    XYZ\n\n/^\\P{Any}+X/8\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    XYZ\n\n/^\\p{Any}*X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n\n/^\\P{Any}*X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n\n/^[\\p{Any}]X/8\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    X  \n    \n/^[\\P{Any}]X/8\n    ** Failers\n    AX\n    \n/^[\\p{Any}]?X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ \n    ** Failers\n    ABXYZ   \n\n/^[\\P{Any}]?X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ \n    ABXYZ   \n\n/^[\\p{Any}]+X/8\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n    XYZ\n\n/^[\\P{Any}]+X/8\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    XYZ\n\n/^[\\p{Any}]*X/8\n    XYZ\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n    ** Failers\n\n/^[\\P{Any}]*X/8\n    XYZ\n    ** Failers\n    AXYZ\n    \\x{1234}XYZ\n    A\\x{1234}XYZ\n\n/^\\p{Any}{3,5}?/8\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\p{Any}{3,5}/8\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\P{Any}{3,5}?/8\n    ** Failers\n    abcdefgh\n    \\x{1234}\\n\\r\\x{3456}xyz \n\n/^\\p{L&}X/8\n     AXY\n     aXY\n     \\x{1c5}XY\n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]X/8\n     AXY\n     aXY\n     \\x{1c5}XY\n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\p{L&}+X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]+X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\p{L&}+?X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^[\\p{L&}]+?X/8\n     AXY\n     aXY\n     AbcdeXyz \n     \\x{1c5}AbXY\n     abcDEXypqreXlmn \n     ** Failers\n     \\x{1bb}XY\n     \\x{2b0}XY\n     !XY      \n\n/^\\P{L&}X/8\n     !XY\n     \\x{1bb}XY\n     \\x{2b0}XY\n     ** Failers\n     \\x{1c5}XY\n     AXY      \n\n/^[\\P{L&}]X/8\n     !XY\n     \\x{1bb}XY\n     \\x{2b0}XY\n     ** Failers\n     \\x{1c5}XY\n     AXY      \n\n/^(\\p{Z}[^\\p{C}\\p{Z}]+)*$/\n    \\xa0!\n\n/^[\\pL](abc)(?1)/\n    AabcabcYZ    \n\n/([\\pL]=(abc))*X/\n    L=abcX\n\n/^\\p{Balinese}\\p{Cuneiform}\\p{Nko}\\p{Phags_Pa}\\p{Phoenician}/8\n    \\x{1b00}\\x{12000}\\x{7c0}\\x{a840}\\x{10900}\n\n/Check property support in non-UTF-8 mode/\n \n/\\p{L}{4}/\n    123abcdefg\n    123abc\\xc4\\xc5zz\n\n/\\X{1,3}\\d/\n  \\x8aBCD\n  \n/\\X?\\d/\n  \\x8aBCD \n\n/\\P{L}?\\d/\n  \\x8aBCD \n\n/[\\PPP\\x8a]{1,}\\x80/\n    A\\x80\n\n/^[\\p{Arabic}]/8\n    \\x{604}\n    \\x{60e} \n    \\x{656} \n    \\x{657} \n    \\x{658} \n    \\x{659} \n    \\x{65a} \n    \\x{65b} \n    \\x{65c} \n    \\x{65d} \n    \\x{65e} \n    \\x{65f}\n    \\x{66a} \n    \\x{6e9} \n    \\x{6ef}\n    \\x{6fa}  \n    ** Failers\n    \\x{650}\n    \\x{651}  \n    \\x{652}  \n    \\x{653}  \n    \\x{654} \n    \\x{655} \n    \n/^\\p{Cyrillic}/8\n    \\x{1d2b} \n    \n/^\\p{Common}/8\n    \\x{589}\n    \\x{60c}\n    \\x{61f}  \n    \\x{964}\n    \\x{965}  \n\n/^\\p{Inherited}/8\n    \\x{64b}\n    \\x{654}\n    \\x{655}\n    \\x{200c} \n    ** Failers\n    \\x{64a}\n    \\x{656}     \n\n/^\\p{Shavian}/8\n    \\x{10450}\n    \\x{1047f}\n    \n/^\\p{Deseret}/8\n    \\x{10400}\n    \\x{1044f}\n    \n/^\\p{Osmanya}/8\n    \\x{10480}\n    \\x{1049d}\n    \\x{104a0}\n    \\x{104a9}\n    ** Failers\n    \\x{1049e}\n    \\x{1049f}\n    \\x{104aa}           \n\n/\\p{Carian}\\p{Cham}\\p{Kayah_Li}\\p{Lepcha}\\p{Lycian}\\p{Lydian}\\p{Ol_Chiki}\\p{Rejang}\\p{Saurashtra}\\p{Sundanese}\\p{Vai}/8\n    \\x{102A4}\\x{AA52}\\x{A91D}\\x{1C46}\\x{10283}\\x{1092E}\\x{1C6B}\\x{A93B}\\x{A8BF}\\x{1BA0}\\x{A50A}====\n\n/\\x{a77d}\\x{1d79}/8i\n    \\x{a77d}\\x{1d79}\n    \\x{1d79}\\x{a77d} \n\n/\\x{a77d}\\x{1d79}/8\n    \\x{a77d}\\x{1d79}\n    ** Failers \n    \\x{1d79}\\x{a77d} \n\n/(A)\\1/8i\n    AA\n    Aa\n    aa\n    aA\n\n/(\\x{10a})\\1/8i\n    \\x{10a}\\x{10a}\n    \\x{10a}\\x{10b}\n    \\x{10b}\\x{10b}\n    \\x{10b}\\x{10a}\n    \n/The next two tests are for property support in non-UTF-8 mode/\n\n/(?:\\p{Lu}|\\x20)+/\n    \\x41\\x20\\x50\\xC2\\x54\\xC9\\x20\\x54\\x4F\\x44\\x41\\x59\n\n/[\\p{Lu}\\x20]+/\n    \\x41\\x20\\x50\\xC2\\x54\\xC9\\x20\\x54\\x4F\\x44\\x41\\x59\n\n/\\p{Avestan}\\p{Bamum}\\p{Egyptian_Hieroglyphs}\\p{Imperial_Aramaic}\\p{Inscriptional_Pahlavi}\\p{Inscriptional_Parthian}\\p{Javanese}\\p{Kaithi}\\p{Lisu}\\p{Meetei_Mayek}\\p{Old_South_Arabian}\\p{Old_Turkic}\\p{Samaritan}\\p{Tai_Tham}\\p{Tai_Viet}/8\n    \\x{10b00}\\x{a6ef}\\x{13007}\\x{10857}\\x{10b78}\\x{10b58}\\x{a980}\\x{110c1}\\x{a4ff}\\x{abc0}\\x{10a7d}\\x{10c48}\\x{0800}\\x{1aad}\\x{aac0}\n\n/^\\w+/8W\n    Az_\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n\n/^[[:xdigit:]]*/8W\n    1a\\x{660}\\x{bef}\\x{16ee}\n  \n/^\\d+/8W\n    1\\x{660}\\x{bef}\\x{16ee}\n  \n/^[[:digit:]]+/8W\n    1\\x{660}\\x{bef}\\x{16ee}\n\n/^>\\s+/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n  \n/^>\\pZ+/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n  \n/^>[[:space:]]*/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n\n/^>[[:blank:]]*/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{180e}\\x{2000}\\x{202f}\\x{9}\\x{b}\\x{2028} \n\n/^[[:alpha:]]*/8W\n    Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}\n\n/^[[:alnum:]]*/8W\n    Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n\n/^[[:cntrl:]]*/8W\n    \\x{0}\\x{09}\\x{1f}\\x{7f}\\x{9f} \n\n/^[[:graph:]]*/8W\n    A\\x{a1}\\x{a0}\n\n/^[[:print:]]*/8W\n    A z\\x{a0}\\x{a1}\n\n/^[[:punct:]]*/8W\n    .+\\x{a1}\\x{a0}\n\n/\\p{Zs}*?\\R/\n    ** Failers\n    a\\xFCb   \n\n/\\p{Zs}*\\R/                                                                    \n    ** Failers \n    a\\xFCb   \n\n/ⱥ/8i\n    ⱥ\n    Ⱥx \n    Ⱥ \n\n/[ⱥ]/8i\n    ⱥ\n    Ⱥx \n    Ⱥ \n\n/Ⱥ/8i\n    Ⱥ\n    ⱥ\n    \n/-- These are tests for extended grapheme clusters --/ \n\n/^\\X/8+\n    G\\x{34e}\\x{34e}X\n    \\x{34e}\\x{34e}X\n    \\x04X\n    \\x{1100}X\n    \\x{1100}\\x{34e}X\n    \\x{1b04}\\x{1b04}X \n    *These match up to the roman letters\n    \\x{1111}\\x{1111}L,L\n    \\x{1111}\\x{1111}\\x{1169}L,L,V\n    \\x{1111}\\x{ae4c}L, LV\n    \\x{1111}\\x{ad89}L, LVT\n    \\x{1111}\\x{ae4c}\\x{1169}L, LV, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}L, LV, V, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}L, LV, V, T\n    \\x{1111}\\x{ad89}\\x{11fe}L, LVT, T\n    \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}L, LVT, T, T\n    \\x{ad89}\\x{11fe}\\x{11fe}LVT, T, T\n    *These match just the first codepoint (invalid sequence)\n    \\x{1111}\\x{11fe}L, T\n    \\x{ae4c}\\x{1111}LV, L\n    \\x{ae4c}\\x{ae4c}LV, LV\n    \\x{ae4c}\\x{ad89}LV, LVT\n    \\x{1169}\\x{1111}V, L\n    \\x{1169}\\x{ae4c}V, LV\n    \\x{1169}\\x{ad89}V, LVT\n    \\x{ad89}\\x{1111}LVT, L\n    \\x{ad89}\\x{1169}LVT, V\n    \\x{ad89}\\x{ae4c}LVT, LV\n    \\x{ad89}\\x{ad89}LVT, LVT\n    \\x{11fe}\\x{1111}T, L\n    \\x{11fe}\\x{1169}T, V\n    \\x{11fe}\\x{ae4c}T, LV\n    \\x{11fe}\\x{ad89}T, LVT\n    *Test extend and spacing mark\n    \\x{1111}\\x{ae4c}\\x{0711}L, LV, extend\n    \\x{1111}\\x{ae4c}\\x{1b04}L, LV, spacing mark\n    \\x{1111}\\x{ae4c}\\x{1b04}\\x{0711}\\x{1b04}L, LV, spacing mark, extend, spacing mark\n    *Test CR, LF, and control\n    \\x0d\\x{0711}CR, extend\n    \\x0d\\x{1b04}CR, spacingmark\n    \\x0a\\x{0711}LF, extend\n    \\x0a\\x{1b04}LF, spacingmark\n    \\x0b\\x{0711}Control, extend\n    \\x09\\x{1b04}Control, spacingmark\n    *There are no Prepend characters, so we can't test Prepend, CR\n    \n/^(?>\\X{2})X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \n/^\\X{2,4}X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n\n/^\\X{2,4}?X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n\n/\\X*Z/8Y\n  A\\x{300}\n\n/\\X*(.)/8Y\n  A\\x{1111}\\x{ae4c}\\x{1169}\n\n/\\X?abc/8Y\n\\xff\\x7f\\x00\\x00\\x03\\x00\\x41\\xcc\\x80\\x41\\x{300}\\x61\\x62\\x63\\x00\\>06\\?\n\n/-- --/\n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n\n/[z\\x{1e9e}]+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n\n/[z\\x{00df}]+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n\n/[z\\x{1f88}]+/8i\n    \\x{1f88}\\x{1f80} \n    \n/-- Characters with more than one other case; test in classes --/\n\n/[z\\x{00b5}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/[z\\x{039c}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/[z\\x{03bc}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/[z\\x{00c5}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/[z\\x{00e5}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/[z\\x{212b}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/[z\\x{01c4}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/[z\\x{01c5}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/[z\\x{01c6}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/[z\\x{01c7}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/[z\\x{01c8}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/[z\\x{01c9}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/[z\\x{01ca}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/[z\\x{01cb}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/[z\\x{01cc}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/[z\\x{01f1}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/[z\\x{01f2}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/[z\\x{01f3}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/[z\\x{0345}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/[z\\x{0399}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/[z\\x{03b9}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/[z\\x{1fbe}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/[z\\x{0392}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/[z\\x{03b2}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/[z\\x{03d0}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/[z\\x{0395}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/[z\\x{03b5}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/[z\\x{03f5}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/[z\\x{0398}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/[z\\x{03b8}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/[z\\x{03d1}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/[z\\x{03f4}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/[z\\x{039a}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/[z\\x{03ba}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/[z\\x{03f0}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/[z\\x{03a0}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/[z\\x{03c0}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/[z\\x{03d6}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/[z\\x{03a1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/[z\\x{03c1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/[z\\x{03f1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/[z\\x{03a3}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/[z\\x{03c2}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/[z\\x{03c3}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/[z\\x{03a6}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/[z\\x{03c6}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/[z\\x{03d5}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/[z\\x{03c9}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/[z\\x{03a9}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/[z\\x{2126}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/[z\\x{1e60}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/[z\\x{1e61}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/[z\\x{1e9b}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/\n\n/[z\\x{004b}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/[z\\x{006b}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/[z\\x{212a}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/[z\\x{0053}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/[z\\x{0073}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/[z\\x{017f}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n    \n/-- --/ \n\n/(ΣΆΜΟΣ) \\1/8i\n    ΣΆΜΟΣ ΣΆΜΟΣ\n    ΣΆΜΟΣ σάμος\n    σάμος σάμος\n    σάμος σάμοσ\n    σάμος ΣΆΜΟΣ  \n\n/(σάμος) \\1/8i\n    ΣΆΜΟΣ ΣΆΜΟΣ\n    ΣΆΜΟΣ σάμος\n    σάμος σάμος\n    σάμος σάμοσ\n    σάμος ΣΆΜΟΣ  \n\n/(ΣΆΜΟΣ) \\1*/8i\n    ΣΆΜΟΣ\\x20\n    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος\n\n/-- Perl matches these --/\n\n/\\x{00b5}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/\\x{039c}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n/\\x{03bc}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n\n\n/\\x{00c5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/\\x{00e5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n/\\x{212b}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n\n\n/\\x{01c4}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/\\x{01c5}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n/\\x{01c6}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n\n\n/\\x{01c7}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/\\x{01c8}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n/\\x{01c9}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n\n\n/\\x{01ca}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/\\x{01cb}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n/\\x{01cc}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n\n\n/\\x{01f1}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/\\x{01f2}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n/\\x{01f3}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n\n\n/\\x{0345}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{0399}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{03b9}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n/\\x{1fbe}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n\n\n/\\x{0392}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/\\x{03b2}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n\n/\\x{03d0}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n    \n\n/\\x{0395}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/\\x{03b5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n/\\x{03f5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n\n\n/\\x{0398}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03b8}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03d1}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n\n/\\x{03f4}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n    \n\n/\\x{039a}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/\\x{03ba}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n\n/\\x{03f0}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n    \n\n/\\x{03a0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/\\x{03c0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n/\\x{03d6}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n\n\n/\\x{03a1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/\\x{03c1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n/\\x{03f1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n\n\n/\\x{03a3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/\\x{03c2}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n\n/\\x{03c3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n    \n\n/\\x{03a6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/\\x{03c6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n/\\x{03d5}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n\n\n/\\x{03c9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/\\x{03a9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n\n/\\x{2126}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n    \n\n/\\x{1e60}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e61}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e9b}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n    \n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n    \n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n\n/\\x{1f80}+/8i\n    \\x{1f88}\\x{1f80} \n\n\n/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/\n\n/\\x{004b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/\\x{006b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n/\\x{212a}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n\n\n/\\x{0053}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/\\x{0073}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/\\x{017f}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n\n/^\\p{Any}*\\d{4}/8\n    1234\n    123 \n\n/^\\X*\\w{4}/8\n    1234\n    123  \n\n/^A\\s+Z/8W\n    A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n\n/^A[\\s]+Z/8W\n    A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n\n/^[[:graph:]]+$/8W\n    Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n    Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n    ** Failers\n    \\x{09}\n    \\x{0a}\n    \\x{1D}\n    \\x{20}\n    \\x{85}\n    \\x{a0}\n    \\x{61c}\n    \\x{1680}\n    \\x{180e}\n    \\x{2028}\n    \\x{2029}\n    \\x{202f}\n    \\x{2065}\n    \\x{2066}\n    \\x{2067}\n    \\x{2068}\n    \\x{2069}\n    \\x{3000}\n    \\x{e0002}\n    \\x{e001f}\n    \\x{e0080} \n\n/^[[:print:]]+$/8W\n    Space: \\x{a0}\n    \\x{1680}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\n    \\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a} \n    \\x{202f}\\x{205f} \n    \\x{3000}\n    Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n    Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{180e}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{202f}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n    ** Failers\n    \\x{09}\n    \\x{1D}\n    \\x{85}\n    \\x{61c}\n    \\x{2028}\n    \\x{2029}\n    \\x{2065}\n    \\x{2066}\n    \\x{2067}\n    \\x{2068}\n    \\x{2069}\n    \\x{e0002}\n    \\x{e001f}\n    \\x{e0080} \n\n/^[[:punct:]]+$/8W\n    \\$+<=>^`|~\n    !\\\"#%&'()*,-./:;?@[\\\\]_{}\n    \\x{a1}\\x{a7}  \n    \\x{37e} \n    ** Failers\n    abcde  \n\n/^[[:^graph:]]+$/8W\n    \\x{09}\\x{0a}\\x{1D}\\x{20}\\x{85}\\x{a0}\\x{61c}\\x{1680}\\x{180e}\n    \\x{2028}\\x{2029}\\x{202f}\\x{2065}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\n    \\x{3000}\\x{e0002}\\x{e001f}\\x{e0080}\n    ** Failers\n    Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n    Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n\n/^[[:^print:]]+$/8W\n    \\x{09}\\x{1D}\\x{85}\\x{61c}\\x{2028}\\x{2029}\\x{2065}\\x{2066}\\x{2067}\n    \\x{2068}\\x{2069}\\x{e0002}\\x{e001f}\\x{e0080}\n    ** Failers\n    Space: \\x{a0}\n    \\x{1680}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\n    \\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a} \n    \\x{202f}\\x{205f} \n    \\x{3000}\n    Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n    Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{180e}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{202f}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n\n/^[[:^punct:]]+$/8W\n    abcde  \n    ** Failers\n    \\$+<=>^`|~\n    !\\\"#%&'()*,-./:;?@[\\\\]_{}\n    \\x{a1}\\x{a7}  \n    \\x{37e} \n\n/[RST]+/8iW\n    Ss\\x{17f}\n    \n/[R-T]+/8iW \n    Ss\\x{17f}\n\n/[q-u]+/8iW \n    Ss\\x{17f}\n\n/^s?c/mi8\n    scat\n\n/[A-`]/i8\n    abcdefghijklmno\n\n/\\C\\X*QT/8\n    Ӆ\\x0aT\n\n/[\\pS#moq]/\n    =\n\n/[[:punct:]]/8W\n    \\xc2\\xb4\n    \\x{b4} \n\n/[[:^ascii:]]/8W\n    \\x{100}\n    \\x{200}\n    \\x{300}\n    \\x{37e}\n    a\n    9\n    g\n\n/[[:^ascii:]\\w]/8W\n    a\n    9\n    g\n    \\x{100}\n    \\x{200}\n    \\x{300}\n    \\x{37e}\n\n/[\\w[:^ascii:]]/8W\n    a\n    9\n    g\n    \\x{100}\n    \\x{200}\n    \\x{300}\n    \\x{37e}\n\n/[^[:ascii:]\\W]/8W\n    a\n    9\n    g\n    \\x{100}\n    \\x{200}\n    \\x{300}\n    \\x{37e}\n\n/[[:^ascii:]a]/8W\n    a\n    9\n    g\n    \\x{100}\n    \\x{200}\n    \\x{37e}\n\n/[^[:^ascii:]\\d]/8W\n    a\n    ~\n    0\n    \\a\n    \\x{7f}\n    \\x{389}\n    \\x{20ac}\n\n/(?=.*b)\\pL/\n    11bb\n    \n/(?(?=.*b)(?=.*b)\\pL|.*c)/\n    11bb\n\n/-- End of testinput6 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput7",
    "content": "/-- These tests for Unicode property support test PCRE's API and show some of\n    the compiled code. They are not Perl-compatible. --/\n\n/[\\p{L}]/DZ\n\n/[\\p{^L}]/DZ\n\n/[\\P{L}]/DZ\n\n/[\\P{^L}]/DZ\n\n/[abc\\p{L}\\x{0660}]/8DZ\n\n/[\\p{Nd}]/8DZ\n    1234\n\n/[\\p{Nd}+-]+/8DZ\n    1234\n    12-34\n    12+\\x{661}-34  \n    ** Failers\n    abcd  \n\n/[\\x{105}-\\x{109}]/8iDZ\n    \\x{104}\n    \\x{105}\n    \\x{109}  \n    ** Failers\n    \\x{100}\n    \\x{10a} \n    \n/[z-\\x{100}]/8iDZ \n    Z\n    z\n    \\x{39c}\n    \\x{178}\n    |\n    \\x{80}\n    \\x{ff}\n    \\x{100}\n    \\x{101} \n    ** Failers\n    \\x{102}\n    Y\n    y           \n\n/[z-\\x{100}]/8DZi\n\n/(?:[\\PPa*]*){8,}/\n\n/[\\P{Any}]/BZ\n\n/[\\P{Any}\\E]/BZ\n\n/(\\P{Yi}+\\277)/\n\n/(\\P{Yi}+\\277)?/\n\n/(?<=\\P{Yi}{3}A)X/\n\n/\\p{Yi}+(\\P{Yi}+)(?1)/\n\n/(\\P{Yi}{2}\\277)?/\n\n/[\\P{Yi}A]/\n\n/[\\P{Yi}\\P{Yi}\\P{Yi}A]/\n\n/[^\\P{Yi}A]/\n\n/[^\\P{Yi}\\P{Yi}\\P{Yi}A]/\n\n/(\\P{Yi}*\\277)*/\n\n/(\\P{Yi}*?\\277)*/\n\n/(\\p{Yi}*+\\277)*/\n\n/(\\P{Yi}?\\277)*/\n\n/(\\P{Yi}??\\277)*/\n\n/(\\p{Yi}?+\\277)*/\n\n/(\\P{Yi}{0,3}\\277)*/\n\n/(\\P{Yi}{0,3}?\\277)*/\n\n/(\\p{Yi}{0,3}+\\277)*/\n\n/\\p{Zl}{2,3}+/8BZ\n      \n    \\x{2028}\\x{2028}\\x{2028}\n    \n/\\p{Zl}/8BZ\n\n/\\p{Lu}{3}+/8BZ\n\n/\\pL{2}+/8BZ\n\n/\\p{Cc}{2}+/8BZ\n\n/^\\p{Cf}/8\n    \\x{180e}\n    \\x{061c}\n    \\x{2066}\n    \\x{2067}\n    \\x{2068}\n    \\x{2069}\n\n/^\\p{Cs}/8\n    \\?\\x{dfff}\n    ** Failers\n    \\x{09f} \n  \n/^\\p{Mn}/8\n    \\x{1a1b}\n\n/^\\p{Pe}/8\n    \\x{2309}\n    \\x{230b}\n\n/^\\p{Ps}/8\n    \\x{2308}\n    \\x{230a}\n\n/^\\p{Sc}+/8\n    $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\\x{a6}\n    \\x{9f2}\n    ** Failers\n    X\n    \\x{2c2}\n  \n/^\\p{Zs}/8\n    \\ \\\n    \\x{a0}\n    \\x{1680}\n    \\x{2000}\n    \\x{2001}     \n    ** Failers\n    \\x{2028}\n    \\x{200d} \n  \n/-- These are here rather than in test 6 because Perl has problems with\n    the negative versions of the properties and behaves has changed how\n    it behaves for caseless matching. --/\n      \n/\\p{^Lu}/8i\n    1234\n    ** Failers\n    ABC \n\n/\\P{Lu}/8i\n    1234\n    ** Failers\n    ABC \n\n/\\p{Ll}/8i \n    a\n    Az\n    ** Failers\n    ABC   \n\n/\\p{Lu}/8i\n    A\n    a\\x{10a0}B \n    ** Failers \n    a\n    \\x{1d00}  \n\n/\\p{Lu}/8i\n    A\n    aZ\n    ** Failers\n    abc   \n\n/[\\x{c0}\\x{391}]/8i\n    \\x{c0}\n    \\x{e0} \n\n/-- The next two are special cases where the lengths of the different cases of\nthe same character differ. The first went wrong with heap frame storage; the\nsecond was broken in all cases. --/\n\n/^\\x{023a}+?(\\x{0130}+)/8i\n  \\x{023a}\\x{2c65}\\x{0130}\n  \n/^\\x{023a}+([^X])/8i\n  \\x{023a}\\x{2c65}X\n\n/\\x{c0}+\\x{116}+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/[\\x{c0}\\x{116}]+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/(\\x{de})\\1/8i\n    \\x{de}\\x{de}\n    \\x{de}\\x{fe}\n    \\x{fe}\\x{fe}\n    \\x{fe}\\x{de}\n\n/^\\x{c0}$/8i\n    \\x{c0}\n    \\x{e0} \n\n/^\\x{e0}$/8i\n    \\x{c0}\n    \\x{e0} \n\n/-- The next two should be Perl-compatible, but it fails to match \\x{e0}. PCRE\nwill match it only with UCP support, because without that it has no notion\nof case for anything other than the ASCII letters. --/ \n\n/((?i)[\\x{c0}])/8\n    \\x{c0}\n    \\x{e0} \n\n/(?i:[\\x{c0}])/8\n    \\x{c0}\n    \\x{e0} \n\n/-- These are PCRE's extra properties to help with Unicodizing \\d etc. --/\n\n/^\\p{Xan}/8\n    ABCD\n    1234\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    ** Failers\n    _ABC   \n\n/^\\p{Xan}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    ** Failers\n    _ABC   \n\n/^\\p{Xan}+?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xan}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xan}{2,9}/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xan}{2,9}?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^[\\p{Xan}]/8\n    ABCD1234_\n    1234abcd_\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    ** Failers\n    _ABC   \n \n/^[\\p{Xan}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    ** Failers\n    _ABC   \n\n/^>\\p{Xsp}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n    >\\x{a0} \n    ** Failers\n    \\x{0b} \n\n/^>\\p{Xsp}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xsp}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xsp}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xsp}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xsp}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>[\\p{Xsp}]/8\n    >\\x{2028}\\x{0b}\n \n/^>[\\p{Xsp}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n    >\\x{a0} \n    ** Failers\n    \\x{0b} \n\n/^>\\p{Xps}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>[\\p{Xps}]/8\n    >\\x{2028}\\x{0b}\n \n/^>[\\p{Xps}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^\\p{Xwd}/8\n    ABCD\n    1234\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}\n    _ABC    \n    ** Failers\n    [] \n\n/^\\p{Xwd}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xwd}+?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xwd}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xwd}{2,9}/8\n    A_B12\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^\\p{Xwd}{2,9}?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^[\\p{Xwd}]/8\n    ABCD1234_\n    1234abcd_\n    \\x{6ca}\n    \\x{a6c}\n    \\x{10a7}   \n    _ABC \n    ** Failers\n    []   \n \n/^[\\p{Xwd}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/-- A check not in UTF-8 mode --/\n\n/^[\\p{Xwd}]+/\n    ABCD1234_\n    \n/-- Some negative checks --/\n\n/^[\\P{Xwd}]+/8\n    !.+\\x{019}\\x{35a}AB\n\n/^[\\p{^Xwd}]+/8\n    !.+\\x{019}\\x{35a}AB\n\n/[\\D]/WBZ8\n    1\\x{3c8}2\n\n/[\\d]/WBZ8\n    >\\x{6f4}<\n\n/[\\S]/WBZ8\n    \\x{1680}\\x{6f4}\\x{1680}\n\n/[\\s]/WBZ8\n    >\\x{1680}<\n\n/[\\W]/WBZ8\n    A\\x{1712}B\n\n/[\\w]/WBZ8\n    >\\x{1723}<\n\n/\\D/WBZ8\n    1\\x{3c8}2\n\n/\\d/WBZ8\n    >\\x{6f4}<\n\n/\\S/WBZ8\n    \\x{1680}\\x{6f4}\\x{1680}\n\n/\\s/WBZ8\n    >\\x{1680}>\n\n/\\W/WBZ8\n    A\\x{1712}B\n\n/\\w/WBZ8\n    >\\x{1723}<\n\n/[[:alpha:]]/WBZ\n\n/[[:lower:]]/WBZ\n\n/[[:upper:]]/WBZ\n\n/[[:alnum:]]/WBZ\n\n/[[:ascii:]]/WBZ\n\n/[[:cntrl:]]/WBZ\n\n/[[:digit:]]/WBZ\n\n/[[:graph:]]/WBZ\n\n/[[:print:]]/WBZ\n\n/[[:punct:]]/WBZ\n\n/[[:space:]]/WBZ\n\n/[[:word:]]/WBZ\n\n/[[:xdigit:]]/WBZ\n\n/-- Unicode properties for \\b abd \\B --/\n\n/\\b...\\B/8W\n    abc_\n    \\x{37e}abc\\x{376} \n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n\n/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/\n\n/\\b...\\B/8\n    abc_\n    ** Failers \n    \\x{37e}abc\\x{376} \n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n\n/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/\n\n/\\b...\\B/W\n    abc_\n    !\\x{c0}++\\x{c1}\\x{c2} \n    !\\x{c0}+++++ \n\n/-- Some of these are silly, but they check various combinations --/\n\n/[[:^alpha:][:^cntrl:]]+/8WBZ\n    123\n    abc \n\n/[[:^cntrl:][:^alpha:]]+/8WBZ\n    123\n    abc \n\n/[[:alpha:]]+/8WBZ\n    abc\n\n/[[:^alpha:]\\S]+/8WBZ\n    123\n    abc \n\n/[^\\d]+/8WBZ\n    abc123\n    abc\\x{123}\n    \\x{660}abc   \n\n/\\p{Lu}+9\\p{Lu}+B\\p{Lu}+b/BZ\n\n/\\p{^Lu}+9\\p{^Lu}+B\\p{^Lu}+b/BZ\n\n/\\P{Lu}+9\\P{Lu}+B\\P{Lu}+b/BZ\n\n/\\p{Han}+X\\p{Greek}+\\x{370}/BZ8\n\n/\\p{Xan}+!\\p{Xan}+A/BZ\n\n/\\p{Xsp}+!\\p{Xsp}\\t/BZ\n\n/\\p{Xps}+!\\p{Xps}\\t/BZ\n\n/\\p{Xwd}+!\\p{Xwd}_/BZ\n\n/A+\\p{N}A+\\dB+\\p{N}*B+\\d*/WBZ\n\n/-- These behaved oddly in Perl, so they are kept in this test --/\n\n/(\\x{23a}\\x{23a}\\x{23a})?\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\n\n/(ȺȺȺ)?\\1/8i\n    ȺȺȺⱥⱥ\n\n/(\\x{23a}\\x{23a}\\x{23a})?\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n\n/(ȺȺȺ)?\\1/8i\n    ȺȺȺⱥⱥⱥ\n\n/(\\x{23a}\\x{23a}\\x{23a})\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\n\n/(ȺȺȺ)\\1/8i\n    ȺȺȺⱥⱥ\n\n/(\\x{23a}\\x{23a}\\x{23a})\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n\n/(ȺȺȺ)\\1/8i\n    ȺȺȺⱥⱥⱥ\n\n/(\\x{2c65}\\x{2c65})\\1/8i\n    \\x{2c65}\\x{2c65}\\x{23a}\\x{23a}\n    \n/(ⱥⱥ)\\1/8i\n    ⱥⱥȺȺ \n    \n/(\\x{23a}\\x{23a}\\x{23a})\\1Y/8i\n    X\\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}YZ\n\n/(\\x{2c65}\\x{2c65})\\1Y/8i\n    X\\x{2c65}\\x{2c65}\\x{23a}\\x{23a}YZ\n\n/-- --/ \n\n/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/\n\n/^[\\p{Batak}]/8\n    \\x{1bc0}\n    \\x{1bff}\n    ** Failers\n    \\x{1bf4}\n    \n/^[\\p{Brahmi}]/8\n    \\x{11000}\n    \\x{1106f}\n    ** Failers\n    \\x{1104e}\n    \n/^[\\p{Mandaic}]/8\n    \\x{840}\n    \\x{85e}\n    ** Failers\n    \\x{85c}\n    \\x{85d}    \n\n/-- --/ \n\n/(\\X*)(.)/s8\n    A\\x{300}\n\n/^S(\\X*)e(\\X*)$/8\n    Stéréo\n    \n/^\\X/8 \n    ́réo\n\n/^a\\X41z/<JS>\n    aX41z\n    *** Failers\n    aAz\n\n/(?<=ab\\Cde)X/8\n\n/\\X/\n    a\\P\n    a\\P\\P\n\n/\\Xa/\n    aa\\P\n    aa\\P\\P\n\n/\\X{2}/\n    aa\\P\n    aa\\P\\P\n\n/\\X+a/\n    a\\P\n    aa\\P\n    aa\\P\\P\n\n/\\X+?a/\n    a\\P\n    ab\\P\n    aa\\P\n    aa\\P\\P\n    aba\\P\n    \n/-- These Unicode 6.1.0 scripts are not known to Perl. --/ \n\n/\\p{Chakma}\\d/8W\n    \\x{11100}\\x{1113c}\n\n/\\p{Takri}\\d/8W\n    \\x{11680}\\x{116c0}\n\n/^\\X/8\n    A\\P\n    A\\P\\P \n    A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}\\P\\P  \n    A\\x{301}\\P\n    A\\x{301}\\P\\P  \n    \n/^\\X{2,3}/8\n    A\\P\n    A\\P\\P \n    AA\\P\n    AA\\P\\P  \n    A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}\\P\\P  \n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \n\n/^\\X{2}/8\n    AA\\P\n    AA\\P\\P  \n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \n    \n/^\\X+/8\n    AA\\P\n    AA\\P\\P  \n\n/^\\X+?Z/8\n    AA\\P\n    AA\\P\\P \n\n/A\\x{3a3}B/8iDZ\n\n/\\x{3a3}B/8iDZ\n\n/[\\x{3a3}]/8iBZ\n\n/[^\\x{3a3}]/8iBZ\n\n/[\\x{3a3}]+/8iBZ\n\n/[^\\x{3a3}]+/8iBZ\n\n/a*\\x{3a3}/8iBZ\n\n/\\x{3a3}+a/8iBZ\n\n/\\x{3a3}*\\x{3c2}/8iBZ\n\n/\\x{3a3}{3}/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}{2,4}/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}{2,4}?/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}+./8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}++./8i+\n    ** Failers\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}*\\x{3c2}/8iBZ\n\n/[^\\x{3a3}]*\\x{3c2}/8iBZ\n\n/[^a]*\\x{3c2}/8iBZ\n\n/ist/8iBZ\n    ikt\n\n/is+t/8i\n    iSs\\x{17f}t\n    ikt\n\n/is+?t/8i\n    ikt\n\n/is?t/8i\n    ikt\n\n/is{2}t/8i\n    iskt\n    \n/-- This property is a PCRE special --/\n\n/^\\p{Xuc}/8\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n    ** Failers\n    abc     \n\n/^\\p{Xuc}+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}+?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}+?\\*/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}++/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}{3,5}/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\p{Xuc}{3,5}?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^[\\p{Xuc}]/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^[\\p{Xuc}]+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n    ** Failers\n    \\x{9f}\n\n/^\\P{Xuc}/8\n    abc\n    ** Failers\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n\n/^[\\P{Xuc}]/8\n    abc\n    ** Failers\n    $abc\n    @abc\n    `abc\n    \\x{1234}abc\n    \n/-- Some auto-possessification tests --/\n\n/\\pN+\\z/BZ\n\n/\\PN+\\z/BZ\n\n/\\pN+/BZ\n\n/\\PN+/BZ\n\n/\\p{Any}+\\p{Any} \\p{Any}+\\P{Any} \\p{Any}+\\p{L&} \\p{Any}+\\p{L} \\p{Any}+\\p{Lu} \\p{Any}+\\p{Han} \\p{Any}+\\p{Xan} \\p{Any}+\\p{Xsp} \\p{Any}+\\p{Xps} \\p{Xwd}+\\p{Any} \\p{Any}+\\p{Xuc}/BWZx  \n\n/\\p{L&}+\\p{Any} \\p{L&}+\\p{L&} \\P{L&}+\\p{L&} \\p{L&}+\\p{L} \\p{L&}+\\p{Lu} \\p{L&}+\\p{Han} \\p{L&}+\\p{Xan} \\p{L&}+\\P{Xan} \\p{L&}+\\p{Xsp} \\p{L&}+\\p{Xps} \\p{Xwd}+\\p{L&} \\p{L&}+\\p{Xuc}/BWZx  \n\n/\\p{N}+\\p{Any} \\p{N}+\\p{L&} \\p{N}+\\p{L} \\p{N}+\\P{L} \\p{N}+\\P{N} \\p{N}+\\p{Lu} \\p{N}+\\p{Han} \\p{N}+\\p{Xan} \\p{N}+\\p{Xsp} \\p{N}+\\p{Xps} \\p{Xwd}+\\p{N} \\p{N}+\\p{Xuc}/BWZx  \n\n/\\p{Lu}+\\p{Any} \\p{Lu}+\\p{L&} \\p{Lu}+\\p{L} \\p{Lu}+\\p{Lu} \\P{Lu}+\\p{Lu} \\p{Lu}+\\p{Nd} \\p{Lu}+\\P{Nd} \\p{Lu}+\\p{Han} \\p{Lu}+\\p{Xan} \\p{Lu}+\\p{Xsp} \\p{Lu}+\\p{Xps} \\p{Xwd}+\\p{Lu} \\p{Lu}+\\p{Xuc}/BWZx  \n\n/\\p{Han}+\\p{Lu} \\p{Han}+\\p{L&} \\p{Han}+\\p{L} \\p{Han}+\\p{Lu} \\p{Han}+\\p{Arabic} \\p{Arabic}+\\p{Arabic} \\p{Han}+\\p{Xan} \\p{Han}+\\p{Xsp} \\p{Han}+\\p{Xps} \\p{Xwd}+\\p{Han} \\p{Han}+\\p{Xuc}/BWZx  \n\n/\\p{Xan}+\\p{Any} \\p{Xan}+\\p{L&} \\P{Xan}+\\p{L&} \\p{Xan}+\\p{L} \\p{Xan}+\\p{Lu} \\p{Xan}+\\p{Han} \\p{Xan}+\\p{Xan} \\p{Xan}+\\P{Xan} \\p{Xan}+\\p{Xsp} \\p{Xan}+\\p{Xps} \\p{Xwd}+\\p{Xan} \\p{Xan}+\\p{Xuc}/BWZx  \n\n/\\p{Xsp}+\\p{Any} \\p{Xsp}+\\p{L&} \\p{Xsp}+\\p{L} \\p{Xsp}+\\p{Lu} \\p{Xsp}+\\p{Han} \\p{Xsp}+\\p{Xan} \\p{Xsp}+\\p{Xsp} \\P{Xsp}+\\p{Xsp} \\p{Xsp}+\\p{Xps} \\p{Xwd}+\\p{Xsp} \\p{Xsp}+\\p{Xuc}/BWZx  \n\n/\\p{Xwd}+\\p{Any} \\p{Xwd}+\\p{L&} \\p{Xwd}+\\p{L} \\p{Xwd}+\\p{Lu} \\p{Xwd}+\\p{Han} \\p{Xwd}+\\p{Xan} \\p{Xwd}+\\p{Xsp} \\p{Xwd}+\\p{Xps} \\p{Xwd}+\\p{Xwd} \\p{Xwd}+\\P{Xwd} \\p{Xwd}+\\p{Xuc}/BWZx  \n\n/\\p{Xuc}+\\p{Any} \\p{Xuc}+\\p{L&} \\p{Xuc}+\\p{L} \\p{Xuc}+\\p{Lu} \\p{Xuc}+\\p{Han} \\p{Xuc}+\\p{Xan} \\p{Xuc}+\\p{Xsp} \\p{Xuc}+\\p{Xps} \\p{Xwd}+\\p{Xuc} \\p{Xuc}+\\p{Xuc} \\p{Xuc}+\\P{Xuc}/BWZx  \n\n/\\p{N}+\\p{Ll} \\p{N}+\\p{Nd} \\p{N}+\\P{Nd}/BWZx\n\n/\\p{Xan}+\\p{L} \\p{Xan}+\\p{N} \\p{Xan}+\\p{C} \\p{Xan}+\\P{L} \\P{Xan}+\\p{N} \\p{Xan}+\\P{C}/BWZx\n\n/\\p{L}+\\p{Xan} \\p{N}+\\p{Xan} \\p{C}+\\p{Xan} \\P{L}+\\p{Xan} \\p{N}+\\p{Xan} \\P{C}+\\p{Xan} \\p{L}+\\P{Xan}/BWZx\n\n/\\p{Xan}+\\p{Lu} \\p{Xan}+\\p{Nd} \\p{Xan}+\\p{Cc} \\p{Xan}+\\P{Ll} \\P{Xan}+\\p{No} \\p{Xan}+\\P{Cf}/BWZx\n\n/\\p{Lu}+\\p{Xan} \\p{Nd}+\\p{Xan} \\p{Cs}+\\p{Xan} \\P{Lt}+\\p{Xan} \\p{Nl}+\\p{Xan} \\P{Cc}+\\p{Xan} \\p{Lt}+\\P{Xan}/BWZx\n\n/\\w+\\p{P} \\w+\\p{Po} \\w+\\s \\p{Xan}+\\s \\s+\\p{Xan} \\s+\\w/BWZx\n\n/\\w+\\P{P} \\W+\\p{Po} \\w+\\S \\P{Xan}+\\s \\s+\\P{Xan} \\s+\\W/BWZx\n\n/\\w+\\p{Po} \\w+\\p{Pc} \\W+\\p{Po} \\W+\\p{Pc} \\w+\\P{Po} \\w+\\P{Pc}/BWZx\n\n/\\p{Nl}+\\p{Xan} \\P{Nl}+\\p{Xan} \\p{Nl}+\\P{Xan} \\P{Nl}+\\P{Xan}/BWZx\n\n/\\p{Xan}+\\p{Nl} \\P{Xan}+\\p{Nl} \\p{Xan}+\\P{Nl} \\P{Xan}+\\P{Nl}/BWZx\n\n/\\p{Xan}+\\p{Nd} \\P{Xan}+\\p{Nd} \\p{Xan}+\\P{Nd} \\P{Xan}+\\P{Nd}/BWZx\n\n/-- End auto-possessification tests --/ \n\n/\\w+/8CWBZ\n    abcd\n\n/[\\p{N}]?+/BZO\n\n/[\\p{L}ab]{2,3}+/BZO\n\n/\\D+\\X \\d+\\X \\S+\\X \\s+\\X \\W+\\X \\w+\\X \\C+\\X \\R+\\X \\H+\\X \\h+\\X \\V+\\X \\v+\\X a+\\X \\n+\\X .+\\X/BZx\n\n/.+\\X/BZxs\n\n/\\X+$/BZxm\n\n/\\X+\\D \\X+\\d \\X+\\S \\X+\\s \\X+\\W \\X+\\w \\X+. \\X+\\C \\X+\\R \\X+\\H \\X+\\h \\X+\\V \\X+\\v \\X+\\X \\X+\\Z \\X+\\z \\X+$/BZx\n\n/\\d+\\s{0,5}=\\s*\\S?=\\w{0,4}\\W*/8WBZ\n\n/[RST]+/8iWBZ\n    \n/[R-T]+/8iWBZ \n\n/[Q-U]+/8iWBZ \n\n/^s?c/mi8I\n    scat\n\n/a[[:punct:]b]/WBZ\n\n/a[[:punct:]b]/8WBZ\n\n/a[b[:punct:]]/8WBZ\n\n/L(?#(|++<!(2)?/B8COZ\n\n/L(?#(|++<!(2)?/B8WCZ\n\n/-- End of testinput7 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput8",
    "content": "/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(),\n    excluding UTF and Unicode property support. The -dfa flag must be used with\n    pcretest when running it. --/\n    \n< forbid 8W \n     \n/abc/\n    abc\n    \n/ab*c/\n    abc\n    abbbbc\n    ac\n    \n/ab+c/\n    abc\n    abbbbbbc\n    *** Failers \n    ac\n    ab\n    \n/a*/O\n    a\n    aaaaaaaaaaaaaaaaa\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\F \n    \n/(a|abcd|african)/\n    a\n    abcd\n    african\n    \n/^abc/\n    abcdef\n    *** Failers\n    xyzabc\n    xyz\\nabc    \n    \n/^abc/m\n    abcdef\n    xyz\\nabc    \n    *** Failers\n    xyzabc\n    \n/\\Aabc/\n    abcdef\n    *** Failers\n    xyzabc\n    xyz\\nabc    \n    \n/\\Aabc/m\n    abcdef\n    *** Failers\n    xyzabc\n    xyz\\nabc    \n    \n/\\Gabc/\n    abcdef\n    xyzabc\\>3\n    *** Failers\n    xyzabc    \n    xyzabc\\>2 \n    \n/x\\dy\\Dz/\n    x9yzz\n    x0y+z\n    *** Failers\n    xyz\n    xxy0z     \n    \n/x\\sy\\Sz/\n    x yzz\n    x y+z\n    *** Failers\n    xyz\n    xxyyz\n    \n/x\\wy\\Wz/\n    xxy+z\n    *** Failers\n    xxy0z\n    x+y+z         \n    \n/x.y/\n    x+y\n    x-y\n    *** Failers\n    x\\ny\n    \n/x.y/s\n    x+y\n    x-y\n    x\\ny\n\n/(a.b(?s)c.d|x.y)p.q/\n    a+bc+dp+q\n    a+bc\\ndp+q\n    x\\nyp+q \n    *** Failers \n    a\\nbc\\ndp+q\n    a+bc\\ndp\\nq\n    x\\nyp\\nq \n\n/a\\d\\z/\n    ba0\n    *** Failers\n    ba0\\n\n    ba0\\ncd   \n\n/a\\d\\z/m\n    ba0\n    *** Failers\n    ba0\\n\n    ba0\\ncd   \n\n/a\\d\\Z/\n    ba0\n    ba0\\n\n    *** Failers\n    ba0\\ncd   \n\n/a\\d\\Z/m\n    ba0\n    ba0\\n\n    *** Failers\n    ba0\\ncd   \n\n/a\\d$/\n    ba0\n    ba0\\n\n    *** Failers\n    ba0\\ncd   \n\n/a\\d$/m\n    ba0\n    ba0\\n\n    ba0\\ncd   \n    *** Failers\n\n/abc/i\n    abc\n    aBc\n    ABC\n    \n/[^a]/\n    abcd\n    \n/ab?\\w/\n    abz\n    abbz\n    azz  \n\n/x{0,3}yz/\n    ayzq\n    axyzq\n    axxyz\n    axxxyzq\n    axxxxyzq\n    *** Failers\n    ax\n    axx     \n      \n/x{3}yz/\n    axxxyzq\n    axxxxyzq\n    *** Failers\n    ax\n    axx     \n    ayzq\n    axyzq\n    axxyz\n      \n/x{2,3}yz/\n    axxyz\n    axxxyzq\n    axxxxyzq\n    *** Failers\n    ax\n    axx     \n    ayzq\n    axyzq\n      \n/[^a]+/O\n    bac\n    bcdefax\n    *** Failers\n    aaaaa   \n\n/[^a]*/O\n    bac\n    bcdefax\n    *** Failers\n    aaaaa   \n    \n/[^a]{3,5}/O\n    xyz\n    awxyza\n    abcdefa\n    abcdefghijk\n    *** Failers\n    axya\n    axa\n    aaaaa         \n\n/\\d*/\n    1234b567\n    xyz\n    \n/\\D*/\n    a1234b567\n    xyz\n     \n/\\d+/\n    ab1234c56\n    *** Failers\n    xyz\n    \n/\\D+/\n    ab123c56\n    *** Failers\n    789\n    \n/\\d?A/\n    045ABC\n    ABC\n    *** Failers\n    XYZ\n    \n/\\D?A/\n    ABC\n    BAC\n    9ABC             \n    *** Failers\n\n/a+/\n    aaaa\n\n/^.*xyz/\n    xyz\n    ggggggggxyz\n    \n/^.+xyz/\n    abcdxyz\n    axyz\n    *** Failers\n    xyz\n    \n/^.?xyz/\n    xyz\n    cxyz       \n\n/^\\d{2,3}X/\n    12X\n    123X\n    *** Failers\n    X\n    1X\n    1234X     \n\n/^[abcd]\\d/\n    a45\n    b93\n    c99z\n    d04\n    *** Failers\n    e45\n    abcd      \n    abcd1234\n    1234  \n\n/^[abcd]*\\d/\n    a45\n    b93\n    c99z\n    d04\n    abcd1234\n    1234  \n    *** Failers\n    e45\n    abcd      \n\n/^[abcd]+\\d/\n    a45\n    b93\n    c99z\n    d04\n    abcd1234\n    *** Failers\n    1234  \n    e45\n    abcd      \n\n/^a+X/\n    aX\n    aaX \n\n/^[abcd]?\\d/\n    a45\n    b93\n    c99z\n    d04\n    1234  \n    *** Failers\n    abcd1234\n    e45\n\n/^[abcd]{2,3}\\d/\n    ab45\n    bcd93\n    *** Failers\n    1234 \n    a36 \n    abcd1234\n    ee45\n\n/^(abc)*\\d/\n    abc45\n    abcabcabc45\n    42xyz \n    *** Failers\n\n/^(abc)+\\d/\n    abc45\n    abcabcabc45\n    *** Failers\n    42xyz \n\n/^(abc)?\\d/\n    abc45\n    42xyz \n    *** Failers\n    abcabcabc45\n\n/^(abc){2,3}\\d/\n    abcabc45\n    abcabcabc45\n    *** Failers\n    abcabcabcabc45\n    abc45\n    42xyz \n\n/1(abc|xyz)2(?1)3/\n    1abc2abc3456\n    1abc2xyz3456 \n\n/^(a*\\w|ab)=(a*\\w|ab)/\n    ab=ab\n\n/^(a*\\w|ab)=(?1)/\n    ab=ab\n\n/^([^()]|\\((?1)*\\))*$/\n    abc\n    a(b)c\n    a(b(c))d  \n    *** Failers)\n    a(b(c)d  \n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/\n    >abc>123<xyz<\n    >abc>1(2)3<xyz<\n    >abc>(1(2)3)<xyz<\n\n/^(?>a*)\\d/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876\n    *** Failers \n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/< (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >/x\n    <>\n    <abcd>\n    <abc <123> hij>\n    <abc <def> hij>\n    <abc<>def> \n    <abc<>      \n    *** Failers\n    <abc\n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/        \n    abc:                          \n    12                             \n    *** Failers                     \n    123                       \n    xyz                        \n                                \n/^(?(?!abc)\\d\\d|\\w{3}:)$/      \n    abc:                        \n    12         \n    *** Failers\n    123\n    xyz    \n\n/^(?=abc)\\w{5}:$/        \n    abcde:                          \n    *** Failers                     \n    abc.. \n    123                       \n    vwxyz                        \n                                \n/^(?!abc)\\d\\d$/      \n    12         \n    *** Failers\n    abcde:\n    abc..  \n    123\n    vwxyz    \n\n/(?<=abc|xy)123/\n    abc12345\n    wxy123z\n    *** Failers\n    123abc\n\n/(?<!abc|xy)123/\n    123abc\n    mno123456 \n    *** Failers\n    abc12345\n    wxy123z\n\n/abc(?C1)xyz/\n    abcxyz\n    123abcxyz999 \n\n/(ab|cd){3,4}/C\n  ababab\n  abcdabcd\n  abcdcdcdcdcd  \n\n/^abc/\n    abcdef\n    *** Failers\n    abcdef\\B  \n\n/^(a*|xyz)/\n    bcd\n    aaabcd\n    xyz\n    xyz\\N  \n    *** Failers\n    bcd\\N   \n    \n/xyz$/\n    xyz\n    xyz\\n\n    *** Failers\n    xyz\\Z\n    xyz\\n\\Z    \n    \n/xyz$/m\n    xyz\n    xyz\\n \n    abcxyz\\npqr \n    abcxyz\\npqr\\Z \n    xyz\\n\\Z    \n    *** Failers\n    xyz\\Z\n\n/\\Gabc/\n    abcdef\n    defabcxyz\\>3 \n    *** Failers \n    defabcxyz\n\n/^abcdef/\n    ab\\P\n    abcde\\P\n    abcdef\\P\n    *** Failers\n    abx\\P    \n\n/^a{2,4}\\d+z/\n    a\\P\n    aa\\P\n    aa2\\P \n    aaa\\P\n    aaa23\\P \n    aaaa12345\\P\n    aa0z\\P\n    aaaa4444444444444z\\P \n    *** Failers\n    az\\P \n    aaaaa\\P \n    a56\\P \n\n/^abcdef/\n   abc\\P\n   def\\R \n   \n/(?<=foo)bar/\n   xyzfo\\P \n   foob\\P\\>2 \n   foobar...\\R\\P\\>4 \n   xyzfo\\P\n   foobar\\>2  \n   *** Failers\n   xyzfo\\P\n   obar\\R   \n\n/(ab*(cd|ef))+X/\n    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\\P\\Z\n    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\\P\\B\\Z\n    cdabbbbbbbb\\P\\R\\B\\Z\n    efabbbbbbbbbbbbbbbb\\P\\R\\B\\Z\n    bbbbbbbbbbbbcdXyasdfadf\\P\\R\\B\\Z    \n\n/(a|b)/SF>testsavedregex\n<testsavedregex\n    abc\n    ** Failers\n    def  \n    \n/the quick brown fox/\n    the quick brown fox\n    The quick brown FOX\n    What do you know about the quick brown fox?\n    What do you know about THE QUICK BROWN FOX?\n\n/The quick brown fox/i\n    the quick brown fox\n    The quick brown FOX\n    What do you know about the quick brown fox?\n    What do you know about THE QUICK BROWN FOX?\n\n/abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/\n    abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\n\n/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/\n    abxyzpqrrrabbxyyyypqAzz\n    abxyzpqrrrabbxyyyypqAzz\n    aabxyzpqrrrabbxyyyypqAzz\n    aaabxyzpqrrrabbxyyyypqAzz\n    aaaabxyzpqrrrabbxyyyypqAzz\n    abcxyzpqrrrabbxyyyypqAzz\n    aabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypAzz\n    aaabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n    aaaabcxyzpqrrrabbxyyyypqAzz\n    abxyzzpqrrrabbxyyyypqAzz\n    aabxyzzzpqrrrabbxyyyypqAzz\n    aaabxyzzzzpqrrrabbxyyyypqAzz\n    aaaabxyzzzzpqrrrabbxyyyypqAzz\n    abcxyzzpqrrrabbxyyyypqAzz\n    aabcxyzzzpqrrrabbxyyyypqAzz\n    aaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypABzz\n    aaabcxyzpqrrrabbxyyyypABBzz\n    >>>aaabxyzpqrrrabbxyyyypqAzz\n    >aaaabxyzpqrrrabbxyyyypqAzz\n    >>>>abcxyzpqrrrabbxyyyypqAzz\n    *** Failers\n    abxyzpqrrabbxyyyypqAzz\n    abxyzpqrrrrabbxyyyypqAzz\n    abxyzpqrrrabxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\n\n/^(abc){1,2}zz/\n    abczz\n    abcabczz\n    *** Failers\n    zz\n    abcabcabczz\n    >>abczz\n\n/^(b+?|a){1,2}?c/\n    bc\n    bbc\n    bbbc\n    bac\n    bbac\n    aac\n    abbbbbbbbbbbc\n    bbbbbbbbbbbac\n    *** Failers\n    aaac\n    abbbbbbbbbbbac\n\n/^(b+|a){1,2}c/\n    bc\n    bbc\n    bbbc\n    bac\n    bbac\n    aac\n    abbbbbbbbbbbc\n    bbbbbbbbbbbac\n    *** Failers\n    aaac\n    abbbbbbbbbbbac\n\n/^(b+|a){1,2}?bc/\n    bbc\n\n/^(b*|ba){1,2}?bc/\n    babc\n    bbabc\n    bababc\n    *** Failers\n    bababbc\n    babababc\n\n/^(ba|b*){1,2}?bc/\n    babc\n    bbabc\n    bababc\n    *** Failers\n    bababbc\n    babababc\n\n/^\\ca\\cA\\c[\\c{\\c:/\n    \\x01\\x01\\e;z\n\n/^[ab\\]cde]/\n    athing\n    bthing\n    ]thing\n    cthing\n    dthing\n    ething\n    *** Failers\n    fthing\n    [thing\n    \\\\thing\n\n/^[]cde]/\n    ]thing\n    cthing\n    dthing\n    ething\n    *** Failers\n    athing\n    fthing\n\n/^[^ab\\]cde]/\n    fthing\n    [thing\n    \\\\thing\n    *** Failers\n    athing\n    bthing\n    ]thing\n    cthing\n    dthing\n    ething\n\n/^[^]cde]/\n    athing\n    fthing\n    *** Failers\n    ]thing\n    cthing\n    dthing\n    ething\n\n/^\\/\n    \n\n/^/\n    \n\n/^[0-9]+$/\n    0\n    1\n    2\n    3\n    4\n    5\n    6\n    7\n    8\n    9\n    10\n    100\n    *** Failers\n    abc\n\n/^.*nter/\n    enter\n    inter\n    uponter\n\n/^xxx[0-9]+$/\n    xxx0\n    xxx1234\n    *** Failers\n    xxx\n\n/^.+[0-9][0-9][0-9]$/\n    x123\n    xx123\n    123456\n    *** Failers\n    123\n    x1234\n\n/^.+?[0-9][0-9][0-9]$/\n    x123\n    xx123\n    123456\n    *** Failers\n    123\n    x1234\n\n/^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/\n    abc!pqr=apquxz.ixr.zzz.ac.uk\n    *** Failers\n    !pqr=apquxz.ixr.zzz.ac.uk\n    abc!=apquxz.ixr.zzz.ac.uk\n    abc!pqr=apquxz:ixr.zzz.ac.uk\n    abc!pqr=apquxz.ixr.zzz.ac.ukk\n\n/:/\n    Well, we need a colon: somewhere\n    *** Fail if we don't\n\n/([\\da-f:]+)$/i\n    0abc\n    abc\n    fed\n    E\n    ::\n    5f03:12C0::932e\n    fed def\n    Any old stuff\n    *** Failers\n    0zzz\n    gzzz\n    fed\\x20\n    Any old rubbish\n\n/^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/\n    .1.2.3\n    A.12.123.0\n    *** Failers\n    .1.2.3333\n    1.2.3\n    1234.2.3\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n    1    IN    SOA    non-sp1    non-sp2   (\n    *** Failers\n    1IN SOA non-sp1 non-sp2(\n\n/^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/\n    a.\n    Z.\n    2.\n    ab-c.pq-r.\n    sxk.zzz.ac.uk.\n    x-.y-.\n    *** Failers\n    -abc.peq.\n\n/^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/\n    *.a\n    *.b0-a\n    *.c3-b.c\n    *.c-a.b-c\n    *** Failers\n    *.0\n    *.a-\n    *.a-b.c-\n    *.c-a.0-c\n\n/^(?=ab(de))(abd)(e)/\n    abde\n\n/^(?!(ab)de|x)(abd)(f)/\n    abdf\n\n/^(?=(ab(cd)))(ab)/\n    abcd\n\n/^[\\da-f](\\.[\\da-f])*$/i\n    a.b.c.d\n    A.B.C.D\n    a.b.c.1.2.3.C\n\n/^\\\".*\\\"\\s*(;.*)?$/\n    \\\"1234\\\"\n    \\\"abcd\\\" ;\n    \\\"\\\" ; rhubarb\n    *** Failers\n    \\\"1234\\\" : things\n\n/^$/\n    \\\n    *** Failers\n\n/   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/x\n    ab c\n    *** Failers\n    abc\n    ab cde\n\n/(?x)   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/\n    ab c\n    *** Failers\n    abc\n    ab cde\n\n/^   a\\ b[c ]d       $/x\n    a bcd\n    a b d\n    *** Failers\n    abcd\n    ab d\n\n/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/\n    abcdefhijklm\n\n/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/\n    abcdefhijklm\n\n/^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/\n    a+ Z0+\\x08\\n\\x1d\\x12\n\n/^[.^$|()*+?{,}]+/\n    .^\\$(*+)|{?,?}\n\n/^a*\\w/\n    z\n    az\n    aaaz\n    a\n    aa\n    aaaa\n    a+\n    aa+\n\n/^a*?\\w/\n    z\n    az\n    aaaz\n    a\n    aa\n    aaaa\n    a+\n    aa+\n\n/^a+\\w/\n    az\n    aaaz\n    aa\n    aaaa\n    aa+\n\n/^a+?\\w/\n    az\n    aaaz\n    aa\n    aaaa\n    aa+\n\n/^\\d{8}\\w{2,}/\n    1234567890\n    12345678ab\n    12345678__\n    *** Failers\n    1234567\n\n/^[aeiou\\d]{4,5}$/\n    uoie\n    1234\n    12345\n    aaaaa\n    *** Failers\n    123456\n\n/^[aeiou\\d]{4,5}?/\n    uoie\n    1234\n    12345\n    aaaaa\n    123456\n\n/^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]/\n    From abcd  Mon Sep 01 12:33:02 1997\n\n/^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/\n    From abcd  Mon Sep 01 12:33:02 1997\n    From abcd  Mon Sep  1 12:33:02 1997\n    *** Failers\n    From abcd  Sep 01 12:33:02 1997\n\n/^12.34/s\n    12\\n34\n    12\\r34\n\n/\\w+(?=\\t)/\n    the quick brown\\t fox\n\n/foo(?!bar)(.*)/\n    foobar is foolish see?\n\n/(?:(?!foo)...|^.{0,2})bar(.*)/\n    foobar crowbar etc\n    barrel\n    2barrel\n    A barrel\n\n/^(\\D*)(?=\\d)(?!123)/\n    abc456\n    *** Failers\n    abc123\n\n/^1234(?# test newlines\n  inside)/\n    1234\n\n/^1234 #comment in extended re\n  /x\n    1234\n\n/#rhubarb\n  abcd/x\n    abcd\n\n/^abcd#rhubarb/x\n    abcd\n\n/(?!^)abc/\n    the abc\n    *** Failers\n    abc\n\n/(?=^)abc/\n    abc\n    *** Failers\n    the abc\n\n/^[ab]{1,3}(ab*|b)/O\n    aabbbbb\n\n/^[ab]{1,3}?(ab*|b)/O\n    aabbbbb\n\n/^[ab]{1,3}?(ab*?|b)/O\n    aabbbbb\n\n/^[ab]{1,3}(ab*?|b)/O\n    aabbbbb\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/x\n    Alan Other <user\\@dom.ain>\n    <user\\@dom.ain>\n    user\\@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n    A. Other <user.1234\\@dom.ain> (a comment)\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n    A missing angle <user\\@some.where\n    *** Failers\n    The quick brown fox\n\n/[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional leading comment\n(?:\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n# address\n|                             #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n# leading word\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *               # \"normal\" atoms and or spaces\n(?:\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n|\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n) # \"special\" comment or quoted string\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *            #  more \"normal\"\n)*\n<\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# <\n(?:\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n(?: ,\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n)*  # additional domains\n:\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)?     #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n#       address spec\n>                    #                 >\n# name and address\n)\n/x\n    Alan Other <user\\@dom.ain>\n    <user\\@dom.ain>\n    user\\@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n    A. Other <user.1234\\@dom.ain> (a comment)\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n    A missing angle <user\\@some.where\n    *** Failers\n    The quick brown fox\n\n/abc\\0def\\00pqr\\000xyz\\0000AB/\n    abc\\0def\\00pqr\\000xyz\\0000AB\n    abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\n\n/abc\\x0def\\x00pqr\\x000xyz\\x0000AB/\n    abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n    abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\n\n/^[\\000-\\037]/\n    \\0A\n    \\01B\n    \\037C\n\n/\\0*/\n    \\0\\0\\0\\0\n\n/A\\x0{2,3}Z/\n    The A\\x0\\x0Z\n    An A\\0\\x0\\0Z\n    *** Failers\n    A\\0Z\n    A\\0\\x0\\0\\x0Z\n\n/^\\s/\n    \\040abc\n    \\x0cabc\n    \\nabc\n    \\rabc\n    \\tabc\n    *** Failers\n    abc\n\n/^a\tb\n    \f  c/x\n    abc\n\n/ab{1,3}bc/\n    abbbbc\n    abbbc\n    abbc\n    *** Failers\n    abc\n    abbbbbc\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/\n    track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/i\n    track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[t ]+(.*)/i\n    track1.title:TBlah blah blah\n\n/^[W-c]+$/\n    WXY_^abc\n    *** Failers\n    wxy\n\n/^[W-c]+$/i\n    WXY_^abc\n    wxy_^ABC\n\n/^[\\x3f-\\x5F]+$/i\n    WXY_^abc\n    wxy_^ABC\n\n/^abc$/m\n    abc\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n/^abc$/\n    abc\n    *** Failers\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n/\\Aabc\\Z/m\n    abc\n    abc\\n \n    *** Failers\n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n    \n/\\A(.)*\\Z/s\n    abc\\ndef\n\n/\\A(.)*\\Z/m\n    *** Failers\n    abc\\ndef\n\n/(?:b)|(?::+)/\n    b::c\n    c::b\n\n/[-az]+/\n    az-\n    *** Failers\n    b\n\n/[az-]+/\n    za-\n    *** Failers\n    b\n\n/[a\\-z]+/\n    a-z\n    *** Failers\n    b\n\n/[a-z]+/\n    abcdxyz\n\n/[\\d-]+/\n    12-34\n    *** Failers\n    aaa\n\n/[\\d-z]+/\n    12-34z\n    *** Failers\n    aaa\n\n/\\x5c/\n    \\\\\n\n/\\x20Z/\n    the Zoo\n    *** Failers\n    Zulu\n\n/ab{3cd/\n    ab{3cd\n\n/ab{3,cd/\n    ab{3,cd\n\n/ab{3,4a}cd/\n    ab{3,4a}cd\n\n/{4,5a}bc/\n    {4,5a}bc\n\n/^a.b/<lf>\n    a\\rb\n    *** Failers\n    a\\nb\n\n/abc$/\n    abc\n    abc\\n\n    *** Failers\n    abc\\ndef\n\n/(abc)\\123/\n    abc\\x53\n\n/(abc)\\223/\n    abc\\x93\n\n/(abc)\\323/\n    abc\\xd3\n\n/(abc)\\100/\n    abc\\x40\n    abc\\100\n\n/(abc)\\1000/\n    abc\\x400\n    abc\\x40\\x30\n    abc\\1000\n    abc\\100\\x30\n    abc\\100\\060\n    abc\\100\\60\n\n/^A\\8B\\9C$/\n    A8B9C\n    *** Failers\n    A\\08B\\09C  \n    \n/^[A\\8B\\9C]+$/\n    A8B9C\n    *** Failers \n    A8B9C\\x00\n    \n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/\n    abcdefghijk\\12S\n\n/ab\\idef/\n    abidef\n\n/a{0}bc/\n    bc\n\n/(a|(bc)){0,0}?xyz/\n    xyz\n\n/abc[\\10]de/\n    abc\\010de\n\n/abc[\\1]de/\n    abc\\1de\n\n/(abc)[\\1]de/\n    abc\\1de\n\n/(?s)a.b/\n    a\\nb\n\n/^([^a])([^\\b])([^c]*)([^d]{3,4})/\n    baNOTccccd\n    baNOTcccd\n    baNOTccd\n    bacccd\n    *** Failers\n    anything\n    b\\bc   \n    baccd\n\n/[^a]/\n    Abc\n  \n/[^a]/i\n    Abc \n\n/[^a]+/\n    AAAaAbc\n  \n/[^a]+/i\n    AAAaAbc \n\n/[^a]+/\n    bbb\\nccc\n   \n/[^k]$/\n    abc\n    *** Failers\n    abk   \n   \n/[^k]{2,3}$/\n    abc\n    kbc\n    kabc \n    *** Failers\n    abk\n    akb\n    akk \n\n/^\\d{8,}\\@.+[^k]$/\n    12345678\\@a.b.c.d\n    123456789\\@x.y.z\n    *** Failers\n    12345678\\@x.y.uk\n    1234567\\@a.b.c.d       \n\n/[^a]/\n    aaaabcd\n    aaAabcd \n\n/[^a]/i\n    aaaabcd\n    aaAabcd \n\n/[^az]/\n    aaaabcd\n    aaAabcd \n\n/[^az]/i\n    aaaabcd\n    aaAabcd \n\n/\\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/\n \\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\n\n/P[^*]TAIRE[^*]{1,6}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n\n/P[^*]TAIRE[^*]{1,}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n\n/(\\.\\d\\d[1-9]?)\\d+/\n    1.230003938\n    1.875000282   \n    1.235  \n                  \n/(\\.\\d\\d((?=0)|\\d(?=\\d)))/\n    1.230003938      \n    1.875000282\n    *** Failers \n    1.235 \n    \n/a(?)b/\n    ab \n \n/\\b(foo)\\s+(\\w+)/i\n    Food is on the foo table\n    \n/foo(.*)bar/\n    The food is under the bar in the barn.\n    \n/foo(.*?)bar/  \n    The food is under the bar in the barn.\n\n/(.*)(\\d*)/O\n    I have 2 numbers: 53147\n    \n/(.*)(\\d+)/\n    I have 2 numbers: 53147\n \n/(.*?)(\\d*)/O\n    I have 2 numbers: 53147\n\n/(.*?)(\\d+)/\n    I have 2 numbers: 53147\n\n/(.*)(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*?)(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*)\\b(\\d+)$/\n    I have 2 numbers: 53147\n\n/(.*\\D)(\\d+)$/\n    I have 2 numbers: 53147\n\n/^\\D*(?!123)/\n    ABC123\n     \n/^(\\D*)(?=\\d)(?!123)/\n    ABC445\n    *** Failers\n    ABC123\n    \n/^[W-]46]/\n    W46]789 \n    -46]789\n    *** Failers\n    Wall\n    Zebra\n    42\n    [abcd] \n    ]abcd[\n       \n/^[W-\\]46]/\n    W46]789 \n    Wall\n    Zebra\n    Xylophone  \n    42\n    [abcd] \n    ]abcd[\n    \\\\backslash \n    *** Failers\n    -46]789\n    well\n    \n/\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/\n    01/01/2000\n\n/word (?:[a-zA-Z0-9]+ ){0,10}otherword/\n  word cat dog elephant mussel cow horse canary baboon snake shark otherword\n  word cat dog elephant mussel cow horse canary baboon snake shark\n\n/word (?:[a-zA-Z0-9]+ ){0,300}otherword/\n  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\n\n/^(a){0,0}/\n    bcd\n    abc\n    aab     \n\n/^(a){0,1}/\n    bcd\n    abc\n    aab  \n\n/^(a){0,2}/\n    bcd\n    abc\n    aab  \n\n/^(a){0,3}/\n    bcd\n    abc\n    aab\n    aaa   \n\n/^(a){0,}/\n    bcd\n    abc\n    aab\n    aaa\n    aaaaaaaa    \n\n/^(a){1,1}/\n    bcd\n    abc\n    aab  \n\n/^(a){1,2}/\n    bcd\n    abc\n    aab  \n\n/^(a){1,3}/\n    bcd\n    abc\n    aab\n    aaa   \n\n/^(a){1,}/\n    bcd\n    abc\n    aab\n    aaa\n    aaaaaaaa    \n\n/.*\\.gif/\n    borfle\\nbib.gif\\nno\n\n/.{0,}\\.gif/\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/m\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/s\n    borfle\\nbib.gif\\nno\n\n/.*\\.gif/ms\n    borfle\\nbib.gif\\nno\n    \n/.*$/\n    borfle\\nbib.gif\\nno\n\n/.*$/m\n    borfle\\nbib.gif\\nno\n\n/.*$/s\n    borfle\\nbib.gif\\nno\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\n    \n/.*$/\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/m\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/s\n    borfle\\nbib.gif\\nno\\n\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\\n\n    \n/(.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers\n    abcde\\nBar  \n\n/(.*X|^B)/m\n    abcde\\n1234Xyz\n    BarFoo \n    abcde\\nBar  \n\n/(.*X|^B)/s\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers\n    abcde\\nBar  \n\n/(.*X|^B)/ms\n    abcde\\n1234Xyz\n    BarFoo \n    abcde\\nBar  \n\n/(?s)(.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers \n    abcde\\nBar  \n\n/(?s:.*X|^B)/\n    abcde\\n1234Xyz\n    BarFoo \n    *** Failers \n    abcde\\nBar  \n\n/^.*B/\n    **** Failers\n    abc\\nB\n     \n/(?s)^.*B/\n    abc\\nB\n\n/(?m)^.*B/\n    abc\\nB\n     \n/(?ms)^.*B/\n    abc\\nB\n\n/(?ms)^B/\n    abc\\nB\n\n/(?s)B$/\n    B\\n\n\n/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n    123456654321\n  \n/^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/\n    123456654321 \n\n/^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/\n    123456654321\n  \n/^[abc]{12}/\n    abcabcabcabc\n    \n/^[a-c]{12}/\n    abcabcabcabc\n    \n/^(a|b|c){12}/\n    abcabcabcabc \n\n/^[abcdefghijklmnopqrstuvwxy0123456789]/\n    n\n    *** Failers \n    z \n\n/abcde{0,0}/\n    abcd\n    *** Failers\n    abce  \n\n/ab[cd]{0,0}e/\n    abe\n    *** Failers\n    abcde \n    \n/ab(c){0,0}d/\n    abd\n    *** Failers\n    abcd   \n\n/a(b*)/\n    a\n    ab\n    abbbb\n    *** Failers\n    bbbbb    \n    \n/ab\\d{0}e/\n    abe\n    *** Failers\n    ab1e   \n    \n/\"([^\\\\\"]+|\\\\.)*\"/\n    the \\\"quick\\\" brown fox\n    \\\"the \\\\\\\"quick\\\\\\\" brown fox\\\" \n\n/.*?/g+\n    abc\n  \n/\\b/g+\n    abc \n\n/\\b/+g\n    abc \n\n//g\n    abc\n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is\n  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n\n/a[^a]b/\n    acb\n    a\\nb\n    \n/a.b/\n    acb\n    *** Failers \n    a\\nb   \n    \n/a[^a]b/s\n    acb\n    a\\nb  \n    \n/a.b/s\n    acb\n    a\\nb  \n\n/^(b+?|a){1,2}?c/\n    bac\n    bbac\n    bbbac\n    bbbbac\n    bbbbbac \n\n/^(b+|a){1,2}?c/\n    bac\n    bbac\n    bbbac\n    bbbbac\n    bbbbbac \n    \n/(?!\\A)x/m\n    x\\nb\\n\n    a\\bx\\n  \n    \n/\\x0{ab}/\n    \\0{ab} \n\n/(A|B)*?CD/\n    CD \n    \n/(A|B)*CD/\n    CD \n\n/(?<!bar)foo/\n    foo\n    catfood\n    arfootle\n    rfoosh\n    *** Failers\n    barfoo\n    towbarfoo\n\n/\\w{3}(?<!bar)foo/\n    catfood\n    *** Failers\n    foo\n    barfoo\n    towbarfoo\n\n/(?<=(foo)a)bar/\n    fooabar\n    *** Failers\n    bar\n    foobbar\n      \n/\\Aabc\\z/m\n    abc\n    *** Failers\n    abc\\n   \n    qqq\\nabc\n    abc\\nzzz\n    qqq\\nabc\\nzzz\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n\n/(?>(\\.\\d\\d[1-9]?))\\d+/\n    1.230003938\n    1.875000282\n    *** Failers \n    1.235 \n\n/^((?>\\w+)|(?>\\s+))*$/\n    now is the time for all good men to come to the aid of the party\n    *** Failers\n    this is not a line with only words and spaces!\n    \n/(\\d+)(\\w)/\n    12345a\n    12345+ \n\n/((?>\\d+))(\\w)/\n    12345a\n    *** Failers\n    12345+ \n\n/(?>a+)b/\n    aaab\n\n/((?>a+)b)/\n    aaab\n\n/(?>(a+))b/\n    aaab\n\n/(?>b)+/\n    aaabbbccc\n\n/(?>a+|b+|c+)*c/\n    aaabbbbccccd\n    \n/(a+|b+|c+)*c/\n    aaabbbbccccd\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n    \n/\\(((?>[^()]+)|\\([^()]+\\))+\\)/ \n    (abc)\n    (abc(def)xyz)\n    *** Failers\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   \n\n/a(?-i)b/i\n    ab\n    Ab\n    *** Failers \n    aB\n    AB\n        \n/(a (?x)b c)d e/\n    a bcd e\n    *** Failers\n    a b cd e\n    abcd e   \n    a bcde \n \n/(a b(?x)c d (?-x)e f)/\n    a bcde f\n    *** Failers\n    abcdef  \n\n/(a(?i)b)c/\n    abc\n    aBc\n    *** Failers\n    abC\n    aBC  \n    Abc\n    ABc\n    ABC\n    AbC\n    \n/a(?i:b)c/\n    abc\n    aBc\n    *** Failers \n    ABC\n    abC\n    aBC\n    \n/a(?i:b)*c/\n    aBc\n    aBBc\n    *** Failers \n    aBC\n    aBBC\n    \n/a(?=b(?i)c)\\w\\wd/\n    abcd\n    abCd\n    *** Failers\n    aBCd\n    abcD     \n    \n/(?s-i:more.*than).*million/i\n    more than million\n    more than MILLION\n    more \\n than Million \n    *** Failers\n    MORE THAN MILLION    \n    more \\n than \\n million \n\n/(?:(?s-i)more.*than).*million/i\n    more than million\n    more than MILLION\n    more \\n than Million \n    *** Failers\n    MORE THAN MILLION    \n    more \\n than \\n million \n    \n/(?>a(?i)b+)+c/ \n    abc\n    aBbc\n    aBBc \n    *** Failers\n    Abc\n    abAb    \n    abbC \n    \n/(?=a(?i)b)\\w\\wc/\n    abc\n    aBc\n    *** Failers\n    Ab \n    abC\n    aBC     \n    \n/(?<=a(?i)b)(\\w\\w)c/\n    abxxc\n    aBxxc\n    *** Failers\n    Abxxc\n    ABxxc\n    abxxC      \n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/\n    abc:\n    12\n    *** Failers\n    123\n    xyz    \n\n/^(?(?!abc)\\d\\d|\\w{3}:)$/\n    abc:\n    12\n    *** Failers\n    123\n    xyz    \n    \n/(?(?<=foo)bar|cat)/\n    foobar\n    cat\n    fcat\n    focat   \n    *** Failers\n    foocat  \n\n/(?(?<!foo)cat|bar)/\n    foobar\n    cat\n    fcat\n    focat   \n    *** Failers\n    foocat  \n\n/(?>a*)*/\n    a\n    aa\n    aaaa\n    \n/(abc|)+/\n    abc\n    abcabc\n    abcabcabc\n    xyz      \n\n/([a]*)*/\n    a\n    aaaaa \n \n/([ab]*)*/\n    a\n    b\n    ababab\n    aaaabcde\n    bbbb    \n \n/([^a]*)*/\n    b\n    bbbb\n    aaa   \n \n/([^ab]*)*/\n    cccc\n    abab  \n \n/([a]*?)*/\n    a\n    aaaa \n \n/([ab]*?)*/\n    a\n    b\n    abab\n    baba   \n \n/([^a]*?)*/\n    b\n    bbbb\n    aaa   \n \n/([^ab]*?)*/\n    c\n    cccc\n    baba   \n \n/(?>a*)*/\n    a\n    aaabcde \n \n/((?>a*))*/\n    aaaaa\n    aabbaa \n \n/((?>a*?))*/\n    aaaaa\n    aabbaa \n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /x\n    12-sep-98\n    12-09-98\n    *** Failers\n    sep-12-98\n        \n/(?i:saturday|sunday)/\n    saturday\n    sunday\n    Saturday\n    Sunday\n    SATURDAY\n    SUNDAY\n    SunDay\n    \n/(a(?i)bc|BB)x/\n    abcx\n    aBCx\n    bbx\n    BBx\n    *** Failers\n    abcX\n    aBCX\n    bbX\n    BBX               \n\n/^([ab](?i)[cd]|[ef])/\n    ac\n    aC\n    bD\n    elephant\n    Europe \n    frog\n    France\n    *** Failers\n    Africa     \n\n/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/\n    ab\n    aBd\n    xy\n    xY\n    zebra\n    Zambesi\n    *** Failers\n    aCD  \n    XY  \n\n/(?<=foo\\n)^bar/m\n    foo\\nbar\n    *** Failers\n    bar\n    baz\\nbar   \n\n/(?<=(?<!foo)bar)baz/\n    barbaz\n    barbarbaz \n    koobarbaz \n    *** Failers\n    baz\n    foobarbaz \n\n/The following tests are taken from the Perl 5.005 test suite; some of them/\n/are compatible with 5.004, but I'd rather not have to sort them out./\n\n/abc/\n    abc\n    xabcy\n    ababc\n    *** Failers\n    xbc\n    axc\n    abx\n\n/ab*c/\n    abc\n\n/ab*bc/\n    abc\n    abbc\n    abbbbc\n\n/.{1}/\n    abbbbc\n\n/.{3,4}/\n    abbbbc\n\n/ab{0,}bc/\n    abbbbc\n\n/ab+bc/\n    abbc\n    *** Failers\n    abc\n    abq\n\n/ab+bc/\n    abbbbc\n\n/ab{1,}bc/\n    abbbbc\n\n/ab{1,3}bc/\n    abbbbc\n\n/ab{3,4}bc/\n    abbbbc\n\n/ab{4,5}bc/\n    *** Failers\n    abq\n    abbbbc\n\n/ab?bc/\n    abbc\n    abc\n\n/ab{0,1}bc/\n    abc\n\n/ab?bc/\n\n/ab?c/\n    abc\n\n/ab{0,1}c/\n    abc\n\n/^abc$/\n    abc\n    *** Failers\n    abbbbc\n    abcc\n\n/^abc/\n    abcc\n\n/^abc$/\n\n/abc$/\n    aabc\n    *** Failers\n    aabc\n    aabcd\n\n/^/\n    abc\n\n/$/\n    abc\n\n/a.c/\n    abc\n    axc\n\n/a.*c/\n    axyzc\n\n/a[bc]d/\n    abd\n    *** Failers\n    axyzd\n    abc\n\n/a[b-d]e/\n    ace\n\n/a[b-d]/\n    aac\n\n/a[-b]/\n    a-\n\n/a[b-]/\n    a-\n\n/a]/\n    a]\n\n/a[]]b/\n    a]b\n\n/a[^bc]d/\n    aed\n    *** Failers\n    abd\n    abd\n\n/a[^-b]c/\n    adc\n\n/a[^]b]c/\n    adc\n    *** Failers\n    a-c\n    a]c\n\n/\\ba\\b/\n    a-\n    -a\n    -a-\n\n/\\by\\b/\n    *** Failers\n    xy\n    yz\n    xyz\n\n/\\Ba\\B/\n    *** Failers\n    a-\n    -a\n    -a-\n\n/\\By\\b/\n    xy\n\n/\\by\\B/\n    yz\n\n/\\By\\B/\n    xyz\n\n/\\w/\n    a\n\n/\\W/\n    -\n    *** Failers\n    -\n    a\n\n/a\\sb/\n    a b\n\n/a\\Sb/\n    a-b\n    *** Failers\n    a-b\n    a b\n\n/\\d/\n    1\n\n/\\D/\n    -\n    *** Failers\n    -\n    1\n\n/[\\w]/\n    a\n\n/[\\W]/\n    -\n    *** Failers\n    -\n    a\n\n/a[\\s]b/\n    a b\n\n/a[\\S]b/\n    a-b\n    *** Failers\n    a-b\n    a b\n\n/[\\d]/\n    1\n\n/[\\D]/\n    -\n    *** Failers\n    -\n    1\n\n/ab|cd/\n    abc\n    abcd\n\n/()ef/\n    def\n\n/$b/\n\n/a\\(b/\n    a(b\n\n/a\\(*b/\n    ab\n    a((b\n\n/a\\\\b/\n    a\\b\n\n/((a))/\n    abc\n\n/(a)b(c)/\n    abc\n\n/a+b+c/\n    aabbabc\n\n/a{1,}b{1,}c/\n    aabbabc\n\n/a.+?c/\n    abcabc\n\n/(a+|b)*/\n    ab\n\n/(a+|b){0,}/\n    ab\n\n/(a+|b)+/\n    ab\n\n/(a+|b){1,}/\n    ab\n\n/(a+|b)?/\n    ab\n\n/(a+|b){0,1}/\n    ab\n\n/[^ab]*/\n    cde\n\n/abc/\n    *** Failers\n    b\n    \n\n/a*/\n    \n\n/([abc])*d/\n    abbbcd\n\n/([abc])*bcd/\n    abcd\n\n/a|b|c|d|e/\n    e\n\n/(a|b|c|d|e)f/\n    ef\n\n/abcd*efg/\n    abcdefg\n\n/ab*/\n    xabyabbbz\n    xayabbbz\n\n/(ab|cd)e/\n    abcde\n\n/[abhgefdc]ij/\n    hij\n\n/^(ab|cd)e/\n\n/(abc|)ef/\n    abcdef\n\n/(a|b)c*d/\n    abcd\n\n/(ab|ab*)bc/\n    abc\n\n/a([bc]*)c*/\n    abc\n\n/a([bc]*)(c*d)/\n    abcd\n\n/a([bc]+)(c*d)/\n    abcd\n\n/a([bc]*)(c+d)/\n    abcd\n\n/a[bcd]*dcdcde/\n    adcdcde\n\n/a[bcd]+dcdcde/\n    *** Failers\n    abcde\n    adcdcde\n\n/(ab|a)b*c/\n    abc\n\n/((a)(b)c)(d)/\n    abcd\n\n/[a-zA-Z_][a-zA-Z0-9_]*/\n    alpha\n\n/^a(bc+|b[eh])g|.h$/\n    abh\n\n/(bc+d$|ef*g.|h?i(j|k))/\n    effgz\n    ij\n    reffgz\n    *** Failers\n    effg\n    bcdd\n\n/((((((((((a))))))))))/\n    a\n\n/(((((((((a)))))))))/\n    a\n\n/multiple words of text/\n    *** Failers\n    aa\n    uh-uh\n\n/multiple words/\n    multiple words, yeah\n\n/(.*)c(.*)/\n    abcde\n\n/\\((.*), (.*)\\)/\n    (a, b)\n\n/[k]/\n\n/abcd/\n    abcd\n\n/a(bc)d/\n    abcd\n\n/a[-]?c/\n    ac\n\n/abc/i\n    ABC\n    XABCY\n    ABABC\n    *** Failers\n    aaxabxbaxbbx\n    XBC\n    AXC\n    ABX\n\n/ab*c/i\n    ABC\n\n/ab*bc/i\n    ABC\n    ABBC\n\n/ab*?bc/i\n    ABBBBC\n\n/ab{0,}?bc/i\n    ABBBBC\n\n/ab+?bc/i\n    ABBC\n\n/ab+bc/i\n    *** Failers\n    ABC\n    ABQ\n\n/ab{1,}bc/i\n\n/ab+bc/i\n    ABBBBC\n\n/ab{1,}?bc/i\n    ABBBBC\n\n/ab{1,3}?bc/i\n    ABBBBC\n\n/ab{3,4}?bc/i\n    ABBBBC\n\n/ab{4,5}?bc/i\n    *** Failers\n    ABQ\n    ABBBBC\n\n/ab??bc/i\n    ABBC\n    ABC\n\n/ab{0,1}?bc/i\n    ABC\n\n/ab??bc/i\n\n/ab??c/i\n    ABC\n\n/ab{0,1}?c/i\n    ABC\n\n/^abc$/i\n    ABC\n    *** Failers\n    ABBBBC\n    ABCC\n\n/^abc/i\n    ABCC\n\n/^abc$/i\n\n/abc$/i\n    AABC\n\n/^/i\n    ABC\n\n/$/i\n    ABC\n\n/a.c/i\n    ABC\n    AXC\n\n/a.*?c/i\n    AXYZC\n\n/a.*c/i\n    *** Failers\n    AABC\n    AXYZD\n\n/a[bc]d/i\n    ABD\n\n/a[b-d]e/i\n    ACE\n    *** Failers\n    ABC\n    ABD\n\n/a[b-d]/i\n    AAC\n\n/a[-b]/i\n    A-\n\n/a[b-]/i\n    A-\n\n/a]/i\n    A]\n\n/a[]]b/i\n    A]B\n\n/a[^bc]d/i\n    AED\n\n/a[^-b]c/i\n    ADC\n    *** Failers\n    ABD\n    A-C\n\n/a[^]b]c/i\n    ADC\n\n/ab|cd/i\n    ABC\n    ABCD\n\n/()ef/i\n    DEF\n\n/$b/i\n    *** Failers\n    A]C\n    B\n\n/a\\(b/i\n    A(B\n\n/a\\(*b/i\n    AB\n    A((B\n\n/a\\\\b/i\n    A\\B\n\n/((a))/i\n    ABC\n\n/(a)b(c)/i\n    ABC\n\n/a+b+c/i\n    AABBABC\n\n/a{1,}b{1,}c/i\n    AABBABC\n\n/a.+?c/i\n    ABCABC\n\n/a.*?c/i\n    ABCABC\n\n/a.{0,5}?c/i\n    ABCABC\n\n/(a+|b)*/i\n    AB\n\n/(a+|b){0,}/i\n    AB\n\n/(a+|b)+/i\n    AB\n\n/(a+|b){1,}/i\n    AB\n\n/(a+|b)?/i\n    AB\n\n/(a+|b){0,1}/i\n    AB\n\n/(a+|b){0,1}?/i\n    AB\n\n/[^ab]*/i\n    CDE\n\n/abc/i\n\n/a*/i\n    \n\n/([abc])*d/i\n    ABBBCD\n\n/([abc])*bcd/i\n    ABCD\n\n/a|b|c|d|e/i\n    E\n\n/(a|b|c|d|e)f/i\n    EF\n\n/abcd*efg/i\n    ABCDEFG\n\n/ab*/i\n    XABYABBBZ\n    XAYABBBZ\n\n/(ab|cd)e/i\n    ABCDE\n\n/[abhgefdc]ij/i\n    HIJ\n\n/^(ab|cd)e/i\n    ABCDE\n\n/(abc|)ef/i\n    ABCDEF\n\n/(a|b)c*d/i\n    ABCD\n\n/(ab|ab*)bc/i\n    ABC\n\n/a([bc]*)c*/i\n    ABC\n\n/a([bc]*)(c*d)/i\n    ABCD\n\n/a([bc]+)(c*d)/i\n    ABCD\n\n/a([bc]*)(c+d)/i\n    ABCD\n\n/a[bcd]*dcdcde/i\n    ADCDCDE\n\n/a[bcd]+dcdcde/i\n\n/(ab|a)b*c/i\n    ABC\n\n/((a)(b)c)(d)/i\n    ABCD\n\n/[a-zA-Z_][a-zA-Z0-9_]*/i\n    ALPHA\n\n/^a(bc+|b[eh])g|.h$/i\n    ABH\n\n/(bc+d$|ef*g.|h?i(j|k))/i\n    EFFGZ\n    IJ\n    REFFGZ\n    *** Failers\n    ADCDCDE\n    EFFG\n    BCDD\n\n/((((((((((a))))))))))/i\n    A\n\n/(((((((((a)))))))))/i\n    A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i\n    A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i\n    C\n\n/multiple words of text/i\n    *** Failers\n    AA\n    UH-UH\n\n/multiple words/i\n    MULTIPLE WORDS, YEAH\n\n/(.*)c(.*)/i\n    ABCDE\n\n/\\((.*), (.*)\\)/i\n    (A, B)\n\n/[k]/i\n\n/abcd/i\n    ABCD\n\n/a(bc)d/i\n    ABCD\n\n/a[-]?c/i\n    AC\n\n/a(?!b)./\n    abad\n\n/a(?=d)./\n    abad\n\n/a(?=c|d)./\n    abad\n\n/a(?:b|c|d)(.)/\n    ace\n\n/a(?:b|c|d)*(.)/\n    ace\n\n/a(?:b|c|d)+?(.)/\n    ace\n    acdbcdbe\n\n/a(?:b|c|d)+(.)/\n    acdbcdbe\n\n/a(?:b|c|d){2}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){4,5}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){4,5}?(.)/\n    acdbcdbe\n\n/((foo)|(bar))*/\n    foobar\n\n/a(?:b|c|d){6,7}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){6,7}?(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,6}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,6}?(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,7}(.)/\n    acdbcdbe\n\n/a(?:b|c|d){5,7}?(.)/\n    acdbcdbe\n\n/a(?:b|(c|e){1,2}?|d)+?(.)/\n    ace\n\n/^(.+)?B/\n    AB\n\n/^([^a-z])|(\\^)$/\n    .\n\n/^[<>]&/\n    <&OUT\n\n/(?:(f)(o)(o)|(b)(a)(r))*/\n    foobar\n\n/(?<=a)b/\n    ab\n    *** Failers\n    cb\n    b\n\n/(?<!c)b/\n    ab\n    b\n    b\n\n/(?:..)*a/\n    aba\n\n/(?:..)*?a/\n    aba\n\n/^(){3,5}/\n    abc\n\n/^(a+)*ax/\n    aax\n\n/^((a|b)+)*ax/\n    aax\n\n/^((a|bc)+)*ax/\n    aax\n\n/(a|x)*ab/\n    cab\n\n/(a)*ab/\n    cab\n\n/(?:(?i)a)b/\n    ab\n\n/((?i)a)b/\n    ab\n\n/(?:(?i)a)b/\n    Ab\n\n/((?i)a)b/\n    Ab\n\n/(?:(?i)a)b/\n    *** Failers\n    cb\n    aB\n\n/((?i)a)b/\n\n/(?i:a)b/\n    ab\n\n/((?i:a))b/\n    ab\n\n/(?i:a)b/\n    Ab\n\n/((?i:a))b/\n    Ab\n\n/(?i:a)b/\n    *** Failers\n    aB\n    aB\n\n/((?i:a))b/\n\n/(?:(?-i)a)b/i\n    ab\n\n/((?-i)a)b/i\n    ab\n\n/(?:(?-i)a)b/i\n    aB\n\n/((?-i)a)b/i\n    aB\n\n/(?:(?-i)a)b/i\n    *** Failers\n    aB\n    Ab\n\n/((?-i)a)b/i\n\n/(?:(?-i)a)b/i\n    aB\n\n/((?-i)a)b/i\n    aB\n\n/(?:(?-i)a)b/i\n    *** Failers\n    Ab\n    AB\n\n/((?-i)a)b/i\n\n/(?-i:a)b/i\n    ab\n\n/((?-i:a))b/i\n    ab\n\n/(?-i:a)b/i\n    aB\n\n/((?-i:a))b/i\n    aB\n\n/(?-i:a)b/i\n    *** Failers\n    AB\n    Ab\n\n/((?-i:a))b/i\n\n/(?-i:a)b/i\n    aB\n\n/((?-i:a))b/i\n    aB\n\n/(?-i:a)b/i\n    *** Failers\n    Ab\n    AB\n\n/((?-i:a))b/i\n\n/((?-i:a.))b/i\n    *** Failers\n    AB\n    a\\nB\n\n/((?s-i:a.))b/i\n    a\\nB\n\n/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/\n    cabbbb\n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/\n    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n\n/foo\\w*\\d{4}baz/\n    foobar1234baz\n\n/x(~~)*(?:(?:F)?)?/\n    x~~\n\n/^a(?#xxx){3}c/\n    aaac\n\n/^a (?#xxx) (?#yyy) {3}c/x\n    aaac\n\n/(?<![cd])b/\n    *** Failers\n    B\\nB\n    dbcb\n\n/(?<![cd])[ab]/\n    dbaacb\n\n/(?<!(c|d))b/\n\n/(?<!(c|d))[ab]/\n    dbaacb\n\n/(?<!cd)[ab]/\n    cdaccb\n\n/^(?:a?b?)*$/\n    *** Failers\n    dbcb\n    a--\n\n/((?s)^a(.))((?m)^b$)/\n    a\\nb\\nc\\n\n\n/((?m)^b$)/\n    a\\nb\\nc\\n\n\n/(?m)^b/\n    a\\nb\\n\n\n/(?m)^(b)/\n    a\\nb\\n\n\n/((?m)^b)/\n    a\\nb\\n\n\n/\\n((?m)^b)/\n    a\\nb\\n\n\n/((?s).)c(?!.)/\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/((?s)b.)c(?!.)/\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/^b/\n\n/()^b/\n    *** Failers\n    a\\nb\\nc\\n\n    a\\nb\\nc\\n\n\n/((?m)^b)/\n    a\\nb\\nc\\n\n\n/(?(?!a)a|b)/\n\n/(?(?!a)b|a)/\n    a\n\n/(?(?=a)b|a)/\n    *** Failers\n    a\n    a\n\n/(?(?=a)a|b)/\n    a\n\n/(\\w+:)+/\n    one:\n\n/$(?<=^(a))/\n    a\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n    xy:z:::abcd\n\n/^[^bcd]*(c+)/\n    aexycd\n\n/(a*)b+/\n    caab\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n    xy:z:::abcd\n    *** Failers\n    abcd:\n    abcd:\n\n/^[^bcd]*(c+)/\n    aexycd\n\n/(>a+)ab/\n\n/(?>a+)b/\n    aaab\n\n/([[:]+)/\n    a:[b]:\n\n/([[=]+)/\n    a=[b]=\n\n/([[.]+)/\n    a.[b].\n\n/((?>a+)b)/\n    aaab\n\n/(?>(a+))b/\n    aaab\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n\n/a\\Z/\n    *** Failers\n    aaab\n    a\\nb\\n\n\n/b\\Z/\n    a\\nb\\n\n\n/b\\z/\n\n/b\\Z/\n    a\\nb\n\n/b\\z/\n    a\\nb\n    *** Failers\n    \n/(?>.*)(?<=(abcd|wxyz))/\n    alphabetabcd\n    endingwxyz\n    *** Failers\n    a rather long string that doesn't end with one of them\n\n/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/\n    word cat dog elephant mussel cow horse canary baboon snake shark otherword\n    word cat dog elephant mussel cow horse canary baboon snake shark\n  \n/word (?>[a-zA-Z0-9]+ ){0,30}otherword/\n    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\n\n/(?<=\\d{3}(?!999))foo/\n    999foo\n    123999foo \n    *** Failers\n    123abcfoo\n    \n/(?<=(?!...999)\\d{3})foo/\n    999foo\n    123999foo \n    *** Failers\n    123abcfoo\n\n/(?<=\\d{3}(?!999)...)foo/\n    123abcfoo\n    123456foo \n    *** Failers\n    123999foo  \n    \n/(?<=\\d{3}...)(?<!999)foo/\n    123abcfoo   \n    123456foo \n    *** Failers\n    123999foo  \n\n/((Z)+|A)*/\n    ZABCDEFG\n\n/(Z()|A)*/\n    ZABCDEFG\n\n/(Z(())|A)*/\n    ZABCDEFG\n\n/((?>Z)+|A)*/\n    ZABCDEFG\n\n/((?>)+|A)*/\n    ZABCDEFG\n\n/a*/g\n    abbab\n\n/^[\\d-a]/\n    abcde\n    -things\n    0digit\n    *** Failers\n    bcdef    \n    \n/[[:space:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/[[:blank:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/[\\s]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/\\s+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n     \n/a\u000bb/x\n    ab\n\n/(?!\\A)x/m\n  a\\nxb\\n\n\n/(?!^)x/m\n  a\\nxb\\n\n\n/abc\\Qabc\\Eabc/\n    abcabcabc\n    \n/abc\\Q(*+|\\Eabc/\n    abc(*+|abc \n\n/   abc\\Q abc\\Eabc/x\n    abc abcabc\n    *** Failers\n    abcabcabc  \n    \n/abc#comment\n    \\Q#not comment\n    literal\\E/x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal/x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment\n    /x\n    abc#not comment\\n    literal     \n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment/x\n    abc#not comment\\n    literal     \n\n/\\Qabc\\$xyz\\E/\n    abc\\\\\\$xyz\n\n/\\Qabc\\E\\$\\Qxyz\\E/\n    abc\\$xyz\n\n/\\Gabc/\n    abc\n    *** Failers\n    xyzabc  \n\n/\\Gabc./g\n    abc1abc2xyzabc3\n\n/abc./g\n    abc1abc2xyzabc3 \n\n/a(?x: b c )d/\n    XabcdY\n    *** Failers \n    Xa b c d Y \n\n/((?x)x y z | a b c)/\n    XabcY\n    AxyzB \n\n/(?i)AB(?-i)C/\n    XabCY\n    *** Failers\n    XabcY  \n\n/((?i)AB(?-i)C|D)E/\n    abCE\n    DE\n    *** Failers\n    abcE\n    abCe  \n    dE\n    De    \n\n/[z\\Qa-d]\\E]/\n    z\n    a\n    -\n    d\n    ] \n    *** Failers\n    b     \n\n/[\\z\\C]/\n    z\n    C \n    \n/\\M/\n    M \n    \n/(a+)*b/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \n    \n/(?i)reg(?:ul(?:[a]|ae)r|ex)/\n    REGular\n    regulaer\n    Regex  \n    regulr \n\n/[--]+/\n    \n    \n    \n    \n\n/(?<=Z)X./\n    \\x84XAZXB\n\n/^(?(2)a|(1)(2))+$/\n    123a\n\n/(?<=a|bbbb)c/\n    ac\n    bbbbc\n\n/abc/SS>testsavedregex\n<testsavedregex\n    abc\n    *** Failers\n    bca\n    \n/abc/FSS>testsavedregex\n<testsavedregex\n    abc\n    *** Failers\n    bca\n\n/(a|b)/S>testsavedregex\n<testsavedregex\n    abc\n    *** Failers\n    def  \n    \n/(a|b)/SF>testsavedregex\n<testsavedregex\n    abc\n    *** Failers\n    def  \n    \n/line\\nbreak/\n    this is a line\\nbreak\n    line one\\nthis is a line\\nbreak in the second line \n\n/line\\nbreak/f\n    this is a line\\nbreak\n    ** Failers \n    line one\\nthis is a line\\nbreak in the second line \n\n/line\\nbreak/mf\n    this is a line\\nbreak\n    ** Failers \n    line one\\nthis is a line\\nbreak in the second line \n\n/1234/\n    123\\P\n    a4\\P\\R\n\n/1234/\n    123\\P\n    4\\P\\R\n\n/^/mg\n    a\\nb\\nc\\n\n    \\ \n    \n/(?<=C\\n)^/mg\n    A\\nC\\nC\\n \n\n/(?s)A?B/\n    AB\n    aB  \n\n/(?s)A*B/\n    AB\n    aB  \n\n/(?m)A?B/\n    AB\n    aB  \n\n/(?m)A*B/\n    AB\n    aB  \n\n/Content-Type\\x3A[^\\r\\n]{6,}/\n    Content-Type:xxxxxyyy \n\n/Content-Type\\x3A[^\\r\\n]{6,}z/\n    Content-Type:xxxxxyyyz\n\n/Content-Type\\x3A[^a]{6,}/\n    Content-Type:xxxyyy \n\n/Content-Type\\x3A[^a]{6,}z/\n    Content-Type:xxxyyyz\n\n/^abc/m\n    xyz\\nabc\n    xyz\\nabc\\<lf>\n    xyz\\r\\nabc\\<lf>\n    xyz\\rabc\\<cr>\n    xyz\\r\\nabc\\<crlf>\n    ** Failers \n    xyz\\nabc\\<cr>\n    xyz\\r\\nabc\\<cr>\n    xyz\\nabc\\<crlf>\n    xyz\\rabc\\<crlf>\n    xyz\\rabc\\<lf>\n    \n/abc$/m<lf>\n    xyzabc\n    xyzabc\\n \n    xyzabc\\npqr \n    xyzabc\\r\\<cr> \n    xyzabc\\rpqr\\<cr> \n    xyzabc\\r\\n\\<crlf> \n    xyzabc\\r\\npqr\\<crlf> \n    ** Failers\n    xyzabc\\r \n    xyzabc\\rpqr \n    xyzabc\\r\\n \n    xyzabc\\r\\npqr \n    \n/^abc/m<cr>\n    xyz\\rabcdef\n    xyz\\nabcdef\\<lf>\n    ** Failers  \n    xyz\\nabcdef\n       \n/^abc/m<lf>\n    xyz\\nabcdef\n    xyz\\rabcdef\\<cr>\n    ** Failers  \n    xyz\\rabcdef\n       \n/^abc/m<crlf>\n    xyz\\r\\nabcdef\n    xyz\\rabcdef\\<cr>\n    ** Failers  \n    xyz\\rabcdef\n    \n/.*/<lf>\n    abc\\ndef\n    abc\\rdef\n    abc\\r\\ndef\n    \\<cr>abc\\ndef\n    \\<cr>abc\\rdef\n    \\<cr>abc\\r\\ndef\n    \\<crlf>abc\\ndef\n    \\<crlf>abc\\rdef\n    \\<crlf>abc\\r\\ndef\n\n/\\w+(.)(.)?def/s\n    abc\\ndef\n    abc\\rdef\n    abc\\r\\ndef\n\n/^\\w+=.*(\\\\\\n.*)*/\n    abc=xyz\\\\\\npqr\n\n/^(a()*)*/\n    aaaa\n\n/^(?:a(?:(?:))*)*/\n    aaaa\n\n/^(a()+)+/\n    aaaa\n\n/^(?:a(?:(?:))+)+/\n    aaaa\n\n/(a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?>a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?:a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/^a.b/<lf>\n    a\\rb\n    a\\nb\\<cr> \n    ** Failers\n    a\\nb\n    a\\nb\\<any>\n    a\\rb\\<cr>   \n    a\\rb\\<any>   \n\n/^abc./mgx<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x85abc7 JUNK\n\n/abc.$/mgx<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc9\n\n/^a\\Rb/<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b   \n    ** Failers\n    a\\n\\rb    \n\n/^a\\R*b/<bsr_unicode>\n    ab\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b   \n    a\\n\\rb    \n    a\\n\\r\\x85\\x0cb \n\n/^a\\R+b/<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x85b   \n    a\\n\\rb    \n    a\\n\\r\\x85\\x0cb \n    ** Failers\n    ab  \n    \n/^a\\R{1,3}b/<bsr_unicode>\n    a\\nb\n    a\\n\\rb\n    a\\n\\r\\x85b\n    a\\r\\n\\r\\nb \n    a\\r\\n\\r\\n\\r\\nb \n    a\\n\\r\\n\\rb\n    a\\n\\n\\r\\nb \n    ** Failers\n    a\\n\\n\\n\\rb\n    a\\r\n\n/^a[\\R]b/<bsr_unicode>\n    aRb\n    ** Failers\n    a\\nb  \n\n/.+foo/\n    afoo\n    ** Failers \n    \\r\\nfoo \n    \\nfoo \n\n/.+foo/<crlf>\n    afoo\n    \\nfoo \n    ** Failers \n    \\r\\nfoo \n\n/.+foo/<any>\n    afoo\n    ** Failers \n    \\nfoo \n    \\r\\nfoo \n\n/.+foo/s\n    afoo\n    \\r\\nfoo \n    \\nfoo \n\n/^$/mg<any>\n    abc\\r\\rxyz\n    abc\\n\\rxyz  \n    ** Failers \n    abc\\r\\nxyz\n\n/^X/m\n    XABC\n    ** Failers \n    XABC\\B\n\n/(?m)^$/<any>g+\n    abc\\r\\n\\r\\n\n\n/(?m)^$|^\\r\\n/<any>g+ \n    abc\\r\\n\\r\\n\n    \n/(?m)$/<any>g+ \n    abc\\r\\n\\r\\n\n\n/(?|(abc)|(xyz))/\n   >abc<\n   >xyz< \n\n/(x)(?|(abc)|(xyz))(x)/\n    xabcx\n    xxyzx \n\n/(x)(?|(abc)(pqr)|(xyz))(x)/\n    xabcpqrx\n    xxyzx \n\n/(?|(abc)|(xyz))(?1)/\n    abcabc\n    xyzabc \n    ** Failers \n    xyzxyz \n \n/\\H\\h\\V\\v/\n    X X\\x0a\n    X\\x09X\\x0b\n    ** Failers\n    \\xa0 X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/ \n    \\x09\\x20\\xa0X\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x20\\xa0\\x0a\\x0b\n     \n/\\H{3,4}/\n    XY  ABCDE\n    XY  PQR ST \n    \n/.\\h{3,4}./\n    XY  AB    PQRS\n\n/\\h*X\\h?\\H+Y\\H?Z/\n    >XNNNYZ\n    >  X NYQZ\n    ** Failers\n    >XYZ   \n    >  X NY Z\n\n/\\v*X\\v?Y\\v+Z\\V*\\x0a\\V+\\x0b\\V{2,3}\\x0c/\n    >XY\\x0aZ\\x0aA\\x0bNN\\x0c\n    >\\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n\n/.+A/<crlf>\n    \\r\\nA\n    \n/\\nA/<crlf>\n    \\r\\nA \n\n/[\\r\\n]A/<crlf>\n    \\r\\nA \n\n/(\\r|\\n)A/<crlf>\n    \\r\\nA \n\n/a\\Rb/I<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x85b\n    a\\x0bb     \n\n/a\\Rb/I<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x85b\n    a\\x0bb     \n    ** Failers \n    a\\x85b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R?b/I<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x85b\n    a\\x0bb     \n\n/a\\R?b/I<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x85b\n    a\\x0bb     \n    ** Failers \n    a\\x85b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R{2,4}b/I<bsr_anycrlf>\n    a\\r\\n\\nb\n    a\\n\\r\\rb\n    a\\r\\n\\r\\n\\r\\n\\r\\nb\n    ** Failers\n    a\\x85\\85b\n    a\\x0b\\0bb     \n\n/a\\R{2,4}b/I<bsr_unicode>\n    a\\r\\rb\n    a\\n\\n\\nb\n    a\\r\\n\\n\\r\\rb\n    a\\x85\\85b\n    a\\x0b\\0bb     \n    ** Failers \n    a\\r\\r\\r\\r\\rb \n    a\\x85\\85b\\<bsr_anycrlf>\n    a\\x0b\\0bb\\<bsr_anycrlf>\n    \n/a(?!)|\\wbc/\n    abc \n\n/a[]b/<JS>\n    ** Failers\n    ab\n\n/a[]+b/<JS>\n    ** Failers\n    ab \n\n/a[]*+b/<JS>\n    ** Failers\n    ab \n\n/a[^]b/<JS>\n    aXb\n    a\\nb \n    ** Failers\n    ab  \n    \n/a[^]+b/<JS> \n    aXb\n    a\\nX\\nXb \n    ** Failers\n    ab  \n\n/X$/E\n    X\n    ** Failers \n    X\\n \n\n/X$/\n    X\n    X\\n \n\n/xyz/C\n  xyz \n  abcxyz \n  abcxyz\\Y\n  ** Failers \n  abc\n  abc\\Y\n  abcxypqr  \n  abcxypqr\\Y  \n\n/(*NO_START_OPT)xyz/C\n  abcxyz \n  \n/(?C)ab/\n  ab\n  \\C-ab\n  \n/ab/C\n  ab\n  \\C-ab    \n\n/^\"((?(?=[a])[^\"])|b)*\"$/C\n    \"ab\"\n    \\C-\"ab\"\n\n/\\d+X|9+Y/\n    ++++123999\\P\n    ++++123999Y\\P\n\n/Z(*F)/\n    Z\\P\n    ZA\\P \n    \n/Z(?!)/\n    Z\\P \n    ZA\\P \n\n/dog(sbody)?/\n    dogs\\P\n    dogs\\P\\P \n    \n/dog(sbody)??/\n    dogs\\P\n    dogs\\P\\P \n\n/dog|dogsbody/\n    dogs\\P\n    dogs\\P\\P \n \n/dogsbody|dog/\n    dogs\\P\n    dogs\\P\\P \n\n/Z(*F)Q|ZXY/\n    Z\\P\n    ZA\\P \n    X\\P \n\n/\\bthe cat\\b/\n    the cat\\P\n    the cat\\P\\P\n\n/dog(sbody)?/\n    dogs\\D\\P\n    body\\D\\R\n\n/dog(sbody)?/\n    dogs\\D\\P\\P\n    body\\D\\R\n\n/abc/\n   abc\\P\n   abc\\P\\P\n\n/abc\\K123/\n    xyzabc123pqr\n    \n/(?<=abc)123/\n    xyzabc123pqr \n    xyzabc12\\P\n    xyzabc12\\P\\P\n\n/\\babc\\b/\n    +++abc+++\n    +++ab\\P\n    +++ab\\P\\P  \n\n/(?=C)/g+\n    ABCDECBA\n\n/(abc|def|xyz)/I\n    terhjk;abcdaadsfe\n    the quick xyz brown fox \n    \\Yterhjk;abcdaadsfe\n    \\Ythe quick xyz brown fox \n    ** Failers\n    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\n    \\Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\n\n/(abc|def|xyz)/SI\n    terhjk;abcdaadsfe\n    the quick xyz brown fox \n    \\Yterhjk;abcdaadsfe\n    \\Ythe quick xyz brown fox \n    ** Failers\n    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\n    \\Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\n\n/abcd*/+\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n    dddxxx\\R \n    xxxxabcd\\P\\P\n    xxx\\R \n\n/abcd*/i\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n    XXXXABCD\\P\n    XXXXABCD\\P\\P\n\n/abc\\d*/\n    xxxxabc1\\P\n    xxxxabc1\\P\\P\n\n/abc[de]*/\n    xxxxabcde\\P\n    xxxxabcde\\P\\P\n\n/(?:(?1)|B)(A(*F)|C)/\n    ABCD\n    CCD\n    ** Failers\n    CAD   \n\n/^(?:(?1)|B)(A(*F)|C)/\n    CCD\n    BCD \n    ** Failers\n    ABCD\n    CAD\n    BAD    \n\n/^(?!a(*SKIP)b)/\n    ac\n    \n/^(?=a(*SKIP)b|ac)/\n    ** Failers\n    ac\n    \n/^(?=a(*THEN)b|ac)/\n    ac\n    \n/^(?=a(*PRUNE)b)/\n    ab  \n    ** Failers \n    ac\n\n/^(?(?!a(*SKIP)b))/\n    ac\n\n/(?<=abc)def/\n    abc\\P\\P\n\n/abc$/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc$/m\n    abc\n    abc\\n\n    abc\\P\\P\n    abc\\n\\P\\P \n    abc\\P\n    abc\\n\\P\n\n/abc\\z/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\Z/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\b/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/abc\\B/\n    abc\n    abc\\P\n    abc\\P\\P\n\n/.+/\n    abc\\>0\n    abc\\>1\n    abc\\>2\n    abc\\>3\n    abc\\>4\n    abc\\>-4 \n\n/^(?:a)++\\w/\n     aaaab\n     ** Failers \n     aaaa \n     bbb \n\n/^(?:aa|(?:a)++\\w)/\n     aaaab\n     aaaa \n     ** Failers \n     bbb \n\n/^(?:a)*+\\w/\n     aaaab\n     bbb \n     ** Failers \n     aaaa \n\n/^(a)++\\w/\n     aaaab\n     ** Failers \n     aaaa \n     bbb \n\n/^(a|)++\\w/\n     aaaab\n     ** Failers \n     aaaa \n     bbb \n\n/(?=abc){3}abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc)+abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc)++abc/+\n    abcabcabc\n    ** Failers\n    xyz  \n    \n/(?=abc){0}xyz/\n    xyz \n\n/(?=abc){1}xyz/\n    ** Failers\n    xyz \n    \n/(?=(a))?./\n    ab\n    bc\n      \n/(?=(a))??./\n    ab\n    bc\n\n/^(?=(a)){0}b(?1)/\n    backgammon\n\n/^(?=(?1))?[az]([abc])d/\n    abd \n    zcdxx \n\n/^(?!a){0}\\w+/\n    aaaaa\n\n/(?<=(abc))?xyz/\n    abcxyz\n    pqrxyz \n\n/((?2))((?1))/\n    abc\n\n/(?(R)a+|(?R)b)/\n    aaaabcde\n\n/(?(R)a+|((?R))b)/\n    aaaabcde\n\n/((?(R)a+|(?1)b))/\n    aaaabcde\n\n/((?(R2)a+|(?1)b))/\n    aaaabcde\n\n/(?(R)a*(?1)|((?R))b)/\n    aaaabcde\n\n/(a+)/O\n    \\O6aaaa\n    \\O8aaaa\n\n/ab\\Cde/\n    abXde\n    \n/(?<=ab\\Cde)X/\n    abZdeX\n\n/^\\R/\n    \\r\\P\n    \\r\\P\\P\n    \n/^\\R{2,3}x/\n    \\r\\P\n    \\r\\P\\P\n    \\r\\r\\P \n    \\r\\r\\P\\P\n    \\r\\r\\r\\P  \n    \\r\\r\\r\\P\\P\n    \\r\\rx\n    \\r\\r\\rx    \n\n/^\\R{2,3}?x/\n    \\r\\P\n    \\r\\P\\P\n    \\r\\r\\P \n    \\r\\r\\P\\P\n    \\r\\r\\r\\P  \n    \\r\\r\\r\\P\\P\n    \\r\\rx\n    \\r\\r\\rx    \n    \n/^\\R?x/\n    \\r\\P\n    \\r\\P\\P \n    x\n    \\rx  \n\n/^\\R+x/\n    \\r\\P\n    \\r\\P\\P \n    \\r\\n\\P\n    \\r\\n\\P\\P  \n    \\rx  \n\n/^a$/<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^a$/m<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^(a$|a\\r)/<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/^(a$|a\\r)/m<CRLF>\n    a\\r\\P\n    a\\r\\P\\P \n\n/./<CRLF>\n    \\r\\P\n    \\r\\P\\P \n  \n/.{2,3}/<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/.{2,3}?/<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/-- Test simple validity check for restarts --/\n\n/abcdef/\n   abc\\R\n\n/<H((?(?!<H|F>)(.)|(?R))++)*F>/\n    text <H more text <H texting more  hexA0-\"\\xA0\"    hex above 7F-\"\\xBC\" F> text xxxxx <H text F> text F> text2 <H text sample F> more text.\n\n/^(?>.{4})abc|^\\w\\w.xabcd/\n    xxxxabcd\n    xx\\xa0xabcd \n\n/^(.{4}){2}+abc|^\\w\\w.x\\w\\w\\w\\wabcd/\n    xxxxxxxxabcd\n    xx\\xa0xxxxxabcd \n\n/abcd/\n    abcd\\O0\n\n/-- These tests show up auto-possessification --/\n\n/[ab]*/\n    aaaa\n    \n/[ab]*?/\n    aaaa\n    \n/[ab]?/\n    aaaa\n    \n/[ab]??/\n    aaaa\n    \n/[ab]+/\n    aaaa\n    \n/[ab]+?/\n    aaaa\n    \n/[ab]{2,3}/\n    aaaa\n    \n/[ab]{2,3}?/\n    aaaa\n    \n/[ab]{2,}/\n    aaaa    \n\n/[ab]{2,}?/\n    aaaa    \n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]*+|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n\n/(?(?!)a|b)/\n    bbb\n    aaa \n\n/()()a+/O=\n    aaa\\D\n    a\\D\n\n/(02-)?[0-9]{3}-[0-9]{3}/\n    02-123-123\n\n/-- End of testinput8 --/\n"
  },
  {
    "path": "src/pcre/testdata/testinput9",
    "content": "/-- This set of tests checks UTF-8 support with the DFA matching functionality\n    of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must\n    be used with pcretest when running it. --/\n    \n< forbid W \n\n/\\x{100}ab/8\n  \\x{100}ab\n  \n/a\\x{100}*b/8\n    ab\n    a\\x{100}b  \n    a\\x{100}\\x{100}b  \n    \n/a\\x{100}+b/8\n    a\\x{100}b  \n    a\\x{100}\\x{100}b  \n    *** Failers \n    ab\n     \n/\\bX/8\n    Xoanon\n    +Xoanon\n    \\x{300}Xoanon \n    *** Failers \n    YXoanon  \n    \n/\\BX/8\n    YXoanon\n    *** Failers\n    Xoanon\n    +Xoanon    \n    \\x{300}Xoanon \n\n/X\\b/8\n    X+oanon\n    ZX\\x{300}oanon \n    FAX \n    *** Failers \n    Xoanon  \n    \n/X\\B/8\n    Xoanon  \n    *** Failers\n    X+oanon\n    ZX\\x{300}oanon \n    FAX \n    \n/[^a]/8\n    abcd\n    a\\x{100}   \n\n/^[abc\\x{123}\\x{400}-\\x{402}]{2,3}\\d/8\n    ab99\n    \\x{123}\\x{123}45\n    \\x{400}\\x{401}\\x{402}6  \n    *** Failers\n    d99\n    \\x{123}\\x{122}4   \n    \\x{400}\\x{403}6  \n    \\x{400}\\x{401}\\x{402}\\x{402}6  \n\n/a.b/8\n    acb\n    a\\x7fb\n    a\\x{100}b \n    *** Failers\n    a\\nb  \n\n/a(.{3})b/8\n    a\\x{4000}xyb \n    a\\x{4000}\\x7fyb \n    a\\x{4000}\\x{100}yb \n    *** Failers\n    a\\x{4000}b \n    ac\\ncb \n\n/a(.*?)(.)/\n    a\\xc0\\x88b\n\n/a(.*?)(.)/8\n    a\\x{100}b\n\n/a(.*)(.)/\n    a\\xc0\\x88b\n\n/a(.*)(.)/8\n    a\\x{100}b\n\n/a(.)(.)/\n    a\\xc0\\x92bcd\n\n/a(.)(.)/8\n    a\\x{240}bcd\n\n/a(.?)(.)/\n    a\\xc0\\x92bcd\n\n/a(.?)(.)/8\n    a\\x{240}bcd\n\n/a(.??)(.)/\n    a\\xc0\\x92bcd\n\n/a(.??)(.)/8\n    a\\x{240}bcd\n\n/a(.{3})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    *** Failers\n    a\\x{1234}b \n    ac\\ncb \n\n/a(.{3,})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    *** Failers\n    a\\x{1234}b \n\n/a(.{3,}?)b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    *** Failers\n    a\\x{1234}b \n\n/a(.{3,5})b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    axbxxbcdefghijb \n    axxxxxbcdefghijb \n    *** Failers\n    a\\x{1234}b \n    axxxxxxbcdefghijb \n\n/a(.{3,5}?)b/8\n    a\\x{1234}xyb \n    a\\x{1234}\\x{4321}yb \n    a\\x{1234}\\x{4321}\\x{3412}b \n    axxxxbcdefghijb \n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n    axbxxbcdefghijb \n    axxxxxbcdefghijb \n    *** Failers\n    a\\x{1234}b \n    axxxxxxbcdefghijb \n\n/^[a\\x{c0}]/8\n    *** Failers\n    \\x{100}\n\n/(?<=aXb)cd/8\n    aXbcd\n\n/(?<=a\\x{100}b)cd/8\n    a\\x{100}bcd\n\n/(?<=a\\x{100000}b)cd/8\n    a\\x{100000}bcd\n    \n/(?:\\x{100}){3}b/8\n    \\x{100}\\x{100}\\x{100}b\n    *** Failers \n    \\x{100}\\x{100}b\n\n/\\x{ab}/8\n    \\x{ab} \n    \\xc2\\xab\n    *** Failers \n    \\x00{ab}\n\n/(?<=(.))X/8\n    WXYZ\n    \\x{256}XYZ \n    *** Failers\n    XYZ \n\n/[^a]+/8g\n    bcd\n    \\x{100}aY\\x{256}Z \n    \n/^[^a]{2}/8\n    \\x{100}bc\n \n/^[^a]{2,}/8\n    \\x{100}bcAa\n\n/^[^a]{2,}?/8\n    \\x{100}bca\n\n/[^a]+/8ig\n    bcd\n    \\x{100}aY\\x{256}Z \n    \n/^[^a]{2}/8i\n    \\x{100}bc\n \n/^[^a]{2,}/8i\n    \\x{100}bcAa\n\n/^[^a]{2,}?/8i\n    \\x{100}bca\n\n/\\x{100}{0,0}/8\n    abcd\n \n/\\x{100}?/8\n    abcd\n    \\x{100}\\x{100} \n\n/\\x{100}{0,3}/8 \n    \\x{100}\\x{100} \n    \\x{100}\\x{100}\\x{100}\\x{100} \n    \n/\\x{100}*/8\n    abce\n    \\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{1,1}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{1,3}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}+/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n\n/\\x{100}{3}/8\n    abcd\\x{100}\\x{100}\\x{100}XX\n\n/\\x{100}{3,5}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n\n/\\x{100}{3,}/8O\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n\n/(?<=a\\x{100}{2}b)X/8\n    Xyyya\\x{100}\\x{100}bXzzz\n\n/\\D*/8O\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\D*/8O\n  \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\D/8\n    1X2\n    1\\x{100}2 \n  \n/>\\S/8\n    > >X Y\n    > >\\x{100} Y\n  \n/\\d/8\n    \\x{100}3\n    \n/\\s/8\n    \\x{100} X\n    \n/\\D+/8\n    12abcd34\n    *** Failers\n    1234  \n\n/\\D{2,3}/8\n    12abcd34\n    12ab34\n    *** Failers  \n    1234\n    12a34  \n\n/\\D{2,3}?/8\n    12abcd34\n    12ab34\n    *** Failers  \n    1234\n    12a34  \n\n/\\d+/8\n    12abcd34\n    *** Failers\n\n/\\d{2,3}/8\n    12abcd34\n    1234abcd\n    *** Failers  \n    1.4 \n\n/\\d{2,3}?/8\n    12abcd34\n    1234abcd\n    *** Failers  \n    1.4 \n\n/\\S+/8\n    12abcd34\n    *** Failers\n    \\    \\ \n\n/\\S{2,3}/8\n    12abcd34\n    1234abcd\n    *** Failers\n    \\     \\  \n\n/\\S{2,3}?/8\n    12abcd34\n    1234abcd\n    *** Failers\n    \\     \\  \n\n/>\\s+</8\n    12>      <34\n    *** Failers\n\n/>\\s{2,3}</8\n    ab>  <cd\n    ab>   <ce\n    *** Failers\n    ab>    <cd \n\n/>\\s{2,3}?</8\n    ab>  <cd\n    ab>   <ce\n    *** Failers\n    ab>    <cd \n\n/\\w+/8\n    12      34\n    *** Failers\n    +++=*! \n\n/\\w{2,3}/8\n    ab  cd\n    abcd ce\n    *** Failers\n    a.b.c\n\n/\\w{2,3}?/8\n    ab  cd\n    abcd ce\n    *** Failers\n    a.b.c\n\n/\\W+/8\n    12====34\n    *** Failers\n    abcd \n\n/\\W{2,3}/8\n    ab====cd\n    ab==cd\n    *** Failers\n    a.b.c\n\n/\\W{2,3}?/8\n    ab====cd\n    ab==cd\n    *** Failers\n    a.b.c\n\n/[\\x{100}]/8\n    \\x{100}\n    Z\\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[Z\\x{100}]/8\n    Z\\x{100}\n    \\x{100}\n    \\x{100}Z\n    *** Failers \n\n/[\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   *** Failers  \n\n/[\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   *** Failers  \n\n/[z-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   abzcd\n   ab|cd  \n   *** Failers  \n\n/[Q\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   Q? \n   *** Failers  \n\n/[Q\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   Q? \n   *** Failers  \n\n/[Qz-\\x{200}]/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{111}cd \n   abzcd\n   ab|cd  \n   Q? \n   *** Failers  \n\n/[\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[Q\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/[Q\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n   ab\\x{200}cd\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n   *** Failers  \n\n/(?<=[\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n    abc\\x{100}X \n    *** Failers\n    X  \n\n/(?<=[Q\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n    abc\\x{100}X \n    abQX \n    *** Failers\n    X  \n\n/(?<=[\\x{100}\\x{200}]{3})X/8\n    abc\\x{100}\\x{200}\\x{100}X\n    *** Failers\n    abc\\x{200}X\n    X  \n\n/[^\\x{100}\\x{200}]X/8\n    AX\n    \\x{150}X\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{200}X   \n\n/[^Q\\x{100}\\x{200}]X/8\n    AX\n    \\x{150}X\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{200}X   \n    QX \n\n/[^\\x{100}-\\x{200}]X/8\n    AX\n    \\x{500}X \n    *** Failers\n    \\x{100}X\n    \\x{150}X\n    \\x{200}X   \n\n/[z-\\x{100}]/8i\n    z\n    Z \n    \\x{100}\n    *** Failers\n    \\x{102}\n    y    \n\n/[\\xFF]/\n    >\\xff<\n\n/[\\xff]/8\n    >\\x{ff}<\n\n/[^\\xFF]/\n    XYZ\n\n/[^\\xff]/8\n    XYZ\n    \\x{123} \n\n/^[ac]*b/8\n  xb\n\n/^[ac\\x{100}]*b/8\n  xb\n\n/^[^x]*b/8i\n  xb\n\n/^[^x]*b/8\n  xb\n  \n/^\\d*b/8\n  xb \n\n/(|a)/g8\n    catac\n    a\\x{256}a \n\n/^\\x{85}$/8i\n    \\x{85}\n\n/^abc./mgx8<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x{0085}abc7 \\x{2028}abc8 \\x{2029}abc9 JUNK\n\n/abc.$/mgx8<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x{0085} abc7\\x{2028} abc8\\x{2029} abc9\n\n/^a\\Rb/8<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0cb\n    a\\x{85}b   \n    a\\x{2028}b \n    a\\x{2029}b \n    ** Failers\n    a\\n\\rb    \n\n/^a\\R*b/8<bsr_unicode>\n    ab\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0c\\x{2028}\\x{2029}b\n    a\\x{85}b   \n    a\\n\\rb    \n    a\\n\\r\\x{85}\\x0cb \n\n/^a\\R+b/8<bsr_unicode>\n    a\\nb\n    a\\rb\n    a\\r\\nb\n    a\\x0bb\n    a\\x0c\\x{2028}\\x{2029}b\n    a\\x{85}b   \n    a\\n\\rb    \n    a\\n\\r\\x{85}\\x0cb \n    ** Failers\n    ab  \n\n/^a\\R{1,3}b/8<bsr_unicode>\n    a\\nb\n    a\\n\\rb\n    a\\n\\r\\x{85}b\n    a\\r\\n\\r\\nb \n    a\\r\\n\\r\\n\\r\\nb \n    a\\n\\r\\n\\rb\n    a\\n\\n\\r\\nb \n    ** Failers\n    a\\n\\n\\n\\rb\n    a\\r\n\n/\\h+\\V?\\v{3,4}/8O\n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n\n/\\V?\\v{3,4}/8O \n    \\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n\n/\\h+\\V?\\v{3,4}/8O\n    >\\x09\\x20\\x{a0}X\\x0a\\x0a\\x0a<\n\n/\\V?\\v{3,4}/8O\n    >\\x09\\x20\\x{a0}X\\x0a\\x0a\\x0a<\n\n/\\H\\h\\V\\v/8\n    X X\\x0a\n    X\\x09X\\x0b\n    ** Failers\n    \\x{a0} X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/8O \n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\\x0d\\x0a\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x20\\x{a0}\\x0a\\x0b\n     \n/\\H\\h\\V\\v/8\n    \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n    X\\x{180e}X\\x{85}\n    ** Failers\n    \\x{2009} X\\x0a   \n    \n/\\H*\\h+\\V?\\v{3,4}/8O \n    \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x0c\\x0d\\x0a\n    \\x09\\x{205f}\\x{a0}\\x0a\\x{2029}\\x0c\\x{2028}\\x0a\n    \\x09\\x20\\x{202f}\\x0a\\x0b\\x0c\n    ** Failers \n    \\x09\\x{200a}\\x{a0}\\x{2028}\\x0b\n     \n/a\\Rb/I8<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x{85}b\n    a\\x0bb     \n\n/a\\Rb/I8<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x{85}b\n    a\\x0bb     \n    ** Failers \n    a\\x{85}b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n    \n/a\\R?b/I8<bsr_anycrlf>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    ** Failers\n    a\\x{85}b\n    a\\x0bb     \n\n/a\\R?b/I8<bsr_unicode>\n    a\\rb\n    a\\nb\n    a\\r\\nb\n    a\\x{85}b\n    a\\x0bb     \n    ** Failers \n    a\\x{85}b\\<bsr_anycrlf>\n    a\\x0bb\\<bsr_anycrlf>\n \n/X/8f<any> \n    A\\x{1ec5}ABCXYZ\n\n/abcd*/8\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n\n/abcd*/i8\n    xxxxabcd\\P\n    xxxxabcd\\P\\P\n    XXXXABCD\\P\n    XXXXABCD\\P\\P\n\n/abc\\d*/8\n    xxxxabc1\\P\n    xxxxabc1\\P\\P\n\n/abc[de]*/8\n    xxxxabcde\\P\n    xxxxabcde\\P\\P\n\n/\\bthe cat\\b/8\n    the cat\\P\n    the cat\\P\\P\n\n/ab\\Cde/8\n    abXde\n\n/(?<=ab\\Cde)X/8\n\n/./8<CRLF>\n    \\r\\P\n    \\r\\P\\P \n  \n/.{2,3}/8<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/.{2,3}?/8<CRLF>\n    \\r\\P \n    \\r\\P\\P\n    \\r\\r\\P\n    \\r\\r\\P\\P\n    \\r\\r\\r\\P\n    \\r\\r\\r\\P\\P     \n\n/[^\\x{100}]/8\n    \\x{100}\\x{101}X\n\n/[^\\x{100}]+/8\n    \\x{100}\\x{101}X\n\n/-- End of testinput9 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testinputEBC",
    "content": "/-- This is a specialized test for checking, when PCRE is compiled with the\nEBCDIC option but in an ASCII environment, that newline and white space\nfunctionality is working. It catches cases where explicit values such as 0x0a\nhave been used instead of names like CHAR_LF. Needless to say, it is not a\ngenuine EBCDIC test! In patterns, alphabetic characters that follow a backslash\nmust be in EBCDIC code. In data, newlines and other spacing characters must be\nin EBCDIC, but can be specified as escapes. --/\n\n/-- Test default newline and variations --/\n\n/^A/m\n    ABC\n    12\\x15ABC\n\n/^A/m<any>\n    12\\x15ABC\n    12\\x0dABC\n    12\\x0d\\x15ABC\n    12\\x25ABC\n\n/^A/m<anycrlf>\n    12\\x15ABC\n    12\\x0dABC\n    12\\x0d\\x15ABC\n    ** Fail\n    12\\x25ABC\n\n/-- Test \\h --/\n\n/^A\\/\n    A B\n    A\\x41B\n\n/-- Test \\H --/\n\n/^A\\/\n    AB\n    A\\x42B\n    ** Fail\n    A B\n    A\\x41B\n\n/-- Test \\R --/\n\n/^A\\/\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n    ** Fail\n    A B\n\n/-- Test \\v --/\n\n/^A\\/\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n    ** Fail\n    A B\n\n/-- Test \\V --/\n\n/^A\\/\n    A B\n    ** Fail\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n    \n/-- For repeated items, use an atomic group so that the output is the same\nfor DFA matching (otherwise it may show multiple matches). --/ \n\n/-- Test \\h+ --/\n\n/^A(?>\\+)/\n    A B\n\n/-- Test \\H+ --/\n\n/^A(?>\\+)/\n    AB\n    ** Fail\n    A B\n\n/-- Test \\R+ --/\n\n/^A(?>\\+)/\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n    ** Fail\n    A B\n\n/-- Test \\v+ --/\n\n/^A(?>\\+)/\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n    ** Fail\n    A B\n\n/-- Test \\V+ --/\n\n/^A(?>\\+)/\n    A B\n    ** Fail\n    A\\x15B\n    A\\x0dB\n    A\\x25B\n    A\\x0bB\n    A\\x0cB\n\n/-- End --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput1",
    "content": "/-- This set of tests is for features that are compatible with all versions of\n    Perl >= 5.10, in non-UTF-8 mode. It should run clean for the 8-bit, 16-bit,\n    and 32-bit PCRE libraries. --/\n    \n< forbid 89?=ABCDEFfGILMNPTUWXZ<\n\n/the quick brown fox/\n    the quick brown fox\n 0: the quick brown fox\n    The quick brown FOX\nNo match\n    What do you know about the quick brown fox?\n 0: the quick brown fox\n    What do you know about THE QUICK BROWN FOX?\nNo match\n\n/The quick brown fox/i\n    the quick brown fox\n 0: the quick brown fox\n    The quick brown FOX\n 0: The quick brown FOX\n    What do you know about the quick brown fox?\n 0: the quick brown fox\n    What do you know about THE QUICK BROWN FOX?\n 0: THE QUICK BROWN FOX\n\n/abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/\n    abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\n 0: abcd\\x09\\x0a\\x0d\\x0c\\x07\\x1b9;$\\?caxyz\n\n/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/\n    abxyzpqrrrabbxyyyypqAzz\n 0: abxyzpqrrrabbxyyyypqAzz\n    abxyzpqrrrabbxyyyypqAzz\n 0: abxyzpqrrrabbxyyyypqAzz\n    aabxyzpqrrrabbxyyyypqAzz\n 0: aabxyzpqrrrabbxyyyypqAzz\n    aaabxyzpqrrrabbxyyyypqAzz\n 0: aaabxyzpqrrrabbxyyyypqAzz\n    aaaabxyzpqrrrabbxyyyypqAzz\n 0: aaaabxyzpqrrrabbxyyyypqAzz\n    abcxyzpqrrrabbxyyyypqAzz\n 0: abcxyzpqrrrabbxyyyypqAzz\n    aabcxyzpqrrrabbxyyyypqAzz\n 0: aabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypAzz\n 0: aaabcxyzpqrrrabbxyyyypAzz\n    aaabcxyzpqrrrabbxyyyypqAzz\n 0: aaabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n    aaaabcxyzpqrrrabbxyyyypqAzz\n 0: aaaabcxyzpqrrrabbxyyyypqAzz\n    abxyzzpqrrrabbxyyyypqAzz\n 0: abxyzzpqrrrabbxyyyypqAzz\n    aabxyzzzpqrrrabbxyyyypqAzz\n 0: aabxyzzzpqrrrabbxyyyypqAzz\n    aaabxyzzzzpqrrrabbxyyyypqAzz\n 0: aaabxyzzzzpqrrrabbxyyyypqAzz\n    aaaabxyzzzzpqrrrabbxyyyypqAzz\n 0: aaaabxyzzzzpqrrrabbxyyyypqAzz\n    abcxyzzpqrrrabbxyyyypqAzz\n 0: abcxyzzpqrrrabbxyyyypqAzz\n    aabcxyzzzpqrrrabbxyyyypqAzz\n 0: aabcxyzzzpqrrrabbxyyyypqAzz\n    aaabcxyzzzzpqrrrabbxyyyypqAzz\n 0: aaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbxyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypABzz\n 0: aaabcxyzpqrrrabbxyyyypABzz\n    aaabcxyzpqrrrabbxyyyypABBzz\n 0: aaabcxyzpqrrrabbxyyyypABBzz\n    >>>aaabxyzpqrrrabbxyyyypqAzz\n 0: aaabxyzpqrrrabbxyyyypqAzz\n    >aaaabxyzpqrrrabbxyyyypqAzz\n 0: aaaabxyzpqrrrabbxyyyypqAzz\n    >>>>abcxyzpqrrrabbxyyyypqAzz\n 0: abcxyzpqrrrabbxyyyypqAzz\n    *** Failers\nNo match\n    abxyzpqrrabbxyyyypqAzz\nNo match\n    abxyzpqrrrrabbxyyyypqAzz\nNo match\n    abxyzpqrrrabxyyyypqAzz\nNo match\n    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\nNo match\n    aaaabcxyzzzzpqrrrabbbxyyypqAzz\nNo match\n    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\nNo match\n\n/^(abc){1,2}zz/\n    abczz\n 0: abczz\n 1: abc\n    abcabczz\n 0: abcabczz\n 1: abc\n    *** Failers\nNo match\n    zz\nNo match\n    abcabcabczz\nNo match\n    >>abczz\nNo match\n\n/^(b+?|a){1,2}?c/\n    bc\n 0: bc\n 1: b\n    bbc\n 0: bbc\n 1: b\n    bbbc\n 0: bbbc\n 1: bb\n    bac\n 0: bac\n 1: a\n    bbac\n 0: bbac\n 1: a\n    aac\n 0: aac\n 1: a\n    abbbbbbbbbbbc\n 0: abbbbbbbbbbbc\n 1: bbbbbbbbbbb\n    bbbbbbbbbbbac\n 0: bbbbbbbbbbbac\n 1: a\n    *** Failers\nNo match\n    aaac\nNo match\n    abbbbbbbbbbbac\nNo match\n\n/^(b+|a){1,2}c/\n    bc\n 0: bc\n 1: b\n    bbc\n 0: bbc\n 1: bb\n    bbbc\n 0: bbbc\n 1: bbb\n    bac\n 0: bac\n 1: a\n    bbac\n 0: bbac\n 1: a\n    aac\n 0: aac\n 1: a\n    abbbbbbbbbbbc\n 0: abbbbbbbbbbbc\n 1: bbbbbbbbbbb\n    bbbbbbbbbbbac\n 0: bbbbbbbbbbbac\n 1: a\n    *** Failers\nNo match\n    aaac\nNo match\n    abbbbbbbbbbbac\nNo match\n\n/^(b+|a){1,2}?bc/\n    bbc\n 0: bbc\n 1: b\n\n/^(b*|ba){1,2}?bc/\n    babc\n 0: babc\n 1: ba\n    bbabc\n 0: bbabc\n 1: ba\n    bababc\n 0: bababc\n 1: ba\n    *** Failers\nNo match\n    bababbc\nNo match\n    babababc\nNo match\n\n/^(ba|b*){1,2}?bc/\n    babc\n 0: babc\n 1: ba\n    bbabc\n 0: bbabc\n 1: ba\n    bababc\n 0: bababc\n 1: ba\n    *** Failers\nNo match\n    bababbc\nNo match\n    babababc\nNo match\n\n/^\\ca\\cA\\c[;\\c:/\n    \\x01\\x01\\e;z\n 0: \\x01\\x01\\x1b;z\n\n/^[ab\\]cde]/\n    athing\n 0: a\n    bthing\n 0: b\n    ]thing\n 0: ]\n    cthing\n 0: c\n    dthing\n 0: d\n    ething\n 0: e\n    *** Failers\nNo match\n    fthing\nNo match\n    [thing\nNo match\n    \\\\thing\nNo match\n\n/^[]cde]/\n    ]thing\n 0: ]\n    cthing\n 0: c\n    dthing\n 0: d\n    ething\n 0: e\n    *** Failers\nNo match\n    athing\nNo match\n    fthing\nNo match\n\n/^[^ab\\]cde]/\n    fthing\n 0: f\n    [thing\n 0: [\n    \\\\thing\n 0: \\\n    *** Failers\n 0: *\n    athing\nNo match\n    bthing\nNo match\n    ]thing\nNo match\n    cthing\nNo match\n    dthing\nNo match\n    ething\nNo match\n\n/^[^]cde]/\n    athing\n 0: a\n    fthing\n 0: f\n    *** Failers\n 0: *\n    ]thing\nNo match\n    cthing\nNo match\n    dthing\nNo match\n    ething\nNo match\n\n/^\\/\n    \n 0: \\x81\n\n/^/\n    \n 0: \\xff\n\n/^[0-9]+$/\n    0\n 0: 0\n    1\n 0: 1\n    2\n 0: 2\n    3\n 0: 3\n    4\n 0: 4\n    5\n 0: 5\n    6\n 0: 6\n    7\n 0: 7\n    8\n 0: 8\n    9\n 0: 9\n    10\n 0: 10\n    100\n 0: 100\n    *** Failers\nNo match\n    abc\nNo match\n\n/^.*nter/\n    enter\n 0: enter\n    inter\n 0: inter\n    uponter\n 0: uponter\n\n/^xxx[0-9]+$/\n    xxx0\n 0: xxx0\n    xxx1234\n 0: xxx1234\n    *** Failers\nNo match\n    xxx\nNo match\n\n/^.+[0-9][0-9][0-9]$/\n    x123\n 0: x123\n    xx123\n 0: xx123\n    123456\n 0: 123456\n    *** Failers\nNo match\n    123\nNo match\n    x1234\n 0: x1234\n\n/^.+?[0-9][0-9][0-9]$/\n    x123\n 0: x123\n    xx123\n 0: xx123\n    123456\n 0: 123456\n    *** Failers\nNo match\n    123\nNo match\n    x1234\n 0: x1234\n\n/^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/\n    abc!pqr=apquxz.ixr.zzz.ac.uk\n 0: abc!pqr=apquxz.ixr.zzz.ac.uk\n 1: abc\n 2: pqr\n    *** Failers\nNo match\n    !pqr=apquxz.ixr.zzz.ac.uk\nNo match\n    abc!=apquxz.ixr.zzz.ac.uk\nNo match\n    abc!pqr=apquxz:ixr.zzz.ac.uk\nNo match\n    abc!pqr=apquxz.ixr.zzz.ac.ukk\nNo match\n\n/:/\n    Well, we need a colon: somewhere\n 0: :\n    *** Fail if we don't\nNo match\n\n/([\\da-f:]+)$/i\n    0abc\n 0: 0abc\n 1: 0abc\n    abc\n 0: abc\n 1: abc\n    fed\n 0: fed\n 1: fed\n    E\n 0: E\n 1: E\n    ::\n 0: ::\n 1: ::\n    5f03:12C0::932e\n 0: 5f03:12C0::932e\n 1: 5f03:12C0::932e\n    fed def\n 0: def\n 1: def\n    Any old stuff\n 0: ff\n 1: ff\n    *** Failers\nNo match\n    0zzz\nNo match\n    gzzz\nNo match\n    fed\\x20\nNo match\n    Any old rubbish\nNo match\n\n/^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/\n    .1.2.3\n 0: .1.2.3\n 1: 1\n 2: 2\n 3: 3\n    A.12.123.0\n 0: A.12.123.0\n 1: 12\n 2: 123\n 3: 0\n    *** Failers\nNo match\n    .1.2.3333\nNo match\n    1.2.3\nNo match\n    1234.2.3\nNo match\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n 0: 1 IN SOA non-sp1 non-sp2(\n 1: 1\n 2: non-sp1\n 3: non-sp2\n    1    IN    SOA    non-sp1    non-sp2   (\n 0: 1    IN    SOA    non-sp1    non-sp2   (\n 1: 1\n 2: non-sp1\n 3: non-sp2\n    *** Failers\nNo match\n    1IN SOA non-sp1 non-sp2(\nNo match\n\n/^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/\n    a.\n 0: a.\n    Z.\n 0: Z.\n    2.\n 0: 2.\n    ab-c.pq-r.\n 0: ab-c.pq-r.\n 1: .pq-r\n    sxk.zzz.ac.uk.\n 0: sxk.zzz.ac.uk.\n 1: .uk\n    x-.y-.\n 0: x-.y-.\n 1: .y-\n    *** Failers\nNo match\n    -abc.peq.\nNo match\n\n/^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/\n    *.a\n 0: *.a\n    *.b0-a\n 0: *.b0-a\n 1: 0-a\n    *.c3-b.c\n 0: *.c3-b.c\n 1: 3-b\n 2: .c\n    *.c-a.b-c\n 0: *.c-a.b-c\n 1: -a\n 2: .b-c\n 3: -c\n    *** Failers\nNo match\n    *.0\nNo match\n    *.a-\nNo match\n    *.a-b.c-\nNo match\n    *.c-a.0-c\nNo match\n\n/^(?=ab(de))(abd)(e)/\n    abde\n 0: abde\n 1: de\n 2: abd\n 3: e\n\n/^(?!(ab)de|x)(abd)(f)/\n    abdf\n 0: abdf\n 1: <unset>\n 2: abd\n 3: f\n\n/^(?=(ab(cd)))(ab)/\n    abcd\n 0: ab\n 1: abcd\n 2: cd\n 3: ab\n\n/^[\\da-f](\\.[\\da-f])*$/i\n    a.b.c.d\n 0: a.b.c.d\n 1: .d\n    A.B.C.D\n 0: A.B.C.D\n 1: .D\n    a.b.c.1.2.3.C\n 0: a.b.c.1.2.3.C\n 1: .C\n\n/^\\\".*\\\"\\s*(;.*)?$/\n    \\\"1234\\\"\n 0: \"1234\"\n    \\\"abcd\\\" ;\n 0: \"abcd\" ;\n 1: ;\n    \\\"\\\" ; rhubarb\n 0: \"\" ; rhubarb\n 1: ; rhubarb\n    *** Failers\nNo match\n    \\\"1234\\\" : things\nNo match\n\n/^$/\n    \\\n 0: \n    *** Failers\nNo match\n\n/   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/x\n    ab c\n 0: ab c\n    *** Failers\nNo match\n    abc\nNo match\n    ab cde\nNo match\n\n/(?x)   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/\n    ab c\n 0: ab c\n    *** Failers\nNo match\n    abc\nNo match\n    ab cde\nNo match\n\n/^   a\\ b[c ]d       $/x\n    a bcd\n 0: a bcd\n    a b d\n 0: a b d\n    *** Failers\nNo match\n    abcd\nNo match\n    ab d\nNo match\n\n/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/\n    abcdefhijklm\n 0: abcdefhijklm\n 1: abc\n 2: bc\n 3: c\n 4: def\n 5: ef\n 6: f\n 7: hij\n 8: ij\n 9: j\n10: klm\n11: lm\n12: m\n\n/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/\n    abcdefhijklm\n 0: abcdefhijklm\n 1: bc\n 2: c\n 3: ef\n 4: f\n 5: ij\n 6: j\n 7: lm\n 8: m\n\n/^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/\n    a+ Z0+\\x08\\n\\x1d\\x12\n 0: a+ Z0+\\x08\\x0a\\x1d\\x12\n\n/^[.^$|()*+?{,}]+/\n    .^\\$(*+)|{?,?}\n 0: .^$(*+)|{?,?}\n\n/^a*\\w/\n    z\n 0: z\n    az\n 0: az\n    aaaz\n 0: aaaz\n    a\n 0: a\n    aa\n 0: aa\n    aaaa\n 0: aaaa\n    a+\n 0: a\n    aa+\n 0: aa\n\n/^a*?\\w/\n    z\n 0: z\n    az\n 0: a\n    aaaz\n 0: a\n    a\n 0: a\n    aa\n 0: a\n    aaaa\n 0: a\n    a+\n 0: a\n    aa+\n 0: a\n\n/^a+\\w/\n    az\n 0: az\n    aaaz\n 0: aaaz\n    aa\n 0: aa\n    aaaa\n 0: aaaa\n    aa+\n 0: aa\n\n/^a+?\\w/\n    az\n 0: az\n    aaaz\n 0: aa\n    aa\n 0: aa\n    aaaa\n 0: aa\n    aa+\n 0: aa\n\n/^\\d{8}\\w{2,}/\n    1234567890\n 0: 1234567890\n    12345678ab\n 0: 12345678ab\n    12345678__\n 0: 12345678__\n    *** Failers\nNo match\n    1234567\nNo match\n\n/^[aeiou\\d]{4,5}$/\n    uoie\n 0: uoie\n    1234\n 0: 1234\n    12345\n 0: 12345\n    aaaaa\n 0: aaaaa\n    *** Failers\nNo match\n    123456\nNo match\n\n/^[aeiou\\d]{4,5}?/\n    uoie\n 0: uoie\n    1234\n 0: 1234\n    12345\n 0: 1234\n    aaaaa\n 0: aaaa\n    123456\n 0: 1234\n\n/\\A(abc|def)=(\\1){2,3}\\Z/\n    abc=abcabc\n 0: abc=abcabc\n 1: abc\n 2: abc\n    def=defdefdef\n 0: def=defdefdef\n 1: def\n 2: def\n    *** Failers\nNo match\n    abc=defdef\nNo match\n\n/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$/\n    abcdefghijkcda2\n 0: abcdefghijkcda2\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n12: cd\n    abcdefghijkkkkcda2\n 0: abcdefghijkkkkcda2\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n12: cd\n\n/(cat(a(ract|tonic)|erpillar)) \\1()2(3)/\n    cataract cataract23\n 0: cataract cataract23\n 1: cataract\n 2: aract\n 3: ract\n 4: \n 5: 3\n    catatonic catatonic23\n 0: catatonic catatonic23\n 1: catatonic\n 2: atonic\n 3: tonic\n 4: \n 5: 3\n    caterpillar caterpillar23\n 0: caterpillar caterpillar23\n 1: caterpillar\n 2: erpillar\n 3: <unset>\n 4: \n 5: 3\n\n\n/^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]/\n    From abcd  Mon Sep 01 12:33:02 1997\n 0: From abcd  Mon Sep 01 12:33\n 1: abcd\n\n/^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/\n    From abcd  Mon Sep 01 12:33:02 1997\n 0: From abcd  Mon Sep 01 12:33\n 1: Sep \n    From abcd  Mon Sep  1 12:33:02 1997\n 0: From abcd  Mon Sep  1 12:33\n 1: Sep  \n    *** Failers\nNo match\n    From abcd  Sep 01 12:33:02 1997\nNo match\n\n/^12.34/s\n    12\\n34\n 0: 12\\x0a34\n    12\\r34\n 0: 12\\x0d34\n\n/\\w+(?=\\t)/\n    the quick brown\\t fox\n 0: brown\n\n/foo(?!bar)(.*)/\n    foobar is foolish see?\n 0: foolish see?\n 1: lish see?\n\n/(?:(?!foo)...|^.{0,2})bar(.*)/\n    foobar crowbar etc\n 0: rowbar etc\n 1:  etc\n    barrel\n 0: barrel\n 1: rel\n    2barrel\n 0: 2barrel\n 1: rel\n    A barrel\n 0: A barrel\n 1: rel\n\n/^(\\D*)(?=\\d)(?!123)/\n    abc456\n 0: abc\n 1: abc\n    *** Failers\nNo match\n    abc123\nNo match\n\n/^1234(?# test newlines\n  inside)/\n    1234\n 0: 1234\n\n/^1234 #comment in extended re\n  /x\n    1234\n 0: 1234\n\n/#rhubarb\n  abcd/x\n    abcd\n 0: abcd\n\n/^abcd#rhubarb/x\n    abcd\n 0: abcd\n\n/^(a)\\1{2,3}(.)/\n    aaab\n 0: aaab\n 1: a\n 2: b\n    aaaab\n 0: aaaab\n 1: a\n 2: b\n    aaaaab\n 0: aaaaa\n 1: a\n 2: a\n    aaaaaab\n 0: aaaaa\n 1: a\n 2: a\n\n/(?!^)abc/\n    the abc\n 0: abc\n    *** Failers\nNo match\n    abc\nNo match\n\n/(?=^)abc/\n    abc\n 0: abc\n    *** Failers\nNo match\n    the abc\nNo match\n\n/^[ab]{1,3}(ab*|b)/\n    aabbbbb\n 0: aabb\n 1: b\n\n/^[ab]{1,3}?(ab*|b)/\n    aabbbbb\n 0: aabbbbb\n 1: abbbbb\n\n/^[ab]{1,3}?(ab*?|b)/\n    aabbbbb\n 0: aa\n 1: a\n\n/^[ab]{1,3}(ab*?|b)/\n    aabbbbb\n 0: aabb\n 1: b\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/x\n    Alan Other <user\\@dom.ain>\n 0: Alan Other <user@dom.ain>\n    <user\\@dom.ain>\n 0: user@dom.ain\n    user\\@dom.ain\n 0: user@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n 0: \"A. Other\" <user.1234@dom.ain> (a comment)\n    A. Other <user.1234\\@dom.ain> (a comment)\n 0:  Other <user.1234@dom.ain> (a comment)\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n 0: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay\n    A missing angle <user\\@some.where\n 0: user@some.where\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional leading comment\n(?:\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n# address\n|                             #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n# leading word\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *               # \"normal\" atoms and or spaces\n(?:\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n|\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n) # \"special\" comment or quoted string\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *            #  more \"normal\"\n)*\n<\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# <\n(?:\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n(?: ,\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n)*  # additional domains\n:\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)?     #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n#       address spec\n>                    #                 >\n# name and address\n)\n/x\n    Alan Other <user\\@dom.ain>\n 0: Alan Other <user@dom.ain>\n    <user\\@dom.ain>\n 0: user@dom.ain\n    user\\@dom.ain\n 0: user@dom.ain\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n 0: \"A. Other\" <user.1234@dom.ain>\n    A. Other <user.1234\\@dom.ain> (a comment)\n 0:  Other <user.1234@dom.ain>\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n 0: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay\n    A missing angle <user\\@some.where\n 0: user@some.where\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/abc\\0def\\00pqr\\000xyz\\0000AB/\n    abc\\0def\\00pqr\\000xyz\\0000AB\n 0: abc\\x00def\\x00pqr\\x00xyz\\x000AB\n    abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\n 0: abc\\x00def\\x00pqr\\x00xyz\\x000AB\n\n/abc\\x0def\\x00pqr\\x000xyz\\x0000AB/\n    abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n 0: abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n    abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\n 0: abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n\n/^[\\000-\\037]/\n    \\0A\n 0: \\x00\n    \\01B\n 0: \\x01\n    \\037C\n 0: \\x1f\n\n/\\0*/\n    \\0\\0\\0\\0\n 0: \\x00\\x00\\x00\\x00\n\n/A\\x0{2,3}Z/\n    The A\\x0\\x0Z\n 0: A\\x00\\x00Z\n    An A\\0\\x0\\0Z\n 0: A\\x00\\x00\\x00Z\n    *** Failers\nNo match\n    A\\0Z\nNo match\n    A\\0\\x0\\0\\x0Z\nNo match\n\n/^(cow|)\\1(bell)/\n    cowcowbell\n 0: cowcowbell\n 1: cow\n 2: bell\n    bell\n 0: bell\n 1: \n 2: bell\n    *** Failers\nNo match\n    cowbell\nNo match\n\n/^\\s/\n    \\040abc\n 0:  \n    \\x0cabc\n 0: \\x0c\n    \\nabc\n 0: \\x0a\n    \\rabc\n 0: \\x0d\n    \\tabc\n 0: \\x09\n    *** Failers\nNo match\n    abc\nNo match\n\n/^a\tb\n    \f  c/x\n    abc\n 0: abc\n\n/^(a|)\\1*b/\n    ab\n 0: ab\n 1: a\n    aaaab\n 0: aaaab\n 1: a\n    b\n 0: b\n 1: \n    *** Failers\nNo match\n    acb\nNo match\n\n/^(a|)\\1+b/\n    aab\n 0: aab\n 1: a\n    aaaab\n 0: aaaab\n 1: a\n    b\n 0: b\n 1: \n    *** Failers\nNo match\n    ab\nNo match\n\n/^(a|)\\1?b/\n    ab\n 0: ab\n 1: a\n    aab\n 0: aab\n 1: a\n    b\n 0: b\n 1: \n    *** Failers\nNo match\n    acb\nNo match\n\n/^(a|)\\1{2}b/\n    aaab\n 0: aaab\n 1: a\n    b\n 0: b\n 1: \n    *** Failers\nNo match\n    ab\nNo match\n    aab\nNo match\n    aaaab\nNo match\n\n/^(a|)\\1{2,3}b/\n    aaab\n 0: aaab\n 1: a\n    aaaab\n 0: aaaab\n 1: a\n    b\n 0: b\n 1: \n    *** Failers\nNo match\n    ab\nNo match\n    aab\nNo match\n    aaaaab\nNo match\n\n/ab{1,3}bc/\n    abbbbc\n 0: abbbbc\n    abbbc\n 0: abbbc\n    abbc\n 0: abbc\n    *** Failers\nNo match\n    abc\nNo match\n    abbbbbc\nNo match\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n 1: track1\n 2: title\n 3: Blah blah blah\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/i\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n 1: track1\n 2: title\n 3: Blah blah blah\n\n/([^.]*)\\.([^:]*):[t ]+(.*)/i\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n 1: track1\n 2: title\n 3: Blah blah blah\n\n/^[W-c]+$/\n    WXY_^abc\n 0: WXY_^abc\n    *** Failers\nNo match\n    wxy\nNo match\n\n/^[W-c]+$/i\n    WXY_^abc\n 0: WXY_^abc\n    wxy_^ABC\n 0: wxy_^ABC\n\n/^[\\x3f-\\x5F]+$/i\n    WXY_^abc\n 0: WXY_^abc\n    wxy_^ABC\n 0: wxy_^ABC\n\n/^abc$/m\n    abc\n 0: abc\n    qqq\\nabc\n 0: abc\n    abc\\nzzz\n 0: abc\n    qqq\\nabc\\nzzz\n 0: abc\n\n/^abc$/\n    abc\n 0: abc\n    *** Failers\nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n\n/\\Aabc\\Z/m\n    abc\n 0: abc\n    abc\\n \n 0: abc\n    *** Failers\nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n    \n/\\A(.)*\\Z/s\n    abc\\ndef\n 0: abc\\x0adef\n 1: f\n\n/\\A(.)*\\Z/m\n    *** Failers\n 0: *** Failers\n 1: s\n    abc\\ndef\nNo match\n\n/(?:b)|(?::+)/\n    b::c\n 0: b\n    c::b\n 0: ::\n\n/[-az]+/\n    az-\n 0: az-\n    *** Failers\n 0: a\n    b\nNo match\n\n/[az-]+/\n    za-\n 0: za-\n    *** Failers\n 0: a\n    b\nNo match\n\n/[a\\-z]+/\n    a-z\n 0: a-z\n    *** Failers\n 0: a\n    b\nNo match\n\n/[a-z]+/\n    abcdxyz\n 0: abcdxyz\n\n/[\\d-]+/\n    12-34\n 0: 12-34\n    *** Failers\nNo match\n    aaa\nNo match\n\n/[\\d-z]+/\n    12-34z\n 0: 12-34z\n    *** Failers\nNo match\n    aaa\nNo match\n\n/\\x5c/\n    \\\\\n 0: \\\n\n/\\x20Z/\n    the Zoo\n 0:  Z\n    *** Failers\nNo match\n    Zulu\nNo match\n\n/(abc)\\1/i\n    abcabc\n 0: abcabc\n 1: abc\n    ABCabc\n 0: ABCabc\n 1: ABC\n    abcABC\n 0: abcABC\n 1: abc\n\n/ab{3cd/\n    ab{3cd\n 0: ab{3cd\n\n/ab{3,cd/\n    ab{3,cd\n 0: ab{3,cd\n\n/ab{3,4a}cd/\n    ab{3,4a}cd\n 0: ab{3,4a}cd\n\n/{4,5a}bc/\n    {4,5a}bc\n 0: {4,5a}bc\n\n/abc$/\n    abc\n 0: abc\n    abc\\n\n 0: abc\n    *** Failers\nNo match\n    abc\\ndef\nNo match\n\n/(abc)\\123/\n    abc\\x53\n 0: abcS\n 1: abc\n\n/(abc)\\223/\n    abc\\x93\n 0: abc\\x93\n 1: abc\n\n/(abc)\\323/\n    abc\\xd3\n 0: abc\\xd3\n 1: abc\n\n/(abc)\\100/\n    abc\\x40\n 0: abc@\n 1: abc\n    abc\\100\n 0: abc@\n 1: abc\n\n/(abc)\\1000/\n    abc\\x400\n 0: abc@0\n 1: abc\n    abc\\x40\\x30\n 0: abc@0\n 1: abc\n    abc\\1000\n 0: abc@0\n 1: abc\n    abc\\100\\x30\n 0: abc@0\n 1: abc\n    abc\\100\\060\n 0: abc@0\n 1: abc\n    abc\\100\\60\n 0: abc@0\n 1: abc\n    \n/^A\\8B\\9C$/\n    A8B9C\n 0: A8B9C\n    *** Failers\nNo match\n    A\\08B\\09C  \nNo match\n    \n/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\\8\\9$/\n    ABCDEFGHIHI \n 0: ABCDEFGHIHI\n 1: A\n 2: B\n 3: C\n 4: D\n 5: E\n 6: F\n 7: G\n 8: H\n 9: I\n\n/^[A\\8B\\9C]+$/\n    A8B9C\n 0: A8B9C\n    *** Failers \nNo match\n    A8B9C\\x00\nNo match\n\n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\\12\\123/\n    abcdefghijkllS\n 0: abcdefghijkllS\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n12: l\n\n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/\n    abcdefghijk\\12S\n 0: abcdefghijk\\x0aS\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n\n/ab\\idef/\n    abidef\n 0: abidef\n\n/a{0}bc/\n    bc\n 0: bc\n\n/(a|(bc)){0,0}?xyz/\n    xyz\n 0: xyz\n\n/abc[\\10]de/\n    abc\\010de\n 0: abc\\x08de\n\n/abc[\\1]de/\n    abc\\1de\n 0: abc\\x01de\n\n/(abc)[\\1]de/\n    abc\\1de\n 0: abc\\x01de\n 1: abc\n\n/(?s)a.b/\n    a\\nb\n 0: a\\x0ab\n\n/^([^a])([^\\b])([^c]*)([^d]{3,4})/\n    baNOTccccd\n 0: baNOTcccc\n 1: b\n 2: a\n 3: NOT\n 4: cccc\n    baNOTcccd\n 0: baNOTccc\n 1: b\n 2: a\n 3: NOT\n 4: ccc\n    baNOTccd\n 0: baNOTcc\n 1: b\n 2: a\n 3: NO\n 4: Tcc\n    bacccd\n 0: baccc\n 1: b\n 2: a\n 3: \n 4: ccc\n    *** Failers\n 0: *** Failers\n 1: *\n 2: *\n 3: * Fail\n 4: ers\n    anything\nNo match\n    b\\bc   \nNo match\n    baccd\nNo match\n\n/[^a]/\n    Abc\n 0: A\n  \n/[^a]/i\n    Abc \n 0: b\n\n/[^a]+/\n    AAAaAbc\n 0: AAA\n  \n/[^a]+/i\n    AAAaAbc \n 0: bc\n\n/[^a]+/\n    bbb\\nccc\n 0: bbb\\x0accc\n   \n/[^k]$/\n    abc\n 0: c\n    *** Failers\n 0: s\n    abk   \nNo match\n   \n/[^k]{2,3}$/\n    abc\n 0: abc\n    kbc\n 0: bc\n    kabc \n 0: abc\n    *** Failers\n 0: ers\n    abk\nNo match\n    akb\nNo match\n    akk \nNo match\n\n/^\\d{8,}\\@.+[^k]$/\n    12345678\\@a.b.c.d\n 0: 12345678@a.b.c.d\n    123456789\\@x.y.z\n 0: 123456789@x.y.z\n    *** Failers\nNo match\n    12345678\\@x.y.uk\nNo match\n    1234567\\@a.b.c.d       \nNo match\n\n/(a)\\1{8,}/\n    aaaaaaaaa\n 0: aaaaaaaaa\n 1: a\n    aaaaaaaaaa\n 0: aaaaaaaaaa\n 1: a\n    *** Failers\nNo match\n    aaaaaaa   \nNo match\n\n/[^a]/\n    aaaabcd\n 0: b\n    aaAabcd \n 0: A\n\n/[^a]/i\n    aaaabcd\n 0: b\n    aaAabcd \n 0: b\n\n/[^az]/\n    aaaabcd\n 0: b\n    aaAabcd \n 0: A\n\n/[^az]/i\n    aaaabcd\n 0: b\n    aaAabcd \n 0: b\n\n/\\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/\n \\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\n 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\n\n/P[^*]TAIRE[^*]{1,6}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n 0: PSTAIREISLL\n\n/P[^*]TAIRE[^*]{1,}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n 0: PSTAIREISLL\n\n/(\\.\\d\\d[1-9]?)\\d+/\n    1.230003938\n 0: .230003938\n 1: .23\n    1.875000282   \n 0: .875000282\n 1: .875\n    1.235  \n 0: .235\n 1: .23\n                  \n/(\\.\\d\\d((?=0)|\\d(?=\\d)))/\n    1.230003938      \n 0: .23\n 1: .23\n 2: \n    1.875000282\n 0: .875\n 1: .875\n 2: 5\n    *** Failers \nNo match\n    1.235 \nNo match\n    \n/a(?)b/\n    ab \n 0: ab\n \n/\\b(foo)\\s+(\\w+)/i\n    Food is on the foo table\n 0: foo table\n 1: foo\n 2: table\n    \n/foo(.*)bar/\n    The food is under the bar in the barn.\n 0: food is under the bar in the bar\n 1: d is under the bar in the \n    \n/foo(.*?)bar/  \n    The food is under the bar in the barn.\n 0: food is under the bar\n 1: d is under the \n\n/(.*)(\\d*)/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: 53147\n 2: \n    \n/(.*)(\\d+)/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: 5314\n 2: 7\n \n/(.*?)(\\d*)/\n    I have 2 numbers: 53147\n 0: \n 1: \n 2: \n\n/(.*?)(\\d+)/\n    I have 2 numbers: 53147\n 0: I have 2\n 1: I have \n 2: 2\n\n/(.*)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: 5314\n 2: 7\n\n/(.*?)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: \n 2: 53147\n\n/(.*)\\b(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: \n 2: 53147\n\n/(.*\\D)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: \n 2: 53147\n\n/^\\D*(?!123)/\n    ABC123\n 0: AB\n     \n/^(\\D*)(?=\\d)(?!123)/\n    ABC445\n 0: ABC\n 1: ABC\n    *** Failers\nNo match\n    ABC123\nNo match\n    \n/^[W-]46]/\n    W46]789 \n 0: W46]\n    -46]789\n 0: -46]\n    *** Failers\nNo match\n    Wall\nNo match\n    Zebra\nNo match\n    42\nNo match\n    [abcd] \nNo match\n    ]abcd[\nNo match\n       \n/^[W-\\]46]/\n    W46]789 \n 0: W\n    Wall\n 0: W\n    Zebra\n 0: Z\n    Xylophone  \n 0: X\n    42\n 0: 4\n    [abcd] \n 0: [\n    ]abcd[\n 0: ]\n    \\\\backslash \n 0: \\\n    *** Failers\nNo match\n    -46]789\nNo match\n    well\nNo match\n    \n/\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/\n    01/01/2000\n 0: 01/01/2000\n\n/word (?:[a-zA-Z0-9]+ ){0,10}otherword/\n  word cat dog elephant mussel cow horse canary baboon snake shark otherword\n 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword\n  word cat dog elephant mussel cow horse canary baboon snake shark\nNo match\n\n/word (?:[a-zA-Z0-9]+ ){0,300}otherword/\n  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\nNo match\n\n/^(a){0,0}/\n    bcd\n 0: \n    abc\n 0: \n    aab     \n 0: \n\n/^(a){0,1}/\n    bcd\n 0: \n    abc\n 0: a\n 1: a\n    aab  \n 0: a\n 1: a\n\n/^(a){0,2}/\n    bcd\n 0: \n    abc\n 0: a\n 1: a\n    aab  \n 0: aa\n 1: a\n\n/^(a){0,3}/\n    bcd\n 0: \n    abc\n 0: a\n 1: a\n    aab\n 0: aa\n 1: a\n    aaa   \n 0: aaa\n 1: a\n\n/^(a){0,}/\n    bcd\n 0: \n    abc\n 0: a\n 1: a\n    aab\n 0: aa\n 1: a\n    aaa\n 0: aaa\n 1: a\n    aaaaaaaa    \n 0: aaaaaaaa\n 1: a\n\n/^(a){1,1}/\n    bcd\nNo match\n    abc\n 0: a\n 1: a\n    aab  \n 0: a\n 1: a\n\n/^(a){1,2}/\n    bcd\nNo match\n    abc\n 0: a\n 1: a\n    aab  \n 0: aa\n 1: a\n\n/^(a){1,3}/\n    bcd\nNo match\n    abc\n 0: a\n 1: a\n    aab\n 0: aa\n 1: a\n    aaa   \n 0: aaa\n 1: a\n\n/^(a){1,}/\n    bcd\nNo match\n    abc\n 0: a\n 1: a\n    aab\n 0: aa\n 1: a\n    aaa\n 0: aaa\n 1: a\n    aaaaaaaa    \n 0: aaaaaaaa\n 1: a\n\n/.*\\.gif/\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.{0,}\\.gif/\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.*\\.gif/m\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.*\\.gif/s\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\n\n/.*\\.gif/ms\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\n    \n/.*$/\n    borfle\\nbib.gif\\nno\n 0: no\n\n/.*$/m\n    borfle\\nbib.gif\\nno\n 0: borfle\n\n/.*$/s\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\\x0ano\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\\x0ano\n    \n/.*$/\n    borfle\\nbib.gif\\nno\\n\n 0: no\n\n/.*$/m\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\n\n/.*$/s\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\\x0abib.gif\\x0ano\\x0a\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\\x0abib.gif\\x0ano\\x0a\n    \n/(.*X|^B)/\n    abcde\\n1234Xyz\n 0: 1234X\n 1: 1234X\n    BarFoo \n 0: B\n 1: B\n    *** Failers\nNo match\n    abcde\\nBar  \nNo match\n\n/(.*X|^B)/m\n    abcde\\n1234Xyz\n 0: 1234X\n 1: 1234X\n    BarFoo \n 0: B\n 1: B\n    abcde\\nBar  \n 0: B\n 1: B\n\n/(.*X|^B)/s\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n 1: abcde\\x0a1234X\n    BarFoo \n 0: B\n 1: B\n    *** Failers\nNo match\n    abcde\\nBar  \nNo match\n\n/(.*X|^B)/ms\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n 1: abcde\\x0a1234X\n    BarFoo \n 0: B\n 1: B\n    abcde\\nBar  \n 0: B\n 1: B\n\n/(?s)(.*X|^B)/\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n 1: abcde\\x0a1234X\n    BarFoo \n 0: B\n 1: B\n    *** Failers \nNo match\n    abcde\\nBar  \nNo match\n\n/(?s:.*X|^B)/\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n    BarFoo \n 0: B\n    *** Failers \nNo match\n    abcde\\nBar  \nNo match\n\n/^.*B/\n    **** Failers\nNo match\n    abc\\nB\nNo match\n     \n/(?s)^.*B/\n    abc\\nB\n 0: abc\\x0aB\n\n/(?m)^.*B/\n    abc\\nB\n 0: B\n     \n/(?ms)^.*B/\n    abc\\nB\n 0: abc\\x0aB\n\n/(?ms)^B/\n    abc\\nB\n 0: B\n\n/(?s)B$/\n    B\\n\n 0: B\n\n/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n    123456654321\n 0: 123456654321\n  \n/^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/\n    123456654321 \n 0: 123456654321\n\n/^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/\n    123456654321\n 0: 123456654321\n  \n/^[abc]{12}/\n    abcabcabcabc\n 0: abcabcabcabc\n    \n/^[a-c]{12}/\n    abcabcabcabc\n 0: abcabcabcabc\n    \n/^(a|b|c){12}/\n    abcabcabcabc \n 0: abcabcabcabc\n 1: c\n\n/^[abcdefghijklmnopqrstuvwxy0123456789]/\n    n\n 0: n\n    *** Failers \nNo match\n    z \nNo match\n\n/abcde{0,0}/\n    abcd\n 0: abcd\n    *** Failers\nNo match\n    abce  \nNo match\n\n/ab[cd]{0,0}e/\n    abe\n 0: abe\n    *** Failers\nNo match\n    abcde \nNo match\n    \n/ab(c){0,0}d/\n    abd\n 0: abd\n    *** Failers\nNo match\n    abcd   \nNo match\n\n/a(b*)/\n    a\n 0: a\n 1: \n    ab\n 0: ab\n 1: b\n    abbbb\n 0: abbbb\n 1: bbbb\n    *** Failers\n 0: a\n 1: \n    bbbbb    \nNo match\n    \n/ab\\d{0}e/\n    abe\n 0: abe\n    *** Failers\nNo match\n    ab1e   \nNo match\n    \n/\"([^\\\\\"]+|\\\\.)*\"/\n    the \\\"quick\\\" brown fox\n 0: \"quick\"\n 1: quick\n    \\\"the \\\\\\\"quick\\\\\\\" brown fox\\\" \n 0: \"the \\\"quick\\\" brown fox\"\n 1:  brown fox\n\n/.*?/g+\n    abc\n 0: \n 0+ abc\n 0: a\n 0+ bc\n 0: \n 0+ bc\n 0: b\n 0+ c\n 0: \n 0+ c\n 0: c\n 0+ \n 0: \n 0+ \n  \n/\\b/g+\n    abc \n 0: \n 0+ abc\n 0: \n 0+ \n\n/\\b/+g\n    abc \n 0: \n 0+ abc\n 0: \n 0+ \n\n//g\n    abc\n 0: \n 0: \n 0: \n 0: \n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is\n  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n 1:  BGCOLOR='#DBE9E9'\n 2:  align=left valign=top\n 3: 43.\n 4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)\n 5: \n 6: \n 7: <unset>\n 8:  align=left valign=top\n 9: Lega lstaff.com\n10:  align=left valign=top\n11: CA - Statewide\n\n/a[^a]b/\n    acb\n 0: acb\n    a\\nb\n 0: a\\x0ab\n    \n/a.b/\n    acb\n 0: acb\n    *** Failers \nNo match\n    a\\nb   \nNo match\n    \n/a[^a]b/s\n    acb\n 0: acb\n    a\\nb  \n 0: a\\x0ab\n    \n/a.b/s\n    acb\n 0: acb\n    a\\nb  \n 0: a\\x0ab\n\n/^(b+?|a){1,2}?c/\n    bac\n 0: bac\n 1: a\n    bbac\n 0: bbac\n 1: a\n    bbbac\n 0: bbbac\n 1: a\n    bbbbac\n 0: bbbbac\n 1: a\n    bbbbbac \n 0: bbbbbac\n 1: a\n\n/^(b+|a){1,2}?c/\n    bac\n 0: bac\n 1: a\n    bbac\n 0: bbac\n 1: a\n    bbbac\n 0: bbbac\n 1: a\n    bbbbac\n 0: bbbbac\n 1: a\n    bbbbbac \n 0: bbbbbac\n 1: a\n    \n/(?!\\A)x/m\n    x\\nb\\n\nNo match\n    a\\bx\\n  \n 0: x\n    \n/\\x0{ab}/\n    \\0{ab} \n 0: \\x00{ab}\n\n/(A|B)*?CD/\n    CD \n 0: CD\n    \n/(A|B)*CD/\n    CD \n 0: CD\n\n/(AB)*?\\1/\n    ABABAB\n 0: ABAB\n 1: AB\n\n/(AB)*\\1/\n    ABABAB\n 0: ABABAB\n 1: AB\n    \n/(?<!bar)foo/\n    foo\n 0: foo\n    catfood\n 0: foo\n    arfootle\n 0: foo\n    rfoosh\n 0: foo\n    *** Failers\nNo match\n    barfoo\nNo match\n    towbarfoo\nNo match\n\n/\\w{3}(?<!bar)foo/\n    catfood\n 0: catfoo\n    *** Failers\nNo match\n    foo\nNo match\n    barfoo\nNo match\n    towbarfoo\nNo match\n\n/(?<=(foo)a)bar/\n    fooabar\n 0: bar\n 1: foo\n    *** Failers\nNo match\n    bar\nNo match\n    foobbar\nNo match\n      \n/\\Aabc\\z/m\n    abc\n 0: abc\n    *** Failers\nNo match\n    abc\\n   \nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\nNo match\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n\n/(?>(\\.\\d\\d[1-9]?))\\d+/\n    1.230003938\n 0: .230003938\n 1: .23\n    1.875000282\n 0: .875000282\n 1: .875\n    *** Failers \nNo match\n    1.235 \nNo match\n\n/^((?>\\w+)|(?>\\s+))*$/\n    now is the time for all good men to come to the aid of the party\n 0: now is the time for all good men to come to the aid of the party\n 1: party\n    *** Failers\nNo match\n    this is not a line with only words and spaces!\nNo match\n    \n/(\\d+)(\\w)/\n    12345a\n 0: 12345a\n 1: 12345\n 2: a\n    12345+ \n 0: 12345\n 1: 1234\n 2: 5\n\n/((?>\\d+))(\\w)/\n    12345a\n 0: 12345a\n 1: 12345\n 2: a\n    *** Failers\nNo match\n    12345+ \nNo match\n\n/(?>a+)b/\n    aaab\n 0: aaab\n\n/((?>a+)b)/\n    aaab\n 0: aaab\n 1: aaab\n\n/(?>(a+))b/\n    aaab\n 0: aaab\n 1: aaa\n\n/(?>b)+/\n    aaabbbccc\n 0: bbb\n\n/(?>a+|b+|c+)*c/\n    aaabbbbccccd\n 0: aaabbbbc\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: x\n    \n/\\(((?>[^()]+)|\\([^()]+\\))+\\)/ \n    (abc)\n 0: (abc)\n 1: abc\n    (abc(def)xyz)\n 0: (abc(def)xyz)\n 1: xyz\n    *** Failers\nNo match\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   \nNo match\n\n/a(?-i)b/i\n    ab\n 0: ab\n    Ab\n 0: Ab\n    *** Failers \nNo match\n    aB\nNo match\n    AB\nNo match\n        \n/(a (?x)b c)d e/\n    a bcd e\n 0: a bcd e\n 1: a bc\n    *** Failers\nNo match\n    a b cd e\nNo match\n    abcd e   \nNo match\n    a bcde \nNo match\n \n/(a b(?x)c d (?-x)e f)/\n    a bcde f\n 0: a bcde f\n 1: a bcde f\n    *** Failers\nNo match\n    abcdef  \nNo match\n\n/(a(?i)b)c/\n    abc\n 0: abc\n 1: ab\n    aBc\n 0: aBc\n 1: aB\n    *** Failers\nNo match\n    abC\nNo match\n    aBC  \nNo match\n    Abc\nNo match\n    ABc\nNo match\n    ABC\nNo match\n    AbC\nNo match\n    \n/a(?i:b)c/\n    abc\n 0: abc\n    aBc\n 0: aBc\n    *** Failers \nNo match\n    ABC\nNo match\n    abC\nNo match\n    aBC\nNo match\n    \n/a(?i:b)*c/\n    aBc\n 0: aBc\n    aBBc\n 0: aBBc\n    *** Failers \nNo match\n    aBC\nNo match\n    aBBC\nNo match\n    \n/a(?=b(?i)c)\\w\\wd/\n    abcd\n 0: abcd\n    abCd\n 0: abCd\n    *** Failers\nNo match\n    aBCd\nNo match\n    abcD     \nNo match\n    \n/(?s-i:more.*than).*million/i\n    more than million\n 0: more than million\n    more than MILLION\n 0: more than MILLION\n    more \\n than Million \n 0: more \\x0a than Million\n    *** Failers\nNo match\n    MORE THAN MILLION    \nNo match\n    more \\n than \\n million \nNo match\n\n/(?:(?s-i)more.*than).*million/i\n    more than million\n 0: more than million\n    more than MILLION\n 0: more than MILLION\n    more \\n than Million \n 0: more \\x0a than Million\n    *** Failers\nNo match\n    MORE THAN MILLION    \nNo match\n    more \\n than \\n million \nNo match\n    \n/(?>a(?i)b+)+c/ \n    abc\n 0: abc\n    aBbc\n 0: aBbc\n    aBBc \n 0: aBBc\n    *** Failers\nNo match\n    Abc\nNo match\n    abAb    \nNo match\n    abbC \nNo match\n    \n/(?=a(?i)b)\\w\\wc/\n    abc\n 0: abc\n    aBc\n 0: aBc\n    *** Failers\nNo match\n    Ab \nNo match\n    abC\nNo match\n    aBC     \nNo match\n    \n/(?<=a(?i)b)(\\w\\w)c/\n    abxxc\n 0: xxc\n 1: xx\n    aBxxc\n 0: xxc\n 1: xx\n    *** Failers\nNo match\n    Abxxc\nNo match\n    ABxxc\nNo match\n    abxxC      \nNo match\n\n/(?:(a)|b)(?(1)A|B)/\n    aA\n 0: aA\n 1: a\n    bB\n 0: bB\n    *** Failers\nNo match\n    aB\nNo match\n    bA    \nNo match\n\n/^(a)?(?(1)a|b)+$/\n    aa\n 0: aa\n 1: a\n    b\n 0: b\n    bb  \n 0: bb\n    *** Failers\nNo match\n    ab   \nNo match\n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/\n    abc:\n 0: abc:\n    12\n 0: 12\n    *** Failers\nNo match\n    123\nNo match\n    xyz    \nNo match\n\n/^(?(?!abc)\\d\\d|\\w{3}:)$/\n    abc:\n 0: abc:\n    12\n 0: 12\n    *** Failers\nNo match\n    123\nNo match\n    xyz    \nNo match\n    \n/(?(?<=foo)bar|cat)/\n    foobar\n 0: bar\n    cat\n 0: cat\n    fcat\n 0: cat\n    focat   \n 0: cat\n    *** Failers\nNo match\n    foocat  \nNo match\n\n/(?(?<!foo)cat|bar)/\n    foobar\n 0: bar\n    cat\n 0: cat\n    fcat\n 0: cat\n    focat   \n 0: cat\n    *** Failers\nNo match\n    foocat  \nNo match\n\n/( \\( )? [^()]+ (?(1) \\) |) /x\n    abcd\n 0: abcd\n    (abcd)\n 0: (abcd)\n 1: (\n    the quick (abcd) fox\n 0: the quick \n    (abcd   \n 0: abcd\n\n/( \\( )? [^()]+ (?(1) \\) ) /x\n    abcd\n 0: abcd\n    (abcd)\n 0: (abcd)\n 1: (\n    the quick (abcd) fox\n 0: the quick \n    (abcd   \n 0: abcd\n\n/^(?(2)a|(1)(2))+$/\n    12\n 0: 12\n 1: 1\n 2: 2\n    12a\n 0: 12a\n 1: 1\n 2: 2\n    12aa\n 0: 12aa\n 1: 1\n 2: 2\n    *** Failers\nNo match\n    1234    \nNo match\n\n/((?i)blah)\\s+\\1/\n    blah blah\n 0: blah blah\n 1: blah\n    BLAH BLAH\n 0: BLAH BLAH\n 1: BLAH\n    Blah Blah\n 0: Blah Blah\n 1: Blah\n    blaH blaH\n 0: blaH blaH\n 1: blaH\n    *** Failers\nNo match\n    blah BLAH\nNo match\n    Blah blah      \nNo match\n    blaH blah \nNo match\n\n/((?i)blah)\\s+(?i:\\1)/\n    blah blah\n 0: blah blah\n 1: blah\n    BLAH BLAH\n 0: BLAH BLAH\n 1: BLAH\n    Blah Blah\n 0: Blah Blah\n 1: Blah\n    blaH blaH\n 0: blaH blaH\n 1: blaH\n    blah BLAH\n 0: blah BLAH\n 1: blah\n    Blah blah      \n 0: Blah blah\n 1: Blah\n    blaH blah \n 0: blaH blah\n 1: blaH\n\n/(?>a*)*/\n    a\n 0: a\n    aa\n 0: aa\n    aaaa\n 0: aaaa\n    \n/(abc|)+/\n    abc\n 0: abc\n 1: \n    abcabc\n 0: abcabc\n 1: \n    abcabcabc\n 0: abcabcabc\n 1: \n    xyz      \n 0: \n 1: \n\n/([a]*)*/\n    a\n 0: a\n 1: \n    aaaaa \n 0: aaaaa\n 1: \n \n/([ab]*)*/\n    a\n 0: a\n 1: \n    b\n 0: b\n 1: \n    ababab\n 0: ababab\n 1: \n    aaaabcde\n 0: aaaab\n 1: \n    bbbb    \n 0: bbbb\n 1: \n \n/([^a]*)*/\n    b\n 0: b\n 1: \n    bbbb\n 0: bbbb\n 1: \n    aaa   \n 0: \n 1: \n \n/([^ab]*)*/\n    cccc\n 0: cccc\n 1: \n    abab  \n 0: \n 1: \n \n/([a]*?)*/\n    a\n 0: \n 1: \n    aaaa \n 0: \n 1: \n \n/([ab]*?)*/\n    a\n 0: \n 1: \n    b\n 0: \n 1: \n    abab\n 0: \n 1: \n    baba   \n 0: \n 1: \n \n/([^a]*?)*/\n    b\n 0: \n 1: \n    bbbb\n 0: \n 1: \n    aaa   \n 0: \n 1: \n \n/([^ab]*?)*/\n    c\n 0: \n 1: \n    cccc\n 0: \n 1: \n    baba   \n 0: \n 1: \n \n/(?>a*)*/\n    a\n 0: a\n    aaabcde \n 0: aaa\n \n/((?>a*))*/\n    aaaaa\n 0: aaaaa\n 1: \n    aabbaa \n 0: aa\n 1: \n \n/((?>a*?))*/\n    aaaaa\n 0: \n 1: \n    aabbaa \n 0: \n 1: \n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /x\n    12-sep-98\n 0: 12-sep-98\n    12-09-98\n 0: 12-09-98\n    *** Failers\nNo match\n    sep-12-98\nNo match\n        \n/(?<=(foo))bar\\1/\n    foobarfoo\n 0: barfoo\n 1: foo\n    foobarfootling \n 0: barfoo\n 1: foo\n    *** Failers\nNo match\n    foobar\nNo match\n    barfoo   \nNo match\n\n/(?i:saturday|sunday)/\n    saturday\n 0: saturday\n    sunday\n 0: sunday\n    Saturday\n 0: Saturday\n    Sunday\n 0: Sunday\n    SATURDAY\n 0: SATURDAY\n    SUNDAY\n 0: SUNDAY\n    SunDay\n 0: SunDay\n    \n/(a(?i)bc|BB)x/\n    abcx\n 0: abcx\n 1: abc\n    aBCx\n 0: aBCx\n 1: aBC\n    bbx\n 0: bbx\n 1: bb\n    BBx\n 0: BBx\n 1: BB\n    *** Failers\nNo match\n    abcX\nNo match\n    aBCX\nNo match\n    bbX\nNo match\n    BBX               \nNo match\n\n/^([ab](?i)[cd]|[ef])/\n    ac\n 0: ac\n 1: ac\n    aC\n 0: aC\n 1: aC\n    bD\n 0: bD\n 1: bD\n    elephant\n 0: e\n 1: e\n    Europe \n 0: E\n 1: E\n    frog\n 0: f\n 1: f\n    France\n 0: F\n 1: F\n    *** Failers\nNo match\n    Africa     \nNo match\n\n/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/\n    ab\n 0: ab\n 1: ab\n    aBd\n 0: aBd\n 1: aBd\n    xy\n 0: xy\n 1: xy\n    xY\n 0: xY\n 1: xY\n    zebra\n 0: z\n 1: z\n    Zambesi\n 0: Z\n 1: Z\n    *** Failers\nNo match\n    aCD  \nNo match\n    XY  \nNo match\n\n/(?<=foo\\n)^bar/m\n    foo\\nbar\n 0: bar\n    *** Failers\nNo match\n    bar\nNo match\n    baz\\nbar   \nNo match\n\n/(?<=(?<!foo)bar)baz/\n    barbaz\n 0: baz\n    barbarbaz \n 0: baz\n    koobarbaz \n 0: baz\n    *** Failers\nNo match\n    baz\nNo match\n    foobarbaz \nNo match\n\n/The cases of aaaa and aaaaaa are missed out below because Perl does things/\n/differently. We know that odd, and maybe incorrect, things happen with/\nNo match\n/recursive references in Perl, as far as 5.11.3 - see some stuff in test #2./\nNo match\n\n/^(a\\1?){4}$/\n    a\nNo match\n    aa\nNo match\n    aaa\nNo match\n    aaaaa\n 0: aaaaa\n 1: a\n    aaaaaaa\n 0: aaaaaaa\n 1: a\n    aaaaaaaa\nNo match\n    aaaaaaaaa\nNo match\n    aaaaaaaaaa\n 0: aaaaaaaaaa\n 1: aaaa\n    aaaaaaaaaaa\nNo match\n    aaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaaaa               \nNo match\n\n/^(a\\1?)(a\\1?)(a\\2?)(a\\3?)$/\n    a\nNo match\n    aa\nNo match\n    aaa\nNo match\n    aaaa\n 0: aaaa\n 1: a\n 2: a\n 3: a\n 4: a\n    aaaaa\n 0: aaaaa\n 1: a\n 2: aa\n 3: a\n 4: a\n    aaaaaa\n 0: aaaaaa\n 1: a\n 2: aa\n 3: a\n 4: aa\n    aaaaaaa\n 0: aaaaaaa\n 1: a\n 2: aa\n 3: aaa\n 4: a\n    aaaaaaaa\nNo match\n    aaaaaaaaa\nNo match\n    aaaaaaaaaa\n 0: aaaaaaaaaa\n 1: a\n 2: aa\n 3: aaa\n 4: aaaa\n    aaaaaaaaaaa\nNo match\n    aaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaaa\nNo match\n    aaaaaaaaaaaaaaaa               \nNo match\n\n/The following tests are taken from the Perl 5.005 test suite; some of them/\n/are compatible with 5.004, but I'd rather not have to sort them out./\nNo match\n\n/abc/\n    abc\n 0: abc\n    xabcy\n 0: abc\n    ababc\n 0: abc\n    *** Failers\nNo match\n    xbc\nNo match\n    axc\nNo match\n    abx\nNo match\n\n/ab*c/\n    abc\n 0: abc\n\n/ab*bc/\n    abc\n 0: abc\n    abbc\n 0: abbc\n    abbbbc\n 0: abbbbc\n\n/.{1}/\n    abbbbc\n 0: a\n\n/.{3,4}/\n    abbbbc\n 0: abbb\n\n/ab{0,}bc/\n    abbbbc\n 0: abbbbc\n\n/ab+bc/\n    abbc\n 0: abbc\n    *** Failers\nNo match\n    abc\nNo match\n    abq\nNo match\n\n/ab{1,}bc/\n\n/ab+bc/\n    abbbbc\n 0: abbbbc\n\n/ab{1,}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{1,3}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{3,4}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{4,5}bc/\n    *** Failers\nNo match\n    abq\nNo match\n    abbbbc\nNo match\n\n/ab?bc/\n    abbc\n 0: abbc\n    abc\n 0: abc\n\n/ab{0,1}bc/\n    abc\n 0: abc\n\n/ab?bc/\n\n/ab?c/\n    abc\n 0: abc\n\n/ab{0,1}c/\n    abc\n 0: abc\n\n/^abc$/\n    abc\n 0: abc\n    *** Failers\nNo match\n    abbbbc\nNo match\n    abcc\nNo match\n\n/^abc/\n    abcc\n 0: abc\n\n/^abc$/\n\n/abc$/\n    aabc\n 0: abc\n    *** Failers\nNo match\n    aabc\n 0: abc\n    aabcd\nNo match\n\n/^/\n    abc\n 0: \n\n/$/\n    abc\n 0: \n\n/a.c/\n    abc\n 0: abc\n    axc\n 0: axc\n\n/a.*c/\n    axyzc\n 0: axyzc\n\n/a[bc]d/\n    abd\n 0: abd\n    *** Failers\nNo match\n    axyzd\nNo match\n    abc\nNo match\n\n/a[b-d]e/\n    ace\n 0: ace\n\n/a[b-d]/\n    aac\n 0: ac\n\n/a[-b]/\n    a-\n 0: a-\n\n/a[b-]/\n    a-\n 0: a-\n\n/a]/\n    a]\n 0: a]\n\n/a[]]b/\n    a]b\n 0: a]b\n\n/a[^bc]d/\n    aed\n 0: aed\n    *** Failers\nNo match\n    abd\nNo match\n    abd\nNo match\n\n/a[^-b]c/\n    adc\n 0: adc\n\n/a[^]b]c/\n    adc\n 0: adc\n    *** Failers\nNo match\n    a-c\n 0: a-c\n    a]c\nNo match\n\n/\\ba\\b/\n    a-\n 0: a\n    -a\n 0: a\n    -a-\n 0: a\n\n/\\by\\b/\n    *** Failers\nNo match\n    xy\nNo match\n    yz\nNo match\n    xyz\nNo match\n\n/\\Ba\\B/\n    *** Failers\n 0: a\n    a-\nNo match\n    -a\nNo match\n    -a-\nNo match\n\n/\\By\\b/\n    xy\n 0: y\n\n/\\by\\B/\n    yz\n 0: y\n\n/\\By\\B/\n    xyz\n 0: y\n\n/\\w/\n    a\n 0: a\n\n/\\W/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    a\nNo match\n\n/a\\sb/\n    a b\n 0: a b\n\n/a\\Sb/\n    a-b\n 0: a-b\n    *** Failers\nNo match\n    a-b\n 0: a-b\n    a b\nNo match\n\n/\\d/\n    1\n 0: 1\n\n/\\D/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    1\nNo match\n\n/[\\w]/\n    a\n 0: a\n\n/[\\W]/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    a\nNo match\n\n/a[\\s]b/\n    a b\n 0: a b\n\n/a[\\S]b/\n    a-b\n 0: a-b\n    *** Failers\nNo match\n    a-b\n 0: a-b\n    a b\nNo match\n\n/[\\d]/\n    1\n 0: 1\n\n/[\\D]/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    1\nNo match\n\n/ab|cd/\n    abc\n 0: ab\n    abcd\n 0: ab\n\n/()ef/\n    def\n 0: ef\n 1: \n\n/$b/\n\n/a\\(b/\n    a(b\n 0: a(b\n\n/a\\(*b/\n    ab\n 0: ab\n    a((b\n 0: a((b\n\n/a\\\\b/\n    a\\b\nNo match\n\n/((a))/\n    abc\n 0: a\n 1: a\n 2: a\n\n/(a)b(c)/\n    abc\n 0: abc\n 1: a\n 2: c\n\n/a+b+c/\n    aabbabc\n 0: abc\n\n/a{1,}b{1,}c/\n    aabbabc\n 0: abc\n\n/a.+?c/\n    abcabc\n 0: abc\n\n/(a+|b)*/\n    ab\n 0: ab\n 1: b\n\n/(a+|b){0,}/\n    ab\n 0: ab\n 1: b\n\n/(a+|b)+/\n    ab\n 0: ab\n 1: b\n\n/(a+|b){1,}/\n    ab\n 0: ab\n 1: b\n\n/(a+|b)?/\n    ab\n 0: a\n 1: a\n\n/(a+|b){0,1}/\n    ab\n 0: a\n 1: a\n\n/[^ab]*/\n    cde\n 0: cde\n\n/abc/\n    *** Failers\nNo match\n    b\nNo match\n    \n\n/a*/\n    \n\n/([abc])*d/\n    abbbcd\n 0: abbbcd\n 1: c\n\n/([abc])*bcd/\n    abcd\n 0: abcd\n 1: a\n\n/a|b|c|d|e/\n    e\n 0: e\n\n/(a|b|c|d|e)f/\n    ef\n 0: ef\n 1: e\n\n/abcd*efg/\n    abcdefg\n 0: abcdefg\n\n/ab*/\n    xabyabbbz\n 0: ab\n    xayabbbz\n 0: a\n\n/(ab|cd)e/\n    abcde\n 0: cde\n 1: cd\n\n/[abhgefdc]ij/\n    hij\n 0: hij\n\n/^(ab|cd)e/\n\n/(abc|)ef/\n    abcdef\n 0: ef\n 1: \n\n/(a|b)c*d/\n    abcd\n 0: bcd\n 1: b\n\n/(ab|ab*)bc/\n    abc\n 0: abc\n 1: a\n\n/a([bc]*)c*/\n    abc\n 0: abc\n 1: bc\n\n/a([bc]*)(c*d)/\n    abcd\n 0: abcd\n 1: bc\n 2: d\n\n/a([bc]+)(c*d)/\n    abcd\n 0: abcd\n 1: bc\n 2: d\n\n/a([bc]*)(c+d)/\n    abcd\n 0: abcd\n 1: b\n 2: cd\n\n/a[bcd]*dcdcde/\n    adcdcde\n 0: adcdcde\n\n/a[bcd]+dcdcde/\n    *** Failers\nNo match\n    abcde\nNo match\n    adcdcde\nNo match\n\n/(ab|a)b*c/\n    abc\n 0: abc\n 1: ab\n\n/((a)(b)c)(d)/\n    abcd\n 0: abcd\n 1: abc\n 2: a\n 3: b\n 4: d\n\n/[a-zA-Z_][a-zA-Z0-9_]*/\n    alpha\n 0: alpha\n\n/^a(bc+|b[eh])g|.h$/\n    abh\n 0: bh\n\n/(bc+d$|ef*g.|h?i(j|k))/\n    effgz\n 0: effgz\n 1: effgz\n    ij\n 0: ij\n 1: ij\n 2: j\n    reffgz\n 0: effgz\n 1: effgz\n    *** Failers\nNo match\n    effg\nNo match\n    bcdd\nNo match\n\n/((((((((((a))))))))))/\n    a\n 0: a\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n10: a\n\n/((((((((((a))))))))))\\10/\n    aa\n 0: aa\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n10: a\n\n/(((((((((a)))))))))/\n    a\n 0: a\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n\n/multiple words of text/\n    *** Failers\nNo match\n    aa\nNo match\n    uh-uh\nNo match\n\n/multiple words/\n    multiple words, yeah\n 0: multiple words\n\n/(.*)c(.*)/\n    abcde\n 0: abcde\n 1: ab\n 2: de\n\n/\\((.*), (.*)\\)/\n    (a, b)\n 0: (a, b)\n 1: a\n 2: b\n\n/[k]/\n\n/abcd/\n    abcd\n 0: abcd\n\n/a(bc)d/\n    abcd\n 0: abcd\n 1: bc\n\n/a[-]?c/\n    ac\n 0: ac\n\n/(abc)\\1/\n    abcabc\n 0: abcabc\n 1: abc\n\n/([a-c]*)\\1/\n    abcabc\n 0: abcabc\n 1: abc\n\n/(a)|\\1/\n    a\n 0: a\n 1: a\n    *** Failers\n 0: a\n 1: a\n    ab\n 0: a\n 1: a\n    x\nNo match\n\n/(([a-c])b*?\\2)*/\n    ababbbcbc\n 0: ababb\n 1: bb\n 2: b\n\n/(([a-c])b*?\\2){3}/\n    ababbbcbc\n 0: ababbbcbc\n 1: cbc\n 2: c\n\n/((\\3|b)\\2(a)x)+/\n    aaaxabaxbaaxbbax\n 0: bbax\n 1: bbax\n 2: b\n 3: a\n\n/((\\3|b)\\2(a)){2,}/\n    bbaababbabaaaaabbaaaabba\n 0: bbaaaabba\n 1: bba\n 2: b\n 3: a\n\n/abc/i\n    ABC\n 0: ABC\n    XABCY\n 0: ABC\n    ABABC\n 0: ABC\n    *** Failers\nNo match\n    aaxabxbaxbbx\nNo match\n    XBC\nNo match\n    AXC\nNo match\n    ABX\nNo match\n\n/ab*c/i\n    ABC\n 0: ABC\n\n/ab*bc/i\n    ABC\n 0: ABC\n    ABBC\n 0: ABBC\n\n/ab*?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{0,}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab+?bc/i\n    ABBC\n 0: ABBC\n\n/ab+bc/i\n    *** Failers\nNo match\n    ABC\nNo match\n    ABQ\nNo match\n\n/ab{1,}bc/i\n\n/ab+bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{1,}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{1,3}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{3,4}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{4,5}?bc/i\n    *** Failers\nNo match\n    ABQ\nNo match\n    ABBBBC\nNo match\n\n/ab??bc/i\n    ABBC\n 0: ABBC\n    ABC\n 0: ABC\n\n/ab{0,1}?bc/i\n    ABC\n 0: ABC\n\n/ab??bc/i\n\n/ab??c/i\n    ABC\n 0: ABC\n\n/ab{0,1}?c/i\n    ABC\n 0: ABC\n\n/^abc$/i\n    ABC\n 0: ABC\n    *** Failers\nNo match\n    ABBBBC\nNo match\n    ABCC\nNo match\n\n/^abc/i\n    ABCC\n 0: ABC\n\n/^abc$/i\n\n/abc$/i\n    AABC\n 0: ABC\n\n/^/i\n    ABC\n 0: \n\n/$/i\n    ABC\n 0: \n\n/a.c/i\n    ABC\n 0: ABC\n    AXC\n 0: AXC\n\n/a.*?c/i\n    AXYZC\n 0: AXYZC\n\n/a.*c/i\n    *** Failers\nNo match\n    AABC\n 0: AABC\n    AXYZD\nNo match\n\n/a[bc]d/i\n    ABD\n 0: ABD\n\n/a[b-d]e/i\n    ACE\n 0: ACE\n    *** Failers\nNo match\n    ABC\nNo match\n    ABD\nNo match\n\n/a[b-d]/i\n    AAC\n 0: AC\n\n/a[-b]/i\n    A-\n 0: A-\n\n/a[b-]/i\n    A-\n 0: A-\n\n/a]/i\n    A]\n 0: A]\n\n/a[]]b/i\n    A]B\n 0: A]B\n\n/a[^bc]d/i\n    AED\n 0: AED\n\n/a[^-b]c/i\n    ADC\n 0: ADC\n    *** Failers\nNo match\n    ABD\nNo match\n    A-C\nNo match\n\n/a[^]b]c/i\n    ADC\n 0: ADC\n\n/ab|cd/i\n    ABC\n 0: AB\n    ABCD\n 0: AB\n\n/()ef/i\n    DEF\n 0: EF\n 1: \n\n/$b/i\n    *** Failers\nNo match\n    A]C\nNo match\n    B\nNo match\n\n/a\\(b/i\n    A(B\n 0: A(B\n\n/a\\(*b/i\n    AB\n 0: AB\n    A((B\n 0: A((B\n\n/a\\\\b/i\n    A\\B\nNo match\n\n/((a))/i\n    ABC\n 0: A\n 1: A\n 2: A\n\n/(a)b(c)/i\n    ABC\n 0: ABC\n 1: A\n 2: C\n\n/a+b+c/i\n    AABBABC\n 0: ABC\n\n/a{1,}b{1,}c/i\n    AABBABC\n 0: ABC\n\n/a.+?c/i\n    ABCABC\n 0: ABC\n\n/a.*?c/i\n    ABCABC\n 0: ABC\n\n/a.{0,5}?c/i\n    ABCABC\n 0: ABC\n\n/(a+|b)*/i\n    AB\n 0: AB\n 1: B\n\n/(a+|b){0,}/i\n    AB\n 0: AB\n 1: B\n\n/(a+|b)+/i\n    AB\n 0: AB\n 1: B\n\n/(a+|b){1,}/i\n    AB\n 0: AB\n 1: B\n\n/(a+|b)?/i\n    AB\n 0: A\n 1: A\n\n/(a+|b){0,1}/i\n    AB\n 0: A\n 1: A\n\n/(a+|b){0,1}?/i\n    AB\n 0: \n\n/[^ab]*/i\n    CDE\n 0: CDE\n\n/abc/i\n\n/a*/i\n    \n\n/([abc])*d/i\n    ABBBCD\n 0: ABBBCD\n 1: C\n\n/([abc])*bcd/i\n    ABCD\n 0: ABCD\n 1: A\n\n/a|b|c|d|e/i\n    E\n 0: E\n\n/(a|b|c|d|e)f/i\n    EF\n 0: EF\n 1: E\n\n/abcd*efg/i\n    ABCDEFG\n 0: ABCDEFG\n\n/ab*/i\n    XABYABBBZ\n 0: AB\n    XAYABBBZ\n 0: A\n\n/(ab|cd)e/i\n    ABCDE\n 0: CDE\n 1: CD\n\n/[abhgefdc]ij/i\n    HIJ\n 0: HIJ\n\n/^(ab|cd)e/i\n    ABCDE\nNo match\n\n/(abc|)ef/i\n    ABCDEF\n 0: EF\n 1: \n\n/(a|b)c*d/i\n    ABCD\n 0: BCD\n 1: B\n\n/(ab|ab*)bc/i\n    ABC\n 0: ABC\n 1: A\n\n/a([bc]*)c*/i\n    ABC\n 0: ABC\n 1: BC\n\n/a([bc]*)(c*d)/i\n    ABCD\n 0: ABCD\n 1: BC\n 2: D\n\n/a([bc]+)(c*d)/i\n    ABCD\n 0: ABCD\n 1: BC\n 2: D\n\n/a([bc]*)(c+d)/i\n    ABCD\n 0: ABCD\n 1: B\n 2: CD\n\n/a[bcd]*dcdcde/i\n    ADCDCDE\n 0: ADCDCDE\n\n/a[bcd]+dcdcde/i\n\n/(ab|a)b*c/i\n    ABC\n 0: ABC\n 1: AB\n\n/((a)(b)c)(d)/i\n    ABCD\n 0: ABCD\n 1: ABC\n 2: A\n 3: B\n 4: D\n\n/[a-zA-Z_][a-zA-Z0-9_]*/i\n    ALPHA\n 0: ALPHA\n\n/^a(bc+|b[eh])g|.h$/i\n    ABH\n 0: BH\n\n/(bc+d$|ef*g.|h?i(j|k))/i\n    EFFGZ\n 0: EFFGZ\n 1: EFFGZ\n    IJ\n 0: IJ\n 1: IJ\n 2: J\n    REFFGZ\n 0: EFFGZ\n 1: EFFGZ\n    *** Failers\nNo match\n    ADCDCDE\nNo match\n    EFFG\nNo match\n    BCDD\nNo match\n\n/((((((((((a))))))))))/i\n    A\n 0: A\n 1: A\n 2: A\n 3: A\n 4: A\n 5: A\n 6: A\n 7: A\n 8: A\n 9: A\n10: A\n\n/((((((((((a))))))))))\\10/i\n    AA\n 0: AA\n 1: A\n 2: A\n 3: A\n 4: A\n 5: A\n 6: A\n 7: A\n 8: A\n 9: A\n10: A\n\n/(((((((((a)))))))))/i\n    A\n 0: A\n 1: A\n 2: A\n 3: A\n 4: A\n 5: A\n 6: A\n 7: A\n 8: A\n 9: A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i\n    A\n 0: A\n 1: A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i\n    C\n 0: C\n 1: C\n\n/multiple words of text/i\n    *** Failers\nNo match\n    AA\nNo match\n    UH-UH\nNo match\n\n/multiple words/i\n    MULTIPLE WORDS, YEAH\n 0: MULTIPLE WORDS\n\n/(.*)c(.*)/i\n    ABCDE\n 0: ABCDE\n 1: AB\n 2: DE\n\n/\\((.*), (.*)\\)/i\n    (A, B)\n 0: (A, B)\n 1: A\n 2: B\n\n/[k]/i\n\n/abcd/i\n    ABCD\n 0: ABCD\n\n/a(bc)d/i\n    ABCD\n 0: ABCD\n 1: BC\n\n/a[-]?c/i\n    AC\n 0: AC\n\n/(abc)\\1/i\n    ABCABC\n 0: ABCABC\n 1: ABC\n\n/([a-c]*)\\1/i\n    ABCABC\n 0: ABCABC\n 1: ABC\n\n/a(?!b)./\n    abad\n 0: ad\n\n/a(?=d)./\n    abad\n 0: ad\n\n/a(?=c|d)./\n    abad\n 0: ad\n\n/a(?:b|c|d)(.)/\n    ace\n 0: ace\n 1: e\n\n/a(?:b|c|d)*(.)/\n    ace\n 0: ace\n 1: e\n\n/a(?:b|c|d)+?(.)/\n    ace\n 0: ace\n 1: e\n    acdbcdbe\n 0: acd\n 1: d\n\n/a(?:b|c|d)+(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: e\n\n/a(?:b|c|d){2}(.)/\n    acdbcdbe\n 0: acdb\n 1: b\n\n/a(?:b|c|d){4,5}(.)/\n    acdbcdbe\n 0: acdbcdb\n 1: b\n\n/a(?:b|c|d){4,5}?(.)/\n    acdbcdbe\n 0: acdbcd\n 1: d\n\n/((foo)|(bar))*/\n    foobar\n 0: foobar\n 1: bar\n 2: foo\n 3: bar\n\n/a(?:b|c|d){6,7}(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: e\n\n/a(?:b|c|d){6,7}?(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: e\n\n/a(?:b|c|d){5,6}(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: e\n\n/a(?:b|c|d){5,6}?(.)/\n    acdbcdbe\n 0: acdbcdb\n 1: b\n\n/a(?:b|c|d){5,7}(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: e\n\n/a(?:b|c|d){5,7}?(.)/\n    acdbcdbe\n 0: acdbcdb\n 1: b\n\n/a(?:b|(c|e){1,2}?|d)+?(.)/\n    ace\n 0: ace\n 1: c\n 2: e\n\n/^(.+)?B/\n    AB\n 0: AB\n 1: A\n\n/^([^a-z])|(\\^)$/\n    .\n 0: .\n 1: .\n\n/^[<>]&/\n    <&OUT\n 0: <&\n\n/^(a\\1?){4}$/\n    aaaaaaaaaa\n 0: aaaaaaaaaa\n 1: aaaa\n    *** Failers\nNo match\n    AB\nNo match\n    aaaaaaaaa\nNo match\n    aaaaaaaaaaa\nNo match\n\n/^(a(?(1)\\1)){4}$/\n    aaaaaaaaaa\n 0: aaaaaaaaaa\n 1: aaaa\n    *** Failers\nNo match\n    aaaaaaaaa\nNo match\n    aaaaaaaaaaa\nNo match\n\n/(?:(f)(o)(o)|(b)(a)(r))*/\n    foobar\n 0: foobar\n 1: f\n 2: o\n 3: o\n 4: b\n 5: a\n 6: r\n\n/(?<=a)b/\n    ab\n 0: b\n    *** Failers\nNo match\n    cb\nNo match\n    b\nNo match\n\n/(?<!c)b/\n    ab\n 0: b\n    b\n 0: b\n    b\n 0: b\n\n/(?:..)*a/\n    aba\n 0: aba\n\n/(?:..)*?a/\n    aba\n 0: a\n\n/^(?:b|a(?=(.)))*\\1/\n    abc\n 0: ab\n 1: b\n\n/^(){3,5}/\n    abc\n 0: \n 1: \n\n/^(a+)*ax/\n    aax\n 0: aax\n 1: a\n\n/^((a|b)+)*ax/\n    aax\n 0: aax\n 1: a\n 2: a\n\n/^((a|bc)+)*ax/\n    aax\n 0: aax\n 1: a\n 2: a\n\n/(a|x)*ab/\n    cab\n 0: ab\n\n/(a)*ab/\n    cab\n 0: ab\n\n/(?:(?i)a)b/\n    ab\n 0: ab\n\n/((?i)a)b/\n    ab\n 0: ab\n 1: a\n\n/(?:(?i)a)b/\n    Ab\n 0: Ab\n\n/((?i)a)b/\n    Ab\n 0: Ab\n 1: A\n\n/(?:(?i)a)b/\n    *** Failers\nNo match\n    cb\nNo match\n    aB\nNo match\n\n/((?i)a)b/\n\n/(?i:a)b/\n    ab\n 0: ab\n\n/((?i:a))b/\n    ab\n 0: ab\n 1: a\n\n/(?i:a)b/\n    Ab\n 0: Ab\n\n/((?i:a))b/\n    Ab\n 0: Ab\n 1: A\n\n/(?i:a)b/\n    *** Failers\nNo match\n    aB\nNo match\n    aB\nNo match\n\n/((?i:a))b/\n\n/(?:(?-i)a)b/i\n    ab\n 0: ab\n\n/((?-i)a)b/i\n    ab\n 0: ab\n 1: a\n\n/(?:(?-i)a)b/i\n    aB\n 0: aB\n\n/((?-i)a)b/i\n    aB\n 0: aB\n 1: a\n\n/(?:(?-i)a)b/i\n    *** Failers\nNo match\n    aB\n 0: aB\n    Ab\nNo match\n\n/((?-i)a)b/i\n\n/(?:(?-i)a)b/i\n    aB\n 0: aB\n\n/((?-i)a)b/i\n    aB\n 0: aB\n 1: a\n\n/(?:(?-i)a)b/i\n    *** Failers\nNo match\n    Ab\nNo match\n    AB\nNo match\n\n/((?-i)a)b/i\n\n/(?-i:a)b/i\n    ab\n 0: ab\n\n/((?-i:a))b/i\n    ab\n 0: ab\n 1: a\n\n/(?-i:a)b/i\n    aB\n 0: aB\n\n/((?-i:a))b/i\n    aB\n 0: aB\n 1: a\n\n/(?-i:a)b/i\n    *** Failers\nNo match\n    AB\nNo match\n    Ab\nNo match\n\n/((?-i:a))b/i\n\n/(?-i:a)b/i\n    aB\n 0: aB\n\n/((?-i:a))b/i\n    aB\n 0: aB\n 1: a\n\n/(?-i:a)b/i\n    *** Failers\nNo match\n    Ab\nNo match\n    AB\nNo match\n\n/((?-i:a))b/i\n\n/((?-i:a.))b/i\n    *** Failers\nNo match\n    AB\nNo match\n    a\\nB\nNo match\n\n/((?s-i:a.))b/i\n    a\\nB\n 0: a\\x0aB\n 1: a\\x0a\n\n/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/\n    cabbbb\n 0: cabbbb\n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/\n    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n\n/(ab)\\d\\1/i\n    Ab4ab\n 0: Ab4ab\n 1: Ab\n    ab4Ab\n 0: ab4Ab\n 1: ab\n\n/foo\\w*\\d{4}baz/\n    foobar1234baz\n 0: foobar1234baz\n\n/x(~~)*(?:(?:F)?)?/\n    x~~\n 0: x~~\n 1: ~~\n\n/^a(?#xxx){3}c/\n    aaac\n 0: aaac\n\n/^a (?#xxx) (?#yyy) {3}c/x\n    aaac\n 0: aaac\n\n/(?<![cd])b/\n    *** Failers\nNo match\n    B\\nB\nNo match\n    dbcb\nNo match\n\n/(?<![cd])[ab]/\n    dbaacb\n 0: a\n\n/(?<!(c|d))b/\n\n/(?<!(c|d))[ab]/\n    dbaacb\n 0: a\n\n/(?<!cd)[ab]/\n    cdaccb\n 0: b\n\n/^(?:a?b?)*$/\n    \\\n 0: \n    a\n 0: a\n    ab\n 0: ab\n    aaa   \n 0: aaa\n    *** Failers\nNo match\n    dbcb\nNo match\n    a--\nNo match\n    aa-- \nNo match\n\n/((?s)^a(.))((?m)^b$)/\n    a\\nb\\nc\\n\n 0: a\\x0ab\n 1: a\\x0a\n 2: \\x0a\n 3: b\n\n/((?m)^b$)/\n    a\\nb\\nc\\n\n 0: b\n 1: b\n\n/(?m)^b/\n    a\\nb\\n\n 0: b\n\n/(?m)^(b)/\n    a\\nb\\n\n 0: b\n 1: b\n\n/((?m)^b)/\n    a\\nb\\n\n 0: b\n 1: b\n\n/\\n((?m)^b)/\n    a\\nb\\n\n 0: \\x0ab\n 1: b\n\n/((?s).)c(?!.)/\n    a\\nb\\nc\\n\n 0: \\x0ac\n 1: \\x0a\n    a\\nb\\nc\\n\n 0: \\x0ac\n 1: \\x0a\n\n/((?s)b.)c(?!.)/\n    a\\nb\\nc\\n\n 0: b\\x0ac\n 1: b\\x0a\n    a\\nb\\nc\\n\n 0: b\\x0ac\n 1: b\\x0a\n\n/^b/\n\n/()^b/\n    *** Failers\nNo match\n    a\\nb\\nc\\n\nNo match\n    a\\nb\\nc\\n\nNo match\n\n/((?m)^b)/\n    a\\nb\\nc\\n\n 0: b\n 1: b\n\n/(x)?(?(1)a|b)/\n    *** Failers\nNo match\n    a\nNo match\n    a\nNo match\n\n/(x)?(?(1)b|a)/\n    a\n 0: a\n\n/()?(?(1)b|a)/\n    a\n 0: a\n\n/()(?(1)b|a)/\n\n/()?(?(1)a|b)/\n    a\n 0: a\n 1: \n\n/^(\\()?blah(?(1)(\\)))$/\n    (blah)\n 0: (blah)\n 1: (\n 2: )\n    blah\n 0: blah\n    *** Failers\nNo match\n    a\nNo match\n    blah)\nNo match\n    (blah\nNo match\n\n/^(\\(+)?blah(?(1)(\\)))$/\n    (blah)\n 0: (blah)\n 1: (\n 2: )\n    blah\n 0: blah\n    *** Failers\nNo match\n    blah)\nNo match\n    (blah\nNo match\n\n/(?(?!a)a|b)/\n\n/(?(?!a)b|a)/\n    a\n 0: a\n\n/(?(?=a)b|a)/\n    *** Failers\nNo match\n    a\nNo match\n    a\nNo match\n\n/(?(?=a)a|b)/\n    a\n 0: a\n\n/(?=(a+?))(\\1ab)/\n    aaab\n 0: aab\n 1: a\n 2: aab\n\n/^(?=(a+?))\\1ab/\n\n/(\\w+:)+/\n    one:\n 0: one:\n 1: one:\n\n/$(?<=^(a))/\n    a\n 0: \n 1: a\n\n/(?=(a+?))(\\1ab)/\n    aaab\n 0: aab\n 1: a\n 2: aab\n\n/^(?=(a+?))\\1ab/\n    *** Failers\nNo match\n    aaab\nNo match\n    aaab\nNo match\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n 0: abcd\n 1: <unset>\n 2: abcd\n    xy:z:::abcd\n 0: xy:z:::abcd\n 1: xy:z:::\n 2: abcd\n\n/^[^bcd]*(c+)/\n    aexycd\n 0: aexyc\n 1: c\n\n/(a*)b+/\n    caab\n 0: aab\n 1: aa\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n 0: abcd\n 1: <unset>\n 2: abcd\n    xy:z:::abcd\n 0: xy:z:::abcd\n 1: xy:z:::\n 2: abcd\n    *** Failers\n 0: Failers\n 1: <unset>\n 2: Failers\n    abcd:\nNo match\n    abcd:\nNo match\n\n/^[^bcd]*(c+)/\n    aexycd\n 0: aexyc\n 1: c\n\n/(>a+)ab/\n\n/(?>a+)b/\n    aaab\n 0: aaab\n\n/([[:]+)/\n    a:[b]:\n 0: :[\n 1: :[\n\n/([[=]+)/\n    a=[b]=\n 0: =[\n 1: =[\n\n/([[.]+)/\n    a.[b].\n 0: .[\n 1: .[\n\n/((?>a+)b)/\n    aaab\n 0: aaab\n 1: aaab\n\n/(?>(a+))b/\n    aaab\n 0: aaab\n 1: aaa\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: x\n\n/a\\Z/\n    *** Failers\nNo match\n    aaab\nNo match\n    a\\nb\\n\nNo match\n\n/b\\Z/\n    a\\nb\\n\n 0: b\n\n/b\\z/\n\n/b\\Z/\n    a\\nb\n 0: b\n\n/b\\z/\n    a\\nb\n 0: b\n    *** Failers\nNo match\n    \n/^(?>(?(1)\\.|())[^\\W_](?>[a-z0-9-]*[^\\W_])?)+$/\n    a\n 0: a\n 1: \n    abc\n 0: abc\n 1: \n    a-b\n 0: a-b\n 1: \n    0-9 \n 0: 0-9\n 1: \n    a.b\n 0: a.b\n 1: \n    5.6.7  \n 0: 5.6.7\n 1: \n    the.quick.brown.fox\n 0: the.quick.brown.fox\n 1: \n    a100.b200.300c  \n 0: a100.b200.300c\n 1: \n    12-ab.1245 \n 0: 12-ab.1245\n 1: \n    *** Failers\nNo match\n    \\\nNo match\n    .a\nNo match\n    -a\nNo match\n    a-\nNo match\n    a.  \nNo match\n    a_b \nNo match\n    a.-\nNo match\n    a..  \nNo match\n    ab..bc \nNo match\n    the.quick.brown.fox-\nNo match\n    the.quick.brown.fox.\nNo match\n    the.quick.brown.fox_\nNo match\n    the.quick.brown.fox+       \nNo match\n\n/(?>.*)(?<=(abcd|wxyz))/\n    alphabetabcd\n 0: alphabetabcd\n 1: abcd\n    endingwxyz\n 0: endingwxyz\n 1: wxyz\n    *** Failers\nNo match\n    a rather long string that doesn't end with one of them\nNo match\n\n/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/\n    word cat dog elephant mussel cow horse canary baboon snake shark otherword\n 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword\n    word cat dog elephant mussel cow horse canary baboon snake shark\nNo match\n  \n/word (?>[a-zA-Z0-9]+ ){0,30}otherword/\n    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\nNo match\n\n/(?<=\\d{3}(?!999))foo/\n    999foo\n 0: foo\n    123999foo \n 0: foo\n    *** Failers\nNo match\n    123abcfoo\nNo match\n    \n/(?<=(?!...999)\\d{3})foo/\n    999foo\n 0: foo\n    123999foo \n 0: foo\n    *** Failers\nNo match\n    123abcfoo\nNo match\n\n/(?<=\\d{3}(?!999)...)foo/\n    123abcfoo\n 0: foo\n    123456foo \n 0: foo\n    *** Failers\nNo match\n    123999foo  \nNo match\n    \n/(?<=\\d{3}...)(?<!999)foo/\n    123abcfoo   \n 0: foo\n    123456foo \n 0: foo\n    *** Failers\nNo match\n    123999foo  \nNo match\n\n/<a[\\s]+href[\\s]*=[\\s]*          # find <a href=\n ([\\\"\\'])?                       # find single or double quote\n (?(1) (.*?)\\1 | ([^\\s]+))       # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n 0: <a href=abcd\n 1: <unset>\n 2: <unset>\n 3: abcd\n    <a href=\\\"abcd xyz pqr\\\" cats\n 0: <a href=\"abcd xyz pqr\"\n 1: \"\n 2: abcd xyz pqr\n    <a href=\\'abcd xyz pqr\\' cats\n 0: <a href='abcd xyz pqr'\n 1: '\n 2: abcd xyz pqr\n\n/<a\\s+href\\s*=\\s*                # find <a href=\n ([\"'])?                         # find single or double quote\n (?(1) (.*?)\\1 | (\\S+))          # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n 0: <a href=abcd\n 1: <unset>\n 2: <unset>\n 3: abcd\n    <a href=\\\"abcd xyz pqr\\\" cats\n 0: <a href=\"abcd xyz pqr\"\n 1: \"\n 2: abcd xyz pqr\n    <a href       =       \\'abcd xyz pqr\\' cats\n 0: <a href       =       'abcd xyz pqr'\n 1: '\n 2: abcd xyz pqr\n\n/<a\\s+href(?>\\s*)=(?>\\s*)        # find <a href=\n ([\"'])?                         # find single or double quote\n (?(1) (.*?)\\1 | (\\S+))          # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isx\n    <a href=abcd xyz\n 0: <a href=abcd\n 1: <unset>\n 2: <unset>\n 3: abcd\n    <a href=\\\"abcd xyz pqr\\\" cats\n 0: <a href=\"abcd xyz pqr\"\n 1: \"\n 2: abcd xyz pqr\n    <a href       =       \\'abcd xyz pqr\\' cats\n 0: <a href       =       'abcd xyz pqr'\n 1: '\n 2: abcd xyz pqr\n\n/((Z)+|A)*/\n    ZABCDEFG\n 0: ZA\n 1: A\n 2: Z\n\n/(Z()|A)*/\n    ZABCDEFG\n 0: ZA\n 1: A\n 2: \n\n/(Z(())|A)*/\n    ZABCDEFG\n 0: ZA\n 1: A\n 2: \n 3: \n\n/((?>Z)+|A)*/\n    ZABCDEFG\n 0: ZA\n 1: A\n\n/((?>)+|A)*/\n    ZABCDEFG\n 0: \n 1: \n\n/a*/g\n    abbab\n 0: a\n 0: \n 0: \n 0: a\n 0: \n 0: \n\n/^[\\d-a]/\n    abcde\n 0: a\n    -things\n 0: -\n    0digit\n 0: 0\n    *** Failers\nNo match\n    bcdef    \nNo match\n    \n/[[:space:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/[[:blank:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\n     \n/[\\s]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/\\s+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/a\u000bb/x\n    ab\n 0: ab\n\n/(?!\\A)x/m\n  a\\nxb\\n\n 0: x\n\n/(?!^)x/m\n  a\\nxb\\n\nNo match\n\n/abc\\Qabc\\Eabc/\n    abcabcabc\n 0: abcabcabc\n    \n/abc\\Q(*+|\\Eabc/\n    abc(*+|abc \n 0: abc(*+|abc\n\n/   abc\\Q abc\\Eabc/x\n    abc abcabc\n 0: abc abcabc\n    *** Failers\nNo match\n    abcabcabc  \nNo match\n    \n/abc#comment\n    \\Q#not comment\n    literal\\E/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment\n    /x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/\\Qabc\\$xyz\\E/\n    abc\\\\\\$xyz\n 0: abc\\$xyz\n\n/\\Qabc\\E\\$\\Qxyz\\E/\n    abc\\$xyz\n 0: abc$xyz\n\n/\\Gabc/\n    abc\n 0: abc\n    *** Failers\nNo match\n    xyzabc  \nNo match\n\n/\\Gabc./g\n    abc1abc2xyzabc3\n 0: abc1\n 0: abc2\n\n/abc./g\n    abc1abc2xyzabc3 \n 0: abc1\n 0: abc2\n 0: abc3\n\n/a(?x: b c )d/\n    XabcdY\n 0: abcd\n    *** Failers \nNo match\n    Xa b c d Y \nNo match\n\n/((?x)x y z | a b c)/\n    XabcY\n 0: abc\n 1: abc\n    AxyzB \n 0: xyz\n 1: xyz\n\n/(?i)AB(?-i)C/\n    XabCY\n 0: abC\n    *** Failers\nNo match\n    XabcY  \nNo match\n\n/((?i)AB(?-i)C|D)E/\n    abCE\n 0: abCE\n 1: abC\n    DE\n 0: DE\n 1: D\n    *** Failers\nNo match\n    abcE\nNo match\n    abCe  \nNo match\n    dE\nNo match\n    De    \nNo match\n\n/(.*)\\d+\\1/\n    abc123abc\n 0: abc123abc\n 1: abc\n    abc123bc \n 0: bc123bc\n 1: bc\n\n/(.*)\\d+\\1/s\n    abc123abc\n 0: abc123abc\n 1: abc\n    abc123bc \n 0: bc123bc\n 1: bc\n    \n/((.*))\\d+\\1/\n    abc123abc\n 0: abc123abc\n 1: abc\n 2: abc\n    abc123bc  \n 0: bc123bc\n 1: bc\n 2: bc\n\n/-- This tests for an IPv6 address in the form where it can have up to\n    eight components, one and only one of which is empty. This must be\n    an internal component. --/\n\n/^(?!:)                       # colon disallowed at start\n  (?:                         # start of item\n    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or\n    (?(1)0 | () ) )           # if null previously matched, fail; else null\n    :                         # followed by colon\n  ){1,7}                      # end item; 1-7 of them required               \n  [0-9a-f]{1,4} $             # final hex number at end of string\n  (?(1)|.)                    # check that there was an empty component\n  /xi\n    a123::a123\n 0: a123::a123\n 1: \n    a123:b342::abcd\n 0: a123:b342::abcd\n 1: \n    a123:b342::324e:abcd\n 0: a123:b342::324e:abcd\n 1: \n    a123:ddde:b342::324e:abcd\n 0: a123:ddde:b342::324e:abcd\n 1: \n    a123:ddde:b342::324e:dcba:abcd\n 0: a123:ddde:b342::324e:dcba:abcd\n 1: \n    a123:ddde:9999:b342::324e:dcba:abcd\n 0: a123:ddde:9999:b342::324e:dcba:abcd\n 1: \n    *** Failers\nNo match\n    1:2:3:4:5:6:7:8\nNo match\n    a123:bce:ddde:9999:b342::324e:dcba:abcd\nNo match\n    a123::9999:b342::324e:dcba:abcd\nNo match\n    abcde:2:3:4:5:6:7:8\nNo match\n    ::1\nNo match\n    abcd:fee0:123::   \nNo match\n    :1\nNo match\n    1:  \nNo match\n\n/[z\\Qa-d]\\E]/\n    z\n 0: z\n    a\n 0: a\n    -\n 0: -\n    d\n 0: d\n    ] \n 0: ]\n    *** Failers\n 0: a\n    b     \nNo match\n\n/[\\z\\C]/\n    z\n 0: z\n    C \n 0: C\n    \n/\\M/\n    M \n 0: M\n    \n/(a+)*b/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \nNo match\n    \n/(?i)reg(?:ul(?:[a]|ae)r|ex)/\n    REGular\n 0: REGular\n    regulaer\n 0: regulaer\n    Regex  \n 0: Regex\n    regulr \n 0: regul\\xe4r\n\n/[--]+/\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xe0\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xff\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xc0\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xdf\n\n/(?<=Z)X./\n  \\x84XAZXB\n 0: XB\n\n/ab cd (?x) de fg/\n    ab cd defg\n 0: ab cd defg\n\n/ab cd(?x) de fg/\n    ab cddefg\n 0: ab cddefg\n    ** Failers \nNo match\n    abcddefg\nNo match\n\n/(?<![^f]oo)(bar)/\n    foobarX \n 0: bar\n 1: bar\n    ** Failers \nNo match\n    boobarX\nNo match\n\n/(?<![^f])X/\n    offX\n 0: X\n    ** Failers\nNo match\n    onyX  \nNo match\n\n/(?<=[^f])X/\n    onyX\n 0: X\n    ** Failers\nNo match\n    offX \nNo match\n\n/^/mg\n    a\\nb\\nc\\n\n 0: \n 0: \n 0: \n    \\ \n 0: \n    \n/(?<=C\\n)^/mg\n    A\\nC\\nC\\n \n 0: \n\n/(?:(?(1)a|b)(X))+/\n    bXaX\n 0: bXaX\n 1: X\n\n/(?:(?(1)\\1a|b)(X|Y))+/\n    bXXaYYaY\n 0: bXXaYYaY\n 1: Y\n    bXYaXXaX  \n 0: bX\n 1: X\n\n/()()()()()()()()()(?:(?(10)\\10a|b)(X|Y))+/\n    bXXaYYaY\n 0: bX\n 1: \n 2: \n 3: \n 4: \n 5: \n 6: \n 7: \n 8: \n 9: \n10: X\n\n/[[,abc,]+]/\n    abc]\n 0: abc]\n    a,b]\n 0: a,b]\n    [a,b,c]  \n 0: [a,b,c]\n\n/(?-x: )/x\n    A\\x20B\n 0:  \n    \n\"(?x)(?-x: \\s*#\\s*)\"\n    A # B\n 0:  # \n    ** Failers\nNo match\n    #  \nNo match\n\n\"(?x-is)(?:(?-ixs) \\s*#\\s*) include\"\n    A #include\n 0:  #include\n    ** Failers\nNo match\n    A#include  \nNo match\n    A #Include\nNo match\n\n/a*b*\\w/\n    aaabbbb\n 0: aaabbbb\n    aaaa\n 0: aaaa\n    a\n 0: a\n\n/a*b?\\w/\n    aaabbbb\n 0: aaabb\n    aaaa\n 0: aaaa\n    a\n 0: a\n\n/a*b{0,4}\\w/\n    aaabbbb\n 0: aaabbbb\n    aaaa\n 0: aaaa\n    a\n 0: a\n\n/a*b{0,}\\w/\n    aaabbbb\n 0: aaabbbb\n    aaaa\n 0: aaaa\n    a\n 0: a\n    \n/a*\\d*\\w/\n    0a\n 0: 0a\n    a \n 0: a\n    \n/a*b *\\w/x\n    a \n 0: a\n\n/a*b#comment\n  *\\w/x\n    a \n 0: a\n\n/a* b *\\w/x\n    a \n 0: a\n\n/^\\w+=.*(\\\\\\n.*)*/\n    abc=xyz\\\\\\npqr\n 0: abc=xyz\\\n\n/(?=(\\w+))\\1:/\n    abcd:\n 0: abcd:\n 1: abcd\n\n/^(?=(\\w+))\\1:/\n    abcd:\n 0: abcd:\n 1: abcd\n\n/^\\Eabc/\n    abc\n 0: abc\n    \n/^[\\Eabc]/\n    a\n 0: a\n    ** Failers \nNo match\n    E \nNo match\n    \n/^[a-\\Ec]/\n    b\n 0: b\n    ** Failers\nNo match\n    -\nNo match\n    E    \nNo match\n\n/^[a\\E\\E-\\Ec]/\n    b\n 0: b\n    ** Failers\nNo match\n    -\nNo match\n    E    \nNo match\n\n/^[\\E\\Qa\\E-\\Qz\\E]+/\n    b\n 0: b\n    ** Failers\nNo match\n    -  \nNo match\n    \n/^[a\\Q]bc\\E]/\n    a\n 0: a\n    ]\n 0: ]\n    c\n 0: c\n    \n/^[a-\\Q\\E]/\n    a\n 0: a\n    -     \n 0: -\n\n/^(a()*)*/\n    aaaa\n 0: aaaa\n 1: a\n 2: \n\n/^(?:a(?:(?:))*)*/\n    aaaa\n 0: aaaa\n\n/^(a()+)+/\n    aaaa\n 0: aaaa\n 1: a\n 2: \n\n/^(?:a(?:(?:))+)+/\n    aaaa\n 0: aaaa\n\n/(a){0,3}(?(1)b|(c|))*D/\n    abbD\n 0: abbD\n 1: a\n    ccccD\n 0: ccccD\n 1: <unset>\n 2: \n    D  \n 0: D\n 1: <unset>\n 2: \n\n/(a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 1: \n\n/(?>a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?:a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/\\Z/g\n  abc\\n\n 0: \n 0: \n  \n/^(?s)(?>.*)(?<!\\n)/\n  abc\n 0: abc\n  abc\\n  \nNo match\n\n/^(?![^\\n]*\\n\\z)/\n  abc\n 0: \n  abc\\n \nNo match\n  \n/\\z(?<!\\n)/\n  abc\n 0: \n  abc\\n  \nNo match\n\n/(.*(.)?)*/\n    abcd\n 0: abcd\n 1: \n\n/( (A | (?(1)0|) )*   )/x\n    abcd\n 0: \n 1: \n 2: \n\n/( ( (?(1)0|) )*   )/x\n    abcd\n 0: \n 1: \n 2: \n\n/(  (?(1)0|)*   )/x\n    abcd\n 0: \n 1: \n\n/[[:abcd:xyz]]/\n    a]\n 0: a]\n    :] \n 0: :]\n    \n/[abc[:x\\]pqr]/\n    a\n 0: a\n    [\n 0: [\n    :\n 0: :\n    ]\n 0: ]\n    p    \n 0: p\n\n/.*[op][xyz]/\n    fooabcfoo\nNo match\n\n/(?(?=.*b)b|^)/\n   adc\n 0: \n   abc \n 0: b\n\n/(?(?=^.*b)b|^)/\n   adc\n 0: \n   abc \nNo match\n\n/(?(?=.*b)b|^)*/\n   adc\n 0: \n   abc \n 0: \n\n/(?(?=.*b)b|^)+/\n   adc\n 0: \n   abc \n 0: b\n\n/(?(?=b).*b|^d)/\n    abc\n 0: b\n\n/(?(?=.*b).*b|^d)/\n    abc\n 0: ab\n\n/^%((?(?=[a])[^%])|b)*%$/\n    %ab%\n 0: %ab%\n 1: \n\n/(?i)a(?-i)b|c/\n    XabX\n 0: ab\n    XAbX\n 0: Ab\n    CcC \n 0: c\n    ** Failers\nNo match\n    XABX   \nNo match\n\n/[\\x00-\\xff\\s]+/\n    \\x0a\\x0b\\x0c\\x0d\n 0: \\x0a\\x0b\\x0c\\x0d\n\n/^\\c/\n    ?\n 0: ?\n\n/(abc)\\1/i\n   abc\nNo match\n\n/(abc)\\1/\n   abc\nNo match\n\n/[^a]*/i\n    12abc\n 0: 12\n    12ABC\n 0: 12\n\n/[^a]*+/i\n    12abc\n 0: 12\n    12ABC\n 0: 12\n\n/[^a]*?X/i\n    ** Failers\nNo match\n    12abc\nNo match\n    12ABC\nNo match\n    \n/[^a]+?X/i   \n    ** Failers\nNo match\n    12abc\nNo match\n    12ABC\nNo match\n\n/[^a]?X/i\n    12aXbcX\n 0: X\n    12AXBCX\n 0: X\n    BCX \n 0: CX\n\n/[^a]??X/i\n    12aXbcX\n 0: X\n    12AXBCX\n 0: X\n    BCX\n 0: CX\n    \n/[^a]?+X/i\n    12aXbcX\n 0: cX\n    12AXBCX\n 0: CX\n    BCX \n 0: CX\n\n/[^a]{2,3}/i\n    abcdef\n 0: bcd\n    ABCDEF  \n 0: BCD\n\n/[^a]{2,3}?/i\n    abcdef\n 0: bc\n    ABCDEF  \n 0: BC\n\n/[^a]{2,3}+/i\n    abcdef\n 0: bcd\n    ABCDEF  \n 0: BCD\n\n/((a|)+)+Z/\n    Z\n 0: Z\n 1: \n 2: \n\n/(a)b|(a)c/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n\n/(?>(a))b|(a)c/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n\n/(?=(a))ab|(a)c/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n\n/((?>(a))b|(a)c)/\n    ac\n 0: ac\n 1: ac\n 2: <unset>\n 3: a\n\n/((?>(a))b|(a)c)++/\n    ac\n 0: ac\n 1: ac\n 2: <unset>\n 3: a\n\n/(?:(?>(a))b|(a)c)++/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n\n/(?=(?>(a))b|(a)c)(..)/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n 3: ac\n\n/(?>(?>(a))b|(a)c)/\n    ac\n 0: ac\n 1: <unset>\n 2: a\n\n/(?:(?>([ab])))+a=/+\n    =ba=\n 0: ba=\n 0+ \n 1: b\n\n/(?>([ab]))+a=/+\n    =ba=\n 0: ba=\n 0+ \n 1: b\n\n/((?>(a+)b)+(aabab))/\n    aaaabaaabaabab\n 0: aaaabaaabaabab\n 1: aaaabaaabaabab\n 2: aaa\n 3: aabab\n\n/(?>a+|ab)+?c/\n    aabc\nNo match\n\n/(?>a+|ab)+c/\n    aabc\nNo match\n\n/(?:a+|ab)+c/\n    aabc\n 0: aabc\n\n/(?(?=(a))a)/\n    a\n 0: a\n 1: a\n\n/(?(?=(a))a)(b)/\n    ab\n 0: ab\n 1: a\n 2: b\n\n/^(?:a|ab)++c/\n    aaaabc\nNo match\n\n/^(?>a|ab)++c/\n    aaaabc\nNo match\n\n/^(?:a|ab)+c/\n    aaaabc\n 0: aaaabc\n\n/(?=abc){3}abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc)+abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc)++abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc){0}xyz/\n    xyz \n 0: xyz\n\n/(?=abc){1}xyz/\n    ** Failers\nNo match\n    xyz \nNo match\n    \n/(?=(a))?./\n    ab\n 0: a\n 1: a\n    bc\n 0: b\n      \n/(?=(a))??./\n    ab\n 0: a\n    bc\n 0: b\n\n/^(?=(?1))?[az]([abc])d/\n    abd \n 0: abd\n 1: b\n    zcdxx \n 0: zcd\n 1: c\n\n/^(?!a){0}\\w+/\n    aaaaa\n 0: aaaaa\n\n/(?<=(abc))?xyz/\n    abcxyz\n 0: xyz\n 1: abc\n    pqrxyz \n 0: xyz\n\n/^[\\g<a>]+/\n    ggg<<<aaa>>>\n 0: ggg<<<aaa>>>\n    ** Failers\nNo match\n    \\\\ga  \nNo match\n    \n/^[\\ga]+/\n    gggagagaxyz \n 0: gggagaga\n    \n/^[:a[:digit:]]+/\n    aaaa444:::Z \n 0: aaaa444:::\n\n/^[:a[:digit:]:b]+/\n    aaaa444:::bbbZ \n 0: aaaa444:::bbb\n\n/[:a]xxx[b:]/\n     :xxx:\n 0: :xxx:\n     \n/(?<=a{2})b/i\n    xaabc\n 0: b\n    ** Failers\nNo match\n    xabc  \nNo match\n\n/(?<!a{2})b/i\n    xabc\n 0: b\n    ** Failers\nNo match\n    xaabc  \nNo match\n\n/(?<=a\\h)c/\n    xa c\n 0: c\n    \n/(?<=[^a]{2})b/\n    axxbc\n 0: b\n    aAAbc \n 0: b\n    ** Failers\nNo match\n    xaabc    \nNo match\n\n/(?<=[^a]{2})b/i\n    axxbc  \n 0: b\n    ** Failers\nNo match\n    aAAbc \nNo match\n    xaabc    \nNo match\n\n/(?<=a\\H)c/\n    abc\n 0: c\n\n/(?<=a\\V)c/\n    abc\n 0: c\n    \n/(?<=a\\v)c/\n    a\\nc\n 0: c\n\n/(?(?=c)c|d)++Y/\n    XcccddYX\n 0: cccddY\n\n/(?(?=c)c|d)*+Y/\n    XcccddYX\n 0: cccddY\n\n/^(a{2,3}){2,}+a/\n    aaaaaaa\n 0: aaaaaaa\n 1: aaa\n    ** Failers\nNo match\n    aaaaaa\nNo match\n    aaaaaaaaa \nNo match\n\n/^(a{2,3})++a/\n    ** Failers\nNo match\n    aaaaaa\nNo match\n\n/^(a{2,3})*+a/\n    ** Failers\nNo match\n    aaaaaa\nNo match\n\n/ab\\Cde/\n    abXde\n 0: abXde\n    \n/(?<=ab\\Cde)X/\n    abZdeX\n 0: X\n\n/a[\\CD]b/\n    aCb\n 0: aCb\n    aDb \n 0: aDb\n\n/a[\\C-X]b/\n    aJb\n 0: aJb\n\n/\\H\\h\\V\\v/\n    X X\\x0a\n 0: X X\\x0a\n    X\\x09X\\x0b\n 0: X\\x09X\\x0b\n    ** Failers\nNo match\n    \\xa0 X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/ \n    \\x09\\x20\\xa0X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x09 \\xa0X\\x0a\\x0b\\x0c\\x0d\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x09 \\xa0\\x0a\\x0b\\x0c\\x0d\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\n 0: \\x09 \\xa0\\x0a\\x0b\\x0c\n    ** Failers \nNo match\n    \\x09\\x20\\xa0\\x0a\\x0b\nNo match\n     \n/\\H{3,4}/\n    XY  ABCDE\n 0: ABCD\n    XY  PQR ST \n 0: PQR\n    \n/.\\h{3,4}./\n    XY  AB    PQRS\n 0: B    P\n\n/\\h*X\\h?\\H+Y\\H?Z/\n    >XNNNYZ\n 0: XNNNYZ\n    >  X NYQZ\n 0:   X NYQZ\n    ** Failers\nNo match\n    >XYZ   \nNo match\n    >  X NY Z\nNo match\n\n/\\v*X\\v?Y\\v+Z\\V*\\x0a\\V+\\x0b\\V{2,3}\\x0c/\n    >XY\\x0aZ\\x0aA\\x0bNN\\x0c\n 0: XY\\x0aZ\\x0aA\\x0bNN\\x0c\n    >\\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n 0: \\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n\n/(foo)\\Kbar/\n    foobar\n 0: bar\n 1: foo\n   \n/(foo)(\\Kbar|baz)/\n    foobar\n 0: bar\n 1: foo\n 2: bar\n    foobaz \n 0: foobaz\n 1: foo\n 2: baz\n\n/(foo\\Kbar)baz/\n    foobarbaz\n 0: barbaz\n 1: foobar\n\n/abc\\K|def\\K/g+\n    Xabcdefghi\n 0: \n 0+ defghi\n 0: \n 0+ ghi\n\n/ab\\Kc|de\\Kf/g+\n    Xabcdefghi\n 0: c\n 0+ defghi\n 0: f\n 0+ ghi\n    \n/(?=C)/g+\n    ABCDECBA\n 0: \n 0+ CDECBA\n 0: \n 0+ CBA\n    \n/^abc\\K/+\n    abcdef\n 0: \n 0+ def\n    ** Failers\nNo match\n    defabcxyz   \nNo match\n\n/^(a(b))\\1\\g1\\g{1}\\g-1\\g{-1}\\g{-02}Z/\n    ababababbbabZXXXX\n 0: ababababbbabZ\n 1: ab\n 2: b\n\n/(?<A>tom|bon)-\\g{A}/\n    tom-tom\n 0: tom-tom\n 1: tom\n    bon-bon \n 0: bon-bon\n 1: bon\n    \n/(^(a|b\\g{-1}))/\n    bacxxx\nNo match\n\n/(?|(abc)|(xyz))\\1/\n    abcabc\n 0: abcabc\n 1: abc\n    xyzxyz \n 0: xyzxyz\n 1: xyz\n    ** Failers\nNo match\n    abcxyz\nNo match\n    xyzabc   \nNo match\n    \n/(?|(abc)|(xyz))(?1)/\n    abcabc\n 0: abcabc\n 1: abc\n    xyzabc \n 0: xyzabc\n 1: xyz\n    ** Failers \nNo match\n    xyzxyz \nNo match\n \n/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/\n    XYabcdY\n 0: XYabcdY\n 1: a\n 2: b\n 3: c\n 4: d\n 5: Y\n\n/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/\n    XYabcdY\n 0: XYabcdY\n 1: a\n 2: b\n 3: <unset>\n 4: <unset>\n 5: c\n 6: d\n 7: Y\n\n/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/\n    XYabcdY\n 0: XYabcdY\n 1: a\n 2: b\n 3: <unset>\n 4: <unset>\n 5: c\n 6: d\n 7: Y\n\n/(?'abc'\\w+):\\k<abc>{2}/\n    a:aaxyz\n 0: a:aa\n 1: a\n    ab:ababxyz\n 0: ab:abab\n 1: ab\n    ** Failers\nNo match\n    a:axyz\nNo match\n    ab:abxyz\nNo match\n\n/(?'abc'\\w+):\\g{abc}{2}/\n    a:aaxyz\n 0: a:aa\n 1: a\n    ab:ababxyz\n 0: ab:abab\n 1: ab\n    ** Failers\nNo match\n    a:axyz\nNo match\n    ab:abxyz\nNo match\n\n/^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x\n    abd\n 0: abd\n 1: a\n    ce\n 0: ce\n\n/^(a.)\\g-1Z/\n    aXaXZ\n 0: aXaXZ\n 1: aX\n\n/^(a.)\\g{-1}Z/\n    aXaXZ\n 0: aXaXZ\n 1: aX\n\n/^(?(DEFINE) (?<A> a) (?<B> b) )  (?&A) (?&B) /x\n    abcd\n 0: ab\n\n/(?<NAME>(?&NAME_PAT))\\s+(?<ADDR>(?&ADDRESS_PAT))\n  (?(DEFINE)\n  (?<NAME_PAT>[a-z]+)\n  (?<ADDRESS_PAT>\\d+)\n  )/x\n    metcalfe 33\n 0: metcalfe 33\n 1: metcalfe\n 2: 33\n\n/(?(DEFINE)(?<byte>2[0-4]\\d|25[0-5]|1\\d\\d|[1-9]?\\d))\\b(?&byte)(\\.(?&byte)){3}/\n    1.2.3.4\n 0: 1.2.3.4\n 1: <unset>\n 2: .4\n    131.111.10.206\n 0: 131.111.10.206\n 1: <unset>\n 2: .206\n    10.0.0.0\n 0: 10.0.0.0\n 1: <unset>\n 2: .0\n    ** Failers\nNo match\n    10.6\nNo match\n    455.3.4.5\nNo match\n\n/\\b(?&byte)(\\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\\d|25[0-5]|1\\d\\d|[1-9]?\\d))/\n    1.2.3.4\n 0: 1.2.3.4\n 1: .4\n    131.111.10.206\n 0: 131.111.10.206\n 1: .206\n    10.0.0.0\n 0: 10.0.0.0\n 1: .0\n    ** Failers\nNo match\n    10.6\nNo match\n    455.3.4.5\nNo match\n\n/^(\\w++|\\s++)*$/\n    now is the time for all good men to come to the aid of the party\n 0: now is the time for all good men to come to the aid of the party\n 1: party\n    *** Failers\nNo match\n    this is not a line with only words and spaces!\nNo match\n\n/(\\d++)(\\w)/\n    12345a\n 0: 12345a\n 1: 12345\n 2: a\n    *** Failers\nNo match\n    12345+\nNo match\n\n/a++b/\n    aaab\n 0: aaab\n\n/(a++b)/\n    aaab\n 0: aaab\n 1: aaab\n\n/(a++)b/\n    aaab\n 0: aaab\n 1: aaa\n\n/([^()]++|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: x\n\n/\\(([^()]++|\\([^()]+\\))+\\)/\n    (abc)\n 0: (abc)\n 1: abc\n    (abc(def)xyz)\n 0: (abc(def)xyz)\n 1: xyz\n    *** Failers\nNo match\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n\n/^([^()]|\\((?1)*\\))*$/\n    abc\n 0: abc\n 1: c\n    a(b)c\n 0: a(b)c\n 1: c\n    a(b(c))d\n 0: a(b(c))d\n 1: d\n    *** Failers)\nNo match\n    a(b(c)d\nNo match\n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/\n   >abc>123<xyz<\n 0: >abc>123<xyz<\n 1: 3\n   >abc>1(2)3<xyz<\n 0: >abc>1(2)3<xyz<\n 1: 3\n   >abc>(1(2)3)<xyz<\n 0: >abc>(1(2)3)<xyz<\n 1: (1(2)3)\n\n/^(?:((.)(?1)\\2|)|((.)(?3)\\4|.))$/i\n    1221\n 0: 1221\n 1: 1221\n 2: 1\n    Satanoscillatemymetallicsonatas\n 0: Satanoscillatemymetallicsonatas\n 1: <unset>\n 2: <unset>\n 3: Satanoscillatemymetallicsonatas\n 4: S\n    AmanaplanacanalPanama\n 0: AmanaplanacanalPanama\n 1: <unset>\n 2: <unset>\n 3: AmanaplanacanalPanama\n 4: A\n    AblewasIereIsawElba\n 0: AblewasIereIsawElba\n 1: <unset>\n 2: <unset>\n 3: AblewasIereIsawElba\n 4: A\n    *** Failers\nNo match\n    Thequickbrownfox\nNo match\n\n/^(\\d+|\\((?1)([+*-])(?1)\\)|-(?1))$/\n    12\n 0: 12\n 1: 12\n    (((2+2)*-3)-7)\n 0: (((2+2)*-3)-7)\n 1: (((2+2)*-3)-7)\n 2: -\n    -12\n 0: -12\n 1: -12\n    *** Failers\nNo match\n    ((2+2)*-3)-7)\nNo match\n\n/^(x(y|(?1){2})z)/\n    xyz\n 0: xyz\n 1: xyz\n 2: y\n    xxyzxyzz\n 0: xxyzxyzz\n 1: xxyzxyzz\n 2: xyzxyz\n    *** Failers\nNo match\n    xxyzz\nNo match\n    xxyzxyzxyzz\nNo match\n\n/((< (?: (?(R) \\d++  | [^<>]*+) | (?2)) * >))/x\n    <>\n 0: <>\n 1: <>\n 2: <>\n    <abcd>\n 0: <abcd>\n 1: <abcd>\n 2: <abcd>\n    <abc <123> hij>\n 0: <abc <123> hij>\n 1: <abc <123> hij>\n 2: <abc <123> hij>\n    <abc <def> hij>\n 0: <def>\n 1: <def>\n 2: <def>\n    <abc<>def>\n 0: <abc<>def>\n 1: <abc<>def>\n 2: <abc<>def>\n    <abc<>\n 0: <>\n 1: <>\n 2: <>\n    *** Failers\nNo match\n    <abc\nNo match\n\n/^a+(*FAIL)/\n    aaaaaa\nNo match\n    \n/a+b?c+(*FAIL)/\n    aaabccc\nNo match\n\n/a+b?(*PRUNE)c+(*FAIL)/\n    aaabccc\nNo match\n\n/a+b?(*COMMIT)c+(*FAIL)/\n    aaabccc\nNo match\n    \n/a+b?(*SKIP)c+(*FAIL)/\n    aaabcccaaabccc\nNo match\n\n/^(?:aaa(*THEN)\\w{6}|bbb(*THEN)\\w{5}|ccc(*THEN)\\w{4}|\\w{3})/\n    aaaxxxxxx\n 0: aaaxxxxxx\n    aaa++++++ \n 0: aaa\n    bbbxxxxx\n 0: bbbxxxxx\n    bbb+++++ \n 0: bbb\n    cccxxxx\n 0: cccxxxx\n    ccc++++ \n 0: ccc\n    dddddddd   \n 0: ddd\n\n/^(aaa(*THEN)\\w{6}|bbb(*THEN)\\w{5}|ccc(*THEN)\\w{4}|\\w{3})/\n    aaaxxxxxx\n 0: aaaxxxxxx\n 1: aaaxxxxxx\n    aaa++++++ \n 0: aaa\n 1: aaa\n    bbbxxxxx\n 0: bbbxxxxx\n 1: bbbxxxxx\n    bbb+++++ \n 0: bbb\n 1: bbb\n    cccxxxx\n 0: cccxxxx\n 1: cccxxxx\n    ccc++++ \n 0: ccc\n 1: ccc\n    dddddddd   \n 0: ddd\n 1: ddd\n\n/a+b?(*THEN)c+(*FAIL)/\n    aaabccc\nNo match\n\n/(A (A|B(*ACCEPT)|C) D)(E)/x\n    AB\n 0: AB\n 1: AB\n 2: B\n    ABX\n 0: AB\n 1: AB\n 2: B\n    AADE\n 0: AADE\n 1: AAD\n 2: A\n 3: E\n    ACDE\n 0: ACDE\n 1: ACD\n 2: C\n 3: E\n    ** Failers\nNo match\n    AD \nNo match\n        \n/^\\W*+(?:((.)\\W*+(?1)\\W*+\\2|)|((.)\\W*+(?3)\\W*+\\4|\\W*+.\\W*+))\\W*+$/i\n    1221\n 0: 1221\n 1: 1221\n 2: 1\n    Satan, oscillate my metallic sonatas!\n 0: Satan, oscillate my metallic sonatas!\n 1: <unset>\n 2: <unset>\n 3: Satan, oscillate my metallic sonatas\n 4: S\n    A man, a plan, a canal: Panama!\n 0: A man, a plan, a canal: Panama!\n 1: <unset>\n 2: <unset>\n 3: A man, a plan, a canal: Panama\n 4: A\n    Able was I ere I saw Elba.\n 0: Able was I ere I saw Elba.\n 1: <unset>\n 2: <unset>\n 3: Able was I ere I saw Elba\n 4: A\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/^((.)(?1)\\2|.)$/\n    a\n 0: a\n 1: a\n    aba\n 0: aba\n 1: aba\n 2: a\n    aabaa  \n 0: aabaa\n 1: aabaa\n 2: a\n    abcdcba \n 0: abcdcba\n 1: abcdcba\n 2: a\n    pqaabaaqp  \n 0: pqaabaaqp\n 1: pqaabaaqp\n 2: p\n    ablewasiereisawelba\n 0: ablewasiereisawelba\n 1: ablewasiereisawelba\n 2: a\n    rhubarb\nNo match\n    the quick brown fox  \nNo match\n\n/(a)(?<=b(?1))/\n    baz\n 0: a\n 1: a\n    ** Failers\nNo match\n    caz  \nNo match\n    \n/(?<=b(?1))(a)/\n    zbaaz\n 0: a\n 1: a\n    ** Failers\nNo match\n    aaa  \nNo match\n    \n/(?<X>a)(?<=b(?&X))/\n    baz\n 0: a\n 1: a\n\n/^(?|(abc)|(def))\\1/\n    abcabc\n 0: abcabc\n 1: abc\n    defdef \n 0: defdef\n 1: def\n    ** Failers\nNo match\n    abcdef\nNo match\n    defabc   \nNo match\n    \n/^(?|(abc)|(def))(?1)/\n    abcabc\n 0: abcabc\n 1: abc\n    defabc\n 0: defabc\n 1: def\n    ** Failers\nNo match\n    defdef\nNo match\n    abcdef    \nNo match\n\n/(?:a(?<quote> (?<apostrophe>')|(?<realquote>\")) |b(?<quote> (?<apostrophe>')|(?<realquote>\")) ) (?('quote')[a-z]+|[0-9]+)/xJ\n    a\\\"aaaaa\n 0: a\"aaaaa\n 1: \"\n 2: <unset>\n 3: \"\n    b\\\"aaaaa \n 0: b\"aaaaa\n 1: <unset>\n 2: <unset>\n 3: <unset>\n 4: \"\n 5: <unset>\n 6: \"\n    ** Failers \nNo match\n    b\\\"11111\nNo match\n\n/(?:(?1)|B)(A(*F)|C)/\n    ABCD\n 0: BC\n 1: C\n    CCD\n 0: CC\n 1: C\n    ** Failers\nNo match\n    CAD   \nNo match\n\n/^(?:(?1)|B)(A(*F)|C)/\n    CCD\n 0: CC\n 1: C\n    BCD \n 0: BC\n 1: C\n    ** Failers\nNo match\n    ABCD\nNo match\n    CAD\nNo match\n    BAD    \nNo match\n\n/(?:(?1)|B)(A(*ACCEPT)XX|C)D/\n    AAD\n 0: AA\n 1: A\n    ACD\n 0: ACD\n 1: C\n    BAD\n 0: BA\n 1: A\n    BCD\n 0: BCD\n 1: C\n    BAX  \n 0: BA\n 1: A\n    ** Failers\nNo match\n    ACX\nNo match\n    ABC   \nNo match\n\n/(?(DEFINE)(A))B(?1)C/\n    BAC\n 0: BAC\n\n/(?(DEFINE)((A)\\2))B(?1)C/\n    BAAC\n 0: BAAC\n\n/(?<pn> \\( ( [^()]++ | (?&pn) )* \\) )/x\n    (ab(cd)ef)\n 0: (ab(cd)ef)\n 1: (ab(cd)ef)\n 2: ef\n\n/^(?=a(*SKIP)b|ac)/\n    ** Failers\nNo match\n    ac\nNo match\n    \n/^(?=a(*PRUNE)b)/\n    ab  \n 0: \n    ** Failers \nNo match\n    ac\nNo match\n\n/^(?=a(*ACCEPT)b)/\n    ac\n 0: \n\n/(?>a\\Kb)/\n    ab\n 0: b\n\n/((?>a\\Kb))/\n    ab\n 0: b\n 1: ab\n\n/(a\\Kb)/\n    ab\n 0: b\n 1: ab\n    \n/^a\\Kcz|ac/\n    ac\n 0: ac\n    \n/(?>a\\Kbz|ab)/\n    ab \n 0: ab\n\n/^(?&t)(?(DEFINE)(?<t>a\\Kb))$/\n    ab\n 0: b\n\n/^([^()]|\\((?1)*\\))*$/\n    a(b)c\n 0: a(b)c\n 1: c\n    a(b(c)d)e \n 0: a(b(c)d)e\n 1: e\n\n/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/\n    0\n 0: 0\n 1: 0\n    00\n 0: 00\n 1: 00\n 2: 0\n    0000  \n 0: 0000\n 1: 0000\n 2: 0\n\n/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/\n    0\n 0: 0\n 1: 0\n 2: 0\n    00\n 0: 0\n 1: 0\n 2: 0\n    0000  \n 0: 0\n 1: 0\n 2: 0\n\n/--- This one does fail, as expected, in Perl. It needs the complex item at the\n     end of the pattern. A single letter instead of (B|D) makes it not fail,\n     which I think is a Perl bug. --- /\n\n/A(*COMMIT)(B|D)/\n    ACABX\nNo match\n\n/--- Check the use of names for failure ---/\n\n/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K\n    ** Failers\nNo match\n    AC\nNo match, mark = A\n    CB    \nNo match, mark = B\n    \n/--- Force no study, otherwise mark is not seen. The studied version is in\n     test 2 because it isn't Perl-compatible. ---/\n\n/(*MARK:A)(*SKIP:B)(C|X)/KSS\n    C\n 0: C\n 1: C\nMK: A\n    D\nNo match, mark = A\n     \n/^(A(*THEN:A)B|C(*THEN:B)D)/K\n    ** Failers\nNo match\n    CB    \nNo match, mark = B\n\n/^(?:A(*THEN:A)B|C(*THEN:B)D)/K\n    CB    \nNo match, mark = B\n    \n/^(?>A(*THEN:A)B|C(*THEN:B)D)/K\n    CB    \nNo match, mark = B\n    \n/--- This should succeed, as the skip causes bump to offset 1 (the mark). Note\nthat we have to have something complicated such as (B|Z) at the end because,\nfor Perl, a simple character somehow causes an unwanted optimization to mess\nwith the handling of backtracking verbs. ---/\n\n/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n 0: AC\n    \n/--- Test skipping over a non-matching mark. ---/\n\n/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n 0: AC\n    \n/--- Check shorthand for MARK ---/\n\n/A(*:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\n 0: AC\n\n/--- Don't loop! Force no study, otherwise mark is not seen. ---/\n\n/(*:A)A+(*SKIP:A)(B|Z)/KSS\n    AAAC\nNo match, mark = A\n\n/--- This should succeed, as a non-existent skip name disables the skip ---/ \n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK\n    AAAC\n 0: AC\n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/xK\n    AAAC\n 0: AC\nMK: B\n\n/--- COMMIT at the start of a pattern should act like an anchor. Again, \nhowever, we need the complication for Perl. ---/\n\n/(*COMMIT)(A|P)(B|P)(C|P)/\n    ABCDEFG\n 0: ABC\n 1: A\n 2: B\n 3: C\n    ** Failers\nNo match\n    DEFGABC  \nNo match\n\n/--- COMMIT inside an atomic group can't stop backtracking over the group. ---/\n\n/(\\w+)(?>b(*COMMIT))\\w{2}/\n    abbb\n 0: abbb\n 1: a\n\n/(\\w+)b(*COMMIT)\\w{2}/\n    abbb\nNo match\n\n/--- Check opening parens in comment when seeking forward reference. ---/ \n\n/(?&t)(?#()(?(DEFINE)(?<t>a))/\n    bac\n 0: a\n\n/--- COMMIT should override THEN ---/\n\n/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/\n  yes\nNo match\n\n/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/\n  yes\nNo match\n\n/b?(*SKIP)c/\n    bc\n 0: bc\n    abc\n 0: bc\n   \n/(*SKIP)bc/\n    a\nNo match\n\n/(*SKIP)b/\n    a \nNo match\n\n/(?P<abn>(?P=abn)xxx|)+/\n    xxx\n 0: \n 1: \n\n/(?i:([^b]))(?1)/\n    aa\n 0: aa\n 1: a\n    aA     \n 0: aA\n 1: a\n    ** Failers\n 0: **\n 1: *\n    ab\nNo match\n    aB\nNo match\n    Ba\nNo match\n    ba\nNo match\n\n/^(?&t)*+(?(DEFINE)(?<t>a))\\w$/\n    aaaaaaX\n 0: aaaaaaX\n    ** Failers \nNo match\n    aaaaaa \nNo match\n\n/^(?&t)*(?(DEFINE)(?<t>a))\\w$/\n    aaaaaaX\n 0: aaaaaaX\n    aaaaaa \n 0: aaaaaa\n\n/^(a)*+(\\w)/\n    aaaaX\n 0: aaaaX\n 1: a\n 2: X\n    YZ \n 0: Y\n 1: <unset>\n 2: Y\n    ** Failers \nNo match\n    aaaa\nNo match\n\n/^(?:a)*+(\\w)/\n    aaaaX\n 0: aaaaX\n 1: X\n    YZ \n 0: Y\n 1: Y\n    ** Failers \nNo match\n    aaaa\nNo match\n\n/^(a)++(\\w)/\n    aaaaX\n 0: aaaaX\n 1: a\n 2: X\n    ** Failers \nNo match\n    aaaa\nNo match\n    YZ \nNo match\n\n/^(?:a)++(\\w)/\n    aaaaX\n 0: aaaaX\n 1: X\n    ** Failers \nNo match\n    aaaa\nNo match\n    YZ \nNo match\n\n/^(a)?+(\\w)/\n    aaaaX\n 0: aa\n 1: a\n 2: a\n    YZ \n 0: Y\n 1: <unset>\n 2: Y\n\n/^(?:a)?+(\\w)/\n    aaaaX\n 0: aa\n 1: a\n    YZ \n 0: Y\n 1: Y\n\n/^(a){2,}+(\\w)/\n    aaaaX\n 0: aaaaX\n 1: a\n 2: X\n    ** Failers\nNo match\n    aaa\nNo match\n    YZ \nNo match\n\n/^(?:a){2,}+(\\w)/\n    aaaaX\n 0: aaaaX\n 1: X\n    ** Failers\nNo match\n    aaa\nNo match\n    YZ \nNo match\n\n/(a|)*(?1)b/\n    b\n 0: b\n 1: \n    ab\n 0: ab\n 1: \n    aab  \n 0: aab\n 1: \n\n/(a)++(?1)b/\n    ** Failers\nNo match\n    ab \nNo match\n    aab\nNo match\n\n/(a)*+(?1)b/\n    ** Failers\nNo match\n    ab\nNo match\n    aab  \nNo match\n\n/(?1)(?:(b)){0}/\n    b\n 0: b\n\n/(foo ( \\( ((?:(?> [^()]+ )|(?2))*) \\) ) )/x\n    foo(bar(baz)+baz(bop))\n 0: foo(bar(baz)+baz(bop))\n 1: foo(bar(baz)+baz(bop))\n 2: (bar(baz)+baz(bop))\n 3: bar(baz)+baz(bop)\n\n/(A (A|B(*ACCEPT)|C) D)(E)/x\n    AB\n 0: AB\n 1: AB\n 2: B\n\n/\\A.*?(a|bc)/\n    ba\n 0: ba\n 1: a\n\n/\\A.*?(?:a|bc)++/\n    ba\n 0: ba\n\n/\\A.*?(a|bc)++/\n    ba\n 0: ba\n 1: a\n\n/\\A.*?(?:a|bc|d)/\n    ba\n 0: ba\n\n/(?:(b))++/\n    beetle\n 0: b\n 1: b\n\n/(?(?=(a(*ACCEPT)z))a)/\n    a\n 0: a\n 1: a\n\n/^(a)(?1)+ab/\n    aaaab\n 0: aaaab\n 1: a\n    \n/^(a)(?1)++ab/\n    aaaab\nNo match\n\n/^(?=a(*:M))aZ/K\n    aZbc\n 0: aZ\nMK: M\n\n/^(?!(*:M)b)aZ/K\n    aZbc\n 0: aZ\n\n/(?(DEFINE)(a))?b(?1)/\n    backgammon\n 0: ba\n\n/^\\N+/\n    abc\\ndef\n 0: abc\n    \n/^\\N{1,}/\n    abc\\ndef \n 0: abc\n\n/(?(R)a+|(?R)b)/\n    aaaabcde\n 0: aaaab\n\n/(?(R)a+|((?R))b)/\n    aaaabcde\n 0: aaaab\n 1: aaaa\n\n/((?(R)a+|(?1)b))/\n    aaaabcde\n 0: aaaab\n 1: aaaab\n\n/((?(R1)a+|(?1)b))/\n    aaaabcde\n 0: aaaab\n 1: aaaab\n    \n/((?(R)a|(?1)))*/\n    aaa\n 0: aaa\n 1: a\n\n/((?(R)a|(?1)))+/\n    aaa\n 0: aaa\n 1: a\n\n/a(*:any \nname)/K\n    abc\n 0: a\nMK: any \\x0aname\n    \n/(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/\n    a\n 0: a\n    ba\n 0: a\n    bba \n 0: a\n    \n/--- Checking revised (*THEN) handling ---/ \n\n/--- Capture ---/\n\n/^.*? (a(*THEN)b) c/x\n    aabc\nNo match\n\n/^.*? (a(*THEN)b|(*F)) c/x\n    aabc\n 0: aabc\n 1: ab\n\n/^.*? ( (a(*THEN)b) | (*F) ) c/x\n    aabc\n 0: aabc\n 1: ab\n 2: ab\n\n/^.*? ( (a(*THEN)b) ) c/x\n    aabc\nNo match\n\n/--- Non-capture ---/\n\n/^.*? (?:a(*THEN)b) c/x\n    aabc\nNo match\n\n/^.*? (?:a(*THEN)b|(*F)) c/x\n    aabc\n 0: aabc\n\n/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x\n    aabc\n 0: aabc\n\n/^.*? (?: (?:a(*THEN)b) ) c/x\n    aabc\nNo match\n\n/--- Atomic ---/\n\n/^.*? (?>a(*THEN)b) c/x\n    aabc\nNo match\n\n/^.*? (?>a(*THEN)b|(*F)) c/x\n    aabc\n 0: aabc\n\n/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x\n    aabc\n 0: aabc\n\n/^.*? (?> (?>a(*THEN)b) ) c/x\n    aabc\nNo match\n\n/--- Possessive capture ---/\n\n/^.*? (a(*THEN)b)++ c/x\n    aabc\nNo match\n\n/^.*? (a(*THEN)b|(*F))++ c/x\n    aabc\n 0: aabc\n 1: ab\n\n/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x\n    aabc\n 0: aabc\n 1: ab\n 2: ab\n\n/^.*? ( (a(*THEN)b)++ )++ c/x\n    aabc\nNo match\n\n/--- Possessive non-capture ---/\n\n/^.*? (?:a(*THEN)b)++ c/x\n    aabc\nNo match\n\n/^.*? (?:a(*THEN)b|(*F))++ c/x\n    aabc\n 0: aabc\n\n/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x\n    aabc\n 0: aabc\n\n/^.*? (?: (?:a(*THEN)b)++ )++ c/x\n    aabc\nNo match\n    \n/--- Condition assertion ---/\n\n/^(?(?=a(*THEN)b)ab|ac)/\n    ac\n 0: ac\n \n/--- Condition ---/\n\n/^.*?(?(?=a)a|b(*THEN)c)/\n    ba\nNo match\n\n/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/\n    ba\n 0: ba\n\n/^.*?(?(?=a)a(*THEN)b|c)/\n    ac\nNo match\n\n/--- Assertion ---/\n\n/^.*(?=a(*THEN)b)/ \n    aabc\n 0: a\n\n/------------------------------/\n\n/(?>a(*:m))/imsxSK \n    a\n 0: a\nMK: m\n\n/(?>(a)(*:m))/imsxSK \n    a\n 0: a\n 1: a\nMK: m\n\n/(?<=a(*ACCEPT)b)c/\n    xacd\n 0: c\n\n/(?<=(a(*ACCEPT)b))c/\n    xacd\n 0: c\n 1: a\n\n/(?<=(a(*COMMIT)b))c/\n    xabcd\n 0: c\n 1: ab\n    ** Failers \nNo match\n    xacd\nNo match\n    \n/(?<!a(*FAIL)b)c/\n    xcd\n 0: c\n    acd \n 0: c\n\n/(?<=a(*:N)b)c/K\n    xabcd\n 0: c\nMK: N\n    \n/(?<=a(*PRUNE)b)c/\n    xabcd \n 0: c\n\n/(?<=a(*SKIP)b)c/\n    xabcd \n 0: c\n\n/(?<=a(*THEN)b)c/\n    xabcd \n 0: c\n\n/(a)(?2){2}(.)/\n    abcd\n 0: abcd\n 1: a\n 2: d\n\n/(*MARK:A)(*PRUNE:B)(C|X)/KS\n    C\n 0: C\n 1: C\nMK: B\n    D \nNo match, mark = B\n\n/(*MARK:A)(*PRUNE:B)(C|X)/KSS\n    C\n 0: C\n 1: C\nMK: B\n    D \nNo match, mark = B\n\n/(*MARK:A)(*THEN:B)(C|X)/KS\n    C\n 0: C\n 1: C\nMK: B\n    D \nNo match, mark = B\n\n/(*MARK:A)(*THEN:B)(C|X)/KSY\n    C\n 0: C\n 1: C\nMK: B\n    D \nNo match, mark = B\n\n/(*MARK:A)(*THEN:B)(C|X)/KSS\n    C\n 0: C\n 1: C\nMK: B\n    D \nNo match, mark = B\n\n/--- This should fail, as the skip causes a bump to offset 3 (the skip) ---/\n\n/A(*MARK:A)A+(*SKIP)(B|Z) | AC/xK\n    AAAC\nNo match, mark = A\n\n/--- Same --/\n\n/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/xK\n    AAAC\nNo match, mark = B\n\n/A(*:A)A+(*SKIP)(B|Z) | AC/xK\n    AAAC\nNo match, mark = A\n\n/--- This should fail, as a null name is the same as no name ---/\n\n/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/xK\n    AAAC\nNo match, mark = A\n\n/--- A check on what happens after hitting a mark and them bumping along to\nsomething that does not even start. Perl reports tags after the failures here, \nthough it does not when the individual letters are made into something \nmore complicated. ---/\n\n/A(*:A)B|XX(*:B)Y/K\n    AABC\n 0: AB\nMK: A\n    XXYZ \n 0: XXY\nMK: B\n    ** Failers\nNo match\n    XAQQ  \nNo match, mark = A\n    XAQQXZZ  \nNo match, mark = A\n    AXQQQ \nNo match, mark = A\n    AXXQQQ \nNo match, mark = B\n    \n/^(A(*THEN:A)B|C(*THEN:B)D)/K\n    AB\n 0: AB\n 1: AB\nMK: A\n    CD\n 0: CD\n 1: CD\nMK: B\n    ** Failers\nNo match\n    AC\nNo match, mark = A\n    CB    \nNo match, mark = B\n    \n/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/K\n    AB\n 0: AB\n 1: AB\nMK: A\n    CD\n 0: CD\n 1: CD\nMK: B\n    ** Failers\nNo match\n    AC\nNo match, mark = A\n    CB    \nNo match, mark = B\n    \n/--- An empty name does not pass back an empty string. It is the same as if no\nname were given. ---/ \n\n/^(A(*PRUNE:)B|C(*PRUNE:B)D)/K\n    AB\n 0: AB\n 1: AB\n    CD \n 0: CD\n 1: CD\nMK: B\n\n/--- PRUNE goes to next bumpalong; COMMIT does not. ---/\n    \n/A(*PRUNE:A)B/K\n    ACAB\n 0: AB\nMK: A\n\n/--- Mark names can be duplicated ---/\n\n/A(*:A)B|X(*:A)Y/K\n    AABC\n 0: AB\nMK: A\n    XXYZ \n 0: XY\nMK: A\n    \n/b(*:m)f|a(*:n)w/K\n    aw \n 0: aw\nMK: n\n    ** Failers \nNo match, mark = n\n    abc\nNo match, mark = m\n\n/b(*:m)f|aw/K\n    abaw\n 0: aw\n    ** Failers \nNo match\n    abc\nNo match, mark = m\n    abax \nNo match, mark = m\n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/xK\n    AAAC\n 0: AAC\n\n/a(*PRUNE:X)bc|qq/KY\n    ** Failers\nNo match, mark = X\n    axy\nNo match, mark = X\n\n/a(*THEN:X)bc|qq/KY\n    ** Failers\nNo match, mark = X\n    axy\nNo match, mark = X\n\n/(?=a(*MARK:A)b)..x/K\n    abxy\n 0: abx\nMK: A\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(?=a(*MARK:A)b)..(*:Y)x/K\n    abxy\n 0: abx\nMK: Y\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(?=a(*PRUNE:A)b)..x/K\n    abxy\n 0: abx\nMK: A\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(?=a(*PRUNE:A)b)..(*:Y)x/K\n    abxy\n 0: abx\nMK: Y\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(?=a(*THEN:A)b)..x/K\n    abxy\n 0: abx\nMK: A\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(?=a(*THEN:A)b)..(*:Y)x/K\n    abxy\n 0: abx\nMK: Y\n    ** Failers\nNo match\n    abpq  \nNo match\n\n/(another)?(\\1?)test/\n    hello world test\n 0: test\n 1: <unset>\n 2: \n\n/(another)?(\\1+)test/\n    hello world test\nNo match\n\n/(a(*COMMIT)b){0}a(?1)|aac/\n    aac\n 0: aac\n\n/((?:a?)*)*c/\n  aac   \n 0: aac\n 1: \n\n/((?>a?)*)*c/\n  aac   \n 0: aac\n 1: \n\n/(?>.*?a)(?<=ba)/\n    aba\n 0: ba\n\n/(?:.*?a)(?<=ba)/\n    aba\n 0: aba\n\n/.*?a(*PRUNE)b/\n    aab\n 0: ab\n\n/.*?a(*PRUNE)b/s\n    aab\n 0: ab\n\n/^a(*PRUNE)b/s\n    aab\nNo match\n\n/.*?a(*SKIP)b/\n    aab\n 0: ab\n\n/(?>.*?a)b/s\n    aab\n 0: ab\n\n/(?>.*?a)b/\n    aab\n 0: ab\n\n/(?>^a)b/s\n    aab\nNo match\n\n/(?>.*?)(?<=(abcd)|(wxyz))/\n    alphabetabcd\n 0: \n 1: abcd\n    endingwxyz \n 0: \n 1: <unset>\n 2: wxyz\n\n/(?>.*)(?<=(abcd)|(wxyz))/\n    alphabetabcd\n 0: alphabetabcd\n 1: abcd\n    endingwxyz \n 0: endingwxyz\n 1: <unset>\n 2: wxyz\n\n\"(?>.*)foo\"\n    abcdfooxyz\nNo match\n    \n\"(?>.*?)foo\"\n    abcdfooxyz\n 0: foo\n\n/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/\n    ac\n 0: ac\n    \n/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/\n    ac \n 0: ac\n\n/(?<=(*SKIP)ac)a/\n    aa\nNo match\n\n/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/xK\n    AAAC\n 0: AC\n\n/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/K\n    acacd\n 0: acd\nMK: n\n\n/A(*SKIP:m)x|A(*SKIP:n)x|AB/K\n    AB\n 0: AB\n\n/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/K\n    acacd\n 0: ac\nMK: n\n\n/-- Tests that try to figure out how Perl works. My hypothesis is that the\n    first verb that is backtracked onto is the one that acts. This seems to be\n    the case almost all the time, but there is one exception that is perhaps a \n    bug. --/\n\n/-- This matches \"aaaac\"; each PRUNE advances one character until the subject\n    no longer starts with 5 'a's. --/\n\n/aaaaa(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n\n/-- Putting SKIP in front of PRUNE makes no difference, as it is never \nbacktracked onto, whether or not it has a label. --/\n\n/aaaaa(*SKIP)(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n\n/aaaaa(*SKIP:N)(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n\n/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n\n/-- Putting THEN in front makes no difference. */\n    \n/aaaaa(*THEN)(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n \n/-- However, putting COMMIT in front of the prune changes it to \"no match\". I \n    think this is inconsistent and possibly a bug. For the moment, running this\n    test is moved out of the Perl-compatible file. --/\n\n/aaaaa(*COMMIT)(*PRUNE)b|a+c/\n    \n\n/---- OK, lets play the same game again using SKIP instead of PRUNE. ----/\n\n/-- This matches \"ac\" because SKIP forces the next match to start on the\n    sixth \"a\". --/\n\n/aaaaa(*SKIP)b|a+c/\n    aaaaaac\n 0: ac\n \n/-- Putting PRUNE in front makes no difference. --/\n\n/aaaaa(*PRUNE)(*SKIP)b|a+c/\n    aaaaaac\n 0: ac\n\n/-- Putting THEN in front makes no difference. --/\n\n/aaaaa(*THEN)(*SKIP)b|a+c/\n    aaaaaac\n 0: ac\n\n/-- In this case, neither does COMMIT. This still matches \"ac\". --/\n\n/aaaaa(*COMMIT)(*SKIP)b|a+c/\n    aaaaaac\n 0: ac\n    \n/-- This gives \"no match\", as expected. --/\n\n/aaaaa(*COMMIT)b|a+c/\n    aaaaaac\nNo match\n    \n\n/------ Tests using THEN ------/\n\n/-- This matches \"aaaaaac\", as expected. --/\n\n/aaaaa(*THEN)b|a+c/\n    aaaaaac\n 0: aaaaaac\n\n/-- Putting SKIP in front makes no difference. --/\n\n/aaaaa(*SKIP)(*THEN)b|a+c/\n    aaaaaac\n 0: aaaaaac\n    \n/-- Putting PRUNE in front makes no difference. --/\n\n/aaaaa(*PRUNE)(*THEN)b|a+c/\n    aaaaaac\n 0: aaaaaac\n    \n/-- Putting COMMIT in front makes no difference. --/\n\n/aaaaa(*COMMIT)(*THEN)b|a+c/\n    aaaaaac\n 0: aaaaaac\n    \n/-- End of \"priority\" tests --/ \n\n/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/\n    aaaaaa\n 0: a\n\n/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/\n    aaaaaa\n 0: a\n\n/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/\n    aaaaaa\n 0: aaaa\n\n/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/\n    aaaaaa\n 0: a\n\n/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/\n    aaaac\n 0: aac\n\n/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/\n    aaaac\n 0: ac\n\n/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/\n    aaaac\n 0: aac\n\n/aaa(*MARK:A)a(*SKIP:A)b|a+c/\n    aaaac\n 0: ac\n\n/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/K\n    aaaaaac\n 0: ac\n\n/.?(a|b(*THEN)c)/\n    ba\n 0: ba\n 1: a\n\n/(a(*COMMIT)b)c|abd/\n    abc\n 0: abc\n 1: ab\n    abd\nNo match\n\n/(?=a(*COMMIT)b)abc|abd/\n    abc\n 0: abc\n    abd\n 0: abd\n\n/(?>a(*COMMIT)b)c|abd/\n    abc\n 0: abc\n    abd\n 0: abd\n\n/a(?=b(*COMMIT)c)[^d]|abd/\n    abd\nNo match\n    abc \n 0: ab\n\n/a(?=bc).|abd/\n    abd\n 0: abd\n    abc \n 0: ab\n    \n/a(?>b(*COMMIT)c)d|abd/\n    abceabd \nNo match\n\n/a(?>bc)d|abd/\n    abceabd \n 0: abd\n\n/(?>a(*COMMIT)b)c|abd/\n    abd\n 0: abd\n\n/(?>a(*COMMIT)c)d|abd/\n    abd\nNo match\n\n/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/\n    ac \n 0: ac\n 1: <unset>\n 2: c\n    \n/-- These tests were formerly in test 2, but changes in PCRE and Perl have\n    made them compatible. --/\n    \n/^(a)?(?(1)a|b)+$/\n    *** Failers\nNo match\n    a\nNo match\n\n/(?=a\\Kb)ab/\n    ab \n 0: b\n\n/(?!a\\Kb)ac/\n    ac \n 0: ac\n    \n/^abc(?<=b\\Kc)d/\n    abcd\n 0: cd\n\n/^abc(?<!b\\Kq)d/\n    abcd\n 0: abcd\n\n\n/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/xK\n    AAAC\nNo match, mark = A\n\n/^((abc|abcx)(*THEN)y|abcd)/\n    abcd\n 0: abcd\n 1: abcd\n    *** Failers \nNo match\n    abcxy \nNo match\n    \n/^((yes|no)(*THEN)(*F))?/\n  yes\nNo match\n\n/(A (.*)   C? (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   C? (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   C? (*THEN)  | A D) \\s* (*FAIL)/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   C? (*THEN)  | A D) \\s* z/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   (?:C|) (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   (?:C|) (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   C{0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   C{0,6} (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   (CE){0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCEBefgBhiBqz\nNo match\n\n/(A (.*)   (CE){0,6} (*THEN)  | A D) z/x\nAbcdCEBefgBhiBqz\nNo match\n\n/(A (.*)   (CE*){0,6} (*THEN)  | A D) (*FAIL)/x\nAbcdCBefgBhiBqz\nNo match\n\n/(A (.*)   (CE*){0,6} (*THEN)  | A D) z/x\nAbcdCBefgBhiBqz\nNo match\n\n/(?=a(*COMMIT)b|ac)ac|ac/\n    ac\nNo match\n\n/(?=a(*COMMIT)b|(ac)) ac | (a)c/x\n    ac\nNo match\n\n/--------/\n\n/(?(?!b(*THEN)a)bn|bnn)/\n   bnn \n 0: bn\n\n/(?!b(*SKIP)a)bn|bnn/\n    bnn\n 0: bn\n    \n/(?(?!b(*SKIP)a)bn|bnn)/\n   bnn \n 0: bn\n\n/(?!b(*PRUNE)a)bn|bnn/\n    bnn\n 0: bn\n    \n/(?(?!b(*PRUNE)a)bn|bnn)/\n   bnn \n 0: bn\n   \n/(?!b(*COMMIT)a)bn|bnn/\n    bnn\n 0: bn\n    \n/(?(?!b(*COMMIT)a)bn|bnn)/\n   bnn \n 0: bn\n\n/(?=b(*SKIP)a)bn|bnn/\n    bnn\nNo match\n\n/(?=b(*THEN)a)bn|bnn/\n    bnn\n 0: bnn\n    \n /^(?!a(*SKIP)b)/\n     ac\n 0: \n\n /^(?!a(*SKIP)b)../\n     acd\n 0: ac\n\n/(?!a(*SKIP)b)../\n     acd\n 0: ac\n\n/^(?(?!a(*SKIP)b))/\n     ac\n 0: \n\n/^(?!a(*PRUNE)b)../\n     acd\n 0: ac\n\n/(?!a(*PRUNE)b)../\n     acd\n 0: ac\n\n /(?!a(*COMMIT)b)ac|cd/\n     ac\n 0: ac\n\n/\\A.*?(?:a|bc)/\n    ba\n 0: ba\n\n/^(A(*THEN)B|C(*THEN)D)/\n    CD           \n 0: CD\n 1: CD\n\n/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n 0: b\nMK: m(m\n\n/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n 0: b\nMK: m(m\n\n/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n 0: b\n\n/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/K\n    abc\n 0: b\nMK: m(m\n\n/^\\d*\\w{4}/\n    1234\n 0: 1234\n    123 \nNo match\n\n/^[^b]*\\w{4}/\n    aaaa\n 0: aaaa\n    aaa     \nNo match\n\n/^[^b]*\\w{4}/i\n    aaaa\n 0: aaaa\n    aaa     \nNo match\n\n/^a*\\w{4}/\n    aaaa\n 0: aaaa\n    aaa     \nNo match\n\n/^a*\\w{4}/i\n    aaaa\n 0: aaaa\n    aaa     \nNo match\n\n/(?(?=ab)ab)/+\n    ca\n 0: \n 0+ ca\n    cd \n 0: \n 0+ cd\n\n/(?:(?<n>foo)|(?<n>bar))\\k<n>/J\n    foofoo\n 0: foofoo\n 1: foo\n    barbar\n 0: barbar\n 1: <unset>\n 2: bar\n\n/(?<n>A)(?:(?<n>foo)|(?<n>bar))\\k<n>/J\n    AfooA\n 0: AfooA\n 1: A\n 2: foo\n    AbarA  \n 0: AbarA\n 1: A\n 2: <unset>\n 3: bar\n    ** Failers \nNo match\n    Afoofoo\nNo match\n    Abarbar\nNo match\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n 0: 1 IN SOA non-sp1 non-sp2(\n 1: 1\n 2: non-sp1\n 3: non-sp2\n\n/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/xJ\n    Ax\n 0: Ax\n 1: A\n    BAxy \n 0: BAxy\n 1: <unset>\n 2: B\n 3: A\n    \n/^A\\xZ/\n    A\\0Z \n 0: A\\x00Z\n\n/^A\\o{123}B/\n    A\\123B\n 0: ASB\n\n/ ^ a + + b $ /x\n    aaaab\n 0: aaaab\n    \n/ ^ a + #comment\n  + b $ /x\n    aaaab\n 0: aaaab\n    \n/ ^ a + #comment\n  #comment\n  + b $ /x\n    aaaab\n 0: aaaab\n    \n/ ^ (?> a + ) b $ /x\n    aaaab \n 0: aaaab\n\n/ ^ ( a + ) + + \\w $ /x\n    aaaab \n 0: aaaab\n 1: aaaa\n\n/(?:a\\Kb)*+/+\n    ababc\n 0: b\n 0+ c\n\n/(?>a\\Kb)*/+\n    ababc\n 0: b\n 0+ c\n\n/(?:a\\Kb)*/+\n    ababc\n 0: b\n 0+ c\n\n/(a\\Kb)*+/+\n    ababc\n 0: b\n 0+ c\n 1: ab\n\n/(a\\Kb)*/+\n    ababc\n 0: b\n 0+ c\n 1: ab\n\n/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/\n    acb\nNo match\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]*+|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")++\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n\n'\\A([^\\\"1]++|[\\\"2]([^\\\"3]*+|[\\\"4][\\\"5])*+[\\\"6])++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n 1:  AFTER \n 2: \n\n/^\\w+(?>\\s*)(?<=\\w)/\n  test test\n 0: tes\n\n/(?P<same>a)(?P<same>b)/gJ\n    abbaba\n 0: ab\n 1: a\n 2: b\n 0: ab\n 1: a\n 2: b\n\n/(?P<same>a)(?P<same>b)(?P=same)/gJ\n    abbaba\n 0: aba\n 1: a\n 2: b\n\n/(?P=same)?(?P<same>a)(?P<same>b)/gJ\n    abbaba\n 0: ab\n 1: a\n 2: b\n 0: ab\n 1: a\n 2: b\n\n/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/gJ\n    bbbaaabaabb\n 0: bbbaaaba\n 1: a\n 2: b\n 0: bb\n 1: <unset>\n 2: b\n\n/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/gJ\n    bbbaaaccccaaabbbcc\nNo match\n\n/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/\n    acl\n 0: acl\n 1: a\n    bdl\n 0: bdl\n 1: <unset>\n 2: b\n    adl\n 0: dl\n    bcl    \n 0: l\n\n/\\sabc/\n    \\x{0b}abc\n 0: \\x0babc\n\n/[\\Qa]\\E]+/\n    aa]]\n 0: aa]]\n\n/[\\Q]a\\E]+/\n    aa]]\n 0: aa]]\n\n/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/\n    1234abcd\n 0: \n 1: <unset>\n 2: <unset>\n 3: <unset>\n 4: <unset>\n 5: \n\n/(\\2)(\\1)/\n\n\"Z*(|d*){216}\"\n\n\"(?1)(?#?'){8}(a)\"\n    baaaaaaaaac\n 0: aaaaaaaaa\n 1: a\n\n\"(?|(\\k'Pm')|(?'Pm'))\"\n    abcd\n 0: \n 1: \n\n/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\\s])/\n    \\  Fred:099\n 0: \n\n/(?=.*X)X$/ \n    \\  X\n 0: X\n     \n/X+(?#comment)?/\n    >XXX<\n 0: X\n\n/   (?<word> \\w+ )*    \\.   /xi\n    pokus.\n 0: pokus.\n 1: pokus\n    \n/(?(DEFINE) (?<word> \\w+ ) ) (?&word)*   \\./xi\n    pokus.\n 0: pokus.\n\n/(?(DEFINE) (?<word> \\w+ ) ) ( (?&word)* )   \\./xi \n    pokus.\n 0: pokus.\n 1: <unset>\n 2: pokus\n\n/(?&word)*  (?(DEFINE) (?<word> \\w+ ) )  \\./xi\n    pokus.\n 0: pokus.\n\n/(?&word)*  \\. (?<word> \\w+ )/xi\n    pokus.hokus\n 0: pokus.hokus\n 1: hokus\n\n/-- End of testinput1 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput10",
    "content": "/-- This set of tests check Unicode property support with the DFA matching \n    functionality of pcre_dfa_exec(). The -dfa flag must be used with pcretest\n    when running it. --/\n\n/\\pL\\P{Nd}/8\n    AB\n 0: AB\n    *** Failers\n 0: Fa\n    A0\nNo match\n    00   \nNo match\n\n/\\X./8\n    AB\n 0: AB\n    A\\x{300}BC \n 0: A\\x{300}B\n    A\\x{300}\\x{301}\\x{302}BC \n 0: A\\x{300}\\x{301}\\x{302}B\n    *** Failers\n 0: **\n    \\x{300}  \nNo match\n\n/\\X\\X/8\n    ABC\n 0: AB\n    A\\x{300}B\\x{300}\\x{301}C \n 0: A\\x{300}B\\x{300}\\x{301}\n    A\\x{300}\\x{301}\\x{302}BC \n 0: A\\x{300}\\x{301}\\x{302}B\n    *** Failers\n 0: **\n    \\x{300}  \nNo match\n\n/^\\pL+/8\n    abcd\n 0: abcd\n    a \n 0: a\n    *** Failers \nNo match\n\n/^\\PL+/8\n    1234\n 0: 1234\n    = \n 0: =\n    *** Failers \n 0: *** \n    abcd \nNo match\n\n/^\\X+/8\n    abcdA\\x{300}\\x{301}\\x{302}\n 0: abcdA\\x{300}\\x{301}\\x{302}\n    A\\x{300}\\x{301}\\x{302}\n 0: A\\x{300}\\x{301}\\x{302}\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}\n 0: A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}\n    a \n 0: a\n    *** Failers \n 0: *** Failers\n    \\x{300}\\x{301}\\x{302}\n 0: \\x{300}\\x{301}\\x{302}\n\n/\\X?abc/8\n    abc\n 0: abc\n    A\\x{300}abc\n 0: A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n 0: A\\x{300}abc\n    \\x{300}abc  \n 0: \\x{300}abc\n    *** Failers\nNo match\n\n/^\\X?abc/8\n    abc\n 0: abc\n    A\\x{300}abc\n 0: A\\x{300}abc\n    *** Failers\nNo match\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\nNo match\n    \\x{300}abc  \n 0: \\x{300}abc\n\n/\\X*abc/8\n    abc\n 0: abc\n    A\\x{300}abc\n 0: A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n 0: A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abc\n    \\x{300}abc  \n 0: \\x{300}abc\n    *** Failers\nNo match\n\n/^\\X*abc/8\n    abc\n 0: abc\n    A\\x{300}abc\n 0: A\\x{300}abc\n    A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abcxyz\n 0: A\\x{300}\\x{301}\\x{302}A\\x{300}A\\x{300}A\\x{300}abc\n    *** Failers\nNo match\n    \\x{300}abc  \n 0: \\x{300}abc\n\n/^\\pL?=./8\n    A=b\n 0: A=b\n    =c \n 0: =c\n    *** Failers\nNo match\n    1=2 \nNo match\n    AAAA=b  \nNo match\n\n/^\\pL*=./8\n    AAAA=b\n 0: AAAA=b\n    =c \n 0: =c\n    *** Failers\nNo match\n    1=2  \nNo match\n\n/^\\X{2,3}X/8\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\n 0: A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X \n 0: A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\n    *** Failers\nNo match\n    X\nNo match\n    A\\x{300}\\x{301}\\x{302}X\nNo match\n    A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}A\\x{300}\\x{301}\\x{302}X\nNo match\n\n/^\\pC\\pL\\pM\\pN\\pP\\pS\\pZ</8\n    \\x7f\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n 0: \\x{7f}\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n    \\np\\x{300}9!\\$ < \n 0: \\x{0a}p\\x{300}9!$ <\n    ** Failers \nNo match\n    ap\\x{300}9!\\$ < \nNo match\n  \n/^\\PC/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x7f\nNo match\n  \n/^\\PL/8\n    9\n 0: 9\n    ** Failers \n 0: *\n    \\x{c0}\nNo match\n  \n/^\\PM/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{30f}\nNo match\n  \n/^\\PN/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{660}\nNo match\n  \n/^\\PP/8\n    X\n 0: X\n    ** Failers \nNo match\n    \\x{66c}\nNo match\n  \n/^\\PS/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{f01}\nNo match\n  \n/^\\PZ/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{1680}\nNo match\n    \n/^\\p{Cc}/8\n    \\x{017}\n 0: \\x{17}\n    \\x{09f} \n 0: \\x{9f}\n    ** Failers\nNo match\n    \\x{0600} \nNo match\n  \n/^\\p{Cf}/8\n    \\x{601}\n 0: \\x{601}\n    \\x{180e}\n 0: \\x{180e}\n    \\x{061c}\n 0: \\x{61c}\n    \\x{2066}\n 0: \\x{2066}\n    \\x{2067}\n 0: \\x{2067}\n    \\x{2068}\n 0: \\x{2068}\n    \\x{2069}\n 0: \\x{2069}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Cn}/8\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Co}/8\n    \\x{f8ff}\n 0: \\x{f8ff}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Cs}/8\n    \\?\\x{dfff}\n 0: \\x{dfff}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Ll}/8\n    a\n 0: a\n    ** Failers \nNo match\n    Z\nNo match\n    \\x{e000}  \nNo match\n  \n/^\\p{Lm}/8\n    \\x{2b0}\n 0: \\x{2b0}\n    ** Failers\nNo match\n    a \nNo match\n  \n/^\\p{Lo}/8\n    \\x{1bb}\n 0: \\x{1bb}\n    ** Failers\nNo match\n    a \nNo match\n    \\x{2b0}\nNo match\n  \n/^\\p{Lt}/8\n    \\x{1c5}\n 0: \\x{1c5}\n    ** Failers\nNo match\n    a \nNo match\n    \\x{2b0}\nNo match\n  \n/^\\p{Lu}/8\n    A\n 0: A\n    ** Failers\nNo match\n    \\x{2b0}\nNo match\n  \n/^\\p{Mc}/8\n    \\x{903}\n 0: \\x{903}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{300}\nNo match\n       \n/^\\p{Me}/8\n    \\x{488}\n 0: \\x{488}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{903}\nNo match\n    \\x{300}\nNo match\n  \n/^\\p{Mn}/8\n    \\x{300}\n 0: \\x{300}\n    \\x{1a1b}\n 0: \\x{1a1b}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{903}\nNo match\n  \n/^\\p{Nd}+/8O\n    0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\\x{66a}\n 0: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\n 1: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\n 2: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\n 3: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\n 4: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\n 5: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\n 6: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\n 7: 0123456789\\x{660}\\x{661}\\x{662}\n 8: 0123456789\\x{660}\\x{661}\n 9: 0123456789\\x{660}\n10: 0123456789\n11: 012345678\n12: 01234567\n13: 0123456\n14: 012345\n15: 01234\n16: 0123\n17: 012\n18: 01\n19: 0\n    \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\\x{6fa}\n 0: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\n 1: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\n 2: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\n 3: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\n 4: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\n 5: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\n 6: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\n 7: \\x{6f0}\\x{6f1}\\x{6f2}\n 8: \\x{6f0}\\x{6f1}\n 9: \\x{6f0}\n    \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\\x{970}\n 0: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\n 1: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\n 2: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\n 3: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\n 4: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\n 5: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\n 6: \\x{966}\\x{967}\\x{968}\\x{969}\n 7: \\x{966}\\x{967}\\x{968}\n 8: \\x{966}\\x{967}\n 9: \\x{966}\n    ** Failers\nNo match\n    X\nNo match\n  \n/^\\p{Nl}/8\n    \\x{16ee}\n 0: \\x{16ee}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{966}\nNo match\n  \n/^\\p{No}/8\n    \\x{b2}\n 0: \\x{b2}\n    \\x{b3}\n 0: \\x{b3}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{16ee}\nNo match\n  \n/^\\p{Pc}/8\n    \\x5f\n 0: _\n    \\x{203f}\n 0: \\x{203f}\n    ** Failers\nNo match\n    X\nNo match\n    -\nNo match\n    \\x{58a}\nNo match\n  \n/^\\p{Pd}/8\n    -\n 0: -\n    \\x{58a}\n 0: \\x{58a}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Pe}/8\n    )\n 0: )\n    ]\n 0: ]\n    }\n 0: }\n    \\x{f3b}\n 0: \\x{f3b}\n    \\x{2309}\n 0: \\x{2309}\n    \\x{230b}\n 0: \\x{230b}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n    (\nNo match\n    [\nNo match\n    {\nNo match\n    \\x{f3c}\nNo match\n\n/^\\p{Pf}/8\n    \\x{bb}\n 0: \\x{bb}\n    \\x{2019}\n 0: \\x{2019}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Pi}/8\n    \\x{ab}\n 0: \\x{ab}\n    \\x{2018}\n 0: \\x{2018}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Po}/8\n    !\n 0: !\n    \\x{37e}\n 0: \\x{37e}\n    ** Failers\n 0: *\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Ps}/8\n    (\n 0: (\n    [\n 0: [\n    {\n 0: {\n    \\x{f3c}\n 0: \\x{f3c}\n    \\x{2308}\n 0: \\x{2308}\n    \\x{230a}\n 0: \\x{230a}\n    ** Failers\nNo match\n    X\nNo match\n    )\nNo match\n    ]\nNo match\n    }\nNo match\n    \\x{f3b}\nNo match\n  \n/^\\p{Sc}+/8\n    $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\\x{a6}\n 0: $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\n    \\x{9f2}\n 0: \\x{9f2}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2c2}\nNo match\n  \n/^\\p{Sk}/8\n    \\x{2c2}\n 0: \\x{2c2}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{Sm}+/8\n    +<|~\\x{ac}\\x{2044}\n 0: +<|~\\x{ac}\\x{2044}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{So}/8\n    \\x{a6}\n 0: \\x{a6}\n    \\x{482} \n 0: \\x{482}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{Zl}/8\n    \\x{2028}\n 0: \\x{2028}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2029}\nNo match\n  \n/^\\p{Zp}/8\n    \\x{2029}\n 0: \\x{2029}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2028}\nNo match\n  \n/^\\p{Zs}/8\n    \\ \\\n 0:  \n    \\x{a0}\n 0: \\x{a0}\n    \\x{1680}\n 0: \\x{1680}\n    \\x{2000}\n 0: \\x{2000}\n    \\x{2001}     \n 0: \\x{2001}\n    ** Failers\nNo match\n    \\x{2028}\nNo match\n    \\x{200d} \nNo match\n  \n/\\p{Nd}+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n 2: \\x{660}\\x{661}\\x{662}\n  \n/\\p{Nd}+?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n 2: \\x{660}\\x{661}\\x{662}\n  \n/\\p{Nd}{2,}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n  \n/\\p{Nd}{2,}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n  \n/\\p{Nd}*(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n 2: \\x{660}\\x{661}\\x{662}\n 3: \\x{660}\\x{661}\n  \n/\\p{Nd}*?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n 2: \\x{660}\\x{661}\\x{662}\n 3: \\x{660}\\x{661}\n  \n/\\p{Nd}{2}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}A\n  \n/\\p{Nd}{2,3}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n  \n/\\p{Nd}{2,3}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: \\x{660}\\x{661}\\x{662}A\n  \n/\\p{Nd}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}\n 1: \\x{660}\\x{661}\n  \n/\\p{Nd}??(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}\n 1: \\x{660}\\x{661}\n  \n/\\p{Nd}*+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n  \n/\\p{Nd}*+(...)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}ABC\n  \n/\\p{Nd}*+(....)/8\n      ** Failers\n 0: ** F\n      \\x{660}\\x{661}\\x{662}ABC\nNo match\n  \n/\\p{Lu}/8i\n    A\n 0: A\n    a\\x{10a0}B \n 0: \\x{10a0}\n    ** Failers \n 0: F\n    a\nNo match\n    \\x{1d00}  \nNo match\n\n/\\p{^Lu}/8i\n    1234\n 0: 1\n    ** Failers\n 0: *\n    ABC \nNo match\n\n/\\P{Lu}/8i\n    1234\n 0: 1\n    ** Failers\n 0: *\n    ABC \nNo match\n\n/(?<=A\\p{Nd})XYZ/8\n    A2XYZ\n 0: XYZ\n    123A5XYZPQR\n 0: XYZ\n    ABA\\x{660}XYZpqr\n 0: XYZ\n    ** Failers\nNo match\n    AXYZ\nNo match\n    XYZ     \nNo match\n    \n/(?<!\\pL)XYZ/8\n    1XYZ\n 0: XYZ\n    AB=XYZ.. \n 0: XYZ\n    XYZ \n 0: XYZ\n    ** Failers\nNo match\n    WXYZ \nNo match\n\n/[\\p{Nd}]/8\n    1234\n 0: 1\n\n/[\\p{Nd}+-]+/8\n    1234\n 0: 1234\n    12-34\n 0: 12-34\n    12+\\x{661}-34  \n 0: 12+\\x{661}-34\n    ** Failers\nNo match\n    abcd  \nNo match\n\n/[\\P{Nd}]+/8\n    abcd\n 0: abcd\n    ** Failers\n 0: ** Failers\n    1234\nNo match\n\n/\\D+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n     \n/\\P{Nd}+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\P{Nd}]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D\\P{Nd}]+/8O\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\pL/8\n    a\n 0: a\n    A \n 0: A\n\n/\\pL/8i\n    a\n 0: a\n    A \n 0: A\n    \n/\\p{Lu}/8 \n    A\n 0: A\n    aZ\n 0: Z\n    ** Failers\n 0: F\n    abc   \nNo match\n\n/\\p{Lu}/8i\n    A\n 0: A\n    aZ\n 0: Z\n    ** Failers\n 0: F\n    abc   \nNo match\n\n/\\p{Ll}/8 \n    a\n 0: a\n    Az\n 0: z\n    ** Failers\n 0: a\n    ABC   \nNo match\n\n/\\p{Ll}/8i \n    a\n 0: a\n    Az\n 0: z\n    ** Failers\n 0: a\n    ABC   \nNo match\n\n/^\\x{c0}$/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/^\\x{e0}$/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    ** Failers\nNo match\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \nNo match\n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\nNo match\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8i\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n 0: a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{1044f}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/\\x{391}+/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n\n/\\x{391}{3,5}(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 1: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n 2: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\n\n/\\x{391}{3,5}?(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 1: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n 2: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\n\n/[\\x{391}\\x{ff3a}]/8i\n    \\x{391}\n 0: \\x{391}\n    \\x{ff3a}\n 0: \\x{ff3a}\n    \\x{3b1}\n 0: \\x{3b1}\n    \\x{ff5a}   \n 0: \\x{ff5a}\n    \n/[\\x{c0}\\x{391}]/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/[\\x{105}-\\x{109}]/8i\n    \\x{104}\n 0: \\x{104}\n    \\x{105}\n 0: \\x{105}\n    \\x{109}  \n 0: \\x{109}\n    ** Failers\nNo match\n    \\x{100}\nNo match\n    \\x{10a} \nNo match\n    \n/[z-\\x{100}]/8i \n    Z\n 0: Z\n    z\n 0: z\n    \\x{39c}\n 0: \\x{39c}\n    \\x{178}\n 0: \\x{178}\n    |\n 0: |\n    \\x{80}\n 0: \\x{80}\n    \\x{ff}\n 0: \\x{ff}\n    \\x{100}\n 0: \\x{100}\n    \\x{101} \n 0: \\x{101}\n    ** Failers\nNo match\n    \\x{102}\nNo match\n    Y\nNo match\n    y           \nNo match\n\n/[z-\\x{100}]/8i\n\n/^\\X/8\n    A\n 0: A\n    A\\x{300}BC \n 0: A\\x{300}\n    A\\x{300}\\x{301}\\x{302}BC \n 0: A\\x{300}\\x{301}\\x{302}\n    *** Failers\n 0: *\n    \\x{300}  \n 0: \\x{300}\n\n/^[\\X]/8\n    X123\n 0: X\n    *** Failers\nNo match\n    AXYZ\nNo match\n\n/^(\\X*)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BC\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BC\n\n/^(\\X*?)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BC\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BC\n\n/^(\\X*)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BCA\n 1: A\\x{300}\\x{301}\\x{302}BC\n 2: A\\x{300}\\x{301}\\x{302}B\n 3: A\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BCA\n 2: A\\x{300}\\x{301}\\x{302}BC\n 3: A\\x{300}\\x{301}\\x{302}B\n 4: A\n\n/^(\\X*?)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BCA\n 1: A\\x{300}\\x{301}\\x{302}BC\n 2: A\\x{300}\\x{301}\\x{302}B\n 3: A\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BCA\n 2: A\\x{300}\\x{301}\\x{302}BC\n 3: A\\x{300}\\x{301}\\x{302}B\n 4: A\n\n/^\\X(.)/8\n    *** Failers\n 0: **\n    A\\x{300}\\x{301}\\x{302}\nNo match\n\n/^\\X{2,3}(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n 0: A\\x{300}\\x{301}B\\x{300}C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 1: A\\x{300}\\x{301}B\\x{300}C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}D\n 1: A\\x{300}\\x{301}B\\x{300}C\n    \n/^\\X{2,3}?(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n 0: A\\x{300}\\x{301}B\\x{300}C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 1: A\\x{300}\\x{301}B\\x{300}C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}D\n 1: A\\x{300}\\x{301}B\\x{300}C\n\n/^\\pN{2,3}X/\n    12X\n 0: 12X\n    123X\n 0: 123X\n    *** Failers\nNo match\n    X\nNo match\n    1X\nNo match\n    1234X     \nNo match\n\n/\\x{100}/i8\n    \\x{100}   \n 0: \\x{100}\n    \\x{101} \n 0: \\x{101}\n    \n/^\\p{Han}+/8\n    \\x{2e81}\\x{3007}\\x{2f804}\\x{31a0}\n 0: \\x{2e81}\\x{3007}\\x{2f804}\n    ** Failers\nNo match\n    \\x{2e7f}  \nNo match\n\n/^\\P{Katakana}+/8\n    \\x{3105}\n 0: \\x{3105}\n    ** Failers\n 0: ** Failers\n    \\x{30ff}  \nNo match\n\n/^[\\p{Arabic}]/8\n    \\x{06e9}\n 0: \\x{6e9}\n    \\x{060b}\n 0: \\x{60b}\n    ** Failers\nNo match\n    X\\x{06e9}   \nNo match\n\n/^[\\P{Yi}]/8\n    \\x{2f800}\n 0: \\x{2f800}\n    ** Failers\n 0: *\n    \\x{a014}\nNo match\n    \\x{a4c6}   \nNo match\n\n/^\\p{Any}X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    X  \nNo match\n    \n/^\\P{Any}X/8\n    ** Failers\nNo match\n    AX\nNo match\n    \n/^\\p{Any}?X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    ABXYZ   \nNo match\n\n/^\\P{Any}?X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ \nNo match\n    ABXYZ   \nNo match\n\n/^\\p{Any}+X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n    XYZ\nNo match\n\n/^\\P{Any}+X/8\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n    XYZ\nNo match\n\n/^\\p{Any}*X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n\n/^\\P{Any}*X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n\n/^[\\p{Any}]X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    X  \nNo match\n    \n/^[\\P{Any}]X/8\n    ** Failers\nNo match\n    AX\nNo match\n    \n/^[\\p{Any}]?X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    ABXYZ   \nNo match\n\n/^[\\P{Any}]?X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ \nNo match\n    ABXYZ   \nNo match\n\n/^[\\p{Any}]+X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n    XYZ\nNo match\n\n/^[\\P{Any}]+X/8\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n    XYZ\nNo match\n\n/^[\\p{Any}]*X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n\n/^[\\P{Any}]*X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n\n/^\\p{Any}{3,5}?/8\n    abcdefgh\n 0: abcde\n 1: abcd\n 2: abc\n    \\x{1234}\\n\\r\\x{3456}xyz \n 0: \\x{1234}\\x{0a}\\x{0d}\\x{3456}x\n 1: \\x{1234}\\x{0a}\\x{0d}\\x{3456}\n 2: \\x{1234}\\x{0a}\\x{0d}\n\n/^\\p{Any}{3,5}/8\n    abcdefgh\n 0: abcde\n    \\x{1234}\\n\\r\\x{3456}xyz \n 0: \\x{1234}\\x{0a}\\x{0d}\\x{3456}x\n\n/^\\P{Any}{3,5}?/8\n    ** Failers\nNo match\n    abcdefgh\nNo match\n    \\x{1234}\\n\\r\\x{3456}xyz \nNo match\n\n/^\\p{L&}X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     \\x{1c5}XY\n 0: \\x{1c5}X\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     \\x{1c5}XY\n 0: \\x{1c5}X\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\p{L&}+X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n 1: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]+X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n 1: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\p{L&}+?X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n 1: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]+?X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n 1: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\P{L&}X/8\n     !XY\n 0: !X\n     \\x{1bb}XY\n 0: \\x{1bb}X\n     \\x{2b0}XY\n 0: \\x{2b0}X\n     ** Failers\nNo match\n     \\x{1c5}XY\nNo match\n     AXY      \nNo match\n\n/^[\\P{L&}]X/8\n     !XY\n 0: !X\n     \\x{1bb}XY\n 0: \\x{1bb}X\n     \\x{2b0}XY\n 0: \\x{2b0}X\n     ** Failers\nNo match\n     \\x{1c5}XY\nNo match\n     AXY      \nNo match\n\n/^\\x{023a}+?(\\x{0130}+)/8i\n  \\x{023a}\\x{2c65}\\x{0130}\n 0: \\x{23a}\\x{2c65}\\x{130}\n  \n/^\\x{023a}+([^X])/8i\n  \\x{023a}\\x{2c65}X\n 0: \\x{23a}\\x{2c65}\n \n/\\x{c0}+\\x{116}+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n 0: \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/[\\x{c0}\\x{116}]+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n 0: \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/Check property support in non-UTF-8 mode/\n \n/\\p{L}{4}/\n    123abcdefg\n 0: abcd\n    123abc\\xc4\\xc5zz\n 0: abc\\xc4\n\n/\\p{Carian}\\p{Cham}\\p{Kayah_Li}\\p{Lepcha}\\p{Lycian}\\p{Lydian}\\p{Ol_Chiki}\\p{Rejang}\\p{Saurashtra}\\p{Sundanese}\\p{Vai}/8\n    \\x{102A4}\\x{AA52}\\x{A91D}\\x{1C46}\\x{10283}\\x{1092E}\\x{1C6B}\\x{A93B}\\x{A8BF}\\x{1BA0}\\x{A50A}====\n 0: \\x{102a4}\\x{aa52}\\x{a91d}\\x{1c46}\\x{10283}\\x{1092e}\\x{1c6b}\\x{a93b}\\x{a8bf}\\x{1ba0}\\x{a50a}\n\n/\\x{a77d}\\x{1d79}/8i\n    \\x{a77d}\\x{1d79}\n 0: \\x{a77d}\\x{1d79}\n    \\x{1d79}\\x{a77d} \n 0: \\x{1d79}\\x{a77d}\n\n/\\x{a77d}\\x{1d79}/8\n    \\x{a77d}\\x{1d79}\n 0: \\x{a77d}\\x{1d79}\n    ** Failers \nNo match\n    \\x{1d79}\\x{a77d} \nNo match\n\n/^\\p{Xan}/8\n    ABCD\n 0: A\n    1234\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^\\p{Xan}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^\\p{Xan}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^\\p{Xan}{2,9}/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\n    \n/^[\\p{Xan}]/8\n    ABCD1234_\n 0: A\n    1234abcd_\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n \n/^[\\p{Xan}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^>\\p{Xsp}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n    ** Failers\nNo match\n    \\x{0b} \nNo match\n\n/^>\\p{Xsp}+/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 1: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\n 2: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\n 3: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\n 4: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\n 5: > \\x{09}\\x{0a}\\x{0c}\n 6: > \\x{09}\\x{0a}\n 7: > \\x{09}\n 8: > \n\n/^>\\p{Xsp}*/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 1: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\n 2: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\n 3: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\n 4: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\n 5: > \\x{09}\\x{0a}\\x{0c}\n 6: > \\x{09}\\x{0a}\n 7: > \\x{09}\n 8: > \n 9: >\n    \n/^>\\p{Xsp}{2,9}/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 1: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\n 2: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\n 3: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\n 4: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\n 5: > \\x{09}\\x{0a}\\x{0c}\n 6: > \\x{09}\\x{0a}\n 7: > \\x{09}\n    \n/^>[\\p{Xsp}]/8O\n    >\\x{2028}\\x{0b}\n 0: >\\x{2028}\n \n/^>[\\p{Xsp}]+/8O\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 1: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\n 2: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\n 3: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\n 4: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\n 5: > \\x{09}\\x{0a}\\x{0c}\n 6: > \\x{09}\\x{0a}\n 7: > \\x{09}\n 8: > \n\n/^>\\p{Xps}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n    >\\x{a0} \n 0: >\\x{a0}\n    ** Failers\nNo match\n    \\x{0b} \nNo match\n\n/^>\\p{Xps}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\\x{2028}\\x{0b}\n 1: >\\x{1680}\\x{2028}\n 2: >\\x{1680}\n\n/^>\\p{Xps}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 1: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\n 2: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\n 3: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\n 4: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\n 5: > \\x{09}\\x{0a}\\x{0c}\n 6: > \\x{09}\\x{0a}\n 7: > \\x{09}\n    \n/^>[\\p{Xps}]/8\n    >\\x{2028}\\x{0b}\n 0: >\\x{2028}\n \n/^>[\\p{Xps}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^\\p{Xwd}/8\n    ABCD\n 0: A\n    1234\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}\n 0: \\x{10a7}\n    _ABC    \n 0: _\n    ** Failers\nNo match\n    [] \nNo match\n\n/^\\p{Xwd}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xwd}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xwd}{2,9}/8\n    A_12\\x{6ca}\\x{a6c}\\x{10a7}\n 0: A_12\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^[\\p{Xwd}]/8\n    ABCD1234_\n 0: A\n    1234abcd_\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    _ABC \n 0: _\n    ** Failers\nNo match\n    []   \nNo match\n \n/^[\\p{Xwd}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/-- Unicode properties for \\b abd \\B --/\n\n/\\b...\\B/8W\n    abc_\n 0: abc\n    \\x{37e}abc\\x{376} \n 0: abc\n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n 0: \\x{376}\\x{371}\\x{393}\n    !\\x{c0}++\\x{c1}\\x{c2} \n 0: ++\\x{c1}\n    !\\x{c0}+++++ \n 0: \\x{c0}++\n\n/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/\n\n/\\b...\\B/8\n    abc_\n 0: abc\n    ** Failers \n 0: Fai\n    \\x{37e}abc\\x{376} \nNo match\n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \nNo match\n    !\\x{c0}++\\x{c1}\\x{c2} \nNo match\n    !\\x{c0}+++++ \nNo match\n\n/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/\n\n/\\b...\\B/W\n    abc_\n 0: abc\n    !\\x{c0}++\\x{c1}\\x{c2} \n 0: ++\\xc1\n    !\\x{c0}+++++ \n 0: \\xc0++\n    \n/-- Caseless single negated characters > 127 need UCP support --/\n\n/[^\\x{100}]/8i\n    \\x{100}\\x{101}X\n 0: X\n\n/[^\\x{100}]+/8i\n    \\x{100}\\x{101}XX\n 0: XX\n\n/^\\X/8\n    A\\P\n 0: A\n    A\\P\\P \nPartial match: A\n    A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}\n    A\\x{301}\\P\n 0: A\\x{301}\n    A\\x{301}\\P\\P  \nPartial match: A\\x{301}\n    \n/^\\X{2,3}/8\n    A\\P\nPartial match: A\n    A\\P\\P \nPartial match: A\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n    A\\x{300}\\x{301}\\P\nPartial match: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}A\\x{300}\\x{301}\n\n/^\\X{2}/8\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    \n/^\\X+/8\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n\n/^\\X+?Z/8\n    AA\\P\nPartial match: AA\n    AA\\P\\P \nPartial match: AA\n\n/-- These are tests for extended grapheme clusters --/ \n\n/^\\X/8+\n    G\\x{34e}\\x{34e}X\n 0: G\\x{34e}\\x{34e}\n 0+ X\n    \\x{34e}\\x{34e}X\n 0: \\x{34e}\\x{34e}\n 0+ X\n    \\x04X\n 0: \\x{04}\n 0+ X\n    \\x{1100}X\n 0: \\x{1100}\n 0+ X\n    \\x{1100}\\x{34e}X\n 0: \\x{1100}\\x{34e}\n 0+ X\n    \\x{1b04}\\x{1b04}X \n 0: \\x{1b04}\\x{1b04}\n 0+ X\n    *These match up to the roman letters\n 0: *\n 0+ These match up to the roman letters\n    \\x{1111}\\x{1111}L,L\n 0: \\x{1111}\\x{1111}\n 0+ L,L\n    \\x{1111}\\x{1111}\\x{1169}L,L,V\n 0: \\x{1111}\\x{1111}\\x{1169}\n 0+ L,L,V\n    \\x{1111}\\x{ae4c}L, LV\n 0: \\x{1111}\\x{ae4c}\n 0+ L, LV\n    \\x{1111}\\x{ad89}L, LVT\n 0: \\x{1111}\\x{ad89}\n 0+ L, LVT\n    \\x{1111}\\x{ae4c}\\x{1169}L, LV, V\n 0: \\x{1111}\\x{ae4c}\\x{1169}\n 0+ L, LV, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}L, LV, V, V\n 0: \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}\n 0+ L, LV, V, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}L, LV, V, T\n 0: \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}\n 0+ L, LV, V, T\n    \\x{1111}\\x{ad89}\\x{11fe}L, LVT, T\n 0: \\x{1111}\\x{ad89}\\x{11fe}\n 0+ L, LVT, T\n    \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}L, LVT, T, T\n 0: \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}\n 0+ L, LVT, T, T\n    \\x{ad89}\\x{11fe}\\x{11fe}LVT, T, T\n 0: \\x{ad89}\\x{11fe}\\x{11fe}\n 0+ LVT, T, T\n    *These match just the first codepoint (invalid sequence)\n 0: *\n 0+ These match just the first codepoint (invalid sequence)\n    \\x{1111}\\x{11fe}L, T\n 0: \\x{1111}\n 0+ \\x{11fe}L, T\n    \\x{ae4c}\\x{1111}LV, L\n 0: \\x{ae4c}\n 0+ \\x{1111}LV, L\n    \\x{ae4c}\\x{ae4c}LV, LV\n 0: \\x{ae4c}\n 0+ \\x{ae4c}LV, LV\n    \\x{ae4c}\\x{ad89}LV, LVT\n 0: \\x{ae4c}\n 0+ \\x{ad89}LV, LVT\n    \\x{1169}\\x{1111}V, L\n 0: \\x{1169}\n 0+ \\x{1111}V, L\n    \\x{1169}\\x{ae4c}V, LV\n 0: \\x{1169}\n 0+ \\x{ae4c}V, LV\n    \\x{1169}\\x{ad89}V, LVT\n 0: \\x{1169}\n 0+ \\x{ad89}V, LVT\n    \\x{ad89}\\x{1111}LVT, L\n 0: \\x{ad89}\n 0+ \\x{1111}LVT, L\n    \\x{ad89}\\x{1169}LVT, V\n 0: \\x{ad89}\n 0+ \\x{1169}LVT, V\n    \\x{ad89}\\x{ae4c}LVT, LV\n 0: \\x{ad89}\n 0+ \\x{ae4c}LVT, LV\n    \\x{ad89}\\x{ad89}LVT, LVT\n 0: \\x{ad89}\n 0+ \\x{ad89}LVT, LVT\n    \\x{11fe}\\x{1111}T, L\n 0: \\x{11fe}\n 0+ \\x{1111}T, L\n    \\x{11fe}\\x{1169}T, V\n 0: \\x{11fe}\n 0+ \\x{1169}T, V\n    \\x{11fe}\\x{ae4c}T, LV\n 0: \\x{11fe}\n 0+ \\x{ae4c}T, LV\n    \\x{11fe}\\x{ad89}T, LVT\n 0: \\x{11fe}\n 0+ \\x{ad89}T, LVT\n    *Test extend and spacing mark\n 0: *\n 0+ Test extend and spacing mark\n    \\x{1111}\\x{ae4c}\\x{0711}L, LV, extend\n 0: \\x{1111}\\x{ae4c}\\x{711}\n 0+ L, LV, extend\n    \\x{1111}\\x{ae4c}\\x{1b04}L, LV, spacing mark\n 0: \\x{1111}\\x{ae4c}\\x{1b04}\n 0+ L, LV, spacing mark\n    \\x{1111}\\x{ae4c}\\x{1b04}\\x{0711}\\x{1b04}L, LV, spacing mark, extend, spacing mark\n 0: \\x{1111}\\x{ae4c}\\x{1b04}\\x{711}\\x{1b04}\n 0+ L, LV, spacing mark, extend, spacing mark\n    *Test CR, LF, and control\n 0: *\n 0+ Test CR, LF, and control\n    \\x0d\\x{0711}CR, extend\n 0: \\x{0d}\n 0+ \\x{711}CR, extend\n    \\x0d\\x{1b04}CR, spacingmark\n 0: \\x{0d}\n 0+ \\x{1b04}CR, spacingmark\n    \\x0a\\x{0711}LF, extend\n 0: \\x{0a}\n 0+ \\x{711}LF, extend\n    \\x0a\\x{1b04}LF, spacingmark\n 0: \\x{0a}\n 0+ \\x{1b04}LF, spacingmark\n    \\x0b\\x{0711}Control, extend\n 0: \\x{0b}\n 0+ \\x{711}Control, extend\n    \\x09\\x{1b04}Control, spacingmark\n 0: \\x{09}\n 0+ \\x{1b04}Control, spacingmark\n    *There are no Prepend characters, so we can't test Prepend, CR\n 0: *\n 0+ There are no Prepend characters, so we can't test Prepend, CR\n    \n/^(?>\\X{2})X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \n/^\\X{2,4}X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n\n/^\\X{2,4}?X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n\n/-- --/\n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/[z\\x{1e9e}]+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/[z\\x{00df}]+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/[z\\x{1f88}]+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/-- Perl matches these --/\n\n/\\x{00b5}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/\\x{039c}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/\\x{03bc}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n\n/\\x{00c5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/\\x{00e5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/\\x{212b}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n\n/\\x{01c4}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/\\x{01c5}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/\\x{01c6}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n\n/\\x{01c7}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/\\x{01c8}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/\\x{01c9}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n\n/\\x{01ca}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/\\x{01cb}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/\\x{01cc}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n\n/\\x{01f1}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/\\x{01f2}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/\\x{01f3}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n\n/\\x{0345}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{0399}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{03b9}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{1fbe}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n\n/\\x{0392}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/\\x{03b2}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/\\x{03d0}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n    \n\n/\\x{0395}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/\\x{03b5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/\\x{03f5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n\n/\\x{0398}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03b8}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03d1}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03f4}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n    \n\n/\\x{039a}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/\\x{03ba}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/\\x{03f0}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n    \n\n/\\x{03a0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/\\x{03c0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/\\x{03d6}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n\n/\\x{03a1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/\\x{03c1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/\\x{03f1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n\n/\\x{03a3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/\\x{03c2}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/\\x{03c3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n    \n\n/\\x{03a6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/\\x{03c6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/\\x{03d5}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n\n/\\x{03c9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/\\x{03a9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/\\x{2126}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n    \n\n/\\x{1e60}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e61}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e9b}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n    \n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n    \n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/\\x{1f80}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/\\x{004b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/\\x{006b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/\\x{212a}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n\n/\\x{0053}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/\\x{0073}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/\\x{017f}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/ist/8i\n    ikt\nNo match\n\n/is+t/8i\n    iSs\\x{17f}t\n 0: iSs\\x{17f}t\n    ikt\nNo match\n\n/is+?t/8i\n    ikt\nNo match\n\n/is?t/8i\n    ikt\nNo match\n\n/is{2}t/8i\n    iskt\nNo match\n\n/^\\p{Xuc}/8\n    $abc\n 0: $\n    @abc\n 0: @\n    `abc\n 0: `\n    \\x{1234}abc\n 0: \\x{1234}\n    ** Failers\nNo match\n    abc     \nNo match\n\n/^\\p{Xuc}+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}+?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n 1: $@`\\x{a0}\\x{1234}\n 2: $@`\\x{a0}\n 3: $@`\n 4: $@\n 5: $\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}+?\\*/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}*\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}++/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}{3,5}/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}{3,5}?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\n 1: $@`\\x{a0}\n 2: $@`\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^[\\p{Xuc}]/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^[\\p{Xuc}]+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\P{Xuc}/8\n    abc\n 0: a\n    ** Failers\n 0: *\n    $abc\nNo match\n    @abc\nNo match\n    `abc\nNo match\n    \\x{1234}abc\nNo match\n\n/^[\\P{Xuc}]/8\n    abc\n 0: a\n    ** Failers\n 0: *\n    $abc\nNo match\n    @abc\nNo match\n    `abc\nNo match\n    \\x{1234}abc\nNo match\n\n/^A\\s+Z/8W\n    A\\x{2005}Z\n 0: A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n 0: A\\x{85}\\x{180e}\\x{2005}Z\n\n/^A[\\s]+Z/8W\n    A\\x{2005}Z\n 0: A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n 0: A\\x{85}\\x{180e}\\x{2005}Z\n\n/-- End of testinput10 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testoutput11-16",
    "content": "/-- These are a few representative patterns whose lengths and offsets are to be \nshown when the link size is 2. This is just a doublecheck test to ensure the \nsizes don't go horribly wrong when something is changed. The pattern contents \nare all themselves checked in other tests. Unicode, including property support, \nis required for these tests. --/\n\n/((?i)b)/BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2   5 CBra 1\n  5  /i b\n  7   5 Ket\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/(?s)(.*X|^B)/BM\nMemory allocation (code space): 38\n------------------------------------------------------------------\n  0  16 Bra\n  2   7 CBra 1\n  5     AllAny*\n  7     X\n  9   5 Alt\n 11     ^\n 12     B\n 14  12 Ket\n 16  16 Ket\n 18     End\n------------------------------------------------------------------\n\n/(?s:.*X|^B)/BM\nMemory allocation (code space): 36\n------------------------------------------------------------------\n  0  15 Bra\n  2   6 Bra\n  4     AllAny*\n  6     X\n  8   5 Alt\n 10     ^\n 11     B\n 13  11 Ket\n 15  15 Ket\n 17     End\n------------------------------------------------------------------\n\n/^[[:alnum:]]/BM\nMemory allocation (code space): 46\n------------------------------------------------------------------\n  0  20 Bra\n  2     ^\n  3     [0-9A-Za-z]\n 20  20 Ket\n 22     End\n------------------------------------------------------------------\n\n/#/IxMD\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   2 Bra\n  2   2 Ket\n  4     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nOptions: extended\nNo first char\nNo need char\n\n/a#/IxMD\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a'\nNo need char\n\n/x?+/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     x?+\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/x++/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     x++\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/x{1,3}+/BM \nMemory allocation (code space): 20\n------------------------------------------------------------------\n  0   7 Bra\n  2     x\n  4     x{0,2}+\n  7   7 Ket\n  9     End\n------------------------------------------------------------------\n\n/(x)*+/BM\nMemory allocation (code space): 26\n------------------------------------------------------------------\n  0  10 Bra\n  2     Braposzero\n  3   5 CBraPos 1\n  6     x\n  8   5 KetRpos\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/BM\nMemory allocation (code space): 142\n------------------------------------------------------------------\n  0  68 Bra\n  2     ^\n  3  63 CBra 1\n  6   5 CBra 2\n  9     a+\n 11   5 Ket\n 13  21 CBra 3\n 16     [ab]+?\n 34  21 Ket\n 36  21 CBra 4\n 39     [bc]+\n 57  21 Ket\n 59   5 CBra 5\n 62     \\w*+\n 64   5 Ket\n 66  63 Ket\n 68  68 Ket\n 70     End\n------------------------------------------------------------------\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 1648\n------------------------------------------------------------------\n  0 821 Bra\n  2     8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n820     \\b\n821 821 Ket\n823     End\n------------------------------------------------------------------\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 1628\n------------------------------------------------------------------\n  0 811 Bra\n  2     $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n810     \\b\n811 811 Ket\n813     End\n------------------------------------------------------------------\n\n/(a(?1)b)/BM\nMemory allocation (code space): 32\n------------------------------------------------------------------\n  0  13 Bra\n  2   9 CBra 1\n  5     a\n  7   2 Recurse\n  9     b\n 11   9 Ket\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/(a(?1)+b)/BM\nMemory allocation (code space): 40\n------------------------------------------------------------------\n  0  17 Bra\n  2  13 CBra 1\n  5     a\n  7   4 Once\n  9   2 Recurse\n 11   4 KetRmax\n 13     b\n 15  13 Ket\n 17  17 Ket\n 19     End\n------------------------------------------------------------------\n\n/a(?P<name1>b|c)d(?P<longername2>e)/BM\nMemory allocation (code space): 80\n------------------------------------------------------------------\n  0  24 Bra\n  2     a\n  4   5 CBra 1\n  7     b\n  9   4 Alt\n 11     c\n 13   9 Ket\n 15     d\n 17   5 CBra 2\n 20     e\n 22   5 Ket\n 24  24 Ket\n 26     End\n------------------------------------------------------------------\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM\nMemory allocation (code space): 73\n------------------------------------------------------------------\n  0  29 Bra\n  2  18 Bra\n  4     a\n  6  12 CBra 1\n  9     c\n 11   5 CBra 2\n 14     d\n 16   5 Ket\n 18  12 Ket\n 20  18 Ket\n 22   5 CBra 3\n 25     a\n 27   5 Ket\n 29  29 Ket\n 31     End\n------------------------------------------------------------------\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/BM\nMemory allocation (code space): 93\n------------------------------------------------------------------\n  0  24 Bra\n  2   5 CBra 1\n  5     a\n  7   5 Ket\n  9     Any\n 10     Any\n 11     Any\n 12     \\1\n 14     bbb\n 20   2 Recurse\n 22     d\n 24  24 Ket\n 26     End\n------------------------------------------------------------------\n\n/abc(?C255)de(?C)f/BM\nMemory allocation (code space): 50\n------------------------------------------------------------------\n  0  22 Bra\n  2     abc\n  8     Callout 255 10 1\n 12     de\n 16     Callout 0 16 1\n 20     f\n 22  22 Ket\n 24     End\n------------------------------------------------------------------\n\n/abcde/CBM\nMemory allocation (code space): 78\n------------------------------------------------------------------\n  0  36 Bra\n  2     Callout 255 0 1\n  6     a\n  8     Callout 255 1 1\n 12     b\n 14     Callout 255 2 1\n 18     c\n 20     Callout 255 3 1\n 24     d\n 26     Callout 255 4 1\n 30     e\n 32     Callout 255 5 0\n 36  36 Ket\n 38     End\n------------------------------------------------------------------\n\n/\\x{100}/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{1000}/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{1000}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{10000}/8BM\nMemory allocation (code space): 16\n------------------------------------------------------------------\n  0   5 Bra\n  2     \\x{10000}\n  5   5 Ket\n  7     End\n------------------------------------------------------------------\n\n/\\x{100000}/8BM\nMemory allocation (code space): 16\n------------------------------------------------------------------\n  0   5 Bra\n  2     \\x{100000}\n  5   5 Ket\n  7     End\n------------------------------------------------------------------\n\n/\\x{10ffff}/8BM\nMemory allocation (code space): 16\n------------------------------------------------------------------\n  0   5 Bra\n  2     \\x{10ffff}\n  5   5 Ket\n  7     End\n------------------------------------------------------------------\n\n/\\x{110000}/8BM\nFailed: character value in \\x{} or \\o{} is too large at offset 9\n\n/[\\x{ff}]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{ff}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x80/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x80\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\xff/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{ff}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/D8M\nMemory allocation (code space): 26\n------------------------------------------------------------------\n  0  10 Bra\n  2     A\\x{2262}\\x{391}.\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = '.'\n    \n/\\x{D55c}\\x{ad6d}\\x{C5B4}/D8M \nMemory allocation (code space): 22\n------------------------------------------------------------------\n  0   8 Bra\n  2     \\x{d55c}\\x{ad6d}\\x{c5b4}\n  8   8 Ket\n 10     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d55c}\nNeed char = \\x{c5b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/D8M\nMemory allocation (code space): 22\n------------------------------------------------------------------\n  0   8 Bra\n  2     \\x{65e5}\\x{672c}\\x{8a9e}\n  8   8 Ket\n 10     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{65e5}\nNeed char = \\x{8a9e}\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[Z\\x{100}]/8BM\nMemory allocation (code space): 54\n------------------------------------------------------------------\n  0  24 Bra\n  2     [Z\\x{100}]\n 24  24 Ket\n 26     End\n------------------------------------------------------------------\n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/B8M\nMemory allocation (code space): 26\n------------------------------------------------------------------\n  0  10 Bra\n  2     ^\n  3     [\\x{100}-\\x{150}]\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E]/B8M\nMemory allocation (code space): 26\n------------------------------------------------------------------\n  0  10 Bra\n  2     ^\n  3     [\\x{100}-\\x{150}]\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E/B8M\nFailed: missing terminating ] for character class at offset 13\n\n/[\\p{L}]/BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\p{^L}]/BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\P{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\P{L}]/BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\P{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\P{^L}]/BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[abc\\p{L}\\x{0660}]/8BM\nMemory allocation (code space): 60\n------------------------------------------------------------------\n  0  27 Bra\n  2     [a-c\\p{L}\\x{660}]\n 27  27 Ket\n 29     End\n------------------------------------------------------------------\n\n/[\\p{Nd}]/8BM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{Nd}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\p{Nd}+-]+/8BM\nMemory allocation (code space): 58\n------------------------------------------------------------------\n  0  26 Bra\n  2     [+\\-\\p{Nd}]++\n 26  26 Ket\n 28     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iBM\nMemory allocation (code space): 32\n------------------------------------------------------------------\n  0  13 Bra\n  2  /i A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8BM\nMemory allocation (code space): 32\n------------------------------------------------------------------\n  0  13 Bra\n  2     A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/[\\x{105}-\\x{109}]/8iBM\nMemory allocation (code space): 24\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\x{104}-\\x{109}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/( ( (?(1)0|) )*   )/xBM\nMemory allocation (code space): 52\n------------------------------------------------------------------\n  0  23 Bra\n  2  19 CBra 1\n  5     Brazero\n  6  13 SCBra 2\n  9   6 Cond\n 11   1 Cond ref\n 13     0\n 15   2 Alt\n 17   8 Ket\n 19  13 KetRmax\n 21  19 Ket\n 23  23 Ket\n 25     End\n------------------------------------------------------------------\n\n/(  (?(1)0|)*   )/xBM\nMemory allocation (code space): 42\n------------------------------------------------------------------\n  0  18 Bra\n  2  14 CBra 1\n  5     Brazero\n  6   6 SCond\n  8   1 Cond ref\n 10     0\n 12   2 Alt\n 14   8 KetRmax\n 16  14 Ket\n 18  18 Ket\n 20     End\n------------------------------------------------------------------\n\n/[a]/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[a]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\xaa]/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{aa}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\xaa]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{aa}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^a]/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^a]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^a]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^a]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\xaa]/BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^\\x{aa}]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\xaa]/8BM\nMemory allocation (code space): 14\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^\\x{aa}]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\d]/8WB\n------------------------------------------------------------------\n  0   9 Bra\n  2     [^\\p{Nd}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[[:^alpha:][:^cntrl:]]+/8WB\n------------------------------------------------------------------\n  0  30 Bra\n  2     [ -~\\x80-\\xff\\P{L}\\x{100}-\\x{10ffff}]++\n 30  30 Ket\n 32     End\n------------------------------------------------------------------\n\n/[[:^cntrl:][:^alpha:]]+/8WB\n------------------------------------------------------------------\n  0  30 Bra\n  2     [ -~\\x80-\\xff\\x{100}-\\x{10ffff}\\P{L}]++\n 30  30 Ket\n 32     End\n------------------------------------------------------------------\n\n/[[:alpha:]]+/8WB\n------------------------------------------------------------------\n  0  10 Bra\n  2     [\\p{L}]++\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/[[:^alpha:]\\S]+/8WB\n------------------------------------------------------------------\n  0  13 Bra\n  2     [\\P{L}\\P{Xsp}]++\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B\n------------------------------------------------------------------\n  0  60 Bra\n  2     abc\n  8   5 CBra 1\n 11     d\n 13   4 Alt\n 15     e\n 17   9 Ket\n 19     *THEN\n 20     x\n 22  12 CBra 2\n 25     123\n 31     *THEN\n 32     4\n 34  24 Alt\n 36     567\n 42   5 CBra 3\n 45     b\n 47   4 Alt\n 49     q\n 51   9 Ket\n 53     *THEN\n 54     xx\n 58  36 Ket\n 60  60 Ket\n 62     End\n------------------------------------------------------------------\n\n/(((a\\2)|(a*)\\g<-1>))*a?/B\n------------------------------------------------------------------\n  0  39 Bra\n  2     Brazero\n  3  32 SCBra 1\n  6  27 Once\n  8  12 CBra 2\n 11   7 CBra 3\n 14     a\n 16     \\2\n 18   7 Ket\n 20  11 Alt\n 22   5 CBra 4\n 25     a*\n 27   5 Ket\n 29  22 Recurse\n 31  23 Ket\n 33  27 Ket\n 35  32 KetRmax\n 37     a?+\n 39  39 Ket\n 41     End\n------------------------------------------------------------------\n\n/((?+1)(\\1))/B\n------------------------------------------------------------------\n  0  20 Bra\n  2  16 Once\n  4  12 CBra 1\n  7   9 Recurse\n  9   5 CBra 2\n 12     \\1\n 14   5 Ket\n 16  12 Ket\n 18  16 Ket\n 20  20 Ket\n 22     End\n------------------------------------------------------------------\n\n/.((?2)(?R)\\1)()/B\n------------------------------------------------------------------\n  0  23 Bra\n  2     Any\n  3  13 Once\n  5   9 CBra 1\n  8  18 Recurse\n 10   0 Recurse\n 12     \\1\n 14   9 Ket\n 16  13 Ket\n 18   3 CBra 2\n 21   3 Ket\n 23  23 Ket\n 25     End\n------------------------------------------------------------------\n\n/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/\nFailed: regular expression is too complicated at offset 490\n\n/-- End of testinput11 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput11-32",
    "content": "/-- These are a few representative patterns whose lengths and offsets are to be \nshown when the link size is 2. This is just a doublecheck test to ensure the \nsizes don't go horribly wrong when something is changed. The pattern contents \nare all themselves checked in other tests. Unicode, including property support, \nis required for these tests. --/\n\n/((?i)b)/BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2   5 CBra 1\n  5  /i b\n  7   5 Ket\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/(?s)(.*X|^B)/BM\nMemory allocation (code space): 76\n------------------------------------------------------------------\n  0  16 Bra\n  2   7 CBra 1\n  5     AllAny*\n  7     X\n  9   5 Alt\n 11     ^\n 12     B\n 14  12 Ket\n 16  16 Ket\n 18     End\n------------------------------------------------------------------\n\n/(?s:.*X|^B)/BM\nMemory allocation (code space): 72\n------------------------------------------------------------------\n  0  15 Bra\n  2   6 Bra\n  4     AllAny*\n  6     X\n  8   5 Alt\n 10     ^\n 11     B\n 13  11 Ket\n 15  15 Ket\n 17     End\n------------------------------------------------------------------\n\n/^[[:alnum:]]/BM\nMemory allocation (code space): 60\n------------------------------------------------------------------\n  0  12 Bra\n  2     ^\n  3     [0-9A-Za-z]\n 12  12 Ket\n 14     End\n------------------------------------------------------------------\n\n/#/IxMD\nMemory allocation (code space): 20\n------------------------------------------------------------------\n  0   2 Bra\n  2   2 Ket\n  4     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nOptions: extended\nNo first char\nNo need char\n\n/a#/IxMD\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a'\nNo need char\n\n/x?+/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     x?+\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/x++/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     x++\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/x{1,3}+/BM \nMemory allocation (code space): 40\n------------------------------------------------------------------\n  0   7 Bra\n  2     x\n  4     x{0,2}+\n  7   7 Ket\n  9     End\n------------------------------------------------------------------\n\n/(x)*+/BM\nMemory allocation (code space): 52\n------------------------------------------------------------------\n  0  10 Bra\n  2     Braposzero\n  3   5 CBraPos 1\n  6     x\n  8   5 KetRpos\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/BM\nMemory allocation (code space): 220\n------------------------------------------------------------------\n  0  52 Bra\n  2     ^\n  3  47 CBra 1\n  6   5 CBra 2\n  9     a+\n 11   5 Ket\n 13  13 CBra 3\n 16     [ab]+?\n 26  13 Ket\n 28  13 CBra 4\n 31     [bc]+\n 41  13 Ket\n 43   5 CBra 5\n 46     \\w*+\n 48   5 Ket\n 50  47 Ket\n 52  52 Ket\n 54     End\n------------------------------------------------------------------\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 3296\n------------------------------------------------------------------\n  0 821 Bra\n  2     8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n820     \\b\n821 821 Ket\n823     End\n------------------------------------------------------------------\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 3256\n------------------------------------------------------------------\n  0 811 Bra\n  2     $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n810     \\b\n811 811 Ket\n813     End\n------------------------------------------------------------------\n\n/(a(?1)b)/BM\nMemory allocation (code space): 64\n------------------------------------------------------------------\n  0  13 Bra\n  2   9 CBra 1\n  5     a\n  7   2 Recurse\n  9     b\n 11   9 Ket\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/(a(?1)+b)/BM\nMemory allocation (code space): 80\n------------------------------------------------------------------\n  0  17 Bra\n  2  13 CBra 1\n  5     a\n  7   4 Once\n  9   2 Recurse\n 11   4 KetRmax\n 13     b\n 15  13 Ket\n 17  17 Ket\n 19     End\n------------------------------------------------------------------\n\n/a(?P<name1>b|c)d(?P<longername2>e)/BM\nMemory allocation (code space): 186\n------------------------------------------------------------------\n  0  24 Bra\n  2     a\n  4   5 CBra 1\n  7     b\n  9   4 Alt\n 11     c\n 13   9 Ket\n 15     d\n 17   5 CBra 2\n 20     e\n 22   5 Ket\n 24  24 Ket\n 26     End\n------------------------------------------------------------------\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM\nMemory allocation (code space): 155\n------------------------------------------------------------------\n  0  29 Bra\n  2  18 Bra\n  4     a\n  6  12 CBra 1\n  9     c\n 11   5 CBra 2\n 14     d\n 16   5 Ket\n 18  12 Ket\n 20  18 Ket\n 22   5 CBra 3\n 25     a\n 27   5 Ket\n 29  29 Ket\n 31     End\n------------------------------------------------------------------\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/BM\nMemory allocation (code space): 189\n------------------------------------------------------------------\n  0  24 Bra\n  2   5 CBra 1\n  5     a\n  7   5 Ket\n  9     Any\n 10     Any\n 11     Any\n 12     \\1\n 14     bbb\n 20   2 Recurse\n 22     d\n 24  24 Ket\n 26     End\n------------------------------------------------------------------\n\n/abc(?C255)de(?C)f/BM\nMemory allocation (code space): 100\n------------------------------------------------------------------\n  0  22 Bra\n  2     abc\n  8     Callout 255 10 1\n 12     de\n 16     Callout 0 16 1\n 20     f\n 22  22 Ket\n 24     End\n------------------------------------------------------------------\n\n/abcde/CBM\nMemory allocation (code space): 156\n------------------------------------------------------------------\n  0  36 Bra\n  2     Callout 255 0 1\n  6     a\n  8     Callout 255 1 1\n 12     b\n 14     Callout 255 2 1\n 18     c\n 20     Callout 255 3 1\n 24     d\n 26     Callout 255 4 1\n 30     e\n 32     Callout 255 5 0\n 36  36 Ket\n 38     End\n------------------------------------------------------------------\n\n/\\x{100}/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{1000}/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{1000}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{10000}/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{10000}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{100000}/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100000}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{10ffff}/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{10ffff}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{110000}/8BM\nFailed: character value in \\x{} or \\o{} is too large at offset 9\n\n/[\\x{ff}]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{ff}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x80/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x80\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\xff/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{ff}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/D8M\nMemory allocation (code space): 52\n------------------------------------------------------------------\n  0  10 Bra\n  2     A\\x{2262}\\x{391}.\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = '.'\n    \n/\\x{D55c}\\x{ad6d}\\x{C5B4}/D8M \nMemory allocation (code space): 44\n------------------------------------------------------------------\n  0   8 Bra\n  2     \\x{d55c}\\x{ad6d}\\x{c5b4}\n  8   8 Ket\n 10     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d55c}\nNeed char = \\x{c5b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/D8M\nMemory allocation (code space): 44\n------------------------------------------------------------------\n  0   8 Bra\n  2     \\x{65e5}\\x{672c}\\x{8a9e}\n  8   8 Ket\n 10     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{65e5}\nNeed char = \\x{8a9e}\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{100}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[Z\\x{100}]/8BM\nMemory allocation (code space): 76\n------------------------------------------------------------------\n  0  16 Bra\n  2     [Z\\x{100}]\n 16  16 Ket\n 18     End\n------------------------------------------------------------------\n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/B8M\nMemory allocation (code space): 52\n------------------------------------------------------------------\n  0  10 Bra\n  2     ^\n  3     [\\x{100}-\\x{150}]\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E]/B8M\nMemory allocation (code space): 52\n------------------------------------------------------------------\n  0  10 Bra\n  2     ^\n  3     [\\x{100}-\\x{150}]\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E/B8M\nFailed: missing terminating ] for character class at offset 13\n\n/[\\p{L}]/BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\p{^L}]/BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\P{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\P{L}]/BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\P{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\P{^L}]/BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{L}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[abc\\p{L}\\x{0660}]/8BM\nMemory allocation (code space): 88\n------------------------------------------------------------------\n  0  19 Bra\n  2     [a-c\\p{L}\\x{660}]\n 19  19 Ket\n 21     End\n------------------------------------------------------------------\n\n/[\\p{Nd}]/8BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\p{Nd}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[\\p{Nd}+-]+/8BM\nMemory allocation (code space): 84\n------------------------------------------------------------------\n  0  18 Bra\n  2     [+\\-\\p{Nd}]++\n 18  18 Ket\n 20     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iBM\nMemory allocation (code space): 60\n------------------------------------------------------------------\n  0  12 Bra\n  2  /i A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 12  12 Ket\n 14     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8BM\nMemory allocation (code space): 60\n------------------------------------------------------------------\n  0  12 Bra\n  2     A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 12  12 Ket\n 14     End\n------------------------------------------------------------------\n\n/[\\x{105}-\\x{109}]/8iBM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0   9 Bra\n  2     [\\x{104}-\\x{109}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/( ( (?(1)0|) )*   )/xBM\nMemory allocation (code space): 104\n------------------------------------------------------------------\n  0  23 Bra\n  2  19 CBra 1\n  5     Brazero\n  6  13 SCBra 2\n  9   6 Cond\n 11   1 Cond ref\n 13     0\n 15   2 Alt\n 17   8 Ket\n 19  13 KetRmax\n 21  19 Ket\n 23  23 Ket\n 25     End\n------------------------------------------------------------------\n\n/(  (?(1)0|)*   )/xBM\nMemory allocation (code space): 84\n------------------------------------------------------------------\n  0  18 Bra\n  2  14 CBra 1\n  5     Brazero\n  6   6 SCond\n  8   1 Cond ref\n 10     0\n 12   2 Alt\n 14   8 KetRmax\n 16  14 Ket\n 18  18 Ket\n 20     End\n------------------------------------------------------------------\n\n/[a]/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[a]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     a\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\xaa]/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{aa}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[\\xaa]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     \\x{aa}\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^a]/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^a]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^a]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^a]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\xaa]/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^\\x{aa}]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\xaa]/8BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0   4 Bra\n  2     [^\\x{aa}]\n  4   4 Ket\n  6     End\n------------------------------------------------------------------\n\n/[^\\d]/8WB\n------------------------------------------------------------------\n  0   9 Bra\n  2     [^\\p{Nd}]\n  9   9 Ket\n 11     End\n------------------------------------------------------------------\n\n/[[:^alpha:][:^cntrl:]]+/8WB\n------------------------------------------------------------------\n  0  21 Bra\n  2     [ -~\\x80-\\xff\\P{L}\\x{100}-\\x{10ffff}]++\n 21  21 Ket\n 23     End\n------------------------------------------------------------------\n\n/[[:^cntrl:][:^alpha:]]+/8WB\n------------------------------------------------------------------\n  0  21 Bra\n  2     [ -~\\x80-\\xff\\x{100}-\\x{10ffff}\\P{L}]++\n 21  21 Ket\n 23     End\n------------------------------------------------------------------\n\n/[[:alpha:]]+/8WB\n------------------------------------------------------------------\n  0  10 Bra\n  2     [\\p{L}]++\n 10  10 Ket\n 12     End\n------------------------------------------------------------------\n\n/[[:^alpha:]\\S]+/8WB\n------------------------------------------------------------------\n  0  13 Bra\n  2     [\\P{L}\\P{Xsp}]++\n 13  13 Ket\n 15     End\n------------------------------------------------------------------\n\n/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B\n------------------------------------------------------------------\n  0  60 Bra\n  2     abc\n  8   5 CBra 1\n 11     d\n 13   4 Alt\n 15     e\n 17   9 Ket\n 19     *THEN\n 20     x\n 22  12 CBra 2\n 25     123\n 31     *THEN\n 32     4\n 34  24 Alt\n 36     567\n 42   5 CBra 3\n 45     b\n 47   4 Alt\n 49     q\n 51   9 Ket\n 53     *THEN\n 54     xx\n 58  36 Ket\n 60  60 Ket\n 62     End\n------------------------------------------------------------------\n\n/(((a\\2)|(a*)\\g<-1>))*a?/B\n------------------------------------------------------------------\n  0  39 Bra\n  2     Brazero\n  3  32 SCBra 1\n  6  27 Once\n  8  12 CBra 2\n 11   7 CBra 3\n 14     a\n 16     \\2\n 18   7 Ket\n 20  11 Alt\n 22   5 CBra 4\n 25     a*\n 27   5 Ket\n 29  22 Recurse\n 31  23 Ket\n 33  27 Ket\n 35  32 KetRmax\n 37     a?+\n 39  39 Ket\n 41     End\n------------------------------------------------------------------\n\n/((?+1)(\\1))/B\n------------------------------------------------------------------\n  0  20 Bra\n  2  16 Once\n  4  12 CBra 1\n  7   9 Recurse\n  9   5 CBra 2\n 12     \\1\n 14   5 Ket\n 16  12 Ket\n 18  16 Ket\n 20  20 Ket\n 22     End\n------------------------------------------------------------------\n\n/.((?2)(?R)\\1)()/B\n------------------------------------------------------------------\n  0  23 Bra\n  2     Any\n  3  13 Once\n  5   9 CBra 1\n  8  18 Recurse\n 10   0 Recurse\n 12     \\1\n 14   9 Ket\n 16  13 Ket\n 18   3 CBra 2\n 21   3 Ket\n 23  23 Ket\n 25     End\n------------------------------------------------------------------\n\n/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/\nFailed: missing ) at offset 509\n\n/-- End of testinput11 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput11-8",
    "content": "/-- These are a few representative patterns whose lengths and offsets are to be \nshown when the link size is 2. This is just a doublecheck test to ensure the \nsizes don't go horribly wrong when something is changed. The pattern contents \nare all themselves checked in other tests. Unicode, including property support, \nis required for these tests. --/\n\n/((?i)b)/BM\nMemory allocation (code space): 17\n------------------------------------------------------------------\n  0  13 Bra\n  3   7 CBra 1\n  8  /i b\n 10   7 Ket\n 13  13 Ket\n 16     End\n------------------------------------------------------------------\n\n/(?s)(.*X|^B)/BM\nMemory allocation (code space): 25\n------------------------------------------------------------------\n  0  21 Bra\n  3   9 CBra 1\n  8     AllAny*\n 10     X\n 12   6 Alt\n 15     ^\n 16     B\n 18  15 Ket\n 21  21 Ket\n 24     End\n------------------------------------------------------------------\n\n/(?s:.*X|^B)/BM\nMemory allocation (code space): 23\n------------------------------------------------------------------\n  0  19 Bra\n  3   7 Bra\n  6     AllAny*\n  8     X\n 10   6 Alt\n 13     ^\n 14     B\n 16  13 Ket\n 19  19 Ket\n 22     End\n------------------------------------------------------------------\n\n/^[[:alnum:]]/BM\nMemory allocation (code space): 41\n------------------------------------------------------------------\n  0  37 Bra\n  3     ^\n  4     [0-9A-Za-z]\n 37  37 Ket\n 40     End\n------------------------------------------------------------------\n\n/#/IxMD\nMemory allocation (code space): 7\n------------------------------------------------------------------\n  0   3 Bra\n  3   3 Ket\n  6     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nOptions: extended\nNo first char\nNo need char\n\n/a#/IxMD\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     a\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a'\nNo need char\n\n/x?+/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     x?+\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/x++/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     x++\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/x{1,3}+/BM \nMemory allocation (code space): 13\n------------------------------------------------------------------\n  0   9 Bra\n  3     x\n  5     x{0,2}+\n  9   9 Ket\n 12     End\n------------------------------------------------------------------\n\n/(x)*+/BM\nMemory allocation (code space): 18\n------------------------------------------------------------------\n  0  14 Bra\n  3     Braposzero\n  4   7 CBraPos 1\n  9     x\n 11   7 KetRpos\n 14  14 Ket\n 17     End\n------------------------------------------------------------------\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/BM\nMemory allocation (code space): 120\n------------------------------------------------------------------\n  0 116 Bra\n  3     ^\n  4 109 CBra 1\n  9   7 CBra 2\n 14     a+\n 16   7 Ket\n 19  39 CBra 3\n 24     [ab]+?\n 58  39 Ket\n 61  39 CBra 4\n 66     [bc]+\n100  39 Ket\n103   7 CBra 5\n108     \\w*+\n110   7 Ket\n113 109 Ket\n116 116 Ket\n119     End\n------------------------------------------------------------------\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 826\n------------------------------------------------------------------\n  0 822 Bra\n  3     8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n821     \\b\n822 822 Ket\n825     End\n------------------------------------------------------------------\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|BM\nMemory allocation (code space): 816\n------------------------------------------------------------------\n  0 812 Bra\n  3     $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n811     \\b\n812 812 Ket\n815     End\n------------------------------------------------------------------\n\n/(a(?1)b)/BM\nMemory allocation (code space): 22\n------------------------------------------------------------------\n  0  18 Bra\n  3  12 CBra 1\n  8     a\n 10   3 Recurse\n 13     b\n 15  12 Ket\n 18  18 Ket\n 21     End\n------------------------------------------------------------------\n\n/(a(?1)+b)/BM\nMemory allocation (code space): 28\n------------------------------------------------------------------\n  0  24 Bra\n  3  18 CBra 1\n  8     a\n 10   6 Once\n 13   3 Recurse\n 16   6 KetRmax\n 19     b\n 21  18 Ket\n 24  24 Ket\n 27     End\n------------------------------------------------------------------\n\n/a(?P<name1>b|c)d(?P<longername2>e)/BM\nMemory allocation (code space): 36\n------------------------------------------------------------------\n  0  32 Bra\n  3     a\n  5   7 CBra 1\n 10     b\n 12   5 Alt\n 15     c\n 17  12 Ket\n 20     d\n 22   7 CBra 2\n 27     e\n 29   7 Ket\n 32  32 Ket\n 35     End\n------------------------------------------------------------------\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/BM\nMemory allocation (code space): 45\n------------------------------------------------------------------\n  0  41 Bra\n  3  25 Bra\n  6     a\n  8  17 CBra 1\n 13     c\n 15   7 CBra 2\n 20     d\n 22   7 Ket\n 25  17 Ket\n 28  25 Ket\n 31   7 CBra 3\n 36     a\n 38   7 Ket\n 41  41 Ket\n 44     End\n------------------------------------------------------------------\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/BM\nMemory allocation (code space): 62\n------------------------------------------------------------------\n  0  30 Bra\n  3   7 CBra 1\n  8     a\n 10   7 Ket\n 13     Any\n 14     Any\n 15     Any\n 16     \\1\n 19     bbb\n 25   3 Recurse\n 28     d\n 30  30 Ket\n 33     End\n------------------------------------------------------------------\n\n/abc(?C255)de(?C)f/BM\nMemory allocation (code space): 31\n------------------------------------------------------------------\n  0  27 Bra\n  3     abc\n  9     Callout 255 10 1\n 15     de\n 19     Callout 0 16 1\n 25     f\n 27  27 Ket\n 30     End\n------------------------------------------------------------------\n\n/abcde/CBM\nMemory allocation (code space): 53\n------------------------------------------------------------------\n  0  49 Bra\n  3     Callout 255 0 1\n  9     a\n 11     Callout 255 1 1\n 17     b\n 19     Callout 255 2 1\n 25     c\n 27     Callout 255 3 1\n 33     d\n 35     Callout 255 4 1\n 41     e\n 43     Callout 255 5 0\n 49  49 Ket\n 52     End\n------------------------------------------------------------------\n\n/\\x{100}/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{100}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/\\x{1000}/8BM\nMemory allocation (code space): 11\n------------------------------------------------------------------\n  0   7 Bra\n  3     \\x{1000}\n  7   7 Ket\n 10     End\n------------------------------------------------------------------\n\n/\\x{10000}/8BM\nMemory allocation (code space): 12\n------------------------------------------------------------------\n  0   8 Bra\n  3     \\x{10000}\n  8   8 Ket\n 11     End\n------------------------------------------------------------------\n\n/\\x{100000}/8BM\nMemory allocation (code space): 12\n------------------------------------------------------------------\n  0   8 Bra\n  3     \\x{100000}\n  8   8 Ket\n 11     End\n------------------------------------------------------------------\n\n/\\x{10ffff}/8BM\nMemory allocation (code space): 12\n------------------------------------------------------------------\n  0   8 Bra\n  3     \\x{10ffff}\n  8   8 Ket\n 11     End\n------------------------------------------------------------------\n\n/\\x{110000}/8BM\nFailed: character value in \\x{} or \\o{} is too large at offset 9\n\n/[\\x{ff}]/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{ff}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{100}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/\\x80/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{80}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/\\xff/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{ff}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/D8M\nMemory allocation (code space): 18\n------------------------------------------------------------------\n  0  14 Bra\n  3     A\\x{2262}\\x{391}.\n 14  14 Ket\n 17     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = '.'\n    \n/\\x{D55c}\\x{ad6d}\\x{C5B4}/D8M \nMemory allocation (code space): 19\n------------------------------------------------------------------\n  0  15 Bra\n  3     \\x{d55c}\\x{ad6d}\\x{c5b4}\n 15  15 Ket\n 18     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ed}\nNeed char = \\x{b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/D8M\nMemory allocation (code space): 19\n------------------------------------------------------------------\n  0  15 Bra\n  3     \\x{65e5}\\x{672c}\\x{8a9e}\n 15  15 Ket\n 18     End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{e6}\nNeed char = \\x{9e}\n\n/[\\x{100}]/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{100}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/[Z\\x{100}]/8BM\nMemory allocation (code space): 47\n------------------------------------------------------------------\n  0  43 Bra\n  3     [Z\\x{100}]\n 43  43 Ket\n 46     End\n------------------------------------------------------------------\n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/B8M\nMemory allocation (code space): 18\n------------------------------------------------------------------\n  0  14 Bra\n  3     ^\n  4     [\\x{100}-\\x{150}]\n 14  14 Ket\n 17     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E]/B8M\nMemory allocation (code space): 18\n------------------------------------------------------------------\n  0  14 Bra\n  3     ^\n  4     [\\x{100}-\\x{150}]\n 14  14 Ket\n 17     End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E/B8M\nFailed: missing terminating ] for character class at offset 15\n\n/[\\p{L}]/BM\nMemory allocation (code space): 15\n------------------------------------------------------------------\n  0  11 Bra\n  3     [\\p{L}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[\\p{^L}]/BM\nMemory allocation (code space): 15\n------------------------------------------------------------------\n  0  11 Bra\n  3     [\\P{L}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[\\P{L}]/BM\nMemory allocation (code space): 15\n------------------------------------------------------------------\n  0  11 Bra\n  3     [\\P{L}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[\\P{^L}]/BM\nMemory allocation (code space): 15\n------------------------------------------------------------------\n  0  11 Bra\n  3     [\\p{L}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[abc\\p{L}\\x{0660}]/8BM\nMemory allocation (code space): 50\n------------------------------------------------------------------\n  0  46 Bra\n  3     [a-c\\p{L}\\x{660}]\n 46  46 Ket\n 49     End\n------------------------------------------------------------------\n\n/[\\p{Nd}]/8BM\nMemory allocation (code space): 15\n------------------------------------------------------------------\n  0  11 Bra\n  3     [\\p{Nd}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[\\p{Nd}+-]+/8BM\nMemory allocation (code space): 48\n------------------------------------------------------------------\n  0  44 Bra\n  3     [+\\-\\p{Nd}]++\n 44  44 Ket\n 47     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iBM\nMemory allocation (code space): 25\n------------------------------------------------------------------\n  0  21 Bra\n  3  /i A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 21  21 Ket\n 24     End\n------------------------------------------------------------------\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8BM\nMemory allocation (code space): 25\n------------------------------------------------------------------\n  0  21 Bra\n  3     A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 21  21 Ket\n 24     End\n------------------------------------------------------------------\n\n/[\\x{105}-\\x{109}]/8iBM\nMemory allocation (code space): 17\n------------------------------------------------------------------\n  0  13 Bra\n  3     [\\x{104}-\\x{109}]\n 13  13 Ket\n 16     End\n------------------------------------------------------------------\n\n/( ( (?(1)0|) )*   )/xBM\nMemory allocation (code space): 38\n------------------------------------------------------------------\n  0  34 Bra\n  3  28 CBra 1\n  8     Brazero\n  9  19 SCBra 2\n 14   8 Cond\n 17   1 Cond ref\n 20     0\n 22   3 Alt\n 25  11 Ket\n 28  19 KetRmax\n 31  28 Ket\n 34  34 Ket\n 37     End\n------------------------------------------------------------------\n\n/(  (?(1)0|)*   )/xBM\nMemory allocation (code space): 30\n------------------------------------------------------------------\n  0  26 Bra\n  3  20 CBra 1\n  8     Brazero\n  9   8 SCond\n 12   1 Cond ref\n 15     0\n 17   3 Alt\n 20  11 KetRmax\n 23  20 Ket\n 26  26 Ket\n 29     End\n------------------------------------------------------------------\n\n/[a]/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     a\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[a]/8BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     a\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[\\xaa]/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     \\x{aa}\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[\\xaa]/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     \\x{aa}\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/[^a]/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     [^a]\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[^a]/8BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     [^a]\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[^\\xaa]/BM\nMemory allocation (code space): 9\n------------------------------------------------------------------\n  0   5 Bra\n  3     [^\\x{aa}]\n  5   5 Ket\n  8     End\n------------------------------------------------------------------\n\n/[^\\xaa]/8BM\nMemory allocation (code space): 10\n------------------------------------------------------------------\n  0   6 Bra\n  3     [^\\x{aa}]\n  6   6 Ket\n  9     End\n------------------------------------------------------------------\n\n/[^\\d]/8WB\n------------------------------------------------------------------\n  0  11 Bra\n  3     [^\\p{Nd}]\n 11  11 Ket\n 14     End\n------------------------------------------------------------------\n\n/[[:^alpha:][:^cntrl:]]+/8WB\n------------------------------------------------------------------\n  0  51 Bra\n  3     [ -~\\x80-\\xff\\P{L}\\x{100}-\\x{10ffff}]++\n 51  51 Ket\n 54     End\n------------------------------------------------------------------\n\n/[[:^cntrl:][:^alpha:]]+/8WB\n------------------------------------------------------------------\n  0  51 Bra\n  3     [ -~\\x80-\\xff\\x{100}-\\x{10ffff}\\P{L}]++\n 51  51 Ket\n 54     End\n------------------------------------------------------------------\n\n/[[:alpha:]]+/8WB\n------------------------------------------------------------------\n  0  12 Bra\n  3     [\\p{L}]++\n 12  12 Ket\n 15     End\n------------------------------------------------------------------\n\n/[[:^alpha:]\\S]+/8WB\n------------------------------------------------------------------\n  0  15 Bra\n  3     [\\P{L}\\P{Xsp}]++\n 15  15 Ket\n 18     End\n------------------------------------------------------------------\n\n/abc(d|e)(*THEN)x(123(*THEN)4|567(b|q)(*THEN)xx)/B\n------------------------------------------------------------------\n  0  73 Bra\n  3     abc\n  9   7 CBra 1\n 14     d\n 16   5 Alt\n 19     e\n 21  12 Ket\n 24     *THEN\n 25     x\n 27  14 CBra 2\n 32     123\n 38     *THEN\n 39     4\n 41  29 Alt\n 44     567\n 50   7 CBra 3\n 55     b\n 57   5 Alt\n 60     q\n 62  12 Ket\n 65     *THEN\n 66     xx\n 70  43 Ket\n 73  73 Ket\n 76     End\n------------------------------------------------------------------\n\n/(((a\\2)|(a*)\\g<-1>))*a?/B\n------------------------------------------------------------------\n  0  57 Bra\n  3     Brazero\n  4  48 SCBra 1\n  9  40 Once\n 12  18 CBra 2\n 17  10 CBra 3\n 22     a\n 24     \\2\n 27  10 Ket\n 30  16 Alt\n 33   7 CBra 4\n 38     a*\n 40   7 Ket\n 43  33 Recurse\n 46  34 Ket\n 49  40 Ket\n 52  48 KetRmax\n 55     a?+\n 57  57 Ket\n 60     End\n------------------------------------------------------------------\n\n/((?+1)(\\1))/B\n------------------------------------------------------------------\n  0  31 Bra\n  3  25 Once\n  6  19 CBra 1\n 11  14 Recurse\n 14   8 CBra 2\n 19     \\1\n 22   8 Ket\n 25  19 Ket\n 28  25 Ket\n 31  31 Ket\n 34     End\n------------------------------------------------------------------\n\n/.((?2)(?R)\\1)()/B\n------------------------------------------------------------------\n  0  35 Bra\n  3     Any\n  4  20 Once\n  7  14 CBra 1\n 12  27 Recurse\n 15   0 Recurse\n 18     \\1\n 21  14 Ket\n 24  20 Ket\n 27   5 CBra 2\n 32   5 Ket\n 35  35 Ket\n 38     End\n------------------------------------------------------------------\n\n/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/\nFailed: missing ) at offset 509\n\n/-- End of testinput11 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput12",
    "content": "/-- This test is run only when JIT support is available. It checks for a\nsuccessful and an unsuccessful JIT compile and save and restore behaviour,\nand a couple of things that are different with JIT. --/\n\n/abc/S+I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 3\nNo starting char list\nJIT study was successful\n\n/(?(?C1)(?=a)a)/S+I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nStudy returned NULL\nJIT study was not successful\n\n/(?(?C1)(?=a)a)/S!+I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nSubject length lower bound = -1\nNo starting char list\nJIT study was not successful\n\n/b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*/S+I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nStudy returned NULL\nJIT study was not successful\n\n/abc/S+I>testsavedregex\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 3\nNo starting char list\nJIT study was successful\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: abc\n\n/a*/SI\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nStudy returned NULL\n\n/(?(R)a*(?1)|((?R))b)/S+\n    aaaabcde\nError -27 (JIT stack limit reached)\n    \n/-- Test various compile modes --/ \n    \n/abcd/S++\n    abcd\n 0: abcd (JIT)\n    xyz  \nNo match (JIT)\n\n/abcd/S+\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match (JIT)\n\n/abcd/S++\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match (JIT)\n\n/abcd/S++1\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab\n    ab\\P\\P\nPartial match: ab\n    xyz\nNo match (JIT)\n    xyz\\P\nNo match\n\n/abcd/S++2\n    abcd\n 0: abcd\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab\n    xyz\nNo match\n\n/abcd/S++3\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab\n    xyz\nNo match (JIT)\n\n/abcd/S++4\n    abcd\n 0: abcd\n    ab\\P\nPartial match: ab\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match\n\n/abcd/S++5\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match (JIT)\n\n/abcd/S++6\n    abcd\n 0: abcd\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match\n\n/abcd/S++7\n    abcd\n 0: abcd (JIT)\n    ab\\P\nPartial match: ab (JIT)\n    ab\\P\\P\nPartial match: ab (JIT)\n    xyz\nNo match (JIT)\n    \n/abcd/S++2I \nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'd'\nSubject length lower bound = 4\nNo starting char list\nJIT study was successful\n\n/(*NO_START_OPT)a(*:m)b/KS++\n    a\nNo match, mark = m (JIT)\n\n/^12345678abcd/mS++\n    12345678abcd\n 0: 12345678abcd (JIT)\n\n/-- Test pattern compilation --/ \n\n/(?:a|b|c|d|e)(?R)/S++\n\n/(?:a|b|c|d|e)(?R)(?R)/S++\n\n/(a(?:a|b|c|d|e)b){8,16}/S++\n\n/(?:|a|){100}x/S++\n\n/(x(?1)){4}/S++\n\n/(.|.)*?bx/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabax\nError -8 (match limit exceeded)\n\n/((?(?!))x)(?'name')(?1)/S++\n\n/-- End of testinput12 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput13",
    "content": "/-- This test is run only when JIT support is not available. It checks that an \nattempt to use it has the expected behaviour. It also tests things that\nare different without JIT. --/\n   \n/abc/S+I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 3\nNo starting char list\nJIT support is not available in this version of PCRE\n\n/a*/SI\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nStudy returned NULL\n\n/-- End of testinput13 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput14",
    "content": "/-- This set of tests is run only with the 8-bit library. They do not require \n    UTF-8 or Unicode property support. The file starts with all the tests of\n    the POSIX interface, because that is supported only with the 8-bit library.\n    --/\n    \n< forbid 8W \n\n/abc/P\n    abc\n 0: abc\n    *** Failers\nNo match: POSIX code 17: match failed\n\n/^abc|def/P\n    abcdef\n 0: abc\n    abcdef\\B\n 0: def\n\n/.*((abc)$|(def))/P\n    defabc\n 0: defabc\n 1: abc\n 2: abc\n    \\Zdefabc\n 0: def\n 1: def\n 3: def\n\n/the quick brown fox/P\n    the quick brown fox\n 0: the quick brown fox\n    *** Failers\nNo match: POSIX code 17: match failed\n    The Quick Brown Fox\nNo match: POSIX code 17: match failed\n\n/the quick brown fox/Pi\n    the quick brown fox\n 0: the quick brown fox\n    The Quick Brown Fox\n 0: The Quick Brown Fox\n\n/abc.def/P\n    *** Failers\nNo match: POSIX code 17: match failed\n    abc\\ndef\nNo match: POSIX code 17: match failed\n\n/abc$/P\n    abc\n 0: abc\n    abc\\n\n 0: abc\n\n/(abc)\\2/P\nFailed: POSIX code 15: bad back reference at offset 7     \n\n/(abc\\1)/P\n    abc\nNo match: POSIX code 17: match failed\n\n/a*(b+)(z)(z)/P\n    aaaabbbbzzzz\n 0: aaaabbbbzz\n 1: bbbb\n 2: z\n 3: z\n    aaaabbbbzzzz\\O0\n    aaaabbbbzzzz\\O1\n 0: aaaabbbbzz\n    aaaabbbbzzzz\\O2\n 0: aaaabbbbzz\n 1: bbbb\n    aaaabbbbzzzz\\O3\n 0: aaaabbbbzz\n 1: bbbb\n 2: z\n    aaaabbbbzzzz\\O4\n 0: aaaabbbbzz\n 1: bbbb\n 2: z\n 3: z\n    aaaabbbbzzzz\\O5\n 0: aaaabbbbzz\n 1: bbbb\n 2: z\n 3: z\n\n/ab.cd/P\n    ab-cd\n 0: ab-cd\n    ab=cd\n 0: ab=cd\n    ** Failers\nNo match: POSIX code 17: match failed\n    ab\\ncd\nNo match: POSIX code 17: match failed\n\n/ab.cd/Ps\n    ab-cd\n 0: ab-cd\n    ab=cd\n 0: ab=cd\n    ab\\ncd\n 0: ab\\x0acd\n\n/a(b)c/PN\n    abc\nMatched with REG_NOSUB\n\n/a(?P<name>b)c/PN\n    abc\nMatched with REG_NOSUB\n\n/a?|b?/P\n    abc\n 0: a\n    ** Failers\n 0: \n    ddd\\N   \nNo match: POSIX code 17: match failed\n\n/\\w+A/P\n   CDAAAAB \n 0: CDAAAA\n\n/\\w+A/PU\n   CDAAAAB \n 0: CDA\n   \n/\\Biss\\B/I+P\n    Mississippi\n 0: iss\n 0+ issippi\n\n/abc/\\P\nFailed: POSIX code 9: bad escape sequence at offset 4     \n\n/-- End of POSIX tests --/ \n\n/a\\Cb/\n    aXb\n 0: aXb\n    a\\nb\n 0: a\\x0ab\n    ** Failers (too big char) \nNo match\n    A\\x{123}B \n** Character \\x{123} is greater than 255 and UTF-8 mode is not enabled.\n** Truncation will probably give the wrong result.\nNo match\n    A\\o{443}B \n** Character \\x{123} is greater than 255 and UTF-8 mode is not enabled.\n** Truncation will probably give the wrong result.\nNo match\n  \n/\\x{100}/I\nFailed: character value in \\x{} or \\o{} is too large at offset 6\n\n/\\o{400}/I\nFailed: character value in \\x{} or \\o{} is too large at offset 6\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/xSI\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: extended\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: \\x09 \\x20 ! \" # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 \n  9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e \n  f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \n\n/-- Although this saved pattern was compiled with link-size=2, it does no harm\nto run this test with other link sizes because it is going to generated a\n\"compiled in wrong mode\" error as soon as it is loaded, so the link size does \nnot matter. --/\n\n<!testsaved16\nCompiled pattern loaded from testsaved16\nNo study data\nError -28 from pcre_fullinfo(0)\nRunning in 8-bit mode but pattern was compiled in 16-bit mode\n\n<!testsaved32\nCompiled pattern loaded from testsaved32\nNo study data\nError -28 from pcre_fullinfo(0)\nRunning in 8-bit mode but pattern was compiled in 32-bit mode\n\n/\\h/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \n\n/\\H/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\v/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \n\n/\\V/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\R/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \n\n/[\\h]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x09<\n 0: \\x09\n\n/[\\h]+/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0]++\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x09\\x20\\xa0<\n 0: \\x09 \\xa0\n\n/[\\v]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x0a-\\x0d\\x85]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\H]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\h]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\V]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x09\\x0e-\\x84\\x86-\\xff]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\x0a\\V]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x0a\\x0e-\\x84\\x86-\\xff]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\777/I\nFailed: octal value is greater than \\377 in 8-bit non-UTF-8 mode at offset 3\n\n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K\nFailed: name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) at offset 259\n\n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K\n    XX\n 0: XX\nMK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE\n\n/\\u0100/<JS>\nFailed: character value in \\u.... sequence is too large at offset 5\n\n/[\\u0100-\\u0200]/<JS>\nFailed: character value in \\u.... sequence is too large at offset 6\n\n/[^\\x00-a]{12,}[^b-\\xff]*/BZ\n------------------------------------------------------------------\n        Bra\n        [b-\\xff] (neg){12,}+\n        [\\x00-a] (neg)*+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\s]*\\s* [^\\W]+\\W+ [^\\d]*?\\d0 [^\\d\\w]{4,6}?\\w*A/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0e-\\x1f!-\\xff] (neg)*+\n        \\s*\n         \n        [0-9A-Z_a-z]++\n        \\W+\n         \n        [\\x00-/:-\\xff] (neg)*+\n        \\d\n        0 \n        [\\x00-/:-@[-^`{-\\xff] (neg){4,6}+\n        \\w*\n        A\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?'ABC'[bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar]([bar](*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))/\n\n/-- End of testinput14 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput15",
    "content": "/-- This set of tests is for UTF-8 support but not Unicode property support,\n    and is relevant only to the 8-bit library. --/\n\n< forbid W\n\n/X(\\C{3})/8\n    X\\x{1234}\n 0: X\\x{1234}\n 1: \\x{1234}\n\n/X(\\C{4})/8\n    X\\x{1234}YZ\n 0: X\\x{1234}Y\n 1: \\x{1234}Y\n    \n/X\\C*/8\n    XYZabcdce\n 0: XYZabcdce\n    \n/X\\C*?/8\n    XYZabcde\n 0: X\n    \n/X\\C{3,5}/8\n    Xabcdefg   \n 0: Xabcde\n    X\\x{1234} \n 0: X\\x{1234}\n    X\\x{1234}YZ\n 0: X\\x{1234}YZ\n    X\\x{1234}\\x{512}  \n 0: X\\x{1234}\\x{512}\n    X\\x{1234}\\x{512}YZ\n 0: X\\x{1234}\\x{512}\n\n/X\\C{3,5}?/8\n    Xabcdefg   \n 0: Xabc\n    X\\x{1234} \n 0: X\\x{1234}\n    X\\x{1234}YZ\n 0: X\\x{1234}\n    X\\x{1234}\\x{512}  \n 0: X\\x{1234}\n\n/a\\Cb/8\n    aXb\n 0: aXb\n    a\\nb\n 0: a\\x{0a}b\n    \n/a\\C\\Cb/8 \n    a\\x{100}b \n 0: a\\x{100}b\n\n/ab\\Cde/8\n    abXde\n 0: abXde\n\n/a\\C\\Cb/8 \n    a\\x{100}b\n 0: a\\x{100}b\n    ** Failers \nNo match\n    a\\x{12257}b\nNo match\n\n/[]/8\nFailed: invalid UTF-8 string at offset 1\n\n//8\nFailed: invalid UTF-8 string at offset 0\n\n/xxx/8\nFailed: invalid UTF-8 string at offset 0\n\n/xxx/8?DZSSO\n------------------------------------------------------------------\n        Bra\n        \\X{c0}\\X{c0}\\X{c0}xxx\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: no_auto_possessify utf no_utf_check\nFirst char = \\x{c3}\nNeed char = 'x'\n\n/badutf/8\n    \\xdf\nError -10 (bad UTF-8 string) offset=0 reason=1\n    \\xef\nError -10 (bad UTF-8 string) offset=0 reason=2\n    \\xef\\x80\nError -10 (bad UTF-8 string) offset=0 reason=1\n    \\xf7\nError -10 (bad UTF-8 string) offset=0 reason=3\n    \\xf7\\x80\nError -10 (bad UTF-8 string) offset=0 reason=2\n    \\xf7\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=1\n    \\xfb\nError -10 (bad UTF-8 string) offset=0 reason=4\n    \\xfb\\x80\nError -10 (bad UTF-8 string) offset=0 reason=3\n    \\xfb\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=2\n    \\xfb\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=1\n    \\xfd\nError -10 (bad UTF-8 string) offset=0 reason=5\n    \\xfd\\x80\nError -10 (bad UTF-8 string) offset=0 reason=4\n    \\xfd\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=3\n    \\xfd\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=2\n    \\xfd\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=1\n    \\xdf\\x7f\nError -10 (bad UTF-8 string) offset=0 reason=6\n    \\xef\\x7f\\x80\nError -10 (bad UTF-8 string) offset=0 reason=6\n    \\xef\\x80\\x7f\nError -10 (bad UTF-8 string) offset=0 reason=7\n    \\xf7\\x7f\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=6\n    \\xf7\\x80\\x7f\\x80\nError -10 (bad UTF-8 string) offset=0 reason=7\n    \\xf7\\x80\\x80\\x7f\nError -10 (bad UTF-8 string) offset=0 reason=8\n    \\xfb\\x7f\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=6\n    \\xfb\\x80\\x7f\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=7\n    \\xfb\\x80\\x80\\x7f\\x80\nError -10 (bad UTF-8 string) offset=0 reason=8\n    \\xfb\\x80\\x80\\x80\\x7f\nError -10 (bad UTF-8 string) offset=0 reason=9\n    \\xfd\\x7f\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=6\n    \\xfd\\x80\\x7f\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=7\n    \\xfd\\x80\\x80\\x7f\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=8\n    \\xfd\\x80\\x80\\x80\\x7f\\x80\nError -10 (bad UTF-8 string) offset=0 reason=9\n    \\xfd\\x80\\x80\\x80\\x80\\x7f\nError -10 (bad UTF-8 string) offset=0 reason=10\n    \\xed\\xa0\\x80\nError -10 (bad UTF-8 string) offset=0 reason=14\n    \\xc0\\x8f\nError -10 (bad UTF-8 string) offset=0 reason=15\n    \\xe0\\x80\\x8f\nError -10 (bad UTF-8 string) offset=0 reason=16\n    \\xf0\\x80\\x80\\x8f\nError -10 (bad UTF-8 string) offset=0 reason=17\n    \\xf8\\x80\\x80\\x80\\x8f\nError -10 (bad UTF-8 string) offset=0 reason=18\n    \\xfc\\x80\\x80\\x80\\x80\\x8f\nError -10 (bad UTF-8 string) offset=0 reason=19\n    \\x80\nError -10 (bad UTF-8 string) offset=0 reason=20\n    \\xfe\nError -10 (bad UTF-8 string) offset=0 reason=21\n    \\xff\nError -10 (bad UTF-8 string) offset=0 reason=21\n\n/badutf/8\n    \\xfb\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=11\n    \\xfd\\x80\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=12\n    \\xf7\\xbf\\xbf\\xbf\nError -10 (bad UTF-8 string) offset=0 reason=13\n\n/shortutf/8\n    \\P\\P\\xdf\nError -25 (short UTF-8 string) offset=0 reason=1\n    \\P\\P\\xef\nError -25 (short UTF-8 string) offset=0 reason=2\n    \\P\\P\\xef\\x80\nError -25 (short UTF-8 string) offset=0 reason=1\n    \\P\\P\\xf7\nError -25 (short UTF-8 string) offset=0 reason=3\n    \\P\\P\\xf7\\x80\nError -25 (short UTF-8 string) offset=0 reason=2\n    \\P\\P\\xf7\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=1\n    \\P\\P\\xfb\nError -25 (short UTF-8 string) offset=0 reason=4\n    \\P\\P\\xfb\\x80\nError -25 (short UTF-8 string) offset=0 reason=3\n    \\P\\P\\xfb\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=2\n    \\P\\P\\xfb\\x80\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=1\n    \\P\\P\\xfd\nError -25 (short UTF-8 string) offset=0 reason=5\n    \\P\\P\\xfd\\x80\nError -25 (short UTF-8 string) offset=0 reason=4\n    \\P\\P\\xfd\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=3\n    \\P\\P\\xfd\\x80\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=2\n    \\P\\P\\xfd\\x80\\x80\\x80\\x80\nError -25 (short UTF-8 string) offset=0 reason=1\n\n/anything/8\n    \\xc0\\x80\nError -10 (bad UTF-8 string) offset=0 reason=15\n    \\xc1\\x8f \nError -10 (bad UTF-8 string) offset=0 reason=15\n    \\xe0\\x9f\\x80\nError -10 (bad UTF-8 string) offset=0 reason=16\n    \\xf0\\x8f\\x80\\x80 \nError -10 (bad UTF-8 string) offset=0 reason=17\n    \\xf8\\x87\\x80\\x80\\x80  \nError -10 (bad UTF-8 string) offset=0 reason=18\n    \\xfc\\x83\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=19\n    \\xfe\\x80\\x80\\x80\\x80\\x80  \nError -10 (bad UTF-8 string) offset=0 reason=21\n    \\xff\\x80\\x80\\x80\\x80\\x80  \nError -10 (bad UTF-8 string) offset=0 reason=21\n    \\xc3\\x8f\nNo match\n    \\xe0\\xaf\\x80\nNo match\n    \\xe1\\x80\\x80\nNo match\n    \\xf0\\x9f\\x80\\x80 \nNo match\n    \\xf1\\x8f\\x80\\x80 \nNo match\n    \\xf8\\x88\\x80\\x80\\x80  \nError -10 (bad UTF-8 string) offset=0 reason=11\n    \\xf9\\x87\\x80\\x80\\x80  \nError -10 (bad UTF-8 string) offset=0 reason=11\n    \\xfc\\x84\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=12\n    \\xfd\\x83\\x80\\x80\\x80\\x80\nError -10 (bad UTF-8 string) offset=0 reason=12\n    \\?\\xf8\\x88\\x80\\x80\\x80  \nNo match\n    \\?\\xf9\\x87\\x80\\x80\\x80  \nNo match\n    \\?\\xfc\\x84\\x80\\x80\\x80\\x80\nNo match\n    \\?\\xfd\\x83\\x80\\x80\\x80\\x80\nNo match\n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\n\n/\\x{1000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{1000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{e1}\nNeed char = \\x{80}\n\n/\\x{10000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{f0}\nNeed char = \\x{80}\n\n/\\x{100000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{f4}\nNeed char = \\x{80}\n\n/\\x{10ffff}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10ffff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{f4}\nNeed char = \\x{bf}\n\n/[\\x{ff}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c3}\nNeed char = \\x{bf}\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\n\n/\\x80/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{80}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c2}\nNeed char = \\x{80}\n\n/\\xff/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c3}\nNeed char = \\x{bf}\n\n/\\x{D55c}\\x{ad6d}\\x{C5B4}/DZ8 \n------------------------------------------------------------------\n        Bra\n        \\x{d55c}\\x{ad6d}\\x{c5b4}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ed}\nNeed char = \\x{b4}\n    \\x{D55c}\\x{ad6d}\\x{C5B4} \n 0: \\x{d55c}\\x{ad6d}\\x{c5b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{65e5}\\x{672c}\\x{8a9e}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{e6}\nNeed char = \\x{9e}\n    \\x{65e5}\\x{672c}\\x{8a9e}\n 0: \\x{65e5}\\x{672c}\\x{8a9e}\n\n/\\x{80}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{80}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c2}\nNeed char = \\x{80}\n\n/\\x{084}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{84}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c2}\nNeed char = \\x{84}\n\n/\\x{104}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{104}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{84}\n\n/\\x{861}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{861}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{e0}\nNeed char = \\x{a1}\n\n/\\x{212ab}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{212ab}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{f0}\nNeed char = \\x{ab}\n\n/-- This one is here not because it's different to Perl, but because the way\nthe captured single-byte is displayed. (In Perl it becomes a character, and you\ncan't tell the difference.) --/\n    \n/X(\\C)(.*)/8\n    X\\x{1234}\n 0: X\\x{1234}\n 1: \\x{e1}\n 2: \\x{88}\\x{b4}\n    X\\nabc \n 0: X\\x{0a}abc\n 1: \\x{0a}\n 2: abc\n\n/-- This one is here because Perl gives out a grumbly error message (quite \ncorrectly, but that messes up comparisons). --/\n    \n/a\\Cb/8\n    *** Failers \nNo match\n    a\\x{100}b \nNo match\n    \n/[^ab\\xC0-\\xF0]/8SDZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-`c-\\xbf\\xf1-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0a \n  \\x0b \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \n  \\x1a \\x1b \\x1c \\x1d \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 \n  5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y \n  Z [ \\ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \n  \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \\xcf \\xd0 \n  \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \\xde \\xdf \n  \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \\xed \\xee \n  \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \\xfc \\xfd \n  \\xfe \\xff \n    \\x{f1}\n 0: \\x{f1}\n    \\x{bf}\n 0: \\x{bf}\n    \\x{100}\n 0: \\x{100}\n    \\x{1000}   \n 0: \\x{1000}\n    *** Failers\n 0: *\n    \\x{c0} \nNo match\n    \\x{f0} \nNo match\n\n/Ā{3,4}/8SDZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}{3}\n        \\x{100}?+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\nSubject length lower bound = 3\nNo starting char list\n  \\x{100}\\x{100}\\x{100}\\x{100\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\n\n/(\\x{100}+|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}++\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xc4 \n\n/(\\x{100}*a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}*+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xc4 \n\n/(\\x{100}{0,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}{0,2}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xc4 \n\n/(\\x{100}{1,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}\n        \\x{100}{0,1}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xc4 \n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\n\n/a\\x{100}\\x{101}*/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{80}\n\n/a\\x{100}\\x{101}+/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{81}\n\n/[^\\x{c4}]/DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\n    \\x{100}\n 0: \\x{100}\n    Z\\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[\\xff]/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c3}\nNeed char = \\x{bf}\n    >\\x{ff}<\n 0: \\x{ff}\n\n/[^\\xff]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{ff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nFirst char = \\x{c4}\nNeed char = 'z'\n\n/a\\x{1234}b/P8\n    a\\x{1234}b\n 0: a\\x{1234}b\n\n/\\777/8I\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c7}\nNeed char = \\x{bf}\n  \\x{1ff}\n 0: \\x{1ff}\n  \\777 \n 0: \\x{1ff}\n  \n/\\x{100}+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = \\x{80}\n\n/\\x{100}+X/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c4}\nNeed char = 'X'\n\n/^[\\QĀ\\E-\\QŐ\\E/BZ8\nFailed: missing terminating ] for character class at offset 15\n\n/-- This tests the stricter UTF-8 check according to RFC 3629. --/ \n    \n/X/8\n    \\x{d800}\nError -10 (bad UTF-8 string) offset=0 reason=14\n    \\x{d800}\\?\nNo match\n    \\x{da00}\nError -10 (bad UTF-8 string) offset=0 reason=14\n    \\x{da00}\\?\nNo match\n    \\x{dfff}\nError -10 (bad UTF-8 string) offset=0 reason=14\n    \\x{dfff}\\?\nNo match\n    \\x{110000}    \nError -10 (bad UTF-8 string) offset=0 reason=13\n    \\x{110000}\\?    \nNo match\n    \\x{2000000} \nError -10 (bad UTF-8 string) offset=0 reason=11\n    \\x{2000000}\\? \nNo match\n    \\x{7fffffff} \nError -10 (bad UTF-8 string) offset=0 reason=12\n    \\x{7fffffff}\\? \nNo match\n\n/(*UTF8)\\x{1234}/\n  abcd\\x{1234}pqr\n 0: \\x{1234}\n\n/(*CRLF)(*UTF)(*BSR_UNICODE)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nForced newline sequence: CRLF\nFirst char = 'a'\nNeed char = 'b'\n\n/\\h/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xc2 \\xe1 \\xe2 \\xe3 \n    ABC\\x{09}\n 0: \\x{09}\n    ABC\\x{20}\n 0:  \n    ABC\\x{a0}\n 0: \\x{a0}\n    ABC\\x{1680}\n 0: \\x{1680}\n    ABC\\x{180e}\n 0: \\x{180e}\n    ABC\\x{2000}\n 0: \\x{2000}\n    ABC\\x{202f} \n 0: \\x{202f}\n    ABC\\x{205f} \n 0: \\x{205f}\n    ABC\\x{3000} \n 0: \\x{3000}\n\n/\\v/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\xc2 \\xe2 \n    ABC\\x{0a}\n 0: \\x{0a}\n    ABC\\x{0b}\n 0: \\x{0b}\n    ABC\\x{0c}\n 0: \\x{0c}\n    ABC\\x{0d}\n 0: \\x{0d}\n    ABC\\x{85}\n 0: \\x{85}\n    ABC\\x{2028}\n 0: \\x{2028}\n\n/\\h*A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 A \\xc2 \\xe1 \\xe2 \\xe3 \n    CDBABC\n 0: A\n    \n/\\v+A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 2\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\xc2 \\xe2 \n\n/\\s?xxx\\s/8SI\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 4\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 x \n\n/\\sxxx\\s/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 5\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 \\xc2 \n    AB\\x{85}xxx\\x{a0}XYZ\n 0: \\x{85}xxx\\x{a0}\n    AB\\x{a0}xxx\\x{85}XYZ\n 0: \\x{a0}xxx\\x{85}\n\n/\\S \\S/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = ' '\nSubject length lower bound = 3\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x0e \\x0f \n  \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \\x1b \\x1c \\x1d \\x1e \n  \\x1f ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C \n  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h \n  i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \n  \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \n  \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \\xde \\xdf \\xe0 \\xe1 \\xe2 \n  \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \\xed \\xee \\xef \\xf0 \\xf1 \n  \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \\xfc \\xfd \\xfe \\xff \n    \\x{a2} \\x{84} \n 0: \\x{a2} \\x{84}\n    A Z \n 0: A Z\n\n/a+/8\n    a\\x{123}aa\\>1\n 0: aa\n    a\\x{123}aa\\>2\nError -11 (bad UTF-8 offset)\n    a\\x{123}aa\\>3\n 0: aa\n    a\\x{123}aa\\>4\n 0: a\n    a\\x{123}aa\\>5\nNo match\n    a\\x{123}aa\\>6\nError -24 (bad offset value)\n\n/\\x{1234}+/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\xe1 \n\n/\\x{1234}+?/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\xe1 \n\n/\\x{1234}++/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\xe1 \n\n/\\x{1234}{2}/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: \\xe1 \n\n/[^\\x{c4}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/X+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        X++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'X'\nNeed char = \\x{80}\n\n/\\R/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\xc2 \\xe2 \n\n/\\777/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{1ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{c7}\nNeed char = \\x{bf}\n\n/\\w+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\w++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\n\n/\\w+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\w+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\\x{c4}\n    \n/\\W+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n \n/\\W+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n\n/\\W+\\x{A1}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n \n/\\W+\\x{A1}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n\n/X\\s+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\s++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\n\n/X\\s+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        X\n        \\s+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\S+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\S++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\n\n/\\x{a0}+\\s!/8BZ\n------------------------------------------------------------------\n        Bra\n        \\x{a0}++\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/\\x{a0}+\\s!/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\x{a0}+\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/A/8\n  \\x{ff000041}\n** Character \\x{ff000041} is greater than 0x7fffffff and so cannot be converted to UTF-8\n  \\x{7f000041} \nError -10 (bad UTF-8 string) offset=0 reason=12\n\n/(*UTF8)abc/9\nFailed: setting UTF is disabled by the application at offset 0\n\n/abc/89\nFailed: setting UTF is disabled by the application at offset 0\n\n//8+L\n    \\xf1\\xad\\xae\\xae\n 0: \n 0+ \\x{6dbae}\n\n/-- End of testinput15 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput16",
    "content": "/-- This set of tests is run only with the 8-bit library when Unicode property \n    support is available. It starts with tests of the POSIX interface, because\n    that is supported only with the 8-bit library. --/\n\n/\\w/P\n    +++\\x{c2}\nNo match: POSIX code 17: match failed\n\n/\\w/WP\n    +++\\x{c2}\n 0: \\xc2\n    \n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iDZ\n------------------------------------------------------------------\n        Bra\n     /i A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = 'A' (caseless)\nNo need char\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8DZ\n------------------------------------------------------------------\n        Bra\n        A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = \\x{b0}\n\n/AB\\x{1fb0}/8DZ\n------------------------------------------------------------------\n        Bra\n        AB\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = \\x{b0}\n\n/AB\\x{1fb0}/8DZi\n------------------------------------------------------------------\n        Bra\n     /i AB\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = 'A' (caseless)\nNeed char = 'B' (caseless)\n\n/\\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}/8iSI\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 17\nStarting chars: \\xd0 \\xd1 \n    \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n 0: \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n    \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n 0: \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n\n/[ⱥ]/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i \\x{2c65}\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^ⱥ]/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i [^\\x{2c65}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\h/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \n\n/\\v/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \n\n/\\R/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \n\n/[[:blank:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x{212a}+/i8SI\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: K k \\xe2 \n    KKkk\\x{212a}\n 0: KKkk\\x{212a}\n\n/s+/i8SI\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: S s \\xc5 \n    SSss\\x{17f}\n 0: SSss\\x{17f}\n\n/[\\W\\p{Any}]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-/:-@[-^`{-\\xff\\p{Any}]\n        Ket\n        End\n------------------------------------------------------------------\n    abc\n 0: a\n    123 \n 0: 1\n\n/[\\W\\pL]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-/:-@[-^`{-\\xff\\p{L}]\n        Ket\n        End\n------------------------------------------------------------------\n    abc\n 0: a\n    ** Failers \n 0: *\n    123\nNo match\n    \n/[\\D]/8\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n\n/[\\D\\P{Nd}]/8\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n\n/[^\\D]/8\n    a9b\n 0: 9\n    ** Failers\nNo match\n    \\x{1d7cf}\nNo match\n\n/[^\\D\\P{Nd}]/8\n    a9b\n 0: 9\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n    ** Failers\nNo match\n    \\x{10000}\nNo match\n\n/-- End of testinput16 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput17",
    "content": "/-- This set of tests is for the 16- and 32-bit library's basic (non-UTF-16 \n    or -32) features that are not compatible with the 8-bit library, or which \n    give different output in 16- or 32-bit mode. --/\n    \n< forbid 8W \n\n/a\\Cb/\n    aXb\n 0: aXb\n    a\\nb\n 0: a\\x0ab\n  \n/[^\\x{c4}]/DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n  \n/\\x{100}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\x{100}\nNo need char\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/xSI\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: extended\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: \\x09 \\x20 ! \" # $ % & ' ( * + - / 0 1 2 3 4 5 6 7 8 \n  9 = ? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ^ _ ` a b c d e \n  f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\xff \n\n/[\\h]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x09<\n 0: \\x09\n\n/[\\h]+/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]++\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x09\\x20\\xa0<\n 0: \\x09 \\xa0\n\n/[\\v]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x0a-\\x0d\\x85\\x{2028}-\\x{2029}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\h]/BZ\n------------------------------------------------------------------\n        Bra\n        [^\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\h+/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \\xff \n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n 0: \\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\xa0\\x{2000}\n 0: \\x{200a}\\xa0\\x{2000}\n\n/[\\h\\x{dc00}]+/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}\\x{dc00}]++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \\xff \n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n 0: \\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\xa0\\x{2000}\n 0: \\x{200a}\\xa0\\x{2000}\n\n/\\H+/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n 0: \\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n 0: \\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n 0: \\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\xa0\\x{3000}\\x9f\\xa1\\x{2fff}\\x{3001}\n 0: \\x9f\\xa1\\x{2fff}\\x{3001}\n\n/[\\H\\x{d800}]+/\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n 0: \\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n 0: \\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n 0: \\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\xa0\\x{3000}\\x9f\\xa1\\x{2fff}\\x{3001}\n 0: \\x9f\\xa1\\x{2fff}\\x{3001}\n\n/\\v+/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n 0: \\x85\\x0a\\x0b\\x0c\\x0d\n\n/[\\v\\x{dc00}]+/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x0a-\\x0d\\x85\\x{2028}-\\x{2029}\\x{dc00}]++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n 0: \\x85\\x0a\\x0b\\x0c\\x0d\n\n/\\V+/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n 0: \\x{2027}\\x{2030}\n    \\x85\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x84\\x86\n 0: \\x09\\x0e\\x84\\x86\n\n/[\\V\\x{d800}]+/\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n 0: \\x{2027}\\x{2030}\n    \\x85\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x84\\x86\n 0: \\x09\\x0e\\x84\\x86\n\n/\\R+/SI<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x84\\x86\\x85\\x0a\\x0b\\x0c\\x0d\n 0: \\x85\\x0a\\x0b\\x0c\\x0d\n\n/\\x{d800}\\x{d7ff}\\x{dc00}\\x{dc00}\\x{dcff}\\x{dd00}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\x{d800}\nNeed char = \\x{dd00}\n    \\x{d800}\\x{d7ff}\\x{dc00}\\x{dc00}\\x{dcff}\\x{dd00}\n 0: \\x{d800}\\x{d7ff}\\x{dc00}\\x{dc00}\\x{dcff}\\x{dd00}\n\n/[^\\x{80}][^\\x{ff}][^\\x{100}][^\\x{1000}][^\\x{ffff}]/BZ\n------------------------------------------------------------------\n        Bra\n        [^\\x80]\n        [^\\x{ff}]\n        [^\\x{100}]\n        [^\\x{1000}]\n        [^\\x{ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{80}][^\\x{ff}][^\\x{100}][^\\x{1000}][^\\x{ffff}]/BZi\n------------------------------------------------------------------\n        Bra\n     /i [^\\x80]\n     /i [^\\x{ff}]\n     /i [^\\x{100}]\n     /i [^\\x{1000}]\n     /i [^\\x{ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{100}]*[^\\x{1000}]+[^\\x{ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{100}]{5,6}+/BZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{100}]*\n        [^\\x{1000}]+\n        [^\\x{ffff}]??\n        [^\\x{8000}]{4}\n        [^\\x{8000}]*\n        [^\\x{7fff}]{2}\n        [^\\x{7fff}]{0,7}?\n        [^\\x{100}]{5}\n        [^\\x{100}]?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{100}]*[^\\x{1000}]+[^\\x{ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{100}]{5,6}+/BZi\n------------------------------------------------------------------\n        Bra\n     /i [^\\x{100}]*\n     /i [^\\x{1000}]+\n     /i [^\\x{ffff}]??\n     /i [^\\x{8000}]{4}\n     /i [^\\x{8000}]*\n     /i [^\\x{7fff}]{2}\n     /i [^\\x{7fff}]{0,7}?\n     /i [^\\x{100}]{5}\n     /i [^\\x{100}]?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF)XX/K\n    XX\n 0: XX\nMK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\n     \n/(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE)XX/K\n    XX\n 0: XX\nMK: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE\n\n/\\u0100/<JS>BZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\u0100-\\u0200]/<JS>BZ\n------------------------------------------------------------------\n        Bra\n        [\\x{100}-\\x{200}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\ud800/<JS>BZ\n------------------------------------------------------------------\n        Bra\n        \\x{d800}\n        Ket\n        End\n------------------------------------------------------------------\n\n/^\\x{ffff}+/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}?/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}*/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}{3}/i\n    \\x{ffff}\\x{ffff}\\x{ffff}\n 0: \\x{ffff}\\x{ffff}\\x{ffff}\n\n/^\\x{ffff}{0,3}/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/[^\\x00-a]{12,}[^b-\\xff]*/BZ\n------------------------------------------------------------------\n        Bra\n        [b-\\xff] (neg){12,}\n        [\\x00-a] (neg)*+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\s]*\\s* [^\\W]+\\W+ [^\\d]*?\\d0 [^\\d\\w]{4,6}?\\w*A/BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0e-\\x1f!-\\xff] (neg)*\n        \\s*\n         \n        [0-9A-Z_a-z]++\n        \\W+\n         \n        [\\x00-/:-\\xff] (neg)*?\n        \\d\n        0 \n        [\\x00-/:-@[-^`{-\\xff] (neg){4,6}?\n        \\w*\n        A\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*[b-\\x{200}]?a#a*[b-\\x{200}]?b#[a-f]*[g-\\x{200}]*#[g-\\x{200}]*[a-c]*#[g-\\x{200}]*[a-h]*/BZ\n------------------------------------------------------------------\n        Bra\n        a*\n        [b-\\xff\\x{100}-\\x{200}]?+\n        a#\n        a*+\n        [b-\\xff\\x{100}-\\x{200}]?\n        b#\n        [a-f]*+\n        [g-\\xff\\x{100}-\\x{200}]*+\n        #\n        [g-\\xff\\x{100}-\\x{200}]*+\n        [a-c]*+\n        #\n        [g-\\xff\\x{100}-\\x{200}]*\n        [a-h]*+\n        Ket\n        End\n------------------------------------------------------------------\n\n/^[\\x{1234}\\x{4321}]{2,4}?/\n    \\x{1234}\\x{1234}\\x{1234}\n 0: \\x{1234}\\x{1234}\n\n/(*THEN:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)/\n\n/-- End of testinput17 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput18-16",
    "content": "/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to\n    the 16- and 32-bit libraries. --/\n    \n< forbid W \n\n/xxx/8?DZSS\n**Failed: invalid UTF-8 string cannot be converted to UTF-16\n\n/abc/8\n    ]\n**Failed: invalid UTF-8 string cannot be used as input in UTF mode\n\n/X(\\C{3})/8\n    X\\x{11234}Y\n 0: X\\x{11234}Y\n 1: \\x{11234}Y\n    X\\x{11234}YZ\n 0: X\\x{11234}Y\n 1: \\x{11234}Y\n\n/X(\\C{4})/8\n    X\\x{11234}YZ\n 0: X\\x{11234}YZ\n 1: \\x{11234}YZ\n    X\\x{11234}YZW\n 0: X\\x{11234}YZ\n 1: \\x{11234}YZ\n\n/X\\C*/8\n    XYZabcdce\n 0: XYZabcdce\n\n/X\\C*?/8\n    XYZabcde\n 0: X\n\n/X\\C{3,5}/8\n    Xabcdefg\n 0: Xabcde\n    X\\x{11234}Y\n 0: X\\x{11234}Y\n    X\\x{11234}YZ\n 0: X\\x{11234}YZ\n    X\\x{11234}\\x{512}\n 0: X\\x{11234}\\x{512}\n    X\\x{11234}\\x{512}YZ\n 0: X\\x{11234}\\x{512}YZ\n    X\\x{11234}\\x{512}\\x{11234}Z\n 0: X\\x{11234}\\x{512}\\x{11234}\n\n/X\\C{3,5}?/8\n    Xabcdefg\n 0: Xabc\n    X\\x{11234}Y\n 0: X\\x{11234}Y\n    X\\x{11234}YZ\n 0: X\\x{11234}Y\n    X\\x{11234}\\x{512}YZ\n 0: X\\x{11234}\\x{512}\n    *** Failers\nNo match\n    X\\x{11234}\nNo match\n\n/a\\Cb/8\n    aXb\n 0: aXb\n    a\\nb\n 0: a\\x{0a}b\n\n/a\\C\\Cb/8\n    a\\x{12257}b\n 0: a\\x{12257}b\n    a\\x{12257}\\x{11234}b\nNo match\n    ** Failers\nNo match\n    a\\x{100}b\nNo match\n\n/ab\\Cde/8\n    abXde\n 0: abXde\n\n/-- Check maximum character size --/\n\n/\\x{ffff}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ffff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ffff}\nNo need char\n\n/\\x{10000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d800}\nNeed char = \\x{dc00}\n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/\\x{1000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{1000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{1000}\nNo need char\n\n/\\x{10000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d800}\nNeed char = \\x{dc00}\n\n/\\x{100000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{dbc0}\nNeed char = \\x{dc00}\n\n/\\x{10ffff}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10ffff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{dbff}\nNeed char = \\x{dfff}\n\n/[\\x{ff}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/\\x80/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x80\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{80}\nNo need char\n\n/\\xff/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n\n/\\x{D55c}\\x{ad6d}\\x{C5B4}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{d55c}\\x{ad6d}\\x{c5b4}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d55c}\nNeed char = \\x{c5b4}\n    \\x{D55c}\\x{ad6d}\\x{C5B4}\n 0: \\x{d55c}\\x{ad6d}\\x{c5b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{65e5}\\x{672c}\\x{8a9e}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{65e5}\nNeed char = \\x{8a9e}\n    \\x{65e5}\\x{672c}\\x{8a9e}\n 0: \\x{65e5}\\x{672c}\\x{8a9e}\n\n/\\x{80}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x80\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{80}\nNo need char\n\n/\\x{084}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{84}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{84}\nNo need char\n\n/\\x{104}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{104}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{104}\nNo need char\n\n/\\x{861}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{861}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{861}\nNo need char\n\n/\\x{212ab}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{212ab}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d844}\nNeed char = \\x{deab}\n\n/-- This one is here not because it's different to Perl, but because the way\nthe captured single-byte is displayed. (In Perl it becomes a character, and you\ncan't tell the difference.) --/\n\n/X(\\C)(.*)/8\n    X\\x{1234}\n 0: X\\x{1234}\n 1: \\x{1234}\n 2: \n    X\\nabc\n 0: X\\x{0a}abc\n 1: \\x{0a}\n 2: abc\n\n/-- This one is here because Perl gives out a grumbly error message (quite\ncorrectly, but that messes up comparisons). --/\n\n/a\\Cb/8\n    *** Failers\nNo match\n    a\\x{100}b\n 0: a\\x{100}b\n\n/[^ab\\xC0-\\xF0]/8SDZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-`c-\\xbf\\xf1-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0a \n  \\x0b \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \n  \\x1a \\x1b \\x1c \\x1d \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 \n  5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y \n  Z [ \\ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \n  \\x80 \\x81 \\x82 \\x83 \\x84 \\x85 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \n  \\x8f \\x90 \\x91 \\x92 \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \n  \\x9e \\x9f \\xa0 \\xa1 \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \n  \\xad \\xae \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \n  \\xbc \\xbd \\xbe \\xbf \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \n  \\xfc \\xfd \\xfe \\xff \n    \\x{f1}\n 0: \\x{f1}\n    \\x{bf}\n 0: \\x{bf}\n    \\x{100}\n 0: \\x{100}\n    \\x{1000}\n 0: \\x{1000}\n    *** Failers\n 0: *\n    \\x{c0}\nNo match\n    \\x{f0}\nNo match\n\n/Ā{3,4}/8SDZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}{3}\n        \\x{100}?+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = \\x{100}\nSubject length lower bound = 3\nNo starting char list\n  \\x{100}\\x{100}\\x{100}\\x{100\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\n\n/(\\x{100}+|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}++\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xff \n\n/(\\x{100}*a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}*+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xff \n\n/(\\x{100}{0,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}{0,2}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xff \n\n/(\\x{100}{1,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}\n        \\x{100}{0,1}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xff \n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/a\\x{100}\\x{101}*/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{100}\n\n/a\\x{100}\\x{101}+/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{101}\n\n/[^\\x{c4}]/DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n    \\x{100}\n 0: \\x{100}\n    Z\\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers\nNo match\n\n/[\\xff]/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n    >\\x{ff}<\n 0: \\x{ff}\n\n/[^\\xff]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{ff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nFirst char = \\x{100}\nNeed char = 'z'\n\n/\\777/8I\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{1ff}\nNo need char\n  \\x{1ff}\n 0: \\x{1ff}\n  \\777\n 0: \\x{1ff}\n\n/\\x{100}+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = \\x{200}\n\n/\\x{100}+X/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = 'X'\n\n/^[\\QĀ\\E-\\QŐ\\E/BZ8\nFailed: missing terminating ] for character class at offset 13\n\n/X/8\n    \\x{d800}\nError -10 (bad UTF-16 string) offset=0 reason=1\n    \\x{d800}\\?\nNo match\n    \\x{da00}\nError -10 (bad UTF-16 string) offset=0 reason=1\n    \\x{da00}\\?\nNo match\n    \\x{dc00}\nError -10 (bad UTF-16 string) offset=0 reason=3\n    \\x{dc00}\\?\nNo match\n    \\x{de00}\nError -10 (bad UTF-16 string) offset=0 reason=3\n    \\x{de00}\\?\nNo match\n    \\x{dfff}\nError -10 (bad UTF-16 string) offset=0 reason=3\n    \\x{dfff}\\?\nNo match\n    \\x{110000}\n** Failed: character \\x{110000} is greater than 0x10ffff and so cannot be converted to UTF-16\n    \\x{d800}\\x{1234}\nError -10 (bad UTF-16 string) offset=1 reason=2\n\n/(*UTF16)\\x{11234}/\n  abcd\\x{11234}pqr\n 0: \\x{11234}\n\n/(*UTF)\\x{11234}/I\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d804}\nNeed char = \\x{de34}\n  abcd\\x{11234}pqr\n 0: \\x{11234}\n\n/(*UTF-32)\\x{11234}/\nFailed: (*VERB) not recognized or malformed at offset 5\n\n/(*CRLF)(*UTF16)(*BSR_UNICODE)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nForced newline sequence: CRLF\nFirst char = 'a'\nNeed char = 'b'\n\n/(*CRLF)(*UTF32)(*BSR_UNICODE)a\\Rb/I\nFailed: (*VERB) not recognized or malformed at offset 12\n\n/\\h/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \\xff \n    ABC\\x{09}\n 0: \\x{09}\n    ABC\\x{20}\n 0:  \n    ABC\\x{a0}\n 0: \\x{a0}\n    ABC\\x{1680}\n 0: \\x{1680}\n    ABC\\x{180e}\n 0: \\x{180e}\n    ABC\\x{2000}\n 0: \\x{2000}\n    ABC\\x{202f}\n 0: \\x{202f}\n    ABC\\x{205f}\n 0: \\x{205f}\n    ABC\\x{3000}\n 0: \\x{3000}\n\n/\\v/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n    ABC\\x{0a}\n 0: \\x{0a}\n    ABC\\x{0b}\n 0: \\x{0b}\n    ABC\\x{0c}\n 0: \\x{0c}\n    ABC\\x{0d}\n 0: \\x{0d}\n    ABC\\x{85}\n 0: \\x{85}\n    ABC\\x{2028}\n 0: \\x{2028}\n\n/\\h*A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 A \\xa0 \\xff \n    CDBABC\n 0: A\n    \\x{2000}ABC \n 0: \\x{2000}A\n\n/\\R*A/SI8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d A \\x85 \\xff \n    CDBABC\n 0: A\n    \\x{2028}A  \n 0: \\x{2028}A\n\n/\\v+A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 2\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n\n/\\s?xxx\\s/8SI\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 4\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 x \n\n/\\sxxx\\s/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 5\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 \\x85 \\xa0 \n    AB\\x{85}xxx\\x{a0}XYZ\n 0: \\x{85}xxx\\x{a0}\n    AB\\x{a0}xxx\\x{85}XYZ\n 0: \\x{a0}xxx\\x{85}\n\n/\\S \\S/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = ' '\nSubject length lower bound = 3\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x0e \\x0f \n  \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \\x1b \\x1c \\x1d \\x1e \n  \\x1f ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C \n  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h \n  i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \\x81 \\x82 \\x83 \\x84 \n  \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \\x90 \\x91 \\x92 \\x93 \\x94 \n  \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \\x9f \\xa1 \\xa2 \\xa3 \\xa4 \n  \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \n  \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \\xbe \\xbf \\xc0 \\xc1 \\xc2 \n  \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \\xcf \\xd0 \\xd1 \n  \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \\xde \\xdf \\xe0 \n  \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \\xed \\xee \\xef \n  \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \\xfc \\xfd \\xfe \n  \\xff \n    \\x{a2} \\x{84}\n 0: \\x{a2} \\x{84}\n    A Z\n 0: A Z\n\n/a+/8\n    a\\x{123}aa\\>1\n 0: aa\n    a\\x{123}aa\\>2\n 0: aa\n    a\\x{123}aa\\>3\n 0: a\n    a\\x{123}aa\\>4\nNo match\n    a\\x{123}aa\\>5\nError -24 (bad offset value)\n    a\\x{123}aa\\>6\nError -24 (bad offset value)\n\n/\\x{1234}+/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}+?/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}++/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}{2}/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNeed char = \\x{1234}\nSubject length lower bound = 2\nNo starting char list\n\n/[^\\x{c4}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/X+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        X++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'X'\nNeed char = \\x{200}\n\n/\\R/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n\n/-- Check bad offset --/\n\n/a/8\n    \\x{10000}\\>1\nError -11 (bad UTF-16 offset)\n    \\x{10000}ab\\>1\nError -11 (bad UTF-16 offset)\n    \\x{10000}ab\\>2\n 0: a\n    \\x{10000}ab\\>3\nNo match\n    \\x{10000}ab\\>4\nNo match\n    \\x{10000}ab\\>5\nError -24 (bad offset value)\n\n//8\nFailed: invalid UTF-16 string at offset 0\n\n/\\w+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\w++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\n\n/\\w+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\w+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\\x{c4}\n    \n/\\W+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n \n/\\W+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n\n/\\W+\\x{A1}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n \n/\\W+\\x{A1}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n\n/X\\s+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\s++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\n\n/X\\s+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        X\n        \\s+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\S+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\S++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\n\n/\\x{a0}+\\s!/8BZ\n------------------------------------------------------------------\n        Bra\n        \\x{a0}++\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/\\x{a0}+\\s!/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\x{a0}+\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/(*UTF)abc/9\nFailed: setting UTF is disabled by the application at offset 0\n\n/abc/89\nFailed: setting UTF is disabled by the application at offset 0\n\n/-- End of testinput18 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput18-32",
    "content": "/-- This set of tests is for UTF-16 and UTF-32 support, and is relevant only to\n    the 16- and 32-bit libraries. --/\n    \n< forbid W \n\n/xxx/8?DZSS\n**Failed: invalid UTF-8 string cannot be converted to UTF-32\n\n/abc/8\n    ]\n**Failed: invalid UTF-8 string cannot be used as input in UTF mode\n\n/X(\\C{3})/8\n    X\\x{11234}Y\nNo match\n    X\\x{11234}YZ\n 0: X\\x{11234}YZ\n 1: \\x{11234}YZ\n\n/X(\\C{4})/8\n    X\\x{11234}YZ\nNo match\n    X\\x{11234}YZW\n 0: X\\x{11234}YZW\n 1: \\x{11234}YZW\n\n/X\\C*/8\n    XYZabcdce\n 0: XYZabcdce\n\n/X\\C*?/8\n    XYZabcde\n 0: X\n\n/X\\C{3,5}/8\n    Xabcdefg\n 0: Xabcde\n    X\\x{11234}Y\nNo match\n    X\\x{11234}YZ\n 0: X\\x{11234}YZ\n    X\\x{11234}\\x{512}\nNo match\n    X\\x{11234}\\x{512}YZ\n 0: X\\x{11234}\\x{512}YZ\n    X\\x{11234}\\x{512}\\x{11234}Z\n 0: X\\x{11234}\\x{512}\\x{11234}Z\n\n/X\\C{3,5}?/8\n    Xabcdefg\n 0: Xabc\n    X\\x{11234}Y\nNo match\n    X\\x{11234}YZ\n 0: X\\x{11234}YZ\n    X\\x{11234}\\x{512}YZ\n 0: X\\x{11234}\\x{512}Y\n    *** Failers\nNo match\n    X\\x{11234}\nNo match\n\n/a\\Cb/8\n    aXb\n 0: aXb\n    a\\nb\n 0: a\\x{0a}b\n\n/a\\C\\Cb/8\n    a\\x{12257}b\nNo match\n    a\\x{12257}\\x{11234}b\n 0: a\\x{12257}\\x{11234}b\n    ** Failers\nNo match\n    a\\x{100}b\nNo match\n\n/ab\\Cde/8\n    abXde\n 0: abXde\n\n/-- Check maximum character size --/\n\n/\\x{ffff}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ffff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ffff}\nNo need char\n\n/\\x{10000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{10000}\nNo need char\n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/\\x{1000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{1000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{1000}\nNo need char\n\n/\\x{10000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{10000}\nNo need char\n\n/\\x{100000}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100000}\nNo need char\n\n/\\x{10ffff}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{10ffff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{10ffff}\nNo need char\n\n/[\\x{ff}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/\\x80/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x80\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{80}\nNo need char\n\n/\\xff/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n\n/\\x{D55c}\\x{ad6d}\\x{C5B4}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{d55c}\\x{ad6d}\\x{c5b4}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{d55c}\nNeed char = \\x{c5b4}\n    \\x{D55c}\\x{ad6d}\\x{C5B4}\n 0: \\x{d55c}\\x{ad6d}\\x{c5b4}\n\n/\\x{65e5}\\x{672c}\\x{8a9e}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{65e5}\\x{672c}\\x{8a9e}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{65e5}\nNeed char = \\x{8a9e}\n    \\x{65e5}\\x{672c}\\x{8a9e}\n 0: \\x{65e5}\\x{672c}\\x{8a9e}\n\n/\\x{80}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x80\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{80}\nNo need char\n\n/\\x{084}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{84}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{84}\nNo need char\n\n/\\x{104}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{104}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{104}\nNo need char\n\n/\\x{861}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{861}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{861}\nNo need char\n\n/\\x{212ab}/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{212ab}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{212ab}\nNo need char\n\n/-- This one is here not because it's different to Perl, but because the way\nthe captured single-byte is displayed. (In Perl it becomes a character, and you\ncan't tell the difference.) --/\n\n/X(\\C)(.*)/8\n    X\\x{1234}\n 0: X\\x{1234}\n 1: \\x{1234}\n 2: \n    X\\nabc\n 0: X\\x{0a}abc\n 1: \\x{0a}\n 2: abc\n\n/-- This one is here because Perl gives out a grumbly error message (quite\ncorrectly, but that messes up comparisons). --/\n\n/a\\Cb/8\n    *** Failers\nNo match\n    a\\x{100}b\n 0: a\\x{100}b\n\n/[^ab\\xC0-\\xF0]/8SDZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-`c-\\xbf\\xf1-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0a \n  \\x0b \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \n  \\x1a \\x1b \\x1c \\x1d \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 \n  5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y \n  Z [ \\ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \n  \\x80 \\x81 \\x82 \\x83 \\x84 \\x85 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \n  \\x8f \\x90 \\x91 \\x92 \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \n  \\x9e \\x9f \\xa0 \\xa1 \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \n  \\xad \\xae \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \n  \\xbc \\xbd \\xbe \\xbf \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \n  \\xfc \\xfd \\xfe \\xff \n    \\x{f1}\n 0: \\x{f1}\n    \\x{bf}\n 0: \\x{bf}\n    \\x{100}\n 0: \\x{100}\n    \\x{1000}\n 0: \\x{1000}\n    *** Failers\n 0: *\n    \\x{c0}\nNo match\n    \\x{f0}\nNo match\n\n/Ā{3,4}/8SDZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}{3}\n        \\x{100}?+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = \\x{100}\nSubject length lower bound = 3\nNo starting char list\n  \\x{100}\\x{100}\\x{100}\\x{100\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\n\n/(\\x{100}+|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}++\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xff \n\n/(\\x{100}*a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}*+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xff \n\n/(\\x{100}{0,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}{0,2}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a x \\xff \n\n/(\\x{100}{1,2}a|x)/8SDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\x{100}\n        \\x{100}{0,1}+\n        a\n        Alt\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x \\xff \n\n/\\x{100}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n\n/a\\x{100}\\x{101}*/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{100}\n\n/a\\x{100}\\x{101}+/8DZ\n------------------------------------------------------------------\n        Bra\n        a\\x{100}\n        \\x{101}++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = \\x{101}\n\n/[^\\x{c4}]/DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNo need char\n    \\x{100}\n 0: \\x{100}\n    Z\\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers\nNo match\n\n/[\\xff]/DZ8\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{ff}\nNo need char\n    >\\x{ff}<\n 0: \\x{ff}\n\n/[^\\xff]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{ff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nFirst char = \\x{100}\nNeed char = 'z'\n\n/\\777/8I\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{1ff}\nNo need char\n  \\x{1ff}\n 0: \\x{1ff}\n  \\777\n 0: \\x{1ff}\n\n/\\x{100}+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = \\x{200}\n\n/\\x{100}+X/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}++\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{100}\nNeed char = 'X'\n\n/^[\\QĀ\\E-\\QŐ\\E/BZ8\nFailed: missing terminating ] for character class at offset 13\n\n/X/8\n    \\x{d800}\nError -10 (bad UTF-32 string) offset=0 reason=1\n    \\x{d800}\\?\nNo match\n    \\x{da00}\nError -10 (bad UTF-32 string) offset=0 reason=1\n    \\x{da00}\\?\nNo match\n    \\x{dc00}\nError -10 (bad UTF-32 string) offset=0 reason=1\n    \\x{dc00}\\?\nNo match\n    \\x{de00}\nError -10 (bad UTF-32 string) offset=0 reason=1\n    \\x{de00}\\?\nNo match\n    \\x{dfff}\nError -10 (bad UTF-32 string) offset=0 reason=1\n    \\x{dfff}\\?\nNo match\n    \\x{110000}\nError -10 (bad UTF-32 string) offset=0 reason=3\n    \\x{d800}\\x{1234}\nError -10 (bad UTF-32 string) offset=0 reason=1\n\n/(*UTF16)\\x{11234}/\nFailed: (*VERB) not recognized or malformed at offset 5\n\n/(*UTF)\\x{11234}/I\nCapturing subpattern count = 0\nOptions: utf\nFirst char = \\x{11234}\nNo need char\n  abcd\\x{11234}pqr\n 0: \\x{11234}\n\n/(*UTF-32)\\x{11234}/\nFailed: (*VERB) not recognized or malformed at offset 5\n\n/(*CRLF)(*UTF16)(*BSR_UNICODE)a\\Rb/I\nFailed: (*VERB) not recognized or malformed at offset 12\n\n/(*CRLF)(*UTF32)(*BSR_UNICODE)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nForced newline sequence: CRLF\nFirst char = 'a'\nNeed char = 'b'\n\n/\\h/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 \\xa0 \\xff \n    ABC\\x{09}\n 0: \\x{09}\n    ABC\\x{20}\n 0:  \n    ABC\\x{a0}\n 0: \\x{a0}\n    ABC\\x{1680}\n 0: \\x{1680}\n    ABC\\x{180e}\n 0: \\x{180e}\n    ABC\\x{2000}\n 0: \\x{2000}\n    ABC\\x{202f}\n 0: \\x{202f}\n    ABC\\x{205f}\n 0: \\x{205f}\n    ABC\\x{3000}\n 0: \\x{3000}\n\n/\\v/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n    ABC\\x{0a}\n 0: \\x{0a}\n    ABC\\x{0b}\n 0: \\x{0b}\n    ABC\\x{0c}\n 0: \\x{0c}\n    ABC\\x{0d}\n 0: \\x{0d}\n    ABC\\x{85}\n 0: \\x{85}\n    ABC\\x{2028}\n 0: \\x{2028}\n\n/\\h*A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 1\nStarting chars: \\x09 \\x20 A \\xa0 \\xff \n    CDBABC\n 0: A\n    \\x{2000}ABC \n 0: \\x{2000}A\n\n/\\R*A/SI8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d A \\x85 \\xff \n    CDBABC\n 0: A\n    \\x{2028}A  \n 0: \\x{2028}A\n\n/\\v+A/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\nSubject length lower bound = 2\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n\n/\\s?xxx\\s/8SI\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 4\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 x \n\n/\\sxxx\\s/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'x'\nSubject length lower bound = 5\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 \\x85 \\xa0 \n    AB\\x{85}xxx\\x{a0}XYZ\n 0: \\x{85}xxx\\x{a0}\n    AB\\x{a0}xxx\\x{85}XYZ\n 0: \\x{a0}xxx\\x{85}\n\n/\\S \\S/I8ST1\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = ' '\nSubject length lower bound = 3\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x0e \\x0f \n  \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \\x1b \\x1c \\x1d \\x1e \n  \\x1f ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C \n  D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h \n  i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \\x81 \\x82 \\x83 \\x84 \n  \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \\x90 \\x91 \\x92 \\x93 \\x94 \n  \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \\x9f \\xa1 \\xa2 \\xa3 \\xa4 \n  \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \n  \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \\xbe \\xbf \\xc0 \\xc1 \\xc2 \n  \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \\xcf \\xd0 \\xd1 \n  \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \\xde \\xdf \\xe0 \n  \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \\xed \\xee \\xef \n  \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \\xfc \\xfd \\xfe \n  \\xff \n    \\x{a2} \\x{84}\n 0: \\x{a2} \\x{84}\n    A Z\n 0: A Z\n\n/a+/8\n    a\\x{123}aa\\>1\n 0: aa\n    a\\x{123}aa\\>2\n 0: aa\n    a\\x{123}aa\\>3\n 0: a\n    a\\x{123}aa\\>4\nNo match\n    a\\x{123}aa\\>5\nError -24 (bad offset value)\n    a\\x{123}aa\\>6\nError -24 (bad offset value)\n\n/\\x{1234}+/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}+?/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}++/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/\\x{1234}{2}/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{1234}\nNeed char = \\x{1234}\nSubject length lower bound = 2\nNo starting char list\n\n/[^\\x{c4}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{c4}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/X+\\x{200}/8DZ\n------------------------------------------------------------------\n        Bra\n        X++\n        \\x{200}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'X'\nNeed char = \\x{200}\n\n/\\R/SI8\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x0a \\x0b \\x0c \\x0d \\x85 \\xff \n\n/-- Check bad offset --/\n\n/a/8\n    \\x{10000}\\>1\nNo match\n    \\x{10000}ab\\>1\n 0: a\n    \\x{10000}ab\\>2\nNo match\n    \\x{10000}ab\\>3\nNo match\n    \\x{10000}ab\\>4\nError -24 (bad offset value)\n    \\x{10000}ab\\>5\nError -24 (bad offset value)\n\n//8\n**Failed: character value is ill-formed UTF-32\n\n/\\w+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\w++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\n\n/\\w+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\w+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x{C4}\\x{C4}\n 0: a\\x{c4}\\x{c4}\n    \n/\\W+\\x{C4}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n \n/\\W+\\x{C4}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W++\n        \\x{c4}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{C4}\n 0: !\\x{c4}\n\n/\\W+\\x{A1}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n \n/\\W+\\x{A1}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\x{a1}\n        Ket\n        End\n------------------------------------------------------------------\n    !\\x{A1}\n 0: !\\x{a1}\n\n/X\\s+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\s++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\n\n/X\\s+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        X\n        \\s+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x{A0}\\x{A0}\n 0: X \\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZ\n------------------------------------------------------------------\n        Bra\n        \\S+\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\\x{a0}\n\n/\\S+\\x{A0}/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\S++\n        \\x{a0}\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x{A0}\\x{A0}\n 0: X\\x{a0}\n\n/\\x{a0}+\\s!/8BZ\n------------------------------------------------------------------\n        Bra\n        \\x{a0}++\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/\\x{a0}+\\s!/8BZT1\n------------------------------------------------------------------\n        Bra\n        \\x{a0}+\n        \\s\n        !\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{a0}\\x20!\n 0: \\x{a0} !\n\n/(*UTF)abc/9\nFailed: setting UTF is disabled by the application at offset 0\n\n/abc/89\nFailed: setting UTF is disabled by the application at offset 0\n\n/-- End of testinput18 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput19",
    "content": "/-- This set of tests is for Unicode property support, relevant only to the\n    16- and 32-bit library. --/\n    \n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8iDZ\n------------------------------------------------------------------\n        Bra\n     /i A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = 'A' (caseless)\nNeed char = \\x{1fb0} (caseless)\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8DZ\n------------------------------------------------------------------\n        Bra\n        A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = \\x{1fb0}\n\n/AB\\x{1fb0}/8DZ\n------------------------------------------------------------------\n        Bra\n        AB\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = \\x{1fb0}\n\n/AB\\x{1fb0}/8DZi\n------------------------------------------------------------------\n        Bra\n     /i AB\\x{1fb0}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = 'A' (caseless)\nNeed char = \\x{1fb0} (caseless)\n\n/\\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}/8iSI\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = \\x{401} (caseless)\nNeed char = \\x{42f} (caseless)\nSubject length lower bound = 17\nNo starting char list\n    \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n 0: \\x{401}\\x{420}\\x{421}\\x{422}\\x{423}\\x{424}\\x{425}\\x{426}\\x{427}\\x{428}\\x{429}\\x{42a}\\x{42b}\\x{42c}\\x{42d}\\x{42e}\\x{42f}\n    \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n 0: \\x{451}\\x{440}\\x{441}\\x{442}\\x{443}\\x{444}\\x{445}\\x{446}\\x{447}\\x{448}\\x{449}\\x{44a}\\x{44b}\\x{44c}\\x{44d}\\x{44e}\\x{44f}\n\n/[ⱥ]/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i \\x{2c65}\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^ⱥ]/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i [^\\x{2c65}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:blank:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x{212a}+/i8SI\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: K k \\xff \n    KKkk\\x{212a}\n 0: KKkk\\x{212a}\n\n/s+/i8SI\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: S s \\xff \n    SSss\\x{17f}\n 0: SSss\\x{17f}\n\n/[\\D]/8\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n\n/[\\D\\P{Nd}]/8\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n\n/[^\\D]/8\n    a9b\n 0: 9\n    ** Failers\nNo match\n    \\x{1d7cf}\nNo match\n\n/[^\\D\\P{Nd}]/8\n    a9b\n 0: 9\n    \\x{1d7cf}\n 0: \\x{1d7cf}\n    ** Failers\nNo match\n    \\x{10000}\nNo match\n\n/-- End of testinput19 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testoutput2",
    "content": "/-- This set of tests is not Perl-compatible. It checks on special features\n    of PCRE's API, error diagnostics, and the compiled code of some patterns.\n    It also checks the non-Perl syntax the PCRE supports (Python, .NET, \n    Oniguruma). Finally, there are some tests where PCRE and Perl differ, \n    either because PCRE can't be compatible, or there is a possible Perl \n    bug.\n    \n    NOTE: This is a non-UTF set of tests. When UTF support is needed, use\n    test 5, and if Unicode Property Support is needed, use test 7. --/\n    \n< forbid 8W \n  \n/(a)b|/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/abc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n    abc\n 0: abc\n    defabc\n 0: abc\n    \\Aabc\n 0: abc\n    *** Failers\nNo match\n    \\Adefabc\nNo match\n    ABC\nNo match\n\n/^abc/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    abc\n 0: abc\n    \\Aabc\n 0: abc\n    *** Failers\nNo match\n    defabc\nNo match\n    \\Adefabc\nNo match\n\n/a+bc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/a*bc/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'c'\n\n/a{3}bc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/(abc|a+z)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/^abc$/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    abc\n 0: abc\n    *** Failers\nNo match\n    def\\nabc\nNo match\n\n/ab\\idef/X\nFailed: unrecognized character follows \\ at offset 3\n\n/(?X)ab\\idef/X\nFailed: unrecognized character follows \\ at offset 7\n\n/x{5,4}/\nFailed: numbers out of order in {} quantifier at offset 5\n\n/z{65536}/\nFailed: number too big in {} quantifier at offset 7\n\n/[abcd/\nFailed: missing terminating ] for character class at offset 5\n\n/(?X)[\\B]/\nFailed: invalid escape sequence in character class at offset 6\n\n/(?X)[\\R]/\nFailed: invalid escape sequence in character class at offset 6\n\n/(?X)[\\X]/\nFailed: invalid escape sequence in character class at offset 6\n\n/[\\B]/BZ\n------------------------------------------------------------------\n        Bra\n        B\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\R]/BZ\n------------------------------------------------------------------\n        Bra\n        R\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\X]/BZ\n------------------------------------------------------------------\n        Bra\n        X\n        Ket\n        End\n------------------------------------------------------------------\n\n/[z-a]/\nFailed: range out of order in character class at offset 3\n\n/^*/\nFailed: nothing to repeat at offset 1\n\n/(abc/\nFailed: missing ) at offset 4\n\n/(?# abc/\nFailed: missing ) after comment at offset 7\n\n/(?z)abc/\nFailed: unrecognized character after (? or (?- at offset 2\n\n/.*b/I\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/.*?b/I\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/cat|dog|elephant/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n    this sentence eventually mentions a cat\n 0: cat\n    this sentences rambles on and on for a while and then reaches elephant\n 0: elephant\n\n/cat|dog|elephant/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: c d e \n    this sentence eventually mentions a cat\n 0: cat\n    this sentences rambles on and on for a while and then reaches elephant\n 0: elephant\n\n/cat|dog|elephant/IiS\nCapturing subpattern count = 0\nOptions: caseless\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: C D E c d e \n    this sentence eventually mentions a CAT cat\n 0: CAT\n    this sentences rambles on and on for a while to elephant ElePhant\n 0: elephant\n\n/a|[bcd]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/(a|[^\\dZ])/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0a \n  \\x0b \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \n  \\x1a \\x1b \\x1c \\x1d \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / : ; < = > \n  ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \\ ] ^ _ ` a b c d \n  e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \\x81 \\x82 \\x83 \n  \\x84 \\x85 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \\x90 \\x91 \\x92 \n  \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \\x9f \\xa0 \\xa1 \n  \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \\xaf \\xb0 \n  \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \\xbe \\xbf \n  \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \n  \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \n  \\xde \\xdf \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \n  \\xed \\xee \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \n  \\xfc \\xfd \\xfe \\xff \n\n/(a|b)*[\\s]/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 a b \n\n/(ab\\2)/\nFailed: reference to non-existent subpattern at offset 6\n\n/{4,5}abc/\nFailed: nothing to repeat at offset 4\n\n/(a)(b)(c)\\2/I\nCapturing subpattern count = 3\nMax back reference = 2\nNo options\nFirst char = 'a'\nNeed char = 'c'\n    abcb\n 0: abcb\n 1: a\n 2: b\n 3: c\n    \\O0abcb\nMatched, but too many substrings\n    \\O3abcb\nMatched, but too many substrings\n 0: abcb\n    \\O6abcb\nMatched, but too many substrings\n 0: abcb\n 1: a\n    \\O9abcb\nMatched, but too many substrings\n 0: abcb\n 1: a\n 2: b\n    \\O12abcb\n 0: abcb\n 1: a\n 2: b\n 3: c\n\n/(a)bc|(a)(b)\\2/I\nCapturing subpattern count = 3\nMax back reference = 2\nNo options\nFirst char = 'a'\nNo need char\n    abc\n 0: abc\n 1: a\n    \\O0abc\nMatched, but too many substrings\n    \\O3abc\nMatched, but too many substrings\n 0: abc\n    \\O6abc\n 0: abc\n 1: a\n    aba\n 0: aba\n 1: <unset>\n 2: a\n 3: b\n    \\O0aba\nMatched, but too many substrings\n    \\O3aba\nMatched, but too many substrings\n 0: aba\n    \\O6aba\nMatched, but too many substrings\n 0: aba\n 1: <unset>\n    \\O9aba\nMatched, but too many substrings\n 0: aba\n 1: <unset>\n 2: a\n    \\O12aba\n 0: aba\n 1: <unset>\n 2: a\n 3: b\n\n/abc$/IE\nCapturing subpattern count = 0\nOptions: dollar_endonly\nFirst char = 'a'\nNeed char = 'c'\n    abc\n 0: abc\n    *** Failers\nNo match\n    abc\\n\nNo match\n    abc\\ndef\nNo match\n\n/(a)(b)(c)(d)(e)\\6/\nFailed: reference to non-existent subpattern at offset 17\n\n/the quick brown fox/I\nCapturing subpattern count = 0\nNo options\nFirst char = 't'\nNeed char = 'x'\n    the quick brown fox\n 0: the quick brown fox\n    this is a line with the quick brown fox\n 0: the quick brown fox\n\n/the quick brown fox/IA\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    the quick brown fox\n 0: the quick brown fox\n    *** Failers\nNo match\n    this is a line with the quick brown fox\nNo match\n\n/ab(?z)cd/\nFailed: unrecognized character after (? or (?- at offset 4\n\n/^abc|def/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n    abcdef\n 0: abc\n    abcdef\\B\n 0: def\n\n/.*((abc)$|(def))/I\nCapturing subpattern count = 3\nNo options\nFirst char at start or follows newline\nNo need char\n    defabc\n 0: defabc\n 1: abc\n 2: abc\n    \\Zdefabc\n 0: def\n 1: def\n 2: <unset>\n 3: def\n\n/)/\nFailed: unmatched parentheses at offset 0\n\n/a[]b/\nFailed: missing terminating ] for character class at offset 4\n\n/[^aeiou ]{3,}/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n    co-processors, and for\n 0: -pr\n\n/<.*>/I\nCapturing subpattern count = 0\nNo options\nFirst char = '<'\nNeed char = '>'\n    abc<def>ghi<klm>nop\n 0: <def>ghi<klm>\n\n/<.*?>/I\nCapturing subpattern count = 0\nNo options\nFirst char = '<'\nNeed char = '>'\n    abc<def>ghi<klm>nop\n 0: <def>\n\n/<.*>/IU\nCapturing subpattern count = 0\nOptions: ungreedy\nFirst char = '<'\nNeed char = '>'\n    abc<def>ghi<klm>nop\n 0: <def>\n\n/(?U)<.*>/I\nCapturing subpattern count = 0\nNo options\nFirst char = '<'\nNeed char = '>'\n    abc<def>ghi<klm>nop\n 0: <def>\n\n/<.*?>/IU\nCapturing subpattern count = 0\nOptions: ungreedy\nFirst char = '<'\nNeed char = '>'\n    abc<def>ghi<klm>nop\n 0: <def>ghi<klm>\n\n/={3,}/IU\nCapturing subpattern count = 0\nOptions: ungreedy\nFirst char = '='\nNeed char = '='\n    abc========def\n 0: ===\n\n/(?U)={3,}?/I\nCapturing subpattern count = 0\nNo options\nFirst char = '='\nNeed char = '='\n    abc========def\n 0: ========\n\n/(?<!bar|cattle)foo/I\nCapturing subpattern count = 0\nMax lookbehind = 6\nNo options\nFirst char = 'f'\nNeed char = 'o'\n    foo\n 0: foo\n    catfoo\n 0: foo\n    *** Failers\nNo match\n    the barfoo\nNo match\n    and cattlefoo\nNo match\n\n/(?<=a+)b/\nFailed: lookbehind assertion is not fixed length at offset 6\n\n/(?<=aaa|b{0,3})b/\nFailed: lookbehind assertion is not fixed length at offset 14\n\n/(?<!(foo)a\\1)bar/\nFailed: lookbehind assertion is not fixed length at offset 12\n\n/(?i)abc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a' (caseless)\nNeed char = 'c' (caseless)\n\n/(a|(?m)a)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/(?i)^1234/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/(^b|(?i)^d)/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n\n/(?s).*/I\nCapturing subpattern count = 0\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n\n/[abcd]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/(?i)[abcd]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: A B C D a b c d \n\n/(?m)[xy]|(b|c)/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: b c x y \n\n/(^a|^b)/Im\nCapturing subpattern count = 1\nOptions: multiline\nFirst char at start or follows newline\nNo need char\n\n/(?i)(^a|^b)/Im\nCapturing subpattern count = 1\nOptions: multiline\nFirst char at start or follows newline\nNo need char\n\n/(a)(?(1)a|b|c)/\nFailed: conditional group contains more than two branches at offset 13\n\n/(?(?=a)a|b|c)/\nFailed: conditional group contains more than two branches at offset 12\n\n/(?(1a)/\nFailed: malformed number or name after (?( at offset 4\n\n/(?(1a))/\nFailed: malformed number or name after (?( at offset 4\n\n/(?(?i))/\nFailed: assertion expected after (?( or (?(?C) at offset 3\n\n/(?(abc))/\nFailed: reference to non-existent subpattern at offset 7\n\n/(?(?<ab))/\nFailed: assertion expected after (?( or (?(?C) at offset 3\n\n/((?s)blah)\\s+\\1/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'b'\nNeed char = 'h'\n\n/((?i)blah)\\s+\\1/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'b' (caseless)\nNeed char = 'h' (caseless)\n\n/((?i)b)/IDZS\n------------------------------------------------------------------\n        Bra\n        CBra 1\n     /i b\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'b' (caseless)\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/(a*b|(?i:c*(?-i)d))/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: C a b c d \n\n/a$/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n    a\n 0: a\n    a\\n\n 0: a\n    *** Failers\nNo match\n    \\Za\nNo match\n    \\Za\\n\nNo match\n\n/a$/Im\nCapturing subpattern count = 0\nOptions: multiline\nFirst char = 'a'\nNo need char\n    a\n 0: a\n    a\\n\n 0: a\n    \\Za\\n\n 0: a\n    *** Failers\nNo match\n    \\Za\nNo match\n\n/\\Aabc/Im\nCapturing subpattern count = 0\nMax lookbehind = 1\nOptions: anchored multiline\nNo first char\nNo need char\n\n/^abc/Im\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'c'\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/I\nCapturing subpattern count = 5\nOptions: anchored\nNo first char\nNo need char\n  aaaaabbbbbcccccdef\n 0: aaaaabbbbbcccccdef\n 1: aaaaabbbbbcccccdef\n 2: aaaaa\n 3: b\n 4: bbbbccccc\n 5: def\n\n/(?<=foo)[ab]/IS\nCapturing subpattern count = 0\nMax lookbehind = 3\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \n\n/(?<!foo)(alpha|omega)/IS\nCapturing subpattern count = 1\nMax lookbehind = 3\nNo options\nNo first char\nNeed char = 'a'\nSubject length lower bound = 5\nStarting chars: a o \n\n/(?!alphabet)[ab]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \n\n/(?<=foo\\n)^bar/Im\nCapturing subpattern count = 0\nMax lookbehind = 4\nContains explicit CR or LF match\nOptions: multiline\nNo first char\nNeed char = 'r'\n    foo\\nbarbar\n 0: bar\n    ***Failers\nNo match\n    rhubarb\nNo match\n    barbell\nNo match\n    abc\\nbarton\nNo match\n\n/^(?<=foo\\n)bar/Im\nCapturing subpattern count = 0\nMax lookbehind = 4\nContains explicit CR or LF match\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'r'\n    foo\\nbarbar\n 0: bar\n    ***Failers\nNo match\n    rhubarb\nNo match\n    barbell\nNo match\n    abc\\nbarton\nNo match\n\n/(?>^abc)/Im\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'c'\n    abc\n 0: abc\n    def\\nabc\n 0: abc\n    *** Failers\nNo match\n    defabc\nNo match\n\n/(?<=ab(c+)d)ef/\nFailed: lookbehind assertion is not fixed length at offset 11\n\n/(?<=ab(?<=c+)d)ef/\nFailed: lookbehind assertion is not fixed length at offset 12\n\n/(?<=ab(c|de)f)g/\nFailed: lookbehind assertion is not fixed length at offset 13\n\n/The next three are in testinput2 because they have variable length branches/\n\n/(?<=bullock|donkey)-cart/I\nCapturing subpattern count = 0\nMax lookbehind = 7\nNo options\nFirst char = '-'\nNeed char = 't'\n    the bullock-cart\n 0: -cart\n    a donkey-cart race\n 0: -cart\n    *** Failers\nNo match\n    cart\nNo match\n    horse-and-cart\nNo match\n\n/(?<=ab(?i)x|y|z)/I\nCapturing subpattern count = 0\nMax lookbehind = 3\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(?>.*)(?<=(abcd)|(xyz))/I\nCapturing subpattern count = 2\nMax lookbehind = 4\nMay match empty string\nNo options\nNo first char\nNo need char\n    alphabetabcd\n 0: alphabetabcd\n 1: abcd\n    endingxyz\n 0: endingxyz\n 1: <unset>\n 2: xyz\n\n/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/I\nCapturing subpattern count = 0\nMax lookbehind = 4\nNo options\nFirst char = 'Z'\nNeed char = 'Z'\n    abxyZZ\n 0: ZZ\n    abXyZZ\n 0: ZZ\n    ZZZ\n 0: ZZ\n    zZZ\n 0: ZZ\n    bZZ\n 0: ZZ\n    BZZ\n 0: ZZ\n    *** Failers\nNo match\n    ZZ\nNo match\n    abXYZZ\nNo match\n    zzz\nNo match\n    bzz\nNo match\n\n/(?<!(foo)a)bar/I\nCapturing subpattern count = 1\nMax lookbehind = 4\nNo options\nFirst char = 'b'\nNeed char = 'r'\n    bar\n 0: bar\n    foobbar\n 0: bar\n    *** Failers\nNo match\n    fooabar\nNo match\n\n/This one is here because Perl behaves differently; see also the following/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'T'\nNeed char = 'g'\n\n/^(a\\1?){4}$/I\nCapturing subpattern count = 1\nMax back reference = 1\nOptions: anchored\nNo first char\nNo need char\n    aaaa\nNo match\n    aaaaaa\nNo match\n    \n/Perl does not fail these two for the final subjects. Neither did PCRE until/\n/release 8.01. The problem is in backtracking into a subpattern that contains/\nNo match\n/a recursive reference to itself. PCRE has now made these into atomic patterns./\nNo match\n\n/^(xa|=?\\1a){2}$/\n    xa=xaa\n 0: xa=xaa\n 1: =xaa\n    ** Failers\nNo match\n    xa=xaaa\nNo match\n\n/^(xa|=?\\1a)+$/\n    xa=xaa\n 0: xa=xaa\n 1: =xaa\n    ** Failers\nNo match\n    xa=xaaa\nNo match\n\n/These are syntax tests from Perl 5.005/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'T'\nNeed char = '5'\n\n/a[b-a]/\nFailed: range out of order in character class at offset 4\n\n/a[]b/\nFailed: missing terminating ] for character class at offset 4\n\n/a[/\nFailed: missing terminating ] for character class at offset 2\n\n/*a/\nFailed: nothing to repeat at offset 0\n\n/(*)b/\nFailed: nothing to repeat at offset 1\n\n/abc)/\nFailed: unmatched parentheses at offset 3\n\n/(abc/\nFailed: missing ) at offset 4\n\n/a**/\nFailed: nothing to repeat at offset 2\n\n/)(/\nFailed: unmatched parentheses at offset 0\n\n/\\1/\nFailed: reference to non-existent subpattern at offset 2\n\n/\\2/\nFailed: reference to non-existent subpattern at offset 2\n\n/(a)|\\2/\nFailed: reference to non-existent subpattern at offset 6\n\n/a[b-a]/Ii\nFailed: range out of order in character class at offset 4\n\n/a[]b/Ii\nFailed: missing terminating ] for character class at offset 4\n\n/a[/Ii\nFailed: missing terminating ] for character class at offset 2\n\n/*a/Ii\nFailed: nothing to repeat at offset 0\n\n/(*)b/Ii\nFailed: nothing to repeat at offset 1\n\n/abc)/Ii\nFailed: unmatched parentheses at offset 3\n\n/(abc/Ii\nFailed: missing ) at offset 4\n\n/a**/Ii\nFailed: nothing to repeat at offset 2\n\n/)(/Ii\nFailed: unmatched parentheses at offset 0\n\n/:(?:/\nFailed: missing ) at offset 4\n\n/(?<%)b/\nFailed: unrecognized character after (?< at offset 3\n\n/a(?{)b/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/a(?{{})b/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/a(?{}})b/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/a(?{\"{\"})b/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/a(?{\"{\"}})b/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/(?(1?)a|b)/\nFailed: malformed number or name after (?( at offset 4\n\n/[a[:xyz:/\nFailed: missing terminating ] for character class at offset 8\n\n/(?<=x+)y/\nFailed: lookbehind assertion is not fixed length at offset 6\n\n/a{37,17}/\nFailed: numbers out of order in {} quantifier at offset 7\n\n/abc/\\\nFailed: \\ at end of pattern at offset 4\n\n/abc/\\i\nFailed: \\ at end of pattern at offset 4\n\n/(a)bc(d)/I\nCapturing subpattern count = 2\nNo options\nFirst char = 'a'\nNeed char = 'd'\n    abcd\n 0: abcd\n 1: a\n 2: d\n    abcd\\C2\n 0: abcd\n 1: a\n 2: d\n 2C d (1)\n    abcd\\C5\n 0: abcd\n 1: a\n 2: d\ncopy substring 5 failed -7\n\n/(.{20})/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n    abcdefghijklmnopqrstuvwxyz\n 0: abcdefghijklmnopqrst\n 1: abcdefghijklmnopqrst\n    abcdefghijklmnopqrstuvwxyz\\C1\n 0: abcdefghijklmnopqrst\n 1: abcdefghijklmnopqrst\n 1C abcdefghijklmnopqrst (20)\n    abcdefghijklmnopqrstuvwxyz\\G1\n 0: abcdefghijklmnopqrst\n 1: abcdefghijklmnopqrst\n 1G abcdefghijklmnopqrst (20)\n\n/(.{15})/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n    abcdefghijklmnopqrstuvwxyz\n 0: abcdefghijklmno\n 1: abcdefghijklmno\n    abcdefghijklmnopqrstuvwxyz\\C1\\G1\n 0: abcdefghijklmno\n 1: abcdefghijklmno\n 1C abcdefghijklmno (15)\n 1G abcdefghijklmno (15)\n\n/(.{16})/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n    abcdefghijklmnopqrstuvwxyz\n 0: abcdefghijklmnop\n 1: abcdefghijklmnop\n    abcdefghijklmnopqrstuvwxyz\\C1\\G1\\L\n 0: abcdefghijklmnop\n 1: abcdefghijklmnop\n 1C abcdefghijklmnop (16)\n 1G abcdefghijklmnop (16)\n 0L abcdefghijklmnop\n 1L abcdefghijklmnop\n\n/^(a|(bc))de(f)/I\nCapturing subpattern count = 3\nOptions: anchored\nNo first char\nNo need char\n    adef\\G1\\G2\\G3\\G4\\L\n 0: adef\n 1: a\n 2: <unset>\n 3: f\n 1G a (1)\n 2G  (0)\n 3G f (1)\nget substring 4 failed -7\n 0L adef\n 1L a\n 2L \n 3L f\n    bcdef\\G1\\G2\\G3\\G4\\L\n 0: bcdef\n 1: bc\n 2: bc\n 3: f\n 1G bc (2)\n 2G bc (2)\n 3G f (1)\nget substring 4 failed -7\n 0L bcdef\n 1L bc\n 2L bc\n 3L f\n    adefghijk\\C0\n 0: adef\n 1: a\n 2: <unset>\n 3: f\n 0C adef (4)\n\n/^abc\\00def/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    abc\\00def\\L\\C0\n 0: abc\\x00def\n 0C abc\\x00def (7)\n 0L abc\n\n/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+\n)?)?)?)?)?)?)?)?)?otherword/I\nCapturing subpattern count = 8\nContains explicit CR or LF match\nNo options\nFirst char = 'w'\nNeed char = 'd'\n\n/.*X/IDZ\n------------------------------------------------------------------\n        Bra\n        Any*\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 'X'\n\n/.*X/IDZs\n------------------------------------------------------------------\n        Bra\n        AllAny*\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored dotall\nNo first char\nNeed char = 'X'\n\n/(.*X|^B)/IDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        Any*\n        X\n        Alt\n        ^\n        B\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(.*X|^B)/IDZs\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        AllAny*\n        X\n        Alt\n        ^\n        B\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: anchored dotall\nNo first char\nNo need char\n\n/(?s)(.*X|^B)/IDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        AllAny*\n        X\n        Alt\n        ^\n        B\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n\n/(?s:.*X|^B)/IDZ\n------------------------------------------------------------------\n        Bra\n        Bra\n        AllAny*\n        X\n        Alt\n        ^\n        B\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/\\Biss\\B/I+\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n\n/iss/IG+\nCapturing subpattern count = 0\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n 0: iss\n 0+ ippi\n\n/\\Biss\\B/IG+\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n\n/\\Biss\\B/Ig+\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n 0: iss\n 0+ ippi\n    *** Failers\nNo match\n    Mississippi\\A\nNo match\n\n/(?<=[Ms])iss/Ig+\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n 0: iss\n 0+ ippi\n\n/(?<=[Ms])iss/IG+\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 'i'\nNeed char = 's'\n    Mississippi\n 0: iss\n 0+ issippi\n\n/^iss/Ig+\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    ississippi\n 0: iss\n 0+ issippi\n\n/.*iss/Ig+\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 's'\n    abciss\\nxyzisspqr\n 0: abciss\n 0+ \\x0axyzisspqr\n 0: xyziss\n 0+ pqr\n\n/.i./I+g\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'i'\n    Mississippi\n 0: Mis\n 0+ sissippi\n 0: sis\n 0+ sippi\n 0: sip\n 0+ pi\n    Mississippi\\A\n 0: Mis\n 0+ sissippi\n 0: sis\n 0+ sippi\n 0: sip\n 0+ pi\n    Missouri river\n 0: Mis\n 0+ souri river\n 0: ri \n 0+ river\n 0: riv\n 0+ er\n    Missouri river\\A\n 0: Mis\n 0+ souri river\n\n/^.is/I+g\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n    Mississippi\n 0: Mis\n 0+ sissippi\n\n/^ab\\n/Ig+\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: anchored\nNo first char\nNo need char\n    ab\\nab\\ncd\n 0: ab\\x0a\n 0+ ab\\x0acd\n\n/^ab\\n/Img+\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: multiline\nFirst char at start or follows newline\nNeed char = \\x0a\n    ab\\nab\\ncd\n 0: ab\\x0a\n 0+ ab\\x0acd\n 0: ab\\x0a\n 0+ cd\n\n/abc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/abc|bac/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'c'\n\n/(abc|bac)/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'c'\n\n/(abc|(c|dc))/I\nCapturing subpattern count = 2\nNo options\nNo first char\nNeed char = 'c'\n\n/(abc|(d|de)c)/I\nCapturing subpattern count = 2\nNo options\nNo first char\nNeed char = 'c'\n\n/a*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/a+/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/(baa|a+)/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'a'\n\n/a{0,3}/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/baa{3,}/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'b'\nNeed char = 'a'\n\n/\"([^\\\\\"]+|\\\\.)*\"/I\nCapturing subpattern count = 1\nNo options\nFirst char = '\"'\nNeed char = '\"'\n\n/(abc|ab[cd])/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/(a|.)/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n\n/a|ba|\\w/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/abc(?=pqr)/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'r'\n\n/...(?<=abc)/I\nCapturing subpattern count = 0\nMax lookbehind = 3\nNo options\nNo first char\nNo need char\n\n/abc(?!pqr)/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/ab./I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/ab[xyz]/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/abc*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/ab.c*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/a.c*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/.c*/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/ac*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/(a.c*|b.c*)/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n\n/a.c*|aba/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/.+a/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'a'\n\n/(?=abcda)a.*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'a'\n\n/(?=a)a.*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/a(b)*/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/a\\d*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/ab\\d*/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/a(\\d)*/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/abcde{0,0}/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'd'\n\n/ab\\d+/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/a(?(1)b)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/a(?(1)bag|big)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNeed char = 'g'\n\n/a(?(1)bag|big)*(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/a(?(1)bag|big)+(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNeed char = 'g'\n\n/a(?(1)b..|b..)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/ab\\d{0}e/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'e'\n\n/a?b?/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    a\n 0: a\n    b\n 0: b\n    ab\n 0: ab\n    \\\n 0: \n    *** Failers\n 0: \n    \\N\nNo match\n\n/|-/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    abcd\n 0: \n    -abc\n 0: \n    \\Nab-c\n 0: -\n    *** Failers\n 0: \n    \\Nabc\nNo match\n\n/^.?abcd/IS\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'd'\nSubject length lower bound = 4\nNo starting char list\n\n/\\(             # ( at start\n  (?:           # Non-capturing bracket\n  (?>[^()]+)    # Either a sequence of non-brackets (no backtracking)\n  |             # Or\n  (?R)          # Recurse - i.e. nested bracketed string\n  )*            # Zero or more contents\n  \\)            # Closing )\n  /Ix\nCapturing subpattern count = 0\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (abcd)\n 0: (abcd)\n    (abcd)xyz\n 0: (abcd)\n    xyz(abcd)\n 0: (abcd)\n    (ab(xy)cd)pqr\n 0: (ab(xy)cd)\n    (ab(xycd)pqr\n 0: (xycd)\n    () abc ()\n 0: ()\n    12(abcde(fsh)xyz(foo(bar))lmno)89\n 0: (abcde(fsh)xyz(foo(bar))lmno)\n    *** Failers\nNo match\n    abcd\nNo match\n    abcd)\nNo match\n    (abcd\nNo match\n\n/\\(  ( (?>[^()]+) | (?R) )* \\) /Ixg\nCapturing subpattern count = 1\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)pqr\n 0: (ab(xy)cd)\n 1: cd\n    1(abcd)(x(y)z)pqr\n 0: (abcd)\n 1: abcd\n 0: (x(y)z)\n 1: z\n\n/\\(  (?: (?>[^()]+) | (?R) ) \\) /Ix\nCapturing subpattern count = 0\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (abcd)\n 0: (abcd)\n    (ab(xy)cd)\n 0: (xy)\n    (a(b(c)d)e)\n 0: (c)\n    ((ab))\n 0: ((ab))\n    *** Failers\nNo match\n    ()\nNo match\n\n/\\(  (?: (?>[^()]+) | (?R) )? \\) /Ix\nCapturing subpattern count = 0\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    ()\n 0: ()\n    12(abcde(fsh)xyz(foo(bar))lmno)89\n 0: (fsh)\n\n/\\(  ( (?>[^()]+) | (?R) )* \\) /Ix\nCapturing subpattern count = 1\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)\n 0: (ab(xy)cd)\n 1: cd\n\n/\\( ( ( (?>[^()]+) | (?R) )* ) \\) /Ix\nCapturing subpattern count = 2\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)\n 0: (ab(xy)cd)\n 1: ab(xy)cd\n 2: cd\n\n/\\( (123)? ( ( (?>[^()]+) | (?R) )* ) \\) /Ix\nCapturing subpattern count = 3\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)\n 0: (ab(xy)cd)\n 1: <unset>\n 2: ab(xy)cd\n 3: cd\n    (123ab(xy)cd)\n 0: (123ab(xy)cd)\n 1: 123\n 2: ab(xy)cd\n 3: cd\n\n/\\( ( (123)? ( (?>[^()]+) | (?R) )* ) \\) /Ix\nCapturing subpattern count = 3\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)\n 0: (ab(xy)cd)\n 1: ab(xy)cd\n 2: <unset>\n 3: cd\n    (123ab(xy)cd)\n 0: (123ab(xy)cd)\n 1: 123ab(xy)cd\n 2: 123\n 3: cd\n\n/\\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \\) /Ix\nCapturing subpattern count = 11\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(xy)cd)\n 0: (ab(xy)cd)\n 1: ab(xy)cd\n 2: ab(xy)cd\n 3: ab(xy)cd\n 4: ab(xy)cd\n 5: ab(xy)cd\n 6: ab(xy)cd\n 7: ab(xy)cd\n 8: ab(xy)cd\n 9: ab(xy)cd\n10: ab(xy)cd\n11: cd\n\n/\\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \\) /Ix\nCapturing subpattern count = 3\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (abcd(xyz<p>qrs)123)\n 0: (abcd(xyz<p>qrs)123)\n 1: abcd(xyz<p>qrs)123\n 2: 123\n\n/\\( ( ( (?>[^()]+) | ((?R)) )* ) \\) /Ix\nCapturing subpattern count = 3\nOptions: extended\nFirst char = '('\nNeed char = ')'\n    (ab(cd)ef)\n 0: (ab(cd)ef)\n 1: ab(cd)ef\n 2: ef\n 3: (cd)\n    (ab(cd(ef)gh)ij)\n 0: (ab(cd(ef)gh)ij)\n 1: ab(cd(ef)gh)ij\n 2: ij\n 3: (cd(ef)gh)\n\n/^[[:alnum:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [0-9A-Za-z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^alnum:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-/:-@[-`{-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:alpha:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [A-Za-z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^alpha:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-@[-`{-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/[_[:alpha:]]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n  _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n\n/^[[:ascii:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-\\x7f]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^ascii:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x80-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:blank:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x09 ]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^blank:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-\\x08\\x0a-\\x1f!-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/[\\n\\x0b\\x0c\\x0d[:blank:]]/IS\nCapturing subpattern count = 0\nContains explicit CR or LF match\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 \n\n/^[[:cntrl:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-\\x1f\\x7f]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:digit:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [0-9]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:graph:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [!-~]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:lower:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [a-z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:print:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [ -~]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:punct:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [!-/:-@[-`{-~]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:space:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x09-\\x0d ]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:upper:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [A-Z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:xdigit:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [0-9A-Fa-f]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:word:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [0-9A-Z_a-z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^cntrl:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [ -~\\x80-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[12[:^digit:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-/12:-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/^[[:^blank:]]/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-\\x08\\x0a-\\x1f!-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/[01[:alpha:]%]/DZ\n------------------------------------------------------------------\n        Bra\n        [%01A-Za-z]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[[.ch.]]/I\nFailed: POSIX collating elements are not supported at offset 1\n\n/[[=ch=]]/I\nFailed: POSIX collating elements are not supported at offset 1\n\n/[[:rhubarb:]]/I\nFailed: unknown POSIX class name at offset 3\n\n/[[:upper:]]/Ii\nCapturing subpattern count = 0\nOptions: caseless\nNo first char\nNo need char\n    A\n 0: A\n    a\n 0: a\n\n/[[:lower:]]/Ii\nCapturing subpattern count = 0\nOptions: caseless\nNo first char\nNo need char\n    A\n 0: A\n    a\n 0: a\n\n/((?-i)[[:lower:]])[[:lower:]]/Ii\nCapturing subpattern count = 1\nOptions: caseless\nNo first char\nNo need char\n    ab\n 0: ab\n 1: a\n    aB\n 0: aB\n 1: a\n    *** Failers\n 0: ai\n 1: a\n    Ab\nNo match\n    AB\nNo match\n\n/[\\200-\\110]/I\nFailed: range out of order in character class at offset 9\n\n/^(?(0)f|b)oo/I\nFailed: invalid condition (?(0) at offset 6\n\n/This one's here because of the large output vector needed/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'T'\nNeed char = 'd'\n\n/(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\d+(?:\\s|$))(\\w+)\\s+(\\270)/I\nCapturing subpattern count = 271\nMax back reference = 270\nNo options\nNo first char\nNo need char\n    \\O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\n 0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC\n 1: 1 \n 2: 2 \n 3: 3 \n 4: 4 \n 5: 5 \n 6: 6 \n 7: 7 \n 8: 8 \n 9: 9 \n10: 10 \n11: 11 \n12: 12 \n13: 13 \n14: 14 \n15: 15 \n16: 16 \n17: 17 \n18: 18 \n19: 19 \n20: 20 \n21: 21 \n22: 22 \n23: 23 \n24: 24 \n25: 25 \n26: 26 \n27: 27 \n28: 28 \n29: 29 \n30: 30 \n31: 31 \n32: 32 \n33: 33 \n34: 34 \n35: 35 \n36: 36 \n37: 37 \n38: 38 \n39: 39 \n40: 40 \n41: 41 \n42: 42 \n43: 43 \n44: 44 \n45: 45 \n46: 46 \n47: 47 \n48: 48 \n49: 49 \n50: 50 \n51: 51 \n52: 52 \n53: 53 \n54: 54 \n55: 55 \n56: 56 \n57: 57 \n58: 58 \n59: 59 \n60: 60 \n61: 61 \n62: 62 \n63: 63 \n64: 64 \n65: 65 \n66: 66 \n67: 67 \n68: 68 \n69: 69 \n70: 70 \n71: 71 \n72: 72 \n73: 73 \n74: 74 \n75: 75 \n76: 76 \n77: 77 \n78: 78 \n79: 79 \n80: 80 \n81: 81 \n82: 82 \n83: 83 \n84: 84 \n85: 85 \n86: 86 \n87: 87 \n88: 88 \n89: 89 \n90: 90 \n91: 91 \n92: 92 \n93: 93 \n94: 94 \n95: 95 \n96: 96 \n97: 97 \n98: 98 \n99: 99 \n100: 100 \n101: 101 \n102: 102 \n103: 103 \n104: 104 \n105: 105 \n106: 106 \n107: 107 \n108: 108 \n109: 109 \n110: 110 \n111: 111 \n112: 112 \n113: 113 \n114: 114 \n115: 115 \n116: 116 \n117: 117 \n118: 118 \n119: 119 \n120: 120 \n121: 121 \n122: 122 \n123: 123 \n124: 124 \n125: 125 \n126: 126 \n127: 127 \n128: 128 \n129: 129 \n130: 130 \n131: 131 \n132: 132 \n133: 133 \n134: 134 \n135: 135 \n136: 136 \n137: 137 \n138: 138 \n139: 139 \n140: 140 \n141: 141 \n142: 142 \n143: 143 \n144: 144 \n145: 145 \n146: 146 \n147: 147 \n148: 148 \n149: 149 \n150: 150 \n151: 151 \n152: 152 \n153: 153 \n154: 154 \n155: 155 \n156: 156 \n157: 157 \n158: 158 \n159: 159 \n160: 160 \n161: 161 \n162: 162 \n163: 163 \n164: 164 \n165: 165 \n166: 166 \n167: 167 \n168: 168 \n169: 169 \n170: 170 \n171: 171 \n172: 172 \n173: 173 \n174: 174 \n175: 175 \n176: 176 \n177: 177 \n178: 178 \n179: 179 \n180: 180 \n181: 181 \n182: 182 \n183: 183 \n184: 184 \n185: 185 \n186: 186 \n187: 187 \n188: 188 \n189: 189 \n190: 190 \n191: 191 \n192: 192 \n193: 193 \n194: 194 \n195: 195 \n196: 196 \n197: 197 \n198: 198 \n199: 199 \n200: 200 \n201: 201 \n202: 202 \n203: 203 \n204: 204 \n205: 205 \n206: 206 \n207: 207 \n208: 208 \n209: 209 \n210: 210 \n211: 211 \n212: 212 \n213: 213 \n214: 214 \n215: 215 \n216: 216 \n217: 217 \n218: 218 \n219: 219 \n220: 220 \n221: 221 \n222: 222 \n223: 223 \n224: 224 \n225: 225 \n226: 226 \n227: 227 \n228: 228 \n229: 229 \n230: 230 \n231: 231 \n232: 232 \n233: 233 \n234: 234 \n235: 235 \n236: 236 \n237: 237 \n238: 238 \n239: 239 \n240: 240 \n241: 241 \n242: 242 \n243: 243 \n244: 244 \n245: 245 \n246: 246 \n247: 247 \n248: 248 \n249: 249 \n250: 250 \n251: 251 \n252: 252 \n253: 253 \n254: 254 \n255: 255 \n256: 256 \n257: 257 \n258: 258 \n259: 259 \n260: 260 \n261: 261 \n262: 262 \n263: 263 \n264: 264 \n265: 265 \n266: 266 \n267: 267 \n268: 268 \n269: 269 \n270: ABC\n271: ABC\n\n/This one's here because Perl does this differently and PCRE can't at present/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'T'\nNeed char = 't'\n\n/(main(O)?)+/I\nCapturing subpattern count = 2\nNo options\nFirst char = 'm'\nNeed char = 'n'\n    mainmain\n 0: mainmain\n 1: main\n    mainOmain\n 0: mainOmain\n 1: main\n 2: O\n\n/These are all cases where Perl does it differently (nested captures)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'T'\nNeed char = 's'\n\n/^(a(b)?)+$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    aba\n 0: aba\n 1: a\n 2: b\n\n/^(aa(bb)?)+$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: aa\n 2: bb\n\n/^(aa|aa(bb))+$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: aa\n 2: bb\n\n/^(aa(bb)??)+$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: aa\n 2: bb\n\n/^(?:aa(bb)?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: bb\n\n/^(aa(b(b))?)+$/I\nCapturing subpattern count = 3\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: aa\n 2: bb\n 3: b\n\n/^(?:aa(b(b))?)+$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: bb\n 2: b\n\n/^(?:aa(b(?:b))?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: bb\n\n/^(?:aa(bb(?:b))?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbbaa\n 0: aabbbaa\n 1: bbb\n\n/^(?:aa(b(?:bb))?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbbaa\n 0: aabbbaa\n 1: bbb\n\n/^(?:aa(?:b(b))?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbaa\n 0: aabbaa\n 1: b\n\n/^(?:aa(?:b(bb))?)+$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    aabbbaa\n 0: aabbbaa\n 1: bb\n\n/^(aa(b(bb))?)+$/I\nCapturing subpattern count = 3\nOptions: anchored\nNo first char\nNo need char\n    aabbbaa\n 0: aabbbaa\n 1: aa\n 2: bbb\n 3: bb\n\n/^(aa(bb(bb))?)+$/I\nCapturing subpattern count = 3\nOptions: anchored\nNo first char\nNo need char\n    aabbbbaa\n 0: aabbbbaa\n 1: aa\n 2: bbbb\n 3: bb\n\n/--------------------------------------------------------------------/I\nCapturing subpattern count = 0\nNo options\nFirst char = '-'\nNeed char = '-'\n\n/#/IxDZ\n------------------------------------------------------------------\n        Bra\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nOptions: extended\nNo first char\nNo need char\n\n/a#/IxDZ\n------------------------------------------------------------------\n        Bra\n        a\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a'\nNo need char\n\n/[\\s]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\x09-\\x0d ]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\S]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0e-\\x1f!-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/a(?i)b/DZ\n------------------------------------------------------------------\n        Bra\n        a\n     /i b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b' (caseless)\n    ab\n 0: ab\n    aB\n 0: aB\n    *** Failers\nNo match\n    AB\nNo match\n\n/(a(?i)b)/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n     /i b\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b' (caseless)\n    ab\n 0: ab\n 1: ab\n    aB\n 0: aB\n 1: aB\n    *** Failers\nNo match\n    AB\nNo match\n\n/   (?i)abc/IxDZ\n------------------------------------------------------------------\n        Bra\n     /i abc\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a' (caseless)\nNeed char = 'c' (caseless)\n\n/#this is a comment\n  (?i)abc/IxDZ\n------------------------------------------------------------------\n        Bra\n     /i abc\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'a' (caseless)\nNeed char = 'c' (caseless)\n\n/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ\n------------------------------------------------------------------\n        Bra\n        123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = '1'\nNeed char = '0'\n\n/\\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/DZ\n------------------------------------------------------------------\n        Bra\n        123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = '1'\nNeed char = '0'\n\n/\\Q\\E/DZ\n------------------------------------------------------------------\n        Bra\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    \\\n 0: \n\n/\\Q\\Ex/DZ\n------------------------------------------------------------------\n        Bra\n        x\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'x'\nNo need char\n\n/ \\Q\\E/DZ\n------------------------------------------------------------------\n        Bra\n         \n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = ' '\nNo need char\n\n/a\\Q\\E/DZ\n------------------------------------------------------------------\n        Bra\n        a\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n  abc\n 0: a\n  bca\n 0: a\n  bac\n 0: a\n\n/a\\Q\\Eb/DZ\n------------------------------------------------------------------\n        Bra\n        ab\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n  abc\n 0: ab\n\n/\\Q\\Eabc/DZ\n------------------------------------------------------------------\n        Bra\n        abc\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/x*+\\w/DZ\n------------------------------------------------------------------\n        Bra\n        x*+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n    *** Failers\n 0: F\n    xxxxx\nNo match\n\n/x?+/DZ\n------------------------------------------------------------------\n        Bra\n        x?+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/x++/DZ\n------------------------------------------------------------------\n        Bra\n        x++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'x'\nNo need char\n\n/x{1,3}+/BZO\n------------------------------------------------------------------\n        Bra\n        x\n        x{0,2}+\n        Ket\n        End\n------------------------------------------------------------------\n\n/x{1,3}+/BZOi\n------------------------------------------------------------------\n        Bra\n     /i x\n     /i x{0,2}+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^x]{1,3}+/BZO\n------------------------------------------------------------------\n        Bra\n        [^x]\n        [^x]{0,2}+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^x]{1,3}+/BZOi\n------------------------------------------------------------------\n        Bra\n     /i [^x]\n     /i [^x]{0,2}+\n        Ket\n        End\n------------------------------------------------------------------\n\n/(x)*+/DZ\n------------------------------------------------------------------\n        Bra\n        Braposzero\n        CBraPos 1\n        x\n        KetRpos\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/^(\\w++|\\s++)*$/I\nCapturing subpattern count = 1\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n    now is the time for all good men to come to the aid of the party\n 0: now is the time for all good men to come to the aid of the party\n 1: party\n    *** Failers\nNo match\n    this is not a line with only words and spaces!\nNo match\n\n/(\\d++)(\\w)/I\nCapturing subpattern count = 2\nNo options\nNo first char\nNo need char\n    12345a\n 0: 12345a\n 1: 12345\n 2: a\n    *** Failers\nNo match\n    12345+\nNo match\n\n/a++b/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n    aaab\n 0: aaab\n\n/(a++b)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n    aaab\n 0: aaab\n 1: aaab\n\n/(a++)b/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n    aaab\n 0: aaab\n 1: aaa\n\n/([^()]++|\\([^()]*\\))+/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: x\n\n/\\(([^()]++|\\([^()]+\\))+\\)/I\nCapturing subpattern count = 1\nNo options\nFirst char = '('\nNeed char = ')'\n    (abc)\n 0: (abc)\n 1: abc\n    (abc(def)xyz)\n 0: (abc(def)xyz)\n 1: xyz\n    *** Failers\nNo match\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n\n/(abc){1,3}+/DZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        abc\n        Ket\n        Brazero\n        Bra\n        CBra 1\n        abc\n        Ket\n        Brazero\n        CBra 1\n        abc\n        Ket\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/a+?+/I\nFailed: nothing to repeat at offset 3\n\n/a{2,3}?+b/I\nFailed: nothing to repeat at offset 7\n\n/(?U)a+?+/I\nFailed: nothing to repeat at offset 7\n\n/a{2,3}?+b/IU\nFailed: nothing to repeat at offset 7\n\n/x(?U)a++b/DZ\n------------------------------------------------------------------\n        Bra\n        x\n        a++\n        b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'x'\nNeed char = 'b'\n    xaaaab\n 0: xaaaab\n\n/(?U)xa++b/DZ\n------------------------------------------------------------------\n        Bra\n        x\n        a++\n        b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'x'\nNeed char = 'b'\n    xaaaab\n 0: xaaaab\n\n/^((a+)(?U)([ab]+)(?-U)([bc]+)(\\w*))/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        CBra 1\n        CBra 2\n        a+\n        Ket\n        CBra 3\n        [ab]+?\n        Ket\n        CBra 4\n        [bc]+\n        Ket\n        CBra 5\n        \\w*+\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 5\nOptions: anchored\nNo first char\nNo need char\n\n/^x(?U)a+b/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        x\n        a++\n        b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'b'\n\n/^x(?U)(a+)b/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        x\n        CBra 1\n        a+?\n        Ket\n        b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNeed char = 'b'\n\n/[.x.]/I\nFailed: POSIX collating elements are not supported at offset 0\n\n/[=x=]/I\nFailed: POSIX collating elements are not supported at offset 0\n\n/[:x:]/I\nFailed: POSIX named classes are supported only within a class at offset 0\n\n/\\l/I\nFailed: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u at offset 1\n\n/\\L/I\nFailed: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u at offset 1\n\n/\\N{name}/I\nFailed: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u at offset 1\n\n/\\u/I\nFailed: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u at offset 1\n\n/\\U/I\nFailed: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u at offset 1\n\n/a{1,3}b/U\n    ab\n 0: ab\n\n/[/I\nFailed: missing terminating ] for character class at offset 1\n\n/[a-/I\nFailed: missing terminating ] for character class at offset 3\n\n/[[:space:]/I\nFailed: missing terminating ] for character class at offset 10\n\n/[\\s]/IDZ\n------------------------------------------------------------------\n        Bra\n        [\\x09-\\x0d ]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[[:space:]]/IDZ\n------------------------------------------------------------------\n        Bra\n        [\\x09-\\x0d ]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[[:space:]abcde]/IDZ\n------------------------------------------------------------------\n        Bra\n        [\\x09-\\x0d a-e]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/< (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >/Ix\nCapturing subpattern count = 0\nOptions: extended\nFirst char = '<'\nNeed char = '>'\n    <>\n 0: <>\n    <abcd>\n 0: <abcd>\n    <abc <123> hij>\n 0: <abc <123> hij>\n    <abc <def> hij>\n 0: <def>\n    <abc<>def>\n 0: <abc<>def>\n    <abc<>\n 0: <>\n    *** Failers\nNo match\n    <abc\nNo match\n\n|8J\\$WE\\<\\.rX\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|IDZ\n------------------------------------------------------------------\n        Bra\n        8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n        \\b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = '8'\nNeed char = 'X'\n\n|\\$\\<\\.X\\+ix\\[d1b\\!H\\#\\?vV0vrK\\:ZH1\\=2M\\>iV\\;\\?aPhFB\\<\\*vW\\@QW\\@sO9\\}cfZA\\-i\\'w\\%hKd6gt1UJP\\,15_\\#QY\\$M\\^Mss_U\\/\\]\\&LK9\\[5vQub\\^w\\[KDD\\<EjmhUZ\\?\\.akp2dF\\>qmj\\;2\\}YWFdYx\\.Ap\\]hjCPTP\\(n28k\\+3\\;o\\&WXqs\\/gOXdr\\$\\:r\\'do0\\;b4c\\(f_Gr\\=\\\"\\\\4\\)\\[01T7ajQJvL\\$W\\~mL_sS\\/4h\\:x\\*\\[ZN\\=KLs\\&L5zX\\/\\/\\>it\\,o\\:aU\\(\\;Z\\>pW\\&T7oP\\'2K\\^E\\:x9\\'c\\[\\%z\\-\\,64JQ5AeH_G\\#KijUKghQw\\^\\\\vea3a\\?kka_G\\$8\\#\\`\\*kynsxzBLru\\'\\]k_\\[7FrVx\\}\\^\\=\\$blx\\>s\\-N\\%j\\;D\\*aZDnsw\\:YKZ\\%Q\\.Kne9\\#hP\\?\\+b3\\(SOvL\\,\\^\\;\\&u5\\@\\?5C5Bhb\\=m\\-vEh_L15Jl\\]U\\)0RP6\\{q\\%L\\^_z5E\\'Dw6X\\b|IDZ\n------------------------------------------------------------------\n        Bra\n        $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr=\"\\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X\n        \\b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = '$'\nNeed char = 'X'\n\n/(.*)\\d+\\1/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\n\n/(.*)\\d+/I\nCapturing subpattern count = 1\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(.*)\\d+\\1/Is\nCapturing subpattern count = 1\nMax back reference = 1\nOptions: dotall\nNo first char\nNo need char\n\n/(.*)\\d+/Is\nCapturing subpattern count = 1\nOptions: anchored dotall\nNo first char\nNo need char\n\n/(.*(xyz))\\d+\\2/I\nCapturing subpattern count = 2\nMax back reference = 2\nNo options\nFirst char at start or follows newline\nNeed char = 'z'\n\n/((.*))\\d+\\1/I\nCapturing subpattern count = 2\nMax back reference = 1\nNo options\nNo first char\nNo need char\n    abc123bc\n 0: bc123bc\n 1: bc\n 2: bc\n\n/a[b]/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/(?=a).*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nFirst char = 'a'\nNo need char\n\n/(?=abc).xyz/IiI\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = 'a' (caseless)\nNeed char = 'z' (caseless)\n\n/(?=abc)(?i).xyz/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'z' (caseless)\n\n/(?=a)(?=b)/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nFirst char = 'a'\nNo need char\n\n/(?=.)a/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/((?=abcda)a)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'a'\n\n/((?=abcda)ab)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/()a/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'a'\n\n/(?(1)ab|ac)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/(?(1)abz|acz)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a'\nNeed char = 'z'\n\n/(?(1)abz)(.)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\n\n/(?(1)abz)(1)23/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNeed char = '3'\n\n/(a)+/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/(a){2,3}/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'a'\n\n/(a)*/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/[a]/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/[ab]/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[ab]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \n\n/[^a]/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/\\d456/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = '6'\n\n/\\d456/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = '6'\nSubject length lower bound = 4\nStarting chars: 0 1 2 3 4 5 6 7 8 9 \n\n/a^b/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/^a/Im\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'a'\n  abcde\n 0: a\n  xy\\nabc\n 0: a\n  *** Failers\nNo match\n  xyabc\nNo match\n\n/c|abc/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'c'\n\n/(?i)[ab]/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: A B a b \n\n/[ab](?i)cd/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd' (caseless)\nSubject length lower bound = 3\nStarting chars: a b \n\n/abc(?C)def/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'f'\n    abcdef\n--->abcdef\n  0 ^  ^       d\n 0: abcdef\n    1234abcdef\n--->1234abcdef\n  0     ^  ^       d\n 0: abcdef\n    *** Failers\nNo match\n    abcxyz\nNo match\n    abcxyzf\n--->abcxyzf\n  0 ^  ^        d\nNo match\n\n/abc(?C)de(?C1)f/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'f'\n    123abcdef\n--->123abcdef\n  0    ^  ^       d\n  1    ^    ^     f\n 0: abcdef\n\n/(?C1)\\dabc(?C2)def/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'f'\nSubject length lower bound = 7\nStarting chars: 0 1 2 3 4 5 6 7 8 9 \n    1234abcdef\n--->1234abcdef\n  1 ^              \\d\n  1  ^             \\d\n  1   ^            \\d\n  1    ^           \\d\n  2    ^   ^       d\n 0: 4abcdef\n    *** Failers\nNo match\n    abcdef\nNo match\n\n/(?C1)\\dabc(?C2)def/ISS\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'f'\n    1234abcdef\n--->1234abcdef\n  1 ^              \\d\n  1  ^             \\d\n  1   ^            \\d\n  1    ^           \\d\n  2    ^   ^       d\n 0: 4abcdef\n    *** Failers\nNo match\n    abcdef\n--->abcdef\n  1 ^          \\d\n  1  ^         \\d\n  1   ^        \\d\n  1    ^       \\d\n  1     ^      \\d\n  1      ^     \\d\nNo match\n\n/(?C255)ab/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/(?C256)ab/I\nFailed: number after (?C is > 255 at offset 6\n\n/(?Cab)xx/I\nFailed: closing ) for (?C expected at offset 3\n\n/(?C12vr)x/I\nFailed: closing ) for (?C expected at offset 5\n\n/abc(?C)def/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'f'\n    *** Failers\nNo match\n    \\x83\\x0\\x61bcdef\n--->\\x83\\x00abcdef\n  0         ^  ^       d\n 0: abcdef\n\n/(abc)(?C)de(?C1)f/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'f'\n    123abcdef\n--->123abcdef\n  0    ^  ^       d\n  1    ^    ^     f\n 0: abcdef\n 1: abc\n    123abcdef\\C+\nCallout 0: last capture = 1\n 0: <unset>\n 1: abc\n--->123abcdef\n       ^  ^       d\nCallout 1: last capture = 1\n 0: <unset>\n 1: abc\n--->123abcdef\n       ^    ^     f\n 0: abcdef\n 1: abc\n    123abcdef\\C-\n 0: abcdef\n 1: abc\n    *** Failers\nNo match\n    123abcdef\\C!1\n--->123abcdef\n  0    ^  ^       d\n  1    ^    ^     f\nNo match\n\n/(?C0)(abc(?C1))*/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n    abcabcabc\n--->abcabcabc\n  0 ^             (abc(?C1))*\n  1 ^  ^          )\n  1 ^     ^       )\n  1 ^        ^    )\n 0: abcabcabc\n 1: abc\n    abcabc\\C!1!3\n--->abcabc\n  0 ^          (abc(?C1))*\n  1 ^  ^       )\n  1 ^     ^    )\n 0: abcabc\n 1: abc\n    *** Failers\n--->*** Failers\n  0 ^               (abc(?C1))*\n 0: \n    abcabcabc\\C!1!3\n--->abcabcabc\n  0 ^             (abc(?C1))*\n  1 ^  ^          )\n  1 ^     ^       )\n  1 ^        ^    )\n 0: abcabc\n 1: abc\n\n/(\\d{3}(?C))*/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n    123\\C+\nCallout 0: last capture = -1\n 0: <unset>\n--->123\n    ^  ^    )\n 0: 123\n 1: 123\n    123456\\C+\nCallout 0: last capture = -1\n 0: <unset>\n--->123456\n    ^  ^       )\nCallout 0: last capture = 1\n 0: <unset>\n 1: 123\n--->123456\n    ^     ^    )\n 0: 123456\n 1: 456\n    123456789\\C+\nCallout 0: last capture = -1\n 0: <unset>\n--->123456789\n    ^  ^          )\nCallout 0: last capture = 1\n 0: <unset>\n 1: 123\n--->123456789\n    ^     ^       )\nCallout 0: last capture = 1\n 0: <unset>\n 1: 456\n--->123456789\n    ^        ^    )\n 0: 123456789\n 1: 789\n\n/((xyz)(?C)p|(?C1)xyzabc)/I\nCapturing subpattern count = 2\nNo options\nFirst char = 'x'\nNo need char\n    xyzabc\\C+\nCallout 0: last capture = 2\n 0: <unset>\n 1: <unset>\n 2: xyz\n--->xyzabc\n    ^  ^       p\nCallout 1: last capture = -1\n 0: <unset>\n--->xyzabc\n    ^          x\n 0: xyzabc\n 1: xyzabc\n\n/(X)((xyz)(?C)p|(?C1)xyzabc)/I\nCapturing subpattern count = 3\nNo options\nFirst char = 'X'\nNeed char = 'x'\n    Xxyzabc\\C+\nCallout 0: last capture = 3\n 0: <unset>\n 1: X\n 2: <unset>\n 3: xyz\n--->Xxyzabc\n    ^   ^       p\nCallout 1: last capture = 1\n 0: <unset>\n 1: X\n--->Xxyzabc\n    ^^          x\n 0: Xxyzabc\n 1: X\n 2: xyzabc\n\n/(?=(abc))(?C)abcdef/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'f'\n    abcdef\\C+\nCallout 0: last capture = 1\n 0: <unset>\n 1: abc\n--->abcdef\n    ^          a\n 0: abcdef\n 1: abc\n\n/(?!(abc)(?C1)d)(?C2)abcxyz/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'z'\n    abcxyz\\C+\nCallout 1: last capture = 1\n 0: <unset>\n 1: abc\n--->abcxyz\n    ^  ^       d\nCallout 2: last capture = -1\n 0: <unset>\n--->abcxyz\n    ^          a\n 0: abcxyz\n\n/(?<=(abc)(?C))xyz/I\nCapturing subpattern count = 1\nMax lookbehind = 3\nNo options\nFirst char = 'x'\nNeed char = 'z'\n   abcxyz\\C+\nCallout 0: last capture = 1\n 0: <unset>\n 1: abc\n--->abcxyz\n       ^       )\n 0: xyz\n 1: abc\n\n/a(b+)(c*)(?C1)/I\nCapturing subpattern count = 2\nNo options\nFirst char = 'a'\nNeed char = 'b'\n    abbbbbccc\\C*1\n--->abbbbbccc\n  1 ^        ^    \nCallout data = 1\nNo match\n\n/a(b+?)(c*?)(?C1)/I\nCapturing subpattern count = 2\nNo options\nFirst char = 'a'\nNeed char = 'b'\n    abbbbbccc\\C*1\n--->abbbbbccc\n  1 ^ ^           \nCallout data = 1\n  1 ^  ^          \nCallout data = 1\n  1 ^   ^         \nCallout data = 1\n  1 ^    ^        \nCallout data = 1\n  1 ^     ^       \nCallout data = 1\n  1 ^      ^      \nCallout data = 1\n  1 ^       ^     \nCallout data = 1\n  1 ^        ^    \nCallout data = 1\nNo match\n\n/(?C)abc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/(?C)^abc/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/(?C)a|b/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \n\n/(?R)/I\nFailed: recursive call could loop indefinitely at offset 3\n\n/(a|(?R))/I\nFailed: recursive call could loop indefinitely at offset 6\n\n/(ab|(bc|(de|(?R))))/I\nFailed: recursive call could loop indefinitely at offset 15\n\n/x(ab|(bc|(de|(?R))))/I\nCapturing subpattern count = 3\nNo options\nFirst char = 'x'\nNo need char\n    xab\n 0: xab\n 1: ab\n    xbc\n 0: xbc\n 1: bc\n 2: bc\n    xde\n 0: xde\n 1: de\n 2: de\n 3: de\n    xxab\n 0: xxab\n 1: xab\n 2: xab\n 3: xab\n    xxxab\n 0: xxxab\n 1: xxab\n 2: xxab\n 3: xxab\n    *** Failers\nNo match\n    xyab\nNo match\n\n/(ab|(bc|(de|(?1))))/I\nFailed: recursive call could loop indefinitely at offset 15\n\n/x(ab|(bc|(de|(?1)x)x)x)/I\nFailed: recursive call could loop indefinitely at offset 16\n\n/^([^()]|\\((?1)*\\))*$/I\nCapturing subpattern count = 1\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n    abc\n 0: abc\n 1: c\n    a(b)c\n 0: a(b)c\n 1: c\n    a(b(c))d\n 0: a(b(c))d\n 1: d\n    *** Failers)\nNo match\n    a(b(c)d\nNo match\n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNeed char = '<'\n   >abc>123<xyz<\n 0: >abc>123<xyz<\n 1: 3\n   >abc>1(2)3<xyz<\n 0: >abc>1(2)3<xyz<\n 1: 3\n   >abc>(1(2)3)<xyz<\n 0: >abc>(1(2)3)<xyz<\n 1: (1(2)3)\n\n/(a(?1)b)/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n        Recurse\n        b\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/(a(?1)+b)/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n        Once\n        Recurse\n        KetRmax\n        b\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n\n/^(\\d+|\\((?1)([+*-])(?1)\\)|-(?1))$/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    12\n 0: 12\n 1: 12\n    (((2+2)*-3)-7)\n 0: (((2+2)*-3)-7)\n 1: (((2+2)*-3)-7)\n 2: -\n    -12\n 0: -12\n 1: -12\n    *** Failers\nNo match\n    ((2+2)*-3)-7)\nNo match\n\n/^(x(y|(?1){2})z)/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    xyz\n 0: xyz\n 1: xyz\n 2: y\n    xxyzxyzz\n 0: xxyzxyzz\n 1: xxyzxyzz\n 2: xyzxyz\n    *** Failers\nNo match\n    xxyzz\nNo match\n    xxyzxyzxyzz\nNo match\n\n/((< (?: (?(R) \\d++  | [^<>]*+) | (?2)) * >))/Ix\nCapturing subpattern count = 2\nOptions: extended\nFirst char = '<'\nNeed char = '>'\n    <>\n 0: <>\n 1: <>\n 2: <>\n    <abcd>\n 0: <abcd>\n 1: <abcd>\n 2: <abcd>\n    <abc <123> hij>\n 0: <abc <123> hij>\n 1: <abc <123> hij>\n 2: <abc <123> hij>\n    <abc <def> hij>\n 0: <def>\n 1: <def>\n 2: <def>\n    <abc<>def>\n 0: <abc<>def>\n 1: <abc<>def>\n 2: <abc<>def>\n    <abc<>\n 0: <>\n 1: <>\n 2: <>\n    *** Failers\nNo match\n    <abc\nNo match\n\n/(?1)/I\nFailed: reference to non-existent subpattern at offset 3\n\n/((?2)(abc)/I\nFailed: missing ) at offset 10\n\n/^(abc)def(?1)/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    abcdefabc\n 0: abcdefabc\n 1: abc\n\n/^(a|b|c)=(?1)+/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n    a=a\n 0: a=a\n 1: a\n    a=b\n 0: a=b\n 1: a\n    a=bc\n 0: a=bc\n 1: a\n\n/^(a|b|c)=((?1))+/I\nCapturing subpattern count = 2\nOptions: anchored\nNo first char\nNo need char\n    a=a\n 0: a=a\n 1: a\n 2: a\n    a=b\n 0: a=b\n 1: a\n 2: b\n    a=bc\n 0: a=bc\n 1: a\n 2: c\n\n/a(?P<name1>b|c)d(?P<longername2>e)/DZ\n------------------------------------------------------------------\n        Bra\n        a\n        CBra 1\n        b\n        Alt\n        c\n        Ket\n        d\n        CBra 2\n        e\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  longername2   2\n  name1         1\nNo options\nFirst char = 'a'\nNeed char = 'e'\n    abde\n 0: abde\n 1: b\n 2: e\n    acde\n 0: acde\n 1: c\n 2: e\n\n/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/DZ\n------------------------------------------------------------------\n        Bra\n        Bra\n        a\n        CBra 1\n        c\n        CBra 2\n        d\n        Ket\n        Ket\n        Ket\n        CBra 3\n        a\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  a   3\n  c   1\n  d   2\nNo options\nFirst char = 'a'\nNeed char = 'a'\n\n/(?P<a>a)...(?P=a)bbb(?P>a)d/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n        Ket\n        Any\n        Any\n        Any\n        \\1\n        bbb\n        Recurse\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  a   1\nNo options\nFirst char = 'a'\nNeed char = 'd'\n\n/^\\W*(?:(?P<one>(?P<two>.)\\W*(?P>one)\\W*(?P=two)|)|(?P<three>(?P<four>.)\\W*(?P>three)\\W*(?P=four)|\\W*.\\W*))\\W*$/Ii\nCapturing subpattern count = 4\nMax back reference = 4\nNamed capturing subpatterns:\n  four    4\n  one     1\n  three   3\n  two     2\nMay match empty string\nOptions: anchored caseless\nNo first char\nNo need char\n    1221\n 0: 1221\n 1: 1221\n 2: 1\n    Satan, oscillate my metallic sonatas!\n 0: Satan, oscillate my metallic sonatas!\n 1: <unset>\n 2: <unset>\n 3: Satan, oscillate my metallic sonatas\n 4: S\n    A man, a plan, a canal: Panama!\n 0: A man, a plan, a canal: Panama!\n 1: <unset>\n 2: <unset>\n 3: A man, a plan, a canal: Panama\n 4: A\n    Able was I ere I saw Elba.\n 0: Able was I ere I saw Elba.\n 1: <unset>\n 2: <unset>\n 3: Able was I ere I saw Elba\n 4: A\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/((?(R)a|b))\\1(?1)?/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\n  bb\n 0: bb\n 1: b\n  bbaa\n 0: bba\n 1: b\n\n/(.*)a/Is\nCapturing subpattern count = 1\nOptions: anchored dotall\nNo first char\nNeed char = 'a'\n\n/(.*)a\\1/Is\nCapturing subpattern count = 1\nMax back reference = 1\nOptions: dotall\nNo first char\nNeed char = 'a'\n\n/(.*)a(b)\\2/Is\nCapturing subpattern count = 2\nMax back reference = 2\nOptions: anchored dotall\nNo first char\nNeed char = 'b'\n\n/((.*)a|(.*)b)z/Is\nCapturing subpattern count = 3\nOptions: anchored dotall\nNo first char\nNeed char = 'z'\n\n/((.*)a|(.*)b)z\\1/Is\nCapturing subpattern count = 3\nMax back reference = 1\nOptions: dotall\nNo first char\nNeed char = 'z'\n\n/((.*)a|(.*)b)z\\2/Is\nCapturing subpattern count = 3\nMax back reference = 2\nOptions: dotall\nNo first char\nNeed char = 'z'\n\n/((.*)a|(.*)b)z\\3/Is\nCapturing subpattern count = 3\nMax back reference = 3\nOptions: dotall\nNo first char\nNeed char = 'z'\n\n/((.*)a|^(.*)b)z\\3/Is\nCapturing subpattern count = 3\nMax back reference = 3\nOptions: anchored dotall\nNo first char\nNeed char = 'z'\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/Is\nCapturing subpattern count = 31\nMay match empty string\nOptions: anchored dotall\nNo first char\nNo need char\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\\31/Is\nCapturing subpattern count = 31\nMax back reference = 31\nMay match empty string\nOptions: dotall\nNo first char\nNo need char\n\n/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\\32/Is\nCapturing subpattern count = 32\nMax back reference = 32\nMay match empty string\nOptions: dotall\nNo first char\nNo need char\n\n/(a)(bc)/INDZ\n------------------------------------------------------------------\n        Bra\n        Bra\n        a\n        Ket\n        Bra\n        bc\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: no_auto_capture\nFirst char = 'a'\nNeed char = 'c'\n  abc\n 0: abc\n\n/(?P<one>a)(bc)/INDZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n        Ket\n        Bra\n        bc\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  one   1\nOptions: no_auto_capture\nFirst char = 'a'\nNeed char = 'c'\n  abc\n 0: abc\n 1: a\n\n/(a)(?P<named>bc)/INDZ\n------------------------------------------------------------------\n        Bra\n        Bra\n        a\n        Ket\n        CBra 1\n        bc\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  named   1\nOptions: no_auto_capture\nFirst char = 'a'\nNeed char = 'c'\n\n/(a+)*zz/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\\M\nMinimum match() limit = 8\nMinimum match() recursion limit = 6\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n  aaaaaaaaaaaaaz\\M\nMinimum match() limit = 32768\nMinimum match() recursion limit = 29\nNo match\n\n/(aaa(?C1)bbb|ab)/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'b'\n   aaabbb\n--->aaabbb\n  1 ^  ^       b\n 0: aaabbb\n 1: aaabbb\n   aaabbb\\C*0\n--->aaabbb\n  1 ^  ^       b\n 0: aaabbb\n 1: aaabbb\n   aaabbb\\C*1\n--->aaabbb\n  1 ^  ^       b\nCallout data = 1\n 0: ab\n 1: ab\n   aaabbb\\C*-1\n--->aaabbb\n  1 ^  ^       b\nCallout data = -1\nNo match\n\n/ab(?P<one>cd)ef(?P<two>gh)/I\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  one   1\n  two   2\nNo options\nFirst char = 'a'\nNeed char = 'h'\n    abcdefgh\n 0: abcdefgh\n 1: cd\n 2: gh\n    abcdefgh\\C1\\Gtwo\n 0: abcdefgh\n 1: cd\n 2: gh\n 1C cd (2)\n  G gh (2) two\n    abcdefgh\\Cone\\Ctwo\n 0: abcdefgh\n 1: cd\n 2: gh\n  C cd (2) one\n  C gh (2) two\n    abcdefgh\\Cthree\nno parentheses with name \"three\"\n 0: abcdefgh\n 1: cd\n 2: gh\ncopy substring three failed -7\n\n/(?P<Tes>)(?P<Test>)/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        Ket\n        CBra 2\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  Tes    1\n  Test   2\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(?P<Test>)(?P<Tes>)/DZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        Ket\n        CBra 2\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  Tes    2\n  Test   1\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(?P<Z>zz)(?P<A>aa)/I\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  A   2\n  Z   1\nNo options\nFirst char = 'z'\nNeed char = 'a'\n    zzaa\\CZ\n 0: zzaa\n 1: zz\n 2: aa\n  C zz (2) Z\n    zzaa\\CA\n 0: zzaa\n 1: zz\n 2: aa\n  C aa (2) A\n\n/(?P<x>eks)(?P<x>eccs)/I\nFailed: two named subpatterns have the same name at offset 15\n\n/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/I\nFailed: two named subpatterns have the same name at offset 30\n\n\"\\[((?P<elem>\\d+)(,(?P>elem))*)\\]\"I\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  elem   2\nNo options\nFirst char = '['\nNeed char = ']'\n    [10,20,30,5,5,4,4,2,43,23,4234]\n 0: [10,20,30,5,5,4,4,2,43,23,4234]\n 1: 10,20,30,5,5,4,4,2,43,23,4234\n 2: 10\n 3: ,4234\n    *** Failers\nNo match\n    []\nNo match\n\n\"\\[((?P<elem>\\d+)(,(?P>elem))*)?\\]\"I\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  elem   2\nNo options\nFirst char = '['\nNeed char = ']'\n    [10,20,30,5,5,4,4,2,43,23,4234]\n 0: [10,20,30,5,5,4,4,2,43,23,4234]\n 1: 10,20,30,5,5,4,4,2,43,23,4234\n 2: 10\n 3: ,4234\n    []\n 0: []\n\n/(a(b(?2)c))?/DZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        CBra 1\n        a\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(a(b(?2)c))*/DZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        CBra 1\n        a\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        KetRmax\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(a(b(?2)c)){0,2}/DZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        Bra\n        CBra 1\n        a\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Brazero\n        CBra 1\n        a\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/[ab]{1}+/DZ\n------------------------------------------------------------------\n        Bra\n        [ab]{1,1}+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/((w\\/|-|with)*(free|immediate)*.*?shipping\\s*[!.-]*)/Ii\nCapturing subpattern count = 3\nOptions: caseless\nNo first char\nNeed char = 'g' (caseless)\n     Baby Bjorn Active Carrier - With free SHIPPING!!\n 0: Baby Bjorn Active Carrier - With free SHIPPING!!\n 1: Baby Bjorn Active Carrier - With free SHIPPING!!\n\n/((w\\/|-|with)*(free|immediate)*.*?shipping\\s*[!.-]*)/IiS\nCapturing subpattern count = 3\nOptions: caseless\nNo first char\nNeed char = 'g' (caseless)\nSubject length lower bound = 8\nNo starting char list\n     Baby Bjorn Active Carrier - With free SHIPPING!!\n 0: Baby Bjorn Active Carrier - With free SHIPPING!!\n 1: Baby Bjorn Active Carrier - With free SHIPPING!!\n\n/a*.*b/ISDZ\n------------------------------------------------------------------\n        Bra\n        a*\n        Any*\n        b\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'b'\nSubject length lower bound = 1\nNo starting char list\n\n/(a|b)*.?c/ISDZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        CBra 1\n        a\n        Alt\n        b\n        KetRmax\n        Any?\n        c\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'c'\nSubject length lower bound = 1\nNo starting char list\n\n/abc(?C255)de(?C)f/DZ\n------------------------------------------------------------------\n        Bra\n        abc\n        Callout 255 10 1\n        de\n        Callout 0 16 1\n        f\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'f'\n\n/abcde/ICDZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 1\n        a\n        Callout 255 1 1\n        b\n        Callout 255 2 1\n        c\n        Callout 255 3 1\n        d\n        Callout 255 4 1\n        e\n        Callout 255 5 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions:\nFirst char = 'a'\nNeed char = 'e'\n  abcde\n--->abcde\n +0 ^         a\n +1 ^^        b\n +2 ^ ^       c\n +3 ^  ^      d\n +4 ^   ^     e\n +5 ^    ^    \n 0: abcde\n  abcdfe\n--->abcdfe\n +0 ^          a\n +1 ^^         b\n +2 ^ ^        c\n +3 ^  ^       d\n +4 ^   ^      e\nNo match\n\n/a*b/ICDZS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 2\n        a*+\n        Callout 255 2 1\n        b\n        Callout 255 3 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions:\nNo first char\nNeed char = 'b'\nSubject length lower bound = 1\nStarting chars: a b \n  ab\n--->ab\n +0 ^      a*\n +2 ^^     b\n +3 ^ ^    \n 0: ab\n  aaaab\n--->aaaab\n +0 ^         a*\n +2 ^   ^     b\n +3 ^    ^    \n 0: aaaab\n  aaaacb\n--->aaaacb\n +0 ^          a*\n +2 ^   ^      b\n +0  ^         a*\n +2  ^  ^      b\n +0   ^        a*\n +2   ^ ^      b\n +0    ^       a*\n +2    ^^      b\n +0      ^     a*\n +2      ^     b\n +3      ^^    \n 0: b\n\n/a*b/ICDZSS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 2\n        a*+\n        Callout 255 2 1\n        b\n        Callout 255 3 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions:\nNo first char\nNeed char = 'b'\n  ab\n--->ab\n +0 ^      a*\n +2 ^^     b\n +3 ^ ^    \n 0: ab\n  aaaab\n--->aaaab\n +0 ^         a*\n +2 ^   ^     b\n +3 ^    ^    \n 0: aaaab\n  aaaacb\n--->aaaacb\n +0 ^          a*\n +2 ^   ^      b\n +0  ^         a*\n +2  ^  ^      b\n +0   ^        a*\n +2   ^ ^      b\n +0    ^       a*\n +2    ^^      b\n +0     ^      a*\n +2     ^      b\n +0      ^     a*\n +2      ^     b\n +3      ^^    \n 0: b\n\n/a+b/ICDZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 2\n        a++\n        Callout 255 2 1\n        b\n        Callout 255 3 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions:\nFirst char = 'a'\nNeed char = 'b'\n  ab\n--->ab\n +0 ^      a+\n +2 ^^     b\n +3 ^ ^    \n 0: ab\n  aaaab\n--->aaaab\n +0 ^         a+\n +2 ^   ^     b\n +3 ^    ^    \n 0: aaaab\n  aaaacb\n--->aaaacb\n +0 ^          a+\n +2 ^   ^      b\n +0  ^         a+\n +2  ^  ^      b\n +0   ^        a+\n +2   ^ ^      b\n +0    ^       a+\n +2    ^^      b\nNo match\n\n/(abc|def)x/ICDZS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 9\n        CBra 1\n        Callout 255 1 1\n        a\n        Callout 255 2 1\n        b\n        Callout 255 3 1\n        c\n        Callout 255 4 0\n        Alt\n        Callout 255 5 1\n        d\n        Callout 255 6 1\n        e\n        Callout 255 7 1\n        f\n        Callout 255 8 0\n        Ket\n        Callout 255 9 1\n        x\n        Callout 255 10 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions:\nNo first char\nNeed char = 'x'\nSubject length lower bound = 4\nStarting chars: a d \n  abcx\n--->abcx\n +0 ^        (abc|def)\n +1 ^        a\n +2 ^^       b\n +3 ^ ^      c\n +4 ^  ^     |\n +9 ^  ^     x\n+10 ^   ^    \n 0: abcx\n 1: abc\n  defx\n--->defx\n +0 ^        (abc|def)\n +1 ^        a\n +5 ^        d\n +6 ^^       e\n +7 ^ ^      f\n +8 ^  ^     )\n +9 ^  ^     x\n+10 ^   ^    \n 0: defx\n 1: def\n  ** Failers \nNo match\n  abcdefzx\n--->abcdefzx\n +0 ^            (abc|def)\n +1 ^            a\n +2 ^^           b\n +3 ^ ^          c\n +4 ^  ^         |\n +9 ^  ^         x\n +5 ^            d\n +0    ^         (abc|def)\n +1    ^         a\n +5    ^         d\n +6    ^^        e\n +7    ^ ^       f\n +8    ^  ^      )\n +9    ^  ^      x\nNo match\n\n/(abc|def)x/ICDZSS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 9\n        CBra 1\n        Callout 255 1 1\n        a\n        Callout 255 2 1\n        b\n        Callout 255 3 1\n        c\n        Callout 255 4 0\n        Alt\n        Callout 255 5 1\n        d\n        Callout 255 6 1\n        e\n        Callout 255 7 1\n        f\n        Callout 255 8 0\n        Ket\n        Callout 255 9 1\n        x\n        Callout 255 10 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions:\nNo first char\nNeed char = 'x'\n  abcx\n--->abcx\n +0 ^        (abc|def)\n +1 ^        a\n +2 ^^       b\n +3 ^ ^      c\n +4 ^  ^     |\n +9 ^  ^     x\n+10 ^   ^    \n 0: abcx\n 1: abc\n  defx\n--->defx\n +0 ^        (abc|def)\n +1 ^        a\n +5 ^        d\n +6 ^^       e\n +7 ^ ^      f\n +8 ^  ^     )\n +9 ^  ^     x\n+10 ^   ^    \n 0: defx\n 1: def\n  ** Failers \nNo match\n  abcdefzx\n--->abcdefzx\n +0 ^            (abc|def)\n +1 ^            a\n +2 ^^           b\n +3 ^ ^          c\n +4 ^  ^         |\n +9 ^  ^         x\n +5 ^            d\n +0  ^           (abc|def)\n +1  ^           a\n +5  ^           d\n +0   ^          (abc|def)\n +1   ^          a\n +5   ^          d\n +0    ^         (abc|def)\n +1    ^         a\n +5    ^         d\n +6    ^^        e\n +7    ^ ^       f\n +8    ^  ^      )\n +9    ^  ^      x\n +0     ^        (abc|def)\n +1     ^        a\n +5     ^        d\n +0      ^       (abc|def)\n +1      ^       a\n +5      ^       d\n +0       ^      (abc|def)\n +1       ^      a\n +5       ^      d\n +0        ^     (abc|def)\n +1        ^     a\n +5        ^     d\nNo match\n\n/(ab|cd){3,4}/IC\nCapturing subpattern count = 1\nOptions:\nNo first char\nNo need char\n  ababab\n--->ababab\n +0 ^          (ab|cd){3,4}\n +1 ^          a\n +2 ^^         b\n +3 ^ ^        |\n +1 ^ ^        a\n +2 ^  ^       b\n +3 ^   ^      |\n +1 ^   ^      a\n +2 ^    ^     b\n +3 ^     ^    |\n +1 ^     ^    a\n +4 ^     ^    c\n+12 ^     ^    \n 0: ababab\n 1: ab\n  abcdabcd\n--->abcdabcd\n +0 ^            (ab|cd){3,4}\n +1 ^            a\n +2 ^^           b\n +3 ^ ^          |\n +1 ^ ^          a\n +4 ^ ^          c\n +5 ^  ^         d\n +6 ^   ^        )\n +1 ^   ^        a\n +2 ^    ^       b\n +3 ^     ^      |\n +1 ^     ^      a\n +4 ^     ^      c\n +5 ^      ^     d\n +6 ^       ^    )\n+12 ^       ^    \n 0: abcdabcd\n 1: cd\n  abcdcdcdcdcd\n--->abcdcdcdcdcd\n +0 ^                (ab|cd){3,4}\n +1 ^                a\n +2 ^^               b\n +3 ^ ^              |\n +1 ^ ^              a\n +4 ^ ^              c\n +5 ^  ^             d\n +6 ^   ^            )\n +1 ^   ^            a\n +4 ^   ^            c\n +5 ^    ^           d\n +6 ^     ^          )\n +1 ^     ^          a\n +4 ^     ^          c\n +5 ^      ^         d\n +6 ^       ^        )\n+12 ^       ^        \n 0: abcdcdcd\n 1: cd\n\n/([ab]{,4}c|xy)/ICDZS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        CBra 1\n        Callout 255 1 4\n        [ab]\n        Callout 255 5 1\n        {\n        Callout 255 6 1\n        ,\n        Callout 255 7 1\n        4\n        Callout 255 8 1\n        }\n        Callout 255 9 1\n        c\n        Callout 255 10 0\n        Alt\n        Callout 255 11 1\n        x\n        Callout 255 12 1\n        y\n        Callout 255 13 0\n        Ket\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions:\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b x \n    Note: that { does NOT introduce a quantifier\n--->Note: that { does NOT introduce a quantifier\n +0         ^                                        ([ab]{,4}c|xy)\n +1         ^                                        [ab]\n +5         ^^                                       {\n+11         ^                                        x\n +0                                 ^                ([ab]{,4}c|xy)\n +1                                 ^                [ab]\n +5                                 ^^               {\n+11                                 ^                x\n +0                                     ^            ([ab]{,4}c|xy)\n +1                                     ^            [ab]\n +5                                     ^^           {\n+11                                     ^            x\nNo match\n\n/([ab]{,4}c|xy)/ICDZSS\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        CBra 1\n        Callout 255 1 4\n        [ab]\n        Callout 255 5 1\n        {\n        Callout 255 6 1\n        ,\n        Callout 255 7 1\n        4\n        Callout 255 8 1\n        }\n        Callout 255 9 1\n        c\n        Callout 255 10 0\n        Alt\n        Callout 255 11 1\n        x\n        Callout 255 12 1\n        y\n        Callout 255 13 0\n        Ket\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions:\nNo first char\nNo need char\n    Note: that { does NOT introduce a quantifier\n--->Note: that { does NOT introduce a quantifier\n +0 ^                                                ([ab]{,4}c|xy)\n +1 ^                                                [ab]\n+11 ^                                                x\n +0  ^                                               ([ab]{,4}c|xy)\n +1  ^                                               [ab]\n+11  ^                                               x\n +0   ^                                              ([ab]{,4}c|xy)\n +1   ^                                              [ab]\n+11   ^                                              x\n +0    ^                                             ([ab]{,4}c|xy)\n +1    ^                                             [ab]\n+11    ^                                             x\n +0     ^                                            ([ab]{,4}c|xy)\n +1     ^                                            [ab]\n+11     ^                                            x\n +0      ^                                           ([ab]{,4}c|xy)\n +1      ^                                           [ab]\n+11      ^                                           x\n +0       ^                                          ([ab]{,4}c|xy)\n +1       ^                                          [ab]\n+11       ^                                          x\n +0        ^                                         ([ab]{,4}c|xy)\n +1        ^                                         [ab]\n+11        ^                                         x\n +0         ^                                        ([ab]{,4}c|xy)\n +1         ^                                        [ab]\n +5         ^^                                       {\n+11         ^                                        x\n +0          ^                                       ([ab]{,4}c|xy)\n +1          ^                                       [ab]\n+11          ^                                       x\n +0           ^                                      ([ab]{,4}c|xy)\n +1           ^                                      [ab]\n+11           ^                                      x\n +0            ^                                     ([ab]{,4}c|xy)\n +1            ^                                     [ab]\n+11            ^                                     x\n +0             ^                                    ([ab]{,4}c|xy)\n +1             ^                                    [ab]\n+11             ^                                    x\n +0              ^                                   ([ab]{,4}c|xy)\n +1              ^                                   [ab]\n+11              ^                                   x\n +0               ^                                  ([ab]{,4}c|xy)\n +1               ^                                  [ab]\n+11               ^                                  x\n +0                ^                                 ([ab]{,4}c|xy)\n +1                ^                                 [ab]\n+11                ^                                 x\n +0                 ^                                ([ab]{,4}c|xy)\n +1                 ^                                [ab]\n+11                 ^                                x\n +0                  ^                               ([ab]{,4}c|xy)\n +1                  ^                               [ab]\n+11                  ^                               x\n +0                   ^                              ([ab]{,4}c|xy)\n +1                   ^                              [ab]\n+11                   ^                              x\n +0                    ^                             ([ab]{,4}c|xy)\n +1                    ^                             [ab]\n+11                    ^                             x\n +0                     ^                            ([ab]{,4}c|xy)\n +1                     ^                            [ab]\n+11                     ^                            x\n +0                      ^                           ([ab]{,4}c|xy)\n +1                      ^                           [ab]\n+11                      ^                           x\n +0                       ^                          ([ab]{,4}c|xy)\n +1                       ^                          [ab]\n+11                       ^                          x\n +0                        ^                         ([ab]{,4}c|xy)\n +1                        ^                         [ab]\n+11                        ^                         x\n +0                         ^                        ([ab]{,4}c|xy)\n +1                         ^                        [ab]\n+11                         ^                        x\n +0                          ^                       ([ab]{,4}c|xy)\n +1                          ^                       [ab]\n+11                          ^                       x\n +0                           ^                      ([ab]{,4}c|xy)\n +1                           ^                      [ab]\n+11                           ^                      x\n +0                            ^                     ([ab]{,4}c|xy)\n +1                            ^                     [ab]\n+11                            ^                     x\n +0                             ^                    ([ab]{,4}c|xy)\n +1                             ^                    [ab]\n+11                             ^                    x\n +0                              ^                   ([ab]{,4}c|xy)\n +1                              ^                   [ab]\n+11                              ^                   x\n +0                               ^                  ([ab]{,4}c|xy)\n +1                               ^                  [ab]\n+11                               ^                  x\n +0                                ^                 ([ab]{,4}c|xy)\n +1                                ^                 [ab]\n+11                                ^                 x\n +0                                 ^                ([ab]{,4}c|xy)\n +1                                 ^                [ab]\n +5                                 ^^               {\n+11                                 ^                x\n +0                                  ^               ([ab]{,4}c|xy)\n +1                                  ^               [ab]\n+11                                  ^               x\n +0                                   ^              ([ab]{,4}c|xy)\n +1                                   ^              [ab]\n+11                                   ^              x\n +0                                    ^             ([ab]{,4}c|xy)\n +1                                    ^             [ab]\n+11                                    ^             x\n +0                                     ^            ([ab]{,4}c|xy)\n +1                                     ^            [ab]\n +5                                     ^^           {\n+11                                     ^            x\n +0                                      ^           ([ab]{,4}c|xy)\n +1                                      ^           [ab]\n+11                                      ^           x\n +0                                       ^          ([ab]{,4}c|xy)\n +1                                       ^          [ab]\n+11                                       ^          x\n +0                                        ^         ([ab]{,4}c|xy)\n +1                                        ^         [ab]\n+11                                        ^         x\n +0                                         ^        ([ab]{,4}c|xy)\n +1                                         ^        [ab]\n+11                                         ^        x\n +0                                          ^       ([ab]{,4}c|xy)\n +1                                          ^       [ab]\n+11                                          ^       x\n +0                                           ^      ([ab]{,4}c|xy)\n +1                                           ^      [ab]\n+11                                           ^      x\n +0                                            ^     ([ab]{,4}c|xy)\n +1                                            ^     [ab]\n+11                                            ^     x\n +0                                             ^    ([ab]{,4}c|xy)\n +1                                             ^    [ab]\n+11                                             ^    x\nNo match\n\n/([ab]{1,4}c|xy){4,5}?123/ICDZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 21\n        CBra 1\n        Callout 255 1 9\n        [ab]{1,4}+\n        Callout 255 10 1\n        c\n        Callout 255 11 0\n        Alt\n        Callout 255 12 1\n        x\n        Callout 255 13 1\n        y\n        Callout 255 14 0\n        Ket\n        CBra 1\n        Callout 255 1 9\n        [ab]{1,4}+\n        Callout 255 10 1\n        c\n        Callout 255 11 0\n        Alt\n        Callout 255 12 1\n        x\n        Callout 255 13 1\n        y\n        Callout 255 14 0\n        Ket\n        CBra 1\n        Callout 255 1 9\n        [ab]{1,4}+\n        Callout 255 10 1\n        c\n        Callout 255 11 0\n        Alt\n        Callout 255 12 1\n        x\n        Callout 255 13 1\n        y\n        Callout 255 14 0\n        Ket\n        CBra 1\n        Callout 255 1 9\n        [ab]{1,4}+\n        Callout 255 10 1\n        c\n        Callout 255 11 0\n        Alt\n        Callout 255 12 1\n        x\n        Callout 255 13 1\n        y\n        Callout 255 14 0\n        Ket\n        Braminzero\n        CBra 1\n        Callout 255 1 9\n        [ab]{1,4}+\n        Callout 255 10 1\n        c\n        Callout 255 11 0\n        Alt\n        Callout 255 12 1\n        x\n        Callout 255 13 1\n        y\n        Callout 255 14 0\n        Ket\n        Callout 255 21 1\n        1\n        Callout 255 22 1\n        2\n        Callout 255 23 1\n        3\n        Callout 255 24 0\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions:\nNo first char\nNeed char = '3'\n    aacaacaacaacaac123\n--->aacaacaacaacaac123\n +0 ^                      ([ab]{1,4}c|xy){4,5}?\n +1 ^                      [ab]{1,4}\n+10 ^ ^                    c\n+11 ^  ^                   |\n +1 ^  ^                   [ab]{1,4}\n+10 ^    ^                 c\n+11 ^     ^                |\n +1 ^     ^                [ab]{1,4}\n+10 ^       ^              c\n+11 ^        ^             |\n +1 ^        ^             [ab]{1,4}\n+10 ^          ^           c\n+11 ^           ^          |\n+21 ^           ^          1\n +1 ^           ^          [ab]{1,4}\n+10 ^             ^        c\n+11 ^              ^       |\n+21 ^              ^       1\n+22 ^               ^      2\n+23 ^                ^     3\n+24 ^                 ^    \n 0: aacaacaacaacaac123\n 1: aac\n\n/\\b.*/I\nCapturing subpattern count = 0\nMax lookbehind = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n  ab cd\\>1\n 0:  cd\n\n/\\b.*/Is\nCapturing subpattern count = 0\nMax lookbehind = 1\nMay match empty string\nOptions: dotall\nNo first char\nNo need char\n  ab cd\\>1\n 0:  cd\n\n/(?!.bcd).*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n  Xbcd12345\n 0: bcd12345\n\n/abcde/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'e'\n    ab\\P\nPartial match: ab\n    abc\\P\nPartial match: abc\n    abcd\\P\nPartial match: abcd\n    abcde\\P\n 0: abcde\n    the quick brown abc\\P\nPartial match: abc\n    ** Failers\\P\nNo match\n    the quick brown abxyz fox\\P\nNo match\n\n\"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\\d\\d$\"I\nCapturing subpattern count = 3\nOptions: anchored\nNo first char\nNeed char = '/'\n    13/05/04\\P\n 0: 13/05/04\n 1: 13\n 2: 05\n    13/5/2004\\P\n 0: 13/5/2004\n 1: 13\n 2: 5\n 3: 20\n    02/05/09\\P\n 0: 02/05/09\n 1: 02\n 2: 05\n    1\\P\nPartial match: 1\n    1/2\\P\nPartial match: 1/2\n    1/2/0\\P\nPartial match: 1/2/0\n    1/2/04\\P\n 0: 1/2/04\n 1: 1\n 2: 2\n    0\\P\nPartial match: 0\n    02/\\P\nPartial match: 02/\n    02/0\\P\nPartial match: 02/0\n    02/1\\P\nPartial match: 02/1\n    ** Failers\\P\nNo match\n    \\P\nNo match\n    123\\P\nNo match\n    33/4/04\\P\nNo match\n    3/13/04\\P\nNo match\n    0/1/2003\\P\nNo match\n    0/\\P\nNo match\n    02/0/\\P\nNo match\n    02/13\\P\nNo match\n\n/0{0,2}ABC/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'C'\n\n/\\d{3,}ABC/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'C'\n\n/\\d*ABC/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'C'\n\n/[abc]+DE/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'E'\n\n/[abc]?123/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = '3'\n    123\\P\n 0: 123\n    a\\P\nPartial match: a\n    b\\P\nPartial match: b\n    c\\P\nPartial match: c\n    c12\\P\nPartial match: c12\n    c123\\P\n 0: c123\n\n/^(?:\\d){3,5}X/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'X'\n    1\\P\nPartial match: 1\n    123\\P\nPartial match: 123\n    123X\n 0: 123X\n    1234\\P\nPartial match: 1234\n    1234X\n 0: 1234X\n    12345\\P\nPartial match: 12345\n    12345X\n 0: 12345X\n    *** Failers\nNo match\n    1X\nNo match\n    123456\\P\nNo match\n\n//KF>testsavedregex\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n\n/abc/IS>testsavedregex\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 3\nNo starting char list\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: abc\n    ** Failers\nNo match\n    bca\nNo match\n\n/abc/ISS>testsavedregex\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nNo study data\n    abc\n 0: abc\n    ** Failers\nNo match\n    bca\nNo match\n\n/abc/IFS>testsavedregex\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 3\nNo starting char list\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: abc\n    ** Failers\nNo match\n    bca\nNo match\n\n/abc/IFSS>testsavedregex\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nNo study data\n    abc\n 0: abc\n    ** Failers\nNo match\n    bca\nNo match\n\n/(a|b)/IS>testsavedregex\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: a\n 1: a\n    ** Failers\n 0: a\n 1: a\n    def\nNo match\n\n/(a|b)/ISS>testsavedregex\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nNo study data\n    abc\n 0: a\n 1: a\n    ** Failers\n 0: a\n 1: a\n    def\nNo match\n\n/(a|b)/ISF>testsavedregex\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b \nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: a\n 1: a\n    ** Failers\n 0: a\n 1: a\n    def\nNo match\n\n/(a|b)/ISSF>testsavedregex\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nNo study data\n    abc\n 0: a\n 1: a\n    ** Failers\n 0: a\n 1: a\n    def\nNo match\n\n~<(\\w+)/?>(.)*</(\\1)>~smgI\nCapturing subpattern count = 3\nMax back reference = 1\nOptions: multiline dotall\nFirst char = '<'\nNeed char = '>'\n    \\J1024<!DOCTYPE seite SYSTEM \"http://www.lco.lineas.de/xmlCms.dtd\">\\n<seite>\\n<dokumenteninformation>\\n<seitentitel>Partner der LCO</seitentitel>\\n<sprache>de</sprache>\\n<seitenbeschreibung>Partner der LINEAS Consulting\\nGmbH</seitenbeschreibung>\\n<schluesselworte>LINEAS Consulting GmbH Hamburg\\nPartnerfirmen</schluesselworte>\\n<revisit>30 days</revisit>\\n<robots>index,follow</robots>\\n<menueinformation>\\n<aktiv>ja</aktiv>\\n<menueposition>3</menueposition>\\n<menuetext>Partner</menuetext>\\n</menueinformation>\\n<lastedited>\\n<autor>LCO</autor>\\n<firma>LINEAS Consulting</firma>\\n<datum>15.10.2003</datum>\\n</lastedited>\\n</dokumenteninformation>\\n<inhalt>\\n\\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\\nGmbH</absatzueberschrift>\\n\\n<absatz><link ziel=\"http://www.ca.com/\" zielfenster=\"_blank\">\\n<bild name=\"logo_ca.gif\" rahmen=\"no\"/></link> <link\\nziel=\"http://www.ey.com/\" zielfenster=\"_blank\"><bild\\nname=\"logo_euy.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><link ziel=\"http://www.cisco.de/\" zielfenster=\"_blank\">\\n<bild name=\"logo_cisco.gif\" rahmen=\"ja\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.atelion.de/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_atelion.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><link ziel=\"http://www.line-information.de/\"\\nzielfenster=\"_blank\">\\n<bild name=\"logo_line_information.gif\" rahmen=\"no\"/></link>\\n</absatz>\\n\\n<absatz><bild name=\"logo_aw.gif\" rahmen=\"no\"/></absatz>\\n\\n<absatz><link ziel=\"http://www.incognis.de/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_incognis.gif\" rahmen=\"no\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.addcraft.com/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_addcraft.gif\" rahmen=\"no\"/></link></absatz>\\n\\n<absatz><link ziel=\"http://www.comendo.com/\"\\nzielfenster=\"_blank\"><bild\\nname=\"logo_comendo.gif\" rahmen=\"no\"/></link></absatz>\\n\\n</inhalt>\\n</seite>\n 0: <seite>\\x0a<dokumenteninformation>\\x0a<seitentitel>Partner der LCO</seitentitel>\\x0a<sprache>de</sprache>\\x0a<seitenbeschreibung>Partner der LINEAS Consulting\\x0aGmbH</seitenbeschreibung>\\x0a<schluesselworte>LINEAS Consulting GmbH Hamburg\\x0aPartnerfirmen</schluesselworte>\\x0a<revisit>30 days</revisit>\\x0a<robots>index,follow</robots>\\x0a<menueinformation>\\x0a<aktiv>ja</aktiv>\\x0a<menueposition>3</menueposition>\\x0a<menuetext>Partner</menuetext>\\x0a</menueinformation>\\x0a<lastedited>\\x0a<autor>LCO</autor>\\x0a<firma>LINEAS Consulting</firma>\\x0a<datum>15.10.2003</datum>\\x0a</lastedited>\\x0a</dokumenteninformation>\\x0a<inhalt>\\x0a\\x0a<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\\x0aGmbH</absatzueberschrift>\\x0a\\x0a<absatz><link ziel=\"http://www.ca.com/\" zielfenster=\"_blank\">\\x0a<bild name=\"logo_ca.gif\" rahmen=\"no\"/></link> <link\\x0aziel=\"http://www.ey.com/\" zielfenster=\"_blank\"><bild\\x0aname=\"logo_euy.gif\" rahmen=\"no\"/></link>\\x0a</absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.cisco.de/\" zielfenster=\"_blank\">\\x0a<bild name=\"logo_cisco.gif\" rahmen=\"ja\"/></link></absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.atelion.de/\"\\x0azielfenster=\"_blank\"><bild\\x0aname=\"logo_atelion.gif\" rahmen=\"no\"/></link>\\x0a</absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.line-information.de/\"\\x0azielfenster=\"_blank\">\\x0a<bild name=\"logo_line_information.gif\" rahmen=\"no\"/></link>\\x0a</absatz>\\x0a\\x0a<absatz><bild name=\"logo_aw.gif\" rahmen=\"no\"/></absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.incognis.de/\"\\x0azielfenster=\"_blank\"><bild\\x0aname=\"logo_incognis.gif\" rahmen=\"no\"/></link></absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.addcraft.com/\"\\x0azielfenster=\"_blank\"><bild\\x0aname=\"logo_addcraft.gif\" rahmen=\"no\"/></link></absatz>\\x0a\\x0a<absatz><link ziel=\"http://www.comendo.com/\"\\x0azielfenster=\"_blank\"><bild\\x0aname=\"logo_comendo.gif\" rahmen=\"no\"/></link></absatz>\\x0a\\x0a</inhalt>\\x0a</seite>\n 1: seite\n 2: \\x0a\n 3: seite\n\n/^a/IF\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/line\\nbreak/I\nCapturing subpattern count = 0\nContains explicit CR or LF match\nNo options\nFirst char = 'l'\nNeed char = 'k'\n    this is a line\\nbreak\n 0: line\\x0abreak\n    line one\\nthis is a line\\nbreak in the second line\n 0: line\\x0abreak\n\n/line\\nbreak/If\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: firstline\nFirst char = 'l'\nNeed char = 'k'\n    this is a line\\nbreak\n 0: line\\x0abreak\n    ** Failers\nNo match\n    line one\\nthis is a line\\nbreak in the second line\nNo match\n\n/line\\nbreak/Imf\nCapturing subpattern count = 0\nContains explicit CR or LF match\nOptions: multiline firstline\nFirst char = 'l'\nNeed char = 'k'\n    this is a line\\nbreak\n 0: line\\x0abreak\n    ** Failers\nNo match\n    line one\\nthis is a line\\nbreak in the second line\nNo match\n\n/(?i)(?-i)AbCd/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'A'\nNeed char = 'd'\n    AbCd\n 0: AbCd\n    ** Failers\nNo match\n    abcd\nNo match\n\n/a{11111111111111111111}/I\nFailed: number too big in {} quantifier at offset 8\n\n/(){64294967295}/I\nFailed: number too big in {} quantifier at offset 9\n\n/(){2,4294967295}/I\nFailed: number too big in {} quantifier at offset 11\n\n\"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\\1B\"I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nFirst char = 'a' (caseless)\nNeed char = 'B'\n    abcdefghijklAkB\n 0: abcdefghijklAkB\n 1: k\n\n\"(?P<n0>a)(?P<n1>b)(?P<n2>c)(?P<n3>d)(?P<n4>e)(?P<n5>f)(?P<n6>g)(?P<n7>h)(?P<n8>i)(?P<n9>j)(?P<n10>k)(?P<n11>l)A\\11B\"I\nCapturing subpattern count = 12\nMax back reference = 11\nNamed capturing subpatterns:\n  n0    1\n  n1    2\n  n10  11\n  n11  12\n  n2    3\n  n3    4\n  n4    5\n  n5    6\n  n6    7\n  n7    8\n  n8    9\n  n9   10\nNo options\nFirst char = 'a'\nNeed char = 'B'\n    abcdefghijklAkB\n 0: abcdefghijklAkB\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n12: l\n\n\"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\\11B\"I\nCapturing subpattern count = 12\nMax back reference = 11\nNo options\nFirst char = 'a'\nNeed char = 'B'\n    abcdefghijklAkB\n 0: abcdefghijklAkB\n 1: a\n 2: b\n 3: c\n 4: d\n 5: e\n 6: f\n 7: g\n 8: h\n 9: i\n10: j\n11: k\n12: l\n\n\"(?P<name0>a)(?P<name1>a)(?P<name2>a)(?P<name3>a)(?P<name4>a)(?P<name5>a)(?P<name6>a)(?P<name7>a)(?P<name8>a)(?P<name9>a)(?P<name10>a)(?P<name11>a)(?P<name12>a)(?P<name13>a)(?P<name14>a)(?P<name15>a)(?P<name16>a)(?P<name17>a)(?P<name18>a)(?P<name19>a)(?P<name20>a)(?P<name21>a)(?P<name22>a)(?P<name23>a)(?P<name24>a)(?P<name25>a)(?P<name26>a)(?P<name27>a)(?P<name28>a)(?P<name29>a)(?P<name30>a)(?P<name31>a)(?P<name32>a)(?P<name33>a)(?P<name34>a)(?P<name35>a)(?P<name36>a)(?P<name37>a)(?P<name38>a)(?P<name39>a)(?P<name40>a)(?P<name41>a)(?P<name42>a)(?P<name43>a)(?P<name44>a)(?P<name45>a)(?P<name46>a)(?P<name47>a)(?P<name48>a)(?P<name49>a)(?P<name50>a)(?P<name51>a)(?P<name52>a)(?P<name53>a)(?P<name54>a)(?P<name55>a)(?P<name56>a)(?P<name57>a)(?P<name58>a)(?P<name59>a)(?P<name60>a)(?P<name61>a)(?P<name62>a)(?P<name63>a)(?P<name64>a)(?P<name65>a)(?P<name66>a)(?P<name67>a)(?P<name68>a)(?P<name69>a)(?P<name70>a)(?P<name71>a)(?P<name72>a)(?P<name73>a)(?P<name74>a)(?P<name75>a)(?P<name76>a)(?P<name77>a)(?P<name78>a)(?P<name79>a)(?P<name80>a)(?P<name81>a)(?P<name82>a)(?P<name83>a)(?P<name84>a)(?P<name85>a)(?P<name86>a)(?P<name87>a)(?P<name88>a)(?P<name89>a)(?P<name90>a)(?P<name91>a)(?P<name92>a)(?P<name93>a)(?P<name94>a)(?P<name95>a)(?P<name96>a)(?P<name97>a)(?P<name98>a)(?P<name99>a)(?P<name100>a)\"I\nCapturing subpattern count = 101\nNamed capturing subpatterns:\n  name0     1\n  name1     2\n  name10   11\n  name100 101\n  name11   12\n  name12   13\n  name13   14\n  name14   15\n  name15   16\n  name16   17\n  name17   18\n  name18   19\n  name19   20\n  name2     3\n  name20   21\n  name21   22\n  name22   23\n  name23   24\n  name24   25\n  name25   26\n  name26   27\n  name27   28\n  name28   29\n  name29   30\n  name3     4\n  name30   31\n  name31   32\n  name32   33\n  name33   34\n  name34   35\n  name35   36\n  name36   37\n  name37   38\n  name38   39\n  name39   40\n  name4     5\n  name40   41\n  name41   42\n  name42   43\n  name43   44\n  name44   45\n  name45   46\n  name46   47\n  name47   48\n  name48   49\n  name49   50\n  name5     6\n  name50   51\n  name51   52\n  name52   53\n  name53   54\n  name54   55\n  name55   56\n  name56   57\n  name57   58\n  name58   59\n  name59   60\n  name6     7\n  name60   61\n  name61   62\n  name62   63\n  name63   64\n  name64   65\n  name65   66\n  name66   67\n  name67   68\n  name68   69\n  name69   70\n  name7     8\n  name70   71\n  name71   72\n  name72   73\n  name73   74\n  name74   75\n  name75   76\n  name76   77\n  name77   78\n  name78   79\n  name79   80\n  name8     9\n  name80   81\n  name81   82\n  name82   83\n  name83   84\n  name84   85\n  name85   86\n  name86   87\n  name87   88\n  name88   89\n  name89   90\n  name9    10\n  name90   91\n  name91   92\n  name92   93\n  name93   94\n  name94   95\n  name95   96\n  name96   97\n  name97   98\n  name98   99\n  name99  100\nNo options\nFirst char = 'a'\nNeed char = 'a'\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but too many substrings\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n10: a\n11: a\n12: a\n13: a\n14: a\n\n\"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)\"I\nCapturing subpattern count = 101\nNo options\nFirst char = 'a'\nNeed char = 'a'\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but too many substrings\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n10: a\n11: a\n12: a\n13: a\n14: a\n\n/[^()]*(?:\\((?R)\\)[^()]*)*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    (this(and)that\n 0: \n    (this(and)that)\n 0: (this(and)that)\n    (this(and)that)stuff\n 0: (this(and)that)stuff\n\n/[^()]*(?:\\((?>(?R))\\)[^()]*)*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    (this(and)that\n 0: \n    (this(and)that)\n 0: (this(and)that)\n\n/[^()]*(?:\\((?R)\\))*[^()]*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    (this(and)that\n 0: \n    (this(and)that)\n 0: (this(and)that)\n\n/(?:\\((?R)\\))*[^()]*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    (this(and)that\n 0: \n    (this(and)that)\n 0: \n    ((this))\n 0: ((this))\n\n/(?:\\((?R)\\))|[^()]*/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n    (this(and)that\n 0: \n    (this(and)that)\n 0: \n    (this)\n 0: (this)\n    ((this))\n 0: ((this))\n\n/\\x{0000ff}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\xff\nNo need char\n\n/^((?P<A>a1)|(?P<A>a2)b)/I\nFailed: two named subpatterns have the same name at offset 17\n\n/^((?P<A>a1)|(?P<A>a2)b)/IJ\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  A   2\n  A   3\nOptions: anchored dupnames\nNo first char\nNo need char\n    a1b\\CA\n 0: a1\n 1: a1\n 2: a1\n  C a1 (2) A\n    a2b\\CA\n 0: a2b\n 1: a2b\n 2: <unset>\n 3: a2\n  C a2 (2) A\n    ** Failers\nNo match\n    a1b\\CZ\\CA\nno parentheses with name \"Z\"\n 0: a1\n 1: a1\n 2: a1\ncopy substring Z failed -7\n  C a1 (2) A\n    \n/(?|(?<a>)(?<b>)(?<a>)|(?<a>)(?<b>)(?<a>))/IJ\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  a   1\n  a   3\n  b   2\nMay match empty string\nOptions: dupnames\nNo first char\nNo need char\n\n/^(?P<A>a)(?P<A>b)/IJ\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  A   1\n  A   2\nOptions: anchored dupnames\nNo first char\nNo need char\n    ab\\CA\n 0: ab\n 1: a\n 2: b\n  C a (1) A\n\n/^(?P<A>a)(?P<A>b)|cd/IJ\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  A   1\n  A   2\nOptions: dupnames\nNo first char\nNo need char\n    ab\\CA\n 0: ab\n 1: a\n 2: b\n  C a (1) A\n    cd\\CA\n 0: cd\ncopy substring A failed -7\n\n/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ\nCapturing subpattern count = 4\nNamed capturing subpatterns:\n  A   1\n  A   2\n  A   3\n  A   4\nOptions: dupnames\nNo first char\nNo need char\n    cdefgh\\CA\n 0: cdefgh\n 1: <unset>\n 2: <unset>\n 3: ef\n 4: gh\n  C ef (2) A\n\n/^((?P<A>a1)|(?P<A>a2)b)/IJ\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  A   2\n  A   3\nOptions: anchored dupnames\nNo first char\nNo need char\n    a1b\\GA\n 0: a1\n 1: a1\n 2: a1\n  G a1 (2) A\n    a2b\\GA\n 0: a2b\n 1: a2b\n 2: <unset>\n 3: a2\n  G a2 (2) A\n    ** Failers\nNo match\n    a1b\\GZ\\GA\nno parentheses with name \"Z\"\n 0: a1\n 1: a1\n 2: a1\nget substring Z failed -7\n  G a1 (2) A\n\n/^(?P<A>a)(?P<A>b)/IJ\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  A   1\n  A   2\nOptions: anchored dupnames\nNo first char\nNo need char\n    ab\\GA\n 0: ab\n 1: a\n 2: b\n  G a (1) A\n\n/^(?P<A>a)(?P<A>b)|cd/IJ\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  A   1\n  A   2\nOptions: dupnames\nNo first char\nNo need char\n    ab\\GA\n 0: ab\n 1: a\n 2: b\n  G a (1) A\n    cd\\GA\n 0: cd\nget substring A failed -7\n\n/^(?P<A>a)(?P<A>b)|cd(?P<A>ef)(?P<A>gh)/IJ\nCapturing subpattern count = 4\nNamed capturing subpatterns:\n  A   1\n  A   2\n  A   3\n  A   4\nOptions: dupnames\nNo first char\nNo need char\n    cdefgh\\GA\n 0: cdefgh\n 1: <unset>\n 2: <unset>\n 3: ef\n 4: gh\n  G ef (2) A\n\n/(?J)^((?P<A>a1)|(?P<A>a2)b)/I\nCapturing subpattern count = 3\nNamed capturing subpatterns:\n  A   2\n  A   3\nOptions: anchored\nDuplicate name status changes\nNo first char\nNo need char\n    a1b\\CA\n 0: a1\n 1: a1\n 2: a1\n  C a1 (2) A\n    a2b\\CA\n 0: a2b\n 1: a2b\n 2: <unset>\n 3: a2\n  C a2 (2) A\n\n/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<A>d)/I\nFailed: two named subpatterns have the same name at offset 37\n\n/ In this next test, J is not set at the outer level; consequently it isn't\nset in the pattern's options; consequently pcre_get_named_substring() produces\na random value. /Ix\nCapturing subpattern count = 1\nOptions: extended\nFirst char = 'I'\nNeed char = 'e'\n\n/^(?P<A>a) (?J:(?P<B>b)(?P<B>c)) (?P<C>d)/I\nCapturing subpattern count = 4\nNamed capturing subpatterns:\n  A   1\n  B   2\n  B   3\n  C   4\nOptions: anchored\nDuplicate name status changes\nNo first char\nNo need char\n    a bc d\\CA\\CB\\CC\n 0: a bc d\n 1: a\n 2: b\n 3: c\n 4: d\n  C a (1) A\n  C b (1) B\n  C d (1) C\n\n/^(?P<A>a)?(?(A)a|b)/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  A   1\nOptions: anchored\nNo first char\nNo need char\n    aabc\n 0: aa\n 1: a\n    bc\n 0: b\n    ** Failers\nNo match\n    abc\nNo match\n\n/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  ZZ   1\nNo options\nNo first char\nNeed char = 'X'\n    bXaX\n 0: bXaX\n 1: X\n\n/(?:(?(2y)a|b)(X))+/I\nFailed: malformed number or name after (?( at offset 7\n\n/(?:(?(ZA)a|b)(?P<ZZ>X))+/I\nFailed: reference to non-existent subpattern at offset 9\n\n/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  ZZ   1\nNo options\nNo first char\nNeed char = 'X'\n    bbXaaX\n 0: bbXaaX\n 1: X\n\n/(?:(?(ZZ)a|\\(b\\))\\\\(?P<ZZ>X))+/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  ZZ   1\nNo options\nNo first char\nNeed char = 'X'\n    (b)\\\\Xa\\\\X\n 0: (b)\\Xa\\X\n 1: X\n\n/(?P<ABC/I\nFailed: syntax error in subpattern name (missing terminator) at offset 7\n\n/(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  A   1\nNo options\nNo first char\nNo need char\n    bXXaYYaY\n 0: bXXaYYaY\n 1: Y\n    bXYaXXaX\n 0: bX\n 1: X\n\n/()()()()()()()()()(?:(?(A)(?P=A)a|b)(?P<A>X|Y))+/I\nCapturing subpattern count = 10\nMax back reference = 10\nNamed capturing subpatterns:\n  A  10\nNo options\nNo first char\nNo need char\n    bXXaYYaY\n 0: bXXaYYaY\n 1: \n 2: \n 3: \n 4: \n 5: \n 6: \n 7: \n 8: \n 9: \n10: Y\n\n/\\s*,\\s*/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = ','\nSubject length lower bound = 1\nStarting chars: \\x09 \\x0a \\x0b \\x0c \\x0d \\x20 , \n    \\x0b,\\x0b\n 0: \\x0b,\\x0b\n    \\x0c,\\x0d\n 0: \\x0c,\\x0d\n\n/^abc/Im\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'c'\n    xyz\\nabc\n 0: abc\n    xyz\\nabc\\<lf>\n 0: abc\n    xyz\\r\\nabc\\<lf>\n 0: abc\n    xyz\\rabc\\<cr>\n 0: abc\n    xyz\\r\\nabc\\<crlf>\n 0: abc\n    ** Failers\nNo match\n    xyz\\nabc\\<cr>\nNo match\n    xyz\\r\\nabc\\<cr>\nNo match\n    xyz\\nabc\\<crlf>\nNo match\n    xyz\\rabc\\<crlf>\nNo match\n    xyz\\rabc\\<lf>\nNo match\n\n/abc$/Im<lf>\nCapturing subpattern count = 0\nOptions: multiline\nForced newline sequence: LF\nFirst char = 'a'\nNeed char = 'c'\n    xyzabc\n 0: abc\n    xyzabc\\n\n 0: abc\n    xyzabc\\npqr\n 0: abc\n    xyzabc\\r\\<cr>\n 0: abc\n    xyzabc\\rpqr\\<cr>\n 0: abc\n    xyzabc\\r\\n\\<crlf>\n 0: abc\n    xyzabc\\r\\npqr\\<crlf>\n 0: abc\n    ** Failers\nNo match\n    xyzabc\\r\nNo match\n    xyzabc\\rpqr\nNo match\n    xyzabc\\r\\n\nNo match\n    xyzabc\\r\\npqr\nNo match\n\n/^abc/Im<cr>\nCapturing subpattern count = 0\nOptions: multiline\nForced newline sequence: CR\nFirst char at start or follows newline\nNeed char = 'c'\n    xyz\\rabcdef\n 0: abc\n    xyz\\nabcdef\\<lf>\n 0: abc\n    ** Failers\nNo match\n    xyz\\nabcdef\nNo match\n\n/^abc/Im<lf>\nCapturing subpattern count = 0\nOptions: multiline\nForced newline sequence: LF\nFirst char at start or follows newline\nNeed char = 'c'\n    xyz\\nabcdef\n 0: abc\n    xyz\\rabcdef\\<cr>\n 0: abc\n    ** Failers\nNo match\n    xyz\\rabcdef\nNo match\n\n/^abc/Im<crlf>\nCapturing subpattern count = 0\nOptions: multiline\nForced newline sequence: CRLF\nFirst char at start or follows newline\nNeed char = 'c'\n    xyz\\r\\nabcdef\n 0: abc\n    xyz\\rabcdef\\<cr>\n 0: abc\n    ** Failers\nNo match\n    xyz\\rabcdef\nNo match\n\n/^abc/Im<bad>\nUnknown modifier at: <bad>\n\n\n/abc/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNeed char = 'c'\n    xyz\\rabc\\<bad>\nUnknown escape sequence at: <bad>\n    abc\n 0: abc\n\n/.*/I<lf>\nCapturing subpattern count = 0\nMay match empty string\nOptions:\nForced newline sequence: LF\nFirst char at start or follows newline\nNo need char\n    abc\\ndef\n 0: abc\n    abc\\rdef\n 0: abc\\x0ddef\n    abc\\r\\ndef\n 0: abc\\x0d\n    \\<cr>abc\\ndef\n 0: abc\\x0adef\n    \\<cr>abc\\rdef\n 0: abc\n    \\<cr>abc\\r\\ndef\n 0: abc\n    \\<crlf>abc\\ndef\n 0: abc\\x0adef\n    \\<crlf>abc\\rdef\n 0: abc\\x0ddef\n    \\<crlf>abc\\r\\ndef\n 0: abc\n\n/\\w+(.)(.)?def/Is\nCapturing subpattern count = 2\nOptions: dotall\nNo first char\nNeed char = 'f'\n    abc\\ndef\n 0: abc\\x0adef\n 1: \\x0a\n    abc\\rdef\n 0: abc\\x0ddef\n 1: \\x0d\n    abc\\r\\ndef\n 0: abc\\x0d\\x0adef\n 1: \\x0d\n 2: \\x0a\n\n+((?:\\s|//.*\\\\n|/[*](?:\\\\n|.)*?[*]/)*)+I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nNo first char\nNo need char\n   /* this is a C style comment */\\M\nMinimum match() limit = 120\nMinimum match() recursion limit = 6\n 0: /* this is a C style comment */\n 1: /* this is a C style comment */\n\n/(?P<B>25[0-5]|2[0-4]\\d|[01]?\\d?\\d)(?:\\.(?P>B)){3}/I\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  B   1\nNo options\nNo first char\nNeed char = '.'\n\n/()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n ()()()()()()()()()()()()()()()()()()()()\n (.(.))/Ix\nCapturing subpattern count = 102\nOptions: extended\nNo first char\nNo need char\n    XY\\O400\n 0: XY\n 1: \n 2: \n 3: \n 4: \n 5: \n 6: \n 7: \n 8: \n 9: \n10: \n11: \n12: \n13: \n14: \n15: \n16: \n17: \n18: \n19: \n20: \n21: \n22: \n23: \n24: \n25: \n26: \n27: \n28: \n29: \n30: \n31: \n32: \n33: \n34: \n35: \n36: \n37: \n38: \n39: \n40: \n41: \n42: \n43: \n44: \n45: \n46: \n47: \n48: \n49: \n50: \n51: \n52: \n53: \n54: \n55: \n56: \n57: \n58: \n59: \n60: \n61: \n62: \n63: \n64: \n65: \n66: \n67: \n68: \n69: \n70: \n71: \n72: \n73: \n74: \n75: \n76: \n77: \n78: \n79: \n80: \n81: \n82: \n83: \n84: \n85: \n86: \n87: \n88: \n89: \n90: \n91: \n92: \n93: \n94: \n95: \n96: \n97: \n98: \n99: \n100: \n101: XY\n102: Y\n\n/(a*b|(?i:c*(?-i)d))/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: C a b c d \n\n/()[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b \n\n/(|)[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b \n\n/(|c)[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b c \n\n/(|c?)[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b c \n\n/(d?|c?)[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b c d \n\n/(d?|c)[ab]xyz/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 4\nStarting chars: a b c d \n\n/^a*b\\d/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        a*+\n        b\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'b'\n\n/^a*+b\\d/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        a*+\n        b\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'b'\n\n/^a*?b\\d/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        a*+\n        b\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'b'\n\n/^a+A\\d/DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        a++\n        A\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNeed char = 'A'\n    aaaA5\n 0: aaaA5\n    ** Failers\nNo match\n    aaaa5\nNo match\n\n/^a*A\\d/IiDZ\n------------------------------------------------------------------\n        Bra\n        ^\n     /i a*\n     /i A\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored caseless\nNo first char\nNeed char = 'A' (caseless)\n    aaaA5\n 0: aaaA5\n    aaaa5\n 0: aaaa5\n\n/(a*|b*)[cd]/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/(a+|b*)[cd]/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/(a*|b+)[cd]/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/(a+|b+)[cd]/IS\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\n (((\n a\n ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n )))\n/Ix\nCapturing subpattern count = 203\nOptions: extended\nFirst char = 'a'\nNo need char\n  large nest\nMatched, but too many substrings\n 0: a\n 1: a\n 2: a\n 3: a\n 4: a\n 5: a\n 6: a\n 7: a\n 8: a\n 9: a\n10: a\n11: a\n12: a\n13: a\n14: a\n\n/a*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        a*+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        a*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/0*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        0*\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/0*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        0*+\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        a*+\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        a*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/ *\\s/BZ\n------------------------------------------------------------------\n        Bra\n         *\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/ *\\S/BZ\n------------------------------------------------------------------\n        Bra\n         *+\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        a*\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        a*+\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/=*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        =*+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/=*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        =*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*+\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\D*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*+\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*+\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*+\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*+\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*+\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\w*+\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*a/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*+\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*2/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*+\n        2\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\D/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\s/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\S/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W*\\W/BZ\n------------------------------------------------------------------\n        Bra\n        \\W*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]+a/BZ\n------------------------------------------------------------------\n        Bra\n        [^a]++\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]+a/BZi\n------------------------------------------------------------------\n        Bra\n     /i [^a]++\n     /i a\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]+A/BZi\n------------------------------------------------------------------\n        Bra\n     /i [^a]++\n     /i A\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]+b/BZ\n------------------------------------------------------------------\n        Bra\n        [^a]+\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]+\\d/BZ\n------------------------------------------------------------------\n        Bra\n        [^a]+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*[^a]/BZ\n------------------------------------------------------------------\n        Bra\n        a*+\n        [^a]\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?P<abc>x)(?P<xyz>y)/I\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  abc   1\n  xyz   2\nNo options\nFirst char = 'x'\nNeed char = 'y'\n    xy\\Cabc\\Cxyz\n 0: xy\n 1: x\n 2: y\n  C x (1) abc\n  C y (1) xyz\n\n/(?<abc>x)(?'xyz'y)/I\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  abc   1\n  xyz   2\nNo options\nFirst char = 'x'\nNeed char = 'y'\n    xy\\Cabc\\Cxyz\n 0: xy\n 1: x\n 2: y\n  C x (1) abc\n  C y (1) xyz\n\n/(?<abc'x)(?'xyz'y)/I\nFailed: syntax error in subpattern name (missing terminator) at offset 6\n\n/(?<abc>x)(?'xyz>y)/I\nFailed: syntax error in subpattern name (missing terminator) at offset 15\n\n/(?P'abc'x)(?P<xyz>y)/I\nFailed: unrecognized character after (?P at offset 3\n\n/^(?:(?(ZZ)a|b)(?<ZZ>X))+/\n    bXaX\n 0: bXaX\n 1: X\n    bXbX\n 0: bX\n 1: X\n    ** Failers\nNo match\n    aXaX\nNo match\n    aXbX\nNo match\n\n/^(?P>abc)(?<abcd>xxx)/\nFailed: reference to non-existent subpattern at offset 8\n\n/^(?P>abc)(?<abc>x|y)/\n    xx\n 0: xx\n 1: x\n    xy\n 0: xy\n 1: y\n    yy\n 0: yy\n 1: y\n    yx\n 0: yx\n 1: x\n\n/^(?P>abc)(?P<abc>x|y)/\n    xx\n 0: xx\n 1: x\n    xy\n 0: xy\n 1: y\n    yy\n 0: yy\n 1: y\n    yx\n 0: yx\n 1: x\n\n/^((?(abc)a|b)(?<abc>x|y))+/\n    bxay\n 0: bxay\n 1: ay\n 2: y\n    bxby\n 0: bx\n 1: bx\n 2: x\n    ** Failers\nNo match\n    axby\nNo match\n\n/^(((?P=abc)|X)(?<abc>x|y))+/\n    XxXxxx\n 0: XxXxxx\n 1: xx\n 2: x\n 3: x\n    XxXyyx\n 0: XxXyyx\n 1: yx\n 2: y\n 3: x\n    XxXyxx\n 0: XxXy\n 1: Xy\n 2: X\n 3: y\n    ** Failers\nNo match\n    x\nNo match\n\n/^(?1)(abc)/\n    abcabc\n 0: abcabc\n 1: abc\n\n/^(?:(?:\\1|X)(a|b))+/\n    Xaaa\n 0: Xaaa\n 1: a\n    Xaba\n 0: Xa\n 1: a\n\n/^[\\E\\Qa\\E-\\Qz\\E]+/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [a-z]++\n        Ket\n        End\n------------------------------------------------------------------\n\n/^[a\\Q]bc\\E]/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\]a-c]\n        Ket\n        End\n------------------------------------------------------------------\n\n/^[a-\\Q\\E]/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\-a]\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?P>abc)[()](?<abc>)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Recurse\n        [()]\n        CBra 1\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^((?(abc)y)[()](?P<abc>x))+/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        CBra 1\n        Cond\n      2 Cond ref\n        y\n        Ket\n        [()]\n        CBra 2\n        x\n        Ket\n        KetRmax\n        Ket\n        End\n------------------------------------------------------------------\n    (xy)x\n 0: (xy)x\n 1: y)x\n 2: x\n\n/^(?P>abc)\\Q()\\E(?<abc>)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Recurse\n        ()\n        CBra 1\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?P>abc)[a\\Q(]\\E(](?<abc>)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Recurse\n        [(\\]a]\n        CBra 1\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?P>abc) # this is (a comment)\n  (?<abc>)/BZx\n------------------------------------------------------------------\n        Bra\n        ^\n        Recurse\n        CBra 1\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^\\W*(?:(?<one>(?<two>.)\\W*(?&one)\\W*\\k<two>|)|(?<three>(?<four>.)\\W*(?&three)\\W*\\k'four'|\\W*.\\W*))\\W*$/Ii\nCapturing subpattern count = 4\nMax back reference = 4\nNamed capturing subpatterns:\n  four    4\n  one     1\n  three   3\n  two     2\nMay match empty string\nOptions: anchored caseless\nNo first char\nNo need char\n    1221\n 0: 1221\n 1: 1221\n 2: 1\n    Satan, oscillate my metallic sonatas!\n 0: Satan, oscillate my metallic sonatas!\n 1: <unset>\n 2: <unset>\n 3: Satan, oscillate my metallic sonatas\n 4: S\n    A man, a plan, a canal: Panama!\n 0: A man, a plan, a canal: Panama!\n 1: <unset>\n 2: <unset>\n 3: A man, a plan, a canal: Panama\n 4: A\n    Able was I ere I saw Elba.\n 0: Able was I ere I saw Elba.\n 1: <unset>\n 2: <unset>\n 3: Able was I ere I saw Elba\n 4: A\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/(?=(\\w+))\\1:/I\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNeed char = ':'\n    abcd:\n 0: abcd:\n 1: abcd\n\n/(?=(?'abc'\\w+))\\k<abc>:/I\nCapturing subpattern count = 1\nMax back reference = 1\nNamed capturing subpatterns:\n  abc   1\nNo options\nNo first char\nNeed char = ':'\n    abcd:\n 0: abcd:\n 1: abcd\n\n/(?'abc'a|b)(?<abc>d|e)\\k<abc>{2}/J\n    adaa\n 0: adaa\n 1: a\n 2: d\n    ** Failers\nNo match\n    addd\nNo match\n    adbb\nNo match\n\n/(?'abc'a|b)(?<abc>d|e)(?&abc){2}/J\n    bdaa\n 0: bdaa\n 1: b\n 2: d\n    bdab\n 0: bdab\n 1: b\n 2: d\n    ** Failers\nNo match\n    bddd\nNo match\n\n/(?(<bc))/\nFailed: malformed number or name after (?( at offset 6\n\n/(?(''))/\nFailed: assertion expected after (?( or (?(?C) at offset 4\n\n/(?('R')stuff)/\nFailed: reference to non-existent subpattern at offset 7\n\n/((abc (?(R) (?(R1)1) (?(R2)2) X  |  (?1)  (?2)   (?R) ))) /x\n    abcabc1Xabc2XabcXabcabc\n 0: abcabc1Xabc2XabcX\n 1: abcabc1Xabc2XabcX\n 2: abcabc1Xabc2XabcX\n\n/(?<A> (?'B' abc (?(R) (?(R&A)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x\n    abcabc1Xabc2XabcXabcabc\n 0: abcabc1Xabc2XabcX\n 1: abcabc1Xabc2XabcX\n 2: abcabc1Xabc2XabcX\n\n/(?<A> (?'B' abc (?(R) (?(R&C)1) (?(R&B)2) X  |  (?1)  (?2)   (?R) ))) /x\nFailed: reference to non-existent subpattern at offset 29\n\n/^(?(DEFINE) abc | xyz ) /x\nFailed: DEFINE group contains more than one branch at offset 22\n\n/(?(DEFINE) abc) xyz/xI\nCapturing subpattern count = 0\nOptions: extended\nFirst char = 'x'\nNeed char = 'z'\n\n/(a|)*\\d/\n  \\O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  \\O0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\nMatched, but too many substrings\n\n/^a.b/<lf>\n    a\\rb\n 0: a\\x0db\n    a\\nb\\<cr>\n 0: a\\x0ab\n    a\\x85b\\<anycrlf> \n 0: a\\x85b\n    ** Failers\nNo match\n    a\\nb\nNo match\n    a\\nb\\<any>\nNo match\n    a\\rb\\<cr>\nNo match\n    a\\rb\\<any>\nNo match\n    a\\x85b\\<any> \nNo match\n    a\\rb\\<anycrlf>\nNo match\n\n/^abc./mgx<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x85abc7 JUNK\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n\n/abc.$/mgx<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc7 abc9\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc9\n\n/a/<cr><any>\n\n/a/<any><crlf>\nFailed: inconsistent NEWLINE options at offset 0\n\n/^a\\Rb/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b\n 0: a\\x85b\n    ** Failers\nNo match\n    a\\n\\rb\nNo match\n\n/^a\\R*b/<bsr_unicode>\n    ab\n 0: ab\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b\n 0: a\\x85b\n    a\\n\\rb\n 0: a\\x0a\\x0db\n    a\\n\\r\\x85\\x0cb\n 0: a\\x0a\\x0d\\x85\\x0cb\n\n/^a\\R+b/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b\n 0: a\\x85b\n    a\\n\\rb\n 0: a\\x0a\\x0db\n    a\\n\\r\\x85\\x0cb\n 0: a\\x0a\\x0d\\x85\\x0cb\n    ** Failers\nNo match\n    ab\nNo match\n\n/^a\\R{1,3}b/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\n\\rb\n 0: a\\x0a\\x0db\n    a\\n\\r\\x85b\n 0: a\\x0a\\x0d\\x85b\n    a\\r\\n\\r\\nb\n 0: a\\x0d\\x0a\\x0d\\x0ab\n    a\\r\\n\\r\\n\\r\\nb\n 0: a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0ab\n    a\\n\\r\\n\\rb\n 0: a\\x0a\\x0d\\x0a\\x0db\n    a\\n\\n\\r\\nb\n 0: a\\x0a\\x0a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\n\\n\\n\\rb\nNo match\n    a\\r\nNo match\n\n/^a[\\R]b/<bsr_unicode>\n    aRb\n 0: aRb\n    ** Failers\nNo match\n    a\\nb\nNo match\n\n/(?&abc)X(?<abc>P)/I\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  abc   1\nNo options\nNo first char\nNeed char = 'P'\n    abcPXP123\n 0: PXP\n 1: P\n\n/(?1)X(?<abc>P)/I\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  abc   1\nNo options\nNo first char\nNeed char = 'P'\n    abcPXP123\n 0: PXP\n 1: P\n\n/(?:a(?&abc)b)*(?<abc>x)/\n    123axbaxbaxbx456\n 0: axbaxbaxbx\n 1: x\n    123axbaxbaxb456\n 0: x\n 1: x\n\n/(?:a(?&abc)b){1,5}(?<abc>x)/\n    123axbaxbaxbx456\n 0: axbaxbaxbx\n 1: x\n\n/(?:a(?&abc)b){2,5}(?<abc>x)/\n    123axbaxbaxbx456\n 0: axbaxbaxbx\n 1: x\n\n/(?:a(?&abc)b){2,}(?<abc>x)/\n    123axbaxbaxbx456\n 0: axbaxbaxbx\n 1: x\n\n/(abc)(?i:(?1))/\n   defabcabcxyz\n 0: abcabc\n 1: abc\n   DEFabcABCXYZ\nNo match\n\n/(abc)(?:(?i)(?1))/\n   defabcabcxyz\n 0: abcabc\n 1: abc\n   DEFabcABCXYZ\nNo match\n\n/^(a)\\g-2/\nFailed: reference to non-existent subpattern at offset 7\n\n/^(a)\\g/\nFailed: a numbered reference must not be zero at offset 5\n\n/^(a)\\g{0}/\nFailed: a numbered reference must not be zero at offset 8\n\n/^(a)\\g{3/\nFailed: \\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8\n\n/^(a)\\g{aa}/\nFailed: reference to non-existent subpattern at offset 9\n\n/^a.b/<lf>\n    a\\rb\n 0: a\\x0db\n    *** Failers\nNo match\n    a\\nb\nNo match\n\n/.+foo/\n    afoo\n 0: afoo\n    ** Failers\nNo match\n    \\r\\nfoo\nNo match\n    \\nfoo\nNo match\n\n/.+foo/<crlf>\n    afoo\n 0: afoo\n    \\nfoo\n 0: \\x0afoo\n    ** Failers\nNo match\n    \\r\\nfoo\nNo match\n\n/.+foo/<any>\n    afoo\n 0: afoo\n    ** Failers\nNo match\n    \\nfoo\nNo match\n    \\r\\nfoo\nNo match\n\n/.+foo/s\n    afoo\n 0: afoo\n    \\r\\nfoo\n 0: \\x0d\\x0afoo\n    \\nfoo\n 0: \\x0afoo\n    \n/^$/mg<any>\n    abc\\r\\rxyz\n 0: \n    abc\\n\\rxyz  \n 0: \n    ** Failers \nNo match\n    abc\\r\\nxyz\nNo match\n\n/(?m)^$/<any>g+\n    abc\\r\\n\\r\\n\n 0: \n 0+ \\x0d\\x0a\n\n/(?m)^$|^\\r\\n/<any>g+ \n    abc\\r\\n\\r\\n\n 0: \n 0+ \\x0d\\x0a\n 0: \\x0d\\x0a\n 0+ \n    \n/(?m)$/<any>g+ \n    abc\\r\\n\\r\\n\n 0: \n 0+ \\x0d\\x0a\\x0d\\x0a\n 0: \n 0+ \\x0d\\x0a\n 0: \n 0+ \n\n/abc.$/mgx<anycrlf>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc9\n 0: abc1\n 0: abc4\n 0: abc5\n 0: abc9\n\n/^X/m\n    XABC\n 0: X\n    ** Failers \nNo match\n    XABC\\B\nNo match\n\n/(ab|c)(?-1)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        ab\n        Alt\n        c\n        Ket\n        Recurse\n        Ket\n        End\n------------------------------------------------------------------\n    abc\n 0: abc\n 1: ab\n\n/xy(?+1)(abc)/BZ\n------------------------------------------------------------------\n        Bra\n        xy\n        Recurse\n        CBra 1\n        abc\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    xyabcabc\n 0: xyabcabc\n 1: abc\n    ** Failers\nNo match\n    xyabc  \nNo match\n    \n/x(?-0)y/\nFailed: a numbered reference must not be zero at offset 5\n\n/x(?-1)y/\nFailed: reference to non-existent subpattern at offset 5\n\n/x(?+0)y/ \nFailed: a numbered reference must not be zero at offset 5\n\n/x(?+1)y/\nFailed: reference to non-existent subpattern at offset 5\n\n/^(abc)?(?(-1)X|Y)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Brazero\n        CBra 1\n        abc\n        Ket\n        Cond\n      1 Cond ref\n        X\n        Alt\n        Y\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    abcX\n 0: abcX\n 1: abc\n    Y\n 0: Y\n    ** Failers\nNo match\n    abcY   \nNo match\n    \n/^((?(+1)X|Y)(abc))+/BZ \n------------------------------------------------------------------\n        Bra\n        ^\n        CBra 1\n        Cond\n      2 Cond ref\n        X\n        Alt\n        Y\n        Ket\n        CBra 2\n        abc\n        Ket\n        KetRmax\n        Ket\n        End\n------------------------------------------------------------------\n    YabcXabc\n 0: YabcXabc\n 1: Xabc\n 2: abc\n    YabcXabcXabc\n 0: YabcXabcXabc\n 1: Xabc\n 2: abc\n    ** Failers\nNo match\n    XabcXabc  \nNo match\n\n/(?(-1)a)/BZ\nFailed: reference to non-existent subpattern at offset 6\n\n/((?(-1)a))/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        Cond\n      1 Cond ref\n        a\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/((?(-2)a))/BZ\nFailed: reference to non-existent subpattern at offset 7\n\n/^(?(+1)X|Y)(.)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Cond\n      1 Cond ref\n        X\n        Alt\n        Y\n        Ket\n        CBra 1\n        Any\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    Y!\n 0: Y!\n 1: !\n\n/(?<A>tom|bon)-\\k{A}/\n    tom-tom\n 0: tom-tom\n 1: tom\n    bon-bon \n 0: bon-bon\n 1: bon\n    ** Failers\nNo match\n    tom-bon  \nNo match\n\n/\\g{A/ \nFailed: syntax error in subpattern name (missing terminator) at offset 4\n\n/(?|(abc)|(xyz))/BZ\n------------------------------------------------------------------\n        Bra\n        Bra\n        CBra 1\n        abc\n        Ket\n        Alt\n        CBra 1\n        xyz\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n   >abc<\n 0: abc\n 1: abc\n   >xyz< \n 0: xyz\n 1: xyz\n\n/(x)(?|(abc)|(xyz))(x)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        x\n        Ket\n        Bra\n        CBra 2\n        abc\n        Ket\n        Alt\n        CBra 2\n        xyz\n        Ket\n        Ket\n        CBra 3\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    xabcx\n 0: xabcx\n 1: x\n 2: abc\n 3: x\n    xxyzx \n 0: xxyzx\n 1: x\n 2: xyz\n 3: x\n\n/(x)(?|(abc)(pqr)|(xyz))(x)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        x\n        Ket\n        Bra\n        CBra 2\n        abc\n        Ket\n        CBra 3\n        pqr\n        Ket\n        Alt\n        CBra 2\n        xyz\n        Ket\n        Ket\n        CBra 4\n        x\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    xabcpqrx\n 0: xabcpqrx\n 1: x\n 2: abc\n 3: pqr\n 4: x\n    xxyzx \n 0: xxyzx\n 1: x\n 2: xyz\n 3: <unset>\n 4: x\n\n/\\H++X/BZ\n------------------------------------------------------------------\n        Bra\n        \\H++\n        X\n        Ket\n        End\n------------------------------------------------------------------\n    ** Failers\nNo match\n    XXXX\nNo match\n    \n/\\H+\\hY/BZ\n------------------------------------------------------------------\n        Bra\n        \\H++\n        \\h\n        Y\n        Ket\n        End\n------------------------------------------------------------------\n    XXXX Y \n 0: XXXX Y\n\n/\\H+ Y/BZ\n------------------------------------------------------------------\n        Bra\n        \\H++\n         Y\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\h+A/BZ\n------------------------------------------------------------------\n        Bra\n        \\h++\n        A\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\v*B/BZ\n------------------------------------------------------------------\n        Bra\n        \\v*+\n        B\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\V+\\x0a/BZ\n------------------------------------------------------------------\n        Bra\n        \\V++\n        \\x0a\n        Ket\n        End\n------------------------------------------------------------------\n\n/A+\\h/BZ\n------------------------------------------------------------------\n        Bra\n        A++\n        \\h\n        Ket\n        End\n------------------------------------------------------------------\n\n/ *\\H/BZ\n------------------------------------------------------------------\n        Bra\n         *+\n        \\H\n        Ket\n        End\n------------------------------------------------------------------\n\n/A*\\v/BZ\n------------------------------------------------------------------\n        Bra\n        A*+\n        \\v\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x0b*\\V/BZ\n------------------------------------------------------------------\n        Bra\n        \\x0b*+\n        \\V\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d+\\h/BZ\n------------------------------------------------------------------\n        Bra\n        \\d++\n        \\h\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\v/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        \\v\n        Ket\n        End\n------------------------------------------------------------------\n\n/S+\\h\\S+\\v/BZ\n------------------------------------------------------------------\n        Bra\n        S++\n        \\h\n        \\S++\n        \\v\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w{3,}\\h\\w+\\v/BZ\n------------------------------------------------------------------\n        Bra\n        \\w{3}\n        \\w*+\n        \\h\n        \\w++\n        \\v\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\h+\\d\\h+\\w\\h+\\S\\h+\\H/BZ\n------------------------------------------------------------------\n        Bra\n        \\h++\n        \\d\n        \\h++\n        \\w\n        \\h++\n        \\S\n        \\h++\n        \\H\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\v+\\d\\v+\\w\\v+\\S\\v+\\V/BZ\n------------------------------------------------------------------\n        Bra\n        \\v++\n        \\d\n        \\v++\n        \\w\n        \\v++\n        \\S\n        \\v++\n        \\V\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\H+\\h\\H+\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\H++\n        \\h\n        \\H+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\V+\\v\\V+\\w/BZ\n------------------------------------------------------------------\n        Bra\n        \\V++\n        \\v\n        \\V+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\( (?: [^()]* | (?R) )* \\)/x\n\\J1024(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\n 0: (0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(0(00)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)\n\n/[\\E]AAA/\nFailed: missing terminating ] for character class at offset 7\n\n/[\\Q\\E]AAA/\nFailed: missing terminating ] for character class at offset 9\n\n/[^\\E]AAA/\nFailed: missing terminating ] for character class at offset 8\n\n/[^\\Q\\E]AAA/\nFailed: missing terminating ] for character class at offset 10\n\n/[\\E^]AAA/\nFailed: missing terminating ] for character class at offset 8\n\n/[\\Q\\E^]AAA/\nFailed: missing terminating ] for character class at offset 10\n\n/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/BZ\n------------------------------------------------------------------\n        Bra\n        A\n        *PRUNE\n        B\n        *SKIP\n        C\n        *THEN\n        D\n        *COMMIT\n        E\n        *FAIL\n        F\n        *FAIL\n        G\n        *FAIL\n        H\n        *ACCEPT\n        I\n        Ket\n        End\n------------------------------------------------------------------\n\n/^a+(*FAIL)/C\n    aaaaaa\n--->aaaaaa\n +0 ^          ^\n +1 ^          a+\n +3 ^     ^    (*FAIL)\n +3 ^    ^     (*FAIL)\n +3 ^   ^      (*FAIL)\n +3 ^  ^       (*FAIL)\n +3 ^ ^        (*FAIL)\n +3 ^^         (*FAIL)\nNo match\n    \n/a+b?c+(*FAIL)/C\n    aaabccc\n--->aaabccc\n +0 ^           a+\n +2 ^  ^        b?\n +4 ^   ^       c+\n +6 ^      ^    (*FAIL)\n +6 ^     ^     (*FAIL)\n +6 ^    ^      (*FAIL)\n +0  ^          a+\n +2  ^ ^        b?\n +4  ^  ^       c+\n +6  ^     ^    (*FAIL)\n +6  ^    ^     (*FAIL)\n +6  ^   ^      (*FAIL)\n +0   ^         a+\n +2   ^^        b?\n +4   ^ ^       c+\n +6   ^    ^    (*FAIL)\n +6   ^   ^     (*FAIL)\n +6   ^  ^      (*FAIL)\nNo match\n\n/a+b?(*PRUNE)c+(*FAIL)/C\n    aaabccc\n--->aaabccc\n +0 ^           a+\n +2 ^  ^        b?\n +4 ^   ^       (*PRUNE)\n+12 ^   ^       c+\n+14 ^      ^    (*FAIL)\n+14 ^     ^     (*FAIL)\n+14 ^    ^      (*FAIL)\n +0  ^          a+\n +2  ^ ^        b?\n +4  ^  ^       (*PRUNE)\n+12  ^  ^       c+\n+14  ^     ^    (*FAIL)\n+14  ^    ^     (*FAIL)\n+14  ^   ^      (*FAIL)\n +0   ^         a+\n +2   ^^        b?\n +4   ^ ^       (*PRUNE)\n+12   ^ ^       c+\n+14   ^    ^    (*FAIL)\n+14   ^   ^     (*FAIL)\n+14   ^  ^      (*FAIL)\nNo match\n\n/a+b?(*COMMIT)c+(*FAIL)/C\n    aaabccc\n--->aaabccc\n +0 ^           a+\n +2 ^  ^        b?\n +4 ^   ^       (*COMMIT)\n+13 ^   ^       c+\n+15 ^      ^    (*FAIL)\n+15 ^     ^     (*FAIL)\n+15 ^    ^      (*FAIL)\nNo match\n    \n/a+b?(*SKIP)c+(*FAIL)/C\n    aaabcccaaabccc\n--->aaabcccaaabccc\n +0 ^                  a+\n +2 ^  ^               b?\n +4 ^   ^              (*SKIP)\n+11 ^   ^              c+\n+13 ^      ^           (*FAIL)\n+13 ^     ^            (*FAIL)\n+13 ^    ^             (*FAIL)\n +0        ^           a+\n +2        ^  ^        b?\n +4        ^   ^       (*SKIP)\n+11        ^   ^       c+\n+13        ^      ^    (*FAIL)\n+13        ^     ^     (*FAIL)\n+13        ^    ^      (*FAIL)\nNo match\n\n/a+b?(*THEN)c+(*FAIL)/C\n    aaabccc\n--->aaabccc\n +0 ^           a+\n +2 ^  ^        b?\n +4 ^   ^       (*THEN)\n+11 ^   ^       c+\n+13 ^      ^    (*FAIL)\n+13 ^     ^     (*FAIL)\n+13 ^    ^      (*FAIL)\n +0  ^          a+\n +2  ^ ^        b?\n +4  ^  ^       (*THEN)\n+11  ^  ^       c+\n+13  ^     ^    (*FAIL)\n+13  ^    ^     (*FAIL)\n+13  ^   ^      (*FAIL)\n +0   ^         a+\n +2   ^^        b?\n +4   ^ ^       (*THEN)\n+11   ^ ^       c+\n+13   ^    ^    (*FAIL)\n+13   ^   ^     (*FAIL)\n+13   ^  ^      (*FAIL)\nNo match\n    \n/a(*MARK)b/ \nFailed: (*MARK) must have an argument at offset 7\n\n/(?i:A{1,}\\6666666666)/\nFailed: number is too big at offset 19\n\n/\\g6666666666/\nFailed: number is too big at offset 11\n\n/[\\g6666666666]/BZ\n------------------------------------------------------------------\n        Bra\n        [6g]\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?1)\\c[/\nFailed: reference to non-existent subpattern at offset 3\n\n/.+A/<crlf>\n    \\r\\nA\nNo match\n    \n/\\nA/<crlf>\n    \\r\\nA \n 0: \\x0aA\n\n/[\\r\\n]A/<crlf>\n    \\r\\nA \n 0: \\x0aA\n\n/(\\r|\\n)A/<crlf>\n    \\r\\nA \n 0: \\x0aA\n 1: \\x0a\n\n/a(*CR)b/\nFailed: (*VERB) not recognized or malformed at offset 5\n\n/(*CR)a.b/\n    a\\nb\n 0: a\\x0ab\n    ** Failers\nNo match\n    a\\rb  \nNo match\n\n/(*CR)a.b/<lf>\n    a\\nb\n 0: a\\x0ab\n    ** Failers\nNo match\n    a\\rb  \nNo match\n\n/(*LF)a.b/<CRLF>\n    a\\rb\n 0: a\\x0db\n    ** Failers\nNo match\n    a\\nb  \nNo match\n\n/(*CRLF)a.b/\n    a\\rb\n 0: a\\x0db\n    a\\nb  \n 0: a\\x0ab\n    ** Failers\nNo match\n    a\\r\\nb  \nNo match\n\n/(*ANYCRLF)a.b/<CR>\n    ** Failers\nNo match\n    a\\rb\nNo match\n    a\\nb  \nNo match\n    a\\r\\nb  \nNo match\n\n/(*ANY)a.b/<cr>\n    ** Failers\nNo match\n    a\\rb\nNo match\n    a\\nb  \nNo match\n    a\\r\\nb  \nNo match\n    a\\x85b \nNo match\n    \n/(*ANY).*/g\n    abc\\r\\ndef\n 0: abc\n 0: \n 0: def\n 0: \n\n/(*ANYCRLF).*/g\n    abc\\r\\ndef\n 0: abc\n 0: \n 0: def\n 0: \n\n/(*CRLF).*/g\n    abc\\r\\ndef\n 0: abc\n 0: \n 0: def\n 0: \n\n/a\\Rb/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\Rb/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x85b\n 0: a\\x85b\n    a\\x0bb     \n 0: a\\x0bb\n    ** Failers \nNo match\n    a\\x85b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R?b/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\R?b/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x85b\n 0: a\\x85b\n    a\\x0bb     \n 0: a\\x0bb\n    ** Failers \nNo match\n    a\\x85b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R{2,4}b/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\r\\n\\nb\n 0: a\\x0d\\x0a\\x0ab\n    a\\n\\r\\rb\n 0: a\\x0a\\x0d\\x0db\n    a\\r\\n\\r\\n\\r\\n\\r\\nb\n 0: a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85\\85b\nNo match\n    a\\x0b\\0bb     \nNo match\n\n/a\\R{2,4}b/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\r\\rb\n 0: a\\x0d\\x0db\n    a\\n\\n\\nb\n 0: a\\x0a\\x0a\\x0ab\n    a\\r\\n\\n\\r\\rb\n 0: a\\x0d\\x0a\\x0a\\x0d\\x0db\n    a\\x85\\85b\nNo match\n    a\\x0b\\0bb     \nNo match\n    ** Failers \nNo match\n    a\\r\\r\\r\\r\\rb \nNo match\n    a\\x85\\85b\\<bsr_anycrlf>\nNo match\n    a\\x0b\\0bb\\<bsr_anycrlf>\nNo match\n \n/(*BSR_ANYCRLF)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\nb\n 0: a\\x0ab\n    a\\rb \n 0: a\\x0db\n\n/(*BSR_UNICODE)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\x85b\n 0: a\\x85b\n\n/(*BSR_ANYCRLF)(*CRLF)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nForced newline sequence: CRLF\nFirst char = 'a'\nNeed char = 'b'\n    a\\nb\n 0: a\\x0ab\n    a\\rb \n 0: a\\x0db\n\n/(*CRLF)(*BSR_UNICODE)a\\Rb/I\nCapturing subpattern count = 0\nOptions: bsr_unicode\nForced newline sequence: CRLF\nFirst char = 'a'\nNeed char = 'b'\n    a\\x85b\n 0: a\\x85b\n\n/(*CRLF)(*BSR_ANYCRLF)(*CR)ab/I\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nForced newline sequence: CR\nFirst char = 'a'\nNeed char = 'b'\n\n/(?<a>)(?&)/\nFailed: subpattern name expected at offset 9\n\n/(?<abc>)(?&a)/\nFailed: reference to non-existent subpattern at offset 12\n\n/(?<a>)(?&aaaaaaaaaaaaaaaaaaaaaaa)/\nFailed: reference to non-existent subpattern at offset 32\n\n/(?+-a)/\nFailed: digit expected after (?+ at offset 3\n\n/(?-+a)/\nFailed: unrecognized character after (? or (?- at offset 3\n\n/(?(-1))/\nFailed: reference to non-existent subpattern at offset 6\n\n/(?(+10))/\nFailed: reference to non-existent subpattern at offset 7\n\n/(?(10))/\nFailed: reference to non-existent subpattern at offset 6\n\n/(?(+2))()()/\n\n/(?(2))()()/\n\n/\\k''/\nFailed: subpattern name expected at offset 3\n\n/\\k<>/\nFailed: subpattern name expected at offset 3\n\n/\\k{}/\nFailed: subpattern name expected at offset 3\n\n/\\k/\nFailed: \\k is not followed by a braced, angle-bracketed, or quoted name at offset 1\n\n/\\kabc/\nFailed: \\k is not followed by a braced, angle-bracketed, or quoted name at offset 1\n\n/(?P=)/\nFailed: subpattern name expected at offset 4\n\n/(?P>)/\nFailed: subpattern name expected at offset 4\n\n/(?!\\w)(?R)/\nFailed: recursive call could loop indefinitely at offset 9\n\n/(?=\\w)(?R)/\nFailed: recursive call could loop indefinitely at offset 9\n\n/(?<!\\w)(?R)/\nFailed: recursive call could loop indefinitely at offset 10\n\n/(?<=\\w)(?R)/\nFailed: recursive call could loop indefinitely at offset 10\n\n/[[:foo:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[:1234:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[:f\\oo:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[: :]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[:...:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[:l\\ower:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[[:abc\\:]]/\nFailed: unknown POSIX class name at offset 3\n\n/[abc[:x\\]pqr:]]/\nFailed: unknown POSIX class name at offset 6\n\n/[[:a\\dz:]]/\nFailed: unknown POSIX class name at offset 3\n\n/(^(a|b\\g<-1'c))/\nFailed: \\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 8\n\n/^(?+1)(?<a>x|y){0}z/\n    xzxx\n 0: xz\n    yzyy \n 0: yz\n    ** Failers\nNo match\n    xxz  \nNo match\n\n/(\\3)(\\1)(a)/\n    cat\nNo match\n\n/(\\3)(\\1)(a)/<JS>\n    cat\n 0: a\n 1: \n 2: \n 3: a\n    \n/TA]/\n    The ACTA] comes \n 0: TA]\n\n/TA]/<JS>\nFailed: ] is an invalid data character in JavaScript compatibility mode at offset 2\n\n/(?2)[]a()b](abc)/\nFailed: reference to non-existent subpattern at offset 3\n\n/(?2)[^]a()b](abc)/\nFailed: reference to non-existent subpattern at offset 3\n\n/(?1)[]a()b](abc)/\n    abcbabc\n 0: abcbabc\n 1: abc\n    ** Failers \nNo match\n    abcXabc\nNo match\n\n/(?1)[^]a()b](abc)/\n    abcXabc\n 0: abcXabc\n 1: abc\n    ** Failers \nNo match\n    abcbabc\nNo match\n\n/(?2)[]a()b](abc)(xyz)/\n    xyzbabcxyz\n 0: xyzbabcxyz\n 1: abc\n 2: xyz\n\n/(?&N)[]a(?<N>)](?<M>abc)/\nFailed: reference to non-existent subpattern at offset 4\n\n/(?&N)[]a(?<N>)](abc)/\nFailed: reference to non-existent subpattern at offset 4\n\n/a[]b/\nFailed: missing terminating ] for character class at offset 4\n\n/a[^]b/\nFailed: missing terminating ] for character class at offset 5\n\n/a[]b/<JS>\n    ** Failers\nNo match\n    ab\nNo match\n\n/a[]+b/<JS>\n    ** Failers\nNo match\n    ab \nNo match\n\n/a[]*+b/<JS>\n    ** Failers\nNo match\n    ab \nNo match\n\n/a[^]b/<JS>\n    aXb\n 0: aXb\n    a\\nb \n 0: a\\x0ab\n    ** Failers\nNo match\n    ab  \nNo match\n    \n/a[^]+b/<JS> \n    aXb\n 0: aXb\n    a\\nX\\nXb \n 0: a\\x0aX\\x0aXb\n    ** Failers\nNo match\n    ab  \nNo match\n\n/a(?!)b/BZ\n------------------------------------------------------------------\n        Bra\n        a\n        *FAIL\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?!)?a/BZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        Assert not\n        Ket\n        a\n        Ket\n        End\n------------------------------------------------------------------\n    ab\n 0: a\n\n/a(*FAIL)+b/\nFailed: nothing to repeat at offset 8\n\n/(abc|pqr|123){0}[xyz]/SI\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: x y z \n\n/(?(?=.*b)b|^)/CI\nCapturing subpattern count = 0\nMay match empty string\nOptions:\nNo first char\nNo need char\n   adc\n--->adc\n +0 ^       (?(?=.*b)b|^)\n +2 ^       (?=.*b)\n +5 ^       .*\n +7 ^  ^    b\n +7 ^ ^     b\n +7 ^^      b\n +7 ^       b\n+11 ^       ^\n+12 ^       )\n+13 ^       \n 0: \n   abc \n--->abc\n +0 ^       (?(?=.*b)b|^)\n +2 ^       (?=.*b)\n +5 ^       .*\n +7 ^  ^    b\n +7 ^ ^     b\n +7 ^^      b\n +8 ^ ^     )\n +9 ^       b\n +0  ^      (?(?=.*b)b|^)\n +2  ^      (?=.*b)\n +5  ^      .*\n +7  ^ ^    b\n +7  ^^     b\n +7  ^      b\n +8  ^^     )\n +9  ^      b\n+10  ^^     |\n+13  ^^     \n 0: b\n   \n/(?(?=b).*b|^d)/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/(?(?=.*b).*b|^d)/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/xyz/C\n  xyz \n--->xyz\n +0 ^       x\n +1 ^^      y\n +2 ^ ^     z\n +3 ^  ^    \n 0: xyz\n  abcxyz \n--->abcxyz\n +0    ^       x\n +1    ^^      y\n +2    ^ ^     z\n +3    ^  ^    \n 0: xyz\n  abcxyz\\Y\n--->abcxyz\n +0 ^          x\n +0  ^         x\n +0   ^        x\n +0    ^       x\n +1    ^^      y\n +2    ^ ^     z\n +3    ^  ^    \n 0: xyz\n  ** Failers \nNo match\n  abc\nNo match\n  abc\\Y\n--->abc\n +0 ^       x\n +0  ^      x\n +0   ^     x\n +0    ^    x\nNo match\n  abcxypqr  \nNo match\n  abcxypqr\\Y  \n--->abcxypqr\n +0 ^            x\n +0  ^           x\n +0   ^          x\n +0    ^         x\n +1    ^^        y\n +2    ^ ^       z\n +0     ^        x\n +0      ^       x\n +0       ^      x\n +0        ^     x\n +0         ^    x\nNo match\n  \n/(*NO_START_OPT)xyz/C\n  abcxyz\n--->abcxyz\n+15 ^          x\n+15  ^         x\n+15   ^        x\n+15    ^       x\n+16    ^^      y\n+17    ^ ^     z\n+18    ^  ^    \n 0: xyz\n  \n/(*NO_AUTO_POSSESS)a+b/BZ  \n------------------------------------------------------------------\n        Bra\n        a+\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/xyz/CY\n  abcxyz \n--->abcxyz\n +0 ^          x\n +0  ^         x\n +0   ^        x\n +0    ^       x\n +1    ^^      y\n +2    ^ ^     z\n +3    ^  ^    \n 0: xyz\n\n/^\"((?(?=[a])[^\"])|b)*\"$/C\n    \"ab\"\n--->\"ab\"\n +0 ^        ^\n +1 ^        \"\n +2 ^^       ((?(?=[a])[^\"])|b)*\n +3 ^^       (?(?=[a])[^\"])\n +5 ^^       (?=[a])\n +8 ^^       [a]\n+11 ^ ^      )\n+12 ^^       [^\"]\n+16 ^ ^      )\n+17 ^ ^      |\n +3 ^ ^      (?(?=[a])[^\"])\n +5 ^ ^      (?=[a])\n +8 ^ ^      [a]\n+17 ^ ^      |\n+21 ^ ^      \"\n+18 ^ ^      b\n+19 ^  ^     )\n +3 ^  ^     (?(?=[a])[^\"])\n +5 ^  ^     (?=[a])\n +8 ^  ^     [a]\n+17 ^  ^     |\n+21 ^  ^     \"\n+22 ^   ^    $\n+23 ^   ^    \n 0: \"ab\"\n 1: \n\n/^\"((?(?=[a])[^\"])|b)*\"$/\n    \"ab\"\n 0: \"ab\"\n 1: \n\n/^X(?5)(a)(?|(b)|(q))(c)(d)Y/\nFailed: reference to non-existent subpattern at offset 5\n\n/^X(?&N)(a)(?|(b)|(q))(c)(d)(?<N>Y)/\n    XYabcdY\n 0: XYabcdY\n 1: a\n 2: b\n 3: c\n 4: d\n 5: Y\n \n/Xa{2,4}b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/Xa{2,4}?b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/Xa{2,4}+b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\d{2,4}b/\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n    \n/X\\d{2,4}?b/\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n    \n/X\\d{2,4}+b/\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n    \n/X\\D{2,4}b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\D{2,4}?b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\D{2,4}+b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[abc]{2,4}b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[abc]{2,4}?b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[abc]{2,4}+b/\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[^a]{2,4}b/\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n    \n/X[^a]{2,4}?b/\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n    \n/X[^a]{2,4}+b/\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n    \n/(Y)X\\1{2,4}b/\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n    \n/(Y)X\\1{2,4}?b/\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n    \n/(Y)X\\1{2,4}+b/\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n    \n/\\++\\KZ|\\d+X|9+Y/\n    ++++123999\\P\nPartial match: 123999\n    ++++123999Y\\P\n 0: 999Y\n    ++++Z1234\\P \n 0: Z\n\n/Z(*F)/\n    Z\\P\nNo match\n    ZA\\P \nNo match\n    \n/Z(?!)/\n    Z\\P \nNo match\n    ZA\\P \nNo match\n\n/dog(sbody)?/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n    \n/dog(sbody)??/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \n 0: dog\n\n/dog|dogsbody/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \n 0: dog\n \n/dogsbody|dog/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n\n/\\bthe cat\\b/\n    the cat\\P\n 0: the cat\n    the cat\\P\\P\nPartial match: the cat\n\n/abc/\n   abc\\P\n 0: abc\n   abc\\P\\P\n 0: abc\n   \n/abc\\K123/\n    xyzabc123pqr\n 0: 123\n    xyzabc12\\P\nPartial match: abc12\n    xyzabc12\\P\\P\nPartial match: abc12\n    \n/(?<=abc)123/\n    xyzabc123pqr \n 0: 123\n    xyzabc12\\P\nPartial match at offset 6: abc12\n    xyzabc12\\P\\P\nPartial match at offset 6: abc12\n\n/\\babc\\b/\n    +++abc+++\n 0: abc\n    +++ab\\P\nPartial match at offset 3: +ab\n    +++ab\\P\\P  \nPartial match at offset 3: +ab\n\n/(?&word)(?&element)(?(DEFINE)(?<element><[^m][^>]>[^<])(?<word>\\w*+))/BZ\n------------------------------------------------------------------\n        Bra\n        Recurse\n        Recurse\n        Cond\n        Cond def\n        CBra 1\n        <\n        [^m]\n        [^>]\n        >\n        [^<]\n        Ket\n        CBra 2\n        \\w*+\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?&word)(?&element)(?(DEFINE)(?<element><[^\\d][^>]>[^<])(?<word>\\w*+))/BZ\n------------------------------------------------------------------\n        Bra\n        Recurse\n        Recurse\n        Cond\n        Cond def\n        CBra 1\n        <\n        [\\x00-/:-\\xff] (neg)\n        [^>]\n        >\n        [^<]\n        Ket\n        CBra 2\n        \\w*+\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(ab)(x(y)z(cd(*ACCEPT)))pq/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        ab\n        Ket\n        CBra 2\n        x\n        CBra 3\n        y\n        Ket\n        z\n        CBra 4\n        cd\n        Close 4\n        Close 2\n        *ACCEPT\n        Ket\n        Ket\n        pq\n        Ket\n        End\n------------------------------------------------------------------\n\n/abc\\K/+\n    abcdef\n 0: \n 0+ def\n    abcdef\\N\\N\n 0: \n 0+ def\n    xyzabcdef\\N\\N\n 0: \n 0+ def\n    ** Failers\nNo match\n    abcdef\\N \nNo match\n    xyzabcdef\\N\nNo match\n    \n/^(?:(?=abc)|abc\\K)/+\n    abcdef\n 0: \n 0+ abcdef\n    abcdef\\N\\N \n 0: \n 0+ def\n    ** Failers \nNo match\n    abcdef\\N \nNo match\n\n/a?b?/+\n    xyz\n 0: \n 0+ xyz\n    xyzabc\n 0: \n 0+ xyzabc\n    xyzabc\\N\n 0: ab\n 0+ c\n    xyzabc\\N\\N\n 0: \n 0+ yzabc\n    xyz\\N\\N    \n 0: \n 0+ yz\n    ** Failers \n 0: \n 0+ ** Failers\n    xyz\\N \nNo match\n\n/^a?b?/+\n    xyz\n 0: \n 0+ xyz\n    xyzabc\n 0: \n 0+ xyzabc\n    ** Failers \n 0: \n 0+ ** Failers\n    xyzabc\\N\nNo match\n    xyzabc\\N\\N\nNo match\n    xyz\\N\\N    \nNo match\n    xyz\\N \nNo match\n    \n/^(?<name>a|b\\g<name>c)/\n    aaaa\n 0: a\n 1: a\n    bacxxx\n 0: bac\n 1: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n\n/^(?<name>a|b\\g'name'c)/\n    aaaa\n 0: a\n 1: a\n    bacxxx\n 0: bac\n 1: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n\n/^(a|b\\g<1>c)/\n    aaaa\n 0: a\n 1: a\n    bacxxx\n 0: bac\n 1: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n\n/^(a|b\\g'1'c)/\n    aaaa\n 0: a\n 1: a\n    bacxxx\n 0: bac\n 1: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n\n/^(a|b\\g'-1'c)/\n    aaaa\n 0: a\n 1: a\n    bacxxx\n 0: bac\n 1: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n\n/(^(a|b\\g<-1>c))/\n    aaaa\n 0: a\n 1: a\n 2: a\n    bacxxx\n 0: bac\n 1: bac\n 2: bac\n    bbaccxxx \n 0: bbacc\n 1: bbacc\n 2: bbacc\n    bbbacccxx\n 0: bbbaccc\n 1: bbbaccc\n 2: bbbaccc\n\n/(?-i:\\g<name>)(?i:(?<name>a))/\n    XaaX\n 0: aa\n 1: a\n    XAAX \n 0: AA\n 1: A\n\n/(?i:\\g<name>)(?-i:(?<name>a))/\n    XaaX\n 0: aa\n 1: a\n    ** Failers \nNo match\n    XAAX \nNo match\n\n/(?-i:\\g<+1>)(?i:(a))/\n    XaaX\n 0: aa\n 1: a\n    XAAX \n 0: AA\n 1: A\n\n/(?=(?<regex>(?#simplesyntax)\\$(?<name>[a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*)(?:\\[(?<index>[a-zA-Z0-9_\\x{7f}-\\x{ff}]+|\\$\\g<name>)\\]|->\\g<name>(\\(.*?\\))?)?|(?#simple syntax withbraces)\\$\\{(?:\\g<name>(?<indices>\\[(?:\\g<index>|'(?:\\\\.|[^'\\\\])*'|\"(?:\\g<regex>|\\\\.|[^\"\\\\])*\")\\])?|\\g<complex>|\\$\\{\\g<complex>\\})\\}|(?#complexsyntax)\\{(?<complex>\\$(?<segment>\\g<name>(\\g<indices>*|\\(.*?\\))?)(?:->\\g<segment>)*|\\$\\g<complex>|\\$\\{\\g<complex>\\})\\}))\\{/\n\n/(?<n>a|b|c)\\g<n>*/\n   abc\n 0: abc\n 1: a\n   accccbbb \n 0: accccbbb\n 1: a\n\n/^X(?7)(a)(?|(b)|(q)(r)(s))(c)(d)(Y)/\n    XYabcdY\n 0: XYabcdY\n 1: a\n 2: b\n 3: <unset>\n 4: <unset>\n 5: c\n 6: d\n 7: Y\n\n/(?<=b(?1)|zzz)(a)/\n    xbaax\n 0: a\n 1: a\n    xzzzax \n 0: a\n 1: a\n\n/(a)(?<=b\\1)/\nFailed: lookbehind assertion is not fixed length at offset 10\n\n/(a)(?<=b+(?1))/\nFailed: lookbehind assertion is not fixed length at offset 13\n\n/(a+)(?<=b(?1))/\nFailed: lookbehind assertion is not fixed length at offset 14\n\n/(a(?<=b(?1)))/\nFailed: lookbehind assertion is not fixed length at offset 13\n\n/(?<=b(?1))xyz/\nFailed: reference to non-existent subpattern at offset 8\n\n/(?<=b(?1))xyz(b+)pqrstuvew/\nFailed: lookbehind assertion is not fixed length at offset 26\n\n/(a|bc)\\1/SI\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/(a|bc)\\1{2,3}/SI\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: a b \n\n/(a|bc)(?1)/SI\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/(a|b\\1)(a|b\\1)/SI\nCapturing subpattern count = 2\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/(a|b\\1){2}/SI\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/(a|bbbb\\1)(a|bbbb\\1)/SI\nCapturing subpattern count = 2\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/(a|bbbb\\1){2}/SI\nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 2\nStarting chars: a b \n\n/^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]/SI\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNeed char = ':'\nSubject length lower bound = 22\nNo starting char list\n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/isIS\nCapturing subpattern count = 11\nOptions: caseless dotall\nFirst char = '<'\nNeed char = '>'\nSubject length lower bound = 47\nNo starting char list\n\n\"(?>.*/)foo\"SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'o'\nSubject length lower bound = 4\nNo starting char list\n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /xSI\nCapturing subpattern count = 0\nOptions: extended\nNo first char\nNeed char = '-'\nSubject length lower bound = 8\nNo starting char list\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/iSI\nCapturing subpattern count = 1\nOptions: caseless\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: A B C a b c \n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'b'\nSubject length lower bound = 41\nStarting chars: c d \n\n/<a[\\s]+href[\\s]*=[\\s]*          # find <a href=\n ([\\\"\\'])?                       # find single or double quote\n (?(1) (.*?)\\1 | ([^\\s]+))       # if quote found, match up to next matching\n                                 # quote, otherwise match up to next space\n/isxSI\nCapturing subpattern count = 3\nMax back reference = 1\nOptions: caseless extended dotall\nFirst char = '<'\nNeed char = '='\nSubject length lower bound = 9\nNo starting char list\n\n/^(?!:)                       # colon disallowed at start\n  (?:                         # start of item\n    (?: [0-9a-f]{1,4} |       # 1-4 hex digits or\n    (?(1)0 | () ) )           # if null previously matched, fail; else null\n    :                         # followed by colon\n  ){1,7}                      # end item; 1-7 of them required               \n  [0-9a-f]{1,4} $             # final hex number at end of string\n  (?(1)|.)                    # check that there was an empty component\n  /xiIS\nCapturing subpattern count = 1\nMax back reference = 1\nOptions: anchored caseless extended\nNo first char\nNeed char = ':'\nSubject length lower bound = 2\nNo starting char list\n\n/(?|(?<a>A)|(?<a>B))/I\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  a   1\nNo options\nNo first char\nNo need char\n    AB\\Ca\n 0: A\n 1: A\n  C A (1) a\n    BA\\Ca\n 0: B\n 1: B\n  C B (1) a\n\n/(?|(?<a>A)|(?<b>B))/ \nFailed: different names for subpatterns of the same number are not allowed at offset 15\n\n/(?:a(?<quote> (?<apostrophe>')|(?<realquote>\")) |\n    b(?<quote> (?<apostrophe>')|(?<realquote>\")) ) \n    (?('quote')[a-z]+|[0-9]+)/JIx\nCapturing subpattern count = 6\nMax back reference = 1\nNamed capturing subpatterns:\n  apostrophe   2\n  apostrophe   5\n  quote        1\n  quote        4\n  realquote    3\n  realquote    6\nOptions: extended dupnames\nNo first char\nNo need char\n    a\"aaaaa\n 0: a\"aaaaa\n 1: \"\n 2: <unset>\n 3: \"\n    b\"aaaaa \n 0: b\"aaaaa\n 1: <unset>\n 2: <unset>\n 3: <unset>\n 4: \"\n 5: <unset>\n 6: \"\n    ** Failers \nNo match\n    b\"11111\nNo match\n    a\"11111 \nNo match\n    \n/^(?|(a)(b)(c)(?<D>d)|(?<D>e)) (?('D')X|Y)/JDZx\n------------------------------------------------------------------\n        Bra\n        ^\n        Bra\n        CBra 1\n        a\n        Ket\n        CBra 2\n        b\n        Ket\n        CBra 3\n        c\n        Ket\n        CBra 4\n        d\n        Ket\n        Alt\n        CBra 1\n        e\n        Ket\n        Ket\n        Cond\n        Cond ref <D>2\n        X\n        Alt\n        Y\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 4\nMax back reference = 4\nNamed capturing subpatterns:\n  D   4\n  D   1\nOptions: anchored extended dupnames\nNo first char\nNo need char\n    abcdX\n 0: abcdX\n 1: a\n 2: b\n 3: c\n 4: d\n    eX\n 0: eX\n 1: e\n    ** Failers\nNo match\n    abcdY\nNo match\n    ey     \nNo match\n    \n/(?<A>a) (b)(c)  (?<A>d  (?(R&A)$ | (?4)) )/JDZx\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        a\n        Ket\n        CBra 2\n        b\n        Ket\n        CBra 3\n        c\n        Ket\n        CBra 4\n        d\n        Cond\n        Cond recurse <A>2\n        $\n        Alt\n        Recurse\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 4\nMax back reference = 1\nNamed capturing subpatterns:\n  A   1\n  A   4\nOptions: extended dupnames\nFirst char = 'a'\nNeed char = 'd'\n    abcdd\n 0: abcdd\n 1: a\n 2: b\n 3: c\n 4: dd\n    ** Failers\nNo match\n    abcdde  \nNo match\n\n/abcd*/\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n\n/abcd*/i\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n    XXXXABCD\\P\n 0: ABCD\n    XXXXABCD\\P\\P\nPartial match: ABCD\n\n/abc\\d*/\n    xxxxabc1\\P\n 0: abc1\n    xxxxabc1\\P\\P\nPartial match: abc1\n\n/(a)bc\\1*/\n    xxxxabca\\P\n 0: abca\n 1: a\n    xxxxabca\\P\\P\nPartial match: abca\n\n/abc[de]*/\n    xxxxabcde\\P\n 0: abcde\n    xxxxabcde\\P\\P\nPartial match: abcde\n\n/-- This is not in the Perl-compatible test because Perl seems currently to be\n    broken and not behaving as specified in that it *does* bumpalong after\n    hitting (*COMMIT). --/\n\n/(?1)(A(*COMMIT)|B)D/\n    ABD\n 0: ABD\n 1: B\n    XABD\n 0: ABD\n 1: B\n    BAD\n 0: BAD\n 1: A\n    ABXABD  \n 0: ABD\n 1: B\n    ** Failers \nNo match\n    ABX \nNo match\n    BAXBAD  \nNo match\n\n/(\\3)(\\1)(a)/<JS>\n    cat\n 0: a\n 1: \n 2: \n 3: a\n\n/(\\3)(\\1)(a)/SI<JS>\nCapturing subpattern count = 3\nMax back reference = 3\nOptions:\nNo first char\nNeed char = 'a'\nSubject length lower bound = 1\nNo starting char list\n    cat\n 0: a\n 1: \n 2: \n 3: a\n\n/(\\3)(\\1)(a)/SI\nCapturing subpattern count = 3\nMax back reference = 3\nNo options\nNo first char\nNeed char = 'a'\nSubject length lower bound = 3\nNo starting char list\n    cat\nNo match\n\n/i(?(DEFINE)(?<s>a))/SI\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  s   1\nNo options\nFirst char = 'i'\nNo need char\nSubject length lower bound = 1\nNo starting char list\n    i\n 0: i\n    \n/()i(?(1)a)/SI \nCapturing subpattern count = 1\nMax back reference = 1\nNo options\nNo first char\nNeed char = 'i'\nSubject length lower bound = 1\nStarting chars: i \n    ia\n 0: ia\n 1: \n\n/(?i)a(?-i)b|c/BZ\n------------------------------------------------------------------\n        Bra\n     /i a\n        b\n        Alt\n        c\n        Ket\n        End\n------------------------------------------------------------------\n    XabX\n 0: ab\n    XAbX\n 0: Ab\n    CcC \n 0: c\n    ** Failers\nNo match\n    XABX   \nNo match\n\n/(?i)a(?s)b|c/BZ\n------------------------------------------------------------------\n        Bra\n     /i ab\n        Alt\n     /i c\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?i)a(?s-i)b|c/BZ\n------------------------------------------------------------------\n        Bra\n     /i a\n        b\n        Alt\n        c\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(ab(c\\1)d|x){2}$/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Once\n        CBra 1\n        ab\n        CBra 2\n        c\n        \\1\n        Ket\n        d\n        Alt\n        x\n        Ket\n        Ket\n        Once\n        CBra 1\n        ab\n        CBra 2\n        c\n        \\1\n        Ket\n        d\n        Alt\n        x\n        Ket\n        Ket\n        $\n        Ket\n        End\n------------------------------------------------------------------\n    xabcxd\n 0: xabcxd\n 1: abcxd\n 2: cx\n    \n/^(?&t)*+(?(DEFINE)(?<t>.))$/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Braposzero\n        SBraPos\n        Recurse\n        KetRpos\n        Cond\n        Cond def\n        CBra 1\n        Any\n        Ket\n        Ket\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?&t)*(?(DEFINE)(?<t>.))$/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Brazero\n        Once\n        Recurse\n        KetRmax\n        Cond\n        Cond def\n        CBra 1\n        Any\n        Ket\n        Ket\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/ -- This one is here because Perl gives the match as \"b\" rather than \"ab\". I\n     believe this to be a Perl bug. --/  \n      \n/(?>a\\Kb)z|(ab)/\n    ab \n 0: ab\n 1: ab\n\n/(?P<L1>(?P<L2>0|)|(?P>L2)(?P>L1))/\nFailed: recursive call could loop indefinitely at offset 31\n\n/abc(*MARK:)pqr/\nFailed: (*MARK) must have an argument at offset 10\n\n/abc(*:)pqr/\nFailed: (*MARK) must have an argument at offset 6\n\n/abc(*FAIL:123)xyz/\nFailed: an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) at offset 13\n\n/--- This should, and does, fail. In Perl, it does not, which I think is a \n     bug because replacing the B in the pattern by (B|D) does make it fail. ---/\n\n/A(*COMMIT)B/+K\n    ACABX\nNo match\n\n/--- These should be different, but in Perl they are not, which I think\n     is a bug in Perl. ---/\n\n/A(*THEN)B|A(*THEN)C/K\n    AC\n 0: AC\n\n/A(*PRUNE)B|A(*PRUNE)C/K\n    AC\nNo match\n    \n/--- Mark names can be duplicated. Perl doesn't give a mark for this one,\nthough PCRE does. ---/\n\n/^A(*:A)B|^X(*:A)Y/K\n    ** Failers\nNo match\n    XAQQ\nNo match, mark = A\n    \n/--- COMMIT at the start of a pattern should be the same as an anchor. Perl \noptimizations defeat this. So does the PCRE optimization unless we disable it \nwith \\Y. ---/\n\n/(*COMMIT)ABC/\n    ABCDEFG\n 0: ABC\n    ** Failers\nNo match\n    DEFGABC\\Y  \nNo match\n    \n/^(ab (c+(*THEN)cd) | xyz)/x\n    abcccd  \nNo match\n\n/^(ab (c+(*PRUNE)cd) | xyz)/x\n    abcccd  \nNo match\n\n/^(ab (c+(*FAIL)cd) | xyz)/x\n    abcccd  \nNo match\n    \n/--- Perl gets some of these wrong ---/ \n\n/(?>.(*ACCEPT))*?5/\n    abcde\n 0: a\n\n/(.(*ACCEPT))*?5/\n    abcde\n 0: a\n 1: a\n\n/(.(*ACCEPT))5/\n    abcde\n 0: a\n 1: a\n\n/(.(*ACCEPT))*5/\n    abcde\n 0: a\n 1: a\n\n/A\\NB./BZ\n------------------------------------------------------------------\n        Bra\n        A\n        Any\n        B\n        Any\n        Ket\n        End\n------------------------------------------------------------------\n    ACBD\n 0: ACBD\n    *** Failers\nNo match\n    A\\nB\nNo match\n    ACB\\n   \nNo match\n\n/A\\NB./sBZ\n------------------------------------------------------------------\n        Bra\n        A\n        Any\n        B\n        AllAny\n        Ket\n        End\n------------------------------------------------------------------\n    ACBD\n 0: ACBD\n    ACB\\n \n 0: ACB\\x0a\n    *** Failers\nNo match\n    A\\nB  \nNo match\n  \n/A\\NB/<crlf>\n    A\\nB\n 0: A\\x0aB\n    A\\rB\n 0: A\\x0dB\n    ** Failers\nNo match\n    A\\r\\nB    \nNo match\n\n/\\R+b/BZ\n------------------------------------------------------------------\n        Bra\n        \\R++\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\R+\\n/BZ\n------------------------------------------------------------------\n        Bra\n        \\R+\n        \\x0a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\R+\\d/BZ\n------------------------------------------------------------------\n        Bra\n        \\R++\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d*\\R/BZ\n------------------------------------------------------------------\n        Bra\n        \\d*+\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s*\\R/BZ\n------------------------------------------------------------------\n        Bra\n        \\s*\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    \\x20\\x0a\n 0:  \\x0a\n    \\x20\\x0d\n 0:  \\x0d\n    \\x20\\x0d\\x0a\n 0:  \\x0d\\x0a\n\n/\\S*\\R/BZ\n------------------------------------------------------------------\n        Bra\n        \\S*+\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    a\\x0a\n 0: a\\x0a\n\n/X\\h*\\R/BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\h*+\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x20\\x0a\n 0: X \\x0a\n\n/X\\H*\\R/BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\H*\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x0d\\x0a\n 0: X\\x0d\\x0a\n\n/X\\H+\\R/BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\H+\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x0d\\x0a\n 0: X\\x0d\\x0a\n\n/X\\H++\\R/BZ\n------------------------------------------------------------------\n        Bra\n        X\n        \\H++\n        \\R\n        Ket\n        End\n------------------------------------------------------------------\n    X\\x0d\\x0a\nNo match\n\n/(?<=abc)def/\n    abc\\P\\P\nPartial match at offset 3: abc\n\n/abc$/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc$/m\n    abc\n 0: abc\n    abc\\n\n 0: abc\n    abc\\P\\P\nPartial match: abc\n    abc\\n\\P\\P \n 0: abc\n    abc\\P\n 0: abc\n    abc\\n\\P\n 0: abc\n\n/abc\\z/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\Z/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\b/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\B/\n    abc\nNo match\n    abc\\P\nPartial match: abc\n    abc\\P\\P\nPartial match: abc\n\n/.+/\n    abc\\>0\n 0: abc\n    abc\\>1\n 0: bc\n    abc\\>2\n 0: c\n    abc\\>3\nNo match\n    abc\\>4\nError -24 (bad offset value)\n    abc\\>-4 \nError -24 (bad offset value)\n\n/^\\cģ/\nFailed: \\c must be followed by an ASCII character at offset 3\n\n/(?P<abn>(?P=abn)xxx)/BZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        \\1\n        xxx\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(a\\1z)/BZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        a\n        \\1\n        z\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?P<abn>(?P=abn)(?<badstufxxx)/BZ\nFailed: syntax error in subpattern name (missing terminator) at offset 29\n\n/(?P<abn>(?P=axn)xxx)/BZ\nFailed: reference to non-existent subpattern at offset 15\n\n/(?P<abn>(?P=axn)xxx)(?<axn>yy)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        \\2\n        xxx\n        Ket\n        CBra 2\n        yy\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- These tests are here because Perl gets the first one wrong. --/\n\n/(\\R*)(.)/s\n    \\r\\n\n 0: \\x0d\n 1: \n 2: \\x0d\n    \\r\\r\\n\\n\\r \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0d\\x0d\\x0a\\x0a\n 2: \\x0d\n    \\r\\r\\n\\n\\r\\n \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0d\\x0d\\x0a\\x0a\n 2: \\x0d\n\n/(\\R)*(.)/s\n    \\r\\n\n 0: \\x0d\n 1: <unset>\n 2: \\x0d\n    \\r\\r\\n\\n\\r \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0a\n 2: \\x0d\n    \\r\\r\\n\\n\\r\\n \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0a\n 2: \\x0d\n\n/((?>\\r\\n|\\n|\\x0b|\\f|\\r|\\x85)*)(.)/s\n    \\r\\n\n 0: \\x0d\n 1: \n 2: \\x0d\n    \\r\\r\\n\\n\\r \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0d\\x0d\\x0a\\x0a\n 2: \\x0d\n    \\r\\r\\n\\n\\r\\n \n 0: \\x0d\\x0d\\x0a\\x0a\\x0d\n 1: \\x0d\\x0d\\x0a\\x0a\n 2: \\x0d\n\n/-- --/\n\n/^abc$/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        abc\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/^abc$/BZm\n------------------------------------------------------------------\n        Bra\n     /m ^\n        abc\n     /m $\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(a)*+(\\w)/S\n    aaaaX\n 0: aaaaX\n 1: a\n 2: X\n    ** Failers \nNo match\n    aaaa\nNo match\n\n/^(?:a)*+(\\w)/S\n    aaaaX\n 0: aaaaX\n 1: X\n    ** Failers \nNo match\n    aaaa\nNo match\n\n/(a)++1234/SDZ\n------------------------------------------------------------------\n        Bra\n        CBraPos 1\n        a\n        KetRpos\n        1234\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = '4'\nSubject length lower bound = 5\nNo starting char list\n\n/([abc])++1234/SI\nCapturing subpattern count = 1\nNo options\nNo first char\nNeed char = '4'\nSubject length lower bound = 5\nStarting chars: a b c \n\n/(?<=(abc)+)X/\nFailed: lookbehind assertion is not fixed length at offset 10\n\n/(^ab)/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n\n/(^ab)++/I\nCapturing subpattern count = 1\nOptions: anchored\nNo first char\nNo need char\n\n/(^ab|^)+/I\nCapturing subpattern count = 1\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n\n/(^ab|^)++/I\nCapturing subpattern count = 1\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n\n/(?:^ab)/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/(?:^ab)++/I\nCapturing subpattern count = 0\nOptions: anchored\nNo first char\nNo need char\n\n/(?:^ab|^)+/I\nCapturing subpattern count = 0\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n\n/(?:^ab|^)++/I\nCapturing subpattern count = 0\nMay match empty string\nOptions: anchored\nNo first char\nNo need char\n\n/(.*ab)/I\nCapturing subpattern count = 1\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/(.*ab)++/I\nCapturing subpattern count = 1\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/(.*ab|.*)+/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(.*ab|.*)++/I\nCapturing subpattern count = 1\nMay match empty string\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(?:.*ab)/I\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/(?:.*ab)++/I\nCapturing subpattern count = 0\nNo options\nFirst char at start or follows newline\nNeed char = 'b'\n\n/(?:.*ab|.*)+/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(?:.*ab|.*)++/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nFirst char at start or follows newline\nNo need char\n\n/(?=a)[bcd]/I\nCapturing subpattern count = 0\nNo options\nFirst char = 'a'\nNo need char\n\n/((?=a))[bcd]/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/((?=a))+[bcd]/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/((?=a))++[bcd]/I\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNo need char\n\n/(?=a+)[bcd]/iI\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = 'a' (caseless)\nNo need char\n\n/(?=a+?)[bcd]/iI\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = 'a' (caseless)\nNo need char\n\n/(?=a++)[bcd]/iI\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = 'a' (caseless)\nNo need char\n\n/(?=a{3})[bcd]/iI\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = 'a' (caseless)\nNeed char = 'a' (caseless)\n\n/(abc)\\1+/S\n\n/-- Perl doesn't get these right IMO (the 3rd is PCRE-specific) --/\n\n/(?1)(?:(b(*ACCEPT))){0}/\n    b\n 0: b\n\n/(?1)(?:(b(*ACCEPT))){0}c/\n    bc\n 0: bc\n    ** Failers \nNo match\n    b \nNo match\n\n/(?1)(?:((*ACCEPT))){0}c/\n    c\n 0: c\n    c\\N \n 0: c\n\n/^.*?(?(?=a)a|b(*THEN)c)/\n    ba\nNo match\n\n/^.*?(?(?=a)a|bc)/\n    ba\n 0: ba\n\n/^.*?(?(?=a)a(*THEN)b|c)/\n    ac\nNo match\n\n/^.*?(?(?=a)a(*THEN)b)c/\n    ac\nNo match\n\n/^.*?(a(*THEN)b)c/\n    aabc\nNo match\n    \n/^.*? (?1) c (?(DEFINE)(a(*THEN)b))/x\n    aabc\n 0: aabc\n\n/^.*?(a(*THEN)b|z)c/\n    aabc\n 0: aabc\n 1: ab\n\n/^.*?(z|a(*THEN)b)c/\n    aabc\n 0: aabc\n 1: ab\n\n/-- --/\n\n/-- These studied versions are here because they are not Perl-compatible; the\n    studying means the mark is not seen. --/\n\n/(*MARK:A)(*SKIP:B)(C|X)/KS\n    C\n 0: C\n 1: C\nMK: A\n    D\nNo match, mark = A\n     \n/(*:A)A+(*SKIP:A)(B|Z)/KS\n    AAAC\nNo match, mark = A\n\n/-- --/\n\n\"(?=a*(*ACCEPT)b)c\"\n    c\n 0: c\n    c\\N \n 0: c\n    \n/(?1)c(?(DEFINE)((*ACCEPT)b))/\n    c\n 0: c\n    c\\N  \n 0: c\n    \n/(?>(*ACCEPT)b)c/\n    c\n 0: \n    c\\N  \nNo match\n\n/(?:(?>(a)))+a%/++\n    %aa%\n 0: aa%\n 0+ \n 1: a\n 1+ a%\n\n/(a)b|ac/++SS\n    ac\\O3\n 0: ac\n 0+ \n    \n/(a)(b)x|abc/++\n     abc\\O6\n 0: abc\n 0+ \n\n/(a)bc|(a)(b)\\2/\n    \\O3abc\nMatched, but too many substrings\n 0: abc\n    \\O4abc \nMatched, but too many substrings\n 0: abc\n\n/(?(DEFINE)(a(?2)|b)(b(?1)|a))(?:(?1)|(?2))/SI\nCapturing subpattern count = 2\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/(a(?2)|b)(b(?1)|a)(?:(?1)|(?2))/SI\nCapturing subpattern count = 2\nNo options\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: a b \n\n/(a(?2)|b)(b(?1)|a)(?1)(?2)/SI\nCapturing subpattern count = 2\nNo options\nNo first char\nNo need char\nSubject length lower bound = 4\nStarting chars: a b \n\n/(abc)(?1)/SI\nCapturing subpattern count = 1\nNo options\nFirst char = 'a'\nNeed char = 'c'\nSubject length lower bound = 6\nNo starting char list\n\n/^(?>a)++/\n    aa\\M\nMinimum match() limit = 5\nMinimum match() recursion limit = 2\n 0: aa\n    aaaaaaaaa\\M \nMinimum match() limit = 12\nMinimum match() recursion limit = 2\n 0: aaaaaaaaa\n    \n/(a)(?1)++/\n    aa\\M\nMinimum match() limit = 7\nMinimum match() recursion limit = 4\n 0: aa\n 1: a\n    aaaaaaaaa\\M  \nMinimum match() limit = 21\nMinimum match() recursion limit = 4\n 0: aaaaaaaaa\n 1: a\n\n/(?:(foo)|(bar)|(baz))X/SS=\n    bazfooX\n 0: fooX\n 1: foo\n 2: <unset>\n 3: <unset>\n    foobazbarX\n 0: barX\n 1: <unset>\n 2: bar\n 3: <unset>\n    barfooX\n 0: fooX\n 1: foo\n 2: <unset>\n 3: <unset>\n    bazX\n 0: bazX\n 1: <unset>\n 2: <unset>\n 3: baz\n    foobarbazX    \n 0: bazX\n 1: <unset>\n 2: <unset>\n 3: baz\n    bazfooX\\O0\nMatched, but too many substrings\n    bazfooX\\O2\nMatched, but too many substrings\n 0: fooX\n    bazfooX\\O4\nMatched, but too many substrings\n 0: fooX\n 1: <unset>\n    bazfooX\\O6\nMatched, but too many substrings\n 0: fooX\n 1: foo\n 2: <unset>\n    bazfooX\\O8\nMatched, but too many substrings\n 0: fooX\n 1: foo\n 2: <unset>\n 3: <unset>\n    bazfooX\\O10\n 0: fooX\n 1: foo\n 2: <unset>\n 3: <unset>\n\n/(?=abc){3}abc/BZ\n------------------------------------------------------------------\n        Bra\n        Assert\n        abc\n        Ket\n        abc\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=abc)+abc/BZ\n------------------------------------------------------------------\n        Bra\n        Assert\n        abc\n        Ket\n        abc\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=abc)++abc/BZ\n------------------------------------------------------------------\n        Bra\n        Assert\n        abc\n        Ket\n        abc\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=abc){0}xyz/BZ\n------------------------------------------------------------------\n        Bra\n        Skip zero\n        Assert\n        abc\n        Ket\n        xyz\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=(a))?./BZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        Assert\n        CBra 1\n        a\n        Ket\n        Ket\n        Any\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=(a))??./BZ\n------------------------------------------------------------------\n        Bra\n        Braminzero\n        Assert\n        CBra 1\n        a\n        Ket\n        Ket\n        Any\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?=(a)){0}b(?1)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Skip zero\n        Assert\n        CBra 1\n        a\n        Ket\n        Ket\n        b\n        Recurse\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?(DEFINE)(a))?b(?1)/BZ\n------------------------------------------------------------------\n        Bra\n        Cond\n        Cond def\n        CBra 1\n        a\n        Ket\n        Ket\n        b\n        Recurse\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?=(?1))?[az]([abc])d/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Brazero\n        Assert\n        Recurse\n        Ket\n        [az]\n        CBra 1\n        [a-c]\n        Ket\n        d\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?!a){0}\\w+/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Skip zero\n        Assert not\n        a\n        Ket\n        \\w++\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?<=(abc))?xyz/BZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        AssertB\n        Reverse\n        CBra 1\n        abc\n        Ket\n        Ket\n        xyz\n        Ket\n        End\n------------------------------------------------------------------\n\n/[:a[:abc]b:]/BZ\n------------------------------------------------------------------\n        Bra\n        [:[a-c]\n        b:]\n        Ket\n        End\n------------------------------------------------------------------\n\n/((?2))((?1))/SS\n    abc\nError -26 (nested recursion at the same subject position)\n\n/((?(R2)a+|(?1)b))/SS\n    aaaabcde\nError -26 (nested recursion at the same subject position)\n\n/(?(R)a*(?1)|((?R))b)/SS\n    aaaabcde\nError -26 (nested recursion at the same subject position)\n\n/(a+|(?R)b)/\nFailed: recursive call could loop indefinitely at offset 7\n\n/^(a(*:A)(d|e(*:B))z|aeq)/C\n    adz\n--->adz\n +0 ^       ^\n +1 ^       (a(*:A)(d|e(*:B))z|aeq)\n +2 ^       a\n +3 ^^      (*:A)\n +8 ^^      (d|e(*:B))\nLatest Mark: A\n +9 ^^      d\n+10 ^ ^     |\n+18 ^ ^     z\n+19 ^  ^    |\n+24 ^  ^    \n 0: adz\n 1: adz\n 2: d\n    aez\n--->aez\n +0 ^       ^\n +1 ^       (a(*:A)(d|e(*:B))z|aeq)\n +2 ^       a\n +3 ^^      (*:A)\n +8 ^^      (d|e(*:B))\nLatest Mark: A\n +9 ^^      d\n+11 ^^      e\n+12 ^ ^     (*:B)\n+17 ^ ^     )\nLatest Mark: B\n+18 ^ ^     z\n+19 ^  ^    |\n+24 ^  ^    \n 0: aez\n 1: aez\n 2: e\n    aeqwerty\n--->aeqwerty\n +0 ^            ^\n +1 ^            (a(*:A)(d|e(*:B))z|aeq)\n +2 ^            a\n +3 ^^           (*:A)\n +8 ^^           (d|e(*:B))\nLatest Mark: A\n +9 ^^           d\n+11 ^^           e\n+12 ^ ^          (*:B)\n+17 ^ ^          )\nLatest Mark: B\n+18 ^ ^          z\n+20 ^            a\n+21 ^^           e\n+22 ^ ^          q\n+23 ^  ^         )\n+24 ^  ^         \n 0: aeq\n 1: aeq\n\n/.(*F)/\n    \\P\\Pabc\nNo match\n\n/\\btype\\b\\W*?\\btext\\b\\W*?\\bjavascript\\b/IS\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nFirst char = 't'\nNeed char = 't'\nSubject length lower bound = 18\nNo starting char list\n\n/\\btype\\b\\W*?\\btext\\b\\W*?\\bjavascript\\b|\\burl\\b\\W*?\\bshell:|<input\\b.*?\\btype\\b\\W*?\\bimage\\b|\\bonkeyup\\b\\W*?\\=/IS\nCapturing subpattern count = 0\nMax lookbehind = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 8\nStarting chars: < o t u \n\n/a(*SKIP)c|b(*ACCEPT)|/+S!I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nSubject length lower bound = -1\nNo starting char list\n    a\n 0: \n 0+ \n\n/a(*SKIP)c|b(*ACCEPT)cd(*ACCEPT)|x/SI\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = -1\nStarting chars: a b x \n    ax\n 0: x\n\n'a*(*ACCEPT)b'+\n    \\N\\N\nNo match\n    abc\\N\\N\n 0: a\n 0+ bc\n    bbb\\N\\N \n 0: \n 0+ bb\n\n/(*ACCEPT)a/+I\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n    bax\n 0: \n 0+ bax\n\n/z(*ACCEPT)a/+I\nCapturing subpattern count = 0\nNo options\nFirst char = 'z'\nNo need char\n    baxzbx\n 0: z\n 0+ bx\n\n/a(?:.)*?a/ims                                                                  \n    \\Mabbbbbbbbbbbbbbbbbbbbba\nMinimum match() limit = 65\nMinimum match() recursion limit = 2\n 0: abbbbbbbbbbbbbbbbbbbbba\n    \n/a(?:.(*THEN))*?a/ims\n    \\Mabbbbbbbbbbbbbbbbbbbbba\nMinimum match() limit = 86\nMinimum match() recursion limit = 45\n 0: abbbbbbbbbbbbbbbbbbbbba\n\n/a(?:.(*THEN:ABC))*?a/ims\n    \\Mabbbbbbbbbbbbbbbbbbbbba\nMinimum match() limit = 86\nMinimum match() recursion limit = 45\n 0: abbbbbbbbbbbbbbbbbbbbba\n\n/^(?>a+)(?>(z+))\\w/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        Once_NC\n        a++\n        Ket\n        Once\n        CBra 1\n        z++\n        Ket\n        Ket\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\n    aaaazzzzb\n 0: aaaazzzzb\n 1: zzzz\n    ** Failers\nNo match\n    aazz  \nNo match\n\n/(.)(\\1|a(?2))/\n    bab\n 0: bab\n 1: b\n 2: ab\n    \n/\\1|(.)(?R)\\1/\n    cbbbc\n 0: cbbbc\n 1: c\n    \n/(.)((?(1)c|a)|a(?2))/\n    baa  \nNo match\n\n/(?P<abn>(?P=abn)xxx)/BZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        \\1\n        xxx\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(a\\1z)/BZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        a\n        \\1\n        z\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^(?>a+)(?>b+)(?>c+)(?>d+)(?>e+)/\n     \\Maabbccddee\nMinimum match() limit = 7\nMinimum match() recursion limit = 2\n 0: aabbccddee\n\n/^(?>(a+))(?>(b+))(?>(c+))(?>(d+))(?>(e+))/\n     \\Maabbccddee\nMinimum match() limit = 17\nMinimum match() recursion limit = 16\n 0: aabbccddee\n 1: aa\n 2: bb\n 3: cc\n 4: dd\n 5: ee\n\n/^(?>(a+))(?>b+)(?>(c+))(?>d+)(?>(e+))/\n     \\Maabbccddee\nMinimum match() limit = 13\nMinimum match() recursion limit = 10\n 0: aabbccddee\n 1: aa\n 2: cc\n 3: ee\n\n/^a\\x41z/<JS>\n    aAz\n 0: aAz\n    *** Failers\nNo match\n    ax41z\nNo match\n\n/^a[m\\x41]z/<JS>\n    aAz\n 0: aAz\n\n/^a\\x1z/<JS>\n    ax1z\n 0: ax1z\n\n/^a\\u0041z/<JS>\n    aAz\n 0: aAz\n    *** Failers\nNo match\n    au0041z\nNo match\n\n/^a[m\\u0041]z/<JS>\n    aAz\n 0: aAz\n\n/^a\\u041z/<JS>\n    au041z\n 0: au041z\n    *** Failers\nNo match\n    aAz\nNo match\n\n/^a\\U0041z/<JS>\n    aU0041z\n 0: aU0041z\n    *** Failers\nNo match\n    aAz\nNo match\n\n/(?(?=c)c|d)++Y/BZ\n------------------------------------------------------------------\n        Bra\n        BraPos\n        Cond\n        Assert\n        c\n        Ket\n        c\n        Alt\n        d\n        Ket\n        KetRpos\n        Y\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?(?=c)c|d)*+Y/BZ\n------------------------------------------------------------------\n        Bra\n        Braposzero\n        BraPos\n        Cond\n        Assert\n        c\n        Ket\n        c\n        Alt\n        d\n        Ket\n        KetRpos\n        Y\n        Ket\n        End\n------------------------------------------------------------------\n\n/a[\\NB]c/\nFailed: \\N is not supported in a class at offset 3\n\n/a[B-\\Nc]/ \nFailed: invalid range in character class at offset 5\n\n/a[B\\Nc]/ \nFailed: \\N is not supported in a class at offset 4\n\n/(a)(?2){0,1999}?(b)/\n\n/(a)(?(DEFINE)(b))(?2){0,1999}?(?2)/\n\n/--- This test, with something more complicated than individual letters, causes\ndifferent behaviour in Perl. Perhaps it disables some optimization; no tag is\npassed back for the failures, whereas in PCRE there is a tag. ---/\n    \n/(A|P)(*:A)(B|P) | (X|P)(X|P)(*:B)(Y|P)/xK\n    AABC\n 0: AB\n 1: A\n 2: B\nMK: A\n    XXYZ \n 0: XXY\n 1: <unset>\n 2: <unset>\n 3: X\n 4: X\n 5: Y\nMK: B\n    ** Failers\nNo match\n    XAQQ  \nNo match, mark = A\n    XAQQXZZ  \nNo match, mark = A\n    AXQQQ \nNo match, mark = A\n    AXXQQQ \nNo match, mark = B\n\n/-- Perl doesn't give marks for these, though it does if the alternatives are\nreplaced by single letters. --/\n    \n/(b|q)(*:m)f|a(*:n)w/K\n    aw \n 0: aw\nMK: n\n    ** Failers \nNo match, mark = n\n    abc\nNo match, mark = m\n\n/(q|b)(*:m)f|a(*:n)w/K\n    aw \n 0: aw\nMK: n\n    ** Failers \nNo match, mark = n\n    abc\nNo match, mark = m\n\n/-- After a partial match, the behaviour is as for a failure. --/\n\n/^a(*:X)bcde/K\n   abc\\P\nPartial match, mark=X: abc\n   \n/-- These are here because Perl doesn't return a mark, except for the first --/\n\n/(?=(*:x))(q|)/K+\n    abc\n 0: \n 0+ abc\n 1: \nMK: x\n\n/(?=(*:x))((*:y)q|)/K+\n    abc\n 0: \n 0+ abc\n 1: \nMK: x\n\n/(?=(*:x))(?:(*:y)q|)/K+\n    abc\n 0: \n 0+ abc\nMK: x\n\n/(?=(*:x))(?>(*:y)q|)/K+\n    abc\n 0: \n 0+ abc\nMK: x\n\n/(?=a(*:x))(?!a(*:y)c)/K+\n    ab\n 0: \n 0+ ab\nMK: x\n\n/(?=a(*:x))(?=a(*:y)c|)/K+\n    ab\n 0: \n 0+ ab\nMK: x\n\n/(..)\\1/\n    ab\\P\nPartial match: ab\n    aba\\P\nPartial match: aba\n    abab\\P\n 0: abab\n 1: ab\n\n/(..)\\1/i\n    ab\\P\nPartial match: ab\n    abA\\P\nPartial match: abA\n    aBAb\\P\n 0: aBAb\n 1: aB\n\n/(..)\\1{2,}/\n    ab\\P\nPartial match: ab\n    aba\\P\nPartial match: aba\n    abab\\P\nPartial match: abab\n    ababa\\P\nPartial match: ababa\n    ababab\\P\n 0: ababab\n 1: ab\n    ababab\\P\\P\nPartial match: ababab\n    abababa\\P\n 0: ababab\n 1: ab\n    abababa\\P\\P\nPartial match: abababa\n\n/(..)\\1{2,}/i\n    ab\\P\nPartial match: ab\n    aBa\\P\nPartial match: aBa\n    aBAb\\P\nPartial match: aBAb\n    AbaBA\\P\nPartial match: AbaBA\n    abABAb\\P\n 0: abABAb\n 1: ab\n    aBAbaB\\P\\P\nPartial match: aBAbaB\n    abABabA\\P\n 0: abABab\n 1: ab\n    abaBABa\\P\\P\nPartial match: abaBABa\n\n/(..)\\1{2,}?x/i\n    ab\\P\nPartial match: ab\n    abA\\P\nPartial match: abA\n    aBAb\\P\nPartial match: aBAb\n    abaBA\\P\nPartial match: abaBA\n    abAbaB\\P\nPartial match: abAbaB\n    abaBabA\\P\nPartial match: abaBabA\n    abAbABaBx\\P\n 0: abAbABaBx\n 1: ab\n\n/^(..)\\1/\n    aba\\P\nPartial match: aba\n\n/^(..)\\1{2,3}x/\n    aba\\P\nPartial match: aba\n    ababa\\P\nPartial match: ababa\n    ababa\\P\\P\nPartial match: ababa\n    abababx\n 0: abababx\n 1: ab\n    ababababx  \n 0: ababababx\n 1: ab\n\n/^(..)\\1{2,3}?x/\n    aba\\P\nPartial match: aba\n    ababa\\P\nPartial match: ababa\n    ababa\\P\\P\nPartial match: ababa\n    abababx\n 0: abababx\n 1: ab\n    ababababx  \n 0: ababababx\n 1: ab\n    \n/^(..)(\\1{2,3})ab/\n    abababab\n 0: abababab\n 1: ab\n 2: abab\n\n/^\\R/\n    \\r\\P\n 0: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \n/^\\R{2,3}x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P \nPartial match: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P  \nPartial match: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P\nPartial match: \\x0d\\x0d\\x0d\n    \\r\\rx\n 0: \\x0d\\x0dx\n    \\r\\r\\rx    \n 0: \\x0d\\x0d\\x0dx\n\n/^\\R{2,3}?x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P \nPartial match: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P  \nPartial match: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P\nPartial match: \\x0d\\x0d\\x0d\n    \\r\\rx\n 0: \\x0d\\x0dx\n    \\r\\r\\rx    \n 0: \\x0d\\x0d\\x0dx\n    \n/^\\R?x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n    x\n 0: x\n    \\rx  \n 0: \\x0dx\n\n/^\\R+x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n    \\r\\n\\P\nPartial match: \\x0d\\x0a\n    \\r\\n\\P\\P  \nPartial match: \\x0d\\x0a\n    \\rx  \n 0: \\x0dx\n\n/^a$/<CRLF>\n    a\\r\\P\nPartial match: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^a$/m<CRLF>\n    a\\r\\P\nPartial match: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^(a$|a\\r)/<CRLF>\n    a\\r\\P\n 0: a\\x0d\n 1: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^(a$|a\\r)/m<CRLF>\n    a\\r\\P\n 0: a\\x0d\n 1: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/./<CRLF>\n    \\r\\P\n 0: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n  \n/.{2,3}/<CRLF>\n    \\r\\P \nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P\n 0: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P\n 0: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P     \nPartial match: \\x0d\\x0d\\x0d\n\n/.{2,3}?/<CRLF>\n    \\r\\P \nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P\n 0: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P\n 0: \\x0d\\x0d\n    \\r\\r\\r\\P\\P     \n 0: \\x0d\\x0d\n\n\"AB(C(D))(E(F))?(?(?=\\2)(?=\\4))\"\n    ABCDGHI\\O03\nMatched, but too many substrings\n 0: ABCD\n    \n/-- These are all run as real matches in test 1; here we are just checking the\nsettings of the anchored and startline bits. --/ \n\n/(?>.*?a)(?<=ba)/I\nCapturing subpattern count = 0\nMax lookbehind = 2\nNo options\nNo first char\nNeed char = 'a'\n\n/(?:.*?a)(?<=ba)/I\nCapturing subpattern count = 0\nMax lookbehind = 2\nNo options\nFirst char at start or follows newline\nNeed char = 'a'\n\n/.*?a(*PRUNE)b/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'b'\n\n/.*?a(*PRUNE)b/sI\nCapturing subpattern count = 0\nOptions: dotall\nNo first char\nNeed char = 'b'\n\n/^a(*PRUNE)b/sI\nCapturing subpattern count = 0\nOptions: anchored dotall\nNo first char\nNo need char\n\n/.*?a(*SKIP)b/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'b'\n\n/(?>.*?a)b/sI\nCapturing subpattern count = 0\nOptions: dotall\nNo first char\nNeed char = 'b'\n\n/(?>.*?a)b/I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'b'\n\n/(?>^a)b/sI\nCapturing subpattern count = 0\nOptions: anchored dotall\nNo first char\nNo need char\n\n/(?>.*?)(?<=(abcd)|(wxyz))/I\nCapturing subpattern count = 2\nMax lookbehind = 4\nMay match empty string\nNo options\nNo first char\nNo need char\n\n/(?>.*)(?<=(abcd)|(wxyz))/I\nCapturing subpattern count = 2\nMax lookbehind = 4\nMay match empty string\nNo options\nNo first char\nNo need char\n\n\"(?>.*)foo\"I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'o'\n\n\"(?>.*?)foo\"I\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'o'\n\n/(?>^abc)/mI\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'c'\n\n/(?>.*abc)/mI\nCapturing subpattern count = 0\nOptions: multiline\nNo first char\nNeed char = 'c'\n\n/(?:.*abc)/mI\nCapturing subpattern count = 0\nOptions: multiline\nFirst char at start or follows newline\nNeed char = 'c'\n\n/-- Check PCRE_STUDY_EXTRA_NEEDED --/\n\n/.?/S-I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nStudy returned NULL\n\n/.?/S!I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\nSubject length lower bound = -1\nNo starting char list\n\n/(?:(a)+(?C1)bb|aa(?C2)b)/\n    aab\\C+\nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^ ^     b\nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^^      b\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n    ^ ^     b\n 0: aab\n   \n/(?:(a)++(?C1)bb|aa(?C2)b)/\n    aab\\C+ \nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^ ^     b\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n    ^ ^     b\n 0: aab\n    \n/(?:(?>(a))(?C1)bb|aa(?C2)b)/\n    aab\\C+ \nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^^      b\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n    ^ ^     b\n 0: aab\n\n/(?:(?1)(?C1)x|ab(?C2))((a)){0}/                                                \n    aab\\C+ \nCallout 1: last capture = -1\n 0: <unset>\n--->aab\n    ^^      x\nCallout 1: last capture = -1\n 0: <unset>\n--->aab\n     ^^     x\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n     ^ ^    )\n 0: ab\n\n/(?1)(?C1)((a)(?C2)){0}/   \n    aab\\C+ \nCallout 2: last capture = 2\n 0: <unset>\n 1: <unset>\n 2: a\n--->aab\n    ^^      )\nCallout 1: last capture = -1\n 0: <unset>\n--->aab\n    ^^      ((a)(?C2)){0}\n 0: a\n\n/(?:(a)+(?C1)bb|aa(?C2)b)++/\n    aab\\C+\nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^ ^     b\nCallout 1: last capture = 1\n 0: <unset>\n 1: a\n--->aab\n    ^^      b\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n    ^ ^     b\n 0: aab\n    aab\\C+\\O2\nCallout 1: last capture = 1\n 0: <unset>\n--->aab\n    ^ ^     b\nCallout 1: last capture = 1\n 0: <unset>\n--->aab\n    ^^      b\nCallout 2: last capture = -1\n 0: <unset>\n--->aab\n    ^ ^     b\n 0: aab\n\n/(ab)x|ab/\n    ab\\O3\n 0: ab\n    ab\\O2 \n 0: ab\n  \n/(ab)/\n    ab\\O3\nMatched, but too many substrings\n 0: ab\n    ab\\O2 \nMatched, but too many substrings\n 0: ab\n    \n/(?<=123)(*MARK:xx)abc/K\n    xxxx123a\\P\\P\nPartial match at offset 7, mark=xx: 123a\n    xxxx123a\\P\nPartial match at offset 7, mark=xx: 123a\n    \n/123\\Kabc/\n    xxxx123a\\P\\P\nPartial match: 123a\n    xxxx123a\\P\nPartial match: 123a\n\n/^(?(?=a)aa|bb)/C\n    bb\n--->bb\n +0 ^      ^\n +1 ^      (?(?=a)aa|bb)\n +3 ^      (?=a)\n +6 ^      a\n+11 ^      b\n+12 ^^     b\n+13 ^ ^    )\n+14 ^ ^    \n 0: bb\n\n/(?C1)^(?C2)(?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))(?C11)/\n    bb\n--->bb\n  1 ^      ^\n  2 ^      (?(?C99)(?=(?C3)a(?C4))(?C5)a(?C6)a(?C7)|(?C8)b(?C9)b(?C10))\n 99 ^      (?=(?C3)a(?C4))\n  3 ^      a\n  8 ^      b\n  9 ^^     b\n 10 ^ ^    )\n 11 ^ ^    \n 0: bb\n\n/-- Perl seems to have a bug with this one --/\n\n/aaaaa(*COMMIT)(*PRUNE)b|a+c/\n    aaaaaac\n 0: aaaac\n    \n/-- Here are some that Perl treats differently because of the way it handles\nbacktracking verbs. --/\n\n /(?!a(*COMMIT)b)ac|ad/\n     ac\n 0: ac\n     ad \n 0: ad\n\n/^(?!a(*THEN)b|ac)../\n     ac\nNo match\n     ad \n 0: ad\n\n/^(?=a(*THEN)b|ac)/\n    ac\n 0: \n    \n/\\A.*?(?:a|b(*THEN)c)/\n    ba\n 0: ba\n\n/\\A.*?(?:a|b(*THEN)c)++/\n    ba\n 0: ba\n\n/\\A.*?(?:a|b(*THEN)c|d)/\n    ba\n 0: ba\n\n/(?:(a(*MARK:X)a+(*SKIP:X)b)){0}(?:(?1)|aac)/\n    aac \n 0: aac\n\n/\\A.*?(a|b(*THEN)c)/\n    ba\n 0: ba\n 1: a\n\n/^(A(*THEN)B|A(*THEN)D)/\n    AD           \n 0: AD\n 1: AD\n    \n/(?!b(*THEN)a)bn|bnn/\n    bnn\n 0: bn\n\n/(?(?=b(*SKIP)a)bn|bnn)/\n    bnn\nNo match\n\n/(?=b(*THEN)a|)bn|bnn/\n    bnn\n 0: bn\n\n/-------------------------/ \n\n/(*LIMIT_MATCH=12bc)abc/\nFailed: (*VERB) not recognized or malformed at offset 7\n\n/(*LIMIT_MATCH=4294967290)abc/\nFailed: (*VERB) not recognized or malformed at offset 7\n\n/(*LIMIT_RECURSION=4294967280)abc/I\nCapturing subpattern count = 0\nRecursion limit = 4294967280\nNo options\nFirst char = 'a'\nNeed char = 'c'\n\n/(a+)*zz/\n    aaaaaaaaaaaaaz\nNo match\n    aaaaaaaaaaaaaz\\q3000\nError -8 (match limit exceeded)\n\n/(a+)*zz/S-\n    aaaaaaaaaaaaaz\\Q10 \nError -21 (recursion limit exceeded)\n\n/(*LIMIT_MATCH=3000)(a+)*zz/I\nCapturing subpattern count = 1\nMatch limit = 3000\nNo options\nNo first char\nNeed char = 'z'\n    aaaaaaaaaaaaaz\nError -8 (match limit exceeded)\n    aaaaaaaaaaaaaz\\q60000\nError -8 (match limit exceeded)\n\n/(*LIMIT_MATCH=60000)(*LIMIT_MATCH=3000)(a+)*zz/I\nCapturing subpattern count = 1\nMatch limit = 3000\nNo options\nNo first char\nNeed char = 'z'\n    aaaaaaaaaaaaaz\nError -8 (match limit exceeded)\n\n/(*LIMIT_MATCH=60000)(a+)*zz/I\nCapturing subpattern count = 1\nMatch limit = 60000\nNo options\nNo first char\nNeed char = 'z'\n    aaaaaaaaaaaaaz\nNo match\n    aaaaaaaaaaaaaz\\q3000\nError -8 (match limit exceeded)\n\n/(*LIMIT_RECURSION=10)(a+)*zz/IS-\nCapturing subpattern count = 1\nRecursion limit = 10\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 2\nStarting chars: a z \n    aaaaaaaaaaaaaz\nError -21 (recursion limit exceeded)\n    aaaaaaaaaaaaaz\\Q1000\nError -21 (recursion limit exceeded)\n\n/(*LIMIT_RECURSION=10)(*LIMIT_RECURSION=1000)(a+)*zz/IS-\nCapturing subpattern count = 1\nRecursion limit = 10\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 2\nStarting chars: a z \n    aaaaaaaaaaaaaz\nError -21 (recursion limit exceeded)\n\n/(*LIMIT_RECURSION=1000)(a+)*zz/IS-\nCapturing subpattern count = 1\nRecursion limit = 1000\nNo options\nNo first char\nNeed char = 'z'\nSubject length lower bound = 2\nStarting chars: a z \n    aaaaaaaaaaaaaz\nNo match\n    aaaaaaaaaaaaaz\\Q10\nError -21 (recursion limit exceeded)\n\n/-- This test causes a segfault with Perl 5.18.0 --/\n\n/^(?=(a)){0}b(?1)/\n    backgammon\n 0: ba\n\n/(?|(?<n>f)|(?<n>b))/JI\nCapturing subpattern count = 1\nNamed capturing subpatterns:\n  n   1\nOptions: dupnames\nNo first char\nNo need char\n\n/(?<a>abc)(?<a>z)\\k<a>()/JDZS\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        abc\n        Ket\n        CBra 2\n        z\n        Ket\n        \\k<a>2\n        CBra 3\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 3\nMax back reference = 2\nNamed capturing subpatterns:\n  a   1\n  a   2\nOptions: dupnames\nFirst char = 'a'\nNeed char = 'z'\nSubject length lower bound = 5\nNo starting char list\n\n/a*[bcd]/BZ\n------------------------------------------------------------------\n        Bra\n        a*+\n        [b-d]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[bcd]*a/BZ\n------------------------------------------------------------------\n        Bra\n        [b-d]*+\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- A complete set of tests for auto-possessification of character types --/\n\n/\\D+\\D \\D+\\d \\D+\\S \\D+\\s \\D+\\W \\D+\\w \\D+. \\D+\\C \\D+\\R \\D+\\H \\D+\\h \\D+\\V \\D+\\v \\D+\\Z \\D+\\z \\D+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\D+\n        \\D\n        \\D++\n        \\d\n        \\D+\n        \\S\n        \\D+\n        \\s\n        \\D+\n        \\W\n        \\D+\n        \\w\n        \\D+\n        Any\n        \\D+\n        AllAny\n        \\D+\n        \\R\n        \\D+\n        \\H\n        \\D+\n        \\h\n        \\D+\n        \\V\n        \\D+\n        \\v\n        \\D+\n        \\Z\n        \\D++\n        \\z\n        \\D+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d+\\D \\d+\\d \\d+\\S \\d+\\s \\d+\\W \\d+\\w \\d+. \\d+\\C \\d+\\R \\d+\\H \\d+\\h \\d+\\V \\d+\\v \\d+\\Z \\d+\\z \\d+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\d++\n        \\D\n        \\d+\n        \\d\n        \\d+\n        \\S\n        \\d++\n        \\s\n        \\d++\n        \\W\n        \\d+\n        \\w\n        \\d+\n        Any\n        \\d+\n        AllAny\n        \\d++\n        \\R\n        \\d+\n        \\H\n        \\d++\n        \\h\n        \\d+\n        \\V\n        \\d++\n        \\v\n        \\d++\n        \\Z\n        \\d++\n        \\z\n        \\d++\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\S+\\D \\S+\\d \\S+\\S \\S+\\s \\S+\\W \\S+\\w \\S+. \\S+\\C \\S+\\R \\S+\\H \\S+\\h \\S+\\V \\S+\\v \\S+\\Z \\S+\\z \\S+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\S+\n        \\D\n        \\S+\n        \\d\n        \\S+\n        \\S\n        \\S++\n        \\s\n        \\S+\n        \\W\n        \\S+\n        \\w\n        \\S+\n        Any\n        \\S+\n        AllAny\n        \\S++\n        \\R\n        \\S+\n        \\H\n        \\S++\n        \\h\n        \\S+\n        \\V\n        \\S++\n        \\v\n        \\S++\n        \\Z\n        \\S++\n        \\z\n        \\S++\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\s+\\D \\s+\\d \\s+\\S \\s+\\s \\s+\\W \\s+\\w \\s+. \\s+\\C \\s+\\R \\s+\\H \\s+\\h \\s+\\V \\s+\\v \\s+\\Z \\s+\\z \\s+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\s+\n        \\D\n        \\s++\n        \\d\n        \\s++\n        \\S\n        \\s+\n        \\s\n        \\s+\n        \\W\n        \\s++\n        \\w\n        \\s+\n        Any\n        \\s+\n        AllAny\n        \\s+\n        \\R\n        \\s+\n        \\H\n        \\s+\n        \\h\n        \\s+\n        \\V\n        \\s+\n        \\v\n        \\s+\n        \\Z\n        \\s++\n        \\z\n        \\s+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\W+\\D \\W+\\d \\W+\\S \\W+\\s \\W+\\W \\W+\\w \\W+. \\W+\\C \\W+\\R \\W+\\H \\W+\\h \\W+\\V \\W+\\v \\W+\\Z \\W+\\z \\W+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\W+\n        \\D\n        \\W++\n        \\d\n        \\W+\n        \\S\n        \\W+\n        \\s\n        \\W+\n        \\W\n        \\W++\n        \\w\n        \\W+\n        Any\n        \\W+\n        AllAny\n        \\W+\n        \\R\n        \\W+\n        \\H\n        \\W+\n        \\h\n        \\W+\n        \\V\n        \\W+\n        \\v\n        \\W+\n        \\Z\n        \\W++\n        \\z\n        \\W+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w+\\D \\w+\\d \\w+\\S \\w+\\s \\w+\\W \\w+\\w \\w+. \\w+\\C \\w+\\R \\w+\\H \\w+\\h \\w+\\V \\w+\\v \\w+\\Z \\w+\\z \\w+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\w+\n        \\D\n        \\w+\n        \\d\n        \\w+\n        \\S\n        \\w++\n        \\s\n        \\w++\n        \\W\n        \\w+\n        \\w\n        \\w+\n        Any\n        \\w+\n        AllAny\n        \\w++\n        \\R\n        \\w+\n        \\H\n        \\w++\n        \\h\n        \\w+\n        \\V\n        \\w++\n        \\v\n        \\w++\n        \\Z\n        \\w++\n        \\z\n        \\w++\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\C+\\D \\C+\\d \\C+\\S \\C+\\s \\C+\\W \\C+\\w \\C+. \\C+\\C \\C+\\R \\C+\\H \\C+\\h \\C+\\V \\C+\\v \\C+\\Z \\C+\\z \\C+$/BZx\n------------------------------------------------------------------\n        Bra\n        AllAny+\n        \\D\n        AllAny+\n        \\d\n        AllAny+\n        \\S\n        AllAny+\n        \\s\n        AllAny+\n        \\W\n        AllAny+\n        \\w\n        AllAny+\n        Any\n        AllAny+\n        AllAny\n        AllAny+\n        \\R\n        AllAny+\n        \\H\n        AllAny+\n        \\h\n        AllAny+\n        \\V\n        AllAny+\n        \\v\n        AllAny+\n        \\Z\n        AllAny++\n        \\z\n        AllAny+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\R+\\D \\R+\\d \\R+\\S \\R+\\s \\R+\\W \\R+\\w \\R+. \\R+\\C \\R+\\R \\R+\\H \\R+\\h \\R+\\V \\R+\\v \\R+\\Z \\R+\\z \\R+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\R+\n        \\D\n        \\R++\n        \\d\n        \\R+\n        \\S\n        \\R++\n        \\s\n        \\R+\n        \\W\n        \\R++\n        \\w\n        \\R++\n        Any\n        \\R+\n        AllAny\n        \\R+\n        \\R\n        \\R+\n        \\H\n        \\R++\n        \\h\n        \\R+\n        \\V\n        \\R+\n        \\v\n        \\R+\n        \\Z\n        \\R++\n        \\z\n        \\R+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\H+\\D \\H+\\d \\H+\\S \\H+\\s \\H+\\W \\H+\\w \\H+. \\H+\\C \\H+\\R \\H+\\H \\H+\\h \\H+\\V \\H+\\v \\H+\\Z \\H+\\z \\H+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\H+\n        \\D\n        \\H+\n        \\d\n        \\H+\n        \\S\n        \\H+\n        \\s\n        \\H+\n        \\W\n        \\H+\n        \\w\n        \\H+\n        Any\n        \\H+\n        AllAny\n        \\H+\n        \\R\n        \\H+\n        \\H\n        \\H++\n        \\h\n        \\H+\n        \\V\n        \\H+\n        \\v\n        \\H+\n        \\Z\n        \\H++\n        \\z\n        \\H+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\h+\\D \\h+\\d \\h+\\S \\h+\\s \\h+\\W \\h+\\w \\h+. \\h+\\C \\h+\\R \\h+\\H \\h+\\h \\h+\\V \\h+\\v \\h+\\Z \\h+\\z \\h+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\h+\n        \\D\n        \\h++\n        \\d\n        \\h++\n        \\S\n        \\h+\n        \\s\n        \\h+\n        \\W\n        \\h++\n        \\w\n        \\h+\n        Any\n        \\h+\n        AllAny\n        \\h++\n        \\R\n        \\h++\n        \\H\n        \\h+\n        \\h\n        \\h+\n        \\V\n        \\h++\n        \\v\n        \\h+\n        \\Z\n        \\h++\n        \\z\n        \\h+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\V+\\D \\V+\\d \\V+\\S \\V+\\s \\V+\\W \\V+\\w \\V+. \\V+\\C \\V+\\R \\V+\\H \\V+\\h \\V+\\V \\V+\\v \\V+\\Z \\V+\\z \\V+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\V+\n        \\D\n        \\V+\n        \\d\n        \\V+\n        \\S\n        \\V+\n        \\s\n        \\V+\n        \\W\n        \\V+\n        \\w\n        \\V+\n        Any\n        \\V+\n        AllAny\n        \\V++\n        \\R\n        \\V+\n        \\H\n        \\V+\n        \\h\n        \\V+\n        \\V\n        \\V++\n        \\v\n        \\V+\n        \\Z\n        \\V++\n        \\z\n        \\V+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\v+\\D \\v+\\d \\v+\\S \\v+\\s \\v+\\W \\v+\\w \\v+. \\v+\\C \\v+\\R \\v+\\H \\v+\\h \\v+\\V \\v+\\v \\v+\\Z \\v+\\z \\v+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\v+\n        \\D\n        \\v++\n        \\d\n        \\v++\n        \\S\n        \\v+\n        \\s\n        \\v+\n        \\W\n        \\v++\n        \\w\n        \\v+\n        Any\n        \\v+\n        AllAny\n        \\v+\n        \\R\n        \\v+\n        \\H\n        \\v++\n        \\h\n        \\v++\n        \\V\n        \\v+\n        \\v\n        \\v+\n        \\Z\n        \\v++\n        \\z\n        \\v+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/ a+\\D  a+\\d  a+\\S  a+\\s  a+\\W  a+\\w  a+.  a+\\C  a+\\R  a+\\H  a+\\h  a+\\V  a+\\v  a+\\Z  a+\\z  a+$/BZx\n------------------------------------------------------------------\n        Bra\n        a+\n        \\D\n        a++\n        \\d\n        a+\n        \\S\n        a++\n        \\s\n        a++\n        \\W\n        a+\n        \\w\n        a+\n        Any\n        a+\n        AllAny\n        a++\n        \\R\n        a+\n        \\H\n        a++\n        \\h\n        a+\n        \\V\n        a++\n        \\v\n        a++\n        \\Z\n        a++\n        \\z\n        a++\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\n+\\D \\n+\\d \\n+\\S \\n+\\s \\n+\\W \\n+\\w \\n+. \\n+\\C \\n+\\R \\n+\\H \\n+\\h \\n+\\V \\n+\\v \\n+\\Z \\n+\\z \\n+$/BZx\n------------------------------------------------------------------\n        Bra\n        \\x0a+\n        \\D\n        \\x0a++\n        \\d\n        \\x0a++\n        \\S\n        \\x0a+\n        \\s\n        \\x0a+\n        \\W\n        \\x0a++\n        \\w\n        \\x0a+\n        Any\n        \\x0a+\n        AllAny\n        \\x0a+\n        \\R\n        \\x0a+\n        \\H\n        \\x0a++\n        \\h\n        \\x0a++\n        \\V\n        \\x0a+\n        \\v\n        \\x0a+\n        \\Z\n        \\x0a++\n        \\z\n        \\x0a+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/ .+\\D  .+\\d  .+\\S  .+\\s  .+\\W  .+\\w  .+.  .+\\C  .+\\R  .+\\H  .+\\h  .+\\V  .+\\v  .+\\Z  .+\\z  .+$/BZx\n------------------------------------------------------------------\n        Bra\n        Any+\n        \\D\n        Any+\n        \\d\n        Any+\n        \\S\n        Any+\n        \\s\n        Any+\n        \\W\n        Any+\n        \\w\n        Any+\n        Any\n        Any+\n        AllAny\n        Any++\n        \\R\n        Any+\n        \\H\n        Any+\n        \\h\n        Any+\n        \\V\n        Any+\n        \\v\n        Any+\n        \\Z\n        Any++\n        \\z\n        Any+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/ .+\\D  .+\\d  .+\\S  .+\\s  .+\\W  .+\\w  .+.  .+\\C  .+\\R  .+\\H  .+\\h  .+\\V  .+\\v  .+\\Z  .+\\z  .+$/BZxs\n------------------------------------------------------------------\n        Bra\n        AllAny+\n        \\D\n        AllAny+\n        \\d\n        AllAny+\n        \\S\n        AllAny+\n        \\s\n        AllAny+\n        \\W\n        AllAny+\n        \\w\n        AllAny+\n        AllAny\n        AllAny+\n        AllAny\n        AllAny+\n        \\R\n        AllAny+\n        \\H\n        AllAny+\n        \\h\n        AllAny+\n        \\V\n        AllAny+\n        \\v\n        AllAny+\n        \\Z\n        AllAny++\n        \\z\n        AllAny+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D+$  \\d+$  \\S+$  \\s+$  \\W+$  \\w+$  \\C+$  \\R+$  \\H+$  \\h+$  \\V+$  \\v+$   a+$  \\n+$   .+$  .+$/BZxm\n------------------------------------------------------------------\n        Bra\n        \\D+\n     /m $\n        \\d++\n     /m $\n        \\S++\n     /m $\n        \\s+\n     /m $\n        \\W+\n     /m $\n        \\w++\n     /m $\n        AllAny+\n     /m $\n        \\R+\n     /m $\n        \\H+\n     /m $\n        \\h+\n     /m $\n        \\V+\n     /m $\n        \\v+\n     /m $\n        a+\n     /m $\n        \\x0a+\n     /m $\n        Any+\n     /m $\n        Any+\n     /m $\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=a+)a(a+)++a/BZ\n------------------------------------------------------------------\n        Bra\n        Assert\n        a++\n        Ket\n        a\n        CBraPos 1\n        a++\n        KetRpos\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/a+(bb|cc)a+(?:bb|cc)a+(?>bb|cc)a+(?:bb|cc)+a+(aa)a+(?:bb|aa)/BZ\n------------------------------------------------------------------\n        Bra\n        a++\n        CBra 1\n        bb\n        Alt\n        cc\n        Ket\n        a++\n        Bra\n        bb\n        Alt\n        cc\n        Ket\n        a++\n        Once_NC\n        bb\n        Alt\n        cc\n        Ket\n        a++\n        Bra\n        bb\n        Alt\n        cc\n        KetRmax\n        a+\n        CBra 2\n        aa\n        Ket\n        a+\n        Bra\n        bb\n        Alt\n        aa\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/a+(bb|cc)?#a+(?:bb|cc)??#a+(?:bb|cc)?+#a+(?:bb|cc)*#a+(bb|cc)?a#a+(?:aa)?/BZ\n------------------------------------------------------------------\n        Bra\n        a++\n        Brazero\n        CBra 1\n        bb\n        Alt\n        cc\n        Ket\n        #\n        a++\n        Braminzero\n        Bra\n        bb\n        Alt\n        cc\n        Ket\n        #\n        a++\n        Once\n        Brazero\n        Bra\n        bb\n        Alt\n        cc\n        Ket\n        Ket\n        #\n        a++\n        Brazero\n        Bra\n        bb\n        Alt\n        cc\n        KetRmax\n        #\n        a+\n        Brazero\n        CBra 2\n        bb\n        Alt\n        cc\n        Ket\n        a#\n        a+\n        Brazero\n        Bra\n        aa\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/a+(?:bb)?a#a+(?:|||)#a+(?:|b)a#a+(?:|||)?a/BZ\n------------------------------------------------------------------\n        Bra\n        a+\n        Brazero\n        Bra\n        bb\n        Ket\n        a#\n        a++\n        Bra\n        Alt\n        Alt\n        Alt\n        Ket\n        #\n        a+\n        Bra\n        Alt\n        b\n        Ket\n        a#\n        a+\n        Brazero\n        Bra\n        Alt\n        Alt\n        Alt\n        Ket\n        a\n        Ket\n        End\n------------------------------------------------------------------\n\n/[ab]*/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]*+\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aaaa\n\n/[ab]*?/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]*?\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: \n\n/[ab]?/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]?+\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: a\n\n/[ab]??/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]??\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: \n\n/[ab]+/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]++\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aaaa\n\n/[ab]+?/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]+?\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: a\n\n/[ab]{2,3}/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]{2,3}+\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aaa\n\n/[ab]{2,3}?/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]{2,3}?\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aa\n\n/[ab]{2,}/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]{2,}+\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aaaa\n\n/[ab]{2,}?/BZ\n------------------------------------------------------------------\n        Bra\n        [ab]{2,}?\n        Ket\n        End\n------------------------------------------------------------------\n    aaaa\n 0: aa\n\n/\\d+\\s{0,5}=\\s*\\S?=\\w{0,4}\\W*/BZ\n------------------------------------------------------------------\n        Bra\n        \\d++\n        \\s{0,5}+\n        =\n        \\s*+\n        \\S?\n        =\n        \\w{0,4}+\n        \\W*+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-d]{5,12}[e-z0-9]*#[^a-z]+[b-y]*a[2-7]?[^0-9a-z]+/BZ\n------------------------------------------------------------------\n        Bra\n        [a-d]{5,12}+\n        [0-9e-z]*+\n        #\n        [\\x00-`{-\\xff] (neg)++\n        [b-y]*+\n        a\n        [2-7]?+\n        [\\x00-/:-`{-\\xff] (neg)++\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-z]*\\s#[ \\t]?\\S#[a-c]*\\S#[C-G]+?\\d#[4-8]*\\D#[4-9,]*\\D#[!$]{0,5}\\w#[M-Xf-l]+\\W#[a-c,]?\\W/BZ\n------------------------------------------------------------------\n        Bra\n        [a-z]*+\n        \\s\n        #\n        [\\x09 ]?+\n        \\S\n        #\n        [a-c]*\n        \\S\n        #\n        [C-G]++\n        \\d\n        #\n        [4-8]*+\n        \\D\n        #\n        [,4-9]*\n        \\D\n        #\n        [!$]{0,5}+\n        \\w\n        #\n        [M-Xf-l]++\n        \\W\n        #\n        [,a-c]?\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\n\n/a+(aa|bb)*c#a*(bb|cc)*a#a?(bb|cc)*d#[a-f]*(g|hh)*f/BZ\n------------------------------------------------------------------\n        Bra\n        a+\n        Brazero\n        CBra 1\n        aa\n        Alt\n        bb\n        KetRmax\n        c#\n        a*\n        Brazero\n        CBra 2\n        bb\n        Alt\n        cc\n        KetRmax\n        a#\n        a?+\n        Brazero\n        CBra 3\n        bb\n        Alt\n        cc\n        KetRmax\n        d#\n        [a-f]*\n        Brazero\n        CBra 4\n        g\n        Alt\n        hh\n        KetRmax\n        f\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-f]*(g|hh|i)*i#[a-x]{4,}(y{0,6})*y#[a-k]+(ll|mm)+n/BZ\n------------------------------------------------------------------\n        Bra\n        [a-f]*+\n        Brazero\n        CBra 1\n        g\n        Alt\n        hh\n        Alt\n        i\n        KetRmax\n        i#\n        [a-x]{4,}\n        Brazero\n        SCBra 2\n        y{0,6}\n        KetRmax\n        y#\n        [a-k]++\n        CBra 3\n        ll\n        Alt\n        mm\n        KetRmax\n        n\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-f]*(?>gg|hh)+#[a-f]*(?>gg|hh)?#[a-f]*(?>gg|hh)*a#[a-f]*(?>gg|hh)*h/BZ\n------------------------------------------------------------------\n        Bra\n        [a-f]*+\n        Once_NC\n        gg\n        Alt\n        hh\n        KetRmax\n        #\n        [a-f]*+\n        Brazero\n        Once_NC\n        gg\n        Alt\n        hh\n        Ket\n        #\n        [a-f]*\n        Brazero\n        Once_NC\n        gg\n        Alt\n        hh\n        KetRmax\n        a#\n        [a-f]*+\n        Brazero\n        Once_NC\n        gg\n        Alt\n        hh\n        KetRmax\n        h\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-c]*d/DZS\n------------------------------------------------------------------\n        Bra\n        [a-c]*+\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd'\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/[a-c]+d/DZS\n------------------------------------------------------------------\n        Bra\n        [a-c]++\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd'\nSubject length lower bound = 2\nStarting chars: a b c \n\n/[a-c]?d/DZS\n------------------------------------------------------------------\n        Bra\n        [a-c]?+\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd'\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/[a-c]{4,6}d/DZS\n------------------------------------------------------------------\n        Bra\n        [a-c]{4,6}+\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd'\nSubject length lower bound = 5\nStarting chars: a b c \n\n/[a-c]{0,6}d/DZS\n------------------------------------------------------------------\n        Bra\n        [a-c]{0,6}+\n        d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNeed char = 'd'\nSubject length lower bound = 1\nStarting chars: a b c d \n\n/-- End of special auto-possessive tests --/\n\n/^A\\o{1239}B/\nFailed: non-octal character in \\o{} (closing brace missing?) at offset 8\n\n/^A\\oB/\nFailed: missing opening brace after \\o at offset 3\n\n/^A\\x{zz}B/ \nFailed: non-hex character in \\x{} (closing brace missing?) at offset 5\n\n/^A\\x{12Z/\nFailed: non-hex character in \\x{} (closing brace missing?) at offset 7\n\n/^A\\x{/\nFailed: non-hex character in \\x{} (closing brace missing?) at offset 5\n\n/[ab]++/BZO\n------------------------------------------------------------------\n        Bra\n        [ab]++\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^ab]*+/BZO\n------------------------------------------------------------------\n        Bra\n        [\\x00-`c-\\xff] (neg)*+\n        Ket\n        End\n------------------------------------------------------------------\n\n/a{4}+/BZO\n------------------------------------------------------------------\n        Bra\n        a{4}\n        Ket\n        End\n------------------------------------------------------------------\n\n/a{4}+/BZOi\n------------------------------------------------------------------\n        Bra\n     /i a{4}\n        Ket\n        End\n------------------------------------------------------------------\n\n/[a-[:digit:]]+/\nFailed: invalid range in character class at offset 3\n\n/[A-[:digit:]]+/\nFailed: invalid range in character class at offset 3\n\n/[a-[.xxx.]]+/\nFailed: invalid range in character class at offset 3\n\n/[a-[=xxx=]]+/\nFailed: invalid range in character class at offset 3\n\n/[a-[!xxx!]]+/\nFailed: range out of order in character class at offset 3\n\n/[A-[!xxx!]]+/\n    A]]]\n 0: A]]]\n\n/[a-\\d]+/\nFailed: invalid range in character class at offset 4\n\n/(?<0abc>xx)/\nFailed: group name must start with a non-digit at offset 3\n\n/(?&1abc)xx(?<1abc>y)/\nFailed: group name must start with a non-digit at offset 3\n\n/(?<ab-cd>xx)/\nFailed: syntax error in subpattern name (missing terminator) at offset 5\n\n/(?'0abc'xx)/\nFailed: group name must start with a non-digit at offset 3\n\n/(?P<0abc>xx)/\nFailed: group name must start with a non-digit at offset 4\n\n/\\k<5ghj>/\nFailed: group name must start with a non-digit at offset 3\n\n/\\k'5ghj'/\nFailed: group name must start with a non-digit at offset 3\n\n/\\k{2fgh}/\nFailed: group name must start with a non-digit at offset 3\n\n/(?P=8yuki)/\nFailed: group name must start with a non-digit at offset 4\n\n/\\g{4df}/\nFailed: group name must start with a non-digit at offset 3\n\n/(?&1abc)xx(?<1abc>y)/\nFailed: group name must start with a non-digit at offset 3\n\n/(?P>1abc)xx(?<1abc>y)/\nFailed: group name must start with a non-digit at offset 4\n\n/\\g'3gh'/\nFailed: \\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2\n\n/\\g<5fg>/\nFailed: \\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number at offset 2\n\n/(?(<4gh>)abc)/\nFailed: group name must start with a non-digit at offset 4\n\n/(?('4gh')abc)/\nFailed: group name must start with a non-digit at offset 4\n\n/(?(4gh)abc)/\nFailed: malformed number or name after (?( at offset 4\n\n/(?(R&6yh)abc)/\nFailed: group name must start with a non-digit at offset 5\n\n/(((a\\2)|(a*)\\g<-1>))*a?/BZ\n------------------------------------------------------------------\n        Bra\n        Brazero\n        SCBra 1\n        Once\n        CBra 2\n        CBra 3\n        a\n        \\2\n        Ket\n        Alt\n        CBra 4\n        a*\n        Ket\n        Recurse\n        Ket\n        Ket\n        KetRmax\n        a?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- Test the ugly \"start or end of word\" compatibility syntax --/\n\n/[[:<:]]red[[:>:]]/BZ\n------------------------------------------------------------------\n        Bra\n        \\b\n        Assert\n        \\w\n        Ket\n        red\n        \\b\n        AssertB\n        Reverse\n        \\w\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n    little red riding hood\n 0: red\n    a /red/ thing \n 0: red\n    red is a colour\n 0: red\n    put it all on red  \n 0: red\n    ** Failers\nNo match\n    no reduction\nNo match\n    Alfred Winifred\nNo match\n    \n/[a[:<:]] should give error/ \nFailed: unknown POSIX class name at offset 4\n\n/(?=ab\\K)/+\n    abcd\nStart of matched string is beyond its end - displaying from end to start.\n 0: ab\n 0+ abcd\n\n/abcd/f<lf>\n    xx\\nxabcd\nNo match\n    \n/ -- Test stack check external calls --/ \n\n/(((((a)))))/Q0\n\n/(((((a)))))/Q1\nFailed: parentheses are too deeply nested (stack check) at offset 0\n\n/(((((a)))))/Q\n** Missing 0 or 1 after /Q\n\n/^\\w+(?>\\s*)(?<=\\w)/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        \\w+\n        Once_NC\n        \\s*+\n        Ket\n        AssertB\n        Reverse\n        \\w\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\othing/\nFailed: missing opening brace after \\o at offset 1\n\n/\\o{}/\nFailed: digits missing in \\x{} or \\o{} at offset 1\n\n/\\o{whatever}/\nFailed: non-octal character in \\o{} (closing brace missing?) at offset 3\n\n/\\xthing/\n\n/\\x{}/\nFailed: digits missing in \\x{} or \\o{} at offset 3\n\n/\\x{whatever}/\nFailed: non-hex character in \\x{} (closing brace missing?) at offset 3\n\n\"((?=(?(?=(?(?=(?(?=()))))))))\"\n    a\n 0: \n 1: \n 2: \n\n\"(?(?=)==)(((((((((?=)))))))))\"\n    a\nNo match\n\n/^(?:(a)|b)(?(1)A|B)/I\nCapturing subpattern count = 1\nMax back reference = 1\nOptions: anchored\nNo first char\nNo need char\n    aA123\\O3\nMatched, but too many substrings\n 0: aA\n    aA123\\O6\n 0: aA\n 1: a\n\n'^(?:(?<AA>a)|b)(?(<AA>)A|B)'\n    aA123\\O3\nMatched, but too many substrings\n 0: aA\n    aA123\\O6\n 0: aA\n 1: a\n\n'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J\n    aA123\\O3\nMatched, but too many substrings\n 0: aA\n    aA123\\O6\nMatched, but too many substrings\n 0: aA\n 1: \n\n'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\\k{AA}'J\n    aa123\\O3\nMatched, but too many substrings\n 0: aa\n    aa123\\O6\nMatched, but too many substrings\n 0: aa\n 1: <unset>\n\n/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/\n\n/(?(?=0)?)+/\nFailed: nothing to repeat at offset 7\n\n/(?(?=0)(?=00)?00765)/\n     00765\n 0: 00765\n\n/(?(?=0)(?=00)?00765|(?!3).56)/\n     00765\n 0: 00765\n     456\n 0: 456\n     ** Failers\nNo match\n     356   \nNo match\n\n'^(a)*+(\\w)'\n    g\n 0: g\n 1: <unset>\n 2: g\n    g\\O3\nMatched, but too many substrings\n 0: g\n\n'^(?:a)*+(\\w)'\n    g\n 0: g\n 1: g\n    g\\O3\nMatched, but too many substrings\n 0: g\n\n//C\n    \\O\\C+\nCallout 255: last capture = -1\n--->\n +0 ^    \nMatched, but too many substrings\n\n\"((?2){0,1999}())?\"\n\n/((?+1)(\\1))/BZ\n------------------------------------------------------------------\n        Bra\n        Once\n        CBra 1\n        Recurse\n        CBra 2\n        \\1\n        Ket\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?(?!)a|b)/\n    bbb\n 0: b\n    aaa \nNo match\n\n\"((?2)+)((?1))\"\n\n\"(?(?<E>.*!.*)?)\"\nFailed: assertion expected after (?( or (?(?C) at offset 3\n\n\"X((?2)()*+){2}+\"BZ\n------------------------------------------------------------------\n        Bra\n        X\n        Once\n        CBra 1\n        Recurse\n        Braposzero\n        SCBraPos 2\n        KetRpos\n        Ket\n        CBra 1\n        Recurse\n        Braposzero\n        SCBraPos 2\n        KetRpos\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n\"X((?2)()*+){2}\"BZ\n------------------------------------------------------------------\n        Bra\n        X\n        CBra 1\n        Recurse\n        Braposzero\n        SCBraPos 2\n        KetRpos\n        Ket\n        CBra 1\n        Recurse\n        Braposzero\n        SCBraPos 2\n        KetRpos\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n\"(?<=((?2))((?1)))\"\nFailed: lookbehind assertion is not fixed length at offset 17\n\n/(?<=\\Ka)/g+\n    aaaaa\n 0: a\n 0+ aaaa\n 0: a\n 0+ aaaa\n 0: a\n 0+ aaa\n 0: a\n 0+ aa\n 0: a\n 0+ a\n 0: a\n 0+ \n\n/(?<=\\Ka)/G+\n    aaaaa\n 0: a\n 0+ aaaa\n 0: a\n 0+ aaa\n 0: a\n 0+ aa\n 0: a\n 0+ a\n 0: a\n 0+ \n\n/((?2){73}(?2))((?1))/\n\n/.((?2)(?R)\\1)()/BZ\n------------------------------------------------------------------\n        Bra\n        Any\n        Once\n        CBra 1\n        Recurse\n        Recurse\n        \\1\n        Ket\n        Ket\n        CBra 2\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?1)()((((((\\1++))\\x85)+)|))/\n\n/(\\9*+(?2);\\3++()2|)++{/\nFailed: reference to non-existent subpattern at offset 22\n\n/\\V\\x85\\9*+((?2)\\3++()2)*:2/\nFailed: reference to non-existent subpattern at offset 26\n\n/(((?(R)){0,2}) (?''((?'R')((?'R')))))/J\n\n/(((?(X)){0,2}) (?''((?'X')((?'X')))))/J\n\n/(((?(R)){0,2}) (?''((?'X')((?'R')))))/\n\n\"(?J)(?'d'(?'d'\\g{d}))\"\n\n\".*?\\h.+.\\.+\\R*?\\xd(?i)(?=!(?=b`b`b`\\`b\\xa9b!)`\\a`bbbbbbbbbbbbb`bbbbbbbbbbbb*R\\x85bbbbbbb\\C?{((?2)(?))((\n\\H){8(?<=(?1){29}\\xa8bbbb\\x16\\xd\\xc6^($(?<! )(\\xa9H4){4}h}1)B))\\x15')\"\n\n\"(?J:(?|(?'R')(\\k'R')|((?'R'))))\"\n\n/(?<=|(\\,\\$(?73591620449005828816)\\xa8.{7}){6}\\x09)/\nFailed: number is too big at offset 32\n\n//\n\\O1\nMatched, but too many substrings\n\n/^(?:(?(1)x|)+)+$()/BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        SBra\n        SCond\n      1 Cond ref\n        x\n        Alt\n        KetRmax\n        KetRmax\n        $\n        CBra 1\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=di(?<=(?1))|(?=(.))))/\nFailed: unmatched parentheses at offset 23\n\n/(?(R))*+/BZ\n------------------------------------------------------------------\n        Bra\n        Braposzero\n        SBraPos\n        SCond\n        Cond recurse any\n        Ket\n        KetRpos\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:\\\\](?'abc')[a:]/\n\n\"[[[.\\xe8Nq\\xffq\\xff\\xe0\\x2|||::Nq\\xffq\\xff\\xe0\\x6\\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[:::::::::::::::::[[.\\xe8Nq\\xffq\\xff\\xe0\\x2|||::Nq\\xffq\\xff\\xe0\\x6\\x2|||::[[[:[::::::[[[[[::::::::[:[[[:[:::[[[[[[[[[[[[[[:::E[[[:[:[[:[:::[[:::E[[[:[:[[:'[:::::E[[[:[::::::[[[:[[[[[[[::E[[[:[::::::[[[:[[[[[[[[:[[::[::::[[:::::::[[:[[[[[[[:[[::[:[[:[~\"\nFailed: missing terminating ] for character class at offset 353\n\n/()(?(R)0)*+/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        Ket\n        Braposzero\n        SBraPos\n        SCond\n        Cond recurse any\n        0\n        Ket\n        KetRpos\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?R-:(?</\nFailed: (?R or (?[+-]digits must be followed by ) at offset 3\n\n/(?1){3918}(((((0(\\k'R'))))(?J)(?'R'(?'R'\\3){99})))/I\nCapturing subpattern count = 8\nMax back reference = 8\nNamed capturing subpatterns:\n  R   7\n  R   8\nNo options\nDuplicate name status changes\nNo first char\nNeed char = '0'\n\n/(?J:(?|(:(?|(?'R')(\\k'R')|((?'R')))H'Rk'Rf)|s(?'R')))/\n\n/0(?0)|(1)(*THEN)(*SKIP:0)(*FAIL)/\n    01\nNo match\n\n/((?(R8000000000)))/ \nFailed: number is too big at offset 16\n\n/(?(8000000000/\nFailed: number is too big at offset 13\n\n/(?:ab)?(?:ab)(?:ab)/\n    abab\n 0: abab\n    ababab\n 0: ababab\n    aba\nNo match\n\n/((*MARK:A))++a(*SKIP:B)b/\n    aacb\nNo match\n\n/(?J:(?|(:(?|(?'R')(\\z(?|(?'R')(\\k'R')|((?'R')))k'R')|((?'R')))H'Ak'Rf)|s(?'R')))/\n\n/(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?&a)(?<a>1)/\n\n/a[[:punct:]b]/BZ\n------------------------------------------------------------------\n        Bra\n        a\n        [!-/:-@[-`b{-~]\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/BZ\n------------------------------------------------------------------\n        Bra\n        L?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/BOZ\n------------------------------------------------------------------\n        Bra\n        L?\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/BCZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        L?+\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/BCOZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        L?\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/(A*)\\E+/CBZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 7\n        SCBra 1\n        Callout 255 1 2\n        A*\n        Callout 255 3 0\n        KetRmax\n        Callout 255 7 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/()\\Q\\E*]/BCZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 7\n        Brazero\n        SCBra 1\n        Callout 255 1 0\n        KetRmax\n        Callout 255 7 1\n        ]\n        Callout 255 8 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/\n    \\O\\CC\nMatched, but too many substrings\ncopy substring C failed -7\n\n/(?=a\\K)/ \n    ring bpattingbobnd $ 1,oern cou \\rb\\L\nStart of matched string is beyond its end - displaying from end to start.\n 0: a\n 0L \n\n/(?<=((?C)0))/\n    9010\n--->9010\n  0  ^       0\n  0   ^      0\n 0: \n 1: 0\n    abcd\n--->abcd\n  0  ^       0\n  0   ^      0\n  0    ^     0\n  0     ^    0\nNo match\n     \n/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\\k'R'))))))))/\n\n/\\N(?(?C)0?!.)*/\nFailed: assertion expected after (?( or (?(?C) at offset 4\n\n/(?<RA>abc)(?(R)xyz)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        abc\n        Ket\n        Cond\n        Cond recurse any\n        xyz\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?<R>abc)(?(R)xyz)/BZ\n------------------------------------------------------------------\n        Bra\n        CBra 1\n        abc\n        Ket\n        Cond\n      1 Cond ref\n        xyz\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?=.*[A-Z])/I\nCapturing subpattern count = 0\nMay match empty string\nNo options\nNo first char\nNo need char\n\n\"(?<=(a))\\1?b\"\n    ab\n 0: b\n 1: a\n    aaab \n 0: ab\n 1: a\n\n\"(?=(a))\\1?b\"\n    ab\n 0: ab\n 1: a\n    aaab \n 0: ab\n 1: a\n\n/(?(?=^))b/\n    abc\n 0: b\n\n/-- End of testinput2 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput20",
    "content": "/-- These DFA tests are for the handling of characters greater than 255 in\n    16- or 32-bit, non-UTF mode. --/\n\n/^\\x{ffff}+/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}?/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}*/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/^\\x{ffff}{3}/i\n    \\x{ffff}\\x{ffff}\\x{ffff}\n 0: \\x{ffff}\\x{ffff}\\x{ffff}\n\n/^\\x{ffff}{0,3}/i\n    \\x{ffff}\n 0: \\x{ffff}\n\n/-- End of testinput20 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput21-16",
    "content": "/-- Tests for reloading pre-compiled patterns. The first one gives an error\nright away, and can be any old pattern compiled in 8-bit mode (\"abc\" is\ntypical). The others require the link size to be 2. */x\n\n<!testsaved8\nCompiled pattern loaded from testsaved8\nNo study data\nError -28 from pcre16_fullinfo(0)\nRunning in 16-bit mode but pattern was compiled in 8-bit mode\n\n%-- Generated from: \n    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\\x{150}-\\x{250}\\x{300}]|\n      [^\\x{800}aAs-uS-U\\x{d800}-\\x{dfff}])++[^#\\b\\x{500}\\x{1000}]{3,5}$\n      /x\n\n    In 16-bit mode with options:  S>testdata/saved16LE-1\n                                 FS>testdata/saved16BE-1\n    In 32-bit mode with options:  S>testdata/saved32LE-1\n                                 FS>testdata/saved32BE-1\n--%x\n\n<!testsaved16LE-1\nCompiled pattern loaded from testsaved16LE-1\nStudy data loaded from testsaved16LE-1\n------------------------------------------------------------------\n  0 134 Bra\n  2     ^\n  3     [La]\n 20  43 CBra 1\n 23  20 Bra\n 25     [ALal]+\n 43  20 Ket\n 45     [\\x00-,.-WY-wy-\\xff] (neg)*?\n 63  43 Ket\n 65  12 CBraPos 2\n 68     [\\x{150}-\\x{250}\\x{300}]\n 77  27 Alt\n 79     [^AS-Uas-u\\x{800}\\x{d800}-\\x{dfff}]\n104  39 KetRpos\n106     [^\\x08#\\x{500}\\x{1000}]{3,5}\n133     $\n134 134 Ket\n136     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  name    1\n  other   2\nOptions: anchored extended\nNo first char\nNo need char\nSubject length lower bound = 6\nNo starting char list\n\n<!testsaved16BE-1\nCompiled pattern loaded from testsaved16BE-1\nStudy data loaded from testsaved16BE-1\n------------------------------------------------------------------\n  0 134 Bra\n  2     ^\n  3     [La]\n 20  43 CBra 1\n 23  20 Bra\n 25     [ALal]+\n 43  20 Ket\n 45     [\\x00-,.-WY-wy-\\xff] (neg)*?\n 63  43 Ket\n 65  12 CBraPos 2\n 68     [\\x{150}-\\x{250}\\x{300}]\n 77  27 Alt\n 79     [^AS-Uas-u\\x{800}\\x{d800}-\\x{dfff}]\n104  39 KetRpos\n106     [^\\x08#\\x{500}\\x{1000}]{3,5}\n133     $\n134 134 Ket\n136     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  name    1\n  other   2\nOptions: anchored extended\nNo first char\nNo need char\nSubject length lower bound = 6\nNo starting char list\n\n<!testsaved32LE-1\nCompiled pattern loaded from testsaved32LE-1\nStudy data loaded from testsaved32LE-1\nError -28 from pcre16_fullinfo(0)\nRunning in 16-bit mode but pattern was compiled in 32-bit mode\n\n<!testsaved32BE-1\nCompiled pattern loaded from testsaved32BE-1\nStudy data loaded from testsaved32BE-1\nError -28 from pcre16_fullinfo(0)\nRunning in 16-bit mode but pattern was compiled in 32-bit mode\n\n/-- End of testinput21 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput21-32",
    "content": "/-- Tests for reloading pre-compiled patterns. The first one gives an error\nright away, and can be any old pattern compiled in 8-bit mode (\"abc\" is\ntypical). The others require the link size to be 2. */x\n\n<!testsaved8\nCompiled pattern loaded from testsaved8\nNo study data\nError -28 from pcre32_fullinfo(0)\nRunning in 32-bit mode but pattern was compiled in 8-bit mode\n\n%-- Generated from: \n    /^[aL](?P<name>(?:[AaLl]+)[^xX-]*?)(?P<other>[\\x{150}-\\x{250}\\x{300}]|\n      [^\\x{800}aAs-uS-U\\x{d800}-\\x{dfff}])++[^#\\b\\x{500}\\x{1000}]{3,5}$\n      /x\n\n    In 16-bit mode with options:  S>testdata/saved16LE-1\n                                 FS>testdata/saved16BE-1\n    In 32-bit mode with options:  S>testdata/saved32LE-1\n                                 FS>testdata/saved32BE-1\n--%x\n\n<!testsaved16LE-1\nCompiled pattern loaded from testsaved16LE-1\nStudy data loaded from testsaved16LE-1\nError -28 from pcre32_fullinfo(0)\nRunning in 32-bit mode but pattern was compiled in 16-bit mode\n\n<!testsaved16BE-1\nCompiled pattern loaded from testsaved16BE-1\nStudy data loaded from testsaved16BE-1\nError -28 from pcre32_fullinfo(0)\nRunning in 32-bit mode but pattern was compiled in 16-bit mode\n\n<!testsaved32LE-1\nCompiled pattern loaded from testsaved32LE-1\nStudy data loaded from testsaved32LE-1\n------------------------------------------------------------------\n  0  94 Bra\n  2     ^\n  3     [La]\n 12  27 CBra 1\n 15  12 Bra\n 17     [ALal]+\n 27  12 Ket\n 29     [\\x00-,.-WY-wy-\\xff] (neg)*?\n 39  27 Ket\n 41  12 CBraPos 2\n 44     [\\x{150}-\\x{250}\\x{300}]\n 53  19 Alt\n 55     [^AS-Uas-u\\x{800}\\x{d800}-\\x{dfff}]\n 72  31 KetRpos\n 74     [^\\x08#\\x{500}\\x{1000}]{3,5}\n 93     $\n 94  94 Ket\n 96     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  name    1\n  other   2\nOptions: anchored extended\nNo first char\nNo need char\nSubject length lower bound = 6\nNo starting char list\n\n<!testsaved32BE-1\nCompiled pattern loaded from testsaved32BE-1\nStudy data loaded from testsaved32BE-1\n------------------------------------------------------------------\n  0  94 Bra\n  2     ^\n  3     [La]\n 12  27 CBra 1\n 15  12 Bra\n 17     [ALal]+\n 27  12 Ket\n 29     [\\x00-,.-WY-wy-\\xff] (neg)*?\n 39  27 Ket\n 41  12 CBraPos 2\n 44     [\\x{150}-\\x{250}\\x{300}]\n 53  19 Alt\n 55     [^AS-Uas-u\\x{800}\\x{d800}-\\x{dfff}]\n 72  31 KetRpos\n 74     [^\\x08#\\x{500}\\x{1000}]{3,5}\n 93     $\n 94  94 Ket\n 96     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  name    1\n  other   2\nOptions: anchored extended\nNo first char\nNo need char\nSubject length lower bound = 6\nNo starting char list\n\n/-- End of testinput21 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput22-16",
    "content": "/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */\n\n%-- Generated from: \n    /(?P<cbra1>[aZ\\x{400}-\\x{10ffff}]{4,}\n      [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?|\n      [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}])\n      (?<cb2>[^az])/x \n       \n    In 16-bit mode with options:  S8>testdata/saved16LE-2\n                                 FS8>testdata/saved16BE-2\n    In 32-bit mode with options:  S8>testdata/saved32LE-2\n                                 FS8>testdata/saved32BE-2\n--%8x\n\n<!testsaved16LE-2\nCompiled pattern loaded from testsaved16LE-2\nStudy data loaded from testsaved16LE-2\n------------------------------------------------------------------\n  0 101 Bra\n  2  45 CBra 1\n  5     [Za\\x{400}-\\x{10ffff}]{4,}\n 32     [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?\n 47  30 Alt\n 49     [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}]\n 77  75 Ket\n 79  20 CBra 2\n 82     [\\x00-`b-y{-\\xff] (neg)\n 99  20 Ket\n101 101 Ket\n103     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  cb2     2\n  cbra1   1\nOptions: extended utf\nNo first char\nNo need char\nSubject length lower bound = 2\nNo starting char list\n\n<!testsaved16BE-2\nCompiled pattern loaded from testsaved16BE-2\nStudy data loaded from testsaved16BE-2\n------------------------------------------------------------------\n  0 101 Bra\n  2  45 CBra 1\n  5     [Za\\x{400}-\\x{10ffff}]{4,}\n 32     [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?\n 47  30 Alt\n 49     [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}]\n 77  75 Ket\n 79  20 CBra 2\n 82     [\\x00-`b-y{-\\xff] (neg)\n 99  20 Ket\n101 101 Ket\n103     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  cb2     2\n  cbra1   1\nOptions: extended utf\nNo first char\nNo need char\nSubject length lower bound = 2\nNo starting char list\n\n<!testsaved32LE-2\nCompiled pattern loaded from testsaved32LE-2\nStudy data loaded from testsaved32LE-2\nError -28 from pcre16_fullinfo(0)\nRunning in 16-bit mode but pattern was compiled in 32-bit mode\n\n<!testsaved32BE-2\nCompiled pattern loaded from testsaved32BE-2\nStudy data loaded from testsaved32BE-2\nError -28 from pcre16_fullinfo(0)\nRunning in 16-bit mode but pattern was compiled in 32-bit mode\n\n/-- End of testinput22 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput22-32",
    "content": "/-- Tests for reloading pre-compile patterns with UTF-16 or UTF-32 support. */\n\n%-- Generated from: \n    /(?P<cbra1>[aZ\\x{400}-\\x{10ffff}]{4,}\n      [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?|\n      [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}])\n      (?<cb2>[^az])/x \n       \n    In 16-bit mode with options:  S8>testdata/saved16LE-2\n                                 FS8>testdata/saved16BE-2\n    In 32-bit mode with options:  S8>testdata/saved32LE-2\n                                 FS8>testdata/saved32BE-2\n--%8x\n\n<!testsaved16LE-2\nCompiled pattern loaded from testsaved16LE-2\nStudy data loaded from testsaved16LE-2\nError -28 from pcre32_fullinfo(0)\nRunning in 32-bit mode but pattern was compiled in 16-bit mode\n\n<!testsaved16BE-2\nCompiled pattern loaded from testsaved16BE-2\nStudy data loaded from testsaved16BE-2\nError -28 from pcre32_fullinfo(0)\nRunning in 32-bit mode but pattern was compiled in 16-bit mode\n\n<!testsaved32LE-2\nCompiled pattern loaded from testsaved32LE-2\nStudy data loaded from testsaved32LE-2\n------------------------------------------------------------------\n  0  70 Bra\n  2  33 CBra 1\n  5     [Za\\x{400}-\\x{10ffff}]{4,}\n 23     [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?\n 35  19 Alt\n 37     [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}]\n 54  52 Ket\n 56  12 CBra 2\n 59     [\\x00-`b-y{-\\xff] (neg)\n 68  12 Ket\n 70  70 Ket\n 72     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  cb2     2\n  cbra1   1\nOptions: extended utf\nNo first char\nNo need char\nSubject length lower bound = 2\nNo starting char list\n\n<!testsaved32BE-2\nCompiled pattern loaded from testsaved32BE-2\nStudy data loaded from testsaved32BE-2\n------------------------------------------------------------------\n  0  70 Bra\n  2  33 CBra 1\n  5     [Za\\x{400}-\\x{10ffff}]{4,}\n 23     [\\x{f123}\\x{10039}\\x{20000}-\\x{21234}]?\n 35  19 Alt\n 37     [A-Cx-z\\x{100000}-\\x{1000a7}\\x{101234}]\n 54  52 Ket\n 56  12 CBra 2\n 59     [\\x00-`b-y{-\\xff] (neg)\n 68  12 Ket\n 70  70 Ket\n 72     End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nNamed capturing subpatterns:\n  cb2     2\n  cbra1   1\nOptions: extended utf\nNo first char\nNo need char\nSubject length lower bound = 2\nNo starting char list\n\n/-- End of testinput22 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput23",
    "content": "/-- Tests for the 16-bit library only */\n\n< forbid 8W\n\n/-- Check maximum non-UTF character size --/\n\n/\\x{ffff}/\n    A\\x{ffff}B\n 0: \\x{ffff}\n\n/\\x{10000}/\nFailed: character value in \\x{} or \\o{} is too large at offset 8\n\n/\\o{20000}/\n\n/-- Check character ranges --/\n\n/[\\H]/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff\\x{100}-\\x{167f}\\x{1681}-\\x{180d}\\x{180f}-\\x{1fff}\\x{200b}-\\x{202e}\\x{2030}-\\x{205e}\\x{2060}-\\x{2fff}\\x{3001}-\\x{ffff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x0a \\x0b \n  \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \n  \\x1b \\x1c \\x1d \\x1e \\x1f ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 \n  : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ \n  _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \n  \\x81 \\x82 \\x83 \\x84 \\x85 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \n  \\x90 \\x91 \\x92 \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \n  \\x9f \\xa1 \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \n  \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \n  \\xbe \\xbf \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \n  \\xcd \\xce \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \n  \\xdc \\xdd \\xde \\xdf \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \n  \\xeb \\xec \\xed \\xee \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \n  \\xfa \\xfb \\xfc \\xfd \\xfe \\xff \n\n/[\\V]/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x09\\x0e-\\x84\\x86-\\xff\\x{100}-\\x{2027}\\x{202a}-\\x{ffff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0e \n  \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \\x1b \\x1c \\x1d \n  \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > \n  ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c \n  d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \\x81 \\x82 \n  \\x83 \\x84 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \\x90 \\x91 \\x92 \n  \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \\x9f \\xa0 \\xa1 \n  \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \\xaf \\xb0 \n  \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \\xbe \\xbf \n  \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \n  \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \n  \\xde \\xdf \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \n  \\xed \\xee \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \n  \\xfc \\xfd \\xfe \\xff \n\n/-- End of testinput23 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput24",
    "content": "/-- Tests for the 16-bit library with UTF-16 support only */\n\n< forbid W\n\n/bad/8\n    \\x{d800}\nError -10 (bad UTF-16 string) offset=0 reason=1\n\n/short/8\n    \\P\\P\\x{d800}\nError -25 (short UTF-16 string) offset=0 reason=1\n\n/-- End of testinput24 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput25",
    "content": "/-- Tests for the 32-bit library only */\n\n< forbid 8W\n\n/-- Check maximum character size --/\n\n/\\x{110000}/\n\n/\\x{7fffffff}/\n\n/\\x{80000000}/\n\n/\\x{ffffffff}/\n\n/\\x{100000000}/\nFailed: character value in \\x{} or \\o{} is too large at offset 12\n\n/\\o{17777777777}/\n\n/\\o{20000000000}/\n\n/\\o{37777777777}/\n\n/\\o{40000000000}/\nFailed: character value in \\x{} or \\o{} is too large at offset 14\n\n/\\x{7fffffff}\\x{7fffffff}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\x{7fffffff}\nNeed char = \\x{7fffffff}\n\n/\\x{80000000}\\x{80000000}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\x{80000000}\nNeed char = \\x{80000000}\n\n/\\x{ffffffff}\\x{ffffffff}/I\nCapturing subpattern count = 0\nNo options\nFirst char = \\x{ffffffff}\nNeed char = \\x{ffffffff}\n\n/-- Non-UTF characters --/\n\n/\\C{2,3}/\n    \\x{400000}\\x{400001}\\x{400002}\\x{400003}\n 0: \\x{400000}\\x{400001}\\x{400002}\n\n/\\x{400000}\\x{800000}/iDZ\n------------------------------------------------------------------\n        Bra\n     /i \\x{400000}\\x{800000}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless\nFirst char = \\x{400000}\nNeed char = \\x{800000}\n\n/-- Check character ranges --/\n\n/[\\H]/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff\\x{100}-\\x{167f}\\x{1681}-\\x{180d}\\x{180f}-\\x{1fff}\\x{200b}-\\x{202e}\\x{2030}-\\x{205e}\\x{2060}-\\x{2fff}\\x{3001}-\\x{ffffffff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x0a \\x0b \n  \\x0c \\x0d \\x0e \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \n  \\x1b \\x1c \\x1d \\x1e \\x1f ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 \n  : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ \n  _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \n  \\x81 \\x82 \\x83 \\x84 \\x85 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \n  \\x90 \\x91 \\x92 \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \n  \\x9f \\xa1 \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \n  \\xaf \\xb0 \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \n  \\xbe \\xbf \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \n  \\xcd \\xce \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \n  \\xdc \\xdd \\xde \\xdf \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \n  \\xeb \\xec \\xed \\xee \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \n  \\xfa \\xfb \\xfc \\xfd \\xfe \\xff \n\n/[\\V]/BZSI\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x09\\x0e-\\x84\\x86-\\xff\\x{100}-\\x{2027}\\x{202a}-\\x{ffffffff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: \\x00 \\x01 \\x02 \\x03 \\x04 \\x05 \\x06 \\x07 \\x08 \\x09 \\x0e \n  \\x0f \\x10 \\x11 \\x12 \\x13 \\x14 \\x15 \\x16 \\x17 \\x18 \\x19 \\x1a \\x1b \\x1c \\x1d \n  \\x1e \\x1f \\x20 ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > \n  ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c \n  d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \\x7f \\x80 \\x81 \\x82 \n  \\x83 \\x84 \\x86 \\x87 \\x88 \\x89 \\x8a \\x8b \\x8c \\x8d \\x8e \\x8f \\x90 \\x91 \\x92 \n  \\x93 \\x94 \\x95 \\x96 \\x97 \\x98 \\x99 \\x9a \\x9b \\x9c \\x9d \\x9e \\x9f \\xa0 \\xa1 \n  \\xa2 \\xa3 \\xa4 \\xa5 \\xa6 \\xa7 \\xa8 \\xa9 \\xaa \\xab \\xac \\xad \\xae \\xaf \\xb0 \n  \\xb1 \\xb2 \\xb3 \\xb4 \\xb5 \\xb6 \\xb7 \\xb8 \\xb9 \\xba \\xbb \\xbc \\xbd \\xbe \\xbf \n  \\xc0 \\xc1 \\xc2 \\xc3 \\xc4 \\xc5 \\xc6 \\xc7 \\xc8 \\xc9 \\xca \\xcb \\xcc \\xcd \\xce \n  \\xcf \\xd0 \\xd1 \\xd2 \\xd3 \\xd4 \\xd5 \\xd6 \\xd7 \\xd8 \\xd9 \\xda \\xdb \\xdc \\xdd \n  \\xde \\xdf \\xe0 \\xe1 \\xe2 \\xe3 \\xe4 \\xe5 \\xe6 \\xe7 \\xe8 \\xe9 \\xea \\xeb \\xec \n  \\xed \\xee \\xef \\xf0 \\xf1 \\xf2 \\xf3 \\xf4 \\xf5 \\xf6 \\xf7 \\xf8 \\xf9 \\xfa \\xfb \n  \\xfc \\xfd \\xfe \\xff \n\n/-- End of testinput25 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput26",
    "content": "/-- Tests for the 32-bit library with UTF-32 support only */\n\n< forbid W\n\n/-- Non-UTF characters --/\n\n/\\x{110000}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 9\n\n/\\o{4200000}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 10\n\n/\\C/8\n    \\x{110000}\nError -10 (bad UTF-32 string) offset=0 reason=3\n\n/-- End of testinput26 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput3",
    "content": "/-- This set of tests checks local-specific features, using the \"fr_FR\" locale. \n    It is not Perl-compatible. When run via RunTest, the locale is edited to\n    be whichever of \"fr_FR\", \"french\", or \"fr\" is found to exist. There is\n    different version of this file called wintestinput3 for use on Windows,\n    where the locale is called \"french\" and the tests are run using\n    RunTest.bat. --/\n\n< forbid 8W \n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\w]+/Lfr_FR\n    cole\n 0: cole\n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\W]+/\n    cole\n 0: \\xc9\n\n/^[\\W]+/Lfr_FR\n    *** Failers\n 0: *** \n    cole\nNo match\n\n/[\\b]/\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/[\\b]/Lfr_FR\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/^\\w+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^\\w+/Lfr_FR\n    cole\n 0: cole\n\n/(.+)\\b(.+)/\n    cole\n 0: \\xc9cole\n 1: \\xc9\n 2: cole\n\n/(.+)\\b(.+)/Lfr_FR\n    *** Failers\n 0: *** Failers\n 1: *** \n 2: Failers\n    cole\nNo match\n\n/cole/i\n    cole\n 0: \\xc9cole\n    *** Failers\nNo match\n    cole\nNo match\n\n/cole/iLfr_FR\n    cole\n 0: cole\n    cole\n 0: cole\n\n/\\w/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n\n/\\w/ISLfr_FR\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n                                       \n                              \n\n/^[\\xc8-\\xc9]/iLfr_FR\n    cole\n 0: \n    cole\n 0: \n\n/^[\\xc8-\\xc9]/Lfr_FR\n    cole\n 0: \n    *** Failers \nNo match\n    cole\nNo match\n\n/\\W+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[\\W]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[^[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/\\w+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[\\w]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR \n------------------------------------------------------------------\n        Bra\n        [A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff]\n        [a-z\\xb5\\xdf-\\xf6\\xf8-\\xff]\n        [A-Z\\xc0-\\xd6\\xd8-\\xde]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/-- End of testinput3 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput3A",
    "content": "/-- This set of tests checks local-specific features, using the \"fr_FR\" locale. \n    It is not Perl-compatible. When run via RunTest, the locale is edited to\n    be whichever of \"fr_FR\", \"french\", or \"fr\" is found to exist. There is\n    different version of this file called wintestinput3 for use on Windows,\n    where the locale is called \"french\" and the tests are run using\n    RunTest.bat. --/\n\n< forbid 8W \n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\w]+/Lfr_FR\n    cole\n 0: cole\n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\W]+/\n    cole\n 0: \\xc9\n\n/^[\\W]+/Lfr_FR\n    *** Failers\n 0: *** \n    cole\nNo match\n\n/[\\b]/\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/[\\b]/Lfr_FR\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/^\\w+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^\\w+/Lfr_FR\n    cole\n 0: cole\n\n/(.+)\\b(.+)/\n    cole\n 0: \\xc9cole\n 1: \\xc9\n 2: cole\n\n/(.+)\\b(.+)/Lfr_FR\n    *** Failers\n 0: *** Failers\n 1: *** \n 2: Failers\n    cole\nNo match\n\n/cole/i\n    cole\n 0: \\xc9cole\n    *** Failers\nNo match\n    cole\nNo match\n\n/cole/iLfr_FR\n    cole\n 0: cole\n    cole\n 0: cole\n\n/\\w/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n\n/\\w/ISLfr_FR\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n                                       \n                              \n\n/^[\\xc8-\\xc9]/iLfr_FR\n    cole\n 0: \n    cole\n 0: \n\n/^[\\xc8-\\xc9]/Lfr_FR\n    cole\n 0: \n    *** Failers \nNo match\n    cole\nNo match\n\n/\\W+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[\\W]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[^[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/\\w+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[\\w]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR \n------------------------------------------------------------------\n        Bra\n        [A-Za-z\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff]\n        [a-z\\xaa\\xb5\\xba\\xdf-\\xf6\\xf8-\\xff]\n        [A-Z\\xc0-\\xd6\\xd8-\\xde]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/-- End of testinput3 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput3B",
    "content": "/-- This set of tests checks local-specific features, using the \"fr_FR\" locale. \n    It is not Perl-compatible. When run via RunTest, the locale is edited to\n    be whichever of \"fr_FR\", \"french\", or \"fr\" is found to exist. There is\n    different version of this file called wintestinput3 for use on Windows,\n    where the locale is called \"french\" and the tests are run using\n    RunTest.bat. --/\n\n< forbid 8W \n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\w]+/Lfr_FR\n    cole\n 0: cole\n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\W]+/\n    cole\n 0: \\xc9\n\n/^[\\W]+/Lfr_FR\n    *** Failers\n 0: *** \n    cole\nNo match\n\n/[\\b]/\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/[\\b]/Lfr_FR\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/^\\w+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^\\w+/Lfr_FR\n    cole\n 0: cole\n\n/(.+)\\b(.+)/\n    cole\n 0: \\xc9cole\n 1: \\xc9\n 2: cole\n\n/(.+)\\b(.+)/Lfr_FR\n    *** Failers\n 0: *** Failers\n 1: *** \n 2: Failers\n    cole\nNo match\n\n/cole/i\n    cole\n 0: \\xc9cole\n    *** Failers\nNo match\n    cole\nNo match\n\n/cole/iLfr_FR\n    cole\n 0: cole\n    cole\n 0: cole\n\n/\\w/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n\n/\\w/ISLfr_FR\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n                                       \n                              \n\n/^[\\xc8-\\xc9]/iLfr_FR\n    cole\n 0: \n    cole\n 0: \n\n/^[\\xc8-\\xc9]/Lfr_FR\n    cole\n 0: \n    *** Failers \nNo match\n    cole\nNo match\n\n/\\W+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[\\W]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[^[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/\\w+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[\\w]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[[:alpha:]]+/Lfr_FR\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfr_FR \n------------------------------------------------------------------\n        Bra\n        [A-Za-z\\x83\\x8a\\x8c\\x8e\\x9a\\x9c\\x9e\\x9f\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff]\n        [a-z\\x83\\x9a\\x9c\\x9e\\xaa\\xb5\\xba\\xdf-\\xf6\\xf8-\\xff]\n        [A-Z\\x8a\\x8c\\x8e\\x9f\\xc0-\\xd6\\xd8-\\xde]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/-- End of testinput3 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput4",
    "content": "/-- This set of tests is for UTF support, excluding Unicode properties. It is\n    compatible with all versions of Perl >= 5.10 and both the 8-bit and 16-bit\n    PCRE libraries. --/\n    \n< forbid 9?=ABCDEFfGILMNPTUWXZ<\n   \n/a.b/8\n    acb\n 0: acb\n    a\\x7fb\n 0: a\\x{7f}b\n    a\\x{100}b \n 0: a\\x{100}b\n    *** Failers\nNo match\n    a\\nb  \nNo match\n\n/a(.{3})b/8\n    a\\x{4000}xyb \n 0: a\\x{4000}xyb\n 1: \\x{4000}xy\n    a\\x{4000}\\x7fyb \n 0: a\\x{4000}\\x{7f}yb\n 1: \\x{4000}\\x{7f}y\n    a\\x{4000}\\x{100}yb \n 0: a\\x{4000}\\x{100}yb\n 1: \\x{4000}\\x{100}y\n    *** Failers\nNo match\n    a\\x{4000}b \nNo match\n    ac\\ncb \nNo match\n\n/a(.*?)(.)/\n    a\\xc0\\x88b\n 0: a\\xc0\n 1: \n 2: \\xc0\n\n/a(.*?)(.)/8\n    a\\x{100}b\n 0: a\\x{100}\n 1: \n 2: \\x{100}\n\n/a(.*)(.)/\n    a\\xc0\\x88b\n 0: a\\xc0\\x88b\n 1: \\xc0\\x88\n 2: b\n\n/a(.*)(.)/8\n    a\\x{100}b\n 0: a\\x{100}b\n 1: \\x{100}\n 2: b\n\n/a(.)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\\x92\n 1: \\xc0\n 2: \\x92\n\n/a(.)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}b\n 1: \\x{240}\n 2: b\n\n/a(.?)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\\x92\n 1: \\xc0\n 2: \\x92\n\n/a(.?)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}b\n 1: \\x{240}\n 2: b\n\n/a(.??)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\n 1: \n 2: \\xc0\n\n/a(.??)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}\n 1: \n 2: \\x{240}\n\n/a(.{3})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n 1: \\x{1234}xy\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n 1: \\x{1234}\\x{4321}y\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n 1: \\x{1234}\\x{4321}\\x{3412}\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    ac\\ncb \nNo match\n\n/a(.{3,})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n 1: \\x{1234}xy\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n 1: \\x{1234}\\x{4321}y\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n 1: \\x{1234}\\x{4321}\\x{3412}\n    axxxxbcdefghijb \n 0: axxxxbcdefghijb\n 1: xxxxbcdefghij\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n 1: \\x{1234}\\x{4321}\\x{3412}\\x{3421}\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n\n/a(.{3,}?)b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n 1: \\x{1234}xy\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n 1: \\x{1234}\\x{4321}y\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n 1: \\x{1234}\\x{4321}\\x{3412}\n    axxxxbcdefghijb \n 0: axxxxb\n 1: xxxx\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n 1: \\x{1234}\\x{4321}\\x{3412}\\x{3421}\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n\n/a(.{3,5})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n 1: \\x{1234}xy\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n 1: \\x{1234}\\x{4321}y\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n 1: \\x{1234}\\x{4321}\\x{3412}\n    axxxxbcdefghijb \n 0: axxxxb\n 1: xxxx\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n 1: \\x{1234}\\x{4321}\\x{3412}\\x{3421}\n    axbxxbcdefghijb \n 0: axbxxb\n 1: xbxx\n    axxxxxbcdefghijb \n 0: axxxxxb\n 1: xxxxx\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    axxxxxxbcdefghijb \nNo match\n\n/a(.{3,5}?)b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n 1: \\x{1234}xy\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n 1: \\x{1234}\\x{4321}y\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n 1: \\x{1234}\\x{4321}\\x{3412}\n    axxxxbcdefghijb \n 0: axxxxb\n 1: xxxx\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n 1: \\x{1234}\\x{4321}\\x{3412}\\x{3421}\n    axbxxbcdefghijb \n 0: axbxxb\n 1: xbxx\n    axxxxxbcdefghijb \n 0: axxxxxb\n 1: xxxxx\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    axxxxxxbcdefghijb \nNo match\n\n/^[a\\x{c0}]/8\n    *** Failers\nNo match\n    \\x{100}\nNo match\n\n/(?<=aXb)cd/8\n    aXbcd\n 0: cd\n\n/(?<=a\\x{100}b)cd/8\n    a\\x{100}bcd\n 0: cd\n\n/(?<=a\\x{100000}b)cd/8\n    a\\x{100000}bcd\n 0: cd\n    \n/(?:\\x{100}){3}b/8\n    \\x{100}\\x{100}\\x{100}b\n 0: \\x{100}\\x{100}\\x{100}b\n    *** Failers \nNo match\n    \\x{100}\\x{100}b\nNo match\n\n/\\x{ab}/8\n    \\x{ab} \n 0: \\x{ab}\n    \\xc2\\xab\n 0: \\x{ab}\n    *** Failers \nNo match\n    \\x00{ab}\nNo match\n\n/(?<=(.))X/8\n    WXYZ\n 0: X\n 1: W\n    \\x{256}XYZ \n 0: X\n 1: \\x{256}\n    *** Failers\nNo match\n    XYZ \nNo match\n\n/[^a]+/8g\n    bcd\n 0: bcd\n    \\x{100}aY\\x{256}Z \n 0: \\x{100}\n 0: Y\\x{256}Z\n    \n/^[^a]{2}/8\n    \\x{100}bc\n 0: \\x{100}b\n \n/^[^a]{2,}/8\n    \\x{100}bcAa\n 0: \\x{100}bcA\n\n/^[^a]{2,}?/8\n    \\x{100}bca\n 0: \\x{100}b\n\n/[^a]+/8ig\n    bcd\n 0: bcd\n    \\x{100}aY\\x{256}Z \n 0: \\x{100}\n 0: Y\\x{256}Z\n    \n/^[^a]{2}/8i\n    \\x{100}bc\n 0: \\x{100}b\n \n/^[^a]{2,}/8i\n    \\x{100}bcAa\n 0: \\x{100}bc\n\n/^[^a]{2,}?/8i\n    \\x{100}bca\n 0: \\x{100}b\n\n/\\x{100}{0,0}/8\n    abcd\n 0: \n \n/\\x{100}?/8\n    abcd\n 0: \n    \\x{100}\\x{100} \n 0: \\x{100}\n\n/\\x{100}{0,3}/8 \n    \\x{100}\\x{100} \n 0: \\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\n    \n/\\x{100}*/8\n    abce\n 0: \n    \\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{1,1}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\n\n/\\x{100}{1,3}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\n\n/\\x{100}+/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3}/8\n    abcd\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3,5}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3,}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/(?<=a\\x{100}{2}b)X/8+\n    Xyyya\\x{100}\\x{100}bXzzz\n 0: X\n 0+ zzz\n\n/\\D*/8\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\D*/8\n  \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\D/8\n    1X2\n 0: X\n    1\\x{100}2 \n 0: \\x{100}\n  \n/>\\S/8\n    > >X Y\n 0: >X\n    > >\\x{100} Y\n 0: >\\x{100}\n  \n/\\d/8\n    \\x{100}3\n 0: 3\n    \n/\\s/8\n    \\x{100} X\n 0:  \n    \n/\\D+/8\n    12abcd34\n 0: abcd\n    *** Failers\n 0: *** Failers\n    1234  \nNo match\n\n/\\D{2,3}/8\n    12abcd34\n 0: abc\n    12ab34\n 0: ab\n    *** Failers  \n 0: ***\n    1234\nNo match\n    12a34  \nNo match\n\n/\\D{2,3}?/8\n    12abcd34\n 0: ab\n    12ab34\n 0: ab\n    *** Failers  \n 0: **\n    1234\nNo match\n    12a34  \nNo match\n\n/\\d+/8\n    12abcd34\n 0: 12\n    *** Failers\nNo match\n\n/\\d{2,3}/8\n    12abcd34\n 0: 12\n    1234abcd\n 0: 123\n    *** Failers  \nNo match\n    1.4 \nNo match\n\n/\\d{2,3}?/8\n    12abcd34\n 0: 12\n    1234abcd\n 0: 12\n    *** Failers  \nNo match\n    1.4 \nNo match\n\n/\\S+/8\n    12abcd34\n 0: 12abcd34\n    *** Failers\n 0: ***\n    \\    \\ \nNo match\n\n/\\S{2,3}/8\n    12abcd34\n 0: 12a\n    1234abcd\n 0: 123\n    *** Failers\n 0: ***\n    \\     \\  \nNo match\n\n/\\S{2,3}?/8\n    12abcd34\n 0: 12\n    1234abcd\n 0: 12\n    *** Failers\n 0: **\n    \\     \\  \nNo match\n\n/>\\s+</8+\n    12>      <34\n 0: >      <\n 0+ 34\n    *** Failers\nNo match\n\n/>\\s{2,3}</8+\n    ab>  <cd\n 0: >  <\n 0+ cd\n    ab>   <ce\n 0: >   <\n 0+ ce\n    *** Failers\nNo match\n    ab>    <cd \nNo match\n\n/>\\s{2,3}?</8+\n    ab>  <cd\n 0: >  <\n 0+ cd\n    ab>   <ce\n 0: >   <\n 0+ ce\n    *** Failers\nNo match\n    ab>    <cd \nNo match\n\n/\\w+/8\n    12      34\n 0: 12\n    *** Failers\n 0: Failers\n    +++=*! \nNo match\n\n/\\w{2,3}/8\n    ab  cd\n 0: ab\n    abcd ce\n 0: abc\n    *** Failers\n 0: Fai\n    a.b.c\nNo match\n\n/\\w{2,3}?/8\n    ab  cd\n 0: ab\n    abcd ce\n 0: ab\n    *** Failers\n 0: Fa\n    a.b.c\nNo match\n\n/\\W+/8\n    12====34\n 0: ====\n    *** Failers\n 0: *** \n    abcd \nNo match\n\n/\\W{2,3}/8\n    ab====cd\n 0: ===\n    ab==cd\n 0: ==\n    *** Failers\n 0: ***\n    a.b.c\nNo match\n\n/\\W{2,3}?/8\n    ab====cd\n 0: ==\n    ab==cd\n 0: ==\n    *** Failers\n 0: **\n    a.b.c\nNo match\n\n/[\\x{100}]/8\n    \\x{100}\n 0: \\x{100}\n    Z\\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[Z\\x{100}]/8\n    Z\\x{100}\n 0: Z\n    \\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   *** Failers  \nNo match\n\n/[\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   *** Failers  \nNo match\n\n/[z-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   abzcd\n 0: z\n   ab|cd  \n 0: |\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[Q\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[Qz-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   abzcd\n 0: z\n   ab|cd  \n 0: |\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n   *** Failers  \nNo match\n\n/[\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\n   *** Failers  \nNo match\n\n/(?<=[\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n 0: X\n    abc\\x{100}X \n 0: X\n    *** Failers\nNo match\n    X  \nNo match\n\n/(?<=[Q\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n 0: X\n    abc\\x{100}X \n 0: X\n    abQX \n 0: X\n    *** Failers\nNo match\n    X  \nNo match\n\n/(?<=[\\x{100}\\x{200}]{3})X/8\n    abc\\x{100}\\x{200}\\x{100}X\n 0: X\n    *** Failers\nNo match\n    abc\\x{200}X\nNo match\n    X  \nNo match\n\n/[^\\x{100}\\x{200}]X/8\n    AX\n 0: AX\n    \\x{150}X\n 0: \\x{150}X\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{200}X   \nNo match\n\n/[^Q\\x{100}\\x{200}]X/8\n    AX\n 0: AX\n    \\x{150}X\n 0: \\x{150}X\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{200}X   \nNo match\n    QX \nNo match\n\n/[^\\x{100}-\\x{200}]X/8\n    AX\n 0: AX\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{150}X\nNo match\n    \\x{200}X   \nNo match\n\n/[z-\\x{100}]/8i\n    z\n 0: z\n    Z \n 0: Z\n    \\x{100}\n 0: \\x{100}\n    *** Failers\nNo match\n    \\x{102}\nNo match\n    y    \nNo match\n\n/[\\xFF]/\n    >\\xff<\n 0: \\xff\n\n/[\\xff]/8\n    >\\x{ff}<\n 0: \\x{ff}\n\n/[^\\xFF]/\n    XYZ\n 0: X\n\n/[^\\xff]/8\n    XYZ\n 0: X\n    \\x{123} \n 0: \\x{123}\n\n/^[ac]*b/8\n  xb\nNo match\n\n/^[ac\\x{100}]*b/8\n  xb\nNo match\n\n/^[^x]*b/8i\n  xb\nNo match\n\n/^[^x]*b/8\n  xb\nNo match\n  \n/^\\d*b/8\n  xb \nNo match\n\n/(|a)/g8\n    catac\n 0: \n 1: \n 0: \n 1: \n 0: a\n 1: a\n 0: \n 1: \n 0: \n 1: \n 0: a\n 1: a\n 0: \n 1: \n 0: \n 1: \n    a\\x{256}a \n 0: \n 1: \n 0: a\n 1: a\n 0: \n 1: \n 0: \n 1: \n 0: a\n 1: a\n 0: \n 1: \n\n/^\\x{85}$/8i\n    \\x{85}\n 0: \\x{85}\n\n/^ሴ/8\n    ሴ \n 0: \\x{1234}\n\n/^\\ሴ/8\n    ሴ \n 0: \\x{1234}\n\n\"(?s)(.{1,5})\"8\n    abcdefg\n 0: abcde\n 1: abcde\n    ab\n 0: ab\n 1: ab\n\n/a*\\x{100}*\\w/8\n    a \n 0: a\n\n/\\S\\S/8g\n    A\\x{a3}BC\n 0: A\\x{a3}\n 0: BC\n    \n/\\S{2}/8g\n    A\\x{a3}BC\n 0: A\\x{a3}\n 0: BC\n    \n/\\W\\W/8g\n    +\\x{a3}== \n 0: +\\x{a3}\n 0: ==\n\n/\\W{2}/8g\n    +\\x{a3}== \n 0: +\\x{a3}\n 0: ==\n\n/\\S/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n 0: \\x{442}\n 0: \\x{435}\n 0: \\x{441}\n 0: \\x{442}\n\n/[\\S]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n 0: \\x{442}\n 0: \\x{435}\n 0: \\x{441}\n 0: \\x{442}\n\n/\\D/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n 0: \\x{442}\n 0: \\x{435}\n 0: \\x{441}\n 0: \\x{442}\n\n/[\\D]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n 0: \\x{442}\n 0: \\x{435}\n 0: \\x{441}\n 0: \\x{442}\n\n/\\W/8g\n    \\x{2442}\\x{2435}\\x{2441}\\x{2442}\n 0: \\x{2442}\n 0: \\x{2435}\n 0: \\x{2441}\n 0: \\x{2442}\n\n/[\\W]/8g\n    \\x{2442}\\x{2435}\\x{2441}\\x{2442}\n 0: \\x{2442}\n 0: \\x{2435}\n 0: \\x{2441}\n 0: \\x{2442}\n    \n/[\\S\\s]*/8\n    abc\\n\\r\\x{442}\\x{435}\\x{441}\\x{442}xyz \n 0: abc\\x{0a}\\x{0d}\\x{442}\\x{435}\\x{441}\\x{442}xyz\n\n/[\\x{41f}\\S]/8g\n    \\x{442}\\x{435}\\x{441}\\x{442}\n 0: \\x{442}\n 0: \\x{435}\n 0: \\x{441}\n 0: \\x{442}\n\n/.[^\\S]./8g\n    abc def\\x{442}\\x{443}xyz\\npqr\n 0: c d\n 0: z\\x{0a}p\n\n/.[^\\S\\n]./8g\n    abc def\\x{442}\\x{443}xyz\\npqr\n 0: c d\n\n/[[:^alnum:]]/8g  \n    +\\x{2442}\n 0: +\n 0: \\x{2442}\n    \n/[[:^alpha:]]/8g \n    +\\x{2442}\n 0: +\n 0: \\x{2442}\n    \n/[[:^ascii:]]/8g \n    A\\x{442}\n 0: \\x{442}\n    \n/[[:^blank:]]/8g \n    A\\x{442}\n 0: A\n 0: \\x{442}\n    \n/[[:^cntrl:]]/8g \n    A\\x{442}\n 0: A\n 0: \\x{442}\n    \n/[[:^digit:]]/8g \n    A\\x{442}\n 0: A\n 0: \\x{442}\n    \n/[[:^graph:]]/8g \n    \\x19\\x{e01ff}\n 0: \\x{19}\n 0: \\x{e01ff}\n    \n/[[:^lower:]]/8g \n    A\\x{422}\n 0: A\n 0: \\x{422}\n    \n/[[:^print:]]/8g \n    \\x{19}\\x{e01ff}\n 0: \\x{19}\n 0: \\x{e01ff}\n    \n/[[:^punct:]]/8g \n    A\\x{442}\n 0: A\n 0: \\x{442}\n    \n/[[:^space:]]/8g \n    A\\x{442}\n 0: A\n 0: \\x{442}\n    \n/[[:^upper:]]/8g \n    a\\x{442}\n 0: a\n 0: \\x{442}\n    \n/[[:^word:]]/8g  \n    +\\x{2442}\n 0: +\n 0: \\x{2442}\n    \n/[[:^xdigit:]]/8g\n    M\\x{442}\n 0: M\n 0: \\x{442}\n\n/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİĲĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼǄǇǊǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮǱǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĳĵķĸĺļľŀłńņňŉŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿǆǉǌǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰǳǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥﬀﬁﬂﬃﬄﬅﬆﬓﬔﬕﬖﬗ\\d-_^]/8\n\n/^[^d]*?$/\n    abc\n 0: abc\n\n/^[^d]*?$/8\n    abc\n 0: abc\n\n/^[^d]*?$/i\n    abc\n 0: abc\n\n/^[^d]*?$/8i\n    abc\n 0: abc\n\n/(?i)[\\xc3\\xa9\\xc3\\xbd]|[\\xc3\\xa9\\xc3\\xbdA]/8\n\n/^[a\\x{c0}]b/8\n    \\x{c0}b\n 0: \\x{c0}b\n    \n/^([a\\x{c0}]*?)aa/8\n    a\\x{c0}aaaa/ \n 0: a\\x{c0}aa\n 1: a\\x{c0}\n\n/^([a\\x{c0}]*?)aa/8\n    a\\x{c0}aaaa/ \n 0: a\\x{c0}aa\n 1: a\\x{c0}\n    a\\x{c0}a\\x{c0}aaa/ \n 0: a\\x{c0}a\\x{c0}aa\n 1: a\\x{c0}a\\x{c0}\n\n/^([a\\x{c0}]*)aa/8\n    a\\x{c0}aaaa/ \n 0: a\\x{c0}aaaa\n 1: a\\x{c0}aa\n    a\\x{c0}a\\x{c0}aaa/ \n 0: a\\x{c0}a\\x{c0}aaa\n 1: a\\x{c0}a\\x{c0}a\n\n/^([a\\x{c0}]*)a\\x{c0}/8\n    a\\x{c0}aaaa/ \n 0: a\\x{c0}\n 1: \n    a\\x{c0}a\\x{c0}aaa/ \n 0: a\\x{c0}a\\x{c0}\n 1: a\\x{c0}\n\n/A*/g8\n    AAB\\x{123}BAA\n 0: AA\n 0: \n 0: \n 0: \n 0: AA\n 0: \n\n/(abc)\\1/8i\n   abc\nNo match\n\n/(abc)\\1/8\n   abc\nNo match\n\n/a(*:a\\x{1234}b)/8K\n    abc\n 0: a\nMK: a\\x{1234}b\n\n/a(*:a£b)/8K \n    abc\n 0: a\nMK: a\\x{a3}b\n\n/-- Noncharacters --/\n\n/./8\n    \\x{fffe}\n 0: \\x{fffe}\n    \\x{ffff}\n 0: \\x{ffff}\n    \\x{1fffe}\n 0: \\x{1fffe}\n    \\x{1ffff}\n 0: \\x{1ffff}\n    \\x{2fffe}\n 0: \\x{2fffe}\n    \\x{2ffff}\n 0: \\x{2ffff}\n    \\x{3fffe}\n 0: \\x{3fffe}\n    \\x{3ffff}\n 0: \\x{3ffff}\n    \\x{4fffe}\n 0: \\x{4fffe}\n    \\x{4ffff}\n 0: \\x{4ffff}\n    \\x{5fffe}\n 0: \\x{5fffe}\n    \\x{5ffff}\n 0: \\x{5ffff}\n    \\x{6fffe}\n 0: \\x{6fffe}\n    \\x{6ffff}\n 0: \\x{6ffff}\n    \\x{7fffe}\n 0: \\x{7fffe}\n    \\x{7ffff}\n 0: \\x{7ffff}\n    \\x{8fffe}\n 0: \\x{8fffe}\n    \\x{8ffff}\n 0: \\x{8ffff}\n    \\x{9fffe}\n 0: \\x{9fffe}\n    \\x{9ffff}\n 0: \\x{9ffff}\n    \\x{afffe}\n 0: \\x{afffe}\n    \\x{affff}\n 0: \\x{affff}\n    \\x{bfffe}\n 0: \\x{bfffe}\n    \\x{bffff}\n 0: \\x{bffff}\n    \\x{cfffe}\n 0: \\x{cfffe}\n    \\x{cffff}\n 0: \\x{cffff}\n    \\x{dfffe}\n 0: \\x{dfffe}\n    \\x{dffff}\n 0: \\x{dffff}\n    \\x{efffe}\n 0: \\x{efffe}\n    \\x{effff}\n 0: \\x{effff}\n    \\x{ffffe}\n 0: \\x{ffffe}\n    \\x{fffff}\n 0: \\x{fffff}\n    \\x{10fffe}\n 0: \\x{10fffe}\n    \\x{10ffff}\n 0: \\x{10ffff}\n    \\x{fdd0}\n 0: \\x{fdd0}\n    \\x{fdd1}\n 0: \\x{fdd1}\n    \\x{fdd2}\n 0: \\x{fdd2}\n    \\x{fdd3}\n 0: \\x{fdd3}\n    \\x{fdd4}\n 0: \\x{fdd4}\n    \\x{fdd5}\n 0: \\x{fdd5}\n    \\x{fdd6}\n 0: \\x{fdd6}\n    \\x{fdd7}\n 0: \\x{fdd7}\n    \\x{fdd8}\n 0: \\x{fdd8}\n    \\x{fdd9}\n 0: \\x{fdd9}\n    \\x{fdda}\n 0: \\x{fdda}\n    \\x{fddb}\n 0: \\x{fddb}\n    \\x{fddc}\n 0: \\x{fddc}\n    \\x{fddd}\n 0: \\x{fddd}\n    \\x{fdde}\n 0: \\x{fdde}\n    \\x{fddf}\n 0: \\x{fddf}\n    \\x{fde0}\n 0: \\x{fde0}\n    \\x{fde1}\n 0: \\x{fde1}\n    \\x{fde2}\n 0: \\x{fde2}\n    \\x{fde3}\n 0: \\x{fde3}\n    \\x{fde4}\n 0: \\x{fde4}\n    \\x{fde5}\n 0: \\x{fde5}\n    \\x{fde6}\n 0: \\x{fde6}\n    \\x{fde7}\n 0: \\x{fde7}\n    \\x{fde8}\n 0: \\x{fde8}\n    \\x{fde9}\n 0: \\x{fde9}\n    \\x{fdea}\n 0: \\x{fdea}\n    \\x{fdeb}\n 0: \\x{fdeb}\n    \\x{fdec}\n 0: \\x{fdec}\n    \\x{fded}\n 0: \\x{fded}\n    \\x{fdee}\n 0: \\x{fdee}\n    \\x{fdef}\n 0: \\x{fdef}\n\n/^\\d*\\w{4}/8\n    1234\n 0: 1234\n    123 \nNo match\n    \n/^[^b]*\\w{4}/8\n    aaaa\n 0: aaaa\n    aaa  \nNo match\n \n/^[^b]*\\w{4}/8i\n    aaaa\n 0: aaaa\n    aaa  \nNo match\n \n/^\\x{100}*.{4}/8\n    \\x{100}\\x{100}\\x{100}\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\nNo match\n\n/^\\x{100}*.{4}/8i\n    \\x{100}\\x{100}\\x{100}\\x{100}\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\nNo match\n\n/^a+[a\\x{200}]/8\n    aa\n 0: aa\n\n/^.\\B.\\B./8\n    \\x{10123}\\x{10124}\\x{10125}\n 0: \\x{10123}\\x{10124}\\x{10125}\n\n/^#[^\\x{ffff}]#[^\\x{ffff}]#[^\\x{ffff}]#/8\n    #\\x{10000}#\\x{100}#\\x{10ffff}#\n 0: #\\x{10000}#\\x{100}#\\x{10ffff}#\n\n\"[\\S\\V\\H]\"8\n\n/\\C(\\W?ſ)'?{{/8\n    \\\\C(\\\\W?ſ)'?{{\nNo match\n\n/[^\\x{100}-\\x{ffff}]*[\\x80-\\xff]/8\n    \\x{99}\\x{99}\\x{99}\n 0: \\x{99}\\x{99}\\x{99}\n\n/-- End of testinput4 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput5",
    "content": "/-- This set of tests checks the API, internals, and non-Perl stuff for UTF\n    support, excluding Unicode properties. However, tests that give different\n    results in 8-bit and 16-bit modes are excluded (see tests 16 and 17). --/\n    \n< forbid W \n\n/\\x{110000}/8DZ\nFailed: character value in \\x{} or \\o{} is too large at offset 9\n\n/\\o{4200000}/8DZ\nFailed: character value in \\x{} or \\o{} is too large at offset 10\n\n/\\x{ffffffff}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 11\n\n/\\o{37777777777}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 14\n\n/\\x{100000000}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 12\n\n/\\o{77777777777}/8\nFailed: character value in \\x{} or \\o{} is too large at offset 14\n\n/\\x{d800}/8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7\n\n/\\o{154000}/8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9\n\n/\\x{dfff}/8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7\n\n/\\o{157777}/8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 9\n\n/\\x{d7ff}/8\n\n/\\o{153777}/8\n\n/\\x{e000}/8\n\n/\\o{170000}/8\n\n/^\\x{100}a\\x{1234}/8\n    \\x{100}a\\x{1234}bcd\n 0: \\x{100}a\\x{1234}\n\n/\\x{0041}\\x{2262}\\x{0391}\\x{002e}/DZ8\n------------------------------------------------------------------\n        Bra\n        A\\x{2262}\\x{391}.\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'A'\nNeed char = '.'\n    \\x{0041}\\x{2262}\\x{0391}\\x{002e}\n 0: A\\x{2262}\\x{391}.\n    \n/.{3,5}X/DZ8\n------------------------------------------------------------------\n        Bra\n        Any{3}\n        Any{0,2}\n        X\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'X'\n    \\x{212ab}\\x{212ab}\\x{212ab}\\x{861}X\n 0: \\x{212ab}\\x{212ab}\\x{212ab}\\x{861}X\n\n/.{3,5}?/DZ8\n------------------------------------------------------------------\n        Bra\n        Any{3}\n        Any{0,2}?\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n    \\x{212ab}\\x{212ab}\\x{212ab}\\x{861}\n 0: \\x{212ab}\\x{212ab}\\x{212ab}\n\n/(?<=\\C)X/8\nFailed: \\C not allowed in lookbehind assertion at offset 6\n\n/^[ab]/8DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [ab]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored utf\nNo first char\nNo need char\n    bar\n 0: b\n    *** Failers\nNo match\n    c\nNo match\n    \\x{ff}\nNo match\n    \\x{100}  \nNo match\n\n/^[^ab]/8DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x00-`c-\\xff] (neg)\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored utf\nNo first char\nNo need char\n    c\n 0: c\n    \\x{ff}\n 0: \\x{ff}\n    \\x{100}  \n 0: \\x{100}\n    *** Failers \n 0: *\n    aaa\nNo match\n  \n/\\x{100}*(\\d+|\"(?1)\")/8\n    1234\n 0: 1234\n 1: 1234\n    \"1234\" \n 0: \"1234\"\n 1: \"1234\"\n    \\x{100}1234\n 0: \\x{100}1234\n 1: 1234\n    \"\\x{100}1234\"  \n 0: \\x{100}1234\n 1: 1234\n    \\x{100}\\x{100}12ab \n 0: \\x{100}\\x{100}12\n 1: 12\n    \\x{100}\\x{100}\"12\" \n 0: \\x{100}\\x{100}\"12\"\n 1: \"12\"\n    *** Failers \nNo match\n    \\x{100}\\x{100}abcd\nNo match\n\n/\\x{100}*/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nMay match empty string\nOptions: utf\nNo first char\nNo need char\n\n/a\\x{100}*/8DZ\n------------------------------------------------------------------\n        Bra\n        a\n        \\x{100}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNo need char\n\n/ab\\x{100}*/8DZ\n------------------------------------------------------------------\n        Bra\n        ab\n        \\x{100}*+\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nFirst char = 'a'\nNeed char = 'b'\n\n/\\x{100}*A/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        A\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNeed char = 'A'\n    A\n 0: A\n\n/\\x{100}*\\d(?R)/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        \\d\n        Recurse\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/[Z\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [Z\\x{100}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n    Z\\x{100}\n 0: Z\n    \\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[\\x{200}-\\x{100}]/8\nFailed: range out of order in character class at offset 15\n\n/[Ā-Ą]/8\n    \\x{100}\n 0: \\x{100}\n    \\x{104}\n 0: \\x{104}\n    *** Failers\nNo match\n    \\x{105}\nNo match\n    \\x{ff}    \nNo match\n\n/[z-\\x{100}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [z-\\xff\\x{100}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/[z\\Qa-d]Ā\\E]/8DZ\n------------------------------------------------------------------\n        Bra\n        [\\-\\]adz\\x{100}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n    \\x{100}\n 0: \\x{100}\n    Ā \n 0: \\x{100}\n\n/[\\xFF]/DZ\n------------------------------------------------------------------\n        Bra\n        \\x{ff}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nFirst char = \\xff\nNo need char\n    >\\xff<\n 0: \\xff\n\n/[^\\xFF]/DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{ff}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[Ä-Ü]/8\n    Ö # Matches without Study\n 0: \\x{d6}\n    \\x{d6}\n 0: \\x{d6}\n    \n/[Ä-Ü]/8S\n    Ö <-- Same with Study\n 0: \\x{d6}\n    \\x{d6}\n 0: \\x{d6}\n    \n/[\\x{c4}-\\x{dc}]/8 \n    Ö # Matches without Study\n 0: \\x{d6}\n    \\x{d6} \n 0: \\x{d6}\n\n/[\\x{c4}-\\x{dc}]/8S\n    Ö <-- Same with Study\n 0: \\x{d6}\n    \\x{d6} \n 0: \\x{d6}\n\n/[^\\x{100}]abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{100}]\n        abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNeed char = 'z'\n\n/[ab\\x{100}]abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        [ab\\x{100}]\n        abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNeed char = 'z'\n\n/(\\x{100}(b(?2)c))?/DZ8\n------------------------------------------------------------------\n        Bra\n        Brazero\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nOptions: utf\nNo first char\nNo need char\n\n/(\\x{100}(b(?2)c)){0,2}/DZ8\n------------------------------------------------------------------\n        Bra\n        Brazero\n        Bra\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Brazero\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nOptions: utf\nNo first char\nNo need char\n\n/(\\x{100}(b(?1)c))?/DZ8\n------------------------------------------------------------------\n        Bra\n        Brazero\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nOptions: utf\nNo first char\nNo need char\n\n/(\\x{100}(b(?1)c)){0,2}/DZ8\n------------------------------------------------------------------\n        Bra\n        Brazero\n        Bra\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Brazero\n        CBra 1\n        \\x{100}\n        CBra 2\n        b\n        Recurse\n        c\n        Ket\n        Ket\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 2\nMay match empty string\nOptions: utf\nNo first char\nNo need char\n\n/\\W/8\n    A.B\n 0: .\n    A\\x{100}B \n 0: \\x{100}\n  \n/\\w/8\n    \\x{100}X   \n 0: X\n\n/^\\ሴ/8DZ\n------------------------------------------------------------------\n        Bra\n        ^\n        \\x{1234}\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: anchored utf\nNo first char\nNo need char\n\n/\\x{100}*\\d/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        \\d\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}*\\s/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        \\s\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}*\\w/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*+\n        \\w\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}*\\D/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*\n        \\D\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}*\\S/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*\n        \\S\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/\\x{100}*\\W/8DZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}*\n        \\W\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/()()()()()()()()()()\n ()()()()()()()()()()\n ()()()()()()()()()()\n ()()()()()()()()()()\n A (x) (?41) B/8x\n    AxxB     \nMatched, but too many substrings\n 0: AxxB\n 1: \n 2: \n 3: \n 4: \n 5: \n 6: \n 7: \n 8: \n 9: \n10: \n11: \n12: \n13: \n14: \n\n/^[\\x{100}\\E-\\Q\\E\\x{150}]/BZ8\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x{100}-\\x{150}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/^[\\QĀ\\E-\\QŐ\\E]/BZ8\n------------------------------------------------------------------\n        Bra\n        ^\n        [\\x{100}-\\x{150}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/^abc./mgx8<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x{0085}abc7 \\x{2028}abc8 \\x{2029}abc9 JUNK\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n 0: abc8\n 0: abc9\n\n/abc.$/mgx8<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x{0085} abc7\\x{2028} abc8\\x{2029} abc9\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n 0: abc8\n 0: abc9\n\n/^a\\Rb/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0cb\n 0: a\\x{0c}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\x{2028}b \n 0: a\\x{2028}b\n    a\\x{2029}b \n 0: a\\x{2029}b\n    ** Failers\nNo match\n    a\\n\\rb    \nNo match\n\n/^a\\R*b/8<bsr_unicode>\n    ab\n 0: ab\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0c\\x{2028}\\x{2029}b\n 0: a\\x{0c}\\x{2028}\\x{2029}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\n\\rb    \n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}\\x0cb \n 0: a\\x{0a}\\x{0d}\\x{85}\\x{0c}b\n\n/^a\\R+b/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0c\\x{2028}\\x{2029}b\n 0: a\\x{0c}\\x{2028}\\x{2029}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\n\\rb    \n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}\\x0cb \n 0: a\\x{0a}\\x{0d}\\x{85}\\x{0c}b\n    ** Failers\nNo match\n    ab  \nNo match\n\n/^a\\R{1,3}b/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\n\\rb\n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}b\n 0: a\\x{0a}\\x{0d}\\x{85}b\n    a\\r\\n\\r\\nb \n 0: a\\x{0d}\\x{0a}\\x{0d}\\x{0a}b\n    a\\r\\n\\r\\n\\r\\nb \n 0: a\\x{0d}\\x{0a}\\x{0d}\\x{0a}\\x{0d}\\x{0a}b\n    a\\n\\r\\n\\rb\n 0: a\\x{0a}\\x{0d}\\x{0a}\\x{0d}b\n    a\\n\\n\\r\\nb \n 0: a\\x{0a}\\x{0a}\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\n\\n\\n\\rb\nNo match\n    a\\r\nNo match\n\n/\\H\\h\\V\\v/8\n    X X\\x0a\n 0: X X\\x{0a}\n    X\\x09X\\x0b\n 0: X\\x{09}X\\x{0b}\n    ** Failers\nNo match\n    \\x{a0} X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/8 \n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x{09} \\x{a0}X\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x{09} \\x{a0}\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\n 0: \\x{09} \\x{a0}\\x{0a}\\x{0b}\\x{0c}\n    ** Failers \nNo match\n    \\x09\\x20\\x{a0}\\x0a\\x0b\nNo match\n     \n/\\H\\h\\V\\v/8\n    \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n 0: \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n    X\\x{180e}X\\x{85}\n 0: X\\x{180e}X\\x{85}\n    ** Failers\nNo match\n    \\x{2009} X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/8 \n    \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x0c\\x0d\\x0a\n 0: \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x{0c}\\x{0d}\n    \\x09\\x{205f}\\x{a0}\\x0a\\x{2029}\\x0c\\x{2028}\\x0a\n 0: \\x{09}\\x{205f}\\x{a0}\\x{0a}\\x{2029}\\x{0c}\\x{2028}\n    \\x09\\x20\\x{202f}\\x0a\\x0b\\x0c\n 0: \\x{09} \\x{202f}\\x{0a}\\x{0b}\\x{0c}\n    ** Failers \nNo match\n    \\x09\\x{200a}\\x{a0}\\x{2028}\\x0b\nNo match\n     \n/[\\h]/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1680}\n 0: \\x{1680}\n\n/[\\h]{3,}/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}]{3,}+\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1680}\\x{180e}\\x{2000}\\x{2003}\\x{200a}\\x{202f}\\x{205f}\\x{3000}<\n 0: \\x{1680}\\x{180e}\\x{2000}\\x{2003}\\x{200a}\\x{202f}\\x{205f}\\x{3000}\n\n/[\\v]/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x0a-\\x0d\\x85\\x{2028}-\\x{2029}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\H]/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff\\x{100}-\\x{167f}\\x{1681}-\\x{180d}\\x{180f}-\\x{1fff}\\x{200b}-\\x{202e}\\x{2030}-\\x{205e}\\x{2060}-\\x{2fff}\\x{3001}-\\x{10ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\V]/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x09\\x0e-\\x84\\x86-\\xff\\x{100}-\\x{2027}\\x{202a}-\\x{10ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/.*$/8<any>\n    \\x{1ec5} \n 0: \\x{1ec5}\n    \n/a\\Rb/I8<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\x{85}b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\Rb/I8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x{85}b\n 0: a\\x{85}b\n    a\\x0bb     \n 0: a\\x{0b}b\n    ** Failers \nNo match\n    a\\x{85}b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R?b/I8<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\x{85}b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\R?b/I8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x{85}b\n 0: a\\x{85}b\n    a\\x0bb     \n 0: a\\x{0b}b\n    ** Failers \nNo match\n    a\\x{85}b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n \n/.*a.*=.b.*/8<ANY>\n    QQQ\\x{2029}ABCaXYZ=!bPQR\n 0: ABCaXYZ=!bPQR\n    ** Failers\nNo match\n    a\\x{2029}b\nNo match\n    \\x61\\xe2\\x80\\xa9\\x62 \nNo match\n\n/[[:a\\x{100}b:]]/8\nFailed: unknown POSIX class name at offset 3\n\n/a[^]b/<JS>8\n    a\\x{1234}b\n 0: a\\x{1234}b\n    a\\nb \n 0: a\\x{0a}b\n    ** Failers\nNo match\n    ab  \nNo match\n    \n/a[^]+b/<JS>8\n    aXb\n 0: aXb\n    a\\nX\\nX\\x{1234}b \n 0: a\\x{0a}X\\x{0a}X\\x{1234}b\n    ** Failers\nNo match\n    ab  \nNo match\n\n/(\\x{de})\\1/\n    \\x{de}\\x{de}\n 0: \\xde\\xde\n 1: \\xde\n\n/X/8f<any> \n    A\\x{1ec5}ABCXYZ\n 0: X\n\n/Xa{2,4}b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/Xa{2,4}?b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/Xa{2,4}+b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\x{123}{2,4}b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X\\x{123}{2,4}?b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X\\x{123}{2,4}+b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X\\x{123}{2,4}b/8\n    Xx\\P\nNo match\n    X\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}x\\P \nNo match\n    X\\x{123}\\x{123}\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \nNo match\n    \n/X\\x{123}{2,4}?b/8\n    Xx\\P\nNo match\n    X\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}x\\P \nNo match\n    X\\x{123}\\x{123}\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \nNo match\n    \n/X\\x{123}{2,4}+b/8\n    Xx\\P\nNo match\n    X\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}x\\P \nNo match\n    X\\x{123}\\x{123}\\x{123}x\\P\nNo match\n    X\\x{123}\\x{123}\\x{123}\\x{123}x\\P \nNo match\n    \n/X\\d{2,4}b/8\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n    \n/X\\d{2,4}?b/8\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n    \n/X\\d{2,4}+b/8\n    X\\P\nPartial match: X\n    X3\\P\nPartial match: X3\n    X33\\P \nPartial match: X33\n    X333\\P\nPartial match: X333\n    X3333\\P \nPartial match: X3333\n\n/X\\D{2,4}b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\D{2,4}?b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X\\D{2,4}+b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n\n/X\\D{2,4}b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X\\D{2,4}?b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X\\D{2,4}+b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n\n/X[abc]{2,4}b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[abc]{2,4}?b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n    \n/X[abc]{2,4}+b/8\n    X\\P\nPartial match: X\n    Xa\\P\nPartial match: Xa\n    Xaa\\P \nPartial match: Xaa\n    Xaaa\\P\nPartial match: Xaaa\n    Xaaaa\\P \nPartial match: Xaaaa\n\n/X[abc\\x{123}]{2,4}b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X[abc\\x{123}]{2,4}?b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X[abc\\x{123}]{2,4}+b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n\n/X[^a]{2,4}b/8\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n    \n/X[^a]{2,4}?b/8\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n    \n/X[^a]{2,4}+b/8\n    X\\P\nPartial match: X\n    Xz\\P\nPartial match: Xz\n    Xzz\\P \nPartial match: Xzz\n    Xzzz\\P\nPartial match: Xzzz\n    Xzzzz\\P \nPartial match: Xzzzz\n\n/X[^a]{2,4}b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X[^a]{2,4}?b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/X[^a]{2,4}+b/8\n    X\\P\nPartial match: X\n    X\\x{123}\\P\nPartial match: X\\x{123}\n    X\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\P\nPartial match: X\\x{123}\\x{123}\\x{123}\n    X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: X\\x{123}\\x{123}\\x{123}\\x{123}\n\n/(Y)X\\1{2,4}b/8\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n    \n/(Y)X\\1{2,4}?b/8\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n    \n/(Y)X\\1{2,4}+b/8\n    YX\\P\nPartial match: YX\n    YXY\\P\nPartial match: YXY\n    YXYY\\P \nPartial match: YXYY\n    YXYYY\\P\nPartial match: YXYYY\n    YXYYYY\\P \nPartial match: YXYYYY\n\n/(\\x{123})X\\1{2,4}b/8\n    \\x{123}X\\P\nPartial match: \\x{123}X\n    \\x{123}X\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/(\\x{123})X\\1{2,4}?b/8\n    \\x{123}X\\P\nPartial match: \\x{123}X\n    \\x{123}X\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\n    \n/(\\x{123})X\\1{2,4}+b/8\n    \\x{123}X\\P\nPartial match: \\x{123}X\n    \\x{123}X\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\P\nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\n    \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\\P \nPartial match: \\x{123}X\\x{123}\\x{123}\\x{123}\\x{123}\n\n/\\bthe cat\\b/8\n    the cat\\P\n 0: the cat\n    the cat\\P\\P\nPartial match: the cat\n\n/abcd*/8\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n\n/abcd*/i8\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n    XXXXABCD\\P\n 0: ABCD\n    XXXXABCD\\P\\P\nPartial match: ABCD\n\n/abc\\d*/8\n    xxxxabc1\\P\n 0: abc1\n    xxxxabc1\\P\\P\nPartial match: abc1\n\n/(a)bc\\1*/8\n    xxxxabca\\P\n 0: abca\n 1: a\n    xxxxabca\\P\\P\nPartial match: abca\n\n/abc[de]*/8\n    xxxxabcde\\P\n 0: abcde\n    xxxxabcde\\P\\P\nPartial match: abcde\n\n/X\\W{3}X/8\n    \\PX\nPartial match: X\n\n/\\sxxx\\s/8T1\n    AB\\x{85}xxx\\x{a0}XYZ\n 0: \\x{85}xxx\\x{a0}\n    AB\\x{a0}xxx\\x{85}XYZ\n 0: \\x{a0}xxx\\x{85}\n\n/\\S \\S/8T1\n    \\x{a2} \\x{84} \n 0: \\x{a2} \\x{84}\n\n'A#хц'8x<any>BZ\n------------------------------------------------------------------\n        Bra\n        A\n        Ket\n        End\n------------------------------------------------------------------\n\n'A#хц\n  PQ'8x<any>BZ\n------------------------------------------------------------------\n        Bra\n        APQ\n        Ket\n        End\n------------------------------------------------------------------\n  \n/a+#хaa\n  z#XX?/8x<any>BZ \n------------------------------------------------------------------\n        Bra\n        a++\n        z\n        Ket\n        End\n------------------------------------------------------------------\n\n/a+#хaa\n  z#х?/8x<any>BZ \n------------------------------------------------------------------\n        Bra\n        a++\n        z\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\g{A}xxx#bXX(?'A'123)\r(?'A'456)/8x<any>BZ\n------------------------------------------------------------------\n        Bra\n        \\1\n        xxx\n        CBra 1\n        456\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\g{A}xxx#bх(?'A'123)\r(?'A'456)/8x<any>BZ\n------------------------------------------------------------------\n        Bra\n        \\1\n        xxx\n        CBra 1\n        456\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\n\n/^\\cģ/8\nFailed: \\c must be followed by an ASCII character at offset 3\n\n/(\\R*)(.)/s8\n    \\r\\n\n 0: \\x{0d}\n 1: \n 2: \\x{0d}\n    \\r\\r\\n\\n\\r \n 0: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\\x{0d}\n 1: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\n 2: \\x{0d}\n    \\r\\r\\n\\n\\r\\n \n 0: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\\x{0d}\n 1: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\n 2: \\x{0d}\n\n/(\\R)*(.)/s8\n    \\r\\n\n 0: \\x{0d}\n 1: <unset>\n 2: \\x{0d}\n    \\r\\r\\n\\n\\r \n 0: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\\x{0d}\n 1: \\x{0a}\n 2: \\x{0d}\n    \\r\\r\\n\\n\\r\\n \n 0: \\x{0d}\\x{0d}\\x{0a}\\x{0a}\\x{0d}\n 1: \\x{0a}\n 2: \\x{0d}\n\n/[^\\x{1234}]+/iS8I   \nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/[^\\x{1234}]+?/iS8I   \nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/[^\\x{1234}]++/iS8I   \nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 1\nNo starting char list\n\n/[^\\x{1234}]{2}/iS8I\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\nSubject length lower bound = 2\nNo starting char list\n\n//<bsr_anycrlf><bsr_unicode>\nFailed: inconsistent NEWLINE options at offset 0\n\n/f.*/\n    \\P\\Pfor\nPartial match: for\n\n/f.*/s\n    \\P\\Pfor\nPartial match: for\n\n/f.*/8\n    \\P\\Pfor\nPartial match: for\n\n/f.*/8s\n    \\P\\Pfor\nPartial match: for\n    \n/\\x{d7ff}\\x{e000}/8\n\n/\\x{d800}/8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7\n\n/\\x{dfff}/8 \nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 7\n\n/\\h+/8\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n 0: \\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\x{a0}\\x{2000}\n 0: \\x{200a}\\x{a0}\\x{2000}\n\n/[\\h\\x{e000}]+/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x09 \\xa0\\x{1680}\\x{180e}\\x{2000}-\\x{200a}\\x{202f}\\x{205f}\\x{3000}\\x{e000}]++\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{1681}\\x{200b}\\x{1680}\\x{2000}\\x{202f}\\x{3000}\n 0: \\x{1680}\\x{2000}\\x{202f}\\x{3000}\n    \\x{3001}\\x{2fff}\\x{200a}\\x{a0}\\x{2000}\n 0: \\x{200a}\\x{a0}\\x{2000}\n\n/\\H+/8\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n 0: \\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n 0: \\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n 0: \\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\x{a0}\\x{3000}\\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n 0: \\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n\n/[\\H\\x{d7ff}]+/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x08\\x0a-\\x1f!-\\x9f\\xa1-\\xff\\x{100}-\\x{167f}\\x{1681}-\\x{180d}\\x{180f}-\\x{1fff}\\x{200b}-\\x{202e}\\x{2030}-\\x{205e}\\x{2060}-\\x{2fff}\\x{3001}-\\x{10ffff}\\x{d7ff}]++\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{1680}\\x{180e}\\x{167f}\\x{1681}\\x{180d}\\x{180f}\n 0: \\x{167f}\\x{1681}\\x{180d}\\x{180f}\n    \\x{2000}\\x{200a}\\x{1fff}\\x{200b}\n 0: \\x{1fff}\\x{200b}\n    \\x{202f}\\x{205f}\\x{202e}\\x{2030}\\x{205e}\\x{2060}\n 0: \\x{202e}\\x{2030}\\x{205e}\\x{2060}\n    \\x{a0}\\x{3000}\\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n 0: \\x{9f}\\x{a1}\\x{2fff}\\x{3001}\n\n/\\v+/8\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n 0: \\x{85}\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n\n/[\\v\\x{e000}]+/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x0a-\\x0d\\x85\\x{2028}-\\x{2029}\\x{e000}]++\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n 0: \\x{85}\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n\n/\\V+/8\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n 0: \\x{2027}\\x{2030}\n    \\x{85}\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x{84}\\x{86}\n 0: \\x{09}\\x{0e}\\x{84}\\x{86}\n\n/[\\V\\x{d7ff}]+/8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x09\\x0e-\\x84\\x86-\\xff\\x{100}-\\x{2027}\\x{202a}-\\x{10ffff}\\x{d7ff}]++\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{2028}\\x{2029}\\x{2027}\\x{2030}\n 0: \\x{2027}\\x{2030}\n    \\x{85}\\x0a\\x0b\\x0c\\x0d\\x09\\x0e\\x{84}\\x{86}\n 0: \\x{09}\\x{0e}\\x{84}\\x{86}\n\n/\\R+/8<bsr_unicode>\n    \\x{2027}\\x{2030}\\x{2028}\\x{2029}\n 0: \\x{2028}\\x{2029}\n    \\x09\\x0e\\x{84}\\x{86}\\x{85}\\x0a\\x0b\\x0c\\x0d\n 0: \\x{85}\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n\n/(..)\\1/8\n    ab\\P\nPartial match: ab\n    aba\\P\nPartial match: aba\n    abab\\P\n 0: abab\n 1: ab\n\n/(..)\\1/8i\n    ab\\P\nPartial match: ab\n    abA\\P\nPartial match: abA\n    aBAb\\P\n 0: aBAb\n 1: aB\n\n/(..)\\1{2,}/8\n    ab\\P\nPartial match: ab\n    aba\\P\nPartial match: aba\n    abab\\P\nPartial match: abab\n    ababa\\P\nPartial match: ababa\n    ababab\\P\n 0: ababab\n 1: ab\n    ababab\\P\\P\nPartial match: ababab\n    abababa\\P\n 0: ababab\n 1: ab\n    abababa\\P\\P\nPartial match: abababa\n\n/(..)\\1{2,}/8i\n    ab\\P\nPartial match: ab\n    aBa\\P\nPartial match: aBa\n    aBAb\\P\nPartial match: aBAb\n    AbaBA\\P\nPartial match: AbaBA\n    abABAb\\P\n 0: abABAb\n 1: ab\n    aBAbaB\\P\\P\nPartial match: aBAbaB\n    abABabA\\P\n 0: abABab\n 1: ab\n    abaBABa\\P\\P\nPartial match: abaBABa\n\n/(..)\\1{2,}?x/8i\n    ab\\P\nPartial match: ab\n    abA\\P\nPartial match: abA\n    aBAb\\P\nPartial match: aBAb\n    abaBA\\P\nPartial match: abaBA\n    abAbaB\\P\nPartial match: abAbaB\n    abaBabA\\P\nPartial match: abaBabA\n    abAbABaBx\\P\n 0: abAbABaBx\n 1: ab\n\n/./8<CRLF>\n    \\r\\P\n 0: \\x{0d}\n    \\r\\P\\P \nPartial match: \\x{0d}\n  \n/.{2,3}/8<CRLF>\n    \\r\\P \nPartial match: \\x{0d}\n    \\r\\P\\P\nPartial match: \\x{0d}\n    \\r\\r\\P\n 0: \\x{0d}\\x{0d}\n    \\r\\r\\P\\P\nPartial match: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\n 0: \\x{0d}\\x{0d}\\x{0d}\n    \\r\\r\\r\\P\\P     \nPartial match: \\x{0d}\\x{0d}\\x{0d}\n\n/.{2,3}?/8<CRLF>\n    \\r\\P \nPartial match: \\x{0d}\n    \\r\\P\\P\nPartial match: \\x{0d}\n    \\r\\r\\P\n 0: \\x{0d}\\x{0d}\n    \\r\\r\\P\\P\nPartial match: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\n 0: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\\P     \n 0: \\x{0d}\\x{0d}\n\n/[^\\x{100}][^\\x{1234}][^\\x{ffff}][^\\x{10000}][^\\x{10ffff}]/8BZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{100}]\n        [^\\x{1234}]\n        [^\\x{ffff}]\n        [^\\x{10000}]\n        [^\\x{10ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{100}][^\\x{1234}][^\\x{ffff}][^\\x{10000}][^\\x{10ffff}]/8BZi\n------------------------------------------------------------------\n        Bra\n     /i [^\\x{100}]\n     /i [^\\x{1234}]\n     /i [^\\x{ffff}]\n     /i [^\\x{10000}]\n     /i [^\\x{10ffff}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{100}]*[^\\x{10000}]+[^\\x{10ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{fffff}]{5,6}+/8BZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{100}]*\n        [^\\x{10000}]+\n        [^\\x{10ffff}]??\n        [^\\x{8000}]{4}\n        [^\\x{8000}]*\n        [^\\x{7fff}]{2}\n        [^\\x{7fff}]{0,7}?\n        [^\\x{fffff}]{5}\n        [^\\x{fffff}]?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{100}]*[^\\x{10000}]+[^\\x{10ffff}]??[^\\x{8000}]{4,}[^\\x{7fff}]{2,9}?[^\\x{fffff}]{5,6}+/8BZi\n------------------------------------------------------------------\n        Bra\n     /i [^\\x{100}]*\n     /i [^\\x{10000}]+\n     /i [^\\x{10ffff}]??\n     /i [^\\x{8000}]{4}\n     /i [^\\x{8000}]*\n     /i [^\\x{7fff}]{2}\n     /i [^\\x{7fff}]{0,7}?\n     /i [^\\x{fffff}]{5}\n     /i [^\\x{fffff}]?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/(?<=\\x{1234}\\x{1234})\\bxy/I8\nCapturing subpattern count = 0\nMax lookbehind = 2\nOptions: utf\nFirst char = 'x'\nNeed char = 'y'\n\n/(?<!^)ETA/8\n    ETA\nNo match\n\n/\\u0100/<JS>8BZ\n------------------------------------------------------------------\n        Bra\n        \\x{100}\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\u0100-\\u0200]/<JS>8BZ\n------------------------------------------------------------------\n        Bra\n        [\\x{100}-\\x{200}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\ud800/<JS>8\nFailed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 5\n\n/^a+[a\\x{200}]/8BZ\n------------------------------------------------------------------\n        Bra\n        ^\n        a+\n        [a\\x{200}]\n        Ket\n        End\n------------------------------------------------------------------\n    aa\n 0: aa\n\n/[b-d\\x{200}-\\x{250}]*[ae-h]?#[\\x{200}-\\x{250}]{0,8}[\\x00-\\xff]*#[\\x{200}-\\x{250}]+[a-z]/8BZ\n------------------------------------------------------------------\n        Bra\n        [b-d\\x{200}-\\x{250}]*+\n        [ae-h]?+\n        #\n        [\\x{200}-\\x{250}]{0,8}+\n        [\\x00-\\xff]*\n        #\n        [\\x{200}-\\x{250}]++\n        [a-z]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\xff]*PRUNE:\\x{100}abc(xyz(?1))/8DZ\n------------------------------------------------------------------\n        Bra\n        [^\\x{ff}]*\n        PRUNE:\\x{100}abc\n        CBra 1\n        xyz\n        Recurse\n        Ket\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 1\nOptions: utf\nNo first char\nNeed char = 'z'\n\n/(?<=\\K\\x{17f})/8g+\n    \\x{17f}\\x{17f}\\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\n 0: \\x{17f}\n 0+ \n\n/(?<=\\K\\x{17f})/8G+\n    \\x{17f}\\x{17f}\\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\\x{17f}\n 0: \\x{17f}\n 0+ \\x{17f}\n 0: \\x{17f}\n 0+ \n\n/\\C[^\\v]+\\x80/8\n    [AΏBŀC]\nNo match\n\n/\\C[^\\d]+\\x80/8\n    [AΏBŀC]\nNo match\n\n/-- End of testinput5 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput6",
    "content": "/-- This set of tests is for Unicode property support. It is compatible with\n    Perl >= 5.15. --/\n    \n< forbid 9?=ABCDEFfGILMNPTUXZ<\n\n/^\\pC\\pL\\pM\\pN\\pP\\pS\\pZ</8\n    \\x7f\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n 0: \\x{7f}\\x{c0}\\x{30f}\\x{660}\\x{66c}\\x{f01}\\x{1680}<\n    \\np\\x{300}9!\\$ < \n 0: \\x{0a}p\\x{300}9!$ <\n    ** Failers \nNo match\n    ap\\x{300}9!\\$ < \nNo match\n  \n/^\\PC/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x7f\nNo match\n  \n/^\\PL/8\n    9\n 0: 9\n    ** Failers \n 0: *\n    \\x{c0}\nNo match\n  \n/^\\PM/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{30f}\nNo match\n  \n/^\\PN/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{660}\nNo match\n  \n/^\\PP/8\n    X\n 0: X\n    ** Failers \nNo match\n    \\x{66c}\nNo match\n  \n/^\\PS/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{f01}\nNo match\n  \n/^\\PZ/8\n    X\n 0: X\n    ** Failers \n 0: *\n    \\x{1680}\nNo match\n    \n/^\\p{Cc}/8\n    \\x{017}\n 0: \\x{17}\n    \\x{09f} \n 0: \\x{9f}\n    ** Failers\nNo match\n    \\x{0600} \nNo match\n  \n/^\\p{Cf}/8\n    \\x{601}\n 0: \\x{601}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Cn}/8\n    \\x{e0000}\n 0: \\x{e0000}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Co}/8\n    \\x{f8ff}\n 0: \\x{f8ff}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Ll}/8\n    a\n 0: a\n    ** Failers \nNo match\n    Z\nNo match\n    \\x{e000}  \nNo match\n  \n/^\\p{Lm}/8\n    \\x{2b0}\n 0: \\x{2b0}\n    ** Failers\nNo match\n    a \nNo match\n  \n/^\\p{Lo}/8\n    \\x{1bb}\n 0: \\x{1bb}\n    \\x{3400}\n 0: \\x{3400}\n    \\x{3401}\n 0: \\x{3401}\n    \\x{4d00}\n 0: \\x{4d00}\n    \\x{4db4}\n 0: \\x{4db4}\n    \\x{4db5}     \n 0: \\x{4db5}\n    ** Failers\nNo match\n    a \nNo match\n    \\x{2b0}\nNo match\n    \\x{4db6} \nNo match\n  \n/^\\p{Lt}/8\n    \\x{1c5}\n 0: \\x{1c5}\n    ** Failers\nNo match\n    a \nNo match\n    \\x{2b0}\nNo match\n  \n/^\\p{Lu}/8\n    A\n 0: A\n    ** Failers\nNo match\n    \\x{2b0}\nNo match\n  \n/^\\p{Mc}/8\n    \\x{903}\n 0: \\x{903}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{300}\nNo match\n       \n/^\\p{Me}/8\n    \\x{488}\n 0: \\x{488}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{903}\nNo match\n    \\x{300}\nNo match\n  \n/^\\p{Mn}/8\n    \\x{300}\n 0: \\x{300}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{903}\nNo match\n  \n/^\\p{Nd}+/8\n    0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\\x{66a}\n 0: 0123456789\\x{660}\\x{661}\\x{662}\\x{663}\\x{664}\\x{665}\\x{666}\\x{667}\\x{668}\\x{669}\n    \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\\x{6fa}\n 0: \\x{6f0}\\x{6f1}\\x{6f2}\\x{6f3}\\x{6f4}\\x{6f5}\\x{6f6}\\x{6f7}\\x{6f8}\\x{6f9}\n    \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\\x{970}\n 0: \\x{966}\\x{967}\\x{968}\\x{969}\\x{96a}\\x{96b}\\x{96c}\\x{96d}\\x{96e}\\x{96f}\n    ** Failers\nNo match\n    X\nNo match\n  \n/^\\p{Nl}/8\n    \\x{16ee}\n 0: \\x{16ee}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{966}\nNo match\n  \n/^\\p{No}/8\n    \\x{b2}\n 0: \\x{b2}\n    \\x{b3}\n 0: \\x{b3}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{16ee}\nNo match\n  \n/^\\p{Pc}/8\n    \\x5f\n 0: _\n    \\x{203f}\n 0: \\x{203f}\n    ** Failers\nNo match\n    X\nNo match\n    -\nNo match\n    \\x{58a}\nNo match\n  \n/^\\p{Pd}/8\n    -\n 0: -\n    \\x{58a}\n 0: \\x{58a}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Pe}/8\n    )\n 0: )\n    ]\n 0: ]\n    }\n 0: }\n    \\x{f3b}\n 0: \\x{f3b}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n    (\nNo match\n    [\nNo match\n    {\nNo match\n    \\x{f3c}\nNo match\n  \n/^\\p{Pf}/8\n    \\x{bb}\n 0: \\x{bb}\n    \\x{2019}\n 0: \\x{2019}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Pi}/8\n    \\x{ab}\n 0: \\x{ab}\n    \\x{2018}\n 0: \\x{2018}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Po}/8\n    !\n 0: !\n    \\x{37e}\n 0: \\x{37e}\n    ** Failers\n 0: *\n    X\nNo match\n    \\x{203f}\nNo match\n  \n/^\\p{Ps}/8\n    (\n 0: (\n    [\n 0: [\n    {\n 0: {\n    \\x{f3c}\n 0: \\x{f3c}\n    ** Failers\nNo match\n    X\nNo match\n    )\nNo match\n    ]\nNo match\n    }\nNo match\n    \\x{f3b}\nNo match\n  \n/^\\p{Sk}/8\n    \\x{2c2}\n 0: \\x{2c2}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{Sm}+/8\n    +<|~\\x{ac}\\x{2044}\n 0: +<|~\\x{ac}\\x{2044}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{So}/8\n    \\x{a6}\n 0: \\x{a6}\n    \\x{482} \n 0: \\x{482}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{9f2}\nNo match\n  \n/^\\p{Zl}/8\n    \\x{2028}\n 0: \\x{2028}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2029}\nNo match\n  \n/^\\p{Zp}/8\n    \\x{2029}\n 0: \\x{2029}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2028}\nNo match\n  \n/\\p{Nd}+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: AB\n  \n/\\p{Nd}+?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}\n 1: \\x{661}\\x{662}\n  \n/\\p{Nd}{2,}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: AB\n  \n/\\p{Nd}{2,}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}A\n 1: \\x{662}A\n  \n/\\p{Nd}*(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: AB\n  \n/\\p{Nd}*?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\n 1: \\x{660}\\x{661}\n  \n/\\p{Nd}{2}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}A\n 1: \\x{662}A\n  \n/\\p{Nd}{2,3}(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: AB\n  \n/\\p{Nd}{2,3}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}A\n 1: \\x{662}A\n  \n/\\p{Nd}?(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}\n 1: \\x{661}\\x{662}\n  \n/\\p{Nd}??(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\n 1: \\x{660}\\x{661}\n  \n/\\p{Nd}*+(..)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}AB\n 1: AB\n  \n/\\p{Nd}*+(...)/8\n      \\x{660}\\x{661}\\x{662}ABC\n 0: \\x{660}\\x{661}\\x{662}ABC\n 1: ABC\n  \n/\\p{Nd}*+(....)/8\n      ** Failers\n 0: ** F\n 1: ** F\n      \\x{660}\\x{661}\\x{662}ABC\nNo match\n  \n/(?<=A\\p{Nd})XYZ/8\n    A2XYZ\n 0: XYZ\n    123A5XYZPQR\n 0: XYZ\n    ABA\\x{660}XYZpqr\n 0: XYZ\n    ** Failers\nNo match\n    AXYZ\nNo match\n    XYZ     \nNo match\n    \n/(?<!\\pL)XYZ/8\n    1XYZ\n 0: XYZ\n    AB=XYZ.. \n 0: XYZ\n    XYZ \n 0: XYZ\n    ** Failers\nNo match\n    WXYZ \nNo match\n\n/[\\P{Nd}]+/8\n    abcd\n 0: abcd\n    ** Failers\n 0: ** Failers\n    1234\nNo match\n\n/\\D+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n     \n/\\P{Nd}+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\P{Nd}]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/[\\D\\P{Nd}]+/8\n    11111111111111111111111111111111111111111111111111111111111111111111111\nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\pL/8\n    a\n 0: a\n    A \n 0: A\n\n/\\pL/8i\n    a\n 0: a\n    A \n 0: A\n    \n/\\p{Lu}/8 \n    A\n 0: A\n    aZ\n 0: Z\n    ** Failers\n 0: F\n    abc   \nNo match\n\n/\\p{Ll}/8 \n    a\n 0: a\n    Az\n 0: z\n    ** Failers\n 0: a\n    ABC   \nNo match\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    ** Failers\nNo match\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \nNo match\n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\nNo match\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\nNo match\n\n/A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}/8i\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}   \n 0: a\\x{391}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n 0: A\\x{3b1}\\x{10427}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{1044F}\\x{ff3a}\\x{1fb0}\n 0: A\\x{391}\\x{1044f}\\x{ff3a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n 0: A\\x{391}\\x{10427}\\x{ff5a}\\x{1fb0}\n    A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n 0: A\\x{391}\\x{10427}\\x{ff3a}\\x{1fb8}\n\n/\\x{391}+/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}\n\n/\\x{391}{3,5}(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 1: X\n\n/\\x{391}{3,5}?(.)/8i\n    \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\\x{391}X\n 0: \\x{391}\\x{3b1}\\x{3b1}\\x{3b1}\n 1: \\x{3b1}\n\n/[\\x{391}\\x{ff3a}]/8i\n    \\x{391}\n 0: \\x{391}\n    \\x{ff3a}\n 0: \\x{ff3a}\n    \\x{3b1}\n 0: \\x{3b1}\n    \\x{ff5a}   \n 0: \\x{ff5a}\n    \n/^[\\X]/8\n    X123\n 0: X\n    *** Failers\nNo match\n    AXYZ\nNo match\n\n/^(\\X*)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BC\n 1: A\\x{300}\\x{301}\\x{302}B\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}\n\n/^(\\X*?)C/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BC\n 1: A\\x{300}\\x{301}\\x{302}B\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BC\n 1: A\\x{300}\\x{301}\\x{302}B\n\n/^(\\X*)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\\x{300}\\x{301}\\x{302}BCA\n 1: A\\x{300}\\x{301}\\x{302}BC\n 2: A\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C\n 1: A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}\n 2: C\n\n/^(\\X*?)(.)/8\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301} \n 0: A\n 1: \n 2: A\n    A\\x{300}\\x{301}\\x{302}BCA\\x{300}\\x{301}C \n 0: A\n 1: \n 2: A\n\n/^\\X(.)/8\n    *** Failers\n 0: **\n 1: *\n    A\\x{300}\\x{301}\\x{302}\nNo match\n\n/^\\X{2,3}(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}X\n 1: X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n 0: A\\x{300}\\x{301}B\\x{300}C\n 1: C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 1: X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}D\n 1: D\n    \n/^\\X{2,3}?(.)/8\n    A\\x{300}\\x{301}B\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}X\n 1: X\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}\n 0: A\\x{300}\\x{301}B\\x{300}C\n 1: C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}X\n 0: A\\x{300}\\x{301}B\\x{300}C\n 1: C\n    A\\x{300}\\x{301}B\\x{300}C\\x{300}\\x{301}DA\\x{300}X\n 0: A\\x{300}\\x{301}B\\x{300}C\n 1: C\n\n/^\\X/8\n    A\n 0: A\n    A\\x{300}BC \n 0: A\\x{300}\n    A\\x{300}\\x{301}\\x{302}BC \n 0: A\\x{300}\\x{301}\\x{302}\n    \\x{300}  \n 0: \\x{300}\n\n/^\\p{Han}+/8\n    \\x{2e81}\\x{3007}\\x{2f804}\\x{31a0}\n 0: \\x{2e81}\\x{3007}\\x{2f804}\n    ** Failers\nNo match\n    \\x{2e7f}  \nNo match\n\n/^\\P{Katakana}+/8\n    \\x{3105}\n 0: \\x{3105}\n    ** Failers\n 0: ** Failers\n    \\x{30ff}  \nNo match\n\n/^[\\p{Arabic}]/8\n    \\x{06e9}\n 0: \\x{6e9}\n    \\x{060b}\n 0: \\x{60b}\n    ** Failers\nNo match\n    \\x{061c}\nNo match\n    X\\x{06e9}   \nNo match\n\n/^[\\P{Yi}]/8\n    \\x{2f800}\n 0: \\x{2f800}\n    ** Failers\n 0: *\n    \\x{a014}\nNo match\n    \\x{a4c6}   \nNo match\n    \n/^\\p{Any}X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    X  \nNo match\n    \n/^\\P{Any}X/8\n    ** Failers\nNo match\n    AX\nNo match\n    \n/^\\p{Any}?X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    ABXYZ   \nNo match\n\n/^\\P{Any}?X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ \nNo match\n    ABXYZ   \nNo match\n\n/^\\p{Any}+X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n    XYZ\nNo match\n\n/^\\P{Any}+X/8\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n    XYZ\nNo match\n\n/^\\p{Any}*X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n\n/^\\P{Any}*X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n\n/^[\\p{Any}]X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    X  \nNo match\n    \n/^[\\P{Any}]X/8\n    ** Failers\nNo match\n    AX\nNo match\n    \n/^[\\p{Any}]?X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ \n 0: \\x{1234}X\n    ** Failers\nNo match\n    ABXYZ   \nNo match\n\n/^[\\P{Any}]?X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ \nNo match\n    ABXYZ   \nNo match\n\n/^[\\p{Any}]+X/8\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n    XYZ\nNo match\n\n/^[\\P{Any}]+X/8\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n    XYZ\nNo match\n\n/^[\\p{Any}]*X/8\n    XYZ\n 0: X\n    AXYZ\n 0: AX\n    \\x{1234}XYZ\n 0: \\x{1234}X\n    A\\x{1234}XYZ\n 0: A\\x{1234}X\n    ** Failers\nNo match\n\n/^[\\P{Any}]*X/8\n    XYZ\n 0: X\n    ** Failers\nNo match\n    AXYZ\nNo match\n    \\x{1234}XYZ\nNo match\n    A\\x{1234}XYZ\nNo match\n\n/^\\p{Any}{3,5}?/8\n    abcdefgh\n 0: abc\n    \\x{1234}\\n\\r\\x{3456}xyz \n 0: \\x{1234}\\x{0a}\\x{0d}\n\n/^\\p{Any}{3,5}/8\n    abcdefgh\n 0: abcde\n    \\x{1234}\\n\\r\\x{3456}xyz \n 0: \\x{1234}\\x{0a}\\x{0d}\\x{3456}x\n\n/^\\P{Any}{3,5}?/8\n    ** Failers\nNo match\n    abcdefgh\nNo match\n    \\x{1234}\\n\\r\\x{3456}xyz \nNo match\n\n/^\\p{L&}X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     \\x{1c5}XY\n 0: \\x{1c5}X\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     \\x{1c5}XY\n 0: \\x{1c5}X\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\p{L&}+X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]+X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEXypqreX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\p{L&}+?X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^[\\p{L&}]+?X/8\n     AXY\n 0: AX\n     aXY\n 0: aX\n     AbcdeXyz \n 0: AbcdeX\n     \\x{1c5}AbXY\n 0: \\x{1c5}AbX\n     abcDEXypqreXlmn \n 0: abcDEX\n     ** Failers\nNo match\n     \\x{1bb}XY\nNo match\n     \\x{2b0}XY\nNo match\n     !XY      \nNo match\n\n/^\\P{L&}X/8\n     !XY\n 0: !X\n     \\x{1bb}XY\n 0: \\x{1bb}X\n     \\x{2b0}XY\n 0: \\x{2b0}X\n     ** Failers\nNo match\n     \\x{1c5}XY\nNo match\n     AXY      \nNo match\n\n/^[\\P{L&}]X/8\n     !XY\n 0: !X\n     \\x{1bb}XY\n 0: \\x{1bb}X\n     \\x{2b0}XY\n 0: \\x{2b0}X\n     ** Failers\nNo match\n     \\x{1c5}XY\nNo match\n     AXY      \nNo match\n\n/^(\\p{Z}[^\\p{C}\\p{Z}]+)*$/\n    \\xa0!\n 0: \\xa0!\n 1: \\xa0!\n\n/^[\\pL](abc)(?1)/\n    AabcabcYZ    \n 0: Aabcabc\n 1: abc\n\n/([\\pL]=(abc))*X/\n    L=abcX\n 0: L=abcX\n 1: L=abc\n 2: abc\n\n/^\\p{Balinese}\\p{Cuneiform}\\p{Nko}\\p{Phags_Pa}\\p{Phoenician}/8\n    \\x{1b00}\\x{12000}\\x{7c0}\\x{a840}\\x{10900}\n 0: \\x{1b00}\\x{12000}\\x{7c0}\\x{a840}\\x{10900}\n\n/Check property support in non-UTF-8 mode/\n \n/\\p{L}{4}/\n    123abcdefg\n 0: abcd\n    123abc\\xc4\\xc5zz\n 0: abc\\xc4\n\n/\\X{1,3}\\d/\n  \\x8aBCD\nNo match\n  \n/\\X?\\d/\n  \\x8aBCD \nNo match\n\n/\\P{L}?\\d/\n  \\x8aBCD \nNo match\n\n/[\\PPP\\x8a]{1,}\\x80/\n    A\\x80\n 0: A\\x80\n\n/^[\\p{Arabic}]/8\n    \\x{604}\n 0: \\x{604}\n    \\x{60e} \n 0: \\x{60e}\n    \\x{656} \n 0: \\x{656}\n    \\x{657} \n 0: \\x{657}\n    \\x{658} \n 0: \\x{658}\n    \\x{659} \n 0: \\x{659}\n    \\x{65a} \n 0: \\x{65a}\n    \\x{65b} \n 0: \\x{65b}\n    \\x{65c} \n 0: \\x{65c}\n    \\x{65d} \n 0: \\x{65d}\n    \\x{65e} \n 0: \\x{65e}\n    \\x{65f}\n 0: \\x{65f}\n    \\x{66a} \n 0: \\x{66a}\n    \\x{6e9} \n 0: \\x{6e9}\n    \\x{6ef}\n 0: \\x{6ef}\n    \\x{6fa}  \n 0: \\x{6fa}\n    ** Failers\nNo match\n    \\x{650}\nNo match\n    \\x{651}  \nNo match\n    \\x{652}  \nNo match\n    \\x{653}  \nNo match\n    \\x{654} \nNo match\n    \\x{655} \nNo match\n    \n/^\\p{Cyrillic}/8\n    \\x{1d2b} \n 0: \\x{1d2b}\n    \n/^\\p{Common}/8\n    \\x{589}\n 0: \\x{589}\n    \\x{60c}\n 0: \\x{60c}\n    \\x{61f}  \n 0: \\x{61f}\n    \\x{964}\n 0: \\x{964}\n    \\x{965}  \n 0: \\x{965}\n\n/^\\p{Inherited}/8\n    \\x{64b}\n 0: \\x{64b}\n    \\x{654}\n 0: \\x{654}\n    \\x{655}\n 0: \\x{655}\n    \\x{200c} \n 0: \\x{200c}\n    ** Failers\nNo match\n    \\x{64a}\nNo match\n    \\x{656}     \nNo match\n\n/^\\p{Shavian}/8\n    \\x{10450}\n 0: \\x{10450}\n    \\x{1047f}\n 0: \\x{1047f}\n    \n/^\\p{Deseret}/8\n    \\x{10400}\n 0: \\x{10400}\n    \\x{1044f}\n 0: \\x{1044f}\n    \n/^\\p{Osmanya}/8\n    \\x{10480}\n 0: \\x{10480}\n    \\x{1049d}\n 0: \\x{1049d}\n    \\x{104a0}\n 0: \\x{104a0}\n    \\x{104a9}\n 0: \\x{104a9}\n    ** Failers\nNo match\n    \\x{1049e}\nNo match\n    \\x{1049f}\nNo match\n    \\x{104aa}           \nNo match\n\n/\\p{Carian}\\p{Cham}\\p{Kayah_Li}\\p{Lepcha}\\p{Lycian}\\p{Lydian}\\p{Ol_Chiki}\\p{Rejang}\\p{Saurashtra}\\p{Sundanese}\\p{Vai}/8\n    \\x{102A4}\\x{AA52}\\x{A91D}\\x{1C46}\\x{10283}\\x{1092E}\\x{1C6B}\\x{A93B}\\x{A8BF}\\x{1BA0}\\x{A50A}====\n 0: \\x{102a4}\\x{aa52}\\x{a91d}\\x{1c46}\\x{10283}\\x{1092e}\\x{1c6b}\\x{a93b}\\x{a8bf}\\x{1ba0}\\x{a50a}\n\n/\\x{a77d}\\x{1d79}/8i\n    \\x{a77d}\\x{1d79}\n 0: \\x{a77d}\\x{1d79}\n    \\x{1d79}\\x{a77d} \n 0: \\x{1d79}\\x{a77d}\n\n/\\x{a77d}\\x{1d79}/8\n    \\x{a77d}\\x{1d79}\n 0: \\x{a77d}\\x{1d79}\n    ** Failers \nNo match\n    \\x{1d79}\\x{a77d} \nNo match\n\n/(A)\\1/8i\n    AA\n 0: AA\n 1: A\n    Aa\n 0: Aa\n 1: A\n    aa\n 0: aa\n 1: a\n    aA\n 0: aA\n 1: a\n\n/(\\x{10a})\\1/8i\n    \\x{10a}\\x{10a}\n 0: \\x{10a}\\x{10a}\n 1: \\x{10a}\n    \\x{10a}\\x{10b}\n 0: \\x{10a}\\x{10b}\n 1: \\x{10a}\n    \\x{10b}\\x{10b}\n 0: \\x{10b}\\x{10b}\n 1: \\x{10b}\n    \\x{10b}\\x{10a}\n 0: \\x{10b}\\x{10a}\n 1: \\x{10b}\n    \n/The next two tests are for property support in non-UTF-8 mode/\n\n/(?:\\p{Lu}|\\x20)+/\n    \\x41\\x20\\x50\\xC2\\x54\\xC9\\x20\\x54\\x4F\\x44\\x41\\x59\n 0: A P\\xc2T\\xc9 TODAY\n\n/[\\p{Lu}\\x20]+/\n    \\x41\\x20\\x50\\xC2\\x54\\xC9\\x20\\x54\\x4F\\x44\\x41\\x59\n 0: A P\\xc2T\\xc9 TODAY\n\n/\\p{Avestan}\\p{Bamum}\\p{Egyptian_Hieroglyphs}\\p{Imperial_Aramaic}\\p{Inscriptional_Pahlavi}\\p{Inscriptional_Parthian}\\p{Javanese}\\p{Kaithi}\\p{Lisu}\\p{Meetei_Mayek}\\p{Old_South_Arabian}\\p{Old_Turkic}\\p{Samaritan}\\p{Tai_Tham}\\p{Tai_Viet}/8\n    \\x{10b00}\\x{a6ef}\\x{13007}\\x{10857}\\x{10b78}\\x{10b58}\\x{a980}\\x{110c1}\\x{a4ff}\\x{abc0}\\x{10a7d}\\x{10c48}\\x{0800}\\x{1aad}\\x{aac0}\n 0: \\x{10b00}\\x{a6ef}\\x{13007}\\x{10857}\\x{10b78}\\x{10b58}\\x{a980}\\x{110c1}\\x{a4ff}\\x{abc0}\\x{10a7d}\\x{10c48}\\x{800}\\x{1aad}\\x{aac0}\n\n/^\\w+/8W\n    Az_\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n 0: Az_\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n\n/^[[:xdigit:]]*/8W\n    1a\\x{660}\\x{bef}\\x{16ee}\n 0: 1a\n  \n/^\\d+/8W\n    1\\x{660}\\x{bef}\\x{16ee}\n 0: 1\\x{660}\\x{bef}\n  \n/^[[:digit:]]+/8W\n    1\\x{660}\\x{bef}\\x{16ee}\n 0: 1\\x{660}\\x{bef}\n\n/^>\\s+/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n 0: > \\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{09}\\x{0b}\n  \n/^>\\pZ+/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n 0: > \\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\n  \n/^>[[:space:]]*/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{9}\\x{b} \n 0: > \\x{a0}\\x{1680}\\x{2028}\\x{2029}\\x{202f}\\x{09}\\x{0b}\n\n/^>[[:blank:]]*/8W\n    >\\x{20}\\x{a0}\\x{1680}\\x{180e}\\x{2000}\\x{202f}\\x{9}\\x{b}\\x{2028} \n 0: > \\x{a0}\\x{1680}\\x{180e}\\x{2000}\\x{202f}\\x{09}\n\n/^[[:alpha:]]*/8W\n    Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}\n 0: Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}\n\n/^[[:alnum:]]*/8W\n    Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n 0: Az\\x{aa}\\x{c0}\\x{1c5}\\x{2b0}\\x{3b6}\\x{1d7c9}\\x{2fa1d}1\\x{660}\\x{bef}\\x{16ee}\n\n/^[[:cntrl:]]*/8W\n    \\x{0}\\x{09}\\x{1f}\\x{7f}\\x{9f} \n 0: \\x{00}\\x{09}\\x{1f}\\x{7f}\n\n/^[[:graph:]]*/8W\n    A\\x{a1}\\x{a0}\n 0: A\\x{a1}\n\n/^[[:print:]]*/8W\n    A z\\x{a0}\\x{a1}\n 0: A z\\x{a0}\\x{a1}\n\n/^[[:punct:]]*/8W\n    .+\\x{a1}\\x{a0}\n 0: .+\\x{a1}\n\n/\\p{Zs}*?\\R/\n    ** Failers\nNo match\n    a\\xFCb   \nNo match\n\n/\\p{Zs}*\\R/                                                                    \n    ** Failers \nNo match\n    a\\xFCb   \nNo match\n\n/ⱥ/8i\n    ⱥ\n 0: \\x{2c65}\n    Ⱥx \n 0: \\x{23a}\n    Ⱥ \n 0: \\x{23a}\n\n/[ⱥ]/8i\n    ⱥ\n 0: \\x{2c65}\n    Ⱥx \n 0: \\x{23a}\n    Ⱥ \n 0: \\x{23a}\n\n/Ⱥ/8i\n    Ⱥ\n 0: \\x{23a}\n    ⱥ\n 0: \\x{2c65}\n    \n/-- These are tests for extended grapheme clusters --/ \n\n/^\\X/8+\n    G\\x{34e}\\x{34e}X\n 0: G\\x{34e}\\x{34e}\n 0+ X\n    \\x{34e}\\x{34e}X\n 0: \\x{34e}\\x{34e}\n 0+ X\n    \\x04X\n 0: \\x{04}\n 0+ X\n    \\x{1100}X\n 0: \\x{1100}\n 0+ X\n    \\x{1100}\\x{34e}X\n 0: \\x{1100}\\x{34e}\n 0+ X\n    \\x{1b04}\\x{1b04}X \n 0: \\x{1b04}\\x{1b04}\n 0+ X\n    *These match up to the roman letters\n 0: *\n 0+ These match up to the roman letters\n    \\x{1111}\\x{1111}L,L\n 0: \\x{1111}\\x{1111}\n 0+ L,L\n    \\x{1111}\\x{1111}\\x{1169}L,L,V\n 0: \\x{1111}\\x{1111}\\x{1169}\n 0+ L,L,V\n    \\x{1111}\\x{ae4c}L, LV\n 0: \\x{1111}\\x{ae4c}\n 0+ L, LV\n    \\x{1111}\\x{ad89}L, LVT\n 0: \\x{1111}\\x{ad89}\n 0+ L, LVT\n    \\x{1111}\\x{ae4c}\\x{1169}L, LV, V\n 0: \\x{1111}\\x{ae4c}\\x{1169}\n 0+ L, LV, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}L, LV, V, V\n 0: \\x{1111}\\x{ae4c}\\x{1169}\\x{1169}\n 0+ L, LV, V, V\n    \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}L, LV, V, T\n 0: \\x{1111}\\x{ae4c}\\x{1169}\\x{11fe}\n 0+ L, LV, V, T\n    \\x{1111}\\x{ad89}\\x{11fe}L, LVT, T\n 0: \\x{1111}\\x{ad89}\\x{11fe}\n 0+ L, LVT, T\n    \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}L, LVT, T, T\n 0: \\x{1111}\\x{ad89}\\x{11fe}\\x{11fe}\n 0+ L, LVT, T, T\n    \\x{ad89}\\x{11fe}\\x{11fe}LVT, T, T\n 0: \\x{ad89}\\x{11fe}\\x{11fe}\n 0+ LVT, T, T\n    *These match just the first codepoint (invalid sequence)\n 0: *\n 0+ These match just the first codepoint (invalid sequence)\n    \\x{1111}\\x{11fe}L, T\n 0: \\x{1111}\n 0+ \\x{11fe}L, T\n    \\x{ae4c}\\x{1111}LV, L\n 0: \\x{ae4c}\n 0+ \\x{1111}LV, L\n    \\x{ae4c}\\x{ae4c}LV, LV\n 0: \\x{ae4c}\n 0+ \\x{ae4c}LV, LV\n    \\x{ae4c}\\x{ad89}LV, LVT\n 0: \\x{ae4c}\n 0+ \\x{ad89}LV, LVT\n    \\x{1169}\\x{1111}V, L\n 0: \\x{1169}\n 0+ \\x{1111}V, L\n    \\x{1169}\\x{ae4c}V, LV\n 0: \\x{1169}\n 0+ \\x{ae4c}V, LV\n    \\x{1169}\\x{ad89}V, LVT\n 0: \\x{1169}\n 0+ \\x{ad89}V, LVT\n    \\x{ad89}\\x{1111}LVT, L\n 0: \\x{ad89}\n 0+ \\x{1111}LVT, L\n    \\x{ad89}\\x{1169}LVT, V\n 0: \\x{ad89}\n 0+ \\x{1169}LVT, V\n    \\x{ad89}\\x{ae4c}LVT, LV\n 0: \\x{ad89}\n 0+ \\x{ae4c}LVT, LV\n    \\x{ad89}\\x{ad89}LVT, LVT\n 0: \\x{ad89}\n 0+ \\x{ad89}LVT, LVT\n    \\x{11fe}\\x{1111}T, L\n 0: \\x{11fe}\n 0+ \\x{1111}T, L\n    \\x{11fe}\\x{1169}T, V\n 0: \\x{11fe}\n 0+ \\x{1169}T, V\n    \\x{11fe}\\x{ae4c}T, LV\n 0: \\x{11fe}\n 0+ \\x{ae4c}T, LV\n    \\x{11fe}\\x{ad89}T, LVT\n 0: \\x{11fe}\n 0+ \\x{ad89}T, LVT\n    *Test extend and spacing mark\n 0: *\n 0+ Test extend and spacing mark\n    \\x{1111}\\x{ae4c}\\x{0711}L, LV, extend\n 0: \\x{1111}\\x{ae4c}\\x{711}\n 0+ L, LV, extend\n    \\x{1111}\\x{ae4c}\\x{1b04}L, LV, spacing mark\n 0: \\x{1111}\\x{ae4c}\\x{1b04}\n 0+ L, LV, spacing mark\n    \\x{1111}\\x{ae4c}\\x{1b04}\\x{0711}\\x{1b04}L, LV, spacing mark, extend, spacing mark\n 0: \\x{1111}\\x{ae4c}\\x{1b04}\\x{711}\\x{1b04}\n 0+ L, LV, spacing mark, extend, spacing mark\n    *Test CR, LF, and control\n 0: *\n 0+ Test CR, LF, and control\n    \\x0d\\x{0711}CR, extend\n 0: \\x{0d}\n 0+ \\x{711}CR, extend\n    \\x0d\\x{1b04}CR, spacingmark\n 0: \\x{0d}\n 0+ \\x{1b04}CR, spacingmark\n    \\x0a\\x{0711}LF, extend\n 0: \\x{0a}\n 0+ \\x{711}LF, extend\n    \\x0a\\x{1b04}LF, spacingmark\n 0: \\x{0a}\n 0+ \\x{1b04}LF, spacingmark\n    \\x0b\\x{0711}Control, extend\n 0: \\x{0b}\n 0+ \\x{711}Control, extend\n    \\x09\\x{1b04}Control, spacingmark\n 0: \\x{09}\n 0+ \\x{1b04}Control, spacingmark\n    *There are no Prepend characters, so we can't test Prepend, CR\n 0: *\n 0+ There are no Prepend characters, so we can't test Prepend, CR\n    \n/^(?>\\X{2})X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \n/^\\X{2,4}X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n\n/^\\X{2,4}?X/8+\n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n    \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0: \\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}\\x{1111}\\x{ae4c}X\n 0+ \n\n/\\X*Z/8Y\n  A\\x{300}\nNo match\n\n/\\X*(.)/8Y\n  A\\x{1111}\\x{ae4c}\\x{1169}\n 0: A\\x{1111}\n 1: \\x{1111}\n\n/\\X?abc/8Y\n\\xff\\x7f\\x00\\x00\\x03\\x00\\x41\\xcc\\x80\\x41\\x{300}\\x61\\x62\\x63\\x00\\>06\\?\n 0: A\\x{300}abc\n\n/-- --/\n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/[z\\x{1e9e}]+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/[z\\x{00df}]+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/[z\\x{1f88}]+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n    \n/-- Characters with more than one other case; test in classes --/\n\n/[z\\x{00b5}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/[z\\x{039c}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/[z\\x{03bc}]+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/[z\\x{00c5}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/[z\\x{00e5}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/[z\\x{212b}]+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/[z\\x{01c4}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/[z\\x{01c5}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/[z\\x{01c6}]+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/[z\\x{01c7}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/[z\\x{01c8}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/[z\\x{01c9}]+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/[z\\x{01ca}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/[z\\x{01cb}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/[z\\x{01cc}]+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/[z\\x{01f1}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/[z\\x{01f2}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/[z\\x{01f3}]+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/[z\\x{0345}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/[z\\x{0399}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/[z\\x{03b9}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/[z\\x{1fbe}]+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/[z\\x{0392}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/[z\\x{03b2}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/[z\\x{03d0}]+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/[z\\x{0395}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/[z\\x{03b5}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/[z\\x{03f5}]+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/[z\\x{0398}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/[z\\x{03b8}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/[z\\x{03d1}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/[z\\x{03f4}]+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/[z\\x{039a}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/[z\\x{03ba}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/[z\\x{03f0}]+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/[z\\x{03a0}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/[z\\x{03c0}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/[z\\x{03d6}]+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/[z\\x{03a1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/[z\\x{03c1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/[z\\x{03f1}]+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/[z\\x{03a3}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/[z\\x{03c2}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/[z\\x{03c3}]+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/[z\\x{03a6}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/[z\\x{03c6}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/[z\\x{03d5}]+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/[z\\x{03c9}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/[z\\x{03a9}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/[z\\x{2126}]+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/[z\\x{1e60}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/[z\\x{1e61}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/[z\\x{1e9b}]+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/\n\n/[z\\x{004b}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/[z\\x{006b}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/[z\\x{212a}]+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/[z\\x{0053}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/[z\\x{0073}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/[z\\x{017f}]+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n    \n/-- --/ \n\n/(ΣΆΜΟΣ) \\1/8i\n    ΣΆΜΟΣ ΣΆΜΟΣ\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n    ΣΆΜΟΣ σάμος\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n    σάμος σάμος\n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n    σάμος σάμοσ\n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c3}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n    σάμος ΣΆΜΟΣ  \n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n\n/(σάμος) \\1/8i\n    ΣΆΜΟΣ ΣΆΜΟΣ\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n    ΣΆΜΟΣ σάμος\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n    σάμος σάμος\n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n    σάμος σάμοσ\n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c3}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n    σάμος ΣΆΜΟΣ  \n 0: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2} \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n 1: \\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n\n/(ΣΆΜΟΣ) \\1*/8i\n    ΣΆΜΟΣ\\x20\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n    ΣΆΜΟΣ ΣΆΜΟΣσάμοςσάμος\n 0: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3} \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\\x{3c3}\\x{3ac}\\x{3bc}\\x{3bf}\\x{3c2}\n 1: \\x{3a3}\\x{386}\\x{39c}\\x{39f}\\x{3a3}\n\n/-- Perl matches these --/\n\n/\\x{00b5}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/\\x{039c}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n/\\x{03bc}+/8i\n    \\x{00b5}\\x{039c}\\x{03bc}\n 0: \\x{b5}\\x{39c}\\x{3bc}\n\n\n/\\x{00c5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/\\x{00e5}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n/\\x{212b}+/8i\n    \\x{00c5}\\x{00e5}\\x{212b}\n 0: \\x{c5}\\x{e5}\\x{212b}\n\n\n/\\x{01c4}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/\\x{01c5}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n/\\x{01c6}+/8i\n    \\x{01c4}\\x{01c5}\\x{01c6}\n 0: \\x{1c4}\\x{1c5}\\x{1c6}\n\n\n/\\x{01c7}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/\\x{01c8}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n/\\x{01c9}+/8i\n    \\x{01c7}\\x{01c8}\\x{01c9}\n 0: \\x{1c7}\\x{1c8}\\x{1c9}\n\n\n/\\x{01ca}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/\\x{01cb}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n/\\x{01cc}+/8i\n    \\x{01ca}\\x{01cb}\\x{01cc}\n 0: \\x{1ca}\\x{1cb}\\x{1cc}\n\n\n/\\x{01f1}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/\\x{01f2}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n/\\x{01f3}+/8i\n    \\x{01f1}\\x{01f2}\\x{01f3}\n 0: \\x{1f1}\\x{1f2}\\x{1f3}\n\n\n/\\x{0345}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{0399}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{03b9}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n/\\x{1fbe}+/8i\n    \\x{0345}\\x{0399}\\x{03b9}\\x{1fbe}\n 0: \\x{345}\\x{399}\\x{3b9}\\x{1fbe}\n\n\n/\\x{0392}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/\\x{03b2}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n\n/\\x{03d0}+/8i\n    \\x{0392}\\x{03b2}\\x{03d0}\n 0: \\x{392}\\x{3b2}\\x{3d0}\n    \n\n/\\x{0395}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/\\x{03b5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n/\\x{03f5}+/8i\n    \\x{0395}\\x{03b5}\\x{03f5}\n 0: \\x{395}\\x{3b5}\\x{3f5}\n\n\n/\\x{0398}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03b8}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03d1}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n\n/\\x{03f4}+/8i\n    \\x{0398}\\x{03b8}\\x{03d1}\\x{03f4}\n 0: \\x{398}\\x{3b8}\\x{3d1}\\x{3f4}\n    \n\n/\\x{039a}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/\\x{03ba}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n\n/\\x{03f0}+/8i\n    \\x{039a}\\x{03ba}\\x{03f0}\n 0: \\x{39a}\\x{3ba}\\x{3f0}\n    \n\n/\\x{03a0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/\\x{03c0}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n/\\x{03d6}+/8i\n    \\x{03a0}\\x{03c0}\\x{03d6} \n 0: \\x{3a0}\\x{3c0}\\x{3d6}\n\n\n/\\x{03a1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/\\x{03c1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n/\\x{03f1}+/8i\n    \\x{03a1}\\x{03c1}\\x{03f1}\n 0: \\x{3a1}\\x{3c1}\\x{3f1}\n\n\n/\\x{03a3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/\\x{03c2}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n\n/\\x{03c3}+/8i\n    \\x{03A3}\\x{03C2}\\x{03C3}\n 0: \\x{3a3}\\x{3c2}\\x{3c3}\n    \n\n/\\x{03a6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/\\x{03c6}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n/\\x{03d5}+/8i\n    \\x{03a6}\\x{03c6}\\x{03d5} \n 0: \\x{3a6}\\x{3c6}\\x{3d5}\n\n\n/\\x{03c9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/\\x{03a9}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n\n/\\x{2126}+/8i\n    \\x{03c9}\\x{03a9}\\x{2126}\n 0: \\x{3c9}\\x{3a9}\\x{2126}\n    \n\n/\\x{1e60}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e61}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n\n/\\x{1e9b}+/8i\n    \\x{1e60}\\x{1e61}\\x{1e9b}\n 0: \\x{1e60}\\x{1e61}\\x{1e9b}\n    \n\n/\\x{1e9e}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n\n/\\x{00df}+/8i\n    \\x{1e9e}\\x{00df}\n 0: \\x{1e9e}\\x{df}\n    \n\n/\\x{1f88}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n/\\x{1f80}+/8i\n    \\x{1f88}\\x{1f80} \n 0: \\x{1f88}\\x{1f80}\n\n\n/-- Perl 5.12.4 gets these wrong, but 5.15.3 is OK --/\n\n/\\x{004b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/\\x{006b}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n/\\x{212a}+/8i\n    \\x{004b}\\x{006b}\\x{212a}\n 0: Kk\\x{212a}\n\n\n/\\x{0053}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/\\x{0073}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/\\x{017f}+/8i\n    \\x{0053}\\x{0073}\\x{017f}\n 0: Ss\\x{17f}\n\n/^\\p{Any}*\\d{4}/8\n    1234\n 0: 1234\n    123 \nNo match\n\n/^\\X*\\w{4}/8\n    1234\n 0: 1234\n    123  \nNo match\n\n/^A\\s+Z/8W\n    A\\x{2005}Z\n 0: A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n 0: A\\x{85}\\x{180e}\\x{2005}Z\n\n/^A[\\s]+Z/8W\n    A\\x{2005}Z\n 0: A\\x{2005}Z\n    A\\x{85}\\x{180e}\\x{2005}Z\n 0: A\\x{85}\\x{180e}\\x{2005}Z\n\n/^[[:graph:]]+$/8W\n    Letter:ABC\n 0: Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n 0: Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n 0: Number:9\\x{660}\n    Punctuation:\\x{66a},;\n 0: Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n 0: Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n 0: Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n 0: \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n 0: \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n 0: \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n 0: \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n 0: \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n 0: \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n 0: \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n 0: \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n 0: \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n 0: \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n    ** Failers\nNo match\n    \\x{09}\nNo match\n    \\x{0a}\nNo match\n    \\x{1D}\nNo match\n    \\x{20}\nNo match\n    \\x{85}\nNo match\n    \\x{a0}\nNo match\n    \\x{61c}\nNo match\n    \\x{1680}\nNo match\n    \\x{180e}\nNo match\n    \\x{2028}\nNo match\n    \\x{2029}\nNo match\n    \\x{202f}\nNo match\n    \\x{2065}\nNo match\n    \\x{2066}\nNo match\n    \\x{2067}\nNo match\n    \\x{2068}\nNo match\n    \\x{2069}\nNo match\n    \\x{3000}\nNo match\n    \\x{e0002}\nNo match\n    \\x{e001f}\nNo match\n    \\x{e0080} \nNo match\n\n/^[[:print:]]+$/8W\n    Space: \\x{a0}\n 0: Space: \\x{a0}\n    \\x{1680}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\n 0: \\x{1680}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\n    \\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a} \n 0: \\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a}\n    \\x{202f}\\x{205f} \n 0: \\x{202f}\\x{205f}\n    \\x{3000}\n 0: \\x{3000}\n    Letter:ABC\n 0: Letter:ABC\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\n 0: Mark:\\x{300}\\x{1d172}\\x{1d17b}\n    Number:9\\x{660}\n 0: Number:9\\x{660}\n    Punctuation:\\x{66a},;\n 0: Punctuation:\\x{66a},;\n    Symbol:\\x{6de}<>\\x{fffc}\n 0: Symbol:\\x{6de}<>\\x{fffc}\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n 0: Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\n    \\x{180e}\n 0: \\x{180e}\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n 0: \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n 0: \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\n    \\x{202f}\n 0: \\x{202f}\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n 0: \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n 0: \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\n    \\x{feff}\n 0: \\x{feff}\n    \\x{fff9}\\x{fffa}\\x{fffb}\n 0: \\x{fff9}\\x{fffa}\\x{fffb}\n    \\x{110bd}\n 0: \\x{110bd}\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n 0: \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\n    \\x{e0001}\n 0: \\x{e0001}\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n 0: \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\n    ** Failers\n 0: ** Failers\n    \\x{09}\nNo match\n    \\x{1D}\nNo match\n    \\x{85}\nNo match\n    \\x{61c}\nNo match\n    \\x{2028}\nNo match\n    \\x{2029}\nNo match\n    \\x{2065}\nNo match\n    \\x{2066}\nNo match\n    \\x{2067}\nNo match\n    \\x{2068}\nNo match\n    \\x{2069}\nNo match\n    \\x{e0002}\nNo match\n    \\x{e001f}\nNo match\n    \\x{e0080} \nNo match\n\n/^[[:punct:]]+$/8W\n    \\$+<=>^`|~\n 0: $+<=>^`|~\n    !\\\"#%&'()*,-./:;?@[\\\\]_{}\n 0: !\"#%&'()*,-./:;?@[\\]_{}\n    \\x{a1}\\x{a7}  \n 0: \\x{a1}\\x{a7}\n    \\x{37e} \n 0: \\x{37e}\n    ** Failers\nNo match\n    abcde  \nNo match\n\n/^[[:^graph:]]+$/8W\n    \\x{09}\\x{0a}\\x{1D}\\x{20}\\x{85}\\x{a0}\\x{61c}\\x{1680}\\x{180e}\n 0: \\x{09}\\x{0a}\\x{1d} \\x{85}\\x{a0}\\x{61c}\\x{1680}\\x{180e}\n    \\x{2028}\\x{2029}\\x{202f}\\x{2065}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\n 0: \\x{2028}\\x{2029}\\x{202f}\\x{2065}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\n    \\x{3000}\\x{e0002}\\x{e001f}\\x{e0080}\n 0: \\x{3000}\\x{e0002}\\x{e001f}\\x{e0080}\n    ** Failers\nNo match\n    Letter:ABC\nNo match\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\nNo match\n    Number:9\\x{660}\nNo match\n    Punctuation:\\x{66a},;\nNo match\n    Symbol:\\x{6de}<>\\x{fffc}\nNo match\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\nNo match\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\nNo match\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\nNo match\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\nNo match\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\nNo match\n    \\x{feff}\nNo match\n    \\x{fff9}\\x{fffa}\\x{fffb}\nNo match\n    \\x{110bd}\nNo match\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\nNo match\n    \\x{e0001}\nNo match\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\nNo match\n\n/^[[:^print:]]+$/8W\n    \\x{09}\\x{1D}\\x{85}\\x{61c}\\x{2028}\\x{2029}\\x{2065}\\x{2066}\\x{2067}\n 0: \\x{09}\\x{1d}\\x{85}\\x{61c}\\x{2028}\\x{2029}\\x{2065}\\x{2066}\\x{2067}\n    \\x{2068}\\x{2069}\\x{e0002}\\x{e001f}\\x{e0080}\n 0: \\x{2068}\\x{2069}\\x{e0002}\\x{e001f}\\x{e0080}\n    ** Failers\nNo match\n    Space: \\x{a0}\nNo match\n    \\x{1680}\\x{2000}\\x{2001}\\x{2002}\\x{2003}\\x{2004}\\x{2005}\nNo match\n    \\x{2006}\\x{2007}\\x{2008}\\x{2009}\\x{200a} \nNo match\n    \\x{202f}\\x{205f} \nNo match\n    \\x{3000}\nNo match\n    Letter:ABC\nNo match\n    Mark:\\x{300}\\x{1d172}\\x{1d17b}\nNo match\n    Number:9\\x{660}\nNo match\n    Punctuation:\\x{66a},;\nNo match\n    Symbol:\\x{6de}<>\\x{fffc}\nNo match\n    Cf-property:\\x{ad}\\x{600}\\x{601}\\x{602}\\x{603}\\x{604}\\x{6dd}\\x{70f}\nNo match\n    \\x{180e}\nNo match\n    \\x{200b}\\x{200c}\\x{200d}\\x{200e}\\x{200f}\nNo match\n    \\x{202a}\\x{202b}\\x{202c}\\x{202d}\\x{202e}\nNo match\n    \\x{202f}\nNo match\n    \\x{2060}\\x{2061}\\x{2062}\\x{2063}\\x{2064}\nNo match\n    \\x{206a}\\x{206b}\\x{206c}\\x{206d}\\x{206e}\\x{206f}\nNo match\n    \\x{feff}\nNo match\n    \\x{fff9}\\x{fffa}\\x{fffb}\nNo match\n    \\x{110bd}\nNo match\n    \\x{1d173}\\x{1d174}\\x{1d175}\\x{1d176}\\x{1d177}\\x{1d178}\\x{1d179}\\x{1d17a}\nNo match\n    \\x{e0001}\nNo match\n    \\x{e0020}\\x{e0030}\\x{e0040}\\x{e0050}\\x{e0060}\\x{e0070}\\x{e007f}\nNo match\n\n/^[[:^punct:]]+$/8W\n    abcde  \n 0: abcde\n    ** Failers\nNo match\n    \\$+<=>^`|~\nNo match\n    !\\\"#%&'()*,-./:;?@[\\\\]_{}\nNo match\n    \\x{a1}\\x{a7}  \nNo match\n    \\x{37e} \nNo match\n\n/[RST]+/8iW\n    Ss\\x{17f}\n 0: Ss\\x{17f}\n    \n/[R-T]+/8iW \n    Ss\\x{17f}\n 0: Ss\\x{17f}\n\n/[q-u]+/8iW \n    Ss\\x{17f}\n 0: Ss\\x{17f}\n\n/^s?c/mi8\n    scat\n 0: sc\n\n/[A-`]/i8\n    abcdefghijklmno\n 0: a\n\n/\\C\\X*QT/8\n    Ӆ\\x0aT\nNo match\n\n/[\\pS#moq]/\n    =\n 0: =\n\n/[[:punct:]]/8W\n    \\xc2\\xb4\nNo match\n    \\x{b4} \nNo match\n\n/[[:^ascii:]]/8W\n    \\x{100}\n 0: \\x{100}\n    \\x{200}\n 0: \\x{200}\n    \\x{300}\n 0: \\x{300}\n    \\x{37e}\n 0: \\x{37e}\n    a\nNo match\n    9\nNo match\n    g\nNo match\n\n/[[:^ascii:]\\w]/8W\n    a\n 0: a\n    9\n 0: 9\n    g\n 0: g\n    \\x{100}\n 0: \\x{100}\n    \\x{200}\n 0: \\x{200}\n    \\x{300}\n 0: \\x{300}\n    \\x{37e}\n 0: \\x{37e}\n\n/[\\w[:^ascii:]]/8W\n    a\n 0: a\n    9\n 0: 9\n    g\n 0: g\n    \\x{100}\n 0: \\x{100}\n    \\x{200}\n 0: \\x{200}\n    \\x{300}\n 0: \\x{300}\n    \\x{37e}\n 0: \\x{37e}\n\n/[^[:ascii:]\\W]/8W\n    a\nNo match\n    9\nNo match\n    g\nNo match\n    \\x{100}\n 0: \\x{100}\n    \\x{200}\n 0: \\x{200}\n    \\x{300}\nNo match\n    \\x{37e}\nNo match\n\n/[[:^ascii:]a]/8W\n    a\n 0: a\n    9\nNo match\n    g\nNo match\n    \\x{100}\n 0: \\x{100}\n    \\x{200}\n 0: \\x{200}\n    \\x{37e}\n 0: \\x{37e}\n\n/[^[:^ascii:]\\d]/8W\n    a\n 0: a\n    ~\n 0: ~\n    0\nNo match\n    \\a\n 0: \\x{07}\n    \\x{7f}\n 0: \\x{7f}\n    \\x{389}\nNo match\n    \\x{20ac}\nNo match\n\n/(?=.*b)\\pL/\n    11bb\n 0: b\n    \n/(?(?=.*b)(?=.*b)\\pL|.*c)/\n    11bb\n 0: b\n\n/-- End of testinput6 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput7",
    "content": "/-- These tests for Unicode property support test PCRE's API and show some of\n    the compiled code. They are not Perl-compatible. --/\n\n/[\\p{L}]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\p{L}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\p{^L}]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\P{L}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\P{L}]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\P{L}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[\\P{^L}]/DZ\n------------------------------------------------------------------\n        Bra\n        [\\p{L}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/[abc\\p{L}\\x{0660}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [a-c\\p{L}\\x{660}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n\n/[\\p{Nd}]/8DZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Nd}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n    1234\n 0: 1\n\n/[\\p{Nd}+-]+/8DZ\n------------------------------------------------------------------\n        Bra\n        [+\\-\\p{Nd}]++\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: utf\nNo first char\nNo need char\n    1234\n 0: 1234\n    12-34\n 0: 12-34\n    12+\\x{661}-34  \n 0: 12+\\x{661}-34\n    ** Failers\nNo match\n    abcd  \nNo match\n\n/[\\x{105}-\\x{109}]/8iDZ\n------------------------------------------------------------------\n        Bra\n        [\\x{104}-\\x{109}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\n    \\x{104}\n 0: \\x{104}\n    \\x{105}\n 0: \\x{105}\n    \\x{109}  \n 0: \\x{109}\n    ** Failers\nNo match\n    \\x{100}\nNo match\n    \\x{10a} \nNo match\n    \n/[z-\\x{100}]/8iDZ \n------------------------------------------------------------------\n        Bra\n        [Zz-\\xff\\x{39c}\\x{3bc}\\x{212b}\\x{1e9e}\\x{212b}\\x{178}\\x{100}-\\x{101}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\n    Z\n 0: Z\n    z\n 0: z\n    \\x{39c}\n 0: \\x{39c}\n    \\x{178}\n 0: \\x{178}\n    |\n 0: |\n    \\x{80}\n 0: \\x{80}\n    \\x{ff}\n 0: \\x{ff}\n    \\x{100}\n 0: \\x{100}\n    \\x{101} \n 0: \\x{101}\n    ** Failers\nNo match\n    \\x{102}\nNo match\n    Y\nNo match\n    y           \nNo match\n\n/[z-\\x{100}]/8DZi\n------------------------------------------------------------------\n        Bra\n        [Zz-\\xff\\x{39c}\\x{3bc}\\x{212b}\\x{1e9e}\\x{212b}\\x{178}\\x{100}-\\x{101}]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNo need char\n\n/(?:[\\PPa*]*){8,}/\n\n/[\\P{Any}]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\P{Any}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\P{Any}\\E]/BZ\n------------------------------------------------------------------\n        Bra\n        [\\P{Any}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/(\\P{Yi}+\\277)/\n\n/(\\P{Yi}+\\277)?/\n\n/(?<=\\P{Yi}{3}A)X/\n\n/\\p{Yi}+(\\P{Yi}+)(?1)/\n\n/(\\P{Yi}{2}\\277)?/\n\n/[\\P{Yi}A]/\n\n/[\\P{Yi}\\P{Yi}\\P{Yi}A]/\n\n/[^\\P{Yi}A]/\n\n/[^\\P{Yi}\\P{Yi}\\P{Yi}A]/\n\n/(\\P{Yi}*\\277)*/\n\n/(\\P{Yi}*?\\277)*/\n\n/(\\p{Yi}*+\\277)*/\n\n/(\\P{Yi}?\\277)*/\n\n/(\\P{Yi}??\\277)*/\n\n/(\\p{Yi}?+\\277)*/\n\n/(\\P{Yi}{0,3}\\277)*/\n\n/(\\P{Yi}{0,3}?\\277)*/\n\n/(\\p{Yi}{0,3}+\\277)*/\n\n/\\p{Zl}{2,3}+/8BZ\n------------------------------------------------------------------\n        Bra\n        prop Zl {2}\n        prop Zl ?+\n        Ket\n        End\n------------------------------------------------------------------\n      \n 0: \\x{2028}\\x{2028}\n    \\x{2028}\\x{2028}\\x{2028}\n 0: \\x{2028}\\x{2028}\\x{2028}\n    \n/\\p{Zl}/8BZ\n------------------------------------------------------------------\n        Bra\n        prop Zl\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Lu}{3}+/8BZ\n------------------------------------------------------------------\n        Bra\n        prop Lu {3}\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\pL{2}+/8BZ\n------------------------------------------------------------------\n        Bra\n        prop L {2}\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Cc}{2}+/8BZ\n------------------------------------------------------------------\n        Bra\n        prop Cc {2}\n        Ket\n        End\n------------------------------------------------------------------\n\n/^\\p{Cf}/8\n    \\x{180e}\n 0: \\x{180e}\n    \\x{061c}\n 0: \\x{61c}\n    \\x{2066}\n 0: \\x{2066}\n    \\x{2067}\n 0: \\x{2067}\n    \\x{2068}\n 0: \\x{2068}\n    \\x{2069}\n 0: \\x{2069}\n\n/^\\p{Cs}/8\n    \\?\\x{dfff}\n 0: \\x{dfff}\n    ** Failers\nNo match\n    \\x{09f} \nNo match\n  \n/^\\p{Mn}/8\n    \\x{1a1b}\n 0: \\x{1a1b}\n\n/^\\p{Pe}/8\n    \\x{2309}\n 0: \\x{2309}\n    \\x{230b}\n 0: \\x{230b}\n\n/^\\p{Ps}/8\n    \\x{2308}\n 0: \\x{2308}\n    \\x{230a}\n 0: \\x{230a}\n\n/^\\p{Sc}+/8\n    $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\\x{a6}\n 0: $\\x{a2}\\x{a3}\\x{a4}\\x{a5}\n    \\x{9f2}\n 0: \\x{9f2}\n    ** Failers\nNo match\n    X\nNo match\n    \\x{2c2}\nNo match\n  \n/^\\p{Zs}/8\n    \\ \\\n 0:  \n    \\x{a0}\n 0: \\x{a0}\n    \\x{1680}\n 0: \\x{1680}\n    \\x{2000}\n 0: \\x{2000}\n    \\x{2001}     \n 0: \\x{2001}\n    ** Failers\nNo match\n    \\x{2028}\nNo match\n    \\x{200d} \nNo match\n  \n/-- These are here rather than in test 6 because Perl has problems with\n    the negative versions of the properties and behaves has changed how\n    it behaves for caseless matching. --/\n      \n/\\p{^Lu}/8i\n    1234\n 0: 1\n    ** Failers\n 0: *\n    ABC \nNo match\n\n/\\P{Lu}/8i\n    1234\n 0: 1\n    ** Failers\n 0: *\n    ABC \nNo match\n\n/\\p{Ll}/8i \n    a\n 0: a\n    Az\n 0: z\n    ** Failers\n 0: a\n    ABC   \nNo match\n\n/\\p{Lu}/8i\n    A\n 0: A\n    a\\x{10a0}B \n 0: \\x{10a0}\n    ** Failers \n 0: F\n    a\nNo match\n    \\x{1d00}  \nNo match\n\n/\\p{Lu}/8i\n    A\n 0: A\n    aZ\n 0: Z\n    ** Failers\n 0: F\n    abc   \nNo match\n\n/[\\x{c0}\\x{391}]/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/-- The next two are special cases where the lengths of the different cases of\nthe same character differ. The first went wrong with heap frame storage; the\nsecond was broken in all cases. --/\n\n/^\\x{023a}+?(\\x{0130}+)/8i\n  \\x{023a}\\x{2c65}\\x{0130}\n 0: \\x{23a}\\x{2c65}\\x{130}\n 1: \\x{130}\n  \n/^\\x{023a}+([^X])/8i\n  \\x{023a}\\x{2c65}X\n 0: \\x{23a}\\x{2c65}\n 1: \\x{2c65}\n\n/\\x{c0}+\\x{116}+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n 0: \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/[\\x{c0}\\x{116}]+/8i\n    \\x{c0}\\x{e0}\\x{116}\\x{117}\n 0: \\x{c0}\\x{e0}\\x{116}\\x{117}\n\n/(\\x{de})\\1/8i\n    \\x{de}\\x{de}\n 0: \\x{de}\\x{de}\n 1: \\x{de}\n    \\x{de}\\x{fe}\n 0: \\x{de}\\x{fe}\n 1: \\x{de}\n    \\x{fe}\\x{fe}\n 0: \\x{fe}\\x{fe}\n 1: \\x{fe}\n    \\x{fe}\\x{de}\n 0: \\x{fe}\\x{de}\n 1: \\x{fe}\n\n/^\\x{c0}$/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/^\\x{e0}$/8i\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/-- The next two should be Perl-compatible, but it fails to match \\x{e0}. PCRE\nwill match it only with UCP support, because without that it has no notion\nof case for anything other than the ASCII letters. --/ \n\n/((?i)[\\x{c0}])/8\n    \\x{c0}\n 0: \\x{c0}\n 1: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n 1: \\x{e0}\n\n/(?i:[\\x{c0}])/8\n    \\x{c0}\n 0: \\x{c0}\n    \\x{e0} \n 0: \\x{e0}\n\n/-- These are PCRE's extra properties to help with Unicodizing \\d etc. --/\n\n/^\\p{Xan}/8\n    ABCD\n 0: A\n    1234\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^\\p{Xan}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^\\p{Xan}+?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n 0: \\x{6ca}\n\n/^\\p{Xan}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^\\p{Xan}{2,9}/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\n    \n/^\\p{Xan}{2,9}?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n 0: \\x{6ca}\\x{a6c}\n    \n/^[\\p{Xan}]/8\n    ABCD1234_\n 0: A\n    1234abcd_\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n \n/^[\\p{Xan}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}\n    ** Failers\nNo match\n    _ABC   \nNo match\n\n/^>\\p{Xsp}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n    >\\x{a0} \n 0: >\\x{a0}\n    ** Failers\nNo match\n    \\x{0b} \nNo match\n\n/^>\\p{Xsp}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xsp}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n\n/^>\\p{Xsp}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xsp}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xsp}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\n    \n/^>[\\p{Xsp}]/8\n    >\\x{2028}\\x{0b}\n 0: >\\x{2028}\n \n/^>[\\p{Xsp}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n    >\\x{a0} \n 0: >\\x{a0}\n    ** Failers\nNo match\n    \\x{0b} \nNo match\n\n/^>\\p{Xps}+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^>\\p{Xps}+?/8\n    >\\x{1680}\\x{2028}\\x{0b}\n 0: >\\x{1680}\n\n/^>\\p{Xps}*/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n    \n/^>\\p{Xps}{2,9}?/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\n    \n/^>[\\p{Xps}]/8\n    >\\x{2028}\\x{0b}\n 0: >\\x{2028}\n \n/^>[\\p{Xps}]+/8\n    > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n 0: > \\x{09}\\x{0a}\\x{0c}\\x{0d}\\x{a0}\\x{1680}\\x{2028}\\x{0b}\n\n/^\\p{Xwd}/8\n    ABCD\n 0: A\n    1234\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}\n 0: \\x{10a7}\n    _ABC    \n 0: _\n    ** Failers\nNo match\n    [] \nNo match\n\n/^\\p{Xwd}+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/^\\p{Xwd}+?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n 0: \\x{6ca}\n\n/^\\p{Xwd}*/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n    \n/^\\p{Xwd}{2,9}/8\n    A_B12\\x{6ca}\\x{a6c}\\x{10a7}\n 0: A_B12\\x{6ca}\\x{a6c}\\x{10a7}\n    \n/^\\p{Xwd}{2,9}?/8\n    \\x{6ca}\\x{a6c}\\x{10a7}_\n 0: \\x{6ca}\\x{a6c}\n    \n/^[\\p{Xwd}]/8\n    ABCD1234_\n 0: A\n    1234abcd_\n 0: 1\n    \\x{6ca}\n 0: \\x{6ca}\n    \\x{a6c}\n 0: \\x{a6c}\n    \\x{10a7}   \n 0: \\x{10a7}\n    _ABC \n 0: _\n    ** Failers\nNo match\n    []   \nNo match\n \n/^[\\p{Xwd}]+/8\n    ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n 0: ABCD1234\\x{6ca}\\x{a6c}\\x{10a7}_\n\n/-- A check not in UTF-8 mode --/\n\n/^[\\p{Xwd}]+/\n    ABCD1234_\n 0: ABCD1234_\n    \n/-- Some negative checks --/\n\n/^[\\P{Xwd}]+/8\n    !.+\\x{019}\\x{35a}AB\n 0: !.+\\x{19}\\x{35a}\n\n/^[\\p{^Xwd}]+/8\n    !.+\\x{019}\\x{35a}AB\n 0: !.+\\x{19}\\x{35a}\n\n/[\\D]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\P{Nd}]\n        Ket\n        End\n------------------------------------------------------------------\n    1\\x{3c8}2\n 0: \\x{3c8}\n\n/[\\d]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\p{Nd}]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{6f4}<\n 0: \\x{6f4}\n\n/[\\S]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\P{Xsp}]\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{1680}\\x{6f4}\\x{1680}\n 0: \\x{6f4}\n\n/[\\s]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\p{Xsp}]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1680}<\n 0: \\x{1680}\n\n/[\\W]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\P{Xwd}]\n        Ket\n        End\n------------------------------------------------------------------\n    A\\x{1712}B\n 0: \\x{1712}\n\n/[\\w]/WBZ8\n------------------------------------------------------------------\n        Bra\n        [\\p{Xwd}]\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1723}<\n 0: \\x{1723}\n\n/\\D/WBZ8\n------------------------------------------------------------------\n        Bra\n        notprop Nd\n        Ket\n        End\n------------------------------------------------------------------\n    1\\x{3c8}2\n 0: \\x{3c8}\n\n/\\d/WBZ8\n------------------------------------------------------------------\n        Bra\n        prop Nd\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{6f4}<\n 0: \\x{6f4}\n\n/\\S/WBZ8\n------------------------------------------------------------------\n        Bra\n        notprop Xsp\n        Ket\n        End\n------------------------------------------------------------------\n    \\x{1680}\\x{6f4}\\x{1680}\n 0: \\x{6f4}\n\n/\\s/WBZ8\n------------------------------------------------------------------\n        Bra\n        prop Xsp\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1680}>\n 0: \\x{1680}\n\n/\\W/WBZ8\n------------------------------------------------------------------\n        Bra\n        notprop Xwd\n        Ket\n        End\n------------------------------------------------------------------\n    A\\x{1712}B\n 0: \\x{1712}\n\n/\\w/WBZ8\n------------------------------------------------------------------\n        Bra\n        prop Xwd\n        Ket\n        End\n------------------------------------------------------------------\n    >\\x{1723}<\n 0: \\x{1723}\n\n/[[:alpha:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{L}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:lower:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Ll}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:upper:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Lu}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:alnum:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Xan}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:ascii:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x7f]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:cntrl:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\x00-\\x1f\\x7f]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:digit:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Nd}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:graph:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [[:graph:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:print:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [[:print:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:punct:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [[:punct:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:space:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Xps}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:word:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{Xwd}]\n        Ket\n        End\n------------------------------------------------------------------\n\n/[[:xdigit:]]/WBZ\n------------------------------------------------------------------\n        Bra\n        [0-9A-Fa-f]\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- Unicode properties for \\b abd \\B --/\n\n/\\b...\\B/8W\n    abc_\n 0: abc\n    \\x{37e}abc\\x{376} \n 0: abc\n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \n 0: \\x{376}\\x{371}\\x{393}\n    !\\x{c0}++\\x{c1}\\x{c2} \n 0: ++\\x{c1}\n    !\\x{c0}+++++ \n 0: \\x{c0}++\n\n/-- Without PCRE_UCP, non-ASCII always fail, even if < 256  --/\n\n/\\b...\\B/8\n    abc_\n 0: abc\n    ** Failers \n 0: Fai\n    \\x{37e}abc\\x{376} \nNo match\n    \\x{37e}\\x{376}\\x{371}\\x{393}\\x{394} \nNo match\n    !\\x{c0}++\\x{c1}\\x{c2} \nNo match\n    !\\x{c0}+++++ \nNo match\n\n/-- With PCRE_UCP, non-UTF8 chars that are < 256 still check properties  --/\n\n/\\b...\\B/W\n    abc_\n 0: abc\n    !\\x{c0}++\\x{c1}\\x{c2} \n 0: ++\\xc1\n    !\\x{c0}+++++ \n 0: \\xc0++\n\n/-- Some of these are silly, but they check various combinations --/\n\n/[[:^alpha:][:^cntrl:]]+/8WBZ\n------------------------------------------------------------------\n        Bra\n        [ -~\\x80-\\xff\\P{L}\\x{100}-\\x{10ffff}]++\n        Ket\n        End\n------------------------------------------------------------------\n    123\n 0: 123\n    abc \n 0: abc\n\n/[[:^cntrl:][:^alpha:]]+/8WBZ\n------------------------------------------------------------------\n        Bra\n        [ -~\\x80-\\xff\\x{100}-\\x{10ffff}\\P{L}]++\n        Ket\n        End\n------------------------------------------------------------------\n    123\n 0: 123\n    abc \n 0: abc\n\n/[[:alpha:]]+/8WBZ\n------------------------------------------------------------------\n        Bra\n        [\\p{L}]++\n        Ket\n        End\n------------------------------------------------------------------\n    abc\n 0: abc\n\n/[[:^alpha:]\\S]+/8WBZ\n------------------------------------------------------------------\n        Bra\n        [\\P{L}\\P{Xsp}]++\n        Ket\n        End\n------------------------------------------------------------------\n    123\n 0: 123\n    abc \n 0: abc\n\n/[^\\d]+/8WBZ\n------------------------------------------------------------------\n        Bra\n        [^\\p{Nd}]++\n        Ket\n        End\n------------------------------------------------------------------\n    abc123\n 0: abc\n    abc\\x{123}\n 0: abc\\x{123}\n    \\x{660}abc   \n 0: abc\n\n/\\p{Lu}+9\\p{Lu}+B\\p{Lu}+b/BZ\n------------------------------------------------------------------\n        Bra\n        prop Lu ++\n        9\n        prop Lu +\n        B\n        prop Lu ++\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{^Lu}+9\\p{^Lu}+B\\p{^Lu}+b/BZ\n------------------------------------------------------------------\n        Bra\n        notprop Lu +\n        9\n        notprop Lu ++\n        B\n        notprop Lu +\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\P{Lu}+9\\P{Lu}+B\\P{Lu}+b/BZ\n------------------------------------------------------------------\n        Bra\n        notprop Lu +\n        9\n        notprop Lu ++\n        B\n        notprop Lu +\n        b\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Han}+X\\p{Greek}+\\x{370}/BZ8\n------------------------------------------------------------------\n        Bra\n        prop Han ++\n        X\n        prop Greek +\n        \\x{370}\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+!\\p{Xan}+A/BZ\n------------------------------------------------------------------\n        Bra\n        prop Xan ++\n        !\n        prop Xan +\n        A\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xsp}+!\\p{Xsp}\\t/BZ\n------------------------------------------------------------------\n        Bra\n        prop Xsp ++\n        !\n        prop Xsp\n        \\x09\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xps}+!\\p{Xps}\\t/BZ\n------------------------------------------------------------------\n        Bra\n        prop Xps ++\n        !\n        prop Xps\n        \\x09\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xwd}+!\\p{Xwd}_/BZ\n------------------------------------------------------------------\n        Bra\n        prop Xwd ++\n        !\n        prop Xwd\n        _\n        Ket\n        End\n------------------------------------------------------------------\n\n/A+\\p{N}A+\\dB+\\p{N}*B+\\d*/WBZ\n------------------------------------------------------------------\n        Bra\n        A++\n        prop N\n        A++\n        prop Nd\n        B+\n        prop N *+\n        B++\n        prop Nd *+\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- These behaved oddly in Perl, so they are kept in this test --/\n\n/(\\x{23a}\\x{23a}\\x{23a})?\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\nNo match\n\n/(ȺȺȺ)?\\1/8i\n    ȺȺȺⱥⱥ\nNo match\n\n/(\\x{23a}\\x{23a}\\x{23a})?\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 0: \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 1: \\x{23a}\\x{23a}\\x{23a}\n\n/(ȺȺȺ)?\\1/8i\n    ȺȺȺⱥⱥⱥ\n 0: \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 1: \\x{23a}\\x{23a}\\x{23a}\n\n/(\\x{23a}\\x{23a}\\x{23a})\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\nNo match\n\n/(ȺȺȺ)\\1/8i\n    ȺȺȺⱥⱥ\nNo match\n\n/(\\x{23a}\\x{23a}\\x{23a})\\1/8i\n    \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 0: \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 1: \\x{23a}\\x{23a}\\x{23a}\n\n/(ȺȺȺ)\\1/8i\n    ȺȺȺⱥⱥⱥ\n 0: \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}\n 1: \\x{23a}\\x{23a}\\x{23a}\n\n/(\\x{2c65}\\x{2c65})\\1/8i\n    \\x{2c65}\\x{2c65}\\x{23a}\\x{23a}\n 0: \\x{2c65}\\x{2c65}\\x{23a}\\x{23a}\n 1: \\x{2c65}\\x{2c65}\n    \n/(ⱥⱥ)\\1/8i\n    ⱥⱥȺȺ \n 0: \\x{2c65}\\x{2c65}\\x{23a}\\x{23a}\n 1: \\x{2c65}\\x{2c65}\n    \n/(\\x{23a}\\x{23a}\\x{23a})\\1Y/8i\n    X\\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}YZ\n 0: \\x{23a}\\x{23a}\\x{23a}\\x{2c65}\\x{2c65}\\x{2c65}Y\n 1: \\x{23a}\\x{23a}\\x{23a}\n\n/(\\x{2c65}\\x{2c65})\\1Y/8i\n    X\\x{2c65}\\x{2c65}\\x{23a}\\x{23a}YZ\n 0: \\x{2c65}\\x{2c65}\\x{23a}\\x{23a}Y\n 1: \\x{2c65}\\x{2c65}\n\n/-- --/ \n\n/-- These scripts weren't yet in Perl when I added Unicode 6.0.0 to PCRE --/\n\n/^[\\p{Batak}]/8\n    \\x{1bc0}\n 0: \\x{1bc0}\n    \\x{1bff}\n 0: \\x{1bff}\n    ** Failers\nNo match\n    \\x{1bf4}\nNo match\n    \n/^[\\p{Brahmi}]/8\n    \\x{11000}\n 0: \\x{11000}\n    \\x{1106f}\n 0: \\x{1106f}\n    ** Failers\nNo match\n    \\x{1104e}\nNo match\n    \n/^[\\p{Mandaic}]/8\n    \\x{840}\n 0: \\x{840}\n    \\x{85e}\n 0: \\x{85e}\n    ** Failers\nNo match\n    \\x{85c}\nNo match\n    \\x{85d}    \nNo match\n\n/-- --/ \n\n/(\\X*)(.)/s8\n    A\\x{300}\n 0: A\n 1: \n 2: A\n\n/^S(\\X*)e(\\X*)$/8\n    Stéréo\n 0: Ste\\x{301}re\\x{301}o\n 1: te\\x{301}r\n 2: \\x{301}o\n    \n/^\\X/8 \n    ́réo\n 0: \\x{301}\n\n/^a\\X41z/<JS>\n    aX41z\n 0: aX41z\n    *** Failers\nNo match\n    aAz\nNo match\n\n/(?<=ab\\Cde)X/8\nFailed: \\C not allowed in lookbehind assertion at offset 10\n\n/\\X/\n    a\\P\n 0: a\n    a\\P\\P\nPartial match: a\n\n/\\Xa/\n    aa\\P\n 0: aa\n    aa\\P\\P\n 0: aa\n\n/\\X{2}/\n    aa\\P\n 0: aa\n    aa\\P\\P\nPartial match: aa\n\n/\\X+a/\n    a\\P\nPartial match: a\n    aa\\P\n 0: aa\n    aa\\P\\P\nPartial match: aa\n\n/\\X+?a/\n    a\\P\nPartial match: a\n    ab\\P\nPartial match: ab\n    aa\\P\n 0: aa\n    aa\\P\\P\n 0: aa\n    aba\\P\n 0: aba\n    \n/-- These Unicode 6.1.0 scripts are not known to Perl. --/ \n\n/\\p{Chakma}\\d/8W\n    \\x{11100}\\x{1113c}\n 0: \\x{11100}\\x{1113c}\n\n/\\p{Takri}\\d/8W\n    \\x{11680}\\x{116c0}\n 0: \\x{11680}\\x{116c0}\n\n/^\\X/8\n    A\\P\n 0: A\n    A\\P\\P \nPartial match: A\n    A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}\n    A\\x{301}\\P\n 0: A\\x{301}\n    A\\x{301}\\P\\P  \nPartial match: A\\x{301}\n    \n/^\\X{2,3}/8\n    A\\P\nPartial match: A\n    A\\P\\P \nPartial match: A\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n    A\\x{300}\\x{301}\\P\nPartial match: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}A\\x{300}\\x{301}\n\n/^\\X{2}/8\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\n 0: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    A\\x{300}\\x{301}A\\x{300}\\x{301}\\P\\P  \nPartial match: A\\x{300}\\x{301}A\\x{300}\\x{301}\n    \n/^\\X+/8\n    AA\\P\n 0: AA\n    AA\\P\\P  \nPartial match: AA\n\n/^\\X+?Z/8\n    AA\\P\nPartial match: AA\n    AA\\P\\P \nPartial match: AA\n\n/A\\x{3a3}B/8iDZ\n------------------------------------------------------------------\n        Bra\n     /i A\n        clist 03a3 03c2 03c3\n     /i B\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nFirst char = 'A' (caseless)\nNeed char = 'B' (caseless)\n\n/\\x{3a3}B/8iDZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3\n     /i B\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nOptions: caseless utf\nNo first char\nNeed char = 'B' (caseless)\n\n/[\\x{3a3}]/8iBZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{3a3}]/8iBZ\n------------------------------------------------------------------\n        Bra\n        not clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\x{3a3}]+/8iBZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3 ++\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{3a3}]+/8iBZ\n------------------------------------------------------------------\n        Bra\n        not clist 03a3 03c2 03c3 ++\n        Ket\n        End\n------------------------------------------------------------------\n\n/a*\\x{3a3}/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i a*+\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x{3a3}+a/8iBZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3 ++\n     /i a\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x{3a3}*\\x{3c2}/8iBZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3 *\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\x{3a3}{3}/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n 0: \\x{3a3}\\x{3c3}\\x{3c2}\n 0+ \\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}{2,4}/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n 0: \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\n 0+ \\x{3c3}\\x{3c2}\n\n/\\x{3a3}{2,4}?/8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n 0: \\x{3a3}\\x{3c3}\n 0+ \\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n\n/\\x{3a3}+./8i+\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n 0: \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\n 0+ \n\n/\\x{3a3}++./8i+\n    ** Failers\nNo match\n    \\x{3a3}\\x{3c3}\\x{3c2}\\x{3a3}\\x{3c3}\\x{3c2}\nNo match\n\n/\\x{3a3}*\\x{3c2}/8iBZ\n------------------------------------------------------------------\n        Bra\n        clist 03a3 03c2 03c3 *\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^\\x{3a3}]*\\x{3c2}/8iBZ\n------------------------------------------------------------------\n        Bra\n        not clist 03a3 03c2 03c3 *+\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/[^a]*\\x{3c2}/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i [^a]*\n        clist 03a3 03c2 03c3\n        Ket\n        End\n------------------------------------------------------------------\n\n/ist/8iBZ\n------------------------------------------------------------------\n        Bra\n     /i i\n        clist 0053 0073 017f\n     /i t\n        Ket\n        End\n------------------------------------------------------------------\n    ikt\nNo match\n\n/is+t/8i\n    iSs\\x{17f}t\n 0: iSs\\x{17f}t\n    ikt\nNo match\n\n/is+?t/8i\n    ikt\nNo match\n\n/is?t/8i\n    ikt\nNo match\n\n/is{2}t/8i\n    iskt\nNo match\n    \n/-- This property is a PCRE special --/\n\n/^\\p{Xuc}/8\n    $abc\n 0: $\n    @abc\n 0: @\n    `abc\n 0: `\n    \\x{1234}abc\n 0: \\x{1234}\n    ** Failers\nNo match\n    abc     \nNo match\n\n/^\\p{Xuc}+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}+?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}+?\\*/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}*\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}++/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}{3,5}/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\p{Xuc}{3,5}?/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^[\\p{Xuc}]/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^[\\p{Xuc}]+/8\n    $@`\\x{a0}\\x{1234}\\x{e000}**\n 0: $@`\\x{a0}\\x{1234}\\x{e000}\n    ** Failers\nNo match\n    \\x{9f}\nNo match\n\n/^\\P{Xuc}/8\n    abc\n 0: a\n    ** Failers\n 0: *\n    $abc\nNo match\n    @abc\nNo match\n    `abc\nNo match\n    \\x{1234}abc\nNo match\n\n/^[\\P{Xuc}]/8\n    abc\n 0: a\n    ** Failers\n 0: *\n    $abc\nNo match\n    @abc\nNo match\n    `abc\nNo match\n    \\x{1234}abc\nNo match\n    \n/-- Some auto-possessification tests --/\n\n/\\pN+\\z/BZ\n------------------------------------------------------------------\n        Bra\n        prop N ++\n        \\z\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\PN+\\z/BZ\n------------------------------------------------------------------\n        Bra\n        notprop N ++\n        \\z\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\pN+/BZ\n------------------------------------------------------------------\n        Bra\n        prop N ++\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\PN+/BZ\n------------------------------------------------------------------\n        Bra\n        notprop N ++\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Any}+\\p{Any} \\p{Any}+\\P{Any} \\p{Any}+\\p{L&} \\p{Any}+\\p{L} \\p{Any}+\\p{Lu} \\p{Any}+\\p{Han} \\p{Any}+\\p{Xan} \\p{Any}+\\p{Xsp} \\p{Any}+\\p{Xps} \\p{Xwd}+\\p{Any} \\p{Any}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Any +\n        prop Any\n        prop Any +\n        notprop Any\n        prop Any +\n        prop L&\n        prop Any +\n        prop L\n        prop Any +\n        prop Lu\n        prop Any +\n        prop Han\n        prop Any +\n        prop Xan\n        prop Any +\n        prop Xsp\n        prop Any +\n        prop Xps\n        prop Xwd +\n        prop Any\n        prop Any +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{L&}+\\p{Any} \\p{L&}+\\p{L&} \\P{L&}+\\p{L&} \\p{L&}+\\p{L} \\p{L&}+\\p{Lu} \\p{L&}+\\p{Han} \\p{L&}+\\p{Xan} \\p{L&}+\\P{Xan} \\p{L&}+\\p{Xsp} \\p{L&}+\\p{Xps} \\p{Xwd}+\\p{L&} \\p{L&}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop L& +\n        prop Any\n        prop L& +\n        prop L&\n        notprop L& ++\n        prop L&\n        prop L& +\n        prop L\n        prop L& +\n        prop Lu\n        prop L& +\n        prop Han\n        prop L& +\n        prop Xan\n        prop L& ++\n        notprop Xan\n        prop L& ++\n        prop Xsp\n        prop L& ++\n        prop Xps\n        prop Xwd +\n        prop L&\n        prop L& +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{N}+\\p{Any} \\p{N}+\\p{L&} \\p{N}+\\p{L} \\p{N}+\\P{L} \\p{N}+\\P{N} \\p{N}+\\p{Lu} \\p{N}+\\p{Han} \\p{N}+\\p{Xan} \\p{N}+\\p{Xsp} \\p{N}+\\p{Xps} \\p{Xwd}+\\p{N} \\p{N}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop N +\n        prop Any\n        prop N +\n        prop L&\n        prop N ++\n        prop L\n        prop N +\n        notprop L\n        prop N ++\n        notprop N\n        prop N ++\n        prop Lu\n        prop N +\n        prop Han\n        prop N +\n        prop Xan\n        prop N ++\n        prop Xsp\n        prop N ++\n        prop Xps\n        prop Xwd +\n        prop N\n        prop N +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Lu}+\\p{Any} \\p{Lu}+\\p{L&} \\p{Lu}+\\p{L} \\p{Lu}+\\p{Lu} \\P{Lu}+\\p{Lu} \\p{Lu}+\\p{Nd} \\p{Lu}+\\P{Nd} \\p{Lu}+\\p{Han} \\p{Lu}+\\p{Xan} \\p{Lu}+\\p{Xsp} \\p{Lu}+\\p{Xps} \\p{Xwd}+\\p{Lu} \\p{Lu}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Lu +\n        prop Any\n        prop Lu +\n        prop L&\n        prop Lu +\n        prop L\n        prop Lu +\n        prop Lu\n        notprop Lu ++\n        prop Lu\n        prop Lu ++\n        prop Nd\n        prop Lu +\n        notprop Nd\n        prop Lu +\n        prop Han\n        prop Lu +\n        prop Xan\n        prop Lu ++\n        prop Xsp\n        prop Lu ++\n        prop Xps\n        prop Xwd +\n        prop Lu\n        prop Lu +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Han}+\\p{Lu} \\p{Han}+\\p{L&} \\p{Han}+\\p{L} \\p{Han}+\\p{Lu} \\p{Han}+\\p{Arabic} \\p{Arabic}+\\p{Arabic} \\p{Han}+\\p{Xan} \\p{Han}+\\p{Xsp} \\p{Han}+\\p{Xps} \\p{Xwd}+\\p{Han} \\p{Han}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Han +\n        prop Lu\n        prop Han +\n        prop L&\n        prop Han +\n        prop L\n        prop Han +\n        prop Lu\n        prop Han ++\n        prop Arabic\n        prop Arabic +\n        prop Arabic\n        prop Han +\n        prop Xan\n        prop Han +\n        prop Xsp\n        prop Han +\n        prop Xps\n        prop Xwd +\n        prop Han\n        prop Han +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+\\p{Any} \\p{Xan}+\\p{L&} \\P{Xan}+\\p{L&} \\p{Xan}+\\p{L} \\p{Xan}+\\p{Lu} \\p{Xan}+\\p{Han} \\p{Xan}+\\p{Xan} \\p{Xan}+\\P{Xan} \\p{Xan}+\\p{Xsp} \\p{Xan}+\\p{Xps} \\p{Xwd}+\\p{Xan} \\p{Xan}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Xan +\n        prop Any\n        prop Xan +\n        prop L&\n        notprop Xan ++\n        prop L&\n        prop Xan +\n        prop L\n        prop Xan +\n        prop Lu\n        prop Xan +\n        prop Han\n        prop Xan +\n        prop Xan\n        prop Xan ++\n        notprop Xan\n        prop Xan ++\n        prop Xsp\n        prop Xan ++\n        prop Xps\n        prop Xwd +\n        prop Xan\n        prop Xan +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xsp}+\\p{Any} \\p{Xsp}+\\p{L&} \\p{Xsp}+\\p{L} \\p{Xsp}+\\p{Lu} \\p{Xsp}+\\p{Han} \\p{Xsp}+\\p{Xan} \\p{Xsp}+\\p{Xsp} \\P{Xsp}+\\p{Xsp} \\p{Xsp}+\\p{Xps} \\p{Xwd}+\\p{Xsp} \\p{Xsp}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Xsp +\n        prop Any\n        prop Xsp ++\n        prop L&\n        prop Xsp ++\n        prop L\n        prop Xsp ++\n        prop Lu\n        prop Xsp +\n        prop Han\n        prop Xsp ++\n        prop Xan\n        prop Xsp +\n        prop Xsp\n        notprop Xsp ++\n        prop Xsp\n        prop Xsp +\n        prop Xps\n        prop Xwd ++\n        prop Xsp\n        prop Xsp +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xwd}+\\p{Any} \\p{Xwd}+\\p{L&} \\p{Xwd}+\\p{L} \\p{Xwd}+\\p{Lu} \\p{Xwd}+\\p{Han} \\p{Xwd}+\\p{Xan} \\p{Xwd}+\\p{Xsp} \\p{Xwd}+\\p{Xps} \\p{Xwd}+\\p{Xwd} \\p{Xwd}+\\P{Xwd} \\p{Xwd}+\\p{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Xwd +\n        prop Any\n        prop Xwd +\n        prop L&\n        prop Xwd +\n        prop L\n        prop Xwd +\n        prop Lu\n        prop Xwd +\n        prop Han\n        prop Xwd +\n        prop Xan\n        prop Xwd ++\n        prop Xsp\n        prop Xwd ++\n        prop Xps\n        prop Xwd +\n        prop Xwd\n        prop Xwd ++\n        notprop Xwd\n        prop Xwd +\n        prop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xuc}+\\p{Any} \\p{Xuc}+\\p{L&} \\p{Xuc}+\\p{L} \\p{Xuc}+\\p{Lu} \\p{Xuc}+\\p{Han} \\p{Xuc}+\\p{Xan} \\p{Xuc}+\\p{Xsp} \\p{Xuc}+\\p{Xps} \\p{Xwd}+\\p{Xuc} \\p{Xuc}+\\p{Xuc} \\p{Xuc}+\\P{Xuc}/BWZx  \n------------------------------------------------------------------\n        Bra\n        prop Xuc +\n        prop Any\n        prop Xuc +\n        prop L&\n        prop Xuc +\n        prop L\n        prop Xuc +\n        prop Lu\n        prop Xuc +\n        prop Han\n        prop Xuc +\n        prop Xan\n        prop Xuc +\n        prop Xsp\n        prop Xuc +\n        prop Xps\n        prop Xwd +\n        prop Xuc\n        prop Xuc +\n        prop Xuc\n        prop Xuc ++\n        notprop Xuc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{N}+\\p{Ll} \\p{N}+\\p{Nd} \\p{N}+\\P{Nd}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop N ++\n        prop Ll\n        prop N +\n        prop Nd\n        prop N +\n        notprop Nd\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+\\p{L} \\p{Xan}+\\p{N} \\p{Xan}+\\p{C} \\p{Xan}+\\P{L} \\P{Xan}+\\p{N} \\p{Xan}+\\P{C}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xan +\n        prop L\n        prop Xan +\n        prop N\n        prop Xan ++\n        prop C\n        prop Xan +\n        notprop L\n        notprop Xan ++\n        prop N\n        prop Xan +\n        notprop C\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{L}+\\p{Xan} \\p{N}+\\p{Xan} \\p{C}+\\p{Xan} \\P{L}+\\p{Xan} \\p{N}+\\p{Xan} \\P{C}+\\p{Xan} \\p{L}+\\P{Xan}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop L +\n        prop Xan\n        prop N +\n        prop Xan\n        prop C ++\n        prop Xan\n        notprop L +\n        prop Xan\n        prop N +\n        prop Xan\n        notprop C +\n        prop Xan\n        prop L ++\n        notprop Xan\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+\\p{Lu} \\p{Xan}+\\p{Nd} \\p{Xan}+\\p{Cc} \\p{Xan}+\\P{Ll} \\P{Xan}+\\p{No} \\p{Xan}+\\P{Cf}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xan +\n        prop Lu\n        prop Xan +\n        prop Nd\n        prop Xan ++\n        prop Cc\n        prop Xan +\n        notprop Ll\n        notprop Xan ++\n        prop No\n        prop Xan +\n        notprop Cf\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Lu}+\\p{Xan} \\p{Nd}+\\p{Xan} \\p{Cs}+\\p{Xan} \\P{Lt}+\\p{Xan} \\p{Nl}+\\p{Xan} \\P{Cc}+\\p{Xan} \\p{Lt}+\\P{Xan}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Lu +\n        prop Xan\n        prop Nd +\n        prop Xan\n        prop Cs ++\n        prop Xan\n        notprop Lt +\n        prop Xan\n        prop Nl +\n        prop Xan\n        notprop Cc +\n        prop Xan\n        prop Lt ++\n        notprop Xan\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w+\\p{P} \\w+\\p{Po} \\w+\\s \\p{Xan}+\\s \\s+\\p{Xan} \\s+\\w/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xwd +\n        prop P\n        prop Xwd +\n        prop Po\n        prop Xwd ++\n        prop Xsp\n        prop Xan ++\n        prop Xsp\n        prop Xsp ++\n        prop Xan\n        prop Xsp ++\n        prop Xwd\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w+\\P{P} \\W+\\p{Po} \\w+\\S \\P{Xan}+\\s \\s+\\P{Xan} \\s+\\W/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xwd +\n        notprop P\n        notprop Xwd +\n        prop Po\n        prop Xwd +\n        notprop Xsp\n        notprop Xan +\n        prop Xsp\n        prop Xsp +\n        notprop Xan\n        prop Xsp +\n        notprop Xwd\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\w+\\p{Po} \\w+\\p{Pc} \\W+\\p{Po} \\W+\\p{Pc} \\w+\\P{Po} \\w+\\P{Pc}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xwd +\n        prop Po\n        prop Xwd ++\n        prop Pc\n        notprop Xwd +\n        prop Po\n        notprop Xwd +\n        prop Pc\n        prop Xwd +\n        notprop Po\n        prop Xwd +\n        notprop Pc\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Nl}+\\p{Xan} \\P{Nl}+\\p{Xan} \\p{Nl}+\\P{Xan} \\P{Nl}+\\P{Xan}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Nl +\n        prop Xan\n        notprop Nl +\n        prop Xan\n        prop Nl ++\n        notprop Xan\n        notprop Nl +\n        notprop Xan\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+\\p{Nl} \\P{Xan}+\\p{Nl} \\p{Xan}+\\P{Nl} \\P{Xan}+\\P{Nl}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xan +\n        prop Nl\n        notprop Xan ++\n        prop Nl\n        prop Xan +\n        notprop Nl\n        notprop Xan +\n        notprop Nl\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\p{Xan}+\\p{Nd} \\P{Xan}+\\p{Nd} \\p{Xan}+\\P{Nd} \\P{Xan}+\\P{Nd}/BWZx\n------------------------------------------------------------------\n        Bra\n        prop Xan +\n        prop Nd\n        notprop Xan ++\n        prop Nd\n        prop Xan +\n        notprop Nd\n        notprop Xan +\n        notprop Nd\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- End auto-possessification tests --/ \n\n/\\w+/8CWBZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 3\n        prop Xwd ++\n        Callout 255 3 0\n        Ket\n        End\n------------------------------------------------------------------\n    abcd\n--->abcd\n +0 ^        \\w+\n +3 ^   ^    \n 0: abcd\n\n/[\\p{N}]?+/BZO\n------------------------------------------------------------------\n        Bra\n        [\\p{N}]?+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[\\p{L}ab]{2,3}+/BZO\n------------------------------------------------------------------\n        Bra\n        [ab\\p{L}]{2,3}+\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\D+\\X \\d+\\X \\S+\\X \\s+\\X \\W+\\X \\w+\\X \\C+\\X \\R+\\X \\H+\\X \\h+\\X \\V+\\X \\v+\\X a+\\X \\n+\\X .+\\X/BZx\n------------------------------------------------------------------\n        Bra\n        \\D+\n        extuni\n        \\d+\n        extuni\n        \\S+\n        extuni\n        \\s+\n        extuni\n        \\W+\n        extuni\n        \\w+\n        extuni\n        AllAny+\n        extuni\n        \\R+\n        extuni\n        \\H+\n        extuni\n        \\h+\n        extuni\n        \\V+\n        extuni\n        \\v+\n        extuni\n        a+\n        extuni\n        \\x0a+\n        extuni\n        Any+\n        extuni\n        Ket\n        End\n------------------------------------------------------------------\n\n/.+\\X/BZxs\n------------------------------------------------------------------\n        Bra\n        AllAny+\n        extuni\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\X+$/BZxm\n------------------------------------------------------------------\n        Bra\n        extuni+\n     /m $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\X+\\D \\X+\\d \\X+\\S \\X+\\s \\X+\\W \\X+\\w \\X+. \\X+\\C \\X+\\R \\X+\\H \\X+\\h \\X+\\V \\X+\\v \\X+\\X \\X+\\Z \\X+\\z \\X+$/BZx\n------------------------------------------------------------------\n        Bra\n        extuni+\n        \\D\n        extuni+\n        \\d\n        extuni+\n        \\S\n        extuni+\n        \\s\n        extuni+\n        \\W\n        extuni+\n        \\w\n        extuni+\n        Any\n        extuni+\n        AllAny\n        extuni+\n        \\R\n        extuni+\n        \\H\n        extuni+\n        \\h\n        extuni+\n        \\V\n        extuni+\n        \\v\n        extuni+\n        extuni\n        extuni+\n        \\Z\n        extuni++\n        \\z\n        extuni+\n        $\n        Ket\n        End\n------------------------------------------------------------------\n\n/\\d+\\s{0,5}=\\s*\\S?=\\w{0,4}\\W*/8WBZ\n------------------------------------------------------------------\n        Bra\n        prop Nd ++\n        prop Xsp {0,5}+\n        =\n        prop Xsp *+\n        notprop Xsp ?\n        =\n        prop Xwd {0,4}+\n        notprop Xwd *+\n        Ket\n        End\n------------------------------------------------------------------\n\n/[RST]+/8iWBZ\n------------------------------------------------------------------\n        Bra\n        [R-Tr-t\\x{17f}]++\n        Ket\n        End\n------------------------------------------------------------------\n    \n/[R-T]+/8iWBZ \n------------------------------------------------------------------\n        Bra\n        [R-Tr-t\\x{17f}]++\n        Ket\n        End\n------------------------------------------------------------------\n\n/[Q-U]+/8iWBZ \n------------------------------------------------------------------\n        Bra\n        [Q-Uq-u\\x{17f}]++\n        Ket\n        End\n------------------------------------------------------------------\n\n/^s?c/mi8I\nCapturing subpattern count = 0\nOptions: caseless multiline utf\nFirst char at start or follows newline\nNeed char = 'c' (caseless)\n    scat\n 0: sc\n\n/a[[:punct:]b]/WBZ\n------------------------------------------------------------------\n        Bra\n        a\n        [b[:punct:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/a[[:punct:]b]/8WBZ\n------------------------------------------------------------------\n        Bra\n        a\n        [b[:punct:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/a[b[:punct:]]/8WBZ\n------------------------------------------------------------------\n        Bra\n        a\n        [b[:punct:]]\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/B8COZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        L?\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/L(?#(|++<!(2)?/B8WCZ\n------------------------------------------------------------------\n        Bra\n        Callout 255 0 14\n        L?+\n        Callout 255 14 0\n        Ket\n        End\n------------------------------------------------------------------\n\n/-- End of testinput7 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput8",
    "content": "/-- This set of tests check the DFA matching functionality of pcre_dfa_exec(),\n    excluding UTF and Unicode property support. The -dfa flag must be used with\n    pcretest when running it. --/\n    \n< forbid 8W \n     \n/abc/\n    abc\n 0: abc\n    \n/ab*c/\n    abc\n 0: abc\n    abbbbc\n 0: abbbbc\n    ac\n 0: ac\n    \n/ab+c/\n    abc\n 0: abc\n    abbbbbbc\n 0: abbbbbbc\n    *** Failers \nNo match\n    ac\nNo match\n    ab\nNo match\n    \n/a*/O\n    a\n 0: a\n 1: \n    aaaaaaaaaaaaaaaaa\n 0: aaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaa\n 5: aaaaaaaaaaaa\n 6: aaaaaaaaaaa\n 7: aaaaaaaaaa\n 8: aaaaaaaaa\n 9: aaaaaaaa\n10: aaaaaaa\n11: aaaaaa\n12: aaaaa\n13: aaaa\n14: aaa\n15: aa\n16: a\n17: \n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaa\n17: aaaaaaaaaaaaa\n18: aaaaaaaaaaaa\n19: aaaaaaaaaaa\n20: aaaaaaaaaa\n21: aaaaaaaaa\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\F \n 0: \n    \n/(a|abcd|african)/\n    a\n 0: a\n    abcd\n 0: abcd\n 1: a\n    african\n 0: african\n 1: a\n    \n/^abc/\n    abcdef\n 0: abc\n    *** Failers\nNo match\n    xyzabc\nNo match\n    xyz\\nabc    \nNo match\n    \n/^abc/m\n    abcdef\n 0: abc\n    xyz\\nabc    \n 0: abc\n    *** Failers\nNo match\n    xyzabc\nNo match\n    \n/\\Aabc/\n    abcdef\n 0: abc\n    *** Failers\nNo match\n    xyzabc\nNo match\n    xyz\\nabc    \nNo match\n    \n/\\Aabc/m\n    abcdef\n 0: abc\n    *** Failers\nNo match\n    xyzabc\nNo match\n    xyz\\nabc    \nNo match\n    \n/\\Gabc/\n    abcdef\n 0: abc\n    xyzabc\\>3\n 0: abc\n    *** Failers\nNo match\n    xyzabc    \nNo match\n    xyzabc\\>2 \nNo match\n    \n/x\\dy\\Dz/\n    x9yzz\n 0: x9yzz\n    x0y+z\n 0: x0y+z\n    *** Failers\nNo match\n    xyz\nNo match\n    xxy0z     \nNo match\n    \n/x\\sy\\Sz/\n    x yzz\n 0: x yzz\n    x y+z\n 0: x y+z\n    *** Failers\nNo match\n    xyz\nNo match\n    xxyyz\nNo match\n    \n/x\\wy\\Wz/\n    xxy+z\n 0: xxy+z\n    *** Failers\nNo match\n    xxy0z\nNo match\n    x+y+z         \nNo match\n    \n/x.y/\n    x+y\n 0: x+y\n    x-y\n 0: x-y\n    *** Failers\nNo match\n    x\\ny\nNo match\n    \n/x.y/s\n    x+y\n 0: x+y\n    x-y\n 0: x-y\n    x\\ny\n 0: x\\x0ay\n\n/(a.b(?s)c.d|x.y)p.q/\n    a+bc+dp+q\n 0: a+bc+dp+q\n    a+bc\\ndp+q\n 0: a+bc\\x0adp+q\n    x\\nyp+q \n 0: x\\x0ayp+q\n    *** Failers \nNo match\n    a\\nbc\\ndp+q\nNo match\n    a+bc\\ndp\\nq\nNo match\n    x\\nyp\\nq \nNo match\n\n/a\\d\\z/\n    ba0\n 0: a0\n    *** Failers\nNo match\n    ba0\\n\nNo match\n    ba0\\ncd   \nNo match\n\n/a\\d\\z/m\n    ba0\n 0: a0\n    *** Failers\nNo match\n    ba0\\n\nNo match\n    ba0\\ncd   \nNo match\n\n/a\\d\\Z/\n    ba0\n 0: a0\n    ba0\\n\n 0: a0\n    *** Failers\nNo match\n    ba0\\ncd   \nNo match\n\n/a\\d\\Z/m\n    ba0\n 0: a0\n    ba0\\n\n 0: a0\n    *** Failers\nNo match\n    ba0\\ncd   \nNo match\n\n/a\\d$/\n    ba0\n 0: a0\n    ba0\\n\n 0: a0\n    *** Failers\nNo match\n    ba0\\ncd   \nNo match\n\n/a\\d$/m\n    ba0\n 0: a0\n    ba0\\n\n 0: a0\n    ba0\\ncd   \n 0: a0\n    *** Failers\nNo match\n\n/abc/i\n    abc\n 0: abc\n    aBc\n 0: aBc\n    ABC\n 0: ABC\n    \n/[^a]/\n    abcd\n 0: b\n    \n/ab?\\w/\n    abz\n 0: abz\n 1: ab\n    abbz\n 0: abb\n 1: ab\n    azz  \n 0: az\n\n/x{0,3}yz/\n    ayzq\n 0: yz\n    axyzq\n 0: xyz\n    axxyz\n 0: xxyz\n    axxxyzq\n 0: xxxyz\n    axxxxyzq\n 0: xxxyz\n    *** Failers\nNo match\n    ax\nNo match\n    axx     \nNo match\n      \n/x{3}yz/\n    axxxyzq\n 0: xxxyz\n    axxxxyzq\n 0: xxxyz\n    *** Failers\nNo match\n    ax\nNo match\n    axx     \nNo match\n    ayzq\nNo match\n    axyzq\nNo match\n    axxyz\nNo match\n      \n/x{2,3}yz/\n    axxyz\n 0: xxyz\n    axxxyzq\n 0: xxxyz\n    axxxxyzq\n 0: xxxyz\n    *** Failers\nNo match\n    ax\nNo match\n    axx     \nNo match\n    ayzq\nNo match\n    axyzq\nNo match\n      \n/[^a]+/O\n    bac\n 0: b\n    bcdefax\n 0: bcdef\n 1: bcde\n 2: bcd\n 3: bc\n 4: b\n    *** Failers\n 0: *** F\n 1: *** \n 2: ***\n 3: **\n 4: *\n    aaaaa   \nNo match\n\n/[^a]*/O\n    bac\n 0: b\n 1: \n    bcdefax\n 0: bcdef\n 1: bcde\n 2: bcd\n 3: bc\n 4: b\n 5: \n    *** Failers\n 0: *** F\n 1: *** \n 2: ***\n 3: **\n 4: *\n 5: \n    aaaaa   \n 0: \n    \n/[^a]{3,5}/O\n    xyz\n 0: xyz\n    awxyza\n 0: wxyz\n 1: wxy\n    abcdefa\n 0: bcdef\n 1: bcde\n 2: bcd\n    abcdefghijk\n 0: bcdef\n 1: bcde\n 2: bcd\n    *** Failers\n 0: *** F\n 1: *** \n 2: ***\n    axya\nNo match\n    axa\nNo match\n    aaaaa         \nNo match\n\n/\\d*/\n    1234b567\n 0: 1234\n    xyz\n 0: \n    \n/\\D*/\n    a1234b567\n 0: a\n    xyz\n 0: xyz\n     \n/\\d+/\n    ab1234c56\n 0: 1234\n    *** Failers\nNo match\n    xyz\nNo match\n    \n/\\D+/\n    ab123c56\n 0: ab\n    *** Failers\n 0: *** Failers\n    789\nNo match\n    \n/\\d?A/\n    045ABC\n 0: 5A\n    ABC\n 0: A\n    *** Failers\nNo match\n    XYZ\nNo match\n    \n/\\D?A/\n    ABC\n 0: A\n    BAC\n 0: BA\n    9ABC             \n 0: A\n    *** Failers\nNo match\n\n/a+/\n    aaaa\n 0: aaaa\n\n/^.*xyz/\n    xyz\n 0: xyz\n    ggggggggxyz\n 0: ggggggggxyz\n    \n/^.+xyz/\n    abcdxyz\n 0: abcdxyz\n    axyz\n 0: axyz\n    *** Failers\nNo match\n    xyz\nNo match\n    \n/^.?xyz/\n    xyz\n 0: xyz\n    cxyz       \n 0: cxyz\n\n/^\\d{2,3}X/\n    12X\n 0: 12X\n    123X\n 0: 123X\n    *** Failers\nNo match\n    X\nNo match\n    1X\nNo match\n    1234X     \nNo match\n\n/^[abcd]\\d/\n    a45\n 0: a4\n    b93\n 0: b9\n    c99z\n 0: c9\n    d04\n 0: d0\n    *** Failers\nNo match\n    e45\nNo match\n    abcd      \nNo match\n    abcd1234\nNo match\n    1234  \nNo match\n\n/^[abcd]*\\d/\n    a45\n 0: a4\n    b93\n 0: b9\n    c99z\n 0: c9\n    d04\n 0: d0\n    abcd1234\n 0: abcd1\n    1234  \n 0: 1\n    *** Failers\nNo match\n    e45\nNo match\n    abcd      \nNo match\n\n/^[abcd]+\\d/\n    a45\n 0: a4\n    b93\n 0: b9\n    c99z\n 0: c9\n    d04\n 0: d0\n    abcd1234\n 0: abcd1\n    *** Failers\nNo match\n    1234  \nNo match\n    e45\nNo match\n    abcd      \nNo match\n\n/^a+X/\n    aX\n 0: aX\n    aaX \n 0: aaX\n\n/^[abcd]?\\d/\n    a45\n 0: a4\n    b93\n 0: b9\n    c99z\n 0: c9\n    d04\n 0: d0\n    1234  \n 0: 1\n    *** Failers\nNo match\n    abcd1234\nNo match\n    e45\nNo match\n\n/^[abcd]{2,3}\\d/\n    ab45\n 0: ab4\n    bcd93\n 0: bcd9\n    *** Failers\nNo match\n    1234 \nNo match\n    a36 \nNo match\n    abcd1234\nNo match\n    ee45\nNo match\n\n/^(abc)*\\d/\n    abc45\n 0: abc4\n    abcabcabc45\n 0: abcabcabc4\n    42xyz \n 0: 4\n    *** Failers\nNo match\n\n/^(abc)+\\d/\n    abc45\n 0: abc4\n    abcabcabc45\n 0: abcabcabc4\n    *** Failers\nNo match\n    42xyz \nNo match\n\n/^(abc)?\\d/\n    abc45\n 0: abc4\n    42xyz \n 0: 4\n    *** Failers\nNo match\n    abcabcabc45\nNo match\n\n/^(abc){2,3}\\d/\n    abcabc45\n 0: abcabc4\n    abcabcabc45\n 0: abcabcabc4\n    *** Failers\nNo match\n    abcabcabcabc45\nNo match\n    abc45\nNo match\n    42xyz \nNo match\n\n/1(abc|xyz)2(?1)3/\n    1abc2abc3456\n 0: 1abc2abc3\n    1abc2xyz3456 \n 0: 1abc2xyz3\n\n/^(a*\\w|ab)=(a*\\w|ab)/\n    ab=ab\n 0: ab=ab\n 1: ab=a\n\n/^(a*\\w|ab)=(?1)/\n    ab=ab\n 0: ab=ab\n 1: ab=a\n\n/^([^()]|\\((?1)*\\))*$/\n    abc\n 0: abc\n    a(b)c\n 0: a(b)c\n    a(b(c))d  \n 0: a(b(c))d\n    *** Failers)\nNo match\n    a(b(c)d  \nNo match\n\n/^>abc>([^()]|\\((?1)*\\))*<xyz<$/\n    >abc>123<xyz<\n 0: >abc>123<xyz<\n    >abc>1(2)3<xyz<\n 0: >abc>1(2)3<xyz<\n    >abc>(1(2)3)<xyz<\n 0: >abc>(1(2)3)<xyz<\n\n/^(?>a*)\\d/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9\n    *** Failers \nNo match\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n\n/< (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >/x\n    <>\n 0: <>\n    <abcd>\n 0: <abcd>\n    <abc <123> hij>\n 0: <abc <123> hij>\n    <abc <def> hij>\n 0: <def>\n    <abc<>def> \n 0: <abc<>def>\n    <abc<>      \n 0: <>\n    *** Failers\nNo match\n    <abc\nNo match\n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/        \n    abc:                          \n 0: abc:\n    12                             \n 0: 12\n    *** Failers                     \nNo match\n    123                       \nNo match\n    xyz                        \nNo match\n                                \n/^(?(?!abc)\\d\\d|\\w{3}:)$/      \n    abc:                        \n 0: abc:\n    12         \n 0: 12\n    *** Failers\nNo match\n    123\nNo match\n    xyz    \nNo match\n\n/^(?=abc)\\w{5}:$/        \n    abcde:                          \n 0: abcde:\n    *** Failers                     \nNo match\n    abc.. \nNo match\n    123                       \nNo match\n    vwxyz                        \nNo match\n                                \n/^(?!abc)\\d\\d$/      \n    12         \n 0: 12\n    *** Failers\nNo match\n    abcde:\nNo match\n    abc..  \nNo match\n    123\nNo match\n    vwxyz    \nNo match\n\n/(?<=abc|xy)123/\n    abc12345\n 0: 123\n    wxy123z\n 0: 123\n    *** Failers\nNo match\n    123abc\nNo match\n\n/(?<!abc|xy)123/\n    123abc\n 0: 123\n    mno123456 \n 0: 123\n    *** Failers\nNo match\n    abc12345\nNo match\n    wxy123z\nNo match\n\n/abc(?C1)xyz/\n    abcxyz\n--->abcxyz\n  1 ^  ^       x\n 0: abcxyz\n    123abcxyz999 \n--->123abcxyz999\n  1    ^  ^          x\n 0: abcxyz\n\n/(ab|cd){3,4}/C\n  ababab\n--->ababab\n +0 ^          (ab|cd){3,4}\n +1 ^          a\n +4 ^          c\n +2 ^^         b\n +3 ^ ^        |\n +1 ^ ^        a\n +4 ^ ^        c\n +2 ^  ^       b\n +3 ^   ^      |\n +1 ^   ^      a\n +4 ^   ^      c\n +2 ^    ^     b\n +3 ^     ^    |\n+12 ^     ^    \n +1 ^     ^    a\n +4 ^     ^    c\n 0: ababab\n  abcdabcd\n--->abcdabcd\n +0 ^            (ab|cd){3,4}\n +1 ^            a\n +4 ^            c\n +2 ^^           b\n +3 ^ ^          |\n +1 ^ ^          a\n +4 ^ ^          c\n +5 ^  ^         d\n +6 ^   ^        )\n +1 ^   ^        a\n +4 ^   ^        c\n +2 ^    ^       b\n +3 ^     ^      |\n+12 ^     ^      \n +1 ^     ^      a\n +4 ^     ^      c\n +5 ^      ^     d\n +6 ^       ^    )\n+12 ^       ^    \n 0: abcdabcd\n 1: abcdab\n  abcdcdcdcdcd  \n--->abcdcdcdcdcd\n +0 ^                (ab|cd){3,4}\n +1 ^                a\n +4 ^                c\n +2 ^^               b\n +3 ^ ^              |\n +1 ^ ^              a\n +4 ^ ^              c\n +5 ^  ^             d\n +6 ^   ^            )\n +1 ^   ^            a\n +4 ^   ^            c\n +5 ^    ^           d\n +6 ^     ^          )\n+12 ^     ^          \n +1 ^     ^          a\n +4 ^     ^          c\n +5 ^      ^         d\n +6 ^       ^        )\n+12 ^       ^        \n 0: abcdcdcd\n 1: abcdcd\n\n/^abc/\n    abcdef\n 0: abc\n    *** Failers\nNo match\n    abcdef\\B  \nNo match\n\n/^(a*|xyz)/\n    bcd\n 0: \n    aaabcd\n 0: aaa\n    xyz\n 0: xyz\n 1: \n    xyz\\N  \n 0: xyz\n    *** Failers\n 0: \n    bcd\\N   \nNo match\n    \n/xyz$/\n    xyz\n 0: xyz\n    xyz\\n\n 0: xyz\n    *** Failers\nNo match\n    xyz\\Z\nNo match\n    xyz\\n\\Z    \nNo match\n    \n/xyz$/m\n    xyz\n 0: xyz\n    xyz\\n \n 0: xyz\n    abcxyz\\npqr \n 0: xyz\n    abcxyz\\npqr\\Z \n 0: xyz\n    xyz\\n\\Z    \n 0: xyz\n    *** Failers\nNo match\n    xyz\\Z\nNo match\n\n/\\Gabc/\n    abcdef\n 0: abc\n    defabcxyz\\>3 \n 0: abc\n    *** Failers \nNo match\n    defabcxyz\nNo match\n\n/^abcdef/\n    ab\\P\nPartial match: ab\n    abcde\\P\nPartial match: abcde\n    abcdef\\P\n 0: abcdef\n    *** Failers\nNo match\n    abx\\P    \nNo match\n\n/^a{2,4}\\d+z/\n    a\\P\nPartial match: a\n    aa\\P\nPartial match: aa\n    aa2\\P \nPartial match: aa2\n    aaa\\P\nPartial match: aaa\n    aaa23\\P \nPartial match: aaa23\n    aaaa12345\\P\nPartial match: aaaa12345\n    aa0z\\P\n 0: aa0z\n    aaaa4444444444444z\\P \n 0: aaaa4444444444444z\n    *** Failers\nNo match\n    az\\P \nNo match\n    aaaaa\\P \nNo match\n    a56\\P \nNo match\n\n/^abcdef/\n   abc\\P\nPartial match: abc\n   def\\R \n 0: def\n   \n/(?<=foo)bar/\n   xyzfo\\P \nNo match\n   foob\\P\\>2 \nPartial match at offset 3: foob\n   foobar...\\R\\P\\>4 \n 0: ar\n   xyzfo\\P\nNo match\n   foobar\\>2  \n 0: bar\n   *** Failers\nNo match\n   xyzfo\\P\nNo match\n   obar\\R   \nNo match\n\n/(ab*(cd|ef))+X/\n    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\\P\\Z\nNo match\n    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\\P\\B\\Z\nPartial match: abbbbbbcdaefabbbbbbbefa\n    cdabbbbbbbb\\P\\R\\B\\Z\nPartial match: cdabbbbbbbb\n    efabbbbbbbbbbbbbbbb\\P\\R\\B\\Z\nPartial match: efabbbbbbbbbbbbbbbb\n    bbbbbbbbbbbbcdXyasdfadf\\P\\R\\B\\Z    \n 0: bbbbbbbbbbbbcdX\n\n/(a|b)/SF>testsavedregex\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: a\n    ** Failers\n 0: a\n    def  \nNo match\n    \n/the quick brown fox/\n    the quick brown fox\n 0: the quick brown fox\n    The quick brown FOX\nNo match\n    What do you know about the quick brown fox?\n 0: the quick brown fox\n    What do you know about THE QUICK BROWN FOX?\nNo match\n\n/The quick brown fox/i\n    the quick brown fox\n 0: the quick brown fox\n    The quick brown FOX\n 0: The quick brown FOX\n    What do you know about the quick brown fox?\n 0: the quick brown fox\n    What do you know about THE QUICK BROWN FOX?\n 0: THE QUICK BROWN FOX\n\n/abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz/\n    abcd\\t\\n\\r\\f\\a\\e9;\\$\\\\?caxyz\n 0: abcd\\x09\\x0a\\x0d\\x0c\\x07\\x1b9;$\\?caxyz\n\n/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/\n    abxyzpqrrrabbxyyyypqAzz\n 0: abxyzpqrrrabbxyyyypqAzz\n    abxyzpqrrrabbxyyyypqAzz\n 0: abxyzpqrrrabbxyyyypqAzz\n    aabxyzpqrrrabbxyyyypqAzz\n 0: aabxyzpqrrrabbxyyyypqAzz\n    aaabxyzpqrrrabbxyyyypqAzz\n 0: aaabxyzpqrrrabbxyyyypqAzz\n    aaaabxyzpqrrrabbxyyyypqAzz\n 0: aaaabxyzpqrrrabbxyyyypqAzz\n    abcxyzpqrrrabbxyyyypqAzz\n 0: abcxyzpqrrrabbxyyyypqAzz\n    aabcxyzpqrrrabbxyyyypqAzz\n 0: aabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypAzz\n 0: aaabcxyzpqrrrabbxyyyypAzz\n    aaabcxyzpqrrrabbxyyyypqAzz\n 0: aaabcxyzpqrrrabbxyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz\n    aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz\n    aaaabcxyzpqrrrabbxyyyypqAzz\n 0: aaaabcxyzpqrrrabbxyyyypqAzz\n    abxyzzpqrrrabbxyyyypqAzz\n 0: abxyzzpqrrrabbxyyyypqAzz\n    aabxyzzzpqrrrabbxyyyypqAzz\n 0: aabxyzzzpqrrrabbxyyyypqAzz\n    aaabxyzzzzpqrrrabbxyyyypqAzz\n 0: aaabxyzzzzpqrrrabbxyyyypqAzz\n    aaaabxyzzzzpqrrrabbxyyyypqAzz\n 0: aaaabxyzzzzpqrrrabbxyyyypqAzz\n    abcxyzzpqrrrabbxyyyypqAzz\n 0: abcxyzzpqrrrabbxyyyypqAzz\n    aabcxyzzzpqrrrabbxyyyypqAzz\n 0: aabcxyzzzpqrrrabbxyyyypqAzz\n    aaabcxyzzzzpqrrrabbxyyyypqAzz\n 0: aaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbxyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz\n    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz\n    aaabcxyzpqrrrabbxyyyypABzz\n 0: aaabcxyzpqrrrabbxyyyypABzz\n    aaabcxyzpqrrrabbxyyyypABBzz\n 0: aaabcxyzpqrrrabbxyyyypABBzz\n    >>>aaabxyzpqrrrabbxyyyypqAzz\n 0: aaabxyzpqrrrabbxyyyypqAzz\n    >aaaabxyzpqrrrabbxyyyypqAzz\n 0: aaaabxyzpqrrrabbxyyyypqAzz\n    >>>>abcxyzpqrrrabbxyyyypqAzz\n 0: abcxyzpqrrrabbxyyyypqAzz\n    *** Failers\nNo match\n    abxyzpqrrabbxyyyypqAzz\nNo match\n    abxyzpqrrrrabbxyyyypqAzz\nNo match\n    abxyzpqrrrabxyyyypqAzz\nNo match\n    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz\nNo match\n    aaaabcxyzzzzpqrrrabbbxyyypqAzz\nNo match\n    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz\nNo match\n\n/^(abc){1,2}zz/\n    abczz\n 0: abczz\n    abcabczz\n 0: abcabczz\n    *** Failers\nNo match\n    zz\nNo match\n    abcabcabczz\nNo match\n    >>abczz\nNo match\n\n/^(b+?|a){1,2}?c/\n    bc\n 0: bc\n    bbc\n 0: bbc\n    bbbc\n 0: bbbc\n    bac\n 0: bac\n    bbac\n 0: bbac\n    aac\n 0: aac\n    abbbbbbbbbbbc\n 0: abbbbbbbbbbbc\n    bbbbbbbbbbbac\n 0: bbbbbbbbbbbac\n    *** Failers\nNo match\n    aaac\nNo match\n    abbbbbbbbbbbac\nNo match\n\n/^(b+|a){1,2}c/\n    bc\n 0: bc\n    bbc\n 0: bbc\n    bbbc\n 0: bbbc\n    bac\n 0: bac\n    bbac\n 0: bbac\n    aac\n 0: aac\n    abbbbbbbbbbbc\n 0: abbbbbbbbbbbc\n    bbbbbbbbbbbac\n 0: bbbbbbbbbbbac\n    *** Failers\nNo match\n    aaac\nNo match\n    abbbbbbbbbbbac\nNo match\n\n/^(b+|a){1,2}?bc/\n    bbc\n 0: bbc\n\n/^(b*|ba){1,2}?bc/\n    babc\n 0: babc\n    bbabc\n 0: bbabc\n    bababc\n 0: bababc\n    *** Failers\nNo match\n    bababbc\nNo match\n    babababc\nNo match\n\n/^(ba|b*){1,2}?bc/\n    babc\n 0: babc\n    bbabc\n 0: bbabc\n    bababc\n 0: bababc\n    *** Failers\nNo match\n    bababbc\nNo match\n    babababc\nNo match\n\n/^\\ca\\cA\\c[\\c{\\c:/\n    \\x01\\x01\\e;z\n 0: \\x01\\x01\\x1b;z\n\n/^[ab\\]cde]/\n    athing\n 0: a\n    bthing\n 0: b\n    ]thing\n 0: ]\n    cthing\n 0: c\n    dthing\n 0: d\n    ething\n 0: e\n    *** Failers\nNo match\n    fthing\nNo match\n    [thing\nNo match\n    \\\\thing\nNo match\n\n/^[]cde]/\n    ]thing\n 0: ]\n    cthing\n 0: c\n    dthing\n 0: d\n    ething\n 0: e\n    *** Failers\nNo match\n    athing\nNo match\n    fthing\nNo match\n\n/^[^ab\\]cde]/\n    fthing\n 0: f\n    [thing\n 0: [\n    \\\\thing\n 0: \\\n    *** Failers\n 0: *\n    athing\nNo match\n    bthing\nNo match\n    ]thing\nNo match\n    cthing\nNo match\n    dthing\nNo match\n    ething\nNo match\n\n/^[^]cde]/\n    athing\n 0: a\n    fthing\n 0: f\n    *** Failers\n 0: *\n    ]thing\nNo match\n    cthing\nNo match\n    dthing\nNo match\n    ething\nNo match\n\n/^\\/\n    \n 0: \\x81\n\n/^/\n    \n 0: \\xff\n\n/^[0-9]+$/\n    0\n 0: 0\n    1\n 0: 1\n    2\n 0: 2\n    3\n 0: 3\n    4\n 0: 4\n    5\n 0: 5\n    6\n 0: 6\n    7\n 0: 7\n    8\n 0: 8\n    9\n 0: 9\n    10\n 0: 10\n    100\n 0: 100\n    *** Failers\nNo match\n    abc\nNo match\n\n/^.*nter/\n    enter\n 0: enter\n    inter\n 0: inter\n    uponter\n 0: uponter\n\n/^xxx[0-9]+$/\n    xxx0\n 0: xxx0\n    xxx1234\n 0: xxx1234\n    *** Failers\nNo match\n    xxx\nNo match\n\n/^.+[0-9][0-9][0-9]$/\n    x123\n 0: x123\n    xx123\n 0: xx123\n    123456\n 0: 123456\n    *** Failers\nNo match\n    123\nNo match\n    x1234\n 0: x1234\n\n/^.+?[0-9][0-9][0-9]$/\n    x123\n 0: x123\n    xx123\n 0: xx123\n    123456\n 0: 123456\n    *** Failers\nNo match\n    123\nNo match\n    x1234\n 0: x1234\n\n/^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$/\n    abc!pqr=apquxz.ixr.zzz.ac.uk\n 0: abc!pqr=apquxz.ixr.zzz.ac.uk\n    *** Failers\nNo match\n    !pqr=apquxz.ixr.zzz.ac.uk\nNo match\n    abc!=apquxz.ixr.zzz.ac.uk\nNo match\n    abc!pqr=apquxz:ixr.zzz.ac.uk\nNo match\n    abc!pqr=apquxz.ixr.zzz.ac.ukk\nNo match\n\n/:/\n    Well, we need a colon: somewhere\n 0: :\n    *** Fail if we don't\nNo match\n\n/([\\da-f:]+)$/i\n    0abc\n 0: 0abc\n    abc\n 0: abc\n    fed\n 0: fed\n    E\n 0: E\n    ::\n 0: ::\n    5f03:12C0::932e\n 0: 5f03:12C0::932e\n    fed def\n 0: def\n    Any old stuff\n 0: ff\n    *** Failers\nNo match\n    0zzz\nNo match\n    gzzz\nNo match\n    fed\\x20\nNo match\n    Any old rubbish\nNo match\n\n/^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/\n    .1.2.3\n 0: .1.2.3\n    A.12.123.0\n 0: A.12.123.0\n    *** Failers\nNo match\n    .1.2.3333\nNo match\n    1.2.3\nNo match\n    1234.2.3\nNo match\n\n/^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$/\n    1 IN SOA non-sp1 non-sp2(\n 0: 1 IN SOA non-sp1 non-sp2(\n    1    IN    SOA    non-sp1    non-sp2   (\n 0: 1    IN    SOA    non-sp1    non-sp2   (\n    *** Failers\nNo match\n    1IN SOA non-sp1 non-sp2(\nNo match\n\n/^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$/\n    a.\n 0: a.\n    Z.\n 0: Z.\n    2.\n 0: 2.\n    ab-c.pq-r.\n 0: ab-c.pq-r.\n    sxk.zzz.ac.uk.\n 0: sxk.zzz.ac.uk.\n    x-.y-.\n 0: x-.y-.\n    *** Failers\nNo match\n    -abc.peq.\nNo match\n\n/^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$/\n    *.a\n 0: *.a\n    *.b0-a\n 0: *.b0-a\n    *.c3-b.c\n 0: *.c3-b.c\n    *.c-a.b-c\n 0: *.c-a.b-c\n    *** Failers\nNo match\n    *.0\nNo match\n    *.a-\nNo match\n    *.a-b.c-\nNo match\n    *.c-a.0-c\nNo match\n\n/^(?=ab(de))(abd)(e)/\n    abde\n 0: abde\n\n/^(?!(ab)de|x)(abd)(f)/\n    abdf\n 0: abdf\n\n/^(?=(ab(cd)))(ab)/\n    abcd\n 0: ab\n\n/^[\\da-f](\\.[\\da-f])*$/i\n    a.b.c.d\n 0: a.b.c.d\n    A.B.C.D\n 0: A.B.C.D\n    a.b.c.1.2.3.C\n 0: a.b.c.1.2.3.C\n\n/^\\\".*\\\"\\s*(;.*)?$/\n    \\\"1234\\\"\n 0: \"1234\"\n    \\\"abcd\\\" ;\n 0: \"abcd\" ;\n    \\\"\\\" ; rhubarb\n 0: \"\" ; rhubarb\n    *** Failers\nNo match\n    \\\"1234\\\" : things\nNo match\n\n/^$/\n    \\\n 0: \n    *** Failers\nNo match\n\n/   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/x\n    ab c\n 0: ab c\n    *** Failers\nNo match\n    abc\nNo match\n    ab cde\nNo match\n\n/(?x)   ^    a   (?# begins with a)  b\\sc (?# then b c) $ (?# then end)/\n    ab c\n 0: ab c\n    *** Failers\nNo match\n    abc\nNo match\n    ab cde\nNo match\n\n/^   a\\ b[c ]d       $/x\n    a bcd\n 0: a bcd\n    a b d\n 0: a b d\n    *** Failers\nNo match\n    abcd\nNo match\n    ab d\nNo match\n\n/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/\n    abcdefhijklm\n 0: abcdefhijklm\n\n/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/\n    abcdefhijklm\n 0: abcdefhijklm\n\n/^[\\w][\\W][\\s][\\S][\\d][\\D][\\b][\\n][\\c]][\\022]/\n    a+ Z0+\\x08\\n\\x1d\\x12\n 0: a+ Z0+\\x08\\x0a\\x1d\\x12\n\n/^[.^$|()*+?{,}]+/\n    .^\\$(*+)|{?,?}\n 0: .^$(*+)|{?,?}\n\n/^a*\\w/\n    z\n 0: z\n    az\n 0: az\n 1: a\n    aaaz\n 0: aaaz\n 1: aaa\n 2: aa\n 3: a\n    a\n 0: a\n    aa\n 0: aa\n 1: a\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n    a+\n 0: a\n    aa+\n 0: aa\n 1: a\n\n/^a*?\\w/\n    z\n 0: z\n    az\n 0: az\n 1: a\n    aaaz\n 0: aaaz\n 1: aaa\n 2: aa\n 3: a\n    a\n 0: a\n    aa\n 0: aa\n 1: a\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n    a+\n 0: a\n    aa+\n 0: aa\n 1: a\n\n/^a+\\w/\n    az\n 0: az\n    aaaz\n 0: aaaz\n 1: aaa\n 2: aa\n    aa\n 0: aa\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n    aa+\n 0: aa\n\n/^a+?\\w/\n    az\n 0: az\n    aaaz\n 0: aaaz\n 1: aaa\n 2: aa\n    aa\n 0: aa\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n    aa+\n 0: aa\n\n/^\\d{8}\\w{2,}/\n    1234567890\n 0: 1234567890\n    12345678ab\n 0: 12345678ab\n    12345678__\n 0: 12345678__\n    *** Failers\nNo match\n    1234567\nNo match\n\n/^[aeiou\\d]{4,5}$/\n    uoie\n 0: uoie\n    1234\n 0: 1234\n    12345\n 0: 12345\n    aaaaa\n 0: aaaaa\n    *** Failers\nNo match\n    123456\nNo match\n\n/^[aeiou\\d]{4,5}?/\n    uoie\n 0: uoie\n    1234\n 0: 1234\n    12345\n 0: 12345\n 1: 1234\n    aaaaa\n 0: aaaaa\n 1: aaaa\n    123456\n 0: 12345\n 1: 1234\n\n/^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]/\n    From abcd  Mon Sep 01 12:33:02 1997\n 0: From abcd  Mon Sep 01 12:33\n\n/^From\\s+\\S+\\s+([a-zA-Z]{3}\\s+){2}\\d{1,2}\\s+\\d\\d:\\d\\d/\n    From abcd  Mon Sep 01 12:33:02 1997\n 0: From abcd  Mon Sep 01 12:33\n    From abcd  Mon Sep  1 12:33:02 1997\n 0: From abcd  Mon Sep  1 12:33\n    *** Failers\nNo match\n    From abcd  Sep 01 12:33:02 1997\nNo match\n\n/^12.34/s\n    12\\n34\n 0: 12\\x0a34\n    12\\r34\n 0: 12\\x0d34\n\n/\\w+(?=\\t)/\n    the quick brown\\t fox\n 0: brown\n\n/foo(?!bar)(.*)/\n    foobar is foolish see?\n 0: foolish see?\n\n/(?:(?!foo)...|^.{0,2})bar(.*)/\n    foobar crowbar etc\n 0: rowbar etc\n    barrel\n 0: barrel\n    2barrel\n 0: 2barrel\n    A barrel\n 0: A barrel\n\n/^(\\D*)(?=\\d)(?!123)/\n    abc456\n 0: abc\n    *** Failers\nNo match\n    abc123\nNo match\n\n/^1234(?# test newlines\n  inside)/\n    1234\n 0: 1234\n\n/^1234 #comment in extended re\n  /x\n    1234\n 0: 1234\n\n/#rhubarb\n  abcd/x\n    abcd\n 0: abcd\n\n/^abcd#rhubarb/x\n    abcd\n 0: abcd\n\n/(?!^)abc/\n    the abc\n 0: abc\n    *** Failers\nNo match\n    abc\nNo match\n\n/(?=^)abc/\n    abc\n 0: abc\n    *** Failers\nNo match\n    the abc\nNo match\n\n/^[ab]{1,3}(ab*|b)/O\n    aabbbbb\n 0: aabbbbb\n 1: aabbbb\n 2: aabbb\n 3: aabb\n 4: aab\n 5: aa\n\n/^[ab]{1,3}?(ab*|b)/O\n    aabbbbb\n 0: aabbbbb\n 1: aabbbb\n 2: aabbb\n 3: aabb\n 4: aab\n 5: aa\n\n/^[ab]{1,3}?(ab*?|b)/O\n    aabbbbb\n 0: aabbbbb\n 1: aabbbb\n 2: aabbb\n 3: aabb\n 4: aab\n 5: aa\n\n/^[ab]{1,3}(ab*?|b)/O\n    aabbbbb\n 0: aabbbbb\n 1: aabbbb\n 2: aabbb\n 3: aabb\n 4: aab\n 5: aa\n\n/  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                          # optional leading comment\n(?:    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n# address\n|                     #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)             # one word, optionally followed by....\n(?:\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037]  |  # atom and space parts, or...\n\\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)       |  # comments, or...\n\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n# quoted strings\n)*\n<  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                     # leading <\n(?:  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  ,  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n)* # further okay, if led by comma\n:                                # closing colon\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  )? #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)                    # initial word\n(?:  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\" (?:                      # opening quote...\n[^\\\\\\x80-\\xff\\n\\015\"]                #   Anything except backslash and quote\n|                     #    or\n\\\\ [^\\x80-\\xff]           #   Escaped something (something != CR)\n)* \"  # closing quote\n)  )* # further okay, if led by a period\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  @  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*    (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                           # initial subdomain\n(?:                                  #\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  \\.                        # if led by a period...\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*   (?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|   \\[                         # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*    #    stuff\n\\]                        #           ]\n)                     #   ...further okay\n)*\n#       address spec\n(?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*  > #                  trailing >\n# name and address\n)  (?: [\\040\\t] |  \\(\n(?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  |  \\( (?:  [^\\\\\\x80-\\xff\\n\\015()]  |  \\\\ [^\\x80-\\xff]  )* \\)  )*\n\\)  )*                       # optional trailing comment\n/x\n    Alan Other <user\\@dom.ain>\n 0: Alan Other <user@dom.ain>\n    <user\\@dom.ain>\n 0: user@dom.ain\n 1: user@dom\n    user\\@dom.ain\n 0: user@dom.ain\n 1: user@dom\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n 0: \"A. Other\" <user.1234@dom.ain> (a comment)\n 1: \"A. Other\" <user.1234@dom.ain> \n 2: \"A. Other\" <user.1234@dom.ain>\n    A. Other <user.1234\\@dom.ain> (a comment)\n 0:  Other <user.1234@dom.ain> (a comment)\n 1:  Other <user.1234@dom.ain> \n 2:  Other <user.1234@dom.ain>\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n 0: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay\n 1: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re\n    A missing angle <user\\@some.where\n 0: user@some.where\n 1: user@some\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional leading comment\n(?:\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n# address\n|                             #  or\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n# leading word\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *               # \"normal\" atoms and or spaces\n(?:\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n|\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n) # \"special\" comment or quoted string\n[^()<>@,;:\".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] *            #  more \"normal\"\n)*\n<\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# <\n(?:\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n(?: ,\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n)*  # additional domains\n:\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)?     #       optional route\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n# Atom\n|                       #  or\n\"                                     # \"\n[^\\\\\\x80-\\xff\\n\\015\"] *                            #   normal\n(?:  \\\\ [^\\x80-\\xff]  [^\\\\\\x80-\\xff\\n\\015\"] * )*        #   ( special normal* )*\n\"                                     #        \"\n# Quoted string\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# additional words\n)*\n@\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n(?:\n\\.\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n(?:\n[^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]+    # some number of atom characters...\n(?![^(\\040)<>@,;:\".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n|\n\\[                            # [\n(?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] |  \\\\ [^\\x80-\\xff]  )*     #    stuff\n\\]                           #           ]\n)\n[\\040\\t]*                    # Nab whitespace.\n(?:\n\\(                              #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                             #     normal*\n(?:                                 #       (\n(?:  \\\\ [^\\x80-\\xff]  |\n\\(                            #  (\n[^\\\\\\x80-\\xff\\n\\015()] *                            #     normal*\n(?:  \\\\ [^\\x80-\\xff]   [^\\\\\\x80-\\xff\\n\\015()] * )*        #     (special normal*)*\n\\)                           #                       )\n)    #         special\n[^\\\\\\x80-\\xff\\n\\015()] *                         #         normal*\n)*                                  #            )*\n\\)                             #                )\n[\\040\\t]* )*    # If comment found, allow more spaces.\n# optional trailing comments\n)*\n#       address spec\n>                    #                 >\n# name and address\n)\n/x\n    Alan Other <user\\@dom.ain>\n 0: Alan Other <user@dom.ain>\n    <user\\@dom.ain>\n 0: user@dom.ain\n 1: user@dom\n    user\\@dom.ain\n 0: user@dom.ain\n 1: user@dom\n    \\\"A. Other\\\" <user.1234\\@dom.ain> (a comment)\n 0: \"A. Other\" <user.1234@dom.ain>\n    A. Other <user.1234\\@dom.ain> (a comment)\n 0:  Other <user.1234@dom.ain>\n    \\\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\\\"\\@x400-re.lay\n 0: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re.lay\n 1: \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"@x400-re\n    A missing angle <user\\@some.where\n 0: user@some.where\n 1: user@some\n    *** Failers\nNo match\n    The quick brown fox\nNo match\n\n/abc\\0def\\00pqr\\000xyz\\0000AB/\n    abc\\0def\\00pqr\\000xyz\\0000AB\n 0: abc\\x00def\\x00pqr\\x00xyz\\x000AB\n    abc456 abc\\0def\\00pqr\\000xyz\\0000ABCDE\n 0: abc\\x00def\\x00pqr\\x00xyz\\x000AB\n\n/abc\\x0def\\x00pqr\\x000xyz\\x0000AB/\n    abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n 0: abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n    abc456 abc\\x0def\\x00pqr\\x000xyz\\x0000ABCDE\n 0: abc\\x0def\\x00pqr\\x000xyz\\x0000AB\n\n/^[\\000-\\037]/\n    \\0A\n 0: \\x00\n    \\01B\n 0: \\x01\n    \\037C\n 0: \\x1f\n\n/\\0*/\n    \\0\\0\\0\\0\n 0: \\x00\\x00\\x00\\x00\n\n/A\\x0{2,3}Z/\n    The A\\x0\\x0Z\n 0: A\\x00\\x00Z\n    An A\\0\\x0\\0Z\n 0: A\\x00\\x00\\x00Z\n    *** Failers\nNo match\n    A\\0Z\nNo match\n    A\\0\\x0\\0\\x0Z\nNo match\n\n/^\\s/\n    \\040abc\n 0:  \n    \\x0cabc\n 0: \\x0c\n    \\nabc\n 0: \\x0a\n    \\rabc\n 0: \\x0d\n    \\tabc\n 0: \\x09\n    *** Failers\nNo match\n    abc\nNo match\n\n/^a\tb\n    \f  c/x\n    abc\n 0: abc\n\n/ab{1,3}bc/\n    abbbbc\n 0: abbbbc\n    abbbc\n 0: abbbc\n    abbc\n 0: abbc\n    *** Failers\nNo match\n    abc\nNo match\n    abbbbbc\nNo match\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[T ]+(.*)/i\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n\n/([^.]*)\\.([^:]*):[t ]+(.*)/i\n    track1.title:TBlah blah blah\n 0: track1.title:TBlah blah blah\n\n/^[W-c]+$/\n    WXY_^abc\n 0: WXY_^abc\n    *** Failers\nNo match\n    wxy\nNo match\n\n/^[W-c]+$/i\n    WXY_^abc\n 0: WXY_^abc\n    wxy_^ABC\n 0: wxy_^ABC\n\n/^[\\x3f-\\x5F]+$/i\n    WXY_^abc\n 0: WXY_^abc\n    wxy_^ABC\n 0: wxy_^ABC\n\n/^abc$/m\n    abc\n 0: abc\n    qqq\\nabc\n 0: abc\n    abc\\nzzz\n 0: abc\n    qqq\\nabc\\nzzz\n 0: abc\n\n/^abc$/\n    abc\n 0: abc\n    *** Failers\nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n\n/\\Aabc\\Z/m\n    abc\n 0: abc\n    abc\\n \n 0: abc\n    *** Failers\nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n    \n/\\A(.)*\\Z/s\n    abc\\ndef\n 0: abc\\x0adef\n\n/\\A(.)*\\Z/m\n    *** Failers\n 0: *** Failers\n    abc\\ndef\nNo match\n\n/(?:b)|(?::+)/\n    b::c\n 0: b\n    c::b\n 0: ::\n\n/[-az]+/\n    az-\n 0: az-\n    *** Failers\n 0: a\n    b\nNo match\n\n/[az-]+/\n    za-\n 0: za-\n    *** Failers\n 0: a\n    b\nNo match\n\n/[a\\-z]+/\n    a-z\n 0: a-z\n    *** Failers\n 0: a\n    b\nNo match\n\n/[a-z]+/\n    abcdxyz\n 0: abcdxyz\n\n/[\\d-]+/\n    12-34\n 0: 12-34\n    *** Failers\nNo match\n    aaa\nNo match\n\n/[\\d-z]+/\n    12-34z\n 0: 12-34z\n    *** Failers\nNo match\n    aaa\nNo match\n\n/\\x5c/\n    \\\\\n 0: \\\n\n/\\x20Z/\n    the Zoo\n 0:  Z\n    *** Failers\nNo match\n    Zulu\nNo match\n\n/ab{3cd/\n    ab{3cd\n 0: ab{3cd\n\n/ab{3,cd/\n    ab{3,cd\n 0: ab{3,cd\n\n/ab{3,4a}cd/\n    ab{3,4a}cd\n 0: ab{3,4a}cd\n\n/{4,5a}bc/\n    {4,5a}bc\n 0: {4,5a}bc\n\n/^a.b/<lf>\n    a\\rb\n 0: a\\x0db\n    *** Failers\nNo match\n    a\\nb\nNo match\n\n/abc$/\n    abc\n 0: abc\n    abc\\n\n 0: abc\n    *** Failers\nNo match\n    abc\\ndef\nNo match\n\n/(abc)\\123/\n    abc\\x53\n 0: abcS\n\n/(abc)\\223/\n    abc\\x93\n 0: abc\\x93\n\n/(abc)\\323/\n    abc\\xd3\n 0: abc\\xd3\n\n/(abc)\\100/\n    abc\\x40\n 0: abc@\n    abc\\100\n 0: abc@\n\n/(abc)\\1000/\n    abc\\x400\n 0: abc@0\n    abc\\x40\\x30\n 0: abc@0\n    abc\\1000\n 0: abc@0\n    abc\\100\\x30\n 0: abc@0\n    abc\\100\\060\n 0: abc@0\n    abc\\100\\60\n 0: abc@0\n\n/^A\\8B\\9C$/\n    A8B9C\n 0: A8B9C\n    *** Failers\nNo match\n    A\\08B\\09C  \nNo match\n    \n/^[A\\8B\\9C]+$/\n    A8B9C\n 0: A8B9C\n    *** Failers \nNo match\n    A8B9C\\x00\nNo match\n    \n/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\12\\123/\n    abcdefghijk\\12S\n 0: abcdefghijk\\x0aS\n\n/ab\\idef/\n    abidef\n 0: abidef\n\n/a{0}bc/\n    bc\n 0: bc\n\n/(a|(bc)){0,0}?xyz/\n    xyz\n 0: xyz\n\n/abc[\\10]de/\n    abc\\010de\n 0: abc\\x08de\n\n/abc[\\1]de/\n    abc\\1de\n 0: abc\\x01de\n\n/(abc)[\\1]de/\n    abc\\1de\n 0: abc\\x01de\n\n/(?s)a.b/\n    a\\nb\n 0: a\\x0ab\n\n/^([^a])([^\\b])([^c]*)([^d]{3,4})/\n    baNOTccccd\n 0: baNOTcccc\n 1: baNOTccc\n 2: baNOTcc\n 3: baNOTc\n    baNOTcccd\n 0: baNOTccc\n 1: baNOTcc\n 2: baNOTc\n    baNOTccd\n 0: baNOTcc\n 1: baNOTc\n    bacccd\n 0: baccc\n    *** Failers\n 0: *** Failers\n 1: *** Failer\n 2: *** Faile\n 3: *** Fail\n 4: *** Fai\n 5: *** Fa\n    anything\nNo match\n    b\\bc   \nNo match\n    baccd\nNo match\n\n/[^a]/\n    Abc\n 0: A\n  \n/[^a]/i\n    Abc \n 0: b\n\n/[^a]+/\n    AAAaAbc\n 0: AAA\n  \n/[^a]+/i\n    AAAaAbc \n 0: bc\n\n/[^a]+/\n    bbb\\nccc\n 0: bbb\\x0accc\n   \n/[^k]$/\n    abc\n 0: c\n    *** Failers\n 0: s\n    abk   \nNo match\n   \n/[^k]{2,3}$/\n    abc\n 0: abc\n    kbc\n 0: bc\n    kabc \n 0: abc\n    *** Failers\n 0: ers\n    abk\nNo match\n    akb\nNo match\n    akk \nNo match\n\n/^\\d{8,}\\@.+[^k]$/\n    12345678\\@a.b.c.d\n 0: 12345678@a.b.c.d\n    123456789\\@x.y.z\n 0: 123456789@x.y.z\n    *** Failers\nNo match\n    12345678\\@x.y.uk\nNo match\n    1234567\\@a.b.c.d       \nNo match\n\n/[^a]/\n    aaaabcd\n 0: b\n    aaAabcd \n 0: A\n\n/[^a]/i\n    aaaabcd\n 0: b\n    aaAabcd \n 0: b\n\n/[^az]/\n    aaaabcd\n 0: b\n    aaAabcd \n 0: A\n\n/[^az]/i\n    aaaabcd\n 0: b\n    aaAabcd \n 0: b\n\n/\\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/\n \\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\n 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\n\n/P[^*]TAIRE[^*]{1,6}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n 0: PSTAIREISLL\n\n/P[^*]TAIRE[^*]{1,}?LL/\n    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx\n 0: PSTAIREISLL\n\n/(\\.\\d\\d[1-9]?)\\d+/\n    1.230003938\n 0: .230003938\n    1.875000282   \n 0: .875000282\n    1.235  \n 0: .235\n                  \n/(\\.\\d\\d((?=0)|\\d(?=\\d)))/\n    1.230003938      \n 0: .230\n 1: .23\n    1.875000282\n 0: .875\n    *** Failers \nNo match\n    1.235 \nNo match\n    \n/a(?)b/\n    ab \n 0: ab\n \n/\\b(foo)\\s+(\\w+)/i\n    Food is on the foo table\n 0: foo table\n    \n/foo(.*)bar/\n    The food is under the bar in the barn.\n 0: food is under the bar in the bar\n 1: food is under the bar\n    \n/foo(.*?)bar/  \n    The food is under the bar in the barn.\n 0: food is under the bar in the bar\n 1: food is under the bar\n\n/(.*)(\\d*)/O\n    I have 2 numbers: 53147\nMatched, but offsets vector is too small to show all matches\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: 5314\n 2: I have 2 numbers: 531\n 3: I have 2 numbers: 53\n 4: I have 2 numbers: 5\n 5: I have 2 numbers: \n 6: I have 2 numbers:\n 7: I have 2 numbers\n 8: I have 2 number\n 9: I have 2 numbe\n10: I have 2 numb\n11: I have 2 num\n12: I have 2 nu\n13: I have 2 n\n14: I have 2 \n15: I have 2\n16: I have \n17: I have\n18: I hav\n19: I ha\n20: I h\n21: I \n    \n/(.*)(\\d+)/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2\n \n/(.*?)(\\d*)/O\n    I have 2 numbers: 53147\nMatched, but offsets vector is too small to show all matches\n 0: I have 2 numbers: 53147\n 1: I have 2 numbers: 5314\n 2: I have 2 numbers: 531\n 3: I have 2 numbers: 53\n 4: I have 2 numbers: 5\n 5: I have 2 numbers: \n 6: I have 2 numbers:\n 7: I have 2 numbers\n 8: I have 2 number\n 9: I have 2 numbe\n10: I have 2 numb\n11: I have 2 num\n12: I have 2 nu\n13: I have 2 n\n14: I have 2 \n15: I have 2\n16: I have \n17: I have\n18: I hav\n19: I ha\n20: I h\n21: I \n\n/(.*?)(\\d+)/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n 1: I have 2\n\n/(.*)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n\n/(.*?)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n\n/(.*)\\b(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n\n/(.*\\D)(\\d+)$/\n    I have 2 numbers: 53147\n 0: I have 2 numbers: 53147\n\n/^\\D*(?!123)/\n    ABC123\n 0: AB\n 1: A\n 2: \n     \n/^(\\D*)(?=\\d)(?!123)/\n    ABC445\n 0: ABC\n    *** Failers\nNo match\n    ABC123\nNo match\n    \n/^[W-]46]/\n    W46]789 \n 0: W46]\n    -46]789\n 0: -46]\n    *** Failers\nNo match\n    Wall\nNo match\n    Zebra\nNo match\n    42\nNo match\n    [abcd] \nNo match\n    ]abcd[\nNo match\n       \n/^[W-\\]46]/\n    W46]789 \n 0: W\n    Wall\n 0: W\n    Zebra\n 0: Z\n    Xylophone  \n 0: X\n    42\n 0: 4\n    [abcd] \n 0: [\n    ]abcd[\n 0: ]\n    \\\\backslash \n 0: \\\n    *** Failers\nNo match\n    -46]789\nNo match\n    well\nNo match\n    \n/\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d/\n    01/01/2000\n 0: 01/01/2000\n\n/word (?:[a-zA-Z0-9]+ ){0,10}otherword/\n  word cat dog elephant mussel cow horse canary baboon snake shark otherword\n 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword\n  word cat dog elephant mussel cow horse canary baboon snake shark\nNo match\n\n/word (?:[a-zA-Z0-9]+ ){0,300}otherword/\n  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\nNo match\n\n/^(a){0,0}/\n    bcd\n 0: \n    abc\n 0: \n    aab     \n 0: \n\n/^(a){0,1}/\n    bcd\n 0: \n    abc\n 0: a\n 1: \n    aab  \n 0: a\n 1: \n\n/^(a){0,2}/\n    bcd\n 0: \n    abc\n 0: a\n 1: \n    aab  \n 0: aa\n 1: a\n 2: \n\n/^(a){0,3}/\n    bcd\n 0: \n    abc\n 0: a\n 1: \n    aab\n 0: aa\n 1: a\n 2: \n    aaa   \n 0: aaa\n 1: aa\n 2: a\n 3: \n\n/^(a){0,}/\n    bcd\n 0: \n    abc\n 0: a\n 1: \n    aab\n 0: aa\n 1: a\n 2: \n    aaa\n 0: aaa\n 1: aa\n 2: a\n 3: \n    aaaaaaaa    \n 0: aaaaaaaa\n 1: aaaaaaa\n 2: aaaaaa\n 3: aaaaa\n 4: aaaa\n 5: aaa\n 6: aa\n 7: a\n 8: \n\n/^(a){1,1}/\n    bcd\nNo match\n    abc\n 0: a\n    aab  \n 0: a\n\n/^(a){1,2}/\n    bcd\nNo match\n    abc\n 0: a\n    aab  \n 0: aa\n 1: a\n\n/^(a){1,3}/\n    bcd\nNo match\n    abc\n 0: a\n    aab\n 0: aa\n 1: a\n    aaa   \n 0: aaa\n 1: aa\n 2: a\n\n/^(a){1,}/\n    bcd\nNo match\n    abc\n 0: a\n    aab\n 0: aa\n 1: a\n    aaa\n 0: aaa\n 1: aa\n 2: a\n    aaaaaaaa    \n 0: aaaaaaaa\n 1: aaaaaaa\n 2: aaaaaa\n 3: aaaaa\n 4: aaaa\n 5: aaa\n 6: aa\n 7: a\n\n/.*\\.gif/\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.{0,}\\.gif/\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.*\\.gif/m\n    borfle\\nbib.gif\\nno\n 0: bib.gif\n\n/.*\\.gif/s\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\n\n/.*\\.gif/ms\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\n    \n/.*$/\n    borfle\\nbib.gif\\nno\n 0: no\n\n/.*$/m\n    borfle\\nbib.gif\\nno\n 0: borfle\n\n/.*$/s\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\\x0ano\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\n 0: borfle\\x0abib.gif\\x0ano\n 1: borfle\\x0abib.gif\n 2: borfle\n    \n/.*$/\n    borfle\\nbib.gif\\nno\\n\n 0: no\n\n/.*$/m\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\n\n/.*$/s\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\\x0abib.gif\\x0ano\\x0a\n 1: borfle\\x0abib.gif\\x0ano\n\n/.*$/ms\n    borfle\\nbib.gif\\nno\\n\n 0: borfle\\x0abib.gif\\x0ano\\x0a\n 1: borfle\\x0abib.gif\\x0ano\n 2: borfle\\x0abib.gif\n 3: borfle\n    \n/(.*X|^B)/\n    abcde\\n1234Xyz\n 0: 1234X\n    BarFoo \n 0: B\n    *** Failers\nNo match\n    abcde\\nBar  \nNo match\n\n/(.*X|^B)/m\n    abcde\\n1234Xyz\n 0: 1234X\n    BarFoo \n 0: B\n    abcde\\nBar  \n 0: B\n\n/(.*X|^B)/s\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n    BarFoo \n 0: B\n    *** Failers\nNo match\n    abcde\\nBar  \nNo match\n\n/(.*X|^B)/ms\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n    BarFoo \n 0: B\n    abcde\\nBar  \n 0: B\n\n/(?s)(.*X|^B)/\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n    BarFoo \n 0: B\n    *** Failers \nNo match\n    abcde\\nBar  \nNo match\n\n/(?s:.*X|^B)/\n    abcde\\n1234Xyz\n 0: abcde\\x0a1234X\n    BarFoo \n 0: B\n    *** Failers \nNo match\n    abcde\\nBar  \nNo match\n\n/^.*B/\n    **** Failers\nNo match\n    abc\\nB\nNo match\n     \n/(?s)^.*B/\n    abc\\nB\n 0: abc\\x0aB\n\n/(?m)^.*B/\n    abc\\nB\n 0: B\n     \n/(?ms)^.*B/\n    abc\\nB\n 0: abc\\x0aB\n\n/(?ms)^B/\n    abc\\nB\n 0: B\n\n/(?s)B$/\n    B\\n\n 0: B\n\n/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\n    123456654321\n 0: 123456654321\n  \n/^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d/\n    123456654321 \n 0: 123456654321\n\n/^[\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d][\\d]/\n    123456654321\n 0: 123456654321\n  \n/^[abc]{12}/\n    abcabcabcabc\n 0: abcabcabcabc\n    \n/^[a-c]{12}/\n    abcabcabcabc\n 0: abcabcabcabc\n    \n/^(a|b|c){12}/\n    abcabcabcabc \n 0: abcabcabcabc\n\n/^[abcdefghijklmnopqrstuvwxy0123456789]/\n    n\n 0: n\n    *** Failers \nNo match\n    z \nNo match\n\n/abcde{0,0}/\n    abcd\n 0: abcd\n    *** Failers\nNo match\n    abce  \nNo match\n\n/ab[cd]{0,0}e/\n    abe\n 0: abe\n    *** Failers\nNo match\n    abcde \nNo match\n    \n/ab(c){0,0}d/\n    abd\n 0: abd\n    *** Failers\nNo match\n    abcd   \nNo match\n\n/a(b*)/\n    a\n 0: a\n    ab\n 0: ab\n    abbbb\n 0: abbbb\n    *** Failers\n 0: a\n    bbbbb    \nNo match\n    \n/ab\\d{0}e/\n    abe\n 0: abe\n    *** Failers\nNo match\n    ab1e   \nNo match\n    \n/\"([^\\\\\"]+|\\\\.)*\"/\n    the \\\"quick\\\" brown fox\n 0: \"quick\"\n    \\\"the \\\\\\\"quick\\\\\\\" brown fox\\\" \n 0: \"the \\\"quick\\\" brown fox\"\n\n/.*?/g+\n    abc\n 0: abc\n 0+ \n 1: ab\n 2: a\n 3: \n 0: \n 0+ \n  \n/\\b/g+\n    abc \n 0: \n 0+ abc\n 0: \n 0+ \n\n/\\b/+g\n    abc \n 0: \n 0+ abc\n 0: \n 0+ \n\n//g\n    abc\n 0: \n 0: \n 0: \n 0: \n\n/<tr([\\w\\W\\s\\d][^<>]{0,})><TD([\\w\\W\\s\\d][^<>]{0,})>([\\d]{0,}\\.)(.*)((<BR>([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><TD([\\w\\W\\s\\d][^<>]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>/is\n  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>\n\n/a[^a]b/\n    acb\n 0: acb\n    a\\nb\n 0: a\\x0ab\n    \n/a.b/\n    acb\n 0: acb\n    *** Failers \nNo match\n    a\\nb   \nNo match\n    \n/a[^a]b/s\n    acb\n 0: acb\n    a\\nb  \n 0: a\\x0ab\n    \n/a.b/s\n    acb\n 0: acb\n    a\\nb  \n 0: a\\x0ab\n\n/^(b+?|a){1,2}?c/\n    bac\n 0: bac\n    bbac\n 0: bbac\n    bbbac\n 0: bbbac\n    bbbbac\n 0: bbbbac\n    bbbbbac \n 0: bbbbbac\n\n/^(b+|a){1,2}?c/\n    bac\n 0: bac\n    bbac\n 0: bbac\n    bbbac\n 0: bbbac\n    bbbbac\n 0: bbbbac\n    bbbbbac \n 0: bbbbbac\n    \n/(?!\\A)x/m\n    x\\nb\\n\nNo match\n    a\\bx\\n  \n 0: x\n    \n/\\x0{ab}/\n    \\0{ab} \n 0: \\x00{ab}\n\n/(A|B)*?CD/\n    CD \n 0: CD\n    \n/(A|B)*CD/\n    CD \n 0: CD\n\n/(?<!bar)foo/\n    foo\n 0: foo\n    catfood\n 0: foo\n    arfootle\n 0: foo\n    rfoosh\n 0: foo\n    *** Failers\nNo match\n    barfoo\nNo match\n    towbarfoo\nNo match\n\n/\\w{3}(?<!bar)foo/\n    catfood\n 0: catfoo\n    *** Failers\nNo match\n    foo\nNo match\n    barfoo\nNo match\n    towbarfoo\nNo match\n\n/(?<=(foo)a)bar/\n    fooabar\n 0: bar\n    *** Failers\nNo match\n    bar\nNo match\n    foobbar\nNo match\n      \n/\\Aabc\\z/m\n    abc\n 0: abc\n    *** Failers\nNo match\n    abc\\n   \nNo match\n    qqq\\nabc\nNo match\n    abc\\nzzz\nNo match\n    qqq\\nabc\\nzzz\nNo match\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/\nNo match\n\n\"(?>.*/)foo\"\n    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo\n\n/(?>(\\.\\d\\d[1-9]?))\\d+/\n    1.230003938\n 0: .230003938\n    1.875000282\n 0: .875000282\n    *** Failers \nNo match\n    1.235 \nNo match\n\n/^((?>\\w+)|(?>\\s+))*$/\n    now is the time for all good men to come to the aid of the party\n 0: now is the time for all good men to come to the aid of the party\n    *** Failers\nNo match\n    this is not a line with only words and spaces!\nNo match\n    \n/(\\d+)(\\w)/\n    12345a\n 0: 12345a\n 1: 12345\n 2: 1234\n 3: 123\n 4: 12\n    12345+ \n 0: 12345\n 1: 1234\n 2: 123\n 3: 12\n\n/((?>\\d+))(\\w)/\n    12345a\n 0: 12345a\n    *** Failers\nNo match\n    12345+ \nNo match\n\n/(?>a+)b/\n    aaab\n 0: aaab\n\n/((?>a+)b)/\n    aaab\n 0: aaab\n\n/(?>(a+))b/\n    aaab\n 0: aaab\n\n/(?>b)+/\n    aaabbbccc\n 0: bbb\n 1: bb\n 2: b\n\n/(?>a+|b+|c+)*c/\n    aaabbbbccccd\n 0: aaabbbbcccc\n 1: aaabbbbc\n    \n/(a+|b+|c+)*c/\n    aaabbbbccccd\n 0: aaabbbbcccc\n 1: aaabbbbccc\n 2: aaabbbbcc\n 3: aaabbbbc\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: abc(ade)ufh()()\n 2: abc(ade)ufh()\n 3: abc(ade)ufh\n 4: abc(ade)\n 5: abc\n    \n/\\(((?>[^()]+)|\\([^()]+\\))+\\)/ \n    (abc)\n 0: (abc)\n    (abc(def)xyz)\n 0: (abc(def)xyz)\n    *** Failers\nNo match\n    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   \nNo match\n\n/a(?-i)b/i\n    ab\n 0: ab\n    Ab\n 0: Ab\n    *** Failers \nNo match\n    aB\nNo match\n    AB\nNo match\n        \n/(a (?x)b c)d e/\n    a bcd e\n 0: a bcd e\n    *** Failers\nNo match\n    a b cd e\nNo match\n    abcd e   \nNo match\n    a bcde \nNo match\n \n/(a b(?x)c d (?-x)e f)/\n    a bcde f\n 0: a bcde f\n    *** Failers\nNo match\n    abcdef  \nNo match\n\n/(a(?i)b)c/\n    abc\n 0: abc\n    aBc\n 0: aBc\n    *** Failers\nNo match\n    abC\nNo match\n    aBC  \nNo match\n    Abc\nNo match\n    ABc\nNo match\n    ABC\nNo match\n    AbC\nNo match\n    \n/a(?i:b)c/\n    abc\n 0: abc\n    aBc\n 0: aBc\n    *** Failers \nNo match\n    ABC\nNo match\n    abC\nNo match\n    aBC\nNo match\n    \n/a(?i:b)*c/\n    aBc\n 0: aBc\n    aBBc\n 0: aBBc\n    *** Failers \nNo match\n    aBC\nNo match\n    aBBC\nNo match\n    \n/a(?=b(?i)c)\\w\\wd/\n    abcd\n 0: abcd\n    abCd\n 0: abCd\n    *** Failers\nNo match\n    aBCd\nNo match\n    abcD     \nNo match\n    \n/(?s-i:more.*than).*million/i\n    more than million\n 0: more than million\n    more than MILLION\n 0: more than MILLION\n    more \\n than Million \n 0: more \\x0a than Million\n    *** Failers\nNo match\n    MORE THAN MILLION    \nNo match\n    more \\n than \\n million \nNo match\n\n/(?:(?s-i)more.*than).*million/i\n    more than million\n 0: more than million\n    more than MILLION\n 0: more than MILLION\n    more \\n than Million \n 0: more \\x0a than Million\n    *** Failers\nNo match\n    MORE THAN MILLION    \nNo match\n    more \\n than \\n million \nNo match\n    \n/(?>a(?i)b+)+c/ \n    abc\n 0: abc\n    aBbc\n 0: aBbc\n    aBBc \n 0: aBBc\n    *** Failers\nNo match\n    Abc\nNo match\n    abAb    \nNo match\n    abbC \nNo match\n    \n/(?=a(?i)b)\\w\\wc/\n    abc\n 0: abc\n    aBc\n 0: aBc\n    *** Failers\nNo match\n    Ab \nNo match\n    abC\nNo match\n    aBC     \nNo match\n    \n/(?<=a(?i)b)(\\w\\w)c/\n    abxxc\n 0: xxc\n    aBxxc\n 0: xxc\n    *** Failers\nNo match\n    Abxxc\nNo match\n    ABxxc\nNo match\n    abxxC      \nNo match\n\n/^(?(?=abc)\\w{3}:|\\d\\d)$/\n    abc:\n 0: abc:\n    12\n 0: 12\n    *** Failers\nNo match\n    123\nNo match\n    xyz    \nNo match\n\n/^(?(?!abc)\\d\\d|\\w{3}:)$/\n    abc:\n 0: abc:\n    12\n 0: 12\n    *** Failers\nNo match\n    123\nNo match\n    xyz    \nNo match\n    \n/(?(?<=foo)bar|cat)/\n    foobar\n 0: bar\n    cat\n 0: cat\n    fcat\n 0: cat\n    focat   \n 0: cat\n    *** Failers\nNo match\n    foocat  \nNo match\n\n/(?(?<!foo)cat|bar)/\n    foobar\n 0: bar\n    cat\n 0: cat\n    fcat\n 0: cat\n    focat   \n 0: cat\n    *** Failers\nNo match\n    foocat  \nNo match\n\n/(?>a*)*/\n    a\n 0: a\n 1: \n    aa\n 0: aa\n 1: \n    aaaa\n 0: aaaa\n 1: \n    \n/(abc|)+/\n    abc\n 0: abc\n 1: \n    abcabc\n 0: abcabc\n 1: abc\n 2: \n    abcabcabc\n 0: abcabcabc\n 1: abcabc\n 2: abc\n 3: \n    xyz      \n 0: \n\n/([a]*)*/\n    a\n 0: a\n 1: \n    aaaaa \n 0: aaaaa\n 1: aaaa\n 2: aaa\n 3: aa\n 4: a\n 5: \n \n/([ab]*)*/\n    a\n 0: a\n 1: \n    b\n 0: b\n 1: \n    ababab\n 0: ababab\n 1: ababa\n 2: abab\n 3: aba\n 4: ab\n 5: a\n 6: \n    aaaabcde\n 0: aaaab\n 1: aaaa\n 2: aaa\n 3: aa\n 4: a\n 5: \n    bbbb    \n 0: bbbb\n 1: bbb\n 2: bb\n 3: b\n 4: \n \n/([^a]*)*/\n    b\n 0: b\n 1: \n    bbbb\n 0: bbbb\n 1: bbb\n 2: bb\n 3: b\n 4: \n    aaa   \n 0: \n \n/([^ab]*)*/\n    cccc\n 0: cccc\n 1: ccc\n 2: cc\n 3: c\n 4: \n    abab  \n 0: \n \n/([a]*?)*/\n    a\n 0: a\n 1: \n    aaaa \n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n 4: \n \n/([ab]*?)*/\n    a\n 0: a\n 1: \n    b\n 0: b\n 1: \n    abab\n 0: abab\n 1: aba\n 2: ab\n 3: a\n 4: \n    baba   \n 0: baba\n 1: bab\n 2: ba\n 3: b\n 4: \n \n/([^a]*?)*/\n    b\n 0: b\n 1: \n    bbbb\n 0: bbbb\n 1: bbb\n 2: bb\n 3: b\n 4: \n    aaa   \n 0: \n \n/([^ab]*?)*/\n    c\n 0: c\n 1: \n    cccc\n 0: cccc\n 1: ccc\n 2: cc\n 3: c\n 4: \n    baba   \n 0: \n \n/(?>a*)*/\n    a\n 0: a\n 1: \n    aaabcde \n 0: aaa\n 1: \n \n/((?>a*))*/\n    aaaaa\n 0: aaaaa\n 1: \n    aabbaa \n 0: aa\n 1: \n \n/((?>a*?))*/\n    aaaaa\n 0: aaaaa\n 1: \n    aabbaa \n 0: aa\n 1: \n\n/(?(?=[^a-z]+[a-z])  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} ) /x\n    12-sep-98\n 0: 12-sep-98\n    12-09-98\n 0: 12-09-98\n    *** Failers\nNo match\n    sep-12-98\nNo match\n        \n/(?i:saturday|sunday)/\n    saturday\n 0: saturday\n    sunday\n 0: sunday\n    Saturday\n 0: Saturday\n    Sunday\n 0: Sunday\n    SATURDAY\n 0: SATURDAY\n    SUNDAY\n 0: SUNDAY\n    SunDay\n 0: SunDay\n    \n/(a(?i)bc|BB)x/\n    abcx\n 0: abcx\n    aBCx\n 0: aBCx\n    bbx\n 0: bbx\n    BBx\n 0: BBx\n    *** Failers\nNo match\n    abcX\nNo match\n    aBCX\nNo match\n    bbX\nNo match\n    BBX               \nNo match\n\n/^([ab](?i)[cd]|[ef])/\n    ac\n 0: ac\n    aC\n 0: aC\n    bD\n 0: bD\n    elephant\n 0: e\n    Europe \n 0: E\n    frog\n 0: f\n    France\n 0: F\n    *** Failers\nNo match\n    Africa     \nNo match\n\n/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/\n    ab\n 0: ab\n    aBd\n 0: aBd\n    xy\n 0: xy\n    xY\n 0: xY\n    zebra\n 0: z\n    Zambesi\n 0: Z\n    *** Failers\nNo match\n    aCD  \nNo match\n    XY  \nNo match\n\n/(?<=foo\\n)^bar/m\n    foo\\nbar\n 0: bar\n    *** Failers\nNo match\n    bar\nNo match\n    baz\\nbar   \nNo match\n\n/(?<=(?<!foo)bar)baz/\n    barbaz\n 0: baz\n    barbarbaz \n 0: baz\n    koobarbaz \n 0: baz\n    *** Failers\nNo match\n    baz\nNo match\n    foobarbaz \nNo match\n\n/The following tests are taken from the Perl 5.005 test suite; some of them/\n/are compatible with 5.004, but I'd rather not have to sort them out./\nNo match\n\n/abc/\n    abc\n 0: abc\n    xabcy\n 0: abc\n    ababc\n 0: abc\n    *** Failers\nNo match\n    xbc\nNo match\n    axc\nNo match\n    abx\nNo match\n\n/ab*c/\n    abc\n 0: abc\n\n/ab*bc/\n    abc\n 0: abc\n    abbc\n 0: abbc\n    abbbbc\n 0: abbbbc\n\n/.{1}/\n    abbbbc\n 0: a\n\n/.{3,4}/\n    abbbbc\n 0: abbb\n\n/ab{0,}bc/\n    abbbbc\n 0: abbbbc\n\n/ab+bc/\n    abbc\n 0: abbc\n    *** Failers\nNo match\n    abc\nNo match\n    abq\nNo match\n\n/ab+bc/\n    abbbbc\n 0: abbbbc\n\n/ab{1,}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{1,3}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{3,4}bc/\n    abbbbc\n 0: abbbbc\n\n/ab{4,5}bc/\n    *** Failers\nNo match\n    abq\nNo match\n    abbbbc\nNo match\n\n/ab?bc/\n    abbc\n 0: abbc\n    abc\n 0: abc\n\n/ab{0,1}bc/\n    abc\n 0: abc\n\n/ab?bc/\n\n/ab?c/\n    abc\n 0: abc\n\n/ab{0,1}c/\n    abc\n 0: abc\n\n/^abc$/\n    abc\n 0: abc\n    *** Failers\nNo match\n    abbbbc\nNo match\n    abcc\nNo match\n\n/^abc/\n    abcc\n 0: abc\n\n/^abc$/\n\n/abc$/\n    aabc\n 0: abc\n    *** Failers\nNo match\n    aabc\n 0: abc\n    aabcd\nNo match\n\n/^/\n    abc\n 0: \n\n/$/\n    abc\n 0: \n\n/a.c/\n    abc\n 0: abc\n    axc\n 0: axc\n\n/a.*c/\n    axyzc\n 0: axyzc\n\n/a[bc]d/\n    abd\n 0: abd\n    *** Failers\nNo match\n    axyzd\nNo match\n    abc\nNo match\n\n/a[b-d]e/\n    ace\n 0: ace\n\n/a[b-d]/\n    aac\n 0: ac\n\n/a[-b]/\n    a-\n 0: a-\n\n/a[b-]/\n    a-\n 0: a-\n\n/a]/\n    a]\n 0: a]\n\n/a[]]b/\n    a]b\n 0: a]b\n\n/a[^bc]d/\n    aed\n 0: aed\n    *** Failers\nNo match\n    abd\nNo match\n    abd\nNo match\n\n/a[^-b]c/\n    adc\n 0: adc\n\n/a[^]b]c/\n    adc\n 0: adc\n    *** Failers\nNo match\n    a-c\n 0: a-c\n    a]c\nNo match\n\n/\\ba\\b/\n    a-\n 0: a\n    -a\n 0: a\n    -a-\n 0: a\n\n/\\by\\b/\n    *** Failers\nNo match\n    xy\nNo match\n    yz\nNo match\n    xyz\nNo match\n\n/\\Ba\\B/\n    *** Failers\n 0: a\n    a-\nNo match\n    -a\nNo match\n    -a-\nNo match\n\n/\\By\\b/\n    xy\n 0: y\n\n/\\by\\B/\n    yz\n 0: y\n\n/\\By\\B/\n    xyz\n 0: y\n\n/\\w/\n    a\n 0: a\n\n/\\W/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    a\nNo match\n\n/a\\sb/\n    a b\n 0: a b\n\n/a\\Sb/\n    a-b\n 0: a-b\n    *** Failers\nNo match\n    a-b\n 0: a-b\n    a b\nNo match\n\n/\\d/\n    1\n 0: 1\n\n/\\D/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    1\nNo match\n\n/[\\w]/\n    a\n 0: a\n\n/[\\W]/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    a\nNo match\n\n/a[\\s]b/\n    a b\n 0: a b\n\n/a[\\S]b/\n    a-b\n 0: a-b\n    *** Failers\nNo match\n    a-b\n 0: a-b\n    a b\nNo match\n\n/[\\d]/\n    1\n 0: 1\n\n/[\\D]/\n    -\n 0: -\n    *** Failers\n 0: *\n    -\n 0: -\n    1\nNo match\n\n/ab|cd/\n    abc\n 0: ab\n    abcd\n 0: ab\n\n/()ef/\n    def\n 0: ef\n\n/$b/\n\n/a\\(b/\n    a(b\n 0: a(b\n\n/a\\(*b/\n    ab\n 0: ab\n    a((b\n 0: a((b\n\n/a\\\\b/\n    a\\b\nNo match\n\n/((a))/\n    abc\n 0: a\n\n/(a)b(c)/\n    abc\n 0: abc\n\n/a+b+c/\n    aabbabc\n 0: abc\n\n/a{1,}b{1,}c/\n    aabbabc\n 0: abc\n\n/a.+?c/\n    abcabc\n 0: abcabc\n 1: abc\n\n/(a+|b)*/\n    ab\n 0: ab\n 1: a\n 2: \n\n/(a+|b){0,}/\n    ab\n 0: ab\n 1: a\n 2: \n\n/(a+|b)+/\n    ab\n 0: ab\n 1: a\n\n/(a+|b){1,}/\n    ab\n 0: ab\n 1: a\n\n/(a+|b)?/\n    ab\n 0: a\n 1: \n\n/(a+|b){0,1}/\n    ab\n 0: a\n 1: \n\n/[^ab]*/\n    cde\n 0: cde\n\n/abc/\n    *** Failers\nNo match\n    b\nNo match\n    \n\n/a*/\n    \n\n/([abc])*d/\n    abbbcd\n 0: abbbcd\n\n/([abc])*bcd/\n    abcd\n 0: abcd\n\n/a|b|c|d|e/\n    e\n 0: e\n\n/(a|b|c|d|e)f/\n    ef\n 0: ef\n\n/abcd*efg/\n    abcdefg\n 0: abcdefg\n\n/ab*/\n    xabyabbbz\n 0: ab\n    xayabbbz\n 0: a\n\n/(ab|cd)e/\n    abcde\n 0: cde\n\n/[abhgefdc]ij/\n    hij\n 0: hij\n\n/^(ab|cd)e/\n\n/(abc|)ef/\n    abcdef\n 0: ef\n\n/(a|b)c*d/\n    abcd\n 0: bcd\n\n/(ab|ab*)bc/\n    abc\n 0: abc\n\n/a([bc]*)c*/\n    abc\n 0: abc\n 1: a\n\n/a([bc]*)(c*d)/\n    abcd\n 0: abcd\n\n/a([bc]+)(c*d)/\n    abcd\n 0: abcd\n\n/a([bc]*)(c+d)/\n    abcd\n 0: abcd\n\n/a[bcd]*dcdcde/\n    adcdcde\n 0: adcdcde\n\n/a[bcd]+dcdcde/\n    *** Failers\nNo match\n    abcde\nNo match\n    adcdcde\nNo match\n\n/(ab|a)b*c/\n    abc\n 0: abc\n\n/((a)(b)c)(d)/\n    abcd\n 0: abcd\n\n/[a-zA-Z_][a-zA-Z0-9_]*/\n    alpha\n 0: alpha\n\n/^a(bc+|b[eh])g|.h$/\n    abh\n 0: bh\n\n/(bc+d$|ef*g.|h?i(j|k))/\n    effgz\n 0: effgz\n    ij\n 0: ij\n    reffgz\n 0: effgz\n    *** Failers\nNo match\n    effg\nNo match\n    bcdd\nNo match\n\n/((((((((((a))))))))))/\n    a\n 0: a\n\n/(((((((((a)))))))))/\n    a\n 0: a\n\n/multiple words of text/\n    *** Failers\nNo match\n    aa\nNo match\n    uh-uh\nNo match\n\n/multiple words/\n    multiple words, yeah\n 0: multiple words\n\n/(.*)c(.*)/\n    abcde\n 0: abcde\n\n/\\((.*), (.*)\\)/\n    (a, b)\n 0: (a, b)\n\n/[k]/\n\n/abcd/\n    abcd\n 0: abcd\n\n/a(bc)d/\n    abcd\n 0: abcd\n\n/a[-]?c/\n    ac\n 0: ac\n\n/abc/i\n    ABC\n 0: ABC\n    XABCY\n 0: ABC\n    ABABC\n 0: ABC\n    *** Failers\nNo match\n    aaxabxbaxbbx\nNo match\n    XBC\nNo match\n    AXC\nNo match\n    ABX\nNo match\n\n/ab*c/i\n    ABC\n 0: ABC\n\n/ab*bc/i\n    ABC\n 0: ABC\n    ABBC\n 0: ABBC\n\n/ab*?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{0,}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab+?bc/i\n    ABBC\n 0: ABBC\n\n/ab+bc/i\n    *** Failers\nNo match\n    ABC\nNo match\n    ABQ\nNo match\n\n/ab{1,}bc/i\n\n/ab+bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{1,}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{1,3}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{3,4}?bc/i\n    ABBBBC\n 0: ABBBBC\n\n/ab{4,5}?bc/i\n    *** Failers\nNo match\n    ABQ\nNo match\n    ABBBBC\nNo match\n\n/ab??bc/i\n    ABBC\n 0: ABBC\n    ABC\n 0: ABC\n\n/ab{0,1}?bc/i\n    ABC\n 0: ABC\n\n/ab??bc/i\n\n/ab??c/i\n    ABC\n 0: ABC\n\n/ab{0,1}?c/i\n    ABC\n 0: ABC\n\n/^abc$/i\n    ABC\n 0: ABC\n    *** Failers\nNo match\n    ABBBBC\nNo match\n    ABCC\nNo match\n\n/^abc/i\n    ABCC\n 0: ABC\n\n/^abc$/i\n\n/abc$/i\n    AABC\n 0: ABC\n\n/^/i\n    ABC\n 0: \n\n/$/i\n    ABC\n 0: \n\n/a.c/i\n    ABC\n 0: ABC\n    AXC\n 0: AXC\n\n/a.*?c/i\n    AXYZC\n 0: AXYZC\n\n/a.*c/i\n    *** Failers\nNo match\n    AABC\n 0: AABC\n    AXYZD\nNo match\n\n/a[bc]d/i\n    ABD\n 0: ABD\n\n/a[b-d]e/i\n    ACE\n 0: ACE\n    *** Failers\nNo match\n    ABC\nNo match\n    ABD\nNo match\n\n/a[b-d]/i\n    AAC\n 0: AC\n\n/a[-b]/i\n    A-\n 0: A-\n\n/a[b-]/i\n    A-\n 0: A-\n\n/a]/i\n    A]\n 0: A]\n\n/a[]]b/i\n    A]B\n 0: A]B\n\n/a[^bc]d/i\n    AED\n 0: AED\n\n/a[^-b]c/i\n    ADC\n 0: ADC\n    *** Failers\nNo match\n    ABD\nNo match\n    A-C\nNo match\n\n/a[^]b]c/i\n    ADC\n 0: ADC\n\n/ab|cd/i\n    ABC\n 0: AB\n    ABCD\n 0: AB\n\n/()ef/i\n    DEF\n 0: EF\n\n/$b/i\n    *** Failers\nNo match\n    A]C\nNo match\n    B\nNo match\n\n/a\\(b/i\n    A(B\n 0: A(B\n\n/a\\(*b/i\n    AB\n 0: AB\n    A((B\n 0: A((B\n\n/a\\\\b/i\n    A\\B\nNo match\n\n/((a))/i\n    ABC\n 0: A\n\n/(a)b(c)/i\n    ABC\n 0: ABC\n\n/a+b+c/i\n    AABBABC\n 0: ABC\n\n/a{1,}b{1,}c/i\n    AABBABC\n 0: ABC\n\n/a.+?c/i\n    ABCABC\n 0: ABCABC\n 1: ABC\n\n/a.*?c/i\n    ABCABC\n 0: ABCABC\n 1: ABC\n\n/a.{0,5}?c/i\n    ABCABC\n 0: ABCABC\n 1: ABC\n\n/(a+|b)*/i\n    AB\n 0: AB\n 1: A\n 2: \n\n/(a+|b){0,}/i\n    AB\n 0: AB\n 1: A\n 2: \n\n/(a+|b)+/i\n    AB\n 0: AB\n 1: A\n\n/(a+|b){1,}/i\n    AB\n 0: AB\n 1: A\n\n/(a+|b)?/i\n    AB\n 0: A\n 1: \n\n/(a+|b){0,1}/i\n    AB\n 0: A\n 1: \n\n/(a+|b){0,1}?/i\n    AB\n 0: A\n 1: \n\n/[^ab]*/i\n    CDE\n 0: CDE\n\n/abc/i\n\n/a*/i\n    \n\n/([abc])*d/i\n    ABBBCD\n 0: ABBBCD\n\n/([abc])*bcd/i\n    ABCD\n 0: ABCD\n\n/a|b|c|d|e/i\n    E\n 0: E\n\n/(a|b|c|d|e)f/i\n    EF\n 0: EF\n\n/abcd*efg/i\n    ABCDEFG\n 0: ABCDEFG\n\n/ab*/i\n    XABYABBBZ\n 0: AB\n    XAYABBBZ\n 0: A\n\n/(ab|cd)e/i\n    ABCDE\n 0: CDE\n\n/[abhgefdc]ij/i\n    HIJ\n 0: HIJ\n\n/^(ab|cd)e/i\n    ABCDE\nNo match\n\n/(abc|)ef/i\n    ABCDEF\n 0: EF\n\n/(a|b)c*d/i\n    ABCD\n 0: BCD\n\n/(ab|ab*)bc/i\n    ABC\n 0: ABC\n\n/a([bc]*)c*/i\n    ABC\n 0: ABC\n 1: A\n\n/a([bc]*)(c*d)/i\n    ABCD\n 0: ABCD\n\n/a([bc]+)(c*d)/i\n    ABCD\n 0: ABCD\n\n/a([bc]*)(c+d)/i\n    ABCD\n 0: ABCD\n\n/a[bcd]*dcdcde/i\n    ADCDCDE\n 0: ADCDCDE\n\n/a[bcd]+dcdcde/i\n\n/(ab|a)b*c/i\n    ABC\n 0: ABC\n\n/((a)(b)c)(d)/i\n    ABCD\n 0: ABCD\n\n/[a-zA-Z_][a-zA-Z0-9_]*/i\n    ALPHA\n 0: ALPHA\n\n/^a(bc+|b[eh])g|.h$/i\n    ABH\n 0: BH\n\n/(bc+d$|ef*g.|h?i(j|k))/i\n    EFFGZ\n 0: EFFGZ\n    IJ\n 0: IJ\n    REFFGZ\n 0: EFFGZ\n    *** Failers\nNo match\n    ADCDCDE\nNo match\n    EFFG\nNo match\n    BCDD\nNo match\n\n/((((((((((a))))))))))/i\n    A\n 0: A\n\n/(((((((((a)))))))))/i\n    A\n 0: A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i\n    A\n 0: A\n\n/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i\n    C\n 0: C\n\n/multiple words of text/i\n    *** Failers\nNo match\n    AA\nNo match\n    UH-UH\nNo match\n\n/multiple words/i\n    MULTIPLE WORDS, YEAH\n 0: MULTIPLE WORDS\n\n/(.*)c(.*)/i\n    ABCDE\n 0: ABCDE\n\n/\\((.*), (.*)\\)/i\n    (A, B)\n 0: (A, B)\n\n/[k]/i\n\n/abcd/i\n    ABCD\n 0: ABCD\n\n/a(bc)d/i\n    ABCD\n 0: ABCD\n\n/a[-]?c/i\n    AC\n 0: AC\n\n/a(?!b)./\n    abad\n 0: ad\n\n/a(?=d)./\n    abad\n 0: ad\n\n/a(?=c|d)./\n    abad\n 0: ad\n\n/a(?:b|c|d)(.)/\n    ace\n 0: ace\n\n/a(?:b|c|d)*(.)/\n    ace\n 0: ace\n 1: ac\n\n/a(?:b|c|d)+?(.)/\n    ace\n 0: ace\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n 2: acdbcd\n 3: acdbc\n 4: acdb\n 5: acd\n\n/a(?:b|c|d)+(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n 2: acdbcd\n 3: acdbc\n 4: acdb\n 5: acd\n\n/a(?:b|c|d){2}(.)/\n    acdbcdbe\n 0: acdb\n\n/a(?:b|c|d){4,5}(.)/\n    acdbcdbe\n 0: acdbcdb\n 1: acdbcd\n\n/a(?:b|c|d){4,5}?(.)/\n    acdbcdbe\n 0: acdbcdb\n 1: acdbcd\n\n/((foo)|(bar))*/\n    foobar\n 0: foobar\n 1: foo\n 2: \n\n/a(?:b|c|d){6,7}(.)/\n    acdbcdbe\n 0: acdbcdbe\n\n/a(?:b|c|d){6,7}?(.)/\n    acdbcdbe\n 0: acdbcdbe\n\n/a(?:b|c|d){5,6}(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n\n/a(?:b|c|d){5,6}?(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n\n/a(?:b|c|d){5,7}(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n\n/a(?:b|c|d){5,7}?(.)/\n    acdbcdbe\n 0: acdbcdbe\n 1: acdbcdb\n\n/a(?:b|(c|e){1,2}?|d)+?(.)/\n    ace\n 0: ace\n\n/^(.+)?B/\n    AB\n 0: AB\n\n/^([^a-z])|(\\^)$/\n    .\n 0: .\n\n/^[<>]&/\n    <&OUT\n 0: <&\n\n/(?:(f)(o)(o)|(b)(a)(r))*/\n    foobar\n 0: foobar\n 1: foo\n 2: \n\n/(?<=a)b/\n    ab\n 0: b\n    *** Failers\nNo match\n    cb\nNo match\n    b\nNo match\n\n/(?<!c)b/\n    ab\n 0: b\n    b\n 0: b\n    b\n 0: b\n\n/(?:..)*a/\n    aba\n 0: aba\n 1: a\n\n/(?:..)*?a/\n    aba\n 0: aba\n 1: a\n\n/^(){3,5}/\n    abc\n 0: \n\n/^(a+)*ax/\n    aax\n 0: aax\n\n/^((a|b)+)*ax/\n    aax\n 0: aax\n\n/^((a|bc)+)*ax/\n    aax\n 0: aax\n\n/(a|x)*ab/\n    cab\n 0: ab\n\n/(a)*ab/\n    cab\n 0: ab\n\n/(?:(?i)a)b/\n    ab\n 0: ab\n\n/((?i)a)b/\n    ab\n 0: ab\n\n/(?:(?i)a)b/\n    Ab\n 0: Ab\n\n/((?i)a)b/\n    Ab\n 0: Ab\n\n/(?:(?i)a)b/\n    *** Failers\nNo match\n    cb\nNo match\n    aB\nNo match\n\n/((?i)a)b/\n\n/(?i:a)b/\n    ab\n 0: ab\n\n/((?i:a))b/\n    ab\n 0: ab\n\n/(?i:a)b/\n    Ab\n 0: Ab\n\n/((?i:a))b/\n    Ab\n 0: Ab\n\n/(?i:a)b/\n    *** Failers\nNo match\n    aB\nNo match\n    aB\nNo match\n\n/((?i:a))b/\n\n/(?:(?-i)a)b/i\n    ab\n 0: ab\n\n/((?-i)a)b/i\n    ab\n 0: ab\n\n/(?:(?-i)a)b/i\n    aB\n 0: aB\n\n/((?-i)a)b/i\n    aB\n 0: aB\n\n/(?:(?-i)a)b/i\n    *** Failers\nNo match\n    aB\n 0: aB\n    Ab\nNo match\n\n/((?-i)a)b/i\n\n/(?:(?-i)a)b/i\n    aB\n 0: aB\n\n/((?-i)a)b/i\n    aB\n 0: aB\n\n/(?:(?-i)a)b/i\n    *** Failers\nNo match\n    Ab\nNo match\n    AB\nNo match\n\n/((?-i)a)b/i\n\n/(?-i:a)b/i\n    ab\n 0: ab\n\n/((?-i:a))b/i\n    ab\n 0: ab\n\n/(?-i:a)b/i\n    aB\n 0: aB\n\n/((?-i:a))b/i\n    aB\n 0: aB\n\n/(?-i:a)b/i\n    *** Failers\nNo match\n    AB\nNo match\n    Ab\nNo match\n\n/((?-i:a))b/i\n\n/(?-i:a)b/i\n    aB\n 0: aB\n\n/((?-i:a))b/i\n    aB\n 0: aB\n\n/(?-i:a)b/i\n    *** Failers\nNo match\n    Ab\nNo match\n    AB\nNo match\n\n/((?-i:a))b/i\n\n/((?-i:a.))b/i\n    *** Failers\nNo match\n    AB\nNo match\n    a\\nB\nNo match\n\n/((?s-i:a.))b/i\n    a\\nB\n 0: a\\x0aB\n\n/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/\n    cabbbb\n 0: cabbbb\n\n/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/\n    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n\n/foo\\w*\\d{4}baz/\n    foobar1234baz\n 0: foobar1234baz\n\n/x(~~)*(?:(?:F)?)?/\n    x~~\n 0: x~~\n 1: x\n\n/^a(?#xxx){3}c/\n    aaac\n 0: aaac\n\n/^a (?#xxx) (?#yyy) {3}c/x\n    aaac\n 0: aaac\n\n/(?<![cd])b/\n    *** Failers\nNo match\n    B\\nB\nNo match\n    dbcb\nNo match\n\n/(?<![cd])[ab]/\n    dbaacb\n 0: a\n\n/(?<!(c|d))b/\n\n/(?<!(c|d))[ab]/\n    dbaacb\n 0: a\n\n/(?<!cd)[ab]/\n    cdaccb\n 0: b\n\n/^(?:a?b?)*$/\n    *** Failers\nNo match\n    dbcb\nNo match\n    a--\nNo match\n\n/((?s)^a(.))((?m)^b$)/\n    a\\nb\\nc\\n\n 0: a\\x0ab\n\n/((?m)^b$)/\n    a\\nb\\nc\\n\n 0: b\n\n/(?m)^b/\n    a\\nb\\n\n 0: b\n\n/(?m)^(b)/\n    a\\nb\\n\n 0: b\n\n/((?m)^b)/\n    a\\nb\\n\n 0: b\n\n/\\n((?m)^b)/\n    a\\nb\\n\n 0: \\x0ab\n\n/((?s).)c(?!.)/\n    a\\nb\\nc\\n\n 0: \\x0ac\n    a\\nb\\nc\\n\n 0: \\x0ac\n\n/((?s)b.)c(?!.)/\n    a\\nb\\nc\\n\n 0: b\\x0ac\n    a\\nb\\nc\\n\n 0: b\\x0ac\n\n/^b/\n\n/()^b/\n    *** Failers\nNo match\n    a\\nb\\nc\\n\nNo match\n    a\\nb\\nc\\n\nNo match\n\n/((?m)^b)/\n    a\\nb\\nc\\n\n 0: b\n\n/(?(?!a)a|b)/\n\n/(?(?!a)b|a)/\n    a\n 0: a\n\n/(?(?=a)b|a)/\n    *** Failers\nNo match\n    a\nNo match\n    a\nNo match\n\n/(?(?=a)a|b)/\n    a\n 0: a\n\n/(\\w+:)+/\n    one:\n 0: one:\n\n/$(?<=^(a))/\n    a\n 0: \n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n 0: abcd\n    xy:z:::abcd\n 0: xy:z:::abcd\n\n/^[^bcd]*(c+)/\n    aexycd\n 0: aexyc\n\n/(a*)b+/\n    caab\n 0: aab\n\n/([\\w:]+::)?(\\w+)$/\n    abcd\n 0: abcd\n    xy:z:::abcd\n 0: xy:z:::abcd\n    *** Failers\n 0: Failers\n    abcd:\nNo match\n    abcd:\nNo match\n\n/^[^bcd]*(c+)/\n    aexycd\n 0: aexyc\n\n/(>a+)ab/\n\n/(?>a+)b/\n    aaab\n 0: aaab\n\n/([[:]+)/\n    a:[b]:\n 0: :[\n\n/([[=]+)/\n    a=[b]=\n 0: =[\n\n/([[.]+)/\n    a.[b].\n 0: .[\n\n/((?>a+)b)/\n    aaab\n 0: aaab\n\n/(?>(a+))b/\n    aaab\n 0: aaab\n\n/((?>[^()]+)|\\([^()]*\\))+/\n    ((abc(ade)ufh()()x\n 0: abc(ade)ufh()()x\n 1: abc(ade)ufh()()\n 2: abc(ade)ufh()\n 3: abc(ade)ufh\n 4: abc(ade)\n 5: abc\n\n/a\\Z/\n    *** Failers\nNo match\n    aaab\nNo match\n    a\\nb\\n\nNo match\n\n/b\\Z/\n    a\\nb\\n\n 0: b\n\n/b\\z/\n\n/b\\Z/\n    a\\nb\n 0: b\n\n/b\\z/\n    a\\nb\n 0: b\n    *** Failers\nNo match\n    \n/(?>.*)(?<=(abcd|wxyz))/\n    alphabetabcd\n 0: alphabetabcd\n    endingwxyz\n 0: endingwxyz\n    *** Failers\nNo match\n    a rather long string that doesn't end with one of them\nNo match\n\n/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/\n    word cat dog elephant mussel cow horse canary baboon snake shark otherword\n 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword\n    word cat dog elephant mussel cow horse canary baboon snake shark\nNo match\n  \n/word (?>[a-zA-Z0-9]+ ){0,30}otherword/\n    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\nNo match\n\n/(?<=\\d{3}(?!999))foo/\n    999foo\n 0: foo\n    123999foo \n 0: foo\n    *** Failers\nNo match\n    123abcfoo\nNo match\n    \n/(?<=(?!...999)\\d{3})foo/\n    999foo\n 0: foo\n    123999foo \n 0: foo\n    *** Failers\nNo match\n    123abcfoo\nNo match\n\n/(?<=\\d{3}(?!999)...)foo/\n    123abcfoo\n 0: foo\n    123456foo \n 0: foo\n    *** Failers\nNo match\n    123999foo  \nNo match\n    \n/(?<=\\d{3}...)(?<!999)foo/\n    123abcfoo   \n 0: foo\n    123456foo \n 0: foo\n    *** Failers\nNo match\n    123999foo  \nNo match\n\n/((Z)+|A)*/\n    ZABCDEFG\n 0: ZA\n 1: Z\n 2: \n\n/(Z()|A)*/\n    ZABCDEFG\n 0: ZA\n 1: Z\n 2: \n\n/(Z(())|A)*/\n    ZABCDEFG\n 0: ZA\n 1: Z\n 2: \n\n/((?>Z)+|A)*/\n    ZABCDEFG\n 0: ZA\n 1: Z\n 2: \n\n/((?>)+|A)*/\n    ZABCDEFG\n 0: \n\n/a*/g\n    abbab\n 0: a\n 0: \n 0: \n 0: a\n 0: \n 0: \n\n/^[\\d-a]/\n    abcde\n 0: a\n    -things\n 0: -\n    0digit\n 0: 0\n    *** Failers\nNo match\n    bcdef    \nNo match\n    \n/[[:space:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/[[:blank:]]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\n     \n/[\\s]+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/\\s+/\n    > \\x09\\x0a\\x0c\\x0d\\x0b<\n 0:  \\x09\\x0a\\x0c\\x0d\\x0b\n     \n/a\u000bb/x\n    ab\n 0: ab\n\n/(?!\\A)x/m\n  a\\nxb\\n\n 0: x\n\n/(?!^)x/m\n  a\\nxb\\n\nNo match\n\n/abc\\Qabc\\Eabc/\n    abcabcabc\n 0: abcabcabc\n    \n/abc\\Q(*+|\\Eabc/\n    abc(*+|abc \n 0: abc(*+|abc\n\n/   abc\\Q abc\\Eabc/x\n    abc abcabc\n 0: abc abcabc\n    *** Failers\nNo match\n    abcabcabc  \nNo match\n    \n/abc#comment\n    \\Q#not comment\n    literal\\E/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment\n    /x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/abc#comment\n    \\Q#not comment\n    literal\\E #more comment/x\n    abc#not comment\\n    literal     \n 0: abc#not comment\\x0a    literal\n\n/\\Qabc\\$xyz\\E/\n    abc\\\\\\$xyz\n 0: abc\\$xyz\n\n/\\Qabc\\E\\$\\Qxyz\\E/\n    abc\\$xyz\n 0: abc$xyz\n\n/\\Gabc/\n    abc\n 0: abc\n    *** Failers\nNo match\n    xyzabc  \nNo match\n\n/\\Gabc./g\n    abc1abc2xyzabc3\n 0: abc1\n 0: abc2\n\n/abc./g\n    abc1abc2xyzabc3 \n 0: abc1\n 0: abc2\n 0: abc3\n\n/a(?x: b c )d/\n    XabcdY\n 0: abcd\n    *** Failers \nNo match\n    Xa b c d Y \nNo match\n\n/((?x)x y z | a b c)/\n    XabcY\n 0: abc\n    AxyzB \n 0: xyz\n\n/(?i)AB(?-i)C/\n    XabCY\n 0: abC\n    *** Failers\nNo match\n    XabcY  \nNo match\n\n/((?i)AB(?-i)C|D)E/\n    abCE\n 0: abCE\n    DE\n 0: DE\n    *** Failers\nNo match\n    abcE\nNo match\n    abCe  \nNo match\n    dE\nNo match\n    De    \nNo match\n\n/[z\\Qa-d]\\E]/\n    z\n 0: z\n    a\n 0: a\n    -\n 0: -\n    d\n 0: d\n    ] \n 0: ]\n    *** Failers\n 0: a\n    b     \nNo match\n\n/[\\z\\C]/\n    z\n 0: z\n    C \n 0: C\n    \n/\\M/\n    M \n 0: M\n    \n/(a+)*b/\n    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \nNo match\n    \n/(?i)reg(?:ul(?:[a]|ae)r|ex)/\n    REGular\n 0: REGular\n    regulaer\n 0: regulaer\n    Regex  \n 0: Regex\n    regulr \n 0: regul\\xe4r\n\n/[--]+/\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xe0\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xff\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xc0\n    \n 0: \\xc5\\xe6\\xe5\\xe4\\xdf\n\n/(?<=Z)X./\n    \\x84XAZXB\n 0: XB\n\n/^(?(2)a|(1)(2))+$/\n    123a\nError -17 (backreference condition or recursion test not supported for DFA matching)\n\n/(?<=a|bbbb)c/\n    ac\n 0: c\n    bbbbc\n 0: c\n\n/abc/SS>testsavedregex\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nNo study data\n    abc\n 0: abc\n    *** Failers\nNo match\n    bca\nNo match\n    \n/abc/FSS>testsavedregex\nCompiled pattern written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nNo study data\n    abc\n 0: abc\n    *** Failers\nNo match\n    bca\nNo match\n\n/(a|b)/S>testsavedregex\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: a\n    *** Failers\n 0: a\n    def  \nNo match\n    \n/(a|b)/SF>testsavedregex\nCompiled pattern written to testsavedregex\nStudy data written to testsavedregex\n<testsavedregex\nCompiled pattern (byte-inverted) loaded from testsavedregex\nStudy data loaded from testsavedregex\n    abc\n 0: a\n    *** Failers\n 0: a\n    def  \nNo match\n    \n/line\\nbreak/\n    this is a line\\nbreak\n 0: line\\x0abreak\n    line one\\nthis is a line\\nbreak in the second line \n 0: line\\x0abreak\n\n/line\\nbreak/f\n    this is a line\\nbreak\n 0: line\\x0abreak\n    ** Failers \nNo match\n    line one\\nthis is a line\\nbreak in the second line \nNo match\n\n/line\\nbreak/mf\n    this is a line\\nbreak\n 0: line\\x0abreak\n    ** Failers \nNo match\n    line one\\nthis is a line\\nbreak in the second line \nNo match\n\n/1234/\n    123\\P\nPartial match: 123\n    a4\\P\\R\nNo match\n\n/1234/\n    123\\P\nPartial match: 123\n    4\\P\\R\n 0: 4\n\n/^/mg\n    a\\nb\\nc\\n\n 0: \n 0: \n 0: \n    \\ \n 0: \n    \n/(?<=C\\n)^/mg\n    A\\nC\\nC\\n \n 0: \n\n/(?s)A?B/\n    AB\n 0: AB\n    aB  \n 0: B\n\n/(?s)A*B/\n    AB\n 0: AB\n    aB  \n 0: B\n\n/(?m)A?B/\n    AB\n 0: AB\n    aB  \n 0: B\n\n/(?m)A*B/\n    AB\n 0: AB\n    aB  \n 0: B\n\n/Content-Type\\x3A[^\\r\\n]{6,}/\n    Content-Type:xxxxxyyy \n 0: Content-Type:xxxxxyyy\n\n/Content-Type\\x3A[^\\r\\n]{6,}z/\n    Content-Type:xxxxxyyyz\n 0: Content-Type:xxxxxyyyz\n\n/Content-Type\\x3A[^a]{6,}/\n    Content-Type:xxxyyy \n 0: Content-Type:xxxyyy\n\n/Content-Type\\x3A[^a]{6,}z/\n    Content-Type:xxxyyyz\n 0: Content-Type:xxxyyyz\n\n/^abc/m\n    xyz\\nabc\n 0: abc\n    xyz\\nabc\\<lf>\n 0: abc\n    xyz\\r\\nabc\\<lf>\n 0: abc\n    xyz\\rabc\\<cr>\n 0: abc\n    xyz\\r\\nabc\\<crlf>\n 0: abc\n    ** Failers \nNo match\n    xyz\\nabc\\<cr>\nNo match\n    xyz\\r\\nabc\\<cr>\nNo match\n    xyz\\nabc\\<crlf>\nNo match\n    xyz\\rabc\\<crlf>\nNo match\n    xyz\\rabc\\<lf>\nNo match\n    \n/abc$/m<lf>\n    xyzabc\n 0: abc\n    xyzabc\\n \n 0: abc\n    xyzabc\\npqr \n 0: abc\n    xyzabc\\r\\<cr> \n 0: abc\n    xyzabc\\rpqr\\<cr> \n 0: abc\n    xyzabc\\r\\n\\<crlf> \n 0: abc\n    xyzabc\\r\\npqr\\<crlf> \n 0: abc\n    ** Failers\nNo match\n    xyzabc\\r \nNo match\n    xyzabc\\rpqr \nNo match\n    xyzabc\\r\\n \nNo match\n    xyzabc\\r\\npqr \nNo match\n    \n/^abc/m<cr>\n    xyz\\rabcdef\n 0: abc\n    xyz\\nabcdef\\<lf>\n 0: abc\n    ** Failers  \nNo match\n    xyz\\nabcdef\nNo match\n       \n/^abc/m<lf>\n    xyz\\nabcdef\n 0: abc\n    xyz\\rabcdef\\<cr>\n 0: abc\n    ** Failers  \nNo match\n    xyz\\rabcdef\nNo match\n       \n/^abc/m<crlf>\n    xyz\\r\\nabcdef\n 0: abc\n    xyz\\rabcdef\\<cr>\n 0: abc\n    ** Failers  \nNo match\n    xyz\\rabcdef\nNo match\n    \n/.*/<lf>\n    abc\\ndef\n 0: abc\n    abc\\rdef\n 0: abc\\x0ddef\n    abc\\r\\ndef\n 0: abc\\x0d\n    \\<cr>abc\\ndef\n 0: abc\\x0adef\n    \\<cr>abc\\rdef\n 0: abc\n    \\<cr>abc\\r\\ndef\n 0: abc\n    \\<crlf>abc\\ndef\n 0: abc\\x0adef\n    \\<crlf>abc\\rdef\n 0: abc\\x0ddef\n    \\<crlf>abc\\r\\ndef\n 0: abc\n\n/\\w+(.)(.)?def/s\n    abc\\ndef\n 0: abc\\x0adef\n    abc\\rdef\n 0: abc\\x0ddef\n    abc\\r\\ndef\n 0: abc\\x0d\\x0adef\n\n/^\\w+=.*(\\\\\\n.*)*/\n    abc=xyz\\\\\\npqr\n 0: abc=xyz\\\\x0apqr\n 1: abc=xyz\\\\x0apq\n 2: abc=xyz\\\\x0ap\n 3: abc=xyz\\\\x0a\n 4: abc=xyz\\\n 5: abc=xyz\n 6: abc=xy\n 7: abc=x\n 8: abc=\n\n/^(a()*)*/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n 4: \n\n/^(?:a(?:(?:))*)*/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n 4: \n\n/^(a()+)+/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n\n/^(?:a(?:(?:))+)+/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n\n/(a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?>a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/(?:a|)*\\d/\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nNo match\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4\n\n/^a.b/<lf>\n    a\\rb\n 0: a\\x0db\n    a\\nb\\<cr> \n 0: a\\x0ab\n    ** Failers\nNo match\n    a\\nb\nNo match\n    a\\nb\\<any>\nNo match\n    a\\rb\\<cr>   \nNo match\n    a\\rb\\<any>   \nNo match\n\n/^abc./mgx<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x85abc7 JUNK\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n\n/abc.$/mgx<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x85 abc9\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc9\n\n/^a\\Rb/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b   \n 0: a\\x85b\n    ** Failers\nNo match\n    a\\n\\rb    \nNo match\n\n/^a\\R*b/<bsr_unicode>\n    ab\n 0: ab\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b   \n 0: a\\x85b\n    a\\n\\rb    \n 0: a\\x0a\\x0db\n    a\\n\\r\\x85\\x0cb \n 0: a\\x0a\\x0d\\x85\\x0cb\n\n/^a\\R+b/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\rb\n 0: a\\x0db\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x0bb\n 0: a\\x0bb\n    a\\x0cb\n 0: a\\x0cb\n    a\\x85b   \n 0: a\\x85b\n    a\\n\\rb    \n 0: a\\x0a\\x0db\n    a\\n\\r\\x85\\x0cb \n 0: a\\x0a\\x0d\\x85\\x0cb\n    ** Failers\nNo match\n    ab  \nNo match\n    \n/^a\\R{1,3}b/<bsr_unicode>\n    a\\nb\n 0: a\\x0ab\n    a\\n\\rb\n 0: a\\x0a\\x0db\n    a\\n\\r\\x85b\n 0: a\\x0a\\x0d\\x85b\n    a\\r\\n\\r\\nb \n 0: a\\x0d\\x0a\\x0d\\x0ab\n    a\\r\\n\\r\\n\\r\\nb \n 0: a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0ab\n    a\\n\\r\\n\\rb\n 0: a\\x0a\\x0d\\x0a\\x0db\n    a\\n\\n\\r\\nb \n 0: a\\x0a\\x0a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\n\\n\\n\\rb\nNo match\n    a\\r\nNo match\n\n/^a[\\R]b/<bsr_unicode>\n    aRb\n 0: aRb\n    ** Failers\nNo match\n    a\\nb  \nNo match\n\n/.+foo/\n    afoo\n 0: afoo\n    ** Failers \nNo match\n    \\r\\nfoo \nNo match\n    \\nfoo \nNo match\n\n/.+foo/<crlf>\n    afoo\n 0: afoo\n    \\nfoo \n 0: \\x0afoo\n    ** Failers \nNo match\n    \\r\\nfoo \nNo match\n\n/.+foo/<any>\n    afoo\n 0: afoo\n    ** Failers \nNo match\n    \\nfoo \nNo match\n    \\r\\nfoo \nNo match\n\n/.+foo/s\n    afoo\n 0: afoo\n    \\r\\nfoo \n 0: \\x0d\\x0afoo\n    \\nfoo \n 0: \\x0afoo\n\n/^$/mg<any>\n    abc\\r\\rxyz\n 0: \n    abc\\n\\rxyz  \n 0: \n    ** Failers \nNo match\n    abc\\r\\nxyz\nNo match\n\n/^X/m\n    XABC\n 0: X\n    ** Failers \nNo match\n    XABC\\B\nNo match\n\n/(?m)^$/<any>g+\n    abc\\r\\n\\r\\n\n 0: \n 0+ \\x0d\\x0a\n\n/(?m)^$|^\\r\\n/<any>g+ \n    abc\\r\\n\\r\\n\n 0: \\x0d\\x0a\n 0+ \n 1: \n    \n/(?m)$/<any>g+ \n    abc\\r\\n\\r\\n\n 0: \n 0+ \\x0d\\x0a\\x0d\\x0a\n 0: \n 0+ \\x0d\\x0a\n 0: \n 0+ \n\n/(?|(abc)|(xyz))/\n   >abc<\n 0: abc\n   >xyz< \n 0: xyz\n\n/(x)(?|(abc)|(xyz))(x)/\n    xabcx\n 0: xabcx\n    xxyzx \n 0: xxyzx\n\n/(x)(?|(abc)(pqr)|(xyz))(x)/\n    xabcpqrx\n 0: xabcpqrx\n    xxyzx \n 0: xxyzx\n\n/(?|(abc)|(xyz))(?1)/\n    abcabc\n 0: abcabc\n    xyzabc \n 0: xyzabc\n    ** Failers \nNo match\n    xyzxyz \nNo match\n \n/\\H\\h\\V\\v/\n    X X\\x0a\n 0: X X\\x0a\n    X\\x09X\\x0b\n 0: X\\x09X\\x0b\n    ** Failers\nNo match\n    \\xa0 X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/ \n    \\x09\\x20\\xa0X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x09 \\xa0X\\x0a\\x0b\\x0c\\x0d\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x09 \\xa0\\x0a\\x0b\\x0c\\x0d\n    \\x09\\x20\\xa0\\x0a\\x0b\\x0c\n 0: \\x09 \\xa0\\x0a\\x0b\\x0c\n    ** Failers \nNo match\n    \\x09\\x20\\xa0\\x0a\\x0b\nNo match\n     \n/\\H{3,4}/\n    XY  ABCDE\n 0: ABCD\n    XY  PQR ST \n 0: PQR\n    \n/.\\h{3,4}./\n    XY  AB    PQRS\n 0: B    P\n 1: B    \n\n/\\h*X\\h?\\H+Y\\H?Z/\n    >XNNNYZ\n 0: XNNNYZ\n    >  X NYQZ\n 0:   X NYQZ\n    ** Failers\nNo match\n    >XYZ   \nNo match\n    >  X NY Z\nNo match\n\n/\\v*X\\v?Y\\v+Z\\V*\\x0a\\V+\\x0b\\V{2,3}\\x0c/\n    >XY\\x0aZ\\x0aA\\x0bNN\\x0c\n 0: XY\\x0aZ\\x0aA\\x0bNN\\x0c\n    >\\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n 0: \\x0a\\x0dX\\x0aY\\x0a\\x0bZZZ\\x0aAAA\\x0bNNN\\x0c\n\n/.+A/<crlf>\n    \\r\\nA\nNo match\n    \n/\\nA/<crlf>\n    \\r\\nA \n 0: \\x0aA\n\n/[\\r\\n]A/<crlf>\n    \\r\\nA \n 0: \\x0aA\n\n/(\\r|\\n)A/<crlf>\n    \\r\\nA \n 0: \\x0aA\n\n/a\\Rb/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\Rb/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x85b\n 0: a\\x85b\n    a\\x0bb     \n 0: a\\x0bb\n    ** Failers \nNo match\n    a\\x85b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R?b/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\R?b/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x0db\n    a\\nb\n 0: a\\x0ab\n    a\\r\\nb\n 0: a\\x0d\\x0ab\n    a\\x85b\n 0: a\\x85b\n    a\\x0bb     \n 0: a\\x0bb\n    ** Failers \nNo match\n    a\\x85b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R{2,4}b/I<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf\nFirst char = 'a'\nNeed char = 'b'\n    a\\r\\n\\nb\n 0: a\\x0d\\x0a\\x0ab\n    a\\n\\r\\rb\n 0: a\\x0a\\x0d\\x0db\n    a\\r\\n\\r\\n\\r\\n\\r\\nb\n 0: a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0a\\x0d\\x0ab\n    ** Failers\nNo match\n    a\\x85\\85b\nNo match\n    a\\x0b\\0bb     \nNo match\n\n/a\\R{2,4}b/I<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode\nFirst char = 'a'\nNeed char = 'b'\n    a\\r\\rb\n 0: a\\x0d\\x0db\n    a\\n\\n\\nb\n 0: a\\x0a\\x0a\\x0ab\n    a\\r\\n\\n\\r\\rb\n 0: a\\x0d\\x0a\\x0a\\x0d\\x0db\n    a\\x85\\85b\nNo match\n    a\\x0b\\0bb     \nNo match\n    ** Failers \nNo match\n    a\\r\\r\\r\\r\\rb \nNo match\n    a\\x85\\85b\\<bsr_anycrlf>\nNo match\n    a\\x0b\\0bb\\<bsr_anycrlf>\nNo match\n    \n/a(?!)|\\wbc/\n    abc \n 0: abc\n\n/a[]b/<JS>\n    ** Failers\nNo match\n    ab\nNo match\n\n/a[]+b/<JS>\n    ** Failers\nNo match\n    ab \nNo match\n\n/a[]*+b/<JS>\n    ** Failers\nNo match\n    ab \nNo match\n\n/a[^]b/<JS>\n    aXb\n 0: aXb\n    a\\nb \n 0: a\\x0ab\n    ** Failers\nNo match\n    ab  \nNo match\n    \n/a[^]+b/<JS> \n    aXb\n 0: aXb\n    a\\nX\\nXb \n 0: a\\x0aX\\x0aXb\n    ** Failers\nNo match\n    ab  \nNo match\n\n/X$/E\n    X\n 0: X\n    ** Failers \nNo match\n    X\\n \nNo match\n\n/X$/\n    X\n 0: X\n    X\\n \n 0: X\n\n/xyz/C\n  xyz \n--->xyz\n +0 ^       x\n +1 ^^      y\n +2 ^ ^     z\n +3 ^  ^    \n 0: xyz\n  abcxyz \n--->abcxyz\n +0    ^       x\n +1    ^^      y\n +2    ^ ^     z\n +3    ^  ^    \n 0: xyz\n  abcxyz\\Y\n--->abcxyz\n +0 ^          x\n +0  ^         x\n +0   ^        x\n +0    ^       x\n +1    ^^      y\n +2    ^ ^     z\n +3    ^  ^    \n 0: xyz\n  ** Failers \nNo match\n  abc\nNo match\n  abc\\Y\n--->abc\n +0 ^       x\n +0  ^      x\n +0   ^     x\n +0    ^    x\nNo match\n  abcxypqr  \nNo match\n  abcxypqr\\Y  \n--->abcxypqr\n +0 ^            x\n +0  ^           x\n +0   ^          x\n +0    ^         x\n +1    ^^        y\n +2    ^ ^       z\n +0     ^        x\n +0      ^       x\n +0       ^      x\n +0        ^     x\n +0         ^    x\nNo match\n\n/(*NO_START_OPT)xyz/C\n  abcxyz \n--->abcxyz\n+15 ^          x\n+15  ^         x\n+15   ^        x\n+15    ^       x\n+16    ^^      y\n+17    ^ ^     z\n+18    ^  ^    \n 0: xyz\n  \n/(?C)ab/\n  ab\n--->ab\n  0 ^      a\n 0: ab\n  \\C-ab\n 0: ab\n  \n/ab/C\n  ab\n--->ab\n +0 ^      a\n +1 ^^     b\n +2 ^ ^    \n 0: ab\n  \\C-ab    \n 0: ab\n\n/^\"((?(?=[a])[^\"])|b)*\"$/C\n    \"ab\"\n--->\"ab\"\n +0 ^        ^\n +1 ^        \"\n +2 ^^       ((?(?=[a])[^\"])|b)*\n+21 ^^       \"\n +3 ^^       (?(?=[a])[^\"])\n+18 ^^       b\n +5 ^^       (?=[a])\n +8  ^       [a]\n+11  ^^      )\n+12 ^^       [^\"]\n+16 ^ ^      )\n+17 ^ ^      |\n+21 ^ ^      \"\n +3 ^ ^      (?(?=[a])[^\"])\n+18 ^ ^      b\n +5 ^ ^      (?=[a])\n +8   ^      [a]\n+19 ^  ^     )\n+21 ^  ^     \"\n +3 ^  ^     (?(?=[a])[^\"])\n+18 ^  ^     b\n +5 ^  ^     (?=[a])\n +8    ^     [a]\n+17 ^  ^     |\n+22 ^   ^    $\n+23 ^   ^    \n 0: \"ab\"\n    \\C-\"ab\"\n 0: \"ab\"\n\n/\\d+X|9+Y/\n    ++++123999\\P\nPartial match: 123999\n    ++++123999Y\\P\n 0: 999Y\n\n/Z(*F)/\n    Z\\P\nNo match\n    ZA\\P \nNo match\n    \n/Z(?!)/\n    Z\\P \nNo match\n    ZA\\P \nNo match\n\n/dog(sbody)?/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n    \n/dog(sbody)??/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n\n/dog|dogsbody/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n \n/dogsbody|dog/\n    dogs\\P\n 0: dog\n    dogs\\P\\P \nPartial match: dogs\n\n/Z(*F)Q|ZXY/\n    Z\\P\nPartial match: Z\n    ZA\\P \nNo match\n    X\\P \nNo match\n\n/\\bthe cat\\b/\n    the cat\\P\n 0: the cat\n    the cat\\P\\P\nPartial match: the cat\n\n/dog(sbody)?/\n    dogs\\D\\P\n 0: dog\n    body\\D\\R\n 0: body\n\n/dog(sbody)?/\n    dogs\\D\\P\\P\nPartial match: dogs\n    body\\D\\R\n 0: body\n\n/abc/\n   abc\\P\n 0: abc\n   abc\\P\\P\n 0: abc\n\n/abc\\K123/\n    xyzabc123pqr\nError -16 (item unsupported for DFA matching)\n    \n/(?<=abc)123/\n    xyzabc123pqr \n 0: 123\n    xyzabc12\\P\nPartial match at offset 6: abc12\n    xyzabc12\\P\\P\nPartial match at offset 6: abc12\n\n/\\babc\\b/\n    +++abc+++\n 0: abc\n    +++ab\\P\nPartial match at offset 3: +ab\n    +++ab\\P\\P  \nPartial match at offset 3: +ab\n\n/(?=C)/g+\n    ABCDECBA\n 0: \n 0+ CDECBA\n 0: \n 0+ CBA\n\n/(abc|def|xyz)/I\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\n    terhjk;abcdaadsfe\n 0: abc\n    the quick xyz brown fox \n 0: xyz\n    \\Yterhjk;abcdaadsfe\n 0: abc\n    \\Ythe quick xyz brown fox \n 0: xyz\n    ** Failers\nNo match\n    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\nNo match\n    \\Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\nNo match\n\n/(abc|def|xyz)/SI\nCapturing subpattern count = 1\nNo options\nNo first char\nNo need char\nSubject length lower bound = 3\nStarting chars: a d x \n    terhjk;abcdaadsfe\n 0: abc\n    the quick xyz brown fox \n 0: xyz\n    \\Yterhjk;abcdaadsfe\n 0: abc\n    \\Ythe quick xyz brown fox \n 0: xyz\n    ** Failers\nNo match\n    thejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\nNo match\n    \\Ythejk;adlfj aenjl;fda asdfasd ehj;kjxyasiupd\nNo match\n\n/abcd*/+\n    xxxxabcd\\P\n 0: abcd\n 0+ \n    xxxxabcd\\P\\P\nPartial match: abcd\n    dddxxx\\R \n 0: ddd\n 0+ xxx\n    xxxxabcd\\P\\P\nPartial match: abcd\n    xxx\\R \n 0: \n 0+ xxx\n\n/abcd*/i\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n    XXXXABCD\\P\n 0: ABCD\n    XXXXABCD\\P\\P\nPartial match: ABCD\n\n/abc\\d*/\n    xxxxabc1\\P\n 0: abc1\n    xxxxabc1\\P\\P\nPartial match: abc1\n\n/abc[de]*/\n    xxxxabcde\\P\n 0: abcde\n    xxxxabcde\\P\\P\nPartial match: abcde\n\n/(?:(?1)|B)(A(*F)|C)/\n    ABCD\n 0: BC\n    CCD\n 0: CC\n    ** Failers\nNo match\n    CAD   \nNo match\n\n/^(?:(?1)|B)(A(*F)|C)/\n    CCD\n 0: CC\n    BCD \n 0: BC\n    ** Failers\nNo match\n    ABCD\nNo match\n    CAD\nNo match\n    BAD    \nNo match\n\n/^(?!a(*SKIP)b)/\n    ac\nError -16 (item unsupported for DFA matching)\n    \n/^(?=a(*SKIP)b|ac)/\n    ** Failers\nNo match\n    ac\nError -16 (item unsupported for DFA matching)\n    \n/^(?=a(*THEN)b|ac)/\n    ac\nError -16 (item unsupported for DFA matching)\n    \n/^(?=a(*PRUNE)b)/\n    ab  \nError -16 (item unsupported for DFA matching)\n    ** Failers \nNo match\n    ac\nError -16 (item unsupported for DFA matching)\n\n/^(?(?!a(*SKIP)b))/\n    ac\nError -16 (item unsupported for DFA matching)\n\n/(?<=abc)def/\n    abc\\P\\P\nPartial match at offset 3: abc\n\n/abc$/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc$/m\n    abc\n 0: abc\n    abc\\n\n 0: abc\n    abc\\P\\P\nPartial match: abc\n    abc\\n\\P\\P \n 0: abc\n    abc\\P\n 0: abc\n    abc\\n\\P\n 0: abc\n\n/abc\\z/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\Z/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\b/\n    abc\n 0: abc\n    abc\\P\n 0: abc\n    abc\\P\\P\nPartial match: abc\n\n/abc\\B/\n    abc\nNo match\n    abc\\P\nPartial match: abc\n    abc\\P\\P\nPartial match: abc\n\n/.+/\n    abc\\>0\n 0: abc\n    abc\\>1\n 0: bc\n    abc\\>2\n 0: c\n    abc\\>3\nNo match\n    abc\\>4\nError -24 (bad offset value)\n    abc\\>-4 \nError -24 (bad offset value)\n\n/^(?:a)++\\w/\n     aaaab\n 0: aaaab\n     ** Failers \nNo match\n     aaaa \nNo match\n     bbb \nNo match\n\n/^(?:aa|(?:a)++\\w)/\n     aaaab\n 0: aaaab\n 1: aa\n     aaaa \n 0: aa\n     ** Failers \nNo match\n     bbb \nNo match\n\n/^(?:a)*+\\w/\n     aaaab\n 0: aaaab\n     bbb \n 0: b\n     ** Failers \nNo match\n     aaaa \nNo match\n\n/^(a)++\\w/\n     aaaab\n 0: aaaab\n     ** Failers \nNo match\n     aaaa \nNo match\n     bbb \nNo match\n\n/^(a|)++\\w/\n     aaaab\n 0: aaaab\n     ** Failers \nNo match\n     aaaa \nNo match\n     bbb \nNo match\n\n/(?=abc){3}abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc)+abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc)++abc/+\n    abcabcabc\n 0: abc\n 0+ abcabc\n    ** Failers\nNo match\n    xyz  \nNo match\n    \n/(?=abc){0}xyz/\n    xyz \n 0: xyz\n\n/(?=abc){1}xyz/\n    ** Failers\nNo match\n    xyz \nNo match\n    \n/(?=(a))?./\n    ab\n 0: a\n    bc\n 0: b\n      \n/(?=(a))??./\n    ab\n 0: a\n    bc\n 0: b\n\n/^(?=(a)){0}b(?1)/\n    backgammon\n 0: ba\n\n/^(?=(?1))?[az]([abc])d/\n    abd \n 0: abd\n    zcdxx \n 0: zcd\n\n/^(?!a){0}\\w+/\n    aaaaa\n 0: aaaaa\n\n/(?<=(abc))?xyz/\n    abcxyz\n 0: xyz\n    pqrxyz \n 0: xyz\n\n/((?2))((?1))/\n    abc\nError -26 (nested recursion at the same subject position)\n\n/(?(R)a+|(?R)b)/\n    aaaabcde\n 0: aaaab\n\n/(?(R)a+|((?R))b)/\n    aaaabcde\n 0: aaaab\n\n/((?(R)a+|(?1)b))/\n    aaaabcde\n 0: aaaab\n\n/((?(R2)a+|(?1)b))/\n    aaaabcde\nError -17 (backreference condition or recursion test not supported for DFA matching)\n\n/(?(R)a*(?1)|((?R))b)/\n    aaaabcde\nError -26 (nested recursion at the same subject position)\n\n/(a+)/O\n    \\O6aaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaa\n 1: aaa\n 2: aa\n    \\O8aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n\n/ab\\Cde/\n    abXde\n 0: abXde\n    \n/(?<=ab\\Cde)X/\n    abZdeX\n 0: X\n\n/^\\R/\n    \\r\\P\n 0: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \n/^\\R{2,3}x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P \nPartial match: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P  \nPartial match: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P\nPartial match: \\x0d\\x0d\\x0d\n    \\r\\rx\n 0: \\x0d\\x0dx\n    \\r\\r\\rx    \n 0: \\x0d\\x0d\\x0dx\n\n/^\\R{2,3}?x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P \nPartial match: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P  \nPartial match: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P\nPartial match: \\x0d\\x0d\\x0d\n    \\r\\rx\n 0: \\x0d\\x0dx\n    \\r\\r\\rx    \n 0: \\x0d\\x0d\\x0dx\n    \n/^\\R?x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n    x\n 0: x\n    \\rx  \n 0: \\x0dx\n\n/^\\R+x/\n    \\r\\P\nPartial match: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n    \\r\\n\\P\nPartial match: \\x0d\\x0a\n    \\r\\n\\P\\P  \nPartial match: \\x0d\\x0a\n    \\rx  \n 0: \\x0dx\n\n/^a$/<CRLF>\n    a\\r\\P\nPartial match: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^a$/m<CRLF>\n    a\\r\\P\nPartial match: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^(a$|a\\r)/<CRLF>\n    a\\r\\P\n 0: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/^(a$|a\\r)/m<CRLF>\n    a\\r\\P\n 0: a\\x0d\n    a\\r\\P\\P \nPartial match: a\\x0d\n\n/./<CRLF>\n    \\r\\P\n 0: \\x0d\n    \\r\\P\\P \nPartial match: \\x0d\n  \n/.{2,3}/<CRLF>\n    \\r\\P \nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P\n 0: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P\n 0: \\x0d\\x0d\\x0d\n    \\r\\r\\r\\P\\P     \nPartial match: \\x0d\\x0d\\x0d\n\n/.{2,3}?/<CRLF>\n    \\r\\P \nPartial match: \\x0d\n    \\r\\P\\P\nPartial match: \\x0d\n    \\r\\r\\P\n 0: \\x0d\\x0d\n    \\r\\r\\P\\P\nPartial match: \\x0d\\x0d\n    \\r\\r\\r\\P\n 0: \\x0d\\x0d\\x0d\n 1: \\x0d\\x0d\n    \\r\\r\\r\\P\\P     \nPartial match: \\x0d\\x0d\\x0d\n\n/-- Test simple validity check for restarts --/\n\n/abcdef/\n   abc\\R\nError -30 (invalid data in workspace for DFA restart)\n\n/<H((?(?!<H|F>)(.)|(?R))++)*F>/\n    text <H more text <H texting more  hexA0-\"\\xA0\"    hex above 7F-\"\\xBC\" F> text xxxxx <H text F> text F> text2 <H text sample F> more text.\n 0: <H more text <H texting more  hexA0-\"\\xa0\"    hex above 7F-\"\\xbc\" F> text xxxxx <H text F> text F>\n\n/^(?>.{4})abc|^\\w\\w.xabcd/\n    xxxxabcd\n 0: xxxxabcd\n 1: xxxxabc\n    xx\\xa0xabcd \n 0: xx\\xa0xabcd\n 1: xx\\xa0xabc\n\n/^(.{4}){2}+abc|^\\w\\w.x\\w\\w\\w\\wabcd/\n    xxxxxxxxabcd\n 0: xxxxxxxxabcd\n 1: xxxxxxxxabc\n    xx\\xa0xxxxxabcd \n 0: xx\\xa0xxxxxabcd\n 1: xx\\xa0xxxxxabc\n\n/abcd/\n    abcd\\O0\nMatched, but offsets vector is too small to show all matches\n\n/-- These tests show up auto-possessification --/\n\n/[ab]*/\n    aaaa\n 0: aaaa\n    \n/[ab]*?/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n 4: \n    \n/[ab]?/\n    aaaa\n 0: a\n    \n/[ab]??/\n    aaaa\n 0: a\n 1: \n    \n/[ab]+/\n    aaaa\n 0: aaaa\n    \n/[ab]+?/\n    aaaa\n 0: aaaa\n 1: aaa\n 2: aa\n 3: a\n    \n/[ab]{2,3}/\n    aaaa\n 0: aaa\n    \n/[ab]{2,3}?/\n    aaaa\n 0: aaa\n 1: aa\n    \n/[ab]{2,}/\n    aaaa    \n 0: aaaa\n\n/[ab]{2,}?/\n    aaaa    \n 0: aaaa\n 1: aaa\n 2: aa\n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]*+|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n\n'\\A(?:[^\\\"]++|\\\"(?:[^\\\"]++|\\\"\\\")*+\\\")++'\n    NON QUOTED \\\"QUOT\\\"\\\"ED\\\" AFTER \\\"NOT MATCHED\n 0: NON QUOTED \"QUOT\"\"ED\" AFTER \n\n/(?(?!)a|b)/\n    bbb\n 0: b\n    aaa \nNo match\n\n/()()a+/O=\n    aaa\\D\n** Show all captures ignored after DFA matching\n 0: aaa\n 1: aa\n 2: a\n    a\\D\n** Show all captures ignored after DFA matching\n 0: a\n\n/(02-)?[0-9]{3}-[0-9]{3}/\n    02-123-123\n 0: 02-123-123\n\n/-- End of testinput8 --/\n"
  },
  {
    "path": "src/pcre/testdata/testoutput9",
    "content": "/-- This set of tests checks UTF-8 support with the DFA matching functionality\n    of pcre_dfa_exec(), excluding Unicode property support. The -dfa flag must\n    be used with pcretest when running it. --/\n    \n< forbid W \n\n/\\x{100}ab/8\n  \\x{100}ab\n 0: \\x{100}ab\n  \n/a\\x{100}*b/8\n    ab\n 0: ab\n    a\\x{100}b  \n 0: a\\x{100}b\n    a\\x{100}\\x{100}b  \n 0: a\\x{100}\\x{100}b\n    \n/a\\x{100}+b/8\n    a\\x{100}b  \n 0: a\\x{100}b\n    a\\x{100}\\x{100}b  \n 0: a\\x{100}\\x{100}b\n    *** Failers \nNo match\n    ab\nNo match\n     \n/\\bX/8\n    Xoanon\n 0: X\n    +Xoanon\n 0: X\n    \\x{300}Xoanon \n 0: X\n    *** Failers \nNo match\n    YXoanon  \nNo match\n    \n/\\BX/8\n    YXoanon\n 0: X\n    *** Failers\nNo match\n    Xoanon\nNo match\n    +Xoanon    \nNo match\n    \\x{300}Xoanon \nNo match\n\n/X\\b/8\n    X+oanon\n 0: X\n    ZX\\x{300}oanon \n 0: X\n    FAX \n 0: X\n    *** Failers \nNo match\n    Xoanon  \nNo match\n    \n/X\\B/8\n    Xoanon  \n 0: X\n    *** Failers\nNo match\n    X+oanon\nNo match\n    ZX\\x{300}oanon \nNo match\n    FAX \nNo match\n    \n/[^a]/8\n    abcd\n 0: b\n    a\\x{100}   \n 0: \\x{100}\n\n/^[abc\\x{123}\\x{400}-\\x{402}]{2,3}\\d/8\n    ab99\n 0: ab9\n    \\x{123}\\x{123}45\n 0: \\x{123}\\x{123}4\n    \\x{400}\\x{401}\\x{402}6  \n 0: \\x{400}\\x{401}\\x{402}6\n    *** Failers\nNo match\n    d99\nNo match\n    \\x{123}\\x{122}4   \nNo match\n    \\x{400}\\x{403}6  \nNo match\n    \\x{400}\\x{401}\\x{402}\\x{402}6  \nNo match\n\n/a.b/8\n    acb\n 0: acb\n    a\\x7fb\n 0: a\\x{7f}b\n    a\\x{100}b \n 0: a\\x{100}b\n    *** Failers\nNo match\n    a\\nb  \nNo match\n\n/a(.{3})b/8\n    a\\x{4000}xyb \n 0: a\\x{4000}xyb\n    a\\x{4000}\\x7fyb \n 0: a\\x{4000}\\x{7f}yb\n    a\\x{4000}\\x{100}yb \n 0: a\\x{4000}\\x{100}yb\n    *** Failers\nNo match\n    a\\x{4000}b \nNo match\n    ac\\ncb \nNo match\n\n/a(.*?)(.)/\n    a\\xc0\\x88b\n 0: a\\xc0\\x88b\n 1: a\\xc0\\x88\n 2: a\\xc0\n\n/a(.*?)(.)/8\n    a\\x{100}b\n 0: a\\x{100}b\n 1: a\\x{100}\n\n/a(.*)(.)/\n    a\\xc0\\x88b\n 0: a\\xc0\\x88b\n 1: a\\xc0\\x88\n 2: a\\xc0\n\n/a(.*)(.)/8\n    a\\x{100}b\n 0: a\\x{100}b\n 1: a\\x{100}\n\n/a(.)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\\x92\n\n/a(.)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}b\n\n/a(.?)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\\x92\n 1: a\\xc0\n\n/a(.?)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}b\n 1: a\\x{240}\n\n/a(.??)(.)/\n    a\\xc0\\x92bcd\n 0: a\\xc0\\x92\n 1: a\\xc0\n\n/a(.??)(.)/8\n    a\\x{240}bcd\n 0: a\\x{240}b\n 1: a\\x{240}\n\n/a(.{3})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    ac\\ncb \nNo match\n\n/a(.{3,})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n    axxxxbcdefghijb \n 0: axxxxbcdefghijb\n 1: axxxxb\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n\n/a(.{3,}?)b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n    axxxxbcdefghijb \n 0: axxxxbcdefghijb\n 1: axxxxb\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n\n/a(.{3,5})b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n    axxxxbcdefghijb \n 0: axxxxb\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n    axbxxbcdefghijb \n 0: axbxxb\n    axxxxxbcdefghijb \n 0: axxxxxb\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    axxxxxxbcdefghijb \nNo match\n\n/a(.{3,5}?)b/8\n    a\\x{1234}xyb \n 0: a\\x{1234}xyb\n    a\\x{1234}\\x{4321}yb \n 0: a\\x{1234}\\x{4321}yb\n    a\\x{1234}\\x{4321}\\x{3412}b \n 0: a\\x{1234}\\x{4321}\\x{3412}b\n    axxxxbcdefghijb \n 0: axxxxb\n    a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b \n 0: a\\x{1234}\\x{4321}\\x{3412}\\x{3421}b\n    axbxxbcdefghijb \n 0: axbxxb\n    axxxxxbcdefghijb \n 0: axxxxxb\n    *** Failers\nNo match\n    a\\x{1234}b \nNo match\n    axxxxxxbcdefghijb \nNo match\n\n/^[a\\x{c0}]/8\n    *** Failers\nNo match\n    \\x{100}\nNo match\n\n/(?<=aXb)cd/8\n    aXbcd\n 0: cd\n\n/(?<=a\\x{100}b)cd/8\n    a\\x{100}bcd\n 0: cd\n\n/(?<=a\\x{100000}b)cd/8\n    a\\x{100000}bcd\n 0: cd\n    \n/(?:\\x{100}){3}b/8\n    \\x{100}\\x{100}\\x{100}b\n 0: \\x{100}\\x{100}\\x{100}b\n    *** Failers \nNo match\n    \\x{100}\\x{100}b\nNo match\n\n/\\x{ab}/8\n    \\x{ab} \n 0: \\x{ab}\n    \\xc2\\xab\n 0: \\x{ab}\n    *** Failers \nNo match\n    \\x00{ab}\nNo match\n\n/(?<=(.))X/8\n    WXYZ\n 0: X\n    \\x{256}XYZ \n 0: X\n    *** Failers\nNo match\n    XYZ \nNo match\n\n/[^a]+/8g\n    bcd\n 0: bcd\n    \\x{100}aY\\x{256}Z \n 0: \\x{100}\n 0: Y\\x{256}Z\n    \n/^[^a]{2}/8\n    \\x{100}bc\n 0: \\x{100}b\n \n/^[^a]{2,}/8\n    \\x{100}bcAa\n 0: \\x{100}bcA\n\n/^[^a]{2,}?/8\n    \\x{100}bca\n 0: \\x{100}bc\n 1: \\x{100}b\n\n/[^a]+/8ig\n    bcd\n 0: bcd\n    \\x{100}aY\\x{256}Z \n 0: \\x{100}\n 0: Y\\x{256}Z\n    \n/^[^a]{2}/8i\n    \\x{100}bc\n 0: \\x{100}b\n \n/^[^a]{2,}/8i\n    \\x{100}bcAa\n 0: \\x{100}bc\n\n/^[^a]{2,}?/8i\n    \\x{100}bca\n 0: \\x{100}bc\n 1: \\x{100}b\n\n/\\x{100}{0,0}/8\n    abcd\n 0: \n \n/\\x{100}?/8\n    abcd\n 0: \n    \\x{100}\\x{100} \n 0: \\x{100}\n\n/\\x{100}{0,3}/8 \n    \\x{100}\\x{100} \n 0: \\x{100}\\x{100}\n    \\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\n    \n/\\x{100}*/8\n    abce\n 0: \n    \\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{1,1}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\n\n/\\x{100}{1,3}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\n\n/\\x{100}+/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100} \n 0: \\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3}/8\n    abcd\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3,5}/8\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\x{100}{3,}/8O\n    abcd\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}XX\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 1: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 2: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 3: \\x{100}\\x{100}\\x{100}\\x{100}\n 4: \\x{100}\\x{100}\\x{100}\n\n/(?<=a\\x{100}{2}b)X/8\n    Xyyya\\x{100}\\x{100}bXzzz\n 0: X\n\n/\\D*/8O\n  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nMatched, but offsets vector is too small to show all matches\n 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n\n/\\D*/8O\n  \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\nMatched, but offsets vector is too small to show all matches\n 0: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 1: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 2: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 3: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 4: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 5: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 6: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 7: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 8: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n 9: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n10: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n11: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n12: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n13: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n14: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n15: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n16: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n17: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n18: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n19: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n20: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n21: \\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\\x{100}\n\n/\\D/8\n    1X2\n 0: X\n    1\\x{100}2 \n 0: \\x{100}\n  \n/>\\S/8\n    > >X Y\n 0: >X\n    > >\\x{100} Y\n 0: >\\x{100}\n  \n/\\d/8\n    \\x{100}3\n 0: 3\n    \n/\\s/8\n    \\x{100} X\n 0:  \n    \n/\\D+/8\n    12abcd34\n 0: abcd\n    *** Failers\n 0: *** Failers\n    1234  \nNo match\n\n/\\D{2,3}/8\n    12abcd34\n 0: abc\n    12ab34\n 0: ab\n    *** Failers  \n 0: ***\n    1234\nNo match\n    12a34  \nNo match\n\n/\\D{2,3}?/8\n    12abcd34\n 0: abc\n 1: ab\n    12ab34\n 0: ab\n    *** Failers  \n 0: ***\n 1: **\n    1234\nNo match\n    12a34  \nNo match\n\n/\\d+/8\n    12abcd34\n 0: 12\n    *** Failers\nNo match\n\n/\\d{2,3}/8\n    12abcd34\n 0: 12\n    1234abcd\n 0: 123\n    *** Failers  \nNo match\n    1.4 \nNo match\n\n/\\d{2,3}?/8\n    12abcd34\n 0: 12\n    1234abcd\n 0: 123\n 1: 12\n    *** Failers  \nNo match\n    1.4 \nNo match\n\n/\\S+/8\n    12abcd34\n 0: 12abcd34\n    *** Failers\n 0: ***\n    \\    \\ \nNo match\n\n/\\S{2,3}/8\n    12abcd34\n 0: 12a\n    1234abcd\n 0: 123\n    *** Failers\n 0: ***\n    \\     \\  \nNo match\n\n/\\S{2,3}?/8\n    12abcd34\n 0: 12a\n 1: 12\n    1234abcd\n 0: 123\n 1: 12\n    *** Failers\n 0: ***\n 1: **\n    \\     \\  \nNo match\n\n/>\\s+</8\n    12>      <34\n 0: >      <\n    *** Failers\nNo match\n\n/>\\s{2,3}</8\n    ab>  <cd\n 0: >  <\n    ab>   <ce\n 0: >   <\n    *** Failers\nNo match\n    ab>    <cd \nNo match\n\n/>\\s{2,3}?</8\n    ab>  <cd\n 0: >  <\n    ab>   <ce\n 0: >   <\n    *** Failers\nNo match\n    ab>    <cd \nNo match\n\n/\\w+/8\n    12      34\n 0: 12\n    *** Failers\n 0: Failers\n    +++=*! \nNo match\n\n/\\w{2,3}/8\n    ab  cd\n 0: ab\n    abcd ce\n 0: abc\n    *** Failers\n 0: Fai\n    a.b.c\nNo match\n\n/\\w{2,3}?/8\n    ab  cd\n 0: ab\n    abcd ce\n 0: abc\n 1: ab\n    *** Failers\n 0: Fai\n 1: Fa\n    a.b.c\nNo match\n\n/\\W+/8\n    12====34\n 0: ====\n    *** Failers\n 0: *** \n    abcd \nNo match\n\n/\\W{2,3}/8\n    ab====cd\n 0: ===\n    ab==cd\n 0: ==\n    *** Failers\n 0: ***\n    a.b.c\nNo match\n\n/\\W{2,3}?/8\n    ab====cd\n 0: ===\n 1: ==\n    ab==cd\n 0: ==\n    *** Failers\n 0: ***\n 1: **\n    a.b.c\nNo match\n\n/[\\x{100}]/8\n    \\x{100}\n 0: \\x{100}\n    Z\\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[Z\\x{100}]/8\n    Z\\x{100}\n 0: Z\n    \\x{100}\n 0: \\x{100}\n    \\x{100}Z\n 0: \\x{100}\n    *** Failers \nNo match\n\n/[\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   *** Failers  \nNo match\n\n/[\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   *** Failers  \nNo match\n\n/[z-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   abzcd\n 0: z\n   ab|cd  \n 0: |\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[Q\\x{100}-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[Qz-\\x{200}]/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{111}cd \n 0: \\x{111}\n   abzcd\n 0: z\n   ab|cd  \n 0: |\n   Q? \n 0: Q\n   *** Failers  \nNo match\n\n/[\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n   *** Failers  \nNo match\n\n/[\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n 1: \\x{200}\\x{100}\n 2: \\x{200}\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]{1,3}/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n   *** Failers  \nNo match\n\n/[Q\\x{100}\\x{200}]{1,3}?/8\n   ab\\x{100}cd\n 0: \\x{100}\n   ab\\x{200}cd\n 0: \\x{200}\n   ab\\x{200}\\x{100}\\x{200}\\x{100}cd\n 0: \\x{200}\\x{100}\\x{200}\n 1: \\x{200}\\x{100}\n 2: \\x{200}\n   *** Failers  \nNo match\n\n/(?<=[\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n 0: X\n    abc\\x{100}X \n 0: X\n    *** Failers\nNo match\n    X  \nNo match\n\n/(?<=[Q\\x{100}\\x{200}])X/8\n    abc\\x{200}X\n 0: X\n    abc\\x{100}X \n 0: X\n    abQX \n 0: X\n    *** Failers\nNo match\n    X  \nNo match\n\n/(?<=[\\x{100}\\x{200}]{3})X/8\n    abc\\x{100}\\x{200}\\x{100}X\n 0: X\n    *** Failers\nNo match\n    abc\\x{200}X\nNo match\n    X  \nNo match\n\n/[^\\x{100}\\x{200}]X/8\n    AX\n 0: AX\n    \\x{150}X\n 0: \\x{150}X\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{200}X   \nNo match\n\n/[^Q\\x{100}\\x{200}]X/8\n    AX\n 0: AX\n    \\x{150}X\n 0: \\x{150}X\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{200}X   \nNo match\n    QX \nNo match\n\n/[^\\x{100}-\\x{200}]X/8\n    AX\n 0: AX\n    \\x{500}X \n 0: \\x{500}X\n    *** Failers\nNo match\n    \\x{100}X\nNo match\n    \\x{150}X\nNo match\n    \\x{200}X   \nNo match\n\n/[z-\\x{100}]/8i\n    z\n 0: z\n    Z \n 0: Z\n    \\x{100}\n 0: \\x{100}\n    *** Failers\nNo match\n    \\x{102}\nNo match\n    y    \nNo match\n\n/[\\xFF]/\n    >\\xff<\n 0: \\xff\n\n/[\\xff]/8\n    >\\x{ff}<\n 0: \\x{ff}\n\n/[^\\xFF]/\n    XYZ\n 0: X\n\n/[^\\xff]/8\n    XYZ\n 0: X\n    \\x{123} \n 0: \\x{123}\n\n/^[ac]*b/8\n  xb\nNo match\n\n/^[ac\\x{100}]*b/8\n  xb\nNo match\n\n/^[^x]*b/8i\n  xb\nNo match\n\n/^[^x]*b/8\n  xb\nNo match\n  \n/^\\d*b/8\n  xb \nNo match\n\n/(|a)/g8\n    catac\n 0: \n 0: a\n 1: \n 0: \n 0: a\n 1: \n 0: \n 0: \n    a\\x{256}a \n 0: a\n 1: \n 0: \n 0: a\n 1: \n 0: \n\n/^\\x{85}$/8i\n    \\x{85}\n 0: \\x{85}\n\n/^abc./mgx8<any>\n    abc1 \\x0aabc2 \\x0babc3xx \\x0cabc4 \\x0dabc5xx \\x0d\\x0aabc6 \\x{0085}abc7 \\x{2028}abc8 \\x{2029}abc9 JUNK\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n 0: abc8\n 0: abc9\n\n/abc.$/mgx8<any>\n    abc1\\x0a abc2\\x0b abc3\\x0c abc4\\x0d abc5\\x0d\\x0a abc6\\x{0085} abc7\\x{2028} abc8\\x{2029} abc9\n 0: abc1\n 0: abc2\n 0: abc3\n 0: abc4\n 0: abc5\n 0: abc6\n 0: abc7\n 0: abc8\n 0: abc9\n\n/^a\\Rb/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0cb\n 0: a\\x{0c}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\x{2028}b \n 0: a\\x{2028}b\n    a\\x{2029}b \n 0: a\\x{2029}b\n    ** Failers\nNo match\n    a\\n\\rb    \nNo match\n\n/^a\\R*b/8<bsr_unicode>\n    ab\n 0: ab\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0c\\x{2028}\\x{2029}b\n 0: a\\x{0c}\\x{2028}\\x{2029}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\n\\rb    \n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}\\x0cb \n 0: a\\x{0a}\\x{0d}\\x{85}\\x{0c}b\n\n/^a\\R+b/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\rb\n 0: a\\x{0d}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x0bb\n 0: a\\x{0b}b\n    a\\x0c\\x{2028}\\x{2029}b\n 0: a\\x{0c}\\x{2028}\\x{2029}b\n    a\\x{85}b   \n 0: a\\x{85}b\n    a\\n\\rb    \n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}\\x0cb \n 0: a\\x{0a}\\x{0d}\\x{85}\\x{0c}b\n    ** Failers\nNo match\n    ab  \nNo match\n\n/^a\\R{1,3}b/8<bsr_unicode>\n    a\\nb\n 0: a\\x{0a}b\n    a\\n\\rb\n 0: a\\x{0a}\\x{0d}b\n    a\\n\\r\\x{85}b\n 0: a\\x{0a}\\x{0d}\\x{85}b\n    a\\r\\n\\r\\nb \n 0: a\\x{0d}\\x{0a}\\x{0d}\\x{0a}b\n    a\\r\\n\\r\\n\\r\\nb \n 0: a\\x{0d}\\x{0a}\\x{0d}\\x{0a}\\x{0d}\\x{0a}b\n    a\\n\\r\\n\\rb\n 0: a\\x{0a}\\x{0d}\\x{0a}\\x{0d}b\n    a\\n\\n\\r\\nb \n 0: a\\x{0a}\\x{0a}\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\n\\n\\n\\rb\nNo match\n    a\\r\nNo match\n\n/\\h+\\V?\\v{3,4}/8O\n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x{09} \\x{a0}X\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n 1: \\x{09} \\x{a0}X\\x{0a}\\x{0b}\\x{0c}\n\n/\\V?\\v{3,4}/8O \n    \\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: X\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n 1: X\\x{0a}\\x{0b}\\x{0c}\n\n/\\h+\\V?\\v{3,4}/8O\n    >\\x09\\x20\\x{a0}X\\x0a\\x0a\\x0a<\n 0: \\x{09} \\x{a0}X\\x{0a}\\x{0a}\\x{0a}\n\n/\\V?\\v{3,4}/8O\n    >\\x09\\x20\\x{a0}X\\x0a\\x0a\\x0a<\n 0: X\\x{0a}\\x{0a}\\x{0a}\n\n/\\H\\h\\V\\v/8\n    X X\\x0a\n 0: X X\\x{0a}\n    X\\x09X\\x0b\n 0: X\\x{09}X\\x{0b}\n    ** Failers\nNo match\n    \\x{a0} X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/8O \n    \\x09\\x20\\x{a0}X\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x{09} \\x{a0}X\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n 1: \\x{09} \\x{a0}X\\x{0a}\\x{0b}\\x{0c}\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\\x0d\\x0a\n 0: \\x{09} \\x{a0}\\x{0a}\\x{0b}\\x{0c}\\x{0d}\n 1: \\x{09} \\x{a0}\\x{0a}\\x{0b}\\x{0c}\n    \\x09\\x20\\x{a0}\\x0a\\x0b\\x0c\n 0: \\x{09} \\x{a0}\\x{0a}\\x{0b}\\x{0c}\n    ** Failers \nNo match\n    \\x09\\x20\\x{a0}\\x0a\\x0b\nNo match\n     \n/\\H\\h\\V\\v/8\n    \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n 0: \\x{3001}\\x{3000}\\x{2030}\\x{2028}\n    X\\x{180e}X\\x{85}\n 0: X\\x{180e}X\\x{85}\n    ** Failers\nNo match\n    \\x{2009} X\\x0a   \nNo match\n    \n/\\H*\\h+\\V?\\v{3,4}/8O \n    \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x0c\\x0d\\x0a\n 0: \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x{0c}\\x{0d}\n 1: \\x{1680}\\x{180e}\\x{2007}X\\x{2028}\\x{2029}\\x{0c}\n    \\x09\\x{205f}\\x{a0}\\x0a\\x{2029}\\x0c\\x{2028}\\x0a\n 0: \\x{09}\\x{205f}\\x{a0}\\x{0a}\\x{2029}\\x{0c}\\x{2028}\n 1: \\x{09}\\x{205f}\\x{a0}\\x{0a}\\x{2029}\\x{0c}\n    \\x09\\x20\\x{202f}\\x0a\\x0b\\x0c\n 0: \\x{09} \\x{202f}\\x{0a}\\x{0b}\\x{0c}\n    ** Failers \nNo match\n    \\x09\\x{200a}\\x{a0}\\x{2028}\\x0b\nNo match\n     \n/a\\Rb/I8<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\x{85}b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\Rb/I8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x{85}b\n 0: a\\x{85}b\n    a\\x0bb     \n 0: a\\x{0b}b\n    ** Failers \nNo match\n    a\\x{85}b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n    \n/a\\R?b/I8<bsr_anycrlf>\nCapturing subpattern count = 0\nOptions: bsr_anycrlf utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    ** Failers\nNo match\n    a\\x{85}b\nNo match\n    a\\x0bb     \nNo match\n\n/a\\R?b/I8<bsr_unicode>\nCapturing subpattern count = 0\nOptions: bsr_unicode utf\nFirst char = 'a'\nNeed char = 'b'\n    a\\rb\n 0: a\\x{0d}b\n    a\\nb\n 0: a\\x{0a}b\n    a\\r\\nb\n 0: a\\x{0d}\\x{0a}b\n    a\\x{85}b\n 0: a\\x{85}b\n    a\\x0bb     \n 0: a\\x{0b}b\n    ** Failers \nNo match\n    a\\x{85}b\\<bsr_anycrlf>\nNo match\n    a\\x0bb\\<bsr_anycrlf>\nNo match\n \n/X/8f<any> \n    A\\x{1ec5}ABCXYZ\n 0: X\n\n/abcd*/8\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n\n/abcd*/i8\n    xxxxabcd\\P\n 0: abcd\n    xxxxabcd\\P\\P\nPartial match: abcd\n    XXXXABCD\\P\n 0: ABCD\n    XXXXABCD\\P\\P\nPartial match: ABCD\n\n/abc\\d*/8\n    xxxxabc1\\P\n 0: abc1\n    xxxxabc1\\P\\P\nPartial match: abc1\n\n/abc[de]*/8\n    xxxxabcde\\P\n 0: abcde\n    xxxxabcde\\P\\P\nPartial match: abcde\n\n/\\bthe cat\\b/8\n    the cat\\P\n 0: the cat\n    the cat\\P\\P\nPartial match: the cat\n\n/ab\\Cde/8\n    abXde\nError -16 (item unsupported for DFA matching)\n\n/(?<=ab\\Cde)X/8\nFailed: \\C not allowed in lookbehind assertion at offset 10\n\n/./8<CRLF>\n    \\r\\P\n 0: \\x{0d}\n    \\r\\P\\P \nPartial match: \\x{0d}\n  \n/.{2,3}/8<CRLF>\n    \\r\\P \nPartial match: \\x{0d}\n    \\r\\P\\P\nPartial match: \\x{0d}\n    \\r\\r\\P\n 0: \\x{0d}\\x{0d}\n    \\r\\r\\P\\P\nPartial match: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\n 0: \\x{0d}\\x{0d}\\x{0d}\n    \\r\\r\\r\\P\\P     \nPartial match: \\x{0d}\\x{0d}\\x{0d}\n\n/.{2,3}?/8<CRLF>\n    \\r\\P \nPartial match: \\x{0d}\n    \\r\\P\\P\nPartial match: \\x{0d}\n    \\r\\r\\P\n 0: \\x{0d}\\x{0d}\n    \\r\\r\\P\\P\nPartial match: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\n 0: \\x{0d}\\x{0d}\\x{0d}\n 1: \\x{0d}\\x{0d}\n    \\r\\r\\r\\P\\P     \nPartial match: \\x{0d}\\x{0d}\\x{0d}\n\n/[^\\x{100}]/8\n    \\x{100}\\x{101}X\n 0: \\x{101}\n\n/[^\\x{100}]+/8\n    \\x{100}\\x{101}X\n 0: \\x{101}X\n\n/-- End of testinput9 --/ \n"
  },
  {
    "path": "src/pcre/testdata/testoutputEBC",
    "content": "/-- This is a specialized test for checking, when PCRE is compiled with the\nEBCDIC option but in an ASCII environment, that newline and white space\nfunctionality is working. It catches cases where explicit values such as 0x0a\nhave been used instead of names like CHAR_LF. Needless to say, it is not a\ngenuine EBCDIC test! In patterns, alphabetic characters that follow a backslash\nmust be in EBCDIC code. In data, newlines and other spacing characters must be\nin EBCDIC, but can be specified as escapes. --/\n\n/-- Test default newline and variations --/\n\n/^A/m\n    ABC\n 0: A\n    12\\x15ABC\n 0: A\n\n/^A/m<any>\n    12\\x15ABC\n 0: A\n    12\\x0dABC\n 0: A\n    12\\x0d\\x15ABC\n 0: A\n    12\\x25ABC\n 0: A\n\n/^A/m<anycrlf>\n    12\\x15ABC\n 0: A\n    12\\x0dABC\n 0: A\n    12\\x0d\\x15ABC\n 0: A\n    ** Fail\nNo match\n    12\\x25ABC\nNo match\n\n/-- Test \\h --/\n\n/^A\\/\n    A B\n 0: A\\x20\n    A\\x41B\n 0: AA\n\n/-- Test \\H --/\n\n/^A\\/\n    AB\n 0: AB\n    A\\x42B\n 0: AB\n    ** Fail\nNo match\n    A B\nNo match\n    A\\x41B\nNo match\n\n/-- Test \\R --/\n\n/^A\\/\n    A\\x15B\n 0: A\\x15\n    A\\x0dB\n 0: A\\x0d\n    A\\x25B\n 0: A\\x25\n    A\\x0bB\n 0: A\\x0b\n    A\\x0cB\n 0: A\\x0c\n    ** Fail\nNo match\n    A B\nNo match\n\n/-- Test \\v --/\n\n/^A\\/\n    A\\x15B\n 0: A\\x15\n    A\\x0dB\n 0: A\\x0d\n    A\\x25B\n 0: A\\x25\n    A\\x0bB\n 0: A\\x0b\n    A\\x0cB\n 0: A\\x0c\n    ** Fail\nNo match\n    A B\nNo match\n\n/-- Test \\V --/\n\n/^A\\/\n    A B\n 0: A\\x20\n    ** Fail\nNo match\n    A\\x15B\nNo match\n    A\\x0dB\nNo match\n    A\\x25B\nNo match\n    A\\x0bB\nNo match\n    A\\x0cB\nNo match\n    \n/-- For repeated items, use an atomic group so that the output is the same\nfor DFA matching (otherwise it may show multiple matches). --/ \n\n/-- Test \\h+ --/\n\n/^A(?>\\+)/\n    A B\n 0: A\\x20\n\n/-- Test \\H+ --/\n\n/^A(?>\\+)/\n    AB\n 0: AB\n    ** Fail\nNo match\n    A B\nNo match\n\n/-- Test \\R+ --/\n\n/^A(?>\\+)/\n    A\\x15B\n 0: A\\x15\n    A\\x0dB\n 0: A\\x0d\n    A\\x25B\n 0: A\\x25\n    A\\x0bB\n 0: A\\x0b\n    A\\x0cB\n 0: A\\x0c\n    ** Fail\nNo match\n    A B\nNo match\n\n/-- Test \\v+ --/\n\n/^A(?>\\+)/\n    A\\x15B\n 0: A\\x15\n    A\\x0dB\n 0: A\\x0d\n    A\\x25B\n 0: A\\x25\n    A\\x0bB\n 0: A\\x0b\n    A\\x0cB\n 0: A\\x0c\n    ** Fail\nNo match\n    A B\nNo match\n\n/-- Test \\V+ --/\n\n/^A(?>\\+)/\n    A B\n 0: A\\x20B\n    ** Fail\nNo match\n    A\\x15B\nNo match\n    A\\x0dB\nNo match\n    A\\x25B\nNo match\n    A\\x0bB\nNo match\n    A\\x0cB\nNo match\n\n/-- End --/\n"
  },
  {
    "path": "src/pcre/testdata/valgrind-jit.supp",
    "content": "{\n   name\n   Memcheck:Addr16\n   obj:???\n   obj:???\n   obj:???\n}\n\n{\n   name\n   Memcheck:Cond\n   obj:???\n   obj:???\n   obj:???\n}\n"
  },
  {
    "path": "src/pcre/testdata/wintestinput3",
    "content": "/^[\\w]+/\n    *** Failers\n    cole\n\n/^[\\w]+/Lfrench\n    cole\n\n/^[\\w]+/\n    *** Failers\n    cole\n\n/^[\\W]+/\n    cole\n\n/^[\\W]+/Lfrench\n    *** Failers\n    cole\n\n/[\\b]/\n    \\b\n    *** Failers\n    a\n\n/[\\b]/Lfrench\n    \\b\n    *** Failers\n    a\n\n/^\\w+/\n    *** Failers\n    cole\n\n/^\\w+/Lfrench\n    cole\n\n/(.+)\\b(.+)/\n    cole\n\n/(.+)\\b(.+)/Lfrench\n    *** Failers\n    cole\n\n/cole/i\n    cole\n    *** Failers\n    cole\n\n/cole/iLfrench\n    cole\n    cole\n\n/\\w/IS\n\n/\\w/ISLfrench\n\n/^[\\xc8-\\xc9]/iLfrench\n    cole\n    cole\n\n/^[\\xc8-\\xc9]/Lfrench\n    cole\n    *** Failers \n    cole\n\n/\\W+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[\\W]+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[^[:alpha:]]+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/\\w+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[\\w]+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n\n/[[:alpha:]]+/Lfrench\n    >>>\\xaa<<<\n    >>>\\xba<<< \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench \n\n/ End of testinput3 /\n"
  },
  {
    "path": "src/pcre/testdata/wintestoutput3",
    "content": "/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\w]+/Lfrench\n    cole\n 0: cole\n\n/^[\\w]+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^[\\W]+/\n    cole\n 0: \\xc9\n\n/^[\\W]+/Lfrench\n    *** Failers\n 0: *** \n    cole\nNo match\n\n/[\\b]/\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/[\\b]/Lfrench\n    \\b\n 0: \\x08\n    *** Failers\nNo match\n    a\nNo match\n\n/^\\w+/\n    *** Failers\nNo match\n    cole\nNo match\n\n/^\\w+/Lfrench\n    cole\n 0: cole\n\n/(.+)\\b(.+)/\n    cole\n 0: \\xc9cole\n 1: \\xc9\n 2: cole\n\n/(.+)\\b(.+)/Lfrench\n    *** Failers\n 0: *** Failers\n 1: *** \n 2: Failers\n    cole\nNo match\n\n/cole/i\n    cole\n 0: \\xc9cole\n    *** Failers\nNo match\n    cole\nNo match\n\n/cole/iLfrench\n    cole\n 0: cole\n    cole\n 0: cole\n\n/\\w/IS\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n\n/\\w/ISLfrench\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\nSubject length lower bound = 1\nStarting chars: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P \n  Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z \n                                       \n                                       \n    \n\n/^[\\xc8-\\xc9]/iLfrench\n    cole\n 0: \n    cole\n 0: \n\n/^[\\xc8-\\xc9]/Lfrench\n    cole\n 0: \n    *** Failers \nNo match\n    cole\nNo match\n\n/\\W+/Lfrench\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[\\W]+/Lfrench\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/[^[:alpha:]]+/Lfrench\n    >>>\\xaa<<<\n 0: >>>\n    >>>\\xba<<< \n 0: >>>\n\n/\\w+/Lfrench\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[\\w]+/Lfrench\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n\n/[[:alpha:]]+/Lfrench\n    >>>\\xaa<<<\n 0: \n    >>>\\xba<<< \n 0: \n    \n/[[:alpha:]][[:lower:]][[:upper:]]/DZLfrench \n------------------------------------------------------------------\n        Bra\n        [A-Za-z\\x83\\x8a\\x8c\\x8e\\x9a\\x9c\\x9e\\x9f\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff]\n        [a-z\\x83\\x9a\\x9c\\x9e\\xaa\\xb5\\xba\\xdf-\\xf6\\xf8-\\xff]\n        [A-Z\\x8a\\x8c\\x8e\\x9f\\xc0-\\xd6\\xd8-\\xde]\n        Ket\n        End\n------------------------------------------------------------------\nCapturing subpattern count = 0\nNo options\nNo first char\nNo need char\n\n/ End of testinput3 /\n"
  },
  {
    "path": "src/pcre/ucp.h",
    "content": "/*************************************************\n*          Unicode Property Table handler        *\n*************************************************/\n\n#ifndef _UCP_H\n#define _UCP_H\n\n/* This file contains definitions of the property values that are returned by\nthe UCD access macros. New values that are added for new releases of Unicode\nshould always be at the end of each enum, for backwards compatibility.\n\nIMPORTANT: Note also that the specific numeric values of the enums have to be\nthe same as the values that are generated by the maint/MultiStage2.py script,\nwhere the equivalent property descriptive names are listed in vectors.\n\nALSO: The specific values of the first two enums are assumed for the table\ncalled catposstab in pcre_compile.c. */\n\n/* These are the general character categories. */\n\nenum {\n  ucp_C,     /* Other */\n  ucp_L,     /* Letter */\n  ucp_M,     /* Mark */\n  ucp_N,     /* Number */\n  ucp_P,     /* Punctuation */\n  ucp_S,     /* Symbol */\n  ucp_Z      /* Separator */\n};\n\n/* These are the particular character categories. */\n\nenum {\n  ucp_Cc,    /* Control */\n  ucp_Cf,    /* Format */\n  ucp_Cn,    /* Unassigned */\n  ucp_Co,    /* Private use */\n  ucp_Cs,    /* Surrogate */\n  ucp_Ll,    /* Lower case letter */\n  ucp_Lm,    /* Modifier letter */\n  ucp_Lo,    /* Other letter */\n  ucp_Lt,    /* Title case letter */\n  ucp_Lu,    /* Upper case letter */\n  ucp_Mc,    /* Spacing mark */\n  ucp_Me,    /* Enclosing mark */\n  ucp_Mn,    /* Non-spacing mark */\n  ucp_Nd,    /* Decimal number */\n  ucp_Nl,    /* Letter number */\n  ucp_No,    /* Other number */\n  ucp_Pc,    /* Connector punctuation */\n  ucp_Pd,    /* Dash punctuation */\n  ucp_Pe,    /* Close punctuation */\n  ucp_Pf,    /* Final punctuation */\n  ucp_Pi,    /* Initial punctuation */\n  ucp_Po,    /* Other punctuation */\n  ucp_Ps,    /* Open punctuation */\n  ucp_Sc,    /* Currency symbol */\n  ucp_Sk,    /* Modifier symbol */\n  ucp_Sm,    /* Mathematical symbol */\n  ucp_So,    /* Other symbol */\n  ucp_Zl,    /* Line separator */\n  ucp_Zp,    /* Paragraph separator */\n  ucp_Zs     /* Space separator */\n};\n\n/* These are grapheme break properties. Note that the code for processing them\nassumes that the values are less than 16. If more values are added that take\nthe number to 16 or more, the code will have to be rewritten. */\n\nenum {\n  ucp_gbCR,                /*  0 */\n  ucp_gbLF,                /*  1 */\n  ucp_gbControl,           /*  2 */\n  ucp_gbExtend,            /*  3 */\n  ucp_gbPrepend,           /*  4 */\n  ucp_gbSpacingMark,       /*  5 */\n  ucp_gbL,                 /*  6 Hangul syllable type L */\n  ucp_gbV,                 /*  7 Hangul syllable type V */\n  ucp_gbT,                 /*  8 Hangul syllable type T */\n  ucp_gbLV,                /*  9 Hangul syllable type LV */\n  ucp_gbLVT,               /* 10 Hangul syllable type LVT */\n  ucp_gbRegionalIndicator, /* 11 */\n  ucp_gbOther              /* 12 */\n};\n\n/* These are the script identifications. */\n\nenum {\n  ucp_Arabic,\n  ucp_Armenian,\n  ucp_Bengali,\n  ucp_Bopomofo,\n  ucp_Braille,\n  ucp_Buginese,\n  ucp_Buhid,\n  ucp_Canadian_Aboriginal,\n  ucp_Cherokee,\n  ucp_Common,\n  ucp_Coptic,\n  ucp_Cypriot,\n  ucp_Cyrillic,\n  ucp_Deseret,\n  ucp_Devanagari,\n  ucp_Ethiopic,\n  ucp_Georgian,\n  ucp_Glagolitic,\n  ucp_Gothic,\n  ucp_Greek,\n  ucp_Gujarati,\n  ucp_Gurmukhi,\n  ucp_Han,\n  ucp_Hangul,\n  ucp_Hanunoo,\n  ucp_Hebrew,\n  ucp_Hiragana,\n  ucp_Inherited,\n  ucp_Kannada,\n  ucp_Katakana,\n  ucp_Kharoshthi,\n  ucp_Khmer,\n  ucp_Lao,\n  ucp_Latin,\n  ucp_Limbu,\n  ucp_Linear_B,\n  ucp_Malayalam,\n  ucp_Mongolian,\n  ucp_Myanmar,\n  ucp_New_Tai_Lue,\n  ucp_Ogham,\n  ucp_Old_Italic,\n  ucp_Old_Persian,\n  ucp_Oriya,\n  ucp_Osmanya,\n  ucp_Runic,\n  ucp_Shavian,\n  ucp_Sinhala,\n  ucp_Syloti_Nagri,\n  ucp_Syriac,\n  ucp_Tagalog,\n  ucp_Tagbanwa,\n  ucp_Tai_Le,\n  ucp_Tamil,\n  ucp_Telugu,\n  ucp_Thaana,\n  ucp_Thai,\n  ucp_Tibetan,\n  ucp_Tifinagh,\n  ucp_Ugaritic,\n  ucp_Yi,\n  /* New for Unicode 5.0: */\n  ucp_Balinese,\n  ucp_Cuneiform,\n  ucp_Nko,\n  ucp_Phags_Pa,\n  ucp_Phoenician,\n  /* New for Unicode 5.1: */\n  ucp_Carian,\n  ucp_Cham,\n  ucp_Kayah_Li,\n  ucp_Lepcha,\n  ucp_Lycian,\n  ucp_Lydian,\n  ucp_Ol_Chiki,\n  ucp_Rejang,\n  ucp_Saurashtra,\n  ucp_Sundanese,\n  ucp_Vai,\n  /* New for Unicode 5.2: */\n  ucp_Avestan,\n  ucp_Bamum,\n  ucp_Egyptian_Hieroglyphs,\n  ucp_Imperial_Aramaic,\n  ucp_Inscriptional_Pahlavi,\n  ucp_Inscriptional_Parthian,\n  ucp_Javanese,\n  ucp_Kaithi,\n  ucp_Lisu,\n  ucp_Meetei_Mayek,\n  ucp_Old_South_Arabian,\n  ucp_Old_Turkic,\n  ucp_Samaritan,\n  ucp_Tai_Tham,\n  ucp_Tai_Viet,\n  /* New for Unicode 6.0.0: */\n  ucp_Batak,\n  ucp_Brahmi,\n  ucp_Mandaic,\n  /* New for Unicode 6.1.0: */\n  ucp_Chakma,\n  ucp_Meroitic_Cursive,\n  ucp_Meroitic_Hieroglyphs,\n  ucp_Miao,\n  ucp_Sharada,\n  ucp_Sora_Sompeng,\n  ucp_Takri,\n  /* New for Unicode 7.0.0: */\n  ucp_Bassa_Vah,\n  ucp_Caucasian_Albanian,\n  ucp_Duployan,\n  ucp_Elbasan,\n  ucp_Grantha,\n  ucp_Khojki,\n  ucp_Khudawadi,\n  ucp_Linear_A,\n  ucp_Mahajani,\n  ucp_Manichaean,\n  ucp_Mende_Kikakui,\n  ucp_Modi,\n  ucp_Mro,\n  ucp_Nabataean,\n  ucp_Old_North_Arabian,\n  ucp_Old_Permic,\n  ucp_Pahawh_Hmong,\n  ucp_Palmyrene,\n  ucp_Psalter_Pahlavi,\n  ucp_Pau_Cin_Hau,\n  ucp_Siddham,\n  ucp_Tirhuta,\n  ucp_Warang_Citi\n};\n\n#endif\n\n/* End of ucp.h */\n"
  },
  {
    "path": "src/print.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"printfile.h\"\n#include \"print.h\"\n#include \"parse.h\"\n#include \"txt2html.h\"\n#include \"finelink.h\"\n\n#include \"threadprint.h\"\n\n#include \"proto.h\"\n\n#ifdef HAVE_DIRENT_H\n#ifdef __LCC__\n#include \"../lcc/dirent.h\"\n#else\n#include <dirent.h>\n#endif\n#else\n#ifdef __LCC__\n#include <direct.h>\n#else\n#include <sys/dir.h>\n#endif\n#endif\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n/* conditions that say when a message's body may be removed */\n#define REMOVE_MESSAGE(email) (email->is_deleted && set_delete_level != DELETE_LEAVES_TEXT \\\n\t\t\t       && !(email->is_deleted == 2 && set_delete_level == DELETE_LEAVES_EXPIRED_TEXT))\n\nstatic char *indextypename[NO_INDEX];\n\n#ifdef GDBM\n\n#include \"gdbm.h\"\n\n/*\n** store a single message summary to an already open-for-write GDBM index\n**/\n\nint togdbm(void *gp, struct emailinfo *ep)\n{\n  datum key;\n  datum content;\n  char *buf;\n  char *dp;\n  int rval;\n  int num = ep->msgnum;\n  char *name = ep->name;\n  char *email = ep->emailaddr;\n  char *date = ep->datestr;\n  char *msgid = ep->msgid;\n  char *subject = ep->subject;\n  char *inreply = ep->inreplyto;\n  char *fromdate = ep->fromdatestr;\n  char *charset = ep->charset;\n  char *isodate = strsav(secs_to_iso(ep->date));\n  char *isofromdate = strsav(secs_to_iso(ep->fromdate));\n  char *exp_time_str = strsav(ep->exp_time == -1 ? \"\" : secs_to_iso(ep->exp_time));\n  char is_deleted_str[32];\n  trio_snprintf(is_deleted_str, sizeof(is_deleted_str), \"%d\", ep->is_deleted);\n\n  key.dsize = sizeof(num); /* the key is the message number */\n  key.dptr = (char *)&num;\n\n  /* malloc() a string long enough for our data */\n  /* AUDIT biege: trailing \\0 missing */\n  if (!(buf = (char *)calloc((name ? strlen(name) : 0) + (email ? strlen(email) : 0) + (date ? strlen(date) : 0) + (msgid ? strlen(msgid) : 0) + (subject ? strlen(subject) : 0) + (inreply ? strlen(inreply) : 0) + (fromdate ? strlen(fromdate) : 0) + (charset ? strlen(charset) : 0) + (isodate ? strlen(isodate) : 0) + (isofromdate ? strlen(isofromdate) : 0) + strlen(exp_time_str) + strlen(is_deleted_str) + 13, sizeof(char)))) {\n    return -1;\n  }\n\n  strcpy(dp = buf, fromdate ? fromdate : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, date ? date : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, name ? name : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, email ? email : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, subject ? subject : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, msgid ? msgid : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, inreply ? inreply : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, charset ? charset : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, isofromdate ? isofromdate : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, isodate ? isodate : \"\");\n  dp += strlen(dp) + 1;\n  strcpy(dp, exp_time_str);\n  dp += strlen(dp) + 1;\n  strcpy(dp, is_deleted_str);\n  dp += strlen(dp) + 1;\n  content.dsize = dp - buf;\n  content.dptr = buf; /* the value is in this string */\n  rval = gdbm_store((GDBM_FILE) gp, key, content, GDBM_REPLACE);\n  free(buf);\n  free(exp_time_str);\n  free(isodate);\n  free(isofromdate);\n  return !rval;\n\n} /* end togdbm() */\n\n#endif\n\n\n/* Uses threadlist to find the next message after\n * msgnum in the thread containing msgnum.\n * Returns NULL if there are no more messages in \n * the thread.\n */\nstruct emailinfo *nextinthread(int msgnum)\n{\n    struct reply *rp = threadlist;\n\n#ifdef FASTREPLYCODE\n\tfor (rp = threadlist_by_msgnum[msgnum]; (rp != NULL) && (rp->msgnum != msgnum); rp = rp->next) {\n\t;\n    }\n#else\n\tfor (rp = threadlist; (rp != NULL) && (rp->msgnum != msgnum); rp = rp->next) {\n\t;\n    }\n#endif\n\n    if (rp == NULL) {\t\t/* msgnum not found in threadlist */\n\treturn NULL;\n    }\n\n    rp = rp->next;\n\n    if ((rp == NULL) || (rp->frommsgnum == -1)) {\t\n        /*end of thread - no next msg */\n\treturn NULL;\n    }\n    return rp->data;\n}\n\n#if 0\n/*\n** Output a menu line with hyperlinks for table display\n**\n** All parameters are inputs only.  Parameters:\n**   fp       : HTML output file pointer\n**   idx      : Type of page this menu is for.\n**   archives : \"\" or else the URL of more hypermail archives.\n**   currentid: \"\" or else the id of the \"current\" message.\n**   cursub   : \"\" or else the subject of the \"current\" message.\n**   pos      : Called at the top or bottom of the page.\n*/\n\nvoid fprint_menu(FILE *fp, mindex_t idx, char *archives, char *currentid, char *cursub, int pos, struct emailsubdir *subdir)\n{\n    char *ptr;\n    int dlev = (subdir != NULL);\n    int i;\n    int count_l = 0;\n#if DEBUG_HTML\n    printcomment(fp, \"fprint_menu\", \"begin\");\n#endif\n\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table border=\\\"2\\\" width=\\\"100%%\\\" class=\\\"links\\\">\\n<tr>\\n\");\n\n    if (set_mailcommand) {\n\tif (set_hmail) {\n\t\t\tptr = makemailcommand(set_newmsg_command, set_hmail, currentid, cursub);\n\t\t\tif (strcmp(ptr, \"NONE\") != 0)\n\t\t\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", ptr ? ptr : \"\", lang[MSG_NEW_MESSAGE]);\n\t    if (ptr)\n\t\tfree(ptr);\n\n\t\t\tif ((currentid != NULL && currentid[0] != '\\0') || (cursub != NULL && cursub[0] != '\\0')) {\n\n\t\t\t\tptr = makemailcommand(set_replymsg_command, set_hmail, currentid, cursub);\n\t\t\t\tif (strcmp(ptr, \"NONE\") != 0)\n\t\t\t\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", ptr ? ptr : \"\", lang[MSG_REPLY]);\n\t\tif (ptr)\n\t\t    free(ptr);\n\t    }\n\t}\n    }\n\n    if (set_about && *set_about)\n\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", set_about, lang[MSG_ABOUT_THIS_LIST]);\n\n    if (set_show_index_links && set_show_index_links != (pos == PAGE_TOP ? 4 : 3)) {\n        if (idx != NO_INDEX && !set_reverse) {\n\t    if (pos == PAGE_TOP)\n\t\t\t\tfprintf(fp, \"<th><a href=\\\"#end\\\">%s</a></th>\\n\", lang[MSG_END_OF_MESSAGES]);\n\t    else\n\t\t\t\tfprintf(fp, \"<th><a name=\\\"end\\\" href=\\\"#\\\">%s</a></th>\\n\", lang[MSG_START_OF_MESSAGES]);\n\t}\n\n\tfor (i = 0; i <= AUTHOR_INDEX; ++i) {\n\t    if (idx != i && show_index[dlev][i]) {\n\t\t\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", index_name[dlev][i], lang[MSG_DATE_VIEW + i]);\n\t\t++count_l;\n\t    }\n\t}\n\n\tif (show_index[dlev][ATTACHMENT_INDEX]) {\n\t    if (idx != ATTACHMENT_INDEX) {\n\t\t\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", index_name[dlev][ATTACHMENT_INDEX], lang[MSG_ATTACHMENT_VIEW]);\n\t\t++count_l;\n\t    }\n\t}\n\tif (subdir && idx != NO_INDEX) {\n\t    int f_cols = (subdir->prior_subdir != NULL)\n\t      + (subdir->next_subdir != NULL);\n\t\t\tconst char *colspan = 2 * f_cols <= count_l ? \" colspan=\\\"2\\\"\" : \"\";\n\t    fprintf(fp, \"</tr><tr>\");\n\t    if (subdir->prior_subdir)\n\t\t\t\tfprintf(fp, \"<th%s><a href=\\\"%s%s%s\\\">%s, %s</a></th>\", colspan, subdir->rel_path_to_top, subdir->prior_subdir->subdir, index_name[dlev][idx], lang[MSG_PREV_DIRECTORY], lang[MSG_DATE_VIEW + idx]);\n\t    if (subdir->next_subdir)\n\t\t\t\tfprintf(fp, \"<th%s><a href=\\\"%s%s%s\\\">%s, %s</a></th>\", colspan, subdir->rel_path_to_top, subdir->next_subdir->subdir, index_name[dlev][idx], lang[MSG_NEXT_DIRECTORY], lang[MSG_DATE_VIEW + idx]);\n\t    if (show_index[0][FOLDERS_INDEX])\n\t\t\t\tfprintf(fp, \"<th><a href=\\\"%s%s\\\">%s</a></th>\", subdir->rel_path_to_top, index_name[0][FOLDERS_INDEX], lang[MSG_FOLDERS_INDEX]);\n\t}\n    }\n\n    if (archives && *archives)\n\t\tfprintf(fp, \"<th><a href=\\\"%s\\\">%s</a></th>\\n\", archives, lang[MSG_OTHER_MAIL_ARCHIVES]);\n\n    fprintf(fp, \"</tr>\\n</table>\\n</div>\\n\");\n#if DEBUG_HTML\n    printcomment(fp, \"fprint_menu\", \"end\");\n#endif\n}\n\n#endif\n\n/* non-tables version of fprint_menu */\n\nvoid fprint_menu0(FILE *fp, struct emailinfo *email, int pos)\n{\n  int dlev = (email->subdir != NULL);\n  int num = email->msgnum;\n  int loc_cmp = (pos == PAGE_BOTTOM ? 3 : 4);\n  char *ptr;\n  char *id= (pos == PAGE_TOP) ? \"options2\" : \"options3\";\n\n#ifdef HAVE_ICONV\n  size_t tmplen;\n  char *tmpptr=i18n_convstring(email->subject,\"UTF-8\",email->charset,&tmplen);\n#endif\n\n  if (!(set_show_msg_links && set_show_msg_links != loc_cmp)\n      || (set_show_index_links && set_show_index_links != loc_cmp)) {\n    fprintf(fp, \"<ul class=\\\"links\\\">\\n\");\n  }\n\n  if (set_mailcommand && set_hmail) {\n    fprintf(fp, \"<li><a name=\\\"%s\\\" id=\\\"%s\\\"></a><dfn>%s</dfn>:\", \n\t    id,id,lang[MSG_MAIL_ACTIONS]);\n    if ((email->msgid && email->msgid[0]) || (email->subject && email->subject[0])) {\n#ifdef HAVE_ICONV\n      ptr = makemailcommand(set_replymsg_command, set_hmail, email->msgid, tmpptr);\n#else\n      ptr = makemailcommand(set_replymsg_command, set_hmail, email->msgid, email->subject);\n#endif\n      fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", ptr ? ptr : \"\", lang[MSG_MA_REPLY]);\n      if (ptr)\n\tfree(ptr);\n    }\n#ifdef HAVE_ICONV\n    ptr = makemailcommand(set_newmsg_command, set_hmail, email->msgid, tmpptr);\n#else\n    ptr = makemailcommand(set_newmsg_command, set_hmail, email->msgid, email->subject);\n#endif\n    fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", ptr ? ptr : \"\", lang[MSG_MA_NEW_MESSAGE]);\n    if (ptr)\n      free(ptr);\n    fprintf (fp, \"</li>\\n\");\n  }\n\n  if (set_show_index_links && set_show_index_links != loc_cmp) {\n    fprintf (fp, \"<li>\");\n    /* add the anchor if we didn't do so in the above block */\n    if (!(set_mailcommand && set_hmail))\n      fprintf (fp, \"<a name=\\\"%s\\\" id=\\\"%s\\\"></a>\",id,id);\n    fprintf(fp, \"<dfn>%s</dfn>:\", lang[MSG_CONTEMPORARY_MSGS_SORTED]);\n    if (show_index[dlev][DATE_INDEX])\n      fprintf(fp, \" [ <a href=\\\"%s#%s%d\\\" title=\\\"%s\\\">%s</a> ]\", \n\t      index_name[dlev][DATE_INDEX], set_fragment_prefix, num, \n\t      lang[MSG_LTITLE_BY_DATE], lang[MSG_BY_DATE]);\n    if (show_index[dlev][THREAD_INDEX])\n      fprintf(fp, \" [ <a href=\\\"%s#%s%d\\\" title=\\\"%s\\\">%s</a> ]\",\n\t      index_name[dlev][THREAD_INDEX], set_fragment_prefix, num, \n\t      lang[MSG_LTITLE_BY_THREAD], lang[MSG_BY_THREAD]);\n    if (show_index[dlev][SUBJECT_INDEX])\n      fprintf(fp, \" [ <a href=\\\"%s#%s%d\\\" title=\\\"%s\\\">%s</a> ]\", \n\t      index_name[dlev][SUBJECT_INDEX], set_fragment_prefix, num, \n\t      lang[MSG_LTITLE_BY_SUBJECT], lang[MSG_BY_SUBJECT]);\n    if (show_index[dlev][AUTHOR_INDEX])\n      fprintf(fp, \" [ <a href=\\\"%s#%s%d\\\" title=\\\"%s\\\">%s</a> ]\", \n\t      index_name[dlev][AUTHOR_INDEX], set_fragment_prefix, num, \n\t      lang[MSG_LTITLE_BY_AUTHOR], lang[MSG_BY_AUTHOR]);\n    if (show_index[dlev][ATTACHMENT_INDEX])\n      fprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\", \n\t      index_name[dlev][ATTACHMENT_INDEX], \n\t      lang[MSG_LTITLE_BY_ATTACHMENT], lang[MSG_BY_ATTACHMENT]);\n    fprintf (fp, \"</li>\\n\");\n    if (ihtmlhelpupfile)\n      fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\", lang[MSG_HELP], ihtmlhelpupfile);\n  }\n  \n  if (set_custom_archives && *set_custom_archives)\n    fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\\n\", lang[MSG_OTHER_MAIL_ARCHIVES], set_custom_archives);\n\n  if (!(set_show_msg_links && set_show_msg_links != loc_cmp)\n      || (set_show_index_links && set_show_index_links != loc_cmp)) {\n    fprintf (fp,\"</ul>\\n\");\n  }\n\n#ifdef HAVE_ICONV\n  if(tmpptr)\n    free(tmpptr);\n#endif\n}\n\n/*----------------------------------------------------------------------------*/\n#if 0\n\nvoid fprint_summary(FILE *fp, int pos, long first_d, long last_d, int num)\n{\n#if DEBUG_HTML\n    printcomment(fp, \"fprint_summary\", \"begin\");\n#endif\n    fprintf(fp, \"<div class=\\\"center\\\">\\n\");\n    fprintf(fp, \"<table>\\n\");\n\n    if (pos == PAGE_TOP) {\n\t\tfprintf(fp, \"<tr>\\n<th colspan=\\\"4\\\">%d %s</th>\\n</tr>\\n\", num, lang[MSG_MESSAGES]);\n\t\tfprintf(fp, \"<tr>\\n  <th>%s:</th><td><em>%s</em></td>\\n\", lang[MSG_STARTING], getdatestr(first_d));\n\t\tfprintf(fp, \"  <th>%s:</th><td><em>%s</em></td>\\n</tr>\\n\", lang[MSG_ENDING], getdatestr(last_d));\n    }\n    else { /* bottom of page */\n\t\tfprintf(fp, \"<tr><th><a name=\\\"end\\\">%s: </a></th><td><em>%s</em></td>\\n\", lang[MSG_LAST_MESSAGE_DATE], getdatestr(last_d));\n\t\tfprintf(fp, \"<th>%s: </th><td><em>%s</em></td>\\n\", lang[MSG_ARCHIVED_ON], getlocaltime());\n    }\n    fprintf(fp, \"</table>\\n</div>\\n\");\n#if DEBUG_HTML\n    printcomment(fp, \"fprint_summary\", \"end\");\n#endif\n}\n\n#endif\n\n/*----------------------------------------------------------------------------*/\n\nvoid print_index_header_links (FILE *fp, mindex_t called_from, long startdatenum, long enddatenum, int amountmsgs, struct emailsubdir *subdir)\n{\n    /* \n     * Print out the links for\n     * \n     *      About this archive \n     *      Other mail archives \n     *      Most recent messages \n     *      Messages sorted by: [ date ][ subject ][ author ] \n     *\n     * as appropriate.\n     */\n    char *ptr;\n    int dlev = (subdir != NULL);\n\n#if DEBUG_HTML\n    printcomment(fp, \"index_header_links\", \"begin\");\n#endif\n\n\n    fprintf(fp, \"<map title=\\\"%s\\\" id=\\\"navbar\\\" name=\\\"navbar\\\">\\n\", lang[MSG_NAVBAR]);\n    fprintf(fp, \"<ul>\\n\");\n    /*\n     * Printout the Dates for the Starting and Ending messages \n     * in the archive, along with a count of the messages.\n     */\n\n    if ((called_from != AUTHOR_INDEX && show_index[dlev][AUTHOR_INDEX]) \n\t|| (called_from != DATE_INDEX && show_index[dlev][DATE_INDEX]) \n\t|| (called_from != THREAD_INDEX && show_index[dlev][THREAD_INDEX]) \n\t|| (called_from != SUBJECT_INDEX && show_index[dlev][SUBJECT_INDEX])) {\n      fprintf(fp, \"<li><dfn><a href=\\\"#first\\\" title=\\\"jump to messages list\\\" \"\n\t      \"tabindex=\\\"1\\\">%d %s</a></dfn>:\"\n\t      \" <dfn>%s</dfn> %s,\",\n\t      amountmsgs, lang[MSG_ARTICLES],\n\t      lang[MSG_STARTING], getdatestr(startdatenum));\n      fprintf(fp, \" <dfn>%s</dfn> %s</li>\\n\",\n\t      lang[MSG_ENDING], getdatestr(enddatenum));\n\n      if (!set_reverse && (called_from != AUTHOR_INDEX && called_from != SUBJECT_INDEX))\n\tfprintf (fp, \"<li><dfn>%s</dfn>: <a href=\\\"#end\\\">%s</a></li>\\n\", lang[MSG_THIS_PERIOD],\n\t\t lang[MSG_MOST_RECENT_MESSAGES]);\n\n      fprintf (fp, \"<li><dfn>%s</dfn>:\", lang[MSG_SORT_BY]);\n    }\n\n    /* print the links to the other indexes */\n    if (show_index[dlev][THREAD_INDEX]) {\n      if (called_from != THREAD_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\" accesskey=\\\"t\\\" rel=\\\"alternate\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][THREAD_INDEX], lang[MSG_LTITLE_BY_THREAD], lang[MSG_THREAD]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_THREAD]);\n    }\n\n    if (show_index[dlev][AUTHOR_INDEX]) {\n      if (called_from != AUTHOR_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\" accesskey=\\\"a\\\" rel=\\\"alternate\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][AUTHOR_INDEX], lang[MSG_LTITLE_BY_AUTHOR], lang[MSG_AUTHOR]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_AUTHOR]);\n    }\n\n    if (show_index[dlev][DATE_INDEX]) {\n      if (called_from != DATE_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\" accesskey=\\\"d\\\" rel=\\\"alternate\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][DATE_INDEX], lang[MSG_LTITLE_BY_DATE], lang[MSG_DATE]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_DATE]);\n    }\n\n    if (show_index[dlev][SUBJECT_INDEX]) {\n      if (called_from != SUBJECT_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\" accesskey=\\\"s\\\" rel=\\\"alternate\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][SUBJECT_INDEX],  lang[MSG_LTITLE_BY_SUBJECT], lang[MSG_SUBJECT]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_SUBJECT]);\n    }\n\n    if (set_attachmentsindex) {\n      if (called_from != ATTACHMENT_INDEX) {\n      fprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\" accesskey=\\\"a\\\" rel=\\\"alternate\\\">%s</a> ]\\n\", \n\t      index_name[dlev][ATTACHMENT_INDEX],  lang[MSG_LTITLE_BY_ATTACHMENT],\n\t      lang[MSG_ATTACHMENT]);\n      }\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_ATTACHMENT]);\n    }\n    fprintf (fp, \"</li>\\n\");\n\n    /* print the mail actions */\n    if (set_mailcommand && set_hmail) {\n      ptr = makemailcommand(\"mailto:$TO\", set_hmail, \"\", \"\");\n      fprintf (fp, \"<li><dfn>%s</dfn>: [ <a href=\\\"%s\\\" accesskey=\\\"n\\\">%s</a> ]</li>\\n\",\n\t       lang[MSG_MAIL_ACTIONS], ptr ? ptr : \"\", lang[MSG_MA_NEW_MESSAGE]);\n      if (ptr)\n\tfree (ptr);\n    }\n\n    if (subdir) {\n      fprintf(fp, \"<li><dfn>%s</dfn>:\", lang[MSG_OTHER_PERIODS]);\n      if (subdir->prior_subdir)\n\tfprintf(fp, \"[ <a href=\\\"%s%s%s\\\" title=\\\"%s\\\">%s, %s</a> ] \", \n\t\tsubdir->rel_path_to_top, subdir->prior_subdir->subdir, \n\t\tindex_name[dlev][called_from], \n\t\tlang[MSG_LTITLE_PREVPERIOD], lang[MSG_PREVPERIOD], \n\t\tlang[MSG_DATE_VIEW + called_from]);\n      if (subdir->next_subdir)\n\tfprintf(fp, \"[ <a href=\\\"%s%s%s\\\" title=\\\"%s\\\">%s, %s</a> ] \", subdir->rel_path_to_top, \n\t\tsubdir->next_subdir->subdir, index_name[dlev][called_from], \n\t\tlang[MSG_LTITLE_NEXTPERIOD], lang[MSG_NEXTPERIOD], \n\t\tlang[MSG_DATE_VIEW + called_from]);\n      if (show_index[0][FOLDERS_INDEX])\n\tfprintf(fp, \"[ <a href=\\\"%s%s\\\" title=\\\"%s\\\">%s</a> ]\", subdir->rel_path_to_top, \n\t\tindex_name[0][FOLDERS_INDEX], lang[MSG_LTITLE_FOLDERS_INDEX], \n\t\tlang[MSG_FOLDERS_INDEX]);\n      fprintf (fp, \"</li>\\n\");\n    }\n    \n    /* the following are the custom options */\n    if (ihtmlhelpupfile)\n      fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\", lang[MSG_HELP], ihtmlhelpupfile);     \n\n    if ((set_about && *set_about) \n\t|| (set_archives && *set_archives))\n      {\n\tfprintf (fp, \"<li><dfn>%s</dfn>:\", lang[MSG_NEARBY]);\n\tif (set_about && *set_about)\n\t  fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", set_about, lang[MSG_ABOUT_THIS_ARCHIVE]);\n\t\n\tif (set_archives && *set_archives)\n\t  fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", set_archives, lang[MSG_OTHER_MAIL_ARCHIVES]);\n\tfprintf (fp, \"</li>\\n\");\n\n      }\n\n    if (set_custom_archives && *set_custom_archives)\n      fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\\n\", lang[MSG_OTHER_MAIL_ARCHIVES], \n\t      set_custom_archives);\n\n    fprintf (fp, \"</ul>\\n</map>\\n\");\n\n    /*\n     * Printout the Dates for the Starting and Ending messages \n     * in the archive, along with a count of the messages.\n     */\n \n#if DEBUG_HTML\n    printcomment(fp, \"index_header_links\", \"end\");\n#endif\n}\n\nvoid print_index_footer_links(FILE *fp, mindex_t called_from, long enddatenum, int amountmsgs, struct emailsubdir *subdir)\n{\n    /* \n     * Print out the links for\n     * \n     *      Messages sorted by: [ date ][ subject ][ author ] \n     *      Other mail archives \n     *\n     * as appropriate.\n     */\n     char *ptr;\n     int dlev = (subdir != NULL);\n\n#if DEBUG_HTML\n    printcomment(fp, \"index_footer_links\", \"begin\");\n#endif\n\n    fprintf (fp, \"<div class=\\\"foot\\\">\\n\");\n    fprintf (fp, \"<map title=\\\"%s\\\" id=\\\"navbarfoot\\\" name=\\\"navbarfoot\\\">\\n\", lang[MSG_NAVBAR]);\n    fprintf (fp, \"<ul>\\n\");\n    \n    if ((called_from != AUTHOR_INDEX && show_index[dlev][AUTHOR_INDEX]) \n\t|| (called_from != DATE_INDEX && show_index[dlev][DATE_INDEX]) \n\t|| (called_from != THREAD_INDEX && show_index[dlev][THREAD_INDEX]) \n\t|| (called_from != SUBJECT_INDEX && show_index[dlev][SUBJECT_INDEX]))\n      fprintf(fp, \"<li><dfn><a href=\\\"#first\\\">%d %s</a> \"\n\t      \"%s</dfn>:\\n\",\n\t      amountmsgs, lang[MSG_ARTICLES],\n\t      lang[MSG_SORT_BY]);\n\n        /* print the links to the other indexes */\n    if (show_index[dlev][THREAD_INDEX]) {\n      if (called_from != THREAD_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][THREAD_INDEX], lang[MSG_LTITLE_BY_THREAD], lang[MSG_THREAD]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_THREAD]);\n    }\n\n    if (show_index[dlev][AUTHOR_INDEX]) {\n      if (called_from != AUTHOR_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][AUTHOR_INDEX], lang[MSG_LTITLE_BY_AUTHOR], lang[MSG_AUTHOR]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_AUTHOR]);\n    }\n\n    if (show_index[dlev][DATE_INDEX]) {\n      if (called_from != DATE_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][DATE_INDEX], lang[MSG_LTITLE_BY_DATE], lang[MSG_DATE]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_DATE]);\n    }\n\n    if (show_index[dlev][SUBJECT_INDEX]) {\n      if (called_from != SUBJECT_INDEX)\n\tfprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\\n\", \n\t\tindex_name[dlev][SUBJECT_INDEX], lang[MSG_LTITLE_BY_SUBJECT], lang[MSG_SUBJECT]);\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_SUBJECT]);\n    }\n\n    if (set_attachmentsindex) {\n      if (called_from != ATTACHMENT_INDEX) {\n      fprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s\\\">%s</a> ]\\n\", \n\t      index_name[dlev][ATTACHMENT_INDEX], lang[MSG_LTITLE_BY_ATTACHMENT], \n\t      lang[MSG_ATTACHMENT]);\n      }\n      else\n\tfprintf(fp, \" [ %s ]\\n\", lang[MSG_ATTACHMENT]);\n    }\n    fprintf (fp, \"</li>\\n\");\n\n    /* print the mail actions */\n    if (set_mailcommand && set_hmail) {\n      ptr = makemailcommand(\"mailto:$TO\", set_hmail, \"\", \"\");\n      fprintf (fp, \"<li><dfn>%s</dfn>: [ <a href=\\\"%s\\\">%s</a> ]</li>\\n\",\n\t       lang[MSG_MAIL_ACTIONS], ptr ? ptr : \"\", lang[MSG_MA_NEW_MESSAGE]);\n      if (ptr)\n\tfree (ptr);\n    }\n\n    if (subdir) {\n      fprintf(fp, \"<li><dfn>%s</dfn>:\", lang[MSG_OTHER_PERIODS]);\n      if (subdir->prior_subdir)\n\tfprintf(fp, \"[ <a href=\\\"%s%s%s\\\" title=\\\"%s\\\">%s, %s</a> ] \", \n\t\tsubdir->rel_path_to_top, subdir->prior_subdir->subdir, \n\t\tindex_name[dlev][called_from], \n\t\tlang[MSG_LTITLE_PREVPERIOD], lang[MSG_PREVPERIOD], \n\t\tlang[MSG_DATE_VIEW + called_from]);\n      if (subdir->next_subdir)\n\tfprintf(fp, \"[ <a href=\\\"%s%s%s\\\" title=\\\"%s\\\">%s, %s</a> ] \", subdir->rel_path_to_top, \n\t\tsubdir->next_subdir->subdir, index_name[dlev][called_from], \n\t\tlang[MSG_LTITLE_NEXTPERIOD], lang[MSG_NEXTPERIOD], \n\t\tlang[MSG_DATE_VIEW + called_from]);\n      if (show_index[0][FOLDERS_INDEX])\n\tfprintf(fp, \"[ <a href=\\\"%s%s\\\" title=\\\"%s\\\">%s</a> ]\", subdir->rel_path_to_top, \n\t\tindex_name[0][FOLDERS_INDEX], lang[MSG_LTITLE_FOLDERS_INDEX], \n\t\tlang[MSG_FOLDERS_INDEX]);\n      fprintf (fp, \"</li>\\n\");\n    }\n    \n    if (ihtmlhelplowfile)\n      fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\", lang[MSG_HELP], ihtmlhelplowfile);     \n\n    if ((set_about && *set_about) \n\t|| (set_archives && *set_archives))\n      {\n\tfprintf (fp, \"<li><dfn>%s</dfn>:\", lang[MSG_NEARBY]);\n\tif (set_about && *set_about)\n\t  fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", set_about, lang[MSG_ABOUT_THIS_ARCHIVE]);\n\tif (set_archives && *set_archives)\n\t  fprintf(fp, \" [ <a href=\\\"%s\\\">%s</a> ]\", set_archives, lang[MSG_OTHER_MAIL_ARCHIVES]);\n\tfprintf (fp, \"</li>\\n\");\n      }\n\n    if (set_custom_archives && *set_custom_archives)\n      fprintf(fp, \"<li><dfn>%s</dfn>: %s</li>\\n\", lang[MSG_OTHER_MAIL_ARCHIVES], \n\t      set_custom_archives);\n    \n    fprintf (fp, \"</ul>\\n</map>\\n\");\n\n#if DEBUG_HTML\n    printcomment(fp, \"index_footer_links\", \"end\");\n#endif\n}\n\n/*----------------------------------------------------------------------------*/\n\nvoid print_haof_indices(FILE *fp, struct emailsubdir *subdir)\n{\n    int dlev = (subdir != NULL);\n\n    fprintf(fp, \"    <indices>\\n\");\n\n    if (show_index[dlev][DATE_INDEX])\n\t\tfprintf(fp, \"       <dateindex>%s</dateindex>\\n\", index_name[dlev][DATE_INDEX]);\n\n    if (show_index[dlev][SUBJECT_INDEX])\n\t\tfprintf(fp, \"       <subjectindex>%s</subjectindex>\\n\", index_name[dlev][SUBJECT_INDEX]);\n\n    if (show_index[dlev][THREAD_INDEX])\n\t\tfprintf(fp, \"       <threadindex>%s</threadindex>\\n\", index_name[dlev][THREAD_INDEX]);\n\n    if (show_index[dlev][AUTHOR_INDEX])\n\t\tfprintf(fp, \"       <authorindex>%s</authorindex>\\n\", index_name[dlev][AUTHOR_INDEX]);\n\n    if (show_index[dlev][ATTACHMENT_INDEX])\n\t\tfprintf(fp, \"       <attachmentindex>%s</attachmentindex>\\n\", index_name[dlev][ATTACHMENT_INDEX]);\n\n    fprintf(fp, \"    </indices>\\n\\n\");\n}\n\n/*\n** Prints a comment in the file.\n*/\n\nvoid printcomment(FILE *fp, char *label, char *value)\n{\n    if (label && *label && value && *value) {\n\t/* we only save the non-NULL ones */\n        char *ext_label;\n        char *ext_value;\n\tchar *ptr;\n\n\t/* It's illegal in a comment to have a value which has a -- sequence */\n\tif (strstr (label, \"--\"))\n\t  ext_label = convdash (label);\n\telse\n\t  ext_label = label;\n\tif (strstr (value, \"--\"))\n\t  ext_value = convdash (value);\n\telse\n\t  ext_value = value;\n\n\tptr = strchr(ext_value, '@');\n\tif (set_spamprotect_id && ptr && (!strcmp(label, \"id\")\n\t\t\t\t       || !strcmp(label, \"inreplyto\"))) {\n\t    struct Push retbuf;\n\t    INIT_PUSH(retbuf);\n\t    PushNString(&retbuf, ext_value, ptr - ext_value);\n\t    PushNString(&retbuf, set_antispam_at, strlen(set_antispam_at));\n\t    PushString(&retbuf, ptr + 1);\n\t    if (ext_value != value)\n\t      free (ext_value);\n\t    ext_value = PUSH_STRING(retbuf);\n\t}\n\t\n\tfprintf(fp, \"<!-- %s=\\\"%s\\\" -->\\n\", ext_label, ext_value);\n\tif (ext_label != label)\n\t    free(ext_label);\n\tif (ext_value != value)\n\t    free(ext_value);\n    }\n}\n\n/*\n** Prints a line of HTML. Used to filter off unwanted tags from the output.\n*/\n\nvoid printhtml(FILE *fp, char *line)\n{\n    /* the banned tags ignore all of them that begin exactly like \"<tag\" or\n       \"</tag\" (case insensitive). Any other letters within the tags destroy\n       this filter capability. */\n\n    char *banned_tags[] = { \"html>\" };\t/* ending >-letter must be included */\n    unsigned int i;\n    int lindex;\n\n    while (*line) {\n\tif ('<' != *line)\n\t    fputc(*line++, fp);\n\telse {\n\t    if ('/' == line[1])\n\t\tlindex = 2;\n\t    else\n\t\tlindex = 1;\n\t\t\tfor (i = 0; i < sizeof(banned_tags) / sizeof(banned_tags[0]); i++) {\n\t\t\t\tif (!strncasecmp(&line[lindex], banned_tags[i], strlen(banned_tags[i]))) {\n\t\t    line += strlen(banned_tags[i]) + lindex;\n\t\t    break;\n\t\t}\n\t    }\n\t    if (sizeof(banned_tags) / sizeof(banned_tags[0]) == i) {\n\t\tfputc(*line++, fp);\n\t\tif (2 == lindex)\n\t\t    fputc(*line++, fp);\n\t    }\n\t}\n    }\n\n}\n\n/*\n** Pretty-prints the dates in the index files.\n*/\nvoid printdates(FILE *fp, struct header *hp, int year, int month, struct emailinfo *subdir_email,\n\t\tchar *prev_date_str)\n{\n  char *subject=NULL,*name=NULL;\n  const char *startline;\n  const char *break_str;\n  const char *endline;\n  const char *subj_tag;\n  const char *subj_end_tag;\n  static char date_str[DATESTRLEN+40]; /* made static for smaller stack */\n  static char *first_attributes = \"<a  accesskey=\\\"j\\\" name=\\\"first\\\" id=\\\"first\\\"></a>\";\n\n  if (hp != NULL) {\n    struct emailinfo *em=hp->data;\n    printdates(fp, hp->left, year, month, subdir_email, prev_date_str);\n    if ((year == -1 || year_of_datenum(em->date) == year)\n\t&& (month == -1 || month_of_datenum(em->date) == month)\n\t&& !em->is_deleted\n\t&& (!subdir_email || subdir_email->subdir == em->subdir)) {\n\n#ifdef HAVE_ICONV\n      subject = convchars(em->subject, \"utf-8\");\n      name = convchars(em->name, \"utf-8\");\n#else\n      subject = convchars(em->subject, em->charset);\n      name = convchars(em->name, em->charset);\n#endif\n      \n      if(set_indextable) {\n\tstartline = \"<tr><td>\";\n\tbreak_str = \"</td><td nowrap>\";\n\tstrcpy(date_str, getdateindexdatestr(hp->data->date));\n\tendline = \"</td></tr>\";\n\tsubj_tag = \"\";\n\tsubj_end_tag = \"\";\n      }\n      else {\n\tchar *tmp;\n\tbool is_first;\n\ttmp = getdateindexdatestr(hp->data->date);\n\tif (strcmp (prev_date_str, tmp)) {\n\t  if (*prev_date_str)  { /* close the previous date item */\n\t    fprintf (fp, \"</ul></li>\\n\");\n\t    is_first = FALSE;\n\t  }\n\t  else\n\t    is_first = TRUE;\n\t  snprintf(date_str, sizeof(date_str), \"<li>%s<dfn>%s</dfn><ul>\\n\", \n\t\t  (is_first) ? first_attributes : \"\", tmp);\n\t  fprintf (fp, \"%s\", date_str);\n\t  strcpy (prev_date_str, tmp);\n\t}\n\tdate_str[0] = 0;\n\tstartline = \"<li>\";\n\tbreak_str = \"&nbsp;\";\n\tendline = \"</li>\";\n\tsubj_tag = \"\";\n\tsubj_end_tag = \"\";\n      }\n\n      fprintf(fp,\"%s<a href=\\\"%s\\\">%s%s%s</a>%s<a name=\\\"%s%d\\\" id=\\\"%s%d\\\"><em>%s</em></a>%s%s%s\\n\",\n\t      startline, msg_href(em, subdir_email, FALSE), \n\t      subj_tag, subject, subj_end_tag, break_str, \n\t      set_fragment_prefix, em->msgnum, set_fragment_prefix, em->msgnum, \n\t      name,\n\t      break_str, date_str, endline);\n\n      free(subject);\n      free(name);\n    }\n    printdates(fp, hp->right, year, month, subdir_email, prev_date_str);\n  }\n}\n\n/*\n** Pretty-prints the files with attachments in the index files.\n** Returns the number of attachments that were printed.\n*/\nint printattachments(FILE *fp, struct header *hp, struct emailinfo *subdir_email, bool *is_first)\n{\n    char *subject=NULL,*name=NULL;\n    char *attdir;\n    char *msgnum;\n    int  nb_attach = 0;\n    static char *first_attributes = \"<a  accesskey=\\\"j\\\" name=\\\"first\\\" id=\\\"first\\\"></a>\";\n\n    const char *rel_path_to_top = (subdir_email ? subdir_email->subdir->rel_path_to_top : \"\");\n\n    if (hp != NULL) {\n\tstruct emailinfo *em = hp->data;\n\tnb_attach = printattachments(fp, hp->left, subdir_email, is_first);\n\tif ((!subdir_email || subdir_email->subdir == em->subdir)\n\t    && !em->is_deleted) {\n            \n\t    subject = (set_i18n) ? em->subject : convchars(em->subject, em->charset);\n            name = (set_i18n) ? em->name : convchars(em->name,em->charset);\n\n\t    /* See if there's a directory corresponding to this message */\n\t    msgnum = message_name(em);\n\t    trio_asprintf(&attdir, \"%s%c\" DIR_PREFIXER \"%s\", set_dir, PATH_SEPARATOR, msgnum);\n\t    if (isdir(attdir)) {\n\t        DIR *dir = opendir(attdir);\n\t\t\n\t\t/* consider that if there's an attachment directory, there are attachments */\n\t\tnb_attach++;\n\t\tif (set_indextable) {\n\t\t  fprintf(fp, \"<tr><td>%s%s</a></td><td><a name=\\\"%s%d\\\" id=\\\"%s%d\\\"><em>%s</em></a></td>\" \"<td>%s</td></tr>\\n\", msg_href(em, subdir_email, TRUE), subject, set_fragment_prefix, em->msgnum, set_fragment_prefix, em->msgnum, name, getindexdatestr(em->date));\n\t\t}\n\t\telse {\n\t\t  fprintf(fp, \"<li>%s%s<dfn>%s</dfn></a>&nbsp;\" \n\t\t\t  \"<a name=\\\"%s%d\\\" id=\\\"%s%d\\\"><em>%s</em></a>&nbsp;<em>(%s)</em>\\n\", \n\t\t\t  (*is_first) ? first_attributes : \"\",\n\t\t\t  msg_href(em, subdir_email, TRUE), subject, \n\t\t\t  set_fragment_prefix, em->msgnum, \n\t\t\t  set_fragment_prefix, em->msgnum, \n\t\t\t  name,\n\t\t\t  getindexdatestr(em->date));\n\t\t  if (*is_first)\n\t\t    *is_first = FALSE;\n\t\t}\n\t\tif (dir) {\n#ifdef HAVE_DIRENT_H\n\t\t    struct dirent *entry;\n#else\n\t\t    struct direct *entry;\n#endif\n\t\t    struct stat fileinfo;\n\t\t    char *filename, *stripped_filename;\n\t\t    const char *fmt2 = (set_indextable ? \"<tr><td>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\\\"%s%s\\\">%s</a></td>\" \"<td colspan=\\\"2\\\" align=\\\"center\\\">(%d %s)</td></tr>\\n\" : \"<li><a href=\\\"%s%s\\\">%s</a> (%d %s)</li>\\n\");\n\n\t\t    int first_time = 1;\n\t\t    while ((entry = readdir(dir))) {\n\t\t        int file_size = -1;\n\t\t\tif (!strcmp(\".\", entry->d_name) || !strcmp(\"..\", entry->d_name))\n\t\t\t\tcontinue;\n\t\t\tnb_attach++;\n\t\t\tif (first_time && !set_indextable) {\n\t\t\t    first_time = 0;\n\t\t\t    fprintf(fp, \"<ol>\\n\");\n\t\t\t}\n\t\t\ttrio_asprintf(&filename, \"%s%c%s\", attdir, PATH_SEPARATOR, entry->d_name);\n\t\t\tif (!stat(filename, &fileinfo))\n\t\t\t    file_size = (int)fileinfo.st_size;\n\t\t\tfree(filename);\n\t\t\ttrio_asprintf(&filename, DIR_PREFIXER \"%s%c%s\", message_name(em), PATH_SEPARATOR, entry->d_name);\n\t\t\tstripped_filename = strchr(entry->d_name, '-');\n\t\t\tif (stripped_filename)\n\t\t\t\tfprintf(fp, fmt2, rel_path_to_top, filename, stripped_filename + 1, file_size, lang[MSG_BYTES]);\n\t\t\telse if(strcmp(entry->d_name, \".meta\"))\n\t\t\t\tfprintf(fp, fmt2, rel_path_to_top, filename, entry->d_name, file_size, lang[MSG_BYTES]);\n\t\t\tfree(filename);\n\t\t    }\n\t\t    if (!first_time && !set_indextable) {\n\t\t        fprintf(fp, \"</ol></li>\\n\");\n\t\t    }\n\t\t    closedir(dir);\n\t\t}\n\t    }\n            \n\t    free(attdir);\n            \n            if (!set_i18n) {\n                free(subject);\n                free(name);\n            }\n\t}\n\tnb_attach += printattachments(fp, hp->right, subdir_email, is_first);\n    }\n    return nb_attach;\n}\n\nint showheader(char *header)\n{\n    return (!inlist (set_skip_headers, header) \n\t    && (inlist(set_show_headers, header) || inlist(set_show_headers, \"*\")));\n}\n\n/*\n * ConvURLsWithHrefs handles lines with URLs that are already written as\n * href's, to avoid having ConvURLsString add a second href to those URLs.\n*/\n\nstatic char *ConvURLsWithHrefs(const char *line, char *mailid, char *mailsubject, char *c, \n\t\t\t       char *charset)\n{\n    char *p;\n    struct Push retbuf;\n    char *tmpline5;\n    char *tmpline6;\n    char *tmpline1;\n\n    /* only do the convertion if a complete href is found */\n    p = strcasestr(c, \"</a>\");\n    if (!p)\n      return NULL;\n\n    tmpline1 = (char *)emalloc(strlen(line) + 1);\n    strncpy(tmpline1, line, c - line);\t/* AUDIT biege: who gurantees that c-line doesnt become smaller 0? IOF? */\n    tmpline1[c - line] = 0;\n    INIT_PUSH(retbuf);\n\n    /* complete href found; run ConvURLsString on text outside it */\n    tmpline5 = ConvURLsString(tmpline1, mailid, mailsubject, charset);\n\tif (!tmpline5)\n\t\treturn NULL;\n    PushString(&retbuf, tmpline5);\n    free(tmpline5);\n    p += 4;\n    tmpline6 = NULL;\n    /* pcm 2007-10-01 disabled the following ConvURLsString call to have */\n    /* it escape urls in mid line the same as it did for urls at start of */\n    /* line. I'm still puzzled why the change works. */\n    /* tmpline6 = ConvURLsString(p, mailid, mailsubject, charset); */\n    if (!tmpline6) {\n\tfree(PUSH_STRING(retbuf));\n\treturn NULL;\n    }\n    strncpy(tmpline1, c, p - c);\t/* AUDIT biege: who gurantees that p-c doesnt become smaller 0? IOF? */\n    tmpline1[p - c] = 0;\n    /* convert markup to lower case for XHTML compatiblity */\n    p = tmpline1 + 1;\n    while (*p != '=') {\n      *p = tolower (*p);\n      p++;\n    }\n    p = strstr (tmpline1, \"</A>\");\n    if (p)\n      *(p+2) = 'a';\n    PushString(&retbuf, tmpline1);\n    PushString(&retbuf, tmpline6);\n    free(tmpline1);\n    free(tmpline6);\n    RETURN_PUSH(retbuf);\n}\n\n/*\n * ConvMsgid converts a msgid into a link to the message it refers to if that\n * message is in the archive, and call ConvURLsString on the rest of the line.\n*/\n\nstatic char *ConvMsgid(char *line, char *inreply, char *mailid,\n\t\t       char *mailsubject, char *charset)\n{\n    char *tmpline4;\n    int subjmatch;\n    char *tmpline1;\n    char *c;\n    struct Push buff;\n    struct emailinfo *ep = hashreplylookup(-1, inreply, mailsubject, &subjmatch);\n\n    if (ep == NULL || subjmatch)\n\treturn NULL;\t\t/* not a known msgid - maybe an email addr? */\n    c = strstr(line, inreply);\n    if (!c)\n\treturn NULL;\t\t/* should never happen */\n    INIT_PUSH(buff);\n    tmpline1 = (char *)emalloc(c - line + 1);\n    strncpy(tmpline1, line, c - line);\t/* AUDIT biege: who gurantees that c-line doesnt become smaller 0? IOF? */\n    tmpline1[c - line] = 0;\n    tmpline4 = ConvURLsString(tmpline1, mailid, mailsubject, charset);\n    free(tmpline1);\n    PushString(&buff, tmpline4);\n    free(tmpline4);\n    PushString(&buff, msg_href(ep, ep, TRUE));\n    PushString(&buff, inreply);\n    PushString(&buff, \"</a>\");\n    tmpline4 = ConvURLsString(c + strlen(inreply), mailid, mailsubject, charset);\n    if (tmpline4) {\n\tPushString(&buff, tmpline4);\n\tfree(tmpline4);\n    }\n\telse if (0)\n\t\tprintf(\"cant ConvURLsString %s | %s.\\n\", c, inreply);\n    RETURN_PUSH(buff);\n}\n\n\n/*\n** Converts URLs, email addresses, and message IDs in a line to links,\n** mail commands, and articles respectively. Write everything to the\n** file pointed to by 'fp'.\n*/\n\nvoid ConvURLs(FILE *fp, char *line, char *mailid, char *mailsubject, char *charset)\n{\n    char *parsed = ConvURLsString(line, mailid, mailsubject, charset);\n    if (parsed) {\n\t/* write it to the file! */\n      /* add a call to convchars with charset */\n\tfwrite(parsed, strlen(parsed), 1, fp);\n\tfree(parsed);\n    }\n}\n\nchar *ConvURLsString(char *line, char *mailid, char *mailsubject, char *charset)\n{\n    char *parsed;\n    char *newparse;\n    char *c;\n\n#ifdef HAVE_ICONV\n    size_t tmplen;\n    char *tmpptr=i18n_convstring(mailsubject,\"UTF-8\",charset,&tmplen);\n    mailsubject=tmpptr;\n#endif\n\n    if (set_href_detection) {\n      if ((c = strcasestr(line, \"<A HREF=\\\"\")) != NULL && !strcasestr(c + 9, \"mailto\")) {\n\tparsed = ConvURLsWithHrefs(line, mailid, mailsubject, c, charset);\n\tif (parsed)\n\t  return parsed;\n      }\n    }\n\n    if (set_linkquotes) {\n\tchar *inreply = getreply(line);\n\tif (inreply) {\n\t    parsed = ConvMsgid(line, inreply, mailid, mailsubject, charset);\n\t    free(inreply);\n\t    if (parsed)\n\t        return parsed;\n\t}\n    }\n\n    parsed = parseurl(line, charset);\n\n    /* as at this point we don't know how to separate the href convertions from mailto\n       ones in the same line, we keep frmo doing the mailto convertion if we find a\n       complete href */\n    if (parsed && strcasestr(parsed, \"</a>\"))\n      return parsed;\n\n    /* we didn't find any previous href convertion, we try to do a mailto: convertion */\n    if (use_mailcommand) {\n\t/* Exclude headers that are not mail type headers */\n\n\tif (parsed && *parsed) {\n\t    newparse = parseemail(parsed,\t/* source */\n\t\t\t\t  mailid,\t/* mail's Message-Id: */\n\t\t\t\t  mailsubject,\t/* mail's Subject: */\n\t\t\t\t  MAKEMAILCOMMAND); /* make a mailto: */\n\t    free(parsed);\n\t    parsed = newparse;\n\t}\n    }\n#ifdef HAVE_ICONV\n    if(tmpptr)\n      free(tmpptr);\n#endif\n\n    return parsed;\n}\n\n\nvoid printheaders (FILE *fp, struct emailinfo *email)\n{\n    struct body *bp = email->bodylist;\n    char *id = email->msgid;\n    char *subject = email->subject;\n    char head[128];\n    char head_lower[128];\n    char *header_content;\n\n    if (REMOVE_MESSAGE(email)) {\n      int d_index = MSG_DELETED;\n      if (email->is_deleted == 2)\n\td_index = MSG_EXPIRED;\n      if (email->is_deleted == 4 || email->is_deleted == 8)\n\td_index = MSG_FILTERED_OUT;\n      fprintf(fp, \"<a name=\\\"start\\\" accesskey=\\\"j\\\" id=\\\"start\\\"></a>\");\n      fprintf(fp, \"<span id=\\\"deleted\\\">(%s)</span>\\n\", lang[d_index]);\n      return;\n    }\n    \n    if (set_show_headers) {\n      while (bp != NULL && bp->header) {\n        if ((bp->line)[0] == '\\n') {   /* don't try to convert newline */\n          break;\n        }\n\n\tif (sscanf(bp->line, \"%127[^:]\", head) == 1 && showheader(head)) {\n\t  /* this is a header we want to show */\n\n\t  strcpy (head_lower, head);\n\t  strtolower (head_lower);\n\n\t  /* we print the header, escaping it as needed */\n\n\t  header_content = bp->line + strlen (head) + 2;\n\t  fprintf (fp, \"<span id=\\\"%s\\\"><dfn>%s</dfn>: \",\n\t\t   head_lower, head);\n\n\n\t  /* JK: avoid converting Message-Id: headers */\n\t  if (!strcmp(head_lower, \"message-id\") && use_mailcommand) {\n\t    /* we desactivate it just during this conversion */\n\t    use_mailcommand = 0;\n\t    ConvURLs(fp, header_content, id, subject, email->charset);\n\t    use_mailcommand = 1;\n\t  }\n\t  else{\n#ifdef HAVE_ICONV\n\t    size_t tmplen;\n\t    char *tmpptr=i18n_convstring(header_content,\"UTF-8\",email->charset,&tmplen);\n\t    ConvURLs(fp, tmpptr, id, subject, email->charset);\n\t    if (tmpptr)\n\t      free(tmpptr);\n#else\n\t    ConvURLs(fp, header_content, id, subject, email->charset);\n#endif\n\t  }\n\t  fprintf (fp, \"</span><br />\\n\");\n\t}\n\t\n\t/* go to the next header or stop if we reached the end of the headers \n\t   (signaled thru the \\n char). */\n\tif ((bp->line)[0] != '\\n') {\n\t  bp = bp->next;\n\t  continue;\n\t}\n\telse\n\t  break;\n      }\n    }\n} /* printheaders */\n\n/*\n** The heuristics for displaying an otherwise ordinary line (a non-quote,\n** non-sig, non-inhtml, non-blank line) if 'showhtml' is 1 (which really means\n** we're *not* doing <pre> or txt2html to format the text) have changed so\n** that indented text shows up correctly.  First, leading spaces become HTML\n** non-breaking spaces (&nbsp;).  In order for this to work, those lines\n** must have been preceded by a <br /> or <p>.  We accomplish this by checking\n** ahead when we print each line... if we determine that the next line\n** should be broken before, we do so.\n*/\n\nvoid printbody(FILE *fp, struct emailinfo *email, int maybe_reply, int is_reply)\n{\n    int insig, inblank;\n    struct body *bp = email->bodylist;\n    char *id = email->msgid;\n    char *subject = email->subject;\n    int msgnum = email->msgnum;\n    char inheader = FALSE;\t/* we always start in a mail header */\n    int pre = FALSE;\n\n    int inquote;\n    int quote_num;\n    int quoted_percent;\n    bool replace_quoted;\n\n    if (set_linkquotes || set_showhtml == 2)\n      /* should be changed to unconditional after tested for a while?\n\t - pcm@rahul.net 1999-09-09 */\n      find_quote_prefix(email->bodylist, is_reply);\n    \n    if (set_quote_hide_threshold <= 100)\n\tquoted_percent = compute_quoted_percent(bp);\n    else\n      quoted_percent = 100;\n    replace_quoted = (quoted_percent > set_quote_hide_threshold);\n\n    if (set_showprogress && replace_quoted)\n      printf(\"\\nMessage %d quoted text (%d %%) replaced by links\\n\", msgnum, quoted_percent);\n    \n    if (email->is_deleted && set_delete_level != DELETE_LEAVES_TEXT && !(email->is_deleted == 2 && set_delete_level == DELETE_LEAVES_EXPIRED_TEXT)) {\n      int d_index = MSG_DELETED;\n      if (email->is_deleted == 2)\n\td_index = MSG_EXPIRED;\n      if (email->is_deleted == 4 || email->is_deleted == 8)\n\td_index = MSG_FILTERED_OUT;\n      if (email->is_deleted == 64)\n\td_index = MSG_DELETED_OTHER;\n      switch(d_index) {\n      case MSG_DELETED:\n\tif(set_htmlmessage_deleted_spam){\n\t  fprintf(fp,\"%s\\n\",set_htmlmessage_deleted_spam);\n\t  break;\n\t}\n      case MSG_DELETED_OTHER:\n\tif(set_htmlmessage_deleted_other){\n\t  fprintf(fp,\"%s\\n\",set_htmlmessage_deleted_other);\n\t  break;\n\t}\n      default:\n\tfprintf(fp, \"<a name=\\\"start\\\" accesskey=\\\"j\\\" id=\\\"start\\\"></a>\");\n\tfprintf(fp, \"<p>%s</p>\\n\", lang[d_index]);\n      }\n      return;\n    }\n    \n    if (email->annotation_content == ANNOTATION_CONTENT_EDITED) {\n      if (set_htmlmessage_edited)\n\tfprintf(fp,\"%s\\n\",set_htmlmessage_edited);\n      else\n\tfprintf(fp, \"<p>%s</p>\\n\", lang[MSG_EDITED]);\n    }\n\n    if (!set_showhtml) {\n\tfprintf(fp, \"<pre id=\\\"body\\\">\\n\");\n\tpre = TRUE;\n    }\n\n    /* tag the start of the message body */\n    fprintf(fp, \"<a name=\\\"start\\\" accesskey=\\\"j\\\" id=\\\"start\\\"></a>\");\n\n    if (set_showhtml == 2)\n      init_txt2html();\n    inquote = 0;\n    quote_num = 0;\n\n    inblank = 1;\n    insig = 0;\n\n    while (bp != NULL) {\n\tif (bp->html) {\n\t  /* already in HTML, don't touch */\n  \t  if (pre) {\n\t    fprintf(fp, \"</pre>\\n\");\n\t    pre = FALSE;\n\t  }\n\t  printhtml(fp, bp->line);\n\t  inheader = FALSE;\t/* this can't be a header if already in HTML */\n\t  bp = bp->next;\n\t  continue;\n\t}\n\n\tif (bp->header) {\n\t    char head[128];\n\t    if (!inheader) {\n              /* JK: I'm not sure why, but I had a !set_showhtml here */\n\t      if (!set_showhtml && !pre && set_showheaders) {\n\t\tfprintf(fp, \"<pre>\\n\");\n\t\tpre = TRUE;\n\t      }\n\t      inheader = TRUE;\n\t    }\n\t    if (sscanf(bp->line, \"%127[^:]\", head) == 1 && set_show_headers && !showheader(head)) {\n\t      /* the show header keyword has been used, then we skip all those\n\t\t that aren't mentioned! */\n\t      if (isalnum(*head) || !set_showheaders) {\n\t\t/* this check is only to make sure that the last line among \n\t\t   the headers (the \"\\n\" one) won't be filtered off */\n\t\tbp = bp->next;\n\t\tcontinue;\n\t      }\n\t    }\n\t}\n\telse {\n\t  if (inheader) {\n\t    insig = 0;\n\t    if (set_showhtml) {\n\t      if (pre) {\n\t\tfprintf(fp, \"</pre>\\n\");\n\t\tpre = FALSE;\n\t      }\n\t      fprintf(fp, \"<br />\\n\");\n\t    }\n\t    else {\n\t      if (!pre) {\n\t\tfprintf(fp, \"<pre>\\n\");\n\t\tpre = TRUE;\n\t      }\n\t    }\n\t    inheader = FALSE;\n\t  }\n\t}\n\n\tif (((bp->line)[0] != '\\n') && (bp->header && !set_showheaders)) {\n\t    bp = bp->next;\n\t    continue;\n\t}\n\n\tif (set_showhtml == 2 && !inheader) {\n\t    txt2html(fp, email, bp, replace_quoted, maybe_reply);\n\t    bp = bp->next;\n\t    continue;\n\t}\n\n        if (bp->header && set_showheaders && !pre) {\n\t  fprintf(fp, \"<pre>\\n\");\n\t  pre = TRUE;\n\t}\n \n\tif ((bp->line)[0] == '\\n' && inblank) {\n\t  bp = bp->next;\n\t  continue;\n\t}\n\telse\n\t  inblank = 0;\n\t\n\tif (set_showhtml) {\n\t  if (is_sig_start(bp->line)) {\n\t    insig = 1;\n\t    if (!pre) {\n\t      fprintf(fp, \"<pre>\\n\");\n\t      pre = TRUE;\n\t    }\n\t  }\n\t  \n\t  if (!inheader && (bp->line)[0] == '\\n')\n\t    /* within the <pre></pre> statements you do not need to\n\t       insert <p> statements since text is already preformated.\n\t       the W3C HTML validation script fails for such pages \n\t       Akis Karnouskos <akis@ceid.upatras.gr>     */\n\t    {\n\t      if (!pre)\n\t\tfprintf(fp, \"<br />\");\n\t    }\n\t  else {\n\t    if (insig) {\n\t      ConvURLs(fp, bp->line, id, subject, email->charset);\n\t    }\n\t    else if (isquote(bp->line)) {\n\t      if (set_linkquotes) {\n\t\tif (handle_quoted_text(fp, email, bp, bp->line, inquote, quote_num, replace_quoted, maybe_reply)) {\n\t\t  ++quote_num;\n\t\t  inquote = 1;\n\t\t}\n\t      }\n\t      else {\n\t\tfprintf(fp, \"<%s class=\\\"%s\\\">\", set_iquotes ? \"em\" : \"span\", find_quote_class(bp->line));\n\n\t\tConvURLs(fp, bp->line, id, subject, email->charset);\n\t\t\n\t\tfprintf(fp, \"%s<br />\\n\", (set_iquotes) ? \"</em>\" : \"</span>\");\n\t      }\n\t    }\n\t    else if ((bp->line)[0] != '\\0' && !bp->header) {\n\t      char *sp;\n\t      sp = print_leading_whitespace(fp, bp->line);\n\t      \n\t      /* JK: avoid converting Message-Id: headers */\n\t      if (bp->header && bp->parsedheader && !strncasecmp(bp->line, \"Message-Id:\", 11)\n\t\t  && use_mailcommand) {\n\t\t/* we desactivate it just during this conversion */\n\t\tuse_mailcommand = 0;\n\t\tConvURLs(fp, sp, id, subject, email->charset);\n\t\tuse_mailcommand = 1;\n\t      }\n\t      else\n\t\tConvURLs(fp, sp, id, subject, email->charset);\n\t      \n\t      /*\n\t       * Determine whether we should break.\n\t       * We could check for leading spaces\n\t       * or quote lines, but in general,\n\t       * non-alphanumeric lines should be\n\t       * broken before.\n\t       */\n\t      \n\t      if ((set_showbr && !bp->header) || ((bp->next != NULL) && !isalnum(bp->next->line[0])))\n\t\tfprintf(fp, \"<br />\");\n\t      if (!bp->header) {\n\t\tfprintf(fp, \"\\n\");\n\t      }\n\t    }\n\t    \n\t  }\n\t}\n\telse if ((bp->line)[0] != '\\0' && !bp->header) {\n\t  /* JK: avoid converting Message-Id: headers */\n\t  if (bp->header && bp->parsedheader && !strncasecmp(bp->line, \"Message-Id:\", 11)\n\t      && use_mailcommand) {\n\t    /* we desactivate it just during this conversion */\n\t    use_mailcommand = 0;\n\t    ConvURLs(fp, bp->line, id, subject, email->charset);\n\t    use_mailcommand = 1;\n\t  }\n\t  else\n\t    ConvURLs(fp, bp->line, id, subject, email->charset);\n\t}\n\tif (!isquote(bp->line))\n\t  inquote = 0;\n\tbp = bp->next;\n    }\n\n    if (pre)\n      fprintf(fp, \"</pre>\\n\");\n    else if (set_showhtml == 2)\n      end_txt2html(fp);\n}\n\nchar *print_leading_whitespace(FILE *fp, char *sp)\n{\n    while (*sp && (*sp == ' ' || *sp == '\\t')) {\n        if (*sp == '\\t')\n\t    fprintf(fp, \"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\");\n\telse\n\t    fprintf(fp, \"&nbsp;\");\n\tsp++;\n    }\n    return sp;\n}\n\nvoid print_headers(FILE *fp, struct emailinfo *email, int in_thread_file)\n{\t\n  /*\n   * Print the message's author info and date.\n   * General form: <span><dfn>from:<dfn>: name <email></span><br /> \n   */\n\n  fprintf(fp, \"<address class=\\\"headers\\\">\\n\");\n\n#ifdef HAVE_ICONV\n  size_t tmplen;\n  char *tmpsubject=i18n_convstring(email->subject,\"UTF-8\",email->charset,&tmplen);\n  char *tmptmpname=i18n_convstring(email->name,\"UTF-8\",email->charset,&tmplen); \n  char *tmpname=convchars(tmptmpname,\"utf-8\");\n  free(tmptmpname);\n#else\n  char *tmpsubject=0;\n  char *tmpname=convchars(email->name, email->charset);\n#endif\n  \n  /* the from header */\n  fprintf (fp, \"<span id=\\\"from\\\">\\n\");\n  fprintf (fp, \"<dfn>%s</dfn>: \", lang[MSG_FROM]);\n  if (REMOVE_MESSAGE(email)) {\n    /* don't show the email address and name if we have deleted the message */\n    fprintf(fp, \"&lt;%s&gt;\", lang[MSG_SENDER_DELETED]);\n  } \n  else if (!strcmp(email->name, email->emailaddr)) {\n    if (use_mailcommand) {\n      char *ptr = makemailcommand(set_mailcommand,\n\t\t\t\t  email->emailaddr,\n#ifdef HAVE_ICONV\n\t\t\t\t  email->msgid, tmpsubject);\n#else\n\t\t\t\t  email->msgid, email->subject);\n#endif\n      fprintf(fp, \"&lt;<a href=\\\"%s\\\">%s</a>&gt;\", ptr ? ptr : \"\",\n\t      obfuscate_email_address(email->emailaddr));\n      if (ptr)\n\tfree(ptr);\n    }\n    else\n      fprintf(fp, \"%s\", tmpname);\n  }\n  else {\n      if (use_mailcommand && strcmp(email->emailaddr, \"(no email)\") != 0) {\n\tchar *ptr = makemailcommand(set_mailcommand,\n\t\t\t\t    email->emailaddr,\n#ifdef HAVE_ICONV\n\t\t\t\t    email->msgid, tmpsubject);\n#else\n\t\t\t\t    email->msgid, email->subject);\n#endif\n\tfprintf(fp, \"%s &lt;<a href=\\\"%s\\\">%s</a>&gt;\", tmpname, ptr ? ptr : \"\",\n\t\tobfuscate_email_address(email->emailaddr));\n      if (ptr)\n\tfree(ptr);\n    }\n    else {\n      fprintf(fp, \"%s &lt;<em>%s</em>&gt;\", tmpname, \n\t      (strcmp(email->emailaddr, \"(no email)\") != 0) ? email->emailaddr : \"no email\");\n    }\n  }\n  fprintf (fp, \"\\n</span><br />\\n\");\n  \n  /* subject */\n  if (in_thread_file)\n#ifdef HAVE_ICONV\n    fprintf(fp, \"<span id=\\\"subject\\\"><dfn>%s</dfn>: %s</span><br />\\n\", lang[MSG_SUBJECT], tmpsubject);\n#else\n    fprintf(fp, \"<span id=\\\"subject\\\"><dfn>%s</dfn>: %s</span><br />\\n\", lang[MSG_SUBJECT], tmpsubject=convchars(email->subject,email->charset));\n#endif\n  /* date */\n  fprintf(fp, \"<span id=\\\"date\\\"><dfn>%s</dfn>: %s</span><br />\\n\", lang[MSG_CDATE], email->datestr);\n\n  printheaders (fp, email);\n\n  fprintf(fp, \"</address>\\n\");\n\n    if(tmpsubject)\n     free(tmpsubject);\n    if(tmpname)\n     free(tmpname);\n}\n\nstatic char *href01(struct emailinfo *email, struct emailinfo *email2, int in_thread_file, \n\t\t    bool generate_markup)\n{\n\tstatic char buffer[256];\n\tif (in_thread_file) {\n\t  if (generate_markup)\n\t    sprintf(buffer, \"<a href=\\\"#%.4d\\\">\", email2->msgnum);\n\t  else\n\t    sprintf(buffer, \"#%.4d\", email2->msgnum);\n\t  return buffer;\n\t} \n\telse\n\t  return msg_href(email2, email, generate_markup);\n}\n\nstatic void\nprint_replies(FILE *fp, struct emailinfo *email, int num, int in_thread_file)\n{\n    struct reply *rp;\n    struct emailinfo *email2;\n    char *ptr;\n    bool list_started = FALSE;\n#ifdef FASTREPLYCODE\n    for (rp = email->replylist; rp != NULL; rp = rp->next) {\n\tif (hashnumlookup(rp->msgnum, &email2)) {\n#else\n    for (rp = replylist; rp != NULL; rp = rp->next) {\n        if (rp->frommsgnum == num && hashnumlookup(rp->msgnum, &email2)) {\n#endif\n\t    char *del_msg = (email2->is_deleted ? lang[MSG_DEL_SHORT] : \"\");\n\t    if (!list_started) {\n\t        list_started = TRUE;\n\t\tfprintf (fp, \"<li><a name=\\\"replies\\\" id=\\\"replies\\\"></a>\\n\");\n\t    }\n\t    else\n\t        fprintf (fp, \"<li>\");\n\n\t    if (rp->maybereply)\n\t\tfprintf(fp, \"<dfn>%s</dfn>:\", lang[MSG_MAYBE_REPLY]);\n\t    else\n\t        fprintf(fp, \"<dfn>%s</dfn>:\", lang[MSG_REPLY]);\n\t    fprintf(fp, \"%s <a href=\\\"%s\\\" title=\\\"%s\\\">\", del_msg, \n\t\t    href01(email, email2, in_thread_file, FALSE),\n\t\t    lang[MSG_LTITLE_REPLIES]);\n#ifdef HAVE_ICONV\n\t    char *tmpptr;\n\t    ptr = i18n_utf2numref(email2->subject,1);\n\t    tmpptr = i18n_utf2numref(email2->name,1);\n\t    fprintf(fp, \"%s: \\\"%s\\\"</a></li>\\n\", tmpptr, ptr);\n\t    if (tmpptr)\n\t      free(tmpptr);\n#else\n\t    ptr = convchars(email2->subject, email2->charset);\n\t    fprintf(fp, \"%s: \\\"%s\\\"</a></li>\\n\", email2->name, ptr);\n#endif\n\t    if (ptr)\n\t\tfree(ptr);\n\t}\n    }\n    printcomment(fp, \"lreply\", \"end\");\n}\n\nint print_links_up(FILE *fp, struct emailinfo *email, int pos, int in_thread_file)\n{\n\tint num = email->msgnum;\n\tint subjmatch;\n\tstruct emailinfo *email2;\n\tstruct emailinfo *email_next_in_thread = nextinthread(email->msgnum);\n\tchar *ptr;\n\tstruct reply *rp;\n\tint is_reply = 0;\n\tint loc_cmp = (pos == PAGE_BOTTOM ? 3 : 4);\n\n\t/*\n\t * Should we print message links ?\n\t */\n\n\tif (set_show_msg_links && set_show_msg_links != loc_cmp) {\n\t    if (pos == PAGE_TOP)\n\t      ptr = \"navbar\";\n\t    else\n\t      ptr = \"navbarfoot\";\n\t    fprintf(fp, \"<map id=\\\"%s\\\" name=\\\"%s\\\">\\n\", ptr, ptr);\n\t    if (pos == PAGE_TOP)\n\t    fprintf(fp, \"<ul class=\\\"links\\\">\\n\");\n\n\t    fprintf(fp, \"<li>\\n\");\n\t    fprintf(fp, \"<dfn>%s</dfn>:\\n\", lang[MSG_THIS_MESSAGE]);\n\t    fprintf(fp, \"[ <a href=\\\"#start\\\" name=\\\"options1\\\" id=\\\"options1\\\" tabindex=\\\"1\\\">\"\n\t\t    \"%s</a> ]\\n\", lang[MSG_MSG_BODY]);\n\t    if (set_mailcommand && set_hmail) {\n\t      if ((email->msgid && email->msgid[0]) || (email->subject && email->subject[0])) {\n#ifdef HAVE_ICONV\n\t\tsize_t tmplen;\n\t\tchar *tmpptr=i18n_convstring(email->subject,\"UTF-8\",email->charset,&tmplen);\n\t\tptr = makemailcommand(set_replymsg_command, set_hmail, email->msgid, \n\t\t\t\t      tmpptr);\n\t\tif (tmpptr)\n\t\t  free(tmpptr);\n#else\n\t\tptr = makemailcommand(set_replymsg_command, set_hmail, email->msgid, \n\t\t\t\t      email->subject);\n#endif\n\t\tfprintf(fp, \" [ <a href=\\\"%s\\\" accesskey=\\\"r\\\" title=\\\"%s\\\">%s</a> ]\\n\",\n\t\t\tptr, lang[MSG_MA_REPLY], lang[MSG_RESPOND]);\n\t\tif (ptr)\n\t\t  free(ptr);\n\t      }\n\t    }\n\t    switch(set_show_index_links){\n\t    case 0:\n\t      break;\n\t    case 1:\n\t      fprintf(fp, \" [ %s (<a href=\\\"#options2\\\">top</a>, <a href=\\\"#options3\\\">bottom</a>) ]\\n\", lang[MSG_MORE_OPTIONS]);\n\t      break;\n\t    case 3:\n\t      fprintf(fp, \" [ <a href=\\\"#options2\\\">%s</a> ]\\n\", lang[MSG_MORE_OPTIONS]);\n\t      break;\n\t    case 4:\n\t      fprintf(fp, \" [ <a href=\\\"#options3\\\">%s</a> ]\\n\", lang[MSG_MORE_OPTIONS]);\n\t      break;\n\t    }\n\t    fprintf(fp, \"</li>\\n\");\n\t    \n\t    fprintf(fp, \"<li>\\n\");\n\t    fprintf(fp, \"<dfn>%s</dfn>:\\n\", lang[MSG_RELATED_MESSAGES]);\n\n\n\t    /*\n\t     * Is there a next message?\n\t     */\n\t    printcomment(fp, \"unext\", \"start\");\n\t    email2 = neighborlookup(num, 1);\n\t    if (email2) {\n\t      char *tmpptr;\n#ifdef HAVE_ICONV\n\t      ptr=i18n_utf2numref(email2->subject,1);\n\t      tmpptr=i18n_utf2numref(email2->name,1);\n#else\n\t      ptr = convchars(email2->subject, email2->charset);\n\t      tmpptr= convchars(email2->name,email2->charset);\n#endif\n\t      fprintf(fp, \"[ <a href=\\\"%s\\\" accesskey=\\\"d\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t      msg_href (email2, email, FALSE), \n\t\t      tmpptr, ptr ? ptr : \"\", \n\t\t      lang[MSG_NEXT_MESSAGE]);\n\t      if (tmpptr)\n\t\tfree(tmpptr);\n\t      if (ptr)\n\t\tfree(ptr);\n\t    }\n\n\t    /*\n\t     * Is there a previous message?\n\t     */\n\n\t    email2 = neighborlookup(num, -1);\n#if 0\n\t    /* pcm removed 2002-08-30, old_reply_to is always NULL */\n\t    if (set_linkquotes && old_reply_to && pos == PAGE_BOTTOM && num - 1 == (get_new_reply_to() == -1 ? old_reply_to->msgnum : get_new_reply_to()))\n\t      email2 = NULL;\n#endif\n\n\t    if (email2) {\n\t      char *tmpptr;\n#ifdef HAVE_ICONV\n\t      ptr = i18n_utf2numref(email2->subject,1);\n\t      tmpptr=i18n_utf2numref(email2->name,1);\n#else\n\t      ptr = convchars(email2->subject, email2->charset);\n\t      tmpptr=convchars(email2->name,email2->charset);\n#endif\n\t      fprintf(fp, \"[ <a href=\\\"%s\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t      msg_relpath(email2, email), \n\t\t      tmpptr, ptr ? ptr : \"\", \n\t\t      lang[MSG_PREVIOUS_MESSAGE]);\n\t      if (ptr)\n\t\tfree(ptr);\n\t      if (tmpptr)\n\t\tfree(tmpptr);\n\t    }\n\n\t    /*\n\t     * Is this message a reply to another?\n\t     */\n\n\t    if (email->inreplyto[0]) {\n\t      email2 = hashreplylookup(email->msgnum, email->inreplyto, email->subject, &subjmatch);\n\t      if (email2) {\n\t\tchar *del_msg = (email2->is_deleted ? lang[MSG_DEL_SHORT]\n\t\t\t\t : \"\");\n\t\tis_reply = 1;\n\n\t\tchar *tmpptr;\n#ifdef HAVE_ICONV\n\t\tptr = i18n_utf2numref(email2->subject,1);\n\t\ttmpptr=i18n_utf2numref(email2->name,1);\n#else\n\t\tptr = convchars(email2->subject, email2->charset);\n\t\ttmpptr=convchars(email2->name,email2->charset);\n#endif\n\t\tfprintf(fp, \"[ <a href=\\\"%s\\\" title=\\\"%s%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t\t href01(email, email2, in_thread_file, FALSE), \n\t\t\tdel_msg, tmpptr, ptr ? ptr : \"\", \n\t\t\t(subjmatch) ? lang[MSG_MAYBE_IN_REPLY_TO] : lang[MSG_IN_REPLY_TO]);\n\t\tif (ptr)\n\t\t  free (ptr);\n\t\tif (tmpptr)\n\t\t  free (tmpptr);\n\n\t      } else if (set_inreplyto_command) {\n\t\tchar *tmpptr;\n\n\t\ttmpptr = makeinreplytocommand(set_inreplyto_command, email->subject, email->inreplyto);\n\t\tif (tmpptr) {\t\t\n\t\t  /* use an msgid resolver */\n\t\t  fprintf(fp, \"[ <a href=\\\"%s\\\"  title=\\\"%s\\\">%s</a> ]\\n\", \n\t\t\t  tmpptr,\n\t\t\t  lang[MSG_UNKNOWN_IN_REPLY_TO],\n\t\t\t  lang[MSG_IN_REPLY_TO]);\n\t\t  free (tmpptr);\n\t\t}\n\t      }\n\t    }\n\t\n\t    /*\n\t     * Is there a message next in the thread?\n\t     */\n\t    printcomment(fp, \"unextthread\", \"start\");\n\t    if (email_next_in_thread) {\n\t      char *tmpptr;\n#ifdef HAVE_ICONV\n\t      ptr = i18n_utf2numref(email_next_in_thread->subject,1);\n\t      tmpptr=i18n_utf2numref(email_next_in_thread->name,1);\n#else\n\t      ptr = convchars(email_next_in_thread->subject, email_next_in_thread->charset);\n\t      tmpptr=convchars(email_next_in_thread->name,email_next_in_thread->charset);\n#endif\n\t      fprintf(fp, \"[ <a href=\\\"%s\\\" accesskey=\\\"t\\\" title=\\\"%s: &quot;%s&quot;\\\">%s</a> ]\\n\", \n\t\t      href01(email, email_next_in_thread, in_thread_file, FALSE),\n\t\t      tmpptr, ptr, \n\t\t      lang[MSG_NEXT_IN_THREAD]);\n\t      if (ptr)\n\t\tfree(ptr);\n\t      if (tmpptr)\n\t\tfree(tmpptr);\n\t      email->initial_next_in_thread = email_next_in_thread->msgnum;\n\t    }\n\t\n\t    /*\n\t     * Does this message have replies? If so, just add one link to the\n\t     bottom reply section.\n\t     */\n\t\n\t    if (set_show_msg_links == 3) {\n\t        /* print_replies(fp, email, num, in_thread_file); */\n\t\tis_reply = print_links(fp, email, pos, in_thread_file);\n\t    }\n\t    else if (set_showreplies) {\n#ifdef FASTREPLYCODE\n\t      for (rp = email->replylist; rp != NULL; rp = rp->next) {\n\t\tif (hashnumlookup(rp->msgnum, &email2)) {\n#else\n\t\t  for (rp = replylist; rp != NULL; rp = rp->next) {\n\t\t    if (rp->frommsgnum == num && hashnumlookup(rp->msgnum, &email2)) {\n#endif\n\t\t      fprintf (fp, \" [ <a href=\\\"#replies\\\">%s</a> ]\\n\", \n\t\t\t       lang[MSG_REPLIES]);\n\t\t      break;\n\t\t    }\n\t\t  }\n\t\t  printcomment(fp, \"ureply\", \"end\");\n\t\t}\n\n\t\t/* close the list */\n\t\tfprintf (fp,\"</li>\\n</ul>\\n</map>\\n\");\n\t      }\n\t      return is_reply;\n}\n\nint print_links(FILE *fp, struct emailinfo *email, int pos, int in_thread_file)\n{\n\tint num = email->msgnum;\n\tint subjmatch;\n\tstruct emailinfo *email2;\n\tstruct emailinfo *email_next_in_thread = nextinthread(email->msgnum);\n\tchar *ptr,*ptr2,*ptr3;\n\tint is_reply = 0;\n\tint loc_cmp = (pos == PAGE_BOTTOM ? 3 : 4);\n\n\t/*\n\t * Should we print message links ?\n\t */\n\n\tif (set_show_msg_links && set_show_msg_links != loc_cmp) {\n\t  fprintf(fp, \"<ul class=\\\"links\\\">\\n\");\n\n\t  /* \n\t  ** format for items: <li><dfn>Next</dfn>: <a href=\"0047.html\" \n\t  title=\"wai thing\">subject of message</a></li>\\n */\n\t     \n\t  fprintf (fp, \"<li><dfn>%s</dfn>: [ <a href=\\\"#start\\\">%s</a> ]</li>\\n\", \n\t\t   lang[MSG_THIS_MESSAGE], lang[MSG_MSG_BODY]);\n\t  \n\t  printcomment(fp, \"lnext\", \"start\");\n\t  /*\n\t   * Is there a next message?\n\t   */\n\t  \n\t  email2 = neighborlookup(num, 1);\n\t  if (email2) {\n#ifdef HAVE_ICONV\n\t    ptr =  i18n_utf2numref(email2->subject,1);\n\t    ptr2 = i18n_utf2numref(email2->name,1);\n#else\n\t    ptr = convchars(email2->subject, email2->charset);\n\t    ptr2 = convchars(email2->name, email2->charset);\n#endif\n\t    fprintf(fp, \"<li><dfn>%s</dfn>: \", lang[MSG_NEXT_MESSAGE]);\n\t    fprintf(fp, \"<a href=\\\"%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t    msg_href(email2, email, FALSE), lang[MSG_LTITLE_NEXT],\n\t\t    ptr2 ? ptr2 : \"\", ptr ? ptr : \"\");\n\t    if (ptr)\n\t      free(ptr);\n\t    if (ptr2)\n\t      free(ptr2);\n\t  }\n\n\t  /*\n\t   * Is there a previous message?\n\t   */\n\t  \n\t  email2 = neighborlookup(num, -1);\n#if 0\n\t  /* pcm removed 2002-08-30, old_reply_to is always NULL */\n\t  if (set_linkquotes && old_reply_to && pos == PAGE_BOTTOM && num - 1 == (get_new_reply_to() == -1 ? old_reply_to->msgnum : get_new_reply_to()))\n\t    email2 = NULL;\n#endif\n\t  if (email2) {\n#ifdef HAVE_ICONV\n\t    ptr = i18n_utf2numref(email2->subject,1);\n\t    ptr2 = i18n_utf2numref(email2->name,1);\n#else\n\t    ptr = convchars(email2->subject, email2->charset);\n\t    ptr2 = convchars(email2->name, email2->charset);\n#endif\n\t    fprintf(fp, \"<li><dfn>%s</dfn>: \", lang[MSG_PREVIOUS_MESSAGE]);\n\t    fprintf(fp, \"<a href=\\\"%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t    msg_href(email2, email, FALSE), lang[MSG_LTITLE_PREVIOUS],\n\t\t    ptr2 ? ptr2 : \"\", ptr);\n\t    if (ptr)\n\t      free(ptr);\n\t    if (ptr2)\n\t      free(ptr2);\n\t  }\n\n\t/*\n\t * Is this message a reply to another?\n\t */\n\n\tif (email->inreplyto[0]) {\n\t  email2 = hashreplylookup(email->msgnum, email->inreplyto, email->subject, &subjmatch);\n\t  if (email2) {\n\t    char *del_msg = (email2->is_deleted ? lang[MSG_DEL_SHORT]\n\t\t\t     : \"\");\n\t    is_reply = 1;\n#ifdef HAVE_ICONV\n\t    ptr = i18n_utf2numref(email2->subject,1);\n\t    ptr2 = i18n_utf2numref(email2->name,1);\n#else\n\t    ptr = convchars(email2->subject, email2->charset);\n\t    ptr2 = convchars(email2->name, email2->charset);\n#endif\n\t    if (subjmatch)\n\t      fprintf(fp, \"<li><dfn>%s</dfn>:\", lang[MSG_MAYBE_IN_REPLY_TO]);\n\t    else\n\t      fprintf(fp, \"<li><dfn>%s</dfn>:\", lang[MSG_IN_REPLY_TO]);\n\t    fprintf(fp, \"%s <a href=\\\"%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t    del_msg, href01(email, email2, in_thread_file, FALSE), \n\t\t    lang[MSG_LTITLE_IN_REPLY_TO], ptr2, ptr);\n\t    if (ptr)\n\t      free(ptr);\n\t    if (ptr2)\n\t      free(ptr2);\n\n\t  } else if (set_inreplyto_command) {\n\t    char *tmpptr;\n\n\t    tmpptr = makeinreplytocommand(set_inreplyto_command, email->subject, email->inreplyto);\n\t    if (tmpptr) {\t\t\n\t      /* use an msgid resolver */\n\t      fprintf(fp, \"<li><dfn>%s</dfn>:\", lang[MSG_IN_REPLY_TO]);\n\t      fprintf(fp, \" [ <a href=\\\"%s\\\" title=\\\"%s : %s\\\">%s</a> ]</li>\\n\", \n\t\t      tmpptr,\n\t\t      lang[MSG_LTITLE_IN_REPLY_TO],\n\t\t      lang[MSG_UNKNOWN_IN_REPLY_TO],\n\t\t      lang[MSG_UNKNOWN_IN_REPLY_TO]);\n\t      free (tmpptr);\n\t    }\n\t  }\n\t}\n\n\t/*\n\t * Is there a message next in the thread?\n\t */\n\tprintcomment(fp, \"lnextthread\", \"start\");\n\tif (email_next_in_thread) {\n#ifdef HAVE_ICONV\n\t  ptr = i18n_utf2numref(email_next_in_thread->subject, 1);\n\t  ptr2 = i18n_utf2numref(email_next_in_thread->name,1);\n#else\n\t  ptr = convchars(email_next_in_thread->subject, email_next_in_thread->charset);\n\t  ptr2 = convchars(email_next_in_thread->name, email_next_in_thread->charset);\n#endif\n\t  fprintf(fp, \"<li><dfn>%s</dfn>: \", lang[MSG_NEXT_IN_THREAD]);\n\t  fprintf(fp, \"<a href=\\\"%s\\\" title=\\\"%s\\\">%s: \\\"%s\\\"</a></li>\\n\", \n\t\t  href01(email, email_next_in_thread, in_thread_file, FALSE), \n\t\t  lang[MSG_LTITLE_NEXT_IN_THREAD], \n\t\t  ptr2, ptr);\n\t  if (ptr)\n\t    free(ptr);\n\t  if (ptr2)\n\t    free(ptr2);\n\t  email->initial_next_in_thread = email_next_in_thread->msgnum;\n\t}\n\n\t/*\n\t * Does this message have replies? If so, print them all!\n\t */\n\n\tif (set_showreplies) {\n\t    print_replies(fp, email, num, in_thread_file);\n\n\t    /* close the list */\n\t    fprintf(fp, \"</ul>\\n\");\n\t}\n\t}\n\treturn is_reply;\n}\n\nstatic int has_new_replies(struct emailinfo *email)\n{\n    struct reply *rp;\n    static int max_old_msgnum = -2;\n    if (max_old_msgnum == -2) {\n      if (set_nonsequential)\n\tmax_old_msgnum = find_max_msgnum_id();\n      else\n\tmax_old_msgnum = find_max_msgnum();\n    }\n    if (email->msgnum == max_old_msgnum)\n\treturn 1;  /* next msg needs to be linked, even if no new reply */\n#ifdef FASTREPLYCODE\n    for (rp = email->replylist; rp != NULL; rp = rp->next) {\n\tif (rp->frommsgnum == email->msgnum && rp->msgnum > max_old_msgnum)\n\t    return 1;\n    }\n#endif\n    return 0;\n}\n\n#ifdef GDBM\nstatic GDBM_FILE gdbm_init(void);\nstatic GDBM_FILE gdbm_init()\n{\n    char indexname[MAXFILELEN];\n    static GDBM_FILE gp = NULL;\n    if (set_usegdbm) {\n\tsnprintf(indexname, sizeof(indexname), (set_dir[strlen(set_dir) - 1] == '/')\n\t\t\t ? \"%s%s\" : \"%s/%s\", set_dir, GDBM_INDEX_NAME);\n\n      /* open the database, creating it if necessary */\n\t    \n\tif (!(gp = gdbm_open(indexname, 0, GDBM_WRCREAT, 0664, 0))) {\n\n\t    if (set_folder_by_date && set_increment && !is_empty_archive()) {\n\t        snprintf(errmsg, sizeof(errmsg), \"Cannot open or create file \\\"%s\\\". Unable to \" \"do\\nincremental updates with the folder_by_date \" \"option without using that file.\", indexname);\n\t\tprogerr(errmsg);\n\t    }\n\t/* couldn't open; unlink it rather than risk running\n\t * with an inconsistent version; it will be recreated if\n\t * necessary */\n\n\t    unlink(indexname);\n\t}\n\telse {\n\t    datum key;\n\t    datum content;\n\t    char buf[512];\n\t    key.dptr = \"delete_level\";\n\t    key.dsize = strlen(key.dptr);\n\t    sprintf(buf, \"%d\", set_delete_level);\n\t    content.dsize = strlen(buf) + 1;\n\t    content.dptr = buf; /* the value is in this string */\n\t    gdbm_store(gp, key, content, GDBM_REPLACE);\n\t}\n    }\n    return gp;\n}\n#endif\n\n/*\n * Perform deletions on old messages when run in incremental mode.\n */\n\nvoid update_deletions(int num_old)\n{\n    struct hashemail *hlist;\n    struct reply *rp;\n    int save_ov = set_overwrite;\n    set_overwrite = TRUE;\n    for (hlist = deletedlist; hlist != NULL; hlist = hlist->next) {\n\tstruct emailinfo *ep;\n\tint num = hlist->data->msgnum;\n\tif (num >= num_old)\n\t    continue;\t\t/* new message - already done */\n\tif (hashnumlookup(num, &ep)) {\n\t    char *filename;\n\t    if (ep->deletion_completed == set_delete_level) /* done already? */\n\t        continue;\n\t    if (set_delete_level != DELETE_LEAVES_TEXT) {\n\t        filename = articlehtmlfilename(ep);\n\t\tif (set_delete_level != DELETE_REMOVES_FILES) {\n\t\t    struct body *bp = ep->bodylist;\n\t\t    if (bp == NULL)\n\t\t        parse_old_html(num, ep, 1, 0, NULL, 0);\n\t\t    writearticles(num, num + 1);\n\t\t}\n\t\telse if (isfile(filename)) {\n\t\t    unlink(filename);\n\t\t}\n\t\tfree(filename);\n\t    }\n#ifdef FASTREPLYCODE\n\t    for (rp = ep->replylist; rp != NULL; rp = rp->next) {\n#else\n\t    for (rp = replylist; rp != NULL; rp = rp->next) {\n#endif\n\t        int rnum = rp->data->msgnum;\n\t\tif (rnum < num_old) {\n\t\t    if (!rp->data->bodylist || !rp->data->bodylist->line[0])\n\t\t        parse_old_html(rnum, rp->data, TRUE, FALSE, NULL, 0);\n\t\t\twritearticles(rnum, rnum + 1);\t/* update MSG_IN_REPLY_TO line */\n\t\t}\n\t    }\n\t}\n    }\n#ifdef GDBM\n    if (set_usegdbm) {\n        GDBM_FILE gp = gdbm_init();\n\tfor (hlist = deletedlist; hlist != NULL; hlist = hlist->next) {\n\t    if (gp) {\n\t        struct emailinfo *ep;\n\t\tint num = hlist->data->msgnum;\n\t\tif (num >= num_old)\n\t\t    continue;\t\t/* new message - already done */\n\t\tif (hashnumlookup(num, &ep)) {\n\t\t    togdbm((void *)gp, ep);\n\t\t}\n\t    }\n\t}\n    }\n#endif\n    set_overwrite = save_ov;\n}\n\n/*\n** Printing...the other main part of this program!\n** This writes out the articles, beginning with the number startnum.\n*/\n\nvoid writearticles(int startnum, int maxnum)\n{\n    int num, skip, newfile;\n    int is_reply = 0;\n    int maybe_reply = 0; /* const, why is this here? pcm 2002-08-30 */\n    struct emailinfo *email;\n    struct emailinfo *email_next_in_thread;\n\n    struct body *bp;\n    struct reply *rp;\n    FILE *fp;\n    char *ptr = NULL;\n#ifdef HAVE_ICONV\n    char *localsubject=NULL,*localname=NULL;\n    size_t convlen=0;\n#endif\n\n\n#ifdef GDBM\n\n    /* A gdbm hack for avoiding opening all the message files to\n     * get the header comments; see parse.c for details thereof. */\n\n    GDBM_FILE gp = gdbm_init();\n#endif\n\n    num = startnum;\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...    \", lang[MSG_WRITING_ARTICLES], set_dir);\n\n    while (num < maxnum) {\n\n\tchar *filename;\n\tif ((bp = hashnumlookup(num, &email)) == NULL) {\n\t    ++num;\n\t    continue;\n\t}\n\tfilename = articlehtmlfilename(email);\n\n#ifdef HAVE_ICONV\n\tif(email->subject)\n\t  localsubject= i18n_convstring(email->subject,\"UTF-8\",email->charset,&convlen);\n\tif(email->name)\n\t  localname= i18n_convstring(email->name,\"UTF-8\",email->charset,&convlen);\n#endif\n\n\t/*\n\t * Determine to overwrite files or not\n\t */\n\n\tif (isfile(filename))\n\t    newfile = 0;\n\telse\n\t    newfile = 1;\n\n\tis_reply = 0;\n\tset_new_reply_to(-1, -1);\n\n\tskip = 0;\n\tif (email->is_deleted && set_delete_level == DELETE_REMOVES_FILES) {\n\t    if (!newfile) {\n\t\tunlink(filename);\n\t    }\n#ifdef GDBM\n\t    else if (gp) {\n\t\ttogdbm((void *)gp, email);\n\t    }\n#endif\n\t    ++num;\n\t    free(filename);\n\t    continue;\n\t}\n\telse if (!newfile && !set_overwrite && !has_new_replies(email)\n\t\t && !(email->is_deleted && set_delete_msgnum)) {\n\t    skip = 1;\t\t/* is this really necessary with continue ??? */\n\t    num++;\n\t    free(filename);\n\t    continue;\n\t}\n\telse {\n\t  if ((fp = fopen(filename, \"w\")) == NULL) { /* AUDIT biege:where? */\n\t        snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\t\tprogerr(errmsg);\n\t  }\n\t  if (set_report_new_file) {\n\t      printf(\"%s\\n\", filename);\n\t  }\n\t}\n\n\temail_next_in_thread = nextinthread(email->msgnum);\n\n\n\t/*\n\t * Create the comment fields necessary for incremental updating\n\t */\n#ifdef HAVE_ICONV\n\tprint_msg_header(fp, set_label, localsubject, set_dir, localname, email->emailaddr, \n\t\t\t email->msgid, email->charset, email->date, filename, \n\t\t\t REMOVE_MESSAGE(email), email->annotation_robot);\n#else\n\tprint_msg_header(fp, set_label, email->subject, set_dir, email->name, email->emailaddr, \n\t\t\t email->msgid, email->charset, email->date, filename, \n\t\t\t REMOVE_MESSAGE(email), email->annotation_robot);\n#endif\n\tfprintf (fp, \"<div class=\\\"head\\\">\\n\");\n\n\t/* print the navigation bar to upper levels */\n\tif (ihtmlnavbar2upfile)\n\t  fprintf(fp, \"<map title=\\\"%s\\\" id=\\\"upper\\\">\\n%s</map>\\n\", \n\t\t  lang[MSG_NAVBAR2UPPERLEVELS], ihtmlnavbar2upfile);\n\n\t/* reset the value of ptr before we actually start using it,\n\t   just in case one of the ternary operations here below\n\t   doesn't allocate any memory */\n\tptr = NULL;\n\n\t/* write the title */\n#ifdef HAVE_ICONV\n\tfprintf(fp, \"<h1>%s</h1>\\n\", (REMOVE_MESSAGE(email)) ? lang[MSG_SUBJECT_DELETED] :\n\t\t(ptr = convchars(localsubject, email->charset)));\n#else\n\tfprintf(fp, \"<h1>%s</h1>\\n\", (REMOVE_MESSAGE(email)) ? lang[MSG_SUBJECT_DELETED] :\n\t\t(ptr = convchars(email->subject, email->charset)));\n#endif\n\tif (ptr)\n\t  free(ptr);\n\n\tprintcomment(fp, \"received\", email->fromdatestr);\n\tprintcomment(fp, \"isoreceived\", secs_to_iso(email->fromdate));\n\tprintcomment(fp, \"sent\", email->datestr);\n\tprintcomment(fp, \"isosent\", secs_to_iso(email->date));\n#ifdef HAVE_ICONV\n\tprintcomment(fp, \"name\", localname);\n#else\n\tprintcomment(fp, \"name\", email->name);\n#endif\n\tprintcomment(fp, \"email\", obfuscate_email_address(email->emailaddr));\n#ifdef HAVE_ICONV\n\tptr = convcharsnospamprotect(localsubject, email->charset);\n#else\n\tptr = convcharsnospamprotect(email->subject, email->charset);\n#endif\n \tprintcomment(fp, \"subject\", ptr);\n\tif (ptr)\n\t    free(ptr);\n\tprintcomment(fp, \"id\", email->msgid);\n\tprintcomment(fp, \"charset\", email->charset);\n \tprintcomment(fp, \"inreplyto\", ptr = convcharsnospamprotect(email->inreplyto, email->charset));\n\tif (ptr)\n\t    free(ptr);\n\tif (email->is_deleted) {\n\t    char num_buf[32];\n\t    sprintf(num_buf, \"%d\", email->is_deleted);\n\t    printcomment(fp, \"isdeleted\", num_buf);\n\t}\n\tprintcomment(fp, \"expires\", email->exp_time == -1 ? \"-1\" : secs_to_iso(email->exp_time));\n#ifdef GDBM\n\tif (gp) {\n\t\ttogdbm((void *)gp, email);\n\t}\n#endif\n\t/*\n\t * This is here because it looks better here. The table looks\n\t * better before the Author info. This stuff should be in \n\t * printfile() so it could be laid out as the user wants...\n\t */\n\n\n\tis_reply = print_links_up(fp, email, PAGE_TOP, FALSE);\n\n\tif ((set_show_index_links == 1 || set_show_index_links == 3) && !set_usetable)\n\t    fprint_menu0(fp, email, PAGE_TOP);\n\tif ((set_show_msg_links && set_show_msg_links != 4) || !set_usetable)\n\t  {\n\t    fprintf(fp, \"</div>\\n\");\n\t  }\n\n\t/*\n\t * Finally...print the body!\n\t */\n\n\tprintcomment(fp, \"body\", \"start\");\n\tfprintf (fp, \"<div class=\\\"mail\\\">\\n\");\n\tprint_headers(fp, email, FALSE);\n\tprintbody(fp, email, maybe_reply, is_reply);\n\tfprintf (fp, \"<span id=\\\"received\\\"><dfn>%s</dfn> %s</span>\\n\", \n\t\t lang[MSG_RECEIVED_ON],  getdatestr(email->fromdate));\n\tfprintf (fp, \"</div>\\n\");\n\tprintcomment(fp, \"body\", \"end\");\n\n\t/*\n\t * Should we print out the message links ?\n\t */\n\n\tfprintf (fp, \"<div class=\\\"foot\\\">\\n\");\n\tfprintf (fp, \"<map id=\\\"navbarfoot\\\" name=\\\"navbarfoot\\\" title=\\\"%s\\\">\\n\", \n\t\t lang[MSG_RELATED_MESSAGES]);\n\t\n\tprint_links(fp, email, PAGE_BOTTOM, FALSE);\n\n\tfprint_menu0(fp, email, PAGE_BOTTOM);\n\n\tfprintf(fp, \"</map>\\n\");\n\tfprintf(fp, \"</div>\\n\");\n\t\n\tif (set_txtsuffix) {\n\t  fprintf(fp, \"<p><a rel=\\\"nofollow\\\" href=\\\"%.4d.%s\\\">%s</a>\", email->msgnum, set_txtsuffix, lang[MSG_TXT_VERSION]);\n\t}\n\t\n\tprintfooter(fp, mhtmlfooterfile, set_label, set_dir, email->subject, filename, FALSE);\n\t\n\tfclose(fp);\n\t\n\tif (get_new_reply_to() != -1) {\n\t  /* will only be true if set_linkquotes is */\n\t  struct emailinfo *e3, *e4;\n\t  int was_correct = 0;\n\t  replace_maybe_replies(filename, email, get_new_reply_to());\n\t  for (rp = replylist; rp != NULL; rp = rp->next) {\n\t    /* get rid of old guesses for where this links */\n\t    if (rp->msgnum == num) {\n#ifdef FASTREPLYCODE\n\t      struct reply *rp3;\n\t      was_correct = (rp->frommsgnum == get_new_reply_to());\n\t      if (was_correct)\n\t\tbreak;\n\t      hashnumlookup(get_new_reply_to(), &e4);\n\t      hashnumlookup(rp->frommsgnum, &e3);\n\t      for (rp3 = e3->replylist; rp3 != NULL && rp3->next != NULL; rp3 = rp3->next) {\n\t\tif (rp3->next->msgnum == num) {\n\t\t  rp3->next = rp3->next->next; /* remove */\n\t\t}\n\t      }\n\t      e4->replylist = addreply(e4->replylist, e4->msgnum, email, 0, NULL);\n#endif\n\t      rp->frommsgnum = get_new_reply_to();\n\t      rp->maybereply = 0;\n\t      break; /* revisit me */\n\t    }\n\t  }\n\t  if (!rp) {\n\t    if (hashnumlookup(num, &e3)) {\n#ifdef FASTREPLYCODE\n\t      hashnumlookup(get_new_reply_to(), &e4);\n\t      if(0)\n\t\tfprintf(stderr, \"update reply %2d %2d \\n\", get_new_reply_to(), num);\n\t      replylist = addreply2(replylist, e4, e3, 0, &replylist_end);\n#else\n\t      replylist = addreply(replylist, get_new_reply_to(), e3, 0, &replylist_end);\n#endif\n\t    }\n\t  }\n\t  if (!was_correct)\n\t    fixreplyheader(set_dir, num, TRUE, num);\n\t}\n\t\n\tif (newfile && chmod(filename, set_filemode) == -1) {\n\t    snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\t    progerr(errmsg);\n\t}\n\n\tif (maxnum && !(num % 5) && set_showprogress) {\n\t  printf(\"\\b\\b\\b\\b%03.0f%c\", ((float)num / (float)maxnum) * 100, '%');\n\t  fflush(stdout);\n\t}\n\tfree(filename);\n\t\n\tnum++;\n\n#ifdef HAVE_ICONV\n\tif (localsubject)\n\t  free(localsubject);\n\tif (localname)\n\t  free(localname);\n#endif\n    }\n    \n#ifdef GDBM\n    if (gp) {\n        datum key;\n\tdatum content;\n\tint nkey = -1;\n\tchar num_buf[32];\n\tkey.dsize = sizeof(nkey); /* the key -1 is for the last msgnum */\n\t\tkey.dptr = (char *)&nkey;\n\tsprintf(num_buf, \"%d\", max_msgnum);\n\tcontent.dsize = strlen(num_buf) + 1;\n\tcontent.dptr = num_buf;\n\tgdbm_store((GDBM_FILE) gp, key, content, GDBM_REPLACE);\n\tgdbm_close(gp);\n    }\n#endif\n\n    if (set_showprogress)\n      printf(\"\\b\\b\\b\\b    \\n\");\n} /* end writearticles() */\n \n/*\n** Write the date index...\n** If email != NULL, write index for the subdir in which that email is.\n*/\n\nvoid writedates(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n    char prev_date_str[DATESTRLEN + 40];\n    char *datename = index_name[email && email->subdir != NULL][DATE_INDEX];\n    time_t start_date_num = email && email->subdir ? email->subdir->first_email->date : firstdatenum;\n    time_t end_date_num = email && email->subdir ? email->subdir->last_email->date : lastdatenum;\n\n    filename = htmlfilename(datename, email, \"\");\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n    if ((fp = fopen(filename, \"w\")) == NULL) { /* AUDIT biege: where? */\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_DATE_INDEX], filename);\n\n    /*\n     * Print out the index file header \n     */\n    print_index_header(fp, set_label, set_dir, lang[MSG_BY_DATE], datename);\n\n    /* \n     * Print out archive information links at the top of the index\n     */\n    print_index_header_links(fp, DATE_INDEX, start_date_num, end_date_num,\n\t\t\t     amountmsgs, email ? email->subdir : NULL);\n    fprintf (fp, \"</div>\\n\");\n\n    /*\n     * Print out the actual message index lists. Here's the beef.\n     */\n    if (set_indextable)\n\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong>%s</strong></td></tr>\\n\", lang[MSG_CSUBJECT], lang[MSG_CAUTHOR], lang[MSG_CDATE]);\n    else {\n        fprintf (fp, \"<div class=\\\"messages-list\\\">\\n\");\n\tfprintf(fp, \"<ul>\\n\");\n    }\n    prev_date_str[0] = '\\0';\n    printdates(fp, datelist, -1, -1, email, prev_date_str);\n\n    if (set_indextable)\n      fprintf(fp, \"</table>\\n</div>\\n\");\n    else\n      {\n\tif (*prev_date_str)  /* close the previous date item */\n\t  fprintf (fp, \"</ul></li>\\n\");\n\tfprintf(fp, \"</ul>\\n\");\n\tprintlaststats (fp, end_date_num);\n\tfprintf (fp, \"</div>\\n\");\n      }\n\n    /* \n     * Print out archive information links at the bottom of the index\n     */\n    print_index_footer_links(fp, DATE_INDEX, end_date_num, amountmsgs,\n\t\t\t     email ? email->subdir : NULL);\n\n    /* \n     * Print the index page footer.\n     */\n    printfooter(fp, ihtmlfooterfile, set_label, set_dir, lang[MSG_BY_DATE], datename, TRUE);\n\n    fclose(fp);\n\n    /* AUDIT biege: depending on the direc. it better to use fchmod(). */\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n/*\n** Write the attachments index...\n*/\n\nvoid writeattachments(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n    char *attname = index_name[email && email->subdir != NULL][ATTACHMENT_INDEX];\n    time_t start_date_num = email && email->subdir ? email->subdir->first_email->date : firstdatenum;\n    time_t end_date_num = email && email->subdir ? email->subdir->last_email->date : lastdatenum;\n    bool is_first = TRUE; /* used to print the anchor to the first element (WAI) */\n\n    filename = htmlfilename(attname, email, \"\");\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n    if ((fp = fopen(filename, \"w\")) == NULL) {\t/* AUDIT biege: where? */\n\t snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_ATTACHMENT_INDEX], filename);\n\n    /*\n     * Print out the index file header \n     */\n    print_index_header(fp, set_label, set_dir, lang[MSG_BY_ATTACHMENT], attname);\n\n    /* \n     * Print out archive information links at the top of the index\n     */\n    print_index_header_links(fp, ATTACHMENT_INDEX, start_date_num, end_date_num,\n\t\t\t     amountmsgs, email ? email->subdir : NULL);\n    fprintf (fp, \"</div>\\n\");\n\n    /*\n     * Print out the actual message index lists. Here's the beef.\n     */\n\n    if (set_indextable) {\n\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong>%s</strong></td></tr>\\n\", lang[MSG_CSUBJECT], lang[MSG_CAUTHOR], lang[MSG_CDATE]);\n\tprintattachments(fp, datelist, email, &is_first);\n\tfprintf(fp, \"</table>\\n</div>\\n\");\n    }\n    else {\n        fprintf (fp, \"<div class=\\\"messages-list\\\">\\n\");\n\tfprintf(fp, \"<ul>\\n\");\n\tif (printattachments(fp, datelist, email, &is_first) == 0)\n\t   fprintf(fp, \"<li style=\\\"display: none\\\">Nothing received yet!</li>\\n\");\n\tfprintf(fp, \"</ul>\\n\");\n\tfprintf(fp, \"</div>\\n\");\n    }\n\n    /* \n     * Print out archive information links at the bottom of the index\n     */\n    printlaststats (fp, end_date_num);\n    print_index_footer_links(fp, ATTACHMENT_INDEX, end_date_num, amountmsgs,\n\t\t\t     email ? email->subdir : NULL);\n    \n    /* \n     * Print the index page footer.\n     */\n    printfooter(fp, ihtmlfooterfile, set_label, set_dir, lang[MSG_BY_DATE], attname, TRUE);\n\n    fclose(fp);\n\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n/*\n** Write the thread index...\n*/\n\nvoid writethreads(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n    char *thrdname = index_name[email && email->subdir != NULL][THREAD_INDEX];\n    time_t start_date_num = email && email->subdir ? email->subdir->first_email->date : firstdatenum;\n    time_t end_date_num = email && email->subdir ? email->subdir->last_email->date : lastdatenum;\n\n    struct printed *pp;\n\n    while (printedlist) {\t/* cleanup needed ?? */\n\tpp = printedlist;\n\tprintedlist = printedlist->next;\n\tfree(pp);\n    }\n\n    printedlist = NULL;\n\n    filename = htmlfilename(thrdname, email, \"\");\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n    if ((fp = fopen(filename, \"w\")) == NULL) {\t/* AUDIT biege: where? */\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_THREAD_INDEX], filename);\n\n    print_index_header(fp, set_label, set_dir, lang[MSG_BY_THREAD], thrdname);\n\n    /* \n     * Print out the index page links \n     */\n    print_index_header_links(fp, THREAD_INDEX, start_date_num, end_date_num,\n\t\t\t     amountmsgs, email ? email->subdir : NULL);\n    fprintf (fp, \"</div>\\n\");\n\n    if (set_indextable) {\n\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong> %s</strong></td></tr>\\n\", lang[MSG_CSUBJECT], lang[MSG_CAUTHOR], lang[MSG_CDATE]);\n\tprint_all_threads(fp, -1, -1, email);\n\tfprintf(fp, \"</table>\\n</div>\\n\");\n    }\n    else {\n        fprintf (fp, \"<div class=\\\"messages-list\\\">\\n\");\n\tfprintf(fp, \"<ul>\\n\");\n\tprint_all_threads(fp, -1, -1, email);\n\tfprintf(fp, \"</ul>\\n\");\n\tfprintf (fp, \"</div>\");\n    }\n\n    /* \n     * Print out archive information links at the bottom of the index\n     */\n    printlaststats (fp, end_date_num);\n    print_index_footer_links(fp, THREAD_INDEX, end_date_num, amountmsgs,\n\t\t\t     email ? email->subdir : NULL);\n    \n    printfooter(fp, ihtmlfooterfile, set_label, set_dir, lang[MSG_BY_THREAD], thrdname, TRUE);\n\n    fclose(fp);\n\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n/*\n** Print the subject index pointers alphabetically.\n*/\n\nvoid printsubjects(FILE *fp, struct header *hp, char **oldsubject,\n\t\t   int year, int month, struct emailinfo *subdir_email)\n{\n  char *subject=NULL, *name=NULL;\n  const char *startline;\n  const char *break_str;\n  const char *endline;\n  static char date_str[DATESTRLEN+40]; /* made static for smaller stack */\n  static char *first_attributes = \"<a  accesskey=\\\"j\\\" name=\\\"first\\\" id=\\\"first\\\"></a>\";\n\n  if (hp != NULL) {\n    printsubjects(fp, hp->left, oldsubject, year, month, subdir_email);\n    if ((year == -1 || year_of_datenum(hp->data->date) == year)\n\t&& (month == -1 || month_of_datenum(hp->data->date) == month)\n\t&& !hp->data->is_deleted\n\t&& (!subdir_email || subdir_email->subdir == hp->data->subdir)) {\n\n#ifdef HAVE_ICONV\n        subject = convchars(hp->data->unre_subject, \"utf-8\");\n        name = convchars(hp->data->name, \"utf-8\");\n#else\n        subject = convchars(hp->data->subject, hp->data->charset);\n        name = convchars(hp->data->name, hp->data->charset);\n#endif\n\n\tif (strcasecmp(hp->data->unre_subject, *oldsubject)) {\n\t    if (set_indextable) {\n\t\tfprintf(fp,\n\t\t\t\"<tr><td colspan=\\\"3\\\"><strong>%s</strong></td></tr>\\n\",\n\t\t\tsubject);\n\t    }\n\t    else {\n\t      bool is_first;\n\t        if (*oldsubject && *oldsubject[0] != '\\0')  { /* close the previous open list */\n\t\t  fprintf(fp, \"</ul></li>\\n\");\n\t\t  is_first = FALSE;\n\t\t} \n\t\telse\n\t\t  is_first = TRUE;\n\n\t\tfprintf(fp, \"<li>%s<dfn>%s</dfn>\\n\", \n\t\t\t(is_first) ? first_attributes : \"\", subject);\n\t\tfprintf(fp, \"<ul>\\n\");\n\t    }\n\t}\n\tif(set_indextable) {\n\t    startline = \"<tr><td>&nbsp;</td><td nowrap>\";\n\t    break_str = \"</td><td nowrap>\";\n\t    strcpy(date_str, getindexdatestr(hp->data->date));\n\t    endline = \"</td></tr>\";\n\t}\n\telse {\n\t    startline = \"<li>\";\n\t    break_str = \"\";\n\t    snprintf(date_str, sizeof(date_str), \"<em>(%s)</em>\", getindexdatestr(hp->data->date));\n\t    endline = \"</li>\";\n\t}\n\tfprintf(fp,\n\t\t\"%s%s%s</a>%s <a name=\\\"%s%d\\\" id=\\\"%s%d\\\">%s</a>%s\\n\", startline,\n\t\tmsg_href(hp->data, subdir_email, TRUE), \n                name, break_str,        \n\t\tset_fragment_prefix, hp->data->msgnum, \n\t\tset_fragment_prefix, hp->data->msgnum, date_str, endline);\n\t*oldsubject = hp->data->unre_subject;\n\n\tfree(subject);\n\tfree(name);\n    }\n    printsubjects(fp, hp->right, oldsubject, year, month, subdir_email);\n  }\n}\n\n/*\n** Prints the subject index.\n*/\n\nvoid writesubjects(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n    char *subjname = index_name[email && email->subdir != NULL][SUBJECT_INDEX];\n    time_t start_date_num = email && email->subdir ? email->subdir->first_email->date : firstdatenum;\n    time_t end_date_num = email && email->subdir ? email->subdir->last_email->date : lastdatenum;\n\n    filename = htmlfilename(subjname, email, \"\");\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n\tif ((fp = fopen(filename, \"w\")) == NULL) { /* AUDIT biege: where? */\n\t    snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_SUBJECT_INDEX], filename);\n\n\tprint_index_header(fp, set_label, set_dir, lang[MSG_BY_SUBJECT], subjname);\n\n\t/* \n\t * Print out the index page links \n\t */\n\tprint_index_header_links(fp, SUBJECT_INDEX, start_date_num, end_date_num,\n\t\t\t\t amountmsgs, email ? email->subdir : NULL);\n\tfprintf (fp, \"</div>\\n\");\n\t\n    if (set_indextable) {\n\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong> %s</strong></td></tr>\\n\", lang[MSG_CSUBJECT], lang[MSG_CAUTHOR], lang[MSG_CDATE]);\n    }\n    else {\n        fprintf (fp, \"<div class=\\\"messages-list\\\">\\n\");\n\tfprintf(fp, \"<ul>\\n\");\n    }\n    {\n\tchar *oldsubject = \"\";\t/* dummy to start with */\n\tprintsubjects(fp, subjectlist, &oldsubject, -1, -1, email);\n    }\n    if (set_indextable) {\n\tfprintf(fp, \"</table>\\n</div>\\n\");\n    }\n    else {\n\tfprintf(fp, \"</ul></li>\\n\");\n\tfprintf(fp, \"</ul>\\n\");\n\tfprintf (fp, \"</div>\");\n    }\n\n    /* \n     * Print out archive information links at the bottom of the index\n     */\n\n    printlaststats (fp, end_date_num);\n    print_index_footer_links(fp, SUBJECT_INDEX, end_date_num, amountmsgs,\n\t\t\t\t email ? email->subdir : NULL);\n\n    printfooter(fp, ihtmlfooterfile, set_label, set_dir, lang[MSG_BY_SUBJECT], subjname, TRUE);\n\n    fclose(fp);\n\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n/*\n** Prints the author index links sorted alphabetically.\n*/\n\nvoid printauthors(FILE *fp, struct header *hp, char **oldname,\n\t\t  int year, int month, struct emailinfo *subdir_email)\n{\n  char *subj, *tmpname;\n  const char *startline;\n  const char *break_str;\n  const char *endline;\n  static char date_str[DATESTRLEN+40]; /* made static for smaller stack */\n  static char *first_attributes = \"<a  accesskey=\\\"j\\\" name=\\\"first\\\" id=\\\"first\\\"></a>\";\n\n  if (hp != NULL) {\n    printauthors(fp, hp->left, oldname, year, month, subdir_email);\n    if ((year == -1 || year_of_datenum(hp->data->date) == year)\n\t&& (month == -1 || month_of_datenum(hp->data->date) == month)\n\t&& !hp->data->is_deleted\n\t&& (!subdir_email || subdir_email->subdir == hp->data->subdir)) {\n\n#ifdef HAVE_ICONV\n      subj = convchars(hp->data->subject, \"utf-8\");\n      tmpname = convchars(hp->data->name,\"utf-8\");\n#else\n      subj = convchars(hp->data->subject, hp->data->charset);\n      tmpname = convchars(hp->data->name,hp->data->charset);\n#endif\n      if (strcasecmp(hp->data->name, *oldname)) {\n\n\tif(set_indextable)\n\t  fprintf(fp,\n\t\t  \"<tr><td colspan=\\\"3\\\"><strong>%s</strong></td></tr>\",\n\t\t  tmpname);\n\telse {\n\t  bool is_first;\n\n\t  if (*oldname && *oldname[0] != '\\0') { /* close the previous open list */\n\t    fprintf(fp, \"</ul></li>\\n\");\n\t    is_first = FALSE;\n\t  }\n\t  else\n\t    is_first = TRUE;\n\n\t  fprintf(fp, \"<li>%s<dfn>%s</dfn>\\n\", \n\t\t  (is_first) ? first_attributes : \"\",\n\t\t  tmpname);\n\t  fprintf(fp, \"<ul>\\n\");\n\t}\n      }\n      if(set_indextable) {\n\tstartline = \"<tr><td>&nbsp;</td><td>\";\n\tbreak_str = \"</td><td nowrap>\";\n\tstrcpy(date_str, getindexdatestr(hp->data->date));\n\tendline = \"</td></tr>\";\n      }\n      else {\n\tstartline = \"<li>\";\n\tbreak_str = \"&nbsp;\";\n\tsnprintf(date_str, sizeof(date_str), \"<em>(%s)</em>\", getindexdatestr(hp->data->date));\n\tendline = \"</li>\";\n      }\n      fprintf(fp,\"%s%s%s</a>%s<a name=\\\"%s%d\\\" id=\\\"%s%d\\\">%s</a>%s\\n\",\n\t      startline, msg_href(hp->data, subdir_email, TRUE), subj, break_str,\n\t      set_fragment_prefix, hp->data->msgnum, set_fragment_prefix, hp->data->msgnum, \n\t      date_str, endline);\n      if(subj)\n\tfree(subj);\n      if(tmpname)\n\tfree(tmpname);\n\n      *oldname = hp->data->name;\t/* avoid copying */\n    }\n    printauthors(fp, hp->right, oldname, year, month, subdir_email);\n  }\n}\n\n/*\n** Prints the author index file and links sorted alphabetically.\n*/\n\nvoid writeauthors(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n    char *authname = index_name[email && email->subdir != NULL][AUTHOR_INDEX];\n    time_t start_date_num = email && email->subdir ? email->subdir->first_email->date : firstdatenum;\n    time_t end_date_num = email && email->subdir ? email->subdir->last_email->date : lastdatenum;\n\n    filename = htmlfilename(authname, email, \"\");\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n\tif ((fp = fopen(filename, \"w\")) == NULL) { /* AUDIT biege: where? */\n\t     snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_AUTHOR_INDEX], filename);\n\n    print_index_header(fp, set_label, set_dir, lang[MSG_BY_AUTHOR], authname);\n\n    /* \n     * Print out the index page links \n     */\n    print_index_header_links(fp, AUTHOR_INDEX, start_date_num, end_date_num,\n\t\t\t     amountmsgs, email ? email->subdir : NULL);\n    fprintf (fp, \"</div>\\n\");\n\n    if (set_indextable) {\n\t\tfprintf(fp, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong> %s</strong></td></tr>\\n\", lang[MSG_CAUTHOR], lang[MSG_CSUBJECT], lang[MSG_CDATE]);\n    }\n    else {\n        fprintf(fp, \"<div class=\\\"messages-list\\\">\\n\");\n\tfprintf(fp, \"<ul>\\n\");\n    }\n    {\n\tchar *prevauthor = \"\";\n\tprintauthors(fp, authorlist, &prevauthor, -1, -1, email);\n    }\n    if (set_indextable) {\n\tfprintf(fp, \"</table>\\n</div>\\n\");\n    }\n    else {\n        fprintf(fp, \"</ul></li>\\n\");\n\tfprintf(fp, \"</ul>\\n\");\n\tfprintf(fp, \"</div>\\n\");\n    }\n\n    /* \n     * Print out archive information links at the bottom \n     * of the index page\n     */\n\n    printlaststats (fp, end_date_num);\n    print_index_footer_links(fp, AUTHOR_INDEX, end_date_num, amountmsgs,\n\t\t\t\t email ? email->subdir : NULL);\n\n    printfooter(fp, ihtmlfooterfile, set_label, set_dir, lang[MSG_BY_AUTHOR], authname, TRUE);\n\n    fclose(fp);\n\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n/*\n** Pretty-prints the items for the haof\n*/\nvoid printhaofitems(FILE *fp, struct header *hp, int year, int month, struct emailinfo *subdir_email)\n{\n  char *subj, *from_name, *from_emailaddr;\n\n  if (hp != NULL) {\n    struct emailinfo *em = hp->data;\n    printhaofitems(fp, hp->left, year, month, subdir_email);\n    if ((year == -1 || year_of_datenum(em->date) == year)\n\t&& (month == -1 || month_of_datenum(em->date) == month)\n        && !em->is_deleted && (!subdir_email || subdir_email->subdir == em->subdir)) {\n\n#ifdef HAVE_ICONV\n      subj = convchars(em->subject, \"utf-8\");\n      from_name = convchars(em->name, \"utf-8\");\n      from_emailaddr = convchars(em->emailaddr, \"utf-8\");\n#else\n      subj = convchars(em->subject, em->charset);\n      from_name = convchars(em->name, em->charset);\n      from_emailaddr = convchars(em->emailaddr, em->charset);\n#endif\n\n      fprintf(fp, \"      <mail>\\n\" \"        <subject>%s</subject>\\n\" \"        <date>%s</date>\\n\" \"        <fromname>%s</fromname>\\n\" \"        <fromemail>%s</fromemail>\\n\" \"        <message-id>%s</message-id>\\n\" \"        <file>\\\"%s\\\"</file>\\n\" \"      </mail>\\n\\n\", subj, getdatestr(em->date), from_name, from_emailaddr, em->msgid, msg_relpath(em, subdir_email));\n\n      free(subj);\n      free(from_name);\n      free(from_emailaddr);\n    }\n    printhaofitems(fp, hp->right, year, month, subdir_email);\n  }\n}\n\n/*\n** Write the XML based hypermail archive overview file\n*/\n\nvoid writehaof(int amountmsgs, struct emailinfo *email)\n{\n    int newfile;\n    char *filename;\n    FILE *fp;\n\n    filename = haofname(email);\n\n    if (isfile(filename))\n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n\tif ((fp = fopen(filename, \"w\")) == NULL) { /* AUDIT biege: where? */\n\t    snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...\", lang[MSG_WRITING_HAOF], filename);\n\n#ifdef HAVE_ICONV\n\tfprintf(fp, \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\\n\");\n#else\n\tfprintf(fp, \"<?xml version=\\\"1.0\\\" encoding=\\\"ISO-8859-15\\\"?>\\n\\n\");\n#endif\n\tfprintf(fp, \"  <!DOCTYPE haof PUBLIC \" \"\\\"-//Bernhard Reiter//DTD HOAF 0.2//EN\\\"\\n\" \"\\\"http://ffii.org/~breiter/probe/haof-0.2.dtd\\\">\\n\\n\");\n\tfprintf(fp, \"  <haof version=\\\"0.2\\\">\\n\\n\");\n\tfprintf(fp, \"      <archiver name=\\\"hypermail\\\" version=\\\"\" VERSION \".pl\" PATCHLEVEL \"\\\" />\\n\\n\");\n\n    print_haof_indices(fp, email ? email->subdir : NULL);\n\t    \n    fprintf(fp, \"  <mails>\\n\");\n    printhaofitems(fp, datelist, -1, -1, email);\n    fprintf(fp, \"  </mails>\\n\");\n    fprintf(fp, \"  </haof>\\n\");\n\n    fclose(fp);\n\n    if (newfile && chmod(filename, set_filemode) == -1) {\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename, set_filemode);\n\tprogerr(errmsg);\n    }\n    free(filename);\n\n    if (set_showprogress)\n\tputchar('\\n');\n}\n\n\n\n\nstatic int count_messages(struct header *hp, int year, int mo, long *first_date, long *last_date)\n{\n    if (hp != NULL) {\n\tstruct emailinfo *em = hp->data;\n\tint cnt = count_messages(hp->left, year, mo, first_date, last_date);\n\tif ((year == -1 || year_of_datenum(em->date) == year)\n\t    && (mo == -1 || month_of_datenum(em->date) == mo)\n\t    && !em->is_deleted) {\n\t    ++cnt;\n\t    if (em->date < *first_date)\n\t        *first_date = em->date;\n\t    if (em->date > *last_date)\n\t        *last_date = em->date;\n\t}\n\treturn cnt + count_messages(hp->right, year, mo, first_date, last_date);\n    }\n    return 0;\n}\n\nstatic void printmonths(FILE *fp, char *summary_filename, int amountmsgs)\n{\n    int first_year = year_of_datenum(firstdatenum);\n    int last_year = year_of_datenum(lastdatenum);\n    int y, j, m;\n    char *save_name[NO_INDEX];\n    char *subject = lang[set_monthly_index ? MSG_MONTHLY_INDEX : MSG_YEARLY_INDEX];\n\n    for (j = 0; j <= AUTHOR_INDEX; ++j)\n\tsave_name[j] = index_name[0][j];\n    print_index_header(fp, set_label, set_dir, subject, summary_filename);\n    fprintf(fp, \"<table>\\n\");\n    for (y = first_year; y <= last_year; ++y) {\n\t\tfor (m = (set_monthly_index ? 0 : -1); m < (set_monthly_index ? 12 : 0); ++m) {\n\t    char month_str[80];\n\t    char month_str_pub[80];\n\t    int started_line = 0;\n\t    int empties = 0;\n\t    char period_bufs[NO_INDEX][MAXFILELEN];\n\t    long first_date = lastdatenum;\n\t    long last_date = firstdatenum;\n\t    int count;\n\t    if (!datelist->data)\n\t        continue;\n\t    count = count_messages(datelist, y, m, &first_date, &last_date);\n\t    if (set_monthly_index) {\n\t\tsprintf(month_str_pub, \"%s %d\", months[m], y);\n\t\tsprintf(month_str, \"%d%.2d\", y, m + 1);\n\t    }\n\t    else {\n\t\tsprintf(month_str_pub, \"%d\", y);\n\t\tsprintf(month_str, \"%d\", y);\n\t    }\n\t    for (j = 0; j <= AUTHOR_INDEX; ++j) {\n\t\tsprintf(period_bufs[j], \"%sby%s\", month_str, save_name[j]);\n\t\tindex_name[0][j] = period_bufs[j];\n\t    }\n\t    for (j = 0; j <= AUTHOR_INDEX; ++j) {\n\t\tchar *filename;\n\t\tchar buf1[MAXFILELEN];\n\t\tFILE *fp1;\n\t\tchar *prev_text = \"\";\n\t\tchar subject_title[128];\n\t\tif (!show_index[0][j])\n\t\t    continue;\n\t\tsnprintf(buf1, sizeof(buf1), \"%sby%s\", month_str, save_name[j]);\n\t\tfilename = htmlfilename(buf1, NULL, \"\");\n\t\tfp1 = fopen(filename, \"w\");\n\t\tif (!fp1) {\n\t    \t    snprintf(errmsg, sizeof(errmsg), \"can't open %s\", filename);\n\t\t    progerr(errmsg);\n\t\t}\n\t\tsnprintf(subject_title, sizeof(subject_title), \"%s %s\", month_str_pub, indextypename[j]);\n\t\tprint_index_header(fp1, set_label, set_dir, subject_title, filename);\n\t\t/* \n\t\t * Print out the index page links \n\t\t */\n\t\tprint_index_header_links(fp1, j, first_date, last_date, count, NULL);\n\t\t\n\t\tif (set_indextable) {\n\t\t    fprintf(fp1, \"<div class=\\\"center\\\">\\n<table>\\n<tr><td><strong>%s</strong></td><td><strong>%s</strong></td><td><strong> %s</strong></td></tr>\\n\", lang[j == AUTHOR_INDEX ? MSG_CAUTHOR : MSG_CSUBJECT], lang[j == AUTHOR_INDEX ? MSG_CSUBJECT : MSG_CAUTHOR], lang[MSG_CDATE]);\n\t\t}\n\t\telse {\n\t\t    fprintf(fp1, \"<ul>\\n\");\n\t\t}\n\t\tswitch (j) {\n\t\t    case DATE_INDEX:\n\t\t      {\n\t\t\tchar prev_date_str[DATESTRLEN + 40];\n\t\t\tprev_date_str[0] = '\\0';\n\t\t        printdates(fp1, datelist, y, m, NULL, prev_date_str);\n\t\t\tif (*prev_date_str)  /* close the previous date item */\n\t\t\t  fprintf (fp, \"</ul></li>\\n\");\n\t\t\tbreak;\n\t\t      }\n\t\t    case THREAD_INDEX:\n\t\t        print_all_threads(fp1, y, m, NULL);\n\t\t\tbreak;\n\t\t    case SUBJECT_INDEX:\n\t\t\tprintsubjects(fp1, subjectlist, &prev_text, y, m, NULL);\n\t\t\tbreak;\n\t\t    case AUTHOR_INDEX:\n\t\t        printauthors(fp1, authorlist, &prev_text, y, m, NULL);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (set_indextable) {\n\t\t    fprintf(fp1, \"</table>\\n</div>\\n\");\n\t\t}\n\t\telse {\n\t\t    fprintf(fp1, \"</ul>\\n\");\n\t\t}\n\n\t\t/* \n\t\t * Print out archive information links at the bottom \n\t\t * of the index page\n\t\t */\n\n\t\tprint_index_footer_links(fp1, j, last_date, count, NULL);\n\n\t\tprintfooter(fp1, ihtmlfooterfile, set_label, set_dir, subject_title, \n\t\t\t    save_name[j], FALSE);\n\t\tfclose(fp1);\n\t\tif (!count) {\n\t\t    remove(filename);\n\t\t    if (started_line)\n\t\t        fprintf(fp, \"<td></td>\");\n\t\t    else\n\t\t\t++empties;\n\t\t}\n\t\telse {\n\t\t    if (!started_line) {\n\t\t\tfprintf(fp, \"<tr><td>%s</td><td>%d %s</td>\", month_str_pub, count, lang[MSG_ARTICLES]);\n\t\t\twhile (empties--)\n\t\t\t    fprintf(fp, \"<td></td>\");\n\t\t\tstarted_line = 1;\n\t\t    }\n\t\t    chmod(filename, set_filemode);\n\t\t    fprintf(fp, \"<td><a href=\\\"%sby%s\\\">%s</a></td>\", month_str, save_name[j], indextypename[j]);\n\t\t}\n\t\tfree(filename);\n\t    }\n\t    if (started_line)\n\t\tfprintf(fp, \"</tr>\\n\");\n\t}\n    }\n\tfprintf(fp, \"</table>\\n\");\n\tprintfooter(fp, ihtmlfooterfile, set_label, set_dir, subject, summary_filename, FALSE);\n    for (j = 0; j <= AUTHOR_INDEX; ++j)\n\tindex_name[0][j] = save_name[j];\n}\n\nvoid init_index_names(void)\n{\n    indextypename[DATE_INDEX] = lang[MSG_BY_DATE];\n    indextypename[THREAD_INDEX] = lang[MSG_BY_THREAD];\n    indextypename[SUBJECT_INDEX] = lang[MSG_BY_SUBJECT];\n    indextypename[AUTHOR_INDEX] = lang[MSG_BY_AUTHOR];\n    indextypename[ATTACHMENT_INDEX] = lang[MSG_ATTACHMENT];\n}\n\nvoid write_summary_indices(int amount_new)\n{\n\tif (set_monthly_index || set_yearly_index) {\n\t\tchar *filename;\n\t\tFILE *fp;\n\t\tfilename = htmlfilename(\"summary\", NULL, set_htmlsuffix);\n\t\tfp = fopen(filename, \"w\");\t/* AUDIT biege: where? */\n\t\tif (!fp) {\n\t\t\tsnprintf(errmsg, sizeof(errmsg), \"Couldn't write \\\"%s\\\".\", filename);\n\t\t\tprogerr(errmsg);\n\t\t}\n\t\tprintmonths(fp, filename, amount_new);\n\t\tfclose(fp);\n\t\tchmod(filename, set_filemode);\n\t\tfree(filename);\n\t}\n}\n\nvoid write_toplevel_indices(int amountmsgs)\n{\n    int i, j, newfile, offset, k;\n    bool first = TRUE;\n    struct emailsubdir *sd;\n    char *subject = lang[MSG_FOLDERS_INDEX];\n    static char verbose_period_name[DATESTRLEN*2 + 1];\n    static char abbr_period_name[DATESTRLEN*2 + 1];\n    char *end_date;\n    char *index_title;\n    char *filename;\n    char *saved_set_dateformat;\n    char *abbr_dateformat = set_describe_folder != NULL ?\n\t\t\t\t\tset_describe_folder : \"%d %b %Y\";\n    char *verbose_dateformat = \"%A, %e %B %Y\";\n\n    char *tmpstr;\n\n    FILE *fp;\n\n    filename = htmlfilename(index_name[0][FOLDERS_INDEX], NULL, \"\");\n    if (isfile(filename)) \n\tnewfile = 0;\n    else\n\tnewfile = 1;\n\n    if (!show_index[0][FOLDERS_INDEX])\n\tfp = NULL;\n    else if ((fp = fopen(filename, \"w\")) == NULL) {\n        snprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\".\", lang[MSG_COULD_NOT_WRITE], filename);\n\tprogerr(errmsg);\n    }\n    if (fp) {\n      print_index_header(fp, set_label, set_dir, subject, filename);\n      print_index_header_links(fp, FOLDERS_INDEX, firstdatenum, lastdatenum, amountmsgs, NULL);\n      fprintf (fp, \"</div>\\n\");\n      fprintf(fp, \"<table>\\n\");\n\n      /* find which element of index_name is the default index */\n      offset = 0;\n      if (set_defaultindex) {\n\ttmpstr = setindex(INDEXNAME, INDEXNAME, set_htmlsuffix);\n\tfor (j = 0; j <= ATTACHMENT_INDEX; ++j) {\n\t  if (0 == strcmp(tmpstr, index_name[1][j])) {\n\t    offset = j;\n\t    break;\n\t  }\n\t}\n      }\n\n      for (i = 0, j = 0; j <= ATTACHMENT_INDEX; ++j) {\n\tif (show_index[1][j])\n\t  i++;\n      }\n      /* not sure if the following -- for computing the colspan is correct will work\n\t with all configurations. */\n      if (i > 0)\n\ti--;\n      fprintf(fp, \"<thead>\\n  <tr>\\n\"\n\t      \"    <th>%s</th>\\n    <th colspan=\\\"%d\\\">%s</th>\\n\"\n\t      \"    <th align=\\\"right\\\" class=\\\"count\\\">%s</th>\\n\"\n\t      \"  </tr>\\n</thead>\\n\"\n\t      \"<tbody>\\n\", lang[MSG_PERIOD], i, lang[MSG_RESORTED], \n\t      lang[MSG_ARTICLES]);\n    }\n    sd = folders;\n    if (set_reverse_folders)\n\twhile (sd->next_subdir)\n\t    sd = sd->next_subdir;\n    saved_set_dateformat = set_dateformat;\n    for (; sd != NULL; sd = set_reverse_folders ? sd->prior_subdir : sd->next_subdir) {\n\tint started_line = 0;\n\tif (!datelist->data)\n\t    continue;\n\tfor (j = 0; j <= ATTACHMENT_INDEX; ++j) {\n            /* apply offset so the period column's href points to index.html */\n\t    k = (j + offset) % (ATTACHMENT_INDEX + 1);\n\t    if (!show_index[1][k])\n\t\tcontinue;\n\t    set_dateformat = saved_set_dateformat;\n\t    switch (k) {\n\t\tcase DATE_INDEX:\n\t\t    writedates(sd->count, sd->first_email);\n\t\t    index_title = lang[MSG_LTITLE_LISTED_BY_DATE];\n\t\t    break;\n\t        case THREAD_INDEX:\n\t\t    writethreads(sd->count, sd->first_email);\n\t\t    index_title = lang[MSG_LTITLE_DISCUSSION_THREADS];\n\t\t    break;\n\t        case SUBJECT_INDEX:\n\t\t    writesubjects(sd->count, sd->first_email);\n\t\t    index_title = lang[MSG_LTITLE_LISTED_BY_SUBJECT];\n\t\t    break;\n\t\tcase AUTHOR_INDEX:\n\t\t    writeauthors(sd->count, sd->first_email);\n\t\t    index_title = lang[MSG_LTITLE_LISTED_BY_AUTHOR];\n\t\t    break;\n\t\tcase ATTACHMENT_INDEX:\n\t\t    writeattachments(sd->count, sd->first_email);\n\t\t    index_title = lang[MSG_LTITLE_LISTED_BY_ATTACHMENT];\n\t\t    break;\n  \t        default:\n\t\t    index_title = \"\";\n\t\t    break;\n\t    }\n\t    if (set_writehaof)\n\t        writehaof(sd->count, sd->first_email);\n\n\t    if (!fp)\n\t        continue;\n\n\t    if (!started_line) {\n\t      time_t first_date = sd->first_email->fromdate;\n\t      time_t last_date = sd->last_email->fromdate;\n\t      if (set_use_sender_date) {\n\t\t  first_date = sd->first_email->date;\n\t\t  last_date = sd->last_email->date;\n\t      }\n\t      set_dateformat = verbose_dateformat;\n\t      strcpy (verbose_period_name, getdatestr (first_date));\n\t      set_dateformat = abbr_dateformat;\n\t      strcpy (abbr_period_name, getdatestr (first_date));\n\t      end_date = getdatestr (last_date);\n\t      if (strcmp (abbr_period_name, end_date)) {\n\t\tstrcat (abbr_period_name, lang[MSG_TO]);\n\t\tstrcat (abbr_period_name, end_date);\n\t\t/* do the same thing for the verbose one */\n\t\tset_dateformat = verbose_dateformat;\n\t\tend_date = getdatestr (last_date);\n\t\tstrcat (verbose_period_name, lang[MSG_TO]);\n\t\tstrcat (verbose_period_name, end_date);\n\t      }\n\t      fprintf(fp, \"  <tr%s>\\n    <td scope=\\\"row\\\" class=\\\"period\\\" align=\\\"left\\\">%s\",\n\t\t      (first) ? \" class=\\\"first\\\"\" : \"\",\n\t\t      (first) ? \"<a name=\\\"first\\\" id=\\\"first\\\"></a>\" : \"\");\n\t      /* only add a link to the index if it is not empty */\n\t      if (sd->count > 0)\n\t\tfprintf (fp, \"<a title=\\\"%s %s\\\" href=\\\"%s%s\\\">\",\n\t\t\t verbose_period_name, index_title, \n\t\t\t sd->subdir, index_name[1][k]);\n\t      fprintf (fp, \"%s\", abbr_period_name);\n\t      if (sd->count > 0)\n\t\tfprintf (fp, \"</a>\");\n\t      fprintf (fp, \"</td>\\n\");\n\t      if (first)\n\t\tfirst = FALSE;\n\t      started_line = 1;\n\t    } \n\t    else {\n\t      fprintf(fp, \"    <td>\");\n\t      /* only add a link to the index if it is not empty */\n\t      if (sd->count > 0)\n\t\tfprintf (fp, \"<a title=\\\"%s %s\\\" href=\\\"%s%s\\\">\",\n\t\t\t verbose_period_name, index_title, \n\t\t\t sd->subdir, index_name[1][k]);\n\t      fprintf (fp, \"%s\", indextypename[k]);\n\t      if (sd->count > 0)\n\t\tfprintf (fp, \"</a>\");\n\t      fprintf (fp, \"</td>\\n\");\n\t    }\n\t}\n\tif (started_line && fp)\n\t    fprintf(fp, \"    <td align=\\\"right\\\" class=\\\"count\\\">%d</td>\\n  </tr>\\n\", sd->count);\n    }\n    set_dateformat = saved_set_dateformat;\n\n    if (fp) {\n      fprintf(fp, \"</tbody>\\n</table>\\n\");\n      \n      /* \n       * Print out archive information links at the bottom of the index\n       */\n      print_index_footer_links(fp, FOLDERS_INDEX, lastdatenum, amountmsgs, NULL);\n      printfooter(fp, ihtmlfooterfile, set_label, set_dir, subject, filename, TRUE);\n      fclose(fp);\n      \n      if (newfile && chmod(filename, set_filemode) == -1) {\n\tsnprintf(errmsg, sizeof(errmsg), \"%s \\\"%s\\\": %o.\", lang[MSG_CANNOT_CHMOD], filename,\n\t\t set_filemode);\n\tprogerr(errmsg);\n\t}\n    }\n    free(filename);\n}\n\n/*\n** This writes out the message index... a file giving the old msgno\n** and the hash string that corresponds to it.\n*/\nvoid write_messageindex(int startnum, int maxnum)\n{\n    int num;\n    struct emailinfo *email;\n\n    FILE *fp;\n    char *filename;\n    char *buf;\n\n    struct body *bp;\n\n    if (set_showprogress)\n\tprintf(\"%s \\\"%s\\\"...    \", lang[MSG_WRITING_ARTICLES], set_dir);\n\n    /* write the intial message and number of messages in the index */\n\tfilename = messageindex_name();\n\tfp = fopen(filename, \"w\");\n\tfprintf(fp, \"%.04d %.04d\\n\", startnum, maxnum - 1);\n\n    /* write the reference to the message filenames */\n    num = startnum;\n    while (num <  maxnum) {\n\t\tif ((bp = hashnumlookup(num, &email)) != NULL) {\n\t  buf = message_name(email);\n\t  fprintf(fp, \"%.04d %s\\n\", num, buf);\n\t}\n      num++;\n    }\n    fclose(fp);\n    chmod(filename, set_filemode);\n    free(filename);\n} /* end write_messageindex () */\n"
  },
  {
    "path": "src/print.h",
    "content": "/*\n** print.c functions\n*/\n\n#ifdef GDBM\nint togdbm(void *gp, struct emailinfo *);\n#endif\n\nvoid printcomment(FILE *, char *, char *);\nvoid print_headers(FILE *, struct emailinfo *, int);\nint print_links(FILE *, struct emailinfo *, int, int);\nvoid printbody(FILE *, struct emailinfo *, int, int);\nchar *print_leading_whitespace(FILE *, char *);\n\nvoid update_deletions(int);\nvoid writearticles(int, int);\nvoid writedates(int, struct emailinfo *);\nvoid writesubjects(int, struct emailinfo *);\nvoid writethreads(int, struct emailinfo *);\nvoid writeauthors(int, struct emailinfo *);\nvoid writehaof(int, struct emailinfo *);\n\nvoid writeattachments(int, struct emailinfo *);\n\nvoid printdates(FILE *, struct header *, int, int, struct emailinfo *, char *);\nvoid printsubjects(FILE *, struct header *, char **, int, int,\n\t\t   struct emailinfo *);\nvoid printauthors(FILE *, struct header *, char **, int, int,\n\t\t  struct emailinfo *);\nint printattachments(FILE *, struct header *, struct emailinfo *, bool *);\n\nint checkreplies(FILE *, int, int level, int thread_file_depth);\nvoid fprint_menu(FILE *, mindex_t, char *, char *, char *, int,\n\t\t struct emailsubdir *);\nvoid fprint_menu0(FILE *fp, struct emailinfo *email, int);\nvoid fprint_summary(FILE *, int, long, long, int);\nvoid print_index_header_links(FILE *, mindex_t, long, long, int,\n\t\t\t      struct emailsubdir *);\nvoid print_index_footer_links(FILE *, mindex_t, long, int,\n\t\t\t      struct emailsubdir *);\nvoid printhtml(FILE *, char *);\nint showheader(char *);\nvoid ConvURLs(FILE *, char *, char *, char *, char *);\nchar *ConvURLsString(char *, char *, char *, char *);\nvoid write_summary_indices(int);\nvoid write_toplevel_indices(int);\nstruct emailinfo *nextinthread(int);\nvoid init_index_names(void);\n\nvoid write_messageindex (int, int);\n"
  },
  {
    "path": "src/printfile.c",
    "content": "#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"print.h\"\n#include \"printfile.h\"\n#include \"struct.h\"\n\n/*\n** printfile - print html header/footer file and fill in values \n**             substituting for magic cookies. Return allocated\n**             memory with the header/footer filled in.\n**\n**      Substitution cookies supported\n**\n**              %% - '%' character\n**              %~ - storage directory\n**              %a - Other Archives URL\n**              %b - About Archive URL\n**              %c - Charset META TAG - Not valid on index pages\n**              %e - email addr of message author - Not valid on index pages\n**              %f - file name of the HTML document\n**              %g - date and time archive generated\n**              %h - HMURL\n**              %i - Message-id - Not valid on index pages\n**              %l - archive label\n**              %m - Mailto address\n**              %p - PROGNAME\n**              %s - Subject of message or Index Title\n**              %t - path to top directory (\"\" if no folders; usually \"../\",\n**                                          sometimes \"../../\" with folders)\n**              %v - VERSION\n**              %u - Expanded version link (HMURL,PROGNAME,VERSION)\n**              %S - Subject META TAG - Not valid on index pages\n**              %A - Author META TAG - Not valid on index pages\n**              %D - Date META TAG - Not valid on index pages\n**              %G - Two character language\n**              \\n - newline character\n**              \\t - tab character\n**\n*/\n\nint printfile(FILE *fp, char *format, char *label, char *subject,\n\t      char *dir, char *name, char *email, char *message_id,\n\t      char *charset, char *date, char *filename)\n{\n    register char *cp;\n    register char *aptr;\n    char c;\n    char *ptr,*tmpptr=NULL;\n    size_t tmplen;\n\n    aptr = format;\n\n    while ((c = *aptr++)) {\n\tif (c == '\\\\') {\n\t    switch (*aptr++) {\n\t    case 'n':\t\t/* Add the \\n character */\n\t\tputc('\\n', fp);\n\t\tcontinue;\n\t    case 't':\t\t/* Add the \\t character */\n\t\tputc('\\t', fp);\n\t\tcontinue;\n\t    default:\n\t\tbreak;\n\t    }\t\t\t/* end switch */\n\t}\n\telse if (c == '%') {\n            char nextone = *aptr++;\n\t    switch (nextone) {\n\t    case '%':\t\t/* Add the % character */\n\t\tputc('%', fp);\n\t\tcontinue;\n\t    case '~':\t\t/* %~ - storage directory */\n\t\tfor (cp = dir; *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 'A':\t\t/* %e - email address of message author */\n\t\tif (email && name) {\n#ifdef HAVE_ICONV\n\t\t  tmpptr=i18n_convstring(name,\"UTF-8\",charset,&tmplen);\n\t\t  cp = convchars(tmpptr,charset);\n\t\t  if(tmpptr)\n\t\t    free(tmpptr);\n\t\t  fprintf(fp,\n\t\t\t\"<meta name=\\\"Author\\\" content=\\\"%s (%s)\\\" />\",\n\t\t\tcp, obfuscate_email_address(email));\n\t\t  if (cp)\n\t\t    free(cp);\n#else\n\t\tfprintf(fp,\n\t\t\t\"<meta name=\\\"Author\\\" content=\\\"%s (%s)\\\" />\",\n\t\t\ttmpptr=convchars(name,charset), obfuscate_email_address(email));\n\t\tif (tmpptr)\n\t\t  free(tmpptr);\n#endif\n\t\t}\n\t\tcontinue;\n\t    case 'a':\t\t/* %a - Other Archives URL */\n\t\tif (set_archives) {\n\t\t    for (cp = set_archives; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'B':\n\t      printf(\"Warning: the %%B option has been disabled. Use a\\n\"\n\t\t     \"style sheet instead. See the INSTALL file for more info.\\n\");\n\t      continue;\n\t    case 'b':\t\t/* %b - About this archive URL */\n\t\tif (set_about) {\n\t\t    for (cp = set_about; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'c':\n\t\tif (charset && *charset) {\n\t\t    /* only output this if we have a charset */\n\t\t    fprintf(fp, \"<meta http-equiv=\\\"Content-Type\\\"\"\n\t\t\t    \" content=\\\"text/html; charset=%s\\\" />\\n\",\n\t\t\t    charset);\n\t\t}\n\t\tcontinue;\n\n\t    case 'D':\t\t/* %D - date of message */\n\t\tif (date) {\n\t\t    fprintf(fp,\n\t\t\t    \"<meta name=\\\"Date\\\" content=\\\"%s\\\" />\",\n\t\t\t    date);\n\t\t}\n\t\tcontinue;\n\t    case 'e':\t\t/* %e - email address of message author */\n\t\tif (email) {\n\t\t    for (cp = email; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'f':\t\t/* %f - file name */\n\t\tif (filename) {\n\t\t    for (cp = filename; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'g':\t\t/* %g - date and time archive generated */\n\t\tfor (cp = getlocaltime(); *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 'G':\t\t/* %G - Language code */\n\t\tif (set_language) {\n\t\t    for (cp = set_language; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'h':\t\t/* %h - Hypermail Resource Center */\n\t\tfor (cp = HMURL; *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 'i':\t\t/* %m - Message-ID of message */\n\t\tif (message_id) {\n\t\t    for (cp = message_id; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'l':\t\t/* %l - Archive label  */\n\t\tfor (cp = label; *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 'm':\t\t/* %m - mailto */\n\t\tif (set_mailto) {\n\t\t    for (cp = set_mailto; *cp; cp++)\n\t\t\tputc(*cp, fp);\n\t\t}\n\t\tcontinue;\n\t    case 'p':\t\t/* %p - PROGNAME */\n\t\tfor (cp = PROGNAME; *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 's':\t\t/* %s - Subject of message or Index Title */\n\t\tfor (ptr = cp = convchars(subject, charset); *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tfree(ptr);\n\t\tcontinue;\n\t    case 'S':\t\t/* %s - Subject of message or Index Title */\n#ifdef HAVE_ICONV\n\t        tmpptr=i18n_convstring(subject,\"UTF-8\",charset, &tmplen);\n\t\tfprintf(fp, \"<meta name=\\\"Subject\\\" content=\\\"%s\\\" />\",\n\t\t\tcp = convchars(tmpptr,charset));\n#else\n\t\tfprintf(fp, \"<meta name=\\\"Subject\\\" content=\\\"%s\\\" />\",\n\t\t\tcp = convchars(subject, charset));\n#endif\n\t\tfree(cp);\n\t\tcontinue;\n\t    case 't':\n\t      {\n\t\tstruct emailinfo *ep;\n\t\tif(hashnumlookup(0, &ep))\n\t\t    fprintf(fp, ep->subdir ? ep->subdir->rel_path_to_top : \"\");\n\t\tcontinue;\n\t      }\n\t    case 'v':\t\t/* %v - VERSION */\n\t\tfor (cp = VERSION; *cp; cp++)\n\t\t    putc(*cp, fp);\n\t\tcontinue;\n\t    case 'u':\t\t/* %u - Expanded Version link */\n\t\tfprintf(fp, \"<a href=\\\"%s\\\">%s %s</a>\",\n\t\t\tHMURL, PROGNAME, VERSION);\n\t\tcontinue;\n\t    default:\n\t\tputc('%', fp);\n\t\tputc(nextone, fp);\n\t\tcontinue;\n\t    }\t\t\t/* end switch */\n\t}\n\tputc(c, fp);\n    }\t\t\t\t/* end while */\n\n    fflush(fp);\n    return (0);\n}\n\n/*\n** Prints the standard page header \n*/\n\nvoid print_main_header(FILE *fp, bool index_header, char *label, char *name,\n\t\t       char *email, char *subject, char *charset,\n\t\t       char *date, char *filename, int is_deleted, int annotation_robot)\n{\n    char *title;\n    char *rp;\n    char *rp2;\n\n    /* @@ JK: Don't know what to do with US-ASCII. If there's no charset,\n       assume the default one is ISO-8859-1 */\n    if (charset && *charset)\n      rp = charset;\n    else\n      rp = \"ISO-8859-1\";\n    fprintf(fp,\n\t    \"<?xml version=\\\"1.0\\\" encoding=\\\"%s\\\"?>\\n\"\n\t    \"<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\\n\"\n\t    \"    \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\">\\n\",\n\t    rp);\n    fprintf(fp, \"<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" lang=\\\"%s\\\">\\n\", set_language);\n    fprintf(fp, \"<head>\\n\");\n\n    if (charset && *charset) {\n\t/* charset info \"as early as possible within the HEAD of the document\"\n\t */\n\tfprintf(fp, \"<meta http-equiv=\\\"Content-Type\\\"\"\n\t\t\" content=\\\"text/html; charset=%s\\\" />\\n\", charset);\n    }\n    fprintf(fp, \"<meta name=\\\"generator\\\" content=\\\"%s %s, see %s\\\" />\\n\",\n                PROGNAME, VERSION, HMURL);\n\n    /* \n     * Strip off any trailing whitespace in TITLE so weblint is happy. \n     */\n\n    /* trio_asprintf(&title, \"%s: %s\", label, rp = convchars(subject, charset)); */\n    rp = convchars(subject, charset);\n    \n    if (name && date) {\n      /* assume that this is the title of a message and not the title of an index */\n      rp2 = convchars(name, charset);\n      trio_asprintf(&title, \"%s %s %s %s %s (%s)\", rp,\n\t\t    lang[MSG_FROM_TITLE], rp2, lang[MSG_ON_TITLE], date, label);\n      free(rp2);\n    }\n    else\n      trio_asprintf(&title, \"%s: %s\", label, rp);\n    free(rp);\n\n    rp = title + (strlen(title) - 1);\n    while (isspace(*rp))\n\t*rp-- = '\\0';\n\n    /* \n     * Assure the title meets HTML recommendations of no longer \n     * than 64 characters. Truncate it if needed.\n     *\n     * JK 13/Aug/2003: This more a style suggestion given in:\n     * http://www.w3.org/Provider/Style/TITLE.html\n     * As the title is truncated regardless of its contents, it can\n     * generate invalid HTML if the cut happens in the middle\n     * of an entity. Dom suggested not enforcing this rule of\n     * thumb so strictly in this case, so I commented it out.\n     */\n\n    /*\n      if (strlen(title) > 64)\n      *(title+64) = '\\0';\n      */\n\n    fprintf(fp, \"<title>%s</title>\\n\", (is_deleted) ? lang[MSG_SUBJECT_DELETED] : title);\n    free(title);\n\n    if (name && email){\n      fprintf(fp, \"<meta name=\\\"Author\\\" content=\\\"%s (%s)\\\" />\\n\",convchars(name,charset),obfuscate_email_address(email));\n    }\n    fprintf(fp, \"<meta name=\\\"Subject\\\" content=\\\"%s\\\" />\\n\", rp =\n\t    convchars(subject, charset));\n    free(rp);\n    if (date)\n\tfprintf(fp, \"<meta name=\\\"Date\\\" content=\\\"%s\\\" />\\n\",date);\n    if (use_mailto)\n\tfprintf(fp, \"<link rev=\\\"made\\\" href=\\\"mailto:%s\\\" />\\n\", set_mailto);\n\n    /* robot handling */\n    if (index_header && set_noindex_onindexes) {\n      fprintf(fp,\"<meta name=\\\"robots\\\" content=\\\"noindex\\\" />\\n\");\n\n    } else if (is_deleted || annotation_robot) {\n      char *value;\n\n      /* if the message is deleted, avoid bots, else set the value\n\t of the robots robots meta tag according to the info supplied by the message */\n      if (is_deleted)\n\tvalue = \"noindex\";\n      else if (annotation_robot == 1) \n\tvalue = \"nofollow\";\n      else if (annotation_robot == 2)\n\tvalue = \"noindex\";\n      else if (annotation_robot == 3)\n\tvalue = \"nofollow, noindex\";\n      fprintf(fp,\"<meta name=\\\"robots\\\" content=\\\"%s\\\" />\\n\", value);\n    }\n\n    /* print the css url according to the type of header */\n    if (index_header && set_icss_url && *set_icss_url) {\n      fprintf(fp, \"<link rel=\\\"stylesheet\\\" href=\\\"%s\\\" type=\\\"text/css\\\" />\\n\",\n              set_icss_url);\n\n    } else if (!index_header && set_mcss_url && *set_mcss_url) {\n      fprintf(fp, \"<link rel=\\\"stylesheet\\\" href=\\\"%s\\\" type=\\\"text/css\\\" />\\n\",\n              set_mcss_url);\n\n    } else {\n      /*\n       * if style sheets are not specified, emit a default one.\n       */\n       /* @@ JK: the new css */\n      fprintf (fp, \"<style type=\\\"text/css\\\">\\n\");\n      \n      fprintf (fp,\"/*<![CDATA[*/\\n\");\n      fprintf (fp, \"/* To be incorporated in the main stylesheet, don't code it in hypermail! */\\n\");\n      fprintf (fp, \"body {color: black; background: #ffffff;}\\n\");\n      fprintf (fp, \"dfn {font-weight: bold;}\\n\");\n      fprintf (fp, \"pre { background-color:inherit;}\\n\");\n      fprintf (fp, \".head { border-bottom:1px solid black;}\\n\");\n      fprintf (fp, \".foot { border-top:1px solid black;}\\n\");\n      fprintf (fp, \"th {font-style:italic;}\\n\");\n      fprintf (fp, \"table { margin-left:2em;}\");\n\n      /* JK: This was the WAI rule before */\n      /* fprintf (fp, \"#body {background-color:#fff;}\\n\"); */\n      fprintf (fp, \"map ul {list-style:none;}\\n\");\n      fprintf (fp, \"#mid { font-size:0.9em;}\\n\");\n      fprintf (fp, \"#received { float:right;}\\n\");\n      fprintf (fp, \"address { font-style:inherit;}\\n\");\n      fprintf (fp, \"/*]]>*/\\n\");\n      fprintf(fp, \".quotelev1 {color : #990099;}\\n\");\n      fprintf(fp, \".quotelev2 {color : #ff7700;}\\n\");\n      fprintf(fp, \".quotelev3 {color : #007799;}\\n\");\n      fprintf(fp, \".quotelev4 {color : #95c500;}\\n\");\n      fprintf (fp, \".period {font-weight: bold;}\\n\");\n      fprintf (fp, \"</style>\\n\");\n    }\n\n    if (ihtmlheadfile)\n      fprintf (fp, \"%s\", ihtmlheadfile);\n\n    fprintf(fp, \"</head>\\n\");\n    fprintf(fp, \"<body>\\n\");\n}\n\n/*\n** Prints the header for an index page.\n*/\n\nvoid print_msg_header(FILE *fp, char *label, char *subject,\n\t\t      char *dir, char *name, char *email, char *msgid,\n\t\t      char *charset, time_t date, char *filename,int is_deleted, \n\t\t      int annotation_robot)\n{\n    if (mhtmlheaderfile)\n\tprintfile(fp, mhtmlheaderfile, set_label, subject, set_dir, name, \n\t\t  email, msgid, charset, secs_to_iso_meta(date), filename);\n    else {\n\tprint_main_header(fp, FALSE, set_label, name, email, subject,\n\t\t\t  charset, secs_to_iso_meta(date), filename, is_deleted, \n\t\t\t  annotation_robot);\n    }\n}\n\n/*\n** Prints the header for the by_date index page.\n*/\n\nvoid print_index_header(FILE *fp, char *label, char *dir, char *subject,\n\t\t\tchar *filename)\n{\n    if (ihtmlheaderfile)\n#ifdef HAVE_ICONV\n      if (set_i18n){\n\tprintfile(fp, ihtmlheaderfile, label, subject, dir, NULL, NULL,\n\t\t  \"UTF-8\", NULL, NULL, filename);\n      }else{\n\tprintfile(fp, ihtmlheaderfile, label, subject, dir, NULL, NULL,\n\t\t  NULL, NULL, NULL, filename);\n      }\n#else\n\tprintfile(fp, ihtmlheaderfile, label, subject, dir, NULL, NULL,\n\t\t  NULL, NULL, NULL, filename);\n#endif\n    else {\n\t/* print the navigation bar to upper levels */\n#ifdef HAVE_ICONV\n        if (set_i18n){\n\t  print_main_header(fp, TRUE, label, NULL, NULL, subject, \"UTF-8\", NULL, NULL, 0, 0);\n\t} else{\n\t  print_main_header(fp, TRUE, label, NULL, NULL, subject, NULL, NULL, NULL, 0, 0);\n\t}\n#else\n        print_main_header(fp, TRUE, label, NULL, NULL, subject, NULL, NULL, NULL, 0, 0);\n#endif\n\tfprintf (fp, \"<div class=\\\"head\\\">\\n\");\n\tif (ihtmlnavbar2upfile)\n\t  fprintf(fp, \"<map title=\\\"%s\\\" id=\\\"upper\\\">\\n%s</map>\\n\", \n\t\t  lang[MSG_NAVBAR2UPPERLEVELS], ihtmlnavbar2upfile);\n\n\tfprintf(fp, \"<h1>%s %s</h1>\\n\", label, subject);\n    }\n}\n\n/*\n** Prints the HTML page footer.\n*/\n\nvoid printfooter(FILE *fp, char *htmlfooter, char *label, char *dir,\n\t\t char *subject, char *filename, bool close_div)\n{\n    printcomment(fp, \"trailer\", \"footer\");\n\n    if (htmlfooter)\n\tprintfile(fp, htmlfooter, label, subject,\n\t\t  dir, NULL, NULL, NULL, NULL, NULL, filename);\n    else {\n\tfprintf(fp, \"<p><small><em>\\n\");\n\tfprintf(fp, \"%s \", lang[MSG_ARCHIVE_GENERATED_BY]);\n\tfprintf(fp, \"<a href=\\\"%s\\\">%s %s</a>\\n\", HMURL, PROGNAME, VERSION);\n\tfprintf(fp, \": %s\\n\", getlocaltime());\n\tfprintf(fp, \"</em></small></p>\\n\");\n    }\n    if (close_div)\n      fprintf (fp, \"</div>\\n\");\n    fprintf(fp, \"</body>\\n</html>\\n\");\n}\n\n/*\n** Prints the HTML last message and last archived date (used in the indexes).\n*/\n\nvoid printlaststats (FILE *fp, long lastdatenum)\n{\n    fprintf (fp, \"<ul>\\n\");\n    fprintf (fp, \"<li><dfn><a id=\\\"end\\\" name=\\\"end\\\">%s</a></dfn>: <em>%s</em></li>\\n\",\n\t     lang[MSG_LAST_MESSAGE_DATE], getdatestr(lastdatenum));\n\n    fprintf (fp, \"<li><dfn>%s</dfn>: %s</li>\\n\",  lang[MSG_ARCHIVED_ON], getlocaltime());\n    fprintf (fp, \"</ul>\\n\");\n}\n"
  },
  {
    "path": "src/printfile.h",
    "content": "/*\n** printfile.c functions\n*/\n\nint printfile(FILE *, char *, char *, char *, char *, char *, char *, \n              char *, char *, char *, char *);\n\nvoid print_main_header(FILE *, bool, char *, char *, char *, char *, char *,\n\t\t       char *, char *, int, int);\n\nvoid print_msg_header(FILE *, char *, char *, char *, char *, char *, \n                      char *, char *, time_t, char *, int, int);\n\nvoid print_index_header(FILE *, char *, char *, char *, char *);\n\nvoid printfooter(FILE *, char *, char *, char *, char *, char *, bool);\n\nvoid printlaststats(FILE *, long);\n"
  },
  {
    "path": "src/proto.h",
    "content": "#ifndef __PROTO_H_\n#define __PROTO_H_ 1\n\n#include \"hypermail.h\"\n\n/*\n** Date functions - date.c\n*/\n\ntime_t convtoyearsecs(char *);\nchar *getlocaltime(void);\nvoid gettimezone(void);\nvoid getthisyear(void);\nchar *getdatestr(time_t);\nchar *getindexdatestr(time_t);\nchar *getdateindexdatestr(time_t);\nchar *secs_to_iso(time_t);\nchar *secs_to_iso_meta(time_t);\ntime_t iso_to_secs(char *);\nint year_of_datenum(time_t);\nint month_of_datenum(time_t);\n\n/*\n** domains.c\n*/\nint valid_root_domain(char *);\n\n\n/*\n** file.c functions\n*/\n\nint isdir(char *);\nint isfile(char *);\nvoid check1dir(char *);\nvoid checkdir(char *);\nchar *getfilecontents(char *);\nchar *add_char(char *, char);\nchar *add_string(char *, char *);\nchar *dirpath(char *);\n\nvoid readconfigs(char *, int);\n\nint find_max_msgnum(void);\nint is_empty_archive(void);\nvoid symlink_latest(void);\nstruct emailsubdir *msg_subdir(int, time_t);\nchar *msg_href(struct emailinfo *, struct emailinfo *, int);\nchar *msg_relpath(struct emailinfo *, struct emailinfo *);\nchar *articlehtmlfilename(struct emailinfo *);\nchar *htmlfilename(const char *, struct emailinfo *, const char *);\nchar *haofname(struct emailinfo *);\nint matches_existing(int);\n\nchar *messageindex_name(void);\nint find_max_msgnum_id(void);\nchar **read_msgnum_id_table(int);\nvoid free_msgnum_id_table(char **, int);\nchar *message_name(struct emailinfo *);\n\n/*\n** hypermail.c functions\n*/\nvoid version(void);\nvoid progerr(char *);\nvoid cmderr(char *);\nvoid usage(void);\nchar *setindex(char *dfltindex, char *indextype, char *suffix);\n\n/*\n** lang.c function\n*/\nchar **valid_language(char *, char **);\n\n/*\n** lock.c functions\n*/\nvoid lock_archive(char *);\nvoid unlock_archive(void);\n\n/*\n** mem.c function\n*/\nvoid *emalloc(int);\n\n/*\n** setup.c functions\n*/\n#ifdef DEBUG\nvoid dump_config(void);\n#endif\n\n/*\n** string.c functions\n*/\nchar *obfuscate_email_address (char *);\nchar *unobfuscate_email_address (char *);\n\nchar *i18n_convstring(char *, char *, char *, size_t *);\nchar *i18n_utf2numref(char *, int);\nunsigned char *i18n_numref2utf(char *);\nint i18n_replace_non_ascii_chars(char *);\n\nchar *PushByte(struct Push *, char);\nchar *PushString(struct Push *, const char *);\nchar *PushNString(struct Push *, const char *, int);\n\nchar *strcasestr (const char *, const char *);\nchar *strsav(const char *);\nchar *strreplace(char *, char *);\nvoid strcpymax(char *, const char *, int);\nvoid strtolower (char *);\nchar *stripzone(char *);\nint numstrchr(char *, char);\nchar *getvalue(char *);\nchar *getconfvalue(char *, char *, char *);\nchar *unre(char *);\nchar *oneunre(char *);\nvoid rfc3676_trim_softlb(char *);\nchar *rfc3676_delsp_quotes(char *);\nint rfc3676_ishardlb(const char *);\nint isquote(const char *);\nchar *replace(char *, char *, char *);\nchar *replacechar(char *, char, char *);\nchar *convdash(char *);\nchar *convchars(char *, char *);\nchar *convcharsnospamprotect(char *, char *);\nchar *unconvchars(char *);\nchar *makemailcommand(char *, char *, char *, char *);\nchar *makeinreplytocommand(char *, char *, char *);\nchar *spamify(char *input);\nchar *spamify_small(char *input);\nchar *spamify_replacedomain(char *input, char *antispamdomain);\nchar *unspamify(char *);\nchar *parseemail(char *, char *, char *, parseemail_conversion_t);\nchar *parseurl(char *, char *);\n\nchar *hm_strchr(const char *, int);\nvoid iso2022_state(const char *str, int *state, int *esc);\n\n/*\n** quotes.c\n*/\nconst char *get_quote_prefix(void);\nconst char *find_quote_prefix(struct body *bp, int is_reply);\nchar *unquote(char *line);\nchar *remove_hypermail_tags(char *line);\nint compute_quoted_percent(struct body *bp);\nint is_sig_start(const char *line);\nint find_quote_depth(char *);\nchar *find_quote_class(char *);\n\n#ifdef NOTDEF\n#ifdef lint\nint isspace(int);\nint isalpha(int);\nint isalnum(int);\nint isxdigit(int);\n#endif\n#endif\n\n#endif\n"
  },
  {
    "path": "src/quotes.c",
    "content": "/*\n** Copyright (C) 1997, Peter McCluskey (pcm@rahul.net)\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"string.h\"\n#include <ctype.h>\n#if ! HAVE_MEMMOVE\n#include \"pcre/internal.h\"\n#endif\n\n#define MAX_QPREFIX_GUESSES 8\nstatic char quote_prefix[80];\n\nconst char *get_quote_prefix()\n{\n    return quote_prefix;\n}\n\nstatic int msg_linkp(char *p3, char *p)\n{\t\t/* has form <a href=\"{subdir/}nnnn.html\"> */\n    char *ptmp;\n    if(!(isdigit(p3[-4]) && isdigit(p3[-3])\n\t && isdigit(p3[-2]) && isdigit(p3[-1])))\n\treturn 0;\n    if (!set_msgsperfolder && !set_folder_by_date)\n\treturn p3[-5] == '\"';\n    ptmp = strstr(p, \"://\");\n    if (ptmp && ptmp < p3)\n\treturn 0;\n    return 1;\t/* ought to be more checks here, but they are not easy */\n}\n\n/*\n** Undo the html additions that prior hypermail run did to body\n** Returns NULL if line probably didn't exist in original ascii\n*/\n\nchar *remove_hypermail_tags(char *line)\n{\n    char *p, *p1;\n    const char *cp;\n    static int expect_end_anchor = 0;\n    char *buffer = NULL;\n\n    if (!strcasecmp(line, \"<p>\\n\"))\n\treturn strsav(\"\\n\");\n    else if (!strncasecmp(line, \"<i>\", 3)) {\n\tbuffer = strsav(line);\n\tmemmove(buffer, buffer + 3, strlen(buffer + 3) + 1);\n\tif ((p = strcasestr(buffer, \"</i><br />\\n\")) != NULL) {\n\t    strcpy(p, \"\\n\");\n\t}\n    }\n    else if (!strcasecmp(line, \"<br />\\n\"))\n\treturn NULL;\n    else if ((cp = strcasestr(line, \"<br />\\n\")) != NULL) {\n\tbuffer = strsav(line);\n\tstrcpy(strcasestr(buffer, \"<br />\\n\"), \"\\n\");\n    }\n    else if (!strcasecmp(line, \"<hr />\\n\"))\n\treturn\n\t    strsav(\"------------------------------------------------------------------------\");\n    else if (!strcasecmp(line, \"<pre>\\n\"))\n\treturn NULL;\n    else if (!strcasecmp(line, \"</pre>\\n\"))\n\treturn NULL;\n    else if (!strcasecmp(line, \"<ol>\\n\"))\n\treturn NULL;\n    else if (!strcasecmp(line, \"<ul>\\n\"))\n\treturn NULL;\n    else if (!strcasecmp(line, \"</ol>\\n\"))\n\treturn NULL;\n    else if (!strcasecmp(line, \"</ul>\\n\"))\n\treturn NULL;\n    if (!buffer)\n\tbuffer = strsav(line);\n    if ((p = strcasestr(buffer, \"<li>\")) != NULL) {\n\tconst char *p2 = p;\n\twhile (p2 > buffer && isspace(*--p2));\n\tif (p2 == buffer)\n\t    memmove(buffer, p + 4, strlen(p + 4) + 1);\n    }\n#if 0\n    \"^caps_tag/caps_tag\\n\"\n#endif\n\tif ((p = strcasestr(buffer, \"<a href=\\\"\")) != NULL) {\n\tchar *p2 = strchr(p, '>');\n\tchar *p3;\n\tchar *p4 = strstr(p, \"\\\">\");\n\tchar suf[80];\n\tsprintf(suf, \".%s\", set_htmlsuffix);\n\tp3 = strstr(p, suf);\n\tif (p2 && p3 && p4 && p2 == p4 + 1 && msg_linkp(p3, p)) {\n\t    memmove(p, p2 + 1, strlen(p2 + 1) + 1);\n\t    if ((p = strcasestr(p2, \"</a>\")) != NULL)\n\t\tmemmove(p, p + 4, strlen(p + 4) + 1);\n\t}\n\telse if (set_mailcommand) {\n\t    const char *p2 = set_mailcommand;\n\t    int len = strlen(p2);\n\t    if (strchr(p2, '$'))\n\t\tlen = strchr(p2, '$') - p2;\n\t    if (!strncmp(p + 9, p2, len)) {\n\t\tchar *p3 = strstr(p + 9 + len, \"\\\">\");\n\t\tif (p3) {\n\t\t    memmove(p, p3 + 2, strlen(p3 + 2) + 1);\n\t\t    p3 = strcasestr(p, \"</a>\");\n\t\t    if (p3)\n\t\t\tmemmove(p3, p3 + 4, strlen(p3 + 4) + 1);\n\t\t}\n\t    }\n\t}\n    }\n    while ((p = strcasestr(buffer, \"<a name=\\\"\")) && isdigit(p[9])\n\t   && isdigit(p[10]) && isdigit(p[11]) && isdigit(p[12])\n\t   && (p1 = strstr(p, \"qlink\"))) {\n\tconst char *p2 = strstr(p1, \"\\\">\");\n\tif (p2 && p < p2) {\n\t    memmove(p, p2 + 2, strlen(p2 + 2) + 1);\n\t    ++expect_end_anchor;\n\t}\n\telse\n\t    break;\n    }\n    if (expect_end_anchor && !strcasecmp(buffer, \"</a>\\n\")) {\n\t--expect_end_anchor;\n\tfree(buffer);\n\treturn NULL;\n    }\n    if (expect_end_anchor && (p = strcasestr(buffer, \"</a>\"))) {\n\t--expect_end_anchor;\n\tmemmove(p, p + 4, strlen(p + 4) + 1);\n    }\n    p = buffer;\n    while ((p = strstr(p, \"&nbsp;\")) != NULL) {\n\tmemmove(p + 1, p + 6, strlen(p + 6) + 1);\n\t*p = ' ';\t\t/* replace &nbsp; with space */\n    }\n    return buffer;\n}\n\nint is_sig_start(const char *line)\n{\n    return (!strcmp(line, \"--\\n\") ||\n\t    !strcmp(line, \"-- \\n\") ||\n\t    !strcmp(line, \"----\\n\") || !strcmp(line, \"---\\n\"));\n}\n\n/*\n** Look for something other than text at the start of a line that might be quote\n*/\n\nstatic const char *guess_quote(const char *line)\n{\n    static char buf[80];\n    int i = 0;\n    int found_printable = 0;\n    while (!isalnum(line[i]) && !(iscntrl(line[i]) && line[i] != '\\t')\n\t   && i < sizeof(buf) - 1) {\n\tif (!isspace(line[i]))\n\t    found_printable = 1;\n\tbuf[i] = line[i];\n\t++i;\n    }\n    if (!found_printable)\n\ti = 0;\n    buf[i] = 0;\n    if (i > 0 && buf[i - 1] == '<') {\n\tif (!strncasecmp(line + i - 1, \"<a href\", 7))\n\t    buf[i - 1] = 0;\n    }\n    return buf;\n}\n\n/*\n* Search through body for non-alphanumeric prefix most frequently used\n*/\n\nconst char *find_quote_prefix(struct body *bp,\n\t\t\t      int is_reply\n\t\t\t      /* have we already identified a message it's replying to? */\n\t\t\t      )\n{\n    char guess[MAX_QPREFIX_GUESSES][80];\n    int guess_times_found[MAX_QPREFIX_GUESSES];\n    int guess_partial_matches[MAX_QPREFIX_GUESSES];\n    int i;\n    int num_guesses = 0;\n    int best_index = -1;\n    int best_count = 0;\n    while (bp != NULL) {\n\tconst char *q_guess = guess_quote(bp->line);\n\tif (*q_guess) {\n\t    int match_index = -1;\n\t    for (i = 0; i < num_guesses; ++i) {\n\t\tif (!strcmp(guess[i], q_guess)) {\n\t\t    ++guess_times_found[i];\n\t\t    match_index = i;\n\t\t}\n\t\telse if (!strncmp(guess[i], q_guess, strlen(guess[i])))\n\t\t    ++guess_partial_matches[i];\n\t    }\n\t    if (match_index == -1 && num_guesses < MAX_QPREFIX_GUESSES) {\n\t\tstrncpy(guess[num_guesses], q_guess, sizeof(guess[i]));\n\t\tguess_times_found[num_guesses] = 1;\n\t\tif (strchr(q_guess, '>'))\t/* bias it to std */\n\t\t    guess_times_found[num_guesses] = 5;\n\t\tguess_partial_matches[num_guesses] = 0;\n\t\tfor (i = 0; i < num_guesses; ++i) {\n\t\t    if (!strncmp\n\t\t\t(guess[i], guess[num_guesses],\n\t\t\t strlen(guess[num_guesses])))\n\t\t\t    guess_partial_matches[num_guesses] += guess_times_found[i];\n\t\t}\n\t\t++num_guesses;\n\t    }\n\t}\n\tbp = bp->next;\n    }\n    for (i = 0; i < num_guesses; ++i) {\n\tif (guess_times_found[i] > best_count\n\t    || (guess_times_found[i] == best_count\n\t\t&& strlen(guess[i]) < strlen(guess[best_index]))) {\n\t    best_count = guess_times_found[i];\n\t    best_index = i;\n\t}\n    }\n    for (i = 0; i < num_guesses; ++i) {\n\tint pcount = guess_times_found[i] + guess_partial_matches[i];\n\tif (pcount > best_count + 1\n\t    && !strncmp(guess[best_index], guess[i], strlen(guess[i]))) {\n\t    best_count = pcount;\n\t    best_index = i;\n\t}\n    }\n    if (best_count == 1 && (!is_reply || !strchr(guess[best_index], '>'))) {\n\tfor (i = 0; i < num_guesses; ++i) {\n\t    if (i != best_index && guess_times_found[i] == best_count\n\t\t&& !strncmp(guess[i], guess[best_index],\n\t\t\t    strlen(guess[best_index]))) break;\t/* found guess pair like {\">\",\"> \"} */\n\t}\n\tif (i >= num_guesses)\n\t    best_index = -1;\t/* solitary example, give up */\n    }\n    if (best_index == -1)\n\tstrcpy(quote_prefix, \"\");\n    else\n\tstrncpy(quote_prefix, guess[best_index], sizeof(quote_prefix) - 1);\n    if (0)\n\tprintf(\"best_count %d has_replies %d quote_prefix=%s.\\n\",\n\t       best_count, is_reply, quote_prefix);\n    return quote_prefix;\n}\n\n/*\n** remove the prefix that was added by the quoting mechanism\n*/\n\nchar *unquote(char *line)\n{\n    if (*quote_prefix) {\n\tint len = strlen(quote_prefix);\n\tif (!strncmp(quote_prefix, line, len))\n\t    line += len;\n\treturn line;\n    }\n    else\n\treturn line;\n}\n\n/*\n * The find_quote_depth function assumes that the line is already known\n * to be quoted text. It returns the number of times the line has been\n * quoted if it decides that is easy to determine, otherwise 1.\n */\n\nint find_quote_depth(char *line)\n{\n    int cnt = 0;\n    if (*quote_prefix && !strchr(quote_prefix, '>'))\n\treturn 1;\t\t/* too hard to deal with nonstandard quotes */\n    for ( ; *line; ++line) {\n\tif (isspace(*line))\n\t    continue;\n\tif (*line == '>')\n\t    ++cnt;\n\telse break;\n    }\n    return cnt;\n}\n\nchar *find_quote_class(char *line)\n{\n    int quote_depth = find_quote_depth(line);\n    if (quote_depth > 4) quote_depth = ((quote_depth - 1) % 4) + 1;\n    if (quote_depth >= 4) return \"quotelev4\";\n    if (quote_depth >= 3) return \"quotelev3\";\n    if (quote_depth >= 2) return \"quotelev2\";\n    if (quote_depth >= 1) return \"quotelev1\";\n    return \"\";\n}\n\n/*\n** Find out what percent of the body consists of lines appearing\n** to be quotes of other messages.\n*/\n\nint compute_quoted_percent(struct body *bp)\n{\n    int inheader = 1;\n    int insig = 0;\n    int count_quoted = 0;\n    int count_lines = 0;\n    while (bp != NULL) {\n\tif ((bp->line)[0] == '\\n')\n\t    inheader = 0;\n\telse if (inheader) {\n\t    bp = bp->next;\n\t    continue;\n\t}\n\tif (is_sig_start(bp->line))\n\t    insig = 1;\n\n\tif (isquote(bp->line))\n\t    ++count_quoted;\n\t++count_lines;\n\tbp = bp->next;\n    }\n    if (!count_lines)\n\treturn 0;\n    return (int)(100 * count_quoted / (float)count_lines);\n}\n"
  },
  {
    "path": "src/search.c",
    "content": "/*\n** Copyright (C) 1997, Peter McCluskey (pcm@rahul.net)\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n#include \"hypermail.h\"\n#include <string.h>\n#include <assert.h>\n#include <ctype.h>\n#include \"proto.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"print.h\"\n#include \"search.h\"\n\nstatic int bigram_count = 0;\nstatic struct reply *replylist_tmp;\n\n#if 1\ntypedef unsigned long BIGRAM_TYPE;\nstatic const unsigned max_tokens = 400000; /* increase this if you have plenty of RAM */\n#else\t\t\t\t/* for systems with little RAM and archives less than 10 megs? */\ntypedef unsigned short BIGRAM_TYPE;\nstatic const unsigned max_tokens = 0xfff0;\n#endif\n\nstruct bigram_list {\n    struct body *bp;\n    short offset;\n    struct bigram_list *next;\n};\n\nstruct bigram_tree_entry {\n    struct bigram_tree_entry *left;\n    struct bigram_tree_entry *right;\n    struct bigram_list list;\n    BIGRAM_TYPE bigram1;\n    BIGRAM_TYPE bigram2;\n};\nstatic struct bigram_tree_entry *bigram_tree = NULL;\n\n#define MAXSEARCHTOKEN 26\nstruct search_text {\n    struct search_text *left;\n    struct search_text *right;\n#ifdef BY_TOKEN_STRING\n    char token[MAXSEARCHTOKEN];\n#else\n    int token_length;\n    unsigned int token_crc32;\n#endif\t\t\t\t/* !BY_TOKEN_STRING */\n    BIGRAM_TYPE itok;\n#ifdef COUNT_TOKEN_FREQ\n    int count;\n#endif\n};\nstatic struct search_text *text_tree = NULL;\nstatic BIGRAM_TYPE next_itoken = 1;\n\nstatic int start_time;\nstatic int tree_alloc = 0;\n\nstatic void add_old_replies(void);\nstatic void find_replyto_from_html(int num);\n\nvoid set_alt_replylist(struct reply *r)\n{\n    replylist_tmp = r;\n}\n\n/* change the order of itok entries for more balanced tree */\nstatic BIGRAM_TYPE reverse_bits(BIGRAM_TYPE i)\n{\n    BIGRAM_TYPE r = 0;\n    int j;\n    for (j = 0; j < 16; ++j)\n\tif (i & (1 << j))\n\t    r |= (1 << (16 - 1 - j));\n    return r;\n}\n\n#ifdef BY_TOKEN_STRING\n#define ENCODE_TOKEN(a)\tencode_token(a)\n#define COMPARE_TOKEN(a, b)\tstrcasecmp(a, (b)->token)\n#else\n#define ENCODE_TOKEN(a)\tencode_token((a), strlen(a))\n#define COMPARE_TOKEN(a, b)\ttoken_digest_order(token_length, token_crc32, (b))\n\nstatic int token_digest_order(const int token_length, const unsigned int token_crc32, const struct search_text *const p)\n{\n\treturn ((token_length > p->token_length) ? 1 : (token_length < p->token_length) ? -1 : (token_crc32 > p->token_crc32) ? 1 : (token_crc32 < p->token_crc32) ? -1 : 0);\n}\n\n/* crc32.c -- compute the CRC-32 of a data stream\n * Copyright (C) 1995 Mark Adler\n * For conditions of distribution and use, see copyright notice in zlib.h\n */\n/* zlib.h is available in /usr/include on many systems. I also see a copy at:\nhttp://sunsite.doc.ic.ac.uk/public/packages//NetBSD-current/src/lib/libz/zlib.h\n*/\n\nstatic unsigned int crc32_lower(register const unsigned char *buf,\t/* pointer to bytes to pump through */\n\t\t\t\tint len)\n{\t\t\t\t/* number of bytes in buf[] */\n    /* Run a set of bytes through the crc shift register.  If buf is a NULL\n       pointer, then initialize the crc shift register contents instead.\n       Return the current crc in either case. */\n    register unsigned int crc = 0;\t/* crc shift register */\n#ifdef CRC32\n#  undef CRC32\n#endif\n#define CRC32(c, b) (crc_table[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8))\n#define DO1(buf)  crc = CRC32(crc, tolower(*buf++))\n\n/* ========================================================================\n * Table of CRC-32's of all single-byte values (made by make_crc_table)\n */\n    static const unsigned int crc_table[] = {\n\t0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,\n\t0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,\n\t0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,\n\t0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,\n\t0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,\n\t0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,\n\t0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,\n\t0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,\n\t0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,\n\t0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,\n\t0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,\n\t0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,\n\t0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,\n\t0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,\n\t0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,\n\t0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,\n\t0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,\n\t0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,\n\t0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,\n\t0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,\n\t0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,\n\t0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,\n\t0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,\n\t0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,\n\t0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,\n\t0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,\n\t0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,\n\t0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,\n\t0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,\n\t0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,\n\t0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,\n\t0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,\n\t0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,\n\t0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,\n\t0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,\n\t0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,\n\t0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,\n\t0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,\n\t0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,\n\t0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,\n\t0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,\n\t0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,\n\t0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,\n\t0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,\n\t0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,\n\t0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,\n\t0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,\n\t0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,\n\t0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,\n\t0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,\n\t0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,\n\t0x2d02ef8dL\n    };\n\n    if (buf == NULL)\n\treturn 0L;\n\n    crc = crc ^ 0xffffffffL;\n    if (len)\n\tdo {\n\t    DO1(buf);\n\t} while (--len);\n    return crc ^ 0xffffffffL;\t/* (instead of ~c for 64-bit machines) */\n}\n#endif\t\t\t\t/* !BY_TOKEN_STRING */\n\nstatic int encode_token(const char *token\n#ifndef BY_TOKEN_STRING\n\t\t\t, const int token_length\n#endif\n    )\n{\n    struct search_text *p = text_tree;\n#ifndef BY_TOKEN_STRING\n    unsigned int token_crc32 = crc32_lower((const unsigned char *)token, token_length);\n#endif\n    int r;\n    while (1) {\n\tif (!p) {\n\t    return 0;\n\t}\n#ifdef BY_TOKEN_STRING\n\tr = COMPARE_TOKEN(token, p);\n#else\n\tr = token_length - p->token_length;\n\tif (!r)\n\t\t\tr = ((token_crc32 > p->token_crc32) ? 1 : (token_crc32 < p->token_crc32) ? -1 : 0);\n#endif\t\t\t\t/* !BY_TOKEN_STRING */\n\tif (!r)\n\t    return p->itok;\n\tif (r < 0)\n\t    p = p->left;\n\telse\n\t    p = p->right;\n    }\n}\n\nstatic int b_times_entered;\nstatic int b_loops_done;\n\nstatic int addb(const char *token, struct body *bp)\n{\n    struct search_text **pp = &text_tree;\n    struct search_text *p = *pp;\n    int r;\n#ifndef BY_TOKEN_STRING\n    int token_length = strlen(token);\n    unsigned int token_crc32 = crc32_lower((const unsigned char *)token, token_length);\n#endif\n    static struct search_text *next_token = NULL;\n    if (!text_tree) {\n\tnext_token = (struct search_text *)malloc(max_tokens * sizeof(struct search_text));\n\tif (!next_token) {\n\t    snprintf(errmsg, sizeof(errmsg), \"Couldn't allocate %d bytes of memory.\", max_tokens * sizeof(struct search_text));\n\t    progerr(errmsg);\n\t}\n\tmemset(next_token, 0, max_tokens * sizeof(struct search_text));\n    }\n    ++b_times_entered;\n    while (1) {\n\t++b_loops_done;\n\tp = *pp;\n\tif (!p) {\n\t    *pp = p = next_token++;\n\t    if (next_token >= text_tree + max_tokens) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"Too many distinct tokens(%d)\", max_tokens);\n\t\tprogerr(errmsg);\n\t    }\n\t    p->left = p->right = NULL;\n#ifdef BY_TOKEN_STRING\n\t    strncpy(p->token, token, MAXSEARCHTOKEN);\n\t    p->token[MAXSEARCHTOKEN - 1] = 0;\n#else\n\t    p->token_length = token_length;\n\t    p->token_crc32 = token_crc32;\n#endif\t\t\t\t/* !BY_TOKEN_STRING */\n\t    p->itok = reverse_bits(next_itoken++);\n#ifdef COUNT_TOKEN_FREQ\n\t    p->count = 1;\n#endif\n\t    if (!next_itoken >= max_tokens) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"Internal error - too many distinct tokens.\");\n\t\tprogerr(errmsg);\n\t    }\n\t    return p->itok;\n\t}\n\tr = COMPARE_TOKEN(token, p);\n\tif (!r) {\n#ifdef COUNT_TOKEN_FREQ\n\t    ++p->count;\n#endif\n\t    return p->itok;\n\t}\n\tif (r < 0)\n\t    pp = &p->left;\n\telse\n\t    pp = &p->right;\n    }\n}\n\nstatic int bi_times_entered;\n\n\nstatic void add_bigram(BIGRAM_TYPE b1, BIGRAM_TYPE b2, struct body *bp, char *ptr)\n{\n    static struct bigram_tree_entry *next_bigram = NULL;\n    struct bigram_tree_entry **pp = &bigram_tree;\n    struct bigram_tree_entry *p = *pp;\n    int r;\n    if (!bigram_tree) {\n\tif (0)\n\t    printf(\"bigram_count %d\\n\\n\", bigram_count);\n\t\tbigram_tree = (struct bigram_tree_entry *)malloc(bigram_count * sizeof(struct bigram_tree_entry));\n\tif (!bigram_tree) {\n\t\t\tsnprintf(errmsg, sizeof(errmsg), \"Couldn't allocate %d bytes of memory.\", bigram_count * sizeof(struct bigram_tree_entry));\n\t    progerr(errmsg);\n\t}\n\t\tmemset(bigram_tree, 0, bigram_count * sizeof(struct bigram_tree_entry));\n\tnext_bigram = bigram_tree;\n    }\n    ++bi_times_entered;\n    while (1) {\n\tp = *pp;\n\tif (!p) {\n\t    *pp = p = next_bigram++;\n\t    tree_alloc += sizeof(struct bigram_tree_entry);\n\t    p->bigram1 = b1;\n\t    p->bigram2 = b2;\n\t    p->left = p->right = NULL;\n\t    p->list.offset = ptr - bp->line;\n\t    p->list.bp = bp;\n\t    p->list.next = NULL;\n\t    return;\n\t}\n\tr = p->bigram1 - b1;\n\tif (!r && !(r = p->bigram2 - b2)) {\n\t    struct bigram_list *old = p->list.next;\n\t    p->list.next = (struct bigram_list *)next_bigram++;\n\t    p->list.next->next = old;\n\t    p->list.next->offset = p->list.offset;\n\t    p->list.next->bp = p->list.bp;\n\t    p->list.offset = ptr - bp->line;\n\t    p->list.bp = bp;\n\t    return;\n\t}\n\tif (r < 0)\n\t    pp = &p->left;\n\telse\n\t    pp = &p->right;\n    }\n}\n\nstatic struct bigram_list *find_bigram(BIGRAM_TYPE b1, BIGRAM_TYPE b2)\n{\n    struct bigram_tree_entry *p = bigram_tree;\n    int r;\n    while (1) {\n\tif (!p) {\n\t    return NULL;\n\t}\n\tr = p->bigram1 - b1;\n\tif (!r)\n\t    r = p->bigram2 - b2;\n\tif (!r) {\n\t    return &p->list;\n\t}\n\tif (r < 0)\n\t    p = p->left;\n\telse\n\t    p = p->right;\n    }\n}\n\nstatic struct body *next_body_pos(struct body *bp, char **ptr)\n{\n    ++*ptr;\n    while (!**ptr) {\n\tbp = bp->next;\n\tif (!bp)\n\t    return NULL;\n\t*ptr = bp->line;\n    }\n    return bp;\n}\n\nstruct body *tokenize_body(struct body *bp, char *token, char **ptr, int *bigram_index, int ignore)\n{\n    int i = 0;\n    static const char *ignore_words[] = {\n\t\"a\",\t\t\t/* 0 */\n\t\"i\",\t\t\t/* 1 */\n\tNULL,\t\t\t/* 2 */\n\t\"of\",\t\t\t/* 3 */\n\t\"is\",\t\t\t/* 4 */\n\t\"in\",\t\t\t/* 5 */\n\t\"it\",\t\t\t/* 6 */\n\t\"to\",\t\t\t/* 7 */\n\t\"be\",\t\t\t/* 8 */\n\t\"or\",\t\t\t/* 9 */\n\t\"on\",\t\t\t/* 10 */\n\t\"at\",\t\t\t/* 11 */\n\t\"by\",\t\t\t/* 12 */\n\t\"as\",\t\t\t/* 13 */\n\tNULL,\t\t\t/* 14 */\n\t\"the\",\t\t\t/* 15 */\n\t\"and\",\t\t\t/* 16 */\n\t\"you\",\t\t\t/* 17 */\n\t\"are\",\t\t\t/* 18 */\n\t\"for\",\t\t\t/* 19 */\n\tNULL,\t\t\t/* 20 */\n\t\"that\",\t\t\t/* 21 */\n\t\"with\",\t\t\t/* 22 */\n\tNULL\n    };\n#define MAX_IGNORE_LEN\t4\n    while (bp && **ptr && !isalnum(**ptr)) {\n\tbp = next_body_pos(bp, ptr);\n\t++*bigram_index;\n    }\n    if (!**ptr)\n\treturn NULL;\n    while (bp && isalnum(**ptr) && i < MAXLINE - 1) {\n\ttoken[i++] = **ptr;\n\tbp = next_body_pos(bp, ptr);\n\t++*bigram_index;\n\tif (bp && *ptr == bp->line)\n\t    break;\t\t/* just passed end of line, treat as end of word */\n\tif (ignore && **ptr == '\\'' && isalpha((*ptr)[1])) {\n\t    token[i++] = **ptr;\t/* contraction - treat as 1 word */\n\t    bp = next_body_pos(bp, ptr);\n\t    ++*bigram_index;\n\t}\n    }\n    token[i] = 0;\n    if (ignore) {\n\tswitch (i) {\n\tcase 1:\n\t    i = 0;\n\t    break;\n\tcase 2:\n\t    i = 3;\n\t    break;\n\tcase 3:\n\t    i = 15;\n\t    break;\n\tcase 4:\n\t    i = 21;\n\t    break;\n\tdefault:\n\t    i = 23;\n\t    break;\n\t}\n\tfor (; ignore_words[i]; ++i) {\n\t    if (!strcasecmp(token, ignore_words[i]))\n\t\treturn tokenize_body(bp, token, ptr, bigram_index, ignore);\n\t}\n    }\n    return bp;\n}\n\nstatic void add_search_text(struct body *bp, int msgnum)\n{\n    char *ptr = bp->line;\n    int bigram_index = 0;\n    char token[MAXLINE];\n    if (!start_time)\n\tstart_time = time(NULL);\n\twhile ((bp = tokenize_body(bp, token, &ptr, &bigram_index, TRUE)) != NULL) {\n\taddb(token, bp);\n\t++bigram_count;\n    }\n    if (0)\n\t\tprintf(\"avg b %d avg bi %d (%d) msgnum %d %d allocated %d elapsed %ld\\n\", b_loops_done / b_times_entered, 0, bi_times_entered, msgnum, tree_alloc / 1024, time(NULL) - start_time, next_itoken);\n}\n\nstatic void add_bigrams(struct body *bp, int msgnum)\n{\n    int last_itok = 0;\n    static int bigram_index = 0;\n#if 0\n    struct body *bp = hashnum_set_index(msgnum, bigram_index);\n#endif\n    char *ptr = bp->line;\n    char token[MAXLINE];\n    int itok;\n    if (!start_time)\n\tstart_time = time(NULL);\n\twhile ((bp = tokenize_body(bp, token, &ptr, &bigram_index, TRUE)) != NULL) {\n\titok = ENCODE_TOKEN(token);\n\tif (last_itok)\n\t    add_bigram(last_itok, itok, bp, ptr);\n\tbp->msgnum = msgnum;\n\tlast_itok = itok;\n    }\n    if (0 && b_times_entered && bi_times_entered)\n\t\tprintf(\"avg b %d msgnum %d %d allocated %d elapsed %ld\\n\", b_loops_done / b_times_entered, msgnum, tree_alloc / 1024, time(NULL) - start_time, next_itoken);\n}\n\nstatic void add_old_replies()\n{\n    struct reply *rp;\n    struct reply *rp2;\n    for (rp2 = replylist_tmp; rp2 != NULL; rp2 = rp2->next) {\n\tfor (rp = replylist; rp != NULL; rp = rp->next) {\t/* get rid of old guesses for where this links */\n\t    if (rp->frommsgnum == rp2->frommsgnum) {\n\t\trp->msgnum = rp2->msgnum;\n\t\trp->maybereply = 0;\n\t\tbreak;\n\t    }\n\t}\n\tif (!rp) {\n#ifdef FASTREPLYCODE\n\t    struct emailinfo *email2;\n\t    hashnumlookup(rp2->frommsgnum, &email2);\n\t\t\treplylist = addreply2(replylist, email2, rp2->data, 0, &replylist_end);\n#else\n\t\t\treplylist = addreply(replylist, rp2->frommsgnum, rp2->data, 0, &replylist_end);\n#endif\n\t}\n    }\n}\n\nstatic void find_replyto_from_html(int num)\n{\n    char *filename;\n    char line[MAXLINE];\n    FILE *fp;\n    char *ptr;\n    static const char *href_str = \"<a href=\\\"\";\n    struct emailinfo *ep;\n    if (!hashnumlookup(num, &ep))\n\treturn;\n    filename = articlehtmlfilename(ep);\n    if ((fp = fopen(filename, \"r\")) != NULL) {\n\twhile (fgets(line, MAXLINE, fp)) {\n\t    if ((ptr = strcasestr(line, lang[MSG_IN_REPLY_TO])) != NULL) {\n\t\tconst char *ptr2 = strcasestr(ptr, href_str);\n\t\tif (ptr2 != NULL) {\n\t\t    int msgn = atoi(ptr2 + strlen(href_str));\n#ifdef FASTREPLYCODE\n\t\t    struct emailinfo *email2;\n\t\t    if (hashnumlookup(msgn, &email2))\n\t\t\t\t\t\treplylist_tmp = addreply2(replylist_tmp, email2, ep, 0, NULL);\n#else\n\t\t    replylist_tmp = addreply(replylist_tmp, msgn, ep, 0, NULL);\n#endif\n\t\t}\n\t    }\n\t    if (!strcmp(line, \"<!-- lnextthread=\\\"start\\\" -->\\n\"))\n\t\tbreak;\n\t}\n\tfclose(fp);\n    }\n    free(filename);\n}\n\nvoid analyze_headers(int max_num)\n{\n    int i;\n    int min_search_msgnum = 0;\n    int num = max_num;\n\n\tif (set_searchbackmsgnum > 0 && set_increment && num - set_searchbackmsgnum > min_search_msgnum)\n\tmin_search_msgnum = num - set_searchbackmsgnum;\n\n    for (i = 0; i < num; ++i)\n\tfind_replyto_from_html(i);\n    if (set_showprogress)\n\tprintf(\"\\nparsing bodies for later search.\\n\");\n    for (i = min_search_msgnum; i < num; ++i) {\n\tstruct emailinfo *ep;\n\tif (hashnumlookup(i, &ep) && ep->bodylist) {\n\t    add_search_text(ep->bodylist, i);\n\t}\n    }\n    for (i = min_search_msgnum; i < num; ++i) {\n\tstruct emailinfo *ep;\n\tif (hashnumlookup(i, &ep) && ep->bodylist)\n\t    add_bigrams(ep->bodylist, i);\n\tif (set_showprogress)\n\t    printf(\"\\b\\b\\b\\b%4d articles.\\n\", i);\n    }\n    add_old_replies();\n}\n\nstatic void print_count(struct search_text *t)\n{\n    if (t->left)\n\tprint_count(t->left);\n#ifdef COUNT_TOKEN_FREQ\n    printf(\"%d\\t%s\\n\", t->count, t->token);\n#endif\n    if (t->right)\n\tprint_count(t->right);\n}\n\nstatic int better_match(struct body *bp, const char *matched_string, const char *last_matched_string)\n{\n    int i;\n    const char *ptr = bp->line;\n    for (i = 0; 1; ++i) {\n\tint last_matches = (last_matched_string[i] == *ptr);\n\tint new_matches = (matched_string[i] == *ptr);\n\tif (0)\n\t\t\tprintf(\"better_match? %d,%d @ %d\\n%.70s\\nVS:\\n%.70s\\n\", new_matches, last_matches, i, last_matched_string + i, matched_string + i);\n\tif (!new_matches)\n\t    return 0;\n\tif (!last_matches)\n\t    return 1;\n\tif (!*++ptr) {\n\t    bp = bp->next;\n\t    if (!bp)\n\t\tbreak;\n\t    ptr = bp->line;\n\t\t\tif (last_matched_string[i] == '\\n' || matched_string[i] == '\\n')\n\t\t\t\t++i;\n\t}\n    }\n    return 0;\n}\n\nstatic void check_match(struct bigram_list *bigram, struct body *bp, char *ptr, int max_msgnum, String_Match * match_info, const char *match_start_ptr, const char *exact_line)\n{\n    int match_len = 1;\n    int alloc_len = 0;\n    int match_len_bytes;\n    struct body *bp2 = bp;\n    struct body *bp3 = NULL;\n    char *ptr2 = ptr;\n    const char *last_ptr = ptr;\n    char *ptr3;\n    char token2[MAXLINE];\n    char token3[MAXLINE];\n    int b2_index = 0;\n    int b_index = 0;\n    int msgnum = bigram->bp->msgnum;\n    bp3 = bigram->bp;\n    if (msgnum < max_msgnum && bp3) {\n\tptr3 = bp3->line + bigram->offset;\n\twhile (1) {\n\t    bp2 = tokenize_body(bp2, token2, &ptr2, &b2_index, TRUE);\n\t    bp3 = tokenize_body(bp3, token3, &ptr3, &b_index, TRUE);\n\t    if (0)\n\t\t\t\tprintf(\"compare_match: %d %s, %20.20s\\n\", match_len, token3, ptr3);\n\t    if (!bp2 || !bp3)\n\t\tbreak;\n\t    if (ENCODE_TOKEN(token2) != ENCODE_TOKEN(token3))\n\t\tbreak;\n\t    ++match_len;\n\t    last_ptr = ptr2;\n\t}\n\t{\n\t    const char *p = match_start_ptr;\n\t    match_len_bytes = 0;\n\t    while (p != last_ptr) {\n\t\t++match_len_bytes;\n\t\t++p;\n\t\tif (!*p && p != last_ptr) {\n\t\t    bp = bp->next;\n\t\t    p = bp->line;\n\t\t}\n\t    }\n\t    ++match_len_bytes;\n\t}\n\tif (0)\n\t\t\tprintf(\"compare_match: %d %d msgnum %d\\n\", match_len, match_info->match_len_tokens, msgnum);\n\t\tif (match_len > match_info->match_len_tokens || (match_len == match_info->match_len_tokens && better_match(bp, exact_line, match_info->last_matched_string))) {\n\t    match_info->match_len_tokens = match_len;\n\t    match_info->match_len_bytes = match_len_bytes;\n\t    match_info->msgnum = msgnum;\n\t    match_info->start_match = bigram->bp->line + bigram->offset;\n\t    match_info->stop_match = ptr3;\n\t    if (match_info->last_matched_string)\n\t\tfree(match_info->last_matched_string);\n\t    match_len = strlen(bigram->bp->line);\n\t    alloc_len = match_len + 1000;\n\t    match_info->last_matched_string = (char *)emalloc(alloc_len);\n\t    strcpy(match_info->last_matched_string, bigram->bp->line);\n\t    if (!strchr(match_info->last_matched_string, '\\n')) {\n\t\tstrcat(match_info->last_matched_string + match_len, \"\\n\");\n\t\t++match_len;\n\t    }\n\t    for (bp3 = bigram->bp->next; bp3; bp3 = bp3->next) {\n\t\tchar *p = match_info->last_matched_string;\n\t\tint add_len = strlen(bp3->line);\n\t\t\t\tif (match_len + add_len + 2 > alloc_len) {\n\t\t\t\t\talloc_len = 2 * (match_len + add_len + 2);\n\t\t\t\t\tmatch_info->last_matched_string = (char *)realloc(p, alloc_len);\n\t\t}\n\t\tstrcat(match_info->last_matched_string + match_len, bp3->line);\n\t\tmatch_len += add_len;\n\t\t\t\tif (add_len > 0 && bp3->line[add_len - 1] != '\\n')\n\t\t\t\t\tstrcat(match_info->last_matched_string + match_len++, \"\\n\");\n\t    }\n\t    if (0)\n\t\t\t\tprintf(\"%d +++ %s; %s\\nbp->line %s\\n\", bigram->bp->msgnum, match_info->last_matched_string, match_info->stop_match, bp->line);\n\t}\n    }\n}\n\n/*\n** Find the best match for a line from the bodies of prior messages  \n*/\n\nint search_for_quote(char *search_line, char *exact_line, int max_msgnum, String_Match * match_info)\n{\n    char *ptr = search_line;\n    char token[MAXLINE];\n    int last_itok = 0;\n    int search_len = strlen(search_line);\n\tconst char *stop_ptr = search_line + (search_len >= 80 ? 40 : (search_len + 1) / 2);\n    static int count_tokens = 0;\n    static int count_matches = 0;\n    static int count_searched = 0;\n    const char *match_start_ptr = ptr;\n    const char *next_match_start_ptr;\n    char *next_exact_ptr;\n    int len;\n    int dummy = 0;\n    struct body *bp;\n    struct body b;\n    b.line = search_line;\n    b.next = NULL;\n    match_info->match_len_tokens = 0;\n    match_info->match_len_bytes = 0;\n    match_info->msgnum = -1;\n    match_info->last_matched_string = NULL;\n    bp = tokenize_body(&b, token, &ptr, &dummy, TRUE);\n    if (!bp)\n\treturn -1;\n    ++count_searched;\n    last_itok = ENCODE_TOKEN(token);\n    next_match_start_ptr = ptr;\n    next_exact_ptr = exact_line;\n\n    while ((bp = tokenize_body(bp, token, &ptr, &dummy, TRUE)) != NULL) {\n\tint itok = ENCODE_TOKEN(token);\n\tstruct bigram_list *bigram;\n\tbigram = find_bigram(last_itok, itok);\n\tif (!bigram)\n\t\t\tprintf(\"Warning, internal inconsistency in search_for_quote:\\n(%d,%d) %s %d best %d, msg %d %s || %s\\n\", last_itok, itok, token, dummy, match_info->match_len_tokens, max_msgnum, ptr, search_line);\n\t++count_tokens;\n\twhile (bigram) {\n\t    ++count_matches;\n\t\t\tcheck_match(bigram, bp, ptr, max_msgnum, match_info, match_start_ptr, exact_line);\n\t    if (match_info->match_len_bytes == search_len)\n\t\tbreak;\n\t    bigram = bigram->next;\n\t}\n\t\tif (match_info->last_matched_string != NULL && strlen(match_info->last_matched_string) > search_len / 2)\n\t    break;\n\tif (ptr > stop_ptr)\t/* very little chance of improving match */\n\t    break;\t\t/* in 2nd half of string */\n\tlast_itok = itok;\n\tmatch_start_ptr = next_match_start_ptr;\n\tnext_match_start_ptr = ptr;\n\n\texact_line = next_exact_ptr;\n\ttokenize_body(bp, token, &next_exact_ptr, &dummy, TRUE);\n    }\n    if (0)\n\t\tprintf(\"%d times %d searches %d tokens %d matches tries %f\\n\", max_msgnum, count_searched, count_tokens, count_matches, (float)count_matches / count_tokens);\n    len = match_info->match_len_bytes;\n    if (max_msgnum == -1)\n\t\tprintf(\"best_match_len %d (%d) len %d search_len %d %d; %s.\\n\", match_info->match_len_tokens, match_info->msgnum, len, search_len, match_info->match_len_bytes, match_info->last_matched_string);\n\tif (match_info->match_len_tokens > 1 && (len > search_len / 2 || len > 40)) {\n\tif ((ptr = strchr(match_info->last_matched_string, '\\n')) != NULL)\n\t    *ptr = 0;\t\t/* multi-line used for compares in check_match, but would screw up line-by-line compare outside */\n\treturn TRUE;\n    }\n\tif (match_info->match_len_tokens > 1 && (len > search_len / 2 || len > 40)\n\t&& len > match_info->match_len_bytes / 2)\n\tif (0)\n\t\t\tprintf(\"#almost %d best_match_len %d len %d search_len %d %d.\\n\", max_msgnum, match_info->match_len_tokens, len, search_len, match_info->match_len_bytes);\n\n    if (match_info->last_matched_string != NULL)\n\tfree(match_info->last_matched_string);\n    match_info->last_matched_string = NULL;\n    match_info->msgnum = -1;\n    return FALSE;\n}\n"
  },
  {
    "path": "src/search.h",
    "content": "#ifndef SEARCH_H_INCLUDED\n#define SEARCH_H_INCLUDED\n\ntypedef struct {\n    int msgnum;\n    int match_len_tokens;\n    int match_len_bytes;\n    char *last_matched_string;\t/* malloc'd by search, free'd by caller if msgnum >= 0 */\n    const char *start_match;\n    const char *stop_match;\n} String_Match;\n\nint search_for_quote(char *search_line, char *exact_line, int max_msgnum,\n\t\t     String_Match * match_info);\nstruct body *tokenize_body(struct body *bp, char *token, char **ptr,\n\t\t\t   int *bigram_index, int ignore);\nvoid analyze_headers(int amount_new);\nvoid set_alt_replylist(struct reply *r);\n\n#endif\t\t\t\t/* SEARCH_H_INCLUDED */\n"
  },
  {
    "path": "src/setup.c",
    "content": "/*\n** $Id: setup.c,v 1.23 2013-06-11 18:55:44 kahan Exp $\n*/\n\n#include \"hypermail.h\"\n\n#ifdef __LCC__\n#include \"../lcc/defaults.h\"\n#else\n#include \"defaults.h\"\n#endif\n\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"print.h\"\n\nchar *set_fragment_prefix;\nchar *set_antispam_at;\nchar *set_htmlmessage_edited;\nchar *set_htmlmessage_deleted_other;\nchar *set_htmlmessage_deleted_spam;\nchar *set_language;\nchar *set_htmlsuffix;\nchar *set_mbox;\nchar *set_archives;\nchar *set_custom_archives;\nchar *set_about;\nchar *set_dir;\nchar *set_defaultindex;\nchar *set_default_top_index;\nchar *set_txtsuffix;\nchar *set_antispamdomain;\n\nbool set_email_address_obfuscation;\nbool set_i18n;\nbool set_i18n_body;\nbool set_overwrite;\nbool set_inlinehtml;\nbool set_increment;\nbool set_readone;\nbool set_reverse;\nbool set_reverse_folders;\nbool set_showprogress;\nbool set_showheaders;\nbool set_showbr;\nbool set_showhr;\nbool set_showreplies;\nint set_show_msg_links;\nint set_show_index_links;\nbool set_usetable;\nbool set_indextable;\nbool set_iquotes;\nbool set_eurodate;\nbool set_gmtime;\nbool set_isodate;\nbool set_require_msgids;\nbool set_discard_dup_msgids;\nbool set_usemeta;\nbool set_userobotmeta;\nbool set_uselock;\nbool set_ietf_mbox;\nbool set_linkquotes;\nbool set_monthly_index;\nbool set_yearly_index;\nbool set_spamprotect;\nbool set_spamprotect_id;\nbool set_attachmentsindex;\nbool set_usegdbm;\nbool set_writehaof;\nbool set_append;\nchar *set_append_filename;\nbool set_nonsequential;\nbool set_warn_suppressions;\nbool set_files_by_thread;\nbool set_href_detection;\nbool set_mbox_shortened;\nbool set_report_new_file;\nbool set_report_new_folder;\nbool set_use_sender_date;\nbool set_inline_addlink;\nbool set_applemail_mimehack;\nchar *set_applemail_ua_header;\n\nint set_showhtml;\nint set_thrdlevels;\nint set_dirmode;\nint set_filemode;\n\nint set_locktime;\n\nint set_searchbackmsgnum;\nint set_quote_hide_threshold;\nint set_thread_file_depth;\n\nint set_startmsgnum;\n\nint set_save_alts;\nchar *set_alts_text;\n\nchar *set_mailcommand;\nchar *set_newmsg_command;\nchar *set_replymsg_command;\nchar *set_inreplyto_command;\nchar *set_mailto;\nchar *set_hmail;\nchar *set_domainaddr;\nstatic char *set_htmlbody;\n\nchar *set_icss_url;\nchar *set_mcss_url;\n\nchar *set_label;\n\nchar *set_dateformat;\nchar *set_indexdateformat;\nchar *set_stripsubject;\n\nchar *set_link_to_replies;\nchar *set_quote_link_string;\n\nstruct hmlist *set_text_types = NULL;\nstruct hmlist *set_inline_types = NULL;\nstruct hmlist *set_prefered_types = NULL;\nstruct hmlist *set_ignore_types = NULL;\nstruct hmlist *set_show_headers = NULL;\nstruct hmlist *set_skip_headers = NULL;\nstruct hmlist *set_avoid_indices = NULL;\nstruct hmlist *set_avoid_top_indices = NULL;\nstruct hmlist *set_filter_out = NULL;\nstruct hmlist *set_filter_require = NULL;\nstruct hmlist *set_filter_out_full_body = NULL;\nstruct hmlist *set_filter_require_full_body = NULL;\nstruct hmlist *set_applemail_ua_value;\n\nbool set_format_flowed;\nbool set_format_flowed_disable_quoted;\n\nchar *set_ihtmlheader;\nchar *set_ihtmlfooter;\nchar *set_ihtmlhead;\nchar *set_ihtmlhelpup;\nchar *set_ihtmlhelplow;\nchar *set_ihtmlnavbar2up;\nchar *set_mhtmlheader;\nchar *set_mhtmlfooter;\nchar *set_attachmentlink;\nchar *set_unsafe_chars;\nchar *set_filename_base;\n\nchar *set_folder_by_date;\nchar *set_latest_folder;\nchar *set_base_url;\nchar *set_describe_folder;\nint set_msgsperfolder;\n\nbool set_iso2022jp;\n\nbool set_noindex_onindexes;\nstruct hmlist *set_annotated = NULL;\nstruct hmlist *set_deleted = NULL;\nstruct hmlist *set_expires = NULL;\nstruct hmlist *set_delete_msgnum = NULL;\nchar *set_delete_older;\nchar *set_delete_newer;\nbool set_delete_incremental;\nint set_delete_level;\n\nstruct Config cfg[] = {\n    {\"fragment_prefix\", &set_fragment_prefix, \"msg\", CFG_STRING,\n     \"# put this string before the message number in each URI fragment.\\n\", FALSE},\n\n    {\"email_address_obfuscation\", &set_email_address_obfuscation, BFALSE, CFG_SWITCH,\n     \"# set to On to enable email address obfuscation using numeric character references.\\n\",FALSE},\n\n    {\"i18n\", &set_i18n, BTRUE, CFG_SWITCH,\n     \"# Enable I18N features, hypermail must be linked with libiconv.\\n\",FALSE},\n\n    {\"i18n_body\", &set_i18n_body, BFALSE, CFG_SWITCH,\n     \"# Translate message body into UTF-8. \\\"i18n\\\" must be enabled.\\n\",FALSE},\n\n    {\"htmlmessage_edited\",  &set_htmlmessage_edited, NULL, CFG_STRING,\n     \"# Set this to HTML markup you want to appear in the body of manually\\n\"\n     \"edited messages.\\n\",FALSE},\n\n    {\"htmlmessage_deleted_other\",  &set_htmlmessage_deleted_other, NULL, CFG_STRING,\n     \"# Set this to HTML markup you want to appear in the body of deleted\\n\"\n     \"# messages (by reasons other than spam).\\n\",FALSE},\n\n    {\"htmlmessage_deleted_spam\",  &set_htmlmessage_deleted_spam, NULL, CFG_STRING,\n     \"# Set this to HTML markup you want to appear in the body of deleted\\n\"\n     \"# messages (by spam reasons).\\n\",FALSE},\n\n    {\"antispam_at\", &set_antispam_at, ANTISPAM_AT, CFG_STRING,\n     \"# replace any @ sign with this string, if spam flags enabled.\\n\", FALSE},\n     \n    {\"language\", &set_language, LANGUAGE, CFG_STRING,\n     \"# A two-letter string specifying the language to use!\\n\"\n     \"# For example 'en' for English.\\n\", FALSE},\n\n    {\"htmlsuffix\", &set_htmlsuffix, HTMLSUFFIX, CFG_STRING,\n     \"# Use this to specify the html file suffix to be used\\n\"\n     \"# when Hypermail generates the html files. This is depen-\\n\"\n     \"# dent on local needs. Do not put a '.' in the value. It\\n\"\n     \"# would result in \\\"file..html\\\", probably not what you want.\\n\", FALSE},\n\n    {\"mbox\", &set_mbox, NULL, CFG_STRING,\n     \"# This is the mailbox to read messages in from. Set this with \\n\"\n     \"# a value of NONE to read from standard input.\\n\", FALSE},\n\n     {\"ietf_mbox\",  &set_ietf_mbox, BFALSE, CFG_SWITCH,\n     \"# Set this to On to read mboxes using the IETF convention.\\n\", FALSE},\n\n    {\"archives\", &set_archives, NULL, CFG_STRING,\n     \"# This will create a link in the archived index pages\\n\"\n     \"# labeled 'Other mail archives' to the specified URL. Set\\n\"\n     \"# this to NONE to omit such a link.\\n\", FALSE},\n\n    {\"custom_archives\", &set_custom_archives, NULL, CFG_STRING,\n     \"# If this variable is defined, a navigation entry will be\\n\"\n     \"# created below the sorted_by_x list entry, with the text\\n\"\n     \"# Other mail archives: followed by the value of this variable.\\n\"\n     \"# Set it to NONE to ommit such an entry.\\n\", FALSE},\n\n    {\"about\", &set_about, NULL, CFG_STRING,\n     \"# This will create a link in the archived index pages\\n\"\n     \"# labeled 'About this archive' to the specified URL. Set\\n\"\n     \"# this to NONE to omit such a link.\\n\", FALSE},\n\n    {\"label\", &set_label, NULL, CFG_STRING,\n     \"# Define this as the label to put in archives.\\n\", FALSE},\n\n    {\"dir\", &set_dir, NULL, CFG_STRING,\n     \"# This is the directory that Hypermail will look for when\\n\"\n     \"# creating  and updating archives. If defined as NONE the\\n\"\n     \"# directory will have the same name as the input mailbox.\\n\", FALSE},\n\n    {\"defaultindex\", &set_defaultindex, DEFAULTINDEX, CFG_STRING,\n     \"# This specifies the default index that  users can view when\\n\"\n     \"# entering the archive. Valid types are date, thread, author,\\n\"\n     \"# subject, and attachment. When using the folder_by_date or\\n\"\n     \"# msgsperfolder options, this option applies to subdirectories.\\n\", FALSE},\n\n    {\"default_top_index\", &set_default_top_index, \"folders\", CFG_STRING,\n     \"# This specifies the default index that  users can view when\\n\"\n     \"# entering the top level of an archive that uses the folder_by_date\\n\"\n     \"# or msgsperfolder option. Valid types are date, thread, author,\\n\"\n     \"# subject, attachment, and folders.\\n\", FALSE},\n\n    {\"avoid_indices\", &set_avoid_indices, NULL, CFG_LIST,\n     \"# This is a list of index files to not generate. Valid types are\\n\"\n     \"# date, thread, author, and subject. When using the folder_by_date or\\n\"\n     \"# msgsperfolder options, this option applies to subdirectories.\\n\", FALSE},\n\n    {\"avoid_top_indices\", &set_avoid_top_indices, NULL, CFG_LIST,\n     \"# This is a list of index files to not generate for the top\\n\"\n     \"# directory of an archive using the folder_by_date or\\n\"\n     \"# msgsperfolder option. Valid types are date, thread, author, \\n\"\n     \"# subject, folders, and attachment.\\n\", FALSE},\n\n    {\"overwrite\", &set_overwrite, BFALSE, CFG_SWITCH,\n     \"# Set this to On to make Hypermail overwrite existing archives.\\n\", FALSE},\n\n    {\"inlinehtml\", &set_inlinehtml, BTRUE, CFG_SWITCH,\n     \"# Define to On to make text/html parts to get inlined with the mails.\\n\"\n     \"# If set to Off, HTML-parts will be stored as separate files.\\n\"\n     \"# A \\\"Content-Disposition: attachment;\\\" line in the mail will\\n\"\n     \"# cause an HTML-part to be stored as a separate file even if this\\n\"\n     \"# option is On.\\n\", FALSE},\n\n    {\"increment\", &set_increment, BFALSE, CFG_INTEGER,\n     \"# Set this to -1 to have hypermail figure out whether the input\\n\"\n     \"# is entirely new messages to be appended or whether it contains\\n\"\n     \"# messages that are already in the archive. A value of -1 cannot be\\n\"\n     \"# used with the mbox_shortened option or with the -i command line\\n\"\n     \"# option or with mbox = NONE. Set this to 0 to always treat\\n\"\n     \"# the input as an mbox that contains messages in the archive if the\\n\"\n     \"# existing archive is not empty.\\n\"\n     \"# Set this to 1 to append the input to existing archive.\\n\", FALSE},\n\n    {\"readone\", &set_readone, BFALSE, CFG_SWITCH,\n     \"# Set this to On to specify there is only one message in the input.\\n\", FALSE},\n\n    {\"reverse\", &set_reverse, BFALSE, CFG_SWITCH,\n     \"# Setting this variable to On will reverse-sort the article\\n\"\n     \"# entries in the date and thread index files by the\\n\"\n     \"# date they were received. That is, the most recent messages\\n\"\n     \"# will appear at the top of the index rather than the other\\n\"\n     \"# way around.\\n\", FALSE},\n\n    {\"reverse_folders\", &set_reverse_folders, BFALSE, CFG_SWITCH,\n     \"# Setting this variable to On will reverse-sort the list of\\n\"\n     \"# folders. That is, the most recent folders will appear at\\n\"\n     \"# the top of the index rather than the other way around.\\n\", FALSE},\n\n    {\"progress\", &set_showprogress, INT(PROGRESS), CFG_INTEGER,\n     \"# Set this to 1 or 2 to always show a progress report  as\\n\"\n     \"# Hypermail works. With a setting of 1, hypermail\\n\"\n     \"# overwrites the progress information relating to attachment\\n\"\n     \"# creation. With a setting of 2, attachment creation information\\n\"\n     \"# is listed individually with the number of the message the\\n\"\n     \"# attachments relate to. This is written to stdout.\\n\", FALSE},\n\n    {\"showheaders\", &set_showheaders, BFALSE, CFG_SWITCH,\n     \"# Set this to On to show the article header lines in the archived HTML\\n\"\n     \"# files.  These lines typically include the To:, From:, and Subject:\\n\"\n     \"# information found in most email messages.\\n\", FALSE},\n\n    {\"showhtml\", &set_showhtml, INT(1), CFG_INTEGER,\n     \"# Set this to 1 to show the articles in a proportionally-spaced\\n\"\n     \"# font rather than a fixed-width (monospace) font.\\n\"\n     \"# Set this to 2 for more complex conversion to html\\n\"\n     \"# similar to that in <a href=\\\"http://www.cs.wustl.edu/~seth/txt2html/\\\">txt2html.pl</a>.\\n\"\n     \"# Showhtml = 2 will normally produce nicer looking results than\\n\"\n     \"# showhtml = 1, and showhtml = 0 will look pretty dull, but\\n\"\n     \"# 1 and 2 run risks of altering the appearance in undesired ways.\\n\", FALSE},\n\n    {\"showbr\", &set_showbr, BTRUE, CFG_SWITCH,\n     \"# Set this to On to place <br> tags at the end of article lines.\\n\"\n     \"# Otherwise, all non-quoted article lines will word wrap. This\\n\"\n     \"# only takes effect if hm_showhtml is 1.\\n\", FALSE},\n\n    {\"showhr\", &set_showhr, BFALSE, CFG_SWITCH,\n     \"# Set this to On to place horizontal rules before and after articles.\\n\"\n     \"NOTE: THIS OPTION HAS BEEN DEPRECATED BY THE WAI CHANGES. IT WILL BE\\n\"\n     \"IGNORED.\\n\", FALSE},\n\n    {\"showreplies\", &set_showreplies, BTRUE, CFG_SWITCH,\n     \"# Set this to On to show all replies to a message as links\\n\"\n     \"# in article files.\\n\", FALSE},\n\n    {\"show_msg_links\", &set_show_msg_links, INT(1), CFG_INTEGER,\n     \"# Set this to 1 to put the individual message links at the top\\n\"\n     \"# of the individual message pages. Set this to 0 to produce pages\\n\"\n     \"# without the Next, Previous, Reply, In-Reply-To, etc. links. Set\\n\"\n     \"# it to 3 to produce those links only at the top of the message\\n\"\n     \"# pages, or 4 to produce those links only at the bottom of the\\n\"\n     \"# message.\\n\", FALSE},\n\n    {\"show_index_links\", &set_show_index_links, INT(1), CFG_INTEGER,\n     \"# Set this to 1 to show links to index pages from the top and\\n\"\n     \"# bottom of each message file. Set it to 0 to avoid those links.\\n\"\n     \"# Set it to 3 to show the links only at the top of the message\\n\"\n     \"# pages, or 4 to produce those links only at the bottom of the\\n\"\n     \"# message.\\n\", FALSE},\n\n    {\"usetable\", &set_usetable, BFALSE, CFG_SWITCH,\n     \"# Setting this variable to On will tell Hypermail to generate\\n\"\n     \"# an index menu at the top and bottom of each page in a table\\n\"\n     \"# format. Set to Off if you want the standard Hypermail page look\\n\"\n     \"# and feel\\n\"\n     \"NOTE: THIS OPTION HAS BEEN DEPRECATED BY THE WAI CHANGES. IT WILL BE\\n\"\n     \"IGNORED.\\n\", FALSE},\n\n    {\"indextable\", &set_indextable, BFALSE, CFG_SWITCH,\n     \"# Setting this variable to On will tell Hypermail to generate\\n\"\n     \"# message index Subject/Author/Date listings using a nice table\\n\"\n     \"# format. Set to Off if you want the original Hypermail index look.\\n\", FALSE},\n\n    {\"iquotes\", &set_iquotes, BTRUE, CFG_SWITCH,\n     \"# Set this to On to italicize quoted lines.\\n\", FALSE},\n\n    {\"eurodate\", &set_eurodate, BFALSE, CFG_SWITCH,\n     \"# Set this to On to display article received dates with\\n\"\n     \"# days before months instead of months before days.\\n\", FALSE},\n\n    {\"isodate\", &set_isodate, BFALSE, CFG_SWITCH,\n     \"# Set this to On to display article received dates in\\n\"\n     \"# YYYY-MM-DD HH:MM:SS format. If used with the gmtime option, a\\n\"\n     \"# Z will be inserted between the DD and HH.\\n\", FALSE},\n\n    {\"gmtime\", &set_gmtime, BFALSE, CFG_SWITCH,\n     \"# Set this to On to display article received dates using\\n\"\n     \"# Greenwich Mean Time (UTC) rather than local time.\\n\", FALSE},\n\n    {\"discard_dup_msgids\", &set_discard_dup_msgids, BTRUE, CFG_SWITCH,\n     \"# Set this to Off to accept messages with a Message-ID matching\\n\"\n     \"# that of a message already  in this archive.\\n\"\n     \"# By default such messages are discarded.\\n\", FALSE},\n\n    {\"require_msgids\", &set_require_msgids, BTRUE, CFG_SWITCH,\n     \"# Set this to Off to accept messages without a Message-ID header.\\n\"\n     \"# By default such messages are discarded.\\n\", FALSE},\n\n    {\"usemeta\", &set_usemeta, BFALSE, CFG_SWITCH,\n     \"# Set this to On to store the content type of a MIME attachment in\\n\"\n     \"# a metadata file.\\n\", FALSE},\n\n    {\"userobotmeta\", &set_userobotmeta, BFALSE, CFG_SWITCH,\n     \"# Set this to On to apply a robot annotation to a MIME attachment in\\n\"\n     \"# a metadata file, using the experimental X-Robots-Tag HTTP header.\\n\", FALSE},\n\n    {\"uselock\", &set_uselock, BTRUE, CFG_SWITCH,\n     \"# Set this to On to use hypermail's internal locking mechanism.\\n\", FALSE},\n\n    {\"usegdbm\",  &set_usegdbm,  BFALSE,    CFG_SWITCH,\n     \"# Set this to On to use gdbm to implement a header cache.\\n\"\n     \"# This will speed up hypermail, especially if your filesystem is slow.\\n\"\n     \"# It will not provide any speedup with the linkquotes option.\\n\"\n#ifndef GDBM\n     \"# (This particular binary has been build with GDBM disabled.)\\n\"\n#endif\n    , FALSE},\n\n    {\"writehaof\", &set_writehaof, BFALSE, CFG_SWITCH,\n     \"# Set this to On to let hypermail write an XML archive overview file\\n\"\n     \"# in each directory. The filename is \" HAOF_NAME \".\\n\", FALSE},\n\n    {\"append\",  &set_append,  BFALSE,    CFG_SWITCH,\n     \"# Set this to On to maintain a parallel mbox archive. The file\\n\"\n     \"# name defaults to mbox in the directory specified by -d or dir.\\n\", FALSE},\n\n    {\"append_filename\", &set_append_filename, NULL, CFG_STRING,\n     \"# Specifies the filename to be used by the append option.\\n\"\n     \"# $DIR may be used to specify a name relative to the directory\\n\"\n     \"# specified in the -d or dir option.\\n\"\n     \"# The string will be passed to strftime(3) to allow splitting the\\n\"\n     \"# mailbox into yearly or monthy files, such as \\\"%Y-%m.mbox\\\".\\n\" , FALSE},\n\n    {\"nonsequential\",  &set_nonsequential,  BFALSE,    CFG_SWITCH,\n     \"# Set this to On to generate filenames that are not sequential, but\\n\"\n     \"# rather a hash of the message properties.\\n\"\n#ifndef HAVE_LIBFNV\n     \"# (This particular binary has been build with LIBFNV disabled.\\n\"\n     \"# This option won't work)\\n\"\n#endif\n     , FALSE},\n\n    {\"thrdlevels\", &set_thrdlevels, INT(4), CFG_INTEGER,\n     \"# This specifies the number of thread levels to outline\\n\"\n     \"# in the thread index.\\n\", FALSE},\n\n    {\"dirmode\", &set_dirmode, INT(0755), CFG_OCTAL,\n     \"# This is an octal number  representing  the  permissions\\n\"\n     \"# that new directories are set to when they are created.\\n\", FALSE},\n\n    {\"filemode\", &set_filemode, INT(0644), CFG_OCTAL,\n     \"# This is an octal number representing the file permissions\\n\"\n     \"# that new files are set to when they are created.\\n\", FALSE},\n\n    {\"mailcommand\", &set_mailcommand, MAILCOMMAND, CFG_STRING,\n     \"# This specifies the mail command to use when converting\\n\"\n     \"# email addresses to links. The variables $TO, $SUBJECT,\\n\"\n     \"# and $ID can be used in constructing the command string.\\n\", FALSE},\n\n    {\"mailto\", &set_mailto, NULL, CFG_STRING,\n     \"# The address of the contact point that is put in the HTML header\\n\"\n     \"# line <link rev=made href=\\\"mailto:MAILTO\\\">. Setting this to NONE\\n\"\n     \"# disables <link...> header generation.\\n\", FALSE},\n\n    {\"hmail\", &set_hmail, NULL, CFG_STRING,\n     \"# Set this to the list's submission address.\\n\", FALSE},\n\n    {\"newmsg_command\", &set_newmsg_command, \"mailto:$TO\", CFG_STRING,\n     \"# This specifies the mail command to use when converting the\\n\"\n     \"# set_hmail address to links in replies. The variables $TO, $SUBJECT,\\n\"\n     \"# and $ID can be used in constructing the command string.\\n\", FALSE},\n\n    {\"replymsg_command\", &set_replymsg_command, \"not set\", CFG_STRING,\n     \"# This specifies the mail command to use when converting the\\n\"\n     \"# set_hmail address to links in replies. The variables $TO, $SUBJECT,\\n\"\n     \"# and $ID can be used in constructing the command string. The value\\n\"\n     \"# from mailcommand will be used if this option is not specified.\\n\", FALSE},\n\n    {\"inreplyto_command\", &set_inreplyto_command, NULL, CFG_STRING,\n     \"# This gives a URI template to a script that hypermail will link to\\n\"\n     \"# if it's unable to find in the archive's messages the MID corresponding\\n\"\n     \"# to an In-Reply-To header. The variable $ID is used to specify where the\\n\"\n     \"# Message-Identifier value will appear in the link.\\n\", FALSE},\n\n    {\"domainaddr\", &set_domainaddr, DOMAINADDR, CFG_STRING,\n     \"# Set this to the domainname you want added to a mail address\\n\"\n     \"# appearing in the RFC822 field which lack a hostname.\\n\", FALSE},\n\n    {\"body\", &set_htmlbody, NULL, CFG_STRING,\n     \"# This obsolete entry kept around to help warn users with old config files.\\n\", FALSE},\n\n    {\"icss_url\", &set_icss_url, NULL, CFG_STRING,\n     \"# Specifies a URL to an external CSS stylesheet for the index pages.\\n\"\n     \"# The CSS will be associated to the indexes thru an HTML LINK element.\\n\"\n    , FALSE},\n\n    {\"mcss_url\", &set_mcss_url, NULL, CFG_STRING,\n     \"# Specifies a URL to an external CSS stylesheet for the message pages.\\n\"\n     \"# The CSS will be associated to the indexes thru an HTML LINK element.\\n\"\n    , FALSE},\n\n    {\"text_types\", &set_text_types, NULL, CFG_LIST,\n     \"# This is a list of MIME types that you want hypermail to treat\\n\"\n     \"# exactly as if they were text/plain.\\n\", FALSE},\n\n    {\"inline_types\", &set_inline_types, INLINE_TYPES, CFG_LIST,\n     \"# This is the list of MIME types that you want <img> tags to as\\n\"\n     \"# opposed to simply <a href> to from the message.\\n\", FALSE},\n\n    {\"inline_addlink\", &set_inline_addlink, BTRUE, CFG_SWITCH,\n     \"# Set to On to add inline links to content that is stored in the\\n\"\n     \"# attachments subdirectory.  'inline_types' must be enabled.\\n\", FALSE},\n\n    {\"prefered_types\", &set_prefered_types, NULL, CFG_LIST,\n     \"# When mails using multipart/mixed types are scanned, this list of\\n\"\n     \"# MIME types defines which part you want presented in the result.\\n\"\n     \"# See the save_alts option for how non prefered types are treated.\\n\", FALSE},\n\n    {\"ignore_types\", &set_ignore_types, NULL, CFG_LIST,\n     \"# This is the list of MIME attachment types that you do not want\\n\"\n     \"# to do anything with. Two special types may be used here:\\n\"\n     \"# $BINARY - ignore all types that would be stored as separate files.\\n\"\n     \"# $NONPLAIN - ignore all types not treated as text/plain, and all $BINARY types.\\n\"\n     \"# Note: the behavior of these may be affected by the inlinehtml option.\\n\", FALSE},\n\n    {\"applemail_mimehack\", &set_applemail_mimehack, BFALSE, CFG_SWITCH,\n     \"# Set to On to process Apple Mail MIME multipart/alternative\\n\"\n     \"# as if the save_alts was enabled. If the message contains only\\n\"\n     \"# a text/plain and a text/html alternatives, the text/plain one will\\n\"\n     \"# be kept and the text/html alternative will be discared. If the\\n\"\n     \"# message contains text/plain and another kind of alternative, such as\\n\"\n     \"# multipart/mixed or multipart/related, all the alternative elements\\n\"\n     \"# be displayed. This is to take into account Apple Mail's MIME format\\n\"\n     \"# where attachments are associated by default with the text/html alternative.\\n\"\n     \"# Use this option if you're using text/plain as a prefered type.\\n\"\n     \"# This option is ignored if save_alts is enabled or if text/html is\\n\"\n     \"# the prefered type.\", FALSE},\n\n    {\"applemail_ua_header\", &set_applemail_ua_header, \"X-Mailer\", CFG_STRING,\n     \"# Set to the header name that Apple Mail uses to identify its mail agent.\\n\"\n     \"# This option is only useful if you enabled the applemail_mimehack configuration\\n\"\n     \"# option.\\n\", FALSE},\n\n    {\"applemail_ua_value\", &set_applemail_ua_value, APPLE_MAIL_UA, CFG_LIST,\n     \"# Set to the list of the header value that Apple Mail uses to identify\\n\"\n     \"# its mail agent. Do not add the version number unless you know what you're doing.\\n\"\n     \"# This option is only useful if you enabled the applemail_mimehack configuration\\n\"\n     \"# option.\\n\", FALSE},\n\n    {\"show_headers\", &set_show_headers, NULL, CFG_LIST,\n     \"# This is the list of headers to be displayed if 'showheaders'\\n\"\n     \"# is set to On). They can be listed comma or space separated\\n\"\n     \"# all on a single line.\\n\", FALSE},\n\n    {\"format_flowed\", &set_format_flowed, BFALSE, CFG_SWITCH,\n     \"# Enable support for RFC3676 format=flowed (EXPERIMENTAL)\\n\", FALSE},\n\n    {\"format_flowed_disable_quoted\", &set_format_flowed_disable_quoted, BFALSE, CFG_SWITCH,\n     \"# If format_flowed is enabled, this option allows you to disable\\n\"\n     \"# format=flowed inside quoted text\\n\", FALSE},\n\n    {\"ihtmlheaderfile\", &set_ihtmlheader, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included at the top of every index page.\\n\", FALSE},\n\n    {\"ihtmlfooterfile\", &set_ihtmlfooter, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included at the bottom of every index  page.\\n\", FALSE},\n\n    {\"ihtmlheadfile\", &set_ihtmlhead, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included inside the HTML HEAD element of every index page.\\n\", FALSE},\n\n    {\"ihtmlhelpupfile\", &set_ihtmlhelpup, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included as information giving help to your archive users,\"\n     \"# in the upper navigation bar.\\n\", FALSE},\n\n    {\"ihtmlhelplowfile\", &set_ihtmlhelplow, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included as information giving help to your archive users,\"\n     \"# in the lower navigation bar.\\n\", FALSE},\n\n    {\"ihtmlnavbar2upfile\", &set_ihtmlnavbar2up, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting  statements  that  you  wish to\\n\"\n     \"# included as information giving links to the hierarchin your archive.\\n\", FALSE},\n\n    {\"mhtmlheaderfile\", &set_mhtmlheader, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid  HTML  formatting statements that you wish to use\\n\"\n     \"# at the top of every message page.\\n\", FALSE},\n\n    {\"mhtmlfooterfile\", &set_mhtmlfooter, NULL, CFG_STRING,\n     \"# Define path as the path to a template  file  containing\\n\"\n     \"# valid HTML formatting statements you wish to use at the\\n\"\n     \"# bottom of every message page.\\n\", FALSE},\n\n    {\"locktime\", &set_locktime, INT(3600), CFG_INTEGER,\n     \"# Specify number of seconds to wait for a lock before we\\n\"\n     \"# override it! .\\n\", FALSE},\n\n    {\"dateformat\", &set_dateformat, NULL, CFG_STRING,\n     \"# Format (see strftime(3)) for displaying dates.\\n\", FALSE},\n\n    {\"indexdateformat\", &set_indexdateformat, NULL, CFG_STRING,\n     \"# Format (see strftime(3)) for displaying dates in the index pages.\\n\"\n     \"# Will use dateformat if not specified.\\n\", FALSE},\n\n    {\"stripsubject\", &set_stripsubject, NULL, CFG_STRING,\n     \"# A word to be stripped from all subject lines.  Helps unclutter\\n\"\n     \"# mailing lists which add tags to subject lines.\\n\", FALSE},\n\n    {\"attachmentlink\", &set_attachmentlink, NULL, CFG_STRING,\n     \"# Format of the attachment links.\\n\"\n     \"# %p for the full path to the attachment\\n\"\n     \"# %f for the file name part only\\n\"\n     \"# %d for the directory name only\\n\"\n     \"# %n for the message number\\n\" \"# %c for the content type string\\n\", FALSE},\n\n    {\"spamprotect\", &set_spamprotect, BTRUE, CFG_SWITCH,\n     \"# Set this to On to make hypermail not output real email addresses\\n\"\n     \"# in the output HTML but instead it will obfuscate them a little.\\n\"\n     \"# You can control the obfuscation with set_antispamdomain.\\n\", FALSE},\n  \n    {\"antispamdomain\", &set_antispamdomain, NULL, CFG_STRING,\n     \"# By default hypermail only does a small amount of massaging\\n\"\n     \"# of email addresses. Use this to completely replace the domain\\n\"\n     \"# from which a message originates (everything after the @)\\n\"\n     \"# with some string to confuse screen-scraping programs.\\n\"\n     \"# It is probably wise to make this an invalid mail domain.\\n\", FALSE}, \n\n    {\"spamprotect_id\", &set_spamprotect_id, BTRUE, CFG_SWITCH,\n     \"# Set this to On to make hypermail not output real email message\\n\"\n     \"# ids in HTML comments (sometimes used internally by hypermail) but\\n\"\n     \"# instead it will obfuscate them a little so they don't look like\\n\"\n     \"# email addresses to spammers.\\n\", FALSE},\n\n    {\"attachmentsindex\", &set_attachmentsindex, BTRUE, CFG_SWITCH,\n     \"# Set this to  Off to make hypermail not output an index of\\n\"\n     \"# messages with attachments.\\n\", FALSE},\n\n    {\"linkquotes\", &set_linkquotes, BFALSE, CFG_SWITCH, \n     \"# Set this to On to create fine-grained links from quoted\\n\"\n     \"# text to the text where the quote originated. It also improves\\n\"\n     \"# the threads index file by more accurately matching messages\\n\"\n     \"# with replies. Note that this may be rather cpu intensive (see\\n\"\n     \"# the searchbackmsgnum option to alter the performance).\\n\" , FALSE},\n\n    {\"searchbackmsgnum\", &set_searchbackmsgnum, INT(500), CFG_INTEGER,\n     \"# If the linkquotes option is on and an incremental update is being\"\n     \"# done (-u option), this controls the tradeoff between speed and\\n\"\n     \"# the reliability of finding the right source for quoted text.\\n\"\n     \"# Try to set it to the largest number of messages between a\\n\"\n     \"# message and the final direct reply to that message.\\n\", FALSE},\n\n    {\"link_to_replies\", &set_link_to_replies, NULL, CFG_STRING,\n     \"# If the linkquotes option is on, specifying a string here\\n\"\n     \"# causes it to generate links from original quoted text to the\\n\"\n     \"# location(s) in replies which quote them. The string\\n\"\n     \"# is used to display the link.\\n\", FALSE},\n\n    {\"quote_hide_threshold\", &set_quote_hide_threshold, INT(100), CFG_INTEGER,\n     \"# If the linkquotes option is on, setting this to an\\n\"\n     \"# integer less than 100 will cause it to replace quoted\\n\"\n     \"# text with one-line links if the percent of lines in the\\n\"\n     \"# message body (exluding the signature) consisting of\\n\"\n     \"# quoted text exceeds the number indicated by this option.\\n\", FALSE},\n\n    {\"quote_link_string\", &set_quote_link_string, NULL, CFG_STRING,\n     \"# If the quote_hide_threshold option is being used, the\\n\"\n     \"# quote_link_string will be used if available to display the\\n\"\n     \"# link that replaces the quoted text. If no string is specified\\n\"\n     \"# here, the first line of each section of quoted text will used.\\n\", FALSE},\n\n    {\"monthly_index\", &set_monthly_index, BFALSE, CFG_SWITCH,\n     \"# Set this to On to create additional index files broken up\\n\"\n     \"# by month. A summary.html file will provide links to all the\\n\"\n     \"# monthly indices.\\n\", FALSE},\n\n    {\"yearly_index\", &set_yearly_index, BFALSE, CFG_SWITCH,\n     \"# Set this to On to create additional index files broken up\\n\"\n     \"# by year. A summary.html file will provide links to all the\\n\"\n     \"# yearly indices.\\n\", FALSE},\n\n    {\"thread_file_depth\", &set_thread_file_depth, INT(0), CFG_INTEGER,\n     \"# If nonzero, break the threads index file into multiple files,\\n\"\n     \"# with the initial message of each thread in the main index file\\n\"\n     \"# along with links to files containing the replies. Setting this\\n\"\n     \"# to 1 creates one file for each thread that has replies, and is\\n\"\n     \"# recommended for archives with over a few hundred messages.\\n\"\n     \"# Setting this greater than 1 will produce multiple levels of files\\n\"\n     \"# for each thread whose replies are nested by more than 1 level,\\n\"\n     \"# but that is rarely useful. This option is currently disabled\\n\"\n     \"# if the indextable option is turned on, and probably needs to\\n\"\n     \"# be less than thrdlevels.\\n\", FALSE},\n\n    {\"startmsgnum\", &set_startmsgnum, INT(0), CFG_INTEGER,\n     \"# Sets the number of the first message of an archive. This option is\\n\"\n     \"# only active when adding new messages to brand new archive.\\n\"\n     \"# If not set, the default number will be 0000.\\n\"\n     \"# Note that if you change this setting, you are stuck with it. If you\\n\"\n     \"# rebuild your archive, you must use the same value or you'll break any\\n\"\n     \"# link pointing to your archive.\\n\", FALSE},\n\n    {\"folder_by_date\", &set_folder_by_date, NULL, CFG_STRING,\n     \"# This string causes the messages to be put in subdirectories\\n\"\n     \"# by date. The string will be passed to strftime(3) to generate\\n\"\n     \"# subdirectory names based on message dates. Suggested values are\\n\"\n     \"# \\\"%y%m\\\" or \\\"%b%y\\\" for monthly subdirectories, \\\"%Y\\\" for\\n\"\n     \"# yearly, \\\"%G/%V\\\" for weekly. Do not alter this for an existing\\n\"\n     \"# archive without removing the old html files. If you use this\\n\"\n     \"# and update the archive incrementally (e.g. with -u), you must\\n\"\n     \"# use the usegdbm option.\\n\", FALSE},\n\n    {\"msgsperfolder\", &set_msgsperfolder, INT(0), CFG_INTEGER,\n     \"# Put messages in subdirectories with this many messages per\\n\"\n     \"# directory. Do not use this and folder_by_date on the same archive.\\n\"\n     \"# Do not alter this for an existing archive without removing the old\\n\"\n     \"# html files. Deleted/expired messages ARE COUNTED for the purpose\\n\"\n     \"# of deciding how many messages to put in a subdirectory.\\n\", FALSE},\n\n    {\"describe_folder\", &set_describe_folder, NULL, CFG_STRING,\n     \"# Controls the labels used in folders.html to describe the\\n\"\n     \"# directories created by the folder_by_date or msgsperfolder\\n\"\n     \"# options. For folder_by_date labels, the describe_folder string\\n\"\n     \"# will be passed to strftime(3) the same as the folder_by_date string.\\n\"\n     \"# For msgsperfolder:\\n\"\n     \"# %d for the directory number (starts with 0)\\n\"\n     \"# %D for the directory number (starts with 1)\\n\"\n     \"# %m for the number of the first message in the directory\\n\"\n     \"# %M for the number of the last message that can be put in the\\n\"\n     \"# directory.\\n\", FALSE},\n\n    {\"latest_folder\", &set_latest_folder, NULL, CFG_STRING,\n     \"# If folder_by_date or msgsperfolder are in use, create\\n\"\n     \"# a symbolic link by this name to the most recently created\\n\"\n     \"# subdirectory. Note that many web servers are configured to\\n\"\n     \"# not follow symbolic links for security reasons. The link will\\n\"\n     \"# be created in the directory specified by the 'dir' or '-d' option.\\n\",\n     FALSE},\n\n    {\"base_url\", &set_base_url, NULL, CFG_STRING,\n     \"# The url of the archive's main directory. This is needed when\\n\"\n     \"# the latest_folder option is used and the folder_by_date makes\\n\"\n     \"# directories more than one level deep (e.g. with '%y/%m').\\n\", FALSE},\n\n    {\"iso2022jp\", &set_iso2022jp, BFALSE, CFG_SWITCH,\n     \"# Set this to On to support ISO-2022-JP messages.\\n\", FALSE},\n\n    {\"noindex_onindexes\", &set_noindex_onindexes, BFALSE, CFG_SWITCH,\n     \"# Set to On to inform search engines that you don't want to index\\n\"\n     \"# the hypermail generated indexes. See the \\\"annotated\\\" configuration\"\n     \"# option for a more detailed description.\\n\", FALSE},\n\n    {\"annotated\", &set_annotated, \"X-Hypermail-Annotated\", CFG_LIST,\n     \"# This is the list of headers that indicate that a message was annotated.\\n\"\n     \"# When a message contains such a header, the header may have one more comma\\n\"\n     \"# separated values indicatating the annotation type. Order and case are\\n\"\n     \"# not important.\\n\"\n     \"# The possible values of this header are: content and robot annotations.\\n\"\n     \"# Content annotations can have only one of the following values:\\n\"\n     \"#      spam : message deleted because it is spam;\\n\"\n     \"#   deleted : message deleted, other reasons;\\n\"\n     \"#    edited : original received message was manually edited.\\n\"\n     \"# You can customize the markup that\\'s shown for content annotations\\n\"\n     \"# by means of the htmlmessage_deleted_other, htmlmessage_deleted_spam\\n,\"\n     \"# htmlmessage_edited directives.\\n\\n\"\n     \"# robot annotations can have either one or both of the following values:\\n\"\n     \"#  nofollow : do not follow the links on this page;\\n\"\n     \"#   noindex : prevent search engines from indexing the contents of this message.\\n\"\n     \"# Robot annotations instruct a visiting web  robot agent if a message contents\\n\"\n     \"# should be indexed and/or if the outgoing links from the message\\n\"\n     \"# should be followed, doing so thru a specific HTML meta tag. You can use one or\\n\"\n     \"# both values and combine them with the edited content annotation.\\n\"\n     \"# NOTE: Spam or deleted annotation values have an implicit robot \\\"noindex\\\"\\n\"\n     \"# annotation In such case, user supplied robot annotations values will be silently\\n\"\n     \"# ignored.\\n\", FALSE},\n\n    {\"deleted\", &set_deleted, \"X-Hypermail-Deleted X-No-Archive\", CFG_LIST,\n     \"# NOTE: this option has been deprecated by annotated, but it will continue\\n\"\n     \"# being parsed and honored for legacy reasons.\\n\"\n     \"# This is the list of headers that indicate the message should\\n\"\n     \"# not be displayed if the value of this header is 'yes'.\\n\", FALSE},\n\n    {\"expires\", &set_expires, \"Expires\", CFG_LIST,\n     \"# This is the list of headers that indicate the message should\\n\"\n     \"# not be displayed if the value of this header is a date in the past.\\n\", FALSE},\n\n    {\"delete_older\", &set_delete_older, NULL, CFG_STRING,\n     \"# Any message older than this date should not be displayed.\\n\", FALSE},\n\n    {\"delete_newer\", &set_delete_newer, NULL, CFG_STRING,\n     \"# Any message newer than this date should not be displayed.\\n\", FALSE},\n\n    {\"delete_msgnum\", &set_delete_msgnum, NULL, CFG_LIST,\n     \"# This is the list of message numbers that should be deleted from the\\n\"\n     \"# html archive. The mbox is not changed.\\n\", FALSE},\n\n    {\"delete_incremental\", &set_delete_incremental, BTRUE, CFG_SWITCH,\n     \"# If this option is enabled, hypermail will perform deletions on old\\n\"\n     \"# messages when run in incremental mode (according to the other delete\\n\"\n     \"# configuring option). Note that depending on your hypermail setup,\\n\"\n     \"# the size of the archive, and the complexity of the markup,\\n\"\n     \"# there may be memory and parsing issues, specifically when there are\\n\"\n     \"# non-deleted replies to a deleted message.\\n\"\n     \"# If this option is disabled, deleted messages will only be removed\\n\"\n     \"# when rebuilding the whole archive.\\n\", FALSE},\n\n    {\"delete_level\", &set_delete_level, INT(DELETE_LEAVES_STUBS), CFG_INTEGER,\n     \"# 0 - remove deleted and expired files. Note that with this choice\\n\"\n     \"#     threading may be screwed up if there are replies to deleted or\\n\"\n     \"#     expired options and the archive is updated incrementally\\n\"\n     \"# 1 - remove message body\\n\"\n     \"# 2 - remove message body for deleted messages, leave expired messages\\n\"\n     \"# 3 - leave all messages\\n\"\n     \"# Deleted and expired messages are removed from the index files\\n\"\n     \"# regardless of the delete_level selection.\\n\", FALSE},\n\n    {\"txtsuffix\", &set_txtsuffix, NULL, CFG_STRING,\n     \"# If you want the original mail messages archived in individual files,\\n\"\n     \"# set this to the extension that you want these messages to have\\n\"\n     \"# (recommended value: txt).\\n\", FALSE},\n\n    {\"filter_out\", &set_filter_out, NULL, CFG_STRINGLIST,\n     \"# Delete from the html archives any message having a header line\\n\"\n     \"# which matches any of these expressions. Uses the same rules for\\n\"\n     \"# deletion as the expires option. The expressions use the same\\n\"\n     \"# syntax as Perl regular expressions.\\n\", FALSE},\n\n    {\"filter_require\", &set_filter_require, NULL, CFG_STRINGLIST,\n     \"# Delete from the html archives any message not having header lines\\n\"\n     \"# which match each of these expressions. Uses the same rules for\\n\"\n     \"# deletion as the expires option. The expressions use the same\\n\"\n     \"# syntax as Perl regular expressions.\\n\", FALSE},\n\n    {\"filter_out_full_body\", &set_filter_out_full_body, NULL, CFG_STRINGLIST,\n     \"# Delete from the html archives any message having a line\\n\"\n     \"# which matches any of these expressions. Uses the same rules for\\n\"\n     \"# deletion as the expires option. The expressions use the same\\n\"\n     \"# syntax as Perl regular expressions.\\n\", FALSE},\n\n    {\"filter_require_full_body\", &set_filter_require_full_body, NULL, CFG_STRINGLIST,\n     \"# Delete from the html archives any message not having lines\\n\"\n     \"# which match each of these expressions. Uses the same rules for\\n\"\n     \"# deletion as the expires option. The expressions use the same\\n\"\n     \"# syntax as Perl regular expressions.\\n\", FALSE},\n\n    {\"save_alts\", &set_save_alts, INT(0), CFG_INTEGER,\n     \"# This controls what happens to alternatives (other than the prefered\\n\"\n     \"# alternative) for multipart/alternative messages.\\n\"\n     \"# 0 - discard non-prefered alternatives\\n\"\n     \"# 1 - show all alternatives inline\\n\"\n     \"# 2 - put non-prefered alternatives in a separate file.\\n\", FALSE},\n\n    {\"alts_text\", &set_alts_text, NULL, CFG_STRING,\n     \"# If save_alts is 1, this text is put between the alternatives.\\n\"\n     \"# If save_alts is 2, this text is used to describe the link to each\\n\"\n     \"# alternative file.\\n\", FALSE},\n\n    {\"warn_suppressions\", &set_warn_suppressions, BTRUE, CFG_SWITCH,\n     \"# Set this to On to get warnings (on stdout) about messages that\\n\"\n     \"# are not converted because of they are missing a msgid (if\\n\"\n     \"# require_msgids is On) or because one of the following options\\n\"\n     \"# suppressed it: deleted expires delete_msgnum filter_out\\n\"\n     \"# filter_require filter_out_full_body filter_require_full_body.\\n\", FALSE},\n\n    {\"unsafe_chars\", &set_unsafe_chars, NULL, CFG_STRING,\n     \"# Any characters listed in this string are removed from user-specified\\n\"\n     \"# attachment filenames. Those characters will be replaced by a \\\"_\\\"\\n\"\n     \"# (which means that specifying \\\"_\\\" here won't have any effect).\\n\"\n     \"# Note that many characters (including / and \\\\) are removed by the\\n\"\n     \"# safe_filename in parse.c regardless of what this option says. There\\n\"\n     \"# might be some security problems that can be prevented if you specify\\n\"\n     \"# \\\".\\\" here (e.g. if a web server is configured to enable server side\\n\"\n     \"# includes on filenames ending in something other than .shtml), but\\n\"\n     \"# that will prevent browsers from recognizing many file types.\\n\", FALSE},\n\n    {\"files_by_thread\", &set_files_by_thread, BFALSE, CFG_SWITCH,\n     \"# Set this to On to generate (in addition to the usual files),\\n\"\n     \"# a file for each thread that contains all the messages in that\\n\"\n     \"# thread.\\n\", FALSE},\n\n    {\"href_detection\", &set_href_detection, BTRUE, CFG_SWITCH,\n     \"# Set this to On to assume that any string on the body of the message\\n\"\n     \"# that says <A HREF=\\\" ... </A> is a URL, together with its markup\\n\"\n     \"# and treat it as such.\\n\", TRUE},\n\n    {\"mbox_shortened\", &set_mbox_shortened, BFALSE, CFG_SWITCH,\n     \"# Set this to On to enable use of mbox that has had some of its\\n\"\n     \"# initial messages deleted. Requires usegdbm = 1 and increment = 0.\\n\"\n     \"# The first message in the shortened mbox must have a Message-Id header.\\n\"\n     \"# If discard_dup_msgids is 0, the first message in the shortened mbox\\n\"\n     \"# may not have the same Message-Id as a message that was deleted.\\n\"\n     \"# The mbox may not be altered in any way other than deleting from\\n\"\n     \"# beginning of the mbox or appending new messages to the end (unless\\n\"\n     \"# you rebuild the archive from scratch using a complete mbox).\\n\", FALSE},\n\n    {\"report_new_folder\", &set_report_new_folder, BFALSE, CFG_SWITCH,\n     \"# Set this to On to have it print (on stdout) the names of any\\n\"\n     \"# new directories created pursuant to the folder_by_date or\\n\"\n     \"# msgsperfolder option, or the initial creation of the archive.\\n\"\n     \"# It will print the full path if that is what you use to specify\\n\"\n     \"# the archive directory. Does not print anything when attachment\\n\"\n     \"# or metadata directories are created.\\n\", FALSE},\n\n    {\"report_new_file\", &set_report_new_file, BFALSE, CFG_SWITCH,\n     \"# Set this to On to have it print (on stdout) the names of any\\n\"\n     \"# new files created for new messages. It will print the full path\\n\"\n     \"# if that is what you use to specify the archive directory.\\n\", FALSE},\n\n    {\"use_sender_date\", &set_use_sender_date, BFALSE, CFG_SWITCH,\n     \"# Set this to On to have it use the Date: header (created by the\\n\"\n     \"# the system that sent the message) rather than the date/time the\\n\"\n     \"# message was received, for purposes such as putting in folders\\n\"\n     \"# or sorting. Details of which purposes this affects may change\\n\"\n     \"# in the future.\\n\", FALSE},\n\n    {\"filename_base\", &set_filename_base, NULL, CFG_STRING,\n     \"# This option overrides the normal rules for creating attachment\\n\"\n     \"# file names, and creates file names from the string that this\\n\"\n     \"# option is set to plus a file name extension if one can be found\\n\"\n     \"# in the name supplied by the message. This option is mainly for\\n\"\n     \"# languages that use different character sets from English.\\n\", FALSE},\n};\n\n/* ---------------------------------------------------------------- */\n\nvoid MakeConfig(bool comments)\n{\n    int i;\n    time_t now = time(NULL);\n    if (comments) {\n\tfprintf(stdout,\n\t\t\"#################################################################\\n\"\n\t\t\"# This is an automatically generated config file done by\\n\"\n\t\t\"# Hypermail \" VERSION \" patchlevel \" PATCHLEVEL \" - %s\",\n\t\tctime(&now));\n    }\n    for (i = 0; i < sizeof(cfg) / sizeof(cfg[0]); i++) {\n\tif (cfg[i].verbose) {\n\t    if (comments) {\n\t\tfputs(\"\\n\", stdout);\n\t\tfputs(cfg[i].verbose, stdout);\n\t    }\n\t    switch (cfg[i].flags) {\n\t    case CFG_STRING:\n\t\tif (cfg[i].changed && *(char **)cfg[i].value)\n\t\t    /* they differ, show the actual contents */\n\t\t    fprintf(stdout, \"%s = %s\\n\", cfg[i].label,\n\t\t\t    *(char **)cfg[i].value);\n\t\telse if (comments)\n\t\t    /* show the default value, but commented */\n/*\n\t\t    fprintf(stdout, \"#%s = %s\\n\", cfg[i].label,\n*/\n\t\t    fprintf(stdout, \"%s = %s\\n\", cfg[i].label,\n\t\t\t    cfg[i].def ? (char *)cfg[i].def : \"\");\n\t\tbreak;\n\t    case CFG_LIST:\n\t    case CFG_STRINGLIST:\n\t\tif (cfg[i].changed) {\n\t\t    print_list(cfg[i].label,\n\t\t\t       *(struct hmlist **)cfg[i].value);\n\t\t}\n\t\telse if (comments) {\n\t\t    /* show the default value, but commented */\n/*\n\t\t    fprintf(stdout, \"#%s = %s\\n\", cfg[i].label,\n*/\n\t\t    fprintf(stdout, \"%s = %s\\n\", cfg[i].label,\n\t\t\t    cfg[i].def ? (char *)cfg[i].def : \"\");\n\t\t}\n\t\tbreak;\n\t    case CFG_OCTAL:\n\t\tif (cfg[i].changed)\n\t\t    /* they differ, show the actual contents */\n\t\t    fprintf(stdout, \"%s = %lo\\n\", cfg[i].label,\n\t\t\t    *(long *)(cfg[i].value));\n\t\telse if (comments)\n\t\t    /* show the default value, but commented */\n/*\n\t\t    fprintf(stdout, \"#%s = %lo\\n\", cfg[i].label,\n*/\n\t\t    fprintf(stdout, \"%s = %lo\\n\", cfg[i].label,\n\t\t\t    (long)cfg[i].def);\n\t\tbreak;\n\t    case CFG_INTEGER:\n\t\tif (cfg[i].changed)\n\t\t    /* they differ, show the actual contents */\n\t\t    fprintf(stdout, \"%s = %ld\\n\", cfg[i].label,\n\t\t\t    *(long *)(cfg[i].value));\n\t\telse if (comments)\n\t\t    /* show the default value, but commented */\n/*\n\t\t    fprintf(stdout, \"#%s = %ld\\n\", cfg[i].label,\n*/\n\t\t    fprintf(stdout, \"%s = %ld\\n\", cfg[i].label,\n\t\t\t    (long)cfg[i].def);\n\t\tbreak;\n\t    case CFG_SWITCH:\n\t\tif (cfg[i].changed)\n\t\t    /* they differ, show the actual contents */\n\t\t    fprintf(stdout, \"%s = %s\\n\",\n\t\t\t    cfg[i].label,\n\t\t\t    *(int *)(cfg[i].value) ? \"On\" : \"Off\");\n\t\telse if (comments)\n/*\n\t\t    fprintf(stdout, \"#%s = %s\\n\", cfg[i].label,\n*/\n\t\t    fprintf(stdout, \"%s = %s\\n\", cfg[i].label,\n\t\t\t    cfg[i].def ? \"On\" : \"Off\");\n\t\tbreak;\n\t    default:\n\t\tbreak;\n\t    }\t\t\t/* end of switch() */\n\t}\t\t\t/* end of if() */\n    }\t\t\t\t/* end of for() */\n}\t\t\t\t/* end of function */\n\nstatic bool inited = FALSE;\n\nvoid PreConfig(void)\n{\n    int i;\n    char name[128] = \"HM_\";\n    char *labp;\n    int ind;\n    void *defval;\n\n    for (i = 0; i < sizeof(cfg) / sizeof(cfg[0]); i++) {\n\tcfg[i].changed = FALSE;\n\n\t/* build environment variable to read from */\n\tfor (ind = 3, labp = cfg[i].label; *labp; labp++) {\n\t    name[ind++] = toupper(*labp);\n\t}\n\tname[ind] = 0;\n\n\t/* we try to get a default value from an environment variable */\n\tdefval = getenv(name);\n\tif (!defval)\n\t    /* get the built-in default instead */\n\t    defval = cfg[i].def;\n\n\tswitch (cfg[i].flags) {\n\tcase CFG_STRING:\n\t    if (defval)\n\t\t*(char **)cfg[i].value = strsav(defval);\n\t    else\n\t\t*(char **)cfg[i].value = NULL;\n\t    break;\n\tcase CFG_SWITCH:\n\tcase CFG_INTEGER:\n\tcase CFG_OCTAL:\n\t    if (defval == cfg[i].def)\n\t        *(int *)cfg[i].value = (intptr_t)defval;\n\t    else\n\t        *(int *)cfg[i].value = atoi(defval);\n\t    break;\n\tcase CFG_LIST:\n\t    if (defval) {\n                char *tpstr;\n                tpstr = strsav(defval);\n\t\t*(struct hmlist **)cfg[i].value = NULL;\n\t\t*(struct hmlist **)cfg[i].value =\n\t\t    (void *)add_list(*(struct hmlist **)cfg[i].value, tpstr);\n                free(tpstr);\n            }\n\t    else\n\t\t*(struct hmlist **)cfg[i].value = NULL;\n\t    break;\n\tcase CFG_STRINGLIST:\n\t    if (defval) {\n                char *tpstr;\n                tpstr = strsav(defval);\n\t\t*(struct hmlist **)cfg[i].value = NULL;\n\t\t*(struct hmlist **)cfg[i].value =\n\t\t    (void *)add_2_list(*(struct hmlist **)cfg[i].value, tpstr);\n                free(tpstr);\n            }\n\t    else\n\t\t*(struct hmlist **)cfg[i].value = NULL;\n\t    break;\n\tdefault:\n\t    break;\n\t}\n    }\n    inited = TRUE;\n}\n\nvoid PostConfig(void)\n{\n    int i;\n    /* Keep default behavior the same as it was when mailcommand applied\n    * to the cases now covered by replymsg_command. */\n    if (!strcmp(set_replymsg_command, \"not set\"))\n\tset_replymsg_command = set_mailcommand;\n\n    show_index[1][AUTHOR_INDEX]  = !inlist(set_avoid_indices, \"author\");\n    show_index[1][DATE_INDEX]    = !inlist(set_avoid_indices, \"date\");\n    show_index[1][SUBJECT_INDEX] = !inlist(set_avoid_indices, \"subject\");\n    show_index[1][THREAD_INDEX]  = !inlist(set_avoid_indices, \"thread\");\n    show_index[1][ATTACHMENT_INDEX] = !inlist(set_avoid_indices, \"attachments\")\n        && set_attachmentsindex;\n    if (set_folder_by_date || set_msgsperfolder) {\n\tshow_index[0][AUTHOR_INDEX]  = !inlist(set_avoid_top_indices, \"author\");\n\tshow_index[0][DATE_INDEX]    = !inlist(set_avoid_top_indices, \"date\");\n\tshow_index[0][SUBJECT_INDEX] = !inlist(set_avoid_top_indices, \"subject\");\n\tshow_index[0][THREAD_INDEX]  = !inlist(set_avoid_top_indices, \"thread\");\n\tshow_index[0][ATTACHMENT_INDEX] = !inlist(set_avoid_top_indices, \"attachments\")\n\t    && set_attachmentsindex;\n\tshow_index[0][FOLDERS_INDEX]  = !inlist(set_avoid_top_indices, \"folders\");\n    }\n    else {\n\tfor (i = 0; i <= ATTACHMENT_INDEX; ++i)\n\t    show_index[0][i] = show_index[1][i];\n    }\n    if (set_htmlbody != NULL)\n\tprintf(\"Warning: the body option has been disabled. See the\\n\"\n\t       \"INSTALL file for instructions on replacing it with a style sheet.\\n\");\n\n    if (set_save_alts < 0 || set_save_alts > 2) {\n        printf(\"Error: save_alts option value must be between 0 and 2.\\n\");\n        exit(0);\n    }\n    \n    if (set_applemail_mimehack && set_save_alts) {\n        printf(\"Warning: the applemail_mimehack option will be ignored as\\n\"\n\t       \"the save_alts options is enabled.\\n\");\n        set_applemail_mimehack = 0;\n    }\n    if (set_applemail_mimehack && set_prefered_types\n        &&  !strcasecmp(set_prefered_types->val, \"text/html\")) {\n        printf(\"Warning: the applemail_mimehack option will be ignored as\\n\"\n\t       \"text/html is the prefered type.\\n\");\n        set_applemail_mimehack = 0;\n    }\n    if (set_applemail_mimehack) {\n        if (!set_applemail_ua_header || !*set_applemail_ua_header) {\n            printf(\"Error: the applemail_mimehack option is enabled\\n\"\n                   \"but the applemail_ua_header configuration variable is empty.\\n\");\n            exit(0);\n        }\n        else if (!set_applemail_ua_value) {\n        printf(\"Error: the applemail_mimehack option is enabled\\n\"\n               \"but the applemail_ua_value configuration variable is empty.\\n\");\n        exit(0);\n        }\n    }\n}\n\nint ConfigAddItem(char *cfg_line)\n{\n    char keyword[256];\n    char towhat[1001]; /* increased due to htmlmessage_deleted */\n    char *keywp;\n    int i;\n    char *line = cfg_line;\n \n    /* \n    ** This is here to support earlier config file formats. \n    ** The \"set \" is nolonger needed but has been added \n    ** for backwards compatability.\n    */\n\n    if (!strncmp (line, \"set \", 4))\n        line += 4;\n\n    if (2 <= sscanf(line, \" %255[a-zA-Z0-9._] %*[=: ] %500[^\\n]\",\n\t\t    keyword, towhat)) {\n\n\tif ('\\\"' == towhat[0]) {\n\t    /* we have a quote as the first character, then we assume we have a\n\t       \"string\" to parse instead of just string. */\n\t    sscanf(line, \" %255[a-zA-Z0-9._] %*[=: ] \\\"%500[^\\\"]\",\n\t\t   keyword, towhat);\n\t}\n\telse {\n\t    /* no quotes, we eat all trailing white spaces */\n\t    i = strlen(towhat);\n\t    if (i--) {\n\t\twhile ((i >= 0) && isspace(towhat[i]))\n\t\t    towhat[i--] = 0;\n\t    }\n\t}\n\n\tif (!strncasecmp(keyword, \"hm_\", 3))\n\t    /* if there is a hm_ prefix, skip it! */\n\t    keywp = keyword + 3;\n\telse\n\t    keywp = keyword;\n\n\tfor (i = 0; i < sizeof(cfg) / sizeof(cfg[0]); i++) {\n\n\t    if (*keywp != *(cfg[i].label)) \t/* minor speedup */\n                continue;\n\n\t    if (!strcasecmp(keywp, cfg[i].label)) {\t/* match */\n\n\t\tswitch (cfg[i].flags) {\n\t\tcase CFG_STRING:\n\t\t    *(char **)cfg[i].value = strsav(towhat);\n\t\t    break;\n\t\tcase CFG_SWITCH:\n\t\t    if (atoi(towhat) ||\n\t\t\t!strcasecmp(\"ON\", towhat) ||\n\t\t\t!strcasecmp(\"YES\", towhat))\n\t\t\t    *(int *)cfg[i].value = (int)TRUE;\n\t\t    else\n\t\t\t*(int *)cfg[i].value = (int)FALSE;\n\t\t    break;\n\t\tcase CFG_INTEGER:\n\t\t    /* get an integer using any base */\n\t\t    /* ON/YES support is for options that used to be \n\t\t       CFG_SWITCH's */\n\t\t    if (!strcasecmp(\"ON\", towhat) || !strcasecmp(\"YES\", towhat))\n\t\t\t*(int *)cfg[i].value = 1;\n\t\t    else\n\t\t        *(int *)cfg[i].value = (int)strtol(towhat, NULL, 0);\n\t\t    break;\n\t\tcase CFG_OCTAL:\n\t\t    /* get an octal number */\n\t\t    *(int *)cfg[i].value = (int)strtol(towhat, NULL, 8);\n\t\t    break;\n\t\tcase CFG_LIST:\n\n                    /* Is this the first time that it's been called\n                     * for this list ? If so then there is a value\n                     * being set for the list via a config file.\n                     * In the case of lists we need to replace the\n                     * current value with the new material completely.\n                     */\n                    if (cfg[i].changed == FALSE) { /* first time through ? */\n                        if (cfg[i].value) {\n                            if (*(struct hmlist **)cfg[i].value)\n                                 free(*(struct hmlist **)cfg[i].value);\n\t\t            *(struct hmlist **)cfg[i].value = NULL;\n                        }\n                    }\n\t\t    *(struct hmlist **)cfg[i].value =\n\t\t       (void *)add_list(*(struct hmlist **)cfg[i].value,towhat);\n\t\t    break;\n\n\t\tcase CFG_STRINGLIST:\n\n                    /* Is this the first time that it's been called\n                     * for this list ? If so then there is a value\n                     * being set for the list via a config file.\n                     * In the case of lists we need to replace the\n                     * current value with the new material completely.\n                     */\n                    if (cfg[i].changed == FALSE) { /* first time through ? */\n                        if (cfg[i].value) {\n                            if (*(struct hmlist **)cfg[i].value)\n                                 free(*(struct hmlist **)cfg[i].value);\n\t\t            *(struct hmlist **)cfg[i].value = NULL;\n                        }\n                    }\n\t\t    *(struct hmlist **)cfg[i].value =\n\t\t       (void *)add_2_list(*(struct hmlist **)cfg[i].value,towhat);\n\t\t    break;\n\t\tdefault:\n\t\t    break;\n\t\t}\n\t\tcfg[i].changed = TRUE;\n\t\treturn 0;\n\t    }\n\t}\n    }\n    return 1;\n}\n\nint ConfigInit(char *filename)\n{\n    FILE *f;\n    char line[MAXLINE];\n    int r = TRUE;\n\n    PreConfig();\n\n    if (filename && *filename) {\n\tf = fopen(filename, \"r\");\n\tif (f) {\n\t    while (fgets(line, MAXLINE, f)) {\n\t\tif ((line[0] != '#') && (line[0] != '\\n')) {\n\t            /* need to error check the format */\n\t\t    ConfigAddItem(line);\n                }\n            }\n\t    fclose(f);\n\t}\n\telse\n\t    r = FALSE;\n    }\n\n    PostConfig();\n\n    return r;\n}\n\nvoid ConfigCleanup(void)\n{\n    int i;\n    for (i = 0; i < sizeof(cfg) / sizeof(cfg[0]); i++) {\n\tswitch (cfg[i].flags) {\n\tcase CFG_LIST:\n\tcase CFG_STRINGLIST:\n\t    if (cfg[i].value) {\n\t\tif (*(struct hmlist **)cfg[i].value)\n\t\t    free(*(struct hmlist **)cfg[i].value);\n\t    }\n\t    break;\n\tcase CFG_STRING:\n\t    if (cfg[i].value) {\n\t\tif (*(char **)cfg[i].value)\n\t\t    free(*(char **)cfg[i].value);\n\t    }\n\t    break;\n\tdefault:\n\t    break;\n\t}\n    }\n}\n\n#ifdef DEBUG\n\nvoid dump_config(void)\n{\n    register char *cp;\n\n    printf(\"\\nConfiguration Values:\\n\");\n\n    printf(\"set_language = %s\\n\",set_language ? set_language : \"Not Used\");\n    printf(\"set_htmlsuffix = %s\\n\",set_htmlsuffix ? set_htmlsuffix : \"Not Used\");\n    printf(\"set_mbox = %s\\n\", set_mbox ? set_mbox : \"Not Used\");\n    printf(\"set_archives = %s\\n\",set_archives ? set_archives : \"Not set\");\n    printf(\"set_custom_archives = %s\\n\",set_custom_archives ? set_custom_archives : \"Not set\");\n    printf(\"set_about = %s\\n\",set_about ? set_about : \"Not set\");\n    printf(\"set_dir = %s\\n\",set_dir ? set_dir : \"Not set\");\n    printf(\"set_defaultindex = %s\\n\",set_defaultindex ? set_defaultindex : \"Not set\");\n    printf(\"set_default_top_index = %s\\n\",set_default_top_index ? set_default_top_index : \"Not set\");\n\n    printf(\"set_label = %s\\n\",set_label ? set_label : \"Not set\");\n    printf(\"set_append_filename = %s\\n\",set_append_filename ? set_append_filename : \"Not set\");\n    printf(\"set_dateformat = %s\\n\",set_dateformat ? set_dateformat : \"Not set\");\n    printf(\"set_stripsubject = %s\\n\",set_stripsubject ? set_stripsubject : \"Not set\");\n    printf(\"set_mailcommand = %s\\n\",set_mailcommand ? set_mailcommand : \"Not set\");\n    printf(\"set_replymsg_command = %s\\n\",set_replymsg_command ? set_replymsg_command : \"Not set\");\n    printf(\"set_inreplyto_command = %s\\n\",set_inreplyto_command ? set_inreplyto_command : \"Not set\");\n    printf(\"set_newmsg_command = %s\\n\",set_newmsg_command ? set_newmsg_command : \"Not set\");\n    printf(\"set_mailto = %s\\n\",set_mailto ? set_mailto : \"Not set\");\n    printf(\"set_hmail = %s\\n\",set_hmail ? set_hmail : \"Not set\");\n    printf(\"set_domainaddr = %s\\n\",set_domainaddr ? set_domainaddr : \"Not set\");\n    printf(\"set_icss_url = %s\\n\",set_icss_url ? set_icss_url : \"Not set\");\n    printf(\"set_mcss_url = %s\\n\",set_mcss_url ? set_mcss_url : \"Not set\");\n\n    printf(\"set_attachmentlink = %s\\n\",set_attachmentlink ? set_attachmentlink : \"Not set\");\n    printf(\"set_link_to_replies = %s\\n\",set_link_to_replies ? set_link_to_replies : \"Not set\");\n    printf(\"set_quote_link_string = %s\\n\",set_quote_link_string ? set_quote_link_string : \"Not set\");\n    printf(\"set_folder_by_date = %s\\n\",set_folder_by_date ? set_folder_by_date : \"Not set\");\n    printf(\"set_describe_folder = %s\\n\",set_describe_folder ? set_describe_folder : \"Not set\");\n    printf(\"set_latest_folder = %s\\n\",set_latest_folder ? set_latest_folder : \"Not set\");\n    printf(\"set_antispamdomain = %s\\n\",set_antispamdomain ? set_antispamdomain : \"Not set\");\n    printf(\"set_applemail_ua_header = %s\\n\",set_applemail_ua_header ? set_applemail_ua_header : \"Not set\");\n    \n    /* Boolean or integer */\n\n    printf(\"set_overwrite = %d\\n\",set_overwrite);\n    printf(\"set_inlinehtml = %d\\n\",set_inlinehtml);\n    printf(\"set_increment = %d\\n\",set_increment);\n    printf(\"set_readone = %d\\n\",set_readone);\n    printf(\"set_reverse = %d\\n\",set_reverse);\n    printf(\"set_showprogress = %d\\n\",set_showprogress);\n    printf(\"set_showheaders = %d\\n\",set_showheaders);\n    printf(\"set_showhtml = %d\\n\",set_showhtml);\n    printf(\"set_showbr = %d\\n\",set_showbr);\n    printf(\"set_showhr = %d\\n\",set_showhr);\n    printf(\"set_showreplies = %d\\n\",set_showreplies);\n    printf(\"set_show_msg_links = %d\\n\",set_show_msg_links);\n    printf(\"set_usetable = %d\\n\",set_usetable);\n    printf(\"set_indextable = %d\\n\",set_indextable);\n    printf(\"set_iquotes = %d\\n\",set_iquotes);\n    printf(\"set_eurodate = %d\\n\",set_eurodate);\n    printf(\"set_isodate = %d\\n\",set_isodate);\n    printf(\"set_gmtime = %d\\n\",set_gmtime);\n    printf(\"set_require_msgids = %d\\n\",set_require_msgids);\n    printf(\"set_discard_dup_msgids = %d\\n\",set_discard_dup_msgids);\n    printf(\"set_usemeta = %d\\n\",set_usemeta);\n    printf(\"set_userobotmeta = %d\\n\",set_userobotmeta);\n    printf(\"set_uselock = %d\\n\",set_uselock);\n    printf(\"set_locktime = %d\\n\",set_locktime);\n    printf(\"set_ietf_mbox = %d\\n\",set_ietf_mbox);\n    printf(\"set_usegdbm = %d\\n\",set_usegdbm);\n    printf(\"set_writehaof = %d\\n\",set_writehaof);\n    printf(\"set_append = %d\\n\",set_append);\n    printf(\"set_nonsequential = %d\\n\",set_nonsequential);\n    printf(\"set_thrdlevels = %d\\n\",set_thrdlevels);\n    printf(\"set_dirmode = %04o\\n\",set_dirmode);\n    printf(\"set_filemode = %04o\\n\",set_filemode);\n    printf(\"set_spamprotect = %04o\\n\",set_spamprotect);\n    printf(\"set_attachmentsindex = %04o\\n\",set_attachmentsindex);\n    printf(\"set_linkquotes = %d\\n\",set_linkquotes);\n    printf(\"set_searchbackmsgnum = %d\\n\",set_searchbackmsgnum);\n    printf(\"set_quote_hide_threshold = %d\\n\",set_quote_hide_threshold);\n    printf(\"set_thread_file_depth = %d\\n\",set_thread_file_depth);\n    printf(\"set_monthly_index = %d\\n\",set_monthly_index);\n    printf(\"set_yearly_index = %d\\n\",set_yearly_index);\n    printf(\"set_msgsperfolder = %d\\n\",set_msgsperfolder);\n    printf(\"set_iso2022jp = %d\\n\",set_iso2022jp);\n    printf(\"set_delete_incremental = %d\\n\",set_delete_incremental);\n    printf(\"set_delete_level = %d\\n\",set_delete_level);\n    printf(\"set_delete_older = %d\\n\",set_delete_older);\n    printf(\"set_delete_newer = %d\\n\",set_delete_newer);\n    printf(\"set_noindex_onindexes = %d\\n\",set_noindex_onindexes);\n    printf(\"set_format_flowed= %d\\n\",set_format_flowed);\n    printf(\"set_format_flowed_disable_quoted= %d\\n\",set_format_flowed_disable_quoted);\n    printf(\"set_applemail_mimehack = %d\\n\",set_applemail_mimehack);    \n\n    if (!set_ihtmlheader)\n        printf(\"set_ihtmlheader = Not set\\n\");\n    else {\n        printf(\"set_ihtmlheader = \");\n        for (cp = set_ihtmlheader; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_ihtmlfooter)\n        printf(\"set_ihtmlfooter = Not set\\n\");\n    else {\n        printf(\"set_ihtmlfooter = \");\n        for (cp = set_ihtmlfooter; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_ihtmlhead)\n        printf(\"set_ihtmlhead = Not set\\n\");\n    else {\n        printf(\"set_ihtmlhead = \");\n        for (cp = set_ihtmlhead; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_ihtmlhelpup)\n        printf(\"set_ihtmlhelpup = Not set\\n\");\n    else {\n        printf(\"set_ihtmlhelpup = \");\n        for (cp = set_ihtmlhelpup; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_ihtmlhelplow)\n        printf(\"set_ihtmlhelplow = Not set\\n\");\n    else {\n        printf(\"set_ihtmlhelplow = \");\n        for (cp = set_ihtmlhelplow; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_ihtmlnavbar2up)\n        printf(\"set_ihtmlnavbar2up = Not set\\n\");\n    else {\n        printf(\"set_ihtmlnavbar2up = \");\n        for (cp = set_ihtmlnavbar2up; *cp; cp++)\n             putchar(*cp);\n    }\n\n\n    if (!set_mhtmlheader)\n        printf(\"set_mhtmlheader = Not set\\n\");\n    else {\n        printf(\"set_mhtmlheader = \");\n        for (cp = set_mhtmlheader; *cp; cp++)\n             putchar(*cp);\n    }\n\n    if (!set_mhtmlfooter)\n        printf(\"set_mhtmlfooter = Not set\\n\");\n    else {\n        printf(\"set_mhtmlfooter = \");\n        for (cp = set_mhtmlfooter; *cp; cp++)\n             putchar(*cp);\n    }\n\n    /* List values */\n\n    print_list(\"set_text_types\", set_text_types);\n    print_list(\"set_inline_types\", set_inline_types);\n    print_list(\"set_prefered_types\",set_prefered_types);\n    print_list(\"set_ignore_types\",set_ignore_types);\n    print_list(\"set_show_headers\", set_show_headers);\n    print_list(\"set_avoid_top_indices\", set_avoid_top_indices);\n    print_list(\"set_avoid_indices\", set_avoid_indices);\n    print_list(\"set_annotated\", set_annotated);\n    print_list(\"set_deleted\", set_deleted);\n    print_list(\"set_expires\", set_expires);\n    print_list(\"set_delete_msgnum\", set_delete_msgnum);\n    print_list(\"set_applemail_ua_value\", set_applemail_ua_value);\n    \n    \n}\n\n#endif\n"
  },
  {
    "path": "src/setup.h",
    "content": "#ifndef __SETUP_H\n#define __SETUP_H\n\ntypedef int bool;\n\nstruct Config {\n    char *label;\t\t/* the real-name of what to set */\n    void *value;\t\t/* pointer to the real storage */\n    void *def;\t\t\t/* default value */\n    char flags;\t\t\t/* specifies the kind of config setting, \n                                   see defines below */\n    char *verbose;\t\t/* detailed description of the label */\n    bool changed;\t\t/* read from .config or .set file */\n};\n\n#define CFG_INTEGER 0\t\t/* 0 - 2G */\n#define CFG_SWITCH  1\t\t/* TRUE / FALSE */\n#define CFG_STRING  2\t\t/* regular string, pointing to a static \n                                   string area */\n#define CFG_LIST    3\t\t/* comma seperated list, uses itemlist */\n#define CFG_FUNCTION 4\t\t/* function */\n#define CFG_OCTAL   5\t\t/* numerical, octal based */\n#define CFG_STRINGLIST    6\t/* uses itemlist, whole lines used as items */\n\n#define BTRUE (void *)1\n#define BFALSE (void *)0\n\n#define INT(x) (void *)x\n\nint ConfigInit(char *filename);\nvoid ConfigCleanup(void);\nint ConfigAddItem(char *line);\nvoid MakeConfig(bool);\t\t/* set to TRUE to include comments */\nvoid PreConfig(void);\nvoid PostConfig(void);\n\nextern char *set_antispam_at;\nextern char *set_htmlmessage_edited;\nextern char *set_htmlmessage_deleted_other;\nextern char *set_htmlmessage_deleted_spam;\nextern char *set_fragment_prefix;\nextern char *set_language;\nextern char *set_htmlsuffix;\nextern char *set_mbox;\nextern char *set_archives;\nextern char *set_custom_archives;\nextern char *set_about;\nextern char *set_dir;\nextern char *set_defaultindex;\nextern char *set_default_top_index;\nextern char *set_txtsuffix;\n\nextern bool set_email_address_obfuscation;\nextern bool set_i18n;\nextern bool set_i18n_body;\nextern bool set_overwrite;\nextern bool set_inlinehtml;\nextern bool set_increment;\nextern bool set_readone;\nextern bool set_reverse;\nextern bool set_reverse_folders;\nextern bool set_showprogress;\nextern bool set_showheaders;\nextern bool set_showbr;\nextern bool set_showhr;\nextern bool set_showreplies;\nextern int set_show_msg_links;\nextern int set_show_index_links;\nextern bool set_usetable;\nextern bool set_indextable;\nextern bool set_iquotes;\nextern bool set_eurodate;\nextern bool set_gmtime;\nextern bool set_isodate;\nextern bool set_require_msgids;\nextern bool set_discard_dup_msgids;\nextern bool set_usemeta;\nextern bool set_userobotmeta;\nextern bool set_uselock;\nextern bool set_ietf_mbox;\nextern bool set_linkquotes;\nextern bool set_monthly_index;\nextern bool set_yearly_index;\nextern bool set_spamprotect;\nextern bool set_spamprotect_id;\nextern bool set_attachmentsindex;\nextern bool set_usegdbm;\nextern bool set_writehaof;\nextern bool set_append;\nextern char *set_append_filename;\nextern bool set_nonsequential;\nextern bool set_warn_suppressions;\nextern bool set_files_by_thread;\nextern bool set_href_detection;\nextern bool set_mbox_shortened;\nextern bool set_report_new_file;\nextern bool set_report_new_folder;\nextern bool set_use_sender_date;\nextern bool set_inline_addlink;\nextern bool set_applemail_mimehack;\nextern char *set_applemail_ua_header;\n\nextern int set_showhtml;\nextern int set_thrdlevels;\nextern int set_dirmode;\nextern int set_filemode;\nextern int set_locktime;\nextern int set_searchbackmsgnum;\nextern int set_quote_hide_threshold;\nextern int set_thread_file_depth;\nextern int set_startmsgnum;\n\nextern int set_save_alts;\nextern char *set_alts_text;\n\nextern char *set_label;\n\nextern char *set_mailcommand;\nextern char *set_newmsg_command;\nextern char *set_replymsg_command;\nextern char *set_inreplyto_command;\nextern char *set_mailto;\nextern char *set_hmail;\nextern char *set_domainaddr;\n\nextern char *set_icss_url;\nextern char *set_mcss_url;\n\nextern char *set_dateformat;\nextern char *set_indexdateformat;\n\nextern char *set_stripsubject;\nextern char *set_link_to_replies;\nextern char *set_quote_link_string;\n\nextern struct hmlist *set_text_types;\nextern struct hmlist *set_inline_types;\nextern struct hmlist *set_prefered_types;\nextern struct hmlist *set_ignore_types;\nextern struct hmlist *set_show_headers;\nextern struct hmlist *set_skip_headers;\nextern struct hmlist *set_avoid_indices;\nextern struct hmlist *set_avoid_top_indices;\nextern struct hmlist *set_filter_out;\nextern struct hmlist *set_filter_require;\nextern struct hmlist *set_filter_out_full_body;\nextern struct hmlist *set_filter_require_full_body;\nextern struct hmlist *set_applemail_ua_value;\n\nextern bool set_format_flowed;\nextern bool set_format_flowed_disable_quoted;\n\nextern char *set_ihtmlheader;\nextern char *set_ihtmlfooter;\nextern char *set_ihtmlhead;\nextern char *set_ihtmlhelpup;\nextern char *set_ihtmlhelplow;\nextern char *set_ihtmlnavbar2up;\nextern char *set_mhtmlheader;\nextern char *set_mhtmlfooter;\n\nextern char *set_attachmentlink;\nextern char *set_unsafe_chars;\nextern char *set_filename_base;\nextern bool set_linkquotes;\n\nextern char *set_antispamdomain;\n\nextern char *set_folder_by_date;\nextern char *set_latest_folder;\nextern char *set_base_url;\nextern int set_msgsperfolder;\nextern char *set_describe_folder;\n\nextern bool set_iso2022jp;\n\nextern bool set_noindex_onindexes;\nextern struct hmlist *set_annotated;\nextern struct hmlist *set_deleted;\nextern struct hmlist *set_expires;\nextern struct hmlist *set_delete_msgnum;\nextern char *set_delete_older;\nextern char *set_delete_newer;\nextern bool set_delete_incremental;\nextern int set_delete_level;\n/* values for delete_level: */\nenum { DELETE_REMOVES_FILES,\n       DELETE_LEAVES_STUBS, /* always replace msg body with lang[MSG_DELETED/MSG_EXPIRED] */\n       DELETE_LEAVES_EXPIRED_TEXT, /* stubs for deleted msgs, full msg for expired */\n       DELETE_LEAVES_TEXT /* leave full message */\n};\n\n#endif\n"
  },
  {
    "path": "src/string.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/*\n** All the nasty string functions live here.\n*/\n\n#include <iconv.h>\n#include <errno.h>\n#include <ctype.h>\n#include <sys/stat.h>\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"parse.h\"\n#include \"uconvert.h\"\n\n#ifdef HAVE_STRING_H\n#include <string.h>\n#endif\n\n/*\n** email address obfuscation\n*/\nchar *obfuscate_email_address(char *address)\n{\n  char sbuf[10];\n  struct Push buf;\n  int at_mailbox=1;\n  char *sentinel;\n  \n  if (!set_email_address_obfuscation){\n    return address;\n  }\n  \n  sentinel=strlen(address)+address;\n  \n  INIT_PUSH(buf);\n  while (address<sentinel){\n    if (*address=='@'){\n      PushString(&buf,\"&#x40;\");\n      at_mailbox=0;\n    }else{\n      if(!at_mailbox){\n\tsprintf(sbuf,\"&#%04d;\",*address);\n\tPushString(&buf,sbuf);\n      }else{\n\tsbuf[0]=*address;\n\tsbuf[1]=0x0;\n\tPushString(&buf,sbuf);\n      }\n    }\n    address++;\n  }\n  RETURN_PUSH(buf);\n}\n\nchar *unobfuscate_email_address(char *address){\n\n#define uea_sbufsize 6\n  int flag=0; /* 1==obfuscated string */\n  int on_error=0; /* 1==something was happen */\n  int on_hex=0; /* 1==base 16 */\n  int at_mailbox=1; /* 1==mailbox part */\n  char *sentinel;\n  \n  char sbuf[uea_sbufsize+1];\n  int scount=0;\n  struct Push buf;\n  long c;\n  \n  INIT_PUSH(buf);\n  \n  sentinel=strlen(address)+address;\n  \n  \n  while (address<sentinel){\n    switch (*address){\n    case '&':\n      if(strncmp(address,\"&#x40;\",6)==0){\n\tPushByte(&buf, '@');\n\taddress+=5;\n\tflag=0;\n\ton_error=0;\n\ton_hex=0;\n\tat_mailbox=0;\n\tbreak;\n      }\n      if (at_mailbox){\n\tPushByte(&buf, '&');\n\tbreak;\n      }\n      if (flag==0){\n\tflag=1;\n      }else{\n\t/* broken string */\n\ton_error=1;\n      }\n      break;\n    case ';':\n      if (at_mailbox){\n\tPushByte(&buf, ';');\n\tbreak;\n      }\n      if (flag==1){\n\tflag=0;\n\tsbuf[scount]=0;\n\tif(on_hex==1){\n\t  c=strtol(sbuf,NULL,16);\n\t}else{\n\t  c=strtol(sbuf,NULL,10);\n\t}\n\tif (on_error==0){\n\t  PushByte(&buf, (unsigned char)c); /* should be ASCII */\n\t} /* simply discard error */\n\tscount=0;\n\ton_error=0;\n      }else{\n\t/* broken string */\n\ton_error=1;\n      }\n      break;\n    case '#':\n      if (at_mailbox){\n\tPushByte(&buf, '#');\n\tbreak;\n      }\n      if (flag==1){\n\tif (*(address+1)=='x'){\n\t  on_hex=1;\n\t  address++;\n\t}else{\n\t  on_hex=0;\n\t}\n\tbreak;\n      }else{\n\tPushByte(&buf, *address);\n      }\n      break;\n    default:\n      if (at_mailbox || flag==0){\n\tPushByte(&buf, *address);\n      }else{\n\tsbuf[scount++]=*address;\n\tif (scount>=uea_sbufsize){\n\t  /* broken string */\n\t  scount=0;\n\t  on_error=1;\n\t}\n      }\n    }\n    address++;\n  }\n  RETURN_PUSH(buf);\n}\n\n/* I18N hack */\n#ifdef HAVE_ICONV_H\n#include <iconv.h>\n#endif\n\n#ifdef HAVE_ICONV\nstruct i18n_alt_charset_table {\n  char *alt;\n  char *formal;\n};\n\nstruct i18n_alt_charset_table i18n_charsettable[] = {\n  /* UTF-8 (RFC2279) */\n  {\"UNICODE-1-1-UTF-8\",\"UTF-8\"},\n  {\"UNICODE-2-0-UTF-8\",\"UTF-8\"},\n  {\"x-unicode-2-0-utf-8\",\"UTF-8\"},\n  {\"ANSI_X3.4-1968\",\"US-ASCII\"},\n\n  /* US-ASCII (RFC1345) */\n  {\"iso-ir-6\",\"US-ASCII\"},\n  {\"ANSI_X3.4-1986\",\"US-ASCII\"},\n  {\"ISO_646.irv:1991\",\"US-ASCII\"},\n  {\"ASCII\",\"US-ASCII\"},\n  {\"ISO646-US\",\"US-ASCII\"},\n  {\"us\",\"US-ASCII\"},\n  {\"IBM367\",\"US-ASCII\"},\n  {\"cp367\",\"US-ASCII\"},\n  {\"csASCII\",\"US-ASCII\"},\n  {\"iso-ir-6us\",\"US-ASCII\"},\n\n  /* Arabic (RFC1324) */\n  {\"ISO_8859-6:1987\",\"ISO-8859-6\"},\n  {\"iso-ir-127\",\"ISO-8859-6\"},\n  {\"ECMA-114\",\"ISO-8859-6\"},\n  {\"arabic\",\"ISO-8859-6\"},\n  {\"csISOLatinArabic\",\"ISO-8859-6\"},\n  {\"8859_6\",\"ISO-8859-6\"},\n  {\"ISO8859_6\",\"ISO-8859-6\"},\n  {\"iso8859-6\",\"ISO-8859-6\"},\n  {\"windows-1256\",\"CP1256\"},\n\n  /* Korean (RFC1557) */\n  {\"KS_C_5601-1987\",\"CP949\"},\n  {\"KS_C_5601-1989\",\"CP949\"},\n\n  /* Thai */\n  {\"windows-874\",\"CP874\"},\n\n  /* Chinese */\n  {\"x-gbk\",\"GB18030\"},\n\n  /* Cyrillic */\n  {\"x-mac-cyrillic\",\"MacCyrillic\"},\n  {\"ibm866\",\"CP866\"}\n};\n#define I18N_CHARSET_TABLE_SIZE (sizeof(i18n_charsettable)/sizeof(struct i18n_alt_charset_table))\n\nchar *i18n_canonicalize_charset(char *cs){\n\n  int x=0;\n\n  while(x<I18N_CHARSET_TABLE_SIZE){\n    if(strcasecmp(cs,i18n_charsettable[x].alt)==0){\n      return i18n_charsettable[x].formal;\n    }\n    x++;\n  }\n  return cs;\n}\n\n\nchar *i18n_convstring(char *string, char *fromcharset, char *tocharset, size_t *len){\n\n  size_t origlen,strleft,bufleft;\n  size_t origbuflen;\n  char *convbuf,*origconvbuf;\n  iconv_t iconvfd;\n  size_t ret;\n  int error;\n\n  if (string){\n    strleft=origlen=strlen(string);\n  }else{\n    strleft=origlen=0;\n  }\n  origbuflen = origlen*7;\n  origconvbuf=convbuf=malloc(origbuflen+1);\n  memset(origconvbuf,0,origbuflen);\n  bufleft=origlen*7;\n\n  if (!set_i18n || strcasecmp(fromcharset,tocharset)==0){\n    /* we don't need to convert string here */\n    *len=origlen;\n    memcpy(origconvbuf,string,origlen);\n    origconvbuf[origlen]=0x0;\n    return origconvbuf;\n  }\n\n  iconvfd=iconv_open(i18n_canonicalize_charset(tocharset),i18n_canonicalize_charset(fromcharset));\n  if(iconvfd==(iconv_t)(-1)){\n    if(set_showprogress){\n      if(errno==EINVAL){\n        printf(\"I18N: unsupported encoding: charset=(from=%s, to=%s).\\n\",fromcharset,tocharset);\n      }else{\n        printf(\"I18N: libiconv open error.\\n\");\n      }\n    }\n    origlen=snprintf(origconvbuf,origbuflen, \"(unknown charset) %s\",string);\n    origconvbuf[origlen]=0x0;\n    *len=origlen;\n    return origconvbuf;\n  }\n  errno=0;\n  ret=iconv(iconvfd, &string, &strleft, &convbuf, &bufleft);\n\n  if (ret==(size_t)-1){\n    error = 1;\n    switch (errno){\n    case E2BIG:\n      if(set_showprogress){\n\tprintf(\"I18N: buffer overflow.\\n\");\n      }\n      origlen=snprintf(origconvbuf, origbuflen,\"(buffer overflow) %s\",string);\n      error = 1;\n      break;\n    case EILSEQ:\n      if(set_showprogress){\n\tprintf(\"I18N: invalid multibyte sequence, from %s to %s: %s.\\n\",fromcharset,tocharset,string);\n      }\n      origlen=snprintf(origconvbuf, origbuflen,\"(wrong string) %s\",string);\n      error = 1;\n      break;\n    case EINVAL:\n      if(set_showprogress){\n\tprintf(\"I18N: incomplete multibyte sequence, from %s to %s: %s.\\n\",fromcharset,tocharset,string);\n      }\n      origlen=snprintf(origconvbuf, origbuflen,\"(wrong string) %s\",string);\n      error = 1;\n      break;\n    }\n  } else {\n    /* return to initial state */\n    iconv(iconvfd, NULL, NULL, &convbuf, &bufleft);\n    error = 0;\n  }\n  iconv_close(iconvfd);\n\n  if (error) {\n    origconvbuf[origlen]=0x0;\n    *len=origlen;\n  } else {\n#if 0\n    /* hmm... do we really need to do this? (daigo) */\n    if (strncasecmp(tocharset,\"ISO-2022-JP\",11)==0){\n      *len=origlen*7-bufleft;\n      *(origconvbuf+*len)=0x1b;\n      *(origconvbuf+*len+1)=0x28;\n      *(origconvbuf+*len+2)=0x42;\n      *len+=3;\n    }else{\n      *len=origlen*7-bufleft;\n    }\n#else\n   *len=origlen*7-bufleft; \n#endif\n    *(origconvbuf+*len)=0x0;\n  }\n\n  return origconvbuf;\n}\n\n\n/* convert text from UTF-8 to numeric reference */\n/*  escape: 1==on 0==off */\nchar *i18n_utf2numref(char *instr,int escape){\n\n  char *ucs,*headofucs;\n  size_t len;\n  struct Push buff;\n  char strbuf[10];\n\n  INIT_PUSH(buff);\n\n  if (!set_i18n){\n    PushString(&buff,instr);\n    RETURN_PUSH(buff);\n  }\n\n  headofucs=ucs=i18n_convstring(instr, \"UTF-8\", \"UCS-2BE\", &len);\n\n  unsigned int p;\n  int i = (int) len;\n  for(; i > 0; i-=2){\n    p=(unsigned char)*ucs*256+(unsigned char)*(ucs+1);\n    if (p<128){\n      /* keep ASCII characters human readable */\n      if (escape){\n        switch (p){\n        case '<':\n          PushString(&buff, \"&#0060;\");\n          break;\n        case '>':\n          PushString(&buff, \"&#0062;\");\n          break;\n        case '&':\n          PushString(&buff, \"&#0038;\");\n          break;\n        case '\\\"':\n          PushString(&buff, \"&#0034;\");\n          break;\n        case '\\'':\n          PushString(&buff, \"&#0039;\");\n          break;\n        default:\n          PushByte(&buff,p);\n        }\n      }else{\n        PushByte(&buff,p);\n      }\n    }else{\n      snprintf(strbuf,10,\"&#%04d;\",p);\n      PushString(&buff,strbuf);\n    }\n    ucs+=2;\n  }\n  free(headofucs);\n  RETURN_PUSH(buff);\n}\n\n\nunsigned char *i18n_numref2utf(char *string){\n\n  int status,len;\n  unsigned short int utf;\n  unsigned char convbuf[5],*utfstr,*headofutfstr;\n\n  len=strlen(string);\n  utfstr=headofutfstr=malloc(len);\n  memset(headofutfstr,0,len);\n\n  status=0;\n\n  while (*string!=0x0){\n    switch (*string){\n    case '&':\n      string++;\n      status++;\n      break;\n    case '#':\n      string++;\n      status++;\n      break;\n    case ';':\n      string++;\n      status=0;\n      break;\n    default:\n      if(status==2){\n        convbuf[0]=*string++;\n        convbuf[1]=*string++;\n        convbuf[2]=*string++;\n        convbuf[3]=*string++;\n        convbuf[4]=0x0;\n        utf=strtol((const char *)&convbuf[0], NULL,10);\n        if(utf<256){\n          *utfstr=(unsigned char)utf;\n          utfstr++;\n        }else{\n          /* BE */\n          *utfstr=(unsigned char)(utf>>8);\n          *(utfstr+1)=(unsigned char)(utf%256);\n          utfstr+=2;\n        }\n      }\n    }\n  }\n  *utfstr=0x0;\n  return headofutfstr;\n}\n\n/* replaces all non 7-bit ascii chars in string by a ? \n** returns the number of replaced chars\n*/\nint i18n_replace_non_ascii_chars(char *string)\n{\n    char *ptr = string;\n    int count = 0;\n  \n    while (*ptr) {\n        if (!isascii(*ptr) ||\n            (*ptr < 0x20 && *ptr != 0x0a && *ptr != 0x0d && *ptr != 0x09)) {\n            *ptr = '?';\n            count++;\n        }\n        ptr++;\n    }\n    \n    return count;\n}\n\n#endif\n/* end of I18N hack */\n\n/*\n** Push byte onto a buffer realloc the buffer if needed.\n**\n** Returns the (new) buffer pointer.\n*/\nchar *PushByte(struct Push *push, char byte)\n{\t\t\t\t/* byte to append */\n#define PUSH_DEFAULT 32\t\t/* default strings are this big */\n    if (!push)\n\treturn NULL;\t\t/* this is a sever error */\n    if (!push->string) {\n\tpush->string = (char *)malloc(PUSH_DEFAULT);\n\tif (!push->string)\n\t    return NULL;\t/* error again */\n\tpush->alloc = PUSH_DEFAULT;\n\tpush->len = 0;\n#ifdef DEBUG_PUSH\n\tfprintf(stderr, \"PUSH: INIT at index 0 alloc %d\\n\", PUSH_DEFAULT);\n#endif\n    }\n    else if ((push->len + 2) >= push->alloc) {\n\tchar *newptr;\n\tnewptr = (char *)realloc(push->string, push->alloc * 2);\t/* double the size */\n\tif (!newptr) {\n\t    return push->string;\t/* live on the old one! */\n\t}\n\tpush->alloc *= 2;\t/* enlarge the alloc size */\n\tpush->string = newptr;\t/* use the new buffer */\n#ifdef DEBUG_PUSH\n\tfprintf(stderr,\n\t\t\"PUSH: REALLOC at index %d to alloc %d\\n\", push->len,\n\t\tpush->alloc);\n#endif\n    }\n#ifdef DEBUG_PUSH\n    fprintf(stderr, \"PUSH: WRITE '%c' at index %d\\n\", byte, push->len);\n#endif\n    push->string[push->len++] = byte;\n    push->string[push->len] = 0;\t/* zero terminate */\n\n    return push->string;\t/* current buffer */\n}\n\n/*\n** Push a string onto a buffer, and realloc the buffer if needed.\n**\n** Returns the (new) buffer pointer.\n*/\nchar *PushString(struct Push *push, const char *append)\n{\t\t\t\t/* string to append */\n    char *string = NULL;\n\n#if 1\n    return PushNString(push, append, strlen(append));\n#else\n    while (*append) {\t\t/* continue until zero termination */\n\tstring = PushByte(push, *append);\n\tappend++;\t\t/* get next character */\n    }\n#endif\n    return string;\t\t/* this is the new buffer */\n}\n\n/*\n** Push a limited string onto a buffer, and realloc the buffer if needed.\n**\n** Returns the (new) buffer pointer.\n*/\nchar *PushNString(struct Push *push, const char *append,/* string to append */\n\t\t  int size)\n{\t\t\t\t/* maximum number of bytes to copy */\n    char *string = NULL;\n#if 1\n    if (!push)\n\treturn NULL;\t\t/* this is a sever error */\n    if (!push->string) {\n\tpush->string = (char *)malloc(PUSH_DEFAULT + size);\n\tif (!push->string)\n\t    return NULL;\t/* error again */\n\tpush->alloc = PUSH_DEFAULT + size;\n\tpush->len = 0;\n#ifdef DEBUG_PUSH\n\tfprintf(stderr, \"PUSH: INIT at index 0 alloc %d\\n\", PUSH_DEFAULT);\n#endif\n    }\n    else if ((push->len + size + 1) >= push->alloc) {\n\tchar *newptr;\n\tpush->alloc = 2*push->alloc + size;\t/* enlarge the alloc size */\n\tnewptr = (char *)realloc(push->string, push->alloc);\t/* double the size */\n\tif (!newptr) {\n\t    return push->string;\t/* live on the old one! */\n\t}\n\tpush->string = newptr;\t/* use the new buffer */\n#ifdef DEBUG_PUSH\n\tfprintf(stderr,\n\t\t\"PUSH: REALLOC at index %d to alloc %d\\n\", push->len,\n\t\tpush->alloc);\n#endif\n    }\n#ifdef DEBUG_PUSH\n    fprintf(stderr, \"PUSH: WRITE '%s' at index %d\\n\", append, push->len);\n#endif\n    strncpy(push->string + push->len, append, size);\n    push->len += size;\n    push->string[push->len] = 0;\n\n    string = push->string;\t/* current buffer */\n\n#else\n    while (*append && size--) {\t/* continue until zero termination */\n\tstring = PushByte(push, *append);\n\tappend++;\t\t/* get next character */\n    }\n#endif\n\n    return string;\t\t/* this is the new buffer */\n}\n\n\n/*\n** Malloc() out a string, give it to whoever asked for it.\n*/\n\nchar *strsav(const char *s)\n{\n    char *p;\n\n    if (NULL == s)\n\ts = \"\";\t\t\t/* Daniel's kludge to survive better */\n\n    p = (char *)emalloc(strlen(s) + 1);\n    strcpy(p, s);\n    return p;\n}\n\nchar *strreplace(char *present, char *new)\n{\n    char *retval;\n    int len;\n    if (new == NULL) {\n\tfree(present);\n\treturn NULL;\n    }\n    len = strlen(new) + 1;\n    if (present == NULL)\n\tretval = (char *)malloc(len);\n    else\n\tretval = (char *)realloc(present, len);\n    return strcpy(retval, new);\t/* CCC is safe, buffer allocated for it\n\t\t\t\t\t   by length of string 'new' */\n}\n\n/*\n** strcpymax() - copies a string, but max N bytes. It guarantees the\n** destination string to be zero terminated. That is, if the destination\n** buffer is X bytes, set N to X.\n*/\n\nvoid strcpymax(char *dest, const char *src, int n)\n{\n    int i;\n    if (n) {\n\tn--;\t\t\t/* decrease one to allow for the termination byte */\n\tfor (i = 0; *src && (i < n); i++)\n\t    *dest++ = *src++;\n    }\n    *dest = 0;\n}\n\n/*\n** strtolower - converts a string to lower case.\n*/\n\nvoid strtolower(char *string)\n{\n  char *ptr;\n\n  if (!string)\n    return;\n\n  ptr = string;\n  while (*ptr) {\n    if (isalpha (*ptr))\n      *ptr = tolower (*ptr);\n    ptr++;\n  }\n}\n\n#ifndef HAVE_STRCASESTR\n/*\n** strcasestr() - case insensitive strstr()\n*/\n\n/* Stolen-- stolen!-- from glibc 2.1. Please don't sue me. */\n\nchar *strcasestr (const char *phaystack, const char *pneedle)\n{\n  register unsigned char *haystack;\n  register const unsigned char *needle;\n  register unsigned b, c;\n\n  haystack = (unsigned char *) phaystack;\n  needle = (const unsigned char *) pneedle;\n\n  b = tolower (*needle);\n  if (b != '\\0')\n    {\n      haystack--;\t\t\t\t/* possible ANSI violation */\n      do\n\t{\n\t  c = *++haystack;\n\t  if (c == '\\0')\n\t    goto ret0;\n\t}\n      while (tolower (c) != b);\n\n      c = tolower (*++needle);\n      if (c == '\\0')\n\tgoto foundneedle;\n      ++needle;\n      goto jin;\n\n      for (;;)\n        {\n          register unsigned a;\n\t  register unsigned char *rhaystack;\n\t  register const unsigned char *rneedle;\n\n\t  do\n\t    {\n\t      a = *++haystack;\n\t      if (a == '\\0')\n\t\tgoto ret0;\n\t      if (tolower (a) == b)\n\t\tbreak;\n\t      a = *++haystack;\n\t      if (a == '\\0')\n\t\tgoto ret0;\nshloop:\t    ;\n    \t }\n          while (tolower (a) != b);\n\njin:\t  a = *++haystack;\n\t  if (a == '\\0')\n\t    goto ret0;\n\n\t  if (tolower (a) != c)\n\t    goto shloop;\n\n\t  rhaystack = haystack-- + 1;\n\t  rneedle = needle;\n\t  a = tolower (*rneedle);\n\n\t  if (tolower (*rhaystack) == a)\n\t    do\n\t      {\n\t\tif (a == '\\0')\n\t\t  goto foundneedle;\n\t\t++rhaystack;\n\t\ta = tolower (*++needle);\n\t\tif (tolower (*rhaystack) != a)\n\t\t  break;\n\t\tif (a == '\\0')\n\t\t  goto foundneedle;\n\t\t++rhaystack;\n\t\ta = tolower (*++needle);\n\t      }\n\t    while (tolower (*rhaystack) == a);\n\n\t  needle = rneedle;\t\t/* took the register-poor approach */\n\n\t  if (a == '\\0')\n\t    break;\n        }\n    }\nfoundneedle:\n  return (char*) haystack;\nret0:\n  return 0;\n}\n#endif\n\n/*\n** Strips the timezone information from long date strings, so more correct\n** comparisons can be made between dates when looking for article replies.\n** Y2K ok.\n*/\n\nchar *stripzone(char *date)\n{\n    int num;\n    static char tmpdate[DATESTRLEN];\n\n    if (!strcmp(date, NODATE))\n\treturn (date);\n\n    if (!strchr(date, ':'))\n\treturn (date);\n\n    strcpymax(tmpdate, date, DATESTRLEN);\n    num = strlen(tmpdate);\n    while (tmpdate[num] != ':')\n\tnum--;\n\n    num += 3;\n    while (tmpdate[num])\n\ttmpdate[num++] = '\\0';\n\n    return (tmpdate);\n}\n\n/*\n** How many times does the character c appear in string s?\n*/\n\nint numstrchr(char *s, char c)\n{\n    int i;\n\n    for (i = 0; *s != '\\0'; s++) {\n\tif (*s == c)\n\t    i++;\n    }\n    return i;\n}\n\n\n/*\n** Grabs whatever happens to be between the outermost double quotes in a line.\n** This is for grabbing the values in comments.\n*/\n\nchar *getvalue(char *line)\n{\n    int i;\n    int len;\n    char *c, *d;\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    c = strchr(line, '\\\"');\n    d = strrchr(line, '\\\"');\n    if (c == NULL)\n\treturn \"\";\n    for (c++, i = 0, len = MAXLINE - 1; *c && c != d && i < len; c++)\n\tPushByte(&buff, *c);\n\n    RETURN_PUSH(buff);\n}\n\n\n/* \n** Get rid of Re:'s in a subject and strips spaces at the end\n** of subjects. Make the subject index much less cluttered.\n**\n** Returns an ALLOCATED string.\n*/\n\nchar *unre(char *subject)\n{\n    int ws = 0;\n    char *c, *s;\n\n    struct Push buff;\n    INIT_PUSH(buff);\n\n    s = subject;\n\n    while (findre(s, &c)) {\n\ts = c;\t\t\t/* get position after next re-string */\n    }\n\n    while (*s && isspace(*s))\n\ts++;\n\n    c = s;\t\t\t/* the first non-space position after the last re: */\n\n    while (*c) {\n\tif (c && isspace(*c))\n\t    ws++;\n\telse {\n\t    if (ws) {\n\t\tPushByte(&buff, ' ');\n\t\tws = 0;\n\t    }\n\t    PushByte(&buff, *c);\n\t}\n\tc++;\n    }\n    if (!PUSH_STRLEN(buff)) {\n\tPushByte(&buff, '\\0');\n    }\n\n    RETURN_PUSH(buff);\n}\n\n/*\n** Only gets rid of one re: in a subject, so messages the subject is a reply to\n** can be guessed.\n*/\n\nchar *oneunre(char *subject)\n{\n    char *c;\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    if (isre(subject, &c)) {\n\tif (*c && isspace(*c))\n\t    c++;\n\tsubject = c;\n\tPushString(&buff, subject);\n\tRETURN_PUSH(buff);\n    }\n    return NULL;\n}\n\n/* remove space from spacecrlf eol ff sequence */\nvoid rfc3676_trim_softlb(char *line)\n{\n  char *eold;\n  \n  eold = strrchr (line, '\\n');\n  if (line != eold) {\n    if (*(eold - 1) == '\\r')\n      eold--;\n  }\n  if (line != eold) {\n    if (*(eold - 1) == ' ') {\n      /* remove the space stuffing and copy the end of line */\n      char *ptr = eold - 1;\n      \n      while (*ptr != '\\0') {\n\t*ptr = *(ptr + 1);\n\tptr++;\n      }\n    }\n  }\n}\n\n/* \n** Deletes space stuffing after quotes\n** If spaces are deleted, returns a buffer that the caller must free\n*/\nchar *rfc3676_delsp_quotes (char *line)\n{\n  char *c = line;\n  \n  while (*c == '>') {\n    c++;\n  }\n  \n  if (*c == ' ') {\n    struct Push buf;\n    char tmp_c;\n    \n    INIT_PUSH(buf);\n    tmp_c = *c;\n    *c = '\\0';                \n    PushString(&buf, line);\n    PushString(&buf, c+1);\n    *c = tmp_c;\n    \n    RETURN_PUSH(buf);\n  }\n\n  return NULL;\n}\n\n/* \n** returns true if line ends with a \\n or \\r\\n \n*/\nint rfc3676_ishardlb(const char *line)\n{\n  int res;\n\n  if (*line == '\\n'\n      || (*line == '\\r' && *(line+1) == '\\n')) {\n      res = TRUE;\n  } else {\n      res = FALSE;\n  }\n\n  return res;\n}\n\n/*\n** Is a line in an article body part of a quoted passage?\n*/\n\nint isquote(const char *line)\n{\n    const char *lp;\n    const char *quote_prefix = get_quote_prefix();\n\n    if (!line)\n\treturn (0);\n\n    if (*quote_prefix) {\n\treturn !strncmp(quote_prefix, line, strlen(quote_prefix));\n    }\n    if (*line == '>')\n\treturn 1;\n\n    lp = line;\n\n#ifdef RECOGNIZE_SUPERCITE_QUOTES\n    /*\n       ** If there is a \":\" in the first column, \n       ** it means the text is quoted. \n     */\n    if (*lp == ':') {\n\tconst char *cp;\n\t/* \n\t   ** Check to make sure that smileys are not\n\t   ** intrepreted as Supercite Quotes.\n\t */\n\tcp = lp + 1;\n\tif (*cp && *cp != '-' && *cp != ']' &&\n\t    *cp != '>' && *cp != '(' && *cp != ')' && *cp != '^')\n\t    return 1;\n    }\n#endif\n\n    while (*lp && (*lp == ' ' || *lp == '\\t'))\n\tlp++;\n\n    if (!(*lp))\n\treturn 0;\n\n#ifdef RECOGNIZE_SUPERCITE_QUOTES\n    /*\n       ** recognize citations in the form \"  Jane>\" \n     */\n\n    while (*lp &&\n\t   ((*lp >= 'A' && *lp <= 'Z') ||\n\t    (*lp >= 'a' && *lp <= 'z'))) lp++;\n#endif\n\n    if (*lp == '>')\n\treturn 1;\n\n    return 0;\n}\n\n/*\n** A ripoff from convchars, for a special case.\n** Converts - to &ndash;. Used for storing strings\n** in XML comments.\n**\n** Returns an ALLOCATED string!\n*/\nchar *convdash (char *line)\n{\n    struct Push buff;\n\n    INIT_PUSH(buff);\t\t/* init macro */\n\n    /* avoid strlen() for speed */\n\n    for (; *line; line++) {\n\n      if (*line == '-')\n\tPushString(&buff, \"&ndash;\");\n      else\n\tPushByte(&buff, *line);\n    }\n    RETURN_PUSH(buff);\n} /* end convdash() */\n\n/*\n** Converts <, >, and & to &lt;, &gt; and &amp;.\n** It was ugly. Now its better. And probably faster.\n**\n** Returns an ALLOCATED string!\n*/\n\nchar *convcharsreal(char *line, char *charset, int spamprotect)\n{\n    struct Push buff;\n    int in_ascii = TRUE, esclen = 0;\n    int seen_at = FALSE;\n    bool is_iso_8859_1;\n\n    if (charset && !strcasecmp (\"iso-8859-1\", charset))\n      is_iso_8859_1 = TRUE;\n    else\n      is_iso_8859_1 = FALSE;\n\n    INIT_PUSH(buff);\t\t/* init macro */\n\n    /* avoid strlen() for speed */\n\n    for (; *line; line++) {\n\n\tif (set_iso2022jp) {\n\t\tiso2022_state(line, &in_ascii, &esclen);\n\t\tif (esclen && in_ascii == FALSE) {\n\t\t\tfor (; in_ascii == FALSE && *line; line++) {\n\t\t\t\tPushByte(&buff, *line);\n\t\t\t\tiso2022_state(line, &in_ascii, &esclen);\n\t\t\t}\n\t\t\tline--;\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t/* @@ JK : try to convert from the WinLatin1 code */\n\tif (is_iso_8859_1\n\t    && (unsigned char) (*line) >= 0x80 && (unsigned char) (*line) <= 0x9f) {\n\t  char *unicode_entity;\n\t  trio_asprintf (&unicode_entity, \n\t\t\t \"&#x%x;\", WIN1252CP[(unsigned char) (*line) - WIN1252CP_length]);\n\n\t  if (unicode_entity) {\n\t    PushString(&buff, (const char *) unicode_entity);\n\t    free (unicode_entity);\n\t  }\n\t  continue;\n\t}\n\n\tswitch (*line) {\n\tcase '<':\n\t    PushString(&buff, \"&lt;\");\n\t    break;\n\tcase '>':\n\t    PushString(&buff, \"&gt;\");\n\t    break;\n\tcase '&':\n\t    PushString(&buff, \"&amp;\");\n\t    break;\n\tcase '\\\"':\n\t    PushString(&buff, \"&quot;\");\n\t    break;\n\tcase '@': /* pkn added: simple \"antispam\" measure */\n\t    PushString(&buff, \"&#64;\");\n\t    seen_at = TRUE;\n\t    break;\n\tcase '.': /* pkn added */\n\t    if (seen_at && spamprotect)\n\t    {\n\t    \tPushString(&buff, \"&#46;<!--nospam-->\");\n\t    \tseen_at = FALSE;\n\t    \tbreak;\n\t    }\n\t    /* fall through */\n\tdefault:\n\t    PushByte(&buff, *line);\n\t}\n    }\n    RETURN_PUSH(buff);\n} /* end convcharsreal() */\n\nchar *convcharsnospamprotect(char *line, char *charset)\n{\n    return convcharsreal(line, charset, FALSE);\n}\nchar *convchars(char *line, char *charset)\n{\n    return convcharsreal(line, charset, set_spamprotect);\n}\n\n/*\n** Converts from an Unicode entity to the equivalent winlatin charset\n*/\nstatic bool unconvwinlatin1 (char *entity, char *conv_char)\n{\n  int i;\n  int value = 0;\n\n  if (!entity || *entity == '\\0' || *entity != '#')\n    return FALSE;\n\n  if (sscanf (entity, \"#x%x;\", &value) != 1 || value == 0)\n    return FALSE;\n\n  for (i = 0; i <  WIN1252CP_length; i++) {\n    if (WIN1252CP[i] == value)\n      break;\n  }\n\n  if (i == WIN1252CP_length)\n    return FALSE;\n\n  *conv_char =  (char) (i + 0x80);\n\n  return TRUE;\n} /* end unconvwinlatin1 */\n\n/*\n** Just the opposite of convchars().\n** Completely rewritten 17th Nov 1998 by Daniel.\n*/\n\nchar *unconvchars(char *line)\n{\n    char conv_char;\n    struct Push buff;\n    INIT_PUSH(buff);\n\n    for (; *line; line++) {\n\tif (*line == '&') {\n\t    if (!strncmp(\"lt;\", line + 1, 3)) {\n\t\tPushByte(&buff, '<');\n\t\tline += 3;\n\t    }\n\t    else if (!strncmp(\"gt;\", line + 1, 3)) {\n\t\tPushByte(&buff, '>');\n\t\tline += 3;\n\t    }\n\t    else if (!strncmp(\"amp;\", line + 1, 4)) {\n\t\tPushByte(&buff, '&');\n\t\tline += 4;\n\t    }\n\t    else if (!strncmp(\"&#46;<!--nospam-->\", line + 1, 18)) {\n\t        PushByte(&buff, '.');\n\t        line += 18;\n\t    }\n\t    else if (!strncmp(\"quot;\", line + 1, 5)) {\n\t\tPushByte(&buff, '\\\"');\n\t\tline += 5;\n\t    }\n\t    else if (!strncmp(\"#64;\", line + 1, 4)) {\n\t\tPushByte(&buff, '@');\n\t\tline += 4;\n\t    }\n\t    else if (!strncmp(\"ndash;\", line + 1, 6)) {\n\t        PushByte(&buff, '-');\n\t\tline += 6;\n\t    }\n\t    else if (unconvwinlatin1 (line + 1, &conv_char)) {\n\t\tPushByte(&buff, conv_char);\n\t    }\n\t    else\n\t        PushByte(&buff, *line);\n\t}\n\telse\n\t  PushByte(&buff, *line);\n    }\n    RETURN_PUSH(buff);\n}\n\n/*\n * translatechars() is just a ripoff of convertchars() \n * with a different argument list.\n */\n\nstatic void translatechars(char *start, char *end, struct Push *buff)\n{\n    char *p;\n    int in_ascii = TRUE, esclen = 0;\n\n    for (p = start; p <= end; p++) {\n\n\tif (set_iso2022jp) {\n\t\tiso2022_state(p, &in_ascii, &esclen);\n\t\tif (esclen && in_ascii == FALSE) {\n\t\t\tfor (; in_ascii == FALSE && p <= end; p++) {\n\t\t\t\tPushByte(buff, *p);\n\t\t\t\tiso2022_state(p, &in_ascii, &esclen);\n\t\t\t}\n\t\t\tp--;\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tswitch (*p) {\n\tcase '<':\n\t    PushString(buff, \"&lt;\");\n\t    break;\n\tcase '>':\n\t    PushString(buff, \"&gt;\");\n\t    break;\n\tcase '&':\n\t    PushString(buff, \"&amp;\");\n\t    break;\n\tcase '\\\"':\n\t    PushString(buff, \"&quot;\");\n\t    break;\n\tdefault:\n\t    PushByte(buff, *p);\n\t}\n    }\n}\n\n\n/*\n * translateurl(), to escape URI strings only.\n *  this should be divided from convchars().\n *\n *   in_mailcommand: line is MAILCOMMAND, if 1\n *\n */\nstatic char *translateurl(char *line, int in_mailcommand)\n{\n\n  int hexbuflen;\n  char hexbuf[16];\n  struct Push buff;\n  INIT_PUSH(buff);\t\t/* init macro */\n  \n  for(; *line; line++){\n    if(isalnum((int)*line)){\n      PushByte(&buff,*line);\n    }else{\n      switch (*line){\n\t/* we can use unreserved characters, others should be escaped */\n\t/*  RFC2396: */\n\t/*  unreserved = alphanum | mark */\n\t/*  mark = \"-\" | \"_\" | \".\" | \"!\" | \"~\" | \"*\" | \"'\" | \"(\" | \")\" */\n      case '-':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '_':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '.':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '!':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '~':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '*':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '\\'':\n\tPushByte(&buff,*line);\n\tbreak;\n      case '(':\n\tPushByte(&buff,*line);\n\tbreak;\n      case ')':\n\tPushByte(&buff,*line);\n\tbreak;\n\n\t/*\n\t * following characters are reserved, but used in MAILCOMMAND\n\t */\n\n      case ':':\n\tif (in_mailcommand){\n\t  PushByte(&buff,*line);\n\t  break;\n\t}\n      case '?':\n\tif (in_mailcommand){\n\t  PushByte(&buff,*line);\n\t  break;\n\t}\n      case '&':\n\tif (in_mailcommand){\n\t  /* ...to reduce CPU cycles */\n\t  PushString(&buff,\"&amp;\");\n\t  break;\n\t}\n      case '=':\n\tif (in_mailcommand){\n\t  PushByte(&buff,*line);\n\t  break;\n\t}\n      case '$':\n\tif (in_mailcommand){\n\t  PushByte(&buff,*line);\n\t  break;\n\t}\n\n      default:\n\t/* URIs MUST NOT have non-ascii characters */\n\t/* otherwise, we must use IRI */\n\thexbuflen=snprintf(hexbuf,4,\"%%%02X\",*line);\n\tPushString(&buff,hexbuf);\n\tbreak;\n      }\n    }\n  } \n  RETURN_PUSH(buff);\n}\n\n/* Given a string, replaces all instances of \"oldpiece\" with \"newpiece\".\n**\n** Modified this routine to eliminate recursion and to avoid infinite\n** expansion of string when newpiece contains oldpiece.  --Byron Darrah\n**\n** 1998-11-17 (Daniel) modified to deal with any length strings and dynamic\n** buffers.\n*/\n\nchar *replace(char *string, char *oldpiece, char *newpiece)\n{\n    int str_index, newstr_index, oldpiece_index, end,\n\tnew_len, old_len, cpy_len;\n    char *c;\n\n    struct Push buff;\n\n    INIT_PUSH(buff);\n\n    if ((c = (char *)strstr(string, oldpiece)) == NULL) {\n\t/* push the whole thing */\n\tPushString(&buff, string);\n\tRETURN_PUSH(buff);\n    }\n\n    new_len = strlen(newpiece);\n    old_len = strlen(oldpiece);\n    end = strlen(string) - old_len;\n    oldpiece_index = c - string;\n\n    newstr_index = 0;\n    str_index = 0;\n    while (str_index <= end && c != NULL) {\n\t/* Copy characters from the left of matched pattern occurence */\n\tcpy_len = oldpiece_index - str_index;\n\tPushNString(&buff, string + str_index, cpy_len);\n\n\tnewstr_index += cpy_len;\n\tstr_index += cpy_len;\n\n\t/* Copy replacement characters instead of matched pattern */\n\n\tPushString(&buff, newpiece);\n\n\tnewstr_index += new_len;\n\tstr_index += old_len;\n\n\t/* Check for another pattern match */\n\tif ((c = (char *)strstr(string + str_index, oldpiece)) != NULL)\n\t    oldpiece_index = c - string;\n    }\n    /* Copy remaining characters from the right of last matched pattern */\n    PushString(&buff, string + str_index);\n\n    RETURN_PUSH(buff);\n}\n\nchar *replacechar(char *string, char old, char *new)\n{\n    struct Push buff;\n    int in_ascii = TRUE, esclen = 0;\n\n    INIT_PUSH(buff);\n\n    for (; *string; string++) {\n\tif (set_iso2022jp) iso2022_state(string, &in_ascii, &esclen);\n\tif (in_ascii == TRUE && *string == old) {\n\t    PushString(&buff, new);\n\t}\n\telse\n\t    PushByte(&buff, *string);\n    }\n\n    RETURN_PUSH(buff);\n}\n\n/*\n** Generates the mail command to use from the default mail command,\n** the current recipient's email address, the current ID of the\n** message, and the current subject.\n**\n** Returns an ALLOCATED string!\n*/\n\nchar *makemailcommand(char *mailcommand, char *email, char *id, char *subject)\n{\n  char *newcmd = NULL, *newcmd2=NULL, *cp;\n  char *tmpsubject=NULL;\n  char *convsubj=NULL,*convemail=NULL,*convid=NULL;\n   \n  if ((cp = strrchr(email, ' ')) != NULL)\n    *cp = '\\0';\n\n  /* prepare \"Re: \" string, should this be localized? */\n  if(subject && isre(subject,NULL)){\n    trio_asprintf(&tmpsubject, \"%s\",subject);\n  }else{\n    trio_asprintf(&tmpsubject, \"Re: %s\",subject);\n  }\n\n  /* escape strings */\n  convsubj=translateurl(tmpsubject,0);\n  free(tmpsubject);\n  if(set_email_address_obfuscation){\n    convemail=obfuscate_email_address(email);\n  }else{\n    convemail=translateurl(email,0);\n  }\n  convid=translateurl(id,0);\n   \n  /* escape mailcommand, with keeping some delimiters */\n  newcmd = translateurl(mailcommand,1);\n\n  /* put email address */\n  if (strlen(email)>0){\n    newcmd2 = replace(newcmd, \"$TO\", convemail);\n  }else{\n    newcmd2 = replace(newcmd, \"$TO\", \"\");\n  }\n  free(convemail);\n  free(newcmd);\n\n  /* put message-id */\n  if (strlen(id)>0){\n    newcmd = replace(newcmd2, \"$ID\", convid);\n  }else{\n    newcmd = replace(newcmd2, \"$ID\", \"\");\n  }\n  free(convid);\n  free(newcmd2);\n   \n  /* put subject */\n  if (subject && strlen(subject)>0){\n    newcmd2 = replace(newcmd, \"$SUBJECT\", convsubj);\n  }else{\n    newcmd2 = replace(newcmd, \"$SUBJECT\", \"\");\n  }\n  free(newcmd);\n  free(convsubj);\n\n  return newcmd2;\n}\n\n/*\n** Generates the inreplyto command to use from the \n** default inreplyto command and the the current ID of the\n** message,\n**\n** Returns an ALLOCATED string!\n*/\n\nchar *makeinreplytocommand(char *inreplytocommand, char *subject, char *id)\n{\n  char *newcmd = NULL;\n  char *convid = NULL;\n\n  /* if id was interpolated from the subject, skip it */\n  if (strstr (subject, id)) {\n      return NULL;\n  }\n  \n  /* escape id */\n  if (set_email_address_obfuscation){\n    convid = obfuscate_email_address (id);\n  } else {\n    convid = translateurl (id, 0);\n  }\n\n  /* replace message-id */\n  if (strlen (id)>0) {\n    newcmd = replace (inreplytocommand, \"$ID\", convid);\n  } else {\n    newcmd = replace (inreplytocommand, \"$ID\", \"\");\n  }\n  free (convid);\n   \n  return newcmd;\n}\n\nchar *spamify(char *input)\n{\n    if (set_antispamdomain) {\n        return spamify_replacedomain(input, set_antispamdomain);\n    }\n    else {\n        return spamify_small(input);\n    }\n}\n\nchar *spamify_small(char *input)\n{\n  /* we should replace the @-letter in the email address */\n\n  char *atptr = strchr(input, '@');\n\n  if (atptr) {\n      char *newbuf = replacechar(input, '@', set_antispam_at);\n    \n      /* correct the pointer and free the old */\n      free(input);\n      return newbuf;\n  }\n  /* weird email, bail out */\n  return input;\n}\n\nchar *spamify_replacedomain(char *input, char *antispamdomain)\n{\n    char *atptr = strchr(input, '@');\n    \n    if (atptr) {\n        char *buff;\n\n        buff = parseemail(input, NULL, antispamdomain, REPLACE_DOMAIN);\n        free(input);\n        return(buff);\n    }\n    \n    /* weird email, bail out */\n    return input;\n}\n\nchar *unspamify(char *s)\n{\n    char *p;\n    if (!s)\n\treturn s;\n    if (!strchr(s, '@') && ((p = strstr(s, set_antispam_at)) != NULL)) {\n\tstruct Push buff;\n\tINIT_PUSH(buff);\n\tPushNString(&buff, s, p - s);\n\tPushByte(&buff, '@');\n\tPushString(&buff, p + strlen(set_antispam_at));\n\treturn PUSH_STRING(buff);\n    }\n    return strsav(s);\n}\n\n/*\n** RFC 1738\n** Thus, only alphanumerics, the special characters \"$-_.+!*'(),\", and\n** reserved characters used for their reserved purposes may be used\n** unencoded within a URL.\n**\n**\n**        //<user>:<password>@<host>:<port>/<url-path>\n** \n** Some or all of the parts \"<user>:<password>@\", \":<password>\",\n** \":<port>\", and \"/<url-path>\" may be excluded.  The scheme specific\n** data start with a double slash \"//\" to indicate that it complies with\n** the common Internet scheme syntax.\n**\n*/\n\nchar *parseemail(char *input,\t/* string to parse */\n\t\t char *mid,\t/* message ID */\n\t\t char *msubject,\n\t\t parseemail_conversion_t conversion) /* how to output parsed mail */\n{\t\t\t\t/* message subject */\n    char mailbuff[256];\n    char mailaddr[MAILSTRLEN];\n    char tempbuff[MAXLINE];\n    char *ptr;\n    char *lastpos = input;\n    char *start = NULL;\n    struct Push buff;\n    \n    char *at;\n    int at_len;\n\n    int in_ascii = TRUE, esclen = 0;\n\n    if(set_spamprotect)\n      at=set_antispam_at;\n    else\n      at=\"@\";\n\n    if (strchr(input, '@') == NULL && strstr(input, \"&#64;\") == NULL) {\n        /* nothing to do here */\n    \treturn strsav(input);\n    }\n\n    INIT_PUSH(buff);\n\n    while (*input) {\n        \n      /* skip detection if this is an escape or non-ascii sequence */\n      if (set_iso2022jp) {\n\tiso2022_state(input, &in_ascii, &esclen);\n\tif (esclen != 0) {\n\t  input += esclen;\n\t  continue;\n\t}\n\tif (in_ascii == FALSE) {\n\t  input++;\n\t  start = NULL;\n\t  continue;\n\t}\n      }\n\n      if (start == NULL) {\n          start = input;\n      }\n      \n      ptr = NULL;\n      if (*input == '@') {\n          ptr = input;\n          at_len = 1;\n      } else if (strncmp(input, \"&#64;\", 5) == 0) {\n          ptr = input;\n          at_len = 5;\n      }\n      \n      if (ptr) {\n\t    /* found a @ */\n\t    char *email = ptr - 1;\n\t    char content[2];\n\t    int backoff = ptr - start;\t/* max */\n\n#define VALID_IN_EMAIL_USERNAME   \"a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~\"\n#define VALID_IN_EMAIL_DOMAINNAME \"a-zA-Z0-9.-\"\n\n\t    /* check left side */\n\t    while (backoff) {\n                int res;\n\n                res = sscanf(email, \"%1[\" VALID_IN_EMAIL_USERNAME \"]\", content);\n                /* for some reason, if we have ,name sscanf will interpret the , as\n                   if were declared in VALID_IN_EMAIL_USERNAME, thus the additional\n                   check */\n\t\tif (res && content[0] != ',') {\n\t\t    email--;\n\t\t    backoff--;\n\t\t}\n\t\telse\n\t\t    break;\n\t    }\n\t    if (backoff > 2 && email[0] == '/' && email[-1] == '/'\n\t\t&& email[-2] == ':') {\n\t        ;\t\t/* part of a url such as ftp://user@host.com */\n\t    }\n\t    else if (email != ptr - 1) { /* bigger chance this is an address */\n\t\temail++;\n\t\tif (sscanf\n\t\t    (ptr + at_len, \"%255[\" VALID_IN_EMAIL_DOMAINNAME \"]\",\n\t\t     mailbuff) == 1) {\n\n\t\t    /* a valid mail right-end */\n\t\t    if (lastpos < email) {\n\t\t\tPushNString(&buff, lastpos, email - lastpos);\n\t\t    }\n\n                    trio_snprintf(mailaddr, sizeof(mailaddr),\"%.*s%s%s\", \n\t\t\t\t  ptr-email, email, at, mailbuff);\n\n\t\t    if (valid_root_domain(mailaddr)) {\n\n                        if (conversion == MAKEMAILCOMMAND) {\n                            char *mailcmd = makemailcommand(set_mailcommand,\n                                                            mailaddr, mid,\n                                                            msubject);\n                            trio_snprintf(tempbuff, sizeof(tempbuff),\n                                          \"<a href=\\\"%s\\\">%s</a>\", mailcmd,\n                                          obfuscate_email_address(mailaddr));\n                            \n                            free(mailcmd);\n                        }\n                        else if (conversion == REPLACE_DOMAIN) {\n                            trio_snprintf(tempbuff, sizeof(mailaddr),\"%.*s%s%s\", \n                                          ptr-email, email, at, msubject);\n                            \n                        }\n                        else {\n                            strcpy (tempbuff, mailaddr);\n\t\t\t}\n\t\t\t\n\t\t\tPushString(&buff, tempbuff);\n\n\t\t\tinput = ptr + strlen(mailbuff) + at_len;\n\t\t\tstart = input;\n\t\t\tlastpos = input;\n\t\t\tcontinue;\n\t\t    }\n\t\t    else {\t/* bad address */\n\t\t\tPushString(&buff, mailaddr);\n\t\t\tinput = ptr + strlen(mailbuff) + at_len;\n\t\t\tstart = input;\n\t\t\tlastpos = input;\n\t\t\tcontinue;\n\t\t    }\n\t\t}\n\t    }\n\t    /* no address, continue from here */\n\t    input = ptr + at_len;\n\t    start = input;\n\t    continue;\n      }\n      else\n\tinput++;\n    }\n    if (lastpos < input) {\n\tPushNString(&buff, lastpos, input - lastpos);\n    }\n    RETURN_PUSH(buff);\n}\n\n/*\n** Convert stuff that looks like a URL in a plain text string into a\n** corresponding html reference to the URL.\n**\n** Returns the allocated and converted string.\n**\n** This function is run on each and every body line, so it pays to make it\n** run quickly.\n**/\n\n/* See https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml\n   for current URI schemes */\nstatic char *url[] = {\n    \"http://\",\n    \"https://\",\n    \"news:\",\n    \"ftp://\",\n#if 0\n    \"file://\",/* can expose private files outside the archive in some cases? */\n#endif\n    \"gopher://\",\n    \"nntp://\",\n    \"telnet://\",\n/*  \"mailto:\", *//* Can't have mailto: as it will be converted twice */\n    \"tel:\",\n    \"rtsp://\",\n    \"im:\",  /* im:to[?header=value&header2=value] */\n    \"sip:\",\n    \"sips:\",\n    \"cap://\",\n    /* some non RFC or experimental or de-facto ones */\n    \"webcal://\",\n    \"irc://\",\n    /* URIs we used to support and that are now deprecated */\n/*    \"feed://\",*/   /* deprecated, not used anymore */\n/*  \"prospero://\",*/ /* deprecated */\n/*  \"wais://\", */    /* deprecated */\n/*  \"fax:\", */       /* deprecated by rfc3966 */\n/*  \"callto:\", */    /* deprecated by rfc3966, maybe supported for skype calls in browsers  */\n                     /* callto:<sip:foo@bar><sip:foo2@bar2> is more complex than\n                        convurl can currently handle */\n    NULL\n};\n\nchar *parseurl(char *input, char *charset)\n{\n    struct Push buff;\t\t/* output buffer */\n    char urlbuff[256];\n    char tempbuff[MAXLINE];\n    char *inputp;\n    char *match[sizeof(url) / sizeof(char **)];\n    int first;\n    char *c;\n\n    if (!input || !*input)\n\treturn NULL;\n\n    /*\n     * All our protocol prefixes have this \":\" substring in them. Most\n     * of the lines we process don't have any URL. Let's not spend any\n     * time looking for URLs in lines that we can prove cheaply don't\n     * have any; it will be a big win for average input if we follow\n     * this trivial heuristic. \n     */\n    \n    first = FALSE;\n    \n    c = strstr(input, \":\");\n    if (c == input) { /* first char in line */\n        c++;\n        c = strstr(c, \":\");\n    }\n\n    /* !c === not found */\n    while (c) {\n        if (*(c+1) == '\\0')  /* last char in line */\n            break;\n        else if ( !isalpha(*(c-1))  /* not between alpha/graph */\n                  || !isgraph(*(c+1)))  {\n            c++;\n            c = strstr(c, \":\");\n        } else {\n            first = TRUE;\n            break;\n        }\n    }\n\n    if (!first) {\n\treturn convchars(input, charset);\n    }\n\n    INIT_PUSH(buff);\n\n    /*\n     * Iterate on possible URLs in the input string. There might \n     * be more than one! \n     */\n\n    inputp = input;\n    first = TRUE;\n\n    while (1) {\n\tchar *leftmost = NULL;\n\tchar **up;\n\tchar thisprotocol[256];\n\tchar *p;\n\n\t/* Loop on protocol prefixes, searching for the leftmost. */\n\n\tfor (up = url; *up; up++) {\n\t    int i;\n\n\t    if (first) {\n\t\t/* \n\t\t * we haven't looked for this one yet, so do so and remember\n\t\t * any match we find \n\t\t */\n\t\tmatch[up - url] = p = strcasestr(inputp, *up);\n\t    }\n\t    else if (match[i = up - url]) {\n\t\t/*\n                 * we looked for it before, and we found it before, so if the\n\t\t * match is to the right of the input we have processed so\n\t\t * far, we can simply reuse it; else, search again. \n\t\t */\n\t\tif (match[i] <= inputp)\n\t\t    match[i] = p = strcasestr(inputp, *up);\n\t\telse\n\t\t    p = match[i];\n\t    }\n\t    else {\n\t\t/*\n                 * we looked for it before, and we didn't find it before, so\n\t\t * we aren't bloody likely to find it this time; don't waste\n\t\t * time looking again \n                 */\n\t\tcontinue;\n\t    }\n\n\t    if (p) {\n\t\t/*\n                 * Found a protocol prefix. We want the leftmost such, \n                 * so note the match and keep looking for other protocols. \n                 */\n\t\tif (!leftmost || p < leftmost) {\n\t\t    char *endp;\n\t\t    int len;\n                    int url_suffix_len;\n\n\t\t    leftmost = p;\n\t\t    memset(thisprotocol, 0, sizeof(thisprotocol));\n\t\t    if (p[strlen(*up) - 1] == '/') {\n                        endp = strstr(p, \"://\");\n                        url_suffix_len = 3;\n                    } else {\n                        endp = strstr(p, \":\");\n                        url_suffix_len = 1;\n                    }\n\t\t    if (endp) {\n\t\t\tlen = endp - p + url_suffix_len;\n\t\t\t/* really means something else is wrong,\n\t\t\t   but prevent buffer overflow */\n\t\t\tif (len >= sizeof(thisprotocol))\n\t\t\t    len = sizeof(thisprotocol) - 1;\n\t\t\tstrncpy(thisprotocol, p, len);\n\t\t\tthisprotocol[len] = '\\0';\n\t\t    }\n\t\t}\n\t    }\n\t}\n\n\tfirst = FALSE;\n\n\tif (leftmost) { /* we found at least one protocol prefix */\n\t    int accepted = FALSE;\n\t    int urlscan = FALSE;\n\t    int istelprotocol = !strcasecmp(thisprotocol, \"tel:\");\n\t    \n\t    /* \n\t     * all the charaters between the position where we started\n             * looking for a protocol prefix and the protocol prefix\n             * need to be checked for character translations \n\t     */\n\n\t    translatechars(inputp, leftmost-1, &buff);\n\t    inputp = leftmost + strlen(thisprotocol);\n            \n            /*\n             * If nothing follows the protocol URL, consider it's not a URL\n             * and skip it\n             */\n\n            if (*inputp != '\\0' && !isblank(*inputp)\n\t\t&& ((istelprotocol && (*inputp == '+' || isdigit(*inputp)))\n\t\t    || (!istelprotocol && !ispunct(*inputp)))) {\n\n                if (set_iso2022jp)\n\t\t    urlscan = sscanf(inputp, \"%255[^] \\033)<>\\\"\\'\\n[\\t\\\\]\", urlbuff);\n                else\n\t\t    urlscan = sscanf(inputp, \"%255[^] )<>\\\"\\'\\n[\\t\\\\]\", urlbuff);\n            }\n\n\t    if (urlscan == 1) {\n\t        char *r;\n\t\n\t\t/* \n\t\t * A valid url: up to 255 characters in a run containing legal\n\t\t * URL characters. But let's nibble off any punctuation other\n\t\t * than slashes at the end, because they are not likely part\n\t\t * of the URL. E.g. a trailing comma. \n\t\t */\n\n\t\tfor(r = strchr(urlbuff, '\\0') - 1; \n\t\t    *r != '/' && ispunct(*r) && r > urlbuff;\n\t\t    r--);\n\t\tif(r++ > urlbuff) {\n\n\t\t    /* \n\t\t     * there should be something left in the URL after we chew\n\t\t     * away the trailing punctuation if we are going to call it\n\t\t     * valid \n\t\t     */\n\n\t\t    accepted = TRUE;\n\t\t    if(*r) {\n\t\t        *r = '\\0';\n\t\t    }\n\t\t}\n\t    }\n\t    if(accepted) {\n\t      /* string is already escaped in URI context */\n\t        char *urlbuff2 = convcharsnospamprotect(urlbuff,\"us-ascii\");\n\n\t\ttrio_snprintf(tempbuff, sizeof(tempbuff),\n\t\t\t      \"<a href=\\\"%s%s\\\">%s%s</a>\",\n\t\t\t      thisprotocol, urlbuff2, thisprotocol, urlbuff2);\n\t\tPushString(&buff, tempbuff); /* append the tag buffer */\n\t\tinputp += strlen(urlbuff);\n\t\tfree(urlbuff2);\n\t    } else {\n\t        PushString(&buff, thisprotocol);\n\t    }\n\t} else {\n\t    /*\n\t     * no prospects found; translate the characters in the rest of\n\t     * the string and return \n\t     */\n\t    translatechars(inputp, strchr(inputp, '\\0') - 1, &buff);\n\t    break;\n\t}\n    }\n    RETURN_PUSH(buff);\n} /* end parseurl() */\n\n/*\n * Support RFC1468 (and RFC1554, 94 character sets)\n *\n * reference\n * - RFC1468: Japanese Character Encoding for Internet Messages (ISO-2022-JP)\n * - RFC1554: ISO-2022-JP-2: Multilingual Extension of ISO-2022-JP\n * - RFC1557: Korean Character Encoding for Internet Messages\n * - RFC2234: Japanese Character Encoding for Internet Messages\n */\n\n/*\n * state\n *\tTRUE: ascii (default)\n *\tFALSE: non-ascii\n * esclen\n *\tn: escape sequence length\n */\nvoid\niso2022_state(const char *str, int *state, int *esclen)\n{\n\tif (*state != TRUE && *state != FALSE)\n\t\t*state = TRUE;\n\n\tif (*str != '\\033') {\n\t\t*esclen = 0;\n\t\treturn;\n\t}\n\n\tswitch (*(str+1)) {\n\tcase '$':\t\n\t\tif (*(str+2) == 'B' || *(str+2) == '@' || *(str+2) == 'A') {\n\t\t\t/*\n\t\t\t * ESC $ B\tJIS X 0208-1983 to G0\n\t\t\t * ESC $ @\tJIS X 0208-1976 to G0\n\t\t\t * ESC $ A\tGB2312-1980 to G0\n\t\t\t */\n\t\t\t*state = FALSE;\n\t\t\t*esclen = 3;\n\t\t} else if ((*(str+2) == '(' && *(str+3) == 'C') ||\n\t\t\t   (*(str+2) == '(' && *(str+3) == 'D')) {\n\t\t\t/*\n\t\t\t * ESC $ ) C\tKSC 5601-1987 to G0\n\t\t\t * ESC $ ( D\tJIS X 0212-1990 to G0\n\t\t\t */\n\t\t\t*state = FALSE;\n\t\t\t*esclen = 4;\n\t\t} else {\n\t\t\t/* keep state */\n\t\t\t*esclen = 1;\n\t\t}\n\t\tbreak;\n\tcase '(':\n\t\tif (*(str+2) == 'B' || *(str+2) == 'J') {\n\t\t\t/*\n\t\t\t * ESC ( B\tASCII to G0\n\t\t\t * ESC ( J\tJIS X 0201-Roman to G0\n\t\t\t */\n\t\t\t*state = TRUE;\n\t\t\t*esclen = 3;\n\t\t} else {\n\t\t\t/* keep state */\n\t\t\t*esclen = 1;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\t/* keep state */\n\t\t*esclen = 1;\n\t}\n}\n\nchar *\nhm_strchr(const char *str, int ch)\n{\n\tif (!set_iso2022jp) {\n\t\treturn(strchr(str, ch));\n\t} else {\n\t\tint in_ascii = TRUE, esclen = 0;\n\t\n\t\tfor (; *str; str++) {\n\t\t\tiso2022_state(str, &in_ascii, &esclen);\n\t\t\tif (esclen) str += esclen;\n\t\t\tif (in_ascii == TRUE) {\n\t\t\t\tif (*str == ch)\n\t\t\t\t\treturn((char *)str);\n\t\t\t}\n\t\t}\n\t\treturn((char *)NULL);\n\t}\n}\n\n#if ! HAVE_STRERROR\n/*************************************************\n*     Provide strerror() for non-ANSI libraries  *\n*************************************************/\n\n/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()\nin their libraries, but can provide the same facility by this simple\nalternative function. */\n\nextern int   sys_nerr;\nextern char *sys_errlist[];\n\nchar *\nstrerror(int n)\n{\nif (n < 0 || n >= sys_nerr) return \"unknown error number\";\nreturn sys_errlist[n];\n}\n#endif /* HAVE_STRERROR */\n\n"
  },
  {
    "path": "src/struct.c",
    "content": "/* \n** Copyright (C) 1994, 1995 Enterprise Integration Technologies Corp.\n**         VeriFone Inc./Hewlett-Packard. All Rights Reserved.\n** Kevin Hughes, kev@kevcom.com 3/11/94\n** Kent Landfield, kent@landfield.com 4/6/97\n** \n** This program and library is free software; you can redistribute it and/or \n** modify it under the terms of the GNU (Library) General Public License \n** as published by the Free Software Foundation; either version 2 \n** of the License, or any later version. \n** \n** This program is distributed in the hope that it will be useful, \n** but WITHOUT ANY WARRANTY; without even the implied warranty of \n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \n** GNU (Library) General Public License for more details. \n** \n** You should have received a copy of the GNU (Library) General Public License\n** along with this program; if not, write to the Free Software \n** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA \n*/\n\n/* Define the following define to enable better date debugging */\n/*#define PH_DATE_DEBUG */\nint rbs = 0;\nint rbs_bigtime = 0;\n\n#include \"hypermail.h\"\n#include \"dmatch.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"parse.h\"\n#include \"getname.h\"\n\n#define HAVE_PCRE\n#ifdef HAVE_PCRE\n#ifdef __LCC__\n#include \"../lcc/pcre.h\"\n#else\n#include <pcre.h>\n#endif\n#endif\n\nstruct body *hashnumlookup(int, struct emailinfo **);\n\n/* \n** Ladies and germs - the hash function.\n*/\n\nunsigned hash(char *s)\n{\n    unsigned hashval;\n\n    /* We MUST deal with NULL pointers passed to this */\n    if (!s)\n\treturn HASHSIZE - 1;\t/* (Daniel) I think a high value is fun ;-) */\n\n    for (hashval = 0; *s; s++)\n\thashval = *s + 31 * hashval;\n    return (hashval % HASHSIZE);\n}\n\nvoid reinit_structs()\n{\n    int i;\n    for (i = 0; i < HASHSIZE; ++i) {\n\tif (etable[i]) {\n\t    free(etable[i]);\n\t    etable[i] = NULL;\n\t}\n    }\n}\n\nvoid fill_email_dates(struct emailinfo *e, char *date, char *fromdate, char *isodate, char *isofromdate)\n{\n    bool fromdate_valid = 1, date_valid = 1;\n    /* fromdate may be empty (zero length string rather than NULL)\n     * date will always have something in it - either a date or\n     * the NODATE string \"(no date)\"\n     */\n    if (isodate != NULL && isofromdate != NULL) {\n\te->date = iso_to_secs(isodate);\n\te->fromdate = iso_to_secs(isofromdate);\n\te->fromdatestr = strsav(fromdate);\n\te->datestr = strsav(date);\n    }\n    else {\n\te->date = e->fromdate = -1;\n\tif (date == NULL)\n\t    date = NODATE;\n\tif (!strcmp(date, NODATE)) {\n\t    date_valid = 0;\n\t}\n\telse {\n\t    if ((e->date = convtoyearsecs(date)) == -1)\n\t\tdate_valid = 0;\n\t}\n\tif (!*fromdate) {\n\t    fromdate_valid = 0;\n\t}\n\telse {\n\t    if ((e->fromdate = convtoyearsecs(fromdate)) == -1)\n\t\tfromdate_valid = 0;\n\t}\n\tif (fromdate_valid && !date_valid) {\n#ifdef PH_DATE_DEBUG\n\t\t\tfprintf(stderr, \"%d: %s: using fromdate '%s' for both (date '%s')\\n\", num, msgid, fromdate, date);\n#endif\n\t    e->fromdatestr = strsav(fromdate);\n\t    e->datestr = strsav(fromdate);\n\t    e->date = e->fromdate;\n\t}\n\telse if (!fromdate_valid && date_valid) {\n#ifdef PH_DATE_DEBUG\n\t\t\tfprintf(stderr, \"%d: %s: using date '%s' for both (fromdate '%s')\\n\", num, msgid, date, fromdate);\n#endif\n\t    e->fromdatestr = strsav(date);\n\t    e->datestr = strsav(date);\n\t    e->fromdate = e->date;\n\t}\n\telse if (!fromdate_valid && !date_valid) {\n#ifdef PH_DATE_DEBUG\n\t\t\tfprintf(stderr, \"%d: %s: fromdate '%s' and date '%s' both bad\\n\", num, msgid, fromdate, date);\n#endif\n\t    e->fromdatestr = strsav(fromdate);\n\t    e->datestr = strsav(date);\n\t}\n\telse {\n\t    e->fromdatestr = strsav(fromdate);\n\t    e->datestr = strsav(date);\n#ifdef PH_DATE_DEBUG\n\t    if (e->date > e->fromdate) {\n\t\trbs++;\n\t\tif ((e->date - e->fromdate) > 4200) {\t/* if more than 1:10 off */\n\t\t    char fromdate_parsed[26];\n\t\t    char date_parsed[26];\n\t\t    strcpy(fromdate_parsed, ctime(&(e->fromdate)));\n\t\t    strcpy(date_parsed, ctime(&(e->date)));\n\t\t    date_parsed[24] = '\\0';\n\t\t    fromdate_parsed[24] = '\\0';\n\t\t    rbs_bigtime++;\n\t\t    fprintf(stderr, \"%d [%d:%d]: %s: received before sent\\n %-38.38s %-30.38s\\n %-38.38s %-38.38s\\n\", num, rbs, rbs_bigtime, msgid, fromdate, date, fromdate_parsed, date_parsed);\n\t\t}\n\t    }\n#endif\n\t}\n    }\n}\n\n/*\n** The structure most of everything else depends on.\n** Hashes a message - header info, pointer to a list of body lines -\n** by number, message ID, date, and subject, so an article can be\n** handily looked up and retrieved using any of these criteria.\n*/\n\nstruct emailinfo *addhash(int num, char *date, char *name, char *email, char *msgid, char *subject, char *inreply, char *fromdate, char *charset, char *isodate, char *isofromdate, struct body *sp)\n{\n    struct emailinfo *e;\n    struct hashemail *h;\n\n    unsigned hashval;\n    char numstr[NUMSTRLEN];\n    bool msgid_dup = 0;\n    bool msgid_missing = 0;\n    static int freedummy = 0;\n    char *newmsgid;\n\n    if (!msgid) {\n\t/* SEVERE ERROR, all mails MUST have a Message-ID, ignore it! */\n\tif (set_require_msgids) {\n\t    if (set_warn_suppressions)\n\t\t\t\tprintf(\"Message-ID is missing, ignoring message with subject '%s'.\\n\", subject ? subject : \"<unknown>\");\n\t    return NULL;\n\t}\n\telse {\n\t    msgid_missing = 1;\n\t}\n    }\n\n    if (!msgid_missing) {\n\th = (struct hashemail *)etable[hash(msgid)];\n\n\twhile (h) {\n\t    if (!strcmp(h->data->msgid, msgid)) {\n\t\tmsgid_dup = 1;\n\t\tbreak;\n\t    }\n\t    h = h->next;\n\t}\n    }\n\n    if (msgid_dup && set_discard_dup_msgids) {\n\tif (set_showprogress)\n\t\tprintf(\"%d: Message-ID collision, '%s' already present - discarding message.\\n\", num, msgid);\n\treturn NULL;\n    }\n\n    if (msgid_dup || msgid_missing) {\n        /* \n         * This is broken. It needs to be corrected so that\n         * the original message id is a component of the\n         * generated message-id instead of a total unrelated\n         * dummy msg-id. Good enough for now though...\n         */\n\tnewmsgid = emalloc(MSGDSTRLEN);\n\tdo {\n\t    msgid_dup = 0;\n\t    sprintf(newmsgid, \"%d.%4.4d@hypermail.dummy\", time(NULL), freedummy);\n\t    h = (struct hashemail *)etable[hash(newmsgid)];\n\t    while (h) {\n\t\tif (!strcmp(h->data->msgid, newmsgid)) {\n\t\t    msgid_dup = 1;\n\t\t    break;\n\t\t}\n\t\th = h->next;\n\t    }\n\t    freedummy++;\n\t} while (msgid_dup && (freedummy < 1000));\n\n\tif (!msgid_dup) {\n            if (set_showprogress) {\n\t        if (msgid_missing) \n\t\t    printf(\"\\n%d Message-ID missing, using %s instead.\\n\", num, newmsgid);\n\t        else\n\t\t\t\t\tprintf(\"\\n%d Message-ID collision, '%s' already present - using %s instead.\\n\", num, msgid, newmsgid);\n            }\n\t    msgid = newmsgid;\n\t}\n\telse {\n            if (set_showprogress) {\n\t        if (msgid_missing)\n\t\t    printf(\"\\n%d Message-ID missing, failed to find free id - dropping message.\\n\", num);\n\t        else\n\t\t\t\t\tprintf(\"\\n%d Message-ID collision, '%s' already present - failed to find free id - dropping message.\\n\", num, msgid);\n            }\n\t    return NULL;\n\t}\n    }\n\n    e = (struct emailinfo *)emalloc(sizeof(struct emailinfo));\n#ifdef FASTREPLYCODE\n    e->replylist = NULL;\n    e->isreply = 0;\n#endif\n    e->msgnum = num;\n    if (num > max_msgnum)\n        max_msgnum = num;\n    e->emailaddr = strsav(email);\n    if ((name == NULL) || (*name == '\\0'))\n\te->name = strsav(email);\n    else\n\te->name = strsav(name);\n\n    fill_email_dates(e, date, fromdate, isodate, isofromdate);\n    e->subdir = msg_subdir(e->msgnum, set_use_sender_date ? e->date\n\t\t\t   : e->fromdate);\n    if (e->subdir && set_increment != -1) {\n\tif (!e->subdir->first_email)\n\t    e->subdir->first_email = e;\n\te->subdir->last_email = e;\n\t++e->subdir->count;\n    }\n    e->msgid = strsav(msgid);\n    e->subject = strsav(subject);\n    e->unre_subject = unre(subject);\n    e->inreplyto = strsav(inreply);\n    e->charset = strsav(charset);\n    e->flags = 0;\n    e->is_deleted = 0;\n    e->deletion_completed = -1;\n    e->exp_time = -1;\n    e->bodylist = sp;\n    e->initial_next_in_thread = -1;\n\n    /* Added by Daniel 1999-03-19, we need this hash later to find the mail\n       we replied to */\n    h = (struct hashemail *)emalloc(sizeof(struct hashemail));\n    hashval = hash(inreply);\n    h->next = etable[hashval];\n    h->data = e;\n    etable[hashval] = h;\n\n    h = (struct hashemail *)emalloc(sizeof(struct hashemail));\n    hashval = hash(date);\n    h->next = etable[hashval];\n    h->data = e;\n    etable[hashval] = h;\n\n    h = (struct hashemail *)emalloc(sizeof(struct hashemail));\n#if 0\n    printf(\"ADD msgid %s to HASH!\\n\", msgid);\n#endif\n    hashval = hash(msgid);\n    h->next = etable[hashval];\n    h->data = e;\n    etable[hashval] = h;\n\n    h = (struct hashemail *)emalloc(sizeof(struct hashemail));\n    hashval = hash(subject);\n    h->next = etable[hashval];\n    h->data = e;\n    etable[hashval] = h;\n\n    h = (struct hashemail *)emalloc(sizeof(struct hashemail));\n    sprintf(numstr, \"%d\", num);\n    hashval = hash(numstr);\n    h->next = etable[hashval];\n    h->data = e;\n    etable[hashval] = h;\n\n    return e;\t\t\t/* the actual mail struct pointer */\n}\n\nint insert_in_lists(struct emailinfo *emp, const bool * require_filter, int rlen)\n{\n    int i;\n    if (set_delete_msgnum) {\n\tchar num_str[32];\n\tsprintf(num_str, \"%d\", emp->msgnum);\n\tif (inlist(set_delete_msgnum, num_str)) {\n#if 0\n\t    if (!emp->is_deleted) {\n\t\t\t\tif (emp->subdir)\n\t\t    --emp->subdir->count;\n\t    }\n#endif\n\t    emp->is_deleted = FILTERED_DELETE;\n\t}\n    }\n\tfor (i = 0; i < rlen; ++i) {\n\tif (!require_filter[i]) {\n\t    emp->is_deleted = FILTERED_REQUIRED;\n\t}\n    }\n\n    if (emp->is_deleted) {\n\tstruct hashemail *h;\n\th = (struct hashemail *)malloc(sizeof(struct hashemail));\n\th->data = emp;\n\th->next = deletedlist;\n\tdeletedlist = h;\n\tif (set_warn_suppressions && require_filter) {\n\t    const char *option = \"??\";\n\t\t\tswitch (emp->is_deleted) {\n\t\t\tcase FILTERED_DELETE:\n\t\t\t\toption = \"deleted or delete_msgnum\";\n\t\t\t\tbreak;\n\t\t\tcase FILTERED_EXPIRE:\n\t\t\t\toption = \"expires\";\n\t\t\t\tbreak;\n\t\t\tcase FILTERED_OUT:\n\t\t\t\toption = \"filter_out or filter_out_full_body\";\n\t\t\t\tbreak;\n\t\t\tcase FILTERED_REQUIRED:\n\t\t\t\toption = \"filter_require or filter_require_full_body\";\n\t\t\t\tbreak;\n\t\t\tcase FILTERED_OLD:\n\t\t\t\toption = \"delete_older\";\n\t\t\t\tbreak;\n\t\t\tcase FILTERED_NEW:\n\t\t\t\toption = \"delete_newer\";\n\t\t\t\tbreak;\n\t    }\n\t\t\tprintf(\"message %d deleted under option %s. msgid: %s\\n\", emp->msgnum + 1, option, emp->msgid);\n\t}\n    }\n    else {\n        authorlist = addheader(authorlist, emp, 1, 0);\n\n\tsubjectlist = addheader(subjectlist, emp, 0, 0);\n\n    }\n    datelist = addheader(datelist, emp, 2, 0);\n    return !emp->is_deleted;\n}\n\n/*\n * Given an \"in-reply-to:\" field and a message number, this function\n * retrieves information about the message that this message is a \n * reply to.\n * If all else fails but a reply is\n * found by comparing subjects, issubjmatch is set to 1.\n *\n * Daniel 1999-03-19. Changed return type and parameters.\n*/\n#ifdef USE_OBSOLETE_HASHREPLYLOOKUP\n\nstruct emailinfo *hashreplylookup(int msgnum, char *inreply, int *issubjmatch)\n{\n    struct hashemail *ep;\n\n#if DEBUG_THREAD\n    fprintf(stderr, \"hashreplylookup(%d, '%s'...)\\n\", msgnum, inreply);\n#endif\n    *issubjmatch = 0;\n    ep = etable[hash(inreply)];\n    while (ep) {\n\t\tif ((msgnum != ep->data->msgnum) && (strcmp(inreply, ep->data->msgid) == 0)) {\n#if DEBUG_THREAD\n\t    fprintf(stderr, \"match on msgid [%d]\\n\", ep->data->msgnum);\n#endif\n\t    return ep->data;\n\t}\n\tep = ep->next;\n    }\n\n    ep = etable[hash(inreply)];\n    while (ep != NULL) {\n\t\tif ((msgnum != ep->data->msgnum) && (strstr(inreply, ep->data->datestr))) {\n#if DEBUG_THREAD\n\t    fprintf(stderr, \"match on date [%d]\\n\", ep->data->msgnum);\n#endif\n\t    return ep->data;\n\t}\n\tep = ep->next;\n    }\n\n    ep = etable[hash(inreply)];\n    while (ep != NULL) {\n\t\tif ((msgnum != ep->data->msgnum) && (strcmp(inreply, ep->data->subject) == 0)) {\n\t    *issubjmatch = 1;\n#if DEBUG_THREAD\n\t    fprintf(stderr, \"match on subject [%d]\\n\", ep->data->msgnum);\n#endif\n\t    return ep->data;\n\t}\n\tep = ep->next;\n    }\n\n    return NULL;\n}\n#endif\n\n/*\n * Given an \"message-id:\" field, this tries to retrieve information\n * about an article that has replied. If all else fails but a reply is\n * found by comparing subjects, issubjmatch is set to 1.\n *\n * Daniel 1999-03-24. New.\n*/\n\nstruct emailinfo *hashmsgidlookup(char *msgid, int *issubjmatch)\n{\n    struct hashemail *ep;\n\n    *issubjmatch = 0;\n    ep = etable[hash(msgid)];\n    while (ep) {\n\tif (strcmp(msgid, ep->data->inreplyto) == 0) {\n\t    return ep->data;\n\t}\n\tep = ep->next;\n    }\n\n    return NULL;\n}\n\n/*\n * Given an \"in-reply-to:\" field and a message number, this function\n * retrieves information about the message that this message is a \n * reply to.\n * If all else fails but a reply is\n * found by comparing subjects, maybereply is set to 1.\n*/\n\nstruct emailinfo *hashreplylookup(int msgnum, char *inreply, char *subject, int *maybereply)\n{\n    struct hashemail *ep;\n\n#if DEBUG_THREAD > 1\n\tfprintf(stderr, \"hashreplynumlookup(%d, '%s'...)\\n\", msgnum, (inreply == NULL) ? \"\" : inreply);\n#endif\n    *maybereply = 0;\n\n    if ((inreply != NULL) && *inreply) {\n\n\tep = etable[hash(inreply)];\n\twhile (ep) {\n\t    if (strcmp(inreply, ep->data->msgid) == 0) {\n#if DEBUG_THREAD\n\t\t\t\tfprintf(stderr, \"match on msgid   %4d %4d\\n\", msgnum, ep->data->msgnum);\n#endif\n\t\treturn ep->data;\n\t    }\n\t    ep = ep->next;\n\t}\n\n\tep = etable[hash(inreply)];\n\twhile (ep) {\n\t\t\tif ((msgnum != ep->data->msgnum) && (strstr(inreply, ep->data->datestr))) {\n#if DEBUG_THREAD\n\t\t\t\tfprintf(stderr, \"match on date    %4d %4d\\n\", msgnum, ep->data->msgnum);\n#endif\n\t\treturn ep->data;\n\t    }\n\t    ep = ep->next;\n\t}\n\n\tep = etable[hash(inreply)];\n\twhile (ep != NULL) {\n\t\t\tif ((msgnum != ep->data->msgnum) && (strcmp(inreply, ep->data->subject) == 0)) {\n\t\t*maybereply = 1;\n#if DEBUG_THREAD\n\t\t\t\tfprintf(stderr, \"match on subject %4d %4d\\n\", msgnum, ep->data->msgnum);\n#endif\n\t\treturn ep->data;\n\t    }\n\t    ep = ep->next;\n\t}\n\n    }\t\t\t\t/* end of matching on inreply */\n\n    /* No match so far.  Now try matching on the subject, removing\n     * one instance of \"re: \" from the front of the subject each\n     * time round the loop.\n     */\n    {\n#define MAX_SUBJ_LEN 300\n\n\tchar *s, *saved_s;\n\tstruct emailinfo *lowest_so_far = NULL;\n\tint match = 0;\n\n        size_t subj_len;\n\n        subj_len = strlen(subject) > MAX_SUBJ_LEN ? MAX_SUBJ_LEN : strlen(subject);\n        s = emalloc(subj_len + 1);\n        saved_s = strncpy(s, subject, subj_len);\n        s[subj_len] = '\\0';\n\n#ifdef NOTDEF\n/* AUDIT biege: can we trigger a DoS here by using a very long \"Subject\"? */\n\n\ts = emalloc(strlen(subject) + 1);\t\n\tsaved_s = strcpy(s, subject);\n#endif\n\n        if (isre(s, NULL))\n            do {\n#if DEBUG_THREAD > 1\n                fprintf(stderr, \"extra %s\\n\", s);\n#endif\n                ep = etable[hash(s)];\n                while (ep != NULL) {\n\t\t\t\t\tif ((strcasecmp(s, ep->data->subject) == 0) && (msgnum != ep->data->msgnum)) {\n                        match = 1;\n\t\t\t\t\t\tif (lowest_so_far == NULL || ep->data->msgnum < lowest_so_far->msgnum)\n                            lowest_so_far = ep->data;\n                    }\n                    ep = ep->next;\n                }\n                s = oneunre(s);\n            } while (s != NULL);\n\n\tfree(saved_s);\n\n\tif (match) {\n\t    *maybereply = 1;\n\t    if (lowest_so_far != NULL && lowest_so_far->msgnum < msgnum) {\n#if DEBUG_THREAD\n\t\t\t\tfprintf(stderr, \"match on extra   %4d %4d\\n\", msgnum, lowest_so_far->msgnum);\n#endif\n\t\treturn lowest_so_far;\n\t    }\n\t    else {\n#if DEBUG_THREAD\n\t\t\t\tfprintf(stderr, \"match on extra   %4d %4d discarded - less than %d\\n\", msgnum, lowest_so_far ? lowest_so_far->msgnum : -1, msgnum);\n#endif\n\t\treturn NULL;\n\t    }\n\t}\n    }\n\n#if DEBUG_THREAD\n    fprintf(stderr, \"match NO MATCH   %4d\\n\", msgnum);\n#endif\n    return NULL;\n}\n\n/*\n** Same as the above function, but only returns the article number.\n*/\n\nint hashreplynumlookup(int msgnum, char *inreply, char *subject, int *maybereply)\n{\n    struct emailinfo *email = hashreplylookup(msgnum, inreply, subject,\n\t\t\t\t\t      maybereply);\n    return email != NULL ? email->msgnum : -1;\n}\n\n\n/*\n * From an article's number, retrieve all information associated with\n * that article.\n */\n\nstruct body *hashnumlookup(int num, struct emailinfo **emailp)\n{\n    struct hashemail *ep;\n    struct body *lp_tmp;\n    char numstr[NUMSTRLEN];\n\n    sprintf(numstr, \"%d\", num);\n    for (ep = etable[hash(numstr)]; ep != NULL; ep = ep->next) {\n\tif (ep->data && (num == ep->data->msgnum)) {\n\t    /* return a mere pointer to it! */\n\t    *emailp = ep->data;\n\t    if (!ep->data->bodylist)\n\t        ep->data->bodylist = addbody(NULL, &lp_tmp, \"\\n\", 0);\n\t    return ep->data->bodylist;\n\t}\n    }\n    return NULL;\n}\n\n/*\n * returns info about the first message associated with the given msgid.\n */\n\nstruct emailinfo *hashlookupbymsgid(char *msgid)\n{\n    struct hashemail *ep;\n    if (!msgid || !*msgid)\n\treturn NULL;\n    ep = etable[hash(msgid)];\n    while (ep) {\n\tif (strcmp(msgid, ep->data->msgid) == 0) {\n\t    return ep->data;\n\t}\n\tep = ep->next;\n    }\n\n    return NULL;\n}\n\nint insert_older_msgs(int num)\n{\n    int i;\n    int num_added = 0;\n    for(i = set_startmsgnum; i < num; ++i) {\n\tstruct emailinfo *emp;\n\tif (hashnumlookup(i, &emp)) {\n\t    authorlist = addheader(authorlist, emp, 1, 0);\n\t    subjectlist = addheader(subjectlist, emp, 0, 0);\n\t    datelist = addheader(datelist, emp, 2, 0);\n\t    ++num_added;\n\t}\n    }\n    return num_added;\n}\n\n\n/*\n * Find the nearest non-deleted email to num by adding direction to num.\n */\n\nstruct emailinfo *neighborlookup(int num, int direction)\n{\n    struct hashemail *ep;\n    char numstr[NUMSTRLEN];\n    num += direction;\n\n    while (num >= 0 && num <= max_msgnum) {\n\tsprintf(numstr, \"%d\", num);\n\tfor (ep = etable[hash(numstr)]; ep != NULL; ep = ep->next)\n\t    if (ep->data && (num == ep->data->msgnum)) {\n\t        if (ep->data->is_deleted)\n\t\t    break;\n\t          /* return a mere pointer to it! */\n\t\treturn ep->data;\n\t    }\n\tnum += direction;\n    }\n    return NULL;\n}\n\n/*\n** Add a line to a linked list that makes up a boundary stack. This new one \n** should be the new \"active\" boundary.\n**\n** \"Adding\" a NULL will retrieve the formerly used boundary pointer.\n*/\n\nstruct boundary *bound(struct boundary *bnd, char *line)\n{\n    struct boundary *newnode = NULL;\n\n    if (line) {\n\tnewnode = (struct boundary *)emalloc(sizeof(struct boundary));\n\tnewnode->line = strsav(line);\n\tnewnode->next = NULL;\n\tnewnode->prev = bnd;\n\n\tif (bnd)\n\t    bnd->next = newnode;\n\n\tbnd = newnode;\n    }\n    else {\n\tif (bnd->prev) {\n\t    /* go back to the previous */\n\t    bnd = bnd->prev;\n\n\t    /* free the latest one */\n\t    free(bnd->next->line);\n\t    free(bnd->next);\n\t    bnd->next = NULL;\n\t}\n\telse {\n\t    /* this is the last node */\n\t    free(bnd->line);\n\t    free(bnd);\n\t    bnd = NULL;\n\t}\n    }\n    return bnd;\t\t/* the new \"active\" boundary */\n}\n\n/*\n** Add a line to a linked list that makes up a multipart stack. This new one \n** should be the new \"active\" multipart.\n**\n** \"Adding\" a NULL will retrieve the formerly used multipart pointer.\n** \n** We reuse the boundary function as we don't have any different\n** procedure to distinguish from it.\n*/\n\nstruct boundary *multipart(struct boundary *bnd, char *line)\n{\n    return bound(bnd, line);\n}\n\nstruct charset_stack *charsets(struct charset_stack *bnd, char *charset, char *charsetsave)\n{\n    struct charset_stack *newnode = NULL;\n\n    if (charset || charsetsave) {\n        newnode = (struct charset_stack *)emalloc(sizeof(struct charset_stack));\n        newnode->charset = (charset) ? strsav(charset) : NULL;\n        newnode->charsetsave = (charsetsave) ? strsav(charsetsave) : NULL;\n    \n        newnode->next = NULL;\n        newnode->prev = bnd;\n\n\tif (bnd)\n\t    bnd->next = newnode;\n\n\tbnd = newnode;\n    }\n    else {\n\tif (bnd->prev) {\n\t    /* go back to the previous */\n\t    bnd = bnd->prev;\n\n\t    /* free the latest one */\n            if (bnd->next->charset) {\n                free(bnd->next->charset);\n            }\n            free(bnd->next->charsetsave);\n\t    free(bnd->next);\n\t    bnd->next = NULL;\n\t}\n\telse {\n\t    /* this is the last node */\n            if (bnd->charset) {\n                free(bnd->charset);\n            }\n            free(bnd->charsetsave);\n\t    free(bnd);\n            bnd = NULL;\n\t}\n    }\n    return bnd;\t\t/* the new \"active\" boundary */\n}\n\n/* returns the first element in the stack */\nstruct charset_stack *charsets_head(struct charset_stack *bnd)\n{\n  struct charset_stack *cursor = bnd;\n\n  if (cursor) {\n      while (cursor->prev) {\n          cursor = cursor->prev;\n      }\n  }\n  return cursor;\n}\n  \n/*\n** Frees the memory allocated to a boundary structure/\n** Returns the number of elements freed.\n*/\nstatic int free_boundary(struct boundary *bnd)\n{\n    struct boundary *cursor = bnd;\n      \n    struct boundary *tmp;\n  \n    int counter = 0;\n    \n    if (bnd && bnd->next) {\n        fprintf (stderr, \"free_boundary(): Error: boundary has a non-empty next element.\\nLINE : %s\\n\",\n                 bnd->line);\n    }\n    \n    cursor = bnd;\n    while (cursor) {\n        tmp = cursor->prev;\n        counter++;\n        if (cursor->line) {\n#ifdef DEBUG_PARSE\n            fprintf (stderr, \"free_boundary(): freeing %s\\n\", cursor->line);\n#endif\n            free (cursor->line);\n        }\n        free (cursor);\n        cursor = tmp;\n    }\n  \n    return counter;\n}\n\nint free_bound(struct boundary *bnd)\n{\n    int t;\n\n    t = free_boundary (bnd);\n\n#if DEBUG_PARSE\n    fprintf (stderr, \"free_bound: freed %d elements\\n\", t);\n#endif\n    return t;\n}\n\nint free_multipart(struct boundary *mp)\n{\n    int t;\n    \n    t = free_boundary (mp);\n    \n#if DEBUG_PARSE\n    fprintf (stderr, \"free_multipart: freed %d elements\\n\", t);\n#endif\n    return t;\n}\n\nint free_charsets(struct charset_stack *cs)\n{\n    struct charset_stack *cursor = cs;\n      \n    struct charset_stack *tmp;\n  \n    int counter = 0;\n    \n    if (cs && cs->next) {\n        fprintf (stderr, \"free_charsets(): Error: boundary has a non-empty next element.\\n charset = %s ; charsetsave = %s\\n\",\n                 cs->charset, cs->charsetsave);\n    }\n    \n    cursor = cs;\n    while (cursor) {\n        counter++;\n        tmp = cursor->prev;\n#ifdef DEBUG_PARSE\n        fprintf (stderr, \"free_charsets(): freeing charset = %s ; charsetsave = %s\\n\", cursor->charset, cursor->charsetsave);\n#endif\n        if (cursor->charset) {\n            free (cursor->charset);\n        }\n        if (cursor->charsetsave) {\n            free (cursor->charsetsave);\n        }\n\n        free (cursor);\n        cursor = tmp;\n    }\n\n#if DEBUG_PARSE\n    fprintf (stderr, \"free_charset_stack: freed %d elements\\n\", counter);\n#endif\n    \n    return counter;\n}\n\n/*\n** Returns TRUE if a given boundary stack has an element of the given mime_type \n*/\nbool has_multipart (const struct boundary *multipartp, char *mime_type)\n{\n    const struct boundary *tempnode;\n    bool res = FALSE;\n    \n    if (mime_type != NULL && *mime_type != '\\0') {\n        for (tempnode = multipartp; tempnode; tempnode = tempnode->prev) {\n            if (!strcasecmp (tempnode->line, mime_type)) {\n                res = TRUE;\n                break;\n            }\n        }\n    }\n  \n    return res;\n}\n\n/*\n** Add a line to a linked list that makes up an article's body.\n*/\n\nstruct body *addbody(struct body *bp, struct body **lp,\t/* points to the last pointer */\n\t\t     char *line, int flags)\n{\n    struct body *tempnode;\n    struct body *newnode = NULL;\n    char *unstuffed_line = line;\n    int free_unstuffed_line = 0;\n\n    /* delete both space stuffing and quotes where applicable for f=f */\n    if (flags & BODY_DEL_SSQ) {\n        if (flags & BODY_CONTINUE) {\n            /* delete all quote levels, we're reusing those of the precedent line */\n            while (*unstuffed_line == '>') {\n                unstuffed_line++;\n            }\n        }\n        /* deleting space-stuffing at beginning of line */\n        if (unstuffed_line[0] == ' ') {\n            unstuffed_line++;\n        } \n        else if (unstuffed_line[0] == '>') {\n            char *delsp_line = rfc3676_delsp_quotes(unstuffed_line);\n            if (delsp_line) {\n                unstuffed_line = delsp_line;\n                free_unstuffed_line = 1;\n            }\n        }\n    }\n    \n    if (!(flags & BODY_CONTINUE)) {\n\tnewnode = (struct body *)emalloc(sizeof(struct body));\n\tmemset(newnode, 0, sizeof(struct body));\n\tnewnode->line = spamify(strsav(unstuffed_line));\n\tnewnode->html = (flags & BODY_HTMLIZED) ? 1 : 0;\n\tnewnode->header = (flags & BODY_HEADER) ? 1 : 0;\n\tnewnode->attached = (flags & BODY_ATTACHED) ? 1 : 0;\n        newnode->format_flowed = (flags & BODY_FORMAT_FLOWED) ? 1 : 0;\n\tnewnode->next = NULL;\n    }\n    if (bp == NULL) {\n\tbp = newnode;\n\t*lp = bp;\n    }\n    else {\n\ttempnode = *lp;\t\t/* get pointer right away */\n\n\tif (flags & BODY_CONTINUE) {\n\t    /* this is a continuation of the previous line */\n\t    int newlen;\n\t    char *newbuf;\n\n\t    /* get the new size + 1 for the terminating zero */\n\t    newlen = strlen(tempnode->line) + strlen(unstuffed_line) + 1;\n\n\t    /* extend the former memory area: */\n\t    newbuf = (char *)realloc(tempnode->line, newlen);\n\n\t    /* if successful, continue */\n\t    if (newbuf) {\n\t\t/* remove LF from the first part: */\n\t\tchar *lf;\n\t\tlf = strchr(newbuf, '\\n');\n\t\tif (lf)\n\t\t    *lf = 0;\n\n\t\t/* append the new part */\n\t\tstrcat(newbuf, unstuffed_line);\n\n\t\t/* point out the new buffer instead */\n\t\ttempnode->line = newbuf;\n\t    }\n\t}\n\telse {\n\t    tempnode->next = newnode;\n\t    *lp = newnode;\n\t}\n    }\n\n    if (free_unstuffed_line) {\n        free(unstuffed_line);\n    }\n    \n    return bp;\n}\n\n/*\n** Remove the last empty lines, if any, from an article body's linked list.\n*/\n\nint rmlastlines(struct body *bp)\n{\n    struct body *tempnode;\n\n\tif (NULL == bp)\n      return 0;\n\n\tfor (tempnode = bp; tempnode->next != NULL && (tempnode->next->line)[0] != '\\0'; tempnode = tempnode->next);\n    if ((tempnode->line)[0] == '\\n') {\n\t(tempnode->line)[0] = '\\0';\n\treturn 1;\n    }\n    return 0;\n}\n\n/* copy bp on to the end of origbp, deallocate bp */\n\nstruct body *append_body(struct body *origbp, struct body **origlp, struct body *bp)\n{\n    while (bp) {\n\tstruct body *next;\n\t\torigbp = addbody(origbp, origlp, bp->line, (bp->header ? BODY_HEADER : 0)\n\t\t\t | (bp->html ? BODY_HTMLIZED : 0)\n\t\t\t | (bp->attached ? BODY_ATTACHED : 0));\n\tnext = bp->next;\n\tfree(bp->line);\n\tfree(bp);\n\tbp = next;\n    }\n    return origbp;\n}\n\nvoid free_body(struct body *bp)\n{\n    while (bp != NULL) {\n\tstruct body *cp = bp->next;\n\tif (bp->line)\n\t    free(bp->line);\n\tfree(bp);\n\tbp = cp;\n    }\n}\n\n/*\n** If a message is a reply to another, that message's number and the number of\n** the message it may be referring to is put in this list.  \n*/\n\nstruct reply *addreply(struct reply *rp, int fromnum, struct emailinfo *email, int maybereply, struct reply **last_node)\n{\n    struct reply *tempnode, *newnode;\n\n    newnode = (struct reply *)emalloc(sizeof(struct reply));\n    newnode->frommsgnum = fromnum;\n    if (email == NULL)\n\tnewnode->msgnum = -1;\n    else {\n\tnewnode->msgnum = email->msgnum;\n#ifdef FASTREPLYCODE\n\temail->isreply = 1;\n#endif\n    }\n    newnode->data = email;\n    newnode->maybereply = maybereply;\n    newnode->next = NULL;\n\n    if (!rp) {\n\trp = newnode;\n#ifdef FASTREPLYCODE\n\tif (!threadlist && threadlist_by_msgnum && email)\n\t    threadlist_by_msgnum[email->msgnum] = rp;\n#endif\n    }\n    else {\n#ifdef FASTREPLYCODE\n      for (tempnode = (last_node ? *last_node : rp); tempnode->next != NULL; tempnode = tempnode->next);\n      tempnode->next = newnode;\n      if (rp == threadlist && threadlist_by_msgnum && email)\n\t    threadlist_by_msgnum[email->msgnum] = tempnode;\n#else\n\t\tfor (tempnode = rp; tempnode->next != NULL; tempnode = tempnode->next);\n\ttempnode->next = newnode;\n#endif\n    }\n    if (last_node)\n\t*last_node = newnode;\n\n    return rp;\n}\n\nstruct reply *addreply2(struct reply *rp, struct emailinfo *from_email, struct emailinfo *email, int maybereply, struct reply **last_node)\n{\n#ifdef FASTREPLYCODE\n    struct reply *tempnode;\n    for (tempnode = rp; tempnode != NULL; tempnode = tempnode->next) {\n\tif (tempnode->msgnum == email->msgnum) { /* duplicate? */\n\t    if (tempnode->maybereply)\n\t        tempnode->maybereply = maybereply;\n\t    return rp;\t\t/* don't add 2nd time */\n\t}\n    }\n    from_email->replylist = addreply(from_email->replylist, from_email->msgnum, email, maybereply, NULL);\n#endif\n    return addreply(rp, from_email->msgnum, email, maybereply, last_node);\n}\n\n/*\n** Mark an article number as having been printed.\n*/\n\nstruct printed *markasprinted(struct printed *pp, int num)\n{\n    struct printed *tempnode, *newnode;\n\n    newnode = (struct printed *)emalloc(sizeof(struct printed));\n    newnode->msgnum = num;\n    newnode->next = NULL;\n\n    if (pp == NULL)\n\tpp = newnode;\n    else {\n\t\tfor (tempnode = pp; tempnode->next != NULL; tempnode = tempnode->next);\n\ttempnode->next = newnode;\n    }\n    return pp;\n}\n\n/*\n** Has an article already been printed?\n*/\n\nint wasprinted(struct printed *list, int num)\n{\n    struct printed *pp;\n\n    for (pp = list; pp != NULL; pp = pp->next)\n\tif (pp->msgnum == num)\n\t    return 1;\n    return 0;\n}\n\n/*\n** Add article header information to a binary tree and sort by date,\n** subject, or author. This is necessary for printing the index files.\n*/\n\nstruct header *addheader(struct header *hp, struct emailinfo *email, int sorttype, int depth)\n{\n    int isbigger;\n    long yearsecs;\n    static int max_depth, count_d;\n\n    isbigger = 0;\n    if (hp == NULL) {\n\tmax_depth = depth;\n\thp = (struct header *)emalloc(sizeof(struct header));\n\tif (!hp)\n\t    return NULL;\n\n\thp->data = email;\n\n\tif (sorttype == 2) {\n\t    yearsecs = hp->data->datenum = email->fromdate;\n\t    if (set_use_sender_date)\n\t        yearsecs = hp->data->datenum = email->date;\n\t    if (!firstdatenum || yearsecs < firstdatenum)\n\t\tfirstdatenum = yearsecs;\n\t    if (yearsecs > lastdatenum)\n\t\tlastdatenum = yearsecs;\n\t}\n\telse\n\t    hp->data->datenum = 0;\n\thp->left = hp->right = NULL;\n\treturn hp;\n    }\n\n    switch (sorttype) {\n    case 1:\n\tisbigger = (strcasecmp(email->name, hp->data->name) > 0) ? 0 : 1;\n\tbreak;\n    case 0:\n\t\tisbigger = (strcasecmp(email->unre_subject, hp->data->unre_subject) > 0) ? 0 : 1;\n\tbreak;\n    case 2:\n\tyearsecs = email->fromdate;\n\tif (set_use_sender_date)\n\t    yearsecs = email->date;\n\tif (set_reverse)\n\t    isbigger = (yearsecs < hp->data->datenum) ? 0 : 1;\n\telse\n\t    isbigger = (yearsecs >= hp->data->datenum) ? 0 : 1;\n\tif (!firstdatenum || yearsecs < firstdatenum)\n\t    firstdatenum = yearsecs;\n\tif (yearsecs > lastdatenum)\n\t    lastdatenum = yearsecs;\n\tbreak;\n    }\n\n    if (isbigger)\n\thp->left = addheader(hp->left, email, sorttype, depth + 1);\n    else\n\thp->right = addheader(hp->right, email, sorttype, depth + 1);\n\n    if (sorttype == 2 && depth < max_depth / 2 && !(++count_d % 3)) {\n\t/* semi-random rebalancing */\n\tstruct header **hpp = (set_reverse ? &hp->left : &hp->right);\n\tstruct header *hp1 = *hpp;\n\tif (hp1 != NULL && (hp1->right != NULL || hp1->left != NULL)) {\n\t    if (hp1->right != NULL && (hp1->left == NULL || (count_d & 1))) {\n\t\tstruct header *p = hp1->right;\n\t\thp1->right = p->left;\n\t\tp->left = hp1;\n\t\t*hpp = p;\n\t    }\n\t    else {\n\t\tstruct header *p = hp1->left;\n\t\thp1->left = p->right;\n\t\tp->right = hp1;\n\t\t*hpp = p;\n\t    }\n\t}\n    }\n\n    return hp;\n}\n\nstruct emailsubdir *new_subdir(char *subdir, struct emailsubdir *last_subdir, char *description, time_t date)\n{\n    struct emailsubdir *sd = folders;\n    struct emailsubdir *new_sd;\n    struct emailsubdir *insert_point = NULL;\n    int count;\n    char *p;\n\n    while (sd) {\n\tif (!strcmp(subdir, sd->subdir))\n\t    return sd;\n\t\tif (sd->a_date < date && (!insert_point || sd->a_date > insert_point->a_date))\n\t    insert_point = sd;\n\tif (sd->next_subdir == NULL)\n\t    break;\n\tsd = sd->next_subdir;\n    }\n    new_sd = (struct emailsubdir *)emalloc(sizeof(struct emailsubdir));\n    new_sd->next_subdir = NULL;\n    new_sd->prior_subdir = NULL;\n    if (insert_point == NULL)\n\tinsert_point = sd;\n    if (insert_point == NULL)\n\tfolders = (set_increment == -1 ? NULL : new_sd);\n    else if (date < folders->a_date) {\n\tnew_sd->next_subdir = folders;\n\tfolders->prior_subdir = new_sd;\n\tfolders = new_sd;\n    }\n    else {\n\tnew_sd->next_subdir = insert_point->next_subdir;\n\tinsert_point->next_subdir = new_sd;\n\tnew_sd->prior_subdir = insert_point;\n\tif (new_sd->next_subdir)\n\t    new_sd->next_subdir->prior_subdir = new_sd;\n    }\n    new_sd->first_email = NULL;\n    new_sd->last_email = NULL;\n    new_sd->count = 0;\n    new_sd->subdir = strsav(subdir);\n    new_sd->description = description;\n    new_sd->a_date = date;\n    if (set_base_url != NULL) {\n\t\tif (set_base_url[strlen(set_base_url) - 1] != '/')\n\t    trio_asprintf(&new_sd->rel_path_to_top, \"%s/\", set_base_url);\n\telse\n\t    new_sd->rel_path_to_top = strsav(set_base_url);\n    }\n    else {\n\tnew_sd->rel_path_to_top = strsav(\"../\");\n\tcount = 0;\n\tfor (p = subdir; *p; ++p)\n\t    count += (*p == '/');\n\t\twhile (--count > 0) {\n\t    trio_asprintf(&p, \"../%s\", new_sd->rel_path_to_top);\n\t    free(new_sd->rel_path_to_top);\n\t    new_sd->rel_path_to_top = p;\n\t}\n\t\tif (set_latest_folder != NULL && set_folder_by_date != NULL && strchr(set_folder_by_date, '/')) {\n\t    static int warned = 0;\n\t    if (!warned) {\n\t\t\t\tfprintf(stderr, \"Warning: the latest_folder option combined with \" \"a folder_by_date option that includes a '/' will produce \" \"some invalid links unless you use the base_url option!!.\\n\");\n\t      warned = 1;\n\t    }\n\t}\n    }\n    trio_asprintf(&new_sd->full_path, \"%s%s\", set_dir, subdir);\n    if (!isdir(new_sd->full_path)) {\n\tcheckdir(new_sd->full_path);\t/* make subdir(s) if needed */\n\tif (set_latest_folder)\n\t    latest_folder_path = new_sd->subdir;\n    }\n    return new_sd;\n}\n\n/*\n** And Now The List Addition Routines!\n*/\n\nvoid print_list(char *listname, struct hmlist *list)\n{\n    struct hmlist *tlist;\n    int set = 0;\n    int len = 0;\n    int line = 0;\n\n    /* Daniel remade Nov 23 1998. Use a single line as far as possible */\n\n    for (tlist = list; tlist != NULL; tlist = tlist->next) {\n\tset++;\n\tif (!line++) {\n\t    printf(\"%s = \", listname);\n\t    len = strlen(listname) + 3;\n\t}\n\telse {\n\t    if (len + strlen(tlist->val) > 78) {\n\t\tprintf(\"\\n%s = \", listname);\n\t\tlen = strlen(listname) + 3;\n\t    }\n\t    else {\n\t\tprintf(\",\");\n\t\tlen++;\n\t    }\n\t}\n\tprintf(\"%s\", tlist->val);\n\tlen += strlen(tlist->val);\n    }\n    if (!set)\n\tprintf(\"%s: %s\\n\", listname, lang[MSG_NO_ELEMENTS]);\n    else\n\tprintf(\"\\n\");\n}\n\n/*\n** Is the requested element in the list  ?\n*/\n\nint inlist(struct hmlist *listname, char *wildcard)\n{\n    struct hmlist *tlist;\n\n    for (tlist = listname; tlist != NULL; tlist = tlist->next) {\n\t/* wildcard checks enabled! */\n\tif (Match(wildcard, tlist->val))\n\t    return 1;\n    }\n    return 0;\n}\n\n/*\n** What is the position of the requested element in the list  ?\n*/\n\nint inlist_pos(struct hmlist *listname, char *wildcard)\n{\n    struct hmlist *tlist;\n    int i;\n\n    for (i = 0, tlist = listname; tlist != NULL; i++, tlist = tlist->next) {\n\t/* wildcard checks enabled! */\n\tif (Match(wildcard, tlist->val))\n\t    return i;\n    }\n    return -1;\n}\n\nstatic int regex_index(struct hmlist *listname, int index)\n{\n\tstatic int start[5] = { -1, -1, -1, -1, -1 };\n    if (start[0] == -1) {\n\tstruct hmlist *tlist;\n\tstart[1] = start[0] = 0;\n\tfor (tlist = set_filter_out; tlist != NULL; tlist = tlist->next)\n\t    ++start[1];\n\tstart[2] = start[1];\n\tfor (tlist = set_filter_require; tlist != NULL; tlist = tlist->next)\n\t    ++start[2];\n\tstart[3] = start[2];\n\tfor (tlist = set_filter_out_full_body; tlist != NULL; tlist = tlist->next)\n\t    ++start[3];\n\tstart[4] = start[3];\n\tfor (tlist = set_filter_require_full_body; tlist != NULL; tlist = tlist->next)\n\t    ++start[4];\n    }\n\tif (index == -1)\n\t\treturn start[4];\n\tif (listname == set_filter_out)\n\t\treturn start[0] + index;\n\tif (listname == set_filter_require)\n\t\treturn start[1] + index;\n\tif (listname == set_filter_out_full_body)\n\t\treturn start[2] + index;\n\tif (listname == set_filter_require_full_body)\n\t\treturn start[3] + index;\n    return -1;\n}\n\n/*\n** like inlist_pos, but does regex search\n*/\n\nint inlist_regex_pos(struct hmlist *listname, char *str)\n{\n    struct hmlist *tlist;\n    int i;\n\n    for (i = 0, tlist = listname; tlist != NULL; i++, tlist = tlist->next) {\n#ifdef HAVE_PCRE\n\tint r;\n\tconst char *errptr;\n\tint epos;\n\tint index = regex_index(listname, i);\n\tstatic pcre *p, **pcre_list;\n\tstatic pcre_extra *extra, **extra_list;\n\tif (!pcre_list) {\n\t    int n = regex_index(NULL, -1);\n\t    int i;\n\t\t\tpcre_list = (pcre **) emalloc(n * sizeof(pcre *));\n\t\t\textra_list = (pcre_extra **) emalloc(n * sizeof(pcre_extra *));\n\t    for (i = 0; i < n; ++i) {\n\t        pcre_list[i] = NULL;\n\t        extra_list[i] = NULL;\n\t    }\n\t}\n\tif ((p = pcre_list[index]) == NULL) {\n\t    p = pcre_compile(tlist->val, 0, &errptr, &epos, NULL);\n\t    if (!p) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"Error at position %d of regular expression '%s': %s\", epos, tlist->val, errptr);\n\t\tprogerr(errmsg);\n\t    }\n\t    extra = pcre_study(p, 0, &errptr);\n\t    if (errptr) {\n\t\tsnprintf(errmsg, sizeof(errmsg), \"Error studying regular expression '%s': %s\", tlist->val, errptr);\n\t\tprogerr(errmsg);\n\t    }\n\t    pcre_list[index] = p;\n\t    extra_list[index] = extra;\n\t}\n\textra = extra_list[index];\n\tr = pcre_exec(p, extra, str, strlen(str), 0, 0, NULL, 0);\n\t\n\tif (r >= 0)\n\t    return i;\n#else\n\tstatic int warned = 0;\n\tif (set_showprogress && !warned) {\n\t    warned = 1;\n\t    printf(\"warning - regex not available\\n\");\n\t}\n\tif (strstr(tlist->val, str))\n\t    return i;\n#endif\n    }\n    return -1;\n}\n\n/*\n** Add element to the specified list\n*/\n\nstruct hmlist *add_2_list(struct hmlist *listname, char *value)\n{\n    struct hmlist *tnode, *newnode;\n\n    newnode = (struct hmlist *)emalloc(sizeof(struct hmlist));\n    newnode->val = strsav(value);\n    newnode->next = NULL;\n\n    if (listname == NULL)\n\tlistname = newnode;\n    else {\n\tfor (tnode = listname; tnode->next != NULL; tnode = tnode->next);\n\ttnode->next = newnode;\n    }\n    return listname;\n}\n\nstruct hmlist *add_list(struct hmlist *listname, char *value)\n{\n    register char *cp;\n    register char *valp;\n\n    /*\n     * This needs to support lists specified on a single line, such as\n     *      inline = image/jpeg image/gif ...\n     *      inline = image/jpeg,image/gif ...\n     * as well as lists specified on multiple lines.\n     */\n\n    valp = value;\n    cp = valp;\n\n    while (*cp) {\n\tif (*cp == ' ' || *cp == ',') {\n\t    if (*valp != ' ' && *valp != ',') {\n\t\t*cp = '\\0';\n\t\tlistname = add_2_list(listname, valp);\n\t    }\n\t    valp = cp + 1;\n\t}\n\tcp++;\n    }\n\n    if (*valp)\n\tlistname = add_2_list(listname, valp);\n\n    return listname;\n}\n"
  },
  {
    "path": "src/struct.h",
    "content": "/*\n** struct.c functions\n*/\n\nunsigned hash(char *);\nvoid reinit_structs(void);\nvoid fill_email_dates(struct emailinfo *, char *, char *, char *, char *);\n\nstruct emailinfo *addhash(int, char *, char *, char *, char *, char *, char *,\n\t\t\t  char *, char *, char *, char *, struct body *);\n\nint insert_in_lists(struct emailinfo *, const bool *, int);\n\nstruct emailinfo *hashreplylookup(int, char *, char *, int *);\n\nstruct emailinfo *hashmsgidlookup(char *, int *);\nint hashreplynumlookup(int, char *, char *, int *);\nstruct emailinfo *hashlookupbymsgid(char *);\nint insert_older_msgs(int);\n\nstruct body *hashnumlookup(int, struct emailinfo **);\nstruct emailinfo *neighborlookup(int, int);\n\nstruct body *addbody(struct body *, struct body **, char *, int);\nstruct body *append_body(struct body *, struct body **, struct body *);\nvoid free_body(struct body *);\n\nstruct reply *addreply(struct reply *, int, struct emailinfo *, int,\n\t\t       struct reply **);\nstruct reply *addreply2(struct reply *, struct emailinfo *, struct emailinfo *,\n\t\t\tint, struct reply **);\nint rmlastlines(struct body *);\n\nstruct emailsubdir *new_subdir(char *, struct emailsubdir *, char *, time_t);\n\nstruct printed *markasprinted(struct printed *, int);\nint wasprinted(struct printed *, int);\n\nstruct header *addheader(struct header *, struct emailinfo *, int, int);\nstruct boundary *bound(struct boundary *, char *);\nint free_bound(struct boundary *);\nstruct boundary *multipart(struct boundary *, char *);\nint free_multipart(struct boundary *);\nbool has_multipart(const struct boundary *, char *);\nstruct charset_stack *charsets(struct charset_stack *, char *, char *);\nstruct charset_stack *charsets_head(struct charset_stack *);\nint free_charsets(struct charset_stack *);\n\nvoid print_list(char *, struct hmlist *);\nint inlist(struct hmlist *, char *);\nint inlist_pos(struct hmlist *, char *);\nint inlist_regex_pos(struct hmlist *, char *);\nstruct hmlist *add_2_list(struct hmlist *, char *);\nstruct hmlist *add_list(struct hmlist *, char *);\n"
  },
  {
    "path": "src/threadprint.c",
    "content": "#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"struct.h\"\n#include \"threadprint.h\"\n#include \"printfile.h\"\n#include \"print.h\"\n\nstatic void format_thread_info(FILE *, struct emailinfo *, int, int *,\n\t\t\t       struct emailinfo *, FILE *, int, bool);\nstatic int finish_thread_levels(FILE **, int, int, int *, FILE **,\n\t\t\t\tchar **, char **, int, struct emailinfo *,\n\t\t\t\tstruct emailinfo *, char *, FILE *);\nstatic void finish_thread_file(FILE *, struct emailinfo *, char *);\n\n/* Define this to make it print a whole lot of debug output to stdout: */\n/* #define DEBUG_THREAD */\n\n#define MAXSTACK 200\n\n/* A counter to know how many open li elements we have */\nstatic int num_open_li[MAXSTACK + 1];\n\n\n/*\n** If year and/or month are != -1, only messages within the specified time\n** period will be printed.\n*/\n\nvoid print_all_threads(FILE *fp, int year, int month, struct emailinfo *email)\n{\n    int level = 0;\n    int newlevel;\n    int i;\n    int prev = -1;\n    int hide_level = 0;\n    int thread_file_depth = (year == -1 &&\n\t\t\t     month == -1 ? set_thread_file_depth : 0);\n    static int reply_list_count = 0;\n    int stack[MAXSTACK + 1];\t/* should be dynamic - this will do for now */\n    FILE *fp_stack[MAXSTACK + 1];\n    int num_replies[MAXSTACK + 1];\n    char *filename_stack[MAXSTACK + 1];\n    char *subject_stack[MAXSTACK + 1];\n    struct emailsubdir *subdir = email ? email->subdir : NULL;\n    struct emailinfo *last_email;\n    FILE *fp_body = NULL;\n    char *filenameb = NULL;\n    int threadnum = 0;\n    bool is_first = TRUE;\n\n    struct reply *rp = threadlist;\n    last_email = rp->data;\n    if (!last_email && rp->msgnum == -1 && set_files_by_thread) {\n\tprogerr(\"files_by_thread error start with rp->msgnum == -1\");\n    }\n\n    for (i = 0; i <= MAXSTACK; i++)\n      num_replies[i] = num_open_li[i] = 0;\n\n    while (rp != NULL) {\n#if DEBUG_THREAD\n\tfprintf(stderr, \"print_all_threads: message %d prev %d level %d\\n\",\n\t\trp->msgnum, prev, level);\n#endif\n\tif (rp->msgnum == -1) {\n\t    level =\n\t\tfinish_thread_levels(&fp, level, 0, num_replies, fp_stack,\n\t\t\t\t     filename_stack, subject_stack,\n\t\t\t\t     thread_file_depth, email, last_email,\n\t\t\t\t     filenameb, fp_body);\n\t    filenameb = NULL;\n\t    rp = rp->next;\n\t    continue;\n\t}\n\telse if(level == 0 && subdir && rp->data->subdir != subdir) {\n\t    rp = rp->next;\n\t    continue;\n\t}\n\n#if DEBUG_THREAD\n\tfprintf(stderr, \"print_all_threads: %d: %s\\n\", rp->msgnum,\n\t\trp->data->name);\n#endif\n\tif (prev == -1) {\n\t    level =\n\t\tfinish_thread_levels(&fp, level, 0, num_replies, fp_stack,\n\t\t\t\t     filename_stack, subject_stack,\n\t\t\t\t     thread_file_depth, email, rp->data,\n\t\t\t\t     filenameb, fp_body);\n\t    filenameb = NULL;\n\t    stack[level] = rp->msgnum;\n\t}\n\telse if (hide_level) {\n\t    ;\t\t\t/* don't change level */ \n        }\n\telse if (rp->frommsgnum == prev) {\n\t    if (level < MAXSTACK)\n\t\tlevel++;\n\t    else\n\t\tfprintf(stderr, \"thread level too deep - sticking at %d\\n\",\n\t\t\tMAXSTACK);\n\t    stack[level] = rp->msgnum;\n\t    num_replies[level] = 0;\n\t    if (!set_indextable) {\n\t      if (level < set_thrdlevels) {\n\t\tif (level > thread_file_depth) {\n\t\t    fprintf(fp, \"<ul>\\n\");\n\t\t}\n\t\telse if (level < MAXSTACK) {\n\t\t    char *filename;\n\t\t    char subject[TITLESTRLEN];\n\t\t    trio_asprintf(&filename_stack[level],\n\t\t\t\t  \"%u%s\", reply_list_count,\n\t\t\t\t  index_name[subdir != NULL][THREAD_INDEX]);\n\t\t    filename = htmlfilename(filename_stack[level], email, \"\");\n                    /* AUDIT biege: What about using remove() to handle direc.c too? */\n\t\t    unlink(filename);\t/* so chmod won't fail if someone else owned it */\n\t\t    fp_stack[level - 1] = fp;\n\t\t    if ((fp = fopen(filename, \"w\")) == NULL) {\n                        snprintf(errmsg,sizeof(errmsg),\"Couldn't write \\\"%s\\\".\",\n\t\t\t\t filename);\n\t\t\tprogerr(errmsg);\n\t\t    }\n\t\t    sprintf(subject, \"thread index level %d\", level + 1);\n\t\t    subject_stack[level] = strsav(subject);\n\t\t    print_index_header(fp, set_label, set_dir,\n\t\t\t\t       subject, filename);\n\t\t    fprintf(fp, \"<ul>\\n\");\n\t\t    free(filename);\n\t\t    ++reply_list_count;\n\t\t}\n\t      }\n\t      else {\n\t\t/* if we go over the thread limit, we just close the last open li */\n\t\tif (!set_indextable && num_open_li[level - 1] != 0) {\n\t\t  fprintf (fp, \"</li>\\n\");\n\t\t  num_open_li[level - 1]--;\n\t\t}\n\t      }\n\t    }\n\t}\n\telse {\n\t    /* There are (I think) some optimisations possible here.\n\t     * 1. could start loop at level-1\n\t     * Previous branch is just a special case of this branch -\n\t     * possibly more efficient - probably not worth worrying about.\n\t     * Paul 12-may-1999\n\t     */\n\t    for (i = level; i >= 0; i--) {\n\t\tif (stack[i] == rp->frommsgnum) {\n\t\t    break;\n\t\t}\n\t    }\n\t    newlevel = i + 1;\n\t    if (newlevel == level) {\n\t      /* same level, close the previous item */\n\t      if (!set_indextable && num_open_li[level] != 0) {\n\t\tfprintf (fp, \"</li>\\n\");\n\t\tnum_open_li[level]--;\n\t      }\n\t    }\n\t    else if (newlevel > level) {\n\t\t/* I don't think this branch will be used - do the right thing anyway */\n#if DEBUG_THREAD\n\t\tfprintf(stderr,\n\t\t\t\"print_all_threads: unexpected: message %d - level changing from %d to %d\\n\",\n\t\t\trp->msgnum, level, newlevel);\n#endif\n\t\tif (newlevel >= MAXSTACK) {\n\t\t    fprintf(stderr,\n\t\t\t    \"thread level too deep - sticking at %d\\n\",\n\t\t\t    MAXSTACK);\n\t\t    newlevel = MAXSTACK;\n\t\t}\n\t\t\n\t\tif (!set_indextable) {\n\t\t    while (level < newlevel) {\n\t\t\tif (level < set_thrdlevels) {\n\t\t\t    fprintf(fp, \"<li><ul>\\n\");\n\t\t\t    ++num_open_li[level];\n\t\t\t}\n\t\t\tlevel++;\n\t\t    }\n\t\t}\n\t    }\n\t    else {\n\t\tlevel =\n\t\t    finish_thread_levels(&fp, level, newlevel, num_replies,\n\t\t\t\t\t fp_stack, filename_stack,\n\t\t\t\t\t subject_stack, thread_file_depth,\n\t\t\t\t\t email, rp->data, filenameb, fp_body);\n\t\tif (newlevel == 0) filenameb = NULL;\n\t    }\n\n\t    stack[newlevel] = rp->msgnum;\n\t}\n\n\tif (set_files_by_thread && level == 0) {\n\t    char thread_id[256];\n\t    if (filenameb && last_email) {\n\t            finish_thread_file(fp_body, last_email, filenameb);\n\t\t    filenameb = NULL;\n\t    }\n\t    sprintf(thread_id, \"thread_body%d\", ++threadnum);\n\t    filenameb = htmlfilename(thread_id, email, set_htmlsuffix);\n\t    if ((fp_body = fopen(filenameb, \"w\")) == NULL) {\n                 snprintf(errmsg, sizeof(errmsg), \"Couldn't write \\\"%s\\\".\", \n                          filenameb);\n\t\tprogerr(errmsg);\n\t    }\n\t    print_index_header(fp_body, set_label, set_dir,\n\t\t\t       lang[MSG_BY_THREAD], filenameb);\n\t    fprint_menu0(fp_body, rp->data, PAGE_TOP);\n\t}\n\t/* Now print this mail */\n\tif ((year == -1 || year_of_datenum(rp->data->date) == year)\n\t    && (month == -1 || month_of_datenum(rp->data->date) == month)\n\t    && !rp->data->is_deleted) {\n\t    format_thread_info(fp, rp->data, level, num_replies,\n\t\t\t       email, fp_body, threadnum, is_first);\n\t    if (is_first)\n\t      is_first = FALSE;\n\t}\n\n\tprev = rp->msgnum;\n\thide_level = (rp->data->is_deleted && rp->frommsgnum != rp->msgnum);\n\tlast_email = rp->data;\n\trp = rp->next;\n    }\n\n    if (!set_indextable && num_open_li[0] != 0)\n      fprintf (fp, \"</li>\\n\");\n\n    if (set_files_by_thread && filenameb && last_email) {\n\tfinish_thread_file(fp_body, last_email, filenameb);\n\tfilenameb = NULL;\n    }\n}\n\nstatic void format_thread_info(FILE *fp, struct emailinfo *email,\n\t\t\t       int level, int *num_replies,\n\t\t\t       struct emailinfo* subdir_email, FILE *fp_body,\n\t\t\t       int threadnum, bool is_first)\n{\n    char *subj, *tmpname;\n    char *href = NULL;\n    char buffer[256];\n    char *first_attributes = (is_first) ? \" accesskey=\\\"j\\\" name=\\\"first\\\" id=\\\"first\\\"\" : \"\";\n\n#ifdef HAVE_ICONV\n    subj = convchars(email->subject, \"utf-8\");\n    tmpname = convchars(email->name, \"utf-8\");\n#else\n    subj = convchars(email->subject, email->charset);\n    tmpname = convchars(email->name, email->charset);\n#endif\n\n    if (set_files_by_thread) {\n\tint maybe_reply = 0;\n\tint is_reply = 1;\n\tfprintf(fp_body, \"<a name =\\\"%.4d\\\" id=\\\"%.4d\\\"></a>\", email->msgnum, email->msgnum);\n\tprint_headers(fp_body, email, TRUE);\n\tif ((set_show_msg_links && set_show_msg_links != 4) || !set_usetable) {\n\t    fprintf(fp_body, \"</ul>\\n\");\n\t}\n\t/* maybe_reply only affects code in finelink.c which we don't want to run twice? */\n\tprintbody(fp_body, email, maybe_reply, is_reply);\n\tif (level == 0) {\n\t    sprintf(buffer, \"thread_body%d.%s\",\n\t\t    threadnum, set_htmlsuffix);\n\t    href = buffer;\n\t}\n\tis_reply = print_links(fp_body, email, PAGE_TOP, TRUE);\n    }\n    if (!href)\n\thref = msg_href(email, subdir_email, FALSE);\n\n    /* Print the thread info */\n    if (set_indextable) {\n\tfprintf(fp,\n\t\t\"<tr><td>%s<a href=\\\"%s\\\"%s><strong>%s</strong></a></td>\"\n\t\t\"<td nowrap><a name=\\\"%s%d\\\" id=\\\"%s%d\\\">%s</a></td>\" \"<td nowrap>%s</td></tr>\\n\",\n\t\tlevel > 1 ? \"--&gt; \" : \"\", \n\t\thref, first_attributes,\n\t\tsubj, set_fragment_prefix, email->msgnum, set_fragment_prefix, email->msgnum, tmpname, getindexdatestr(email->date));\n    }\n    else {\n        if (num_open_li[level] != 0) {\n\t  fprintf (fp, \"</li>\\n\");\n\t  num_open_li[level]--;\n\t}\n\tfprintf(fp, \"<li><a href=\\\"%s\\\"%s>%s</a>&nbsp;\"\n\t\t\"<a name=\\\"%s%d\\\" id=\\\"%s%d\\\"><em>%s</em></a>&nbsp;<em>(%s)</em>\\n\", \n\t\thref, first_attributes, \n\t\tsubj, set_fragment_prefix, email->msgnum, set_fragment_prefix, email->msgnum, tmpname, getindexdatestr(email->date));\n    }\n    if (subj)\n      free(subj);\n    if (tmpname)\n      free(tmpname);\n    ++num_replies[level];\n    if (!set_indextable)\n      ++num_open_li[level];\n    email->flags |= PRINT_THREAD;\t/* its written now */\n}\n\nint isreplyto(int msgnum, int parent)\n{\n    /* returns true if message msgnum is a reply to message parent */\n    struct reply *rp = replylist;\n\n    while (rp != NULL) {\n\tif (rp->frommsgnum == parent) {\n\t    if (rp->msgnum == msgnum) {\n\t\treturn 1;\n\t    }\n\t}\n\trp = rp->next;\n    }\n    return 0;\n}\n\nstatic void\nfinish_thread_file(FILE *fp_body, struct emailinfo *email, char *filenameb)\n{\n\tfprint_menu0(fp_body, email, PAGE_BOTTOM);\n\tprintfooter(fp_body, mhtmlfooterfile, set_label, set_dir,\n\t\t    email->subject, filenameb, TRUE);\n\tfclose(fp_body);\n\tif (chmod(filenameb, set_filemode) == -1) {\n            snprintf(errmsg, sizeof(errmsg), \"Couldn't chmod \\\"%s\\\" to %o.\", \n                     filenameb, set_filemode);\n\t    progerr(errmsg);\n\t}\n\tfree(filenameb);\n}\n\nstatic int finish_thread_levels(FILE **fp, int level, int newlevel,\n\t\t\t\tint *num_replies, FILE **fp_stack,\n\t\t\t\tchar **filename_stack,\n\t\t\t\tchar **subject_stack,\n\t\t\t\tint thread_file_depth,\n\t\t\t\tstruct emailinfo *subdir_email,\n\t\t\t\tstruct emailinfo *email,\n\t\t\t\tchar *filenameb, FILE *fp_body)\n{\n    if (newlevel == 0 && filenameb && set_files_by_thread) {\n\tfinish_thread_file(fp_body, email, filenameb);\n    }\n    if (!set_indextable) {\n\twhile (level > newlevel) {\n\t    num_replies[level - 1] += num_replies[level];\n\t    if (level < set_thrdlevels) {\n\t\tif (level > thread_file_depth) {\n\t\t    if (num_open_li[level] != 0) {\n\t\t      fprintf(*fp, \"</li>\");\n\t\t      num_open_li[level]--;\n\t\t    }\n\t\t    fprintf(*fp, \"</ul>\\n\");\n\n\t\t    if (num_open_li[level] != 0) {\n\t\t      fprintf(*fp, \"</li>\");\n\t\t      num_open_li[level]--;\n\t\t    }\n\t\t}\n\t\telse if (level < MAXSTACK) {\n\t\t    char *filename = htmlfilename(filename_stack[level],\n\t\t\t\t\t\t  subdir_email, \"\");\n\t\t    fprintf(*fp, \"</li></ul>\\n\");\n\t\t    if (num_open_li[level] != 0) {\n\t\t      fprintf(*fp, \"</li>\");\n\t\t      num_open_li[level]--;\n\t\t    }\n\t\t    fprintf (*fp, \"</ul>\");\n\t\t    printfooter(*fp, ihtmlfooterfile, set_label, set_dir,\n\t\t\t\tsubject_stack[level], filename, TRUE);\n\t\t    fclose(*fp);\n\t\t    *fp = fp_stack[level - 1];\n\t\t    if (num_replies[level]) {\n\t\t\tfprintf(*fp,\n\t\t\t\t\"<ul><li><a href=\\\"%s\\\">%u replies</a></ul>\\n\",\n\t\t\t\tfilename_stack[level], num_replies[level]);\n\t\t\tif (chmod(filename, set_filemode) == -1) {\n                            snprintf(errmsg, sizeof(errmsg), \n                                     \"Couldn't chmod \\\"%s\\\" to %o.\", \n                                     filename, set_filemode);\n\t\t\t    progerr(errmsg);\n\t\t\t}\n\t\t\tnum_open_li[level]++;\n\t\t    }\n\t\t    else\n\t\t\tremove(filename);\n\t\t    free(filename_stack[level]);\n\t\t    free(filename);\n\t\t}\n\t    }\n\t    else {\n\t      if (num_open_li[level] != 0) {\n\t\tfprintf(*fp, \"</li>\");\n\t\tnum_open_li[level]--;\n\t      }\t      \n\t    }\n\t    level--;\n\t}\n    }\n    else {\n\tlevel = newlevel;\n    }\n    return level;\n}\n\n"
  },
  {
    "path": "src/threadprint.h",
    "content": "void print_all_threads(FILE *, int, int, struct emailinfo *);\nint isreplyto(int, int);\n"
  },
  {
    "path": "src/trio/CHANGES",
    "content": "CHANGES -- trio\n\n\nThe changes listed without a name attributed to them were most likely done by\nBjorn Reese and/or Daniel Stenberg.\n\nVersion 1.16 - 2014/07/16\n-------------------------\n* Stephen Kitt\n  Fixed accuracy problems on platforms with double-double support.\n\n* Stephen Kitt\n  Added support for GCC format attribute.\n\n* Balint Reczey\n  Fixed several visibility problems.\n\n* David Turner\n  Changed trionan to use sigaction() instead of signal().\n\n* Chris Liddell\n  Fixed compiler warnings.\n\n\nVersion 1.15 - 2010/09/12\n-------------------------\n* Jiri Hruska\n  Added the trio_cprintff() and trio_cscanff() function.\n\n* Fixed calculation of fraction digits for %#g numbers involving rounding\n  (reported by Lajos Foldy).\n\n\nVersion 1.14 - 2010/01/26\n-------------------------\n* David Byron\n  Added trio_xstring_append_max.\n\n* Fixed compilation problem on Cygwin due to lack of long double math\n  (reported by Matthias Andree).\n\n* David Boyce\n  Added #undef of standard stdio function names before assigning trio functions\n  to them.\n\n* Matthias Andree\n  Upgraded configure.in to use new macros instead of obsoleted macros.\n\n* Matthias Andree\n  Added VPATH to Makefile.in\n\n* Tom Honermann\n  Fixed problem with subnormal numbers which caused an infinite loop outputting\n  leading spaces.\n\n* Adam McLaurin\n  Improved parsing performance by avoiding memset() and memcpy() on character\n  arrays.\n\n* Gideon Smeding\n  Fixed %u scanning of signed numbers.\n\n* Gideon Smeding\n  Fixed group scanning for non-matching input.\n\n* Fixed missing undo of look-ahead reading for scanf functions. This does only\n  work for the scanf* and fscanf* functions, not dscanf* and cscanf* functions\n  (reported by Gideon Smeding).\n\n* If the format string is empty, scanf does not attempt to read any input.\n\n* Ralf Junker\n  Fixed Borland compilation for user-defined specifiers.\n\n\nVersion 1.13 - 2008/11/09\n-------------------------\n* Ives Aerts\n  Added the $<format|skip> format for user-defined specifiers, which is\n  compatible with compiler warnings about mismatches between specifiers and\n  arguments.\n\n* Added TRIO_DEPRECATED flag (reported by David Boyce)\n\n* Fixed rounding adjustment for long double (reported as bug item #2136686).\n\n* Added Makefile dependency for test target (reported as bug item #2136636).\n\n* David Boyce\n  Fixed long long support for MSVC.\n\n* Fixed potential problem with read after buffer end for non-zero terminated\n  strings (reported as bug item #1828465).\n\n* Andreas Stricker\n  Added WinCE support.\n\n* Fixed number of significant digits for %g.\n\n\nVersion 1.12 - 2006/10/22\n-------------------------\n* Fixed scanning of floats (reported by Bernd Ahlers).\n\n* Fixed configure.in for GCC on Tru64 and MIPSpro on IRIX (reported by Andreas\n  Maus).\n\n* Olli Savia\n  Added support for LynxOS.\n\n\nVersion 1.11 - 2006/04/08\n-------------------------\n* Mark Pickelmann\n  Fixed trio_unregister. If the first element was removed, the remaining\n  list would be removed as well.\n\n* Fixed unintended formatting of %e that would result in non-zero numbers\n  starting with zero (reported by Mark Pickelmann and Gisli Ottarsson).\n\n* Fixed compilation with Sun Workshop 6 (reported by Matthias Andree).\n\n* Fixed accuracy for denormalized numbers (bug item #758327).\n\n* Glen Davidson\n  Fixed scanning of floating-point numbers without a decimal-point (bug item\n  #1370427).\n\n* David Byron\n  Fixed more compiler warnings.\n\n* Fixed compilation of trio_to_long_double and TRIO_FEATURE_FLOAT (reported by\n  David Byron).\n\n* Fixed precision of large floating-point numbers (bug item #1314524).\n\n* Karl Bochert\n  Fixed trio_fpclassify_and_signbit to only restore the floating-point\n  precision.\n\n* Fixed detection of need for ieee option on FreeBSD/Alpha.\n\n* Added TRIO_SNPRINTF_ONLY compilation.\n\n* Fixed trio_to_double by not using strtod() on Tru64/DECC because it does not\n  support hex-floats.\n\n* Fixed crash on 64 bits machines related to a previous workaround in version\n  1.9 for uninitialized va_list (reported by Nicolai Tufar, suggestion by\n  Douglas Gwyn).\n\n* Patrick Jessee\n  Fixed width calculation for %g.\n\n* Added macros for internal features.\n\n* Jon Foster\n  Added macros for conditional compilation of many features. Documented all\n  the features.\n\n* Karl Bochert\n  Fixed problem with Borland C++, which changes the floating-point precision\n  for certain math functions (log10() and _fpclass()).\n\n* Karl Bochert\n  Fixed compilation warnings on Borland C++.\n\n* Removed any occurrence of #elif because Borland C++ reports wrong line\n  numbers when they are present (reported by Karl Bochert).\n\n* David Byron\n  Added trio_asprintfv.\n\n* Brian Chapman\n  Fixed Mac OS X compilation.\n\n* David Byron\n  Fixed several compiler warnings.\n\n* Fixed printing of out-of-range arguments for %hhd and %hd. These arguments\n  can be out of range because of default integer promotion.\n\n* Bob Friesenhahn\n  Fixed installation of header files.\n\n* Joe Orton\n  Added SHELL to Makefile.in to avoid problems with CShells.\n\n* Shaun Tancheff\n  Fixed regresion tests for MSVC.\n\n* Craig Berry\n  Fixed the VMS C99 workaround.\n\n\nVersion 1.10 - 2003/03/06\n-------------------------\n* Rearranged some include files to accommodate large file support (reported by\n  Albert Chin-A-Young).\n\n* Added support for SunOS 4.1.x lack of strerror, tolower, and toupper\n  (reported by Peter McCluskey).\n\n* Fixed pedantic compilation with TRIO_MINIMAL.\n\n* Jose Kahan\n  Moved <limits.h> to avoid redefinition problems.\n\n* Fixed hex-float exponents (reported by Matthias Clasen).\n\n* Fixed handling of negative width and precision via paramters (reported by\n  Jacob Navia).\n\n* Nigel Hall\n  Fixed TRIO_VA_START for VMS.\n\n* Rune Enggaard Lausen\n  Fixed compilation for Borland C++ Builder.\n\n* Fixed precision of hex-float numbers (reported by James Antill).\n\n* Fixed plus sign only to be added for signed numbers.\n\n* Fixed printing of integers with value and precision of zero (reported by\n  James Antill).\n\n* Fixed %#.o to only print one zero if the value is zero (reported by James\n  Antill).\n\n* Rewrote check for IEEE compilation option to remove dependency on additional\n  scripts.\n\n* Mehdi Lavasani\n  Makefile install target fixed to work with older install programs.\n\n* Collapsed the DECC, MSVC, HP-UX, and AIX code for trio_fpclassify_and_sign()\n  with further preprocessing.\n\n\nVersion 1.9 - 2002/10/13\n------------------------\n* Fixed trio_fpclassify_and_signbit on AIX 3.2\n\n* Added configure check for -ieee/-mieee compilation option for Alpha machines.\n\n* Craig Berry\n  Fixed compilation on VMS.\n\n* Albert Chin-A-Young\n  Fixed incorrect conditional expression in trio_isinf.\n\n* Fixed the warnings about uninitialized va_list in the printfv and scanfv\n  family without the use of compiler specific pragmas (suggested by Ian\n  Pilcher).\n\n* Fixed space flag for floating-point numbers (reported by Ian Main).\n\n\nVersion 1.8 - 2002/07/10\n------------------------\n* Fixed infinite loop in multibyte handling (reported by Gisli Ottarsson).\n\n* Added the customizable cprintf/cscanf family which enables to user to specify\n  input and output stream functions (suggested by Florian Schulze).\n\n* Fixed trio_isinf by removing the HP-UX workaround, and instead making sure\n  that the C99 macro will adhere to the trio return values (reported by Luke\n  Dunstan).\n\n* Alexander Lukyanov\n  Fixed boundary case for scanning and EOF.\n\n* Jacob Navia\n  Enabled the L modifier for formatting.\n\n* Added TRIO_MINIMAL to build trio without the string functions.\n\n* Added the R modifier to print rounded floating-point numbers.\n\n* Added trio_to_long_double and long double scanning (the L modifier).\n\n* Added trio_locale_decimal_point, trio_locale_thousand_separator,\n  trio_locale_grouping to overwrite locale settings.\n\n* Rewrote TrioWriteDouble to avoid temporary buffers and thus the danger of\n  buffer overflows (for instance %.5000f).\n\n* Improved floating-point formatting accuracy.\n\n* Fixed formatting of non-decimal exponents.\n\n* Fixed thousand separator checking.\n\n* Fixed %f scanning to get a float and %lf to get a double.\n\n* Fixed WIN32 compilation (reported by Emmanuel Mogenet)\n\n* Fixed regression test cases to exclude disabled features.\n\n\nVersion 1.7 - 2002/05/07\n------------------------\n* Fixed trio_to_double to handle hex-floats properly.\n\n* Fixed printing of %a-format to be like %e, not like %g.\n\n* Fixed floating-point printing of values beyond the machine accuracy.\n\n* Fixed %f for printing with large precision.\n\n* Fixed the usage of C99 nan(), which caused a crash on OSF/1 (reported by\n  Georg Bolz)\n\n* Joe Orton\n  Fixed %p on 64-bit platforms.\n\n* Made trio compile with K&R compilers.\n\n* Emmanuel Mogenet\n  Fixed bug in trio_asprintf.\n\n* Emmanuel Mogenet\n  Various WIN32 fixes.\n\n* Joe Orton\n  Fixed trio_isinf() on HP-UX, and added test cases.\n\n* Joe Orton\n  Fixed non-portable use of $^ in Makefile.\n\n* Joe Orton\n  Added autoconf.\n\n* Alexander Lukyanov\n  Fixed a number of bugs in the scanning of EOF and the count specifier.\n\n* Richard Jinks\n  Added trio_nzero\n\n* Fixed incorrect handling of return code from TrioReadChar (reported by\n  Henrik Lf)\n\n* Fixed parsing of character class expressions.\n\n* Fixed trio_to_double which did not work with long fractions.\n\n* Fixed %f for printing of large numbers.\n\n* Fixed %#s to handle whitespaces as non-printable characters.\n\n* Added trio_isfinite, trio_signbit, and trio_fpclassify.\n\n* Added new test cases.\n\n\nVersion 1.6 - 2002/01/13\n------------------------\n* Added dynamic string functions.\n\n* Rewrote and extended documentation in JavaDoc (using Doxygen).\n\n* Moved and renamed strio functions to triostr.\n\n* Robert Collins\n  Added definition for Cygwin.\n\n* Markus Henke\n  Added long double workaround for the HP C/iX compiler.\n\n* Marc Verwerft\n  Improved error handling for dynamically allocated strings.\n\n* John Fotheringham\n  Made trionan compile on OpenVMS.\n\n* Added 'd' and 'D' as exponent letters when using TRIO_MICROSOFT.\n\n* Fixed uninitial memory read for the parameter modifiers.\n\n\nVersion 1.5 - 2001/09/08\n------------------------\n* Merged with libxml changes.\n\n* Moved NaN and Inf handling to separate file to enable reuse in other\n  projects.\n\n* Igor Zlatkovic\n  Fixed TrioGenerateNan for MSVC.\n\n* Fixed lots of preprocessor macros and internal data structure names.\n\n\nVersion 1.4 - 2001/06/03\n------------------------\n* Added hex-float (%a and %A) for scanning.\n\n* Added wide character arguments (%ls, %ws, %S, %lc, %wc, and %C) for both\n  printf and scanf.\n\n* Added mutex callbacks for user-specified specifiers to enable applications to\n  add thread-safety. These are registered with trio_register, where the\n  namespace is set to either \":enter\" to lock a mutex, or \":leave\" to unlock a\n  mutex.\n\n* Added equivalence class expressions for scanning. For example, %[[=a=]] scans\n  for all letters in the same equivalence class as the letter 'a' as defined\n  by the locale.\n\n* Changed character class expressions for scanning. The expressions must now\n  be embedded withing an extra set of brackets, e.g. %[[:alpha:]]. This was\n  done to adhere to the syntax of UNIX98 regular expressions.\n\n* Added the possibility to specify standard support (TRIO_C99 etc.) as compiler\n  options.\n\n* Fixed conversion of hex-float in StrToDouble.\n\n* Fixed formatting of hex-float numbers.\n\n* Stan Boehm\n  Fixed crash on QNX, which happend because some buffers on the stack were too\n  big.\n\n* Fixed default precision for %f and %g (reported by Jose Ortiz)\n\n* Howard Kapustein\n  Added the I8, I16, I32, and I64 modifiers.\n\n* Jose Ortiz\n  Fixed rounding problem for %e.\n\n* Jose Ortiz\n  Fixed various problems with the xlC and Sun C++ compilers.\n\n\nVersion 1.3 - 2001/05/16\n------------------------\n* trio's treatment of the field width when the %e code was used was not\n  correct (reported by Gisli Ottarsson). It turns out the fraction part should\n  be zero-padded by default and the exponent part should be zero-prefixed if\n  it is only one digit. At least that's how the GNU and Sun libc's work. The\n  trio floating point output looks identical to them now.\n\n* Fixed group scanning with modifiers.\n\n* Fixed compilation for 64-bit Digital Unix.\n\n* Igor Zlatkovic\n  Fixed compilation of dprintf, which uses read/write, for MSVC.\n\n* Fixed various compilation problems on Digital Unix (mainly associated with\n  va_list).\n\n\nVersion 1.2 - 2001/04/11\n------------------------\n* Added autoconf integration. If compiled with HAVE_CONFIG_H the following\n  happens. Firstly, <config.h> is included. Secondly, trio will only be\n  compiled if WITH_TRIO is defined herein. Thirdly, if TRIO_REPLACE_STDIO is\n  defined, only stdio functions that have not been detected by autoconf, i.e.\n  those not defined by HAVE_PRINTF or similar, will be replaced by trio\n  functions (suggested by Daniel Veillard).\n\n* Fixed '%m.nf' output. Previously trio did not treat the width properly\n  in all cases (reported by Gisli Ottarsson).\n\n* Added explicit promotion for the scanfv family.\n\n* Fixed more C++ compilation warnings.\n\n\nVersion 1.1 - 2001/02/25\n------------------------\n* Added explicit promotion for the printfv familiy. A float must be specified\n  by %hf.\n\n* Fixed positionals for printfv (reported by Gisli Ottarsson).\n\n* Fixed an integer to pointer conversion problem on the SGI MIPS C compiler\n  (reported by Gisli Ottarsson).\n\n* Fixed ANSI C++ warnings (type casting, and namespace is a reserved keyword).\n\n* Added \\n to all examples in the documentation to prevent confusion.\n\n* Fixed StrSubstringMax\n\n\nVersion 1.0 - 2000/12/10\n------------------------\n* Bumped Version number.\n\n\nVersion 0.25 - 2000/12/09\n-------------------------\n* Wrote more documentation.\n\n* Improved NaN support and added NaN to regression test.\n\n* Fixed C99 support.\n\n* Added missing getter/setter functions.\n\n\nVersion 0.24 - 2000/12/02\n-------------------------\n* Added callback functionality for the user-defined specifier (<>). All\n  the necessary functions are defined in triop.h header file. See the\n  documentation for trio_register for further detail.\n\n* Wrote initial documentation on the callback functionality.\n\n* Added the printfv and scanfv family of functions, which takes a pointer\n  array rather than variadic arguments. Each pointer in the array must point\n  to the associated data (requested by Bruce Korb).\n\n* As indicated in version 0.21 the extension modifiers (<>) have now been\n  completely removed.\n\n* Added skipping of thousand-separators in floating-point number scanning.\n\n\nVersion 0.23 - 2000/10/21\n-------------------------\n* Added width to scanning of floating-point numbers.\n\n* Wrote more documentation on trio_printf.\n\n* Fixed problem with trailing zeroes after decimal-point.\n\n\nVersion 0.22 - 2000/08/06\n-------------------------\n* Added LC_CTYPE locale dependent character class expressions to scan lists.\n  Included are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:],\n  [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:]\n\n* Added C escapes to alternative string formatting and scanning.\n\n* Added StrSubstringMax.\n\n* Wrote a little more documentation.\n\n* Fixed scanf return values.\n\n* Fixed a sign error for non-ascii characters.\n\n\nVersion 0.21 - 2000/07/19\n-------------------------\n* Converted the documentation to TeX. With latex2man the documentation can\n  automatically be converted into man pages.\n\n* Added trio_scanf, trio_vscanf, trio_fscanf, and trio_vfscanf.\n\n* Added trio_dprintf, trio_vdprintf, trio_dscanf, and trio_vdscanf. These\n  functions can be used to write and read directly to pipes and sockets (the\n  assume blocking sockets). Stdio buffering is surpassed, so the functions are\n  async-safe. However, reading from stdin (STDIN_FILENO) or writing to stdout\n  (STDOUT_FILENO) reintroduces the buffering.\n\n* Paul Janzen\n  Added trio_asprintf and trio_vasprintf, which are compatible with the GNU\n  and BSD interfaces.\n\n* Added scanlist ranges for group scanning (%[]).\n\n* Added width for scanning (missing for floating-point numbers though).\n\n* Added variable size modifier (&) to handle system defined types of unknown\n  size. This modifier makes certain assumptions about the integer sizes, which\n  may not be valid on any machine. Consequently, the modifier will remain\n  undocumented, as it may be removed later.\n\n* Added \\777 and \\xFF to alternative string scanning (%#s)\n\n* Added the TRIO_REPLACE_STDIO check in the header.\n\n* Improved performance of the multibyte character parsing.\n\n* Fixed positionals (%n$) which had stopped working.\n\n* Fixed hh and ll modifiers to allow exactly two letters and no more.\n\n* Fixed ANSI C++ warnings. Also fixed the compiler warning about casting\n  between integer and pointer (this has been annoying me for ages). \n\n* Fixed snprintf and vsnprintf with zero buffer size.\n\n* Fixed NAN problems (reported by Keith Briggs).\n\n* Fixed parsing of multibyte characters. The format string was not correctly\n  advanced in case of a multibyte character.\n\n* Renamed many of the internal functions to have more consistant names.\n\n* Removed the <quote=c> and <fill=c> modifiers. They are not really worth\n  including. The other <> modifiers may disappear as well.\n\n\nVersion 0.20 - 2000/06/05\n-------------------------\n* Added intmax_t and ptrdiff_t support.\n\n* Added support for LC_NUMERIC grouping.\n\n* Added double-dot notation for the conversion base. The style is now\n  %width.precision.base, where any argument can be a number, an asterix\n  indicating a parameter, or be omitted entirely. For example, %*..2i is\n  to specify binary numbers without precision, and with width as a parameter\n  on the va_list.\n\n* Added sticky modifier (!), which makes subsequent specifiers of the same\n  type reuse the current modifiers. Inspired by a suggestion from Gary Porter.\n\n* Added group scanning (%[]). Scanlist ranges and multibyte sequences are not\n  supported yet.\n\n* Added count scanning (%n).\n\n* Changed the number scanning to accept thousand separators and any base.\n\n* Fixed positional for parameters. It is possible to write something like\n  %3$*1$.*2$d (which happens to be the same as %*.*d).\n\n* Fixed precision of integers.\n\n* Fixed parameter flags. Before trio could only handle one parameter flag per\n  specifier, although two (three with double-dot base) were possible.\n\n* Fixed isinf() for those platforms where it is unimplemented.\n\n\nVersion 0.18 - 2000/05/27\n-------------------------\n* Rewrote the entire floating-point formatting function (Danny Dulai had\n  reported several errors and even supplied some patches, which unfortunately\n  were lost due to the refactoring).\n\n* Removed the use of strlen() in the declaration of a stack array. This\n  caused problems on some compilers (besides it isn't really ANSI C compliant\n  anyways). Using some arbitrarily chosen maximum value; should examine if\n  some standard defines an upper limit on the length of decimal-point and\n  thousands-separator (sizeof(wchar_t) perhaps?)\n\n* Changed the parsing of the format string to be multibyte aware.\n\n\nVersion 0.17 - 2000/05/19\n-------------------------\n* Added INF, -INF, and NAN for floating-point numbers.\n\n* Fixed %#.9g -- alternative with precision.\n\n* Ken Gibson\n  Fixed printing of negative hex numbers\n\n* Joerg (last name unknown)\n  Fixed convertion of non-ASCII characters\n\n\nVersion 0.16 - 1999/08/06\n-------------------------\n* Changed the constness of the second argument of StrFloat and StrDouble. The\n  lack of parameter overloading in C is the reason for the strange use of\n  constness in strtof and strtod.\n\n* Cleaned up constness.\n\n\nVersion 0.15 - 1999/07/23\n-------------------------\n* Fixed the internal representation of numbers from signed to unsigned. Signed\n  numbers posed a problem for large unsigned numbers (reported by Tero)\n\n* Fixed a tiny bug in trio_vsprintfcat\n\n* Changed the meaning of the max argument of StrAppendMax to be consistant\n  with StrFormatAppendMax. Now it is the maximal size of the entire target\n  buffer, not just the appended size. This makes it easier to avoid buffer\n  overflows (requested by Tero)\n\n\nVersion 0.14 - 1999/05/16\n-------------------------\n* Added size_t support (just waiting for a C99 compliant compiler to add\n  ptrdiff_t and intmax_t)\n\n* Rewrote TrioOutStreamDouble so it does not use the libc sprintf to emulate\n  floating-point anylonger.\n\n* Fixed width, precision, and adjustment for numbers and doubles.\n\n\nVersion 0.13 - 1999/05/06\n-------------------------\n* Fixed zero padding for %d. Now %d will only zero pad if explicitly requested\n  to do so with the 0 flag (reported by Tero).\n\n* Fixed an incorrect while() condition in TrioGetString (reported by Tero).\n\n\nVersion 0.12 - 1999/04/19\n-------------------------\n* Fixed incorrect zero padding of pointers\n\n* Added StrHash with STRIO_HASH_PLAIN\n\n* Added StrFormatDateMax\n\n\nVersion 0.11 - 1999/03/25\n-------------------------\n* Made it compile under cygwin\n\n* Fixed a bug were TrioPreprocess would return an error if no formatting chars\n  were found (reported by Tero).\n\n\nVersion - 1999/03/19\n--------------------\n* Added trio_strerror and TRIO_ERROR_NAME.\n\n* Changed the error codes to be positive (as errno)\n\n* Fixed two reads of uninitialized memory reported by Purify\n\n* Added binary specifiers 'b' and 'B' (like SCO.) ThousandSeparator can be\n  used to separate nibbles (4 bit)\n\n* Renamed all Internal* functions to Trio*, which seems like a better\n  namespace (even though it is of no practical interest because these\n  functions are not visible beyond the scope of this file.)\n\n\nVersion - 1999/03/12\n--------------------\n* Added hex-float format for StrToDouble\n\n* Double references and gaps in the arguments are not allowed (for the %n$\n  format) and in both cases an error code is returned.\n\n* Added StrToDouble (and StrToFloat)\n\n\nVersion - 1999/03/08\n--------------------\n* Added InStream and OutStream to the trio_T structure.\n\n* Started work on TrioScan.\n\n* Return values for errors changed. Two macros to unpack the error code has\n  been added to the header.\n\n* Shortshort (hh) flag added.\n\n* %#s also quotes the quote-char now.\n\n* Removed the 'errorInFormat' boolean, which isn't used anymore after the\n  functions bail out with an error instead.\n\n\nVersion - 1999/03/04\n--------------------\n* More than MAX_PARAMETERS parametes will now cause the TrioPreprocess()\n  function to return error.\n\n* Unknown flags and/or specifiers cause errors too.\n\n* Added trio_snprintfcat and trio_vsnprintfcat and the defined name\n  StrFormatAppendMax. They append a formatted string to the end of a string.\n\n* Define MAX_PARAMETERS to 128 at all times instead of using NL_ARGMAX when\n  that exists.\n\n* Added platform fixes for Amiga as suggested by Tero Jnk <tesaja@utu.fi>\n\n\nVersion - 1999/01/31\n--------------------\n* vaprintf did add a zero byte even when it had failed.\n\n* Cleaned up the code for locale handling and thousand separator\n\n* Added trio_aprintf() and trio_vaprintf(). They return an allocated string.\n\n* Added thousands separator for numbers\n\n* Added floating point support for *printf\n\n\nVersion - 1998/10/20\n--------------------\n* StrMatchCase() called StrMatch() instead of itself recursively\n\n* Rewrote the implementation of *printf and *scanf and put all the code in\n  this file. Extended qualifiers and qualifiers from other standards were\n  added.\n\n* Added StrSpanFunction, StrToLong, and StrToUnsignedLong\n\n\nVersion - 1998/05/23\n--------------------\n* Made the StrEqual* functions resistant to NULL pointers\n\n* Turns out strdup() is no standard at all, and some platforms (I seem to\n  recall HP-UX) has problems with it. Made our own StrDuplicate() instead.\n\n* Added StrFormat() and StrFormatMax() to serve as sprintf() and snprintf()\n  respectively.\n"
  },
  {
    "path": "src/trio/FILES",
    "content": "FILES\nREADME\nCHANGES\nMakefile.in\nstrio.h\ntrio.c\ntrio.h\ntriodef.h\ntrionan.c\ntrionan.h\ntriop.h\ntriostr.c\ntriostr.h\ncompare.c\nregression.c\nconfigure\nconfigure.in\ninstall-sh\nautogen.sh\n"
  },
  {
    "path": "src/trio/Makefile.in",
    "content": "SHELL = @SHELL@\nCC\t= @CC@\nCFLAGS\t= @CFLAGS@ -I. -DDEBUG -fPIC -fvisibility=hidden\nOBJS\t= triostr.o trio.o trionan.o\nTARGETLIB\t= libtrio.a\n#TARGETSHLIB\t= $(TARGETLIB:.a=.so.2.0.0)\nTARGETSHLIB     =\nTARGETINCS\t= trio.h triop.h triodef.h trionan.h triostr.h\nLDFLAGS\t= -L. -ltrio -lm\nAR\t= ar\nRANLIB\t= @RANLIB@\nERASE\t= rm -f\nMKDIR\t= mkdir -p\nGENDOC\t= doxygen\nsrcdir\t= @srcdir@\n# VPATH doesn't seem to work with /usr/xpg4/bin/make on Solaris\n# (use /usr/ccs/bin/make), and doesn't work on older Solaris make\n# such as Solaris 2.6.\nVPATH = @srcdir@\n\n# Installation settings\nINSTALL\t\t= @INSTALL@\nINSTALL_DATA\t= @INSTALL_DATA@\nprefix\t\t= @prefix@\nexec_prefix\t= @exec_prefix@\nincludedir\t= @includedir@\nlibdir\t\t= @libdir@\n\nall: $(TARGETLIB) $(TARGETSHLIB) $(TARGET)\n\n.PHONY: all check test install doc clean\n\n$(srcdir)/configure: configure.in\n\tcd $(srcdir) && autoconf\n\nMakefile: Makefile.in config.status\n\tCONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \\\n\tCONFIG_FILES=Makefile ./config.status\n\nconfig.status: configure\n\t./config.status --recheck\n\ncheck:\ttest\ntest:\tregression\n\t./regression\n\ninstall:\t$(TARGETLIB) $(TARGETSHLIB)\n\t$(MKDIR) $(libdir)\n\t$(MKDIR) $(includedir)\n\t$(INSTALL_DATA) $(TARGETLIB) $(TARGETSHLIB) $(libdir)/\n\tfor i in $(TARGETINCS);do \\\n\t(set -x;$(INSTALL_DATA) $(srcdir)/$$i $(includedir)); \\\n\tdone\n\nregression: regression.o $(TARGETLIB)\n\t$(CC) $(CFLAGS) regression.o $(LDFLAGS) -o $@\n\nexample: example.o $(TARGETLIB)\n\t$(CC) $(CFLAGS) example.o $(LDFLAGS) -o $@\n\ncompare: compare.o $(TARGETLIB)\n\t$(CC) $(CFLAGS) compare.o $(LDFLAGS) -o $@\n\nuserdef: userdef.o $(TARGETLIB)\n\t$(CC) $(CFLAGS) userdef.o $(LDFLAGS) -o $@\n\n$(TARGETLIB): $(OBJS)\n\t$(AR) ruv $(TARGETLIB) $(OBJS)\n\t$(RANLIB) $(TARGETLIB)\n\n$(TARGETSHLIB): $(TARGETLIB)\n\t$(CC) -lm -shared -Wl,-soname,$(patsubst %.so.2.0.0,%.so.2,$@) -Wl,--whole-archive,$< -Wl,--no-whole-archive -o $@\n\ndoc::\n\t(cd $(srcdir) && $(GENDOC) doc/trio.cfg)\n\nclean:\n\t$(ERASE) *~ core core.* regression example $(TOBJS) $(OBJS) $(TARGET) $(TARGETLIB) $(TARGETSHLIB) example.o regression.o\n"
  },
  {
    "path": "src/trio/README",
    "content": "README -- trio\n\nTrio is a package with portable string functions. Including printf() clones\nand others.\n\n Copyright (C) 1998-2001 by Bjorn Reese and Daniel Stenberg.\n\n Permission to use, copy, modify, and distribute this software for any\n purpose with or without fee is hereby granted, provided that the above\n copyright notice and this permission notice appear in all copies.\n\n THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n\nTrio is intended to be an integral part of another application, so we\nhave not done anything to create a proper installation.\n\nCompile with 'make' (edit the Makefile if you want a release build)\n\nTest the package with 'make test'\n\nInstall by copying trio.h, triop.h, and libtrio.a (and man/man?/* if\nyou want documentation) to the appropriate directories.\n\nCatch some usage examples in example.c\n\nSend feedback and patches to the mailing list, subscription and other\ninformation is found here:\n\n        http://lists.sourceforge.net/lists/listinfo/ctrio-talk\n\nEnjoy!\n\nTrio web page\n\n        http://daniel.haxx.se/trio/\n"
  },
  {
    "path": "src/trio/README.hypermail",
    "content": "This is the ctrio 1.16 [1] release, stripped of its documentation and with\nsome patches to fix compilation problems when using -DTRIO_MINIMAL.\n\nThe generation of the libtrio shared library is also disabled as we're\ndoing a static link.\n\nSee the hypermail-patches.diff file for the exact changes.\n\n-Jose Kahan 09/10/2018\n\n[1] https://sourceforge.net/projects/ctrio/\n\n"
  },
  {
    "path": "src/trio/autogen.sh",
    "content": "#!/bin/sh\nautoconf\nrm -rf autom4te.cache\n"
  },
  {
    "path": "src/trio/compare.c",
    "content": "#include \"trio.h\"\n\n#define compare(format, value) printf(\"FORMAT: %s\\n\", format); printf(\"TRIO: \"); trio_printf(format,value); printf(\"\\nLIBC: \"); \\\nprintf(format,value); printf(\"\\n\\n\"); \n\nint main()\n{\n   compare(\"\\\"%e\\\"\",2.342E+02);\n   compare(\"\\\"%10.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%11.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%12.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%13.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%14.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%15.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%16.4e\\\"\",-2.342E-02);\n   compare(\"\\\"%16.4e\\\"\",-2.342E-22);\n   compare(\"\\\"%G\\\"\",-2.342E-02);\n   compare(\"\\\"%G\\\"\",3.1415e-6);\n   compare(\"%016e\", 3141.5);\n   compare(\"%16e\", 3141.5);\n   compare(\"%-16e\", 3141.5);\n   compare(\"%010.3e\", 3141.5);\n\n   compare(\"*%5f*\", 3.3);\n   compare(\"*%5f*\", 3.0);\n   compare(\"*%5f*\", .999999E-4);\n   compare(\"*%5f*\", .99E-3);\n   compare(\"*%5f*\", 3333.0);\n\n   compare(\"*%5g*\", 3.3);\n   compare(\"*%5g*\", 3.0);\n   compare(\"*%5g*\", .999999E-4);\n   compare(\"*%5g*\", .99E-3);\n   compare(\"*%5g*\", 3333.0);\n   compare(\"*%5g*\", 0.01);\n\n   compare(\"*%5.g*\", 3.3);\n   compare(\"*%5.g*\", 3.0);\n   compare(\"*%5.g*\", .999999E-4);\n   compare(\"*%5.g*\", 1.0E-4);\n   compare(\"*%5.g*\", .99E-3);\n   compare(\"*%5.g*\", 3333.0);\n   compare(\"*%5.g*\", 0.01);\n\n   compare(\"*%5.2g*\", 3.3);\n   compare(\"*%5.2g*\", 3.0);\n   compare(\"*%5.2g*\", .999999E-4);\n   compare(\"*%5.2g*\", .99E-3);\n   compare(\"*%5.2g*\", 3333.0);\n   compare(\"*%5.2g*\", 0.01);\n\n   return 0;\n}\n"
  },
  {
    "path": "src/trio/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME=\nPACKAGE_TARNAME=\nPACKAGE_VERSION=\nPACKAGE_STRING=\nPACKAGE_BUGREPORT=\nPACKAGE_URL=\n\nac_unique_file=\"triodef.h\"\nac_subst_vars='LTLIBOBJS\nLIBOBJS\nRANLIB\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures this package to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n\n  cat <<\\_ACEOF\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nconfigure\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n   case $ac_cv_prog_cc_stdc in #(\n  no) :\n    ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #(\n  *) :\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C99... \" >&6; }\nif ${ac_cv_prog_cc_c99+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c99=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <wchar.h>\n#include <stdio.h>\n\n// Check varargs macros.  These examples are taken from C99 6.10.3.5.\n#define debug(...) fprintf (stderr, __VA_ARGS__)\n#define showlist(...) puts (#__VA_ARGS__)\n#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))\nstatic void\ntest_varargs_macros (void)\n{\n  int x = 1234;\n  int y = 5678;\n  debug (\"Flag\");\n  debug (\"X = %d\\n\", x);\n  showlist (The first, second, and third items.);\n  report (x>y, \"x is %d but y is %d\", x, y);\n}\n\n// Check long long types.\n#define BIG64 18446744073709551615ull\n#define BIG32 4294967295ul\n#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)\n#if !BIG_OK\n  your preprocessor is broken;\n#endif\n#if BIG_OK\n#else\n  your preprocessor is broken;\n#endif\nstatic long long int bignum = -9223372036854775807LL;\nstatic unsigned long long int ubignum = BIG64;\n\nstruct incomplete_array\n{\n  int datasize;\n  double data[];\n};\n\nstruct named_init {\n  int number;\n  const wchar_t *name;\n  double average;\n};\n\ntypedef const char *ccp;\n\nstatic inline int\ntest_restrict (ccp restrict text)\n{\n  // See if C++-style comments work.\n  // Iterate through items via the restricted pointer.\n  // Also check for declarations in for loops.\n  for (unsigned int i = 0; *(text+i) != '\\0'; ++i)\n    continue;\n  return 0;\n}\n\n// Check varargs and va_copy.\nstatic void\ntest_varargs (const char *format, ...)\n{\n  va_list args;\n  va_start (args, format);\n  va_list args_copy;\n  va_copy (args_copy, args);\n\n  const char *str;\n  int number;\n  float fnumber;\n\n  while (*format)\n    {\n      switch (*format++)\n\t{\n\tcase 's': // string\n\t  str = va_arg (args_copy, const char *);\n\t  break;\n\tcase 'd': // int\n\t  number = va_arg (args_copy, int);\n\t  break;\n\tcase 'f': // float\n\t  fnumber = va_arg (args_copy, double);\n\t  break;\n\tdefault:\n\t  break;\n\t}\n    }\n  va_end (args_copy);\n  va_end (args);\n}\n\nint\nmain ()\n{\n\n  // Check bool.\n  _Bool success = false;\n\n  // Check restrict.\n  if (test_restrict (\"String literal\") == 0)\n    success = true;\n  char *restrict newvar = \"Another string\";\n\n  // Check varargs.\n  test_varargs (\"s, d' f .\", \"string\", 65, 34.234);\n  test_varargs_macros ();\n\n  // Check flexible array members.\n  struct incomplete_array *ia =\n    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));\n  ia->datasize = 10;\n  for (int i = 0; i < ia->datasize; ++i)\n    ia->data[i] = i * 1.234;\n\n  // Check named initializers.\n  struct named_init ni = {\n    .number = 34,\n    .name = L\"Test wide string\",\n    .average = 543.34343,\n  };\n\n  ni.number = 58;\n\n  int dynamic_array[ni.number];\n  dynamic_array[ni.number - 1] = 543;\n\n  // work around unused variable warnings\n  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'\n\t  || dynamic_array[ni.number - 1] != 543);\n\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c99=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c99\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c99\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c99\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99\" >&5\n$as_echo \"$ac_cv_prog_cc_c99\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c99\" != xno; then :\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89\nelse\n  ac_cv_prog_cc_stdc=no\nfi\n\nfi\n ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C\" >&5\n$as_echo_n \"checking for $CC option to accept ISO Standard C... \" >&6; }\n  if ${ac_cv_prog_cc_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\n\n  case $ac_cv_prog_cc_stdc in #(\n  no) :\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;; #(\n  '') :\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;; #(\n  *) :\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc\" >&5\n$as_echo \"$ac_cv_prog_cc_stdc\" >&6; } ;;\nesac\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for IEEE compilation options\" >&5\n$as_echo_n \"checking for IEEE compilation options... \" >&6; }\nif ${ac_cv_ieee_option+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n    #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__))) && (defined(VMS) || defined(__VMS)))\n    # error \"Option needed\"\n    typedef int option_needed[-1];\n    #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_ieee_option=\"/IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE\"\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n      #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__) && !defined(__GNUC__))) && !(defined(VMS) || defined(__VMS)) && !defined(_CFE))\n      # error \"Option needed\"\n      typedef int option_needed-1;\n      #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_ieee_option=\"-ieee\"\nelse\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n\t#if !(defined(__alpha) && (defined(__GNUC__) && (defined(__osf__) || defined(__linux__))))\n\t# error \"Option needed\"\n\ttypedef int option_needed-1;\n\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_ieee_option=\"-mieee\"\nelse\n  ac_cv_ieee_option=\"none\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_ieee_option\" >&5\n$as_echo \"$ac_cv_ieee_option\" >&6; }\nif test $ac_cv_ieee_option != none; then\n  CFLAGS=\"${CFLAGS} ${ac_cv_ieee_option}\"\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sigaction()\" >&5\n$as_echo_n \"checking for sigaction()... \" >&6; }\nif ${ac_cv_sigaction+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n    #include <signal.h>\n    #if !defined(SA_SIGINFO)\n    #  error \"SA_SIGINFO not defined\"\n    #endif\n\nint\nmain ()\n{\n\n    struct sigaction s;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_sigaction=\"true\"\nelse\n  ac_cv_sigaction=\"false\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_sigaction\" >&5\n$as_echo \"$ac_cv_sigaction\" >&6; }\nif test $ac_cv_sigaction != false; then\n  CFLAGS=\"${CFLAGS} -DHAVE_STRUCT_SIGACTION\"\nfi\n\nac_config_files=\"$ac_config_files Makefile\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# Transform confdefs.h into DEFS.\n# Protect against shell expansion while executing Makefile rules.\n# Protect against Makefile macro expansion.\n#\n# If the first sed substitution is executed (which looks for macros that\n# take arguments), then branch to the quote section.  Otherwise,\n# look for a macro that doesn't take arguments.\nac_script='\n:mline\n/\\\\$/{\n N\n s,\\\\\\n,,\n b mline\n}\nt clear\n:clear\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t (][^\t (]*([^)]*)\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t ][^\t ]*\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\nb any\n:quote\ns/[\t `~#$^&*(){}\\\\|;'\\''\"<>?]/\\\\&/g\ns/\\[/\\\\&/g\ns/\\]/\\\\&/g\ns/\\$/$$/g\nH\n:any\n${\n\tg\n\ts/^\\n//\n\ts/\\n/ /g\n\tp\n}\n'\nDEFS=`sed -n \"$ac_script\" confdefs.h`\n\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by $as_me, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n\nConfiguration files:\n$config_files\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nconfig.status\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h |  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n\neval set X \"  :F $CONFIG_FILES      \"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n\n\n\n  esac\n\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "src/trio/configure.in",
    "content": "dnl\ndnl Configuration for trio\ndnl\n\nAC_INIT\nAC_CONFIG_SRCDIR([triodef.h])\nAC_PREREQ(2.55) dnl autoconf 2.55 was released in 2002\n\nAC_PROG_CC\nifdef([AC_PROG_CC_STDC], [AC_PROG_CC_STDC])\nAC_LANG([C])\n\nAC_PROG_INSTALL\nAC_PROG_RANLIB\n\ndnl\ndnl Alpha floating-point compiler option.\ndnl\n\nAC_MSG_CHECKING(for IEEE compilation options)\nAC_CACHE_VAL(ac_cv_ieee_option, [\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[[\n    #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__))) && (defined(VMS) || defined(__VMS)))\n    # error \"Option needed\"\n    typedef int option_needed[-1];\n    #endif\n    ]])],\n    ac_cv_ieee_option=\"/IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE\",\n    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[[\n      #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__) && !defined(__GNUC__))) && !(defined(VMS) || defined(__VMS)) && !defined(_CFE))\n      # error \"Option needed\"\n      typedef int option_needed[-1];\n      #endif\n      ]])],\n      ac_cv_ieee_option=\"-ieee\",\n      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[[\n\t#if !(defined(__alpha) && (defined(__GNUC__) && (defined(__osf__) || defined(__linux__))))\n\t# error \"Option needed\"\n\ttypedef int option_needed[-1];\n\t#endif\n\t]])],\n\tac_cv_ieee_option=\"-mieee\",\n\tac_cv_ieee_option=\"none\"\n      )\n    )\n  )\n])\nAC_MSG_RESULT($ac_cv_ieee_option)\nif test $ac_cv_ieee_option != none; then\n  CFLAGS=\"${CFLAGS} ${ac_cv_ieee_option}\"\nfi\n\ndnl\ndnl Check for sigaction()\ndnl\n\nAC_MSG_CHECKING(for sigaction())\nAC_CACHE_VAL(ac_cv_sigaction, [\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n    #include <signal.h>\n    #if !defined(SA_SIGINFO)\n    #  error \"SA_SIGINFO not defined\"\n    #endif\n    ]],[[\n    struct sigaction s;\n    ]])],\n    ac_cv_sigaction=\"true\",\n    ac_cv_sigaction=\"false\"\n  )\n])\nAC_MSG_RESULT($ac_cv_sigaction)\nif test $ac_cv_sigaction != false; then\n  CFLAGS=\"${CFLAGS} -DHAVE_STRUCT_SIGACTION\"\nfi\n\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "src/trio/hypermail-patches.diff",
    "content": "Only in /tmp/trio-1.16: doc\nOnly in /tmp/trio-1.16: example.c\ndiff -u -r /tmp/trio-1.16/FILES trio/FILES\n--- /tmp/trio-1.16/FILES\t2013-06-13 11:17:24.000000000 +0200\n+++ trio/FILES\t2018-10-09 17:10:51.000445950 +0200\n@@ -2,7 +2,6 @@\n README\n CHANGES\n Makefile.in\n-maketgz\n strio.h\n trio.c\n trio.h\n@@ -13,21 +12,8 @@\n triostr.c\n triostr.h\n compare.c\n-example.c\n regression.c\n configure\n configure.in\n install-sh\n autogen.sh\n-doc/doc.h\n-doc/doc_dynamic.h\n-doc/doc_printf.h\n-doc/doc_register.h\n-doc/doc_scanf.h\n-doc/doc_static.h\n-doc/footer.html\n-doc/header.html\n-doc/trio.cfg\n-doc/trio.css\n-html/trio.css\n-html/*.html\nOnly in /tmp/trio-1.16: html\ndiff -u -r /tmp/trio-1.16/Makefile.in trio/Makefile.in\n--- /tmp/trio-1.16/Makefile.in\t2013-09-18 14:48:43.000000000 +0200\n+++ trio/Makefile.in\t2018-10-09 17:19:35.318110225 +0200\n@@ -3,7 +3,8 @@\n CFLAGS\t= @CFLAGS@ -I. -DDEBUG -fPIC -fvisibility=hidden\n OBJS\t= triostr.o trio.o trionan.o\n TARGETLIB\t= libtrio.a\n-TARGETSHLIB\t= $(TARGETLIB:.a=.so.2.0.0)\n+#TARGETSHLIB\t= $(TARGETLIB:.a=.so.2.0.0)\n+TARGETSHLIB     =\n TARGETINCS\t= trio.h triop.h triodef.h trionan.h triostr.h\n LDFLAGS\t= -L. -ltrio -lm\n AR\t= ar\nOnly in /tmp/trio-1.16: maketgz\ndiff -u -r /tmp/trio-1.16/trionan.c trio/trionan.c\n--- /tmp/trio-1.16/trionan.c\t2014-07-16 11:53:46.000000000 +0200\n+++ trio/trionan.c\t2018-10-09 17:18:14.320616383 +0200\n@@ -68,6 +68,9 @@\n #if !defined(TRIO_PRIVATE_NAN)\n # define TRIO_PRIVATE_NAN TRIO_PRIVATE\n #endif\n+#if !defined(TRIO_INLINE_NAN)\n+# define TRIO_INLINE_NAN TRIO_INLINE\n+#endif\n \n #define TRIO_TRUE (1 == 1)\n #define TRIO_FALSE (0 == 1)\n@@ -427,7 +430,7 @@\n \n #if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT)\n \n-TRIO_PRIVATE_NAN TRIO_INLINE int\n+TRIO_PRIVATE_NAN TRIO_INLINE_NAN int\n c99_fpclassify_and_signbit\n TRIO_ARGS2((number, is_negative),\n \t   double number,\n@@ -452,7 +455,7 @@\n \n #if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT)\n \n-TRIO_PRIVATE_NAN TRIO_INLINE int\n+TRIO_PRIVATE_NAN TRIO_INLINE_NAN int\n decc_fpclassify_and_signbit\n TRIO_ARGS2((number, is_negative),\n \t  double number,\n@@ -570,7 +573,7 @@\n \n #if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT)\n \n-TRIO_PRIVATE_NAN TRIO_INLINE int\n+TRIO_PRIVATE_NAN TRIO_INLINE_NAN int\n hp_fpclassify_and_signbit\n TRIO_ARGS2((number, is_negative),\n \t  double number,\n@@ -619,7 +622,7 @@\n \n #if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT)\n \n-TRIO_PRIVATE_NAN TRIO_INLINE int\n+TRIO_PRIVATE_NAN TRIO_INLINE_NAN int\n xlc_fpclassify_and_signbit\n TRIO_ARGS2((number, is_negative),\n \t  double number,\ndiff -u -r /tmp/trio-1.16/trionan.h trio/trionan.h\n--- /tmp/trio-1.16/trionan.h\t2013-06-13 11:17:24.000000000 +0200\n+++ trio/trionan.h\t2018-10-09 17:17:48.128130318 +0200\n@@ -71,6 +71,10 @@\n #  endif\n # endif\n \n+# if !defined(TRIO_INLINE_NAN)\n+#  define TRIO_INLINE_NAN\n+# endif  \n+\n #else\n \n /*\ndiff -u -r /tmp/trio-1.16/triostr.h trio/triostr.h\n--- /tmp/trio-1.16/triostr.h\t2013-06-13 11:17:24.000000000 +0200\n+++ trio/triostr.h\t2018-10-09 17:41:29.676952564 +0200\n@@ -119,6 +119,9 @@\n #  if !defined(TRIO_FUNC_TO_LONG_DOUBLE)\n #   define TRIO_FUNC_TO_LONG_DOUBLE\n #  endif\n+#  if !defined(TRIO_FUNC_TO_FLOAT)\n+#   define TRIO_FUNC_TO_FLOAT\n+#  endif  \n # endif\n \n # if defined(TRIO_FUNC_STRING_TERMINATE)\n"
  },
  {
    "path": "src/trio/install-sh",
    "content": "#!/bin/sh\n#\n# install - install a program, script, or datafile\n# This comes from X11R5 (mit/util/scripts/install.sh).\n#\n# Copyright 1991 by the Massachusetts Institute of Technology\n#\n# Permission to use, copy, modify, distribute, and sell this software and its\n# documentation for any purpose is hereby granted without fee, provided that\n# the above copyright notice appear in all copies and that both that\n# copyright notice and this permission notice appear in supporting\n# documentation, and that the name of M.I.T. not be used in advertising or\n# publicity pertaining to distribution of the software without specific,\n# written prior permission.  M.I.T. makes no representations about the\n# suitability of this software for any purpose.  It is provided \"as is\"\n# without express or implied warranty.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.  It can only install one file at a time, a restriction\n# shared with many OS's install programs.\n\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=\"${DOITPROG-}\"\n\n\n# put in absolute paths if you don't have them in your path; or use env. vars.\n\nmvprog=\"${MVPROG-mv}\"\ncpprog=\"${CPPROG-cp}\"\nchmodprog=\"${CHMODPROG-chmod}\"\nchownprog=\"${CHOWNPROG-chown}\"\nchgrpprog=\"${CHGRPPROG-chgrp}\"\nstripprog=\"${STRIPPROG-strip}\"\nrmprog=\"${RMPROG-rm}\"\nmkdirprog=\"${MKDIRPROG-mkdir}\"\n\ntransformbasename=\"\"\ntransform_arg=\"\"\ninstcmd=\"$mvprog\"\nchmodcmd=\"$chmodprog 0755\"\nchowncmd=\"\"\nchgrpcmd=\"\"\nstripcmd=\"\"\nrmcmd=\"$rmprog -f\"\nmvcmd=\"$mvprog\"\nsrc=\"\"\ndst=\"\"\ndir_arg=\"\"\n\nwhile [ x\"$1\" != x ]; do\n    case $1 in\n\t-c) instcmd=\"$cpprog\"\n\t    shift\n\t    continue;;\n\n\t-d) dir_arg=true\n\t    shift\n\t    continue;;\n\n\t-m) chmodcmd=\"$chmodprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-o) chowncmd=\"$chownprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-g) chgrpcmd=\"$chgrpprog $2\"\n\t    shift\n\t    shift\n\t    continue;;\n\n\t-s) stripcmd=\"$stripprog\"\n\t    shift\n\t    continue;;\n\n\t-t=*) transformarg=`echo $1 | sed 's/-t=//'`\n\t    shift\n\t    continue;;\n\n\t-b=*) transformbasename=`echo $1 | sed 's/-b=//'`\n\t    shift\n\t    continue;;\n\n\t*)  if [ x\"$src\" = x ]\n\t    then\n\t\tsrc=$1\n\t    else\n\t\t# this colon is to work around a 386BSD /bin/sh bug\n\t\t:\n\t\tdst=$1\n\t    fi\n\t    shift\n\t    continue;;\n    esac\ndone\n\nif [ x\"$src\" = x ]\nthen\n\techo \"install:\tno input file specified\"\n\texit 1\nelse\n\ttrue\nfi\n\nif [ x\"$dir_arg\" != x ]; then\n\tdst=$src\n\tsrc=\"\"\n\t\n\tif [ -d $dst ]; then\n\t\tinstcmd=:\n\telse\n\t\tinstcmd=mkdir\n\tfi\nelse\n\n# Waiting for this to be detected by the \"$instcmd $src $dsttmp\" command\n# might cause directories to be created, which would be especially bad \n# if $src (and thus $dsttmp) contains '*'.\n\n\tif [ -f $src -o -d $src ]\n\tthen\n\t\ttrue\n\telse\n\t\techo \"install:  $src does not exist\"\n\t\texit 1\n\tfi\n\t\n\tif [ x\"$dst\" = x ]\n\tthen\n\t\techo \"install:\tno destination specified\"\n\t\texit 1\n\telse\n\t\ttrue\n\tfi\n\n# If destination is a directory, append the input filename; if your system\n# does not like double slashes in filenames, you may need to add some logic\n\n\tif [ -d $dst ]\n\tthen\n\t\tdst=\"$dst\"/`basename $src`\n\telse\n\t\ttrue\n\tfi\nfi\n\n## this sed command emulates the dirname command\ndstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`\n\n# Make sure that the destination directory exists.\n#  this part is taken from Noah Friedman's mkinstalldirs script\n\n# Skip lots of stat calls in the usual case.\nif [ ! -d \"$dstdir\" ]; then\ndefaultIFS='\t\n'\nIFS=\"${IFS-${defaultIFS}}\"\n\noIFS=\"${IFS}\"\n# Some sh's can't handle IFS=/ for some reason.\nIFS='%'\nset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`\nIFS=\"${oIFS}\"\n\npathcomp=''\n\nwhile [ $# -ne 0 ] ; do\n\tpathcomp=\"${pathcomp}${1}\"\n\tshift\n\n\tif [ ! -d \"${pathcomp}\" ] ;\n        then\n\t\t$mkdirprog \"${pathcomp}\"\n\telse\n\t\ttrue\n\tfi\n\n\tpathcomp=\"${pathcomp}/\"\ndone\nfi\n\nif [ x\"$dir_arg\" != x ]\nthen\n\t$doit $instcmd $dst &&\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dst; else true ; fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dst; else true ; fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dst; else true ; fi\nelse\n\n# If we're going to rename the final executable, determine the name now.\n\n\tif [ x\"$transformarg\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\tdstfile=`basename $dst $transformbasename | \n\t\t\tsed $transformarg`$transformbasename\n\tfi\n\n# don't allow the sed command to completely eliminate the filename\n\n\tif [ x\"$dstfile\" = x ] \n\tthen\n\t\tdstfile=`basename $dst`\n\telse\n\t\ttrue\n\tfi\n\n# Make a temp file name in the proper directory.\n\n\tdsttmp=$dstdir/#inst.$$#\n\n# Move or copy the file name to the temp name\n\n\t$doit $instcmd $src $dsttmp &&\n\n\ttrap \"rm -f ${dsttmp}\" 0 &&\n\n# and set any options; do chmod last to preserve setuid bits\n\n# If any of these fail, we abort the whole thing.  If we want to\n# ignore errors from any of these, just make sure not to ignore\n# errors from the above \"$doit $instcmd $src $dsttmp\" command.\n\n\tif [ x\"$chowncmd\" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&\n\tif [ x\"$chgrpcmd\" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&\n\tif [ x\"$stripcmd\" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&\n\tif [ x\"$chmodcmd\" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&\n\n# Now rename the file to the real destination.\n\n\t$doit $rmcmd -f $dstdir/$dstfile &&\n\t$doit $mvcmd $dsttmp $dstdir/$dstfile \n\nfi &&\n\n\nexit 0\n"
  },
  {
    "path": "src/trio/regression.c",
    "content": "/*************************************************************************\n * Regression test\n */\n\n#include \"triodef.h\"\n#if defined(TRIO_COMPILER_ANCIENT)\n# include <varargs.h>\n#else\n# include <stdarg.h>\n#endif\n#include <math.h>\n#include <limits.h>\n#include <float.h>\n#include <errno.h>\n\n#include \"trio.h\"\n#include \"triop.h\"\n#if defined(TRIO_EMBED_NAN)\n# define TRIO_PUBLIC_NAN static\n# define TRIO_FUNC_NINF\n# define TRIO_FUNC_PINF\n# define TRIO_FUNC_NAN\n# define TRIO_FUNC_ISINF\n# define TRIO_FUNC_ISNAN\n# if TRIO_FEATURE_FLOAT\n#  define TRIO_FUNC_NZERO\n# endif\n#endif\n#include \"trionan.h\"\n#if defined(TRIO_EMBED_STRING)\n# define TRIO_PUBLIC_STRING static\n# define TRIO_FUNC_EQUAL_CASE\n#endif\n#include \"triostr.h\"\n#undef printf\n\n#if TRIO_FEATURE_WIDECHAR\n# include <wchar.h>\n#endif\n\n#define QUOTE(x) #x\n\n#define DOUBLE_EQUAL(x,y) (((x)>(y)-DBL_EPSILON) && ((x)<(y)+DBL_EPSILON))\n#define FLOAT_EQUAL(x,y) (((x)>(y)-FLT_EPSILON) && ((x)<(y)+FLT_EPSILON))\n\nstatic TRIO_CONST char rcsid[] = \"@(#)$Id$\";\n\n#if defined(TRIO_EMBED_NAN)\n# include \"trionan.c\"\n#endif\n#if defined(TRIO_EMBED_STRING)\n# include \"triostr.c\"\n#endif\n\n/*************************************************************************\n *\n */\nstatic void\nDump\nTRIO_ARGS2((buffer, rc),\n\t   char *buffer,\n\t   int rc)\n{\n  if (rc < 0)\n    {\n      printf(\"Err = %d (%s), Pos = %d\\n\",\n\t     TRIO_ERROR_CODE(rc),\n\t     TRIO_ERROR_NAME(rc),\n\t     TRIO_ERROR_POSITION(rc));\n    }\n  else if (buffer)\n    printf(\"buffer[% 3d] = \\\"%s\\\"\\n\", rc, buffer);\n}\n\n/*************************************************************************\n *\n */\nstatic void\nReport0\nTRIO_ARGS2((file, line),\n          TRIO_CONST char *file,\n          int line)\n{\n  printf(\"Verification failed in %s:%d.\\n\", file, line);\n}\n\n/*************************************************************************\n *\n */\nstatic void\nReport\nTRIO_ARGS4((file, line, expected, got),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *got)\n{\n  Report0(file, line);\n  printf(\"  Expected \\\"%s\\\"\\n\", expected);\n  printf(\"  Got      \\\"%s\\\"\\n\", got);\n}\n\n/*************************************************************************\n *\n */\nint\nCompare\nTRIO_ARGS4((file, line, expected, got),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *got)\n{\n  if (!trio_equal_case(expected, got))\n    {\n      Report(file, line, expected, got);\n      return 1;\n    }\n  return 0;\n}\n\n/*************************************************************************\n *\n */\nint\nVerify\nTRIO_VARGS5((file, line, result, fmt, va_alist),\n\t    TRIO_CONST char *file,\n\t    int line,\n\t    TRIO_CONST char *expected,\n\t    TRIO_CONST char *fmt,\n\t    TRIO_VA_DECL)\n{\n  int rc;\n  va_list args;\n  char buffer[4096];\n\n  TRIO_VA_START(args, fmt);\n  rc = trio_vsnprintf(buffer, sizeof(buffer), fmt, args);\n  if (rc < 0)\n    Dump(buffer, rc);\n  TRIO_VA_END(args);\n\n  return Compare(file, line, expected, buffer);\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyV\nTRIO_ARGS5((file, line, result, fmt, args),\n\t    TRIO_CONST char *file,\n\t    int line,\n\t    TRIO_CONST char *expected,\n\t    TRIO_CONST char *fmt,\n\t    trio_pointer_t args)\n{\n  int rc;\n  char buffer[4096];\n\n  rc = trio_snprintfv(buffer, sizeof(buffer), fmt, args);\n  if (rc < 0)\n    Dump(buffer, rc);\n\n  return Compare(file, line, expected, buffer);\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyReturnValues(TRIO_NOARGS)\n{\n  int nerrors = 0;\n  int rc;\n  int count;\n  char *expected;\n  char buffer[4096];\n  char result[4096];\n\n  rc = trio_sprintf(buffer, \"%s%n\", \"0123456789\", &count);\n  trio_sprintf(result, \"%d %d %s\", rc, count, buffer);\n  expected = \"10 10 0123456789\";\n  if (!trio_equal_case(result, expected))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, expected, result);\n    }\n  \n  rc = trio_snprintf(buffer, sizeof(buffer), \"%s%n\", \"0123456789\", &count);\n  trio_sprintf(result, \"%d %d %s\", rc, count, buffer);\n  expected = \"10 10 0123456789\";\n  if (!trio_equal_case(result, expected))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, expected, result);\n    }\n  \n  rc = trio_snprintf(buffer, 4, \"%s%n\", \"0123456789\", &count);\n  trio_sprintf(result, \"%d %d %s\", rc, count, buffer);\n  expected = \"10 3 012\";\n  if (!trio_equal_case(result, expected))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, expected, result);\n    }\n\n  /* The output buffer contains the empty string */\n  rc = trio_snprintf(buffer, 1, \"%s%n\", \"0123456789\", &count);\n  trio_sprintf(result, \"%d %d %s\", rc, count, buffer);\n  expected = \"10 0 \";\n  if (!trio_equal_case(result, expected))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, expected, result);\n    }\n\n  /* The output buffer should be left untouched when max size is 0 */\n  trio_sprintf(buffer, \"DO NOT TOUCH\");\n  rc = trio_snprintf(buffer, 0, \"%s%n\", \"0123456789\", &count);\n  trio_sprintf(result, \"%d %d %s\", rc, count, buffer);\n  expected = \"10 0 DO NOT TOUCH\";\n  if (!trio_equal_case(result, expected))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, expected, result);\n    }\n  \n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\n#define TEST_STRING \"0123456789\"\n\nint\nVerifyAllocate(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if TRIO_FEATURE_DYNAMICSTRING\n  int rc;\n  char *string;\n  int count;\n  int test_size = sizeof(TEST_STRING) - 1;\n\n  /* Allocate a string with the result */\n  rc = trio_asprintf(&string, \"%s%n\", TEST_STRING, &count);\n  if (rc < 0)\n    {\n      nerrors++;\n      Dump(string, rc);\n    }\n  else if (count != test_size)\n    {\n      nerrors++;\n      printf(\"Validation failed in %s:%d\\n\", __FILE__, __LINE__);\n      printf(\"  Expected %%n = %d\\n\", test_size);\n      printf(\"  Got      %%n = %d\\n\", count);\n    }\n  else if (!trio_equal_case(string, TEST_STRING))\n    {\n      nerrors++;\n      Report(__FILE__, __LINE__, TEST_STRING, string);\n    }\n  if (string)\n    free(string);\n#endif\n  \n  return nerrors;\n}\n\n\n/*************************************************************************\n *\n */\nint\nVerifyFormattingStrings(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n  /* Normal text */\n  nerrors += Verify(__FILE__, __LINE__, \"Hello world\",\n\t\t   \"Hello world\");\n  /* String */\n  nerrors += Verify(__FILE__, __LINE__, \"Hello world\",\n\t\t   \"%s\", \"Hello world\");\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyFormattingIntegers(TRIO_NOARGS)\n{\n  int nerrors = 0;\n  char buffer[256];\n  \n  /* Integer */\n  nerrors += Verify(__FILE__, __LINE__, \"Number 42\",\n\t\t   \"Number %d\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"Number -42\",\n\t\t   \"Number %d\", -42);\n  nerrors += Verify(__FILE__, __LINE__, \"Number 42\",\n\t\t   \"Number %ld\", 42L);\n  nerrors += Verify(__FILE__, __LINE__, \"Number -42\",\n\t\t   \"Number %ld\", -42L);\n  /* Integer width */\n  nerrors += Verify(__FILE__, __LINE__, \"  1234\",\n\t\t    \"%6d\", 1234);\n  nerrors += Verify(__FILE__, __LINE__, \"  1234\",\n\t\t    \"%*d\", 6, 1234);\n  /* Integer width overrun */\n  nerrors += Verify(__FILE__, __LINE__, \"123456\",\n\t\t    \"%4d\", 123456);\n  /* Integer precision */\n  nerrors += Verify(__FILE__, __LINE__, \"0012\",\n\t\t    \"%.4d\", 12);\n  nerrors += Verify(__FILE__, __LINE__, \"0012\",\n\t\t    \"%.*d\", 4, 12);\n  nerrors += Verify(__FILE__, __LINE__, \"  0012\",\n\t\t    \"%6.*d\", 4, 12);\n  nerrors += Verify(__FILE__, __LINE__, \"  0012\",\n\t\t    \"%*.*d\", 6, 4, 12);\n  nerrors += Verify(__FILE__, __LINE__, \"  0012\",\n\t\t    \"%*.*.*d\", 6, 4, 2, 12);\n  nerrors += Verify(__FILE__, __LINE__, \"  0012\",\n\t\t    \"%*.*.*i\", 6, 4, 10, 12);\n  /* Integer sign, zero-padding, and width */\n  nerrors += Verify(__FILE__, __LINE__, \"+01234\",\n\t\t    \"%+06d\", 1234);\n  nerrors += Verify(__FILE__, __LINE__, \" 01234\",\n\t\t    \"% 06d\", 1234);\n  nerrors += Verify(__FILE__, __LINE__, \"+01234\",\n\t\t    \"% +06d\", 1234);\n  /* Integer adjust, zero-padding, and width */\n  nerrors += Verify(__FILE__, __LINE__, \"12      \",\n\t\t    \"%-08d\", 12);\n  /* Integer zero-padding, width, and precision */\n  nerrors += Verify(__FILE__, __LINE__, \"  000012\",\n\t\t    \"%08.6d\", 12);\n  /* Integer base */\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t   \"%u\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"-1\",\n\t\t   \"%d\", -1);\n  nerrors += Verify(__FILE__, __LINE__, \"52\",\n\t\t   \"%o\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"052\",\n\t\t   \"%#o\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t   \"%#o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"2a\",\n\t\t    \"%x\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"2A\",\n\t\t    \"%X\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"0x2a\",\n\t\t   \"%#x\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"0X2A\",\n\t\t   \"%#X\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"0x00c \",\n\t\t   \"%-#6.3x\", 12);\n  nerrors += Verify(__FILE__, __LINE__, \"\",\n\t\t   \"%.d\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"\",\n\t\t   \"%#.d\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t   \"%.d\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"\",\n\t\t   \"%.o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"    0000\",\n\t\t   \"%8.4o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"       0\",\n\t\t   \"%8o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"00000000\",\n\t\t   \"%08o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t   \"%#.o\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"52\",\n\t\t   \"%.o\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"\",\n\t\t   \"%.x\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"\",\n\t\t   \"%#.x\", 0);\n  nerrors += Verify(__FILE__, __LINE__, \"2a\",\n\t\t   \"%.x\", 42);\n  sprintf(buffer, \"%u\", UINT_MAX);\n  nerrors += Verify(__FILE__, __LINE__, buffer,\n\t\t   \"%u\", -1);\n  sprintf(buffer, \"%x\", UINT_MAX);\n  nerrors += Verify(__FILE__, __LINE__, buffer,\n\t\t    \"%x\", -1);\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyFormattingFloats(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n#if TRIO_FEATURE_FLOAT\n  /* Double */\n  nerrors += Verify(__FILE__, __LINE__, \"3141.000000\",\n\t\t    \"%f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.500000\",\n\t\t    \"%f\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"3.141000e+03\",\n\t\t    \"%e\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"     -2.3420e-02\",\n\t\t    \"%16.4e\", -2.342E-02);\n  nerrors += Verify(__FILE__, __LINE__, \"     -2.3420e-22\",\n\t\t    \"%16.4e\", -2.342E-22);\n  nerrors += Verify(__FILE__, __LINE__, \"      2.3420e-02\",\n\t\t    \"% 16.4e\", 2.342E-02);\n  nerrors += Verify(__FILE__, __LINE__, \" 2.3420e-02\",\n\t\t    \"% 1.4e\", 2.342E-02);\n  nerrors += Verify(__FILE__, __LINE__, \"3.141000E-44\",\n\t\t    \"%E\", 3.141e-44);\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t    \"%g\", 0.0);\n  nerrors += Verify(__FILE__, __LINE__, \"-0\",\n\t\t    \"%g\", trio_nzero());\n  nerrors += Verify(__FILE__, __LINE__, \"3141.5\",\n\t\t    \"%g\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"3.1415E-06\",\n\t\t    \"%G\", 3.1415e-6);\n  nerrors += Verify(__FILE__, __LINE__, \"+3141.000000\",\n\t\t    \"%+f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"-3141.000000\",\n\t\t    \"%+f\", -3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0.333333\",\n\t\t    \"%f\", 1.0/3.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0.666667\",\n\t\t    \"%f\", 2.0/3.0);\n  /* Beyond accuracy */\n  nerrors += Verify(__FILE__, __LINE__, \"0.000000\",\n\t\t    \"%f\", 1.234567890123456789e-20);\n# if defined(TRIO_BREESE)\n  nerrors += Verify(__FILE__, __LINE__, \"1.3999999999999999111821580299875\",\n\t\t    \"%.32g\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.39999999999999991118215802998748\",\n\t\t    \"%.32f\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.3999999999999999111821580300\",\n\t\t    \"%.28f\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.399999999999999911182158\",\n\t\t    \"%.24f\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.39999999999999991\",\n\t\t    \"%.17f\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.40000000000000\",\n\t\t    \"%.14f\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"39413.800000000002910383045673370361\",\n\t\t    \"%.30f\", 39413.80);\n# endif\n  /* 2^-1 + 2^-15 */\n  nerrors += Verify(__FILE__, __LINE__, \"0.500030517578125\",\n\t\t    \"%.*g\", DBL_DIG + 10, 0.500030517578125);\n  /* Double decimal point */\n  nerrors += Verify(__FILE__, __LINE__, \"3141\",\n\t\t    \"%.0f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3142\",\n\t\t    \"%.0f\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"3141\",\n\t\t    \"%.f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"12\",\n\t\t    \"%.f\", 12.34);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.000\",\n\t\t    \"%.3f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.000000\",\n\t\t    \"%#f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0.0000\",\n\t\t    \"%#.4f\", 0.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0.000\",\n\t\t    \"%#.4g\", 0.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0.001000\",\n\t\t    \"%#.4g\", 1e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.0000\",\n\t\t    \"%#.4f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.\",\n\t\t    \"%#.0f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3141.\",\n\t\t    \"%#.f\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"11.0000\",\n\t\t    \"%#.4f\", 11.0);\n  nerrors += Verify(__FILE__, __LINE__, \"100.00\",\n\t\t    \"%.2f\", 99.9999);\n  nerrors += Verify(__FILE__, __LINE__, \"3e+03\",\n\t\t    \"%.e\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"3.e+03\",\n\t\t    \"%#.e\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"1.23457e+06\",\n\t\t    \"%g\", 1234567.0);\n  nerrors += Verify(__FILE__, __LINE__, \"1e+02\",\n\t\t    \"%.2g\", 99.9999);\n  nerrors += Verify(__FILE__, __LINE__, \"1.0e+02\",\n\t\t    \"%#.2g\", 99.9999);\n  nerrors += Verify(__FILE__, __LINE__, \"0.123\",\n\t\t    \"%0g\", 0.123);\n  nerrors += Verify(__FILE__, __LINE__, \"1.00e+00\",\n\t\t    \"%.2e\", 0.9999);\n  nerrors += Verify(__FILE__, __LINE__, \"1\",\n\t\t    \"%.2g\", 0.9999);\n  nerrors += Verify(__FILE__, __LINE__, \"2\",\n\t\t    \"%.0g\", 1.5);\n  nerrors += Verify(__FILE__, __LINE__, \"2\",\n\t\t    \"%.g\", 1.5);\n  nerrors += Verify(__FILE__, __LINE__, \"0.01\",\n\t\t    \"%.2g\", 0.01);\n  nerrors += Verify(__FILE__, __LINE__, \"0.010\",\n\t\t    \"%#.2g\", 0.01);\n  nerrors += Verify(__FILE__, __LINE__, \"1e-04\",\n\t\t    \"%5.g\", 0.999999e-4);\n  /* Double width and precision */\n  nerrors += Verify(__FILE__, __LINE__, \"      1e-05\",\n\t\t    \"%11.5g\", 1e-5);\n  nerrors += Verify(__FILE__, __LINE__, \"     0.0001\",\n\t\t    \"%11.5g\", 1e-4);\n  nerrors += Verify(__FILE__, __LINE__, \"      0.001\",\n\t\t    \"%11.5g\", 1e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"       0.01\",\n\t\t    \"%11.5g\", 1e-2);\n  nerrors += Verify(__FILE__, __LINE__, \"        0.1\",\n\t\t    \"%11.5g\", 1e-1);\n  nerrors += Verify(__FILE__, __LINE__, \"          1\",\n\t\t    \"%11.5g\", 1e0);\n  nerrors += Verify(__FILE__, __LINE__, \"         10\",\n\t\t    \"%11.5g\", 1e1);\n  nerrors += Verify(__FILE__, __LINE__, \"        100\",\n\t\t    \"%11.5g\", 1e2);\n  nerrors += Verify(__FILE__, __LINE__, \"       1000\",\n\t\t    \"%11.5g\", 1e3);\n  nerrors += Verify(__FILE__, __LINE__, \"      10000\",\n\t\t    \"%11.5g\", 1e4);\n  nerrors += Verify(__FILE__, __LINE__, \"      1e+05\",\n\t\t    \"%11.5g\", 1e5);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e-05\",\n\t\t    \"%11.2g\", 0.99e-4);\n  nerrors += Verify(__FILE__, __LINE__, \"    0.00099\",\n\t\t    \"%11.2g\", 0.99e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"     0.0099\",\n\t\t    \"%11.2g\", 0.99e-2);\n  nerrors += Verify(__FILE__, __LINE__, \"      0.099\",\n\t\t    \"%11.2g\", 0.99e-1);\n  nerrors += Verify(__FILE__, __LINE__, \"       0.99\",\n\t\t    \"%11.2g\", 0.99e0);\n  nerrors += Verify(__FILE__, __LINE__, \"        9.9\",\n\t\t    \"%11.2g\", 0.99e1);\n  nerrors += Verify(__FILE__, __LINE__, \"         99\",\n\t\t    \"%11.2g\", 0.99e2);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+02\",\n\t\t    \"%11.2g\", 0.99e3);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+03\",\n\t\t    \"%11.2g\", 0.99e4);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+04\",\n\t\t    \"%11.2g\", 0.99e5);\n  /* Double width, precision, and alternative */\n  nerrors += Verify(__FILE__, __LINE__, \" 1.0000e-05\",\n\t\t    \"%#11.5g\", 1e-5);\n  nerrors += Verify(__FILE__, __LINE__, \" 0.00010000\",\n\t\t    \"%#11.5g\", 1e-4);\n  nerrors += Verify(__FILE__, __LINE__, \"  0.0010000\",\n\t\t    \"%#11.5g\", 1e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"  0.0010000\",\n\t\t    \"%#11.5g\", 0.999999e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"   0.010000\",\n\t\t    \"%#11.5g\", 1e-2);\n  nerrors += Verify(__FILE__, __LINE__, \"   0.010000\",\n\t\t    \"%#11.5g\", 0.999999e-2);\n  nerrors += Verify(__FILE__, __LINE__, \"    0.10000\",\n\t\t    \"%#11.5g\", 1e-1);\n  nerrors += Verify(__FILE__, __LINE__, \"    0.10000\",\n\t\t    \"%#11.5g\", 0.999999e-1);\n  nerrors += Verify(__FILE__, __LINE__, \"     1.0000\",\n\t\t    \"%#11.5g\", 1e0);\n  nerrors += Verify(__FILE__, __LINE__, \"     1.0000\",\n\t\t    \"%#11.5g\", 0.999999e0);\n  nerrors += Verify(__FILE__, __LINE__, \"     10.000\",\n\t\t    \"%#11.5g\", 1e1);\n  nerrors += Verify(__FILE__, __LINE__, \"     100.00\",\n\t\t    \"%#11.5g\", 1e2);\n  nerrors += Verify(__FILE__, __LINE__, \"     1000.0\",\n\t\t    \"%#11.5g\", 1e3);\n  nerrors += Verify(__FILE__, __LINE__, \"     10000.\",\n\t\t    \"%#11.5g\", 1e4);\n  nerrors += Verify(__FILE__, __LINE__, \" 1.0000e+05\",\n\t\t    \"%#11.5g\", 1e5);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e-05\",\n\t\t    \"%#11.2g\", 0.99e-4);\n  nerrors += Verify(__FILE__, __LINE__, \"    0.00099\",\n\t\t    \"%#11.2g\", 0.99e-3);\n  nerrors += Verify(__FILE__, __LINE__, \"     0.0099\",\n\t\t    \"%#11.2g\", 0.99e-2);\n  nerrors += Verify(__FILE__, __LINE__, \"      0.099\",\n\t\t    \"%#11.2g\", 0.99e-1);\n  nerrors += Verify(__FILE__, __LINE__, \"       0.99\",\n\t\t    \"%#11.2g\", 0.99e0);\n  nerrors += Verify(__FILE__, __LINE__, \"        9.9\",\n\t\t    \"%#11.2g\", 0.99e1);\n  nerrors += Verify(__FILE__, __LINE__, \"        99.\",\n\t\t    \"%#11.2g\", 0.99e2);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+02\",\n\t\t    \"%#11.2g\", 0.99e3);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+03\",\n\t\t    \"%#11.2g\", 0.99e4);\n  nerrors += Verify(__FILE__, __LINE__, \"    9.9e+04\",\n\t\t    \"%#11.2g\", 0.99e5);\n  /* Double width, precision, and zero padding */\n  nerrors += Verify(__FILE__, __LINE__, \"00003.141500e+03\",\n\t\t    \"%016e\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"    3.141500e+03\",\n\t\t    \"%16e\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"3.141500e+03    \",\n\t\t    \"%-16e\", 3141.5);\n  nerrors += Verify(__FILE__, __LINE__, \"03.142e+03\",\n\t\t    \"%010.3e\", 3141.5);\n#if !defined(TRIO_COMPILER_ANCIENT)\n  /* Long double */\n  nerrors += Verify(__FILE__, __LINE__, \"1.400000\",\n\t\t    \"%Lf\", 1.4L);\n#endif\n  \n  /* Special cases */\n  nerrors += Verify(__FILE__, __LINE__, \"1.00\",\n\t\t    \"%.2f\", 0.999);\n  nerrors += Verify(__FILE__, __LINE__, \"100\",\n\t\t    \"%.0f\", 99.9);\n  nerrors += Verify(__FILE__, __LINE__, \"inf\",\n\t\t    \"%f\", trio_pinf());\n  nerrors += Verify(__FILE__, __LINE__, \"-inf\",\n\t\t    \"%f\", trio_ninf());\n  nerrors += Verify(__FILE__, __LINE__, \"INF\",\n\t\t    \"%F\", trio_pinf());\n  nerrors += Verify(__FILE__, __LINE__, \"-INF\",\n\t\t    \"%F\", trio_ninf());\n  /* May fail if NaN is unsupported */\n  nerrors += Verify(__FILE__, __LINE__, \"nan\",\n\t\t    \"%f\", trio_nan());\n  nerrors += Verify(__FILE__, __LINE__, \"NAN\",\n\t\t    \"%F\", trio_nan());\n  \n# if TRIO_FEATURE_HEXFLOAT\n  nerrors += Verify(__FILE__, __LINE__, \"0x2.ap+4\",\n\t\t    \"%a\", 42.0);\n  nerrors += Verify(__FILE__, __LINE__, \"-0x2.ap+4\",\n\t\t    \"%a\", -42.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0x1.8p+0\",\n\t\t    \"%a\", 1.5);\n  nerrors += Verify(__FILE__, __LINE__, \"0x1.6666666666666p+0\",\n\t\t    \"%a\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"0xc.45p+8\",\n\t\t    \"%a\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0XC.45P+8\",\n\t\t    \"%A\", 3141.0);\n  nerrors += Verify(__FILE__, __LINE__, \"0xb.351c434a98fa8p-148\",\n\t\t    \"%a\", 3.141e-44);\n# endif\n  \n#endif /* TRIO_FEATURE_FLOAT */\n  \n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\n#if TRIO_EXTENSION\nint number_writer(void *ref)\n{\n  const char *format;\n  int *data;\n\n  format = trio_get_format(ref);\n  if ((format) && trio_equal(format, \"integer\"))\n    {\n      data = trio_get_argument(ref);\n      if (data)\n\t{\n\t  trio_print_int(ref, *data);\n\t}\n    }\n  return 0;\n}\n\n#endif\n\nint\nVerifyFormattingUserDefined(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if TRIO_EXTENSION\n  void *number_handle;\n  int integer = 123;\n\n  number_handle = trio_register(number_writer, \"number\");\n\n  /* Old style */\n  nerrors += Verify(__FILE__, __LINE__, \"123\",\n\t\t    \"%<number:integer>\", &integer);\n\n  /* New style */\n  nerrors += Verify(__FILE__, __LINE__, \"123\",\n\t\t    \"$<number:integer|%p>\", &integer);\n  nerrors += Verify(__FILE__, __LINE__, \"123\",\n\t\t    \"$<integer|%p%p>\", number_handle, &integer);\n  nerrors += Verify(__FILE__, __LINE__, \"$<integer|123\",\n\t\t    \"$<integer|%d\", 123);\n  nerrors += Verify(__FILE__, __LINE__, \"$integer|123>\",\n\t\t    \"$integer|%d>\", 123);\n\n  trio_unregister(number_handle);\n#endif\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyFormattingRegression(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n#if TRIO_FEATURE_FLOAT\n  /* 0.6 was formatted as 0.600000e+00 */\n  nerrors += Verify(__FILE__, __LINE__, \"5.000000e-01\",\n\t\t    \"%e\", 0.5);\n  nerrors += Verify(__FILE__, __LINE__, \"6.000000e-01\",\n\t\t    \"%e\", 0.6);\n\n  /* Calculate the correct number of fractional digits while rounding */\n  nerrors += Verify(__FILE__, __LINE__, \"7654321.0\",\n\t\t    \"%#.8g\", 7654320.99);\n#endif\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyFormattingArgarray(TRIO_NOARGS)\n{\n  int nerrors = 0;\n  int rc;\n  trio_pointer_t argarray[4];\n  int value = 42;\n  double number = 123.456;\n  float smallNumber = 123.456;\n\n  argarray[0] = &value;\n  nerrors += VerifyV(__FILE__, __LINE__, \"42\",\n\t\t     \"%d\", argarray);\n  argarray[0] = \"my string\";\n  nerrors += VerifyV(__FILE__, __LINE__, \"my string\",\n\t\t     \"%s\", argarray);\n  argarray[0] = &number;\n  argarray[1] = &smallNumber;\n  nerrors += VerifyV(__FILE__, __LINE__, \"123.456000 123.456001\",\n\t\t     \"%f %hf\", argarray);\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyFormatting(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER\n  char buffer[256];\n#endif\n\n  nerrors += VerifyFormattingStrings();\n  nerrors += VerifyFormattingIntegers();\n  nerrors += VerifyFormattingFloats();\n  nerrors += VerifyFormattingRegression();\n  nerrors += VerifyFormattingUserDefined();\n  nerrors += VerifyFormattingArgarray();\n\n  /* Pointer */\n  if (sizeof(void *) == 4)\n    {\n      nerrors += Verify(__FILE__, __LINE__, \"Pointer 0x01234567\",\n\t\t\t\"Pointer %p\", 0x1234567);\n    }\n#if defined(TRIO_COMPILER_SUPPORTS_LL)\n  else if (sizeof(void *) == 8)\n    {\n      nerrors += Verify(__FILE__, __LINE__, \"Pointer 0x0123456789012345\",\n\t\t\t\"Pointer %p\", 0x123456789012345LL);\n    }\n#endif\n  /* Nil pointer */\n  nerrors += Verify(__FILE__, __LINE__, \"Pointer (nil)\",\n\t\t   \"Pointer %p\", NULL);\n  \n  /* Char width alignment */\n  nerrors += Verify(__FILE__, __LINE__, \"Char X   .\",\n\t \"Char %-4c.\", 'X');\n  /* String width / precision */\n  nerrors += Verify(__FILE__, __LINE__, \" testing\",\n\t\t    \"%8s\", \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \"testing \",\n\t\t    \"%-8s\", \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \" testing\",\n\t\t    \"%*s\", 8, \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \"testing \",\n\t\t    \"%*s\", -8, \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \"test\",\n\t\t    \"%.4s\", \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \"test\",\n\t\t    \"%.*s\", 4, \"testing\");\n  nerrors += Verify(__FILE__, __LINE__, \"testing\",\n\t\t    \"%.*s\", -4, \"testing\");\n#if TRIO_FEATURE_POSITIONAL\n  /* Positional */\n  nerrors += Verify(__FILE__, __LINE__, \"222 111\",\n\t\t    \"%2$s %1$s\", \"111\", \"222\");\n  nerrors += Verify(__FILE__, __LINE__, \"123456    12345 0001234  00123\",\n\t\t    \"%4$d %3$*8$d %2$.*7$d %1$*6$.*5$d\",\n\t\t    123, 1234, 12345, 123456, 5, 6, 7, 8);\n#endif\n  \n#if TRIO_FEATURE_SIZE_T_UPPER\n  nerrors += Verify(__FILE__, __LINE__, \"256\",\n\t\t    \"%Zd\", sizeof(buffer));\n#endif\n\n#if TRIO_FEATURE_ERRNO\n  errno = EINTR;\n# if defined(TRIO_PLATFORM_LYNX)\n#  if defined(PREDEF_STANDARD_POSIX_1996)\n  nerrors += Verify(__FILE__, __LINE__, \"Interrupted system call \",\n\t\t    \"%m\");\n#  else\n  nerrors += Verify(__FILE__, __LINE__, \"System call interrupted\",\n\t\t    \"%m\");\n#  endif\n# else\n  nerrors += Verify(__FILE__, __LINE__, \"Interrupted system call\",\n\t\t    \"%m\");\n# endif\n#endif\n  \n#if TRIO_FEATURE_QUAD\n# if defined(TRIO_COMPILER_SUPPORTS_LL)\n  /* This may fail if the preprocessor does not recognize LL */\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%qd\", 42LL);\n# endif\n#endif\n\n#if TRIO_FEATURE_SIZE_T\n  nerrors += Verify(__FILE__, __LINE__, \"256\",\n\t\t    \"%zd\", sizeof(buffer));\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%td\", 42);\n#endif\n#if TRIO_FEATURE_INTMAX_T\n# if defined(TRIO_COMPILER_SUPPORTS_LL)\n  /* Some compilers may not handle the LL suffix correctly */\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%jd\", 42LL);\n# endif\n#endif\n\n#if TRIO_FEATURE_WIDECHAR\n  nerrors += Verify(__FILE__, __LINE__, \"Hello World\",\n\t\t    \"%ls\", L\"Hello World\");\n  nerrors += Verify(__FILE__, __LINE__, \"\\\\aHello World\",\n\t\t    \"%#ls\", L\"\\aHello World\");\n  nerrors += Verify(__FILE__, __LINE__, \"A\",\n\t\t    \"%lc\", L'A');\n  nerrors += Verify(__FILE__, __LINE__, \"\\\\a\",\n\t\t    \"%#lc\", L'\\a');\n#endif\n\n#if TRIO_FEATURE_FIXED_SIZE\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%I8d\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"ffffffff\",\n\t\t    \"%I16x\", -1);\n#endif\n  \n#if TRIO_EXTENSION\n  nerrors += Verify(__FILE__, __LINE__, \"  42   86\",\n\t\t    \"%!4d %d\", 42, 86);\n  nerrors += Verify(__FILE__, __LINE__, \"0042 0086\",\n\t\t    \"%!04d %d\", 42, 86);\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%&d\", sizeof(long), 42L);\n  /* Non-printable string */\n  nerrors += Verify(__FILE__, __LINE__, \"NonPrintable \\\\x01 \\\\a \\\\\\\\\",\n\t\t    \"NonPrintable %#s\", \"\\01 \\07 \\\\\");\n  nerrors += Verify(__FILE__, __LINE__, \"\\\\a \\\\b \\\\t \\\\n \\\\v \\\\f \\\\r\",\n\t\t    \"%#s\", \"\\007 \\010 \\011 \\012 \\013 \\014 \\015\");\n  /* Quote flag */\n  nerrors += Verify(__FILE__, __LINE__, \"Another \\\"quoted\\\" string\",\n\t\t   \"Another %'s string\", \"quoted\");\n  /* Integer base */\n  nerrors += Verify(__FILE__, __LINE__, \"Number 42 == 1120 (base 3)\",\n\t\t    \"Number %d == %..3i (base 3)\", 42, 42);\n  /* Integer base (specifier base must be used instead of base modifier) */\n  nerrors += Verify(__FILE__, __LINE__, \"42\",\n\t\t    \"%..3d\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"52\",\n\t\t    \"%..3o\", 42);\n  nerrors += Verify(__FILE__, __LINE__, \"2a\",\n\t\t    \"%..3x\", 42);\n  /* Integer thousand separator */\n  nerrors += Verify(__FILE__, __LINE__, \"Number 100\",\n\t\t    \"Number %'d\", 100);\n  nerrors += Verify(__FILE__, __LINE__, \"Number 1,000,000\",\n\t\t    \"Number %'d\", 1000000);\n# if TRIO_FEATURE_FLOAT\n  /* Float thousand separator */\n  nerrors += Verify(__FILE__, __LINE__, \"31,415.200000\",\n\t\t    \"%'f\", 31415.2);\n  nerrors += Verify(__FILE__, __LINE__, \"1,000,000.000000\",\n\t\t    \"%'f\", 1000000.0);\n  /* Rounding modifier */\n  nerrors += Verify(__FILE__, __LINE__, \"1.4\",\n\t\t    \"%.32Rf\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"1.4\",\n\t\t    \"%.17Rf\", 1.4);\n  nerrors += Verify(__FILE__, __LINE__, \"39413.8\",\n\t\t    \"%.30Rf\", 39413.80);\n#  if !defined(TRIO_COMPILER_ANCIENT) && !defined(TRIO_DOUBLE_DOUBLE)\n  /* Long double */\n  nerrors += Verify(__FILE__, __LINE__, \"1.4\",\n\t\t    \"%RLf\", 1.4L);\n  nerrors += Verify(__FILE__, __LINE__, \"1.4\",\n\t\t    \"%.30RLf\", 1.4L);\n#  endif\n# endif\n#endif\n\n#if defined(TRIO_BREESE)\n  /*\n   * These results depends on issues beyond our control. For example,\n   * the accuracy of floating-point numbers depends on the underlying\n   * floating-point hardware (e.g. whether IEEE 754 double or extended-\n   * double format is used).\n   *\n   * These tests are therefore not part of the normal regression test,\n   * but we keep them here for development purposes.\n   */\n  nerrors += Verify(__FILE__, __LINE__, \"123456789012345680868.000000\",\n\t\t    \"%f\", 1.234567890123456789e20);\n  nerrors += Verify(__FILE__, __LINE__, \"1.23456789012345677901e-20\",\n\t\t    \"%.20e\", 1.2345678901234567e-20);\n  nerrors += Verify(__FILE__, __LINE__, \"0.666666666666666629659233\",\n\t\t    \"%.*g\", DBL_DIG + 10, 2.0/3.0);\n  nerrors += Verify(__FILE__, __LINE__, \"123456789012345700000\",\n\t\t    \"%Rf\", 1.234567890123456789e20);\n# if !defined(TRIO_COMPILER_ANCIENT)\n  nerrors += Verify(__FILE__, __LINE__, \"0.666666666666666667\",\n\t\t    \"%RLf\", (2.0L/3.0L));\n  nerrors += Verify(__FILE__, __LINE__, \"0.666666666666666667\",\n\t\t    \"%.30RLf\", (2.0L/3.0L));\n# endif\n#endif\n  \n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyErrors(TRIO_NOARGS)\n{\n  char buffer[512];\n  int rc;\n  int nerrors = 0;\n  \n  /* Error: Invalid argument 1 */\n  rc = trio_snprintf(buffer, sizeof(buffer), \"%d %r\", 42, \"text\");\n#if TRIO_FEATURE_ERRORCODE\n# if TRIO_FEATURE_STRERR\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d (%s), Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_NAME(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2 (Invalid argument), Pos = 5\",\n\t\t    \"%s\", buffer);\n# else\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d, Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2, Pos = 5\",\n\t\t    \"%s\", buffer);\n# endif\n#else\n  nerrors += (rc != -1);\n#endif\n  \n  /* Error: Invalid argument 2 */\n  rc = trio_snprintf(buffer, sizeof(buffer), \"%#\");\n#if TRIO_FEATURE_ERRORCODE\n# if TRIO_FEATURE_STRERR\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d (%s), Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_NAME(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2 (Invalid argument), Pos = 3\",\n\t\t    \"%s\", buffer);\n# else\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d, Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2, Pos = 3\",\n\t\t    \"%s\", buffer);\n# endif\n#else\n  nerrors += (rc != -1);\n#endif\n  \n  /* Error: Invalid argument 3 */\n  rc = trio_snprintf(buffer, sizeof(buffer), \"%hhhd\", 42);\n#if TRIO_FEATURE_ERRORCODE\n# if TRIO_FEATURE_STRERR\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d (%s), Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_NAME(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2 (Invalid argument), Pos = 4\",\n\t\t    \"%s\", buffer);\n# else\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d, Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2, Pos = 4\",\n\t\t    \"%s\", buffer);\n# endif\n#else\n  nerrors += (rc != -1);\n#endif\n  \n  /* Error: Double reference */\n  rc = trio_snprintf(buffer, sizeof(buffer), \"hello %1$d %1$d\", 31, 32);\n#if TRIO_FEATURE_ERRORCODE\n# if TRIO_FEATURE_STRERR\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d (%s), Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_NAME(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n#  if TRIO_UNIX98\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 4 (Double reference), Pos = 0\",\n\t\t    \"%s\", buffer);\n#  else\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2 (Invalid argument), Pos = 9\",\n\t\t    \"%s\", buffer);\n#  endif\n# else\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d, Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n#  if TRIO_UNIX98\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 4, Pos = 0\",\n\t\t    \"%s\", buffer);\n#  else\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2, Pos = 9\",\n\t\t    \"%s\", buffer);\n#  endif\n# endif\n#else\n  nerrors += (rc != -1);\n#endif\n  \n  /* Error: Reference gap */\n  rc = trio_snprintf(buffer, sizeof(buffer), \"%3$d %1$d\", 31, 32, 33);\n#if TRIO_FEATURE_ERRORCODE\n# if TRIO_FEATURE_STRERR\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d (%s), Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_NAME(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n#  if TRIO_UNIX98\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 5 (Reference gap), Pos = 1\",\n\t\t    \"%s\", buffer);\n#  else\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2 (Invalid argument), Pos = 3\",\n\t\t    \"%s\", buffer);\n#  endif\n# else\n  trio_snprintf(buffer, sizeof(buffer), \"Err = %d, Pos = %d\",\n\t\tTRIO_ERROR_CODE(rc),\n\t\tTRIO_ERROR_POSITION(rc));\n#  if TRIO_UNIX98\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 5, Pos = 1\",\n\t\t    \"%s\", buffer);\n#  else\n  nerrors += Verify(__FILE__, __LINE__, \"Err = 2, Pos = 3\",\n\t\t    \"%s\", buffer);\n#  endif\n# endif\n#else\n  nerrors += (rc != -1);\n#endif\n  \n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\n#if TRIO_FEATURE_SCANF\nint\nVerifyScanningOneInteger\nTRIO_ARGS5((file, line, expected, format, original),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *format,\n\t   int original)\n{\n  int number;\n  char data[512];\n  \n  trio_snprintf(data, sizeof(data), format, original);\n  trio_sscanf(data, format, &number);\n  return Verify(file, line, expected, format, number);\n}\n\nint\nVerifyScanningIntegers(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"42\",\n\t\t\t\t      \"%i\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"42\",\n\t\t\t\t      \"%d\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"-42\",\n\t\t\t\t      \"%d\", -42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"2147483647\",\n\t\t\t\t      \"%d\", 2147483647);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"42\",\n\t\t\t\t      \"%u\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"2a\",\n\t\t\t\t      \"%x\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"52\",\n\t\t\t\t      \"%o\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"101010\",\n\t\t\t\t      \"%..2i\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"0x2a\",\n\t\t\t\t      \"%#x\", 42);\n  nerrors += VerifyScanningOneInteger(__FILE__, __LINE__, \"052\",\n\t\t\t\t      \"%#o\", 42);\n\n  return nerrors;\n}\n#endif\n\n/*************************************************************************\n *\n */\n#if TRIO_FEATURE_SCANF\nint\nVerifyScanningOneFloat\nTRIO_ARGS5((file, line, expected, format, original),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *format,\n\t   double original)\n{\n  float number;\n  char data[512];\n  \n  trio_snprintf(data, sizeof(data), format, original);\n  trio_sscanf(data, format, &number);\n  return Verify(file, line, expected, format, number);\n}\n\nint\nVerifyScanningOneDouble\nTRIO_ARGS5((file, line, expected, format, original),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *format,\n\t   double original)\n{\n  double number;\n  char data[512];\n  \n  trio_snprintf(data, sizeof(data), format, original);\n  trio_sscanf(data, format, &number);\n  return Verify(file, line, expected, format, number);\n}\n\nint\nVerifyScanningFloats(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n#if TRIO_FEATURE_FLOAT\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"42.000000\",\n\t\t\t\t      \"%f\", 42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"-42.000000\",\n\t\t\t\t      \"%f\", -42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"4.200000e+01\",\n\t\t\t\t      \"%e\", 42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"4.200000E+01\",\n\t\t\t\t      \"%E\", 42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"42\",\n\t\t\t\t      \"%g\", 42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.23457e+06\",\n\t\t\t\t      \"%g\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.23457e-06\",\n\t\t\t\t      \"%g\", 1.234567e-6);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.23457E+06\",\n\t\t\t\t      \"%G\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.234567e+06\",\n\t\t\t\t      \"%12e\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.234500e+00\",\n\t\t\t\t      \"%6e\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.234567e+06\",\n\t\t\t\t      \"%.6e\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.2345670000e+06\",\n\t\t\t\t      \"%.10e\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1.23457e+06\",\n\t\t\t\t      \"%.6g\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"1234567\",\n\t\t\t\t      \"%.10g\", 1234567.0);\n# if TRIO_FEATURE_HEXFLOAT\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"0x2.ap+4\",\n\t\t\t\t      \"%a\", 42.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"0x1.2d687p+20\",\n\t\t\t\t      \"%a\", 1234567.0);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"0X1.2D687P+20\",\n\t\t\t\t      \"%A\", 1234567.0);\n# endif\n  nerrors += VerifyScanningOneDouble(__FILE__, __LINE__, \"1.79769e+308\",\n\t\t\t\t      \"%lg\", 1.79769e+308);\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"nan\",\n\t\t\t\t      \"%f\", trio_nan());\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"NAN\",\n\t\t\t\t      \"%F\", trio_nan());\n  nerrors += VerifyScanningOneFloat(__FILE__, __LINE__, \"-inf\",\n\t\t\t\t      \"%f\", trio_ninf());\n#endif\n  \n  return nerrors;\n}\n#endif\n\n/*************************************************************************\n *\n */\n#if TRIO_FEATURE_SCANF\nint\nVerifyScanningOneString\nTRIO_ARGS5((file, line, expected, format, original),\n\t   TRIO_CONST char *file,\n\t   int line,\n\t   TRIO_CONST char *expected,\n\t   TRIO_CONST char *format,\n\t   char *original)\n{\n  char string[512];\n  char data[512];\n  \n  trio_snprintf(data, sizeof(data), \"%s\", original);\n  string[0] = 0;\n  trio_sscanf(data, format, string);\n  return Verify(file, line, expected, \"%s\", string);\n}\n\nint\nVerifyScanningStrings(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"\",\n\t\t\t\t     \"hello\", \"hello\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"\",\n\t\t\t\t     \"\", \"\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"hello\",\n\t\t\t\t     \"%s\", \"hello\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"hello\",\n\t\t\t\t     \"%s\", \"hello world\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"hello world\",\n\t\t\t\t     \"%[^\\n]\", \"hello world\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"(nil)\",\n\t\t\t\t     \"%s\", NULL);\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"hello\",\n\t\t\t\t     \"%20s\", \"hello\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"he\",\n\t\t\t\t     \"%2s\", \"hello\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"ab\",\n\t\t\t\t     \"%[ab]\", \"abcba\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"abcba\",\n\t\t\t\t     \"%[abc]\", \"abcba\");\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"abcba\",\n\t\t\t\t     \"%[a-c]\", \"abcba\");\n#if TRIO_EXTENSION\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"abcba\",\n\t\t\t\t     \"%[[:alpha:]]\", \"abcba\");\n#endif\n  nerrors += VerifyScanningOneString(__FILE__, __LINE__, \"ba\",\n\t\t\t\t     \"%*[ab]c%[^\\n]\", \"abcba\");\n\n  return nerrors;\n}\n#endif\n\n/*************************************************************************\n *\n */\n#if TRIO_FEATURE_SCANF\nint\nVerifyScanningRegression(TRIO_NOARGS)\n{\n  int nerrors = 0;\n  int rc;\n#if TRIO_FEATURE_FLOAT\n  int offset;\n  double dnumber;\n# if defined(TRIO_BREESE)\n  trio_long_double_t ldnumber;\n# endif\n#endif\n  long lnumber;\n  int number;\n  char ch;\n  char buffer[4096];\n  FILE *stream;\n\n#if TRIO_FEATURE_FLOAT\n  rc = trio_sscanf(\"1.5\", \"%lf%n\", &dnumber, &offset);\n  nerrors += Verify(__FILE__, __LINE__, \"1 3 1.500000\",\n\t\t    \"%d %d %f\", rc, offset, dnumber);\n#endif\n  rc = trio_sscanf(\"q 123\", \"%c%ld\", &ch, &lnumber);\n  nerrors += Verify(__FILE__, __LINE__, \"q 123\",\n\t\t    \"%c %ld\", ch, lnumber);\n  rc = trio_sscanf(\"abc\", \"%*s%n\", &number);\n  nerrors += Verify(__FILE__, __LINE__, \"0 3\",\n\t\t    \"%d %d\", rc, number);\n  rc = trio_sscanf(\"abc def\", \"%*s%n\", &number);\n  nerrors += Verify(__FILE__, __LINE__, \"0 3\",\n\t\t    \"%d %d\", rc, number);\n#if TRIO_FEATURE_FLOAT\n  rc = trio_sscanf(\"0.141882295971771490\", \"%lf\", &dnumber);\n  /* FIXME: Verify */\n#endif\n  number = 33;\n  rc = trio_sscanf(\"total 1\", \"total %d\", &number);\n  nerrors += Verify(__FILE__, __LINE__, \"1 1\",\n\t\t    \"%d %d\", rc, number);\n#if defined(TRIO_BREESE)\n# if TRIO_FEATURE_FLOAT\n  nerrors += Verify(__FILE__, __LINE__, \"1 0.141882295971771488\",\n\t\t    \"%d %.18f\", rc, dnumber);\n  rc = trio_sscanf(\"0.141882295971771490\", \"%Lf\", &ldnumber);\n  nerrors += Verify(__FILE__, __LINE__, \"1 0.141882295971771490\",\n\t\t    \"%d %.18Lf\", rc, ldnumber);\n# endif\n#endif\n#if TRIO_FEATURE_FLOAT\n  rc = trio_sscanf(\"1.e-6\", \"%lg\", &dnumber);\n  nerrors += Verify(__FILE__, __LINE__, \"1e-06\",\n\t\t    \"%g\", dnumber);\n  rc = trio_sscanf(\"1e-6\", \"%lg\", &dnumber);\n  nerrors += Verify(__FILE__, __LINE__, \"1e-06\",\n\t\t    \"%g\", dnumber);\n#endif\n\n  /* Do not overwrite result on matching error */\n  ch = 'a';\n  rc = trio_sscanf(\"0123456789\", \"%1[c]\", &ch);\n  nerrors += Verify(__FILE__, __LINE__, \"a\",\n\t\t    \"%c\", ch);\n\n  /* Scan plus prefix for unsigned integer */\n  rc = trio_sscanf(\"+42\", \"%u\", &number);\n  nerrors += Verify(__FILE__, __LINE__, \"1 42\",\n\t\t    \"%d %u\", rc, number);\n\n  /* Scan minus prefix even for unsigned integer */\n  rc = trio_sscanf(\"-42\", \"%u\", &number);\n  sprintf(buffer, \"1 %u\", -42U);\n  nerrors += Verify(__FILE__, __LINE__, buffer,\n\t\t    \"%d %u\", rc, number);\n\n  /* A scangroup match failure should not bind its argument,\n   * i.e., it shouldn't match the empty string. */\n  sprintf(buffer, \"SPQR\");\n  rc = trio_sscanf(\"asdf\", \"%[c]\", buffer);\n  nerrors += Verify(__FILE__, __LINE__, \"0 SPQR\",\n\t\t    \"%d %s\", rc, buffer);\n\n  /* Even whitespace scanning shouldn't try to read past EOF */\n  stream = tmpfile();\n  trio_fprintf(stream, \"\");\n  rewind(stream);\n  rc = trio_fscanf(stream, \" \");\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t    \"%d\", rc);\n  fclose(stream);\n\n  /* Idem, after a succesfull read */\n  stream = tmpfile();\n  trio_fprintf(stream, \"123\");\n  rewind(stream);\n  rc = trio_fscanf(stream, \"%i \", &number);\n  nerrors += Verify(__FILE__, __LINE__, \"1 123\",\n\t\t    \"%d %i\", rc, number);\n  fclose(stream);\n\n  /* The scanner should unget its read-ahead char */\n  stream = tmpfile();\n  trio_fprintf(stream, \"123\");\n  rewind(stream);\n  trio_fscanf(stream, \"%*c\");\n  trio_fscanf(stream, \"%c\", &ch);\n  nerrors += Verify(__FILE__, __LINE__, \"2\",\n\t\t    \"%c\", ch);\n  fclose(stream);\n\n  return nerrors;\n}\n#endif\n\n/*************************************************************************\n *\n */\nint\nVerifyScanning(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if TRIO_FEATURE_SCANF\n  nerrors += VerifyScanningIntegers();\n  nerrors += VerifyScanningFloats();\n  nerrors += VerifyScanningStrings();\n  nerrors += VerifyScanningRegression();\n#endif\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyStrings(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if !defined(TRIO_MINIMAL)\n  char buffer[512];\n#if TRIO_FEATURE_FLOAT\n  double dnumber;\n  float fnumber;\n#endif\n  char *end;\n\n  /* Comparison */\n  trio_copy(buffer, \"Find me now\");\n  if (trio_length(buffer) != sizeof(\"Find me now\") - 1) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_equal(buffer, \"Find me now\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_equal_case(buffer, \"Find me now\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_equal_case(buffer, \"FIND ME NOW\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_equal_max(buffer, sizeof(\"Find me\") - 1, \"Find ME\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_contains(buffer, \"me\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_contains(buffer, \"and me\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_substring(buffer, \"me\") == NULL) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_substring_max(buffer, 4, \"me\") != NULL) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_match(buffer, \"* me *\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_match_case(buffer, \"* ME *\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_index(buffer, 'n') == NULL) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_index(buffer, '_') != NULL) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_index_last(buffer, 'n') == NULL) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n\n  /* Append */\n  trio_copy(buffer, \"Find me now\");\n  if (!trio_append(buffer, \" and again\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_equal(buffer, \"Find me now and again\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_append_max(buffer, 0, \"should not appear\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (!trio_equal(buffer, \"Find me now and again\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  \n  /* To upper/lower */\n  trio_copy(buffer, \"Find me now\");\n  trio_upper(buffer);\n  if (!trio_equal_case(buffer, \"FIND ME NOW\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  trio_lower(buffer);\n  if (!trio_equal_case(buffer, \"find me now\")) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n\n#if TRIO_FEATURE_FLOAT\n  /* Double conversion */\n  trio_copy(buffer, \"3.1415\");\n  dnumber = trio_to_double(buffer, NULL);\n  if (!DOUBLE_EQUAL(dnumber, 3.1415)) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  fnumber = trio_to_float(buffer, NULL);\n  if (!FLOAT_EQUAL(fnumber, 3.1415)) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n#endif\n\n  /* Long conversion */\n  trio_copy(buffer, \"3.1415\");\n  if (trio_to_long(buffer, NULL, 10) != 3L) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  if (trio_to_long(buffer, NULL, 4) != 3L) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  trio_to_long(buffer, &end, 2);\n  if (end != buffer) {\n    nerrors++;\n    Report0(__FILE__, __LINE__);\n  }\n  \n#endif /* !defined(TRIO_MINIMAL) */\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyDynamicStrings(TRIO_NOARGS)\n{\n  int nerrors = 0;\n#if !defined(TRIO_MINIMAL)\n  trio_string_t *string;\n  const char no_terminate[5] = { 'h', 'e', 'l', 'l', 'o' };\n\n  string = trio_xstring_duplicate(\"Find me now\");\n  if (string == NULL) {\n    nerrors++;\n    goto error;\n  }\n  if (!trio_xstring_equal(string, \"FIND ME NOW\"))\n    nerrors++;\n  if (!trio_xstring_append(string, \" and again\") ||\n      !trio_xstring_equal(string, \"FIND ME NOW AND AGAIN\"))\n    nerrors++;\n  if (!trio_xstring_contains(string, \"me\"))\n    nerrors++;\n  if (trio_xstring_contains(string, \"ME\"))\n    nerrors++;\n  if (!trio_xstring_match(string, \"* me *\"))\n    nerrors++;\n  if (trio_xstring_match_case(string, \"* ME *\"))\n    nerrors++;\n  if (!trio_xstring_append_max(string, no_terminate, 5) ||\n      !trio_xstring_equal(string, \"FIND ME NOW AND AGAINhello\"))\n    nerrors++;\n  \n error:\n  if (string)\n    trio_string_destroy(string);\n  \n#endif /* !defined(TRIO_MINIMAL) */\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nVerifyNaN(TRIO_NOARGS)\n{\n  double ninf_number = trio_ninf();\n  double pinf_number = trio_pinf();\n  double nan_number = trio_nan();\n  int nerrors = 0;\n  \n  nerrors += Verify(__FILE__, __LINE__, \"-1\",\n\t\t    \"%d\", trio_isinf(ninf_number));\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t    \"%d\", trio_isinf(42.0));\n  nerrors += Verify(__FILE__, __LINE__, \"1\",\n\t\t    \"%d\", trio_isinf(pinf_number));\n  nerrors += Verify(__FILE__, __LINE__, \"1\",\n\t\t    \"%d\", trio_isnan(nan_number));\n  nerrors += Verify(__FILE__, __LINE__, \"0\",\n\t\t    \"%d\", trio_isnan(42.0));\n\n  return nerrors;\n}\n\n/*************************************************************************\n *\n */\nint\nmain(TRIO_NOARGS)\n{\n  int nerrors = 0;\n\n  printf(\"%s\\n\", rcsid);\n\n#if TRIO_EXTENSION\n  /* Override system locale settings */\n  trio_locale_set_decimal_point(\".\");\n  trio_locale_set_thousand_separator(\",\");\n  trio_locale_set_grouping(\"\\3\");\n#endif\n\n  printf(\"Verifying strings\\n\");\n  nerrors += VerifyStrings();\n  \n  printf(\"Verifying dynamic strings\\n\");\n  nerrors += VerifyDynamicStrings();\n\n  printf(\"Verifying special quantities\\n\");\n  nerrors += VerifyNaN();\n  \n  printf(\"Verifying formatting\\n\");\n  nerrors += VerifyFormatting();\n  \n  printf(\"Verifying scanning\\n\");\n  nerrors += VerifyScanning();\n  \n  printf(\"Verifying return values\\n\");\n  nerrors += VerifyErrors();\n  nerrors += VerifyReturnValues();\n  \n  printf(\"Verifying allocation\\n\");\n  nerrors += VerifyAllocate();\n\n  if (nerrors == 0)\n    printf(\"Regression test succeeded\\n\");\n  else\n    printf(\"Regression test failed in %d instance(s)\\n\", nerrors);\n  \n  return nerrors ? 1 : 0;\n}\n"
  },
  {
    "path": "src/trio/strio.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************\n *\n * This maintains backwards compatibility with the strio functions.\n *\n ************************************************************************/\n\n#ifndef TRIO_STRIO_H\n#define TRIO_STRIO_H\n\n#if !(defined(DEBUG) || defined(NDEBUG))\n# define NDEBUG\n#endif\n#include \"triostr.h\"\n\nenum {\n  STRIO_HASH_NONE = TRIO_HASH_NONE,\n  STRIO_HASH_PLAIN = TRIO_HASH_PLAIN,\n  STRIO_HASH_TWOSIGNED = TRIO_HASH_TWOSIGNED\n};\n\n#define StrAlloc(n) trio_create(n)\n#define StrAppend(x,y) ((void)trio_append((x),(y)),(x))\n#define StrAppendMax(x,n,y) ((void)trio_append_max((x),(n),(y)),(x))\n#define StrContains(x,y) trio_contains((x),(y))\n#define StrCopy(x,y) ((void)trio_copy((x),(y)),(x))\n#define StrCopyMax(x,n,y) ((void)trio_copy_max((x),(n),(y)),(x))\n#define StrDuplicate(x) trio_duplicate(x)\n#define StrDuplicateMax(x,n) trio_duplicate((x),(n))\n#define StrEqual(x,y) trio_equal((x),(y))\n#define StrEqualCase(x,y) trio_equal_case((x),(y))\n#define StrEqualCaseMax(x,n,y) trio_equal_case_max((x),(n),(y))\n#define StrEqualLocale(x,y) trio_equal_locale((x),(y))\n#define StrEqualMax(x,n,y) trio_equal_max((x),(n),(y))\n#define StrError(n) trio_error(n)\n#define StrFree(x) trio_destroy(x)\n#define StrFormat trio_sprintf\n#define StrFormatAlloc trio_aprintf\n#define StrFormatAppendMax trio_snprintfcat\n#define StrFormatDateMax(x,n,y,t) trio_format_date_max((x),(n),(y),(t))\n#define StrFormatMax trio_snprintf\n#define StrHash(x,n) trio_hash((x),(n))\n#define StrIndex(x,y) trio_index((x),(y))\n#define StrIndexLast(x,y) trio_index_last((x),(y))\n#define StrLength(x) trio_length((x))\n#define StrMatch(x,y) trio_match((x),(y))\n#define StrMatchCase(x,y) trio_match_case((x),(y))\n#define StrScan trio_sscanf\n#define StrSpanFunction(x,f) trio_span_function((x),(f))\n#define StrSubstring(x,y) trio_substring((x),(y))\n#define StrSubstringMax(x,n,y) trio_substring_max((x),(n),(y))\n#define StrToDouble(x,y) trio_to_double((x),(y))\n#define StrToFloat(x,y) trio_to_float((x),(y))\n#define StrTokenize(x,y) trio_tokenize((x),(y))\n#define StrToLong(x,y,n) trio_to_long((x),(y),(n))\n#define StrToUnsignedLong(x,y,n) trio_to_unsigned_long((x),(n),(y))\n#define StrToUpper(x) trio_upper(x)\n\n#endif /* TRIO_STRIO_H */\n"
  },
  {
    "path": "src/trio/trio.c",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 1998, 2009 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n *************************************************************************\n *\n * A note to trio contributors:\n *\n * Avoid heap allocation at all costs to ensure that the trio functions\n * are async-safe. The exceptions are the printf/fprintf functions, which\n * uses fputc, and the asprintf functions and the <alloc> modifier, which\n * by design are required to allocate form the heap.\n *\n ************************************************************************/\n\n/*\n * TODO:\n *  - Scan is probably too permissive about its modifiers.\n *  - C escapes in %#[] ?\n *  - Multibyte characters (done for format parsing, except scan groups)\n *  - Complex numbers? (C99 _Complex)\n *  - Boolean values? (C99 _Bool)\n *  - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used\n *    to print the mantissa, e.g. NaN(0xc000000000000000)\n *  - Should we support the GNU %a alloc modifier? GNU has an ugly hack\n *    for %a, because C99 used %a for other purposes. If specified as\n *    %as or %a[ it is interpreted as the alloc modifier, otherwise as\n *    the C99 hex-float. This means that you cannot scan %as as a hex-float\n *    immediately followed by an 's'.\n *  - Scanning of collating symbols.\n */\n\n/*************************************************************************\n * Trio include files\n */\n#include \"triodef.h\"\n#include \"trio.h\"\n#include \"triop.h\"\n\n#if defined(TRIO_EMBED_NAN)\n# define TRIO_PUBLIC_NAN static\n# if TRIO_FEATURE_FLOAT\n#  define TRIO_FUNC_NAN\n#  define TRIO_FUNC_NINF\n#  define TRIO_FUNC_PINF\n#  define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT\n#  define TRIO_FUNC_ISINF\n# endif\n#endif\n#include \"trionan.h\"\n\n#if defined(TRIO_EMBED_STRING)\n# define TRIO_PUBLIC_STRING static\n# define TRIO_FUNC_LENGTH\n# define TRIO_FUNC_LENGTH_MAX\n# define TRIO_FUNC_TO_LONG\n# if TRIO_FEATURE_LOCALE\n#  define TRIO_FUNC_COPY_MAX\n# endif\n# if TRIO_FEATURE_DYNAMICSTRING\n#  define TRIO_FUNC_XSTRING_DUPLICATE\n# endif\n# if TRIO_EXTENSION && TRIO_FEATURE_SCANF\n#  define TRIO_FUNC_EQUAL_LOCALE\n# endif\n# if TRIO_FEATURE_ERRNO\n#  define TRIO_FUNC_ERROR\n# endif\n# if TRIO_FEATURE_FLOAT && TRIO_FEATURE_SCANF\n#  define TRIO_FUNC_TO_DOUBLE\n# endif\n# if TRIO_FEATURE_DYNAMICSTRING\n#  define TRIO_FUNC_STRING_EXTRACT\n# endif\n# if TRIO_FEATURE_DYNAMICSTRING\n#  define TRIO_FUNC_STRING_TERMINATE\n# endif\n# if TRIO_FEATURE_USER_DEFINED\n#  define TRIO_FUNC_DUPLICATE\n# endif\n# if TRIO_FEATURE_DYNAMICSTRING\n#  define TRIO_FUNC_STRING_DESTROY\n# endif\n# if TRIO_FEATURE_USER_DEFINED\n#  define TRIO_FUNC_DESTROY\n# endif\n# if TRIO_FEATURE_USER_DEFINED || (TRIO_FEATURE_FLOAT && TRIO_FEATURE_SCANF)\n#  define TRIO_FUNC_EQUAL\n# endif\n# if TRIO_FEATURE_USER_DEFINED || TRIO_FEATURE_SCANF\n#  define TRIO_FUNC_EQUAL_CASE\n# endif\n# if (TRIO_EXTENSION && TRIO_FEATURE_SCANF)\n#  define TRIO_FUNC_EQUAL_MAX\n# endif\n# if TRIO_FEATURE_SCANF\n#  define TRIO_FUNC_TO_UPPER\n# endif\n# if TRIO_FEATURE_DYNAMICSTRING\n#  define TRIO_FUNC_XSTRING_APPEND_CHAR\n# endif\n#endif\n#include \"triostr.h\"\n\n/**************************************************************************\n *\n * Definitions\n *\n *************************************************************************/\n\n#include <limits.h>\n#if TRIO_FEATURE_FLOAT\n# include <math.h>\n# include <float.h>\n#endif\n\n#if defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) || defined(USE_MULTIBYTE) || TRIO_FEATURE_WIDECHAR\n# if !defined(TRIO_PLATFORM_WINCE)\n#  define TRIO_COMPILER_SUPPORTS_MULTIBYTE\n#  if !defined(MB_LEN_MAX)\n#   define MB_LEN_MAX 6\n#  endif\n# endif\n#endif\n\n#if (defined(TRIO_COMPILER_VISUALC) && (TRIO_COMPILER_VISUALC >= 1100)) || defined(TRIO_COMPILER_BORLAND)\n# define TRIO_COMPILER_SUPPORTS_VISUALC_INT\n#endif\n\n#if TRIO_FEATURE_FLOAT\n# if defined(PREDEF_STANDARD_C99) \\\n  || defined(PREDEF_STANDARD_UNIX03)\n#  if !defined(HAVE_FLOORL) && !defined(TRIO_NO_FLOORL)\n#   define HAVE_FLOORL\n#  endif\n#  if !defined(HAVE_CEILL) && !defined(TRIO_NO_CEILL)\n#   define HAVE_CEILL\n#  endif\n#  if !defined(HAVE_POWL) && !defined(TRIO_NO_POWL)\n#   define HAVE_POWL\n#  endif\n#  if !defined(HAVE_FMODL) && !defined(TRIO_NO_FMODL)\n#   define HAVE_FMODL\n#  endif\n#  if !defined(HAVE_LOG10L) && !defined(TRIO_NO_LOG10L)\n#   define HAVE_LOG10L\n#  endif\n# endif\n# if defined(TRIO_COMPILER_VISUALC)\n#  if defined(floorl)\n#   define HAVE_FLOORL\n#  endif\n#  if defined(ceill)\n#   define HAVE_CEILL\n#  endif\n#  if defined(powl)\n#   define HAVE_POWL\n#  endif\n#  if defined(fmodl)\n#   define HAVE_FMODL\n#  endif\n#  if defined(log10l)\n#   define HAVE_LOG10L\n#  endif\n# endif\n#endif\n\n/*************************************************************************\n * Generic definitions\n */\n\n#if !(defined(DEBUG) || defined(NDEBUG))\n# define NDEBUG\n#endif\n\n#include <assert.h>\n#include <ctype.h>\n#if defined(PREDEF_STANDARD_C99) && !defined(isascii)\n# define isascii(x) ((x) & 0x7F)\n#endif\n#if defined(TRIO_COMPILER_ANCIENT)\n# include <varargs.h>\n#else\n# include <stdarg.h>\n#endif\n#include <stddef.h>\n#if defined(TRIO_PLATFORM_WINCE)\nextern int errno;\n#else\n# include <errno.h>\n#endif\n\n#ifndef NULL\n# define NULL 0\n#endif\n#define NIL ((char)0)\n#ifndef FALSE\n# define FALSE (1 == 0)\n# define TRUE (! FALSE)\n#endif\n#define BOOLEAN_T int\n\n/* mincore() can be used for debugging purposes */\n#define VALID(x) (NULL != (x))\n\n#if TRIO_FEATURE_ERRORCODE\n  /*\n   * Encode the error code and the position. This is decoded\n   * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION.\n   */\n# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8)))\n#else\n# define TRIO_ERROR_RETURN(x,y) (-1)\n#endif\n\ntypedef unsigned long trio_flags_t;\n\n\n/*************************************************************************\n * Platform specific definitions\n */\n#if defined(TRIO_PLATFORM_UNIX)\n# include <unistd.h>\n# include <signal.h>\n# include <locale.h>\n# if !defined(TRIO_FEATURE_LOCALE)\n#  define USE_LOCALE\n# endif\n#endif /* TRIO_PLATFORM_UNIX */\n#if defined(TRIO_PLATFORM_VMS)\n# include <unistd.h>\n#endif\n#if defined(TRIO_PLATFORM_WIN32)\n# if defined(TRIO_PLATFORM_WINCE)\nint read(int handle, char *buffer, unsigned int length);\nint write(int handle, const char *buffer, unsigned int length);\n# else\n#  include <io.h>\n#  define read _read\n#  define write _write\n# endif\n#endif /* TRIO_PLATFORM_WIN32 */\n\n#if TRIO_FEATURE_WIDECHAR\n# if defined(PREDEF_STANDARD_C94)\n#  include <wchar.h>\n#  include <wctype.h>\ntypedef wchar_t trio_wchar_t;\ntypedef wint_t trio_wint_t;\n# else\ntypedef char trio_wchar_t;\ntypedef int trio_wint_t;\n#  define WCONST(x) L ## x\n#  define WEOF EOF\n#  define iswalnum(x) isalnum(x)\n#  define iswalpha(x) isalpha(x)\n#  define iswcntrl(x) iscntrl(x)\n#  define iswdigit(x) isdigit(x)\n#  define iswgraph(x) isgraph(x)\n#  define iswlower(x) islower(x)\n#  define iswprint(x) isprint(x)\n#  define iswpunct(x) ispunct(x)\n#  define iswspace(x) isspace(x)\n#  define iswupper(x) isupper(x)\n#  define iswxdigit(x) isxdigit(x)\n# endif\n#endif\n\n\n/*************************************************************************\n * Compiler dependent definitions\n */\n\n/* Support for long long */\n#ifndef __cplusplus\n# if !defined(USE_LONGLONG)\n#  if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__)\n#   define USE_LONGLONG\n#  else\n#   if defined(TRIO_COMPILER_SUNPRO)\n#    define USE_LONGLONG\n#   else\n#    if defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1400)\n#     define USE_LONGLONG\n#    else\n#     if defined(_LONG_LONG) || defined(_LONGLONG)\n#      define USE_LONGLONG\n#     endif\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\n/* The extra long numbers */\n#if defined(USE_LONGLONG)\ntypedef signed long long int trio_longlong_t;\ntypedef unsigned long long int trio_ulonglong_t;\n#else\n# if defined(TRIO_COMPILER_SUPPORTS_VISUALC_INT)\ntypedef signed __int64 trio_longlong_t;\ntypedef unsigned __int64 trio_ulonglong_t;\n# else\ntypedef TRIO_SIGNED long int trio_longlong_t;\ntypedef unsigned long int trio_ulonglong_t;\n# endif\n#endif\n\n/* Maximal and fixed integer types */\n#if defined(PREDEF_STANDARD_C99)\n# include <stdint.h>\ntypedef intmax_t trio_intmax_t;\ntypedef uintmax_t trio_uintmax_t;\ntypedef int8_t trio_int8_t;\ntypedef int16_t trio_int16_t;\ntypedef int32_t trio_int32_t;\ntypedef int64_t trio_int64_t;\n#else\n# if defined(PREDEF_STANDARD_UNIX98)\n#  include <inttypes.h>\ntypedef intmax_t trio_intmax_t;\ntypedef uintmax_t trio_uintmax_t;\ntypedef int8_t trio_int8_t;\ntypedef int16_t trio_int16_t;\ntypedef int32_t trio_int32_t;\ntypedef int64_t trio_int64_t;\n# else\n#  if defined(TRIO_COMPILER_SUPPORTS_VISUALC_INT)\ntypedef trio_longlong_t trio_intmax_t;\ntypedef trio_ulonglong_t trio_uintmax_t;\ntypedef __int8 trio_int8_t;\ntypedef __int16 trio_int16_t;\ntypedef __int32 trio_int32_t;\ntypedef __int64 trio_int64_t;\n#  else\ntypedef trio_longlong_t trio_intmax_t;\ntypedef trio_ulonglong_t trio_uintmax_t;\n#   if defined(TRIO_INT8_T)\ntypedef TRIO_INT8_T trio_int8_t;\n#   else\ntypedef TRIO_SIGNED char trio_int8_t;\n#   endif\n#   if defined(TRIO_INT16_T)\ntypedef TRIO_INT16_T trio_int16_t;\n#   else\ntypedef TRIO_SIGNED short trio_int16_t;\n#   endif\n#   if defined(TRIO_INT32_T)\ntypedef TRIO_INT32_T trio_int32_t;\n#   else\ntypedef TRIO_SIGNED int trio_int32_t;\n#   endif\n#   if defined(TRIO_INT64_T)\ntypedef TRIO_INT64_T trio_int64_t;\n#   else\ntypedef trio_longlong_t trio_int64_t;\n#   endif\n#  endif\n# endif\n#endif\n\n#if defined(HAVE_FLOORL)\n# define trio_floor(x) floorl((x))\n#else\n# define trio_floor(x) floor((double)(x))\n#endif\n\n#if defined(HAVE_CEILL)\n# define trio_ceil(x) ceill((x))\n#else\n# define trio_ceil(x) ceil((double)(x))\n#endif\n\n#if defined(HAVE_FMODL)\n# define trio_fmod(x,y) fmodl((x),(y))\n#else\n# define trio_fmod(x,y) fmod((double)(x),(double)(y))\n#endif\n\n#if defined(HAVE_POWL)\n# define trio_pow(x,y) powl((x),(y))\n#else\n# define trio_pow(x,y) pow((double)(x),(double)(y))\n#endif\n\n#if defined(HAVE_LOG10L)\n# define trio_log10(x) log10l((x))\n#else\n# define trio_log10(x) log10((double)(x))\n#endif\n\n#if TRIO_FEATURE_FLOAT\n# define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x))\n#endif\n\n/*************************************************************************\n * Internal Definitions\n */\n\n#if TRIO_FEATURE_FLOAT\n\n# if !defined(DECIMAL_DIG)\n#  define DECIMAL_DIG DBL_DIG\n# endif\n\n/* Long double sizes */\n# ifdef LDBL_DIG\n#  define MAX_MANTISSA_DIGITS LDBL_DIG\n#  define MAX_EXPONENT_DIGITS 4\n#  define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP\n# else\n#  define MAX_MANTISSA_DIGITS DECIMAL_DIG\n#  define MAX_EXPONENT_DIGITS 3\n#  define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP\n# endif\n\n# if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG)\n#  undef LDBL_DIG\n#  undef LDBL_MANT_DIG\n#  undef LDBL_EPSILON\n#  define LDBL_DIG DBL_DIG\n#  define LDBL_MANT_DIG DBL_MANT_DIG\n#  define LDBL_EPSILON DBL_EPSILON\n# endif\n\n#endif /* TRIO_FEATURE_FLOAT */\n\n/* The maximal number of digits is for base 2 */\n#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT)\n/* The width of a pointer. The number of bits in a hex digit is 4 */\n#define POINTER_WIDTH ((sizeof(\"0x\") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4)\n\n#if TRIO_FEATURE_FLOAT\n/* Infinite and Not-A-Number for floating-point */\n# define INFINITE_LOWER \"inf\"\n# define INFINITE_UPPER \"INF\"\n# define LONG_INFINITE_LOWER \"infinite\"\n# define LONG_INFINITE_UPPER \"INFINITE\"\n# define NAN_LOWER \"nan\"\n# define NAN_UPPER \"NAN\"\n#endif\n\n/* Various constants */\nenum {\n  TYPE_PRINT = 1,\n#if TRIO_FEATURE_SCANF\n  TYPE_SCAN  = 2,\n#endif\n\n  /* Flags. FLAGS_LAST must be less than ULONG_MAX */\n  FLAGS_NEW                 = 0,\n  FLAGS_STICKY              = 1,\n  FLAGS_SPACE               = 2 * FLAGS_STICKY,\n  FLAGS_SHOWSIGN            = 2 * FLAGS_SPACE,\n  FLAGS_LEFTADJUST          = 2 * FLAGS_SHOWSIGN,\n  FLAGS_ALTERNATIVE         = 2 * FLAGS_LEFTADJUST,\n  FLAGS_SHORT               = 2 * FLAGS_ALTERNATIVE,\n  FLAGS_SHORTSHORT          = 2 * FLAGS_SHORT,\n  FLAGS_LONG                = 2 * FLAGS_SHORTSHORT,\n  FLAGS_QUAD                = 2 * FLAGS_LONG,\n  FLAGS_LONGDOUBLE          = 2 * FLAGS_QUAD,\n  FLAGS_SIZE_T              = 2 * FLAGS_LONGDOUBLE,\n  FLAGS_PTRDIFF_T           = 2 * FLAGS_SIZE_T,\n  FLAGS_INTMAX_T            = 2 * FLAGS_PTRDIFF_T,\n  FLAGS_NILPADDING          = 2 * FLAGS_INTMAX_T,\n  FLAGS_UNSIGNED            = 2 * FLAGS_NILPADDING,\n  FLAGS_UPPER               = 2 * FLAGS_UNSIGNED,\n  FLAGS_WIDTH               = 2 * FLAGS_UPPER,\n  FLAGS_WIDTH_PARAMETER     = 2 * FLAGS_WIDTH,\n  FLAGS_PRECISION           = 2 * FLAGS_WIDTH_PARAMETER,\n  FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION,\n  FLAGS_BASE                = 2 * FLAGS_PRECISION_PARAMETER,\n  FLAGS_BASE_PARAMETER      = 2 * FLAGS_BASE,\n  FLAGS_FLOAT_E             = 2 * FLAGS_BASE_PARAMETER,\n  FLAGS_FLOAT_G             = 2 * FLAGS_FLOAT_E,\n  FLAGS_QUOTE               = 2 * FLAGS_FLOAT_G,\n  FLAGS_WIDECHAR            = 2 * FLAGS_QUOTE,\n  FLAGS_IGNORE              = 2 * FLAGS_WIDECHAR,\n  FLAGS_IGNORE_PARAMETER    = 2 * FLAGS_IGNORE,\n  FLAGS_VARSIZE_PARAMETER   = 2 * FLAGS_IGNORE_PARAMETER,\n  FLAGS_FIXED_SIZE          = 2 * FLAGS_VARSIZE_PARAMETER,\n  FLAGS_LAST                = FLAGS_FIXED_SIZE,\n  /* Reused flags */\n  FLAGS_EXCLUDE             = FLAGS_SHORT,\n  FLAGS_USER_DEFINED        = FLAGS_IGNORE,\n  FLAGS_USER_DEFINED_PARAMETER = FLAGS_IGNORE_PARAMETER,\n  FLAGS_ROUNDING            = FLAGS_INTMAX_T,\n  /* Compounded flags */\n  FLAGS_ALL_VARSIZES        = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T,\n  FLAGS_ALL_SIZES           = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT,\n\n  NO_POSITION  = -1,\n  NO_WIDTH     =  0,\n  NO_PRECISION = -1,\n  NO_SIZE      = -1,\n\n  /* Do not change these */\n  NO_BASE      = -1,\n  MIN_BASE     =  2,\n  MAX_BASE     = 36,\n  BASE_BINARY  =  2,\n  BASE_OCTAL   =  8,\n  BASE_DECIMAL = 10,\n  BASE_HEX     = 16,\n\n  /* Maximal number of allowed parameters */\n  MAX_PARAMETERS = 64,\n  /* Maximal number of characters in class */\n  MAX_CHARACTER_CLASS = UCHAR_MAX + 1,\n\n#if TRIO_FEATURE_USER_DEFINED\n  /* Maximal string lengths for user-defined specifiers */\n  MAX_USER_NAME = 64,\n  MAX_USER_DATA = 256,\n#endif\n  \n  /* Maximal length of locale separator strings */\n  MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX,\n  /* Maximal number of integers in grouping */\n  MAX_LOCALE_GROUPS = 64\n};\n\n#define NO_GROUPING ((int)CHAR_MAX)\n\n/* Fundamental formatting parameter types */\n#define FORMAT_SENTINEL  -1\t/* marks end of parameters array */\n#define FORMAT_UNKNOWN   0\n#define FORMAT_INT       1\n#define FORMAT_DOUBLE    2\n#define FORMAT_CHAR      3\n#define FORMAT_STRING    4\n#define FORMAT_POINTER   5\n#define FORMAT_COUNT     6\n#define FORMAT_PARAMETER 7\n#define FORMAT_GROUP     8\n#define FORMAT_ERRNO     9\n#define FORMAT_USER_DEFINED 10\n\n/* Character constants */\n#define CHAR_IDENTIFIER '%'\n#define CHAR_ALT_IDENTIFIER '$'\n#define CHAR_BACKSLASH '\\\\'\n#define CHAR_QUOTE '\\\"'\n#define CHAR_ADJUST ' '\n\n#if TRIO_EXTENSION\n/* Character class expressions */\n# define CLASS_ALNUM \"[:alnum:]\"\n# define CLASS_ALPHA \"[:alpha:]\"\n# define CLASS_BLANK \"[:blank:]\"\n# define CLASS_CNTRL \"[:cntrl:]\"\n# define CLASS_DIGIT \"[:digit:]\"\n# define CLASS_GRAPH \"[:graph:]\"\n# define CLASS_LOWER \"[:lower:]\"\n# define CLASS_PRINT \"[:print:]\"\n# define CLASS_PUNCT \"[:punct:]\"\n# define CLASS_SPACE \"[:space:]\"\n# define CLASS_UPPER \"[:upper:]\"\n# define CLASS_XDIGIT \"[:xdigit:]\"\n#endif\n\n/*\n * SPECIFIERS:\n *\n *\n * a  Hex-float\n * A  Hex-float\n * c  Character\n * C  Widechar character (wint_t)\n * d  Decimal\n * e  Float\n * E  Float\n * F  Float\n * F  Float\n * g  Float\n * G  Float\n * i  Integer\n * m  Error message\n * n  Count\n * o  Octal\n * p  Pointer\n * s  String\n * S  Widechar string (wchar_t *)\n * u  Unsigned\n * x  Hex\n * X  Hex\n * [] Group\n * <> User-defined\n *\n * Reserved:\n *\n * D  Binary Coded Decimal %D(length,precision) (OS/390)\n */\n#define SPECIFIER_CHAR 'c'\n#define SPECIFIER_STRING 's'\n#define SPECIFIER_DECIMAL 'd'\n#define SPECIFIER_INTEGER 'i'\n#define SPECIFIER_UNSIGNED 'u'\n#define SPECIFIER_OCTAL 'o'\n#define SPECIFIER_HEX 'x'\n#define SPECIFIER_HEX_UPPER 'X'\n#if TRIO_FEATURE_FLOAT\n# define SPECIFIER_FLOAT_E 'e'\n# define SPECIFIER_FLOAT_E_UPPER 'E'\n# define SPECIFIER_FLOAT_F 'f'\n# define SPECIFIER_FLOAT_F_UPPER 'F'\n# define SPECIFIER_FLOAT_G 'g'\n# define SPECIFIER_FLOAT_G_UPPER 'G'\n#endif\n#define SPECIFIER_POINTER 'p'\n#if TRIO_FEATURE_SCANF\n# define SPECIFIER_GROUP '['\n# define SPECIFIER_UNGROUP ']'\n#endif\n#define SPECIFIER_COUNT 'n'\n#if TRIO_UNIX98\n# define SPECIFIER_CHAR_UPPER 'C'\n# define SPECIFIER_STRING_UPPER 'S'\n#endif\n#define SPECIFIER_HEXFLOAT 'a'\n#define SPECIFIER_HEXFLOAT_UPPER 'A'\n#define SPECIFIER_ERRNO 'm'\n#if TRIO_FEATURE_BINARY\n# define SPECIFIER_BINARY 'b'\n# define SPECIFIER_BINARY_UPPER 'B'\n#endif\n#if TRIO_FEATURE_USER_DEFINED\n# define SPECIFIER_USER_DEFINED_BEGIN '<'\n# define SPECIFIER_USER_DEFINED_END '>'\n# define SPECIFIER_USER_DEFINED_SEPARATOR ':'\n# define SPECIFIER_USER_DEFINED_EXTRA '|'\n#endif\n\n/*\n * QUALIFIERS:\n *\n *\n * Numbers = d,i,o,u,x,X\n * Float = a,A,e,E,f,F,g,G\n * String = s\n * Char = c\n *\n *\n * 9$ Position\n *      Use the 9th parameter. 9 can be any number between 1 and\n *      the maximal argument\n *\n * 9 Width\n *      Set width to 9. 9 can be any number, but must not be postfixed\n *      by '$'\n *\n * h  Short\n *    Numbers:\n *      (unsigned) short int\n *\n * hh Short short\n *    Numbers:\n *      (unsigned) char\n *\n * l  Long\n *    Numbers:\n *      (unsigned) long int\n *    String:\n *      as the S specifier\n *    Char:\n *      as the C specifier\n *\n * ll Long Long\n *    Numbers:\n *      (unsigned) long long int\n *\n * L  Long Double\n *    Float\n *      long double\n *\n * #  Alternative\n *    Float:\n *      Decimal-point is always present\n *    String:\n *      non-printable characters are handled as \\number\n *\n *    Spacing\n *\n * +  Sign\n *\n * -  Alignment\n *\n * .  Precision\n *\n * *  Parameter\n *    print: use parameter\n *    scan: no parameter (ignore)\n *\n * q  Quad\n *\n * Z  size_t\n *\n * w  Widechar\n *\n * '  Thousands/quote\n *    Numbers:\n *      Integer part grouped in thousands\n *    Binary numbers:\n *      Number grouped in nibbles (4 bits)\n *    String:\n *      Quoted string\n *\n * j  intmax_t\n * t  prtdiff_t\n * z  size_t\n *\n * !  Sticky\n * @  Parameter (for both print and scan)\n *\n * I  n-bit Integer\n *    Numbers:\n *      The following options exists\n *        I8  = 8-bit integer\n *        I16 = 16-bit integer\n *        I32 = 32-bit integer\n *        I64 = 64-bit integer\n */\n#define QUALIFIER_POSITION '$'\n#define QUALIFIER_SHORT 'h'\n#define QUALIFIER_LONG 'l'\n#define QUALIFIER_LONG_UPPER 'L'\n#define QUALIFIER_ALTERNATIVE '#'\n#define QUALIFIER_SPACE ' '\n#define QUALIFIER_PLUS '+'\n#define QUALIFIER_MINUS '-'\n#define QUALIFIER_DOT '.'\n#define QUALIFIER_STAR '*'\n#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */\n#define QUALIFIER_SIZE_T 'z'\n#define QUALIFIER_PTRDIFF_T 't'\n#define QUALIFIER_INTMAX_T 'j'\n#define QUALIFIER_QUAD 'q'\n#define QUALIFIER_SIZE_T_UPPER 'Z'\n#if TRIO_MISC\n# define QUALIFIER_WIDECHAR 'w'\n#endif\n#define QUALIFIER_FIXED_SIZE 'I'\n#define QUALIFIER_QUOTE '\\''\n#define QUALIFIER_STICKY '!'\n#define QUALIFIER_VARSIZE '&' /* This should remain undocumented */\n#define QUALIFIER_ROUNDING_UPPER 'R'\n#if TRIO_EXTENSION\n# define QUALIFIER_PARAM '@' /* Experimental */\n# define QUALIFIER_COLON ':' /* For scanlists */\n# define QUALIFIER_EQUAL '=' /* For scanlists */\n#endif\n\n\n/*************************************************************************\n *\n * Internal Structures\n *\n *************************************************************************/\n\n/* Parameters */\ntypedef struct {\n  /* An indication of which entry in the data union is used */\n  int type;\n  /* The flags */\n  trio_flags_t flags;\n  /* The width qualifier */\n  int width;\n  /* The precision qualifier */\n  int precision;\n  /* The base qualifier */\n  int base;\n  /* Base from specifier */\n  int baseSpecifier;\n  /* The size for the variable size qualifier */\n  int varsize;\n  /* Offset of the first character of the specifier */\n  int beginOffset;\n  /* Offset of the first character after the specifier */\n  int endOffset;\n  /* Position in the argument list that this parameter refers to */\n  int position;\n  /* The data from the argument list */\n  union {\n    char *string;\n#if TRIO_FEATURE_WIDECHAR\n    trio_wchar_t *wstring;\n#endif\n    trio_pointer_t pointer;\n    union {\n      trio_intmax_t as_signed;\n      trio_uintmax_t as_unsigned;\n    } number;\n#if TRIO_FEATURE_FLOAT\n    double doubleNumber;\n    double *doublePointer;\n    trio_long_double_t longdoubleNumber;\n    trio_long_double_t *longdoublePointer;\n#endif\n    int errorNumber;\n  } data;\n#if TRIO_FEATURE_USER_DEFINED\n  /* For the user-defined specifier */\n  union {\n    char namespace[MAX_USER_NAME];\n    int handler;        /* if flags & FLAGS_USER_DEFINED_PARAMETER */\n  } user_defined;\n  char user_data[MAX_USER_DATA];\n#endif\n} trio_parameter_t;\n\n/* Container for customized functions */\ntypedef struct {\n  union {\n    trio_outstream_t out;\n    trio_instream_t in;\n  } stream;\n  trio_pointer_t closure;\n} trio_custom_t;\n\n/* General trio \"class\" */\ntypedef struct _trio_class_t {\n  /*\n   * The function to write characters to a stream.\n   */\n  void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int));\n  /*\n   * The function to read characters from a stream.\n   */\n  void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *));\n  /*\n   * The function to undo read characters from a stream.\n   */\n  void (*UndoStream) TRIO_PROTO((struct _trio_class_t *));\n  /*\n   * The current location in the stream.\n   */\n  trio_pointer_t location;\n  /*\n   * The character currently being processed.\n   */\n  int current;\n  /*\n   * The number of characters that would have been written/read\n   * if there had been sufficient space.\n   */\n  int processed;\n  union {\n    /*\n     * The number of characters that are actually written. Processed and\n     * committed will only differ for the *nprintf functions.\n     */\n    int committed;\n    /*\n     * The number of look-ahead characters read.\n     */\n    int cached;\n  } actually;\n  /*\n   * The upper limit of characters that may be written/read.\n   */\n  int max;\n  /*\n   * The last output error that was detected.\n   */\n  int error;\n} trio_class_t;\n\n/* References (for user-defined callbacks) */\ntypedef struct _trio_reference_t {\n  trio_class_t *data;\n  trio_parameter_t *parameter;\n} trio_reference_t;\n\n#if TRIO_FEATURE_USER_DEFINED\n/* Registered entries (for user-defined callbacks) */\ntypedef struct _trio_userdef_t {\n  struct _trio_userdef_t *next;\n  trio_callback_t callback;\n  char *name;\n} trio_userdef_t;\n#endif\n\n/*************************************************************************\n *\n * Internal Variables\n *\n *************************************************************************/\n\nstatic TRIO_CONST char rcsid[] = \"@(#)$Id$\";\n\n#if TRIO_FEATURE_FLOAT\n/*\n * Need this to workaround a parser bug in HP C/iX compiler that fails\n * to resolves macro definitions that includes type 'long double',\n * e.g: va_arg(arg_ptr, long double)\n */\n# if defined(TRIO_PLATFORM_MPEIX)\nstatic TRIO_CONST trio_long_double_t ___dummy_long_double = 0;\n# endif\n#endif\n\nstatic TRIO_CONST char internalNullString[] = \"(nil)\";\n\n#if defined(USE_LOCALE)\nstatic struct lconv *internalLocaleValues = NULL;\n#endif\n\n/*\n * UNIX98 says \"in a locale where the radix character is not defined,\n * the radix character defaults to a period (.)\"\n */\n#if TRIO_FEATURE_FLOAT || TRIO_FEATURE_LOCALE || defined(USE_LOCALE)\nstatic int internalDecimalPointLength = 1;\nstatic char internalDecimalPoint = '.';\nstatic char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = \".\";\n#endif\n#if TRIO_FEATURE_QUOTE || TRIO_FEATURE_LOCALE || TRIO_EXTENSION\nstatic int internalThousandSeparatorLength = 1;\nstatic char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = \",\";\nstatic char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING };\n#endif\n\nstatic TRIO_CONST char internalDigitsLower[] = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nstatic TRIO_CONST char internalDigitsUpper[] = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n#if TRIO_FEATURE_SCANF\nstatic BOOLEAN_T internalDigitsUnconverted = TRUE;\nstatic int internalDigitArray[128];\n# if TRIO_EXTENSION\nstatic BOOLEAN_T internalCollationUnconverted = TRUE;\nstatic char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS];\n# endif\n#endif\n\n#if TRIO_FEATURE_USER_DEFINED\nstatic TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL;\nstatic TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL;\nstatic trio_userdef_t *internalUserDef = NULL;\n#endif\n\n\n/*************************************************************************\n *\n * Internal Functions\n *\n ************************************************************************/\n\n#if defined(TRIO_EMBED_NAN)\n# include \"trionan.c\"\n#endif\n\n#if defined(TRIO_EMBED_STRING)\n# include \"triostr.c\"\n#endif\n\n/*************************************************************************\n * TrioInitializeParameter\n *\n * Description:\n *  Initialize a trio_parameter_t struct.\n */\nTRIO_PRIVATE void\nTrioInitializeParameter\nTRIO_ARGS1((parameter),\n\t   trio_parameter_t *parameter)\n{\n  parameter->type = FORMAT_UNKNOWN;\n  parameter->flags = 0;\n  parameter->width = 0;\n  parameter->precision = 0;\n  parameter->base = 0;\n  parameter->baseSpecifier = 0;\n  parameter->varsize = 0;\n  parameter->beginOffset = 0;\n  parameter->endOffset = 0;\n  parameter->position = 0;\n  parameter->data.pointer = 0;\n#if TRIO_FEATURE_USER_DEFINED\n  parameter->user_defined.handler = 0;\n  parameter->user_data[0] = 0;\n#endif\n}\n\n/*************************************************************************\n * TrioCopyParameter\n *\n * Description:\n *  Copies one trio_parameter_t struct to another.\n */\nTRIO_PRIVATE void\nTrioCopyParameter\nTRIO_ARGS2((target, source),\n\t   trio_parameter_t *target,\n\t   TRIO_CONST trio_parameter_t *source)\n{\n#if TRIO_FEATURE_USER_DEFINED\n  size_t i;\n#endif\n\n  target->type = source->type;\n  target->flags = source->flags;\n  target->width = source->width;\n  target->precision = source->precision;\n  target->base = source->base;\n  target->baseSpecifier = source->baseSpecifier;\n  target->varsize = source->varsize;\n  target->beginOffset = source->beginOffset;\n  target->endOffset = source->endOffset;\n  target->position = source->position;\n  target->data = source->data;\n\n#if TRIO_FEATURE_USER_DEFINED\n  target->user_defined = source->user_defined;\n\n  for (i = 0U; i < sizeof(target->user_data); ++i)\n    {\n      if ((target->user_data[i] = source->user_data[i]) == NIL)\n\tbreak;\n    }\n#endif\n}\n\n/*************************************************************************\n * TrioIsQualifier\n *\n * Description:\n *  Remember to add all new qualifiers to this function.\n *  QUALIFIER_POSITION must not be added.\n */\nTRIO_PRIVATE BOOLEAN_T\nTrioIsQualifier\nTRIO_ARGS1((character),\n\t   TRIO_CONST char character)\n{\n  /* QUALIFIER_POSITION is not included */\n  switch (character)\n    {\n    case '0': case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n    case QUALIFIER_PLUS:\n    case QUALIFIER_MINUS:\n    case QUALIFIER_SPACE:\n    case QUALIFIER_DOT:\n    case QUALIFIER_STAR:\n    case QUALIFIER_ALTERNATIVE:\n    case QUALIFIER_SHORT:\n    case QUALIFIER_LONG:\n    case QUALIFIER_CIRCUMFLEX:\n    case QUALIFIER_LONG_UPPER:\n    case QUALIFIER_SIZE_T:\n    case QUALIFIER_PTRDIFF_T:\n    case QUALIFIER_INTMAX_T:\n    case QUALIFIER_QUAD:\n    case QUALIFIER_SIZE_T_UPPER:\n#if defined(QUALIFIER_WIDECHAR)\n    case QUALIFIER_WIDECHAR:\n#endif\n    case QUALIFIER_QUOTE:\n    case QUALIFIER_STICKY:\n    case QUALIFIER_VARSIZE:\n#if defined(QUALIFIER_PARAM)\n    case QUALIFIER_PARAM:\n#endif\n    case QUALIFIER_FIXED_SIZE:\n    case QUALIFIER_ROUNDING_UPPER:\n      return TRUE;\n    default:\n      return FALSE;\n    }\n}\n\n/*************************************************************************\n * TrioSetLocale\n */\n#if defined(USE_LOCALE)\nTRIO_PRIVATE void\nTrioSetLocale(TRIO_NOARGS)\n{\n  internalLocaleValues = (struct lconv *)localeconv();\n  if (internalLocaleValues)\n    {\n      if ((internalLocaleValues->decimal_point) &&\n\t  (internalLocaleValues->decimal_point[0] != NIL))\n\t{\n\t  internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point);\n\t  if (internalDecimalPointLength == 1)\n\t    {\n\t      internalDecimalPoint = internalLocaleValues->decimal_point[0];\n\t    }\n\t  else\n\t    {\n\t      internalDecimalPoint = NIL;\n\t      trio_copy_max(internalDecimalPointString,\n\t\t\t    sizeof(internalDecimalPointString),\n\t\t\t    internalLocaleValues->decimal_point);\n\t    }\n\t}\n# if TRIO_EXTENSION\n      if ((internalLocaleValues->thousands_sep) &&\n\t  (internalLocaleValues->thousands_sep[0] != NIL))\n\t{\n\t  trio_copy_max(internalThousandSeparator,\n\t\t\tsizeof(internalThousandSeparator),\n\t\t\tinternalLocaleValues->thousands_sep);\n\t  internalThousandSeparatorLength = trio_length(internalThousandSeparator);\n\t}\n# endif\n# if TRIO_EXTENSION\n      if ((internalLocaleValues->grouping) &&\n\t  (internalLocaleValues->grouping[0] != NIL))\n\t{\n\t  trio_copy_max(internalGrouping,\n\t\t\tsizeof(internalGrouping),\n\t\t\tinternalLocaleValues->grouping);\n\t}\n# endif\n    }\n}\n#endif /* defined(USE_LOCALE) */\n\n#if TRIO_FEATURE_FLOAT && TRIO_FEATURE_QUOTE\nTRIO_PRIVATE int\nTrioCalcThousandSeparatorLength\nTRIO_ARGS1((digits),\n\t   int digits)\n{\n  int count = 0;\n  int step = NO_GROUPING;\n  char *groupingPointer = internalGrouping;\n\n  while (digits > 0)\n    {\n      if (*groupingPointer == CHAR_MAX)\n\t{\n\t  /* Disable grouping */\n\t  break; /* while */\n\t}\n      else if (*groupingPointer == 0)\n\t{\n\t  /* Repeat last group */\n\t  if (step == NO_GROUPING)\n\t    {\n\t      /* Error in locale */\n\t      break; /* while */\n\t    }\n\t}\n      else\n\t{\n\t  step = *groupingPointer++;\n\t}\n      if (digits > step)\n\tcount += internalThousandSeparatorLength;\n      digits -= step;\n    }\n  return count;\n}\n#endif /* TRIO_FEATURE_FLOAT && TRIO_FEATURE_QUOTE */\n\n#if TRIO_FEATURE_QUOTE\nTRIO_PRIVATE BOOLEAN_T\nTrioFollowedBySeparator\nTRIO_ARGS1((position),\n\t   int position)\n{\n  int step = 0;\n  char *groupingPointer = internalGrouping;\n\n  position--;\n  if (position == 0)\n    return FALSE;\n  while (position > 0)\n    {\n      if (*groupingPointer == CHAR_MAX)\n\t{\n\t  /* Disable grouping */\n\t  break; /* while */\n\t}\n      else if (*groupingPointer != 0)\n\t{\n\t  step = *groupingPointer++;\n\t}\n      if (step == 0)\n\tbreak;\n      position -= step;\n    }\n  return (position == 0);\n}\n#endif /* TRIO_FEATURE_QUOTE */\n\n/*************************************************************************\n * TrioGetPosition\n *\n * Get the %n$ position.\n */\nTRIO_PRIVATE int\nTrioGetPosition\nTRIO_ARGS2((format, offsetPointer),\n\t   TRIO_CONST char *format,\n\t   int *offsetPointer)\n{\n#if TRIO_FEATURE_POSITIONAL\n  char *tmpformat;\n  int number = 0;\n  int offset = *offsetPointer;\n\n  number = (int)trio_to_long(&format[offset], &tmpformat, BASE_DECIMAL);\n  offset = (int)(tmpformat - format);\n  if ((number != 0) && (QUALIFIER_POSITION == format[offset++]))\n    {\n      *offsetPointer = offset;\n      /*\n       * number is decreased by 1, because n$ starts from 1, whereas\n       * the array it is indexing starts from 0.\n       */\n      return number - 1;\n    }\n#endif\n  return NO_POSITION;\n}\n\n/*************************************************************************\n * TrioFindNamespace\n *\n * Find registered user-defined specifier.\n * The prev argument is used for optimization only.\n */\n#if TRIO_FEATURE_USER_DEFINED\nTRIO_PRIVATE trio_userdef_t *\nTrioFindNamespace\nTRIO_ARGS2((name, prev),\n\t   TRIO_CONST char *name,\n\t   trio_userdef_t **prev)\n{\n  trio_userdef_t *def;\n  \n  if (internalEnterCriticalRegion)\n    (void)internalEnterCriticalRegion(NULL);\n  \n  for (def = internalUserDef; def; def = def->next)\n    {\n      /* Case-sensitive string comparison */\n      if (trio_equal_case(def->name, name))\n\tbreak;\n      \n      if (prev)\n\t*prev = def;\n    }\n  \n  if (internalLeaveCriticalRegion)\n    (void)internalLeaveCriticalRegion(NULL);\n  \n  return def;\n}\n#endif\n\n/*************************************************************************\n * TrioPower\n *\n * Description:\n *  Calculate pow(base, exponent), where number and exponent are integers.\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PRIVATE trio_long_double_t\nTrioPower\nTRIO_ARGS2((number, exponent),\n\t   int number,\n\t   int exponent)\n{\n  trio_long_double_t result;\n\n  if (number == 10)\n    {\n      switch (exponent)\n\t{\n\t  /* Speed up calculation of common cases */\n\tcase 0:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1);\n\t  break;\n\tcase 1:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0);\n\t  break;\n\tcase 2:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1);\n\t  break;\n\tcase 3:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2);\n\t  break;\n\tcase 4:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3);\n\t  break;\n\tcase 5:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4);\n\t  break;\n\tcase 6:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5);\n\t  break;\n\tcase 7:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6);\n\t  break;\n\tcase 8:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7);\n\t  break;\n\tcase 9:\n\t  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8);\n\t  break;\n\tdefault:\n\t  result = trio_pow((trio_long_double_t)number,\n\t\t\t    (trio_long_double_t)exponent);\n\t  break;\n\t}\n    }\n  else\n    {\n      return trio_pow((trio_long_double_t)number,\n\t\t      (trio_long_double_t)exponent);\n    }\n  return result;\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * TrioLogarithm\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PRIVATE trio_long_double_t\nTrioLogarithm\nTRIO_ARGS2((number, base),\n\t   trio_long_double_t number,\n\t   int base)\n{\n  trio_long_double_t result;\n\n  if (number <= 0.0)\n    {\n      /* xlC crashes on log(0) */\n      result = (number == 0.0) ? trio_ninf() : trio_nan();\n    }\n  else\n    {\n      if (base == 10)\n\t{\n\t  result = trio_log10(number);\n\t}\n      else\n\t{\n\t  result = trio_log10(number) / trio_log10((double)base);\n\t}\n    }\n  return result;\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * TrioLogarithmBase\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PRIVATE double\nTrioLogarithmBase\nTRIO_ARGS1((base),\n\t   int base)\n{\n  switch (base)\n    {\n    case BASE_BINARY : return 1.0;\n    case BASE_OCTAL  : return 3.0;\n    case BASE_DECIMAL: return 3.321928094887362345;\n    case BASE_HEX    : return 4.0;\n    default          : return TrioLogarithm((double)base, 2);\n    }\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * TrioParseQualifiers\n *\n * Description:\n *  Parse the qualifiers of a potential conversion specifier\n */\nTRIO_PRIVATE int\nTrioParseQualifiers\nTRIO_ARGS4((type, format, offset, parameter),\n\t   int type,\n\t   TRIO_CONST char *format,\n\t   int offset,\n\t   trio_parameter_t *parameter)\n{\n  char ch;\n  int dots = 0;  /* Count number of dots in modifier part */\n  char *tmpformat;\n\n  parameter->beginOffset = offset - 1;\n  parameter->flags = FLAGS_NEW;\n  parameter->position = TrioGetPosition(format, &offset);\n\n  /* Default values */\n  parameter->width = NO_WIDTH;\n  parameter->precision = NO_PRECISION;\n  parameter->base = NO_BASE;\n  parameter->varsize = NO_SIZE;\n\n  while (TrioIsQualifier(format[offset]))\n    {\n      ch = format[offset++];\n\n      switch (ch)\n        {\n\tcase QUALIFIER_SPACE:\n\t  parameter->flags |= FLAGS_SPACE;\n\t  break;\n\n\tcase QUALIFIER_PLUS:\n\t  parameter->flags |= FLAGS_SHOWSIGN;\n\t  break;\n\n\tcase QUALIFIER_MINUS:\n\t  parameter->flags |= FLAGS_LEFTADJUST;\n\t  parameter->flags &= ~FLAGS_NILPADDING;\n\t  break;\n\n\tcase QUALIFIER_ALTERNATIVE:\n\t  parameter->flags |= FLAGS_ALTERNATIVE;\n\t  break;\n\n\tcase QUALIFIER_DOT:\n\t  if (dots == 0) /* Precision */\n\t    {\n\t      dots++;\n\n\t      /* Skip if no precision */\n\t      if (QUALIFIER_DOT == format[offset])\n\t\tbreak;\n\n\t      /* After the first dot we have the precision */\n\t      parameter->flags |= FLAGS_PRECISION;\n\t      if ((QUALIFIER_STAR == format[offset])\n#if defined(QUALIFIER_PARAM)\n\t\t  || (QUALIFIER_PARAM == format[offset])\n#endif\n\t\t  )\n\t\t{\n\t\t  offset++;\n\t\t  parameter->flags |= FLAGS_PRECISION_PARAMETER;\n\t\t  parameter->precision = TrioGetPosition(format, &offset);\n\t\t}\n\t      else\n\t\t{\n\t\t  parameter->precision = trio_to_long(&format[offset],\n\t\t\t\t\t\t      &tmpformat,\n\t\t\t\t\t\t      BASE_DECIMAL);\n\t\t  offset = (int)(tmpformat - format);\n\t\t}\n\t    }\n\t  else if (dots == 1) /* Base */\n\t    {\n\t      dots++;\n\n\t      /* After the second dot we have the base */\n\t      parameter->flags |= FLAGS_BASE;\n\t      if ((QUALIFIER_STAR == format[offset])\n#if defined(QUALIFIER_PARAM)\n\t\t  || (QUALIFIER_PARAM == format[offset])\n#endif\n\t\t  )\n\t\t{\n\t\t  offset++;\n\t\t  parameter->flags |= FLAGS_BASE_PARAMETER;\n\t\t  parameter->base = TrioGetPosition(format, &offset);\n\t\t}\n\t      else\n\t\t{\n\t\t  parameter->base = trio_to_long(&format[offset],\n\t\t\t\t\t\t &tmpformat,\n\t\t\t\t\t\t BASE_DECIMAL);\n\t\t  if (parameter->base > MAX_BASE)\n\t\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t\t  offset = (int)(tmpformat - format);\n\t\t}\n\t    }\n\t  else\n\t    {\n\t      return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t    }\n\t  break; /* QUALIFIER_DOT */\n\n#if defined(QUALIFIER_PARAM)\n\tcase QUALIFIER_PARAM:\n\t  parameter->type = TYPE_PRINT;\n\t  /* FALLTHROUGH */\n#endif\n\tcase QUALIFIER_STAR:\n\t  /* This has different meanings for print and scan */\n\t  if (TYPE_PRINT == type)\n\t    {\n\t      /* Read with from parameter */\n\t      int width = TrioGetPosition(format, &offset);\n\t      parameter->flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER);\n\t      if (NO_POSITION != width)\n                parameter->width = width;\n\t      /* else keep parameter->width = NO_WIDTH which != NO_POSITION */\n\t    }\n#if TRIO_FEATURE_SCANF\n\t  else\n\t    {\n\t      /* Scan, but do not store result */\n\t      parameter->flags |= FLAGS_IGNORE;\n\t    }\n#endif\n\t  break; /* QUALIFIER_STAR */\n\n\tcase '0':\n\t  if (! (parameter->flags & FLAGS_LEFTADJUST))\n\t    parameter->flags |= FLAGS_NILPADDING;\n\t  /* FALLTHROUGH */\n\tcase '1': case '2': case '3': case '4':\n\tcase '5': case '6': case '7': case '8': case '9':\n\t  parameter->flags |= FLAGS_WIDTH;\n\t  /*\n\t   * &format[offset - 1] is used to \"rewind\" the read\n\t   * character from format\n\t   */\n\t  parameter->width = trio_to_long(&format[offset - 1],\n\t\t\t\t\t  &tmpformat,\n\t\t\t\t\t  BASE_DECIMAL);\n\t  offset = (int)(tmpformat - format);\n\t  break;\n\n\tcase QUALIFIER_SHORT:\n\t  if (parameter->flags & FLAGS_SHORTSHORT)\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t  else if (parameter->flags & FLAGS_SHORT)\n\t    parameter->flags |= FLAGS_SHORTSHORT;\n\t  else\n\t    parameter->flags |= FLAGS_SHORT;\n\t  break;\n\n\tcase QUALIFIER_LONG:\n\t  if (parameter->flags & FLAGS_QUAD)\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t  else if (parameter->flags & FLAGS_LONG)\n\t    parameter->flags |= FLAGS_QUAD;\n\t  else\n\t    parameter->flags |= FLAGS_LONG;\n\t  break;\n\n#if TRIO_FEATURE_LONGDOUBLE\n\tcase QUALIFIER_LONG_UPPER:\n\t  parameter->flags |= FLAGS_LONGDOUBLE;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_SIZE_T\n\tcase QUALIFIER_SIZE_T:\n\t  parameter->flags |= FLAGS_SIZE_T;\n\t  /* Modify flags for later truncation of number */\n\t  if (sizeof(size_t) == sizeof(trio_ulonglong_t))\n\t    parameter->flags |= FLAGS_QUAD;\n\t  else if (sizeof(size_t) == sizeof(long))\n\t    parameter->flags |= FLAGS_LONG;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_PTRDIFF_T\n\tcase QUALIFIER_PTRDIFF_T:\n\t  parameter->flags |= FLAGS_PTRDIFF_T;\n\t  if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t))\n\t    parameter->flags |= FLAGS_QUAD;\n\t  else if (sizeof(ptrdiff_t) == sizeof(long))\n\t    parameter->flags |= FLAGS_LONG;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_INTMAX_T\n\tcase QUALIFIER_INTMAX_T:\n\t  parameter->flags |= FLAGS_INTMAX_T;\n\t  if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t))\n\t    parameter->flags |= FLAGS_QUAD;\n\t  else if (sizeof(trio_intmax_t) == sizeof(long))\n\t    parameter->flags |= FLAGS_LONG;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_QUAD\n\tcase QUALIFIER_QUAD:\n\t  parameter->flags |= FLAGS_QUAD;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_FIXED_SIZE\n\tcase QUALIFIER_FIXED_SIZE:\n\t  if (parameter->flags & FLAGS_FIXED_SIZE)\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\n\t  if (parameter->flags & (FLAGS_ALL_SIZES |\n\t\t\t\t  FLAGS_LONGDOUBLE |\n\t\t\t\t  FLAGS_WIDECHAR |\n\t\t\t\t  FLAGS_VARSIZE_PARAMETER))\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\n\t  if ((format[offset] == '6') &&\n\t      (format[offset + 1] == '4'))\n\t    {\n\t      parameter->varsize = sizeof(trio_int64_t);\n\t      offset += 2;\n\t    }\n\t  else if ((format[offset] == '3') &&\n\t\t   (format[offset + 1] == '2'))\n\t    {\n\t      parameter->varsize = sizeof(trio_int32_t);\n\t      offset += 2;\n\t    }\n\t  else if ((format[offset] == '1') &&\n\t\t   (format[offset + 1] == '6'))\n\t    {\n\t      parameter->varsize = sizeof(trio_int16_t);\n\t      offset += 2;\n\t    }\n\t  else if (format[offset] == '8')\n\t    {\n\t      parameter->varsize = sizeof(trio_int8_t);\n\t      offset++;\n\t    }\n\t  else\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\n\t  parameter->flags |= FLAGS_FIXED_SIZE;\n\t  break;\n#endif /* TRIO_FEATURE_FIXED_SIZE */\n\n#if defined(QUALIFIER_WIDECHAR)\n\tcase QUALIFIER_WIDECHAR:\n\t  parameter->flags |= FLAGS_WIDECHAR;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_SIZE_T_UPPER\n\tcase QUALIFIER_SIZE_T_UPPER:\n\t  break;\n#endif\n\n#if TRIO_FEATURE_QUOTE\n\tcase QUALIFIER_QUOTE:\n\t  parameter->flags |= FLAGS_QUOTE;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_STICKY\n\tcase QUALIFIER_STICKY:\n\t  parameter->flags |= FLAGS_STICKY;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_VARSIZE\n\tcase QUALIFIER_VARSIZE:\n\t  parameter->flags |= FLAGS_VARSIZE_PARAMETER;\n\t  break;\n#endif\n\n#if TRIO_FEATURE_ROUNDING\n\tcase QUALIFIER_ROUNDING_UPPER:\n\t  parameter->flags |= FLAGS_ROUNDING;\n\t  break;\n#endif\n\n\tdefault:\n\t  /* Bail out completely to make the error more obvious */\n\t  return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t}\n    } /* while qualifier */\n\n  parameter->endOffset = offset;\n\n  return 0;\n}\n\n/*************************************************************************\n * TrioParseSpecifier\n *\n * Description:\n *  Parse the specifier part of a potential conversion specifier\n */\nTRIO_PRIVATE int\nTrioParseSpecifier\nTRIO_ARGS4((type, format, offset, parameter),\n\t   int type,\n\t   TRIO_CONST char *format,\n\t   int offset,\n\t   trio_parameter_t *parameter)\n{\n  parameter->baseSpecifier = NO_BASE;\n\n  switch (format[offset++])\n    {\n#if defined(SPECIFIER_CHAR_UPPER)\n    case SPECIFIER_CHAR_UPPER:\n      parameter->flags |= FLAGS_WIDECHAR;\n      /* FALLTHROUGH */\n#endif\n    case SPECIFIER_CHAR:\n      if (parameter->flags & FLAGS_LONG)\n\tparameter->flags |= FLAGS_WIDECHAR;\n      else if (parameter->flags & FLAGS_SHORT)\n\tparameter->flags &= ~FLAGS_WIDECHAR;\n      parameter->type = FORMAT_CHAR;\n      break;\n\n#if defined(SPECIFIER_STRING_UPPER)\n    case SPECIFIER_STRING_UPPER:\n      parameter->flags |= FLAGS_WIDECHAR;\n      /* FALLTHROUGH */\n#endif\n    case SPECIFIER_STRING:\n      if (parameter->flags & FLAGS_LONG)\n\tparameter->flags |= FLAGS_WIDECHAR;\n      else if (parameter->flags & FLAGS_SHORT)\n\tparameter->flags &= ~FLAGS_WIDECHAR;\n      parameter->type = FORMAT_STRING;\n      break;\n\n#if defined(SPECIFIER_GROUP)\n    case SPECIFIER_GROUP:\n      if (TYPE_SCAN == type)\n\t{\n\t  int depth = 1;\n\t  parameter->type = FORMAT_GROUP;\n\t  if (format[offset] == QUALIFIER_CIRCUMFLEX)\n\t    offset++;\n\t  if (format[offset] == SPECIFIER_UNGROUP)\n\t    offset++;\n\t  if (format[offset] == QUALIFIER_MINUS)\n\t    offset++;\n\t  /* Skip nested brackets */\n\t  while (format[offset] != NIL)\n\t    {\n\t      if (format[offset] == SPECIFIER_GROUP)\n\t\t{\n\t\t  depth++;\n\t\t}\n\t      else if (format[offset] == SPECIFIER_UNGROUP)\n\t      {\n\t\tif (--depth <= 0)\n\t\t  {\n\t\t    offset++;\n\t\t    break;\n\t\t  }\n\t      }\n\t      offset++;\n\t    }\n\t}\n      break;\n#endif /* defined(SPECIFIER_GROUP) */\n\n    case SPECIFIER_INTEGER:\n      parameter->type = FORMAT_INT;\n      break;\n\n    case SPECIFIER_UNSIGNED:\n      parameter->flags |= FLAGS_UNSIGNED;\n      parameter->type = FORMAT_INT;\n      break;\n\n    case SPECIFIER_DECIMAL:\n      parameter->baseSpecifier = BASE_DECIMAL;\n      parameter->type = FORMAT_INT;\n      break;\n\n    case SPECIFIER_OCTAL:\n      parameter->flags |= FLAGS_UNSIGNED;\n      parameter->baseSpecifier = BASE_OCTAL;\n      parameter->type = FORMAT_INT;\n      break;\n\n#if TRIO_FEATURE_BINARY\n    case SPECIFIER_BINARY_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n    case SPECIFIER_BINARY:\n      parameter->flags |= FLAGS_NILPADDING;\n      parameter->baseSpecifier = BASE_BINARY;\n      parameter->type = FORMAT_INT;\n      break;\n#endif\n\n    case SPECIFIER_HEX_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n    case SPECIFIER_HEX:\n      parameter->flags |= FLAGS_UNSIGNED;\n      parameter->baseSpecifier = BASE_HEX;\n      parameter->type = FORMAT_INT;\n      break;\n\n#if defined(SPECIFIER_FLOAT_E)\n# if defined(SPECIFIER_FLOAT_E_UPPER)\n    case SPECIFIER_FLOAT_E_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n# endif\n    case SPECIFIER_FLOAT_E:\n      parameter->flags |= FLAGS_FLOAT_E;\n      parameter->type = FORMAT_DOUBLE;\n      break;\n#endif\n\n#if defined(SPECIFIER_FLOAT_G)\n# if defined(SPECIFIER_FLOAT_G_UPPER)\n    case SPECIFIER_FLOAT_G_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n# endif\n    case SPECIFIER_FLOAT_G:\n      parameter->flags |= FLAGS_FLOAT_G;\n      parameter->type = FORMAT_DOUBLE;\n      break;\n#endif\n\n#if defined(SPECIFIER_FLOAT_F)\n# if defined(SPECIFIER_FLOAT_F_UPPER)\n    case SPECIFIER_FLOAT_F_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n# endif\n    case SPECIFIER_FLOAT_F:\n      parameter->type = FORMAT_DOUBLE;\n      break;\n#endif\n\n#if defined(TRIO_COMPILER_VISUALC)\n# pragma warning( push )\n# pragma warning( disable : 4127 ) /* Conditional expression is constant */\n#endif\n    case SPECIFIER_POINTER:\n      if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t))\n\tparameter->flags |= FLAGS_QUAD;\n      else if (sizeof(trio_pointer_t) == sizeof(long))\n\tparameter->flags |= FLAGS_LONG;\n      parameter->type = FORMAT_POINTER;\n      break;\n#if defined(TRIO_COMPILER_VISUALC)\n# pragma warning( pop )\n#endif\n\n    case SPECIFIER_COUNT:\n      parameter->type = FORMAT_COUNT;\n      break;\n\n#if TRIO_FEATURE_HEXFLOAT\n    case SPECIFIER_HEXFLOAT_UPPER:\n      parameter->flags |= FLAGS_UPPER;\n      /* FALLTHROUGH */\n    case SPECIFIER_HEXFLOAT:\n      parameter->baseSpecifier = BASE_HEX;\n      parameter->type = FORMAT_DOUBLE;\n      break;\n#endif\n\n#if TRIO_FEATURE_ERRNO\n    case SPECIFIER_ERRNO:\n      parameter->type = FORMAT_ERRNO;\n      break;\n#endif\n\n#if TRIO_FEATURE_USER_DEFINED\n    case SPECIFIER_USER_DEFINED_BEGIN:\n      {\n\tunsigned int max;\n\tint without_namespace = TRUE;\n\tchar* tmpformat = (char *)&format[offset];\n\tint ch;\n\n\tparameter->type = FORMAT_USER_DEFINED;\n\tparameter->user_defined.namespace[0] = NIL;\n\n\twhile ((ch = format[offset]) != NIL)\n\t  {\n\t    offset++;\n\t    if ((ch == SPECIFIER_USER_DEFINED_END) || (ch == SPECIFIER_USER_DEFINED_EXTRA))\n\t      {\n\t\tif (without_namespace)\n\t\t  /* No namespace, handler will be passed as an argument */\n\t\t  parameter->flags |= FLAGS_USER_DEFINED_PARAMETER;\n\n\t\t/* Copy the user data */\n\t\tmax = (unsigned int)(&format[offset] - tmpformat);\n\t\tif (max > MAX_USER_DATA)\n\t\t  max = MAX_USER_DATA;\n\t\ttrio_copy_max(parameter->user_data, max, tmpformat);\n\n\t\t/* Skip extra data (which is only there to keep the compiler happy) */\n\t\twhile ((ch != NIL) && (ch != SPECIFIER_USER_DEFINED_END))\n\t\t  ch = format[offset++];\n\n\t\tbreak; /* while */\n\t      }\n\n\t    if (ch == SPECIFIER_USER_DEFINED_SEPARATOR)\n\t      {\n\t\twithout_namespace = FALSE;\n\t\t/* Copy the namespace for later looking-up */\n\t\tmax = (int)(&format[offset] - tmpformat);\n\t\tif (max > MAX_USER_NAME)\n\t\t  max = MAX_USER_NAME;\n\t\ttrio_copy_max(parameter->user_defined.namespace, max, tmpformat);\n\t\ttmpformat = (char *)&format[offset];\n\t      }\n\t  }\n\n\tif (ch != SPECIFIER_USER_DEFINED_END)\n\t  return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n      }\n      break;\n#endif /* TRIO_FEATURE_USER_DEFINED */\n\n    default:\n      /* Bail out completely to make the error more obvious */\n      return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n  }\n\n  parameter->endOffset = offset;\n\n  return 0;\n}\n\n/*************************************************************************\n * TrioParse\n *\n * Description:\n *  Parse the format string\n */\nTRIO_PRIVATE int\nTrioParse\nTRIO_ARGS6((type, format, parameters, arglist, argfunc, argarray),\n\t   int type,\n\t   TRIO_CONST char *format,\n\t   trio_parameter_t *parameters,\n\t   va_list arglist,\n\t   trio_argfunc_t argfunc,\n\t   trio_pointer_t *argarray)\n{\n  /* Count the number of times a parameter is referenced */\n  unsigned short usedEntries[MAX_PARAMETERS];\n  /* Parameter counters */\n  int parameterPosition;\n  int maxParam = -1;\n  /* Utility variables */\n  int offset;  /* Offset into formatting string */\n  BOOLEAN_T positional;  /* Does the specifier have a positional? */\n#if TRIO_FEATURE_STICKY\n  BOOLEAN_T gotSticky = FALSE;  /* Are there any sticky modifiers at all? */\n#endif\n  /*\n   * indices specifies the order in which the parameters must be\n   * read from the va_args (this is necessary to handle positionals)\n   */\n  int indices[MAX_PARAMETERS];\n  int pos = 0;\n  /* Various variables */\n#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)\n  int charlen;\n#endif\n  int save_errno;\n  int i = -1;\n  int num;\n  trio_parameter_t workParameter;\n  int status;\n\n  /* Both must be set or none must be set */\n  assert(((argfunc == NULL) && (argarray == NULL)) ||\n\t ((argfunc != NULL) && (argarray != NULL)));\n\n  /*\n   * The 'parameters' array is not initialized, but we need to\n   * know which entries we have used.\n   */\n  memset(usedEntries, 0, sizeof(usedEntries));\n\n  save_errno = errno;\n  offset = 0;\n  parameterPosition = 0;\n#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)\n  charlen = mblen(NULL, 0);\n#endif\n  \n  while (format[offset])\n    {\n      TrioInitializeParameter(&workParameter);\n\n#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)\n      if (! isascii(format[offset]))\n\t{\n\t  /*\n\t   * Multibyte characters cannot be legal specifiers or\n\t   * modifiers, so we skip over them.\n\t   */\n\t  charlen = mblen(&format[offset], MB_LEN_MAX);\n\t  offset += (charlen > 0) ? charlen : 1;\n\t  continue; /* while */\n\t}\n#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */\n\n      switch(format[offset++]) {\n\n      case CHAR_IDENTIFIER:\n\t{\n\t  if (CHAR_IDENTIFIER == format[offset])\n\t    {\n\t      /* skip double \"%\" */\n\t      offset++;\n\t      continue; /* while */\n\t    }\n\n\t  status = TrioParseQualifiers(type, format, offset, &workParameter);\n\t  if (status < 0)\n\t    return status; /* Return qualifier syntax error */\n\n\t  status = TrioParseSpecifier(type, format, workParameter.endOffset, &workParameter);\n\t  if (status < 0)\n\t    return status; /* Return specifier syntax error */\n\t}\n\tbreak;\n\n#if TRIO_EXTENSION\n      case CHAR_ALT_IDENTIFIER:\n\t{\n\t  status = TrioParseQualifiers(type, format, offset, &workParameter);\n\t  if (status < 0)\n\t    continue; /* False alert, not a user defined specifier */\n\n\t  status = TrioParseSpecifier(type, format, workParameter.endOffset, &workParameter);\n\t  if ((status < 0) || (FORMAT_USER_DEFINED != workParameter.type))\n\t    continue; /* False alert, not a user defined specifier */\n\t}\n\tbreak;\n#endif\n\n      default:\n\tcontinue; /* while */\n      }\n\n      /* now handle the parsed conversion specification */\n      positional = (NO_POSITION != workParameter.position);\n\n      /*\n       * Parameters only need the type and value. The value is\n       * read later.\n       */\n      if (workParameter.flags & FLAGS_WIDTH_PARAMETER)\n        {\n\t  if (workParameter.width == NO_WIDTH)\n\t    {\n\t      workParameter.width = parameterPosition++;\n\t    }\n\t  else\n\t    {\n\t      if (! positional)\n\t\t  workParameter.position = workParameter.width + 1;\n\t    }\n\n\t  usedEntries[workParameter.width] += 1;\n\t  if (workParameter.width > maxParam)\n\t    maxParam = workParameter.width;\n\t  parameters[pos].type = FORMAT_PARAMETER;\n\t  parameters[pos].flags = 0;\n\t  indices[workParameter.width] = pos;\n\t  workParameter.width = pos++;\n\t}\n      if (workParameter.flags & FLAGS_PRECISION_PARAMETER)\n\t{\n\t  if (workParameter.precision == NO_PRECISION)\n\t    {\n\t      workParameter.precision = parameterPosition++;\n\t    }\n\t  else\n\t    {\n\t      if (! positional)\n\t\t  workParameter.position = workParameter.precision + 1;\n\t    }\n\n\t  usedEntries[workParameter.precision] += 1;\n\t  if (workParameter.precision > maxParam)\n\t    maxParam = workParameter.precision;\n\t  parameters[pos].type = FORMAT_PARAMETER;\n\t  parameters[pos].flags = 0;\n\t  indices[workParameter.precision] = pos;\n\t  workParameter.precision = pos++;\n\t}\n      if (workParameter.flags & FLAGS_BASE_PARAMETER)\n\t{\n\t  if (workParameter.base == NO_BASE)\n\t    {\n\t      workParameter.base = parameterPosition++;\n\t    }\n\t  else\n\t    {\n\t      if (! positional)\n\t\t  workParameter.position = workParameter.base + 1;\n\t    }\n\n\t  usedEntries[workParameter.base] += 1;\n\t  if (workParameter.base > maxParam)\n\t    maxParam = workParameter.base;\n\t  parameters[pos].type = FORMAT_PARAMETER;\n\t  parameters[pos].flags = 0;\n\t  indices[workParameter.base] = pos;\n\t  workParameter.base = pos++;\n\t}\n#if TRIO_FEATURE_VARSIZE\n      if (workParameter.flags & FLAGS_VARSIZE_PARAMETER)\n\t{\n\t  workParameter.varsize = parameterPosition++;\n\n\t  usedEntries[workParameter.varsize] += 1;\n\t  if (workParameter.varsize > maxParam)\n\t    maxParam = workParameter.varsize;\n\t  parameters[pos].type = FORMAT_PARAMETER;\n\t  parameters[pos].flags = 0;\n\t  indices[workParameter.varsize] = pos;\n\t  workParameter.varsize = pos++;\n\t}\n#endif\n#if TRIO_FEATURE_USER_DEFINED\n      if (workParameter.flags & FLAGS_USER_DEFINED_PARAMETER)\n\t{\n\t  workParameter.user_defined.handler = parameterPosition++;\n\n\t  usedEntries[workParameter.user_defined.handler] += 1;\n\t  if (workParameter.user_defined.handler > maxParam)\n\t    maxParam = workParameter.user_defined.handler;\n\t  parameters[pos].type = FORMAT_PARAMETER;\n\t  parameters[pos].flags = FLAGS_USER_DEFINED;\n\t  indices[workParameter.user_defined.handler] = pos;\n\t  workParameter.user_defined.handler = pos++;\n\t}\n#endif\n\n      if (NO_POSITION == workParameter.position)\n\t{\n\t  workParameter.position = parameterPosition++;\n\t}\n\n      if (workParameter.position > maxParam)\n\tmaxParam = workParameter.position;\n\n      if (workParameter.position >= MAX_PARAMETERS)\n\t{\n\t  /* Bail out completely to make the error more obvious */\n\t  return TRIO_ERROR_RETURN(TRIO_ETOOMANY, offset);\n\t}\n\n      indices[workParameter.position] = pos;\n\n      /*  Count the number of times this entry has been used */\n      usedEntries[workParameter.position] += 1;\n\n      /* Find last sticky parameters */\n#if TRIO_FEATURE_STICKY\n      if (workParameter.flags & FLAGS_STICKY)\n\t{\n\t  gotSticky = TRUE;\n\t}\n      else if (gotSticky)\n\t{\n\t  for (i = pos - 1; i >= 0; i--)\n\t    {\n\t      if (parameters[i].type == FORMAT_PARAMETER)\n\t\tcontinue;\n\t      if ((parameters[i].flags & FLAGS_STICKY) &&\n\t\t  (parameters[i].type == workParameter.type))\n\t\t{\n\t\t  /* Do not overwrite current qualifiers */\n\t\t  workParameter.flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY);\n\t\t  if (workParameter.width == NO_WIDTH)\n\t\t    workParameter.width = parameters[i].width;\n\t\t  if (workParameter.precision == NO_PRECISION)\n\t\t    workParameter.precision = parameters[i].precision;\n\t\t  if (workParameter.base == NO_BASE)\n\t\t    workParameter.base = parameters[i].base;\n\t\t  break;\n\t\t}\n\t    }\n\t}\n#endif\n\n      if (workParameter.base == NO_BASE)\n\tworkParameter.base = BASE_DECIMAL;\n\n      offset = workParameter.endOffset;\n\n      TrioCopyParameter(&parameters[pos++], &workParameter);\n    } /* while format characters left */\n\n  parameters[pos].type = FORMAT_SENTINEL;  /* end parameter array with sentinel */\n  parameters[pos].beginOffset = offset;\n\n  for (num = 0; num <= maxParam; num++)\n    {\n      if (usedEntries[num] != 1)\n\t{\n\t  if (usedEntries[num] == 0) /* gap detected */\n\t    return TRIO_ERROR_RETURN(TRIO_EGAP, num);\n\t  else /* double references detected */\n\t    return TRIO_ERROR_RETURN(TRIO_EDBLREF, num);\n\t}\n      \n      i = indices[num];\n\n      /*\n       * FORMAT_PARAMETERS are only present if they must be read,\n       * so it makes no sense to check the ignore flag (besides,\n       * the flags variable is not set for that particular type)\n       */\n      if ((parameters[i].type != FORMAT_PARAMETER) &&\n\t  (parameters[i].flags & FLAGS_IGNORE))\n\tcontinue; /* for all arguments */\n\n      /*\n       * The stack arguments are read according to ANSI C89\n       * default argument promotions:\n       *\n       *  char           = int\n       *  short          = int\n       *  unsigned char  = unsigned int\n       *  unsigned short = unsigned int\n       *  float          = double\n       *\n       * In addition to the ANSI C89 these types are read (the\n       * default argument promotions of C99 has not been\n       * considered yet)\n       *\n       *  long long\n       *  long double\n       *  size_t\n       *  ptrdiff_t\n       *  intmax_t\n       */\n      switch (parameters[i].type)\n\t{\n\tcase FORMAT_GROUP:\n\tcase FORMAT_STRING:\n#if TRIO_FEATURE_WIDECHAR\n\t  if (parameters[i].flags & FLAGS_WIDECHAR)\n\t    {\n\t      parameters[i].data.wstring = (argfunc == NULL)\n\t\t? va_arg(arglist, trio_wchar_t *)\n                : (trio_wchar_t *)(argfunc(argarray, num, TRIO_TYPE_PWCHAR));\n\t    }\n\t  else\n#endif\n\t    {\n\t      parameters[i].data.string = (argfunc == NULL)\n\t\t? va_arg(arglist, char *)\n                : (char *)(argfunc(argarray, num, TRIO_TYPE_PCHAR));\n\t    }\n\t  break;\n\n#if TRIO_FEATURE_USER_DEFINED\n\tcase FORMAT_USER_DEFINED:\n#endif\n\tcase FORMAT_POINTER:\n\tcase FORMAT_COUNT:\n\tcase FORMAT_UNKNOWN:\n\t  parameters[i].data.pointer = (argfunc == NULL)\n\t    ? va_arg(arglist, trio_pointer_t )\n            : argfunc(argarray, num, TRIO_TYPE_POINTER);\n\t  break;\n\n\tcase FORMAT_CHAR:\n\tcase FORMAT_INT:\n#if TRIO_FEATURE_SCANF\n\t  if (TYPE_SCAN == type)\n\t    {\n              if (argfunc == NULL)\n                parameters[i].data.pointer =\n                  (trio_pointer_t)va_arg(arglist, trio_pointer_t);\n              else\n                {\n                  if (parameters[i].type == FORMAT_CHAR)\n                    parameters[i].data.pointer =\n                      (trio_pointer_t)((char *)argfunc(argarray, num, TRIO_TYPE_CHAR));\n                  else if (parameters[i].flags & FLAGS_SHORT)\n                    parameters[i].data.pointer =\n                      (trio_pointer_t)((short *)argfunc(argarray, num, TRIO_TYPE_SHORT));\n                  else\n                    parameters[i].data.pointer =\n                      (trio_pointer_t)((int *)argfunc(argarray, num, TRIO_TYPE_INT));\n                }\n\t    }\n\t  else\n#endif /* TRIO_FEATURE_SCANF */\n\t    {\n#if TRIO_FEATURE_VARSIZE || TRIO_FEATURE_FIXED_SIZE\n\t      if (parameters[i].flags\n\t\t  & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE))\n\t\t{\n\t\t  int varsize;\n\t\t  if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER)\n\t\t    {\n\t\t      /*\n\t\t       * Variable sizes are mapped onto the fixed sizes, in\n\t\t       * accordance with integer promotion.\n\t\t       *\n\t\t       * Please note that this may not be portable, as we\n\t\t       * only guess the size, not the layout of the numbers.\n\t\t       * For example, if int is little-endian, and long is\n\t\t       * big-endian, then this will fail.\n\t\t       */\n\t\t      varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned;\n\t\t    }\n\t\t  else\n\t\t    {\n\t\t      /* Used for the I<bits> modifiers */\n\t\t      varsize = parameters[i].varsize;\n\t\t    }\n\t\t  parameters[i].flags &= ~FLAGS_ALL_VARSIZES;\n\t\t  \n\t\t  if (varsize <= (int)sizeof(int))\n\t\t    ;\n\t\t  else if (varsize <= (int)sizeof(long))\n\t\t    parameters[i].flags |= FLAGS_LONG;\n#if TRIO_FEATURE_INTMAX_T\n\t\t  else if (varsize <= (int)sizeof(trio_longlong_t))\n\t\t    parameters[i].flags |= FLAGS_QUAD;\n\t\t  else\n\t\t    parameters[i].flags |= FLAGS_INTMAX_T;\n#else\n\t\t  else\n\t\t    parameters[i].flags |= FLAGS_QUAD;\n#endif\n\t\t}\n#endif /* TRIO_FEATURE_VARSIZE */\n#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER\n\t      if (parameters[i].flags & FLAGS_SIZE_T)\n\t\tparameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t\t  ? (trio_uintmax_t)va_arg(arglist, size_t)\n                  : (trio_uintmax_t)(*((size_t *)argfunc(argarray, num, TRIO_TYPE_SIZE)));\n\t      else\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\n\t      if (parameters[i].flags & FLAGS_PTRDIFF_T)\n\t\tparameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t\t  ? (trio_uintmax_t)va_arg(arglist, ptrdiff_t)\n                  : (trio_uintmax_t)(*((ptrdiff_t *)argfunc(argarray, num, TRIO_TYPE_PTRDIFF)));\n\t      else\n#endif\n#if TRIO_FEATURE_INTMAX_T\n\t      if (parameters[i].flags & FLAGS_INTMAX_T)\n\t\tparameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t\t  ? (trio_uintmax_t)va_arg(arglist, trio_intmax_t)\n                  : (trio_uintmax_t)(*((trio_intmax_t *)argfunc(argarray, num, TRIO_TYPE_UINTMAX)));\n\t      else\n#endif\n\t      if (parameters[i].flags & FLAGS_QUAD)\n\t\tparameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t\t  ? (trio_uintmax_t)va_arg(arglist, trio_ulonglong_t)\n                  : (trio_uintmax_t)(*((trio_ulonglong_t *)argfunc(argarray, num, TRIO_TYPE_ULONGLONG)));\n\t      else if (parameters[i].flags & FLAGS_LONG)\n\t\tparameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t\t  ? (trio_uintmax_t)va_arg(arglist, long)\n                  : (trio_uintmax_t)(*((long *)argfunc(argarray, num, TRIO_TYPE_LONG)));\n\t      else\n\t\t{\n\t\t  if (argfunc == NULL)\n\t\t    parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(arglist, int);\n\t\t  else\n\t\t    {\n\t\t      if (parameters[i].type == FORMAT_CHAR)\n\t\t\tparameters[i].data.number.as_unsigned =\n                          (trio_uintmax_t)(*((char *)argfunc(argarray, num, TRIO_TYPE_CHAR)));\n\t\t      else if (parameters[i].flags & FLAGS_SHORT)\n\t\t\tparameters[i].data.number.as_unsigned =\n                          (trio_uintmax_t)(*((short *)argfunc(argarray, num, TRIO_TYPE_SHORT)));\n\t\t      else\n\t\t\tparameters[i].data.number.as_unsigned =\n                          (trio_uintmax_t)(*((int *)argfunc(argarray, num, TRIO_TYPE_INT)));\n\t\t    }\n\t\t}\n\t    }\n\t  break;\n\n\tcase FORMAT_PARAMETER:\n\t  /*\n\t   * The parameter for the user-defined specifier is a pointer,\n\t   * whereas the rest (width, precision, base) uses an integer.\n\t   */\n\t  if (parameters[i].flags & FLAGS_USER_DEFINED)\n\t    parameters[i].data.pointer = (argfunc == NULL)\n\t      ? va_arg(arglist, trio_pointer_t )\n              : argfunc(argarray, num, TRIO_TYPE_POINTER);\n\t  else\n\t    parameters[i].data.number.as_unsigned = (argfunc == NULL)\n\t      ? (trio_uintmax_t)va_arg(arglist, int)\n              : (trio_uintmax_t)(*((int *)argfunc(argarray, num, TRIO_TYPE_INT)));\n\t  break;\n\n#if TRIO_FEATURE_FLOAT\n\tcase FORMAT_DOUBLE:\n# if TRIO_FEATURE_SCANF\n\t  if (TYPE_SCAN == type)\n\t    {\n\t      if (parameters[i].flags & FLAGS_LONGDOUBLE)\n\t\tparameters[i].data.longdoublePointer = (argfunc == NULL)\n\t\t  ? va_arg(arglist, trio_long_double_t *)\n                  : (trio_long_double_t *)argfunc(argarray, num, TRIO_TYPE_LONGDOUBLE);\n\t      else\n                {\n\t\t  if (parameters[i].flags & FLAGS_LONG)\n\t\t    parameters[i].data.doublePointer = (argfunc == NULL)\n\t\t      ? va_arg(arglist, double *)\n                      : (double *)argfunc(argarray, num, TRIO_TYPE_DOUBLE);\n\t\t  else\n\t\t    parameters[i].data.doublePointer = (argfunc == NULL)\n\t\t      ? (double *)va_arg(arglist, float *)\n                      : (double *)argfunc(argarray, num, TRIO_TYPE_DOUBLE);\n                }\n\t    }\n\t  else\n# endif /* TRIO_FEATURE_SCANF */\n\t    {\n\t      if (parameters[i].flags & FLAGS_LONGDOUBLE)\n\t\tparameters[i].data.longdoubleNumber = (argfunc == NULL)\n\t\t  ? va_arg(arglist, trio_long_double_t)\n                  : (trio_long_double_t)(*((trio_long_double_t *)argfunc(argarray, num, TRIO_TYPE_LONGDOUBLE)));\n\t      else\n\t\t{\n\t\t  if (argfunc == NULL)\n\t\t    parameters[i].data.longdoubleNumber =\n\t\t      (trio_long_double_t)va_arg(arglist, double);\n\t\t  else\n\t\t    {\n\t\t      if (parameters[i].flags & FLAGS_SHORT)\n\t\t\tparameters[i].data.longdoubleNumber =\n                          (trio_long_double_t)(*((float *)argfunc(argarray, num, TRIO_TYPE_FLOAT)));\n\t\t      else\n\t\t\tparameters[i].data.longdoubleNumber =\n                          (trio_long_double_t)(*((double *)argfunc(argarray, num, TRIO_TYPE_DOUBLE)));\n\t\t    }\n\t\t}\n\t    }\n\t  break;\n#endif /* TRIO_FEATURE_FLOAT */\n\n#if TRIO_FEATURE_ERRNO\n\tcase FORMAT_ERRNO:\n\t  parameters[i].data.errorNumber = save_errno;\n\t  break;\n#endif\n\n\tdefault:\n\t  break;\n\t}\n    } /* for all specifiers */\n  return num;\n}\n\n\n/*************************************************************************\n *\n * FORMATTING\n *\n ************************************************************************/\n\n\n/*************************************************************************\n * TrioWriteNumber\n *\n * Description:\n *  Output a number.\n *  The complexity of this function is a result of the complexity\n *  of the dependencies of the flags.\n */\nTRIO_PRIVATE void\nTrioWriteNumber\nTRIO_ARGS6((self, number, flags, width, precision, base),\n\t   trio_class_t *self,\n\t   trio_uintmax_t number,\n\t   trio_flags_t flags,\n\t   int width,\n\t   int precision,\n\t   int base)\n{\n  BOOLEAN_T isNegative;\n  BOOLEAN_T isNumberZero;\n  BOOLEAN_T isPrecisionZero;\n  BOOLEAN_T ignoreNumber;\n  char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1];\n  char *bufferend;\n  char *pointer;\n  TRIO_CONST char *digits;\n  int i;\n#if TRIO_FEATURE_QUOTE\n  int length;\n  char *p;\n#endif\n  int count;\n  int digitOffset;\n\n  assert(VALID(self));\n  assert(VALID(self->OutStream));\n  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));\n\n  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;\n  if (base == NO_BASE)\n    base = BASE_DECIMAL;\n\n  isNumberZero = (number == 0);\n  isPrecisionZero = (precision == 0);\n  ignoreNumber = (isNumberZero\n\t\t  && isPrecisionZero\n\t\t  && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL)));\n\n  if (flags & FLAGS_UNSIGNED)\n    {\n      isNegative = FALSE;\n      flags &= ~FLAGS_SHOWSIGN;\n    }\n  else\n    {\n      isNegative = ((trio_intmax_t)number < 0);\n      if (isNegative)\n\tnumber = -((trio_intmax_t)number);\n    }\n\n  if (flags & FLAGS_QUAD)\n    number &= (trio_ulonglong_t)-1;\n  else if (flags & FLAGS_LONG)\n    number &= (unsigned long)-1;\n  else\n    number &= (unsigned int)-1;\n  \n  /* Build number */\n  pointer = bufferend = &buffer[sizeof(buffer) - 1];\n  *pointer-- = NIL;\n  for (i = 1; i < (int)sizeof(buffer); i++)\n    {\n      digitOffset = number % base;\n      *pointer-- = digits[digitOffset];\n      number /= base;\n      if (number == 0)\n\tbreak;\n\n#if TRIO_FEATURE_QUOTE\n      if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1))\n\t{\n\t  /*\n\t   * We are building the number from the least significant\n\t   * to the most significant digit, so we have to copy the\n\t   * thousand separator backwards\n\t   */\n\t  length = internalThousandSeparatorLength;\n\t  if (((int)(pointer - buffer) - length) > 0)\n\t    {\n\t      p = &internalThousandSeparator[length - 1];\n\t      while (length-- > 0)\n\t\t*pointer-- = *p--;\n\t    }\n\t}\n#endif\n    }\n\n  if (! ignoreNumber)\n    {\n      /* Adjust width */\n      width -= (bufferend - pointer) - 1;\n    }\n\n  /* Adjust precision */\n  if (NO_PRECISION != precision)\n    {\n      precision -= (bufferend - pointer) - 1;\n      if (precision < 0)\n\tprecision = 0;\n      flags |= FLAGS_NILPADDING;\n    }\n\n  /* Calculate padding */\n  count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION)))\n    ? precision\n    : 0;\n  \n  /* Adjust width further */\n  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))\n    width--;\n  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)\n    {\n      switch (base)\n\t{\n\tcase BASE_BINARY:\n\tcase BASE_HEX:\n\t  width -= 2;\n\t  break;\n\tcase BASE_OCTAL:\n\t  if (!(flags & FLAGS_NILPADDING) || (count == 0))\n\t    width--;\n\t  break;\n\tdefault:\n\t  break;\n\t}\n    }\n\n  /* Output prefixes spaces if needed */\n  if (! ((flags & FLAGS_LEFTADJUST) ||\n\t ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION))))\n    {\n      while (width-- > count)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n\n  /* width has been adjusted for signs and alternatives */\n  if (isNegative)\n    self->OutStream(self, '-');\n  else if (flags & FLAGS_SHOWSIGN)\n    self->OutStream(self, '+');\n  else if (flags & FLAGS_SPACE)\n    self->OutStream(self, ' ');\n\n  /* Prefix is not written when the value is zero */\n  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)\n    {\n      switch (base)\n\t{\n\tcase BASE_BINARY:\n\t  self->OutStream(self, '0');\n\t  self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b');\n\t  break;\n\n\tcase BASE_OCTAL:\n\t  if (!(flags & FLAGS_NILPADDING) || (count == 0))\n\t    self->OutStream(self, '0');\n\t  break;\n\n\tcase BASE_HEX:\n\t  self->OutStream(self, '0');\n\t  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');\n\t  break;\n\n\tdefault:\n\t  break;\n\t} /* switch base */\n    }\n\n  /* Output prefixed zero padding if needed */\n  if (flags & FLAGS_NILPADDING)\n    {\n      if (precision == NO_PRECISION)\n\tprecision = width;\n      while (precision-- > 0)\n\t{\n\t  self->OutStream(self, '0');\n\t  width--;\n\t}\n    }\n\n  if (! ignoreNumber)\n    {\n      /* Output the number itself */\n      while (*(++pointer))\n\t{\n\t  self->OutStream(self, *pointer);\n\t}\n    }\n\n  /* Output trailing spaces if needed */\n  if (flags & FLAGS_LEFTADJUST)\n    {\n      while (width-- > 0)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n}\n\n/*************************************************************************\n * TrioWriteStringCharacter\n *\n * Description:\n *  Output a single character of a string\n */\nTRIO_PRIVATE void\nTrioWriteStringCharacter\nTRIO_ARGS3((self, ch, flags),\n\t   trio_class_t *self,\n\t   int ch,\n\t   trio_flags_t flags)\n{\n  if (flags & FLAGS_ALTERNATIVE)\n    {\n      if (! isprint(ch))\n\t{\n\t  /*\n\t   * Non-printable characters are converted to C escapes or\n\t   * \\number, if no C escape exists.\n\t   */\n\t  self->OutStream(self, CHAR_BACKSLASH);\n\t  switch (ch)\n\t    {\n\t    case '\\007': self->OutStream(self, 'a'); break;\n\t    case '\\b': self->OutStream(self, 'b'); break;\n\t    case '\\f': self->OutStream(self, 'f'); break;\n\t    case '\\n': self->OutStream(self, 'n'); break;\n\t    case '\\r': self->OutStream(self, 'r'); break;\n\t    case '\\t': self->OutStream(self, 't'); break;\n\t    case '\\v': self->OutStream(self, 'v'); break;\n\t    case '\\\\': self->OutStream(self, '\\\\'); break;\n\t    default:\n\t      self->OutStream(self, 'x');\n\t      TrioWriteNumber(self, (trio_uintmax_t)ch,\n\t\t\t      FLAGS_UNSIGNED | FLAGS_NILPADDING,\n\t\t\t      2, 2, BASE_HEX);\n\t      break;\n\t    }\n\t}\n      else if (ch == CHAR_BACKSLASH)\n\t{\n\t  self->OutStream(self, CHAR_BACKSLASH);\n\t  self->OutStream(self, CHAR_BACKSLASH);\n\t}\n      else\n\t{\n\t  self->OutStream(self, ch);\n\t}\n    }\n  else\n    {\n      self->OutStream(self, ch);\n    }\n}\n\n/*************************************************************************\n * TrioWriteString\n *\n * Description:\n *  Output a string\n */\nTRIO_PRIVATE void\nTrioWriteString\nTRIO_ARGS5((self, string, flags, width, precision),\n\t   trio_class_t *self,\n\t   TRIO_CONST char *string,\n\t   trio_flags_t flags,\n\t   int width,\n\t   int precision)\n{\n  int length;\n  int ch;\n\n  assert(VALID(self));\n  assert(VALID(self->OutStream));\n\n  if (string == NULL)\n    {\n      string = internalNullString;\n      length = sizeof(internalNullString) - 1;\n#if TRIO_FEATURE_QUOTE\n      /* Disable quoting for the null pointer */\n      flags &= (~FLAGS_QUOTE);\n#endif\n      width = 0;\n    }\n  else\n    {\n      if (precision == 0)\n\t{\n\t  length = trio_length(string);\n\t}\n      else\n\t{\n\t  length = trio_length_max(string, precision);\n\t}\n    }\n  if ((NO_PRECISION != precision) &&\n      (precision < length))\n    {\n      length = precision;\n    }\n  width -= length;\n\n#if TRIO_FEATURE_QUOTE\n  if (flags & FLAGS_QUOTE)\n    self->OutStream(self, CHAR_QUOTE);\n#endif\n\n  if (! (flags & FLAGS_LEFTADJUST))\n    {\n      while (width-- > 0)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n\n  while (length-- > 0)\n    {\n      /* The ctype parameters must be an unsigned char (or EOF) */\n      ch = (int)((unsigned char)(*string++));\n      TrioWriteStringCharacter(self, ch, flags);\n    }\n\n  if (flags & FLAGS_LEFTADJUST)\n    {\n      while (width-- > 0)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n#if TRIO_FEATURE_QUOTE\n  if (flags & FLAGS_QUOTE)\n    self->OutStream(self, CHAR_QUOTE);\n#endif\n}\n\n/*************************************************************************\n * TrioWriteWideStringCharacter\n *\n * Description:\n *  Output a wide string as a multi-byte sequence\n */\n#if TRIO_FEATURE_WIDECHAR\nTRIO_PRIVATE int\nTrioWriteWideStringCharacter\nTRIO_ARGS4((self, wch, flags, width),\n\t   trio_class_t *self,\n\t   trio_wchar_t wch,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int size;\n  int i;\n  int ch;\n  char *string;\n  char buffer[MB_LEN_MAX + 1];\n\n  if (width == NO_WIDTH)\n    width = sizeof(buffer);\n  \n  size = wctomb(buffer, wch);\n  if ((size <= 0) || (size > width) || (buffer[0] == NIL))\n    return 0;\n\n  string = buffer;\n  i = size;\n  while ((width >= i) && (width-- > 0) && (i-- > 0))\n    {\n      /* The ctype parameters must be an unsigned char (or EOF) */\n      ch = (int)((unsigned char)(*string++));\n      TrioWriteStringCharacter(self, ch, flags);\n    }\n  return size;\n}\n#endif /* TRIO_FEATURE_WIDECHAR */\n\n/*************************************************************************\n * TrioWriteWideString\n *\n * Description:\n *  Output a wide character string as a multi-byte string\n */\n#if TRIO_FEATURE_WIDECHAR\nTRIO_PRIVATE void\nTrioWriteWideString\nTRIO_ARGS5((self, wstring, flags, width, precision),\n\t   trio_class_t *self,\n\t   TRIO_CONST trio_wchar_t *wstring,\n\t   trio_flags_t flags,\n\t   int width,\n\t   int precision)\n{\n  int length;\n  int size;\n\n  assert(VALID(self));\n  assert(VALID(self->OutStream));\n\n#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)\n  /* Required by TrioWriteWideStringCharacter */\n  (void)mblen(NULL, 0);\n#endif\n  \n  if (wstring == NULL)\n    {\n      TrioWriteString(self, NULL, flags, width, precision);\n      return;\n    }\n  \n  if (NO_PRECISION == precision)\n    {\n      length = INT_MAX;\n    }\n  else\n    {\n      length = precision;\n      width -= length;\n    }\n\n#if TRIO_FEATURE_QUOTE\n  if (flags & FLAGS_QUOTE)\n    self->OutStream(self, CHAR_QUOTE);\n#endif\n\n  if (! (flags & FLAGS_LEFTADJUST))\n    {\n      while (width-- > 0)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n\n  while (length > 0)\n    {\n      size = TrioWriteWideStringCharacter(self, *wstring++, flags, length);\n      if (size == 0)\n\tbreak; /* while */\n      length -= size;\n    }\n\n  if (flags & FLAGS_LEFTADJUST)\n    {\n      while (width-- > 0)\n\tself->OutStream(self, CHAR_ADJUST);\n    }\n#if TRIO_FEATURE_QUOTE\n  if (flags & FLAGS_QUOTE)\n    self->OutStream(self, CHAR_QUOTE);\n#endif\n}\n#endif /* TRIO_FEATURE_WIDECHAR */\n\n/*************************************************************************\n * TrioWriteDouble\n *\n * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm\n *\n * \"5.2.4.2.2 paragraph #4\n *\n *  The accuracy [...] is implementation defined, as is the accuracy\n *  of the conversion between floating-point internal representations\n *  and string representations performed by the libray routine in\n *  <stdio.h>\"\n */\n/* FIXME: handle all instances of constant long-double number (L)\n *   and *l() math functions.\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PRIVATE void\nTrioWriteDouble\nTRIO_ARGS6((self, number, flags, width, precision, base),\n\t   trio_class_t *self,\n\t   trio_long_double_t number,\n\t   trio_flags_t flags,\n\t   int width,\n\t   int precision,\n\t   int base)\n{\n  trio_long_double_t integerNumber;\n  trio_long_double_t fractionNumber;\n  trio_long_double_t workNumber;\n  int integerDigits;\n  int fractionDigits;\n  int exponentDigits;\n  int workDigits;\n  int baseDigits;\n  int integerThreshold;\n  int fractionThreshold;\n  int expectedWidth;\n  int exponent = 0;\n  unsigned int uExponent = 0;\n  int exponentBase;\n  trio_long_double_t dblBase;\n  trio_long_double_t dblFractionBase;\n  trio_long_double_t integerAdjust;\n  trio_long_double_t fractionAdjust;\n  trio_long_double_t workFractionNumber;\n  trio_long_double_t workFractionAdjust;\n  int fractionDigitsInspect;\n  BOOLEAN_T isNegative;\n  BOOLEAN_T isExponentNegative = FALSE;\n  BOOLEAN_T requireTwoDigitExponent;\n  BOOLEAN_T isHex;\n  TRIO_CONST char *digits;\n# if TRIO_FEATURE_QUOTE\n  char *groupingPointer;\n# endif\n  int i;\n  int offset;\n  BOOLEAN_T hasOnlyZeroes;\n  int leadingFractionZeroes = -1;\n  register int trailingZeroes;\n  BOOLEAN_T keepTrailingZeroes;\n  BOOLEAN_T keepDecimalPoint;\n  trio_long_double_t epsilon;\n  trio_long_double_t epsilonCorrection;\n  BOOLEAN_T adjustNumber = FALSE;\n  \n  assert(VALID(self));\n  assert(VALID(self->OutStream));\n  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));\n\n  /* Determine sign and look for special quantities */\n  switch (trio_fpclassify_and_signbit(number, &isNegative))\n    {\n    case TRIO_FP_NAN:\n      TrioWriteString(self,\n\t\t      (flags & FLAGS_UPPER)\n\t\t      ? NAN_UPPER\n\t\t      : NAN_LOWER,\n\t\t      flags, width, precision);\n      return;\n      \n    case TRIO_FP_INFINITE:\n      if (isNegative)\n\t{\n\t  /* Negative infinity */\n\t  TrioWriteString(self,\n\t\t\t  (flags & FLAGS_UPPER)\n\t\t\t  ? \"-\" INFINITE_UPPER\n\t\t\t  : \"-\" INFINITE_LOWER,\n\t\t\t  flags, width, precision);\n\t  return;\n\t}\n      else\n\t{\n\t  /* Positive infinity */\n\t  TrioWriteString(self,\n\t\t\t  (flags & FLAGS_UPPER)\n\t\t\t  ? INFINITE_UPPER\n\t\t\t  : INFINITE_LOWER,\n\t\t\t  flags, width, precision);\n\t  return;\n\t}\n\n    default:\n      /* Finitude */\n      break;\n    }\n  \n  /* Normal numbers */\n  if (flags & FLAGS_LONGDOUBLE)\n    {\n      baseDigits = (base == 10)\n\t? LDBL_DIG\n\t: (int)trio_floor(LDBL_MANT_DIG / TrioLogarithmBase(base));\n      epsilon = LDBL_EPSILON;\n    }\n  else if (flags & FLAGS_SHORT)\n    {\n      baseDigits = (base == BASE_DECIMAL)\n\t? FLT_DIG\n\t: (int)trio_floor(FLT_MANT_DIG / TrioLogarithmBase(base));\n      epsilon = FLT_EPSILON;\n    }\n  else\n    {\n      baseDigits = (base == BASE_DECIMAL)\n\t? DBL_DIG\n\t: (int)trio_floor(DBL_MANT_DIG / TrioLogarithmBase(base));\n      epsilon = DBL_EPSILON;\n    }\n\n  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;\n  isHex = (base == BASE_HEX);\n  if (base == NO_BASE)\n    base = BASE_DECIMAL;\n  dblBase = (trio_long_double_t)base;\n  /*\n   * Some log10() functions can \"err by almost 3 ulps\" according to\n   * http://www.cs.berkeley.edu/~wkahan/LOG10HAF.TXT\n   */\n  epsilonCorrection = 3 * epsilon;\n  keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) ||\n\t\t\t  ( (flags & FLAGS_FLOAT_G) &&\n\t\t\t    !(flags & FLAGS_ALTERNATIVE) ) );\n\n# if TRIO_FEATURE_ROUNDING\n  if (flags & FLAGS_ROUNDING)\n    {\n      precision = baseDigits;\n    }\n# endif\n\n  if (precision == NO_PRECISION)\n    {\n      if (isHex)\n\t{\n\t  keepTrailingZeroes = FALSE;\n\t  precision = FLT_MANT_DIG;\n\t}\n      else\n\t{\n\t  precision = FLT_DIG;\n\t}\n    }\n  \n  if (isNegative)\n    {\n      number = -number;\n    }\n\n  if (isHex)\n    {\n      flags |= FLAGS_FLOAT_E;\n    }\n\n reprocess:\n\n  if (flags & FLAGS_FLOAT_G)\n    {\n      if (precision == 0)\n\tprecision = 1;\n\n      if ( (number < TRIO_SUFFIX_LONG(1.0E-4)) ||\n\t   (number >= TrioPower(base, (trio_long_double_t)precision)) )\n\t{\n\t  /* Use scientific notation */\n\t  flags |= FLAGS_FLOAT_E;\n\t}\n      else if (number < 1.0)\n\t{\n\t  /*\n\t   * Use normal notation. If the integer part of the number is\n\t   * zero, then adjust the precision to include leading fractional\n\t   * zeros.\n\t   */\n\t  workNumber = TrioLogarithm(number, base);\n\t  workNumber = TRIO_FABS(workNumber);\n\t  if (workNumber - trio_floor(workNumber) < epsilon)\n\t    workNumber--;\n\t  leadingFractionZeroes = (int)trio_floor(workNumber);\n\t}\n    }\n\n  if (flags & FLAGS_FLOAT_E)\n    {\n      /* Scale the number */\n      workNumber = TrioLogarithm(number, base);\n      if (trio_isinf(workNumber) == -1)\n\t{\n\t  exponent = 0;\n\t  /* Undo setting */\n\t  if (flags & FLAGS_FLOAT_G)\n\t    flags &= ~FLAGS_FLOAT_E;\n\t}\n      else\n\t{\n\t  exponent = (int)trio_floor(workNumber + epsilonCorrection);\n\t  workNumber = number;\n\t  /*\n           * We want to apply A / 10^B but the equivalent A * 10^-B gives better\n           * accuracy on platforms with true long double support.\n\t   */\n#if defined(TRIO_DOUBLE_DOUBLE)\n\t  workNumber /= TrioPower(dblBase, (trio_long_double_t)exponent);\n#else\n\t  workNumber *= TrioPower(dblBase, (trio_long_double_t)-exponent);\n#endif\n\t  if (trio_isinf(workNumber)) {\n\t    /*\n\t     * Scaling is done it two steps to avoid problems with subnormal\n\t     * numbers.\n\t     */\n\t    workNumber /= TrioPower(dblBase, (trio_long_double_t)(exponent / 2));\n\t    workNumber /= TrioPower(dblBase, (trio_long_double_t)(exponent - (exponent / 2)));\n\t  }\n\t  number = workNumber;\n\t  isExponentNegative = (exponent < 0);\n\t  uExponent = (isExponentNegative) ? -exponent : exponent;\n\t  if (isHex)\n\t    uExponent *= 4; /* log16(2) */\n#if TRIO_FEATURE_QUOTE\n\t  /* No thousand separators */\n\t  flags &= ~FLAGS_QUOTE;\n#endif\n\t}\n    }\n\n  integerNumber = trio_floor(number);\n  fractionNumber = number - integerNumber;\n\n  /*\n   * Truncated number.\n   *\n   * Precision is number of significant digits for FLOAT_G and number of\n   * fractional digits for others.\n   */\n  integerDigits = 1;\n  if (integerNumber > epsilon)\n    {\n      integerDigits += (int)(TrioLogarithm(integerNumber, base) + epsilonCorrection);\n    }\n\n  fractionDigits = precision;\n  if (flags & FLAGS_FLOAT_G)\n    {\n      if (leadingFractionZeroes > 0)\n\t{\n\t  fractionDigits += leadingFractionZeroes;\n\t}\n      if ((integerNumber > epsilon) || (number <= epsilon))\n\t{\n\t  fractionDigits -= integerDigits;\n\t}\n    }\n\n  dblFractionBase = TrioPower(base, fractionDigits);\n\n  if (integerNumber < 1.0)\n    {\n      workNumber = number * dblFractionBase + TRIO_SUFFIX_LONG(0.5);\n      if (trio_floor(number * dblFractionBase) != trio_floor(workNumber))\n\t{\n\t  adjustNumber = TRUE;\n\t  /* Remove a leading fraction zero if fraction is rounded up */\n\t  if ((int)(TrioLogarithm(number * dblFractionBase, base) + epsilonCorrection) !=\n              (int)(TrioLogarithm(workNumber, base) + epsilonCorrection))\n\t    {\n\t      --leadingFractionZeroes;\n\t    }\n\t}\n      workNumber /= dblFractionBase;\n    }\n  else\n    {\n      workNumber = number + TRIO_SUFFIX_LONG(0.5) / dblFractionBase;\n      adjustNumber = (trio_floor(number) != trio_floor(workNumber));\n    }\n  if (adjustNumber)\n    {\n      if ((flags & FLAGS_FLOAT_G) && !(flags & FLAGS_FLOAT_E))\n\t{\n\t  /* The adjustment may require a change to scientific notation */\n\t  if ( (workNumber < TRIO_SUFFIX_LONG(1.0E-4)) ||\n\t       (workNumber >= TrioPower(base, (trio_long_double_t)precision)) )\n\t    {\n\t      /* Use scientific notation */\n\t      flags |= FLAGS_FLOAT_E;\n\t      goto reprocess;\n\t    }\n\t}\n      \n      if (flags & FLAGS_FLOAT_E)\n\t{\n\t  workDigits = 1 + (TrioLogarithm(trio_floor(workNumber), base) + epsilonCorrection);\n\t  if (integerDigits == workDigits)\n\t    {\n\t      /* Adjust if the same number of digits are used */\n\t      number += TRIO_SUFFIX_LONG(0.5) / dblFractionBase;\n\t      integerNumber = trio_floor(number);\n\t      fractionNumber = number - integerNumber;\n\t    }\n\t  else\n\t    {\n\t      /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */\n\t      exponent++;\n\t      isExponentNegative = (exponent < 0);\n\t      uExponent = (isExponentNegative) ? -exponent : exponent;\n\t      if (isHex)\n\t\tuExponent *= 4; /* log16(2) */\n\t      workNumber = (number + TRIO_SUFFIX_LONG(0.5) / dblFractionBase) / dblBase;\n\t      integerNumber = trio_floor(workNumber);\n\t      fractionNumber = workNumber - integerNumber;\n\t    }\n\t}\n      else\n\t{\n\t  if (workNumber > 1.0)\n\t    {\n\t      /* Adjust if number was rounded up one digit (ie. 99 to 100) */\n\t      integerNumber = trio_floor(workNumber);\n\t      fractionNumber = 0.0;\n\t      integerDigits = (integerNumber > epsilon)\n\t\t? 1 + (int)(TrioLogarithm(integerNumber, base) + epsilonCorrection)\n\t\t: 1;\n\t      if (flags & FLAGS_FLOAT_G)\n\t\t{\n\t\t  if (flags & FLAGS_ALTERNATIVE)\n\t\t    {\n\t\t      fractionDigits = precision;\n\t\t      if ((integerNumber > epsilon) || (number <= epsilon))\n\t\t\t{\n\t\t\t  fractionDigits -= integerDigits;\n\t\t\t}\n\t\t    }\n\t\t  else\n\t\t    {\n\t\t      fractionDigits = 0;\n\t\t    }\n\t\t}\n\t    }\n\t  else\n\t    {\n\t      integerNumber = trio_floor(workNumber);\n\t      fractionNumber = workNumber - integerNumber;\n\t      if (flags & FLAGS_FLOAT_G)\n\t\t{\n\t\t  if (flags & FLAGS_ALTERNATIVE)\n\t\t    {\n\t\t      fractionDigits = precision;\n\t\t      if (leadingFractionZeroes > 0)\n\t\t\t{\n\t\t\t  fractionDigits += leadingFractionZeroes;\n\t\t\t}\n\t\t      if ((integerNumber > epsilon) || (number <= epsilon))\n\t\t\t{\n\t\t\t  fractionDigits -= integerDigits;\n\t\t\t}\n\t\t    }\n\t\t}\n\t    }\n\t}\n    }\n\n  /* Estimate accuracy */\n  integerAdjust = fractionAdjust = TRIO_SUFFIX_LONG(0.5);\n# if TRIO_FEATURE_ROUNDING\n  if (flags & FLAGS_ROUNDING)\n    {\n      if (integerDigits > baseDigits)\n\t{\n\t  integerThreshold = baseDigits;\n\t  fractionDigits = 0;\n\t  dblFractionBase = 1.0;\n\t  fractionThreshold = 0;\n\t  precision = 0; /* Disable decimal-point */\n\t  integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1);\n\t  fractionAdjust = 0.0;\n\t}\n      else\n\t{\n\t  integerThreshold = integerDigits;\n\t  fractionThreshold = fractionDigits - integerThreshold;\n\t  fractionAdjust = 1.0;\n\t}\n    }\n  else\n# endif\n    {\n      integerThreshold = INT_MAX;\n      fractionThreshold = INT_MAX;\n    }\n  \n  /*\n   * Calculate expected width.\n   *  sign + integer part + thousands separators + decimal point\n   *  + fraction + exponent\n   */\n  fractionAdjust /= dblFractionBase;\n  hasOnlyZeroes = (trio_floor((fractionNumber + fractionAdjust) *\n\t\t\t       dblFractionBase) < epsilon);\n  keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) ||\n\t\t       !((precision == 0) ||\n\t\t\t (!keepTrailingZeroes && hasOnlyZeroes)) );\n\n  expectedWidth = integerDigits + fractionDigits;\n\n  if (!keepTrailingZeroes)\n    {\n      trailingZeroes = 0;\n      workFractionNumber = fractionNumber;\n      workFractionAdjust = fractionAdjust;\n      fractionDigitsInspect = fractionDigits;\n\n      if (integerDigits > integerThreshold)\n\t{\n\t  fractionDigitsInspect = 0;\n\t}\n      else if (fractionThreshold  <= fractionDigits)\n\t{\n\t  fractionDigitsInspect = fractionThreshold + 1;\n\t}\n\n      trailingZeroes = fractionDigits - fractionDigitsInspect;\n      for (i = 0; i < fractionDigitsInspect; i++)\n\t{\n\t  workFractionNumber *= dblBase;\n\t  workFractionAdjust *= dblBase;\n\t  workNumber = trio_floor(workFractionNumber + workFractionAdjust);\n\t  workFractionNumber -= workNumber;\n\t  offset = (int)trio_fmod(workNumber, dblBase);\n\t  if (offset == 0)\n\t    {\n\t      trailingZeroes++;\n\t    }\n\t  else\n\t    {\n\t      trailingZeroes = 0;\n\t    }\n\t}\n      expectedWidth -= trailingZeroes;\n    }\n  \n  if (keepDecimalPoint)\n    {\n      expectedWidth += internalDecimalPointLength;\n    }\n  \n#if TRIO_FEATURE_QUOTE\n  if (flags & FLAGS_QUOTE)\n    {\n      expectedWidth += TrioCalcThousandSeparatorLength(integerDigits);\n    }\n#endif\n  \n  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))\n    {\n      expectedWidth += sizeof(\"-\") - 1;\n    }\n  \n  exponentDigits = 0;\n  if (flags & FLAGS_FLOAT_E)\n    {\n      exponentDigits = (uExponent == 0)\n\t? 1\n\t: (int)trio_ceil(TrioLogarithm((double)(uExponent + 1),\n\t\t\t\t       (isHex) ? 10 : base));\n    }\n  requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1));\n  if (exponentDigits > 0)\n    {\n      expectedWidth += exponentDigits;\n      expectedWidth += (requireTwoDigitExponent\n\t\t\t? sizeof(\"E+0\") - 1\n\t\t\t: sizeof(\"E+\") - 1);\n    }\n  \n  if (isHex)\n    {\n      expectedWidth += sizeof(\"0X\") - 1;\n    }\n  \n  /* Output prefixing */\n  if (flags & FLAGS_NILPADDING)\n    {\n      /* Leading zeros must be after sign */\n      if (isNegative)\n\tself->OutStream(self, '-');\n      else if (flags & FLAGS_SHOWSIGN)\n\tself->OutStream(self, '+');\n      else if (flags & FLAGS_SPACE)\n\tself->OutStream(self, ' ');\n      if (isHex)\n\t{\n\t  self->OutStream(self, '0');\n\t  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');\n\t}\n      if (!(flags & FLAGS_LEFTADJUST))\n\t{\n\t  for (i = expectedWidth; i < width; i++)\n\t    {\n\t      self->OutStream(self, '0');\n\t    }\n\t}\n    }\n  else\n    {\n      /* Leading spaces must be before sign */\n      if (!(flags & FLAGS_LEFTADJUST))\n\t{\n\t  for (i = expectedWidth; i < width; i++)\n\t    {\n\t      self->OutStream(self, CHAR_ADJUST);\n\t    }\n\t}\n      if (isNegative)\n\tself->OutStream(self, '-');\n      else if (flags & FLAGS_SHOWSIGN)\n\tself->OutStream(self, '+');\n      else if (flags & FLAGS_SPACE)\n\tself->OutStream(self, ' ');\n      if (isHex)\n\t{\n\t  self->OutStream(self, '0');\n\t  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');\n\t}\n    }\n  \n  /* Output the integer part and thousand separators */\n  for (i = 0; i < integerDigits; i++)\n    {\n      workNumber = trio_floor(((integerNumber + integerAdjust)\n\t\t\t       / TrioPower(base, integerDigits - i - 1)));\n      if (i > integerThreshold)\n\t{\n\t  /* Beyond accuracy */\n\t  self->OutStream(self, digits[0]);\n\t}\n      else\n\t{\n\t  self->OutStream(self, digits[(int)trio_fmod(workNumber, dblBase)]);\n\t}\n\n#if TRIO_FEATURE_QUOTE\n      if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE)\n\t  && TrioFollowedBySeparator(integerDigits - i))\n\t{\n\t  for (groupingPointer = internalThousandSeparator;\n\t       *groupingPointer != NIL;\n\t       groupingPointer++)\n\t    {\n\t      self->OutStream(self, *groupingPointer);\n\t    }\n\t}\n#endif\n    }\n  \n  /* Insert decimal point and build the fraction part */\n  trailingZeroes = 0;\n\n  if (keepDecimalPoint)\n    {\n      if (internalDecimalPoint)\n\t{\n\t  self->OutStream(self, internalDecimalPoint);\n\t}\n      else\n\t{\n\t  for (i = 0; i < internalDecimalPointLength; i++)\n\t    {\n\t      self->OutStream(self, internalDecimalPointString[i]);\n\t    }\n\t}\n    }\n\n  for (i = 0; i < fractionDigits; i++)\n    {\n      if ((integerDigits > integerThreshold) || (i > fractionThreshold))\n\t{\n\t  /* Beyond accuracy */\n\t  trailingZeroes++;\n\t}\n      else\n\t{\n\t  fractionNumber *= dblBase;\n\t  fractionAdjust *= dblBase;\n\t  workNumber = trio_floor(fractionNumber + fractionAdjust);\n\t  if (workNumber > fractionNumber)\n\t    {\n\t      /* fractionNumber should never become negative */\n\t      fractionNumber = 0.0;\n\t      fractionAdjust = 0.0;\n\t    }\n\t  else\n\t    {\n\t      fractionNumber -= workNumber;\n\t    }\n\t  offset = (int)trio_fmod(workNumber, dblBase);\n\t  if (offset == 0)\n\t    {\n\t      trailingZeroes++;\n\t    }\n\t  else\n\t    {\n\t      while (trailingZeroes > 0)\n\t\t{\n\t\t  /* Not trailing zeroes after all */\n\t\t  self->OutStream(self, digits[0]);\n\t\t  trailingZeroes--;\n\t\t}\n\t      self->OutStream(self, digits[offset]);\n\t    }\n\t}\n    }\n  \n  if (keepTrailingZeroes)\n    {\n      while (trailingZeroes > 0)\n\t{\n\t  self->OutStream(self, digits[0]);\n\t  trailingZeroes--;\n\t}\n    }\n  \n  /* Output exponent */\n  if (exponentDigits > 0)\n    {\n      self->OutStream(self,\n\t\t      isHex\n\t\t      ? ((flags & FLAGS_UPPER) ? 'P' : 'p')\n\t\t      : ((flags & FLAGS_UPPER) ? 'E' : 'e'));\n      self->OutStream(self, (isExponentNegative) ? '-' : '+');\n\n      /* The exponent must contain at least two digits */\n      if (requireTwoDigitExponent)\n        self->OutStream(self, '0');\n\n      if (isHex)\n\tbase = 10;\n      exponentBase = (int)TrioPower(base, exponentDigits - 1);\n      for (i = 0; i < exponentDigits; i++)\n\t{\n\t  self->OutStream(self, digits[(uExponent / exponentBase) % base]);\n\t  exponentBase /= base;\n\t}\n    }\n  /* Output trailing spaces */\n  if (flags & FLAGS_LEFTADJUST)\n    {\n      for (i = expectedWidth; i < width; i++)\n\t{\n\t  self->OutStream(self, CHAR_ADJUST);\n\t}\n    }\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * TrioFormatProcess\n *\n * Description:\n *  This is the main engine for formatting output\n */\nTRIO_PRIVATE int\nTrioFormatProcess\nTRIO_ARGS3((data, format, parameters),\n\t   trio_class_t *data,\n\t   TRIO_CONST char *format,\n\t   trio_parameter_t *parameters)\n{\n  int i;\n#if TRIO_FEATURE_ERRNO\n  TRIO_CONST char *string;\n#endif\n  trio_pointer_t pointer;\n  trio_flags_t flags;\n  int width;\n  int precision;\n  int base;\n  int offset;\n  \n  offset = 0;\n  i = 0;\n\n  for (;;)\n    {\n      /* Skip the parameter entries */\n      while (parameters[i].type == FORMAT_PARAMETER)\n\ti++;\n\n      /* Copy non conversion-specifier part of format string */\n      while (offset < parameters[i].beginOffset)\n        {\n\t  if (CHAR_IDENTIFIER == format[offset] && CHAR_IDENTIFIER == format[offset + 1])\n\t    {\n\t      data->OutStream(data, CHAR_IDENTIFIER);\n\t      offset += 2;\n\t    }\n\t  else\n\t    {\n\t      data->OutStream(data, format[offset++]);\n\t    }\n\t}\n\n      /* Abort if we reached end of format string */\n      if (parameters[i].type == FORMAT_SENTINEL)\n\tbreak;\n\n      /* Ouput parameter */\n      flags = parameters[i].flags;\n\n      /* Find width */\n      width = parameters[i].width;\n      if (flags & FLAGS_WIDTH_PARAMETER)\n\t{\n\t  /* Get width from parameter list */\n\t  width = (int)parameters[width].data.number.as_signed;\n\t  if (width < 0)\n\t    {\n\t      /*\n\t       * A negative width is the same as the - flag and\n\t       * a positive width.\n\t       */\n\t      flags |= FLAGS_LEFTADJUST;\n\t      flags &= ~FLAGS_NILPADDING;\n\t      width = -width;\n\t    }\n\t}\n\n      /* Find precision */\n      if (flags & FLAGS_PRECISION)\n\t{\n\t  precision = parameters[i].precision;\n\t  if (flags & FLAGS_PRECISION_PARAMETER)\n\t    {\n\t      /* Get precision from parameter list */\n\t      precision = (int)parameters[precision].data.number.as_signed;\n\t      if (precision < 0)\n\t\t{\n\t\t  /*\n\t\t   * A negative precision is the same as no\n\t\t   * precision\n\t\t   */\n\t\t  precision = NO_PRECISION;\n\t\t}\n\t    }\n\t}\n      else\n\t{\n\t  precision = NO_PRECISION;\n\t}\n\n      /* Find base */\n      if (NO_BASE != parameters[i].baseSpecifier)\n\t{\n\t  /* Base from specifier has priority */\n\t  base = parameters[i].baseSpecifier;\n\t}\n      else if (flags & FLAGS_BASE_PARAMETER)\n\t{\n\t  /* Get base from parameter list */\n\t  base = parameters[i].base;\n\t  base = (int)parameters[base].data.number.as_signed;\n\t}\n      else\n\t{\n\t  /* Use base from format string */\n\t  base = parameters[i].base;\n\t}\n\n      switch (parameters[i].type)\n        {\n\tcase FORMAT_CHAR:\n#if TRIO_FEATURE_QUOTE\n\t  if (flags & FLAGS_QUOTE)\n\t    data->OutStream(data, CHAR_QUOTE);\n#endif\n\t  if (! (flags & FLAGS_LEFTADJUST))\n\t    {\n\t      while (--width > 0)\n\t\tdata->OutStream(data, CHAR_ADJUST);\n\t    }\n#if TRIO_FEATURE_WIDECHAR\n\t  if (flags & FLAGS_WIDECHAR)\n\t    {\n\t      TrioWriteWideStringCharacter(data,\n\t\t\t\t\t   (trio_wchar_t)parameters[i].data.number.as_signed,\n\t\t\t\t\t   flags,\n\t\t\t\t\t   NO_WIDTH);\n\t    }\n\t  else\n#endif\n\t  {\n\t    TrioWriteStringCharacter(data,\n\t\t\t\t     (int)parameters[i].data.number.as_signed,\n\t\t\t\t     flags);\n\t  }\n\n\t  if (flags & FLAGS_LEFTADJUST)\n\t    {\n\t      while(--width > 0)\n\t\tdata->OutStream(data, CHAR_ADJUST);\n\t    }\n#if TRIO_FEATURE_QUOTE\n\t  if (flags & FLAGS_QUOTE)\n\t    data->OutStream(data, CHAR_QUOTE);\n#endif\n\n\t  break; /* FORMAT_CHAR */\n\n\tcase FORMAT_INT:\n\t  TrioWriteNumber(data,\n\t\t\t  parameters[i].data.number.as_unsigned,\n\t\t\t  flags,\n\t\t\t  width,\n\t\t\t  precision,\n\t\t\t  base);\n\n\t  break; /* FORMAT_INT */\n\n#if TRIO_FEATURE_FLOAT\n\tcase FORMAT_DOUBLE:\n\t  TrioWriteDouble(data,\n\t\t\t  parameters[i].data.longdoubleNumber,\n\t\t\t  flags,\n\t\t\t  width,\n\t\t\t  precision,\n\t\t\t  base);\n\t  break; /* FORMAT_DOUBLE */\n#endif\n\n\tcase FORMAT_STRING:\n#if TRIO_FEATURE_WIDECHAR\n\t  if (flags & FLAGS_WIDECHAR)\n\t    {\n\t      TrioWriteWideString(data,\n\t\t\t\t  parameters[i].data.wstring,\n\t\t\t\t  flags,\n\t\t\t\t  width,\n\t\t\t\t  precision);\n\t    }\n\t  else\n#endif\n\t    {\n\t      TrioWriteString(data,\n\t\t\t      parameters[i].data.string,\n\t\t\t      flags,\n\t\t\t      width,\n\t\t\t      precision);\n\t    }\n\t  break; /* FORMAT_STRING */\n\n\tcase FORMAT_POINTER:\n\t  {\n\t    trio_reference_t reference;\n\n\t    reference.data = data;\n\t    reference.parameter = &parameters[i];\n\t    trio_print_pointer(&reference, parameters[i].data.pointer);\n\t  }\n\t  break; /* FORMAT_POINTER */\n\n\tcase FORMAT_COUNT:\n\t  pointer = parameters[i].data.pointer;\n\t  if (NULL != pointer)\n\t    {\n\t      /*\n\t       * C99 paragraph 7.19.6.1.8 says \"the number of\n\t       * characters written to the output stream so far by\n\t       * this call\", which is data->actually.committed\n\t       */\n#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER\n\t      if (flags & FLAGS_SIZE_T)\n\t\t*(size_t *)pointer = (size_t)data->actually.committed;\n\t      else\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\n\t      if (flags & FLAGS_PTRDIFF_T)\n\t\t*(ptrdiff_t *)pointer = (ptrdiff_t)data->actually.committed;\n\t      else\n#endif\n#if TRIO_FEATURE_INTMAX_T\n\t      if (flags & FLAGS_INTMAX_T)\n\t\t*(trio_intmax_t *)pointer = (trio_intmax_t)data->actually.committed;\n\t      else\n#endif\n\t      if (flags & FLAGS_QUAD)\n\t\t{\n\t\t  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->actually.committed;\n\t\t}\n\t      else if (flags & FLAGS_LONG)\n\t\t{\n\t\t  *(long int *)pointer = (long int)data->actually.committed;\n\t\t}\n\t      else if (flags & FLAGS_SHORT)\n\t\t{\n\t\t  *(short int *)pointer = (short int)data->actually.committed;\n\t\t}\n\t      else\n\t\t{\n\t\t  *(int *)pointer = (int)data->actually.committed;\n\t\t}\n\t    }\n\t  break; /* FORMAT_COUNT */\n\n\tcase FORMAT_PARAMETER:\n\t  break; /* FORMAT_PARAMETER */\n\n#if TRIO_FEATURE_ERRNO\n\tcase FORMAT_ERRNO:\n\t  string = trio_error(parameters[i].data.errorNumber);\n\t  if (string)\n\t    {\n\t      TrioWriteString(data,\n\t\t\t      string,\n\t\t\t      flags,\n\t\t\t      width,\n\t\t\t      precision);\n\t    }\n\t  else\n\t  {\n\t    data->OutStream(data, '#');\n\t    TrioWriteNumber(data,\n\t\t\t    (trio_uintmax_t)parameters[i].data.errorNumber,\n\t\t\t    flags,\n\t\t\t    width,\n\t\t\t    precision,\n\t\t\t    BASE_DECIMAL);\n\t  }\n\t  break; /* FORMAT_ERRNO */\n#endif /* TRIO_FEATURE_ERRNO */\n\n#if TRIO_FEATURE_USER_DEFINED\n\tcase FORMAT_USER_DEFINED:\n\t  {\n\t    trio_reference_t reference;\n\t    trio_userdef_t *def = NULL;\n\n\t    if (parameters[i].flags & FLAGS_USER_DEFINED_PARAMETER)\n\t      {\n\t\t/* Use handle */\n\t\tif ((i > 0) ||\n\t\t    (parameters[i - 1].type == FORMAT_PARAMETER))\n\t\t  def = (trio_userdef_t *)parameters[i - 1].data.pointer;\n\t      }\n\t    else\n\t      {\n\t\t/* Look up namespace */\n\t\tdef = TrioFindNamespace(parameters[i].user_defined.namespace, NULL);\n\t      }\n\t    if (def)\n\t      {\n\t\treference.data = data;\n\t\treference.parameter = &parameters[i];\n\t\tdef->callback(&reference);\n\t      }\n\t  }\n\t  break;\n#endif /* TRIO_FEATURE_USER_DEFINED */\n\n\tdefault:\n\t  break;\n\t} /* switch parameter type */\n\n      /* Prepare for next */\n      offset = parameters[i].endOffset;\n      i++;\n    }\n\n  return data->processed;\n}\n\n/*************************************************************************\n * TrioFormatRef\n */\n#if TRIO_EXTENSION\nTRIO_PRIVATE int\nTrioFormatRef\nTRIO_ARGS5((reference, format, arglist, argfunc, argarray),\n\t   trio_reference_t *reference,\n\t   TRIO_CONST char *format,\n\t   va_list arglist,\n\t   trio_argfunc_t argfunc,\n\t   trio_pointer_t *argarray)\n{\n  int status;\n  trio_parameter_t parameters[MAX_PARAMETERS];\n\n  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argfunc, argarray);\n  if (status < 0)\n    return status;\n\n  status = TrioFormatProcess(reference->data, format, parameters);\n  if (reference->data->error != 0)\n    {\n      status = reference->data->error;\n    }\n  return status;\n}\n#endif /* TRIO_EXTENSION */\n\n/*************************************************************************\n * TrioFormat\n */\nTRIO_PRIVATE int\nTrioFormat\nTRIO_ARGS7((destination, destinationSize, OutStream, format, arglist, argfunc, argarray),\n\t   trio_pointer_t destination,\n\t   size_t destinationSize,\n\t   void (*OutStream) TRIO_PROTO((trio_class_t *, int)),\n\t   TRIO_CONST char *format,\n\t   va_list arglist,\n\t   trio_argfunc_t argfunc,\n\t   trio_pointer_t *argarray)\n{\n  int status;\n  trio_class_t data;\n  trio_parameter_t parameters[MAX_PARAMETERS];\n\n  assert(VALID(OutStream));\n  assert(VALID(format));\n\n  memset(&data, 0, sizeof(data));\n  data.OutStream = OutStream;\n  data.location = destination;\n  data.max = destinationSize;\n  data.error = 0;\n\n#if defined(USE_LOCALE)\n  if (NULL == internalLocaleValues)\n    {\n      TrioSetLocale();\n    }\n#endif\n\n  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argfunc, argarray);\n  if (status < 0)\n    return status;\n\n  status = TrioFormatProcess(&data, format, parameters);\n  if (data.error != 0)\n    {\n      status = data.error;\n    }\n  return status;\n}\n\n/*************************************************************************\n * TrioOutStreamFile\n */\n#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO\nTRIO_PRIVATE void\nTrioOutStreamFile\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  FILE *file;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  file = (FILE *)self->location;\n  self->processed++;\n  if (fputc(output, file) == EOF)\n    {\n      self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0);\n    }\n  else\n    {\n      self->actually.committed++;\n    }\n}\n#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */\n\n/*************************************************************************\n * TrioOutStreamFileDescriptor\n */\n#if TRIO_FEATURE_FD\nTRIO_PRIVATE void\nTrioOutStreamFileDescriptor\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  int fd;\n  char ch;\n\n  assert(VALID(self));\n\n  fd = *((int *)self->location);\n  ch = (char)output;\n  self->processed++;\n  if (write(fd, &ch, sizeof(char)) == -1)\n    {\n      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);\n    }\n  else\n    {\n      self->actually.committed++;\n    }\n}\n#endif /* TRIO_FEATURE_FD */\n\n/*************************************************************************\n * TrioOutStreamCustom\n */\n#if TRIO_FEATURE_CLOSURE\nTRIO_PRIVATE void\nTrioOutStreamCustom\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  int status;\n  trio_custom_t *data;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  data = (trio_custom_t *)self->location;\n  if (data->stream.out)\n    {\n      status = (data->stream.out)(data->closure, output);\n      if (status >= 0)\n\t{\n\t  self->actually.committed++;\n\t}\n      else\n\t{\n\t  if (self->error == 0)\n\t    {\n\t      self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status);\n\t    }\n\t}\n    }\n  self->processed++;\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n/*************************************************************************\n * TrioOutStreamString\n */\nTRIO_PRIVATE void\nTrioOutStreamString\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  char **buffer;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  buffer = (char **)self->location;\n  **buffer = (char)output;\n  (*buffer)++;\n  self->processed++;\n  self->actually.committed++;\n}\n\n/*************************************************************************\n * TrioOutStreamStringMax\n */\nTRIO_PRIVATE void\nTrioOutStreamStringMax\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  char **buffer;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n  \n  buffer = (char **)self->location;\n\n  if (self->processed < self->max)\n    {\n      **buffer = (char)output;\n      (*buffer)++;\n      self->actually.committed++;\n    }\n  self->processed++;\n}\n\n/*************************************************************************\n * TrioOutStreamStringDynamic\n */\n#if TRIO_FEATURE_DYNAMICSTRING\nTRIO_PRIVATE void\nTrioOutStreamStringDynamic\nTRIO_ARGS2((self, output),\n\t   trio_class_t *self,\n\t   int output)\n{\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  if (self->error == 0)\n    {\n      trio_xstring_append_char((trio_string_t *)self->location,\n\t\t\t       (char)output);\n      self->actually.committed++;\n    }\n  /* The processed variable must always be increased */\n  self->processed++;\n}\n#endif /* TRIO_FEATURE_DYNAMICSTRING */\n\n/*************************************************************************\n * TrioArrayGetter\n */\nTRIO_PRIVATE\ntrio_pointer_t TrioArrayGetter(trio_pointer_t context, int index, int type)\n{\n  /* Utility function for the printfv family */\n  trio_pointer_t *argarray = (trio_pointer_t *)context;\n  return argarray[index];\n}\n\n/*************************************************************************\n *\n * Formatted printing functions\n *\n ************************************************************************/\n\n/** @addtogroup Printf\n    @{\n*/\n\n/*************************************************************************\n * printf\n */\n\n/**\n   Print to standard output stream.\n\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_printf\nTRIO_VARGS2((format, va_alist),\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/**\n   Print to standard output stream.\n\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_vprintf\nTRIO_ARGS2((format, args),\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(format));\n\n  return TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/**\n   Print to standard output stream.\n\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_printfv\nTRIO_ARGS2((format, args),\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t * args)\n{\n  static va_list unused;\n  \n  assert(VALID(format));\n\n  return TrioFormat(stdout, 0, TrioOutStreamFile, format,\n\t\t    unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/*************************************************************************\n * fprintf\n */\n\n/**\n   Print to file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_fprintf\nTRIO_VARGS3((file, format, va_alist),\n\t    FILE *file,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(file));\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/**\n   Print to file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_vfprintf\nTRIO_ARGS3((file, format, args),\n\t   FILE *file,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(file));\n  assert(VALID(format));\n  \n  return TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/**\n   Print to file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_fprintfv\nTRIO_ARGS3((file, format, args),\n\t   FILE *file,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t * args)\n{\n  static va_list unused;\n\n  assert(VALID(file));\n  assert(VALID(format));\n\n  return TrioFormat(file, 0, TrioOutStreamFile, format,\n\t\t    unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/*************************************************************************\n * dprintf\n */\n\n/**\n   Print to file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_dprintf\nTRIO_VARGS3((fd, format, va_alist),\n\t    int fd,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_FD */\n\n/**\n   Print to file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_vdprintf\nTRIO_ARGS3((fd, format, args),\n\t   int fd,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(format));\n  \n  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_FD */\n\n/**\n   Print to file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_dprintfv\nTRIO_ARGS3((fd, format, args),\n\t   int fd,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  \n  assert(VALID(format));\n  \n  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format,\n\t\t    unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_FD */\n\n/*************************************************************************\n * cprintf\n */\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_cprintf\nTRIO_VARGS4((stream, closure, format, va_alist),\n\t    trio_outstream_t stream,\n\t    trio_pointer_t closure,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n\n  TRIO_VA_START(args, format);\n  data.stream.out = stream;\n  data.closure = closure;\n  status = TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_vcprintf\nTRIO_ARGS4((stream, closure, format, args),\n\t   trio_outstream_t stream,\n\t   trio_pointer_t closure,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n\n  data.stream.out = stream;\n  data.closure = closure;\n  return TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_cprintfv\nTRIO_ARGS4((stream, closure, format, args),\n\t   trio_outstream_t stream,\n\t   trio_pointer_t closure,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n\n  data.stream.out = stream;\n  data.closure = closure;\n  return TrioFormat(&data, 0, TrioOutStreamCustom, format,\n\t\t    unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE && TRIO_FEATURE_ARGFUNC\nTRIO_PUBLIC int\ntrio_cprintff\nTRIO_ARGS5((stream, closure, format, argfunc, context),\n\t   trio_outstream_t stream,\n\t   trio_pointer_t closure,\n\t   TRIO_CONST char *format,\n\t   trio_argfunc_t argfunc,\n\t   trio_pointer_t context)\n{\n  static va_list unused;\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n  assert(VALID(argfunc));\n\n  data.stream.out = stream;\n  data.closure = closure;\n  return TrioFormat(&data, 0, TrioOutStreamCustom, format,\n                    unused, argfunc, (trio_pointer_t *)context);\n}\n#endif /* TRIO_FEATURE_CLOSURE && TRIO_FEATURE_ARGFUNC */\n\n/*************************************************************************\n * sprintf\n */\n\n/**\n   Print to string.\n\n   @param buffer Output string.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_sprintf\nTRIO_VARGS3((buffer, format, va_alist),\n\t    char *buffer,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(buffer));\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL, NULL);\n  *buffer = NIL; /* Terminate with NIL character */\n  TRIO_VA_END(args);\n  return status;\n}\n\n/**\n   Print to string.\n\n   @param buffer Output string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_vsprintf\nTRIO_ARGS3((buffer, format, args),\n\t   char *buffer,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  int status;\n\n  assert(VALID(buffer));\n  assert(VALID(format));\n\n  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL, NULL);\n  *buffer = NIL;\n  return status;\n}\n\n/**\n   Print to string.\n\n   @param buffer Output string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_sprintfv\nTRIO_ARGS3((buffer, format, args),\n\t   char *buffer,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  int status;\n  \n  assert(VALID(buffer));\n  assert(VALID(format));\n\n  status = TrioFormat(&buffer, 0, TrioOutStreamString, format,\n\t\t      unused, TrioArrayGetter, args);\n  *buffer = NIL;\n  return status;\n}\n\n/*************************************************************************\n * snprintf\n */\n\n/**\n   Print at most @p max characters to string.\n\n   @param buffer Output string.\n   @param max Maximum number of characters to print.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_snprintf\nTRIO_VARGS4((buffer, max, format, va_alist),\n\t    char *buffer,\n\t    size_t max,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(buffer) || (max == 0));\n  assert(VALID(format));\n\n  TRIO_VA_START(args, format);\n  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,\n\t\t      TrioOutStreamStringMax, format, args, NULL, NULL);\n  if (max > 0)\n    *buffer = NIL;\n  TRIO_VA_END(args);\n  return status;\n}\n\n/**\n   Print at most @p max characters to string.\n\n   @param buffer Output string.\n   @param max Maximum number of characters to print.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_vsnprintf\nTRIO_ARGS4((buffer, max, format, args),\n\t   char *buffer,\n\t   size_t max,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  int status;\n\n  assert(VALID(buffer) || (max == 0));\n  assert(VALID(format));\n\n  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,\n\t\t      TrioOutStreamStringMax, format, args, NULL, NULL);\n  if (max > 0)\n    *buffer = NIL;\n  return status;\n}\n\n/**\n   Print at most @p max characters to string.\n\n   @param buffer Output string.\n   @param max Maximum number of characters to print.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\nTRIO_PUBLIC int\ntrio_snprintfv\nTRIO_ARGS4((buffer, max, format, args),\n\t   char *buffer,\n\t   size_t max,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  int status;\n\n  assert(VALID(buffer) || (max == 0));\n  assert(VALID(format));\n\n  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,\n\t\t      TrioOutStreamStringMax, format,\n\t\t      unused, TrioArrayGetter, args);\n  if (max > 0)\n    *buffer = NIL;\n  return status;\n}\n\n/*************************************************************************\n * snprintfcat\n * Appends the new string to the buffer string overwriting the '\\0'\n * character at the end of buffer.\n */\n#if TRIO_EXTENSION\nTRIO_PUBLIC int\ntrio_snprintfcat\nTRIO_VARGS4((buffer, max, format, va_alist),\n\t    char *buffer,\n\t    size_t max,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n  size_t buf_len;\n\n  TRIO_VA_START(args, format);\n\n  assert(VALID(buffer));\n  assert(VALID(format));\n\n  buf_len = trio_length(buffer);\n  buffer = &buffer[buf_len];\n\n  status = TrioFormat(&buffer, max - 1 - buf_len,\n\t\t      TrioOutStreamStringMax, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  *buffer = NIL;\n  return status;\n}\n#endif\n\n#if TRIO_EXTENSION\nTRIO_PUBLIC int\ntrio_vsnprintfcat\nTRIO_ARGS4((buffer, max, format, args),\n\t   char *buffer,\n\t   size_t max,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  int status;\n  size_t buf_len;\n  \n  assert(VALID(buffer));\n  assert(VALID(format));\n\n  buf_len = trio_length(buffer);\n  buffer = &buffer[buf_len];\n  status = TrioFormat(&buffer, max - 1 - buf_len,\n\t\t      TrioOutStreamStringMax, format, args, NULL, NULL);\n  *buffer = NIL;\n  return status;\n}\n#endif\n\n/*************************************************************************\n * trio_aprintf\n */\n\n#if TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING\nTRIO_PUBLIC char *\ntrio_aprintf\nTRIO_VARGS2((format, va_alist),\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  va_list args;\n  trio_string_t *info;\n  char *result = NULL;\n\n  assert(VALID(format));\n  \n  info = trio_xstring_duplicate(\"\");\n  if (info)\n    {\n      TRIO_VA_START(args, format);\n      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,\n\t\t       format, args, NULL, NULL);\n      TRIO_VA_END(args);\n\n      trio_string_terminate(info);\n      result = trio_string_extract(info);\n      trio_string_destroy(info);\n    }\n  return result;\n}\n#endif /* TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING */\n\n#if TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING\nTRIO_PUBLIC char *\ntrio_vaprintf\nTRIO_ARGS2((format, args),\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  trio_string_t *info;\n  char *result = NULL;\n  \n  assert(VALID(format));\n  \n  info = trio_xstring_duplicate(\"\");\n  if (info)\n    {\n      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,\n\t\t       format, args, NULL, NULL);\n      trio_string_terminate(info);\n      result = trio_string_extract(info);\n      trio_string_destroy(info);\n    }\n  return result;\n}\n#endif /* TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING */\n\n/**\n   Allocate and print to string.\n   The memory allocated and returned by @p result must be freed by the\n   calling application.\n\n   @param result Output string.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_DYNAMICSTRING\nTRIO_PUBLIC int\ntrio_asprintf\nTRIO_VARGS3((result, format, va_alist),\n\t    char **result,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  va_list args;\n  int status;\n  trio_string_t *info;\n\n  assert(VALID(format));\n\n  *result = NULL;\n  \n  info = trio_xstring_duplicate(\"\");\n  if (info == NULL)\n    {\n      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);\n    }\n  else\n    {\n      TRIO_VA_START(args, format);\n      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,\n\t\t\t  format, args, NULL, NULL);\n      TRIO_VA_END(args);\n      if (status >= 0)\n\t{\n\t  trio_string_terminate(info);\n\t  *result = trio_string_extract(info);\n\t}\n      trio_string_destroy(info);\n    }\n  return status;\n}\n#endif /* TRIO_FEATURE_DYNAMICSTRING */\n\n/**\n   Allocate and print to string.\n   The memory allocated and returned by @p result must be freed by the\n   calling application.\n\n   @param result Output string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_DYNAMICSTRING\nTRIO_PUBLIC int\ntrio_vasprintf\nTRIO_ARGS3((result, format, args),\n\t   char **result,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  int status;\n  trio_string_t *info;\n  \n  assert(VALID(format));\n\n  *result = NULL;\n  \n  info = trio_xstring_duplicate(\"\");\n  if (info == NULL)\n    {\n      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);\n    }\n  else\n    {\n      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,\n\t\t\t  format, args, NULL, NULL);\n      if (status >= 0)\n\t{\n\t  trio_string_terminate(info);\n\t  *result = trio_string_extract(info);\n\t}\n      trio_string_destroy(info);\n    }\n  return status;\n}\n#endif /* TRIO_FEATURE_DYNAMICSTRING */\n\n/**\n   Allocate and print to string.\n   The memory allocated and returned by @p result must be freed by the\n   calling application.\n\n   @param result Output string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of printed characters.\n */\n#if TRIO_FEATURE_DYNAMICSTRING\nTRIO_PUBLIC int\ntrio_asprintfv\nTRIO_ARGS3((result, format, args),\n           char **result,\n           TRIO_CONST char *format,\n           trio_pointer_t * args)\n{\n  static va_list unused;\n  int status;\n  trio_string_t *info;\n  \n  assert(VALID(format));\n\n  *result = NULL;\n\n  info = trio_xstring_duplicate(\"\");\n  if (info == NULL)\n    {\n      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);\n    }\n  else\n    {\n      status = TrioFormat(info, 0, TrioOutStreamStringDynamic, format,\n                          unused, TrioArrayGetter, args);\n      if (status >= 0)\n        {\n          trio_string_terminate(info);\n          *result = trio_string_extract(info);\n        }\n      trio_string_destroy(info);\n    }\n  return status;\n}\n#endif /* TRIO_FEATURE_DYNAMICSTRING */\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_printf.h\"\n#endif\n\n/** @} End of Printf documentation module */\n\n/*************************************************************************\n *\n * CALLBACK\n *\n ************************************************************************/\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_register.h\"\n#endif\n/**\n   @addtogroup UserDefined\n   @{\n*/\n\n#if TRIO_FEATURE_USER_DEFINED\n\n/*************************************************************************\n * trio_register\n */\n\n/**\n   Register new user-defined specifier.\n\n   @param callback\n   @param name\n   @return Handle.\n */\nTRIO_PUBLIC trio_pointer_t \ntrio_register\nTRIO_ARGS2((callback, name),\n\t   trio_callback_t callback,\n\t   TRIO_CONST char *name)\n{\n  trio_userdef_t *def;\n  trio_userdef_t *prev = NULL;\n\n  if (callback == NULL)\n    return NULL;\n\n  if (name)\n    {\n      /* Handle built-in namespaces */\n      if (name[0] == ':')\n\t{\n\t  if (trio_equal(name, \":enter\"))\n\t    {\n\t      internalEnterCriticalRegion = callback;\n\t    }\n\t  else if (trio_equal(name, \":leave\"))\n\t    {\n\t      internalLeaveCriticalRegion = callback;\n\t    }\n\t  return NULL;\n\t}\n      \n      /* Bail out if namespace is too long */\n      if (trio_length(name) >= MAX_USER_NAME)\n\treturn NULL;\n      \n      /* Bail out if namespace already is registered */\n      def = TrioFindNamespace(name, &prev);\n      if (def)\n\treturn NULL;\n    }\n  \n  def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t));\n  if (def)\n    {\n      if (internalEnterCriticalRegion)\n\t(void)internalEnterCriticalRegion(NULL);\n      \n      if (name)\n\t{\n\t  /* Link into internal list */\n\t  if (prev == NULL)\n\t    internalUserDef = def;\n\t  else\n\t    prev->next = def;\n\t}\n      /* Initialize */\n      def->callback = callback;\n      def->name = (name == NULL)\n\t? NULL\n\t: trio_duplicate(name);\n      def->next = NULL;\n\n      if (internalLeaveCriticalRegion)\n\t(void)internalLeaveCriticalRegion(NULL);\n    }\n  return (trio_pointer_t)def;\n}\n\n/**\n   Unregister an existing user-defined specifier.\n\n   @param handle\n */\nTRIO_PUBLIC\nvoid\ntrio_unregister\nTRIO_ARGS1((handle),\n\t   trio_pointer_t handle)\n{\n  trio_userdef_t *self = (trio_userdef_t *)handle;\n  trio_userdef_t *def;\n  trio_userdef_t *prev = NULL;\n\n  assert(VALID(self));\n\n  if (self->name)\n    {\n      def = TrioFindNamespace(self->name, &prev);\n      if (def)\n\t{\n\t  if (internalEnterCriticalRegion)\n\t    (void)internalEnterCriticalRegion(NULL);\n\t  \n\t  if (prev == NULL)\n\t    internalUserDef = internalUserDef->next;\n\t  else\n\t    prev->next = def->next;\n\t  \n\t  if (internalLeaveCriticalRegion)\n\t    (void)internalLeaveCriticalRegion(NULL);\n\t}\n      trio_destroy(self->name);\n    }\n  TRIO_FREE(self);\n}\n\n/*************************************************************************\n * trio_get_format\n */\nTRIO_PUBLIC\nTRIO_CONST char *\ntrio_get_format\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n#if TRIO_FEATURE_USER_DEFINED\n  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);\n#endif\n  \n  return (((trio_reference_t *)ref)->parameter->user_data);\n}\n\n/*************************************************************************\n * trio_get_argument\n */\nTRIO_PUBLIC\nTRIO_CONST trio_pointer_t\ntrio_get_argument\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n#if TRIO_FEATURE_USER_DEFINED\n  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);\n#endif\n\n  return ((trio_reference_t *)ref)->parameter->data.pointer;\n}\n\n/*************************************************************************\n * trio_get_width / trio_set_width\n */\nTRIO_PUBLIC\nint\ntrio_get_width\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return ((trio_reference_t *)ref)->parameter->width;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_width\nTRIO_ARGS2((ref, width),\n\t   trio_pointer_t ref,\n\t   int width)\n{\n  ((trio_reference_t *)ref)->parameter->width = width;\n}\n\n/*************************************************************************\n * trio_get_precision / trio_set_precision\n */\nTRIO_PUBLIC\nint\ntrio_get_precision\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->precision);\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_precision\nTRIO_ARGS2((ref, precision),\n\t   trio_pointer_t ref,\n\t   int precision)\n{\n  ((trio_reference_t *)ref)->parameter->precision = precision;\n}\n\n/*************************************************************************\n * trio_get_base / trio_set_base\n */\nTRIO_PUBLIC\nint\ntrio_get_base\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->base);\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_base\nTRIO_ARGS2((ref, base),\n\t   trio_pointer_t ref,\n\t   int base)\n{\n  ((trio_reference_t *)ref)->parameter->base = base;\n}\n\n/*************************************************************************\n * trio_get_long / trio_set_long\n */\nTRIO_PUBLIC\nint\ntrio_get_long\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_long\nTRIO_ARGS2((ref, is_long),\n\t   trio_pointer_t ref,\n\t   int is_long)\n{\n  if (is_long)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG;\n}\n\n/*************************************************************************\n * trio_get_longlong / trio_set_longlong\n */\nTRIO_PUBLIC\nint\ntrio_get_longlong\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_longlong\nTRIO_ARGS2((ref, is_longlong),\n\t   trio_pointer_t ref,\n\t   int is_longlong)\n{\n  if (is_longlong)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD;\n}\n\n/*************************************************************************\n * trio_get_longdouble / trio_set_longdouble\n */\n# if TRIO_FEATURE_FLOAT\nTRIO_PUBLIC\nint\ntrio_get_longdouble\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_longdouble\nTRIO_ARGS2((ref, is_longdouble),\n\t   trio_pointer_t ref,\n\t   int is_longdouble)\n{\n  if (is_longdouble)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE;\n}\n# endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * trio_get_short / trio_set_short\n */\nTRIO_PUBLIC\nint\ntrio_get_short\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_short\nTRIO_ARGS2((ref, is_short),\n\t   trio_pointer_t ref,\n\t   int is_short)\n{\n  if (is_short)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT;\n}\n\n/*************************************************************************\n * trio_get_shortshort / trio_set_shortshort\n */\nTRIO_PUBLIC\nint\ntrio_get_shortshort\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_shortshort\nTRIO_ARGS2((ref, is_shortshort),\n\t   trio_pointer_t ref,\n\t   int is_shortshort)\n{\n  if (is_shortshort)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT;\n}\n\n/*************************************************************************\n * trio_get_alternative / trio_set_alternative\n */\nTRIO_PUBLIC\nint\ntrio_get_alternative\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_alternative\nTRIO_ARGS2((ref, is_alternative),\n\t   trio_pointer_t ref,\n\t   int is_alternative)\n{\n  if (is_alternative)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE;\n}\n\n/*************************************************************************\n * trio_get_alignment / trio_set_alignment\n */\nTRIO_PUBLIC\nint\ntrio_get_alignment\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_alignment\nTRIO_ARGS2((ref, is_leftaligned),\n\t   trio_pointer_t ref,\n\t   int is_leftaligned)\n{\n  if (is_leftaligned)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST;\n}\n\n/*************************************************************************\n * trio_get_spacing /trio_set_spacing\n */\nTRIO_PUBLIC\nint\ntrio_get_spacing\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_spacing\nTRIO_ARGS2((ref, is_space),\n\t   trio_pointer_t ref,\n\t   int is_space)\n{\n  if (is_space)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE;\n}\n\n/*************************************************************************\n * trio_get_sign / trio_set_sign\n */\nTRIO_PUBLIC\nint\ntrio_get_sign\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_sign\nTRIO_ARGS2((ref, is_sign),\n\t   trio_pointer_t ref,\n\t   int is_sign)\n{\n  if (is_sign)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN;\n}\n\n/*************************************************************************\n * trio_get_padding / trio_set_padding\n */\nTRIO_PUBLIC\nint\ntrio_get_padding\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_padding\nTRIO_ARGS2((ref, is_padding),\n\t   trio_pointer_t ref,\n\t   int is_padding)\n{\n  if (is_padding)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING;\n}\n\n/*************************************************************************\n * trio_get_quote / trio_set_quote\n */\n# if TRIO_FEATURE_QUOTE\nTRIO_PUBLIC\nint\ntrio_get_quote\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_quote\nTRIO_ARGS2((ref, is_quote),\n\t   trio_pointer_t ref,\n\t   int is_quote)\n{\n  if (is_quote)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE;\n}\n#endif /* TRIO_FEATURE_QUOTE */\n\n/*************************************************************************\n * trio_get_upper / trio_set_upper\n */\nTRIO_PUBLIC\nint\ntrio_get_upper\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_upper\nTRIO_ARGS2((ref, is_upper),\n\t   trio_pointer_t ref,\n\t   int is_upper)\n{\n  if (is_upper)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER;\n}\n\n/*************************************************************************\n * trio_get_largest / trio_set_largest\n */\n#if TRIO_FEATURE_INTMAX_T\nTRIO_PUBLIC\nint\ntrio_get_largest\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_largest\nTRIO_ARGS2((ref, is_largest),\n\t   trio_pointer_t ref,\n\t   int is_largest)\n{\n  if (is_largest)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T;\n}\n#endif /* TRIO_FEATURE_INTMAX_T */\n\n/*************************************************************************\n * trio_get_ptrdiff / trio_set_ptrdiff\n */\n#if TRIO_FEATURE_PTRDIFF_T\nTRIO_PUBLIC\nint\ntrio_get_ptrdiff\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_ptrdiff\nTRIO_ARGS2((ref, is_ptrdiff),\n\t   trio_pointer_t ref,\n\t   int is_ptrdiff)\n{\n  if (is_ptrdiff)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T;\n}\n#endif /* TRIO_FEATURE_PTRDIFF_T */\n\n/*************************************************************************\n * trio_get_size / trio_set_size\n */\n#if TRIO_FEATURE_SIZE_T\nTRIO_PUBLIC\nint\ntrio_get_size\nTRIO_ARGS1((ref),\n\t   trio_pointer_t ref)\n{\n  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T)\n    ? TRUE\n    : FALSE;\n}\n\nTRIO_PUBLIC\nvoid\ntrio_set_size\nTRIO_ARGS2((ref, is_size),\n\t   trio_pointer_t ref,\n\t   int is_size)\n{\n  if (is_size)\n    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T;\n  else\n    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T;\n}\n#endif /* TRIO_FEATURE_SIZE_T */\n\n/*************************************************************************\n * trio_print_int\n */\nTRIO_PUBLIC\nvoid\ntrio_print_int\nTRIO_ARGS2((ref, number),\n\t   trio_pointer_t ref,\n\t   int number)\n{\n  trio_reference_t *self = (trio_reference_t *)ref;\n\n  TrioWriteNumber(self->data,\n\t\t  (trio_uintmax_t)number,\n\t\t  self->parameter->flags,\n\t\t  self->parameter->width,\n\t\t  self->parameter->precision,\n\t\t  self->parameter->base);\n}\n\n/*************************************************************************\n * trio_print_uint\n */\nTRIO_PUBLIC\nvoid\ntrio_print_uint\nTRIO_ARGS2((ref, number),\n\t   trio_pointer_t ref,\n\t   unsigned int number)\n{\n  trio_reference_t *self = (trio_reference_t *)ref;\n\n  TrioWriteNumber(self->data,\n\t\t  (trio_uintmax_t)number,\n\t\t  self->parameter->flags | FLAGS_UNSIGNED,\n\t\t  self->parameter->width,\n\t\t  self->parameter->precision,\n\t\t  self->parameter->base);\n}\n\n/*************************************************************************\n * trio_print_double\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PUBLIC\nvoid\ntrio_print_double\nTRIO_ARGS2((ref, number),\n\t   trio_pointer_t ref,\n\t   double number)\n{\n  trio_reference_t *self = (trio_reference_t *)ref;\n\n  TrioWriteDouble(self->data,\n\t\t  number,\n\t\t  self->parameter->flags,\n\t\t  self->parameter->width,\n\t\t  self->parameter->precision,\n\t\t  self->parameter->base);\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * trio_print_string\n */\nTRIO_PUBLIC\nvoid\ntrio_print_string\nTRIO_ARGS2((ref, string),\n\t   trio_pointer_t ref,\n\t   TRIO_CONST char *string)\n{\n  trio_reference_t *self = (trio_reference_t *)ref;\n\n  TrioWriteString(self->data,\n\t\t  string,\n\t\t  self->parameter->flags,\n\t\t  self->parameter->width,\n\t\t  self->parameter->precision);\n}\n\n/*************************************************************************\n * trio_print_ref\n */\nTRIO_PUBLIC\nint\ntrio_print_ref\nTRIO_VARGS3((ref, format, va_alist),\n\t    trio_pointer_t ref,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list arglist;\n\n  assert(VALID(format));\n  \n  TRIO_VA_START(arglist, format);\n  status = TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL, NULL);\n  TRIO_VA_END(arglist);\n  return status;\n}\n\n/*************************************************************************\n * trio_vprint_ref\n */\nTRIO_PUBLIC\nint\ntrio_vprint_ref\nTRIO_ARGS3((ref, format, arglist),\n\t   trio_pointer_t ref,\n\t   TRIO_CONST char *format,\n\t   va_list arglist)\n{\n  assert(VALID(format));\n  \n  return TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL, NULL);\n}\n\n/*************************************************************************\n * trio_printv_ref\n */\nTRIO_PUBLIC\nint\ntrio_printv_ref\nTRIO_ARGS3((ref, format, argarray),\n\t   trio_pointer_t ref,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *argarray)\n{\n  static va_list unused;\n  \n  assert(VALID(format));\n  \n  return TrioFormatRef((trio_reference_t *)ref, format,\n\t\t       unused, TrioArrayGetter, argarray);\n}\n\n#endif\n\n/*************************************************************************\n * trio_print_pointer\n */\nTRIO_PUBLIC\nvoid\ntrio_print_pointer\nTRIO_ARGS2((ref, pointer),\n\t   trio_pointer_t ref,\n\t   trio_pointer_t pointer)\n{\n  trio_reference_t *self = (trio_reference_t *)ref;\n  trio_flags_t flags;\n  trio_uintmax_t number;\n\n  if (NULL == pointer)\n    {\n      TRIO_CONST char *string = internalNullString;\n      while (*string)\n\tself->data->OutStream(self->data, *string++);\n    }\n  else\n    {\n      /*\n       * The subtraction of the null pointer is a workaround\n       * to avoid a compiler warning. The performance overhead\n       * is negligible (and likely to be removed by an\n       * optimizing compiler). The (char *) casting is done\n       * to please ANSI C++.\n       */\n      number = (trio_uintmax_t)((char *)pointer - (char *)0);\n      /* Shrink to size of pointer */\n      number &= (trio_uintmax_t)-1;\n      flags = self->parameter->flags;\n      flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE |\n\t        FLAGS_NILPADDING);\n      TrioWriteNumber(self->data,\n\t\t      number,\n\t\t      flags,\n\t\t      POINTER_WIDTH,\n\t\t      NO_PRECISION,\n\t\t      BASE_HEX);\n    }\n}\n\n/** @} End of UserDefined documentation module */\n\n/*************************************************************************\n *\n * LOCALES\n *\n ************************************************************************/\n\n/*************************************************************************\n * trio_locale_set_decimal_point\n *\n * Decimal point can only be one character. The input argument is a\n * string to enable multibyte characters. At most MB_LEN_MAX characters\n * will be used.\n */\n#if TRIO_FEATURE_LOCALE\nTRIO_PUBLIC void\ntrio_locale_set_decimal_point\nTRIO_ARGS1((decimalPoint),\n\t   char *decimalPoint)\n{\n#if defined(USE_LOCALE)\n  if (NULL == internalLocaleValues)\n    {\n      TrioSetLocale();\n    }\n#endif\n  internalDecimalPointLength = trio_length(decimalPoint);\n  if (internalDecimalPointLength == 1)\n    {\n      internalDecimalPoint = *decimalPoint;\n    }\n  else\n    {\n      internalDecimalPoint = NIL;\n      trio_copy_max(internalDecimalPointString,\n\t\t    sizeof(internalDecimalPointString),\n\t\t    decimalPoint);\n    }\n}\n#endif\n\n/*************************************************************************\n * trio_locale_set_thousand_separator\n *\n * See trio_locale_set_decimal_point\n */\n#if TRIO_FEATURE_LOCALE || TRIO_EXTENSION\nTRIO_PUBLIC void\ntrio_locale_set_thousand_separator\nTRIO_ARGS1((thousandSeparator),\n\t   char *thousandSeparator)\n{\n# if defined(USE_LOCALE)\n  if (NULL == internalLocaleValues)\n    {\n      TrioSetLocale();\n    }\n# endif\n  trio_copy_max(internalThousandSeparator,\n\t\tsizeof(internalThousandSeparator),\n\t\tthousandSeparator);\n  internalThousandSeparatorLength = trio_length(internalThousandSeparator);\n}\n#endif\n\n/*************************************************************************\n * trio_locale_set_grouping\n *\n * Array of bytes. Reversed order.\n *\n *  CHAR_MAX : No further grouping\n *  0        : Repeat last group for the remaining digits (not necessary\n *             as C strings are zero-terminated)\n *  n        : Set current group to n\n *\n * Same order as the grouping attribute in LC_NUMERIC.\n */\n#if TRIO_FEATURE_LOCALE || TRIO_EXTENSION\nTRIO_PUBLIC void\ntrio_locale_set_grouping\nTRIO_ARGS1((grouping),\n\t   char *grouping)\n{\n# if defined(USE_LOCALE)\n  if (NULL == internalLocaleValues)\n    {\n      TrioSetLocale();\n    }\n# endif\n  trio_copy_max(internalGrouping,\n\t\tsizeof(internalGrouping),\n\t\tgrouping);\n}\n#endif\n\n\n/*************************************************************************\n *\n * SCANNING\n *\n ************************************************************************/\n\n#if TRIO_FEATURE_SCANF\n\n/*************************************************************************\n * TrioSkipWhitespaces\n */\nTRIO_PRIVATE int\nTrioSkipWhitespaces\nTRIO_ARGS1((self),\n\t   trio_class_t *self)\n{\n  int ch;\n\n  ch = self->current;\n  while (isspace(ch))\n    {\n      self->InStream(self, &ch);\n    }\n  return ch;\n}\n\n/*************************************************************************\n * TrioGetCollation\n */\n#if TRIO_EXTENSION\nTRIO_PRIVATE void\nTrioGetCollation(TRIO_NOARGS)\n{\n  int i;\n  int j;\n  int k;\n  char first[2];\n  char second[2];\n\n  /* This is computationally expensive */\n  first[1] = NIL;\n  second[1] = NIL;\n  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n    {\n      k = 0;\n      first[0] = (char)i;\n      for (j = 0; j < MAX_CHARACTER_CLASS; j++)\n\t{\n\t  second[0] = (char)j;\n\t  if (trio_equal_locale(first, second))\n\t    internalCollationArray[i][k++] = (char)j;\n\t}\n      internalCollationArray[i][k] = NIL;\n    }\n}\n#endif\n\n/*************************************************************************\n * TrioGetCharacterClass\n *\n * FIXME:\n *  multibyte\n */\nTRIO_PRIVATE int\nTrioGetCharacterClass\nTRIO_ARGS4((format, offsetPointer, flagsPointer, characterclass),\n\t   TRIO_CONST char *format,\n\t   int *offsetPointer,\n\t   trio_flags_t *flagsPointer,\n\t   int *characterclass)\n{\n  int offset = *offsetPointer;\n  int i;\n  char ch;\n  char range_begin;\n  char range_end;\n\n  *flagsPointer &= ~FLAGS_EXCLUDE;\n\n  if (format[offset] == QUALIFIER_CIRCUMFLEX)\n    {\n      *flagsPointer |= FLAGS_EXCLUDE;\n      offset++;\n    }\n  /*\n   * If the ungroup character is at the beginning of the scanlist,\n   * it will be part of the class, and a second ungroup character\n   * must follow to end the group.\n   */\n  if (format[offset] == SPECIFIER_UNGROUP)\n    {\n      characterclass[(int)SPECIFIER_UNGROUP]++;\n      offset++;\n    }\n  /*\n   * Minus is used to specify ranges. To include minus in the class,\n   * it must be at the beginning of the list\n   */\n  if (format[offset] == QUALIFIER_MINUS)\n    {\n      characterclass[(int)QUALIFIER_MINUS]++;\n      offset++;\n    }\n  /* Collect characters */\n  for (ch = format[offset];\n       (ch != SPECIFIER_UNGROUP) && (ch != NIL);\n       ch = format[++offset])\n    {\n      switch (ch)\n\t{\n\tcase QUALIFIER_MINUS: /* Scanlist ranges */\n\t  \n\t  /*\n\t   * Both C99 and UNIX98 describes ranges as implementation-\n\t   * defined.\n\t   *\n\t   * We support the following behaviour (although this may\n\t   * change as we become wiser)\n\t   * - only increasing ranges, ie. [a-b] but not [b-a]\n\t   * - transitive ranges, ie. [a-b-c] == [a-c]\n\t   * - trailing minus, ie. [a-] is interpreted as an 'a'\n\t   *   and a '-'\n\t   * - duplicates (although we can easily convert these\n\t   *   into errors)\n\t   */\n\t  range_begin = format[offset - 1];\n\t  range_end = format[++offset];\n\t  if (range_end == SPECIFIER_UNGROUP)\n\t    {\n\t      /* Trailing minus is included */\n\t      characterclass[(int)ch]++;\n\t      ch = range_end;\n\t      break; /* for */\n\t    }\n\t  if (range_end == NIL)\n\t    return TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t  if (range_begin > range_end)\n\t    return TRIO_ERROR_RETURN(TRIO_ERANGE, offset);\n\t    \n\t  for (i = (int)range_begin; i <= (int)range_end; i++)\n\t    characterclass[i]++;\n\t    \n\t  ch = range_end;\n\t  break;\n\t  \n#if TRIO_EXTENSION\n\n\tcase SPECIFIER_GROUP:\n\t  \n\t  switch (format[offset + 1])\n\t    {\n\t    case QUALIFIER_DOT: /* Collating symbol */\n\t      /*\n\t       * FIXME: This will be easier to implement when multibyte\n\t       * characters have been implemented. Until now, we ignore\n\t       * this feature.\n\t       */\n\t      for (i = offset + 2; ; i++)\n\t\t{\n\t\t  if (format[i] == NIL)\n\t\t    /* Error in syntax */\n\t\t    return -1;\n\t\t  else if (format[i] == QUALIFIER_DOT)\n\t\t    break; /* for */\n\t\t}\n\t      if (format[++i] != SPECIFIER_UNGROUP)\n\t\treturn -1;\n\t      \n\t      offset = i;\n\t      break;\n\t  \n\t    case QUALIFIER_EQUAL: /* Equivalence class expressions */\n\t      {\n\t\tunsigned int j;\n\t\tunsigned int k;\n\t    \n\t\tif (internalCollationUnconverted)\n\t\t  {\n\t\t    /* Lazy evaluation of collation array */\n\t\t    TrioGetCollation();\n\t\t    internalCollationUnconverted = FALSE;\n\t\t  }\n\t\tfor (i = offset + 2; ; i++)\n\t\t  {\n\t\t    if (format[i] == NIL)\n\t\t      /* Error in syntax */\n\t\t      return -1;\n\t\t    else if (format[i] == QUALIFIER_EQUAL)\n\t\t      break; /* for */\n\t\t    else\n\t\t      {\n\t\t\t/* Mark any equivalent character */\n\t\t\tk = (unsigned int)format[i];\n\t\t\tfor (j = 0; internalCollationArray[k][j] != NIL; j++)\n\t\t\t  characterclass[(int)internalCollationArray[k][j]]++;\n\t\t      }\n\t\t  }\n\t\tif (format[++i] != SPECIFIER_UNGROUP)\n\t\t  return -1;\n\t\t\n\t\toffset = i;\n\t      }\n\t      break;\n\t  \n\t    case QUALIFIER_COLON: /* Character class expressions */\n\t  \n\t      if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1,\n\t\t\t\t &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isalnum(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_ALNUM) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isalpha(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_ALPHA) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (iscntrl(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_CNTRL) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isdigit(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_DIGIT) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isgraph(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_GRAPH) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (islower(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_LOWER) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isprint(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_PRINT) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (ispunct(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_PUNCT) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isspace(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_SPACE) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isupper(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_UPPER) - 1;\n\t\t}\n\t      else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1,\n\t\t\t\t      &format[offset]))\n\t\t{\n\t\t  for (i = 0; i < MAX_CHARACTER_CLASS; i++)\n\t\t    if (isxdigit(i))\n\t\t      characterclass[i]++;\n\t\t  offset += sizeof(CLASS_XDIGIT) - 1;\n\t\t}\n\t      else\n\t\t{\n\t\t  characterclass[(int)ch]++;\n\t\t}\n\t      break;\n\n\t    default:\n\t      characterclass[(int)ch]++;\n\t      break;\n\t    }\n\t  break;\n\t  \n#endif /* TRIO_EXTENSION */\n\t  \n\tdefault:\n\t  characterclass[(int)ch]++;\n\t  break;\n\t}\n    }\n  return 0;\n}\n\n/*************************************************************************\n * TrioReadNumber\n *\n * We implement our own number conversion in preference of strtol and\n * strtoul, because we must handle 'long long' and thousand separators.\n */\nTRIO_PRIVATE BOOLEAN_T\nTrioReadNumber\nTRIO_ARGS5((self, target, flags, width, base),\n\t   trio_class_t *self,\n\t   trio_uintmax_t *target,\n\t   trio_flags_t flags,\n\t   int width,\n\t   int base)\n{\n  trio_uintmax_t number = 0;\n  int digit;\n  int count;\n  BOOLEAN_T isNegative = FALSE;\n  BOOLEAN_T gotNumber = FALSE;\n  int j;\n\n  assert(VALID(self));\n  assert(VALID(self->InStream));\n  assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE));\n\n  if (internalDigitsUnconverted)\n    {\n      /* Lazy evaluation of digits array */\n      memset(internalDigitArray, -1, sizeof(internalDigitArray));\n      for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++)\n\t{\n\t  internalDigitArray[(int)internalDigitsLower[j]] = j;\n\t  internalDigitArray[(int)internalDigitsUpper[j]] = j;\n\t}\n      internalDigitsUnconverted = FALSE;\n    }\n  \n  TrioSkipWhitespaces(self);\n  \n  /* Leading sign */\n  if (self->current == '+')\n    {\n      self->InStream(self, NULL);\n    }\n  else if (self->current == '-')\n    {\n      self->InStream(self, NULL);\n      isNegative = TRUE;\n    }\n  \n  count = self->processed;\n  \n  if (flags & FLAGS_ALTERNATIVE)\n    {\n      switch (base)\n\t{\n\tcase NO_BASE:\n\tcase BASE_OCTAL:\n\tcase BASE_HEX:\n\tcase BASE_BINARY:\n\t  if (self->current == '0')\n\t    {\n\t      self->InStream(self, NULL);\n\t      if (self->current)\n\t\t{\n\t\t  if ((base == BASE_HEX) &&\n\t\t      (trio_to_upper(self->current) == 'X'))\n\t\t    {\n\t\t      self->InStream(self, NULL);\n\t\t    }\n\t\t  else if ((base == BASE_BINARY) &&\n\t\t\t   (trio_to_upper(self->current) == 'B'))\n\t\t    {\n\t\t      self->InStream(self, NULL);\n\t\t    }\n\t\t}\n\t    }\n\t  else\n\t    return FALSE;\n\t  break;\n\tdefault:\n\t  break;\n\t}\n    }\n\n  while (((width == NO_WIDTH) || (self->processed - count < width)) &&\n\t (! ((self->current == EOF) || isspace(self->current))))\n    {\n      if (isascii(self->current))\n\t{\n\t  digit = internalDigitArray[self->current];\n\t  /* Abort if digit is not allowed in the specified base */\n\t  if ((digit == -1) || (digit >= base))\n\t    break;\n\t}\n#if TRIO_FEATURE_QUOTE\n      else if (flags & FLAGS_QUOTE)\n\t{\n\t  /* Compare with thousands separator */\n\t  for (j = 0; internalThousandSeparator[j] && self->current; j++)\n\t    {\n\t      if (internalThousandSeparator[j] != self->current)\n\t\tbreak;\n\n\t      self->InStream(self, NULL);\n\t    }\n\t  if (internalThousandSeparator[j])\n\t    break; /* Mismatch */\n\t  else\n\t    continue; /* Match */\n\t}\n#endif\n      else\n\tbreak;\n            \n      number *= base;\n      number += digit;\n      gotNumber = TRUE; /* we need at least one digit */\n\n      self->InStream(self, NULL);\n    }\n\n  /* Was anything read at all? */\n  if (!gotNumber)\n    return FALSE;\n  \n  if (target)\n    *target = (isNegative) ? (trio_uintmax_t)(-((trio_intmax_t)number)) : number;\n  return TRUE;\n}\n\n/*************************************************************************\n * TrioReadChar\n */\nTRIO_PRIVATE int\nTrioReadChar\nTRIO_ARGS4((self, target, flags, width),\n\t   trio_class_t *self,\n\t   char *target,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int i;\n  char ch;\n  trio_uintmax_t number;\n  \n  assert(VALID(self));\n  assert(VALID(self->InStream));\n\n  for (i = 0;\n       (self->current != EOF) && (i < width);\n       i++)\n    {\n      ch = (char)self->current;\n      self->InStream(self, NULL);\n      if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH))\n\t{\n\t  switch (self->current)\n\t    {\n\t    case '\\\\': ch = '\\\\'; break;\n\t    case 'a': ch = '\\007'; break;\n\t    case 'b': ch = '\\b'; break;\n\t    case 'f': ch = '\\f'; break;\n\t    case 'n': ch = '\\n'; break;\n\t    case 'r': ch = '\\r'; break;\n\t    case 't': ch = '\\t'; break;\n\t    case 'v': ch = '\\v'; break;\n\t    default:\n\t      if (isdigit(self->current))\n\t\t{\n\t\t  /* Read octal number */\n\t\t  if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL))\n\t\t    return 0;\n\t\t  ch = (char)number;\n\t\t}\n\t      else if (trio_to_upper(self->current) == 'X')\n\t\t{\n\t\t  /* Read hexadecimal number */\n\t\t  self->InStream(self, NULL);\n\t\t  if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX))\n\t\t    return 0;\n\t\t  ch = (char)number;\n\t\t}\n\t      else\n\t\t{\n\t\t  ch = (char)self->current;\n\t\t}\n\t      break;\n\t    }\n\t}\n      \n      if (target)\n\ttarget[i] = ch;\n    }\n  return i + 1;\n}\n\n/*************************************************************************\n * TrioReadString\n */\nTRIO_PRIVATE BOOLEAN_T\nTrioReadString\nTRIO_ARGS4((self, target, flags, width),\n\t   trio_class_t *self,\n\t   char *target,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int i;\n  \n  assert(VALID(self));\n  assert(VALID(self->InStream));\n\n  TrioSkipWhitespaces(self);\n    \n  /*\n   * Continue until end of string is reached, a whitespace is encountered,\n   * or width is exceeded\n   */\n  for (i = 0;\n       ((width == NO_WIDTH) || (i < width)) &&\n       (! ((self->current == EOF) || isspace(self->current)));\n       i++)\n    {\n      if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0)\n\tbreak; /* for */\n    }\n  if (target)\n    target[i] = NIL;\n  return TRUE;\n}\n\n/*************************************************************************\n * TrioReadWideChar\n */\n#if TRIO_FEATURE_WIDECHAR\nTRIO_PRIVATE int\nTrioReadWideChar\nTRIO_ARGS4((self, target, flags, width),\n\t   trio_class_t *self,\n\t   trio_wchar_t *target,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int i;\n  int j;\n  int size;\n  int amount = 0;\n  trio_wchar_t wch;\n  char buffer[MB_LEN_MAX + 1];\n  \n  assert(VALID(self));\n  assert(VALID(self->InStream));\n\n  for (i = 0;\n       (self->current != EOF) && (i < width);\n       i++)\n    {\n      if (isascii(self->current))\n\t{\n\t  if (TrioReadChar(self, buffer, flags, 1) == 0)\n\t    return 0;\n\t  buffer[1] = NIL;\n\t}\n      else\n\t{\n\t  /*\n\t   * Collect a multibyte character, by enlarging buffer until\n\t   * it contains a fully legal multibyte character, or the\n\t   * buffer is full.\n\t   */\n\t  j = 0;\n\t  do\n\t    {\n\t      buffer[j++] = (char)self->current;\n\t      buffer[j] = NIL;\n\t      self->InStream(self, NULL);\n\t    }\n\t  while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j));\n\t}\n      if (target)\n\t{\n\t  size = mbtowc(&wch, buffer, sizeof(buffer));\n\t  if (size > 0)\n\t    target[i] = wch;\n\t}\n      amount += size;\n      self->InStream(self, NULL);\n    }\n  return amount;\n}\n#endif /* TRIO_FEATURE_WIDECHAR */\n\n/*************************************************************************\n * TrioReadWideString\n */\n#if TRIO_FEATURE_WIDECHAR\nTRIO_PRIVATE BOOLEAN_T\nTrioReadWideString\nTRIO_ARGS4((self, target, flags, width),\n\t   trio_class_t *self,\n\t   trio_wchar_t *target,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int i;\n  int size;\n  \n  assert(VALID(self));\n  assert(VALID(self->InStream));\n\n  TrioSkipWhitespaces(self);\n\n#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)\n  /* Required by TrioReadWideChar */\n  (void)mblen(NULL, 0);\n#endif\n  \n  /*\n   * Continue until end of string is reached, a whitespace is encountered,\n   * or width is exceeded\n   */\n  for (i = 0;\n       ((width == NO_WIDTH) || (i < width)) &&\n       (! ((self->current == EOF) || isspace(self->current)));\n       )\n    {\n      size = TrioReadWideChar(self, &target[i], flags, 1);\n      if (size == 0)\n\tbreak; /* for */\n\n      i += size;\n    }\n  if (target)\n    target[i] = WCONST('\\0');\n  return TRUE;\n}\n#endif /* TRIO_FEATURE_WIDECHAR */\n\n/*************************************************************************\n * TrioReadGroup\n *\n * Reads non-empty character groups.\n *\n * FIXME: characterclass does not work with multibyte characters\n */\nTRIO_PRIVATE BOOLEAN_T\nTrioReadGroup\nTRIO_ARGS5((self, target, characterclass, flags, width),\n\t   trio_class_t *self,\n\t   char *target,\n\t   int *characterclass,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int ch;\n  int i;\n  \n  assert(VALID(self));\n  assert(VALID(self->InStream));\n\n  ch = self->current;\n  for (i = 0;\n       ((width == NO_WIDTH) || (i < width)) &&\n       (! ((ch == EOF) ||\n\t   (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0))));\n       i++)\n    {\n      if (target)\n\ttarget[i] = (char)ch;\n      self->InStream(self, &ch);\n    }\n\n  if (i == 0)\n    return FALSE;\n\n  /* Terminate the string if input saved */\n  if (target)\n    target[i] = NIL;\n  return TRUE;\n}\n\n/*************************************************************************\n * TrioReadDouble\n *\n * FIXME:\n *  add long double\n *  handle base\n */\n#if TRIO_FEATURE_FLOAT\nTRIO_PRIVATE BOOLEAN_T\nTrioReadDouble\nTRIO_ARGS4((self, target, flags, width),\n\t   trio_class_t *self,\n\t   trio_pointer_t target,\n\t   trio_flags_t flags,\n\t   int width)\n{\n  int ch;\n  char doubleString[512];\n  int offset = 0;\n  int start;\n# if TRIO_FEATURE_QUOTE\n  int j;\n# endif\n  BOOLEAN_T isHex = FALSE;\n  trio_long_double_t infinity;\n\n  doubleString[0] = 0;\n  \n  if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1))\n    width = sizeof(doubleString) - 1;\n  \n  TrioSkipWhitespaces(self);\n  \n  /*\n   * Read entire double number from stream. trio_to_double requires\n   * a string as input, but InStream can be anything, so we have to\n   * collect all characters.\n   */\n  ch = self->current;\n  if ((ch == '+') || (ch == '-'))\n    {\n      doubleString[offset++] = (char)ch;\n      self->InStream(self, &ch);\n      width--;\n    }\n\n  start = offset;\n  switch (ch)\n    {\n    case 'n':\n    case 'N':\n      /* Not-a-number */\n      if (offset != 0)\n\tbreak;\n      /* FALLTHROUGH */\n    case 'i':\n    case 'I':\n      /* Infinity */\n      while (isalpha(ch) && (offset - start < width))\n\t{\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n      doubleString[offset] = NIL;\n\n      /* Case insensitive string comparison */\n      if (trio_equal(&doubleString[start], INFINITE_UPPER) ||\n\t  trio_equal(&doubleString[start], LONG_INFINITE_UPPER))\n\t{\n\t  infinity = ((start == 1) && (doubleString[0] == '-'))\n\t    ? trio_ninf()\n\t    : trio_pinf();\n\t  if (flags & FLAGS_LONGDOUBLE)\n\t    {\n\t      *((trio_long_double_t *)target) = infinity;\n\t    }\n\t  else if (flags & FLAGS_LONG)\n\t    {\n\t      *((double *)target) = infinity;\n\t    }\n\t  else\n\t    {\n\t      *((float *)target) = infinity;\n\t    }\n\t  return TRUE;\n\t}\n      if (trio_equal(doubleString, NAN_UPPER))\n\t{\n\t  /* NaN must not have a preceeding + nor - */\n\t  if (flags & FLAGS_LONGDOUBLE)\n\t    {\n\t      *((trio_long_double_t *)target) = trio_nan();\n\t    }\n\t  else if (flags & FLAGS_LONG)\n\t    {\n\t      *((double *)target) = trio_nan();\n\t    }\n\t  else\n\t    {\n\t      *((float *)target) = trio_nan();\n\t    }\n\t  return TRUE;\n\t}\n      return FALSE;\n\n    case '0':\n      doubleString[offset++] = (char)ch;\n      self->InStream(self, &ch);\n      if (trio_to_upper(ch) == 'X')\n\t{\n\t  isHex = TRUE;\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n      break;\n      \n    default:\n      break;\n    }\n  \n  while ((ch != EOF) && (offset - start < width))\n    {\n      /* Integer part */\n      if (isHex ? isxdigit(ch) : isdigit(ch))\n\t{\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n# if TRIO_FEATURE_QUOTE\n      else if (flags & FLAGS_QUOTE)\n\t{\n\t  /* Compare with thousands separator */\n\t  for (j = 0; internalThousandSeparator[j] && self->current; j++)\n\t    {\n\t      if (internalThousandSeparator[j] != self->current)\n\t\tbreak;\n\n\t      self->InStream(self, &ch);\n\t    }\n\t  if (internalThousandSeparator[j])\n\t    break; /* Mismatch */\n\t  else\n\t    continue; /* Match */\n\t}\n# endif\n      else\n\tbreak; /* while */\n    }\n  if (ch == '.')\n    {\n      /* Decimal part */\n      doubleString[offset++] = (char)ch;\n      self->InStream(self, &ch);\n      while ((isHex ? isxdigit(ch) : isdigit(ch)) &&\n\t     (offset - start < width))\n\t{\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n    }\n  if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E'))\n    {\n      /* Exponent */\n      doubleString[offset++] = (char)ch;\n      self->InStream(self, &ch);\n      if ((ch == '+') || (ch == '-'))\n\t{\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n      while (isdigit(ch) && (offset - start < width))\n\t{\n\t  doubleString[offset++] = (char)ch;\n\t  self->InStream(self, &ch);\n\t}\n    }\n\n  if ((offset == start) || (*doubleString == NIL))\n    return FALSE;\n\n  doubleString[offset] = 0;\n  \n  if (flags & FLAGS_LONGDOUBLE)\n    {\n      *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL);\n    }\n  else if (flags & FLAGS_LONG)\n    {\n      *((double *)target) = trio_to_double(doubleString, NULL);\n    }\n  else\n    {\n      *((float *)target) = trio_to_float(doubleString, NULL);\n    }\n  return TRUE;\n}\n#endif /* TRIO_FEATURE_FLOAT */\n\n/*************************************************************************\n * TrioReadPointer\n */\nTRIO_PRIVATE BOOLEAN_T\nTrioReadPointer\nTRIO_ARGS3((self, target, flags),\n\t   trio_class_t *self,\n\t   trio_pointer_t *target,\n\t   trio_flags_t flags)\n{\n  trio_uintmax_t number;\n  char buffer[sizeof(internalNullString)];\n\n  flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING);\n  \n  if (TrioReadNumber(self,\n\t\t     &number,\n\t\t     flags,\n\t\t     POINTER_WIDTH,\n\t\t     BASE_HEX))\n    {\n      if (target)\n\t{\n#if defined(TRIO_COMPILER_GCC) || defined(TRIO_COMPILER_MIPSPRO)\n\t  /*\n\t   * The strange assignment of number is a workaround for a compiler\n\t   * warning\n\t   */\n\t  *target = &((char *)0)[number];\n#else\n\t  *target = (trio_pointer_t)number;\n#endif\n\t}\n      return TRUE;\n    }\n  else if (TrioReadString(self,\n\t\t\t  (flags & FLAGS_IGNORE)\n\t\t\t  ? NULL\n\t\t\t  : buffer,\n\t\t\t  0,\n\t\t\t  sizeof(internalNullString) - 1))\n    {\n      if (trio_equal_case(buffer, internalNullString))\n\t{\n\t  if (target)\n\t    *target = NULL;\n\t  return TRUE;\n\t}\n    }\n  return FALSE;\n}\n\n/*************************************************************************\n * TrioScanProcess\n */\nTRIO_PRIVATE int\nTrioScanProcess\nTRIO_ARGS3((data, format, parameters),\n\t   trio_class_t *data,\n\t   TRIO_CONST char *format,\n\t   trio_parameter_t *parameters)\n{\n  int status;\n  int assignment;\n  int ch;\n  int offset; /* Offset of format string */\n  int i; /* Offset of current parameter */\n  trio_flags_t flags;\n  int width;\n  int base;\n  trio_pointer_t pointer;\n\n  /* Return on empty format string */\n  if (format[0] == NIL)\n    return 0;\n\n  status = 0;\n  assignment = 0;\n  i = 0;\n  offset = 0;\n  data->InStream(data, &ch);\n\n  for (;;)\n    {\n      /* Skip the parameter entries */\n      while (parameters[i].type == FORMAT_PARAMETER)\n\t{\n\t  assert(i <= MAX_PARAMETERS);\n\t  i++;\n\t}\n\n      /* Compare non conversion-specifier part of format string */\n      while (offset < parameters[i].beginOffset)\n\t{\n\t  if ((CHAR_IDENTIFIER == format[offset]) &&\n\t      (CHAR_IDENTIFIER == format[offset + 1]))\n\t    {\n\t      /* Two % in format matches one % in input stream */\n\t      if (CHAR_IDENTIFIER == ch)\n\t\t{\n\t\t  data->InStream(data, &ch);\n\t\t  offset += 2;\n\t\t  continue; /* while format chars left */\n\t\t}\n\t      else\n\t\t{\n\t\t  status = TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t\t  goto end;\n\t\t}\n\t    }\n\t  else /* Not an % identifier */\n\t    {\n\t      if (isspace((int)format[offset]))\n\t\t{\n\t\t  /* Whitespaces may match any amount of whitespaces */\n\t\t  ch = TrioSkipWhitespaces(data);\n\t\t}\n\t      else if (ch == format[offset])\n\t\t{\n\t\t  data->InStream(data, &ch);\n\t\t}\n\t      else\n\t\t{\n\t\t  status = assignment;\n\t\t  goto end;\n\t\t}\n\n\t      offset++;\n\t    }\n\t}\n\n      if (parameters[i].type == FORMAT_SENTINEL)\n\tbreak;\n\n      if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT))\n\t{\n\t  status = (assignment > 0) ? assignment : EOF;\n\t  goto end;\n\t}\n\n      flags = parameters[i].flags;\n\n      /* Find width */\n      width = parameters[i].width;\n      if (flags & FLAGS_WIDTH_PARAMETER)\n\t{\n\t  /* Get width from parameter list */\n\t  width = (int)parameters[width].data.number.as_signed;\n\t}\n\n      /* Find base */\n      if (NO_BASE != parameters[i].baseSpecifier)\n\t{\n\t  /* Base from specifier has priority */\n\t  base = parameters[i].baseSpecifier;\n\t}\n      else if (flags & FLAGS_BASE_PARAMETER)\n\t{\n\t  /* Get base from parameter list */\n\t  base = parameters[i].base;\n\t  base = (int)parameters[base].data.number.as_signed;\n\t}\n      else\n\t{\n\t  /* Use base from format string */\n\t  base = parameters[i].base;\n\t}\n\n      switch (parameters[i].type)\n\t{\n\tcase FORMAT_INT:\n\t  {\n\t    trio_uintmax_t number;\n\n\t    if (0 == base)\n\t      base = BASE_DECIMAL;\n\n\t    if (!TrioReadNumber(data,\n\t\t\t\t&number,\n\t\t\t\tflags,\n\t\t\t\twidth,\n\t\t\t\tbase))\n\t      {\n\t\tstatus = assignment;\n\t\tgoto end;\n\t      }\n\n\t    if (!(flags & FLAGS_IGNORE))\n\t      {\n\t\tassignment++;\n\n\t\tpointer = parameters[i].data.pointer;\n#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER\n\t\tif (flags & FLAGS_SIZE_T)\n\t\t  *(size_t *)pointer = (size_t)number;\n\t\telse\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\n\t\tif (flags & FLAGS_PTRDIFF_T)\n\t\t  *(ptrdiff_t *)pointer = (ptrdiff_t)number;\n\t\telse\n#endif\n#if TRIO_FEATURE_INTMAX_T\n\t\tif (flags & FLAGS_INTMAX_T)\n\t\t  *(trio_intmax_t *)pointer = (trio_intmax_t)number;\n\t\telse\n#endif\n\t\tif (flags & FLAGS_QUAD)\n\t\t  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number;\n\t\telse if (flags & FLAGS_LONG)\n\t\t  *(long int *)pointer = (long int)number;\n\t\telse if (flags & FLAGS_SHORT)\n\t\t  *(short int *)pointer = (short int)number;\n\t\telse\n\t\t  *(int *)pointer = (int)number;\n\t      }\n\t  }\n\t  break; /* FORMAT_INT */\n\n\tcase FORMAT_STRING:\n#if TRIO_FEATURE_WIDECHAR\n\t  if (flags & FLAGS_WIDECHAR)\n\t    {\n\t      if (!TrioReadWideString(data,\n\t\t\t\t      (flags & FLAGS_IGNORE)\n\t\t\t\t      ? NULL\n\t\t\t\t      : parameters[i].data.wstring,\n\t\t\t\t      flags,\n\t\t\t\t      width))\n\t\t{\n\t\t  status = assignment;\n\t\t  goto end;\n\t\t}\n\t    }\n\t  else\n#endif\n\t    {\n\t      if (!TrioReadString(data,\n\t\t\t\t  (flags & FLAGS_IGNORE)\n\t\t\t\t  ? NULL\n\t\t\t\t  : parameters[i].data.string,\n\t\t\t\t  flags,\n\t\t\t\t  width))\n\t\t{\n\t\t  status = assignment;\n\t\t  goto end;\n\t\t}\n\t    }\n\t  if (!(flags & FLAGS_IGNORE))\n\t    assignment++;\n\t  break; /* FORMAT_STRING */\n\n#if TRIO_FEATURE_FLOAT\n\tcase FORMAT_DOUBLE:\n\t  {\n\t    if (flags & FLAGS_IGNORE)\n\t      {\n\t\tpointer = NULL;\n\t      }\n\t    else\n\t      {\n\t\tpointer = (flags & FLAGS_LONGDOUBLE)\n\t\t  ? (trio_pointer_t)parameters[i].data.longdoublePointer\n\t\t  : (trio_pointer_t)parameters[i].data.doublePointer;\n\t      }\n\t    if (!TrioReadDouble(data, pointer, flags, width))\n\t      {\n\t\tstatus = assignment;\n\t\tgoto end;\n\t      }\n\t    if (!(flags & FLAGS_IGNORE))\n\t      {\n\t\tassignment++;\n\t      }\n\t    break; /* FORMAT_DOUBLE */\n\t  }\n#endif\n\n\tcase FORMAT_GROUP:\n\t  {\n\t    int characterclass[MAX_CHARACTER_CLASS + 1];\n\n\t    /* Skip over modifiers */\n\t    while (format[offset] != SPECIFIER_GROUP)\n\t      {\n\t\toffset++;\n\t      }\n\t    /* Skip over group specifier */\n\t    offset++;\n\n\t    memset(characterclass, 0, sizeof(characterclass));\n\t    status = TrioGetCharacterClass(format,\n\t\t\t\t\t   &offset,\n\t\t\t\t\t   &flags,\n\t\t\t\t\t   characterclass);\n\t    if (status < 0)\n\t      goto end;\n\n\t    if (!TrioReadGroup(data,\n\t\t\t       (flags & FLAGS_IGNORE)\n\t\t\t       ? NULL\n\t\t\t       : parameters[i].data.string,\n\t\t\t       characterclass,\n\t\t\t       flags,\n\t\t\t       parameters[i].width))\n\t      {\n\t\tstatus = assignment;\n\t\tgoto end;\n\t      }\n\t    if (!(flags & FLAGS_IGNORE))\n\t      assignment++;\n\t  }\n\t  break; /* FORMAT_GROUP */\n\n\tcase FORMAT_COUNT:\n\t  pointer = parameters[i].data.pointer;\n\t  if (NULL != pointer)\n\t    {\n\t      int count = data->processed;\n\t      if (ch != EOF)\n\t\tcount--; /* a character is read, but is not consumed yet */\n#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER\n\t      if (flags & FLAGS_SIZE_T)\n\t\t*(size_t *)pointer = (size_t)count;\n\t      else\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\n\t      if (flags & FLAGS_PTRDIFF_T)\n\t\t*(ptrdiff_t *)pointer = (ptrdiff_t)count;\n\t      else\n#endif\n#if TRIO_FEATURE_INTMAX_T\n\t      if (flags & FLAGS_INTMAX_T)\n\t\t*(trio_intmax_t *)pointer = (trio_intmax_t)count;\n\t      else\n#endif\n\t      if (flags & FLAGS_QUAD)\n\t\t{\n\t\t  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count;\n\t\t}\n\t      else if (flags & FLAGS_LONG)\n\t\t{\n\t\t  *(long int *)pointer = (long int)count;\n\t\t}\n\t      else if (flags & FLAGS_SHORT)\n\t\t{\n\t\t  *(short int *)pointer = (short int)count;\n\t\t}\n\t      else\n\t\t{\n\t\t  *(int *)pointer = (int)count;\n\t\t}\n\t    }\n\t  break; /* FORMAT_COUNT */\n\n\tcase FORMAT_CHAR:\n#if TRIO_FEATURE_WIDECHAR\n\t  if (flags & FLAGS_WIDECHAR)\n\t    {\n\t      if (TrioReadWideChar(data,\n\t\t\t\t   (flags & FLAGS_IGNORE)\n\t\t\t\t   ? NULL\n\t\t\t\t   : parameters[i].data.wstring,\n\t\t\t\t   flags,\n\t\t\t\t   (width == NO_WIDTH) ? 1 : width) == 0)\n\t\t{\n\t\t  status = assignment;\n\t\t  goto end;\n\t\t}\n\t    }\n\t  else\n#endif\n\t    {\n\t      if (TrioReadChar(data,\n\t\t\t       (flags & FLAGS_IGNORE)\n\t\t\t       ? NULL\n\t\t\t       : parameters[i].data.string,\n\t\t\t       flags,\n\t\t\t       (width == NO_WIDTH) ? 1 : width) == 0)\n\t\t{\n\t\t  status = assignment;\n\t\t  goto end;\n\t\t}\n\t    }\n\t  if (!(flags & FLAGS_IGNORE))\n\t    assignment++;\n\t  break; /* FORMAT_CHAR */\n\n\tcase FORMAT_POINTER:\n\t  if (!TrioReadPointer(data,\n\t\t\t       (flags & FLAGS_IGNORE)\n\t\t\t       ? NULL\n\t\t\t       : (trio_pointer_t *)parameters[i].data.pointer,\n\t\t\t       flags))\n\t    {\n\t      status = assignment;\n\t      goto end;\n\t    }\n\t  if (!(flags & FLAGS_IGNORE))\n\t    assignment++;\n\t  break; /* FORMAT_POINTER */\n\n\tcase FORMAT_PARAMETER:\n\t  break; /* FORMAT_PARAMETER */\n\n\tdefault:\n\t  status = TRIO_ERROR_RETURN(TRIO_EINVAL, offset);\n\t  goto end;\n\t}\n\n      ch = data->current;\n      offset = parameters[i].endOffset;\n      i++;\n    }\n\n  status = assignment;\n end:\n  if (data->UndoStream)\n    data->UndoStream(data);\n  return status;\n}\n\n/*************************************************************************\n * TrioScan\n */\nTRIO_PRIVATE int\nTrioScan\nTRIO_ARGS8((source, sourceSize, InStream, UndoStream, format, arglist, argfunc, argarray),\n\t   trio_pointer_t source,\n\t   size_t sourceSize,\n\t   void (*InStream) TRIO_PROTO((trio_class_t *, int *)),\n\t   void (*UndoStream) TRIO_PROTO((trio_class_t *)),\n\t   TRIO_CONST char *format,\n\t   va_list arglist,\n\t   trio_argfunc_t argfunc,\n\t   trio_pointer_t *argarray)\n{\n  int status;\n  trio_parameter_t parameters[MAX_PARAMETERS];\n  trio_class_t data;\n\n  assert(VALID(InStream));\n  assert(VALID(format));\n\n  memset(&data, 0, sizeof(data));\n  data.InStream = InStream;\n  data.UndoStream = UndoStream;\n  data.location = (trio_pointer_t)source;\n  data.max = sourceSize;\n  data.error = 0;\n\n#if defined(USE_LOCALE)\n  if (NULL == internalLocaleValues)\n    {\n      TrioSetLocale();\n    }\n#endif\n\n  status = TrioParse(TYPE_SCAN, format, parameters, arglist, argfunc, argarray);\n  if (status < 0)\n    return status;\n\n  status = TrioScanProcess(&data, format, parameters);\n  if (data.error != 0)\n    {\n      status = data.error;\n    }\n  return status;\n}\n\n/*************************************************************************\n * TrioInStreamFile\n */\n#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO\nTRIO_PRIVATE void\nTrioInStreamFile\nTRIO_ARGS2((self, intPointer),\n\t   trio_class_t *self,\n\t   int *intPointer)\n{\n  FILE *file = (FILE *)self->location;\n\n  assert(VALID(self));\n  assert(VALID(file));\n\n  self->actually.cached = 0;\n\n  /* The initial value of self->current is zero */\n  if (self->current == EOF)\n    {\n      self->error = (ferror(file))\n\t? TRIO_ERROR_RETURN(TRIO_ERRNO, 0)\n\t: TRIO_ERROR_RETURN(TRIO_EOF, 0);\n    }\n  else\n    {\n      self->processed++;\n      self->actually.cached++;\n    }\n\n  self->current = fgetc(file);\n\n  if (VALID(intPointer))\n    {\n      *intPointer = self->current;\n    }\n}\n#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */\n\n/*************************************************************************\n * TrioUndoStreamFile\n */\n#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO\nTRIO_PRIVATE void\nTrioUndoStreamFile\nTRIO_ARGS1((self),\n\t   trio_class_t *self)\n{\n  FILE *file = (FILE *)self->location;\n\n  assert(VALID(self));\n  assert(VALID(file));\n\n  if (self->actually.cached > 0)\n    {\n      assert(self->actually.cached == 1);\n\n      self->current = ungetc(self->current, file);\n      self->actually.cached = 0;\n    }\n}\n#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */\n\n/*************************************************************************\n * TrioInStreamFileDescriptor\n */\n#if TRIO_FEATURE_FD\nTRIO_PRIVATE void\nTrioInStreamFileDescriptor\nTRIO_ARGS2((self, intPointer),\n\t   trio_class_t *self,\n\t   int *intPointer)\n{\n  int fd = *((int *)self->location);\n  int size;\n  unsigned char input;\n\n  assert(VALID(self));\n\n  self->actually.cached = 0;\n\n  size = read(fd, &input, sizeof(char));\n  if (size == -1)\n    {\n      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);\n      self->current = EOF;\n    }\n  else\n    {\n      self->current = (size == 0) ? EOF : input;\n    }\n  if (self->current != EOF)\n    {\n      self->actually.cached++;\n      self->processed++;\n    }\n\n  if (VALID(intPointer))\n    {\n      *intPointer = self->current;\n    }\n}\n#endif /* TRIO_FEATURE_FD */\n\n/*************************************************************************\n * TrioInStreamCustom\n */\n#if TRIO_FEATURE_CLOSURE\nTRIO_PRIVATE void\nTrioInStreamCustom\nTRIO_ARGS2((self, intPointer),\n\t   trio_class_t *self,\n\t   int *intPointer)\n{\n  trio_custom_t *data;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  self->actually.cached = 0;\n\n  data = (trio_custom_t *)self->location;\n\n  self->current = (data->stream.in == NULL)\n    ? NIL\n    : (data->stream.in)(data->closure);\n\n  if (self->current == NIL)\n    {\n      self->current = EOF;\n    }\n  else\n    {\n      self->processed++;\n      self->actually.cached++;\n    }\n\n  if (VALID(intPointer))\n    {\n      *intPointer = self->current;\n    }\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n/*************************************************************************\n * TrioInStreamString\n */\nTRIO_PRIVATE void\nTrioInStreamString\nTRIO_ARGS2((self, intPointer),\n\t   trio_class_t *self,\n\t   int *intPointer)\n{\n  unsigned char **buffer;\n\n  assert(VALID(self));\n  assert(VALID(self->location));\n\n  self->actually.cached = 0;\n\n  buffer = (unsigned char **)self->location;\n  self->current = (*buffer)[0];\n  if (self->current == NIL)\n    {\n      self->current = EOF;\n    }\n  else\n    {\n      (*buffer)++;\n      self->processed++;\n      self->actually.cached++;\n    }\n\n  if (VALID(intPointer))\n    {\n      *intPointer = self->current;\n    }\n}\n\n/*************************************************************************\n *\n * Formatted scanning functions\n *\n ************************************************************************/\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_scanf.h\"\n#endif\n/** @addtogroup Scanf\n    @{\n*/\n\n/*************************************************************************\n * scanf\n */\n\n/**\n   Scan characters from standard input stream.\n\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_scanf\nTRIO_VARGS2((format, va_alist),\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioScan((trio_pointer_t)stdin, 0,\n\t\t    TrioInStreamFile,\n\t\t    TrioUndoStreamFile,\n\t\t    format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/**\n   Scan characters from standard input stream.\n\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_vscanf\nTRIO_ARGS2((format, args),\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)stdin, 0,\n\t\t  TrioInStreamFile,\n\t\t  TrioUndoStreamFile,\n\t\t  format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/**\n   Scan characters from standard input stream.\n\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_STDIO\nTRIO_PUBLIC int\ntrio_scanfv\nTRIO_ARGS2((format, args),\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  \n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)stdin, 0,\n\t\t  TrioInStreamFile,\n\t\t  TrioUndoStreamFile,\n\t\t  format,\n\t\t  unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_STDIO */\n\n/*************************************************************************\n * fscanf\n */\n\n/**\n   Scan characters from file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_fscanf\nTRIO_VARGS3((file, format, va_alist),\n\t    FILE *file,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(file));\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioScan((trio_pointer_t)file, 0,\n\t\t    TrioInStreamFile,\n\t\t    TrioUndoStreamFile,\n\t\t    format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/**\n   Scan characters from file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_vfscanf\nTRIO_ARGS3((file, format, args),\n\t   FILE *file,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(file));\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)file, 0,\n\t\t  TrioInStreamFile,\n\t\t  TrioUndoStreamFile,\n\t\t  format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/**\n   Scan characters from file.\n\n   @param file File pointer.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FILE\nTRIO_PUBLIC int\ntrio_fscanfv\nTRIO_ARGS3((file, format, args),\n\t   FILE *file,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  \n  assert(VALID(file));\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)file, 0,\n\t\t  TrioInStreamFile,\n\t\t  TrioUndoStreamFile,\n\t\t  format,\n\t\t  unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_FILE */\n\n/*************************************************************************\n * dscanf\n */\n\n/**\n   Scan characters from file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_dscanf\nTRIO_VARGS3((fd, format, va_alist),\n\t    int fd,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioScan((trio_pointer_t)&fd, 0,\n\t\t    TrioInStreamFileDescriptor,\n\t\t    NULL,\n\t\t    format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_FD */\n\n/**\n   Scan characters from file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_vdscanf\nTRIO_ARGS3((fd, format, args),\n\t   int fd,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)&fd, 0,\n\t\t  TrioInStreamFileDescriptor,\n\t\t  NULL,\n\t\t  format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_FD */\n\n/**\n   Scan characters from file descriptor.\n\n   @param fd File descriptor.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\n#if TRIO_FEATURE_FD\nTRIO_PUBLIC int\ntrio_dscanfv\nTRIO_ARGS3((fd, format, args),\n\t   int fd,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  \n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)&fd, 0,\n\t\t  TrioInStreamFileDescriptor,\n\t\t  NULL,\n\t\t  format,\n\t\t  unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_FD */\n\n/*************************************************************************\n * cscanf\n */\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_cscanf\nTRIO_VARGS4((stream, closure, format, va_alist),\n\t    trio_instream_t stream,\n\t    trio_pointer_t closure,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  data.stream.in = stream;\n  data.closure = closure;\n  status = TrioScan(&data, 0, TrioInStreamCustom, NULL, format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_vcscanf\nTRIO_ARGS4((stream, closure, format, args),\n\t   trio_instream_t stream,\n\t   trio_pointer_t closure,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  trio_custom_t data;\n  \n  assert(VALID(stream));\n  assert(VALID(format));\n\n  data.stream.in = stream;\n  data.closure = closure;\n  return TrioScan(&data, 0, TrioInStreamCustom, NULL, format, args, NULL, NULL);\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE\nTRIO_PUBLIC int\ntrio_cscanfv\nTRIO_ARGS4((stream, closure, format, args),\n\t   trio_instream_t stream,\n\t   trio_pointer_t closure,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  trio_custom_t data;\n  \n  assert(VALID(stream));\n  assert(VALID(format));\n\n  data.stream.in = stream;\n  data.closure = closure;\n  return TrioScan(&data, 0, TrioInStreamCustom, NULL, format,\n\t\t  unused, TrioArrayGetter, args);\n}\n#endif /* TRIO_FEATURE_CLOSURE */\n\n#if TRIO_FEATURE_CLOSURE && TRIO_FEATURE_ARGFUNC\nTRIO_PUBLIC int\ntrio_cscanff\nTRIO_ARGS5((stream, closure, format, argfunc, context),\n           trio_instream_t stream,\n           trio_pointer_t closure,\n           TRIO_CONST char *format,\n           trio_argfunc_t argfunc,\n           trio_pointer_t context)\n{\n  static va_list unused;\n  trio_custom_t data;\n\n  assert(VALID(stream));\n  assert(VALID(format));\n  assert(VALID(argfunc));\n\n  data.stream.in = stream;\n  data.closure = closure;\n  return TrioScan(&data, 0, TrioInStreamCustom, NULL, format,\n                  unused, argfunc, (trio_pointer_t *)context);\n}\n#endif /* TRIO_FEATURE_CLOSURE && TRIO_FEATURE_ARGFUNC */\n\n/*************************************************************************\n * sscanf\n */\n\n/**\n   Scan characters from string.\n\n   @param buffer Input string.\n   @param format Formatting string.\n   @param ... Arguments.\n   @return Number of scanned characters.\n */\nTRIO_PUBLIC int\ntrio_sscanf\nTRIO_VARGS3((buffer, format, va_alist),\n\t    TRIO_CONST char *buffer,\n\t    TRIO_CONST char *format,\n\t    TRIO_VA_DECL)\n{\n  int status;\n  va_list args;\n\n  assert(VALID(buffer));\n  assert(VALID(format));\n  \n  TRIO_VA_START(args, format);\n  status = TrioScan((trio_pointer_t)&buffer, 0,\n\t\t    TrioInStreamString,\n\t\t    NULL,\n\t\t    format, args, NULL, NULL);\n  TRIO_VA_END(args);\n  return status;\n}\n\n/**\n   Scan characters from string.\n\n   @param buffer Input string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\nTRIO_PUBLIC int\ntrio_vsscanf\nTRIO_ARGS3((buffer, format, args),\n\t   TRIO_CONST char *buffer,\n\t   TRIO_CONST char *format,\n\t   va_list args)\n{\n  assert(VALID(buffer));\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)&buffer, 0,\n\t\t  TrioInStreamString,\n\t\t  NULL,\n\t\t  format, args, NULL, NULL);\n}\n\n/**\n   Scan characters from string.\n\n   @param buffer Input string.\n   @param format Formatting string.\n   @param args Arguments.\n   @return Number of scanned characters.\n */\nTRIO_PUBLIC int\ntrio_sscanfv\nTRIO_ARGS3((buffer, format, args),\n\t   TRIO_CONST char *buffer,\n\t   TRIO_CONST char *format,\n\t   trio_pointer_t *args)\n{\n  static va_list unused;\n  \n  assert(VALID(buffer));\n  assert(VALID(format));\n  \n  return TrioScan((trio_pointer_t)&buffer, 0,\n\t\t  TrioInStreamString,\n\t\t  NULL,\n\t\t  format,\n\t\t  unused, TrioArrayGetter, args);\n}\n\n#endif /* TRIO_FEATURE_SCANF */\n\n/** @} End of Scanf documentation module */\n\n/*************************************************************************\n * trio_strerror\n */\nTRIO_PUBLIC TRIO_CONST char *\ntrio_strerror\nTRIO_ARGS1((errorcode),\n\t   int errorcode)\n{\n#if TRIO_FEATURE_STRERR\n  /* Textual versions of the error codes */\n  switch (TRIO_ERROR_CODE(errorcode))\n    {\n    case TRIO_EOF:\n      return \"End of file\";\n    case TRIO_EINVAL:\n      return \"Invalid argument\";\n    case TRIO_ETOOMANY:\n      return \"Too many arguments\";\n    case TRIO_EDBLREF:\n      return \"Double reference\";\n    case TRIO_EGAP:\n      return \"Reference gap\";\n    case TRIO_ENOMEM:\n      return \"Out of memory\";\n    case TRIO_ERANGE:\n      return \"Invalid range\";\n    case TRIO_ECUSTOM:\n      return \"Custom error\";\n    default:\n      return \"Unknown\";\n    }\n#else\n  return \"Unknown\";\n#endif\n}\n"
  },
  {
    "path": "src/trio/trio.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n *************************************************************************\n *\n * http://ctrio.sourceforge.net/\n *\n ************************************************************************/\n\n#ifndef TRIO_TRIO_H\n#define TRIO_TRIO_H\n\n#if !defined(WITHOUT_TRIO)\n\n/*\n * Use autoconf defines if present. Packages using trio must define\n * HAVE_CONFIG_H as a compiler option themselves.\n */\n#if defined(HAVE_CONFIG_H)\n# include <config.h>\n#endif\n\n#include \"triop.h\"\n\n#include <stdio.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Error codes.\n *\n * Remember to add a textual description to trio_strerror.\n */\nenum {\n  TRIO_EOF      = 1,\n  TRIO_EINVAL   = 2,\n  TRIO_ETOOMANY = 3,\n  TRIO_EDBLREF  = 4,\n  TRIO_EGAP     = 5,\n  TRIO_ENOMEM   = 6,\n  TRIO_ERANGE   = 7,\n  TRIO_ERRNO    = 8,\n  TRIO_ECUSTOM  = 9\n};\n\n/* Error macros */\n#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF)\n#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8)\n#define TRIO_ERROR_NAME(x) trio_strerror(x)\n\n/* Argument function types */\nenum {\n  TRIO_TYPE_POINTER    =  1,\n  TRIO_TYPE_CHAR       =  2,\n  TRIO_TYPE_SHORT      =  3,\n  TRIO_TYPE_INT        =  4,\n  TRIO_TYPE_LONG       =  5,\n  TRIO_TYPE_ULONGLONG  =  6,\n  TRIO_TYPE_UINTMAX    =  7,\n  TRIO_TYPE_PTRDIFF    =  8,\n  TRIO_TYPE_SIZE       =  9,\n  TRIO_TYPE_PCHAR      = 10,\n  TRIO_TYPE_PWCHAR     = 11,\n  TRIO_TYPE_FLOAT      = 12,\n  TRIO_TYPE_DOUBLE     = 13,\n  TRIO_TYPE_LONGDOUBLE = 14\n};\n\ntypedef trio_pointer_t (*trio_argfunc_t) TRIO_PROTO((trio_pointer_t, int, int));\ntypedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int));\ntypedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t));\n\nTRIO_CONST char *trio_strerror TRIO_PROTO((int));\n\n/*************************************************************************\n * Print Functions\n */\n\n#if defined(TRIO_COMPILER_GCC) && !TRIO_EXTENSION\n# define TRIO_PROTO_PRINTF(x,a) TRIO_PROTO(x) __attribute__ ((format (gnu_printf, a, a+1)))\n# define TRIO_PROTO_SCANF(x,a) TRIO_PROTO(x) __attribute__ ((format (gnu_scanf, a, a+1)))\n#else\n# define TRIO_PROTO_PRINTF(x,a) TRIO_PROTO(x)\n# define TRIO_PROTO_SCANF(x,a) TRIO_PROTO(x)\n#endif\n\nint trio_printf TRIO_PROTO_PRINTF((TRIO_CONST char *format, ...), 1);\nint trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args));\nint trio_printfv TRIO_PROTO((TRIO_CONST char *format, trio_pointer_t *args));\n\nint trio_fprintf TRIO_PROTO_PRINTF((FILE *file, TRIO_CONST char *format, ...), 2);\nint trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args));\nint trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, trio_pointer_t *args));\n\nint trio_dprintf TRIO_PROTO_PRINTF((int fd, TRIO_CONST char *format, ...), 2);\nint trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args));\nint trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, trio_pointer_t *args));\n\nint trio_cprintf TRIO_PROTO_PRINTF((trio_outstream_t stream, trio_pointer_t closure,\n                                    TRIO_CONST char *format, ...),\n                                   3);\nint trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure,\n\t\t\t      TRIO_CONST char *format, va_list args));\nint trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure,\n\t\t\t      TRIO_CONST char *format, trio_pointer_t *args));\nint trio_cprintff TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure,\n\t\t\t      TRIO_CONST char *format,\n\t\t\t      trio_argfunc_t func, trio_pointer_t context));\n\nint trio_sprintf TRIO_PROTO_PRINTF((char *buffer, TRIO_CONST char *format, ...), 2);\nint trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args));\nint trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, trio_pointer_t *args));\n\nint trio_snprintf TRIO_PROTO_PRINTF((char *buffer, size_t max, TRIO_CONST char *format, ...), 3);\nint trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format,\n\t\t   va_list args));\nint trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format,\n\t\t   trio_pointer_t *args));\n\nint trio_snprintfcat TRIO_PROTO_PRINTF((char *buffer, size_t max, TRIO_CONST char *format, ...), 3);\nint trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format,\n                      va_list args));\n\n#if defined(TRIO_DEPRECATED)\nchar *trio_aprintf TRIO_PROTO_PRINTF((TRIO_CONST char *format, ...), 1);\nchar *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args));\n#endif\n\nint trio_asprintf TRIO_PROTO_PRINTF((char **ret, TRIO_CONST char *format, ...), 2);\nint trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args));\nint trio_asprintfv TRIO_PROTO((char **result, TRIO_CONST char *format, trio_pointer_t * args));\n\n/*************************************************************************\n * Scan Functions\n */\nint trio_scanf TRIO_PROTO_SCANF((TRIO_CONST char *format, ...), 1);\nint trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args));\nint trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args));\n\nint trio_fscanf TRIO_PROTO_SCANF((FILE *file, TRIO_CONST char *format, ...), 2);\nint trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args));\nint trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args));\n\nint trio_dscanf TRIO_PROTO_SCANF((int fd, TRIO_CONST char *format, ...), 2);\nint trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args));\nint trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args));\n\nint trio_cscanf TRIO_PROTO_SCANF((trio_instream_t stream, trio_pointer_t closure,\n                                  TRIO_CONST char *format, ...),\n                                 3);\nint trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure,\n\t\t\t     TRIO_CONST char *format, va_list args));\nint trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure,\n\t\t\t     TRIO_CONST char *format, void **args));\nint trio_cscanff TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure,\n\t\t\t     TRIO_CONST char *format,\n\t\t\t     trio_argfunc_t func, trio_pointer_t context));\n\nint trio_sscanf TRIO_PROTO_SCANF((TRIO_CONST char *buffer, TRIO_CONST char *format, ...), 2);\nint trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args));\nint trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args));\n\n/*************************************************************************\n * Locale Functions\n */\nvoid trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint));\nvoid trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator));\nvoid trio_locale_set_grouping TRIO_PROTO((char *grouping));\n\n/*************************************************************************\n * Renaming\n */\n#ifdef TRIO_REPLACE_STDIO\n/* Replace the <stdio.h> functions */\n#ifndef HAVE_PRINTF\n# undef printf\n# define printf trio_printf\n#endif\n#ifndef HAVE_VPRINTF\n# undef vprintf\n# define vprintf trio_vprintf\n#endif\n#ifndef HAVE_FPRINTF\n# undef fprintf\n# define fprintf trio_fprintf\n#endif\n#ifndef HAVE_VFPRINTF\n# undef vfprintf\n# define vfprintf trio_vfprintf\n#endif\n#ifndef HAVE_SPRINTF\n# undef sprintf\n# define sprintf trio_sprintf\n#endif\n#ifndef HAVE_VSPRINTF\n# undef vsprintf\n# define vsprintf trio_vsprintf\n#endif\n#ifndef HAVE_SNPRINTF\n# undef snprintf\n# define snprintf trio_snprintf\n#endif\n#ifndef HAVE_VSNPRINTF\n# undef vsnprintf\n# define vsnprintf trio_vsnprintf\n#endif\n#ifndef HAVE_SCANF\n# undef scanf\n# define scanf trio_scanf\n#endif\n#ifndef HAVE_VSCANF\n# undef vscanf\n# define vscanf trio_vscanf\n#endif\n#ifndef HAVE_FSCANF\n# undef fscanf\n# define fscanf trio_fscanf\n#endif\n#ifndef HAVE_VFSCANF\n# undef vfscanf\n# define vfscanf trio_vfscanf\n#endif\n#ifndef HAVE_SSCANF\n# undef sscanf\n# define sscanf trio_sscanf\n#endif\n#ifndef HAVE_VSSCANF\n# undef vsscanf\n# define vsscanf trio_vsscanf\n#endif\n/* These aren't stdio functions, but we make them look similar */\n#undef dprintf\n#define dprintf trio_dprintf\n#undef vdprintf\n#define vdprintf trio_vdprintf\n#undef aprintf\n#define aprintf trio_aprintf\n#undef vaprintf\n#define vaprintf trio_vaprintf\n#undef asprintf\n#define asprintf trio_asprintf\n#undef vasprintf\n#define vasprintf trio_vasprintf\n#undef dscanf\n#define dscanf trio_dscanf\n#undef vdscanf\n#define vdscanf trio_vdscanf\n#endif\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* WITHOUT_TRIO */\n\n#endif /* TRIO_TRIO_H */\n"
  },
  {
    "path": "src/trio/triodef.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************/\n\n#ifndef TRIO_TRIODEF_H\n#define TRIO_TRIODEF_H\n\n/*************************************************************************\n * Compiler support detection\n */\n\n#if defined(__GNUC__)\n# define TRIO_COMPILER_GCC\n#endif\n\n#if defined(__SUNPRO_CC)\n# define TRIO_COMPILER_SUNPRO __SUNPRO_CC\n#else\n# if defined(__SUNPRO_C)\n#  define TRIO_COMPILER_SUNPRO __SUNPRO_C\n# endif\n#endif\n\n#if defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)\n# define TRIO_COMPILER_XLC\n#else\n# if defined(_AIX) && !defined(__GNUC__)\n#  define TRIO_COMPILER_XLC /* Workaround for old xlc */\n# endif\n#endif\n\n#if defined(__DECC) || defined(__DECCXX)\n# define TRIO_COMPILER_DECC\n#else\n# if defined(__osf__) && defined(__LANGUAGE_C__) && !defined(__GNUC__)\n#  define TRIO_COMPILER_DECC /* Workaround for old DEC C compilers */\n# endif\n#endif\n\n#if defined(__HP_aCC) || defined(__HP_cc)\n# define TRIO_COMPILER_HP\n#endif\n\n#if defined(sgi) || defined(__sgi)\n# define TRIO_COMPILER_MIPSPRO\n#endif\n\n#if defined(_MSC_VER)\n# define TRIO_COMPILER_MSVC\n#endif\n\n#if defined(__BORLANDC__)\n# define TRIO_COMPILER_BCB\n#endif\n\n/*************************************************************************\n * Platform support detection\n */\n\n#if defined(VMS) || defined(__VMS)\n# define TRIO_PLATFORM_VMS\n#endif\n\n#if defined(unix) || defined(__unix) || defined(__unix__)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(TRIO_COMPILER_XLC) || defined(_AIX)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(TRIO_COMPILER_DECC) || defined(__osf___)\n# if !defined(TRIO_PLATFORM_VMS)\n#  define TRIO_PLATFORM_UNIX\n# endif\n#endif\n\n#if defined(__NetBSD__)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(__Lynx__)\n# define TRIO_PLATFORM_UNIX\n# define TRIO_PLATFORM_LYNX\n#endif\n\n#if defined(__APPLE__) && defined(__MACH__)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(__QNX__)\n# define TRIO_PLATFORM_UNIX\n# define TRIO_PLATFORM_QNX\n#endif\n\n#if defined(__CYGWIN__)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(AMIGA) && defined(TRIO_COMPILER_GCC)\n# define TRIO_PLATFORM_UNIX\n#endif\n\n#if defined(TRIO_COMPILER_MSVC) || defined(WIN32) || defined(_WIN32)\n# define TRIO_PLATFORM_WIN32\n#endif\n\n#if defined(_WIN32_WCE)\n# define TRIO_PLATFORM_WINCE\n#endif\n\n#if defined(mpeix) || defined(__mpexl)\n# define TRIO_PLATFORM_MPEIX\n#endif\n\n#if defined(_AIX)\n# define TRIO_PLATFORM_AIX\n#endif\n\n#if defined(__hpux)\n# define TRIO_PLATFORM_HPUX\n#endif\n\n#if defined(sun) || defined(__sun__)\n# if defined(__SVR4) || defined(__svr4__)\n#  define TRIO_PLATFORM_SOLARIS\n# else\n#  define TRIO_PLATFORM_SUNOS\n# endif\n#endif\n\n#if defined(__powerpc) || defined(__powerpc__) || defined(_ARCH_PPC)\n# define TRIO_CPU_POWERPC\n#endif\n\n#if defined(__sparc) || defined(__sparc__)\n# define TRIO_CPU_SPARC\n#endif\n\n#if defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH__)\n# define TRIO_CPU_SYSTEMZ\n#endif\n\n/*************************************************************************\n * Standards support detection\n */\n\n#if defined(__STDC__) \\\n || defined(_MSC_EXTENSIONS) \\\n || defined(TRIO_COMPILER_BCB)\n# define PREDEF_STANDARD_C89\n#endif\n#if defined(__STDC_VERSION__)\n# define PREDEF_STANDARD_C90\n#endif\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199409L)\n# define PREDEF_STANDARD_C94\n#endif\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n# define PREDEF_STANDARD_C99\n#endif\n#if defined(TRIO_COMPILER_SUNPRO) && (TRIO_COMPILER_SUNPRO >= 0x420)\n# if !defined(PREDEF_STANDARD_C94)\n#  define PREDEF_STANDARD_C94\n# endif\n#endif\n\n#if defined(__cplusplus)\n# define PREDEF_STANDARD_CXX\n#endif\n#if defined(__cplusplus) && (__cplusplus >= 199711L)\n# define PREDEF_STANDARD_CXX89\n#endif\n\n#if defined(TRIO_PLATFORM_UNIX)\n# include <unistd.h>\n#endif\n\n#if defined(_POSIX_VERSION)\n# define PREDEF_STANDARD_POSIX _POSIX_VERSION\n# if (_POSIX_VERSION >= 199506L)\n#  define PREDEF_STANDARD_POSIX_1996\n# endif\n#endif\n\n#if (_XOPEN_VERSION - 0 >= 3) || defined(_XOPEN_XPG3)\n# define PREDEF_STANDARD_XPG3\n#endif\n#if (_XOPEN_VERSION - 0 >= 4) || defined(_XOPEN_XPG4)\n# define PREDEF_STANDARD_XPG4\n#endif\n#if (_XOPEN_VERSION - 0 > 4) \\\n || (defined(_XOPEN_UNIX) && (_XOPEN_VERSION - 0 == 4))\n# define PREDEF_STANDARD_UNIX95\n#endif\n#if (_XOPEN_VERSION - 0 >= 500)\n# define PREDEF_STANDARD_UNIX98\n#endif\n#if (_XOPEN_VERSION - 0 >= 600)\n# define PREDEF_STANDARD_UNIX03\n#endif\n\n/*************************************************************************\n * Generic defines\n */\n\n#if !defined(TRIO_PUBLIC)\n/* Based on http://gcc.gnu.org/wiki/Visibility */\n# if defined(TRIO_PLATFORM_WIN32) || defined (__CYGWIN__)\n#  if defined(BUILDING_DLL)\n#   if defined(TRIO_COMPILER_GCC)\n#    define TRIO_PUBLIC __attribute__ ((dllexport))\n#   else\n#    define TRIO_PUBLIC __declspec(dllexport)\n#   endif\n#  else\n#   if defined(TRIO_COMPILER_GCC)\n#    define TRIO_PUBLIC __attribute__ ((dllimport))\n#   else\n#    define TRIO_PUBLIC __declspec(dllimport)\n#   endif\n#  endif\n# else\n#  if defined(TRIO_COMPILER_GCC) && __GNUC__ >= 4\n#   define TRIO_PUBLIC __attribute__ ((visibility (\"default\")))\n#   define TRIO_PRIVATE __attribute__ ((visibility (\"hidden\")))\n#  else\n#   define TRIO_PUBLIC\n#  endif\n# endif\n#endif\n#if !defined(TRIO_PRIVATE)\n# define TRIO_PRIVATE static\n#endif\n\n#if !(defined(PREDEF_STANDARD_C89) || defined(PREDEF_STANDARD_CXX))\n# define TRIO_COMPILER_ANCIENT\n#endif\n\n#if defined(TRIO_COMPILER_ANCIENT)\n# define TRIO_CONST\n# define TRIO_VOLATILE\n# define TRIO_SIGNED\ntypedef double trio_long_double_t;\ntypedef char * trio_pointer_t;\n# define TRIO_SUFFIX_LONG(x) x\n# define TRIO_PROTO(x) ()\n# define TRIO_NOARGS\n# define TRIO_ARGS1(list,a1) list a1;\n# define TRIO_ARGS2(list,a1,a2) list a1; a2;\n# define TRIO_ARGS3(list,a1,a2,a3) list a1; a2; a3;\n# define TRIO_ARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4;\n# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5;\n# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) list a1; a2; a3; a4; a5; a6;\n# define TRIO_ARGS7(list,a1,a2,a3,a4,a5,a6,a7) list a1; a2; a3; a4; a5; a6; a7;\n# define TRIO_ARGS8(list,a1,a2,a3,a4,a5,a6,a7,a8) list a1; a2; a3; a4; a5; a6; a7; a8;\n# define TRIO_VARGS2(list,a1,a2) list a1; a2\n# define TRIO_VARGS3(list,a1,a2,a3) list a1; a2; a3\n# define TRIO_VARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4\n# define TRIO_VARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5\n# define TRIO_VA_DECL va_dcl\n# define TRIO_VA_START(x,y) va_start(x)\n# define TRIO_VA_END(x) va_end(x)\n#else /* ANSI C */\n# define TRIO_CONST const\n# define TRIO_VOLATILE volatile\n# define TRIO_SIGNED signed\ntypedef long double trio_long_double_t;\ntypedef void * trio_pointer_t;\n# define TRIO_SUFFIX_LONG(x) x ## L\n# define TRIO_PROTO(x) x\n# define TRIO_NOARGS void\n# define TRIO_ARGS1(list,a1) (a1)\n# define TRIO_ARGS2(list,a1,a2) (a1,a2)\n# define TRIO_ARGS3(list,a1,a2,a3) (a1,a2,a3)\n# define TRIO_ARGS4(list,a1,a2,a3,a4) (a1,a2,a3,a4)\n# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) (a1,a2,a3,a4,a5)\n# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) (a1,a2,a3,a4,a5,a6)\n# define TRIO_ARGS7(list,a1,a2,a3,a4,a5,a6,a7) (a1,a2,a3,a4,a5,a6,a7)\n# define TRIO_ARGS8(list,a1,a2,a3,a4,a5,a6,a7,a8) (a1,a2,a3,a4,a5,a6,a7,a8)\n# define TRIO_VARGS2 TRIO_ARGS2\n# define TRIO_VARGS3 TRIO_ARGS3\n# define TRIO_VARGS4 TRIO_ARGS4\n# define TRIO_VARGS5 TRIO_ARGS5\n# define TRIO_VA_DECL ...\n# define TRIO_VA_START(x,y) va_start(x,y)\n# define TRIO_VA_END(x) va_end(x)\n#endif\n\n#if defined(PREDEF_STANDARD_C99) || defined(PREDEF_STANDARD_CXX)\n# define TRIO_INLINE inline\n#else\n# if defined(TRIO_COMPILER_GCC)\n#  define TRIO_INLINE __inline__\n# endif\n# if defined(TRIO_COMPILER_MSVC)\n#  define TRIO_INLINE _inline\n# endif\n# if defined(TRIO_COMPILER_BCB)\n#  define TRIO_INLINE __inline\n# endif\n#endif\n#if !defined(TRIO_INLINE)\n# define TRIO_INLINE\n#endif\n\n/*************************************************************************\n * Workarounds\n */\n\n#if defined(TRIO_PLATFORM_VMS)\n/*\n * Computations done with constants at compile time can trigger these\n * even when compiling with IEEE enabled.\n */\n# pragma message disable (UNDERFLOW, FLOATOVERFL)\n\n# if (__CRTL_VER < 80210001)\n/*\n * Although the compiler supports C99 language constructs, the C\n * run-time library does not contain all C99 functions.\n */\n#  if defined(PREDEF_STANDARD_C99)\n#   undef PREDEF_STANDARD_C99\n#  endif\n# endif\n#endif\n\n/*\n * Not all preprocessors supports the LL token.\n */\n#if defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB)\n#else\n# define TRIO_COMPILER_SUPPORTS_LL\n#endif\n\n#if defined(__CYGWIN__)\n/*\n * Cygwin defines the macros for hosted C99, but does not support certain\n * long double math functions.\n */\n# include <cygwin/version.h>\n# define TRIO_CYGWIN_VERSION_API CYGWIN_VERSION_API_MAJOR * 1000 + \\\n   CYGWIN_VERSION_API_MINOR\n/*\n * Please change the version number below when the Cygwin API supports\n * long double math functions (powl, fmodl, etc.)\n */\n# if TRIO_CYGWIN_VERSION_API < 99999999\n#  define TRIO_NO_FLOORL 1\n#  define TRIO_NO_CEILL 1\n#  define TRIO_NO_POWL 1\n#  define TRIO_NO_FMODL 1\n#  define TRIO_NO_LOG10L 1\n# endif\n#endif\n\n# if defined(TRIO_CPU_POWERPC) || defined(TRIO_CPU_SPARC) || defined(TRIO_CPU_SYSTEMZ)\n#  define TRIO_DOUBLE_DOUBLE\n# endif\n\n#endif /* TRIO_TRIODEF_H */\n"
  },
  {
    "path": "src/trio/trionan.c",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************\n *\n * Functions to handle special quantities in floating-point numbers\n * (that is, NaNs and infinity). They provide the capability to detect\n * and fabricate special quantities.\n *\n * Although written to be as portable as possible, it can never be\n * guaranteed to work on all platforms, as not all hardware supports\n * special quantities.\n *\n * The approach used here (approximately) is to:\n *\n *   1. Use C99 functionality when available.\n *   2. Use IEEE 754 bit-patterns if possible.\n *   3. Use platform-specific techniques.\n *\n ************************************************************************/\n\n/*************************************************************************\n * Include files\n */\n#include \"triodef.h\"\n#include \"trionan.h\"\n\n#include <math.h>\n#include <string.h>\n#include <limits.h>\n#if !defined(TRIO_PLATFORM_SYMBIAN)\n# include <float.h>\n#endif\n#if defined(TRIO_PLATFORM_UNIX)\n# include <signal.h>\n#endif\n#if defined(TRIO_COMPILER_DECC)\n# include <fp_class.h>\n#endif\n#include <assert.h>\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_nan.h\"\n#endif\n/** @addtogroup SpecialQuantities\n    @{\n*/\n\n/*************************************************************************\n * Definitions\n */\n\n#if !defined(TRIO_PUBLIC_NAN)\n# define TRIO_PUBLIC_NAN TRIO_PUBLIC\n#endif\n#if !defined(TRIO_PRIVATE_NAN)\n# define TRIO_PRIVATE_NAN TRIO_PRIVATE\n#endif\n#if !defined(TRIO_INLINE_NAN)\n# define TRIO_INLINE_NAN TRIO_INLINE\n#endif\n\n#define TRIO_TRUE (1 == 1)\n#define TRIO_FALSE (0 == 1)\n\n/*\n * We must enable IEEE floating-point on Alpha\n */\n#if defined(__alpha) && !defined(_IEEE_FP)\n# if defined(TRIO_COMPILER_DECC)\n#  if defined(TRIO_PLATFORM_VMS)\n#   error \"Must be compiled with option /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE\"\n#  else\n#   if !defined(_CFE)\n#    error \"Must be compiled with option -ieee\"\n#   endif\n#  endif\n# else\n#  if defined(TRIO_COMPILER_GCC)\n#   error \"Must be compiled with option -mieee\"\n#  endif\n# endif\n#endif /* __alpha && ! _IEEE_FP */\n\n/*\n * In ANSI/IEEE 754-1985 64-bits double format numbers have the\n * following properties (amoungst others)\n *\n *   o FLT_RADIX == 2: binary encoding\n *   o DBL_MAX_EXP == 1024: 11 bits exponent, where one bit is used\n *     to indicate special numbers (e.g. NaN and Infinity), so the\n *     maximum exponent is 10 bits wide (2^10 == 1024).\n *   o DBL_MANT_DIG == 53: The mantissa is 52 bits wide, but because\n *     numbers are normalized the initial binary 1 is represented\n *     implicitly (the so-called \"hidden bit\"), which leaves us with\n *     the ability to represent 53 bits wide mantissa.\n */\n#if defined(__STDC_IEC_559__)\n# define TRIO_IEEE_754\n#else\n# if (FLT_RADIX - 0 == 2) && (DBL_MAX_EXP - 0 == 1024) && (DBL_MANT_DIG - 0 == 53)\n#  define TRIO_IEEE_754\n# endif\n#endif\n\n/*\n * Determine which fpclassify_and_sign() function to use.\n */\n#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)\n# if defined(PREDEF_STANDARD_C99) && defined(fpclassify)\n#  define TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT\n# else\n#  if defined(TRIO_COMPILER_DECC)\n#   define TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT\n#  else\n#   if defined(TRIO_COMPILER_VISUALC) || defined(TRIO_COMPILER_BORLAND)\n#    define TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT\n#   else\n#    if defined(TRIO_COMPILER_HP) && defined(FP_PLUS_NORM)\n#     define TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT\n#    else\n#     if defined(TRIO_COMPILER_XLC) && defined(FP_PLUS_NORM)\n#      define TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT\n#     else\n#      define TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT\n#     endif\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\n/*\n * Determine how to generate negative zero.\n */\n#if defined(TRIO_FUNC_NZERO)\n# if defined(TRIO_IEEE_754)\n#  define TRIO_NZERO_IEEE_754\n# else\n#  define TRIO_NZERO_FALLBACK\n# endif\n#endif\n\n/*\n * Determine how to generate positive infinity.\n */\n#if defined(TRIO_FUNC_PINF)\n# if defined(INFINITY) && defined(__STDC_IEC_559__)\n#  define TRIO_PINF_C99_MACRO\n# else\n#  if defined(TRIO_IEEE_754)\n#   define TRIO_PINF_IEEE_754\n#  else\n#   define TRIO_PINF_FALLBACK\n#  endif\n# endif\n#endif\n\n/*\n * Determine how to generate NaN.\n */\n#if defined(TRIO_FUNC_NAN)\n# if defined(PREDEF_STANDARD_C99) && !defined(TRIO_COMPILER_DECC)\n#  define TRIO_NAN_C99_FUNCTION\n# else\n#  if defined(NAN) && defined(__STDC_IEC_559__)\n#   define TRIO_NAN_C99_MACRO\n#  else\n#   if defined(TRIO_IEEE_754)\n#    define TRIO_NAN_IEEE_754\n#   else\n#    define TRIO_NAN_FALLBACK\n#   endif\n#  endif\n# endif\n#endif\n\n/*\n * Resolve internal dependencies.\n */\n#if defined(TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT)\n# define TRIO_FUNC_INTERNAL_ISNAN\n# define TRIO_FUNC_INTERNAL_ISINF\n# if defined(TRIO_IEEE_754)\n#  define TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY\n#  define TRIO_FUNC_INTERNAL_IS_NEGATIVE\n# endif\n#endif\n\n#if defined(TRIO_NZERO_IEEE_754) \\\n || defined(TRIO_PINF_IEEE_754) \\\n || defined(TRIO_NAN_IEEE_754)\n# define TRIO_FUNC_INTERNAL_MAKE_DOUBLE\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_ISNAN)\n# if defined(PREDEF_STANDARD_XPG3)\n#  define TRIO_INTERNAL_ISNAN_XPG3\n# else\n#  if defined(TRIO_IEEE_754)\n#   define TRIO_INTERNAL_ISNAN_IEEE_754\n#  else\n#   define TRIO_INTERNAL_ISNAN_FALLBACK\n#  endif\n# endif\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_ISINF)\n# if defined(TRIO_IEEE_754)\n#  define TRIO_INTERNAL_ISINF_IEEE_754\n# else\n#  define TRIO_INTERNAL_ISINF_FALLBACK\n# endif\n#endif\n\n/*************************************************************************\n * Constants\n */\n\n#if !defined(TRIO_EMBED_NAN)\nstatic TRIO_CONST char rcsid[] = \"@(#)$Id$\";\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE) \\\n || defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY) \\\n || defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE)\n/*\n * Endian-agnostic indexing macro.\n *\n * The value of internalEndianMagic, when converted into a 64-bit\n * integer, becomes 0x0706050403020100 (we could have used a 64-bit\n * integer value instead of a double, but not all platforms supports\n * that type). The value is automatically encoded with the correct\n * endianess by the compiler, which means that we can support any\n * kind of endianess. The individual bytes are then used as an index\n * for the IEEE 754 bit-patterns and masks.\n */\n#define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)])\nstatic TRIO_CONST double internalEndianMagic = 7.949928895127363e-275;\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY)\n/* Mask for the exponent */\nstatic TRIO_CONST unsigned char ieee_754_exponent_mask[] = {\n  0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\n/* Mask for the mantissa */\nstatic TRIO_CONST unsigned char ieee_754_mantissa_mask[] = {\n  0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\n};\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE)\n/* Mask for the sign bit */\nstatic TRIO_CONST unsigned char ieee_754_sign_mask[] = {\n  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif\n\n#if defined(TRIO_NZERO_IEEE_754)\n/* Bit-pattern for negative zero */\nstatic TRIO_CONST unsigned char ieee_754_negzero_array[] = {\n  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif\n\n#if defined(TRIO_PINF_IEEE_754)\n/* Bit-pattern for infinity */\nstatic TRIO_CONST unsigned char ieee_754_infinity_array[] = {\n  0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif\n\n#if defined(TRIO_NAN_IEEE_754)\n/* Bit-pattern for quiet NaN */\nstatic TRIO_CONST unsigned char ieee_754_qnan_array[] = {\n  0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif\n\n\n/*************************************************************************\n * Internal functions\n */\n\n/*\n *\n */\n#if defined(TRIO_PLATFORM_UNIX) && defined(TRIO_INTERNAL_ISNAN_FALLBACK)\n\n/* Assume that if SA_SIGINFO is defined, then sigaction() and\n * 'struct sigaction' are also properly defined on this platform.\n */\n#ifndef TRIO_USE_SIGACTION\n#  ifdef SA_SIGINFO\n#    define TRIO_USE_SIGACTION 1\n#  else\n#    define TRIO_USE_SIGACTION 0\n#  endif\n#endif\n\n#  if TRIO_USE_SIGACTION\ntypedef struct sigaction signal_handler_t;\n#  else\ntypedef void (*signal_handler_t) TRIO_PROTO((int));\n#  endif\n\n/*\n * internal_ignore_signal_handler\n */\n\nTRIO_PRIVATE_NAN signal_handler_t\ninternal_ignore_signal_handler\nTRIO_ARGS1((signum),\n           int signum)\n{\n#  if TRIO_USE_SIGACTION\n  signal_handler_t old_handler, new_handler;\n  memset(&new_handler, '\\0', sizeof(new_handler));\n  new_handler.sa_handler = SIG_IGN;\n  new_handler.sa_flags = SA_RESTART;\n  sigaction(signum, &new_handler, &old_handler);\n  return old_handler;\n#  else\n  return signal(signum, SIG_IGN);\n#  endif\n}\n\n/*\n * internal_restore_signal_handler\n */\nTRIO_PRIVATE_NAN void\ninternal_restore_signal_handler\nTRIO_ARGS2((signum, handler),\n           int signum,\n           signal_handler_t handler)\n{\n#  if TRIO_USE_SIGACTION\n    sigaction(signum, &handler, NULL);\n#  else\n    signal(signum, handler);\n#  endif\n}\n\n#endif\n\n/*\n * internal_make_double\n */\n#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE)\n\nTRIO_PRIVATE_NAN double\ninternal_make_double\nTRIO_ARGS1((values),\n\t   TRIO_CONST unsigned char *values)\n{\n  TRIO_VOLATILE double result;\n  int i;\n\n  for (i = 0; i < (int)sizeof(double); i++) {\n    ((TRIO_VOLATILE unsigned char *)&result)[TRIO_DOUBLE_INDEX(i)] = values[i];\n  }\n  return result;\n}\n\n#endif\n\n/*\n * internal_is_special_quantity\n */\n#if defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY)\n\nTRIO_PRIVATE_NAN int\ninternal_is_special_quantity\nTRIO_ARGS2((number, has_mantissa),\n\t   double number,\n\t   int *has_mantissa)\n{\n  unsigned int i;\n  unsigned char current;\n  int is_special_quantity = TRIO_TRUE;\n\n  *has_mantissa = 0;\n\n  for (i = 0; i < (unsigned int)sizeof(double); i++) {\n    current = ((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)];\n    is_special_quantity\n      &= ((current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i]);\n    *has_mantissa |= (current & ieee_754_mantissa_mask[i]);\n  }\n  return is_special_quantity;\n}\n\n#endif\n\n/*\n * internal_is_negative\n */\n#if defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE)\n\nTRIO_PRIVATE_NAN int\ninternal_is_negative\nTRIO_ARGS1((number),\n\t   double number)\n{\n  unsigned int i;\n  int is_negative = TRIO_FALSE;\n\n  for (i = 0; i < (unsigned int)sizeof(double); i++) {\n    is_negative |= (((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)]\n\t\t    & ieee_754_sign_mask[i]);\n  }\n  return is_negative;\n}\n\n#endif\n\n#if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PRIVATE_NAN TRIO_INLINE_NAN int\nc99_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t   double number,\n\t   int *is_negative)\n{\n  *is_negative = signbit(number);\n  switch (fpclassify(number)) {\n  case FP_NAN:\n    return TRIO_FP_NAN;\n  case FP_INFINITE:\n    return TRIO_FP_INFINITE;\n  case FP_SUBNORMAL:\n    return TRIO_FP_SUBNORMAL;\n  case FP_ZERO:\n    return TRIO_FP_ZERO;\n  default:\n    return TRIO_FP_NORMAL;\n  }\n}\n\n#endif /* TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT */\n\n#if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PRIVATE_NAN TRIO_INLINE_NAN int\ndecc_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t  double number,\n\t  int *is_negative)\n{\n  switch (fp_class(number)) {\n  case FP_QNAN:\n  case FP_SNAN:\n    *is_negative = TRIO_FALSE; /* NaN has no sign */\n    return TRIO_FP_NAN;\n  case FP_POS_INF:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_INFINITE;\n  case FP_NEG_INF:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_INFINITE;\n  case FP_POS_DENORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_NEG_DENORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_POS_ZERO:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_ZERO;\n  case FP_NEG_ZERO:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_ZERO;\n  case FP_POS_NORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_NORMAL;\n  case FP_NEG_NORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_NORMAL;\n  default:\n    *is_negative = (number < 0.0);\n    return TRIO_FP_NORMAL;\n  }\n}\n\n#endif /* TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT */\n\n#if defined(TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PRIVATE_NAN int\nms_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t  double number,\n\t  int *is_negative)\n{\n  int result;\n# if defined(TRIO_COMPILER_BORLAND)\n  /*\n   * The floating-point precision may be changed by the Borland _fpclass()\n   * function, so we have to save and restore the floating-point control mask.\n   */\n  unsigned int mask;\n  /* Remember the old mask */\n  mask = _control87(0, 0);\n# endif\n  \n  switch (_fpclass(number)) {\n  case _FPCLASS_QNAN:\n  case _FPCLASS_SNAN:\n    *is_negative = TRIO_FALSE; /* NaN has no sign */\n    result = TRIO_FP_NAN;\n    break;\n  case _FPCLASS_PINF:\n    *is_negative = TRIO_FALSE;\n    result = TRIO_FP_INFINITE;\n    break;\n  case _FPCLASS_NINF:\n    *is_negative = TRIO_TRUE;\n    result = TRIO_FP_INFINITE;\n    break;\n  case _FPCLASS_PD:\n    *is_negative = TRIO_FALSE;\n    result = TRIO_FP_SUBNORMAL;\n    break;\n  case _FPCLASS_ND:\n    *is_negative = TRIO_TRUE;\n    result = TRIO_FP_SUBNORMAL;\n    break;\n  case _FPCLASS_PZ:\n    *is_negative = TRIO_FALSE;\n    result = TRIO_FP_ZERO;\n    break;\n  case _FPCLASS_NZ:\n    *is_negative = TRIO_TRUE;\n    result = TRIO_FP_ZERO;\n    break;\n  case _FPCLASS_PN:\n    *is_negative = TRIO_FALSE;\n    result = TRIO_FP_NORMAL;\n    break;\n  case _FPCLASS_NN:\n    *is_negative = TRIO_TRUE;\n    result = TRIO_FP_NORMAL;\n    break;\n  default:\n    *is_negative = (number < 0.0);\n    result = TRIO_FP_NORMAL;\n    break;\n  }\n  \n# if defined(TRIO_COMPILER_BORLAND)\n  /* Restore the old precision */\n  (void)_control87(mask, MCW_PC);\n# endif\n  \n  return result;\n}\n\n#endif /* TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT */\n\n#if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PRIVATE_NAN TRIO_INLINE_NAN int\nhp_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t  double number,\n\t  int *is_negative)\n{\n  /*\n   * HP-UX 9.x and 10.x have an fpclassify() function, that is different\n   * from the C99 fpclassify() macro supported on HP-UX 11.x.\n   */\n  switch (fpclassify(number)) {\n  case FP_QNAN:\n  case FP_SNAN:\n    *is_negative = TRIO_FALSE; /* NaN has no sign */\n    return TRIO_FP_NAN;\n  case FP_PLUS_INF:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_INFINITE;\n  case FP_MINUS_INF:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_INFINITE;\n  case FP_PLUS_DENORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_MINUS_DENORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_PLUS_ZERO:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_ZERO;\n  case FP_MINUS_ZERO:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_ZERO;\n  case FP_PLUS_NORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_NORMAL;\n  case FP_MINUS_NORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_NORMAL;\n  default:\n    *is_negative = (number < 0.0);\n    return TRIO_FP_NORMAL;\n  }\n}\n\n#endif /* TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT */\n\n#if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PRIVATE_NAN TRIO_INLINE_NAN int\nxlc_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t  double number,\n\t  int *is_negative)\n{\n  /*\n   * AIX has class() for C, and _class() for C++\n   */\n# if defined(__cplusplus)\n#  define AIX_CLASS(n) _class(n)\n# else\n#  define AIX_CLASS(n) class(n)\n# endif\n\n  switch (AIX_CLASS(number)) {\n  case FP_QNAN:\n  case FP_SNAN:\n    *is_negative = TRIO_FALSE; /* NaN has no sign */\n    return TRIO_FP_NAN;\n  case FP_PLUS_INF:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_INFINITE;\n  case FP_MINUS_INF:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_INFINITE;\n  case FP_PLUS_DENORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_MINUS_DENORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_SUBNORMAL;\n  case FP_PLUS_ZERO:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_ZERO;\n  case FP_MINUS_ZERO:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_ZERO;\n  case FP_PLUS_NORM:\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_NORMAL;\n  case FP_MINUS_NORM:\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_NORMAL;\n  default:\n    *is_negative = (number < 0.0);\n    return TRIO_FP_NORMAL;\n  }\n}\n\n#endif /* TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT */\n\n#if defined(TRIO_FUNC_INTERNAL_ISNAN)\n\nTRIO_PRIVATE_NAN TRIO_INLINE int\ninternal_isnan\nTRIO_ARGS1((number),\n\t   double number)\n{\n# if defined(TRIO_INTERNAL_ISNAN_XPG3) || defined(TRIO_PLATFORM_SYMBIAN)\n  /*\n   * XPG3 defines isnan() as a function.\n   */\n  return isnan(number);\n\n# endif\n  \n# if defined(TRIO_INTERNAL_ISNAN_IEEE_754)\n  \n  /*\n   * Examine IEEE 754 bit-pattern. A NaN must have a special exponent\n   * pattern, and a non-empty mantissa.\n   */\n  int has_mantissa;\n  int is_special_quantity;\n\n  is_special_quantity = internal_is_special_quantity(number, &has_mantissa);\n  \n  return (is_special_quantity && has_mantissa);\n  \n# endif\n\n# if defined(TRIO_INTERNAL_ISNAN_FALLBACK)\n  \n  /*\n   * Fallback solution\n   */\n  int status;\n  double integral, fraction;\n  \n#  if defined(TRIO_PLATFORM_UNIX)\n  signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);\n#  endif\n  \n  status = (/*\n\t     * NaN is the only number which does not compare to itself\n\t     */\n\t    ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) ||\n\t    /*\n\t     * Fallback solution if NaN compares to NaN\n\t     */\n\t    ((number != 0.0) &&\n\t     (fraction = modf(number, &integral),\n\t      integral == fraction)));\n  \n#  if defined(TRIO_PLATFORM_UNIX)\n  internal_restore_signal_handler(SIGFPR, sigfpe_handler);\n#  endif\n  \n  return status;\n  \n# endif\n}\n\n#endif /* TRIO_FUNC_INTERNAL_ISNAN */\n\n#if defined(TRIO_FUNC_INTERNAL_ISINF)\n\nTRIO_PRIVATE_NAN TRIO_INLINE int\ninternal_isinf\nTRIO_ARGS1((number),\n\t   double number)\n{\n# if defined(TRIO_PLATFORM_SYMBIAN)\n\n  return isinf(number);\n\n# endif\n\n# if defined(TRIO_INTERNAL_ISINF_IEEE_754)\n  /*\n   * Examine IEEE 754 bit-pattern. Infinity must have a special exponent\n   * pattern, and an empty mantissa.\n   */\n  int has_mantissa;\n  int is_special_quantity;\n\n  is_special_quantity = internal_is_special_quantity(number, &has_mantissa);\n  \n  return (is_special_quantity && !has_mantissa)\n    ? ((number < 0.0) ? -1 : 1)\n    : 0;\n\n# endif\n\n# if defined(TRIO_INTERNAL_ISINF_FALLBACK)\n  \n  /*\n   * Fallback solution.\n   */\n  int status;\n  \n#  if defined(TRIO_PLATFORM_UNIX)\n  signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);\n#  endif\n  \n  double infinity = trio_pinf();\n  \n  status = ((number == infinity)\n\t    ? 1\n\t    : ((number == -infinity) ? -1 : 0));\n  \n#  if defined(TRIO_PLATFORM_UNIX)\n  internal_restore_signal_handler(SIGFPE, sigfpe_handler);\n#  endif\n  \n  return status;\n\n# endif\n}\n\n#endif /* TRIO_FUNC_INTERNAL_ISINF */\n\n/*************************************************************************\n * Public functions\n */\n\n#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)\n\nTRIO_PUBLIC_NAN int\ntrio_fpclassify_and_signbit\nTRIO_ARGS2((number, is_negative),\n\t   double number,\n\t   int *is_negative)\n{\n  /* The TRIO_FUNC_xxx_FPCLASSIFY_AND_SIGNBIT macros are mutually exclusive */\n  \n#if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT)\n\n  return c99_fpclassify_and_signbit(number, is_negative);\n\n#endif\n\n#if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT)\n\n  return decc_fpclassify_and_signbit(number, is_negative);\n\n#endif\n\n#if defined(TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT)\n\n  return ms_fpclassify_and_signbit(number, is_negative);\n\n#endif\n\n#if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT)\n\n  return hp_fpclassify_and_signbit(number, is_negative);\n\n#endif\n\n#if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT)\n\n  return xlc_fpclassify_and_signbit(number, is_negative);\n\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT)\n  \n  /*\n   * Fallback solution.\n   */\n  int rc;\n  \n  if (number == 0.0) {\n    /*\n     * In IEEE 754 the sign of zero is ignored in comparisons, so we\n     * have to handle this as a special case by examining the sign bit\n     * directly.\n     */\n# if defined(TRIO_IEEE_754)\n    *is_negative = internal_is_negative(number);\n# else\n    *is_negative = TRIO_FALSE; /* FIXME */\n# endif\n    return TRIO_FP_ZERO;\n  }\n  if (internal_isnan(number)) {\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_NAN;\n  }\n  rc = internal_isinf(number);\n  if (rc != 0) {\n    *is_negative = (rc == -1);\n    return TRIO_FP_INFINITE;\n  }\n  if ((number > 0.0) && (number < DBL_MIN)) {\n    *is_negative = TRIO_FALSE;\n    return TRIO_FP_SUBNORMAL;\n  }\n  if ((number < 0.0) && (number > -DBL_MIN)) {\n    *is_negative = TRIO_TRUE;\n    return TRIO_FP_SUBNORMAL;\n  }\n  *is_negative = (number < 0.0);\n  return TRIO_FP_NORMAL;\n\n#endif\n}\n\n#endif\n\n/**\n   Check for NaN.\n\n   @param number An arbitrary floating-point number.\n   @return Boolean value indicating whether or not the number is a NaN.\n*/\n#if defined(TRIO_FUNC_ISNAN)\n\nTRIO_PUBLIC_NAN int\ntrio_isnan\nTRIO_ARGS1((number),\n\t   double number)\n{\n  int dummy;\n  \n  return (trio_fpclassify_and_signbit(number, &dummy) == TRIO_FP_NAN);\n}\n\n#endif\n\n/**\n   Check for infinity.\n\n   @param number An arbitrary floating-point number.\n   @return 1 if positive infinity, -1 if negative infinity, 0 otherwise.\n*/\n#if defined(TRIO_FUNC_ISINF)\n\nTRIO_PUBLIC_NAN int\ntrio_isinf\nTRIO_ARGS1((number),\n\t   double number)\n{\n  int is_negative;\n  \n  if (trio_fpclassify_and_signbit(number, &is_negative) == TRIO_FP_INFINITE)\n    {\n      return (is_negative) ? -1 : 1;\n    }\n  else\n    {\n      return 0;\n    }\n}\n\n#endif\n\n/**\n   Check for finity.\n\n   @param number An arbitrary floating-point number.\n   @return Boolean value indicating whether or not the number is a finite.\n*/\n#if defined(TRIO_FUNC_ISFINITE)\n\nTRIO_PUBLIC_NAN int\ntrio_isfinite\nTRIO_ARGS1((number),\n\t   double number)\n{\n  int dummy;\n  \n  switch (trio_fpclassify_and_signbit(number, &dummy))\n    {\n    case TRIO_FP_INFINITE:\n    case TRIO_FP_NAN:\n      return 0;\n    default:\n      return 1;\n    }\n}\n\n#endif\n\n/**\n   Examine the sign of a number.\n\n   @param number An arbitrary floating-point number.\n   @return Boolean value indicating whether or not the number has the\n   sign bit set (i.e. is negative).\n*/\n#if defined(TRIO_FUNC_SIGNBIT)\n\nTRIO_PUBLIC_NAN int\ntrio_signbit\nTRIO_ARGS1((number),\n\t   double number)\n{\n  int is_negative;\n  \n  (void)trio_fpclassify_and_signbit(number, &is_negative);\n  return is_negative;\n}\n\n#endif\n\n/**\n   Examine the class of a number.\n\n   @param number An arbitrary floating-point number.\n   @return Enumerable value indicating the class of @p number\n*/\n#if defined(TRIO_FUNC_FPCLASSIFY)\n\nTRIO_PUBLIC_NAN int\ntrio_fpclassify\nTRIO_ARGS1((number),\n\t   double number)\n{\n  int dummy;\n  \n  return trio_fpclassify_and_signbit(number, &dummy);\n}\n\n#endif\n\n/**\n   Generate negative zero.\n\n   @return Floating-point representation of negative zero.\n*/\n#if defined(TRIO_FUNC_NZERO)\n\nTRIO_PUBLIC_NAN double\ntrio_nzero(TRIO_NOARGS)\n{\n# if defined(TRIO_NZERO_IEEE_754)\n  \n  return internal_make_double(ieee_754_negzero_array);\n\n# endif\n  \n# if defined(TRIO_NZERO_FALLBACK)\n  \n  TRIO_VOLATILE double zero = 0.0;\n\n  return -zero;\n  \n# endif\n}\n\n#endif\n\n/**\n   Generate positive infinity.\n\n   @return Floating-point representation of positive infinity.\n*/\n#if defined(TRIO_FUNC_PINF)\n\nTRIO_PUBLIC_NAN double\ntrio_pinf(TRIO_NOARGS)\n{\n  /* Cache the result */\n  static double pinf_value = 0.0;\n\n  if (pinf_value == 0.0) {\n\n# if defined(TRIO_PINF_C99_MACRO)\n    \n    pinf_value = (double)INFINITY;\n\n# endif\n    \n# if defined(TRIO_PINF_IEEE_754)\n    \n    pinf_value = internal_make_double(ieee_754_infinity_array);\n\n# endif\n\n# if defined(TRIO_PINF_FALLBACK)\n    /*\n     * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used\n     * as infinity. Otherwise we have to resort to an overflow\n     * operation to generate infinity.\n     */\n#  if defined(TRIO_PLATFORM_UNIX)\n    signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);\n#  endif\n\n    pinf_value = HUGE_VAL;\n    if (HUGE_VAL == DBL_MAX) {\n      /* Force overflow */\n      pinf_value += HUGE_VAL;\n    }\n    \n#  if defined(TRIO_PLATFORM_UNIX)\n    internal_restore_signal_handler(SIGFPE, sigfpe_handler);\n#  endif\n\n# endif\n  }\n  return pinf_value;\n}\n\n#endif\n\n/**\n   Generate negative infinity.\n\n   @return Floating-point value of negative infinity.\n*/\n#if defined(TRIO_FUNC_NINF)\n\nTRIO_PUBLIC_NAN double\ntrio_ninf(TRIO_NOARGS)\n{\n  static double ninf_value = 0.0;\n\n  if (ninf_value == 0.0) {\n    /*\n     * Negative infinity is calculated by negating positive infinity,\n     * which can be done because it is legal to do calculations on\n     * infinity (for example,  1 / infinity == 0).\n     */\n    ninf_value = -trio_pinf();\n  }\n  return ninf_value;\n}\n\n#endif\n\n/**\n   Generate NaN.\n\n   @return Floating-point representation of NaN.\n*/\n#if defined(TRIO_FUNC_NAN)\n\nTRIO_PUBLIC_NAN double\ntrio_nan(TRIO_NOARGS)\n{\n  /* Cache the result */\n  static double nan_value = 0.0;\n\n  if (nan_value == 0.0) {\n    \n# if defined(TRIO_NAN_C99_FUNCTION) || defined(TRIO_PLATFORM_SYMBIAN)\n    \n    nan_value = nan(\"\");\n\n# endif\n    \n# if defined(TRIO_NAN_C99_MACRO)\n    \n    nan_value = (double)NAN;\n\n# endif\n\n# if defined(TRIO_NAN_IEEE_754)\n    \n    nan_value = internal_make_double(ieee_754_qnan_array);\n\n# endif\n    \n# if defined(TRIO_NAN_FALLBACK)\n    /*\n     * There are several ways to generate NaN. The one used here is\n     * to divide infinity by infinity. I would have preferred to add\n     * negative infinity to positive infinity, but that yields wrong\n     * result (infinity) on FreeBSD.\n     *\n     * This may fail if the hardware does not support NaN, or if\n     * the Invalid Operation floating-point exception is unmasked.\n     */\n#  if defined(TRIO_PLATFORM_UNIX)\n    signal_handle_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);\n#  endif\n    \n    nan_value = trio_pinf() / trio_pinf();\n    \n#  if defined(TRIO_PLATFORM_UNIX)\n    internal_restore_signal_handler(SIGFPE, sigfpe_handler);\n#  endif\n\n# endif\n  }\n  return nan_value;\n}\n\n#endif\n\n/** @} SpecialQuantities */\n\n/*************************************************************************\n * For test purposes.\n *\n * Add the following compiler option to include this test code.\n *\n *  Unix : -DSTANDALONE\n *  VMS  : /DEFINE=(STANDALONE)\n */\n#if defined(STANDALONE)\n# include <stdio.h>\n\nstatic TRIO_CONST char *\ngetClassification\nTRIO_ARGS1((type),\n\t   int type)\n{\n  switch (type) {\n  case TRIO_FP_INFINITE:\n    return \"FP_INFINITE\";\n  case TRIO_FP_NAN:\n    return \"FP_NAN\";\n  case TRIO_FP_NORMAL:\n    return \"FP_NORMAL\";\n  case TRIO_FP_SUBNORMAL:\n    return \"FP_SUBNORMAL\";\n  case TRIO_FP_ZERO:\n    return \"FP_ZERO\";\n  default:\n    return \"FP_UNKNOWN\";\n  }\n}\n\nstatic void\nprint_class\nTRIO_ARGS2((prefix, number),\n\t   TRIO_CONST char *prefix,\n\t   double number)\n{\n  printf(\"%-6s: %s %-15s %g\\n\",\n\t prefix,\n\t trio_signbit(number) ? \"-\" : \"+\",\n\t getClassification(trio_fpclassify(number)),\n\t number);\n}\n\nint main(TRIO_NOARGS)\n{\n  double my_nan;\n  double my_pinf;\n  double my_ninf;\n# if defined(TRIO_PLATFORM_UNIX)\n  signal_handler_t signal_handler;\n# endif\n\n  my_nan = trio_nan();\n  my_pinf = trio_pinf();\n  my_ninf = trio_ninf();\n\n  print_class(\"Nan\", my_nan);\n  print_class(\"PInf\", my_pinf);\n  print_class(\"NInf\", my_ninf);\n  print_class(\"PZero\", 0.0);\n  print_class(\"NZero\", -0.0);\n  print_class(\"PNorm\", 1.0);\n  print_class(\"NNorm\", -1.0);\n  print_class(\"PSub\", 1.01e-307 - 1.00e-307);\n  print_class(\"NSub\", 1.00e-307 - 1.01e-307);\n  \n  printf(\"NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_nan,\n\t ((unsigned char *)&my_nan)[0],\n\t ((unsigned char *)&my_nan)[1],\n\t ((unsigned char *)&my_nan)[2],\n\t ((unsigned char *)&my_nan)[3],\n\t ((unsigned char *)&my_nan)[4],\n\t ((unsigned char *)&my_nan)[5],\n\t ((unsigned char *)&my_nan)[6],\n\t ((unsigned char *)&my_nan)[7],\n\t trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan));\n  printf(\"PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_pinf,\n\t ((unsigned char *)&my_pinf)[0],\n\t ((unsigned char *)&my_pinf)[1],\n\t ((unsigned char *)&my_pinf)[2],\n\t ((unsigned char *)&my_pinf)[3],\n\t ((unsigned char *)&my_pinf)[4],\n\t ((unsigned char *)&my_pinf)[5],\n\t ((unsigned char *)&my_pinf)[6],\n\t ((unsigned char *)&my_pinf)[7],\n\t trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf));\n  printf(\"NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_ninf,\n\t ((unsigned char *)&my_ninf)[0],\n\t ((unsigned char *)&my_ninf)[1],\n\t ((unsigned char *)&my_ninf)[2],\n\t ((unsigned char *)&my_ninf)[3],\n\t ((unsigned char *)&my_ninf)[4],\n\t ((unsigned char *)&my_ninf)[5],\n\t ((unsigned char *)&my_ninf)[6],\n\t ((unsigned char *)&my_ninf)[7],\n\t trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf));\n  \n# if defined(TRIO_PLATFORM_UNIX)\n  signal_handler = internal_ignore_signal_handler(SIGFPE);\n# endif\n  \n  my_pinf = DBL_MAX + DBL_MAX;\n  my_ninf = -my_pinf;\n  my_nan = my_pinf / my_pinf;\n\n# if defined(TRIO_PLATFORM_UNIX)\n  internal_restore_signal_handler(SIGFPE, signal_handler);\n# endif\n  \n  printf(\"NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_nan,\n\t ((unsigned char *)&my_nan)[0],\n\t ((unsigned char *)&my_nan)[1],\n\t ((unsigned char *)&my_nan)[2],\n\t ((unsigned char *)&my_nan)[3],\n\t ((unsigned char *)&my_nan)[4],\n\t ((unsigned char *)&my_nan)[5],\n\t ((unsigned char *)&my_nan)[6],\n\t ((unsigned char *)&my_nan)[7],\n\t trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan));\n  printf(\"PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_pinf,\n\t ((unsigned char *)&my_pinf)[0],\n\t ((unsigned char *)&my_pinf)[1],\n\t ((unsigned char *)&my_pinf)[2],\n\t ((unsigned char *)&my_pinf)[3],\n\t ((unsigned char *)&my_pinf)[4],\n\t ((unsigned char *)&my_pinf)[5],\n\t ((unsigned char *)&my_pinf)[6],\n\t ((unsigned char *)&my_pinf)[7],\n\t trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf));\n  printf(\"NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\\n\",\n\t my_ninf,\n\t ((unsigned char *)&my_ninf)[0],\n\t ((unsigned char *)&my_ninf)[1],\n\t ((unsigned char *)&my_ninf)[2],\n\t ((unsigned char *)&my_ninf)[3],\n\t ((unsigned char *)&my_ninf)[4],\n\t ((unsigned char *)&my_ninf)[5],\n\t ((unsigned char *)&my_ninf)[6],\n\t ((unsigned char *)&my_ninf)[7],\n\t trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf));\n  \n  return 0;\n}\n#endif\n"
  },
  {
    "path": "src/trio/trionan.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************/\n\n#ifndef TRIO_TRIONAN_H\n#define TRIO_TRIONAN_H\n\n#include \"triodef.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(TRIO_PUBLIC_NAN)\n# if !defined(TRIO_PUBLIC)\n#  define TRIO_PUBLIC\n# endif\n# define TRIO_PUBLIC_NAN TRIO_PUBLIC\n#endif\n  \nenum {\n  TRIO_FP_INFINITE,\n  TRIO_FP_NAN,\n  TRIO_FP_NORMAL,\n  TRIO_FP_SUBNORMAL,\n  TRIO_FP_ZERO\n};\n\n/*************************************************************************\n * Dependencies\n */\n\n#if defined(TRIO_EMBED_NAN)\n\n/*\n * The application that trionan is embedded in must define which functions\n * it uses.\n *\n * The following resolves internal dependencies.\n */\n  \n# if defined(TRIO_FUNC_ISNAN) \\\n  || defined(TRIO_FUNC_ISINF)\n#  if !defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)\n#   define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_NAN)\n#  if !defined(TRIO_FUNC_PINF)\n#   define TRIO_FUNC_PINF\n#  endif\n# endif\n  \n# if defined(TRIO_FUNC_NINF)\n#  if !defined(TRIO_FUNC_PINF)\n#   define TRIO_FUNC_PINF\n#  endif\n# endif\n\n# if !defined(TRIO_INLINE_NAN)\n#  define TRIO_INLINE_NAN\n# endif  \n\n#else\n\n/*\n * When trionan is not embedded all all functions are defined.\n */\n  \n# define TRIO_FUNC_NAN\n# define TRIO_FUNC_PINF\n# define TRIO_FUNC_NINF\n# define TRIO_FUNC_NZERO\n# define TRIO_FUNC_ISNAN\n# define TRIO_FUNC_ISINF\n# define TRIO_FUNC_ISFINITE\n# define TRIO_FUNC_SIGNBIT\n# define TRIO_FUNC_FPCLASSIFY\n# define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT\n  \n#endif\n\n/*************************************************************************\n * Functions\n */\n\n/*\n * Return NaN (Not-a-Number).\n */\n#if defined(TRIO_FUNC_NAN)\nTRIO_PUBLIC_NAN double\ntrio_nan\nTRIO_PROTO((void));\n#endif\n\n/*\n * Return positive infinity.\n */\n#if defined(TRIO_FUNC_PINF)\nTRIO_PUBLIC_NAN double\ntrio_pinf\nTRIO_PROTO((void));\n#endif\n\n/*\n * Return negative infinity.\n */\n#if defined(TRIO_FUNC_NINF)\nTRIO_PUBLIC_NAN double\ntrio_ninf\nTRIO_PROTO((void));\n#endif\n\n/*\n * Return negative zero.\n */\n#if defined(TRIO_FUNC_NZERO)\nTRIO_PUBLIC_NAN double\ntrio_nzero\nTRIO_PROTO((TRIO_NOARGS));\n#endif\n\n/*\n * If number is a NaN return non-zero, otherwise return zero.\n */\n#if defined(TRIO_FUNC_ISNAN)\nTRIO_PUBLIC_NAN int\ntrio_isnan\nTRIO_PROTO((double number));\n#endif\n\n/*\n * If number is positive infinity return 1, if number is negative\n * infinity return -1, otherwise return 0.\n */\n#if defined(TRIO_FUNC_ISINF)\nTRIO_PUBLIC_NAN int\ntrio_isinf\nTRIO_PROTO((double number));\n#endif\n\n/*\n * If number is finite return non-zero, otherwise return zero.\n */\n#if defined(TRIO_FUNC_ISFINITE)\nTRIO_PUBLIC_NAN int\ntrio_isfinite\nTRIO_PROTO((double number));\n#endif\n\n#if defined(TRIO_FUNC_SIGNBIT)\nTRIO_PUBLIC_NAN int\ntrio_signbit\nTRIO_PROTO((double number));\n#endif\n\n#if defined(TRIO_FUNC_FPCLASSIFY)\nTRIO_PUBLIC_NAN int\ntrio_fpclassify\nTRIO_PROTO((double number));\n#endif\n\n#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT)\nTRIO_PUBLIC_NAN int\ntrio_fpclassify_and_signbit\nTRIO_PROTO((double number, int *is_negative));\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TRIO_TRIONAN_H */\n"
  },
  {
    "path": "src/trio/triop.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2000 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************\n *\n * Private functions, types, etc. used for callback functions.\n *\n * The ref pointer is an opaque type and should remain as such.\n * Private data must only be accessible through the getter and\n * setter functions.\n *\n ************************************************************************/\n\n#ifndef TRIO_TRIOP_H\n#define TRIO_TRIOP_H\n\n#include \"triodef.h\"\n\n#include <stdlib.h>\n#if defined(TRIO_COMPILER_ANCIENT)\n# include <varargs.h>\n#else\n# include <stdarg.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*************************************************************************\n * Supported standards\n */\n\n/*\n * TRIO_C99 (=0 or =1)\n *\n * Define this to 0 to disable C99 format specifier extensions, or\n * define to 1 to enable them.  The format specifiers that are\n * disabled by this switch are labelled with [C99] in the format\n * specifier documentation.\n */\n#if !defined(TRIO_C99)\n# define TRIO_C99 1\n#endif\n\n/*\n * TRIO_BSD (=0 or =1)\n *\n * Define this to 0 to disable BSD format specifier extensions, or\n * define to 1 to enable them.  The format specifiers that are\n * disabled by this switch are labelled with [BSD] in the format\n * specifier documentation.\n */\n#if !defined(TRIO_BSD)\n# define TRIO_BSD 1\n#endif\n\n/*\n * TRIO_GNU (=0 or =1)\n *\n * Define this to 0 to disable GNU format specifier extensions, or\n * define to 1 to enable them.  The format specifiers that are\n * disabled by this switch are labelled with [GNU] in the format\n * specifier documentation.\n */\n#if !defined(TRIO_GNU)\n# define TRIO_GNU 1\n#endif\n\n/*\n * TRIO_MISC (=0 or =1)\n *\n * Define this to 0 to disable miscellaneous format specifier\n * extensions, or define to 1 to enable them.  The format specifiers\n * that are disabled by this switch are labelled with [MISC] in the\n * format specifier documentation.\n */\n#if !defined(TRIO_MISC)\n# define TRIO_MISC 1\n#endif\n\n/*\n * TRIO_UNIX98 (=0 or =1)\n *\n * Define this to 0 to disable UNIX98 format specifier extensions,\n * or define to 1 to enable them.  The format specifiers that are\n * disabled by this switch are labelled with [UNIX98] in the format\n * specifier documentation.\n */\n#if !defined(TRIO_UNIX98)\n# define TRIO_UNIX98 1\n#endif\n  \n/*\n * TRIO_MICROSOFT (=0 or =1)\n *\n * Define this to 0 to disable Microsoft Visual C format specifier\n * extensions, or define to 1 to enable them.  The format specifiers\n * that are disabled by this switch are labelled with [MSVC] in the\n * format specifier documentation.\n */\n#if !defined(TRIO_MICROSOFT)\n# define TRIO_MICROSOFT 1\n#endif\n\n/*\n * TRIO_EXTENSION (=0 or =1)\n *\n * Define this to 0 to disable Trio-specific extensions, or define\n * to 1 to enable them.  This has two effects: it controls whether\n * or not the Trio user-defined formating mechanism\n * (trio_register() etc) is supported, and it enables or disables\n * Trio's own format specifier extensions.  The format specifiers\n * that are disabled by this switch are labelled with [TRIO] in\n * the format specifier documentation.\n */\n#if !defined(TRIO_EXTENSION)\n# define TRIO_EXTENSION 1\n#endif\n\n/*\n * TRIO_DEPRECATED (=0 or =1)\n *\n * Define this to 0 to disable deprecated functionality, or define\n * to 1 to enable them.\n */\n#if !defined(TRIO_DEPRECATED)\n# define TRIO_DEPRECATED 1\n#endif\n\n/*************************************************************************\n * Features\n */\n\n#if defined(TRIO_SNPRINTF_ONLY)\n# define TRIO_FEATURE_SCANF 0\n# define TRIO_FEATURE_FILE 0\n# define TRIO_FEATURE_STDIO 0\n# define TRIO_FEATURE_FD 0\n# define TRIO_FEATURE_DYNAMICSTRING 0\n# define TRIO_FEATURE_CLOSURE 0\n# define TRIO_FEATURE_ARGFUNC 0\n# define TRIO_FEATURE_STRERR 0\n# define TRIO_FEATURE_LOCALE 0\n# define TRIO_EMBED_NAN 1\n# define TRIO_EMBED_STRING 1\n#endif\n  \n/*\n * TRIO_FEATURE_SCANF (=0 or =1)\n *\n * Define this to 0 to disable all the scanf() variants, or define to 1\n * to enable them.\n */\n#if !defined(TRIO_FEATURE_SCANF)\n# define TRIO_FEATURE_SCANF 1\n#endif\n  \n/*\n * TRIO_FEATURE_FILE (=0 or =1)\n *\n * Define this to 0 to disable compilation of the trio_fprintf() and\n * trio_fscanf() family of functions, or define to 1 to enable them.\n *\n * This may be useful on an embedded platform with no filesystem.\n * Note that trio_printf() uses fwrite to write to stdout, so if you\n * do not have an implementation of fwrite() at all then you must also\n * define TRIO_FEATURE_STDIO to 0.\n */\n#if !defined(TRIO_FEATURE_FILE)\n# define TRIO_FEATURE_FILE 1\n#endif\n\n/*\n * TRIO_FEATURE_STDIO (=0 or =1)\n *\n * Define this to 0 to disable compilation of the trio_printf() and\n * trio_scanf() family of functions, or define to 1 to enable them.\n *\n * This may be useful on an embedded platform with no standard I/O.\n */\n#if !defined(TRIO_FEATURE_STDIO)\n# define TRIO_FEATURE_STDIO 1\n#endif\n\n/*\n * TRIO_FEATURE_FD (=0 or =1)\n *\n * Define this to 0 to disable compilation of the trio_dprintf() and\n * trio_dscanf() family of functions, or define to 1 to enable them.\n *\n * This may be useful on an embedded platform with no filesystem, or on\n * a platform that supports file I/O using FILE* but not using raw file\n * descriptors.\n */\n#if !defined(TRIO_FEATURE_FD)\n# define TRIO_FEATURE_FD 1\n#endif\n\n/*\n * TRIO_FEATURE_DYNAMICSTRING (=0 or =1)\n *\n * Define this to 0 to disable compilation of the trio_aprintf() \n * family of functions, or define to 1 to enable them.\n *\n * If you define both this and TRIO_MINIMAL to 0, then Trio will never\n * call malloc or free.\n */\n#if !defined(TRIO_FEATURE_DYNAMICSTRING)\n# define TRIO_FEATURE_DYNAMICSTRING 1\n#endif\n\n/*\n * TRIO_FEATURE_CLOSURE (=0 or =1)\n *\n * Define this to 0 to disable compilation of the trio_cprintf() and\n * trio_cscanf() family of functions, or define to 1 to enable them.\n *\n * These functions are rarely needed. This saves a (small) amount of code.\n */\n#if !defined(TRIO_FEATURE_CLOSURE)\n# define TRIO_FEATURE_CLOSURE 1\n#endif\n\n/*\n * TRIO_FEATURE_ARGFUNC (=0 or =1)\n *\n * Define this to 0 to disable compilation of trio_cprintff() and\n * trio_cscanff() functions and related code (might have a tiny\n * performance gain), or define to 1 to enable them.\n *\n * This functionality is needed only if you have to fetch the arguments using\n * a pull model instead of passing them all at once (for example if you plan\n * to plug the library into a script interpreter or validate the types).\n *\n * Only the closure family of functions are available with this interface,\n * because if you need this, you usually provide custom input/output\n * handling too (and so this forces TRIO_FEATURE_CLOSURE to enabled).\n */\n#if !defined(TRIO_FEATURE_ARGFUNC)\n# define TRIO_FEATURE_ARGFUNC 1\n#endif\n#if TRIO_FEATURE_ARGFUNC\n# undef TRIO_FEATURE_CLOSURE\n# define TRIO_FEATURE_CLOSURE 1\n#endif\n\n/*\n * TRIO_FEATURE_ERRORCODE (=0 or =1)\n *\n * Define this to 0 to return -1 from the print and scan function on\n * error, or define to 1 to return a negative number with debugging\n * information as part of the return code.\n *\n * If enabled, the return code will be a negative number, which encodes\n * an error code and an error location. These can be decoded with the\n * TRIO_ERROR_CODE and TRIO_ERROR_POSITION macros.\n */\n#if defined(TRIO_ERRORS)\n# define TRIO_FEATURE_ERRORCODE TRIO_ERRORS\n#endif\n#if !defined(TRIO_FEATURE_ERRORCODE)\n# define TRIO_FEATURE_ERRORCODE 1\n#endif\n\n/*\n * TRIO_FEATURE_STRERR (=0 or =1)\n *\n * Define this to 0 if you do not use trio_strerror(), or define to 1 if\n * you do use it.\n *\n * This saves a (small) amount of code.\n */\n#if !defined(TRIO_FEATURE_STRERR)\n# define TRIO_FEATURE_STRERR 1\n#endif\n\n/*\n * TRIO_FEATURE_FLOAT (=0 or =1)\n *\n * Define this to 0 to disable all floating-point support, or define\n * to 1 to enable it.\n *\n * This is useful in restricted embedded platforms that do not support\n * floating-point.  Obviously you cannot use floating-point format\n * specifiers if you define this.\n *\n * Do not compile trionan.c if you disable this.\n */\n#if !defined(TRIO_FEATURE_FLOAT)\n# define TRIO_FEATURE_FLOAT 1\n#endif\n\n/*\n * TRIO_FEATURE_LOCALE (=0 or =1)\n *\n * Define this to 0 to disable customized locale support, or define\n * to 1 to enable it.\n *\n * This saves a (small) amount of code.\n */\n#if !defined(TRIO_FEATURE_LOCALE)\n# define TRIO_FEATURE_LOCALE 1\n#endif\n\n/*\n * TRIO_MINIMAL\n *\n * Define this to disable building the public trionan.h and triostr.h.\n * If you define this, then you must not compile trionan.c and triostr.c\n * separately.\n */\n#if defined(TRIO_MINIMAL)\n# if !defined(TRIO_EMBED_NAN)\n#  define TRIO_EMBED_NAN\n# endif\n# if !defined(TRIO_EMBED_STRING)\n#  define TRIO_EMBED_STRING\n# endif\n#endif\n  \n/* Does not work yet. Do not enable */\n#ifndef TRIO_FEATURE_WIDECHAR\n# define TRIO_FEATURE_WIDECHAR 0\n#endif\n\n/*************************************************************************\n * Mapping standards to internal features\n */\n\n#if !defined(TRIO_FEATURE_HEXFLOAT)\n# define TRIO_FEATURE_HEXFLOAT (TRIO_C99 && TRIO_FEATURE_FLOAT)\n#endif\n\n#if !defined(TRIO_FEATURE_LONGDOUBLE)\n# define TRIO_FEATURE_LONGDOUBLE TRIO_FEATURE_FLOAT\n#endif\n\n#if !defined(TRIO_FEATURE_ERRNO)\n# define TRIO_FEATURE_ERRNO TRIO_GNU\n#endif\n\n#if !defined(TRIO_FEATURE_QUAD)\n# define TRIO_FEATURE_QUAD (TRIO_BSD || TRIO_GNU)\n#endif\n\n#if !defined(TRIO_FEATURE_SIZE_T)\n# define TRIO_FEATURE_SIZE_T TRIO_C99\n#endif\n\n#if !defined(TRIO_FEATURE_SIZE_T_UPPER)\n# define TRIO_FEATURE_SIZE_T_UPPER TRIO_GNU\n#endif\n  \n#if !defined(TRIO_FEATURE_PTRDIFF_T)\n# define TRIO_FEATURE_PTRDIFF_T TRIO_C99\n#endif\n\n#if !defined(TRIO_FEATURE_INTMAX_T)\n# define TRIO_FEATURE_INTMAX_T TRIO_C99\n#endif\n\n#if !defined(TRIO_FEATURE_FIXED_SIZE)\n# define TRIO_FEATURE_FIXED_SIZE TRIO_MICROSOFT\n#endif\n\n#if !defined(TRIO_FEATURE_POSITIONAL)\n# define TRIO_FEATURE_POSITIONAL TRIO_UNIX98\n#endif\n\n#if !defined(TRIO_FEATURE_USER_DEFINED)\n# define TRIO_FEATURE_USER_DEFINED TRIO_EXTENSION\n#endif\n\n#if !defined(TRIO_FEATURE_BINARY)\n# define TRIO_FEATURE_BINARY TRIO_EXTENSION\n#endif\n\n#if !defined(TRIO_FEATURE_QUOTE)\n# define TRIO_FEATURE_QUOTE TRIO_EXTENSION\n#endif\n  \n#if !defined(TRIO_FEATURE_STICKY)\n# define TRIO_FEATURE_STICKY TRIO_EXTENSION\n#endif\n  \n#if !defined(TRIO_FEATURE_VARSIZE)\n# define TRIO_FEATURE_VARSIZE TRIO_EXTENSION\n#endif\n\n#if !defined(TRIO_FEATURE_ROUNDING)\n# define TRIO_FEATURE_ROUNDING TRIO_EXTENSION\n#endif\n  \n/*************************************************************************\n * Memory handling\n */\n#ifndef TRIO_MALLOC\n# define TRIO_MALLOC(n) malloc(n)\n#endif\n#ifndef TRIO_REALLOC\n# define TRIO_REALLOC(x,n) realloc((x),(n))\n#endif\n#ifndef TRIO_FREE\n# define TRIO_FREE(x) free(x)\n#endif\n\n\n/*************************************************************************\n * User-defined specifiers\n */\n\ntypedef int (*trio_callback_t) TRIO_PROTO((trio_pointer_t));\n\ntrio_pointer_t trio_register TRIO_PROTO((trio_callback_t callback, const char *name));\nvoid trio_unregister TRIO_PROTO((trio_pointer_t handle));\n\nTRIO_CONST char *trio_get_format TRIO_PROTO((trio_pointer_t ref));\nTRIO_CONST trio_pointer_t trio_get_argument TRIO_PROTO((trio_pointer_t ref));\n\n/* Modifiers */\nint  trio_get_width TRIO_PROTO((trio_pointer_t ref));\nvoid trio_set_width TRIO_PROTO((trio_pointer_t ref, int width));\nint  trio_get_precision TRIO_PROTO((trio_pointer_t ref));\nvoid trio_set_precision TRIO_PROTO((trio_pointer_t ref, int precision));\nint  trio_get_base TRIO_PROTO((trio_pointer_t ref));\nvoid trio_set_base TRIO_PROTO((trio_pointer_t ref, int base));\nint  trio_get_padding TRIO_PROTO((trio_pointer_t ref));\nvoid trio_set_padding TRIO_PROTO((trio_pointer_t ref, int is_padding));\nint  trio_get_short TRIO_PROTO((trio_pointer_t ref)); /* h */\nvoid trio_set_shortshort TRIO_PROTO((trio_pointer_t ref, int is_shortshort));\nint  trio_get_shortshort TRIO_PROTO((trio_pointer_t ref)); /* hh */\nvoid trio_set_short TRIO_PROTO((trio_pointer_t ref, int is_short));\nint  trio_get_long TRIO_PROTO((trio_pointer_t ref)); /* l */\nvoid trio_set_long TRIO_PROTO((trio_pointer_t ref, int is_long));\nint  trio_get_longlong TRIO_PROTO((trio_pointer_t ref)); /* ll */\nvoid trio_set_longlong TRIO_PROTO((trio_pointer_t ref, int is_longlong));\nint  trio_get_longdouble TRIO_PROTO((trio_pointer_t ref)); /* L */\nvoid trio_set_longdouble TRIO_PROTO((trio_pointer_t ref, int is_longdouble));\nint  trio_get_alternative TRIO_PROTO((trio_pointer_t ref)); /* # */\nvoid trio_set_alternative TRIO_PROTO((trio_pointer_t ref, int is_alternative));\nint  trio_get_alignment TRIO_PROTO((trio_pointer_t ref)); /* - */\nvoid trio_set_alignment TRIO_PROTO((trio_pointer_t ref, int is_leftaligned));\nint  trio_get_spacing TRIO_PROTO((trio_pointer_t ref)); /* (space) */\nvoid trio_set_spacing TRIO_PROTO((trio_pointer_t ref, int is_space));\nint  trio_get_sign TRIO_PROTO((trio_pointer_t ref)); /* + */\nvoid trio_set_sign TRIO_PROTO((trio_pointer_t ref, int is_showsign));\n#if TRIO_FEATURE_QUOTE\nint  trio_get_quote TRIO_PROTO((trio_pointer_t ref)); /* ' */\nvoid trio_set_quote TRIO_PROTO((trio_pointer_t ref, int is_quote));\n#endif\nint  trio_get_upper TRIO_PROTO((trio_pointer_t ref));\nvoid trio_set_upper TRIO_PROTO((trio_pointer_t ref, int is_upper));\n#if TRIO_FEATURE_INTMAX_T\nint  trio_get_largest TRIO_PROTO((trio_pointer_t ref)); /* j */\nvoid trio_set_largest TRIO_PROTO((trio_pointer_t ref, int is_largest));\n#endif\n#if TRIO_FEATURE_PTRDIFF_T\nint  trio_get_ptrdiff TRIO_PROTO((trio_pointer_t ref)); /* t */\nvoid trio_set_ptrdiff TRIO_PROTO((trio_pointer_t ref, int is_ptrdiff));\n#endif\n#if TRIO_FEATURE_SIZE_T\nint  trio_get_size TRIO_PROTO((trio_pointer_t ref)); /* z / Z */\nvoid trio_set_size TRIO_PROTO((trio_pointer_t ref, int is_size));\n#endif\n\n/* Printing */\nint trio_print_ref TRIO_PROTO((trio_pointer_t ref, const char *format, ...));\nint trio_vprint_ref TRIO_PROTO((trio_pointer_t ref, const char *format, va_list args));\nint trio_printv_ref TRIO_PROTO((trio_pointer_t ref, const char *format, trio_pointer_t *args));\n\nvoid trio_print_int TRIO_PROTO((trio_pointer_t ref, int number));\nvoid trio_print_uint TRIO_PROTO((trio_pointer_t ref, unsigned int number));\n/*  void trio_print_long TRIO_PROTO((trio_pointer_t ref, long number)); */\n/*  void trio_print_ulong TRIO_PROTO((trio_pointer_t ref, unsigned long number)); */\nvoid trio_print_double TRIO_PROTO((trio_pointer_t ref, double number));\nvoid trio_print_string TRIO_PROTO((trio_pointer_t ref, TRIO_CONST char *string));\nvoid trio_print_pointer TRIO_PROTO((trio_pointer_t ref, trio_pointer_t pointer));\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* TRIO_TRIOP_H */\n"
  },
  {
    "path": "src/trio/triostr.c",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************/\n\n/*************************************************************************\n * Include files\n */\n\n#if defined(HAVE_CONFIG_H)\n# include <config.h>\n#endif\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include \"triodef.h\"\n#include \"triostr.h\"\n#if defined(TRIO_FUNC_TO_LONG_DOUBLE)\n# define USE_MATH\n#endif\n#if defined(USE_MATH)\n# include <math.h>\n#endif\n\n/*************************************************************************\n * Definitions\n */\n\n#if !defined(TRIO_PUBLIC_STRING)\n# define TRIO_PUBLIC_STRING TRIO_PUBLIC\n#endif\n#if !defined(TRIO_PRIVATE_STRING)\n# define TRIO_PRIVATE_STRING TRIO_PRIVATE\n#endif\n\n#if !defined(NULL)\n# define NULL 0\n#endif\n#if !defined(NIL)\n# define NIL ((char)0)\n#endif\n#if !defined(FALSE)\n# define FALSE (1 == 0)\n# define TRUE (! FALSE)\n#endif\n#if !defined(BOOLEAN_T)\n# define BOOLEAN_T int\n#endif\n\n#if defined(USE_MATH)\n# if defined(PREDEF_STANDARD_C99)\n#  if defined(TRIO_COMPILER_DECC)\n#   if (TRIO_COMPILER_DECC - 0 > 80000000)\n/*\n * The OSF/1 runtime that comes with the DECC compiler does not support\n * hexfloats conversion.\n */\n#    define USE_STRTOD\n#    define USE_STRTOF\n#   endif\n#  else\n#   define USE_STRTOD\n#   define USE_STRTOF\n#  endif\n# else\n#  if defined(TRIO_COMPILER_VISUALC)\n#   define USE_STRTOD\n#  endif\n#endif\n#endif\n\n#if defined(TRIO_PLATFORM_UNIX)\n# if defined(PREDEF_STANDARD_UNIX95)\n#  define USE_STRCASECMP\n#  define USE_STRNCASECMP\n# endif\n# if defined(TRIO_PLATFORM_SUNOS)\n#  define USE_SYS_ERRLIST\n# else\n#  define USE_STRERROR\n# endif\n# if defined(TRIO_PLATFORM_QNX)\n#  define strcasecmp(x,y) stricmp(x,y)\n#  define strncasecmp(x,y,n) strnicmp(x,y,n)\n# endif\n#endif\n\n#if defined(TRIO_PLATFORM_WIN32)\n# define USE_STRCASECMP\n# if defined(TRIO_PLATFORM_WINCE)\n#  define strcasecmp(x,y) _stricmp(x,y)\n# else\n#  define strcasecmp(x,y) strcmpi(x,y)\n# endif\n#endif\n\n#if !defined(HAVE_CONFIG_H)\n# if !(defined(TRIO_PLATFORM_SUNOS))\n#  define HAVE_TOLOWER\n#  define HAVE_TOUPPER\n# endif\n#endif\n\n#if defined(USE_MATH) && !defined(TRIO_NO_POWL)\n# if !defined(HAVE_POWL)\n#  if defined(PREDEF_STANDARD_C99) \\\n   || defined(PREDEF_STANDARD_UNIX03)\n#   define HAVE_POWL\n#  else\n#   if defined(TRIO_COMPILER_VISUALC)\n#    if defined(powl)\n#     define HAVE_POWL\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\n#if defined(HAVE_POWL)\n# define trio_powl(x,y) powl((x),(y))\n#else\n# define trio_powl(x,y) pow((double)(x),(double)(y))\n#endif\n\n#if defined(TRIO_FUNC_TO_UPPER) \\\n || (defined(TRIO_FUNC_EQUAL) && !defined(USE_STRCASECMP)) \\\n || (defined(TRIO_FUNC_EQUAL_MAX) && !defined(USE_STRNCASECMP)) \\\n || defined(TRIO_FUNC_MATCH) \\\n || defined(TRIO_FUNC_TO_LONG_DOUBLE) \\\n || defined(TRIO_FUNC_UPPER)\n# define TRIO_FUNC_INTERNAL_TO_UPPER\n#endif\n\n/*************************************************************************\n * Structures\n */\n\nstruct _trio_string_t\n{\n  char *content;\n  size_t length;\n  size_t allocated;\n};\n\n/*************************************************************************\n * Constants\n */\n\n#if !defined(TRIO_EMBED_STRING)\nstatic TRIO_CONST char rcsid[] = \"@(#)$Id$\";\n#endif\n\n/*************************************************************************\n * Static String Functions\n */\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_static.h\"\n#endif\n/** @addtogroup StaticStrings\n    @{\n*/\n\n/*\n * internal_duplicate_max\n */\n#if defined(TRIO_FUNC_DUPLICATE) \\\n || defined(TRIO_FUNC_DUPLICATE_MAX) \\\n || defined(TRIO_FUNC_STRING_DUPLICATE) \\\n || defined(TRIO_FUNC_XSTRING_DUPLICATE)\n\nTRIO_PRIVATE_STRING char *\ninternal_duplicate_max\nTRIO_ARGS2((source, size),\n\t   TRIO_CONST char *source,\n\t   size_t size)\n{\n  char *target;\n\n  assert(source);\n\n  /* Make room for string plus a terminating zero */\n  size++;\n  target = trio_create(size);\n  if (target)\n    {\n      trio_copy_max(target, size, source);\n    }\n  return target;\n}\n\n#endif\n\n/*\n * internal_string_alloc\n */\n#if defined(TRIO_FUNC_STRING_CREATE) \\\n || defined(TRIO_FUNC_STRING_DUPLICATE) \\\n || defined(TRIO_FUNC_XSTRING_DUPLICATE)\n\nTRIO_PRIVATE_STRING trio_string_t *\ninternal_string_alloc(TRIO_NOARGS)\n{\n  trio_string_t *self;\n  \n  self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t));\n  if (self)\n    {\n      self->content = NULL;\n      self->length = 0;\n      self->allocated = 0;\n    }\n  return self;\n}\n\n#endif\n\n/*\n * internal_string_grow\n *\n * The size of the string will be increased by 'delta' characters. If\n * 'delta' is zero, the size will be doubled.\n */\n#if defined(TRIO_FUNC_STRING_CREATE) \\\n || defined(TRIO_FUNC_STRING_APPEND) \\\n || defined(TRIO_FUNC_XSTRING_APPEND) \\\n || defined(TRIO_FUNC_XSTRING_APPEND_CHAR)\n\nTRIO_PRIVATE_STRING BOOLEAN_T\ninternal_string_grow\nTRIO_ARGS2((self, delta),\n\t   trio_string_t *self,\n\t   size_t delta)\n{\n  BOOLEAN_T status = FALSE;\n  char *new_content;\n  size_t new_size;\n\n  new_size = (delta == 0)\n    ? ( (self->allocated == 0) ? 1 : self->allocated * 2 )\n    : self->allocated + delta;\n  \n  new_content = (char *)TRIO_REALLOC(self->content, new_size);\n  if (new_content)\n    {\n      self->content = new_content;\n      self->allocated = new_size;\n      status = TRUE;\n    }\n  return status;\n}\n\n#endif\n\n/*\n * internal_string_grow_to\n *\n * The size of the string will be increased to 'length' plus one characters.\n * If 'length' is less than the original size, the original size will be\n * used (that is, the size of the string is never decreased).\n */\n#if defined(TRIO_FUNC_STRING_APPEND) \\\n || defined(TRIO_FUNC_XSTRING_APPEND) \\\n || defined(TRIO_FUNC_XSTRING_APPEND_MAX)\n\nTRIO_PRIVATE_STRING BOOLEAN_T\ninternal_string_grow_to\nTRIO_ARGS2((self, length),\n\t   trio_string_t *self,\n\t   size_t length)\n{\n  length++; /* Room for terminating zero */\n  return (self->allocated < length)\n    ? internal_string_grow(self, length - self->allocated)\n    : TRUE;\n}\n\n#endif\n\n#if defined(TRIO_FUNC_INTERNAL_TO_UPPER)\n\nTRIO_PRIVATE_STRING int\ninternal_to_upper\nTRIO_ARGS1((source),\n\t   int source)\n{\n# if defined(HAVE_TOUPPER)\n  \n  return toupper(source);\n  \n# else\n\n  /* Does not handle locales or non-contiguous alphabetic characters */\n  return ((source >= (int)'a') && (source <= (int)'z'))\n    ? source - 'a' + 'A'\n    : source;\n  \n# endif\n}\n\n#endif\n\n\n/**\n   Create new string.\n\n   @param size Size of new string.\n   @return Pointer to string, or NULL if allocation failed.\n*/\n#if defined(TRIO_FUNC_CREATE)\n\nTRIO_PUBLIC_STRING char *\ntrio_create\nTRIO_ARGS1((size),\n\t   size_t size)\n{\n  return (char *)TRIO_MALLOC(size);\n}\n\n#endif\n\n/**\n   Destroy string.\n\n   @param string String to be freed.\n*/\n#if defined(TRIO_FUNC_DESTROY)\n\nTRIO_PUBLIC_STRING void\ntrio_destroy\nTRIO_ARGS1((string),\n\t   char *string)\n{\n  if (string)\n    {\n      TRIO_FREE(string);\n    }\n}\n\n#endif\n\n/**\n   Count the number of characters in a string.\n\n   @param string String to measure.\n   @return Number of characters in @p string.\n*/\n#if defined(TRIO_FUNC_LENGTH)\n\nTRIO_PUBLIC_STRING size_t\ntrio_length\nTRIO_ARGS1((string),\n\t   TRIO_CONST char *string)\n{\n  return strlen(string);\n}\n\n#endif\n\n/**\n   Count at most @p max characters in a string.\n\n   @param string String to measure.\n   @param max Maximum number of characters to count.\n   @return The maximum value of @p max and number of characters in @p string.\n*/\n#if defined(TRIO_FUNC_LENGTH_MAX)\n\nTRIO_PUBLIC_STRING size_t\ntrio_length_max\nTRIO_ARGS2((string, max),\n\t   TRIO_CONST char *string,\n\t   size_t max)\n{\n  size_t i;\n\n  for (i = 0; i < max; ++i)\n    {\n      if (string[i] == 0)\n\tbreak;\n    }\n  return i;\n}\n\n#endif\n\n/**\n   Append @p source at the end of @p target.\n   \n   @param target Target string.\n   @param source Source string.\n   @return Boolean value indicating success or failure.\n   \n   @pre @p target must point to a memory chunk with sufficient room to\n   contain the @p target string and @p source string.\n   @pre No boundary checking is performed, so insufficient memory will\n   result in a buffer overrun.\n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_APPEND)\n\nTRIO_PUBLIC_STRING int\ntrio_append\nTRIO_ARGS2((target, source),\n\t   char *target,\n\t   TRIO_CONST char *source)\n{\n  assert(target);\n  assert(source);\n  \n  return (strcat(target, source) != NULL);\n}\n\n#endif\n\n/**\n   Append at most @p max characters from @p source to @p target.\n   \n   @param target Target string.\n   @param max Maximum number of characters to append.\n   @param source Source string.\n   @return Boolean value indicating success or failure.\n   \n   @pre @p target must point to a memory chuck with sufficient room to\n   contain the @p target string and the @p source string (at most @p max\n   characters).\n   @pre No boundary checking is performed, so insufficient memory will\n   result in a buffer overrun.\n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_APPEND_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_append_max\nTRIO_ARGS3((target, max, source),\n\t   char *target,\n\t   size_t max,\n\t   TRIO_CONST char *source)\n{\n  size_t length;\n  \n  assert(target);\n  assert(source);\n\n  length = trio_length(target);\n  \n  if (max > length)\n    {\n      strncat(target, source, max - length - 1);\n    }\n  return TRUE;\n}\n\n#endif\n\n/**\n   Determine if a string contains a substring.\n\n   @param string String to be searched.\n   @param substring String to be found.\n   @return Boolean value indicating success or failure.\n*/\n#if defined(TRIO_FUNC_CONTAINS)\n\nTRIO_PUBLIC_STRING int\ntrio_contains\nTRIO_ARGS2((string, substring),\n\t   TRIO_CONST char *string,\n\t   TRIO_CONST char *substring)\n{\n  assert(string);\n  assert(substring);\n  \n  return (0 != strstr(string, substring));\n}\n\n#endif\n\n/**\n   Copy @p source to @p target.\n   \n   @param target Target string.\n   @param source Source string.\n   @return Boolean value indicating success or failure.\n   \n   @pre @p target must point to a memory chunk with sufficient room to\n   contain the @p source string.\n   @pre No boundary checking is performed, so insufficient memory will\n   result in a buffer overrun.\n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_COPY)\n\nTRIO_PUBLIC_STRING int\ntrio_copy\nTRIO_ARGS2((target, source),\n\t   char *target,\n\t   TRIO_CONST char *source)\n{\n  assert(target);\n  assert(source);\n     \n  (void)strcpy(target, source);\n  return TRUE;\n}\n\n#endif\n\n/**\n   Copy at most @p max - 1 characters from @p source to @p target.\n   \n   @param target Target string.\n   @param max Maximum number of characters to append (one of which is\n   a NUL terminator).  In other words @p source must point to at least\n   @p max - 1 bytes, but @p target must point to at least @p max\n   bytes.\n   @param source Source string.\n   @return Boolean value indicating success or failure.\n   \n   @pre @p target must point to a memory chunk with sufficient room to\n   contain the @p source string and a NUL terminator (at most @p max\n   bytes total).\n   @pre No boundary checking is performed, so insufficient memory will\n   result in a buffer overrun.\n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_COPY_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_copy_max\nTRIO_ARGS3((target, max, source),\n\t   char *target,\n\t   size_t max,\n\t   TRIO_CONST char *source)\n{\n  assert(target);\n  assert(source);\n  assert(max > 0); /* Includes != 0 */\n\n  (void)strncpy(target, source, max - 1);\n  target[max - 1] = (char)0;\n  return TRUE;\n}\n\n#endif\n\n/**\n   Duplicate @p source.\n   \n   @param source Source string.\n   @return A copy of the @p source string.\n   \n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_DUPLICATE)\n\nTRIO_PUBLIC_STRING char *\ntrio_duplicate\nTRIO_ARGS1((source),\n\t   TRIO_CONST char *source)\n{\n  return internal_duplicate_max(source, trio_length(source));\n}\n\n#endif\n\n/**\n   Duplicate at most @p max characters of @p source.\n   \n   @param source Source string.\n   @param max Maximum number of characters to duplicate.\n   @return A copy of the @p source string.\n   \n   @post @p target will be zero terminated.\n*/\n#if defined(TRIO_FUNC_DUPLICATE_MAX)\n\nTRIO_PUBLIC_STRING char *\ntrio_duplicate_max\nTRIO_ARGS2((source, max),\n\t   TRIO_CONST char *source,\n\t   size_t max)\n{\n  size_t length;\n\n  assert(source);\n  assert(max > 0);\n\n  length = trio_length(source);\n  if (length > max)\n    {\n      length = max;\n    }\n  return internal_duplicate_max(source, length);\n}\n\n#endif\n\n/**\n   Compare if two strings are equal.\n   \n   @param first First string.\n   @param second Second string.\n   @return Boolean indicating whether the two strings are equal or not.\n   \n   Case-insensitive comparison.\n*/\n#if defined(TRIO_FUNC_EQUAL)\n\nTRIO_PUBLIC_STRING int\ntrio_equal\nTRIO_ARGS2((first, second),\n\t   TRIO_CONST char *first,\n\t   TRIO_CONST char *second)\n{\n  assert(first);\n  assert(second);\n\n  if ((first != NULL) && (second != NULL))\n    {\n# if defined(USE_STRCASECMP)\n      return (0 == strcasecmp(first, second));\n# else\n      while ((*first != NIL) && (*second != NIL))\n\t{\n\t  if (internal_to_upper(*first) != internal_to_upper(*second))\n\t    {\n\t      break;\n\t    }\n\t  first++;\n\t  second++;\n\t}\n      return ((*first == NIL) && (*second == NIL));\n# endif\n    }\n  return FALSE;\n}\n\n#endif\n\n/**\n   Compare if two strings are equal.\n   \n   @param first First string.\n   @param second Second string.\n   @return Boolean indicating whether the two strings are equal or not.\n   \n   Case-sensitive comparison.\n*/\n#if defined(TRIO_FUNC_EQUAL_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_equal_case\nTRIO_ARGS2((first, second),\n\t   TRIO_CONST char *first,\n\t   TRIO_CONST char *second)\n{\n  assert(first);\n  assert(second);\n\n  if ((first != NULL) && (second != NULL))\n    {\n      return (0 == strcmp(first, second));\n    }\n  return FALSE;\n}\n\n#endif\n\n/**\n   Compare if two strings up until the first @p max characters are equal.\n   \n   @param first First string.\n   @param max Maximum number of characters to compare.\n   @param second Second string.\n   @return Boolean indicating whether the two strings are equal or not.\n   \n   Case-sensitive comparison.\n*/\n#if defined(TRIO_FUNC_EQUAL_CASE_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_equal_case_max\nTRIO_ARGS3((first, max, second),\n\t   TRIO_CONST char *first,\n\t   size_t max,\n\t   TRIO_CONST char *second)\n{\n  assert(first);\n  assert(second);\n\n  if ((first != NULL) && (second != NULL))\n    {\n      return (0 == strncmp(first, second, max));\n    }\n  return FALSE;\n}\n\n#endif\n\n/**\n   Compare if two strings are equal.\n   \n   @param first First string.\n   @param second Second string.\n   @return Boolean indicating whether the two strings are equal or not.\n\n   Collating characters are considered equal.\n*/\n#if defined(TRIO_FUNC_EQUAL_LOCALE)\n\nTRIO_PUBLIC_STRING int\ntrio_equal_locale\nTRIO_ARGS2((first, second),\n\t   TRIO_CONST char *first,\n\t   TRIO_CONST char *second)\n{\n  assert(first);\n  assert(second);\n\n# if defined(LC_COLLATE)\n  return (strcoll(first, second) == 0);\n# else\n  return trio_equal(first, second);\n# endif\n}\n\n#endif\n\n/**\n   Compare if two strings up until the first @p max characters are equal.\n   \n   @param first First string.\n   @param max Maximum number of characters to compare.\n   @param second Second string.\n   @return Boolean indicating whether the two strings are equal or not.\n   \n   Case-insensitive comparison.\n*/\n#if defined(TRIO_FUNC_EQUAL_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_equal_max\nTRIO_ARGS3((first, max, second),\n\t   TRIO_CONST char *first,\n\t   size_t max,\n\t   TRIO_CONST char *second)\n{\n  assert(first);\n  assert(second);\n\n  if ((first != NULL) && (second != NULL))\n    {\n# if defined(USE_STRNCASECMP)\n      return (0 == strncasecmp(first, second, max));\n# else\n      /* Not adequately tested yet */\n      size_t cnt = 0;\n      while ((*first != NIL) && (*second != NIL) && (cnt <= max))\n\t{\n\t  if (internal_to_upper(*first) != internal_to_upper(*second))\n\t    {\n\t      break;\n\t    }\n\t  first++;\n\t  second++;\n\t  cnt++;\n\t}\n      return ((cnt == max) || ((*first == NIL) && (*second == NIL)));\n# endif\n    }\n  return FALSE;\n}\n\n#endif\n\n/**\n   Provide a textual description of an error code (errno).\n\n   @param error_number Error number.\n   @return Textual description of @p error_number.\n*/\n#if defined(TRIO_FUNC_ERROR)\n\nTRIO_PUBLIC_STRING TRIO_CONST char *\ntrio_error\nTRIO_ARGS1((error_number),\n\t   int error_number)\n{\n# if defined(USE_STRERROR)\n  \n  return strerror(error_number);\n\n# else\n#  if defined(USE_SYS_ERRLIST)\n\n  extern char *sys_errlist[];\n  extern int sys_nerr;\n\n  return ((error_number < 0) || (error_number >= sys_nerr))\n    ? \"unknown\"\n    : sys_errlist[error_number];\n \n#  else\n  \n  return \"unknown\";\n\n#  endif\n# endif\n}\n\n#endif\n\n/**\n   Format the date/time according to @p format.\n\n   @param target Target string.\n   @param max Maximum number of characters to format.\n   @param format Formatting string.\n   @param datetime Date/time structure.\n   @return Number of formatted characters.\n\n   The formatting string accepts the same specifiers as the standard C\n   function strftime.\n*/\n#if defined(TRIO_FUNC_FORMAT_DATE_MAX)\n\nTRIO_PUBLIC_STRING size_t\ntrio_format_date_max\nTRIO_ARGS4((target, max, format, datetime),\n\t   char *target,\n\t   size_t max,\n\t   TRIO_CONST char *format,\n\t   TRIO_CONST struct tm *datetime)\n{\n  assert(target);\n  assert(format);\n  assert(datetime);\n  assert(max > 0);\n\n  return strftime(target, max, format, datetime);\n}\n\n#endif\n\n/**\n   Calculate a hash value for a string.\n\n   @param string String to be calculated on.\n   @param type Hash function.\n   @return Calculated hash value.\n\n   @p type can be one of the following\n   @li @c TRIO_HASH_PLAIN Plain hash function.\n*/\n#if defined(TRIO_FUNC_HASH)\n\nTRIO_PUBLIC_STRING unsigned long\ntrio_hash\nTRIO_ARGS2((string, type),\n\t   TRIO_CONST char *string,\n\t   int type)\n{\n  unsigned long value = 0L;\n  char ch;\n\n  assert(string);\n  \n  switch (type)\n    {\n    case TRIO_HASH_PLAIN:\n      while ( (ch = *string++) != NIL )\n\t{\n\t  value *= 31;\n\t  value += (unsigned long)ch;\n\t}\n      break;\n    default:\n      assert(FALSE);\n      break;\n    }\n  return value;\n}\n\n#endif\n\n/**\n   Find first occurrence of a character in a string.\n\n   @param string String to be searched.\n   @param character Character to be found.\n   @return A pointer to the found character, or NULL if character was not found.\n */\n#if defined(TRIO_FUNC_INDEX)\n\nTRIO_PUBLIC_STRING char *\ntrio_index\nTRIO_ARGS2((string, character),\n\t   TRIO_CONST char *string,\n\t   int character)\n{\n  assert(string);\n\n  return strchr(string, character);\n}\n\n#endif\n\n/**\n   Find last occurrence of a character in a string.\n\n   @param string String to be searched.\n   @param character Character to be found.\n   @return A pointer to the found character, or NULL if character was not found.\n */\n#if defined(TRIO_FUNC_INDEX_LAST)\n\nTRIO_PUBLIC_STRING char *\ntrio_index_last\nTRIO_ARGS2((string, character),\n\t   TRIO_CONST char *string,\n\t   int character)\n{\n  assert(string);\n\n  return strchr(string, character);\n}\n\n#endif\n\n/**\n   Convert the alphabetic letters in the string to lower-case.\n\n   @param target String to be converted.\n   @return Number of processed characters (converted or not).\n*/\n#if defined(TRIO_FUNC_LOWER)\n\nTRIO_PUBLIC_STRING int\ntrio_lower\nTRIO_ARGS1((target),\n\t   char *target)\n{\n  assert(target);\n\n  return trio_span_function(target, target, trio_to_lower);\n}\n\n#endif\n\n/**\n   Compare two strings using wildcards.\n\n   @param string String to be searched.\n   @param pattern Pattern, including wildcards, to search for.\n   @return Boolean value indicating success or failure.\n\n   Case-insensitive comparison.\n   \n   The following wildcards can be used\n   @li @c * Match any number of characters.\n   @li @c ? Match a single character.\n*/\n#if defined(TRIO_FUNC_MATCH)\n\nTRIO_PUBLIC_STRING int\ntrio_match\nTRIO_ARGS2((string, pattern),\n\t   TRIO_CONST char *string,\n\t   TRIO_CONST char *pattern)\n{\n  assert(string);\n  assert(pattern);\n  \n  for (; ('*' != *pattern); ++pattern, ++string)\n    {\n      if (NIL == *string)\n\t{\n\t  return (NIL == *pattern);\n\t}\n      if ((internal_to_upper((int)*string) != internal_to_upper((int)*pattern))\n\t  && ('?' != *pattern))\n\t{\n\t  return FALSE;\n\t}\n    }\n  /* two-line patch to prevent *too* much recursiveness: */\n  while ('*' == pattern[1])\n    pattern++;\n\n  do\n    {\n      if ( trio_match(string, &pattern[1]) )\n\t{\n\t  return TRUE;\n\t}\n    }\n  while (*string++);\n  \n  return FALSE;\n}\n\n#endif\n\n/**\n   Compare two strings using wildcards.\n\n   @param string String to be searched.\n   @param pattern Pattern, including wildcards, to search for.\n   @return Boolean value indicating success or failure.\n\n   Case-sensitive comparison.\n   \n   The following wildcards can be used\n   @li @c * Match any number of characters.\n   @li @c ? Match a single character.\n*/\n#if defined(TRIO_FUNC_MATCH_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_match_case\nTRIO_ARGS2((string, pattern),\n\t   TRIO_CONST char *string,\n\t   TRIO_CONST char *pattern)\n{\n  assert(string);\n  assert(pattern);\n  \n  for (; ('*' != *pattern); ++pattern, ++string)\n    {\n      if (NIL == *string)\n\t{\n\t  return (NIL == *pattern);\n\t}\n      if ((*string != *pattern)\n\t  && ('?' != *pattern))\n\t{\n\t  return FALSE;\n\t}\n    }\n  /* two-line patch to prevent *too* much recursiveness: */\n  while ('*' == pattern[1])\n    pattern++;\n\n  do\n    {\n      if ( trio_match_case(string, &pattern[1]) )\n\t{\n\t  return TRUE;\n\t}\n    }\n  while (*string++);\n  \n  return FALSE;\n}\n\n#endif\n\n/**\n   Execute a function on each character in string.\n\n   @param target Target string.\n   @param source Source string.\n   @param Function Function to be executed.\n   @return Number of processed characters.\n*/\n#if defined(TRIO_FUNC_SPAN_FUNCTION)\n\nTRIO_PUBLIC_STRING size_t\ntrio_span_function\nTRIO_ARGS3((target, source, Function),\n\t   char *target,\n\t   TRIO_CONST char *source,\n\t   int (*Function) TRIO_PROTO((int)))\n{\n  size_t count = 0;\n\n  assert(target);\n  assert(source);\n  assert(Function);\n  \n  while (*source != NIL)\n    {\n      *target++ = Function(*source++);\n      count++;\n    }\n  return count;\n}\n\n#endif\n\n/**\n   Search for a substring in a string.\n\n   @param string String to be searched.\n   @param substring String to be found.\n   @return Pointer to first occurrence of @p substring in @p string, or NULL\n   if no match was found.\n*/\n#if defined(TRIO_FUNC_SUBSTRING)\n\nTRIO_PUBLIC_STRING char *\ntrio_substring\nTRIO_ARGS2((string, substring),\n\t   TRIO_CONST char *string,\n\t   TRIO_CONST char *substring)\n{\n  assert(string);\n  assert(substring);\n\n  return strstr(string, substring);\n}\n\n#endif\n\n/**\n   Search for a substring in the first @p max characters of a string.\n\n   @param string String to be searched.\n   @param max Maximum characters to be searched.\n   @param substring String to be found.\n   @return Pointer to first occurrence of @p substring in @p string, or NULL\n   if no match was found.\n*/\n#if defined(TRIO_FUNC_SUBSTRING_MAX)\n\nTRIO_PUBLIC_STRING char *\ntrio_substring_max\nTRIO_ARGS3((string, max, substring),\n\t   TRIO_CONST char *string,\n\t   size_t max,\n\t   TRIO_CONST char *substring)\n{\n  size_t count;\n  size_t size;\n  char *result = NULL;\n\n  assert(string);\n  assert(substring);\n  \n  size = trio_length(substring);\n  if (size <= max)\n    {\n      for (count = 0; count <= max - size; count++)\n\t{\n\t  if (trio_equal_max(substring, size, &string[count]))\n\t    {\n\t      result = (char *)&string[count];\n\t      break;\n\t    }\n\t}\n    }\n  return result;\n}\n\n#endif\n\n/**\n   Tokenize string.\n\n   @param string String to be tokenized.\n   @param delimiters String containing list of delimiting characters.\n   @return Start of new token.\n\n   @warning @p string will be destroyed.\n*/\n#if defined(TRIO_FUNC_TOKENIZE)\n\nTRIO_PUBLIC_STRING char *\ntrio_tokenize\nTRIO_ARGS2((string, delimiters),\n\t   char *string,\n\t   TRIO_CONST char *delimiters)\n{\n  assert(delimiters);\n  \n  return strtok(string, delimiters);\n}\n\n#endif\n\n/**\n   Convert string to floating-point number.\n\n   @param source String to be converted.\n   @param endp Pointer to end of the converted string.\n   @return A floating-point number.\n\n   The following Extended Backus-Naur form is used\n   @verbatim\n   double        ::= [ <sign> ]\n                     ( <number> |\n                       <number> <decimal_point> <number> |\n                       <decimal_point> <number> )\n                     [ <exponential> [ <sign> ] <number> ]\n   number        ::= 1*( <digit> )\n   digit         ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' )\n   exponential   ::= ( 'e' | 'E' )\n   sign          ::= ( '-' | '+' )\n   decimal_point ::= '.'\n   @endverbatim\n*/\n#if defined(TRIO_FUNC_TO_LONG_DOUBLE)\n\n/* FIXME: Add EBNF for hex-floats */\nTRIO_PUBLIC_STRING trio_long_double_t\ntrio_to_long_double\nTRIO_ARGS2((source, endp),\n\t   TRIO_CONST char *source,\n\t   char **endp)\n{\n# if defined(USE_STRTOLD)\n  return strtold(source, endp);\n# else\n  int isNegative = FALSE;\n  int isExponentNegative = FALSE;\n  trio_long_double_t integer = 0.0;\n  trio_long_double_t fraction = 0.0;\n  unsigned long exponent = 0;\n  trio_long_double_t base;\n  trio_long_double_t fracdiv = 1.0;\n  trio_long_double_t value = 0.0;\n\n  /* First try hex-floats */\n  if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X')))\n    {\n      base = 16.0;\n      source += 2;\n      while (isxdigit((int)*source))\n\t{\n\t  integer *= base;\n\t  integer += (isdigit((int)*source)\n\t\t      ? (*source - '0')\n\t\t      : 10 + (internal_to_upper((int)*source) - 'A'));\n\t  source++;\n\t}\n      if (*source == '.')\n\t{\n\t  source++;\n\t  while (isxdigit((int)*source))\n\t    {\n\t      fracdiv /= base;\n\t      fraction += fracdiv * (isdigit((int)*source)\n\t\t\t\t     ? (*source - '0')\n\t\t\t\t     : 10 + (internal_to_upper((int)*source) - 'A'));\n\t      source++;\n\t    }\n\t  if ((*source == 'p') || (*source == 'P'))\n\t    {\n\t      source++;\n\t      if ((*source == '+') || (*source == '-'))\n\t\t{\n\t\t  isExponentNegative = (*source == '-');\n\t\t  source++;\n\t\t}\n\t      while (isdigit((int)*source))\n\t\t{\n\t\t  exponent *= 10;\n\t\t  exponent += (*source - '0');\n\t\t  source++;\n\t\t}\n\t    }\n\t}\n      /* For later use with exponent */\n      base = 2.0;\n    }\n  else /* Then try normal decimal floats */\n    {\n      base = 10.0;\n      isNegative = (*source == '-');\n      /* Skip sign */\n      if ((*source == '+') || (*source == '-'))\n\tsource++;\n\n      /* Integer part */\n      while (isdigit((int)*source))\n\t{\n\t  integer *= base;\n\t  integer += (*source - '0');\n\t  source++;\n\t}\n\n      if (*source == '.')\n\t{\n\t  source++; /* skip decimal point */\n\t  while (isdigit((int)*source))\n\t    {\n\t      fracdiv /= base;\n\t      fraction += (*source - '0') * fracdiv;\n\t      source++;\n\t    }\n\t}\n      if ((*source == 'e')\n\t  || (*source == 'E')\n#  if TRIO_MICROSOFT\n\t  || (*source == 'd')\n\t  || (*source == 'D')\n#  endif\n\t  )\n\t{\n\t  source++; /* Skip exponential indicator */\n\t  isExponentNegative = (*source == '-');\n\t  if ((*source == '+') || (*source == '-'))\n\t    source++;\n\t  while (isdigit((int)*source))\n\t    {\n\t      exponent *= (int)base;\n\t      exponent += (*source - '0');\n\t      source++;\n\t    }\n\t}\n    }\n  \n  value = integer + fraction;\n  if (exponent != 0)\n    {\n      if (isExponentNegative)\n\tvalue /= trio_powl(base, (trio_long_double_t)exponent);\n      else\n\tvalue *= trio_powl(base, (trio_long_double_t)exponent);\n    }\n  if (isNegative)\n    value = -value;\n\n  if (endp)\n    *endp = (char *)source;\n  return value;\n# endif\n}\n\n#endif\n\n/**\n   Convert string to floating-point number.\n\n   @param source String to be converted.\n   @param endp Pointer to end of the converted string.\n   @return A floating-point number.\n\n   See @ref trio_to_long_double.\n*/\n#if defined(TRIO_FUNC_TO_DOUBLE)\n\nTRIO_PUBLIC_STRING double\ntrio_to_double\nTRIO_ARGS2((source, endp),\n\t   TRIO_CONST char *source,\n\t   char **endp)\n{\n#if defined(USE_STRTOD)\n  return strtod(source, endp);\n#else\n  return (double)trio_to_long_double(source, endp);\n#endif\n}\n\n#endif\n\n/**\n   Convert string to floating-point number.\n\n   @param source String to be converted.\n   @param endp Pointer to end of the converted string.\n   @return A floating-point number.\n\n   See @ref trio_to_long_double.\n*/\n#if defined(TRIO_FUNC_TO_FLOAT)\n\nTRIO_PUBLIC_STRING float\ntrio_to_float\nTRIO_ARGS2((source, endp),\n\t   TRIO_CONST char *source,\n\t   char **endp)\n{\n#  if defined(USE_STRTOF)\n  return strtof(source, endp);\n#  else\n  return (float)trio_to_long_double(source, endp);\n#  endif\n}\n\n#endif\n\n/**\n   Convert string to signed integer.\n\n   @param string String to be converted.\n   @param endp Pointer to end of converted string.\n   @param base Radix number of number.\n*/\n#if defined(TRIO_FUNC_TO_LONG)\n\nTRIO_PUBLIC_STRING long\ntrio_to_long\nTRIO_ARGS3((string, endp, base),\n\t   TRIO_CONST char *string,\n\t   char **endp,\n\t   int base)\n{\n  assert(string);\n  assert((base >= 2) && (base <= 36));\n  \n  return strtol(string, endp, base);\n}\n\n#endif\n\n/**\n   Convert one alphabetic letter to lower-case.\n\n   @param source The letter to be converted.\n   @return The converted letter.\n*/\n#if defined(TRIO_FUNC_TO_LOWER)\n\nTRIO_PUBLIC_STRING int\ntrio_to_lower\nTRIO_ARGS1((source),\n\t   int source)\n{\n# if defined(HAVE_TOLOWER)\n  \n  return tolower(source);\n  \n# else\n\n  /* Does not handle locales or non-contiguous alphabetic characters */\n  return ((source >= (int)'A') && (source <= (int)'Z'))\n    ? source - 'A' + 'a'\n    : source;\n  \n# endif\n}\n\n#endif\n\n/**\n   Convert string to unsigned integer.\n\n   @param string String to be converted.\n   @param endp Pointer to end of converted string.\n   @param base Radix number of number.\n*/\n#if defined(TRIO_FUNC_TO_UNSIGNED_LONG)\n\nTRIO_PUBLIC_STRING unsigned long\ntrio_to_unsigned_long\nTRIO_ARGS3((string, endp, base),\n\t   TRIO_CONST char *string,\n\t   char **endp,\n\t   int base)\n{\n  assert(string);\n  assert((base >= 2) && (base <= 36));\n  \n  return strtoul(string, endp, base);\n}\n\n#endif\n\n/**\n   Convert one alphabetic letter to upper-case.\n\n   @param source The letter to be converted.\n   @return The converted letter.\n*/\n#if defined(TRIO_FUNC_TO_UPPER)\n\nTRIO_PUBLIC_STRING int\ntrio_to_upper\nTRIO_ARGS1((source),\n\t   int source)\n{\n  return internal_to_upper(source);\n}\n\n#endif\n\n/**\n   Convert the alphabetic letters in the string to upper-case.\n\n   @param target The string to be converted.\n   @return The number of processed characters (converted or not).\n*/\n#if defined(TRIO_FUNC_UPPER)\n\nTRIO_PUBLIC_STRING int\ntrio_upper\nTRIO_ARGS1((target),\n\t   char *target)\n{\n  assert(target);\n\n  return trio_span_function(target, target, internal_to_upper);\n}\n\n#endif\n\n/** @} End of StaticStrings */\n\n\n/*************************************************************************\n * Dynamic String Functions\n */\n\n#if defined(TRIO_DOCUMENTATION)\n# include \"doc/doc_dynamic.h\"\n#endif\n/** @addtogroup DynamicStrings\n    @{\n*/\n\n/**\n   Create a new dynamic string.\n   \n   @param initial_size Initial size of the buffer.\n   @return Newly allocated dynamic string, or NULL if memory allocation failed.\n*/\n#if defined(TRIO_FUNC_STRING_CREATE)\n\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_string_create\nTRIO_ARGS1((initial_size),\n\t   int initial_size)\n{\n  trio_string_t *self;\n\n  self = internal_string_alloc();\n  if (self)\n    {\n      if (internal_string_grow(self,\n\t\t\t (size_t)((initial_size > 0) ? initial_size : 1)))\n\t{\n\t  self->content[0] = (char)0;\n\t  self->allocated = initial_size;\n\t}\n      else\n\t{\n\t  trio_string_destroy(self);\n\t  self = NULL;\n\t}\n    }\n  return self;\n}\n\n#endif\n\n/**\n   Deallocate the dynamic string and its contents.\n   \n   @param self Dynamic string\n*/\n#if defined(TRIO_FUNC_STRING_DESTROY)\n\nTRIO_PUBLIC_STRING void\ntrio_string_destroy\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  assert(self);\n  \n  if (self)\n    {\n      trio_destroy(self->content);\n      TRIO_FREE(self);\n    }\n}\n\n#endif\n\n/**\n   Get a pointer to the content.\n   \n   @param self Dynamic string.\n   @param offset Offset into content.\n   @return Pointer to the content.\n   \n   @p Offset can be zero, positive, or negative. If @p offset is zero,\n   then the start of the content will be returned. If @p offset is positive,\n   then a pointer to @p offset number of characters from the beginning of the\n   content is returned. If @p offset is negative, then a pointer to @p offset\n   number of characters from the ending of the string, starting at the\n   terminating zero, is returned.\n*/\n#if defined(TRIO_FUNC_STRING_GET)\n\nTRIO_PUBLIC_STRING char *\ntrio_string_get\nTRIO_ARGS2((self, offset),\n\t   trio_string_t *self,\n\t   int offset)\n{\n  char *result = NULL;\n  \n  assert(self);\n\n  if (self->content != NULL)\n    {\n      if (self->length == 0)\n\t{\n\t  (void)trio_string_length(self);\n\t}\n      if (offset >= 0)\n\t{\n\t  if (offset > (int)self->length)\n\t    {\n\t      offset = self->length;\n\t    }\n\t}\n      else\n\t{\n\t  offset += self->length + 1;\n\t  if (offset < 0)\n\t    {\n\t      offset = 0;\n\t    }\n\t}\n      result = &(self->content[offset]);\n    }\n  return result;\n}\n\n#endif\n\n/**\n   Extract the content.\n   \n   @param self Dynamic String\n   @return Content of dynamic string.\n   \n   The content is removed from the dynamic string. This enables destruction\n   of the dynamic string without deallocation of the content.\n*/\n#if defined(TRIO_FUNC_STRING_EXTRACT)\n\nTRIO_PUBLIC_STRING char *\ntrio_string_extract\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  char *result;\n  \n  assert(self);\n\n  result = self->content;\n  /* FIXME: Allocate new empty buffer? */\n  self->content = NULL;\n  self->length = self->allocated = 0;\n  return result;\n}\n\n#endif\n\n/**\n   Set the content of the dynamic string.\n   \n   @param self Dynamic String\n   @param buffer The new content.\n   \n   Sets the content of the dynamic string to a copy @p buffer.\n   An existing content will be deallocated first, if necessary.\n   \n   @remark\n   This function will make a copy of @p buffer.\n   You are responsible for deallocating @p buffer yourself.\n*/\n#if defined(TRIO_FUNC_XSTRING_SET)\n\nTRIO_PUBLIC_STRING void\ntrio_xstring_set\nTRIO_ARGS2((self, buffer),\n\t   trio_string_t *self,\n\t   char *buffer)\n{\n  assert(self);\n\n  trio_destroy(self->content);\n  self->content = trio_duplicate(buffer);\n}\n\n#endif\n\n/*\n * trio_string_size\n */\n#if defined(TRIO_FUNC_STRING_SIZE)\n\nTRIO_PUBLIC_STRING int\ntrio_string_size\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  assert(self);\n\n  return self->allocated;\n}\n\n#endif\n\n/*\n * trio_string_terminate\n */\n#if defined(TRIO_FUNC_STRING_TERMINATE)\n\nTRIO_PUBLIC_STRING void\ntrio_string_terminate\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  trio_xstring_append_char(self, 0);\n}\n\n#endif\n\n/**\n   Append the second string to the first.\n   \n   @param self Dynamic string to be modified.\n   @param other Dynamic string to copy from.\n   @return Boolean value indicating success or failure.\n*/\n#if defined(TRIO_FUNC_STRING_APPEND)\n\nTRIO_PUBLIC_STRING int\ntrio_string_append\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  size_t length;\n  \n  assert(self);\n  assert(other);\n\n  length = self->length + other->length;\n  if (!internal_string_grow_to(self, length))\n    goto error;\n  trio_copy(&self->content[self->length], other->content);\n  self->length = length;\n  return TRUE;\n  \n error:\n  return FALSE;\n}\n\n#endif\n\n\n/*\n * trio_xstring_append\n */\n#if defined(TRIO_FUNC_XSTRING_APPEND)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_append\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  size_t length;\n  \n  assert(self);\n  assert(other);\n\n  length = self->length + trio_length(other);\n  if (!internal_string_grow_to(self, length))\n    goto error;\n  trio_copy(&self->content[self->length], other);\n  self->length = length;\n  return TRUE;\n  \n error:\n  return FALSE;\n}\n\n#endif\n\n/*\n * trio_xstring_append_char\n */\n#if defined(TRIO_FUNC_XSTRING_APPEND_CHAR)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_append_char\nTRIO_ARGS2((self, character),\n\t   trio_string_t *self,\n\t   char character)\n{\n  assert(self);\n\n  if ((int)self->length >= trio_string_size(self))\n    {\n      if (!internal_string_grow(self, 0))\n\tgoto error;\n    }\n  self->content[self->length] = character;\n  self->length++;\n  return TRUE;\n  \n error:\n  return FALSE;\n}\n\n#endif\n\n/*\n * trio_xstring_append_max\n */\n#if defined(TRIO_FUNC_XSTRING_APPEND_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_append_max\nTRIO_ARGS3((self, other, max),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other,\n           size_t max)\n{\n  size_t length;\n  \n  assert(self);\n  assert(other);\n\n  length = self->length + trio_length_max(other, max);\n  if (!internal_string_grow_to(self, length))\n    goto error;\n\n  /*\n   * Pass max + 1 since trio_copy_max copies one character less than\n   * this from the source to make room for a terminating zero.\n   */\n  trio_copy_max(&self->content[self->length], max + 1, other);\n  self->length = length;\n  return TRUE;\n  \n error:\n  return FALSE;\n}\n\n#endif\n\n/**\n   Search for the first occurrence of second parameter in the first.\n   \n   @param self Dynamic string to be modified.\n   @param other Dynamic string to copy from.\n   @return Boolean value indicating success or failure.\n*/\n#if defined(TRIO_FUNC_STRING_CONTAINS)\n\nTRIO_PUBLIC_STRING int\ntrio_string_contains\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_contains(self->content, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_contains\n */\n#if defined(TRIO_FUNC_XSTRING_CONTAINS)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_contains\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_contains(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_copy\n */\n#if defined(TRIO_FUNC_STRING_COPY)\n\nTRIO_PUBLIC_STRING int\ntrio_string_copy\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  self->length = 0;\n  return trio_string_append(self, other);\n}\n\n#endif\n\n\n/*\n * trio_xstring_copy\n */\n#if defined(TRIO_FUNC_XSTRING_COPY)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_copy\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  self->length = 0;\n  return trio_xstring_append(self, other);\n}\n\n#endif\n\n/*\n * trio_string_duplicate\n */\n#if defined(TRIO_FUNC_STRING_DUPLICATE)\n\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_string_duplicate\nTRIO_ARGS1((other),\n\t   trio_string_t *other)\n{\n  trio_string_t *self;\n  \n  assert(other);\n\n  self = internal_string_alloc();\n  if (self)\n    {\n      self->content = internal_duplicate_max(other->content, other->length);\n      if (self->content)\n\t{\n\t  self->length = other->length;\n\t  self->allocated = self->length + 1;\n\t}\n      else\n\t{\n\t  self->length = self->allocated = 0;\n\t}\n    }\n  return self;\n}\n\n#endif\n\n/*\n * trio_xstring_duplicate\n */\n#if defined(TRIO_FUNC_XSTRING_DUPLICATE)\n\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_xstring_duplicate\nTRIO_ARGS1((other),\n\t   TRIO_CONST char *other)\n{\n  trio_string_t *self;\n  \n  assert(other);\n\n  self = internal_string_alloc();\n  if (self)\n    {\n      self->content = internal_duplicate_max(other, trio_length(other));\n      if (self->content)\n\t{\n\t  self->length = trio_length(self->content);\n\t  self->allocated = self->length + 1;\n\t}\n      else\n\t{\n\t  self->length = self->allocated = 0;\n\t}\n    }\n  return self;\n}\n\n#endif\n\n/*\n * trio_string_equal\n */\n#if defined(TRIO_FUNC_STRING_EQUAL)\n\nTRIO_PUBLIC_STRING int\ntrio_string_equal\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal(self->content, other->content);\n}\n\n#endif\n\n\n/*\n * trio_xstring_equal\n */\n#if defined(TRIO_FUNC_XSTRING_EQUAL)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_equal_max\n */\n#if defined(TRIO_FUNC_STRING_EQUAL_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_string_equal_max\nTRIO_ARGS3((self, max, other),\n\t   trio_string_t *self,\n\t   size_t max,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_max(self->content, max, other->content);\n}\n#endif\n\n/*\n * trio_xstring_equal_max\n */\n#if defined(TRIO_FUNC_XSTRING_EQUAL_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_max\nTRIO_ARGS3((self, max, other),\n\t   trio_string_t *self,\n\t   size_t max,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_max(self->content, max, other);\n}\n\n#endif\n\n/*\n * trio_string_equal_case\n */\n#if defined(TRIO_FUNC_STRING_EQUAL_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_string_equal_case\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_case(self->content, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_equal_case\n */\n#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_case\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_case(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_equal_case_max\n */\n#if defined(TRIO_FUNC_STRING_EQUAL_CASE_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_string_equal_case_max\nTRIO_ARGS3((self, max, other),\n\t   trio_string_t *self,\n\t   size_t max,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_case_max(self->content, max, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_equal_case_max\n */\n#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE_MAX)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_case_max\nTRIO_ARGS3((self, max, other),\n\t   trio_string_t *self,\n\t   size_t max,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_equal_case_max(self->content, max, other);\n}\n\n#endif\n\n/*\n * trio_string_format_data_max\n */\n#if defined(TRIO_FUNC_STRING_FORMAT_DATE_MAX)\n\nTRIO_PUBLIC_STRING size_t\ntrio_string_format_date_max\nTRIO_ARGS4((self, max, format, datetime),\n\t   trio_string_t *self,\n\t   size_t max,\n\t   TRIO_CONST char *format,\n\t   TRIO_CONST struct tm *datetime)\n{\n  assert(self);\n\n  return trio_format_date_max(self->content, max, format, datetime);\n}\n\n#endif\n\n/*\n * trio_string_index\n */\n#if defined(TRIO_FUNC_STRING_INDEX)\n\nTRIO_PUBLIC_STRING char *\ntrio_string_index\nTRIO_ARGS2((self, character),\n\t   trio_string_t *self,\n\t   int character)\n{\n  assert(self);\n\n  return trio_index(self->content, character);\n}\n\n#endif\n\n/*\n * trio_string_index_last\n */\n#if defined(TRIO_FUNC_STRING_INDEX_LAST)\n\nTRIO_PUBLIC_STRING char *\ntrio_string_index_last\nTRIO_ARGS2((self, character),\n\t   trio_string_t *self,\n\t   int character)\n{\n  assert(self);\n\n  return trio_index_last(self->content, character);\n}\n\n#endif\n\n/*\n * trio_string_length\n */\n#if defined(TRIO_FUNC_STRING_LENGTH)\n\nTRIO_PUBLIC_STRING int\ntrio_string_length\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  assert(self);\n\n  if (self->length == 0)\n    {\n      self->length = trio_length(self->content);\n    }\n  return self->length;\n}\n\n#endif\n\n/*\n * trio_string_lower\n */\n#if defined(TRIO_FUNC_STRING_LOWER)\n\nTRIO_PUBLIC_STRING int\ntrio_string_lower\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  assert(self);\n\n  return trio_lower(self->content);\n}\n\n#endif\n\n/*\n * trio_string_match\n */\n#if defined(TRIO_FUNC_STRING_MATCH)\n\nTRIO_PUBLIC_STRING int\ntrio_string_match\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_match(self->content, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_match\n */\n#if defined(TRIO_FUNC_XSTRING_MATCH)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_match\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_match(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_match_case\n */\n#if defined(TRIO_FUNC_STRING_MATCH_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_string_match_case\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_match_case(self->content, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_match_case\n */\n#if defined(TRIO_FUNC_XSTRING_MATCH_CASE)\n\nTRIO_PUBLIC_STRING int\ntrio_xstring_match_case\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_match_case(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_substring\n */\n#if defined(TRIO_FUNC_STRING_SUBSTRING)\n\nTRIO_PUBLIC_STRING char *\ntrio_string_substring\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   trio_string_t *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_substring(self->content, other->content);\n}\n\n#endif\n\n/*\n * trio_xstring_substring\n */\n#if defined(TRIO_FUNC_XSTRING_SUBSTRING)\n\nTRIO_PUBLIC_STRING char *\ntrio_xstring_substring\nTRIO_ARGS2((self, other),\n\t   trio_string_t *self,\n\t   TRIO_CONST char *other)\n{\n  assert(self);\n  assert(other);\n\n  return trio_substring(self->content, other);\n}\n\n#endif\n\n/*\n * trio_string_upper\n */\n#if defined(TRIO_FUNC_STRING_UPPER)\n\nTRIO_PUBLIC_STRING int\ntrio_string_upper\nTRIO_ARGS1((self),\n\t   trio_string_t *self)\n{\n  assert(self);\n\n  return trio_upper(self->content);\n}\n\n#endif\n\n/** @} End of DynamicStrings */\n"
  },
  {
    "path": "src/trio/triostr.h",
    "content": "/*************************************************************************\n *\n * $Id$\n *\n * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF\n * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND\n * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.\n *\n ************************************************************************/\n\n#ifndef TRIO_TRIOSTR_H\n#define TRIO_TRIOSTR_H\n\n/*\n * Documentation is located in triostr.c\n */\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include \"triodef.h\"\n#include \"triop.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nenum {\n  TRIO_HASH_NONE = 0,\n  TRIO_HASH_PLAIN,\n  TRIO_HASH_TWOSIGNED\n};\n\n#if !defined(TRIO_PUBLIC_STRING)\n# if !defined(TRIO_PUBLIC)\n#  define TRIO_PUBLIC\n# endif\n# define TRIO_PUBLIC_STRING TRIO_PUBLIC\n#endif\n\n/*************************************************************************\n * Dependencies\n */\n\n#if defined(TRIO_EMBED_STRING)\n\n/*\n * The application that triostr is embedded in must define which functions\n * it uses.\n *\n * The following resolves internal dependencies.\n */\n  \n# if defined(TRIO_FUNC_XSTRING_SET)\n#  if !defined(TRIO_FUNC_DUPLICATE)\n#   define TRIO_FUNC_DUPLICATE\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_DUPLICATE) \\\n  || defined(TRIO_FUNC_DUPLICATE_MAX) \\\n  || defined(TRIO_FUNC_STRING_DUPLICATE) \\\n  || defined(TRIO_FUNC_XSTRING_DUPLICATE)\n#  if !defined(TRIO_FUNC_CREATE)\n#   define TRIO_FUNC_CREATE\n#  endif\n#  if !defined(TRIO_FUNC_COPY_MAX)\n#   define TRIO_FUNC_COPY_MAX\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_STRING_CREATE)\n#  if !defined(TRIO_FUNC_STRING_DESTROY)\n#   define TRIO_FUNC_STRING_DESTROY\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_STRING_DESTROY) \\\n  || defined(TRIO_FUNC_XSTRING_SET)\n#  if !defined(TRIO_FUNC_DESTROY)\n#   define TRIO_FUNC_DESTROY\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_EQUAL_LOCALE) \\\n  || defined(TRIO_FUNC_STRING_EQUAL) \\\n  || defined(TRIO_FUNC_XSTRING_EQUAL)\n#  if !defined(TRIO_FUNC_EQUAL)\n#   define TRIO_FUNC_EQUAL\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_EQUAL_CASE) \\\n  || defined(TRIO_FUNC_STRING_EQUAL_CASE) \\\n  || defined(TRIO_FUNC_XSTRING_EQUAL_CASE)\n#  if !defined(TRIO_FUNC_EQUAL_CASE)\n#   define TRIO_FUNC_EQUAL_CASE\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_SUBSTRING_MAX) \\\n  || defined(TRIO_FUNC_STRING_EQUAL_MAX) \\\n  || defined(TRIO_FUNC_XSTRING_EQUAL_MAX)\n#  if !defined(TRIO_FUNC_EQUAL_MAX)\n#   define TRIO_FUNC_EQUAL_MAX\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_TO_DOUBLE) \\\n  || defined(TRIO_FUNC_TO_FLOAT)\n#  if !defined(TRIO_FUNC_TO_LONG_DOUBLE)\n#   define TRIO_FUNC_TO_LONG_DOUBLE\n#  endif\n#  if !defined(TRIO_FUNC_TO_FLOAT)\n#   define TRIO_FUNC_TO_FLOAT\n#  endif  \n# endif\n\n# if defined(TRIO_FUNC_STRING_TERMINATE)\n#  if !defined(TRIO_FUNC_XSTRING_APPEND_CHAR)\n#   define TRIO_FUNC_XSTRING_APPEND_CHAR\n#  endif\n# endif\n\n# if defined(TRIO_FUNC_XSTRING_APPEND_CHAR)\n#  if !defined(TRIO_FUNC_STRING_SIZE)\n#   define TRIO_FUNC_STRING_SIZE\n#  endif\n# endif\n\n#else\n\n/*\n * When triostr is not embedded all functions are defined.\n */\n\n# define TRIO_FUNC_APPEND\n# define TRIO_FUNC_APPEND_MAX\n# define TRIO_FUNC_CONTAINS\n# define TRIO_FUNC_COPY\n# define TRIO_FUNC_COPY_MAX\n# define TRIO_FUNC_CREATE\n# define TRIO_FUNC_DESTROY\n# define TRIO_FUNC_DUPLICATE\n# define TRIO_FUNC_DUPLICATE_MAX\n# define TRIO_FUNC_EQUAL\n# define TRIO_FUNC_EQUAL_CASE\n# define TRIO_FUNC_EQUAL_CASE_MAX\n# define TRIO_FUNC_EQUAL_LOCALE\n# define TRIO_FUNC_EQUAL_MAX\n# define TRIO_FUNC_ERROR\n# if !defined(TRIO_PLATFORM_WINCE)\n#  define TRIO_FUNC_FORMAT_DATE_MAX\n# endif\n# define TRIO_FUNC_HASH\n# define TRIO_FUNC_INDEX\n# define TRIO_FUNC_INDEX_LAST\n# define TRIO_FUNC_LENGTH\n# define TRIO_FUNC_LENGTH_MAX\n# define TRIO_FUNC_LOWER\n# define TRIO_FUNC_MATCH\n# define TRIO_FUNC_MATCH_CASE\n# define TRIO_FUNC_SPAN_FUNCTION\n# define TRIO_FUNC_SUBSTRING\n# define TRIO_FUNC_SUBSTRING_MAX\n# define TRIO_FUNC_TO_DOUBLE\n# define TRIO_FUNC_TO_FLOAT\n# define TRIO_FUNC_TO_LONG\n# define TRIO_FUNC_TO_LONG_DOUBLE\n# define TRIO_FUNC_TO_LOWER\n# define TRIO_FUNC_TO_UNSIGNED_LONG\n# define TRIO_FUNC_TO_UPPER\n# define TRIO_FUNC_TOKENIZE\n# define TRIO_FUNC_UPPER\n\n# define TRIO_FUNC_STRING_APPEND\n# define TRIO_FUNC_STRING_CONTAINS\n# define TRIO_FUNC_STRING_COPY\n# define TRIO_FUNC_STRING_CREATE\n# define TRIO_FUNC_STRING_DESTROY\n# define TRIO_FUNC_STRING_DUPLICATE\n# define TRIO_FUNC_STRING_EQUAL\n# define TRIO_FUNC_STRING_EQUAL_CASE\n# define TRIO_FUNC_STRING_EQUAL_CASE_MAX\n# define TRIO_FUNC_STRING_EQUAL_MAX\n# define TRIO_FUNC_STRING_EXTRACT\n# if !defined(TRIO_PLATFORM_WINCE)\n#  define TRIO_FUNC_STRING_FORMAT_DATE_MAX\n# endif\n# define TRIO_FUNC_STRING_GET\n# define TRIO_FUNC_STRING_INDEX\n# define TRIO_FUNC_STRING_INDEX_LAST\n# define TRIO_FUNC_STRING_LENGTH\n# define TRIO_FUNC_STRING_LOWER\n# define TRIO_FUNC_STRING_MATCH\n# define TRIO_FUNC_STRING_MATCH_CASE\n# define TRIO_FUNC_STRING_SIZE\n# define TRIO_FUNC_STRING_SUBSTRING\n# define TRIO_FUNC_STRING_TERMINATE\n# define TRIO_FUNC_STRING_UPPER\n\n# define TRIO_FUNC_XSTRING_APPEND\n# define TRIO_FUNC_XSTRING_APPEND_CHAR\n# define TRIO_FUNC_XSTRING_APPEND_MAX\n# define TRIO_FUNC_XSTRING_CONTAINS\n# define TRIO_FUNC_XSTRING_COPY\n# define TRIO_FUNC_XSTRING_DUPLICATE\n# define TRIO_FUNC_XSTRING_EQUAL\n# define TRIO_FUNC_XSTRING_EQUAL_CASE\n# define TRIO_FUNC_XSTRING_EQUAL_CASE_MAX\n# define TRIO_FUNC_XSTRING_EQUAL_MAX\n# define TRIO_FUNC_XSTRING_MATCH\n# define TRIO_FUNC_XSTRING_MATCH_CASE\n# define TRIO_FUNC_XSTRING_SET\n# define TRIO_FUNC_XSTRING_SUBSTRING\n\n#endif\n\n\n/*************************************************************************\n * String functions\n */\n\n#if defined(TRIO_FUNC_APPEND)\nTRIO_PUBLIC_STRING int\ntrio_append\nTRIO_PROTO((char *target, TRIO_CONST char *source));\n#endif\n\n#if defined(TRIO_FUNC_APPEND_MAX)\nTRIO_PUBLIC_STRING int\ntrio_append_max\nTRIO_PROTO((char *target, size_t max, TRIO_CONST char *source));\n#endif\n\n#if defined(TRIO_FUNC_CONTAINS)\nTRIO_PUBLIC_STRING int\ntrio_contains\nTRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring));\n#endif\n\n#if defined(TRIO_FUNC_COPY)\nTRIO_PUBLIC_STRING int\ntrio_copy\nTRIO_PROTO((char *target, TRIO_CONST char *source));\n#endif\n\n#if defined(TRIO_FUNC_COPY_MAX)\nTRIO_PUBLIC_STRING int\ntrio_copy_max\nTRIO_PROTO((char *target, size_t max, TRIO_CONST char *source));\n#endif\n\n#if defined(TRIO_FUNC_CREATE)\nTRIO_PUBLIC_STRING char *\ntrio_create\nTRIO_PROTO((size_t size));\n#endif\n\n#if defined(TRIO_FUNC_DESTROY)\nTRIO_PUBLIC_STRING void\ntrio_destroy\nTRIO_PROTO((char *string));\n#endif\n\n#if defined(TRIO_FUNC_DUPLICATE)\nTRIO_PUBLIC_STRING char *\ntrio_duplicate\nTRIO_PROTO((TRIO_CONST char *source));\n#endif\n\n#if defined(TRIO_FUNC_DUPLICATE_MAX)\nTRIO_PUBLIC_STRING char *\ntrio_duplicate_max\nTRIO_PROTO((TRIO_CONST char *source, size_t max));\n#endif\n\n#if defined(TRIO_FUNC_EQUAL)\nTRIO_PUBLIC_STRING int\ntrio_equal\nTRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));\n#endif\n\n#if defined(TRIO_FUNC_EQUAL_CASE)\nTRIO_PUBLIC_STRING int\ntrio_equal_case\nTRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));\n#endif\n\n#if defined(TRIO_FUNC_EQUAL_CASE_MAX)\nTRIO_PUBLIC_STRING int\ntrio_equal_case_max\nTRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second));\n#endif\n\n#if defined(TRIO_FUNC_EQUAL_LOCALE)\nTRIO_PUBLIC_STRING int\ntrio_equal_locale\nTRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second));\n#endif\n\n#if defined(TRIO_FUNC_EQUAL_MAX)\nTRIO_PUBLIC_STRING int\ntrio_equal_max\nTRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second));\n#endif\n\n#if defined(TRIO_FUNC_ERROR)\nTRIO_PUBLIC_STRING TRIO_CONST char *\ntrio_error\nTRIO_PROTO((int));\n#endif\n\n#if defined(TRIO_FUNC_FORMAT_DATE_MAX)\nTRIO_PUBLIC_STRING size_t\ntrio_format_date_max\nTRIO_PROTO((char *target, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime));\n#endif\n\n#if defined(TRIO_FUNC_HASH)\nTRIO_PUBLIC_STRING unsigned long\ntrio_hash\nTRIO_PROTO((TRIO_CONST char *string, int type));\n#endif\n\n#if defined(TRIO_FUNC_INDEX)\nTRIO_PUBLIC_STRING char *\ntrio_index\nTRIO_PROTO((TRIO_CONST char *string, int character));\n#endif\n\n#if defined(TRIO_FUNC_INDEX_LAST)\nTRIO_PUBLIC_STRING char *\ntrio_index_last\nTRIO_PROTO((TRIO_CONST char *string, int character));\n#endif\n\n#if defined(TRIO_FUNC_LENGTH)\nTRIO_PUBLIC_STRING size_t\ntrio_length\nTRIO_PROTO((TRIO_CONST char *string));\n#endif\n\n#if defined(TRIO_FUNC_LENGTH_MAX)\nTRIO_PUBLIC_STRING size_t\ntrio_length_max\nTRIO_PROTO((TRIO_CONST char *string, size_t max));\n#endif\n\n#if defined(TRIO_FUNC_LOWER)\nTRIO_PUBLIC_STRING int\ntrio_lower\nTRIO_PROTO((char *target));\n#endif\n\n#if defined(TRIO_FUNC_MATCH)\nTRIO_PUBLIC_STRING int\ntrio_match\nTRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern));\n#endif\n\n#if defined(TRIO_FUNC_MATCH_CASE)\nTRIO_PUBLIC_STRING int\ntrio_match_case\nTRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern));\n#endif\n\n#if defined(TRIO_FUNC_SPAN_FUNCTION)\nTRIO_PUBLIC_STRING size_t\ntrio_span_function\nTRIO_PROTO((char *target, TRIO_CONST char *source, int (*Function) TRIO_PROTO((int))));\n#endif\n\n#if defined(TRIO_FUNC_SUBSTRING)\nTRIO_PUBLIC_STRING char *\ntrio_substring\nTRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring));\n#endif\n\n#if defined(TRIO_FUNC_SUBSTRING_MAX)\nTRIO_PUBLIC_STRING char *\ntrio_substring_max\nTRIO_PROTO((TRIO_CONST char *string, size_t max, TRIO_CONST char *substring));\n#endif\n\n#if defined(TRIO_FUNC_TO_DOUBLE)\nTRIO_PUBLIC_STRING double\ntrio_to_double\nTRIO_PROTO((TRIO_CONST char *source, char **endp));\n#endif\n\n#if defined(TRIO_FUNC_TO_FLOAT)\nTRIO_PUBLIC_STRING float\ntrio_to_float\nTRIO_PROTO((TRIO_CONST char *source, char **endp));\n#endif\n\n#if defined(TRIO_FUNC_TO_LONG)\nTRIO_PUBLIC_STRING long\ntrio_to_long\nTRIO_PROTO((TRIO_CONST char *source, char **endp, int base));\n#endif\n\n#if defined(TRIO_FUNC_TO_LOWER)\nTRIO_PUBLIC_STRING int\ntrio_to_lower\nTRIO_PROTO((int source));\n#endif\n\n#if defined(TRIO_FUNC_TO_LONG_DOUBLE)\nTRIO_PUBLIC_STRING trio_long_double_t\ntrio_to_long_double\nTRIO_PROTO((TRIO_CONST char *source, char **endp));\n#endif\n\n#if defined(TRIO_FUNC_TO_UNSIGNED_LONG)\nTRIO_PUBLIC_STRING unsigned long\ntrio_to_unsigned_long\nTRIO_PROTO((TRIO_CONST char *source, char **endp, int base));\n#endif\n\n#if defined(TRIO_FUNC_TO_UPPER)\nTRIO_PUBLIC_STRING int\ntrio_to_upper\nTRIO_PROTO((int source));\n#endif\n\n#if defined(TRIO_FUNC_TOKENIZE)\nTRIO_PUBLIC_STRING char *\ntrio_tokenize\nTRIO_PROTO((char *string, TRIO_CONST char *delimiters));\n#endif\n\n#if defined(TRIO_FUNC_UPPER)\nTRIO_PUBLIC_STRING int\ntrio_upper\nTRIO_PROTO((char *target));\n#endif\n\n/*************************************************************************\n * Dynamic string functions\n */\n\n/*\n * Opaque type for dynamic strings\n */\n\ntypedef struct _trio_string_t trio_string_t;\n\n#if defined(TRIO_FUNC_STRING_APPEND)\nTRIO_PUBLIC_STRING int\ntrio_string_append\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_CONTAINS)\nTRIO_PUBLIC_STRING int\ntrio_string_contains\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_COPY)\nTRIO_PUBLIC_STRING int\ntrio_string_copy\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_CREATE)\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_string_create\nTRIO_PROTO((int initial_size));\n#endif\n\n#if defined(TRIO_FUNC_STRING_DESTROY)\nTRIO_PUBLIC_STRING void\ntrio_string_destroy\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_DUPLICATE)\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_string_duplicate\nTRIO_PROTO((trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_EQUAL)\nTRIO_PUBLIC_STRING int\ntrio_string_equal\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_EQUAL_MAX)\nTRIO_PUBLIC_STRING int\ntrio_string_equal_max\nTRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second));\n#endif\n\n#if defined(TRIO_FUNC_STRING_EQUAL_CASE)\nTRIO_PUBLIC_STRING int\ntrio_string_equal_case\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_EQUAL_CASE_MAX)\nTRIO_PUBLIC_STRING int\ntrio_string_equal_case_max\nTRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_EXTRACT)\nTRIO_PUBLIC_STRING char *\ntrio_string_extract\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_FORMAT_DATE_MAX)\nTRIO_PUBLIC_STRING size_t\ntrio_string_format_date_max\nTRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime));\n#endif\n\n#if defined(TRIO_FUNC_STRING_GET)\nTRIO_PUBLIC_STRING char *\ntrio_string_get\nTRIO_PROTO((trio_string_t *self, int offset));\n#endif\n\n#if defined(TRIO_FUNC_STRING_INDEX)\nTRIO_PUBLIC_STRING char *\ntrio_string_index\nTRIO_PROTO((trio_string_t *self, int character));\n#endif\n\n#if defined(TRIO_FUNC_STRING_INDEX_LAST)\nTRIO_PUBLIC_STRING char *\ntrio_string_index_last\nTRIO_PROTO((trio_string_t *self, int character));\n#endif\n\n#if defined(TRIO_FUNC_STRING_LENGTH)\nTRIO_PUBLIC_STRING int\ntrio_string_length\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_LOWER)\nTRIO_PUBLIC_STRING int\ntrio_string_lower\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_MATCH)\nTRIO_PUBLIC_STRING int\ntrio_string_match\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_MATCH_CASE)\nTRIO_PUBLIC_STRING int\ntrio_string_match_case\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_SIZE)\nTRIO_PUBLIC_STRING int\ntrio_string_size\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_SUBSTRING)\nTRIO_PUBLIC_STRING char *\ntrio_string_substring\nTRIO_PROTO((trio_string_t *self, trio_string_t *other));\n#endif\n\n#if defined(TRIO_FUNC_STRING_TERMINATE)\nTRIO_PUBLIC_STRING void\ntrio_string_terminate\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_STRING_UPPER)\nTRIO_PUBLIC_STRING int\ntrio_string_upper\nTRIO_PROTO((trio_string_t *self));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_APPEND)\nTRIO_PUBLIC_STRING int\ntrio_xstring_append\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_APPEND_CHAR)\nTRIO_PUBLIC_STRING int\ntrio_xstring_append_char\nTRIO_PROTO((trio_string_t *self, char character));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_APPEND_MAX)\nTRIO_PUBLIC_STRING int\ntrio_xstring_append_max\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other, size_t max));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_CONTAINS)\nTRIO_PUBLIC_STRING int\ntrio_xstring_contains\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_COPY)\nTRIO_PUBLIC_STRING int\ntrio_xstring_copy\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_DUPLICATE)\nTRIO_PUBLIC_STRING trio_string_t *\ntrio_xstring_duplicate\nTRIO_PROTO((TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_EQUAL)\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_EQUAL_MAX)\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_max\nTRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE)\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_case\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE_MAX)\nTRIO_PUBLIC_STRING int\ntrio_xstring_equal_case_max\nTRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_MATCH)\nTRIO_PUBLIC_STRING int\ntrio_xstring_match\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_MATCH_CASE)\nTRIO_PUBLIC_STRING int\ntrio_xstring_match_case\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_SET)\nTRIO_PUBLIC_STRING void\ntrio_xstring_set\nTRIO_PROTO((trio_string_t *self, char *buffer));\n#endif\n\n#if defined(TRIO_FUNC_XSTRING_SUBSTRING)\nTRIO_PUBLIC_STRING char *\ntrio_xstring_substring\nTRIO_PROTO((trio_string_t *self, TRIO_CONST char *other));\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TRIO_TRIOSTR_H */\n"
  },
  {
    "path": "src/txt2html.c",
    "content": "/*\n** Copyright (C) 1997, Peter McCluskey (pcm@rahul.net)\n** Based fairly closely on Seth Golub's txt2html.pl, Revision: 1.24\n** (http://www.cs.wustl.edu/~seth/txt2html/)\n*/\n\n#include \"hypermail.h\"\n#include \"proto.h\"\n#include \"setup.h\"\n#include \"print.h\"\n#include \"finelink.h\"\n#include \"txt2html.h\"\n#include <string.h>\n#include <assert.h>\n#include <ctype.h>\n\nstatic int short_line_length = 40;\nstatic int preformat_whitespace_min = 5;\nstatic int preformat_vertical_chars_min = 3;\nstatic int preformat_repeated_chars_min = 14;\nstatic int preformat_repeated_carets_min = 5;\nstatic char preformat_dots[MAXLINE];\nstatic char preformat_carets[MAXLINE];\nstatic int par_indent = 2;\nstatic int preformat_trigger_lines = 2;\nstatic int endpreformat_trigger_lines = 2;\nstatic int hrule_min = 4;\nstatic int min_caps_length = 3;\nstatic char caps_tag[MAXLINE] = \"strong\";\nstatic int tab_width = 8;\nstatic int indent_width = 2;\nstatic int unhyphenation = 1;\n\nstatic char *unhyphenated_word;\nstatic int in_pre_block;\nstatic int insig;\nstatic int islist;\nstatic int is_blank_prev;\nstatic int inquote;\nstatic int was_quote_prefix;\nstatic int quote_num = 0;\nstatic int was_break;\nstatic int was_hrule;\nstatic int prior_was_hrule;\nstatic int was_par;\nstatic int was_caps;\nstatic int was_header;\nstatic int prev_line_length;\nstatic int prev_indent;\n\n#define OL 1\n#define UL 2\n\n#define MAXLISTNESTING 8\nstatic int listnum;\nstatic int list[MAXLISTNESTING];\nstatic char list_indent[MAXLINE];\nstatic char list_prefix[MAXLISTNESTING][MAXLINE];\n\nstatic char *chomp(char *line)\n{\t\t\t\t/* sort of replaces rmcr() */\n    int l = strlen(line);\n    if (l > 0 && line[l - 1] == '\\n')\n\tline[l - 1] = 0;\n    return line;\n}\n\nstatic int convert_to_hrule(const char *line)\n{\n    int count_hrule_chars = 0;\n    while (*line && isspace(*line))\n\t++line;\n\twhile (*line == '-' || *line == '_' || *line == '~' || *line == '=' || *line == '*') {\n\tif (!count_hrule_chars || *line == line[-1])\n\t    ++count_hrule_chars;\n\telse\n\t    return 0;\n\t++line;\n    }\n    while (isspace(*line))\n\t++line;\n    return (!*line && count_hrule_chars >= hrule_min);\n}\n\n/* check for vertically aligned non-alphanumeric chars */\n\nstatic int find_vertical_repeats(const struct body *bp)\n{\n    int i;\n    if (!bp->next) {\n\treturn 0;\n    }\n    i = (isquote(bp->line) ? strlen(get_quote_prefix()) : 0);\n    if (i > strlen(bp->line))\n\treturn 0;\n\tfor (; i < MAXLINE; ++i) {\n\tint j;\n\tconst struct body *bp2 = bp->next;\n\tif (!bp->line[i] || i > strlen(bp2->line) || !bp2->line[i]) {\n\t    return 0;\n\t}\n\tfor (j = 1; bp2; ++j) {\n\t    if (i >= strlen(bp2->line)\n\t\t|| bp->line[i] != bp2->line[i] || !ispunct(bp->line[i]))\n\t\tbreak;\n\t    bp2 = bp2->next;\n\t}\n\tif (j >= preformat_vertical_chars_min) {\n\t    return j;\n\t}\n    }\n    return 0;\n}\n\nstatic int find_repetition(const struct body *bp)\n{\n    const char *line = bp->line;\n    int i = 0;\n    while (line[i]) {\n\tint count_repeated_chars = 0;\n\twhile (line[i + 1] == line[i]) {\n\t    if (++count_repeated_chars > preformat_repeated_chars_min) {\n\t\twhile (isspace(line[i]))\n\t\t    ++i;\t/* if trailing whitespace, return 0 */\n\t\tif (!line[i])\n\t\t    return find_vertical_repeats(bp);\n\t\treturn 1;\n\t    }\n\t    ++i;\n\t}\n\t++i;\n    }\n    return find_vertical_repeats(bp);\n}\n\nstatic int has_many_carets(const char *line)\n{\n    return strstr(line, preformat_carets) != NULL;\n}\n\n/* Returns true if line is considered to be preformatted */\n\nstatic int is_preformatted(const char *line)\n{\n    int count_whitespace = 0;\n    if (strstr(line, preformat_dots))\n\treturn 1;\n    while (*line) {\n\tif (isspace(*line)) {\n\t    if (*line == '\\t')\n\t\t\t\tcount_whitespace += tab_width - (count_whitespace % tab_width);\n\t    else\n\t\t++count_whitespace;\n\t    if (count_whitespace >= preformat_whitespace_min) {\n\t\twhile (isspace(*line)) {\n\t\t    ++line;\n\t\t    if (!*line)\t/* was trailing whitespace */\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t    }\n\t}\n\telse\n\t    count_whitespace = 0;\n\t++line;\n    }\n    return 0;\n}\n\n/*\n * What, if anything, identifies this line as something that should start a new\n * <LI>?\n*/\n\nstatic void listprefix(char *line, struct Push *number, struct Push *prefix, struct Push *rawprefix)\n{\n    const char *p;\n    int is_prefix = 0;\n\n    for (p = line; isspace(*p); ++p);\n    if (isalnum(*p)) {\n\tconst char *p2 = p;\n\tif (isdigit(*p2))\n\t    while (isdigit(*++p2));\n\telse\n\t    ++p2;\n\tif (*p2 != '.' && *p2 != ')' && *p2 != ']' && *p2 != ':')\n\t    return;\n\tif (!isspace(*++p2))\n\t    return;\n\twhile (isspace(*p2))\n\t    ++p2;\n\tif (!isprint(*p2))\n\t    return;\n\tis_prefix = 1;\n    }\n    if (*p == '-' || *p == '=' || *p == '*' || (*p == 'o' && !is_prefix)) {\n\tconst char *p2 = p;\n\twhile (*++p2 == *p);\n\tif (!isspace(*p2))\n\t    return;\n\twhile (isspace(*p2))\n\t    ++p2;\n\tif (!isprint(*p2))\n\t    return;\n\tis_prefix = 1;\n    }\n    if (!is_prefix)\n\treturn;\n\n    if (isalnum(*p) && !(*p == 'o' && isspace(p[1]))) {\n\tif (isdigit(*p))\n\t    do\n\t\tPushByte(number, *p++);\n\t    while (isdigit(*p));\n\telse\n\t    PushByte(number, *p++);\n\tPushByte(prefix, *p++);\n\tPushNString(rawprefix, line, p - line);\n    }\n    else {\n\tif (*p == '-' || *p == 'o' || *p == '=' || *p == '*') {\n\t    PushNString(rawprefix, line, p - line);\n\t    PushNString(prefix, line, p - line);\n\t    while (*p == '-' || *p == 'o' || *p == '=' || *p == '*') {\n\t\tPushByte(rawprefix, *p);\n\t\tPushByte(prefix, *p++);\n\t    }\n\t}\n\tPushByte(number, 0);\t/* make sure it has empty string, not null pointer */\n    }\n}\n\nstatic void set_list_indent(int n)\n{\n    assert(n * indent_width < MAXLINE - 1);\t/* shouldn't be a problem unless MAXLISTNESTING ~ MAXLINE */\n    memset(list_indent, ' ', n * indent_width);\n    list_indent[n * indent_width] = 0;\n}\n\nstatic int startlist(FILE *fp, const char *number, const char *prefix, const char *rawprefix)\n{\n    strcpy(list_prefix[listnum], prefix);\t/* AUDIT biege: does it fit? */\n    if (*number) {\n\t/* It doesn't start with 1,a,A.  Let's not screw with it. */\n\tif ((*number != '1') && (*number != 'a') && (*number != 'A'))\n\t    return 0;\n\tfprintf(fp, \"\\n%s<ol>\\n\", list_indent);\n\tlist[listnum] = OL;\n    }\n    else {\n\tfprintf(fp, \"\\n%s<ul>\\n\", list_indent);\n\tlist[listnum] = UL;\n    }\n\n    if (listnum < MAXLISTNESTING)\n\tlist[++listnum] = 0;\n    set_list_indent(listnum);\n    return 1;\n}\n\nstatic void endlist(FILE *fp, int n)\n{\t\t\t\t/* End N lists */\n    for (; n > 0; n--, listnum--) {\n\tset_list_indent(listnum - 1);\n\tif (list[listnum - 1] == UL) {\n\t    fprintf(fp, \"\\n%s</ul>\\n\", list_indent);\n\t}\n\telse if (list[listnum - 1] == OL) {\n\t    fprintf(fp, \"\\n%s</ol>\\n\", list_indent);\n\t}\n\telse {\n            snprintf(errmsg, sizeof(errmsg),\n                \"Encountered list of unknown type %d\\n\", list[listnum - 1]);\n\t    progerr(errmsg);\n\t}\n    }\n    islist = (listnum != 0);\n}\n\nstatic char *continuelist(FILE *fp, char *line)\n{\n    char *p = line;\n    if (list[listnum - 1] == UL) {\n\twhile (*p && isspace(*p))\n\t    ++p;\n\tif (*p != '-' && *p != '=' && *p != 'o' && *p != '*')\n\t    return line;\n\t++p;\n\t\twhile (*p == p[-1] && (*p == '-' || *p == '=' || *p == 'o' || *p == '*'))\n\t\t\t++p;\n\twhile (*p && isspace(*p))\n\t    ++p;\n\tfprintf(fp, \"%s<li> \", list_indent);\n\treturn --p;\n    }\n    if (list[listnum - 1] == OL) {\n\twhile (*p && isspace(*p))\n\t    ++p;\n\tif (!isalnum(*p))\n\t    return line;\n\tif (isalpha(*p))\n\t    ++p;\n\telse\n\t    while (isdigit(*p))\n\t\t++p;\n\tif (!*p)\n\t    return line;\n\t++p;\n\twhile (*p && isspace(*p))\n\t    ++p;\n\tfprintf(fp, \"%s<li> \", list_indent);\n\treturn --p;\n    }\n    return line;\n}\n\nstatic char *liststuff(FILE *fp, char *line, int line_indent)\n{\n    int i, j;\n    const char *p;\n    int len;\n    char *prefix;\n    char *rawprefix;\n    char *number;\n    struct Push prefix_buf;\n    struct Push rawprefix_buf;\n    struct Push number_buf;\n    struct Push prefix_alternate;\n    int total_prefix_count = 0;\n    INIT_PUSH(prefix_buf);\n    INIT_PUSH(rawprefix_buf);\n    INIT_PUSH(number_buf);\n    INIT_PUSH(prefix_alternate);\n    listprefix(line, &number_buf, &prefix_buf, &rawprefix_buf);\n\n    if (!prefix_buf.len) {\n\tif (!is_blank_prev)\n\t    return line;\t/* inside a list item */\n\t/* This ain't no list.  We'll want to end all of them. */\n\tif (listnum)\n\t    endlist(fp, listnum);\n\treturn line;\n    }\n    number = PUSH_STRING(number_buf);\n    prefix = PUSH_STRING(prefix_buf);\n    rawprefix = PUSH_STRING(rawprefix_buf);\n\n    /* If numbers with more than one digit grow to the left instead of */\n    /* to the right, the prefix will shrink and we'll fail to match the */\n    /* right list.  We need to account for this. */\n    if ((len = strlen(number)) > 1) {\n\tfor (i = 0; i < len - 1; ++i)\n\t    PushByte(&prefix_alternate, ' ');\n\tPushString(&prefix_alternate, prefix);\n    }\n    else\n\tPushByte(&prefix_alternate, 0);\n\n    /* Maybe we're going back up to a previous list */\n    for (i = listnum - 1; (i >= 0) && strcmp(prefix, list_prefix[i]); --i) {\n\t\tif (len > 1 && !strcmp(PUSH_STRING(prefix_alternate), list_prefix[i]))\n\t\tbreak;\n    }\n    free(PUSH_STRING(prefix_alternate));\n\n    /* Measure the indent from where the text starts, not where the */\n    /* prefix starts.  This won't screw anything up, and if we don't do */\n    /* it, the next line might appear to be indented relative to this */\n    /* line, and get tagged as a new paragraph. */\n    p = line;\n    while (isspace(*p)) {\n\ttotal_prefix_count++;\n\tp++;\n    }\n    j = total_prefix_count;\n    while (isalnum(*p) || *p == '-' || *p == '=' || *p == '*') {\n\ttotal_prefix_count++;\n\tp++;\n    }\n    if (total_prefix_count && total_prefix_count != j) {\t/* found a prefix */\n\ttotal_prefix_count++;\n\tp++;\n\twhile (*p && isspace(*p)) {\n\t    total_prefix_count++;\n\t    p++;\n\t}\n    }\n    /* Of course, we only use it if it really turns out to be a list. */\n\n    ++i;\n    if ((i > 0) && (i != listnum)) {\n\tendlist(fp, listnum - i);\n    }\n    else if (!listnum || (i != listnum)) {\n\t\tif ((line_indent > 0) || is_blank_prev || was_break || was_header || prior_was_hrule)\n\t    islist |= startlist(fp, number, prefix, rawprefix);\n\telse {\n\t    free(prefix);\n\t    free(rawprefix);\n\t    free(number);\n\t    return line;\t/* We have something like this: \"- foo\" which usually turns out not to be a list. */\n\t}\n    }\n    else\n\tline_indent = total_prefix_count;\n\n    if (islist)\n\tline = continuelist(fp, line);\n    if (islist)\n\tline_indent = total_prefix_count;\n    free(prefix);\n    free(rawprefix);\n    free(number);\n    return line;\n}\n\nstatic int iscaps(const char *line)\n{\n    int count_uppercase = 0;\n    int found_enough_uppercase = 0;\n    while (*line) {\n\tif (islower(*line) || *line == '<')\n\t    return 0;\n\tif (isupper(*line)) {\n\t    if (++count_uppercase >= min_caps_length)\n\t\tfound_enough_uppercase = 1;\n\t}\n\telse\n\t    count_uppercase = 0;\n\t++line;\n    }\n    return found_enough_uppercase;\n}\n\nstatic char *unhyphenate1(struct Push *uwbuf, const char *next_line, char *line, int len)\n{\n    struct Push buffer;\n    while (*next_line && isalpha(*next_line))\n\tPushByte(uwbuf, *next_line++);\n    if (*next_line == '-')\t/* something like 'one-of-a-kind'? */\n\treturn line;\n    while (*next_line && strchr(\")}].,:;'\\\">\", *next_line))\n\tPushByte(uwbuf, *next_line++);\t/* include any punct with word */\n\tif (isupper(PUSH_STRING(*uwbuf)[0]) && islower((PUSH_STRING(*uwbuf))[1]))\n\t\treturn line;\t/* capitalization probably means separate word */\n    INIT_PUSH(buffer);\n    PushNString(&buffer, line, len - 2);\n    PushString(&buffer, PUSH_STRING(*uwbuf));\t/* concatenate 2 parts of word */\n    PushByte(&buffer, '\\n');\n    RETURN_PUSH(buffer);\n}\n\nstatic char *unhyphenate(char *line, const char *next_line)\n{\n    struct Push uwbuf;\n    char *buffer;\n    int len = strlen(line);\n    const char *p = line + strlen(line) - 3;\t/* look before the final '-\\n' */\n    if (strlen(line) < 3 || !isalpha(*p))\n\treturn line;\t\t/* doesn't look like hyphenated word */\n    while (p > line && isalpha(*p))\n\t--p;\n    if (p == line || *p == '-')\n\treturn line;\t\t/* too long to be word or something like 'one-of-a-kind' */\n    while (*next_line && isspace(*next_line))\n\t++next_line;\n    if (!isalpha(*next_line))\n\treturn line;\n    INIT_PUSH(uwbuf);\n    buffer = unhyphenate1(&uwbuf, next_line, line, len);\n    if (unhyphenated_word)\n\tfree(unhyphenated_word);\n    unhyphenated_word = PUSH_STRING(uwbuf);\n    return buffer;\n}\n\nstatic char *unhyphenate_2nd_line(char *line)\n{\n    struct Push buffer;\n    char *next_part = unhyphenated_word;\n    INIT_PUSH(buffer);\n    while (*line && isspace(*line))\n\tPushByte(&buffer, *line++);\n    while (*next_part++)\n\t++line;\t\t\t/* skip over part that was moved to prior line */\n    PushString(&buffer, line);\n    free(unhyphenated_word);\n    unhyphenated_word = NULL;\n    RETURN_PUSH(buffer);\n}\n\n/*\nchar *id, char *subject,\n\t int msgnum, char *inreply, const char *dir, \n*/\nvoid txt2html(FILE *fp, struct emailinfo *email, const struct body *bp, bool replace_quoted, int maybe_reply)\n{\n    int is_caps_line = 0;\n    int is_blank_line = 1;\n    int line_indent = 0;\n    const char *p;\n    const char *next_line = bp->next ? bp->next->line : \"\";\n    char *line = strsav(bp->line);\n    if (unhyphenated_word) {\n\tchar *new_line = unhyphenate_2nd_line(line);\n\tfree(line);\n\tline = new_line;\n    }\n    for (p = line; *p; ++p) {\n\tif (!isspace(*p)) {\n\t    is_blank_line = 0;\n\t    break;\n\t}\n\tif (*p == '\\t')\n\t    line_indent += tab_width - (line_indent % tab_width);\n\telse\n\t    ++line_indent;\n    }\n    if (in_pre_block > 1 && !isquote(line)) {\n\t--in_pre_block;\n    }\n\telse if (in_pre_block && preformat_trigger_lines != 0 && !is_preformatted(line) && !insig && !is_blank_line && !find_repetition(bp)\n\t     && !has_many_carets(line) && !has_many_carets(next_line)\n\t\t && (endpreformat_trigger_lines == 1 || !is_preformatted(next_line))) {\n\tin_pre_block = 0;\n\tfprintf(fp, \"</pre>\\n\");\n    }\n    if (!in_pre_block && convert_to_hrule(line)) {\n\tfprintf(fp, \"<hr>\\n\");\n\tline[0] = 0;\n\twas_hrule = 1;\n    }\n\n    if (!in_pre_block && !is_blank_line) {\n\tchar *new_line = liststuff(fp, line, line_indent);\n\tif (new_line != line) {\t/* new_line points to middle of line */\n\t    int i;\n\t    for (i = 0; new_line[i] && line[i]; ++i)\n\t\tline[i] = new_line[i];\n\t    line[i] = new_line[i];\n\t}\n    }\n\n\tif (!in_pre_block && !islist && endpreformat_trigger_lines != 0 && !isquote(line) && !was_hrule && (preformat_trigger_lines == 0 || is_sig_start(line) || find_repetition(bp) || has_many_carets(line) || has_many_carets(next_line) || (is_preformatted(line) && (preformat_trigger_lines == 1 || is_preformatted(next_line))))) {\n\tfprintf(fp, \"<pre>\\n\");\n\tin_pre_block = find_repetition(bp);\t/* set #lines from find_vertical_repeats */\n\tif (!in_pre_block)\n\t    in_pre_block = 1;\n\tif (is_sig_start(line))\n\t    insig = 1;\n    }\n\tif (!is_blank_line && !in_pre_block && !was_break && !was_caps && !was_hrule && !was_par && !islist && (is_blank_prev || (line_indent > prev_indent + par_indent))) {\n\tfprintf(fp, \"<p>\\n\");\n\twas_par = 1;\n    }\n\n\tif (!islist && !in_pre_block && !is_blank_line && !inquote && !is_blank_prev && prev_line_length < short_line_length && !was_hrule && !was_par && !islist && !was_break) {\n\tfprintf(fp, \"<br>\\n\");\n\twas_break = 1;\n    }\n\n\tif (unhyphenation && !is_blank_line && !in_pre_block && !inquote && !was_break && strlen(line) >= 2 && line[strlen(line) - 2] == '-') {\n\tchar *new_line = unhyphenate(line, next_line);\n\tif (new_line != line) {\n\t    free(line);\n\t    line = new_line;\n\t}\n    }\n\n    if ((is_caps_line = (!in_pre_block && iscaps(line))) != 0)\n\tfprintf(fp, \"<%s>\", caps_tag);\n\n    if (isquote(line)) {\n\tif (!was_quote_prefix && !was_break && !was_par && !was_hrule) {\n\t    fprintf(fp, \"<br>\\n\");\n\t    was_break = 1;\n\t}\n\tif (!set_linkquotes) {\n\t    fprintf(fp, \"<i class=\\\"%s\\\">\", find_quote_class(line));\n\t    ConvURLs(fp, chomp(line), email->msgid, email->subject, email->charset);\n\t    fprintf(fp, \"</i><br>\\n\");\n\t}\n\t\telse if (handle_quoted_text(fp, email, bp, line, inquote, quote_num, replace_quoted, maybe_reply)) {\n\t    ++quote_num;\n\t    inquote = 1;\n\t}\n\tif (!inquote)\n\t    was_break = 1;\n\twas_quote_prefix = 1;\n    }\n    else if (line[0] != '\\0') {\n\tchar *sp;\n\tif (in_pre_block || insig || islist)\n\t    sp = line;\n\telse\n\t    sp = print_leading_whitespace(fp, line);\n\tConvURLs(fp, chomp(sp), email->msgid, email->subject, email->charset);\n\tfprintf(fp, \"\\n\");\n    }\n    if (is_caps_line)\n\tfprintf(fp, \"</%s>\\n\", caps_tag);\n    is_blank_prev = is_blank_line;\n    if (!isquote(line))\n\tinquote = was_quote_prefix = 0;\n    prior_was_hrule = was_hrule;\n    if (!is_blank_line) {\n\twas_hrule = 0;\n\tif (!was_quote_prefix || !isquote(next_line))\n\t    was_break = 0;\n\twas_par = 0;\n\twas_caps = is_caps_line;\n\twas_header = 0;\n\tprev_line_length = strlen(line);\n\tprev_indent = line_indent;\n    }\n    free(line);\n}\n\nvoid init_txt2html()\n{\n    in_pre_block = 0;\n    insig = 0;\n    islist = 0;\n    listnum = 0;\n    is_blank_prev = 0;\n    inquote = 0;\n    was_quote_prefix = 0;\n    was_break = 0;\n    was_hrule = 0;\n    prior_was_hrule = 0;\n    was_par = 0;\n    was_header = 1;\n    memset(preformat_dots, ' ', preformat_whitespace_min);\n    preformat_dots[preformat_whitespace_min] = 0;\n    memset(preformat_carets, '^', preformat_repeated_carets_min);\n    preformat_carets[preformat_repeated_carets_min] = 0;\n    prev_line_length = 0;\n    prev_indent = 0;\n    quote_num = 0;\n    unhyphenated_word = NULL;\n}\n\nvoid end_txt2html(FILE *fp)\n{\n    if (islist)\n\tendlist(fp, listnum);\t/* End all lists */\n    if (in_pre_block)\n\tfprintf(fp, \"</pre>\\n\");\n    if (unhyphenated_word) {\n\tfree(unhyphenated_word);\n\tunhyphenated_word = NULL;\n    }\n#if DEBUG_HTML\n    printcomment(fp, \"end_txt2html\", \"\");\t\n#endif\n}\n"
  },
  {
    "path": "src/txt2html.h",
    "content": "\nvoid\ntxt2html(FILE *, struct emailinfo *, const struct body *, bool, int);\nvoid init_txt2html(void);\nvoid end_txt2html(FILE *fp);\n"
  },
  {
    "path": "src/uconvert.h",
    "content": "#ifndef __UCONVERT_H\n#define __UCONVERT_H\n\n/*\n** This file lists the convertions between a given charset space and the\n   Unicode one.\n*/\n\n/* JK: Taken from the Amaya source code (Amaya/thotlib/unicode/uconvert.c) */\n\n/* Windows Latin 1 Code Page */\nint WIN1252CP [] = {\n    0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,\n    0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F,\n    0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n    0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, \n    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,\n    0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,\n    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,\n    0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,\n    0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,\n    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,\n    0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,\n    0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,\n    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,\n    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,\n    0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,\n    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF\n};\n#define WIN1252CP_length sizeof(WIN1252CP) / sizeof(int)\n\n#endif /* __UCONVERT_H */\n"
  },
  {
    "path": "src/uudecode.c",
    "content": "/*\n** This file was written by Daniel Stenberg. \n** Parts of it were stolen from the BSD uudecode command.\n*/\n\n/*\n** Copyright (c) 1983 Regents of the University of California.\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without\n** modification, are permitted provided that the following conditions\n** are met:\n** 1. Redistributions of source code must retain the above copyright\n**    notice, this list of conditions and the following disclaimer.\n** 2. Redistributions in binary form must reproduce the above copyright\n**    notice, this list of conditions and the following disclaimer in the\n**    documentation and/or other materials provided with the distribution.\n** 3. Neither the name of the University nor the names of its contributors\n**    may be used to endorse or promote products derived from this software\n**    without specific prior written permission.\n**\n** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n** ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n** SUCH DAMAGE.\n*/\n\n#include \"hypermail.h\"\n#include \"setup.h\"\n#include \"uudecode.h\"\n\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n\n/* sco/isc */\n#ifndef MAXPATHLEN\n#ifdef PATH_MAX\n#define MAXPATHLEN PATH_MAX\n#else\n#define MAXPATHLEN 1024\n#endif\n#endif\n\n#define DEC(c) (((c) - ' ') & 077)\t/* single character decode */\n#define IS_DEC(c) ( (((c) - ' ') >= 0) &&  (((c) - ' ') <= 077 + 1) )\n\n/*\n** uudecode returns non-zero on error \n*/\n\nint uudecode(FILE *input,\t/* get file data from (if needed) */\n\t     char *iptr,\t/* input string from where we are right now */\n\t     char *output,\t/* write result to, must be at least 80 bytes */\n\t     int *length,\t/* output size */\n\t     struct Push *init)\n{\t\t\t\t/* set to non-zero when initing */\n    register int n;\n    register char ch, *p;\n    int mode;\n    char buf[MAXPATHLEN] = { 0 };\n    char scanfstring[MAXPATHLEN] = { 0 };\n    int outlen = 0;\n\n    if (length)\n\t*length = 0;\t\t/* in case we abort early */\n    \n    if (init) {\n\t/* search for header line */\n\t/* AUDIT biege: BOF in buf! */\n\tsprintf(scanfstring, \"begin %%o %%%us\", sizeof(buf) - 1);\n\twhile (2 != sscanf(iptr, scanfstring, &mode, buf)) {\n\t    if (!fgets(buf, MAXPATHLEN, input)) {\n\t\treturn 2;\n\t    }\n\t    PushString(init, buf);\n\t    iptr = buf + set_ietf_mbox;\n\t}\n#if 0\n\tfprintf(stderr, \"FIRST %s\", iptr);\n#endif\n\t/* ignore file mode    */\n\t/* ignore file name too for now */\n    }\n    else {\n\t/* for each input line */\n\tp = iptr;\n\n\t/* first, just make sure this isn't the end line: */\n\n\t\tif (!strcmp(buf, \"end\") || !strcmp(buf, \"end\\n\") || !strcmp(buf, \"end\\r\\n\")) {\n\t    /* muu->state = UU_HASENDED; */\n\t    if (length)\n\t\t*length = 0;\n\t    return 0;\n\t}\n\n\tn = DEC(*p);\n\tfor (++p; (n > 0) && (outlen < 80); p += 4, n -= 3) {\n\t    if (n >= 3) {\n\n\t\tif (!(IS_DEC(*p) && IS_DEC(*(p + 1)) && IS_DEC(*(p + 2)) && IS_DEC(*(p + 3))))\n\t\t    return 33;\n\n\t\tch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;\n\t\toutput[outlen++] = ch;\n\t\tch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;\n\t\toutput[outlen++] = ch;\n\t\tch = DEC(p[2]) << 6 | DEC(p[3]);\n\t\toutput[outlen++] = ch;\n\n\t    }\n\t    else {\n\t\tif (n >= 1) {\n\t\t    if (!(IS_DEC(*p) && IS_DEC(*(p + 1))))\n\t\t\treturn 34;\n\t\t    ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;\n\t\t    output[outlen++] = ch;\n\t\t}\n\t\tif (n >= 2) {\n\t\t    if (!(IS_DEC(*(p + 1)) && IS_DEC(*(p + 2))))\n\t\t\treturn 35;\n\t\t    ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;\n\t\t    output[outlen++] = ch;\n\t\t}\n\t\tif (n >= 3) {\n\t\t    if (!(IS_DEC(*(p + 2)) && IS_DEC(*(p + 3))))\n\t\t\treturn 36;\n\t\t    ch = DEC(p[2]) << 6 | DEC(p[3]);\n\t\t    output[outlen++] = ch;\n\t\t}\n\t    }\n\t}\n    }\n    if (output)\n\toutput[outlen] = 0;\t/* zero terminate    */\n\n    if (length)\n\t*length = outlen;\t/* send back size    */\n\n    return 0;\n}\n"
  },
  {
    "path": "src/uudecode.h",
    "content": "/*\n** uudecode.c function \n*/\n\nint uudecode(FILE *, char *, char *, int *, struct Push *);\n"
  },
  {
    "path": "tests/README",
    "content": "Testing Hypermail:\n==================\n\nThis directory is here for you to use in testing hypermail locally.\nIt is useful for testing new hypermail distributions and features\nwithout impacting your production facilities.\n \nYou will find the following files in this directory:\n\n    test-footer.hyp - HTML footer template file \n    test-index.hyp  - Index pages template file\n    test-msg.hyp    - Message pages template file\n    test.rc         - Test configuration file\n    testhm          - Script to run test command lines\n    diff_hypermail_archives.pl - Script to show diffs between two archives\n\nTo test hypermail:\n\n    - Copy a mailbox you have to a local file named \"testmail\"\n\n    - Edit the test-footer.hyp, test-index.hyp and test-msg.hyp\n      template configuration files as appropritate for you needs.\n \n    - Edit the test.rc and assure it is configured as you wish.\n\n    - Verify that testhm is running the proper command line for\n      the testing you are doing.\n          \n    - Type \"testhm\"\n\nThis will generate an archive under a newly created \"testdir/\"\ndirectory.  Check it out with your favorite browser.\n\nWhen you are done testing, \n\n    - remove the testdir directory,\n\n    - remove the testmail file.\n\n\n"
  },
  {
    "path": "tests/diff_hypermail_archives.pl",
    "content": "#!/usr/bin/perl\n\n# diff_hypermail_archives\n#\n# Compare two directories with archives produced by Hypermail.\n# Intended primarily to test changes to Hypermail.\n#\n# Originally written by Peter McCluskey (pcm@rahul.net).\n# Rewritten and extended by Jose Kahan (jose.kahan@w3.org).\n#\n# TODO: If more portability is needed, try switch the sytem\n# diff and grep to File::Compare\n# https://perldoc.perl.org/File/Compare.html\n\nuse strict;\nuse warnings;\n\nuse File::Find;\nuse FindBin '$Script';\nuse Cwd qw( abs_path );\n\nuse Getopt::Std;\n\n##\n## configurable options\n##\n\n# path to diff command\nour $diff_cmd = \"/usr/bin/diff\";\n# path to grep command\nour $grep_cmd= \"/bin/grep\";\n\n##\n## End of configurable options\n##\n\n##\n## Global variables\n##\n\n# don't print progress messages\nour $quiet;\n# print a \".\" for each processed file\nour $show_progress;\n# enable to print extra messages\nour $debug;\n# ignore all content below the footer trailer\nour $ignore_footer;\n# hash with filenames|dirnames that must be ignored\nour @ignore_files_regex;\n# hash with text that must be ignored in the diff output\nour @ignore_text_regex;\n# thw two dirs that need to be compared\nour $dir1;\nour $dir2;\n# global difference counter (we consider them errors)\nour $errors = 0;\n# attachmed dir prefix, hard-coded into hypermail\nour $attachment_dir_prefix = \"att-\";\n# archive generated by hypermail generated text blurb\nour $hmail_generated_by_text = q(This archive was generated by <a.*hypermail-project.org/\");\n# footer trailer generated by hypermail\nour $footer_trailer = q(<!-- trailer=\"footer\" -->);\n\n# returns the line number of the footer or of the generated_by hypermail\n# blurb if found\nsub get_hypermail_generated_by_lines {\n    my $filename = shift;\n    my $counter = 0;\n    my $expected_counter = ($ignore_footer) ? 1 : 2;\n    my %generated_by_lines;\n    \n    my $needle = $ignore_footer ? $footer_trailer : $hmail_generated_by_text;\n    my @grep_args = ($grep_cmd, $ignore_footer ? \"-A0\" : \"-A1\", \"-n\", $needle, $filename);\n    \n    open (my $fh, \"-|\", @grep_args) || die(\"cannot @grep_args\\n\");\n    \n    while (my $line = <$fh>) {\n\tif ($line =~ m/^\\d+-?:\\ ?/) {\n\t    my $line_nb = (split /:/, $line)[0];\n\t    $line_nb =~ s/-$//;\n\t    $generated_by_lines{$line_nb} = 1;\n\t    $counter++;\n\t}\n    }\n    close ($fh);\n\n    return ($counter == $expected_counter) ? \\%generated_by_lines : {};\n    \n} # get_hypermail_generated_by_lines\n\n# checks if the filenames exist in both directories and the type\nsub compare_filenames {\n    my ($filename1, $filename2) = @_;\n    my $res = 0;\n    \n    if (!-e $filename2) {\n\t$errors++;\n\t$res = -1;\n\tprint \"\\n\" if $show_progress;\n\tprint \"[$errors] $filename2 does not exist\\n\" unless $quiet;\n\t\n    } elsif (-d $filename1) {\n\tif (!-d $filename2) {\n\t    print \"\\n\" if $show_progress;\n\t    print \"[$errors] $filename2 is not a directory\\n\" unless $quiet;\n\t    $errors++;\n\t}\n\t$res = -1;\n    }\n\n    return $res;\n    \n} # compare_filenames\n\n# filter out files we're not interested in\nsub filter_filenames {\n    my $filename = shift;\n    my $res = 0;\n    \n    foreach my $regex (@ignore_files_regex) {\n\tif ($filename =~ m/$regex/) {\n\t    $res = 1;\n\t    print \"$filename is ignored per regex: \" . $regex . \"\\n\" if $debug && !$quiet;\n\t    last;\n\t}\n    }\n\n    return $res;\n    \n} # filter_filenames\n\n# filter out text lines we're not interested in\n# returns true if both strings match the same regex\nsub filter_regex {\n    my ($text1, $text2) = @_;\n    my $res = 0;\n\n    foreach my $regex (@ignore_text_regex) {\n\tif ($text1 =~ m/$regex/ && $text2 =~ m/$regex/) {\n\t    $res = 1;\n\t    print \"$text1 is ignored per regex: \" . $regex . \"\\n\" if $debug && !$quiet;\n\t    last;\n\t}\n    }\n    \n    return $res;\n    \n} # filter_regex\n\nsub store_diffs {\n\n    my ($header, $diff_file1, $diff_file2) = @_;\n    my $diff = \"\";\n    \n    # also compare files and regex text, add + 1 to error if added\n    # do the same at the end of the while if not yet done\n    if (defined $header && $header ne \"\") {\n\n\t$diff = $diff . $header . \"\\n\";\n\tif (defined $diff_file1 && $diff_file1  ne \"\") {\n\t    $diff = $diff . $diff_file1;\n\t}\n\tif (defined $diff_file2  && $diff_file2 ne \"\") {\n\t    $diff = $diff . \"---\\n\" . $diff_file2;\n\t}\n    }\n    \n    return $diff;\n    \n} # store_diffs\n\n# does a diff on existing directories, files, and file content\nsub diff_files_complete {\n    my $file = $_;\n    my $filename1 = $File::Find::name;\n    my $filename2 = $filename1;\n    $filename2 =~ s/$dir1/$dir2/;\n    my $generated_by_lines;\n    my $footer_line;\n    my $diffs = \"\";\n    my $local_errors = 0;\n    \n    print \".\" if $show_progress;\n\n    if (filter_filenames ($filename1)\n\t|| compare_filenames ($filename1, $filename2)) {\n\treturn;\n    }\n\n    my $is_attachment_dir =  $filename1 =~ m#/$attachment_dir_prefix#;\n    \n    if (!$is_attachment_dir) {\n\tif ($filename1 =~ m/\\.html$/) {\n\t    $generated_by_lines = get_hypermail_generated_by_lines ($filename1);\n\t    if ($ignore_footer) {\n\t\t$footer_line = (keys %{ $generated_by_lines } )[0];\n\t    }\n\t}\n    }\n\n    print \"comparing $filename1\\n\" if $debug;\n    \n    my @diff_args = ($diff_cmd, $filename1, $filename2);\n    open (my $fh, \"-|\", @diff_args) || die(\"cannot diff $filename1 $filename2\\n\");\n    \n    my $header;\n    my $diff_file1;\n    my $diff_file2;\n    my $skip = 1;\n    my $filter_diff_content = 0;\n\t\n    while (my $line = <$fh>) {\n\tchomp $line;\n\t\n\tif ($line eq \"\") {\n\t    next;\n\t}\n\n\t# for hypermail generated messages and indexes, if the diff\n\t# finds the the generated_by blurb, we assume that the only\n\t# things that changed are the version number and/or the\n\t# generation date. We ignore the rest of the diff output at\n\t# this point.\n\tif ($line =~ /^\\d/) {\n\n\t    # store previous diff.\n\t    # also compare files and regex text, add + 1 to error if added\n\t    # do the same at the end of the while if not yet done\n\n\t    if (!$skip) {\n\t\tif (!$filter_diff_content || !filter_regex ($diff_file1, $diff_file2)) {\n\t\t    $diffs .= store_diffs ($header, $diff_file1, $diff_file2);\n\t\t    $local_errors++;\n\t\t}\n\t    }\n\t    \n\t    $skip = $filter_diff_content = 0;\n\t    $header = $line;\n\t    $diff_file1 = $diff_file2 = \"\";\n\t    \n\t    if ($line =~ /\\d+c\\d+/) {\n\t\tif (!$is_attachment_dir) {\n\t\t    my ($ln_1, $ln_2) = split /c/, $line;\n\t\t    \n\t\t    # if we have diffs in a series of sequential lines\n\t\t    my ($ln_1_1, $ln_1_2) = split /,/, $ln_1;\n\t\t    my ($ln_2_1, $ln_2_2) = split /,/, $ln_2;\n\t\t    \n\t\t    if (defined $generated_by_lines && %{ $generated_by_lines }\n\t\t\t&& (defined $ln_1_2 && defined $ln_2_2 \n\t\t\t    && ($ln_1_2 - $ln_1_1) == ($ln_2_2 - $ln_2_1))\n\t\t\t|| (defined $ln_1_1 && !defined $ln_1_2\n\t\t\t    && defined $ln_2_1 && !defined $ln_2_2)) {\n\n\t\t\tif ($ignore_footer\n\t\t\t    && ($ln_1_1 >= $footer_line)) {\n\t\t\t    $skip = 1;\n\t\t\t    last;\n\t\t\t    \n\t\t\t} elsif ((!defined $ln_1_2 \n\t\t\t\t  && $$generated_by_lines{$ln_1_1})\n\t\t\t\t || (defined $ln_1_2 \n\t\t\t\t     && $$generated_by_lines{$ln_1_1}\n\t\t\t\t     && $$generated_by_lines{$ln_1_2})) {\n\t\t\t    $skip = 1;\n\t\t\t    last;\n\t\t\t    \n\t\t\t} else {\n\t\t\t    $filter_diff_content = 1;\n\t\t\t}\n\t\t\t\n\t\t    }\n\t\t}\n\t    }\n\n\t} else {\n\t    if ($line =~ /^</) {\n\t\t$diff_file1 = $line . \"\\n\";\n\t    } elsif ($line =~ /^>/) {\n\t\t$diff_file2 = $line . \"\\n\";\n\t    }\n\t}\n    }\n\n    close ($fh);\n    \n    # store last diff.\n    if (!$skip) {\n\tif (!$filter_diff_content || !filter_regex ($diff_file1, $diff_file2)) {\n\t    $diffs .= store_diffs ($header, $diff_file1, $diff_file2);\n\t    $local_errors++;\n\t}\n    }\n\n    if ($local_errors > 0 && !$quiet) {\n\t$errors++;\n\tprint \"\\n\" if $show_progress;\n\tprint \"[$errors] $filename1\\n[$errors] $filename2: found $local_errors difference\" . ($local_errors == 1 ? \"\" : \"s\") . \"\\n\";\n\tprint \"$diffs\\n\";\n    }\n    \n} # diff_files_complete\n\n# only does a diff to see if the same directories and files exist.\n# Ignores content differences.\nsub diff_files_dir {\n    my $filename1 = $File::Find::name;\n    my $filename2 = $filename1;\n    $filename2 =~ s/$dir1/$dir2/;\n\n    print \".\" if $show_progress;\n\n    if (!filter_filenames ($filename1)) {\n\tcompare_filenames ($filename1, $filename2);\n    }\n\n    return;\n    \n} # diff_files_dir\n\nsub process_options {\n    my %options=();\n\n    getopts(\"qhfpdi:r:\", \\%options);\n\n    $dir1 = $ARGV[0];\n    $dir2 = $ARGV[1];\n\n    if (defined $options{d}) {\n\t$debug = 1;\n    }\n    if (defined $options{q}) {\n\t$quiet = 1;\n    }\n\n    if (defined $options{p} && !$quiet && !$debug) {\n\t$show_progress = 1;\n    }\n\n    if (defined $options{f}) {\n\t$ignore_footer = 1;\n    }\n    \n    if (defined $options{h} || !defined $dir1 || !defined $dir2) {\n\tdie (\"\\nUsage: $Script [-q -h -i foo:bar] dir1 dir2\\n\"\n\t     . \"\\t-q quiet mode\\n\"\n\t     . \"\\t-p show processing progress\\n\"\n\t     . \"\\t-h help prints this message\\n\"\n\t     . \"\\t-f ignore all content below the footer trailer comment\\n\"\n\t     . \"\\t-i list of colon separated regex corresponding to directories/filenames to ignore\\n\"\n\t     . \"\\t-r list of colon separated regex corresponding to text that should be ignored in diff reports\\n\"\n\t     . \"\\tdir1, dir2 paths to the two directories to compare\\n\\n\");\n    }\n    \n    # remove trailing / if given\n    $dir1 = abs_path ($dir1);\n    $dir2 = abs_path ($dir2);\n\n    if (!defined $dir1 || !-d $dir1) {\n\tdie (\"$ARGV[0] is not a directory\\n\");\n    }\n\n    if (!defined $dir2 || !-d $dir2) {\n\tdie (\"$ARGV[1] is not a directory\\n\");\n    }    \n\n    if (defined $options{i}) {\n\t@ignore_files_regex = split (/:/, $options{i});\n    }\n\n    if (defined $options{r}) {\n\t@ignore_text_regex = split (/:/, $options{r});\n    }\n\n} # process_options\n\n# main\n{\n    # read command-line options\n    process_options();\n    \n    my %find_options = ('follow'     => 1,\n\t\t\t'wanted'     => \\&diff_files_complete,\n\t);\n\n    print \"\\n\" unless $quiet;\n    print \"comparing $dir1 against $dir2\\n\" unless $quiet;\n    print \"\\n\" if $debug && !$quiet;\n    \n    find(\\%find_options, $dir1);\n\n    # do the opposite diff too, to make sure we are not generating new files\n    print \"\\n\\n\" if $show_progress || $debug;\n    \n    print \"comparing $dir2 filenames against $dir1\\n\" unless $quiet;\n\n    ($dir1, $dir2) = ($dir2, $dir1);\n\n    $find_options{wanted} = \\&diff_files_dir;\n    find(\\%find_options, $dir1);\n\n    print \"\\n\" if $show_progress;\n    print \"\\n\" unless $quiet;\n    \n    if ($errors) {\n\tprint \"=> $dir1 and $dir2 dirs differ: $errors file\", $errors > 1 ? \"s are\" : \" is\", \" different\\n\\n\" unless $quiet;\n    } else {\n\tprint \"=> Archives are identical\\n\\n\" unless $quiet;\n    }\n    \n    exit (($errors == 0) ? 0 : -1);\n    \n} # main\n"
  },
  {
    "path": "tests/mboxes/1msg.mbox",
    "content": "From Daniel.Stenberg@sth.frontec.se Fri Jul 24 09:06 CDT 1998\nReceived: from latour.sth.frontec.se (pc252.frontec.se [193.13.194.252])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id JAA02673\n\tfor <kent@landfield.com>; Fri, 24 Jul 1998 09:06:22 -0500 (CDT)\nReceived: from metal (metal.sth1.frontec.se [193.12.206.10])\n\tby latour.sth.frontec.se (8.8.0/8.6.6) with SMTP id QAA03785\n\tfor <kent@landfield.com>; Fri, 24 Jul 1998 16:03:20 +0200 (MET DST)\nDate: Fri, 24 Jul 1998 16:03:18 +0200 (MET DST)\nFrom: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>\nX-Sender: dast@metal\nTo: Kent Landfield <kent@landfield.com>\nSubject: hypermail *FIXED*\nMessage-ID: <Pine.SO4.4.02.9807241600050.17635-300000@metal>\nMIME-Version: 1.0\nContent-Type: MULTIPART/MIXED; BOUNDARY=\"-559023410-851401618-901288998=:17635\"\nX-Lines: 2420\nContent-Length: 146654     \nStatus: OR\n\n---559023410-851401618-901288998=:17635\nContent-Type: TEXT/PLAIN; charset=\"US-ASCII\"\nX-Sun-Content-Length: 432\n\nHi\n\nI'm sorry I caused those problems. I'm sending you the only two files I\nchanged to get your test mail archive to get processed successfully. Clearly,\nI was just lucky my first implementation worked on my examples.\n\nJust get back if there's anything more I can do before the new beta release!\n--\n             Daniel Stenberg - http://www.fts.frontec.se/~dast\n   ech`echo xiun|tr nu oc|sed 'sx\\([sx]\\)\\([xoi]\\)xo un\\2\\1 is xg'`ol\n\n---559023410-851401618-901288998=:17635\nContent-Type: TEXT/PLAIN; charset=\"US-ASCII\"; name=\"parse.c\"\nContent-Transfer-Encoding: BASE64\nContent-ID: <Pine.SO4.4.02.9807241603180.17635@metal>\nContent-Disposition: attachment; filename=\"parse.c\"\nX-Sun-Content-Length: 92053\n\nLyogDQoqKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRW50ZXJwcmlzZSBJ\nbnRlZ3JhdGlvbiBUZWNobm9sb2dpZXMgQ29ycC4NCioqICAgICAgICAgVmVy\naUZvbmUgSW5jLi9IZXdsZXR0LVBhY2thcmQuIEFsbCBSaWdodHMgUmVzZXJ2\nZWQuDQoqKiBLZXZpbiBIdWdoZXMsIGtldkBrZXZjb20uY29tIDMvMTEvOTQN\nCioqIEtlbnQgTGFuZGZpZWxkLCBrZW50QGxhbmRmaWVsZC5jb20gNC82Lzk3\nDQoqKiANCioqIFRoaXMgcHJvZ3JhbSBhbmQgbGlicmFyeSBpcyBmcmVlIHNv\nZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgDQoqKiBt\nb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgKExpYnJhcnkp\nIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgDQoqKiBhcyBwdWJsaXNoZWQgYnkg\ndGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g\nMiANCioqIG9mIHRoZSBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4g\nDQoqKiANCioqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg\naG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCANCioqIGJ1dCBXSVRIT1VU\nIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh\nbnR5IG9mIA0KKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg\nUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIA0KKiogR05VIChMaWJyYXJ5\nKSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIA0K\nKiogDQoqKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo\nZSBHTlUgKExpYnJhcnkpIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCioqIGFs\nb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG\ncmVlIFNvZnR3YXJlIA0KKiogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl\nIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBV\nU0EgDQoqLw0KDQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8\nc3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxmY250bC5oPg0KDQojaW5jbHVkZSAi\naHlwZXJtYWlsLmgiDQojaW5jbHVkZSA8Y3R5cGUuaD4NCiNpbmNsdWRlIDxl\ncnJuby5oPg0KDQojZGVmaW5lIFBBVEhfU0VQQVJBVE9SICcvJw0KDQp0eXBl\nZGVmIGVudW0gew0KICAgIEVOQ09ERV9OT1JNQUwsDQogICAgRU5DT0RFX1FQ\nLCAgICAgLyogcXVvdGVkIHByaW50YWJsZSAqLw0KDQogICAgRU5DT0RFX01V\nTFRJTElORUQsIC8qIHRoaXMgaXMgbm90IGEgcmVhbCB0eXBlLCBidXQganVz\ndCBhIHNlcGFyYXRvciBzaG93aW5nICAgICAgICAgICAgICAgICAgICAgICAg\nICB0aGF0IHRoZSB0eXBlcyBiZWxvdyBhcmUgZW5jb2RlZCBpbiBhIHdheSB0\naGF0IG1ha2VzDQogICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBsaW5l\nIGluIHRoZSBpbmRhdGEgbWF5IGJlY29tZSBvbmUgb3IgbW9yZSBsaW5lcw0K\nICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0ZGF0YSAqLw0K\nDQogICAgRU5DT0RFX0JBU0U2NCwgLyogYmFzZTY0ICovDQogICAgRU5DT0RF\nX1VVRU5DT0RFLCAvKiB3ZWxsLCBpdCBzZWVtcyB0aGVyZSBleGlzdCBzb21l\nIGtpbmQgb2Ygc2VtaS1zdGFuZGFyZA0KICAgICAgICAgICAgICAgICAgICAg\nICAgZm9yIHV1LWVuY29kZWQgYXR0YWNobWVudHMuICovDQogDQogICAgRU5D\nT0RFX1VOS05PV04gLyogbXVzdCBiZSB0aGUgbGFzdCBvbmUgKi8NCn0gRW5j\nb2RlVHlwZTsNCg0KdHlwZWRlZiBlbnVtIHsNCiAgICBDT05URU5UX1RFWFQs\nICAgLyogbm9ybWFsIG1haWxzIGFyZSB0ZXh0IGJhc2VkIGRlZmF1bHQgKi8N\nCiAgICBDT05URU5UX0JJTkFSWSwgLyogdGhpcyBraW5kIHdlIHN0b3JlIHNl\ncGFyYXRlbHkgYW5kIGhyZWYgdG8gKi8NCiAgICBDT05URU5UX0hUTUwsICAg\nLyogdGhpcyBpcyBodG1sIGZvcm1hdGVkIHRleHQgKi8NCiAgICBDT05URU5U\nX0lHTk9SRSwgLyogZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGNvbnRlbnQgKi8N\nCg0KICAgIENPTlRFTlRfVU5LTk9XTiAvKiBtdXN0IGJlIHRoZSBsYXN0IG9u\nZSAqLw0KfSBDb250ZW50VHlwZTsNCg0KDQppbnQgaWdub3JlY29udGVudChj\naGFyICp0eXBlKQ0Kew0KICAgcmV0dXJuIChpbmxpc3QoaWdub3JlX3R5cGVz\nLCB0eXBlKSk7DQp9DQoNCmludCBpbmxpbmVjb250ZW50KGNoYXIgKnR5cGUp\nDQp7DQogICByZXR1cm4gKGlubGlzdChpbmxpbmVfdHlwZXMsIHR5cGUpKTsN\nCn0NCg0KaW50IHByZWZlcmVkY29udGVudChjaGFyICp0eXBlKQ0Kew0KICAv\nKiBXZSBsZXQgcGxhaW4gdGV4dCByZW1haW4gUFJFRkVSRUQgYXQgYWxsIHRp\nbWVzICovDQogIGlmKCFzdHJjYXNlY21wKCJ0ZXh0L3BsYWluIiwgdHlwZSkp\nDQogICAgcmV0dXJuOw0KDQogIGlmKHByZWZlcmVkX3R5cGVzKSB7DQogICAg\ncmV0dXJuIChpbmxpc3QocHJlZmVyZWRfdHlwZXMsIHR5cGUpKTsNCiAgfQ0K\nICByZXR1cm4gMDsNCn0NCg0KY2hhciAqdG1wbmFtZShjaGFyICpkaXIsIGNo\nYXIgKnBmeCkNCnsNCiAgICBpbnQgc3ZlcnJubzsNCiAgICBjaGFyICpmLCAq\nbmFtZTsNCiAgICBzdGF0aWMgY250ciA9IDA7DQoNCiAgICBjaGFyICpta3Rl\nbXAoY2hhciAqdGVtcGxhdGUpOw0KDQogICAgaWYgKChuYW1lID0gbWFsbG9j\nKE1BWExJTkUpKSA9PSBOVUxMKQ0KICAgICAgICAgIHJldHVybihOVUxMKTsN\nCg0KICAgIHNwcmludGYobmFtZSwgIiVzLyVzJWRYWFhYWFgiLCBkaXIsIHBm\neCwgY250cisrKTsNCg0KICAgIGlmICgoZiA9IG1rdGVtcChuYW1lKSkgIT0g\nTlVMTCkNCiAgICAgICAgcmV0dXJuKGYpOw0KDQogICAgc3ZlcnJubyA9IGVy\ncm5vOw0KICAgIGZyZWUobmFtZSk7DQogICAgZXJybm8gPSBzdmVycm5vOw0K\nICAgIHJldHVybihOVUxMKTsNCn0NCg0KLyoNCioqIENyb3NzLWluZGV4ZXMg\nLSBhZGRzIHRvIGEgbGlzdCBvZiByZXBsaWVzLiBJZiBhIG1lc3NhZ2UgaXMg\nYSByZXBseSB0bw0KKiogYW5vdGhlciwgdGhlIG51bWJlciBvZiB0aGUgbWVz\nc2dlIGl0J3MgcmVwbHlpbmcgdG8gaXMgYWRkZWQgdG8gdGhlIGxpc3QuDQoq\nKiBUaGlzIGxpc3QgaXMgc2VhcmNoZWQgdXBvbiBwcmludGluZy4NCiovDQoN\nCnZvaWQgY3Jvc3NpbmRleCgpDQp7DQogICAgaW50IG51bSwgc3RhdHVzLCBt\nYXliZXJlcGx5Ow0KICAgIGNoYXIgbmFtZVtOQU1FU1RSTEVOXSwgc3ViamVj\ndFtTVUJKU1RSTEVOXSwgZW1haWxbTUFJTFNUUkxFTl0sDQogICAgICAgIGlu\ncmVwbHlbUkVQWVNUUkxFTl0sIGRhdGVbREFURVNUUkxFTl0sIGZyb21kYXRl\nW0RBVEVTVFJMRU5dLA0KICAgICAgICBtc2dpZFtNU0dEU1RSTEVOXTsNCg0K\nICAgIG51bSA9IDA7DQogICAgcmVwbHlsaXN0ID0gTlVMTDsNCg0KICAgIHdo\naWxlIChoYXNobnVtbG9va3VwKG51bSxuYW1lLGVtYWlsLHN1YmplY3QsaW5y\nZXBseSxkYXRlLGZyb21kYXRlLG1zZ2lkKSAhPSBOVUxMKSB7DQogICAgICAg\nIGlmIChpbnJlcGx5WzBdICE9ICdcMCcpIHsNCiAgICAgICAgICAgIHN0YXR1\ncyA9IGhhc2hyZXBseW51bWxvb2t1cChpbnJlcGx5LCAmbWF5YmVyZXBseSk7\nDQogICAgICAgICAgICBpZiAoc3RhdHVzICE9IC0xKQ0KICAgICAgICAgICAg\nICAgIHJlcGx5bGlzdCA9IChzdHJ1Y3QgcmVwbHkgKikNCiAgICAgICAgICAg\nICAgICBhZGRyZXBseShyZXBseWxpc3Qsc3RhdHVzLG51bSxuYW1lLHN1Ympl\nY3QsbWF5YmVyZXBseSk7DQogICAgICAgIH0NCiAgICAgICAgbnVtKys7DQog\nICAgfQ0KfQ0KDQovKiANCioqIFJlY3Vyc2l2ZWx5IGNoZWNrcyBmb3IgcmVw\nbGllcyB0byByZXBsaWVzIHRvIGEgbWVzc2FnZSwgZXRjLg0KKiogUmVwbGll\ncyBhcmUgYWRkZWQgdG8gdGhlIHRocmVhZCBsaXN0Lg0KKi8NCg0Kdm9pZCBj\ncm9zc2luZGV4dGhyZWFkMihpbnQgbnVtKQ0Kew0KICAgIHN0cnVjdCByZXBs\neSAqcnA7DQoNCiAgICBmb3IgKHJwID0gcmVwbHlsaXN0OyBycCAhPSBOVUxM\nOyBycCA9IHJwLT5uZXh0KSB7DQogICAgICAgIGlmIChycC0+bXNnbnVtID09\nIG51bSkgew0KICAgICAgICAgICAgdGhyZWFkbGlzdCA9IChzdHJ1Y3QgcmVw\nbHkgKilhZGRyZXBseSh0aHJlYWRsaXN0LCBycC0+ZnJvbW1zZ251bSwgDQog\nICAgICAgICAgICAgICAgICAgICAgICAgICBudW0sIHJwLT5uYW1lLCBycC0+\nc3ViamVjdCwgMCk7DQogICAgICAgICAgICBwcmludGVkbGlzdCA9IChzdHJ1\nY3QgcHJpbnRlZCAqKQ0KICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Fz\ncHJpbnRlZChwcmludGVkdGhyZWFkbGlzdCwgcnAtPmZyb21tc2dudW0pOw0K\nICAgICAgICAgICAgY3Jvc3NpbmRleHRocmVhZDIocnAtPmZyb21tc2dudW0p\nOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8qDQoqKiBGaXJzdCwgcHJp\nbnQgb3V0IHRoZSB0aHJlYWRzIGluIG9yZGVyIGJ5IGRhdGUuLi4NCioqIEVh\nY2ggbWVzc2FnZSBudW1iZXIgaXMgYXBwZW5kZWQgdG8gYSB0aHJlYWQgbGlz\ndC4gVGhyZWFkcyBhbmQgaW5kaXZpZHVhbA0KKiogbWVzc2FnZXMgYXJlIHNl\ncGFyYXRlZCBieSBhIC0xLg0KKi8NCg0Kdm9pZCBjcm9zc2luZGV4dGhyZWFk\nMShzdHJ1Y3QgaGVhZGVyICpocCkNCnsNCiAgICBpbnQgaGFzcmVwbHk7DQog\nICAgc3RydWN0IHJlcGx5ICpycDsNCg0KICAgIGlmIChocCAhPSBOVUxMKSB7\nDQogICAgICAgIGNyb3NzaW5kZXh0aHJlYWQxKGhwLT5sZWZ0KTsNCg0KICAg\nICAgICBmb3IgKGhhc3JlcGx5ID0gMCwgcnAgPSByZXBseWxpc3Q7IHJwICE9\nIE5VTEw7IHJwID0gcnAtPm5leHQpIHsNCiAgICAgICAgICAgICBpZiAocnAt\nPmZyb21tc2dudW0gPT0gaHAtPm1zZ251bSkgew0KICAgICAgICAgICAgICAg\nICBoYXNyZXBseSA9IDE7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAg\nICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghaGFzcmVw\nbHkgJiYgIXdhc3ByaW50ZWQocHJpbnRlZHRocmVhZGxpc3QsIGhwLT5tc2du\ndW0pKSB7DQogICAgICAgICAgICB0aHJlYWRsaXN0ID0gKHN0cnVjdCByZXBs\neSAqKQ0KICAgICAgICAgICAgICBhZGRyZXBseSh0aHJlYWRsaXN0LGhwLT5t\nc2dudW0saHAtPm1zZ251bSxocC0+bmFtZSxocC0+c3ViamVjdCwwKTsNCiAg\nICAgICAgICAgIGNyb3NzaW5kZXh0aHJlYWQyKGhwLT5tc2dudW0pOw0KICAg\nICAgICAgICAgICB0aHJlYWRsaXN0ID0gKHN0cnVjdCByZXBseSAqKWFkZHJl\ncGx5KHRocmVhZGxpc3QsLTEsLTEsIiAiLCIgIiwwKTsNCiAgICAgICAgfQ0K\nDQogICAgICAgIGNyb3NzaW5kZXh0aHJlYWQxKGhwLT5yaWdodCk7DQogICAg\nfQ0KfQ0KDQovKg0KKiogR3JhYnMgdGhlIGRhdGUgc3RyaW5nIGZyb20gYSBE\nYXRlOiBoZWFkZXIuDQoqLw0KDQpjaGFyICpnZXRtYWlsZGF0ZShjaGFyICps\naW5lKQ0Kew0KICAgIGludCBpOw0KICAgIGludCBsZW47DQogICAgY2hhciAq\nYzsNCiAgICBzdGF0aWMgY2hhciBkYXRlW0RBVEVTVFJMRU5dOw0KDQogICAg\nYyA9IChjaGFyICopIHN0cmNocihsaW5lLCAnOicpOw0KICAgIGlmICgoKihj\nICsgMSkgJiYgKihjICsgMSkgPT0gJ1xuJykgfHwgKCooYyArIDIpICYmICoo\nYyArIDIpID09ICdcbicpKSB7DQogICAgICAgIHN0cmNweShkYXRlLCBOT0RB\nVEUpOw0KICAgICAgICByZXR1cm4gZGF0ZTsNCiAgICB9DQogICAgYyArPSAy\nOw0KICAgIHdoaWxlICgqYyA9PSAnICcgfHwgKmMgPT0gJ1x0JykNCiAgICAg\nICAgYysrOw0KICAgIGZvciAoaSA9IDAsIGxlbiA9IERBVEVTVFJMRU4tMTsg\nKmMgJiYgKmMgIT0gJ1xuJyAmJiBpIDwgbGVuOyBjKyspDQogICAgICAgIGRh\ndGVbaSsrXSA9ICpjOw0KICAgIGRhdGVbaV0gPSAnXDAnOw0KDQogICAgcmV0\ndXJuIGRhdGU7DQp9DQoNCi8qDQoqKiBHcmFicyB0aGUgZGF0ZSBzdHJpbmcg\nZnJvbSBhIEZyb20gYXJ0aWNsZSBzZXBhcmF0b3IuDQoqLw0KDQpjaGFyICpn\nZXRmcm9tZGF0ZShjaGFyICpsaW5lKQ0Kew0KICAgIHN0YXRpYyBjaGFyIHRt\ncGRhdGVbREFURVNUUkxFTl07DQogICAgaW50IGk7DQogICAgaW50IGxlbjsN\nCiAgICBjaGFyICpjID0gTlVMTDsNCg0KICAgIGZvciAoaSA9IDA7IGRheXNb\naV0gIT0gTlVMTCAmJiANCiAgICAgICAgKChjID0gKGNoYXIgKikgc3Ryc3Ry\nKGxpbmUsIGRheXNbaV0pKSA9PSBOVUxMKTsgaSsrKQ0KICAgICAgICA7DQog\nICAgaWYgKGRheXNbaV0gPT0gTlVMTCkNCiAgICAgICAgdG1wZGF0ZVswXSA9\nICdcMCc7DQogICAgZWxzZSB7DQogICAgICAgIGZvciAoaSA9IDAsIGxlbiA9\nIERBVEVTVFJMRU4tMTsgKmMgJiYgKmMgIT0gJ1xuJyAmJiBpIDwgbGVuOyBj\nKyspDQogICAgICAgICAgICAgdG1wZGF0ZVtpKytdID0gKmM7DQoNCiAgICAg\nICAgdG1wZGF0ZVtpXSA9ICdcMCc7DQoNCiAgICAgICAgaWYgKHRtcGRhdGVb\nMTZdICE9ICc6Jykgew0KICAgICAgICAgICAgICAgIHRtcGRhdGVbMTZdID0g\nJzonOw0KICAgICAgICAgICAgICAgIHRtcGRhdGVbMTddID0gJzAnOw0KICAg\nICAgICAgICAgICAgIHRtcGRhdGVbMThdID0gJzAnOw0KICAgICAgICAgICAg\nICAgIHRtcGRhdGVbMTldID0gJyAnOw0KICAgICAgICAgICAgICAgIHRtcGRh\ndGVbMjBdID0gdGhpc3llYXJbMF07DQogICAgICAgICAgICAgICAgdG1wZGF0\nZVsyMV0gPSB0aGlzeWVhclsxXTsNCiAgICAgICAgICAgICAgICB0bXBkYXRl\nWzIyXSA9IHRoaXN5ZWFyWzJdOw0KICAgICAgICAgICAgICAgIHRtcGRhdGVb\nMjNdID0gdGhpc3llYXJbM107DQogICAgICAgICAgICAgICAgdG1wZGF0ZVsy\nNF0gPSAnXDAnOw0KICAgICAgICB9DQogICAgICAgIHNwcmludGYodG1wZGF0\nZSwgIiVzICVzIiwgdG1wZGF0ZSwgdGltZXpvbmVzdHIpOw0KICAgICAgICBy\nZXR1cm4gdG1wZGF0ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gdG1wZGF0ZTsN\nCn0NCg0KDQovKg0KKiogR3JhYnMgdGhlIG5hbWUgYW5kIGVtYWlsIGFkZHJl\nc3MgZnJvbSBhIEZyb206IGhlYWRlci4NCioqIFRoaXMgY291bGQgZ2V0IHRy\naWNreTsgSSd2ZSB0cmllZCB0byBrZWVwIGl0IHNpbXBsZS4NCioqIFNob3Vs\nZCBiZSBhYmxlIHRvIGhhbmRsZSBhbGwgdGhlIGFkZHJlc3NlcyBiZWxvdzoN\nCioqDQoqKiAgIEZyb206IHVzZXIgICAgICAgICAgICAgICAgICAgW25vIEBd\nDQoqKiAgIEZyb206IGtlbnQgKEtlbnQgTGFuZGZpZWxkKSAgW25vIEAgLSB3\naXRoIGNvbW1lbnRdDQoqKiAgIEZyb206IDx1c2VyQG5vZGUuZG9tYWluPiAg\nICAgW25vIHRleHQgbmFtZSwgdXNlIGVtYWlsIGFzIHRleHQgbmFtZV0NCioq\nICAgRnJvbTogS2VudCBMYW5kZmllbGQgPGtlbnQ+ICBbdGV4dCBuYW1lIGJ1\ndCBubyBAXQ0KKiogICBGcm9tOiAoa2VudCkgICAgICAgICAgICAgICAgIFtj\nb21tZW50IC0gbm8gZW1haWwgYWRkcmVzc10NCioqICAgRnJvbTogIiIgPGtl\nbnQ+ICAgICAgICAgICAgICBbZW1haWwgYWRkcmVzcyBidXQgbnVsbCBjb21t\nZW50XQ0KKiogICBGcm9tOiAgICAgICAgICAgICAgICAgICAgICAgIFtibGFu\nayBGcm9tOiBsaW5lXQ0KKiogICBGcm9tOiB1dS5uZXQha2VudCAgICAgICAg\nICAgIFt1dWNwIGFkZHJlc3NlcyAtIG5vIGNvbW1lbnRdDQoqKiAgIEZyb206\nIHV1Lm5ldCFrZW50IChrZW50KSAgICAgW3V1Y3AgYWRkcmVzc2VzIC0gd2l0\naCBjb21tZW50XQ0KKiogICBGcm9tOiAiKEpvZSBCbG9nZ3MpIiA8am9lQGFu\nb3JnLmNvbT4gDQoqKiAgIEZyb206ICJSb3kgVC4gRmllbGRpbmciIDxmaWVs\nZGluZ0BraXdpLmljcy51Y2kuZWR1Pg0KKiogICBGcm9tOiBrZW50QGxvY2Fs\naG9zdA0KKiogICBGcm9tOiBrZW50QHV1Lm5ldCAoS2VudCBMYW5kZmllbGQp\nDQoqKiAgIEZyb206IChHZW9yZ2UgQnVyZ3lhbikgPGdidXJneWFuQGN5YmVy\nY29uLmNvbT4NCioqICAgRnJvbTogPGdidXJneWFuQGN5YmVyY29uLmNvbT4g\nKEdlb3JnZSBCdXJneWFuKSANCioqICAgRnJvbTogICAgICAgICAgICAgIEtl\nbnQgQi4gTGFuZGZpZWxkIDxrZW50QGxhbmRmaWVsZC5jb20+DQoqKiAgIEZy\nb206ICAgICAgSU4lImZla2V0ZStyZXBseUBjMi5uZXQiIDI2LUpBTi0xOTk3\nIDEzOjI4OjU1LjM2DQoqKiAgIEZyb206ICAgICAgSU4lInZpY3JpY0BwYW5p\neC5jb20iICAiVmlja2kgUmljaG1hbiIgMTMtQVVHLTE5OTYgMTA6NTQ6MzMu\nMzgNCioqICAgRnJvbTogICAgICBVUzJSTUM6OiJsd3YyNkBjYXMub3JnIiAi\nTGFycnkgVy4gVmlyZGVuLCB4MjQ4NyIgMjItT0NULTE5OTQgMDk6NDQ6MjEu\nNDQNCioqICAgRnJvbTogICAgICAgICAgTWFpbCBEZWxpdmVyeSBTdWJzeXN0\nZW0gPHBvc3RtYXN0ZXJAaWdjLmFwYy5vcmc+DQoqKiAgIEZyb206ICAgICAg\nICAgIFNlbGYgPGVoYXNicm91Y2s+DQoqKiAgIEZyb206ICAgICAgICAgYWRh\nbUBlZGVuLmFwYW5hLm9yZy5hdSAoQWRhbSBGcmV5KQ0KKiogICBGcm9tOiAg\nICAgICAgZmFxc2VydkBwZW5ndWluLWx1c3QubWl0LmVkdQ0KKiogICBGcm9t\nOiAgICBuYzA1NDhAZnJlZWJzZC5uZXRjb20uY29tIChNYXJrIEhpdHRpbmdl\ncikNCioqICAgRnJvbTogIi0gUGFtIEdyZWVuZSwgb25lIG9mIHRoZSAqLmFu\nc3dlcnMgbW9kZXJhdG9ycyIgPHBncmVlbmVATUlULkVEVT4NCioqICAgRnJv\nbTogIkZlbGFuIHNoZW5hIFRob3JvbidlZHJhcyIgPGZlbGFuQG5ldGNvbS5j\nb20+DQoqKiAgIEZyb206IERhdmlkIE11aXIgU2hhcm5vZmYgPG11aXJAaWRp\nb20uY29tPg0KKiogICBGcm9tOiBBLkouRG9oZXJ0eUByZWFkaW5nLmFjLnVr\nIChBbmR5IERvaGVydHkpDQoqKiAgIEZyb206IEpvcmRhbiBIdWJiYXJkICAg\nICAgICAgICAgICAgICAgICAgICAgPGpraEB2ZWN0b3IuZWlrb24uZS10ZWNo\nbmlrLnR1LW11ZW5jaGVuLmRlPg0KKiogICBGcm9tOiBaWFBBTiVTTEFDVk0u\nQklUTkVUQE1JVFZNQS5NSVQuRURVDQoqKiAgIEZyb206IGFmcyFwaXohYWxm\nQHV1NS5wc2kuY29tIChBbGYgdGhlIFBvZXQpDQoqKiAgIEZyb206IGFuc3dl\ncnNAY3AudG4udHVkZWxmdC5ubCAoIk1vZGVyYXRvciAqLmFuc3dlcnMiKQ0K\nKiogICBGcm9tOiBtZHclbWVyZW5ndWVAbWVyZW5ndWUub2l0LnVuYy5lZHUg\nKE1hdHQgV2Vsc2gpDQoqKiAgIEZyb206IGJnb2ZmZUB3aGFsZS5zdC51c20u\nZWR1IChXaWxsaWFtIEwuIEdvZmZlKQ0KKi8NCg0Kdm9pZCBnZXRuYW1lKGNo\nYXIgKmxpbmUsIGNoYXIgKm5hbWUsIGNoYXIgKmVtYWlsKQ0Kew0KICAgIGlu\ndCBpOw0KICAgIGludCBsZW47DQogICAgY2hhciAqYzsNCg0KICAgIGxlbiA9\nIE1BSUxTVFJMRU4tMTsNCg0KICAgIC8qDQogICAgKiogWmVyb291dCBkYXRh\nLg0KICAgICovDQogICAgemVyb19vdXQoZW1haWwsIE1BSUxTVFJMRU4pOw0K\nICAgIHplcm9fb3V0KG5hbWUsIE5BTUVTVFJMRU4pOw0KDQogICAgLyogRU1h\naWwgUHJvY2Vzc2luZyBGaXJzdDoNCiAgICAqKiBGaXJzdCwgaXMgdGhlcmUg\nYW4gJ0AnIHNpZ24gd2UgY2FuIHVzZSBhcyBhbiBhbmNob3IgPw0KICAgICov\nDQogICAgaWYgKChjID0gKGNoYXIgKikgc3RyY2hyKGxpbmUsICdAJykpID09\nIE5VTEwpIHsNCiAgICAgICAgLyogDQogICAgICAgICoqIE5vICdAJyBzaWdu\nIGhlcmUgc28gLi4uDQogICAgICAgICovDQogICAgICAgIGlmIChzdHJjaHIo\nbGluZSwgJygnKSkgeyAgICAgICAvKiBGcm9tOiBib2IgKFRoZSBCaWcgR3V5\nKSAqLw0KICAgICAgICAgICAgYyA9IChjaGFyICopIHN0cmNocihsaW5lLCAn\nOicpICsgMTsNCiAgICAgICAgICAgIHdoaWxlICgqYyA9PSAnICcgfHwgKmMg\nPT0gJ1x0JykNCiAgICAgICAgICAgICAgICBjKys7DQogICAgICAgICAgICBm\nb3IgKGkgPSAwOyAqYyAmJiAqYyAhPSAnKCcgJiYgKmMgIT0gJyAnICYmIA0K\nICAgICAgICAgICAgICAgICAqYyAhPSAnXHQnICYmICpjICE9ICdcbicgJiYg\naSA8IGxlbjsgYysrKQ0KICAgICAgICAgICAgICAgIGVtYWlsW2krK10gPSAq\nYzsNCiAgICAgICAgICAgIGVtYWlsW2ldID0gJ1wwJzsNCiAgICAgICAgfQ0K\nICAgICAgICBlbHNlIGlmICgoYyA9IChjaGFyICopIHN0cmNocihsaW5lLCAn\nPCcpKSkgeyAgLyogRnJvbTogPGtlbnQ+ICovDQogICAgICAgICAgICBjKys7\nDQogICAgICAgICAgICBmb3IgKGkgPSAwOyAqYyAmJiAqYyAhPSAnPicgJiYg\nKmMgIT0gJyAnICYmIA0KICAgICAgICAgICAgICAgICAqYyAhPSAnXHQnICYm\nICpjICE9ICdcbicgJiYgaSA8IGxlbjsgYysrKQ0KICAgICAgICAgICAgICAg\nIGVtYWlsW2krK10gPSAqYzsNCiAgICAgICAgICAgIGVtYWlsW2ldID0gJ1ww\nJzsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIC8q\nIA0KICAgICAgICAgICAgKiogICAgLSBjaGVjayB0byBzZWUgaWYgdGhlIEZy\nb206IGxpbmUgaXMgYmxhbmssICh0YWtlbiBjYXJlIG9mKQ0KICAgICAgICAg\nICAgKiogICAgLSBjaGVjayBpZiBGcm9tOiB1dS5uZXQha2VudCBmb3JtYXR0\nZWQgbGluZQ0KICAgICAgICAgICAgKiogICAgLSBjaGVjayBpZiAiRnJvbTog\na2VudCIgZm9ybWF0dGVkIGxpbmUNCiAgICAgICAgICAgICovDQogICAgICAg\nICAgICBjID0gKGNoYXIgKikgc3RyY2hyKGxpbmUsICc6JykgKyAxOw0KICAg\nICAgICAgICAgd2hpbGUgKCpjID09ICcgJyB8fCAqYyA9PSAnXHQnKQ0KICAg\nICAgICAgICAgICAgICAgIGMrKzsNCiAgICAgICAgICAgIGZvciAoaSA9IDA7\nICpjICYmICpjICE9ICcgJyAmJiAqYyAhPSAnXHQnICYmIA0KICAgICAgICAg\nICAgICAgICpjICE9ICdcbicgJiYgKmMgIT0gJywnICYmIGkgPCBsZW47IGMr\nKykNCiAgICAgICAgICAgICAgICAgZW1haWxbaSsrXSA9ICpjOw0KICAgICAg\nICAgICAgZW1haWxbaV0gPSAnXDAnOw0KDQogICAgICAgIH0NCg0KICAgICAg\nICBpZiAoZW1haWxbMF0gPT0gJ1wwJykgLyogV2FzIGl0IGEganVuayBGcm9t\nIGxpbmUgPyAqLw0KICAgICAgICAgICAgc3RyY3B5KGVtYWlsLCBOT0VNQUlM\nKTsNCg0KICAgICAgICBlbHNlIGlmICh1c2VfZG9tYWluYWRkcikgeyANCiAg\nICAgICAgICAgIC8qDQogICAgICAgICAgICAqKiBjaGVjayBpZiBzaXRlIGRv\nbWFpbml6ZXMgYWRkcmVzc2VzIA0KICAgICAgICAgICAgKiogYnV0IGRvbid0\nIG1vZGlmeSB1dWNwIGFkZHJlc3Nlcw0KICAgICAgICAgICAgKi8NCiAgICAg\nICAgICAgIGlmICgoYyA9IChjaGFyICopIHN0cmNocihlbWFpbCwgJyEnKSkg\nPT0gTlVMTCkgew0KICAgICAgICAgICAgICAgIHN0cmNhdChlbWFpbCwgIkAi\nKTsNCiAgICAgICAgICAgICAgICBzdHJjYXQoZW1haWwsIGRvbWFpbmFkZHIp\nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2Ug\new0KICAgICAgICB3aGlsZSAoKmMgIT0gJyAnICYmICpjICE9ICdcdCcgJiYg\nKmMgIT0gJzwnICYmICpjICE9ICciJykNCiAgICAgICAgICAgIGMtLTsNCiAg\nICAgICAgYysrOw0KICAgICAgICBmb3IgKGkgPSAwOyAqYyAmJiAqYyAhPSAn\nPicgJiYgKmMgIT0gJyAnICYmICpjICE9ICdcdCcgJiYNCiAgICAgICAgICAg\nICAqYyAhPSAnIicgJiYgKmMgIT0gJ1xuJyAmJiBpIDwgbGVuOyBjKyspDQog\nICAgICAgICAgICBlbWFpbFtpKytdID0gKmM7DQogICAgICAgIGVtYWlsW2ld\nID0gJ1wwJzsNCiAgICB9DQoNCiAgICAvKg0KICAgICoqIE5BTUUgUHJvY2Vz\nc2luZyAtIEJveSBhcmUgdGhlcmUgYSBidW5jaCBvZiBmdW5reSBmb3JtYXRz\nIGhlcmUuDQogICAgKiogICAgICAgICAgICAgICAgICAgTm8gcHJvbWlzZXMu\nLi4gSSdsbCBkbyBteSBiZXN0LiBMZXQgbWUga25vdw0KICAgICoqICAgICAg\nICAgICAgICAgICAgIHdoYXQgSSBtaXNzZWQuLi4NCiAgICAqLw0KICAgIGlm\nIChzdHJjaHIobGluZSwgJygnKSkgew0KICAgICAgICBjID0gKGNoYXIgKikg\nc3RyY2hyKGxpbmUsICcoJykgKyAxOw0KICAgICAgICBpZiAoKmMgPT0gJyIn\nKSAvKiBpcyB0aGVyZSBhIGNvbW1lbnQgaW4gdGhlIGNvbW1lbnQgPyAqLw0K\nICAgICAgICAgICAgIGMrKzsNCiAgICB9DQogICAgZWxzZSBpZiAoc3RyY2hy\nKGxpbmUsICc8JykpIHsNCiAgICAgICAgYyA9IChjaGFyICopIHN0cmNocihs\naW5lLCAnOicpICsgMTsNCiAgICAgICAgd2hpbGUgKCpjID09ICcgJyB8fCAq\nYyA9PSAnXHQnIHx8ICpjID09ICdcIicpDQogICAgICAgICAgICBjKys7DQog\nICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICAvKg0KICAgICAgICAqKiBJcyB0\naGVyZSBhbiBlbWFpbCBhZGRyZXNzIGF2YWlsYWJsZSANCiAgICAgICAgKiog\ndGhhdCB3ZSBjYW4gdXNlIGZvciB0aGUgbmFtZSA/DQogICAgICAgICovDQog\nICAgICAgIGlmICghc3RyY21wKGVtYWlsLCBOT0VNQUlMKSkgICAgLyogTm8g\nKi8NCiAgICAgICAgICAgIHN0cmNweShuYW1lLCBOT05BTUUpOw0KICAgICAg\nICBlbHNlIHsNCiAgICAgICAgICAgIGMgPSBlbWFpbCtzdHJsZW4oZW1haWwp\nIC0gMTsNCiAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCpjKSkgKmMtLSA9\nICdcMCc7DQogICAgICAgICAgICBzdHJjcHkobmFtZSwgZW1haWwpOyAgICAg\nICAgLyogWWVzICovDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuOw0KICAg\nIH0NCg0KICAgIGZvciAoaSA9IDAsIGxlbiA9IE5BTUVTVFJMRU4tMTsgKmMg\nJiYgKmMgIT0gJzwnICYmICpjICE9ICdcIicgJiYgKmMgIT0gJyknICYmICpj\nICE9ICcoJyAmJiAqYyAhPSAnXG4nICYmIGkgPCBsZW47IGMrKykNCiAgICAg\nICAgbmFtZVtpKytdID0gKmM7DQoNCiAgICBpZiAoKmMgPT0gJzwnIHx8ICpj\nID09ICcoJykNCiAgICAgICAgbmFtZVstLWldID0gJ1wwJzsNCiAgICBlbHNl\nDQogICAgICAgIG5hbWVbaV0gPSAnXDAnOw0KDQogICAgDQogICAgLyogQmFp\nbGluZyBhbmQgdGFraW5nIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8NCg0KICAg\nIGlmIChuYW1lWzBdID09ICdcMCcpIHsNCiAgICAgICAgaWYgKGVtYWlsWzBd\nID09ICdcMCcpDQogICAgICAgICAgICBzdHJjcHkobmFtZSwgTk9OQU1FKTsN\nCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgc3RyY3B5KG5hbWUsIGVtYWls\nKTsNCiAgICB9DQoNCiAgICAgLyogbmVlZCB0byBzdHJpcCBzcGFjZXMgb2Zm\nIHRoZSBlbmQgb2YgDQogICAgICoqIHRoZSBlbWFpbCBhbmQgbmFtZSBzdHJp\nbmdzIA0KICAgICAqLw0KDQogICAgIGMgPSBlbWFpbCtzdHJsZW4oZW1haWwp\nIC0gMTsNCiAgICAgd2hpbGUgKGlzc3BhY2UoKmMpKSAqYy0tID0gJ1wwJzsN\nCiAgICAgYyA9IG5hbWUrc3RybGVuKG5hbWUpIC0gMTsNCiAgICAgd2hpbGUg\nKGlzc3BhY2UoKmMpKSAqYy0tID0gJ1wwJzsNCn0NCg0KLyogDQoqKiBHcmFi\ncyB0aGUgbWVzc2FnZSBJRCwgbGlrZSA8Li4uPiBmcm9tIHRoZSBNZXNzYWdl\nLUlEOiBoZWFkZXIuDQoqLw0KDQoNCmNoYXIgKmdldGlkKGNoYXIgKmxpbmUp\nDQp7DQogICAgaW50IGk7DQogICAgaW50IGxlbjsNCiAgICBjaGFyICpjOw0K\nICAgIHN0YXRpYyBjaGFyIG1zZ2lkW01TR0RTVFJMRU5dOw0KIA0KICAgIGlm\nICgoY2hhciAqKXN0cmNocihsaW5lLCAnPCcpID09IE5VTEwpIHsNCiAgICAg\nICAgLyogYm96byBhbGVydCENCiAgICAgICAgKiogICBtc2ctaWQgPSAiPCIg\nYWRkci1zcGVjICI+IiANCiAgICAgICAgKiogdHJ5IHRvIHJlY292ZXIgYXMg\nYmVzdCB3ZSBjYW4NCiAgICAgICAgKi8NCiAgICAgICAgYyA9IChjaGFyICop\nIHN0cmNocihsaW5lLCAnOicpICsgMTsgLyogd2Uga25vdyB0aGlzIGV4aXN0\ncyEgKi8NCg0KICAgICAgICAvKiBza2lwIHNwYWNlcyBiZWZvcmUgbWVzc2Fn\nZSBJRCAqLw0KICAgICAgICB3aGlsZSAoKmMgJiYgKCpjID09ICcgJyB8fCAq\nYyA9PSAnXHQnKSkgYysrOyANCiAgICB9DQogICAgZWxzZSANCiAgICAgICAg\nYyA9IChjaGFyICopIHN0cmNocihsaW5lLCAnPCcpICsgMTsNCg0KICAgIGZv\nciAoaSA9IDAsIGxlbiA9IE1TR0RTVFJMRU4gLTE7ICpjICYmICpjICE9ICc+\nJyAmJiAqYyAhPSAnXG4nICYmIGkgPCBsZW47IGMrKykgew0KICAgICAgICBp\nZiAoKmMgPT0gJ1xcJykNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAg\nICBtc2dpZFtpKytdID0gKmM7DQogICAgfQ0KDQogICAgbXNnaWRbaV0gPSAn\nXDAnOw0KDQogICAgaWYgKHN0cmxlbihtc2dpZCkgPT0gMCkgDQogICAgICAg\nIHN0cmNweShtc2dpZCwgIkJPWk8iKTsNCg0KICAgIHJldHVybiBtc2dpZDsN\nCn0NCg0KDQovKg0KKiogR3JhYnMgdGhlIHN1YmplY3QgZnJvbSB0aGUgU3Vi\namVjdDogaGVhZGVyLg0KKi8NCg0KY2hhciAqZ2V0c3ViamVjdChjaGFyICps\naW5lKQ0Kew0KICAgIGludCBpOw0KICAgIGludCBsZW47DQogICAgY2hhciAq\nYzsNCiAgICBzdGF0aWMgY2hhciBzdWJqZWN0W1NVQkpTVFJMRU5dOw0KDQog\nICAgYyA9IChjaGFyICopIHN0cmNocihsaW5lLCAnOicpICsgMjsNCiAgICB3\naGlsZSAoaXNzcGFjZSgqYykpDQogICAgICAgICBjKys7DQogICAgZm9yIChp\nID0gMCwgbGVuID0gU1VCSlNUUkxFTiAtMTsgKmMgJiYgKmMgIT0gJ1xuJyAm\nJiBpIDwgbGVuOyBjKyspDQogICAgICAgICBzdWJqZWN0W2krK10gPSAqYzsN\nCg0KICAgIHN1YmplY3RbaV0gPSAnXDAnOw0KDQogICAgLyogc3RyaXAgdHJh\naWxpbmcgc3BhY2VzICovDQoNCg0KICAgIGZvciAoaS0tOyBpID49IDAgJiYg\naXNzcGFjZShzdWJqZWN0W2ldKTsgaS0tKQ0KICAgICAgICAgc3ViamVjdFtp\nXSA9ICdcMCc7DQoNCiAgICAvKg0KICAgICoqIEZpeCBmb3IgRXhjaGFuZ2Ug\nYnVnIHRoYXQgcHV0cyAiRlc6IiBpbiBmcm9udCBvZiBmb3J3YXJkZWQgDQog\nICAgKiogbWVzc2FnZXMgd2hpY2ggYXJlIHN1YnN0aXR1dGVkIGJ5IEV4Y2hh\nbmdlIGZvciAiUkU6IiBvbiByZXBsaWVzDQogICAgKi8NCg0KICAgIGlmICgh\nc3RybmNtcChzdWJqZWN0LCAiRlc6IiwgMykpIHsNCiAgICAgICAgc3ViamVj\ndFswXSA9ICdSJzsNCiAgICAgICAgc3ViamVjdFsxXSA9ICdlJzsNCiAgICB9\nICAgDQoNCiAgICBpZiAoc3ViamVjdFswXSA9PSAgJ1wwJyB8fCBpc3NwYWNl\nKHN1YmplY3RbMF0pIHx8IHN1YmplY3RbMF0gPT0gJ1xuJyB8fCANCiAgICAg\nICAgIXN0cmNhc2VjbXAoc3ViamVjdCwgIlJlOiIpIHx8ICFzdHJjYXNlY21w\nKHN1YmplY3QsICJSZVsyXToiKSkNCiAgICAgICAgc3RyY3B5KHN1YmplY3Qs\nIE5PU1VCSkVDVCk7DQoNCiAgICByZXR1cm4gc3ViamVjdDsNCn0NCg0KLyoN\nCioqIEdyYWJzIHRoZSBtZXNzYWdlIElELCBvciBkYXRlLCBmcm9tIHRoZSBJ\nbi1yZXBseS10bzogaGVhZGVyLg0KKioNCioqIE1heWJlIEknbSBjb25mdXNl\nZCBidXQuLi4uDQoqKiAgICAgV2hhdCBlaXRoZXIgPyBTaG91bGQgaXQgbm90\nIGJlIGNvbnNpc3RlbnQgYW5kIGNob29zZSB0byByZXR1cm4gDQoqKiAgICAg\nb25lICh0aGUgbXNnaWQpIGFzIHRoZSBkZWZhdWx0IGFuZCBmYWxsIGJhY2sg\ndG8gZGF0ZSB3aGVuIGEgDQoqKiAgICAgbXNnaWQgY2Fubm90IGJlIGZvdW5k\nID8NCioqDQoqKiBXaG8ga25vd3Mgd2hhdCBvdGhlciBmb3JtYXRzIGFyZSBv\ndXQgdGhlcmUuLi4NCioqDQoqKiBJbi1SZXBseS1UbzogPDFERDlCODU0RTI3\nQGV2ZXJldHQucGl0dC5jYy5uYy51cz4NCioqIEluLVJlcGx5LVRvOiA8MTk5\nNzA5MTgxNjQ1Lk1BQTAyMDk3QG1haWwuY2xhcmsubmV0PiBmcm9tICJNYXJj\ndXMgSi4gUmFudW0iIGF0IFNlcCAxOCwgOTcgMTI6NDE6NDAgcG0NCioqIElu\nLVJlcGx5LVRvOiA8MTk5NzA5MTgxNjQ1Lk1BQTAyMDk3QG1haWwuY2xhcmsu\nbmV0PiBmcm9tIA0KKiogSW4tUmVwbHktVG86ICJMLiBEZXR3ZWlsZXIiJ3Mg\nbWVzc2FnZSBvZiBGcmksIDA0IEZlYiA5NCAyMjo1MToyMiAtMDcwMCA8MTk5\nNDAyMDUwNTUxLldBQTE2MTg5QGxvbmdzLmxhbmNlLmNvbG9zdGF0ZS5lZHU+\nDQoqKg0KKiogVGhpcyByb3V0aW5lIGlzIGJ1Z2d5IGFuZCB0aGUgZml4IGlz\nIHRvIGFkZCBhIHJlYWRsaW5lIHJvdXRpbmUgdGhhdCANCioqIGNvbmNhdGVu\nYXRlcyBjb250aW51YXRpb24gbGluZXMgaW50byBhIHNpbmdsZSBsaW5lIGFu\nZCBjb2xsYXBzZXMgDQoqKiB3aGl0ZXNwYWNlLiBUaGUgbWVzc2FnZSBpZCBz\naG91bGQgYWx3YXlzIGJlIHJldHVybmVkIGZvciB0aHJlYWRpbmcgDQoqKiBw\ndXJwb3Nlcy4gTWl4aW5nIG1lc3NhZ2UtaWRzIGFuZCBkYXRlcyBqdXN0IGRv\nZXMgbm90IGFsbG93IGZvciBwcm9wZXIgDQoqKiB0aHJlYWRpbmcgbG9va3Vw\ncy4NCiovDQogDQpjaGFyICpnZXRyZXBseShjaGFyICpsaW5lKQ0Kew0KICAg\nIGludCBpOw0KICAgIGludCByZXBseWxlbjsNCiAgICBpbnQgbWxlbjsNCiAg\nICBjaGFyICpjOw0KICAgIGNoYXIgKm07DQogICAgc3RhdGljIGNoYXIgcmVw\nbHlbUkVQWVNUUkxFTl07DQoNCiAgICByZXBseWxlbiA9IFJFUFlTVFJMRU4g\nLTE7DQogICAgbWxlbiA9IE1TR0RTVFJMRU4gLTE7DQoNCiAgICAvKiBDaGVj\nayBmb3IgYmxhbmsgbGluZSAqLw0KDQogICAgLyogDQogICAgKiogQ2hlY2sg\nZm9yIGxpbmUgd2l0aCAiIGZyb20gIiBhbmQgIiBhdCAiLiAgRm9ybWF0IG9m\nIHRoZSBsaW5lIGlzIA0KICAgICoqICAgICA8bXNnaWQ+IGZyb20gInF1b3Rl\nZCB1c2VyIG5hbWUiIGF0IGRhdGUtc3RyaW5nDQogICAgKi8NCg0KICAgIGlm\nICgoY2hhciAqKSBzdHJzdHIobGluZSwgIiBmcm9tICIpICE9IE5VTEwpIHsN\nCiAgICAgICAgaWYgKCgoY2hhciAqKSBzdHJzdHIobGluZSwgIiBhdCAiKSkg\nIT0gTlVMTCkgew0KICAgICAgICAgICAgaWYgKChtID0gKGNoYXIgKikgc3Ry\nY2hyKGxpbmUsICc8JykpICE9IE5VTEwpIHsNCiAgICAgICAgICAgICAgICBm\nb3IgKG0rKywgaSA9IDA7ICptICYmICptICE9ICc+JyAmJiAqbSAhPSAnXG4n\nICYmIGkgPCByZXBseWxlbjsgbSsrKQ0KICAgICAgICAgICAgICAgICAgICAg\ncmVwbHlbaSsrXSA9ICptOw0KICAgICAgICAgICAgICAgIHJlcGx5W2ldID0g\nJ1wwJzsNCiAgICAgICAgICAgICAgICByZXR1cm4ocmVwbHkpOw0KICAgICAg\nICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyogDQogICAgICAgICoq\nIElmIG5vICdhdCcgdGhlIGxpbmUgbWF5IGJlIGEgY29udGludWVkIGxpbmUg\nb3IgYSB0cnVuY2F0ZWQgbGluZS4NCiAgICAgICAgKiogQm90aCB3aWxsIGJl\nIHBpY2tlZCB1cCBsYXRlci4NCiAgICAgICAgKi8NCiAgICB9DQoNCiAgICAv\nKiANCiAgICAqKiBDaGVjayBmb3IgbGluZSB3aXRoICIgbWVzc2FnZSBvZiAi\nLiAgRm9ybWF0IG9mIHRoZSBsaW5lIGlzIA0KICAgICoqICAgICAicXVvdGVk\nIHVzZXIgbmFtZSIncyBtZXNzYWdlIG9mIGRhdGUtc3RyaW5nIDxtc2dpZD4N\nCiAgICAqLw0KDQogICAgaWYgKChjID0gKGNoYXIgKikgc3Ryc3RyKGxpbmUs\nICJtZXNzYWdlIG9mICIpKSAhPSBOVUxMKSB7DQogICAgICAgIC8qDQogICAg\nICAgICoqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1lc3NhZ2UgSUQg\nb24gdGhlIGxpbmUuIA0KICAgICAgICAqKiBJZiBub3QgdGhpcyBpcyBhIGNv\nbnRpbnVlZCBsaW5lIGFuZCB3aGVuIHlvdSBhZGQgYSByZWFkbGluZSgpDQog\nICAgICAgICoqIGZ1bmN0aW9uIHRoYXQgY29uY2F0ZW5hdGVzIGNvbnRpbnVh\ndGlvbiBsaW5lcyBjb2xsYXBzaW5nDQogICAgICAgICoqIHdoaXRlIHNwYWNl\nLCB5b3UgbWlnaHQgd2FudCB0byByZXZpc2l0IHRoaXMuLi4NCiAgICAgICAg\nKi8NCg0KICAgICAgICBpZiAoKG0gPSAoY2hhciAqKSBzdHJjaHIobGluZSwg\nJzwnKSkgIT0gTlVMTCkgew0KICAgICAgICAgICAgIGZvciAobSsrLCBpID0g\nMDsgKm0gJiYgKm0gIT0gJz4nICYmICptICE9ICdcbicgJiYgaSA8IHJlcGx5\nbGVuOyBtKyspDQogICAgICAgICAgICAgICAgICByZXBseVtpKytdID0gKm07\nDQogICAgICAgICAgICAgcmVwbHlbaV0gPSAnXDAnOw0KICAgICAgICAgICAg\nIHJldHVybihyZXBseSk7DQogICAgICAgIH0NCiAgDQogICAgICAgIC8qIE5v\ncGUuLi4gR28gZm9yIHRoZSBEYXRlIGluZm8uLi4gQnVnLi4uKi8NCiAgICAg\nICAgYyArPSAxMTsNCiAgICAgICAgd2hpbGUgKGlzc3BhY2UoKmMpKQ0KICAg\nICAgICAgICAgYysrOw0KICAgICAgICBpZiAoKmMgPT0gJyInKSANCiAgICAg\nICAgICAgIGMrKzsNCg0KICAgICAgICBmb3IgKGkgPSAwOyAqYyAmJiAqYyAh\nPSAnLicgJiYgKmMgIT0gJ1xuJyAmJiBpIDwgcmVwbHlsZW47IGMrKykNCiAg\nICAgICAgICAgICByZXBseVtpKytdID0gKmM7DQogICAgICAgIHJlcGx5W2ld\nID0gJ1wwJzsNCiAgICAgICAgcmV0dXJuKHJlcGx5KTsNCiAgICB9DQoNCiAg\nICBpZiAoKGMgPSAoY2hhciAqKSBzdHJzdHIobGluZSwgImRhdGVkOiAiKSkg\nIT0gTlVMTCkgew0KICAgICAgICBjICs9IDc7DQogICAgICAgIGZvciAoaSA9\nIDA7ICpjICYmICpjICE9ICcuJyAmJiAqYyAhPSAnXG4nICYmIGkgPCByZXBs\neWxlbjsgYysrKQ0KICAgICAgICAgICAgIHJlcGx5W2krK10gPSAqYzsNCiAg\nICAgICAgcmVwbHlbaV0gPSAnXDAnOw0KICAgICAgICByZXR1cm4ocmVwbHkp\nOw0KICAgIH0NCiANCiAgICBpZiAoKGMgPSAoY2hhciAqKSBzdHJzdHIobGlu\nZSwgImRhdGVkICIpKSAhPSBOVUxMKSB7DQogICAgICAgIGMgKz0gNjsNCiAg\nICAgICAgZm9yIChpID0gMDsgKmMgJiYgKmMgIT0gJy4nICYmICpjICE9ICdc\nbicgJiYgaSA8IHJlcGx5bGVuOyBjKyspDQogICAgICAgICAgICAgcmVwbHlb\naSsrXSA9ICpjOw0KICAgICAgICByZXBseVtpXSA9ICdcMCc7DQogICAgICAg\nIHJldHVybihyZXBseSk7DQogICAgfQ0KDQogICAgaWYgKChjID0gKGNoYXIg\nKikgc3RyY2hyKGxpbmUsICc8JykpICE9IE5VTEwgKSB7DQogICAgICAgIGMr\nKzsNCiAgICAgICAgZm9yIChpID0gMDsgKmMgJiYgKmMgIT0gJz4nICYmICpj\nICE9ICdcbicgJiYgaSA8IG1sZW47IGMrKykgew0KICAgICAgICAgICAgIGlm\nICgqYyA9PSAnXFwnKQ0KICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAg\nICAgICAgICAgICByZXBseVtpKytdID0gKmM7DQogICAgICAgIH0NCiAgICAg\nICAgcmVwbHlbaV0gPSAnXDAnOw0KICAgICAgICByZXR1cm4ocmVwbHkpOw0K\nICAgIH0NCiANCiAgICBpZiAoKGMgPSAoY2hhciAqKSBzdHJzdHIobGluZSwg\nInNhZ2Ugb2YgIikpICE9IE5VTEwpIHsNCiAgICAgICAgYyArPSA4Ow0KICAg\nICAgICBpZiAoKmMgPT0gJ1wiJykNCiAgICAgICAgICAgIGMrKzsNCg0KICAg\nICAgICBmb3IgKGkgPSAwOyAqYyAmJiAqYyAhPSAnLicgJiYgKmMgIT0gJ1xu\nJyAmJiANCiAgICAgICAgICAgICAqYyAhPSAnZicgJiYgaSA8IHJlcGx5bGVu\nOyBjKyspDQogICAgICAgICAgICAgcmVwbHlbaSsrXSA9ICpjOw0KICAgICAg\nICByZXBseVtpXSA9ICdcMCc7DQoNCiAgICAgICAgaWYgKCpjID09ICdmJykN\nCiAgICAgICAgICAgIHJlcGx5Wy0taV0gPSAnXDAnOw0KICAgICAgICByZXR1\ncm4ocmVwbHkpOw0KICAgIH0NCiANCiAgICByZXBseVswXSA9ICdcMCc7DQog\nICAgcmV0dXJuKHJlcGx5KTsNCn0NCg0KLyoNCioqIFJGQyAyMDQ3IGRlZmlu\nZXMgTUlNRSBleHRlbnNpb25zIGZvciBtYWlsIGhlYWRlcnMuDQoqKg0KKiog\nVGhpcyBmdW5jdGlvbiBkZWNvZGVzIHRoYXQgaW50byBiaW5hcnkvOGJpdCBk\nYXRhLg0KKioNCioqIEV4YW1wbGU6DQoqKiAgID0/aXNvLTg4NTktMT9xP0kn\nbV9jYWxsZWRfPz0gPT9pc28tODg1OS0xP3E/RGFuaWVsPz0NCioqDQoqKiBT\naG91bGQgcmVzdWx0IGluICJJJ20gY2FsbGVkIERhbmllbCIsIGJ1dDoNCioq\nDQoqKiAgID0/aXNvLTg4NTktMT9xP0knbV9jYWxsZWQ/PSBEYW5pZWwNCioq\nDQoqKiBTaG91bGQgcmVzdWx0IGluICJJJ20gY2FsbGVkIERhbmllbCIgdG9v\nLg0KKioNCioqIFJldHVybnMgdGhlIG5ld2x5IGFsbGNhdGVkIHN0cmluZywg\nb3IgdGhlIHByZXZpb3VzIGlmIG5vdGhpbmcgY2hhbmdlZCANCiovDQoNCnN0\nYXRpYyBjaGFyICptZGVjb2RlUkZDMjA0NyggY2hhciAqc3RyaW5nLCBpbnQg\nbGVuZ3RoICkNCnsNCiAgICBjaGFyICppcHRyID0gc3RyaW5nOw0KICAgIGNo\nYXIgKm9sZHB0cjsNCiAgICBjaGFyICpzdG9yYWdlPW1hbGxvYyhsZW5ndGgr\nMSk7DQogIA0KICAgIGNoYXIgKm91dHB1dCA9IHN0b3JhZ2U7DQogIA0KICAg\nIGNoYXIgY2hhcnNldFsxMjldOw0KICAgIGNoYXIgZW5jb2RpbmdbMzNdOw0K\nICAgIGNoYXIgYmx1cmJbMTI5XTsNCiAgICBjaGFyIGVxdWFsOw0KICAgIGlu\ndCB2YWx1ZTsNCiAgDQogICAgY2hhciBkaWRhbnl0aGluZz1GQUxTRTsNCg0K\nICAgIHdoaWxlICgqaXB0cikgew0KICAgICAgICBpZiAoIXN0cm5jbXAoaXB0\nciwgIj0/IiwgMikgJiYNCiAgICAgICAgICAgICg0ID09IHNzY2FuZihpcHRy\nKzIsICIlMTI4W14/XT8lMzJbXj9dPyUxMjhbXj9dPyVjIiwNCiAgICAgICAg\nICAgICAgICAgICAgICAgIGNoYXJzZXQsIGVuY29kaW5nLCBibHVyYiwgJmVx\ndWFsKSkgJiYNCiAgICAgICAgICAgICgnPScgPT0gZXF1YWwpKSB7DQogICAg\nICAgICAgICAvKiBUaGlzIGlzIGEgZnVsbCwgdmFsaWQgJ2VuY29kZWQtd29y\nZCcuIERlY29kZSEgKi8NCiAgICAgICAgICAgIGNoYXIgKnB0cj1ibHVyYjsN\nCiAgDQogICAgICAgICAgICBkaWRhbnl0aGluZz1UUlVFOyAvKiB5ZXMsIHdl\nIGRlY29kZSBzb21ldGhpbmcgKi8NCiAgDQogICAgICAgICAgICAvKiB3ZSBj\nb3VsZCd2ZSBkb25lIHRoaXMgd2l0aCBhICVuIGluIHRoZSBzc2NhbmYsIGJ1\ndCB3ZSBrbm93IGFsbA0KICAgICAgICAgICAgICAgc3NjYW5mcyBkb24ndCBn\ncm9rIHRoYXQgKi8NCg0KICAgICAgICAgICAgaXB0ciArPSAyKyBzdHJsZW4o\nY2hhcnNldCkgKyAxICsgc3RybGVuKGVuY29kaW5nKSArIDEgKyBzdHJsZW4o\nYmx1cmIpICsgMjsNCiAgDQogICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAo\nInEiLCBlbmNvZGluZykpIHsNCiAgICAgICAgICAgICAgIC8qIHF1b3RlZCBw\ncmludGFibGUgZGVjb2RpbmcgKi8NCiAgDQogICAgICAgICAgICAgICAgZm9y\nICggOyAqcHRyOyBwdHIrKyApIHsNCiAgICAgICAgICAgICAgICAgICAgc3dp\ndGNoICggKnB0ciApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ug\nJz0nOg0KICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoIHB0cisx\nLCAiJTAyWCIsICZ2YWx1ZSApOw0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAqb3V0cHV0KysgPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgcHRyICs9IDI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr\nOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXyc6DQogICAgICAg\nICAgICAgICAgICAgICAgICAgICpvdXRwdXQrKyA9ICcgJzsNCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAg\nICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0\ncHV0KysgPSAqcHRyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh\nazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0N\nCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjYXNl\nY21wKCJiIiwgZW5jb2RpbmcpKSB7DQogICAgICAgICAgICAgICAgLyogYmFz\nZTY0IGRlY29kaW5nICovDQogICAgICAgICAgICAgICAgaW50IGxlbmd0aDsN\nCiAgICAgICAgICAgICAgICBiYXNlNjREZWNvZGUocHRyLCBvdXRwdXQsICZs\nZW5ndGgpOw0KICAgICAgICAgICAgICAgIG91dHB1dCArPSBsZW5ndGgtMTsN\nCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAg\nICAgICAgIC8qIHVuc3VwcG9ydGVkIGVuY29kaW5nIHR5cGUgKi8NCiAgICAg\nICAgICAgICAgICBzdHJjcHkob3V0cHV0LCAiPHVua25vd24+Iik7DQogICAg\nICAgICAgICAgICAgb3V0cHV0ICs9IDk7DQogICAgICAgICAgICB9DQogIA0K\nICAgICAgICAgICAgb2xkcHRyID0gaXB0cjsgLyogc2F2ZSBzdGFydCBwb3Np\ndGlvbiAqLw0KICANCiAgICAgICAgICAgIHdoaWxlICgqaXB0ciAmJiBpc3Nw\nYWNlKCppcHRyKSkNCiAgICAgICAgICAgICAgICAgIGlwdHIrKzsgLyogcGFz\ncyBhbGwgd2hpdGVzcGFjZXMgKi8NCiAgDQogICAgICAgICAgICAvKiBpZiB0\naGlzIGlzIGFuIGVuY29kZWQgd29yZCBoZXJlLCB3ZSBzaG91bGQgc2tpcCB0\naGUgcGFzc2VkDQogICAgICAgICAgICAgICB3aGl0ZXNwYWNlcy4gSWYgaXQg\naXNuJ3QgYW4gZW5jb2RlZC13b3JkLCB3ZSBzaG91bGQgaW5jbHVkZSB0aGUN\nCiAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzIGluIHRoZSBvdXRwdXQuICov\nDQoNCiAgICAgICAgICAgIGlmICghc3RybmNtcChpcHRyLCAiPT8iLCAyKSAm\nJg0KICAgICAgICAgICAgICAgICg0ID09IHNzY2FuZihpcHRyKzIsICIlMTI4\nW14/XT8lMzJbXj9dPyUxMjhbXj9dPyVjIiwNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGNoYXJzZXQsIGVuY29kaW5nLCBibHVyYiwgJmVxdWFs\nKSkgJiYNCiAgICAgICAgICAgICAgICAoJz0nID09IGVxdWFsKSkgew0KICAg\nICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB0aGlzIElTIGFuIGVuY29kZWQt\nd29yZCwgY29udGludWUgZnJvbSBoZXJlICovDQogICAgICAgICAgICB9DQog\nICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIC8qIHRoaXMgSVMgTk9U\nIGFuIGVuY29kZWQtd29yZCwgbW92ZSBiYWNrIHRvIHRoZSBmaXJzdCB3aGl0\nZXNwYWNlICovDQogICAgICAgICAgICAgIGlwdHIgPSBvbGRwdHI7DQogICAg\nICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgKm91dHB1dCsrID0g\nKmlwdHIrKzsgICANCiAgICB9DQogICAgKm91dHB1dD0wOw0KICANCiAgICBp\nZiAoZGlkYW55dGhpbmcpIHsNCiAgICAgICAgLyogdGhpcyBjaGVjayBwcmV2\nZW50cyB1bm5lY2Nlc3Nhcnkgc3Ryc2F2KCkgY2FsbHMgaWYgbm90IG5lZWRl\nZCAqLw0KICAgICAgICBmcmVlKHN0cmluZyk7IC8qIGZyZWUgb2xkIG1lbW9y\neSAqLw0KICANCiNpZiAwDQogICAgICAgIC8qIGRlYnVnIGRpc3BsYXkgKi8N\nCiAgICAgICAgcHJpbnRmKCJORVc6ICVzXG4iLCBzdG9yYWdlKTsNCiAgDQog\nICAgICAgIHsgIA0KICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZjsNCiAg\nICAgICAgICAgIHB1dHMoIk5FVzoiKTsNCiAgICAgICAgICAgIGZvciAoZj1z\ndG9yYWdlOyBmPG91dHB1dDsgZisrKSB7DQogICAgICAgICAgICAgICAgaWYg\nKGlzZ3JhcGgoKmYpKQ0KICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWMi\nLCAqZik7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAg\nICAgIHByaW50ZigiJTAyWCIsICh1bnNpZ25lZCBjaGFyKSpmKTsNCiAgICAg\nICAgICAgIH0NCiAgICAgICAgICAgIHB1dHMoIiIpOw0KICAgICAgICB9ICAN\nCiNlbmRpZg0KICAgICAgICByZXR1cm4gc3RvcmFnZTsgLyogcmV0dXJuIG5l\ndyAqLw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgIGZyZWUgKHN0b3JhZ2Up\nOw0KICAgICAgcmV0dXJuIHN0cmluZzsNCiAgICB9DQp9DQoNCi8qDQoqKiBE\nZWNvZGUgdGhpcyBbdmlydHVhbF0gUXVvdGVkLVByaW50YWJsZSBsaW5lIGFz\nIGRlZmluZWQgYnkgUkZDMjA0NS4NCioqIFdyaXR0ZW4gYnkgRGFuaWVsLlN0\nZW5iZXJnQHN0aC5mcm9udGVjLnNlDQoqLw0KDQpzdGF0aWMgdm9pZCBtZGVj\nb2RlUVAoRklMRSAqZmlsZSwgY2hhciAqaW5wdXQsIGNoYXIgKipyZXN1bHQs\nIGludCAqbGVuZ3RoKQ0Kew0KICAgIGludCBvdXRjb3VudD0wOw0KICAgIGNo\nYXIgKmJ1ZmZlcj1pbnB1dDsNCiAgICB1bnNpZ25lZCBjaGFyIGluY2hhcjsN\nCiAgICBjaGFyICpvdXRwdXQ7DQoNCiAgICBpbnQgbGVuPXN0cmxlbihpbnB1\ndCk7ICANCiAgICBvdXRwdXQ9c3Ryc2F2KGlucHV0KTsNCg0KI2RlZmluZSBR\nUF9FTkxBUkdFX1NURVAgNTEyDQoNCiAgICB3aGlsZSAoKGluY2hhciA9ICpp\nbnB1dCkgIT0gJ1wwJykgew0KDQogICAgICAgIGlmIChvdXRjb3VudD49bGVu\nLTEpIHsNCiAgICAgICAgICAgIC8qIHdlIG5lZWQgdG8gZW5sYXJnZSB0aGUg\nZGVzdGluYXRpb24gYXJlYSEgKi8NCiAgICAgICAgICAgIGNoYXIgKm5ld3Ag\nPSByZWFsbG9jKG91dHB1dCwgbGVuK1FQX0VOTEFSR0VfU1RFUCk7DQogICAg\nICAgICAgICBpZiAobmV3cCkgew0KICAgICAgICAgICAgICAgIG91dHB1dCA9\nIG5ld3A7DQogICAgICAgICAgICAgICAgbGVuICs9IFFQX0VOTEFSR0VfU1RF\nUDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAg\nICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KDQogICAgICAgIGlucHV0Kys7\nDQogICAgICAgIGlmICgnPScgPT0gaW5jaGFyKSB7DQogICAgICAgICAgICBp\nbnQgdmFsdWU7DQogICAgICAgICAgICBpZiAoJ1xuJz09ICppbnB1dCkgew0K\nICAgICAgICAgICAgICAgIGlmICghZmdldHMoYnVmZmVyLCBNQVhMSU5FLCBm\naWxlKSkNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAg\nICAgICAgaW5wdXQgPSBidWZmZXI7DQogICAgICAgICAgICAgICAgY29udGlu\ndWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIGlmICgnPScg\nPT0gKmlucHV0KSB7DQogICAgICAgICAgICAgICAgaW5jaGFyPSc9JzsNCiAg\nICAgICAgICAgICAgICBpbnB1dCsrOyAvKiBwYXNzIHRoaXMgKi8NCiAgICAg\nICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UgaWYgKGlzeGRpZ2l0KCppbnB1\ndCkpIHsNCiAgICAgICAgICAgICAgICBzc2NhbmYoaW5wdXQsICIlMDJYIiwg\nJnZhbHVlKTsNCiAgICAgICAgICAgICAgICBpbmNoYXIgPSAodW5zaWduZWQg\nY2hhcil2YWx1ZTsNCiAgICAgICAgICAgICAgICBpbnB1dCs9MjsgLyogcGFz\ncyB0aGUgdHdvIGxldHRlcnMgKi8NCiAgICAgICAgICAgIH0NCiAgICAgICAg\nICAgIGVsc2UNCiAgICAgICAgICAgICAgICBpbmNoYXI9Jz0nOw0KICAgICAg\nICB9DQogICAgICAgIG91dHB1dFtvdXRjb3VudCsrXSA9IGluY2hhcjsNCiAg\nICB9DQogICAgb3V0cHV0W291dGNvdW50XT0wOyAvKiB6ZXJvIHRlcm1pbmF0\nZSAqLw0KDQogICAgKnJlc3VsdCA9IG91dHB1dDsNCiAgICAqbGVuZ3RoID0g\nb3V0Y291bnQ7DQp9DQoNCi8qDQoqKiBQYXJzaW5nLi4udGhlIGhlYXJ0IG9m\nIEh5cGVybWFpbCENCioqIFRoaXMgbG9hZHMgaW4gdGhlIGFydGljbGVzIGZy\nb20gc3RkaW4gb3IgYSBtYWlsYm94LCBhZGRpbmcgdGhlIHJpZ2h0DQoqKiBm\naWVsZCB2YXJpYWJsZXMgdG8gdGhlIHJpZ2h0IHN0cnVjdHVyZXMuIElmIHJl\nYWRvbmUgaXMgc2V0LCBpdCB3aWxsDQoqKiB0aGluayBhbnl0aGluZyBpdCBy\nZWFkcyBpbiBpcyBvbmUgYXJ0aWNsZSBvbmx5Lg0KKi8NCg0Kdm9pZCBsb2Fk\naGVhZGVycyhjaGFyICptYm94LCBpbnQgdXNlX3N0ZGluLCBpbnQgcmVhZG9u\nZSwgY2hhciAqZGlyKQ0Kew0KICAgIEZJTEUgKmZwOw0KICAgIGNoYXIgbmFt\nZVtOQU1FU1RSTEVOXSwgZW1haWxbTUFJTFNUUkxFTl0sIGRhdGVbREFURVNU\nUkxFTl0sDQogICAgICAgIG1zZ2lkW01TR0RTVFJMRU5dLCBzdWJqZWN0W1NV\nQkpTVFJMRU5dLCBpbnJlcGx5W1JFUFlTVFJMRU5dLA0KICAgICAgICBsaW5l\nW01BWExJTkVdLCB0bXBmcm9tW01BWExJTkVdLCBmcm9tZGF0ZVtEQVRFU1RS\nTEVOXSwNCiAgICAgICAgb2xkbGluZVtNQVhMSU5FXSwgKmNwOw0KICAgIGlu\ndCBudW0sIGlzaW5oZWFkZXIsIGhhc3N1YmplY3QsIGhhc2RhdGU7DQojaWYg\nMA0KICAgIGludCB3YXNpbnJlcGx5Ow0KI2VuZGlmDQoNCiAgICAvKiAtLSB2\nYXJpYWJsZXMgZm9yIHRoZSBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUgcGFyc2Vy\nIC0tICovDQogICAgc3RydWN0IGJvZHkgKm9yaWdicD1OVUxMOyAvKiBzdG9y\nZSB0aGUgb3JpZ2luYWwgYnAgKi8NCiAgICBzdHJ1Y3QgYm9keSAqb3JpZ2xw\nPU5VTEw7IC8qIC4uLiBhbmQgdGhlIG9yaWdpbmFsIGxwICovDQogICAgc3Ry\ndWN0IGJvZHkgKmZpcnN0YnA9TlVMTDsgLyogdXNlIHRoaXMgZm9yIHRoZSBm\naXJzdCBwYXJ0ICovDQogICAgY2hhciBhbHRlcm5hdGl2ZXBhcnNlcj1GQUxT\nRTsgLyogc2V0IHdoZW4gaW5zaWRlIGFsdGVybmF0aXZlIHBhcnNlcg0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKi8NCg0K\nICAgIC8qIC0tIGVuZCBvZiBhbHRlcm5hdGl2ZSBwYXJzZXIgdmFyaWFibGVz\nIC0tICovDQoNCiAgICBzdHJ1Y3QgYm9keSAqYnA7DQogICAgc3RydWN0IGJv\nZHkgKmxwPU5VTEw7IC8qIHRoZSBsYXN0IHBvaW50ZXIsIHBvaW50cyB0byB0\naGUgbGFzdCBub2RlIGluIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICBib2R5IGxpc3QuIEluaXRpYWxseSBzZXQgdG8gTlVMTCBzaW5jZSB3\nZSBoYXZlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmUgYXQg\ndGhlIG1vbWVudC4gKi8NCg0KICAgIHN0cnVjdCBib2R5ICpoZWFkcD1OVUxM\nOyAvKiBzdG9yZWQgcG9pbnRlciB0byB0aGUgcG9pbnQgd2hlcmUgd2UgbGFz\ndA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkIHRo\nZSBoZWFkZXJzIG9mIHRoaXMgbWFpbC4gKi8NCg0KICAgIGNoYXIgTWltZV9C\nID0gRkFMU0U7DQoNCiAgICBjaGFyIGJvdW5kYnVmZmVyWzEyOF09IiI7DQoN\nCiAgICAvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3RvcmUgYSBzdGFj\nayBvZiBib3VuZGFyeSBzZXBhcmF0b3JzIGluIGNhc2VzDQogICAgICAgd2l0\naCBtaW1lZCBtYWlscyBpbnNpZGUgbWltZWQgbWFpbHMgKi8NCiAgICBzdHJ1\nY3QgYm91bmRhcnkgKmJvdW5kcD1OVUxMOw0KDQogICAgLyogVGhpcyB2YXJp\nYWJsZSBpcyBzZXQgVFJVRSBpZiB3ZSBoYXZlIHJlYWQgYSBwYXJ0aWFsIGxp\nbmUgb2ZmIGENCiAgICAgICBtdWx0aWxpbmUtZW5jb2RlZCBsaW5lLCBhbmQg\ndGhlIG5leHQgbGluZSB3ZSByZWFkIGlzIHN1cHBvc2VkIHRvIGdldA0KICAg\nICAgIGFwcGVuZGVkIHRvIHRoZSBwcmV2aW91cyBvbmUgKi8NCiAgICBjaGFy\nIG11bHRpbGluZW5vZW5kPUZBTFNFOw0KDQogICAgLyogVGhpcyB2YXJpYWJs\nZSBpcyBzZXQgdG8gZXh0cmEgZmxhZ3MgdGhhdCB0aGUgYWRkYm9keSgpIGNh\nbGxzIHNob3VsZCBPUg0KICAgICAgIGluIHRoZSBmbGFnIHBhcmFtZXRlciAq\nLw0KICAgIGludCBib2R5ZmxhZ3M9MDsNCg0KICAgIGNoYXIgKmJpbm5hbWU9\nTlVMTDsgLyogZmlsZSBuYW1lIHRvIHN0b3JlIGJpbmFyeSBhdHRhY2htZW50\ncyBpbiAqLw0KICAgIGludCBiaW5maWxlPS0xOw0KDQogICAgRW5jb2RlVHlw\nZSBkZWNvZGU9RU5DT0RFX05PUk1BTDsNCiAgICBDb250ZW50VHlwZSBjb250\nZW50PUNPTlRFTlRfVEVYVDsNCiAgDQogICAgaWYgKCFzdHJjYXNlY21wKG1i\nb3gsICJOT05FIikgfHwgdXNlX3N0ZGluKQ0KICAgICAgICBmcCA9IHN0ZGlu\nOw0KICAgIGVsc2Ugew0KICAgICAgICBpZiAoKGZwID0gZm9wZW4obWJveCwg\nInIiKSkgPT0gTlVMTCkgew0KICAgICAgICAgICAgc3ByaW50ZihlcnJtc2cs\nICJDb3VsZG4ndCBvcGVuIG1haWwgYXJjaGl2ZSBcIiVzXCIuIiwgbWJveCk7\nDQogICAgICAgICAgICBwcm9nZXJyKE5VTEwpOw0KICAgICAgICB9DQogICAg\nfQ0KICANCiAgICBpZiAocmVhZG9uZSkNCiAgICAgICAgbnVtID0gYmlnbnVt\nOw0KICAgIGVsc2UNCiAgICAgICAgbnVtID0gMDsNCg0KICAgIGhhc3N1Ympl\nY3QgPSAwOw0KICAgIGhhc2RhdGUgPSAwOw0KI2lmIDANCiAgICB3YXNpbnJl\ncGx5ID0gMDsNCiNlbmRpZg0KICAgIGlzaW5oZWFkZXIgPSAxOw0KICAgIHN0\ncmNweShzdWJqZWN0LCBOT1NVQkpFQ1QpOw0KICAgIGlucmVwbHlbMF0gPSAn\nXDAnOw0KICAgIHRtcGZyb21bMF0gPSAnXDAnOw0KICAgIG9sZGxpbmVbMF0g\nPSAnXDAnOw0KICAgIG1zZ2lkWzBdID0gJ1wwJzsNCiAgICBicCA9IE5VTEw7\nDQoNCiAgICBpZiAoIXJlYWRvbmUpIHsNCiAgICAgICAgcmVwbHlsaXN0ID0g\nTlVMTDsNCiAgICAgICAgc3ViamVjdGxpc3QgPSBOVUxMOw0KICAgICAgICBh\ndXRob3JsaXN0ID0gTlVMTDsNCiAgICAgICAgZGF0ZWxpc3QgPSBOVUxMOw0K\nICAgIH0NCg0KICAgIGlmIChzaG93cHJvZ3Jlc3MgJiYgcmVhZG9uZSkNCiAg\nICAgICAgcHJpbnRmKCJSZWFkaW5nIG5ldyBoZWFkZXIuLi5cbiIpOw0KDQog\nICAgaWYgKHNob3dwcm9ncmVzcyAmJiAhcmVhZG9uZSkgew0KICAgICAgICBp\nZiAoIXN0cmNhc2VjbXAobWJveCwgIk5PTkUiKSB8fCB1c2Vfc3RkaW4pDQog\nICAgICAgICAgICBwcmludGYoIkxvYWRpbmcgbWFpbGJveC4uLiAgICAiKTsN\nCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgcHJpbnRmKCJMb2FkaW5nIG1h\naWxib3ggXCIlc1wiLi4uICAgICIsIG1ib3gpOw0KICAgIH0NCiAgICB3aGls\nZSAoZmdldHMobGluZSwgTUFYTElORSwgZnApICE9IE5VTEwpIHsNCiAgICAg\nICAgaWYgKGlzaW5oZWFkZXIpIHsNCiAgICAgICAgICAgIGlmICghc3RybmNh\nc2VjbXAobGluZSwgIkZyb20gIiwgNSkpDQogICAgICAgICAgICAgICAgc3Ry\nY3B5bWF4KGZyb21kYXRlLCAoY2hhciAqKSBnZXRmcm9tZGF0ZShsaW5lKSwg\nREFURVNUUkxFTik7DQogICAgICAgICAgICAvKiBjaGVjayBmb3IgTUlNRSAq\nLw0KICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKCBsaW5lLCAi\nTUlNRS1WZXJzaW9uOiIsIDEzKSkNCiAgICAgICAgICAgICAgICBNaW1lX0Ig\nPSBUUlVFOw0KI2lmIDANCi8qIERhbmllbCdzIG5vdGU6IGp1c3QgKndoYXQq\nIGlzIHRoaXMgaGFjayBkb2luZz8gKi8NCi8qIEtlbnQncyBub3RlOiBTYWQg\nYXR0ZW1wdCBhdCBkZXRlcm1pbmcgYSBjb250aW51YXRpb24gbGluZSA/ICov\nDQogICAgICAgICAgICBlbHNlIGlmICgoIXN0cm5jbXAobGluZSwgIiAgICAi\nLCA0KSB8fCBsaW5lWzBdID09ICdcdCcpICYmDQogICAgICAgICAgICAgICAg\nc3RyY2hyKGxpbmUsICc8JykgJiYgc3RyY2hyKGxpbmUsICc+JykgJiYNCiAg\nICAgICAgICAgICAgICBzdHJjaHIobGluZSwgJ0AnKSAmJiB3YXNpbnJlcGx5\nKSB7DQogICAgICAgICAgICAgICAgYnAgPSAoc3RydWN0IGJvZHkgKikgYWRk\nYm9keShicCwgJmxwLCBsaW5lLCAwKTsNCiAgICAgICAgICAgICAgICBzdHJj\ncHltYXgoaW5yZXBseSwgKGNoYXIgKikgZ2V0cmVwbHkobGluZSksIFJFUFlT\nVFJMRU4pOw0KICAgICAgICAgICAgICAgIHdhc2lucmVwbHkgPSAwOw0KICAg\nICAgICAgICAgfQ0KI2VuZGlmDQogICAgICAgICAgICBlbHNlIGlmIChpc3Nw\nYWNlKGxpbmVbMF0pICYmICgnXG4nICE9IGxpbmVbMF0pICkgew0KICAgICAg\nICAgICAgICAgIC8qDQogICAgICAgICAgICAgICAgKiogc2luY2UgdGhpcyBi\nZWdpbnMgd2l0aCBhIHdoaXRlc3BhY2UsIGl0IG1lYW5zIHRoZSANCiAgICAg\nICAgICAgICAgICAqKiBwcmV2aW91cyBsaW5lIGlzIGNvbnRpbnVlZCBvbiB0\naGlzIGxpbmUsIGxlYXZlIG9ubHkgDQogICAgICAgICAgICAgICAgKiogb25l\nIHNwYWNlIGNoYXJhY3RlciBhbmQgZ28hIA0KICAgICAgICAgICAgICAgICov\nDQogICAgICAgICAgICAgICAgY2hhciAqcHRyPWxpbmU7DQogICAgICAgICAg\nICAgICAgd2hpbGUgKGlzc3BhY2UoKnB0cikpDQogICAgICAgICAgICAgICAg\nICAgICBwdHIrKzsNCiAgICAgICAgICAgICAgICBwdHItLTsgLyogbGVhdmUg\nb25lIHNwYWNlICovDQogICAgICAgICAgICAgICAgKnB0cj0nICc7IC8qIG1h\na2UgaXQgYSB0cnVlIHNwYWNlLCBubyB0YWJzIGhlcmUhICovDQojaWYgMA0K\nICAgICAgICAgICAgICAgIGRlY29kZVJGQzIwNDcocHRyKzEsIE1BWExJTkUt\nKHB0cisyLWxpbmUpKTsNCiNlbmRpZg0KICAgICAgICAgICAgICAgIGJwID0g\nKHN0cnVjdCBib2R5ICopIGFkZGJvZHkoYnAsICZscCwgcHRyLA0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9EWV9DT05USU5V\nRXxCT0RZX0hFQURFUnxib2R5ZmxhZ3MpOw0KICAgICAgICAgICAgfQ0KICAN\nCiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmVbMF0gPT0gJ1xuJykgew0KICAg\nICAgICAgICAgICAgIHN0cnVjdCBib2R5ICpoZWFkOw0KDQogICAgICAgICAg\nICAgICAgY2hhciBzYXZlYWx0ZXJuYXRpdmU7DQoNCiAgICAgICAgICAgICAg\nICAvKiANCiAgICAgICAgICAgICAgICAqKiB3ZSBtYXJrIHRoaXMgYXMgYSBo\nZWFkZXItbGluZSwgYW5kIHdlIHVzZSBpdCB0byANCiAgICAgICAgICAgICAg\nICAqKiB0cmFjayBlbmQtb2YtaGVhZGVyIGRpc3BsYXlzIA0KICAgICAgICAg\nICAgICAgICovDQogICAgICAgICAgICAgICAgYnAgPSAoc3RydWN0IGJvZHkg\nKikgYWRkYm9keShicCwgJmxwLCBsaW5lLCANCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgQk9EWV9IRUFERVJ8Ym9keWZsYWdzKTsN\nCiAgICAgICAgICAgICAgICBpc2luaGVhZGVyLS07DQoNCiAgICAgICAgICAg\nICAgICAvKg0KICAgICAgICAgICAgICAgICoqIFRoaXMgc2lnbmFscyB1cyB0\naGF0IHdlIGFyZSBubyBsb25nZXIgaW4gdGhlIGhlYWRlciwgDQogICAgICAg\nICAgICAgICAgKiogbGV0J3MgZmlsbCBpbiBhbGwgdGhvc2UgZmllbGRzIHdl\nIGFyZSBpbnRlcmVzdGVkIGluLiANCiAgICAgICAgICAgICAgICAqKiBQYXJz\nZSB0aGUgaGVhZGVycyB1cCB0byBub3cgYW5kIGNvcHkgdG8gdGhlIHRhcmdl\ndCANCiAgICAgICAgICAgICAgICAqKiB2YXJpYWJsZXMgDQogICAgICAgICAg\nICAgICAgKi8NCiAgDQogICAgICAgICAgICAgICAgZm9yIChoZWFkID0gYnA7\nIGhlYWQ7IGhlYWQ9aGVhZC0+bmV4dCkgew0KICAgICAgICAgICAgICAgICAg\nICBpZiAoaGVhZC0+aGVhZGVyICYmICFoZWFkLT5kZW1pbWVkICYmIE1pbWVf\nQikgew0KICAgICAgICAgICAgICAgICAgICAgICBoZWFkLT5saW5lID0gbWRl\nY29kZVJGQzIwNDcoaGVhZC0+bGluZSwNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihoZWFkLT5s\naW5lKSk7DQogICAgICAgICAgICAgICAgICAgICAgIGhlYWQtPmRlbWltZWQ9\nVFJVRTsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiAqLw0KICAgICAgICAgICAg\nICAgICAgICB9DQogIA0KICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZC0+\nYXR0YWNoZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7\nDQogICAgICAgICAgICAgICAgICAgIH0NCiAgDQogICAgICAgICAgICAgICAg\nICAgIGlmICghc3RybmNhc2VjbXAoaGVhZC0+bGluZSwgIkRhdGU6IiwgNSkp\nIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweW1heChkYXRlLCAo\nY2hhciAqKWdldG1haWxkYXRlKGhlYWQtPmxpbmUpLCANCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVTVFJMRU4pOw0KICAgICAg\nICAgICAgICAgICAgICAgICAgaGFzZGF0ZSA9IDE7DQogICAgICAgICAgICAg\nICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5j\nYXNlY21wKGhlYWQtPmxpbmUsICJGcm9tOiIsIDUpKSB7DQogICAgICAgICAg\nICAgICAgICAgICAgICBnZXRuYW1lKGhlYWQtPmxpbmUsIG5hbWUsIGVtYWls\nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg\nICBlbHNlIGlmICghc3RybmNhc2VjbXAoaGVhZC0+bGluZSwgIk1lc3NhZ2Ut\nSWQ6IiwgMTEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHlt\nYXgobXNnaWQsKGNoYXIgKilnZXRpZChoZWFkLT5saW5lKSxNU0dEU1RSTEVO\nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAg\nICBlbHNlIGlmICghc3RybmNhc2VjbXAoaGVhZC0+bGluZSwgIlN1YmplY3Q6\nIiwgOCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweW1heChz\ndWJqZWN0LChjaGFyICopZ2V0c3ViamVjdChoZWFkLT5saW5lKSwgDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCSlNUUkxFTik7DQog\nICAgICAgICAgICAgICAgICAgICAgICBoYXNzdWJqZWN0ID0gMTsNCiAgICAg\nICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlm\nICghc3RybmNhc2VjbXAoaGVhZC0+bGluZSwgIkluLVJlcGx5LVRvOiIsIDEy\nKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5bWF4KGlucmVw\nbHksKGNoYXIgKilnZXRyZXBseShoZWFkLT5saW5lKSwgDQogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgUkVQWVNUUkxFTik7DQogICAgICAg\nICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAo\nIXN0cm5jYXNlY21wKGhlYWQtPmxpbmUsICJSZWZlcmVuY2VzOiIsIDExKSkg\new0KICAgICAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAg\nICAgICAgICAgICoqIEFkZGluZyB0aHJlYWRpbmcgY2FwYWJpbGl0eSBmb3Ig\ndGhlICJSZWZlcmVuY2VzIiANCiAgICAgICAgICAgICAgICAgICAgICAgICoq\nIGhlYWRlciwgYWxhIFJGQyA4MjIsIHVzZWQgb25seSBmb3IgbWVzc2FnZXMg\ndGhhdCANCiAgICAgICAgICAgICAgICAgICAgICAgICoqIGhhdmUgIlJlZmVy\nZW5jZXMiIGJ1dCBkbyBub3QgaGF2ZSBhbiAiSW4tcmVwbHktdG8iDQogICAg\nICAgICAgICAgICAgICAgICAgICAqKiBmaWVsZC4gVGhpcyBpcyBwYXJ0aWNh\nbGx5IGEgY29uY2Vzc2lvbiBmb3IgTmV0c2NhcGUncw0KICAgICAgICAgICAg\nICAgICAgICAgICAgKiogZW1haWwgY29tcG9zZXIsIHdoaWNoIGVycm9uZW91\nc2x5IHVzZXMgIlJlZmVyZW5jZXMiICAgICAgICAgICAgICAgICAgICAgICAg\nICoqIHdoZW4gaXQgc2hvdWxkIHVzZSAiSW4tcmVwbHktdG8iLiANCiAgICAg\nICAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgICAgICAg\nICBpZiAoISppbnJlcGx5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIHN0cmNweW1heChpbnJlcGx5LChjaGFyICopZ2V0aWQoaGVhZC0+bGluZSks\nIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBZ\nU1RSTEVOKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg\nICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghaGVhZHApDQogICAgICAg\nICAgICAgICAgICAgIGhlYWRwPWJwOw0KDQogICAgICAgICAgICAgICAgc2F2\nZWFsdGVybmF0aXZlID0gRkFMU0U7DQogICAgICAgICAgICAgICAgDQogICAg\nICAgICAgICAgICAgZm9yIChoZWFkID0gaGVhZHA7IGhlYWQ7IGhlYWQ9aGVh\nZC0+bmV4dCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNl\nY21wKCBoZWFkLT5saW5lLCAiQ29udGVudC1UeXBlOiIsIDEzKSkgew0KICAg\nICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHI9aGVhZC0+bGluZSsxMzsN\nCiAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYm91bmRhcnk7DQogICAg\nICAgICAgICAgICAgICAgICAgIGNoYXIgdHlwZVsxMjldOw0KI2RlZmluZSBE\nSVNQX0hSRUYgMQ0KI2RlZmluZSBESVNQX0lNRyAgMg0KI2RlZmluZSBESVNQ\nX0lHTk9SRSAzDQogICAgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQg\naXMgaHJlZiB0byB0aGUgYXR0YWNobWVudDogKi8NCiAgICAgICAgICAgICAg\nICAgICAgICAgY2hhciBkaXNwb3NpdGlvbj1ESVNQX0hSRUY7DQoNCiAgICAg\nICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnB0cikpDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICBwdHIrKzsNCg0KICAgICAgICAgICAg\nICAgICAgICAgICBzc2NhbmYocHRyLCAiJTEyOFteO10iLCB0eXBlKTsNCiAg\nICAgICAgICAgICAgICAgICAgICAgaWYgKChjcCA9IHN0cmNocih0eXBlLCAn\nXG4nKSkgIT0gTlVMTCkgDQogICAgICAgICAgICAgICAgICAgICAgICAgKmNw\nID0gJ1wwJzsgLyogcm0gbmV3bGluZXMgKi8NCg0KICAgICAgICAgICAgICAg\nICAgICAgICBpZihhbHRlcm5hdGl2ZXBhcnNlcikgew0KICAgICAgICAgICAg\nICAgICAgICAgICAgIC8qIFdlIGFyZSBwYXJzaW5nIGFsdGVybmF0aXZlcy4u\nLiAqLw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZmVyZWRj\nb250ZW50KHR5cGUpICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nLyogLi4uIHRoaXMgaXMgYSBwcmVmZXJlZCB0eXBlLCB3ZSB3YW50IHRvIHN0\nb3JlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIFtpbnN0\nZWFkIG9mIHRoZSBlYXJsaWVyIG9uZV0uICovDQogICAgICAgICAgICAgICAg\nICAgICAgICAgICBzdHJ1Y3QgYm9keSAqbmV4dDsNCiNpZiAwDQogICAgICAg\nICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIGlzIG1vcmUgZnVuIHRo\nYW4gdGhlIHByZXZpb3VzIG9uZVxuIiwNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICB0eXBlKTsNCiNlbmRpZg0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgd2hpbGUoYnApIHsNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgbmV4dD1icC0+bmV4dDsNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgZnJlZShicC0+bGluZSk7DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIGZyZWUoYnApOw0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICBicD1uZXh0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZHAgPSBOVUxMOw0KICAg\nICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAg\nICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC4u\nLmFuZCB0aGlzIHR5cGUgaXMgbm90IGEgcHJlZmVyZWQgb25lLiBUaHVzLCB3\nZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2hhbGwgaWdub3Jl\nIGl0IGNvbXBsZXRlbHkhICovDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICBkaXNwb3NpdGlvbiA9IERJU1BfSUdOT1JFOw0KICAgICAgICAgICAgICAg\nICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAg\nICAgICAgICAgICAgICAgICBpZiggKERJU1BfSUdOT1JFPT1kaXNwb3NpdGlv\nbikgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWNvbnRl\nbnQodHlwZSkgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9u\nJ3Qgc2F2ZSB0aGlzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgZGlz\ncG9zaXRpb24gPSBESVNQX0lHTk9SRTsNCiAgICAgICAgICAgICAgICAgICAg\nICAgICBjb250ZW50ID0gQ09OVEVOVF9JR05PUkU7DQogICAgICAgICAgICAg\nICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAo\nIXN0cm5jYXNlY21wKHR5cGUsICJ0ZXh0IiwgNCkpIHsNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAvKiANCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nKiogdGV4dCBmb2xsb3dzLCBpZ25vcmUgdGhpcyANCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgLyog\nZGVmYXVsdCBpcyBqdXN0IHBsYWluIDcvOCBiaXQgKi8NCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgZGVjb2RlID0gRU5DT0RFX05PUk1BTDsNCg0KICAg\nICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCZ0eXBl\nWzRdLCAiL2h0bWwiLCA1KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgIGNvbnRlbnQgPSBDT05URU5UX0hUTUw7DQogICAgICAgICAgICAgICAg\nICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIGNvbnRlbnQgPSBDT05URU5UX1RFWFQ7DQogICAgICAgICAgICAgICAgICAg\nICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICAgICB9DQog\nICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh0\neXBlLCAibWVzc2FnZS9yZmM4MjIiLCAxNCkpIHsNCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgIC8qIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nKiogSGVyZSBjb21lcyBhbiBhdHRhY2hlZCBtYWlsISBUaGlzIGNhbiBiZSB1\nZ2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIHNpbmNlIHRo\nZSBhdHRhY2hlZCBtYWlsIG1heSB2ZXJ5IHdlbGwgaXRzZWxmIA0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgKiogY29udGFpbiBhdHRhY2hlZCBiaW5h\ncmllcywgb3Igd2h5IG5vdCBhbm90aGVyIA0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgKiogYXR0YWNoZWQgbWFpbD8gOi0pDQogICAgICAgICAgICAg\nICAgICAgICAgICAgICAqKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nKiogV2UgbmVlZCB0byBzdG9yZSB0aGUgY3VycmVudCBib3VuZGFyeSBzZXBh\ncmF0b3IgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBpbiBvcmRl\nciB0byBnZXQgaXQgYmFjayB3aGVuIHdlJ3JlIGRvbmUgcGFyc2luZyANCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICoqIHRoaXMgcGFydGljdWxhciBt\nYWlsLCBzaW5jZSBlYWNoIGF0dGFjaGVkIG1haWwgDQogICAgICAgICAgICAg\nICAgICAgICAgICAgICAqKiB3aWxsIGhhdmUgaXRzIG93biBib3VuZGFyeSBz\nZXBhcmF0b3IgdGhhdCAqbWlnaHQqICAgICAgICAgICAgICAgICAgICAgICAg\nICAgKiogYmUgdXNlZC4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwID0gKHN0cnVjdCBi\nb2R5ICopIGFkZGJvZHkoYnAsICZscCwNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAiPFA+PFNUUk9ORz5hdHRhY2hlZCBtYWlsIGZvbGxvd3M6\nPC9TVFJPTkc+PEhSPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgQk9EWV9IVE1MSVpFRCB8IGJvZHlmbGFncyk7DQogICAgICAgICAgICAg\nICAgICAgICAgICAgICBib2R5ZmxhZ3MgfD0gQk9EWV9BVFRBQ0hFRDsNCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5oZWFkZXIgPSAyOw0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAg\nICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBp\nZiAoc3RybmNhc2VjbXAodHlwZSwgIm11bHRpcGFydC8iLCAxMCkpIHsNCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgIC8qIA0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgKiogVGhpcyBpcyBub3QgYSBtdWx0aXBhcnQgYW5kIG5v\ndCB0ZXh0IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYXR0YWNobmFtZVsxMjldOw0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaGVja3BhdGhbMjU2\nXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWU7DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlID0gTlVMTDsN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZWlzdW5pcT1G\nQUxTRTsNCiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0g\nKGNoYXIgKilzdHJzdHIocHRyLCAibmFtZT0iKTsNCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGlmIChuYW1lKSB7DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgc3NjYW5mKG5hbWUrNiwgIiUxMjhbXlwiXSIsIGF0dGFj\naG5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUg\nPSBhdHRhY2huYW1lOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSB0aGlzIGF0dGFjaGVkIG5hbWUg\nZm9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcmlu\nZzogKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJs\nZW4obmFtZSkgKyBzdHJsZW4oZGlyKSA8PSAyNTQpIHsNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgIC8qIHllcywgd2UgaGF2ZSByb29tIGlu\nIG91ciBhcnJheSAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgc3RydWN0IHN0YXQgZmlsZWluZm87DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICBjaGFyIGFsdGVyWzJdPSIiOw0KICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ZXI9J2EnOw0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWlzdW5pcT1UUlVFOw0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gew0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGNoZWNrcGF0\naCwgIiVzLyVzJXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGRpciwgYWx0ZXIsIG5hbWUpOw0KICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHdoaWxlIHRoZSBmaWxl\nIGV4aXN0IGFuZCB0cnkgYSBmZXcNCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgZmlsZSBuYW1lcyBiZWZvcmUg\nZ2l2aW5nIHVwICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgIGlmKGNvdW50ZXI+PSd6Jykgew0KICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgIC8qIHdlIGRpZG4ndCBmaW5kIGEgdW5pcXVlIGZp\nbGUgbmFtZSAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgIG5hbWVpc3VuaXE9RkFMU0U7DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgc3ByaW50ZihhbHRlciwgIiVjIiwgY291bnRlcisrKTsNCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCA9PSBsc3Rh\ndChjaGVja3BhdGgsICZmaWxlaW5mbykpOw0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGlmKERJU1BfSUdOT1JFICE9IGRpc3Bv\nc2l0aW9uKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIA0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBTYXZpbmcgb2YgdGhl\nIGF0dGFjaG1lbnRzIGlzIGJlaW5nIGRvbmUgaW5saW5lICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgKiogYXMgdGhleSBhcmUgZW5jb3VudGVyZWQu\nIFRoZSBkaXJlY3RvcmllcyBtdXN0IA0KICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAqKiBleGlzdCBmaXJzdC4uLg0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAqLw0KICANCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgaWYoIW5hbWVpc3VuaXEpDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgLyogZ2V0IGEgcmFuZG9tIG5hbWUgKi8NCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICBiaW5uYW1lID0gdG1wbmFtZShkaXIsICJiaW4i\nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGJpbm5hbWUgPSBjaGVja3BhdGg7\nDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbm5hbWUp\nIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5maWxlPW9w\nZW4oYmlubmFtZSwgT19XUk9OTFl8T19DUkVBVCwgZmlsZW1vZGUpOw0KDQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoLTEgIT0gYmluZmls\nZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2htb2Qo\nYmlubmFtZSwgZmlsZW1vZGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgaWYoc2hvd3Byb2dyZXNzKQ0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICBwcmludGYoIlxuQ3JlYXRlZCBmaWxlICVzIHdp\ndGggbW9kZSAlb1xuIiwgYmlubmFtZSwgZmlsZW1vZGUpOw0KICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgIH0NCg0KI2lmIDENCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICBmaWxlPShjaGFyICopc3RycmNocihiaW5u\nYW1lLCBQQVRIX1NFUEFSQVRPUik7DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgaWYgKGZpbGUpDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICBmaWxlKys7IC8qIHBhc3MgdGhlIHNlcGFyYXRvciAqLw0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGZpbGU9YmlubmFtZTsNCiNlbHNlDQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9YmlubmFtZTsN\nCiNlbmRpZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpbmxpbmVjb250ZW50KHR5\ncGUpICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlm\nIHdlIGtub3cgb3VyIGJyb3dzZXJzIGNhbiBzaG93IHRoaXMNCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG9mIGNvbnRleHQgYXMt\naXMsIHdlIG1ha2UgYSA8aW1nPiB0YWcNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICBpbnN0ZWFkIG9mIDxhIGhyZWY+ISAqLw0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uID0gRElTUF9J\nTUc7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRm\nKGxpbmUsICIlczxJTUcgU1JDPVwiJXNcIiBBTFQ9XCIlc1wiPiIsDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvd2hyID8g\nIjxIUj5cbiIgOiAiIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICBmaWxlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgbmFtZSA/IG5hbWUgOiAicGljdHVyZSIpOw0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgIHNwcmludGYobGluZSwgIiVzPFVMPlxuPExJPiVzIGF0dGFjaG1lbnQ6\nIDxBIEhSRUY9XCIlc1wiPiVzPC9BPlxuPC9VTD5cbiIsDQogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvd2hyID8gIjxIUj5c\nbiIgOiAiIiksIHR5cGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgZmlsZSA/IGZpbGUgOiAiPHZvaWQ+IiwgDQogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID8gbmFtZSA6\nICJzdG9yZWQiKTsNCiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAgPSAoc3RydWN0\nIGJvZHkgKikgYWRkYm9keShicCwgJmxwLCBsaW5lLA0KICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIEJPRFlfSFRNTElaRUR8Ym9keWZsYWdzKTsNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgc3ByaW50ZihhdHRhY2huYW1lLCAiPCEtLSBhdHRhY2ht\nZW50PVwiJS44MHNcIiAtLT5cbiIsDQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgZmlsZSk7DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIGJwID0gKHN0cnVjdCBib2R5ICopIGFkZGJvZHkoYnAsICZscCwg\nYXR0YWNobmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX0hUTUxJWkVEfGJvZHlm\nbGFncyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgfQ0KICANCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgIGlmKERJU1BfSUdOT1JFID09IGRpc3Bvc2l0aW9uKSB7DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBDT05URU5U\nX0lHTk9SRTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICBpZiAoYmlubmFtZSAmJiAoYmluZmlsZSE9LTEpKQ0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBDT05U\nRU5UX0JJTkFSWTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxz\nZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBD\nT05URU5UX1VOS05PV047DQogICAgICAgICAgICAgICAgICAgICAgICAgICB9\nDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWVpc3VuaXEg\nJiYgYmlubmFtZSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJl\nZShiaW5uYW1lKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgIH0N\nCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAg\nICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgICAgICAqKiBG\naW5kIHRoZSBmaXJzdCBib3VuZGFyeSBzZXBhcmF0b3IgDQogICAgICAgICAg\nICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgDQogICAgICAgICAgICAg\nICAgICAgICAgICAgYm91bmRhcnk9c3RyY2FzZXN0cihwdHIsICJib3VuZGFy\neT0iKTsNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAg\nICAgaWYgKGJvdW5kYXJ5KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg\nICBib3VuZGFyeT0oY2hhciAqKXN0cmNocihib3VuZGFyeSwgJz0nKTsNCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib3VuZGFyeSkgew0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSsrOw0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgqYm91bmRh\ncnkpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5\nKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnXCInID09\nICpib3VuZGFyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIHNzY2FuZigrK2JvdW5kYXJ5LCAiJVteXCJdIiwgYm91bmRidWZmZXIpOw0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgc3NjYW5mKGJvdW5kYXJ5LCAiJXMiLCBib3VuZGJ1ZmZl\ncik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0g\nYm91bmRidWZmZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICB9DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBNQVhMSU5FLCBmcCkpIHsN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGxp\nbmUsICItLSIsIDIpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAhc3RybmNtcChsaW5lKzIsIGJvdW5kYnVmZmVyLCANCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihib3Vu\nZGJ1ZmZlcikpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgIH0NCiAgDQogICAgICAgICAgICAgICAg\nICAgICAgICAgICAvKiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoq\nIFRoaXMgc3RvcmVzIHRoZSBib3VuZGFyeSBzdHJpbmcgaW4gYSBzdGFjayAN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIG9mIHN0cmluZ3M6IA0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGJvdW5kcCA9IGJvdW5kKGJvdW5kcCwgYm91bmRidWZm\nZXIpOw0KICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50\nZigic2V0IG5ldyBib3VuZGFyeTogJXNcbiIsIGJvdW5kcC0+bGluZSk7ICov\nDQogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgICoqIFdlIHNldCBvdXJzZWx2ZXMsICJiYWNr\nIGluIGhlYWRlciIgc2luY2UgdGhlcmUgaXMgICAgICAgICAgICAgICAgICAg\nICAgICAgICAqKiBnb25uYSBjb21lIE1JTUUgaGVhZGVycyBub3cgYWZ0ZXIg\ndGhlIHNlcGFyYXRvcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8N\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5oZWFkZXIgPSAxOw0K\nDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhbmllbCBTdGVu\nYmVyZyBzdGFydGVkIGFkZGluZyB0aGUNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAqICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiIHBhcnNlciAxM3Ro\nIG9mIEp1bHkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE5OTgh\nICBXZSBjaGVjayBpZiB0aGlzIGlzIGEgJ211bHRpcGFydC8NCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAqIGFsdGVybmF0aXZlJyBoZWFkZXIsIGlu\nIHdoaWNoIGNhc2Ugd2UgbmVlZCB0bw0KICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICogdHJlYXQgaXQgdmVyeSBzcGVjaWFsLiAgKi8NCg0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgaWYoIXN0cm5jYXNlY21wKCZwdHJbMTBd\nLCAiYWx0ZXJuYXRpdmUiLCAxMSkpIHsNCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgLyogSXQgKmlzKiBhbiBhbHRlcm5hdGl2ZSBzZXNzaW9uISAg\nQWx0ZXJuYXRpdmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog\nbWVhbnMgdGhlcmUgd2lsbCBiZSBYIHBhcnRzIHdpdGggdGhlIHNhbWUgdGV4\ndA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1c2luZyBkaWZm\nZXJlbnQgY29udGVudC10eXBlcy4gV2UgYXJlIHN1cHBvc2VkDQogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHRha2UgdGhlIG1vc3QgcHJl\nZmVyZWQgZm9ybWF0IG9mIHRoZSBvbmVzDQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAqIHVzZWQgYW5kIG9ubHkgb3V0cHV0IHRoYXQgb25lLiBN\nSU1FIGRlZmluZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog\ndGhlIG9yZGVyIG9mIHRoZSB0ZXh0cyB0byBzdGFydCB3aXRoIHB1cmUgdGV4\ndA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgdGhlbiBj\nb250aW51ZSB3aXRoIG1vcmUgYW5kIG1vcmUgb2JzY3VyZQ0KICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgKiBmb3JtYXRzLiAod2VsbCwgaXQgZG9l\nc24ndCB1c2UgdGhvc2UgdGVybXMgYnV0DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAqIHRoYXQncyB3aGF0IGl0IG1lYW5zISA7LSkpICovDQoN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG93ICJ3ZSIgYXJl\nIGdvbm5hIGRlYWwgd2l0aCB0aGVtOg0KICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBX\nZSBjcmVhdGUgYSAic3BhcmUiIGxpbmtlZCBsaXN0IGJvZHkgZm9yIHRoZQ0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2ZXJ5IGZpcnN0IHBh\ncnQuIFNpbmNlIHRoZSBmaXJzdCBwYXJ0IGlzDQogICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAqIGRlZmluZWQgdG8gYmUgdGhlIG1vc3QgcmVhZGFi\nbGUsIHdlIHNhdmUgdGhhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgKiBpbiBjYXNlIG5vIGNvbnRlbnQtdHlwZSBwcmVzZW50IGlzIHByZWZl\ncmVkIQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSBza2lwIGFsbCBwYXJ0cyB0\naGF0IGFyZSBub3QgcHJlZmVyZWQuIEFsbA0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgKiBwcmVmZXJlZCBwYXJ0cyBmb3VuZCB3aWxsIHJlcGxh\nY2UgdGhlIGZpcnN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq\nIG9uZSB0aGF0IGlzIHNhdmVkLiBXaGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGFsdGVybmF0\naXZlcywgd2Ugd2lsbCB1c2UgdGhlIGxhc3Qgc2F2ZWQNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICogb25lIGFzIHByZWZlcmVkLg0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgKiAqLw0KDQogICAgICAgICAgICAg\nICAgICAgICAgICAgICAgIHNhdmVhbHRlcm5hdGl2ZSA9IFRSVUU7DQojaWYg\nMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNBVkVB\nTFRFUk5BVElWRTogeWVzXG4iKTsNCiNlbmRpZiAgICAgICAgICAgDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAg\nICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgIGJvdW5kYXJ5ID0gTlVMTDsNCiAgICAgICAgICAgICAgICAg\nICAgICAgfQ0KICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg\nICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAoaGVhZC0+bGluZSwgIkNvbnRl\nbnQtVHJhbnNmZXItRW5jb2Rpbmc6IiwgMjYpKSB7DQogICAgICAgICAgICAg\nICAgICAgICAgIGNoYXIgKnB0cj1oZWFkLT5saW5lKzI2Ow0KICANCiAgICAg\nICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnB0cikpDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICBwdHIrKzsNCiAgICAgICAgICAgICAg\nICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChwdHIsICJRVU9URUQtUFJJTlRB\nQkxFIiwgMTYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNv\nZGUgPSBFTkNPREVfUVA7DQogICAgICAgICAgICAgICAgICAgICAgIH0NCiAg\nICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHB0\nciwgIkJBU0U2NCIsIDYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg\nICBkZWNvZGUgPSBFTkNPREVfQkFTRTY0Ow0KICAgICAgICAgICAgICAgICAg\nICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJu\nY2FzZWNtcChwdHIsICI4QklUIiwgNCkpIHsNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgIGRlY29kZSA9IEVOQ09ERV9OT1JNQUw7DQogICAgICAgICAg\nICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBp\nZiAoIXN0cm5jYXNlY21wKHB0ciwgIjdCSVQiLCA0KSkgew0KICAgICAgICAg\nICAgICAgICAgICAgICAgICAgZGVjb2RlID0gRU5DT0RFX05PUk1BTDsNCiAg\nICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAg\nICBlbHNlIGlmICghc3RybmNhc2VjbXAocHRyLCAieC11dWUiLCA1KSkgew0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlID0gRU5DT0RFX1VV\nRU5DT0RFOw0KICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1\ndWRlY29kZShmcCwgbGluZSwgbGluZSwgTlVMTCwgVFJVRSkpDQogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAqKiBvaCBnZWUsIHdlIGZhaWxlZCB0aGlzIGlzIGNo\nYW9zICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7\nDQogICAgICAgICAgICAgICAgICAgICAgIH0gIA0KICAgICAgICAgICAgICAg\nICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q\nIHRoaXMgaXMgYW4gdW5rbm93biBmb3JtYXQsIHdlIHVzZSBkZWZhdWx0IGRl\nY29kaW5nICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNv\nZGVbNjRdOw0KICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2Fu\nZihwdHIsICIlNjNzIiwgY29kZSk7DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICBzcHJpbnRmKGxpbmUsICIgKCclcycgZW5jb2RpbmcgaXMgbm90IHN1\ncHBvcnRlZCwgc3RvcmVkIGFzLWlzKVxuIiwgY29kZSk7DQogIA0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgYnAgPSAoc3RydWN0IGJvZHkgKikgYWRk\nYm9keShicCwgJmxwLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgQk9EWV9IVE1MSVpFRHxib2R5ZmxhZ3Mp\nOw0KICAgICAgICAgICAgICAgICAgICAgIH0gIA0KICAgICAgICAgICAgICAg\nICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChzYXZl\nYWx0ZXJuYXRpdmUpIHsNCiAgICAgICAgICAgICAgICAgIC8qIGxldCdzIHJl\nbWVtYmVyICdicCcgYW5kICdscCcgKi8NCg0KICAgICAgICAgICAgICAgICAg\nb3JpZ2JwPWJwOw0KICAgICAgICAgICAgICAgICAgb3JpZ2xwPWxwOw0KDQog\nICAgICAgICAgICAgICAgICBmaXJzdGJwPU5VTEw7IC8qIHJlc2V0IHRoaXMg\nKi8NCiAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlcGFyc2VyID0gVFJV\nRTsNCg0KICAgICAgICAgICAgICAgICAgLyogcmVzdGFydCBvbiBhIG5ldyBs\naXN0OiAqLw0KICAgICAgICAgICAgICAgICAgbHA9YnA9TlVMTDsNCiAgICAg\nICAgICAgICAgfQ0KICAgICAgICAgICAgICBoZWFkcCA9IGxwOyAvKiBzdGFy\ndCBhdCB0aGlzIHBvaW50IG5leHQgdGltZSAqLw0KICAgICAgICAgIH0NCiAg\nICAgICAgICBlbHNlIHsNCiNpZiAwDQogICAgICAgICAgICAgIGRlY29kZVJG\nQzIwNDcobGluZSwgTUFYTElORSk7DQojZW5kaWYNCiAgICAgICAgICAgICAg\nYnAgPSAoc3RydWN0IGJvZHkgKikgYWRkYm9keShicCwgJmxwLCBsaW5lLCBC\nT0RZX0hFQURFUnxib2R5ZmxhZ3MpOw0KICAgICAgICAgICAgfQ0KICAgICAg\nICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgaWYgKCFzdHJuY21w\nKGxpbmUsICJGcm9tICIsIDUpICYmIChvbGRsaW5lWzBdPT0nXG4nKSkgew0K\nICAgICAgICAgICAgICAgIGlmIChyZWFkb25lKQ0KICAgICAgICAgICAgICAg\nICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKG9s\nZGxpbmUsICJGb3J3YXJkZWQgbWVzc2FnZToiKSkgew0KICAgICAgICAgICAg\nICAgICAgICBvbGRsaW5lWzBdID0gJ1wwJzsNCiAgICAgICAgICAgICAgICAg\nICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg\nICAgIGlzaW5oZWFkZXIgPSAxOw0KI2lmIDANCiAgICAgICAgICAgICAgICB3\nYXNpbnJlcGx5ID0gMDsNCiNlbmRpZg0KICAgICAgICAgICAgICAgIGlmICgh\naGFzc3ViamVjdCkNCiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN1Ympl\nY3QsIE5PU1VCSkVDVCk7DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAg\nICAgICAgICAgICAgICBoYXNzdWJqZWN0ID0gMTsNCiAgDQogICAgICAgICAg\nICAgICAgaWYgKCFoYXNkYXRlKQ0KICAgICAgICAgICAgICAgICAgICBzdHJj\ncHkoZGF0ZSwgTk9EQVRFKTsNCiAgICAgICAgICAgICAgICBlbHNlDQogICAg\nICAgICAgICAgICAgICAgIGhhc2RhdGUgPSAxOw0KICANCiAgICAgICAgICAg\nICAgICBpZiAoaW5yZXBseVswXSA9PSAnXDAnKQ0KICAgICAgICAgICAgICAg\nICAgICBvbmV1bnJlKGlucmVwbHksIHN1YmplY3QpOw0KICANCiAgICAgICAg\nICAgICAgICB3aGlsZSAocm1sYXN0bGluZXMoYnApKTsNCiAgICAgICAgICAg\nICAgICBhZGRoYXNoKG51bSxkYXRlLG5hbWUsZW1haWwsbXNnaWQsc3ViamVj\ndCxpbnJlcGx5LGZyb21kYXRlLGJwKTsgICAgICAgICAgICAgICAgYXV0aG9y\nbGlzdCA9IChzdHJ1Y3QgaGVhZGVyICopDQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgYWRkaGVhZGVyKGF1dGhvcmxpc3QsIG51bSwgbmFtZSwgc3Vi\namVjdCwgZGF0ZSwgMSk7ICAgICAgICAgICAgICAgIHN1YmplY3RsaXN0ID0g\nKHN0cnVjdCBoZWFkZXIgKikNCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nICBhZGRoZWFkZXIoc3ViamVjdGxpc3QsbnVtLG5hbWUsdW5yZShzdWJqZWN0\nKSxkYXRlLDApOw0KICAgICAgICAgICAgICAgIGRhdGVsaXN0ID0gKHN0cnVj\ndCBoZWFkZXIgKikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRo\nZWFkZXIoZGF0ZWxpc3QsIG51bSwgbmFtZSwgc3ViamVjdCwgZnJvbWRhdGUs\nIDIpOw0KICAgICAgICAgICAgICAgIHN0cmNweW1heChmcm9tZGF0ZSwgKGNo\nYXIgKikgZ2V0ZnJvbWRhdGUobGluZSksIERBVEVTVFJMRU4pOw0KICAgICAg\nICAgICAgDQogICAgICAgICAgICAgICAgYnAgPSBOVUxMOw0KICAgICAgICAg\nICAgICAgIG51bSsrOw0KICAgICAgICAgICAgICAgIGJvZHlmbGFncz0wOyAv\nKiByZXNldCBzdGF0ZSBmbGFncyAqLw0KICAgICANCiAgICAgICAgICAgICAg\nICAvKiBnbyBiYWNrIHRvIGRlZmF1bHQgbW9kZTogKi8NCiAgICAgICAgICAg\nICAgICBjb250ZW50ID0gQ09OVEVOVF9URVhUOw0KICAgICAgICAgICAgICAg\nIGRlY29kZSA9IEVOQ09ERV9OT1JNQUw7DQogICAgICAgICAgICAgICAgTWlt\nZV9CID0gRkFMU0U7DQogICAgICAgICAgICAgICAgaGVhZHAgPSBOVUxMOyAN\nCiAgICAgDQogICAgICAgICAgICAgICAgaWYgKCEobnVtICUgMTApICYmIHNo\nb3dwcm9ncmVzcyAmJiAhcmVhZG9uZSkgew0KICAgICAgICAgICAgICAgICAg\nICBwcmludGYoIlxiXGJcYlxiJTRkIiwgbnVtKTsNCiAgICAgICAgICAgICAg\nICAgICAgZmZsdXNoKHN0ZG91dCk7DQogICAgICAgICAgICAgICAgfQ0KICAg\nICAgICAgICAgICAgIGlucmVwbHlbMF0gPSAnXDAnOw0KICAgICAgICAgICAg\nfQ0KICAgICAgICAgICAgZWxzZSB7IC8qIGRlY29kZSBNSU1FIGNvbXBsaWVu\ndCBnaWJiZXJpc2ggKi8NCiAgICAgICAgICAgICAgICBjaGFyIG5ld2J1ZmZl\ncltNQVhMSU5FXTsNCiAgICAgICAgICAgICAgICBjaGFyICpkYXRhOw0KICAg\nICAgICAgICAgICAgIGludCBkYXRhbGVuPS0xOyAvKiAtMSBtZWFucyB1c2Ug\nc3RybGVuIHRvIGdldCBsZW5ndGggKi8NCiAgICANCiAgICAgICAgICAgICAg\nICBpZiAoTWltZV9CKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChib3Vu\nZHAgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKGxpbmUs\nICItLSIsIDIpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAhc3RybmNt\ncChsaW5lKzIsIGJvdW5kcC0+bGluZSwgc3RybGVuKGJvdW5kcC0+bGluZSkp\nKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHQgYXQgdGhpcyBw\nb2ludCwgd2UgaGF2ZSBhbm90aGVyIHBhcnQgY29taW5nIHVwICovDQogICAg\nICAgICAgICAgICAgICAgICAgICBpc2luaGVhZGVyID0gMTsgLyogYmFjayBv\nbiBhIGtpbmQtb2YtaGVhZGVyICovDQoNCiNpZiAwICAgIA0KICAgICAgICAg\nICAgICAgICAgICAgICAgcHJpbnRmKCJoaXQgJXNcbiIsIGxpbmUpOw0KI2Vu\nZGlmDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobGlu\nZSsyK3N0cmxlbihib3VuZHAtPmxpbmUpLCAiLS0iLCAyKSkgew0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGJwID0gKHN0cnVjdCBib2R5ICopIGFk\nZGJvZHkoYnAsICZscCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICBCT0RZX0hUTUxJWkVEfGJvZHlm\nbGFncyk7DQogICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91\nbmRwID0gYm91bmQoYm91bmRwLCBOVUxMKTsNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICBpZiAoIWJvdW5kcCkgew0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICBib2R5ZmxhZ3MgJj0gfkJPRFlfQVRUQUNIRUQ7DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGlmKGFsdGVybmF0aXZlcGFyc2VyKSB7DQogICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYm9keSAqbmV4dDsNCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIG5vIGxvbmdlciBo\nYXZlIGFsdGVybmF0aXZlcyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgYWx0ZXJuYXRpdmVwYXJzZXIgPSBGQUxTRTsNCiNpZiAwDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIldlIERVTVAgYW4g\nb2xkIGFsdGVybmF0aXZlXG4iKTsNCiNlbmRpZg0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgd2hpbGUoYnApIHsNCiAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgb3JpZ2JwID0gYWRkYm9keShvcmlnYnAsICZvcmln\nbHAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgYnAtPmxpbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgKGJwLT5oZWFkZXI/Qk9EWV9IRUFE\nRVI6MCl8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgKGJwLT5odG1sP0JPRFlfSFRNTElaRUQ6MCl8DQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nKGJwLT5hdHRhY2hlZD9CT0RZX0FUVEFDSEVEOjApDQogICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dD0gYnAtPm5leHQ7DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnAtPmxpbmUp\nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGJwKTsN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnA9bmV4dDsNCiAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgIGJwID0gb3JpZ2JwOw0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgbHAgPSBvcmlnbHA7DQoNCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgIGhlYWRwPSBOVUxMOw0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIH0NCiNpZiAwDQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgaWYgKGJvdW5kcCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgcHJpbnRmKCJiYWNrICVzXG4iLCBib3VuZHAtPmxpbmUpOw0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYWNrIHRvIE5PTkVcbiIpOw0K\nI2VuZGlmDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgDQogICAg\nICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT0gYmluZmlsZSkgew0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGJpbmZpbGUpOw0KICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmZpbGU9LTE7DQogICAgICAg\nICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBj\nb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAg\nICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCBkZWNvZGUg\nKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgRU5DT0RFX1FQOg0KI2lm\nIDANCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVRUChmcCwgbGlu\nZSwgbmV3YnVmZmVyLCBNQVhMSU5FKTsNCiAgICAgICAgICAgICAgICAgICAg\nICAgICBkYXRhID0gbmV3YnVmZmVyOw0KI2Vsc2UNCiAgICAgICAgICAgICAg\nICAgICAgICAgICBtZGVjb2RlUVAoZnAsIGxpbmUsICZkYXRhLCAmZGF0YWxl\nbik7DQojZW5kaWYNCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsN\nCiAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkNPREVfQkFTRTY0Og0KICAg\nICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NERlY29kZShsaW5lLCBuZXdi\ndWZmZXIsICZkYXRhbGVuKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICBk\nYXRhID0gbmV3YnVmZmVyOw0KICAgICAgICAgICAgICAgICAgICAgICAgIGJy\nZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIEVOQ09ERV9VVUVOQ09E\nRToNCiAgICAgICAgICAgICAgICAgICAgICAgICB1dWRlY29kZShOVUxMLCBs\naW5lLCBuZXdidWZmZXIsICZkYXRhbGVuLCBGQUxTRSk7DQogICAgICAgICAg\nICAgICAgICAgICAgICAgZGF0YSA9IG5ld2J1ZmZlcjsNCiAgICAgICAgICAg\nICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2Fz\nZSBFTkNPREVfTk9STUFMOg0KICAgICAgICAgICAgICAgICAgICAgICAgIGRh\ndGEgPSBsaW5lOw0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0K\nICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAg\nICAgICAgICAgIC8qIHdlIGhhdmUgbm8gY2x1ZSEgKi8NCiAgICAgICAgICAg\nICAgICAgICAgICAgICBkYXRhID0gTlVMTDsNCiAgICAgICAgICAgICAgICAg\nICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAg\nICAgICAgaWYgKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChj\nb250ZW50ID09IENPTlRFTlRfVEVYVCkgfHwgKGNvbnRlbnQ9PUNPTlRFTlRf\nSFRNTCkpIHsgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlID4g\nRU5DT0RFX01VTFRJTElORUQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAvKiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBUaGlz\nIGNhbiBiZSBtb3JlIHRoYW4gb25lIHJlc3VsdGluZyBsaW5lLCANCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAqKiBhcyB0aGUgZGVjb2RlZCB0aGUg\nc3RyaW5nIG1heSBsb29rIGxpa2U6DQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIiMhL2Jpbi9zaFxyXG5cclxuaGVscCgpIHtcclxuIGVjaG8gJ1Vz\nYWdlOiBkaWZmdHJlZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAq\nLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnA9ZGF0YTsN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuOw0KICAgICAg\nICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc3RvcmU7DQogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgd2hpbGUgKChuID0gKGNoYXIgKilzdHJjaHIo\ncCwgJ1xuJykpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICBzdG9yZSA9IG5bMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICBuWzFdPTA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICBicCA9IChzdHJ1Y3QgYm9keSAqKSBhZGRib2R5KGJwLCAmbHAsIHAsDQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo\nbXVsdGlsaW5lbm9lbmQ/Qk9EWV9DT05USU5VRTowKXwNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlmbGFncyk7\nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVu\nb2VuZCA9IEZBTFNFOyAvKiBmdWxsIGxpbmUgcHVzaGVkICovICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgblsxXT1zdG9yZTsNCiAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuKzE7DQogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAg\nICAgIGlmIChzdHJsZW4ocCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgLyogDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICoqIFRoaXMgbGluZSBkb2Vzbid0IHJlYWxseSBlbmQgaGVyZSwgDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIHdlIHdpbGwgZ2V0IGFu\nb3RoZXIgbGluZSBzb29uIHRoYXQgDQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICoqIHNob3VsZCBnZXQgYXBwZW5kZWQhIA0KICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICBicCA9IChzdHJ1Y3QgYm9keSAqKSBhZGRib2R5KGJw\nLCAmbHAsIHAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAobXVsdGlsaW5lbm9lbmQ/Qk9EWV9DT05USU5VRTowKXwN\nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nIGJvZHlmbGFncyk7DQogICAgDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIC8qDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoq\nIFdlIHdhbnQgdGhlIG5leHQgbGluZSB0byBnZXQgYXBwZW5kZWQgdG8gdGhp\ncyENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lbm9lbmQgPSBU\nUlVFOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAg\nICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVs\nc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwID0gKHN0cnVj\ndCBib2R5ICopIGFkZGJvZHkoYnAsICZscCwgZGF0YSwgDQogICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ9PUNP\nTlRFTlRfSFRNTD8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICBCT0RZX0hUTUxJWkVEOjApIHwgYm9keWZsYWdzICk7DQog\nICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAg\nIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudCA9PSBD\nT05URU5UX0JJTkFSWSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYg\nKC0xICE9IGJpbmZpbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nICBpZiAoZGF0YWxlbiA8IDApDQogICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgIGRhdGFsZW4gPSBzdHJsZW4oZGF0YSk7DQogICAgICAgICAgICAg\nICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmd3JpdGUoZGF0\nYSwgZGF0YWxlbiwgMSwgYmluZmlsZSk7ICovDQogICAgICAgICAgICAgICAg\nICAgICAgICAgICAgd3JpdGUoYmluZmlsZSwgZGF0YSwgZGF0YWxlbik7DQog\nICAgICAgICAgICAgICAgICAgICAgICAgICAgLypicCA9IChzdHJ1Y3QgYm9k\neSAqKSBhZGRib2R5KGJwLCAiZmlsZSBjb250ZW50cyIpOyovDQogICAgICAg\nICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAg\nICANCiAgICAgICAgICAgICAgICAgICAgaWYgKEVOQ09ERV9RUCA9PSBkZWNv\nZGUpDQogICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGRhdGEpOyAvKiB0\naGlzIHdhcyBhbGxvY2F0ZCBieSBtZGVjb2RlUVAoKSAqLw0KICAgICAgICAg\nICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBz\ndHJjcHltYXgob2xkbGluZSwgbGluZSwgTUFYTElORSk7DQogICAgfQ0KDQog\nICAgaWYgKCFpc2luaGVhZGVyKSB7DQogICAgICAgIGlmICghaGFzc3ViamVj\ndCkNCiAgICAgICAgICAgIHN0cmNweShzdWJqZWN0LCBOT1NVQkpFQ1QpOw0K\nDQogICAgICAgIGlmICghaGFzZGF0ZSkNCiAgICAgICAgICAgIHN0cmNweShk\nYXRlLCBOT0RBVEUpOw0KDQogICAgICAgIGlmIChpbnJlcGx5WzBdID09ICdc\nMCcpDQogICAgICAgICAgICBvbmV1bnJlKGlucmVwbHksIHN1YmplY3QpOw0K\nDQogICAgICAgIHdoaWxlIChybWxhc3RsaW5lcyhicCkpOw0KDQogICAgICAg\nIGFkZGhhc2gobnVtLCBkYXRlLCBuYW1lLCBlbWFpbCwgbXNnaWQsIHN1Ympl\nY3QsIGlucmVwbHksIGZyb21kYXRlLCBicCk7DQogICAgICAgIGF1dGhvcmxp\nc3QgPSAoc3RydWN0IGhlYWRlciAqKQ0KICAgICAgICAgICAgICAgICAgICAg\nIGFkZGhlYWRlcihhdXRob3JsaXN0LCBudW0sIG5hbWUsIHN1YmplY3QsIGRh\ndGUsIDEpOw0KICAgICAgICBzdWJqZWN0bGlzdCA9IChzdHJ1Y3QgaGVhZGVy\nICopDQogICAgICAgICAgICAgICAgICAgICAgYWRkaGVhZGVyKHN1YmplY3Rs\naXN0LCBudW0sIG5hbWUsIHVucmUoc3ViamVjdCksIGRhdGUsIDApOw0KICAg\nICAgICBkYXRlbGlzdCA9IChzdHJ1Y3QgaGVhZGVyICopIA0KICAgICAgICAg\nICAgICAgICAgICAgIGFkZGhlYWRlcihkYXRlbGlzdCwgbnVtLCBuYW1lLCBz\ndWJqZWN0LCBmcm9tZGF0ZSwgMik7DQogICAgICAgIG51bSsrOw0KICAgIH0N\nCiAgICANCiAgICBpZiAoc2hvd3Byb2dyZXNzICYmICFyZWFkb25lKQ0KICAg\nICAgICBwcmludGYoIlxiXGJcYlxiJTRkIGFydGljbGVzLlxuIiwgbnVtKTsN\nCiAgICANCiAgICBpZiAoIXJlYWRvbmUpDQogICAgICAgIGJpZ251bSA9IG51\nbSAtIDE7DQoNCiAgICBmY2xvc2UoZnApOw0KDQogICAgY3Jvc3NpbmRleCgp\nOw0KICAgIHRocmVhZGxpc3QgPSBOVUxMOw0KICAgIHByaW50ZWR0aHJlYWRs\naXN0ID0gTlVMTDsNCiAgICBjcm9zc2luZGV4dGhyZWFkMShkYXRlbGlzdCk7\nDQogIA0KICAgIC8qIGNhbiB3ZSBjbGVhbiB1cCBhIGJpdCBwbGVhc2UuLi4g\nKi8NCiAgDQogICAgaWYgKGJvdW5kcCAhPSBOVUxMKSB7DQogICAgICAgIGlm\nIChib3VuZHAtPmxpbmUpIA0KICAgICAgICAgICAgZnJlZShib3VuZHAtPmxp\nbmUpOw0KICAgICAgICBmcmVlKGJvdW5kcCk7DQogICAgfQ0KDQojaWYgMA0K\nICAgIGlmIChwcmludGVkdGhyZWFkbGlzdCAhPSBOVUxMKSB7DQogICAgICAg\nIHN0cnVjdCBwcmludGVkICpwcDsNCg0KICAgICAgICBkbyB7DQogICAgICAg\nICAgICBwcCA9IHByaW50ZWR0aHJlYWRsaXN0Ow0KICAgICAgICAgICAgcHJp\nbnRlZHRocmVhZGxpc3QgPSBwcmludGVkdGhyZWFkbGlzdC0+bmV4dDsNCiAg\nICAgICAgICAgIGZyZWUocHApOw0KICAgICAgICB9IHdoaWxlIChwcmludGVk\ndGhyZWFkbGlzdCk7DQogICAgfQ0KI2VuZGlmDQp9DQoNCi8qDQoqKiBBbGwg\ndGhpcyBkb2VzIGlzIGdldCBhbGwgdGhlIHJlbGV2YW50IGhlYWRlciBpbmZv\ncm1hdGlvbiBmcm9tIHRoZQ0KKiogY29tbWVudCBmaWVsZHMgaW4gZXhpc3Rp\nbmcgYXJjaGl2ZSBmaWxlcy4gRXZlcnl0aGluZyBpcyBsb2FkZWQgaW50bw0K\nKiogc3RydWN0dXJlcyBpbiB0aGUgZXhhY3Qgc2FtZSB3YXkgYXMgaWYgYXJ0\naWNsZXMgd2VyZSBiZWluZyByZWFkIGZyb20NCioqIHN0ZGluIG9yIGEgbWFp\nbGJveC4NCiovDQoNCnZvaWQgbG9hZG9sZGhlYWRlcnMoY2hhciAqZGlyKQ0K\new0KICAgIEZJTEUgKmZwOw0KICAgIGNoYXIgbmFtZVtOQU1FU1RSTEVOXSwg\nZW1haWxbTUFJTFNUUkxFTl0sIGRhdGVbREFURVNUUkxFTl0sDQogICAgICAg\nIG1zZ2lkW01TR0RTVFJMRU5dLCBzdWJqZWN0W1NVQkpTVFJMRU5dLCBpbnJl\ncGx5W1JFUFlTVFJMRU5dLA0KICAgICAgICBsaW5lW01BWExJTkVdLCBmcm9t\nZGF0ZVtEQVRFU1RSTEVOXSwgZmlsZW5hbWVbTUFYRklMRUxFTl07DQogICAg\naW50IG51bTsNCg0KICAgIHN0cnVjdCBib2R5ICpicD1OVUxMOw0KICAgIHN0\ncnVjdCBib2R5ICpscD1OVUxMOw0KDQogICAgbnVtID0gMDsNCiAgICBzcHJp\nbnRmKGZpbGVuYW1lLCAiJXMlcyUuNGQuaHRtbCIsIGRpciwgDQogICAgICAg\nICAgICAgIChkaXJbc3RybGVuKGRpcikgLSAxXSA9PSAnLycpID8gIiIgOiAi\nLyIsIG51bSk7DQoNCiAgICBicCA9IChzdHJ1Y3QgYm9keSAqKSBhZGRib2R5\nKGJwLCAmbHAsICJcMCIsIDApOw0KDQogICAgYXV0aG9ybGlzdCA9IHN1Ympl\nY3RsaXN0ID0gZGF0ZWxpc3QgPSBOVUxMOw0KDQogICAgaWYgKHNob3dwcm9n\ncmVzcykNCiAgICAgICAgcHJpbnRmKCJSZWFkaW5nIG9sZCBoZWFkZXJzLi4u\nICAgICIpOw0KDQogICAgLyoNCiAgICAqKiBXQVJOSU5HOiBUaGUgZm9sbG93\naW5nIHdoaWxlIGxvb3AgaXMgZGVwZW5kZW50IG9uIHRoZSBvcmRlciBvZiB0\naGUNCiAgICAqKiBjb21tZW50cyBpbiB0aGUgSFRNTCBmaWxlcy4gVGhlIGNv\nbW1lbnRzIG5lZWQgdG8gYmUgaW4gdGhlIG9yZGVyDQogICAgKiogcGFyc2Vk\nIGJlbG93IG9yIHRoaXMgbG9vcCBuZWVkIHRvIGJlIGNoYW5nZS4gKEl0IHJl\nYWxseSBuZWVkcyB0byBiZQ0KICAgICoqIHRvdGFsbHkgcmV3cml0dGVuIHRv\nIGJlIG1vcmUgcm9idXN0IGFuZCBmb3JnaXZpbmcuLi4gU29vbi4NCiAgICAq\nKiANCiAgICAqKiBmcm9tZGF0ZSA9PSA8IS0tIHJlY2VpdmVkPSJXZWQgSnVu\nICAzIDEwOjEyOjAwIDE5OTggQ0RUIiAtLT4NCiAgICAqKiBkYXRlICAgICA9\nPSA8IS0tIHNlbnQ9IldlZCwgMyBKdW4gMTk5OCAxMDoxMjowNyAtMDUwMCAo\nQ0RUKSIgLS0+DQogICAgKiogbmFtZSAgICAgPT0gPCEtLSBuYW1lPSJLZW50\nIExhbmRmaWVsZCIgLS0+DQogICAgKiogZW1haWwgICAgPT0gPCEtLSBlbWFp\nbD0ia2VudEBsYW5kZmllbGQuY29tIiAtLT4NCiAgICAqKiBzdWJqZWN0ICA9\nPSA8IS0tIHN1YmplY3Q9IlRlc3QgbWVzc2FnZSBvZiB0aGUgdGVzdG1haWwg\nbWFpbCBhZGRyZXNzLiIgLS0+DQogICAgKiogbXNnaWQgICAgPT0gPCEtLSBp\nZD0iMTk5ODA2MDMxNTEyLktBQTIyMzIzQGxhbmRmaWVsZC5jb20iIC0tPg0K\nICAgICoqIGlucmVwbHkgID09IDwhLS0gaW5yZXBseXRvPSIiIC0tPg0KICAg\nICovDQoNCiAgICB3aGlsZSAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikp\nICE9IE5VTEwpIHsNCg0KICAgICAgICAvKiBza2lwIGFsbCBsaW5lcyBiZWZv\ncmUgdGhlIGZpcnN0IDwhLS0gKi8NCiAgICAgICAgd2hpbGUgKCBmZ2V0cyhs\naW5lLCBzaXplb2YobGluZSksIGZwKSwgc3RybmNtcChsaW5lLCAiPCEtLSAi\nLCA1KSApOw0KDQogICAgICAgIHN0cmNweW1heChmcm9tZGF0ZSwgKGNoYXIg\nKikgZ2V0dmFsdWUobGluZSksIERBVEVTVFJMRU4pOw0KDQogICAgICAgIGZn\nZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApOw0KICAgICAgICBzdHJjcHlt\nYXgoZGF0ZSwgKGNoYXIgKikgZ2V0dmFsdWUobGluZSksIERBVEVTVFJMRU4p\nOw0KDQogICAgICAgIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApOw0K\nICAgICAgICBzdHJjcHltYXgobmFtZSwgKGNoYXIgKikgZ2V0dmFsdWUobGlu\nZSksIE5BTUVTVFJMRU4pOw0KDQogICAgICAgIGZnZXRzKGxpbmUsIHNpemVv\nZihsaW5lKSwgZnApOw0KICAgICAgICBzdHJjcHltYXgoZW1haWwsIChjaGFy\nICopIGdldHZhbHVlKGxpbmUpLCBNQUlMU1RSTEVOKTsNCg0KICAgICAgICBm\nZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKTsNCiAgICAgICAgc3RyY3B5\nbWF4KHN1YmplY3QsIChjaGFyICopIHVuY29udmNoYXJzKGdldHZhbHVlKGxp\nbmUpKSwgU1VCSlNUUkxFTik7DQoNCiAgICAgICAgZmdldHMobGluZSwgc2l6\nZW9mKGxpbmUpLCBmcCk7DQogICAgICAgIHN0cmNweW1heChtc2dpZCwgKGNo\nYXIgKikgZ2V0dmFsdWUobGluZSksIE1TR0RTVFJMRU4pOw0KDQogICAgICAg\nIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApOw0KICAgICAgICBzdHJj\ncHltYXgoaW5yZXBseSwgKGNoYXIgKikgdW5jb252Y2hhcnMoZ2V0dmFsdWUo\nbGluZSkpLCBNU0dEU1RSTEVOKTsNCg0KICAgICAgICBmY2xvc2UoZnApOw0K\nDQogICAgICAgIGFkZGhhc2gobnVtLCBkYXRlLCBuYW1lLCBlbWFpbCwgbXNn\naWQsIHN1YmplY3QsIGlucmVwbHksIGZyb21kYXRlLCBicCk7ICAgICAgICBh\ndXRob3JsaXN0ID0gKHN0cnVjdCBoZWFkZXIgKikgYWRkaGVhZGVyKGF1dGhv\ncmxpc3QsIG51bSwgbmFtZSwgc3ViamVjdCwgZGF0ZSwgMSk7DQogICAgICAg\nIHN1YmplY3RsaXN0ID0gKHN0cnVjdCBoZWFkZXIgKikgYWRkaGVhZGVyKHN1\nYmplY3RsaXN0LCBudW0sIG5hbWUsIHVucmUoc3ViamVjdCksIGRhdGUsIDAp\nOw0KICAgICAgICBkYXRlbGlzdCA9IChzdHJ1Y3QgaGVhZGVyICopYWRkaGVh\nZGVyKGRhdGVsaXN0LG51bSxuYW1lLHN1YmplY3QsZnJvbWRhdGUsMik7DQoN\nCiAgICAgICAgbnVtKys7DQogICAgICAgIGlmICghKG51bSAlIDEwKSAmJiBz\naG93cHJvZ3Jlc3MpIHsNCiAgICAgICAgICAgIHByaW50ZigiXGJcYlxiXGIl\nNGQiLCBudW0pOw0KICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7DQogICAg\nICAgIH0NCg0KICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCAiJXMlcyUuNGQu\naHRtbCIsIGRpciwNCiAgICAgICAgICAgICAgICAoZGlyW3N0cmxlbihkaXIp\nIC0gMV0gPT0gJy8nKSA/ICIiIDogIi8iLCBudW0pOw0KICAgIH0NCg0KICAg\nIGlmIChzaG93cHJvZ3Jlc3MpDQogICAgICAgIHByaW50ZigiXGJcYlxiXGIl\nNGQgYXJ0aWNsZXMuXG4iLCBudW0pOw0KDQogICAgaWYgKCFudW0pDQogICAg\nICAgIGJpZ251bSA9IDA7DQogICAgZWxzZQ0KICAgICAgICBiaWdudW0gPSBu\ndW07DQoNCiAgICAvKiBjYW4gd2UgY2xlYW4gdXAgYSBiaXQgcGxlYXNlLi4u\nICovDQogICAgaWYgKGJwICE9IE5VTEwpIHsNCiAgICAgICAgaWYgKGJwLT5s\naW5lKSBmcmVlKGJwLT5saW5lKTsNCiAgICAgICAgZnJlZShicCk7DQogICAg\nfQ0KfQ0KDQovKg0KKiogQWRkcyBhICJOZXh0OiIgbGluayBpbiB0aGUgcHJv\ncGVyIGFydGljbGUsIGFmdGVyIHRoZSBhcmNoaXZlIGhhcyBiZWVuDQoqKiBp\nbmNyZW1lbnRhbGx5IHVwZGF0ZWQuDQoqLw0KDQp2b2lkIGZpeG5leHRoZWFk\nZXIoY2hhciAqZGlyLCBpbnQgbnVtKQ0Kew0KICAgIGNoYXIgZmlsZW5hbWVb\nTUFYRklMRUxFTl0sIGxpbmVbTUFYTElORV0sIG5hbWVbTkFNRVNUUkxFTl0s\nDQogICAgICAgIGVtYWlsW01BSUxTVFJMRU5dLCBzdWJqZWN0W1NVQkpTVFJM\nRU5dLCBpbnJlcGx5W1JFUFlTVFJMRU5dLA0KICAgICAgICBkYXRlW0RBVEVT\nVFJMRU5dLCBmcm9tZGF0ZVtEQVRFU1RSTEVOXSwgbXNnaWRbTVNHRFNUUkxF\nTl07DQogICAgc3RydWN0IGJvZHkgKmJwLCAqY3AsICpkcCwgKnN0YXR1cywg\nKmxwPU5VTEw7DQogICAgaW50IHVsOw0KICAgIEZJTEUgKmZwOw0KDQogICAg\ndWwgPSAwOw0KICAgIHNwcmludGYoZmlsZW5hbWUsICIlcyVzJS40ZC5odG1s\nIiwgZGlyLA0KICAgICAgICAgIChkaXJbc3RybGVuKGRpcikgLSAxXSA9PSAn\nLycpID8gIiIgOiAiLyIsIG51bSk7DQoNCiAgICBicCA9IE5VTEw7DQogICAg\naWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSAhPSBOVUxMKSB7DQog\nICAgICAgIHdoaWxlICgoZmdldHMobGluZSwgTUFYTElORSwgZnApKSAhPSBO\nVUxMKQ0KICAgICAgICAgICAgYnAgPSAoc3RydWN0IGJvZHkgKikgYWRkYm9k\neShicCwgJmxwLCBsaW5lLCAwKTsNCiAgICB9DQogICAgZWxzZQ0KICAgICAg\nICByZXR1cm47DQogICAgZmNsb3NlKGZwKTsNCg0KICAgIGNwID0gYnA7IC8q\nIHNhdmUgc3RhcnQgb2YgbGlzdCB0byBmcmVlIGxhdGVyICovDQoNCiAgICBp\nZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJ3KyIpKSAhPSBOVUxMKSB7DQog\nICAgICAgd2hpbGUgKGJwICE9IE5VTEwpIHsNCiAgICAgICAgICAgIGZwcmlu\ndGYoZnAsICIlcyIsIGJwLT5saW5lKTsNCiAgICAgICAgICAgIGlmICghc3Ry\nbmNtcChicC0+bGluZSwgIjwhLS0gbmV4dD0iLCAxMCkpIHsNCiAgICAgICAg\nICAgICAgICBzdGF0dXMgPSAoc3RydWN0IGJvZHkgKikgaGFzaG51bWxvb2t1\ncChudW0gKyAxLCBuYW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAg\nZW1haWwsIHN1YmplY3QsIGlucmVwbHksIGRhdGUsIGZyb21kYXRlLCBtc2dp\nZCk7DQogICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7DQog\nICAgICAgICAgICAgICAgICAgIGlmICh1c2V0YWJsZSkgew0KICAgICAgICAg\nICAgICAgICAgICAgICAgZHAgPSBicC0+bmV4dDsNCiAgICAgICAgICAgICAg\nICAgICAgICAgIGlmICghc3RybmNtcChkcC0+bGluZSwgIjxVTD4iLCA0KSkg\new0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIl\ncyIsIGRwLT5saW5lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1\nbCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAg\nICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwg\nIjxMST48U1RST05HPk5leHQgbWVzc2FnZTo8L1NUUk9ORz4gIik7DQogICAg\nICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICI8QSBIUkVGPVwiJS40ZC5o\ndG1sXCI+JXM6IFwiJXNcIjwvQT5cbiIsDQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgbnVtICsgMSwgbmFtZSwgY29udmNoYXJzKHN1Ympl\nY3QpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHVsKSB7DQogICAgICAg\nICAgICAgICAgICAgICAgICBicCA9IGRwOw0KICAgICAgICAgICAgICAgICAg\nICAgICAgdWwgPSAwOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAg\nICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnAgPSBi\ncC0+bmV4dDsNCiAgICAgICB9DQogICAgfQ0KDQogICAgZmNsb3NlKGZwKTsN\nCg0KICAgIC8qIGNhbiB3ZSBjbGVhbiB1cCBhIGJpdCBwbGVhc2UuLi4gKi8N\nCiAgICBicCA9IGNwOw0KICAgIHdoaWxlIChicCAhPSBOVUxMKSB7DQogICAg\nICAgIGNwID0gYnAtPm5leHQ7DQogICAgICAgIGlmIChicC0+bGluZSkgZnJl\nZShicC0+bGluZSk7DQogICAgICAgIGZyZWUoYnApOw0KICAgICAgICBicCA9\nIGNwOw0KICAgIH0NCn0NCg0KLyoNCioqIEFkZHMgYSAiUmVwbHk6IiBsaW5r\nIGluIHRoZSBwcm9wZXIgYXJ0aWNsZSwgYWZ0ZXIgdGhlIGFyY2hpdmUgaGFz\nIGJlZW4NCioqIGluY3JlbWVudGFsbHkgdXBkYXRlZC4NCiovDQoNCnZvaWQg\nZml4cmVwbHloZWFkZXIoY2hhciAqZGlyLCBpbnQgbnVtKQ0Kew0KICAgIGlu\ndCByZXBseW51bSwgc3Viam1hdGNoOw0KICAgIGNoYXIgZmlsZW5hbWVbTUFY\nRklMRUxFTl0sIGxpbmVbTUFYTElORV0sIG5hbWVbTkFNRVNUUkxFTl0sDQog\nICAgICAgIGVtYWlsW01BSUxTVFJMRU5dLCBzdWJqZWN0W1NVQkpTVFJMRU5d\nLCBpbnJlcGx5W1JFUFlTVFJMRU5dLA0KICAgICAgICBkYXRlW0RBVEVTVFJM\nRU5dLCBmcm9tZGF0ZVtEQVRFU1RSTEVOXSwgbXNnaWRbTVNHRFNUUkxFTl0s\nDQogICAgICAgIG5hbWUyW05BTUVTVFJMRU5dLCBzdWJqZWN0MltTVUJKU1RS\nTEVOXTsNCiAgICBzdHJ1Y3QgYm9keSAqYnAsICpjcCwgKnN0YXR1czsNCiAg\nICBzdHJ1Y3QgYm9keSAqbHAgPSBOVUxMOw0KICAgIEZJTEUgKmZwOw0KDQog\nICAgc3RhdHVzID0gKHN0cnVjdCBib2R5ICopIGhhc2hudW1sb29rdXAobnVt\nLCBuYW1lLCBlbWFpbCwgc3ViamVjdCwgDQogICAgICAgICAgICAgIGlucmVw\nbHksIGRhdGUsIGZyb21kYXRlLCBtc2dpZCk7DQoNCiAgICBpZiAoc3RhdHVz\nID09IE5VTEwgfHwgaW5yZXBseVswXSA9PSAnXDAnKQ0KICAgICAgICByZXR1\ncm47DQoNCiAgICBpZiAoaW5yZXBseVswXSAhPSAnXDAnKSB7DQogICAgICAg\nIHJlcGx5bnVtID0gaGFzaHJlcGx5bG9va3VwKGlucmVwbHksIG5hbWUyLCBz\ndWJqZWN0MiwgJnN1YmptYXRjaCk7DQogICAgICAgIGlmIChyZXBseW51bSA9\nPSAtMSkNCiAgICAgICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBzcHJp\nbnRmKGZpbGVuYW1lLCAiJXMlcyUuNGQuaHRtbCIsIGRpciwgDQogICAgICAg\nICAgICAgICAgICAgICAgIChkaXJbc3RybGVuKGRpcikgLSAxXSA9PSAnLycp\nID8gIiIgOiAiLyIsIHJlcGx5bnVtKTsNCg0KICAgIGJwID0gTlVMTDsNCiAg\nICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpICE9IE5VTEwpIHsN\nCiAgICAgICAgd2hpbGUgKChmZ2V0cyhsaW5lLCBNQVhMSU5FLCBmcCkpICE9\nIE5VTEwpDQogICAgICAgICAgICBicCA9IChzdHJ1Y3QgYm9keSAqKSBhZGRi\nb2R5KGJwLCAmbHAsIGxpbmUsIDApOw0KICAgIH0NCiAgICBlbHNlDQogICAg\nICAgIHJldHVybjsNCiAgICBmY2xvc2UoZnApOw0KDQogICAgY3AgPSBicDsg\nIC8qIHNhdmUgc3RhcnQgb2YgbGlzdCB0byBmcmVlIGxhdGVyICovDQoNCiAg\nICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJ3KyIpKSAhPSBOVUxMKSB7\nDQogICAgICAgIHdoaWxlIChicCAhPSBOVUxMKSB7DQogICAgICAgICAgICBp\nZiAoIXN0cm5jbXAoYnAtPmxpbmUsICI8IS0tIHJlcGx5IiwgMTApKSB7DQog\nICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIjxMST48U1RST05HPlJlcGx5\nOjwvU1RST05HPiAiKTsNCiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAi\nPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiIsIG51bSk7DQogICAgICAgICAgICAg\nICAgZnByaW50ZihmcCwgIiVzOiBcIiVzXCI8L0E+XG4iLCBuYW1lLCBjb252\nY2hhcnMoc3ViamVjdCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAg\nZnByaW50ZihmcCwgIiVzIiwgYnAtPmxpbmUpOw0KICAgICAgICAgICAgYnAg\nPSBicC0+bmV4dDsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBmY2xvc2UoZnAp\nOw0KDQogICAgLyogY2FuIHdlIGNsZWFuIHVwIGEgYml0IHBsZWFzZS4uLiAq\nLw0KICAgIGJwID0gY3A7DQogICAgd2hpbGUgKGJwICE9IE5VTEwpIHsNCiAg\nICAgICAgY3AgPSBicC0+bmV4dDsNCiAgICAgICAgaWYgKGJwLT5saW5lKSBm\ncmVlKGJwLT5saW5lKTsNCiAgICAgICAgZnJlZShicCk7DQogICAgICAgIGJw\nID0gY3A7DQogICAgfQ0KfQ0KDQovKg0KKiogQWRkcyBhICJOZXh0IGluIHRo\ncmVhZDoiIGxpbmsgaW4gdGhlIHByb3BlciBhcnRpY2xlLCBhZnRlciB0aGUg\nYXJjaGl2ZQ0KKiogaGFzIGJlZW4gaW5jcmVtZW50YWxseSB1cGRhdGVkLg0K\nKi8NCg0Kdm9pZCBmaXh0aHJlYWRoZWFkZXIoY2hhciAqZGlyLCBpbnQgbnVt\nKQ0Kew0KICAgIGNoYXIgZmlsZW5hbWVbTUFYRklMRUxFTl0sbGluZVtNQVhM\nSU5FXSxuYW1lW05BTUVTVFJMRU5dOw0KICAgIGNoYXIgc3ViamVjdFtTVUJK\nU1RSTEVOXTsNCiAgICBGSUxFICpmcDsNCiAgICBzdHJ1Y3QgcmVwbHkgKnJw\nOw0KICAgIHN0cnVjdCBib2R5ICpicCwgKmNwOw0KICAgIHN0cnVjdCBib2R5\nICpscD1OVUxMOw0KICAgIGludCB0aHJlYWRudW0gPSAwOw0KDQogICAgZm9y\nIChycCA9IHRocmVhZGxpc3Q7IHJwICE9IE5VTEw7IHJwID0gcnAtPm5leHQp\nIHsNCiAgICAgICAgaWYgKHJwLT5uZXh0ICE9IE5VTEwgJiYgcnAtPm5leHQt\nPm1zZ251bSA9PSBudW0gJiYgcnAtPm1zZ251bSAhPSAtMSkgew0KICAgICAg\nICAgICAgdGhyZWFkbnVtID0gcnAtPm1zZ251bTsNCiAgICAgICAgICAgIHN0\ncmNweW1heChuYW1lLCBycC0+bmV4dC0+bmFtZSwgTkFNRVNUUkxFTik7DQog\nICAgICAgICAgICBzdHJjcHltYXgoc3ViamVjdCwgcnAtPm5leHQtPnN1Ympl\nY3QsIFNVQkpTVFJMRU4pOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAg\nIH0NCiAgICB9DQoNCiAgICBpZiAocnAgPT0gTlVMTCkNCiAgICAgICAgcmV0\ndXJuOw0KDQogICAgc3ByaW50ZihmaWxlbmFtZSwgIiVzJXMlLjRkLmh0bWwi\nLCBkaXIsDQogICAgKGRpcltzdHJsZW4oZGlyKSAtIDFdID09ICcvJykgPyAi\nIiA6ICIvIiwgdGhyZWFkbnVtKTsNCg0KICAgIGJwID0gTlVMTDsNCiAgICBp\nZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpICE9IE5VTEwpIHsNCiAg\nICAgICAgd2hpbGUgKChmZ2V0cyhsaW5lLCBNQVhMSU5FLCBmcCkpICE9IE5V\nTEwpDQogICAgICAgICAgICBicCA9IChzdHJ1Y3QgYm9keSAqKSBhZGRib2R5\nKGJwLCAmbHAsIGxpbmUsIDApOw0KICAgIH0NCiAgICBlbHNlDQogICAgICAg\nIHJldHVybjsNCg0KICAgIGZjbG9zZShmcCk7DQoNCiAgICBjcCA9IGJwOyAg\nLyogc2F2ZSBzdGFydCBvZiBsaXN0IHRvIGZyZWUgbGF0ZXIgKi8NCg0KICAg\nIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgIncrIikpICE9IE5VTEwpIHsN\nCiAgICAgICAgd2hpbGUgKGJwICE9IE5VTEwpIHsNCiAgICAgICAgICAgIGZw\ncmludGYoZnAsICIlcyIsIGJwLT5saW5lKTsNCiAgICAgICAgICAgIGlmICgh\nc3RybmNtcChicC0+bGluZSwgIjwhLS0gbmV4dHRociIsIDEyKSkgew0KICAg\nICAgICAgICAgICAgIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz5OZXh0IGlu\nIHRocmVhZDo8L1NUUk9ORz4gIik7DQogICAgICAgICAgICAgICAgZnByaW50\nZihmcCwgIjxBIEhSRUY9XCIlLjRkLmh0bWxcIj4iLCBudW0pOw0KICAgICAg\nICAgICAgICAgIGZwcmludGYoZnAsICIlczogXCIlc1wiPC9BPlxuIiwNCiAg\nICAgICAgICAgICAgICBuYW1lLCBjb252Y2hhcnMoc3ViamVjdCkpOw0KICAg\nICAgICAgICAgfQ0KICAgICAgICAgICAgYnAgPSBicC0+bmV4dDsNCiAgICAg\nICAgfQ0KICAgIH0NCiAgICBmY2xvc2UoZnApOw0KDQogICAgLyogY2FuIHdl\nIGNsZWFuIHVwIGEgYml0IHBsZWFzZS4uLiAqLw0KICAgIGJwID0gY3A7DQog\nICAgd2hpbGUgKGJwICE9IE5VTEwpIHsNCiAgICAgICAgY3AgPSBicC0+bmV4\ndDsNCiAgICAgICAgaWYgKGJwLT5saW5lKSBmcmVlKGJwLT5saW5lKTsNCiAg\nICAgICAgZnJlZShicCk7DQogICAgICAgIGJwID0gY3A7DQogICAgfQ0KfQ0K\nDQo=\n---559023410-851401618-901288998=:17635\nContent-Type: TEXT/PLAIN; charset=\"US-ASCII\"; name=\"print.c\"\nContent-Transfer-Encoding: BASE64\nContent-ID: <Pine.SO4.4.02.9807241603181.17635@metal>\nContent-Disposition: attachment; filename=\"print.c\"\nX-Sun-Content-Length: 53472\n\nLyogDQoqKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRW50ZXJwcmlzZSBJ\nbnRlZ3JhdGlvbiBUZWNobm9sb2dpZXMgQ29ycC4NCioqICAgICAgICAgVmVy\naUZvbmUgSW5jLi9IZXdsZXR0LVBhY2thcmQuIEFsbCBSaWdodHMgUmVzZXJ2\nZWQuDQoqKiBLZXZpbiBIdWdoZXMsIGtldkBrZXZjb20uY29tIDMvMTEvOTQN\nCioqIEtlbnQgTGFuZGZpZWxkLCBrZW50QGxhbmRmaWVsZC5jb20gNC82Lzk3\nDQoqKiANCioqIFRoaXMgcHJvZ3JhbSBhbmQgbGlicmFyeSBpcyBmcmVlIHNv\nZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgDQoqKiBt\nb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgKExpYnJhcnkp\nIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgDQoqKiBhcyBwdWJsaXNoZWQgYnkg\ndGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g\nMiANCioqIG9mIHRoZSBMaWNlbnNlLCBvciBhbnkgbGF0ZXIgdmVyc2lvbi4g\nDQoqKiANCioqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg\naG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCANCioqIGJ1dCBXSVRIT1VU\nIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh\nbnR5IG9mIA0KKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg\nUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIA0KKiogR05VIChMaWJyYXJ5\nKSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIA0K\nKiogDQoqKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo\nZSBHTlUgKExpYnJhcnkpIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCioqIGFs\nb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG\ncmVlIFNvZnR3YXJlIA0KKiogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl\nIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBV\nU0EgDQoqLw0KDQojaW5jbHVkZSAiaHlwZXJtYWlsLmgiDQojaW5jbHVkZSA8\nY3R5cGUuaD4NCg0KI2RlZmluZSBGUk9NX0FVVEhPUiAgMA0KI2RlZmluZSBG\nUk9NX0RBVEUgICAgMQ0KI2RlZmluZSBGUk9NX1RIUkVBRCAgMg0KI2RlZmlu\nZSBGUk9NX1NVQkpFQ1QgMw0KDQojZGVmaW5lIFBBR0VfVE9QICAgICAxDQoj\nZGVmaW5lIFBBR0VfQk9UVE9NICAyDQoNCnR5cGVkZWYgZW51bSB7REFURV9J\nTkRFWCwgVEhSRUFEX0lOREVYLCBTVUJKRUNUX0lOREVYLCBBVVRIT1JfSU5E\nRVgsDQogICAgICAgICAgICAgIE5PX0lOREVYfSBtaW5kZXhfdDsNCg0KLyoN\nCioqIFByaW50cyBhIHByb2dyYW0gZXJyb3Igc3RyaW5nIGFuZCBzdG9wcy4g\nSWYgZXJyb3JzdHIgaXMgTlVMTCwNCioqIHRoaXMgcHJpbnRzIHdoYXRldmVy\nIGhhcHBlbnMgdG8gYmUgaW4gZXJyc3RyW10gYXQgdGhlIHRpbWUuDQoqLw0K\nDQp2b2lkIHByb2dlcnIoY2hhciAqZXJyb3JzdHIpDQp7DQogICAgaWYgKGVy\ncm9yc3RyICE9IE5VTEwpDQogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6\nICVzXG4iLCBQUk9HTkFNRSwgZXJyb3JzdHIpOw0KICAgIGVsc2UNCiAgICAg\nICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIFBST0dOQU1FLCBlcnJt\nc2cpOw0KICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHR5cGUgXCIlcyAtelwi\nIGZvciBvcHRpb25zLlxuIiwgUFJPR05BTUUsIFBST0dOQU1FKTsNCiAgICBl\neGl0KC0xKTsNCn0NCg0KLyoNCioqIE91dHB1dCBhIG1lbnUgbGluZSB3aXRo\nIGh5cGVybGlua3MgZm9yIHRhYmxlIGRpc3BsYXkNCioqDQoqKiBBbGwgcGFy\nYW1ldGVycyBhcmUgaW5wdXRzIG9ubHkuICBQYXJhbWV0ZXJzOg0KKiogICBm\ncCAgICAgICA6IEhUTUwgb3V0cHV0IGZpbGUgcG9pbnRlcg0KKiogICBpZHgg\nICAgICA6IFR5cGUgb2YgcGFnZSB0aGlzIG1lbnUgaXMgZm9yLg0KKiogICBh\nYm91dCAgICA6ICJOT05FIiBvciBlbHNlIHRoZSBVUkwgb2YgaW5mbyBhYm91\ndCB0aGlzIGFyY2hpdmUuDQoqKiAgIGFyY2hpdmVzIDogIk5PTkUiIG9yIGVs\nc2UgdGhlIFVSTCBvZiBtb3JlIGh5cGVybWFpbCBhcmNoaXZlcy4NCioqICAg\nY3VycmVudGlkOiAiIiBvciBlbHNlIHRoZSBpZCBvZiB0aGUgImN1cnJlbnQi\nIG1lc3NhZ2UuDQoqKiAgIGN1cnN1YiAgIDogIiIgb3IgZWxzZSB0aGUgc3Vi\namVjdCBvZiB0aGUgImN1cnJlbnQiIG1lc3NhZ2UuDQoqKiAgIHBvcyAgICAg\nIDogQ2FsbGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBwYWdlLg0K\nKi8NCg0Kdm9pZCBmcHJpbnRfbWVudShGSUxFICpmcCwgbWluZGV4X3QgaWR4\nLCBjaGFyICphYm91dCwgY2hhciAqYXJjaGl2ZXMsDQogICAgICAgICAgICAg\nICAgIGNoYXIgKmN1cnJlbnRpZCwgY2hhciAqY3Vyc3ViLCBpbnQgcG9zKQ0K\new0KICAgZnByaW50ZihmcCwgIjxESVYgQUxJR049Q0VOVEVSPlxuPFRBQkxF\nIEJPUkRFUj0yIFdJRFRIPVwiMTAwJSVcIj5cbjxUUj5cbiIpOw0KDQogICBp\nZiAobWFpbGNvbW1hbmQpIHsNCiAgICAgICBpZiAoKmhtYWlsKSB7DQogICAg\nICAgICAgIGZwcmludGYoZnAsICI8VEg+PEEgSFJFRj1cIiVzXCI+TmV3IE1l\nc3NhZ2U8L0E+PC9USD5cbiIsDQogICAgICAgICAgICAgICAgICBtYWtlbWFp\nbGNvbW1hbmQoIm1haWx0bzokVE8iLCBobWFpbCwgIiIsICIiKSk7DQoNCiAg\nICAgICAgICAgaWYoKGN1cnJlbnRpZCAhPSBOVUxMICYmIGN1cnJlbnRpZFsw\nXSAhPSAnXDAnKSB8fA0KICAgICAgICAgICAgICAoY3Vyc3ViICAgICE9IE5V\nTEwgJiYgY3Vyc3ViWzBdICAgICE9ICdcMCcpKQ0KICAgICAgICAgICAgICBm\ncHJpbnRmKGZwLCAiPFRIPjxBIEhSRUY9XCIlc1wiPlJlcGx5PC9BPjwvVEg+\nXG4iLA0KICAgICAgICAgICAgICAgICAgIG1ha2VtYWlsY29tbWFuZChtYWls\nY29tbWFuZCxobWFpbCxjdXJyZW50aWQsY3Vyc3ViKSk7DQogICAgICAgfQ0K\nICAgfQ0KDQogICBpZiAoKmFib3V0KQ0KICAgICAgZnByaW50ZihmcCwiPFRI\nPjxBIEhSRUY9XCIlc1wiPkFib3V0IHRoaXMgbGlzdDwvQT48L1RIPlxuIixh\nYm91dCk7DQoNCiAgIGlmIChpZHggIT0gTk9fSU5ERVggJiYgIXJldmVyc2Up\nIHsNCiAgICAgIGlmIChwb3MgPT0gUEFHRV9UT1ApDQogICAgICAgICAgZnBy\naW50ZihmcCwiPFRIPjxBIEhSRUY9XCIjZW5kXCI+RW5kIG9mIE1lc3NhZ2Vz\nPC9BPjwvVEg+XG4iKTsNCiAgICAgIGVsc2UNCiAgICAgICAgICBmcHJpbnRm\nKGZwLCI8VEg+PEEgTkFNRT1cImVuZFwiIEhSRUY9XCIjXCI+U3RhcnQgb2Yg\nTWVzc2FnZXM8L0E+PC9USD5cbiIpOw0KICAgfQ0KICAgICAgICAgICANCiAg\nIGlmKGlkeCAhPSBEQVRFX0lOREVYKQ0KICAgICAgZnByaW50ZihmcCwiPFRI\nPjxBIEhSRUY9XCIlc1wiPkRhdGUgdmlldzwvQT48L1RIPlxuIixkYXRlbmFt\nZSk7DQoNCiAgIGlmKGlkeCAhPSBUSFJFQURfSU5ERVgpDQogICAgICBmcHJp\nbnRmKGZwLCI8VEg+PEEgSFJFRj1cIiVzXCI+VGhyZWFkIHZpZXc8L0E+PC9U\nSD5cbiIsdGhyZG5hbWUpOw0KDQogICBpZihpZHggIT0gU1VCSkVDVF9JTkRF\nWCkNCiAgICAgIGZwcmludGYoZnAsIjxUSD48QSBIUkVGPVwiJXNcIj5TdWJq\nZWN0IHZpZXc8L0E+PC9USD5cbiIsc3Viam5hbWUpOw0KDQogICBpZihpZHgg\nIT0gQVVUSE9SX0lOREVYKQ0KICAgICAgZnByaW50ZihmcCwiPFRIPjxBIEhS\nRUY9XCIlc1wiPkF1dGhvciB2aWV3PC9BPjwvVEg+XG4iLGF1dGhuYW1lKTsN\nCg0KICAgaWYgKCphcmNoaXZlcykNCiAgICAgIGZwcmludGYoZnAsIjxUSD48\nQSBIUkVGPVwiJXNcIj5PdGhlciBncm91cHM8L0E+PC9USD5cbiIsIGFyY2hp\ndmVzKTsNCg0KICAgZnByaW50ZihmcCwgIjwvVFI+XG48L1RBQkxFPlxuPC9E\nSVY+XG4iKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0tKi8NCg0Kdm9pZCBmcHJpbnRfc3VtbWFyeShGSUxFICpmcCwgaW50IGZp\ncnN0X2QsIGludCBsYXN0X2QsIGludCBudW0pDQp7DQogICBmcHJpbnRmKGZw\nLCAiPERJViBBTElHTj1DRU5URVI+XG4iKTsNCiAgIGZwcmludGYoZnAsICI8\nVEFCTEU+XG48VFI+XG4gIDxUSCBDT0xTUEFOPTQ+JWQgTWVzc2FnZXM8L1RI\nPlxuPC9UUj5cbiIsIG51bSk7DQogICBmcHJpbnRmKGZwLCAiPFRSPlxuIik7\nDQogICBmcHJpbnRmKGZwLCAiICA8VEg+U3RhcnRpbmc6PC9USD48VEQ+PEVN\nPiVzPC9FTT48L1REPlxuIixnZXRkYXRlc3RyKGZpcnN0X2QpKTsNCiAgIGZw\ncmludGYoZnAsICIgIDxUSD5FbmRpbmc6PC9USD48VEQ+PEVNPiVzPC9FTT48\nL1REPlxuIixnZXRkYXRlc3RyKGxhc3RfZCkpOw0KICAgZnByaW50ZihmcCwg\nIjwvVFI+XG48L1RBQkxFPlxuPC9ESVY+XG4iKTsNCn0NCg0KLyotLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kdm9pZCBwcmludF9pbmRl\neF9oZWFkZXJfbGlua3MoRklMRSAqZnAsY2hhciAqYXJjaGl2ZXMsY2hhciAq\nYWJvdXQsaW50IGNhbGxlZCkNCnsNCiAgICAvKiANCiAgICAqKiBQcmludCBv\ndXQgdGhlIGxpbmtzIGZvcg0KICAgICoqIA0KICAgICoqICAgICAgQWJvdXQg\ndGhpcyBhcmNoaXZlIA0KICAgICoqICAgICAgTW9zdCByZWNlbnQgbWVzc2Fn\nZXMgDQogICAgKiogICAgICBNZXNzYWdlcyBzb3J0ZWQgYnk6IFsgZGF0ZSBd\nWyBzdWJqZWN0IF1bIGF1dGhvciBdIA0KICAgICoqICAgICAgT3RoZXIgbWFp\nbCBhcmNoaXZlcyANCiAgICAqKg0KICAgICoqIGFzIGFwcHJvcHJpYXRlLg0K\nICAgICovDQogICAgDQogICAgZnByaW50ZihmcCwgIjxVTD5cbiIpOw0KDQog\nICAgaWYgKCphYm91dCkgew0KICAgICAgICBmcHJpbnRmKGZwLCAiPExJPjxT\nVFJPTkc+PEEgSFJFRj1cIiVzXCI+QWJvdXQgdGhpcyAiLCBhYm91dCk7DQog\nICAgICAgIGZwcmludGYoZnAsICJhcmNoaXZlPC9BPjwvU1RST05HPlxuIik7\nDQogICAgfQ0KDQogICAgaWYgKCFyZXZlcnNlICYmIChjYWxsZWQgIT0gRlJP\nTV9BVVRIT1IgJiYgY2FsbGVkICE9IEZST01fU1VCSkVDVCkpDQogICAgICAg\nIGZwcmludGYoZnAsDQogICAgICAgICI8TEk+PFNUUk9ORz48QSBIUkVGPVwi\nI2VuZFwiPk1vc3QgcmVjZW50IG1lc3NhZ2VzPC9BPjwvU1RST05HPlxuIik7\nDQoNCiAgICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+TWVzc2FnZXMgc29y\ndGVkIGJ5OjwvU1RST05HPiBcbiIpOw0KDQogICAgaWYgKGNhbGxlZCAhPSBG\nUk9NX0FVVEhPUikNCiAgICAgICAgZnByaW50ZihmcCwgIjxBIEhSRUY9XCIl\nc1wiPlsgYXV0aG9yIF08L0E+XG4iLCBhdXRobmFtZSk7DQoNCiAgICBpZiAo\nY2FsbGVkICE9IEZST01fREFURSkNCiAgICAgICAgIGZwcmludGYoZnAsICI8\nQSBIUkVGPVwiJXNcIj5bIGRhdGUgXTwvQT5cbiIsIGRhdGVuYW1lKTsNCg0K\nICAgIGlmIChjYWxsZWQgIT0gRlJPTV9USFJFQUQpDQogICAgICAgICBmcHJp\nbnRmKGZwLCAiPEEgSFJFRj1cIiVzXCI+WyB0aHJlYWQgXTwvQT5cbiIsIHRo\ncmRuYW1lKTsNCg0KICAgIGlmIChjYWxsZWQgIT0gRlJPTV9TVUJKRUNUKQ0K\nICAgICAgICAgZnByaW50ZihmcCwgIjxBIEhSRUY9XCIlc1wiPlsgc3ViamVj\ndCBdPC9BPlxuIiwgc3Viam5hbWUpOw0KDQogICAgaWYgKCphcmNoaXZlcykg\new0KICAgICAgICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+PEEgSFJFRj1c\nIiVzXCI+T3RoZXIgbWFpbCAiLCBhcmNoaXZlcyk7DQogICAgICAgIGZwcmlu\ndGYoZnAsICJhcmNoaXZlczwvQT48L1NUUk9ORz5cbiIpOw0KICAgIH0NCiAg\nICBmcHJpbnRmKGZwLCAiPC9VTD5cbjxQPlxuIik7DQp9DQoNCnZvaWQgcHJp\nbnRfaW5kZXhfZm9vdGVyX2xpbmtzKEZJTEUgKmZwLCBjaGFyICphcmNoaXZl\ncywgaW50IGNhbGxlZCkNCnsNCiAgICAvKiANCiAgICAqKiBQcmludCBvdXQg\ndGhlIGxpbmtzIGZvcg0KICAgICoqIA0KICAgICoqICAgICAgTWVzc2FnZXMg\nc29ydGVkIGJ5OiBbIGRhdGUgXVsgc3ViamVjdCBdWyBhdXRob3IgXSANCiAg\nICAqKiAgICAgIE90aGVyIG1haWwgYXJjaGl2ZXMgDQogICAgKioNCiAgICAq\nKiBhcyBhcHByb3ByaWF0ZS4NCiAgICAqLw0KDQogICAgZnByaW50ZihmcCwg\nIjxVTD5cbiIpOw0KICAgIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz5NZXNz\nYWdlcyBzb3J0ZWQgYnk6PC9TVFJPTkc+IFxuIik7DQoNCiAgICBpZiAoY2Fs\nbGVkICE9IEZST01fQVVUSE9SKQ0KICAgICAgICBmcHJpbnRmKGZwLCAiPEEg\nSFJFRj1cIiVzXCI+WyBhdXRob3IgXTwvQT5cbiIsIGF1dGhuYW1lKTsNCg0K\nICAgIGlmIChjYWxsZWQgIT0gRlJPTV9EQVRFKQ0KICAgICAgICBmcHJpbnRm\nKGZwLCAiPEEgSFJFRj1cIiVzXCI+WyBkYXRlIF08L0E+XG4iLCBkYXRlbmFt\nZSk7DQoNCiAgICBpZiAoY2FsbGVkICE9IEZST01fVEhSRUFEKQ0KICAgICAg\nICBmcHJpbnRmKGZwLCAiPEEgSFJFRj1cIiVzXCI+WyB0aHJlYWQgXTwvQT5c\nbiIsIHRocmRuYW1lKTsNCg0KICAgIGlmIChjYWxsZWQgIT0gRlJPTV9TVUJK\nRUNUKQ0KICAgICAgICBmcHJpbnRmKGZwLCAiPEEgSFJFRj1cIiVzXCI+WyBz\ndWJqZWN0IF08L0E+XG4iLCBzdWJqbmFtZSk7DQoNCiAgICBpZiAoKmFyY2hp\ndmVzKSB7DQogICAgICAgIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz48QSBI\nUkVGPVwiJXNcIj5PdGhlciBtYWlsICIsIGFyY2hpdmVzKTsNCiAgICAgICAg\nZnByaW50ZihmcCwgImFyY2hpdmVzPC9BPjwvU1RST05HPlxuIik7DQogICAg\nfQ0KICAgIGZwcmludGYoZnAsICI8L1VMPlxuXG4iKTsNCn0NCg0KLyoNCioq\nIFByaW50cyBhIGNvbW1lbnQgaW4gdGhlIGZpbGUuDQoqLw0KDQp2b2lkIHBy\naW50Y29tbWVudChGSUxFICpmcCwgY2hhciAqbGFiZWwsIGNoYXIgKnZhbHVl\nKQ0Kew0KICAgIGZwcmludGYoZnAsICI8IS0tICVzPVwiJXNcIiAtLT5cbiIs\nIGxhYmVsLCB2YWx1ZSk7DQp9DQoNCi8qDQoqKiBQcmludHMgYSBsaW5lIG9m\nIEhUTUwuIFVzZWQgdG8gZmlsdGVyIG9mZiB1bndhbnRlZCB0YWdzIGZyb20g\ndGhlIG91dHB1dC4NCiovDQoNCnZvaWQgcHJpbnRodG1sKEZJTEUgKmZwLCBj\naGFyICpsaW5lKQ0Kew0KICAvKiB0aGUgYmFubmVkIHRhZ3MgaWdub3JlIGFs\nbCBvZiB0aGVtIHRoYXQgYmVnaW4gZXhhY3RseSBsaWtlICI8dGFnIiBvcg0K\nICAgICAiPC90YWciIChjYXNlIGluc2Vuc2l0aXZlKS4gQW55IG90aGVyIGxl\ndHRlcnMgd2l0aGluIHRoZSB0YWdzIGRlc3Ryb3kNCiAgICAgdGhpcyBmaWx0\nZXIgY2FwYWJpbGl0eS4gKi8NCg0KICBjaGFyICpiYW5uZWRfdGFnc1tdPXsi\naHRtbD4ifTsgLyogZW5kaW5nID4tbGV0dGVyIG11c3QgYmUgaW5jbHVkZWQg\nKi8NCiAgaW50IGk7DQogIGludCBpbmRleDsNCiAgDQogIHdoaWxlKCpsaW5l\nKSB7DQogICAgaWYoJzwnICE9ICpsaW5lKQ0KICAgICAgZnB1dGMoKmxpbmUr\nKywgZnApOw0KICAgIGVsc2Ugew0KICAgICAgaWYoJy8nID09IGxpbmVbMV0p\nDQogICAgICAgIGluZGV4PTI7DQogICAgICBlbHNlDQogICAgICAgIGluZGV4\nPTE7DQogICAgICBmb3IoaT0wOyBpPHNpemVvZihiYW5uZWRfdGFncykvc2l6\nZW9mKGJhbm5lZF90YWdzWzBdKTtpKyspIHsNCiAgICAgICAgaWYoIXN0cm5j\nYXNlY21wKCZsaW5lW2luZGV4XSwNCiAgICAgICAgICAgICAgICAgICAgICAg\nIGJhbm5lZF90YWdzW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3Ry\nbGVuKGJhbm5lZF90YWdzW2ldKSkpIHsNCiAgICAgICAgICBsaW5lKz1zdHJs\nZW4oYmFubmVkX3RhZ3NbaV0pK2luZGV4Ow0KICAgICAgICAgIGJyZWFrOw0K\nICAgICAgICB9DQogICAgICB9DQogICAgICBpZihzaXplb2YoYmFubmVkX3Rh\nZ3MpL3NpemVvZihiYW5uZWRfdGFnc1swXSkgPT0gaSkgew0KICAgICAgICBm\ncHV0YygqbGluZSsrLCBmcCk7DQogICAgICAgIGlmKDIgPT0gaW5kZXgpDQog\nICAgICAgICAgZnB1dGMoKmxpbmUrKywgZnApOw0KICAgICAgfQ0KICAgIH0N\nCiAgfQ0KDQp9DQoNCi8qDQoqKiBQcmV0dHktcHJpbnRzIHRoZSBkYXRlcyBp\nbiB0aGUgaW5kZXggZmlsZXMuDQoqLw0KDQp2b2lkIHByaW50ZGF0ZXMoRklM\nRSAqZnAsIHN0cnVjdCBoZWFkZXIgKmhwKQ0Kew0KICAgIGlmIChocCAhPSBO\nVUxMKSB7DQogICAgICAgIHByaW50ZGF0ZXMoZnAsIGhwLT5sZWZ0KTsNCiAg\nICAgICAgZnByaW50ZihmcCwgIjxMST48QSBIUkVGPVwiJS40ZC5odG1sXCI+\nPFNUUk9ORz4lczwvU1RST05HPjwvQT4gIiwNCiAgICAgICAgICAgICAgICAg\nICAgaHAtPm1zZ251bSwgY29udmNoYXJzKGhwLT5zdWJqZWN0KSk7DQogICAg\nICAgIGZwcmludGYoZnAsICI8QSBOQU1FPVwiJWRcIj48RU0+JXM8L0VNPjwv\nQT5cbiIsIGhwLT5tc2dudW0sIGhwLT5uYW1lKTsNCiAgICAgICAgcHJpbnRk\nYXRlcyhmcCwgaHAtPnJpZ2h0KTsNCiAgICB9DQp9DQoNCmludCBzaG93aGVh\nZGVyKGNoYXIgKmhlYWRlcikNCnsNCiAgIHJldHVybiAoaW5saXN0KHNob3df\naGVhZGVycywgaGVhZGVyKSk7DQp9DQoNCg0KLyoNCioqIFRoZSBoZXVyaXN0\naWNzIGZvciBkaXNwbGF5aW5nIGFuIG90aGVyd2lzZSBvcmRpbmFyeSBsaW5l\nIChhIG5vbi1xdW90ZSwNCioqIG5vbi1zaWcsIG5vbi1pbmh0bWwsIG5vbi1i\nbGFuayBsaW5lKSBpZiAnc2hvd2h0bWwnIGlzIHRydWUgKHdoaWNoIHJlYWxs\neQ0KKiogbWVhbnMgd2UncmUgKm5vdCogZG9pbmcgPFBSRT4gdG8gZm9ybWF0\nIHRoZSB0ZXh0KSBoYXZlIGNoYW5nZWQgc28gdGhhdA0KKiogaW5kZW50ZWQg\ndGV4dCBzaG93cyB1cCBjb3JyZWN0bHkuICBGaXJzdCwgbGVhZGluZyBzcGFj\nZXMgYmVjb21lIEhUTUwNCioqIG5vbi1icmVha2luZyBzcGFjZXMgKCZuYnNw\nOykuICBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB0aG9zZSBsaW5lcw0K\nKiogbXVzdCBoYXZlIGJlZW4gcHJlY2VkZWQgYnkgYSA8QlI+IG9yIDxQPi4g\nIFdlIGFjY29tcGxpc2ggdGhpcyBieSBjaGVja2luZw0KKiogYWhlYWQgd2hl\nbiB3ZSBwcmludCBlYWNoIGxpbmUuLi4gaWYgd2UgZGV0ZXJtaW5lIHRoYXQg\ndGhlIG5leHQgbGluZQ0KKiogc2hvdWxkIGJlIGJyb2tlbiBiZWZvcmUsIHdl\nIGRvIHNvLg0KKi8NCg0Kdm9pZCBwcmludGJvZHkoRklMRSAqZnAsIHN0cnVj\ndCBib2R5ICpicCwgY2hhciAqaWQsIGNoYXIgKnN1YmplY3QpDQp7DQogICAg\naW50IGluc2lnLCBpbmJsYW5rOw0KICAgIGludCBpbmh0bWw7DQogICAgY2hh\nciBpbmhlYWRlcj1GQUxTRTsgLyogd2UgYWx3YXlzIHN0YXJ0IGluIGEgbWFp\nbCBoZWFkZXIgKi8NCiAgICBpbnQgcHJlPUZBTFNFOw0KDQogICAgaWYgKHNo\nb3docikNCiAgICAgICAgZnByaW50ZihmcCwgIjxIUj5cbiIpOw0KDQogICAg\ncHJpbnRjb21tZW50KGZwLCAiYm9keSIsICJzdGFydCIpOw0KDQogICAgaWYg\nKCFzaG93aHRtbCkgew0KICAgICAgZnByaW50ZihmcCwgIjxQUkU+XG4iKTsN\nCiAgICAgIHByZT1UUlVFOw0KICAgIH0NCiNpZiAwDQogICAgZWxzZQ0KICAg\nICAgcHJpbnRmKCJTSE9XSFRNTCBpcyBPTlxuIik7DQojZW5kaWYNCiAgICBp\nbmJsYW5rID0gMTsNCiAgICBpbnNpZyA9IDA7DQoNCiAgICBpbmh0bWwgPSAw\nOw0KDQogICAgd2hpbGUgKGJwICE9IE5VTEwpIHsNCiNpZiAxDQogICAgICAg\nICAgaWYgKGJwLT5odG1sKSB7DQogICAgICAgICAgICAvKiBhbHJlYWR5IGlu\nIEhUTUwsIGRvbid0IHRvdWNoICovDQogICAgICAgICAgICBwcmludGh0bWwo\nZnAsIGJwLT5saW5lKTsNCiNlbHNlDQogICAgICAgICAgaWYgKGJwLT5odG1s\nICYmIChzdHJuY2FzZWNtcChicC0+bGluZSwgIjxIVE1MPiIsIDYpICYmIA0K\nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoYnAtPmxp\nbmUsICI8L0hUTUw+IiwgNykpKSB7DQogICAgICAgICAgICBmcHJpbnRmKGZw\nLCAiJXMiLCBicC0+bGluZSk7DQojZW5kaWYNCiAgICAgICAgICAgIGJwID0g\nYnAtPm5leHQ7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICB9\nDQoNCiAgICAgICAgICBpZihicC0+aGVhZGVyKSB7DQogICAgICAgICAgICBj\naGFyIGhlYWRbMTI4XTsNCiAgICAgICAgICAgIGlmKCFpbmhlYWRlcikgew0K\nICAgICAgICAgICAgICBpZighcHJlICYmIHNob3dodG1sICYmIHNob3doZWFk\nZXJzKSB7DQogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIjxQUkU+XG4i\nKTsNCiAgICAgICAgICAgICAgICBwcmU9VFJVRTsNCiAgICAgICAgICAgICAg\nfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaW5oZWFkZXI9VFJVRTsN\nCiAgICAgICAgICAgIGlmKHNzY2FuZihicC0+bGluZSwgIiUxMjdbXjpdIiwg\naGVhZCkgJiYNCiAgICAgICAgICAgICAgIHNob3dfaGVhZGVycyAmJiAhc2hv\nd2hlYWRlcihoZWFkKSkgew0KICAgICAgICAgICAgICAvKiB0aGUgc2hvdyBo\nZWFkZXIga2V5d29yZCBoYXMgYmVlbiB1c2VkLCB0aGVuIHdlIHNraXAgYWxs\nIHRob3NlDQogICAgICAgICAgICAgICAgIHRoYXQgYXJlbid0IG1lbnRpb25l\nZCEgKi8NCiAgICAgICAgICAgICAgaWYoaXNhbG51bSgqaGVhZCkgfHwgIXNo\nb3doZWFkZXJzKSB7DQogICAgICAgICAgICAgICAgLyogdGhpcyBjaGVjayBp\ncyBvbmx5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsYXN0IGxpbmUgYW1vbmcg\nDQogICAgICAgICAgICAgICAgICAgdGhlIGhlYWRlcnMgKHRoZSAiXG4iIG9u\nZSkgd29uJ3QgYmUgZmlsdGVyZWQgb2ZmICovDQogICAgICAgICAgICAgICAg\nYnAgPSBicC0+bmV4dDsNCiAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAg\nICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAg\nICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgIGlmKGluaGVhZGVyKSB7DQog\nICAgICAgICAgICAgIGlmKHNob3dodG1sICYmIHNob3doZWFkZXJzICYmIHBy\nZSkgew0KICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICI8L1BSRT5cbiIp\nOw0KICAgICAgICAgICAgICAgIHByZT1GQUxTRTsNCiAgICAgICAgICAgICAg\nfQ0KICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPFA+XG4iKTsNCiAgICAg\nICAgICAgIH0NCiAgICAgICAgICAgIGluaGVhZGVyPUZBTFNFOw0KICAgICAg\nICAgIH0NCg0KICAgICAgICAgIGlmIChicC0+YXR0YWNoZWQgJiYgYnAtPmhl\nYWRlcikgew0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAqIFRoaXMg\naXMgYW4gYXR0YWNoZWQgbWFpbCdzIGhlYWRlcnMuIE9ubHkgb3V0cHV0IHRo\nZSBmZXcNCiAgICAgICAgICAgICAqIG9uZXMgd2UgbWlnaHQgYmUgaW50ZXJl\nc3RlZCBpbi4gSG1tbS4uLiBBcmUgdGhlcmUgb3RoZXJzID8NCiAgICAgICAg\nICAgICAqLw0KI2lmIDANCiAgICAgICAgICAgIGlmICghc3RybmNtcChicC0+\nbGluZSwgIkZyb206IiwgNSkgfHwNCiAgICAgICAgICAgICAgICFzdHJuY21w\nKGJwLT5saW5lLCAiVG86IiwgMykgfHwNCiAgICAgICAgICAgICAgICFzdHJu\nY21wKGJwLT5saW5lLCAiRGF0ZToiLCA1KSB8fA0KICAgICAgICAgICAgICAg\nIXN0cm5jbXAoYnAtPmxpbmUsICJTdWJqZWN0OiIsIDgpICkgew0KI2VuZGlm\nDQogICAgICAgICAgICAgIGZwcmludGYoZnAsICI8U1RST05HPiVzPC9TVFJP\nTkc+PEJSPlxuIiwgYnAtPmxpbmUpOw0KI2lmIDANCiAgICAgICAgICAgIH0N\nCiNlbmRpZg0KICAgICAgICAgICAgYnAgPSBicC0+bmV4dDsNCiAgICAgICAg\nICAgIGNvbnRpbnVlOyAgICAgICAgICAgIA0KICAgICAgICAgIH0NCg0KICAg\nICAgICBpZiAoKGJwLT5saW5lKVswXSA9PSAnXG4nKSB7DQojaWYgMA0KICAg\nICAgICAgICAgaWYgKGJwLT5oZWFkZXIgJiYgc2hvd2h0bWwgJiYgc2hvd2hl\nYWRlcnMpDQogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIjwvUFJFPlxu\nIik7DQojZW5kaWYNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChicC0+\naGVhZGVyICYmICFzaG93aGVhZGVycykgew0KICAgICAgICAgICAgYnAgPSBi\ncC0+bmV4dDsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoN\nCiAgICAgICAgaWYgKChicC0+bGluZSlbMF0gPT0gJ1xuJyAmJiBpbmJsYW5r\nKSB7DQogICAgICAgICAgICBicCA9IGJwLT5uZXh0Ow0KICAgICAgICAgICAg\nY29udGludWU7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICAg\nICAgaW5ibGFuayA9IDA7DQoNCiAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChi\ncC0+bGluZSwgIjxIVE1MPiIsIDYpKSB7DQogICAgICAgICAgICBpbmh0bWwg\nPSAxOw0KICAgICAgICAgICAgaWYgKCFzaG93aHRtbCAmJiBwcmUpIHsNCiAg\nICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPC9QUkU+XG4iKTsNCiAgICAg\nICAgICAgICAgICBwcmU9RkFMU0U7DQogICAgICAgICAgICB9DQogICAgICAg\nIH0NCiAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKGJwLT5saW5lLCAi\nPC9IVE1MPiIsIDcpKSB7DQogICAgICAgICAgICBpbmh0bWwgPSAwOw0KICAg\nICAgICAgICAgZnByaW50ZihmcCwgIiVzIiwgYnAtPmxpbmUpOw0KICAgICAg\nICAgICAgaWYgKCFzaG93aHRtbCAmJiAhcHJlKSB7DQogICAgICAgICAgICAg\nICAgZnByaW50ZihmcCwgIjxQUkU+XG4iKTsNCiAgICAgICAgICAgICAgICBw\ncmU9VFJVRTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJwID0gYnAt\nPm5leHQ7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQog\nICAgICAgIGlmIChpbmh0bWwpIHsNCiAgICAgICAgICAgIGZwcmludGYoZnAs\nICIlcyIsIGJwLT5saW5lKTsNCiAgICAgICAgICAgIGJwID0gYnAtPm5leHQ7\nDQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBp\nZiAoc2hvd2h0bWwpIHsNCiAgICAgICAgICAgIGlmICghc3RyY21wKGJwLT5s\naW5lLCAiLS1cbiIpIHx8DQogICAgICAgICAgICAgICAgIXN0cmNtcChicC0+\nbGluZSwgIi0tIFxuIikgfHwNCiAgICAgICAgICAgICAgICAhc3RyY21wKGJw\nLT5saW5lLCAiLS0tXG4iKSkgew0KICAgICAgICAgICAgICAgIGluc2lnID0g\nMTsNCiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPFBSRT5cbiIpOw0K\nICAgICAgICAgICAgICAgIHByZT1UUlVFOw0KICAgICAgICAgICAgfQ0KDQog\nICAgICAgICAgICBpZiAoKGJwLT5saW5lKVswXSA9PSAnXG4nKQ0KICAgICAg\nICAgICAgICAgIDsNCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAg\nICAgIGlmIChpbnNpZykNCiAgICAgICAgICAgICAgICAgICAgZnByaW50Zihm\ncCwgIiVzIiwgKGNoYXIgKiljb252dXJscyhicC0+bGluZSxpZCxzdWJqZWN0\nKSk7DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNxdW90ZShicC0+bGlu\nZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzJXMl\nc1xuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpcXVvdGVzKT8i\nPEVNPiI6IiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGFu\naWVsIGNoYW5nZWQgdGhpcyAxMHRoIG9mIEp1bHkgMTk5OCBmcm9tDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udnVybHMocm1jcihicC0+\nbGluZSksIGlkLCBzdWJqZWN0KSwgKi8NCiAgICAgICAgICAgICAgICAgICAg\nICAgICAgIGNvbnZ1cmxzKGJwLT5saW5lLCBpZCwgc3ViamVjdCksDQogICAg\nICAgICAgICAgICAgICAgICAgICAgICAoaXF1b3Rlcyk/IjwvRU0+IjoiIik7\nDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYg\nKChicC0+bGluZSlbMF0gIT0gJ1wwJykgew0KICAgICAgICAgICAgICAgICAg\nICBpbnQgc3A7DQogICAgICAgICAgICAgICAgICAgIGZvciAoc3AgPSAwO2lz\nc3BhY2UoYnAtPmxpbmVbc3BdKTtzcCsrKXsNCiAgICAgICAgICAgICAgICAg\nICAgICAgIGlmIChicC0+bGluZVtzcF0gPT0gJ1x0JykNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJm5ic3A7Jm5ic3A7Jm5i\nc3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Iik7DQogICAgICAg\nICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAg\nICAgICAgZnByaW50ZihmcCwgIiZuYnNwOyIpOw0KICAgICAgICAgICAgICAg\nICAgICB9DQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIlcyIs\nY29udnVybHMoJmJwLT5saW5lW3NwXSxpZCxzdWJqZWN0KSk7DQoNCiAgICAg\nICAgICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgICAgICAgKiogRGV0\nZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJyZWFrLg0KICAgICAgICAgICAg\nICAgICAgICAqKiBXZSBjb3VsZCBjaGVjayBmb3IgbGVhZGluZyBzcGFjZXMN\nCiAgICAgICAgICAgICAgICAgICAgKiogb3IgcXVvdGUgbGluZXMsIGJ1dCBp\nbiBnZW5lcmFsLA0KICAgICAgICAgICAgICAgICAgICAqKiBub24tYWxwaGFu\ndW1lcmljIGxpbmVzIHNob3VsZCBiZQ0KICAgICAgICAgICAgICAgICAgICAq\nKiBicm9rZW4gYmVmb3JlLg0KICAgICAgICAgICAgICAgICAgICAqLw0KIA0K\nICAgICAgICAgICAgICAgICAgICBpZiAoKHNob3diciAmJiAhYnAtPmhlYWRl\ncikgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICgoYnAtPm5leHQgIT0g\nTlVMTCkgJiYgIWlzYWxudW0oYnAtPm5leHQtPmxpbmVbMF0pKSkNCiAgICAg\nICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEJSPiIpOw0KICAgICAg\nICAgICAgICAgICAgICBpZighYnAtPmhlYWRlcikgew0KICAgICAgICAgICAg\nICAgICAgICAgIGZwcmludGYoZnAsICJcbiIpOw0KICAgICAgICAgICAgICAg\nICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB9DQog\nICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoKGJwLT5saW5lKVswXSAhPSAn\nXDAnKSB7DQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXMiLCAoY2hhciAq\nKSBjb252dXJscyhicC0+bGluZSwgaWQsIHN1YmplY3QpKTsNCiAgICAgICAg\nfQ0KICAgICAgICBicCA9IGJwLT5uZXh0Ow0KDQogICAgfQ0KDQogICAgaWYg\nKHByZSkgDQogICAgICAgIGZwcmludGYoZnAsICI8L1BSRT5cbiIpOw0KDQog\nICAgcHJpbnRjb21tZW50KGZwLCAiYm9keSIsICJlbmQiKTsNCiAgICBpZiAo\nc2hvd2hyKQ0KICAgICAgICBmcHJpbnRmKGZwLCAiPEhSPlxuIik7DQp9DQoN\nCi8qDQoqKiBQcmludGluZy4uLnRoZSBvdGhlciBtYWluIHBhcnQgb2YgdGhp\ncyBwcm9ncmFtIQ0KKiogVGhpcyB3cml0ZXMgb3V0IHRoZSBhcnRpY2xlcywg\nYmVnaW5uaW5nIHdpdGggdGhlIG51bWJlciBzdGFydG51bS4NCiovDQoNCnZv\naWQgd3JpdGVhcnRpY2xlcyhjaGFyICpkaXIsY2hhciAqbGFiZWwsY2hhciAq\nYWJvdXQsaW50IG92ZXJ3cml0ZSxpbnQgc3RhcnRudW0pDQp7DQogICAgaW50\nIG51bSwgc3RhdHVzbnVtLCBza2lwLCBzdWJqbWF0Y2gsIG5ld2ZpbGU7DQog\nICAgY2hhciBuYW1lW05BTUVTVFJMRU5dLCBlbWFpbFtNQUlMU1RSTEVOXSwg\nc3ViamVjdFtTVUJKU1RSTEVOXSwNCiAgICAgICAgaW5yZXBseVtSRVBZU1RS\nTEVOXSwgZGF0ZVtEQVRFU1RSTEVOXSwgZnJvbWRhdGVbREFURVNUUkxFTl0s\nDQogICAgICAgIG1zZ2lkW01TR0RTVFJMRU5dOw0KICAgIGNoYXIgbmFtZTJb\nTkFNRVNUUkxFTl0sIGVtYWlsMltNQUlMU1RSTEVOXSwgc3ViamVjdDJbU1VC\nSlNUUkxFTl0sDQogICAgICAgIGlucmVwbHkyW1JFUFlTVFJMRU5dLCBkYXRl\nMltEQVRFU1RSTEVOXSwgZnJvbWRhdGUyW0RBVEVTVFJMRU5dLA0KICAgICAg\nICBtc2dpZDJbTVNHRFNUUkxFTl07DQogICAgY2hhciBmaWxlbmFtZVtNQVhG\nSUxFTEVOXTsNCiAgICBzdHJ1Y3QgYm9keSAqYnAsICpzdGF0dXM7DQogICAg\nc3RydWN0IHJlcGx5ICpycDsNCiAgICBGSUxFICpmcDsNCg0KICAgIG51bSA9\nIHN0YXJ0bnVtOw0KICAgIHNraXAgPSAwOw0KDQogICAgaWYgKHNob3dwcm9n\ncmVzcykNCiAgICAgICAgcHJpbnRmKCJXcml0aW5nIGFydGljbGVzIHRvIFwi\nJXNcIi4uLiAgICAiLCBkaXIpOw0KDQogICAgd2hpbGUgKChicCA9IChzdHJ1\nY3QgYm9keSAqKSBoYXNobnVtbG9va3VwKG51bSwgbmFtZSwgZW1haWwsDQog\nICAgICAgICAgICBzdWJqZWN0LCBpbnJlcGx5LCBkYXRlLCBmcm9tZGF0ZSwg\nbXNnaWQpKSAhPSBOVUxMKSB7DQoNCiAgICAgICAgc3ByaW50ZihmaWxlbmFt\nZSwgIiVzJXMlLjRkLmh0bWwiLCANCiAgICAgICAgICAgICAgICBkaXIsIChk\naXJbc3RybGVuKGRpcikgLSAxXSA9PSAnLycpID8gIiIgOiAiLyIsIG51bSk7\nDQoNCiAgICAgICAgLyoNCiAgICAgICAgKiogRGV0ZXJtaW5lIHRvIG92ZXJ3\ncml0ZSBmaWxlcyBvciBub3QNCiAgICAgICAgKi8NCg0KICAgICAgICBpZiAo\naXNmaWxlKGZpbGVuYW1lKSkNCiAgICAgICAgICAgIG5ld2ZpbGUgPSAwOw0K\nICAgICAgICBlbHNlDQogICAgICAgICAgICBuZXdmaWxlID0gMTsNCg0KICAg\nICAgICBpZiAoIW5ld2ZpbGUgJiYgIW92ZXJ3cml0ZSkgew0KICAgICAgICAg\nICAgc2tpcCA9IDE7IC8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeSB3aXRo\nIGNvbnRpbnVlID8/PyAqLw0KICAgICAgICAgICAgbnVtKys7DQogICAgICAg\nICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIHsNCiAg\nICAgICAgICAgIGlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKSkgPT0g\nTlVMTCkgew0KICAgICAgICAgICAgICAgIHNwcmludGYoZXJybXNnLCAiQ291\nbGRuJ3Qgd3JpdGUgXCIlc1wiLiIsIGZpbGVuYW1lKTsNCiAgICAgICAgICAg\nICAgICBwcm9nZXJyKChjaGFyICopIE5VTEwpOw0KICAgICAgICAgICAgfQ0K\nICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAgICAgKiogQ3JlYXRlIHRo\nZSBjb21tZW50IGZpZWxkcyBuZWNlc3NhcnkgZm9yIGluY3JlbWVudGFsIHVw\nZGF0aW5nDQogICAgICAgICovDQoNCiAgICAgICAgcHJpbnRfbXNnX2hlYWRl\ncihmcCwgbGFiZWwsIHN1YmplY3QsIGRpciwgbmFtZSwgZW1haWwsIG1zZ2lk\nKTsNCg0KICAgICAgICBwcmludGNvbW1lbnQoZnAsICJyZWNlaXZlZCIsIGZy\nb21kYXRlKTsNCiAgICAgICAgcHJpbnRjb21tZW50KGZwLCAic2VudCIsIGRh\ndGUpOw0KICAgICAgICBwcmludGNvbW1lbnQoZnAsICJuYW1lIiwgbmFtZSk7\nDQogICAgICAgIHByaW50Y29tbWVudChmcCwgImVtYWlsIiwgZW1haWwpOw0K\nICAgICAgICBwcmludGNvbW1lbnQoZnAsICJzdWJqZWN0IiwgY29udmNoYXJz\nKHN1YmplY3QpKTsNCiAgICAgICAgcHJpbnRjb21tZW50KGZwLCAiaWQiLCBt\nc2dpZCk7DQogICAgICAgIHByaW50Y29tbWVudChmcCwgImlucmVwbHl0byIs\nIGNvbnZjaGFycyhpbnJlcGx5KSk7DQoNCiAgICAgICAgaWYgKHVzZXRhYmxl\nKSB7DQogICAgICAgICAgICBmcHJpbnRfbWVudShmcCxOT19JTkRFWCxhYm91\ndCwiIixtc2dpZCxzdWJqZWN0LFBBR0VfVE9QKTsNCiAgICAgICAgICAgIGZw\ncmludGYoZnAsICI8UD5cbiIpOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoN\nCiAgICAgICAgKiogUHJpbnQgdGhlIG1lc3NhZ2UncyBhdXRob3IgaW5mbyBh\nbmQgZGF0ZS4NCiAgICAgICAgKi8NCg0KICAgICAgICBpZiAoIXN0cmNtcChu\nYW1lLCBlbWFpbCkpIHsNCiAgICAgICAgICAgIGlmICh1c2VfbWFpbGNvbW1h\nbmQpIHsNCiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEEgSFJFRj1c\nIiVzXCI+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbWFrZW1haWxj\nb21tYW5kKG1haWxjb21tYW5kLGVtYWlsLG1zZ2lkLHN1YmplY3QpKTsNCiAg\nICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEVNPiVzPC9FTT48L0E+PEJS\nPlxuIiwgbmFtZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNl\nDQogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIjxFTT4lczwvRU0+PEJS\nPlxuIiwgbmFtZSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAg\nICAgICAgICBpZiAodXNlX21haWxjb21tYW5kKSB7ICANCiAgICAgICAgICAg\nICAgICBmcHJpbnRmKGZwLCI8U1RST05HPiVzPC9TVFJPTkc+ICg8QSBIUkVG\nPVwiJXNcIj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxtYWtl\nbWFpbGNvbW1hbmQobWFpbGNvbW1hbmQsZW1haWwsbXNnaWQsc3ViamVjdCkp\nOw0KICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICI8RU0+JXM8L0VNPjwv\nQT4pPEJSPlxuIiwgZW1haWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAg\nICAgZWxzZQ0KICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIlcyAoPEVN\nPiVzPC9FTT4pPEJSPlxuIiwgbmFtZSwgZW1haWwpOw0KICAgICAgICB9DQog\nICAgICAgIGZwcmludGYoZnAsICI8RU0+JXM8L0VNPlxuPFA+XG4iLCBkYXRl\nKTsNCiANCiAgICAgICAgLyoNCiAgICAgICAgKiogVGhpcyBpcyBoZXJlIGJl\nY2F1c2UgaXQgbG9va3MgYmV0dGVyIGhlcmUuIFRoZSB0YWJsZSBsb29rcw0K\nICAgICAgICAqKiBiZXR0ZXIgYmVmb3JlIHRoZSBBdXRob3IgaW5mby4gVGhp\ncyBzdHVmZiBzaG91bGQgYmUgaW4gDQogICAgICAgICoqIHByaW50ZmlsZSgp\nIHNvIGl0IGNvdWxkIGJlIGxhaWQgb3V0IGFzIHRoZSB1c2VyIHdhbnRzLi4u\nDQogICAgICAgICovDQoNCiAgICAgICAgaWYgKCF1c2V0YWJsZSkgew0KICAg\nICAgICAgICAgZnByaW50ZihmcCwgIjxVTD5cbiIpOw0KICAgICAgICAgICAg\nZnByaW50ZihmcCwgIjxMST48U1RST05HPk1lc3NhZ2VzIHNvcnRlZCBieTo8\nL1NUUk9ORz4gXG4iKTsNCiAgICAgICAgICAgIGZwcmludGYoZnAsICI8QSBI\nUkVGPVwiJXMjJWRcIj5bIGRhdGUgXTwvQT5cbiIsIGRhdGVuYW1lLCBudW0p\nOw0KICAgICAgICAgICAgZnByaW50ZihmcCwgIjxBIEhSRUY9XCIlcyMlZFwi\nPlsgdGhyZWFkIF08L0E+XG4iLCB0aHJkbmFtZSwgbnVtKTsNCiAgICAgICAg\nICAgIGZwcmludGYoZnAsICI8QSBIUkVGPVwiJXMjJWRcIj5bIHN1YmplY3Qg\nXTwvQT5cbiIsIHN1YmpuYW1lLCBudW0pOw0KICAgICAgICAgICAgZnByaW50\nZihmcCwgIjxBIEhSRUY9XCIlcyMlZFwiPlsgYXV0aG9yIF08L0E+XG4iLCBh\ndXRobmFtZSxudW0pOw0KICAgICAgICB9DQoNCiAgICAgICAgLyoNCiAgICAg\nICAgKiogU2hvdWxkIHdlIHByaW50IG1lc3NhZ2UgbGlua3MgPw0KICAgICAg\nICAqLw0KDQogICAgICAgIGlmIChzaG93X21zZ19saW5rcykgew0KICAgICAg\nICAgICAgcHJpbnRjb21tZW50KGZwLCAibmV4dCIsICJzdGFydCIpOw0KICAg\nICAgICAgICAgaWYgKHVzZXRhYmxlKQ0KICAgICAgICAgICAgICAgIGZwcmlu\ndGYoZnAsICI8VUw+XG4iKTsNCiAgICANCiAgICAgICAgICAgIC8qDQogICAg\nICAgICAgICAqKiBJcyB0aGVyZSBhIG5leHQgbWVzc2FnZT8NCiAgICAgICAg\nICAgICovDQogICAgDQogICAgICAgICAgICBzdGF0dXMgPSAoc3RydWN0IGJv\nZHkgKikgaGFzaG51bWxvb2t1cChudW0gKyAxLCBuYW1lMiwgZW1haWwyLA0K\nICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QyLCBpbnJlcGx5MiwgZGF0\nZTIsIGZyb21kYXRlMiwgbXNnaWQyKTsNCiAgICAgICAgICAgIGlmIChzdGF0\ndXMgIT0gTlVMTCkgew0KICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICI8\nTEk+PFNUUk9ORz5OZXh0IG1lc3NhZ2U6PC9TVFJPTkc+ICIpOw0KICAgICAg\nICAgICAgICAgIGZwcmludGYoZnAsICI8QSBIUkVGPVwiJS40ZC5odG1sXCI+\nJXM6IFwiJXNcIjwvQT5cbiIsDQogICAgICAgICAgICAgICAgbnVtICsgMSwg\nbmFtZTIsIGNvbnZjaGFycyhzdWJqZWN0MikpOw0KICAgICAgICAgICAgfQ0K\nICAgIA0KICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICoqIElzIHRoZXJl\nIGEgcHJldmlvdXMgbWVzc2FnZT8NCiAgICAgICAgICAgICovDQogICAgDQog\nICAgICAgICAgICBzdGF0dXMgPSAoc3RydWN0IGJvZHkgKikgaGFzaG51bWxv\nb2t1cChudW0gLSAxLCBuYW1lMiwgZW1haWwyLA0KICAgICAgICAgICAgICAg\nICAgICAgIHN1YmplY3QyLCBpbnJlcGx5MiwgZGF0ZTIsIGZyb21kYXRlMiwg\nbXNnaWQyKTsNCiAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgew0K\nICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz5QcmV2\naW91cyBtZXNzYWdlOjwvU1RST05HPiAiKTsNCiAgICAgICAgICAgICAgICBm\ncHJpbnRmKGZwLCAiPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiVzOiBcIiVzXCI8\nL0E+XG4iLA0KICAgICAgICAgICAgICAgIG51bSAtIDEsIG5hbWUyLCBjb252\nY2hhcnMoc3ViamVjdDIpKTsNCiAgICAgICAgICAgIH0NCiAgICANCiAgICAg\nICAgICAgIC8qDQogICAgICAgICAgICAqKiBJcyB0aGlzIG1lc3NhZ2UgYSBy\nZXBseSB0byBhbm90aGVyPw0KICAgICAgICAgICAgKi8NCiAgICANCiAgICAg\nICAgICAgIGlmIChpbnJlcGx5WzBdICE9ICdcMCcpIHsNCiAgICAgICAgICAg\nICAgICBzdGF0dXNudW0gPSBoYXNocmVwbHlsb29rdXAoaW5yZXBseTIsbmFt\nZTIsc3ViamVjdDIsJnN1YmptYXRjaCk7DQogICAgICAgICAgICAgICAgaWYg\nKHN0YXR1c251bSAhPSAtMSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAo\nc3Viam1hdGNoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Zihm\ncCwiPExJPjxTVFJPTkc+TWF5YmUgaW4gcmVwbHkgdG86PC9TVFJPTkc+Iik7\nDQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAg\nICAgICAgIGZwcmludGYoZnAsIjxMST48U1RST05HPkluIHJlcGx5IHRvOjwv\nU1RST05HPiIpOw0KICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCIg\nPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiIsc3RhdHVzbnVtKTsNCiAgICAgICAg\nICAgICAgICAgICAgZnByaW50ZihmcCwiJXM6IFwiJXNcIjwvQT5cbiIsbmFt\nZTIsY29udmNoYXJzKHN1YmplY3QyKSk7DQogICAgICAgICAgICAgICAgfQ0K\nICAgICAgICAgICAgfQ0KICAgIA0KICAgICAgICAgICAgLyoNCiAgICAgICAg\nICAgICoqIElzIHRoZXJlIGEgbWVzc2FnZSBuZXh0IGluIHRoZSB0aHJlYWQ/\nDQogICAgICAgICAgICAqLw0KICAgIA0KICAgICAgICAgICAgcHJpbnRjb21t\nZW50KGZwLCAibmV4dHRocmVhZCIsICJzdGFydCIpOw0KICAgIA0KICAgICAg\nICAgICAgZm9yIChycCA9IHRocmVhZGxpc3Q7IHJwICE9IE5VTEw7IHJwID0g\ncnAtPm5leHQpDQogICAgICAgICAgICAgICAgaWYgKHJwLT5tc2dudW0gPT0g\nbnVtICYmIHJwLT5uZXh0ICE9IE5VTEwgJiYNCiAgICAgICAgICAgICAgICAg\nICAgcnAtPm5leHQtPm1zZ251bSAhPSAtMSkgew0KICAgICAgICAgICAgICAg\nICAgICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+TmV4dCBpbiB0aHJlYWQ6\nPC9TVFJPTkc+ICIpOw0KICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZw\nLCAiPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiIsIHJwLT5uZXh0LT5tc2dudW0p\nOw0KICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXM6IFwiJXNc\nIjwvQT5cbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPm5l\neHQtPm5hbWUsIGNvbnZjaGFycyhycC0+bmV4dC0+c3ViamVjdCkpOw0KICAg\nICAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAvKg0KICAg\nICAgICAgICAgICAgICoqIERvZXMgdGhpcyBtZXNzYWdlIGhhdmUgcmVwbGll\ncz8gSWYgc28sIHByaW50IHRoZW0gYWxsIQ0KICAgICAgICAgICAgICAgICov\nDQogICAgDQogICAgICAgICAgICAgICAgaWYgKHNob3dyZXBsaWVzKSB7DQog\nICAgICAgICAgICAgICAgICAgIGZvciAocnAgPSByZXBseWxpc3Q7IHJwICE9\nIE5VTEw7IHJwID0gcnAtPm5leHQpIHsNCiAgICAgICAgICAgICAgICAgICAg\nICAgIGlmIChycC0+bXNnbnVtID09IG51bSkgew0KICAgICAgICAgICAgICAg\nICAgICAgICAgICAgIGlmIChycC0+bWF5YmVyZXBseSkNCiAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwiPExJPjxTVFJPTkc+\nTWF5YmUgcmVwbHk6PC9TVFJPTkc+Iik7DQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+UmVwbHk6PC9TVFJPTkc+Iik7\nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwiIDxB\nIEhSRUY9XCIlLjRkLmh0bWxcIj4iLHJwLT5mcm9tbXNnbnVtKTsNCiAgICAg\nICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCIlczogXCIlc1wi\nPC9BPlxuIixycC0+bmFtZSxjb252Y2hhcnMocnAtPnN1YmplY3QpKTsNCiAg\nICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAg\nfQ0KICAgICAgICAgICAgICAgICAgICBwcmludGNvbW1lbnQoZnAsICJyZXBs\neSIsICJlbmQiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgIH0NCg0K\nICAgICAgICBmcHJpbnRmKGZwLCAiPC9VTD5cbiIpOw0KDQoNCiAgICAgICAg\nLyoNCiAgICAgICAgKiogRmluYWxseS4uLnByaW50IHRoZSBib2R5IQ0KICAg\nICAgICAqLw0KDQogICAgICAgIHByaW50Ym9keShmcCwgYnAsIG1zZ2lkLCBz\ndWJqZWN0KTsNCg0KICAgICAgICAvKg0KICAgICAgICAqKiBTaG91bGQgd2Ug\ncHJpbnQgb3V0IHRoZSBtZXNzYWdlIGxpbmtzID8NCiAgICAgICAgKi8NCg0K\nICAgICAgICBpZiAoc2hvd19tc2dfbGlua3MpIHsNCiAgICAgICAgICAgIGZw\ncmludGYoZnAsICI8UD5cbjxVTD5cbiIpOw0KICAgIA0KICAgICAgICAgICAg\ncHJpbnRjb21tZW50KGZwLCAibmV4dCIsICJzdGFydCIpOw0KICAgIA0KICAg\nICAgICAgICAgc3RhdHVzID0gKHN0cnVjdCBib2R5ICopIGhhc2hudW1sb29r\ndXAobnVtICsgMSwgbmFtZTIsDQogICAgICAgICAgICAgICAgICAgICAgZW1h\naWwyLCBzdWJqZWN0MiwgaW5yZXBseTIsIGRhdGUyLCBmcm9tZGF0ZTIsIG1z\nZ2lkMik7DQogICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsNCiAg\nICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+TmV4dCBt\nZXNzYWdlOjwvU1RST05HPiAiKTsNCiAgICAgICAgICAgICAgICBmcHJpbnRm\nKGZwLCAiPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiVzOiBcIiVzXCI8L0E+XG4i\nLA0KICAgICAgICAgICAgICAgICAgICAgICAgbnVtICsgMSwgbmFtZTIsIGNv\nbnZjaGFycyhzdWJqZWN0MikpOw0KICAgICAgICAgICAgfQ0KICAgIA0KICAg\nICAgICAgICAgc3RhdHVzID0gKHN0cnVjdCBib2R5ICopIGhhc2hudW1sb29r\ndXAobnVtIC0gMSwgbmFtZTIsDQogICAgICAgICAgICAgICAgICAgICAgZW1h\naWwyLCBzdWJqZWN0MiwgaW5yZXBseTIsIGRhdGUyLCBmcm9tZGF0ZTIsIG1z\nZ2lkMik7DQogICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsNCiAg\nICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPExJPjxTVFJPTkc+UHJldmlv\ndXMgbWVzc2FnZTo8L1NUUk9ORz4gIik7DQogICAgICAgICAgICAgICAgZnBy\naW50ZihmcCwgIjxBIEhSRUY9XCIlLjRkLmh0bWxcIj4lczogXCIlc1wiPC9B\nPlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSAtIDEsIG5hbWUy\nLCBjb252Y2hhcnMoc3ViamVjdDIpKTsNCiAgICAgICAgICAgIH0NCiAgICAN\nCiAgICAgICAgICAgIGlmIChpbnJlcGx5WzBdICE9ICdcMCcpIHsNCiAgICAg\nICAgICAgICAgICBzdGF0dXNudW0gPSBoYXNocmVwbHlsb29rdXAoaW5yZXBs\neTIsbmFtZTIsc3ViamVjdDIsJnN1YmptYXRjaCk7DQogICAgICAgICAgICAg\nICAgaWYgKHN0YXR1c251bSAhPSAtMSkgew0KICAgICAgICAgICAgICAgICAg\nICBpZiAoc3Viam1hdGNoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZnBy\naW50ZihmcCwiPExJPjxTVFJPTkc+TWF5YmUgaW4gcmVwbHkgdG86PC9TVFJP\nTkc+Iik7DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAg\nICAgICAgICAgICAgIGZwcmludGYoZnAsIjxMST48U1RST05HPkluIHJlcGx5\nIHRvOjwvU1RST05HPiIpOw0KICAgICAgICAgICAgICAgICAgICBmcHJpbnRm\nKGZwLCIgPEEgSFJFRj1cIiUuNGQuaHRtbFwiPiIsc3RhdHVzbnVtKTsNCiAg\nICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwiJXM6IFwiJXNcIjwvQT5c\nbiIsbmFtZTIsY29udmNoYXJzKHN1YmplY3QyKSk7DQogICAgICAgICAgICAg\nICAgfQ0KICAgICAgICAgICAgfQ0KICAgIA0KICAgICAgICAgICAgcHJpbnRj\nb21tZW50KGZwLCAibmV4dHRocmVhZCIsICJzdGFydCIpOw0KICAgIA0KICAg\nICAgICAgICAgZm9yIChycCA9IHRocmVhZGxpc3Q7IHJwICE9IE5VTEw7IHJw\nID0gcnAtPm5leHQpIHsNCiAgICAgICAgICAgICAgICBpZiAocnAtPm1zZ251\nbSA9PSBudW0gJiYgcnAtPm5leHQgIT0gTlVMTCAmJg0KICAgICAgICAgICAg\nICAgICAgICBycC0+bmV4dC0+bXNnbnVtICE9IC0xKSB7DQogICAgICAgICAg\nICAgICAgICAgIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz5OZXh0IGluIHRo\ncmVhZDo8L1NUUk9ORz4gIik7DQogICAgICAgICAgICAgICAgICAgIGZwcmlu\ndGYoZnAsICI8QSBIUkVGPVwiJS40ZC5odG1sXCI+IiwgcnAtPm5leHQtPm1z\nZ251bSk7DQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIlczog\nXCIlc1wiPC9BPlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBy\ncC0+bmV4dC0+bmFtZSwgY29udmNoYXJzKHJwLT5uZXh0LT5zdWJqZWN0KSk7\nDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgIA0KICAg\nICAgICAgICAgaWYgKHNob3dyZXBsaWVzKSB7DQogICAgICAgICAgICAgICAg\nZm9yIChycCA9IHJlcGx5bGlzdDsgcnAgIT0gTlVMTDsgcnAgPSBycC0+bmV4\ndCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocnAtPm1zZ251bSA9PSBu\ndW0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycC0+bWF5YmVy\nZXBseSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZw\nLCAiPExJPjxTVFJPTkc+TWF5YmUgcmVwbHk6PC9TVFJPTkc+Iik7DQogICAg\nICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAg\nICAgICAgICAgZnByaW50ZihmcCwgIjxMST48U1RST05HPlJlcGx5OjwvU1RS\nT05HPiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwg\nIiA8QSBIUkVGPVwiJS40ZC5odG1sXCI+IiwgcnAtPmZyb21tc2dudW0pOw0K\nICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzOiBcIiVz\nXCI8L0E+XG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy\ncC0+bmFtZSwgY29udmNoYXJzKHJwLT5zdWJqZWN0KSk7DQogICAgICAgICAg\nICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAg\nICAgcHJpbnRjb21tZW50KGZwLCAicmVwbHkiLCAiZW5kIik7DQogICAgICAg\nICAgICB9DQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiPC9VTD5cbiIpOw0K\nICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHVzZXRhYmxlKQ0KICAg\nICAgICAgICAgZnByaW50X21lbnUoZnAsTk9fSU5ERVgsYWJvdXQsIiIsbXNn\naWQsc3ViamVjdCxQQUdFX0JPVFRPTSk7DQoNCiAgICAgICAgcHJpbnRmb290\nZXIoZnAsIG1odG1sZm9vdGVyLCBsYWJlbCwgZGlyLCBzdWJqZWN0KTsNCg0K\nICAgICAgICBmY2xvc2UoZnApOw0KDQogICAgICAgIGlmIChuZXdmaWxlICYm\nIGNobW9kKGZpbGVuYW1lLCBmaWxlbW9kZSkgPT0gLTEpIHsNCiAgICAgICAg\nICAgIHNwcmludGYoZXJybXNnLCAiQ291bGRuJ3QgY2htb2QgXCIlc1wiIHRv\nICVvLiIsDQogICAgICAgICAgICBmaWxlbmFtZSwgZmlsZW1vZGUpOw0KICAg\nICAgICAgICAgcHJvZ2VycigoY2hhciAqKSBOVUxMKTsNCiAgICAgICAgfQ0K\nDQogICAgICAgIGlmICghKG51bSAlIDUpICYmIHNob3dwcm9ncmVzcyAmJiAh\nc2tpcCkgew0KICAgICAgICAgICAgcHJpbnRmKCJcYlxiXGJcYiUzLjBmJWMi\nLCgoZmxvYXQpIG51bSAvIChmbG9hdCkgYmlnbnVtKSAqIDEwMCwnJScpOw0K\nICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7DQogICAgICAgIH0NCg0KICAg\nICAgICBudW0rKzsNCiAgICB9DQogICAgaWYgKHNob3dwcm9ncmVzcykNCiAg\nICAgICAgcHJpbnRmKCJcYlxiXGJcYiAgICBcbiIpOw0KICAgIGlmICghb3Zl\ncndyaXRlKQ0KICAgICAgICBiaWdudW0gPSBudW0gLSAxOw0KfQ0KDQoNCi8q\nDQoqKiBXcml0ZSB0aGUgZGF0ZSBpbmRleC4uLg0KKi8NCg0Kdm9pZCB3cml0\nZWRhdGVzKGNoYXIgKmRpciwgY2hhciAqbGFiZWwsIGNoYXIgKmFyY2hpdmVz\nLCBjaGFyICphYm91dCkNCnsNCiAgICBpbnQgbmV3ZmlsZTsNCiAgICBjaGFy\nIGZpbGVuYW1lW01BWEZJTEVMRU5dOw0KICAgIEZJTEUgKmZwOw0KDQogICAg\nc3ByaW50ZihmaWxlbmFtZSwgIiVzJXMlcyIsIGRpciwNCgkoZGlyW3N0cmxl\nbihkaXIpIC0gMV0gPT0gJy8nKSA/ICIiIDogIi8iLCBkYXRlbmFtZSk7DQoN\nCiAgICBpZiAoaXNmaWxlKGZpbGVuYW1lKSkNCiAgICAgICAgbmV3ZmlsZSA9\nIDA7DQogICAgZWxzZQ0KICAgICAgICBuZXdmaWxlID0gMTsNCg0KICAgIGlm\nICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKSkgPT0gTlVMTCkgew0KICAg\nICAgICBzcHJpbnRmKGVycm1zZywgIkNvdWxkbid0IHdyaXRlIFwiJXNcIi4i\nLCBmaWxlbmFtZSk7DQogICAgICAgIHByb2dlcnIoKGNoYXIgKikgTlVMTCk7\nDQogICAgfQ0KDQogICAgaWYgKHNob3dwcm9ncmVzcykNCiAgICAgICAgcHJp\nbnRmKCJXcml0aW5nIGRhdGUgaW5kZXggdG8gXCIlc1wiLi4uIiwgZmlsZW5h\nbWUpOw0KDQogICAgLyoNCiAgICAqKiBQcmludCBvdXQgdGhlIGluZGV4IGZp\nbGUgaGVhZGVyIA0KICAgICovDQogICAgcHJpbnRfaW5kZXhfaGVhZGVyKGZw\nLCBsYWJlbCwgZGlyLCAiQnkgRGF0ZSIpOw0KDQogICAgaWYgKCF1c2V0YWJs\nZSkgew0KICAgICAgICAvKiANCiAgICAgICAgKiogUHJpbnQgb3V0IGFyY2hp\ndmUgaW5mb3JtYXRpb24gbGlua3MgYXQgdGhlIHRvcCBvZiB0aGUgaW5kZXgN\nCiAgICAgICAgKi8gDQogICAgICAgIHByaW50X2luZGV4X2hlYWRlcl9saW5r\ncyhmcCwgYXJjaGl2ZXMsIGFib3V0LCBGUk9NX0RBVEUpOw0KICAgIA0KICAg\nICAgICBpZiAoc2hvd2hyKQ0KICAgICAgICAgICAgZnByaW50ZihmcCwgIjxI\nUj5cbiIpOw0KDQogICAgICAgIC8qDQogICAgICAgICoqIFByaW50b3V0IHRo\nZSBEYXRlcyBmb3IgdGhlIFN0YXJ0aW5nIGFuZCBFbmRpbmcgbWVzc2FnZXMg\nDQogICAgICAgICoqIGluIHRoZSBhcmNoaXZlLCBhbG9uZyB3aXRoIGEgY291\nbnQgb2YgdGhlIG1lc3NhZ2VzLg0KICAgICAgICAqLw0KDQogICAgICAgIGZw\ncmludGYoZnAsICI8U1RST05HPlN0YXJ0aW5nOjwvU1RST05HPiA8RU0+JXM8\nL0VNPjxCUj5cbiIsIA0KICAgICAgICAgICAgICAgIGdldGRhdGVzdHIoZmly\nc3RkYXRlbnVtKSk7DQogICAgICAgIGZwcmludGYoZnAsICI8U1RST05HPkVu\nZGluZzo8L1NUUk9ORz4gPEVNPiVzPC9FTT48QlI+XG4iLCANCiAgICAgICAg\nICAgICAgICBnZXRkYXRlc3RyKGxhc3RkYXRlbnVtKSk7DQogICAgICAgIGZw\ncmludGYoZnAsICI8U1RST05HPk1lc3NhZ2VzOjwvU1RST05HPiAlZFxuPFA+\nXG4iLCBiaWdudW0gKyAxKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAg\nIGZwcmludF9tZW51KGZwLCBEQVRFX0lOREVYLCBhYm91dCwgYXJjaGl2ZXMs\nICIiLCAiIiwgUEFHRV9UT1ApOw0KICAgICAgICBmcHJpbnRfc3VtbWFyeShm\ncCwgZmlyc3RkYXRlbnVtLCBsYXN0ZGF0ZW51bSwgYmlnbnVtICsgMSk7DQog\nICAgICAgIGlmIChzaG93aHIpDQogICAgICAgICAgICBmcHJpbnRmKGZwLCAi\nPEhSPlxuIik7DQogICAgfQ0KDQogICAgLyoNCiAgICAqKiBQcmludCBvdXQg\ndGhlIGFjdHVhbCBtZXNzYWdlIGluZGV4IGxpc3RzLiBIZXJlJ3MgdGhlIGJl\nZWYuDQogICAgKi8NCg0KICAgIGZwcmludGYoZnAsICI8VUw+XG4iKTsNCiAg\nICBwcmludGRhdGVzKGZwLCBkYXRlbGlzdCk7DQogICAgZnByaW50ZihmcCwg\nIjwvVUw+XG48UD5cbiIpOw0KDQogICAgaWYgKCF1c2V0YWJsZSkgew0KICAg\nICAgICAvKg0KICAgICAgICAqKiBQcmludG91dCB0aGUgZGF0ZXMgZm9yIHRo\nZSBsYXN0IG1lc3NhZ2UgaW4gdGhlIGFyY2hpdmUNCiAgICAgICAgKiogYWxv\nbmcgd2l0aCB0aGUgZGF0ZSB0aGUgYXJjaGl2ZSB3YXMgZ2VuZXJhdGVkIG9u\nLg0KICAgICAgICAqLw0KDQogICAgICAgIGZwcmludGYoZnAsIjxBIE5BTUU9\nXCJlbmRcIj48U1RST05HPkxhc3QgbWVzc2FnZSBkYXRlOjwvU1RST05HPjwv\nQT4gIik7DQogICAgICAgIGZwcmludGYoZnAsIjxFTT4lczwvRU0+PEJSPlxu\nIiwgZ2V0ZGF0ZXN0cihsYXN0ZGF0ZW51bSkpOw0KICAgICAgICBmcHJpbnRm\nKGZwLCI8U1RST05HPkFyY2hpdmVkIG9uOjwvU1RST05HPiA8RU0+JXM8L0VN\nPjxQPlxuIixnZXRsb2NhbHRpbWUoKSk7DQogICAgICAgIGlmIChzaG93aHIp\nDQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEhSPlxuIik7DQoNCiAgICAg\nICAgLyogDQogICAgICAgICoqIFByaW50IG91dCBhcmNoaXZlIGluZm9ybWF0\naW9uIGxpbmtzIGF0IHRoZSBib3R0b20gb2YgdGhlIGluZGV4DQogICAgICAg\nICovIA0KICAgICAgICBwcmludF9pbmRleF9mb290ZXJfbGlua3MoZnAsIGFy\nY2hpdmVzLCBGUk9NX0RBVEUpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAg\nICAgZnByaW50X21lbnUoZnAsIERBVEVfSU5ERVgsIGFib3V0LCBhcmNoaXZl\ncywgIiIsICIiLCBQQUdFX0JPVFRPTSk7DQogICAgfQ0KDQogICAgLyogDQog\nICAgKiogUHJpbnQgdGhlIGluZGV4IHBhZ2UgZm9vdGVyLg0KICAgICovDQog\nICAgcHJpbnRmb290ZXIoZnAsIGlodG1sZm9vdGVyLCBsYWJlbCwgZGlyLCAi\nQnkgRGF0ZSIpOw0KDQogICAgZmNsb3NlKGZwKTsNCg0KICAgIGlmIChuZXdm\naWxlICYmIGNobW9kKGZpbGVuYW1lLCBmaWxlbW9kZSkgPT0gLTEpIHsNCiAg\nICAgICAgc3ByaW50ZihlcnJtc2csICJDb3VsZG4ndCBjaG1vZCBcIiVzXCIg\ndG8gJW8uIiwgZmlsZW5hbWUsDQogICAgICAgIGZpbGVtb2RlKTsNCiAgICAg\nICAgcHJvZ2VycigoY2hhciAqKSBOVUxMKTsNCiAgICB9DQoNCiAgICBpZiAo\nc2hvd3Byb2dyZXNzKQ0KICAgICAgICBwdXRjaGFyKCdcbicpOw0KfQ0KDQov\nKg0KKiogV2hpbGUgcHJpbnRpbmcgdGhlIHRocmVhZCBpbmRleCwgcHJpbnRz\nIGFueSByZXBsaWVzIHRvIHJlcGxpZXMuDQoqLw0KDQp2b2lkIGNoZWNrcmVw\nbGllcyhGSUxFICpmcCwgaW50IG51bSwgaW50IGxldmVsKQ0Kew0KICAgIHN0\ncnVjdCByZXBseSAqcnA7DQoNCiAgICBmb3IgKHJwID0gcmVwbHlsaXN0OyBy\ncCAhPSBOVUxMOyBycCA9IHJwLT5uZXh0KSB7DQogICAgICAgIGlmIChycC0+\nbXNnbnVtID09IG51bSkgew0KICAgICAgICAgICAgaWYgKGxldmVsIDwgdGhy\nZGxldmVscykNCiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiPFVMPlxu\nIik7DQogICAgICAgICAgICBmcHJpbnRmKGZwLCI8TEk+PEEgSFJFRj1cIiUu\nNGQuaHRtbFwiPiIscnAtPmZyb21tc2dudW0pOw0KICAgICAgICAgICAgcHJp\nbnRlZGxpc3QgPSAoc3RydWN0IHByaW50ZWQgKikNCiAgICAgICAgICAgICAg\nICAgICAgICAgICAgIG1hcmthc3ByaW50ZWQocHJpbnRlZGxpc3QsIHJwLT5m\ncm9tbXNnbnVtKTsNCiAgICAgICAgICAgIGZwcmludGYoZnAsIjxTVFJPTkc+\nJXMgPC9TVFJPTkc+PC9BPiAiLGNvbnZjaGFycyhycC0+c3ViamVjdCkpOw0K\nICAgICAgICAgICAgZnByaW50ZihmcCwgIjxBIE5BTUU9XCIlZFwiPjxFTT4l\nczwvRU0+PC9BPlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJw\nLT5mcm9tbXNnbnVtLCBycC0+bmFtZSk7DQogICAgICAgICAgICBjaGVja3Jl\ncGxpZXMoZnAsIHJwLT5mcm9tbXNnbnVtLCBsZXZlbCArIDEpOw0KICAgICAg\nICAgICAgaWYgKGxldmVsIDwgdGhyZGxldmVscykNCiAgICAgICAgICAgICAg\nICBmcHJpbnRmKGZwLCAiPC9VTD5cbiIpOw0KICAgICAgICB9DQogICAgfQ0K\nfQ0KDQovKg0KKiogUHJpbnRzIHRoZSBhcnRpY2xlIHBvaW50ZXJzIGluIHRo\nZSB0aHJlYWQgaW5kZXggYnkgZGF0ZS4NCiovDQoNCnZvaWQgcHJpbnR0aHJl\nYWRzKEZJTEUgKmZwLCBzdHJ1Y3QgaGVhZGVyICpocCkNCnsNCiAgICBpbnQg\naGFzcmVwbHk7DQogICAgc3RydWN0IHJlcGx5ICpycDsNCg0KICAgIGlmICho\ncCAhPSBOVUxMKSB7DQogICAgICAgIHByaW50dGhyZWFkcyhmcCwgaHAtPmxl\nZnQpOw0KDQogICAgICAgIGZvciAoaGFzcmVwbHkgPSAwLCBycCA9IHJlcGx5\nbGlzdDsgcnAgIT0gTlVMTDsgcnAgPSBycC0+bmV4dCkgew0KICAgICAgICAg\nICAgaWYgKHJwLT5mcm9tbXNnbnVtID09IGhwLT5tc2dudW0pIHsNCiAgICAg\nICAgICAgICAgICBoYXNyZXBseSA9IDE7DQogICAgICAgICAgICAgICAgYnJl\nYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAo\nIWhhc3JlcGx5ICYmICF3YXNwcmludGVkKHByaW50ZWRsaXN0LCBocC0+bXNn\nbnVtKSkgew0KICAgICAgICAgICAgZnByaW50ZihmcCwgIjxMST48QSBIUkVG\nPVwiJS40ZC5odG1sXCI+PFNUUk9ORz4lczwvU1RST05HPjwvQT4gIiwNCiAg\nICAgICAgICAgICAgICAgICAgaHAtPm1zZ251bSwgY29udmNoYXJzKGhwLT5z\ndWJqZWN0KSk7DQogICAgICAgICAgICBmcHJpbnRmKGZwLCI8QSBOQU1FPVwi\nJWRcIj48RU0+JXM8L0VNPjwvQT5cbiIsaHAtPm1zZ251bSxocC0+bmFtZSk7\nDQogICAgICAgICAgICBwcmludGVkbGlzdCA9IChzdHJ1Y3QgcHJpbnRlZCAq\nKQ0KICAgICAgICAgICAgICAgICAgICBtYXJrYXNwcmludGVkKHByaW50ZWRs\naXN0LCBocC0+bXNnbnVtKTsNCg0KICAgICAgICAgICAgY2hlY2tyZXBsaWVz\nKGZwLCBocC0+bXNnbnVtLCAxKTsNCiAgICAgICAgfQ0KICAgICAgICBwcmlu\ndHRocmVhZHMoZnAsIGhwLT5yaWdodCk7DQogICAgfQ0KfQ0KDQovKg0KKiog\nV3JpdGUgdGhlIHRocmVhZCBpbmRleC4uLg0KKi8NCg0Kdm9pZCB3cml0ZXRo\ncmVhZHMoY2hhciAqZGlyLCBjaGFyICpsYWJlbCwgY2hhciAqYXJjaGl2ZXMs\nIGNoYXIgKmFib3V0KQ0Kew0KICAgIGludCBuZXdmaWxlOw0KICAgIGNoYXIg\nZmlsZW5hbWVbTUFYRklMRUxFTl07DQogICAgRklMRSAqZnA7DQoNCiAgICBz\ndHJ1Y3QgcHJpbnRlZCAqcHA7DQoNCiAgICB3aGlsZSAocHJpbnRlZGxpc3Qp\nIHsgLyogY2xlYW51cCBuZWVkZWQgPz8gKi8NCiAgICAgICAgIHBwID0gcHJp\nbnRlZGxpc3Q7DQogICAgICAgICBwcmludGVkbGlzdCA9IHByaW50ZWRsaXN0\nLT5uZXh0Ow0KICAgICAgICAgZnJlZShwcCk7DQogICAgfQ0KDQogICAgcHJp\nbnRlZGxpc3QgPSBOVUxMOw0KDQogICAgc3ByaW50ZihmaWxlbmFtZSwgIiVz\nJXMlcyIsIA0KICAgICAgICAgICAgZGlyLCAoZGlyW3N0cmxlbihkaXIpIC0g\nMV0gPT0gJy8nKSA/ICIiIDogIi8iLCB0aHJkbmFtZSk7DQoNCiAgICBpZiAo\naXNmaWxlKGZpbGVuYW1lKSkNCiAgICAgICAgbmV3ZmlsZSA9IDA7DQogICAg\nZWxzZQ0KICAgICAgICBuZXdmaWxlID0gMTsNCg0KICAgIGlmICgoZnAgPSBm\nb3BlbihmaWxlbmFtZSwgInciKSkgPT0gTlVMTCkgew0KICAgICAgICBzcHJp\nbnRmKGVycm1zZywgIkNvdWxkbid0IHdyaXRlIFwiJXNcIi4iLCBmaWxlbmFt\nZSk7DQogICAgICAgIHByb2dlcnIoKGNoYXIgKikgTlVMTCk7DQogICAgfQ0K\nDQogICAgaWYgKHNob3dwcm9ncmVzcykNCiAgICAgICAgcHJpbnRmKCJXcml0\naW5nIHRocmVhZCBpbmRleCB0byBcIiVzXCIuLi4iLCBmaWxlbmFtZSk7DQoN\nCiAgICBwcmludF9pbmRleF9oZWFkZXIoZnAsIGxhYmVsLCBkaXIsICJCeSBU\naHJlYWQiKTsNCg0KICAgIGlmICghdXNldGFibGUpIHsNCiAgICAgICAgLyog\nDQogICAgICAgICoqIFByaW50IG91dCB0aGUgaW5kZXggcGFnZSBsaW5rcyAN\nCiAgICAgICAgKi8gDQogICAgICAgIHByaW50X2luZGV4X2hlYWRlcl9saW5r\ncyhmcCwgYXJjaGl2ZXMsIGFib3V0LCBGUk9NX1RIUkVBRCk7DQogICAgICAg\nIA0KICAgICAgICBpZiAoc2hvd2hyKQ0KICAgICAgICAgICAgZnByaW50Zihm\ncCwgIjxIUj5cbiIpOw0KICAgIA0KICAgICAgICBmcHJpbnRmKGZwLCAiPFNU\nUk9ORz5TdGFydGluZzo8L1NUUk9ORz4gPEVNPiVzPC9FTT48QlI+XG4iLA0K\nICAgICAgICAgICAgICAgIGdldGRhdGVzdHIoZmlyc3RkYXRlbnVtKSk7DQog\nICAgICAgIGZwcmludGYoZnAsICI8U1RST05HPkVuZGluZzo8L1NUUk9ORz4g\nPEVNPiVzPC9FTT48QlI+XG4iLCANCiAgICAgICAgICAgICAgICBnZXRkYXRl\nc3RyKGxhc3RkYXRlbnVtKSk7DQogICAgICAgIGZwcmludGYoZnAsICI8U1RS\nT05HPk1lc3NhZ2VzOjwvU1RST05HPiAlZFxuPFA+XG4iLCBiaWdudW0gKyAx\nKTsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGZwcmludF9tZW51KGZw\nLCBUSFJFQURfSU5ERVgsIGFib3V0LCBhcmNoaXZlcywgIiIsICIiLCBQQUdF\nX1RPUCk7DQogICAgICAgIGZwcmludF9zdW1tYXJ5KGZwLCBmaXJzdGRhdGVu\ndW0sIGxhc3RkYXRlbnVtLCBiaWdudW0gKyAxKTsNCiAgICAgICAgaWYgKHNo\nb3docikNCiAgICAgICAgICAgIGZwcmludGYoZnAsICI8SFI+XG4iKTsNCiAg\nICB9DQoNCiAgICBmcHJpbnRmKGZwLCAiPFVMPlxuIik7DQogICAgcHJpbnR0\naHJlYWRzKGZwLCBkYXRlbGlzdCk7DQogICAgZnByaW50ZihmcCwgIjwvVUw+\nXG48UD5cbiIpOw0KDQogICAgaWYgKCF1c2V0YWJsZSkgew0KICAgICAgICBm\ncHJpbnRmKGZwLCAiPEEgTkFNRT1cImVuZFwiPjxTVFJPTkc+TGFzdCBtZXNz\nYWdlIGRhdGU6PC9TVFJPTkc+PC9BPiAiKTsNCiAgICAgICAgZnByaW50Zihm\ncCwgIjxFTT4lczwvRU0+PEJSPlxuIiwgZ2V0ZGF0ZXN0cihsYXN0ZGF0ZW51\nbSkpOw0KICAgICAgICBmcHJpbnRmKGZwLCAiPFNUUk9ORz5BcmNoaXZlZCBv\nbjo8L1NUUk9ORz4gPEVNPiVzPC9FTT48UD5cbiIsIGdldGxvY2FsdGltZSgp\nKTsNCiAgICAgICAgICAgICANCiAgICAgICAgaWYgKHNob3docikNCiAgICAg\nICAgICAgIGZwcmludGYoZnAsICI8SFI+XG4iKTsNCiAgICANCiAgICAgICAg\nLyogDQogICAgICAgICoqIFByaW50IG91dCBhcmNoaXZlIGluZm9ybWF0aW9u\nIGxpbmtzIGF0IHRoZSBib3R0b20gb2YgdGhlIGluZGV4DQogICAgICAgICov\nIA0KICAgICAgICBwcmludF9pbmRleF9mb290ZXJfbGlua3MoZnAsIGFyY2hp\ndmVzLCBGUk9NX1RIUkVBRCk7DQogICAgDQogICAgfQ0KICAgIGVsc2Ugew0K\nICAgICAgICBmcHJpbnRfbWVudShmcCwgVEhSRUFEX0lOREVYLCBhYm91dCwg\nYXJjaGl2ZXMsICIiLCAiIiwgUEFHRV9CT1RUT00pOw0KICAgIH0NCg0KICAg\nIHByaW50Zm9vdGVyKGZwLCBpaHRtbGZvb3RlciwgbGFiZWwsIGRpciwgIkJ5\nIFRocmVhZCIpOw0KDQogICAgZmNsb3NlKGZwKTsNCg0KICAgIGlmIChuZXdm\naWxlICYmIGNobW9kKGZpbGVuYW1lLCBmaWxlbW9kZSkgPT0gLTEpIHsNCiAg\nICAgICAgc3ByaW50ZihlcnJtc2csICJDb3VsZG4ndCBjaG1vZCBcIiVzXCIg\ndG8gJW8uIiwgZmlsZW5hbWUsIGZpbGVtb2RlKTsNCiAgICAgICAgcHJvZ2Vy\ncigoY2hhciAqKSBOVUxMKTsNCiAgICB9DQoNCiAgICBpZiAoc2hvd3Byb2dy\nZXNzKQ0KICAgICAgICBwdXRjaGFyKCdcbicpOw0KfQ0KDQovKg0KKiogUHJp\nbnQgdGhlIHN1YmplY3QgaW5kZXggcG9pbnRlcnMgYWxwaGFiZXRpY2FsbHku\nDQoqLw0KDQp2b2lkIHByaW50c3ViamVjdHMoRklMRSAqZnAsIHN0cnVjdCBo\nZWFkZXIgKmhwKQ0Kew0KICAgIHN0YXRpYyBjaGFyIG9sZHN1YmplY3RbU1VC\nSlNUUkxFTl07DQoNCiAgICBpZiAoaHAgIT0gTlVMTCkgew0KICAgICAgICBw\ncmludHN1YmplY3RzKGZwLCBocC0+bGVmdCk7DQogICAgICAgIGlmIChzdHJj\nYXNlY21wKGhwLT5zdWJqZWN0LCBvbGRzdWJqZWN0KSkNCiAgICAgICAgICAg\nIGZwcmludGYoZnAsICI8TEk+PFNUUk9ORz4lczwvU1RST05HPlxuIixjb252\nY2hhcnMoaHAtPnN1YmplY3QpKTsNCiAgICAgICAgZnByaW50ZihmcCwgIjxV\nTD5cbiIpOw0KICAgICAgICBmcHJpbnRmKGZwLCI8TEk+PEEgSFJFRj1cIiUu\nNGQuaHRtbFwiPiVzPC9BPiAiLGhwLT5tc2dudW0saHAtPm5hbWUpOw0KICAg\nICAgICBmcHJpbnRmKGZwLCI8QSBOQU1FPVwiJWRcIj48RU0+JXM8L0VNPjwv\nQT5cbiIsIGhwLT5tc2dudW0saHAtPmRhdGVzdHIpOw0KICAgICAgICBmcHJp\nbnRmKGZwLCAiPC9VTD5cbiIpOw0KICAgICAgICBzdHJjcHkob2xkc3ViamVj\ndCwgaHAtPnN1YmplY3QpOw0KICAgICAgICBwcmludHN1YmplY3RzKGZwLCBo\ncC0+cmlnaHQpOw0KICAgIH0NCn0NCg0KLyoNCioqIFByaW50cyB0aGUgc3Vi\namVjdCBpbmRleC4NCiovDQoNCnZvaWQgd3JpdGVzdWJqZWN0cyhjaGFyICpk\naXIsIGNoYXIgKmxhYmVsLCBjaGFyICphcmNoaXZlcywgY2hhciAqYWJvdXQp\nDQp7DQogICAgaW50IG5ld2ZpbGU7DQogICAgY2hhciBmaWxlbmFtZVtNQVhG\nSUxFTEVOXTsNCiAgICBGSUxFICpmcDsNCg0KICAgIHNwcmludGYoZmlsZW5h\nbWUsICIlcyVzJXMiLCANCiAgICAgICAgICAgIGRpciwgKGRpcltzdHJsZW4o\nZGlyKSAtIDFdID09ICcvJykgPyAiIiA6ICIvIiwgc3Viam5hbWUpOw0KDQog\nICAgaWYgKGlzZmlsZShmaWxlbmFtZSkpDQogICAgICAgIG5ld2ZpbGUgPSAw\nOw0KICAgIGVsc2UNCiAgICAgICAgbmV3ZmlsZSA9IDE7DQoNCiAgICBpZiAo\nKGZwID0gZm9wZW4oZmlsZW5hbWUsICJ3IikpID09IE5VTEwpIHsNCiAgICAg\nICAgc3ByaW50ZihlcnJtc2csICJDb3VsZG4ndCB3cml0ZSBcIiVzXCIuIiwg\nZmlsZW5hbWUpOw0KICAgICAgICBwcm9nZXJyKChjaGFyICopIE5VTEwpOw0K\nICAgIH0NCg0KICAgIGlmIChzaG93cHJvZ3Jlc3MpDQogICAgICAgIHByaW50\nZigiV3JpdGluZyBzdWJqZWN0IGluZGV4IHRvIFwiJXNcIi4uLiIsIGZpbGVu\nYW1lKTsNCg0KICAgIHByaW50X2luZGV4X2hlYWRlcihmcCwgbGFiZWwsIGRp\nciwgIkJ5IFN1YmplY3QiKTsNCg0KICAgIGlmICghdXNldGFibGUpIHsNCiAg\nICAgICAgLyogDQogICAgICAgICoqIFByaW50IG91dCB0aGUgaW5kZXggcGFn\nZSBsaW5rcyANCiAgICAgICAgKi8gDQogICAgICAgIHByaW50X2luZGV4X2hl\nYWRlcl9saW5rcyhmcCwgYXJjaGl2ZXMsIGFib3V0LCBGUk9NX1NVQkpFQ1Qp\nOw0KICAgIA0KICAgICAgICBpZiAoc2hvd2hyKQ0KICAgICAgICAgICAgZnBy\naW50ZihmcCwgIjxIUj5cbiIpOw0KDQogICAgICAgIGZwcmludGYoZnAsICI8\nU1RST05HPlN0YXJ0aW5nOjwvU1RST05HPiA8RU0+JXM8L0VNPjxCUj5cbiIs\nDQogICAgICAgICAgICAgICAgZ2V0ZGF0ZXN0cihmaXJzdGRhdGVudW0pKTsN\nCiAgICAgICAgZnByaW50ZihmcCwgIjxTVFJPTkc+RW5kaW5nOjwvU1RST05H\nPiA8RU0+JXM8L0VNPjxCUj5cbiIsIA0KICAgICAgICAgICAgICAgIGdldGRh\ndGVzdHIobGFzdGRhdGVudW0pKTsNCiAgICAgICAgZnByaW50ZihmcCwgIjxT\nVFJPTkc+TWVzc2FnZXM6PC9TVFJPTkc+ICVkXG48UD5cbiIsIGJpZ251bSAr\nIDEpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgZnByaW50X21lbnUo\nZnAsIFNVQkpFQ1RfSU5ERVgsIGFib3V0LCBhcmNoaXZlcywgIiIsICIiLCBQ\nQUdFX1RPUCk7DQogICAgICAgIGZwcmludF9zdW1tYXJ5KGZwLCBmaXJzdGRh\ndGVudW0sIGxhc3RkYXRlbnVtLCBiaWdudW0gKyAxKTsNCiAgICAgICAgaWYg\nKHNob3docikNCiAgICAgICAgICAgIGZwcmludGYoZnAsICI8SFI+XG4iKTsN\nCiAgICB9DQoNCiAgICBmcHJpbnRmKGZwLCAiPFVMPlxuIik7DQogICAgcHJp\nbnRzdWJqZWN0cyhmcCwgc3ViamVjdGxpc3QpOw0KICAgIGZwcmludGYoZnAs\nICI8L1VMPlxuPFA+XG4iKTsNCg0KICAgIGlmICghdXNldGFibGUpIHsNCiAg\nICAgICAgZnByaW50ZihmcCwgIjxTVFJPTkc+TGFzdCBtZXNzYWdlIGRhdGU6\nPC9TVFJPTkc+IDxFTT4lczwvRU0+PEJSPlxuIiwNCiAgICAgICAgICAgICAg\nICBnZXRkYXRlc3RyKGxhc3RkYXRlbnVtKSk7DQogICAgICAgIGZwcmludGYo\nZnAsICI8U1RST05HPkFyY2hpdmVkIG9uOjwvU1RST05HPiA8RU0+JXM8L0VN\nPjxQPlxuIiwgDQogICAgICAgICAgICAgICAgZ2V0bG9jYWx0aW1lKCkpOw0K\nDQogICAgICAgIGlmIChzaG93aHIpDQogICAgICAgICAgICBmcHJpbnRmKGZw\nLCAiPEhSPlxuIik7DQoNCiAgICAgICAgLyogDQogICAgICAgICoqIFByaW50\nIG91dCBhcmNoaXZlIGluZm9ybWF0aW9uIGxpbmtzIGF0IHRoZSBib3R0b20g\nb2YgdGhlIGluZGV4DQogICAgICAgICovIA0KICAgICAgICBwcmludF9pbmRl\neF9mb290ZXJfbGlua3MoZnAsIGFyY2hpdmVzLCBGUk9NX1NVQkpFQ1QpOw0K\nICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgZnByaW50X21lbnUoZnAsIFNV\nQkpFQ1RfSU5ERVgsIGFib3V0LCBhcmNoaXZlcywgIiIsICIiLCBQQUdFX0JP\nVFRPTSk7DQogICAgfQ0KDQogICAgcHJpbnRmb290ZXIoZnAsIGlodG1sZm9v\ndGVyLCBsYWJlbCwgZGlyLCAiQnkgU3ViamVjdCIpOw0KDQogICAgZmNsb3Nl\nKGZwKTsNCg0KICAgIGlmIChuZXdmaWxlICYmIGNobW9kKGZpbGVuYW1lLCBm\naWxlbW9kZSkgPT0gLTEpIHsNCiAgICAgICAgc3ByaW50ZihlcnJtc2csICJD\nb3VsZG4ndCBjaG1vZCBcIiVzXCIgdG8gJW8uIiwgZmlsZW5hbWUsDQogICAg\nICAgIGZpbGVtb2RlKTsNCiAgICAgICAgcHJvZ2VycigoY2hhciAqKSBOVUxM\nKTsNCiAgICB9DQoNCiAgICBpZiAoc2hvd3Byb2dyZXNzKQ0KICAgICAgICBw\ndXRjaGFyKCdcbicpOw0KfQ0KDQovKg0KKiogUHJpbnRzIHRoZSBhdXRob3Ig\naW5kZXggbGlua3Mgc29ydGVkIGFscGhhYmV0aWNhbGx5Lg0KKi8NCg0Kdm9p\nZCBwcmludGF1dGhvcnMoRklMRSAqZnAsIHN0cnVjdCBoZWFkZXIgKmhwKQ0K\new0KICAgIHN0YXRpYyBjaGFyIG9sZG5hbWVbU1VCSlNUUkxFTl07DQoNCiAg\nICBpZiAoaHAgIT0gTlVMTCkgew0KICAgICAgICBwcmludGF1dGhvcnMoZnAs\nIGhwLT5sZWZ0KTsNCiAgICAgICAgaWYgKHN0cmNhc2VjbXAoaHAtPm5hbWUs\nIG9sZG5hbWUpKQ0KICAgICAgICAgICAgZnByaW50ZihmcCwgIjxMST48U1RS\nT05HPiVzPC9TVFJPTkc+XG4iLCBocC0+bmFtZSk7DQogICAgICAgIGZwcmlu\ndGYoZnAsIjxVTD5cbiIpOw0KICAgICAgICBmcHJpbnRmKGZwLCI8TEk+PEEg\nSFJFRj1cIiUuNGQuaHRtbFwiPiVzPC9BPiAiLA0KICAgICAgICAgICAgICAg\nICAgICAgaHAtPm1zZ251bSwgY29udmNoYXJzKGhwLT5zdWJqZWN0KSk7DQog\nICAgICAgIGZwcmludGYoZnAsIjxBIE5BTUU9XCIlZFwiPjxFTT4lczwvRU0+\nPC9BPlxuIiwgaHAtPm1zZ251bSxocC0+ZGF0ZXN0cik7DQogICAgICAgIGZw\ncmludGYoZnAsIjwvVUw+XG4iKTsNCiAgICAgICAgc3RyY3B5KG9sZG5hbWUs\nIGhwLT5uYW1lKTsNCiAgICAgICAgcHJpbnRhdXRob3JzKGZwLCBocC0+cmln\naHQpOw0KICAgIH0NCn0NCg0KLyoNCioqIFByaW50cyB0aGUgYXV0aG9yIGlu\nZGV4IGZpbGUgYW5kIGxpbmtzIHNvcnRlZCBhbHBoYWJldGljYWxseS4NCiov\nDQoNCnZvaWQgd3JpdGVhdXRob3JzKGNoYXIgKmRpciwgY2hhciAqbGFiZWws\nIGNoYXIgKmFyY2hpdmVzLCBjaGFyICphYm91dCkNCnsNCiAgICBpbnQgbmV3\nZmlsZTsNCiAgICBjaGFyIGZpbGVuYW1lW01BWEZJTEVMRU5dOw0KICAgIEZJ\nTEUgKmZwOw0KDQogICAgc3ByaW50ZihmaWxlbmFtZSwgIiVzJXMlcyIsIA0K\nICAgICAgICAgICAgZGlyLCAoZGlyW3N0cmxlbihkaXIpIC0gMV0gPT0gJy8n\nKSA/ICIiIDogIi8iLCBhdXRobmFtZSk7DQoNCiAgICBpZiAoaXNmaWxlKGZp\nbGVuYW1lKSkNCiAgICAgICAgbmV3ZmlsZSA9IDA7DQogICAgZWxzZQ0KICAg\nICAgICBuZXdmaWxlID0gMTsNCg0KICAgIGlmICgoZnAgPSBmb3BlbihmaWxl\nbmFtZSwgInciKSkgPT0gTlVMTCkgew0KICAgICAgICBzcHJpbnRmKGVycm1z\nZywgIkNvdWxkbid0IHdyaXRlIFwiJXNcIi4iLCBmaWxlbmFtZSk7DQogICAg\nICAgIHByb2dlcnIoKGNoYXIgKilOVUxMKTsNCiAgICB9DQoNCiAgICBpZiAo\nc2hvd3Byb2dyZXNzKQ0KICAgICAgICBwcmludGYoIldyaXRpbmcgYXV0aG9y\nIGluZGV4IHRvIFwiJXNcIi4uLiIsIGZpbGVuYW1lKTsNCg0KICAgIHByaW50\nX2luZGV4X2hlYWRlcihmcCwgbGFiZWwsIGRpciwgIkJ5IEF1dGhvciIpOw0K\nDQogICAgaWYgKCF1c2V0YWJsZSkgew0KICAgICAgICAvKiANCiAgICAgICAg\nKiogUHJpbnQgb3V0IHRoZSBpbmRleCBwYWdlIGxpbmtzIA0KICAgICAgICAq\nLyANCiAgICAgICAgcHJpbnRfaW5kZXhfaGVhZGVyX2xpbmtzKGZwLCBhcmNo\naXZlcywgYWJvdXQsIEZST01fQVVUSE9SKTsNCiAgICAgICAgDQogICAgICAg\nIGlmIChzaG93aHIpDQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEhSPlxu\nIik7DQogICAgDQogICAgICAgIGZwcmludGYoZnAsICI8U1RST05HPlN0YXJ0\naW5nOjwvU1RST05HPiA8RU0+JXM8L0VNPjxCUj5cbiIsDQogICAgICAgICAg\nICAgICAgZ2V0ZGF0ZXN0cihmaXJzdGRhdGVudW0pKTsNCiAgICAgICAgZnBy\naW50ZihmcCwgIjxTVFJPTkc+RW5kaW5nOjwvU1RST05HPiA8RU0+JXM8L0VN\nPjxCUj5cbiIsIA0KICAgICAgICAgICAgICAgIGdldGRhdGVzdHIobGFzdGRh\ndGVudW0pKTsNCiAgICAgICAgZnByaW50ZihmcCwgIjxTVFJPTkc+TWVzc2Fn\nZXM6PC9TVFJPTkc+ICVkXG48UD5cbiIsIGJpZ251bSArIDEpOw0KICAgIH0N\nCiAgICBlbHNlIHsNCiAgICAgICAgZnByaW50X21lbnUoZnAsIEFVVEhPUl9J\nTkRFWCwgYWJvdXQsIGFyY2hpdmVzLCAiIiwgIiIsIFBBR0VfVE9QKTsNCiAg\nICAgICAgZnByaW50X3N1bW1hcnkoZnAsIGZpcnN0ZGF0ZW51bSwgbGFzdGRh\ndGVudW0sIGJpZ251bSArIDEpOyAgICAgICAgDQogICAgICAgIGlmIChzaG93\naHIpDQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiPEhSPlxuIik7DQogICAg\nfQ0KDQogICAgZnByaW50ZihmcCwgIjxVTD5cbiIpOw0KICAgIHByaW50YXV0\naG9ycyhmcCwgYXV0aG9ybGlzdCk7DQogICAgZnByaW50ZihmcCwgIjwvVUw+\nXG48UD5cbiIpOw0KDQogICAgaWYgKCF1c2V0YWJsZSkgew0KICAgICAgICBm\ncHJpbnRmKGZwLCAiPFNUUk9ORz5MYXN0IG1lc3NhZ2UgZGF0ZTo8L1NUUk9O\nRz4gPEVNPiVzPC9FTT48QlI+XG4iLA0KICAgICAgICAgICAgICAgICAgICBn\nZXRkYXRlc3RyKGxhc3RkYXRlbnVtKSk7DQogICAgICAgIGZwcmludGYoZnAs\nIjxTVFJPTkc+QXJjaGl2ZWQgb246PC9TVFJPTkc+IDxFTT4lczwvRU0+PFA+\nXG4iLGdldGxvY2FsdGltZSgpKTsNCg0KICAgICAgICBpZiAoc2hvd2hyKQ0K\nICAgICAgICAgICAgZnByaW50ZihmcCwgIjxIUj5cbiIpOw0KDQogICAgICAg\nIC8qIA0KICAgICAgICAqKiBQcmludCBvdXQgYXJjaGl2ZSBpbmZvcm1hdGlv\nbiBsaW5rcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbmRleA0KICAgICAgICAq\nLyANCiAgICAgICAgcHJpbnRfaW5kZXhfZm9vdGVyX2xpbmtzKGZwLCBhcmNo\naXZlcywgRlJPTV9BVVRIT1IpOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAg\nICAgZnByaW50X21lbnUoZnAsIEFVVEhPUl9JTkRFWCwgYWJvdXQsIGFyY2hp\ndmVzLCAiIiwgIiIsIFBBR0VfQk9UVE9NKTsNCiAgICB9DQoNCiAgICBwcmlu\ndGZvb3RlcihmcCwgaWh0bWxmb290ZXIsIGxhYmVsLCBkaXIsICJCeSBBdXRo\nb3IiKTsNCg0KICAgIGZjbG9zZShmcCk7DQoNCiAgICBpZiAobmV3ZmlsZSAm\nJiBjaG1vZChmaWxlbmFtZSwgZmlsZW1vZGUpID09IC0xKSB7DQogICAgICAg\nIHNwcmludGYoZXJybXNnLCAiQ291bGRuJ3QgY2htb2QgXCIlc1wiIHRvICVv\nLiIsIGZpbGVuYW1lLCBmaWxlbW9kZSk7DQogICAgICAgIHByb2dlcnIoKGNo\nYXIqKU5VTEwpOw0KICAgIH0NCg0KICAgIGlmIChzaG93cHJvZ3Jlc3MpDQog\nICAgICAgIHB1dGNoYXIoJ1xuJyk7DQp9DQo=\n---559023410-851401618-901288998=:17635--\n\n"
  },
  {
    "path": "tests/mboxes/critmail.mbox",
    "content": "From owner-hypermail Fri Sep 25 20:23 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06103\n\tfor hypermail-outgoing; Fri, 25 Sep 2000 20:22:37 -0500 (CDT)\nReceived: from runningman.rs.itd.umich.edu (runningman.rs.itd.umich.edu [141.211.144.15])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06097\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 2000 20:21:33 -0500 (CDT)\nReceived: from umich.edu (dialin224193.isdn.umich.edu [198.111.224.193])\n\tby runningman.rs.itd.umich.edu (8.8.5/2.3) with ESMTP id VAA19384; Fri, 25 Sep 2000 21:19:37 -0400 (EDT)\nMessage-ID: <360C40A1.A8FAF28C@umich.edu>\nDate: Fri, 25 Sep 2000 21:17:21 -0400\nFrom: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nOrganization: University of Michigan\nX-Mailer: Mozilla 4.5b2 [en] (WinNT; I)\nX-Accept-Language: en\nMIME-Version: 1.0\nTo: hypermail@landfield.com\nCC: Charles Hall <chall@totalsports.net>,\n        \"Gordon H. Buchan\" <gbuchan@matrox.com>\nSubject: Re: adding new messages to prior hypermail archive\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nX-Lines: 54\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 2276\nStatus: OR\n\n\nCharles and Gordon offered helpful suggestions.  However, I think there\nis a problem.\n\nHere is what I'm trying to do: I have an existing Hypermail archive\n(from 1.02) with 467 messages already in it.  I do *NOT* have the\noriginal mailbox file for it.  \n\nI now have 65 new messages in a mailbox that I want to add.\n\nI've tried a standard run, as Gordon suggested (those are Gordon's\npaths):\n\n/home/gordon/bin/hypermail \\\n-b \"http://cusidnet.anadas.com/\" \\\n-a \"http://cusidnet.anadas.com/\" \\\n-m \"/home/gordon/mail/cusid\" \\\n-l \"CUSIDnet Web Mirror\" \\\n-d \"/home/gordon/www/cusidnet/fall2000/\" \\\n-c \"/home/gordon/bin/.cusidnethyprc\" > /dev/null\n\nThat had the following result: The new index files overwrote the\nexisting index files, and showed the information for the 65 *new*\nmessages but no listings for the 467 original messages.  However, the\narchive in fact contained the 467 html files for the original messages,\nbut did *not* contain files for any of the new messages.  (Click on New\n#1 in the index, and it goes to file 0000.html which is Old #1.)\n\nThen I tried what Charles suggested: I inserted 467 \"dummy\" messages in\nmy mailbox file so that Hypermail could count down those and only add\nthe \"new\" messages.  That *almost* worked.  The message files were\ncorrectly created: an addition 65 nnnn.html files were added to the\narchive.  However, the original 467 message entries in the index were\noverwritten with the header information from the 467 dummy messages.  So\nmy index files are now useless....\n\nThe (filler added here to make the line 40+ chars) two hyphen-\nated words in the original verision of this sentence should have no spaces in-\nserted where the hyphens were.\n\nFrom owner-hypermail Fri Sep 25 20:59 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06348\n\tfor hypermail-outgoing; Fri, 25 Sep 2000 20:59:15 -0500 (CDT)\nReceived: from ns.totalsports.net (ns.totalsports.net [207.175.67.50])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06340\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 2000 20:58:30 -0500 (CDT)\nReceived: from klaatu.totalsports.net\n          (chall3.totalsports.net [207.175.67.217]) by ns.totalsports.net\n          (Post.Office MTA v3.5 release 215 ID# 0-55440U300L200S0V35)\n          with SMTP id net; Fri, 25 Sep 2000 21:53:37 -0400\nMessage-ID: <360C4737.6946@totalsports.net>\nDate: Fri, 25 Sep 2000 21:45:27 -0400\nFrom: chall@totalsports.net (Charles Hall)\nOrganization: Total Sports\nX-Mailer: Mozilla 3.01Gold (Win95; I)\nMIME-Version: 1.0\nTo: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nCC: hypermail@landfield.com\nSubject: Re: adding new messages to prior hypermail archive\nReferences: <360C40A1.A8FAF28C@umich.edu>\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: chall@totalsports.net (Charles Hall)\nX-Lines: 25\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 1005\nStatus: OR\n\nJeffrey K. MacKie-Mason wrote:\n> \n> Then I tried what Charles suggested...  However, the original 467 message\n> entries in the index were overwritten with the 467 dummy messages.  So\n> my index files are now useless....\n\nOuch! I hope you can recover from this. I didn't realize. Sorry.\n\n>The (filler added here to make the line 40+ chars) two hyphen-\n>ated words in the original verision of this sentence should have no spaces in-\n>serted where the hyphens were.\n\nThis message should be formatted adequately if set_showhtml = 2. Expect\nmany problems if set_showhtml = 1.\n\n        Test the ability of set_showhtml = 2 to handle tables \n     column1           column2            column3\n =====================================================================\n        1                 2                  3\n       one               two               three\n        1                                    3\n\n The columns above should be centered under the appropriate 'u'.\n ---------------------------------------------------------\n You should see a horizontal rule above.\n\n1. This should look like a list item numbered one.\n2. This should look like a list item numbered two.\n   - first line of a sublist entry, filler added here\n     to make it longer than a single line.\n         * a sublist nested a 2nd level deep.\n         * a sublist nested a 2nd level deep.\n   - closing the singly nested list\n3. This should look like a list item numbered three of the outer list.\n\nleftmost left left | There should be vertical |\nleft aligned in    | bars aligned on either   | right\ntabular format.    | side of me.              |\n\nThe second and last words of this sentence should have carets (^'s) under them.\n    ^^^^^^                                                                ^^^^\n\n!!THIS LINE SHOULD BE SURROUNDED BY STRONG TAGS BECAUSE IT IS ALL UPPER CASE!!\n\noooooooo           line these up\n.....              with these up\n"
  },
  {
    "path": "tests/mboxes/embedded.msg",
    "content": "From rene  Tue Mar  2 22:53:38 1999\nReturn-Path: <MAILER-DAEMON>\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA03065;\n\tTue, 2 Mar 1999 22:53:38 +0100\nDate: Tue, 2 Mar 1999 22:53:38 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA03065@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA03065.920411618/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nX-Status: \nX-Keywords:\nX-UID: 384\nStatus: OR\n\nThis is a MIME-encapsulated message\n\n--WAA03065.920411618/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:37 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA03065.920411618/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:37 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:38 +0100\n\n--WAA03065.920411618/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA03040\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:37 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA02947;\n\tTue, 2 Mar 1999 22:53:37 +0100\nDate: Tue, 2 Mar 1999 22:53:37 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA02947@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA02947.920411617/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA02947.920411617/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:36 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA02947.920411617/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:36 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:37 +0100\n\n--WAA02947.920411617/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA02936\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:36 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA02204;\n\tTue, 2 Mar 1999 22:53:28 +0100\nDate: Tue, 2 Mar 1999 22:53:28 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA02204@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA02204.920411608/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA02204.920411608/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:28 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA02204.920411608/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:28 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:28 +0100\n\n--WAA02204.920411608/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA02195\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:28 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA02135;\n\tTue, 2 Mar 1999 22:53:28 +0100\nDate: Tue, 2 Mar 1999 22:53:28 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA02135@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA02135.920411608/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA02135.920411608/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:26 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA02135.920411608/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:26 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:28 +0100\n\n--WAA02135.920411608/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA02104\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:26 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA02048;\n\tTue, 2 Mar 1999 22:53:26 +0100\nDate: Tue, 2 Mar 1999 22:53:26 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA02048@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA02048.920411606/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA02048.920411606/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:25 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA02048.920411606/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:25 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:26 +0100\n\n--WAA02048.920411606/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA02041\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:25 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA02014;\n\tTue, 2 Mar 1999 22:53:25 +0100\nDate: Tue, 2 Mar 1999 22:53:25 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA02014@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA02014.920411605/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA02014.920411605/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:25 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA02014.920411605/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:25 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:25 +0100\n\n--WAA02014.920411605/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA02001\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:25 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA01939;\n\tTue, 2 Mar 1999 22:53:24 +0100\nDate: Tue, 2 Mar 1999 22:53:24 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA01939@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA01939.920411604/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA01939.920411604/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:23 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA01939.920411604/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:23 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:24 +0100\n\n--WAA01939.920411604/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA01927\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:23 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA01891;\n\tTue, 2 Mar 1999 22:53:23 +0100\nDate: Tue, 2 Mar 1999 22:53:23 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA01891@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA01891.920411603/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA01891.920411603/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:22 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA01891.920411603/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:22 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:23 +0100\n\n--WAA01891.920411603/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA01874\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:22 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA01842;\n\tTue, 2 Mar 1999 22:53:22 +0100\nDate: Tue, 2 Mar 1999 22:53:22 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA01842@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: rene@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA01842.920411602/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA01842.920411602/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:21 +0100\nfrom rene@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms... Local configuration error\n\n--WAA01842.920411602/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:21 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:22 +0100\n\n--WAA01842.920411602/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <rene>\nReceived: (from rene@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA01837\n\tfor sms@sms; Tue, 2 Mar 1999 22:53:21 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA01780;\n\tTue, 2 Mar 1999 22:53:20 +0100\nDate: Tue, 2 Mar 1999 22:53:20 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA01780@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: horstf@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA01780.920411600/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01714318424\nSMS-TYPE: SUBJECT\n\nThis is a MIME-encapsulated message\n\n--WAA01780.920411600/homer.bos-systemhaus.de\n\nThe original message was received at Tue, 2 Mar 1999 22:53:19 +0100\nfrom horstf@localhost\n\n   ----- The following addresses had permanent fatal errors -----\nsms@sms.bos-systemhaus.de\n\n   ----- Transcript of session follows -----\n553 mail.bos-systemhaus.de config error: mail loops back to me (MX problem?)\n554 sms@sms.bos-systemhaus.de... Local configuration error\n\n--WAA01780.920411600/homer.bos-systemhaus.de\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; homer.bos-systemhaus.de\nArrival-Date: Tue, 2 Mar 1999 22:53:19 +0100\n\nFinal-Recipient: RFC822; sms@killer.bos-systemhaus.de\nAction: failed\nStatus: 5.5.0\nRemote-MTA: DNS; mail.bos-systemhaus.de\nLast-Attempt-Date: Tue, 2 Mar 1999 22:53:20 +0100\n\n--WAA01780.920411600/homer.bos-systemhaus.de\nContent-Type: message/rfc822\n\nReturn-Path: <horstf>\nReceived: (from horstf@localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) id WAA01775\n\tfor sms@sms.bos-systemhaus.de; Tue, 2 Mar 1999 22:53:19 +0100\nReceived: from localhost (localhost)\n\tby homer.bos-systemhaus.de (8.8.7/8.8.7) with internal id WAA01749;\n\tTue, 2 Mar 1999 22:53:19 +0100\nDate: Tue, 2 Mar 1999 22:53:19 +0100\nFrom: Mail Delivery Subsystem <MAILER-DAEMON@bos-systemhaus.de>\nMessage-Id: <199903022153.WAA01749@homer.bos-systemhaus.de>\nTo: postmaster@homer.bos-systemhaus.de\nTo: horstf@homer.bos-systemhaus.de\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"WAA01749.920411599/homer.bos-systemhaus.de\"\nSubject: Returned mail: Local configuration error\nAuto-Submitted: auto-generated (failure)\nSMS-NUMBER: 01716455134\nSMS-TYPE: SUBJECT\n\n\n--WAA01780.920411600/homer.bos-systemhaus.de--\n\n\n--WAA01842.920411602/homer.bos-systemhaus.de--\n\n\n--WAA01891.920411603/homer.bos-systemhaus.de--\n\n\n--WAA01939.920411604/homer.bos-systemhaus.de--\n\n\n--WAA02014.920411605/homer.bos-systemhaus.de--\n\n\n--WAA02048.920411606/homer.bos-systemhaus.de--\n\n\n--WAA02135.920411608/homer.bos-systemhaus.de--\n\n\n--WAA02204.920411608/homer.bos-systemhaus.de--\n\n\n--WAA02947.920411617/homer.bos-systemhaus.de--\n\n\n--WAA03065.920411618/homer.bos-systemhaus.de--\n\n\n"
  },
  {
    "path": "tests/mboxes/t1",
    "content": "From owner-hypermail Fri Sep 25 20:23 CDT 1998\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06103\n\tfor hypermail-outgoing; Fri, 25 Sep 1998 20:22:37 -0500 (CDT)\nReceived: from runningman.rs.itd.umich.edu (runningman.rs.itd.umich.edu [141.211.144.15])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06097\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 1998 20:21:33 -0500 (CDT)\nReceived: from umich.edu (dialin224193.isdn.umich.edu [198.111.224.193])\n\tby runningman.rs.itd.umich.edu (8.8.5/2.3) with ESMTP id VAA19384; Fri, 25 Sep 1998 21:19:37 -0400 (EDT)\nMessage-ID: <360C40A1.A8FAF28C@umich.edu>\nDate: Fri, 25 Sep 1998 21:17:21 -0400\nFrom: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nOrganization: University of Michigan\nX-Mailer: Mozilla 4.5b2 [en] (WinNT; I)\nX-Accept-Language: en\nMIME-Version: 1.0\nTo: hypermail@landfield.com\nCC: Charles Hall <chall@totalsports.net>,\n        \"Gordon H. Buchan\" <gbuchan@matrox.com>\nSubject: Re: adding new messages to prior hypermail archive\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nX-Lines: 54\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 2276\nStatus: OR\n\n\nCharles and Gordon offered helpful suggestions.  However, I think there\nis a problem.\n\nHere is what I'm trying to do: I have an existing Hypermail archive\n(from 1.02) with 467 messages already in it.  I do *NOT* have the\noriginal mailbox file for it.  \n\nI now have 65 new messages in a mailbox that I want to add.\n\nI've tried a standard run, as Gordon suggested (those are Gordon's\npaths):\n\n/home/gordon/bin/hypermail \\\n-b \"http://cusidnet.anadas.com/\" \\\n-a \"http://cusidnet.anadas.com/\" \\\n-m \"/home/gordon/mail/cusid\" \\\n-l \"CUSIDnet Web Mirror\" \\\n-d \"/home/gordon/www/cusidnet/fall1998/\" \\\n-c \"/home/gordon/bin/.cusidnethyprc\" > /dev/null\n\nThat had the following result: The new index files overwrote the\nexisting index files, and showed the information for the 65 *new*\nmessages but no listings for the 467 original messages.  However, the\narchive in fact contained the 467 html files for the original messages,\nbut did *not* contain files for any of the new messages.  (Click on New\n#1 in the index, and it goes to file 0000.html which is Old #1.)\n\nThen I tried what Charles suggested: I inserted 467 \"dummy\" messages in\nmy mailbox file so that Hypermail could count down those and only add\nthe \"new\" messages.  That *almost* worked.  The message files were\ncorrectly created: an addition 65 nnnn.html files were added to the\narchive.  However, the original 467 message entries in the index were\noverwritten with the header information from the 467 dummy messages.  So\nmy index files are now useless....\n\nObviously, the solution could be to chop the 65 new messages and deliver\nthem one at a time to Hypermail for a single message append.  (Can\nsomeone suggest an easy way to script that?)  However, shouldn't\nHypermail be able to do this?  Perhaps have a switch for \"append to\nexisting archive\" when we have a new mbox file but have lost the mbox\nfor the original archive?  (Likewise, a way to merge hypermail archives\nwithout having the original mboxes?)\n\nthanks,\njmm\n\n\n-- \nProf. Jeffrey MacKie-Mason       http://www-personal.umich.edu/~jmm/\nDept. of Economics                                     jmm@umich.edu\n   and School of Information               +1 (734) 647-4856 (voice)\nUniversity of Michigan                     +1 (734) 764-2475   (fax)\nAnn Arbor, MI 48109\n\n"
  },
  {
    "path": "tests/mboxes/t2",
    "content": "From owner-hypermail Fri Sep 25 20:59 CDT 1998\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06348\n\tfor hypermail-outgoing; Fri, 25 Sep 1998 20:59:15 -0500 (CDT)\nReceived: from ns.totalsports.net (ns.totalsports.net [207.175.67.50])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06340\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 1998 20:58:30 -0500 (CDT)\nReceived: from klaatu.totalsports.net\n          (chall3.totalsports.net [207.175.67.217]) by ns.totalsports.net\n          (Post.Office MTA v3.5 release 215 ID# 0-55440U300L200S0V35)\n          with SMTP id net; Fri, 25 Sep 1998 21:53:37 -0400\nMessage-ID: <360C4737.6946@totalsports.net>\nDate: Fri, 25 Sep 1998 21:45:27 -0400\nFrom: chall@totalsports.net (Charles Hall)\nOrganization: Total Sports\nX-Mailer: Mozilla 3.01Gold (Win95; I)\nMIME-Version: 1.0\nTo: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nCC: hypermail@landfield.com\nSubject: Re: adding new messages to prior hypermail archive\nReferences: <360C40A1.A8FAF28C@umich.edu>\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: chall@totalsports.net (Charles Hall)\nX-Lines: 25\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 1005\nStatus: OR\n\nJeffrey K. MacKie-Mason wrote:\n> \n> Then I tried what Charles suggested...  However, the original 467 message\n> entries in the index were overwritten with the 467 dummy messages.  So\n> my index files are now useless....\n\nOuch! I hope you can recover from this. I didn't realize. Sorry.\n\n> Perhaps have a switch for \"append to existing archive\" when we have a new\n> mbox file\n\nYes, Yes! I need this functionality too. I prefer not to add messages\none at a time through the day as Hypermail would go re-indexing over and\nover again, so I let my mail collect till the end of the month, and run\nhypermail once nightly. Since there's no append function, Hypermail has\nto churn through all that month's mail each night. If I could append, I\ncould erase the mailbox each night and only process that day's mail.\n\nMHonArc has this feature, but I believe it keeps a small database to\nremember what's been done before. Perhaps such info could be hidden in\nthe indexes as HTML comments??\n\n--\nCharles Hall\nRaleigh, NC\n\n"
  },
  {
    "path": "tests/mboxes/t3",
    "content": "From owner-hypermail Sat Sep 26 06:16 CDT 1998\nReceived: by landfield.com (8.9.0/8.9.0) id GAA20916\n\tfor hypermail-outgoing; Sat, 26 Sep 1998 06:16:19 -0500 (CDT)\nReceived: from relay7.UU.NET (relay7.UU.NET [192.48.96.17])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id GAA20890\n\tfor <hypermail@landfield.com>; Sat, 26 Sep 1998 06:14:42 -0500 (CDT)\nReceived: from relay7.UU.NET by relay7.UU.NET with ESMTP \n\t(peer crosschecked as: root@localhost)\n\tid QQfijh19139; Fri, 25 Sep 1998 10:17:34 -0400 (EDT)\nReceived: from morrison.matrox.com by relay7.UU.NET with ESMTP \n\t(peer crosschecked as: [204.50.136.19])\n\tid QQfijh19076; Fri, 25 Sep 1998 10:17:28 -0400 (EDT)\nReceived: (from mtxmail@localhost)\n\tby morrison.matrox.com (8.8.8/8.8.8) id KAA23068;\n\tFri, 25 Sep 1998 10:14:08 -0400 (EDT)\nReceived: from venus.matrox.com(138.11.0.5) by morrison-250 via smap (V2.0)\n\tid xma022977; Fri, 25 Sep 98 10:13:18 -0400\nReceived: from focus.matrox.com (focus.matrox.com [192.168.16.2])\n\tby venus.matrox.com (8.8.7/8.8.7) with ESMTP id KAA09310;\n\tFri, 25 Sep 1998 10:13:17 -0400 (EDT)\nReceived: from gbuchan.matrox.com ([192.168.17.51]) by focus.matrox.com (8.7.5/8.7.3) with SMTP id KAA15383; Fri, 25 Sep 1998 10:13:14 -0400 (EDT)\nMessage-Id: <199809251413.KAA15383@focus.matrox.com>\nX-Sender: gbuchan@focus.matrox.com\nX-Mailer: QUALCOMM Windows Eudora Pro Version 4.0\nDate: Fri, 25 Sep 1998 10:13:10 -0400\nTo: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>, hypermail@landfield.com\nFrom: \"Gordon H. Buchan\" <gbuchan@matrox.com>\nSubject: Re: adding new messages to prior hypermail archive\nIn-Reply-To: <360B2905.E41100C9@umich.edu>\nMime-Version: 1.0\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Gordon H. Buchan\" <gbuchan@matrox.com>\nX-Lines: 40\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 1590\nStatus: OR\n\nAt 01:24 AM 9/25/98 -0400, Jeffrey K. MacKie-Mason wrote:\n>\n>I archived some 460 messages from a mailbox with Hypermail 1.02 about 3\n>years ago.  Now I want to use hypermail 2.03b to process a new mailbox\n>and add the messages to the prior archive.  I've tested 2.03b on the new\n>mailbox, and it works fine when I give it an empty directory in which to\n>create a new hypermail archive.  However, when I point it at the\n>directory with the prior 460-message archive, it changes the date stamp\n>on the index files to today, but it doesn't append the 65 new messages\n>to the archive.\n>\n>As far as I can see, the default behavior is supposed to be to append\n>messages to an existing archive.  I'm not using the -u or -x flags. \n>Suggestions?\n\nWith a slight modification (removal of the -x switch, since this is to\nappend, not replace), here is one of my batch files. Change paths and\nparameters to match your environment.\n\n/home/gordon/bin/hypermail \\\n-b \"http://cusidnet.anadas.com/\" \\\n-a \"http://cusidnet.anadas.com/\" \\\n-m \"/home/gordon/mail/cusid\" \\\n-l \"CUSIDnet Web Mirror\" \\\n-d \"/home/gordon/www/cusidnet/fall1998/\" \\\n-c \"/home/gordon/bin/.cusidnethyprc\" > /dev/null\n\nNote 1: /home/gordon/mail/cusid is a standard UNIX mail folder.\nNote 2: /home/gordon/www/cusidnet/fall1998 contains an existing hypermail\narchive.\n\n----\nGordon H. Buchan\nTechnical Writer\nMatrox Networks / Matrox Electronic Systems\nemail:  gbuchan@matrox.com          1055 St-Regis Blvd.\nvoice:  +1 (514) 685-7230 x2523     Dorval, Quebec\nfax:    +1 (514) 822-6272           Canada H9P 2T4\nhttp://www.matrox.com/networks\n\n\n"
  },
  {
    "path": "tests/mboxes/t4",
    "content": "From owner-hypermail Fri Oct  9 16:11 CDT 1998\nReceived: by landfield.com (8.9.0/8.9.0) id QAA21334\n\tfor hypermail-outgoing; Fri, 9 Oct 1998 16:11:02 -0500 (CDT)\nReceived: from fw-es06.hac.com (fw-es06.HAC.COM [128.152.1.6])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id QAA21322\n\tfor <hypermail@landfield.com>; Fri, 9 Oct 1998 16:10:20 -0500 (CDT)\nReceived: from pepperoni.pizza.hac.com (bdarr@[192.27.36.100])\n          by fw-es06.hac.com (8.8.4/8.8.4) with ESMTP\n\t  id OAA22596 for <hypermail@landfield.com>; Fri, 9 Oct 1998 14:07:50 -0700 (PDT)\nReceived: (from bdarr@localhost)\n\tby pepperoni.pizza.hac.com (8.8.6/8.8.6) id OAA03350;\n\tFri, 9 Oct 1998 14:07:50 -0700 (PDT)\nDate: Fri, 9 Oct 1998 14:07:50 -0700 (PDT)\nMessage-Id: <199810092107.OAA03350@pepperoni.pizza.hac.com>\nFrom: \"Byron C. Darrah\" <bdarr@sse.FU.HAC.COM>\nTo: hypermail@landfield.com\nIn-reply-to: <199810091757.KAA03184@pepperoni.pizza.hac.com>\n\t(bdarr@sed.hac.com)\nSubject: Re: replace() function\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Byron C. Darrah\" <bdarr@sse.FU.HAC.COM>\nContent-Type: text\nContent-Length: 4325\nStatus: OR\n\n\nGood morning,\n\nI did a little more checking on this, so here's the skinny if you're\ninterested.\n\nI noticed that some attention to this bug was indeed paid in an early\nversion of the new hypermail.  However, the \"fix\" was more of a work-around\nthan a real fix...\n\nThe problem tends to manifest itself most often for single-character\nsubstitutions.  (Eg: replacing single-character '%' with \"%25\").  So the\nwork-around provided was to implement a whole seperate version of\n\"replace()\", called \"replacechar()\" that is used for certain\nsingle-character substitutions.\n\nHowever, \"replace()\" is still used for some other subsitutions.\n\"replace()\", as it is now, is still buggy and will blow up anytime it is\nused to replace an old string with a new one that happens to contain the\nold one.  For example, if trying to replace \"$SUBJECT\" with the string\n\"Re: Hypermail crashes when $SUBJECT is used in the subject\"  :-).\n\n--Byron Darrah\n\nPS: On the Y2K subject.  If anyone wants a fairly simple date class for C\nor C++ that can add, subtract, convert to text, and parse dates reliably,\nI've got one at http://www.cs.ucla.edu/~darrah/date_t.tgz that you can try.\nNot to be confused with the dates.c file in hypermail, which does other\nstuff.  My date class is \"guranteed\" to correctly account for century\nboundaries, leap years, quad leap years, leap centuries, quad leap\ncenturies, and the Papal decree in 1752, or your money back :-).\n\n\n_______________________________________________________________________________\nDate: Fri, 9 Oct 1998 10:57:36 -0700 (PDT)\nFrom: \"Byron C. Darrah\" <bdarr@sed.hac.com>\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Byron C. Darrah\" <bdarr@sed.hac.com>\n\n\n\nHi, I noticed a bug in an old variant version of hypermail so I inspected\nthe sources of the latest beta release and it seems to be there, too.  I'm\na little surprised that it hasn't been caught by now.\n\nAnyway, there's a function called replace() in strings.c that is used to do\nthings like variable substitution and url encoding. (eg: replace\noccurrences of \"$TO\" with an email address.)  Well, this function is\nwritten such that if the new text *contains* the pattern you are replacing,\nyou get incorrect results.  In fact, you get infinite recursion.  For\nexample, try to replace \"%\" with \"%25\" (for url-encoding), and you end up\nwith an endless sequence of \"%%%%%%%%%%%%%%%%%%%%%%%...\".\n\nI noticed the new version is slightly better than my crummy old deviant\nversion because it uses strcpymax() instead of strcpy() at one place, but I\nthink the basic problem is still there.\n\nHere is a possible replacement for replace().\n\nBesides the main problem, replace() is tail-recursive which is unnecessary,\nand also tends to do some unnecessary recopying of a static buffer onto\nitself due to the recursion.  So I cleaned that up a bit, too.\n\n\n\n--Byron Darrah\n\n\n/* Given a string, replaces all instances of \"oldpiece\" with \"newpiece\".\n *\n * Modified this routine to eliminate recursion and to avoid infinite\n * expansion of string when newpiece contains oldpiece.  --Byron\n*/\n\nchar *replace(char *string, char *oldpiece, char *newpiece)\n{\n   int str_index, newstr_index, oldpiece_index, end,\n      new_len, old_len, cpy_len;\n   char *c;\n   static char newstring[MAXLINE];\n\n\n   if ((c = (char *) strstr(string, oldpiece)) == NULL)\n      return string;\n\n   new_len        = strlen(newpiece);\n   old_len        = strlen(oldpiece);\n   end            = strlen(string)   - old_len;\n   oldpiece_index = c - string;\n\n   newstr_index = 0;\n   str_index    = 0;\n   while(str_index <= end && c != NULL)\n   {\n      /* Copy characters from the left of matched pattern occurence */\n      cpy_len = oldpiece_index-str_index;\n      strncpy(newstring+newstr_index, string+str_index, cpy_len);\n      newstr_index += cpy_len;\n      str_index    += cpy_len;\n\n      /* Copy replacement characters instead of matched pattern */\n      strcpy(newstring+newstr_index, newpiece);\n      newstr_index += new_len;\n      str_index    += old_len;\n\n      /* Check for another pattern match */\n      if((c = (char *) strstr(string+str_index, oldpiece)) != NULL)\n         oldpiece_index = c - string;\n   }\n   /* Copy remaining characters from the right of last matched pattern */\n   strcpy(newstring+newstr_index, string+str_index);\n\n   return newstring;\n}\n\n\n"
  },
  {
    "path": "tests/mboxes/t5",
    "content": "From craig@cni.org Tue Oct  6 18:26 CDT 1998\nReceived: from a.cni.org (a.cni.org [192.100.21.1])\n\tby landfield.com (8.9.0/8.9.0) with SMTP id SAA18925;\n\tTue, 6 Oct 1998 18:26:01 -0500 (CDT)\nReceived: by a.cni.org id <AA05549@a.cni.org>; Tue, 6 Oct 1998 19:20:00 -0400\nFrom: Craig A Summerhill <craig@cni.org>\nMessage-Id: <9810062320.AA05549@a.cni.org>\nSubject: Re: another bug\nTo: hypermail@landfield.com\nDate: Tue, 6 Oct 1998 19:20:00 -0400 (EDT)\nCc: kent@landfield.com\nIn-Reply-To: <199810061703.MAA13834@landfield.com> from \"Kent Landfield\" at Oct 6, 98 12:03:19 pm\nX-Mailer: ELM [version 2.4 PL23]\nContent-Type: text\nContent-Length: 2299\nX-Lines: 53\nStatus: OR\n\nKent Landfield <kent@landfield.com> wrote:\n> \n> # This problem has been around since version 1.02, but I forgot about it \n> # because it doesn't come up too often...\n> # \n> # If you run Hypermail against an existing mailbox...\n> # \n> # hypermail -c <path/config> -m <path/mbox> -l \"whatever\" -d <path/target_dir>\n> # \n> # and the mbox file that you are processing only has one message in it...\n> # \n> # hypermail goes out and creates the HTMLed message (0000.html), but \n> # before the date, author, subject, and thread indexes are created it \n> # dumps core with this error:\n> # \n> #    Floating exception (core dumped)\n> \n> I don't get this when I tried it on the latest version. It may be that\n> the problem isn't the single message in the mailbox but the message itself.\n> It may be triggering a memory corruption bug. If you have a copy of the\n> offending message you can send me I'll verify if it is a problem still.\n\n\nKent,\n\nHmm.  That's odd.  It happens consistently on my system; everytime there\nis a mailbox with only one message in it.  It must be some combination\nof the defaults that I set when I compiled the code (I changed some of \nthe suggested settings), and the settings in the .hmrc file I am calling.\n\nI'll send you my compile time settings and .hmrc file later, and see if \nyou can find something in there that is causing it to happen.  (I have \nbeen up and working on a system problem for thirty-some hours, I need \nto go home, shower, and get in bed -- so it may be tomorrow).\n\nIt does dump core on me to, BTW.  Is there a core analysis tool I \ncould used that would give you some helpful information?\n\n\nP.S.  One other thought occured to me.  I was wondering if it might be \nrelated to the parsing problem I wrote about earlier (which you have \nfixed in the next release -- thank you).  Perhaps it is expecting a \ntrailing line with white space on it, or something?  The trouble with \nthis idea is that the single message problem was also present in \nversion 1.02, and came along to version 2.x.  However, the parsing \nproblem wasn't present in version 1.02...\n-- \n\n   Craig A. Summerhill, Systems Coordinator and Program Officer\n   Coalition for Networked Information\n   21 Dupont Circle, N.W., Washington, D.C.   20036\n   Internet: craig@cni.org   AT&Tnet (202) 296-5098\n\n\n"
  },
  {
    "path": "tests/mboxes/t6",
    "content": "From brian@hyperreal.org Wed Apr 22 23:13 CDT 1998\nReceived: from hyperreal.org (taz.hyperreal.org [204.62.130.147])\n\tby landfield.com (8.8.8/8.8.8) with SMTP id XAA27903\n\tfor <kent@landfield.com>; Wed, 22 Apr 1998 23:13:13 -0500 (CDT)\nReceived: (qmail 7191 invoked by uid 24); 23 Apr 1998 04:11:20 -0000\nMessage-Id: <3.0.3.32.19980422211640.00a31100@hyperreal.org>\nX-Sender: brian@hyperreal.org\nX-Mailer: QUALCOMM Windows Eudora Pro Version 3.0.3 (32)\nDate: Wed, 22 Apr 1998 21:16:40 -0700\nTo: Kent Landfield <kent@landfield.com>\nFrom: Brian Behlendorf <brian@hyperreal.org>\nSubject: thoughts on ml archives\nCc: mike@hyperreal.org\nMime-Version: 1.0\nX-Lines: 128\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 5529\nStatus: OR\n\n\nHere's a message about a system we've been scheming up here, but I haven't\nhad the time to implement.  I've got another right after this which is my\ncomments on this proposal.  We wouldn't mind at all if you wanted to base\nyour efforts on this; I just wish I had any time to do anything with it.\n\n\tBrian\n\n>Delivered-To: brian@hyperreal.org\n>From: mike@hyperreal.org\n>MBOX-Line: From mike Fri Dec 26 18:38:31 1997 remote from taz.hyperreal.org\n>Subject: thoughts on ml archives\n>To: brian@hyperreal.org (Brian Behlendorf)\n>Date: Fri, 26 Dec 1997 18:38:31 -0800 (PST)\n>Cc: est@hyperreal.org (Eric Tiedemann), tint@hyperreal.org (Mike Perkowitz)\n>X-Mailer: ELM [version 2.4ME+ PL37 (25)]\n>Sender: mike@hyperreal.org\n>\n>Well here are the ideas I had over the summer regarding an ideal mailing\n>list archival system. I was thinking of using a database.\n>\n>goals:\n>\n>for general browsing through the archives, a set of static index files,\n>updated daily.\n>indexes by date or by thread.\n>\n>monthly (or whatever) mbox file structure preserved.\n>individual messages accessible without having every message broken out into\n>its own file.\n>\n>html-ization of individual messages on the fly, upon delivery.\n>\n>searchability - searches must be fast, using a pre-built index rather than\n>scanning through all the mbox files every time.\n>desired: new messages added to index as they arrive.\n>\n>suggested method:\n>\n>relational databse using mysql. tables as follows:\n>\n>MESSAGE_INFO table\n>==================================\n>umid = unique message id#\n>message_id = message id field from headers\n>mbox_file = name of mbox file containing message\n>mbox_byte_offset = byte offset of start of message within mbox file\n>from = From: field from headers. if none, glean from first line of headers\n>(^From user@foo ...)\n>subject = subject field from headers\n>date = date field from headers\n>gmt_date = date field converted to gmt, for proper ordering and better\n>searching (e.g., 3pm EST comes well before 2:45pm PST)\n>\n>MESSAGE_THREAD table\n>=================================\n>umid = unique message id#\n>xrefs = other umids from headers (In-Reply-To, References)\n>possible_xrefs = other umids guessed from subject, date\n>\n>KEYWORDS tables (one of these for every letter & number)\n>========================================================\n>keyword = keyword that appears in a message\n>location = umids where that keyword can be found\n>\n>\n>I think that's all you'd need.\n>\n>When doing a search, you'd enter keywords\n>to look for in a form. The script would use the KEYWORDS tables \n>(KEYWORD_A, KEYWORD_B, KEYWORD_C, etc, depending on the\n>first letter of the keywords in your query) to build lists of umids which\n>correspond to the messages where those words are found. The lists are\n>then combined, depending on the nature of the query (AND, OR, NOT\n>would be really easy to do this way), and a list of matching umids is\n>produced.\n>\n>Then the script would look up each umid in the MESSAGE_INFO\n>table to find out exactly where that message is, and it would get info\n>like the subject line, date and sender, all without actually going into\n>the mbox file itself. At this point the list of umids might shrink a little\n>because the query might have specified that the search only applied\n>to certain mbox files. (A possible inefficiency... if only certain mbox\n>files are to be checked, the simple KEYWORDS tables shouldn't\n>have to return hundreds, possibly thousands of umids that \n>correspond to messages located across the entire archive).\n>\n>Of course the search result is going to have to link to the message\n>somehow, and you may want to include a couple lines of context from\n>the message. Both are accomplished by looking at the mbox_file and\n>mbox_byte_offset. \n>\n>To get the link, a URL can be calculated. It will point to a script\n>that is given the mbox filename and byte offset as arguments. This\n>script will take care of extracting the message and html-izing it and\n>chucking it out to the user.\n>\n>example:   http://hyperreal/extract?mbox=idm.9706&offset=229148\n>extract.cgi would go look for a message that starts at byte 229148\n>in the file idm.9706.\n>\n>The script could even take umid as an argument instead, and do \n>the necessary lookups to determine the mbox and offset.\n>\n>To get the lines of context for the search results, a similar script\n>would extract the message, but rather than HTML-ize the whole\n>thing, it would just do a context grep and highlight the\n>appropriate keywords. (This might be inefficient to run such\n>a script on every message in the search results, though.)\n>\n>html-ization would involve more lookups, because you want to have\n>links in the message to the rest of the thread. The extraction script\n>will already have the current message's umid, so it just needs to get \n>some other umids for xref messages out of the MESSAGE_THREAD\n>table. There may be messages UP the thread chain (xrefs listed for\n>the current umid) and there may be messages DOWN the thread\n>chain (umids that have the current umid listed in their xrefs), so\n>that's two additional lookups.\n>\n>General browsing requires building indices ahead of time. Not\n>sure of the best way to generate them, but shouldn't be too \n>difficult to do the by-date lists, at least. Thread lists are probably\n>trickier.\n>\n>\n--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--\n\"Optimism is a strategy for making                         brian@apache.org\na better future.\" - Noam Chomsky                        brian@hyperreal.org\n\n"
  },
  {
    "path": "tests/mboxes/t7",
    "content": "From owner-hypermail Thu Apr 23 12:22 CDT 1998\nReceived: (from lists@localhost)\n\tby landfield.com (8.8.8/8.8.8) id MAA15666\n\tfor hypermail-outgoing; Thu, 23 Apr 1998 12:20:58 -0500 (CDT)\nReceived: (from root@localhost)\n\tby landfield.com (8.8.8/8.8.8) id MAA15660\n\tfor hypermail; Thu, 23 Apr 1998 12:20:50 -0500 (CDT)\nFrom: Kent Landfield <kent>\nMessage-Id: <199804231720.MAA15660@landfield.com>\nSubject: Re: Ideas\nTo: hypermail\nDate: Thu, 23 Apr 1998 12:20:47 -0500 (CDT)\nIn-Reply-To: <9804230546.AA06415@a.cni.org> from \"Craig A Summerhill\" at Apr 23, 98 01:46:19 am\nX-Mailer: ELM [version 2.4 PL25]\nMIME-Version: 1.0\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: Kent Landfield <kent>\nX-Lines: 62\nContent-Type: text/plain; charset=\"US-ASCII\"\nContent-Length: 2971\nStatus: OR\n\n# It occurs to me that one of the first things you need to do is to get \n# some sense of prioritization on that list of proposed enhancements.\n# In that manner, you can perhaps break it into manageable chunks.\n\nThis makes total sense. \n\n     0) Merge existing contributed patches\n\n# Off the top of my head, I will offer my top priorities for Hypermail:\n# \n#    1) Full MIME compliance -- \n\nDaniel Stenberg <Daniel.Stenberg@sth.frontec.se> submitted a patch that\nis a first step to supporting MIME.  It replaces attachments with the\nmessage  \"** attachment type 'application/octet-stream;' left out\".\nIt does the proper parsing for most everything else so extending that\nto deal with the attachments will need to be done.  It is a great start.\n\nI'd like to see the attachments dealt with so that certain types of know\nformats could be automagically converted, much like MHonArc does. One\nissue will be storage. While many messages have just one enclosure, some\nhave more than one so we will need to handle those.\n\n#    2) Correct RFC821/822 Header Parsing -- this is the single biggest\n#       reason that Hypermail dumps core on me.  I have compensated for\n#       the most offending instances of this by using Perl and shell \n#       pre-processing to \"re-write\" headers before they are handed  \n#       off Hypermail.  But this is really inefficient, and I keep finding\n#       new instances of such problems cropping up all the time.\n\nYes this is a biggy. I'd be interested in any sample headers sets or\nneeded workarounds that could be used in testing and verification of\nfixes.  \n\n#    3) Configurable Setting (.hmrc file) to a Pointer/URL for Custom \n#       Header and Footer Files -- currently, Hypermail does not include\n#       anything except the HTML message body (payload, I guess) when \n#       it does it's output.  \n\nYes. My {list}_print.c method of the past needs to be left there. ;) We\nneed to be able to specify a template in some fashion that would allow\nfor list index and list message page customzation.\n\n#    4) Configurable Setting (.hmrc file) or Compile Time Variable to \n#       Domain-ize Addresses -- addresses appearing in the RFC822 field \n#       which lack hostname can't be made into proper HREFs when Hypermail\n#       does it's thing.  For a good example of the problem I am talking \n#       about, look at message numbers 0001.html and 0002.html on \n#       ftp://ftp.landfield.com/hypermail/mail-archive/1998/.\n\nHmmmm... You know I've not been paying attention. You are right. This \nshould be easy enough to fix and it needs to be.\n\nThanks Craig.  Good set of priorities. Sounds like a good plan.\n\n-- \nKent Landfield                        Phone: 1-817-545-2502             \nEmail: kent@landfield.com             http://www.landfield.com/\nEmail: kent@nfr.net                   http://www.nfr.net/\nPlease send comp.sources.misc related mail to kent@landfield.com\nSearch the Usenet Hypertext FAQ Archive at http://www.faqs.org/faqs/\n\n\n"
  },
  {
    "path": "tests/mboxes/t8",
    "content": "From ftp-wg-owner@hethmon.com Tue May 26 15:41 CDT 1998\nReceived: from mail.hethmon.com (mail.hethmon.com [208.147.156.6])\n\tby landfield.com (8.8.8/8.8.8) with SMTP id PAA28800\n\tfor <kent@landfield.com>; Tue, 26 May 1998 15:40:28 -0500 (CDT)\nReceived: from mail (mail.hethmon.com [208.147.156.6] ) by mail.hethmon.com\n    (Hethmon Brothers Smtpd) ; Tue, 26 May 1998 16:33:06 -0400\nReceived: from www.disa.mil (www.disa.mil [209.22.99.13] ) by mail.hethmon.com\n    (Hethmon Brothers Smtpd) ; Tue, 26 May 1998 16:32:45 -0400\nReceived: from ftm.disa.mil by www.disa.mil (SMI-8.6/SMI-SVR4)\n\tid QAA23321; Tue, 26 May 1998 16:15:57 -0400\nMessage-ID: <356B25D6.2A1920CD@ftm.disa.mil>\nX-Mailer: Mozilla 4.03 [en] (WinNT; U)\nMIME-Version: 1.0\nDate: Tue, 26 May 1998 16:32:47 -0400\nX-OldDate:   Tue, 26 May 1998 16:28:07 -0400\nSender: ftp-wg-owner <ftp-wg-owner@hethmon.com>\nX-Listname: ftp-wg@hethmon.com\nReply-To: FTPEXT Working Group <ftp-wg@hethmon.com>\nFrom: Bill Curtin <curtinw@ftm.disa.mil>\nTo: ftp-wg@hethmon.com\nSubject: Ftp-WG:   v5 of I18N draft\nContent-Type: multipart/mixed; boundary=\"=_AAAYDgAABLM1bB/O\"\nX-Lines: 2201\nContent-Length: 205226     \nStatus: OR\n\n--=_AAAYDgAABLM1bB/O\nContent-Type: text/html; charset=\"us-ascii\"\nFrom ftp-wg-owner@hethmon.com Tue May 26 15:41 CDT 1998\nReceived: from ftm.disa.mil by www.disa.mil (SMI-8.6/SMI-SVR4)\n\tid QAA23321; Tue, 26 May 1998 16:15:57 -0400\nMessage-ID: <356B25D6.2A1920CD@ftm.disa.mil>\nX-Mailer: Mozilla 4.03 [en] (WinNT; U)\nMIME-Version: 1.0\nDate: Tue, 26 May 1998 16:32:47 -0400\nX-OldDate:   Tue, 26 May 1998 16:28:07 -0400\nSender: ftp-wg-owner <ftp-wg-owner@hethmon.com>\nX-Listname: ftp-wg@hethmon.com\nReply-To: FTPEXT Working Group <ftp-wg@hethmon.com>\nFrom: Bill Curtin <curtinw@ftm.disa.mil>\nTo: ftp-wg@hethmon.com\nSubject: Ftp-WG:   v5 of I18N draft\nContent-Length: 204493\nStatus: OR\nX-Sun-Content-Length: 204492\n\n<HTML>\nSorry for the delay. Below is the 5th edition of the I18N draft. I believe\nit incorporates all of the suggestions sent to the list. I've also sent\na copy to the ID editor.\n\n<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbill\n\n<P>\n<HR WIDTH=\"100%\">\n<BR>&nbsp;\n<BR>&nbsp;\n<BR>&nbsp;\n<BR>&nbsp;\n<BR>&nbsp;\n<BR>&nbsp;\n<BR>&nbsp;\n\n<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;\nFTPEXT Working Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB. Curtin</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nDefense Information Systems Agency</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nInternationalization of the File Transfer Protocol</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;draft-ietf-ftpext-intl-ftp-05.txt></FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nStatus of this Memo</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis document is an Internet-Draft.&nbsp; Internet-Drafts are</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nworking documents of the Internet Engineering Task Force</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(IETF), its areas, and its working groups. Note that other</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ngroups may also distribute working documents as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nInternet-Drafts.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nInternet-Drafts are draft documents valid for a maximum of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsix months. Internet-Drafts may be updated, replaced, or</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nobsoleted by other documents at any time.&nbsp; It is not</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nappropriate to use Internet-Drafts as reference material or</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto cite them other than as a \"working draft\" or \"work in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nprogress\".</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTo view the entire list of current Internet-Drafts, please</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncheck the 1id-abstracts.txt listing contained in the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nInternet-Drafts Shadow Directories on ftp.is.co.za (Africa),</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nftp.nordu.net (Europe), munnari.oz.au (Pacific Rim),</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nds.internic.net (US East Coast), or ftp.isi.edu (US West</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCoast).</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nDistribution of this document is unlimited.&nbsp; Please send</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncomments to the FTP Extension working group (FTPEXT-WG) of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe Internet Engineering Task Force (IETF) at</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;ftp-wg@hops.ag.utk.edu>. Subscription address is</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;ftp-wg-request@hops.ag.utk.edu>. Discussions of the group</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nare archived at &lt;URL:<A HREF=\"ftp://hops.ag.utk.edu/ftp-wg/archives/\">ftp://hops.ag.utk.edu/ftp-wg/archives/</A>>.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nNOT\", \"SHOULD\", \"SHOULD NOT\", \"RECOMMENDED\",&nbsp; \"MAY\", and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\"OPTIONAL\" in this document are to be interpreted as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndescribed in RFC 2119 [RFC 2119].</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 1]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAbstract</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe File Transfer Protocol, as defined in RFC 959 [RFC959]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand RFC 1123 Section 4 [RFC1123], is one of the oldest and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwidely used protocols on the Internet. The protocol's primary</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set, 7 bit ASCII, has served the protocol well</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthrough the early growth years of the Internet. However, as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe Internet becomes more global, there is a need to support</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets beyond 7 bit ASCII.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis document addresses the internationalization (I18n) of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFTP, which includes supporting the multiple character sets</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfound throughout the Internet community.&nbsp; This is achieved by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nextending the FTP specification and giving recommendations</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfor proper internationalization support.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTable of Contents</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1 INTRODUCTION....................................................3</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2 INTERNATIONALIZATION............................................3</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.1&nbsp; International Character Set.................................4</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.2&nbsp; Transfer Encoding...........................................4</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3 CONFORMANCE.....................................................5</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.1&nbsp; General.....................................................5</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.2&nbsp; International Servers.......................................7</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.3&nbsp; International Clients.......................................7</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n4 SECURITY........................................................8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n5 ACKNOWLEDGMENTS.................................................8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n6 GLOSSARY........................................................8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n7 BIBLIOGRAPHY....................................................9</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8 AUTHOR'S ADDRESS...............................................10</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAPPENDIX A - IMPLEMENTATION CONSIDERATIONS......................A-1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA.1&nbsp; General Considerations....................................A-1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA.2&nbsp; Transition Considerations.................................A-2</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAPPENDIX B - SAMPLE CODE AND EXAMPLES...........................B-1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.1&nbsp; Valid UTF-8 check.........................................B-1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2&nbsp; Conversions...............................................B-2</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.1 Conversion from local character set to UTF-8............B-2</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.2 Conversion from UTF-8 to local character set............B-5</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.3&nbsp; ISO/IEC 8859-8 Example.................................B-7</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.4 Vendor Codepage Example.................................B-7</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.3&nbsp; Pseudo Code for translating servers.......................B-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 2 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1 Introduction</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAs the Internet grows throughout the world the requirement to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsupport character sets outside of the ASCII [ASCII] / Latin-1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[ISO-8859] character set becomes ever more urgent.&nbsp; For FTP,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbecause of the large installed base, it is paramount that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthis be done without breaking existing clients and servers.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis document addresses this need. In doing so it defines a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsolution which will still allow the installed base to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ninteroperate with new international clients and servers.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis document enhances the capabilities of the File Transfer</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nProtocol by removing the 7-bit restrictions on pathnames used</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nin client commands and server responses, recommends the use</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof a Universal Character Set (UCS) ISO/IEC 10646 [ISO-10646],</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand recommends a UCS transformation format (UTF) UTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[UTF-8].</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe recommendations made in this document are consistent with</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe recommendations expressed by the 29 Feb - 1 Mar 1996 IAB</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCharacter Set Workshop as expressed in RFC 2130 [RFC 2130].</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2 Internationalization</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe File Transfer Protocol was developed when the predominate</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets were 7 bit ASCII and 8 bit EBCDIC. Today these</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets cannot support the wide range of characters</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nneeded by multinational systems. Given that there are a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnumber of character sets in current use that provide more</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacters than 7-bit ASCII, it makes sense to decide on a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconvenient way to represent the union of those possibilities.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTo work globally either requires support of a number of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets and to be able to convert between them, or the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nuse of a single preferred character set. To assure global</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ninteroperability this document RECOMMENDS the latter approach</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand defines a single character set, in addition to NVT ASCII</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand EBCDIC, which is understandable by all systems. For FTP</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthis character set SHALL be ISO/IEC 10646:1993. For support</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof global compatibility it is STRONGLY RECOMMENDED that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nclients and servers use UTF-8 encoding when exchanging</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathnames. Clients and servers are, however, under no</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nobligation to perform any conversion on the contents of a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfile for operations such as STOR or RETR.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe character set used to store files SHALL remain a local</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndecision and MAY depend on the capability of local operating</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsystems. Prior to the exchange of pathnames they should be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconverted into a ISO/IEC 10646 format and UTF-8 encoded. This</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\napproach, while allowing international exchange of pathnames,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwill still allow backward compatibility with older systems</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbecause the code set positions for ASCII characters are</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nidentical to the one byte sequence in UTF-8.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 3 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nSections 2.1 and 2.2 give a brief description of the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ninternational character set and transfer encoding recommended</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nby this document. A more thorough description of UTF-8,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nISO/IEC 10646, and UNICODE [UNICODE], beyond that given in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthis document, can be found in RFC 2279 [RFC2279].</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.1 International Character Set</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe character set defined for international support of FTP</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nSHALL be the Universal Character Set as defined in ISO</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10646:1993 as amended. This standard incorporates the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets of many existing international, national, and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncorporate standards. ISO/IEC 10646 defines two alternate</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nforms of encoding, UCS-4 and UCS-2. UCS-4 is a four byte (31</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbit) encoding containing 2**31 code positions divided into</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n128 groups of 256 planes. Each plane consists of 256 rows of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n256 cells. UCS-2 is a 2 byte (16 bit) character set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconsisting of plane zero or the Basic Multilingual Plane</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(BMP).&nbsp; Currently, no codesets have been defined outside of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe 2 byte BMP.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe Unicode standard version 2.0 [UNICODE] is consistent with</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe UCS-2 subset of ISO/IEC 10646. The Unicode standard</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nversion 2.0 includes the repertoire of IS 10646 characters,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\namendments 1-7 of IS 10646, and editorial and technical</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncorrigenda.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.2 Transfer Encoding</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS Transformation Format 8 (UTF-8), in the past referred to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nas UTF-2 or UTF-FSS, SHALL be used as a transfer encoding to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntransmit the international character set. UTF-8 is a file</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsafe encoding which avoids the use of byte values that have</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nspecial significance during the parsing of pathname character</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nstrings. UTF-8 is an 8 bit encoding of the characters in the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS. Some of UTF-8's benefits are that it is compatible with</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n7 bit ASCII, so it doesn't affect programs that give special</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nmeanings to various ASCII characters; it is immune to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsynchronization errors; its encoding rules allow for easy</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nidentification; and it has enough space to support a large</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnumber of character sets.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 encoding represents each UCS character as a sequence of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1 to 6 bytes in length. For all sequences of one byte the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nmost significant bit is ZERO. For all sequences of more than</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\none byte the number of ONE bits in the first byte, starting</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfrom the most significant bit position, indicates the number</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof bytes in the UTF-8 sequence followed by a ZERO bit. For</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nexample, the first byte of a 3 byte UTF-8 sequence would have</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1110 as its most significant bits. Each additional bytes</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(continuing bytes) in the UTF-8 sequence, contain a ONE bit</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfollowed by a ZERO bit as their most significant bits. The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nremaining free bit positions in the continuing bytes are used</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 4 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto identify characters in the UCS. The relationship between</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS and UTF-8 is demonstrated in the following table:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS-4 range(hex)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 byte sequence(binary)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000000 - 0000007F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xxxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000080 - 000007FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 110xxxxx 10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00000800 - 0000FFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1110xxxx 10xxxxxx\n10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00010000 - 001FFFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11110xxx 10xxxxxx\n10xxxxxx 10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n00200000 - 03FFFFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 111110xx 10xxxxxx\n10xxxxxx 10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n04000000 - 7FFFFFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1111110x 10xxxxxx\n10xxxxxx 10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n10xxxxxx 10xxxxxx</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA beneficial property of UTF-8 is that its single byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsequence is consistent with the ASCII character set. This</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfeature will allow a transition where old ASCII-only clients</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncan still interoperate with new servers that support the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 encoding.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAnother feature is that the encoding rules make it very</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunlikely that a character sequence from a different character</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nset will be mistaken for a UTF-8 encoded character sequence.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nClients and servers can use a simple routine to determine if</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe character set being exchanged is valid UTF-8. Section B.1</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nshows a code example of this check.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3 Conformance</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.1 General</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- The 7-bit restriction for pathnames exchanged is dropped.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Many operating system allow the use of spaces &lt;SP>,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncarriage return &lt;CR>, and line feed &lt;LF> characters as part</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof the pathname. The exchange of pathnames with these</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nspecial command characters will cause the pathnames to be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nparsed improperly. This is because ftp commands associated</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwith pathnames have the form:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCOMMAND &lt;SP> &lt;pathname> &lt;CRLF>.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTo allow the exchange of pathnames containing these</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacters, the definition of pathname is changed from</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;pathname> ::= &lt;string>&nbsp;&nbsp; ; in BNF format</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname = 1*(%x01..%xFF) ; in ABNF format [ABNF]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTo avoid mistaking these characters within pathnames as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nspecial command characters the following rules will apply:</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 5 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThere MUST be only one &lt;SP> between a ftp command and the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname. Implementations MUST assume &lt;SP> characters</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfollowing the initial &lt;SP> as part of the pathname. For</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nexample the pathname in STOR &lt;SP>&lt;SP>&lt;SP>foo.bar&lt;CRLF> is</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;SP>&lt;SP>foo.bar .</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCurrent implementations, which may allow multiple &lt;SP></FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacters as separators between the command and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname, MUST assure that they comply with this single</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;SP> convention. Note: Implementations which treat 3</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter commands (e.g. CWD, MKD, etc.) as a fixed 4</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter command by padding the command with a trailing</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;SP> are in non-compliance to this specification.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nWhen a &lt;CR> character is encountered as part of a pathname</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nit MUST be padded with a &lt;NUL> character prior to sending</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe command. On receipt of a pathname containing a &lt;CR>&lt;NUL></FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsequence the &lt;NUL> character MUST be stripped away. This</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\napproach is described in the Telnet protocol [RFC854] on</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npages 11 and 12. For example, to store a pathname</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfoo&lt;CR>&lt;LF>boo.bar the pathname would become</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfoo&lt;CR>&lt;NUL>&lt;LF>boo.bar prior to sending the command STOR</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&lt;SP>foo&lt;CR>&lt;NUL>&lt;LF>boo.bar&lt;CRLF> .</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUpon receipt of the altered pathname the &lt;NUL> character</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfollowing the &lt;CR> would be stripped away to form the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\noriginal pathname.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Conforming internationalized clients and servers MUST</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsupport UTF-8 for the transfer and receipt of pathnames.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nClients and servers MAY in addition give users a choice of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nspecifying interpretation of pathnames in another encoding.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nNote that configuring clients and servers to use character</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsets / encoding other than UTF-8 is outside of the scope of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthis document. While it is recognized that in certain</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\noperational scenarios this may be desirable, this is left as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\na quality of implementation and operational issue.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Pathnames are sequences of bytes.&nbsp; The encoding of names</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthat are valid UTF-8 sequences is assumed to be UTF-8.&nbsp; The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set of other names is undefined. Clients and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nservers, unless otherwise configured to support a specific</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnative character set, MUST check for a valid UTF-8 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsequence to determine if the pathname being presented is</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- To avoid data loss, clients and servers SHOULD use the UTF-</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8 encoded pathnames when unable to convert them to a usable</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncode set.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- There may be cases when the code set / encoding presented</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto the server or client cannot be determined. In such cases</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe raw bytes SHOULD be used.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 6 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.2 International Servers</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Servers MUST support the UTF-8 feature in response to the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFEAT command [FEAT]. The UTF-8 feature is a line containing</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe exact string \"UTF8\". This string is not case sensitive,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbut SHOULD be transmitted in upper case. The response to a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFEAT command SHOULD be:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nC> feat</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS> 211- &lt;any descriptive text></FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS>&nbsp; ...</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS> UTF8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS>&nbsp; ...</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS> 211 end</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe ellipses indicate placeholders where other features may</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbe included, and are not required. The one space indentation</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof the feature lines is mandatory [FEAT].</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Mirror servers may want to exactly reflect the site that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthey are mirroring. In such cases servers MAY store and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npresent the exact pathname bytes that it received from the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nmain server.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3.3 International Clients</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Clients which do not require display of pathnames are under</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nno obligation to do so. Non-display clients do not need to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconform to requirements associated with display.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Clients, which are presented UTF-8 pathnames by the server,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nSHOULD parse UTF-8 correctly and attempt to display the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname within the limitation of the resources available.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Clients MUST support the FEAT command and recognize the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\"UTF8\" feature (defined in 3.2 above) to determine if a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nserver supports UTF-8 encoding.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Character semantics of other names shall remain undefined.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nIf a client detects that a server is non UTF-8, it SHOULD</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nchange its display appropriately. How a client</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nimplementation handles non UTF-8 is a quality of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nimplementation issue. It MAY try to assume some other</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nencoding, give the user a chance to try to assume something,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nor save encoding assumptions for a server from one FTP</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsession to another.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Glyph rendering is outside the scope of this document. How</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\na client presents characters it cannot display is a quality</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nof implementation issue. This document RECOMMENDS that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\noctets corresponding to non-displayable characters SHOULD be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npresented in URL %HH format defined in RFC 1738 [RFC1738].</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThey MAY, however, display them as question marks, with</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 7 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntheir UCS hexadecimal value, or in any other suitable</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfashion.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Many existing clients interpret 8-bit pathnames as being in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe local character set. They MAY continue to do so for</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathnames that are not valid UTF-8.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n4 Security</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis document addresses the support of character sets beyond</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1 byte. Conformance to this document should not induce a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsecurity threat.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n5 Acknowledgments</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe following people have contributed to this document:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nD. J. Bernstein</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nMartin J. Duerst</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nMark Harris</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nPaul Hethmon</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAlun Jones</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nJames Matthews</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nKeith Moore</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nSandra O'Donnell</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nBenjamin Riefenstahl</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nStephen Tihor</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(and others from the FTPEXT working group)</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n6 Glossary</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nBIDI - abbreviation for Bi-directional, a reference to mixed</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nright-to-left and left-to-right text.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCharacter Set -&nbsp; a collection of characters used to represent</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntextual information in which each character has a numeric</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nvalue</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nCode Set -&nbsp; (see character set).</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nGlyph - a character image represented on a display device.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nI18N - \"I eighteen N\", the first and last letters of the word</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n\"internationalization\" and the eighteen letters in between.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS-2 - the ISO/IEC 10646 two octet Universal Character Set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nform.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS-4 - the ISO/IEC 10646 four octet Universal Character Set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nform.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 8 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 - the UCS Transformation Format represented in 8 bits.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-16 - A 16-bit format including the BMP (directly encoded)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand surrogate pairs to represent characters in planes 01-16;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nequivalent to Unicode.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n7 Bibliography</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[ABNF]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nD. Crocker, P. Overell, Augmented BNF for Syntax</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nSpecifications: ABNF, RFC 2234, November 1997.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[ASCII]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nANSI X3.4:1986 Coded Character Sets - 7 Bit American</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nNational Standard Code for Information Interchange (7-bit</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nASCII)</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[FEAT]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nR. Elz, P. Hethmon, \"Feature Negotiation Mechanism for the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFile Transfer Protocol\", Work in Progress, &lt;draft-ietf-</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nftpext-feat-02.txt> November 1997.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[ISO-8859]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nISO 8859.&nbsp; International standard -- Information processing</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-- 8-bit single-byte coded graphic character sets -- Part 1:</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nLatin alphabet No. 1 (1987) -- Part 2: Latin alphabet No. 2</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(1987) -- Part 3: Latin alphabet No. 3 (1988) -- Part 4:</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nLatin alphabet No. 4 (1988) -- Part 5: Latin/Cyrillic</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nalphabet (1988) -- Part 6: Latin/Arabic alphabet (1987) --</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nPart : Latin/Greek alphabet (1987) -- Part 8: Latin/Hebrew</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nalphabet (1988) -- Part 9: Latin alphabet No. 5 (1989) --</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nPart10: Latin alphabet No. 6 (1992)</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[ISO-10646]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nISO/IEC 10646-1:1993. International standard -- Information</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntechnology -- Universal multiple-octet coded character set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(UCS) -- Part 1: Architecture and basic multilingual plane.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC854]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nJ. Postel, J Reynolds, \"Telnet Protocol Specification\", RFC</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n854, May 1983.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 9 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC959]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nJ. Postel, J Reynolds, \"File Transfer Protocol (FTP)\", RFC</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n959, October 1985.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC1123]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nR. Braden, \"Requirements for Internet Hosts -- Application</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand Support\", RFC 1123, October 1989.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC1738]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nT. Berners-Lee, L. Masinter, M.McCahill, \"Uniform Resource</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nLocators (URL)\", RFC 1738, December 1994.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC2279]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nF. Yergeau, \"UTF-8, a transformation format of ISO 10646\",</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nRFC 2279, January 1998.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC 2119]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nS. Bradner, \" Key words for use in RFCs to Indicate</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nRequirement Levels\", RFC 2119, March 1997.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[RFC 2130]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nC. Weider, C. Preston, K.Simonsen, H. Alvestrand, \" The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nReport of the IAB Character Set Workshop held 29 February -</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1 March, 1996\", RFC 2130, April, 1997.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[UNICODE]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe Unicode Consortium, \"The Unicode Standard - Version</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.0\", Addison Westley Developers Press, July 1996.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[UTF-8]</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nISO/IEC 10646-1:1993 AMENDMENT 2 (1996). UCS Transformation</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFormat 8 (UTF-8).</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8 Author's Address</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nJIEO</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAttn JEBBD (Bill Curtin)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFt. Monmouth, N.J.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n07703-5613</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncurtinw@ftm.disa.mil</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page 10 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAnnex A - Implementation Considerations</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA.1 General Considerations</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Implementers should ensure that their code accounts for</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npotential problems, such as using a NULL character to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nterminate a string or no longer being able to steal the high</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\norder bit for internal use, when supporting the extended</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Implementers should be aware that there is a chance that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathnames that are non UTF-8 may be parsed as valid UTF-8.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe probabilities are low for some encoding or statistically</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nzero to zero for others. A recent non-scientific analysis</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfound that EUC encoded Japanese words had a 2.7% false</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreading; SJIS had a 0.0005% false reading; other encoding</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsuch as ASCII or KOI-8 have a 0% false reading. This</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nprobability is highest for short pathnames and decreases as</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname size increases. Implementers may want to look for</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsigns that pathnames which parse as UTF-8 are not valid UTF-</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8, such as the existence of multiple local character sets in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nshort pathnames. Hopefully, as more implementations conform</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto UTF-8 transfer encoding there will be a smaller need to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nguess at the encoding.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Client developers should be aware that it will be possible</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfor pathnames to contain mixed characters (e.g.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n/Latin1DirectoryName/HebrewFileName). They should be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nprepared to handle the Bi-directional (BIDI) display of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthese character sets (i.e. right to left display for the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndirectory and left to right display for the filename). While</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbi-directional display is outside the scope of this document</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand more complicated than the above example, an algorithm</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfor bi-directional display can be found in the UNICODE 2.0</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[UNICODE] standard. Also note that pathnames can have</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndifferent byte ordering yet be logically and display-wise</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nequivalent due to the insertion of BIDI control characters</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nat different points during composition. Also note that mixed</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter sets may also present problems with font swapping.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- A server that copies pathnames transparently from a local</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfilesystem may continue to do so. It is then up to the local</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfile creators to use UTF-8 pathnames.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Servers can supports charset labeling of files and/or</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndirectories, such that different pathnames may have</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndifferent charsets. The server should attempt to convert all</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathnames to UTF-8, but if it can't then it should leave</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthat name in its raw form.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page A-1 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- Some server's OS do not mandate character sets, but allow</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nadministrators to configure it in the FTP server. These</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nservers should be configured to use a particular mapping</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntable (either external or built-in). This will allow the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nflexibility of defining different charsets for different</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndirectories.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- If the server's OS does not mandate the character set and</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe FTP server cannot be configured, the server should</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsimply use the raw bytes in the file name.&nbsp; They might be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nASCII or UTF-8.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n- If the server is a mirror, and wants to look just like the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsite it is mirroring, it should store the exact file name</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbytes that it received from the main server.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA.2 Transition Considerations</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-Clients and servers can transition to UTF-8 by either</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconverting to/from the local encoding, or the users can</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nstore UTF-8 filenames. The former approach is easier on</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntightly controlled file systems (e.g. PCs and MACs). The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nlatter approach is easier on more free form file systems</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(e.g. Unix).</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-For interactive use attention should be focused on user</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ninterface and ease of use. Non-interactive use requires a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconsistent and controlled behavior.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n-There may be many applications which reference files under</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntheir old raw pathname (e.g. linked URLs). Changing the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npathname to UTF-8 will cause access to the old URL to fail.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nA solution may be for the server to act as if there was 2</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndifferent pathnames associated with the file. This might be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndone internal to the server on controlled file systems or by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nusing symbolic links on free form systems. While this</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\napproach may work for single file transfer non-interactive</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nuse, a non-interactive transfer of all of the files in a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndirectory will produce duplicates. Interactive users may be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\npresented with lists of files which are double the actual</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnumber files.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page A-2 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAnnex B - Sample Code and Examples</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.1 Valid UTF-8 check</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe following routine checks if a byte sequence is valid UTF-</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8. This is done by checking for the proper tagging of the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfirst and following bytes to make sure they conform to the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 format. It then checks to assure that the data part of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe UTF-8 sequence conforms to the proper range allowed by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe encoding. Note: This routine will not detect characters</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthat have not been assigned and therefore do not exist.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nint utf8_valid(const unsigned char *buf, unsigned int len)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconst unsigned char *endbuf = buf + len;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned char byte2mask=0x00, c;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nint trailing = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// trailing (continuation)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbytes to follow</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwhile (buf != endbuf)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nc = *buf++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (trailing)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((c&amp;0xC0) == 0x80)&nbsp; // Does trailing byte follow UTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nformat?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{if (byte2mask)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Need to check 2nd byte\nfor</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (c&amp;byte2mask)&nbsp; // Are appropriate bits set?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbyte2mask=0x00;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn 0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing--; }</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn 0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((c&amp;0x80) == 0x00)&nbsp; continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 1 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse if ((c&amp;0xE0) == 0xC0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 2 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (c&amp;0x1E)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// Is UTF-8 byte in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing =1;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn 0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse if ((c&amp;0xF0) == 0xE0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 3 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{if (!(c&amp;0x0F))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// Is UTF-8 byte in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbyte2mask=0x20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// If not set mask</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto check next byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing = 2;}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-1 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse if ((c&amp;0xF8) == 0xF0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 4 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{if (!(c&amp;0x07))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// Is UTF-8 byte in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbyte2mask=0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// If not set mask</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto check next byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing = 3;}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse if ((c&amp;0xFC) == 0xF8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 5 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{if (!(c&amp;0x03))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// Is UTF-8 byte in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbyte2mask=0x38;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// If not set mask</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto check next byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing = 4;}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse if ((c&amp;0xFE) == 0xFC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// valid 6 byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{if (!(c&amp;0x01))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// Is UTF-8 byte in</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nproper range?</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbyte2mask=0x3C;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// If not set mask</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nto check next byte</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntrailing = 5;}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse&nbsp; return 0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn trailing == 0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2 Conversions</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe code examples in this section closely reflect the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nalgorithm in ISO 10646 and may not present the most efficient</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nsolution for converting to / from UTF-8 encoding. If</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nefficiency is an issue, implementers should use the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nappropriate bitwise operators.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nAdditional code examples and numerous mapping tables can be</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfound at the Unicode site, <A HREF=\"HTTP://www.unicode.org\">HTTP://www.unicode.org</A> or</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n<A HREF=\"FTP://unicode.org\">FTP://unicode.org</A>.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nNote that the conversion examples below assume that the local</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set supported in the operating system is something</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nother than UCS2/UTF-16. There are some operating systems that</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nalready support UCS2/UTF-16 (notably Plan 9 and Windows NT).</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nIn this case no conversion will be necessary from the local</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set to the UCS.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.1 Conversion from local character set to UTF-8</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nConversion from the local filesystem character set to UTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwill normally involve a two step process. First convert the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nlocal character set to the UCS; then convert the UCS to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-2 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe first step in the process can be performed by maintaining</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\na mapping table that includes the local character set code</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand the corresponding UCS code. For instance the ISO/IEC</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8859-8 [ISO-8859] code for the Hebrew letter \"VAV\" is 0xE4.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe corresponding 4 byte ISO/IEC 10646 code is 0x000005D5.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe next step is to convert the UCS character code to the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUTF-8 encoding. The following routine can be used to</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ndetermine and encode the correct number of bytes based on the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nUCS-4 character code:</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned int ucs4_to_utf8 (unsigned long *ucs4_buf, unsigned int</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_len, unsigned char *utf8_buf)</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconst unsigned long *ucs4_endbuf = ucs4_buf + ucs4_len;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned int utf8_len = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //\nreturn value for UTF8 size</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned char *t_utf8_buf = utf8_buf; // Temporary pointer</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n// to load UTF8 values</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwhile (ucs4_buf != ucs4_endbuf)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0x7F)&nbsp;&nbsp;&nbsp; // ASCII chars no conversion\nneeded</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++ = (unsigned char) *ucs4_buf;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0x07FF ) // In the 2 byte utf-8 range</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0xC0 + (*ucs4_buf/0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 + (*ucs4_buf%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len+=2;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0xFFFF ) /* In the 3 byte utf-8 range. The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nvalues 0x0000FFFE, 0x0000FFFF</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand 0x0000D800 - 0x0000DFFF do</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnot occur in UCS-4 */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0xE0 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(*ucs4_buf/0x1000));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x40)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 + (*ucs4_buf%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len+=3;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0x1FFFFF ) //In the 4 byte utf-8 range</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-3 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0xF0 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(*ucs4_buf/0x040000));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x10000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x40)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 + (*ucs4_buf%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len+=4;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0x03FFFFFF )//In the 5 byte utf-8 range</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0xF8 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(*ucs4_buf/0x01000000));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x040000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x1000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x40)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(*ucs4_buf%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len+=5;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( *ucs4_buf &lt;= 0x7FFFFFFF )//In the 6 byte utf-8 range</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(0xF8 +(*ucs4_buf/0x40000000));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x01000000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x040000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x1000)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n((*ucs4_buf/0x40)%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*t_utf8_buf++= (unsigned char) (0x80 +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(*ucs4_buf%0x40));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_len+=6;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_buf++;</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn (utf8_len);</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-4 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.2 Conversion from UTF-8 to local character set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nWhen moving from UTF-8 encoding to the local character set</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe reverse procedure is used. First the UTF-8 encoding is</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ntransformed into the UCS-4 character set. The UCS-4 is then</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconverted to the local character set from a mapping table</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(i.e. the opposite of the table used to form the UCS-4</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter code).</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nTo convert from UTF-8 to UCS-4 the free bits (those that do</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nnot define UTF-8 sequence size or signify continuation bytes)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nin a UTF-8 sequence are concatenated as a bit string. The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbits are then distributed into a four-byte sequence starting</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfrom the least significant bits. Those bits not assigned a</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nbit in the four-byte sequence are padded with ZERO bits. The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfollowing routine converts the UTF-8 encoding to UCS-4</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter codes:</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nint utf8_to_ucs4 (unsigned long *ucs4_buf, unsigned int utf8_len,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned char *utf8_buf)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nconst unsigned char *utf8_endbuf = utf8_buf + utf8_len;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nunsigned int ucs_len=0;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwhile (utf8_buf != utf8_endbuf)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((*utf8_buf &amp; 0x80) == 0x00)&nbsp; /*ASCII chars no conversion</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nneeded */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long) *utf8_buf;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((*utf8_buf &amp; 0xE0)== 0xC0) //In the 2 byte utf-8 range</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long) (((*utf8_buf - 0xC0) * 0x40)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ( *(utf8_buf+1) - 0x80));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf += 2;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ( (*utf8_buf &amp; 0xF0) == 0xE0 ) /*In the 3 byte utf-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nrange */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long) (((*utf8_buf - 0xE0) * 0x1000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+1) -&nbsp; 0x80) * 0x40)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ( *(utf8_buf+2) - 0x80));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf+=3;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-5 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((*utf8_buf &amp; 0xF8) == 0xF0) /* In the 4 byte utf-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nrange */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(((*utf8_buf - 0xF0) * 0x040000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+1) -&nbsp; 0x80) * 0x1000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+2) -&nbsp; 0x80) * 0x40)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ( *(utf8_buf+3) - 0x80));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf+=4;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((*utf8_buf &amp; 0xFC) == 0xF8) /* In the 5 byte utf-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nrange */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(((*utf8_buf - 0xF8) * 0x01000000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ((*(utf8_buf+1) - 0x80) * 0x040000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+2) -&nbsp; 0x80) * 0x1000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+3) -&nbsp; 0x80) * 0x40)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ( *(utf8_buf+4) - 0x80));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf+=5;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nelse</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif ((*utf8_buf &amp; 0xFE) == 0xFC) /* In the 6 byte utf-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nrange */</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n*ucs4_buf++ = (unsigned long)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(((*utf8_buf - 0xFC) * 0x40000000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ((*(utf8_buf+1) - 0x80) * 0x010000000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ((*(utf8_buf+2) - 0x80) * 0x040000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+3) -&nbsp; 0x80) * 0x1000)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ (( *(utf8_buf+4) -&nbsp; 0x80) * 0x40)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n+ ( *(utf8_buf+5) - 0x80));</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_buf+=6;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs_len++;</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn (ucs_len);</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-6 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.3&nbsp; ISO/IEC 8859-8 Example</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis example demonstrates mapping ISO/IEC 8859-8 character</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nset to UTF-8 and back to ISO/IEC 8859-8. As noted earlier,</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nthe Hebrew letter \"VAV\" is convertd from the ISO/IEC 8859-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter code 0xE4 to the corresponding 4 byte ISO/IEC 10646</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncode of 0x000005D5 by a simple lookup of a conversion/mapping</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfile.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe UCS-4 character code is transformed into UTF-8 using the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_to_utf8 routine described earlier by:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1. Because the UCS-4 character is between 0x80 and 0x07FF it</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwill map to a 2 byte UTF-8 sequence.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2. The first byte is defined by (0xC0 + (0x000005D5 / 0x40))</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n= 0xD7.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3. The second byte is defined by (0x80 + (0x000005D5 %</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0x40)) = 0x95.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe UTF-8 encoding is transferred back to UCS-4 by using the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_to_ucs4 routine described earlier by:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1. Because the first byte of the sequence, when the '&amp;'</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\noperator with a value of 0xE0 is applied, will produce</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0xC0 (0xD7 &amp; 0xE0 = 0xC0) the UTF-8 is a 2 byte sequence.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.&nbsp; The four byte UCS-4 character code is produced by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(((0xD7 - 0xC0) * 0x40) + (0x95 -0x80)) = 0x000005D5.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFinally, the UCS-4 character code is converted to ISO/IEC</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n8859-8 character code (using the mapping table which matches</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nISO/IEC 8859-8 to UCS-4 ) to produce the original 0xE4 code</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nfor the Hebrew letter \"VAV\".</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.2.4 Vendor Codepage Example</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThis example demonstrates the mapping of a codepage to UTF-8</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nand back to a vendor codepage. Mapping between vendor</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncodepages can be done in a very similar manner as described</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nabove. For instance both the PC and Mac codepages reflect the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter set from the Thai standard TIS 620-2533. The</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\ncharacter code on both platforms for the Thai letter \"SO SO\"</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nis 0xAB. This character can then be mapped into the UCS-4 by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nway of a conversion/mapping file to produce the UCS-4 code of</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0x0E0B.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe UCS-4 character code is transformed into UTF-8 using the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nucs4_to_utf8 routine described earlier by:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1. Because the UCS-4 character is between 0x0800 and 0xFFFF</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nit will map to a 3 byte UTF-8 sequence.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2. The first byte is defined by (0xE0 + (0x00000E0B /</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0x1000) =&nbsp; 0xE0.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n3. The second byte is defined by (0x80 + ((0x00000E0B /</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0x40) % 0x40))) = 0xB8.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-7 ]</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>\f</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nINTERNET DRAFT&nbsp;&nbsp;&nbsp; FTP Internationalization&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n01 June, 1998</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n4. The third byte is defined by (0x80 + (0x00000E0B % 0x40))</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n= 0x8B.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nThe UTF-8 encoding is transferred back to UCS-4 by using the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nutf8_to_ucs4 routine described earlier by:</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n1. Because the first byte of the sequence, when the '&amp;'</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\noperator with a value of 0xF0 is applied, will produce</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0xE0 (0xE0 &amp; 0xF0 = 0xE0) the UTF-8 is a 3 byte sequence.</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n2.&nbsp; The four byte UCS-4 character code is produced by</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(((0xE0 - 0xE0) * 0x1000) + ((0xB8 - 0x80) * 0x40) +</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n(0x8B -0x80) = 0x0000E0B.</FONT></FONT><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nFinally, the UCS-4 character code is converted to either the</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nPC or MAC codepage character code (using the mapping table</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nwhich matches codepage to UCS-4 ) to produce the original</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n0xAB code for the Thai letter \"SO SO\".</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nB.3 Pseudo Code for a high-quality translating server</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif utf8_valid(fn)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nattempt to convert fn to the local charset, producing localfn</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (conversion fails temporarily) return error</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (conversion succeeds)</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n{</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nattempt to open localfn</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (open fails temporarily) return error</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (open succeeds) return success</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n}</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nattempt to open fn</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (open fails temporarily) return error</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nif (open succeeds) return success</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nreturn permanent error</FONT></FONT>\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;\n<BR><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>&nbsp;<FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1></FONT></FONT>\n\n<P><FONT FACE=\"Courier New,Courier\"><FONT SIZE=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\nExpires 01 December 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n[Page B-8 ]</FONT></FONT>\n<BR>\f</HTML>\n\n\n--=_AAAYDgAABLM1bB/O--\n\n"
  },
  {
    "path": "tests/mboxes/y2k.mbox",
    "content": "From owner-hypermail Fri Sep 25 20:23 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06103\n\tfor hypermail-outgoing; Fri, 25 Sep 2000 20:22:37 -0500 (CDT)\nReceived: from runningman.rs.itd.umich.edu (runningman.rs.itd.umich.edu [141.211.144.15])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06097\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 2000 20:21:33 -0500 (CDT)\nReceived: from umich.edu (dialin224193.isdn.umich.edu [198.111.224.193])\n\tby runningman.rs.itd.umich.edu (8.8.5/2.3) with ESMTP id VAA19384; Fri, 25 Sep 2000 21:19:37 -0400 (EDT)\nMessage-ID: <360C40A1.A8FAF28C@umich.edu>\nDate: Fri, 25 Sep 2000 21:17:21 -0400\nFrom: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nOrganization: University of Michigan\nX-Mailer: Mozilla 4.5b2 [en] (WinNT; I)\nX-Accept-Language: en\nMIME-Version: 1.0\nTo: hypermail@landfield.com\nCC: Charles Hall <chall@totalsports.net>,\n        \"Gordon H. Buchan\" <gbuchan@matrox.com>\nSubject: Re: adding new messages to prior hypermail archive\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nX-Lines: 54\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 2276\nStatus: OR\n\n\nCharles and Gordon offered helpful suggestions.  However, I think there\nis a problem.\n\nHere is what I'm trying to do: I have an existing Hypermail archive\n(from 1.02) with 467 messages already in it.  I do *NOT* have the\noriginal mailbox file for it.  \n\nI now have 65 new messages in a mailbox that I want to add.\n\nI've tried a standard run, as Gordon suggested (those are Gordon's\npaths):\n\n/home/gordon/bin/hypermail \\\n-b \"http://cusidnet.anadas.com/\" \\\n-a \"http://cusidnet.anadas.com/\" \\\n-m \"/home/gordon/mail/cusid\" \\\n-l \"CUSIDnet Web Mirror\" \\\n-d \"/home/gordon/www/cusidnet/fall2000/\" \\\n-c \"/home/gordon/bin/.cusidnethyprc\" > /dev/null\n\nThat had the following result: The new index files overwrote the\nexisting index files, and showed the information for the 65 *new*\nmessages but no listings for the 467 original messages.  However, the\narchive in fact contained the 467 html files for the original messages,\nbut did *not* contain files for any of the new messages.  (Click on New\n#1 in the index, and it goes to file 0000.html which is Old #1.)\n\nThen I tried what Charles suggested: I inserted 467 \"dummy\" messages in\nmy mailbox file so that Hypermail could count down those and only add\nthe \"new\" messages.  That *almost* worked.  The message files were\ncorrectly created: an addition 65 nnnn.html files were added to the\narchive.  However, the original 467 message entries in the index were\noverwritten with the header information from the 467 dummy messages.  So\nmy index files are now useless....\n\nObviously, the solution could be to chop the 65 new messages and deliver\nthem one at a time to Hypermail for a single message append.  (Can\nsomeone suggest an easy way to script that?)  However, shouldn't\nHypermail be able to do this?  Perhaps have a switch for \"append to\nexisting archive\" when we have a new mbox file but have lost the mbox\nfor the original archive?  (Likewise, a way to merge hypermail archives\nwithout having the original mboxes?)\n\nthanks,\njmm\n\n\n-- \nProf. Jeffrey MacKie-Mason       http://www-personal.umich.edu/~jmm/\nDept. of Economics                                     jmm@umich.edu\n   and School of Information               +1 (734) 647-4856 (voice)\nUniversity of Michigan                     +1 (734) 764-2475   (fax)\nAnn Arbor, MI 48109\n\nFrom owner-hypermail Fri Sep 25 20:59 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id UAA06348\n\tfor hypermail-outgoing; Fri, 25 Sep 2000 20:59:15 -0500 (CDT)\nReceived: from ns.totalsports.net (ns.totalsports.net [207.175.67.50])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id UAA06340\n\tfor <hypermail@landfield.com>; Fri, 25 Sep 2000 20:58:30 -0500 (CDT)\nReceived: from klaatu.totalsports.net\n          (chall3.totalsports.net [207.175.67.217]) by ns.totalsports.net\n          (Post.Office MTA v3.5 release 215 ID# 0-55440U300L200S0V35)\n          with SMTP id net; Fri, 25 Sep 2000 21:53:37 -0400\nMessage-ID: <360C4737.6946@totalsports.net>\nDate: Fri, 25 Sep 2000 21:45:27 -0400\nFrom: chall@totalsports.net (Charles Hall)\nOrganization: Total Sports\nX-Mailer: Mozilla 3.01Gold (Win95; I)\nMIME-Version: 1.0\nTo: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>\nCC: hypermail@landfield.com\nSubject: Re: adding new messages to prior hypermail archive\nReferences: <360C40A1.A8FAF28C@umich.edu>\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: chall@totalsports.net (Charles Hall)\nX-Lines: 25\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 1005\nStatus: OR\n\nJeffrey K. MacKie-Mason wrote:\n> \n> Then I tried what Charles suggested...  However, the original 467 message\n> entries in the index were overwritten with the 467 dummy messages.  So\n> my index files are now useless....\n\nOuch! I hope you can recover from this. I didn't realize. Sorry.\n\n> Perhaps have a switch for \"append to existing archive\" when we have a new\n> mbox file\n\nYes, Yes! I need this functionality too. I prefer not to add messages\none at a time through the day as Hypermail would go re-indexing over and\nover again, so I let my mail collect till the end of the month, and run\nhypermail once nightly. Since there's no append function, Hypermail has\nto churn through all that month's mail each night. If I could append, I\ncould erase the mailbox each night and only process that day's mail.\n\nMHonArc has this feature, but I believe it keeps a small database to\nremember what's been done before. Perhaps such info could be hidden in\nthe indexes as HTML comments??\n\n--\nCharles Hall\nRaleigh, NC\n\nFrom owner-hypermail Sat Sep 26 06:16 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id GAA20916\n\tfor hypermail-outgoing; Sat, 26 Sep 2000 06:16:19 -0500 (CDT)\nReceived: from relay7.UU.NET (relay7.UU.NET [192.48.96.17])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id GAA20890\n\tfor <hypermail@landfield.com>; Sat, 26 Sep 2000 06:14:42 -0500 (CDT)\nReceived: from relay7.UU.NET by relay7.UU.NET with ESMTP \n\t(peer crosschecked as: root@localhost)\n\tid QQfijh19139; Fri, 25 Sep 2000 10:17:34 -0400 (EDT)\nReceived: from morrison.matrox.com by relay7.UU.NET with ESMTP \n\t(peer crosschecked as: [204.50.136.19])\n\tid QQfijh19076; Fri, 25 Sep 2000 10:17:28 -0400 (EDT)\nReceived: (from mtxmail@localhost)\n\tby morrison.matrox.com (8.8.8/8.8.8) id KAA23068;\n\tFri, 25 Sep 2000 10:14:08 -0400 (EDT)\nReceived: from venus.matrox.com(138.11.0.5) by morrison-250 via smap (V2.0)\n\tid xma022977; Fri, 25 Sep 98 10:13:18 -0400\nReceived: from focus.matrox.com (focus.matrox.com [192.168.16.2])\n\tby venus.matrox.com (8.8.7/8.8.7) with ESMTP id KAA09310;\n\tFri, 25 Sep 2000 10:13:17 -0400 (EDT)\nReceived: from gbuchan.matrox.com ([192.168.17.51]) by focus.matrox.com (8.7.5/8.7.3) with SMTP id KAA15383; Fri, 25 Sep 2000 10:13:14 -0400 (EDT)\nMessage-Id: <200009251413.KAA15383@focus.matrox.com>\nX-Sender: gbuchan@focus.matrox.com\nX-Mailer: QUALCOMM Windows Eudora Pro Version 4.0\nDate: Fri, 25 Sep 2000 10:13:10 -0400\nTo: \"Jeffrey K. MacKie-Mason\" <jmm@umich.edu>, hypermail@landfield.com\nFrom: \"Gordon H. Buchan\" <gbuchan@matrox.com>\nSubject: Re: adding new messages to prior hypermail archive\nIn-Reply-To: <360B2905.E41100C9@umich.edu>\nMime-Version: 1.0\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Gordon H. Buchan\" <gbuchan@matrox.com>\nX-Lines: 40\nContent-Type: text/plain; charset=\"us-ascii\"\nContent-Length: 1590\nStatus: OR\n\nAt 01:24 AM 9/25/98 -0400, Jeffrey K. MacKie-Mason wrote:\n>\n>I archived some 460 messages from a mailbox with Hypermail 1.02 about 3\n>years ago.  Now I want to use hypermail 2.03b to process a new mailbox\n>and add the messages to the prior archive.  I've tested 2.03b on the new\n>mailbox, and it works fine when I give it an empty directory in which to\n>create a new hypermail archive.  However, when I point it at the\n>directory with the prior 460-message archive, it changes the date stamp\n>on the index files to today, but it doesn't append the 65 new messages\n>to the archive.\n>\n>As far as I can see, the default behavior is supposed to be to append\n>messages to an existing archive.  I'm not using the -u or -x flags. \n>Suggestions?\n\nWith a slight modification (removal of the -x switch, since this is to\nappend, not replace), here is one of my batch files. Change paths and\nparameters to match your environment.\n\n/home/gordon/bin/hypermail \\\n-b \"http://cusidnet.anadas.com/\" \\\n-a \"http://cusidnet.anadas.com/\" \\\n-m \"/home/gordon/mail/cusid\" \\\n-l \"CUSIDnet Web Mirror\" \\\n-d \"/home/gordon/www/cusidnet/fall2000/\" \\\n-c \"/home/gordon/bin/.cusidnethyprc\" > /dev/null\n\nNote 1: /home/gordon/mail/cusid is a standard UNIX mail folder.\nNote 2: /home/gordon/www/cusidnet/fall2000 contains an existing hypermail\narchive.\n\n----\nGordon H. Buchan\nTechnical Writer\nMatrox Networks / Matrox Electronic Systems\nemail:  gbuchan@matrox.com          1055 St-Regis Blvd.\nvoice:  +1 (514) 685-7230 x2523     Dorval, Quebec\nfax:    +1 (514) 822-6272           Canada H9P 2T4\nhttp://www.matrox.com/networks\n\n\nFrom nobody Thu Oct  1 19:10 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id TAA11412\n\tfor kent@landfield.com; Thu, 1 Oct 2000 19:10:49 -0500 (CDT)\nDate: Thu, 1 Oct 2000 19:10:49 -0500 (CDT)\nFrom: Nobody <nobody>\nMessage-Id: <200010020010.TAA11412@landfield.com>\nReply-to: minerva@phix.com (Darci Chapman)\nSubject: HYPERMAIL Development Center Suggestion\nContent-Type: text\nContent-Length: 492\nStatus: OR\n\nminerva@phix.com (Darci Chapman) sent the following\nHypermail Resource location information:\n\n------------------------------------------------------------\nLocation:    http://www.wildheart.org/archives/networker/\nDescription: A user-based list for Legato's Networker (back up) software.\n\n(I can't believe I'm archiving ANOTHER list ;-)\n\n------------------------------------------------------------\nServer protocol: HTTP/1.0\nRemote host: barrier241.nike.com\nRemote IP address: 198.107.239.205\n\nFrom kent Thu Oct  1 22:01 CDT 2000\nReceived: (from kent@localhost)\n\tby landfield.com (8.9.0/8.9.0) id WAA13318;\n\tThu, 1 Oct 2000 22:01:32 -0500 (CDT)\nFrom: Kent Landfield <kent>\nMessage-Id: <200010020301.WAA13318@landfield.com>\nSubject: Re: Hypermail pages\nTo: vanes002@umn.edu (John Van Essen)\nDate: Thu, 1 Oct 2000 22:01:31 -0500 (CDT)\nCc: kent (Kent Landfield)\nIn-Reply-To: <81725.vanes002@umn.edu> from \"John Van Essen\" at Oct 1, 98 07:51:07 pm\nX-Mailer: ELM [version 2.4 PL25]\nMIME-Version: 1.0\nContent-Transfer-Encoding: 7bit\nContent-Type: text/plain; charset=US-ASCII\nContent-Length: 565\nStatus: OR\n\n# \n# How come the landfield.com home page doesn't mention or link to \n# the hypermail home page (/hypermail)?\n# \n# :)\n# \n#         John Van Essen <vanes002@umn.edu>\n\nWell now that you mention it... I'm going to have to fix that. ;) Thanks.\n\n-- \nKent Landfield                        Phone: 1-817-545-2502             \nEmail: kent@landfield.com             http://www.landfield.com/\nEmail: kent@nfr.net                   http://www.nfr.net/\nPlease send comp.sources.misc related mail to kent@landfield.com\nSearch the Usenet FAQ Archive at http://www.faqs.org/faqs/\n\n\nFrom tva@pobox.com Sat Oct  3 22:54 CDT 2000\nReceived: from pop1.cyberhighway.net (qmailr@pop1.cyberhighway.net [209.161.0.35])\n\tby landfield.com (8.9.0/8.9.0) with SMTP id WAA01614\n\tfor <archive@landfield.com>; Sat, 3 Oct 2000 22:54:09 -0500 (CDT)\nReceived: (qmail 22325 invoked from network); 3 Oct 2000 21:52:11 -0600\nReceived: from ts19-31.boi.cyberhighway.net (HELO pobox.com) (209.161.10.170)\n  by pop1.cyberhighway.net with SMTP; 3 Oct 2000 21:52:11 -0600\nMessage-ID: <3616F164.20EE5A03@pobox.com>\nDate: Sat, 03 Oct 2000 21:54:12 -0600\nFrom: Tom von Alten <tva@pobox.com>\nX-Mailer: Mozilla 4.04 [en] (Win95; U)\nMIME-Version: 1.0\nTo: archive@landfield.com\nSubject: Another Mail Archive Mgmt Tool\nX-Corel-MessageType: EMail\nContent-Transfer-Encoding: 7bit\nContent-Type: text/plain; charset=us-ascii\nContent-Length: 593\nStatus: OR\n\nHey:\n\nI'm back, I couldn't wait until Monday to see your code. :-)  And I found\nthe \"others.html\" page.  Pretty classy.\n\nOne that probably belongs on the list is something called \"newsgate,\" at\nftp://ftp.isc.org/isc/inn/contrib/ (mentioned in the majordomo FAQ,\nhttp://www.cis.ohio-state.edu/~barr/majordomo-faq.html) for piping email\ninto News; the IT-run half of our division is actually working to install\nthat to replace what we're doing with hypermail.\n\nIt suits them because they're using majordomo; we've been doing our list\nmaintenance more manually.\n\n(The race is on.)\n\nTom von Alten\n\nFrom craig@cni.org Tue Oct  6 18:26 CDT 2000\nReceived: from a.cni.org (a.cni.org [192.100.21.1])\n\tby landfield.com (8.9.0/8.9.0) with SMTP id SAA18925;\n\tTue, 6 Oct 2000 18:26:01 -0500 (CDT)\nReceived: by a.cni.org id <AA05549@a.cni.org>; Tue, 6 Oct 2000 19:20:00 -0400\nFrom: Craig A Summerhill <craig@cni.org>\nMessage-Id: <9810062320.AA05549@a.cni.org>\nSubject: Re: another bug\nTo: hypermail@landfield.com\nDate: Tue, 6 Oct 2000 19:20:00 -0400 (EDT)\nCc: kent@landfield.com\nIn-Reply-To: <200010061703.MAA13834@landfield.com> from \"Kent Landfield\" at Oct 6, 98 12:03:19 pm\nX-Mailer: ELM [version 2.4 PL23]\nContent-Type: text\nContent-Length: 2299\nStatus: OR\n\nKent Landfield <kent@landfield.com> wrote:\n> \n> # This problem has been around since version 1.02, but I forgot about it \n> # because it doesn't come up too often...\n> # \n> # If you run Hypermail against an existing mailbox...\n> # \n> # hypermail -c <path/config> -m <path/mbox> -l \"whatever\" -d <path/target_dir>\n> # \n> # and the mbox file that you are processing only has one message in it...\n> # \n> # hypermail goes out and creates the HTMLed message (0000.html), but \n> # before the date, author, subject, and thread indexes are created it \n> # dumps core with this error:\n> # \n> #    Floating exception (core dumped)\n> \n> I don't get this when I tried it on the latest version. It may be that\n> the problem isn't the single message in the mailbox but the message itself.\n> It may be triggering a memory corruption bug. If you have a copy of the\n> offending message you can send me I'll verify if it is a problem still.\n\n\nKent,\n\nHmm.  That's odd.  It happens consistently on my system; everytime there\nis a mailbox with only one message in it.  It must be some combination\nof the defaults that I set when I compiled the code (I changed some of \nthe suggested settings), and the settings in the .hmrc file I am calling.\n\nI'll send you my compile time settings and .hmrc file later, and see if \nyou can find something in there that is causing it to happen.  (I have \nbeen up and working on a system problem for thirty-some hours, I need \nto go home, shower, and get in bed -- so it may be tomorrow).\n\nIt does dump core on me to, BTW.  Is there a core analysis tool I \ncould used that would give you some helpful information?\n\n\nP.S.  One other thought occured to me.  I was wondering if it might be \nrelated to the parsing problem I wrote about earlier (which you have \nfixed in the next release -- thank you).  Perhaps it is expecting a \ntrailing line with white space on it, or something?  The trouble with \nthis idea is that the single message problem was also present in \nversion 1.02, and came along to version 2.x.  However, the parsing \nproblem wasn't present in version 1.02...\n-- \n\n   Craig A. Summerhill, Systems Coordinator and Program Officer\n   Coalition for Networked Information\n   21 Dupont Circle, N.W., Washington, D.C.   20036\n   Internet: craig@cni.org   AT&Tnet (202) 296-5098\n\n\nFrom owner-hypermail Wed Oct  7 01:44 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id BAA00188\n\tfor hypermail-outgoing; Wed, 7 Oct 2000 01:44:22 -0500 (CDT)\nReceived: from atlantis.csc.umd.edu (IDENT:root@atlantis.csc.umd.edu [129.2.8.129] (may be forged))\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id BAA00057\n\tfor <hypermail@landfield.com>; Wed, 7 Oct 2000 01:43:31 -0500 (CDT)\nReceived: from atlantis.csc.umd.edu ((IDENT sendmail)@localhost [127.0.0.1])\n\tby atlantis.csc.umd.edu (8.9.0.Beta6/8.9.0.Beta6) with SMTP id CAA09509\n\tfor <hypermail@landfield.com>; Wed, 7 Oct 2000 02:41:30 -0400 (EDT)\nReceived: from localhost by atlantis.csc.umd.edu (8.9.0.Beta6/8.9.0.Beta6) with SMTP id CAA09504\n\tfor <hypermail@landfield.com>; Wed, 7 Oct 2000 02:41:28 -0400 (EDT)\nX-Authentication-Warning: atlantis.csc.umd.edu: rsw owned process doing -bs\nDate: Wed, 7 Oct 2000 02:41:24 -0400 (EDT)\nFrom: \"Randall S. Winchester\" <rsw@Glue.umd.edu>\nTo: hypermail@landfield.com\nSubject: I would like to have avaliable a couple Hypermail variables.\nMessage-ID: <Pine.GSO.4.02.9810070058440.8526-100000@atlantis.csc.umd.edu>\nMIME-Version: 1.0\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Randall S. Winchester\" <rsw@Glue.umd.edu>\nContent-Type: TEXT/PLAIN; charset=US-ASCII\nContent-Length: 2671\nStatus: OR\n\n\nI am considering using Hypermail for a large number of automatically\ngenerated lists. To ease installation woes, it would be helpful to have\nsome more generic capabilities for many of hypermails options.\n\nI would like something like:\n\nHM_LISTNAME listname\n\nhm_listname = [ listname | NONE ]\n\n-L <listname>\n     This options specifies the name of the list being archived. This is a \n     convienent variable to have defined as it can be used as a cookie or\n     environemntal variable in documentation references.\n\n-H <hostname>\n     Set this to the hostname you want  added  to  a  mail  \n     address  appearing  in  the  RFC822  field which lack a\n     hostname. It is usefull on the command line when servicing\n     virtual hosts. \n\n%L - name of current list\n\n%H - name of current host. Convienient for archiving with virtual hosting.\n\nFor example for a default .hmrc file:\n\nhm_label = Hypermail discussion list for %L@%H\nhm_archives = http://%H\nhm_about = http://%H/%L\nhm_dir = /var/hypermail/%H/%L/%y/%M\nhm_ihtmlheaderfile = /var/hypermail/%H/%L/owner/idxheader.hyp\nhm_ihtmlfooterfile = /var/hypermail/%H/%L/owner/idxfooter.hyp\nhm_mhtmlheaderfile = /var/hypermail/%H/%L/owner/msgheader.hyp\nhm_mhtmlfooterfile = /var/hypermail/%H/%L/owner/msgfooter.hyp\nhm_hmail = %L@%H\n\nAnd for those default header and footer .hyp files:\n\nWelcome to the %L archive at %H.\n\nTo subscibe to this list send email to <A HREF=\"mailto:%L-request@%H\"> with\nthe word \"subscribe\" on its on line in the message body.\n\nOnce subscribed, you can send mail to the list at <A HREF=\"mailto:%L@%H\">.\n\nIf you have a content issue with something on the list, please mail to \n<A HREF=\"mailto:%L-owner@%H\">\n\nDoes this seem reasonable enough? Mostly a more frequently used variable\nsubstitution routine.\n\nA more difficult endevor which could also be helpful would be to leverage\noff of the case where %L is used in the hm_dir variable along with other\ndate formats (%y, %M, etc) being used. In this case, it would be nice to\nhave Hypermail generate the \"homepage(s)\" for the directory traversals on\nthe fly. The page would need to be created initially (-d option) and then\nupdated anytime a new directory was automaticaly created.\n\nIf this were done, then two addition .hyp files would be good:\nhm_lhtmlheaderfile = /var/hypermail/%H/%L/owner/lstheader.hyp\nhm_lhtmlfooterfile = /var/hypermail/%H/%L/owner/lstfooter.hyp\n\nProbably put a link to my search engine in \"hm_lhtmlfooterfile\"....\n\n\nNot sure how much of this has been discussed before, or how active\ndevelopment is, having recently joined your list. Seems like a nice tool\nthough... I have alot of users who would appreciate Hypermail.\n\nRandall\n\n\n\nFrom ashley@pcraft.com Wed Oct  7 10:12 CDT 2000\nReceived: from mail.pcraft.com (mail.pcraft.com [206.168.220.51])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id KAA18195;\n\tWed, 7 Oct 2000 10:12:11 -0500 (CDT)\nReceived: from mail.pcraft.com (mail.pcraft.com [206.168.220.51])\n\tby mail.pcraft.com (8.9.1/8.9.1-NOSPAM) with SMTP id JAA02986;\n\tWed, 7 Oct 2000 09:24:26 -0600\nDate: Wed, 7 Oct 2000 09:24:26 -0600 (MDT)\nFrom: \"Ashley M. Kirchner\" <ashley@pcraft.com>\nTo: Kent Landfield <kent@landfield.com>\ncc: hypermail@landfield.com\nSubject: Re: change extension\nIn-Reply-To: <200010071414.JAA17429@landfield.com>\nMessage-ID: <Pine.LNX.3.96.981007092323.2974A-100000@mail.pcraft.com>\nMIME-Version: 1.0\nContent-Type: TEXT/PLAIN; charset=US-ASCII\nContent-Length: 958\nStatus: OR\n\nOn Wed, 7 Oct 2000, Kent Landfield wrote:\n\n> # I just created a mail archive in which I'd like all generated pages to be\n> # .shtml to better allow them to dynamically use current header and footer and\n> \n> - Ability to save files with suffix \".htm\" or \".html\"\n\n\n\tWhy not make it an rc option, with the default set to .html?  If\nsomeone wants others, they change the variable to .htm, .shtml, .phtml, or\nwhatever they want.\n\n\tAMK4\n\n  |\n  |  Row, row, row your bits, gently down the pipe...\n  |____________________________________________________________________\n  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n  Ashley M. Kirchner <ashley@pcraft.com>          .   303.442.6410 x130\n  SysAdmin / Websmith                           .     800.441.3873 x130\n  Photo Craft Laboratories, Inc.             .        3550 Arapahoe Ave\n  http://www.pcraft.com                  .            Boulder, CO 80303\n  .................. .  .  .     .\n\n\nFrom owner-hypermail Wed Oct  7 10:33 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id KAA18439\n\tfor hypermail-outgoing; Wed, 7 Oct 2000 10:33:06 -0500 (CDT)\nReceived: (from kent@localhost)\n\tby landfield.com (8.9.0/8.9.0) id KAA18421\n\tfor hypermail; Wed, 7 Oct 2000 10:32:07 -0500 (CDT)\nFrom: Kent Landfield <kent>\nMessage-Id: <200010071532.KAA18421@landfield.com>\nSubject: Re: I would like to have avaliable a couple Hypermail variables.\nTo: hypermail\nDate: Wed, 7 Oct 2000 10:32:06 -0500 (CDT)\nIn-Reply-To: <Pine.GSO.4.02.9810070058440.8526-100000@atlantis.csc.umd.edu> from \"Randall S. Winchester\" at Oct 7, 98 02:41:24 am\nX-Mailer: ELM [version 2.4 PL25]\nMIME-Version: 1.0\nContent-Transfer-Encoding: 7bit\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: Kent Landfield <kent>\nContent-Type: text/plain; charset=US-ASCII\nContent-Length: 7259\nStatus: OR\n\n# I am considering using Hypermail for a large number of automatically\n# generated lists. To ease installation woes, it would be helpful to have\n# some more generic capabilities for many of hypermails options.\n# \n# I would like something like:\n# \n# HM_LISTNAME listname\n# \n# hm_listname = [ listname | NONE ]\n# \n# -L <listname>\n#      This options specifies the name of the list being archived. This is a \n#      convienent variable to have defined as it can be used as a cookie or\n#      environemntal variable in documentation references.\n# \n# -H <hostname>\n#      Set this to the hostname you want  added  to  a  mail  \n#      address  appearing  in  the  RFC822  field which lack a\n#      hostname. It is usefull on the command line when servicing\n#      virtual hosts. \n\nThese are easy enough and needed for other reasons as well. The first (-L)\nwill need to be added completely while the (-H) is already there as DOMAINADDR,\nhm_domainaddr. This was done since usually it is not a hostname that you want\nthere but instead is a domain name. It can be used either way.\n\n# %L - name of current list\n# %H - name of current host. Convienient for archiving with virtual hosting.\n\nThese would be very useful in the list's header and footer .hyp files.\n\nI can see how this would be useful for virtual hosts. I could use it here\nas well ;)  I do have some questions about the .hmrc file usage though.\n\n# For example for a default .hmrc file:\n# \n# hm_label = Hypermail discussion list for %L@%H\n# hm_archives = http://%H\n# hm_about = http://%H/%L\n# hm_dir = /var/hypermail/%H/%L/%y/%M\n# hm_ihtmlheaderfile = /var/hypermail/%H/%L/owner/idxheader.hyp\n# hm_ihtmlfooterfile = /var/hypermail/%H/%L/owner/idxfooter.hyp\n# hm_mhtmlheaderfile = /var/hypermail/%H/%L/owner/msgheader.hyp\n# hm_mhtmlfooterfile = /var/hypermail/%H/%L/owner/msgfooter.hyp\n# hm_hmail = %L@%H\n\nWhat is done if there are no values for %H and %L when first encountered ?\nIt is possible to '#define LISTNAME \"NONE\"' in options.h, not set the\nHM_LISTNAME environment variable and then find no hm_listname or hm_hostname\nin the .hmrc file for the list. Then the above config file input would be\n \nhm_label = Hypermail discussion list for @\nhm_archives = http://\nhm_about = http:///\nhm_dir = /var/hypermail///%y/%M\nhm_ihtmlheaderfile = /var/hypermail///owner/idxheader.hyp\nhm_ihtmlfooterfile = /var/hypermail///owner/idxfooter.hyp\nhm_mhtmlheaderfile = /var/hypermail///owner/msgheader.hyp\nhm_mhtmlfooterfile = /var/hypermail///owner/msgfooter.hyp\nhm_hmail = @\n\nShould it bail if hypermail is called without a value in a substitution \ncookie ? Today it doesn't.\n\n# Does this seem reasonable enough? Mostly a more frequently used variable\n# substitution routine.\n\nYes it is quite reasonable.\n\n# A more difficult endevor which could also be helpful would be to leverage\n# off of the case where %L is used in the hm_dir variable along with other\n# date formats (%y, %M, etc) being used. In this case, it would be nice to\n# have Hypermail generate the \"homepage(s)\" for the directory traversals on\n# the fly. The page would need to be created initially (-d option) and then\n# updated anytime a new directory was automaticaly created.\n# \n# If this were done, then two addition .hyp files would be good:\n# hm_lhtmlheaderfile = /var/hypermail/%H/%L/owner/lstheader.hyp\n# hm_lhtmlfooterfile = /var/hypermail/%H/%L/owner/lstfooter.hyp\n# \n# Probably put a link to my search engine in \"hm_lhtmlfooterfile\"....\n\nSo... In essence be able to create a top level index for all the \nyear/month directories ? For example, in the hypermail list archives\nhere I have two types of directories at the Top level, \n\n\t1. hypermail generated archives separated by month/year,\n\n        2. a mailbox directory that keeps a copy of the inbond messages \n           in unix mailboxes separated by month\n\nHere is what I mean.\n\nhypermail/mail-archive:\ndrwxr-xr-x   9 lists    daemon       512 Oct  6 11:48 2000\nlrwxrwxrwx   1 kent     kent          13 Apr 23 23:45 index.html \ndrwxr-xr-x   2 lists    daemon       512 Oct  2 20:27 mailbox\n\nhypermail/mail-archive/2000:\ndrwxr-xr-x   2 lists    daemon      1536 Oct  6 11:31 Apr\ndrwxr-xr-x   2 lists    daemon      1024 Oct  6 11:33 Aug\ndrwxr-xr-x   2 lists    daemon       512 Oct  6 11:33 Jul\ndrwxr-xr-x   2 lists    daemon      1536 Oct  6 11:33 Jun\ndrwxr-xr-x   2 lists    daemon      1024 Oct  6 11:32 May\ndrwxrwxr-x   2 lists    daemon       512 Oct  7 10:12 Oct\ndrwxr-xr-x   2 lists    daemon      1536 Oct  6 11:34 Sep\n\nhypermail/mail-archive/2000/Apr:\n-rw-r--r--   1 lists    daemon      4678 Oct  6 11:31 0000.html\n...\n-rw-r--r--   1 lists    daemon      8813 Oct  6 11:31 author.html\n-rw-r--r--   1 lists    daemon      7469 Oct  6 11:31 date.html\n-rw-r--r--   1 lists    daemon      7753 Oct  6 11:31 index.html\n\n/ftp/hypermail/mail-archive/2000/May:\n/ftp/hypermail/mail-archive/2000/Jun:\n/ftp/hypermail/mail-archive/2000/Jul:\n/ftp/hypermail/mail-archive/2000/Aug:\n/ftp/hypermail/mail-archive/2000/Sep:\n/ftp/hypermail/mail-archive/2000/Oct:\n\n/ftp/hypermail/mail-archive/mailbox:\n-rw-r--r--   1 lists    daemon    159819 May 25 23:09 hypermail.9804\n...\n-rw-r--r--   1 lists    daemon     33048 Oct  7 10:12 hypermail.9810\n\nSo in this case I would need to create a Top level index in the \nhypermail/mail-archive directory that links in the entire archive.\nI would then need to have a year index file in hypermail/mail-archive/2000\nthat linked in the separate months. The individual months are already \nhandled. ;)  Then when I incorporate the ability for hypermail to\nsave a copy of the inbound message in mailbox format prior to generating\na html page for it, I'll need to have an index generated for that.\nIs this the type of thing that we are talking about ?\n\nDon't get me wrong... I'm trying to understand what we looking at\nso that I can see how to make it generic enough to implement and administer.\n\n# Not sure how much of this has been discussed before, or how active\n# development is, having recently joined your list. \n\nThe indexing has not been discussed as to how to do it right...\nAs of this morning, the TODO list has the following items on it about \nindexing.:\n\n-----------\n- Make it optional as to what, if any, indexes are generated.\n\n- Make the formating of index pages use magic cookies for all parts of the\n  page.\n\n- Make it optional that a site generate index files with the listings\n  sorted by date in one file and reverse sorted in the other index. \n  This pertains to all index types as well. For example:\n     one thread-index with the newest mails topmost\n     one thread-index with the oldest mails topmost\n     one author-index in alphabetical order\n     one author-index in reversed alphabetical or\n     etc.\n\n- Generate an index listing of all stored attachments. Also have links to \n  the mail that contained them. \n-----------\n\nWe need to discuss how it might be used so we can see what can be done\nabout improving it...\n\n-- \nKent Landfield                        Phone: 1-817-545-2502             \nEmail: kent@landfield.com             http://www.landfield.com/\nEmail: kent@nfr.net                   http://www.nfr.net/\nPlease send comp.sources.misc related mail to kent@landfield.com\nSearch the Usenet FAQ Archive at http://www.faqs.org/faqs/\n\nFrom owner-hypermail Wed Oct  7 11:55 CDT 2000\nReceived: by landfield.com (8.9.0/8.9.0) id LAA19556\n\tfor hypermail-outgoing; Wed, 7 Oct 2000 11:55:28 -0500 (CDT)\nReceived: from fw-es06.hac.com (fw-es06.HAC.COM [128.152.1.6])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id LAA19549\n\tfor <hypermail@landfield.com>; Wed, 7 Oct 2000 11:55:11 -0500 (CDT)\nReceived: from pepperoni.pizza.hac.com (bdarr@[192.27.36.100])\n          by fw-es06.hac.com (8.8.4/8.8.4) with ESMTP\n\t  id JAA25234 for <hypermail@landfield.com>; Wed, 7 Oct 2000 09:52:41 -0700 (PDT)\nReceived: (from bdarr@localhost)\n\tby pepperoni.pizza.hac.com (8.8.6/8.8.6) id JAA02634;\n\tWed, 7 Oct 2000 09:52:41 -0700 (PDT)\nDate: Wed, 7 Oct 2000 09:52:41 -0700 (PDT)\nMessage-Id: <200010071652.JAA02634@pepperoni.pizza.hac.com>\nFrom: \"Byron C. Darrah\" <bdarr@sse.FU.HAC.COM>\nTo: hypermail@landfield.com\nIn-reply-to: <Pine.SO4.4.04.9810071608200.14664-100000@wcsw062> (message from\n\tDaniel Stenberg on Wed, 7 Oct 2000 16:10:39 +0200 (MET DST))\nSubject: Re: indexes\nSender: owner-hypermail@landfield.com\nPrecedence: bulk\nReply-To: \"Byron C. Darrah\" <bdarr@sse.FU.HAC.COM>\nContent-Type: text\nContent-Length: 1545\nStatus: OR\n\n\n> On Wed, 7 Oct 2000, Mark Clear wrote:\n> \n> > Ohmygoodness, optional, please!  With over 5K messages in some of my\n> > archives (the client is always right), it's already all my poor little\n> > CPU can do to crunch the index before the next message comes flying in.\n\nHumble suggestion: If you really have messages coming in that frequently,\nand they get piped to hypermail so that there's a chance two hypermail\nprocesses could be competing to write the index files then there's probably\na better way to do what you want, so that you can eliminate the risk of\ncorrupted indexes.\n\nFor example, what I do at my site (and I would not be surprised to learn\nthat a lot of other people do too) is direct incoming mail for an archive\nto an mbox file instead of piping it to hypermail.  Then, at periodic\nintervals a cron job runs a Makefile that runs hypermail if and only\nif there are any new messages to be added to the archive.\n\nOf course, you would set the cron job's period to something greater than\nthe amount of time it takes for your computer to update the hypermail\narchive to gurantee that two hypermail processes wont compete.\n\nMake can check the status of an archive extremely efficiently with a rule\nsomething like this:\n\n     index.html: mbox\n          # Do stuff to add new messages to archive\n\nSo even if you have ten archives set up this way and let the cron jobs run\nas often as once per minute, you probably won't even be able to notice any\nload on your system except when there are actually new messages being\nprocessed.\n\nCheers.\n\nFrom owner-wu-ftpd@wugate.wustl.edu Wed Oct  7 12:09 CDT 2000\nReceived: from wugate.wustl.edu (wugate.wustl.edu [128.252.120.1])\n\tby landfield.com (8.9.0/8.9.0) with ESMTP id MAA19743\n\tfor <kent@landfield.com>; Wed, 7 Oct 2000 12:09:32 -0500 (CDT)\nReceived: from host (wugate.wustl.edu [128.252.120.1])\n\tby wugate.wustl.edu (8.8.8/8.8.5) with SMTP id MAA08274;\n\tWed, 7 Oct 2000 12:07:31 -0500 (CDT)\nMessage-Id: <200010071703.MAA30380@wugate.wustl.edu>\nDate: Wed, 7 Oct 2000 12:03:55 -0500 (CDT)\nReply-To: listproc@wugate.wustl.edu\nSender: owner-wu-ftpd@wugate.wustl.edu\nFrom: listproc@wugate.wustl.edu\nTo: nadeem@wugate.wustl.edu, kent@landfield.com\nSubject: Error Condition Re: Warning: could not send message for past 4 hours\nX-Listprocessor-Version: 8.0 -- ListProcessor(tm) by CREN\nContent-Type: text\nContent-Length: 3701\nStatus: OR\n\n\nRejected message: sent to wu-ftpd@wugate.wustl.edu by MAILER-DAEMON follows.\nReason for rejection: message addressed to owners.\nRecorded new error message: <REX@GALA.WASHTENAW.CC.MI.US>... DEFERRED: CONNECTION TIMED OUT WITH GALA.WASHTENAW.CC.MI.US.\n-------------------------------------------------------------------------------\n>From MAILER-DAEMON Wed Oct  7 12:03:55 2000\nReceived: from localhost (localhost)\n\tby wugate.wustl.edu (8.8.8/8.8.5) with internal id MAA30380;\n\tWed, 7 Oct 2000 12:03:55 -0500 (CDT)\nDate: Wed, 7 Oct 2000 12:03:55 -0500 (CDT)\nFrom: Mail Delivery Subsystem <MAILER-DAEMON>\nMessage-Id: <200010071703.MAA30380@wugate.wustl.edu>\nTo: <owner-wu-ftpd@wugate.wustl.edu>\nMIME-Version: 1.0\nContent-Type: multipart/report; report-type=delivery-status;\n\tboundary=\"MAA30380.907779835/wugate.wustl.edu\"\nSubject: Warning: could not send message for past 4 hours\n\nThis is a MIME-encapsulated message\n\n--MAA30380.907779835/wugate.wustl.edu\n\n    **********************************************\n    **      THIS IS A WARNING MESSAGE ONLY      **\n    **  YOU DO NOT NEED TO RESEND YOUR MESSAGE  **\n    **********************************************\n\nThe original message was received at Wed, 7 Oct 2000 07:55:07 -0500 (CDT)\nfrom wugate.wustl.edu [128.252.120.1]\n\n   ----- The following addresses had transient non-fatal errors -----\n<rex@gala.washtenaw.cc.mi.us>\n\n   ----- Transcript of session follows -----\n<rex@gala.washtenaw.cc.mi.us>... Deferred: Connection timed out with gala.washtenaw.cc.mi.us.\nWarning: message still undelivered after 4 hours\nWill keep trying until message is 5 days old\n\n--MAA30380.907779835/wugate.wustl.edu\nContent-Type: message/delivery-status\n\nReporting-MTA: dns; wugate.wustl.edu\nArrival-Date: Wed, 7 Oct 2000 07:55:07 -0500 (CDT)\n\nFinal-Recipient: RFC822; rex@gala.washtenaw.cc.mi.us\nAction: delayed\nStatus: 4.4.1\nRemote-MTA: DNS; gala.washtenaw.cc.mi.us\nLast-Attempt-Date: Wed, 7 Oct 2000 12:03:55 -0500 (CDT)\nWill-Retry-Until: Mon, 12 Oct 2000 07:55:07 -0500 (CDT)\n\n--MAA30380.907779835/wugate.wustl.edu\nContent-Type: message/rfc822\n\nReturn-Path: <owner-wu-ftpd@wugate.wustl.edu>\nReceived: from host (wugate.wustl.edu [128.252.120.1])\n\tby wugate.wustl.edu (8.8.8/8.8.5) with SMTP id HAA29962;\n\tWed, 7 Oct 2000 07:55:07 -0500 (CDT)\nReceived: from mail.vr.net (lundberg@mail.vr.net [205.133.13.8])\n\tby wugate.wustl.edu (8.8.8/8.8.5) with ESMTP id HAA30939\n\tfor <Wu-Ftpd@Wugate.Wustl.Edu>; Wed, 7 Oct 2000 07:47:54 -0500 (CDT)\nReceived: from localhost (lundberg@localhost)\n\tby mail.vr.net (8.9.1a/8.9.1) with ESMTP id IAA05683;\n\tWed, 7 Oct 2000 08:46:35 -0400\nMessage-Id: <Pine.LNX.4.03.9810070845250.5546-100000@gaia.vr.net>\nDate: Wed, 7 Oct 2000 08:46:35 -0400 (EDT)\nReply-To: lundberg+wuftpd@vr.net\nSender: owner-wu-ftpd@wugate.wustl.edu\nFrom: Gregory A Lundberg <lundberg+wuftpd@vr.net>\nTo: thianlengvictor.tan@bnpgroup.com\nCc: Wu-Ftpd@wugate.wustl.edu\nSubject: Re: malloc error\nIn-Reply-To: <48256696.0010619C.00@SMTP_PARIS1.bnpgroup.com>\nMIME-Version: 1.0\nContent-Type: TEXT/PLAIN; charset=US-ASCII\nX-Listprocessor-Version: 8.0 -- ListProcessor(tm) by CREN\n\nOn Wed, 7 Oct 2000 thianlengvictor.tan@bnpgroup.com wrote:\n\n> I've just tried to ftp download a file from my server (AIX 4.3.1 running\n> wuftpd ver 2.4.2 beta-18 vr8 aix.3.2.5) using EXCEED as my FTP client. This\n> is the error message I got :\n> \n>      451 local resource failure : malloc : Invalid argument\n\nCan you get a log of the commands so I can see what's happening and track\nthis down?\n\n-- \n\nGregory A Lundberg\t\tSenior Partner, VRnet Company\n1441 Elmdale Drive              lundberg+wuftpd@vr.net\nKettering, OH 45409-1615 USA    1-800-809-2195\n\n\n--MAA30380.907779835/wugate.wustl.edu--\n\n\n"
  },
  {
    "path": "tests/stdintest.pl",
    "content": "#!/usr/local/bin/perl\n\nrequire POSIX;\nuse POSIX;\n\n$sec = time();\n\nprint `rm -f testdir/*`;\n$hypermail=\"../src/hypermail -i -1 -u -d testdir -l foo \";\n\nfor(1 .. 15) {\n\n    @now=localtime($sec);\n    $nowfrom = strftime(\"%a %b %d %H:%M:%S %Y\", @now);\n    $nowdate = strftime(\"%a, %d %b %Y %H:%M:%S +0100 (%Z)\", @now);\n\n    open(HMAIL, \"|$hypermail\") ||\n        die \"can't run it\";\n\n    print HMAIL \"From anon0\\@anon.net $nowfrom\\n\",\n    \"Date: $nowdate\\n\",\n    \"Message-ID: <Marcel-1.26-010719335$_-0b0iukG\\@sherwood.demon.co.uk>\\n\",\n    \"Subject: What about a message number $_\\n\",\n    \"From: $_ Loser <anon0\\@anon.net>\\n\",\n    \"To: $_ Anonymous <anon1@\\anon.net>\\n\",\n    \"\\n\",\n    \"DUMMY MESSAGE BODY $_\\n\";\n\n    close(HMAIL);\n\n    $sec += 1;\n}\n\n"
  },
  {
    "path": "tests/test-footer.hyp",
    "content": "<p align=\"center\">\r\n<strong>[\r\n<a href=\"http://www.faqs.org/faqs/\">Usenet Hypertext FAQ Archive</a> |\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/asearch.html\">Search Mail Archive</a> |\r\n<a href=\"http://www.faqs.org/faqs/authors.html\">Authors</a> |\r\n<a href=\"http://www.faqs.org/usenet/\">Usenet</a>\r\n] <BR> [\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/1993/\">1993</a> |\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/1994/\">1994</a> |\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/1995/\">1995</a> |\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/1996/\">1996</a> |\r\n<a href=\"http://www.faqs.org/faq-maintainers/mail-archive/1997/\">1997</a> \r\n] </strong>\r\n</p>\r\n<p align=\"center\"><img src=\"/images/bar.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\r\n<address><em>\r\n<small>\r\nThis archive was generated by %u on %g\r\n<p align=\"center\"><a href=\"mailto:%m\">%m</a></p>\r\n<small>\r\n<p align=\"center\"><a href=\"/copyright.html\">&#169; Copyright The Internet FAQ Consortium, 1997</a>\r\n<br>All rights reserved</p>\r\n</small>\r\n</small>\r\n</em></address>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "tests/test-index.hyp",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<html>\r\n<head>\r\n<title>%l %s</title>\r\n%A\r\n%S\r\n<link rev=\"made\" href=\"mailto:%m\">\r\n</head>\r\n<body bgcolor=\"#ffffff\" text=\"#000000\">\r\n<h1 align=\"center\">%l<br>%s</h1>\r\n<p align=\"center\"><img src=\"/images/bar.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\r\n"
  },
  {
    "path": "tests/test-msg.hyp",
    "content": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<html>\r\n<head>\r\n<title>%l: %s</title>\r\n%A\r\n%S\r\n<link rev=\"made\" href=\"mailto:%m\">\r\n</head>\r\n<body bgcolor=\"#ffffff\" text=\"#000000\">\r\n<h1 align=\"center\">%s</h1>\r\n<p align=\"center\"><img src=\"/images/bar.gif\" width=\"400\" height=\"4\" alt=\"---------\"></p>\r\n"
  },
  {
    "path": "tests/test.rc",
    "content": "#\n# This is the hypermail test rc config file.\n#\nlanguage = en\nhtmlsuffix = html\nmbox = testmail\narchives = ../\nabout = ../\nlabel = We Be TeStInG List Software List\ndir = testdir\ndefaultindex = subject\noverwrite = 1\ninlinehtml = 1\nincrement = 1\nreadone = 0\nreverse = 1\n#progress = 0\n#progress = 1\nprogress = 2\n#showheaders = 0\nshow_headers = *\n#show_headers = Subject,Date,From\nshow_headers = X-Mailer,Status\nshowhtml = 1\nshowbr = 1\nshowreplies = 1\nshow_msg_links = 1 \nshow_index_links = 1\n#usetable = 1\nusetable = 0\n#indextable = 1\nindextable = 0\niquotes = 1\neurodate = 0\ndiscard_dup_msgids = 0\nrequire_msgids = 1\nusemeta = 0\n#dateformat = %Y/%m/%d - %H:%M %Z\nattachmentlink = \nattachmentsindex = On\nuselock = 1\nlocktime = 3600\nthrdlevels = 9\ndirmode = 0755\nfilemode = 0644\n#mailcommand = mailto:$TO?subject=$SUBJECT&amp;replyto=$ID\n#newmsg_command=mailto:$TO\n#replymsg_command=mailto:$TO?Subject=$SUBJECT\nmailto = webmusket@hypermail.org\ndomainaddr = hypermail.org\n#hmail = hypermail@hypermail.org\n\nstripsubject = [hypermail]\nlinkquotes = 0\nsearchbackmsgnum = 500\nquote_hide_threshold = 100\nquote_link_string = Link\nlink_to_replies = Reply\nmonthly_index = 0\nyearly_index = 0\n#thread_file_depth = 1\n#folder_by_date = %y%m\n#msgsperfolder = 100 \nlatest_folder = current\ndescribe_folder = \"%b %Y\"\niso2022jp = 0\nisodate = 1\ngmtime = 0\nusegdbm = 0\nappend = 1\nappend_filename = $DIR/INBOX\n#avoid_indices = subject author \n#avoid_top_indices = date thread\n#base_url = http://www.hypermail.org/mail-archive/\n#txtsuffix = txt\n#delete_older = \"Wed, 14 Mar 2001 12:59:51 +0200\"\n#delete_newer = \"Wed, 28 Mar 2001 12:59:51 +0200\"\ndeleted = \"X-Hypermail-Deleted X-No-Archive\"\nexpires = Expires\n#delete_msgnum = 0 42 666\ndelete_level = 1\n\n#filter_out=From:.+@spammers.com\n#filter_require = hypermail\n#filter_out_full_body = BUY\n#filter_require_full_body = [Ff]ree\n\n#save_alts = 2\nalts_text = \"alternate version of message\" \nwarn_suppressions = 1\nunsafe_chars = \".\"\n\n#spamprotect = 1\n#spamprotect_id = Off\n# antispamdomain =                     #correctly ignored\n# antispamdomain = \"\"                  #leaves quote marks in the url\n# antispamdomain = \" \"                 #works, leaves a space in the url\n# antispamdomain = \"email_protected\"   #works\n#antispamdomain = \"email.domain.hidden\" #works\n\ntext_types = message/DELIVERY-STATUS\ninline_types = \"image/gif image/jpeg image/png\"\nignore_types = text/x-vcard\nignore_types = application/x-msdownload\nprefered_types = text/plain text/html \n\n#ihtmlheaderfile = test-index.hyp\n#ihtmlfooterfile = test-footer.hyp\n#mhtmlheaderfile = test-msg.hyp\n#mhtmlfooterfile = test-footer.hyp\n#applemail_hack = On\n"
  },
  {
    "path": "tests/testhm.in",
    "content": "#!/bin/sh\n#\n# Stupid script for running strange command lines...\n# Uncomment the ones you want to play with. \n# You need a mailbox named testmail in the current directory to\n# use this as is.  The t1 ... t12 files are individual messages.\n#\n\nset -x\n\nHYPERMAIL=../src/hypermail@suffix@\nLABEL=\"I B TeStInG List\"\nABOUT=\"../\"\nTESTMAIL=testmail\n\ncleanup_testdir()\n{\n    if [ -d testdir ]; then\n        rm -rf testdir\n    fi\n}\n\n##################\n# Test with a mailbox that has had all the dates changes to 2000+\n# to test y2k capabilities\n##################\n#\ntest_configuration_file_with_mailbox_usage_y2k()\n{\n   cleanup_testdir\n   $HYPERMAIL -c test.rc -m mboxes/y2k.mbox\n}\n\n##################\n# Test updating an existing archive with a single message from\n# a mailbox\n##################\n#\ntest_single_msg_archive_update_from_mailbox()\n{\n   # Test the ability of hypermail to update an archive by only \n   # one message when the message comes from a mailbox.\n  \n   cleanup_testdir\n   $HYPERMAIL -p -m $TESTMAIL -d testdir -l \"${LABEL}\" -a \"${ABOUT}\"\n   $HYPERMAIL -p -u -m mboxes/1msg.mbox -d testdir -l \"${LABEL}\" -a \"${ABOUT}\"\n}\n\n##################\n# Test generating an archive from a mailbox with no config file used\n##################\n#\ntest_archive_gen_with_no_overwrite_from_mailbox_no_config_file()\n{\n   cleanup_testdir\n   $HYPERMAIL -p -m $TESTMAIL -d testdir -l \"${LABEL}\" -a \"${ABOUT}\"\n}\n\n##################\n# Test overwriting an archive from a mailbox with no \n# config file used\n##################\n#\ntest_overwrite_archives_from_mailbox_no_config_file()\n{\n   cleanup_testdir\n   cat $TESTMAIL > mboxes/overwrite.mbox\n   $HYPERMAIL -p -x -m mboxes/overwrite.mbox -d testdir -l \"${LABEL}\" -a \"${ABOUT}\" \n   cat mboxes/1msg.mbox >> mboxes/overwrite.mbox\n   $HYPERMAIL -p -x -m mboxes/overwrite.mbox -d testdir -l \"${LABEL}\" -a \"${ABOUT}\" \n   rm mboxes/overwrite.mbox\n}\n\n##################\n# Test using a configuration file \n# and specifying a mailbox to read.\n##################\n#\ntest_configuration_file_with_mailbox_usage()\n{\n   cleanup_testdir\n   $HYPERMAIL -c test.rc -m $TESTMAIL \n}\n\n##################\n# Test messages coming in on stdin with no configuration file used\n##################\n#\ntest_messages_coming_on_stdin()\n{\n   cleanup_testdir\n   for i in mboxes/t[0-9]*\n   do\n       cat $i | $HYPERMAIL -p -i -u -l \"test\" \\\n            -d \"testdir\" \\\n     \t    -b \"http://www.wildheart.org/archives/wire/about.html\"  \\\n     \t    -a \"http://www.wildheart.org/archives/\"\n       sleep 1\n       if [ -r core ]; then\n          echo \"It cooooored\"\n          exit\n       fi\n   done\n}\n\n##################\n# Test messages coming in on stdin with a configuration file used\n# and overriding some command line options\n##################\n#\ntest_messages_coming_on_stdin_with_config_file_used()\n{\n   cleanup_testdir\n   for i in mboxes/t[0-9]*\n   do\n\tcat $i | $HYPERMAIL -p -i -u -l \"test\" \\\n      \t\t-c \"test.rc\" \\\n      \t\t-d \"testdir\" \\\n      \t\t-b \"http://www.wildheart.org/archives/wire/about.html\"  \\\n      \t\t-a \"http://www.wildheart.org/archives/\"\n\tsleep 1\n   done\n}\n\n##################\n# Test messages from mailbox with a configuration file used\n# and overriding some command line options\n##################\n#\ntest_msgs_from_mailbox_config_file_used_and_overriding_options()\n{\n   cleanup_testdir\n   $HYPERMAIL -p -m \"$TESTMAIL\" -x -l \"test\" \\\n\t-c \"test.rc\" \\\n\t-d \"testdir\"\n\n}\n\n##################\n# Test messages from mailbox with a configuration file used\n# and overriding some command line options\n##################\n#\ntest_embedded_msg()\n{\n   cleanup_testdir\n   cat test.rc | \n      sed \"s/^discard_dup_msgids.*$/discard_dup_msgids = 0/\" > dtest.rc\n   $HYPERMAIL -p -m \"mboxes/embedded.msg\" -x -c \"dtest.rc\" \n   rm -f dtest.rc\n\n}\n\n# test_configuration_file_with_mailbox_usage_y2k\n# test_single_msg_archive_update_from_mailbox\n# test_archive_gen_with_no_overwrite_from_mailbox_no_config_file\n# test_overwrite_archives_from_mailbox_no_config_file\n# test_messages_coming_on_stdin\n# test_messages_coming_on_stdin_with_config_file_used\n# test_msgs_from_mailbox_config_file_used_and_overriding_options\n# test_embedded_msg\ntest_configuration_file_with_mailbox_usage\n\nexit 1\n"
  }
]